(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else { var a = factory(); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(global, () => { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/ktx-parse/dist/ktx-parse.modern.js": /*!*********************************************************!*\ !*** ./node_modules/ktx-parse/dist/ktx-parse.modern.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ KTX2ChannelETC1S: () => (/* binding */ l), /* harmony export */ KTX2ChannelUASTC: () => (/* binding */ f), /* harmony export */ KTX2Container: () => (/* binding */ U), /* harmony export */ KTX2DescriptorType: () => (/* binding */ i), /* harmony export */ KTX2Flags: () => (/* binding */ o), /* harmony export */ KTX2Model: () => (/* binding */ s), /* harmony export */ KTX2Primaries: () => (/* binding */ a), /* harmony export */ KTX2SupercompressionScheme: () => (/* binding */ n), /* harmony export */ KTX2Transfer: () => (/* binding */ r), /* harmony export */ read: () => (/* binding */ p), /* harmony export */ write: () => (/* binding */ y) /* harmony export */ }); const t=new Uint8Array([0]),e=[171,75,84,88,32,50,48,187,13,10,26,10];var n,i,s,a,r,o,l,f;!function(t){t[t.NONE=0]="NONE",t[t.BASISLZ=1]="BASISLZ",t[t.ZSTD=2]="ZSTD",t[t.ZLIB=3]="ZLIB"}(n||(n={})),function(t){t[t.BASICFORMAT=0]="BASICFORMAT"}(i||(i={})),function(t){t[t.UNSPECIFIED=0]="UNSPECIFIED",t[t.ETC1S=163]="ETC1S",t[t.UASTC=166]="UASTC"}(s||(s={})),function(t){t[t.UNSPECIFIED=0]="UNSPECIFIED",t[t.SRGB=1]="SRGB"}(a||(a={})),function(t){t[t.UNSPECIFIED=0]="UNSPECIFIED",t[t.LINEAR=1]="LINEAR",t[t.SRGB=2]="SRGB",t[t.ITU=3]="ITU",t[t.NTSC=4]="NTSC",t[t.SLOG=5]="SLOG",t[t.SLOG2=6]="SLOG2"}(r||(r={})),function(t){t[t.ALPHA_STRAIGHT=0]="ALPHA_STRAIGHT",t[t.ALPHA_PREMULTIPLIED=1]="ALPHA_PREMULTIPLIED"}(o||(o={})),function(t){t[t.RGB=0]="RGB",t[t.RRR=3]="RRR",t[t.GGG=4]="GGG",t[t.AAA=15]="AAA"}(l||(l={})),function(t){t[t.RGB=0]="RGB",t[t.RGBA=3]="RGBA",t[t.RRR=4]="RRR",t[t.RRRG=5]="RRRG"}(f||(f={}));class U{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=n.NONE,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:i.BASICFORMAT,versionNumber:2,descriptorBlockSize:40,colorModel:s.UNSPECIFIED,colorPrimaries:a.SRGB,transferFunction:a.SRGB,flags:o.ALPHA_STRAIGHT,texelBlockDimension:{x:4,y:4,z:1,w:1},bytesPlane:[],samples:[]}],this.keyValue={},this.globalData=null}}class c{constructor(t,e,n,i){this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_skip(t){return this._offset+=t,this}_scan(t,e=0){const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\nin vec2 v_texcoord_0;\nin vec3 v_baryCentricCoord;\nin vec4 v_shadowCoord;\n\nuniform int u_shadingModel; // initialValue=0\nuniform float u_alphaCutoff; // initialValue=0.01\nuniform float u_shininess; // initialValue=5\nuniform vec4 u_diffuseColorFactor; // initialValue=(1,1,1,1)\nuniform sampler2D u_diffuseColorTexture; // initialValue=(0,white)\nuniform sampler2D u_normalTexture; // initialValue=(1,blue)\nuniform vec4 u_diffuseColorTextureTransform; // initialValue=(1,1,0,0)\nuniform float u_diffuseColorTextureRotation; // initialValue=0\nuniform sampler2DShadow u_depthTexture; // initialValue=(2,white)\n\n/* shaderity: @{renderTargetBegin} */\n\n// #pragma shaderity: require(../common/deliot2019SeamlessTexture.glsl)\n// uniform sampler2D u_tInvTexture; // initialValue=(1,white)\n// uniform vec3 u_colorSpaceOrigin;\n// uniform vec3 u_colorSpaceVector1;\n// uniform vec3 u_colorSpaceVector2;\n// uniform vec3 u_colorSpaceVector3;\n// uniform vec4 u_scaleTranslate;\n\n\nvec2 uvTransform(vec2 scale, vec2 offset, float rotation, vec2 uv) {\n mat3 translationMat = mat3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n mat3 rotationMat = mat3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n mat3 scaleMat = mat3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n mat3 matrix = translationMat * rotationMat * scaleMat;\n vec2 uvTransformed = ( matrix * vec3(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n\n/* shaderity: @{getters} */\n\nstruct Light {\n int type; // 0 = directional, 1 = point, 2 = spot\n vec3 position;\n vec3 intensity;\n vec3 attenuatedIntensity;\n vec3 directionOfLightObject;\n vec3 direction; // direction of light vector, equal to normalize(light.pointToLight)\n vec3 pointToLight; // not normalized\n float spotAngleScale;\n float spotAngleOffset;\n float effectiveRange;\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfloat getRangeAttenuation(Light light)\n{\n float distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfloat getSpotAttenuation(Light light)\n{\n\n float cd = dot(light.directionOfLightObject, light.direction);\n float angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nvoid getLightAttenuated(Light light) {\n light.attenuatedIntensity = light.intensity;\n // if (light.type == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.type == 1)\n {\n light.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.type == 2)\n {\n light.attenuatedIntensity *= getSpotAttenuation(light);\n }\n}\n\nLight getLight(int lightIdx, vec3 v_position_inWorld) {\n vec3 lightPosition = get_lightPosition(0.0, lightIdx);\n vec3 direction_and_w_of_LightObject = get_lightDirection(0.0, lightIdx);\n vec3 lightIntensity = get_lightIntensity(0.0, lightIdx);\n vec4 lightProperty = get_lightProperty(0.0, lightIdx);\n Light light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n float lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3(0.0);\n light.type = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.type = 1;\n } else { // is Directional Light\n light.type = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.type = 2;\n }\n\n const float M_PI = 3.141592653589793;\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n getLightAttenuated(light);\n\n return light;\n}\n\n\nvoid main ()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n // Normal\n vec3 normal_inWorld = normalize(v_normal_inWorld);\n\n vec4 diffuseColorFactor = get_diffuseColorFactor(materialSID, 0);\n\n\n // diffuseColor (Considered to be premultiplied alpha)\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n float alpha = 1.0;\n if (v_color != diffuseColor && diffuseColorFactor.rgb != diffuseColor) {\n diffuseColor = v_color * diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (v_color == diffuseColor) {\n diffuseColor = diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (diffuseColorFactor.rgb == diffuseColor) {\n diffuseColor = v_color;\n } else {\n diffuseColor = vec3(1.0, 1.0, 1.0);\n }\n\n // diffuseColorTexture (Considered to be premultiplied alpha)\n vec4 diffuseColorTextureTransform = get_diffuseColorTextureTransform(materialSID, 0);\n float diffuseColorTextureRotation = get_diffuseColorTextureRotation(materialSID, 0);\n vec2 diffuseColorTexUv = uvTransform(diffuseColorTextureTransform.xy, diffuseColorTextureTransform.zw, diffuseColorTextureRotation, v_texcoord_0);\n vec4 textureColor = texture(u_diffuseColorTexture, diffuseColorTexUv);\n diffuseColor *= textureColor.rgb;\n alpha *= textureColor.a;\n\n#ifdef RN_IS_ALPHA_MODE_MASK\n float alphaCutoff = get_alphaCutoff(materialSID, 0);\n if (alpha < alphaCutoff) {\n discard;\n }\n#endif\n\n\n // Lighting\n vec3 shadingColor = vec3(0.0, 0.0, 0.0);\n#ifdef RN_IS_LIGHTING\n int shadingModel = get_shadingModel(materialSID, 0);\n if (shadingModel > 0) {\n\n vec3 diffuse = vec3(0.0, 0.0, 0.0);\n vec3 specular = vec3(0.0, 0.0, 0.0);\n for (int i = 0; i < /* shaderity: @{Config.maxLightNumberInShader} */ ; i++) {\n if (i >= lightNumber) {\n break;\n }\n\n // Light\n Light light = getLight(i, v_position_inWorld.xyz);\n\n // Diffuse\n diffuse += diffuseColor * max(0.0, dot(normal_inWorld, light.direction)) * light.attenuatedIntensity;\n\n float shininess = get_shininess(materialSID, 0);\n int shadingModel = get_shadingModel(materialSID, 0);\n\n vec3 viewPosition = get_viewPosition(cameraSID, 0);\n\n // Specular\n if (shadingModel == 2) {// BLINN\n // ViewDirection\n vec3 viewDirection = normalize(viewPosition - v_position_inWorld.xyz);\n vec3 halfVector = normalize(light.direction + viewDirection);\n specular += pow(max(0.0, dot(halfVector, normal_inWorld)), shininess);\n } else if (shadingModel == 3) { // PHONG\n vec3 viewDirection = normalize(viewPosition - v_position_inWorld.xyz);\n vec3 R = reflect(light.direction, normal_inWorld);\n specular += pow(max(0.0, dot(R, viewDirection)), shininess);\n }\n\n }\n\n shadingColor = diffuse + specular;\n } else {\n shadingColor = diffuseColor;\n }\n#else\n shadingColor = diffuseColor;\n#endif\n\n // Shadow\n#ifdef RN_USE_SHADOW_MAPPING\n float visibility = 1.0;\n float bias = 0.001;\n\n // Non PCF\n // if ( textureProj( u_depthTexture, v_shadowCoord ).r < (v_shadowCoord.z - bias) / v_shadowCoord.w ) {\n // visibility = 0.5;\n // }\n // shadingColor *= visibility;\n\n // Hardware PCF\n vec4 shadowCoord = v_shadowCoord;\n shadowCoord.z -= bias;\n shadingColor *= textureProj( u_depthTexture, shadowCoord ) * 0.5 + 0.5;\n\n // shadingColor.rgb = texture( u_depthTexture, v_shadowCoord.xy ).rrr;\n // shadingColor.rgb = vec3(v_shadowCoord.xy, 0.0);\n // shadingColor.rgb = vec3(diffuseColorTexUv, 0.0);\n // shadingColor.rgb = vec3(texture( u_depthTexture, diffuseColorTexUv).rrr);\n // shadingColor.rgb = texture( u_depthTexture, diffuseColorTexUv).rgb;\n // shadingColor.rgb = vec3(textureProj( u_depthTexture, v_shadowCoord ).z, 0.0, 0.0);\n alpha = 1.0;\n#endif\n\n#ifdef RN_IS_ALPHA_MODE_BLEND\n#else\n alpha = 1.0;\n#endif\n\n rt0 = vec4(shadingColor * alpha, alpha);\n // rt0 = vec4(u_lightNumber, 0.0, 0.0, 1.0);\n // rt0 = vec4(1.0, 0.0, 0.0, 1.0);\n // rt0 = vec4(normal_inWorld*0.5+0.5, 1.0);\n\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert": /*!**********************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert ***! \**********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\n#ifdef WEBGL2_MULTI_VIEW\n layout(num_views=2) in;\n#endif\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec4 a_joint;\nin vec4 a_weight;\nin vec4 a_baryCentricCoord;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\nout vec2 v_texcoord_0;\nout vec3 v_baryCentricCoord;\nout vec4 v_shadowCoord;\n\nuniform float u_pointSize; // initialValue=30\nuniform vec3 u_pointDistanceAttenuation; // initialValue=(0,0.1,0.01)\n\n// BiasMatrix * LightProjectionMatrix * LightViewMatrix, See: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/#basic-shader\nuniform mat4 u_depthBiasPV; // initialValue=(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n bool isBillboard = get_isBillboard(a_instanceInfo.x);\n\n // Skeletal\n processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n isBillboard,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n\n v_color = a_color;\n v_normal_inWorld = normalMatrix * a_normal;\n v_texcoord_0 = a_texcoord_0;\n v_baryCentricCoord = a_baryCentricCoord.xyz;\n\n bool visibility = get_isVisible(a_instanceInfo.x);\n if (!visibility)\n {\n gl_Position = vec4(0.0);\n }\n\n v_shadowCoord = get_depthBiasPV(materialSID, 0) * v_position_inWorld;\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.frag": /*!**************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.frag ***! \**************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\nin vec2 v_texcoord;\n\n/* shaderity: @{renderTargetBegin} */\n\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec4 textureColor = texture(u_baseColorTexture, v_texcoord);\n\n float r = textureColor.r;\n float g = textureColor.g;\n float b = textureColor.b;\n float r16 = r * 15.0;\n float g16 = g * 15.0;\n float b16 = b * 15.0;\n float rInt = floor(r16);\n float gInt = floor(g16);\n float bInt = floor(b16);\n\n float rRate, gRate, bRate;\n float rIntAdjust, gIntAdjust, bIntAdjust;\n\n vec3 newColor = vec3(0.0);\n for(int i=0; i<8; i++){\n rRate = 1.0 - fract(r16);\n gRate = 1.0 - fract(g16);\n bRate = 1.0 - fract(b16);\n rIntAdjust = rInt;\n gIntAdjust = gInt;\n bIntAdjust = bInt;\n\n if(fract(float(i) / 2.0) != 0.0){\n rIntAdjust += 1.0;\n rRate = 1.0 - rRate;\n }\n if(fract(float(i / 2) / 2.0) != 0.0){\n gIntAdjust += 1.0;\n gRate = 1.0 - gRate;\n }\n if(fract(float(i / 4) / 2.0) != 0.0){\n bIntAdjust += 1.0;\n bRate = 1.0 - bRate;\n }\n\n if( rRate * gRate * bRate != 0.0){\n newColor += texture(u_lookupTableTexture, vec2(rIntAdjust / 256.0 + bIntAdjust / 16.0 + 1.0 / 512.0, gIntAdjust / 16.0 + 1.0 / 32.0)).rgb * rRate * gRate * bRate;\n }\n }\n\n rt0 = vec4(newColor, 1.0);\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.vert": /*!**************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.vert ***! \**************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord;\nin vec3 a_position;\n\nout vec2 v_texcoord;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\nmat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\nmat4 viewMatrix = get_viewMatrix(cameraSID, 0);\nmat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\ngl_Position = projectionMatrix * viewMatrix * worldMatrix * vec4(a_position, 1.0);\n\n\n v_texcoord = a_texcoord;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.frag": /*!******************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.frag ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec4 v_position_inLocal;\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nvec4 encodeDepthToRGBA(float depth){\n float r = depth;\n float g = fract(r * 255.0);\n float b = fract(g * 255.0);\n float a = fract(b * 255.0);\n float coef = 1.0 / 255.0;\n r -= g * coef;\n g -= b * coef;\n b -= a * coef;\n return vec4(r, g, b, a);\n}\n\nvoid main (){\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n float depth;\n bool isPointLight = get_isPointLight(materialSID, 0);\n if(isPointLight){\n float zNear = get_zNearInner(materialSID, 0);\n float zFar = get_zFarInner(materialSID, 0);\n float normalizationCoefficient = 1.0 / (zFar - zNear);\n depth = normalizationCoefficient * length(v_position_inLocal);\n }else{\n depth = gl_FragCoord.z;\n }\n\n float depthPow = get_depthPow(materialSID, 0);\n float depthData = pow(depth, depthPow);\n vec4 encodedDepth = encodeDepthToRGBA(depthData);\n\n rt0 = encodedDepth;\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.vert": /*!******************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.vert ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec3 a_position;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec4 a_joint;\nin vec4 a_weight;\n\nout vec3 v_normal_inWorld;\nout vec4 v_position_inLocal;\nout vec4 v_position_inWorld;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main(){\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n\n // Skeletal\n processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n v_position_inLocal = gl_Position;\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.frag": /*!******************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.frag ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\n\nvoid main (){\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n float depth = gl_FragCoord.z;\n float dx = dFdx(depth);\n float dy = dFdy(depth);\n\n rt0.x = depth; // M1\n rt0.y = sq(depth) + 0.25 * (sq(dx) + sq(dy)); // M2\n rt0.z = 0.0;\n rt0.w = 1.0;\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.vert": /*!******************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.vert ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec2 a_texcoord_1;\nin vec2 a_texcoord_2;\nin vec4 a_joint;\nin vec4 a_weight;\nin vec4 a_baryCentricCoord;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\n\nuniform float u_pointSize; // initialValue=30, soloDatum=true\nuniform vec3 u_pointDistanceAttenuation; // initialValue=(0.0, 0.1, 0.01), soloDatum=true\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n bool isBillboard = get_isBillboard(a_instanceInfo.x);\n\n v_color = a_color;\n\n bool isSkinning = false;\n\n isSkinning = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n isBillboard,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n bool visibility = get_isVisible(a_instanceInfo.x);\n if (!visibility)\n {\n gl_Position = vec4(0.0);\n }\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n}\n\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag": /*!******************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag ***! \******************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{renderTargetBegin} */\n\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\nin vec2 v_texcoord_0;\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec4 baseColor = texture(u_baseColorTexture, v_texcoord_0);\n\n float luminance = dot(baseColor.rgb, vec3(0.2126, 0.7152, 0.0722));\n\n float luminanceCriterion = get_luminanceCriterion(materialSID, 0);\n\n baseColor.rgb = mix(vec3(0.0), baseColor.rgb, (luminance - luminanceCriterion) / luminanceCriterion);\n baseColor.a = 1.0;\n\n rt0 = baseColor;\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert": /*!******************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert ***! \******************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\nin vec4 a_instanceInfo;\nin vec3 a_position;\nin vec2 a_texcoord_0;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.frag": /*!**************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.frag ***! \**************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\nin float v_instanceInfo;\n\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nconst vec4 bitEnc = vec4(1.,255.,65025.,16581375.);\nconst vec4 bitDec = 1./bitEnc;\n\nvec4 encodeFloatRGBA(float v) {\n float val = v;\n float r = mod(val, 255.0);\n val -= r;\n float g = mod(val, 65025.0);\n val -= g;\n float b = mod(val, 16581375.0);\n return vec4(r/255.0, g/65025.0, b/16581375.0, 1.0);\n}\n\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n rt0 = encodeFloatRGBA(v_instanceInfo);\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.vert": /*!**************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.vert ***! \**************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec4 a_joint;\nin vec4 a_weight;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\nout vec2 v_texcoord_0;\nout float v_instanceInfo;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\n\nvoid main()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n\n // Skeletal\n processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n v_instanceInfo = a_instanceInfo.x;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag": /*!******************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec3 v_position_inWorld;\n\nuniform int u_envHdriFormat; // initialValue=0\nuniform float u_envRotation; // initialValue=0\nuniform vec4 u_diffuseColorFactor; // initialValue=(1,1,1,1)\nuniform samplerCube u_colorEnvTexture; // initialValue=(0,black)\nuniform bool u_makeOutputSrgb; // initialValue=true\nuniform bool u_inverseEnvironment; // initialValue=true\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nvec3 linearToSrgb(vec3 linearColor) {\n return pow(linearColor, vec3(1.0/2.2));\n}\n\nvec3 srgbToLinear(vec3 srgbColor) {\n return pow(srgbColor, vec3(2.2));\n}\n\nvoid main() {\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n // diffuseColor\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n float alpha = 1.0;\n vec4 diffuseColorFactor = get_diffuseColorFactor(materialSID, 0);\n if (v_color != diffuseColor && diffuseColorFactor.rgb != diffuseColor) {\n diffuseColor = v_color * diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (v_color == diffuseColor) {\n diffuseColor = diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (diffuseColorFactor.rgb == diffuseColor) {\n diffuseColor = v_color;\n } else {\n diffuseColor = vec3(1.0, 1.0, 1.0);\n }\n\n // diffuseColorTexture\n\n // adapt OpenGL (RenderMan) CubeMap convention\n float envRotation = get_envRotation(materialSID, 0);\n float rot = envRotation + 3.1415;\n mat3 rotEnvMatrix = mat3(cos(rot), 0.0, -sin(rot), 0.0, 1.0, 0.0, sin(rot), 0.0, cos(rot));\n vec3 envNormal = normalize(rotEnvMatrix * v_position_inWorld);\n\n if (get_inverseEnvironment(materialSID, 0)) {\n envNormal.x *= -1.0;\n }\n\n vec4 diffuseTexel = texture(u_colorEnvTexture, envNormal);\n vec3 textureColor;\n int EnvHdriFormat = get_envHdriFormat(materialSID, 0);\n if (EnvHdriFormat == 0) { // LDR_SRGB\n textureColor = srgbToLinear(diffuseTexel.rgb);\n } else if (EnvHdriFormat == 3) { // RGBE\n textureColor = diffuseTexel.rgb * pow(2.0, diffuseTexel.a*255.0-128.0);\n } else {\n textureColor = diffuseTexel.rgb;\n }\n diffuseColor *= textureColor;\n\n rt0 = vec4(diffuseColor, alpha);\n\nfloat makeOutputSrgb = float(get_makeOutputSrgb(materialSID, 0));\nrt0.rgb = mix(rt0.rgb, linearToSrgb(rt0.rgb), makeOutputSrgb);\n\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert": /*!******************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\n#ifdef WEBGL2_MULTI_VIEW\n layout(num_views=2) in;\n#endif\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\n\nout vec2 v_texcoord_0;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec3 v_position_inWorld;\n\nuniform bool u_enableViewMatrix; // initialValue=true\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n\n if (get_enableViewMatrix(materialSID, 0)) {\n mat4 rotateMatrix = viewMatrix;\n rotateMatrix[3][0] = 0.0;\n rotateMatrix[3][1] = 0.0;\n rotateMatrix[3][2] = 0.0;\n gl_Position = projectionMatrix * rotateMatrix * worldMatrix * vec4(a_position, 1.0);\n } else {\n gl_Position = projectionMatrix * worldMatrix * vec4(a_position, 1.0);\n }\n\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n v_normal_inWorld = normalMatrix * a_normal;\n\n v_color = a_color;\n v_position_inWorld = (worldMatrix * vec4(a_position, 1.0)).xyz;\n v_texcoord_0 = a_texcoord_0;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.frag": /*!**************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.frag ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/**\n * This file contains source code provided by NVIDIA Corporation.\n * FXAA antialiasing is developed by NVIDIA.\n * The codes of this file is modified from original code to work on WebGL1.\n * The modification for GLSL 100 is referred from Three.js, https://github.com/mrdoob/three.js/blob/5ba4c25bcb74577e1b1e14906f345135610a94f3/examples/js/shaders/FXAAShader.js\n * The original FXAA code is https://github.com/NVIDIAGameWorks/GraphicsSamples/blob/80e8ba8f5e8935821513207033490735dd3279d8/samples/es3-kepler/FXAA/FXAA3_11.h\n */\n\n//----------------------------------------------------------------------------------\n// File: es3-kepler\\FXAA/FXAA3_11.h\n// SDK Version: v3.00\n// Email: gameworks@nvidia.com\n// Site: http://developer.nvidia.com/\n//\n// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of NVIDIA CORPORATION nor the names of its\n// contributors may be used to endorse or promote products derived\n// from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 'AS IS' AND ANY\n// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//----------------------------------------------------------------------------------\n/*============================================================================\n NVIDIA FXAA 3.11 by TIMOTHY LOTTES\n============================================================================*/\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\n\nuniform sampler2D u_baseColorTexture; // initialValue=(0,white)\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\n\n\n #define FXAA_PC 1\n #define FXAA_QUALITYPRESET 39\n #define FXAA_GREEN_AS_LUMA 0\n #define FXAA_GLSL_100 1\n\n /*============================================================================\n INTEGRATION KNOBS\n ============================================================================*/\n //\n // FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).\n // FXAA_360_OPT is a prototype for the new optimized 360 version.\n //\n // 1 = Use API.\n // 0 = Don't use API.\n //\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_PS3\n #define FXAA_PS3 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_360\n #define FXAA_360 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_360_OPT\n #define FXAA_360_OPT 0\n #endif\n /*==========================================================================*/\n #ifndef FXAA_PC\n //\n // FXAA Quality\n // The high quality PC algorithm.\n //\n #define FXAA_PC 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_PC_CONSOLE\n //\n // The console algorithm for PC is included\n // for developers targeting really low spec machines.\n // Likely better to just run FXAA_PC, and use a really low preset.\n //\n #define FXAA_PC_CONSOLE 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_GLSL_120\n #define FXAA_GLSL_120 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_GLSL_130\n #define FXAA_GLSL_130 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_HLSL_3\n #define FXAA_HLSL_3 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_HLSL_4\n #define FXAA_HLSL_4 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_HLSL_5\n #define FXAA_HLSL_5 0\n #endif\n /*==========================================================================*/\n #ifndef FXAA_GREEN_AS_LUMA\n //\n // For those using non-linear color,\n // and either not able to get luma in alpha, or not wanting to,\n // this enables FXAA to run using green as a proxy for luma.\n // So with this enabled, no need to pack luma in alpha.\n //\n // This will turn off AA on anything which lacks some amount of green.\n // Pure red and blue or combination of only R and B, will get no AA.\n //\n // Might want to lower the settings for both,\n // fxaaConsoleEdgeThresholdMin\n // fxaaQualityEdgeThresholdMin\n // In order to insure AA does not get turned off on colors\n // which contain a minor amount of green.\n //\n // 1 = On.\n // 0 = Off.\n //\n #define FXAA_GREEN_AS_LUMA 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_EARLY_EXIT\n //\n // Controls algorithm's early exit path.\n // On PS3 turning this ON adds 2 cycles to the shader.\n // On 360 turning this OFF adds 10ths of a millisecond to the shader.\n // Turning this off on console will result in a more blurry image.\n // So this defaults to on.\n //\n // 1 = On.\n // 0 = Off.\n //\n #define FXAA_EARLY_EXIT 1\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_DISCARD\n //\n // Only valid for PC OpenGL currently.\n // Probably will not work when FXAA_GREEN_AS_LUMA = 1.\n //\n // 1 = Use discard on pixels which don't need AA.\n // For APIs which enable concurrent TEX+ROP from same surface.\n // 0 = Return unchanged color on pixels which don't need AA.\n //\n #define FXAA_DISCARD 0\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_FAST_PIXEL_OFFSET\n //\n // Used for GLSL 120 only.\n //\n // 1 = GL API supports fast pixel offsets\n // 0 = do not use fast pixel offsets\n //\n #ifdef GLEXT_gpu_shader4\n #define FXAA_FAST_PIXEL_OFFSET 1\n #endif\n #ifdef GLNV_gpu_shader5\n #define FXAA_FAST_PIXEL_OFFSET 1\n #endif\n #ifdef GLARB_gpu_shader5\n #define FXAA_FAST_PIXEL_OFFSET 1\n #endif\n #ifndef FXAA_FAST_PIXEL_OFFSET\n #define FXAA_FAST_PIXEL_OFFSET 0\n #endif\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_GATHER4_ALPHA\n //\n // 1 = API supports gather4 on alpha channel.\n // 0 = API does not support gather4 on alpha channel.\n //\n #if (FXAA_HLSL_5 == 1)\n #define FXAA_GATHER4_ALPHA 1\n #endif\n #ifdef GLARB_gpu_shader5\n #define FXAA_GATHER4_ALPHA 1\n #endif\n #ifdef GLNV_gpu_shader5\n #define FXAA_GATHER4_ALPHA 1\n #endif\n #ifndef FXAA_GATHER4_ALPHA\n #define FXAA_GATHER4_ALPHA 0\n #endif\n #endif\n\n /*============================================================================\n FXAA CONSOLE PS3 - TUNING KNOBS\n ============================================================================*/\n #ifndef FXAA_CONSOLEPS3_EDGE_SHARPNESS\n //\n // Consoles the sharpness of edges on PS3 only.\n // Non-PS3 tuning is done with shader input.\n //\n // Due to the PS3 being ALU bound,\n // there are only two safe values here: 4 and 8.\n // These options use the shaders ability to a free *|/ by 2|4|8.\n //\n // 8.0 is sharper\n // 4.0 is softer\n // 2.0 is really soft (good for vector graphics inputs)\n //\n #if 1\n #define FXAA_CONSOLEPS3_EDGE_SHARPNESS 8.0\n #endif\n #if 0\n #define FXAA_CONSOLEPS3_EDGE_SHARPNESS 4.0\n #endif\n #if 0\n #define FXAA_CONSOLEPS3_EDGE_SHARPNESS 2.0\n #endif\n #endif\n /*--------------------------------------------------------------------------*/\n #ifndef FXAA_CONSOLEPS3_EDGE_THRESHOLD\n //\n // Only effects PS3.\n // Non-PS3 tuning is done with shader input.\n //\n // The minimum amount of local contrast required to apply algorithm.\n // The console setting has a different mapping than the quality setting.\n //\n // This only applies when FXAA_EARLY_EXIT is 1.\n //\n // Due to the PS3 being ALU bound,\n // there are only two safe values here: 0.25 and 0.125.\n // These options use the shaders ability to a free *|/ by 2|4|8.\n //\n // 0.125 leaves less aliasing, but is softer\n // 0.25 leaves more aliasing, and is sharper\n //\n #if 1\n #define FXAA_CONSOLEPS3_EDGE_THRESHOLD 0.125\n #else\n #define FXAA_CONSOLEPS3_EDGE_THRESHOLD 0.25\n #endif\n #endif\n\n /*============================================================================\n FXAA QUALITY - TUNING KNOBS\n ------------------------------------------------------------------------------\n NOTE the other tuning knobs are now in the shader function inputs!\n ============================================================================*/\n #ifndef FXAA_QUALITYPRESET\n //\n // Choose the quality preset.\n // This needs to be compiled into the shader as it effects code.\n // Best option to include multiple presets is to\n // in each shader define the preset, then include this file.\n //\n // OPTIONS\n // -----------------------------------------------------------------------\n // 10 to 15 - default medium dither (10=fastest, 15=highest quality)\n // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)\n // 39 - no dither, very expensive\n //\n // NOTES\n // -----------------------------------------------------------------------\n // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)\n // 13 = about same speed as FXAA 3.9 and better than 12\n // 23 = closest to FXAA 3.9 visually and performance wise\n // _ = the lowest digit is directly related to performance\n // _ = the highest digit is directly related to style\n //\n #define FXAA_QUALITYPRESET 12\n #endif\n\n\n /*============================================================================\n FXAA QUALITY - PRESETS\n ============================================================================*/\n\n /*============================================================================\n FXAA QUALITY - MEDIUM DITHER PRESETS\n ============================================================================*/\n #if(FXAA_QUALITYPRESET == 10)\n#define FXAA_QUALITYPS 3\n#define FXAA_QUALITYP0 1.5\n#define FXAA_QUALITYP1 3.0\n#define FXAA_QUALITYP2 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 11)\n#define FXAA_QUALITYPS 4\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 3.0\n#define FXAA_QUALITYP3 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 12)\n#define FXAA_QUALITYPS 5\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 4.0\n#define FXAA_QUALITYP4 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 13)\n#define FXAA_QUALITYPS 6\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 4.0\n#define FXAA_QUALITYP5 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 14)\n#define FXAA_QUALITYPS 7\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 4.0\n#define FXAA_QUALITYP6 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 15)\n#define FXAA_QUALITYPS 8\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 2.0\n#define FXAA_QUALITYP6 4.0\n#define FXAA_QUALITYP7 12.0\n#endif\n\n/*============================================================================\n FXAA QUALITY - LOW DITHER PRESETS\n============================================================================*/\n#if (FXAA_QUALITYPRESET == 20)\n#define FXAA_QUALITYPS 3\n#define FXAA_QUALITYP0 1.5\n#define FXAA_QUALITYP1 2.0\n#define FXAA_QUALITYP2 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 21)\n#define FXAA_QUALITYPS 4\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 22)\n#define FXAA_QUALITYPS 5\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 23)\n#define FXAA_QUALITYPS 6\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 24)\n#define FXAA_QUALITYPS 7\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 3.0\n#define FXAA_QUALITYP6 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 25)\n#define FXAA_QUALITYPS 8\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 2.0\n#define FXAA_QUALITYP6 4.0\n#define FXAA_QUALITYP7 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 26)\n#define FXAA_QUALITYPS 9\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 2.0\n#define FXAA_QUALITYP6 2.0\n#define FXAA_QUALITYP7 4.0\n#define FXAA_QUALITYP8 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 27)\n#define FXAA_QUALITYPS 10\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 2.0\n#define FXAA_QUALITYP6 2.0\n#define FXAA_QUALITYP7 2.0\n#define FXAA_QUALITYP8 4.0\n#define FXAA_QUALITYP9 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 28)\n#define FXAA_QUALITYPS 11\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 2.0\n#define FXAA_QUALITYP6 2.0\n#define FXAA_QUALITYP7 2.0\n#define FXAA_QUALITYP8 2.0\n#define FXAA_QUALITYP9 4.0\n#define FXAA_QUALITYP10 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITYPRESET == 29)\n#define FXAA_QUALITYPS 12\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.5\n#define FXAA_QUALITYP2 2.0\n#define FXAA_QUALITYP3 2.0\n#define FXAA_QUALITYP4 2.0\n#define FXAA_QUALITYP5 2.0\n#define FXAA_QUALITYP6 2.0\n#define FXAA_QUALITYP7 2.0\n#define FXAA_QUALITYP8 2.0\n#define FXAA_QUALITYP9 2.0\n#define FXAA_QUALITYP10 4.0\n#define FXAA_QUALITYP11 8.0\n#endif\n\n/*============================================================================\n FXAA QUALITY - EXTREME QUALITY\n============================================================================*/\n#if (FXAA_QUALITYPRESET == 39)\n#define FXAA_QUALITYPS 12\n#define FXAA_QUALITYP0 1.0\n#define FXAA_QUALITYP1 1.0\n#define FXAA_QUALITYP2 1.0\n#define FXAA_QUALITYP3 1.0\n#define FXAA_QUALITYP4 1.0\n#define FXAA_QUALITYP5 1.5\n#define FXAA_QUALITYP6 2.0\n#define FXAA_QUALITYP7 2.0\n#define FXAA_QUALITYP8 2.0\n#define FXAA_QUALITYP9 2.0\n#define FXAA_QUALITYP10 4.0\n#define FXAA_QUALITYP11 8.0\n#endif\n\n\n\n/*============================================================================\n API PORTING\n============================================================================*/\n#if (FXAA_GLSL_100 == 1) || (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)\n#define FxaaBool bool\n#define FxaaDiscard discard\n#define FxaaFloat float\n#define FxaaFloat2 vec2\n#define FxaaFloat3 vec3\n#define FxaaFloat4 vec4\n#define FxaaHalf float\n#define FxaaHalf2 vec2\n#define FxaaHalf3 vec3\n#define FxaaHalf4 vec4\n#define FxaaInt2 ivec2\n#define FxaaSat(x) clamp(x, 0.0, 1.0)\n#define FxaaTex sampler2D\n#else\n#define FxaaBool bool\n#define FxaaDiscard clip(-1)\n#define FxaaFloat float\n#define FxaaFloat2 float2\n#define FxaaFloat3 float3\n#define FxaaFloat4 float4\n#define FxaaHalf half\n#define FxaaHalf2 half2\n#define FxaaHalf3 half3\n#define FxaaHalf4 half4\n#define FxaaSat(x) saturate(x)\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_GLSL_100 == 1)\n#define FxaaTexTop(t, p) texture(t, p, 0.0)\n#define FxaaTexOff(t, p, o, r) texture(t, p + (o * r), 0.0)\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_GLSL_120 == 1)\n// Requires,\n// #version 120\n// And at least,\n// #extension GLEXT_gpu_shader4 : enable\n// (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)\n#define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)\n#if (FXAA_FAST_PIXEL_OFFSET == 1)\n#define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)\n#else\n#define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)\n#endif\n#if (FXAA_GATHER4_ALPHA == 1)\n// use #extension GLARB_gpu_shader5 : enable\n#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)\n#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)\n#define FxaaTexGreen4(t, p) textureGather(t, p, 1)\n#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)\n#endif\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_GLSL_130 == 1)\n// Requires \"#version 130\" or better\n#define FxaaTexTop(t, p) textureLod(t, p, 0.0)\n#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)\n#if (FXAA_GATHER4_ALPHA == 1)\n// use #extension GLARB_gpu_shader5 : enable\n#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)\n#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)\n#define FxaaTexGreen4(t, p) textureGather(t, p, 1)\n#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)\n#endif\n#endif\n\n\n/*============================================================================\n GREEN AS LUMA OPTION SUPPORT FUNCTION\n============================================================================*/\n#if (FXAA_GREEN_AS_LUMA == 0)\n FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return dot(rgba.rgb, vec3(0.298912, 0.586611, 0.114478)); }\n // FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }\n#else\n FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }\n#endif\n\n\n\n\n\n\n\n\n\n/*============================================================================\n FXAA3 QUALITY - PC\n============================================================================*/\n#if (FXAA_PC == 1)\n /*--------------------------------------------------------------------------*/\n FxaaFloat4 FxaaPixelShader(\n //\n // Use noperspective interpolation here (turn off perspective interpolation).\n // {xy} = center of pixel\n FxaaFloat2 pos,\n //\n // Used only for FXAA Console, and not used on the 360 version.\n // Use noperspective interpolation here (turn off perspective interpolation).\n // {xy} = upper left of pixel\n // {zw} = lower right of pixel\n FxaaFloat4 fxaaConsolePosPos,\n //\n // Input color texture.\n // {rgb_} = color in linear or perceptual color space\n // if (FXAA_GREEN_AS_LUMA == 0)\n // {_a} = luma in perceptual color space (not linear)\n FxaaTex tex,\n //\n // Only used on the optimized 360 version of FXAA Console.\n // For everything but 360, just use the same input here as for \"tex\".\n // For 360, same texture, just alias with a 2nd sampler.\n // This sampler needs to have an exponent bias of -1.\n FxaaTex fxaaConsole360TexExpBiasNegOne,\n //\n // Only used on the optimized 360 version of FXAA Console.\n // For everything but 360, just use the same input here as for \"tex\".\n // For 360, same texture, just alias with a 3nd sampler.\n // This sampler needs to have an exponent bias of -2.\n FxaaTex fxaaConsole360TexExpBiasNegTwo,\n //\n // Only used on FXAA Quality.\n // This must be from a constant/uniform.\n // {x_} = 1.0/screenWidthInPixels\n // {_y} = 1.0/screenHeightInPixels\n FxaaFloat2 fxaaQualityRcpFrame,\n //\n // Only used on FXAA Console.\n // This must be from a constant/uniform.\n // This effects sub-pixel AA quality and inversely sharpness.\n // Where N ranges between,\n // N = 0.50 (default)\n // N = 0.33 (sharper)\n // {x_} = -N/screenWidthInPixels\n // {_y} = -N/screenHeightInPixels\n // {z_} = N/screenWidthInPixels\n // {_w} = N/screenHeightInPixels\n FxaaFloat4 fxaaConsoleRcpFrameOpt,\n //\n // Only used on FXAA Console.\n // Not used on 360, but used on PS3 and PC.\n // This must be from a constant/uniform.\n // {x_} = -2.0/screenWidthInPixels\n // {_y} = -2.0/screenHeightInPixels\n // {z_} = 2.0/screenWidthInPixels\n // {_w} = 2.0/screenHeightInPixels\n FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n //\n // Only used on FXAA Console.\n // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.\n // This must be from a constant/uniform.\n // {x_} = 8.0/screenWidthInPixels\n // {_y} = 8.0/screenHeightInPixels\n // {z_} = -4.0/screenWidthInPixels\n // {_w} = -4.0/screenHeightInPixels\n FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n //\n // Only used on FXAA Quality.\n // This used to be the FXAA_QUALITYSUBPIX define.\n // It is here now to allow easier tuning.\n // Choose the amount of sub-pixel aliasing removal.\n // This can effect sharpness.\n // 1.00 - upper limit (softer)\n // 0.75 - default amount of filtering\n // 0.50 - lower limit (sharper, less sub-pixel aliasing removal)\n // 0.25 - almost off\n // 0.00 - completely off\n FxaaFloat fxaaQualitySubpix,\n //\n // Only used on FXAA Quality.\n // This used to be the FXAA_QUALITYEDGE_THRESHOLD define.\n // It is here now to allow easier tuning.\n // The minimum amount of local contrast required to apply algorithm.\n // 0.333 - too little (faster)\n // 0.250 - low quality\n // 0.166 - default\n // 0.125 - high quality\n // 0.063 - overkill (slower)\n FxaaFloat fxaaQualityEdgeThreshold,\n //\n // Only used on FXAA Quality.\n // This used to be the FXAA_QUALITYEDGE_THRESHOLD_MIN define.\n // It is here now to allow easier tuning.\n // Trims the algorithm from processing darks.\n // 0.0833 - upper limit (default, the start of visible unfiltered edges)\n // 0.0625 - high quality (faster)\n // 0.0312 - visible limit (slower)\n // Special notes when using FXAA_GREEN_AS_LUMA,\n // Likely want to set this to zero.\n // As colors that are mostly not-green\n // will appear very dark in the green channel!\n // Tune by looking at mostly non-green content,\n // then start at zero and increase until aliasing is a problem.\n FxaaFloat fxaaQualityEdgeThresholdMin,\n //\n // Only used on FXAA Console.\n // This used to be the FXAA_CONSOLEEDGE_SHARPNESS define.\n // It is here now to allow easier tuning.\n // This does not effect PS3, as this needs to be compiled in.\n // Use FXAA_CONSOLEPS3_EDGE_SHARPNESS for PS3.\n // Due to the PS3 being ALU bound,\n // there are only three safe values here: 2 and 4 and 8.\n // These options use the shaders ability to a free *|/ by 2|4|8.\n // For all other platforms can be a non-power of two.\n // 8.0 is sharper (default!!!)\n // 4.0 is softer\n // 2.0 is really soft (good only for vector graphics inputs)\n FxaaFloat fxaaConsoleEdgeSharpness,\n //\n // Only used on FXAA Console.\n // This used to be the FXAA_CONSOLEEDGE_THRESHOLD define.\n // It is here now to allow easier tuning.\n // This does not effect PS3, as this needs to be compiled in.\n // Use FXAA_CONSOLEPS3_EDGE_THRESHOLD for PS3.\n // Due to the PS3 being ALU bound,\n // there are only two safe values here: 1/4 and 1/8.\n // These options use the shaders ability to a free *|/ by 2|4|8.\n // The console setting has a different mapping than the quality setting.\n // Other platforms can use other values.\n // 0.125 leaves less aliasing, but is softer (default!!!)\n // 0.25 leaves more aliasing, and is sharper\n FxaaFloat fxaaConsoleEdgeThreshold,\n //\n // Only used on FXAA Console.\n // This used to be the FXAA_CONSOLEEDGE_THRESHOLD_MIN define.\n // It is here now to allow easier tuning.\n // Trims the algorithm from processing darks.\n // The console setting has a different mapping than the quality setting.\n // This only applies when FXAA_EARLY_EXIT is 1.\n // This does not apply to PS3,\n // PS3 was simplified to avoid more shader instructions.\n // 0.06 - faster but more aliasing in darks\n // 0.05 - default\n // 0.04 - slower and less aliasing in darks\n // Special notes when using FXAA_GREEN_AS_LUMA,\n // Likely want to set this to zero.\n // As colors that are mostly not-green\n // will appear very dark in the green channel!\n // Tune by looking at mostly non-green content,\n // then start at zero and increase until aliasing is a problem.\n FxaaFloat fxaaConsoleEdgeThresholdMin,\n //\n // Extra constants for 360 FXAA Console only.\n // Use zeros or anything else for other platforms.\n // These must be in physical constant registers and NOT immedates.\n // Immedates will result in compiler un-optimizing.\n // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)\n FxaaFloat4 fxaaConsole360ConstDir\n ) {\n /*--------------------------------------------------------------------------*/\n FxaaFloat2 posM;\n posM.x = pos.x;\n posM.y = pos.y;\n #if (FXAA_GATHER4_ALPHA == 1)\n #if (FXAA_DISCARD == 0)\n FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n #if (FXAA_GREEN_AS_LUMA == 0)\n #define lumaM rgbyM.w\n #else\n #define lumaM rgbyM.y\n #endif\n #endif\n #if (FXAA_GREEN_AS_LUMA == 0)\n FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);\n FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));\n #else\n FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);\n FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));\n #endif\n #if (FXAA_DISCARD == 1)\n #define lumaM luma4A.w\n #endif\n #define lumaE luma4A.z\n #define lumaS luma4A.x\n #define lumaSE luma4A.y\n #define lumaNW luma4B.w\n #define lumaN luma4B.z\n #define lumaW luma4B.x\n #else\n FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n #if (FXAA_GREEN_AS_LUMA == 0)\n #define lumaM rgbyM.w\n #else\n #define lumaM rgbyM.y\n #endif\n #if (FXAA_GLSL_100 == 1)\n FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(0.0, 1.0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(1.0, 0.0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(0.0, -1.0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 0.0), fxaaQualityRcpFrame.xy));\n #else\n FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(0, 1), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, 0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(0, -1), fxaaQualityRcpFrame.xy));\n #endif\n #endif\n /*--------------------------------------------------------------------------*/\n FxaaFloat maxSM = max(lumaS, lumaM);\n FxaaFloat minSM = min(lumaS, lumaM);\n FxaaFloat maxESM = max(lumaE, maxSM);\n FxaaFloat minESM = min(lumaE, minSM);\n FxaaFloat maxWN = max(lumaN, lumaW);\n FxaaFloat minWN = min(lumaN, lumaW);\n FxaaFloat rangeMax = max(maxWN, maxESM);\n FxaaFloat rangeMin = min(minWN, minESM);\n FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\n FxaaFloat range = rangeMax - rangeMin;\n FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\n FxaaBool earlyExit = range < rangeMaxClamped;\n /*--------------------------------------------------------------------------*/\n if (earlyExit)\n #if (FXAA_DISCARD == 1)\n FxaaDiscard;\n #else\n return rgbyM;\n #endif\n /*--------------------------------------------------------------------------*/\n #if (FXAA_GATHER4_ALPHA == 0)\n #if (FXAA_GLSL_100 == 1)\n FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, -1.0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(1.0, 1.0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(1.0, -1.0), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 1.0), fxaaQualityRcpFrame.xy));\n #else\n FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, -1), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, 1), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\n #endif\n #else\n FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));\n FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\n #endif\n /*--------------------------------------------------------------------------*/\n FxaaFloat lumaNS = lumaN + lumaS;\n FxaaFloat lumaWE = lumaW + lumaE;\n FxaaFloat subpixRcpRange = 1.0 / range;\n FxaaFloat subpixNSWE = lumaNS + lumaWE;\n FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;\n FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;\n /*--------------------------------------------------------------------------*/\n FxaaFloat lumaNESE = lumaNE + lumaSE;\n FxaaFloat lumaNWNE = lumaNW + lumaNE;\n FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\n FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\n /*--------------------------------------------------------------------------*/\n FxaaFloat lumaNWSW = lumaNW + lumaSW;\n FxaaFloat lumaSWSE = lumaSW + lumaSE;\n FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\n FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\n FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\n FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\n FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;\n FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;\n /*--------------------------------------------------------------------------*/\n FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;\n FxaaFloat lengthSign = fxaaQualityRcpFrame.x;\n FxaaBool horzSpan = edgeHorz >= edgeVert;\n FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\n /*--------------------------------------------------------------------------*/\n if (!horzSpan) lumaN = lumaW;\n if (!horzSpan) lumaS = lumaE;\n if (horzSpan) lengthSign = fxaaQualityRcpFrame.y;\n FxaaFloat subpixB = (subpixA * (1.0 / 12.0)) - lumaM;\n /*--------------------------------------------------------------------------*/\n FxaaFloat gradientN = lumaN - lumaM;\n FxaaFloat gradientS = lumaS - lumaM;\n FxaaFloat lumaNN = lumaN + lumaM;\n FxaaFloat lumaSS = lumaS + lumaM;\n FxaaBool pairN = abs(gradientN) >= abs(gradientS);\n FxaaFloat gradient = max(abs(gradientN), abs(gradientS));\n if (pairN) lengthSign = -lengthSign;\n FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);\n /*--------------------------------------------------------------------------*/\n FxaaFloat2 posB;\n posB.x = posM.x;\n posB.y = posM.y;\n FxaaFloat2 offNP;\n offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n offNP.y = (horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n if (!horzSpan) posB.x += lengthSign * 0.5;\n if (horzSpan) posB.y += lengthSign * 0.5;\n /*--------------------------------------------------------------------------*/\n FxaaFloat2 posN;\n posN.x = posB.x - offNP.x * FXAA_QUALITYP0;\n posN.y = posB.y - offNP.y * FXAA_QUALITYP0;\n FxaaFloat2 posP;\n posP.x = posB.x + offNP.x * FXAA_QUALITYP0;\n posP.y = posB.y + offNP.y * FXAA_QUALITYP0;\n FxaaFloat subpixD = ((-2.0) * subpixC) + 3.0;\n FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));\n FxaaFloat subpixE = subpixC * subpixC;\n FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));\n /*--------------------------------------------------------------------------*/\n if (!pairN) lumaNN = lumaSS;\n FxaaFloat gradientScaled = gradient * 1.0 / 4.0;\n FxaaFloat lumaMM = lumaM - lumaNN * 0.5;\n FxaaFloat subpixF = subpixD * subpixE;\n FxaaBool lumaMLTZero = lumaMM < 0.0;\n /*--------------------------------------------------------------------------*/\n lumaEndN -= lumaNN * 0.5;\n lumaEndP -= lumaNN * 0.5;\n FxaaBool doneN = abs(lumaEndN) >= gradientScaled;\n FxaaBool doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP1;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP1;\n FxaaBool doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP1;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP1;\n /*--------------------------------------------------------------------------*/\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP2;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP2;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP2;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP2;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 3)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP3;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP3;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP3;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP3;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 4)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP4;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP4;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP4;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP4;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 5)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP5;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP5;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP5;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP5;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 6)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP6;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP6;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP6;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP6;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 7)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP7;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP7;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP7;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP7;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 8)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP8;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP8;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP8;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP8;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 9)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP9;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP9;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP9;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP9;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 10)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP10;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP10;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP10;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP10;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 11)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP11;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP11;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP11;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP11;\n /*--------------------------------------------------------------------------*/\n #if (FXAA_QUALITYPS > 12)\n if (doneNP) {\n if (!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n if (!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n if (!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if (!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if (!doneN) posN.x -= offNP.x * FXAA_QUALITYP12;\n if (!doneN) posN.y -= offNP.y * FXAA_QUALITYP12;\n doneNP = (!doneN) || (!doneP);\n if (!doneP) posP.x += offNP.x * FXAA_QUALITYP12;\n if (!doneP) posP.y += offNP.y * FXAA_QUALITYP12;\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n #endif\n /*--------------------------------------------------------------------------*/\n }\n /*--------------------------------------------------------------------------*/\n FxaaFloat dstN = posM.x - posN.x;\n FxaaFloat dstP = posP.x - posM.x;\n if (!horzSpan) dstN = posM.y - posN.y;\n if (!horzSpan) dstP = posP.y - posM.y;\n /*--------------------------------------------------------------------------*/\n FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\n FxaaFloat spanLength = (dstP + dstN);\n FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\n FxaaFloat spanLengthRcp = 1.0 / spanLength;\n /*--------------------------------------------------------------------------*/\n FxaaBool directionN = dstN < dstP;\n FxaaFloat dst = min(dstN, dstP);\n FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;\n FxaaFloat subpixG = subpixF * subpixF;\n FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\n FxaaFloat subpixH = subpixG * fxaaQualitySubpix;\n /*--------------------------------------------------------------------------*/\n FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\n FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\n if (!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\n if (horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\n #if (FXAA_DISCARD == 1)\n return FxaaTexTop(tex, posM);\n #else\n return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);\n #endif\n}\n/*==========================================================================*/\n#endif\n\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec2 screenInfo = vec2(textureSize(u_baseColorTexture, 0));\n rt0 = FxaaPixelShader(\n v_texcoord_0,\n vec4(0.0),\n u_baseColorTexture,\n u_baseColorTexture,\n u_baseColorTexture,\n 1.0 / screenInfo,\n vec4(0.0),\n vec4(0.0),\n vec4(0.0),\n 0.75,\n 0.166,\n 0.0833,\n 0.0,\n 0.0,\n 0.0,\n vec4(0.0)\n );\n rt0.a = 1.0;\n\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.vert": /*!**************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.vert ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nout vec2 v_texcoord_0;\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag": /*!****************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\nin vec2 v_texcoord_0;\nin vec3 v_baryCentricCoord;\n\nuniform int u_shadingModel; // initialValue=0\nuniform float u_alphaCutoff; // initialValue=0.01\nuniform vec4 u_diffuseColorFactor; // initialValue=(1,1,1,1)\nuniform sampler2D u_diffuseColorTexture; // initialValue=(0,white)\nuniform sampler2D u_normalTexture; // initialValue=(1,blue)\nuniform vec4 u_diffuseColorTextureTransform; // initialValue=(1,1,0,0)\nuniform float u_diffuseColorTextureRotation; // initialValue=0\n\n/* shaderity: @{renderTargetBegin} */\n\n\n\nvec2 uvTransform(vec2 scale, vec2 offset, float rotation, vec2 uv) {\n mat3 translationMat = mat3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n mat3 rotationMat = mat3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n mat3 scaleMat = mat3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n mat3 matrix = translationMat * rotationMat * scaleMat;\n vec2 uvTransformed = ( matrix * vec3(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n\n/* shaderity: @{getters} */\n\nstruct Light {\n int type; // 0 = directional, 1 = point, 2 = spot\n vec3 position;\n vec3 intensity;\n vec3 attenuatedIntensity;\n vec3 directionOfLightObject;\n vec3 direction; // direction of light vector, equal to normalize(light.pointToLight)\n vec3 pointToLight; // not normalized\n float spotAngleScale;\n float spotAngleOffset;\n float effectiveRange;\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfloat getRangeAttenuation(Light light)\n{\n float distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfloat getSpotAttenuation(Light light)\n{\n\n float cd = dot(light.directionOfLightObject, light.direction);\n float angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nvoid getLightAttenuated(Light light) {\n light.attenuatedIntensity = light.intensity;\n // if (light.type == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.type == 1)\n {\n light.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.type == 2)\n {\n light.attenuatedIntensity *= getSpotAttenuation(light);\n }\n}\n\nLight getLight(int lightIdx, vec3 v_position_inWorld) {\n vec3 lightPosition = get_lightPosition(0.0, lightIdx);\n vec3 direction_and_w_of_LightObject = get_lightDirection(0.0, lightIdx);\n vec3 lightIntensity = get_lightIntensity(0.0, lightIdx);\n vec4 lightProperty = get_lightProperty(0.0, lightIdx);\n Light light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n float lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3(0.0);\n light.type = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.type = 1;\n } else { // is Directional Light\n light.type = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.type = 2;\n }\n\n const float M_PI = 3.141592653589793;\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n getLightAttenuated(light);\n\n return light;\n}\n\n\nvoid main ()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n#ifdef RN_IS_ALPHA_MODE_MASK\n float alphaCutoff = get_alphaCutoff(materialSID, 0);\n if (alpha < alphaCutoff) {\n discard;\n }\n#endif\n\n\n // Normal\n vec3 normal_inWorld = normalize(v_normal_inWorld);\n\n vec4 diffuseColorFactor = get_diffuseColorFactor(materialSID, 0);\n\n\n // diffuseColor (Considered to be premultiplied alpha)\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n float alpha = 1.0;\n if (v_color != diffuseColor && diffuseColorFactor.rgb != diffuseColor) {\n diffuseColor = v_color * diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (v_color == diffuseColor) {\n diffuseColor = diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (diffuseColorFactor.rgb == diffuseColor) {\n diffuseColor = v_color;\n } else {\n diffuseColor = vec3(1.0, 1.0, 1.0);\n }\n\n // diffuseColorTexture (Considered to be premultiplied alpha)\n vec4 diffuseColorTextureTransform = get_diffuseColorTextureTransform(materialSID, 0);\n float diffuseColorTextureRotation = get_diffuseColorTextureRotation(materialSID, 0);\n vec2 diffuseColorTexUv = uvTransform(diffuseColorTextureTransform.xy, diffuseColorTextureTransform.zw, diffuseColorTextureRotation, v_texcoord_0);\n vec4 textureColor = texture(u_diffuseColorTexture, diffuseColorTexUv);\n diffuseColor *= textureColor.rgb;\n alpha *= textureColor.a;\n\n\n#ifdef RN_IS_ALPHA_MODE_BLEND\n#else\n alpha = 1.0;\n#endif\n\n rt0 = vec4(diffuseColor * alpha, alpha);\n\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert": /*!****************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec4 a_joint;\nin vec4 a_weight;\nin vec4 a_baryCentricCoord;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\nout vec2 v_texcoord_0;\nout vec3 v_baryCentricCoord;\n\nuniform float u_pointSize; // initialValue=30\nuniform vec3 u_pointDistanceAttenuation; // initialValue=(0,0.1,0.01)\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n bool isBillboard = get_isBillboard(a_instanceInfo.x);\n\n // Skeletal\n processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n isBillboard,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n\n v_color = a_color;\n v_normal_inWorld = normalMatrix * a_normal;\n v_texcoord_0 = a_texcoord_0;\n v_baryCentricCoord = a_baryCentricCoord.xyz;\n\n bool visibility = get_isVisible(a_instanceInfo.x);\n if (!visibility)\n {\n gl_Position = vec4(0.0);\n }\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.frag": /*!******************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.frag ***! \******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\n\n/* shaderity: @{renderTargetBegin} */\n\n\n\n/* shaderity: @{getters} */\n\n#define MATH_PI 3.141592\n\n// These codes are referenced from https://github.com/knarkowicz/FurnaceTest\nfloat roughnessRemap(float userRoughness) {\n return userRoughness * userRoughness;\n}\n\n// GGX NDF\nfloat d_ggx(float userRoughness, float NH) {\n float alphaRoughness = userRoughness * userRoughness;\n float roughnessSqr = alphaRoughness * alphaRoughness;\n float f = (roughnessSqr - 1.0) * NH * NH + 1.0;\n return roughnessSqr / (MATH_PI * f * f);\n}\n\n// this is from https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 envBRDFApprox( float Roughness, float NoV ) {\n const vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022 );\n const vec4 c1 = vec4(1, 0.0425, 1.04, -0.04 );\n vec4 r = Roughness * c0 + c1;\n float a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y;\n vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\n return AB;\n}\n\nfloat specularIBL(float userRoughness, float NV, float f0) {\n /// Use specular BRDF LUT\n // vec3 brdf = texture(u_brdfLutTexture, vec2(NV, 1.0 - userRoughness)).rgb;\n // float specular = 1.0 * (f0 * brdf.x + brdf.y);\n\n /// Use specular BRDF Approx\n vec2 f_ab = envBRDFApprox(userRoughness, NV);\n vec3 specular = vec3(f0) * f_ab.x + f_ab.y;\n return specular.x;\n}\n\n// The Schlick Approximation to Fresnel\nfloat fresnel(float f0, float VH) {\n return f0 + (1.0 - f0) * pow(1.0 - VH, 5.0);\n}\n\nfloat smithG1(float roughness, float NoV)\n{\n\tfloat a = roughnessRemap( roughness );\n\tfloat a2 = a * a;\n\tfloat NoV2 = NoV * NoV;\n\tfloat lambda = (-1.0 + sqrt(1.0 + a2 * (1.0 - NoV2) / NoV2)) * 0.5;\n\treturn 1.0 / (1.0 + lambda);\n}\n\nfloat smithG(float roughness, float NoV, float NoL)\n{\n\tfloat a = roughnessRemap( roughness );\n\tfloat a2 = a * a;\n\tfloat NoV2 = NoV * NoV;\n\tfloat NoL2 = NoL * NoL;\n\tfloat lambdaV = (-1.0 + sqrt(1.0 + a2 * (1.0 - NoV2) / NoV2)) * 0.5;\n\tfloat lambdaL = (-1.0 + sqrt(1.0 + a2 * (1.0 - NoL2) / NoL2)) * 0.5;\n\treturn 1.0 / (1.0 + lambdaV + lambdaL);\n}\n\nfloat g_shieldingForWeak(float alphaRoughness, float NV, float NL) {\n float r = alphaRoughness;\n\n // Local Masking using \"Schlick-Smith\" Masking Function\n float localMasking = 2.0 * NV / (NV + sqrt(r * r + (1.0 - r * r) * (NV * NV)));\n\n return localMasking;\n}\n\n\nfloat g_shielding(float roughness, float NV, float NL) {\n float a = roughnessRemap( roughness );\n float r = a;\n\n // Local Shadowing using \"Schlick-Smith\" Masking Function\n float localShadowing = 2.0 * NL / (NL + sqrt(r * r + (1.0 - r * r) * (NL * NL)));\n\n // Local Masking using \"Schlick-Smith\" Masking Function\n float localMasking = 2.0 * NV / (NV + sqrt(r * r + (1.0 - r * r) * (NV * NV)));\n\n return localShadowing * localMasking;\n}\n\nfloat v_GGXCorrelatedForWeak(float roughness, float NV, float NL) {\n float a = roughnessRemap( roughness );\n float a2 = a * a;\n float GGXV = NL * sqrt(NV * NV * (1.0 - a2) + a2);\n return 0.5 / (GGXV);\n}\n\nfloat v_GGXCorrelated(float roughness, float NV, float NL) {\n float a = roughnessRemap( roughness );\n float a2 = a * a;\n float GGXV = NL * sqrt(NV * NV * (1.0 - a2) + a2);\n float GGXL = NV * sqrt(NL * NL * (1.0 - a2) + a2);\n return 0.5 / (GGXV + GGXL);\n}\n\n// this is from https://learnopengl.com/PBR/IBL/Specular-IBL\nfloat vanDerCorpus(int n, int base)\n{\n float invBase = 1.0 / float(base);\n float denom = 1.0;\n float result = 0.0;\n\n for(int i = 0; i < 32; ++i)\n {\n if(n > 0)\n {\n denom = mod(float(n), 2.0);\n result += denom * invBase;\n invBase = invBase / 2.0;\n n = int(float(n) / 2.0);\n }\n }\n\n return result;\n}\n\nvec2 hammersleyNoBitOps(int i, int N)\n{\n return vec2(float(i)/float(N), vanDerCorpus(i, 2));\n}\n\nfloat radicalInverse_VdC(uint bits)\n{\n bits = (bits << 16u) | (bits >> 16u);\n bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n return float(bits) * 2.3283064365386963e-10; // / 0x100000000\n}\n// ----------------------------------------------------------------------------\nvec2 hammersley(uint i, uint N)\n{\n return vec2(float(i)/float(N), radicalInverse_VdC(i));\n}\n\nvec3 sampleHemisphereGGX(vec2 Xi, float roughness) {\n float a = roughnessRemap(roughness);\n\tfloat a2 = a * a;\n\n float phi = 2.0 * MATH_PI * Xi.x;\n float cosPhi = cos(phi);\n float sinPhi = sin(phi);\n float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a2 - 1.0) * Xi.y)); // GGX\n float sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n\n return vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n}\n\nfloat weakWhiteFurnaceTest(float roughness, float NoV, float f0, int g_type, int disable_fresnel)\n{\n\tfloat vx = sqrt(1.0 - NoV * NoV);\n\tfloat vy = 0.0;\n\tfloat vz = NoV;\n\n\tfloat integral = 0.0;\n\tconst uint sampleNum = 2048u;\n\tfor (uint i = 0u; i < sampleNum; ++i)\n\t{\n vec2 Xi = hammersley(i, sampleNum);\n\n vec3 hvec = sampleHemisphereGGX(Xi, roughness);\n\n\t\tfloat VoHUnsat = vx * hvec.x + vy * hvec.y + vz * hvec.z;\n\n float lz = 2.0 * VoHUnsat * hvec.z - vz;\n\n float NoL = max(lz, 0.0);\n\t\tfloat NoH = max(hvec.z, 0.0);\n\t\tfloat VoH = max(VoHUnsat, 0.0);\n\n float f = fresnel(f0, VoH);\n\n float g1 = 0.0;\n if (g_type == 0) {\n g1 = smithG1(roughness, NoV);\n } else if (g_type == 1) {\n g1 = g_shieldingForWeak(roughness, NoV, NoL);\n } else if (g_type == 2) {\n g1 = v_GGXCorrelatedForWeak(roughness, NoV, NoL) * 4.0 * NoV * NoL;\n }\n\n float pdf = 4.0 * VoH / NoH;\n float integralValue = (g1 * pdf) / (4.0 * NoV);\n if (disable_fresnel == 0) {\n integralValue *= f;\n }\n // integralValue *= 0.5; // Set furnace color 0.5\n\n integral += integralValue;\n\n\t}\n\tintegral /= float(sampleNum);\n\treturn clamp(integral, 0.0, 1.0);\n}\n\nfloat whiteFurnaceTest(float roughness, float NoV, float f0, int g_type, int disable_fresnel)\n{\n\tfloat vx = sqrt(1.0 - NoV * NoV);\n\tfloat vy = 0.0;\n\tfloat vz = NoV;\n\n\tfloat integral = 0.0;\n\tconst uint sampleNum = 4096u;\n\tfor (uint i = 0u; i < sampleNum; ++i)\n\t{\n\n vec2 Xi = hammersley(i, sampleNum);\n\n vec3 hvec = sampleHemisphereGGX(Xi, roughness);\n\n\t\tfloat VoHUnsat = vx * hvec.x + vy * hvec.y + vz * hvec.z;\n\t\tfloat lx = 2.0 * VoHUnsat * hvec.x - vx;\n\t\tfloat ly = 2.0 * VoHUnsat * hvec.y - vy;\n\t\tfloat lz = 2.0 * VoHUnsat * hvec.z - vz;\n\n\t\tfloat NoL = max(lz, 0.0);\n\t\tfloat NoH = max(hvec.z, 0.0);\n float VoH = max(VoHUnsat, 0.0);\n\n float f = fresnel(f0, VoH);\n\n float g = 0.0;\n if (g_type == 0) {\n g = smithG(roughness, NoV, NoL);\n } else if (g_type == 1){\n g = g_shielding(roughness, NoV, NoL);\n } else if (g_type == 2){\n g = v_GGXCorrelated(roughness, NoV, NoL) * (4.0 * NoV * NoL);\n } else if (g_type == 3) {\n g = 0.0;\n }\n\n float pdf = 4.0 * VoH / NoH;\n float integralValue = (g * pdf) / (4.0 * NoV);\n if (disable_fresnel == 0 && g_type != 3) {\n integralValue *= f;\n }\n // integralValue *= 0.5; // Set furnace color 0.5\n integral += integralValue;\n\t}\n integral /= float(sampleNum);\n if (g_type == 3) {\n integral = specularIBL(roughness, NoV, f0);\n }\n\treturn clamp(integral, 0.0, 1.0);\n}\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec2 quadSizeInPixel = get_screenInfo(materialSID, 0);\n float roughness = 0.0;\n float NoV = 0.0; // normal dot view vector\n\n // 2D mode\n int mode = get_mode(materialSID, 0);\n if (mode == 0) {\n roughness = (gl_FragCoord.y) / quadSizeInPixel.y;\n NoV = (gl_FragCoord.x) / quadSizeInPixel.x;\n } else {\n // object mode\n // Roughness\n const float c_MinRoughness = 0.04;\n vec2 metallicRoughnessFactor = get_metallicRoughnessFactor(materialSID, 0);\n float userRoughness = metallicRoughnessFactor.y;\n float metallic = metallicRoughnessFactor.x;\n\n vec4 ormTexel = texture(u_metallicRoughnessTexture, v_texcoord);\n userRoughness = ormTexel.g * userRoughness;\n userRoughness = clamp(userRoughness, c_MinRoughness, 1.0);\n roughness = userRoughness;\n\n // vec3 viewVector = normalize(vec3(0.0, 0.0, 10.0) - v_position_inWorld.xyz);\n // vec3 viewVector = normalize(u_viewPosition - v_position_inWorld.xyz);\n vec3 viewVector = vec3(0.0, 0.0, 1.0);\n NoV = dot(v_normal_inWorld, viewVector);\n }\n\n int debugView = get_debugView(materialSID, 0);\n float f0 = get_f0(materialSID, 0);\n int g_type = get_g_type(materialSID, 0);\n int disable_fresnel = get_disable_fresnel(materialSID, 0);\n\n if (debugView == 0) {\n float whiteFurnaceResult = whiteFurnaceTest(roughness, NoV, f0, g_type, disable_fresnel);\n rt0 = vec4(whiteFurnaceResult, whiteFurnaceResult, whiteFurnaceResult, 1.0);\n\n } else if (debugView == 1) {\n float weakWhiteFurnaceResult = weakWhiteFurnaceTest(roughness, NoV, f0, g_type, disable_fresnel);\n rt0 = vec4(weakWhiteFurnaceResult, weakWhiteFurnaceResult, weakWhiteFurnaceResult, 1.0);\n\n } else if (debugView == 2){\n float nn = NoV*0.5+0.5;\n rt0 = vec4(nn, nn, nn, 1.0);\n\n } else if (debugView == 3){\n rt0 = vec4(v_normal_inWorld.xyz, 1.0);\n\n } else if (debugView == 4){\n float whiteFurnaceResult = whiteFurnaceTest(roughness, NoV, f0, g_type, disable_fresnel);\n float weakWhiteFurnaceResult = weakWhiteFurnaceTest(roughness, NoV, f0, g_type, disable_fresnel);\n rt0 = vec4(whiteFurnaceResult, weakWhiteFurnaceResult, 0.0, 1.0);\n\n } else if (debugView == 5){\n rt0 = vec4(roughness, NoV, 0.0, 1.0);\n\n } else {\n rt0 = vec4(1.0, 1.0, 1.0, 1.0);\n }\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.vert": /*!******************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.vert ***! \******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord;\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_joint;\nin vec4 a_weight;\n\nout vec2 v_texcoord;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\nmat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\nmat4 viewMatrix = get_viewMatrix(cameraSID, 0);\nmat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\ngl_Position = projectionMatrix * viewMatrix * worldMatrix * vec4(a_position, 1.0);\n\n\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n v_normal_inWorld = normalMatrix * a_normal;\n v_position_inWorld = worldMatrix * vec4(a_position, 1.0);\n v_texcoord = a_texcoord;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag": /*!**************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\n\nuniform sampler2D u_baseColorTexture; // initialValue=(0,white)\nuniform bool u_enableLinearToSrgb; // initialValue=true\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nvec3 linearToSrgb(vec3 linearColor) {\n return pow(linearColor, vec3(1.0/2.2));\n}\n\nvec3 srgbToLinear(vec3 srgbColor) {\n return pow(srgbColor, vec3(2.2));\n}\n\n\nvoid main ()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\nvec4 baseColor = texture(u_baseColorTexture, v_texcoord_0);\n\nif (get_enableLinearToSrgb(materialSID, 0)) {\n baseColor.rgb = linearToSrgb(baseColor.rgb);\n}\n\nrt0 = baseColor;\n\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert": /*!**************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.frag": /*!**************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.frag ***! \**************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\nfloat decodeRGBAToDepth(vec4 RGBA){\n const float rMask = 1.0;\n const float gMask = 1.0 / 255.0;\n const float bMask = 1.0 / (255.0 * 255.0);\n const float aMask = 1.0 / (255.0 * 255.0 * 255.0);\n float depth = dot(RGBA, vec4(rMask, gMask, bMask, aMask));\n return depth;\n}\n\nvec4 encodeDepthToRGBA(float depth){\n float r = depth;\n float g = fract(r * 255.0);\n float b = fract(g * 255.0);\n float a = fract(b * 255.0);\n float coef = 1.0 / 255.0;\n r -= g * coef;\n g -= b * coef;\n b -= a * coef;\n return vec4(r, g, b, a);\n}\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n float framebufferSize;\n vec2 offset = gl_FragCoord.st;\n\n vec2 blurDirection;\n bool isHorizontal = get_isHorizontal(materialSID, 0);\n if(isHorizontal){\n framebufferSize = get_framebufferSize(materialSID, 0).x;\n blurDirection = vec2(1.0,0.0);\n }else{\n framebufferSize = get_framebufferSize(materialSID, 0).y;\n blurDirection = vec2(0.0,1.0);\n }\n\tfloat tFrag = 1.0 / framebufferSize;\n\n float depth = 0.0;\n int gaussianKernelSize = get_gaussianKernelSize(materialSID, 0);\n float minStrideLength = -float(gaussianKernelSize - 1) / 2.0;\n\n for(int i=0; i < 30; i++) {\n if(gaussianKernelSize == i) {\n break;\n }\n\n float strideLength = minStrideLength + float(i);\n vec2 stride = strideLength * blurDirection;\n float depthData = decodeRGBAToDepth(texture(u_baseColorTexture, (offset + stride) * tFrag));\n if(depthData > 1.0) depthData = 1.0;\n\n float gaussianRatio = u_gaussianRatio[i];\n depth += depthData * gaussianRatio;\n }\n\n rt0 = encodeDepthToRGBA(depth);\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.vert": /*!**************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.vert ***! \**************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec3 a_position;\nin vec2 a_texcoord_0;\nout vec2 v_texcoord_0;\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag": /*!********************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\nin vec2 v_texcoord_0;\n\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec2 offset = gl_FragCoord.st;\n ivec2 vrState = get_vrState(0.0, 0);\n vec2 framebufferSize = get_framebufferSize(materialSID, 0);\n vec2 blurDirection;\n bool isHorizontal = get_isHorizontal(materialSID, 0);\n if (isHorizontal) {\n blurDirection = vec2(1.0, 0.0);\n } else { // vertical\n blurDirection = vec2(0.0, 1.0);\n }\n\tvec2 tFrag = 1.0 / framebufferSize;\n\n vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n int gaussianKernelSize = get_gaussianKernelSize(materialSID, 0);\n float minStrideLength = -float(gaussianKernelSize - 1) / 2.0;\n\n for(int i = 0; i < gaussianKernelSize; i++) {\n float strideLength = minStrideLength + float(i);\n vec2 stride = strideLength * blurDirection;\n float gaussianRatio = get_gaussianRatio(materialSID, i);\n vec2 uv = (offset + stride) * tFrag;\n if (vrState.x == 1 && isHorizontal) { // if in VR mode and horizontal blur\n if (gl_FragCoord.x < framebufferSize.x / 2.0) { // left eye\n uv.x = min(uv.x * 0.5, 0.5);\n } else { // right eye\n uv.x = max(uv.x * 0.5 - 0.5, 0.5);\n }\n }\n color.rgb += texture(u_baseColorTexture, uv).rgb * gaussianRatio;\n }\n\n rt0 = color;\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert": /*!********************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec3 a_position;\nin vec2 a_texcoord_0;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag": /*!******************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag ***! \******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nconst float EPS_COL = 0.00001;\n\nin vec2 v_texcoord_0;\nin vec3 v_baryCentricCoord;\nin vec3 v_normal_inView;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\n#ifdef RN_USE_TANGENT\n in vec3 v_tangent_inWorld;\n in vec3 v_binormal_inWorld; // bitangent_inWorld\n#endif\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nstruct Light {\n int type; // 0 = directional, 1 = point, 2 = spot\n vec3 position;\n vec3 intensity;\n vec3 attenuatedIntensity;\n vec3 directionOfLightObject;\n vec3 direction; // direction of light vector, equal to normalize(light.pointToLight)\n vec3 pointToLight; // not normalized\n float spotAngleScale;\n float spotAngleOffset;\n float effectiveRange;\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfloat getRangeAttenuation(Light light)\n{\n float distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfloat getSpotAttenuation(Light light)\n{\n\n float cd = dot(light.directionOfLightObject, light.direction);\n float angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nvoid getLightAttenuated(Light light) {\n light.attenuatedIntensity = light.intensity;\n // if (light.type == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.type == 1)\n {\n light.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.type == 2)\n {\n light.attenuatedIntensity *= getSpotAttenuation(light);\n }\n}\n\nLight getLight(int lightIdx, vec3 v_position_inWorld) {\n vec3 lightPosition = get_lightPosition(0.0, lightIdx);\n vec3 direction_and_w_of_LightObject = get_lightDirection(0.0, lightIdx);\n vec3 lightIntensity = get_lightIntensity(0.0, lightIdx);\n vec4 lightProperty = get_lightProperty(0.0, lightIdx);\n Light light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n float lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3(0.0);\n light.type = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.type = 1;\n } else { // is Directional Light\n light.type = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.type = 2;\n }\n\n const float M_PI = 3.141592653589793;\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n getLightAttenuated(light);\n\n return light;\n}\n\n\nfloat edge_ratio(vec3 bary3, float wireframeWidthInner, float wireframeWidthRelativeScale) {\n vec3 d = fwidth(bary3);\n vec3 x = bary3+vec3(1.0 - wireframeWidthInner)*d;\n vec3 a3 = smoothstep(vec3(0.0), d, x);\n float factor = min(min(a3.x, a3.y), a3.z);\n\n return clamp((1.0 - factor), 0.0, 1.0);\n}\n\nvec3 linearToSrgb(vec3 linearColor) {\n return pow(linearColor, vec3(1.0/2.2));\n}\n\nvec3 srgbToLinear(vec3 srgbColor) {\n return pow(srgbColor, vec3(2.2));\n}\n\n#ifdef RN_USE_TANGENT\n mat3 getTBN(vec3 normal_inWorld, vec3 viewVector, vec2 texcoord) {\n vec3 tangent_inWorld = normalize(v_tangent_inWorld);\n vec3 binormal_inWorld = normalize(v_binormal_inWorld);\n mat3 tbnMat_tangent_to_world = mat3(tangent_inWorld, binormal_inWorld, normal_inWorld);\n\n return tbnMat_tangent_to_world;\n }\n#else\n // This is based on http://www.thetenthplanet.de/archives/1180\n mat3 cotangent_frame(vec3 normal_inWorld, vec3 position, vec2 uv) {\n uv = gl_FrontFacing ? uv : -uv;\n\n // get edge vectors of the pixel triangle\n vec3 dp1 = dFdx(position);\n vec3 dp2 = dFdy(position);\n vec2 duv1 = dFdx(uv);\n vec2 duv2 = dFdy(uv);\n\n // solve the linear system\n vec3 dp2perp = cross(dp2, normal_inWorld);\n vec3 dp1perp = cross(normal_inWorld, dp1);\n vec3 tangent = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 bitangent = dp2perp * duv1.y + dp1perp * duv2.y;\n bitangent *= -1.0;\n\n // construct a scale-invariant frame\n float invMat = inversesqrt(max(dot(tangent, tangent), dot(bitangent, bitangent)));\n return mat3(tangent * invMat, bitangent * invMat, normal_inWorld);\n }\n\n mat3 getTBN(vec3 normal_inWorld, vec3 viewVector, vec2 texcoord) {\n mat3 tbnMat_tangent_to_world = cotangent_frame(normal_inWorld, -viewVector, texcoord);\n\n return tbnMat_tangent_to_world;\n }\n#endif\n\n\nvoid main (){\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_NONE\n discard;\n #endif\n #endif\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n\n // TODO\n // uv transform\n\n // TODO\n // uv animation\n\n // main color\n vec4 litTextureColor = texture(u_litColorTexture, v_texcoord_0);\n vec4 litColorFactor = get_litColor(materialSID, 0);\n\n // alpha\n float alpha = 1.0;\n\n #ifdef RN_ALPHATEST_ON\n alpha = litTextureColor.a * litColorFactor.a;\n float cutoff = get_cutoff(materialSID, 0);\n if(alpha < cutoff) discard;\n #elif defined(RN_ALPHABLEND_ON)\n alpha = litTextureColor.a * litColorFactor.a;\n #endif\n\n if (alpha < 0.01) {\n discard;\n }else{\n rt0.w = alpha;\n }\n\n\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_COLOR_FIXED\n vec3 outlineColor = get_outlineColor(materialSID, 0);\n rt0.xyz = outlineColor;\n\n rt0.xyz = srgbToLinear(rt0.xyz);\n/* shaderity: @{renderTargetEnd} */\n\n return;\n #endif\n #endif\n\n // view vector\n vec3 viewPosition = get_viewPosition(cameraSID, 0);\n vec3 viewVector = viewPosition - v_position_inWorld.xyz;\n\n // Normal\n vec3 normal_inWorld = normalize(v_normal_inWorld);\n #ifdef RN_MTOON_HAS_BUMPMAP\n vec3 normal = texture(u_normalTexture, v_texcoord_0).xyz * 2.0 - 1.0;\n mat3 TBN = getTBN(normal_inWorld, viewVector, v_texcoord_0);\n normal_inWorld = normalize(TBN * normal);\n #endif\n\n #ifdef RN_MTOON_IS_OUTLINE\n normal_inWorld *= -1.0;\n #endif\n\n\n // Lighting, Direct Light\n\n float shadowAttenuation = 1.0;\n // TODO: shadowmap computation\n\n float receiveShadowRate = get_receiveShadowRate(materialSID, 0);\n float lightAttenuation = shadowAttenuation * mix(1.0, shadowAttenuation, receiveShadowRate * texture(u_receiveShadowTexture, v_texcoord_0).r);\n\n float shadingGradeRate = get_shadingGradeRate(materialSID, 0);\n float shadingGrade = 1.0 - shadingGradeRate * (1.0 - texture(u_shadingGradeTexture, v_texcoord_0).r);\n float lightColorAttenuation = get_lightColorAttenuation(materialSID, 0);\n\n vec3 shadeColorFactor = get_shadeColor(materialSID, 0);\n vec3 shadeColor = shadeColorFactor * texture(u_shadeColorTexture, v_texcoord_0).xyz;\n shadeColor.xyz = srgbToLinear(shadeColor.xyz);\n\n vec3 litColor = litColorFactor.xyz * litTextureColor.xyz;\n litColor.xyz = srgbToLinear(litColor.xyz);\n\n\n float shadeShift = get_shadeShift(materialSID, 0);\n float shadeToony = get_shadeToony(materialSID, 0);\n\n vec3 lightings[/* shaderity: @{Config.maxLightNumberInShader} */];\n #ifdef RN_MTOON_DEBUG_LITSHADERATE\n float lightIntensities[/* shaderity: @{Config.maxLightNumberInShader} */];\n #endif\n for (int i = 0; i < /* shaderity: @{Config.maxLightNumberInShader} */; i++) {\n if (i >= lightNumber) {\n break;\n }\n\n // Light\n Light light = getLight(i, v_position_inWorld.xyz);\n\n // lightAttenuation *= distanceAttenuation * spotEffect;\n float dotNL = dot(light.direction, normal_inWorld);\n float lightIntensity = dotNL * 0.5 + 0.5; // from [-1, +1] to [0, 1]\n lightIntensity = lightIntensity * lightAttenuation; // TODO: receive shadow\n lightIntensity = lightIntensity * shadingGrade; // darker\n lightIntensity = lightIntensity * 2.0 - 1.0; // from [0, 1] to [-1, +1]\n\n // tooned. mapping from [minIntensityThreshold, maxIntensityThreshold] to [0, 1]\n float maxIntensityThreshold = mix(1.0, shadeShift, shadeToony);\n float minIntensityThreshold = shadeShift;\n lightIntensity = clamp((lightIntensity - minIntensityThreshold) / max(EPS_COL, (maxIntensityThreshold - minIntensityThreshold)), 0.0, 1.0);\n #ifdef RN_MTOON_DEBUG_LITSHADERATE\n lightIntensities[i] = lightIntensity;\n #endif\n\n // Albedo color\n vec3 col = mix(shadeColor, litColor, lightIntensity);\n\n // Direct Light\n vec3 lighting = light.attenuatedIntensity;\n lighting = mix(lighting, vec3(max(EPS_COL, max(lighting.x, max(lighting.y, lighting.z)))), lightColorAttenuation); // color atten\n\n\n if(i > 0){\n lighting *= 0.5; // darken if additional light.\n lighting *= min(0.0, dotNL) + 1.0; // darken dotNL < 0 area by using half lambert\n // lighting *= shadowAttenuation; // darken if receiving shadow\n #ifdef RN_ALPHABLEND_ON\n lighting *= step(0.0, dotNL); // darken if transparent. Because Unity's transparent material can't receive shadowAttenuation.\n #endif\n }\n\n col *= lighting;\n lightings[i] = lighting;\n\n rt0.xyz += col;\n\n lightAttenuation = 1.0;\n }\n\n\n // Indirect Light\n vec3 indirectLighting = get_ambientColor(materialSID, 0);\n indirectLighting = srgbToLinear(indirectLighting);\n indirectLighting = mix(indirectLighting, vec3(max(EPS_COL, max(indirectLighting.x, max(indirectLighting.y, indirectLighting.z)))), lightColorAttenuation); // color atten\n // TODO: use ShadeIrad in www.ppsloan.org/publications/StupidSH36.pdf\n\n rt0.xyz += indirectLighting * litColor;\n rt0.xyz = min(rt0.xyz, litColor); // comment out if you want to PBR absolutely.\n\n\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_COLOR_MIXED\n vec3 outlineColor = get_outlineColor(materialSID, 0);\n outlineColor = srgbToLinear(outlineColor);\n float outlineLightingMix = get_outlineLightingMix(materialSID, 0);\n rt0.xyz = outlineColor * mix(vec3(1.0), rt0.xyz, outlineLightingMix);\n #endif\n #else\n vec3 viewDirection = normalize(viewVector);\n\n float rimFresnelPower = get_rimFresnelPower(materialSID, 0);\n float rimLift = get_rimLift(materialSID, 0);\n vec3 rimColorFactor = get_rimColor(materialSID, 0);\n vec3 rimTextureColor = texture(u_rimTexture, v_texcoord_0).xyz;\n vec3 rimColor = srgbToLinear(rimColorFactor * rimTextureColor);\n vec3 rim = pow(clamp(1.0 - dot(normal_inWorld, viewDirection) + rimLift, 0.0, 1.0), rimFresnelPower) * rimColor;\n\n float staticRimLighting = 1.0;\n float rimLightingMix = get_rimLightingMix(materialSID, 0);\n for (int i = 0; i < /* shaderity: @{Config.maxLightNumberInShader} */; i++) {\n if (i >= lightNumber) break;\n\n if(i > 0) staticRimLighting = 0.0;\n\n vec3 rimLighting = mix(vec3(staticRimLighting), lightings[i], vec3(rimLightingMix));\n rt0.xyz += rim * rimLighting;\n }\n\n // additive matcap\n vec3 cameraUp = get_cameraUp(0.0, 0); //solo datum\n vec3 worldViewUp = normalize(cameraUp - viewDirection * dot(viewDirection, cameraUp));\n vec3 worldViewRight = normalize(cross(viewDirection, worldViewUp));\n vec2 matcapUv = vec2(dot(worldViewRight, normal_inWorld), dot(worldViewUp, normal_inWorld)) * 0.5 + 0.5;\n vec3 matCapColor = srgbToLinear(texture(u_matCapTexture, matcapUv).xyz);\n rt0.xyz += matCapColor;\n\n\n // Emission\n vec3 emissionColor = get_emissionColor(materialSID, 0);\n vec3 emission = srgbToLinear(texture(u_emissionTexture, v_texcoord_0).xyz) * emissionColor;\n rt0.xyz += emission;\n #endif\n\n\n // debug\n #ifdef RN_MTOON_DEBUG_NORMAL\n rt0 = vec4(normal_inWorld * 0.5 + 0.5, alpha);\n\n rt0.xyz = srgbToLinear(rt0.xyz);\n/* shaderity: @{renderTargetEnd} */\n\n return;\n #elif defined(RN_MTOON_DEBUG_LITSHADERATE)\n rt0 = vec4(0.0);\n for (int i = 0; i < /* shaderity: @{Config.maxLightNumberInShader} */; i++) {\n if (i >= lightNumber) break;\n rt0 += vec4(lightIntensities[i] * lightings[i], alpha);\n }\n\n rt0.xyz = srgbToLinear(rt0.xyz);\n/* shaderity: @{renderTargetEnd} */\n\n return;\n #endif\n\n\n // Wireframe\n float threshold = 0.001;\n vec3 wireframe = get_wireframe(materialSID, 0);\n float wireframeWidthInner = wireframe.z;\n float wireframeWidthRelativeScale = 1.0;\n if (wireframe.x > 0.5 && wireframe.y < 0.5) {\n rt0.a = 0.0;\n }\n vec4 wireframeResult = rt0;\n vec4 wireframeColor = vec4(0.2, 0.75, 0.0, 1.0);\n float edgeRatio = edge_ratio(v_baryCentricCoord, wireframeWidthInner, wireframeWidthRelativeScale);\n float edgeRatioModified = mix(step(threshold, edgeRatio), clamp(edgeRatio*4.0, 0.0, 1.0), wireframeWidthInner / wireframeWidthRelativeScale/4.0);\n // if r0.a is 0.0, it is wireframe not on shaded\n wireframeResult.rgb = wireframeColor.rgb * edgeRatioModified + rt0.rgb * (1.0 - edgeRatioModified);\n wireframeResult.a = max(rt0.a, wireframeColor.a * mix(edgeRatioModified, pow(edgeRatioModified, 100.0), wireframeWidthInner / wireframeWidthRelativeScale/1.0));\n\n if (wireframe.x > 0.5) {\n rt0 = wireframeResult;\n if (wireframe.y < 0.5 && rt0.a == 0.0) {\n discard;\n }\n }\n\nfloat makeOutputSrgb = float(get_makeOutputSrgb(materialSID, 0));\nrt0.rgb = mix(rt0.rgb, linearToSrgb(rt0.rgb), makeOutputSrgb);\n\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert": /*!******************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert ***! \******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\n// This shader is based on https://github.com/Santarh/MToon\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nin vec3 a_normal;\nin vec4 a_baryCentricCoord;\nin vec4 a_joint;\nin vec4 a_weight;\n\nout vec2 v_texcoord_0;\nout vec3 v_baryCentricCoord;\nout vec3 v_normal_inView;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\n\n#ifdef RN_USE_TANGENT\nin vec4 a_tangent;\nout vec3 v_tangent_inWorld;\nout vec3 v_binormal_inWorld; // bitangent_inWorld\n#endif\n\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main(){\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_NONE\n return;\n #endif\n #endif\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n bool isSkinning = false;\n isSkinning = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n\n v_normal_inView = vec3(viewMatrix * vec4(v_normal_inWorld, 0.0));\n\n #ifdef RN_MTOON_IS_OUTLINE\n #if defined(RN_MTOON_HAS_OUTLINE_WIDTH_TEXTURE)\n float outlineTex = texture(u_outlineWidthTexture, a_texcoord_0).r;\n #else\n float outlineTex = 1.0;\n #endif\n\n #if defined(RN_MTOON_OUTLINE_WIDTH_WORLD)\n float outlineWidth = get_outlineWidth(materialSID, 0);\n vec3 outlineOffset = 0.01 * outlineWidth * outlineTex * a_normal;\n vec4 worldOutlineOffset = worldMatrix * vec4(outlineOffset, 0.0);\n gl_Position = projectionMatrix * viewMatrix * (v_position_inWorld + worldOutlineOffset);\n\n #elif defined(RN_MTOON_OUTLINE_WIDTH_SCREEN)\n vec4 vertex = projectionMatrix * viewMatrix * v_position_inWorld;\n\n vec3 clipNormal = (projectionMatrix * vec4(v_normal_inView, 1.0)).xyz;\n vec2 projectedNormal = normalize(clipNormal.xy);\n float outlineScaledMaxDistance = get_outlineScaledMaxDistance(materialSID, 0);\n projectedNormal *= min(vertex.w, outlineScaledMaxDistance);\n float aspect = abs(get_aspect(0.0, 0)); //solo datum\n projectedNormal.x *= aspect;\n\n float outlineWidth = get_outlineWidth(materialSID, 0);\n vertex.xy += 0.01 * outlineWidth * outlineTex * projectedNormal * clamp(1.0 - abs(v_normal_inView.z), 0.0, 1.0); // ignore offset when normal toward camera\n\n gl_Position = vertex;\n #else\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n #endif\n #else\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n #endif\n\n #ifdef RN_USE_TANGENT\n v_tangent_inWorld = normalMatrix * a_tangent.xyz;\n v_binormal_inWorld = cross(v_normal_inWorld, v_tangent_inWorld) * a_tangent.w;\n #endif\n\n v_texcoord_0 = a_texcoord_0;\n v_baryCentricCoord = a_baryCentricCoord.xyz;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/MatCapShader/MatCapShader.frag": /*!********************************************************************!*\ !*** ./src/webgl/shaderity_shaders/MatCapShader/MatCapShader.frag ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\nin vec3 v_baryCentricCoord;\nin vec3 v_normal_inView;\n\n/* shaderity: @{renderTargetBegin} */\n\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\nfloat edge_ratio(vec3 bary3, float wireframeWidthInner, float wireframeWidthRelativeScale) {\n vec3 d = fwidth(bary3);\n vec3 x = bary3+vec3(1.0 - wireframeWidthInner)*d;\n vec3 a3 = smoothstep(vec3(0.0), d, x);\n float factor = min(min(a3.x, a3.y), a3.z);\n\n return clamp((1.0 - factor), 0.0, 1.0);\n}\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec3 normal_inView = normalize(v_normal_inView);\n normal_inView.y *= -1.0;\n vec2 normalUVCordinate = normal_inView.xy * 0.5 + 0.5;\n vec4 matCapColor = texture(u_matCapTexture, normalUVCordinate);\n rt0 = matCapColor;\n\n // Wireframe\n float threshold = 0.001;\n vec3 wireframe = get_wireframe(materialSID, 0);\n float wireframeWidthInner = wireframe.z;\n float wireframeWidthRelativeScale = 1.0;\n if (wireframe.x > 0.5 && wireframe.y < 0.5) {\n rt0.a = 0.0;\n }\n vec4 wireframeResult = rt0;\n vec4 wireframeColor = vec4(0.2, 0.75, 0.0, 1.0);\n float edgeRatio = edge_ratio(v_baryCentricCoord, wireframeWidthInner, wireframeWidthRelativeScale);\n float edgeRatioModified = mix(step(threshold, edgeRatio), clamp(edgeRatio*4.0, 0.0, 1.0), wireframeWidthInner / wireframeWidthRelativeScale/4.0);\n // if r0.a is 0.0, it is wireframe not on shaded\n wireframeResult.rgb = wireframeColor.rgb * edgeRatioModified + rt0.rgb * (1.0 - edgeRatioModified);\n wireframeResult.a = max(rt0.a, wireframeColor.a * mix(edgeRatioModified, pow(edgeRatioModified, 100.0), wireframeWidthInner / wireframeWidthRelativeScale/1.0));\n\n if (wireframe.x > 0.5) {\n rt0 = wireframeResult;\n if (wireframe.y < 0.5 && rt0.a == 0.0) {\n discard;\n }\n }\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/MatCapShader/MatCapShader.vert": /*!********************************************************************!*\ !*** ./src/webgl/shaderity_shaders/MatCapShader/MatCapShader.vert ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec3 a_baryCentricCoord;\nin vec3 a_position;\nin vec3 a_normal;\nin vec4 a_joint;\nin vec4 a_weight;\n\nout vec3 v_baryCentricCoord;\nout vec3 v_normal_inView;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n\n bool isSkinning = false;\n isSkinning = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n v_normal_inView = vec3(viewMatrix * vec4(normalMatrix * a_normal, 0.0));\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n v_baryCentricCoord = a_baryCentricCoord;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag": /*!************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag ***! \************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\n\nuniform sampler2D u_baseColorTexture; // initialValue=(0,white)\nuniform int u_cubeMapFaceId; // initialValue=0\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nvec2 dirToPanoramaUV(vec3 dir)\n{\n\treturn vec2(\n\t\t0.5f + 0.5f * atan(dir.z, dir.x) / PI,\n\t\t1.f - acos(dir.y) / PI);\n}\n\nvec3 uvToDirection(int faceId, vec2 uv)\n{\n\tif(faceId == 0)\n\t\treturn vec3(1.f, uv.y, -uv.x);\n\telse if(faceId == 1)\n\t\treturn vec3(-1.f, uv.y, uv.x);\n\telse if(faceId == 2)\n\t\treturn vec3(+uv.x, -1.f, +uv.y);\n\telse if(faceId == 3)\n\t\treturn vec3(+uv.x, 1.f, -uv.y);\n\telse if(faceId == 4)\n\t\treturn vec3(+uv.x, uv.y, 1.f);\n\telse\n return vec3(-uv.x, +uv.y, -1.f);\n}\n\n// learned a lot from https://github.com/KhronosGroup/glTF-Sample-Viewer\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n\tvec2 uv = v_texcoord_0 * 2.0 - 1.0;\n\tvec3 direction = normalize(uvToDirection(get_cubeMapFaceId(materialSID, 0), uv));\n\tvec2 panoramaUv = dirToPanoramaUV(direction);\n\trt0 = vec4(texture(u_baseColorTexture, panoramaUv).rgb, 1.0);\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert": /*!************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert ***! \************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main()\n{\n \n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n \n}\n\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag": /*!**************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\nin vec2 v_texcoord_0;\nin vec2 v_texcoord_1;\nin vec2 v_texcoord_2;\nin vec3 v_baryCentricCoord;\nin float v_instanceInfo;\nin float v_displayIdx;\n\n#ifdef RN_USE_TANGENT\n in vec3 v_tangent_inWorld;\n in vec3 v_binormal_inWorld;\n#endif\n\n#ifdef RN_USE_SHADOW_MAPPING\nin vec4 v_shadowCoord;\n#endif\n\nuniform vec4 u_baseColorFactor; // initialValue=(1,1,1,1)\nuniform sampler2D u_baseColorTexture; // initialValue=(0,white)\nuniform vec2 u_metallicRoughnessFactor; // initialValue=(1,1)\nuniform sampler2D u_metallicRoughnessTexture; // initialValue=(1,white)\nuniform sampler2D u_occlusionTexture; // initialValue=(3,white)\nuniform vec3 u_emissiveFactor; // initialValue=(0,0,0)\nuniform sampler2D u_emissiveTexture; // initialValue=(4,white)\nuniform float u_emissiveStrength; // initialValue=1\nuniform vec3 u_wireframe; // initialValue=(0,0,1)\nuniform bool u_isOutputHDR; // initialValue=0\nuniform bool u_makeOutputSrgb; // initialValue=1\nuniform vec4 u_iblParameter; // initialValue=(1,1,1,1), isInternalSetting=true\nuniform ivec2 u_hdriFormat; // initialValue=(0,0), isInternalSetting=true\nuniform samplerCube u_diffuseEnvTexture; // initialValue=(5,white), isInternalSetting=true\nuniform samplerCube u_specularEnvTexture; // initialValue=(6,white), isInternalSetting=true\nuniform vec4 u_baseColorTextureTransform; // initialValue=(1,1,0,0)\nuniform float u_baseColorTextureRotation; // initialValue=0\nuniform vec4 u_metallicRoughnessTextureTransform; // initialValue=(1,1,0,0)\nuniform float u_metallicRoughnessTextureRotation; // initialValue=0\nuniform int u_baseColorTexcoordIndex; // initialValue=0\nuniform int u_metallicRoughnessTexcoordIndex; // initialValue=0\nuniform int u_occlusionTexcoordIndex; // initialValue=0\nuniform vec4 u_occlusionTextureTransform; // initialValue=(1,1,0,0)\nuniform float u_occlusionTextureRotation; // initialValue=0\nuniform int u_emissiveTexcoordIndex; // initialValue=0\nuniform vec4 u_emissiveTextureTransform; // initialValue=(1,1,0,0)\nuniform float u_emissiveTextureRotation; // initialValue=0\nuniform float u_occlusionStrength; // initialValue=1\nuniform bool u_inverseEnvironment; // initialValue=true\nuniform float u_ior; // initialValue=1.5\n\n#ifdef RN_USE_NORMAL_TEXTURE\n uniform sampler2D u_normalTexture; // initialValue=(2,black)\n uniform vec4 u_normalTextureTransform; // initialValue=(1,1,0,0)\n uniform float u_normalTextureRotation; // initialValue=(0)\n uniform int u_normalTexcoordIndex; // initialValue=(0)\n uniform float u_normalScale; // initialValue=(1)\n#endif\n\n#ifdef RN_USE_CLEARCOAT\n uniform float u_clearCoatFactor; // initialValue=0\n uniform float u_clearCoatRoughnessFactor; // initialValue=0\n uniform vec4 u_clearCoatTextureTransform; // initialValue=(1,1,0,0)\n uniform float u_clearCoatTextureRotation; // initialValue=0\n uniform vec4 u_clearCoatRoughnessTextureTransform; // initialValue=(1,1,0,0)\n uniform float u_clearCoatRoughnessTextureRotation; // initialValue=0\n uniform vec4 u_clearCoatNormalTextureTransform; // initialValue=(1,1,0,0)\n uniform float u_clearCoatNormalTextureRotation; // initialValue=0\n uniform int u_clearCoatTexcoordIndex; // initialValue=(0)\n uniform int u_clearCoatRoughnessTexcoordIndex; // initialValue=(0)\n uniform int u_clearCoatNormalTexcoordIndex; // initialValue=(0)\n#endif\n\n#ifdef RN_USE_TRANSMISSION\n uniform float u_transmissionFactor; // initialValue=(0)\n#endif\n\n#ifdef RN_USE_VOLUME\n uniform float u_thicknessFactor; // initialValue=(0)\n uniform float u_attenuationDistance; // initialValue=(0.000001)\n uniform vec3 u_attenuationColor; // initialValue=(1,1,1)\n#endif\n\n#ifdef RN_USE_SHEEN\n uniform vec3 u_sheenColorFactor; // initialValue=(0,0,0)\n uniform float u_sheenRoughnessFactor; // initialValue=(0)\n#endif\n\n#ifdef RN_USE_SPECULAR\n uniform float u_specularFactor; // initialValue=1.0\n uniform vec3 u_specularColorFactor; // initialValue=(1,1,1)\n#endif\n\n#ifdef RN_USE_IRIDESCENCE\n uniform float u_iridescenceFactor; // initialValue=0\n uniform float u_iridescenceIor; // initialValue=1.3\n uniform float u_iridescenceThicknessMinimum; // initialValue=100\n uniform float u_iridescenceThicknessMaximum; // initialValue=400\n#endif\n\n#ifdef RN_USE_ANISOTROPY\n uniform float u_anisotropyStrength; // initialValue=0\n uniform vec2 u_anisotropyRotation; // initialValue=(1,0)\n#endif\n\nuniform float u_alphaCutoff; // initialValue=(0.01)\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nstruct Light {\n int type; // 0 = directional, 1 = point, 2 = spot\n vec3 position;\n vec3 intensity;\n vec3 attenuatedIntensity;\n vec3 directionOfLightObject;\n vec3 direction; // direction of light vector, equal to normalize(light.pointToLight)\n vec3 pointToLight; // not normalized\n float spotAngleScale;\n float spotAngleOffset;\n float effectiveRange;\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfloat getRangeAttenuation(Light light)\n{\n float distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfloat getSpotAttenuation(Light light)\n{\n\n float cd = dot(light.directionOfLightObject, light.direction);\n float angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nvoid getLightAttenuated(Light light) {\n light.attenuatedIntensity = light.intensity;\n // if (light.type == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.type == 1)\n {\n light.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.type == 2)\n {\n light.attenuatedIntensity *= getSpotAttenuation(light);\n }\n}\n\nLight getLight(int lightIdx, vec3 v_position_inWorld) {\n vec3 lightPosition = get_lightPosition(0.0, lightIdx);\n vec3 direction_and_w_of_LightObject = get_lightDirection(0.0, lightIdx);\n vec3 lightIntensity = get_lightIntensity(0.0, lightIdx);\n vec4 lightProperty = get_lightProperty(0.0, lightIdx);\n Light light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n float lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3(0.0);\n light.type = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.type = 1;\n } else { // is Directional Light\n light.type = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.type = 2;\n }\n\n const float M_PI = 3.141592653589793;\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n getLightAttenuated(light);\n\n return light;\n}\n\nconst float M_PI = 3.141592653589793;\nconst float RECIPROCAL_PI = 0.3183098861837907;\nconst float c_MinRoughness = 0.04;\n\nfloat angular_n_h(float NH) {\n return acos(NH);\n}\n\nfloat d_phong(float NH, float c1) {\n return pow(\n cos(acos(NH))\n , c1\n );\n}\n\n// this is from https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 envBRDFApprox( float Roughness, float NoV ) {\n const vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022 );\n const vec4 c1 = vec4(1, 0.0425, 1.04, -0.04 );\n vec4 r = Roughness * c0 + c1;\n float a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y;\n vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\n return AB;\n}\n\n// GGX NDF\nfloat d_GGX(float NH, float alphaRoughness) {\n float roughnessSqr = alphaRoughness * alphaRoughness;\n float f = (roughnessSqr - 1.0) * NH * NH + 1.0;\n return roughnessSqr / (M_PI * f * f);\n}\n\nfloat d_torrance_reiz(float NH, float c3) {\n float CosSquared = NH*NH;\n float TanSquared = (1.0 - CosSquared)/CosSquared;\n //return (1.0/M_PI) * sq(c3/(CosSquared * (c3*c3 + TanSquared))); // gamma = 2, aka GGX\n return (1.0/sqrt(M_PI)) * (sq(c3)/(CosSquared * (c3*c3 + TanSquared))); // gamma = 1, D_Berry\n}\n\nfloat d_beckmann(float NH, float m) {\n float co = 1.0 / (4.0 * m * m * NH * NH * NH * NH);\n float expx = exp((NH * NH - 1.0) / (m * m * NH * NH));\n return co * expx;\n}\n\n// the same as glTF WebGL sample\n// https://github.com/KhronosGroup/glTF-WebGL-PBR/blob/88eda8c5358efe03128b72b6c5f5f6e5b6d023e1/shaders/pbr-frag.glsl#L188\n// That is, Unreal Engine based approach, but modified to use alphaRoughness (squared artist's roughness parameter),\n// and based on 'Separable Masking and Shadowing' approximation (propesed by Christophe Schlick)\n// https://www.cs.virginia.edu/~jdl/bib/appearance/analytic%20models/schlick94b.pdf\nfloat g_shielding(float NL, float NV, float alphaRoughness) {\n float r = alphaRoughness;\n\n // Local Shadowing using \"Schlick-Smith\" Masking Function\n float localShadowing = 2.0 * NL / (NL + sqrt(r * r + (1.0 - r * r) * (NL * NL)));\n\n // Local Masking using \"Schlick-Smith\" Masking Function\n float localMasking = 2.0 * NV / (NV + sqrt(r * r + (1.0 - r * r) * (NV * NV)));\n\n return localShadowing * localMasking;\n}\n\n// The code from https://google.github.io/filament/Filament.html#listing_approximatedspecularv\n// The idea is from [Heitz14] Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs.\nfloat v_GGXCorrelated(float NL, float NV, float alphaRoughness) {\n float a2 = alphaRoughness * alphaRoughness;\n float GGXV = NL * sqrt(NV * NV * (1.0 - a2) + a2);\n float GGXL = NV * sqrt(NL * NL * (1.0 - a2) + a2);\n return 0.5 / (GGXV + GGXL);\n}\n\nfloat v_GGXCorrelatedFast(float NL, float NV, float alphaRoughness) {\n float a = alphaRoughness;\n float GGXV = NL * (NV * (1.0 - a) + a);\n float GGXL = NV * (NL * (1.0 - a) + a);\n return 0.5 / (GGXV + GGXL);\n}\n\n// The Schlick Approximation to Fresnel\nfloat fresnel(float f0, float f90, float VdotH) {\n float x = clamp(1.0 - VdotH, 0.0, 1.0);\n float x2 = x * x;\n float x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nvec3 fresnel(vec3 f0, vec3 f90, float VdotH) {\n float x = clamp(1.0 - VdotH, 0.0, 1.0);\n float x2 = x * x;\n float x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nvec3 fresnel(vec3 f0, float f90, float VdotH)\n{\n float x = clamp(1.0 - VdotH, 0.0, 1.0);\n float x2 = x * x;\n float x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nfloat fresnel(float f0, float VdotH)\n{\n float f90 = 1.0; //clamp(50.0 * f0, 0.0, 1.0);\n return fresnel(f0, f90, VdotH);\n}\nvec3 fresnel(vec3 f0, float VdotH)\n{\n float f90 = 1.0; //clamp(50.0 * f0, 0.0, 1.0);\n return fresnel(f0, f90, VdotH);\n}\n\nvec3 cook_torrance_specular_brdf(float NH, float NL, float NV, vec3 F, float alphaRoughness, float specularWeight) {\n float D = d_GGX(NH, alphaRoughness);\n float V = v_GGXCorrelated(NL, NV, alphaRoughness);\n return vec3(D) * vec3(V) * F * specularWeight;\n// float G = g_shielding(NL, NV, alphaRoughness);\n// return vec3(D)*vec3(G)*F/vec3(4.0*NL*NV);\n\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#diffuse-brdf\nvec3 BRDF_lambertian(vec3 albedo, vec3 F, float specularWeight)\n{\n // (1/pi) * diffuseAlbedo\n return (vec3(1.0) - specularWeight * F) * albedo * RECIPROCAL_PI;\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#specular-brdf\nfloat specular_brdf(float alphaRoughness, float NdotL, float NdotV, float NdotH) {\n float V = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n float D = d_GGX(NdotH, alphaRoughness);\n return V * D;\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#implementation-notes\nfloat specular_btdf(float alphaRoughness, float NdotL, float NdotV, float NdotHt) {\n float V = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n float D = d_GGX(NdotHt, alphaRoughness);\n return V * D;\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#fresnel\nvec3 conductor_fresnel(vec3 f0, float brdf, float alphaRoughness, float VdotH) {\n return vec3(brdf) * (f0.rgb + (vec3(1.0) - f0.rgb) * vec3(pow(1.0 - abs(VdotH), 5.0)));\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#fresnel\nvec3 fresnel_mix(float ior, vec3 base, vec3 layer, float VdotH) {\n float f0 = pow((1.0 - ior)/(1.0 + ior), 2.0);\n float fr = f0 + (1.0 - f0) * pow(1.0 - abs(VdotH), 5.0);\n return mix(base, layer, fr);\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#metal-brdf-and-dielectric-brdf\nvec3 metal_brdf(float perceptualRoughness, vec3 baseColor, float NdotL, float NdotV, float NdotH, float VdotH) {\n float alphaRoughness = perceptualRoughness * perceptualRoughness;\n return conductor_fresnel(\n baseColor,\n specular_brdf(alphaRoughness, NdotL, NdotV, NdotH),\n alphaRoughness,\n VdotH\n );\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#metal-brdf-and-dielectric-brdf\n// vec3 dielectric_brdf(float ior, vec3 baseColor, float perceptualRoughness, float NdotL, float NdotV, float NdotH, float VdotH) {\n// vec3 base = BRDF_lambertian(baseColor);\n// float alphaRoughness = perceptualRoughness * perceptualRoughness;\n// vec3 layer = vec3(specular_brdf(alphaRoughness, NdotL, NdotV, NdotH));\n// return fresnel_mix(ior, base, layer, VdotH);\n// }\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat#layering\nvec3 coated_material_s(vec3 base, float perceptualRoughness, float clearcoatRoughness, float clearcoat, float VdotNc, float LdotNc, float NdotHc) {\n float clearcoatFresnel = 0.04 + (1.0 - 0.04) * pow(1.0 - abs(VdotNc), 5.0);\n float clearcoatAlpha = clearcoatRoughness * clearcoatRoughness;\n float alphaRoughness = perceptualRoughness * perceptualRoughness;\n float D = d_GGX(NdotHc, clearcoatAlpha);\n float V = v_GGXCorrelated(LdotNc, VdotNc, clearcoatAlpha);\n float f_clearcoat = clearcoatFresnel * D * V;\n\n // base = (f_diffuse + f_specular) in https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat#layering\n return base * vec3(1.0 - clearcoat * clearcoatFresnel) + vec3(f_clearcoat * clearcoat);\n}\nvec3 srgbToLinear(vec3 srgbColor) {\n return pow(srgbColor, vec3(2.2));\n}\n\nfloat srgbToLinear(float value) {\n return pow(value, 2.2);\n}\n\nvec3 linearToSrgb(vec3 linearColor) {\n return pow(linearColor, vec3(1.0/2.2));\n}\n\nfloat linearToSrgb(float value) {\n return pow(value, 1.0/2.2);\n}\n\n// Roughness Dependent Fresnel\n// https://www.jcgt.org/published/0008/01/03/paper.pdf\nvec3 fresnelSchlickRoughness(vec3 F0, float cosTheta, float roughness)\n{\n vec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\n vec3 k_S = F0 + Fr * pow(1.0 - cosTheta, 5.0);\n return k_S;\n}\n\n// From: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/e2c7b8c8bd12916c1a387cd41f9ef061edc718df/source/Renderer/shaders/brdf.glsl#L44-L66\nvec3 Schlick_to_F0(vec3 f, vec3 f90, float VdotH) {\n float x = clamp(1.0 - VdotH, 0.0, 1.0);\n float x2 = x * x;\n float x5 = clamp(x * x2 * x2, 0.0, 0.9999);\n\n return (f - f90 * x5) / (1.0 - x5);\n}\n\nfloat Schlick_to_F0(float f, float f90, float VdotH) {\n float x = clamp(1.0 - VdotH, 0.0, 1.0);\n float x2 = x * x;\n float x5 = clamp(x * x2 * x2, 0.0, 0.9999);\n\n return (f - f90 * x5) / (1.0 - x5);\n}\n\nvec3 Schlick_to_F0(vec3 f, float VdotH) {\n return Schlick_to_F0(f, vec3(1.0), VdotH);\n}\n\nfloat Schlick_to_F0(float f, float VdotH) {\n return Schlick_to_F0(f, 1.0, VdotH);\n}\n\nvec3 normalBlendingUDN(sampler2D baseMap, sampler2D detailMap, vec2 baseUv, vec2 detailUv) {\n vec3 t = texture(baseMap, baseUv).xyz * 2.0 - 1.0;\n vec3 u = texture(detailMap, detailUv).xyz * 2.0 - 1.0;\n vec3 r = normalize(vec3(t.xy + u.xy, t.z));\n return r;\n}\n\nvec2 uvTransform(vec2 scale, vec2 offset, float rotation, vec2 uv) {\n mat3 translationMat = mat3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n mat3 rotationMat = mat3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n mat3 scaleMat = mat3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n mat3 matrix = translationMat * rotationMat * scaleMat;\n vec2 uvTransformed = ( matrix * vec3(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\nfloat IsotropicNDFFiltering(vec3 normal, float roughness2) {\n float SIGMA2 = 0.15915494;\n float KAPPA = 0.18;\n vec3 dndu = dFdx(normal);\n vec3 dndv = dFdy(normal);\n float kernelRoughness2 = SIGMA2 * (dot(dndu, dndu) + dot(dndv, dndv));\n float clampedKernelRoughness2 = min(kernelRoughness2, KAPPA);\n float filteredRoughness2 = saturate(roughness2 + clampedKernelRoughness2);\n return filteredRoughness2;\n}\n\n\n////////////////////////////////////////\n// glTF KHR_materials_volume\n////////////////////////////////////////\n\n#ifdef RN_USE_VOLUME\n// https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md#attenuation\nvec3 volumeAttenuation(vec3 attenuationColor, float attenuationDistance, vec3 intensity, float transmissionDistance)\n{\n if (attenuationDistance == 0.0) { // means Infinite distance\n return intensity; // No attenuation\n } else {\n vec3 attenuationCo = -log(attenuationColor) / attenuationDistance;\n vec3 attenuatedTransmittance = exp(-attenuationCo * transmissionDistance);\n return intensity * attenuatedTransmittance;\n }\n}\n#endif\n\n\n\n\n\n\n////////////////////////////////////////\n// glTF KHR_materials_anisotropy\n////////////////////////////////////////\n#ifdef RN_USE_ANISOTROPY\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\nfloat D_GGX_anisotropic(float NdotH, float TdotH, float BdotH, float at, float ab)\n{\n float a2 = at * ab;\n vec3 f = vec3(ab * TdotH, at * BdotH, a2 * NdotH);\n float w2 = a2 / dot(f, f);\n return a2 * w2 * w2 / M_PI;\n}\n\nfloat V_GGX_anisotropic(float NdotL, float NdotV, float BdotV, float TdotV, float TdotL, float BdotL,\n float at, float ab)\n{\n float GGXV = NdotL * length(vec3(at * TdotV, ab * BdotV, NdotV));\n float GGXL = NdotV * length(vec3(at * TdotL, ab * BdotL, NdotL));\n float v = 0.5 / (GGXV + GGXL);\n return clamp(v, 0.0, 1.0);\n}\n\nvec3 BRDF_specularAnisotropicGGX(vec3 F, float alphaRoughness,\n float VdotH, float NdotL, float NdotV, float NdotH, float BdotV, float TdotV,\n float TdotL, float BdotL, float TdotH, float BdotH, float anisotropy)\n{\n float at = mix(alphaRoughness, 1.0, anisotropy * anisotropy);\n float ab = alphaRoughness;\n\n float V = V_GGX_anisotropic(NdotL, NdotV, BdotV, TdotV, TdotL, BdotL, at, ab);\n float D = D_GGX_anisotropic(NdotH, TdotH, BdotH, at, ab);\n\n return F * V * D;\n}\n#endif\n\n\n\n////////////////////////////////////////\n// glTF KHR_materials_sheen\n////////////////////////////////////////\n\n#ifdef RN_USE_SHEEN\nfloat d_Charlie(float sheenPerceptualRoughness, float NoH) {\n // Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n float alphaG = sheenPerceptualRoughness * sheenPerceptualRoughness;\n float invAlpha = 1.0 / alphaG;\n float cos2h = NoH * NoH;\n float sin2h = 1.0 - cos2h;\n return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen#sheen-visibility\nfloat sheenSimpleVisibility(float NdotL, float NdotV) {\n return 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV));\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen#sheen-visibility\nfloat charlieL(float x, float alphaG) {\n float oneMinusAlphaSq = (1.0 - alphaG) * (1.0 - alphaG);\n float a = mix(21.5473, 25.3245, oneMinusAlphaSq);\n float b = mix(3.82987, 3.32435, oneMinusAlphaSq);\n float c = mix(0.19823, 0.16801, oneMinusAlphaSq);\n float d = mix(-1.97760, -1.27393, oneMinusAlphaSq);\n float e = mix(-4.32054, -4.85967, oneMinusAlphaSq);\n return a / (1.0 + b * pow(x, c)) + d * x + e;\n}\n\nfloat lambdaSheen(float cosTheta, float alphaG)\n{\n return abs(cosTheta) < 0.5 ? exp(charlieL(cosTheta, alphaG)) : exp(2.0 * charlieL(0.5, alphaG) - charlieL(1.0 - cosTheta, alphaG));\n}\n\nfloat sheenCharlieVisibility(float NdotL, float NdotV, float sheenPerceptualRoughness) {\n float alphaG = sheenPerceptualRoughness * sheenPerceptualRoughness;\n float sheenVisibility = 1.0 / ((1.0 + lambdaSheen(NdotV, alphaG) + lambdaSheen(NdotL, alphaG)) * (4.0 * NdotV * NdotL));\n return sheenVisibility;\n}\n\nvec3 sheen_brdf(vec3 sheenColor, float sheenPerceptualRoughness, float NdotL, float NdotV, float NdotH) {\n float sheenDistribution = d_Charlie(sheenPerceptualRoughness, NdotH);\n float sheenVisibility = sheenCharlieVisibility(NdotL, NdotV, sheenPerceptualRoughness);\n return sheenColor * sheenDistribution * sheenVisibility;\n}\n#endif\n\n\n\n\n\n\n\n\n\n////////////////////////////////////////\n// glTF KHR_materials_irirdescence\n////////////////////////////////////////\n\n#ifdef RN_USE_IRIDESCENCE\n// XYZ to REC709(sRGB) conversion matrix\nconst mat3 XYZ_TO_REC709 = mat3(\n 3.2404542, -0.9692660, 0.0556434,\n -1.5371385, 1.8760108, -0.2040259,\n -0.4985314, 0.0415560, 1.0572252\n);\n\nvec3 fresnelSchlickRoughnessWithIridescence(\n vec3 F0, float cosTheta, float roughness,\n vec3 iridescenceFresnel, float iridescence\n )\n{\n vec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\n vec3 k_S = mix(F0 + Fr * pow(1.0 - cosTheta, 5.0), iridescenceFresnel, iridescence);\n return k_S;\n}\n\n// Assume air interface for top\nvec3 Fresnel0ToIor(vec3 F0) {\n vec3 sqrtF0 = sqrt(F0);\n return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0);\n}\n\n// Conversion from IOR to F0\n// ior is a value between 1.0 and 3.0. 1.0 is air interface\nvec3 IorToFresnel0(vec3 transmittedIor, float incidentIor) {\n return sq((transmittedIor - vec3(incidentIor)) / (transmittedIor + vec3(incidentIor)));\n}\nfloat IorToFresnel0(float transmittedIor, float incidentIor) {\n return sq((transmittedIor - incidentIor) / (transmittedIor + incidentIor));\n}\n\n/**\n * From: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence#analytic-spectral-integration\n */\nvec3 evalSensitivity(float OPD, vec3 shift) {\n float phase = 2.0 * M_PI * OPD * 1.0e-9;\n vec3 val = vec3(5.4856e-13, 4.4201e-13, 5.2481e-13);\n vec3 pos = vec3(1.6810e+06, 1.7953e+06, 2.2084e+06);\n vec3 var = vec3(4.3278e+09, 9.3046e+09, 6.6121e+09);\n\n vec3 xyz = val * sqrt(2.0 * M_PI * var) * cos(pos * phase + shift) * exp(-(phase * phase) * var);\n xyz.x += 9.7470e-14 * sqrt(2.0 * M_PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * (phase * phase));\n xyz /= 1.0685e-7;\n\n vec3 rgb = XYZ_TO_REC709 * xyz;\n return rgb;\n}\n\n/**\n * From: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence#iridescence-fresnel\n */\nvec3 calcIridescence(float outsideIor, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0) {\n\n\n // iridescenceIor is the index of refraction of the thin-film layer\n // Force iridescenceIor -> outsideIOR when thinFilmThickness -> 0.0\n float iridescenceIor = mix(outsideIor, eta2, smoothstep(0.0, 0.03, thinFilmThickness));\n\n // To calculate the reflectances R12 and R23 at the viewing angles (angle hitting the thin-film layer)\n // and (angle after refraction in the thin-film) Schlick Fresnel is again used.\n // This approximation allows to eliminate the split into S and P polarization for the exact Fresnel equations.\n // can be calculated using Snell's law (with being outsideIor and being iridescenceIor):\n float sinTheta2Sq = sq(outsideIor / iridescenceIor) * (1.0 - sq(cosTheta1));\n float cosTheta2Sq = 1.0 - sinTheta2Sq;\n\n // Handle total internal reflection\n if (cosTheta2Sq < 0.0) {\n return vec3(1.0);\n }\n\n float cosTheta2 = sqrt(cosTheta2Sq);\n\n /// Material Interfaces\n // The iridescence model defined by Belcour/Barla models two material interfaces\n // - one from the outside to the thin-film layer\n // and another one from the thin-film to the base material. These two interfaces are defined as follows:\n\n // First interface (from the outside to the thin-film layer)\n float R0 = IorToFresnel0(iridescenceIor, outsideIor);\n float R12 = fresnel(R0, cosTheta1);\n float R21 = R12;\n float T121 = 1.0 - R12;\n\n // Second interface (from the thin-film to the base material)\n vec3 baseIor = Fresnel0ToIor(baseF0 + 0.0001); // guard against 1.0\n vec3 R1 = IorToFresnel0(baseIor, iridescenceIor);\n vec3 R23 = fresnel(R1, cosTheta2);\n\n // phi12 and phi23 define the base phases per interface and are approximated with 0.0\n // if the IOR of the hit material (iridescenceIor or baseIor) is higher\n // than the IOR of the previous material (outsideIor or iridescenceIor) and π otherwise.\n // Also here, polarization is ignored. float phi12 = 0.0;\n\n // First interface (from the outside to the thin-film layer)\n float phi12 = 0.0;\n if (iridescenceIor < outsideIor) phi12 = M_PI;\n float phi21 = M_PI - phi12;\n\n // Second interface (from the thin-film to the base material)\n vec3 phi23 = vec3(0.0);\n if (baseIor[0] < iridescenceIor) phi23[0] = M_PI;\n if (baseIor[1] < iridescenceIor) phi23[1] = M_PI;\n if (baseIor[2] < iridescenceIor) phi23[2] = M_PI;\n\n // OPD (optical path difference)\n float OPD = 2.0 * iridescenceIor * thinFilmThickness * cosTheta2;\n // Phase shift\n vec3 phi = vec3(phi21) + phi23;\n\n // Compound terms\n vec3 R123 = clamp(R12 * R23, 1e-5, 0.9999);\n vec3 r123 = sqrt(R123);\n vec3 Rs = (T121 * T121) * R23 / (vec3(1.0) - R123);\n\n // Reflectance term for m = 0 (DC term amplitude)\n vec3 C0 = R12 + Rs;\n vec3 I = C0;\n\n // Reflectance term for m > 0 (pairs of diracs)\n vec3 Cm = Rs - T121;\n for (int m = 1; m <= 2; ++m)\n {\n Cm *= r123;\n vec3 Sm = 2.0 * evalSensitivity(float(m) * OPD, float(m) * phi);\n I += Cm * Sm;\n }\n\n vec3 F_iridescence = max(I, vec3(0.0));\n\n return F_iridescence;\n}\n\n//https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB\nvec3 BRDF_lambertianIridescence(vec3 f0, vec3 f90, vec3 iridescenceFresnel, float iridescenceFactor, vec3 diffuseColor, float specularWeight, float VdotH)\n{\n vec3 iridescenceFresnelMax = vec3(max(max(iridescenceFresnel.r, iridescenceFresnel.g), iridescenceFresnel.b));\n vec3 schlickFresnel = Schlick_to_F0(f0, f90, VdotH);\n vec3 F = mix(schlickFresnel, iridescenceFresnelMax, iridescenceFactor);\n\n // see https://seblagarde.wordpress.com/2012/01/08/pi-or-not-to-pi-in-game-lighting-equation/\n return (1.0 - specularWeight * F) * (diffuseColor / M_PI);\n}\n\nvec3 BRDF_specularGGXIridescence(vec3 f0, vec3 f90, vec3 iridescenceFresnel, float alphaRoughness, float iridescenceFactor, float specularWeight, float VdotH, float NdotL, float NdotV, float NdotH)\n{\n vec3 F = mix(Schlick_to_F0(f0, f90, VdotH), iridescenceFresnel, iridescenceFactor);\n float Vis = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n float D = d_GGX(NdotH, alphaRoughness);\n\n return specularWeight * F * Vis * D;\n}\n\n#endif // RN_USE_IRIDESCENCE\n\n\n\n\n\n////////////////////////////////////////\n// lighting with a punctual light\n////////////////////////////////////////\nvec3 lightingWithPunctualLight(\n Light light,\n vec3 normal_inWorld,\n vec3 viewDirection,\n float NdotV,\n vec3 albedo,\n float perceptualRoughness,\n float metallic,\n vec3 F0,\n vec3 F90,\n float ior,\n float transmission,\n float clearcoat,\n float clearcoatRoughness,\n vec3 clearcoatNormal_inWorld,\n float VdotNc,\n vec3 attenuationColor,\n float attenuationDistance,\n float anisotropy,\n vec3 anisotropicT,\n vec3 anisotropicB,\n float BdotV,\n float TdotV,\n vec3 sheenColor,\n float sheenRoughness,\n float albedoSheenScalingNdotV,\n float iridescenceFactor,\n vec3 iridescenceFresnel,\n float specularWeight\n )\n{\n float alphaRoughness = perceptualRoughness * perceptualRoughness;\n\n // Fresnel\n vec3 halfVector = normalize(light.direction + viewDirection);\n float VdotH = dot(viewDirection, halfVector);\n vec3 F = fresnel(F0, F90, VdotH);\n\n float NdotL = saturateEpsilonToOne(dot(normal_inWorld, light.direction));\n\n // Diffuse\n#ifdef RN_USE_IRIDESCENCE\n vec3 diffuseBrdf = BRDF_lambertianIridescence(F0, F90, iridescenceFresnel, iridescenceFactor, albedo, specularWeight, VdotH);\n#else\n vec3 diffuseBrdf = BRDF_lambertian(albedo, F, specularWeight);\n#endif\n\n vec3 pureDiffuse = diffuseBrdf * vec3(NdotL) * light.attenuatedIntensity;\n\n#ifdef RN_USE_TRANSMISSION\n vec3 refractionVector = refract(-viewDirection, normal_inWorld, 1.0 / ior);\n Light transmittedLightFromUnderSurface = light;\n transmittedLightFromUnderSurface.pointToLight -= refractionVector;\n vec3 transmittedLightDirectionFromUnderSurface = normalize(transmittedLightFromUnderSurface.pointToLight);\n transmittedLightFromUnderSurface.direction = transmittedLightDirectionFromUnderSurface;\n\n vec3 Ht = normalize(viewDirection + transmittedLightFromUnderSurface.direction);\n float NdotHt = saturateEpsilonToOne(dot(normal_inWorld, Ht));\n float NdotLt = saturateEpsilonToOne(dot(normal_inWorld, transmittedLightFromUnderSurface.direction));\n\n vec3 transmittedContrib = (vec3(1.0) - F) * specular_btdf(alphaRoughness, NdotLt, NdotV, NdotHt) * albedo * transmittedLightFromUnderSurface.attenuatedIntensity;\n\n#ifdef RN_USE_VOLUME\n transmittedContrib = volumeAttenuation(attenuationColor, attenuationDistance, transmittedContrib, length(transmittedLightFromUnderSurface.pointToLight));\n#endif // RN_USE_VOLUME\n\n vec3 diffuseContrib = mix(pureDiffuse, vec3(transmittedContrib), transmission);\n#else\n vec3 diffuseContrib = pureDiffuse;\n#endif // RN_USE_TRANSMISSION\n\n // Specular\n float NdotH = saturateEpsilonToOne(dot(normal_inWorld, halfVector));\n\n#ifdef RN_USE_IRIDESCENCE\n vec3 specularContrib = BRDF_specularGGXIridescence(F0, F90, iridescenceFresnel, alphaRoughness, iridescenceFactor, specularWeight, VdotH, NdotL, NdotV, NdotH) * vec3(NdotL) * light.attenuatedIntensity;\n#elif defined(RN_USE_ANISOTROPY)\n float TdotL = dot(anisotropicT, light.direction);\n float BdotL = dot(anisotropicB, light.direction);\n float TdotH = dot(anisotropicT, halfVector);\n float BdotH = dot(anisotropicB, halfVector);\n vec3 specularContrib = BRDF_specularAnisotropicGGX(F, alphaRoughness, VdotH, NdotL, NdotV, NdotH, BdotV, TdotV, TdotL, BdotL, TdotH, BdotH, anisotropy) * vec3(NdotL) * light.attenuatedIntensity;\n#else\n vec3 specularContrib = cook_torrance_specular_brdf(NdotH, NdotL, NdotV, F, alphaRoughness, specularWeight) * vec3(NdotL) * light.attenuatedIntensity;\n#endif // RN_USE_ANISOTROPY\n\n // Base Layer\n vec3 baseLayer = diffuseContrib + specularContrib;\n\n#ifdef RN_USE_SHEEN\n // Sheen\n vec3 sheenContrib = sheen_brdf(sheenColor, sheenRoughness, NdotL, NdotV, NdotH) * NdotL * light.attenuatedIntensity;\n float albedoSheenScaling = min(\n albedoSheenScalingNdotV,\n 1.0 - max3(sheenColor) * texture(u_sheenLutTexture, vec2(NdotL, sheenRoughness)).r);\n vec3 color = sheenContrib + baseLayer * albedoSheenScaling;\n#else\n vec3 color = baseLayer;\n float albedoSheenScaling = 1.0;\n#endif // RN_USE_SHEEN\n\n#ifdef RN_USE_CLEARCOAT\n // Clear Coat Layer\n float NdotHc = saturateEpsilonToOne(dot(clearcoatNormal_inWorld, halfVector));\n float LdotNc = saturateEpsilonToOne(dot(light.direction, clearcoatNormal_inWorld));\n vec3 coated = coated_material_s(color, perceptualRoughness,\n clearcoatRoughness, clearcoat, VdotNc, LdotNc, NdotHc);\n vec3 finalColor = coated;\n#else\n vec3 finalColor = color;\n#endif // RN_USE_CLEARCOAT\n\n return finalColor;\n}\n\n\n/* shaderity: @{matricesGetters} */\n\n#ifdef RN_USE_SHADOW_MAPPING\n\nconst float g_minVariance = 0.00001;\n\nfloat chebyshevUpperBound(vec2 moments, float t) {\n float p = (t <= moments.x) ? 1.0 : 0.0;\n\n float variance = moments.y - sq(moments.x);\n variance = max(variance, g_minVariance);\n\n float d = t - moments.x;\n float p_max = variance / (variance + sq(d));\n\n return max(p, p_max);\n}\n\nfloat varianceShadowContribution(vec2 lightTexCoord, float distanceToLight) {\n vec2 moments = texture(u_depthTexture, lightTexCoord).xy;\n\n return chebyshevUpperBound(moments, distanceToLight);\n}\n\n#endif\n\n\nvec3 get_irradiance(vec3 normal_forEnv, float materialSID, ivec2 hdriFormat) {\n vec4 diffuseTexel = texture(u_diffuseEnvTexture, normal_forEnv);\n\n vec3 irradiance;\n if (hdriFormat.x == 0) {\n // LDR_SRGB\n irradiance = srgbToLinear(diffuseTexel.rgb);\n }\n else if (hdriFormat.x == 3) {\n // RGBE\n irradiance = diffuseTexel.rgb * pow(2.0, diffuseTexel.a*255.0-128.0);\n }\n else {\n irradiance = diffuseTexel.rgb;\n }\n\n return irradiance;\n}\n\nfloat scaleForLod(float perceptualRoughness, float ior)\n{\n // Scale roughness to the range [0, 1],\n // ior=1.0 will be scale 0,\n // ior=1.5 will be scale 1.0,\n // ior=2 will be scale 1.0 (clamped)\n //\n\n float scale = clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n return perceptualRoughness * scale;\n}\n\n#ifdef RN_USE_TRANSMISSION\nvec3 get_sample_from_backbuffer(float materialSID, vec2 sampleCoord, float perceptualRoughness, float ior) {\n ivec2 vrState = get_vrState(0.0, 0);\n vec2 backBufferTextureSize = vec2(textureSize(u_backBufferTexture, 0));\n float backBufferTextureLength = max(backBufferTextureSize.x, backBufferTextureSize.y);\n\n#ifdef WEBGL2_MULTI_VIEW\n // For VR\n backBufferTextureLength = max(backBufferTextureSize.x / 2.0, backBufferTextureSize.y);\n sampleCoord.x = sampleCoord.x * 0.5;\n if (v_displayIdx == 1.0) { // For right eye\n sampleCoord.x += 0.5;\n }\n#else\n if (vrState.x == 1) { // For VR\n backBufferTextureLength = max(backBufferTextureSize.x / 2.0, backBufferTextureSize.y);\n sampleCoord.x = sampleCoord.x * 0.5;\n if (vrState.y == 1) { // For right eye\n sampleCoord.x += 0.5;\n }\n }\n#endif\n\n float framebufferLod = log2(backBufferTextureLength) * scaleForLod(perceptualRoughness, ior);\n\n #ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n vec3 transmittedLight = texture2DLodEXT(u_backBufferTexture, sampleCoord, framebufferLod).rgb;\n #elif defined(GLSL_ES3)\n vec3 transmittedLight = textureLod(u_backBufferTexture, sampleCoord, framebufferLod).rgb;\n #else\n vec3 transmittedLight = texture(u_backBufferTexture, sampleCoord).rgb;\n #endif\n\n return transmittedLight;\n}\n#endif\n\nvec3 get_radiance(vec3 reflection, float lod, ivec2 hdriFormat) {\n #ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n vec4 specularTexel = textureCubeLodEXT(u_specularEnvTexture, reflection, lod);\n #elif defined(GLSL_ES3)\n vec4 specularTexel = textureLod(u_specularEnvTexture, reflection, lod);\n #else\n vec4 specularTexel = texture(u_specularEnvTexture, reflection);\n #endif\n\n// #pragma shaderity: require(./../common/fetchCubeTexture.glsl)\n\n vec3 radiance;\n if (hdriFormat.y == 0) {\n // LDR_SRGB\n radiance = srgbToLinear(specularTexel.rgb);\n }\n else if (hdriFormat.y == 3) {\n // RGBE\n radiance = specularTexel.rgb * pow(2.0, specularTexel.a*255.0-128.0);\n }\n else {\n radiance = specularTexel.rgb;\n }\n\n return radiance;\n}\n\n// from glTF Sample Viewer: https://github.com/KhronosGroup/glTF-Sample-Viewer\nvec3 getVolumeTransmissionRay(vec3 n, vec3 v, float thickness, float ior)\n{\n vec3 refractionVector = refract(-v, normalize(n), 1.0 / ior);\n mat4 worldMatrix = get_worldMatrix(v_instanceInfo);\n\n vec3 modelScale;\n modelScale.x = length(vec3(worldMatrix[0].xyz));\n modelScale.y = length(vec3(worldMatrix[1].xyz));\n modelScale.z = length(vec3(worldMatrix[2].xyz));\n\n return normalize(refractionVector) * thickness * modelScale;\n}\n\nstruct IblResult\n{\n vec3 specular;\n vec3 diffuse;\n vec3 FssEss;\n};\n\n#ifdef RN_USE_IRIDESCENCE\nIblResult getIBLRadianceGGXWithIridescence(float materialSID, float NdotV, vec3 viewDirection, vec3 albedo, vec3 F0,\n float perceptualRoughness, vec4 iblParameter, ivec2 hdriFormat, mat3 rotEnvMatrix,\n vec3 normal_forEnv, vec3 reflection, vec3 iridescenceFresnel, float iridescence, float specularWeight)\n{\n // get radiance\n float mipCount = iblParameter.x;\n float lod = (perceptualRoughness * (mipCount - 1.0));\n vec3 radiance = get_radiance(reflection, lod, hdriFormat);\n\n // Roughness dependent fresnel\n vec3 kS = fresnelSchlickRoughnessWithIridescence(F0, NdotV, perceptualRoughness, iridescenceFresnel, iridescence);\n vec2 f_ab = envBRDFApprox(perceptualRoughness, NdotV);\n vec3 FssEss = kS * f_ab.x + f_ab.y;\n IblResult result;\n result.FssEss = FssEss;\n\n // Specular IBL\n vec3 specular = FssEss * radiance * specularWeight;\n\n // scale with user parameters\n float IBLSpecularContribution = iblParameter.z;\n specular *= IBLSpecularContribution;\n\n result.specular = specular;\n\n return result;\n}\n\nIblResult getIBLRadianceLambertianWithIridescence(float materialSID, float NdotV, vec3 viewDirection, vec3 albedo, vec3 F0,\n float perceptualRoughness, vec4 iblParameter, ivec2 hdriFormat, mat3 rotEnvMatrix,\n vec3 normal_forEnv, vec3 reflection, vec3 iridescenceF0, float iridescence, float specularWeight)\n{\n // get irradiance\n vec3 irradiance = get_irradiance(normal_forEnv, materialSID, hdriFormat);\n\n // Use the maximum component of the iridescence Fresnel color\n // Maximum is used instead of the RGB value to not get inverse colors for the diffuse BRDF\n vec3 iridescenceF0Max = vec3(max(max(iridescenceF0.r, iridescenceF0.g), iridescenceF0.b));\n\n // Blend between base F0 and iridescence F0\n vec3 mixedF0 = mix(F0, iridescenceF0Max, iridescence);\n\n // Roughness dependent fresnel\n vec3 kS = fresnelSchlickRoughness(mixedF0, NdotV, perceptualRoughness);\n vec2 f_ab = envBRDFApprox(perceptualRoughness, NdotV);\n vec3 FssEss = specularWeight * kS * f_ab.x + f_ab.y;\n IblResult result;\n result.FssEss = FssEss;\n\n // Multiple scattering, Fdez-Aguera's approach\n float Ems = (1.0 - (f_ab.x + f_ab.y));\n vec3 F_avg = specularWeight * (mixedF0 + (1.0 - mixedF0) / 21.0);\n vec3 FmsEms = Ems * FssEss * F_avg / (1.0 - F_avg * Ems);\n vec3 k_D = albedo * (1.0 - FssEss - FmsEms);\n\n // Diffuse IBL\n vec3 diffuse = (FmsEms + k_D) * irradiance;\n\n // scale with user parameters\n float IBLDiffuseContribution = iblParameter.y;\n diffuse *= IBLDiffuseContribution;\n\n result.diffuse = diffuse;\n\n return result;\n}\n#endif // RN_USE_IRIDESCENCE\n\nIblResult getIBLRadianceLambertian(float materialSID, float NdotV, vec3 viewDirection, vec3 albedo, vec3 F0,\n float perceptualRoughness, vec4 iblParameter, ivec2 hdriFormat, mat3 rotEnvMatrix,\n vec3 normal_forEnv, vec3 reflection, float specularWeight)\n{\n // get irradiance\n vec3 irradiance = get_irradiance(normal_forEnv, materialSID, hdriFormat);\n\n // Roughness dependent fresnel\n vec3 kS = fresnelSchlickRoughness(F0, NdotV, perceptualRoughness);\n vec2 f_ab = envBRDFApprox(perceptualRoughness, NdotV);\n vec3 FssEss = specularWeight * kS * f_ab.x + f_ab.y;\n IblResult result;\n result.FssEss = FssEss;\n\n // Multiple scattering, Fdez-Aguera's approach\n float Ems = (1.0 - (f_ab.x + f_ab.y));\n vec3 F_avg = specularWeight * (F0 + (1.0 - F0) / 21.0);\n vec3 FmsEms = Ems * FssEss * F_avg / (1.0 - F_avg * Ems);\n vec3 k_D = albedo * (1.0 - FssEss - FmsEms);\n\n // Diffuse IBL\n vec3 diffuse = (FmsEms + k_D) * irradiance;\n\n // scale with user parameters\n float IBLDiffuseContribution = iblParameter.y;\n diffuse *= IBLDiffuseContribution;\n\n result.diffuse = diffuse;\n\n return result;\n}\n\nIblResult getIBLRadianceGGX(float materialSID, float NdotV, vec3 viewDirection, vec3 albedo, vec3 F0,\n float perceptualRoughness, vec4 iblParameter, ivec2 hdriFormat, mat3 rotEnvMatrix,\n vec3 normal_forEnv, vec3 reflection, float specularWeight)\n{\n // get radiance\n float mipCount = iblParameter.x;\n float lod = (perceptualRoughness * (mipCount - 1.0));\n vec3 radiance = get_radiance(reflection, lod, hdriFormat);\n\n // Roughness dependent fresnel\n vec3 kS = fresnelSchlickRoughness(F0, NdotV, perceptualRoughness);\n vec2 f_ab = envBRDFApprox(perceptualRoughness, NdotV);\n vec3 FssEss = kS * f_ab.x + f_ab.y;\n IblResult result;\n result.FssEss = FssEss;\n\n // Specular IBL\n vec3 specular = FssEss * radiance * specularWeight;\n\n // scale with user parameters\n float IBLSpecularContribution = iblParameter.z;\n specular *= IBLSpecularContribution;\n\n result.specular = specular;\n\n return result;\n}\n\n#ifdef RN_USE_SHEEN\nvec3 sheenIBL(float NdotV, float sheenPerceptualRoughness, vec3 sheenColor, vec4 iblParameter, vec3 reflection, ivec2 hdriFormat)\n{\n float mipCount = iblParameter.x;\n float lod = (sheenPerceptualRoughness * (mipCount - 1.0));\n\n vec2 sheenLutUV = vec2(NdotV, sheenPerceptualRoughness);\n float brdf = texture(u_sheenLutTexture, sheenLutUV).b;\n vec3 sheenLight = get_radiance(reflection, lod, hdriFormat);\n float IBLSpecularContribution = iblParameter.z;\n sheenLight *= IBLSpecularContribution;\n\n return sheenLight * sheenColor * brdf;\n}\n#endif\n\nvec3 getNormalForEnv(mat3 rotEnvMatrix, vec3 normal_inWorld, float materialSID) {\n vec3 normal_forEnv = rotEnvMatrix * normal_inWorld;\n if (get_inverseEnvironment(materialSID, 0)) {\n normal_forEnv.x *= -1.0;\n }\n return normal_forEnv;\n}\n\nvec3 getReflection(mat3 rotEnvMatrix, vec3 viewDirection, vec3 normal_inWorld, float materialSID, float perceptualRoughness, float anisotropy, vec3 anisotropyDirection) {\n#ifdef RN_USE_ANISOTROPY\n\n float tangentRoughness = mix(perceptualRoughness, 1.0, anisotropy * anisotropy);\n vec3 anisotropicTangent = cross(anisotropyDirection, viewDirection);\n vec3 anisotropicNormal = cross(anisotropicTangent, anisotropyDirection);\n float bendFactor = 1.0 - anisotropy * (1.0 - perceptualRoughness);\n float bendFactorPow4 = bendFactor * bendFactor * bendFactor * bendFactor;\n vec3 bentNormal = normalize(mix(anisotropicNormal, normal_inWorld, bendFactorPow4));\n vec3 reflection = rotEnvMatrix * reflect(-viewDirection, bentNormal);\n#else\n vec3 reflection = rotEnvMatrix * reflect(-viewDirection, normal_inWorld);\n#endif\n if (get_inverseEnvironment(materialSID, 0)) {\n reflection.x *= -1.0;\n }\n return reflection;\n}\n\nvec3 IBLContribution(float materialSID, vec3 normal_inWorld, float NdotV, vec3 viewDirection,\n vec3 albedo, vec3 F0, float perceptualRoughness, float clearcoatRoughness, vec3 clearcoatNormal_inWorld,\n float clearcoat, float VdotNc, vec3 geomNormal_inWorld, float cameraSID, float transmission, vec3 v_position_inWorld,\n float thickness, vec3 sheenColor, float sheenRoughness, float albedoSheenScalingNdotV, float ior,\n vec3 iridescenceFresnel, vec3 iridescenceF0, float iridescence, float anisotropy, vec3 anisotropyDirection,\n float specularWeight)\n{\n vec4 iblParameter = get_iblParameter(materialSID, 0);\n float rot = iblParameter.w + 3.1415;\n mat3 rotEnvMatrix = mat3(cos(rot), 0.0, -sin(rot), 0.0, 1.0, 0.0, sin(rot), 0.0, cos(rot));\n ivec2 hdriFormat = get_hdriFormat(materialSID, 0);\n\n vec3 normal_forEnv = getNormalForEnv(rotEnvMatrix, normal_inWorld, materialSID);\n vec3 reflection = getReflection(rotEnvMatrix, viewDirection, normal_inWorld, materialSID, perceptualRoughness, anisotropy, anisotropyDirection);\n\n // IBL\n #ifdef RN_USE_IRIDESCENCE\n IblResult baseRadianceResult = getIBLRadianceGGXWithIridescence(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, iridescenceFresnel, iridescence, specularWeight);\n IblResult baseLambertianResult = getIBLRadianceLambertianWithIridescence(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, iridescenceF0, iridescence, specularWeight);\n #else\n IblResult baseRadianceResult = getIBLRadianceGGX(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, specularWeight);\n IblResult baseLambertianResult = getIBLRadianceLambertian(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, specularWeight);\n #endif\n\n#ifdef RN_USE_TRANSMISSION\n vec3 refractedRay = getVolumeTransmissionRay(geomNormal_inWorld, viewDirection, thickness, ior);\n vec3 refractedRayFromVPosition = v_position_inWorld + refractedRay;\n vec4 ndcPoint = get_projectionMatrix(cameraSID, 0) * get_viewMatrix(cameraSID, 0) * vec4(refractedRayFromVPosition, 1.0);\n vec2 refractionCoords = ndcPoint.xy / ndcPoint.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n vec3 transmittedLight = get_sample_from_backbuffer(materialSID, refractionCoords, perceptualRoughness, ior);\n\n#ifdef RN_USE_VOLUME\n vec3 attenuationColor = get_attenuationColor(materialSID, 0);\n float attenuationDistance = get_attenuationDistance(materialSID, 0);\n transmittedLight = volumeAttenuation(attenuationColor, attenuationDistance, transmittedLight, length(refractedRay));\n#endif\n\n vec3 transmissionComp = (vec3(1.0) - baseRadianceResult.FssEss) * transmittedLight * albedo;\n vec3 diffuse = mix(baseLambertianResult.diffuse, transmissionComp, transmission);\n vec3 base = diffuse + baseRadianceResult.specular;\n#else\n vec3 base = baseLambertianResult.diffuse + baseRadianceResult.specular;\n#endif\n\n#ifdef RN_USE_SHEEN\n vec3 sheen = sheenIBL(NdotV, sheenRoughness, sheenColor, iblParameter, reflection, hdriFormat);\n vec3 color = sheen + base * albedoSheenScalingNdotV;\n#else\n vec3 color = base;\n#endif\n\n#ifdef RN_USE_CLEARCOAT\n float VdotNg = dot(geomNormal_inWorld, viewDirection);\n vec3 clearcoatNormal_forEnv = getNormalForEnv(rotEnvMatrix, normal_inWorld, materialSID);\n IblResult coatResult = getIBLRadianceGGX(materialSID, VdotNc, viewDirection, vec3(0.0), F0,\n clearcoatRoughness, iblParameter, hdriFormat, rotEnvMatrix, clearcoatNormal_forEnv, reflection, specularWeight);\n vec3 coatLayer = coatResult.specular;\n\n float clearcoatFresnel = 0.04 + (1.0 - 0.04) * pow(1.0 - abs(VdotNc), 5.0);\n vec3 coated = color * vec3(1.0 - clearcoat * clearcoatFresnel) + vec3(coatLayer * clearcoat);\n return coated;\n#else\n return color;\n#endif\n\n}\n\n\nfloat edge_ratio(vec3 bary3, float wireframeWidthInner, float wireframeWidthRelativeScale) {\n vec3 d = fwidth(bary3);\n vec3 x = bary3+vec3(1.0 - wireframeWidthInner)*d;\n vec3 a3 = smoothstep(vec3(0.0), d, x);\n float factor = min(min(a3.x, a3.y), a3.z);\n\n return clamp((1.0 - factor), 0.0, 1.0);\n}\n\nvec2 getTexcoord(int texcoordIndex) {\n vec2 texcoord;\n if(texcoordIndex == 2){\n texcoord = v_texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = v_texcoord_1;\n }else{\n texcoord = v_texcoord_0;\n }\n return texcoord;\n}\n\n#ifdef RN_USE_TANGENT\n mat3 getTBN(vec3 normal_inWorld, vec3 viewVector, vec2 texcoord) {\n vec3 tangent_inWorld = normalize(v_tangent_inWorld);\n vec3 binormal_inWorld = normalize(v_binormal_inWorld);\n mat3 tbnMat_tangent_to_world = mat3(tangent_inWorld, binormal_inWorld, normal_inWorld);\n\n return tbnMat_tangent_to_world;\n }\n#else\n // This is based on http://www.thetenthplanet.de/archives/1180\n mat3 cotangent_frame(vec3 normal_inWorld, vec3 position, vec2 uv) {\n uv = gl_FrontFacing ? uv : -uv;\n\n // get edge vectors of the pixel triangle\n vec3 dp1 = dFdx(position);\n vec3 dp2 = dFdy(position);\n vec2 duv1 = dFdx(uv);\n vec2 duv2 = dFdy(uv);\n\n // solve the linear system\n vec3 dp2perp = cross(dp2, normal_inWorld);\n vec3 dp1perp = cross(normal_inWorld, dp1);\n vec3 tangent = dp2perp * duv1.x + dp1perp * duv2.x;\n vec3 bitangent = dp2perp * duv1.y + dp1perp * duv2.y;\n bitangent *= -1.0;\n\n // construct a scale-invariant frame\n float invMat = inversesqrt(max(dot(tangent, tangent), dot(bitangent, bitangent)));\n return mat3(tangent * invMat, bitangent * invMat, normal_inWorld);\n }\n\n mat3 getTBN(vec3 normal_inWorld, vec3 viewVector, vec2 texcoord) {\n mat3 tbnMat_tangent_to_world = cotangent_frame(normal_inWorld, -viewVector, texcoord);\n\n return tbnMat_tangent_to_world;\n }\n#endif\n\n\nvoid main ()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n // View direction\n vec3 viewPosition = get_viewPosition(cameraSID, 0);\n vec3 viewVector = viewPosition - v_position_inWorld.xyz;\n vec3 viewDirection = normalize(viewVector);\n\n // BaseColor\n vec3 baseColor = vec3(0.0, 0.0, 0.0);\n float alpha = 1.0;\n vec4 baseColorFactor = get_baseColorFactor(materialSID, 0);\n if (v_color != baseColor && baseColorFactor.rgb != baseColor) {\n baseColor = v_color * baseColorFactor.rgb;\n alpha = baseColorFactor.a;\n } else if (v_color == baseColor) {\n baseColor = baseColorFactor.rgb;\n alpha = baseColorFactor.a;\n } else if (baseColorFactor.rgb == baseColor) {\n baseColor = v_color;\n } else {\n baseColor = vec3(1.0, 1.0, 1.0);\n }\n vec4 baseColorTextureTransform = get_baseColorTextureTransform(materialSID, 0);\n float baseColorTextureRotation = get_baseColorTextureRotation(materialSID, 0);\n int baseColorTexcoordIndex = get_baseColorTexcoordIndex(materialSID, 0);\n vec2 baseColorTexcoord = getTexcoord(baseColorTexcoordIndex);\n vec2 baseColorTexUv = uvTransform(baseColorTextureTransform.xy, baseColorTextureTransform.zw, baseColorTextureRotation, baseColorTexcoord);\n vec4 textureColor = texture(u_baseColorTexture, baseColorTexUv);\n baseColor *= srgbToLinear(textureColor.rgb);\n alpha *= textureColor.a;\n\n#ifdef RN_IS_ALPHA_MODE_MASK\n float alphaCutoff = get_alphaCutoff(materialSID, 0);\n if (alpha < alphaCutoff) {\n discard;\n }\n#endif\n\n\n // Normal\n vec3 normal_inWorld = normalize(v_normal_inWorld);\n vec3 geomNormal_inWorld = normal_inWorld;\n vec4 normalTextureTransform = get_normalTextureTransform(materialSID, 0);\n float normalTextureRotation = get_normalTextureRotation(materialSID, 0);\n int normalTexcoordIndex = get_normalTexcoordIndex(materialSID, 0);\n vec2 normalTexcoord = getTexcoord(normalTexcoordIndex);\n vec2 normalTexUv = uvTransform(normalTextureTransform.xy, normalTextureTransform.zw, normalTextureRotation, normalTexcoord);\n mat3 TBN = getTBN(normal_inWorld, viewVector, normalTexUv);\n #ifdef RN_USE_NORMAL_TEXTURE\n vec3 normalTexValue = texture(u_normalTexture, normalTexUv).xyz;\n if(normalTexValue.b >= 128.0 / 255.0) {\n // normal texture is existence\n vec3 normalTex = normalTexValue * 2.0 - 1.0;\n float normalScale = get_normalScale(materialSID, 0);\n vec3 scaledNormal = normalize(normalTex * vec3(normalScale, normalScale, 1.0));\n normal_inWorld = normalize(TBN * scaledNormal);\n }\n #endif\n\n#ifdef RN_IS_LIGHTING\n // Metallic & Roughness\n vec2 metallicRoughnessFactor = get_metallicRoughnessFactor(materialSID, 0);\n float metallic = metallicRoughnessFactor.x;\n vec4 metallicRoughnessTextureTransform = get_metallicRoughnessTextureTransform(materialSID, 0);\n float metallicRoughnessTextureRotation = get_metallicRoughnessTextureRotation(materialSID, 0);\n int metallicRoughnessTexcoordIndex = get_metallicRoughnessTexcoordIndex(materialSID, 0);\n vec2 metallicRoughnessTexcoord = getTexcoord(metallicRoughnessTexcoordIndex);\n vec2 metallicRoughnessTexUv = uvTransform(metallicRoughnessTextureTransform.xy, metallicRoughnessTextureTransform.zw, metallicRoughnessTextureRotation, metallicRoughnessTexcoord);\n vec4 ormTexel = texture(u_metallicRoughnessTexture, metallicRoughnessTexUv);\n float perceptualRoughness = ormTexel.g * metallicRoughnessFactor.y;\n metallic = ormTexel.b * metallic;\n metallic = clamp(metallic, 0.0, 1.0);\n perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0);\n float alphaRoughness = perceptualRoughness * perceptualRoughness;\n // filter NDF for specular AA --- https://jcgt.org/published/0010/02/02/\n float alphaRoughness2 = alphaRoughness * alphaRoughness;\n float filteredRoughness2 = IsotropicNDFFiltering(normal_inWorld, alphaRoughness2);\n perceptualRoughness = sqrt(sqrt(filteredRoughness2));\n\n // Albedo\n vec3 black = vec3(0.0);\n vec3 albedo = mix(baseColor.rgb, black, metallic);\n\n // NdotV\n float NdotV = saturateEpsilonToOne(dot(normal_inWorld, viewDirection));\n\n #ifdef RN_USE_ANISOTROPY\n float anisotropy = get_anisotropyStrength(materialSID, 0);\n vec2 anisotropyRotation = get_anisotropyRotation(materialSID, 0);\n vec2 direction = anisotropyRotation;\n vec3 anisotropyTex = texture(u_anisotropyTexture, baseColorTexUv).rgb;\n direction = anisotropyTex.rg * 2.0 - vec2(1.0);\n direction = mat2(anisotropyRotation.x, anisotropyRotation.y, -anisotropyRotation.y, anisotropyRotation.x) * normalize(direction);\n anisotropy *= anisotropyTex.b;\n vec3 anisotropicT = normalize(TBN * vec3(direction, 0.0));\n vec3 anisotropicB = normalize(cross(geomNormal_inWorld, anisotropicT));\n float BdotV = dot(anisotropicB, viewDirection);\n float TdotV = dot(anisotropicT, viewDirection);\n #else\n float anisotropy = 0.0;\n vec3 anisotropicT = vec3(0.0, 0.0, 0.0);\n vec3 anisotropicB = vec3(0.0, 0.0, 0.0);\n float BdotV = 0.0;\n float TdotV = 0.0;\n #endif\n\n // Clearcoat\n #ifdef RN_USE_CLEARCOAT\n float clearcoatFactor = get_clearCoatFactor(materialSID, 0);\n vec4 clearcoatTextureTransform = get_clearCoatTextureTransform(materialSID, 0);\n float clearcoatTextureRotation = get_clearCoatTextureRotation(materialSID, 0);\n int clearCoatTexcoordIndex = get_clearCoatTexcoordIndex(materialSID, 0);\n vec2 clearCoatTexcoord = getTexcoord(clearCoatTexcoordIndex);\n vec2 clearcoatTexUv = uvTransform(clearcoatTextureTransform.xy, clearcoatTextureTransform.zw, clearcoatTextureRotation, clearCoatTexcoord);\n float clearcoatTexture = texture(u_clearCoatTexture, clearcoatTexUv).r;\n float clearcoat = clearcoatFactor * clearcoatTexture;\n #else\n float clearcoat = 0.0;\n #endif // RN_USE_CLEARCOAT\n\n // Transmission\n #ifdef RN_USE_TRANSMISSION\n float transmissionFactor = get_transmissionFactor(materialSID, 0);\n float transmissionTexture = texture(u_transmissionTexture, baseColorTexUv).r;\n float transmission = transmissionFactor * transmissionTexture;\n // alpha *= transmission;\n #else\n float transmission = 0.0;\n #endif // RN_USE_TRANSMISSION\n\n #ifdef RN_USE_SPECULAR\n float specularTexture = texture(u_specularTexture, baseColorTexUv).a;\n float specular = get_specularFactor(materialSID, 0) * specularTexture;\n vec3 specularColorTexture = srgbToLinear(texture(u_specularColorTexture, baseColorTexUv).rgb);\n vec3 specularColor = get_specularColorFactor(materialSID, 0) * specularColorTexture;\n #else\n float specular = 1.0;\n vec3 specularColor = vec3(1.0, 1.0, 1.0);\n #endif // RN_USE_SPECULAR\n\n // F0, F90\n float ior = get_ior(materialSID, 0);\n float outsideIor = 1.0;\n vec3 dielectricSpecularF0 = min(\n ((ior - outsideIor) / (ior + outsideIor)) * ((ior - outsideIor) / (ior + outsideIor)) * specularColor,\n vec3(1.0)\n ) * specular;\n vec3 dielectricSpecularF90 = vec3(specular);\n vec3 F0 = mix(dielectricSpecularF0, baseColor.rgb, metallic);\n vec3 F90 = mix(dielectricSpecularF90, vec3(1.0), metallic);\n\n // Iridescence\n #ifdef RN_USE_IRIDESCENCE\n float iridescenceFactor = get_iridescenceFactor(materialSID, 0);\n float iridescenceTexture = texture(u_iridescenceTexture, baseColorTexUv).r;\n float iridescence = iridescenceFactor * iridescenceTexture;\n float iridescenceIor = get_iridescenceIor(materialSID, 0);\n float thicknessRatio = texture(u_iridescenceThicknessTexture, baseColorTexUv).r;\n float iridescenceThicknessMinimum = get_iridescenceThicknessMinimum(materialSID, 0);\n float iridescenceThicknessMaximum = get_iridescenceThicknessMaximum(materialSID, 0);\n float iridescenceThickness = mix(iridescenceThicknessMinimum, iridescenceThicknessMaximum, thicknessRatio);\n vec3 iridescenceFresnel = calcIridescence(1.0, iridescenceIor, NdotV, iridescenceThickness, F0);\n vec3 iridescenceF0 = Schlick_to_F0(iridescenceFresnel, NdotV);\n #else\n float iridescence = 0.0;\n vec3 iridescenceFresnel = vec3(0.0);\n vec3 iridescenceF0 = F0;\n #endif // RN_USE_IRIDESCENCE\n\n #ifdef RN_USE_CLEARCOAT\n // Clearcoat\n float clearcoatRoughnessFactor = get_clearCoatRoughnessFactor(materialSID, 0);\n int clearCoatRoughnessTexcoordIndex = get_clearCoatRoughnessTexcoordIndex(materialSID, 0);\n vec2 clearCoatRoughnessTexcoord = getTexcoord(clearCoatRoughnessTexcoordIndex);\n vec4 clearcoatRoughnessTextureTransform = get_clearCoatRoughnessTextureTransform(materialSID, 0);\n float clearcoatRoughnessTextureRotation = get_clearCoatRoughnessTextureRotation(materialSID, 0);\n vec2 clearcoatRoughnessTexUv = uvTransform(clearcoatRoughnessTextureTransform.xy, clearcoatRoughnessTextureTransform.zw, clearcoatRoughnessTextureRotation, clearCoatRoughnessTexcoord);\n float textureRoughnessTexture = texture(u_clearCoatRoughnessTexture, clearcoatRoughnessTexUv).g;\n float clearcoatRoughness = clearcoatRoughnessFactor * textureRoughnessTexture;\n\n int clearCoatNormalTexcoordIndex = get_clearCoatNormalTexcoordIndex(materialSID, 0);\n vec2 clearCoatNormalTexcoord = getTexcoord(clearCoatNormalTexcoordIndex);\n vec4 clearcoatNormalTextureTransform = get_clearCoatNormalTextureTransform(materialSID, 0);\n float clearcoatNormalTextureRotation = get_clearCoatNormalTextureRotation(materialSID, 0);\n vec2 clearcoatNormalTexUv = uvTransform(clearcoatNormalTextureTransform.xy, clearcoatNormalTextureTransform.zw, clearcoatNormalTextureRotation, clearCoatNormalTexcoord);\n vec3 textureNormal_tangent = texture(u_clearCoatNormalTexture, clearcoatNormalTexUv).xyz * vec3(2.0) - vec3(1.0);\n vec3 clearcoatNormal_inWorld = normalize(TBN * textureNormal_tangent);\n float VdotNc = saturateEpsilonToOne(dot(viewDirection, clearcoatNormal_inWorld));\n #else\n float clearcoatRoughness = 0.0;\n vec3 clearcoatNormal_inWorld = vec3(0.0);\n float VdotNc = 0.0;\n #endif // RN_USE_CLEARCOAT\n\n #ifdef RN_USE_VOLUME\n // Volume\n float thicknessFactor = get_thicknessFactor(materialSID, 0);\n float thicknessTexture = texture(u_thicknessTexture, baseColorTexUv).g;\n float attenuationDistance = get_attenuationDistance(materialSID, 0);\n vec3 attenuationColor = get_attenuationColor(materialSID, 0);\n float thickness = thicknessFactor * thicknessTexture;\n #else\n float thickness = 0.0;\n vec3 attenuationColor = vec3(0.0);\n float attenuationDistance = 0.000001;\n #endif // RN_USE_VOLUME\n\n #ifdef RN_USE_SHEEN\n // Sheen\n vec3 sheenColorFactor = get_sheenColorFactor(materialSID, 0);\n vec3 sheenColorTexture = texture(u_sheenColorTexture, baseColorTexUv).rgb;\n float sheenRoughnessFactor = get_sheenRoughnessFactor(materialSID, 0);\n float sheenRoughnessTexture = texture(u_sheenRoughnessTexture, baseColorTexUv).a;\n vec3 sheenColor = sheenColorFactor * sheenColorTexture;\n float sheenRoughness = clamp(sheenRoughnessFactor * sheenRoughnessTexture, 0.000001, 1.0);\n float albedoSheenScalingNdotV = 1.0 - max3(sheenColor) * texture(u_sheenLutTexture, vec2(NdotV, sheenRoughness)).r;\n #else\n vec3 sheenColor = vec3(0.0);\n float sheenRoughness = 0.000001;\n float albedoSheenScalingNdotV = 1.0;\n #endif // RN_USE_SHEEN\n\n rt0 = vec4(0.0, 0.0, 0.0, alpha);\n\n // Lighting\n for (int i = 0; i < lightNumber; i++) {\n Light light = getLight(i, v_position_inWorld.xyz);\n rt0.xyz += lightingWithPunctualLight(light, normal_inWorld, viewDirection, NdotV, albedo,\n perceptualRoughness, metallic, F0, F90, ior, transmission,\n clearcoat, clearcoatRoughness, clearcoatNormal_inWorld, VdotNc,\n attenuationColor, attenuationDistance,\n anisotropy, anisotropicT, anisotropicB, BdotV, TdotV,\n sheenColor, sheenRoughness, albedoSheenScalingNdotV,\n iridescence, iridescenceFresnel, specular);\n }\n\n #ifdef RN_USE_SHADOW_MAPPING\n float bias = 0.001;\n vec2 shadowCoord = v_shadowCoord.xy / v_shadowCoord.w;\n float shadowContribusion = 1.0;\n if (shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0) {\n shadowContribusion = varianceShadowContribution(shadowCoord, (v_shadowCoord.z - bias)/v_shadowCoord.w);\n }\n // rt0.rgb = rt0.rgb * (0.5 + shadowContribusion * 0.5);\n rt0.rgb = rt0.rgb * shadowContribusion;\n #endif\n\n vec3 ibl = IBLContribution(materialSID, normal_inWorld, NdotV, viewDirection,\n albedo, F0, perceptualRoughness, clearcoatRoughness, clearcoatNormal_inWorld,\n clearcoat, VdotNc, geomNormal_inWorld, cameraSID, transmission, v_position_inWorld.xyz, thickness,\n sheenColor, sheenRoughness, albedoSheenScalingNdotV,\n ior, iridescenceFresnel, iridescenceF0, iridescence,\n anisotropy, anisotropicB, specular);\n\n int occlusionTexcoordIndex = get_occlusionTexcoordIndex(materialSID, 0);\n vec2 occlusionTexcoord = getTexcoord(occlusionTexcoordIndex);\n vec4 occlusionTextureTransform = get_occlusionTextureTransform(materialSID, 0);\n float occlusionTextureRotation = get_occlusionTextureRotation(materialSID, 0);\n vec2 occlusionTexUv = uvTransform(occlusionTextureTransform.xy, occlusionTextureTransform.zw, occlusionTextureRotation, occlusionTexcoord);\n float occlusion = texture(u_occlusionTexture, occlusionTexUv).r;\n float occlusionStrength = get_occlusionStrength(materialSID, 0);\n\n // Occlution to Indirect Lights\n rt0.xyz += mix(ibl, ibl * occlusion, occlusionStrength);\n#else\n rt0 = vec4(baseColor, alpha);\n#endif // RN_IS_LIGHTING\n\n // Emissive\n vec3 emissiveFactor = get_emissiveFactor(materialSID, 0);\n int emissiveTexcoordIndex = get_emissiveTexcoordIndex(materialSID, 0);\n vec2 emissiveTexcoord = getTexcoord(emissiveTexcoordIndex);\n vec4 emissiveTextureTransform = get_emissiveTextureTransform(materialSID, 0);\n float emissiveTextureRotation = get_emissiveTextureRotation(materialSID, 0);\n vec2 emissiveTexUv = uvTransform(emissiveTextureTransform.xy, emissiveTextureTransform.zw, emissiveTextureRotation, emissiveTexcoord);\n float emissiveStrength = get_emissiveStrength(materialSID, 0);\n vec3 emissive = emissiveFactor * srgbToLinear(texture(u_emissiveTexture, emissiveTexUv).xyz) * emissiveStrength;\n\n#ifdef RN_USE_CLEARCOAT\n vec3 coated_emissive = emissive * mix(vec3(1.0), vec3(0.04 + (1.0 - 0.04) * pow(1.0 - NdotV, 5.0)), clearcoat);\n rt0.xyz += coated_emissive;\n#else\n rt0.xyz += emissive;\n#endif // RN_USE_CLEARCOAT\n\n bool isOutputHDR = get_isOutputHDR(materialSID, 0);\n if(isOutputHDR){\n/* shaderity: @{renderTargetEnd} */\n\n return;\n }\n\n // Wireframe\n float threshold = 0.001;\n vec3 wireframe = get_wireframe(materialSID, 0);\n float wireframeWidthInner = wireframe.z;\n float wireframeWidthRelativeScale = 1.0;\n if (wireframe.x > 0.5 && wireframe.y < 0.5) {\n rt0.a = 0.0;\n }\n vec4 wireframeResult = rt0;\n vec4 wireframeColor = vec4(0.2, 0.75, 0.0, 1.0);\n float edgeRatio = edge_ratio(v_baryCentricCoord, wireframeWidthInner, wireframeWidthRelativeScale);\n float edgeRatioModified = mix(step(threshold, edgeRatio), clamp(edgeRatio*4.0, 0.0, 1.0), wireframeWidthInner / wireframeWidthRelativeScale/4.0);\n // if r0.a is 0.0, it is wireframe not on shaded\n wireframeResult.rgb = wireframeColor.rgb * edgeRatioModified + rt0.rgb * (1.0 - edgeRatioModified);\n wireframeResult.a = max(rt0.a, wireframeColor.a * mix(edgeRatioModified, pow(edgeRatioModified, 100.0), wireframeWidthInner / wireframeWidthRelativeScale/1.0));\n\n if (wireframe.x > 0.5) {\n rt0 = wireframeResult;\n if (wireframe.y < 0.5 && rt0.a == 0.0) {\n discard;\n }\n }\n\n\n#ifdef RN_IS_ALPHA_MODE_BLEND\n#else\n rt0.a = 1.0;\n#endif\n\nfloat makeOutputSrgb = float(get_makeOutputSrgb(materialSID, 0));\nrt0.rgb = mix(rt0.rgb, linearToSrgb(rt0.rgb), makeOutputSrgb);\n\nrt0.rgb = rt0.rgb * rt0.a; // alpha premultiplied\nrt1 = rt0;\nrt2 = rt0;\nrt3 = rt0;\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert": /*!**************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\n#ifdef WEBGL2_MULTI_VIEW\n layout(num_views=2) in;\n#endif\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec2 a_texcoord_1;\nin vec2 a_texcoord_2;\nin vec4 a_joint;\nin vec4 a_weight;\nin vec4 a_baryCentricCoord;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\nout vec2 v_texcoord_0;\nout vec2 v_texcoord_1;\nout vec2 v_texcoord_2;\nout vec3 v_baryCentricCoord;\nout float v_instanceInfo;\nout float v_displayIdx;\n#ifdef RN_USE_TANGENT\n in vec4 a_tangent;\n out vec3 v_tangent_inWorld;\n out vec3 v_binormal_inWorld;\n#endif\n#ifdef RN_USE_SHADOW_MAPPING\n out vec4 v_shadowCoord;\n#endif\n\nuniform float u_pointSize; // initialValue=30, soloDatum=true\nuniform vec3 u_pointDistanceAttenuation; // initialValue=(0.0, 0.1, 0.01), soloDatum=true\n\n// BiasMatrix * LightProjectionMatrix * LightViewMatrix, See: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/#basic-shader\nuniform mat4 u_depthBiasPV; // initialValue=(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n bool isBillboard = get_isBillboard(a_instanceInfo.x);\n\n v_color = a_color;\n\n bool isSkinning = false;\n\n isSkinning = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n isBillboard,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n v_texcoord_0 = a_texcoord_0;\n v_texcoord_1 = a_texcoord_1;\n v_texcoord_2 = a_texcoord_2;\n\n #ifdef RN_USE_TANGENT\n v_tangent_inWorld = normalMatrix * a_tangent.xyz;\n v_binormal_inWorld = cross(v_tangent_inWorld, v_normal_inWorld) * a_tangent.w;\n #endif\n v_baryCentricCoord = a_baryCentricCoord.xyz;\n\n v_instanceInfo = a_instanceInfo.x;\n\n#ifdef WEBGL2_MULTI_VIEW\n v_displayIdx = float(gl_ViewID_OVR);\n#endif\n\n bool visibility = get_isVisible(a_instanceInfo.x);\n if (!visibility)\n {\n gl_Position = vec4(0.0);\n }\n\n#ifdef RN_USE_SHADOW_MAPPING\n v_shadowCoord = get_depthBiasPV(materialSID, 0) * v_position_inWorld;\n#endif\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag": /*!********************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\n\nuniform samplerCube u_baseColorTexture; // initialValue=(0,white)\nuniform int u_cubeMapFaceId; // initialValue=0\nuniform int u_distributionType; // initialValue=0\nuniform float u_roughness; // initialValue=0.0\nuniform int u_sampleCount; // initialValue=1024\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nconst int cLambertian = 0;\nconst int cGGX = 1;\n\n// http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html\nfloat radicalInverse_VdC(uint bits)\n{\n bits = (bits << 16u) | (bits >> 16u);\n bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n return float(bits) * 2.3283064365386963e-10; // / 0x100000000\n}\n\nvec2 hammersley2d(int i, int N) {\n return vec2(float(i)/float(N), radicalInverse_VdC(uint(i)));\n}\n\nmat3 createTBN(vec3 normal)\n{\n vec3 bitangent = vec3(0.0, 1.0, 0.0);\n float NdotUp = dot(normal, vec3(0.0, 1.0, 0.0));\n float epsilon = 0.0000001;\n if (1.0 - abs(NdotUp) <= epsilon)\n {\n bitangent = (NdotUp > 0.0) ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 0.0, -1.0);\n }\n vec3 tangent = normalize(cross(bitangent, normal));\n bitangent = cross(normal, tangent);\n return mat3(tangent, bitangent, normal);\n}\n\nvec4 getImportanceSampleLambertian(int sampleIndex, vec3 N, float roughness, float materialSID)\n{\n vec2 xi = hammersley2d(sampleIndex, get_sampleCount(materialSID, 0));\n\n float sinTheta = sqrt(1.0 - xi.y);\n float cosTheta = sqrt(xi.y);\n float phi = 2.0 * PI * xi.x;\n float pdf = cosTheta / PI;\n\n vec3 localDirection = normalize(vec3(\n sinTheta * cos(phi),\n sinTheta * sin(phi),\n cosTheta\n ));\n vec3 direction = createTBN(N) * localDirection;\n\n return vec4(direction, pdf);\n}\n\n// GGX NDF\nfloat d_GGX(float NH, float alphaRoughness) {\n float roughnessSqr = alphaRoughness * alphaRoughness;\n float f = (roughnessSqr - 1.0) * NH * NH + 1.0;\n return roughnessSqr / (PI * f * f);\n}\n\n// We learnd a lot from the following resources\n// https://bruop.github.io/ibl/\nvec4 getImportanceSampleGGX(int sampleIndex, vec3 N, float roughness, float materialSID)\n{\n vec2 xi = hammersley2d(sampleIndex, get_sampleCount(materialSID, 0));\n\n float alpha = roughness * roughness;\n float cosTheta = clamp(sqrt((1.0 - xi.y) / (1.0 + (alpha * alpha - 1.0) * xi.y)), 0.0, 1.0);\n float sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n float phi = 2.0 * PI * xi.x;\n float pdf = d_GGX(cosTheta, alpha);\n pdf /= 4.0;\n\n vec3 localDirection = normalize(vec3(\n sinTheta * cos(phi),\n sinTheta * sin(phi),\n cosTheta\n ));\n vec3 direction = createTBN(N) * localDirection;\n\n return vec4(direction, pdf);\n}\n\n// We learnd a lot from the following resources\n// https://developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-20-gpu-based-importance-sampling\n// https://cgg.mff.cuni.cz/~jaroslav/papers/2007-sketch-fis/Final_sap_0073.pdf\n// https://google.github.io/filament/Filament.html#annex/importancesamplingfortheibl/pre-filteredimportancesampling\nfloat computeLod(float pdf, int width, int sampleCount)\n{\n // 6.0 is the number of faces of the cubemap\n // log4 = 0.5 * log2\n // We don't use the constant K in the filament document\n return 0.5 * log2( 6.0 * float(width) * float(width) / (float(sampleCount) * pdf));\n}\n\nvec3 prefilter(vec3 N, float materialSID)\n{\n vec3 color = vec3(0.f);\n float weight = 0.0f;\n int sampleCount = get_sampleCount(materialSID, 0);\n\n ivec2 texSize = textureSize(u_baseColorTexture, 0);\n\n for(int i = 0; i < get_sampleCount(materialSID, 0); ++i)\n {\n vec4 importanceSample;\n\n int distributionType = get_distributionType(materialSID, 0);\n if(distributionType == cLambertian) {\n importanceSample = getImportanceSampleLambertian(i, N, get_roughness(materialSID, 0), materialSID);\n } else {\n importanceSample = getImportanceSampleGGX(i, N, get_roughness(materialSID, 0), materialSID);\n }\n\n vec3 H = vec3(importanceSample.xyz);\n float pdf = importanceSample.w;\n float lod = computeLod(pdf, texSize.x, sampleCount);\n\n if(distributionType == cLambertian)\n {\n vec3 lambertian = textureLod(u_baseColorTexture, H, lod).rgb;\n color += lambertian;\n }\n else if(distributionType == cGGX)\n {\n vec3 V = N;\n vec3 L = normalize(reflect(-V, H));\n float NdotL = dot(N, L);\n\n if (NdotL > 0.0)\n {\n vec3 sampleColor = textureLod(u_baseColorTexture, L, lod).rgb;\n color += sampleColor * NdotL;\n weight += NdotL;\n }\n }\n }\n\n if(weight != 0.0f)\n {\n color /= weight;\n }\n else\n {\n color /= float(sampleCount);\n }\n\n return color.rgb;\n}\n\nvec3 uvToDir(int faceId, vec2 uv)\n{\n\tif(faceId == 0)\n\t\treturn vec3(1.f, uv.y, -uv.x);\n\telse if(faceId == 1)\n\t\treturn vec3(-1.f, uv.y, uv.x);\n\telse if(faceId == 2)\n\t\treturn vec3(+uv.x, -1.f, +uv.y);\n\telse if(faceId == 3)\n\t\treturn vec3(+uv.x, 1.f, -uv.y);\n\telse if(faceId == 4)\n\t\treturn vec3(+uv.x, uv.y, 1.f);\n\telse\n return vec3(-uv.x, +uv.y, -1.f);\n}\n\n// learned a lot from https://github.com/KhronosGroup/glTF-Sample-Viewer\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n vec2 uv = v_texcoord_0 * 2.0 - 1.0;\n vec3 scan = uvToDir(get_cubeMapFaceId(materialSID, 0), uv);\n vec3 direction = normalize(scan);\n direction.y = -direction.y;\n\n rt0 = vec4(prefilter(direction, materialSID), 1.0);\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert": /*!********************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main()\n{\n \n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n \n}\n\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.frag": /*!****************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.frag ***! \****************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\nin vec2 v_texcoord_0;\nin vec4 v_texcoord_1;\nin vec4 v_projPosition_from_light;\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nstruct Light {\n int type; // 0 = directional, 1 = point, 2 = spot\n vec3 position;\n vec3 intensity;\n vec3 attenuatedIntensity;\n vec3 directionOfLightObject;\n vec3 direction; // direction of light vector, equal to normalize(light.pointToLight)\n vec3 pointToLight; // not normalized\n float spotAngleScale;\n float spotAngleOffset;\n float effectiveRange;\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfloat getRangeAttenuation(Light light)\n{\n float distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfloat getSpotAttenuation(Light light)\n{\n\n float cd = dot(light.directionOfLightObject, light.direction);\n float angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nvoid getLightAttenuated(Light light) {\n light.attenuatedIntensity = light.intensity;\n // if (light.type == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.type == 1)\n {\n light.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.type == 2)\n {\n light.attenuatedIntensity *= getSpotAttenuation(light);\n }\n}\n\nLight getLight(int lightIdx, vec3 v_position_inWorld) {\n vec3 lightPosition = get_lightPosition(0.0, lightIdx);\n vec3 direction_and_w_of_LightObject = get_lightDirection(0.0, lightIdx);\n vec3 lightIntensity = get_lightIntensity(0.0, lightIdx);\n vec4 lightProperty = get_lightProperty(0.0, lightIdx);\n Light light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n float lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3(0.0);\n light.type = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.type = 1;\n } else { // is Directional Light\n light.type = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.type = 2;\n }\n\n const float M_PI = 3.141592653589793;\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n getLightAttenuated(light);\n\n return light;\n}\n\n\nfloat decodeRGBAToDepth(vec4 RGBA){\n const float rMask = 1.0;\n const float gMask = 1.0 / 255.0;\n const float bMask = 1.0 / (255.0 * 255.0);\n const float aMask = 1.0 / (255.0 * 255.0 * 255.0);\n float depth = dot(RGBA, vec4(rMask, gMask, bMask, aMask));\n return depth;\n}\n\nvoid main (){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n // Normal\n vec3 normal_inWorld = normalize(v_normal_inWorld);\n\n // diffuseColor\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n float alpha = 1.0;\n\n vec4 diffuseColorFactor = get_diffuseColorFactor(materialSID, 0);\n if (v_color != diffuseColor && diffuseColorFactor.rgb != diffuseColor) {\n diffuseColor = v_color * diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (v_color == diffuseColor) {\n diffuseColor = diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (diffuseColorFactor.rgb == diffuseColor) {\n diffuseColor = v_color;\n } else {\n diffuseColor = vec3(1.0, 1.0, 1.0);\n }\n\n // diffuseColorTexture\n vec4 textureColor = texture(u_diffuseColorTexture, v_texcoord_0);\n if (textureColor.r > 0.05) {\n diffuseColor *= textureColor.rgb;\n alpha *= textureColor.a;\n }\n\n // shadow mapping\n if(v_projPosition_from_light.w > 0.0){\n float zNear = get_zNearInner(materialSID, 0);\n float zFar = get_zFarInner(materialSID, 0);\n float normalizationCoefficient = 1.0 / (zFar - zNear);\n\n vec2 shadowMapUV = v_texcoord_1.xy / v_texcoord_1.w;\n\n #ifdef RN_IS_DEBUGGING\n bool inShadowMap = (shadowMapUV.x >= 0.0 && shadowMapUV.x <= 1.0) && (shadowMapUV.y >= 0.0 && shadowMapUV.y <= 1.0);\n if(inShadowMap == false){\n rt0 = get_debugColorFactor(materialSID, 0);\n/* shaderity: @{renderTargetEnd} */\n\n return;\n }\n #endif\n\n float measureDepth = normalizationCoefficient * length(v_projPosition_from_light);\n float textureDepth = decodeRGBAToDepth(texture(u_depthTexture, shadowMapUV));\n float allowableDepthError = get_allowableDepthError(materialSID, 0);\n\n if(measureDepth > textureDepth + allowableDepthError){\n // case of shadow\n vec4 shadowColorFactor = get_shadowColorFactor(materialSID, 0);\n diffuseColor = shadowColorFactor.rgb;\n alpha = shadowColorFactor.a;\n }\n }\n\n // Lighting\n vec3 shadingColor = vec3(0.0, 0.0, 0.0);\n int shadingModel = get_shadingModel(materialSID, 0);\n if (shadingModel > 0) {\n\n vec3 diffuse = vec3(0.0, 0.0, 0.0);\n vec3 specular = vec3(0.0, 0.0, 0.0);\n int lightNumber = get_lightNumber(materialSID, 0);\n for (int i = 0; i < /* shaderity: @{Config.maxLightNumberInShader} */; i++) {\n if (i >= lightNumber) {\n break;\n }\n\n // Light\n Light light = getLight(i, v_position_inWorld.xyz);\n\n diffuse += diffuseColor * max(0.0, dot(normal_inWorld, light.direction)) * light.attenuatedIntensity;\n\n vec3 viewPosition = get_viewPosition(cameraSID, 0);\n float shininess = get_shininess(materialSID, 0);\n if (shadingModel == 2) {// BLINN\n // ViewDirection\n vec3 viewDirection = normalize(viewPosition - v_position_inWorld.xyz);\n vec3 halfVector = normalize(light.direction + viewDirection);\n specular += pow(max(0.0, dot(halfVector, normal_inWorld)), shininess);\n } else if (shadingModel == 3) { // PHONG\n vec3 viewDirection = normalize(viewPosition - v_position_inWorld.xyz);\n vec3 R = reflect(light.direction, normal_inWorld);\n specular += pow(max(0.0, dot(R, viewDirection)), shininess);\n }\n\n }\n\n shadingColor = diffuse + specular;\n } else {\n shadingColor = diffuseColor;\n }\n\n rt0 = vec4(shadingColor, alpha);\n //rt0 = vec4(u_lightNumber, 0.0, 0.0, 1.0);\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.vert": /*!****************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.vert ***! \****************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec2 a_texcoord_1;\nin vec4 a_joint;\nin vec4 a_weight;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\nout vec2 v_texcoord_0;\nout vec4 v_texcoord_1;\nout vec4 v_projPosition_from_light;\n\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main(){\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n\n // Skeletal\n processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n // Shadow mapping\n mat4 lightViewProjectionMatrix = get_lightViewProjectionMatrix(materialSID, 0);\n v_projPosition_from_light = lightViewProjectionMatrix * v_position_inWorld;\n\n // Following tMatrix is based on https://wgld.org/d/webgl/w051.html\n mat4 tMatrix = mat4(\n 0.5, 0.0, 0.0, 0.0,\n 0.0, 0.5, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.5, 0.5, 0.0, 1.0\n );\n v_texcoord_1 = tMatrix * v_projPosition_from_light;\n\n v_color = a_color;\n v_normal_inWorld = normalMatrix * a_normal;\n v_texcoord_0 = a_texcoord_0;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.frag": /*!**************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.frag ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\n\nuniform sampler2DRect u_baseColorTexture; // initialValue=(0,white)\nuniform float u_count; // initialValue=0.0\nuniform float u_direction; // initialValue=0.0\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nvoid main ()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\nfloat i = get_count(materialSID, 0);\nfloat dir = get_direction(materialSID, 0);\n\nrt0 = texture(u_baseColorTexture, gl_FragCoord.xy);\n\nif (dir > 0.0) {\n // horizontal\n rt0 += texture(u_baseColorTexture, vec2(gl_FragCoord.x + pow(2.0, i), gl_FragCoord.y));\n} else {\n // virtical\n rt0 += texture(u_baseColorTexture, vec2(gl_FragCoord.x, gl_FragCoord.y + pow(2.0, i)));\n}\n\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.vert": /*!**************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.vert ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\nmat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\nmat4 viewMatrix = get_viewMatrix(cameraSID, 0);\nmat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\ngl_Position = projectionMatrix * viewMatrix * worldMatrix * vec4(a_position, 1.0);\n\n\nv_texcoord_0 = a_texcoord_0;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag": /*!************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag ***! \************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{renderTargetBegin} */\n\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\nin vec2 v_texcoord_0;\n\nfloat edge_ratio(vec3 bary3, float wireframeWidthInner, float wireframeWidthRelativeScale) {\n vec3 d = fwidth(bary3);\n vec3 x = bary3 + vec3(1.0 - wireframeWidthInner) * d;\n vec3 a3 = smoothstep(vec3(0.0), d, x);\n float factor = min(min(a3.x, a3.y), a3.z);\n\n return clamp((1.0 - factor), 0.0, 1.0);\n}\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n float synthesizeCoefficient0 = u_synthesizeCoefficient[0];\n vec3 color = synthesizeCoefficient0 * texture(u_synthesizeTexture0, v_texcoord_0).rgb;\n\n float synthesizeCoefficient1 = u_synthesizeCoefficient[1];\n float synthesizeCoefficient2 = u_synthesizeCoefficient[2];\n float synthesizeCoefficient3 = u_synthesizeCoefficient[3];\n float synthesizeCoefficient4 = u_synthesizeCoefficient[4];\n float synthesizeCoefficient5 = u_synthesizeCoefficient[5];\n\n color += synthesizeCoefficient1 * texture(u_synthesizeTexture1, v_texcoord_0).rgb;\n color += synthesizeCoefficient2 * texture(u_synthesizeTexture2, v_texcoord_0).rgb;\n color += synthesizeCoefficient3 * texture(u_synthesizeTexture3, v_texcoord_0).rgb;\n color += synthesizeCoefficient4 * texture(u_synthesizeTexture4, v_texcoord_0).rgb;\n color += synthesizeCoefficient5 * texture(u_synthesizeTexture5, v_texcoord_0).rgb;\n\n rt0 = vec4(color, 1.0);\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert": /*!************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert ***! \************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\nin vec4 a_instanceInfo;\nin vec3 a_position;\nin vec2 a_texcoord_0;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag": /*!******************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag ***! \******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec2 v_texcoord_0;\n\nuniform sampler2D u_baseColorTexture; // initialValue=(0,white)\nuniform bool u_enableLinearToSrgb; // initialValue=true\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nvec3 linearToSrgb(vec3 linearColor) {\n return pow(linearColor, vec3(1.0/2.2));\n}\n\nvec3 srgbToLinear(vec3 srgbColor) {\n return pow(srgbColor, vec3(2.2));\n}\n\n\n#ifdef RN_USE_KHRONOS_PBR_NEUTRAL\n// Input color is non-negative and resides in the Linear Rec. 709 color space.\n// Output color is also Linear Rec. 709, but in the [0, 1] range.\n// See: https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral\nvec3 PBRNeutralToneMapping( vec3 color ) {\n const float startCompression = 0.8 - 0.04;\n const float desaturation = 0.15;\n\n float x = min(color.r, min(color.g, color.b));\n float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n color -= offset;\n\n float peak = max(color.r, max(color.g, color.b));\n if (peak < startCompression) return color;\n\n const float d = 1. - startCompression;\n float newPeak = 1. - d * d / (peak + d - startCompression);\n color *= newPeak / peak;\n\n float g = 1. - 1. / (desaturation * (peak - newPeak) + 1.);\n return mix(color, newPeak * vec3(1, 1, 1), g);\n}\n#endif\n\n#ifdef RN_USE_REINHARD\nvec3 ReinhardToneMapping( vec3 color ) {\n return color / (vec3(1.0) + color);\n}\n#endif\n\n#ifdef RN_USE_ACES_NARKOWICZ\n// ACES tone map (faster approximation)\n// see: https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/\nvec3 ACES_Narkowicz_ToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return clamp((color * (A * color + B)) / (color * (C * color + D) + E), 0.0, 1.0);\n}\n#endif\n\n#if defined(RN_USE_ACES_HILL) || defined(RN_USE_ACES_HILL_EXPOSURE_BOOST)\n// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\nconst mat3 ACESInputMat = mat3\n(\n 0.59719, 0.07600, 0.02840,\n 0.35458, 0.90834, 0.13383,\n 0.04823, 0.01566, 0.83777\n);\n\n// ODT_SAT => XYZ => D60_2_D65 => sRGB\nconst mat3 ACESOutputMat = mat3\n(\n 1.60475, -0.10208, -0.00327,\n -0.53108, 1.10813, -0.07276,\n -0.07367, -0.00605, 1.07602\n);\n\nvec3 RRTAndODTFit(vec3 v)\n{\n vec3 a = v * (v + 0.0245786f) - 0.000090537f;\n vec3 b = v * (0.983729f * v + 0.4329510f) + 0.238081f;\n return a / b;\n}\n\nvec3 ACES_Hill_ToneMapping(vec3 color)\n{\n color = ACESInputMat * color;\n\n // Apply RRT and ODT\n color = RRTAndODTFit(color);\n\n color = ACESOutputMat * color;\n\n // Clamp to [0, 1]\n color = clamp(color, 0.0, 1.0);\n\n return color;\n}\n#endif\n\n#ifdef RN_USE_GT_TONEMAP\nfloat W_f(float x, float e0, float e1) {\n if (x <= e0)\n return 0.;\n if (x >= e1)\n return 1.;\n float a = (x - e0) / (e1 - e0);\n return a * a * (3. - 2. * a);\n}\nfloat H_f(float x, float e0, float e1) {\n if (x <= e0)\n return 0.;\n if (x >= e1)\n return 1.;\n return (x - e0) / (e1 - e0);\n}\n\nconst float e = 2.71828;\n\nfloat GT_ToneMaping(float x) {\n float P = 1.; // peak luminance\n float a = 1.; // contrast parameter\n float m = 0.22; // beginning of the linear part\n float l = 0.4; // length of the linear part\n float c = 1.33; // parameter of black color\n float b = 0.; // parameter of black color\n float l0 = (P - m) * l / a;\n float T_x = m * pow(x / m, c) + b;\n float L_x = m + a * (x - m);\n float S0 = m + l0;\n float S1 = m + a * l0;\n float C2 = a * P / (P - S1);\n float S_x = P - (P - S1) * pow(e, -(C2 * (x - S0) / P));\n float w0_x = 1. - W_f(x, 0., m);\n float w2_x = H_f(x, m + l0, m + l0);\n float w1_x = 1. - w0_x - w2_x;\n float f_x = T_x * w0_x + L_x * w1_x + S_x * w2_x;\n return f_x;\n}\n#endif\n\nvoid main ()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\nvec4 baseColor = texture(u_baseColorTexture, v_texcoord_0);\n\n// Apply Tone Mapping\n#ifdef RN_USE_KHRONOS_PBR_NEUTRAL\nbaseColor.rgb = PBRNeutralToneMapping(baseColor.rgb);\n#endif\n\n#ifdef RN_USE_REINHARD\nbaseColor.rgb = ReinhardToneMapping(baseColor.rgb);\n#endif\n\n#ifdef RN_USE_ACES_NARKOWICZ\nbaseColor.rgb = ACES_Narkowicz_ToneMapping(baseColor.rgb);\n#endif\n\n#ifdef RN_USE_ACES_HILL\nbaseColor.rgb = ACES_Hill_ToneMapping(baseColor.rgb);\n#endif\n\n#ifdef RN_USE_ACES_HILL_EXPOSURE_BOOST\nbaseColor.rgb /= 0.6;\nbaseColor.rgb = ACES_Hill_ToneMapping(baseColor.rgb);\n#endif\n\n#ifdef RN_USE_GT_TONEMAP\nbaseColor.r = GT_ToneMaping(baseColor.r);\nbaseColor.g = GT_ToneMaping(baseColor.g);\nbaseColor.b = GT_ToneMaping(baseColor.b);\n#endif\n\n\n// Convert linear color to sRGB color space.\nif (get_enableLinearToSrgb(materialSID, 0)) {\n baseColor.rgb = linearToSrgb(baseColor.rgb);\n}\n\nrt0 = baseColor;\n\n/* shaderity: @{renderTargetEnd} */\n\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert": /*!******************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert ***! \******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec3 a_position;\nout vec2 v_texcoord_0;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nvoid main()\n{\n\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\nfloat x = float((gl_VertexID & 1) << 2);\nfloat y = float((gl_VertexID & 2) << 1);\nv_texcoord_0.x = x * 0.5;\nv_texcoord_0.y = y * 0.5;\ngl_Position = vec4(x - 1.0, y - 1.0, 0, 1);\n\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.frag": /*!********************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.frag ***! \********************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL1_EXT_SHADER_TEXTURE_LOD\n#extension GL_EXT_shader_texture_lod : require\n#endif\n\n#ifdef WEBGL1_EXT_STANDARD_DERIVATIVES\n#extension GL_OES_standard_derivatives : require\n#endif\n\n#ifdef WEBGL1_EXT_DRAW_BUFFERS\n#extension GL_EXT_draw_buffers : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\nin vec3 v_color;\nin vec3 v_normal_inWorld;\nin vec4 v_position_inWorld;\nin vec2 v_texcoord_0;\nin vec4 v_texcoord_1;\nin vec4 v_projPosition_from_light;\nin vec3 v_baryCentricCoord;\n\n/* shaderity: @{renderTargetBegin} */\n\n\n/* shaderity: @{getters} */\n\nstruct Light {\n int type; // 0 = directional, 1 = point, 2 = spot\n vec3 position;\n vec3 intensity;\n vec3 attenuatedIntensity;\n vec3 directionOfLightObject;\n vec3 direction; // direction of light vector, equal to normalize(light.pointToLight)\n vec3 pointToLight; // not normalized\n float spotAngleScale;\n float spotAngleOffset;\n float effectiveRange;\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfloat getRangeAttenuation(Light light)\n{\n float distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfloat getSpotAttenuation(Light light)\n{\n\n float cd = dot(light.directionOfLightObject, light.direction);\n float angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nvoid getLightAttenuated(Light light) {\n light.attenuatedIntensity = light.intensity;\n // if (light.type == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.type == 1)\n {\n light.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.type == 2)\n {\n light.attenuatedIntensity *= getSpotAttenuation(light);\n }\n}\n\nLight getLight(int lightIdx, vec3 v_position_inWorld) {\n vec3 lightPosition = get_lightPosition(0.0, lightIdx);\n vec3 direction_and_w_of_LightObject = get_lightDirection(0.0, lightIdx);\n vec3 lightIntensity = get_lightIntensity(0.0, lightIdx);\n vec4 lightProperty = get_lightProperty(0.0, lightIdx);\n Light light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n float lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3(0.0);\n light.type = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.type = 1;\n } else { // is Directional Light\n light.type = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.type = 2;\n }\n\n const float M_PI = 3.141592653589793;\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n getLightAttenuated(light);\n\n return light;\n}\n\n\nfloat edge_ratio(vec3 bary3, float wireframeWidthInner, float wireframeWidthRelativeScale) {\n vec3 d = fwidth(bary3);\n vec3 x = bary3+vec3(1.0 - wireframeWidthInner)*d;\n vec3 a3 = smoothstep(vec3(0.0), d, x);\n float factor = min(min(a3.x, a3.y), a3.z);\n\n return clamp((1.0 - factor), 0.0, 1.0);\n}\n\nfloat decodeRGBAToDepth(vec4 RGBA){\n const float rMask = 1.0;\n const float gMask = 1.0 / 255.0;\n const float bMask = 1.0 / (255.0 * 255.0);\n const float aMask = 1.0 / (255.0 * 255.0 * 255.0);\n float depth = dot(RGBA, vec4(rMask, gMask, bMask, aMask));\n return depth;\n}\n\nfloat linstep(float min,float max,float v){\n return clamp((v-min)/(max-min),0.0,1.0);\n}\n\nfloat reduceLightBleeding(float p_max, float parameter){\n return linstep(parameter,1.0,p_max);\n}\n\nfloat chebyshevUpperBound(float materialSID){\n float textureDepth = decodeRGBAToDepth(textureProj(u_depthTexture, v_texcoord_1));\n float textureSquareDepth = decodeRGBAToDepth(textureProj(u_squareDepthTexture, v_texcoord_1));\n if(textureDepth == 1.0 || textureSquareDepth == 1.0){\n return 1.0;\n }\n\n float nonShadowProb = 1.0;\n\n if(v_projPosition_from_light.w > 0.0){\n float measureDepth;\n bool isPointLight = get_isPointLight(materialSID, 0);\n if(isPointLight){\n float zNear = get_zNearInner(materialSID, 0);\n float zFar = get_zFarInner(materialSID, 0);\n float normalizationCoefficient = 1.0 / (zFar - zNear);\n measureDepth = normalizationCoefficient * length(v_projPosition_from_light);\n }else{\n measureDepth = (v_projPosition_from_light / v_projPosition_from_light.w).z;\n }\n\n float depthAdjustment = get_depthAdjustment(materialSID, 0);\n measureDepth += depthAdjustment;\n\n float textureDepthAdjustment = get_textureDepthAdjustment(materialSID, 0);\n textureDepth += textureDepthAdjustment;\n\n float d = measureDepth - textureDepth;\n if(d < 0.0) return 1.0;\n\n float variance = textureSquareDepth - textureDepth * textureDepth;\n float minimumVariance = get_minimumVariance(materialSID, 0);\n variance = max(variance, minimumVariance);\n\n nonShadowProb = variance / (variance + d * d);\n\n\n float lightBleedingParameter = get_lightBleedingParameter(materialSID, 0);\n nonShadowProb = reduceLightBleeding(nonShadowProb, lightBleedingParameter);\n }\n return nonShadowProb;\n}\n\nvoid main ()\n{\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n // Normal\n vec3 normal_inWorld = normalize(v_normal_inWorld);\n\n // diffuseColor\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n float alpha = 1.0;\n\n vec4 diffuseColorFactor = get_diffuseColorFactor(materialSID, 0);\n if (v_color != diffuseColor && diffuseColorFactor.rgb != diffuseColor) {\n diffuseColor = v_color * diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (v_color == diffuseColor) {\n diffuseColor = diffuseColorFactor.rgb;\n alpha = diffuseColorFactor.a;\n } else if (diffuseColorFactor.rgb == diffuseColor) {\n diffuseColor = v_color;\n } else {\n diffuseColor = vec3(1.0, 1.0, 1.0);\n }\n\n // diffuseColorTexture\n vec4 textureColor = texture(u_diffuseColorTexture, v_texcoord_0);\n if (textureColor.r > 0.05) {\n diffuseColor *= textureColor.rgb;\n alpha *= textureColor.a;\n }\n\n // shadow mapping\n vec4 shadowColor = get_shadowColor(materialSID, 0);\n\n float nonShadowProb = chebyshevUpperBound(materialSID);\n diffuseColor = nonShadowProb * diffuseColor + (1.0 - nonShadowProb) * shadowColor.rgb;\n alpha = nonShadowProb * alpha + (1.0 - nonShadowProb) * shadowColor.a;\n\n // Lighting\n vec3 shadingColor = vec3(0.0, 0.0, 0.0);\n\n int shadingModel = get_shadingModel(materialSID, 0);\n if (shadingModel > 0) {\n vec3 diffuse = vec3(0.0, 0.0, 0.0);\n vec3 specular = vec3(0.0, 0.0, 0.0);\n int lightNumber = get_lightNumber(materialSID, 0);\n for (int i = 0; i < /* shaderity: @{Config.maxLightNumberInShader} */ ; i++) {\n if (i >= lightNumber) {\n break;\n }\n\n // Light\n Light light = getLight(i, v_position_inWorld.xyz);\n\n diffuse += diffuseColor * max(0.0, dot(normal_inWorld, light.direction)) * light.attenuatedIntensity;\n\n vec3 viewPosition = get_viewPosition(materialSID, 0);\n float shininess = get_shininess(materialSID, 0);\n if (shadingModel == 2) {// BLINN\n // ViewDirection\n vec3 viewDirection = normalize(viewPosition - v_position_inWorld.xyz);\n vec3 halfVector = normalize(light.direction + viewDirection);\n specular += pow(max(0.0, dot(halfVector, normal_inWorld)), shininess);\n } else if (shadingModel == 3) { // PHONG\n vec3 viewDirection = normalize(viewPosition - v_position_inWorld.xyz);\n vec3 R = reflect(light.direction, normal_inWorld);\n specular += pow(max(0.0, dot(R, viewDirection)), shininess);\n }\n\n }\n\n shadingColor = diffuse + specular;\n } else {\n shadingColor = diffuseColor;\n }\n\n rt0 = vec4(shadingColor, alpha);\n\n // Wireframe\n float threshold = 0.001;\n vec3 wireframe = get_wireframe(materialSID, 0);\n float wireframeWidthInner = wireframe.z;\n float wireframeWidthRelativeScale = 1.0;\n if (wireframe.x > 0.5 && wireframe.y < 0.5) {\n rt0.a = 0.0;\n }\n vec4 wireframeResult = rt0;\n vec4 wireframeColor = vec4(0.2, 0.75, 0.0, 1.0);\n float edgeRatio = edge_ratio(v_baryCentricCoord, wireframeWidthInner, wireframeWidthRelativeScale);\n float edgeRatioModified = mix(step(threshold, edgeRatio), clamp(edgeRatio*4.0, 0.0, 1.0), wireframeWidthInner / wireframeWidthRelativeScale/4.0);\n // if r0.a is 0.0, it is wireframe not on shaded\n wireframeResult.rgb = wireframeColor.rgb * edgeRatioModified + rt0.rgb * (1.0 - edgeRatioModified);\n wireframeResult.a = max(rt0.a, wireframeColor.a * mix(edgeRatioModified, pow(edgeRatioModified, 100.0), wireframeWidthInner / wireframeWidthRelativeScale/1.0));\n\n if (wireframe.x > 0.5) {\n rt0 = wireframeResult;\n if (wireframe.y < 0.5 && rt0.a == 0.0) {\n discard;\n }\n }\n\n/* shaderity: @{renderTargetEnd} */\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.vert": /*!********************************************************************************************************************!*\ !*** ./src/webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.vert ***! \********************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\n#ifdef WEBGL2_MULTI_VIEW\n#extension GL_OVR_multiview2 : require\n#endif\n\nprecision highp float;\nprecision highp int;\n\n\n/* shaderity: @{definitions} */\n\nin vec3 a_position;\nin vec3 a_color;\nin vec3 a_normal;\nin vec4 a_instanceInfo;\nin vec2 a_texcoord_0;\nin vec4 a_joint;\nin vec4 a_weight;\nin vec4 a_baryCentricCoord;\nout vec3 v_color;\nout vec3 v_normal_inWorld;\nout vec4 v_position_inWorld;\nout vec2 v_texcoord_0;\nout vec4 v_texcoord_1;\nout vec4 v_projPosition_from_light;\nout vec3 v_baryCentricCoord;\n\nconst float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n\n\n/* shaderity: @{getters} */\n\n/* shaderity: @{matricesGetters} */\n\nmat3 toNormalMatrix(mat4 m) {\n float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3];\n\n float b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n float determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3(\n a11 * b11 - a12 * b10 + a13 * b09, a12 * b08 - a10 * b11 - a13 * b07, a10 * b10 - a11 * b08 + a13 * b06,\n a02 * b10 - a01 * b11 - a03 * b09, a00 * b11 - a02 * b08 + a03 * b07, a01 * b08 - a00 * b10 - a03 * b06,\n a31 * b05 - a32 * b04 + a33 * b03, a32 * b02 - a30 * b05 - a33 * b01, a30 * b04 - a31 * b02 + a33 * b00) / determinantVal;\n}\n\n\n\n#ifdef RN_IS_SKINNING\n\nhighp mat4 createMatrixFromQuaternionTranslationScale( highp vec4 quaternion, highp vec3 translation, highp vec3 scale ) {\n highp vec4 q = quaternion;\n highp vec3 t = translation;\n\n highp float sx = q.x * q.x;\n highp float sy = q.y * q.y;\n highp float sz = q.z * q.z;\n highp float cx = q.y * q.z;\n highp float cy = q.x * q.z;\n highp float cz = q.x * q.y;\n highp float wx = q.w * q.x;\n highp float wy = q.w * q.y;\n highp float wz = q.w * q.z;\n\n highp mat4 mat = mat4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n highp mat4 uniformScaleMat = mat4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n return mat*uniformScaleMat;\n}\n\nhighp vec4 unpackedVec2ToNormalizedVec4(highp vec2 vec_xy, highp float criteria){\n\n highp float r;\n highp float g;\n highp float b;\n highp float a;\n\n highp float ix = floor(vec_xy.x * criteria);\n highp float v1x = ix / criteria;\n highp float v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n highp float iy = floor( vec_xy.y * criteria);\n highp float v2x = iy / criteria;\n highp float v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nmat4 getSkinMatrix(float skeletalComponentSID) {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n mat4 skinMat = a_weight.x * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.x)));\n skinMat += a_weight.y * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.y)));\n skinMat += a_weight.z * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.z)));\n skinMat += a_weight.w * mat4(get_boneMatrix(skeletalComponentSID, int(a_joint.w)));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n vec2 criteria = vec2(4096.0, 4096.0);\n\n vec4 tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 sq_x = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.x));\n vec4 quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n vec4 tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.y));\n vec4 sq_y = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.y));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n vec4 tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.z));\n vec4 sq_z = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.z));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n vec4 tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, int(a_joint.w));\n vec4 sq_w = get_boneScalePackedQuat(skeletalComponentSID, int(a_joint.w));\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n vec4 ts_x = get_boneTranslateScale(skeletalComponentSID, int(a_joint.x));\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.x)), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = get_boneTranslateScale(skeletalComponentSID, int(a_joint.y));\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.y)), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = get_boneTranslateScale(skeletalComponentSID, int(a_joint.z));\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.z)), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = get_boneTranslateScale(skeletalComponentSID, int(a_joint.w));\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, int(a_joint.w)), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n vec4 boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.x));\n vec4 boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.y));\n vec4 boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.z));\n vec4 boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, int(a_joint.w));\n\n vec2 criteria = vec2(4096.0, 4096.0);\n vec4 boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n vec4 ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n mat4 skinMat = a_weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n vec4 ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n vec4 ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n vec4 ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += a_weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\n\n\n#ifdef RN_IS_SKINNING\nbool skinning(\n float skeletalComponentSID,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n )\n{\n mat4 skinMat = getSkinMatrix(skeletalComponentSID);\n outPosition_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n outNormalMatrix = toNormalMatrix(skinMat);\n outNormal_inWorld = normalize(outNormalMatrix * inNormal_inLocal);\n\n return true;\n}\n#endif\n\nbool processGeometryWithMorphingAndSkinning(\n float skeletalComponentSID,\n in mat4 worldMatrix,\n in mat4 viewMatrix,\n in bool isBillboard,\n in mat3 inNormalMatrix,\n out mat3 outNormalMatrix,\n in vec3 inPosition_inLocal,\n out vec4 outPosition_inWorld,\n in vec3 inNormal_inLocal,\n out vec3 outNormal_inWorld\n) {\n bool isSkinning = false;\n\n vec3 position_inLocal;\n#ifdef RN_IS_MORPHING\n if (u_morphTargetNumber == 0) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n float vertexIdx = a_baryCentricCoord.w;\n position_inLocal = get_position(vertexIdx, inPosition_inLocal);\n }\n#endif\n\n mat4 worldMatrixInner = worldMatrix;\n if (isBillboard) {\n mat4 inverseViewMatrix = inverse(viewMatrix);\n inverseViewMatrix[3][0] = 0.0;//worldMatrix[3][0];\n inverseViewMatrix[3][1] = 0.0;//worldMatrix[3][1];\n inverseViewMatrix[3][2] = 0.0;//worldMatrix[3][2];\n worldMatrixInner = inverseViewMatrix * worldMatrix;\n }\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0.0) {\n isSkinning = skinning(skeletalComponentSID, inNormalMatrix, outNormalMatrix, position_inLocal, outPosition_inWorld, inNormal_inLocal, outNormal_inWorld);\n } else {\n#endif\n outNormalMatrix = inNormalMatrix;\n outPosition_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n outNormal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return isSkinning;\n}\n\n\nvoid main(){\n#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n\n\n mat3 normalMatrix = get_normalMatrix(a_instanceInfo.x);\n mat4 worldMatrix = get_worldMatrix(a_instanceInfo.x);\n mat4 viewMatrix = get_viewMatrix(cameraSID, 0);\n\n bool isSkinning = false;\n isSkinning = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n normalMatrix,\n a_position,\n v_position_inWorld,\n a_normal,\n v_normal_inWorld\n );\n\n mat4 projectionMatrix = get_projectionMatrix(cameraSID, 0);\n gl_Position = projectionMatrix * viewMatrix * v_position_inWorld;\n\n// #ifdef RN_IS_POINTSPRITE\n\nvec4 position_inWorld = worldMatrix * vec4(a_position, 1.0);\nvec3 viewPosition = get_viewPosition(cameraSID, 0);\nfloat distanceFromCamera = length(position_inWorld.xyz - viewPosition);\nvec3 pointDistanceAttenuation = get_pointDistanceAttenuation(materialSID, 0);\nfloat distanceAttenuationFactor = sqrt(1.0/(pointDistanceAttenuation.x + pointDistanceAttenuation.y * distanceFromCamera + pointDistanceAttenuation.z * distanceFromCamera * distanceFromCamera));\nfloat maxPointSize = get_pointSize(materialSID, 0);\ngl_PointSize = clamp(distanceAttenuationFactor * maxPointSize, 0.0, maxPointSize);\n\n// #endif\n\n\n v_baryCentricCoord = a_baryCentricCoord.xyz;\n v_color = a_color;\n v_texcoord_0 = a_texcoord_0;\n\n // Shadow mapping\n mat4 lightViewProjectionMatrix = get_lightViewProjectionMatrix(materialSID, 0);\n v_projPosition_from_light = lightViewProjectionMatrix * v_position_inWorld;\n\n // Following tMatrix is based on https://wgld.org/d/webgl/w051.html\n mat4 tMatrix = mat4(\n 0.5, 0.0, 0.0, 0.0,\n 0.0, 0.5, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.5, 0.5, 0.0, 1.0\n );\n v_texcoord_1 = tMatrix * v_projPosition_from_light;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/common/mainPrerequisites.glsl": /*!*******************************************************************!*\ !*** ./src/webgl/shaderity_shaders/common/mainPrerequisites.glsl ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"#ifdef RN_IS_DATATEXTURE_MODE\n float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n #ifdef RN_IS_VERTEX_SHADER\n skeletalComponentSID = a_instanceInfo.y;\n #else\n skeletalComponentSID = -1.0;\n #endif\n #endif\n\n#else // RN_IS_UNIFORM_MODE\n\n float materialSID = -1.0; // materialSID is not used in Uniform mode\n\n int lightNumber = 0;\n #ifdef RN_IS_LIGHTING\n lightNumber = get_lightNumber(0.0, 0);\n #endif\n\n float skeletalComponentSID = -1.0;\n #ifdef RN_IS_SKINNING\n skeletalComponentSID = float(get_skinningMode(0.0, 0));\n #endif\n\n#endif\n\nfloat cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID} */];\n\n#if defined(WEBGL2_MULTI_VIEW) && defined(RN_IS_VERTEX_SHADER)\n// if (u_isMainVr == 1) {\n cameraSID += float(gl_ViewID_OVR);\n// }\n#endif\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/common/prerequisites.glsl": /*!***************************************************************!*\ !*** ./src/webgl/shaderity_shaders/common/prerequisites.glsl ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"const float Epsilon = 0.0000001;\n#define saturateEpsilonToOne(x) clamp(x, Epsilon, 1.0)\n\n#ifdef RN_IS_MORPHING\nuniform int u_morphTargetNumber; // initialValue=0, isInternalSetting=true, soloDatum=false, needUniformInDataTextureMode=true\n// uniform int u_dataTextureMorphOffsetPosition[];\n// uniform int u_morphWeights[]; //\n#endif\n\nuniform int u_isMainVr; // skipProcess=true\nuniform highp sampler2D u_dataTexture; // skipProcess=true\n/* shaderity: @{widthOfDataTexture} */\n/* shaderity: @{heightOfDataTexture} */\n\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n/* shaderity: @{dataUBOVec4Size} */\n/* shaderity: @{dataUBODefinition} */\n#endif\n\n\nhighp vec4 fetchElement(int vec4_idx) {\n#if defined(GLSL_ES3) && defined(RN_IS_DATATEXTURE_MODE) && defined(RN_IS_UBO_ENABLED)\n if (vec4_idx < dataUBOVec4Size) {\n return fetchVec4FromVec4Block(vec4_idx);\n } else {\n int idxOnDataTex = vec4_idx - dataUBOVec4Size;\n highp ivec2 uv = ivec2(idxOnDataTex % widthOfDataTexture, idxOnDataTex / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n }\n#elif defined(GLSL_ES3)\n highp ivec2 uv = ivec2(vec4_idx % widthOfDataTexture, vec4_idx / widthOfDataTexture);\n return texelFetch( u_dataTexture, uv, 0 );\n#else\n // This idea from https://qiita.com/YVT/items/c695ab4b3cf7faa93885\n highp vec2 invSize = vec2(1.0/float(widthOfDataTexture), 1.0/float(heightOfDataTexture));\n highp float t = (float(vec4_idx) + 0.5) * invSize.x;\n highp float x = fract(t);\n highp float y = (floor(t) + 0.5) * invSize.y;\n #ifdef GLSL_ES3\n return texture( u_dataTexture, vec2(x, y));\n #else\n return texture( u_dataTexture, vec2(x, y));\n #endif\n#endif\n}\n\nvec2 fetchVec2No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xy;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec2(val0.yz);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.zw);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec2(val0.w, val1.x);\n }\n}\n\nvec3 fetchVec3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2) {\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n vec4 val0 = fetchElement(basePosIn16bytes);\n vec4 val1 = fetchElement(basePosIn16bytes+1);\n return vec3(val0.w, val1.xy);\n }\n}\n\nvec4 fetchVec4(int vec4_idx) {\n return fetchElement(vec4_idx);\n}\n\nfloat fetchScalarNo16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n vec4 val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0) {\n return val.x;\n } else if (posIn4bytes == 1) {\n return val.y;\n } else if (posIn4bytes == 2) {\n return val.z;\n } else if (posIn4bytes == 3) {\n return val.w;\n }\n}\n\nmat2 fetchMat2No16BytesAligned(int scalar_idx) {\n int vec4_idx = scalar_idx*4;\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat2 fetchMat2(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n\n mat2 val = mat2(\n col0.x, col0.y,\n col0.z, col0.w\n );\n\n return val;\n}\n\nmat3 fetchMat3No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n mat3 val = mat3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n\n}\n\nmat3 fetchMat3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat3 val = mat3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n\n return val;\n}\n\nmat4 fetchMat4No16BytesAligned(int scalar_idx) {\n#ifdef GLSL_ES3\n int posIn4bytes = scalar_idx % 4;\n#else\n int posIn4bytes = int(mod(float(scalar_idx), 4.0));\n#endif\n\n int basePosIn16bytes = (scalar_idx - posIn4bytes) / 4;\n if (posIn4bytes == 0) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n return val;\n } else if (posIn4bytes == 1) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.y, col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w, col3.x,\n col3.y, col3.z, col3.w, col4.x\n );\n return val;\n } else if (posIn4bytes == 2) {\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.z, col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x, col2.y,\n col2.z, col2.w, col3.x, col3.y,\n col3.z, col3.w, col4.x, col4.y\n );\n return val;\n } else { // posIn4bytes == 3\n vec4 col0 = fetchElement(basePosIn16bytes);\n vec4 col1 = fetchElement(basePosIn16bytes + 1);\n vec4 col2 = fetchElement(basePosIn16bytes + 2);\n vec4 col3 = fetchElement(basePosIn16bytes + 3);\n vec4 col4 = fetchElement(basePosIn16bytes + 4);\n mat4 val = mat4(\n col0.w, col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y, col2.z,\n col2.w, col3.x, col3.y, col3.z,\n col3.w, col4.x, col4.y, col4.z\n );\n return val;\n }\n}\n\nmat4 fetchMat4(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n vec4 col3 = fetchElement(vec4_idx + 3);\n\n mat4 val = mat4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\nmat4x3 fetchMat4x3(int vec4_idx) {\n vec4 col0 = fetchElement(vec4_idx);\n vec4 col1 = fetchElement(vec4_idx + 1);\n vec4 col2 = fetchElement(vec4_idx + 2);\n\n mat4x3 val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n return val;\n}\n\nfloat rand(const vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvec3 descramble(vec3 v) {\n float seed = 0.0;\n v.x -= sin(fract(v.y*20.0));\n v.z -= cos(fract(-v.y*10.0));\n return v;\n}\n\nconst float PI = 3.14159265358979323846;\n\nfloat max3(vec3 v)\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfloat sq(float t)\n{\n return t * t;\n}\n\nvec2 sq(vec2 t)\n{\n return t * t;\n}\n\nvec3 sq(vec3 t)\n{\n return t * t;\n}\n\nvec4 sq(vec4 t)\n{\n return t * t;\n}\n\nfloat saturate(float t)\n{\n return clamp(t, 0.0, 1.0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Add.glsl": /*!****************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Add.glsl ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid add(in float lfs, in float rhs, out float outValue) {\n outValue = lfs + rhs;\n}\nvoid add(in int lfs, in int rhs, out int outValue) {\n outValue = lfs + rhs;\n}\nvoid add(in vec2 lfs, in vec2 rhs, out vec2 outValue) {\n outValue = lfs + rhs;\n}\nvoid add(in vec3 lfs, in vec3 rhs, out vec3 outValue) {\n outValue = lfs + rhs;\n}\nvoid add(in vec4 lfs, in vec4 rhs, out vec4 outValue) {\n outValue = lfs + rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/AttributeColor.vert": /*!***************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/AttributeColor.vert ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nin vec4 a_color_0;\n\nvoid attributeColor(out vec4 outValue) {\n outValue = a_color_0;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/AttributeNormal.vert": /*!****************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/AttributeNormal.vert ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nin vec3 a_normal;\n\nvoid attributeNormal(out vec3 outValue) {\n outValue = a_normal;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/AttributePosition.vert": /*!******************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/AttributePosition.vert ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nin vec4 a_position;\n\nvoid attributePosition(out vec4 outValue) {\n outValue = a_position;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/AttributeTexcoord.vert": /*!******************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/AttributeTexcoord.vert ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nin vec2 a_texcoord_0;\n\nvoid attributeTexcoord(out vec2 outValue) {\n outValue = a_texcoord_0;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/DotProduct.glsl": /*!***********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/DotProduct.glsl ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid dotProduct(in vec2 lfs, in vec2 rhs, out float outValue) {\n outValue = dot(lfs, rhs);\n}\nvoid dotProduct(in vec3 lfs, in vec3 rhs, out float outValue) {\n outValue = dot(lfs, rhs);\n}\nvoid dotProduct(in vec4 lfs, in vec4 rhs, out float outValue) {\n outValue = dot(lfs, rhs);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Greater.glsl": /*!********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Greater.glsl ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid greater(in float lhs, in float rhs, out bool outValue) {\n outValue = lhs > rhs;\n}\n\nvoid greater(in int lhs, in int rhs, out bool outValue) {\n outValue = lhs > rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/MergeVector.glsl": /*!************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/MergeVector.glsl ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"void mergeVectorXYZ_W(in vec3 xyz, in float w, out vec4 outXYZW, out vec3 outXYZ, out vec2 outXY, out vec2 outZW) {\n outXYZW.x = xyz.x;\n outXYZW.y = xyz.y;\n outXYZW.z = xyz.z;\n outXYZW.w = w;\n outXYZ = xyz;\n outXY = xyz.xy;\n outZW = vec2(xyz.z, w);\n}\n\nvoid mergeVectorXY_ZW(in vec2 xy, in vec2 zw, out vec4 outXYZW, out vec3 outXYZ, out vec2 outXY, out vec2 outZW) {\n outXYZW.x = xy.x;\n outXYZW.y = xy.y;\n outXYZW.z = zw.x;\n outXYZW.w = zw.y;\n outXYZ = vec3(xy, zw.x);\n outXY = xy;\n outZW = zw;\n}\n\nvoid mergeVectorXY_Z_W(in vec2 xy, in float z, in float w, out vec4 outXYZW, out vec3 outXYZ, out vec2 outXY, out vec2 outZW) {\n outXYZW.x = xy.x;\n outXYZW.y = xy.y;\n outXYZW.z = z;\n outXYZW.w = w;\n outXYZ = vec3(xy, z);\n outXY = xy;\n outZW = vec2(z, w);\n}\n\nvoid mergeVectorZW_X_Y(in vec2 zw, in float x, in float y, out vec4 outXYZW, out vec3 outXYZ, out vec2 outXY, out vec2 outZW) {\n outXYZW.x = x;\n outXYZW.y = y;\n outXYZW.z = zw.x;\n outXYZW.w = zw.y;\n outXYZ = vec3(x, y, zw.x);\n outXY = vec2(x, y);\n outZW = zw;\n}\n\nvoid mergeVectorX_Y_Z_W(in float x, in float y, in float z, in float w, out vec4 outXYZW, out vec3 outXYZ, out vec2 outXY, out vec2 outZW) {\n outXYZW.x = x;\n outXYZW.y = y;\n outXYZW.z = z;\n outXYZW.w = w;\n outXYZ = vec3(x, y, z);\n outXY = vec2(x, y);\n outZW = vec2(z, w);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Multiply.glsl": /*!*********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Multiply.glsl ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid multiply(in float lfs, in float rhs, out float outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in int lfs, in int rhs, out int outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in vec2 lfs, in vec2 rhs, out vec2 outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in vec3 lfs, in vec3 rhs, out vec3 outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in vec4 lfs, in vec4 rhs, out vec4 outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in mat2 lfs, in mat2 rhs, out mat2 outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in mat3 lfs, in mat3 rhs, out mat3 outValue) {\n outValue = lfs * rhs;\n}\nvoid multiply(in mat4 lfs, in mat4 rhs, out mat4 outValue) {\n outValue = lfs * rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/NormalMatrix.vert": /*!*************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/NormalMatrix.vert ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid normalMatrix(out mat3 outValue) {\n outValue = get_normalMatrix(a_instanceInfo.x);\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Normalize.glsl": /*!**********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Normalize.glsl ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid _normalize(in vec2 value, out vec2 outValue) {\n outValue = normalize(value);\n}\n\nvoid _normalize(in vec3 value, out vec3 outValue) {\n outValue = normalize(value);\n}\n\nvoid _normalize(in vec4 value, out vec4 outValue) {\n outValue = normalize(value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/ProjectionMatrix.vert": /*!*****************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/ProjectionMatrix.vert ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid projectionMatrix(out mat4 outValue) {\n float cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID}*/];\n outValue = get_projectionMatrix(cameraSID, 0);\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Sin.glsl": /*!****************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Sin.glsl ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"void _sin(in float value, out float outValue) {\n outValue = sin(value);\n}\nvoid _sin(in vec2 value, out vec2 outValue) {\n outValue = sin(value);\n}\nvoid _sin(in vec3 value, out vec3 outValue) {\n outValue = sin(value);\n}\nvoid _sin(in vec4 value, out vec4 outValue) {\n outValue = sin(value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/SmoothStep.glsl": /*!***********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/SmoothStep.glsl ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"void _smoothstep(in float value, in float edge0, in float edge1, out float outValue) {\n outValue = smoothstep(edge0, edge1, value);\n}\nvoid _smoothstep(in vec2 value, in vec2 edge0, in vec2 edge1, out vec2 outValue) {\n outValue = smoothstep(edge0, edge1, value);\n}\nvoid _smoothstep(in vec3 value, in vec3 edge0, in vec3 edge1, out vec3 outValue) {\n outValue = smoothstep(edge0, edge1, value);\n}\nvoid _smoothstep(in vec4 value, in vec4 edge0, in vec4 edge1, out vec4 outValue) {\n outValue = smoothstep(edge0, edge1, value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/SplitVector.glsl": /*!************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/SplitVector.glsl ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"void splitVector(in vec4 xyzw, out vec3 outXYZ, out vec2 outXY, out vec2 outZW, out float outX, out float outY, out float outZ, out float outW) {\n outX = xyzw.x;\n outY = xyzw.y;\n outZ = xyzw.z;\n outW = xyzw.w;\n outXYZ = xyzw.xyz;\n outXY = xyzw.xy;\n outZW = xyzw.zw;\n}\n\nvoid splitVector(in vec3 xyz, out vec3 outXYZ, out vec2 outXY, out vec2 outZW, out float outX, out float outY, out float outZ, out float outW) {\n outX = xyz.x;\n outY = xyz.y;\n outZ = xyz.z;\n outW = 0.0;\n outXYZ = xyz;\n outXY = xyz.xy;\n outZW = vec2(xyz.z, 0.0);\n}\n\nvoid splitVector(in vec2 xy, out vec3 outXYZ, out vec2 outXY, out vec2 outZW, out float outX, out float outY, out float outZ, out float outW) {\n outX = xy.x;\n outY = xy.y;\n outZ = 0.0;\n outW = 0.0;\n outXYZ = vec3(xy, 0.0);\n outXY = xy;\n outZW = vec2(0.0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Step.glsl": /*!*****************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Step.glsl ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"void _step(in float value, in float edge, out float outValue) {\n outValue = step(edge, value);\n}\nvoid _step(in vec2 value, in vec2 edge, out vec2 outValue) {\n outValue = step(edge, value);\n}\nvoid _step(in vec3 value, in vec3 edge, out vec3 outValue) {\n outValue = step(edge, value);\n}\nvoid _step(in vec4 value, in vec4 edge, out vec4 outValue) {\n outValue = step(edge, value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Time.glsl": /*!*****************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Time.glsl ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid time(out float outValue) {\n outValue = get_time(0.0, 0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Transform.glsl": /*!**********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Transform.glsl ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"void transform(in mat2 lfs, in vec2 rhs, out vec2 outValue) {\n outValue = lfs * rhs;\n}\nvoid transform(in mat3 lfs, in vec3 rhs, out vec3 outValue) {\n outValue = lfs * rhs;\n}\nvoid transform(in mat4 lfs, in vec4 rhs, out vec4 outValue) {\n outValue = lfs * rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/ViewMatrix.vert": /*!***********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/ViewMatrix.vert ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid viewMatrix(out mat4 outValue) {\n float cameraSID = u_currentComponentSIDs[/* shaderity: @{WellKnownComponentTIDs.CameraComponentTID}*/];\n outValue = get_viewMatrix(cameraSID, 0);\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/Wireframe.glsl": /*!**********************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/Wireframe.glsl ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"bool wireframe(\n in vec4 existingFragColor,\n in vec4 wireframeColor,\n out vec4 outColor\n) {\n vec3 wireframeInfo = get_wireframe(a_instanceInfo.x);\n\n // Wireframe\n float threshold = 0.001;\n float wireframeWidthInner = wireframeInfo.z;\n float wireframeWidthRelativeScale = 1.0;\n if (wireframeInfo.x > 0.5 && wireframeInfo.y < 0.5) {\n outColor.a = 0.0;\n }\n vec4 wireframeResult = existingFragColor;\n float edgeRatio = edge_ratio(v_baryCentricCoord, wireframeWidthInner, wireframeWidthRelativeScale);\n float edgeRatioModified = mix(step(threshold, edgeRatio), clamp(edgeRatio*4.0, 0.0, 1.0), wireframeWidthInner / wireframeWidthRelativeScale/4.0);\n // if r0.a is 0.0, it is wireframe not on shaded\n wireframeResult.rgb = wireframeColor.rgb * edgeRatioModified + existingFragColor.rgb * (1.0 - edgeRatioModified);\n wireframeResult.a = max(existingFragColor.a, wireframeColor.a * mix(edgeRatioModified, pow(edgeRatioModified, 100.0), wireframeWidthInner / wireframeWidthRelativeScale/1.0));\n\n if (wireframeInfo.x > 0.5) {\n outColor = wireframeResult;\n if (wireframeInfo.y < 0.5 && existingFragColor.a == 0.0) {\n discard;\n }\n }\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgl/shaderity_shaders/nodes/WorldMatrix.vert": /*!************************************************************!*\ !*** ./src/webgl/shaderity_shaders/nodes/WorldMatrix.vert ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nvoid worldMatrix(out mat4 outValue) {\n outValue = get_worldMatrix(a_instanceInfo.x);\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.frag": /*!***********************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.frag ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\nstruct Light {\n lightType: i32, // 0 = directional, 1 = point, 2 = spot\n position: vec3,\n intensity: vec3,\n attenuatedIntensity: vec3,\n directionOfLightObject: vec3,\n direction: vec3, // direction of light vector, equal to normalize(light.pointToLight)\n pointToLight: vec3, // not normalized\n spotAngleScale: f32,\n spotAngleOffset: f32,\n effectiveRange: f32,\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfn getRangeAttenuation(light: Light) -> f32\n{\n let distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfn getSpotAttenuation(light: Light) -> f32\n{\n\n let cd = dot(light.directionOfLightObject, light.direction);\n let angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nfn getLightAttenuated(light: Light) -> Light {\n var newLight: Light = light;\n newLight.attenuatedIntensity = light.intensity;\n // if (light.lightType == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.lightType == 1)\n {\n newLight.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.lightType == 2)\n {\n newLight.attenuatedIntensity *= getSpotAttenuation(light);\n }\n\n return newLight;\n}\n\nfn getLight(lightIdx: u32, v_position_inWorld: vec3) -> Light {\n let lightPosition: vec3 = get_lightPosition(0u, lightIdx);\n let direction_and_w_of_LightObject: vec3 = get_lightDirection(0u, lightIdx);\n let lightIntensity: vec3 = get_lightIntensity(0u, lightIdx);\n let lightProperty: vec4 = get_lightProperty(0u, lightIdx);\n var light: Light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n let lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3f(0.0);\n light.lightType = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.lightType = 1;\n } else { // is Directional Light\n light.lightType = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.lightType = 2;\n }\n\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n let newLight = getLightAttenuated(light);\n\n return newLight;\n}\n\n#ifdef RN_USE_TANGENT\n fn getTBN(normal_inWorld: vec3f, input: VertexOutput, viewVector: vec3f, texcoord: vec2f, isFront: bool) -> mat3x3 {\n let tangent_inWorld = normalize(input.tangent_inWorld);\n let binormal_inWorld = normalize(input.binormal_inWorld);\n let tbnMat_tangent_to_world = mat3x3(tangent_inWorld, binormal_inWorld, normal_inWorld);\n\n return tbnMat_tangent_to_world;\n }\n#else\n // This is based on http://www.thetenthplanet.de/archives/1180\n fn cotangent_frame(normal_inWorld: vec3f, position: vec3f, uv_: vec2f, isFront: bool) -> mat3x3 {\n var uv: vec2f;\n if (isFront) {\n uv = uv_;\n } else {\n uv = -uv_;\n }\n\n // get edge vectors of the pixel triangle\n let dp1 = dpdx(position);\n let dp2 = dpdy(position);\n let duv1 = dpdx(uv);\n let duv2 = dpdy(uv);\n\n // solve the linear system\n let dp2perp = cross(dp2, normal_inWorld);\n let dp1perp = cross(normal_inWorld, dp1);\n let tangent = dp2perp * duv1.x + dp1perp * duv2.x;\n var bitangent = dp2perp * duv1.y + dp1perp * duv2.y;\n bitangent *= -1.0;\n\n // construct a scale-invariant frame\n let invMat = 1.0 / sqrt(max(dot(tangent, tangent), dot(bitangent, bitangent)));\n return mat3x3(tangent * invMat, bitangent * invMat, normal_inWorld);\n }\n\n fn getTBN(normal_inWorld: vec3f, input: VertexOutput, viewVector: vec3f, texcoord: vec2f, isFront: bool) -> mat3x3 {\n let tbnMat_tangent_to_world = cotangent_frame(normal_inWorld, -viewVector, texcoord, isFront);\n\n return tbnMat_tangent_to_world;\n }\n#endif\n\nfn srgbToLinear(srgbColor: vec3f) -> vec3f {\n return pow(srgbColor, vec3f(2.2));\n}\n\nfn linearToSrgb(linearColor: vec3f) -> vec3f {\n return pow(linearColor, vec3f(1.0/2.2));\n}\n\n// From: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/e2c7b8c8bd12916c1a387cd41f9ef061edc718df/source/Renderer/shaders/brdf.glsl#L44-L66\nfn Schlick_to_F0_F90(f: vec3f, f90: vec3f, VdotH: f32) -> vec3f {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = clamp(x * x2 * x2, 0.0, 0.9999);\n\n return (f - f90 * x5) / (1.0 - x5);\n}\n\nfn Schlick_to_F0_F90_F32(f: f32, f90: f32, VdotH: f32) -> f32 {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = clamp(x * x2 * x2, 0.0, 0.9999);\n\n return (f - f90 * x5) / (1.0 - x5);\n}\n\nfn Schlick_to_F0(f: vec3f, VdotH: f32) -> vec3f {\n return Schlick_to_F0_F90(f, vec3(1.0), VdotH);\n}\n\nfn Schlick_to_F0_F32(f: f32, VdotH: f32) -> f32 {\n return Schlick_to_F0_F90_F32(f, 1.0, VdotH);\n}\n\n\n// The Schlick Approximation to Fresnel\nfn fresnel(f0 : vec3f, f90 : vec3f, VdotH : f32) -> vec3f {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nfn fresnelF32(f0 : f32, f90 : f32, VdotH : f32) -> f32 {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nfn fresnel2(f0: vec3f, VdotH: f32) -> vec3f\n{\n let f90 = vec3f(1.0); //clamp(50.0 * f0, 0.0, 1.0);\n return fresnel(f0, f90, VdotH);\n}\n\nfn fresnel2F32(f0: f32, VdotH: f32) -> f32\n{\n let f90 = 1.0; //clamp(50.0 * f0, 0.0, 1.0);\n return fresnelF32(f0, f90, VdotH);\n}\n\n// Roughness Dependent Fresnel\n// https://www.jcgt.org/published/0008/01/03/paper.pdf\nfn fresnelSchlickRoughness(F0: vec3f, cosTheta: f32, roughness: f32) -> vec3f\n{\n let Fr = max(vec3f(1.0 - roughness), F0) - F0;\n let k_S = F0 + Fr * pow(1.0 - cosTheta, 5.0);\n return k_S;\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#diffuse-brdf\nfn BRDF_lambertian(albedo: vec3f, F: vec3f, specularWeight: f32) -> vec3f\n{\n return (vec3f(1.0) - specularWeight * F) * albedo * RECIPROCAL_PI;\n}\n\n\n// GGX NDF\nfn d_GGX(NH: f32, alphaRoughness: f32) -> f32 {\n let roughnessSqr = alphaRoughness * alphaRoughness;\n let f = (roughnessSqr - 1.0) * NH * NH + 1.0;\n return roughnessSqr / (M_PI * f * f);\n}\n\n// The code from https://google.github.io/filament/Filament.html#listing_approximatedspecularv\n// The idea is from [Heitz14] Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs.\nfn v_GGXCorrelated(NL: f32, NV: f32, alphaRoughness: f32) -> f32 {\n let a2 = alphaRoughness * alphaRoughness;\n let GGXV = NL * sqrt(NV * NV * (1.0 - a2) + a2);\n let GGXL = NV * sqrt(NL * NL * (1.0 - a2) + a2);\n return 0.5 / (GGXV + GGXL);\n}\n\nfn BRDF_specularGGX(NH: f32, NL: f32, NV: f32, F: vec3f, alphaRoughness: f32, specularWeight: f32) -> vec3f {\n let D = d_GGX(NH, alphaRoughness);\n let V = v_GGXCorrelated(NL, NV, alphaRoughness);\n return vec3f(D) * vec3f(V) * F * specularWeight;\n}\n\n// this is from https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nfn envBRDFApprox( Roughness: f32, NoV: f32 ) -> vec2f {\n let c0 = vec4f(-1, -0.0275, -0.572, 0.022 );\n let c1 = vec4f(1, 0.0425, 1.04, -0.04 );\n let r = Roughness * c0 + c1;\n let a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y;\n let AB = vec2f( -1.04, 1.04 ) * a004 + r.zw;\n\n return AB;\n}\n\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat#layering\nfn coated_material_s(base: vec3f, perceptualRoughness: f32, clearcoatRoughness: f32, clearcoat: f32, VdotNc: f32, LdotNc: f32, NdotHc: f32) -> vec3f {\n let clearcoatFresnel = 0.04 + (1.0 - 0.04) * pow(1.0 - abs(VdotNc), 5.0);\n let clearcoatAlpha = clearcoatRoughness * clearcoatRoughness;\n let alphaRoughness = perceptualRoughness * perceptualRoughness;\n let D = d_GGX(NdotHc, clearcoatAlpha);\n let V = v_GGXCorrelated(LdotNc, VdotNc, clearcoatAlpha);\n let f_clearcoat = clearcoatFresnel * D * V;\n\n // base = (f_diffuse + f_specular) in https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat#layering\n return base * vec3f(1.0 - clearcoat * clearcoatFresnel) + vec3f(f_clearcoat * clearcoat);\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#implementation-notes\nfn specular_btdf(alphaRoughness: f32, NdotL: f32, NdotV: f32, NdotHt: f32) -> f32 {\n let V = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n let D = d_GGX(NdotHt, alphaRoughness);\n return V * D;\n}\n\n\n////////////////////////////////////////\n// glTF KHR_materials_volume\n////////////////////////////////////////\n\n#ifdef RN_USE_VOLUME\n// https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md#attenuation\nfn volumeAttenuation(attenuationColor: vec3f, attenuationDistance: f32, intensity: vec3f, transmissionDistance: f32) -> vec3f\n{\n if (attenuationDistance == 0.0) { // means Infinite distance\n return intensity; // No attenuation\n } else {\n let attenuationCo: vec3f = -log(attenuationColor) / attenuationDistance;\n let attenuatedTransmittance: vec3f = exp(-attenuationCo * transmissionDistance);\n return intensity * attenuatedTransmittance;\n }\n}\n#endif\n\n\n////////////////////////////////////////\n// glTF KHR_materials_anisotropy\n////////////////////////////////////////\n#ifdef RN_USE_ANISOTROPY\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\nfn D_GGX_anisotropic(NdotH: f32, TdotH: f32, BdotH: f32, at: f32, ab: f32) -> f32\n{\n let a2 = at * ab;\n let f = vec3f(ab * TdotH, at * BdotH, a2 * NdotH);\n let w2 = a2 / dot(f, f);\n return a2 * w2 * w2 / M_PI;\n}\n\nfn V_GGX_anisotropic(NdotL: f32, NdotV: f32, BdotV: f32, TdotV: f32, TdotL: f32, BdotL: f32,\n at: f32, ab: f32) -> f32\n{\n let GGXV = NdotL * length(vec3(at * TdotV, ab * BdotV, NdotV));\n let GGXL = NdotV * length(vec3(at * TdotL, ab * BdotL, NdotL));\n let v = 0.5 / (GGXV + GGXL);\n return clamp(v, 0.0, 1.0);\n}\n\nfn BRDF_specularAnisotropicGGX(F: vec3f, alphaRoughness: f32,\n VdotH: f32, NdotL: f32, NdotV: f32, NdotH: f32, BdotV: f32, TdotV: f32,\n TdotL: f32, BdotL: f32, TdotH: f32, BdotH: f32, anisotropy: f32) -> vec3f\n{\n let at = mix(alphaRoughness, 1.0, anisotropy * anisotropy);\n let ab = alphaRoughness;\n\n let V = V_GGX_anisotropic(NdotL, NdotV, BdotV, TdotV, TdotL, BdotL, at, ab);\n let D = D_GGX_anisotropic(NdotH, TdotH, BdotH, at, ab);\n\n return F * V * D;\n}\n#endif\n\n////////////////////////////////////////\n// glTF KHR_materials_sheen\n////////////////////////////////////////\n\n#ifdef RN_USE_SHEEN\nfn d_Charlie(sheenPerceptualRoughness: f32, NoH: f32) -> f32 {\n // Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n let alphaG = sheenPerceptualRoughness * sheenPerceptualRoughness;\n let invAlpha = 1.0 / alphaG;\n let cos2h = NoH * NoH;\n let sin2h = 1.0 - cos2h;\n return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * M_PI);\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen#sheen-visibility\nfn sheenSimpleVisibility(NdotL: f32, NdotV: f32) -> f32 {\n return 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV));\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen#sheen-visibility\nfn charlieL(x: f32, alphaG: f32) -> f32 {\n let oneMinusAlphaSq = (1.0 - alphaG) * (1.0 - alphaG);\n let a = mix(21.5473, 25.3245, oneMinusAlphaSq);\n let b = mix(3.82987, 3.32435, oneMinusAlphaSq);\n let c = mix(0.19823, 0.16801, oneMinusAlphaSq);\n let d = mix(-1.97760, -1.27393, oneMinusAlphaSq);\n let e = mix(-4.32054, -4.85967, oneMinusAlphaSq);\n return a / (1.0 + b * pow(x, c)) + d * x + e;\n}\n\nfn lambdaSheen(cosTheta: f32, alphaG: f32) -> f32\n{\n return select(exp(2.0 * charlieL(0.5, alphaG) - charlieL(1.0 - cosTheta, alphaG)), exp(charlieL(cosTheta, alphaG)), abs(cosTheta) < 0.5);\n}\n\nfn sheenCharlieVisibility(NdotL: f32, NdotV: f32, sheenPerceptualRoughness: f32) -> f32 {\n let alphaG = sheenPerceptualRoughness * sheenPerceptualRoughness;\n let sheenVisibility = 1.0 / ((1.0 + lambdaSheen(NdotV, alphaG) + lambdaSheen(NdotL, alphaG)) * (4.0 * NdotV * NdotL));\n return sheenVisibility;\n}\n\nfn sheen_brdf(sheenColor: vec3f, sheenPerceptualRoughness: f32, NdotL: f32, NdotV: f32, NdotH: f32) -> vec3f {\n let sheenDistribution = d_Charlie(sheenPerceptualRoughness, NdotH);\n let sheenVisibility = sheenCharlieVisibility(NdotL, NdotV, sheenPerceptualRoughness);\n return sheenColor * sheenDistribution * sheenVisibility;\n}\n#endif // RN_USE_SHEEN\n\n////////////////////////////////////////\n// glTF KHR_materials_irirdescence\n////////////////////////////////////////\n\n#ifdef RN_USE_IRIDESCENCE\n// XYZ to REC709(sRGB) conversion matrix\nconst XYZ_TO_REC709 = mat3x3(\n 3.2404542, -0.9692660, 0.0556434,\n -1.5371385, 1.8760108, -0.2040259,\n -0.4985314, 0.0415560, 1.0572252\n);\n\nfn fresnelSchlickRoughnessWithIridescence(\n F0: vec3f, cosTheta: f32, roughness: f32,\n iridescenceFresnel: vec3f, iridescence: f32\n ) -> vec3f\n{\n let Fr = max(vec3f(1.0 - roughness), F0) - F0;\n let k_S = mix(F0 + Fr * pow(1.0 - cosTheta, 5.0), iridescenceFresnel, iridescence);\n return k_S;\n}\n\n// Assume air interface for top\nfn Fresnel0ToIor(F0: vec3f) -> vec3f {\n let sqrtF0 = sqrt(F0);\n return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0);\n}\n\n// Conversion from IOR to F0\n// ior is a value between 1.0 and 3.0. 1.0 is air interface\nfn IorToFresnel0Vec3f(transmittedIor: vec3f, incidentIor: f32) -> vec3f {\n return sqVec3f((transmittedIor - vec3f(incidentIor)) / (transmittedIor + vec3(incidentIor)));\n}\nfn IorToFresnel0F32(transmittedIor: f32, incidentIor: f32) -> f32 {\n return sqF32((transmittedIor - incidentIor) / (transmittedIor + incidentIor));\n}\n\n/**\n * From: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence#analytic-spectral-integration\n */\nfn evalSensitivity(OPD: f32, shift: vec3f) -> vec3f {\n let phase = 2.0 * M_PI * OPD * 1.0e-9;\n let val = vec3f(5.4856e-13, 4.4201e-13, 5.2481e-13);\n let pos = vec3f(1.6810e+06, 1.7953e+06, 2.2084e+06);\n let var_ = vec3f(4.3278e+09, 9.3046e+09, 6.6121e+09);\n\n var xyz = val * sqrt(2.0 * M_PI * var_) * cos(pos * phase + shift) * exp(-(phase * phase) * var_);\n xyz.x += 9.7470e-14 * sqrt(2.0 * M_PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * (phase * phase));\n xyz /= 1.0685e-7;\n\n let rgb = XYZ_TO_REC709 * xyz;\n return rgb;\n}\n\n/**\n * From: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence#iridescence-fresnel\n */\nfn calcIridescence(outsideIor: f32, eta2: f32, cosTheta1: f32, thinFilmThickness: f32, baseF0: vec3f) -> vec3f {\n\n\n // iridescenceIor is the index of refraction of the thin-film layer\n // Force iridescenceIor -> outsideIOR when thinFilmThickness -> 0.0\n let iridescenceIor = mix(outsideIor, eta2, smoothstep(0.0, 0.03, thinFilmThickness));\n\n // To calculate the reflectances R12 and R23 at the viewing angles (angle hitting the thin-film layer)\n // and (angle after refraction in the thin-film) Schlick Fresnel is again used.\n // This approximation allows to eliminate the split into S and P polarization for the exact Fresnel equations.\n // can be calculated using Snell's law (with being outsideIor and being iridescenceIor):\n let sinTheta2Sq = sqF32(outsideIor / iridescenceIor) * (1.0 - sqF32(cosTheta1));\n let cosTheta2Sq = 1.0 - sinTheta2Sq;\n\n // Handle total internal reflection\n if (cosTheta2Sq < 0.0) {\n return vec3f(1.0);\n }\n\n let cosTheta2 = sqrt(cosTheta2Sq);\n\n /// Material Interfaces\n // The iridescence model defined by Belcour/Barla models two material interfaces\n // - one from the outside to the thin-film layer\n // and another one from the thin-film to the base material. These two interfaces are defined as follows:\n\n // First interface (from the outside to the thin-film layer)\n let R0 = IorToFresnel0F32(iridescenceIor, outsideIor);\n let R12 = fresnel2F32(R0, cosTheta1);\n let R21 = R12;\n let T121 = 1.0 - R12;\n\n // Second interface (from the thin-film to the base material)\n let baseIor = Fresnel0ToIor(baseF0 + 0.0001); // guard against 1.0\n let R1 = IorToFresnel0Vec3f(baseIor, iridescenceIor);\n let R23 = fresnel2(R1, cosTheta2);\n\n // phi12 and phi23 define the base phases per interface and are approximated with 0.0\n // if the IOR of the hit material (iridescenceIor or baseIor) is higher\n // than the IOR of the previous material (outsideIor or iridescenceIor) and π otherwise.\n // Also here, polarization is ignored. float phi12 = 0.0;\n\n // First interface (from the outside to the thin-film layer)\n var phi12 = 0.0;\n if (iridescenceIor < outsideIor) { phi12 = M_PI; }\n let phi21 = M_PI - phi12;\n\n // Second interface (from the thin-film to the base material)\n var phi23 = vec3f(0.0);\n if (baseIor[0] < iridescenceIor) { phi23[0] = M_PI; }\n if (baseIor[1] < iridescenceIor) { phi23[1] = M_PI; }\n if (baseIor[2] < iridescenceIor) { phi23[2] = M_PI; }\n\n // OPD (optical path difference)\n let OPD = 2.0 * iridescenceIor * thinFilmThickness * cosTheta2;\n // Phase shift\n let phi = vec3f(phi21) + phi23;\n\n // Compound terms\n let R123 = clamp(R12 * R23, vec3f(1e-5), vec3f(0.9999));\n let r123 = sqrt(R123);\n let Rs = (T121 * T121) * R23 / (vec3f(1.0) - R123);\n\n // Reflectance term for m = 0 (DC term amplitude)\n let C0 = R12 + Rs;\n var I = C0;\n\n // Reflectance term for m > 0 (pairs of diracs)\n var Cm = Rs - T121;\n for (var m = 1; m <= 2; m++)\n {\n Cm *= r123;\n let Sm = 2.0 * evalSensitivity(f32(m) * OPD, f32(m) * phi);\n I += Cm * Sm;\n }\n\n let F_iridescence = max(I, vec3f(0.0));\n\n return F_iridescence;\n}\n\n//https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB\nfn BRDF_lambertianIridescence(f0: vec3f, f90: vec3f, iridescenceFresnel: vec3f, iridescenceFactor: f32, diffuseColor: vec3f, specularWeight: f32, VdotH: f32) -> vec3f\n{\n let iridescenceFresnelMax = vec3f(max(max(iridescenceFresnel.r, iridescenceFresnel.g), iridescenceFresnel.b));\n\n let schlickFresnel = Schlick_to_F0_F90(f0, f90, VdotH);\n\n let F = mix(schlickFresnel, iridescenceFresnelMax, iridescenceFactor);\n\n // see https://seblagarde.wordpress.com/2012/01/08/pi-or-not-to-pi-in-game-lighting-equation/\n return (1.0 - specularWeight * F) * (diffuseColor / M_PI);\n}\n\nfn BRDF_specularGGXIridescence(f0: vec3f, f90: vec3f, iridescenceFresnel: vec3f, alphaRoughness: f32, iridescenceFactor: f32, specularWeight: f32, VdotH: f32, NdotL: f32, NdotV: f32, NdotH: f32) -> vec3f\n{\n let F = mix(Schlick_to_F0_F90(f0, f90, VdotH), iridescenceFresnel, iridescenceFactor);\n let Vis = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n let D = d_GGX(NdotH, alphaRoughness);\n\n return specularWeight * F * Vis * D;\n}\n\n#endif // RN_USE_IRIDESCENCE\n\n\n////////////////////////////////////////\n// lighting with a punctual light\n////////////////////////////////////////\nfn lightingWithPunctualLight(\n light: Light,\n normal_inWorld: vec3f,\n viewDirection: vec3f,\n NdotV: f32,\n albedo: vec3f,\n perceptualRoughness: f32,\n F0: vec3f,\n F90: vec3f,\n transmission: f32,\n ior: f32,\n clearcoat: f32,\n clearcoatRoughness: f32,\n clearcoatNormal_inWorld: vec3f,\n VdotNc: f32,\n attenuationColor: vec3f,\n attenuationDistance: f32,\n anisotropy: f32,\n anisotropicT: vec3f,\n anisotropicB: vec3f,\n BdotV: f32,\n TdotV: f32,\n sheenColor: vec3f,\n sheenRoughness: f32,\n albedoSheenScalingNdotV: f32,\n iridescenceFactor: f32,\n iridescenceFresnel: vec3f,\n specularWeight: f32,\n ) -> vec3f\n{\n let alphaRoughness = perceptualRoughness * perceptualRoughness;\n\n // Fresnel\n let halfVector = normalize(light.direction + viewDirection);\n let VdotH = dot(viewDirection, halfVector);\n let F = fresnel(F0, F90, VdotH);\n\n let NdotL = clamp(dot(normal_inWorld, light.direction), Epsilon, 1.0);\n\n // Diffuse\n#ifdef RN_USE_IRIDESCENCE\n let diffuseBrdf = BRDF_lambertianIridescence(F0, F90, iridescenceFresnel, iridescenceFactor, albedo, specularWeight, VdotH);\n#else\n let diffuseBrdf = BRDF_lambertian(albedo, F, specularWeight);\n#endif\n let pureDiffuse = diffuseBrdf * vec3f(NdotL) * light.attenuatedIntensity;\n\n#ifdef RN_USE_TRANSMISSION\n let refractionVector = refract(-viewDirection, normal_inWorld, 1.0 / ior);\n var transmittedLightFromUnderSurface: Light = light;\n transmittedLightFromUnderSurface.pointToLight -= refractionVector;\n let transmittedLightDirectionFromUnderSurface = normalize(transmittedLightFromUnderSurface.pointToLight);\n transmittedLightFromUnderSurface.direction = transmittedLightDirectionFromUnderSurface;\n\n let Ht = normalize(viewDirection + transmittedLightFromUnderSurface.direction);\n let NdotHt = saturateEpsilonToOne(dot(normal_inWorld, Ht));\n let NdotLt = saturateEpsilonToOne(dot(normal_inWorld, transmittedLightFromUnderSurface.direction));\n\n var transmittedContrib = (vec3f(1.0) - F) * specular_btdf(alphaRoughness, NdotLt, NdotV, NdotHt) * albedo * transmittedLightFromUnderSurface.attenuatedIntensity;\n\n#ifdef RN_USE_VOLUME\n transmittedContrib = volumeAttenuation(attenuationColor, attenuationDistance, transmittedContrib, length(transmittedLightFromUnderSurface.pointToLight));\n#endif // RN_USE_VOLUME\n\n let diffuseContrib = mix(pureDiffuse, vec3f(transmittedContrib), transmission);\n#else\n let diffuseContrib = pureDiffuse;\n#endif // RN_USE_TRANSMISSION\n\n // Specular\n let NdotH = saturateEpsilonToOne(dot(normal_inWorld, halfVector));\n\n\n#ifdef RN_USE_IRIDESCENCE\n let specularContrib = BRDF_specularGGXIridescence(F0, F90, iridescenceFresnel, alphaRoughness, iridescenceFactor, specularWeight, VdotH, NdotL, NdotV, NdotH) * vec3f(NdotL) * light.attenuatedIntensity;\n#elif defined(RN_USE_ANISOTROPY)\n let TdotL = dot(anisotropicT, light.direction);\n let BdotL = dot(anisotropicB, light.direction);\n let TdotH = dot(anisotropicT, halfVector);\n let BdotH = dot(anisotropicB, halfVector);\n let specularContrib = BRDF_specularAnisotropicGGX(F, alphaRoughness, VdotH, NdotL, NdotV, NdotH, BdotV, TdotV, TdotL, BdotL, TdotH, BdotH, anisotropy) * vec3f(NdotL) * light.attenuatedIntensity;\n#else\n let specularContrib = BRDF_specularGGX(NdotH, NdotL, NdotV, F, alphaRoughness, specularWeight) * vec3f(NdotL) * light.attenuatedIntensity;\n#endif\n\n // Base Layer\n let baseLayer = diffuseContrib + specularContrib;\n\n#ifdef RN_USE_SHEEN\n // Sheen\n let sheenContrib = sheen_brdf(sheenColor, sheenRoughness, NdotL, NdotV, NdotH) * NdotL * light.attenuatedIntensity;\n let albedoSheenScaling = min(\n albedoSheenScalingNdotV,\n 1.0 - max3(sheenColor) * textureSample(sheenLutTexture, sheenLutSampler, vec2(NdotL, sheenRoughness)).r);\n let color = sheenContrib + baseLayer * albedoSheenScaling;\n#else\n let color = baseLayer;\n let albedoSheenScaling = 1.0;\n#endif // RN_USE_SHEEN\n\n#ifdef RN_USE_CLEARCOAT\n // Clear Coat Layer\n let NdotHc = saturateEpsilonToOne(dot(clearcoatNormal_inWorld, halfVector));\n let LdotNc = saturateEpsilonToOne(dot(light.direction, clearcoatNormal_inWorld));\n let coated = coated_material_s(color, perceptualRoughness,\n clearcoatRoughness, clearcoat, VdotNc, LdotNc, NdotHc);\n let finalColor = coated;\n#else\n let finalColor = color;\n#endif // RN_USE_CLEARCOAT\n\n return finalColor;\n}\n\nfn IsotropicNDFFiltering(normal: vec3f, roughness2: f32) -> f32 {\n let SIGMA2 = 0.15915494;\n let KAPPA = 0.18;\n let dndu = dpdx(normal);\n let dndv = dpdy(normal);\n let kernelRoughness2 = SIGMA2 * (dot(dndu, dndu) + dot(dndv, dndv));\n let clampedKernelRoughness2 = min(kernelRoughness2, KAPPA);\n let filteredRoughness2 = saturate(roughness2 + clampedKernelRoughness2);\n return filteredRoughness2;\n}\n\n\n// #param shadingModel: u32; // initialValue=0\n// #param alphaCutoff: f32; // initialValue=0.01\n// #param shininess: f32; // initialValue=5\n// #param diffuseColorFactor: vec4; // initialValue=(1,1,1,1)\n@group(1) @binding(0) var diffuseColorTexture: texture_2d; // initialValue=white\n@group(2) @binding(0) var diffuseColorSampler: sampler;\n@group(1) @binding(1) var normalTexture: texture_2d; // initialValue=blue\n@group(2) @binding(1) var normalSampler: sampler;\n// #param diffuseColorTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param diffuseColorTextureRotation: f32; // initialValue=0\n@group(1) @binding(2) var depthTexture: texture_2d; // initialValue=white\n@group(2) @binding(2) var depthSampler: sampler;\n\n@fragment\nfn main (\n input: VertexOutput,\n @builtin(front_facing) isFront: bool,\n) -> @location(0) vec4 {\n\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n // Normal\n let normal_inWorld = normalize(input.normal_inWorld);\n\n let diffuseColorFactor = get_diffuseColorFactor(materialSID, 0);\n\n // diffuseColor (Considered to be premultiplied alpha)\n var diffuseColor = vec3f(1.0, 1.0, 1.0);\n var alpha = 1.0;\n#ifdef RN_USE_COLOR_0\n diffuseColor = input.color_0.rgb;\n alpha = input.color_0.a;\n#endif\n diffuseColor *= diffuseColorFactor.rgb;\n alpha *= diffuseColorFactor.a;\n\n#ifdef RN_USE_TEXCOORD_0\n // diffuseColorTexture (Considered to be premultiplied alpha)\n let diffuseColorTextureTransform = get_diffuseColorTextureTransform(materialSID, 0);\n let diffuseColorTextureRotation = get_diffuseColorTextureRotation(materialSID, 0);\n let diffuseColorTexUv = uvTransform(diffuseColorTextureTransform.xy, diffuseColorTextureTransform.zw, diffuseColorTextureRotation, input.texcoord_0);\n let textureColor = textureSample(diffuseColorTexture, diffuseColorSampler, diffuseColorTexUv);\n diffuseColor *= textureColor.rgb;\n alpha *= textureColor.a;\n#endif\n\n#ifdef RN_IS_ALPHA_MODE_MASK\n let alphaCutoff = get_alphaCutoff(materialSID, 0);\n if (baseColor.a < alphaCutoff) {\n discard;\n }\n#endif\n\n\n // Lighting\n var shadingColor = vec3f(0.0, 0.0, 0.0);\n#ifdef RN_IS_LIGHTING\n let shadingModel = get_shadingModel(materialSID, 0);\n if (shadingModel > 0) {\n\n var diffuse = vec3(0.0, 0.0, 0.0);\n var specular = vec3(0.0, 0.0, 0.0);\n let lightNumber = u32(get_lightNumber(0u, 0u));\n for (var i = 0u; i < lightNumber ; i++) {\n\n // Light\n let light: Light = getLight(i, input.position_inWorld.xyz);\n\n // Diffuse\n diffuse += diffuseColor * max(0.0, dot(normal_inWorld, light.direction)) * light.attenuatedIntensity;\n\n let shininess = get_shininess(materialSID, 0);\n let shadingModel = get_shadingModel(materialSID, 0);\n\n let viewPosition = get_viewPosition(cameraSID, 0);\n\n // Specular\n if (shadingModel == 2) {// BLINN\n // ViewDirection\n let viewDirection = normalize(viewPosition - input.position_inWorld.xyz);\n let halfVector = normalize(light.direction + viewDirection);\n specular += pow(max(0.0, dot(halfVector, normal_inWorld)), shininess);\n } else if (shadingModel == 3) { // PHONG\n let viewDirection = normalize(viewPosition - input.position_inWorld.xyz);\n let R = reflect(light.direction, normal_inWorld);\n specular += pow(max(0.0, dot(R, viewDirection)), shininess);\n }\n\n }\n\n shadingColor = diffuse + specular;\n } else {\n shadingColor = diffuseColor;\n }\n#else\n shadingColor = diffuseColor;\n#endif\n\n // Shadow\n// #ifdef RN_USE_SHADOW_MAPPING\n// float visibility = 1.0;\n// float bias = 0.001;\n\n// // Non PCF\n// if ( textureProj( u_depthTexture, v_shadowCoord ).r < (v_shadowCoord.z - bias) / v_shadowCoord.w ) {\n// visibility = 0.5;\n// }\n// shadingColor *= visibility;\n\n// // Hardware PCF\n// // vec4 shadowCoord = v_shadowCoord;\n// // shadowCoord.z -= bias;\n// // shadingColor *= textureProj( u_depthTexture, shadowCoord ) * 0.5 + 0.5;\n\n// alpha = 1.0;\n// #endif\n\n#ifdef RN_IS_ALPHA_MODE_BLEND\n#else\n alpha = 1.0;\n#endif\n\n var finalColor = vec4f(shadingColor * alpha, alpha);\n // rt0 = vec4(u_lightNumber, 0.0, 0.0, 1.0);\n // rt0 = vec4(1.0, 0.0, 0.0, 1.0);\n // rt0 = vec4(normal_inWorld*0.5+0.5, 1.0);\n\n return finalColor;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert": /*!***********************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n\n#ifdef RN_IS_SKINNING\n\nfn createMatrixFromQuaternionTranslationScale( quaternion: vec4, translation: vec3, scale: vec3 ) -> mat4x4 {\n let q = quaternion;\n let t = translation;\n\n let sx = q.x * q.x;\n let sy = q.y * q.y;\n let sz = q.z * q.z;\n let cx = q.y * q.z;\n let cy = q.x * q.z;\n let cz = q.x * q.y;\n let wx = q.w * q.x;\n let wy = q.w * q.y;\n let wz = q.w * q.z;\n\n let mat = mat4x4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n let uniformScaleMat = mat4x4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n let mat44 = mat*uniformScaleMat;\n return mat44;\n\n}\n\nfn unpackedVec2ToNormalizedVec4(vec_xy: vec2, criteria: f32) -> vec4 {\n\n var r: f32;\n var g: f32;\n var b: f32;\n var a: f32;\n\n let ix = floor(vec_xy.x * criteria);\n let v1x = ix / criteria;\n let v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n let iy = floor( vec_xy.y * criteria);\n let v2x = iy / criteria;\n let v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nfn get_boneMatrixAsMat4x4(skeletalComponentSID: u32, joint: u32) -> mat4x4 {\n let mat43: mat4x3 = get_boneMatrix(skeletalComponentSID, joint);\n return mat4x4(\n vec4(mat43[0], 0.0),\n vec4(mat43[1], 0.0),\n vec4(mat43[2], 0.0),\n vec4(mat43[3], 1.0)\n );\n}\n\nfn getSkinMatrix(skeletalComponentSID: u32, joint: vec4, weight: vec4) -> mat4x4 {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n var skinMat: mat4x4 = weight.x * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.x);\n skinMat += weight.y * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.y);\n skinMat += weight.z * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.z);\n skinMat += weight.w * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.w);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n let criteria = vec2(4096.0, 4096.0);\n\n let tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, joint.x);\n let sq_x = get_boneScalePackedQuat(skeletalComponentSID, joint.x);\n var quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n let tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, joint.y);\n let sq_y = get_boneScalePackedQuat(skeletalComponentSID, joint.y);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n let tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, joint.z);\n let sq_z = get_boneScalePackedQuat(skeletalComponentSID, joint.z);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n let tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, joint.w);\n let sq_w = get_boneScalePackedQuat(skeletalComponentSID, joint.w);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n let ts_x = get_boneTranslateScale(skeletalComponentSID, joint.x);\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.x), ts_x.xyz, vec3(ts_x.w));\n let ts_y = get_boneTranslateScale(skeletalComponentSID, joint.y);\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.y), ts_y.xyz, vec3(ts_y.w));\n let ts_z = get_boneTranslateScale(skeletalComponentSID, joint.z);\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.z), ts_z.xyz, vec3(ts_z.w));\n let ts_w = get_boneTranslateScale(skeletalComponentSID, joint.w);\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.w), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n let boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, joint.x);\n let boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, joint.y);\n let boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, joint.z);\n let boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, joint.w);\n\n let criteria = vec2(4096.0, 4096.0);\n let boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n let ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n let ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n let ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n let ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\nfn toNormalMatrix(m: mat4x4) -> mat3x3 {\n let a00 = m[0][0];\n let a01 = m[0][1];\n let a02 = m[0][2];\n let a03 = m[0][3];\n let a10 = m[1][0];\n let a11 = m[1][1];\n let a12 = m[1][2];\n let a13 = m[1][3];\n let a20 = m[2][0];\n let a21 = m[2][1];\n let a22 = m[2][2];\n let a23 = m[2][3];\n let a30 = m[3][0];\n let a31 = m[3][1];\n let a32 = m[3][2];\n let a33 = m[3][3];\n\n let b00 = a00 * a11 - a01 * a10;\n let b01 = a00 * a12 - a02 * a10;\n let b02 = a00 * a13 - a03 * a10;\n let b03 = a01 * a12 - a02 * a11;\n let b04 = a01 * a13 - a03 * a11;\n let b05 = a02 * a13 - a03 * a12;\n let b06 = a20 * a31 - a21 * a30;\n let b07 = a20 * a32 - a22 * a30;\n let b08 = a20 * a33 - a23 * a30;\n let b09 = a21 * a32 - a22 * a31;\n let b10 = a21 * a33 - a23 * a31;\n let b11 = a22 * a33 - a23 * a32;\n\n let determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3x3(\n (a11 * b11 - a12 * b10 + a13 * b09) / determinantVal,\n (a12 * b08 - a10 * b11 - a13 * b07) / determinantVal,\n (a10 * b10 - a11 * b08 + a13 * b06) / determinantVal,\n (a02 * b10 - a01 * b11 - a03 * b09) / determinantVal,\n (a00 * b11 - a02 * b08 + a03 * b07) / determinantVal,\n (a01 * b08 - a00 * b10 - a03 * b06) / determinantVal,\n (a31 * b05 - a32 * b04 + a33 * b03) / determinantVal,\n (a32 * b02 - a30 * b05 - a33 * b01) / determinantVal,\n (a30 * b04 - a31 * b02 + a33 * b00) / determinantVal\n );\n}\n\nstruct GeometoryOutput {\n normalMatrix: mat3x3,\n position_inWorld: vec4,\n normal_inWorld: vec3,\n isSkinning: bool,\n}\n\n#ifdef RN_IS_SKINNING\nfn skinning(\n skeletalComponentSID: u32,\n inNormalMatrix: mat3x3,\n inPosition_inLocal: vec3,\n inNormal_inLocal: vec3,\n joint: vec4,\n weight: vec4,\n ) -> GeometoryOutput\n{\n var output: GeometoryOutput;\n let skinMat = getSkinMatrix(skeletalComponentSID, joint, weight);\n output.position_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n output.normalMatrix = toNormalMatrix(skinMat);\n output.normal_inWorld = normalize(output.normalMatrix * inNormal_inLocal);\n output.isSkinning = true;\n\n return output;\n}\n#endif\n\n\nfn processGeometryWithMorphingAndSkinning(\n skeletalComponentSID: i32,\n blendShapeComponentSID: u32,\n worldMatrix: mat4x4,\n viewMatrix: mat4x4,\n isBillboard: bool,\n inNormalMatrix: mat3x3,\n inPosition_inLocal: vec3,\n inNormal_inLocal: vec3,\n baryCentricCoord: vec4,\n joint: vec4,\n weight: vec4,\n) -> GeometoryOutput {\n var output: GeometoryOutput;\n\n var position_inLocal: vec3;\n#ifdef RN_IS_MORPHING\n if (_morphTargetNumber == 0u) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n let vertexIdx = u32(baryCentricCoord.w);\n position_inLocal = get_position(vertexIdx, inPosition_inLocal, blendShapeComponentSID);\n }\n#endif\n\n var worldMatrixInner = worldMatrix;\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0) {\n output = skinning(u32(skeletalComponentSID), inNormalMatrix, position_inLocal, inNormal_inLocal, joint, weight);\n } else {\n#endif\n output.normalMatrix = inNormalMatrix;\n output.position_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n output.normal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n output.isSkinning = false;\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return output;\n}\n\n\n// BiasMatrix * LightProjectionMatrix * LightViewMatrix, See: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/#basic-shader\n// #param depthBiasPV: mat4x4; // initialValue=(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)\n\n@vertex\nfn main(\n#ifdef RN_USE_INSTANCE\n @location(8) instance_ids: vec4,\n#endif\n\n\n#ifdef RN_USE_POSITION_FLOAT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_INT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_UINT\n @location(0) position: vec3,\n#endif\n\n#ifdef RN_USE_NORMAL\n @location(1) normal: vec3,\n#endif\n#ifdef RN_USE_TANGENT\n @location(2) tangent: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_0\n @location(3) texcoord_0: vec2,\n#endif\n#ifdef RN_USE_TEXCOORD_1\n @location(4) texcoord_1: vec2,\n#endif\n\n#ifdef RN_USE_COLOR_0_FLOAT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_INT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_UINT\n @location(5) color_0: vec4,\n#endif\n\n#ifdef RN_USE_JOINTS_0\n @location(6) joints_0: vec4,\n#endif\n#ifdef RN_USE_WEIGHTS_0\n @location(7) weights_0: vec4,\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n @location(10) baryCentricCoord: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_2\n @location(11) texcoord_2: vec2,\n#endif\n @builtin(vertex_index) vertexIdx : u32,\n\n\n) -> VertexOutput {\n\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var output : VertexOutput;\n let instanceId = u32(instance_ids.x);\n\n let worldMatrix = get_worldMatrix(instanceId);\n let viewMatrix = get_viewMatrix(cameraSID, 0);\n let projectionMatrix = get_projectionMatrix(cameraSID, 0);\n let normalMatrix = get_normalMatrix(instanceId);\n // let isBillboard = get_isBillboard(instanceId);\n\n let skeletalComponentSID = i32(instance_ids.y);\n let blendShapeComponentSID = u32(instance_ids.z);\n\n\n#ifdef RN_USE_NORMAL\n#else\n let normal = vec3(0.0, 0.0, 0.0);\n#endif\n\n#ifdef RN_USE_JOINTS_0\n let joint = joints_0;\n#else\n let joint = vec4(0, 0, 0, 0);\n#endif\n#ifdef RN_USE_WEIGHTS_0\n let weight = weights_0;\n#else\n let weight = vec4(0.0, 0.0, 0.0, 0.0);\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n#else\n let baryCentricCoord = vec4(0.0, 0.0, 0.0, 0.0);\n#endif\n\n // Skeletal\n let geom = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n blendShapeComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n position,\n normal,\n baryCentricCoord,\n joint,\n weight\n );\n\n output.position = projectionMatrix * viewMatrix * geom.position_inWorld;\n output.position_inWorld = geom.position_inWorld.xyz;\n\n#ifdef RN_USE_COLOR_0\n output.color_0 = vec4f(color_0);\n#else\n output.color_0 = vec4f(1.0, 1.0, 1.0, 1.0);\n#endif\n\n output.normal_inWorld = normalMatrix * normal;\n\n#ifdef RN_USE_TEXCOORD_0\n output.texcoord_0 = texcoord_0;\n#endif\n#ifdef RN_USE_TEXCOORD_1\n output.texcoord_1 = texcoord_1;\n#endif\n#ifdef RN_USE_TEXCOORD_2\n output.texcoord_2 = texcoord_2;\n#endif\n\n output.baryCentricCoord = baryCentricCoord.xyz;\n\n let visibility = get_isVisible(instanceId);\n if (!visibility)\n {\n output.position = vec4f(0.0, 0.0, 0.0, 1.0);\n }\n\n#ifdef RN_USE_SHADOW_MAPPING\n output.shadowCoord = get_depthBiasPV(materialSID, 0) * geom.position_inWorld;\n#endif\n\n return output;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag": /*!*******************************************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag ***! \*******************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n@fragment\nfn main (\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var baseColor = textureSampleLevel(baseColorTexture, baseColorSampler, input.texcoord_0, 0.0);\n\n let luminance = dot(baseColor.rgb, vec3f(0.2126, 0.7152, 0.0722));\n\n let luminanceCriterion: f32 = get_luminanceCriterion(materialSID, 0);\n baseColor = vec4f(mix(vec3f(0.0), baseColor.rgb, (luminance - luminanceCriterion) / luminanceCriterion), 1.0);\n\n return baseColor;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert": /*!*******************************************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert ***! \*******************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag": /*!*******************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag ***! \*******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n// #param envHdriFormat: i32; // initialValue=0\n// #param envRotation: f32; // initialValue=0\n// #param diffuseColorFactor: vec4; // initialValue=(1,1,1,1)\n@group(1) @binding(0) var colorEnvTexture: texture_cube; // initialValue=black\n@group(2) @binding(0) var colorEnvSampler: sampler;\n// #param makeOutputSrgb: bool; // initialValue=1\n// #param inverseEnvironment: bool; // initialValue=true\n\nfn linearToSrgb(linearColor: vec3f) -> vec3f {\n return pow(linearColor, vec3f(1.0/2.2));\n}\n\nfn srgbToLinear(srgbColor: vec3f) -> vec3f {\n return pow(srgbColor, vec3f(2.2));\n}\n\n\n@fragment\nfn main(\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var diffuseColor = vec4(1, 1, 1, 1);\n#ifdef RN_USE_COLOR_0\n diffuseColor = input.color_0;\n#endif\n let diffuseColorFactor = get_diffuseColorFactor(materialSID, 0u);\n diffuseColor *= diffuseColorFactor;\n\n let envRotation: f32 = get_envRotation(materialSID, 0u);\n let rot = envRotation + 3.1415;\n let rotEnvMatrix = mat3x3(cos(rot), 0.0, -sin(rot), 0.0, 1.0, 0.0, sin(rot), 0.0, cos(rot));\n var envNormal: vec3f = normalize(rotEnvMatrix * input.position_inWorld);\n\n if (get_inverseEnvironment(materialSID, 0)) {\n envNormal.x *= -1.0;\n }\n\n let diffuseTexel = textureSampleLevel(colorEnvTexture, colorEnvSampler, envNormal, 0.0);\n var textureColor: vec3f;\n let EnvHdriFormat: i32 = get_envHdriFormat(materialSID, 0);\n if (EnvHdriFormat == 0) { // LDR_SRGB\n textureColor = srgbToLinear(diffuseTexel.rgb);\n } else if (EnvHdriFormat == 3) { // RGBE\n textureColor = diffuseTexel.rgb * pow(2.0, diffuseTexel.a*255.0-128.0);\n } else {\n textureColor = diffuseTexel.rgb;\n }\n diffuseColor *= vec4f(textureColor, 1.0);\n\n var resultColor = diffuseColor.rgb;\n let resultAlpha = diffuseColor.a;\n\nlet makeOutputSrgb = get_makeOutputSrgb(materialSID, 0);\nresultColor = select(resultColor.rgb, linearToSrgb(resultColor.rgb), makeOutputSrgb);\n\n\n return vec4f(resultColor, resultAlpha);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert": /*!*******************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert ***! \*******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n// #param enableViewMatrix: bool; // initialValue=true\n\n@vertex\nfn main(\n#ifdef RN_USE_INSTANCE\n @location(8) instance_ids: vec4,\n#endif\n\n\n#ifdef RN_USE_POSITION_FLOAT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_INT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_UINT\n @location(0) position: vec3,\n#endif\n\n#ifdef RN_USE_NORMAL\n @location(1) normal: vec3,\n#endif\n#ifdef RN_USE_TANGENT\n @location(2) tangent: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_0\n @location(3) texcoord_0: vec2,\n#endif\n#ifdef RN_USE_TEXCOORD_1\n @location(4) texcoord_1: vec2,\n#endif\n\n#ifdef RN_USE_COLOR_0_FLOAT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_INT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_UINT\n @location(5) color_0: vec4,\n#endif\n\n#ifdef RN_USE_JOINTS_0\n @location(6) joints_0: vec4,\n#endif\n#ifdef RN_USE_WEIGHTS_0\n @location(7) weights_0: vec4,\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n @location(10) baryCentricCoord: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_2\n @location(11) texcoord_2: vec2,\n#endif\n @builtin(vertex_index) vertexIdx : u32,\n\n\n) -> VertexOutput {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var output : VertexOutput;\n\n let worldMatrix = get_worldMatrix(u32(instance_ids.x));\n let viewMatrix = get_viewMatrix(cameraSID, 0u);\n let projectionMatrix = get_projectionMatrix(cameraSID, 0u);\n\n if (get_enableViewMatrix(materialSID, 0u)) {\n var rotateMatrix = viewMatrix;\n rotateMatrix[3][0] = 0.0;\n rotateMatrix[3][1] = 0.0;\n rotateMatrix[3][2] = 0.0;\n output.position = projectionMatrix * rotateMatrix * worldMatrix * vec4f(position, 1.0);\n } else {\n output.position = projectionMatrix * worldMatrix * vec4f(position, 1.0);\n }\n\n let normalMatrix = get_normalMatrix(u32(instance_ids.x));\n output.normal_inWorld = normalMatrix * normal;\n\n#ifdef RN_USE_COLOR_0\n output.color_0 = color_0;\n#endif\n output.position_inWorld = (worldMatrix * vec4f(position, 1.0)).xyz;\n output.texcoord_0 = texcoord_0;\n\n return output;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag": /*!*****************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n// #param diffuseColorFactor: vec4; // initialValue=(1,1,1,1)\n\n@group(1) @binding(0) var baseColorTexture: texture_2d; // initialValue=blue\n@group(2) @binding(0) var baseColorSampler: sampler;\n\n@fragment\nfn main(\n input: VertexOutput\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var Normal = input.normal_inWorld * 0.5 + 0.5;\n // return vec4(Normal.x, Normal.y, Normal.z, 1);\n\n#ifdef RN_USE_TEXCOORD_0\n var baseColor = textureSample(baseColorTexture, baseColorSampler, input.texcoord_0);\n return baseColor;\n#else\n return vec4(1, 0, 0, 1);\n#endif\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert": /*!*****************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n#ifdef RN_USE_INSTANCE\n @location(8) instance_ids: vec4,\n#endif\n\n\n#ifdef RN_USE_POSITION_FLOAT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_INT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_UINT\n @location(0) position: vec3,\n#endif\n\n#ifdef RN_USE_NORMAL\n @location(1) normal: vec3,\n#endif\n#ifdef RN_USE_TANGENT\n @location(2) tangent: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_0\n @location(3) texcoord_0: vec2,\n#endif\n#ifdef RN_USE_TEXCOORD_1\n @location(4) texcoord_1: vec2,\n#endif\n\n#ifdef RN_USE_COLOR_0_FLOAT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_INT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_UINT\n @location(5) color_0: vec4,\n#endif\n\n#ifdef RN_USE_JOINTS_0\n @location(6) joints_0: vec4,\n#endif\n#ifdef RN_USE_WEIGHTS_0\n @location(7) weights_0: vec4,\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n @location(10) baryCentricCoord: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_2\n @location(11) texcoord_2: vec2,\n#endif\n @builtin(vertex_index) vertexIdx : u32,\n\n\n) -> VertexOutput {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var output : VertexOutput;\n\n let worldMatrix = get_worldMatrix(u32(instance_ids.x));\n let viewMatrix = get_viewMatrix(cameraSID, 0u);\n let projectionMatrix = get_projectionMatrix(cameraSID, 0u);\n\n output.position = projectionMatrix * viewMatrix * worldMatrix * vec4(position, 1.0);\n\n#ifdef RN_USE_NORMAL\n output.normal_inWorld = normalize((worldMatrix * vec4(normal, 0.0)).xyz);\n#endif\n\n#ifdef RN_USE_TEXCOORD_0\n output.texcoord_0 = texcoord_0;\n#endif\n\n // output.Position = vec4(position, 1.0);\n\n return output;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag": /*!***************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag ***! \***************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n@group(1) @binding(0) var baseColorTexture: texture_2d; // initialValue=white\n@group(2) @binding(0) var baseColorSampler: sampler;\n\n// #param enableLinearToSrgb: bool; // initialValue=true\n\nfn linearToSrgb(linearColor: vec3f) -> vec3f {\n return pow(linearColor, vec3f(1.0/2.2));\n}\n\nfn srgbToLinear(srgbColor: vec3f) -> vec3f {\n return pow(srgbColor, vec3f(2.2));\n}\n\n\n@fragment\nfn main (\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var baseColor = textureSampleLevel(baseColorTexture, baseColorSampler, input.texcoord_0, 0.0);\n\n if (get_enableLinearToSrgb(materialSID, 0)) {\n baseColor = vec4f(linearToSrgb(baseColor.rgb), baseColor.a);\n }\n\n return baseColor;\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert": /*!***************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert ***! \***************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag": /*!*********************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag ***! \*********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n@fragment\nfn main(\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n let offset = input.position.xy;\n\n let framebufferSize: vec2f = get_framebufferSize(materialSID, 0);\n var blurDirection: vec2f;\n let isHorizontal: bool = get_isHorizontal(materialSID, 0);\n if (isHorizontal) {\n blurDirection = vec2f(1.0, 0.0);\n } else { // vertical\n blurDirection = vec2f(0.0, 1.0);\n }\n\tlet tFrag: vec2f = 1.0 / framebufferSize;\n\n var color = vec4f(0.0, 0.0, 0.0, 1.0);\n let gaussianKernelSize: i32 = get_gaussianKernelSize(materialSID, 0);\n let minStrideLength = - f32(gaussianKernelSize - 1) / 2.0;\n\n for (var i=0u; i < u32(gaussianKernelSize); i++) {\n\n let strideLength = minStrideLength + f32(i);\n let stride: vec2f = strideLength * blurDirection;\n\n let gaussianRatio = get_gaussianRatio(materialSID, i);\n var uv = (offset + stride) * tFrag;\n // uv.y = 1.0 - uv.y;\n color += vec4f(textureSampleLevel(baseColorTexture, baseColorSampler, uv, 0.0).rgb, 1.0) * gaussianRatio;\n }\n\n return color;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert": /*!*********************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert ***! \*********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag": /*!*******************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag ***! \*******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\nconst EPS_COL: f32 = 0.00001;\n\nstruct Light {\n lightType: i32, // 0 = directional, 1 = point, 2 = spot\n position: vec3,\n intensity: vec3,\n attenuatedIntensity: vec3,\n directionOfLightObject: vec3,\n direction: vec3, // direction of light vector, equal to normalize(light.pointToLight)\n pointToLight: vec3, // not normalized\n spotAngleScale: f32,\n spotAngleOffset: f32,\n effectiveRange: f32,\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfn getRangeAttenuation(light: Light) -> f32\n{\n let distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfn getSpotAttenuation(light: Light) -> f32\n{\n\n let cd = dot(light.directionOfLightObject, light.direction);\n let angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nfn getLightAttenuated(light: Light) -> Light {\n var newLight: Light = light;\n newLight.attenuatedIntensity = light.intensity;\n // if (light.lightType == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.lightType == 1)\n {\n newLight.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.lightType == 2)\n {\n newLight.attenuatedIntensity *= getSpotAttenuation(light);\n }\n\n return newLight;\n}\n\nfn getLight(lightIdx: u32, v_position_inWorld: vec3) -> Light {\n let lightPosition: vec3 = get_lightPosition(0u, lightIdx);\n let direction_and_w_of_LightObject: vec3 = get_lightDirection(0u, lightIdx);\n let lightIntensity: vec3 = get_lightIntensity(0u, lightIdx);\n let lightProperty: vec4 = get_lightProperty(0u, lightIdx);\n var light: Light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n let lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3f(0.0);\n light.lightType = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.lightType = 1;\n } else { // is Directional Light\n light.lightType = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.lightType = 2;\n }\n\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n let newLight = getLightAttenuated(light);\n\n return newLight;\n}\n\n\nfn edge_ratio(bary3: vec3f, wireframeWidthInner: f32, wireframeWidthRelativeScale: f32) -> f32 {\n let d: vec3f = fwidth(bary3);\n let x: vec3f = bary3 + vec3f(1.0 - wireframeWidthInner) * d;\n let a3: vec3f = smoothstep(vec3f(0.0), d, x);\n let factor = min(min(a3.x, a3.y), a3.z);\n\n return clamp((1.0 - factor), 0.0, 1.0);\n}\n\nfn linearToSrgb(linearColor: vec3f) -> vec3f {\n return pow(linearColor, vec3f(1.0/2.2));\n}\n\nfn srgbToLinear(srgbColor: vec3f) -> vec3f {\n return pow(srgbColor, vec3f(2.2));\n}\n\n#ifdef RN_USE_TANGENT\n fn getTBN(normal_inWorld: vec3f, input: VertexOutput, viewVector: vec3f, texcoord: vec2f, isFront: bool) -> mat3x3 {\n let tangent_inWorld = normalize(input.tangent_inWorld);\n let binormal_inWorld = normalize(input.binormal_inWorld);\n let tbnMat_tangent_to_world = mat3x3(tangent_inWorld, binormal_inWorld, normal_inWorld);\n\n return tbnMat_tangent_to_world;\n }\n#else\n // This is based on http://www.thetenthplanet.de/archives/1180\n fn cotangent_frame(normal_inWorld: vec3f, position: vec3f, uv_: vec2f, isFront: bool) -> mat3x3 {\n var uv: vec2f;\n if (isFront) {\n uv = uv_;\n } else {\n uv = -uv_;\n }\n\n // get edge vectors of the pixel triangle\n let dp1 = dpdx(position);\n let dp2 = dpdy(position);\n let duv1 = dpdx(uv);\n let duv2 = dpdy(uv);\n\n // solve the linear system\n let dp2perp = cross(dp2, normal_inWorld);\n let dp1perp = cross(normal_inWorld, dp1);\n let tangent = dp2perp * duv1.x + dp1perp * duv2.x;\n var bitangent = dp2perp * duv1.y + dp1perp * duv2.y;\n bitangent *= -1.0;\n\n // construct a scale-invariant frame\n let invMat = 1.0 / sqrt(max(dot(tangent, tangent), dot(bitangent, bitangent)));\n return mat3x3(tangent * invMat, bitangent * invMat, normal_inWorld);\n }\n\n fn getTBN(normal_inWorld: vec3f, input: VertexOutput, viewVector: vec3f, texcoord: vec2f, isFront: bool) -> mat3x3 {\n let tbnMat_tangent_to_world = cotangent_frame(normal_inWorld, -viewVector, texcoord, isFront);\n\n return tbnMat_tangent_to_world;\n }\n#endif\n\n\n@fragment\nfn main (\n input: VertexOutput,\n @builtin(front_facing) isFront: bool\n) -> @location(0) vec4 {\n var rt0 = vec4f(0.0, 0.0, 0.0, 1.0);\n\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_NONE\n discard;\n #endif\n #endif\n\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n\n // TODO\n // uv transform\n\n // TODO\n // uv animation\n\n // main color\n let litTextureColor: vec4f = textureSample(litColorTexture, litColorSampler, input.texcoord_0);\n let litColorFactor: vec4f = get_litColor(materialSID, 0);\n\n // alpha\n var alpha = 1.0;\n\n #ifdef RN_ALPHATEST_ON\n alpha = litTextureColor.a * litColorFactor.a;\n let cutoff: f32 = get_cutoff(materialSID, 0);\n if (alpha < cutoff) { discard; }\n #elif defined(RN_ALPHABLEND_ON)\n alpha = litTextureColor.a * litColorFactor.a;\n #endif\n\n if (alpha < 0.01) {\n discard;\n } else {\n rt0.w = alpha;\n }\n\n\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_COLOR_FIXED\n let outlineColor: vec3f = get_outlineColor(materialSID, 0);\n rt0 = vec4f(outlineColor, rt0.w);\n\n rt0 = vec4(srgbToLinear(rt0.xyz), rt0.w);\n return rt0;\n #endif\n #endif\n\n // view vector\n let viewPosition: vec3f = get_viewPosition(cameraSID, 0);\n let viewVector: vec3f = viewPosition - input.position_inWorld.xyz;\n\n // Normal\n var normal_inWorld: vec3f = normalize(input.normal_inWorld);\n #ifdef RN_MTOON_HAS_BUMPMAP\n let normal: vec3f = textureSample(normalTexture, normalSampler, input.texcoord_0).xyz * 2.0 - 1.0;\n let TBN: mat3x3 = getTBN(normal_inWorld, input, viewVector, input.texcoord_0, isFront);\n normal_inWorld = normalize(TBN * normal);\n #endif\n\n #ifdef RN_MTOON_IS_OUTLINE\n normal_inWorld *= -1.0;\n #endif\n\n\n // Lighting, Direct Light\n\n let shadowAttenuation = 1.0;\n // TODO: shadowmap computation\n\n let receiveShadowRate: f32 = get_receiveShadowRate(materialSID, 0);\n var lightAttenuation: f32 = shadowAttenuation * mix(1.0, shadowAttenuation, receiveShadowRate * textureSample(receiveShadowTexture, receiveShadowSampler, input.texcoord_0).r);\n\n let shadingGradeRate: f32 = get_shadingGradeRate(materialSID, 0);\n let shadingGrade: f32 = 1.0 - shadingGradeRate * (1.0 - textureSample(shadingGradeTexture, shadingGradeSampler, input.texcoord_0).r);\n let lightColorAttenuation: f32 = get_lightColorAttenuation(materialSID, 0);\n\n let shadeColorFactor: vec3f = get_shadeColor(materialSID, 0);\n var shadeColor: vec3f = shadeColorFactor * textureSample(shadeColorTexture, shadeColorSampler, input.texcoord_0).xyz;\n shadeColor = srgbToLinear(shadeColor.xyz);\n\n var litColor: vec3f = litColorFactor.xyz * litTextureColor.xyz;\n litColor = srgbToLinear(litColor.xyz);\n\n\n let shadeShift: f32 = get_shadeShift(materialSID, 0);\n let shadeToony: f32 = get_shadeToony(materialSID, 0);\n\n var lightings: array, /* shaderity: @{Config.maxLightNumberInShader} */>;\n #ifdef RN_MTOON_DEBUG_LITSHADERATE\n var lightIntensities[/* shaderity: @{Config.maxLightNumberInShader} */]: array;\n #endif\n let lightNumber = u32(get_lightNumber(0u, 0u));\n for (var i = 0u; i < /* shaderity: @{Config.maxLightNumberInShader} */; i++) {\n if (i >= lightNumber) {\n break;\n }\n\n // Light\n let light: Light = getLight(i, input.position_inWorld.xyz);\n\n // lightAttenuation *= distanceAttenuation * spotEffect;\n let dotNL: f32 = dot(light.direction, normal_inWorld);\n var lightIntensity: f32 = dotNL * 0.5 + 0.5; // from [-1, +1] to [0, 1]\n lightIntensity = lightIntensity * lightAttenuation; // TODO: receive shadow\n lightIntensity = lightIntensity * shadingGrade; // darker\n lightIntensity = lightIntensity * 2.0 - 1.0; // from [0, 1] to [-1, +1]\n\n // tooned. mapping from [minIntensityThreshold, maxIntensityThreshold] to [0, 1]\n let maxIntensityThreshold: f32 = mix(1.0, shadeShift, shadeToony);\n let minIntensityThreshold: f32 = shadeShift;\n lightIntensity = clamp((lightIntensity - minIntensityThreshold) / max(EPS_COL, (maxIntensityThreshold - minIntensityThreshold)), 0.0, 1.0);\n #ifdef RN_MTOON_DEBUG_LITSHADERATE\n lightIntensities[i] = lightIntensity;\n #endif\n\n // Albedo color\n var col: vec3f = mix(shadeColor, litColor, lightIntensity);\n\n // Direct Light\n var lighting: vec3f = light.attenuatedIntensity;\n lighting = mix(lighting, vec3(max(EPS_COL, max(lighting.x, max(lighting.y, lighting.z)))), lightColorAttenuation); // color atten\n\n\n if(i > 0){\n lighting *= 0.5; // darken if additional light.\n lighting *= min(0.0, dotNL) + 1.0; // darken dotNL < 0 area by using half lambert\n // lighting *= shadowAttenuation; // darken if receiving shadow\n #ifdef RN_ALPHABLEND_ON\n lighting *= step(0.0, dotNL); // darken if transparent. Because Unity's transparent material can't receive shadowAttenuation.\n #endif\n }\n\n col *= lighting;\n lightings[i] = lighting;\n\n rt0 += vec4f(col, 0.0);\n\n lightAttenuation = 1.0;\n }\n\n\n // Indirect Light\n var indirectLighting: vec3f = get_ambientColor(materialSID, 0);\n indirectLighting = srgbToLinear(indirectLighting);\n indirectLighting = mix(indirectLighting, vec3f(max(EPS_COL, max(indirectLighting.x, max(indirectLighting.y, indirectLighting.z)))), lightColorAttenuation); // color atten\n // TODO: use ShadeIrad in www.ppsloan.org/publications/StupidSH36.pdf\n\n rt0 += vec4f(indirectLighting * litColor, 0.0);\n rt0 = vec4f(min(rt0.xyz, litColor), rt0.w); // comment out if you want to PBR absolutely.\n\n\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_COLOR_MIXED\n var outlineColor: vec3f = get_outlineColor(materialSID, 0);\n outlineColor = srgbToLinear(outlineColor);\n let outlineLightingMix: f32 = get_outlineLightingMix(materialSID, 0);\n rt0 = vec4f(outlineColor * mix(vec3f(1.0), rt0.xyz, outlineLightingMix), rt0.w);\n #endif\n #else\n let viewDirection: vec3f = normalize(viewVector);\n\n let rimFresnelPower: f32 = get_rimFresnelPower(materialSID, 0);\n let rimLift: f32 = get_rimLift(materialSID, 0);\n let rimColorFactor: vec3f = get_rimColor(materialSID, 0);\n let rimTextureColor: vec3f = textureSample(rimTexture, rimSampler, input.texcoord_0).xyz;\n let rimColor: vec3f = srgbToLinear(rimColorFactor * rimTextureColor);\n let rim: vec3f = pow(clamp(1.0 - dot(normal_inWorld, viewDirection) + rimLift, 0.0, 1.0), rimFresnelPower) * rimColor;\n\n var staticRimLighting = 1.0;\n let rimLightingMix: f32 = get_rimLightingMix(materialSID, 0);\n for (var i = 0u; i < /* shaderity: @{Config.maxLightNumberInShader} */u; i++) {\n if (i >= lightNumber) { break; }\n\n if (i > 0) { staticRimLighting = 0.0; }\n\n let rimLighting: vec3f = mix(vec3f(staticRimLighting), lightings[i], vec3f(rimLightingMix));\n rt0 += vec4f(rim * rimLighting, 0.0);\n }\n\n // additive matcap\n let cameraUp: vec3f = get_cameraUp(0u, 0u); //solo datum\n let worldViewUp: vec3f = normalize(cameraUp - viewDirection * dot(viewDirection, cameraUp));\n let worldViewRight: vec3f = normalize(cross(viewDirection, worldViewUp));\n let matcapUv: vec2f = vec2f(dot(worldViewRight, normal_inWorld), dot(worldViewUp, normal_inWorld)) * 0.5 + 0.5;\n let matCapColor: vec3f = srgbToLinear(textureSample(matCapTexture, matCapSampler, matcapUv).xyz);\n rt0 += vec4f(matCapColor, 0.0);\n\n\n // Emission\n let emissionColor: vec3f = get_emissionColor(materialSID, 0);\n let emission: vec3f = srgbToLinear(textureSample(emissionTexture, emissionSampler, input.texcoord_0).xyz) * emissionColor;\n rt0 += vec4f(emission, 0.0);\n #endif\n\n\n // debug\n #ifdef RN_MTOON_DEBUG_NORMAL\n rt0 = vec4f(normal_inWorld * 0.5 + 0.5, alpha);\n\n rt0 = vec4f(srgbToLinear(rt0.xyz), rt0.w);\n return rt0;\n #elif defined(RN_MTOON_DEBUG_LITSHADERATE)\n rt0 = vec4f(0.0);\n for (var i = 0u; i < /* shaderity: @{Config.maxLightNumberInShader} */u; i++) {\n if (i >= lightNumber) { break; }\n rt0 += vec4f(lightIntensities[i] * lightings[i], alpha);\n }\n\n rt0 = vec4f(srgbToLinear(rt0.xyz), rt0.w);\n return rt0;\n #endif\n\n\n // Wireframe\n let threshold = 0.001;\n let wireframe: vec3f = get_wireframe(materialSID, 0);\n let wireframeWidthInner = wireframe.z;\n let wireframeWidthRelativeScale = 1.0;\n if (wireframe.x > 0.5 && wireframe.y < 0.5) {\n rt0.a = 0.0;\n }\n var wireframeResult = rt0;\n let wireframeColor = vec4f(0.2, 0.75, 0.0, 1.0);\n let edgeRatio: f32 = edge_ratio(input.baryCentricCoord, wireframeWidthInner, wireframeWidthRelativeScale);\n let edgeRatioModified: f32 = mix(step(threshold, edgeRatio), clamp(edgeRatio*4.0, 0.0, 1.0), wireframeWidthInner / wireframeWidthRelativeScale/4.0);\n // if r0.a is 0.0, it is wireframe not on shaded\n wireframeResult = vec4f(wireframeColor.rgb * edgeRatioModified + rt0.rgb * (1.0 - edgeRatioModified), wireframeResult.a);\n wireframeResult.a = max(rt0.a, wireframeColor.a * mix(edgeRatioModified, pow(edgeRatioModified, 100.0), wireframeWidthInner / wireframeWidthRelativeScale/1.0));\n\n if (wireframe.x > 0.5) {\n rt0 = wireframeResult;\n if (wireframe.y < 0.5 && rt0.a == 0.0) {\n discard;\n }\n }\n\n let makeOutputSrgb = get_makeOutputSrgb(materialSID, 0);\n rt0 = vec4f(select(rt0.rgb, linearToSrgb(rt0.rgb), makeOutputSrgb), rt0.w);\n\n return rt0;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert": /*!*******************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert ***! \*******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n// This shader is based on https://github.com/Santarh/MToon\n\n\n#ifdef RN_IS_SKINNING\n\nfn createMatrixFromQuaternionTranslationScale( quaternion: vec4, translation: vec3, scale: vec3 ) -> mat4x4 {\n let q = quaternion;\n let t = translation;\n\n let sx = q.x * q.x;\n let sy = q.y * q.y;\n let sz = q.z * q.z;\n let cx = q.y * q.z;\n let cy = q.x * q.z;\n let cz = q.x * q.y;\n let wx = q.w * q.x;\n let wy = q.w * q.y;\n let wz = q.w * q.z;\n\n let mat = mat4x4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n let uniformScaleMat = mat4x4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n let mat44 = mat*uniformScaleMat;\n return mat44;\n\n}\n\nfn unpackedVec2ToNormalizedVec4(vec_xy: vec2, criteria: f32) -> vec4 {\n\n var r: f32;\n var g: f32;\n var b: f32;\n var a: f32;\n\n let ix = floor(vec_xy.x * criteria);\n let v1x = ix / criteria;\n let v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n let iy = floor( vec_xy.y * criteria);\n let v2x = iy / criteria;\n let v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nfn get_boneMatrixAsMat4x4(skeletalComponentSID: u32, joint: u32) -> mat4x4 {\n let mat43: mat4x3 = get_boneMatrix(skeletalComponentSID, joint);\n return mat4x4(\n vec4(mat43[0], 0.0),\n vec4(mat43[1], 0.0),\n vec4(mat43[2], 0.0),\n vec4(mat43[3], 1.0)\n );\n}\n\nfn getSkinMatrix(skeletalComponentSID: u32, joint: vec4, weight: vec4) -> mat4x4 {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n var skinMat: mat4x4 = weight.x * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.x);\n skinMat += weight.y * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.y);\n skinMat += weight.z * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.z);\n skinMat += weight.w * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.w);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n let criteria = vec2(4096.0, 4096.0);\n\n let tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, joint.x);\n let sq_x = get_boneScalePackedQuat(skeletalComponentSID, joint.x);\n var quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n let tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, joint.y);\n let sq_y = get_boneScalePackedQuat(skeletalComponentSID, joint.y);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n let tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, joint.z);\n let sq_z = get_boneScalePackedQuat(skeletalComponentSID, joint.z);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n let tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, joint.w);\n let sq_w = get_boneScalePackedQuat(skeletalComponentSID, joint.w);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n let ts_x = get_boneTranslateScale(skeletalComponentSID, joint.x);\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.x), ts_x.xyz, vec3(ts_x.w));\n let ts_y = get_boneTranslateScale(skeletalComponentSID, joint.y);\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.y), ts_y.xyz, vec3(ts_y.w));\n let ts_z = get_boneTranslateScale(skeletalComponentSID, joint.z);\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.z), ts_z.xyz, vec3(ts_z.w));\n let ts_w = get_boneTranslateScale(skeletalComponentSID, joint.w);\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.w), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n let boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, joint.x);\n let boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, joint.y);\n let boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, joint.z);\n let boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, joint.w);\n\n let criteria = vec2(4096.0, 4096.0);\n let boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n let ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n let ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n let ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n let ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\nfn toNormalMatrix(m: mat4x4) -> mat3x3 {\n let a00 = m[0][0];\n let a01 = m[0][1];\n let a02 = m[0][2];\n let a03 = m[0][3];\n let a10 = m[1][0];\n let a11 = m[1][1];\n let a12 = m[1][2];\n let a13 = m[1][3];\n let a20 = m[2][0];\n let a21 = m[2][1];\n let a22 = m[2][2];\n let a23 = m[2][3];\n let a30 = m[3][0];\n let a31 = m[3][1];\n let a32 = m[3][2];\n let a33 = m[3][3];\n\n let b00 = a00 * a11 - a01 * a10;\n let b01 = a00 * a12 - a02 * a10;\n let b02 = a00 * a13 - a03 * a10;\n let b03 = a01 * a12 - a02 * a11;\n let b04 = a01 * a13 - a03 * a11;\n let b05 = a02 * a13 - a03 * a12;\n let b06 = a20 * a31 - a21 * a30;\n let b07 = a20 * a32 - a22 * a30;\n let b08 = a20 * a33 - a23 * a30;\n let b09 = a21 * a32 - a22 * a31;\n let b10 = a21 * a33 - a23 * a31;\n let b11 = a22 * a33 - a23 * a32;\n\n let determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3x3(\n (a11 * b11 - a12 * b10 + a13 * b09) / determinantVal,\n (a12 * b08 - a10 * b11 - a13 * b07) / determinantVal,\n (a10 * b10 - a11 * b08 + a13 * b06) / determinantVal,\n (a02 * b10 - a01 * b11 - a03 * b09) / determinantVal,\n (a00 * b11 - a02 * b08 + a03 * b07) / determinantVal,\n (a01 * b08 - a00 * b10 - a03 * b06) / determinantVal,\n (a31 * b05 - a32 * b04 + a33 * b03) / determinantVal,\n (a32 * b02 - a30 * b05 - a33 * b01) / determinantVal,\n (a30 * b04 - a31 * b02 + a33 * b00) / determinantVal\n );\n}\n\nstruct GeometoryOutput {\n normalMatrix: mat3x3,\n position_inWorld: vec4,\n normal_inWorld: vec3,\n isSkinning: bool,\n}\n\n#ifdef RN_IS_SKINNING\nfn skinning(\n skeletalComponentSID: u32,\n inNormalMatrix: mat3x3,\n inPosition_inLocal: vec3,\n inNormal_inLocal: vec3,\n joint: vec4,\n weight: vec4,\n ) -> GeometoryOutput\n{\n var output: GeometoryOutput;\n let skinMat = getSkinMatrix(skeletalComponentSID, joint, weight);\n output.position_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n output.normalMatrix = toNormalMatrix(skinMat);\n output.normal_inWorld = normalize(output.normalMatrix * inNormal_inLocal);\n output.isSkinning = true;\n\n return output;\n}\n#endif\n\n\nfn processGeometryWithMorphingAndSkinning(\n skeletalComponentSID: i32,\n blendShapeComponentSID: u32,\n worldMatrix: mat4x4,\n viewMatrix: mat4x4,\n isBillboard: bool,\n inNormalMatrix: mat3x3,\n inPosition_inLocal: vec3,\n inNormal_inLocal: vec3,\n baryCentricCoord: vec4,\n joint: vec4,\n weight: vec4,\n) -> GeometoryOutput {\n var output: GeometoryOutput;\n\n var position_inLocal: vec3;\n#ifdef RN_IS_MORPHING\n if (_morphTargetNumber == 0u) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n let vertexIdx = u32(baryCentricCoord.w);\n position_inLocal = get_position(vertexIdx, inPosition_inLocal, blendShapeComponentSID);\n }\n#endif\n\n var worldMatrixInner = worldMatrix;\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0) {\n output = skinning(u32(skeletalComponentSID), inNormalMatrix, position_inLocal, inNormal_inLocal, joint, weight);\n } else {\n#endif\n output.normalMatrix = inNormalMatrix;\n output.position_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n output.normal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n output.isSkinning = false;\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return output;\n}\n\n\n@vertex\nfn main(\n#ifdef RN_USE_INSTANCE\n @location(8) instance_ids: vec4,\n#endif\n\n\n#ifdef RN_USE_POSITION_FLOAT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_INT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_UINT\n @location(0) position: vec3,\n#endif\n\n#ifdef RN_USE_NORMAL\n @location(1) normal: vec3,\n#endif\n#ifdef RN_USE_TANGENT\n @location(2) tangent: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_0\n @location(3) texcoord_0: vec2,\n#endif\n#ifdef RN_USE_TEXCOORD_1\n @location(4) texcoord_1: vec2,\n#endif\n\n#ifdef RN_USE_COLOR_0_FLOAT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_INT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_UINT\n @location(5) color_0: vec4,\n#endif\n\n#ifdef RN_USE_JOINTS_0\n @location(6) joints_0: vec4,\n#endif\n#ifdef RN_USE_WEIGHTS_0\n @location(7) weights_0: vec4,\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n @location(10) baryCentricCoord: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_2\n @location(11) texcoord_2: vec2,\n#endif\n @builtin(vertex_index) vertexIdx : u32,\n\n\n) -> VertexOutput {\n var output : VertexOutput;\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_OUTLINE_NONE\n output.position = vec4(0.0, 0.0, 0.0, 1.0);\n return output;\n #endif\n #endif\n\n#ifdef RN_USE_NORMAL\n#else\n let normal = vec3(0.0, 0.0, 0.0);\n#endif\n\n#ifdef RN_USE_JOINTS_0\n let joint = joints_0;\n#else\n let joint = vec4(0, 0, 0, 0);\n#endif\n#ifdef RN_USE_WEIGHTS_0\n let weight = weights_0;\n#else\n let weight = vec4(0.0, 0.0, 0.0, 0.0);\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n#else\n let baryCentricCoord = vec4(0.0, 0.0, 0.0, 0.0);\n#endif\n\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n let instanceId = u32(instance_ids.x);\n let worldMatrix = get_worldMatrix(instanceId);\n let normalMatrix = get_normalMatrix(instanceId);\n let viewMatrix = get_viewMatrix(cameraSID, 0);\n let skeletalComponentSID = i32(instance_ids.y);\n let blendShapeComponentSID = u32(instance_ids.z);\n let geom = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n blendShapeComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n position,\n normal,\n baryCentricCoord,\n joint,\n weight\n );\n\n let projectionMatrix = get_projectionMatrix(cameraSID, 0);\n\n output.position_inWorld = geom.position_inWorld.xyz;\n output.normal_inWorld = geom.normal_inWorld;\n output.normal_inView = (viewMatrix * vec4(geom.normal_inWorld, 0.0)).xyz;\n\n #ifdef RN_MTOON_IS_OUTLINE\n #ifdef RN_MTOON_HAS_OUTLINE_WIDTH_TEXTURE\n let textureSize = textureDimensions(outlineWidthTexture, 0);\n let outlineTex = textureLoad(outlineWidthTexture, vec2u(vec2f(textureSize) * texcoord_0), 0).r;\n #else\n let outlineTex = 1.0;\n #endif\n\n #ifdef RN_MTOON_OUTLINE_WIDTH_WORLD\n let outlineWidth: f32 = get_outlineWidth(materialSID, 0);\n let outlineOffset: vec3f = 0.01 * outlineWidth * outlineTex * normal;\n let worldOutlineOffset: vec4f = worldMatrix * vec4f(outlineOffset, 0.0);\n output.position = projectionMatrix * viewMatrix * (geom.position_inWorld + worldOutlineOffset);\n\n #elif defined(RN_MTOON_OUTLINE_WIDTH_SCREEN)\n let vertex: vec4f = projectionMatrix * viewMatrix * geom.position_inWorld;\n\n let clipNormal: vec3f = (projectionMatrix * vec4f(output.normal_inView, 1.0)).xyz;\n var projectedNormal: vec2f = normalize(clipNormal.xy);\n let outlineScaledMaxDistance: f32 = get_outlineScaledMaxDistance(materialSID, 0);\n projectedNormal *= min(vertex.w, outlineScaledMaxDistance);\n let aspect: f32 = abs(get_aspect(0, 0)); //solo datum\n projectedNormal.x *= aspect;\n\n let outlineWidth: f32 = get_outlineWidth(materialSID, 0);\n vertex.xy += 0.01 * outlineWidth * outlineTex * projectedNormal * clamp(1.0 - abs(output.normal_inView.z), 0.0, 1.0); // ignore offset when normal toward camera\n\n output.position = vertex;\n #else\n output.position = projectionMatrix * viewMatrix * geom.position_inWorld;\n #endif\n #else\n output.position = projectionMatrix * viewMatrix * geom.position_inWorld;\n #endif\n\n #ifdef RN_USE_TANGENT\n output.tangent_inWorld = normalMatrix * tangent.xyz;\n output.binormal_inWorld = cross(geom.normal_inWorld, output.tangent_inWorld) * tangent.w;\n #endif\n\n output.texcoord_0 = texcoord_0;\n output.baryCentricCoord = baryCentricCoord.xyz;\n\n return output;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag.wgsl": /*!******************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag.wgsl ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n@group(1) @binding(0) var baseColorTexture: texture_2d; // initialValue=white\n@group(2) @binding(0) var baseColorSampler: sampler;\n\n// #param cubeMapFaceId: i32; // initialValue=0\n\nfn dirToPanoramaUV(dir: vec3f) -> vec2f\n{\n\treturn vec2f(\n\t\t0.5f + 0.5f * atan2(dir.z, dir.x) / M_PI,\n\t\t1.f - acos(dir.y) / M_PI);\n}\n\nfn uvToDirection(faceId: i32, uv: vec2f) -> vec3f\n{\n\tif (faceId == 0) {\n\t\treturn vec3f(1.f, uv.y, -uv.x);\n } else if(faceId == 1) {\n\t\treturn vec3f(-1.f, uv.y, uv.x);\n } else if(faceId == 2) {\n\t\treturn vec3f(uv.x, -1.f, uv.y);\n } else if(faceId == 3) {\n\t\treturn vec3f(uv.x, 1.f, -uv.y);\n } else if(faceId == 4) {\n\t\treturn vec3f(uv.x, uv.y, 1.f);\n } else {\n return vec3f(-uv.x, uv.y, -1.f);\n }\n}\n\n// learned a lot from https://github.com/KhronosGroup/glTF-Sample-Viewer\n@fragment\nfn main (\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n\tlet uv: vec2f = input.texcoord_0 * 2.0 - 1.0;\n\tlet direction: vec3f = normalize(uvToDirection(get_cubeMapFaceId(materialSID, 0), uv));\n let panoramaUv: vec2f = dirToPanoramaUV(direction);\n\tlet rt0: vec4f = vec4f(textureSampleLevel(baseColorTexture, baseColorSampler, panoramaUv, 0.0).rgb, 1.0);\n return rt0;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert.wgsl": /*!******************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert.wgsl ***! \******************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag": /*!***************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\nstruct Light {\n lightType: i32, // 0 = directional, 1 = point, 2 = spot\n position: vec3,\n intensity: vec3,\n attenuatedIntensity: vec3,\n directionOfLightObject: vec3,\n direction: vec3, // direction of light vector, equal to normalize(light.pointToLight)\n pointToLight: vec3, // not normalized\n spotAngleScale: f32,\n spotAngleOffset: f32,\n effectiveRange: f32,\n};\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property\nfn getRangeAttenuation(light: Light) -> f32\n{\n let distance = length(light.pointToLight);\n // means no range limit\n if (light.effectiveRange <= 0.0)\n {\n return 1.0 / pow(distance, 2.0);\n }\n return max(min(1.0 - pow(distance / light.effectiveRange, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#inner-and-outer-cone-angles\nfn getSpotAttenuation(light: Light) -> f32\n{\n\n let cd = dot(light.directionOfLightObject, light.direction);\n let angularAttenuation = clamp(cd * light.spotAngleScale + light.spotAngleOffset, 0.0, 1.0);\n return angularAttenuation;\n}\n\nfn getLightAttenuated(light: Light) -> Light {\n var newLight: Light = light;\n newLight.attenuatedIntensity = light.intensity;\n // if (light.lightType == 0) { // Directional Light\n // Directional Light don't attenuate geometically\n // }\n\n // Point Light\n if (light.lightType == 1)\n {\n newLight.attenuatedIntensity *= getRangeAttenuation(light);\n }\n // Spot light\n if (light.lightType == 2)\n {\n newLight.attenuatedIntensity *= getSpotAttenuation(light);\n }\n\n return newLight;\n}\n\nfn getLight(lightIdx: u32, v_position_inWorld: vec3) -> Light {\n let lightPosition: vec3 = get_lightPosition(0u, lightIdx);\n let direction_and_w_of_LightObject: vec3 = get_lightDirection(0u, lightIdx);\n let lightIntensity: vec3 = get_lightIntensity(0u, lightIdx);\n let lightProperty: vec4 = get_lightProperty(0u, lightIdx);\n var light: Light;\n light.directionOfLightObject = direction_and_w_of_LightObject;\n let lightType = lightProperty.x;\n light.effectiveRange = lightProperty.y;\n light.spotAngleScale = lightProperty.z;\n light.spotAngleOffset = lightProperty.w;\n\n light.intensity = lightIntensity;\n light.position = lightPosition;\n if (lightType < -0.5) { // disabled light\n light.intensity = vec3f(0.0);\n light.lightType = -1;\n } else if (0.75 < lightType) { // is pointlight or spotlight\n light.pointToLight = lightPosition - v_position_inWorld;\n light.direction = normalize(light.pointToLight);\n light.lightType = 1;\n } else { // is Directional Light\n light.lightType = 0;\n light.direction = normalize(light.directionOfLightObject * -1.0);\n }\n\n if (lightType > 1.75) { // is spotlight\n light.lightType = 2;\n }\n\n light.intensity *= M_PI; // Punctual Light\n\n // Attenuation\n light.attenuatedIntensity = light.intensity;\n let newLight = getLightAttenuated(light);\n\n return newLight;\n}\n\n#ifdef RN_USE_TANGENT\n fn getTBN(normal_inWorld: vec3f, input: VertexOutput, viewVector: vec3f, texcoord: vec2f, isFront: bool) -> mat3x3 {\n let tangent_inWorld = normalize(input.tangent_inWorld);\n let binormal_inWorld = normalize(input.binormal_inWorld);\n let tbnMat_tangent_to_world = mat3x3(tangent_inWorld, binormal_inWorld, normal_inWorld);\n\n return tbnMat_tangent_to_world;\n }\n#else\n // This is based on http://www.thetenthplanet.de/archives/1180\n fn cotangent_frame(normal_inWorld: vec3f, position: vec3f, uv_: vec2f, isFront: bool) -> mat3x3 {\n var uv: vec2f;\n if (isFront) {\n uv = uv_;\n } else {\n uv = -uv_;\n }\n\n // get edge vectors of the pixel triangle\n let dp1 = dpdx(position);\n let dp2 = dpdy(position);\n let duv1 = dpdx(uv);\n let duv2 = dpdy(uv);\n\n // solve the linear system\n let dp2perp = cross(dp2, normal_inWorld);\n let dp1perp = cross(normal_inWorld, dp1);\n let tangent = dp2perp * duv1.x + dp1perp * duv2.x;\n var bitangent = dp2perp * duv1.y + dp1perp * duv2.y;\n bitangent *= -1.0;\n\n // construct a scale-invariant frame\n let invMat = 1.0 / sqrt(max(dot(tangent, tangent), dot(bitangent, bitangent)));\n return mat3x3(tangent * invMat, bitangent * invMat, normal_inWorld);\n }\n\n fn getTBN(normal_inWorld: vec3f, input: VertexOutput, viewVector: vec3f, texcoord: vec2f, isFront: bool) -> mat3x3 {\n let tbnMat_tangent_to_world = cotangent_frame(normal_inWorld, -viewVector, texcoord, isFront);\n\n return tbnMat_tangent_to_world;\n }\n#endif\n\nfn srgbToLinear(srgbColor: vec3f) -> vec3f {\n return pow(srgbColor, vec3f(2.2));\n}\n\nfn linearToSrgb(linearColor: vec3f) -> vec3f {\n return pow(linearColor, vec3f(1.0/2.2));\n}\n\n// From: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/e2c7b8c8bd12916c1a387cd41f9ef061edc718df/source/Renderer/shaders/brdf.glsl#L44-L66\nfn Schlick_to_F0_F90(f: vec3f, f90: vec3f, VdotH: f32) -> vec3f {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = clamp(x * x2 * x2, 0.0, 0.9999);\n\n return (f - f90 * x5) / (1.0 - x5);\n}\n\nfn Schlick_to_F0_F90_F32(f: f32, f90: f32, VdotH: f32) -> f32 {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = clamp(x * x2 * x2, 0.0, 0.9999);\n\n return (f - f90 * x5) / (1.0 - x5);\n}\n\nfn Schlick_to_F0(f: vec3f, VdotH: f32) -> vec3f {\n return Schlick_to_F0_F90(f, vec3(1.0), VdotH);\n}\n\nfn Schlick_to_F0_F32(f: f32, VdotH: f32) -> f32 {\n return Schlick_to_F0_F90_F32(f, 1.0, VdotH);\n}\n\n\n// The Schlick Approximation to Fresnel\nfn fresnel(f0 : vec3f, f90 : vec3f, VdotH : f32) -> vec3f {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nfn fresnelF32(f0 : f32, f90 : f32, VdotH : f32) -> f32 {\n let x = clamp(1.0 - VdotH, 0.0, 1.0);\n let x2 = x * x;\n let x5 = x * x2 * x2;\n return f0 + (f90 - f0) * x5;\n}\n\nfn fresnel2(f0: vec3f, VdotH: f32) -> vec3f\n{\n let f90 = vec3f(1.0); //clamp(50.0 * f0, 0.0, 1.0);\n return fresnel(f0, f90, VdotH);\n}\n\nfn fresnel2F32(f0: f32, VdotH: f32) -> f32\n{\n let f90 = 1.0; //clamp(50.0 * f0, 0.0, 1.0);\n return fresnelF32(f0, f90, VdotH);\n}\n\n// Roughness Dependent Fresnel\n// https://www.jcgt.org/published/0008/01/03/paper.pdf\nfn fresnelSchlickRoughness(F0: vec3f, cosTheta: f32, roughness: f32) -> vec3f\n{\n let Fr = max(vec3f(1.0 - roughness), F0) - F0;\n let k_S = F0 + Fr * pow(1.0 - cosTheta, 5.0);\n return k_S;\n}\n\n// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#diffuse-brdf\nfn BRDF_lambertian(albedo: vec3f, F: vec3f, specularWeight: f32) -> vec3f\n{\n return (vec3f(1.0) - specularWeight * F) * albedo * RECIPROCAL_PI;\n}\n\n\n// GGX NDF\nfn d_GGX(NH: f32, alphaRoughness: f32) -> f32 {\n let roughnessSqr = alphaRoughness * alphaRoughness;\n let f = (roughnessSqr - 1.0) * NH * NH + 1.0;\n return roughnessSqr / (M_PI * f * f);\n}\n\n// The code from https://google.github.io/filament/Filament.html#listing_approximatedspecularv\n// The idea is from [Heitz14] Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs.\nfn v_GGXCorrelated(NL: f32, NV: f32, alphaRoughness: f32) -> f32 {\n let a2 = alphaRoughness * alphaRoughness;\n let GGXV = NL * sqrt(NV * NV * (1.0 - a2) + a2);\n let GGXL = NV * sqrt(NL * NL * (1.0 - a2) + a2);\n return 0.5 / (GGXV + GGXL);\n}\n\nfn BRDF_specularGGX(NH: f32, NL: f32, NV: f32, F: vec3f, alphaRoughness: f32, specularWeight: f32) -> vec3f {\n let D = d_GGX(NH, alphaRoughness);\n let V = v_GGXCorrelated(NL, NV, alphaRoughness);\n return vec3f(D) * vec3f(V) * F * specularWeight;\n}\n\n// this is from https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nfn envBRDFApprox( Roughness: f32, NoV: f32 ) -> vec2f {\n let c0 = vec4f(-1, -0.0275, -0.572, 0.022 );\n let c1 = vec4f(1, 0.0425, 1.04, -0.04 );\n let r = Roughness * c0 + c1;\n let a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y;\n let AB = vec2f( -1.04, 1.04 ) * a004 + r.zw;\n\n return AB;\n}\n\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat#layering\nfn coated_material_s(base: vec3f, perceptualRoughness: f32, clearcoatRoughness: f32, clearcoat: f32, VdotNc: f32, LdotNc: f32, NdotHc: f32) -> vec3f {\n let clearcoatFresnel = 0.04 + (1.0 - 0.04) * pow(1.0 - abs(VdotNc), 5.0);\n let clearcoatAlpha = clearcoatRoughness * clearcoatRoughness;\n let alphaRoughness = perceptualRoughness * perceptualRoughness;\n let D = d_GGX(NdotHc, clearcoatAlpha);\n let V = v_GGXCorrelated(LdotNc, VdotNc, clearcoatAlpha);\n let f_clearcoat = clearcoatFresnel * D * V;\n\n // base = (f_diffuse + f_specular) in https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_clearcoat#layering\n return base * vec3f(1.0 - clearcoat * clearcoatFresnel) + vec3f(f_clearcoat * clearcoat);\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_transmission#implementation-notes\nfn specular_btdf(alphaRoughness: f32, NdotL: f32, NdotV: f32, NdotHt: f32) -> f32 {\n let V = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n let D = d_GGX(NdotHt, alphaRoughness);\n return V * D;\n}\n\n\n////////////////////////////////////////\n// glTF KHR_materials_volume\n////////////////////////////////////////\n\n#ifdef RN_USE_VOLUME\n// https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md#attenuation\nfn volumeAttenuation(attenuationColor: vec3f, attenuationDistance: f32, intensity: vec3f, transmissionDistance: f32) -> vec3f\n{\n if (attenuationDistance == 0.0) { // means Infinite distance\n return intensity; // No attenuation\n } else {\n let attenuationCo: vec3f = -log(attenuationColor) / attenuationDistance;\n let attenuatedTransmittance: vec3f = exp(-attenuationCo * transmissionDistance);\n return intensity * attenuatedTransmittance;\n }\n}\n#endif\n\n\n////////////////////////////////////////\n// glTF KHR_materials_anisotropy\n////////////////////////////////////////\n#ifdef RN_USE_ANISOTROPY\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\nfn D_GGX_anisotropic(NdotH: f32, TdotH: f32, BdotH: f32, at: f32, ab: f32) -> f32\n{\n let a2 = at * ab;\n let f = vec3f(ab * TdotH, at * BdotH, a2 * NdotH);\n let w2 = a2 / dot(f, f);\n return a2 * w2 * w2 / M_PI;\n}\n\nfn V_GGX_anisotropic(NdotL: f32, NdotV: f32, BdotV: f32, TdotV: f32, TdotL: f32, BdotL: f32,\n at: f32, ab: f32) -> f32\n{\n let GGXV = NdotL * length(vec3(at * TdotV, ab * BdotV, NdotV));\n let GGXL = NdotV * length(vec3(at * TdotL, ab * BdotL, NdotL));\n let v = 0.5 / (GGXV + GGXL);\n return clamp(v, 0.0, 1.0);\n}\n\nfn BRDF_specularAnisotropicGGX(F: vec3f, alphaRoughness: f32,\n VdotH: f32, NdotL: f32, NdotV: f32, NdotH: f32, BdotV: f32, TdotV: f32,\n TdotL: f32, BdotL: f32, TdotH: f32, BdotH: f32, anisotropy: f32) -> vec3f\n{\n let at = mix(alphaRoughness, 1.0, anisotropy * anisotropy);\n let ab = alphaRoughness;\n\n let V = V_GGX_anisotropic(NdotL, NdotV, BdotV, TdotV, TdotL, BdotL, at, ab);\n let D = D_GGX_anisotropic(NdotH, TdotH, BdotH, at, ab);\n\n return F * V * D;\n}\n#endif\n\n////////////////////////////////////////\n// glTF KHR_materials_sheen\n////////////////////////////////////////\n\n#ifdef RN_USE_SHEEN\nfn d_Charlie(sheenPerceptualRoughness: f32, NoH: f32) -> f32 {\n // Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n let alphaG = sheenPerceptualRoughness * sheenPerceptualRoughness;\n let invAlpha = 1.0 / alphaG;\n let cos2h = NoH * NoH;\n let sin2h = 1.0 - cos2h;\n return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * M_PI);\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen#sheen-visibility\nfn sheenSimpleVisibility(NdotL: f32, NdotV: f32) -> f32 {\n return 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV));\n}\n\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen#sheen-visibility\nfn charlieL(x: f32, alphaG: f32) -> f32 {\n let oneMinusAlphaSq = (1.0 - alphaG) * (1.0 - alphaG);\n let a = mix(21.5473, 25.3245, oneMinusAlphaSq);\n let b = mix(3.82987, 3.32435, oneMinusAlphaSq);\n let c = mix(0.19823, 0.16801, oneMinusAlphaSq);\n let d = mix(-1.97760, -1.27393, oneMinusAlphaSq);\n let e = mix(-4.32054, -4.85967, oneMinusAlphaSq);\n return a / (1.0 + b * pow(x, c)) + d * x + e;\n}\n\nfn lambdaSheen(cosTheta: f32, alphaG: f32) -> f32\n{\n return select(exp(2.0 * charlieL(0.5, alphaG) - charlieL(1.0 - cosTheta, alphaG)), exp(charlieL(cosTheta, alphaG)), abs(cosTheta) < 0.5);\n}\n\nfn sheenCharlieVisibility(NdotL: f32, NdotV: f32, sheenPerceptualRoughness: f32) -> f32 {\n let alphaG = sheenPerceptualRoughness * sheenPerceptualRoughness;\n let sheenVisibility = 1.0 / ((1.0 + lambdaSheen(NdotV, alphaG) + lambdaSheen(NdotL, alphaG)) * (4.0 * NdotV * NdotL));\n return sheenVisibility;\n}\n\nfn sheen_brdf(sheenColor: vec3f, sheenPerceptualRoughness: f32, NdotL: f32, NdotV: f32, NdotH: f32) -> vec3f {\n let sheenDistribution = d_Charlie(sheenPerceptualRoughness, NdotH);\n let sheenVisibility = sheenCharlieVisibility(NdotL, NdotV, sheenPerceptualRoughness);\n return sheenColor * sheenDistribution * sheenVisibility;\n}\n#endif // RN_USE_SHEEN\n\n////////////////////////////////////////\n// glTF KHR_materials_irirdescence\n////////////////////////////////////////\n\n#ifdef RN_USE_IRIDESCENCE\n// XYZ to REC709(sRGB) conversion matrix\nconst XYZ_TO_REC709 = mat3x3(\n 3.2404542, -0.9692660, 0.0556434,\n -1.5371385, 1.8760108, -0.2040259,\n -0.4985314, 0.0415560, 1.0572252\n);\n\nfn fresnelSchlickRoughnessWithIridescence(\n F0: vec3f, cosTheta: f32, roughness: f32,\n iridescenceFresnel: vec3f, iridescence: f32\n ) -> vec3f\n{\n let Fr = max(vec3f(1.0 - roughness), F0) - F0;\n let k_S = mix(F0 + Fr * pow(1.0 - cosTheta, 5.0), iridescenceFresnel, iridescence);\n return k_S;\n}\n\n// Assume air interface for top\nfn Fresnel0ToIor(F0: vec3f) -> vec3f {\n let sqrtF0 = sqrt(F0);\n return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0);\n}\n\n// Conversion from IOR to F0\n// ior is a value between 1.0 and 3.0. 1.0 is air interface\nfn IorToFresnel0Vec3f(transmittedIor: vec3f, incidentIor: f32) -> vec3f {\n return sqVec3f((transmittedIor - vec3f(incidentIor)) / (transmittedIor + vec3(incidentIor)));\n}\nfn IorToFresnel0F32(transmittedIor: f32, incidentIor: f32) -> f32 {\n return sqF32((transmittedIor - incidentIor) / (transmittedIor + incidentIor));\n}\n\n/**\n * From: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence#analytic-spectral-integration\n */\nfn evalSensitivity(OPD: f32, shift: vec3f) -> vec3f {\n let phase = 2.0 * M_PI * OPD * 1.0e-9;\n let val = vec3f(5.4856e-13, 4.4201e-13, 5.2481e-13);\n let pos = vec3f(1.6810e+06, 1.7953e+06, 2.2084e+06);\n let var_ = vec3f(4.3278e+09, 9.3046e+09, 6.6121e+09);\n\n var xyz = val * sqrt(2.0 * M_PI * var_) * cos(pos * phase + shift) * exp(-(phase * phase) * var_);\n xyz.x += 9.7470e-14 * sqrt(2.0 * M_PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * (phase * phase));\n xyz /= 1.0685e-7;\n\n let rgb = XYZ_TO_REC709 * xyz;\n return rgb;\n}\n\n/**\n * From: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence#iridescence-fresnel\n */\nfn calcIridescence(outsideIor: f32, eta2: f32, cosTheta1: f32, thinFilmThickness: f32, baseF0: vec3f) -> vec3f {\n\n\n // iridescenceIor is the index of refraction of the thin-film layer\n // Force iridescenceIor -> outsideIOR when thinFilmThickness -> 0.0\n let iridescenceIor = mix(outsideIor, eta2, smoothstep(0.0, 0.03, thinFilmThickness));\n\n // To calculate the reflectances R12 and R23 at the viewing angles (angle hitting the thin-film layer)\n // and (angle after refraction in the thin-film) Schlick Fresnel is again used.\n // This approximation allows to eliminate the split into S and P polarization for the exact Fresnel equations.\n // can be calculated using Snell's law (with being outsideIor and being iridescenceIor):\n let sinTheta2Sq = sqF32(outsideIor / iridescenceIor) * (1.0 - sqF32(cosTheta1));\n let cosTheta2Sq = 1.0 - sinTheta2Sq;\n\n // Handle total internal reflection\n if (cosTheta2Sq < 0.0) {\n return vec3f(1.0);\n }\n\n let cosTheta2 = sqrt(cosTheta2Sq);\n\n /// Material Interfaces\n // The iridescence model defined by Belcour/Barla models two material interfaces\n // - one from the outside to the thin-film layer\n // and another one from the thin-film to the base material. These two interfaces are defined as follows:\n\n // First interface (from the outside to the thin-film layer)\n let R0 = IorToFresnel0F32(iridescenceIor, outsideIor);\n let R12 = fresnel2F32(R0, cosTheta1);\n let R21 = R12;\n let T121 = 1.0 - R12;\n\n // Second interface (from the thin-film to the base material)\n let baseIor = Fresnel0ToIor(baseF0 + 0.0001); // guard against 1.0\n let R1 = IorToFresnel0Vec3f(baseIor, iridescenceIor);\n let R23 = fresnel2(R1, cosTheta2);\n\n // phi12 and phi23 define the base phases per interface and are approximated with 0.0\n // if the IOR of the hit material (iridescenceIor or baseIor) is higher\n // than the IOR of the previous material (outsideIor or iridescenceIor) and π otherwise.\n // Also here, polarization is ignored. float phi12 = 0.0;\n\n // First interface (from the outside to the thin-film layer)\n var phi12 = 0.0;\n if (iridescenceIor < outsideIor) { phi12 = M_PI; }\n let phi21 = M_PI - phi12;\n\n // Second interface (from the thin-film to the base material)\n var phi23 = vec3f(0.0);\n if (baseIor[0] < iridescenceIor) { phi23[0] = M_PI; }\n if (baseIor[1] < iridescenceIor) { phi23[1] = M_PI; }\n if (baseIor[2] < iridescenceIor) { phi23[2] = M_PI; }\n\n // OPD (optical path difference)\n let OPD = 2.0 * iridescenceIor * thinFilmThickness * cosTheta2;\n // Phase shift\n let phi = vec3f(phi21) + phi23;\n\n // Compound terms\n let R123 = clamp(R12 * R23, vec3f(1e-5), vec3f(0.9999));\n let r123 = sqrt(R123);\n let Rs = (T121 * T121) * R23 / (vec3f(1.0) - R123);\n\n // Reflectance term for m = 0 (DC term amplitude)\n let C0 = R12 + Rs;\n var I = C0;\n\n // Reflectance term for m > 0 (pairs of diracs)\n var Cm = Rs - T121;\n for (var m = 1; m <= 2; m++)\n {\n Cm *= r123;\n let Sm = 2.0 * evalSensitivity(f32(m) * OPD, f32(m) * phi);\n I += Cm * Sm;\n }\n\n let F_iridescence = max(I, vec3f(0.0));\n\n return F_iridescence;\n}\n\n//https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB\nfn BRDF_lambertianIridescence(f0: vec3f, f90: vec3f, iridescenceFresnel: vec3f, iridescenceFactor: f32, diffuseColor: vec3f, specularWeight: f32, VdotH: f32) -> vec3f\n{\n let iridescenceFresnelMax = vec3f(max(max(iridescenceFresnel.r, iridescenceFresnel.g), iridescenceFresnel.b));\n\n let schlickFresnel = Schlick_to_F0_F90(f0, f90, VdotH);\n\n let F = mix(schlickFresnel, iridescenceFresnelMax, iridescenceFactor);\n\n // see https://seblagarde.wordpress.com/2012/01/08/pi-or-not-to-pi-in-game-lighting-equation/\n return (1.0 - specularWeight * F) * (diffuseColor / M_PI);\n}\n\nfn BRDF_specularGGXIridescence(f0: vec3f, f90: vec3f, iridescenceFresnel: vec3f, alphaRoughness: f32, iridescenceFactor: f32, specularWeight: f32, VdotH: f32, NdotL: f32, NdotV: f32, NdotH: f32) -> vec3f\n{\n let F = mix(Schlick_to_F0_F90(f0, f90, VdotH), iridescenceFresnel, iridescenceFactor);\n let Vis = v_GGXCorrelated(NdotL, NdotV, alphaRoughness);\n let D = d_GGX(NdotH, alphaRoughness);\n\n return specularWeight * F * Vis * D;\n}\n\n#endif // RN_USE_IRIDESCENCE\n\n\n////////////////////////////////////////\n// lighting with a punctual light\n////////////////////////////////////////\nfn lightingWithPunctualLight(\n light: Light,\n normal_inWorld: vec3f,\n viewDirection: vec3f,\n NdotV: f32,\n albedo: vec3f,\n perceptualRoughness: f32,\n F0: vec3f,\n F90: vec3f,\n transmission: f32,\n ior: f32,\n clearcoat: f32,\n clearcoatRoughness: f32,\n clearcoatNormal_inWorld: vec3f,\n VdotNc: f32,\n attenuationColor: vec3f,\n attenuationDistance: f32,\n anisotropy: f32,\n anisotropicT: vec3f,\n anisotropicB: vec3f,\n BdotV: f32,\n TdotV: f32,\n sheenColor: vec3f,\n sheenRoughness: f32,\n albedoSheenScalingNdotV: f32,\n iridescenceFactor: f32,\n iridescenceFresnel: vec3f,\n specularWeight: f32,\n ) -> vec3f\n{\n let alphaRoughness = perceptualRoughness * perceptualRoughness;\n\n // Fresnel\n let halfVector = normalize(light.direction + viewDirection);\n let VdotH = dot(viewDirection, halfVector);\n let F = fresnel(F0, F90, VdotH);\n\n let NdotL = clamp(dot(normal_inWorld, light.direction), Epsilon, 1.0);\n\n // Diffuse\n#ifdef RN_USE_IRIDESCENCE\n let diffuseBrdf = BRDF_lambertianIridescence(F0, F90, iridescenceFresnel, iridescenceFactor, albedo, specularWeight, VdotH);\n#else\n let diffuseBrdf = BRDF_lambertian(albedo, F, specularWeight);\n#endif\n let pureDiffuse = diffuseBrdf * vec3f(NdotL) * light.attenuatedIntensity;\n\n#ifdef RN_USE_TRANSMISSION\n let refractionVector = refract(-viewDirection, normal_inWorld, 1.0 / ior);\n var transmittedLightFromUnderSurface: Light = light;\n transmittedLightFromUnderSurface.pointToLight -= refractionVector;\n let transmittedLightDirectionFromUnderSurface = normalize(transmittedLightFromUnderSurface.pointToLight);\n transmittedLightFromUnderSurface.direction = transmittedLightDirectionFromUnderSurface;\n\n let Ht = normalize(viewDirection + transmittedLightFromUnderSurface.direction);\n let NdotHt = saturateEpsilonToOne(dot(normal_inWorld, Ht));\n let NdotLt = saturateEpsilonToOne(dot(normal_inWorld, transmittedLightFromUnderSurface.direction));\n\n var transmittedContrib = (vec3f(1.0) - F) * specular_btdf(alphaRoughness, NdotLt, NdotV, NdotHt) * albedo * transmittedLightFromUnderSurface.attenuatedIntensity;\n\n#ifdef RN_USE_VOLUME\n transmittedContrib = volumeAttenuation(attenuationColor, attenuationDistance, transmittedContrib, length(transmittedLightFromUnderSurface.pointToLight));\n#endif // RN_USE_VOLUME\n\n let diffuseContrib = mix(pureDiffuse, vec3f(transmittedContrib), transmission);\n#else\n let diffuseContrib = pureDiffuse;\n#endif // RN_USE_TRANSMISSION\n\n // Specular\n let NdotH = saturateEpsilonToOne(dot(normal_inWorld, halfVector));\n\n\n#ifdef RN_USE_IRIDESCENCE\n let specularContrib = BRDF_specularGGXIridescence(F0, F90, iridescenceFresnel, alphaRoughness, iridescenceFactor, specularWeight, VdotH, NdotL, NdotV, NdotH) * vec3f(NdotL) * light.attenuatedIntensity;\n#elif defined(RN_USE_ANISOTROPY)\n let TdotL = dot(anisotropicT, light.direction);\n let BdotL = dot(anisotropicB, light.direction);\n let TdotH = dot(anisotropicT, halfVector);\n let BdotH = dot(anisotropicB, halfVector);\n let specularContrib = BRDF_specularAnisotropicGGX(F, alphaRoughness, VdotH, NdotL, NdotV, NdotH, BdotV, TdotV, TdotL, BdotL, TdotH, BdotH, anisotropy) * vec3f(NdotL) * light.attenuatedIntensity;\n#else\n let specularContrib = BRDF_specularGGX(NdotH, NdotL, NdotV, F, alphaRoughness, specularWeight) * vec3f(NdotL) * light.attenuatedIntensity;\n#endif\n\n // Base Layer\n let baseLayer = diffuseContrib + specularContrib;\n\n#ifdef RN_USE_SHEEN\n // Sheen\n let sheenContrib = sheen_brdf(sheenColor, sheenRoughness, NdotL, NdotV, NdotH) * NdotL * light.attenuatedIntensity;\n let albedoSheenScaling = min(\n albedoSheenScalingNdotV,\n 1.0 - max3(sheenColor) * textureSample(sheenLutTexture, sheenLutSampler, vec2(NdotL, sheenRoughness)).r);\n let color = sheenContrib + baseLayer * albedoSheenScaling;\n#else\n let color = baseLayer;\n let albedoSheenScaling = 1.0;\n#endif // RN_USE_SHEEN\n\n#ifdef RN_USE_CLEARCOAT\n // Clear Coat Layer\n let NdotHc = saturateEpsilonToOne(dot(clearcoatNormal_inWorld, halfVector));\n let LdotNc = saturateEpsilonToOne(dot(light.direction, clearcoatNormal_inWorld));\n let coated = coated_material_s(color, perceptualRoughness,\n clearcoatRoughness, clearcoat, VdotNc, LdotNc, NdotHc);\n let finalColor = coated;\n#else\n let finalColor = color;\n#endif // RN_USE_CLEARCOAT\n\n return finalColor;\n}\n\nfn IsotropicNDFFiltering(normal: vec3f, roughness2: f32) -> f32 {\n let SIGMA2 = 0.15915494;\n let KAPPA = 0.18;\n let dndu = dpdx(normal);\n let dndv = dpdy(normal);\n let kernelRoughness2 = SIGMA2 * (dot(dndu, dndu) + dot(dndv, dndv));\n let clampedKernelRoughness2 = min(kernelRoughness2, KAPPA);\n let filteredRoughness2 = saturate(roughness2 + clampedKernelRoughness2);\n return filteredRoughness2;\n}\n\n\n// #param makeOutputSrgb: bool; // initialValue=1\n\n// Color\n// #param baseColorFactor: vec4; // initialValue=(1,1,1,1)\n@group(1) @binding(0) var baseColorTexture: texture_2d; // initialValue=white\n@group(2) @binding(0) var baseColorSampler: sampler;\n// #param baseColorTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param baseColorTextureRotation: f32; // initialValue=0\n// #param baseColorTexcoordIndex: f32; // initialValue=0\n\n// #param ior: f32; // initialValue=1.5\n\n// #param metallicRoughnessFactor: vec2; // initialValue=(1,1)\n@group(1) @binding(1) var metallicRoughnessTexture: texture_2d; // initialValue=white\n@group(2) @binding(1) var metallicRoughnessSampler: sampler;\n// #param metallicRoughnessTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param metallicRoughnessTextureRotation: f32; // initialValue=0\n// #param metallicRoughnessTexcoordIndex: f32; // initialValue=0\n\n#ifdef RN_USE_NORMAL_TEXTURE\n @group(1) @binding(2) var normalTexture: texture_2d; // initialValue=black\n @group(2) @binding(2) var normalSampler: sampler;\n // #param normalTextureTransform: vec4; // initialValue=(1,1,0,0)\n // #param normalTextureRotation: f32; // initialValue=(0)\n // #param normalTexcoordIndex: f32; // initialValue=(0)\n // #param normalScale: f32; // initialValue=(1)\n#endif\n\n@group(1) @binding(3) var occlusionTexture: texture_2d; // initialValue=white\n@group(2) @binding(3) var occlusionSampler: sampler;\n// #param occlusionTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param occlusionTextureRotation: f32; // initialValue=0\n// #param occlusionTexcoordIndex: u32; // initialValue=0\n// #param occlusionStrength: f32; // initialValue=1\n\n// #param emissiveFactor: vec3; // initialValue=(0,0,0)\n// #param emissiveTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param emissiveTextureRotation: f32; // initialValue=0\n// #param emissiveTexcoordIndex: u32; // initialValue=0\n@group(1) @binding(4) var emissiveTexture: texture_2d; // initialValue=white\n@group(2) @binding(4) var emissiveSampler: sampler;\n// #param emissiveStrength: f32; // initialValue=1\n\n#ifdef RN_USE_CLEARCOAT\n// #param clearCoatFactor: f32; // initialValue=0\n// #param clearCoatRoughnessFactor: f32; // initialValue=0\n// #param clearCoatTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param clearCoatTextureRotation: f32; // initialValue=0\n// #param clearCoatRoughnessTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param clearCoatRoughnessTextureRotation: f32; // initialValue=0\n// #param clearCoatNormalTextureTransform: vec4; // initialValue=(1,1,0,0)\n// #param clearCoatNormalTextureRotation: f32; // initialValue=0\n// #param clearCoatTexcoordIndex: u32; // initialValue=(0)\n// #param clearCoatRoughnessTexcoordIndex: u32; // initialValue=(0)\n// #param clearCoatNormalTexcoordIndex: u32; // initialValue=(0)\n#endif // RN_USE_CLEARCOAT\n\n\n#ifdef RN_USE_TRANSMISSION\n// #param transmissionFactor: f32; // initialValue=(0)\n#endif // RN_USE_TRANSMISSION\n\n#ifdef RN_USE_VOLUME\n// #param thicknessFactor: f32; // initialValue=(0)\n// #param attenuationDistance: f32; // initialValue=(0.000001)\n// #param attenuationColor: vec3; // initialValue=(1,1,1)\n#endif\n\n#ifdef RN_USE_SHEEN\n// #param sheenColorFactor: vec3; // initialValue=(0,0,0)\n// #param sheenRoughnessFactor: f32; // initialValue=(0)\n#endif\n\n#ifdef RN_USE_SPECULAR\n// #param specularFactor: f32; // initialValue=1.0\n// #param specularColorFactor: vec3; // initialValue=(1,1,1)\n#endif\n\n#ifdef RN_USE_IRIDESCENCE\n// #param iridescenceFactor: f32; // initialValue=0\n// #param iridescenceIor: f32; // initialValue=1.3\n// #param iridescenceThicknessMinimum: f32; // initialValue=100\n// #param iridescenceThicknessMaximum: f32; // initialValue=400\n#endif\n\n#ifdef RN_USE_ANISOTROPY\n// #param anisotropyStrength: f32; // initialValue=0\n// #param anisotropyRotation: vec2; // initialValue=(1,0)\n#endif\n\n// #param alphaCutoff: f32; // initialValue=0.01\n\n@group(1) @binding(16) var diffuseEnvTexture: texture_cube; // initialValue=black\n@group(2) @binding(16) var diffuseEnvSampler: sampler;\n@group(1) @binding(17) var specularEnvTexture: texture_cube; // initialValue=black\n@group(2) @binding(17) var specularEnvSampler: sampler;\n\n\n// #param iblParameter: vec4; // initialValue=(1,1,1,1), isInternalSetting=true\n// #param hdriFormat: vec2; // initialValue=(0,0), isInternalSetting=true\n// #param inverseEnvironment: bool; // initialValue=true\nfn get_irradiance(normal_forEnv: vec3f, hdriFormat: vec2) -> vec3f {\n let diffuseTexel: vec4f = textureSample(diffuseEnvTexture, diffuseEnvSampler, normal_forEnv);\n\n var irradiance: vec3f;\n if (hdriFormat.x == 0) {\n // LDR_SRGB\n irradiance = srgbToLinear(diffuseTexel.rgb);\n }\n else if (hdriFormat.x == 3) {\n // RGBE\n irradiance = diffuseTexel.rgb * pow(2.0, diffuseTexel.a*255.0-128.0);\n }\n else {\n irradiance = diffuseTexel.rgb;\n }\n\n return irradiance;\n}\n\nfn get_radiance(reflection: vec3f, lod: f32, hdriFormat: vec2) -> vec3f {\n let specularTexel = textureSampleLevel(specularEnvTexture, specularEnvSampler, reflection, lod);\n\n var radiance: vec3f;\n if (hdriFormat.y == 0) {\n // LDR_SRGB\n radiance = srgbToLinear(specularTexel.rgb);\n }\n else if (hdriFormat.y == 3) {\n // RGBE\n radiance = specularTexel.rgb * pow(2.0, specularTexel.a*255.0-128.0);\n }\n else {\n radiance = specularTexel.rgb;\n }\n\n return radiance;\n}\n\n#ifdef RN_USE_SHEEN\nfn sheenIBL(NdotV: f32, sheenPerceptualRoughness: f32, sheenColor: vec3f, iblParameter: vec4f, reflection: vec3f, hdriFormat: vec2i) -> vec3f\n{\n let mipCount = iblParameter.x;\n let lod = (sheenPerceptualRoughness * (mipCount - 1.0));\n\n let sheenLutUV = vec2f(NdotV, sheenPerceptualRoughness);\n let brdf = textureSample(sheenLutTexture, sheenLutSampler, sheenLutUV).b;\n var sheenLight = get_radiance(reflection, lod, hdriFormat);\n let IBLSpecularContribution = iblParameter.z;\n sheenLight *= IBLSpecularContribution;\n\n return sheenLight * sheenColor * brdf;\n}\n#endif\n\nfn getNormalForEnv(rotEnvMatrix: mat3x3, normal_inWorld: vec3f, materialSID: u32) -> vec3f {\n var normal_forEnv = rotEnvMatrix * normal_inWorld;\n if (get_inverseEnvironment(materialSID, 0)) {\n normal_forEnv.x *= -1.0;\n }\n return normal_forEnv;\n}\n\nfn getReflection(rotEnvMatrix: mat3x3, viewDirection: vec3f, normal_inWorld: vec3f,\n materialSID: u32, perceptualRoughness: f32,\n anisotropy: f32, anisotropyDirection: vec3f\n ) -> vec3f {\n#ifdef RN_USE_ANISOTROPY\n let tangentRoughness = mix(perceptualRoughness, 1.0, anisotropy * anisotropy);\n let anisotropicTangent = cross(anisotropyDirection, viewDirection);\n let anisotropicNormal = cross(anisotropicTangent, anisotropyDirection);\n let bendFactor = 1.0 - anisotropy * (1.0 - perceptualRoughness);\n let bendFactorPow4 = bendFactor * bendFactor * bendFactor * bendFactor;\n let bentNormal = normalize(mix(anisotropicNormal, normal_inWorld, bendFactorPow4));\n var reflection = rotEnvMatrix * reflect(-viewDirection, bentNormal);\n#else\n var reflection = rotEnvMatrix * reflect(-viewDirection, normal_inWorld);\n#endif\n if (get_inverseEnvironment(materialSID, 0)) {\n reflection.x *= -1.0;\n }\n return reflection;\n}\n\nfn scaleForLod(perceptualRoughness: f32, ior: f32) -> f32\n{\n // Scale roughness to the range [0, 1],\n // ior=1.0 will be scale 0,\n // ior=1.5 will be scale 1.0,\n // ior=2 will be scale 1.0 (clamped)\n //\n\n let scale = clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n return perceptualRoughness * scale;\n}\n\n#ifdef RN_USE_TRANSMISSION\nfn get_sample_from_backbuffer(materialSID: u32, sampleCoord: vec2f, perceptualRoughness: f32, ior: f32) -> vec3f {\n let vrState: vec2 = get_vrState(0, 0);\n let backBufferTextureSize = vec2f(textureDimensions(backBufferTexture, 0));\n var backBufferTextureLength = max(backBufferTextureSize.x, backBufferTextureSize.y);\n var newSampleCoord = sampleCoord;\n newSampleCoord.y = 1.0 - newSampleCoord.y;\n if (vrState.x == 1) { // For VR\n backBufferTextureLength = max(backBufferTextureSize.x / 2.0, backBufferTextureSize.y);\n newSampleCoord.x = sampleCoord.x * 0.5;\n if (vrState.y == 1) { // For right eye\n newSampleCoord.x += 0.5;\n }\n }\n let framebufferLod = log2(backBufferTextureLength) * scaleForLod(perceptualRoughness, ior);\n\n let transmittedLight = textureSampleLevel(backBufferTexture, backBufferSampler, newSampleCoord, framebufferLod).rgb;\n\n return transmittedLight;\n}\n\n// from glTF Sample Viewer: https://github.com/KhronosGroup/glTF-Sample-Viewer\nfn getVolumeTransmissionRay(n: vec3f, v: vec3f, thickness: f32, ior: f32, instanceInfo: u32) -> vec3f\n{\n let refractionVector = refract(-v, normalize(n), 1.0 / ior);\n let worldMatrix = get_worldMatrix(instanceInfo);\n\n var modelScale: vec3f;\n modelScale.x = length(vec3f(worldMatrix[0].xyz));\n modelScale.y = length(vec3f(worldMatrix[1].xyz));\n modelScale.z = length(vec3f(worldMatrix[2].xyz));\n\n return normalize(refractionVector) * thickness * modelScale;\n}\n#endif // RN_USE_TRANSMISSION\n\nstruct IblResult\n{\n specular: vec3f,\n diffuse: vec3f,\n FssEss: vec3f,\n};\n\n\n#ifdef RN_USE_IRIDESCENCE\nfn getIBLRadianceGGXWithIridescence(materialSID: u32, NdotV: f32, viewDirection: vec3f, albedo: vec3f, F0: vec3f,\n perceptualRoughness: f32, iblParameter: vec4f, hdriFormat: vec2i, rotEnvMatrix: mat3x3,\n normal_forEnv: vec3f, reflection: vec3f, iridescenceFresnel: vec3f, iridescence: f32, specularWeight: f32) -> IblResult\n{\n // get radiance\n let mipCount = iblParameter.x;\n let lod = (perceptualRoughness * (mipCount - 1.0));\n let radiance = get_radiance(reflection, lod, hdriFormat);\n\n // Roughness dependent fresnel\n let kS = fresnelSchlickRoughnessWithIridescence(F0, NdotV, perceptualRoughness, iridescenceFresnel, iridescence);\n let f_ab = envBRDFApprox(perceptualRoughness, NdotV);\n let FssEss = kS * f_ab.x + f_ab.y;\n var result: IblResult;\n result.FssEss = FssEss;\n\n // Specular IBL\n var specular = FssEss * radiance * specularWeight;\n\n // scale with user parameters\n let IBLSpecularContribution = iblParameter.z;\n specular *= IBLSpecularContribution;\n\n result.specular = specular;\n\n return result;\n}\n\nfn getIBLRadianceLambertianWithIridescence(materialSID: u32, NdotV: f32, viewDirection: vec3f, albedo: vec3f, F0: vec3f,\n perceptualRoughness: f32, iblParameter: vec4f, hdriFormat: vec2i, rotEnvMatrix: mat3x3,\n normal_forEnv: vec3f, reflection: vec3f, iridescenceF0: vec3f, iridescence: f32, specularWeight: f32) -> IblResult\n{\n // get irradiance\n let irradiance = get_irradiance(normal_forEnv, hdriFormat);\n\n // Use the maximum component of the iridescence Fresnel color\n // Maximum is used instead of the RGB value to not get inverse colors for the diffuse BRDF\n let iridescenceF0Max = vec3f(max(max(iridescenceF0.r, iridescenceF0.g), iridescenceF0.b));\n\n // Blend between base F0 and iridescence F0\n let mixedF0 = mix(F0, iridescenceF0Max, iridescence);\n\n // Roughness dependent fresnel\n let kS = fresnelSchlickRoughness(mixedF0, NdotV, perceptualRoughness);\n let f_ab = envBRDFApprox(perceptualRoughness, NdotV);\n let FssEss = specularWeight * kS * f_ab.x + f_ab.y;\n var result: IblResult;\n result.FssEss = FssEss;\n\n // Multiple scattering, Fdez-Aguera's approach\n let Ems = (1.0 - (f_ab.x + f_ab.y));\n let F_avg = specularWeight * (mixedF0 + (1.0 - mixedF0) / 21.0);\n let FmsEms = Ems * FssEss * F_avg / (1.0 - F_avg * Ems);\n let k_D = albedo * (1.0 - FssEss - FmsEms);\n\n // Diffuse IBL\n var diffuse = (FmsEms + k_D) * irradiance;\n\n // scale with user parameters\n let IBLDiffuseContribution = iblParameter.y;\n diffuse *= IBLDiffuseContribution;\n\n result.diffuse = diffuse;\n\n return result;\n}\n#endif // RN_USE_IRIDESCENCE\n\nfn getIBLRadianceLambertian(materialSID: u32, NdotV: f32, viewDirection: vec3f, albedo: vec3f, F0: vec3f,\n perceptualRoughness: f32, iblParameter: vec4f, hdriFormat: vec2, rotEnvMatrix: mat3x3,\n normal_forEnv: vec3f, reflection: vec3f, specularWeight: f32) -> IblResult\n{\n // get irradiance\n let irradiance: vec3f = get_irradiance(normal_forEnv, hdriFormat);\n\n // Roughness dependent fresnel\n let kS: vec3f = fresnelSchlickRoughness(F0, NdotV, perceptualRoughness);\n let f_ab: vec2f = envBRDFApprox(perceptualRoughness, NdotV);\n let FssEss: vec3f = specularWeight * kS * f_ab.x + f_ab.y;\n var result: IblResult;\n result.FssEss = FssEss;\n\n // Multiple scattering, Fdez-Aguera's approach\n let Ems = (1.0 - (f_ab.x + f_ab.y));\n let F_avg: vec3f = specularWeight * (F0 + (1.0 - F0) / 21.0);\n let FmsEms: vec3f = Ems * FssEss * F_avg / (1.0 - F_avg * Ems);\n let k_D: vec3f = albedo * (1.0 - FssEss - FmsEms);\n\n // Diffuse IBL\n var diffuse: vec3f = (FmsEms + k_D) * irradiance;\n\n // scale with user parameters\n let IBLDiffuseContribution = iblParameter.y;\n diffuse *= IBLDiffuseContribution;\n\n result.diffuse = diffuse;\n\n return result;\n}\n\nfn getIBLRadianceGGX(materialSID: u32, NdotV: f32, viewDirection: vec3f, albedo: vec3f, F0: vec3f,\n perceptualRoughness: f32, iblParameter: vec4f, hdriFormat: vec2, rotEnvMatrix: mat3x3,\n normal_forEnv: vec3f, reflection: vec3f, specularWeight: f32) -> IblResult\n{\n // get radiance\n let mipCount = iblParameter.x;\n let lod = (perceptualRoughness * (mipCount - 1.0));\n let radiance: vec3f = get_radiance(reflection, lod, hdriFormat);\n\n // Roughness dependent fresnel\n let kS: vec3f = fresnelSchlickRoughness(F0, NdotV, perceptualRoughness);\n let f_ab: vec2f = envBRDFApprox(perceptualRoughness, NdotV);\n let FssEss: vec3f = kS * f_ab.x + f_ab.y;\n var result: IblResult;\n result.FssEss = FssEss;\n\n // Specular IBL\n var specular: vec3f = FssEss * radiance * specularWeight;\n\n // scale with user parameters\n let IBLSpecularContribution = iblParameter.z;\n specular *= IBLSpecularContribution;\n\n result.specular = specular;\n\n return result;\n}\n\nfn IBLContribution(materialSID: u32, cameraSID: u32, normal_inWorld: vec3f, NdotV: f32, viewDirection: vec3f,\n albedo: vec3f, F0: vec3f, perceptualRoughness: f32,\n clearcoatRoughness: f32, clearcoatNormal_inWorld: vec3f, clearcoat: f32, VdotNc: f32, geomNormal_inWorld: vec3f,\n transmission: f32, v_position_inWorld: vec3f, instanceInfo: u32, thickness: f32, ior: f32,\n sheenColor: vec3f, sheenRoughness: f32, albedoSheenScalingNdotV: f32,\n iridescenceFresnel: vec3f, iridescenceF0: vec3f, iridescence: f32,\n anisotropy: f32, anisotropyDirection: vec3f, specularWeight: f32\n ) -> vec3f\n{\n let iblParameter: vec4f = get_iblParameter(materialSID, 0);\n let rot = iblParameter.w + 3.1415;\n let rotEnvMatrix = mat3x3(cos(rot), 0.0, -sin(rot), 0.0, 1.0, 0.0, sin(rot), 0.0, cos(rot));\n let hdriFormat: vec2 = get_hdriFormat(materialSID, 0);\n\n let normal_forEnv: vec3f = getNormalForEnv(rotEnvMatrix, normal_inWorld, materialSID);\n let reflection: vec3f = getReflection(rotEnvMatrix, viewDirection, normal_inWorld, materialSID, perceptualRoughness, anisotropy, anisotropyDirection);\n\n // IBL\n#ifdef RN_USE_IRIDESCENCE\n let baseRadianceResult: IblResult = getIBLRadianceGGXWithIridescence(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, iridescenceFresnel, iridescence, specularWeight);\n let baseLambertianResult: IblResult = getIBLRadianceLambertianWithIridescence(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, iridescenceF0, iridescence, specularWeight);\n#else\n let baseRadianceResult: IblResult = getIBLRadianceGGX(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, specularWeight);\n let baseLambertianResult: IblResult = getIBLRadianceLambertian(materialSID, NdotV, viewDirection, albedo, F0,\n perceptualRoughness, iblParameter, hdriFormat, rotEnvMatrix, normal_forEnv, reflection, specularWeight);\n#endif\n\n#ifdef RN_USE_TRANSMISSION\n let refractedRay = getVolumeTransmissionRay(geomNormal_inWorld, viewDirection, thickness, ior, instanceInfo);\n let refractedRayFromVPosition = v_position_inWorld + refractedRay;\n let ndcPoint = get_projectionMatrix(cameraSID, 0) * get_viewMatrix(cameraSID, 0) * vec4f(refractedRayFromVPosition, 1.0);\n var refractionCoords = ndcPoint.xy / ndcPoint.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n var transmittedLight = get_sample_from_backbuffer(materialSID, refractionCoords, perceptualRoughness, ior);\n\n#ifdef RN_USE_VOLUME\n let attenuationColor = get_attenuationColor(materialSID, 0);\n let attenuationDistance = get_attenuationDistance(materialSID, 0);\n transmittedLight = volumeAttenuation(attenuationColor, attenuationDistance, transmittedLight, length(refractedRay));\n#endif\n\n let transmissionComp = (vec3f(1.0) - baseRadianceResult.FssEss) * transmittedLight * albedo;\n let diffuse = mix(baseLambertianResult.diffuse, transmissionComp, transmission);\n let base = diffuse + baseRadianceResult.specular;\n#else\n let base: vec3f = baseLambertianResult.diffuse + baseRadianceResult.specular;\n#endif\n\n#ifdef RN_USE_SHEEN\n let sheen = sheenIBL(NdotV, sheenRoughness, sheenColor, iblParameter, reflection, hdriFormat);\n let color = sheen + base * albedoSheenScalingNdotV;\n#else\n let color = base;\n#endif\n\n#ifdef RN_USE_CLEARCOAT\n let VdotNg = dot(geomNormal_inWorld, viewDirection);\n let clearcoatNormal_forEnv = getNormalForEnv(rotEnvMatrix, normal_inWorld, materialSID);\n let coatResult: IblResult = getIBLRadianceGGX(materialSID, VdotNc, viewDirection, vec3f(0.0), F0,\n clearcoatRoughness, iblParameter, hdriFormat, rotEnvMatrix, clearcoatNormal_forEnv, reflection, specularWeight);\n let coatLayer = coatResult.specular;\n\n let clearcoatFresnel = 0.04 + (1.0 - 0.04) * pow(1.0 - abs(VdotNc), 5.0);\n let coated = color * vec3f(1.0 - clearcoat * clearcoatFresnel) + vec3f(coatLayer * clearcoat);\n return coated;\n#else\n return color;\n#endif\n}\n\n\n\n@fragment\nfn main(\n input: VertexOutput,\n @builtin(front_facing) isFront: bool,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n let viewPosition = get_viewPosition(cameraSID, 0);\n let viewVector = viewPosition - input.position_inWorld.xyz;\n let viewDirection = normalize(viewVector);\n\n// BaseColor\n var baseColor = vec4(1, 1, 1, 1);\n var baseColorFactor = get_baseColorFactor(materialSID, 0u);\n\n#ifdef RN_USE_COLOR_0\n baseColor = input.color_0;\n#endif\n\n baseColor *= baseColorFactor;\n\n#ifdef RN_USE_TEXCOORD_0\n let baseColorTextureTransform: vec4f = get_baseColorTextureTransform(materialSID, 0);\n let baseColorTextureRotation: f32 = get_baseColorTextureRotation(materialSID, 0);\n let baseColorTexcoordIndex: u32 = u32(get_baseColorTexcoordIndex(materialSID, 0));\n let baseColorTexcoord = getTexcoord(baseColorTexcoordIndex, input);\n let baseColorTexUv = uvTransform(baseColorTextureTransform.xy, baseColorTextureTransform.zw, baseColorTextureRotation, baseColorTexcoord);\n let textureColor = textureSample(baseColorTexture, baseColorSampler, baseColorTexUv);\n baseColor *= vec4(srgbToLinear(textureColor.rgb), textureColor.a);\n#else\n let baseColorTexUv = vec2f(0.0, 0.0);\n#endif\n\n#ifdef RN_IS_ALPHA_MODE_MASK\n let alphaCutoff = get_alphaCutoff(materialSID, 0);\n if (baseColor.a < alphaCutoff) {\n discard;\n }\n#endif\n\n\n\n// Normal\n var normal_inWorld = normalize(input.normal_inWorld);\n let geomNormal_inWorld = normal_inWorld;\n let normalTextureTransform: vec4f = get_normalTextureTransform(materialSID, 0);\n let normalTextureRotation: f32 = get_normalTextureRotation(materialSID, 0);\n let normalTexcoordIndex: u32 = u32(get_normalTexcoordIndex(materialSID, 0));\n let normalTexcoord: vec2f = getTexcoord(normalTexcoordIndex, input);\n let normalTexUv: vec2f = uvTransform(normalTextureTransform.xy, normalTextureTransform.zw, normalTextureRotation, normalTexcoord);\n let TBN: mat3x3 = getTBN(normal_inWorld, input, viewVector, normalTexUv, isFront);\n #ifdef RN_USE_NORMAL_TEXTURE\n let normalTexValue: vec3f = textureSample(normalTexture, normalSampler, normalTexUv).xyz;\n if(normalTexValue.b >= 128.0 / 255.0) {\n // normal texture is existence\n let normalTex = normalTexValue * 2.0 - 1.0;\n let normalScale = get_normalScale(materialSID, 0);\n let scaledNormal = normalize(normalTex * vec3(normalScale, normalScale, 1.0));\n normal_inWorld = normalize(TBN * scaledNormal);\n }\n #endif\n\n#ifdef RN_IS_LIGHTING\n // Metallic & Roughness\n let metallicRoughnessFactor: vec2f = get_metallicRoughnessFactor(materialSID, 0);\n var metallic = metallicRoughnessFactor.x;\n let metallicRoughnessTextureTransform = get_metallicRoughnessTextureTransform(materialSID, 0);\n let metallicRoughnessTextureRotation = get_metallicRoughnessTextureRotation(materialSID, 0);\n let metallicRoughnessTexcoordIndex = u32(get_metallicRoughnessTexcoordIndex(materialSID, 0));\n let metallicRoughnessTexcoord = getTexcoord(metallicRoughnessTexcoordIndex, input);\n let metallicRoughnessTexUv = uvTransform(metallicRoughnessTextureTransform.xy, metallicRoughnessTextureTransform.zw, metallicRoughnessTextureRotation, metallicRoughnessTexcoord);\n let ormTexel = textureSample(metallicRoughnessTexture, metallicRoughnessSampler, metallicRoughnessTexUv);\n var perceptualRoughness = ormTexel.g * metallicRoughnessFactor.y;\n metallic = ormTexel.b * metallic;\n metallic = clamp(metallic, 0.0, 1.0);\n perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0);\n let alphaRoughness = perceptualRoughness * perceptualRoughness;\n // filter NDF for specular AA --- https://jcgt.org/published/0010/02/02/\n let alphaRoughness2 = alphaRoughness * alphaRoughness;\n let filteredRoughness2 = IsotropicNDFFiltering(normal_inWorld, alphaRoughness2);\n perceptualRoughness = sqrt(sqrt(filteredRoughness2));\n\n // Albedo\n let black = vec3f(0.0);\n let albedo = mix(baseColor.rgb, black, metallic);\n\n // NdotV\n let NdotV = clamp(dot(normal_inWorld, viewDirection), Epsilon, 1.0);\n\n#ifdef RN_USE_ANISOTROPY\n // Anisotropy\n var anisotropy: f32 = get_anisotropyStrength(materialSID, 0);\n let anisotropyRotation: vec2f = get_anisotropyRotation(materialSID, 0);\n var direction: vec2f = anisotropyRotation;\n let anisotropyTex: vec3f = textureSample(anisotropyTexture, anisotropySampler, baseColorTexUv).rgb;\n direction = anisotropyTex.rg * 2.0 - vec2f(1.0);\n direction = mat2x2(anisotropyRotation.x, anisotropyRotation.y, -anisotropyRotation.y, anisotropyRotation.x) * normalize(direction);\n anisotropy *= anisotropyTex.b;\n let anisotropicT: vec3f = normalize(TBN * vec3f(direction, 0.0));\n let anisotropicB: vec3f = normalize(cross(geomNormal_inWorld, anisotropicT));\n let BdotV: f32 = dot(anisotropicB, viewDirection);\n let TdotV: f32 = dot(anisotropicT, viewDirection);\n#else\n let anisotropy = 0.0;\n let anisotropicT = vec3f(0.0, 0.0, 0.0);\n let anisotropicB = vec3f(0.0, 0.0, 0.0);\n let BdotV = 0.0;\n let TdotV = 0.0;\n#endif\n\n // Clearcoat\n#ifdef RN_USE_CLEARCOAT\n let clearcoatFactor = get_clearCoatFactor(materialSID, 0);\n let clearcoatTextureTransform = get_clearCoatTextureTransform(materialSID, 0);\n let clearcoatTextureRotation = get_clearCoatTextureRotation(materialSID, 0);\n let clearCoatTexcoordIndex = get_clearCoatTexcoordIndex(materialSID, 0);\n let clearCoatTexcoord = getTexcoord(clearCoatTexcoordIndex, input);\n let clearcoatTexUv = uvTransform(clearcoatTextureTransform.xy, clearcoatTextureTransform.zw, clearcoatTextureRotation, clearCoatTexcoord);\n let clearcoatTexture = textureSample(clearCoatTexture, clearCoatSampler, clearcoatTexUv).r;\n let clearcoat = clearcoatFactor * clearcoatTexture;\n#else\n let clearcoat = 0.0;\n#endif // RN_USE_CLEARCOAT\n\n // Transmission\n#ifdef RN_USE_TRANSMISSION\n let transmissionFactor = get_transmissionFactor(materialSID, 0);\n let transmissionTexture = textureSample(transmissionTexture, transmissionSampler, baseColorTexUv).r;\n let transmission = transmissionFactor * transmissionTexture;\n // alpha *= transmission;\n#else\n let transmission = 0.0;\n#endif // RN_USE_TRANSMISSION\n\n#ifdef RN_USE_SPECULAR\n let specularTexture: f32 = textureSample(specularTexture, specularSampler, baseColorTexUv).a;\n let specular: f32 = get_specularFactor(materialSID, 0) * specularTexture;\n let specularColorTexture: vec3f = srgbToLinear(textureSample(specularColorTexture, specularColorSampler, baseColorTexUv).rgb);\n let specularColor: vec3f = get_specularColorFactor(materialSID, 0) * specularColorTexture;\n#else\n let specular = 1.0;\n let specularColor = vec3f(1.0, 1.0, 1.0);\n#endif // RN_USE_SPECULAR\n\n // F0, F90\n let ior = get_ior(materialSID, 0);\n let outsideIor = 1.0;\n let dielectricSpecularF0 = min(\n ((ior - outsideIor) / (ior + outsideIor)) * ((ior - outsideIor) / (ior + outsideIor)) * specularColor,\n vec3f(1.0)\n ) * specular;\n let dielectricSpecularF90 = vec3f(specular);\n let F0 = mix(dielectricSpecularF0, baseColor.rgb, metallic);\n let F90 = mix(dielectricSpecularF90, vec3f(1.0), metallic);\n\n// Iridescence\n#ifdef RN_USE_IRIDESCENCE\n let iridescenceFactor: f32 = get_iridescenceFactor(materialSID, 0);\n let iridescenceTexture: f32 = textureSample(iridescenceTexture, iridescenceSampler, baseColorTexUv).r;\n let iridescence: f32 = iridescenceFactor * iridescenceTexture;\n let iridescenceIor: f32 = get_iridescenceIor(materialSID, 0);\n let thicknessRatio: f32 = textureSample(iridescenceThicknessTexture, iridescenceThicknessSampler, baseColorTexUv).r;\n let iridescenceThicknessMinimum: f32 = get_iridescenceThicknessMinimum(materialSID, 0);\n let iridescenceThicknessMaximum: f32 = get_iridescenceThicknessMaximum(materialSID, 0);\n let iridescenceThickness: f32 = mix(iridescenceThicknessMinimum, iridescenceThicknessMaximum, thicknessRatio);\n let iridescenceFresnel: vec3f = calcIridescence(1.0, iridescenceIor, NdotV, iridescenceThickness, F0);\n let iridescenceF0: vec3f = Schlick_to_F0(iridescenceFresnel, NdotV);\n#else\n let iridescence = 0.0;\n let iridescenceFresnel = vec3f(0.0);\n let iridescenceF0: vec3f = F0;\n#endif // RN_USE_IRIDESCENCE\n\n// Clearcoat\n#ifdef RN_USE_CLEARCOAT\n let clearcoatRoughnessFactor = get_clearCoatRoughnessFactor(materialSID, 0);\n let clearCoatRoughnessTexcoordIndex = get_clearCoatRoughnessTexcoordIndex(materialSID, 0);\n let clearCoatRoughnessTexcoord = getTexcoord(clearCoatRoughnessTexcoordIndex, input);\n let clearcoatRoughnessTextureTransform = get_clearCoatRoughnessTextureTransform(materialSID, 0);\n let clearcoatRoughnessTextureRotation = get_clearCoatRoughnessTextureRotation(materialSID, 0);\n let clearcoatRoughnessTexUv = uvTransform(clearcoatRoughnessTextureTransform.xy, clearcoatRoughnessTextureTransform.zw, clearcoatRoughnessTextureRotation, clearCoatRoughnessTexcoord);\n let textureRoughnessTexture = textureSample(clearCoatRoughnessTexture, clearCoatRoughnessSampler, clearcoatRoughnessTexUv).g;\n let clearcoatRoughness = clearcoatRoughnessFactor * textureRoughnessTexture;\n\n let clearCoatNormalTexcoordIndex = get_clearCoatNormalTexcoordIndex(materialSID, 0);\n let clearCoatNormalTexcoord = getTexcoord(clearCoatNormalTexcoordIndex, input);\n let clearcoatNormalTextureTransform = get_clearCoatNormalTextureTransform(materialSID, 0);\n let clearcoatNormalTextureRotation = get_clearCoatNormalTextureRotation(materialSID, 0);\n let clearcoatNormalTexUv = uvTransform(clearcoatNormalTextureTransform.xy, clearcoatNormalTextureTransform.zw, clearcoatNormalTextureRotation, clearCoatNormalTexcoord);\n let textureNormal_tangent = textureSample(clearCoatNormalTexture, clearCoatNormalSampler, clearcoatNormalTexUv).xyz * vec3(2.0) - vec3(1.0);\n let clearcoatNormal_inWorld = normalize(TBN * textureNormal_tangent);\n let VdotNc = saturateEpsilonToOne(dot(viewDirection, clearcoatNormal_inWorld));\n#else\n let clearcoatRoughness = 0.0;\n let clearcoatNormal_inWorld = vec3f(0.0);\n let VdotNc = 0.0;\n#endif // RN_USE_CLEARCOAT\n\n\n#ifdef RN_USE_VOLUME\n // Volume\n let thicknessFactor: f32 = get_thicknessFactor(materialSID, 0);\n let thicknessTexture: f32 = textureSample(thicknessTexture, thicknessSampler, baseColorTexUv).g;\n let attenuationDistance: f32 = get_attenuationDistance(materialSID, 0);\n let attenuationColor: vec3f = get_attenuationColor(materialSID, 0);\n let thickness: f32 = thicknessFactor * thicknessTexture;\n#else\n let thickness = 0.0;\n let attenuationColor = vec3f(0.0);\n let attenuationDistance = 0.000001;\n#endif // RN_USE_VOLUME\n\n#ifdef RN_USE_SHEEN\n // Sheen\n let sheenColorFactor: vec3f = get_sheenColorFactor(materialSID, 0);\n let sheenColorTexture: vec3f = textureSample(sheenColorTexture, sheenColorSampler, baseColorTexUv).rgb;\n let sheenRoughnessFactor: f32 = get_sheenRoughnessFactor(materialSID, 0);\n let sheenRoughnessTexture: f32 = textureSample(sheenRoughnessTexture, sheenRoughnessSampler, baseColorTexUv).a;\n let sheenColor: vec3f = sheenColorFactor * sheenColorTexture;\n let sheenRoughness: f32 = clamp(sheenRoughnessFactor * sheenRoughnessTexture, 0.000001, 1.0);\n let albedoSheenScalingNdotV: f32 = 1.0 - max3(sheenColor) * textureSample(sheenLutTexture, sheenLutSampler, vec2(NdotV, sheenRoughness)).r;\n#else\n let sheenColor = vec3f(0.0);\n let sheenRoughness = 0.000001;\n let albedoSheenScalingNdotV = 1.0;\n#endif // RN_USE_SHEEN\n\n var resultColor = vec3(0, 0, 0);\n var resultAlpha = baseColor.a;\n\n // Lighting\n let lightNumber = u32(get_lightNumber(0u, 0u));\n for (var i = 0u; i < lightNumber; i++) {\n let light: Light = getLight(i, input.position_inWorld);\n resultColor += lightingWithPunctualLight(light, normal_inWorld, viewDirection,\n NdotV, albedo, perceptualRoughness, F0, F90,\n transmission, ior,\n clearcoat, clearcoatRoughness, clearcoatNormal_inWorld, VdotNc,\n attenuationColor, attenuationDistance,\n anisotropy, anisotropicT, anisotropicB, BdotV, TdotV,\n sheenColor, sheenRoughness, albedoSheenScalingNdotV,\n iridescence, iridescenceFresnel, specular\n );\n }\n\n let ibl: vec3f = IBLContribution(materialSID, cameraSID, normal_inWorld, NdotV, viewDirection,\n albedo, F0, perceptualRoughness,\n clearcoatRoughness, clearcoatNormal_inWorld, clearcoat, VdotNc, geomNormal_inWorld,\n transmission, input.position_inWorld.xyz, u32(input.instanceInfo), thickness, ior,\n sheenColor, sheenRoughness, albedoSheenScalingNdotV,\n iridescenceFresnel, iridescenceF0, iridescence,\n anisotropy, anisotropicB, specular\n );\n\n let occlusionTexcoordIndex = get_occlusionTexcoordIndex(materialSID, 0);\n let occlusionTexcoord = getTexcoord(occlusionTexcoordIndex, input);\n let occlusionTextureTransform = get_occlusionTextureTransform(materialSID, 0);\n let occlusionTextureRotation = get_occlusionTextureRotation(materialSID, 0);\n let occlusionTexUv = uvTransform(occlusionTextureTransform.xy, occlusionTextureTransform.zw, occlusionTextureRotation, occlusionTexcoord);\n let occlusion = textureSample(occlusionTexture, occlusionSampler, occlusionTexUv).r;\n let occlusionStrength = get_occlusionStrength(materialSID, 0);\n\n // Occlution to Indirect Lights\n resultColor += mix(ibl, ibl * occlusion, occlusionStrength);\n#else\n var resultColor = baseColor.rgb;\n var resultAlpha = baseColor.a;\n#endif // RN_IS_LIGHTING\n\n // Emissive\n let emissiveFactor = get_emissiveFactor(materialSID, 0);\n let emissiveTexcoordIndex = get_emissiveTexcoordIndex(materialSID, 0);\n let emissiveTexcoord = getTexcoord(emissiveTexcoordIndex, input);\n let emissiveTextureTransform = get_emissiveTextureTransform(materialSID, 0);\n let emissiveTextureRotation = get_emissiveTextureRotation(materialSID, 0);\n let emissiveTexUv = uvTransform(emissiveTextureTransform.xy, emissiveTextureTransform.zw, emissiveTextureRotation, emissiveTexcoord);\n let emissiveStrength = get_emissiveStrength(materialSID, 0);\n let emissive = emissiveFactor * srgbToLinear(textureSample(emissiveTexture, emissiveSampler, emissiveTexUv).xyz) * emissiveStrength;\n\n#ifdef RN_USE_CLEARCOAT\n let coated_emissive = emissive * mix(vec3f(1.0), vec3f(0.04 + (1.0 - 0.04) * pow(1.0 - NdotV, 5.0)), clearcoat);\n resultColor += coated_emissive;\n#else\n resultColor += emissive;\n#endif // RN_USE_CLEARCOAT\n\n#ifdef RN_IS_ALPHA_MODE_BLEND\n#else\n resultAlpha = 1.0;\n#endif\n\nlet makeOutputSrgb = get_makeOutputSrgb(materialSID, 0);\nresultColor = select(resultColor.rgb, linearToSrgb(resultColor.rgb), makeOutputSrgb);\n\n return vec4f(resultColor * resultAlpha, resultAlpha);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert": /*!***************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n\n#ifdef RN_IS_SKINNING\n\nfn createMatrixFromQuaternionTranslationScale( quaternion: vec4, translation: vec3, scale: vec3 ) -> mat4x4 {\n let q = quaternion;\n let t = translation;\n\n let sx = q.x * q.x;\n let sy = q.y * q.y;\n let sz = q.z * q.z;\n let cx = q.y * q.z;\n let cy = q.x * q.z;\n let cz = q.x * q.y;\n let wx = q.w * q.x;\n let wy = q.w * q.y;\n let wz = q.w * q.z;\n\n let mat = mat4x4(\n 1.0 - 2.0 * (sy + sz), 2.0 * (cz + wz), 2.0 * (cy - wy), 0.0,\n 2.0 * (cz - wz), 1.0 - 2.0 * (sx + sz), 2.0 * (cx + wx), 0.0,\n 2.0 * (cy + wy), 2.0 * (cx - wx), 1.0 - 2.0 * (sx + sy), 0.0,\n t.x, t.y, t.z, 1.0\n );\n\n let uniformScaleMat = mat4x4(\n scale.x, 0.0, 0.0, 0.0,\n 0.0, scale.y, 0.0, 0.0,\n 0.0, 0.0, scale.z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n let mat44 = mat*uniformScaleMat;\n return mat44;\n\n}\n\nfn unpackedVec2ToNormalizedVec4(vec_xy: vec2, criteria: f32) -> vec4 {\n\n var r: f32;\n var g: f32;\n var b: f32;\n var a: f32;\n\n let ix = floor(vec_xy.x * criteria);\n let v1x = ix / criteria;\n let v1y = ix - floor(v1x) * criteria;\n\n r = ( v1x + 1.0 ) / (criteria-1.0);\n g = ( v1y + 1.0 ) / (criteria-1.0);\n\n let iy = floor( vec_xy.y * criteria);\n let v2x = iy / criteria;\n let v2y = iy - floor(v2x) * criteria;\n\n b = ( v2x + 1.0 ) / (criteria-1.0);\n a = ( v2y + 1.0 ) / (criteria-1.0);\n\n r -= 1.0/criteria;\n g -= 1.0/criteria;\n b -= 1.0/criteria;\n a -= 1.0/criteria;\n\n r = r*2.0-1.0;\n g = g*2.0-1.0;\n b = b*2.0-1.0;\n a = a*2.0-1.0;\n\n return vec4(r, g, b, a);\n}\n\nfn get_boneMatrixAsMat4x4(skeletalComponentSID: u32, joint: u32) -> mat4x4 {\n let mat43: mat4x3 = get_boneMatrix(skeletalComponentSID, joint);\n return mat4x4(\n vec4(mat43[0], 0.0),\n vec4(mat43[1], 0.0),\n vec4(mat43[2], 0.0),\n vec4(mat43[3], 1.0)\n );\n}\n\nfn getSkinMatrix(skeletalComponentSID: u32, joint: vec4, weight: vec4) -> mat4x4 {\n\n#ifdef RN_BONE_DATA_TYPE_Mat43x1\n var skinMat: mat4x4 = weight.x * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.x);\n skinMat += weight.y * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.y);\n skinMat += weight.z * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.z);\n skinMat += weight.w * get_boneMatrixAsMat4x4(skeletalComponentSID, joint.w);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2)\n let criteria = vec2(4096.0, 4096.0);\n\n let tq_x = get_boneTranslatePackedQuat(skeletalComponentSID, joint.x);\n let sq_x = get_boneScalePackedQuat(skeletalComponentSID, joint.x);\n var quat = unpackedVec2ToNormalizedVec4(vec2(tq_x.w, sq_x.w), criteria.x);\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(quat, tq_x.xyz, sq_x.xyz);\n\n let tq_y = get_boneTranslatePackedQuat(skeletalComponentSID, joint.y);\n let sq_y = get_boneScalePackedQuat(skeletalComponentSID, joint.y);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_y.w, sq_y.w), criteria.x);\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(quat, tq_y.xyz, sq_y.xyz);\n\n let tq_z = get_boneTranslatePackedQuat(skeletalComponentSID, joint.z);\n let sq_z = get_boneScalePackedQuat(skeletalComponentSID, joint.z);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_z.w, sq_z.w), criteria.x);\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(quat, tq_z.xyz, sq_z.xyz);\n\n let tq_w = get_boneTranslatePackedQuat(skeletalComponentSID, joint.w);\n let sq_w = get_boneScalePackedQuat(skeletalComponentSID, joint.w);\n quat = unpackedVec2ToNormalizedVec4(vec2(tq_w.w, sq_w.w), criteria.x);\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(quat, tq_w.xyz, sq_w.xyz);\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X2_OLD)\n let ts_x = get_boneTranslateScale(skeletalComponentSID, joint.x);\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.x), ts_x.xyz, vec3(ts_x.w));\n let ts_y = get_boneTranslateScale(skeletalComponentSID, joint.y);\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.y), ts_y.xyz, vec3(ts_y.w));\n let ts_z = get_boneTranslateScale(skeletalComponentSID, joint.z);\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.z), ts_z.xyz, vec3(ts_z.w));\n let ts_w = get_boneTranslateScale(skeletalComponentSID, joint.w);\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(\n get_boneQuaternion(skeletalComponentSID, joint.w), ts_w.xyz, vec3(ts_w.w));\n\n#elif defined(RN_BONE_DATA_TYPE_VEC4X1)\n let boneCompressedChunksX = get_boneCompressedChunk(skeletalComponentSID, joint.x);\n let boneCompressedChunksY = get_boneCompressedChunk(skeletalComponentSID, joint.y);\n let boneCompressedChunksZ = get_boneCompressedChunk(skeletalComponentSID, joint.z);\n let boneCompressedChunksW = get_boneCompressedChunk(skeletalComponentSID, joint.w);\n\n let criteria = vec2(4096.0, 4096.0);\n let boneCompressedInfo = get_boneCompressedInfo(0.0, 0);\n\n let ts_x = unpackedVec2ToNormalizedVec4(boneCompressedChunksX.zw, criteria.y)*boneCompressedInfo;\n var skinMat: mat4x4 = weight.x * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksX.xy, criteria.x), ts_x.xyz, vec3(ts_x.w));\n let ts_y = unpackedVec2ToNormalizedVec4(boneCompressedChunksY.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.y * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksY.xy, criteria.x), ts_y.xyz, vec3(ts_y.w));\n let ts_z = unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.z * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksZ.xy, criteria.x), ts_z.xyz, vec3(ts_z.w));\n let ts_w = unpackedVec2ToNormalizedVec4(boneCompressedChunksW.zw, criteria.y)*boneCompressedInfo;\n skinMat += weight.w * createMatrixFromQuaternionTranslationScale(\n unpackedVec2ToNormalizedVec4(boneCompressedChunksW.xy, criteria.x), ts_w.xyz, vec3(ts_w.w));\n#endif\n return skinMat;\n}\n#endif\n\nfn toNormalMatrix(m: mat4x4) -> mat3x3 {\n let a00 = m[0][0];\n let a01 = m[0][1];\n let a02 = m[0][2];\n let a03 = m[0][3];\n let a10 = m[1][0];\n let a11 = m[1][1];\n let a12 = m[1][2];\n let a13 = m[1][3];\n let a20 = m[2][0];\n let a21 = m[2][1];\n let a22 = m[2][2];\n let a23 = m[2][3];\n let a30 = m[3][0];\n let a31 = m[3][1];\n let a32 = m[3][2];\n let a33 = m[3][3];\n\n let b00 = a00 * a11 - a01 * a10;\n let b01 = a00 * a12 - a02 * a10;\n let b02 = a00 * a13 - a03 * a10;\n let b03 = a01 * a12 - a02 * a11;\n let b04 = a01 * a13 - a03 * a11;\n let b05 = a02 * a13 - a03 * a12;\n let b06 = a20 * a31 - a21 * a30;\n let b07 = a20 * a32 - a22 * a30;\n let b08 = a20 * a33 - a23 * a30;\n let b09 = a21 * a32 - a22 * a31;\n let b10 = a21 * a33 - a23 * a31;\n let b11 = a22 * a33 - a23 * a32;\n\n let determinantVal = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n return mat3x3(\n (a11 * b11 - a12 * b10 + a13 * b09) / determinantVal,\n (a12 * b08 - a10 * b11 - a13 * b07) / determinantVal,\n (a10 * b10 - a11 * b08 + a13 * b06) / determinantVal,\n (a02 * b10 - a01 * b11 - a03 * b09) / determinantVal,\n (a00 * b11 - a02 * b08 + a03 * b07) / determinantVal,\n (a01 * b08 - a00 * b10 - a03 * b06) / determinantVal,\n (a31 * b05 - a32 * b04 + a33 * b03) / determinantVal,\n (a32 * b02 - a30 * b05 - a33 * b01) / determinantVal,\n (a30 * b04 - a31 * b02 + a33 * b00) / determinantVal\n );\n}\n\nstruct GeometoryOutput {\n normalMatrix: mat3x3,\n position_inWorld: vec4,\n normal_inWorld: vec3,\n isSkinning: bool,\n}\n\n#ifdef RN_IS_SKINNING\nfn skinning(\n skeletalComponentSID: u32,\n inNormalMatrix: mat3x3,\n inPosition_inLocal: vec3,\n inNormal_inLocal: vec3,\n joint: vec4,\n weight: vec4,\n ) -> GeometoryOutput\n{\n var output: GeometoryOutput;\n let skinMat = getSkinMatrix(skeletalComponentSID, joint, weight);\n output.position_inWorld = skinMat * vec4(inPosition_inLocal, 1.0);\n output.normalMatrix = toNormalMatrix(skinMat);\n output.normal_inWorld = normalize(output.normalMatrix * inNormal_inLocal);\n output.isSkinning = true;\n\n return output;\n}\n#endif\n\n\nfn processGeometryWithMorphingAndSkinning(\n skeletalComponentSID: i32,\n blendShapeComponentSID: u32,\n worldMatrix: mat4x4,\n viewMatrix: mat4x4,\n isBillboard: bool,\n inNormalMatrix: mat3x3,\n inPosition_inLocal: vec3,\n inNormal_inLocal: vec3,\n baryCentricCoord: vec4,\n joint: vec4,\n weight: vec4,\n) -> GeometoryOutput {\n var output: GeometoryOutput;\n\n var position_inLocal: vec3;\n#ifdef RN_IS_MORPHING\n if (_morphTargetNumber == 0u) {\n#endif\n position_inLocal = inPosition_inLocal;\n#ifdef RN_IS_MORPHING\n } else {\n let vertexIdx = u32(baryCentricCoord.w);\n position_inLocal = get_position(vertexIdx, inPosition_inLocal, blendShapeComponentSID);\n }\n#endif\n\n var worldMatrixInner = worldMatrix;\n\n#ifdef RN_IS_SKINNING\n if (skeletalComponentSID >= 0) {\n output = skinning(u32(skeletalComponentSID), inNormalMatrix, position_inLocal, inNormal_inLocal, joint, weight);\n } else {\n#endif\n output.normalMatrix = inNormalMatrix;\n output.position_inWorld = worldMatrixInner * vec4(position_inLocal, 1.0);\n output.normal_inWorld = normalize(inNormalMatrix * inNormal_inLocal);\n output.isSkinning = false;\n#ifdef RN_IS_SKINNING\n }\n#endif\n\n return output;\n}\n\n\n// BiasMatrix * LightProjectionMatrix * LightViewMatrix, See: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/#basic-shader\n// #param depthBiasPV: mat4x4; // initialValue=(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)\n\n@vertex\nfn main(\n#ifdef RN_USE_INSTANCE\n @location(8) instance_ids: vec4,\n#endif\n\n\n#ifdef RN_USE_POSITION_FLOAT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_INT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_UINT\n @location(0) position: vec3,\n#endif\n\n#ifdef RN_USE_NORMAL\n @location(1) normal: vec3,\n#endif\n#ifdef RN_USE_TANGENT\n @location(2) tangent: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_0\n @location(3) texcoord_0: vec2,\n#endif\n#ifdef RN_USE_TEXCOORD_1\n @location(4) texcoord_1: vec2,\n#endif\n\n#ifdef RN_USE_COLOR_0_FLOAT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_INT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_UINT\n @location(5) color_0: vec4,\n#endif\n\n#ifdef RN_USE_JOINTS_0\n @location(6) joints_0: vec4,\n#endif\n#ifdef RN_USE_WEIGHTS_0\n @location(7) weights_0: vec4,\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n @location(10) baryCentricCoord: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_2\n @location(11) texcoord_2: vec2,\n#endif\n @builtin(vertex_index) vertexIdx : u32,\n\n\n) -> VertexOutput {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var output : VertexOutput;\n let instanceId = u32(instance_ids.x);\n let worldMatrix = get_worldMatrix(instanceId);\n let normalMatrix = get_normalMatrix(instanceId);\n let viewMatrix = get_viewMatrix(cameraSID, 0);\n let projectionMatrix = get_projectionMatrix(cameraSID, 0);\n\n let skeletalComponentSID = i32(instance_ids.y);\n\n#ifdef RN_USE_NORMAL\n#else\n let normal = vec3(0.0, 0.0, 0.0);\n#endif\n\n#ifdef RN_USE_JOINTS_0\n let joint = joints_0;\n#else\n let joint = vec4(0, 0, 0, 0);\n#endif\n#ifdef RN_USE_WEIGHTS_0\n let weight = weights_0;\n#else\n let weight = vec4(0.0, 0.0, 0.0, 0.0);\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n#else\n let baryCentricCoord = vec4(0.0, 0.0, 0.0, 0.0);\n#endif\n\n let blendShapeComponentSID = u32(instance_ids.z);\n let geom = processGeometryWithMorphingAndSkinning(\n skeletalComponentSID,\n blendShapeComponentSID,\n worldMatrix,\n viewMatrix,\n false,\n normalMatrix,\n position,\n normal,\n baryCentricCoord,\n joint,\n weight\n );\n\n output.position = projectionMatrix * viewMatrix * geom.position_inWorld;\n output.position_inWorld = geom.position_inWorld.xyz;\n output.normal_inWorld = geom.normal_inWorld;\n\n#ifdef RN_USE_TEXCOORD_0\n output.texcoord_0 = texcoord_0;\n#endif\n#ifdef RN_USE_TEXCOORD_1\n output.texcoord_1 = texcoord_1;\n#endif\n#ifdef RN_USE_TEXCOORD_2\n output.texcoord_2 = texcoord_2;\n#endif\n\n#ifdef RN_USE_COLOR_0\n output.color_0 = vec4f(color_0);\n#else\n output.color_0 = vec4(1.0, 1.0, 1.0, 1.0);\n#endif\n\n#ifdef RN_USE_TANGENT\n output.tangent_inWorld = normalMatrix * tangent.xyz;\n output.binormal_inWorld = cross(output.tangent_inWorld, output.normal_inWorld) * tangent.w;\n#endif\n\n output.instanceInfo = instance_ids.x;\n\n let visibility = get_isVisible(instanceId);\n if (!visibility)\n {\n output.position = vec4f(0.0, 0.0, 0.0, 1.0);\n }\n\n#ifdef RN_USE_SHADOW_MAPPING\n output.shadowCoord = get_depthBiasPV(materialSID, 0) * geom.position_inWorld;\n#endif\n\n return output;\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag.wgsl": /*!**************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag.wgsl ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n\n@group(1) @binding(0) var baseColorTexture: texture_cube; // initialValue=white\n@group(2) @binding(0) var baseColorSampler: sampler;\n// #param cubeMapFaceId: i32; // initialValue=0\n// #param distributionType: i32; // initialValue=0\n// #param roughness: f32; // initialValue=0.0\n// #param sampleCount: i32; // initialValue=1024\n\nconst cLambertian: i32 = 0;\nconst cGGX: i32 = 1;\n\n// http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html\nfn radicalInverse_VdC(_bits: u32) -> f32\n{\n var bits = (_bits << 16u) | (_bits >> 16u);\n bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n return f32(bits) * 2.3283064365386963e-10; // / 0x100000000\n}\n\nfn hammersley2d(i: i32, N: i32) -> vec2f {\n return vec2f(f32(i)/f32(N), radicalInverse_VdC(u32(i)));\n}\n\nfn createTBN(normal: vec3f) -> mat3x3\n{\n var bitangent = vec3f(0.0, 1.0, 0.0);\n let NdotUp = dot(normal, vec3f(0.0, 1.0, 0.0));\n let epsilon = 0.0000001;\n if (1.0 - abs(NdotUp) <= epsilon)\n {\n bitangent = select(vec3(0.0, 0.0, -1.0), vec3(0.0, 0.0, 1.0), NdotUp > 0.0);\n }\n let tangent = normalize(cross(bitangent, normal));\n bitangent = cross(normal, tangent);\n return mat3x3(tangent, bitangent, normal);\n}\n\nfn getImportanceSampleLambertian(sampleIndex: i32, N: vec3f, roughness: f32, materialSID: u32) -> vec4f\n{\n let xi = hammersley2d(sampleIndex, get_sampleCount(materialSID, 0));\n\n let sinTheta = sqrt(1.0 - xi.y);\n let cosTheta = sqrt(xi.y);\n let phi = 2.0 * M_PI * xi.x;\n let pdf = cosTheta / M_PI;\n\n let localDirection = normalize(vec3f(\n sinTheta * cos(phi),\n sinTheta * sin(phi),\n cosTheta\n ));\n let direction = createTBN(N) * localDirection;\n\n return vec4f(direction, pdf);\n}\n\n// GGX NDF\nfn d_GGX(NH: f32, alphaRoughness: f32) -> f32 {\n let roughnessSqr = alphaRoughness * alphaRoughness;\n let f = (roughnessSqr - 1.0) * NH * NH + 1.0;\n return roughnessSqr / (M_PI * f * f);\n}\n\n// We learnd a lot from the following resources\n// https://bruop.github.io/ibl/\nfn getImportanceSampleGGX(sampleIndex: i32, N: vec3f, roughness: f32, materialSID: u32) -> vec4f\n{\n let xi = hammersley2d(sampleIndex, get_sampleCount(materialSID, 0));\n\n let alpha = roughness * roughness;\n let cosTheta = clamp(sqrt((1.0 - xi.y) / (1.0 + (alpha * alpha - 1.0) * xi.y)), 0.0, 1.0);\n let sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n let phi = 2.0 * M_PI * xi.x;\n var pdf = d_GGX(cosTheta, alpha);\n pdf /= 4.0;\n\n let localDirection = normalize(vec3f(\n sinTheta * cos(phi),\n sinTheta * sin(phi),\n cosTheta\n ));\n let direction = createTBN(N) * localDirection;\n\n return vec4f(direction, pdf);\n}\n\n// We learnd a lot from the following resources\n// https://developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-20-gpu-based-importance-sampling\n// https://cgg.mff.cuni.cz/~jaroslav/papers/2007-sketch-fis/Final_sap_0073.pdf\n// https://google.github.io/filament/Filament.html#annex/importancesamplingfortheibl/pre-filteredimportancesampling\nfn computeLod(pdf: f32, width: u32, sampleCount: i32) -> f32\n{\n // 6.0 is the number of faces of the cubemap\n // log4 = 0.5 * log2\n // We don't use the constant K in the filament document\n return 0.5 * log2( 6.0 * f32(width) * f32(width) / (f32(sampleCount) * pdf));\n}\n\nfn prefilter(N: vec3f, materialSID: u32) -> vec3f\n{\n var color = vec3f(0.f);\n var weight = 0.0f;\n let sampleCount = get_sampleCount(materialSID, 0);\n\n let texSize: vec2 = textureDimensions(baseColorTexture, 0);\n\n for(var i = 0; i < get_sampleCount(materialSID, 0); i++)\n {\n var importanceSample: vec4;\n\n let distributionType = get_distributionType(materialSID, 0);\n if(distributionType == cLambertian) {\n importanceSample = getImportanceSampleLambertian(i, N, get_roughness(materialSID, 0), materialSID);\n } else {\n importanceSample = getImportanceSampleGGX(i, N, get_roughness(materialSID, 0), materialSID);\n }\n\n let H = vec3f(importanceSample.xyz);\n let pdf = importanceSample.w;\n let lod = computeLod(pdf, texSize.x, sampleCount);\n\n if(distributionType == cLambertian)\n {\n let lambertian = textureSampleLevel(baseColorTexture, baseColorSampler, H, lod).rgb;\n color += lambertian;\n }\n else if(distributionType == cGGX)\n {\n let V = N;\n let L = normalize(reflect(-V, H));\n let NdotL = dot(N, L);\n\n if (NdotL > 0.0)\n {\n let sampleColor = textureSampleLevel(baseColorTexture, baseColorSampler, L, lod).rgb;\n color += sampleColor * NdotL;\n weight += NdotL;\n }\n }\n }\n\n if(weight != 0.0f)\n {\n color /= weight;\n }\n else\n {\n color /= f32(sampleCount);\n }\n\n return color.rgb;\n}\n\nfn uvToDir(faceId: i32, uv: vec2f) -> vec3f\n{\n\tif (faceId == 0) {\n\t\treturn vec3f(1.f, uv.y, -uv.x);\n } else if(faceId == 1) {\n\t\treturn vec3f(-1.f, uv.y, uv.x);\n } else if(faceId == 2) {\n\t\treturn vec3f(uv.x, -1.f, uv.y);\n } else if(faceId == 3) {\n\t\treturn vec3f(uv.x, 1.f, -uv.y);\n } else if(faceId == 4) {\n\t\treturn vec3f(uv.x, uv.y, 1.f);\n } else {\n return vec3f(-uv.x, uv.y, -1.f);\n }\n}\n\n// learned a lot from https://github.com/KhronosGroup/glTF-Sample-Viewer\n@fragment\nfn main (\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n let uv = input.texcoord_0 * 2.0 - 1.0;\n let scan = uvToDir(get_cubeMapFaceId(materialSID, 0), uv);\n var direction = normalize(scan);\n direction.y = -direction.y;\n\n let rt0 = vec4f(prefilter(direction, materialSID), 1.0);\n\n return rt0;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert.wgsl": /*!**************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert.wgsl ***! \**************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag": /*!*************************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag ***! \*************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n@fragment\nfn main (\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n let synthesizeCoefficient0 = get_synthesizeCoefficient(materialSID, 0);\n var color: vec3f = synthesizeCoefficient0 * textureSample(synthesizeTexture0, synthesizeSampler0, input.texcoord_0).rgb;\n\n let synthesizeCoefficient1 = get_synthesizeCoefficient(materialSID, 1);\n let synthesizeCoefficient2 = get_synthesizeCoefficient(materialSID, 2);\n let synthesizeCoefficient3 = get_synthesizeCoefficient(materialSID, 3);\n let synthesizeCoefficient4 = get_synthesizeCoefficient(materialSID, 4);\n let synthesizeCoefficient5 = get_synthesizeCoefficient(materialSID, 5);\n\n color += synthesizeCoefficient1 * textureSample(synthesizeTexture1, synthesizeSampler0, input.texcoord_0).rgb;\n color += synthesizeCoefficient2 * textureSample(synthesizeTexture2, synthesizeSampler0, input.texcoord_0).rgb;\n color += synthesizeCoefficient3 * textureSample(synthesizeTexture3, synthesizeSampler0, input.texcoord_0).rgb;\n color += synthesizeCoefficient4 * textureSample(synthesizeTexture4, synthesizeSampler0, input.texcoord_0).rgb;\n color += synthesizeCoefficient5 * textureSample(synthesizeTexture5, synthesizeSampler0, input.texcoord_0).rgb;\n\n let rt0 = vec4f(color, 1.0);\n\n return rt0;\n}\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert": /*!*************************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert ***! \*************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n","shaderStage":"vertex","isFragmentShader":false}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag.wgsl": /*!************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag.wgsl ***! \************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n\n@group(1) @binding(0) var baseColorTexture: texture_2d; // initialValue=white\n@group(2) @binding(0) var baseColorSampler: sampler;\n\n// #param enableLinearToSrgb: bool; // initialValue=true\n\nfn linearToSrgb(linearColor: vec3f) -> vec3f {\n return pow(linearColor, vec3f(1.0/2.2));\n}\n\nfn srgbToLinear(srgbColor: vec3f) -> vec3f {\n return pow(srgbColor, vec3f(2.2));\n}\n\n\n#ifdef RN_USE_KHRONOS_PBR_NEUTRAL\n// Input color is non-negative and resides in the Linear Rec. 709 color space.\n// Output color is also Linear Rec. 709, but in the [0, 1] range.\n// See: https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral\nfn PBRNeutralToneMapping( inColor: vec3f ) -> vec3f {\n let startCompression = 0.8 - 0.04;\n let desaturation = 0.15;\n\n let x = min(inColor.r, min(inColor.g, inColor.b));\n let offset = select(0.04, x - 6.25 * x * x, x < 0.08);\n var color = inColor - offset;\n\n let peak = max(color.r, max(color.g, color.b));\n if (peak < startCompression) {\n return color;\n }\n\n let d = 1.0 - startCompression;\n let newPeak = 1.0 - d * d / (peak + d - startCompression);\n color *= newPeak / peak;\n\n let g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0);\n return mix(color, newPeak * vec3f(1.0, 1.0, 1.0), g);\n}\n#endif\n\n#ifdef RN_USE_REINHARD\nfn ReinhardToneMapping(color: vec3 ) -> vec3 {\n return color / (vec3(1.0) + color);\n}\n#endif\n\n#ifdef RN_USE_ACES_NARKOWICZ\n// ACES tone map (faster approximation)\n// see: https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/\nfn ACES_Narkowicz_ToneMapping(color: vec3) -> vec3\n{\n const A = 2.51;\n const B = 0.03;\n const C = 2.43;\n const D = 0.59;\n const E = 0.14;\n return clamp((color * (A * color + B)) / (color * (C * color + D) + E), vec3(0.0), vec3(1.0));\n}\n#endif\n\n// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\nconst ACESInputMat = mat3x3\n(\n 0.59719, 0.07600, 0.02840,\n 0.35458, 0.90834, 0.13383,\n 0.04823, 0.01566, 0.83777\n);\n\n// ODT_SAT => XYZ => D60_2_D65 => sRGB\nconst ACESOutputMat = mat3x3\n(\n 1.60475, -0.10208, -0.00327,\n -0.53108, 1.10813, -0.07276,\n -0.07367, -0.00605, 1.07602\n);\n\nfn RRTAndODTFit(v: vec3) -> vec3\n{\n let a = v * (v + 0.0245786f) - 0.000090537f;\n let b = v * (0.983729f * v + 0.4329510f) + 0.238081f;\n return a / b;\n}\n\nfn ACES_Hill_ToneMapping(inColor: vec3) -> vec3\n{\n var color = ACESInputMat * inColor;\n\n // Apply RRT and ODT\n color = RRTAndODTFit(color);\n\n color = ACESOutputMat * color;\n\n // Clamp to [0, 1]\n color = saturate(color);\n\n return color;\n}\n\n#ifdef RN_USE_GT_TONEMAP\n fn W_f(x: f32, e0: f32, e1: f32) -> f32 {\n if (x <= e0) { return 0.; }\n if (x >= e1) { return 1.; }\n let a = (x - e0) / (e1 - e0);\n return a * a * (3. - 2. * a);\n }\n fn H_f(x: f32, e0: f32, e1: f32) -> f32 {\n if (x <= e0) { return 0.; }\n if (x >= e1) { return 1.; }\n return (x - e0) / (e1 - e0);\n }\n\n const e = 2.71828;\n\n fn GT_ToneMaping(x: f32) -> f32 {\n let P = 1.; // peak luminance\n let a = 1.; // contrast parameter\n let m = 0.22; // beginning of the linear part\n let l = 0.4; // length of the linear part\n let c = 1.33; // parameter of black color\n let b = 0.; // parameter of black color\n let l0 = (P - m) * l / a;\n let T_x = m * pow(x / m, c) + b;\n let L_x = m + a * (x - m);\n let S0 = m + l0;\n let S1 = m + a * l0;\n let C2 = a * P / (P - S1);\n let S_x = P - (P - S1) * pow(e, -(C2 * (x - S0) / P));\n let w0_x = 1. - W_f(x, 0., m);\n let w2_x = H_f(x, m + l0, m + l0);\n let w1_x = 1. - w0_x - w2_x;\n let f_x = T_x * w0_x + L_x * w1_x + S_x * w2_x;\n return f_x;\n }\n#endif\n\n@fragment\nfn main (\n input: VertexOutput,\n) -> @location(0) vec4 {\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\n var baseColor = textureSample(baseColorTexture, baseColorSampler, input.texcoord_0);\n\n#ifdef RN_USE_KHRONOS_PBR_NEUTRAL\n baseColor = vec4f(PBRNeutralToneMapping(baseColor.rgb), baseColor.a);\n#endif\n\n#ifdef RN_USE_REINHARD\n baseColor = vec4f(ReinhardToneMapping(baseColor.rgb), baseColor.a);\n#endif\n\n#ifdef RN_USE_ACES_NARKOWICZ\n baseColor = vec4f(ACES_Narkowicz_ToneMapping(baseColor.rgb), baseColor.a);\n#endif\n\n#ifdef RN_USE_ACES_HILL\n baseColor = vec4f(ACES_Hill_ToneMapping(baseColor.rgb), baseColor.a);\n#endif\n\n#ifdef RN_USE_ACES_HILL_EXPOSURE_BOOST\n baseColor /= 0.6;\n baseColor = vec4f(ACES_Hill_ToneMapping(baseColor.rgb), baseColor.a);\n#endif\n\n\n#ifdef RN_USE_GT_TONEMAP\n baseColor.r = GT_ToneMaping(baseColor.r);\n baseColor.g = GT_ToneMaping(baseColor.g);\n baseColor.b = GT_ToneMaping(baseColor.b);\n#endif\n\n if (get_enableLinearToSrgb(materialSID, 0)) {\n baseColor = vec4f(linearToSrgb(baseColor.rgb), baseColor.a);\n }\n\n return baseColor;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert.wgsl": /*!************************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert.wgsl ***! \************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"/* shaderity: @{definitions} */\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) position_inWorld : vec3,\n @location(1) normal_inWorld : vec3,\n @location(2) texcoord_0 : vec2,\n @location(3) color_0 : vec4,\n @location(4) texcoord_1 : vec2,\n @location(5) texcoord_2 : vec2,\n @location(6) tangent_inWorld : vec3,\n @location(7) binormal_inWorld : vec3,\n @location(8) baryCentricCoord: vec3,\n @location(9) shadowCoord : vec4,\n @location(10) instanceInfo : f32,\n @location(11) normal_inView : vec3,\n}\n\nstruct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n\n\n/* shaderity: @{getters} */\n/* shaderity: @{matricesGetters} */\n\n@vertex\nfn main(\n @builtin(vertex_index) vertexIdx : u32,\n) -> VertexOutput {\n var output : VertexOutput;\nlet materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n\n\nlet x = f32((vertexIdx & 1u) << 2u);\nlet y = f32((vertexIdx & 2u) << 1u);\noutput.texcoord_0.x = x * 0.5;\noutput.texcoord_0.y = y * 0.5;\noutput.texcoord_0.y = 1.0 - output.texcoord_0.y;\noutput.position = vec4f(x - 1.0, y - 1.0, 0, 1);\n\n\n return output;\n\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/common/mainPrerequisites.wgsl": /*!********************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/common/mainPrerequisites.wgsl ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"let materialSID = _materialSID;\nlet currentPrimitiveIdx = _currentPrimitiveIdx;\nlet morphTargetNumber = _morphTargetNumber;\nlet cameraSID = _cameraSID;\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/common/prerequisites.wgsl": /*!****************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/common/prerequisites.wgsl ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"struct StorageData {\n data: array>,\n}\n@group(0) @binding(0) var storageData: StorageData;\nstruct BlendShapeData {\n data: array>,\n}\n@group(0) @binding(1) var blendShapeData: BlendShapeData;\nstruct UniformMorphOffsets {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(2) var uniformMorphOffsets: UniformMorphOffsets;\nstruct UniformMorphWeights {\n data: array, /* shaderity: @{maxMorphDataNumber} */ >,\n}\n@group(0) @binding(3) var uniformMorphWeights: UniformMorphWeights;\n\noverride _materialSID: u32;\noverride _currentPrimitiveIdx = 0u;\noverride _morphTargetNumber: u32 = 0u;\noverride _cameraSID: u32 = 0u;\nconst M_PI: f32 = 3.141592653589793;\nconst RECIPROCAL_PI: f32 = 0.3183098861837907;\nconst Epsilon: f32 = 0.0000001;\nconst c_MinRoughness: f32 = 0.04;\n\nfn fetchElement(vec4_idx: u32) -> vec4\n{\n return storageData.data[vec4_idx];\n}\n\nfn fetchElementFromBlendShapeBuffer(vec4_idx: u32) -> vec4\n{\n return blendShapeData.data[vec4_idx];\n}\n\nfn fetchVec3No16BytesAligned(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElement(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElement(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElement(basePosIn16bytes);\n let val1 = fetchElement(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec3No16BytesAlignedFromBlendShapeBuffer(scalar_idx: u32) -> vec3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let val = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return val.xyz;\n } else if (posIn4bytes == 1u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n return vec3(val0.yzw);\n } else if (posIn4bytes == 2u) {\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.zw, val1.x);\n } else { // posIn4bytes == 3\n let val0 = fetchElementFromBlendShapeBuffer(basePosIn16bytes);\n let val1 = fetchElementFromBlendShapeBuffer(basePosIn16bytes+1u);\n return vec3(val0.w, val1.xy);\n }\n}\n\nfn fetchVec4(vec4_idx: u32) -> vec4 {\n return fetchElement(vec4_idx);\n}\n\nfn fetchScalarNo16BytesAligned(scalar_idx: u32) -> f32 {\n let posIn4bytes = scalar_idx % 4u;\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n let val = fetchElement(basePosIn16bytes);\n if (posIn4bytes == 0u) {\n return val.x;\n } else if (posIn4bytes == 1u) {\n return val.y;\n } else if (posIn4bytes == 2u) {\n return val.z;\n } else { // posIn4bytes == 3u\n return val.w;\n }\n}\n\n\n\n\nfn fetchMat4(vec4_idx: u32) -> mat4x4\n{\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n let col3 = fetchElement(vec4_idx + 3u);\n\n let val = mat4x4(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w,\n col3.x, col3.y, col3.z, col3.w\n );\n\n return val;\n}\n\n\nfn fetchMat4x3(vec4_idx: u32) -> mat4x3 {\n let col0 = fetchElement(vec4_idx);\n let col1 = fetchElement(vec4_idx + 1u);\n let col2 = fetchElement(vec4_idx + 2u);\n\n let val = mat4x3(\n col0.x, col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z, col2.w);\n\n return val;\n}\n\n\nfn fetchMat3No16BytesAligned(scalar_idx: u32) -> mat3x3 {\n let posIn4bytes = scalar_idx % 4u;\n\n let basePosIn16bytes = (scalar_idx - posIn4bytes) / 4u;\n if (posIn4bytes == 0u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.x, col0.y, col0.z,\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x\n );\n return val;\n } else if (posIn4bytes == 1u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.y, col0.z, col0.w,\n col1.x, col1.y, col1.z,\n col1.w, col2.x, col2.y\n );\n return val;\n } else if (posIn4bytes == 2u) {\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.z, col0.w, col1.x,\n col1.y, col1.z, col1.w,\n col2.x, col2.y, col2.z\n );\n return val;\n } else { // posIn4bytes == 3u\n let col0 = fetchElement(basePosIn16bytes);\n let col1 = fetchElement(basePosIn16bytes + 1u);\n let col2 = fetchElement(basePosIn16bytes + 2u);\n let val = mat3x3(\n col0.w, col1.x, col1.y,\n col1.z, col1.w, col2.x,\n col2.y, col2.z, col2.w\n );\n return val;\n }\n}\n\nfn uvTransform(scale: vec2f, offset: vec2f, rotation: f32, uv: vec2f) -> vec2f {\n let translationMat = mat3x3(1,0,0, 0,1,0, offset.x, offset.y, 1);\n let rotationMat = mat3x3(\n cos(rotation), -sin(rotation), 0,\n sin(rotation), cos(rotation), 0,\n 0, 0, 1\n );\n let scaleMat = mat3x3(scale.x,0,0, 0,scale.y,0, 0,0,1);\n\n let matrix = translationMat * rotationMat * scaleMat;\n let uvTransformed = ( matrix * vec3f(uv.xy, 1) ).xy;\n\n return uvTransformed;\n}\n\n#ifdef RN_IS_NODE_SHADER\n#else\nfn getTexcoord(texcoordIndex: u32, input: VertexOutput) -> vec2 {\n var texcoord: vec2f;\n if(texcoordIndex == 2){\n texcoord = input.texcoord_2;\n } else if(texcoordIndex == 1){\n texcoord = input.texcoord_1;\n }else{\n texcoord = input.texcoord_0;\n }\n return texcoord;\n}\n#endif\n\nfn saturateEpsilonToOne(x: f32) -> f32 {\n let Epsilon = 0.0000001;\n return clamp(x, Epsilon, 1.0);\n}\n\nfn max3(v: vec3f) -> f32\n{\n return max(max(v.x, v.y), v.z);\n}\n\nfn sqF32(t: f32) -> f32\n{\n return t * t;\n}\n\nfn sqVec2f(t: vec2f) -> vec2f\n{\n return t * t;\n}\n\nfn sqVec3f(t: vec3f) -> vec3f\n{\n return t * t;\n}\n\nfn sqVec4f(t: vec4f) -> vec4f\n{\n return t * t;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/common/vertexInput.wgsl": /*!**************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/common/vertexInput.wgsl ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"#ifdef RN_USE_INSTANCE\n @location(8) instance_ids: vec4,\n#endif\n\n\n#ifdef RN_USE_POSITION_FLOAT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_INT\n @location(0) position: vec3,\n#endif\n#ifdef RN_USE_POSITION_UINT\n @location(0) position: vec3,\n#endif\n\n#ifdef RN_USE_NORMAL\n @location(1) normal: vec3,\n#endif\n#ifdef RN_USE_TANGENT\n @location(2) tangent: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_0\n @location(3) texcoord_0: vec2,\n#endif\n#ifdef RN_USE_TEXCOORD_1\n @location(4) texcoord_1: vec2,\n#endif\n\n#ifdef RN_USE_COLOR_0_FLOAT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_INT\n @location(5) color_0: vec4,\n#endif\n#ifdef RN_USE_COLOR_0_UINT\n @location(5) color_0: vec4,\n#endif\n\n#ifdef RN_USE_JOINTS_0\n @location(6) joints_0: vec4,\n#endif\n#ifdef RN_USE_WEIGHTS_0\n @location(7) weights_0: vec4,\n#endif\n#ifdef RN_USE_BARY_CENTRIC_COORD\n @location(10) baryCentricCoord: vec4,\n#endif\n#ifdef RN_USE_TEXCOORD_2\n @location(11) texcoord_2: vec2,\n#endif\n @builtin(vertex_index) vertexIdx : u32,\n\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Add.wgsl": /*!*****************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Add.wgsl ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn addF32F32(lfs: f32, rhs: f32, outValue: ptr) {\n *outValue = lfs + rhs;\n}\nfn addI32I32(lfs: i32, rhs: i32, outValue: ptr) {\n *outValue = lfs + rhs;\n}\nfn addVec2fVec2f(lfs: vec2, rhs: vec2, outValue: ptr>) {\n *outValue = lfs + rhs;\n}\nfn addVec3fVec3f(lfs: vec3, rhs: vec3, outValue: ptr>) {\n *outValue = lfs + rhs;\n}\nfn addVec4fVec4f(lfs: vec4, rhs: vec4, outValue: ptr>) {\n *outValue = lfs + rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/AttributeColor.vert.wgsl": /*!*********************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/AttributeColor.vert.wgsl ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn attributeColor(outValue: ptr>) {\n *outValue = a_color_0;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/AttributeNormal.vert.wgsl": /*!**********************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/AttributeNormal.vert.wgsl ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn attributeNormal(outValue: ptr>) {\n *outValue = a_normal;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/AttributePosition.vert.wgsl": /*!************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/AttributePosition.vert.wgsl ***! \************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn attributePosition(outValue: ptr) {\n *outValue = vec4f(a_position, 1.0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/AttributeTexcoord.vert.wgsl": /*!************************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/AttributeTexcoord.vert.wgsl ***! \************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn attributeTexcoord(outValue: ptr>) {\n *outValue = a_texcoord_0;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/DotProduct.wgsl": /*!************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/DotProduct.wgsl ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn dotProductVec2f(lfs: vec2, rhs: vec2, outValue: ptr) {\n *outValue = dot(lfs, rhs);\n}\nfn dotProductVec3f(lfs: vec3, rhs: vec3, outValue: ptr) {\n *outValue = dot(lfs, rhs);\n}\nfn dotProductVec4f(lfs: vec4, rhs: vec4, outValue: ptr) {\n *outValue = dot(lfs, rhs);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/MergeVector.wgsl": /*!*************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/MergeVector.wgsl ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn mergeVectorXYZ_W(xyz: vec3, w: f32, outXYZW: ptr>, outXYZ: ptr>, outXY: ptr>, outZW: ptr>) {\n *outXYZW = vec4(xyz, w);\n *outXYZ = xyz;\n *outXY = xyz.xy;\n *outZW = vec2f(xyz.z, w);\n}\n\nfn mergeVectorXY_ZW(xy: vec2, zw: vec2, outXYZW: ptr>, outXYZ: ptr>, outXY: ptr>, outZW: ptr>) {\n *outXYZW = vec4(xy, zw);\n *outXYZ = vec3f(xy, zw.x);\n *outXY = xy;\n *outZW = zw;\n}\n\nfn mergeVectorXY_Z_W(xy: vec2, z: f32, w: f32, outXYZW: ptr>, outXYZ: ptr>, outXY: ptr>, outZW: ptr>) {\n *outXYZW = vec4(xy.x, xy.y, z, w);\n *outXYZ = vec3f(xy, z);\n *outXY = xy;\n *outZW = vec2f(z, w);\n}\n\nfn mergeVectorZW_X_Y(zw: vec2, x: f32, y: f32, outXYZW: ptr>, outXYZ: ptr>, outXY: ptr>, outZW: ptr>) {\n *outXYZW = vec4(x, y, zw.x, zw.y);\n *outXYZ = vec3f(x, y, zw.x);\n *outXY = vec2f(x, y);\n *outZW = zw;\n}\n\nfn mergeVectorX_Y_Z_W(x: f32, y: f32, z: f32, w: f32, outXYZW: ptr>, outXYZ: ptr>, outXY: ptr>, outZW: ptr>) {\n *outXYZW = vec4(x, y, z, w);\n *outXYZ = vec3f(x, y, z);\n *outXY = vec2f(x, y);\n *outZW = vec2f(z, w);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Multiply.wgsl": /*!**********************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Multiply.wgsl ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn multiplyF32F32(lfs: f32, rhs: f32, outValue: ptr) {\n *outValue = lfs * rhs;\n}\nfn multiplyI32I32(lfs: i32, rhs: i32, outValue: ptr) {\n *outValue = lfs * rhs;\n}\nfn multiplyVec2fVec2f(lfs: vec2, rhs: vec2, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn multiplyVec3fVec3f(lfs: vec3, rhs: vec3, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn multiplyVec4fVec4f(lfs: vec4, rhs: vec4, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn multiplyMat2x2fMat2x2f(lfs: mat2x2, rhs: mat2x2, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn multiplyMat3x3fMat3x3f(lfs: mat3x3, rhs: mat3x3, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn multiplyMat4x4fMat4x4f(lfs: mat4x4, rhs: mat4x4, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/NormalMatrix.vert.wgsl": /*!*******************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/NormalMatrix.vert.wgsl ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn normalMatrix(outValue: ptr>) {\n *outValue = get_normalMatrix(u32(a_instanceIds.x));\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Normalize.wgsl": /*!***********************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Normalize.wgsl ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn _normalizeVec2f(value: vec2, outValue: ptr>) {\n *outValue = normalize(value);\n}\n\nfn _normalizeVec3f(value: vec3, outValue: ptr>) {\n *outValue = normalize(value);\n}\n\nfn _normalizeVec4f(value: vec4, outValue: ptr>) {\n *outValue = normalize(value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/ProjectionMatrix.vert.wgsl": /*!***********************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/ProjectionMatrix.vert.wgsl ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn projectionMatrix(outValue: ptr>) {\n *outValue = get_projectionMatrix(_cameraSID, 0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Sin.wgsl": /*!*****************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Sin.wgsl ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn _sinF32(value: f32, outValue: ptr) {\n *outValue = sin(value);\n}\nfn _sinVec2f(value: vec2, outValue: ptr>) {\n *outValue = sin(value);\n}\nfn _sinVec3f(value: vec3, outValue: ptr>) {\n *outValue = sin(value);\n}\nfn _sinVec4f(value: vec4, outValue: ptr>) {\n *outValue = sin(value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/SmoothStep.wgsl": /*!************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/SmoothStep.wgsl ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn _smoothstepF32(value: f32, edge0: f32, edge1: f32, outValue: ptr) {\n *outValue = smoothstep(edge0, edge1, value);\n}\nfn _smoothstepVec2f(value: vec2, edge0: vec2, edge1: vec2, outValue: ptr>) {\n *outValue = smoothstep(edge0, edge1, value);\n}\nfn _smoothstepVec3f(value: vec3, edge0: vec3, edge1: vec3, outValue: ptr>) {\n *outValue = smoothstep(edge0, edge1, value);\n}\nfn _smoothstepVec4f(value: vec4, edge0: vec4, edge1: vec4, outValue: ptr>) {\n *outValue = smoothstep(edge0, edge1, value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/SplitVector.wgsl": /*!*************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/SplitVector.wgsl ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn splitVectorXYZW(xyzw: vec4, outXYZ: ptr>, outXY: ptr>, outZW: ptr>, outX: ptr, outY: ptr, outZ: ptr, outW: ptr) {\n *outX = xyzw.x;\n *outY = xyzw.y;\n *outZ = xyzw.z;\n *outW = xyzw.w;\n *outXYZ = xyzw.xyz;\n *outXY = xyzw.xy;\n *outZW = xyzw.zw;\n}\n\nfn splitVectorXYZ(xyz: vec3, outXYZ: ptr>, outXY: ptr>, outZW: ptr>, outX: ptr, outY: ptr, outZ: ptr, outW: ptr) {\n *outX = xyz.x;\n *outY = xyz.y;\n *outZ = xyz.z;\n *outW = 0.0;\n *outXYZ = xyz;\n *outXY = xyz.xy;\n *outZW = vec2(xyz.z, 0.0);\n}\n\nfn splitVectorXY(xy: vec2, outXYZ: ptr>, outXY: ptr>, outZW: ptr>, outX: ptr, outY: ptr, outZ: ptr, outW: ptr) {\n *outX = xy.x;\n *outY = xy.y;\n *outZ = 0.0;\n *outW = 0.0;\n *outXYZ = vec3(xy, 0.0);\n *outXY = xy;\n *outZW = vec2(0.0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Step.wgsl": /*!******************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Step.wgsl ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn _stepF32(value: f32, edge: f32, outValue: ptr) {\n *outValue = step(edge, value);\n}\nfn _stepVec2f(value: vec2, edge: vec2, outValue: ptr>) {\n *outValue = step(edge, value);\n}\nfn _stepVec3f(value: vec3, edge: vec3, outValue: ptr>) {\n *outValue = step(edge, value);\n}\nfn _stepVec4f(value: vec4, edge: vec4, outValue: ptr>) {\n *outValue = step(edge, value);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Time.wgsl": /*!******************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Time.wgsl ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn time(outValue: ptr) {\n *outValue = get_time(0, 0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/Transform.wgsl": /*!***********************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/Transform.wgsl ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"fn transformMat2x2fVec2f(lfs: mat2x2, rhs: vec2, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn transformMat3x3fVec3f(lfs: mat3x3, rhs: vec3, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\nfn transformMat4x4fVec4f(lfs: mat4x4, rhs: vec4, outValue: ptr>) {\n *outValue = lfs * rhs;\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/ViewMatrix.vert.wgsl": /*!*****************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/ViewMatrix.vert.wgsl ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn viewMatrix(outValue: ptr>) {\n *outValue = get_viewMatrix(_cameraSID, 0);\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./src/webgpu/shaderity_shaders/nodes/WorldMatrix.vert.wgsl": /*!******************************************************************!*\ !*** ./src/webgpu/shaderity_shaders/nodes/WorldMatrix.vert.wgsl ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"code":"\nfn worldMatrix(outValue: ptr>) {\n *outValue = get_worldMatrix(u32(a_instanceIds.x));\n}\n","shaderStage":"fragment","isFragmentShader":true}); /***/ }), /***/ "./node_modules/shaderity/dist/esm/index.js": /*!**************************************************!*\ !*** ./node_modules/shaderity/dist/esm/index.js ***! \**************************************************/ /***/ ((module) => { module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __nested_webpack_require_187__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_187__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __nested_webpack_require_187__.m = modules; /******/ /******/ // expose the module cache /******/ __nested_webpack_require_187__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __nested_webpack_require_187__.d = function(exports, name, getter) { /******/ if(!__nested_webpack_require_187__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __nested_webpack_require_187__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __nested_webpack_require_187__.t = function(value, mode) { /******/ if(mode & 1) value = __nested_webpack_require_187__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __nested_webpack_require_187__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_187__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __nested_webpack_require_187__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __nested_webpack_require_187__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __nested_webpack_require_187__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __nested_webpack_require_187__.p = "./../../dist/"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __nested_webpack_require_187__(__nested_webpack_require_187__.s = "./src/index.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __nested_webpack_require_3810__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Shaderity_1 = __importDefault(__nested_webpack_require_3810__(/*! ./main/Shaderity */ "./src/main/Shaderity.ts")); exports.default = Shaderity_1.default; /***/ }), /***/ "./src/main/PreProcessor.ts": /*!**********************************!*\ !*** ./src/main/PreProcessor.ts ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); class PreProcessor { static process(splittedLines) { const define = /#define[\t ]+(\w+)/; const ifdef = /#ifdef[\t ]+(\w+)/; const elif = /#elif[\t ]+defined\((\w+)\)/; const _else = /#else/; const endif = /#endif/; const outputHistory = []; let outputFlg = true; const definitions = []; const ifdefs = []; const outputLines = []; for (const line of splittedLines) { let isPragma = false; { // #define const re = line.match(define); if (re != null) { definitions.push(re[1]); isPragma = true; } } if (outputHistory.indexOf(false) === -1) { // #ifdef const re = line.match(ifdef); if (re != null) { outputHistory.push(outputFlg); const toCheckDef = re[1]; ifdefs.push([toCheckDef]); if (definitions.indexOf(toCheckDef) === -1) { outputFlg = false; } isPragma = true; } } if (outputHistory.indexOf(false) === -1) { // #elif const re = line.match(elif); if (re != null) { const toCheckDef = re[1]; const currentIfdefs = ifdefs[ifdefs.length - 1]; let notFound = true; for (const currentIfdef of currentIfdefs) { if (definitions.indexOf(currentIfdef) !== -1) { notFound = false; } } if (notFound && definitions.indexOf(toCheckDef) !== -1) { outputFlg = true; } else { outputFlg = false; } currentIfdefs.push(toCheckDef); isPragma = true; } } if (outputHistory.indexOf(false) === -1) { // #else const re = line.match(_else); if (re != null) { const currentIfdefs = ifdefs[ifdefs.length - 1]; let outputFlgInner = true; for (const currentIfdef of currentIfdefs) { if (definitions.indexOf(currentIfdef) !== -1) { outputFlgInner = false; } } outputFlg = outputFlgInner; isPragma = true; } } { // #endif const re = line.match(endif); if (re != null) { if (outputHistory.indexOf(false) === -1) { outputFlg = true; } isPragma = true; ifdefs.pop(); outputHistory.pop(); } } if (outputFlg && !isPragma) { outputLines.push(line); } } return outputLines; } } exports.default = PreProcessor; /***/ }), /***/ "./src/main/Reflection.ts": /*!********************************!*\ !*** ./src/main/Reflection.ts ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * This class gets the attribute, varying, and uniform information from the code property of a shaderity object. * The methods of the Shaderity instance create an instance of this class. * * Before getting the information of the attribute, varying, and uniform, you need to call the reflect method of this instance. */ class Reflection { constructor(splittedShaderityShaderCode, shaderStage) { this.__attributeSemanticsMap = new Map(); this.__uniformSemanticsMap = new Map(); this.__attributes = []; this.__varyings = []; this.__uniforms = []; this.__splittedShaderCode = splittedShaderityShaderCode; this.__shaderStage = shaderStage; this.__setDefaultAttributeAndUniformSemanticsMap(); } /** * Gets all attribute variable information in the shader code. * Before calling this method, you need to call the reflect method of this instance. * @returns Array of ReflectionAttribute object */ get attributes() { return this.__attributes; } /** * Gets all varying variable information in the shader code. * Before calling this method, you need to call the reflect method of this instance. * @returns Array of ReflectionVarying object */ get varyings() { return this.__varyings; } /** * Gets all uniform variable information in the shader code. * Before calling this method, you need to call the reflect method of this instance. * @returns Array of ReflectionUniform object */ get uniforms() { return this.__uniforms; } /** * Get the names of all attributes included in the shader. * Before calling this method, you need to call the reflect method of this instance. * @returns Array of string */ get attributesNames() { return this.__attributes.map((attribute) => { return attribute.name; }); } /** * Get the attribute semantic (e.g. 'POSITION') of all attributes included in the shader. * Before calling this method, you need to call the reflect method of this instance. * @returns Array of AttributeSemantics object */ get attributesSemantics() { return this.__attributes.map((attribute) => { return attribute.semantic; }); } /** * Get the variable type (e.g. 'vec4') of all attributes included in the shader. * Before calling this method, you need to call the reflect method of this instance. * @returns Array of VarType object */ get attributesTypes() { return this.__attributes.map((attribute) => { return attribute.type; }); } /** * Add an attributeSemantics. * The attributeSemantics is used in the ReflectionAttribute.semantics * (See reflect method of this class) */ addAttributeSemanticsMap(map) { this.__attributeSemanticsMap = new Map([...this.__attributeSemanticsMap, ...map]); } /** * Add a uniformSemantics. * The attributeSemantics is used in the ReflectionAttribute.semantics * (See reflect method of this class) */ addUniformSemanticsMap(map) { this.__uniformSemanticsMap = new Map([...this.__uniformSemanticsMap, ...map]); } /** * Add an attributeSemantics. * The attributeSemantics is used in the ReflectionAttribute.semantics * (See reflect method of this class) */ addAttributeSemantics(key, value) { this.__attributeSemanticsMap.set(key, value); } /** * Add a uniformSemantics. * The attributeSemantics is used in the ReflectionAttribute.semantics * (See reflect method of this class) */ addUniformSemantics(key, value) { this.__uniformSemanticsMap.set(key, value); } /** * Initialize attributeSemantics */ resetAttributeSemantics() { this.__attributeSemanticsMap = new Map(); } /** * Initialize uniformSemantics */ resetUniformSemantics() { this.__uniformSemanticsMap = new Map(); } /** * Analyze shader code of the shaderity and get information of attribute, varying and uniform. * The information can be retrieved from the get method of this instance. * * The semantic property of the ReflectionAttribute is assigned to the value of the semantic if * it is specified in the attribute line of the shader code. If not, the AttributeSemanticsMap * is searched for matching semantics, or UNKNOWN. The same applies to the semantic property of * ReflectionUniform. */ reflect() { const splittedShaderCode = this.__splittedShaderCode; const shaderStage = this.__shaderStage; for (const shaderCodeLine of splittedShaderCode) { const isAttributeLine = this.__matchAttribute(shaderCodeLine, shaderStage); if (isAttributeLine) { this.__addAttribute(shaderCodeLine); continue; } const isVaryingLine = this.__matchVarying(shaderCodeLine, shaderStage); if (isVaryingLine) { this.__addVarying(shaderCodeLine, shaderStage); continue; } const isUniformLine = shaderCodeLine.match(/^(?![\/])[\t ]*uniform[\t ]+/); if (isUniformLine) { this.__addUniform(shaderCodeLine); continue; } } } __setDefaultAttributeAndUniformSemanticsMap() { this.__attributeSemanticsMap.set('position', 'POSITION'); this.__attributeSemanticsMap.set('color$', 'COLOR_0'); this.__attributeSemanticsMap.set('color_?0', 'COLOR_0'); this.__attributeSemanticsMap.set('texcoord$', 'TEXCOORD_0'); this.__attributeSemanticsMap.set('texcoord_?0', 'TEXCOORD_0'); this.__attributeSemanticsMap.set('texcoord_?1', 'TEXCOORD_1'); this.__attributeSemanticsMap.set('texcoord_?2', 'TEXCOORD_2'); this.__attributeSemanticsMap.set('normal', 'NORMAL'); this.__attributeSemanticsMap.set('tangent', 'TANGENT'); this.__attributeSemanticsMap.set('joint$', 'JOINTS_0'); this.__attributeSemanticsMap.set('bone$', 'JOINTS_0'); this.__attributeSemanticsMap.set('joint_?0', 'JOINTS_0'); this.__attributeSemanticsMap.set('bone_?0', 'JOINTS_0'); this.__attributeSemanticsMap.set('weight$', 'WEIGHTS_0'); this.__attributeSemanticsMap.set('weight_?0', 'WEIGHTS_0'); this.__uniformSemanticsMap.set('worldmatrix', 'WorldMatrix'); this.__uniformSemanticsMap.set('normalmatrix', 'NormalMatrix'); this.__uniformSemanticsMap.set('viewmatrix', 'ViewMatrix'); this.__uniformSemanticsMap.set('projectionmatrix', 'ProjectionMatrix'); this.__uniformSemanticsMap.set('modelviewmatrix', 'ModelViewMatrix'); } __matchAttribute(shaderCodeLine, shaderStage) { if (shaderStage !== 'vertex') { return false; } return shaderCodeLine.match(/^(?![\/])[\t ]*(attribute|in)[\t ]+.+;/); } __addAttribute(shaderCodeLine) { const reflectionAttribute = { name: '', type: 'float', semantic: 'UNKNOWN' }; const matchType = shaderCodeLine.match(Reflection.attributeAndVaryingTypeRegExp); if (matchType) { const type = matchType[1]; reflectionAttribute.type = type; const name = matchType[2]; reflectionAttribute.name = name; const matchSemantic = shaderCodeLine.match(Reflection.semanticRegExp); if (matchSemantic) { reflectionAttribute.semantic = matchSemantic[1]; } else { for (let [key, value] of this.__attributeSemanticsMap) { if (name.match(new RegExp(key, 'i'))) { reflectionAttribute.semantic = value; } } } } this.__attributes.push(reflectionAttribute); } __matchVarying(shaderCodeLine, shaderStage) { if (shaderStage === 'vertex') { return shaderCodeLine.match(/^(?![\/])[\t ]*(varying|out)[\t ]+.+;/); } else { return shaderCodeLine.match(/^(?![\/])[\t ]*(varying|in)[\t ]+.+;/); } } __addVarying(shaderCodeLine, shaderStage) { const reflectionVarying = { name: '', type: 'float', inout: 'in' }; const matchType = shaderCodeLine.match(Reflection.attributeAndVaryingTypeRegExp); if (matchType) { const type = matchType[1]; reflectionVarying.type = type; const name = matchType[2]; reflectionVarying.name = name; reflectionVarying.inout = (shaderStage === 'vertex') ? 'out' : 'in'; } this.__varyings.push(reflectionVarying); } __addUniform(shaderCodeLine) { const reflectionUniform = { name: '', type: 'float', semantic: 'UNKNOWN' }; const matchType = shaderCodeLine.match(Reflection.uniformTypeRegExp); if (matchType) { const type = matchType[1]; reflectionUniform.type = type; const name = matchType[2]; reflectionUniform.name = name; const matchSemantics = shaderCodeLine.match(Reflection.semanticRegExp); if (matchSemantics) { reflectionUniform.semantic = matchSemantics[1]; } else { for (let [key, value] of this.__uniformSemanticsMap) { if (name.match(new RegExp(key, 'i'))) { reflectionUniform.semantic = value; } } } } this.__uniforms.push(reflectionUniform); } } exports.default = Reflection; Reflection.attributeAndVaryingTypeRegExp = /[\t ]+(float|int|vec2|vec3|vec4|mat2|mat3|mat4|ivec2|ivec3|ivec4)[\t ]+(\w+);/; Reflection.uniformTypeRegExp = /[\t ]+(float|int|vec2|vec3|vec4|mat2|mat3|mat4|ivec2|ivec3|ivec4|sampler2D|samplerCube|sampler3D)[\t ]+(\w+);/; Reflection.semanticRegExp = /<.*semantic[\t ]*=[\t ]*(\w+).*>/; ; /***/ }), /***/ "./src/main/ShaderEditor.ts": /*!**********************************!*\ !*** ./src/main/ShaderEditor.ts ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * This class edits the code property of a shaderity object. */ class ShaderEditor { static _insertDefinition(splittedShaderCode, definition) { const defStr = definition.replace(/#define[\t ]+/, ''); splittedShaderCode.unshift(`#define ${defStr}`); } static _fillTemplate(shaderCode, templateObject) { const templateString = shaderCode.replace(/\/\*[\t ]*shaderity:[\t ]*(@{[\t ]*)(\S+)([\t ]*})[\t ]*\*\//g, '${this.$2}'); const resultCode = new Function("return `" + templateString + "`;").call(templateObject); return resultCode; } } exports.default = ShaderEditor; /***/ }), /***/ "./src/main/ShaderTransformer.ts": /*!***************************************!*\ !*** ./src/main/ShaderTransformer.ts ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * This class converts the code property of a shaderity object to the specified format. */ class ShaderTransformer { /** * @private * Translate a GLSL ES3 shader code to a GLSL ES1 shader code */ static _transformToGLSLES1(splittedShaderCode, isFragmentShader, embedErrorsInOutput) { this.__convertOrInsertVersionGLSLES1(splittedShaderCode); this.__removeES3Qualifier(splittedShaderCode, embedErrorsInOutput); this.__convertIn(splittedShaderCode, isFragmentShader); this.__convertOut(splittedShaderCode, isFragmentShader, embedErrorsInOutput); this.__removePrecisionForES3(splittedShaderCode); this.__convertTextureFunctionToES1(splittedShaderCode, isFragmentShader, embedErrorsInOutput); const transformedSplittedShaderCode = splittedShaderCode; return transformedSplittedShaderCode; } /** * @private * Translate a GLSL ES1 shader code to a GLSL ES3 shader code */ static _transformToGLSLES3(splittedShaderCode, isFragmentShader) { this.__convertOrInsertVersionGLSLES3(splittedShaderCode); this.__convertAttribute(splittedShaderCode, isFragmentShader); this.__convertVarying(splittedShaderCode, isFragmentShader); this.__convertTextureCube(splittedShaderCode); this.__convertTexture2D(splittedShaderCode); this.__convertTexture2DProd(splittedShaderCode); this.__convertTexture3D(splittedShaderCode); this.__convertTexture3DProd(splittedShaderCode); const transformedSplittedShaderCode = splittedShaderCode; return transformedSplittedShaderCode; } /** * @private * Translate a GLSL shader code to a shader code of specified GLSL version */ static _transformTo(version, splittedShaderCode, isFragmentShader, embedErrorsInOutput) { if (version.match(/webgl2|es3/i)) { return this._transformToGLSLES3(splittedShaderCode, isFragmentShader); } else if (version.match(/webgl1|es1/i)) { return this._transformToGLSLES1(splittedShaderCode, isFragmentShader, embedErrorsInOutput); } else { console.error('Invalid Version'); return splittedShaderCode; } } /** * @private * If the first line contains version information, overwrite the first line with '#version 100'. * If not, add '#version 100' to the first line. * * Note: If the first line is commented out and the version information is written in the second or later line, * the appropriate version information will be added to the first line and the user-defined version information * in the second or later line will be removed. */ static __convertOrInsertVersionGLSLES1(splittedShaderCode) { const reg = /^(?![\/])[\t ]*#[\t ]*version[\t ]+.*/; this.__removeFirstMatchingLine(splittedShaderCode, reg); splittedShaderCode.unshift('#version 100'); } /** * @private * If the first line contains version information, overwrite the first line with '#version 300 es'. * If not, add '#version 300 es' to the first line. * In both cases, '#define GLSL_ES3' will be inserted in the second line. * Use the '#define GLSL_ES3' directive if you want to write a shader code that will only run in the case of webgl2. * * Note: If the first line is commented out and the version information is written in the second or later line, * the appropriate version information will be added to the first line and the user-defined version information * in the second or later line will be removed. */ static __convertOrInsertVersionGLSLES3(splittedShaderCode) { const reg = /^(?![\/])[\t ]*#[\t ]*version[\t ]+.*/; this.__removeFirstMatchingLine(splittedShaderCode, reg); splittedShaderCode.unshift('#define GLSL_ES3'); splittedShaderCode.unshift('#version 300 es'); } /** * @private * Find the 'in' qualifier in the shader code and replace it with the GLSL ES1 qualifier('attribute' or 'varying') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertIn(splittedShaderCode, isFragmentShader) { const reg = /^(?![\/])[\t ]*in[\t ]+((highp|mediump|lowp|)[\t ]*\w+[\t ]*\w+[\t ]*;)/; let replaceFunc; if (isFragmentShader) { replaceFunc = function (match, p1) { return 'varying ' + p1; }; } else { replaceFunc = function (match, p1) { return 'attribute ' + p1; }; } this.__replaceLine(splittedShaderCode, reg, replaceFunc); } /** * @private * Find the "out" qualifier in the shader code and modify the shader code. * If the shader stage is vertex, the "out" qualifiers will be replaced by "varying" qualifier. * If the shader stage is fragment and the shader has "out" qualifiers, the "out" qualifiers will * be deleted and the variable is used to assign a value to gl_FragColor. * This method directly replace the elements of the splittedShaderCode variable. */ static __convertOut(splittedShaderCode, isFragmentShader, embedErrorsInOutput) { if (isFragmentShader) { const variableName = this.__removeOutQualifier(splittedShaderCode, embedErrorsInOutput); if (variableName == null) { // no out qualifier return; } this.__addGLFragColor(variableName, splittedShaderCode, embedErrorsInOutput); } else { const reg = /^(?![\/])[\t ]*out[\t ]+((highp|mediump|lowp|)[\t ]*\w+[\t ]*\w+[\t ]*;)/; const replaceFunc = function (match, p1) { return 'varying ' + p1; }; this.__replaceLine(splittedShaderCode, reg, replaceFunc); } } /** * @private * This method is a part of __convertOut method. * This method deletes the "out" qualifiers and adds the line for assigning to gl_FragColor. * If the shader does not have the "out" qualifiers, this method does nothing. */ static __removeOutQualifier(splittedShaderCode, embedErrorsInOutput) { const reg = /^(?![\/])[\t ]*out[\t ]+((highp|mediump|lowp|)[\t ]*\w+[\t ]*(\w+)[\t ]*;)/; let variableName; for (let i = 0; i < splittedShaderCode.length; i++) { const match = splittedShaderCode[i].match(reg); if (match) { splittedShaderCode[i] = match[1]; variableName = match[3]; break; } } return variableName; } static __addGLFragColor(variableName, splittedShaderCode, embedErrorsInOutput) { const closeBracketReg = /(.*)\}[\n\t ]*$/; const returnReg = /[\n\t ]*return[\n\t ]*;/; const mainFuncStartReg = /(^|^(?![\/])[\t\n ]+)void[\t\n ]+main([\t\n ]|\(|$)/; const fragColorCode = ` gl_FragColor = ${variableName};`; let setGlFragColorInLastLine = false; for (let i = splittedShaderCode.length - 1; i >= 0; i--) { const line = splittedShaderCode[i]; if (!setGlFragColorInLastLine && line.match(closeBracketReg)) { // add gl_FragColor to last line of main function splittedShaderCode[i] = line.replace(closeBracketReg, `$1\n${fragColorCode}\n}\n`); setGlFragColorInLastLine = true; } if (line.match(returnReg)) { // add gl_FragColor just before return splittedShaderCode.splice(i, 0, fragColorCode); } if (line.match(mainFuncStartReg)) { // add gl_FragColor only in the main function break; } } if (!setGlFragColorInLastLine) { const errorMessage = '__removeOutQualifier: Not found the closing brackets for the main function'; this.__outError(splittedShaderCode, splittedShaderCode.length, errorMessage, embedErrorsInOutput); } } /** * @private * Find the qualifier for es3 only in the shader code and remove it * This method directly replace the elements of the splittedShaderCode variable. */ static __removeES3Qualifier(splittedShaderCode, embedErrorsInOutput) { this.__removeVaryingQualifier(splittedShaderCode, embedErrorsInOutput); this.__removeLayout(splittedShaderCode); } /** * @private * Find the "flat" and "smooth" qualifier in the shader code and remove it */ static __removeVaryingQualifier(splittedShaderCode, embedErrorsInOutput) { const reg = /^(?![\/])[\t ]*(flat|smooth)[\t ]*((in|out)[\t ]+.*)/; const errorMessage = '__removeVaryingQualifier: glsl es1 does not support flat qualifier'; for (let i = 0; i < splittedShaderCode.length; i++) { splittedShaderCode[i] = splittedShaderCode[i].replace(reg, (match, p1, p2) => { if (p1 === 'flat') { this.__outError(splittedShaderCode, i + 1, errorMessage, embedErrorsInOutput); return match; } return p2; }); } } /** * @private * Find the "layout" qualifier in the shader code and remove it */ static __removeLayout(splittedShaderCode) { const reg = /^(?![\/])[\t ]*layout[\t ]*\([\t ]*location[\t ]*\=[\t ]*\d[\t ]*\)[\t ]+/g; this.__replaceLine(splittedShaderCode, reg, ''); } /** * @private * Find the "precision" qualifier in the shader code and remove it if the "precision" qualifier is valid for only GLSL ES3 * This method directly replace the elements of the splittedShaderCode variable. */ static __removePrecisionForES3(splittedShaderCode) { const reg = /^(?![\/])[\t ]*precision[\t ]+(highp|mediump|lowp)[\t ]+(\w+)[\t ]*;/; for (let i = 0; i < splittedShaderCode.length; i++) { const match = splittedShaderCode[i].match(reg); if (match != null) { if (match[2] === 'int' || match[2] === 'float' || match[2] === 'sampler2D' || match[2] === 'samplerCube') { // these precisions are supported in es1 continue; } else { splittedShaderCode.splice(i--, 1); } } } } /** * @private * Find the "texture" and "textureProj" method in the shader code and * replace it with the GLSL ES1 method('texture2D', 'texture2D', and so on) * This method directly replace the elements of the splittedShaderCode variable. */ static __convertTextureFunctionToES1(splittedShaderCode, isFragmentShader, embedErrorsInOutput) { var _a, _b; const sbl = this.__regSymbols(); const regTextureProj = new RegExp(`(${sbl}+)textureProj(Lod|)(${sbl}+)`, 'g'); const regTexture = new RegExp(`(${sbl}+)texture(Lod|)(${sbl}+)`, 'g'); let argumentSamplerMap; const uniformSamplerMap = this.__createUniformSamplerMap(splittedShaderCode, embedErrorsInOutput); for (let i = 0; i < splittedShaderCode.length; i++) { const line = splittedShaderCode[i]; const matchTextureProj = line.match(/textureProj(Lod|)[\t ]*\([\t ]*(\w+),/); if (matchTextureProj) { argumentSamplerMap = argumentSamplerMap !== null && argumentSamplerMap !== void 0 ? argumentSamplerMap : this.__createArgumentSamplerMap(splittedShaderCode, i, embedErrorsInOutput); const isLodMethod = matchTextureProj[1] === 'Lod'; const extensionStr = isFragmentShader && isLodMethod ? `EXT` : ``; const variableName = matchTextureProj[2]; const samplerType = (_a = argumentSamplerMap === null || argumentSamplerMap === void 0 ? void 0 : argumentSamplerMap.get(variableName)) !== null && _a !== void 0 ? _a : uniformSamplerMap.get(variableName); if (samplerType != null) { if (samplerType === 'sampler2D') { splittedShaderCode[i] = splittedShaderCode[i].replace(regTextureProj, `$1texture2DProj$2${extensionStr}$3`); } else { const errorMessage = '__convertTextureFunctionToES1: do not support ' + samplerType + ' type'; this.__outError(splittedShaderCode, i, errorMessage, embedErrorsInOutput); } } continue; } const matchTexture = line.match(/texture(Lod|)[\t ]*\([\t ]*(\w+),/); if (matchTexture) { argumentSamplerMap = argumentSamplerMap !== null && argumentSamplerMap !== void 0 ? argumentSamplerMap : this.__createArgumentSamplerMap(splittedShaderCode, i, embedErrorsInOutput); const isLodMethod = matchTexture[1] === 'Lod'; const extensionStr = isFragmentShader && isLodMethod ? `EXT` : ``; const variableName = matchTexture[2]; const samplerType = (_b = argumentSamplerMap === null || argumentSamplerMap === void 0 ? void 0 : argumentSamplerMap.get(variableName)) !== null && _b !== void 0 ? _b : uniformSamplerMap.get(variableName); if (samplerType != null) { let textureFunc; if (samplerType === 'sampler2D') { textureFunc = 'texture2D'; } else if (samplerType === 'samplerCube') { textureFunc = 'textureCube'; } else { textureFunc = ''; const errorMessage = '__convertTextureFunctionToES1: do not support ' + samplerType + ' type'; this.__outError(splittedShaderCode, i, errorMessage, embedErrorsInOutput); } if (textureFunc !== '') { splittedShaderCode[i] = splittedShaderCode[i].replace(regTexture, `$1${textureFunc}$2${extensionStr}$3`); } } continue; } const isBlockEnd = !!line.match(/\}/); if (isBlockEnd) { argumentSamplerMap = undefined; } } } /** * @private * This method finds uniform declarations of sampler types in the shader and * creates a map with variable names as keys and types as values. */ static __createUniformSamplerMap(splittedShaderCode, embedErrorsInOutput) { const uniformSamplerMap = new Map(); for (let i = 0; i < splittedShaderCode.length; i++) { const line = splittedShaderCode[i]; const match = line.match(/^(?![\/])[\t ]*uniform*[\t ]*(highp|mediump|lowp|)[\t ]*(sampler\w+)[\t ]+(\w+)/); if (match) { const samplerType = match[2]; const name = match[3]; if (uniformSamplerMap.get(name)) { const errorMessage = '__createUniformSamplerMap: duplicate variable name'; this.__outError(splittedShaderCode, i, errorMessage, embedErrorsInOutput); } uniformSamplerMap.set(name, samplerType); } } return uniformSamplerMap; } /** * @private * This method finds sampler types from the function arguments and * creates a map with variable names as keys and types as values. */ static __createArgumentSamplerMap(splittedShaderCode, lineIndex, embedErrorsInOutput) { var _a, _b; const argumentSamplerMap = new Map(); for (let i = lineIndex; i >= 0; i--) { const line = splittedShaderCode[i]; const isBlockStartLine = !!line.match(/\{/); if (!isBlockStartLine) { continue; } const bracketSectionCode = this.__getBracketSection(splittedShaderCode, i); const innerBracketSectionCode = (_a = bracketSectionCode.match(/.*\((.*)\)/)) === null || _a === void 0 ? void 0 : _a[1]; if (innerBracketSectionCode == null) { return; } const variableCandidates = innerBracketSectionCode.split(','); const samplerTypeDefinitionReg = /[\n\t ]*(highp|mediump|lowp|)[\n\t ]*(sampler\w+)[\n\t ]*(\w+)[\n\t ]*/; const isFunctionBracket = !!((_b = variableCandidates[0].match(samplerTypeDefinitionReg)) !== null && _b !== void 0 ? _b : variableCandidates[0].match(/^[\n\t ]*$/)); if (!isFunctionBracket) { continue; } for (const variableCandidate of variableCandidates) { const samplerVariableMatch = variableCandidate.match(samplerTypeDefinitionReg); if (samplerVariableMatch == null) { continue; } const samplerType = samplerVariableMatch[2]; const name = samplerVariableMatch[3]; if (argumentSamplerMap.get(name)) { const errorMessage = '__createArgumentSamplerMap: duplicate variable name'; this.__outError(splittedShaderCode, i, errorMessage, embedErrorsInOutput); } argumentSamplerMap.set(name, samplerType); } break; } return argumentSamplerMap; } /** * @private * This method returns the part enclosed in brackets(= '()'). * For example, you can get lines that contain function arguments, conditional expressions for if statements, etc. */ static __getBracketSection(splittedShaderCode, bracketEndIndex) { let bracketStartIndex = 0; for (let j = bracketEndIndex; j >= 0; j--) { const line = splittedShaderCode[j]; const isBracketStartMatch = !!line.match(/\(/); if (isBracketStartMatch) { bracketStartIndex = j; break; } } let containBracketCode = ''; for (let j = bracketStartIndex; j <= bracketEndIndex; j++) { containBracketCode += splittedShaderCode[j]; } return containBracketCode; } /** * @private * Find the 'attribute' qualifier in the vertex shader code and replace it with the GLSL ES3 qualifier('in') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertAttribute(splittedShaderCode, isFragmentShader) { if (isFragmentShader) { return; } const reg = /^(?![\/])[\t ]*attribute[\t ]+/g; const replaceStr = 'in '; this.__replaceLine(splittedShaderCode, reg, replaceStr); } /** * @private * Find the 'varying' qualifier in the shader code and replace it with the GLSL ES3 qualifier('in' or 'out') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertVarying(splittedShaderCode, isFragmentShader) { const reg = /^(?![\/])[\t ]*varying[\t ]+/g; const replaceStr = isFragmentShader ? 'in ' : 'out '; this.__replaceLine(splittedShaderCode, reg, replaceStr); } /** * @private * Find the 'textureCube' method in the shader code and replace it with the GLSL ES3 method('texture') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertTextureCube(splittedShaderCode) { const sbl = this.__regSymbols(); const reg = new RegExp(`(${sbl}+)(textureCube)(${sbl}+)`, 'g'); const replaceStr = 'texture'; this.__replaceLine(splittedShaderCode, reg, '$1' + replaceStr + '$3'); } /** * @private * Find the 'texture2D' method in the shader code and replace it with the GLSL ES3 method('texture') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertTexture2D(splittedShaderCode) { const sbl = this.__regSymbols(); const reg = new RegExp(`(${sbl}+)(texture2D)(${sbl}+)`, 'g'); const replaceStr = 'texture'; this.__replaceLine(splittedShaderCode, reg, '$1' + replaceStr + '$3'); } /** * @private * Find the 'texture2DProj' method in the shader code and replace it with the GLSL ES3 method('textureProj') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertTexture2DProd(splittedShaderCode) { const sbl = this.__regSymbols(); const reg = new RegExp(`(${sbl}+)(texture2DProj)(${sbl}+)`, 'g'); const replaceStr = 'textureProj'; this.__replaceLine(splittedShaderCode, reg, '$1' + replaceStr + '$3'); } /** * @private * Find the 'texture3D' method in the shader code and replace it with the GLSL ES3 method('texture') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertTexture3D(splittedShaderCode) { const sbl = this.__regSymbols(); const reg = new RegExp(`(${sbl}+)(texture3D)(${sbl}+)`, 'g'); const replaceStr = 'texture'; this.__replaceLine(splittedShaderCode, reg, '$1' + replaceStr + '$3'); } /** * @private * Find the 'texture3DProj' method in the shader code and replace it with the GLSL ES3 method('textureProj') * This method directly replace the elements of the splittedShaderCode variable. */ static __convertTexture3DProd(splittedShaderCode) { const sbl = this.__regSymbols(); const reg = new RegExp(`(${sbl}+)(texture3DProj)(${sbl}+)`, 'g'); const replaceStr = 'textureProj'; this.__replaceLine(splittedShaderCode, reg, '$1' + replaceStr + '$3'); } static __regSymbols() { return `[!"#$%&'()\*\+\-\.,\/:;<=>?@\[\\\]^` + '`{|}~\t\n ]'; } static __replaceLine(splittedShaderCode, reg, replacement) { for (let i = 0; i < splittedShaderCode.length; i++) { splittedShaderCode[i] = splittedShaderCode[i].replace(reg, replacement); } } static __removeFirstMatchingLine(splittedShaderCode, reg) { for (let i = 0; i < splittedShaderCode.length; i++) { if (splittedShaderCode[i].match(reg)) { splittedShaderCode.splice(i, 1); break; } } } static __outError(splittedShaderCode, lineIndex, errorMessage, embedErrorsInOutput) { if (embedErrorsInOutput) { const shaderOutputMessage = `// line ${lineIndex}: ${errorMessage}\n`; const closeBracketReg = /(.*)\}[\n\t ]*$/; for (let i = splittedShaderCode.length - 1; i >= 0; i--) { const line = splittedShaderCode[i]; if (line.match(closeBracketReg)) { break; } if (splittedShaderCode[i] === shaderOutputMessage) { // avoid duplicate error message return; } } console.error(errorMessage); splittedShaderCode.push(shaderOutputMessage); } else { throw new Error(errorMessage); } } } exports.default = ShaderTransformer; /***/ }), /***/ "./src/main/Shaderity.ts": /*!*******************************!*\ !*** ./src/main/Shaderity.ts ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __nested_webpack_require_43533__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Reflection_1 = __importDefault(__nested_webpack_require_43533__(/*! ./Reflection */ "./src/main/Reflection.ts")); const ShaderTransformer_1 = __importDefault(__nested_webpack_require_43533__(/*! ./ShaderTransformer */ "./src/main/ShaderTransformer.ts")); const ShaderEditor_1 = __importDefault(__nested_webpack_require_43533__(/*! ./ShaderEditor */ "./src/main/ShaderEditor.ts")); const Utility_1 = __importDefault(__nested_webpack_require_43533__(/*! ./Utility */ "./src/main/Utility.ts")); const ShaderityObjectCreator_1 = __importDefault(__nested_webpack_require_43533__(/*! ./ShaderityObjectCreator */ "./src/main/ShaderityObjectCreator.ts")); const PreProcessor_1 = __importDefault(__nested_webpack_require_43533__(/*! ./PreProcessor */ "./src/main/PreProcessor.ts")); class Shaderity { // ========================================================================================================= // shader transformation functions // ========================================================================================================= /** * Translate a GLSL ES3 shader code to a GLSL ES1 shader code * @param obj Shaderity object to translate to glsl es1 * @param embedErrorsInOutput If true, when there is an error in the conversion, * the error and the number of lines are output at the bottom of the return * value ShaderityObject.code. If false, throw an error. * @returns ShaderityObject whose code property is the shader code for GLSL ES1 */ static transformToGLSLES1(obj, embedErrorsInOutput = false) { const splittedShaderCode = Utility_1.default._splitByLineFeedCode(obj.code); const transformedSplittedShaderCode = ShaderTransformer_1.default._transformToGLSLES1(splittedShaderCode, obj.isFragmentShader, embedErrorsInOutput); const resultCode = Utility_1.default._joinSplittedLine(transformedSplittedShaderCode); const resultObj = { code: resultCode, shaderStage: obj.shaderStage, isFragmentShader: obj.isFragmentShader, }; return resultObj; } /** * Translate a GLSL ES1 shader code to a GLSL ES3 shader code */ static transformToGLSLES3(obj) { const splittedShaderCode = Utility_1.default._splitByLineFeedCode(obj.code); const transformedSplittedShaderCode = ShaderTransformer_1.default._transformToGLSLES3(splittedShaderCode, obj.isFragmentShader); const resultCode = Utility_1.default._joinSplittedLine(transformedSplittedShaderCode); const resultObj = { code: resultCode, shaderStage: obj.shaderStage, isFragmentShader: obj.isFragmentShader, }; return resultObj; } /** * Translate a GLSL shader code to a shader code of specified GLSL version */ static transformTo(version, obj, embedErrorsInOutput = false) { const splittedShaderCode = Utility_1.default._splitByLineFeedCode(obj.code); const transformedSplittedShaderCode = ShaderTransformer_1.default._transformTo(version, splittedShaderCode, obj.isFragmentShader, embedErrorsInOutput); const resultCode = Utility_1.default._joinSplittedLine(transformedSplittedShaderCode); const resultObj = { code: resultCode, shaderStage: obj.shaderStage, isFragmentShader: obj.isFragmentShader, }; return resultObj; } static processPragma(obj) { const splittedShaderCode = Utility_1.default._splitByLineFeedCode(obj.code); const transformedSplittedShaderCode = PreProcessor_1.default.process(splittedShaderCode); const resultCode = Utility_1.default._joinSplittedLine(transformedSplittedShaderCode); const resultObj = { code: resultCode, shaderStage: obj.shaderStage, isFragmentShader: obj.isFragmentShader, }; return resultObj; } // ========================================================================================================= // shaderity object creation functions // ========================================================================================================= /** * Create an instance to create shaderity object. */ static createShaderityObjectCreator(shaderStage) { return new ShaderityObjectCreator_1.default(shaderStage); } // ========================================================================================================= // shader edit functions // ========================================================================================================= /** * Find the following template pattern in the shader code and replace key to value * @param templateObject An object that represents the string before and after the replacement * The key can be a string or an object. If an object is used as the key, * the key in the pattern of shaderCode must also match the object. * For example, if templateObject is { sample { sampleA: 0 } } * then the key in a shader code is sample.sampleA. */ // The template pattern is /* shaderity: @{key} */ static fillTemplate(obj, arg) { const copy = this.__copyShaderityObject(obj); copy.code = ShaderEditor_1.default._fillTemplate(copy.code, arg); return copy; } /** * Insert define directive */ static insertDefinition(obj, definition) { const copy = this.__copyShaderityObject(obj); const splittedShaderCode = Utility_1.default._splitByLineFeedCode(obj.code); ShaderEditor_1.default._insertDefinition(splittedShaderCode, definition); copy.code = Utility_1.default._joinSplittedLine(splittedShaderCode); return copy; } // ========================================================================================================= // reflection functions // ========================================================================================================= /** * Create an instance to get the attribute, varying, and uniform information from a shader code of the shaderity. * To get these information, you need to call reflection.reflect method. */ static createReflectionObject(obj) { const splittedShaderCode = Utility_1.default._splitByLineFeedCode(obj.code); const reflection = new Reflection_1.default(splittedShaderCode, obj.shaderStage); return reflection; } // ========================================================================================================= // private functions // ========================================================================================================= static __copyShaderityObject(obj) { const copiedObj = { code: obj.code, shaderStage: obj.shaderStage, isFragmentShader: obj.isFragmentShader, }; return copiedObj; } } exports.default = Shaderity; /***/ }), /***/ "./src/main/ShaderityObjectCreator.ts": /*!********************************************!*\ !*** ./src/main/ShaderityObjectCreator.ts ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __nested_webpack_require_51068__) { "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Utility_1 = __importDefault(__nested_webpack_require_51068__(/*! ./Utility */ "./src/main/Utility.ts")); /** * This class creates a shaderity object. */ class ShaderityObjectCreator { constructor(shaderStage) { this.__functionIdCount = 0; this.__defineDirectiveNames = []; this.__extensions = []; this.__globalPrecision = { int: 'highp', float: 'highp', sampler2D: 'highp', samplerCube: 'highp', sampler3D: 'highp', sampler2DArray: 'highp', isampler2D: 'highp', isamplerCube: 'highp', isampler3D: 'highp', isampler2DArray: 'highp', usampler2D: 'highp', usamplerCube: 'highp', usampler3D: 'highp', usampler2DArray: 'highp', sampler2DShadow: 'highp', samplerCubeShadow: 'highp', sampler2DArrayShadow: 'highp', }; this.__structDefinitions = []; this.__globalConstantValues = []; this.__globalConstantStructValues = []; this.__attributes = []; // for vertex shader only this.__varyings = []; this.__uniforms = []; this.__uniformStructs = []; this.__uniformBufferObjects = []; this.__functions = []; // first index represent dependency level this.__mainFunctionCode = 'void main() {}'; this.__outputColorVariableName = 'renderTarget0'; // for fragment shader only this.__shaderStage = shaderStage; } // ========================================================================================================= // add parameters functions // ========================================================================================================= addDefineDirective(defineDirectiveName) { const isDuplicate = this.__defineDirectiveNames.some(name => name === defineDirectiveName); if (isDuplicate) { console.warn('addDefineDirective: this define directive is already set'); return; } this.__defineDirectiveNames.push(defineDirectiveName); } addExtension(extensionName, behavior = 'enable') { const isDuplicate = this.__extensions.some(extension => extension.extensionName === extensionName); if (isDuplicate) { console.warn('addExtension: this extension is already set'); return; } this.__extensions.push({ extensionName, behavior }); } // only define types addStructDefinition(structName, memberObjects) { const isDuplicate = this.__structDefinitions.some(structDefinition => structDefinition.structName === structName); if (isDuplicate) { console.error(`addStructDefinition: duplicate struct type name ${structName}`); return; } this.__structDefinitions.push({ structName, memberObjects, }); } addGlobalConstantValue(variableName, type, values) { const isDuplicate = this.__globalConstantValues.some(globalConstantValue => globalConstantValue.variableName === variableName); if (isDuplicate) { console.error(`addGlobalConstantValue: duplicate variable name ${variableName}`); return; } const isValidComponentNumber = Utility_1.default._isValidComponentCount(type, values); if (!isValidComponentNumber) { console.error(`addGlobalConstantValue: the component count of ${variableName} is invalid`); return; } const isIntType = Utility_1.default._isIntType(type); if (isIntType) { const existNonIntegerValue = ShaderityObjectCreator.__existNonIntegerValue(values); if (existNonIntegerValue) { console.warn(`addGlobalConstantValue: non-integer value is set to ${variableName}`); } } this.__globalConstantValues.push({ variableName, type, values, }); } // need to define struct by the addStructDefinition method // validate that the corresponding structure is defined by the __createGlobalConstantStructValueShaderCode method addGlobalConstantStructValue(structName, variableName, values) { const isDuplicate = this.__globalConstantStructValues.some(structValue => structValue.variableName === variableName); if (isDuplicate) { console.error(`addGlobalConstantStructValue: duplicate variable name ${variableName}`); return; } this.__globalConstantStructValues.push({ variableName, structName, values, }); } addAttributeDeclaration(variableName, type, options) { if (this.__shaderStage !== 'vertex') { console.error('addAttribute: this method is for vertex shader only'); return; } const isDuplicate = this.__attributes.some(attribute => attribute.variableName === variableName); if (isDuplicate) { console.error(`addAttribute: duplicate variable name ${variableName}`); return; } this.__attributes.push({ variableName, type, precision: options === null || options === void 0 ? void 0 : options.precision, location: options === null || options === void 0 ? void 0 : options.location, }); } addVaryingDeclaration(variableName, type, options) { const isDuplicate = this.__varyings.some(varying => varying.variableName === variableName); if (isDuplicate) { console.error(`addVarying: duplicate variable name ${variableName}`); return; } const isIntType = Utility_1.default._isIntType(type); let interpolationType = options === null || options === void 0 ? void 0 : options.interpolationType; if (isIntType && interpolationType !== 'flat') { if (interpolationType != null) { console.error(`addVarying: the interpolationType must be flat for integer types`); return; } else { console.warn(`addVarying: set the interpolationType of integer types to flat to avoid compilation error`); interpolationType = 'flat'; } } this.__varyings.push({ variableName, type, precision: options === null || options === void 0 ? void 0 : options.precision, interpolationType, }); } addUniformDeclaration(variableName, type, options) { const isDuplicate = this.__uniforms.some(uniform => uniform.variableName === variableName); if (isDuplicate) { console.error(`addUniform: duplicate variable name ${variableName}`); return; } if (type === 'bool' && (options === null || options === void 0 ? void 0 : options.precision) != null) { console.warn(`addUniform: remove the specification of precision for bool type to avoid compilation error`); options.precision = undefined; } this.__uniforms.push({ variableName, type, precision: options === null || options === void 0 ? void 0 : options.precision, }); } // need to define struct by the addStructDefinition method addUniformStructDeclaration(structName, variableName) { const isDuplicate = this.__uniformStructs.some(uniformStruct => uniformStruct.variableName === variableName); if (isDuplicate) { console.error(`addUniformStructDeclaration: duplicate variable name ${variableName}`); return; } this.__uniformStructs.push({ variableName, structName, }); } // for es3 addUniformBufferObjectDeclaration(blockName, variableObjects, options) { const isDuplicateBlockName = this.__uniformBufferObjects.some(ubo => ubo.blockName === blockName); if (isDuplicateBlockName) { console.error(`addUniformBufferObjectDeclaration: duplicate block name ${blockName}`); return; } for (const ubo of this.__uniformBufferObjects) { for (const uboVariableObject of ubo.variableObjects) { for (const variableObject of variableObjects) { if (uboVariableObject.variableName === variableObject.variableName) { console.error(`addUniformBufferObjectDeclaration: duplicate variable name ${variableObject.variableName}`); return; } } } } this.__uniformBufferObjects.push({ blockName, variableObjects, instanceName: options === null || options === void 0 ? void 0 : options.instanceName, }); } // the return value Id is a value to delete the function // the main function is defined (updated) by the updateMainFunction method addFunctionDefinition(functionCode, options) { var _a, _b; const functionId = this.__functionIdCount++; const dependencyLevel = (_a = options === null || options === void 0 ? void 0 : options.dependencyLevel) !== null && _a !== void 0 ? _a : 0; this.__functions[dependencyLevel] = (_b = this.__functions[dependencyLevel]) !== null && _b !== void 0 ? _b : []; this.__functions[dependencyLevel].push({ functionCode, functionId }); return functionId; } // ========================================================================================================= // update parameters functions // ========================================================================================================= updateGlobalPrecision(precision) { Object.assign(this.__globalPrecision, precision); } updateStructDefinition(structName, memberObjects) { const matchedIndex = this.__structDefinitions.findIndex(structDefinition => structDefinition.structName === structName); if (matchedIndex === -1) { console.error(`updateStructDefinition: the struct type name ${structName} is not exist`); return; } this.__structDefinitions[matchedIndex].memberObjects = memberObjects; } updateGlobalConstantValue(variableName, values) { const matchedIndex = this.__globalConstantValues.findIndex(globalConstantValue => globalConstantValue.variableName === variableName); if (matchedIndex === -1) { console.warn(`updateGlobalConstantValue: the variable name ${variableName} is not exist`); return; } const type = this.__globalConstantValues[matchedIndex].type; const isValidComponentNumber = Utility_1.default._isValidComponentCount(type, values); if (!isValidComponentNumber) { console.error('updateGlobalConstantValue: the component count is invalid'); return; } const isIntType = Utility_1.default._isIntType(type); if (isIntType) { const existNonIntegerValue = ShaderityObjectCreator.__existNonIntegerValue(values); if (existNonIntegerValue) { console.warn(`updateGlobalConstantValue: the ${variableName} has a non-integer value.`); } } this.__globalConstantValues[matchedIndex].values = values; } updateGlobalConstantStructValue(variableName, values) { const matchedIndex = this.__globalConstantStructValues.findIndex(structValue => structValue.variableName === variableName); if (matchedIndex === -1) { console.error(`updateGlobalConstantStructValue: the variable name ${variableName} is not exist`); return; } this.__globalConstantStructValues[matchedIndex].values = values; } updateMainFunction(mainFunctionCodeInner) { this.__mainFunctionCode = mainFunctionCodeInner; } // specify the name of the output color variable from the main function in the fragment shader. // users have to assign the result of fragment shader calculation to this variable. updateOutputColorVariableName(outputColorVariableName) { if (this.__shaderStage !== 'fragment') { console.error('updateOutputColorVariableName: this method is for fragment shader only'); return; } if (outputColorVariableName.length === 0) { console.error('updateOutputColorVariableName: invalid outColorVariableName'); return; } this.__outputColorVariableName = outputColorVariableName; } // ========================================================================================================= // remove parameters functions // ========================================================================================================= removeDefineDirective(defineDirectiveName) { const matchedIndex = this.__defineDirectiveNames.indexOf(defineDirectiveName); if (matchedIndex === -1) { console.warn('removedDefineDirective: this define directive is not exist'); return; } this.__defineDirectiveNames.splice(matchedIndex, 1); } removeExtension(extensionName) { const matchedIndex = this.__extensions.findIndex(extension => extension.extensionName === extensionName); if (matchedIndex === -1) { console.warn('removeExtension: this extension is not exist'); return; } this.__extensions.splice(matchedIndex, 1); } removeStructDefinition(structName) { const matchedIndex = this.__structDefinitions.findIndex(structDefinition => structDefinition.structName === structName); if (matchedIndex === -1) { console.error(`removeStructDefinition: the struct type name ${structName} is not exist`); return; } this.__structDefinitions.splice(matchedIndex, 1); } removeGlobalConstantValue(variableName) { const matchedIndex = this.__globalConstantValues.findIndex(globalConstantValue => globalConstantValue.variableName === variableName); if (matchedIndex === -1) { console.warn(`removeGlobalConstantValue: the variable name ${variableName} is not exist`); return; } this.__globalConstantValues.splice(matchedIndex, 1); } removeGlobalConstantStructValue(variableName) { const matchedIndex = this.__globalConstantStructValues.findIndex(structValue => structValue.variableName === variableName); if (matchedIndex === -1) { console.error(`updateGlobalConstantStructValue: the variable name ${variableName} is not exist`); return; } this.__globalConstantStructValues.splice(matchedIndex, 1); } removeAttributeDeclaration(variableName) { const matchedIndex = this.__attributes.findIndex(attribute => attribute.variableName === variableName); if (matchedIndex === -1) { console.warn(`removeAttribute: the variable name ${variableName} is not exist`); return; } this.__attributes.splice(matchedIndex, 1); } removeVaryingDeclaration(variableName) { const matchedIndex = this.__varyings.findIndex(varying => varying.variableName === variableName); if (matchedIndex === -1) { console.warn(`removeVarying: the variable name ${variableName} is not exist`); return; } this.__varyings.splice(matchedIndex, 1); } removeUniformDeclaration(variableName) { const matchedIndex = this.__uniforms.findIndex(uniform => uniform.variableName === variableName); if (matchedIndex === -1) { console.warn(`removeUniform: the variable name ${variableName} is not exist`); return; } this.__uniforms.splice(matchedIndex, 1); } removeUniformStructDeclaration(variableName) { const matchedIndex = this.__uniformStructs.findIndex(uniformStruct => uniformStruct.variableName === variableName); if (matchedIndex === -1) { console.warn(`removeUniformStructDeclaration: the variable name ${variableName} is not exist`); return; } this.__uniformStructs.splice(matchedIndex, 1); } removeUniformBufferObjectDeclaration(blockName) { const matchedIndex = this.__uniformBufferObjects.findIndex(ubo => ubo.blockName === blockName); if (matchedIndex === -1) { console.warn(`removeUniformStructDeclaration: the variable name ${blockName} is not exist`); return; } this.__uniformBufferObjects.splice(matchedIndex, 1); } removeFunctionDefinition(functionId) { this.__fillEmptyFunctions(); // id is too small or too big if (functionId < 0 || functionId >= this.__functionIdCount) { console.warn('removeFunctionDefinition: invalid function id'); } for (const functionObjects of this.__functions) { const matchedIndex = functionObjects.findIndex(functionObject => functionObject.functionId === functionId); if (matchedIndex !== -1) { functionObjects.splice(matchedIndex, 1); return; } } console.warn(`removeFunctionDefinition: not found the function of functionId ${functionId}`); } // ========================================================================================================= // create shaderity object function // ========================================================================================================= createShaderityObject() { const shaderityObj = { code: this.__createShaderCode(), shaderStage: this.__shaderStage, isFragmentShader: this.__shaderStage === 'fragment', }; return shaderityObj; } // ========================================================================================================= // private methods // ========================================================================================================= static __existNonIntegerValue(values) { for (const value of values) { if (!Number.isInteger(value)) { return true; } } return false; } // TODO: implement shader code import feature (low priority) // public importShaderCode(code: string) {} // need to apply Shaderity.transformToGLSLES1, transformToGLSLES3 or transformTo method __createShaderCode() { this.__fillEmptyFunctions(); const code = `#version 300 es\n\n` + this.__createDefineDirectiveShaderCode() + this.__createExtensionShaderCode() + this.__createGlobalPrecisionShaderCode() + this.__createStructDefinitionShaderCode() + this.__createGlobalConstantValueShaderCode() + this.__createGlobalConstantStructValueShaderCode() + this.__createAttributeDeclarationShaderCode() + this.__createVaryingDeclarationShaderCode() + this.__createOutputColorDeclarationShaderCode() + this.__createUniformDeclarationShaderCode() + this.__createUniformStructDeclarationShaderCode() + this.__createUniformBufferObjectShaderCode() + this.__createFunctionDefinitionShaderCode() + this.__createMainFunctionDefinitionShaderCode(); return code; } __fillEmptyFunctions() { var _a; for (let i = 0; i < this.__functions.length; i++) { this.__functions[i] = (_a = this.__functions[i]) !== null && _a !== void 0 ? _a : []; } } __createDefineDirectiveShaderCode() { let shaderCode = ''; for (const defineDirectiveName of this.__defineDirectiveNames) { shaderCode += `#define ${defineDirectiveName}\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); ; } __createExtensionShaderCode() { let shaderCode = ''; for (const extension of this.__extensions) { shaderCode += `#extension ${extension.extensionName}: ${extension.behavior}\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } //TODO: remove needless precisions __createGlobalPrecisionShaderCode() { let shaderCode = ''; for (const type in this.__globalPrecision) { const precisionType = type; const precisionQualifier = this.__globalPrecision[precisionType]; shaderCode += `precision ${precisionQualifier} ${precisionType};\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createStructDefinitionShaderCode() { let shaderCode = ''; for (const structDefinition of this.__structDefinitions) { shaderCode += `struct ${structDefinition.structName} {\n`; for (let i = 0; i < structDefinition.memberObjects.length; i++) { const variable = structDefinition.memberObjects[i]; shaderCode += ` `; if (variable.precision != null) { shaderCode += `${variable.precision} `; } shaderCode += `${variable.type} ${variable.memberName};\n`; } shaderCode += `};\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createGlobalConstantValueShaderCode() { let shaderCode = ''; for (const globalConstantValue of this.__globalConstantValues) { const type = globalConstantValue.type; const variableName = globalConstantValue.variableName; const value = globalConstantValue.values; shaderCode += `const ${type} ${variableName} = ${type}(`; for (let i = 0; i < value.length; i++) { shaderCode += value[i] + ', '; } shaderCode = shaderCode.replace(/,\s$/, ');\n'); } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createGlobalConstantStructValueShaderCode() { let shaderCode = ''; for (const structValue of this.__globalConstantStructValues) { const matchedIndex = this.__structDefinitions.findIndex(definition => definition.structName === structValue.structName); if (matchedIndex === -1) { console.error(`__createGlobalConstantStructValueShaderCode: the struct type ${structValue.structName} is not defined`); continue; } shaderCode += `const ${structValue.structName} ${structValue.variableName} = ${structValue.structName} (\n`; const structDefinition = this.__structDefinitions[matchedIndex]; if (structDefinition.memberObjects.length !== Object.keys(structValue.values).length) { console.error(`__createGlobalConstantStructValueShaderCode: Invalid number of variables that ${structValue.variableName} has`); continue; } const hasSamplerType = structDefinition.memberObjects.some(memberObject => Utility_1.default._isSamplerType(memberObject.type)); if (hasSamplerType) { console.error(`__createGlobalConstantStructValueShaderCode: ConstantStructValue (${structValue.variableName}) cannot have sampler type parameter`); continue; } for (let i = 0; i < structDefinition.memberObjects.length; i++) { const variableName = structDefinition.memberObjects[i].memberName; const value = structValue.values[variableName]; if (value == null) { console.error(`__createGlobalConstantStructValueShaderCode: ${structValue.variableName} does not have the value of ${variableName}`); continue; } const type = structDefinition.memberObjects[i].type; const isValidComponentNumber = Utility_1.default._isValidComponentCount(type, value); if (!isValidComponentNumber) { console.error(`__createGlobalConstantStructValueShaderCode: the component count of ${variableName} in ${structValue.variableName} is invalid`); continue; } shaderCode += ` ${type}(`; for (let i = 0; i < value.length; i++) { shaderCode += value[i] + ', '; } shaderCode = shaderCode.replace(/,\s$/, '),\n'); } shaderCode = shaderCode.replace(/,\n$/, '\n);\n'); } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createAttributeDeclarationShaderCode() { let shaderCode = ''; for (const attribute of this.__attributes) { if (attribute.location != null) { shaderCode += `layout (location = ${attribute.location}) `; } shaderCode += `in `; if (attribute.precision != null) { shaderCode += `${attribute.precision} `; } shaderCode += `${attribute.type} ${attribute.variableName};\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createVaryingDeclarationShaderCode() { let shaderCode = ''; for (const varying of this.__varyings) { if (varying.interpolationType != null) { shaderCode += `${varying.interpolationType} `; } shaderCode += this.__shaderStage == 'vertex' ? `out ` : `in `; if (varying.precision != null) { shaderCode += `${varying.precision} `; } shaderCode += `${varying.type} ${varying.variableName};\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } //TODO: translate when glsl es1 __createOutputColorDeclarationShaderCode() { if (this.__shaderStage !== 'fragment') { return ''; } return `layout(location = 0) out vec4 ${this.__outputColorVariableName};\n\n`; } __createUniformDeclarationShaderCode() { let shaderCode = ''; for (const uniform of this.__uniforms) { shaderCode += `uniform `; if (uniform.precision != null) { shaderCode += `${uniform.precision} `; } shaderCode += `${uniform.type} ${uniform.variableName};\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createUniformStructDeclarationShaderCode() { let shaderCode = ''; for (const uniformStruct of this.__uniformStructs) { const structName = uniformStruct.structName; const existStructDefinition = this.__structDefinitions.some(definition => definition.structName === structName); if (!existStructDefinition) { console.error(`__createUniformStructDeclarationShaderCode: the struct type ${structName} is not defined`); continue; } shaderCode += `uniform ${structName} ${uniformStruct.variableName};\n`; } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createUniformBufferObjectShaderCode() { let shaderCode = ''; for (const ubo of this.__uniformBufferObjects) { shaderCode += `layout (std140) uniform ${ubo.blockName} {\n`; for (let i = 0; i < ubo.variableObjects.length; i++) { const variableObj = ubo.variableObjects[i]; shaderCode += ` ${variableObj.type} ${variableObj.variableName};\n`; } if (ubo.instanceName != null) { shaderCode += `} ${ubo.instanceName};\n`; } else { shaderCode += `};\n`; } } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createFunctionDefinitionShaderCode() { let shaderCode = ''; for (let i = 0; i < this.__functions.length; i++) { const functionObjects = this.__functions[i]; for (let j = 0; j < functionObjects.length; j++) { shaderCode += functionObjects[j].functionCode + `\n`; } } return Utility_1.default._addLineFeedCodeIfNotNullString(shaderCode); } __createMainFunctionDefinitionShaderCode() { return this.__mainFunctionCode + `\n`; } } exports.default = ShaderityObjectCreator; /***/ }), /***/ "./src/main/Utility.ts": /*!*****************************!*\ !*** ./src/main/Utility.ts ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); class Utility { static _splitByLineFeedCode(source) { return source.split(/\r\n|\n/); } static _joinSplittedLine(splittedLine) { return splittedLine.join('\n'); } static _addLineFeedCodeIfNotNullString(source) { return source === '' ? source : source + '\n'; } static _componentNumber(type) { let componentNumber; if (type === 'float' || type === 'int' || type === 'bool' || type === 'uint' || type === 'sampler2D' || type === 'samplerCube' || type === 'sampler3D' || type === 'sampler2DArray' || type === 'isampler2D' || type === 'isamplerCube' || type === 'isampler3D' || type === 'isampler2DArray' || type === 'usampler2D' || type === 'usamplerCube' || type === 'usampler3D' || type === 'usampler2DArray' || type === 'sampler2DShadow' || type === 'samplerCubeShadow' || type === 'sampler2DArrayShadow') { componentNumber = 1; } else if (type === 'vec2' || type === 'ivec2' || type === 'bvec2' || type === 'uvec2') { componentNumber = 2; } else if (type === 'vec3' || type === 'ivec3' || type === 'bvec3' || type === 'uvec3') { componentNumber = 3; } else if (type === 'vec4' || type === 'ivec4' || type === 'bvec4' || type === 'uvec4' || type === 'mat2' || type === 'mat2x2') { componentNumber = 4; } else if (type === 'mat2x3' || type === 'mat3x2') { componentNumber = 6; } else if (type === 'mat2x4' || type === 'mat4x2') { componentNumber = 8; } else if (type === 'mat3' || type === 'mat3x3') { componentNumber = 9; } else if (type === 'mat3x4' || type === 'mat4x3') { componentNumber = 12; } else if (type === 'mat4' || type === 'mat4x4') { componentNumber = 16; } else { // unknown type componentNumber = 0; console.error('Utility._componentNumber: detect unknown type'); } return componentNumber; } static _isIntType(type) { if (type === 'int' || type === 'ivec2' || type === 'ivec3' || type === 'ivec4' || type === 'uint' || type === 'uvec2' || type === 'uvec3' || type === 'uvec4') { return true; } else { return false; } } static _isValidComponentCount(type, values) { const validComponentCount = Utility._componentNumber(type); if (validComponentCount === values.length) { return true; } return false; } static _isSamplerType(type) { if (type === 'sampler2D' || type === 'samplerCube' || type === 'sampler3D' || type === 'sampler2DArray' || type === 'isampler2D' || type === 'isamplerCube' || type === 'isampler3D' || type === 'isampler2DArray' || type === 'usampler2D' || type === 'usamplerCube' || type === 'usampler3D' || type === 'usampler2DArray' || type === 'sampler2DShadow' || type === 'samplerCubeShadow' || type === 'sampler2DArrayShadow') { return true; } else { return false; } } } exports.default = Utility; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy9tYWluL1ByZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFpbi9SZWZsZWN0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9tYWluL1NoYWRlckVkaXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFpbi9TaGFkZXJUcmFuc2Zvcm1lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFpbi9TaGFkZXJpdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4vU2hhZGVyaXR5T2JqZWN0Q3JlYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFpbi9VdGlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsNEdBQXlD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QUMxRSxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssT0FBTyxFQUMxRTtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ1o7YUFBTTtZQUNOLE9BQU8sS0FBSyxDQUFDO1NBQ2I7SUFDRixDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUM1QixJQUE2RyxFQUM3RyxNQUFnQjtRQUVoQixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLG1CQUFtQixLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQ3BCLElBQTZHO1FBRTdHLElBQ0MsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssYUFBYSxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLGdCQUFnQjtZQUNuRyxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksS0FBSyxjQUFjLElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLEtBQUssaUJBQWlCO1lBQ3ZHLElBQUksS0FBSyxZQUFZLElBQUksSUFBSSxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksS0FBSyxpQkFBaUI7WUFDdkcsSUFBSSxLQUFLLGlCQUFpQixJQUFJLElBQUksS0FBSyxtQkFBbUIsSUFBSSxJQUFJLEtBQUssc0JBQXNCLEVBQzVGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDWjthQUFNO1lBQ04sT0FBTyxLQUFLLENBQUM7U0FDYjtJQUNGLENBQUM7Q0FDRDtBQXhGRCwwQkF3RkMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi4vLi4vLi4vZGlzdC9cIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXgudHNcIik7XG4iLCJpbXBvcnQgU2hhZGVyaXR5IGZyb20gJy4vbWFpbi9TaGFkZXJpdHknO1xyXG5pbXBvcnQgX1NoYWRlcml0eU9iamVjdENyZWF0b3IgZnJvbSAnLi9tYWluL1NoYWRlcml0eU9iamVjdENyZWF0b3InO1xyXG5pbXBvcnQgX1JlZmxlY3Rpb24gZnJvbSAnLi9tYWluL1JlZmxlY3Rpb24nO1xyXG5cclxuaW1wb3J0IHtcclxuICBBdHRyaWJ1dGVTZW1hbnRpY3MgYXMgX0F0dHJpYnV0ZVNlbWFudGljcyxcclxuICBSZWZsZWN0aW9uQXR0cmlidXRlIGFzIF9SZWZsZWN0aW9uQXR0cmlidXRlLFxyXG4gIFJlZmxlY3Rpb25Vbmlmb3JtIGFzIF9SZWZsZWN0aW9uVW5pZm9ybSxcclxuICBSZWZsZWN0aW9uVmFyeWluZyBhcyBfUmVmbGVjdGlvblZhcnlpbmcsXHJcbiAgU2hhZGVyaXR5T2JqZWN0IGFzIF9TaGFkZXJpdHlPYmplY3QsXHJcbiAgU2hhZGVyRXh0ZW5zaW9uQmVoYXZpb3IgYXMgX1NoYWRlckV4dGVuc2lvbkJlaGF2aW9yLFxyXG4gIFNoYWRlckNvbnN0YW50VmFsdWVWYXJUeXBlRVMzIGFzIF9TaGFkZXJDb25zdGFudFZhbHVlVmFyVHlwZUVTMyxcclxuICBTaGFkZXJQcmVjaXNpb25PYmplY3QgYXMgX1NoYWRlclByZWNpc2lvbk9iamVjdCxcclxuICBTaGFkZXJTdGFnZVN0ciBhcyBfU2hhZGVyU3RhZ2VTdHIsXHJcbiAgU2hhZGVyUHJlY2lzaW9uVHlwZSBhcyBfU2hhZGVyUHJlY2lzaW9uVHlwZSxcclxuICBTaGFkZXJBdHRyaWJ1dGVWYXJUeXBlIGFzIF9TaGFkZXJBdHRyaWJ1dGVWYXJUeXBlLFxyXG4gIFNoYWRlclZhcnlpbmdJbnRlcnBvbGF0aW9uVHlwZSBhcyBfU2hhZGVyVmFyeWluZ0ludGVycG9sYXRpb25UeXBlLFxyXG4gIFNoYWRlclZhcnlpbmdWYXJUeXBlIGFzIF9TaGFkZXJWYXJ5aW5nVmFyVHlwZSxcclxuICBTaGFkZXJVbmlmb3JtVmFyVHlwZUVTMyBhcyBfU2hhZGVyVW5pZm9ybVZhclR5cGVFUzMsXHJcbiAgU2hhZGVyU3RydWN0TWVtYmVyT2JqZWN0IGFzIF9TaGFkZXJTdHJ1Y3RNZW1iZXJPYmplY3QsXHJcbiAgU2hhZGVyVUJPVmFyaWFibGVPYmplY3QgYXMgX1NoYWRlclVCT1ZhcmlhYmxlT2JqZWN0LFxyXG4gIFNoYWRlckF0dHJpYnV0ZU9iamVjdCBhcyBfU2hhZGVyQXR0cmlidXRlT2JqZWN0LFxyXG4gIFNoYWRlckNvbnN0YW50U3RydWN0VmFsdWVPYmplY3QgYXMgX1NoYWRlckNvbnN0YW50U3RydWN0VmFsdWVPYmplY3QsXHJcbiAgU2hhZGVyQ29uc3RhbnRWYWx1ZU9iamVjdCBhcyBfU2hhZGVyQ29uc3RhbnRWYWx1ZU9iamVjdCxcclxuICBTaGFkZXJFeHRlbnNpb25PYmplY3QgYXMgX1NoYWRlckV4dGVuc2lvbk9iamVjdCxcclxuICBTaGFkZXJTdHJ1Y3REZWZpbml0aW9uT2JqZWN0IGFzIF9TaGFkZXJTdHJ1Y3REZWZpbml0aW9uT2JqZWN0LFxyXG4gIFNoYWRlclVuaWZvcm1CdWZmZXJPYmplY3QgYXMgX1NoYWRlclVuaWZvcm1CdWZmZXJPYmplY3QsXHJcbiAgU2hhZGVyVW5pZm9ybU9iamVjdCBhcyBfU2hhZGVyVW5pZm9ybU9iamVjdCxcclxuICBTaGFkZXJVbmlmb3JtU3RydWN0T2JqZWN0IGFzIF9TaGFkZXJVbmlmb3JtU3RydWN0T2JqZWN0LFxyXG4gIFNoYWRlclZhcnlpbmdPYmplY3QgYXMgX1NoYWRlclZhcnlpbmdPYmplY3QsXHJcbiAgU2hhZGVyVmVyc2lvbiBhcyBfU2hhZGVyVmVyc2lvbixcclxuICBUZW1wbGF0ZU9iamVjdCBhcyBfVGVtcGxhdGVPYmplY3QsXHJcbiAgVW5pZm9ybVNlbWFudGljcyBhcyBfVW5pZm9ybVNlbWFudGljcyxcclxuICBWYXJUeXBlIGFzIF9WYXJUeXBlLFxyXG59IGZyb20gJy4vdHlwZXMvdHlwZSc7XHJcblxyXG5leHBvcnQge1xyXG4gIFNoYWRlcml0eU9iamVjdENyZWF0b3IgYXMgX1NoYWRlcml0eU9iamVjdENyZWF0b3IsXHJcbiAgUmVmbGVjdGlvbiBhcyBfUmVmbGVjdGlvbixcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQXR0cmlidXRlU2VtYW50aWNzID0gX0F0dHJpYnV0ZVNlbWFudGljcztcclxuZXhwb3J0IHR5cGUgUmVmbGVjdGlvbkF0dHJpYnV0ZSA9IF9SZWZsZWN0aW9uQXR0cmlidXRlO1xyXG5leHBvcnQgdHlwZSBSZWZsZWN0aW9uVW5pZm9ybSA9IF9SZWZsZWN0aW9uVW5pZm9ybTtcclxuZXhwb3J0IHR5cGUgUmVmbGVjdGlvblZhcnlpbmcgPSBfUmVmbGVjdGlvblZhcnlpbmc7XHJcbmV4cG9ydCB0eXBlIFNoYWRlcml0eU9iamVjdCA9IF9TaGFkZXJpdHlPYmplY3Q7XHJcbmV4cG9ydCB0eXBlIFNoYWRlckV4dGVuc2lvbkJlaGF2aW9yID0gX1NoYWRlckV4dGVuc2lvbkJlaGF2aW9yO1xyXG5leHBvcnQgdHlwZSBTaGFkZXJDb25zdGFudFZhbHVlVmFyVHlwZUVTMyA9IF9TaGFkZXJDb25zdGFudFZhbHVlVmFyVHlwZUVTMztcclxuZXhwb3J0IHR5cGUgU2hhZGVyUHJlY2lzaW9uT2JqZWN0ID0gX1NoYWRlclByZWNpc2lvbk9iamVjdDtcclxuZXhwb3J0IHR5cGUgU2hhZGVyU3RhZ2VTdHIgPSBfU2hhZGVyU3RhZ2VTdHI7XHJcbmV4cG9ydCB0eXBlIFNoYWRlclByZWNpc2lvblR5cGUgPSBfU2hhZGVyUHJlY2lzaW9uVHlwZTtcclxuZXhwb3J0IHR5cGUgU2hhZGVyQXR0cmlidXRlVmFyVHlwZSA9IF9TaGFkZXJBdHRyaWJ1dGVWYXJUeXBlO1xyXG5leHBvcnQgdHlwZSBTaGFkZXJWYXJ5aW5nSW50ZXJwb2xhdGlvblR5cGUgPSBfU2hhZGVyVmFyeWluZ0ludGVycG9sYXRpb25UeXBlO1xyXG5leHBvcnQgdHlwZSBTaGFkZXJWYXJ5aW5nVmFyVHlwZSA9IF9TaGFkZXJWYXJ5aW5nVmFyVHlwZTtcclxuZXhwb3J0IHR5cGUgU2hhZGVyVW5pZm9ybVZhclR5cGVFUzMgPSBfU2hhZGVyVW5pZm9ybVZhclR5cGVFUzM7XHJcbmV4cG9ydCB0eXBlIFNoYWRlclN0cnVjdE1lbWJlck9iamVjdCA9IF9TaGFkZXJTdHJ1Y3RNZW1iZXJPYmplY3Q7XHJcbmV4cG9ydCB0eXBlIFNoYWRlclVCT1ZhcmlhYmxlT2JqZWN0ID0gX1NoYWRlclVCT1ZhcmlhYmxlT2JqZWN0O1xyXG5leHBvcnQgdHlwZSBTaGFkZXJBdHRyaWJ1dGVPYmplY3QgPSBfU2hhZGVyQXR0cmlidXRlT2JqZWN0O1xyXG5leHBvcnQgdHlwZSBTaGFkZXJDb25zdGFudFN0cnVjdFZhbHVlT2JqZWN0ID0gX1NoYWRlckNvbnN0YW50U3RydWN0VmFsdWVPYmplY3Q7XHJcbmV4cG9ydCB0eXBlIFNoYWRlckNvbnN0YW50VmFsdWVPYmplY3QgPSBfU2hhZGVyQ29uc3RhbnRWYWx1ZU9iamVjdDtcclxuZXhwb3J0IHR5cGUgU2hhZGVyRXh0ZW5zaW9uT2JqZWN0ID0gX1NoYWRlckV4dGVuc2lvbk9iamVjdDtcclxuZXhwb3J0IHR5cGUgU2hhZGVyU3RydWN0RGVmaW5pdGlvbk9iamVjdCA9IF9TaGFkZXJTdHJ1Y3REZWZpbml0aW9uT2JqZWN0O1xyXG5leHBvcnQgdHlwZSBTaGFkZXJVbmlmb3JtQnVmZmVyT2JqZWN0ID0gX1NoYWRlclVuaWZvcm1CdWZmZXJPYmplY3Q7XHJcbmV4cG9ydCB0eXBlIFNoYWRlclVuaWZvcm1PYmplY3QgPSBfU2hhZGVyVW5pZm9ybU9iamVjdDtcclxuZXhwb3J0IHR5cGUgU2hhZGVyVW5pZm9ybVN0cnVjdE9iamVjdCA9IF9TaGFkZXJVbmlmb3JtU3RydWN0T2JqZWN0O1xyXG5leHBvcnQgdHlwZSBTaGFkZXJWYXJ5aW5nT2JqZWN0ID0gX1NoYWRlclZhcnlpbmdPYmplY3Q7XHJcbmV4cG9ydCB0eXBlIFNoYWRlclZlcnNpb24gPSBfU2hhZGVyVmVyc2lvbjtcclxuZXhwb3J0IHR5cGUgVGVtcGxhdGVPYmplY3QgPSBfVGVtcGxhdGVPYmplY3Q7XHJcbmV4cG9ydCB0eXBlIFVuaWZvcm1TZW1hbnRpY3MgPSBfVW5pZm9ybVNlbWFudGljcztcclxuZXhwb3J0IHR5cGUgVmFyVHlwZSA9IF9WYXJUeXBlO1xyXG5leHBvcnQgdHlwZSBTaGFkZXJpdHlPYmplY3RDcmVhdG9yID0gX1NoYWRlcml0eU9iamVjdENyZWF0b3I7XHJcbmV4cG9ydCB0eXBlIFJlZmxlY3Rpb24gPSBfUmVmbGVjdGlvbjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNoYWRlcml0eVxyXG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQcmVQcm9jZXNzb3Ige1xuICAgIHB1YmxpYyBzdGF0aWMgcHJvY2VzcyhzcGxpdHRlZExpbmVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZGVmaW5lID0gLyNkZWZpbmVbXFx0IF0rKFxcdyspLztcbiAgICAgICAgY29uc3QgaWZkZWYgPSAvI2lmZGVmW1xcdCBdKyhcXHcrKS87XG4gICAgICAgIGNvbnN0IGVsaWYgPSAvI2VsaWZbXFx0IF0rZGVmaW5lZFxcKChcXHcrKVxcKS87XG4gICAgICAgIGNvbnN0IF9lbHNlID0gLyNlbHNlLztcbiAgICAgICAgY29uc3QgZW5kaWYgPSAvI2VuZGlmLztcbiAgICAgICAgY29uc3Qgb3V0cHV0SGlzdG9yeTogYm9vbGVhbltdID0gW107XG4gICAgICAgIGxldCBvdXRwdXRGbGcgPSB0cnVlO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgaWZkZWZzOiBzdHJpbmdbXVtdID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzcGxpdHRlZExpbmVzKSB7XG4gICAgICAgICAgICBsZXQgaXNQcmFnbWEgPSBmYWxzZTtcbiAgICAgICAgICAgIHsgLy8gI2RlZmluZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbGluZS5tYXRjaChkZWZpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zLnB1c2gocmVbMV0pO1xuICAgICAgICAgICAgICAgICAgICBpc1ByYWdtYSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3V0cHV0SGlzdG9yeS5pbmRleE9mKGZhbHNlKSA9PT0gLTEpIHsgLy8gI2lmZGVmXG4gICAgICAgICAgICAgICAgY29uc3QgcmUgPSBsaW5lLm1hdGNoKGlmZGVmKTtcbiAgICAgICAgICAgICAgICBpZiAocmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRIaXN0b3J5LnB1c2gob3V0cHV0RmxnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9DaGVja0RlZiA9IHJlWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZmRlZnMucHVzaChbdG9DaGVja0RlZl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMuaW5kZXhPZih0b0NoZWNrRGVmKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzUHJhZ21hID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvdXRwdXRIaXN0b3J5LmluZGV4T2YoZmFsc2UpID09PSAtMSkgeyAvLyAjZWxpZlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbGluZS5tYXRjaChlbGlmKTtcbiAgICAgICAgICAgICAgICBpZiAocmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0NoZWNrRGVmID0gcmVbMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZmRlZnMgPSBpZmRlZnNbaWZkZWZzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm90Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRJZmRlZiBvZiBjdXJyZW50SWZkZWZzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMuaW5kZXhPZihjdXJyZW50SWZkZWYpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdEZvdW5kICYmIGRlZmluaXRpb25zLmluZGV4T2YodG9DaGVja0RlZikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudElmZGVmcy5wdXNoKHRvQ2hlY2tEZWYpO1xuICAgICAgICAgICAgICAgICAgICBpc1ByYWdtYSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3V0cHV0SGlzdG9yeS5pbmRleE9mKGZhbHNlKSA9PT0gLTEpIHsgLy8gI2Vsc2VcbiAgICAgICAgICAgICAgICBjb25zdCByZSA9IGxpbmUubWF0Y2goX2Vsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZmRlZnMgPSBpZmRlZnNbaWZkZWZzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3V0cHV0RmxnSW5uZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRJZmRlZiBvZiBjdXJyZW50SWZkZWZzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMuaW5kZXhPZihjdXJyZW50SWZkZWYpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsZ0lubmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxnID0gb3V0cHV0RmxnSW5uZXI7XG4gICAgICAgICAgICAgICAgICAgIGlzUHJhZ21hID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHsgLy8gI2VuZGlmXG4gICAgICAgICAgICAgICAgY29uc3QgcmUgPSBsaW5lLm1hdGNoKGVuZGlmKTtcbiAgICAgICAgICAgICAgICBpZiAocmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0SGlzdG9yeS5pbmRleE9mKGZhbHNlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNQcmFnbWEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZmRlZnMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEhpc3RvcnkucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3V0cHV0RmxnICYmICFpc1ByYWdtYSkge1xuICAgICAgICAgICAgICAgIG91dHB1dExpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dExpbmVzO1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IHtcblx0QXR0cmlidXRlU2VtYW50aWNzLFxuXHRSZWZsZWN0aW9uQXR0cmlidXRlLFxuXHRSZWZsZWN0aW9uVW5pZm9ybSxcblx0UmVmbGVjdGlvblZhcnlpbmcsXG5cdFNoYWRlclN0YWdlU3RyLFxuXHRVbmlmb3JtU2VtYW50aWNzLFxuXHRWYXJUeXBlLFxufSBmcm9tICcuLi90eXBlcy90eXBlJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGdldHMgdGhlIGF0dHJpYnV0ZSwgdmFyeWluZywgYW5kIHVuaWZvcm0gaW5mb3JtYXRpb24gZnJvbSB0aGUgY29kZSBwcm9wZXJ0eSBvZiBhIHNoYWRlcml0eSBvYmplY3QuXG4gKiBUaGUgbWV0aG9kcyBvZiB0aGUgU2hhZGVyaXR5IGluc3RhbmNlIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIEJlZm9yZSBnZXR0aW5nIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlLCB2YXJ5aW5nLCBhbmQgdW5pZm9ybSwgeW91IG5lZWQgdG8gY2FsbCB0aGUgcmVmbGVjdCBtZXRob2Qgb2YgdGhpcyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmbGVjdGlvbiB7XG5cdHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGF0dHJpYnV0ZUFuZFZhcnlpbmdUeXBlUmVnRXhwXG5cdFx0PSAvW1xcdCBdKyhmbG9hdHxpbnR8dmVjMnx2ZWMzfHZlYzR8bWF0MnxtYXQzfG1hdDR8aXZlYzJ8aXZlYzN8aXZlYzQpW1xcdCBdKyhcXHcrKTsvO1xuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSB1bmlmb3JtVHlwZVJlZ0V4cFxuXHRcdD0gL1tcXHQgXSsoZmxvYXR8aW50fHZlYzJ8dmVjM3x2ZWM0fG1hdDJ8bWF0M3xtYXQ0fGl2ZWMyfGl2ZWMzfGl2ZWM0fHNhbXBsZXIyRHxzYW1wbGVyQ3ViZXxzYW1wbGVyM0QpW1xcdCBdKyhcXHcrKTsvO1xuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSBzZW1hbnRpY1JlZ0V4cCA9IC88LipzZW1hbnRpY1tcXHQgXSo9W1xcdCBdKihcXHcrKS4qPi87XG5cblx0cHJpdmF0ZSBfX2F0dHJpYnV0ZVNlbWFudGljc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdHByaXZhdGUgX191bmlmb3JtU2VtYW50aWNzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0cHJpdmF0ZSBfX2F0dHJpYnV0ZXM6IFJlZmxlY3Rpb25BdHRyaWJ1dGVbXSA9IFtdO1xuXHRwcml2YXRlIF9fdmFyeWluZ3M6IFJlZmxlY3Rpb25WYXJ5aW5nW10gPSBbXTtcblx0cHJpdmF0ZSBfX3VuaWZvcm1zOiBSZWZsZWN0aW9uVW5pZm9ybVtdID0gW107XG5cblx0cHJpdmF0ZSByZWFkb25seSBfX3NwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX19zaGFkZXJTdGFnZTogU2hhZGVyU3RhZ2VTdHI7XG5cblx0Y29uc3RydWN0b3Ioc3BsaXR0ZWRTaGFkZXJpdHlTaGFkZXJDb2RlOiBzdHJpbmdbXSwgc2hhZGVyU3RhZ2U6IFNoYWRlclN0YWdlU3RyKSB7XG5cdFx0dGhpcy5fX3NwbGl0dGVkU2hhZGVyQ29kZSA9IHNwbGl0dGVkU2hhZGVyaXR5U2hhZGVyQ29kZTtcblx0XHR0aGlzLl9fc2hhZGVyU3RhZ2UgPSBzaGFkZXJTdGFnZTtcblx0XHR0aGlzLl9fc2V0RGVmYXVsdEF0dHJpYnV0ZUFuZFVuaWZvcm1TZW1hbnRpY3NNYXAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFsbCBhdHRyaWJ1dGUgdmFyaWFibGUgaW5mb3JtYXRpb24gaW4gdGhlIHNoYWRlciBjb2RlLlxuXHQgKiBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgeW91IG5lZWQgdG8gY2FsbCB0aGUgcmVmbGVjdCBtZXRob2Qgb2YgdGhpcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgQXJyYXkgb2YgUmVmbGVjdGlvbkF0dHJpYnV0ZSBvYmplY3Rcblx0ICovXG5cdHB1YmxpYyBnZXQgYXR0cmlidXRlcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBhbGwgdmFyeWluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2hhZGVyIGNvZGUuXG5cdCAqIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCB5b3UgbmVlZCB0byBjYWxsIHRoZSByZWZsZWN0IG1ldGhvZCBvZiB0aGlzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBSZWZsZWN0aW9uVmFyeWluZyBvYmplY3Rcblx0ICovXG5cdHB1YmxpYyBnZXQgdmFyeWluZ3MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX192YXJ5aW5ncztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFsbCB1bmlmb3JtIHZhcmlhYmxlIGluZm9ybWF0aW9uIGluIHRoZSBzaGFkZXIgY29kZS5cblx0ICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIFJlZmxlY3Rpb25Vbmlmb3JtIG9iamVjdFxuXHQgKi9cblx0cHVibGljIGdldCB1bmlmb3JtcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fX3VuaWZvcm1zO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbmFtZXMgb2YgYWxsIGF0dHJpYnV0ZXMgaW5jbHVkZWQgaW4gdGhlIHNoYWRlci5cblx0ICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHN0cmluZ1xuXHQgKi9cblx0cHVibGljIGdldCBhdHRyaWJ1dGVzTmFtZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX19hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiB7cmV0dXJuIGF0dHJpYnV0ZS5uYW1lfSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBhdHRyaWJ1dGUgc2VtYW50aWMgKGUuZy4gJ1BPU0lUSU9OJykgb2YgYWxsIGF0dHJpYnV0ZXMgaW5jbHVkZWQgaW4gdGhlIHNoYWRlci5cblx0ICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIEF0dHJpYnV0ZVNlbWFudGljcyBvYmplY3Rcblx0ICovXG5cdHB1YmxpYyBnZXQgYXR0cmlidXRlc1NlbWFudGljcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IHtyZXR1cm4gYXR0cmlidXRlLnNlbWFudGljfSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB2YXJpYWJsZSB0eXBlIChlLmcuICd2ZWM0Jykgb2YgYWxsIGF0dHJpYnV0ZXMgaW5jbHVkZWQgaW4gdGhlIHNoYWRlci5cblx0ICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIFZhclR5cGUgb2JqZWN0XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGF0dHJpYnV0ZXNUeXBlcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IHtyZXR1cm4gYXR0cmlidXRlLnR5cGV9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gYXR0cmlidXRlU2VtYW50aWNzLlxuXHQgKiBUaGUgYXR0cmlidXRlU2VtYW50aWNzIGlzIHVzZWQgaW4gdGhlIFJlZmxlY3Rpb25BdHRyaWJ1dGUuc2VtYW50aWNzXG5cdCAqIChTZWUgcmVmbGVjdCBtZXRob2Qgb2YgdGhpcyBjbGFzcylcblx0ICovXG5cdHB1YmxpYyBhZGRBdHRyaWJ1dGVTZW1hbnRpY3NNYXAobWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG5cdFx0dGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcCA9IG5ldyBNYXAoWy4uLnRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAsIC4uLm1hcF0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHVuaWZvcm1TZW1hbnRpY3MuXG5cdCAqIFRoZSBhdHRyaWJ1dGVTZW1hbnRpY3MgaXMgdXNlZCBpbiB0aGUgUmVmbGVjdGlvbkF0dHJpYnV0ZS5zZW1hbnRpY3Ncblx0ICogKFNlZSByZWZsZWN0IG1ldGhvZCBvZiB0aGlzIGNsYXNzKVxuXHQgKi9cblx0cHVibGljIGFkZFVuaWZvcm1TZW1hbnRpY3NNYXAobWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG5cdFx0dGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAgPSBuZXcgTWFwKFsuLi50aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcCwgLi4ubWFwXSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFuIGF0dHJpYnV0ZVNlbWFudGljcy5cblx0ICogVGhlIGF0dHJpYnV0ZVNlbWFudGljcyBpcyB1c2VkIGluIHRoZSBSZWZsZWN0aW9uQXR0cmlidXRlLnNlbWFudGljc1xuXHQgKiAoU2VlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgY2xhc3MpXG5cdCAqL1xuXHRwdWJsaWMgYWRkQXR0cmlidXRlU2VtYW50aWNzKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcC5zZXQoa2V5LCB2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdW5pZm9ybVNlbWFudGljcy5cblx0ICogVGhlIGF0dHJpYnV0ZVNlbWFudGljcyBpcyB1c2VkIGluIHRoZSBSZWZsZWN0aW9uQXR0cmlidXRlLnNlbWFudGljc1xuXHQgKiAoU2VlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgY2xhc3MpXG5cdCAqL1xuXHRwdWJsaWMgYWRkVW5pZm9ybVNlbWFudGljcyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMuX191bmlmb3JtU2VtYW50aWNzTWFwLnNldChrZXksIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIGF0dHJpYnV0ZVNlbWFudGljc1xuXHQgKi9cblx0cHVibGljIHJlc2V0QXR0cmlidXRlU2VtYW50aWNzKCkge1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgdW5pZm9ybVNlbWFudGljc1xuXHQgKi9cblx0cHVibGljIHJlc2V0VW5pZm9ybVNlbWFudGljcygpIHtcblx0XHR0aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdH1cblxuXHQvKipcblx0ICogQW5hbHl6ZSBzaGFkZXIgY29kZSBvZiB0aGUgc2hhZGVyaXR5IGFuZCBnZXQgaW5mb3JtYXRpb24gb2YgYXR0cmlidXRlLCB2YXJ5aW5nIGFuZCB1bmlmb3JtLlxuXHQgKiBUaGUgaW5mb3JtYXRpb24gY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBnZXQgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIFRoZSBzZW1hbnRpYyBwcm9wZXJ0eSBvZiB0aGUgUmVmbGVjdGlvbkF0dHJpYnV0ZSBpcyBhc3NpZ25lZCB0byB0aGUgdmFsdWUgb2YgdGhlIHNlbWFudGljIGlmXG5cdCAqIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGxpbmUgb2YgdGhlIHNoYWRlciBjb2RlLiBJZiBub3QsIHRoZSBBdHRyaWJ1dGVTZW1hbnRpY3NNYXBcblx0ICogaXMgc2VhcmNoZWQgZm9yIG1hdGNoaW5nIHNlbWFudGljcywgb3IgVU5LTk9XTi4gVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgc2VtYW50aWMgcHJvcGVydHkgb2Zcblx0ICogUmVmbGVjdGlvblVuaWZvcm0uXG5cdCAqL1xuXHRwdWJsaWMgcmVmbGVjdCgpIHtcblx0XHRjb25zdCBzcGxpdHRlZFNoYWRlckNvZGUgPSB0aGlzLl9fc3BsaXR0ZWRTaGFkZXJDb2RlO1xuXHRcdGNvbnN0IHNoYWRlclN0YWdlID0gdGhpcy5fX3NoYWRlclN0YWdlO1xuXG5cdFx0Zm9yIChjb25zdCBzaGFkZXJDb2RlTGluZSBvZiBzcGxpdHRlZFNoYWRlckNvZGUpIHtcblx0XHRcdGNvbnN0IGlzQXR0cmlidXRlTGluZSA9IHRoaXMuX19tYXRjaEF0dHJpYnV0ZShzaGFkZXJDb2RlTGluZSwgc2hhZGVyU3RhZ2UpO1xuXHRcdFx0aWYgKGlzQXR0cmlidXRlTGluZSkge1xuXHRcdFx0XHR0aGlzLl9fYWRkQXR0cmlidXRlKHNoYWRlckNvZGVMaW5lKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGlzVmFyeWluZ0xpbmUgPSB0aGlzLl9fbWF0Y2hWYXJ5aW5nKHNoYWRlckNvZGVMaW5lLCBzaGFkZXJTdGFnZSk7XG5cdFx0XHRpZiAoaXNWYXJ5aW5nTGluZSkge1xuXHRcdFx0XHR0aGlzLl9fYWRkVmFyeWluZyhzaGFkZXJDb2RlTGluZSwgc2hhZGVyU3RhZ2UpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaXNVbmlmb3JtTGluZSA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKC9eKD8hW1xcL10pW1xcdCBdKnVuaWZvcm1bXFx0IF0rLyk7XG5cdFx0XHRpZiAoaXNVbmlmb3JtTGluZSkge1xuXHRcdFx0XHR0aGlzLl9fYWRkVW5pZm9ybShzaGFkZXJDb2RlTGluZSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX19zZXREZWZhdWx0QXR0cmlidXRlQW5kVW5pZm9ybVNlbWFudGljc01hcCgpIHtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgncG9zaXRpb24nLCAnUE9TSVRJT04nKTtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnY29sb3IkJywgJ0NPTE9SXzAnKTtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnY29sb3JfPzAnLCAnQ09MT1JfMCcpO1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCd0ZXhjb29yZCQnLCAnVEVYQ09PUkRfMCcpO1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCd0ZXhjb29yZF8/MCcsICdURVhDT09SRF8wJyk7XG5cdFx0dGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcC5zZXQoJ3RleGNvb3JkXz8xJywgJ1RFWENPT1JEXzEnKTtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgndGV4Y29vcmRfPzInLCAnVEVYQ09PUkRfMicpO1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdub3JtYWwnLCAnTk9STUFMJyk7XG5cdFx0dGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcC5zZXQoJ3RhbmdlbnQnLCAnVEFOR0VOVCcpO1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdqb2ludCQnLCAnSk9JTlRTXzAnKTtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnYm9uZSQnLCAnSk9JTlRTXzAnKTtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnam9pbnRfPzAnLCAnSk9JTlRTXzAnKTtcblx0XHR0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnYm9uZV8/MCcsICdKT0lOVFNfMCcpO1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCd3ZWlnaHQkJywgJ1dFSUdIVFNfMCcpO1xuXHRcdHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCd3ZWlnaHRfPzAnLCAnV0VJR0hUU18wJyk7XG5cblx0XHR0aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcC5zZXQoJ3dvcmxkbWF0cml4JywgJ1dvcmxkTWF0cml4Jyk7XG5cdFx0dGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAuc2V0KCdub3JtYWxtYXRyaXgnLCAnTm9ybWFsTWF0cml4Jyk7XG5cdFx0dGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAuc2V0KCd2aWV3bWF0cml4JywgJ1ZpZXdNYXRyaXgnKTtcblx0XHR0aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcC5zZXQoJ3Byb2plY3Rpb25tYXRyaXgnLCAnUHJvamVjdGlvbk1hdHJpeCcpO1xuXHRcdHRoaXMuX191bmlmb3JtU2VtYW50aWNzTWFwLnNldCgnbW9kZWx2aWV3bWF0cml4JywgJ01vZGVsVmlld01hdHJpeCcpO1xuXHR9XG5cblx0cHJpdmF0ZSBfX21hdGNoQXR0cmlidXRlKHNoYWRlckNvZGVMaW5lOiBzdHJpbmcsIHNoYWRlclN0YWdlOiBTaGFkZXJTdGFnZVN0cikge1xuXHRcdGlmIChzaGFkZXJTdGFnZSAhPT0gJ3ZlcnRleCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRlckNvZGVMaW5lLm1hdGNoKC9eKD8hW1xcL10pW1xcdCBdKihhdHRyaWJ1dGV8aW4pW1xcdCBdKy4rOy8pO1xuXHR9XG5cblx0cHJpdmF0ZSBfX2FkZEF0dHJpYnV0ZShzaGFkZXJDb2RlTGluZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcmVmbGVjdGlvbkF0dHJpYnV0ZTogUmVmbGVjdGlvbkF0dHJpYnV0ZSA9IHtcblx0XHRcdG5hbWU6ICcnLFxuXHRcdFx0dHlwZTogJ2Zsb2F0Jyxcblx0XHRcdHNlbWFudGljOiAnVU5LTk9XTidcblx0XHR9O1xuXG5cdFx0Y29uc3QgbWF0Y2hUeXBlID0gc2hhZGVyQ29kZUxpbmUubWF0Y2goUmVmbGVjdGlvbi5hdHRyaWJ1dGVBbmRWYXJ5aW5nVHlwZVJlZ0V4cCk7XG5cdFx0aWYgKG1hdGNoVHlwZSkge1xuXHRcdFx0Y29uc3QgdHlwZSA9IG1hdGNoVHlwZVsxXTtcblx0XHRcdHJlZmxlY3Rpb25BdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgVmFyVHlwZTtcblx0XHRcdGNvbnN0IG5hbWUgPSBtYXRjaFR5cGVbMl07XG5cdFx0XHRyZWZsZWN0aW9uQXR0cmlidXRlLm5hbWUgPSBuYW1lO1xuXG5cdFx0XHRjb25zdCBtYXRjaFNlbWFudGljID0gc2hhZGVyQ29kZUxpbmUubWF0Y2goUmVmbGVjdGlvbi5zZW1hbnRpY1JlZ0V4cClcblx0XHRcdGlmIChtYXRjaFNlbWFudGljKSB7XG5cdFx0XHRcdHJlZmxlY3Rpb25BdHRyaWJ1dGUuc2VtYW50aWMgPSBtYXRjaFNlbWFudGljWzFdIGFzIEF0dHJpYnV0ZVNlbWFudGljcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwKSB7XG5cdFx0XHRcdFx0aWYgKG5hbWUubWF0Y2gobmV3IFJlZ0V4cChrZXksICdpJykpKSB7XG5cdFx0XHRcdFx0XHRyZWZsZWN0aW9uQXR0cmlidXRlLnNlbWFudGljID0gdmFsdWUgYXMgQXR0cmlidXRlU2VtYW50aWNzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLl9fYXR0cmlidXRlcy5wdXNoKHJlZmxlY3Rpb25BdHRyaWJ1dGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBfX21hdGNoVmFyeWluZyhzaGFkZXJDb2RlTGluZTogc3RyaW5nLCBzaGFkZXJTdGFnZTogU2hhZGVyU3RhZ2VTdHIpIHtcblx0XHRpZiAoc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnKSB7XG5cdFx0XHRyZXR1cm4gc2hhZGVyQ29kZUxpbmUubWF0Y2goL14oPyFbXFwvXSlbXFx0IF0qKHZhcnlpbmd8b3V0KVtcXHQgXSsuKzsvKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNoYWRlckNvZGVMaW5lLm1hdGNoKC9eKD8hW1xcL10pW1xcdCBdKih2YXJ5aW5nfGluKVtcXHQgXSsuKzsvKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9fYWRkVmFyeWluZyhzaGFkZXJDb2RlTGluZTogc3RyaW5nLCBzaGFkZXJTdGFnZTogU2hhZGVyU3RhZ2VTdHIpIHtcblx0XHRjb25zdCByZWZsZWN0aW9uVmFyeWluZzogUmVmbGVjdGlvblZhcnlpbmcgPSB7XG5cdFx0XHRuYW1lOiAnJyxcblx0XHRcdHR5cGU6ICdmbG9hdCcsXG5cdFx0XHRpbm91dDogJ2luJ1xuXHRcdH07XG5cblx0XHRjb25zdCBtYXRjaFR5cGUgPSBzaGFkZXJDb2RlTGluZS5tYXRjaChSZWZsZWN0aW9uLmF0dHJpYnV0ZUFuZFZhcnlpbmdUeXBlUmVnRXhwKTtcblx0XHRpZiAobWF0Y2hUeXBlKSB7XG5cdFx0XHRjb25zdCB0eXBlID0gbWF0Y2hUeXBlWzFdO1xuXHRcdFx0cmVmbGVjdGlvblZhcnlpbmcudHlwZSA9IHR5cGUgYXMgVmFyVHlwZTtcblx0XHRcdGNvbnN0IG5hbWUgPSBtYXRjaFR5cGVbMl07XG5cdFx0XHRyZWZsZWN0aW9uVmFyeWluZy5uYW1lID0gbmFtZTtcblx0XHRcdHJlZmxlY3Rpb25WYXJ5aW5nLmlub3V0ID0gKHNoYWRlclN0YWdlID09PSAndmVydGV4JykgPyAnb3V0JyA6ICdpbic7XG5cdFx0fVxuXHRcdHRoaXMuX192YXJ5aW5ncy5wdXNoKHJlZmxlY3Rpb25WYXJ5aW5nKTtcblx0fVxuXG5cdHByaXZhdGUgX19hZGRVbmlmb3JtKHNoYWRlckNvZGVMaW5lOiBzdHJpbmcpIHtcblx0XHRjb25zdCByZWZsZWN0aW9uVW5pZm9ybTogUmVmbGVjdGlvblVuaWZvcm0gPSB7XG5cdFx0XHRuYW1lOiAnJyxcblx0XHRcdHR5cGU6ICdmbG9hdCcsXG5cdFx0XHRzZW1hbnRpYzogJ1VOS05PV04nXG5cdFx0fTtcblxuXHRcdGNvbnN0IG1hdGNoVHlwZSA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKFJlZmxlY3Rpb24udW5pZm9ybVR5cGVSZWdFeHApO1xuXHRcdGlmIChtYXRjaFR5cGUpIHtcblx0XHRcdGNvbnN0IHR5cGUgPSBtYXRjaFR5cGVbMV07XG5cdFx0XHRyZWZsZWN0aW9uVW5pZm9ybS50eXBlID0gdHlwZSBhcyBWYXJUeXBlO1xuXHRcdFx0Y29uc3QgbmFtZSA9IG1hdGNoVHlwZVsyXTtcblx0XHRcdHJlZmxlY3Rpb25Vbmlmb3JtLm5hbWUgPSBuYW1lO1xuXG5cdFx0XHRjb25zdCBtYXRjaFNlbWFudGljcyA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKFJlZmxlY3Rpb24uc2VtYW50aWNSZWdFeHApXG5cdFx0XHRpZiAobWF0Y2hTZW1hbnRpY3MpIHtcblx0XHRcdFx0cmVmbGVjdGlvblVuaWZvcm0uc2VtYW50aWMgPSBtYXRjaFNlbWFudGljc1sxXSBhcyBVbmlmb3JtU2VtYW50aWNzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuX191bmlmb3JtU2VtYW50aWNzTWFwKSB7XG5cdFx0XHRcdFx0aWYgKG5hbWUubWF0Y2gobmV3IFJlZ0V4cChrZXksICdpJykpKSB7XG5cdFx0XHRcdFx0XHRyZWZsZWN0aW9uVW5pZm9ybS5zZW1hbnRpYyA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLl9fdW5pZm9ybXMucHVzaChyZWZsZWN0aW9uVW5pZm9ybSk7XG5cdH1cbn07IiwiaW1wb3J0IHtUZW1wbGF0ZU9iamVjdH0gZnJvbSAnLi4vdHlwZXMvdHlwZSc7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBlZGl0cyB0aGUgY29kZSBwcm9wZXJ0eSBvZiBhIHNoYWRlcml0eSBvYmplY3QuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlckVkaXRvciB7XG5cdHN0YXRpYyBfaW5zZXJ0RGVmaW5pdGlvbihzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdLCBkZWZpbml0aW9uOiBzdHJpbmcpIHtcblx0XHRjb25zdCBkZWZTdHIgPSBkZWZpbml0aW9uLnJlcGxhY2UoLyNkZWZpbmVbXFx0IF0rLywgJycpO1xuXG5cdFx0c3BsaXR0ZWRTaGFkZXJDb2RlLnVuc2hpZnQoYCNkZWZpbmUgJHtkZWZTdHJ9YCk7XG5cdH1cblxuXHRzdGF0aWMgX2ZpbGxUZW1wbGF0ZShzaGFkZXJDb2RlOiBzdHJpbmcsIHRlbXBsYXRlT2JqZWN0OiBUZW1wbGF0ZU9iamVjdCkge1xuXHRcdGNvbnN0IHRlbXBsYXRlU3RyaW5nID0gc2hhZGVyQ29kZS5yZXBsYWNlKC9cXC9cXCpbXFx0IF0qc2hhZGVyaXR5OltcXHQgXSooQHtbXFx0IF0qKShcXFMrKShbXFx0IF0qfSlbXFx0IF0qXFwqXFwvL2csICcke3RoaXMuJDJ9Jyk7XG5cblx0XHRjb25zdCByZXN1bHRDb2RlID0gbmV3IEZ1bmN0aW9uKFwicmV0dXJuIGBcIiArIHRlbXBsYXRlU3RyaW5nICsgXCJgO1wiKS5jYWxsKHRlbXBsYXRlT2JqZWN0KTtcblx0XHRyZXR1cm4gcmVzdWx0Q29kZTtcblx0fVxufSIsImltcG9ydCB7U2hhZGVyVmVyc2lvbn0gZnJvbSAnLi4vdHlwZXMvdHlwZSc7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyB0aGUgY29kZSBwcm9wZXJ0eSBvZiBhIHNoYWRlcml0eSBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlclRyYW5zZm9ybWVyIHtcblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIFRyYW5zbGF0ZSBhIEdMU0wgRVMzIHNoYWRlciBjb2RlIHRvIGEgR0xTTCBFUzEgc2hhZGVyIGNvZGVcblx0ICovXG5cdHN0YXRpYyBfdHJhbnNmb3JtVG9HTFNMRVMxKFxuXHRcdHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10sXG5cdFx0aXNGcmFnbWVudFNoYWRlcjogYm9vbGVhbixcblx0XHRlbWJlZEVycm9yc0luT3V0cHV0OiBib29sZWFuXG5cdCkge1xuXHRcdHRoaXMuX19jb252ZXJ0T3JJbnNlcnRWZXJzaW9uR0xTTEVTMShzcGxpdHRlZFNoYWRlckNvZGUpO1xuXHRcdHRoaXMuX19yZW1vdmVFUzNRdWFsaWZpZXIoc3BsaXR0ZWRTaGFkZXJDb2RlLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcblx0XHR0aGlzLl9fY29udmVydEluKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlcik7XG5cdFx0dGhpcy5fX2NvbnZlcnRPdXQoc3BsaXR0ZWRTaGFkZXJDb2RlLCBpc0ZyYWdtZW50U2hhZGVyLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcblx0XHR0aGlzLl9fcmVtb3ZlUHJlY2lzaW9uRm9yRVMzKHNwbGl0dGVkU2hhZGVyQ29kZSk7XG5cdFx0dGhpcy5fX2NvbnZlcnRUZXh0dXJlRnVuY3Rpb25Ub0VTMShzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdGNvbnN0IHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlID0gc3BsaXR0ZWRTaGFkZXJDb2RlO1xuXG5cdFx0cmV0dXJuIHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIFRyYW5zbGF0ZSBhIEdMU0wgRVMxIHNoYWRlciBjb2RlIHRvIGEgR0xTTCBFUzMgc2hhZGVyIGNvZGVcblx0ICovXG5cdHN0YXRpYyBfdHJhbnNmb3JtVG9HTFNMRVMzKHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10sIGlzRnJhZ21lbnRTaGFkZXI6IGJvb2xlYW4pIHtcblx0XHR0aGlzLl9fY29udmVydE9ySW5zZXJ0VmVyc2lvbkdMU0xFUzMoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcblx0XHR0aGlzLl9fY29udmVydEF0dHJpYnV0ZShzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIpO1xuXHRcdHRoaXMuX19jb252ZXJ0VmFyeWluZyhzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIpO1xuXHRcdHRoaXMuX19jb252ZXJ0VGV4dHVyZUN1YmUoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcblx0XHR0aGlzLl9fY29udmVydFRleHR1cmUyRChzcGxpdHRlZFNoYWRlckNvZGUpO1xuXHRcdHRoaXMuX19jb252ZXJ0VGV4dHVyZTJEUHJvZChzcGxpdHRlZFNoYWRlckNvZGUpO1xuXHRcdHRoaXMuX19jb252ZXJ0VGV4dHVyZTNEKHNwbGl0dGVkU2hhZGVyQ29kZSk7XG5cdFx0dGhpcy5fX2NvbnZlcnRUZXh0dXJlM0RQcm9kKHNwbGl0dGVkU2hhZGVyQ29kZSk7XG5cdFx0Y29uc3QgdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGUgPSBzcGxpdHRlZFNoYWRlckNvZGU7XG5cblx0XHRyZXR1cm4gdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGU7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogVHJhbnNsYXRlIGEgR0xTTCBzaGFkZXIgY29kZSB0byBhIHNoYWRlciBjb2RlIG9mIHNwZWNpZmllZCBHTFNMIHZlcnNpb25cblx0ICovXG5cdHN0YXRpYyBfdHJhbnNmb3JtVG8oXG5cdFx0dmVyc2lvbjogU2hhZGVyVmVyc2lvbixcblx0XHRzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdLFxuXHRcdGlzRnJhZ21lbnRTaGFkZXI6IGJvb2xlYW4sXG5cdFx0ZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhblxuXHQpIHtcblx0XHRpZiAodmVyc2lvbi5tYXRjaCgvd2ViZ2wyfGVzMy9pKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVRvR0xTTEVTMyhzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIpO1xuXHRcdH0gZWxzZSBpZiAodmVyc2lvbi5tYXRjaCgvd2ViZ2wxfGVzMS9pKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVRvR0xTTEVTMShzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdJbnZhbGlkIFZlcnNpb24nKVxuXHRcdFx0cmV0dXJuIHNwbGl0dGVkU2hhZGVyQ29kZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogSWYgdGhlIGZpcnN0IGxpbmUgY29udGFpbnMgdmVyc2lvbiBpbmZvcm1hdGlvbiwgb3ZlcndyaXRlIHRoZSBmaXJzdCBsaW5lIHdpdGggJyN2ZXJzaW9uIDEwMCcuXG5cdCAqIElmIG5vdCwgYWRkICcjdmVyc2lvbiAxMDAnIHRvIHRoZSBmaXJzdCBsaW5lLlxuXHQgKlxuXHQgKiBOb3RlOiBJZiB0aGUgZmlyc3QgbGluZSBpcyBjb21tZW50ZWQgb3V0IGFuZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIGluIHRoZSBzZWNvbmQgb3IgbGF0ZXIgbGluZSxcblx0ICogdGhlIGFwcHJvcHJpYXRlIHZlcnNpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZmlyc3QgbGluZSBhbmQgdGhlIHVzZXItZGVmaW5lZCB2ZXJzaW9uIGluZm9ybWF0aW9uXG5cdCAqIGluIHRoZSBzZWNvbmQgb3IgbGF0ZXIgbGluZSB3aWxsIGJlIHJlbW92ZWQuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBfX2NvbnZlcnRPckluc2VydFZlcnNpb25HTFNMRVMxKHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10pIHtcblx0XHRjb25zdCByZWcgPSAvXig/IVtcXC9dKVtcXHQgXSojW1xcdCBdKnZlcnNpb25bXFx0IF0rLiovO1xuXHRcdHRoaXMuX19yZW1vdmVGaXJzdE1hdGNoaW5nTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZyk7XG5cblx0XHRzcGxpdHRlZFNoYWRlckNvZGUudW5zaGlmdCgnI3ZlcnNpb24gMTAwJyk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogSWYgdGhlIGZpcnN0IGxpbmUgY29udGFpbnMgdmVyc2lvbiBpbmZvcm1hdGlvbiwgb3ZlcndyaXRlIHRoZSBmaXJzdCBsaW5lIHdpdGggJyN2ZXJzaW9uIDMwMCBlcycuXG5cdCAqIElmIG5vdCwgYWRkICcjdmVyc2lvbiAzMDAgZXMnIHRvIHRoZSBmaXJzdCBsaW5lLlxuXHQgKiBJbiBib3RoIGNhc2VzLCAnI2RlZmluZSBHTFNMX0VTMycgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgc2Vjb25kIGxpbmUuXG5cdCAqIFVzZSB0aGUgJyNkZWZpbmUgR0xTTF9FUzMnIGRpcmVjdGl2ZSBpZiB5b3Ugd2FudCB0byB3cml0ZSBhIHNoYWRlciBjb2RlIHRoYXQgd2lsbCBvbmx5IHJ1biBpbiB0aGUgY2FzZSBvZiB3ZWJnbDIuXG5cdCAqXG5cdCAqIE5vdGU6IElmIHRoZSBmaXJzdCBsaW5lIGlzIGNvbW1lbnRlZCBvdXQgYW5kIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gaW4gdGhlIHNlY29uZCBvciBsYXRlciBsaW5lLFxuXHQgKiB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgdXNlci1kZWZpbmVkIHZlcnNpb24gaW5mb3JtYXRpb25cblx0ICogaW4gdGhlIHNlY29uZCBvciBsYXRlciBsaW5lIHdpbGwgYmUgcmVtb3ZlZC5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY29udmVydE9ySW5zZXJ0VmVyc2lvbkdMU0xFUzMoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSkge1xuXHRcdGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKiNbXFx0IF0qdmVyc2lvbltcXHQgXSsuKi87XG5cdFx0dGhpcy5fX3JlbW92ZUZpcnN0TWF0Y2hpbmdMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnKTtcblxuXHRcdHNwbGl0dGVkU2hhZGVyQ29kZS51bnNoaWZ0KCcjZGVmaW5lIEdMU0xfRVMzJyk7XG5cdFx0c3BsaXR0ZWRTaGFkZXJDb2RlLnVuc2hpZnQoJyN2ZXJzaW9uIDMwMCBlcycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEZpbmQgdGhlICdpbicgcXVhbGlmaWVyIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMSBxdWFsaWZpZXIoJ2F0dHJpYnV0ZScgb3IgJ3ZhcnlpbmcnKVxuXHQgKiBUaGlzIG1ldGhvZCBkaXJlY3RseSByZXBsYWNlIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BsaXR0ZWRTaGFkZXJDb2RlIHZhcmlhYmxlLlxuXHQgKi9cblx0cHJpdmF0ZSBzdGF0aWMgX19jb252ZXJ0SW4oc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgaXNGcmFnbWVudFNoYWRlcjogYm9vbGVhbikge1xuXHRcdGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKmluW1xcdCBdKygoaGlnaHB8bWVkaXVtcHxsb3dwfClbXFx0IF0qXFx3K1tcXHQgXSpcXHcrW1xcdCBdKjspLztcblxuXHRcdGxldCByZXBsYWNlRnVuYztcblx0XHRpZiAoaXNGcmFnbWVudFNoYWRlcikge1xuXHRcdFx0cmVwbGFjZUZ1bmMgPSBmdW5jdGlvbiAobWF0Y2g6IHN0cmluZywgcDE6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gJ3ZhcnlpbmcgJyArIHAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXBsYWNlRnVuYyA9IGZ1bmN0aW9uIChtYXRjaDogc3RyaW5nLCBwMTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAnYXR0cmlidXRlICcgKyBwMTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsIHJlcGxhY2VGdW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSBcIm91dFwiIHF1YWxpZmllciBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIG1vZGlmeSB0aGUgc2hhZGVyIGNvZGUuXG5cdCAqIElmIHRoZSBzaGFkZXIgc3RhZ2UgaXMgdmVydGV4LCB0aGUgXCJvdXRcIiBxdWFsaWZpZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgXCJ2YXJ5aW5nXCIgcXVhbGlmaWVyLlxuXHQgKiBJZiB0aGUgc2hhZGVyIHN0YWdlIGlzIGZyYWdtZW50IGFuZCB0aGUgc2hhZGVyIGhhcyBcIm91dFwiIHF1YWxpZmllcnMsIHRoZSBcIm91dFwiIHF1YWxpZmllcnMgd2lsbFxuXHQgKiBiZSBkZWxldGVkIGFuZCB0aGUgdmFyaWFibGUgaXMgdXNlZCB0byBhc3NpZ24gYSB2YWx1ZSB0byBnbF9GcmFnQ29sb3IuXG5cdCAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBfX2NvbnZlcnRPdXQoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgaXNGcmFnbWVudFNoYWRlcjogYm9vbGVhbiwgZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhbikge1xuXHRcdGlmIChpc0ZyYWdtZW50U2hhZGVyKSB7XG5cdFx0XHRjb25zdCB2YXJpYWJsZU5hbWUgPSB0aGlzLl9fcmVtb3ZlT3V0UXVhbGlmaWVyKHNwbGl0dGVkU2hhZGVyQ29kZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG5cdFx0XHRpZiAodmFyaWFibGVOYW1lID09IG51bGwpIHtcblx0XHRcdFx0Ly8gbm8gb3V0IHF1YWxpZmllclxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX19hZGRHTEZyYWdDb2xvcih2YXJpYWJsZU5hbWUsIHNwbGl0dGVkU2hhZGVyQ29kZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKm91dFtcXHQgXSsoKGhpZ2hwfG1lZGl1bXB8bG93cHwpW1xcdCBdKlxcdytbXFx0IF0qXFx3K1tcXHQgXSo7KS87XG5cdFx0XHRjb25zdCByZXBsYWNlRnVuYyA9IGZ1bmN0aW9uIChtYXRjaDogc3RyaW5nLCBwMTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAndmFyeWluZyAnICsgcDE7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsIHJlcGxhY2VGdW5jKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogVGhpcyBtZXRob2QgaXMgYSBwYXJ0IG9mIF9fY29udmVydE91dCBtZXRob2QuXG5cdCAqIFRoaXMgbWV0aG9kIGRlbGV0ZXMgdGhlIFwib3V0XCIgcXVhbGlmaWVycyBhbmQgYWRkcyB0aGUgbGluZSBmb3IgYXNzaWduaW5nIHRvIGdsX0ZyYWdDb2xvci5cblx0ICogSWYgdGhlIHNoYWRlciBkb2VzIG5vdCBoYXZlIHRoZSBcIm91dFwiIHF1YWxpZmllcnMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cblx0ICovXG5cblx0cHJpdmF0ZSBzdGF0aWMgX19yZW1vdmVPdXRRdWFsaWZpZXIoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKm91dFtcXHQgXSsoKGhpZ2hwfG1lZGl1bXB8bG93cHwpW1xcdCBdKlxcdytbXFx0IF0qKFxcdyspW1xcdCBdKjspLztcblxuXHRcdGxldCB2YXJpYWJsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgbWF0Y2ggPSBzcGxpdHRlZFNoYWRlckNvZGVbaV0ubWF0Y2gocmVnKTtcblx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBtYXRjaFsxXTtcblx0XHRcdFx0dmFyaWFibGVOYW1lID0gbWF0Y2hbM107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YXJpYWJsZU5hbWU7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBfX2FkZEdMRnJhZ0NvbG9yKHZhcmlhYmxlTmFtZTogc3RyaW5nLCBzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdLCBlbWJlZEVycm9yc0luT3V0cHV0OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgY2xvc2VCcmFja2V0UmVnID0gLyguKilcXH1bXFxuXFx0IF0qJC87XG5cdFx0Y29uc3QgcmV0dXJuUmVnID0gL1tcXG5cXHQgXSpyZXR1cm5bXFxuXFx0IF0qOy87XG5cdFx0Y29uc3QgbWFpbkZ1bmNTdGFydFJlZyA9IC8oXnxeKD8hW1xcL10pW1xcdFxcbiBdKyl2b2lkW1xcdFxcbiBdK21haW4oW1xcdFxcbiBdfFxcKHwkKS87XG5cdFx0Y29uc3QgZnJhZ0NvbG9yQ29kZSA9IGAgIGdsX0ZyYWdDb2xvciA9ICR7dmFyaWFibGVOYW1lfTtgO1xuXG5cdFx0bGV0IHNldEdsRnJhZ0NvbG9ySW5MYXN0TGluZSA9IGZhbHNlO1xuXHRcdGZvciAobGV0IGkgPSBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdGNvbnN0IGxpbmUgPSBzcGxpdHRlZFNoYWRlckNvZGVbaV07XG5cdFx0XHRpZiAoIXNldEdsRnJhZ0NvbG9ySW5MYXN0TGluZSAmJiBsaW5lLm1hdGNoKGNsb3NlQnJhY2tldFJlZykpIHtcblx0XHRcdFx0Ly8gYWRkIGdsX0ZyYWdDb2xvciB0byBsYXN0IGxpbmUgb2YgbWFpbiBmdW5jdGlvblxuXHRcdFx0XHRzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBsaW5lLnJlcGxhY2UoY2xvc2VCcmFja2V0UmVnLCBgJDFcXG4ke2ZyYWdDb2xvckNvZGV9XFxufVxcbmApO1xuXHRcdFx0XHRzZXRHbEZyYWdDb2xvckluTGFzdExpbmUgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGluZS5tYXRjaChyZXR1cm5SZWcpKSB7XG5cdFx0XHRcdC8vIGFkZCBnbF9GcmFnQ29sb3IganVzdCBiZWZvcmUgcmV0dXJuXG5cdFx0XHRcdHNwbGl0dGVkU2hhZGVyQ29kZS5zcGxpY2UoaSwgMCwgZnJhZ0NvbG9yQ29kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaW5lLm1hdGNoKG1haW5GdW5jU3RhcnRSZWcpKSB7XG5cdFx0XHRcdC8vIGFkZCBnbF9GcmFnQ29sb3Igb25seSBpbiB0aGUgbWFpbiBmdW5jdGlvblxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXNldEdsRnJhZ0NvbG9ySW5MYXN0TGluZSkge1xuXHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gJ19fcmVtb3ZlT3V0UXVhbGlmaWVyOiBOb3QgZm91bmQgdGhlIGNsb3NpbmcgYnJhY2tldHMgZm9yIHRoZSBtYWluIGZ1bmN0aW9uJztcblx0XHRcdHRoaXMuX19vdXRFcnJvcihzcGxpdHRlZFNoYWRlckNvZGUsIHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGgsIGVycm9yTWVzc2FnZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEZpbmQgdGhlIHF1YWxpZmllciBmb3IgZXMzIG9ubHkgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZW1vdmUgaXRcblx0ICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fcmVtb3ZlRVMzUXVhbGlmaWVyKHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10sIGVtYmVkRXJyb3JzSW5PdXRwdXQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLl9fcmVtb3ZlVmFyeWluZ1F1YWxpZmllcihzcGxpdHRlZFNoYWRlckNvZGUsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdHRoaXMuX19yZW1vdmVMYXlvdXQoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSBcImZsYXRcIiBhbmQgXCJzbW9vdGhcIiBxdWFsaWZpZXIgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZW1vdmUgaXRcblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fcmVtb3ZlVmFyeWluZ1F1YWxpZmllcihzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdLCBlbWJlZEVycm9yc0luT3V0cHV0OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgcmVnID0gL14oPyFbXFwvXSlbXFx0IF0qKGZsYXR8c21vb3RoKVtcXHQgXSooKGlufG91dClbXFx0IF0rLiopLztcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAnX19yZW1vdmVWYXJ5aW5nUXVhbGlmaWVyOiBnbHNsIGVzMSBkb2VzIG5vdCBzdXBwb3J0IGZsYXQgcXVhbGlmaWVyJztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWRTaGFkZXJDb2RlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBzcGxpdHRlZFNoYWRlckNvZGVbaV0ucmVwbGFjZShyZWcsIChtYXRjaDogc3RyaW5nLCBwMTogc3RyaW5nLCBwMjogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwMSA9PT0gJ2ZsYXQnKSB7XG5cdFx0XHRcdFx0dGhpcy5fX291dEVycm9yKHNwbGl0dGVkU2hhZGVyQ29kZSwgaSArIDEsIGVycm9yTWVzc2FnZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwMjtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSBcImxheW91dFwiIHF1YWxpZmllciBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlbW92ZSBpdFxuXHQgKi9cblx0cHJpdmF0ZSBzdGF0aWMgX19yZW1vdmVMYXlvdXQoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSkge1xuXHRcdGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKmxheW91dFtcXHQgXSpcXChbXFx0IF0qbG9jYXRpb25bXFx0IF0qXFw9W1xcdCBdKlxcZFtcXHQgXSpcXClbXFx0IF0rL2c7XG5cdFx0dGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCAnJyk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogRmluZCB0aGUgXCJwcmVjaXNpb25cIiBxdWFsaWZpZXIgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZW1vdmUgaXQgaWYgdGhlIFwicHJlY2lzaW9uXCIgcXVhbGlmaWVyIGlzIHZhbGlkIGZvciBvbmx5IEdMU0wgRVMzXG5cdCAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBfX3JlbW92ZVByZWNpc2lvbkZvckVTMyhzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdKSB7XG5cdFx0Y29uc3QgcmVnID0gL14oPyFbXFwvXSlbXFx0IF0qcHJlY2lzaW9uW1xcdCBdKyhoaWdocHxtZWRpdW1wfGxvd3ApW1xcdCBdKyhcXHcrKVtcXHQgXSo7LztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWRTaGFkZXJDb2RlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXS5tYXRjaChyZWcpO1xuXHRcdFx0aWYgKG1hdGNoICE9IG51bGwpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG1hdGNoWzJdID09PSAnaW50JyB8fFxuXHRcdFx0XHRcdG1hdGNoWzJdID09PSAnZmxvYXQnIHx8XG5cdFx0XHRcdFx0bWF0Y2hbMl0gPT09ICdzYW1wbGVyMkQnIHx8XG5cdFx0XHRcdFx0bWF0Y2hbMl0gPT09ICdzYW1wbGVyQ3ViZSdcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gdGhlc2UgcHJlY2lzaW9ucyBhcmUgc3VwcG9ydGVkIGluIGVzMVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNwbGl0dGVkU2hhZGVyQ29kZS5zcGxpY2UoaS0tLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSBcInRleHR1cmVcIiBhbmQgXCJ0ZXh0dXJlUHJvalwiIG1ldGhvZCBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kXG5cdCAqIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzEgbWV0aG9kKCd0ZXh0dXJlMkQnLCAndGV4dHVyZTJEJywgYW5kIHNvIG9uKVxuXHQgKiBUaGlzIG1ldGhvZCBkaXJlY3RseSByZXBsYWNlIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BsaXR0ZWRTaGFkZXJDb2RlIHZhcmlhYmxlLlxuXHQgKi9cblx0cHJpdmF0ZSBzdGF0aWMgX19jb252ZXJ0VGV4dHVyZUZ1bmN0aW9uVG9FUzEoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgaXNGcmFnbWVudFNoYWRlcjogYm9vbGVhbiwgZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNibCA9IHRoaXMuX19yZWdTeW1ib2xzKCk7XG5cdFx0Y29uc3QgcmVnVGV4dHVyZVByb2ogPSBuZXcgUmVnRXhwKGAoJHtzYmx9Kyl0ZXh0dXJlUHJvaihMb2R8KSgke3NibH0rKWAsICdnJyk7XG5cdFx0Y29uc3QgcmVnVGV4dHVyZSA9IG5ldyBSZWdFeHAoYCgke3NibH0rKXRleHR1cmUoTG9kfCkoJHtzYmx9KylgLCAnZycpO1xuXG5cdFx0bGV0IGFyZ3VtZW50U2FtcGxlck1hcDogTWFwPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB1bmlmb3JtU2FtcGxlck1hcCA9IHRoaXMuX19jcmVhdGVVbmlmb3JtU2FtcGxlck1hcChzcGxpdHRlZFNoYWRlckNvZGUsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWRTaGFkZXJDb2RlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBsaW5lID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2ldO1xuXG5cdFx0XHRjb25zdCBtYXRjaFRleHR1cmVQcm9qID0gbGluZS5tYXRjaCgvdGV4dHVyZVByb2ooTG9kfClbXFx0IF0qXFwoW1xcdCBdKihcXHcrKSwvKTtcblx0XHRcdGlmIChtYXRjaFRleHR1cmVQcm9qKSB7XG5cdFx0XHRcdGFyZ3VtZW50U2FtcGxlck1hcCA9IGFyZ3VtZW50U2FtcGxlck1hcCA/PyB0aGlzLl9fY3JlYXRlQXJndW1lbnRTYW1wbGVyTWFwKFxuXHRcdFx0XHRcdHNwbGl0dGVkU2hhZGVyQ29kZSxcblx0XHRcdFx0XHRpLFxuXHRcdFx0XHRcdGVtYmVkRXJyb3JzSW5PdXRwdXRcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRjb25zdCBpc0xvZE1ldGhvZCA9IG1hdGNoVGV4dHVyZVByb2pbMV0gPT09ICdMb2QnO1xuXHRcdFx0XHRjb25zdCBleHRlbnNpb25TdHIgPSBpc0ZyYWdtZW50U2hhZGVyICYmIGlzTG9kTWV0aG9kID8gYEVYVGAgOiBgYDtcblx0XHRcdFx0Y29uc3QgdmFyaWFibGVOYW1lID0gbWF0Y2hUZXh0dXJlUHJvalsyXTtcblx0XHRcdFx0Y29uc3Qgc2FtcGxlclR5cGUgPSBhcmd1bWVudFNhbXBsZXJNYXA/LmdldCh2YXJpYWJsZU5hbWUpID8/IHVuaWZvcm1TYW1wbGVyTWFwLmdldCh2YXJpYWJsZU5hbWUpO1xuXHRcdFx0XHRpZiAoc2FtcGxlclR5cGUgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmIChzYW1wbGVyVHlwZSA9PT0gJ3NhbXBsZXIyRCcpIHtcblx0XHRcdFx0XHRcdHNwbGl0dGVkU2hhZGVyQ29kZVtpXSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXS5yZXBsYWNlKHJlZ1RleHR1cmVQcm9qLCBgJDF0ZXh0dXJlMkRQcm9qJDIke2V4dGVuc2lvblN0cn0kM2ApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAnX19jb252ZXJ0VGV4dHVyZUZ1bmN0aW9uVG9FUzE6IGRvIG5vdCBzdXBwb3J0ICcgKyBzYW1wbGVyVHlwZSArICcgdHlwZSc7XG5cdFx0XHRcdFx0XHR0aGlzLl9fb3V0RXJyb3Ioc3BsaXR0ZWRTaGFkZXJDb2RlLCBpLCBlcnJvck1lc3NhZ2UsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbWF0Y2hUZXh0dXJlID0gbGluZS5tYXRjaCgvdGV4dHVyZShMb2R8KVtcXHQgXSpcXChbXFx0IF0qKFxcdyspLC8pO1xuXHRcdFx0aWYgKG1hdGNoVGV4dHVyZSkge1xuXHRcdFx0XHRhcmd1bWVudFNhbXBsZXJNYXAgPSBhcmd1bWVudFNhbXBsZXJNYXAgPz8gdGhpcy5fX2NyZWF0ZUFyZ3VtZW50U2FtcGxlck1hcChcblx0XHRcdFx0XHRzcGxpdHRlZFNoYWRlckNvZGUsXG5cdFx0XHRcdFx0aSxcblx0XHRcdFx0XHRlbWJlZEVycm9yc0luT3V0cHV0XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29uc3QgaXNMb2RNZXRob2QgPSBtYXRjaFRleHR1cmVbMV0gPT09ICdMb2QnO1xuXHRcdFx0XHRjb25zdCBleHRlbnNpb25TdHIgPSBpc0ZyYWdtZW50U2hhZGVyICYmIGlzTG9kTWV0aG9kID8gYEVYVGAgOiBgYDtcblx0XHRcdFx0Y29uc3QgdmFyaWFibGVOYW1lID0gbWF0Y2hUZXh0dXJlWzJdO1xuXHRcdFx0XHRjb25zdCBzYW1wbGVyVHlwZSA9IGFyZ3VtZW50U2FtcGxlck1hcD8uZ2V0KHZhcmlhYmxlTmFtZSkgPz8gdW5pZm9ybVNhbXBsZXJNYXAuZ2V0KHZhcmlhYmxlTmFtZSk7XG5cdFx0XHRcdGlmIChzYW1wbGVyVHlwZSAhPSBudWxsKSB7XG5cdFx0XHRcdFx0bGV0IHRleHR1cmVGdW5jOiBzdHJpbmc7XG5cdFx0XHRcdFx0aWYgKHNhbXBsZXJUeXBlID09PSAnc2FtcGxlcjJEJykge1xuXHRcdFx0XHRcdFx0dGV4dHVyZUZ1bmMgPSAndGV4dHVyZTJEJztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNhbXBsZXJUeXBlID09PSAnc2FtcGxlckN1YmUnKSB7XG5cdFx0XHRcdFx0XHR0ZXh0dXJlRnVuYyA9ICd0ZXh0dXJlQ3ViZSc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRleHR1cmVGdW5jID0gJyc7XG5cdFx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAnX19jb252ZXJ0VGV4dHVyZUZ1bmN0aW9uVG9FUzE6IGRvIG5vdCBzdXBwb3J0ICcgKyBzYW1wbGVyVHlwZSArICcgdHlwZSc7XG5cdFx0XHRcdFx0XHR0aGlzLl9fb3V0RXJyb3Ioc3BsaXR0ZWRTaGFkZXJDb2RlLCBpLCBlcnJvck1lc3NhZ2UsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0ZXh0dXJlRnVuYyAhPT0gJycpIHtcblx0XHRcdFx0XHRcdHNwbGl0dGVkU2hhZGVyQ29kZVtpXSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXS5yZXBsYWNlKHJlZ1RleHR1cmUsIGAkMSR7dGV4dHVyZUZ1bmN9JDIke2V4dGVuc2lvblN0cn0kM2ApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaXNCbG9ja0VuZCA9ICEhbGluZS5tYXRjaCgvXFx9Lyk7XG5cdFx0XHRpZiAoaXNCbG9ja0VuZCkge1xuXHRcdFx0XHRhcmd1bWVudFNhbXBsZXJNYXAgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIFRoaXMgbWV0aG9kIGZpbmRzIHVuaWZvcm0gZGVjbGFyYXRpb25zIG9mIHNhbXBsZXIgdHlwZXMgaW4gdGhlIHNoYWRlciBhbmRcblx0ICogY3JlYXRlcyBhIG1hcCB3aXRoIHZhcmlhYmxlIG5hbWVzIGFzIGtleXMgYW5kIHR5cGVzIGFzIHZhbHVlcy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY3JlYXRlVW5pZm9ybVNhbXBsZXJNYXAoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IHVuaWZvcm1TYW1wbGVyTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGxpbmUgPSBzcGxpdHRlZFNoYWRlckNvZGVbaV07XG5cdFx0XHRjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oPyFbXFwvXSlbXFx0IF0qdW5pZm9ybSpbXFx0IF0qKGhpZ2hwfG1lZGl1bXB8bG93cHwpW1xcdCBdKihzYW1wbGVyXFx3KylbXFx0IF0rKFxcdyspLyk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0Y29uc3Qgc2FtcGxlclR5cGUgPSBtYXRjaFsyXTtcblx0XHRcdFx0Y29uc3QgbmFtZSA9IG1hdGNoWzNdO1xuXHRcdFx0XHRpZiAodW5pZm9ybVNhbXBsZXJNYXAuZ2V0KG5hbWUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gJ19fY3JlYXRlVW5pZm9ybVNhbXBsZXJNYXA6IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lJztcblx0XHRcdFx0XHR0aGlzLl9fb3V0RXJyb3Ioc3BsaXR0ZWRTaGFkZXJDb2RlLCBpLCBlcnJvck1lc3NhZ2UsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHVuaWZvcm1TYW1wbGVyTWFwLnNldChuYW1lLCBzYW1wbGVyVHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmlmb3JtU2FtcGxlck1hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBUaGlzIG1ldGhvZCBmaW5kcyBzYW1wbGVyIHR5cGVzIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmRcblx0ICogY3JlYXRlcyBhIG1hcCB3aXRoIHZhcmlhYmxlIG5hbWVzIGFzIGtleXMgYW5kIHR5cGVzIGFzIHZhbHVlcy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY3JlYXRlQXJndW1lbnRTYW1wbGVyTWFwKFxuXHRcdHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10sXG5cdFx0bGluZUluZGV4OiBudW1iZXIsXG5cdFx0ZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBhcmd1bWVudFNhbXBsZXJNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cblx0XHRmb3IgKGxldCBpID0gbGluZUluZGV4OyBpID49IDA7IGktLSkge1xuXHRcdFx0Y29uc3QgbGluZSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXTtcblxuXHRcdFx0Y29uc3QgaXNCbG9ja1N0YXJ0TGluZSA9ICEhbGluZS5tYXRjaCgvXFx7Lyk7XG5cdFx0XHRpZiAoIWlzQmxvY2tTdGFydExpbmUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJyYWNrZXRTZWN0aW9uQ29kZSA9IHRoaXMuX19nZXRCcmFja2V0U2VjdGlvbihzcGxpdHRlZFNoYWRlckNvZGUsIGkpO1xuXG5cdFx0XHRjb25zdCBpbm5lckJyYWNrZXRTZWN0aW9uQ29kZSA9IGJyYWNrZXRTZWN0aW9uQ29kZS5tYXRjaCgvLipcXCgoLiopXFwpLyk/LlsxXTtcblx0XHRcdGlmIChpbm5lckJyYWNrZXRTZWN0aW9uQ29kZSA9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdmFyaWFibGVDYW5kaWRhdGVzID0gaW5uZXJCcmFja2V0U2VjdGlvbkNvZGUuc3BsaXQoJywnKTtcblx0XHRcdGNvbnN0IHNhbXBsZXJUeXBlRGVmaW5pdGlvblJlZyA9IC9bXFxuXFx0IF0qKGhpZ2hwfG1lZGl1bXB8bG93cHwpW1xcblxcdCBdKihzYW1wbGVyXFx3KylbXFxuXFx0IF0qKFxcdyspW1xcblxcdCBdKi87XG5cblx0XHRcdGNvbnN0IGlzRnVuY3Rpb25CcmFja2V0ID0gISEodmFyaWFibGVDYW5kaWRhdGVzWzBdLm1hdGNoKHNhbXBsZXJUeXBlRGVmaW5pdGlvblJlZykgPz8gdmFyaWFibGVDYW5kaWRhdGVzWzBdLm1hdGNoKC9eW1xcblxcdCBdKiQvKSk7XG5cdFx0XHRpZiAoIWlzRnVuY3Rpb25CcmFja2V0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IHZhcmlhYmxlQ2FuZGlkYXRlIG9mIHZhcmlhYmxlQ2FuZGlkYXRlcykge1xuXHRcdFx0XHRjb25zdCBzYW1wbGVyVmFyaWFibGVNYXRjaCA9IHZhcmlhYmxlQ2FuZGlkYXRlLm1hdGNoKHNhbXBsZXJUeXBlRGVmaW5pdGlvblJlZyk7XG5cdFx0XHRcdGlmIChzYW1wbGVyVmFyaWFibGVNYXRjaCA9PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc2FtcGxlclR5cGUgPSBzYW1wbGVyVmFyaWFibGVNYXRjaFsyXTtcblx0XHRcdFx0Y29uc3QgbmFtZSA9IHNhbXBsZXJWYXJpYWJsZU1hdGNoWzNdO1xuXHRcdFx0XHRpZiAoYXJndW1lbnRTYW1wbGVyTWFwLmdldChuYW1lKSkge1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICdfX2NyZWF0ZUFyZ3VtZW50U2FtcGxlck1hcDogZHVwbGljYXRlIHZhcmlhYmxlIG5hbWUnO1xuXHRcdFx0XHRcdHRoaXMuX19vdXRFcnJvcihzcGxpdHRlZFNoYWRlckNvZGUsIGksIGVycm9yTWVzc2FnZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXJndW1lbnRTYW1wbGVyTWFwLnNldChuYW1lLCBzYW1wbGVyVHlwZSk7XG5cdFx0XHR9XG5cblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiBhcmd1bWVudFNhbXBsZXJNYXA7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcGFydCBlbmNsb3NlZCBpbiBicmFja2V0cyg9ICcoKScpLlxuXHQgKiBGb3IgZXhhbXBsZSwgeW91IGNhbiBnZXQgbGluZXMgdGhhdCBjb250YWluIGZ1bmN0aW9uIGFyZ3VtZW50cywgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgZm9yIGlmIHN0YXRlbWVudHMsIGV0Yy5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fZ2V0QnJhY2tldFNlY3Rpb24oc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgYnJhY2tldEVuZEluZGV4OiBudW1iZXIpIHtcblx0XHRsZXQgYnJhY2tldFN0YXJ0SW5kZXggPSAwO1xuXHRcdGZvciAobGV0IGogPSBicmFja2V0RW5kSW5kZXg7IGogPj0gMDsgai0tKSB7XG5cdFx0XHRjb25zdCBsaW5lID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2pdO1xuXHRcdFx0Y29uc3QgaXNCcmFja2V0U3RhcnRNYXRjaCA9ICEhbGluZS5tYXRjaCgvXFwoLyk7XG5cdFx0XHRpZiAoaXNCcmFja2V0U3RhcnRNYXRjaCkge1xuXHRcdFx0XHRicmFja2V0U3RhcnRJbmRleCA9IGo7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBjb250YWluQnJhY2tldENvZGUgPSAnJztcblx0XHRmb3IgKGxldCBqID0gYnJhY2tldFN0YXJ0SW5kZXg7IGogPD0gYnJhY2tldEVuZEluZGV4OyBqKyspIHtcblx0XHRcdGNvbnRhaW5CcmFja2V0Q29kZSArPSBzcGxpdHRlZFNoYWRlckNvZGVbal07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRhaW5CcmFja2V0Q29kZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSAnYXR0cmlidXRlJyBxdWFsaWZpZXIgaW4gdGhlIHZlcnRleCBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMyBxdWFsaWZpZXIoJ2luJylcblx0ICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY29udmVydEF0dHJpYnV0ZShzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdLCBpc0ZyYWdtZW50U2hhZGVyOiBib29sZWFuKSB7XG5cdFx0aWYgKGlzRnJhZ21lbnRTaGFkZXIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZWcgPSAvXig/IVtcXC9dKVtcXHQgXSphdHRyaWJ1dGVbXFx0IF0rL2c7XG5cdFx0Y29uc3QgcmVwbGFjZVN0ciA9ICdpbiAnO1xuXG5cdFx0dGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCByZXBsYWNlU3RyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSAndmFyeWluZycgcXVhbGlmaWVyIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMyBxdWFsaWZpZXIoJ2luJyBvciAnb3V0Jylcblx0ICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY29udmVydFZhcnlpbmcoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSwgaXNGcmFnbWVudFNoYWRlcjogYm9vbGVhbikge1xuXHRcdGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKnZhcnlpbmdbXFx0IF0rL2c7XG5cdFx0Y29uc3QgcmVwbGFjZVN0ciA9IGlzRnJhZ21lbnRTaGFkZXIgPyAnaW4gJyA6ICdvdXQgJztcblxuXHRcdHRoaXMuX19yZXBsYWNlTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZywgcmVwbGFjZVN0cik7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogRmluZCB0aGUgJ3RleHR1cmVDdWJlJyBtZXRob2QgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIEdMU0wgRVMzIG1ldGhvZCgndGV4dHVyZScpXG5cdCAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBfX2NvbnZlcnRUZXh0dXJlQ3ViZShzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdKSB7XG5cdFx0Y29uc3Qgc2JsID0gdGhpcy5fX3JlZ1N5bWJvbHMoKTtcblx0XHRjb25zdCByZWcgPSBuZXcgUmVnRXhwKGAoJHtzYmx9KykodGV4dHVyZUN1YmUpKCR7c2JsfSspYCwgJ2cnKTtcblx0XHRjb25zdCByZXBsYWNlU3RyID0gJ3RleHR1cmUnO1xuXG5cdFx0dGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCAnJDEnICsgcmVwbGFjZVN0ciArICckMycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEZpbmQgdGhlICd0ZXh0dXJlMkQnIG1ldGhvZCBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzMgbWV0aG9kKCd0ZXh0dXJlJylcblx0ICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY29udmVydFRleHR1cmUyRChzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdKSB7XG5cdFx0Y29uc3Qgc2JsID0gdGhpcy5fX3JlZ1N5bWJvbHMoKTtcblx0XHRjb25zdCByZWcgPSBuZXcgUmVnRXhwKGAoJHtzYmx9KykodGV4dHVyZTJEKSgke3NibH0rKWAsICdnJyk7XG5cdFx0Y29uc3QgcmVwbGFjZVN0ciA9ICd0ZXh0dXJlJztcblxuXHRcdHRoaXMuX19yZXBsYWNlTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZywgJyQxJyArIHJlcGxhY2VTdHIgKyAnJDMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSAndGV4dHVyZTJEUHJvaicgbWV0aG9kIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMyBtZXRob2QoJ3RleHR1cmVQcm9qJylcblx0ICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cblx0ICovXG5cdHByaXZhdGUgc3RhdGljIF9fY29udmVydFRleHR1cmUyRFByb2Qoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSkge1xuXHRcdGNvbnN0IHNibCA9IHRoaXMuX19yZWdTeW1ib2xzKCk7XG5cdFx0Y29uc3QgcmVnID0gbmV3IFJlZ0V4cChgKCR7c2JsfSspKHRleHR1cmUyRFByb2opKCR7c2JsfSspYCwgJ2cnKTtcblx0XHRjb25zdCByZXBsYWNlU3RyID0gJ3RleHR1cmVQcm9qJztcblxuXHRcdHRoaXMuX19yZXBsYWNlTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZywgJyQxJyArIHJlcGxhY2VTdHIgKyAnJDMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBGaW5kIHRoZSAndGV4dHVyZTNEJyBtZXRob2QgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIEdMU0wgRVMzIG1ldGhvZCgndGV4dHVyZScpXG5cdCAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBfX2NvbnZlcnRUZXh0dXJlM0Qoc3BsaXR0ZWRTaGFkZXJDb2RlOiBzdHJpbmdbXSkge1xuXHRcdGNvbnN0IHNibCA9IHRoaXMuX19yZWdTeW1ib2xzKCk7XG5cdFx0Y29uc3QgcmVnID0gbmV3IFJlZ0V4cChgKCR7c2JsfSspKHRleHR1cmUzRCkoJHtzYmx9KylgLCAnZycpO1xuXHRcdGNvbnN0IHJlcGxhY2VTdHIgPSAndGV4dHVyZSc7XG5cblx0XHR0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsICckMScgKyByZXBsYWNlU3RyICsgJyQzJyk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogRmluZCB0aGUgJ3RleHR1cmUzRFByb2onIG1ldGhvZCBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzMgbWV0aG9kKCd0ZXh0dXJlUHJvaicpXG5cdCAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBfX2NvbnZlcnRUZXh0dXJlM0RQcm9kKHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10pIHtcblx0XHRjb25zdCBzYmwgPSB0aGlzLl9fcmVnU3ltYm9scygpO1xuXHRcdGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoYCgke3NibH0rKSh0ZXh0dXJlM0RQcm9qKSgke3NibH0rKWAsICdnJyk7XG5cdFx0Y29uc3QgcmVwbGFjZVN0ciA9ICd0ZXh0dXJlUHJvaic7XG5cblx0XHR0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsICckMScgKyByZXBsYWNlU3RyICsgJyQzJyk7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBfX3JlZ1N5bWJvbHMoKSB7XG5cdFx0cmV0dXJuIGBbIVwiIyQlJicoKVxcKlxcK1xcLVxcLixcXC86Ozw9Pj9AXFxbXFxcXFxcXV5gICsgJ2B7fH1+XFx0XFxuIF0nO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgX19yZXBsYWNlTGluZShzcGxpdHRlZFNoYWRlckNvZGU6IHN0cmluZ1tdLCByZWc6IFJlZ0V4cCwgcmVwbGFjZW1lbnQ6IGFueSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWRTaGFkZXJDb2RlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBzcGxpdHRlZFNoYWRlckNvZGVbaV0ucmVwbGFjZShyZWcsIHJlcGxhY2VtZW50KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBfX3JlbW92ZUZpcnN0TWF0Y2hpbmdMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10sIHJlZzogUmVnRXhwKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChzcGxpdHRlZFNoYWRlckNvZGVbaV0ubWF0Y2gocmVnKSkge1xuXHRcdFx0XHRzcGxpdHRlZFNoYWRlckNvZGUuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBfX291dEVycm9yKFxuXHRcdHNwbGl0dGVkU2hhZGVyQ29kZTogc3RyaW5nW10sXG5cdFx0bGluZUluZGV4OiBudW1iZXIsXG5cdFx0ZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG5cdFx0ZW1iZWRFcnJvcnNJbk91dHB1dDogYm9vbGVhblxuXHQpIHtcblx0XHRpZiAoZW1iZWRFcnJvcnNJbk91dHB1dCkge1xuXHRcdFx0Y29uc3Qgc2hhZGVyT3V0cHV0TWVzc2FnZSA9IGAvLyBsaW5lICR7bGluZUluZGV4fTogJHtlcnJvck1lc3NhZ2V9XFxuYDtcblx0XHRcdGNvbnN0IGNsb3NlQnJhY2tldFJlZyA9IC8oLiopXFx9W1xcblxcdCBdKiQvO1xuXHRcdFx0Zm9yIChsZXQgaSA9IHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHRjb25zdCBsaW5lID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2ldO1xuXHRcdFx0XHRpZiAobGluZS5tYXRjaChjbG9zZUJyYWNrZXRSZWcpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc3BsaXR0ZWRTaGFkZXJDb2RlW2ldID09PSBzaGFkZXJPdXRwdXRNZXNzYWdlKSB7XG5cdFx0XHRcdFx0Ly8gYXZvaWQgZHVwbGljYXRlIGVycm9yIG1lc3NhZ2Vcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xuXHRcdFx0c3BsaXR0ZWRTaGFkZXJDb2RlLnB1c2goc2hhZGVyT3V0cHV0TWVzc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IFJlZmxlY3Rpb24gZnJvbSAnLi9SZWZsZWN0aW9uJztcbmltcG9ydCB7U2hhZGVyaXR5T2JqZWN0LCBTaGFkZXJTdGFnZVN0ciwgU2hhZGVyVmVyc2lvbiwgVGVtcGxhdGVPYmplY3R9IGZyb20gJy4uL3R5cGVzL3R5cGUnO1xuaW1wb3J0IFNoYWRlclRyYW5zZm9ybWVyIGZyb20gJy4vU2hhZGVyVHJhbnNmb3JtZXInO1xuaW1wb3J0IFNoYWRlckVkaXRvciBmcm9tICcuL1NoYWRlckVkaXRvcic7XG5pbXBvcnQgVXRpbGl0eSBmcm9tICcuL1V0aWxpdHknO1xuaW1wb3J0IFNoYWRlcml0eU9iamVjdENyZWF0b3IgZnJvbSAnLi9TaGFkZXJpdHlPYmplY3RDcmVhdG9yJztcbmltcG9ydCBQcmVQcm9jZXNzb3IgZnJvbSAnLi9QcmVQcm9jZXNzb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFkZXJpdHkge1xuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8gc2hhZGVyIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uc1xuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQvKipcblx0ICogVHJhbnNsYXRlIGEgR0xTTCBFUzMgc2hhZGVyIGNvZGUgdG8gYSBHTFNMIEVTMSBzaGFkZXIgY29kZVxuXHQgKiBAcGFyYW0gb2JqIFNoYWRlcml0eSBvYmplY3QgdG8gdHJhbnNsYXRlIHRvIGdsc2wgZXMxXG5cdCAqIEBwYXJhbSBlbWJlZEVycm9yc0luT3V0cHV0IElmIHRydWUsIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGNvbnZlcnNpb24sXG5cdCAqICAgIHRoZSBlcnJvciBhbmQgdGhlIG51bWJlciBvZiBsaW5lcyBhcmUgb3V0cHV0IGF0IHRoZSBib3R0b20gb2YgdGhlIHJldHVyblxuXHQgKiAgICB2YWx1ZSBTaGFkZXJpdHlPYmplY3QuY29kZS4gSWYgZmFsc2UsIHRocm93IGFuIGVycm9yLlxuXHQgKiBAcmV0dXJucyBTaGFkZXJpdHlPYmplY3Qgd2hvc2UgY29kZSBwcm9wZXJ0eSBpcyB0aGUgc2hhZGVyIGNvZGUgZm9yIEdMU0wgRVMxXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHRyYW5zZm9ybVRvR0xTTEVTMShvYmo6IFNoYWRlcml0eU9iamVjdCwgZW1iZWRFcnJvcnNJbk91dHB1dCA9IGZhbHNlKSB7XG5cdFx0Y29uc3Qgc3BsaXR0ZWRTaGFkZXJDb2RlID0gVXRpbGl0eS5fc3BsaXRCeUxpbmVGZWVkQ29kZShvYmouY29kZSk7XG5cblx0XHRjb25zdCB0cmFuc2Zvcm1lZFNwbGl0dGVkU2hhZGVyQ29kZVxuXHRcdFx0PSBTaGFkZXJUcmFuc2Zvcm1lci5fdHJhbnNmb3JtVG9HTFNMRVMxKFxuXHRcdFx0XHRzcGxpdHRlZFNoYWRlckNvZGUsXG5cdFx0XHRcdG9iai5pc0ZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRlbWJlZEVycm9yc0luT3V0cHV0XG5cdFx0XHQpO1xuXHRcdGNvbnN0IHJlc3VsdENvZGUgPSBVdGlsaXR5Ll9qb2luU3BsaXR0ZWRMaW5lKHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlKTtcblxuXHRcdGNvbnN0IHJlc3VsdE9iajogU2hhZGVyaXR5T2JqZWN0ID0ge1xuXHRcdFx0Y29kZTogcmVzdWx0Q29kZSxcblx0XHRcdHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG5cdFx0XHRpc0ZyYWdtZW50U2hhZGVyOiBvYmouaXNGcmFnbWVudFNoYWRlcixcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHJlc3VsdE9iajtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2xhdGUgYSBHTFNMIEVTMSBzaGFkZXIgY29kZSB0byBhIEdMU0wgRVMzIHNoYWRlciBjb2RlXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHRyYW5zZm9ybVRvR0xTTEVTMyhvYmo6IFNoYWRlcml0eU9iamVjdCkge1xuXHRcdGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IFV0aWxpdHkuX3NwbGl0QnlMaW5lRmVlZENvZGUob2JqLmNvZGUpO1xuXG5cdFx0Y29uc3QgdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGVcblx0XHRcdD0gU2hhZGVyVHJhbnNmb3JtZXIuX3RyYW5zZm9ybVRvR0xTTEVTMyhzcGxpdHRlZFNoYWRlckNvZGUsIG9iai5pc0ZyYWdtZW50U2hhZGVyKTtcblx0XHRjb25zdCByZXN1bHRDb2RlID0gVXRpbGl0eS5fam9pblNwbGl0dGVkTGluZSh0cmFuc2Zvcm1lZFNwbGl0dGVkU2hhZGVyQ29kZSk7XG5cblx0XHRjb25zdCByZXN1bHRPYmo6IFNoYWRlcml0eU9iamVjdCA9IHtcblx0XHRcdGNvZGU6IHJlc3VsdENvZGUsXG5cdFx0XHRzaGFkZXJTdGFnZTogb2JqLnNoYWRlclN0YWdlLFxuXHRcdFx0aXNGcmFnbWVudFNoYWRlcjogb2JqLmlzRnJhZ21lbnRTaGFkZXIsXG5cdFx0fTtcblxuXHRcdHJldHVybiByZXN1bHRPYmo7XG5cdH1cblxuXHQvKipcblx0ICogVHJhbnNsYXRlIGEgR0xTTCBzaGFkZXIgY29kZSB0byBhIHNoYWRlciBjb2RlIG9mIHNwZWNpZmllZCBHTFNMIHZlcnNpb25cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtVG8odmVyc2lvbjogU2hhZGVyVmVyc2lvbiwgb2JqOiBTaGFkZXJpdHlPYmplY3QsIGVtYmVkRXJyb3JzSW5PdXRwdXQgPSBmYWxzZSkge1xuXHRcdGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IFV0aWxpdHkuX3NwbGl0QnlMaW5lRmVlZENvZGUob2JqLmNvZGUpO1xuXG5cdFx0Y29uc3QgdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGVcblx0XHRcdD0gU2hhZGVyVHJhbnNmb3JtZXIuX3RyYW5zZm9ybVRvKFxuXHRcdFx0XHR2ZXJzaW9uLFxuXHRcdFx0XHRzcGxpdHRlZFNoYWRlckNvZGUsXG5cdFx0XHRcdG9iai5pc0ZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRlbWJlZEVycm9yc0luT3V0cHV0XG5cdFx0XHQpO1xuXHRcdGNvbnN0IHJlc3VsdENvZGUgPSBVdGlsaXR5Ll9qb2luU3BsaXR0ZWRMaW5lKHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlKTtcblxuXHRcdGNvbnN0IHJlc3VsdE9iajogU2hhZGVyaXR5T2JqZWN0ID0ge1xuXHRcdFx0Y29kZTogcmVzdWx0Q29kZSxcblx0XHRcdHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG5cdFx0XHRpc0ZyYWdtZW50U2hhZGVyOiBvYmouaXNGcmFnbWVudFNoYWRlcixcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHJlc3VsdE9iajtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgcHJvY2Vzc1ByYWdtYShvYmo6IFNoYWRlcml0eU9iamVjdCkge1xuXHRcdGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IFV0aWxpdHkuX3NwbGl0QnlMaW5lRmVlZENvZGUob2JqLmNvZGUpO1xuXG5cdFx0Y29uc3QgdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGVcblx0XHRcdD0gUHJlUHJvY2Vzc29yLnByb2Nlc3Moc3BsaXR0ZWRTaGFkZXJDb2RlKTtcblxuXHRcdGNvbnN0IHJlc3VsdENvZGUgPSBVdGlsaXR5Ll9qb2luU3BsaXR0ZWRMaW5lKHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlKTtcblxuXHRcdGNvbnN0IHJlc3VsdE9iajogU2hhZGVyaXR5T2JqZWN0ID0ge1xuXHRcdFx0Y29kZTogcmVzdWx0Q29kZSxcblx0XHRcdHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG5cdFx0XHRpc0ZyYWdtZW50U2hhZGVyOiBvYmouaXNGcmFnbWVudFNoYWRlcixcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHJlc3VsdE9iajtcblx0fVxuXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBzaGFkZXJpdHkgb2JqZWN0IGNyZWF0aW9uIGZ1bmN0aW9uc1xuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGluc3RhbmNlIHRvIGNyZWF0ZSBzaGFkZXJpdHkgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBjcmVhdGVTaGFkZXJpdHlPYmplY3RDcmVhdG9yKHNoYWRlclN0YWdlOiBTaGFkZXJTdGFnZVN0cik6IFNoYWRlcml0eU9iamVjdENyZWF0b3Ige1xuXHRcdHJldHVybiBuZXcgU2hhZGVyaXR5T2JqZWN0Q3JlYXRvcihzaGFkZXJTdGFnZSk7XG5cdH1cblxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8gc2hhZGVyIGVkaXQgZnVuY3Rpb25zXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdC8qKlxuXHQgKiBGaW5kIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgcGF0dGVybiBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlcGxhY2Uga2V5IHRvIHZhbHVlXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZU9iamVjdCBBbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzdHJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmVwbGFjZW1lbnRcblx0ICogVGhlIGtleSBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LiBJZiBhbiBvYmplY3QgaXMgdXNlZCBhcyB0aGUga2V5LFxuXHQgKiB0aGUga2V5IGluIHRoZSBwYXR0ZXJuIG9mIHNoYWRlckNvZGUgbXVzdCBhbHNvIG1hdGNoIHRoZSBvYmplY3QuXG5cdCAqIEZvciBleGFtcGxlLCBpZiB0ZW1wbGF0ZU9iamVjdCBpc1xuXHRcdHtcblx0XHRcdHNhbXBsZSB7XG5cdFx0XHRcdHNhbXBsZUE6IDBcblx0XHRcdH1cblx0XHR9XG5cdCAqIHRoZW4gdGhlIGtleSBpbiBhIHNoYWRlciBjb2RlIGlzIHNhbXBsZS5zYW1wbGVBLlxuXHQgKi9cblx0Ly8gVGhlIHRlbXBsYXRlIHBhdHRlcm4gaXNcdC8qIHNoYWRlcml0eTogQHtrZXl9ICovXG5cdHB1YmxpYyBzdGF0aWMgZmlsbFRlbXBsYXRlKG9iajogU2hhZGVyaXR5T2JqZWN0LCBhcmc6IFRlbXBsYXRlT2JqZWN0KSB7XG5cdFx0Y29uc3QgY29weSA9IHRoaXMuX19jb3B5U2hhZGVyaXR5T2JqZWN0KG9iaik7XG5cblx0XHRjb3B5LmNvZGUgPSBTaGFkZXJFZGl0b3IuX2ZpbGxUZW1wbGF0ZShjb3B5LmNvZGUsIGFyZyk7XG5cblx0XHRyZXR1cm4gY29weTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnNlcnQgZGVmaW5lIGRpcmVjdGl2ZVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBpbnNlcnREZWZpbml0aW9uKG9iajogU2hhZGVyaXR5T2JqZWN0LCBkZWZpbml0aW9uOiBzdHJpbmcpIHtcblx0XHRjb25zdCBjb3B5ID0gdGhpcy5fX2NvcHlTaGFkZXJpdHlPYmplY3Qob2JqKTtcblx0XHRjb25zdCBzcGxpdHRlZFNoYWRlckNvZGUgPSBVdGlsaXR5Ll9zcGxpdEJ5TGluZUZlZWRDb2RlKG9iai5jb2RlKTtcblxuXHRcdFNoYWRlckVkaXRvci5faW5zZXJ0RGVmaW5pdGlvbihzcGxpdHRlZFNoYWRlckNvZGUsIGRlZmluaXRpb24pO1xuXHRcdGNvcHkuY29kZSA9IFV0aWxpdHkuX2pvaW5TcGxpdHRlZExpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcblxuXHRcdHJldHVybiBjb3B5O1xuXHR9XG5cblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vIHJlZmxlY3Rpb24gZnVuY3Rpb25zXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gaW5zdGFuY2UgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUsIHZhcnlpbmcsIGFuZCB1bmlmb3JtIGluZm9ybWF0aW9uIGZyb20gYSBzaGFkZXIgY29kZSBvZiB0aGUgc2hhZGVyaXR5LlxuXHQgKiBUbyBnZXQgdGhlc2UgaW5mb3JtYXRpb24sIHlvdSBuZWVkIHRvIGNhbGwgcmVmbGVjdGlvbi5yZWZsZWN0IG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY3JlYXRlUmVmbGVjdGlvbk9iamVjdChvYmo6IFNoYWRlcml0eU9iamVjdCk6IFJlZmxlY3Rpb24ge1xuXHRcdGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IFV0aWxpdHkuX3NwbGl0QnlMaW5lRmVlZENvZGUob2JqLmNvZGUpO1xuXG5cdFx0Y29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHNwbGl0dGVkU2hhZGVyQ29kZSwgb2JqLnNoYWRlclN0YWdlKTtcblx0XHRyZXR1cm4gcmVmbGVjdGlvbjtcblx0fVxuXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBwcml2YXRlIGZ1bmN0aW9uc1xuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRwcml2YXRlIHN0YXRpYyBfX2NvcHlTaGFkZXJpdHlPYmplY3Qob2JqOiBTaGFkZXJpdHlPYmplY3QpIHtcblx0XHRjb25zdCBjb3BpZWRPYmo6IFNoYWRlcml0eU9iamVjdCA9IHtcblx0XHRcdGNvZGU6IG9iai5jb2RlLFxuXHRcdFx0c2hhZGVyU3RhZ2U6IG9iai5zaGFkZXJTdGFnZSxcblx0XHRcdGlzRnJhZ21lbnRTaGFkZXI6IG9iai5pc0ZyYWdtZW50U2hhZGVyLFxuXHRcdH1cblxuXHRcdHJldHVybiBjb3BpZWRPYmo7XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdFNoYWRlckNvbnN0YW50VmFsdWVPYmplY3QsXG5cdFNoYWRlckV4dGVuc2lvbkJlaGF2aW9yLFxuXHRTaGFkZXJFeHRlbnNpb25PYmplY3QsXG5cdFNoYWRlcml0eU9iamVjdCxcblx0U2hhZGVyQ29uc3RhbnRWYWx1ZVZhclR5cGVFUzMsXG5cdFNoYWRlclByZWNpc2lvbk9iamVjdCxcblx0U2hhZGVyUHJlY2lzaW9uT2JqZWN0S2V5LFxuXHRTaGFkZXJTdGFnZVN0cixcblx0U2hhZGVyQXR0cmlidXRlT2JqZWN0LFxuXHRTaGFkZXJQcmVjaXNpb25UeXBlLFxuXHRTaGFkZXJBdHRyaWJ1dGVWYXJUeXBlLFxuXHRTaGFkZXJWYXJ5aW5nT2JqZWN0LFxuXHRTaGFkZXJWYXJ5aW5nSW50ZXJwb2xhdGlvblR5cGUsXG5cdFNoYWRlclZhcnlpbmdWYXJUeXBlLFxuXHRTaGFkZXJVbmlmb3JtT2JqZWN0LFxuXHRTaGFkZXJVbmlmb3JtVmFyVHlwZUVTMyxcblx0U2hhZGVyU3RydWN0RGVmaW5pdGlvbk9iamVjdCxcblx0U2hhZGVyU3RydWN0TWVtYmVyT2JqZWN0LFxuXHRTaGFkZXJDb25zdGFudFN0cnVjdFZhbHVlT2JqZWN0LFxuXHRTaGFkZXJVbmlmb3JtU3RydWN0T2JqZWN0LFxuXHRTaGFkZXJVbmlmb3JtQnVmZmVyT2JqZWN0LFxuXHRTaGFkZXJVQk9WYXJpYWJsZU9iamVjdCxcblx0U2hhZGVyRnVuY3Rpb25PYmplY3QsXG59IGZyb20gJy4uL3R5cGVzL3R5cGUnO1xuaW1wb3J0IFV0aWxpdHkgZnJvbSAnLi9VdGlsaXR5JztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBzaGFkZXJpdHkgb2JqZWN0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFkZXJpdHlPYmplY3RDcmVhdG9yIHtcblx0cHJpdmF0ZSBfX3NoYWRlclN0YWdlOiBTaGFkZXJTdGFnZVN0cjtcblx0cHJpdmF0ZSBfX2Z1bmN0aW9uSWRDb3VudCA9IDA7XG5cblx0cHJpdmF0ZSBfX2RlZmluZURpcmVjdGl2ZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIF9fZXh0ZW5zaW9uczogU2hhZGVyRXh0ZW5zaW9uT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX2dsb2JhbFByZWNpc2lvbjogU2hhZGVyUHJlY2lzaW9uT2JqZWN0ID0ge1xuXHRcdGludDogJ2hpZ2hwJyxcblx0XHRmbG9hdDogJ2hpZ2hwJyxcblx0XHRzYW1wbGVyMkQ6ICdoaWdocCcsXG5cdFx0c2FtcGxlckN1YmU6ICdoaWdocCcsXG5cdFx0c2FtcGxlcjNEOiAnaGlnaHAnLFxuXHRcdHNhbXBsZXIyREFycmF5OiAnaGlnaHAnLFxuXHRcdGlzYW1wbGVyMkQ6ICdoaWdocCcsXG5cdFx0aXNhbXBsZXJDdWJlOiAnaGlnaHAnLFxuXHRcdGlzYW1wbGVyM0Q6ICdoaWdocCcsXG5cdFx0aXNhbXBsZXIyREFycmF5OiAnaGlnaHAnLFxuXHRcdHVzYW1wbGVyMkQ6ICdoaWdocCcsXG5cdFx0dXNhbXBsZXJDdWJlOiAnaGlnaHAnLFxuXHRcdHVzYW1wbGVyM0Q6ICdoaWdocCcsXG5cdFx0dXNhbXBsZXIyREFycmF5OiAnaGlnaHAnLFxuXHRcdHNhbXBsZXIyRFNoYWRvdzogJ2hpZ2hwJyxcblx0XHRzYW1wbGVyQ3ViZVNoYWRvdzogJ2hpZ2hwJyxcblx0XHRzYW1wbGVyMkRBcnJheVNoYWRvdzogJ2hpZ2hwJyxcblx0fTtcblx0cHJpdmF0ZSBfX3N0cnVjdERlZmluaXRpb25zOiBTaGFkZXJTdHJ1Y3REZWZpbml0aW9uT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX2dsb2JhbENvbnN0YW50VmFsdWVzOiBTaGFkZXJDb25zdGFudFZhbHVlT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzOiBTaGFkZXJDb25zdGFudFN0cnVjdFZhbHVlT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX2F0dHJpYnV0ZXM6IFNoYWRlckF0dHJpYnV0ZU9iamVjdFtdID0gW107IC8vIGZvciB2ZXJ0ZXggc2hhZGVyIG9ubHlcblx0cHJpdmF0ZSBfX3ZhcnlpbmdzOiBTaGFkZXJWYXJ5aW5nT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX3VuaWZvcm1zOiBTaGFkZXJVbmlmb3JtT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX3VuaWZvcm1TdHJ1Y3RzOiBTaGFkZXJVbmlmb3JtU3RydWN0T2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX3VuaWZvcm1CdWZmZXJPYmplY3RzOiBTaGFkZXJVbmlmb3JtQnVmZmVyT2JqZWN0W10gPSBbXTtcblx0cHJpdmF0ZSBfX2Z1bmN0aW9uczogU2hhZGVyRnVuY3Rpb25PYmplY3RbXVtdID0gW107IC8vIGZpcnN0IGluZGV4IHJlcHJlc2VudCBkZXBlbmRlbmN5IGxldmVsXG5cdHByaXZhdGUgX19tYWluRnVuY3Rpb25Db2RlOiBzdHJpbmcgPSAndm9pZCBtYWluKCkge30nO1xuXHRwcml2YXRlIF9fb3V0cHV0Q29sb3JWYXJpYWJsZU5hbWU6IHN0cmluZyA9ICdyZW5kZXJUYXJnZXQwJzsgLy8gZm9yIGZyYWdtZW50IHNoYWRlciBvbmx5XG5cblx0Y29uc3RydWN0b3Ioc2hhZGVyU3RhZ2U6IFNoYWRlclN0YWdlU3RyKSB7XG5cdFx0dGhpcy5fX3NoYWRlclN0YWdlID0gc2hhZGVyU3RhZ2U7XG5cdH1cblxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8gYWRkIHBhcmFtZXRlcnMgZnVuY3Rpb25zXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHB1YmxpYyBhZGREZWZpbmVEaXJlY3RpdmUoZGVmaW5lRGlyZWN0aXZlTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgaXNEdXBsaWNhdGUgPVxuXHRcdFx0dGhpcy5fX2RlZmluZURpcmVjdGl2ZU5hbWVzLnNvbWUobmFtZSA9PiBuYW1lID09PSBkZWZpbmVEaXJlY3RpdmVOYW1lKTtcblx0XHRpZiAoaXNEdXBsaWNhdGUpIHtcblx0XHRcdGNvbnNvbGUud2FybignYWRkRGVmaW5lRGlyZWN0aXZlOiB0aGlzIGRlZmluZSBkaXJlY3RpdmUgaXMgYWxyZWFkeSBzZXQnKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9fZGVmaW5lRGlyZWN0aXZlTmFtZXMucHVzaChkZWZpbmVEaXJlY3RpdmVOYW1lKTtcblx0fVxuXG5cdHB1YmxpYyBhZGRFeHRlbnNpb24oZXh0ZW5zaW9uTmFtZTogc3RyaW5nLCBiZWhhdmlvcjogU2hhZGVyRXh0ZW5zaW9uQmVoYXZpb3IgPSAnZW5hYmxlJykge1xuXHRcdGNvbnN0IGlzRHVwbGljYXRlID1cblx0XHRcdHRoaXMuX19leHRlbnNpb25zLnNvbWUoZXh0ZW5zaW9uID0+IGV4dGVuc2lvbi5leHRlbnNpb25OYW1lID09PSBleHRlbnNpb25OYW1lKTtcblx0XHRpZiAoaXNEdXBsaWNhdGUpIHtcblx0XHRcdGNvbnNvbGUud2FybignYWRkRXh0ZW5zaW9uOiB0aGlzIGV4dGVuc2lvbiBpcyBhbHJlYWR5IHNldCcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX19leHRlbnNpb25zLnB1c2goe1xuXHRcdFx0ZXh0ZW5zaW9uTmFtZSxcblx0XHRcdGJlaGF2aW9yXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBvbmx5IGRlZmluZSB0eXBlc1xuXHRwdWJsaWMgYWRkU3RydWN0RGVmaW5pdGlvbihzdHJ1Y3ROYW1lOiBzdHJpbmcsIG1lbWJlck9iamVjdHM6IFNoYWRlclN0cnVjdE1lbWJlck9iamVjdFtdKSB7XG5cdFx0Y29uc3QgaXNEdXBsaWNhdGUgPVxuXHRcdFx0dGhpcy5fX3N0cnVjdERlZmluaXRpb25zLnNvbWUoc3RydWN0RGVmaW5pdGlvbiA9PiBzdHJ1Y3REZWZpbml0aW9uLnN0cnVjdE5hbWUgPT09IHN0cnVjdE5hbWUpO1xuXHRcdGlmIChpc0R1cGxpY2F0ZSkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgYWRkU3RydWN0RGVmaW5pdGlvbjogZHVwbGljYXRlIHN0cnVjdCB0eXBlIG5hbWUgJHtzdHJ1Y3ROYW1lfWApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucy5wdXNoKHtcblx0XHRcdHN0cnVjdE5hbWUsXG5cdFx0XHRtZW1iZXJPYmplY3RzLFxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGFkZEdsb2JhbENvbnN0YW50VmFsdWUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHR5cGU6IFNoYWRlckNvbnN0YW50VmFsdWVWYXJUeXBlRVMzLCB2YWx1ZXM6IG51bWJlcltdKSB7XG5cdFx0Y29uc3QgaXNEdXBsaWNhdGUgPVxuXHRcdFx0dGhpcy5fX2dsb2JhbENvbnN0YW50VmFsdWVzLnNvbWUoZ2xvYmFsQ29uc3RhbnRWYWx1ZSA9PiBnbG9iYWxDb25zdGFudFZhbHVlLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcblx0XHRpZiAoaXNEdXBsaWNhdGUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYGFkZEdsb2JhbENvbnN0YW50VmFsdWU6IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfWApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzVmFsaWRDb21wb25lbnROdW1iZXIgPSBVdGlsaXR5Ll9pc1ZhbGlkQ29tcG9uZW50Q291bnQodHlwZSwgdmFsdWVzKTtcblx0XHRpZiAoIWlzVmFsaWRDb21wb25lbnROdW1iZXIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYGFkZEdsb2JhbENvbnN0YW50VmFsdWU6IHRoZSBjb21wb25lbnQgY291bnQgb2YgJHt2YXJpYWJsZU5hbWV9IGlzIGludmFsaWRgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpc0ludFR5cGUgPSBVdGlsaXR5Ll9pc0ludFR5cGUodHlwZSk7XG5cdFx0aWYgKGlzSW50VHlwZSkge1xuXHRcdFx0Y29uc3QgZXhpc3ROb25JbnRlZ2VyVmFsdWUgPSBTaGFkZXJpdHlPYmplY3RDcmVhdG9yLl9fZXhpc3ROb25JbnRlZ2VyVmFsdWUodmFsdWVzKTtcblx0XHRcdGlmIChleGlzdE5vbkludGVnZXJWYWx1ZSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYGFkZEdsb2JhbENvbnN0YW50VmFsdWU6IG5vbi1pbnRlZ2VyIHZhbHVlIGlzIHNldCB0byAke3ZhcmlhYmxlTmFtZX1gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMucHVzaCh7XG5cdFx0XHR2YXJpYWJsZU5hbWUsXG5cdFx0XHR0eXBlLFxuXHRcdFx0dmFsdWVzLFxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gbmVlZCB0byBkZWZpbmUgc3RydWN0IGJ5IHRoZSBhZGRTdHJ1Y3REZWZpbml0aW9uIG1ldGhvZFxuXHQvLyB2YWxpZGF0ZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGJ5IHRoZSBfX2NyZWF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWVTaGFkZXJDb2RlIG1ldGhvZFxuXHRwdWJsaWMgYWRkR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZShzdHJ1Y3ROYW1lOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZXM6IHtba2V5VmFyaWFibGVOYW1lOiBzdHJpbmddOiBudW1iZXJbXX0pIHtcblx0XHRjb25zdCBpc0R1cGxpY2F0ZSA9XG5cdFx0XHR0aGlzLl9fZ2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZXMuc29tZShzdHJ1Y3RWYWx1ZSA9PiBzdHJ1Y3RWYWx1ZS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG5cdFx0aWYgKGlzRHVwbGljYXRlKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBhZGRHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX1gKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9fZ2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZXMucHVzaCh7XG5cdFx0XHR2YXJpYWJsZU5hbWUsXG5cdFx0XHRzdHJ1Y3ROYW1lLFxuXHRcdFx0dmFsdWVzLFxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGFkZEF0dHJpYnV0ZURlY2xhcmF0aW9uKFxuXHRcdHZhcmlhYmxlTmFtZTogc3RyaW5nLFxuXHRcdHR5cGU6IFNoYWRlckF0dHJpYnV0ZVZhclR5cGUsXG5cdFx0b3B0aW9ucz86IHtcblx0XHRcdHByZWNpc2lvbj86IFNoYWRlclByZWNpc2lvblR5cGUsXG5cdFx0XHRsb2NhdGlvbj86IG51bWJlcixcblx0XHR9XG5cdCkge1xuXHRcdGlmICh0aGlzLl9fc2hhZGVyU3RhZ2UgIT09ICd2ZXJ0ZXgnKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdhZGRBdHRyaWJ1dGU6IHRoaXMgbWV0aG9kIGlzIGZvciB2ZXJ0ZXggc2hhZGVyIG9ubHknKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpc0R1cGxpY2F0ZSA9XG5cdFx0XHR0aGlzLl9fYXR0cmlidXRlcy5zb21lKGF0dHJpYnV0ZSA9PiBhdHRyaWJ1dGUudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuXHRcdGlmIChpc0R1cGxpY2F0ZSkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgYWRkQXR0cmlidXRlOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX1gKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9fYXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdHZhcmlhYmxlTmFtZSxcblx0XHRcdHR5cGUsXG5cdFx0XHRwcmVjaXNpb246IG9wdGlvbnM/LnByZWNpc2lvbixcblx0XHRcdGxvY2F0aW9uOiBvcHRpb25zPy5sb2NhdGlvbixcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRWYXJ5aW5nRGVjbGFyYXRpb24oXG5cdFx0dmFyaWFibGVOYW1lOiBzdHJpbmcsXG5cdFx0dHlwZTogU2hhZGVyVmFyeWluZ1ZhclR5cGUsXG5cdFx0b3B0aW9ucz86IHtcblx0XHRcdHByZWNpc2lvbj86IFNoYWRlclByZWNpc2lvblR5cGUsXG5cdFx0XHRpbnRlcnBvbGF0aW9uVHlwZT86IFNoYWRlclZhcnlpbmdJbnRlcnBvbGF0aW9uVHlwZSxcblx0XHR9XG5cdCkge1xuXHRcdGNvbnN0IGlzRHVwbGljYXRlID1cblx0XHRcdHRoaXMuX192YXJ5aW5ncy5zb21lKHZhcnlpbmcgPT4gdmFyeWluZy52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG5cdFx0aWYgKGlzRHVwbGljYXRlKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBhZGRWYXJ5aW5nOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX1gKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpc0ludFR5cGUgPSBVdGlsaXR5Ll9pc0ludFR5cGUodHlwZSk7XG5cdFx0bGV0IGludGVycG9sYXRpb25UeXBlID0gb3B0aW9ucz8uaW50ZXJwb2xhdGlvblR5cGU7XG5cdFx0aWYgKGlzSW50VHlwZSAmJiBpbnRlcnBvbGF0aW9uVHlwZSAhPT0gJ2ZsYXQnKSB7XG5cdFx0XHRpZiAoaW50ZXJwb2xhdGlvblR5cGUgIT0gbnVsbCkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBhZGRWYXJ5aW5nOiB0aGUgaW50ZXJwb2xhdGlvblR5cGUgbXVzdCBiZSBmbGF0IGZvciBpbnRlZ2VyIHR5cGVzYCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybihgYWRkVmFyeWluZzogc2V0IHRoZSBpbnRlcnBvbGF0aW9uVHlwZSBvZiBpbnRlZ2VyIHR5cGVzIHRvIGZsYXQgdG8gYXZvaWQgY29tcGlsYXRpb24gZXJyb3JgKTtcblx0XHRcdFx0aW50ZXJwb2xhdGlvblR5cGUgPSAnZmxhdCc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fX3ZhcnlpbmdzLnB1c2goe1xuXHRcdFx0dmFyaWFibGVOYW1lLFxuXHRcdFx0dHlwZSxcblx0XHRcdHByZWNpc2lvbjogb3B0aW9ucz8ucHJlY2lzaW9uLFxuXHRcdFx0aW50ZXJwb2xhdGlvblR5cGUsXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgYWRkVW5pZm9ybURlY2xhcmF0aW9uKFxuXHRcdHZhcmlhYmxlTmFtZTogc3RyaW5nLFxuXHRcdHR5cGU6IFNoYWRlclVuaWZvcm1WYXJUeXBlRVMzLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRwcmVjaXNpb24/OiBTaGFkZXJQcmVjaXNpb25UeXBlLFxuXHRcdH1cblx0KSB7XG5cdFx0Y29uc3QgaXNEdXBsaWNhdGUgPVxuXHRcdFx0dGhpcy5fX3VuaWZvcm1zLnNvbWUodW5pZm9ybSA9PiB1bmlmb3JtLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcblx0XHRpZiAoaXNEdXBsaWNhdGUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYGFkZFVuaWZvcm06IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfWApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlID09PSAnYm9vbCcgJiYgb3B0aW9ucz8ucHJlY2lzaW9uICE9IG51bGwpIHtcblx0XHRcdGNvbnNvbGUud2FybihgYWRkVW5pZm9ybTogcmVtb3ZlIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHByZWNpc2lvbiBmb3IgYm9vbCB0eXBlIHRvIGF2b2lkIGNvbXBpbGF0aW9uIGVycm9yYCk7XG5cdFx0XHRvcHRpb25zLnByZWNpc2lvbiA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHR0aGlzLl9fdW5pZm9ybXMucHVzaCh7XG5cdFx0XHR2YXJpYWJsZU5hbWUsXG5cdFx0XHR0eXBlLFxuXHRcdFx0cHJlY2lzaW9uOiBvcHRpb25zPy5wcmVjaXNpb24sXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBuZWVkIHRvIGRlZmluZSBzdHJ1Y3QgYnkgdGhlIGFkZFN0cnVjdERlZmluaXRpb24gbWV0aG9kXG5cdHB1YmxpYyBhZGRVbmlmb3JtU3RydWN0RGVjbGFyYXRpb24oXG5cdFx0c3RydWN0TmFtZTogc3RyaW5nLFxuXHRcdHZhcmlhYmxlTmFtZTogc3RyaW5nXG5cdCkge1xuXHRcdGNvbnN0IGlzRHVwbGljYXRlID1cblx0XHRcdHRoaXMuX191bmlmb3JtU3RydWN0cy5zb21lKHVuaWZvcm1TdHJ1Y3QgPT4gdW5pZm9ybVN0cnVjdC52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG5cdFx0aWYgKGlzRHVwbGljYXRlKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBhZGRVbmlmb3JtU3RydWN0RGVjbGFyYXRpb246IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfWApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX191bmlmb3JtU3RydWN0cy5wdXNoKHtcblx0XHRcdHZhcmlhYmxlTmFtZSxcblx0XHRcdHN0cnVjdE5hbWUsXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBmb3IgZXMzXG5cdHB1YmxpYyBhZGRVbmlmb3JtQnVmZmVyT2JqZWN0RGVjbGFyYXRpb24oXG5cdFx0YmxvY2tOYW1lOiBzdHJpbmcsXG5cdFx0dmFyaWFibGVPYmplY3RzOiBTaGFkZXJVQk9WYXJpYWJsZU9iamVjdFtdLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRpbnN0YW5jZU5hbWU/OiBTaGFkZXJQcmVjaXNpb25UeXBlXG5cdFx0fVxuXHQpIHtcblx0XHRjb25zdCBpc0R1cGxpY2F0ZUJsb2NrTmFtZSA9XG5cdFx0XHR0aGlzLl9fdW5pZm9ybUJ1ZmZlck9iamVjdHMuc29tZSh1Ym8gPT4gdWJvLmJsb2NrTmFtZSA9PT0gYmxvY2tOYW1lKTtcblx0XHRpZiAoaXNEdXBsaWNhdGVCbG9ja05hbWUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYGFkZFVuaWZvcm1CdWZmZXJPYmplY3REZWNsYXJhdGlvbjogZHVwbGljYXRlIGJsb2NrIG5hbWUgJHtibG9ja05hbWV9YCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCB1Ym8gb2YgdGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHVib1ZhcmlhYmxlT2JqZWN0IG9mIHViby52YXJpYWJsZU9iamVjdHMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCB2YXJpYWJsZU9iamVjdCBvZiB2YXJpYWJsZU9iamVjdHMpIHtcblx0XHRcdFx0XHRpZiAodWJvVmFyaWFibGVPYmplY3QudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU9iamVjdC52YXJpYWJsZU5hbWUpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYGFkZFVuaWZvcm1CdWZmZXJPYmplY3REZWNsYXJhdGlvbjogZHVwbGljYXRlIHZhcmlhYmxlIG5hbWUgJHt2YXJpYWJsZU9iamVjdC52YXJpYWJsZU5hbWV9YCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzLnB1c2goe1xuXHRcdFx0YmxvY2tOYW1lLFxuXHRcdFx0dmFyaWFibGVPYmplY3RzLFxuXHRcdFx0aW5zdGFuY2VOYW1lOiBvcHRpb25zPy5pbnN0YW5jZU5hbWUsXG5cdFx0fSk7XG5cdH1cblxuXHQvLyB0aGUgcmV0dXJuIHZhbHVlIElkIGlzIGEgdmFsdWUgdG8gZGVsZXRlIHRoZSBmdW5jdGlvblxuXHQvLyB0aGUgbWFpbiBmdW5jdGlvbiBpcyBkZWZpbmVkICh1cGRhdGVkKSBieSB0aGUgdXBkYXRlTWFpbkZ1bmN0aW9uIG1ldGhvZFxuXHRwdWJsaWMgYWRkRnVuY3Rpb25EZWZpbml0aW9uKFxuXHRcdGZ1bmN0aW9uQ29kZTogc3RyaW5nLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRkZXBlbmRlbmN5TGV2ZWw/OiBudW1iZXJcblx0XHR9XG5cdCkge1xuXHRcdGNvbnN0IGZ1bmN0aW9uSWQgPSB0aGlzLl9fZnVuY3Rpb25JZENvdW50Kys7XG5cblx0XHRjb25zdCBkZXBlbmRlbmN5TGV2ZWwgPSBvcHRpb25zPy5kZXBlbmRlbmN5TGV2ZWwgPz8gMDtcblx0XHR0aGlzLl9fZnVuY3Rpb25zW2RlcGVuZGVuY3lMZXZlbF0gPSB0aGlzLl9fZnVuY3Rpb25zW2RlcGVuZGVuY3lMZXZlbF0gPz8gW107XG5cdFx0dGhpcy5fX2Z1bmN0aW9uc1tkZXBlbmRlbmN5TGV2ZWxdLnB1c2goe1xuXHRcdFx0ZnVuY3Rpb25Db2RlLFxuXHRcdFx0ZnVuY3Rpb25JZFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uSWQ7XG5cdH1cblxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8gdXBkYXRlIHBhcmFtZXRlcnMgZnVuY3Rpb25zXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHB1YmxpYyB1cGRhdGVHbG9iYWxQcmVjaXNpb24ocHJlY2lzaW9uOiBTaGFkZXJQcmVjaXNpb25PYmplY3QpIHtcblx0XHRPYmplY3QuYXNzaWduKHRoaXMuX19nbG9iYWxQcmVjaXNpb24sIHByZWNpc2lvbik7XG5cdH1cblxuXHRwdWJsaWMgdXBkYXRlU3RydWN0RGVmaW5pdGlvbihzdHJ1Y3ROYW1lOiBzdHJpbmcsIG1lbWJlck9iamVjdHM6IFNoYWRlclN0cnVjdE1lbWJlck9iamVjdFtdKSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucy5maW5kSW5kZXgoc3RydWN0RGVmaW5pdGlvbiA9PiBzdHJ1Y3REZWZpbml0aW9uLnN0cnVjdE5hbWUgPT09IHN0cnVjdE5hbWUpO1xuXHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGB1cGRhdGVTdHJ1Y3REZWZpbml0aW9uOiB0aGUgc3RydWN0IHR5cGUgbmFtZSAke3N0cnVjdE5hbWV9IGlzIG5vdCBleGlzdGApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX19zdHJ1Y3REZWZpbml0aW9uc1ttYXRjaGVkSW5kZXhdLm1lbWJlck9iamVjdHMgPSBtZW1iZXJPYmplY3RzO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZUdsb2JhbENvbnN0YW50VmFsdWUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlczogbnVtYmVyW10pIHtcblx0XHRjb25zdCBtYXRjaGVkSW5kZXggPVxuXHRcdFx0dGhpcy5fX2dsb2JhbENvbnN0YW50VmFsdWVzLmZpbmRJbmRleChnbG9iYWxDb25zdGFudFZhbHVlID0+IGdsb2JhbENvbnN0YW50VmFsdWUudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuXHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oYHVwZGF0ZUdsb2JhbENvbnN0YW50VmFsdWU6IHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB0eXBlID0gdGhpcy5fX2dsb2JhbENvbnN0YW50VmFsdWVzW21hdGNoZWRJbmRleF0udHlwZTtcblxuXHRcdGNvbnN0IGlzVmFsaWRDb21wb25lbnROdW1iZXIgPSBVdGlsaXR5Ll9pc1ZhbGlkQ29tcG9uZW50Q291bnQodHlwZSwgdmFsdWVzKTtcblx0XHRpZiAoIWlzVmFsaWRDb21wb25lbnROdW1iZXIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ3VwZGF0ZUdsb2JhbENvbnN0YW50VmFsdWU6IHRoZSBjb21wb25lbnQgY291bnQgaXMgaW52YWxpZCcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzSW50VHlwZSA9IFV0aWxpdHkuX2lzSW50VHlwZSh0eXBlKTtcblx0XHRpZiAoaXNJbnRUeXBlKSB7XG5cdFx0XHRjb25zdCBleGlzdE5vbkludGVnZXJWYWx1ZSA9IFNoYWRlcml0eU9iamVjdENyZWF0b3IuX19leGlzdE5vbkludGVnZXJWYWx1ZSh2YWx1ZXMpO1xuXHRcdFx0aWYgKGV4aXN0Tm9uSW50ZWdlclZhbHVlKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybihgdXBkYXRlR2xvYmFsQ29uc3RhbnRWYWx1ZTogdGhlICR7dmFyaWFibGVOYW1lfSBoYXMgYSBub24taW50ZWdlciB2YWx1ZS5gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXNbbWF0Y2hlZEluZGV4XS52YWx1ZXMgPSB2YWx1ZXM7XG5cdH1cblxuXHRwdWJsaWMgdXBkYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWVzOiB7W2tleVZhcmlhYmxlTmFtZTogc3RyaW5nXTogbnVtYmVyW119KSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdHRoaXMuX19nbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlcy5maW5kSW5kZXgoc3RydWN0VmFsdWUgPT4gc3RydWN0VmFsdWUudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuXHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGB1cGRhdGVHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlOiAgdGhlIHZhcmlhYmxlIG5hbWUgJHt2YXJpYWJsZU5hbWV9IGlzIG5vdCBleGlzdGApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX19nbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlc1ttYXRjaGVkSW5kZXhdLnZhbHVlcyA9IHZhbHVlcztcblx0fVxuXG5cdHB1YmxpYyB1cGRhdGVNYWluRnVuY3Rpb24obWFpbkZ1bmN0aW9uQ29kZUlubmVyOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9fbWFpbkZ1bmN0aW9uQ29kZSA9IG1haW5GdW5jdGlvbkNvZGVJbm5lcjtcblx0fVxuXG5cdC8vIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBjb2xvciB2YXJpYWJsZSBmcm9tIHRoZSBtYWluIGZ1bmN0aW9uIGluIHRoZSBmcmFnbWVudCBzaGFkZXIuXG5cdC8vIHVzZXJzIGhhdmUgdG8gYXNzaWduIHRoZSByZXN1bHQgb2YgZnJhZ21lbnQgc2hhZGVyIGNhbGN1bGF0aW9uIHRvIHRoaXMgdmFyaWFibGUuXG5cdHB1YmxpYyB1cGRhdGVPdXRwdXRDb2xvclZhcmlhYmxlTmFtZShvdXRwdXRDb2xvclZhcmlhYmxlTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKHRoaXMuX19zaGFkZXJTdGFnZSAhPT0gJ2ZyYWdtZW50Jykge1xuXHRcdFx0Y29uc29sZS5lcnJvcigndXBkYXRlT3V0cHV0Q29sb3JWYXJpYWJsZU5hbWU6IHRoaXMgbWV0aG9kIGlzIGZvciBmcmFnbWVudCBzaGFkZXIgb25seScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChvdXRwdXRDb2xvclZhcmlhYmxlTmFtZS5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ3VwZGF0ZU91dHB1dENvbG9yVmFyaWFibGVOYW1lOiBpbnZhbGlkIG91dENvbG9yVmFyaWFibGVOYW1lJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fX291dHB1dENvbG9yVmFyaWFibGVOYW1lID0gb3V0cHV0Q29sb3JWYXJpYWJsZU5hbWU7XG5cdH1cblxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8gcmVtb3ZlIHBhcmFtZXRlcnMgZnVuY3Rpb25zXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHB1YmxpYyByZW1vdmVEZWZpbmVEaXJlY3RpdmUoZGVmaW5lRGlyZWN0aXZlTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID0gdGhpcy5fX2RlZmluZURpcmVjdGl2ZU5hbWVzLmluZGV4T2YoZGVmaW5lRGlyZWN0aXZlTmFtZSk7XG5cblx0XHRpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdyZW1vdmVkRGVmaW5lRGlyZWN0aXZlOiB0aGlzIGRlZmluZSBkaXJlY3RpdmUgaXMgbm90IGV4aXN0Jyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fX2RlZmluZURpcmVjdGl2ZU5hbWVzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUV4dGVuc2lvbihleHRlbnNpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRjb25zdCBtYXRjaGVkSW5kZXggPVxuXHRcdFx0dGhpcy5fX2V4dGVuc2lvbnMuZmluZEluZGV4KGV4dGVuc2lvbiA9PiBleHRlbnNpb24uZXh0ZW5zaW9uTmFtZSA9PT0gZXh0ZW5zaW9uTmFtZSk7XG5cblx0XHRpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdyZW1vdmVFeHRlbnNpb246IHRoaXMgZXh0ZW5zaW9uIGlzIG5vdCBleGlzdCcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX19leHRlbnNpb25zLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZVN0cnVjdERlZmluaXRpb24oc3RydWN0TmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucy5maW5kSW5kZXgoc3RydWN0RGVmaW5pdGlvbiA9PiBzdHJ1Y3REZWZpbml0aW9uLnN0cnVjdE5hbWUgPT09IHN0cnVjdE5hbWUpO1xuXHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGByZW1vdmVTdHJ1Y3REZWZpbml0aW9uOiB0aGUgc3RydWN0IHR5cGUgbmFtZSAke3N0cnVjdE5hbWV9IGlzIG5vdCBleGlzdGApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucy5zcGxpY2UobWF0Y2hlZEluZGV4LCAxKTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVHbG9iYWxDb25zdGFudFZhbHVlKHZhcmlhYmxlTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdHRoaXMuX19nbG9iYWxDb25zdGFudFZhbHVlcy5maW5kSW5kZXgoZ2xvYmFsQ29uc3RhbnRWYWx1ZSA9PiBnbG9iYWxDb25zdGFudFZhbHVlLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcblx0XHRpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKGByZW1vdmVHbG9iYWxDb25zdGFudFZhbHVlOiB0aGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX0gaXMgbm90IGV4aXN0YCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fX2dsb2JhbENvbnN0YW50VmFsdWVzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWUodmFyaWFibGVOYW1lOiBzdHJpbmcpIHtcblx0XHRjb25zdCBtYXRjaGVkSW5kZXggPVxuXHRcdFx0dGhpcy5fX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzLmZpbmRJbmRleChzdHJ1Y3RWYWx1ZSA9PiBzdHJ1Y3RWYWx1ZS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG5cdFx0aWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYHVwZGF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWU6ICB0aGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX0gaXMgbm90IGV4aXN0YCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUF0dHJpYnV0ZURlY2xhcmF0aW9uKHZhcmlhYmxlTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdHRoaXMuX19hdHRyaWJ1dGVzLmZpbmRJbmRleChhdHRyaWJ1dGUgPT4gYXR0cmlidXRlLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcblx0XHRpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKGByZW1vdmVBdHRyaWJ1dGU6IHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9fYXR0cmlidXRlcy5zcGxpY2UobWF0Y2hlZEluZGV4LCAxKTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVWYXJ5aW5nRGVjbGFyYXRpb24odmFyaWFibGVOYW1lOiBzdHJpbmcpIHtcblx0XHRjb25zdCBtYXRjaGVkSW5kZXggPVxuXHRcdFx0dGhpcy5fX3ZhcnlpbmdzLmZpbmRJbmRleCh2YXJ5aW5nID0+IHZhcnlpbmcudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuXHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oYHJlbW92ZVZhcnlpbmc6IHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9fdmFyeWluZ3Muc3BsaWNlKG1hdGNoZWRJbmRleCwgMSk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlVW5pZm9ybURlY2xhcmF0aW9uKHZhcmlhYmxlTmFtZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdHRoaXMuX191bmlmb3Jtcy5maW5kSW5kZXgodW5pZm9ybSA9PiB1bmlmb3JtLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcblx0XHRpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKGByZW1vdmVVbmlmb3JtOiB0aGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX0gaXMgbm90IGV4aXN0YCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fX3VuaWZvcm1zLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZVVuaWZvcm1TdHJ1Y3REZWNsYXJhdGlvbih2YXJpYWJsZU5hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IG1hdGNoZWRJbmRleCA9XG5cdFx0XHR0aGlzLl9fdW5pZm9ybVN0cnVjdHMuZmluZEluZGV4KHVuaWZvcm1TdHJ1Y3QgPT4gdW5pZm9ybVN0cnVjdC52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG5cdFx0aWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbnNvbGUud2FybihgcmVtb3ZlVW5pZm9ybVN0cnVjdERlY2xhcmF0aW9uOiB0aGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX0gaXMgbm90IGV4aXN0YCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fX3VuaWZvcm1TdHJ1Y3RzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZVVuaWZvcm1CdWZmZXJPYmplY3REZWNsYXJhdGlvbihibG9ja05hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IG1hdGNoZWRJbmRleCA9XG5cdFx0XHR0aGlzLl9fdW5pZm9ybUJ1ZmZlck9iamVjdHMuZmluZEluZGV4KHVibyA9PiB1Ym8uYmxvY2tOYW1lID09PSBibG9ja05hbWUpO1xuXHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oYHJlbW92ZVVuaWZvcm1TdHJ1Y3REZWNsYXJhdGlvbjogdGhlIHZhcmlhYmxlIG5hbWUgJHtibG9ja05hbWV9IGlzIG5vdCBleGlzdGApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX191bmlmb3JtQnVmZmVyT2JqZWN0cy5zcGxpY2UobWF0Y2hlZEluZGV4LCAxKTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVGdW5jdGlvbkRlZmluaXRpb24oZnVuY3Rpb25JZDogbnVtYmVyKSB7XG5cdFx0dGhpcy5fX2ZpbGxFbXB0eUZ1bmN0aW9ucygpO1xuXG5cdFx0Ly8gaWQgaXMgdG9vIHNtYWxsIG9yIHRvbyBiaWdcblx0XHRpZiAoZnVuY3Rpb25JZCA8IDAgfHwgZnVuY3Rpb25JZCA+PSB0aGlzLl9fZnVuY3Rpb25JZENvdW50KSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ3JlbW92ZUZ1bmN0aW9uRGVmaW5pdGlvbjogaW52YWxpZCBmdW5jdGlvbiBpZCcpXG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBmdW5jdGlvbk9iamVjdHMgb2YgdGhpcy5fX2Z1bmN0aW9ucykge1xuXHRcdFx0Y29uc3QgbWF0Y2hlZEluZGV4ID1cblx0XHRcdFx0ZnVuY3Rpb25PYmplY3RzLmZpbmRJbmRleChmdW5jdGlvbk9iamVjdCA9PiBmdW5jdGlvbk9iamVjdC5mdW5jdGlvbklkID09PSBmdW5jdGlvbklkKTtcblx0XHRcdGlmIChtYXRjaGVkSW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdGZ1bmN0aW9uT2JqZWN0cy5zcGxpY2UobWF0Y2hlZEluZGV4LCAxKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnNvbGUud2FybihgcmVtb3ZlRnVuY3Rpb25EZWZpbml0aW9uOiBub3QgZm91bmQgdGhlIGZ1bmN0aW9uIG9mIGZ1bmN0aW9uSWQgJHtmdW5jdGlvbklkfWApO1xuXHR9XG5cblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vIGNyZWF0ZSBzaGFkZXJpdHkgb2JqZWN0IGZ1bmN0aW9uXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHB1YmxpYyBjcmVhdGVTaGFkZXJpdHlPYmplY3QoKTogU2hhZGVyaXR5T2JqZWN0IHtcblx0XHRjb25zdCBzaGFkZXJpdHlPYmogPSB7XG5cdFx0XHRjb2RlOiB0aGlzLl9fY3JlYXRlU2hhZGVyQ29kZSgpLFxuXHRcdFx0c2hhZGVyU3RhZ2U6IHRoaXMuX19zaGFkZXJTdGFnZSxcblx0XHRcdGlzRnJhZ21lbnRTaGFkZXI6IHRoaXMuX19zaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50Jyxcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHNoYWRlcml0eU9iajtcblx0fVxuXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHQvLyBwcml2YXRlIG1ldGhvZHNcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0cHJpdmF0ZSBzdGF0aWMgX19leGlzdE5vbkludGVnZXJWYWx1ZSh2YWx1ZXM6IG51bWJlcltdKSB7XG5cdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcblx0XHRcdGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIFRPRE86IGltcGxlbWVudCBzaGFkZXIgY29kZSBpbXBvcnQgZmVhdHVyZSAobG93IHByaW9yaXR5KVxuXHQvLyBwdWJsaWMgaW1wb3J0U2hhZGVyQ29kZShjb2RlOiBzdHJpbmcpIHt9XG5cblx0Ly8gbmVlZCB0byBhcHBseSBTaGFkZXJpdHkudHJhbnNmb3JtVG9HTFNMRVMxLCB0cmFuc2Zvcm1Ub0dMU0xFUzMgb3IgdHJhbnNmb3JtVG8gbWV0aG9kXG5cdHByaXZhdGUgX19jcmVhdGVTaGFkZXJDb2RlKCk6IHN0cmluZyB7XG5cdFx0dGhpcy5fX2ZpbGxFbXB0eUZ1bmN0aW9ucygpO1xuXG5cdFx0Y29uc3QgY29kZVxuXHRcdFx0PSBgI3ZlcnNpb24gMzAwIGVzXFxuXFxuYFxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlRGVmaW5lRGlyZWN0aXZlU2hhZGVyQ29kZSgpXG5cdFx0XHQrIHRoaXMuX19jcmVhdGVFeHRlbnNpb25TaGFkZXJDb2RlKClcblx0XHRcdCsgdGhpcy5fX2NyZWF0ZUdsb2JhbFByZWNpc2lvblNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlU3RydWN0RGVmaW5pdGlvblNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlR2xvYmFsQ29uc3RhbnRWYWx1ZVNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25TaGFkZXJDb2RlKClcblx0XHRcdCsgdGhpcy5fX2NyZWF0ZVZhcnlpbmdEZWNsYXJhdGlvblNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlT3V0cHV0Q29sb3JEZWNsYXJhdGlvblNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlVW5pZm9ybURlY2xhcmF0aW9uU2hhZGVyQ29kZSgpXG5cdFx0XHQrIHRoaXMuX19jcmVhdGVVbmlmb3JtU3RydWN0RGVjbGFyYXRpb25TaGFkZXJDb2RlKClcblx0XHRcdCsgdGhpcy5fX2NyZWF0ZVVuaWZvcm1CdWZmZXJPYmplY3RTaGFkZXJDb2RlKClcblx0XHRcdCsgdGhpcy5fX2NyZWF0ZUZ1bmN0aW9uRGVmaW5pdGlvblNoYWRlckNvZGUoKVxuXHRcdFx0KyB0aGlzLl9fY3JlYXRlTWFpbkZ1bmN0aW9uRGVmaW5pdGlvblNoYWRlckNvZGUoKTtcblxuXHRcdHJldHVybiBjb2RlO1xuXHR9XG5cblx0cHJpdmF0ZSBfX2ZpbGxFbXB0eUZ1bmN0aW9ucygpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19mdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRoaXMuX19mdW5jdGlvbnNbaV0gPSB0aGlzLl9fZnVuY3Rpb25zW2ldID8/IFtdO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX19jcmVhdGVEZWZpbmVEaXJlY3RpdmVTaGFkZXJDb2RlKCk6IHN0cmluZyB7XG5cdFx0bGV0IHNoYWRlckNvZGUgPSAnJztcblx0XHRmb3IgKGNvbnN0IGRlZmluZURpcmVjdGl2ZU5hbWUgb2YgdGhpcy5fX2RlZmluZURpcmVjdGl2ZU5hbWVzKSB7XG5cdFx0XHRzaGFkZXJDb2RlICs9IGAjZGVmaW5lICR7ZGVmaW5lRGlyZWN0aXZlTmFtZX1cXG5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBVdGlsaXR5Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7O1xuXHR9XG5cblx0cHJpdmF0ZSBfX2NyZWF0ZUV4dGVuc2lvblNoYWRlckNvZGUoKTogc3RyaW5nIHtcblx0XHRsZXQgc2hhZGVyQ29kZSA9ICcnO1xuXHRcdGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIHRoaXMuX19leHRlbnNpb25zKSB7XG5cdFx0XHRzaGFkZXJDb2RlICs9IGAjZXh0ZW5zaW9uICR7ZXh0ZW5zaW9uLmV4dGVuc2lvbk5hbWV9OiAke2V4dGVuc2lvbi5iZWhhdmlvcn1cXG5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBVdGlsaXR5Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG5cdH1cblxuXHQvL1RPRE86IHJlbW92ZSBuZWVkbGVzcyBwcmVjaXNpb25zXG5cdHByaXZhdGUgX19jcmVhdGVHbG9iYWxQcmVjaXNpb25TaGFkZXJDb2RlKCk6IHN0cmluZyB7XG5cdFx0bGV0IHNoYWRlckNvZGUgPSAnJztcblx0XHRmb3IgKGNvbnN0IHR5cGUgaW4gdGhpcy5fX2dsb2JhbFByZWNpc2lvbikge1xuXHRcdFx0Y29uc3QgcHJlY2lzaW9uVHlwZSA9IHR5cGUgYXMgU2hhZGVyUHJlY2lzaW9uT2JqZWN0S2V5O1xuXHRcdFx0Y29uc3QgcHJlY2lzaW9uUXVhbGlmaWVyID0gdGhpcy5fX2dsb2JhbFByZWNpc2lvbltwcmVjaXNpb25UeXBlXTtcblxuXHRcdFx0c2hhZGVyQ29kZSArPSBgcHJlY2lzaW9uICR7cHJlY2lzaW9uUXVhbGlmaWVyfSAke3ByZWNpc2lvblR5cGV9O1xcbmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFV0aWxpdHkuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcblx0fVxuXG5cdHByaXZhdGUgX19jcmVhdGVTdHJ1Y3REZWZpbml0aW9uU2hhZGVyQ29kZSgpOiBzdHJpbmcge1xuXHRcdGxldCBzaGFkZXJDb2RlID0gJyc7XG5cdFx0Zm9yIChjb25zdCBzdHJ1Y3REZWZpbml0aW9uIG9mIHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucykge1xuXHRcdFx0c2hhZGVyQ29kZSArPSBgc3RydWN0ICR7c3RydWN0RGVmaW5pdGlvbi5zdHJ1Y3ROYW1lfSB7XFxuYDtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgdmFyaWFibGUgPSBzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHNbaV07XG5cblx0XHRcdFx0c2hhZGVyQ29kZSArPSBgICBgO1xuXHRcdFx0XHRpZiAodmFyaWFibGUucHJlY2lzaW9uICE9IG51bGwpIHtcblx0XHRcdFx0XHRzaGFkZXJDb2RlICs9IGAke3ZhcmlhYmxlLnByZWNpc2lvbn0gYDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gYCR7dmFyaWFibGUudHlwZX0gJHt2YXJpYWJsZS5tZW1iZXJOYW1lfTtcXG5gO1xuXHRcdFx0fVxuXG5cdFx0XHRzaGFkZXJDb2RlICs9IGB9O1xcbmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFV0aWxpdHkuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcblx0fVxuXG5cdHByaXZhdGUgX19jcmVhdGVHbG9iYWxDb25zdGFudFZhbHVlU2hhZGVyQ29kZSgpOiBzdHJpbmcge1xuXHRcdGxldCBzaGFkZXJDb2RlID0gJyc7XG5cdFx0Zm9yIChjb25zdCBnbG9iYWxDb25zdGFudFZhbHVlIG9mIHRoaXMuX19nbG9iYWxDb25zdGFudFZhbHVlcykge1xuXHRcdFx0Y29uc3QgdHlwZSA9IGdsb2JhbENvbnN0YW50VmFsdWUudHlwZTtcblx0XHRcdGNvbnN0IHZhcmlhYmxlTmFtZSA9IGdsb2JhbENvbnN0YW50VmFsdWUudmFyaWFibGVOYW1lO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBnbG9iYWxDb25zdGFudFZhbHVlLnZhbHVlcztcblxuXHRcdFx0c2hhZGVyQ29kZSArPSBgY29uc3QgJHt0eXBlfSAke3ZhcmlhYmxlTmFtZX0gPSAke3R5cGV9KGA7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gdmFsdWVbaV0gKyAnLCAnO1xuXHRcdFx0fVxuXG5cdFx0XHRzaGFkZXJDb2RlID0gc2hhZGVyQ29kZS5yZXBsYWNlKC8sXFxzJC8sICcpO1xcbicpO1xuXHRcdH1cblxuXHRcdHJldHVybiBVdGlsaXR5Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG5cdH1cblxuXHRwcml2YXRlIF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGUoKTogc3RyaW5nIHtcblx0XHRsZXQgc2hhZGVyQ29kZSA9ICcnO1xuXHRcdGZvciAoY29uc3Qgc3RydWN0VmFsdWUgb2YgdGhpcy5fX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBtYXRjaGVkSW5kZXggPVxuXHRcdFx0XHR0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnMuZmluZEluZGV4KGRlZmluaXRpb24gPT4gZGVmaW5pdGlvbi5zdHJ1Y3ROYW1lID09PSBzdHJ1Y3RWYWx1ZS5zdHJ1Y3ROYW1lKTtcblx0XHRcdGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGU6IHRoZSBzdHJ1Y3QgdHlwZSAke3N0cnVjdFZhbHVlLnN0cnVjdE5hbWV9IGlzIG5vdCBkZWZpbmVkYCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzaGFkZXJDb2RlICs9IGBjb25zdCAke3N0cnVjdFZhbHVlLnN0cnVjdE5hbWV9ICR7c3RydWN0VmFsdWUudmFyaWFibGVOYW1lfSA9ICR7c3RydWN0VmFsdWUuc3RydWN0TmFtZX0gKFxcbmA7XG5cblx0XHRcdGNvbnN0IHN0cnVjdERlZmluaXRpb24gPSB0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnNbbWF0Y2hlZEluZGV4XTtcblx0XHRcdGlmIChzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdHJ1Y3RWYWx1ZS52YWx1ZXMpLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBfX2NyZWF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWVTaGFkZXJDb2RlOiBJbnZhbGlkIG51bWJlciBvZiB2YXJpYWJsZXMgdGhhdCAke3N0cnVjdFZhbHVlLnZhcmlhYmxlTmFtZX0gaGFzYCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYXNTYW1wbGVyVHlwZSA9XG5cdFx0XHRcdHN0cnVjdERlZmluaXRpb24ubWVtYmVyT2JqZWN0cy5zb21lKG1lbWJlck9iamVjdCA9PiBVdGlsaXR5Ll9pc1NhbXBsZXJUeXBlKG1lbWJlck9iamVjdC50eXBlKSk7XG5cdFx0XHRpZiAoaGFzU2FtcGxlclR5cGUpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgX19jcmVhdGVHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlU2hhZGVyQ29kZTogQ29uc3RhbnRTdHJ1Y3RWYWx1ZSAoJHtzdHJ1Y3RWYWx1ZS52YXJpYWJsZU5hbWV9KSBjYW5ub3QgaGF2ZSBzYW1wbGVyIHR5cGUgcGFyYW1ldGVyYCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHN0cnVjdERlZmluaXRpb24ubWVtYmVyT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCB2YXJpYWJsZU5hbWUgPSBzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHNbaV0ubWVtYmVyTmFtZTtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBzdHJ1Y3RWYWx1ZS52YWx1ZXNbdmFyaWFibGVOYW1lXVxuXHRcdFx0XHRpZiAodmFsdWUgPT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGU6ICR7c3RydWN0VmFsdWUudmFyaWFibGVOYW1lfSBkb2VzIG5vdCBoYXZlIHRoZSB2YWx1ZSBvZiAke3ZhcmlhYmxlTmFtZX1gKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSBzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHNbaV0udHlwZTtcblx0XHRcdFx0Y29uc3QgaXNWYWxpZENvbXBvbmVudE51bWJlciA9IFV0aWxpdHkuX2lzVmFsaWRDb21wb25lbnRDb3VudCh0eXBlLCB2YWx1ZSk7XG5cdFx0XHRcdGlmICghaXNWYWxpZENvbXBvbmVudE51bWJlcikge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGU6IHRoZSBjb21wb25lbnQgY291bnQgb2YgJHt2YXJpYWJsZU5hbWV9IGluICR7c3RydWN0VmFsdWUudmFyaWFibGVOYW1lfSBpcyBpbnZhbGlkYCk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzaGFkZXJDb2RlICs9IGAgICR7dHlwZX0oYDtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHNoYWRlckNvZGUgKz0gdmFsdWVbaV0gKyAnLCAnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2hhZGVyQ29kZSA9IHNoYWRlckNvZGUucmVwbGFjZSgvLFxccyQvLCAnKSxcXG4nKTtcblx0XHRcdH1cblxuXHRcdFx0c2hhZGVyQ29kZSA9IHNoYWRlckNvZGUucmVwbGFjZSgvLFxcbiQvLCAnXFxuKTtcXG4nKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gVXRpbGl0eS5fYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNoYWRlckNvZGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBfX2NyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9uU2hhZGVyQ29kZSgpOiBzdHJpbmcge1xuXHRcdGxldCBzaGFkZXJDb2RlID0gJyc7XG5cdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgdGhpcy5fX2F0dHJpYnV0ZXMpIHtcblx0XHRcdGlmIChhdHRyaWJ1dGUubG9jYXRpb24gIT0gbnVsbCkge1xuXHRcdFx0XHRzaGFkZXJDb2RlICs9IGBsYXlvdXQgKGxvY2F0aW9uID0gJHthdHRyaWJ1dGUubG9jYXRpb259KSBgO1xuXHRcdFx0fVxuXG5cdFx0XHRzaGFkZXJDb2RlICs9IGBpbiBgO1xuXG5cdFx0XHRpZiAoYXR0cmlidXRlLnByZWNpc2lvbiAhPSBudWxsKSB7XG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gYCR7YXR0cmlidXRlLnByZWNpc2lvbn0gYDtcblx0XHRcdH1cblxuXHRcdFx0c2hhZGVyQ29kZSArPSBgJHthdHRyaWJ1dGUudHlwZX0gJHthdHRyaWJ1dGUudmFyaWFibGVOYW1lfTtcXG5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBVdGlsaXR5Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG5cdH1cblxuXHRwcml2YXRlIF9fY3JlYXRlVmFyeWluZ0RlY2xhcmF0aW9uU2hhZGVyQ29kZSgpOiBzdHJpbmcge1xuXHRcdGxldCBzaGFkZXJDb2RlID0gJyc7XG5cdFx0Zm9yIChjb25zdCB2YXJ5aW5nIG9mIHRoaXMuX192YXJ5aW5ncykge1xuXHRcdFx0aWYgKHZhcnlpbmcuaW50ZXJwb2xhdGlvblR5cGUgIT0gbnVsbCkge1xuXHRcdFx0XHRzaGFkZXJDb2RlICs9IGAke3ZhcnlpbmcuaW50ZXJwb2xhdGlvblR5cGV9IGA7XG5cdFx0XHR9XG5cblx0XHRcdHNoYWRlckNvZGUgKz0gdGhpcy5fX3NoYWRlclN0YWdlID09ICd2ZXJ0ZXgnID8gYG91dCBgIDogYGluIGA7XG5cblx0XHRcdGlmICh2YXJ5aW5nLnByZWNpc2lvbiAhPSBudWxsKSB7XG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gYCR7dmFyeWluZy5wcmVjaXNpb259IGA7XG5cdFx0XHR9XG5cblx0XHRcdHNoYWRlckNvZGUgKz0gYCR7dmFyeWluZy50eXBlfSAke3ZhcnlpbmcudmFyaWFibGVOYW1lfTtcXG5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBVdGlsaXR5Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG5cdH1cblxuXHQvL1RPRE86IHRyYW5zbGF0ZSB3aGVuIGdsc2wgZXMxXG5cdHByaXZhdGUgX19jcmVhdGVPdXRwdXRDb2xvckRlY2xhcmF0aW9uU2hhZGVyQ29kZSgpOiBzdHJpbmcge1xuXHRcdGlmICh0aGlzLl9fc2hhZGVyU3RhZ2UgIT09ICdmcmFnbWVudCcpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRyZXR1cm4gYGxheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0ICR7dGhpcy5fX291dHB1dENvbG9yVmFyaWFibGVOYW1lfTtcXG5cXG5gO1xuXHR9XG5cblx0cHJpdmF0ZSBfX2NyZWF0ZVVuaWZvcm1EZWNsYXJhdGlvblNoYWRlckNvZGUoKTogc3RyaW5nIHtcblx0XHRsZXQgc2hhZGVyQ29kZSA9ICcnO1xuXHRcdGZvciAoY29uc3QgdW5pZm9ybSBvZiB0aGlzLl9fdW5pZm9ybXMpIHtcblx0XHRcdHNoYWRlckNvZGUgKz0gYHVuaWZvcm0gYDtcblxuXHRcdFx0aWYgKHVuaWZvcm0ucHJlY2lzaW9uICE9IG51bGwpIHtcblx0XHRcdFx0c2hhZGVyQ29kZSArPSBgJHt1bmlmb3JtLnByZWNpc2lvbn0gYDtcblx0XHRcdH1cblxuXHRcdFx0c2hhZGVyQ29kZSArPSBgJHt1bmlmb3JtLnR5cGV9ICR7dW5pZm9ybS52YXJpYWJsZU5hbWV9O1xcbmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFV0aWxpdHkuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcblx0fVxuXG5cdHByaXZhdGUgX19jcmVhdGVVbmlmb3JtU3RydWN0RGVjbGFyYXRpb25TaGFkZXJDb2RlKCk6IHN0cmluZyB7XG5cdFx0bGV0IHNoYWRlckNvZGUgPSAnJztcblx0XHRmb3IgKGNvbnN0IHVuaWZvcm1TdHJ1Y3Qgb2YgdGhpcy5fX3VuaWZvcm1TdHJ1Y3RzKSB7XG5cdFx0XHRjb25zdCBzdHJ1Y3ROYW1lID0gdW5pZm9ybVN0cnVjdC5zdHJ1Y3ROYW1lO1xuXG5cdFx0XHRjb25zdCBleGlzdFN0cnVjdERlZmluaXRpb24gPVxuXHRcdFx0XHR0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnMuc29tZShkZWZpbml0aW9uID0+IGRlZmluaXRpb24uc3RydWN0TmFtZSA9PT0gc3RydWN0TmFtZSk7XG5cdFx0XHRpZiAoIWV4aXN0U3RydWN0RGVmaW5pdGlvbikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBfX2NyZWF0ZVVuaWZvcm1TdHJ1Y3REZWNsYXJhdGlvblNoYWRlckNvZGU6IHRoZSBzdHJ1Y3QgdHlwZSAke3N0cnVjdE5hbWV9IGlzIG5vdCBkZWZpbmVkYCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzaGFkZXJDb2RlICs9IGB1bmlmb3JtICR7c3RydWN0TmFtZX0gJHt1bmlmb3JtU3RydWN0LnZhcmlhYmxlTmFtZX07XFxuYDtcblx0XHR9XG5cblx0XHRyZXR1cm4gVXRpbGl0eS5fYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNoYWRlckNvZGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBfX2NyZWF0ZVVuaWZvcm1CdWZmZXJPYmplY3RTaGFkZXJDb2RlKCk6IHN0cmluZyB7XG5cdFx0bGV0IHNoYWRlckNvZGUgPSAnJztcblx0XHRmb3IgKGNvbnN0IHVibyBvZiB0aGlzLl9fdW5pZm9ybUJ1ZmZlck9iamVjdHMpIHtcblx0XHRcdHNoYWRlckNvZGUgKz0gYGxheW91dCAoc3RkMTQwKSB1bmlmb3JtICR7dWJvLmJsb2NrTmFtZX0ge1xcbmA7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdWJvLnZhcmlhYmxlT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCB2YXJpYWJsZU9iaiA9IHViby52YXJpYWJsZU9iamVjdHNbaV07XG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gYCAgJHt2YXJpYWJsZU9iai50eXBlfSAke3ZhcmlhYmxlT2JqLnZhcmlhYmxlTmFtZX07XFxuYDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHViby5pbnN0YW5jZU5hbWUgIT0gbnVsbCkge1xuXHRcdFx0XHRzaGFkZXJDb2RlICs9IGB9ICR7dWJvLmluc3RhbmNlTmFtZX07XFxuYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gYH07XFxuYDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gVXRpbGl0eS5fYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNoYWRlckNvZGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBfX2NyZWF0ZUZ1bmN0aW9uRGVmaW5pdGlvblNoYWRlckNvZGUoKTogc3RyaW5nIHtcblx0XHRsZXQgc2hhZGVyQ29kZSA9ICcnO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX2Z1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgZnVuY3Rpb25PYmplY3RzID0gdGhpcy5fX2Z1bmN0aW9uc1tpXTtcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZnVuY3Rpb25PYmplY3RzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHNoYWRlckNvZGUgKz0gZnVuY3Rpb25PYmplY3RzW2pdLmZ1bmN0aW9uQ29kZSArIGBcXG5gO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBVdGlsaXR5Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG5cdH1cblxuXHRwcml2YXRlIF9fY3JlYXRlTWFpbkZ1bmN0aW9uRGVmaW5pdGlvblNoYWRlckNvZGUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5fX21haW5GdW5jdGlvbkNvZGUgKyBgXFxuYDtcblx0fVxufVxuIiwiaW1wb3J0IHtTaGFkZXJBdHRyaWJ1dGVWYXJUeXBlLCBTaGFkZXJDb25zdGFudFZhbHVlVmFyVHlwZUVTMywgU2hhZGVyVW5pZm9ybVZhclR5cGVFUzMsIFNoYWRlclZhcnlpbmdWYXJUeXBlfSBmcm9tICcuLi90eXBlcy90eXBlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbGl0eSB7XG5cdHN0YXRpYyBfc3BsaXRCeUxpbmVGZWVkQ29kZShzb3VyY2U6IHN0cmluZykge1xuXHRcdHJldHVybiBzb3VyY2Uuc3BsaXQoL1xcclxcbnxcXG4vKTtcblx0fVxuXG5cdHN0YXRpYyBfam9pblNwbGl0dGVkTGluZShzcGxpdHRlZExpbmU6IHN0cmluZ1tdKSB7XG5cdFx0cmV0dXJuIHNwbGl0dGVkTGluZS5qb2luKCdcXG4nKTtcblx0fVxuXG5cdHN0YXRpYyBfYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNvdXJjZTogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNvdXJjZSA9PT0gJycgPyBzb3VyY2UgOiBzb3VyY2UgKyAnXFxuJztcblx0fVxuXG5cdHN0YXRpYyBfY29tcG9uZW50TnVtYmVyKFxuXHRcdHR5cGU6IFNoYWRlckNvbnN0YW50VmFsdWVWYXJUeXBlRVMzIHwgU2hhZGVyQXR0cmlidXRlVmFyVHlwZSB8IFNoYWRlclZhcnlpbmdWYXJUeXBlIHwgU2hhZGVyVW5pZm9ybVZhclR5cGVFUzNcblx0KSB7XG5cdFx0bGV0IGNvbXBvbmVudE51bWJlcjtcblx0XHRpZiAoXG5cdFx0XHR0eXBlID09PSAnZmxvYXQnIHx8IHR5cGUgPT09ICdpbnQnIHx8IHR5cGUgPT09ICdib29sJyB8fCB0eXBlID09PSAndWludCcgfHxcblx0XHRcdHR5cGUgPT09ICdzYW1wbGVyMkQnIHx8IHR5cGUgPT09ICdzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ3NhbXBsZXIzRCcgfHwgdHlwZSA9PT0gJ3NhbXBsZXIyREFycmF5JyB8fFxuXHRcdFx0dHlwZSA9PT0gJ2lzYW1wbGVyMkQnIHx8IHR5cGUgPT09ICdpc2FtcGxlckN1YmUnIHx8IHR5cGUgPT09ICdpc2FtcGxlcjNEJyB8fCB0eXBlID09PSAnaXNhbXBsZXIyREFycmF5JyB8fFxuXHRcdFx0dHlwZSA9PT0gJ3VzYW1wbGVyMkQnIHx8IHR5cGUgPT09ICd1c2FtcGxlckN1YmUnIHx8IHR5cGUgPT09ICd1c2FtcGxlcjNEJyB8fCB0eXBlID09PSAndXNhbXBsZXIyREFycmF5JyB8fFxuXHRcdFx0dHlwZSA9PT0gJ3NhbXBsZXIyRFNoYWRvdycgfHwgdHlwZSA9PT0gJ3NhbXBsZXJDdWJlU2hhZG93JyB8fCB0eXBlID09PSAnc2FtcGxlcjJEQXJyYXlTaGFkb3cnXG5cdFx0KSB7XG5cdFx0XHRjb21wb25lbnROdW1iZXIgPSAxO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZlYzInIHx8IHR5cGUgPT09ICdpdmVjMicgfHwgdHlwZSA9PT0gJ2J2ZWMyJyB8fCB0eXBlID09PSAndXZlYzInKSB7XG5cdFx0XHRjb21wb25lbnROdW1iZXIgPSAyO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZlYzMnIHx8IHR5cGUgPT09ICdpdmVjMycgfHwgdHlwZSA9PT0gJ2J2ZWMzJyB8fCB0eXBlID09PSAndXZlYzMnKSB7XG5cdFx0XHRjb21wb25lbnROdW1iZXIgPSAzO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZlYzQnIHx8IHR5cGUgPT09ICdpdmVjNCcgfHwgdHlwZSA9PT0gJ2J2ZWM0JyB8fCB0eXBlID09PSAndXZlYzQnIHx8IHR5cGUgPT09ICdtYXQyJyB8fCB0eXBlID09PSAnbWF0MngyJykge1xuXHRcdFx0Y29tcG9uZW50TnVtYmVyID0gNDtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdtYXQyeDMnIHx8IHR5cGUgPT09ICdtYXQzeDInKSB7XG5cdFx0XHRjb21wb25lbnROdW1iZXIgPSA2O1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ21hdDJ4NCcgfHwgdHlwZSA9PT0gJ21hdDR4MicpIHtcblx0XHRcdGNvbXBvbmVudE51bWJlciA9IDg7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAnbWF0MycgfHwgdHlwZSA9PT0gJ21hdDN4MycpIHtcblx0XHRcdGNvbXBvbmVudE51bWJlciA9IDk7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAnbWF0M3g0JyB8fCB0eXBlID09PSAnbWF0NHgzJykge1xuXHRcdFx0Y29tcG9uZW50TnVtYmVyID0gMTI7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAnbWF0NCcgfHwgdHlwZSA9PT0gJ21hdDR4NCcpIHtcblx0XHRcdGNvbXBvbmVudE51bWJlciA9IDE2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB1bmtub3duIHR5cGVcblx0XHRcdGNvbXBvbmVudE51bWJlciA9IDA7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdVdGlsaXR5Ll9jb21wb25lbnROdW1iZXI6IGRldGVjdCB1bmtub3duIHR5cGUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcG9uZW50TnVtYmVyO1xuXHR9XG5cblx0c3RhdGljIF9pc0ludFR5cGUoXG5cdFx0dHlwZTogU2hhZGVyQ29uc3RhbnRWYWx1ZVZhclR5cGVFUzMgfCBTaGFkZXJBdHRyaWJ1dGVWYXJUeXBlIHwgU2hhZGVyVmFyeWluZ1ZhclR5cGUgfCBTaGFkZXJVbmlmb3JtVmFyVHlwZUVTM1xuXHQpIHtcblx0XHRpZiAoXG5cdFx0XHR0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAnaXZlYzInIHx8IHR5cGUgPT09ICdpdmVjMycgfHwgdHlwZSA9PT0gJ2l2ZWM0JyB8fFxuXHRcdFx0dHlwZSA9PT0gJ3VpbnQnIHx8IHR5cGUgPT09ICd1dmVjMicgfHwgdHlwZSA9PT0gJ3V2ZWMzJyB8fCB0eXBlID09PSAndXZlYzQnXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHN0YXRpYyBfaXNWYWxpZENvbXBvbmVudENvdW50KFxuXHRcdHR5cGU6IFNoYWRlckNvbnN0YW50VmFsdWVWYXJUeXBlRVMzIHwgU2hhZGVyQXR0cmlidXRlVmFyVHlwZSB8IFNoYWRlclZhcnlpbmdWYXJUeXBlIHwgU2hhZGVyVW5pZm9ybVZhclR5cGVFUzMsXG5cdFx0dmFsdWVzOiBudW1iZXJbXVxuXHQpIHtcblx0XHRjb25zdCB2YWxpZENvbXBvbmVudENvdW50ID0gVXRpbGl0eS5fY29tcG9uZW50TnVtYmVyKHR5cGUpO1xuXHRcdGlmICh2YWxpZENvbXBvbmVudENvdW50ID09PSB2YWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0c3RhdGljIF9pc1NhbXBsZXJUeXBlKFxuXHRcdHR5cGU6IFNoYWRlckNvbnN0YW50VmFsdWVWYXJUeXBlRVMzIHwgU2hhZGVyQXR0cmlidXRlVmFyVHlwZSB8IFNoYWRlclZhcnlpbmdWYXJUeXBlIHwgU2hhZGVyVW5pZm9ybVZhclR5cGVFUzNcblx0KSB7XG5cdFx0aWYgKFxuXHRcdFx0dHlwZSA9PT0gJ3NhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ3NhbXBsZXJDdWJlJyB8fCB0eXBlID09PSAnc2FtcGxlcjNEJyB8fCB0eXBlID09PSAnc2FtcGxlcjJEQXJyYXknIHx8XG5cdFx0XHR0eXBlID09PSAnaXNhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ2lzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ2lzYW1wbGVyM0QnIHx8IHR5cGUgPT09ICdpc2FtcGxlcjJEQXJyYXknIHx8XG5cdFx0XHR0eXBlID09PSAndXNhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ3VzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ3VzYW1wbGVyM0QnIHx8IHR5cGUgPT09ICd1c2FtcGxlcjJEQXJyYXknIHx8XG5cdFx0XHR0eXBlID09PSAnc2FtcGxlcjJEU2hhZG93JyB8fCB0eXBlID09PSAnc2FtcGxlckN1YmVTaGFkb3cnIHx8IHR5cGUgPT09ICdzYW1wbGVyMkRBcnJheVNoYWRvdydcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 /***/ }), /***/ "./src/effekseer/EffekseerComponent.ts": /*!*********************************************!*\ !*** ./src/effekseer/EffekseerComponent.ts ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EffekseerComponent: () => (/* binding */ EffekseerComponent) /* harmony export */ }); /* harmony import */ var _foundation_core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _foundation_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); /// class EffekseerComponent extends _foundation_core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.type = 'efk'; this.playJustAfterLoaded = false; this.isLoop = false; this.isPause = false; this.randomSeed = -1; this.isImageLoadWithCredential = false; this.__speed = 1; this.__isInitialized = false; this.isLoadEffect = false; } static get componentTID() { return _foundation_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__.WellKnownComponentTIDs.EffekseerComponentTID; } cancelLoop() { clearInterval(this.__timer); } isPlay() { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__handle)) { if (this.__handle.exists) { return !this.isPause; } else { return false; } } else { return false; } } play() { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__context)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.warn('No Effekseer context yet'); return false; } if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__effect)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.warn('No Effekseer effect yet'); return false; } this.stop(); this.isPause = false; this.__handle = this.__context.play(this.__effect, 0, 0, 0); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__handle) && _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__handle.setRandomSeed) && this.randomSeed > 0) { this.__handle.setRandomSeed(this.randomSeed); } // if (this.isLoop) { // this.__timer = setTimeout(() => { // this.play(); // }, 500); // } return true; } continue() { this.isPause = false; } pause() { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__handle)) { this.isPause = true; clearInterval(this.__timer); } } stop() { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__handle)) { this.__handle.stop(); this.isPause = true; clearInterval(this.__timer); } } set playSpeed(val) { if (this.__handle) { this.__handle.setSpeed(val); } this.__speed = val; } get playSpeed() { return this.__speed; } setTime(targetSec) { if (!this.play()) { return false; } if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__context)) { return false; } let time = 0; const oneTime = 0.0166; time = oneTime; while (time <= targetSec) { this.__context.update(time / oneTime); time += oneTime; if (targetSec < time) { const exceededSec = targetSec - time; const remainSec = oneTime - exceededSec; this.__context.update(remainSec / oneTime); break; } } this.pause(); return true; } set translate(vec) { if (this.__handle) { this.__handle.setLocation(vec.x, vec.y, vec.z); } this.entity.tryToGetTransform().localPosition = vec; } get translate() { return this.entity.tryToGetTransform().localPosition; } set rotate(vec) { if (this.__handle) { this.__handle.setRotation(vec.x, vec.y, vec.z); } this.entity.tryToGetTransform().localEulerAngles = vec; } get rotate() { return this.entity.tryToGetTransform().localEulerAngles; } set scale(vec) { if (this.__handle) { this.__handle.setScale(vec.x, vec.y, vec.z); } this.entity.tryToGetTransform().localScale = vec; } get scale() { return this.entity.tryToGetTransform().localScale; } __createEffekseerContext() { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.uri) && _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.arrayBuffer)) { // console.error('Effekseer data not found.'); return false; } effekseer.setImageCrossOrigin(this.isImageLoadWithCredential ? 'use-credentials' : ''); this.__context = effekseer.createContext(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__context)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.error('Effekseer context creation fails'); return false; } const webGLResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_6__.CGAPIResourceRepository.getWebGLResourceRepository(); const glw = webGLResourceRepository.currentWebGLContextWrapper; this.__isInitialized = true; const gl = glw.getRawContext(); const data = _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.uri) ? this.uri : this.arrayBuffer; this.__context.init(gl, { enablePremultipliedAlpha: true }); const onLoad = () => { if (this.playJustAfterLoaded) { this.play(); this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } }; const onError = (message, path) => { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.error(message + ', ' + path); }; if (this.type === 'efkpkg') { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(EffekseerComponent.Unzip)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.error('Please Set an Unzip object to EffekseerComponent.Unzip'); return false; } this.__effect = this.__context.loadEffectPackage(data, EffekseerComponent.Unzip, 1.0, onLoad.bind(this), onError.bind(this)); } else { this.__effect = this.__context.loadEffect(data, 1.0, onLoad.bind(this), onError.bind(this)); } return true; } $load() { if (this.__isInitialized) { return; } if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__context) && _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__effect)) { const useWASM = _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(EffekseerComponent.wasmModuleUri); if (useWASM) { effekseer.initRuntime(EffekseerComponent.wasmModuleUri, () => { const succeed = this.__createEffekseerContext(); if (succeed) { this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } }, () => { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.error('Failed to initialize Effekseer'); }); } else { const succeed = this.__createEffekseerContext(); if (succeed) { this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } } } } $logic() { if (!this.isPause) { // Playing ... if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__context) && _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.false(this.isPause)) { this.__context.update(); } } if (this.__handle != null) { const worldMatrix = EffekseerComponent.__tmp_identityMatrix_0.copyComponents(this.entity.tryToGetSceneGraph().matrixInner); this.__handle.setMatrix(worldMatrix._v); this.__handle.setSpeed(this.__speed); } if (this.isPause) { // If Pause mode... this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Render); return; } if (this.isLoop) { if (!this.isPlay()) { this.play(); } } this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Render); } _destroy() { super._destroy(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__context)) { this.__context.releaseEffect(!this.__effect); effekseer.releaseContext(this.__context); this.__context = undefined; } if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__handle)) { this.__handle = undefined; } this.__effect = undefined; } $render() { // const webGLResourceRepository = // CGAPIResourceRepository.getWebGLResourceRepository(); // webGLResourceRepository.setWebGLStateToDefault(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(this.__effect)) { this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Load); return; } const cameraComponent = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__.ComponentRepository.getComponent(_foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_3__.CameraComponent, _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_3__.CameraComponent.current); const viewMatrix = EffekseerComponent.__tmp_identityMatrix_0; const projectionMatrix = EffekseerComponent.__tmp_identityMatrix_1; if (cameraComponent) { viewMatrix.copyComponents(cameraComponent.viewMatrix); projectionMatrix.copyComponents(cameraComponent.projectionMatrix); } else { viewMatrix.identity(); projectionMatrix.identity(); } if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(this.__context)) { this.__context.setProjectionMatrix(projectionMatrix._v); this.__context.setCameraMatrix(viewMatrix._v); this.__context.draw(); } this.moveStageTo(_foundation_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } static sort_$render(renderPass) { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.false(renderPass.toRenderEffekseerEffects)) { return []; } const components = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__.ComponentRepository.getComponentsWithType(EffekseerComponent); return components.map((c) => c.componentSID); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class EffekseerEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getEffekseer() { return this.getComponentByComponentTID(EffekseerComponent.componentTID); } } (0,_foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, EffekseerEntity); return base; } } EffekseerComponent.ANIMATION_EVENT_PLAY = 0; EffekseerComponent.ANIMATION_EVENT_PAUSE = 1; EffekseerComponent.ANIMATION_EVENT_END = 2; EffekseerComponent.wasmModuleUri = undefined; EffekseerComponent.__tmp_identityMatrix_0 = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.identity(); EffekseerComponent.__tmp_identityMatrix_1 = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.identity(); /***/ }), /***/ "./src/effekseer/index.ts": /*!********************************!*\ !*** ./src/effekseer/index.ts ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Effekseer: () => (/* reexport safe */ _main__WEBPACK_IMPORTED_MODULE_0__.Effekseer), /* harmony export */ EffekseerComponent: () => (/* reexport safe */ _EffekseerComponent__WEBPACK_IMPORTED_MODULE_1__.EffekseerComponent) /* harmony export */ }); /* harmony import */ var _main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./main */ "./src/effekseer/main.ts"); /* harmony import */ var _EffekseerComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./EffekseerComponent */ "./src/effekseer/EffekseerComponent.ts"); /***/ }), /***/ "./src/effekseer/main.ts": /*!*******************************!*\ !*** ./src/effekseer/main.ts ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Effekseer: () => (/* binding */ Effekseer) /* harmony export */ }); /* harmony import */ var _EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EffekseerComponent */ "./src/effekseer/EffekseerComponent.ts"); /* harmony import */ var _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/components/Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/components/SceneGraph/SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); const createEffekseerEntity = function () { const entity = _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.createEntity(); const entity1 = _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_2__.TransformComponent, entity); const entity2 = _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_3__.SceneGraphComponent, entity1); const entity3 = _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__.EffekseerComponent, entity2); return entity3; }; const Effekseer = Object.freeze({ EffekseerComponent: _EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__.EffekseerComponent, createEffekseerEntity, }); /***/ }), /***/ "./src/foundation/cameras/AbstractCameraController.ts": /*!************************************************************!*\ !*** ./src/foundation/cameras/AbstractCameraController.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractCameraController: () => (/* binding */ AbstractCameraController) /* harmony export */ }); /* harmony import */ var _math_AABB__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math/AABB */ "./src/foundation/math/AABB.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); class AbstractCameraController { constructor() { this.zNearMax = 0.1; this.zFarScalingFactor = 100000; this.autoCalculateZNearAndZFar = true; } _calcZNearInner(camera, eyePosition, eyeDirection) { if (this.autoCalculateZNearAndZFar && this.__targetEntities.length > 0) { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_0__.AABB(); for (const targetEntity of this.__targetEntities) { aabb.mergeAABB(targetEntity.getSceneGraph().worldMergedAABBWithSkeletal); } const targetAABB = aabb; const lengthOfCenterToEye = _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.lengthBtw(eyePosition, targetAABB.centerPoint); // calc cos between eyeToTarget and eye direction const eyeToTargetDirectionX = targetAABB.centerPoint.x - eyePosition.x; const eyeToTargetDirectionY = targetAABB.centerPoint.y - eyePosition.y; const eyeToTargetDirectionZ = targetAABB.centerPoint.z - eyePosition.z; const cos = (eyeToTargetDirectionX * eyeDirection.x + eyeToTargetDirectionY * eyeDirection.y + eyeToTargetDirectionZ * eyeDirection.z) / (Math.hypot(eyeToTargetDirectionX, eyeToTargetDirectionY, eyeToTargetDirectionZ) * eyeDirection.length()); camera.zNearInner = Math.max(Math.min(lengthOfCenterToEye * cos - targetAABB.lengthCenterToCorner, this.zNearMax), 0.01); } else { camera.zNearInner = camera.zNear; } } _calcZFarInner(camera) { if (this.autoCalculateZNearAndZFar) { camera.zFarInner = camera.zNearInner * this.zFarScalingFactor; } else { camera.zNearInner = camera.zFar; } } } /***/ }), /***/ "./src/foundation/cameras/ICameraController.ts": /*!*****************************************************!*\ !*** ./src/foundation/cameras/ICameraController.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/cameras/OrbitCameraController.ts": /*!*********************************************************!*\ !*** ./src/foundation/cameras/OrbitCameraController.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ OrbitCameraController: () => (/* binding */ OrbitCameraController) /* harmony export */ }); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _math_AABB__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../math/AABB */ "./src/foundation/math/AABB.ts"); /* harmony import */ var _AbstractCameraController__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./AbstractCameraController */ "./src/foundation/cameras/AbstractCameraController.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _system_InputManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../system/InputManager */ "./src/foundation/system/InputManager.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); class OrbitCameraController extends _AbstractCameraController__WEBPACK_IMPORTED_MODULE_7__.AbstractCameraController { constructor(cameraControllerComponent) { super(); this.dollyScale = 2.0; this.scaleOfLengthCenterToCamera = 1.0; this.moveSpeed = 1; this.followTargetAABB = false; this.autoUpdate = true; this.__updated = false; this.__updateCount = 0; this.__fixedLengthOfCenterToEye = 1; this.__isMouseDown = false; this.__lastMouseDownTimeStamp = 0; this.__lastMouseUpTimeStamp = 0; this.__originalY = -1; this.__originalX = -1; this.__buttonNumber = 0; this.__mouse_translate_y = 0; this.__mouse_translate_x = 0; this.__efficiency = 1; this.__lengthOfCenterToEye = 1; this.__fovyBias = 1.0; this.__scaleOfTranslation = 2.8; this.__mouseTranslateVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__newEyeVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__newCenterVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__newUpVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__newTangentVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); // private __verticalAngleThreshold = 0; // private __verticalAngleOfVectors = 0; this.__isSymmetryMode = true; // private __doResetWhenCameraSettingChanged = false; this.__rot_bgn_x = 0; this.__rot_bgn_y = 0; this.__rot_x = 0; this.__rot_y = 0; this.__dolly = 0.5; this.__eyeVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__centerVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__upVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__targetEntities = []; this.__scaleOfZNearAndZFar = 5000; this.__doPreventDefault = false; this.__isPressingShift = false; this.__isPressingCtrl = false; this.__pinchInOutControl = false; this.__pinchInOutOriginalDistance = null; this.__resetDollyTouchTime = 0; this.aabbWithSkeletal = true; this.useInitialTargetAABBForLength = false; // private __controllerTranslate = MutableVector3.zero(); this.__mouseDownFunc = this.__mouseDown.bind(this); this.__mouseUpFunc = this.__mouseUp.bind(this); this.__mouseMoveFunc = this.__mouseMove.bind(this); this.__touchDownFunc = this.__touchDown.bind(this); this.__touchUpFunc = this.__touchUp.bind(this); this.__touchMoveFunc = this.__touchMove.bind(this); this.__pinchInOutFunc = this.__pinchInOut.bind(this); this.__pinchInOutEndFunc = this.__pinchInOutEnd.bind(this); this.__mouseWheelFunc = this.__mouseWheel.bind(this); this.__mouseDblClickFunc = this.__mouseDblClick.bind(this); this.__contextMenuFunc = this.__contextMenu.bind(this); this.__pressShiftFunc = this.__pressShift.bind(this); this.__releaseShiftFunc = this.__releaseShift.bind(this); this.__pressCtrlFunc = this.__pressCtrl.bind(this); this.__releaseCtrlFunc = this.__releaseCtrl.bind(this); this.__resetDollyAndPositionFunc = this.__resetDollyAndPosition.bind(this); this.registerEventListeners(); this.__cameraControllerComponent = cameraControllerComponent; } get updateCount() { return this.__updateCount; } _updateCount() { this.__updateCount++; this.__cameraControllerComponent._updateCount(this.__updateCount); } resetDollyAndTranslation() { this.__dolly = 0.5; this.__mouse_translate_x = 0; this.__mouse_translate_y = 0; this.__mouseTranslateVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); } setTarget(targetEntity) { this.setTargets([targetEntity]); } setTargets(targetEntities) { this.__targetEntities = targetEntities; this.__initialTargetAABB = undefined; this.__updated = false; this._updateCount(); } getTargets() { return this.__targetEntities; } set doPreventDefault(flag) { this.__doPreventDefault = flag; } get doPreventDefault() { return this.__doPreventDefault; } __mouseDown(e) { this.__tryToPreventDefault(e); // if (this.isMouseDown) return; if (this.__isPressingCtrl) return; this.__originalX = e.clientX; this.__originalY = e.clientY; this.__rot_bgn_x = this.__rot_x; this.__rot_bgn_y = this.__rot_y; this.__isMouseDown = true; this.__lastMouseDownTimeStamp = e.timeStamp; // console.log('original', this.__originalX, this.__originalY); this.__updated = false; this._updateCount(); } __mouseMove(e) { this.__tryToPreventDefault(e); if (_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.false(this.isMouseDown)) return; if (this.__isPressingCtrl) return; if (this.__buttonNumber === 0) { this.__buttonNumber = e.buttons; } const currentMouseX = e.clientX; const currentMouseY = e.clientY; // console.log('currentMouse: ', currentMouseX, currentMouseY); switch (this.__buttonNumber) { case 1: // left if (this.__isPressingShift) { this.__parallelTranslateControl(this.__originalX, this.__originalY, currentMouseX, currentMouseY); } else { this.__rotateControl(this.__originalX, this.__originalY, currentMouseX, currentMouseY); this.__rot_bgn_x = this.__rot_x; this.__rot_bgn_y = this.__rot_y; } break; case 2: // right this.__zoomControl(this.__originalX, currentMouseX); break; case 4: // center this.__parallelTranslateControl(this.__originalX, this.__originalY, currentMouseX, currentMouseY); break; default: return; } this.__originalX = currentMouseX; this.__originalY = currentMouseY; this.__updated = false; this._updateCount(); } __mouseUp(e) { this.__buttonNumber = 0; this.__originalX = -1; this.__originalY = -1; this.__isMouseDown = false; this.__lastMouseUpTimeStamp = e.timeStamp; this.__updated = false; this._updateCount(); } __touchDown(e) { this.__tryToPreventDefault(e); if (e.touches.length === 1) { this.__originalX = e.touches[0].clientX; this.__originalY = e.touches[0].clientY; this.__rot_bgn_x = this.__rot_x; this.__rot_bgn_y = this.__rot_y; } else { this.__originalX = (e.touches[0].clientX + e.touches[1].clientX) * 0.5; this.__originalY = (e.touches[0].clientY + e.touches[1].clientY) * 0.5; } this.__isMouseDown = true; this.__lastMouseDownTimeStamp = e.timeStamp; this.__updated = false; this._updateCount(); } __touchMove(e) { this.__tryToPreventDefault(e); if (_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.false(this.isMouseDown)) return; let currentTouchX = e.touches[0].clientX; let currentTouchY = e.touches[0].clientY; if (e.touches.length === 1) { currentTouchX = e.touches[0].clientX; currentTouchY = e.touches[0].clientY; this.__rotateControl(this.__originalX, this.__originalY, currentTouchX, currentTouchY); this.__rot_bgn_x = this.__rot_x; this.__rot_bgn_y = this.__rot_y; } else { currentTouchX = (e.touches[0].clientX + e.touches[1].clientX) * 0.5; currentTouchY = (e.touches[0].clientY + e.touches[1].clientY) * 0.5; this.__parallelTranslateControl(this.__originalX, this.__originalY, currentTouchX, currentTouchY); } this.__originalX = currentTouchX; this.__originalY = currentTouchY; this.__updated = false; this._updateCount(); } __touchUp(e) { const touchNumber = e.touches.length; if (touchNumber === 0) { this.__originalX = -1; this.__originalY = -1; } else if (touchNumber === 1) { this.__originalX = e.touches[0].clientX; this.__originalY = e.touches[0].clientY; this.__rot_bgn_x = this.__rot_x; this.__rot_bgn_y = this.__rot_y; } else { this.__originalX = (e.touches[0].clientX + e.touches[1].clientX) * 0.5; this.__originalY = (e.touches[0].clientY + e.touches[1].clientY) * 0.5; } this.__isMouseDown = false; this.__lastMouseUpTimeStamp = e.timeStamp; this.__updated = false; this._updateCount(); } set rotX(value) { this.__rot_x = value; this.__updated = false; this._updateCount(); } get rotX() { return this.__rot_x; } set rotY(value) { this.__rot_y = value; this.__updated = false; this._updateCount(); } get rotY() { return this.__rot_y; } set maximumY(maximum_y) { this.__maximum_y = maximum_y; } set minimumY(minimum_y) { this.__minimum_y = minimum_y; } __rotateControl(originalX, originalY, currentX, currentY) { // calc rotation angle const delta_x = (currentX - originalX) * this.__efficiency * 0.3; const delta_y = (currentY - originalY) * this.__efficiency * 0.3; this.__rot_x = this.__rot_bgn_x - delta_x; this.__rot_y = this.__rot_bgn_y - delta_y; // check if rotation angle is within range // if ( // this.__verticalAngleThreshold - this.__verticalAngleOfVectors < this.__rot_y // ) { // this._rot_y -= this._rot_y - (this._verticalAngleThreshold - this._verticalAngleOfVectors); // } // if ( // this.__rot_y < -this.__verticalAngleThreshold + this.__verticalAngleOfVectors // ) { // this._rot_y += this._rot_y - (this._verticalAngleThreshold - this._verticalAngleOfVectors); // } if (this.__maximum_y != null && this.__rot_y > this.__maximum_y) { this.__rot_y = this.__maximum_y; } if (this.__minimum_y != null && this.__rot_y < this.__minimum_y) { this.__rot_y = this.__minimum_y; } } __zoomControl(originalValue, currentValue) { this.dolly -= ((currentValue - originalValue) / 1000) * this.__efficiency; } __parallelTranslateControl(originalX, originalY, currentX, currentY) { this.__mouse_translate_y = ((currentY - originalY) / 1000) * this.__efficiency; this.__mouse_translate_x = ((currentX - originalX) / 1000) * this.__efficiency; const scale = this.__lengthOfCenterToEye * this.__fovyBias * this.__scaleOfTranslation; const upDirTranslateVec = OrbitCameraController.__tmpVec3_0; upDirTranslateVec .copyComponents(this.__newUpVec) .normalize() .multiply(this.__mouse_translate_y) .multiply(scale); const tangentDirTranslateVec = OrbitCameraController.__tmpVec3_1; tangentDirTranslateVec .copyComponents(this.__newTangentVec) .normalize() .multiply(this.__mouse_translate_x) .multiply(scale); this.__mouseTranslateVec.add(upDirTranslateVec).add(tangentDirTranslateVec); } __getTouchesDistance(e) { const touches = e.touches; const diffX = touches[1].clientX - touches[0].clientX; const diffY = touches[1].clientY - touches[0].clientY; return Math.hypot(diffX, diffY); } __pinchInOut(e) { if (e.touches.length < 2) return; if (this.__pinchInOutOriginalDistance == null) { this.__pinchInOutOriginalDistance = this.__getTouchesDistance(e); return; } const currentDistance = this.__getTouchesDistance(e); const originalDistance = this.__pinchInOutOriginalDistance; if (!this.__pinchInOutControl) { if (Math.abs(currentDistance - originalDistance) > 35.0) { this.__pinchInOutOriginalDistance = currentDistance; this.__pinchInOutControl = true; } return; } const ratio = originalDistance / currentDistance; this.dolly *= Math.pow(ratio * this.__efficiency, 2.2 / 15.0); this.__pinchInOutOriginalDistance = currentDistance; this.__updated = false; this._updateCount(); } __pinchInOutEnd(e) { if (e.touches.length < 2) { this.__pinchInOutControl = false; this.__pinchInOutOriginalDistance = null; } this.__updated = false; this._updateCount(); } __tryToPreventDefault(evt) { if (this.__doPreventDefault) { evt.preventDefault(); } } __mouseWheel(evt) { this.__tryToPreventDefault(evt); this.dolly += Math.sign(evt.deltaY) / 200; this.__updated = false; this._updateCount(); } __contextMenu(evt) { this.__tryToPreventDefault(evt); } set dolly(value) { value = Math.min(value, 1); value = Math.max(value, 0.0001); let gamma = Math.pow(value, 5); gamma = Math.max(gamma, 0.0001); this.__dolly = gamma; } get dolly() { return Math.pow(this.__dolly, 1 / 5); } __mouseDblClick(evt) { if (evt.shiftKey) { this.__mouseTranslateVec.zero(); } else if (evt.ctrlKey) { this.__rot_y = 0; this.__rot_x = 0; this.__rot_bgn_y = 0; this.__rot_bgn_x = 0; } } __resetDollyAndPosition(e) { if (e.touches.length > 1) return; const currentTime = new Date().getTime(); if (currentTime - this.__resetDollyTouchTime < 300) { this.dolly = Math.pow(0.5, 1.0 / 2.2); this.__mouseTranslateVec.zero(); this.__rot_x = 0; this.__rot_y = 0; } else { this.__resetDollyTouchTime = currentTime; } } __pressShift(e) { if (e.shiftKey === true) { this.__isPressingShift = true; } } __releaseShift(e) { if (e.shiftKey === false) { this.__isPressingShift = false; } } __pressCtrl(e) { if (e.ctrlKey === true) { this.__isPressingCtrl = true; } } __releaseCtrl(e) { if (e.ctrlKey === false) { this.__isPressingCtrl = false; } } registerEventListeners() { let eventTargetDom = window; if (_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(_core_Config__WEBPACK_IMPORTED_MODULE_10__.Config.eventTargetDom)) { eventTargetDom = _core_Config__WEBPACK_IMPORTED_MODULE_10__.Config.eventTargetDom; } if ('ontouchend' in document) { // touch devices _system_InputManager__WEBPACK_IMPORTED_MODULE_9__.InputManager.register(_system_InputManager__WEBPACK_IMPORTED_MODULE_9__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER, [ { eventName: 'touchstart', handler: this.__touchDownFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchmove', handler: this.__touchMoveFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchend', handler: this.__touchUpFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchmove', handler: this.__pinchInOutFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchend', handler: this.__pinchInOutEndFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchstart', handler: this.__resetDollyAndPositionFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'contextmenu', handler: this.__contextMenuFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'dblclick', handler: this.__mouseDblClickFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, ]); } else { // pc devices _system_InputManager__WEBPACK_IMPORTED_MODULE_9__.InputManager.register(_system_InputManager__WEBPACK_IMPORTED_MODULE_9__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER, [ { eventName: 'mousedown', handler: this.__mouseDownFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'mouseup', handler: this.__mouseUpFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'mouseleave', handler: this.__mouseUpFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'mousemove', handler: this.__mouseMoveFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'keydown', handler: this.__pressShiftFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'keyup', handler: this.__releaseShiftFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'keydown', handler: this.__pressCtrlFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'keyup', handler: this.__releaseCtrlFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'contextmenu', handler: this.__contextMenuFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'wheel', handler: this.__mouseWheelFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'dblclick', handler: this.__mouseDblClickFunc, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, ]); } } unregisterEventListeners() { _system_InputManager__WEBPACK_IMPORTED_MODULE_9__.InputManager.unregister(_system_InputManager__WEBPACK_IMPORTED_MODULE_9__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER); } __getFovyFromCamera(camera) { if (camera.fovy) { return camera.fovy; } else { return _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.radianToDegree(2 * Math.atan(Math.abs(camera.top - camera.bottom) / (2 * camera.zNear))); } } logic(cameraComponent) { if (!this.__updated || this.autoUpdate) { this.__updateTargeting(cameraComponent); this.__calculateInfluenceOfController(); this.__updateCameraComponent(cameraComponent); this.__updated = true; } } __getTargetAABB(targetEntity) { if (this.aabbWithSkeletal) { return targetEntity.tryToGetSceneGraph().worldMergedAABBWithSkeletal; } else { return targetEntity.tryToGetSceneGraph().worldMergedAABB; } } /** * update center, eye and up vectors of OrbitCameraController * @internal */ __updateTargeting(camera) { const eyeVec = camera.eye; const centerVec = camera._direction; const upVec = camera._up; const newEyeVec = this.__eyeVec; const newCenterVec = this.__centerVec; const newUpVec = this.__upVec.copyComponents(upVec); if (this.__targetEntities.length === 0) { newEyeVec.copyComponents(eyeVec); newCenterVec.copyComponents(centerVec); } else { if (this.__initialTargetAABB == null) { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_6__.AABB(); for (const targetEntity of this.__targetEntities) { aabb.mergeAABB(this.__getTargetAABB(targetEntity)); } this.__initialTargetAABB = aabb.clone(); } // calc newCenterVec let aabbToUse = this.__initialTargetAABB; if (this.followTargetAABB) { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_6__.AABB(); for (const targetEntity of this.__targetEntities) { aabb.mergeAABB(this.__getTargetAABB(targetEntity)); } aabbToUse = aabb; } newCenterVec.copyComponents(aabbToUse.centerPoint); // calc newEyeVec const centerToCameraVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.subtractTo(eyeVec, centerVec, newEyeVec); const centerToCameraVecNormalized = centerToCameraVec.normalize(); const lengthCenterToCorner = this.useInitialTargetAABBForLength ? this.__initialTargetAABB.lengthCenterToCorner : aabbToUse.lengthCenterToCorner; let lengthCenterToCamera = lengthCenterToCorner * (1.0 + 1.0 / Math.tan(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(camera.fovy / 2.0))) * this.scaleOfLengthCenterToCamera; if (Math.abs(lengthCenterToCamera) < 0.00001) { lengthCenterToCamera = 1; } centerToCameraVecNormalized.multiply(lengthCenterToCamera).add(newCenterVec); const sg = camera.entity.tryToGetSceneGraph(); if (sg != null) { const invMat = _math_Matrix44__WEBPACK_IMPORTED_MODULE_4__.Matrix44.invertTo(sg.matrixInner, OrbitCameraController.__tmpMat44_0); invMat.multiplyVector3To(newCenterVec, newCenterVec); invMat.multiplyVector3To(newEyeVec, newEyeVec); invMat.multiplyVector3To(newUpVec, newUpVec); } } } /** * calculate up, eye, center and tangent vector with controller influence * @internal */ __calculateInfluenceOfController() { const centerToEyeVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.subtractTo(this.__eyeVec, this.__centerVec, OrbitCameraController.__tmpVec3_0); centerToEyeVec.multiply(this.__dolly * this.dollyScale); this.__lengthOfCenterToEye = centerToEyeVec.length(); const newUpVec = this.__newUpVec; const newEyeVec = this.__newEyeVec; const newCenterVec = this.__newCenterVec; const newTangentVec = this.__newTangentVec; if (this.__isSymmetryMode) { const projectedCenterToEyeVec = OrbitCameraController.__tmpVec3_1; projectedCenterToEyeVec.setComponents(centerToEyeVec.x, 0, centerToEyeVec.z); let horizontalAngleOfVectors = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.angleOfVectors(projectedCenterToEyeVec, OrbitCameraController.__tmp_up); const horizontalSign = Math.sign(projectedCenterToEyeVec.cross(OrbitCameraController.__tmp_up).y); horizontalAngleOfVectors *= horizontalSign; const rotateM_X = OrbitCameraController.__tmp_rotateM_X; const rotateM_Y = OrbitCameraController.__tmp_rotateM_Y; const rotateM_Reset = OrbitCameraController.__tmp_rotateM_Reset; const rotateM_Revert = OrbitCameraController.__tmp_rotateM_Revert; rotateM_X.rotateX(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(this.__rot_y)); rotateM_Y.rotateY(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(this.__rot_x)); rotateM_Reset.rotateY(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(horizontalAngleOfVectors)); rotateM_Revert.rotateY(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(-horizontalAngleOfVectors)); const rotateM = OrbitCameraController.__tmp_rotateM; _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.multiplyTo(rotateM_X, rotateM_Reset, rotateM); rotateM.multiplyByLeft(rotateM_Y); rotateM.multiplyByLeft(rotateM_Revert); rotateM.multiplyVectorTo(this.__upVec, newUpVec); rotateM.multiplyVectorTo(centerToEyeVec, newEyeVec).add(this.__centerVec); newCenterVec.copyComponents(this.__centerVec); const newEyeToCenterVec = OrbitCameraController.__tmpVec3_2; _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.subtractTo(newCenterVec, newEyeVec, newEyeToCenterVec); _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.crossTo(newUpVec, newEyeToCenterVec, newTangentVec); newEyeVec.add(this.__mouseTranslateVec); newCenterVec.add(this.__mouseTranslateVec); // const horizonResetVec = OrbitCameraController.__tmpVec3_2; // rotateM_Reset.multiplyVectorTo(centerToEyeVec, horizonResetVec); // this.__verticalAngleOfVectors = Vector3.angleOfVectors(horizonResetVec, OrbitCameraController.__tmp_up); // const verticalSign = Math.sign(Vector3.crossTo(horizonResetVec, OrbitCameraController.__tmp_up, OrbitCameraController.__tmp_verticalSign).x); //this._verticalAngleOfVectors *= verticalSign; } else { const rotateM_X = OrbitCameraController.__tmp_rotateM_X; const rotateM_Y = OrbitCameraController.__tmp_rotateM_Y; rotateM_X.rotateX(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(this.__rot_y)); rotateM_Y.rotateY(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(this.__rot_x)); const rotateM = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.multiplyTo(rotateM_Y, rotateM_X, OrbitCameraController.__tmp_rotateM); rotateM.multiplyVectorTo(this.__upVec, newUpVec); rotateM.multiplyVectorTo(centerToEyeVec, newEyeVec).add(this.__centerVec); newCenterVec.copyComponents(this.__centerVec); const newEyeToCenterVec = OrbitCameraController.__tmpVec3_1; _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.subtractTo(newCenterVec, newEyeVec, newEyeToCenterVec); _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.crossTo(newUpVec, newEyeToCenterVec, newTangentVec); newEyeVec.add(this.__mouseTranslateVec); newCenterVec.add(this.__mouseTranslateVec); } } __updateCameraComponent(camera) { const eyeDirection = OrbitCameraController.__tmpVec3_0.copyComponents(this.__newCenterVec); eyeDirection.subtract(this.__newEyeVec).normalize(); this._calcZNearInner(camera, this.__newEyeVec, eyeDirection); this._calcZFarInner(camera); const ratio = camera.zFar / camera.zNear; const minRatio = this.__scaleOfZNearAndZFar; const scale = ratio / minRatio; const newLeft = camera.left + scale; const newRight = camera.right + scale; const newTop = camera.top + scale; const newBottom = camera.bottom + scale; const fovy = this.__getFovyFromCamera(camera); this.__fovyBias = Math.tan(_math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.degreeToRadian(fovy / 2.0)); camera.eyeInner = this.__newEyeVec; camera.directionInner = this.__newCenterVec; camera.upInner = this.__newUpVec; camera.leftInner = newLeft; camera.rightInner = newRight; camera.topInner = newTop; camera.bottomInner = newBottom; camera.fovyInner = fovy; } set scaleOfZNearAndZFar(value) { this.__scaleOfZNearAndZFar = value; this.__updated = false; this._updateCount(); } get scaleOfZNearAndZFar() { return this.__scaleOfZNearAndZFar; } get isMouseDown() { return this.__isMouseDown; } get lastMouseDownTimeStamp() { return this.__lastMouseDownTimeStamp; } get lastMouseUpTimeStamp() { return this.__lastMouseUpTimeStamp; } } OrbitCameraController.__tmp_up = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([0, 0, 1]); OrbitCameraController.__tmpVec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); OrbitCameraController.__tmpVec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); OrbitCameraController.__tmpVec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); OrbitCameraController.__tmp_rotateM_X = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.identity(); OrbitCameraController.__tmp_rotateM_Y = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.identity(); OrbitCameraController.__tmp_rotateM = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.identity(); OrbitCameraController.__tmp_rotateM_Reset = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.identity(); OrbitCameraController.__tmp_rotateM_Revert = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.identity(); OrbitCameraController.__tmpMat44_0 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__.MutableMatrix44.identity(); /***/ }), /***/ "./src/foundation/cameras/WalkThroughCameraController.ts": /*!***************************************************************!*\ !*** ./src/foundation/cameras/WalkThroughCameraController.ts ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WalkThroughCameraController: () => (/* binding */ WalkThroughCameraController) /* harmony export */ }); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/MathClassUtil */ "./src/foundation/math/MathClassUtil.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _AbstractCameraController__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AbstractCameraController */ "./src/foundation/cameras/AbstractCameraController.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _system_InputManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../system/InputManager */ "./src/foundation/system/InputManager.ts"); /* harmony import */ var _math_AABB__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/AABB */ "./src/foundation/math/AABB.ts"); class WalkThroughCameraController extends _AbstractCameraController__WEBPACK_IMPORTED_MODULE_5__.AbstractCameraController { constructor(cameraControllerComponent, options = { eventTargetDom: document, verticalSpeed: 1, horizontalSpeed: 1, turnSpeed: 0.25, mouseWheelSpeedScale: 1, inverseVerticalRotating: false, inverseHorizontalRotating: false, }) { super(); this.__updateCount = 0; this._isKeyDown = false; this._isMouseDrag = false; this._lastKeyCode = -1; this._currentDir = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.fromCopyArray([0, 0, -1]); this._currentPos = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.fromCopyArray([0, 0, 0]); this._currentCenter = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.fromCopyArray([0, 0, -1]); this._currentHorizontalDir = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.fromCopyArray([0, 0, -1]); this._newDir = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.fromCopyArray([0, 0, -1]); this._isMouseDown = false; this._clickedMouseXOnCanvas = -1; this._clickedMouseYOnCanvas = -1; this._draggedMouseXOnCanvas = -1; this._draggedMouseYOnCanvas = -1; this._deltaMouseXOnCanvas = -1; this._deltaMouseYOnCanvas = -1; this._mouseXAdjustScale = 1; this._mouseYAdjustScale = 1; this._deltaY = -1; this._deltaX = -1; this._mouseUpBind = this._mouseUp.bind(this); this._mouseDownBind = this._mouseDown.bind(this); this._mouseMoveBind = this._mouseMove.bind(this); this._mouseWheelBind = this._mouseWheel.bind(this); this.__doPreventDefault = false; this._needInitialize = true; this.__targetEntities = []; this.aabbWithSkeletal = true; this.__cameraControllerComponent = cameraControllerComponent; this._horizontalSpeed = options.horizontalSpeed; this._verticalSpeed = options.verticalSpeed; this._turnSpeed = options.turnSpeed; this._mouseXAdjustScale = this._turnSpeed; this._mouseYAdjustScale = this._turnSpeed; this._mouseWheelSpeedScale = options.mouseWheelSpeedScale; this._inverseVerticalRotating = options.inverseVerticalRotating; this._inverseHorizontalRotating = options.inverseHorizontalRotating; this.reset(); this._onKeydown = (e) => { this._isKeyDown = true; this._lastKeyCode = e.keyCode; }; this._onKeyup = (e) => { this._isKeyDown = false; this._lastKeyCode = -1; }; const eventTargetDom = options.eventTargetDom; this.registerEventListeners(eventTargetDom); } _updateCount() { this.__updateCount++; this.__cameraControllerComponent._updateCount(this.__updateCount); } get updateCount() { return this.__updateCount; } registerEventListeners(eventTargetDom = document) { this._eventTargetDom = eventTargetDom; const inputHandlerInfos = [ { eventName: 'keydown', handler: this._onKeydown, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'keyup', handler: this._onKeyup, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, ]; if ('ontouchend' in document) { inputHandlerInfos.push({ eventName: 'touchstart', handler: this._mouseDownBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchend', handler: this._mouseUpBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'touchmove', handler: this._mouseMoveBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }); } if ('onmouseup' in document) { inputHandlerInfos.push({ eventName: 'mousedown', handler: this._mouseDownBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'mouseup', handler: this._mouseUpBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'mouseleave', handler: this._mouseUpBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }, { eventName: 'mousemove', handler: this._mouseMoveBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }); } if ('onwheel' in document) { inputHandlerInfos.push({ eventName: 'wheel', handler: this._mouseWheelBind, options: { passive: !this.__doPreventDefault, }, classInstance: this, eventTargetDom, }); } _system_InputManager__WEBPACK_IMPORTED_MODULE_8__.InputManager.register(_system_InputManager__WEBPACK_IMPORTED_MODULE_8__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER, inputHandlerInfos); } unregisterEventListeners() { _system_InputManager__WEBPACK_IMPORTED_MODULE_8__.InputManager.unregister(_system_InputManager__WEBPACK_IMPORTED_MODULE_8__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER); } __tryToPreventDefault(evt) { if (this.__doPreventDefault) { evt.preventDefault(); } } _mouseWheel(e) { if (this._currentDir === null) { return; } const delta = -1 * Math.sign(e.deltaY) * this._mouseWheelSpeedScale * this._horizontalSpeed; const horizontalDir = WalkThroughCameraController.__tmp_Vec3_0; horizontalDir.setComponents(this._currentDir.x, 0, this._currentDir.z).normalize(); const deltaVec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.multiplyTo(horizontalDir, delta, WalkThroughCameraController.__tmp_Vec3_1); this._currentPos.add(deltaVec); this._currentCenter.add(deltaVec); this._updateCount(); } _mouseDown(evt) { this.__tryToPreventDefault(evt); this._isMouseDown = true; const rect = evt.target.getBoundingClientRect(); this._clickedMouseXOnCanvas = evt.clientX - rect.left; this._clickedMouseYOnCanvas = evt.clientY - rect.top; this._updateCount(); return false; } _mouseMove(evt) { this.__tryToPreventDefault(evt); if (!this._isMouseDown) { return; } const rect = evt.target.getBoundingClientRect(); this._draggedMouseXOnCanvas = evt.clientX - rect.left; this._draggedMouseYOnCanvas = evt.clientY - rect.top; this._deltaMouseXOnCanvas = this._draggedMouseXOnCanvas - this._clickedMouseXOnCanvas; this._deltaMouseYOnCanvas = this._draggedMouseYOnCanvas - this._clickedMouseYOnCanvas; this._isMouseDrag = true; this._updateCount(); } _mouseUp(evt) { this._isMouseDown = false; this._isMouseDrag = false; const target = evt.target; if ((target === null || target === void 0 ? void 0 : target.getBoundingClientRect) == null) { return; } const rect = target.getBoundingClientRect(); this._clickedMouseXOnCanvas = evt.clientX - rect.left; this._clickedMouseYOnCanvas = evt.clientY - rect.top; this._updateCount(); } tryReset() { } reset() { this._isKeyDown = false; this._lastKeyCode = -1; this._currentPos.zero(); this._currentCenter.setComponents(0, 0, -1); this._currentDir.setComponents(0, 0, -1); this._currentHorizontalDir.setComponents(0, 0, -1); this._isMouseDown = false; this._isMouseDrag = false; this._draggedMouseXOnCanvas = -1; this._draggedMouseYOnCanvas = -1; this._deltaMouseXOnCanvas = -1; this._deltaMouseYOnCanvas = -1; this._mouseXAdjustScale = this._turnSpeed; this._mouseYAdjustScale = this._turnSpeed; this._deltaY = 0; this._deltaX = 0; this._newDir.setComponents(0, 0, -1); } logic(cameraComponent) { this.__updateCameraComponent(cameraComponent); } __updateCameraComponent(camera) { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_9__.AABB(); for (const targetEntity of this.__targetEntities) { aabb.mergeAABB(this.__getTargetAABB(targetEntity)); } const targetAABB = aabb; if (this._needInitialize && targetAABB != null) { const lengthCenterToCamera = targetAABB.lengthCenterToCorner * (1.0 + 1.0 / Math.tan(_math_MathUtil__WEBPACK_IMPORTED_MODULE_6__.MathUtil.degreeToRadian(camera.fovy / 2.0))); this._currentPos.copyComponents(targetAABB.centerPoint); this._currentPos.z += lengthCenterToCamera; this._currentCenter.copyComponents(targetAABB.centerPoint); this._currentDir.setComponents(0, 0, -1); const sceneComponent = camera.entity.tryToGetSceneGraph(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(sceneComponent)) { const invMat = _math_Matrix44__WEBPACK_IMPORTED_MODULE_0__.Matrix44.invertTo(sceneComponent.matrixInner, WalkThroughCameraController.__tmpInvMat); invMat.multiplyVector3To(this._currentPos, this._currentPos); invMat.multiplyVector3To(this._currentCenter, this._currentCenter); } this._needInitialize = false; } const t = this._deltaY / 90; this._newDir.x = this._currentDir.x * (1 - t); this._newDir.y = t; this._newDir.z = this._currentDir.z * (1 - t); this._newDir.normalize(); this._currentHorizontalDir.x = this._currentDir.x; this._currentHorizontalDir.y = 0; this._currentHorizontalDir.z = this._currentDir.z; this._currentHorizontalDir.normalize(); const moveVector = WalkThroughCameraController.__tmp_Vec3_0.zero(); switch (this._lastKeyCode) { case 87: // w key case 38: // arrow upper key moveVector.x = this._currentHorizontalDir.x * this._horizontalSpeed; moveVector.z = this._currentHorizontalDir.z * this._horizontalSpeed; break; case 65: // a key case 37: // arrow left key moveVector.x = this._currentHorizontalDir.z * this._horizontalSpeed; moveVector.z = -this._currentHorizontalDir.x * this._horizontalSpeed; break; case 83: // s key case 40: // arrow down key moveVector.x = -this._currentHorizontalDir.x * this._horizontalSpeed; moveVector.z = -this._currentHorizontalDir.z * this._horizontalSpeed; break; case 68: // d key case 39: // arrow right key moveVector.x = -this._currentHorizontalDir.z * this._horizontalSpeed; moveVector.z = this._currentHorizontalDir.x * this._horizontalSpeed; break; case 81: // q key moveVector.x = -this._newDir.x * this._horizontalSpeed; moveVector.y = -this._newDir.y * this._horizontalSpeed; moveVector.z = -this._newDir.z * this._horizontalSpeed; break; case 69: // e key moveVector.x = this._newDir.x * this._horizontalSpeed; moveVector.y = this._newDir.y * this._horizontalSpeed; moveVector.z = this._newDir.z * this._horizontalSpeed; break; case 82: // r key moveVector.y = this._verticalSpeed; break; case 70: // f key moveVector.y = -this._verticalSpeed; break; } this._currentPos.add(moveVector); this._currentCenter.add(moveVector); if (this._isMouseDrag) { if (this._inverseHorizontalRotating) { this._deltaX = this._deltaMouseXOnCanvas * this._mouseXAdjustScale; } else { this._deltaX = -this._deltaMouseXOnCanvas * this._mouseXAdjustScale; } if (this._inverseVerticalRotating) { this._deltaY += this._deltaMouseYOnCanvas * this._mouseYAdjustScale; } else { this._deltaY += -this._deltaMouseYOnCanvas * this._mouseYAdjustScale; } this._deltaY = Math.max(-120, Math.min(50, this._deltaY)); const rotateMatrix = WalkThroughCameraController.__tmpRotateMat.rotateY(_math_MathUtil__WEBPACK_IMPORTED_MODULE_6__.MathUtil.degreeToRadian(this._deltaX)); rotateMatrix.multiplyVectorTo(this._currentDir, this._currentDir); const newEyeToCenter = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.subtractTo(this._currentCenter, this._currentPos, WalkThroughCameraController.__tmp_Vec3_1); rotateMatrix.multiplyVectorTo(newEyeToCenter, newEyeToCenter); newEyeToCenter.x = newEyeToCenter.x * (1 - t); newEyeToCenter.y = t; newEyeToCenter.z = newEyeToCenter.z * (1 - t); newEyeToCenter.normalize(); this._currentCenter.copyComponents(this._currentPos); this._currentCenter.add(newEyeToCenter); this._clickedMouseXOnCanvas = this._draggedMouseXOnCanvas; this._clickedMouseYOnCanvas = this._draggedMouseYOnCanvas; this._deltaMouseXOnCanvas = 0; this._deltaMouseYOnCanvas = 0; } camera.eyeInner = this._currentPos; camera.directionInner = this._currentCenter; camera.upInner = camera._up; camera.leftInner = camera.left; camera.rightInner = camera.right; camera.topInner = camera.top; camera.bottomInner = camera.bottom; camera.fovyInner = camera.fovy; this._calcZNearInner(camera, this._currentPos, this._newDir); this._calcZFarInner(camera); } getDirection() { return this._currentCenter !== null ? this._newDir.clone() : null; } set horizontalSpeed(value) { this._horizontalSpeed = value; } get horizontalSpeed() { return this._horizontalSpeed; } set verticalSpeed(value) { this._verticalSpeed = value; } get verticalSpeed() { return this._verticalSpeed; } set mouseWheelSpeed(value) { this._mouseWheelSpeedScale = value; } get mouseWheelSpeed() { return this._mouseWheelSpeedScale; } setTarget(targetEntity) { this.setTargets([targetEntity]); } __getTargetAABB(targetEntity) { if (this.aabbWithSkeletal) { return targetEntity.tryToGetSceneGraph().worldMergedAABBWithSkeletal; } else { return targetEntity.tryToGetSceneGraph().worldMergedAABB; } } setTargets(targetEntities) { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_9__.AABB(); for (const targetEntity of targetEntities) { aabb.mergeAABB(this.__getTargetAABB(targetEntity)); } const speed = aabb.lengthCenterToCorner / 10; this.verticalSpeed = speed; this.horizontalSpeed = speed; this.__targetEntities = targetEntities; this._needInitialize = true; this._updateCount(); } getTargets() { return this.__targetEntities; } get allInfo() { const info = {}; info.verticalSpeed = this.verticalSpeed; info.horizontalSpeed = this.horizontalSpeed; info._turnSpeed = this._turnSpeed; if (this._currentPos) { info._currentPos = this._currentPos.clone(); } if (this._currentCenter) { info._currentCenter = this._currentCenter.clone(); } if (this._currentDir) { info._currentDir = this._currentDir.clone(); } info._deltaY = this._deltaY; info._newDir = this._newDir.clone(); return info; } set allInfo(arg) { let json = arg; if (typeof arg === 'string') { json = JSON.parse(arg); } for (const key in json) { if (json.hasOwnProperty(key) && key in this) { if (key === 'quaternion') { this[key] = _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_1__.MathClassUtil.cloneOfMathObjects(_math_MathClassUtil__WEBPACK_IMPORTED_MODULE_1__.MathClassUtil.arrayToQuaternion(json[key])); } else { this[key] = _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_1__.MathClassUtil.cloneOfMathObjects(_math_MathClassUtil__WEBPACK_IMPORTED_MODULE_1__.MathClassUtil.arrayToVectorOrMatrix(json[key])); } } } } } WalkThroughCameraController.__tmpInvMat = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_4__.MutableMatrix44.identity(); WalkThroughCameraController.__tmpRotateMat = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_3__.MutableMatrix33.identity(); WalkThroughCameraController.__tmp_Vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.zero(); WalkThroughCameraController.__tmp_Vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_2__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/cameras/index.ts": /*!*****************************************!*\ !*** ./src/foundation/cameras/index.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractCameraController: () => (/* reexport safe */ _AbstractCameraController__WEBPACK_IMPORTED_MODULE_0__.AbstractCameraController), /* harmony export */ OrbitCameraController: () => (/* reexport safe */ _OrbitCameraController__WEBPACK_IMPORTED_MODULE_2__.OrbitCameraController), /* harmony export */ WalkThroughCameraController: () => (/* reexport safe */ _WalkThroughCameraController__WEBPACK_IMPORTED_MODULE_3__.WalkThroughCameraController) /* harmony export */ }); /* harmony import */ var _AbstractCameraController__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractCameraController */ "./src/foundation/cameras/AbstractCameraController.ts"); /* harmony import */ var _ICameraController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ICameraController */ "./src/foundation/cameras/ICameraController.ts"); /* harmony import */ var _OrbitCameraController__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./OrbitCameraController */ "./src/foundation/cameras/OrbitCameraController.ts"); /* harmony import */ var _WalkThroughCameraController__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./WalkThroughCameraController */ "./src/foundation/cameras/WalkThroughCameraController.ts"); /***/ }), /***/ "./src/foundation/components/Animation/AnimationComponent.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/Animation/AnimationComponent.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationComponent: () => (/* binding */ AnimationComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/AnimationAttribute */ "./src/foundation/definitions/AnimationAttribute.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _system_EventPubSub__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../system/EventPubSub */ "./src/foundation/system/EventPubSub.ts"); /* harmony import */ var _math_Quaternion__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _AnimationOps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./AnimationOps */ "./src/foundation/components/Animation/AnimationOps.ts"); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); const defaultAnimationInfo = { name: '', minStartInputTime: 0, maxEndInputTime: 0, }; const ChangeAnimationInfo = Symbol('AnimationComponentEventChangeAnimationInfo'); const PlayEnd = Symbol('AnimationComponentEventPlayEnd'); /** * A component that manages animation. */ class AnimationComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.animationBlendingRatio = 0; // the value range is [0,1] // Animation Data of each AnimationComponent this.__animationTracks = new Map(); this.__isEffekseerState = -1; /// flags /// this.__isAnimating = true; this.isLoop = true; // Global animation time in Rhodonite this.useGlobalTime = true; // animation time in this animation component this.time = 0; } /// LifeCycle Methods /// $load() { this.moveStageTo(_definitions__WEBPACK_IMPORTED_MODULE_12__.ProcessStage.Logic); } $logic() { if (!AnimationComponent.isAnimating || !this.isAnimating) { return; } this.__applyAnimation(); } __applyAnimation() { let time = this.time; if (this.useGlobalTime) { time = AnimationComponent.globalTime; } const transformComponent = this.entity.getTransform(); const blendShapeComponent = this.entity.tryToGetBlendShape(); const effekseerComponent = this.entity.tryToGetEffekseer(); // process the first active animation track if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.exist(this.__firstActiveAnimationTrackName) && this.animationBlendingRatio < 1) { if (this.isLoop) { const duration = this.getEndInputValueOfAnimation(this.__firstActiveAnimationTrackName); time = (time % duration) + this.getStartInputValueOfAnimation(this.__firstActiveAnimationTrackName); } const animationSetOf1st = this.__animationTracks.get(this.__firstActiveAnimationTrackName); if (animationSetOf1st !== undefined) { for (const [attributeName, channel] of animationSetOf1st) { const i = _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.fromString(attributeName).index; const value = (0,_AnimationOps__WEBPACK_IMPORTED_MODULE_10__.__interpolate)(channel, time, i); if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Quaternion.index) { transformComponent.localRotation = _math_Quaternion__WEBPACK_IMPORTED_MODULE_7__.Quaternion.fromCopyArray4(value); } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Translate.index) { transformComponent.localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray3(value); } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Scale.index) { transformComponent.localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray3(value); } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Weights.index) { blendShapeComponent.weights = value; } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Effekseer.index) { if (value[0] > 0.5) { if (this.__isEffekseerState === 0) { effekseerComponent === null || effekseerComponent === void 0 ? void 0 : effekseerComponent.play(); } } else { if (this.__isEffekseerState === 1) { effekseerComponent === null || effekseerComponent === void 0 ? void 0 : effekseerComponent.pause(); } } this.__isEffekseerState = value[0]; } } } } // process the second active animation track, and blending with the first's one if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.exist(this.__secondActiveAnimationTrackName) && this.animationBlendingRatio > 0) { if (this.isLoop) { const duration = this.getEndInputValueOfAnimation(this.__secondActiveAnimationTrackName); time = (time % duration) + this.getStartInputValueOfAnimation(this.__secondActiveAnimationTrackName); } const animationSetOf2nd = this.__animationTracks.get(this.__secondActiveAnimationTrackName); if (animationSetOf2nd !== undefined) { for (const [attributeName, channel] of animationSetOf2nd) { const i = _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.fromString(attributeName).index; const value = (0,_AnimationOps__WEBPACK_IMPORTED_MODULE_10__.__interpolate)(channel, time, i); if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Quaternion.index) { const quatOf2nd = _math_Quaternion__WEBPACK_IMPORTED_MODULE_7__.Quaternion.fromCopyArray4(value); transformComponent.localRotation = _math_Quaternion__WEBPACK_IMPORTED_MODULE_7__.Quaternion.qlerp(transformComponent.localRotationInner, quatOf2nd, this.animationBlendingRatio); } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Translate.index) { const vec3Of2nd = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray3(value); transformComponent.localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.lerp(transformComponent.localPositionInner, vec3Of2nd, this.animationBlendingRatio); } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Scale.index) { const vec3of2nd = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray3(value); transformComponent.localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.lerp(transformComponent.localScaleInner, vec3of2nd, this.animationBlendingRatio); } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Weights.index) { const weightsOf2nd = value; for (let i = 0; i < weightsOf2nd.length; i++) { blendShapeComponent.weights[i] = _math__WEBPACK_IMPORTED_MODULE_11__.MathUtil.lerp(blendShapeComponent.weights[i], weightsOf2nd[i], this.animationBlendingRatio); } } else if (i === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.Effekseer.index) { // do nothing } } } } } static subscribe(type, handler) { AnimationComponent.__pubsub.subscribe(type, handler); } setIsAnimating(flg) { this.__isAnimating = flg; } static setActiveAnimationForAll(animationTrackName) { const components = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentsWithType(AnimationComponent); for (const component of components) { component.setActiveAnimationTrack(animationTrackName); } } setActiveAnimationTrack(animationTrackName) { if (this.__animationTracks.has(animationTrackName)) { this.__firstActiveAnimationTrackName = animationTrackName; return true; } else { return false; } } setSecondActiveAnimationTrack(animationTrackName) { if (this.__animationTracks.has(animationTrackName)) { this.__secondActiveAnimationTrackName = animationTrackName; return true; } else { return false; } } getActiveAnimationTrack() { return this.__firstActiveAnimationTrackName; } hasAnimation(trackName, pathName) { const animationSet = this.__animationTracks.get(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationSet)) { return false; } return animationSet.has(pathName); } /** * set an animation channel to AnimationSet * @param trackName - the name of animation track * @param pathName - the name of animation path * @param inputArray - the array of input values * @param outputArray - the array of output values * @param outputComponentN - the number of output value's components * @param interpolation - the interpolation type * @param makeThisActiveAnimation - if true, set this animation track as current active animation */ setAnimation(trackName, pathName, inputArray, outputArray, outputComponentN, interpolation, makeThisActiveAnimation = true) { // set the current Active AnimationTrackName if (makeThisActiveAnimation) { this.__firstActiveAnimationTrackName = trackName; } else { this.__firstActiveAnimationTrackName = (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_5__.valueWithDefault)({ value: this.__firstActiveAnimationTrackName, defaultValue: trackName, }); } // set an animation channel to AnimationSet const animationSet = (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_5__.valueWithCompensation)({ value: this.__animationTracks.get(trackName), compensation: () => { const animationSet = new Map(); this.__animationTracks.set(trackName, animationSet); return animationSet; }, }); const channel = { sampler: { input: inputArray, output: outputArray, outputComponentN, interpolationMethod: interpolation, }, target: { pathName: pathName, entity: this.entity, }, belongTrackName: trackName, }; animationSet.set(pathName, channel); // update AnimationInfo const newMinStartInputTime = inputArray[0]; const newMaxEndInputTime = inputArray[inputArray.length - 1]; // const existingAnimationInfo = valueWithDefault({ // value: AnimationComponent.__animationGlobalInfo.get(trackName), // defaultValue: defaultAnimationInfo, // }); // const existingMaxStartInputTime = existingAnimationInfo.minStartInputTime; // const existingMaxEndInputTime = existingAnimationInfo.maxEndInputTime; // const startResult = lessThan(existingMaxStartInputTime, newMaxStartInputTime); // const endResult = greaterThan(newMaxEndInputTime, existingMaxEndInputTime); // if (startResult.result || endResult.result) { const info = { name: trackName, minStartInputTime: newMinStartInputTime, maxEndInputTime: newMaxEndInputTime, }; AnimationComponent.__animationGlobalInfo.set(trackName, info); AnimationComponent.__pubsub.publishAsync(AnimationComponent.Event.ChangeAnimationInfo, { infoMap: new Map(AnimationComponent.__animationGlobalInfo), }); // } // backup the current transform as rest pose this.entity.getTransform()._backupTransformAsRest(); } getStartInputValueOfAnimation(animationTrackName) { let maxStartInputTime = Number.MAX_VALUE; const animationTrack = this.__animationTracks.get(animationTrackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationTrack)) { return -1; } animationTrack.forEach((channel) => { const input = channel.sampler.input[0]; if (input < maxStartInputTime) { maxStartInputTime = input; } }); return maxStartInputTime; } getEndInputValueOfAnimation(animationTrackName) { const animationTrack = this.__animationTracks.get(animationTrackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationTrack)) { return -1; } let maxEndInputTime = 0; animationTrack.forEach((channel) => { const input = channel.sampler.input[channel.sampler.input.length - 1]; if (maxEndInputTime < input) { maxEndInputTime = input; } }); return maxEndInputTime; } /** * get the Array of Animation Track Name * @returns Array of Animation Track Name */ static getAnimationList() { return Array.from(this.__animationGlobalInfo.keys()); } /** * get the AnimationInfo of the Component * @returns the map of */ static getAnimationInfo() { return new Map(this.__animationGlobalInfo); } /** * get animation track names of this component * @returns an array of animation track name */ getAnimationTrackNames() { return Array.from(this.__animationTracks.keys()); } /** * get the animation channels of the animation track * @param animationTrackName the name of animation track to get * @returns the channel maps of the animation track */ getAnimationChannelsOfTrack(animationTrackName) { return this.__animationTracks.get(animationTrackName); } get isAnimating() { return this.__isAnimating; } static get startInputValue() { const components = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentsWithType(AnimationComponent); if (components.length === 0) { return 0; } else { const infoArray = Array.from(this.__animationGlobalInfo.values()); const lastInfo = infoArray[infoArray.length - 1]; return lastInfo.minStartInputTime; } } static get endInputValue() { const components = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentsWithType(AnimationComponent); if (components.length === 0) { return 0; } else { const infoArray = Array.from(this.__animationGlobalInfo.values()); const lastInfo = infoArray[infoArray.length - 1]; return lastInfo.maxEndInputTime; } } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.AnimationComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.AnimationComponentTID; } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.getEntity(this.__entityUid); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class AnimationEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getAnimation() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.AnimationComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.applyMixins)(base, AnimationEntity); return base; } addKeyFrame(trackName, pathName, frameToInsert, fps) { const secBegin = frameToInsert / fps; const input = secBegin; const secEnd = (frameToInsert + 1) / fps; const animationSet = this.__animationTracks.get(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationSet)) { return false; } const channel = animationSet.get(pathName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(channel)) { return false; } const i = _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_4__.AnimationAttribute.fromString(pathName).index; const output = (0,_AnimationOps__WEBPACK_IMPORTED_MODULE_10__.__interpolate)(channel, AnimationComponent.globalTime, i); if (channel.sampler.input.length === 0) { const inputArray = Array.from(channel.sampler.input); inputArray.push(input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.push(...output); channel.sampler.output = new Float32Array(outputArray); } else if (channel.sampler.input.length === 1) { const existedInput = channel.sampler.input[0]; if (secEnd < existedInput) { const inputArray = Array.from(channel.sampler.input); inputArray.unshift(input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.unshift(...output); channel.sampler.output = new Float32Array(outputArray); } else if (existedInput < secBegin) { const inputArray = Array.from(channel.sampler.input); inputArray.push(input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.push(...output); channel.sampler.output = new Float32Array(outputArray); } else { // secBegin <= existedInput <= secEnd const inputArray = Array.from(channel.sampler.input); inputArray.splice(0, 0, input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.splice(0, 0, ...output); channel.sampler.output = new Float32Array(outputArray); } } else { // channel.sampler.input.length >= 2 for (let i = 0; i < channel.sampler.input.length; i++) { const existedInput = channel.sampler.input[i]; if (secBegin <= existedInput) { if (secBegin <= existedInput && existedInput <= secEnd) { channel.sampler.input[i] = input; for (let j = 0; j < channel.sampler.outputComponentN; j++) { channel.sampler.output[i * channel.sampler.outputComponentN + j] = output[j]; } } else { const inputArray = Array.from(channel.sampler.input); inputArray.splice(i, 0, input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.splice(i * channel.sampler.outputComponentN, 0, ...output); channel.sampler.output = new Float32Array(outputArray); } break; } } } return true; } addKeyFrameWithValue(trackName, pathName, frameToInsert, output, fps) { const secBegin = frameToInsert / fps; const input = secBegin; const secEnd = (frameToInsert + 1) / fps; const animationSet = this.__animationTracks.get(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationSet)) { return false; } const channel = animationSet.get(pathName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(channel)) { return false; } if (channel.sampler.input.length === 0) { const inputArray = Array.from(channel.sampler.input); inputArray.push(input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.push(...output); channel.sampler.output = new Float32Array(outputArray); } else if (channel.sampler.input.length === 1) { const existedInput = channel.sampler.input[0]; if (secEnd < existedInput) { const inputArray = Array.from(channel.sampler.input); inputArray.unshift(input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.unshift(...output); channel.sampler.output = new Float32Array(outputArray); } else if (existedInput < secBegin) { const inputArray = Array.from(channel.sampler.input); inputArray.push(input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.push(...output); channel.sampler.output = new Float32Array(outputArray); } else { // secBegin <= existedInput <= secEnd const inputArray = Array.from(channel.sampler.input); inputArray.splice(0, 0, input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.splice(0, 0, ...output); channel.sampler.output = new Float32Array(outputArray); } } else { // channel.sampler.input.length >= 2 for (let i = 0; i < channel.sampler.input.length; i++) { const existedInput = channel.sampler.input[i]; if (secBegin <= existedInput) { if (secBegin <= existedInput && existedInput <= secEnd) { channel.sampler.input[i] = input; for (let j = 0; j < channel.sampler.outputComponentN; j++) { channel.sampler.output[i * channel.sampler.outputComponentN + j] = output[j]; } } else { const inputArray = Array.from(channel.sampler.input); inputArray.splice(i, 0, input); channel.sampler.input = new Float32Array(inputArray); const outputArray = Array.from(channel.sampler.output); outputArray.splice(i * channel.sampler.outputComponentN, 0, ...output); channel.sampler.output = new Float32Array(outputArray); } break; } } } return true; } deleteKeysAtFrame(trackName, pathName, frameToDelete, fps) { const secBegin = frameToDelete / fps; const secEnd = (frameToDelete + 1) / fps; const animationSet = this.__animationTracks.get(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationSet)) { return false; } const channel = animationSet.get(pathName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(channel)) { return false; } for (let i = 0; i < channel.sampler.input.length; i++) { const input = channel.sampler.input[i]; if (secBegin <= input && input < secEnd) { const input = Array.from(channel.sampler.input); input.splice(i, 1); channel.sampler.input = new Float32Array(input); const output = Array.from(channel.sampler.output); output.splice(i * channel.sampler.outputComponentN, channel.sampler.outputComponentN); channel.sampler.output = new Float32Array(output); } } return true; } hasKeyFramesAtFrame(trackName, pathName, frame, fps) { const secBegin = frame / fps; const secEnd = (frame + 1) / fps; const animationSet = this.__animationTracks.get(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(animationSet)) { return false; } const channel = animationSet.get(pathName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(channel)) { return false; } for (let i = 0; i < channel.sampler.input.length; i++) { const input = channel.sampler.input[i]; if (secBegin <= input && input < secEnd) { return true; } } return false; } static setIsAnimating(flag) { this.isAnimating = flag; } _shallowCopyFrom(component_) { const component = component_; this.__firstActiveAnimationTrackName = component.__firstActiveAnimationTrackName; this.__animationTracks = new Map(component.__animationTracks); this.__isEffekseerState = component.__isEffekseerState; this.__isAnimating = component.__isAnimating; } _setRetarget(retarget, postfixToTrackName) { const srcEntity = retarget.getEntity(); const srcAnim = srcEntity.tryToGetAnimation(); const dstEntity = this.entity; this.entity.getTransform()._backupTransformAsRest(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(srcAnim)) { return []; } srcAnim.useGlobalTime = false; const trackNames = []; for (const [_trackName, track] of srcAnim.__animationTracks) { const trackName = _trackName + (postfixToTrackName !== null && postfixToTrackName !== void 0 ? postfixToTrackName : ''); trackNames.push(trackName); for (const [pathName, channel] of track) { if (channel == null) { continue; } const input = channel.sampler.input; if (channel.target.pathName === 'translate') { const outputs = retargetTranslate(input, srcAnim); this.setAnimation(trackName, pathName, input, outputs, 3, channel.sampler.interpolationMethod, false); } if (channel.target.pathName === 'quaternion') { const outputs = retargetQuaternion(input, srcAnim); this.setAnimation(trackName, pathName, input, outputs, 4, channel.sampler.interpolationMethod, false); } if (channel.target.pathName === 'scale') { const outputs = retargetScale(input, srcAnim); this.setAnimation(trackName, pathName, input, outputs, 3, channel.sampler.interpolationMethod, false); } } } function retargetTranslate(input, srcAnim) { const outputsTranslation = new Float32Array(input.length * 3); for (let i = 0; i < input.length; i++) { srcAnim.time = input[i]; srcAnim.__applyAnimation(); const outputTranslation = retarget.retargetTranslate(dstEntity); outputsTranslation[i * 3 + 0] = outputTranslation.x; outputsTranslation[i * 3 + 1] = outputTranslation.y; outputsTranslation[i * 3 + 2] = outputTranslation.z; } return outputsTranslation; } function retargetQuaternion(input, srcAnim) { const outputsQuaternion = new Float32Array(input.length * 4); for (let i = 0; i < input.length; i++) { srcAnim.time = input[i]; srcAnim.__applyAnimation(); const outputQuaternion = retarget.retargetQuaternion(dstEntity); outputsQuaternion[i * 4 + 0] = outputQuaternion.x; outputsQuaternion[i * 4 + 1] = outputQuaternion.y; outputsQuaternion[i * 4 + 2] = outputQuaternion.z; outputsQuaternion[i * 4 + 3] = outputQuaternion.w; } return outputsQuaternion; } function retargetScale(input, srcAnim) { const outputsScale = new Float32Array(input.length * 3); for (let i = 0; i < input.length; i++) { srcAnim.time = input[i]; srcAnim.__applyAnimation(); const outputScale = retarget.retargetScale(dstEntity); outputsScale[i * 3 + 0] = outputScale.x; outputsScale[i * 3 + 1] = outputScale.y; outputsScale[i * 3 + 2] = outputScale.z; } return outputsScale; } return trackNames; } resetAnimationTracks() { this.__animationTracks.clear(); } resetAnimationTrack(trackName) { this.__animationTracks.delete(trackName); } resetAnimationTrackByPostfix(postfix) { const trackNames = this.getAnimationTrackNames(); for (const trackName of trackNames) { if (trackName.endsWith(postfix)) { this.__animationTracks.delete(trackName); } } } _destroy() { super._destroy(); this.__animationTracks.clear(); this.__isAnimating = false; } } AnimationComponent.__animationGlobalInfo = new Map(); AnimationComponent.isAnimating = true; AnimationComponent.globalTime = 0; // Event for pubsub of notifications AnimationComponent.Event = { ChangeAnimationInfo, PlayEnd, }; AnimationComponent.__pubsub = new _system_EventPubSub__WEBPACK_IMPORTED_MODULE_6__.EventPubSub(); /***/ }), /***/ "./src/foundation/components/Animation/AnimationConstants.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/Animation/AnimationConstants.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ defaultAnimationTrackName: () => (/* binding */ defaultAnimationTrackName) /* harmony export */ }); const defaultAnimationTrackName = 'Default'; /***/ }), /***/ "./src/foundation/components/Animation/AnimationOps.ts": /*!*************************************************************!*\ !*** ./src/foundation/components/Animation/AnimationOps.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ __interpolate: () => (/* binding */ __interpolate) /* harmony export */ }); /* harmony import */ var _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/AnimationAttribute */ "./src/foundation/definitions/AnimationAttribute.ts"); /* harmony import */ var _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/AnimationInterpolation */ "./src/foundation/definitions/AnimationInterpolation.ts"); /* harmony import */ var _math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/raw/raw_extension */ "./src/foundation/math/raw/raw_extension.ts"); /** * Compute cubic spline interpolation. * @param p_0 starting point * @param p_1 ending point * @param m_0 inTangent * @param m_1 outTangent * @param t ratio * @param animationAttributeIndex index of attribution */ function cubicSpline(p0, p1, m0, m1, t) { const ret = new Array(p0.length); for (let i = 0; i < p0.length; i++) { ret[i] = (2 * t ** 3 - 3 * t ** 2 + 1) * p0[i] + (t ** 3 - 2 * t ** 2 + t) * m0[i] + (-2 * t ** 3 + 3 * t ** 2) * p1[i] + (t ** 3 - t ** 2) * m1[i]; } return ret; } function __prepareVariablesForCubicSpline(outputArray_, i, componentN, t_diff) { const outputArray = outputArray_; if (componentN === 4) { const p_0 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get4_offset]( // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn componentN * 3 * i + componentN); const p_1 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get4_offset]( // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn componentN * 3 * (i + 1) + componentN); const m_0 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.mulArray4WithScalar_offset](componentN * 3 * i + componentN * 2, t_diff); const m_1 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.mulArray4WithScalar_offset](componentN * 3 * (i + 1), t_diff); return { p_0, p_1, m_0, m_1 }; } else if (componentN === 3) { const p_0 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get3_offset]( // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn componentN * 3 * i + componentN); const p_1 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get3_offset]( // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn componentN * 3 * (i + 1) + componentN); const m_0 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.mulArray3WithScalar_offset](componentN * 3 * i + componentN * 2, t_diff); const m_1 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.mulArray3WithScalar_offset](componentN * 3 * (i + 1), t_diff); return { p_0, p_1, m_0, m_1 }; } else { const p_0 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.getN_offset]( // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn componentN * 3 * i + componentN, componentN); const p_1 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.getN_offset]( // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn componentN * 3 * (i + 1) + componentN, componentN); const m_0 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.mulArrayNWithScalar_offset](componentN * 3 * i + componentN * 2, componentN, t_diff); const m_1 = outputArray[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.mulArrayNWithScalar_offset](componentN * 3 * (i + 1), componentN, t_diff); return { p_0, p_1, m_0, m_1 }; } } function __getOutputValue(keyFrameId, channel, array_) { const array = array_; if (channel.sampler.interpolationMethod === _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_1__.AnimationInterpolation.CubicSpline) { // In glTF CUBICSPLINE interpolation, tangents (ak, bk) and values (vk) are grouped within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn if (channel.sampler.outputComponentN === 4) { // Quaternion/weights const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get4_offset](channel.sampler.outputComponentN * 3 * keyFrameId + channel.sampler.outputComponentN); return value; } else if (channel.sampler.outputComponentN === 3) { // Translate/Scale/weights const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get3_offset](channel.sampler.outputComponentN * 3 * keyFrameId + channel.sampler.outputComponentN); return value; } else if (channel.sampler.outputComponentN === 1) { const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get1_offset](channel.sampler.outputComponentN * 3 * keyFrameId + channel.sampler.outputComponentN); return value; } else { // weights // outputComponentN === N const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.getN_offset](channel.sampler.outputComponentN * 3 * keyFrameId + channel.sampler.outputComponentN, channel.sampler.outputComponentN); return value; } } else { // For Other than CUBICSPLINE interpolation if (channel.sampler.outputComponentN === 4) { // Quaternion/weights const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get4_offsetAsComposition](keyFrameId); return value; } else if (channel.sampler.outputComponentN === 3) { // Translate/Scale/weights const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get3_offsetAsComposition](keyFrameId); return value; } else if (channel.sampler.outputComponentN === 1) { // Effekseer (Animation Event) const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.get1_offsetAsComposition](keyFrameId); return value; } else { // weights const value = array[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.getN_offsetAsComposition](keyFrameId, channel.sampler.outputComponentN); return value; } } } function binarySearch(inputArray, currentTime) { let low = 0; let high = inputArray.length - 1; let mid = 0; let retVal = 0; while (low <= high) { mid = low + ((high - low) >> 1); if (inputArray[mid] < currentTime) { low = mid + 1; retVal = mid; } else if (currentTime < inputArray[mid]) { high = mid - 1; retVal = high; } else { // if (inputArray[mid] === input) { return mid; } } return retVal; } function bruteForceSearch(inputArray, currentTime) { for (let i = 0; i < inputArray.length; i++) { if (inputArray[i] <= currentTime && currentTime < inputArray[i + 1]) { return i; } } return inputArray.length - 1; } function interpolationSearch(inputArray, currentTime) { let mid = 0; let lower = 0; let upper = inputArray.length - 1; let retVal = 0; while (lower <= upper && currentTime >= inputArray[lower] && currentTime <= inputArray[upper]) { mid = Math.floor(lower + ((currentTime - inputArray[lower]) * (upper - lower)) / (inputArray[upper] - inputArray[lower])); if (inputArray[mid] < currentTime) { lower = mid + 1; retVal = mid; } else if (currentTime < inputArray[mid]) { upper = mid - 1; retVal = upper; } else { // if (inputArray[mid] === input) { return mid; } } return retVal; } function __lerp(data_, ratio, animationAttributeIndex, i, outputComponentN) { const data = data_; if (animationAttributeIndex === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_0__.AnimationAttribute.Quaternion.index) { const array4 = data[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.qlerp_offsetAsComposition](data, ratio, i, i + 1); return array4; } else if (animationAttributeIndex === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_0__.AnimationAttribute.Weights.index) { const arrayN = data[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.arrayN_lerp_offsetAsComposition](data, outputComponentN, ratio, i, i + 1); return arrayN; } else { // Translate / Scale const array3 = data[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.array3_lerp_offsetAsComposition](data, ratio, i, i + 1); return array3; } } function __interpolate(channel, currentTime, animationAttributeIndex) { var _a; const inputArray = channel.sampler.input; const outputArray = channel.sampler.output; const method = (_a = channel.sampler.interpolationMethod) !== null && _a !== void 0 ? _a : _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_1__.AnimationInterpolation.Linear; // out of range if (currentTime <= inputArray[0]) { const outputOfZeroFrame = __getOutputValue(0, channel, outputArray); return outputOfZeroFrame; } else if (inputArray[inputArray.length - 1] <= currentTime) { const outputOfEndFrame = __getOutputValue(inputArray.length - 1, channel, outputArray); return outputOfEndFrame; } if (method === _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_1__.AnimationInterpolation.CubicSpline) { // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#appendix-c-spline-interpolation const i = interpolationSearch(inputArray, currentTime); const t_diff = inputArray[i + 1] - inputArray[i]; // t_(k+1) - t_k const t = (currentTime - inputArray[i]) / t_diff; const { p_0, p_1, m_0, m_1 } = __prepareVariablesForCubicSpline(outputArray, i, channel.sampler.outputComponentN, t_diff); const ret = cubicSpline(p_0, p_1, m_0, m_1, t); if (animationAttributeIndex === _definitions_AnimationAttribute__WEBPACK_IMPORTED_MODULE_0__.AnimationAttribute.Quaternion.index) { ret[_math_raw_raw_extension__WEBPACK_IMPORTED_MODULE_2__.normalizeArray4](); } return ret; } else if (method === _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_1__.AnimationInterpolation.Linear) { const i = interpolationSearch(inputArray, currentTime); const ratio = (currentTime - inputArray[i]) / (inputArray[i + 1] - inputArray[i]); const ret = __lerp(outputArray, ratio, animationAttributeIndex, i, channel.sampler.outputComponentN); return ret; } else if (method === _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_1__.AnimationInterpolation.Step) { for (let i = 0; i < inputArray.length - 1; i++) { if (inputArray[i] <= currentTime && currentTime < inputArray[i + 1]) { const output_frame_i = __getOutputValue(i, channel, outputArray); return output_frame_i; } } const outputOfEndFrame = __getOutputValue(inputArray.length - 1, channel, outputArray); return outputOfEndFrame; } // non supported type return []; } /***/ }), /***/ "./src/foundation/components/Animation/IAnimationEntity.ts": /*!*****************************************************************!*\ !*** ./src/foundation/components/Animation/IAnimationEntity.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Animation/index.ts": /*!******************************************************!*\ !*** ./src/foundation/components/Animation/index.ts ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationComponent: () => (/* reexport safe */ _AnimationComponent__WEBPACK_IMPORTED_MODULE_0__.AnimationComponent), /* harmony export */ defaultAnimationTrackName: () => (/* reexport safe */ _AnimationConstants__WEBPACK_IMPORTED_MODULE_2__.defaultAnimationTrackName) /* harmony export */ }); /* harmony import */ var _AnimationComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _IAnimationEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IAnimationEntity */ "./src/foundation/components/Animation/IAnimationEntity.ts"); /* harmony import */ var _AnimationConstants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AnimationConstants */ "./src/foundation/components/Animation/AnimationConstants.ts"); /***/ }), /***/ "./src/foundation/components/AnimationState/AnimationStateComponent.ts": /*!*****************************************************************************!*\ !*** ./src/foundation/components/AnimationState/AnimationStateComponent.ts ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationStateComponent: () => (/* binding */ AnimationStateComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); class AnimationStateComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityComponent, isReUse) { super(entityUid, componentSid, entityComponent, isReUse); this.__activeAnimationTrack = ''; this.__interpolationStartTime = performance.now(); this.__blendingDuration = 1.0; this.__isBlending = false; this.__blendingRatio = 0.0; this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.AnimationStateComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.AnimationStateComponentTID; } get isBlending() { return this.__isBlending; } get blendingRatio() { return this.__blendingRatio; } $logic() { if (!this.__isBlending) { return; } const elapsedTime = (performance.now() - this.__interpolationStartTime) / 1000; const blendingTime = elapsedTime / this.__blendingDuration; if (blendingTime >= 1) { this.__isBlending = false; } const ratio = Math.min(blendingTime, 1); this.setAnimationBlendingRatio(ratio); this.__blendingRatio = ratio; } setFirstActiveAnimationTrack(trackName) { this.__activeAnimationTrack = trackName; this.setActiveAnimationTrack(trackName); this.setAnimationBlendingRatio(0); this.__isBlending = false; } forceTransitionTo(trackName, duration) { const prevTrack = this.__activeAnimationTrack; this.setActiveAnimationTrack(prevTrack); this.setSecondActiveAnimationTrack(trackName); this.__interpolationStartTime = performance.now(); this.__blendingDuration = duration; this.__activeAnimationTrack = trackName; this.__isBlending = true; } setActiveAnimationTrack(animationTrackName) { function processRecursively(entity) { const anim = entity.tryToGetAnimation(); if (anim != null) { anim.setActiveAnimationTrack(animationTrackName); } for (const child of entity.children) { processRecursively(child.entity); } } processRecursively(this.entity); } setSecondActiveAnimationTrack(animationTrackName) { function processRecursively(entity) { const anim = entity.tryToGetAnimation(); if (anim != null) { anim.setSecondActiveAnimationTrack(animationTrackName); } for (const child of entity.children) { processRecursively(child.entity); } } processRecursively(this.entity); } setUseGlobalTime(flg) { function processRecursively(entity) { const anim = entity.tryToGetAnimation(); if (anim != null) { anim.useGlobalTime = flg; } for (const child of entity.children) { processRecursively(child.entity); } } processRecursively(this.entity); } setIsLoop(flg) { function processRecursively(entity) { const anim = entity.tryToGetAnimation(); if (anim != null) { anim.isLoop = flg; } for (const child of entity.children) { processRecursively(child.entity); } } processRecursively(this.entity); } setTime(time) { function processRecursively(entity) { const anim = entity.tryToGetAnimation(); if (anim != null) { anim.time = time; } for (const child of entity.children) { processRecursively(child.entity); } } processRecursively(this.entity); } setAnimationBlendingRatio(ratio) { function processRecursively(entity) { const anim = entity.tryToGetAnimation(); if (anim != null) { anim.animationBlendingRatio = ratio; } for (const child of entity.children) { processRecursively(child.entity); } } processRecursively(this.entity); } _destroy() { super._destroy(); } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.getEntity(this.__entityUid); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class BlendShapeEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getAnimationState() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.AnimationStateComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, BlendShapeEntity); return base; } } /***/ }), /***/ "./src/foundation/components/BlendShape/BlendShapeComponent.ts": /*!*********************************************************************!*\ !*** ./src/foundation/components/BlendShape/BlendShapeComponent.ts ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlendShapeComponent: () => (/* binding */ BlendShapeComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /** * The Component that manages the blend shape. */ class BlendShapeComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityComponent, isReUse) { super(entityUid, componentSid, entityComponent, isReUse); this.__weights = []; this.__targetNames = []; this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__.ProcessStage.Logic); } static get updateCount() { return this.__updateCount; } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.BlendShapeComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.BlendShapeComponentTID; } set weights(weights) { this.__weights = weights; BlendShapeComponent.__updateCount++; } get weights() { return this.__weights; } set targetNames(names) { this.__targetNames = names; BlendShapeComponent.__updateCount++; } get targetNames() { return this.__targetNames; } setWeightByIndex(index, weight) { this.__weights[index] = weight; BlendShapeComponent.__updateCount++; } $logic() { } _destroy() { super._destroy(); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class BlendShapeEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getBlendShape() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.BlendShapeComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, BlendShapeEntity); return base; } } BlendShapeComponent.__updateCount = 0; /***/ }), /***/ "./src/foundation/components/BlendShape/IBlendShapeEntity.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/BlendShape/IBlendShapeEntity.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/BlendShape/index.ts": /*!*******************************************************!*\ !*** ./src/foundation/components/BlendShape/index.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlendShapeComponent: () => (/* reexport safe */ _BlendShapeComponent__WEBPACK_IMPORTED_MODULE_0__.BlendShapeComponent) /* harmony export */ }); /* harmony import */ var _BlendShapeComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BlendShapeComponent */ "./src/foundation/components/BlendShape/BlendShapeComponent.ts"); /* harmony import */ var _IBlendShapeEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./IBlendShapeEntity */ "./src/foundation/components/BlendShape/IBlendShapeEntity.ts"); /***/ }), /***/ "./src/foundation/components/Camera/CameraComponent.ts": /*!*************************************************************!*\ !*** ./src/foundation/components/Camera/CameraComponent.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CameraComponent: () => (/* binding */ CameraComponent) /* harmony export */ }); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/CameraType */ "./src/foundation/definitions/CameraType.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _geometry_Frustum__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../geometry/Frustum */ "./src/foundation/geometry/Frustum.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _definitions_LightType__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../definitions/LightType */ "./src/foundation/definitions/LightType.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../CameraController/CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /** * The Component that represents a camera. * * @remarks * The camera is defined such that the local +X axis is to the right, * the “lens” looks towards the local -Z axis, * and the top of the camera is aligned with the local +Y axis. */ class CameraComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_1__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this._eyeInner = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.dummy(); this._direction = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.dummy(); this._directionInner = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.dummy(); this._up = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.dummy(); this._upInner = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.dummy(); this._filmWidth = 36; // mili meter this._filmHeight = 24; // mili meter this._focalLength = 20; this.primitiveMode = false; // x: left, y:right, z:top, w: bottom this._corner = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4.dummy(); this._cornerInner = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4.dummy(); // x: zNear, y: zFar, // if perspective, z: fovy, w: aspect // if ortho, z: xmag, w: ymag this._parameters = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4.dummy(); this._parametersInner = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4.dummy(); this.__type = _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Perspective; this._projectionMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.dummy(); this.__isProjectionMatrixUpToDate = false; this._viewMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.dummy(); this.__isViewMatrixUpToDate = false; this._xrLeft = false; this._xrRight = false; this.isSyncToLight = false; this.__frustum = new _geometry_Frustum__WEBPACK_IMPORTED_MODULE_14__.Frustum(); this.__updateCount = 0; this.__lastUpdateCount = -1; this.__lastTransformComponentsUpdateCount = -1; this.__lastLightComponentsUpdateCount = -1; this.__lastCameraControllerComponentsUpdateCount = -1; this._setMaxNumberOfComponent(Math.max(10, Math.floor(_core_Config__WEBPACK_IMPORTED_MODULE_15__.Config.maxEntityNumber / 100))); this.setFovyAndChangeFocalLength(90); if (CameraComponent.current === -1) { CameraComponent.current = componentSid; } this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'eyeInner', _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0, 0, 0]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'direction', _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0, 0, -1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'up', _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0, 1, 0]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'directionInner', _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0, 0, -1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'upInner', _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0, 1, 0]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'corner', _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [-1, 1, 1, -1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'cornerInner', _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [-1, 1, 1, -1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'parameters', _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0.1, 10000, 90, 1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'parametersInner', _math_MutableVector4__WEBPACK_IMPORTED_MODULE_12__.MutableVector4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [0.1, 10000, 90, 1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'projectionMatrix', _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_8__.BufferUse.CPUGeneric, 'viewMatrix', _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); this.submitToAllocation(_core_Config__WEBPACK_IMPORTED_MODULE_15__.Config.maxCameraNumber, isReUse); if (isReUse) { return; } const globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__.GlobalDataRepository.getInstance(); globalDataRepository.takeOne('viewMatrix'); globalDataRepository.takeOne('projectionMatrix'); globalDataRepository.takeOne('viewPosition'); } static set current(componentSID) { this.__current = componentSID; } static get current() { return this.__current; } set type(type) { this.__type = type; if (type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Orthographic) { this._parameters.z = 1; this._parameters.w = 1; this._parametersInner.z = 1; this._parametersInner.w = 1; } else { this.setFovyAndChangeFocalLength(90); this._parameters.w = 1; this._parametersInner.z = 90; this._parametersInner.w = 1; } this.__updateCount++; } get type() { return this.__type; } get eye() { // In Rhodonite, eye is always (0,0,0). Use TransformComponent for Camera positioning return CameraComponent._eye; } set eye(noUseVec) { throw Error('In Rhodonite, eye is always (0,0,0). Use TransformComponent for Camera positioning.'); } get eyeInner() { return this._eyeInner; } /** * @internal */ set eyeInner(vec) { this._eyeInner.copyComponents(vec); this.__updateCount++; } set upInner(vec) { this._upInner.copyComponents(vec); this.__updateCount++; } set up(vec) { this._up.copyComponents(vec); this.__updateCount++; } get up() { return this._up.clone(); } get upInner() { return this._upInner; } set direction(vec) { const oldDirection = this._direction; const newDirection = vec; const oldUp = this._up; const orthogonalVectorNewDirectionAndOldUp = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.crossTo(newDirection, oldUp, CameraComponent.__tmpVector3_0); const isOrthogonalNewDirectionAndOldUp = orthogonalVectorNewDirectionAndOldUp.length() === 0.0; let newUpNonNormalize; if (isOrthogonalNewDirectionAndOldUp) { const relativeXaxis = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.crossTo(oldDirection, oldUp, CameraComponent.__tmpVector3_1); newUpNonNormalize = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.crossTo(relativeXaxis, newDirection, CameraComponent.__tmpVector3_2); } else { const newDirectionComponentInOldUp = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.multiplyTo(newDirection, newDirection.dot(oldUp), CameraComponent.__tmpVector3_1); newUpNonNormalize = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.subtractTo(oldUp, newDirectionComponentInOldUp, CameraComponent.__tmpVector3_2); } this._up.copyComponents(newUpNonNormalize).normalize(); this._direction.copyComponents(newDirection); this.__updateCount++; } set directionInner(vec) { this._directionInner.copyComponents(vec); this.__updateCount++; } get direction() { return this._direction.clone(); } get directionInner() { return this._directionInner; } set corner(vec) { this._corner.copyComponents(vec); this.__updateCount++; } get corner() { return this._corner.clone(); } set left(value) { this._corner.x = value; this.__updateCount++; } set leftInner(value) { this._cornerInner.x = value; this.__updateCount++; } get left() { return this._corner.x; } set right(value) { this._corner.y = value; this.__updateCount++; } set rightInner(value) { this._cornerInner.y = value; this.__updateCount++; } get right() { return this._corner.y; } set top(value) { this._corner.z = value; this.__updateCount++; } set topInner(value) { this._cornerInner.z = value; this.__updateCount++; } get top() { return this._corner.z; } set bottom(value) { this._corner.w = value; this.__updateCount++; } set bottomInner(value) { this._cornerInner.w = value; this.__updateCount++; } get bottom() { return this._corner.w; } set cornerInner(vec) { this._cornerInner.copyComponents(vec); this.__updateCount++; } get cornerInner() { return this._cornerInner; } // set parameters(vec: Vector4) { // this._parameters.copyComponents(vec); // } set parametersInner(vec) { this._parametersInner.copyComponents(vec); this.__updateCount++; } get parametersInner() { return this._parametersInner; } get parameters() { return this._parameters.clone(); } set zNear(val) { this._parameters.x = val; this.__updateCount++; } set zNearInner(val) { this._parametersInner.x = val; this.__updateCount++; } get zNearInner() { return this._parametersInner.x; } get zNear() { return this._parameters.x; } set focalLength(val) { this._focalLength = val; this._parameters.z = 2 * _math_MathUtil__WEBPACK_IMPORTED_MODULE_17__.MathUtil.radianToDegree(Math.atan(this._filmHeight / (val * 2))); this.__updateCount++; } get focalLength() { return this._focalLength; } set zFar(val) { this._parameters.y = val; this.__updateCount++; } set zFarInner(val) { this._parametersInner.y = val; this.__updateCount++; } get zFarInner() { return this._parametersInner.y; } get zFar() { return this._parameters.y; } setFovyAndChangeFilmSize(degree) { this._parameters.z = degree; this._filmHeight = 2 * this.focalLength * Math.tan(_math_MathUtil__WEBPACK_IMPORTED_MODULE_17__.MathUtil.degreeToRadian(degree) / 2); this._filmWidth = this._filmHeight * this.aspect; this.__updateCount++; } setFovyAndChangeFocalLength(degree) { this._parameters.z = degree; this._focalLength = this._filmHeight / 2 / Math.tan(_math_MathUtil__WEBPACK_IMPORTED_MODULE_17__.MathUtil.degreeToRadian(degree) / 2); this.__updateCount++; } get fovy() { return this._parameters.z; } set fovyInner(val) { this._parametersInner.z = val; this.__updateCount++; } set aspect(val) { this._parameters.w = val; this._filmWidth = this._filmHeight * val; this.__updateCount++; } set aspectInner(val) { this._parametersInner.w = val; this.__updateCount++; } get aspectInner() { return this._parametersInner.w; } get aspect() { return this._parameters.w; } set xMag(val) { this._parameters.z = val; this.__updateCount++; } get xMag() { return this._parameters.z; } set yMag(val) { this._parameters.w = val; } get yMag() { return this._parameters.w; } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.CameraComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.CameraComponentTID; } calcProjectionMatrix() { const zNear = this._parametersInner.x; const zFar = this._parametersInner.y; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_21__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_22__.ProcessApproach.WebGPU) { if (this.type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Perspective) { const fovy = this._parametersInner.z; let aspect = this._parametersInner.w; if (aspect < 0) { aspect = _system_SystemState__WEBPACK_IMPORTED_MODULE_21__.SystemState.viewportAspectRatio; } const yscale = 1.0 / Math.tan((0.5 * fovy * Math.PI) / 180); const xscale = yscale / aspect; this._projectionMatrix.m00 = xscale; this._projectionMatrix.m01 = 0; this._projectionMatrix.m02 = 0; this._projectionMatrix.m03 = 0; this._projectionMatrix.m10 = 0; this._projectionMatrix.m11 = yscale; this._projectionMatrix.m12 = 0; this._projectionMatrix.m13 = 0; this._projectionMatrix.m20 = 0; this._projectionMatrix.m21 = 0; if (zFar === Infinity) { this._projectionMatrix.m22 = -1; this._projectionMatrix.m23 = -zNear; } else { const nf = 1 / (zNear - zFar); this._projectionMatrix.m22 = zFar * nf; this._projectionMatrix.m23 = zFar * zNear * nf; } this._projectionMatrix.m30 = 0; this._projectionMatrix.m31 = 0; this._projectionMatrix.m32 = -1; this._projectionMatrix.m33 = 0; } else if (this.type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Orthographic) { const xmag = this._parametersInner.z; const ymag = this._parametersInner.w; this._projectionMatrix.setComponents(1 / xmag, 0.0, 0.0, 0, 0.0, 1 / ymag, 0.0, 0, 0.0, 0.0, -1 / (zFar - zNear), -zNear / (zFar - zNear), 0.0, 0.0, 0.0, 1.0); } else { const left = this._cornerInner.x; const right = this._cornerInner.y; const top = this._cornerInner.z; const bottom = this._cornerInner.w; const nf = 1 / (zNear - zFar); this._projectionMatrix.setComponents((2 * zNear) / (right - left), 0.0, (right + left) / (right - left), 0.0, 0.0, (2 * zNear) / (top - bottom), (top + bottom) / (top - bottom), 0.0, 0.0, 0.0, zFar * nf, zFar * zNear * nf, 0.0, 0.0, -1.0, 0.0); } } else { if (this.type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Perspective) { const fovy = this._parametersInner.z; let aspect = this._parametersInner.w; if (aspect < 0) { aspect = _system_SystemState__WEBPACK_IMPORTED_MODULE_21__.SystemState.viewportAspectRatio; } const yscale = 1.0 / Math.tan((0.5 * fovy * Math.PI) / 180); const xscale = yscale / aspect; this._projectionMatrix.m00 = xscale; this._projectionMatrix.m01 = 0; this._projectionMatrix.m02 = 0; this._projectionMatrix.m03 = 0; this._projectionMatrix.m10 = 0; this._projectionMatrix.m11 = yscale; this._projectionMatrix.m12 = 0; this._projectionMatrix.m13 = 0; this._projectionMatrix.m20 = 0; this._projectionMatrix.m21 = 0; if (zFar === Infinity) { this._projectionMatrix.m22 = -1; this._projectionMatrix.m23 = -2 * zNear; } else { const nf = 1 / (zNear - zFar); this._projectionMatrix.m22 = (zFar + zNear) * nf; this._projectionMatrix.m23 = 2.0 * zFar * zNear * nf; } this._projectionMatrix.m30 = 0; this._projectionMatrix.m31 = 0; this._projectionMatrix.m32 = -1; this._projectionMatrix.m33 = 0; } else if (this.type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Orthographic) { const xmag = this._parametersInner.z; const ymag = this._parametersInner.w; this._projectionMatrix.setComponents(1 / xmag, 0.0, 0.0, 0, 0.0, 1 / ymag, 0.0, 0, 0.0, 0.0, -2 / (zFar - zNear), -(zFar + zNear) / (zFar - zNear), 0.0, 0.0, 0.0, 1.0); } else { const left = this._cornerInner.x; const right = this._cornerInner.y; const top = this._cornerInner.z; const bottom = this._cornerInner.w; const nf = 1 / (zNear - zFar); this._projectionMatrix.setComponents((2 * zNear) / (right - left), 0.0, (right + left) / (right - left), 0.0, 0.0, (2 * zNear) / (top - bottom), (top + bottom) / (top - bottom), 0.0, 0.0, 0.0, (zFar + zNear) * nf, 2 * zFar * zNear * nf, 0.0, 0.0, -1.0, 0.0); } } return this._projectionMatrix; } calcViewMatrix() { const eye = this.eyeInner; const f = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.subtractTo(this._directionInner, eye, CameraComponent.__tmpVector3_0).normalize(); const s = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.crossTo(f, this._upInner, CameraComponent.__tmpVector3_1).normalize(); const u = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.crossTo(s, f, CameraComponent.__tmpVector3_2); this._viewMatrix.setComponents(s.x, s.y, s.z, -_math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.dot(s, eye), u.x, u.y, u.z, -_math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.dot(u, eye), -f.x, -f.y, -f.z, _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.dot(f, eye), 0, 0, 0, 1); if (!this.primitiveMode) { const invertWorldMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.invertTo(this.entity.getSceneGraph().matrixInner, CameraComponent.__tmpMatrix44_0); this._viewMatrix.multiply(invertWorldMatrix); } return this._viewMatrix; } get viewMatrix() { return this._viewMatrix; } set viewMatrix(viewMatrix) { this._viewMatrix.copyComponents(viewMatrix); this.__updateCount++; } get projectionMatrix() { if (this._xrLeft || this._xrRight) { const rnXRModule = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_18__.ModuleManager.getInstance().getModule('xr'); if (rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebXRSystem.getInstance().isWebXRMode) { const webXRSystem = rnXRModule.WebXRSystem.getInstance(); if (this._xrLeft) { return webXRSystem.leftProjectionMatrix; } else if (this._xrRight) { return webXRSystem.rightProjectionMatrix; } } } return this._projectionMatrix; } set projectionMatrix(projectionMatrix) { this._projectionMatrix.copyComponents(projectionMatrix); this.__updateCount++; } get viewProjectionMatrix() { return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.multiplyTo(this._projectionMatrix, this._viewMatrix, CameraComponent.__tmpMatrix44_0); } get biasViewProjectionMatrix() { _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.multiplyTo(this._projectionMatrix, this._viewMatrix, CameraComponent.__tmpMatrix44_0); return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.multiplyTo(CameraComponent.__biasMatrix, CameraComponent.__tmpMatrix44_0, CameraComponent.__tmpMatrix44_1); } setValuesToGlobalDataRepositoryOnlyMatrices() { CameraComponent.__globalDataRepository.setValue('viewMatrix', this.componentSID, this.viewMatrix); CameraComponent.__globalDataRepository.setValue('projectionMatrix', this.componentSID, this.projectionMatrix); } setValuesToGlobalDataRepository() { CameraComponent.__globalDataRepository.setValue('viewMatrix', this.componentSID, this.viewMatrix); CameraComponent.__globalDataRepository.setValue('projectionMatrix', this.componentSID, this.projectionMatrix); CameraComponent.__globalDataRepository.setValue('viewPosition', this.componentSID, this.worldPosition); } get worldPosition() { this.entity .getSceneGraph() .matrixInner.multiplyVector3To(this.eyeInner, CameraComponent.returnVector3); return CameraComponent.returnVector3; } updateFrustum() { this.__frustum.update(this.viewMatrix, this.projectionMatrix); } get frustum() { return this.__frustum; } $load() { this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_11__.ProcessStage.Logic); } $logic() { const lightComponent = this.entity.tryToGetLight(); let lightComponentUpdateCount = lightComponent != null ? lightComponent.updateCount : -1; if (this.__lastUpdateCount === this.__updateCount && this.__lastTransformComponentsUpdateCount === _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_23__.TransformComponent.updateCount && this.__lastLightComponentsUpdateCount === lightComponentUpdateCount && this.__lastCameraControllerComponentsUpdateCount === _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_24__.CameraControllerComponent.updateCount) { return; } if (this.isSyncToLight && _misc_Is__WEBPACK_IMPORTED_MODULE_19__.Is.exist(lightComponent)) { // for Shadow Mapping this._eyeInner.copyComponents(CameraComponent._eye); this._directionInner.copyComponents(this._direction); this._upInner.copyComponents(this._up); if (lightComponent.type === _definitions_LightType__WEBPACK_IMPORTED_MODULE_20__.LightType.Spot) { this.type = _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Perspective; this.setFovyAndChangeFilmSize(_math_MathUtil__WEBPACK_IMPORTED_MODULE_17__.MathUtil.radianToDegree(lightComponent.outerConeAngle)); this._cornerInner.copyComponents(this._corner); this.aspect = 1; this.zNear = 0.1; this.zFar = lightComponent.range !== -1 ? lightComponent.range : 10000; this._parametersInner.copyComponents(this._parameters); } else if (lightComponent.type === _definitions_LightType__WEBPACK_IMPORTED_MODULE_20__.LightType.Directional) { this.type = _definitions_CameraType__WEBPACK_IMPORTED_MODULE_6__.CameraType.Orthographic; const areaSize = lightComponent.shadowAreaSizeForDirectionalLight; this._cornerInner.copyComponents(_math_Vector4__WEBPACK_IMPORTED_MODULE_5__.Vector4.fromCopy4(-areaSize, areaSize, areaSize, -areaSize)); this.aspect = 1; this.zNear = 0.1; this.zFar = lightComponent.range !== -1 ? lightComponent.range : 100; this._parametersInner.copyComponents(this._parameters); } } else { const cameraControllerComponent = this.entity.tryToGetCameraController(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_19__.Is.exist(cameraControllerComponent)) { this._parametersInner.w = this._parameters.w; } else { if (!this.primitiveMode) { this._eyeInner.copyComponents(CameraComponent._eye); this._directionInner.copyComponents(this._direction); this._upInner.copyComponents(this._up); this._cornerInner.copyComponents(this._corner); this._parametersInner.copyComponents(this._parameters); } } } this.calcViewMatrix(); if (!this._xrLeft && !this._xrRight) { this.calcProjectionMatrix(); } this.setValuesToGlobalDataRepository(); this.__lastUpdateCount = this.__updateCount; this.__lastTransformComponentsUpdateCount = _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_23__.TransformComponent.updateCount; this.__lastLightComponentsUpdateCount = lightComponentUpdateCount; this.__lastCameraControllerComponentsUpdateCount = _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_24__.CameraControllerComponent.updateCount; } static getCurrentCameraEntity() { const currentCameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__.ComponentRepository.getComponent(this, this.current); return currentCameraComponent.entity; } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.getEntity(this.__entityUid); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class CameraEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getCamera() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.CameraComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.applyMixins)(base, CameraEntity); return base; } } CameraComponent._eye = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.zero(); CameraComponent.__current = -1; CameraComponent.returnVector3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.zero(); CameraComponent.__globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__.GlobalDataRepository.getInstance(); CameraComponent.__tmpVector3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.zero(); CameraComponent.__tmpVector3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.zero(); CameraComponent.__tmpVector3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_13__.MutableVector3.zero(); CameraComponent.__tmpMatrix44_0 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.zero(); CameraComponent.__tmpMatrix44_1 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix44.zero(); CameraComponent.__biasMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_7__.Matrix44.fromCopy16ColumnMajor(0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0); /***/ }), /***/ "./src/foundation/components/Camera/ICameraEntity.ts": /*!***********************************************************!*\ !*** ./src/foundation/components/Camera/ICameraEntity.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Camera/createCameraEntity.ts": /*!****************************************************************!*\ !*** ./src/foundation/components/Camera/createCameraEntity.ts ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createCameraEntity: () => (/* binding */ createCameraEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createCameraEntity() { const entity = (0,_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraComponentTID, entity); return entityAddedComponent; } /***/ }), /***/ "./src/foundation/components/Camera/index.ts": /*!***************************************************!*\ !*** ./src/foundation/components/Camera/index.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CameraComponent: () => (/* reexport safe */ _CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent), /* harmony export */ createCameraEntity: () => (/* reexport safe */ _createCameraEntity__WEBPACK_IMPORTED_MODULE_2__.createCameraEntity) /* harmony export */ }); /* harmony import */ var _CameraComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _ICameraEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ICameraEntity */ "./src/foundation/components/Camera/ICameraEntity.ts"); /* harmony import */ var _createCameraEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createCameraEntity */ "./src/foundation/components/Camera/createCameraEntity.ts"); /***/ }), /***/ "./src/foundation/components/CameraController/CameraControllerComponent.ts": /*!*********************************************************************************!*\ !*** ./src/foundation/components/CameraController/CameraControllerComponent.ts ***! \*********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CameraControllerComponent: () => (/* binding */ CameraControllerComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _cameras_OrbitCameraController__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../cameras/OrbitCameraController */ "./src/foundation/cameras/OrbitCameraController.ts"); /* harmony import */ var _cameras_WalkThroughCameraController__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../cameras/WalkThroughCameraController */ "./src/foundation/cameras/WalkThroughCameraController.ts"); /* harmony import */ var _definitions_CameraControllerType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/CameraControllerType */ "./src/foundation/definitions/CameraControllerType.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * The Component that controls camera posture. */ class CameraControllerComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.__cameraController = new _cameras_OrbitCameraController__WEBPACK_IMPORTED_MODULE_3__.OrbitCameraController(this); } set type(type) { this.__cameraController.unregisterEventListeners(); if (type === _definitions_CameraControllerType__WEBPACK_IMPORTED_MODULE_5__.CameraControllerType.Orbit) { this.__cameraController = new _cameras_OrbitCameraController__WEBPACK_IMPORTED_MODULE_3__.OrbitCameraController(this); } else if (type === _definitions_CameraControllerType__WEBPACK_IMPORTED_MODULE_5__.CameraControllerType.WalkThrough) { this.__cameraController = new _cameras_WalkThroughCameraController__WEBPACK_IMPORTED_MODULE_4__.WalkThroughCameraController(this); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.warn('Not support type!'); } } get type() { if (this.__cameraController instanceof _cameras_OrbitCameraController__WEBPACK_IMPORTED_MODULE_3__.OrbitCameraController) { return _definitions_CameraControllerType__WEBPACK_IMPORTED_MODULE_5__.CameraControllerType.Orbit; } else { return _definitions_CameraControllerType__WEBPACK_IMPORTED_MODULE_5__.CameraControllerType.WalkThrough; } } get controller() { return this.__cameraController; } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraControllerComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraControllerComponentTID; } $load() { this.moveStageTo(_definitions__WEBPACK_IMPORTED_MODULE_6__.ProcessStage.Logic); } $logic() { if (this.__cameraController) { this.__cameraController.logic(this.entity.tryToGetCamera()); } } _updateCount(count) { CameraControllerComponent.__updateCount = count; } static get updateCount() { return CameraControllerComponent.__updateCount; } addThisComponentToEntity(base, _componentClass) { class CameraControllerEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getCameraController() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraControllerComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, CameraControllerEntity); return base; } } CameraControllerComponent.__updateCount = 0; /***/ }), /***/ "./src/foundation/components/CameraController/ICameraControllerEntity.ts": /*!*******************************************************************************!*\ !*** ./src/foundation/components/CameraController/ICameraControllerEntity.ts ***! \*******************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/CameraController/createCameraControllerEntity.ts": /*!************************************************************************************!*\ !*** ./src/foundation/components/CameraController/createCameraControllerEntity.ts ***! \************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createCameraControllerEntity: () => (/* binding */ createCameraControllerEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Camera/createCameraEntity */ "./src/foundation/components/Camera/createCameraEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createCameraControllerEntity() { const entity = (0,_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_1__.createCameraEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraControllerComponentTID, entity); return entityAddedComponent; } /***/ }), /***/ "./src/foundation/components/CameraController/index.ts": /*!*************************************************************!*\ !*** ./src/foundation/components/CameraController/index.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CameraControllerComponent: () => (/* reexport safe */ _CameraControllerComponent__WEBPACK_IMPORTED_MODULE_0__.CameraControllerComponent), /* harmony export */ createCameraControllerEntity: () => (/* reexport safe */ _createCameraControllerEntity__WEBPACK_IMPORTED_MODULE_2__.createCameraControllerEntity) /* harmony export */ }); /* harmony import */ var _CameraControllerComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /* harmony import */ var _ICameraControllerEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ICameraControllerEntity */ "./src/foundation/components/CameraController/ICameraControllerEntity.ts"); /* harmony import */ var _createCameraControllerEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createCameraControllerEntity */ "./src/foundation/components/CameraController/createCameraControllerEntity.ts"); /***/ }), /***/ "./src/foundation/components/ComponentTypes.ts": /*!*****************************************************!*\ !*** ./src/foundation/components/ComponentTypes.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Constraint/ConstraintComponent.ts": /*!*********************************************************************!*\ !*** ./src/foundation/components/Constraint/ConstraintComponent.ts ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstraintComponent: () => (/* binding */ ConstraintComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); class ConstraintComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityComponent, isReUse) { super(entityUid, componentSid, entityComponent, isReUse); this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.getEntity(this.__entityUid); } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.ConstraintComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.ConstraintComponentTID; } $logic() { if (this.__vrmConstraint) { this.__vrmConstraint.update(); } } setConstraint(constraint) { this.__vrmConstraint = constraint; } _destroy() { super._destroy(); this.__vrmConstraint = undefined; } addThisComponentToEntity(base, _componentClass) { class ConstraintEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getConstraint() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.ConstraintComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, ConstraintEntity); return base; } } /***/ }), /***/ "./src/foundation/components/Constraint/IConstraintEntity.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/Constraint/IConstraintEntity.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Constraint/index.ts": /*!*******************************************************!*\ !*** ./src/foundation/components/Constraint/index.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstraintComponent: () => (/* reexport safe */ _ConstraintComponent__WEBPACK_IMPORTED_MODULE_1__.ConstraintComponent) /* harmony export */ }); /* harmony import */ var _IConstraintEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IConstraintEntity */ "./src/foundation/components/Constraint/IConstraintEntity.ts"); /* harmony import */ var _ConstraintComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConstraintComponent */ "./src/foundation/components/Constraint/ConstraintComponent.ts"); /***/ }), /***/ "./src/foundation/components/Light/ILightEntity.ts": /*!*********************************************************!*\ !*** ./src/foundation/components/Light/ILightEntity.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Light/LightComponent.ts": /*!***********************************************************!*\ !*** ./src/foundation/components/Light/LightComponent.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LightComponent: () => (/* binding */ LightComponent) /* harmony export */ }); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_LightType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/LightType */ "./src/foundation/definitions/LightType.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _gizmos_LightGizmo__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../gizmos/LightGizmo */ "./src/foundation/gizmos/LightGizmo.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _Transform__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Transform */ "./src/foundation/components/Transform/index.ts"); /** * The Component that represents a light. * * @remarks * the light looks towards the local -Z axis in right hand coordinate system. */ class LightComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_1__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.type = _definitions_LightType__WEBPACK_IMPORTED_MODULE_4__.LightType.Point; this.__intensity = _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([1, 1, 1]); this.__initialDirection = _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0, 0, -1]); this.__direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0, 0, -1]); this.innerConeAngle = 0.0; this.outerConeAngle = Math.PI / 4.0; // in radian this.range = -1; this.enable = true; this.shadowAreaSizeForDirectionalLight = 10; this.__updateCount = 0; this.__lastUpdateCount = -1; this.__lastTransformUpdateCount = -1; this._setMaxNumberOfComponent(Math.max(10, Math.floor(_core_Config__WEBPACK_IMPORTED_MODULE_7__.Config.maxEntityNumber / 100))); } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.LightComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.LightComponentTID; } get updateCount() { return this.__updateCount; } get direction() { return this.__direction; } set intensity(value) { this.__intensity = value; this.__updateCount++; } get intensity() { return this.__intensity; } get _up() { return _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopy3(0, 1, 0); } set isLightGizmoVisible(flg) { if (flg) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_12__.Is.not.defined(this.__lightGizmo)) { this.__lightGizmo = new _gizmos_LightGizmo__WEBPACK_IMPORTED_MODULE_11__.LightGizmo(this.entity); this.__lightGizmo._setup(); } this.__lightGizmo.isVisible = true; } else { if (_misc_Is__WEBPACK_IMPORTED_MODULE_12__.Is.defined(this.__lightGizmo)) { this.__lightGizmo.isVisible = false; } } this.__updateCount++; } get isLightGizmoVisible() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_12__.Is.defined(this.__lightGizmo)) { return this.__lightGizmo.isVisible; } else { return false; } } $load() { LightComponent.__lightPositions = LightComponent.__globalDataRepository.getValue('lightPosition', 0); LightComponent.__lightDirections = LightComponent.__globalDataRepository.getValue('lightDirection', 0); LightComponent.__lightIntensities = LightComponent.__globalDataRepository.getValue('lightIntensity', 0); LightComponent.__lightProperties = LightComponent.__globalDataRepository.getValue('lightProperty', 0); LightComponent.__lightNumber = LightComponent.__globalDataRepository.getValue('lightNumber', 0); this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_6__.ProcessStage.Logic); } __updateGizmo() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_12__.Is.defined(this.__lightGizmo) && this.__lightGizmo.isSetup && this.isLightGizmoVisible) { this.__lightGizmo._update(); } } static common_$logic() { const lightComponents = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__.ComponentRepository.getComponentsWithType(LightComponent); LightComponent.__lightNumber._v[0] = lightComponents.length; } $logic() { if (_Transform__WEBPACK_IMPORTED_MODULE_14__.TransformComponent.updateCount === this.__lastTransformUpdateCount && this.__lastUpdateCount === this.__updateCount) { return; } const sceneGraphComponent = this.entity.getSceneGraph(); this.__direction = sceneGraphComponent.normalMatrixInner.multiplyVector(this.__initialDirection); const lightAngleScale = 1.0 / Math.max(0.001, Math.cos(this.innerConeAngle) - Math.cos(this.outerConeAngle)); const lightAngleOffset = -Math.cos(this.outerConeAngle) * lightAngleScale; LightComponent.__lightDirections._v[3 * this.componentSID + 0] = this.__direction.x; LightComponent.__lightDirections._v[3 * this.componentSID + 1] = this.__direction.y; LightComponent.__lightDirections._v[3 * this.componentSID + 2] = this.__direction.z; const lightPosition = sceneGraphComponent.worldPosition; LightComponent.__lightPositions._v[3 * this.componentSID + 0] = lightPosition.x; LightComponent.__lightPositions._v[3 * this.componentSID + 1] = lightPosition.y; LightComponent.__lightPositions._v[3 * this.componentSID + 2] = lightPosition.z; LightComponent.__lightIntensities._v[3 * this.componentSID + 0] = this.__intensity.x; LightComponent.__lightIntensities._v[3 * this.componentSID + 1] = this.__intensity.y; LightComponent.__lightIntensities._v[3 * this.componentSID + 2] = this.__intensity.z; LightComponent.__lightProperties._v[4 * this.componentSID + 0] = this.enable ? this.type.index : -1; LightComponent.__lightProperties._v[4 * this.componentSID + 1] = this.range; LightComponent.__lightProperties._v[4 * this.componentSID + 2] = lightAngleScale; LightComponent.__lightProperties._v[4 * this.componentSID + 3] = lightAngleOffset; this.__updateGizmo(); this.__lastTransformUpdateCount = _Transform__WEBPACK_IMPORTED_MODULE_14__.TransformComponent.updateCount; this.__lastUpdateCount = this.__updateCount; } _destroy() { super._destroy(); LightComponent.__lightIntensities._v[3 * this.componentSID + 0] = 0; LightComponent.__lightIntensities._v[3 * this.componentSID + 1] = 0; LightComponent.__lightIntensities._v[3 * this.componentSID + 2] = 0; } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.getEntity(this.__entityUid); } addThisComponentToEntity(base, _componentClass) { class LightEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getLight() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs.LightComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.applyMixins)(base, LightEntity); return base; } } LightComponent.__globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_8__.GlobalDataRepository.getInstance(); LightComponent.__tmp_vec4 = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4.zero(); LightComponent.__lightPositions = new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Float32Array(0)); LightComponent.__lightDirections = new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Float32Array(0)); LightComponent.__lightIntensities = new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Float32Array(0)); LightComponent.__lightProperties = new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Float32Array(0)); LightComponent.__lightNumber = _math_Scalar__WEBPACK_IMPORTED_MODULE_13__.Scalar.zero(); /***/ }), /***/ "./src/foundation/components/Light/createLightEntity.ts": /*!**************************************************************!*\ !*** ./src/foundation/components/Light/createLightEntity.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createLightEntity: () => (/* binding */ createLightEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createLightEntity() { const entity = (0,_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.LightComponentTID, entity); return entityAddedComponent; } /***/ }), /***/ "./src/foundation/components/Light/index.ts": /*!**************************************************!*\ !*** ./src/foundation/components/Light/index.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LightComponent: () => (/* reexport safe */ _LightComponent__WEBPACK_IMPORTED_MODULE_1__.LightComponent), /* harmony export */ createLightEntity: () => (/* reexport safe */ _createLightEntity__WEBPACK_IMPORTED_MODULE_2__.createLightEntity) /* harmony export */ }); /* harmony import */ var _ILightEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ILightEntity */ "./src/foundation/components/Light/ILightEntity.ts"); /* harmony import */ var _LightComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./LightComponent */ "./src/foundation/components/Light/LightComponent.ts"); /* harmony import */ var _createLightEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createLightEntity */ "./src/foundation/components/Light/createLightEntity.ts"); /***/ }), /***/ "./src/foundation/components/Mesh/IMeshEntity.ts": /*!*******************************************************!*\ !*** ./src/foundation/components/Mesh/IMeshEntity.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Mesh/MeshComponent.ts": /*!*********************************************************!*\ !*** ./src/foundation/components/Mesh/MeshComponent.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MeshComponent: () => (/* binding */ MeshComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/MathClassUtil */ "./src/foundation/math/MathClassUtil.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class MeshComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.__viewDepth = -Number.MAX_VALUE; this.isPickable = true; } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshComponentTID; } setMesh(mesh) { this.__mesh = mesh; mesh._belongToMeshComponent(this); } unsetMesh() { if (this.__mesh == null) { return false; } this.__mesh = void 0; return true; } get mesh() { return this.__mesh; } calcViewDepth(cameraComponent) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.not.exist(this.__mesh)) { return Number.MAX_VALUE; } const centerPosition_inLocal = this.__mesh.AABB.centerPoint; const skeletal = this.entity.tryToGetSkeletal(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(skeletal) && _misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(skeletal._bindShapeMatrix)) { skeletal._bindShapeMatrix.multiplyVector3To(this.__mesh.AABB.centerPoint, centerPosition_inLocal); } const worldMatrixInner = this.entity.getSceneGraph().matrixInner; const centerPosition_inWorld = worldMatrixInner.multiplyVector3To(centerPosition_inLocal, MeshComponent.__tmpVector3_0); const viewMatrix = cameraComponent.viewMatrix; const centerPosition_inView = viewMatrix.multiplyVector3To(centerPosition_inWorld, MeshComponent.__tmpVector3_1); this.__viewDepth = centerPosition_inView.z; return this.__viewDepth; } get viewDepth() { return this.__viewDepth; } static alertNoMeshSet(meshComponent) { _misc_Logger__WEBPACK_IMPORTED_MODULE_12__.Logger.debug('No mesh is set on this MeshComponent:' + meshComponent.componentSID); } castRay(srcPointInWorld, directionInWorld, dotThreshold = 0) { if (this.__mesh) { let srcPointInLocal = srcPointInWorld; let directionInLocal = directionInWorld; const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (sceneGraphComponent != null) { const invWorldMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_6__.Matrix44.invert(sceneGraphComponent.matrixInner); srcPointInLocal = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopyVector4(invWorldMatrix.multiplyVector(_math_Vector4__WEBPACK_IMPORTED_MODULE_5__.Vector4.fromCopyVector3(srcPointInWorld))); const distVecInWorld = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.add(srcPointInWorld, directionInWorld); const distVecInLocal = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopyVector4(invWorldMatrix.multiplyVector(_math_Vector4__WEBPACK_IMPORTED_MODULE_5__.Vector4.fromCopyVector3(distVecInWorld))); directionInLocal = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.subtract(distVecInLocal, srcPointInLocal)); const result = this.__mesh.castRay(srcPointInLocal, directionInLocal, dotThreshold); let intersectPositionInWorld = null; if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.defined(result.data) && result.data.t >= 0) { intersectPositionInWorld = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopyVector4(sceneGraphComponent.matrixInner.multiplyVector(_math_Vector4__WEBPACK_IMPORTED_MODULE_5__.Vector4.fromCopyVector3(result.data.position))); return { result: true, data: { t: result.data.t, u: result.data.u, v: result.data.v, position: intersectPositionInWorld, }, }; } } } return { result: false, }; } castRayFromScreenInLocal(x, y, camera, viewport, dotThreshold = 0) { if (this.__mesh) { const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (sceneGraphComponent != null) { const invPVW = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.multiplyTo(camera.projectionMatrix, camera.viewMatrix, MeshComponent.__tmpMatrix44_0) .multiply(sceneGraphComponent.matrixInner) .invert(); const srcPointInLocal = _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_8__.MathClassUtil.unProjectTo(x, y, 0, invPVW, viewport, MeshComponent.__tmpVector3_0); const distVecInLocal = _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_8__.MathClassUtil.unProjectTo(x, y, 1, invPVW, viewport, MeshComponent.__tmpVector3_1); const directionInLocal = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.subtractTo(distVecInLocal, srcPointInLocal, MeshComponent.__tmpVector3_2).normalize(); const result = this.__mesh.castRay(srcPointInLocal, directionInLocal, dotThreshold); if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.defined(result.data) && result.data.t >= 0) { return { result: true, data: { t: result.data.t, u: result.data.u, v: result.data.v, position: result.data.position, }, }; } } } return { result: false, }; } castRayFromScreenInWorld(x, y, camera, viewport, dotThreshold = 0) { const result = this.castRayFromScreenInLocal(x, y, camera, viewport, dotThreshold); const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (this.__mesh && sceneGraphComponent != null && result.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.assertExist)(result.data); // convert to World space const intersectedPositionInWorld = sceneGraphComponent.matrixInner.multiplyVector3To(result.data.position, MeshComponent.__returnVector3); return { result: true, data: { t: result.data.t, u: result.data.u, v: result.data.v, position: intersectedPositionInWorld, }, }; } else { return result; } } $load() { if (this.__mesh == null) { return; } // this.__mesh!.makeVerticesSeparated(); this.__mesh._calcTangents(); // this.__mesh.__initMorphPrimitives(); this.__mesh._calcFaceNormalsIfNonNormal(); const blendShapeComponent = this.entity.tryToGetBlendShape(); if (blendShapeComponent != null && blendShapeComponent.weights.length > 0) { this.__mesh._calcBaryCentricCoord(); } this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__.ProcessStage.Logic); } $logic() { } _shallowCopyFrom(component_) { const component = component_; this.__viewDepth = component.__viewDepth; if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(component.__mesh)) { this.setMesh(component.__mesh); } this.isPickable = component.isPickable; } _destroy() { super._destroy(); if (this.__mesh) { this.__mesh = undefined; } } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.getEntity(this.__entityUid); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class MeshEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getMesh() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, MeshEntity); return base; } } MeshComponent.__tmpVector3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); MeshComponent.__tmpVector3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); MeshComponent.__tmpVector3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); MeshComponent.__returnVector3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); MeshComponent.__tmpMatrix44_0 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.zero(); MeshComponent.__latestPrimitivePositionAccessorVersion = 0; /***/ }), /***/ "./src/foundation/components/Mesh/index.ts": /*!*************************************************!*\ !*** ./src/foundation/components/Mesh/index.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MeshComponent: () => (/* reexport safe */ _MeshComponent__WEBPACK_IMPORTED_MODULE_1__.MeshComponent) /* harmony export */ }); /* harmony import */ var _IMeshEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IMeshEntity */ "./src/foundation/components/Mesh/IMeshEntity.ts"); /* harmony import */ var _MeshComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MeshComponent */ "./src/foundation/components/Mesh/MeshComponent.ts"); /***/ }), /***/ "./src/foundation/components/MeshRenderer/IMeshRendererEntity.ts": /*!***********************************************************************!*\ !*** ./src/foundation/components/MeshRenderer/IMeshRendererEntity.ts ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts": /*!*************************************************************************!*\ !*** ./src/foundation/components/MeshRenderer/MeshRendererComponent.ts ***! \*************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MeshRendererComponent: () => (/* binding */ MeshRendererComponent) /* harmony export */ }); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _geometry_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../geometry/types/GeometryTypes */ "./src/foundation/geometry/types/GeometryTypes.ts"); /* harmony import */ var _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../CameraController/CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /* harmony import */ var _SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../SceneGraph/SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _textures_RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../textures/RenderTargetTextureCube */ "./src/foundation/textures/RenderTargetTextureCube.ts"); class MeshRendererComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_1__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.__diffuseCubeMapContribution = 1.0; this.__specularCubeMapContribution = 1.0; this.__rotationOfCubeMap = 0; this.__updateCount = 0; } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__.WellKnownComponentTIDs.MeshRendererComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__.WellKnownComponentTIDs.MeshRendererComponentTID; } get diffuseCubeMap() { return this.__diffuseCubeMap; } get specularCubeMap() { return this.__specularCubeMap; } get updateCount() { return this.__updateCount; } static get updateCount() { return MeshRendererComponent.__updateCount; } get diffuseCubeMapContribution() { return this.__diffuseCubeMapContribution; } set diffuseCubeMapContribution(contribution) { this.__diffuseCubeMapContribution = contribution; MeshRendererComponent.__updateCount++; } get specularCubeMapContribution() { return this.__specularCubeMapContribution; } set specularCubeMapContribution(contribution) { this.__specularCubeMapContribution = contribution; MeshRendererComponent.__updateCount++; } get rotationOfCubeMap() { return this.__rotationOfCubeMap; } set rotationOfCubeMap(rotation) { this.__rotationOfCubeMap = rotation; MeshRendererComponent.__updateCount++; } setIBLCubeMap(diffuseCubeTexture, specularCubeTexture) { if (diffuseCubeTexture == null || specularCubeTexture == null) { return; } this.__diffuseCubeMap = diffuseCubeTexture; this.__specularCubeMap = specularCubeTexture; const promises = []; if (diffuseCubeTexture instanceof _textures_RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_13__.RenderTargetTextureCube) { promises.push(new Promise((resolve) => { diffuseCubeTexture.setIsTextureReady(); resolve(); })); } else { promises.push(new Promise((resolve) => { if (!diffuseCubeTexture.startedToLoad) { diffuseCubeTexture.loadTextureImagesAsync().then(() => { resolve(); }); } else if (diffuseCubeTexture.isTextureReady) { resolve(); } else { diffuseCubeTexture.registerOnTextureLoaded(() => { resolve(); }); } })); } if (specularCubeTexture instanceof _textures_RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_13__.RenderTargetTextureCube) { promises.push(new Promise((resolve) => { specularCubeTexture.setIsTextureReady(); resolve(); })); } else { promises.push(new Promise((resolve) => { if (!specularCubeTexture.startedToLoad) { specularCubeTexture.loadTextureImagesAsync().then(() => { resolve(); }); } else if (specularCubeTexture.isTextureReady) { resolve(); } else { specularCubeTexture.registerOnTextureLoaded(() => { resolve(); }); } })); } return Promise.all(promises).then(() => { this.__updateCount++; MeshRendererComponent.__updateCount++; }); } static common_$load({ processApproach }) { const moduleManager = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__.ModuleManager.getInstance(); // Strategy if (processApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { const moduleName = 'webgpu'; const webgpuModule = moduleManager.getModule(moduleName); MeshRendererComponent.__cgApiRenderingStrategy = webgpuModule.WebGpuStrategyBasic.getInstance(); MeshRendererComponent.__cgApiRenderingStrategy.common_$load(); } else { const moduleName = 'webgl'; const webglModule = moduleManager.getModule(moduleName); MeshRendererComponent.__cgApiRenderingStrategy = webglModule.getRenderingStrategy(processApproach); } } $load() { const ready = MeshRendererComponent.__cgApiRenderingStrategy.$load(this.entity.tryToGetMesh()); if (ready) { this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__.ProcessStage.Unknown); } } static sort_$render(renderPass) { if (_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_9__.TransformComponent.updateCount === renderPass._lastTransformComponentsUpdateCount && _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_10__.CameraControllerComponent.updateCount === renderPass._lastCameraControllerComponentsUpdateCount && _SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent.updateCount === renderPass._lastSceneGraphComponentsUpdateCount) { return renderPass._lastPrimitiveUids; } // get CameraComponent let cameraComponent = renderPass.cameraComponent; // If the renderPass doesn't have a cameraComponent, then we get it of the main camera if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__.ComponentRepository.getComponent(_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_6__.CameraComponent, _Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_6__.CameraComponent.current); } if (cameraComponent == null) { const cameraComponents = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_0__.ComponentRepository.getComponentsWithType(_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_6__.CameraComponent); cameraComponent = cameraComponents.find((c) => c != null && c._isAlive); _Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_6__.CameraComponent.current = cameraComponent.componentSID; } if (renderPass.isVrRendering) { const rnXRModule = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__.ModuleManager.getInstance().getModule('xr'); if (rnXRModule != null) { const webxrSystem = rnXRModule.WebXRSystem.getInstance(); if (webxrSystem.isWebXRMode) { cameraComponent = webxrSystem._getCameraComponentAt(0); } } } // FrustumCulling let primitives = []; const meshComponents = renderPass._optimizedMeshComponents; primitives = MeshRendererComponent.__cullingWithViewFrustum(cameraComponent, meshComponents); // After Frustum Culling, remove duplicated Primitives primitives = Array.from(new Set(primitives)); // Sort by sortkey primitives.sort((a, b) => { if ((0,_geometry_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_8__.isBlend)(a) && (0,_geometry_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_8__.isBlend)(b)) { return a._viewDepth - b._viewDepth; } else { return a._sortkey - b._sortkey; } }); const primitiveUids = primitives.map((primitive) => primitive.primitiveUid); primitiveUids.push(-1); let _lastOpaqueIndex = primitives.length - 1; let _lastTranslucentIndex = primitives.length - 1; let _lastBlendIndex = primitives.length - 1; for (let i = 0; i < primitives.length; i++) { const primitive = primitives[i]; const translucency = (0,_geometry_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_8__.isTranslucent)(primitive); if (translucency) { _lastOpaqueIndex = i - 1; break; } const blend = (0,_geometry_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_8__.isBlend)(primitive); if (blend) { _lastOpaqueIndex = i - 1; break; } } for (let i = _lastOpaqueIndex + 1; i < primitives.length; i++) { const primitive = primitives[i]; const translucency = (0,_geometry_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_8__.isBlend)(primitive); if (translucency) { _lastTranslucentIndex = i - 1; break; } } let resultChanged = false; if (_lastOpaqueIndex != renderPass._lastOpaqueIndex) { renderPass._lastOpaqueIndex = _lastOpaqueIndex; resultChanged || (resultChanged = true); } if (_lastTranslucentIndex != renderPass._lastTranslucentIndex) { renderPass._lastTranslucentIndex = _lastTranslucentIndex; resultChanged || (resultChanged = true); } if (_lastBlendIndex != renderPass._lastBlendIndex) { renderPass._lastBlendIndex = _lastBlendIndex; resultChanged || (resultChanged = true); } if (primitiveUids.length !== renderPass._lastPrimitiveUids.length) { resultChanged || (resultChanged = true); } else { // Check if the order of the blend primitives has changed for (let i = _lastTranslucentIndex + 1; i < primitiveUids.length; i++) { if (primitiveUids[i] !== renderPass._lastPrimitiveUids[i]) { resultChanged || (resultChanged = true); break; } } } renderPass._isChangedSortRenderResult = resultChanged; renderPass._lastPrimitiveUids = primitiveUids; renderPass._lastTransformComponentsUpdateCount = _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_9__.TransformComponent.updateCount; renderPass._lastCameraControllerComponentsUpdateCount = _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_10__.CameraControllerComponent.updateCount; renderPass._lastSceneGraphComponentsUpdateCount = _SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent.updateCount; renderPass._renderedSomethingBefore = true; return primitiveUids; } static __cullingWithViewFrustum(cameraComponent, meshComponents) { let filteredMeshComponents = []; if (cameraComponent) { cameraComponent.updateFrustum(); // const whetherContainsSkeletal = (sg: SceneGraphComponent): boolean => { // const skeletalComponent = sg.entity.tryToGetSkeletal(); // if (Is.exist(skeletalComponent)) { // return true; // } else { // const children = sg.children; // for (const child of children) { // return whetherContainsSkeletal(child); // } // return false; // } // }; const frustum = cameraComponent.frustum; const frustumCulling = (meshComponent, outMeshComponents) => { const result = meshComponent.entity.getTagValue('type') === 'background-assets' ? true : frustum.culling(meshComponent); if (result) { outMeshComponents.push(meshComponent); meshComponent.entity.getSceneGraph()._isCulled = false; const skeletal = meshComponent.entity.tryToGetSkeletal(); if (skeletal !== undefined) { skeletal._isCulled = false; } } else { meshComponent.entity.getSceneGraph()._isCulled = true; const skeletal = meshComponent.entity.tryToGetSkeletal(); if (skeletal !== undefined) { skeletal._isCulled = true; } } }; for (const meshComponent of meshComponents) { if (meshComponent._isAlive && meshComponent.entity.getSceneGraph().isVisible) { frustumCulling(meshComponent, filteredMeshComponents); } } } else { filteredMeshComponents = meshComponents.filter((meshComponent) => meshComponent._isAlive && meshComponent.entity.getSceneGraph().isVisible); } const primitives = []; for (let i = 0; i < filteredMeshComponents.length; i++) { const meshComponent = filteredMeshComponents[i]; const viewDepth = meshComponent.calcViewDepth(cameraComponent); const mesh = meshComponent.mesh; if (mesh !== undefined) { const meshPrimitives = mesh.primitives; for (let j = 0; j < meshPrimitives.length; j++) { const primitive = meshPrimitives[j]; // if (isSkipDrawing(primitive.material)) { // continue; // } primitive._viewDepth = viewDepth; primitives.push(primitive); } } } return primitives; } static common_$prerender() { if (MeshRendererComponent.__cgApiRenderingStrategy == null) { // Possible if there is no mesh entity in the scene const processApproach = _system_SystemState__WEBPACK_IMPORTED_MODULE_12__.SystemState.currentProcessApproach; this.common_$load({ processApproach }); } // Call common_$prerender of WebGLRenderingStrategy MeshRendererComponent.__cgApiRenderingStrategy.prerender(); } static common_$render({ renderPass, processStage, renderPassTickCount, primitiveUids, }) { // Call common_$render of WebGLRenderingStrategy return MeshRendererComponent.__cgApiRenderingStrategy.common_$render(primitiveUids, renderPass, renderPassTickCount); } $render({ i, renderPass, renderPassTickCount, }) { } _shallowCopyFrom(component_) { const component = component_; this.__diffuseCubeMap = component.__diffuseCubeMap; this.__specularCubeMap = component.__specularCubeMap; this.diffuseCubeMapContribution = component.diffuseCubeMapContribution; this.specularCubeMapContribution = component.specularCubeMapContribution; this.rotationOfCubeMap = component.rotationOfCubeMap; } _destroy() { super._destroy(); this.__diffuseCubeMap = undefined; this.__specularCubeMap = undefined; } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class MeshRendererEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getMeshRenderer() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__.WellKnownComponentTIDs.MeshRendererComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__.applyMixins)(base, MeshRendererEntity); return base; } } MeshRendererComponent.isDepthMaskTrueForBlendPrimitives = false; MeshRendererComponent.__shaderProgramHandleOfPrimitiveObjectUids = new Map(); MeshRendererComponent.__updateCount = 0; /***/ }), /***/ "./src/foundation/components/MeshRenderer/createMeshEntity.ts": /*!********************************************************************!*\ !*** ./src/foundation/components/MeshRenderer/createMeshEntity.ts ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createMeshEntity: () => (/* binding */ createMeshEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createMeshEntity() { const entity = (0,_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshComponentTID, entity); const entityAddedComponent2 = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshRendererComponentTID, entityAddedComponent); return entityAddedComponent2; } /***/ }), /***/ "./src/foundation/components/MeshRenderer/index.ts": /*!*********************************************************!*\ !*** ./src/foundation/components/MeshRenderer/index.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MeshRendererComponent: () => (/* reexport safe */ _MeshRendererComponent__WEBPACK_IMPORTED_MODULE_1__.MeshRendererComponent), /* harmony export */ createMeshEntity: () => (/* reexport safe */ _createMeshEntity__WEBPACK_IMPORTED_MODULE_2__.createMeshEntity) /* harmony export */ }); /* harmony import */ var _IMeshRendererEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IMeshRendererEntity */ "./src/foundation/components/MeshRenderer/IMeshRendererEntity.ts"); /* harmony import */ var _MeshRendererComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MeshRendererComponent */ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts"); /* harmony import */ var _createMeshEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /***/ }), /***/ "./src/foundation/components/Physics/IPhysicsEntity.ts": /*!*************************************************************!*\ !*** ./src/foundation/components/Physics/IPhysicsEntity.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Physics/PhysicsComponent.ts": /*!***************************************************************!*\ !*** ./src/foundation/components/Physics/PhysicsComponent.ts ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PhysicsComponent: () => (/* binding */ PhysicsComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../physics/Oimo/OimoPhysicsStrategy */ "./src/foundation/physics/Oimo/OimoPhysicsStrategy.ts"); class PhysicsComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityComponent, isReUse) { super(entityUid, componentSid, entityComponent, isReUse); this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__.ProcessStage.Logic); } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.PhysicsComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.PhysicsComponentTID; } setStrategy(strategy) { this.__strategy = strategy; } get strategy() { return this.__strategy; } static common_$logic() { _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_4__.OimoPhysicsStrategy.update(); } $logic() { var _a; (_a = this.__strategy) === null || _a === void 0 ? void 0 : _a.update(); } _destroy() { super._destroy(); this.__strategy = undefined; } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class PhysicsEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getPhysics() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.PhysicsComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, PhysicsEntity); return base; } } /***/ }), /***/ "./src/foundation/components/Physics/createPhysicsEntity.ts": /*!******************************************************************!*\ !*** ./src/foundation/components/Physics/createPhysicsEntity.ts ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createPhysicsEntity: () => (/* binding */ createPhysicsEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createPhysicsEntity() { const entity = (0,_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.PhysicsComponentTID, entity); return entityAddedComponent; } /***/ }), /***/ "./src/foundation/components/Physics/index.ts": /*!****************************************************!*\ !*** ./src/foundation/components/Physics/index.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PhysicsComponent: () => (/* reexport safe */ _PhysicsComponent__WEBPACK_IMPORTED_MODULE_1__.PhysicsComponent), /* harmony export */ createPhysicsEntity: () => (/* reexport safe */ _createPhysicsEntity__WEBPACK_IMPORTED_MODULE_2__.createPhysicsEntity) /* harmony export */ }); /* harmony import */ var _IPhysicsEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IPhysicsEntity */ "./src/foundation/components/Physics/IPhysicsEntity.ts"); /* harmony import */ var _PhysicsComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PhysicsComponent */ "./src/foundation/components/Physics/PhysicsComponent.ts"); /* harmony import */ var _createPhysicsEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createPhysicsEntity */ "./src/foundation/components/Physics/createPhysicsEntity.ts"); /***/ }), /***/ "./src/foundation/components/SceneGraph/ISceneGraphEntity.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/SceneGraph/ISceneGraphEntity.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts": /*!*********************************************************************!*\ !*** ./src/foundation/components/SceneGraph/SceneGraphComponent.ts ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SceneGraphComponent: () => (/* binding */ SceneGraphComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_AABB__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/AABB */ "./src/foundation/math/AABB.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _gizmos_AABBGizmo__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../gizmos/AABBGizmo */ "./src/foundation/gizmos/AABBGizmo.ts"); /* harmony import */ var _gizmos_LocatorGizmo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../gizmos/LocatorGizmo */ "./src/foundation/gizmos/LocatorGizmo.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _gizmos_TranslationGizmo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../gizmos/TranslationGizmo */ "./src/foundation/gizmos/TranslationGizmo.ts"); /* harmony import */ var _gizmos_ScaleGizmo__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../gizmos/ScaleGizmo */ "./src/foundation/gizmos/ScaleGizmo.ts"); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../physics/Oimo/OimoPhysicsStrategy */ "./src/foundation/physics/Oimo/OimoPhysicsStrategy.ts"); /* harmony import */ var _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _SceneGraphOps__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SceneGraphOps */ "./src/foundation/components/SceneGraph/SceneGraphOps.ts"); class SceneGraphComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this.__children = []; this.__gizmoChildren = []; this._worldMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.dummy(); this._worldMatrixRest = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.identity(); this._normalMatrix = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33.dummy(); this.__isWorldMatrixUpToDate = false; this.__isWorldMatrixRestUpToDate = false; this.__isNormalMatrixUpToDate = false; this.__tmpMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.identity(); this.__worldMergedAABBWithSkeletal = new _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB(); this.__worldMergedAABB = new _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB(); this.__isWorldAABBDirty = true; this._isVisible = _math__WEBPACK_IMPORTED_MODULE_17__.MutableScalar.dummy(); this._isBillboard = _math__WEBPACK_IMPORTED_MODULE_17__.MutableScalar.dummy(); this.__transformGizmoSpace = 'world'; this.__latestPrimitivePositionAccessorVersion = 0; this.toMakeWorldMatrixTheSameAsLocalMatrix = false; // Skeletal this.isRootJoint = false; this.jointIndex = -1; this._isCulled = false; this.__lastTransformComponentsUpdateCount = -1; SceneGraphComponent.__sceneGraphs.push(new WeakRef(this)); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_5__.BufferUse.GPUInstanceData, 'worldMatrix', _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_5__.BufferUse.GPUInstanceData, 'normalMatrix', _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, [1, 0, 0, 0, 1, 0, 0, 0, 1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_5__.BufferUse.GPUInstanceData, 'isVisible', _math__WEBPACK_IMPORTED_MODULE_17__.MutableScalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, [1]); this.registerMember(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_5__.BufferUse.GPUInstanceData, 'isBillboard', _math__WEBPACK_IMPORTED_MODULE_17__.MutableScalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, [0]); this.submitToAllocation(this.maxNumberOfComponent, isReUse); } set isVisible(flg) { this._isVisible.setValue(flg ? 1 : 0); SceneGraphComponent.__updateCount++; } get isVisible() { return this._isVisible.getValue() === 1 ? true : false; } static get updateCount() { return SceneGraphComponent.__updateCount; } setVisibilityRecursively(flag) { this.isVisible = flag; for (const child of this.__children) { child.setVisibilityRecursively(flag); } } set isBillboard(flg) { this._isBillboard.setValue(flg ? 1 : 0); } get isBillboard() { return this._isBillboard.getValue() === 1 ? true : false; } setIsBillboardRecursively(flg) { this._isBillboard.setValue(flg ? 1 : 0); for (const child of this.__children) { child.isBillboard = flg; } } set isAABBGizmoVisible(flg) { if (flg) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.defined(this.__aabbGizmo)) { this.__aabbGizmo = new _gizmos_AABBGizmo__WEBPACK_IMPORTED_MODULE_12__.AABBGizmo(this.entity); this.__aabbGizmo._setup(); } this.__aabbGizmo.isVisible = true; } else { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__aabbGizmo)) { this.__aabbGizmo.isVisible = false; } } } get isAABBGizmoVisible() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__aabbGizmo)) { return this.__aabbGizmo.isVisible; } else { return false; } } set isLocatorGizmoVisible(flg) { if (flg) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.defined(this.__locatorGizmo)) { this.__locatorGizmo = new _gizmos_LocatorGizmo__WEBPACK_IMPORTED_MODULE_13__.LocatorGizmo(this.entity); this.__locatorGizmo._setup(); } this.__locatorGizmo.isVisible = true; } else { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__locatorGizmo)) { this.__locatorGizmo.isVisible = false; } } } get isLocatorGizmoVisible() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__locatorGizmo)) { return this.__locatorGizmo.isVisible; } else { return false; } } set isTranslationGizmoVisible(flg) { if (flg) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.defined(this.__translationGizmo)) { this.__translationGizmo = new _gizmos_TranslationGizmo__WEBPACK_IMPORTED_MODULE_15__.TranslationGizmo(this.entity); this.__translationGizmo._setup(); } this.__translationGizmo.isVisible = true; } else { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__translationGizmo)) { this.__translationGizmo.isVisible = false; } } } get isTranslationGizmoVisible() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__translationGizmo)) { return this.__translationGizmo.isVisible; } else { return false; } } set isScaleGizmoVisible(flg) { if (flg) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.defined(this.__scaleGizmo)) { this.__scaleGizmo = new _gizmos_ScaleGizmo__WEBPACK_IMPORTED_MODULE_16__.ScaleGizmo(this.entity); this.__scaleGizmo._setup(); } this.__scaleGizmo.isVisible = true; } else { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__scaleGizmo)) { this.__scaleGizmo.isVisible = false; } } } get isScaleGizmoVisible() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__scaleGizmo)) { return this.__scaleGizmo.isVisible; } else { return false; } } static getTopLevelComponents() { return SceneGraphComponent.__sceneGraphs .map((sgRef) => sgRef.deref()) .filter((sg) => { if (sg !== undefined) { return sg.isTopLevel; } else { return false; } }) .filter((sg) => sg !== undefined); } isJoint() { if (this.jointIndex >= 0) { return true; } else { return false; } } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.SceneGraphComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.SceneGraphComponentTID; } setWorldMatrixRestDirty() { this.matrixRestInner; this.setWorldMatrixRestDirtyRecursively(); } setWorldMatrixRestDirtyRecursively() { this.__isWorldMatrixRestUpToDate = false; this.children.forEach((child) => { child.setWorldMatrixRestDirtyRecursively(); }); } setWorldMatrixDirty() { var _a; this.setWorldMatrixDirtyRecursively(); (_a = this.parent) === null || _a === void 0 ? void 0 : _a.setWorldAABBDirtyParentRecursively(); } setWorldMatrixDirtyRecursively() { this.__isWorldMatrixUpToDate = false; this.__isNormalMatrixUpToDate = false; this.__isWorldAABBDirty = true; this.children.forEach((child) => { child.setWorldMatrixDirtyRecursively(); }); } setWorldAABBDirtyParentRecursively() { var _a; this.__isWorldAABBDirty = true; (_a = this.parent) === null || _a === void 0 ? void 0 : _a.setWorldAABBDirtyParentRecursively(); } /** * add a SceneGraph component as a child of this * @param sg a SceneGraph component */ addChild(sg) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(sg.__parent)) { sg.__parent.removeChild(sg); } sg.__parent = this; this.__children.push(sg); } /** * remove the child SceneGraph component from this * @param sg a SceneGraph component */ removeChild(sg) { const index = this.__children.indexOf(sg); if (index >= 0) { this.__children.splice(index, 1); } sg.__parent = undefined; } /** * add a SceneGraph component as a child of this (But Gizmo only) * @param sg a SceneGraph component of Gizmo */ _addGizmoChild(sg) { sg.__parent = this; this.__gizmoChildren.push(sg); } get isTopLevel() { return this.__parent == null; } get children() { return this.__children; } get parent() { return this.__parent; } get matrixInner() { if (!this.__isWorldMatrixUpToDate) { this._worldMatrix.copyComponents(this.__calcWorldMatrixRecursively()); this.__isWorldMatrixUpToDate = true; } return this._worldMatrix; } get matrix() { return this.matrixInner.clone(); } get matrixRestInner() { if (!this.__isWorldMatrixRestUpToDate) { this._worldMatrixRest.copyComponents(this.__calcWorldMatrixRestRecursively()); this.__isWorldMatrixRestUpToDate = true; } return this._worldMatrixRest; } get matrixRest() { return this.matrixRestInner.clone(); } get normalMatrixInner() { if (!this.__isNormalMatrixUpToDate) { _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.invertTo(this.matrixInner, SceneGraphComponent.invertedMatrix44); this._normalMatrix.copyComponents(SceneGraphComponent.invertedMatrix44.transpose()); this.__isNormalMatrixUpToDate = true; } return this._normalMatrix; } get entityWorldWithSkeletalMatrix() { return this.entityWorldMatrixWithSkeletalInner.clone(); } get entityWorldMatrixWithSkeletalInner() { const skeletalComponent = this.entity.tryToGetSkeletal(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(skeletalComponent) && skeletalComponent.isWorldMatrixUpdated) { return skeletalComponent.worldMatrixInner; } else { const sceneGraphComponent = this.entity.getSceneGraph(); return sceneGraphComponent.matrixInner; } } get normalMatrix() { return this.normalMatrixInner.clone(); } isWorldMatrixUpToDateRecursively() { if (this.__isWorldMatrixUpToDate) { if (this.__parent) { const result = this.__parent.isWorldMatrixUpToDateRecursively(); return result; } else { return true; } } return false; } __calcWorldMatrixRecursively() { if (this.__isWorldMatrixUpToDate) { return this._worldMatrix; } const entity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.getEntity(this.__entityUid); const transform = entity.getTransform(); if (this.__parent == null || this.toMakeWorldMatrixTheSameAsLocalMatrix) { return transform.localMatrixInner; } const matrixFromAncestorToParent = this.__parent.__calcWorldMatrixRecursively(); return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.multiplyTo(matrixFromAncestorToParent, transform.localMatrixInner, this.__tmpMatrix); } __calcWorldMatrixRestRecursively() { if (this.__isWorldMatrixRestUpToDate) { return this._worldMatrixRest; } const entity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.getEntity(this.__entityUid); const transform = entity.getTransform(); if (this.__parent == null || this.toMakeWorldMatrixTheSameAsLocalMatrix) { return transform.localMatrixRestInner; } const matrixFromAncestorToParent = this.__parent.__calcWorldMatrixRestRecursively(); return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.multiplyTo(matrixFromAncestorToParent, transform.localMatrixRestInner, this.__tmpMatrix); } getQuaternionRecursively() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.exist(this.parent)) { return this.entity.getTransform().localRotation; } const matrixFromAncestorToParent = this.parent.getQuaternionRecursively(); return _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.multiply(matrixFromAncestorToParent, this.entity.getTransform().localRotation); } get worldPosition() { const zeroVector = SceneGraphComponent.__originVector3; this.matrixInner.multiplyVector3To(zeroVector, SceneGraphComponent.returnVector3); return SceneGraphComponent.returnVector3; } getWorldPositionOf(localPosition) { return this.matrixInner.multiplyVector3(localPosition); } getWorldPositionOfTo(localPosition, out) { return this.matrixInner.multiplyVector3To(localPosition, out); } getLocalPositionOf(worldPosition) { return _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.invert(this.matrixInner).multiplyVector3(worldPosition); } getLocalPositionOfTo(worldPosition, out) { return _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.invertTo(this.matrixInner, SceneGraphComponent.__tmp_mat4).multiplyVector3To(worldPosition, out); } getWorldAABB() { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB(); const meshComponent = this.entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(meshComponent) && _misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(meshComponent.mesh)) { aabb.mergeAABB(meshComponent.mesh.AABB); _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB.multiplyMatrixTo(this.entity.getSceneGraph().matrixInner, aabb, SceneGraphComponent.__tmpAABB); } else { SceneGraphComponent.__tmpAABB.initialize(); } return SceneGraphComponent.__tmpAABB; } calcWorldMergedAABB() { const aabb = this.getWorldAABB().clone(); for (const child of this.children) { const childAABB = child.calcWorldMergedAABB(); aabb.mergeAABB(childAABB); } this.__worldMergedAABB = aabb; return aabb; } get worldMergedAABB() { if (this.__isWorldAABBDirty) { this.calcWorldMergedAABB(); this.__isWorldAABBDirty = false; } return this.__worldMergedAABB; } getWorldAABBWithSkeletal() { const aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB(); const meshComponent = this.entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(meshComponent) && _misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(meshComponent.mesh)) { aabb.mergeAABB(meshComponent.mesh.AABB); _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB.multiplyMatrixTo(this.entity.getSceneGraph().entityWorldMatrixWithSkeletalInner, aabb, SceneGraphComponent.__tmpAABB); } else { SceneGraphComponent.__tmpAABB.initialize(); } return SceneGraphComponent.__tmpAABB; } calcWorldMergedAABBWithSkeletal() { const aabb = this.getWorldAABBWithSkeletal().clone(); for (const child of this.children) { const childAABB = child.calcWorldMergedAABBWithSkeletal(); aabb.mergeAABB(childAABB); } this.__worldMergedAABBWithSkeletal = aabb; return aabb; } get worldMergedAABBWithSkeletal() { if (this.__isWorldAABBDirty) { this.calcWorldMergedAABBWithSkeletal(); this.__isWorldAABBDirty = false; } return this.__worldMergedAABBWithSkeletal; } /** * castRay Methods * * @param srcPointInWorld a source position in world space * @param directionInWorld a direction vector in world space * @param dotThreshold threshold of the intersected triangle and the ray * @param ignoreMeshComponents mesh components to ignore * @returns information of intersection in world space */ castRay(srcPointInWorld, directionInWorld, dotThreshold = 0, ignoreMeshComponents = []) { const collectedSgComponents = (0,_SceneGraphOps__WEBPACK_IMPORTED_MODULE_20__.flattenHierarchy)(this, false); const meshComponents = []; for (const sg of collectedSgComponents) { const mesh = sg.entity.tryToGetMesh(); if (mesh) { meshComponents.push(mesh); } } let rayDistance = Number.MAX_VALUE; let intersectedPosition = undefined; let selectedMeshComponent = undefined; let u = 0; let v = 0; for (const meshComponent of meshComponents) { if (!meshComponent.entity.getSceneGraph().isVisible) { continue; } if (!meshComponent.isPickable) { continue; } if (ignoreMeshComponents.indexOf(meshComponent) !== -1) { continue; } const result = meshComponent.castRay(srcPointInWorld, directionInWorld, dotThreshold); if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.defined(result.data) && result.data.t < rayDistance) { rayDistance = result.data.t; intersectedPosition = result.data.position; selectedMeshComponent = meshComponent; u = result.data.u; v = result.data.v; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(selectedMeshComponent) && _misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(intersectedPosition)) { return { result: true, data: { t: rayDistance, u, v, position: intersectedPosition, selectedMeshComponent, }, }; } else { return { result: false, }; } } /** * castRayFromScreen Methods * * @param x x position of screen * @param y y position of screen * @param camera a camera component * @param viewport a viewport vector4 * @param dotThreshold threshold of the intersected triangle and the ray * @param ignoreMeshComponents mesh components to ignore * @returns information of intersection in world space */ castRayFromScreen(x, y, camera, viewport, dotThreshold = 0, ignoreMeshComponents = []) { const collectedSgComponents = (0,_SceneGraphOps__WEBPACK_IMPORTED_MODULE_20__.flattenHierarchy)(this, false); const meshComponents = []; for (const sg of collectedSgComponents) { const mesh = sg.entity.tryToGetMesh(); if (mesh) { meshComponents.push(mesh); } } let rayDistance = Number.MAX_VALUE; let intersectedPosition = undefined; let selectedMeshComponent = undefined; let u = 0; let v = 0; for (const meshComponent of meshComponents) { if (!meshComponent.entity.getSceneGraph().isVisible) { continue; } if (!meshComponent.isPickable) { continue; } if (ignoreMeshComponents.indexOf(meshComponent) !== -1) { continue; } const result = meshComponent.castRayFromScreenInWorld(x, y, camera, viewport, dotThreshold); if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.defined(result.data) && result.data.t < rayDistance) { rayDistance = result.data.t; intersectedPosition = result.data.position; selectedMeshComponent = meshComponent; u = result.data.u; v = result.data.v; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(selectedMeshComponent) && _misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(intersectedPosition)) { return { result: true, data: { t: rayDistance, u, v, position: intersectedPosition, selectedMeshComponent, }, }; } else { return { result: false, }; } } $load() { this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_6__.ProcessStage.Logic); } $logic() { if (this.__lastTransformComponentsUpdateCount === _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_19__.TransformComponent.updateCount) { return; } this.matrixInner; this.normalMatrixInner; this.__updateGizmos(); // const meshComponent = this.entity.tryToGetMesh(); // if (meshComponent != null) { // const mesh = meshComponent.mesh; // if (mesh != null) { // const primitiveNum = mesh.getPrimitiveNumber(); // for (let i = 0; i < primitiveNum; i++) { // const primitive = mesh.getPrimitiveAt(i); // if (primitive.positionAccessorVersion !== this.__latestPrimitivePositionAccessorVersion) { // this.setWorldAABBDirtyParentRecursively(); // this.__latestPrimitivePositionAccessorVersion = primitive.positionAccessorVersion!; // break; // } // } // } // } this.__lastTransformComponentsUpdateCount = _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_19__.TransformComponent.updateCount; } __updateGizmos() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__aabbGizmo) && this.__aabbGizmo.isSetup && this.__aabbGizmo.isVisible) { this.__aabbGizmo._update(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__locatorGizmo) && this.__locatorGizmo.isSetup && this.__locatorGizmo.isVisible) { this.__locatorGizmo._update(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__translationGizmo) && this.__translationGizmo.isSetup && this.__translationGizmo.isVisible) { this.__translationGizmo._update(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.exist(this.__scaleGizmo) && this.__scaleGizmo.isSetup && this.__scaleGizmo.isVisible) { this.__scaleGizmo._update(); } } setPositionWithoutPhysics(vec) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.exist(this.__parent)) { this.entity.getTransform().localPosition = vec; } else { _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.invertTo(this.__parent.entity.getSceneGraph().matrixInner, this.__tmpMatrix); this.entity.getTransform().localPosition = this.__tmpMatrix.multiplyVector3(vec); } } set position(vec) { this.setPositionWithoutPhysics(vec); const physicsComponent = this.entity.tryToGetPhysics(); if (physicsComponent !== undefined) { if (physicsComponent.strategy !== undefined) { if (physicsComponent.strategy instanceof _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_18__.OimoPhysicsStrategy) { const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (sceneGraphComponent !== undefined) { physicsComponent.strategy.setPosition(vec); } } } } } get position() { return this.matrixInner.getTranslate(); } get positionRest() { return this.matrixRestInner.getTranslate(); } set eulerAngles(vec) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.exist(this.__parent)) { this.entity.getTransform().localEulerAngles = vec; } else { const quat = _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.fromMatrix(this.__parent.entity.getSceneGraph().matrixInner); const invQuat = _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.invert(quat); const rotation = _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.fromMatrix(_math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.rotate(vec)); const result = _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.multiply(rotation, invQuat); this.entity.getTransform().localEulerAngles = result.toEulerAngles(); } const physicsComponent = this.entity.tryToGetPhysics(); if (physicsComponent !== undefined) { if (physicsComponent.strategy !== undefined) { if (physicsComponent.strategy instanceof _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_18__.OimoPhysicsStrategy) { const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (sceneGraphComponent !== undefined) { physicsComponent.strategy.setEulerAngle(vec); } } } } } get eulerAngles() { return this.matrixInner.toEulerAngles(); } setRotationWithoutPhysics(quat) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.exist(this.__parent)) { this.entity.getTransform().localRotation = quat; } else { const quatInner = this.__parent.entity.getSceneGraph().rotation; const invQuat = _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.invert(quatInner); this.entity.getTransform().localRotation = _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.multiply(quat, invQuat); } } set rotation(quat) { this.setRotationWithoutPhysics(quat); const physicsComponent = this.entity.tryToGetPhysics(); if (physicsComponent !== undefined) { if (physicsComponent.strategy !== undefined) { if (physicsComponent.strategy instanceof _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_18__.OimoPhysicsStrategy) { const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (sceneGraphComponent !== undefined) { physicsComponent.strategy.setEulerAngle(quat.toEulerAngles()); } } } } } get rotation() { const parent = this.parent; if (parent != null) { return _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.multiply(parent.rotation, this.entity.getTransform().localRotationInner); } return this.entity.getTransform().localRotationInner; } get rotationRest() { const parent = this.parent; if (parent != null) { return _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.multiply(parent.rotationRest, this.entity.getTransform().localRotationRestInner); } return this.entity.getTransform().localRotationRestInner; } getRotationRest(endFn) { const parent = this.parent; const IsEnd = endFn(this); if (parent != null && !IsEnd) { return _math__WEBPACK_IMPORTED_MODULE_17__.Quaternion.multiply(parent.getRotationRest(endFn), this.entity.getTransform().localRotationRestInner); } return this.entity.getTransform().localRotationRestInner; } set scale(vec) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_14__.Is.not.exist(this.__parent)) { this.entity.getTransform().localScale = vec; } else { const mat = this.__parent.entity.getSceneGraph().matrix; mat._v[12] = 0; mat._v[13] = 0; mat._v[14] = 0; const invMat = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.invert(mat); this.entity.getTransform().localScale = invMat.multiplyVector3(vec); } const physicsComponent = this.entity.tryToGetPhysics(); if (physicsComponent !== undefined) { if (physicsComponent.strategy !== undefined) { if (physicsComponent.strategy instanceof _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_18__.OimoPhysicsStrategy) { const sceneGraphComponent = this.entity.tryToGetSceneGraph(); if (sceneGraphComponent !== undefined) { physicsComponent.strategy.setScale(vec); } } } } } get scale() { return this.matrixInner.getScale(); } __copyChild(child) { const newChild = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository._shallowCopyEntityInner(child.entity); newChild.getSceneGraph().__parent = this; return newChild; } _shallowCopyFrom(component_) { const component = component_; this.__parent = component.__parent; this.__children = []; for (let i = 0; i < component.__children.length; i++) { const copyChild = this.__copyChild(component.__children[i]).getSceneGraph(); this.__children.push(copyChild); } this.__gizmoChildren = component.__gizmoChildren.concat(); this._worldMatrix.copyComponents(component._worldMatrix); this._worldMatrixRest.copyComponents(component._worldMatrixRest); this._normalMatrix.copyComponents(component._normalMatrix); this.__isWorldMatrixUpToDate = false; this.__isWorldMatrixRestUpToDate = false; this.__isNormalMatrixUpToDate = false; this.__tmpMatrix.copyComponents(component.__tmpMatrix); this.__worldMergedAABBWithSkeletal = component.__worldMergedAABBWithSkeletal.clone(); this.__isWorldAABBDirty = true; this._isVisible.copyComponents(component._isVisible); this._isBillboard.copyComponents(component._isBillboard); // this.__aabbGizmo = component.__aabbGizmo; // this.__locatorGizmo = component.__locatorGizmo; // this.__translationGizmo = component.__translationGizmo; // this.__scaleGizmo = component.__scaleGizmo; this.__transformGizmoSpace = component.__transformGizmoSpace; this.__latestPrimitivePositionAccessorVersion = component.__latestPrimitivePositionAccessorVersion; this.toMakeWorldMatrixTheSameAsLocalMatrix = component.toMakeWorldMatrixTheSameAsLocalMatrix; this.isRootJoint = component.isRootJoint; this.jointIndex = component.jointIndex; } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.getEntity(this.__entityUid); } setTransformGizmoSpace(space) { var _a, _b; this.__transformGizmoSpace = space; (_a = this.__translationGizmo) === null || _a === void 0 ? void 0 : _a.setSpace(space); (_b = this.__scaleGizmo) === null || _b === void 0 ? void 0 : _b.setSpace(space); } _destroy() { var _a, _b, _c, _d, _e; super._destroy(); (_a = this.__aabbGizmo) === null || _a === void 0 ? void 0 : _a._destroy(); (_b = this.__locatorGizmo) === null || _b === void 0 ? void 0 : _b._destroy(); (_c = this.__translationGizmo) === null || _c === void 0 ? void 0 : _c._destroy(); (_d = this.__scaleGizmo) === null || _d === void 0 ? void 0 : _d._destroy(); // this.__entityRepository.removeEntity(this.__entityUid); (_e = this.parent) === null || _e === void 0 ? void 0 : _e.removeChild(this); this.children.forEach((child) => { var _a; return (_a = child.parent) === null || _a === void 0 ? void 0 : _a.removeChild(child); }); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class SceneGraphEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getSceneGraph() { if (this.__sceneGraphComponent === undefined) { this.__sceneGraphComponent = this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.SceneGraphComponentTID); } return this.__sceneGraphComponent; } get parent() { return this.getSceneGraph().parent; } get matrix() { const sceneGraph = this.getSceneGraph(); return sceneGraph.matrix; } get matrixInner() { const sceneGraph = this.getSceneGraph(); return sceneGraph.matrixInner; } get position() { const sceneGraph = this.getSceneGraph(); return sceneGraph.position; } set position(vec) { const sceneGraph = this.getSceneGraph(); sceneGraph.position = vec; } get positionRest() { const sceneGraph = this.getSceneGraph(); return sceneGraph.positionRest; } get scale() { const sceneGraph = this.getSceneGraph(); return sceneGraph.scale; } set scale(vec) { const sceneGraph = this.getSceneGraph(); sceneGraph.scale = vec; } get eulerAngles() { const sceneGraph = this.getSceneGraph(); return sceneGraph.eulerAngles; } set eulerAngles(vec) { const sceneGraph = this.getSceneGraph(); sceneGraph.eulerAngles = vec; } get rotation() { const sceneGraph = this.getSceneGraph(); return sceneGraph.rotation; } set rotation(quat) { const sceneGraph = this.getSceneGraph(); sceneGraph.rotation = quat; } get rotationRest() { const sceneGraph = this.getSceneGraph(); return sceneGraph.rotationRest; } addChild(sg) { const sceneGraph = this.getSceneGraph(); sceneGraph.addChild(sg); } get children() { const sceneGraph = this.getSceneGraph(); return sceneGraph.children; } removeChild(sg) { const sceneGraph = this.getSceneGraph(); sceneGraph.removeChild(sg); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.applyMixins)(base, SceneGraphEntity); return base; } } SceneGraphComponent.__originVector3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.zero(); SceneGraphComponent.returnVector3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_11__.MutableVector3.zero(); SceneGraphComponent.__sceneGraphs = []; SceneGraphComponent.isJointAABBShouldBeCalculated = false; SceneGraphComponent.invertedMatrix44 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.fromCopyArray16ColumnMajor([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]); SceneGraphComponent.__tmp_mat4 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44.identity(); SceneGraphComponent.__updateCount = -1; SceneGraphComponent.__tmpAABB = new _math_AABB__WEBPACK_IMPORTED_MODULE_10__.AABB(); /***/ }), /***/ "./src/foundation/components/SceneGraph/SceneGraphOps.ts": /*!***************************************************************!*\ !*** ./src/foundation/components/SceneGraph/SceneGraphOps.ts ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ flattenHierarchy: () => (/* binding */ flattenHierarchy) /* harmony export */ }); /** * Collects children and itself from specified sceneGraphComponent. * @param sceneGraphComponent collects children and itself from the sceneGraphComponent * @param isJointMode collects joints only */ function flattenHierarchy(sceneGraphComponent, isJointMode) { const results = []; if (!isJointMode || sceneGraphComponent.isJoint()) { results.push(sceneGraphComponent); } const children = sceneGraphComponent.children; for (let i = 0; i < children.length; i++) { const hitChildren = flattenHierarchy(children[i], isJointMode); Array.prototype.push.apply(results, hitChildren); } return results; } /***/ }), /***/ "./src/foundation/components/SceneGraph/createGroupEntity.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/SceneGraph/createGroupEntity.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createGroupEntity: () => (/* binding */ createGroupEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _Transform_createTransformEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Transform/createTransformEntity */ "./src/foundation/components/Transform/createTransformEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createGroupEntity() { const entity = (0,_Transform_createTransformEntity__WEBPACK_IMPORTED_MODULE_1__.createTransformEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SceneGraphComponentTID, entity); return entityAddedComponent; } /***/ }), /***/ "./src/foundation/components/SceneGraph/index.ts": /*!*******************************************************!*\ !*** ./src/foundation/components/SceneGraph/index.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SceneGraphComponent: () => (/* reexport safe */ _SceneGraphComponent__WEBPACK_IMPORTED_MODULE_1__.SceneGraphComponent), /* harmony export */ createGroupEntity: () => (/* reexport safe */ _createGroupEntity__WEBPACK_IMPORTED_MODULE_2__.createGroupEntity), /* harmony export */ flattenHierarchy: () => (/* reexport safe */ _SceneGraphOps__WEBPACK_IMPORTED_MODULE_3__.flattenHierarchy) /* harmony export */ }); /* harmony import */ var _ISceneGraphEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ISceneGraphEntity */ "./src/foundation/components/SceneGraph/ISceneGraphEntity.ts"); /* harmony import */ var _SceneGraphComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); /* harmony import */ var _createGroupEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _SceneGraphOps__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SceneGraphOps */ "./src/foundation/components/SceneGraph/SceneGraphOps.ts"); /***/ }), /***/ "./src/foundation/components/Skeletal/AnimationRetarget/AbsoluteAnimation.ts": /*!***********************************************************************************!*\ !*** ./src/foundation/components/Skeletal/AnimationRetarget/AbsoluteAnimation.ts ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbsoluteAnimation: () => (/* binding */ AbsoluteAnimation) /* harmony export */ }); class AbsoluteAnimation { constructor(srcEntity) { this.__srcEntity = srcEntity; } getEntity() { return this.__srcEntity; } retargetQuaternion(dstEntity) { const srcEntity = this.__srcEntity; return srcEntity.getTransform().localRotationInner; } retargetTranslate(dstEntity) { const srcEntity = this.__srcEntity; return srcEntity.getTransform().localPositionInner; } retargetScale(dstEntity) { const srcEntity = this.__srcEntity; return srcEntity.getTransform().localScaleInner; } } /***/ }), /***/ "./src/foundation/components/Skeletal/AnimationRetarget/AnimationRetarget.ts": /*!***********************************************************************************!*\ !*** ./src/foundation/components/Skeletal/AnimationRetarget/AnimationRetarget.ts ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetarget.ts": /*!********************************************************************************!*\ !*** ./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetarget.ts ***! \********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GlobalRetarget: () => (/* binding */ GlobalRetarget) /* harmony export */ }); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../misc/Is */ "./src/foundation/misc/Is.ts"); class GlobalRetarget { constructor(srcEntity) { this.__srcEntity = srcEntity; } getEntity() { return this.__srcEntity; } getSrcPGRestQ(srcEntity) { let srcPGRestQ; const parent = srcEntity.getSceneGraph().parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { srcPGRestQ = parent.getRotationRest((sg) => { const parent = sg.parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { const vrm = parent.entity.tryToGetVrm(); return _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(vrm); } else { return true; } }); } else { srcPGRestQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.identity(); } return srcPGRestQ; } getDstPGRestQ(dstEntity) { let dstPGRestQ; const parent = dstEntity.getSceneGraph().parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { dstPGRestQ = parent.getRotationRest((sg) => { const parent = sg.parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { const vrm = parent.entity.tryToGetVrm(); return _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(vrm); } else { return true; } }); } else { dstPGRestQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.identity(); } return dstPGRestQ; } retargetQuaternion(dstEntity) { const srcEntity = this.__srcEntity; // extract global retarget quaternion const srcPoseQ = srcEntity.getTransform().localRotationInner; const srcRestQ = srcEntity.getTransform().localRotationRestInner; const srcPGRestQ = this.getSrcPGRestQ(srcEntity); const animQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(srcPGRestQ, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(srcPoseQ, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(srcRestQ), _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(srcPGRestQ)))); // retarget quaternion to local pose const dstRestQ = dstEntity.getTransform().localRotationRestInner; const dstPgRestQ = this.getDstPGRestQ(dstEntity); const tgtPoseQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(dstPgRestQ), _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(animQ, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(dstPgRestQ, dstRestQ))); return tgtPoseQ; } retargetTranslate(dstEntity) { const srcEntity = this.__srcEntity; // extract global retarget translate const srcPoseT = srcEntity.getTransform().localPositionInner; const srcRestT = srcEntity.getTransform().localPositionRestInner; const srcPGRestQ = this.getSrcPGRestQ(srcEntity); const srcDelta = _math__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(srcPoseT, srcRestT); const AnimT = srcPGRestQ.transformVector3(srcDelta); // retarget translate to local pose const dstRestT = dstEntity.getTransform().localPositionRestInner; const dstPgRestQ = this.getDstPGRestQ(dstEntity); const dstPoseT = _math__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(dstPgRestQ.transformVector3Inverse(AnimT), dstRestT); if (srcEntity.uniqueName.indexOf('hips') >= 0) { return _math__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(dstPoseT, srcEntity.parent.scale.x); } return dstPoseT; } retargetScale(dstEntity) { const srcEntity = this.__srcEntity; return srcEntity.getTransform().localScaleInner; } } /***/ }), /***/ "./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetargetReverse.ts": /*!***************************************************************************************!*\ !*** ./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetargetReverse.ts ***! \***************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GlobalRetargetReverse: () => (/* binding */ GlobalRetargetReverse) /* harmony export */ }); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../misc/Is */ "./src/foundation/misc/Is.ts"); class GlobalRetargetReverse { constructor(srcEntity) { this.__srcEntity = srcEntity; } getEntity() { return this.__srcEntity; } getSrcPGRestQ(srcEntity) { let srcPGRestQ; const parent = srcEntity.getSceneGraph().parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { srcPGRestQ = parent.getRotationRest((sg) => { const parent = sg.parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { const vrm = parent.entity.tryToGetVrm(); return _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(vrm); } else { return true; } }); } else { srcPGRestQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.identity(); } return srcPGRestQ; } getDstPGRestQ(dstEntity) { let dstPGRestQ; const parent = dstEntity.getSceneGraph().parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { dstPGRestQ = parent.getRotationRest((sg) => { const parent = sg.parent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(parent)) { const vrm = parent.entity.tryToGetVrm(); return _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(vrm); } else { return true; } }); } else { dstPGRestQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.identity(); } return dstPGRestQ; } retargetQuaternion(dstEntity) { const srcEntity = this.__srcEntity; // extract global retarget quaternion const srcPoseQ = srcEntity.getTransform().localRotationInner; const srcRestQ = srcEntity.getTransform().localRotationRestInner; const srcPGRestQ = this.getSrcPGRestQ(srcEntity); const animQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(srcPGRestQ, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(srcPoseQ, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(srcRestQ), _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(srcPGRestQ)))); // retarget quaternion to local pose const dstRestQ = dstEntity.getTransform().localRotationRestInner; const dstPgRestQ = this.getDstPGRestQ(dstEntity); const tgtPoseQ = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(dstPgRestQ), _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(animQ, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(dstPgRestQ, dstRestQ))); const tgtPoseQRev = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(GlobalRetargetReverse.__rev, tgtPoseQ), _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(GlobalRetargetReverse.__rev)); return tgtPoseQRev; } retargetTranslate(dstEntity) { const srcEntity = this.__srcEntity; // extract global retarget translate const srcPoseT = srcEntity.getTransform().localPositionInner; const srcRestT = srcEntity.getTransform().localPositionRestInner; const srcPGRestQ = this.getSrcPGRestQ(srcEntity); const srcDelta = _math__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(srcPoseT, srcRestT); const AnimT = srcPGRestQ.transformVector3(srcDelta); // retarget translate to local pose const dstRestT = dstEntity.getTransform().localPositionRestInner; const dstPgRestQ = this.getDstPGRestQ(dstEntity); const dstPoseT = _math__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(dstPgRestQ.transformVector3Inverse(AnimT), dstRestT); if (srcEntity.uniqueName.indexOf('hips') >= 0) { const dstPoseT2 = _math__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(dstPoseT, srcEntity.parent.scale.x); const dstPoseTRev = GlobalRetargetReverse.__rev.transformVector3(dstPoseT2); return dstPoseTRev; } return dstPoseT; } retargetScale(dstEntity) { const srcEntity = this.__srcEntity; return srcEntity.getTransform().localScaleInner; } } GlobalRetargetReverse.__rev = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.fromAxisAngle(_math__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopy3(0, 1, 0), Math.PI); /***/ }), /***/ "./src/foundation/components/Skeletal/AnimationRetarget/index.ts": /*!***********************************************************************!*\ !*** ./src/foundation/components/Skeletal/AnimationRetarget/index.ts ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbsoluteAnimation: () => (/* reexport safe */ _AbsoluteAnimation__WEBPACK_IMPORTED_MODULE_3__.AbsoluteAnimation), /* harmony export */ GlobalRetarget: () => (/* reexport safe */ _GlobalRetarget__WEBPACK_IMPORTED_MODULE_1__.GlobalRetarget), /* harmony export */ GlobalRetargetReverse: () => (/* reexport safe */ _GlobalRetargetReverse__WEBPACK_IMPORTED_MODULE_2__.GlobalRetargetReverse) /* harmony export */ }); /* harmony import */ var _AnimationRetarget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AnimationRetarget */ "./src/foundation/components/Skeletal/AnimationRetarget/AnimationRetarget.ts"); /* harmony import */ var _GlobalRetarget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GlobalRetarget */ "./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetarget.ts"); /* harmony import */ var _GlobalRetargetReverse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GlobalRetargetReverse */ "./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetargetReverse.ts"); /* harmony import */ var _AbsoluteAnimation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AbsoluteAnimation */ "./src/foundation/components/Skeletal/AnimationRetarget/AbsoluteAnimation.ts"); /***/ }), /***/ "./src/foundation/components/Skeletal/ISkeletalEntity.ts": /*!***************************************************************!*\ !*** ./src/foundation/components/Skeletal/ISkeletalEntity.ts ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Skeletal/SkeletalComponent.ts": /*!*****************************************************************!*\ !*** ./src/foundation/components/Skeletal/SkeletalComponent.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SkeletalComponent: () => (/* binding */ SkeletalComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../math/MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../definitions/BoneDataType */ "./src/foundation/definitions/BoneDataType.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../misc */ "./src/foundation/misc/index.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class SkeletalComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityRepository, isReUse) { super(entityUid, componentSid, entityRepository, isReUse); this._jointIndices = []; this.__joints = []; this.isSkinning = true; this.__qArray = new Float32Array(0); this.__tsArray = new Float32Array(0); this.__tqArray = new Float32Array(0); this.__sqArray = new Float32Array(0); this.__qtsArray = new Float32Array(0); this.__qtsInfo = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_8__.MutableVector4.dummy(); this.__matArray = new Float32Array(0); this.__worldMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.identity(); this.__isWorldMatrixVanilla = true; this._isCulled = false; this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_4__.ProcessStage.Logic); if (isReUse) { return; } if (SkeletalComponent.__tookGlobalDataNum < _core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.maxSkeletonNumber) { if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Mat43x1) { SkeletalComponent.__globalDataRepository.takeOne('boneMatrix'); } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2) { SkeletalComponent.__globalDataRepository.takeOne('boneTranslatePackedQuat'); SkeletalComponent.__globalDataRepository.takeOne('boneScalePackedQuat'); } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2Old) { SkeletalComponent.__globalDataRepository.takeOne('boneQuaternion'); SkeletalComponent.__globalDataRepository.takeOne('boneTranslateScale'); } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x1) { SkeletalComponent.__globalDataRepository.takeOne('boneTranslateScale'); SkeletalComponent.__globalDataRepository.takeOne('boneCompressedChunk'); } SkeletalComponent.__tookGlobalDataNum++; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('The actual number of Skeleton generated exceeds Config.maxSkeletonNumber.'); } } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SkeletalComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SkeletalComponentTID; } setInverseBindMatricesAccessor(inverseBindMatricesAccessor) { this.__inverseBindMatricesAccessor = inverseBindMatricesAccessor; } setJoints(joints) { this.__joints = joints; // get each array data from global data repository let index = 0; if (this.componentSID < _core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.maxSkeletonNumber) { index = this.componentSID; } if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Mat43x1) { this.__matArray = SkeletalComponent.__globalDataRepository.getValue('boneMatrix', index)._v; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2) { this.__tqArray = SkeletalComponent.__globalDataRepository.getValue('boneTranslatePackedQuat', index)._v; this.__sqArray = SkeletalComponent.__globalDataRepository.getValue('boneScalePackedQuat', index)._v; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2Old) { this.__qArray = SkeletalComponent.__globalDataRepository.getValue('boneQuaternion', index)._v; this.__tsArray = SkeletalComponent.__globalDataRepository.getValue('boneTranslateScale', index)._v; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x1) { this.__tsArray = SkeletalComponent.__globalDataRepository.getValue('boneTranslateScale', index)._v; this.__qtsArray = SkeletalComponent.__globalDataRepository.getValue('boneCompressedChunk', index)._v; this.__qtsInfo = SkeletalComponent.__globalDataRepository.getValue('boneCompressedInfo', 0); } } getJoints() { return this.__joints.concat(); } get rootJointWorldMatrixInner() { var _a; return (_a = this.topOfJointsHierarchy) === null || _a === void 0 ? void 0 : _a.matrixInner; } get jointMatrices() { return this.__jointMatrices; } get jointQuaternionArray() { return this.__qArray; } get jointTranslateScaleArray() { return this.__tsArray; } get jointTranslatePackedQuat() { return this.__tqArray; } get jointScalePackedQuat() { return this.__sqArray; } get jointMatricesArray() { return this.__matArray; } get jointCompressedChunk() { return this.__qtsArray; } get jointCompressedInfo() { return this.__qtsInfo; } get worldMatrix() { return this.__worldMatrix.clone(); } get worldMatrixInner() { return this.__worldMatrix; } get isWorldMatrixUpdated() { return !this.__isWorldMatrixVanilla; } $logic() { if (!this.isSkinning) { return; } for (let i = 0; i < this.__joints.length; i++) { const joint = this.__joints[i]; let m; if (joint.isVisible) { const globalJointTransform = joint.matrixInner; _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.multiplyTypedArrayTo(globalJointTransform, this.__inverseBindMatricesAccessor.getTypedArray(), SkeletalComponent.__tmp_mat4, i); if (this._bindShapeMatrix) { SkeletalComponent.__tmp_mat4.multiply(this._bindShapeMatrix); // only for glTF1 } m = SkeletalComponent.__tmp_mat4; } else { m = SkeletalComponent.__identityMat; } if (i === 0 && joint.entity.tryToGetAnimation() != null) { this.__worldMatrix.copyComponents(m); } if (i === 1 && this.__joints[0].entity.tryToGetAnimation() == null) { // if the first joint has no animation (e.g. Root joint), expect the second joint to have a significant matrix this.__worldMatrix.copyComponents(m); } this.__isWorldMatrixVanilla = false; if (this._isCulled) { continue; } if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Mat43x1 || _core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x1) { this.__copyToMatArray(m, i); } if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType !== _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Mat43x1) { const scaleVec = SkeletalComponent.__tmpVec3_0.setComponents(Math.hypot(m._v[0], m._v[1], m._v[2]), Math.hypot(m._v[4], m._v[5], m._v[6]), Math.hypot(m._v[8], m._v[9], m._v[10])); m.m00 /= scaleVec.x; m.m01 /= scaleVec.x; m.m02 /= scaleVec.x; m.m10 /= scaleVec.y; m.m11 /= scaleVec.y; m.m12 /= scaleVec.y; m.m20 /= scaleVec.z; m.m21 /= scaleVec.z; m.m22 /= scaleVec.z; const q = SkeletalComponent.__tmp_q.fromMatrix(m); if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2Old || _core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x1) { let maxScale = 1; if (Math.abs(scaleVec.x) > Math.abs(scaleVec.y)) { if (Math.abs(scaleVec.x) > Math.abs(scaleVec.z)) { maxScale = scaleVec.x; } else { maxScale = scaleVec.z; } } else { if (Math.abs(scaleVec.y) > Math.abs(scaleVec.z)) { maxScale = scaleVec.y; } else { maxScale = scaleVec.z; } } this.__tsArray[i * 4 + 3] = maxScale; } if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2) { const vec2QPacked = _math_MathUtil__WEBPACK_IMPORTED_MODULE_7__.MathUtil.packNormalizedVec4ToVec2(q.x, q.y, q.z, q.w, Math.pow(2, 12)); this.__tqArray[i * 4 + 0] = m.m03; this.__tqArray[i * 4 + 1] = m.m13; this.__tqArray[i * 4 + 2] = m.m23; this.__sqArray[i * 4 + 0] = scaleVec.x; this.__sqArray[i * 4 + 1] = scaleVec.y; this.__sqArray[i * 4 + 2] = scaleVec.z; this.__tqArray[i * 4 + 3] = vec2QPacked[0]; this.__sqArray[i * 4 + 3] = vec2QPacked[1]; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x2Old) { this.__tsArray[i * 4 + 0] = m.m03; // m.getTranslate().x this.__tsArray[i * 4 + 1] = m.m13; // m.getTranslate().y this.__tsArray[i * 4 + 2] = m.m23; // m.getTranslate().z this.__qArray[i * 4 + 0] = q.x; this.__qArray[i * 4 + 1] = q.y; this.__qArray[i * 4 + 2] = q.z; this.__qArray[i * 4 + 3] = q.w; } if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x1) { // pack quaternion this.__tsArray[i * 4 + 0] = m.m03; // m.getTranslate().x this.__tsArray[i * 4 + 1] = m.m13; // m.getTranslate().y this.__tsArray[i * 4 + 2] = m.m23; // m.getTranslate().z const vec2QPacked = _math_MathUtil__WEBPACK_IMPORTED_MODULE_7__.MathUtil.packNormalizedVec4ToVec2(q.x, q.y, q.z, q.w, Math.pow(2, 12)); this.__qtsArray[i * 4 + 0] = vec2QPacked[0]; this.__qtsArray[i * 4 + 1] = vec2QPacked[1]; // q.normalize(); } } } if (_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_12__.BoneDataType.Vec4x1) { // const maxScale = Math.max(...scales); let maxAbsX = 1; let maxAbsY = 1; let maxAbsZ = 1; for (let i = 0; i < this.__joints.length; i++) { const absX = Math.abs(this.__tsArray[i * 4 + 0]); if (absX > maxAbsX) { maxAbsX = absX; } const absY = Math.abs(this.__tsArray[i * 4 + 1]); if (absY > maxAbsY) { maxAbsY = absY; } const absZ = Math.abs(this.__tsArray[i * 4 + 2]); if (absZ > maxAbsZ) { maxAbsZ = absZ; } } this.__qtsInfo.x = maxAbsX; this.__qtsInfo.y = maxAbsY; this.__qtsInfo.z = maxAbsZ; this.__qtsInfo.w = 1; for (let i = 0; i < this.__joints.length; i++) { // pack normalized XYZ and Uniform Scale const x = this.__tsArray[i * 4 + 0]; const y = this.__tsArray[i * 4 + 1]; const z = this.__tsArray[i * 4 + 2]; const scale = this.__tsArray[i * 4 + 3]; const normalizedX = x / maxAbsX; const normalizedY = y / maxAbsY; const normalizedZ = z / maxAbsZ; const normalizedW = scale; const vec2TPacked = _math_MathUtil__WEBPACK_IMPORTED_MODULE_7__.MathUtil.packNormalizedVec4ToVec2(normalizedX, normalizedY, normalizedZ, normalizedW, Math.pow(2, 12)); this.__qtsArray[i * 4 + 2] = vec2TPacked[0]; this.__qtsArray[i * 4 + 3] = vec2TPacked[1]; } } } __copyToMatArray(m, i) { // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 this.__matArray[i * 12 + 0] = m._v[0]; this.__matArray[i * 12 + 1] = m._v[1]; this.__matArray[i * 12 + 2] = m._v[2]; this.__matArray[i * 12 + 3] = m._v[4]; this.__matArray[i * 12 + 4] = m._v[5]; this.__matArray[i * 12 + 5] = m._v[6]; this.__matArray[i * 12 + 6] = m._v[8]; this.__matArray[i * 12 + 7] = m._v[9]; this.__matArray[i * 12 + 8] = m._v[10]; this.__matArray[i * 12 + 9] = m._v[12]; this.__matArray[i * 12 + 10] = m._v[13]; this.__matArray[i * 12 + 11] = m._v[14]; } getInverseBindMatricesAccessor() { return this.__inverseBindMatricesAccessor; } _shallowCopyFrom(component_) { const component = component_; this._jointIndices = component._jointIndices.concat(); this.setJoints(component.__joints.concat()); // const joints = []; // for (let i = 0; i < component.__joints.length; i++) { // if (component.__joints[i].entity._myLatestCopyEntityUID !== -1) { // joints[i] = EntityRepository.getEntity( // component.__joints[i].entity._myLatestCopyEntityUID // ).tryToGetSceneGraph()!; // } // } this.setJoints([]); this.__inverseBindMatricesAccessor = component.__inverseBindMatricesAccessor; if (_misc__WEBPACK_IMPORTED_MODULE_13__.Is.exist(component._bindShapeMatrix)) { this._bindShapeMatrix = component._bindShapeMatrix.clone(); } if (_misc__WEBPACK_IMPORTED_MODULE_13__.Is.exist(component.__jointMatrices)) { this.__jointMatrices = component.__jointMatrices.concat(); } this.topOfJointsHierarchy = component.topOfJointsHierarchy; this.isSkinning = component.isSkinning; this.__qArray.set(component.__qArray); this.__tsArray.set(component.__tsArray); this.__tqArray.set(component.__tqArray); this.__sqArray.set(component.__sqArray); this.__qtsArray.set(component.__qtsArray); this.__qtsInfo.copyComponents(component.__qtsInfo); this.__matArray.set(component.__matArray); this.__worldMatrix.copyComponents(component.__worldMatrix); this.__isWorldMatrixVanilla = component.__isWorldMatrixVanilla; } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.getEntity(this.__entityUid); } _destroy() { super._destroy(); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class SkeletalEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getSkeletal() { return this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SkeletalComponentTID); } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, SkeletalEntity); return base; } _getInverseBindMatrices(sg) { const index = this.__joints.indexOf(sg); const float32Array = this.__inverseBindMatricesAccessor.getTypedArray(); const m = new _math_Matrix44__WEBPACK_IMPORTED_MODULE_3__.Matrix44(float32Array.slice(index * 16, index * 16 + 16)); return m; } } SkeletalComponent.__globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_10__.GlobalDataRepository.getInstance(); SkeletalComponent.__tookGlobalDataNum = 0; SkeletalComponent.__tmpVec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_5__.MutableVector3.zero(); SkeletalComponent.__tmp_mat4 = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.identity(); SkeletalComponent.__tmp_q = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_6__.MutableQuaternion.fromCopy4(0, 0, 0, 1); SkeletalComponent.__identityMat = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.identity(); /***/ }), /***/ "./src/foundation/components/Skeletal/createSkeletalEntity.ts": /*!********************************************************************!*\ !*** ./src/foundation/components/Skeletal/createSkeletalEntity.ts ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createSkeletalEntity: () => (/* binding */ createSkeletalEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createSkeletalEntity() { const entity = (0,_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SkeletalComponentTID, entity); return entityAddedComponent; } /***/ }), /***/ "./src/foundation/components/Skeletal/index.ts": /*!*****************************************************!*\ !*** ./src/foundation/components/Skeletal/index.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbsoluteAnimation: () => (/* reexport safe */ _AnimationRetarget__WEBPACK_IMPORTED_MODULE_0__.AbsoluteAnimation), /* harmony export */ GlobalRetarget: () => (/* reexport safe */ _AnimationRetarget__WEBPACK_IMPORTED_MODULE_0__.GlobalRetarget), /* harmony export */ GlobalRetargetReverse: () => (/* reexport safe */ _AnimationRetarget__WEBPACK_IMPORTED_MODULE_0__.GlobalRetargetReverse), /* harmony export */ SkeletalComponent: () => (/* reexport safe */ _SkeletalComponent__WEBPACK_IMPORTED_MODULE_2__.SkeletalComponent), /* harmony export */ createSkeletalEntity: () => (/* reexport safe */ _createSkeletalEntity__WEBPACK_IMPORTED_MODULE_3__.createSkeletalEntity) /* harmony export */ }); /* harmony import */ var _AnimationRetarget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AnimationRetarget */ "./src/foundation/components/Skeletal/AnimationRetarget/index.ts"); /* harmony import */ var _ISkeletalEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ISkeletalEntity */ "./src/foundation/components/Skeletal/ISkeletalEntity.ts"); /* harmony import */ var _SkeletalComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SkeletalComponent */ "./src/foundation/components/Skeletal/SkeletalComponent.ts"); /* harmony import */ var _createSkeletalEntity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createSkeletalEntity */ "./src/foundation/components/Skeletal/createSkeletalEntity.ts"); /***/ }), /***/ "./src/foundation/components/Transform/ITransformEntity.ts": /*!*****************************************************************!*\ !*** ./src/foundation/components/Transform/ITransformEntity.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Transform/TransformComponent.ts": /*!*******************************************************************!*\ !*** ./src/foundation/components/Transform/TransformComponent.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TransformComponent: () => (/* binding */ TransformComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../misc */ "./src/foundation/misc/index.ts"); class TransformComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityComponent, isReUse) { super(entityUid, componentSid, entityComponent, isReUse); this.__pose = new _math__WEBPACK_IMPORTED_MODULE_5__.Transform3D(); this.__updateCountAtLastLogic = 0; } static get renderedPropertyCount() { return null; } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.TransformComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.TransformComponentTID; } get restOrPose() { if (this.__rest !== undefined) { return this.__rest; } else { return this.__pose; } } static get updateCount() { return this.__updateCount; } _backupTransformAsRest() { if (this.__rest === undefined) { this.__rest = this.__pose.clone(); const sceneGraphComponent = this.entity.tryToGetSceneGraph(); sceneGraphComponent.setWorldMatrixRestDirty(); } } _restoreTransformFromRest() { if (this.__rest === undefined) { return; } this.__pose.setTransform(this.__rest.positionInner, _math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(this.__rest.eulerAnglesInner), this.__rest.scaleInner, _math__WEBPACK_IMPORTED_MODULE_5__.MutableQuaternion.fromCopyQuaternion(this.__rest.rotationInner), this.__rest.matrixInner); } get localTransform() { return this.__pose; } set localTransform(transform) { this.__pose.setTransform(transform.positionInner, _math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(transform.eulerAnglesInner), transform.scaleInner, _math__WEBPACK_IMPORTED_MODULE_5__.MutableQuaternion.fromCopyQuaternion(transform.rotationInner), transform.matrixInner); TransformComponent.__updateCount++; } get localTransformRest() { return this.restOrPose; } set localTransformRest(transform) { if (_misc__WEBPACK_IMPORTED_MODULE_6__.Is.undefined(this.__rest)) { this.__rest = new _math__WEBPACK_IMPORTED_MODULE_5__.Transform3D(); } this.__rest.setTransform(transform.positionInner, _math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(transform.eulerAnglesInner), transform.scaleInner, _math__WEBPACK_IMPORTED_MODULE_5__.MutableQuaternion.fromCopyQuaternion(transform.rotationInner), transform.matrixInner); TransformComponent.__updateCount++; } set localPosition(vec) { this.__pose.position = vec; TransformComponent.__updateCount++; } /** * return a copy of a local translate vector */ get localPosition() { return this.__pose.position; } /** * return a local translate vector */ get localPositionInner() { return this.__pose.positionInner; } /** * set a local translate vector as Rest */ set localPositionRest(vec) { if (_misc__WEBPACK_IMPORTED_MODULE_6__.Is.undefined(this.__rest)) { this.__rest = this.__pose.clone(); } this.__rest.position = vec; TransformComponent.__updateCount++; } /** * return a copy of a local translate vector */ get localPositionRest() { return this.restOrPose.position; } /** * return a local translate vector */ get localPositionRestInner() { return this.restOrPose.positionInner; } set localEulerAngles(vec) { this.__pose.eulerAngles = vec; TransformComponent.__updateCount++; } /** * return a copy of a local rotation (XYZ euler) vector */ get localEulerAngles() { return this.__pose.eulerAngles; } /** * return a local rotation (XYZ euler) vector */ get localEulerAnglesInner() { return this.__pose.eulerAnglesInner; } /** * set a local rotation (XYZ euler) vector as Rest */ set localEulerAnglesRest(vec) { if (_misc__WEBPACK_IMPORTED_MODULE_6__.Is.undefined(this.__rest)) { this.__rest = this.__pose.clone(); } this.__rest.eulerAngles = vec; TransformComponent.__updateCount++; } /** * return a copy of a local rotation (XYZ euler) vector */ get localEulerAnglesRest() { return this.restOrPose.eulerAngles; } /** * return a local rotation (XYZ euler) vector */ get localEulerAnglesRestInner() { return this.restOrPose.eulerAnglesInner; } set localScale(vec) { this.__pose.scale = vec; TransformComponent.__updateCount++; } /** * return a copy of a local scale vector */ get localScale() { return this.__pose.scale; } /** * return a local scale vector */ get localScaleInner() { return this.__pose.scaleInner; } /** * set a local scale vector as Rest */ set localScaleRest(vec) { if (_misc__WEBPACK_IMPORTED_MODULE_6__.Is.undefined(this.__rest)) { this.__rest = this.__pose.clone(); } this.__rest.scale = vec; TransformComponent.__updateCount++; } /** * return a copy of a local scale vector */ get localScaleRest() { return this.restOrPose.scale; } /** * return a local scale vector */ get localScaleRestInner() { return this.restOrPose.scaleInner; } set localRotation(quat) { this.__pose.rotation = quat; TransformComponent.__updateCount++; } /** * return a copy of a local quaternion vector */ get localRotation() { return this.__pose.rotation; } /** * return a local quaternion vector */ get localRotationInner() { return this.__pose.rotationInner; } /** * set a local quaternion vector as Rest */ set localRotationRest(quat) { if (_misc__WEBPACK_IMPORTED_MODULE_6__.Is.undefined(this.__rest)) { this.__rest = this.__pose.clone(); } this.__rest.rotation = quat; TransformComponent.__updateCount++; } /** * return a copy of a local quaternion vector */ get localRotationRest() { return this.restOrPose.rotation; } /** * return a local quaternion vector */ get localRotationRestInner() { return this.restOrPose.rotationInner; } set localMatrix(mat) { this.__pose.matrix = mat; TransformComponent.__updateCount++; } /** * return a copy of local transform matrix */ get localMatrix() { return this.__pose.matrix; } /** * return a local transform matrix */ get localMatrixInner() { return this.__pose.matrixInner; } /** * set a local transform matrix as Rest */ set localMatrixRest(mat) { if (_misc__WEBPACK_IMPORTED_MODULE_6__.Is.undefined(this.__rest)) { this.__rest = this.__pose.clone(); } this.__rest.matrix = mat; TransformComponent.__updateCount++; } /** * return a copy of local transform matrix */ get localMatrixRest() { return this.restOrPose.matrix; } /** * return a local transform matrix */ get localMatrixRestInner() { return this.restOrPose.matrixInner; } $load() { this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_3__.ProcessStage.Logic); } $logic() { if (this.__updateCountAtLastLogic !== this.__pose.updateCount) { this.entity.tryToGetSceneGraph().setWorldMatrixDirty(); this.__updateCountAtLastLogic = this.__pose.updateCount; } } _shallowCopyFrom(component_) { const component = component_; this.__pose = component.__pose.clone(); if (component.__rest != null) { this.__rest = component.__rest.clone(); } this.__updateCountAtLastLogic = component.__updateCountAtLastLogic; TransformComponent.__updateCount++; } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.getEntity(this.__entityUid); } _destroy() { super._destroy(); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class TransformEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getTransform() { if (this.__transformComponent === undefined) { this.__transformComponent = this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.TransformComponentTID); } return this.__transformComponent; } set localPosition(vec) { const transform = this.getTransform(); transform.localPosition = vec; } get localPosition() { return this.localPositionInner.clone(); } get localPositionInner() { const transform = this.getTransform(); return transform.localPositionInner; } set localPositionRest(vec) { const transform = this.getTransform(); transform.localPositionRest = vec; } get localPositionRest() { const transform = this.getTransform(); return transform.localPositionRest; } get localPositionRestInner() { const transform = this.getTransform(); return transform.localPositionRestInner; } set localScale(vec) { const transform = this.getTransform(); transform.localScale = vec; } get localScale() { return this.localScaleInner.clone(); } get localScaleInner() { const transform = this.getTransform(); return transform.localScaleInner; } set localScaleRest(vec) { const transform = this.getTransform(); transform.localScaleRest = vec; } get localScaleRest() { const transform = this.getTransform(); return transform.localScaleRest; } get localScaleRestInner() { const transform = this.getTransform(); return transform.localScaleRestInner; } set localEulerAngles(vec) { const transform = this.getTransform(); transform.localEulerAngles = vec; } get localEulerAngles() { return this.localEulerAnglesInner.clone(); } get localEulerAnglesInner() { const transform = this.getTransform(); return transform.localEulerAnglesInner; } set localEulerAnglesRest(vec) { const transform = this.getTransform(); transform.localEulerAnglesRest = vec; } get localEulerAnglesRest() { return this.localEulerAnglesRestInner.clone(); } get localEulerAnglesRestInner() { const transform = this.getTransform(); return transform.localEulerAnglesRestInner; } set localRotation(quat) { const transform = this.getTransform(); transform.localRotation = quat; } get localRotation() { return this.localRotationInner.clone(); } get localRotationInner() { const transform = this.getTransform(); return transform.localRotationInner; } set localRotationRest(quat) { const transform = this.getTransform(); transform.localRotationRest = quat; } get localRotationRest() { return this.localQuaternionRestInner.clone(); } get localRotationRestInner() { const transform = this.getTransform(); return transform.localRotationRestInner; } set localMatrix(mat) { const transform = this.getTransform(); transform.localMatrix = mat; } get localMatrix() { return this.localMatrixInner.clone(); } get localMatrixInner() { const transform = this.getTransform(); return transform.localMatrixInner; } set localMatrixRest(mat) { const transform = this.getTransform(); transform.localMatrixRest = mat; } get localMatrixRest() { return this.localMatrixRestInner.clone(); } get localMatrixRestInner() { const transform = this.getTransform(); return transform.localMatrixRestInner; } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, TransformEntity); return base; } } TransformComponent.__updateCount = 0; /***/ }), /***/ "./src/foundation/components/Transform/createTransformEntity.ts": /*!**********************************************************************!*\ !*** ./src/foundation/components/Transform/createTransformEntity.ts ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createTransformEntity: () => (/* binding */ createTransformEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); function createTransformEntity() { const entity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.createEntity(); const entity1 = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_1__.WellKnownComponentTIDs.TransformComponentTID, entity); return entity1; } /***/ }), /***/ "./src/foundation/components/Transform/index.ts": /*!******************************************************!*\ !*** ./src/foundation/components/Transform/index.ts ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TransformComponent: () => (/* reexport safe */ _TransformComponent__WEBPACK_IMPORTED_MODULE_1__.TransformComponent), /* harmony export */ createTransformEntity: () => (/* reexport safe */ _createTransformEntity__WEBPACK_IMPORTED_MODULE_2__.createTransformEntity) /* harmony export */ }); /* harmony import */ var _ITransformEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ITransformEntity */ "./src/foundation/components/Transform/ITransformEntity.ts"); /* harmony import */ var _TransformComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _createTransformEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createTransformEntity */ "./src/foundation/components/Transform/createTransformEntity.ts"); /***/ }), /***/ "./src/foundation/components/Vrm/IVrmEntity.ts": /*!*****************************************************!*\ !*** ./src/foundation/components/Vrm/IVrmEntity.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/components/Vrm/VrmComponent.ts": /*!*******************************************************!*\ !*** ./src/foundation/components/Vrm/VrmComponent.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmComponent: () => (/* binding */ VrmComponent) /* harmony export */ }); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc */ "./src/foundation/misc/index.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); class VrmComponent extends _core_Component__WEBPACK_IMPORTED_MODULE_0__.Component { constructor(entityUid, componentSid, entityComponent, isReUse) { super(entityUid, componentSid, entityComponent, isReUse); this.__expressions = new Map(); this.__weights = new Map(); this._version = ''; this.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_2__.ProcessStage.Logic); } static get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.VrmComponentTID; } get componentTID() { return _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.VrmComponentTID; } setVrmExpressions(expressions) { for (const exp of expressions) { this.__expressions.set(exp.name, exp); this.__weights.set(exp.name, 0); } } setExpressionWeight(expressionName, weight) { const expression = this.__expressions.get(expressionName); if (_misc__WEBPACK_IMPORTED_MODULE_3__.Is.not.exist(expression)) { return; } this.__weights.set(expressionName, weight); for (const bind of expression.binds) { const entity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.getEntity(bind.entityIdx); const blendShapeComponent = entity.tryToGetBlendShape(); if (_misc__WEBPACK_IMPORTED_MODULE_3__.Is.exist(blendShapeComponent)) { blendShapeComponent.setWeightByIndex(bind.blendShapeIdx, weight); } } } getExpressionWeight(expressionName) { return this.__weights.get(expressionName); } getExpressionNames() { return Array.from(this.__expressions.keys()); } _shallowCopyFrom(component) { const vrmComponent = component; this.__expressions = new Map(vrmComponent.__expressions); this.__weights = new Map(vrmComponent.__weights); this._version = vrmComponent._version; } _destroy() { super._destroy(); } /** * @override * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { class VrmEntity extends base.constructor { constructor(entityUID, isAlive, components) { super(entityUID, isAlive, components); } getVrm() { if (this.__vrmComponent === undefined) { this.__vrmComponent = this.getComponentByComponentTID(_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.VrmComponentTID); } return this.__vrmComponent; } } (0,_core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.applyMixins)(base, VrmEntity); return base; } } /***/ }), /***/ "./src/foundation/components/Vrm/index.ts": /*!************************************************!*\ !*** ./src/foundation/components/Vrm/index.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmComponent: () => (/* reexport safe */ _VrmComponent__WEBPACK_IMPORTED_MODULE_1__.VrmComponent) /* harmony export */ }); /* harmony import */ var _IVrmEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IVrmEntity */ "./src/foundation/components/Vrm/IVrmEntity.ts"); /* harmony import */ var _VrmComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VrmComponent */ "./src/foundation/components/Vrm/VrmComponent.ts"); /***/ }), /***/ "./src/foundation/components/WellKnownComponentTIDs.ts": /*!*************************************************************!*\ !*** ./src/foundation/components/WellKnownComponentTIDs.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WellKnownComponentTIDs: () => (/* binding */ WellKnownComponentTIDs) /* harmony export */ }); // const MaterialSID = 0 const AnimationStateComponentTID = 1; const AnimationComponentTID = 2; const TransformComponentTID = 3; const SceneGraphComponentTID = 4; const MeshComponentTID = 5; const MeshRendererComponentTID = 6; const LightComponentTID = 7; const CameraControllerComponentTID = 8; const CameraComponentTID = 9; const SkeletalComponentTID = 10; const BlendShapeComponentTID = 11; const PhysicsComponentTID = 12; const EffekseerComponentTID = 13; const VrmComponentTID = 14; const ConstraintComponentTID = 15; const maxWellKnownTidNumber = 15; const WellKnownComponentTIDs = Object.freeze({ AnimationStateComponentTID, AnimationComponentTID, TransformComponentTID, SceneGraphComponentTID, MeshComponentTID, MeshRendererComponentTID, LightComponentTID, CameraControllerComponentTID, CameraComponentTID, SkeletalComponentTID, BlendShapeComponentTID, PhysicsComponentTID, EffekseerComponentTID, VrmComponentTID, ConstraintComponentTID, maxWellKnownTidNumber, }); /***/ }), /***/ "./src/foundation/components/index.ts": /*!********************************************!*\ !*** ./src/foundation/components/index.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbsoluteAnimation: () => (/* reexport safe */ _Skeletal_index__WEBPACK_IMPORTED_MODULE_9__.AbsoluteAnimation), /* harmony export */ AnimationComponent: () => (/* reexport safe */ _Animation_index__WEBPACK_IMPORTED_MODULE_0__.AnimationComponent), /* harmony export */ BlendShapeComponent: () => (/* reexport safe */ _BlendShape_index__WEBPACK_IMPORTED_MODULE_1__.BlendShapeComponent), /* harmony export */ CameraComponent: () => (/* reexport safe */ _Camera_index__WEBPACK_IMPORTED_MODULE_2__.CameraComponent), /* harmony export */ CameraControllerComponent: () => (/* reexport safe */ _CameraController_index__WEBPACK_IMPORTED_MODULE_3__.CameraControllerComponent), /* harmony export */ GlobalRetarget: () => (/* reexport safe */ _Skeletal_index__WEBPACK_IMPORTED_MODULE_9__.GlobalRetarget), /* harmony export */ GlobalRetargetReverse: () => (/* reexport safe */ _Skeletal_index__WEBPACK_IMPORTED_MODULE_9__.GlobalRetargetReverse), /* harmony export */ LightComponent: () => (/* reexport safe */ _Light_index__WEBPACK_IMPORTED_MODULE_4__.LightComponent), /* harmony export */ MeshComponent: () => (/* reexport safe */ _Mesh_index__WEBPACK_IMPORTED_MODULE_5__.MeshComponent), /* harmony export */ MeshRendererComponent: () => (/* reexport safe */ _MeshRenderer_index__WEBPACK_IMPORTED_MODULE_6__.MeshRendererComponent), /* harmony export */ PhysicsComponent: () => (/* reexport safe */ _Physics_index__WEBPACK_IMPORTED_MODULE_7__.PhysicsComponent), /* harmony export */ SceneGraphComponent: () => (/* reexport safe */ _SceneGraph_index__WEBPACK_IMPORTED_MODULE_8__.SceneGraphComponent), /* harmony export */ SkeletalComponent: () => (/* reexport safe */ _Skeletal_index__WEBPACK_IMPORTED_MODULE_9__.SkeletalComponent), /* harmony export */ TransformComponent: () => (/* reexport safe */ _Transform_index__WEBPACK_IMPORTED_MODULE_10__.TransformComponent), /* harmony export */ VrmComponent: () => (/* reexport safe */ _Vrm_index__WEBPACK_IMPORTED_MODULE_11__.VrmComponent), /* harmony export */ WellKnownComponentTIDs: () => (/* reexport safe */ _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_13__.WellKnownComponentTIDs), /* harmony export */ createCameraControllerEntity: () => (/* reexport safe */ _CameraController_index__WEBPACK_IMPORTED_MODULE_3__.createCameraControllerEntity), /* harmony export */ createCameraEntity: () => (/* reexport safe */ _Camera_index__WEBPACK_IMPORTED_MODULE_2__.createCameraEntity), /* harmony export */ createGroupEntity: () => (/* reexport safe */ _SceneGraph_index__WEBPACK_IMPORTED_MODULE_8__.createGroupEntity), /* harmony export */ createLightEntity: () => (/* reexport safe */ _Light_index__WEBPACK_IMPORTED_MODULE_4__.createLightEntity), /* harmony export */ createMeshEntity: () => (/* reexport safe */ _MeshRenderer_index__WEBPACK_IMPORTED_MODULE_6__.createMeshEntity), /* harmony export */ createPhysicsEntity: () => (/* reexport safe */ _Physics_index__WEBPACK_IMPORTED_MODULE_7__.createPhysicsEntity), /* harmony export */ createSkeletalEntity: () => (/* reexport safe */ _Skeletal_index__WEBPACK_IMPORTED_MODULE_9__.createSkeletalEntity), /* harmony export */ createTransformEntity: () => (/* reexport safe */ _Transform_index__WEBPACK_IMPORTED_MODULE_10__.createTransformEntity), /* harmony export */ defaultAnimationTrackName: () => (/* reexport safe */ _Animation_index__WEBPACK_IMPORTED_MODULE_0__.defaultAnimationTrackName), /* harmony export */ flattenHierarchy: () => (/* reexport safe */ _SceneGraph_index__WEBPACK_IMPORTED_MODULE_8__.flattenHierarchy) /* harmony export */ }); /* harmony import */ var _Animation_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Animation/index */ "./src/foundation/components/Animation/index.ts"); /* harmony import */ var _BlendShape_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BlendShape/index */ "./src/foundation/components/BlendShape/index.ts"); /* harmony import */ var _Camera_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Camera/index */ "./src/foundation/components/Camera/index.ts"); /* harmony import */ var _CameraController_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CameraController/index */ "./src/foundation/components/CameraController/index.ts"); /* harmony import */ var _Light_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Light/index */ "./src/foundation/components/Light/index.ts"); /* harmony import */ var _Mesh_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Mesh/index */ "./src/foundation/components/Mesh/index.ts"); /* harmony import */ var _MeshRenderer_index__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MeshRenderer/index */ "./src/foundation/components/MeshRenderer/index.ts"); /* harmony import */ var _Physics_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Physics/index */ "./src/foundation/components/Physics/index.ts"); /* harmony import */ var _SceneGraph_index__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./SceneGraph/index */ "./src/foundation/components/SceneGraph/index.ts"); /* harmony import */ var _Skeletal_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Skeletal/index */ "./src/foundation/components/Skeletal/index.ts"); /* harmony import */ var _Transform_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Transform/index */ "./src/foundation/components/Transform/index.ts"); /* harmony import */ var _Vrm_index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Vrm/index */ "./src/foundation/components/Vrm/index.ts"); /* harmony import */ var _ComponentTypes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ComponentTypes */ "./src/foundation/components/ComponentTypes.ts"); /* harmony import */ var _WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _registerComponents__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./registerComponents */ "./src/foundation/components/registerComponents.ts"); /***/ }), /***/ "./src/foundation/components/registerComponents.ts": /*!*********************************************************!*\ !*** ./src/foundation/components/registerComponents.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _effekseer_EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../effekseer/EffekseerComponent */ "./src/effekseer/EffekseerComponent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AnimationState/AnimationStateComponent */ "./src/foundation/components/AnimationState/AnimationStateComponent.ts"); /* harmony import */ var _BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./BlendShape/BlendShapeComponent */ "./src/foundation/components/BlendShape/BlendShapeComponent.ts"); /* harmony import */ var _Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CameraController/CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /* harmony import */ var _Constraint_ConstraintComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Constraint/ConstraintComponent */ "./src/foundation/components/Constraint/ConstraintComponent.ts"); /* harmony import */ var _Light_LightComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Light/LightComponent */ "./src/foundation/components/Light/LightComponent.ts"); /* harmony import */ var _Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Mesh/MeshComponent */ "./src/foundation/components/Mesh/MeshComponent.ts"); /* harmony import */ var _MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./MeshRenderer/MeshRendererComponent */ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts"); /* harmony import */ var _Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Physics/PhysicsComponent */ "./src/foundation/components/Physics/PhysicsComponent.ts"); /* harmony import */ var _SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./SceneGraph/SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); /* harmony import */ var _Skeletal_SkeletalComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Skeletal/SkeletalComponent */ "./src/foundation/components/Skeletal/SkeletalComponent.ts"); /* harmony import */ var _Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _Vrm_VrmComponent__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Vrm/VrmComponent */ "./src/foundation/components/Vrm/VrmComponent.ts"); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_3__.AnimationStateComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_2__.AnimationComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_14__.TransformComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_12__.SceneGraphComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_9__.MeshComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_10__.MeshRendererComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Light_LightComponent__WEBPACK_IMPORTED_MODULE_8__.LightComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_6__.CameraControllerComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_5__.CameraComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Skeletal_SkeletalComponent__WEBPACK_IMPORTED_MODULE_13__.SkeletalComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_4__.BlendShapeComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_11__.PhysicsComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_effekseer_EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__.EffekseerComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Vrm_VrmComponent__WEBPACK_IMPORTED_MODULE_15__.VrmComponent); _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.registerComponentClass(_Constraint_ConstraintComponent__WEBPACK_IMPORTED_MODULE_7__.ConstraintComponent); /***/ }), /***/ "./src/foundation/constraints/VrmAimConstraint.ts": /*!********************************************************!*\ !*** ./src/foundation/constraints/VrmAimConstraint.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmAimConstraint: () => (/* binding */ VrmAimConstraint) /* harmony export */ }); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); class VrmAimConstraint { constructor(srcEntity, aimAxis, weight, dstEntity) { this.__srcEntity = srcEntity; this.__aimAxis = aimAxis; this.__weight = weight; this.__dstEntity = dstEntity; this.__dstEntity.getTransform()._backupTransformAsRest(); } getAxisVector(aimAxis) { switch (aimAxis) { case 'PositiveX': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(1, 0, 0); case 'NegativeX': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(-1, 0, 0); case 'PositiveY': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, 1, 0); case 'NegativeY': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, -1, 0); case 'PositiveZ': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, 0, 1); case 'NegativeZ': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, 0, -1); default: throw new Error('Invalid roll axis'); } } update() { const aimAxis = this.getAxisVector(this.__aimAxis); const dstParentWorldQuat = _misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(this.__dstEntity.getSceneGraph().parent) ? this.__dstEntity.getSceneGraph().parent.rotation : _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.identity(); const dstRestQuat = this.__dstEntity.localRotationRestInner; const fromVec = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(dstParentWorldQuat, dstRestQuat).transformVector3(aimAxis); const toVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.subtract(this.__srcEntity.position, this.__dstEntity.position)); const fromToQuat = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.fromToRotation(fromVec, toVec); const targetQuat = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.lerp(dstRestQuat, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(dstParentWorldQuat), fromToQuat), dstParentWorldQuat), dstRestQuat), this.__weight); this.__dstEntity.localRotation = targetQuat; } } /***/ }), /***/ "./src/foundation/constraints/VrmRollConstraint.ts": /*!*********************************************************!*\ !*** ./src/foundation/constraints/VrmRollConstraint.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmRollConstraint: () => (/* binding */ VrmRollConstraint) /* harmony export */ }); /* harmony import */ var _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); class VrmRollConstraint { constructor(srcEntity, rollAxis, weight, dstEntity) { this.__srcEntity = srcEntity; this.__rollAxis = rollAxis; this.__weight = weight; this.__dstEntity = dstEntity; this.__dstEntity.getTransform()._backupTransformAsRest(); } getAxisVector(rollAxis) { switch (rollAxis) { case 'X': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(1, 0, 0); case 'Y': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, 1, 0); case 'Z': return _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, 0, 1); default: throw new Error('Invalid roll axis'); } } update() { const deltaSrcQuat = _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(this.__srcEntity.localRotationRestInner), this.__srcEntity.localRotationInner); const deltaSrcQuatInParent = _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(this.__srcEntity.localRotationRestInner, deltaSrcQuat), _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(this.__srcEntity.localRotationRestInner)); const deltaSrcQuatInDst = _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(this.__dstEntity.localRotationRestInner), deltaSrcQuatInParent), this.__dstEntity.localRotationRestInner); const rollAxis = this.getAxisVector(this.__rollAxis); const toVec = deltaSrcQuatInDst.transformVector3(rollAxis); const fromToQuat = _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.fromToRotation(rollAxis, toVec); const targetQuat = _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.lerp(this.__dstEntity.localRotationRestInner, _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(this.__dstEntity.localRotationRestInner, _math_Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(fromToQuat)), deltaSrcQuatInDst), this.__weight); this.__dstEntity.localRotation = targetQuat; } } /***/ }), /***/ "./src/foundation/constraints/VrmRotationConstraint.ts": /*!*************************************************************!*\ !*** ./src/foundation/constraints/VrmRotationConstraint.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmRotationConstraint: () => (/* binding */ VrmRotationConstraint) /* harmony export */ }); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ "./src/foundation/math/index.ts"); class VrmRotationConstraint { constructor(srcEntity, weight, dstEntity) { this.__srcEntity = srcEntity; this.__weight = weight; this.__dstEntity = dstEntity; this.__dstEntity.getTransform()._backupTransformAsRest(); } update() { const srcDeltaQuat = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.invert(this.__srcEntity.localRotationRestInner), this.__srcEntity.localRotationInner); const targetQuat = _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.lerp(this.__dstEntity.localRotationRestInner, _math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.multiply(this.__dstEntity.localRotationRestInner, srcDeltaQuat), this.__weight); this.__dstEntity.localRotation = targetQuat; } } /***/ }), /***/ "./src/foundation/core/Component.ts": /*!******************************************!*\ !*** ./src/foundation/core/Component.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Component: () => (/* binding */ Component) /* harmony export */ }); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _ComponentRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _Config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _RnObject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc */ "./src/foundation/misc/index.ts"); /** * Component is a functional unit that can be added to an Entity instance. */ class Component extends _RnObject__WEBPACK_IMPORTED_MODULE_4__.RnObject { /** * The constructor of the Component class. * When creating an Component, use the createComponent method of the ComponentRepository class * instead of directly calling this constructor. * @param entityUid Unique ID of the corresponding entity * @param componentSid Scoped ID of the Component * @param entityRepository The instance of the EntityRepository class (Dependency Injection) */ constructor(entityUid, componentSid, entityRepository, isReUse) { super(); this._isAlive = true; this.__currentProcessStage = _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_1__.ProcessStage.Load; this.__byteOffsetOfThisComponent = -1; /** the MaxComponent Number of entities */ this.__maxComponentNumber = _Config__WEBPACK_IMPORTED_MODULE_3__.Config.maxEntityNumber; this.__entityUid = entityUid; this._component_sid = componentSid; const stages = Component._processStages; this.__memoryManager = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_0__.MemoryManager.getInstance(); this.__entityRepository = entityRepository; } /** * Move to the other stages of process * @param processStage stage of component's process */ moveStageTo(processStage) { // Component.__dirtyOfArrayOfProcessStages.set(this.__currentProcessStage, false); // Component.__dirtyOfArrayOfProcessStages.set(processStage, true); this.__currentProcessStage = processStage; } /** * @internal * set the Max number of components * this method is called by the ***Component classes only */ _setMaxNumberOfComponent(value) { this.__maxComponentNumber = value; } /** * Get the max number of components */ get maxNumberOfComponent() { return this.__maxComponentNumber; } /** * Get the Type ID of the Component */ static get componentTID() { return 0; } /** * Get the Type ID of the Component */ get componentTID() { return 0; } /** * Get the Scoped ID of the Component */ get componentSID() { return this._component_sid; } /** * Get the unique ID of the entity corresponding to the component. */ get entityUID() { return this.__entityUid; } /** * Get the current process stage of the component. */ get currentProcessStage() { return this.__currentProcessStage; } /** * Get true or false whether the specified ProcessStage exists in Component. * @returns true or false */ static doesTheProcessStageMethodExist(componentType, processStage) { if (componentType.prototype[processStage.methodName] == null) { return false; } return true; } /** * Get true or false whether the specified ProcessStage exists in Component. */ isExistProcessStageMethod(processStage) { if (this[processStage.methodName] == null) { return false; } return true; } /** * Process the components * @param param0 params */ static process(componentType, processStage) { if (!Component.doesTheProcessStageMethodExist(componentType, processStage)) { return; } const methodName = processStage.methodName; const components = _ComponentRepository__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository.getComponentsWithType(componentType); for (const component of components) { if (processStage === component.__currentProcessStage) { component[methodName](); } } } static updateComponentsForRenderStage(componentClass, processStage, renderPass) { const method = componentClass['sort_$render']; return method(renderPass); } /** * get byte length of sum of member fields in the component class */ static getByteLengthSumOfMembers(bufferUse, componentClass) { const byteLengthSumOfMembers = this.__byteLengthSumOfMembers.get(componentClass); return byteLengthSumOfMembers.get(bufferUse); } /** * register a dependency for the other components. * Note: This method is not used yet */ registerDependency(component, isMust) { } // /** // * take a buffer view from the buffer. // */ // static takeBufferView( // bufferUse: BufferUseEnum, // componentClass: Function, // byteLengthSumOfMembers: Byte, // count: Count // ) { // const buffer = MemoryManager.getInstance().createOrGetBuffer(bufferUse); // if (!this.__bufferViews.has(componentClass)) { // this.__bufferViews.set(componentClass, new Map()); // } // const bufferViews = this.__bufferViews.get(componentClass)!; // if (!bufferViews.has(bufferUse)) { // const bufferView = buffer.takeBufferView({ // byteLengthToNeed: byteLengthSumOfMembers * count, // byteStride: 0, // }).unwrapForce(); // bufferViews.set(bufferUse, bufferView); // return bufferView; // } // return void 0; // } /** * take one memory area for the specified member for all same type of the component instances. */ takeOne(memberName, dataClassType, initValues, isReUse, componentSid) { if (!this['_' + memberName].isDummy()) { return; } let taken; if (isReUse) { taken = Component.__accessors .get(this.constructor) .get(memberName) ._takeExistedOne(componentSid); } else { taken = Component.__accessors.get(this.constructor).get(memberName).takeOne(); } this['_' + memberName] = new dataClassType(taken, false, true); for (let i = 0; i < this['_' + memberName]._v.length; ++i) { this['_' + memberName]._v[i] = initValues[i]; } return null; } /** * get the taken accessor for the member field. */ static getAccessor(memberName, componentClass) { return this.__accessors.get(componentClass).get(memberName); } /** * take one accessor for the member field. */ static takeAccessor(bufferUse, memberName, componentClass, compositionType, componentType, count) { if (!this.__accessors.has(componentClass)) { this.__accessors.set(componentClass, new Map()); } const accessors = this.__accessors.get(componentClass); if (!accessors.has(memberName)) { const bytes = compositionType.getNumberOfComponents() * componentType.getSizeInBytes(); const buffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_0__.MemoryManager.getInstance().createOrGetBuffer(bufferUse); const bufferViewResult = buffer.takeBufferView({ byteLengthToNeed: bytes * count, byteStride: 0, }); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_5__.isErr)(bufferViewResult)) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_5__.Err({ message: 'Failed to take buffer view: ' + bufferViewResult.getRnError().message, error: undefined, }); } const accessorResult = bufferViewResult.get().takeAccessor({ compositionType, componentType, count: count, byteStride: bytes, }); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_5__.isErr)(accessorResult)) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_5__.Err({ message: 'Failed to take accessor: ' + accessorResult.getRnError().message, error: undefined, }); } accessors.set(memberName, accessorResult.get()); return accessorResult; } else { return new _misc_Result__WEBPACK_IMPORTED_MODULE_5__.Err({ message: 'Already taken', error: undefined, }); } } static getByteOffsetOfThisComponentTypeInBuffer(bufferUse, componentClass) { return this.__bufferViews.get(componentClass).get(bufferUse).byteOffsetInBuffer; } static getByteOffsetOfFirstOfThisMemberInBuffer(memberName, componentClass) { return this.__accessors.get(componentClass).get(memberName).byteOffsetInBuffer; } static getByteOffsetOfFirstOfThisMemberInBufferView(memberName, componentClass) { return this.__accessors.get(componentClass).get(memberName).byteOffsetInBufferView; } /** * Register a member field of component class for memory allocation. * @param bufferUse purpose type of buffer use * @param memberName the name of member field * @param dataClassType a class of data * @param componentType a type of number * @param initValues a initial value */ registerMember(bufferUse, memberName, dataClassType, componentType, initValues) { if (!Component.__memberInfo.has(this.constructor)) { Component.__memberInfo.set(this.constructor, []); } const memberInfoArray = Component.__memberInfo.get(this.constructor); memberInfoArray.push({ bufferUse: bufferUse, memberName: memberName, dataClassType: dataClassType, compositionType: dataClassType.compositionType, componentType: componentType, initValues: initValues, }); } /** * Allocate memory of self member fields * @param count a number of entities to need allocate */ submitToAllocation(count, isReUse) { if (this._component_sid >= count) { const componentClass = this.constructor; console.error(`%c${componentClass.name}: The number of components is over the limit. This may lead to incorrect processing results. Please consider to increase the limit. You can set the limit on Rn.Config.xxxxxx.`, 'color: red; background: yellow; font-size: 2em;'); } const componentClass = this.constructor; const memberInfoArray = Component.__memberInfo.get(componentClass); // Do this only for the first entity of the component if (this._component_sid === 0) { getBufferViewsAndAccessors(this); } const member = Component.__members.get(componentClass); // take a field value allocation for each entity for each member field for (const bufferUse of member.keys()) { const infoArray = member.get(bufferUse); infoArray.forEach((info) => { this.takeOne(info.memberName, info.dataClassType, info.initValues, isReUse, this._component_sid); }); } return; // inner function function getBufferViewsAndAccessors(that) { if (!Component.__members.has(componentClass)) { Component.__members.set(componentClass, new Map()); } const member = Component.__members.get(componentClass); memberInfoArray.forEach((info) => { member.set(info.bufferUse, []); }); memberInfoArray.forEach((info) => { member.get(info.bufferUse).push(info); }); // for each member field, take a BufferView for all entities' the member field. for (const bufferUse of member.keys()) { const infoArray = member.get(bufferUse); if (!Component.__byteLengthSumOfMembers.has(componentClass)) { Component.__byteLengthSumOfMembers.set(componentClass, new Map()); } const byteLengthSumOfMembers = Component.__byteLengthSumOfMembers.get(componentClass); if (!byteLengthSumOfMembers.has(bufferUse)) { byteLengthSumOfMembers.set(bufferUse, 0); } infoArray.forEach((info) => { byteLengthSumOfMembers.set(bufferUse, byteLengthSumOfMembers.get(bufferUse) + info.compositionType.getNumberOfComponents() * info.componentType.getSizeInBytes()); }); if (infoArray.length > 0) { // const bufferView = Component.takeBufferView( // bufferUse, // componentClass, // byteLengthSumOfMembers.get(bufferUse)!, // count // ); // that.__byteOffsetOfThisComponent = bufferView!.byteOffsetInBuffer; } } // take a Accessor for all entities for each member fields (same as BufferView) for (const bufferUse of member.keys()) { const infoArray = member.get(bufferUse); infoArray.forEach((info) => { const accessorResult = Component.takeAccessor(info.bufferUse, info.memberName, componentClass, info.compositionType, info.componentType, count); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_5__.isErr)(accessorResult)) { throw new _misc__WEBPACK_IMPORTED_MODULE_6__.RnException(accessorResult.getRnError()); } that['_byteOffsetOfAccessorInBuffer_' + info.memberName] = accessorResult.get().byteOffsetInBuffer; that['_byteOffsetOfAccessorInComponent_' + info.memberName] = accessorResult.get().byteOffsetInBufferView; }); } } } /** * get the entity which has this component. * @returns the entity which has this component */ get entity() { return this.__entityRepository.getEntity(this.__entityUid); } /** * get the bytes Information of the member * @param component a instance of the component * @param memberName the member of component in string * @returns bytes information */ static getDataByteInfoInner(component, memberName) { const data = component['_' + memberName]; const typedArray = data._v; const byteOffsetInBuffer = typedArray.byteOffset; const byteLength = typedArray.byteLength; const componentNumber = typedArray.length; const locationOffsetInBuffer = byteOffsetInBuffer / 4 / 4; // 4byte is the size of Float32Array, and texel fetch is 4 components unit. const byteOffsetInThisComponent = this['_byteOffsetOfAccessorInComponent_' + memberName] + component.componentSID * componentNumber * 4; const locationOffsetInThisComponent = this['_byteOffsetOfAccessorInComponent_' + memberName] + component.componentSID * componentNumber; const thisComponentByteOffsetInBuffer = component.__byteOffsetOfThisComponent; const thisComponentLocationOffsetInBuffer = component.__byteOffsetOfThisComponent / 4 / 4; return { byteLength, byteOffsetInBuffer, byteOffsetInThisComponent, locationOffsetInBuffer, locationOffsetInThisComponent, thisComponentByteOffsetInBuffer, thisComponentLocationOffsetInBuffer, componentNumber, }; } /** * get the bytes Information of the member * @param memberName the member of component in string * @returns bytes information */ getDataByteInfo(memberName) { return Component.getDataByteInfoInner(this, memberName); } /** * get the bytes Information of the member (static version) by ComponentSID * @param componentType the Component type * @param componentSID the ComponentSID of the component * @param memberName the member of component in string * @returns bytes information */ static getDataByteInfoByComponentSID(componentType, componentSID, memberName) { const component = _ComponentRepository__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository.getComponent(componentType, componentSID); if (component) { return Component.getDataByteInfoInner(component, memberName); } return void 0; } /** * get the bytes Information of the member (static version) by EntityUID * @param componentType the component type * @param entityUID the EntityUID * @param memberName the member of component in string * @returns bytes information */ // static getDataByteInfoByEntityUID( // componentType: typeof Component, // entityUID: EntityUID, // memberName: string // ) { // const component = EntityRepository.getComponentOfEntity(entityUID, componentType); // if (component) { // return Component.getDataByteInfoInner(component, memberName); // } // return void 0; // } /** * get the Pixel Location Offset in the Buffer of the Member * @param componentType the component type (e.g. TransformComponent ) * @param memberName the member name in string * @returns the pixel offsets */ static getLocationOffsetOfMemberOfComponent(componentType, memberName) { const component = _ComponentRepository__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository.getComponent(componentType, 0); return component['_byteOffsetOfAccessorInBuffer_' + memberName] / 4 / 4; } /** * @virtual * Add this component to the entity * @param base the target entity * @param _componentClass the component class to add */ addThisComponentToEntity(base, _componentClass) { // can not be called. this is a virtual method. throw 'Invalid Calling'; } // $create() { // // Define process dependencies with other components. // // If circular dependencies are detected, the error will be reported. // // this.registerDependency(TransformComponent); // } // $load() {} // $mount() {} // $logic() {} // $prerender(instanceIDBufferUid: CGAPIResourceHandle) {} // $render() {} // $unmount() {} // $discard() {} /// /// convenient methods but not used yet /// /** * Get the CompositionType of the member * @param memberName - the member name * @param componentClass - the component class * @returns CompositionType or undefined */ static getCompositionTypeOfMember(memberName, componentClass) { const memberInfoArray = this.__memberInfo.get(componentClass); const info = memberInfoArray.find((info) => { return info.memberName === memberName; }); if (info != null) { return info.compositionType; } else { return undefined; } } /** * Get the ComponentType of the member * @param memberName - the member name * @param componentClass - the component class * @returns ComponentType or undefined */ static getComponentTypeOfMember(memberName, componentClass) { const memberInfoArray = this.__memberInfo.get(componentClass); const info = memberInfoArray.find((info) => { return info.memberName === memberName; }); if (info != null) { return info.componentType; } else { return undefined; } } /** * @internal * Mark the component as destroyed */ _destroy() { this._isAlive = false; } _shallowCopyFrom(component) { // new Error('Not Implemented'); } } Component.__bufferViews = new Map(); Component.__accessors = new Map(); Component.__byteLengthSumOfMembers = new Map(); Component.__memberInfo = new Map(); Component.__members = new Map(); Component._processStages = [ // ProcessStage.Create, _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_1__.ProcessStage.Load, // ProcessStage.Mount, _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_1__.ProcessStage.Logic, _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_1__.ProcessStage.Render, // ProcessStage.Unmount, // ProcessStage.Discard ]; /***/ }), /***/ "./src/foundation/core/ComponentRepository.ts": /*!****************************************************!*\ !*** ./src/foundation/core/ComponentRepository.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ComponentRepository: () => (/* binding */ ComponentRepository) /* harmony export */ }); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /** * The class that generates and manages all kinds of components. */ class ComponentRepository { constructor() { } /** * Registers the class object of the component. * @param componentClass A class object of the component. */ static registerComponentClass(componentClass) { const thisClass = ComponentRepository; thisClass.__componentClasses.set(componentClass.componentTID, componentClass); } /** * deregister the component. * @param componentTID A componentTID */ static deregisterComponentClass(componentTID) { const thisClass = ComponentRepository; thisClass.__componentClasses.delete(componentTID); } /** * Gets the class object of the component corresponding to specified ComponentTID. * @param componentTid The componentTID to get the class object. */ static getComponentClass(componentTid) { return this.__componentClasses.get(componentTid); } /** * Creates an instance of the component for the entity. * @param componentTid The componentTID to create the instance. * @param entityUid The entityUID of the entity. * @param entityRepository the reference of the entityRepository. */ static createComponent(componentTid, entityUid, entityRepository) { const thisClass = ComponentRepository; const componentClass = thisClass.__componentClasses.get(componentTid); if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(componentClass)) { // Update __component_sid_count_map let component_sid_count = this.__component_sid_count_map.get(componentTid); if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.not.exist(component_sid_count)) { this.__component_sid_count_map.set(componentTid, 0); component_sid_count = ComponentRepository.invalidComponentSID; } // check __components array whether it has undefined element const componentArray = this.__components.get(componentTid); let undefinedSid = -1; if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(componentArray)) { for (let i = 0; i < componentArray.length; i++) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.not.exist(componentArray[i])) { undefinedSid = i; break; } } } let componentSid = -1; let isReUse = false; if (undefinedSid === -1) { // if there is no undefined element, issue a new component_sid this.__component_sid_count_map.set(componentTid, ++component_sid_count); componentSid = component_sid_count; } else { // if there is undefined element, reuse the component_sid componentSid = undefinedSid; isReUse = true; } // create the component const component = new componentClass(entityUid, componentSid, entityRepository, isReUse); // register the component if (!this.__components.has(componentTid)) { this.__components.set(componentTid, []); this.__updateComponentTIDs(); } const array = this.__components.get(componentTid); array[component.componentSID] = component; return component; } else { throw new Error('The Component Class object is invalid.'); } } static deleteComponent(component) { const thisClass = ComponentRepository; const componentTid = component.componentTID; const componentSid = component.componentSID; const array = thisClass.__components.get(componentTid); if (array != null) { delete array[componentSid]; } } /** * Get the instance of the component corresponding to the component class and componentSID. * @param componentClass The class object to get the component. * @param componentSid The componentSID to get the component. */ static getComponent(componentClass, componentSid) { return this.getComponentFromComponentTID(componentClass.componentTID, componentSid); } /** * Get the instance of the component corresponding to the componentTID and componentSID. * @param componentTid The componentTID to get the component. * @param componentSid The componentSID to get the component. */ static getComponentFromComponentTID(componentTid, componentSid) { const map = this.__components.get(componentTid); if (map != null) { const component = map[componentSid]; if (component != null) { return map[componentSid]; } else { return undefined; } } return undefined; } /** * @internal * Gets an array of components corresponding to the class object of the component. * @param componentClass The class object of the component. */ static _getComponents(componentClass) { const components = this.__components.get(componentClass.componentTID); return components; } /** * @internal * Gets an array of components corresponding to the class object of the component (dead components included). * @param componentClass The class object of the component. */ static _getComponentsIncludingDead(componentClass) { const components = this.__components.get(componentClass.componentTID); return components; } static getMemoryBeginIndex(componentTid) { let memoryBeginIndex = 0; for (let i = 0; i < componentTid; i++) { const componentClass = ComponentRepository.__componentClasses.get(i); if (componentClass != null) { const sizeOfComponent = componentClass.sizeOfThisComponent; const maxEntityNumber = _Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxEntityNumber; memoryBeginIndex += sizeOfComponent * maxEntityNumber; } } return memoryBeginIndex; } /** * Gets an array of components corresponding to the class object of the component. * @param componentType The class object of the component. */ static getComponentsWithType(componentType) { const components = this.__components.get(componentType.componentTID); if (components == null) { return []; } return components.filter((component) => component != null); } static __updateComponentTIDs() { const componentTids = Array.from(this.__components.keys()); componentTids.sort((a, b) => a - b); this.__componentTIDs = componentTids; const renderingComponentTids = []; renderingComponentTids.push(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshRendererComponentTID); // MeshRendererComponent is always active if (this.__components.has(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.EffekseerComponentTID)) { renderingComponentTids.push(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.EffekseerComponentTID); } this.__renderingComponentTIDs = renderingComponentTids; } /** * Gets all componentTIDs. */ static getComponentTIDs() { return this.__componentTIDs; } /** * Gets all rendering componentTIDs. */ static getRenderingComponentTIDs() { return this.__renderingComponentTIDs; } } ComponentRepository.__component_sid_count_map = new Map(); ComponentRepository.__components = new Map(); // index of array Is ComponentSID ComponentRepository.__componentClasses = new Map(); ComponentRepository.__componentTIDs = []; ComponentRepository.__renderingComponentTIDs = []; ComponentRepository.invalidComponentSID = -1; /***/ }), /***/ "./src/foundation/core/Config.ts": /*!***************************************!*\ !*** ./src/foundation/core/Config.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Config: () => (/* binding */ Config) /* harmony export */ }); /* harmony import */ var _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/BoneDataType */ "./src/foundation/definitions/BoneDataType.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc */ "./src/foundation/misc/index.ts"); /* eslint-disable prefer-const */ let maxEntityNumber = 5000; let maxLightNumberInShader = 4; let maxVertexMorphNumberInShader = 100; let maxVertexPrimitiveNumberInShader = 20; let maxMaterialInstanceForEachType = 10; let maxSkeletonNumber = 33; let maxCameraNumber = 30; let maxSizeLimitOfNonCompressedTexture = 512; /// ShaderGlobalStorageSize /// let maxSkeletalBoneNumber = 300; let maxSkeletalBoneNumberForUniformMode = 50; // For Uniform Mode let dataTextureWidth = Math.pow(2, 12); let dataTextureHeight = Math.pow(2, 12); let boneDataType = _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_0__.BoneDataType.Mat43x1; let maxMorphTargetNumber = 4; let totalSizeOfGPUShaderDataStorageExceptMorphData = 0; let isUboEnabled = false; let eventTargetDom; let cacheWebGpuRenderBundles = true; // For WebGPU debug, set false to disable cache let cgApiDebugConsoleOutput = false; let multiViewForWebVR = false; if (typeof navigator !== 'undefined') { if (_misc__WEBPACK_IMPORTED_MODULE_1__.MiscUtil.isMobile() || _misc__WEBPACK_IMPORTED_MODULE_1__.MiscUtil.isMobileVr()) { maxVertexMorphNumberInShader = 4; maxSkeletonNumber = 32; dataTextureWidth = 2 ** 9; dataTextureHeight = 2 ** 9; } } const Config = { maxEntityNumber, maxLightNumberInShader, maxVertexMorphNumberInShader, maxVertexPrimitiveNumberInShader, maxMaterialInstanceForEachType, boneDataType, maxSkeletonNumber, maxCameraNumber, maxSizeLimitOfNonCompressedTexture, maxSkeletalBoneNumber, maxSkeletalBoneNumberForUniformMode, dataTextureWidth, dataTextureHeight, maxMorphTargetNumber, totalSizeOfGPUShaderDataStorageExceptMorphData, isUboEnabled, eventTargetDom, cacheWebGpuRenderBundles, cgApiDebugConsoleOutput, multiViewForWebVR, }; /***/ }), /***/ "./src/foundation/core/Entity.ts": /*!***************************************!*\ !*** ./src/foundation/core/Entity.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Entity: () => (/* binding */ Entity) /* harmony export */ }); /* harmony import */ var _RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /** * The class that represents an entity. * * @remarks * The Rhodonite Entity Class which are an entities that exists in space. * Entities can acquire various functions by having components on themselves. */ class Entity extends _RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { /** * The constructor of the Entity class. * * @remarks * When creating an Entity, use the createEntity method of the EntityRepository class * instead of directly calling this constructor. * * @param entityUID - The unique ID of the entity * @param isAlive - Whether this entity alive or not * @param entityComponent - The instance of EntityComponent (Dependency Injection) */ constructor(entityUID, isAlive, components) { super(); this._myLatestCopyEntityUID = Entity.invalidEntityUID; this.___entity_uid = entityUID; this._isAlive = isAlive; this.__components = _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(components) ? components : new Map(); } /** * Get Unique ID of the entity. */ get entityUID() { return this.___entity_uid; } /** * Sets a component to this entity. * @param component The component to set. * * @internal */ _setComponent(componentType, component) { this.__components.set(componentType.componentTID, component); } /** * return whether this entity has the component or not * @param componentType - The component to check * @returns */ hasComponent(componentType) { return this.__components.has(componentType.componentTID); } /** * Get the component of the specified type that the entity has * @param componentType */ getComponent(componentType) { return this.__components.get(componentType.componentTID); } /** * Gets the component corresponding to the ComponentTID. * @param componentTID - The ComponentTID to get the component. */ getComponentByComponentTID(componentTID) { return this.__components.get(componentTID); } /** * @param componentTID * * @internal */ _removeComponent(componentTID) { this.__components.delete(componentTID); } /// /// tryToGet methods /// /** * try to get an Animation Component if the entity has it. * @returns AnimationComponent | undefined */ tryToGetAnimation() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.AnimationComponentTID); } tryToGetAnimationState() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.AnimationStateComponentTID); } tryToGetBlendShape() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.BlendShapeComponentTID); } tryToGetCamera() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraComponentTID); } tryToGetCameraController() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraControllerComponentTID); } tryToGetLight() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.LightComponentTID); } tryToGetMesh() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshComponentTID); } tryToGetMeshRenderer() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.MeshRendererComponentTID); } tryToGetPhysics() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.PhysicsComponentTID); } tryToGetSceneGraph() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SceneGraphComponentTID); } tryToGetSkeletal() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.SkeletalComponentTID); } tryToGetTransform() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.TransformComponentTID); } tryToGetVrm() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.VrmComponentTID); } tryToGetConstraint() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.ConstraintComponentTID); } tryToGetEffekseer() { return this.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.EffekseerComponentTID); } /** * Mark the entity as destroyed */ _destroy() { this.__components.forEach((component) => { component._destroy(); }); this._isAlive = false; } } /** Invalid Entity UID constant value */ Entity.invalidEntityUID = -1; /***/ }), /***/ "./src/foundation/core/EntityRepository.ts": /*!*************************************************!*\ !*** ./src/foundation/core/EntityRepository.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EntityRepository: () => (/* binding */ EntityRepository), /* harmony export */ applyMixins: () => (/* binding */ applyMixins), /* harmony export */ createEntity: () => (/* binding */ createEntity) /* harmony export */ }); /* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Entity */ "./src/foundation/core/Entity.ts"); /* harmony import */ var _ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc */ "./src/foundation/misc/index.ts"); /** * The class that generates and manages entities. */ class EntityRepository { constructor() { } /** * Creates an entity */ static createEntity() { // check dead entity let deadUid = -1; for (let i = 0; i < this.__entities.length; i++) { if (this.__entities[i] == null) { deadUid = i; } } let entityUid = -1; if (deadUid === -1) { // if all entity is alive, issue a new entityUid entityUid = ++this.__entity_uid_count; } else { // if there is a dead entity, reuse the entityUid entityUid = deadUid; } const entity = new _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity(entityUid, true); this.__entities[entityUid] = entity; this.__updateCount++; return entity; } static deleteEntity(entityUid) { var _a; if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.not.exist(this._components[entityUid])) { return; } for (const [componentTid, component] of this._components[entityUid]) { if (componentTid === _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.SceneGraphComponentTID) { const sceneGraph = component; const children = sceneGraph.children.concat(); for (const child of children) { EntityRepository.deleteEntity(child.entity.entityUID); } } _ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.deleteComponent(component); } (_a = this.__entities[entityUid]) === null || _a === void 0 ? void 0 : _a._destroy(); delete this.__entities[entityUid]; delete this._components[entityUid]; this.__updateCount++; } static deleteEntityRecursively(entityUid) { const entity = this.getEntity(entityUid); const entities = []; const sg = entity.tryToGetSceneGraph(); if (sg != null) { entities.push(sg.entity); addChild(sg); } function addChild(sg) { const children = sg.children; for (let i = 0; i < children.length; i++) { const child = children[i]; entities.push(child.entity); addChild(child); } } for (const entity of entities) { EntityRepository.deleteEntity(entity.entityUID); } } static shallowCopyEntity(entity) { const newEntity = EntityRepository._shallowCopyEntityInner(entity); this.__setJoints(entity); this.__handleTagData(newEntity); return newEntity; } static __setJoints(entity) { const newEntity = EntityRepository.getEntity(entity._myLatestCopyEntityUID); const skeletalComponentOfNew = newEntity.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.SkeletalComponentTID); const skeletalComponentOfOriginal = entity.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.SkeletalComponentTID); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(skeletalComponentOfNew) && _misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(skeletalComponentOfOriginal)) { const jointsOriginal = skeletalComponentOfOriginal.getJoints(); const jointsNew = jointsOriginal.map((joint) => { return EntityRepository.getEntity(joint.entity._myLatestCopyEntityUID).tryToGetSceneGraph(); }); skeletalComponentOfNew.setJoints(jointsNew); } const sceneGraph = entity.tryToGetSceneGraph(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(sceneGraph)) { sceneGraph.children.forEach((child) => { EntityRepository.__setJoints(child.entity); }); } } static _shallowCopyEntityInner(entity) { const newEntity = this.createEntity(); newEntity._tags = Object.assign({}, entity._tags); entity._myLatestCopyEntityUID = newEntity.entityUID; for (let i = 1; i <= _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_4__.WellKnownComponentTIDs.maxWellKnownTidNumber; i++) { const component = entity.getComponentByComponentTID(i); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(component)) { this.tryToAddComponentToEntityByTID(i, newEntity); const componentOfNewEntity = newEntity.getComponentByComponentTID(i); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(componentOfNewEntity)) { componentOfNewEntity._shallowCopyFrom(component); } } } return newEntity; } static __handleTagData(newEntity) { const tags = newEntity._tags; if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(tags)) { const tagKeys = Object.keys(tags); for (const tagKey of tagKeys) { if (tagKey === 'rnEntities') { const entities = newEntity.getTagValue('rnEntities'); const newEntities = entities.map((entity) => { return EntityRepository.getEntity(entity._myLatestCopyEntityUID); }); newEntity.tryToSetTag({ tag: 'rnEntities', value: newEntities, }); } if (tagKey === 'rnEntitiesByNames') { const map = newEntity.getTagValue('rnEntitiesByNames'); for (const name of Object.keys(map)) { const entity = map.get(name); map.set(name, EntityRepository.getEntity(entity._myLatestCopyEntityUID)); } newEntity.tryToSetTag({ tag: 'rnEntitiesByNames', value: map, }); } } } const sceneGraph = newEntity.tryToGetSceneGraph(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(sceneGraph)) { sceneGraph.children.forEach((child) => { EntityRepository.__handleTagData(child.entity); }); } } /** * Try to add a component to the entity by componentTID. * @param componentTID - the componentTID * @param entity - the entity * @returns the entity added a component */ static tryToAddComponentToEntityByTID(componentTID, entity) { const componentClass = _ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentClass(componentTID); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.not.exist(componentClass)) { return entity; } return this.addComponentToEntity(componentClass, entity); } /** * Add a Component to the entity * @param componentClass - a ComponentClass to add * @param entity - the entity * @returns the entity added a component */ static addComponentToEntity(componentClass, entity) { if (entity.hasComponent(componentClass)) { _misc__WEBPACK_IMPORTED_MODULE_5__.Logger.info('This entity already has the Component.'); return entity; } // Create Component const component = _ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.createComponent(componentClass.componentTID, entity.entityUID, this); // set this component to this._components' map const map = (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_2__.valueWithCompensation)({ value: this._components[entity.entityUID], compensation: () => { const map = new Map(); this._components[entity.entityUID] = map; return map; }, }); map.set(componentClass.componentTID, component); // add this component to the entity const entityClass = component.addThisComponentToEntity(entity, componentClass); entity._setComponent(componentClass, component); this.__updateCount++; return entity; } /** * Remove components from the entity. * Note: the returned entity's type will be IEntity (most basic type). * You have to cast it to appropriate type later. * @param componentClass The class object of the component to remove. * @param entityUid The entityUID of the entity. */ static removeComponentFromEntity(componentClass, entity) { let map = this._components[entity.entityUID]; if (map == null) { map = new Map(); this._components[entity.entityUID] = map; } const component = map.get(componentClass.componentTID); if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(component)) { component._destroy(); map.delete(componentClass.componentTID); entity._removeComponent(componentClass.componentTID); } this.__updateCount++; return entity; } /** * Gets the entity corresponding to the entityUID. * @param entityUid The entityUID of the entity. */ static getEntity(entityUid) { return this.__entities[entityUid]; } /** * Gets the entity corresponding to the entityUID. * @param entityUid The entityUID of the entity. */ getEntity(entityUid) { return EntityRepository.__entities[entityUid]; } /** * Gets the specified component from the entity. * @param entityUid The entity to get the component from. * @param componentType The class object of the component to get. */ static getComponentOfEntity(entityUid, componentType) { const entity = this._components[entityUid]; let component = null; if (entity != null) { component = entity.get(componentType.componentTID); if (component != null) { return component; } else { return null; } } return component; } /** * Search entities by the given tags. * @param tags The tags to search */ static searchByTags(tags) { const matchEntities = []; for (const entity of this.__entities) { if (entity === null || entity === void 0 ? void 0 : entity.matchTags(tags)) { matchEntities.push(entity); } } return matchEntities; } /** * Gets entity by the unique name. * @param uniqueName The unique name of the entity. */ static getEntityByUniqueName(uniqueName) { for (const entity of this.__entities) { if (entity != null && entity.uniqueName === uniqueName) { return entity; } } return void 0; } /** * @internal * Gets all entities. */ static _getEntities() { return this.__entities.filter((entity) => entity != null && entity._isAlive); } /** * Gets the number of all entities. */ static getEntitiesNumber() { const entities = this.__entities.filter((entity) => entity != null && entity._isAlive); return entities.length; } static get updateCount() { return this.__updateCount; } } EntityRepository.__entity_uid_count = _Entity__WEBPACK_IMPORTED_MODULE_0__.Entity.invalidEntityUID; EntityRepository.__entities = []; EntityRepository._components = []; // index is EntityUID EntityRepository.__updateCount = 0; // This can live anywhere in your codebase: function applyMixins(derivedCtor, baseCtor) { Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => { Object.defineProperty(derivedCtor, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null)); }); } function createEntity() { return EntityRepository.createEntity(); } /***/ }), /***/ "./src/foundation/core/GlobalDataRepository.ts": /*!*****************************************************!*\ !*** ./src/foundation/core/GlobalDataRepository.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GlobalDataRepository: () => (/* binding */ GlobalDataRepository) /* harmony export */ }); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _MemoryManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/MathClassUtil */ "./src/foundation/math/MathClassUtil.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _Config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../definitions/BoneDataType */ "./src/foundation/definitions/BoneDataType.ts"); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _definitions_ShaderSemanticsInfo__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../definitions/ShaderSemanticsInfo */ "./src/foundation/definitions/ShaderSemanticsInfo.ts"); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../math */ "./src/foundation/math/index.ts"); /** * The class which manages global data. */ class GlobalDataRepository { constructor() { this.__fields = new Map(); } /** * Initialize the GlobalDataRepository * @param approach - ProcessApproachEnum for initialization */ initialize(approach) { // CurrentComponentSIDs const currentComponentSIDsInfo = { semantic: 'currentComponentSIDs', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.ScalarArray, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, arrayLength: _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_13__.WellKnownComponentTIDs.maxWellKnownTidNumber, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, needUniformInDataTextureMode: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_13__.WellKnownComponentTIDs.maxWellKnownTidNumber)), }; this.__registerProperty(currentComponentSIDsInfo, 1); this.takeOne('currentComponentSIDs'); // Camera const viewMatrixInfo = { semantic: 'viewMatrix', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_12__.MutableMatrix44.identity(), }; const projectionMatrixInfo = { semantic: 'projectionMatrix', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_12__.MutableMatrix44.identity(), }; const viewPositionInfo = { semantic: 'viewPosition', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray([0, 0, 1]), }; this.__registerProperty(viewMatrixInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxCameraNumber); this.__registerProperty(projectionMatrixInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxCameraNumber); this.__registerProperty(viewPositionInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxCameraNumber); const maxSkeletalBoneNumber = _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_15__.ProcessApproach.isUniformApproach(approach) ? _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletalBoneNumberForUniformMode : _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletalBoneNumber; // Skinning const boneMatrixInfo = { semantic: 'boneMatrix', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4x3Array, arrayLength: maxSkeletalBoneNumber, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(0)), }; const boneQuaternionInfo = { semantic: 'boneQuaternion', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4Array, arrayLength: maxSkeletalBoneNumber, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(0)), }; const boneTranslateScaleInfo = { semantic: 'boneTranslateScale', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4Array, arrayLength: maxSkeletalBoneNumber, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, soloDatum: true, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(0)), }; const boneTranslatePackedQuatInfo = { semantic: 'boneTranslatePackedQuat', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4Array, arrayLength: maxSkeletalBoneNumber, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(0)), }; const boneScalePackedQuatInfo = { semantic: 'boneScalePackedQuat', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4Array, arrayLength: maxSkeletalBoneNumber, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, soloDatum: true, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(0)), }; const boneCompressedChunkInfo = { semantic: 'boneCompressedChunk', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4Array, arrayLength: maxSkeletalBoneNumber, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, soloDatum: true, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(0)), }; const boneCompressedInfoInfo = { semantic: 'boneCompressedInfo', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, soloDatum: true, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_10__.Vector4.zero(), }; const skeletalComponentSIDInfo = { semantic: 'skinningMode', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: 0, max: 1, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_9__.Scalar.fromCopyNumber(-1), }; if (_Config__WEBPACK_IMPORTED_MODULE_8__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_14__.BoneDataType.Mat43x1) { this.__registerProperty(boneMatrixInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); } else if (_Config__WEBPACK_IMPORTED_MODULE_8__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_14__.BoneDataType.Vec4x2) { this.__registerProperty(boneTranslatePackedQuatInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); this.__registerProperty(boneScalePackedQuatInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); } else if (_Config__WEBPACK_IMPORTED_MODULE_8__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_14__.BoneDataType.Vec4x2Old) { this.__registerProperty(boneQuaternionInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); this.__registerProperty(boneTranslateScaleInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); } else if (_Config__WEBPACK_IMPORTED_MODULE_8__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_14__.BoneDataType.Vec4x1) { this.__registerProperty(boneTranslateScaleInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); this.__registerProperty(boneCompressedChunkInfo, _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxSkeletonNumber); this.__registerProperty(boneCompressedInfoInfo, 1); this.takeOne('boneCompressedInfo'); } this.__registerProperty(skeletalComponentSIDInfo, 1); this.takeOne('skinningMode'); // Lighting const lightPositionInfo = { semantic: 'lightPosition', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3Array, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, arrayLength: _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(_Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader)), }; const lightDirectionInfo = { semantic: 'lightDirection', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3Array, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, arrayLength: _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader, min: -1, max: 1, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(_Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader)), }; const lightIntensityInfo = { semantic: 'lightIntensity', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3Array, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, arrayLength: _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader, min: 0, max: 10, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(_Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader)), }; const lightPropertyInfo = { semantic: 'lightProperty', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4Array, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, arrayLength: _Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader, min: 0, max: 10, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(_Config__WEBPACK_IMPORTED_MODULE_8__.Config.maxLightNumberInShader)), }; this.__registerProperty(lightPositionInfo, 1); this.__registerProperty(lightDirectionInfo, 1); this.__registerProperty(lightIntensityInfo, 1); this.__registerProperty(lightPropertyInfo, 1); this.takeOne('lightDirection'); this.takeOne('lightIntensity'); this.takeOne('lightPosition'); this.takeOne('lightProperty'); const lightNumberInfo = { semantic: 'lightNumber', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: 0, max: Number.MAX_SAFE_INTEGER, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_9__.Scalar.fromCopyNumber(0), }; this.__registerProperty(lightNumberInfo, 1); this.takeOne('lightNumber'); // BackBufferTextureSize const backBufferTextureSize = { semantic: 'backBufferTextureSize', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, min: 0, max: Number.MAX_SAFE_INTEGER, isInternalSetting: true, needUniformInDataTextureMode: true, initialValue: _math__WEBPACK_IMPORTED_MODULE_17__.Vector2.fromCopy2(0, 0), }; this.__registerProperty(backBufferTextureSize, 1); this.takeOne('backBufferTextureSize'); // VrState const vrState = { semantic: 'vrState', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, min: 0, max: Number.MAX_SAFE_INTEGER, isInternalSetting: true, needUniformInDataTextureMode: true, initialValue: _math__WEBPACK_IMPORTED_MODULE_17__.Vector2.fromCopy2(0, 0), // x: 0: not vr, 1: vr // y: 0: left eye, 1: right eye }; this.__registerProperty(vrState, 1); this.takeOne('vrState'); // Time const timeInfo = { semantic: 'time', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader, min: 0, max: Number.MAX_SAFE_INTEGER, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_9__.Scalar.fromCopyNumber(0), }; this.__registerProperty(timeInfo, 1); this.takeOne('time'); } static getInstance() { if (!this.__instance) { this.__instance = new GlobalDataRepository(); } return this.__instance; } __registerProperty(semanticInfo, maxCount) { const buffer = _MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_0__.BufferUse.GPUInstanceData); const alignedByteLength = (0,_definitions_ShaderSemanticsInfo__WEBPACK_IMPORTED_MODULE_16__.calcAlignedByteLength)(semanticInfo); const bufferView = buffer .takeBufferView({ byteLengthToNeed: alignedByteLength * maxCount, byteStride: 0, }) .unwrapForce(); let maxArrayLength = semanticInfo.arrayLength; if (_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.isArray(semanticInfo.compositionType) && maxArrayLength == null) { maxArrayLength = 100; } const accessor = bufferView .takeAccessor({ compositionType: semanticInfo.compositionType, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, count: maxCount, byteStride: alignedByteLength, arrayLength: maxArrayLength, }) .unwrapForce(); const globalPropertyStruct = { shaderSemanticsInfo: semanticInfo, values: [], maxCount: maxCount, accessor: accessor, }; this.__fields.set(semanticInfo.semantic, globalPropertyStruct); } takeOne(shaderSemantic) { const globalPropertyStruct = this.__fields.get(shaderSemantic); if (globalPropertyStruct) { const semanticInfo = globalPropertyStruct.shaderSemanticsInfo; const typedArray = globalPropertyStruct.accessor.takeOne(); const countIndex = globalPropertyStruct.values.length; const valueObj = _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_4__.MathClassUtil.initWithFloat32Array(semanticInfo.initialValue, semanticInfo.initialValue, typedArray, semanticInfo.compositionType); globalPropertyStruct.values[countIndex] = valueObj; return valueObj; } return void 0; } setValue(shaderSemantic, countIndex, value) { const globalPropertyStruct = this.__fields.get(shaderSemantic); if (globalPropertyStruct) { const valueObj = globalPropertyStruct.values[countIndex]; _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_4__.MathClassUtil._setForce(valueObj, value); } } getValue(shaderSemantic, countIndex) { const globalPropertyStruct = this.__fields.get(shaderSemantic); if (globalPropertyStruct) { const valueObj = globalPropertyStruct.values[countIndex]; return valueObj; } return void 0; } getGlobalPropertyStruct(propertyName) { return this.__fields.get(propertyName); } getGlobalProperties() { return Array.from(this.__fields.values()); } _setUniformLocationsForUniformModeOnly(shaderProgramUid) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.getWebGLResourceRepository(); const semanticsInfoArray = []; this.__fields.forEach((globalPropertyStruct, key) => { const semanticInfo = globalPropertyStruct.shaderSemanticsInfo; semanticsInfoArray.push(semanticInfo); }); webglResourceRepository.setupUniformLocations(shaderProgramUid, semanticsInfoArray, true); } _setUniformLocationsForDataTextureModeOnly(shaderProgramUid) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.getWebGLResourceRepository(); const semanticsInfoArray = []; this.__fields.forEach((globalPropertyStruct, key) => { const semanticInfo = globalPropertyStruct.shaderSemanticsInfo; if (semanticInfo.needUniformInDataTextureMode) { semanticsInfoArray.push(semanticInfo); } }); webglResourceRepository.setupUniformLocations(shaderProgramUid, semanticsInfoArray, true); } setUniformValues(shaderProgram) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.getWebGLResourceRepository(); this.__fields.forEach((globalPropertyStruct, key) => { const info = globalPropertyStruct.shaderSemanticsInfo; const values = globalPropertyStruct.values; for (let i = 0; i < values.length; i++) { webglResourceRepository.setUniformValue(shaderProgram, info.semantic, true, values[i]); } }); } // getLocationOffsetOfProperty(propertyIndex: Index, countIndex: Index) { // const globalPropertyStruct = this.__fields.get(propertyIndex); // if (globalPropertyStruct) { // const value = globalPropertyStruct.values[countIndex]; // return (value._v as Float32Array).byteOffset / 4 / 4; // } // return void 0; // } getLocationOffsetOfProperty(propertyName) { const globalPropertyStruct = this.__fields.get(propertyName); if (globalPropertyStruct) { return globalPropertyStruct.accessor.byteOffsetInBuffer / 4 / 4; } return -1; } getCurrentDataNumberOfTheProperty(propertyName) { const globalPropertyStruct = this.__fields.get(propertyName); if (globalPropertyStruct) { return globalPropertyStruct.values.length; } return 0; } _addPropertiesStr(vertexPropertiesStr, pixelPropertiesStr, propertySetter, isWebGL2) { this.__fields.forEach((globalPropertyStruct) => { const info = globalPropertyStruct.shaderSemanticsInfo; if (info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexShader || info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader) { vertexPropertiesStr += propertySetter('', info, true, isWebGL2); } if (info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader || info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.VertexAndPixelShader) { pixelPropertiesStr += propertySetter('', info, true, isWebGL2); } }); return [vertexPropertiesStr, pixelPropertiesStr]; } } /***/ }), /***/ "./src/foundation/core/MemoryManager.ts": /*!**********************************************!*\ !*** ./src/foundation/core/MemoryManager.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MemoryManager: () => (/* binding */ MemoryManager) /* harmony export */ }); /* harmony import */ var _memory_Buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../memory/Buffer */ "./src/foundation/memory/Buffer.ts"); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _Config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /** * Usage * const mm = MemoryManager.getInstance(); * this.translate = new Vector3( * mm.assignMem(componentUID, propertyId, entityUID, isRendered) * ); */ class MemoryManager { constructor(cpuGeneric, gpuInstanceData, gpuVertexData) { //__entityMaxCount: number; this.__buffers = {}; this.__buffersOnDemand = new Map(); this.__memorySizeRatios = {}; this.__memorySizeRatios[_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.CPUGeneric.str] = cpuGeneric; this.__memorySizeRatios[_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.GPUInstanceData.str] = gpuInstanceData; this.__memorySizeRatios[_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.GPUVertexData.str] = gpuVertexData; } static createInstanceIfNotCreated({ cpuGeneric, gpuInstanceData, gpuVertexData, }) { if (!this.__instance) { this.__instance = new MemoryManager(cpuGeneric, gpuInstanceData, gpuVertexData); return this.__instance; } return this.__instance; } __makeMultipleOf4byteSize(memorySize) { return memorySize + (memorySize % 4 === 0 ? 0 : 4 - (memorySize % 4)); } static getInstance() { return this.__instance; } getMemorySize() { return (MemoryManager.bufferWidthLength * MemoryManager.bufferHeightLength /*width*height*/ * 4 /*rgba*/ * 4 /*byte*/); } __createBuffer(bufferUse) { const memorySize = this.getMemorySize() * this.__memorySizeRatios[bufferUse.str]; const arrayBuffer = new ArrayBuffer(this.__makeMultipleOf4byteSize(memorySize)); let byteAlign = 4; if (bufferUse === _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.GPUInstanceData || bufferUse === _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.GPUVertexData) { byteAlign = 16; } const buffer = new _memory_Buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer({ byteLength: arrayBuffer.byteLength, buffer: arrayBuffer, name: bufferUse.str, byteAlign: byteAlign, }); this.__buffers[buffer.name] = buffer; return buffer; } getBuffer(bufferUse) { const buffer = this.__buffers[bufferUse.toString()]; return buffer; } createOrGetBuffer(bufferUse) { let buffer = this.__buffers[bufferUse.toString()]; if (buffer == null) { buffer = this.__createBuffer(bufferUse); } return buffer; } createBufferOnDemand(size, object, byteAlign) { const arrayBuffer = new ArrayBuffer(size); const buffer = new _memory_Buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer({ byteLength: arrayBuffer.byteLength, buffer: arrayBuffer, name: _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.UBOGeneric.toString(), byteAlign: byteAlign, }); this.__buffersOnDemand.set(object.objectUID, buffer); return buffer; } getBufferOnDemand(object) { return this.__buffersOnDemand.get(object.objectUID); } static get bufferWidthLength() { return _Config__WEBPACK_IMPORTED_MODULE_2__.Config.dataTextureWidth; } static get bufferHeightLength() { return _Config__WEBPACK_IMPORTED_MODULE_2__.Config.dataTextureHeight; } printMemoryUsage() { const cpuGeneric = this.__buffers[_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.CPUGeneric.toString()]; const gpuInstanceData = this.__buffers[_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.GPUInstanceData.toString()]; const gpuVertexData = this.__buffers[_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_1__.BufferUse.GPUVertexData.toString()]; // const uboGeneric = this.__buffers[BufferUse.UBOGeneric.toString()]; console.log('Memory Usage in Memory Manager:'); console.log(`CPUGeneric: ${cpuGeneric.takenSizeInByte} byte of ${cpuGeneric.byteLength} bytes. (${(cpuGeneric.takenSizeInByte / cpuGeneric.byteLength) * 100} %) `); console.log(`GPUInstanceData: ${gpuInstanceData.takenSizeInByte} byte of ${gpuInstanceData.byteLength} bytes. (${(gpuInstanceData.takenSizeInByte / gpuInstanceData.byteLength) * 100} %) `); if (gpuVertexData != null) { console.log(`GPUVertexData: ${gpuVertexData.takenSizeInByte} byte of ${gpuVertexData.byteLength} bytes. (${(gpuVertexData.takenSizeInByte / gpuVertexData.byteLength) * 100} %) `); } // console.log(`UBOGeneric: ${uboGeneric.takenSizeInByte} byte of ${uboGeneric.byteLength} bytes. (${uboGeneric.takenSizeInByte / uboGeneric.byteLength * 100} %) `); } dumpBuffer(bufferUse) { const buffer = this.__buffers[bufferUse.toString()]; _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_3__.MiscUtil.downloadArrayBuffer(bufferUse.toString(), buffer.getArrayBuffer()); return buffer; } } /***/ }), /***/ "./src/foundation/core/RnObject.ts": /*!*****************************************!*\ !*** ./src/foundation/core/RnObject.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RnObject: () => (/* binding */ RnObject) /* harmony export */ }); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /** * The root class of the objects in Rhodonite */ class RnObject { constructor() { /// members this.__objectUid = RnObject.currentMaxObjectCount++; this._tags = {}; // Tag string allows alphabet, digit and underscore (_) only this.__combinedTagString = ''; // Tag string allows alphabet, digit and underscore (_) only this.__uniqueName = `${this.constructor.name}__uid_${this.__objectUid}`; this.__updateInfo(this.__uniqueName); } __updateInfo(uniqueName) { RnObject.__uniqueNames[this.__objectUid] = uniqueName; RnObject.__objects[this.__objectUid] = new WeakRef(this); RnObject.__objectsByNameMap.set(this.__uniqueName, new WeakRef(this)); } unregister() { delete RnObject.__objects[this.__objectUid]; delete RnObject.__uniqueNames[this.__objectUid]; RnObject.__objectsByNameMap.delete(this.__uniqueName); } static searchByTag(tag, value) { var _a; for (const obj of RnObject.__objects) { if (((_a = obj.deref()) === null || _a === void 0 ? void 0 : _a.getTagValue(tag)) === value) { return obj; } } return undefined; } /** * Gets the objectUID of the object. */ get objectUID() { return this.__objectUid; } /** * Gets the object by corresponding to the objectUID. * @param objectUid The objectUID of the object. */ static getRnObject(objectUid) { var _a; return (_a = RnObject.__objects[objectUid]) === null || _a === void 0 ? void 0 : _a.deref(); } /** * Gets the object by the unique name. * @param uniqueName The unique name of the object. */ static getRnObjectByName(uniqueName) { var _a; return (_a = RnObject.__objectsByNameMap.get(uniqueName)) === null || _a === void 0 ? void 0 : _a.deref(); } /** * Try to set a unique name of the entity. * @param name * @param toAddNameIfConflict If true, force to add name string to the current unique name string. If false, give up to change name. */ tryToSetUniqueName(name, toAddNameIfConflict) { if (RnObject.__uniqueNames.indexOf(name) !== -1) { // Conflict if (toAddNameIfConflict) { const newName = name + '_(' + this.__objectUid + ')'; if (RnObject.__uniqueNames.indexOf(newName) === -1) { RnObject.__objectsByNameMap.delete(this.__uniqueName); this.__uniqueName = newName; RnObject.__uniqueNames[this.__objectUid] = this.__uniqueName; RnObject.__objectsByNameMap.set(this.__uniqueName, new WeakRef(this)); return true; } } return false; } else { this.__uniqueName = name; RnObject.__uniqueNames[this.__objectUid] = this.__uniqueName; RnObject.__objectsByNameMap.set(this.__uniqueName, new WeakRef(this)); return true; } } /** * Validate the string of tags. * @param val The string to be validated */ validateTagString(val) { const reg = new RegExp(/[!"#$%&'()\*\+\-\s\.,\/:;<=>?@\[\\\]^`{|}~]/g); if (reg.test(val)) { return false; } return true; } /** * Tries to set tag (name and value). * @param tagName The tag name. * @param tagValue Tha value of the tag. */ tryToSetTag(tag) { if (this.validateTagString(tag.tag)) { if (this.hasTag(tag.tag)) { this.removeTag(tag.tag); } this._tags[tag.tag] = tag.value; this.__combinedTagString += `${tag.tag}:${tag.value}` + ' '; return true; } return false; } /** * Gets the value of the tag. * @param tagName The tag name. */ getTagValue(tagName) { return this._tags[tagName]; } /** * Gets the tag object. * @param tagName The tag name. */ getTag(tagName) { const tag = { tag: tagName, value: this._tags[tagName], }; return tag; } /** * Gets the boolean value whether this object has the tag or not. * @param tagName The tag name. */ hasTag(tagName) { if (this._tags[tagName] != null) { return true; } else { return false; } } /** * Remove the tag. * @param tagName The tag name. */ removeTag(tagName) { const strToDelete = `${tagName}:${this._tags[tagName]}` + ' '; this.__combinedTagString.replace(this.__combinedTagString, ''); delete this._tags[tagName]; } /** * Confirms the matching of the tag name and tag value. * @param tagName The tag name. * @param tagValue The tag value. */ matchTag(tagName, tagValue) { if (this._tags[tagName] === tagValue) { return true; } else { return false; } } /** * Confirm that this object's tags includes given an array of string. * @param stringArray an array of string. */ matchTagsAsFreeStrings(stringArray) { let regExpStr = '^'; for (let i = 0; i < stringArray.length; i++) { regExpStr += `(?=.*${stringArray[i]})`; } const reg = new RegExp(regExpStr); if (reg.test(this.__combinedTagString)) { return true; } else { return false; } } /** * Confirm that this object's tags includes given set of tags. * @param tags The set of tags. */ matchTags(tags) { let regExpStr = '^'; for (const tagName in tags) { regExpStr += `(?=.*${[tagName]}:${tags[tagName]})`; } const reg = new RegExp(regExpStr); if (reg.test(this.__combinedTagString)) { return true; } else { return false; } } /** * Get the unique name of the entity. */ get uniqueName() { return this.__uniqueName; } /** * @internal */ static _reset() { this.currentMaxObjectCount = 0; this.__uniqueNames = []; this.__objectsByNameMap = new Map(); this.__objects = []; } _copyFrom(rnObject) { this._tags = (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_0__.deepCopyUsingJsonStringify)(rnObject._tags); this.__combinedTagString = rnObject.__combinedTagString; } } /// static members RnObject.InvalidObjectUID = -1; RnObject.currentMaxObjectCount = 0; RnObject.__uniqueNames = []; RnObject.__objectsByNameMap = new Map(); RnObject.__objects = []; /***/ }), /***/ "./src/foundation/core/index.ts": /*!**************************************!*\ !*** ./src/foundation/core/index.ts ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Component: () => (/* reexport safe */ _Component__WEBPACK_IMPORTED_MODULE_0__.Component), /* harmony export */ ComponentRepository: () => (/* reexport safe */ _ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository), /* harmony export */ Config: () => (/* reexport safe */ _Config__WEBPACK_IMPORTED_MODULE_2__.Config), /* harmony export */ Entity: () => (/* reexport safe */ _Entity__WEBPACK_IMPORTED_MODULE_3__.Entity), /* harmony export */ EntityRepository: () => (/* reexport safe */ _EntityRepository__WEBPACK_IMPORTED_MODULE_4__.EntityRepository), /* harmony export */ GlobalDataRepository: () => (/* reexport safe */ _GlobalDataRepository__WEBPACK_IMPORTED_MODULE_5__.GlobalDataRepository), /* harmony export */ MemoryManager: () => (/* reexport safe */ _MemoryManager__WEBPACK_IMPORTED_MODULE_6__.MemoryManager), /* harmony export */ RnObject: () => (/* reexport safe */ _RnObject__WEBPACK_IMPORTED_MODULE_7__.RnObject), /* harmony export */ applyMixins: () => (/* reexport safe */ _EntityRepository__WEBPACK_IMPORTED_MODULE_4__.applyMixins), /* harmony export */ createEntity: () => (/* reexport safe */ _EntityRepository__WEBPACK_IMPORTED_MODULE_4__.createEntity) /* harmony export */ }); /* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _Config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Entity */ "./src/foundation/core/Entity.ts"); /* harmony import */ var _EntityRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _GlobalDataRepository__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _MemoryManager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _RnObject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./RnObject */ "./src/foundation/core/RnObject.ts"); /***/ }), /***/ "./src/foundation/definitions/AlphaMode.ts": /*!*************************************************!*\ !*** ./src/foundation/definitions/AlphaMode.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AlphaMode: () => (/* binding */ AlphaMode) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class AlphaModeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } toGltfString() { return this.str; } } const Opaque = new AlphaModeClass({ index: 0, str: 'OPAQUE' }); const Mask = new AlphaModeClass({ index: 1, str: 'MASK' }); const Blend = new AlphaModeClass({ index: 2, str: 'BLEND', }); const typeList = [Opaque, Mask, Blend]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function fromGlTFString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const AlphaMode = Object.freeze({ Opaque, Mask, Blend, from, fromString, fromGlTFString, }); /***/ }), /***/ "./src/foundation/definitions/AnimationAttribute.ts": /*!**********************************************************!*\ !*** ./src/foundation/definitions/AnimationAttribute.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationAttribute: () => (/* binding */ AnimationAttribute) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class AnimationAttributeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Quaternion = new AnimationAttributeClass({ index: 0, str: 'Quaternion', }); const Translate = new AnimationAttributeClass({ index: 1, str: 'Translate', }); const Scale = new AnimationAttributeClass({ index: 2, str: 'Scale', }); const Weights = new AnimationAttributeClass({ index: 3, str: 'Weights', }); const Effekseer = new AnimationAttributeClass({ index: 4, str: 'Effekseer', }); const typeList = [Quaternion, Translate, Scale, Weights, Effekseer]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const AnimationAttribute = Object.freeze({ Quaternion, Translate, Scale, Weights, Effekseer, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/AnimationInterpolation.ts": /*!**************************************************************!*\ !*** ./src/foundation/definitions/AnimationInterpolation.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationInterpolation: () => (/* binding */ AnimationInterpolation) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class AnimationInterpolationClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } get GltfString() { return this.str.toUpperCase(); } } const Linear = new AnimationInterpolationClass({ index: 0, str: 'Linear', }); const Step = new AnimationInterpolationClass({ index: 1, str: 'Step', }); const CubicSpline = new AnimationInterpolationClass({ index: 2, str: 'CubicSpline', }); const typeList = [Linear, Step, CubicSpline]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const AnimationInterpolation = Object.freeze({ Linear, Step, CubicSpline, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/BasisCompressionType.ts": /*!************************************************************!*\ !*** ./src/foundation/definitions/BasisCompressionType.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BasisCompressionType: () => (/* binding */ BasisCompressionType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class BasisCompressionTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const ETC1 = new BasisCompressionTypeClass({ index: 0, str: 'ETC1', }); const ETC2 = new BasisCompressionTypeClass({ index: 1, str: 'ETC2', }); const BC1 = new BasisCompressionTypeClass({ index: 2, str: 'BC1', }); const BC3 = new BasisCompressionTypeClass({ index: 3, str: 'BC3', }); const BC4 = new BasisCompressionTypeClass({ index: 4, str: 'BC4', }); const BC5 = new BasisCompressionTypeClass({ index: 5, str: 'BC5', }); const BC7_M6_OPAQUE = new BasisCompressionTypeClass({ index: 6, str: 'BC7_M6_OPAQUE', }); const BC7_M5 = new BasisCompressionTypeClass({ index: 7, str: 'BC7_M5', }); const PVRTC1_RGB = new BasisCompressionTypeClass({ index: 8, str: 'PVRTC1_RGB', }); const PVRTC1_RGBA = new BasisCompressionTypeClass({ index: 9, str: 'PVRTC1_RGBA', }); const ASTC = new BasisCompressionTypeClass({ index: 10, str: 'ASTC', }); const ATC_RGB = new BasisCompressionTypeClass({ index: 11, str: 'ATC_RGB', }); const ATC_RGBA = new BasisCompressionTypeClass({ index: 12, str: 'ATC_RGBA', }); const RGBA32 = new BasisCompressionTypeClass({ index: 13, str: 'RGBA32', }); const RGB565 = new BasisCompressionTypeClass({ index: 14, str: 'RGB565', }); const BGR565 = new BasisCompressionTypeClass({ index: 15, str: 'BGR565', }); const RGBA4444 = new BasisCompressionTypeClass({ index: 16, str: 'RGBA4444', }); const typeList = [ ETC1, ETC2, BC1, BC3, BC4, BC5, BC7_M5, BC7_M6_OPAQUE, PVRTC1_RGB, PVRTC1_RGBA, ASTC, ATC_RGB, ATC_RGBA, RGBA32, RGB565, BGR565, RGBA4444, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const BasisCompressionType = Object.freeze({ ETC1, ETC2, BC1, BC3, BC4, BC5, BC7_M5, BC7_M6_OPAQUE, PVRTC1_RGB, PVRTC1_RGBA, ASTC, ATC_RGB, ATC_RGBA, RGBA32, RGB565, BGR565, RGBA4444, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/Blend.ts": /*!*********************************************!*\ !*** ./src/foundation/definitions/Blend.ts ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Blend: () => (/* binding */ Blend) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class BlendClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, webgpu }) { super({ index, str }); this.__webgpu = webgpu; } get webgpu() { if (this.__webgpu === undefined) { throw new Error(`does not support ${this.str}`); } return this.__webgpu; } } const EquationFuncAdd = new BlendClass({ index: 32774, str: 'Equation_FUNC_ADD', webgpu: 'add', }); const Zero = new BlendClass({ index: 0x0, str: 'ZERO', webgpu: 'zero', }); const One = new BlendClass({ index: 0x1, str: 'ONE', webgpu: 'one', }); const SrcAlpha = new BlendClass({ index: 770, str: 'SRC_ALPHA', webgpu: 'src-alpha', }); const OneMinusSrcAlpha = new BlendClass({ index: 771, str: 'ONE_MINUS_SRC_ALPHA', webgpu: 'one-minus-src-alpha', }); const Min = new BlendClass({ index: 0x8007, str: 'Equation_FUNC_MIN', webgpu: 'min', }); const Max = new BlendClass({ index: 0x8008, str: 'Equation_FUNC_MAX', webgpu: 'max', }); const typeList = [EquationFuncAdd, Zero, One, SrcAlpha, OneMinusSrcAlpha, Min, Max]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const Blend = Object.freeze({ EquationFuncAdd, Zero, One, SrcAlpha, OneMinusSrcAlpha, Min, Max, from, }); /***/ }), /***/ "./src/foundation/definitions/BoneDataType.ts": /*!****************************************************!*\ !*** ./src/foundation/definitions/BoneDataType.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BoneDataType: () => (/* binding */ BoneDataType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class BoneDataTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Mat43x1 = new BoneDataTypeClass({ index: 0, str: 'Mat43x1', }); const Vec4x2 = new BoneDataTypeClass({ index: 1, str: 'Vec4x2', }); const Vec4x2Old = new BoneDataTypeClass({ index: 2, str: 'Vec4x2Old', }); const Vec4x1 = new BoneDataTypeClass({ index: 3, str: 'Vec4x1', }); const typeList = [Mat43x1, Vec4x2, Vec4x1]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const BoneDataType = Object.freeze({ Mat43x1, Vec4x2, Vec4x2Old, Vec4x1, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/BufferUse.ts": /*!*************************************************!*\ !*** ./src/foundation/definitions/BufferUse.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BufferUse: () => (/* binding */ BufferUse) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class BufferUseClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const GPUInstanceData = new BufferUseClass({ index: 0, str: 'GPUInstanceData', }); const GPUVertexData = new BufferUseClass({ index: 1, str: 'GPUVertexData', }); const UBOGeneric = new BufferUseClass({ index: 2, str: 'UBOGeneric', }); const CPUGeneric = new BufferUseClass({ index: 3, str: 'CPUGeneric', }); const typeList = [GPUInstanceData, GPUVertexData, UBOGeneric, CPUGeneric]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const BufferUse = Object.freeze({ GPUInstanceData, GPUVertexData, UBOGeneric, CPUGeneric, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/CameraControllerType.ts": /*!************************************************************!*\ !*** ./src/foundation/definitions/CameraControllerType.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CameraControllerType: () => (/* binding */ CameraControllerType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class CameraControllerTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Orbit = new CameraControllerTypeClass({ index: 0, str: 'Orbit', }); const WalkThrough = new CameraControllerTypeClass({ index: 1, str: 'WalkThrough', }); const typeList = [Orbit, WalkThrough]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const CameraControllerType = Object.freeze({ Orbit, WalkThrough, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/CameraType.ts": /*!**************************************************!*\ !*** ./src/foundation/definitions/CameraType.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CameraType: () => (/* binding */ CameraType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class CameraTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Perspective = new CameraTypeClass({ index: 0, str: 'Perspective', }); const Orthographic = new CameraTypeClass({ index: 1, str: 'Orthographic', }); const Frustum = new CameraTypeClass({ index: 2, str: 'Frustum' }); const typeList = [Perspective, Orthographic, Frustum]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const CameraType = Object.freeze({ Perspective, Orthographic, Frustum, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/ComponentType.ts": /*!*****************************************************!*\ !*** ./src/foundation/definitions/ComponentType.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ComponentType: () => (/* binding */ ComponentType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ComponentTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, sizeInBytes, wgsl, webgpu, }) { super({ index, str }); this.__sizeInBytes = sizeInBytes; this.__webgpu = webgpu; this.__wgsl = wgsl; this.__dummyStr = str; } get wgsl() { return this.__wgsl; } get webgpu() { return this.__webgpu; } getSizeInBytes() { return this.__sizeInBytes; } isFloatingPoint() { if (this.index === 5126 || // Float this.index === 5127 || // Double this.index === 0x8d61 // HalfFloat ) { return true; } return false; } isInteger() { if (this.index === 5120 || // Byte this.index === 5122 || // Short this.index === 5124 // Int ) { return true; } return false; } isUnsignedInteger() { if (this.index === 5121 || // UnsignedByte this.index === 5123 || // UnsignedShort this.index === 5125 // UnsignedInt ) { return true; } return false; } } const Unknown = new ComponentTypeClass({ index: 5119, str: 'UNKNOWN', sizeInBytes: 0, wgsl: 'unknown', webgpu: 'unknown', }); const Byte = new ComponentTypeClass({ index: 5120, str: 'BYTE', sizeInBytes: 1, wgsl: 'i32', webgpu: 'sint8', }); const UnsignedByte = new ComponentTypeClass({ index: 5121, str: 'UNSIGNED_BYTE', sizeInBytes: 1, wgsl: 'u32', webgpu: 'uint8', }); const Short = new ComponentTypeClass({ index: 5122, str: 'SHORT', sizeInBytes: 2, wgsl: 'i32', webgpu: 'sint16', }); const UnsignedShort = new ComponentTypeClass({ index: 5123, str: 'UNSIGNED_SHORT', sizeInBytes: 2, wgsl: 'u32', webgpu: 'uint16', }); const Int = new ComponentTypeClass({ index: 5124, str: 'INT', sizeInBytes: 4, wgsl: 'i32', webgpu: 'sint32', }); const UnsignedInt = new ComponentTypeClass({ index: 5125, str: 'UNSIGNED_INT', sizeInBytes: 4, wgsl: 'u32', webgpu: 'uint32', }); const Float = new ComponentTypeClass({ index: 5126, str: 'FLOAT', sizeInBytes: 4, wgsl: 'f32', webgpu: 'float32', }); const Double = new ComponentTypeClass({ index: 5127, str: 'DOUBLE', sizeInBytes: 8, wgsl: 'f32', webgpu: 'float64', }); const Bool = new ComponentTypeClass({ index: 35670, str: 'BOOL', sizeInBytes: 1, wgsl: 'bool', webgpu: 'bool', }); const HalfFloat = new ComponentTypeClass({ index: 0x140b, str: 'HALF_FLOAT', sizeInBytes: 2, wgsl: 'f16', webgpu: 'float16', }); const typeList = [ Unknown, Byte, UnsignedByte, Short, UnsignedShort, Int, UnsignedInt, Float, Double, HalfFloat, Bool, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function fromTypedArray(typedArray) { if (typedArray instanceof Int8Array) { return Byte; } else if (typedArray instanceof Uint8Array || typedArray instanceof Uint8ClampedArray) { return UnsignedByte; } else if (typedArray instanceof Int16Array) { return Short; } else if (typedArray instanceof Uint16Array) { return UnsignedShort; } else if (typedArray instanceof Int32Array) { return Int; } else if (typedArray instanceof Uint32Array) { return UnsignedInt; } else if (typedArray instanceof Float32Array) { return Float; } else if (typedArray instanceof Float64Array) { return Double; } return Unknown; } function toTypedArray(componentType) { if (componentType === Byte) { return Int8Array; } else if (componentType === UnsignedByte) { return Uint8Array; } else if (componentType === Short) { return Int16Array; } else if (componentType === UnsignedShort) { return Uint16Array; } else if (componentType === Int) { return Int32Array; } else if (componentType === UnsignedInt) { return Uint32Array; } else if (componentType === Float) { return Float32Array; } else if (componentType === Double) { return Float64Array; } else { return undefined; } } function fromWgslString(str_) { let str = str_; switch (str_) { case 'bool': str = 'BOOL'; break; case 'i32': str = 'INT'; break; case 'u32': str = 'UNSIGNED_INT'; break; case 'f32': str = 'FLOAT'; break; case 'vec2': str = 'FLOAT'; break; case 'vec3': str = 'FLOAT'; break; case 'vec4': str = 'FLOAT'; break; case 'mat2x2': str = 'FLOAT'; break; case 'mat3x3': str = 'FLOAT'; break; case 'mat4x4': str = 'FLOAT'; break; case 'vec2': str = 'INT'; break; case 'vec3': str = 'INT'; break; case 'vec4': str = 'INT'; break; case 'sampler_2d': str = 'INT'; break; case 'sampler_2d_shadow': str = 'INT'; break; case 'sampler_3d': str = 'INT'; break; case 'sampler_cube': str = 'INT'; break; } return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function fromGlslString(str_) { let str = str_; switch (str_) { case 'bool': str = 'BOOL'; break; case 'int': str = 'INT'; break; case 'float': str = 'FLOAT'; break; case 'vec2': str = 'FLOAT'; break; case 'vec3': str = 'FLOAT'; break; case 'vec4': str = 'FLOAT'; break; case 'mat2': str = 'FLOAT'; break; case 'mat3': str = 'FLOAT'; break; case 'mat4': str = 'FLOAT'; break; case 'ivec2': str = 'INT'; break; case 'ivec3': str = 'INT'; break; case 'ivec4': str = 'INT'; break; case 'sampler2D': str = 'INT'; break; case 'sampler2DShadow': str = 'INT'; break; case 'sampler2DRect': str = 'INT'; break; case 'sampler3D': str = 'INT'; break; case 'samplerCube': str = 'INT'; break; } return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function toGltf2AccessorComponentType(componentTypeForGltf2) { return componentTypeForGltf2.index; } const ComponentType = Object.freeze({ Unknown, Byte, UnsignedByte, Short, UnsignedShort, Int, UnsignedInt, Float, Double, Bool, HalfFloat, from, fromTypedArray, toTypedArray, toGltf2AccessorComponentType, fromString, fromGlslString, fromWgslString, }); /***/ }), /***/ "./src/foundation/definitions/CompositionType.ts": /*!*******************************************************!*\ !*** ./src/foundation/definitions/CompositionType.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CompositionType: () => (/* binding */ CompositionType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class CompositionTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, glslStr, hlslStr, wgsl, webgpu, numberOfComponents, vec4SizeOfProperty, isArray = false, }) { super({ index, str }); this.__numberOfComponents = numberOfComponents; this.__glslStr = glslStr; this.__hlslStr = hlslStr; this.__vec4SizeOfProperty = vec4SizeOfProperty; this.__isArray = isArray; this.__webgpuStr = webgpu; this.__wgslStr = wgsl; this.__dummyStr = str; } get webgpu() { return this.__webgpuStr; } get wgsl() { return this.__wgslStr; } getNumberOfComponents() { return this.__numberOfComponents; } getGlslStr(componentType) { if (componentType.index === 5126 || // FLOAT componentType.index === 5127 || // DOUBLE this === CompositionType.Texture2D || this === CompositionType.Texture2DShadow || this === CompositionType.Texture2DRect || this === CompositionType.TextureCube) { return this.__glslStr; } else if (componentType.index === 5120 || // BYTE componentType.index === 5122 || // SHORT componentType.index === 5124 // INT ) { if (this === CompositionType.Scalar || this === CompositionType.ScalarArray) { return 'int'; } else { return 'i' + this.__glslStr; } // eslint-disable-next-line prettier/prettier } else if (componentType.index === 35670) { // BOOL return 'bool'; } return 'unknown'; } getGlslInitialValue(componentType) { if (componentType.index === 5126 || // FLOAT componentType.index === 5127 // DOUBLE ) { if (this === CompositionType.Scalar) { return '0.0'; } else { if (this.__numberOfComponents === 2) { return this.__glslStr + '(0.0, 0.0)'; } else if (this.__numberOfComponents === 3) { return this.__glslStr + '(0.0, 0.0, 0.0)'; } else if (this.__numberOfComponents === 4) { return this.__glslStr + '(0.0, 0.0, 0.0, 0.0)'; } else if (this.__numberOfComponents === 9) { return this.__glslStr + '(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)'; } else if (this.__numberOfComponents === 16) { return (this.__glslStr + '(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)'); } } } else if (componentType.index === 5120 || // BYTE componentType.index === 5122 || // SHORT componentType.index === 5124 // INT ) { if (this === CompositionType.Scalar) { return '0'; } else { if (this.__numberOfComponents === 2) { return this.__glslStr + '(0, 0)'; } else if (this.__numberOfComponents === 3) { return this.__glslStr + '(0, 0, 0)'; } else if (this.__numberOfComponents === 4) { return this.__glslStr + '(0, 0, 0, 0)'; } else if (this.__numberOfComponents === 9) { return this.__glslStr + '(0, 0, 0, 0, 0, 0, 0, 0, 0)'; } else if (this.__numberOfComponents === 16) { return this.__glslStr + '(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)'; } } // eslint-disable-next-line prettier/prettier } else if (componentType.index === 35670) { // BOOL if (this === CompositionType.Scalar) { return 'false'; } else { if (this.__numberOfComponents === 2) { return this.__glslStr + '(false, false)'; } else if (this.__numberOfComponents === 3) { return this.__glslStr + '(false, false, false)'; } else if (this.__numberOfComponents === 4) { return this.__glslStr + '(false, false, false, false)'; } } } return 'unknown'; } getWgslInitialValue(componentType) { const type = this.toWGSLType(componentType); if (componentType.index === 5126 || // FLOAT componentType.index === 5127 // DOUBLE ) { if (this === CompositionType.Scalar) { return '0.0'; } else { if (this.__numberOfComponents === 2) { return type + '(0.0, 0.0)'; } else if (this.__numberOfComponents === 3) { return type + '(0.0, 0.0, 0.0)'; } else if (this.__numberOfComponents === 4) { return type + '(0.0, 0.0, 0.0, 0.0)'; } else if (this.__numberOfComponents === 9) { return type + '(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)'; } else if (this.__numberOfComponents === 16) { return (type + '(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)'); } } } else if (componentType.index === 5120 || // BYTE componentType.index === 5122 || // SHORT componentType.index === 5124 // INT ) { if (this === CompositionType.Scalar) { return '0'; } else { if (this.__numberOfComponents === 2) { return type + '(0, 0)'; } else if (this.__numberOfComponents === 3) { return type + '(0, 0, 0)'; } else if (this.__numberOfComponents === 4) { return type + '(0, 0, 0, 0)'; } else if (this.__numberOfComponents === 9) { return type + '(0, 0, 0, 0, 0, 0, 0, 0, 0)'; } else if (this.__numberOfComponents === 16) { return type + '(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)'; } } // eslint-disable-next-line prettier/prettier } else if (componentType.index === 35670) { // BOOL if (this === CompositionType.Scalar) { return 'false'; } else { if (this.__numberOfComponents === 2) { return type + '(false, false)'; } else if (this.__numberOfComponents === 3) { return type + '(false, false, false)'; } else if (this.__numberOfComponents === 4) { return type + '(false, false, false, false)'; } } } return 'unknown'; } toWGSLType(componentType) { return this.__wgslStr.replace('#', componentType.wgsl); } getVec4SizeOfProperty() { return this.__vec4SizeOfProperty; } } const Unknown = new CompositionTypeClass({ index: -1, str: 'UNKNOWN', glslStr: 'unknown', hlslStr: 'unknown', wgsl: 'unknown', webgpu: 'unknown', numberOfComponents: 0, vec4SizeOfProperty: 0, }); const Scalar = new CompositionTypeClass({ index: 0, str: 'SCALAR', glslStr: 'float', hlslStr: 'float', wgsl: '#', webgpu: '', numberOfComponents: 1, vec4SizeOfProperty: 1, }); const Vec2 = new CompositionTypeClass({ index: 1, str: 'VEC2', glslStr: 'vec2', hlslStr: 'float2', wgsl: 'vec2<#>', webgpu: 'x2', numberOfComponents: 2, vec4SizeOfProperty: 1, }); const Vec3 = new CompositionTypeClass({ index: 2, str: 'VEC3', glslStr: 'vec3', hlslStr: 'float3', wgsl: 'vec3<#>', webgpu: 'x3', numberOfComponents: 3, vec4SizeOfProperty: 1, }); const Vec4 = new CompositionTypeClass({ index: 3, str: 'VEC4', glslStr: 'vec4', hlslStr: 'float4', wgsl: 'vec4<#>', webgpu: 'x4', numberOfComponents: 4, vec4SizeOfProperty: 1, }); const Mat2 = new CompositionTypeClass({ index: 4, str: 'MAT2', glslStr: 'mat2', hlslStr: 'float2x2', wgsl: 'mat2x2<#>', webgpu: 'unknown', numberOfComponents: 4, vec4SizeOfProperty: 2, }); const Mat3 = new CompositionTypeClass({ index: 5, str: 'MAT3', glslStr: 'mat3', hlslStr: 'float3x3', wgsl: 'mat3x3<#>', webgpu: 'unknown', numberOfComponents: 9, vec4SizeOfProperty: 3, }); const Mat4 = new CompositionTypeClass({ index: 6, str: 'MAT4', glslStr: 'mat4', hlslStr: 'float4x4', wgsl: 'mat4x4<#>', webgpu: 'unknown', numberOfComponents: 16, vec4SizeOfProperty: 4, }); const Texture2D = new CompositionTypeClass({ index: 7, str: 'TEXTURE_2D', glslStr: 'sampler2D', hlslStr: 'Texture2D', wgsl: 'texture_2d', webgpu: 'texture_2d', numberOfComponents: 1, vec4SizeOfProperty: 1, }); const TextureCube = new CompositionTypeClass({ index: 8, str: 'TEXTURE_CUBE_MAP', glslStr: 'samplerCube', hlslStr: 'TextureCube', wgsl: 'texture_cube', webgpu: 'texture_cube', numberOfComponents: 1, vec4SizeOfProperty: 1, }); const ScalarArray = new CompositionTypeClass({ index: 9, str: 'SCALAR_ARRAY', glslStr: 'float', hlslStr: 'float', wgsl: '#', webgpu: 'unknown', numberOfComponents: 1, vec4SizeOfProperty: 1, isArray: true, }); const Vec2Array = new CompositionTypeClass({ index: 10, str: 'VEC2_ARRAY', glslStr: 'vec2', hlslStr: 'float2', wgsl: 'vec2<#>', webgpu: 'unknown', numberOfComponents: 2, vec4SizeOfProperty: 1, isArray: true, }); const Vec3Array = new CompositionTypeClass({ index: 11, str: 'VEC3_ARRAY', glslStr: 'vec3', hlslStr: 'float3', wgsl: 'vec3<#>', webgpu: 'unknown', numberOfComponents: 3, vec4SizeOfProperty: 1, isArray: true, }); const Vec4Array = new CompositionTypeClass({ index: 12, str: 'VEC4_ARRAY', glslStr: 'vec4', hlslStr: 'float4', wgsl: 'vec4<#>', webgpu: 'unknown', numberOfComponents: 4, vec4SizeOfProperty: 1, isArray: true, }); const Mat4Array = new CompositionTypeClass({ index: 13, str: 'MAT4_ARRAY', glslStr: 'mat4', hlslStr: 'float4x4', wgsl: 'mat4x4<#>', webgpu: 'unknown', numberOfComponents: 16, vec4SizeOfProperty: 4, isArray: true, }); const Mat3Array = new CompositionTypeClass({ index: 14, str: 'MAT3_ARRAY', glslStr: 'mat3', hlslStr: 'float3x3', wgsl: 'mat3x3<#>', webgpu: 'unknown', numberOfComponents: 9, vec4SizeOfProperty: 3, isArray: true, }); const Mat2Array = new CompositionTypeClass({ index: 15, str: 'MAT2_ARRAY', glslStr: 'mat2', hlslStr: 'float2x2', wgsl: 'mat2x2<#>', webgpu: 'unknown', numberOfComponents: 4, vec4SizeOfProperty: 2, isArray: true, }); const Texture2DShadow = new CompositionTypeClass({ index: 16, str: 'TEXTURE_2D_SHADOW', glslStr: 'highp sampler2DShadow', hlslStr: 'Texture2D', wgsl: 'texture_2d', webgpu: 'texture_2d', numberOfComponents: 1, vec4SizeOfProperty: 1, }); const Texture2DRect = new CompositionTypeClass({ index: 17, str: 'TEXTURE_2D_RECT', glslStr: 'sampler2DRect', hlslStr: 'Texture2D', wgsl: 'texture_2d', webgpu: 'texture_2d', numberOfComponents: 1, vec4SizeOfProperty: 1, }); const Mat4x3Array = new CompositionTypeClass({ index: 18, str: 'MAT4x3_ARRAY', glslStr: 'mat4x3', hlslStr: 'float4x3', wgsl: 'mat4x3<#>', webgpu: 'unknown', numberOfComponents: 12, vec4SizeOfProperty: 3, isArray: true, }); const typeList = [ Unknown, Scalar, Vec2, Vec3, Vec4, Mat2, Mat3, Mat4, Vec2Array, Vec3Array, Vec4Array, ScalarArray, Mat2Array, Mat3Array, Mat4Array, Texture2D, Texture2DShadow, Texture2DRect, TextureCube, Mat4x3Array, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function vectorFrom(componentN) { let str = ''; switch (componentN) { case 1: str = 'scalar'; break; case 2: str = 'vec2'; break; case 3: str = 'vec3'; break; case 4: str = 'vec4'; break; default: _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('not found appropriate Vectors'); } return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function fromGlslString(str_) { let str = str_; switch (str_) { case 'bool': str = 'scalar'; break; case 'int': str = 'scalar'; break; case 'float': str = 'scalar'; break; case 'ivec2': str = 'vec2'; break; case 'ivec3': str = 'vec3'; break; case 'ivec4': str = 'vec4'; break; case 'sampler2D': str = 'TEXTURE_2D'; break; case 'sampler2DShadow': str = 'TEXTURE_2D_SHADOW'; break; case 'sampler2DRect': str = 'TEXTURE_2D_RECT'; break; case 'samplerCube': str = 'TEXTURE_CUBE_MAP'; break; } return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function fromWgslString(str_) { let str = str_; switch (str_) { case 'bool': str = 'scalar'; break; case 'i32': str = 'scalar'; break; case 'u32': str = 'scalar'; break; case 'f32': str = 'scalar'; break; case 'vec2': str = 'vec2'; break; case 'vec3': str = 'vec3'; break; case 'vec4': str = 'vec4'; break; case 'mat2x2': str = 'mat2'; break; case 'mat3x3': str = 'mat3'; break; case 'mat4x4': str = 'mat4'; break; case 'vec2': str = 'vec2'; break; case 'vec3': str = 'vec3'; break; case 'vec4': str = 'vec4'; break; case 'mat2x2': str = 'mat2'; break; case 'mat3x3': str = 'mat3'; break; case 'mat4x4': str = 'mat4'; break; case 'sampler_2d': str = 'TEXTURE_2D'; break; case 'sampler_2d_shadow': str = 'TEXTURE_2D_SHADOW'; break; case 'sampler_cube': str = 'TEXTURE_CUBE_MAP'; break; } return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function toGltf2AccessorCompositionTypeString(componentN) { switch (componentN) { case 1: return 'SCALAR'; case 2: return 'VEC2'; case 3: return 'VEC3'; case 4: return 'VEC4'; case 9: return 'MAT3'; case 16: return 'MAT4'; default: throw new Error('Invalid componentN'); } } function toGltf2AnimationAccessorCompositionTypeString(componentN) { switch (componentN) { case 1: return 'SCALAR'; case 2: return 'VEC2'; case 3: return 'VEC3'; case 4: return 'VEC4'; default: throw new Error('Invalid componentN'); } } function toGltf2SquareMatrixAccessorCompositionTypeString(componentN) { switch (componentN) { case 4: return 'VEC4'; case 9: return 'MAT3'; case 16: return 'MAT4'; default: throw new Error('Invalid componentN'); } } function toGltf2AnimationAccessorCompositionType(componentN) { switch (componentN) { case 1: return Scalar; case 2: return Vec2; case 3: return Vec3; case 4: return Vec4; default: throw new Error('Invalid componentN'); } } function isArray(compositionType) { if (compositionType === ScalarArray || compositionType === Vec2Array || compositionType === Vec3Array || compositionType === Vec4Array || compositionType === Mat4x3Array || compositionType === Mat4Array || compositionType === Mat3Array || compositionType === Mat2Array) { return true; } else { return false; } } function isTexture(compositionType) { if (compositionType === Texture2D || compositionType === TextureCube || compositionType === Texture2DShadow || compositionType === Texture2DRect) { return true; } else { return false; } } const CompositionType = Object.freeze({ Unknown, Scalar, Vec2, Vec3, Vec4, Mat2, Mat3, Mat4, ScalarArray, Vec2Array, Vec3Array, Vec4Array, Mat2Array, Mat3Array, Mat4Array, Texture2D, Texture2DShadow, TextureCube, Texture2DRect, Mat4x3Array, from, fromString, vectorFrom, fromGlslString, fromWgslString, isArray, isTexture, toGltf2AnimationAccessorCompositionType, toGltf2AccessorCompositionTypeString, toGltf2AnimationAccessorCompositionTypeString, toGltf2SquareMatrixAccessorCompositionTypeString, }); /***/ }), /***/ "./src/foundation/definitions/CompressionTextureType.ts": /*!**************************************************************!*\ !*** ./src/foundation/definitions/CompressionTextureType.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CompressionTextureType: () => (/* binding */ CompressionTextureType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class CompressionTextureTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, webgpu, blockInfo }) { super({ index, str }); this.__webgpu = webgpu; this.__blockInfo = blockInfo; } get webgpu() { if (this.__webgpu === undefined) { throw new Error(`does not support ${this.str}`); } return this.__webgpu; } get blockInfo() { if (this.__blockInfo === undefined) { throw new Error(`does not support ${this.str}`); } return this.__blockInfo; } } const ASTC_RGBA_4x4 = new CompressionTextureTypeClass({ index: 37808, str: 'COMPRESSED_RGBA_ASTC_4x4_KHR', webgpu: 'astc-4x4-unorm', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const ASTC_RGBA_5x4 = new CompressionTextureTypeClass({ index: 37809, str: 'COMPRESSED_RGBA_ASTC_5x4_KHR', webgpu: 'astc-5x4-unorm', }); const ASTC_RGBA_5x5 = new CompressionTextureTypeClass({ index: 37810, str: 'COMPRESSED_RGBA_ASTC_5x5_KHR', webgpu: 'astc-5x5-unorm', }); const ASTC_RGBA_6x5 = new CompressionTextureTypeClass({ index: 37811, str: 'COMPRESSED_RGBA_ASTC_6x5_KHR', webgpu: 'astc-6x5-unorm', }); const ASTC_RGBA_6x6 = new CompressionTextureTypeClass({ index: 37812, str: 'COMPRESSED_RGBA_ASTC_6x6_KHR', webgpu: 'astc-6x6-unorm', }); const ASTC_RGBA_8x5 = new CompressionTextureTypeClass({ index: 37813, str: 'COMPRESSED_RGBA_ASTC_8x5_KHR', webgpu: 'astc-8x5-unorm', }); const ASTC_RGBA_8x6 = new CompressionTextureTypeClass({ index: 37814, str: 'COMPRESSED_RGBA_ASTC_8x6_KHR', webgpu: 'astc-8x6-unorm', }); const ASTC_RGBA_8x8 = new CompressionTextureTypeClass({ index: 37815, str: 'COMPRESSED_RGBA_ASTC_8x8_KHR', webgpu: 'astc-8x8-unorm', }); const ASTC_RGBA_10x5 = new CompressionTextureTypeClass({ index: 37816, str: 'COMPRESSED_RGBA_ASTC_10x5_KHR', webgpu: 'astc-10x5-unorm', }); const ASTC_RGBA_10x6 = new CompressionTextureTypeClass({ index: 37817, str: 'COMPRESSED_RGBA_ASTC_10x6_KHR', webgpu: 'astc-10x6-unorm', }); const ASTC_RGBA_10x8 = new CompressionTextureTypeClass({ index: 37818, str: 'COMPRESSED_RGBA_ASTC_10x8_KHR', webgpu: 'astc-10x8-unorm', }); const ASTC_RGBA_10x10 = new CompressionTextureTypeClass({ index: 37819, str: 'COMPRESSED_RGBA_ASTC_10x10_KHR', webgpu: 'astc-10x10-unorm', }); const ASTC_RGBA_12x10 = new CompressionTextureTypeClass({ index: 37820, str: 'COMPRESSED_RGBA_ASTC_12x10_KHR', webgpu: 'astc-12x10-unorm', }); const ASTC_RGBA_12x12 = new CompressionTextureTypeClass({ index: 37821, str: 'COMPRESSED_RGBA_ASTC_12x12_KHR', webgpu: 'astc-12x12-unorm', }); const ASTC_SRGB_4x4 = new CompressionTextureTypeClass({ index: 37840, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR', webgpu: 'astc-4x4-unorm-srgb', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const ASTC_SRGB_5x4 = new CompressionTextureTypeClass({ index: 37841, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR', webgpu: 'astc-5x4-unorm-srgb', }); const ASTC_SRGB_5x5 = new CompressionTextureTypeClass({ index: 37842, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR', webgpu: 'astc-5x5-unorm-srgb', }); const ASTC_SRGB_6x5 = new CompressionTextureTypeClass({ index: 37843, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR', webgpu: 'astc-6x5-unorm-srgb', }); const ASTC_SRGB_6x6 = new CompressionTextureTypeClass({ index: 37844, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR', webgpu: 'astc-6x6-unorm-srgb', }); const ASTC_SRGB_8x5 = new CompressionTextureTypeClass({ index: 37845, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR', webgpu: 'astc-8x5-unorm-srgb', }); const ASTC_SRGB_8x6 = new CompressionTextureTypeClass({ index: 37846, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR', webgpu: 'astc-8x6-unorm-srgb', }); const ASTC_SRGB_8x8 = new CompressionTextureTypeClass({ index: 37847, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR', webgpu: 'astc-8x8-unorm-srgb', }); const ASTC_SRGB_10x5 = new CompressionTextureTypeClass({ index: 37848, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR', webgpu: 'astc-10x5-unorm-srgb', }); const ASTC_SRGB_10x6 = new CompressionTextureTypeClass({ index: 37849, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR', webgpu: 'astc-10x6-unorm-srgb', }); const ASTC_SRGB_10x8 = new CompressionTextureTypeClass({ index: 37850, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR', webgpu: 'astc-10x8-unorm-srgb', }); const ASTC_SRGB_10x10 = new CompressionTextureTypeClass({ index: 37851, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR', webgpu: 'astc-10x10-unorm-srgb', }); const ASTC_SRGB_12x10 = new CompressionTextureTypeClass({ index: 37852, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR', webgpu: 'astc-12x10-unorm-srgb', }); const ASTC_SRGB_12x12 = new CompressionTextureTypeClass({ index: 37853, str: 'COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR', webgpu: 'astc-12x12-unorm-srgb', }); const S3TC_RGB_DXT1 = new CompressionTextureTypeClass({ index: 33776, str: 'COMPRESSED_RGB_S3TC_DXT1_EXT', webgpu: 'bc1-rgba-unorm', blockInfo: { byteSize: 8, width: 4, height: 4, } }); const S3TC_RGBA_DXT1 = new CompressionTextureTypeClass({ index: 33777, str: 'COMPRESSED_RGBA_S3TC_DXT1_EXT', webgpu: 'bc1-rgba-unorm', blockInfo: { byteSize: 8, width: 4, height: 4, } }); const S3TC_RGBA_DXT3 = new CompressionTextureTypeClass({ index: 33778, str: 'COMPRESSED_RGBA_S3TC_DXT3_EXT', webgpu: 'bc2-rgba-unorm', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const S3TC_RGBA_DXT5 = new CompressionTextureTypeClass({ index: 33779, str: 'COMPRESSED_RGBA_S3TC_DXT5_EXT', webgpu: 'bc3-rgba-unorm', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const BPTC_RGBA = new CompressionTextureTypeClass({ index: 36492, str: 'COMPRESSED_RGBA_BPTC_UNORM_EXT', webgpu: 'bc7-rgba-unorm', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const PVRTC_RGBA_4BPPV1 = new CompressionTextureTypeClass({ index: 35842, str: 'COMPRESSED_RGBA_PVRTC_4BPPV1_IMG', blockInfo: { byteSize: 8, width: 4, height: 4, } }); const PVRTC_RGB_4BPPV1 = new CompressionTextureTypeClass({ index: 35840, str: 'COMPRESSED_RGB_PVRTC_4BPPV1_IMG', blockInfo: { byteSize: 8, width: 4, height: 4, } }); const ETC2_RGBA8_EAC = new CompressionTextureTypeClass({ index: 37496, str: 'COMPRESSED_RGBA8_ETC2_EAC', webgpu: 'etc2-rgba8unorm', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const ETC2_RGB8 = new CompressionTextureTypeClass({ index: 37492, str: 'COMPRESSED_RGB8_ETC2', webgpu: 'etc2-rgb8unorm', blockInfo: { byteSize: 16, width: 4, height: 4, } }); const ETC1_RGB = new CompressionTextureTypeClass({ index: 36196, str: 'COMPRESSED_RGB_ETC1_WEBGL', }); const RGBA8_EXT = new CompressionTextureTypeClass({ index: 32856, str: 'RGBA8_EXT', blockInfo: { byteSize: 4, width: 1, height: 1, } }); const typeList = [ ASTC_RGBA_4x4, ASTC_RGBA_5x4, ASTC_RGBA_5x5, ASTC_RGBA_6x5, ASTC_RGBA_6x6, ASTC_RGBA_8x5, ASTC_RGBA_8x6, ASTC_RGBA_8x8, ASTC_RGBA_10x5, ASTC_RGBA_10x6, ASTC_RGBA_10x8, ASTC_RGBA_10x10, ASTC_RGBA_12x10, ASTC_RGBA_12x12, ASTC_SRGB_4x4, ASTC_SRGB_5x4, ASTC_SRGB_5x5, ASTC_SRGB_6x5, ASTC_SRGB_6x6, ASTC_SRGB_8x5, ASTC_SRGB_8x6, ASTC_SRGB_8x8, ASTC_SRGB_10x5, ASTC_SRGB_10x6, ASTC_SRGB_10x8, ASTC_SRGB_10x10, ASTC_SRGB_12x10, ASTC_SRGB_12x12, S3TC_RGB_DXT1, S3TC_RGBA_DXT1, S3TC_RGBA_DXT3, S3TC_RGBA_DXT5, BPTC_RGBA, PVRTC_RGBA_4BPPV1, PVRTC_RGB_4BPPV1, ETC2_RGBA8_EAC, ETC2_RGB8, ETC1_RGB, RGBA8_EXT, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const CompressionTextureType = Object.freeze({ ASTC_RGBA_4x4, ASTC_RGBA_5x4, ASTC_RGBA_5x5, ASTC_RGBA_6x5, ASTC_RGBA_6x6, ASTC_RGBA_8x5, ASTC_RGBA_8x6, ASTC_RGBA_8x8, ASTC_RGBA_10x5, ASTC_RGBA_10x6, ASTC_RGBA_10x8, ASTC_RGBA_10x10, ASTC_RGBA_12x10, ASTC_RGBA_12x12, ASTC_SRGB_4x4, ASTC_SRGB_5x4, ASTC_SRGB_5x5, ASTC_SRGB_6x5, ASTC_SRGB_6x6, ASTC_SRGB_8x5, ASTC_SRGB_8x6, ASTC_SRGB_8x8, ASTC_SRGB_10x5, ASTC_SRGB_10x6, ASTC_SRGB_10x8, ASTC_SRGB_10x10, ASTC_SRGB_12x10, ASTC_SRGB_12x12, S3TC_RGB_DXT1, S3TC_RGBA_DXT1, S3TC_RGBA_DXT3, S3TC_RGBA_DXT5, BPTC_RGBA, PVRTC_RGBA_4BPPV1, PVRTC_RGB_4BPPV1, ETC2_RGBA8_EAC, ETC2_RGB8, ETC1_RGB, RGBA8_EXT, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/FileType.ts": /*!************************************************!*\ !*** ./src/foundation/definitions/FileType.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ FileType: () => (/* binding */ FileType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class FileTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, ext, brand, }) { super({ index, str }); this.extension = ext; this.brand = brand; } } const Unknown = new FileTypeClass({ index: -1, str: 'unknown', ext: 'unknown', brand: 'UnKnown', }); const Gltf = new FileTypeClass({ index: 0, str: 'gltf', ext: 'gltf', brand: 'glTF', }); const GltfBinary = new FileTypeClass({ index: 1, str: 'glb', ext: 'glb', brand: 'glTF', }); const VRM = new FileTypeClass({ index: 2, str: 'vrm', ext: 'vrm', brand: 'VRM', }); const Draco = new FileTypeClass({ index: 3, str: 'drc', ext: 'drc', brand: 'Draco', }); const EffekseerEffect = new FileTypeClass({ index: 4, str: 'efk', ext: 'efk', brand: 'EffekseerEffect', }); const typeList = [Unknown, Gltf, GltfBinary, VRM, Draco, EffekseerEffect]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { const filetype = (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); if (filetype != null) { return filetype; } else { return Unknown; } } function isGltfOrGlb(file) { if (file === Gltf || file === GltfBinary) { return true; } else { return false; } } const FileType = Object.freeze({ Unknown, Gltf, GltfBinary, VRM, Draco, EffekseerEffect, from, fromString, isGltfOrGlb, }); /***/ }), /***/ "./src/foundation/definitions/HdriFormat.ts": /*!**************************************************!*\ !*** ./src/foundation/definitions/HdriFormat.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ HdriFormat: () => (/* binding */ HdriFormat) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class HdriFormatClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const LDR_SRGB = new HdriFormatClass({ index: 0, str: '.ldr_srgb', }); const LDR_LINEAR = new HdriFormatClass({ index: 1, str: '.ldr_linear', }); const HDR_LINEAR = new HdriFormatClass({ index: 2, str: '.hdr' }); const RGBE_PNG = new HdriFormatClass({ index: 3, str: '.rgbe.png', }); const RGB9_E5_PNG = new HdriFormatClass({ index: 4, str: '.rgb9_e5.png', }); const OpenEXR = new HdriFormatClass({ index: 5, str: '.exr' }); const typeList = [LDR_SRGB, LDR_LINEAR, HDR_LINEAR, RGBE_PNG, RGB9_E5_PNG, OpenEXR]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const HdriFormat = Object.freeze({ LDR_SRGB, LDR_LINEAR, HDR_LINEAR, RGBE_PNG, RGB9_E5_PNG, OpenEXR, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/LightType.ts": /*!*************************************************!*\ !*** ./src/foundation/definitions/LightType.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LightType: () => (/* binding */ LightType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class LightTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Directional = new LightTypeClass({ index: 0, str: 'Directional', }); const Point = new LightTypeClass({ index: 1, str: 'Point' }); const Spot = new LightTypeClass({ index: 2, str: 'Spot' }); const Ambient = new LightTypeClass({ index: 3, str: 'Ambient' }); const typeList = [Point, Directional, Spot, Ambient]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const LightType = Object.freeze({ Point, Directional, Spot, Ambient, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/PhysicsShapeType.ts": /*!********************************************************!*\ !*** ./src/foundation/definitions/PhysicsShapeType.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PhysicsShape: () => (/* binding */ PhysicsShape) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class PhysicsShapeTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Sphere = new PhysicsShapeTypeClass({ index: 0, str: 'Sphere', }); const Box = new PhysicsShapeTypeClass({ index: 1, str: 'Box', }); const typeList = [Sphere, Box]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const PhysicsShape = Object.freeze({ Sphere, Box, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/PixelFormat.ts": /*!***************************************************!*\ !*** ./src/foundation/definitions/PixelFormat.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PixelFormat: () => (/* binding */ PixelFormat) /* harmony export */ }); /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../types */ "./src/types/index.ts"); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class PixelFormatClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_1__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const DepthComponent = new PixelFormatClass({ index: 0x1902, str: 'DEPTH_COMPONENT', }); const DepthStencil = new PixelFormatClass({ index: 0x84f9, str: 'DEPTH_STENCIL', }); const Alpha = new PixelFormatClass({ index: 0x1906, str: 'ALPHA', }); const RG = new PixelFormatClass({ index: _types__WEBPACK_IMPORTED_MODULE_0__.GL_RG, str: 'RG', }); const RGB = new PixelFormatClass({ index: 0x1907, str: 'RGB', }); const RGBA = new PixelFormatClass({ index: 0x1908, str: 'RGBA', }); const Luminance = new PixelFormatClass({ index: 0x1909, str: 'LUMINANCE', }); const LuminanceAlpha = new PixelFormatClass({ index: 0x190a, str: 'LUMINANCE_ALPHA', }); function getCompositionNumFromPixelFormat(pixelFormat) { switch (pixelFormat) { case DepthComponent: return 1; case DepthStencil: return 2; case Alpha: return 1; case RG: return 2; case RGB: return 3; case RGBA: return 4; case Luminance: return 1; case LuminanceAlpha: return 2; default: throw new Error(`Not supported ${pixelFormat}`); } } const typeList = [DepthComponent, DepthStencil, Alpha, RG, RGB, RGBA, Luminance, LuminanceAlpha]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_1__._from)({ typeList, index }); } const PixelFormat = Object.freeze({ DepthComponent, DepthStencil, Alpha, RG, RGB, RGBA, Luminance, LuminanceAlpha, from, getCompositionNumFromPixelFormat, }); /***/ }), /***/ "./src/foundation/definitions/PrimitiveMode.ts": /*!*****************************************************!*\ !*** ./src/foundation/definitions/PrimitiveMode.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PrimitiveMode: () => (/* binding */ PrimitiveMode) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class PrimitiveModeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } getWebGPUTypeStr() { switch (this.index) { case 0: return 'point-list'; case 1: return 'line-list'; case 2: throw new Error('Not Supported in WebGPU'); case 3: return 'line-strip'; case 4: return 'triangle-list'; case 5: return 'triangle-strip'; case 6: throw new Error('Not Supported in WebGPU'); default: throw new Error('Not Supported in WebGPU'); } } } const Unknown = new PrimitiveModeClass({ index: -1, str: 'UNKNOWN', }); const Points = new PrimitiveModeClass({ index: 0, str: 'POINTS', }); const Lines = new PrimitiveModeClass({ index: 1, str: 'LINES', }); const LineLoop = new PrimitiveModeClass({ index: 2, str: 'LINE_LOOP', }); const LineStrip = new PrimitiveModeClass({ index: 3, str: 'LINE_STRIP', }); const Triangles = new PrimitiveModeClass({ index: 4, str: 'TRIANGLES', }); const TriangleStrip = new PrimitiveModeClass({ index: 5, str: 'TRIANGLE_STRIP', }); const TriangleFan = new PrimitiveModeClass({ index: 6, str: 'TRIANGLE_FAN', }); const typeList = [ Unknown, Points, Lines, LineLoop, LineStrip, Triangles, TriangleStrip, TriangleFan, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const PrimitiveMode = Object.freeze({ Unknown, Points, Lines, LineLoop, LineStrip, Triangles, TriangleStrip, TriangleFan, from, }); /***/ }), /***/ "./src/foundation/definitions/ProcessApproach.ts": /*!*******************************************************!*\ !*** ./src/foundation/definitions/ProcessApproach.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ProcessApproach: () => (/* binding */ ProcessApproach), /* harmony export */ ProcessApproachClass: () => (/* binding */ ProcessApproachClass) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ProcessApproachClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } get webGLVersion() { switch (this) { case Uniform: case DataTexture: return 2; default: return 0; } } } const None = new ProcessApproachClass({ index: 0, str: 'NONE', }); const Uniform = new ProcessApproachClass({ index: 1, str: 'UNIFORM', }); const DataTexture = new ProcessApproachClass({ index: 2, str: 'DataTexture', }); const WebGPU = new ProcessApproachClass({ index: 3, str: 'WebGPU', }); const typeList = [None, Uniform, DataTexture]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const isDataTextureApproach = (processApproach) => { switch (processApproach) { case DataTexture: return true; default: return false; } }; const isUniformApproach = (processApproach) => { switch (processApproach) { case Uniform: return true; default: return false; } }; const isWebGpuApproach = (processApproach) => { switch (processApproach) { case WebGPU: return true; default: return false; } }; const isWebGL2Approach = (processApproach) => { switch (processApproach) { case Uniform: case DataTexture: return true; default: return false; } }; const ProcessApproach = Object.freeze({ isDataTextureApproach, isUniformApproach, isWebGpuApproach, None, Uniform, DataTexture, WebGPU, isWebGL2Approach, }); /***/ }), /***/ "./src/foundation/definitions/ProcessStage.ts": /*!****************************************************!*\ !*** ./src/foundation/definitions/ProcessStage.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ProcessStage: () => (/* binding */ ProcessStage) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ProcessStageClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, methodName }) { super({ index, str }); this.methodName = methodName; } } const Unknown = new ProcessStageClass({ index: -1, str: 'UNKNOWN', methodName: '$unknown', }); const Create = new ProcessStageClass({ index: 0, str: 'CREATE', methodName: '$create', }); const Load = new ProcessStageClass({ index: 1, str: 'LOAD', methodName: '$load', }); const Mount = new ProcessStageClass({ index: 2, str: 'MOUNT', methodName: '$mount', }); const Logic = new ProcessStageClass({ index: 3, str: 'LOGIC', methodName: '$logic', }); const PreRender = new ProcessStageClass({ index: 4, str: 'PRE_RENDER', methodName: '$prerender', }); const Render = new ProcessStageClass({ index: 5, str: 'RENDER', methodName: '$render', }); const Unmount = new ProcessStageClass({ index: 6, str: 'UNMOUNT', methodName: '$unmount', }); const Discard = new ProcessStageClass({ index: 7, str: 'DISCARD', methodName: '$discard', }); const typeList = [Unknown, Create, Load, Mount, Logic, PreRender, Render, Unmount, Discard]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const ProcessStage = Object.freeze({ Unknown, Create, Load, Mount, Logic, PreRender, Render, Unmount, Discard, from, }); /***/ }), /***/ "./src/foundation/definitions/RenderBufferTarget.ts": /*!**********************************************************!*\ !*** ./src/foundation/definitions/RenderBufferTarget.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderBufferTarget: () => (/* binding */ RenderBufferTarget) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class RenderBufferTargetClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } webGLConstantValue() { if (this.index === -2) { return 0x0; // gl.NONE } else if (this.index === -1) { return 0x0405; // gl.BACK } return 0x8ce0 + this.index; // GL_COLOR_ATTACHMENT0 = 0x8ce0 } } const None = new RenderBufferTargetClass({ index: -2, str: 'NONE', }); const Back = new RenderBufferTargetClass({ index: -1, str: 'BACK', }); const ColorAttachment0 = new RenderBufferTargetClass({ index: 0, str: 'COLOR_ATTACHMENT0', }); const ColorAttachment1 = new RenderBufferTargetClass({ index: 1, str: 'COLOR_ATTACHMENT1', }); const ColorAttachment2 = new RenderBufferTargetClass({ index: 2, str: 'COLOR_ATTACHMENT2', }); const ColorAttachment3 = new RenderBufferTargetClass({ index: 3, str: 'COLOR_ATTACHMENT3', }); const ColorAttachment4 = new RenderBufferTargetClass({ index: 4, str: 'COLOR_ATTACHMENT4', }); const ColorAttachment5 = new RenderBufferTargetClass({ index: 5, str: 'COLOR_ATTACHMENT5', }); const ColorAttachment6 = new RenderBufferTargetClass({ index: 6, str: 'COLOR_ATTACHMENT6', }); const ColorAttachment7 = new RenderBufferTargetClass({ index: 7, str: 'COLOR_ATTACHMENT7', }); const ColorAttachment8 = new RenderBufferTargetClass({ index: 8, str: 'COLOR_ATTACHMENT8', }); const ColorAttachment9 = new RenderBufferTargetClass({ index: 9, str: 'COLOR_ATTACHMENT9', }); const ColorAttachment10 = new RenderBufferTargetClass({ index: 10, str: 'COLOR_ATTACHMENT10', }); const ColorAttachment11 = new RenderBufferTargetClass({ index: 11, str: 'COLOR_ATTACHMENT11', }); const ColorAttachment12 = new RenderBufferTargetClass({ index: 12, str: 'COLOR_ATTACHMENT12', }); const ColorAttachment13 = new RenderBufferTargetClass({ index: 13, str: 'COLOR_ATTACHMENT13', }); const ColorAttachment14 = new RenderBufferTargetClass({ index: 14, str: 'COLOR_ATTACHMENT14', }); const ColorAttachment15 = new RenderBufferTargetClass({ index: 15, str: 'COLOR_ATTACHMENT15', }); const typeList = [ None, Back, ColorAttachment0, ColorAttachment1, ColorAttachment2, ColorAttachment3, ColorAttachment4, ColorAttachment5, ColorAttachment6, ColorAttachment7, ColorAttachment8, ColorAttachment9, ColorAttachment10, ColorAttachment11, ColorAttachment12, ColorAttachment13, ColorAttachment14, ColorAttachment15, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const RenderBufferTarget = Object.freeze({ None, Back, ColorAttachment0, ColorAttachment1, ColorAttachment2, ColorAttachment3, ColorAttachment4, ColorAttachment5, ColorAttachment6, ColorAttachment7, ColorAttachment8, ColorAttachment9, ColorAttachment10, ColorAttachment11, ColorAttachment12, ColorAttachment13, ColorAttachment14, ColorAttachment15, from, }); /***/ }), /***/ "./src/foundation/definitions/ShaderNode.ts": /*!**************************************************!*\ !*** ./src/foundation/definitions/ShaderNode.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderNode: () => (/* binding */ ShaderNode) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ShaderNodeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const ClassicShading = new ShaderNodeClass({ index: 0, str: 'ClassicShading', }); const PBRShading = new ShaderNodeClass({ index: 1, str: 'PBRShading', }); const Lerp = new ShaderNodeClass({ index: 2, str: 'Lerp' }); const Add = new ShaderNodeClass({ index: 3, str: 'Add' }); const typeList = [ClassicShading, PBRShading]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const ShaderNode = Object.freeze({ ClassicShading, PBRShading, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/ShaderSemantics.ts": /*!*******************************************************!*\ !*** ./src/foundation/definitions/ShaderSemantics.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderSemantics: () => (/* binding */ ShaderSemantics), /* harmony export */ ShaderSemanticsClass: () => (/* binding */ ShaderSemanticsClass), /* harmony export */ _getPropertyIndex2: () => (/* binding */ _getPropertyIndex2) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); /* harmony import */ var _CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CompositionType */ "./src/foundation/definitions/CompositionType.ts"); class ShaderSemanticsClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ str }) { super({ index: ++ShaderSemanticsClass.__indexCount * ShaderSemanticsClass._scale, str, noCheckStrUnique: true, }); ShaderSemanticsClass.__classes[this.index] = this; } static getShaderSemanticByIndex(index) { return this.__classes[Math.abs(index) - (Math.abs(index) % this._scale)]; } static isNonArrayShaderSemanticIndex(index) { if (index >= this._scale) { return true; } else { return false; } } static isArrayAndZeroIndexShaderSemanticIndex(index) { if (index < 0 && Math.abs(index) % ShaderSemanticsClass._scale === 0) { return true; } else { return false; } } static isArrayAndNonZeroIndexShaderSemanticIndex(index) { if (index < 0 && Math.abs(index) % ShaderSemanticsClass._scale !== 0) { return true; } else { return false; } } static getIndexCount() { return ShaderSemanticsClass.__indexCount; } } ShaderSemanticsClass.__indexCount = -1; ShaderSemanticsClass._scale = 10000; ShaderSemanticsClass.__classes = []; const WorldMatrix = new ShaderSemanticsClass({ str: 'worldMatrix', }); const ViewMatrix = new ShaderSemanticsClass({ str: 'viewMatrix', }); const IsBillboard = new ShaderSemanticsClass({ str: 'isBillboard', }); const EnableViewMatrix = new ShaderSemanticsClass({ str: 'enableViewMatrix', }); const ProjectionMatrix = new ShaderSemanticsClass({ str: 'projectionMatrix', }); const NormalMatrix = new ShaderSemanticsClass({ str: 'normalMatrix', }); const BoneMatrix = new ShaderSemanticsClass({ str: 'boneMatrix', }); const BaseColorFactor = new ShaderSemanticsClass({ str: 'baseColorFactor', }); const BaseColorTexture = new ShaderSemanticsClass({ str: 'baseColorTexture', }); const NormalTexture = new ShaderSemanticsClass({ str: 'normalTexture', }); const MetallicRoughnessTexture = new ShaderSemanticsClass({ str: 'metallicRoughnessTexture', }); const OcclusionTexture = new ShaderSemanticsClass({ str: 'occlusionTexture', }); const EmissiveFactor = new ShaderSemanticsClass({ str: 'emissiveFactor', }); const EmissiveTexture = new ShaderSemanticsClass({ str: 'emissiveTexture', }); const LightNumber = new ShaderSemanticsClass({ str: 'lightNumber', }); const LightPosition = new ShaderSemanticsClass({ str: 'lightPosition', }); const LightDirection = new ShaderSemanticsClass({ str: 'lightDirection', }); const LightIntensity = new ShaderSemanticsClass({ str: 'lightIntensity', }); const LightProperty = new ShaderSemanticsClass({ str: 'lightProperty', }); const MetallicRoughnessFactor = new ShaderSemanticsClass({ str: 'metallicRoughnessFactor', }); const BrdfLutTexture = new ShaderSemanticsClass({ str: 'brdfLutTexture', }); const DiffuseEnvTexture = new ShaderSemanticsClass({ str: 'diffuseEnvTexture', }); const SpecularEnvTexture = new ShaderSemanticsClass({ str: 'specularEnvTexture', }); const InverseEnvironment = new ShaderSemanticsClass({ str: 'inverseEnvironment', }); const IBLParameter = new ShaderSemanticsClass({ str: 'iblParameter', }); const ViewPosition = new ShaderSemanticsClass({ str: 'viewPosition', }); const Wireframe = new ShaderSemanticsClass({ str: 'wireframe', }); const DiffuseColorFactor = new ShaderSemanticsClass({ str: 'diffuseColorFactor', }); const DiffuseColorTexture = new ShaderSemanticsClass({ str: 'diffuseColorTexture', }); const Shininess = new ShaderSemanticsClass({ str: 'shininess', }); const ShadingModel = new ShaderSemanticsClass({ str: 'shadingModel', }); const SkinningMode = new ShaderSemanticsClass({ str: 'skinningMode', }); const GeneralTexture = new ShaderSemanticsClass({ str: 'generalTexture', }); const VertexAttributesExistenceArray = new ShaderSemanticsClass({ str: 'vertexAttributesExistenceArray', }); const BoneQuaternion = new ShaderSemanticsClass({ str: 'boneQuaternion', }); const BoneTranslateScale = new ShaderSemanticsClass({ str: 'boneTranslateScale', }); const BoneTranslatePackedQuat = new ShaderSemanticsClass({ str: 'boneTranslatePackedQuat', }); const BoneScalePackedQuat = new ShaderSemanticsClass({ str: 'boneScalePackedQuat', }); const BoneCompressedChunk = new ShaderSemanticsClass({ str: 'boneCompressedChunk', }); const BoneCompressedInfo = new ShaderSemanticsClass({ str: 'boneCompressedInfo', }); const PointSize = new ShaderSemanticsClass({ str: 'pointSize', }); const ColorEnvTexture = new ShaderSemanticsClass({ str: 'colorEnvTexture', }); const PointDistanceAttenuation = new ShaderSemanticsClass({ str: 'pointDistanceAttenuation', }); const HDRIFormat = new ShaderSemanticsClass({ str: 'hdriFormat', }); const ScreenInfo = new ShaderSemanticsClass({ str: 'screenInfo', }); const DepthTexture = new ShaderSemanticsClass({ str: 'depthTexture', }); const LightViewProjectionMatrix = new ShaderSemanticsClass({ str: 'lightViewProjectionMatrix', }); const Anisotropy = new ShaderSemanticsClass({ str: 'anisotropy', }); const ClearCoatParameter = new ShaderSemanticsClass({ str: 'clearcoatParameter', }); const SheenColorFactor = new ShaderSemanticsClass({ str: 'sheenColorFactor', }); const SheenColorTexture = new ShaderSemanticsClass({ str: 'sheenColorTexture', }); const SheenRoughnessFactor = new ShaderSemanticsClass({ str: 'sheenRoughnessFactor', }); const SheenRoughnessTexture = new ShaderSemanticsClass({ str: 'sheenRoughnessTexture', }); const SheenLutTexture = new ShaderSemanticsClass({ str: 'sheenLutTexture', }); const SpecularGlossinessFactor = new ShaderSemanticsClass({ str: 'specularGlossinessFactor', }); const SpecularGlossinessTexture = new ShaderSemanticsClass({ str: 'specularGlossinessTexture', }); const EntityUID = new ShaderSemanticsClass({ str: 'entityUID', }); const MorphTargetNumber = new ShaderSemanticsClass({ str: 'morphTargetNumber', }); // the 16byteoffset (16byte unit offset) of MorphData in DataTexture const DataTextureMorphOffsetPosition = new ShaderSemanticsClass({ str: 'dataTextureMorphOffsetPosition', }); const MorphWeights = new ShaderSemanticsClass({ str: 'morphWeights', }); const CurrentComponentSIDs = new ShaderSemanticsClass({ str: 'currentComponentSIDs', }); const AlphaCutoff = new ShaderSemanticsClass({ str: 'alphaCutoff', }); const AlphaTexture = new ShaderSemanticsClass({ str: 'alphaTexture', }); const MakeOutputSrgb = new ShaderSemanticsClass({ str: 'makeOutputSrgb', }); const FramebufferSize = new ShaderSemanticsClass({ str: 'framebufferSize', }); const ClearCoatFactor = new ShaderSemanticsClass({ str: 'clearCoatFactor', }); const ClearCoatTexture = new ShaderSemanticsClass({ str: 'clearCoatTexture', }); const ClearCoatRoughnessFactor = new ShaderSemanticsClass({ str: 'clearCoatRoughnessFactor', }); const ClearCoatRoughnessTexture = new ShaderSemanticsClass({ str: 'clearCoatRoughnessTexture', }); const ClearCoatNormalTexture = new ShaderSemanticsClass({ str: 'clearCoatNormalTexture', }); const TransmissionFactor = new ShaderSemanticsClass({ str: 'transmissionFactor', }); const TransmissionTexture = new ShaderSemanticsClass({ str: 'transmissionTexture', }); const BackBufferTexture = new ShaderSemanticsClass({ str: 'backBufferTexture', }); const BackBufferTextureSize = new ShaderSemanticsClass({ str: 'backBufferTextureSize', }); const ThicknessFactor = new ShaderSemanticsClass({ str: 'thicknessFactor', }); const ThicknessTexture = new ShaderSemanticsClass({ str: 'thicknessTexture', }); const AttenuationDistance = new ShaderSemanticsClass({ str: 'attenuationDistance', }); const AttenuationColor = new ShaderSemanticsClass({ str: 'attenuationColor', }); const IsOutputHDR = new ShaderSemanticsClass({ str: 'isOutputHDR', }); const BaseColorTextureTransform = new ShaderSemanticsClass({ str: 'baseColorTextureTransform', }); const BaseColorTextureRotation = new ShaderSemanticsClass({ str: 'baseColorTextureRotation', }); const NormalTextureTransform = new ShaderSemanticsClass({ str: 'normalTextureTransform', }); const NormalTextureRotation = new ShaderSemanticsClass({ str: 'normalTextureRotation', }); const MetallicRoughnessTextureTransform = new ShaderSemanticsClass({ str: 'metallicRoughnessTextureTransform', }); const MetallicRoughnessTextureRotation = new ShaderSemanticsClass({ str: 'metallicRoughnessTextureRotation', }); const NormalTexcoordIndex = new ShaderSemanticsClass({ str: 'normalTexcoordIndex', }); const BaseColorTexcoordIndex = new ShaderSemanticsClass({ str: 'baseColorTexcoordIndex', }); const MetallicRoughnessTexcoordIndex = new ShaderSemanticsClass({ str: 'metallicRoughnessTexcoordIndex', }); const OcclusionTexcoordIndex = new ShaderSemanticsClass({ str: 'occlusionTexcoordIndex', }); const OcclusionTextureTransform = new ShaderSemanticsClass({ str: 'occlusionTextureTransform', }); const OcclusionTextureRotation = new ShaderSemanticsClass({ str: 'occlusionTextureRotation', }); const EmissiveTexcoordIndex = new ShaderSemanticsClass({ str: 'emissiveTexcoordIndex', }); const EmissiveTextureTransform = new ShaderSemanticsClass({ str: 'emissiveTextureTransform', }); const EmissiveTextureRotation = new ShaderSemanticsClass({ str: 'emissiveTextureRotation', }); const NormalScale = new ShaderSemanticsClass({ str: 'normalScale' }); const OcclusionStrength = new ShaderSemanticsClass({ str: 'occlusionStrength', }); const envRotation = new ShaderSemanticsClass({ str: 'envRotation' }); const EnvHdriFormat = new ShaderSemanticsClass({ str: 'envHdriFormat' }); const VrState = new ShaderSemanticsClass({ str: 'vrState' }); const EnableLinearToSrgb = new ShaderSemanticsClass({ str: 'enableLinearToSrgb', }); const SpecularFactor = new ShaderSemanticsClass({ str: 'specularFactor' }); const SpecularTexture = new ShaderSemanticsClass({ str: 'specularTexture' }); const SpecularColorFactor = new ShaderSemanticsClass({ str: 'specularColorFactor', }); const SpecularColorTexture = new ShaderSemanticsClass({ str: 'specularColorTexture', }); const Ior = new ShaderSemanticsClass({ str: 'ior' }); const DepthBiasPV = new ShaderSemanticsClass({ str: 'depthBiasPV' }); const ClearCoatTextureTransform = new ShaderSemanticsClass({ str: 'clearCoatTextureTransform', }); const ClearCoatTextureRotation = new ShaderSemanticsClass({ str: 'clearCoatTextureRotation', }); const ClearCoatRoughnessTextureTransform = new ShaderSemanticsClass({ str: 'clearCoatRoughnessTextureTransform', }); const ClearCoatRoughnessTextureRotation = new ShaderSemanticsClass({ str: 'clearCoatRoughnessTextureRotation', }); const ClearCoatNormalTextureTransform = new ShaderSemanticsClass({ str: 'clearCoatNormalTextureTransform', }); const ClearCoatNormalTextureRotation = new ShaderSemanticsClass({ str: 'clearCoatNormalTextureRotation', }); const ClearCoatTexcoordIndex = new ShaderSemanticsClass({ str: 'clearCoatTexcoordIndex', }); const ClearCoatRoughnessTexcoordIndex = new ShaderSemanticsClass({ str: 'clearCoatRoughnessTexcoordIndex', }); const ClearCoatNormalTexcoordIndex = new ShaderSemanticsClass({ str: 'clearCoatNormalTexcoordIndex', }); const IridescenceFactor = new ShaderSemanticsClass({ str: 'iridescenceFactor', }); const IridescenceTexture = new ShaderSemanticsClass({ str: 'iridescenceTexture', }); const IridescenceIor = new ShaderSemanticsClass({ str: 'iridescenceIor', }); const IridescenceThicknessMinimum = new ShaderSemanticsClass({ str: 'iridescenceThicknessMinimum', }); const IridescenceThicknessMaximum = new ShaderSemanticsClass({ str: 'iridescenceThicknessMaximum', }); const IridescenceThicknessTexture = new ShaderSemanticsClass({ str: 'iridescenceThicknessTexture', }); const GaussianKernelSize = new ShaderSemanticsClass({ str: 'gaussianKernelSize', }); const GaussianRatio = new ShaderSemanticsClass({ str: 'gaussianRatio' }); const IsHorizontal = new ShaderSemanticsClass({ str: 'isHorizontal' }); const AnisotropyStrength = new ShaderSemanticsClass({ str: 'anisotropyStrength', }); const AnisotropyRotation = new ShaderSemanticsClass({ str: 'anisotropyRotation', }); const AnisotropyTexture = new ShaderSemanticsClass({ str: 'anisotropyTexture', }); const EmissiveStrength = new ShaderSemanticsClass({ str: 'emissiveStrength', }); const Time = new ShaderSemanticsClass({ str: 'time', }); const CubeMapFaceId = new ShaderSemanticsClass({ str: 'cubeMapFaceId', }); const Roughness = new ShaderSemanticsClass({ str: 'roughness', }); const DistributionType = new ShaderSemanticsClass({ str: 'distributionType', }); const typeList = [ WorldMatrix, ViewMatrix, IsBillboard, EnableViewMatrix, ProjectionMatrix, NormalMatrix, BoneMatrix, BaseColorFactor, BaseColorTexture, NormalTexture, MetallicRoughnessTexture, OcclusionTexture, EmissiveFactor, EmissiveTexture, LightNumber, LightPosition, LightDirection, LightIntensity, LightProperty, MetallicRoughnessFactor, BrdfLutTexture, DiffuseEnvTexture, SpecularEnvTexture, InverseEnvironment, IBLParameter, ViewPosition, Wireframe, DiffuseColorFactor, DiffuseColorTexture, Shininess, ShadingModel, SkinningMode, GeneralTexture, VertexAttributesExistenceArray, BoneQuaternion, BoneTranslateScale, BoneTranslatePackedQuat, BoneScalePackedQuat, BoneCompressedChunk, BoneCompressedInfo, PointSize, ColorEnvTexture, PointDistanceAttenuation, HDRIFormat, ScreenInfo, DepthTexture, LightViewProjectionMatrix, Anisotropy, ClearCoatParameter, SheenColorFactor, SheenColorTexture, SheenRoughnessFactor, SheenRoughnessTexture, SheenLutTexture, SpecularGlossinessFactor, SpecularGlossinessTexture, EntityUID, MorphTargetNumber, DataTextureMorphOffsetPosition, MorphWeights, CurrentComponentSIDs, AlphaCutoff, AlphaTexture, MakeOutputSrgb, ClearCoatFactor, ClearCoatTexture, ClearCoatRoughnessFactor, ClearCoatRoughnessTexture, ClearCoatNormalTexture, TransmissionFactor, TransmissionTexture, BackBufferTexture, BackBufferTextureSize, ThicknessFactor, ThicknessTexture, AttenuationDistance, AttenuationColor, IsOutputHDR, BaseColorTextureTransform, BaseColorTextureRotation, NormalTextureTransform, NormalTextureRotation, MetallicRoughnessTextureTransform, MetallicRoughnessTextureRotation, NormalTexcoordIndex, BaseColorTexcoordIndex, MetallicRoughnessTexcoordIndex, OcclusionTexcoordIndex, OcclusionTextureTransform, OcclusionTextureRotation, EmissiveTexcoordIndex, EmissiveTextureTransform, EmissiveTextureRotation, NormalScale, OcclusionStrength, envRotation, EnvHdriFormat, VrState, EnableLinearToSrgb, SpecularFactor, SpecularTexture, SpecularColorFactor, SpecularColorTexture, Ior, DepthBiasPV, ClearCoatTextureTransform, ClearCoatTextureRotation, ClearCoatRoughnessTextureTransform, ClearCoatRoughnessTextureRotation, ClearCoatNormalTextureTransform, ClearCoatNormalTextureRotation, ClearCoatTexcoordIndex, ClearCoatRoughnessTexcoordIndex, ClearCoatNormalTexcoordIndex, IridescenceFactor, IridescenceTexture, IridescenceIor, IridescenceThicknessMinimum, IridescenceThicknessMaximum, IridescenceThicknessTexture, GaussianKernelSize, GaussianRatio, IsHorizontal, AnisotropyStrength, AnisotropyRotation, AnisotropyTexture, EmissiveStrength, Time, CubeMapFaceId, Roughness, DistributionType, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } function fromStringCaseSensitively(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromStringCaseSensitively)({ typeList, str }); } const getShaderProperty = (materialTypeName, info, isGlobalData, isWebGL2) => { const returnType = info.compositionType.getGlslStr(info.componentType); let variableName = info.semantic; // definition of uniform variable const varType = info.compositionType.getGlslStr(info.componentType); let varIndexStr = ''; if (info.arrayLength) { varIndexStr = `[${info.arrayLength}]`; } const varDef = ` uniform ${varType} u_${variableName}${varIndexStr};\n`; // inner contents of 'get_' shader function let str = ''; if (_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.isArray(info.compositionType)) { if (variableName.match(/\[.+?\]/)) { variableName = variableName.replace(/\[.+?\]/g, '[i]'); } else { variableName += '[i]'; } str += ` ${returnType} val; int i = index; return u_${variableName}; `; } else { // is Not Array str += `return u_${variableName};`; } let funcDef = ''; const isTexture = _CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.isTexture(info.compositionType); if (!isTexture) { funcDef = ` ${returnType} get_${info.semantic}(float instanceId, int index) { ${str} } `; } return `${varDef}${funcDef}`; }; /** * @internal */ function _getPropertyIndex2(shaderSemantic) { const propertyIndex = shaderSemantic.index; return propertyIndex; } const ShaderSemantics = Object.freeze({ from, fromString, fromStringCaseSensitively, WorldMatrix, ViewMatrix, IsBillboard, EnableViewMatrix, ProjectionMatrix, NormalMatrix, BoneMatrix, BaseColorFactor, BaseColorTexture, NormalTexture, MetallicRoughnessTexture, OcclusionTexture, EmissiveFactor, EmissiveTexture, LightNumber, LightPosition, LightDirection, LightIntensity, LightProperty, MetallicRoughnessFactor, BrdfLutTexture, DiffuseEnvTexture, SpecularEnvTexture, InverseEnvironment, IBLParameter, ViewPosition, Wireframe, DiffuseColorFactor, DiffuseColorTexture, Shininess, ShadingModel, SkinningMode, GeneralTexture, VertexAttributesExistenceArray, BoneQuaternion, BoneTranslateScale, BoneTranslatePackedQuat, BoneScalePackedQuat, BoneCompressedChunk, BoneCompressedInfo, PointSize, ColorEnvTexture, PointDistanceAttenuation, HDRIFormat, ScreenInfo, DepthTexture, LightViewProjectionMatrix, Anisotropy, ClearCoatParameter, SheenColorFactor, SheenColorTexture, SheenRoughnessFactor, SheenRoughnessTexture, SheenLutTexture, SpecularGlossinessFactor, SpecularGlossinessTexture, ClearCoatFactor, ClearCoatTexture, ClearCoatRoughnessFactor, ClearCoatRoughnessTexture, ClearCoatNormalTexture, TransmissionFactor, TransmissionTexture, BackBufferTexture, BackBufferTextureSize, ThicknessFactor, ThicknessTexture, AttenuationDistance, AttenuationColor, getShaderProperty, EntityUID, MorphTargetNumber, DataTextureMorphOffsetPosition, MorphWeights, CurrentComponentSIDs, AlphaCutoff, AlphaTexture, MakeOutputSrgb, FramebufferSize, IsOutputHDR, BaseColorTextureTransform, BaseColorTextureRotation, NormalTextureTransform, NormalTextureRotation, MetallicRoughnessTextureTransform, MetallicRoughnessTextureRotation, NormalTexcoordIndex, BaseColorTexcoordIndex, MetallicRoughnessTexcoordIndex, OcclusionTexcoordIndex, OcclusionTextureTransform, OcclusionTextureRotation, EmissiveTexcoordIndex, EmissiveTextureTransform, EmissiveTextureRotation, NormalScale, OcclusionStrength, envRotation, EnvHdriFormat, VrState, EnableLinearToSrgb, SpecularFactor, SpecularTexture, SpecularColorFactor, SpecularColorTexture, Ior, DepthBiasPV, ClearCoatTextureTransform, ClearCoatTextureRotation, ClearCoatRoughnessTextureTransform, ClearCoatRoughnessTextureRotation, ClearCoatNormalTextureTransform, ClearCoatNormalTextureRotation, ClearCoatTexcoordIndex, ClearCoatRoughnessTexcoordIndex, ClearCoatNormalTexcoordIndex, IridescenceFactor, IridescenceTexture, IridescenceIor, IridescenceThicknessMinimum, IridescenceThicknessMaximum, IridescenceThicknessTexture, GaussianKernelSize, GaussianRatio, IsHorizontal, AnisotropyStrength, AnisotropyRotation, AnisotropyTexture, EmissiveStrength, Time, CubeMapFaceId, Roughness, DistributionType, }); /***/ }), /***/ "./src/foundation/definitions/ShaderSemanticsInfo.ts": /*!***********************************************************!*\ !*** ./src/foundation/definitions/ShaderSemanticsInfo.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ calcAlignedByteLength: () => (/* binding */ calcAlignedByteLength) /* harmony export */ }); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* harmony import */ var _CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CompositionType */ "./src/foundation/definitions/CompositionType.ts"); function calcAlignedByteLength(semanticInfo) { const compositionNumber = semanticInfo.compositionType.getNumberOfComponents(); const componentSizeInByte = semanticInfo.componentType.getSizeInBytes(); const semanticInfoByte = compositionNumber * componentSizeInByte; let alignedByteLength = semanticInfoByte; if (alignedByteLength % 16 !== 0) { alignedByteLength = semanticInfoByte + 16 - (semanticInfoByte % 16); } if (_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.isArray(semanticInfo.compositionType)) { const maxArrayLength = semanticInfo.arrayLength; if (maxArrayLength != null) { alignedByteLength *= maxArrayLength; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_0__.Logger.error('semanticInfo has invalid maxIndex!'); alignedByteLength *= 100; } } return alignedByteLength; } /***/ }), /***/ "./src/foundation/definitions/ShaderType.ts": /*!**************************************************!*\ !*** ./src/foundation/definitions/ShaderType.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderType: () => (/* binding */ ShaderType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ShaderTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const VertexShader = new ShaderTypeClass({ index: 1, str: 'VertexShader', }); const PixelShader = new ShaderTypeClass({ index: 2, str: 'PixelShader', }); const VertexAndPixelShader = new ShaderTypeClass({ index: 3, str: 'VertexAndPixelShader', }); const ComputeShader = new ShaderTypeClass({ index: 4, str: 'ComputeShader', }); const typeList = [VertexShader, PixelShader, VertexAndPixelShader, ComputeShader]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const ShaderType = Object.freeze({ VertexShader, PixelShader, VertexAndPixelShader, ComputeShader, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/ShaderVariableType.ts": /*!**********************************************************!*\ !*** ./src/foundation/definitions/ShaderVariableType.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderVariableType: () => (/* binding */ ShaderVariableType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ShaderVariableTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Varying = new ShaderVariableTypeClass({ index: 1, str: 'Varying', }); const ReadOnlyData = new ShaderVariableTypeClass({ index: 2, str: 'ReadOnlyData', }); const typeList = [Varying, ReadOnlyData]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const ShaderVariableType = Object.freeze({ Varying, ReadOnlyData, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/ShadingModel.ts": /*!****************************************************!*\ !*** ./src/foundation/definitions/ShadingModel.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShadingModel: () => (/* binding */ ShadingModel) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ShadingModelClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Unknown = new ShadingModelClass({ index: -1, str: 'UNKNOWN', }); const Constant = new ShadingModelClass({ index: 0, str: 'CONSTANT', }); const Lambert = new ShadingModelClass({ index: 1, str: 'LAMBERT', }); const BlinnPhong = new ShadingModelClass({ index: 2, str: 'BLINN', }); const Phong = new ShadingModelClass({ index: 3, str: 'PHONG' }); const typeList = [Unknown, Constant, Lambert, BlinnPhong, Phong]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const ShadingModel = Object.freeze({ Unknown, Constant, Lambert, BlinnPhong, Phong, from, }); /***/ }), /***/ "./src/foundation/definitions/ShadowMap.ts": /*!*************************************************!*\ !*** ./src/foundation/definitions/ShadowMap.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShadowMap: () => (/* binding */ ShadowMap) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ShadowMapClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Standard = new ShadowMapClass({ index: 0, str: 'Standard' }); const Variance = new ShadowMapClass({ index: 1, str: 'Variance' }); const typeList = [Standard, Variance]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const ShadowMap = Object.freeze({ Standard, Variance, from, fromString }); /***/ }), /***/ "./src/foundation/definitions/TextureFormat.ts": /*!*****************************************************!*\ !*** ./src/foundation/definitions/TextureFormat.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TextureFormat: () => (/* binding */ TextureFormat) /* harmony export */ }); /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../types */ "./src/types/index.ts"); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); /* harmony import */ var _ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _PixelFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); class TextureFormatClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_1__.EnumClass { constructor({ index, str, webgpu }) { super({ index, str }); this.__webgpu = webgpu; } get webgpu() { if (this.__webgpu === undefined) { throw new Error(`does not support ${this.str}`); } return this.__webgpu; } } const RGB8 = new TextureFormatClass({ index: 0x8051, str: 'RGB8', webgpu: 'rgb8unorm', }); const RGBA8 = new TextureFormatClass({ index: 0x8058, str: 'RGBA8', webgpu: 'rgba8unorm', }); const RGB10_A2 = new TextureFormatClass({ index: 0x8059, str: 'RGB10_A2', webgpu: 'rgb10a2unorm', }); const RG16F = new TextureFormatClass({ index: _types__WEBPACK_IMPORTED_MODULE_0__.GL_RG16F, str: 'RG16F', webgpu: 'rg16float', }); const RG32F = new TextureFormatClass({ index: _types__WEBPACK_IMPORTED_MODULE_0__.GL_RG32F, str: 'RG32F', webgpu: 'rg32float', }); const RGB16F = new TextureFormatClass({ index: 0x881b, str: 'RGB16F', webgpu: 'rgba16float', }); const RGB32F = new TextureFormatClass({ index: 0x8815, str: 'RGB32F', webgpu: 'rgba32float', }); const RGBA16F = new TextureFormatClass({ index: 0x881a, str: 'RGBA16F', webgpu: 'rgba16float', }); const RGBA32F = new TextureFormatClass({ index: 0x8814, str: 'RGBA32F', webgpu: 'rgba32float', }); const R11F_G11F_B10F = new TextureFormatClass({ index: 0x8c3a, str: 'R11F_G11F_B10F', webgpu: 'rg11b10ufloat', }); const Depth16 = new TextureFormatClass({ index: 0x81a5, str: 'DEPTH_COMPONENT16', webgpu: 'depth16unorm', }); const Depth24 = new TextureFormatClass({ index: 0x81a6, str: 'DEPTH_COMPONENT24', webgpu: 'depth24plus', }); const Depth32F = new TextureFormatClass({ index: 0x8cac, str: 'DEPTH_COMPONENT32F', webgpu: 'depth32float', }); const Depth24Stencil8 = new TextureFormatClass({ index: 0x88f0, str: 'DEPTH24_STENCIL8', webgpu: 'depth24plus-stencil8', }); const Depth32FStencil8 = new TextureFormatClass({ index: 0x8cad, str: 'DEPTH32F_STENCIL8', webgpu: 'depth32float-stencil8', }); function getPixelFormatFromTextureFormat(textureFormat) { switch (textureFormat) { case RGB8: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; case RGBA8: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; case RGB10_A2: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; case RG16F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RG; case RG32F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RG; case RGB16F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; case RGB32F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; case RGBA16F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; case RGBA32F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; case R11F_G11F_B10F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; case Depth16: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthComponent; case Depth24: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthComponent; case Depth32F: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthComponent; case Depth24Stencil8: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthStencil; case Depth32FStencil8: return _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthStencil; default: throw new Error(`Not implemented yet: ${textureFormat}`); } } function getPixelFormatAndComponentTypeFromTextureFormat(internalFormat) { let format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; let type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte; if (internalFormat === TextureFormat.RGB8) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte; } else if (internalFormat === TextureFormat.RGBA8) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte; } else if (internalFormat === TextureFormat.RGB10_A2) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte; } else if (internalFormat === TextureFormat.RG16F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RG; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.HalfFloat; } else if (internalFormat === TextureFormat.RG32F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RG; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float; } else if (internalFormat === TextureFormat.RGB16F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.HalfFloat; } else if (internalFormat === TextureFormat.RGB32F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float; } else if (internalFormat === TextureFormat.RGBA16F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.HalfFloat; } else if (internalFormat === TextureFormat.RGBA32F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float; } else if (internalFormat === TextureFormat.R11F_G11F_B10F) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGB; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float; } else if (internalFormat === TextureFormat.Depth16) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthComponent; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedShort; } else if (internalFormat === TextureFormat.Depth24 || internalFormat === TextureFormat.Depth24Stencil8) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthComponent; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedInt; } else if (internalFormat === TextureFormat.Depth32F || internalFormat === TextureFormat.Depth32FStencil8) { format = _PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthComponent; type = _ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float; } return { format, type }; } const typeList = [ RGB8, RGBA8, RGB10_A2, RG16F, RG32F, RGB16F, RGB32F, RGBA16F, RGBA32F, R11F_G11F_B10F, Depth16, Depth24, Depth32F, Depth24Stencil8, Depth32FStencil8, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_1__._from)({ typeList, index }); } const TextureFormat = Object.freeze({ RGB8, RGBA8, RGB10_A2, RG16F, RG32F, RGB16F, RGB32F, RGBA16F, RGBA32F, R11F_G11F_B10F, Depth16, Depth24, Depth32F, Depth24Stencil8, Depth32FStencil8, getPixelFormatFromTextureFormat, getPixelFormatAndComponentTypeFromTextureFormat, from, }); /***/ }), /***/ "./src/foundation/definitions/TextureParameter.ts": /*!********************************************************!*\ !*** ./src/foundation/definitions/TextureParameter.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TextureParameter: () => (/* binding */ TextureParameter) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class TextureParameterClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str, webgpu }) { super({ index, str }); this.__webgpu = webgpu; } get webgpu() { if (this.__webgpu === undefined) { throw new Error(`does not support ${this.str}`); } return this.__webgpu; } } const Nearest = new TextureParameterClass({ index: 0x2600, str: 'NEAREST', webgpu: 'nearest', }); const Linear = new TextureParameterClass({ index: 0x2601, str: 'LINEAR', webgpu: 'linear', }); const NearestMipmapNearest = new TextureParameterClass({ index: 0x2700, str: 'NEAREST_MIPMAP_NEAREST', webgpu: 'nearest', }); const LinearMipmapNearest = new TextureParameterClass({ index: 0x2701, str: 'LINEAR_MIPMAP_NEAREST', webgpu: 'linear', }); const NearestMipmapLinear = new TextureParameterClass({ index: 0x2702, str: 'NEAREST_MIPMAP_LINEAR', webgpu: 'nearest', }); const LinearMipmapLinear = new TextureParameterClass({ index: 0x2703, str: 'LINEAR_MIPMAP_LINEAR', webgpu: 'linear', }); const TextureMagFilter = new TextureParameterClass({ index: 0x2800, str: 'TEXTURE_MAG_FILTER', }); const TextureMinFilter = new TextureParameterClass({ index: 0x2801, str: 'TEXTURE_MIN_FILTER', }); const TextureWrapS = new TextureParameterClass({ index: 0x2802, str: 'TEXTURE_WRAP_S', }); const TextureWrapT = new TextureParameterClass({ index: 0x2803, str: 'TEXTURE_WRAP_T', }); const Texture2D = new TextureParameterClass({ index: 0x0de1, str: 'TEXTURE_2D', }); const Texture = new TextureParameterClass({ index: 0x1702, str: 'TEXTURE', }); const Texture0 = new TextureParameterClass({ index: 0x84c0, str: 'TEXTURE0', }); const Texture1 = new TextureParameterClass({ index: 0x84c1, str: 'TEXTURE1', }); const ActiveTexture = new TextureParameterClass({ index: 0x84e0, str: 'ACTIVE_TEXTURE', }); const Repeat = new TextureParameterClass({ index: 0x2901, str: 'REPEAT', webgpu: 'repeat', }); const ClampToEdge = new TextureParameterClass({ index: 0x812f, str: 'CLAMP_TO_EDGE', webgpu: 'clamp-to-edge', }); const MirroredRepeat = new TextureParameterClass({ index: 0x8370, str: 'MIRRORED_REPEAT', webgpu: 'mirror-repeat', }); const typeList = [ Nearest, Linear, NearestMipmapNearest, LinearMipmapNearest, NearestMipmapLinear, LinearMipmapLinear, TextureMagFilter, TextureMinFilter, TextureWrapS, TextureWrapT, Texture2D, Texture, Texture0, Texture1, ActiveTexture, Repeat, ClampToEdge, MirroredRepeat, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const TextureParameter = Object.freeze({ Nearest, Linear, NearestMipmapNearest, LinearMipmapNearest, NearestMipmapLinear, LinearMipmapLinear, TextureMagFilter, TextureMinFilter, TextureWrapS, TextureWrapT, Texture2D, Texture, Texture0, Texture1, ActiveTexture, Repeat, ClampToEdge, MirroredRepeat, from, }); /***/ }), /***/ "./src/foundation/definitions/ToneMappingType.ts": /*!*******************************************************!*\ !*** ./src/foundation/definitions/ToneMappingType.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ToneMappingType: () => (/* binding */ ToneMappingType) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class ToneMappingTypeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const None = new ToneMappingTypeClass({ index: -1, str: 'None', }); const KhronosPbrNeutral = new ToneMappingTypeClass({ index: 0, str: 'Khronos_PBR_Neutral', }); const Reinhard = new ToneMappingTypeClass({ index: 1, str: 'Reinhard', }); const GT_ToneMap = new ToneMappingTypeClass({ index: 2, str: 'GT_ToneMap', }); const ACES_Narkowicz = new ToneMappingTypeClass({ index: 3, str: 'ACES_Filmic_ToneMap_Narkowicz', }); const ACES_Hill = new ToneMappingTypeClass({ index: 4, str: 'ACES_Filmic_ToneMap_Hill', }); const ACES_Hill_Exposure_Boost = new ToneMappingTypeClass({ index: 5, str: 'ACES_Filmic_ToneMap_Hill_Exposure_Boost', }); const typeList = [ None, KhronosPbrNeutral, Reinhard, GT_ToneMap, ACES_Narkowicz, ACES_Hill, ACES_Hill_Exposure_Boost, ]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const ToneMappingType = Object.freeze({ None, KhronosPbrNeutral, Reinhard, GT_ToneMap, ACES_Narkowicz, ACES_Hill, ACES_Hill_Exposure_Boost, from, }); /***/ }), /***/ "./src/foundation/definitions/VertexAttribute.ts": /*!*******************************************************!*\ !*** ./src/foundation/definitions/VertexAttribute.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VertexAttribute: () => (/* binding */ VertexAttribute), /* harmony export */ VertexAttributeClass: () => (/* binding */ VertexAttributeClass) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); /* harmony import */ var _misc_RnException__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/RnException */ "./src/foundation/misc/RnException.ts"); class VertexAttributeClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ str, shaderStr, attributeSlot, gltfComponentN, }) { super({ index: VertexAttributeClass.__indexCount++, str }); this.__attributeSlot = attributeSlot; this.__shaderStr = shaderStr; this.__gltfComponentN = gltfComponentN; } getAttributeSlot() { return this.__attributeSlot; } get shaderStr() { return this.__shaderStr; } get attributeTypeName() { return this.str; } _setShaderStr(str) { this.__shaderStr = this.__shaderStr + str; } get X() { return `${this.attributeTypeName}.X`; } get Y() { return `${this.attributeTypeName}.Y`; } get Z() { return `${this.attributeTypeName}.Z`; } get W() { return `${this.attributeTypeName}.W`; } get XY() { return `${this.attributeTypeName}.X,${this.attributeTypeName}.Y`; } get XYZ() { return `${this.attributeTypeName}.X,${this.attributeTypeName}.Y,${this.attributeTypeName}.Z`; } get XYZW() { return `${this.attributeTypeName}.X,${this.attributeTypeName}.Y,${this.attributeTypeName}.Z,${this.attributeTypeName}.W`; } getVertexAttributeComponentsAsGltf() { if (this.__gltfComponentN === 1) { return this.X; } else if (this.__gltfComponentN === 2) { return this.XY; } else if (this.__gltfComponentN === 3) { return this.XYZ; } else if (this.__gltfComponentN === 4) { return this.XYZW; } else { throw new _misc_RnException__WEBPACK_IMPORTED_MODULE_1__.RnException({ message: 'Invalid gltf component number', error: this.__gltfComponentN, }); } } static __createVertexAttributeClass(desc) { return new VertexAttributeClass(desc); } } VertexAttributeClass.__indexCount = -1; const Unknown = VertexAttributeClass.__createVertexAttributeClass({ str: 'UNKNOWN', shaderStr: 'a_unknown', attributeSlot: -1, gltfComponentN: 0, }); const Position = VertexAttributeClass.__createVertexAttributeClass({ str: 'POSITION', shaderStr: 'a_position', attributeSlot: 0, gltfComponentN: 3, }); const Normal = VertexAttributeClass.__createVertexAttributeClass({ str: 'NORMAL', shaderStr: 'a_normal', attributeSlot: 1, gltfComponentN: 3, }); const Tangent = VertexAttributeClass.__createVertexAttributeClass({ str: 'TANGENT', shaderStr: 'a_tangent', attributeSlot: 2, gltfComponentN: 4, }); const Texcoord0 = VertexAttributeClass.__createVertexAttributeClass({ str: 'TEXCOORD_0', shaderStr: 'a_texcoord_0', attributeSlot: 3, gltfComponentN: 2, }); const Texcoord1 = VertexAttributeClass.__createVertexAttributeClass({ str: 'TEXCOORD_1', shaderStr: 'a_texcoord_1', attributeSlot: 4, gltfComponentN: 2, }); const Color0 = VertexAttributeClass.__createVertexAttributeClass({ str: 'COLOR_0', shaderStr: 'a_color_0', attributeSlot: 5, gltfComponentN: 4, }); const Joints0 = VertexAttributeClass.__createVertexAttributeClass({ str: 'JOINTS_0', shaderStr: 'a_joints_0', attributeSlot: 6, gltfComponentN: 4, }); const Weights0 = VertexAttributeClass.__createVertexAttributeClass({ str: 'WEIGHTS_0', shaderStr: 'a_weights_0', attributeSlot: 7, gltfComponentN: 4, }); const Instance = VertexAttributeClass.__createVertexAttributeClass({ str: 'INSTANCE', shaderStr: 'a_instanceInfo', attributeSlot: 8, gltfComponentN: 4, }); const FaceNormal = VertexAttributeClass.__createVertexAttributeClass({ str: 'FACE_NORMAL', shaderStr: 'a_faceNormal', attributeSlot: 9, gltfComponentN: 3, }); const BaryCentricCoord = VertexAttributeClass.__createVertexAttributeClass({ str: 'BARY_CENTRIC_COORD', shaderStr: 'a_baryCentricCoord', attributeSlot: 10, gltfComponentN: 4, }); const Texcoord2 = VertexAttributeClass.__createVertexAttributeClass({ str: 'TEXCOORD_2', shaderStr: 'a_texcoord_2', attributeSlot: 11, gltfComponentN: 2, }); const typeList = [ Unknown, // -1 Position, // 0 Normal, Tangent, Texcoord0, Texcoord1, Color0, Joints0, Weights0, Instance, FaceNormal, BaryCentricCoord, Texcoord2, ]; const AttributeTypeNumber = typeList.length - 1; function isInstanceOfVertexAttributeClass(obj) { return obj instanceof VertexAttributeClass; } function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { let newStr = str; if (str === 'COLOR') { newStr = 'COLOR_0'; } else if (str === 'TEXCOORD') { newStr = 'TEXCOORD_0'; } else if (str === 'JOINTS') { newStr = 'JOINTS_0'; } else if (str === 'WEIGHTS') { newStr = 'WEIGHTS_0'; } return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str: newStr }); } function toVertexAttributeSemanticJoinedStringAsGltfStyle(attribute) { switch (attribute) { case Position: return attribute.XYZ; case Color0: return attribute.XYZ; case Normal: return attribute.XYZ; case Tangent: return attribute.XYZ; case Texcoord0: return attribute.XY; case Texcoord1: return attribute.XY; case Texcoord2: return attribute.XY; case Joints0: return attribute.XYZW; case Weights0: return attribute.XYZW; case Instance: return attribute.XYZW; case FaceNormal: return attribute.XYZW; case BaryCentricCoord: return attribute.XYZW; default: throw new Error('Invalied glTF VertexAttributeEnum'); } } function toAttributeSlotFromJoinedString(str) { switch (str) { case Position.XYZ: return Position.getAttributeSlot(); case Color0.XYZ: return Color0.getAttributeSlot(); case Normal.XYZ: return Normal.getAttributeSlot(); case Tangent.XYZ: return Tangent.getAttributeSlot(); case Texcoord0.XY: return Texcoord0.getAttributeSlot(); case Texcoord1.XY: return Texcoord1.getAttributeSlot(); case Texcoord2.XY: return Texcoord2.getAttributeSlot(); case Joints0.XYZW: return Joints0.getAttributeSlot(); case Weights0.XYZW: return Weights0.getAttributeSlot(); case Instance.XYZW: return Instance.getAttributeSlot(); case FaceNormal.XYZ: return FaceNormal.getAttributeSlot(); case BaryCentricCoord.XYZ: return BaryCentricCoord.getAttributeSlot(); default: throw new Error('Invalied glTF VertexAttributeEnum'); } } function toVectorComponentN(joinedString) { return joinedString.split(',').length; } const VertexAttribute = Object.freeze({ Unknown, Position, Normal, Tangent, Texcoord0, Texcoord1, Color0, Joints0, Weights0, Instance, FaceNormal, BaryCentricCoord, AttributeTypeNumber, isInstanceOfVertexAttributeClass, toVertexAttributeSemanticJoinedStringAsGltfStyle, toAttributeSlotFromJoinedString, toVectorComponentN, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/Visibility.ts": /*!**************************************************!*\ !*** ./src/foundation/definitions/Visibility.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Visibility: () => (/* binding */ Visibility) /* harmony export */ }); /* harmony import */ var _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class VisibilityClass extends _misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const Neutral = new VisibilityClass({ index: 0, str: 'Neutral' }); const Visible = new VisibilityClass({ index: 1, str: 'Visible' }); const Invisible = new VisibilityClass({ index: -1, str: 'Invisible', }); const typeList = [Visible, Invisible, Neutral]; function from(index) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } function fromString(str) { return (0,_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._fromString)({ typeList, str }); } const Visibility = Object.freeze({ Visible, Invisible, Neutral, from, fromString, }); /***/ }), /***/ "./src/foundation/definitions/index.ts": /*!*********************************************!*\ !*** ./src/foundation/definitions/index.ts ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AlphaMode: () => (/* reexport safe */ _AlphaMode__WEBPACK_IMPORTED_MODULE_0__.AlphaMode), /* harmony export */ AnimationAttribute: () => (/* reexport safe */ _AnimationAttribute__WEBPACK_IMPORTED_MODULE_1__.AnimationAttribute), /* harmony export */ AnimationInterpolation: () => (/* reexport safe */ _AnimationInterpolation__WEBPACK_IMPORTED_MODULE_2__.AnimationInterpolation), /* harmony export */ BasisCompressionType: () => (/* reexport safe */ _BasisCompressionType__WEBPACK_IMPORTED_MODULE_3__.BasisCompressionType), /* harmony export */ BoneDataType: () => (/* reexport safe */ _BoneDataType__WEBPACK_IMPORTED_MODULE_4__.BoneDataType), /* harmony export */ BufferUse: () => (/* reexport safe */ _BufferUse__WEBPACK_IMPORTED_MODULE_5__.BufferUse), /* harmony export */ CameraControllerType: () => (/* reexport safe */ _CameraControllerType__WEBPACK_IMPORTED_MODULE_6__.CameraControllerType), /* harmony export */ CameraType: () => (/* reexport safe */ _CameraType__WEBPACK_IMPORTED_MODULE_7__.CameraType), /* harmony export */ ComponentType: () => (/* reexport safe */ _ComponentType__WEBPACK_IMPORTED_MODULE_8__.ComponentType), /* harmony export */ CompositionType: () => (/* reexport safe */ _CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType), /* harmony export */ CompressionTextureType: () => (/* reexport safe */ _CompressionTextureType__WEBPACK_IMPORTED_MODULE_10__.CompressionTextureType), /* harmony export */ FileType: () => (/* reexport safe */ _FileType__WEBPACK_IMPORTED_MODULE_11__.FileType), /* harmony export */ HdriFormat: () => (/* reexport safe */ _HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat), /* harmony export */ LightType: () => (/* reexport safe */ _LightType__WEBPACK_IMPORTED_MODULE_13__.LightType), /* harmony export */ PixelFormat: () => (/* reexport safe */ _PixelFormat__WEBPACK_IMPORTED_MODULE_14__.PixelFormat), /* harmony export */ PrimitiveMode: () => (/* reexport safe */ _PrimitiveMode__WEBPACK_IMPORTED_MODULE_15__.PrimitiveMode), /* harmony export */ ProcessApproach: () => (/* reexport safe */ _ProcessApproach__WEBPACK_IMPORTED_MODULE_16__.ProcessApproach), /* harmony export */ ProcessApproachClass: () => (/* reexport safe */ _ProcessApproach__WEBPACK_IMPORTED_MODULE_16__.ProcessApproachClass), /* harmony export */ ProcessStage: () => (/* reexport safe */ _ProcessStage__WEBPACK_IMPORTED_MODULE_17__.ProcessStage), /* harmony export */ RenderBufferTarget: () => (/* reexport safe */ _RenderBufferTarget__WEBPACK_IMPORTED_MODULE_18__.RenderBufferTarget), /* harmony export */ ShaderNode: () => (/* reexport safe */ _ShaderNode__WEBPACK_IMPORTED_MODULE_19__.ShaderNode), /* harmony export */ ShaderSemantics: () => (/* reexport safe */ _ShaderSemantics__WEBPACK_IMPORTED_MODULE_20__.ShaderSemantics), /* harmony export */ ShaderSemanticsClass: () => (/* reexport safe */ _ShaderSemantics__WEBPACK_IMPORTED_MODULE_20__.ShaderSemanticsClass), /* harmony export */ ShaderType: () => (/* reexport safe */ _ShaderType__WEBPACK_IMPORTED_MODULE_22__.ShaderType), /* harmony export */ ShaderVariableType: () => (/* reexport safe */ _ShaderVariableType__WEBPACK_IMPORTED_MODULE_23__.ShaderVariableType), /* harmony export */ ShadingModel: () => (/* reexport safe */ _ShadingModel__WEBPACK_IMPORTED_MODULE_24__.ShadingModel), /* harmony export */ ShadowMap: () => (/* reexport safe */ _ShadowMap__WEBPACK_IMPORTED_MODULE_25__.ShadowMap), /* harmony export */ TextureFormat: () => (/* reexport safe */ _TextureFormat__WEBPACK_IMPORTED_MODULE_26__.TextureFormat), /* harmony export */ TextureParameter: () => (/* reexport safe */ _TextureParameter__WEBPACK_IMPORTED_MODULE_27__.TextureParameter), /* harmony export */ ToneMappingType: () => (/* reexport safe */ _ToneMappingType__WEBPACK_IMPORTED_MODULE_30__.ToneMappingType), /* harmony export */ VertexAttribute: () => (/* reexport safe */ _VertexAttribute__WEBPACK_IMPORTED_MODULE_28__.VertexAttribute), /* harmony export */ VertexAttributeClass: () => (/* reexport safe */ _VertexAttribute__WEBPACK_IMPORTED_MODULE_28__.VertexAttributeClass), /* harmony export */ Visibility: () => (/* reexport safe */ _Visibility__WEBPACK_IMPORTED_MODULE_29__.Visibility), /* harmony export */ _getPropertyIndex2: () => (/* reexport safe */ _ShaderSemantics__WEBPACK_IMPORTED_MODULE_20__._getPropertyIndex2), /* harmony export */ calcAlignedByteLength: () => (/* reexport safe */ _ShaderSemanticsInfo__WEBPACK_IMPORTED_MODULE_21__.calcAlignedByteLength) /* harmony export */ }); /* harmony import */ var _AlphaMode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _AnimationAttribute__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AnimationAttribute */ "./src/foundation/definitions/AnimationAttribute.ts"); /* harmony import */ var _AnimationInterpolation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AnimationInterpolation */ "./src/foundation/definitions/AnimationInterpolation.ts"); /* harmony import */ var _BasisCompressionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BasisCompressionType */ "./src/foundation/definitions/BasisCompressionType.ts"); /* harmony import */ var _BoneDataType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./BoneDataType */ "./src/foundation/definitions/BoneDataType.ts"); /* harmony import */ var _BufferUse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _CameraControllerType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CameraControllerType */ "./src/foundation/definitions/CameraControllerType.ts"); /* harmony import */ var _CameraType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CameraType */ "./src/foundation/definitions/CameraType.ts"); /* harmony import */ var _ComponentType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _CompositionType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _CompressionTextureType__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./CompressionTextureType */ "./src/foundation/definitions/CompressionTextureType.ts"); /* harmony import */ var _FileType__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./FileType */ "./src/foundation/definitions/FileType.ts"); /* harmony import */ var _HdriFormat__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./HdriFormat */ "./src/foundation/definitions/HdriFormat.ts"); /* harmony import */ var _LightType__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./LightType */ "./src/foundation/definitions/LightType.ts"); /* harmony import */ var _PixelFormat__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _PrimitiveMode__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _ProcessApproach__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _ProcessStage__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _RenderBufferTarget__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./RenderBufferTarget */ "./src/foundation/definitions/RenderBufferTarget.ts"); /* harmony import */ var _ShaderNode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ShaderNode */ "./src/foundation/definitions/ShaderNode.ts"); /* harmony import */ var _ShaderSemantics__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _ShaderSemanticsInfo__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ShaderSemanticsInfo */ "./src/foundation/definitions/ShaderSemanticsInfo.ts"); /* harmony import */ var _ShaderType__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _ShaderVariableType__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./ShaderVariableType */ "./src/foundation/definitions/ShaderVariableType.ts"); /* harmony import */ var _ShadingModel__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./ShadingModel */ "./src/foundation/definitions/ShadingModel.ts"); /* harmony import */ var _ShadowMap__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./ShadowMap */ "./src/foundation/definitions/ShadowMap.ts"); /* harmony import */ var _TextureFormat__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _TextureParameter__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _VertexAttribute__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _Visibility__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Visibility */ "./src/foundation/definitions/Visibility.ts"); /* harmony import */ var _ToneMappingType__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./ToneMappingType */ "./src/foundation/definitions/ToneMappingType.ts"); /***/ }), /***/ "./src/foundation/enhanced_js_objects/Array.ts": /*!*****************************************************!*\ !*** ./src/foundation/enhanced_js_objects/Array.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GetComponentFromEntities: () => (/* binding */ GetComponentFromEntities), /* harmony export */ enhanceArray: () => (/* binding */ enhanceArray) /* harmony export */ }); const GetComponentFromEntities = Symbol(); const getComponentFromEntitiesStr = 'getComponentFromEntities'; function getComponentFromEntities(ComponentClass) { const that = this.__raw; const components = []; that.forEach((entity) => { const component = entity.getComponentByComponentTID(ComponentClass.componentTID); if (component != null) { components.push(component); } }); return components; } class EnhancedArrayMethods { constructor(__raw) { this.__raw = __raw; } } const enhanceInner = () => { Object.defineProperty(EnhancedArrayMethods.prototype, getComponentFromEntitiesStr, { enumerable: false, writable: false, configurable: true, value: getComponentFromEntities, }); }; enhanceInner(); const enhanceArray = () => { Object.defineProperty(Array.prototype, 'Rn', { enumerable: false, configurable: false, get() { const ret = new EnhancedArrayMethods(this); return ret; }, }); }; /***/ }), /***/ "./src/foundation/enhanced_js_objects/index.ts": /*!*****************************************************!*\ !*** ./src/foundation/enhanced_js_objects/index.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GetComponentFromEntities: () => (/* reexport safe */ _Array__WEBPACK_IMPORTED_MODULE_0__.GetComponentFromEntities), /* harmony export */ enhanceArray: () => (/* reexport safe */ _Array__WEBPACK_IMPORTED_MODULE_0__.enhanceArray) /* harmony export */ }); /* harmony import */ var _Array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Array */ "./src/foundation/enhanced_js_objects/Array.ts"); /***/ }), /***/ "./src/foundation/exporter/Gltf2Exporter.ts": /*!**************************************************!*\ !*** ./src/foundation/exporter/Gltf2Exporter.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GLTF2_EXPORT_DRACO: () => (/* binding */ GLTF2_EXPORT_DRACO), /* harmony export */ GLTF2_EXPORT_EMBEDDED: () => (/* binding */ GLTF2_EXPORT_EMBEDDED), /* harmony export */ GLTF2_EXPORT_GLB: () => (/* binding */ GLTF2_EXPORT_GLB), /* harmony export */ GLTF2_EXPORT_GLTF: () => (/* binding */ GLTF2_EXPORT_GLTF), /* harmony export */ GLTF2_EXPORT_NO_DOWNLOAD: () => (/* binding */ GLTF2_EXPORT_NO_DOWNLOAD), /* harmony export */ Gltf2Exporter: () => (/* binding */ Gltf2Exporter) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _types_glTF2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../types/glTF2 */ "./src/types/glTF2.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _types_WebGLConstants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../types/WebGLConstants */ "./src/types/WebGLConstants.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/SceneGraph/SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); /* harmony import */ var _Gltf2ExporterEffekseer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Gltf2ExporterEffekseer */ "./src/foundation/exporter/Gltf2ExporterEffekseer.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../version */ "./src/version.ts"); /* harmony import */ var _Gltf2ExporterOps__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Gltf2ExporterOps */ "./src/foundation/exporter/Gltf2ExporterOps.ts"); const GLTF2_EXPORT_GLTF = 'glTF'; const GLTF2_EXPORT_GLB = 'glTF-Binary'; const GLTF2_EXPORT_DRACO = 'glTF-Draco'; const GLTF2_EXPORT_EMBEDDED = 'glTF-Embedded'; const GLTF2_EXPORT_NO_DOWNLOAD = 'No-Download'; /** * The glTF2 format Exporter class. */ class Gltf2Exporter { constructor() { } /** * Exports scene data in the rhodonite system in glTF2 format. * @param filename the target output path * @param option a option config */ static async export(filename, option = { entities: undefined, type: GLTF2_EXPORT_GLB, }) { const { collectedEntities, topLevelEntities } = this.__collectEntities(option); const { json, fileName } = this.__createJsonBase(filename); this.__createBufferViewsAndAccessors(json, collectedEntities); this.__createNodes(json, collectedEntities, topLevelEntities); await this.__createMaterials(json, collectedEntities, option); (0,_Gltf2ExporterEffekseer__WEBPACK_IMPORTED_MODULE_8__.createEffekseer)(json, collectedEntities); const arraybuffer = this.__createBinary(json); this.__deleteEmptyArrays(json); const glbArrayBuffer = generateGlbArrayBuffer(json, arraybuffer); if (option.type === GLTF2_EXPORT_GLB) { this.__downloadGlb(json, fileName, glbArrayBuffer); } else if (option.type === GLTF2_EXPORT_GLTF) { this.__downloadGltf(json, fileName, arraybuffer); } return glbArrayBuffer; } static __deleteEmptyArrays(json) { if (json.accessors.length === 0) { delete json.accessors; } if (json.bufferViews.length === 0) { delete json.bufferViews; } if (json.materials.length === 0) { delete json.materials; } if (json.meshes.length === 0) { delete json.meshes; } if (json.skins.length === 0) { delete json.skins; } if (json.textures.length === 0) { delete json.textures; } if (json.images.length === 0) { delete json.images; } if (json.animations.length === 0) { delete json.animations; } if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(json.extensionsUsed) && json.extensionsUsed.length === 0) { delete json.extensionsUsed; } if (json.cameras.length === 0) { delete json.cameras; } delete json.extras; } /** * collect target entities. This exporter includes their descendants for the output. * @param option an option config * @returns target entities */ static __collectEntities(option) { const checkPassOrNotWithTags = (entity) => { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(option) && _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(option.excludeTags)) { for (const tag of option.excludeTags) { if (entity.matchTag(tag.tag, tag.value)) { return false; // exludes } } if (entity.matchTag('Being', 'gizmo')) { return true; } } return true; }; const excludeWithTags = (entity) => { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(option) && _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(option.excludeTags)) { for (const tag of option.excludeTags) { if (entity.matchTag(tag.tag, tag.value)) { return []; } } } return [entity]; }; const collectDescendants = (entity, root) => { const sg = entity.getSceneGraph(); if (sg.children.length > 0) { const array = root ? [] : excludeWithTags(entity); for (let i = 0; i < sg.children.length; i++) { const child = sg.children[i]; Array.prototype.push.apply(array, collectDescendants(child.entity, false)); } return array; } else { return root ? [] : excludeWithTags(entity); } }; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(option) && _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(option.entities) && option.entities.length > 0) { const collectedDescendants = option.entities.flatMap((entity) => collectDescendants(entity, true)); let topLevelEntities = []; option.entities.forEach((entity) => { // if (collectedDescendants.indexOf(entity) === -1) { if (collectedDescendants.indexOf(entity) === -1 && checkPassOrNotWithTags(entity)) { topLevelEntities.push(entity); } }); let collectedEntities = option.entities.concat(); Array.prototype.push.apply(collectedEntities, collectedDescendants); collectedEntities = [...new Set(collectedEntities)]; if (topLevelEntities.length === 0) { topLevelEntities = collectedEntities; } return { collectedEntities, topLevelEntities }; } let collectedEntities = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository._getEntities(); collectedEntities = collectedEntities.filter((entity) => checkPassOrNotWithTags(entity)); let topLevelEntities = _components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_7__.SceneGraphComponent.getTopLevelComponents().flatMap((c) => c.entity); topLevelEntities = topLevelEntities.filter((entity) => checkPassOrNotWithTags(entity)); collectedEntities = collectedEntities.flatMap((entity) => collectDescendants(entity, true)); Array.prototype.push.apply(collectedEntities, topLevelEntities); collectedEntities = [...new Set(collectedEntities)]; return { collectedEntities, topLevelEntities }; } /** * create the base of glTF2 JSON * @param filename target output path * @returns the json and fileName in a object */ static __createJsonBase(filename) { const fileName = filename ? filename : 'Rhodonite_' + new Date().getTime(); const json = { asset: { version: '2.0', generator: `Rhodonite (${_version__WEBPACK_IMPORTED_MODULE_12__.VERSION.version})`, }, buffers: [{ uri: fileName + '.bin', byteLength: 0 }], bufferViews: [], accessors: [], animations: [], meshes: [], skins: [], materials: [ { pbrMetallicRoughness: { baseColorFactor: [1.0, 1.0, 1.0, 1.0], }, }, ], textures: [], images: [], extensionsUsed: [], extensions: {}, extras: { rnSkins: [], bufferViewByteLengthAccumulatedArray: [], // bufferViewByteLengthAccumulatedArray[0] for buffer 0 // bufferViewByteLengthAccumulatedArray[1] for buffer 1 // ... }, cameras: [], samplers: [], }; return { json, fileName }; } /** * create Gltf2BufferViews and Gltf2Accessors for the output glTF2 JSON * @param json * @param entities */ static __createBufferViewsAndAccessors(json, entities) { const existingUniqueRnBuffers = []; const existingUniqueRnBufferViews = []; const existingUniqueRnAccessors = []; __createBufferViewsAndAccessorsOfMesh(json, entities, existingUniqueRnBuffers, existingUniqueRnBufferViews, existingUniqueRnAccessors); __createBufferViewsAndAccessorsOfAnimation(json, entities); __createBufferViewsAndAccessorsOfSkin(json, entities, existingUniqueRnBuffers, existingUniqueRnBufferViews, existingUniqueRnAccessors); } /** * create Gltf2Nodes for the output glTF2 JSON * @param json a glTF2 JSON * @param entities target entities * @param indicesOfGltfMeshes the indices of Gltf2Meshes */ static __createNodes(json, entities, topLevelEntities) { json.nodes = []; json.scenes = [{ nodes: [] }]; const scene = json.scenes[0]; for (let i = 0; i < entities.length; i++) { const entity = entities[i]; entity.gltfNodeIndex = i; } let meshCount = 0; for (let i = 0; i < entities.length; i++) { const entity = entities[i]; // node ids of the output glTF2 data will be the indices of entities (specified target entities) json.nodes[i] = {}; const node = json.nodes[i]; // node.name node.name = entity.uniqueName; // node.children const sceneGraphComponent = entity.getSceneGraph(); const children = sceneGraphComponent.children; if (children.length > 0) { node.children = []; for (let j = 0; j < children.length; j++) { const child = children[j]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(child.entity.gltfNodeIndex)) { node.children.push(child.entity.gltfNodeIndex); } } } if (sceneGraphComponent.isBillboard) { node.extensions = { RHODONITE_billboard: { isBillboard: true, }, }; if (json.extensionsUsed.indexOf('RHODONITE_billboard') === -1) { json.extensionsUsed.push('RHODONITE_billboard'); } } // matrix const transform = entity.getTransform(); node.rotation = [ transform.localRotationInner.x, transform.localRotationInner.y, transform.localRotationInner.z, transform.localRotationInner.w, ]; node.scale = [ transform.localScaleInner.x, transform.localScaleInner.y, transform.localScaleInner.z, ]; node.translation = [ transform.localPositionInner.x, transform.localPositionInner.y, transform.localPositionInner.z, ]; // mesh const meshComponent = entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(meshComponent) && _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(meshComponent.mesh)) { node.mesh = meshCount++; } // BlendShape const blendShapeComponent = entity.tryToGetBlendShape(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(blendShapeComponent)) { const weights = blendShapeComponent.weights; if (weights.length > 0) { node.weights = weights; } } // skin const skinComponent = entity.tryToGetSkeletal(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(skinComponent)) { const entityIdx = json.extras.rnSkins.indexOf(skinComponent.entity); if (entityIdx >= 0) { node.skin = entityIdx; } } // camera const cameraComponent = entity.tryToGetCamera(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(cameraComponent)) { let glTF2Camera; if (cameraComponent.type === _definitions__WEBPACK_IMPORTED_MODULE_10__.CameraType.Perspective) { const originalAspect = cameraComponent.getTagValue('OriginalAspect'); const originalFovY = cameraComponent.getTagValue('OriginalFovY'); glTF2Camera = { name: cameraComponent.entity.uniqueName, type: 'perspective', perspective: { aspectRatio: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(originalAspect) ? originalAspect : cameraComponent.aspect, yfov: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(originalFovY) ? _math_MathUtil__WEBPACK_IMPORTED_MODULE_11__.MathUtil.degreeToRadian(originalFovY) : _math_MathUtil__WEBPACK_IMPORTED_MODULE_11__.MathUtil.degreeToRadian(cameraComponent.fovy), znear: cameraComponent.zNear, zfar: cameraComponent.zFar, }, }; } else if (cameraComponent.type === _definitions__WEBPACK_IMPORTED_MODULE_10__.CameraType.Orthographic) { const originalXMag = cameraComponent.getTagValue('OriginalXMag'); const originalYMag = cameraComponent.getTagValue('OriginalYMag'); glTF2Camera = { name: cameraComponent.entity.uniqueName, type: 'orthographic', orthographic: { xmag: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(originalXMag) ? originalXMag : cameraComponent.xMag, ymag: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(originalYMag) ? originalYMag : cameraComponent.yMag, znear: cameraComponent.zNear, zfar: cameraComponent.zFar, }, }; } json.cameras.push(glTF2Camera); node.camera = json.cameras.length - 1; } } // If the entity has no parent, it must be a top level entity in the scene graph. topLevelEntities.forEach((entity, i) => { const idx = entities.indexOf(entity); if (idx >= 0) { scene.nodes.push(idx); } }); } /** * create Gltf2Materials and set them to Gltf2Primitives for the output glTF2 JSON * @param json a glTF2 JSON * @param entities all target entities */ static async __createMaterials(json, entities, option) { let countMesh = 0; const promises = []; json.extras.bufferViewByteLengthAccumulatedArray.push(0); const bufferIdx = json.extras.bufferViewByteLengthAccumulatedArray.length - 1; for (let i = 0; i < entities.length; i++) { const entity = entities[i]; const meshComponent = entity.tryToGetMesh(); if (meshComponent && meshComponent.mesh) { const gltf2Mesh = json.meshes[countMesh++]; const primitiveCount = meshComponent.mesh.getPrimitiveNumber(); for (let j = 0; j < primitiveCount; j++) { const rnPrimitive = meshComponent.mesh.getPrimitiveAt(j); const primitive = gltf2Mesh.primitives[j]; const rnMaterial = rnPrimitive.material; const material = { pbrMetallicRoughness: { metallicFactor: 1.0, roughnessFactor: 1.0, }, }; let colorParam; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(rnMaterial)) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.false(rnMaterial.isLighting)) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.extensions)) { material.extensions = {}; } material.extensions.KHR_materials_unlit = {}; if (json.extensionsUsed.indexOf('KHR_materials_unlit') < 0) { json.extensionsUsed.push('KHR_materials_unlit'); } } colorParam = rnMaterial.getParameter('baseColorFactor'); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(colorParam)) { colorParam = rnMaterial.getParameter('diffuseColorFactor'); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(colorParam)) { colorParam = _math_Vector4__WEBPACK_IMPORTED_MODULE_9__.Vector4.fromCopy4(1, 1, 1, 1); } } else { material.pbrMetallicRoughness.metallicFactor = rnMaterial.getParameter('metallicRoughnessFactor').x; material.pbrMetallicRoughness.roughnessFactor = rnMaterial.getParameter('metallicRoughnessFactor').y; } material.pbrMetallicRoughness.baseColorFactor = Array.prototype.slice.call(colorParam._v); material.alphaMode = rnMaterial.alphaMode.toGltfString(); const existedImages = []; const processTexture = (rnTexture, rnSampler) => { if (rnTexture && rnTexture.width > 1 && rnTexture.height > 1) { let imageIndex = json.images.length; let match = false; for (let k = 0; k < json.images.length; k++) { const image = json.images[k]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(image.rnTextureUID) && image.rnTextureUID === rnTexture.textureUID) { imageIndex = k; match = true; } } // Sampler let samplerIdx = -1; { const gltf2TextureSampler = { magFilter: rnSampler != null ? rnSampler.magFilter.index : _definitions__WEBPACK_IMPORTED_MODULE_10__.TextureParameter.Linear.index, minFilter: rnSampler != null ? rnSampler.minFilter.index : _definitions__WEBPACK_IMPORTED_MODULE_10__.TextureParameter.Linear.index, wrapS: rnSampler != null ? rnSampler.wrapS.index : _definitions__WEBPACK_IMPORTED_MODULE_10__.TextureParameter.TextureWrapS.index, wrapT: rnSampler != null ? rnSampler.wrapT.index : _definitions__WEBPACK_IMPORTED_MODULE_10__.TextureParameter.TextureWrapT.index, }; samplerIdx = json.samplers.findIndex((sampler) => { return (0,_types_glTF2__WEBPACK_IMPORTED_MODULE_2__.isSameGlTF2TextureSampler)(gltf2TextureSampler, sampler); }); if (samplerIdx === -1) { json.samplers.push(gltf2TextureSampler); samplerIdx = json.samplers.length - 1; } } if (!match) { // Image const glTF2ImageEx = { uri: rnTexture.name, }; glTF2ImageEx.rnTextureUID = rnTexture.textureUID; if (existedImages.indexOf(rnTexture.name) !== -1) { glTF2ImageEx.uri += '_' + rnTexture.textureUID; } existedImages.push(glTF2ImageEx.uri); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(glTF2ImageEx.uri.match(/\.(png)/))) { glTF2ImageEx.uri += '.png'; } const htmlCanvasElement = rnTexture.htmlCanvasElement; if (htmlCanvasElement) { const promise = new Promise((resolve, rejected) => { htmlCanvasElement.toBlob((blob) => { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(blob)) { handleTextureImage(json, bufferIdx, blob, option, glTF2ImageEx, resolve, rejected); } else { throw Error('canvas to blob error!'); } }); }); promises.push(promise); } json.images.push(glTF2ImageEx); } const gltf2Texture = { sampler: samplerIdx, source: imageIndex, }; const textureIdx = json.textures.indexOf(gltf2Texture); if (textureIdx === -1) { json.textures.push(gltf2Texture); } return json.textures.indexOf(gltf2Texture); } return void 0; }; let textureParam = rnMaterial.getParameter('baseColorTexture'); let textureIndex; if (textureParam != null) { const rnTexture = textureParam[1]; const rnSampler = textureParam[2]; textureIndex = processTexture(rnTexture, rnSampler); if (textureIndex != null) { material.pbrMetallicRoughness.baseColorTexture = { index: textureIndex, }; } } else { textureParam = rnMaterial.getParameter('diffuseColorTexture'); if (textureParam != null) { const rnTexture = textureParam[1]; const rnSampler = textureParam[2]; const textureIndex = processTexture(rnTexture, rnSampler); if (textureIndex != null) { material.pbrMetallicRoughness.diffuseColorTexture = { index: textureIndex, }; } } } textureParam = rnMaterial.getParameter('metallicRoughnessTexture'); if (textureParam) { const rnTexture = textureParam[1]; const rnSampler = textureParam[2]; textureIndex = processTexture(rnTexture, rnSampler); if (textureIndex != null) { material.pbrMetallicRoughness.metallicRoughnessTexture = { index: textureIndex, }; } } textureParam = rnMaterial.getParameter('normalTexture'); if (textureParam) { const rnTexture = textureParam[1]; const rnSampler = textureParam[2]; textureIndex = processTexture(rnTexture, rnSampler); if (textureIndex != null) { material.normalTexture = { index: textureIndex }; } } textureParam = rnMaterial.getParameter('occlusionTexture'); if (textureParam) { const rnTexture = textureParam[1]; const rnSampler = textureParam[2]; textureIndex = processTexture(rnTexture, rnSampler); if (textureIndex != null) { material.occlusionTexture = { index: textureIndex }; } } textureParam = rnMaterial.getParameter('emissiveTexture'); if (textureParam) { const rnTexture = textureParam[1]; const rnSampler = textureParam[2]; textureIndex = processTexture(rnTexture, rnSampler); if (textureIndex != null) { material.emissiveTexture = { index: textureIndex }; } } } const imageIdx = json.materials.indexOf(material); if (imageIdx === -1) { json.materials.push(material); } primitive.material = json.materials.indexOf(material); } } } return Promise.all(promises); } /** * create the arraybuffer of the glTF2 .bin file and write all accessors data to the arraybuffer * @param json a glTF2 JSON * @returns A arraybuffer */ static __createBinary(json) { // write all data of accessors to the DataView (total data area) if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.undefined(json.accessors) || _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.undefined(json.bufferViews)) { return new ArrayBuffer(0); } // calc total sum of BufferViews in multiple Buffers const byteLengthOfUniteBuffer = json.extras.bufferViewByteLengthAccumulatedArray.reduce((sum, val) => sum + val); if (byteLengthOfUniteBuffer > 0) { const buffer = json.buffers[0]; buffer.byteLength = byteLengthOfUniteBuffer + _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.calcPaddingBytes(byteLengthOfUniteBuffer, 4); } // create the ArrayBuffer of unite Buffer (consist of multiple Buffers) const arrayBuffer = new ArrayBuffer(json.buffers[0].byteLength); // copy BufferViews in multiple Buffer to the Unite Buffer let lastCopiedByteLengthOfBufferView = 0; for (let i = 0; i < json.bufferViews.length; i++) { const bufferView = json.bufferViews[i]; const uint8ArrayOfBufferView = bufferView.extras.uint8Array; delete bufferView.extras; const distByteOffset = lastCopiedByteLengthOfBufferView; _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.copyArrayBufferWithPadding({ src: uint8ArrayOfBufferView.buffer, dist: arrayBuffer, srcByteOffset: uint8ArrayOfBufferView.byteOffset, copyByteLength: uint8ArrayOfBufferView.byteLength, distByteOffset, }); lastCopiedByteLengthOfBufferView += _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.addPaddingBytes(uint8ArrayOfBufferView.byteLength, 4); bufferView.byteOffset = distByteOffset; bufferView.buffer = 0; // rewrite buffer index to 0 (The Unite Buffer) } return arrayBuffer; } /** * download the glTF2 files * @param json a glTF2 JSON * @param filename target output path * @param arraybuffer an ArrayBuffer of the .bin file */ static __downloadGlb(json, filename, arraybuffer) { { const a = document.createElement('a'); a.download = filename + '.glb'; const blob = new Blob([arraybuffer], { type: 'octet/stream' }); const url = URL.createObjectURL(blob); a.href = url; const e = new MouseEvent('click'); a.dispatchEvent(e); } } exportGlbAsArrayBuffer() { } /** * download the glTF2 files * @param json a glTF2 JSON * @param filename target output path * @param arraybuffer an ArrayBuffer of the .bin file */ static __downloadGltf(json, filename, arraybuffer) { { // .gltf file const a = document.createElement('a'); a.download = filename + '.gltf'; const str = JSON.stringify(json, null, 2); a.href = 'data:application/octet-stream,' + encodeURIComponent(str); const e = new MouseEvent('click'); a.dispatchEvent(e); } { // .bin file const a = document.createElement('a'); a.download = filename + '.bin'; const blob = new Blob([arraybuffer], { type: 'octet/stream' }); const url = URL.createObjectURL(blob); a.href = url; const e = new MouseEvent('click'); a.dispatchEvent(e); } } } function generateGlbArrayBuffer(json, arraybuffer) { const headerBytes = 12; // 12byte-header // .glb file delete json.buffers[0].uri; let jsonStr = JSON.stringify(json, null, 2); let jsonArrayBuffer = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.stringToBuffer(jsonStr); const paddingBytes = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.calcPaddingBytes(jsonArrayBuffer.byteLength, 4); if (paddingBytes > 0) { for (let i = 0; i < paddingBytes; i++) { jsonStr += ' '; } jsonArrayBuffer = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.stringToBuffer(jsonStr); } const jsonChunkLength = jsonArrayBuffer.byteLength; const headerAndChunk0 = headerBytes + 4 + 4 + jsonChunkLength; // Chunk-0 const totalBytes = headerAndChunk0 + 4 + 4 + arraybuffer.byteLength; // Chunk-1 const glbArrayBuffer = new ArrayBuffer(totalBytes); const dataView = new DataView(glbArrayBuffer); dataView.setUint32(0, 0x46546c67, true); dataView.setUint32(4, 2, true); dataView.setUint32(8, totalBytes, true); dataView.setUint32(12, jsonArrayBuffer.byteLength, true); dataView.setUint32(16, 0x4e4f534a, true); _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.copyArrayBufferAs4Bytes({ src: jsonArrayBuffer, dist: glbArrayBuffer, srcByteOffset: 0, copyByteLength: jsonArrayBuffer.byteLength, distByteOffset: 20, }); _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.copyArrayBufferAs4Bytes({ src: arraybuffer, dist: glbArrayBuffer, srcByteOffset: 0, copyByteLength: arraybuffer.byteLength, distByteOffset: 20 + jsonChunkLength + 8, }); dataView.setUint32(headerAndChunk0, arraybuffer.byteLength, true); dataView.setUint32(headerAndChunk0 + 4, 0x004e4942, true); return glbArrayBuffer; } /** * create Gltf2Skins * @param json a glTF2 JSON * @param entities all target entities */ function __createBufferViewsAndAccessorsOfSkin(json, entities, existingUniqueRnBuffers, existingUniqueRnBufferViews, existingUniqueRnAccessors) { for (let i = 0; i < entities.length; i++) { const entity = entities[i]; const skeletalComponent = entity.tryToGetSkeletal(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(skeletalComponent)) { continue; } json.extras.rnSkins.push(skeletalComponent.entity); const jointSceneComponentsOfTheEntity = skeletalComponent.getJoints(); const jointIndicesOfTheEntity = []; for (const jointSceneComponent of jointSceneComponentsOfTheEntity) { entities.forEach((entityObj, j) => { if (jointSceneComponent.entity === entityObj) { jointIndicesOfTheEntity.push(j); } }); } const inverseBindMatRnAccessor = skeletalComponent.getInverseBindMatricesAccessor(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(inverseBindMatRnAccessor)) { createOrReuseGltf2BufferView(json, existingUniqueRnBuffers, existingUniqueRnBufferViews, inverseBindMatRnAccessor.bufferView); createOrReuseGltf2Accessor(json, json.bufferViews.length - 1, existingUniqueRnAccessors, inverseBindMatRnAccessor); } const topOfJointsSkeletonSceneComponent = skeletalComponent.topOfJointsHierarchy; const bindShapeMatrix = skeletalComponent._bindShapeMatrix; let skeletalIdx = -1; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(topOfJointsSkeletonSceneComponent)) { const skeletalEntity = topOfJointsSkeletonSceneComponent.entity; skeletalIdx = entities.indexOf(skeletalEntity); } else { skeletalIdx = jointIndicesOfTheEntity[0]; } const skinJson = { joints: jointIndicesOfTheEntity, inverseBindMatrices: json.accessors.length - 1, skeleton: skeletalIdx >= 0 ? skeletalIdx : undefined, bindShapeMatrix: bindShapeMatrix === null || bindShapeMatrix === void 0 ? void 0 : bindShapeMatrix.flattenAsArray(), }; json.skins.push(skinJson); } } /** * create BufferViews and Accessors of mesh * @param json * @param entities * @param existingUniqueRnBuffers * @param existingUniqueRnBufferViews * @param existingUniqueRnAccessors * @returns */ function __createBufferViewsAndAccessorsOfMesh(json, entities, existingUniqueRnBuffers, existingUniqueRnBufferViews, existingUniqueRnAccessors) { for (let i = 0; i < entities.length; i++) { const entity = entities[i]; const meshComponent = entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(meshComponent) && meshComponent.mesh) { const mesh = { primitives: [] }; const primitiveCount = meshComponent.mesh.getPrimitiveNumber(); for (let j = 0; j < primitiveCount; j++) { const rnPrimitive = meshComponent.mesh.getPrimitiveAt(j); const primitive = { attributes: {}, mode: rnPrimitive.primitiveMode.index, }; // Vertex Indices // For indices accessor const rnIndicesAccessor = rnPrimitive.indicesAccessor; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(rnIndicesAccessor)) { const rnBufferView = rnIndicesAccessor.bufferView; const gltf2BufferView = createOrReuseGltf2BufferView(json, existingUniqueRnBuffers, existingUniqueRnBufferViews, rnBufferView, _types_WebGLConstants__WEBPACK_IMPORTED_MODULE_5__.GL_ELEMENT_ARRAY_BUFFER); const gltf2Accessor = createOrReuseGltf2Accessor(json, json.bufferViews.indexOf(gltf2BufferView), existingUniqueRnAccessors, rnIndicesAccessor); const accessorIdx = json.accessors.indexOf(gltf2Accessor); primitive.indices = accessorIdx; } // Vertex Attributes // For each attribute accessor const attributeAccessors = rnPrimitive.attributeAccessors; for (let j = 0; j < attributeAccessors.length; j++) { const attributeJoinedString = rnPrimitive.attributeSemantics[j]; const attributeName = attributeJoinedString.split('.')[0]; if (attributeName === 'BARY_CENTRIC_COORD') { continue; } // create a Gltf2BufferView const rnAttributeAccessor = attributeAccessors[j]; const rnBufferView = rnAttributeAccessor.bufferView; const gltf2BufferView = createOrReuseGltf2BufferViewForVertexAttributeBuffer(json, existingUniqueRnBuffers, existingUniqueRnBufferViews, rnBufferView, rnAttributeAccessor); const gltf2Accessor = createOrReuseGltf2Accessor(json, json.bufferViews.indexOf(gltf2BufferView), existingUniqueRnAccessors, rnAttributeAccessor); const accessorIdx = json.accessors.indexOf(gltf2Accessor); primitive.attributes[attributeName] = accessorIdx; } // BlendShape setupBlandShapeData(entity, rnPrimitive, primitive, json, existingUniqueRnBuffers, existingUniqueRnBufferViews, existingUniqueRnAccessors); mesh.primitives[j] = primitive; } json.meshes.push(mesh); } } } function setupBlandShapeData(entity, rnPrimitive, primitive, json, existingUniqueRnBuffers, existingUniqueRnBufferViews, existingUniqueRnAccessors) { const blendShapeComponent = entity.tryToGetBlendShape(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(blendShapeComponent)) { const targets = rnPrimitive.getBlendShapeTargets(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(primitive.targets)) { primitive.targets = []; } for (const target of targets) { const targetJson = {}; for (const [attributeName, rnAccessor] of target.entries()) { const gltf2BufferView = createOrReuseGltf2BufferView(json, existingUniqueRnBuffers, existingUniqueRnBufferViews, rnAccessor.bufferView, _types_WebGLConstants__WEBPACK_IMPORTED_MODULE_5__.GL_ARRAY_BUFFER); const gltf2Accessor = createOrReuseGltf2Accessor(json, json.bufferViews.indexOf(gltf2BufferView), existingUniqueRnAccessors, rnAccessor); const accessorIdx = json.accessors.indexOf(gltf2Accessor); const attributeJoinedString = attributeName; const attribute = attributeJoinedString.split('.')[0]; targetJson[attribute] = accessorIdx; } primitive.targets.push(targetJson); } } } /** * create BufferViews and Accessors of animation * @param json * @param entities */ function __createBufferViewsAndAccessorsOfAnimation(json, entities) { let sumOfBufferViewByteLengthAccumulated = 0; const bufferIdx = json.extras.bufferViewByteLengthAccumulatedArray.length; for (let i = 0; i < entities.length; i++) { const entity = entities[i]; const animationComponent = entity.tryToGetAnimation(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(animationComponent)) { const trackNames = animationComponent.getAnimationTrackNames(); for (const trackName of trackNames) { // AnimationTrack (Gltf2Animation) const animation = { channels: [], samplers: [], }; json.animations.push(animation); let samplerIdx = 0; // Rhodonite AnimationTrack is corresponding to Gltf2Animation const rnAnimationTrack = animationComponent.getAnimationChannelsOfTrack(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(rnAnimationTrack)) { const rnChannels = rnAnimationTrack.values(); for (const rnChannel of rnChannels) { if (rnChannel.target.pathName === 'effekseer') { continue; } // create and register Gltf2BufferView and Gltf2Accessor // and set Input animation data as Uint8Array to the Gltf2Accessor const { inputAccessorIdx, inputBufferViewByteLengthAccumulated } = createGltf2BufferViewAndGltf2AccessorForInput(json, rnChannel, bufferIdx, sumOfBufferViewByteLengthAccumulated); sumOfBufferViewByteLengthAccumulated += inputBufferViewByteLengthAccumulated; // create and register Gltf2BufferView and Gltf2Accessor // and set Output animation data as Uint8Array to the Gltf2Accessor const { outputAccessorIdx, outputBufferViewByteLengthAccumulated } = createGltf2BufferViewAndGltf2AccessorForOutput(json, rnChannel, bufferIdx, sumOfBufferViewByteLengthAccumulated); sumOfBufferViewByteLengthAccumulated += outputBufferViewByteLengthAccumulated; // Create Gltf2AnimationChannel samplerIdx = createGltf2AnimationChannel(rnChannel, samplerIdx, animation, i); // Create Gltf2AnimationSampler createGltf2AnimationSampler(inputAccessorIdx, outputAccessorIdx, rnChannel, animation); } } } } } json.extras.bufferViewByteLengthAccumulatedArray.push(sumOfBufferViewByteLengthAccumulated); } function calcAccessorIdxToSet(existingUniqueRnAccessors, rnAccessor) { // let accessorIdxToSet = -1; const accessorIdx = existingUniqueRnAccessors.findIndex((accessor) => { return accessor.isSame(rnAccessor); }); // if (accessorIdx !== -1) { // // if the Rhodonite RnAccessor is in existingUniqueAccessors already, // // reuse the corresponding Gltf2Accessor // accessorIdxToSet = accessorIdx; // } else { // // if not, create a Gltf2Accessor and put it into existingUniqueAccessors // // if the accessor is new one... // accessorIdxToSet = existingUniqueRnAccessors.length; // } return accessorIdx; } function createOrReuseGltf2BufferViewForVertexAttributeBuffer(json, existingUniqueRnBuffers, existingUniqueRnBufferViews, rnBufferView, rnAccessor) { const bufferViewIdx = findBufferViewIdx(existingUniqueRnBufferViews, rnBufferView); if (bufferViewIdx === -1) { const bufferIdxToSet = calcBufferIdxToSet(existingUniqueRnBuffers, rnBufferView.buffer); const gltf2BufferView = { buffer: bufferIdxToSet, byteLength: rnBufferView.byteLength, byteOffset: rnBufferView.byteOffsetInBuffer, extras: { uint8Array: rnBufferView.getUint8Array(), }, }; gltf2BufferView.target = _types_WebGLConstants__WEBPACK_IMPORTED_MODULE_5__.GL_ARRAY_BUFFER; json.extras.bufferViewByteLengthAccumulatedArray[bufferIdxToSet] = accumulateBufferViewByteLength(json.extras.bufferViewByteLengthAccumulatedArray, bufferIdxToSet, gltf2BufferView); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(gltf2BufferView.target)) { gltf2BufferView.byteStride = rnAccessor.elementSizeInBytes; } existingUniqueRnBufferViews.push(rnBufferView); json.bufferViews.push(gltf2BufferView); // const {fixedBufferViewByteLength, fixedBufferViewByteOffset} = // calcBufferViewByteLengthAndByteOffset({ // accessorByteOffset: rnAccessor.byteOffsetInBufferView, // accessorCount: rnAccessor.elementCount, // bufferViewByteOffset: gltf2BufferView.byteOffset, // bufferViewByteStride: gltf2BufferView.byteStride!, // sizeOfComponent: rnAccessor.componentType.getSizeInBytes(), // numberOfComponents: rnAccessor.compositionType.getNumberOfComponents(), // }); // gltf2BufferView.byteLength = fixedBufferViewByteLength; return gltf2BufferView; } const gltf2BufferView = json.bufferViews[bufferViewIdx]; return gltf2BufferView; } function findBufferViewIdx(existingUniqueRnBufferViews, rnBufferView) { const bufferViewIdx = existingUniqueRnBufferViews.findIndex((bufferView) => bufferView.isSame(rnBufferView)); return bufferViewIdx; } function calcBufferIdxToSet(existingUniqueRnBuffers, rnBuffer) { if (existingUniqueRnBuffers.length === 0) { existingUniqueRnBuffers.push(rnBuffer); } const bufferIdx = existingUniqueRnBuffers.findIndex((buffer) => buffer.isSame(rnBuffer)); const bufferIdxToSet = bufferIdx === -1 ? existingUniqueRnBuffers.length : bufferIdx; if (bufferIdx === -1) { existingUniqueRnBuffers.push(rnBuffer); } return bufferIdxToSet; } function accumulateBufferViewByteLength(bufferViewByteLengthAccumulatedArray, bufferIdxToSet, gltf2BufferView) { const bufferViewLengthAligned = _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(bufferViewByteLengthAccumulatedArray[bufferIdxToSet]) ? bufferViewByteLengthAccumulatedArray[bufferIdxToSet] + _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.addPaddingBytes(gltf2BufferView.byteLength, 4) : _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.addPaddingBytes(gltf2BufferView.byteLength, 4); return bufferViewLengthAligned; } function convertToGltfAnimationPathName(path) { switch (path) { case 'translate': return 'translation'; case 'quaternion': return 'rotation'; case 'scale': return 'scale'; case 'weights': return 'weights'; // case 'effekseer': // return 'effekseer'; default: throw new Error('Invalid Path Name'); } } function createGltf2AnimationChannel(channel, samplerIdx, animation, entityIdx) { const pathName = channel.target.pathName; const channelJson = { sampler: samplerIdx++, target: { path: convertToGltfAnimationPathName(pathName), node: entityIdx, }, }; animation.channels.push(channelJson); return samplerIdx; } function createGltf2AnimationSampler(inputAccessorIdx, outputAccessorIdx, channel, animation) { const samplerJson = { input: inputAccessorIdx, output: outputAccessorIdx, interpolation: channel.sampler.interpolationMethod.GltfString, }; animation.samplers.push(samplerJson); } function createGltf2BufferViewAndGltf2AccessorForInput(json, rnChannel, bufferIdx, bufferViewByteLengthAccumulated) { const componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.fromTypedArray(ArrayBuffer.isView(rnChannel.sampler.input) ? rnChannel.sampler.input : new Float32Array(rnChannel.sampler.input)); const accessorCount = rnChannel.sampler.input.length; // create a Gltf2BufferView const gltf2BufferView = createGltf2BufferViewForAnimation({ bufferIdx, bufferViewByteOffset: bufferViewByteLengthAccumulated, accessorByteOffset: 0, accessorCount, bufferViewByteStride: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float.getSizeInBytes(), componentType, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, uint8Array: new Uint8Array(ArrayBuffer.isView(rnChannel.sampler.input) ? rnChannel.sampler.input.buffer : new Float32Array(rnChannel.sampler.input).buffer), }); json.bufferViews.push(gltf2BufferView); // create a Gltf2Accessor const gltf2Accessor = createGltf2AccessorForAnimation({ bufferViewIdx: json.bufferViews.indexOf(gltf2BufferView), accessorByteOffset: 0, componentType, count: accessorCount, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, min: [rnChannel.sampler.input[0]], max: [rnChannel.sampler.input[rnChannel.sampler.input.length - 1]], }); json.accessors.push(gltf2Accessor); // register bufferViewByteLengthAccumulated = alignBufferViewByteLength(bufferViewByteLengthAccumulated, gltf2BufferView); const inputAccessorIdx = json.accessors.indexOf(gltf2Accessor); return { inputAccessorIdx, inputBufferViewByteLengthAccumulated: bufferViewByteLengthAccumulated, }; } function createGltf2BufferViewAndGltf2AccessorForOutput(json, rnChannel, bufferIdx, bufferViewByteLengthAccumulated) { const componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.fromTypedArray(ArrayBuffer.isView(rnChannel.sampler.output) ? rnChannel.sampler.output : new Float32Array(rnChannel.sampler.output)); const pathName = rnChannel.target.pathName; let compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.toGltf2AnimationAccessorCompositionType(rnChannel.sampler.outputComponentN); let accessorCount = rnChannel.sampler.output.length / rnChannel.sampler.outputComponentN; if (pathName === 'weights') { compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar; accessorCount = rnChannel.sampler.output.length; } // create a Gltf2BufferView const gltf2BufferView = createGltf2BufferViewForAnimation({ bufferIdx, bufferViewByteOffset: bufferViewByteLengthAccumulated, accessorByteOffset: 0, accessorCount, bufferViewByteStride: componentType.getSizeInBytes() * rnChannel.sampler.outputComponentN, componentType, compositionType, uint8Array: new Uint8Array(ArrayBuffer.isView(rnChannel.sampler.output) ? rnChannel.sampler.output.buffer : new Float32Array(rnChannel.sampler.output).buffer), }); json.bufferViews.push(gltf2BufferView); // create a Gltf2Accessor const gltf2Accessor = createGltf2AccessorForAnimation({ bufferViewIdx: json.bufferViews.indexOf(gltf2BufferView), accessorByteOffset: 0, componentType, count: accessorCount, compositionType, }); json.accessors.push(gltf2Accessor); // register bufferViewByteLengthAccumulated = alignBufferViewByteLength(bufferViewByteLengthAccumulated, gltf2BufferView); const outputAccessorIdx = json.accessors.indexOf(gltf2Accessor); return { outputAccessorIdx, outputBufferViewByteLengthAccumulated: bufferViewByteLengthAccumulated, }; } function alignBufferViewByteLength(bufferViewByteLengthAccumulated, bufferView) { bufferViewByteLengthAccumulated = bufferView.byteLength + _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.calcPaddingBytes(bufferView.byteLength, 4); return bufferViewByteLengthAccumulated; } /** * calc BufferView byte length * * * See: https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#data-alignment * @param accessorByteOffset * @param accessorCount * @param effectiveByteStride * @param sizeOfComponent * @param numberOfComponents * @returns */ function calcBufferViewByteLengthAndByteOffset({ accessorByteOffset, accessorCount, bufferViewByteStride, bufferViewByteOffset, sizeOfComponent, numberOfComponents, }) { // When byteStride of the referenced bufferView is not defined, // it means that accessor elements are tightly packed, // i.e., effective stride equals the size of the element. const effectiveByteStride = bufferViewByteStride === 0 ? sizeOfComponent * numberOfComponents : bufferViewByteStride; // When byteStride is defined, // it MUST be a multiple of the size of the accessor’s component type. if (bufferViewByteStride % sizeOfComponent !== 0) { throw Error('glTF2: When byteStride is defined, it MUST be a multiple of the size of the accessor’s component type.'); } // MUST be 4 bytes aligned const effectiveByteStrideAligned = alignBufferViewByteStrideTo4Bytes(effectiveByteStride); // MUST be 4 bytes aligned const alignedAccessorByteOffset = alignAccessorByteOffsetTo4Bytes(accessorByteOffset); // calc BufferView byteLength as following, // // Each accessor MUST fit its bufferView, i.e., // ``` // accessor.byteOffset + EFFECTIVE_BYTE_STRIDE * (accessor.count - 1) + SIZE_OF_COMPONENT * NUMBER_OF_COMPONENTS // ``` // MUST be less than or equal to bufferView.length. const bufferViewByteLength = alignedAccessorByteOffset + effectiveByteStrideAligned * (accessorCount - 1) + sizeOfComponent * numberOfComponents; // The offset of an accessor into a bufferView (i.e., accessor.byteOffset) // and the offset of an accessor into a buffer (i.e., accessor.byteOffset + bufferView.byteOffset) // MUST be a multiple of the size of the accessor’s component type. const valByteLength = sizeOfComponent * numberOfComponents; const sumByteOffset = alignedAccessorByteOffset + bufferViewByteOffset; const paddingByte = valByteLength - (sumByteOffset % valByteLength); const fixedBufferViewByteOffset = bufferViewByteOffset + paddingByte; // MUST be 4 bytes aligned const alignedBufferViewByteOffset = alignAccessorByteOffsetTo4Bytes(fixedBufferViewByteOffset); const fixedBufferViewByteLength = bufferViewByteLength; return { fixedBufferViewByteLength, fixedBufferViewByteOffset: alignedBufferViewByteOffset, }; } /** * fix the passed byteOffset to 4 bytes aligned * For performance and compatibility reasons, each element of a vertex attribute * MUST be aligned to 4-byte boundaries inside a bufferView * (i.e., accessor.byteOffset and bufferView.byteStride MUST be multiples of 4). * * See: https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#data-alignment * @param byteOffset ByteOffset of Accessor, which is not algined yet * @returns algined byteOffset */ function alignAccessorByteOffsetTo4Bytes(byteOffset) { const alignSize = 4; if (byteOffset % 4 === 0) { return byteOffset; } return byteOffset + (alignSize - (byteOffset % alignSize)); } /** * fix the passed byteOffset to 4 bytes aligned * For performance and compatibility reasons, each element of a vertex attribute * MUST be aligned to 4-byte boundaries inside a bufferView * (i.e., accessor.byteOffset and bufferView.byteStride MUST be multiples of 4). * * See: https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#data-alignment * @param byteOffset ByteOffset of Accessor, which is not algined yet * @returns algined byteOffset */ function alignBufferViewByteStrideTo4Bytes(byteStride) { const alignSize = 4; if (byteStride % 4 === 0) { return byteStride; } const byteStrideAlgined = byteStride + (alignSize - (byteStride % alignSize)); return byteStrideAlgined; } async function handleTextureImage(json, bufferIdx, blob, option, glTF2ImageEx, resolve, rejected) { if (option.type === GLTF2_EXPORT_GLTF) { setTimeout(() => { const a = document.createElement('a'); const e = new MouseEvent('click'); a.href = URL.createObjectURL(blob); a.download = glTF2ImageEx.uri; a.dispatchEvent(e); URL.revokeObjectURL(a.href); }, Math.random() * 5000); resolve(); } else { const reader = new FileReader(); reader.addEventListener('load', () => { const arrayBuffer = reader.result; const gltf2BufferView = (0,_Gltf2ExporterOps__WEBPACK_IMPORTED_MODULE_13__.createAndAddGltf2BufferView)(json, bufferIdx, new Uint8ClampedArray(arrayBuffer)); glTF2ImageEx.bufferView = json.bufferViews.indexOf(gltf2BufferView); glTF2ImageEx.mimeType = 'image/png'; delete glTF2ImageEx.uri; resolve(); }); reader.addEventListener('error', () => { rejected(reader.error); }); reader.readAsArrayBuffer(blob); } } function createGltf2BufferViewForAnimation({ bufferIdx, bufferViewByteOffset, accessorByteOffset, accessorCount, bufferViewByteStride, componentType, compositionType, uint8Array, }) { const alignedAccessorByteOffset = alignAccessorByteOffsetTo4Bytes(accessorByteOffset); const { fixedBufferViewByteLength, fixedBufferViewByteOffset } = calcBufferViewByteLengthAndByteOffset({ accessorByteOffset: alignedAccessorByteOffset, accessorCount: accessorCount, bufferViewByteStride, bufferViewByteOffset, sizeOfComponent: componentType.getSizeInBytes(), numberOfComponents: compositionType.getNumberOfComponents(), }); const gltfBufferViewEx = { buffer: bufferIdx, byteLength: fixedBufferViewByteLength, byteOffset: fixedBufferViewByteOffset, extras: { uint8Array, }, }; return gltfBufferViewEx; } function createGltf2AccessorForAnimation({ bufferViewIdx, accessorByteOffset, componentType, count, compositionType, min, max, }) { const alignedAccessorByteOffset = alignAccessorByteOffsetTo4Bytes(accessorByteOffset); const gltf2AccessorEx = { bufferView: bufferViewIdx, byteOffset: alignedAccessorByteOffset, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.toGltf2AccessorComponentType(componentType), count, type: compositionType.str, min, max, extras: {}, }; return gltf2AccessorEx; } function createOrReuseGltf2BufferView(json, existingUniqueRnBuffers, existingUniqueRnBufferViews, rnBufferView, target) { const bufferViewIdx = findBufferViewIdx(existingUniqueRnBufferViews, rnBufferView); if (bufferViewIdx === -1) { const bufferIdxToSet = calcBufferIdxToSet(existingUniqueRnBuffers, rnBufferView.buffer); const gltf2BufferView = { buffer: bufferIdxToSet, byteLength: rnBufferView.byteLength, byteOffset: rnBufferView.byteOffsetInBuffer, extras: { uint8Array: rnBufferView.getUint8Array(), }, }; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(target)) { gltf2BufferView.target = target; } json.extras.bufferViewByteLengthAccumulatedArray[bufferIdxToSet] = accumulateBufferViewByteLength(json.extras.bufferViewByteLengthAccumulatedArray, bufferIdxToSet, gltf2BufferView); existingUniqueRnBufferViews.push(rnBufferView); json.bufferViews.push(gltf2BufferView); return gltf2BufferView; } const gltf2BufferView = json.bufferViews[bufferViewIdx]; return gltf2BufferView; } function createOrReuseGltf2Accessor(json, bufferViewIdxToSet, existingUniqueRnAccessors, rnAccessor) { const accessorIdx = calcAccessorIdxToSet(existingUniqueRnAccessors, rnAccessor); if (accessorIdx === -1) { // create a Gltf2Accessor const gltf2Accessor = { bufferView: bufferViewIdxToSet, byteOffset: rnAccessor.byteOffsetInBufferView, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.toGltf2AccessorComponentType(rnAccessor.componentType), count: rnAccessor.elementCount, type: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.toGltf2AccessorCompositionTypeString(rnAccessor.compositionType.getNumberOfComponents()), extras: { uint8Array: undefined, }, }; if (rnAccessor.compositionType.getNumberOfComponents() <= 4) { gltf2Accessor.max = rnAccessor.max; gltf2Accessor.min = rnAccessor.min; } existingUniqueRnAccessors.push(rnAccessor); json.accessors.push(gltf2Accessor); return gltf2Accessor; } const gltf2Accessor = json.accessors[accessorIdx]; return gltf2Accessor; } /***/ }), /***/ "./src/foundation/exporter/Gltf2ExporterEffekseer.ts": /*!***********************************************************!*\ !*** ./src/foundation/exporter/Gltf2ExporterEffekseer.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createEffekseer: () => (/* binding */ createEffekseer) /* harmony export */ }); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* harmony import */ var _Gltf2ExporterOps__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Gltf2ExporterOps */ "./src/foundation/exporter/Gltf2ExporterOps.ts"); function createEffekseer(json, entities) { let effekseerExists = false; const bufferIdx = json.extras.bufferViewByteLengthAccumulatedArray.length - 1; const effects = []; for (let i = 0; i < entities.length; i++) { const entity = entities[i]; const effekseerComponent = entity.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_0__.WellKnownComponentTIDs.EffekseerComponentTID); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(effekseerComponent)) { effekseerExists = true; const effekseer = { node: i, name: effekseerComponent.uniqueName, }; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(effekseerComponent.arrayBuffer)) { const gltf2BufferView = (0,_Gltf2ExporterOps__WEBPACK_IMPORTED_MODULE_3__.createAndAddGltf2BufferView)(json, bufferIdx, new Uint8Array(effekseerComponent.arrayBuffer)); effekseer.bufferView = json.bufferViews.indexOf(gltf2BufferView); } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(effekseerComponent.uri)) { effekseer.uri = effekseerComponent.uri; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_2__.Logger.error('no real effect data.'); } __createEffekseerTimeline(effekseerComponent.entity, effekseer); effects.push(effekseer); } } if (effekseerExists) { json.extensions.RHODONITE_effekseer = { version: '1.0', effects: effects, }; json.extensionsUsed.push('RHODONITE_effekseer'); } } function __createEffekseerTimeline(entity, effekseer) { const animationComponent = entity.tryToGetAnimation(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(animationComponent)) { const trackNames = animationComponent.getAnimationTrackNames(); const timelines = []; for (const trackName of trackNames) { if (animationComponent.hasAnimation(trackName, 'effekseer')) { const rnAnimationTrack = animationComponent.getAnimationChannelsOfTrack(trackName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(rnAnimationTrack)) { const rnChannels = rnAnimationTrack.values(); for (const rnChannel of rnChannels) { const pathName = rnChannel.target.pathName; if (pathName === 'effekseer') { const inputArray = rnChannel.sampler.input; const values = []; for (let i = 0; i < inputArray.length; i++) { const input = inputArray[i]; const output = rnChannel.sampler.output[i]; const timelineItem = { input: input, event: output > 0.5 ? 'play' : 'pause', }; values.push(timelineItem); } const timeline = { name: trackName, values: values, }; timelines.push(timeline); } } } } } effekseer.timelines = timelines; } } /***/ }), /***/ "./src/foundation/exporter/Gltf2ExporterOps.ts": /*!*****************************************************!*\ !*** ./src/foundation/exporter/Gltf2ExporterOps.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createAndAddGltf2BufferView: () => (/* binding */ createAndAddGltf2BufferView) /* harmony export */ }); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); function createAndAddGltf2BufferView(json, bufferIdx, uint8Array) { const bufferViewByteLengthAccumulated = json.extras.bufferViewByteLengthAccumulatedArray[bufferIdx]; const gltfBufferViewEx = { buffer: bufferIdx, byteLength: uint8Array.byteLength, byteOffset: bufferViewByteLengthAccumulated, extras: { uint8Array, }, }; const nextBufferViewBytesLengthAccumulated = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.addPaddingBytes(gltfBufferViewEx.byteLength, 4) + bufferViewByteLengthAccumulated; json.bufferViews.push(gltfBufferViewEx); json.extras.bufferViewByteLengthAccumulatedArray[bufferIdx] = nextBufferViewBytesLengthAccumulated; return gltfBufferViewEx; } /***/ }), /***/ "./src/foundation/exporter/index.ts": /*!******************************************!*\ !*** ./src/foundation/exporter/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GLTF2_EXPORT_DRACO: () => (/* reexport safe */ _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_DRACO), /* harmony export */ GLTF2_EXPORT_EMBEDDED: () => (/* reexport safe */ _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_EMBEDDED), /* harmony export */ GLTF2_EXPORT_GLB: () => (/* reexport safe */ _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_GLB), /* harmony export */ GLTF2_EXPORT_GLTF: () => (/* reexport safe */ _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_GLTF), /* harmony export */ GLTF2_EXPORT_NO_DOWNLOAD: () => (/* reexport safe */ _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_NO_DOWNLOAD), /* harmony export */ Gltf2Exporter: () => (/* reexport safe */ _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__.Gltf2Exporter), /* harmony export */ createEffekseer: () => (/* reexport safe */ _Gltf2ExporterEffekseer__WEBPACK_IMPORTED_MODULE_1__.createEffekseer) /* harmony export */ }); /* harmony import */ var _Gltf2Exporter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Gltf2Exporter */ "./src/foundation/exporter/Gltf2Exporter.ts"); /* harmony import */ var _Gltf2ExporterEffekseer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Gltf2ExporterEffekseer */ "./src/foundation/exporter/Gltf2ExporterEffekseer.ts"); /***/ }), /***/ "./src/foundation/geometry/ComplexVertexAttribute.ts": /*!***********************************************************!*\ !*** ./src/foundation/geometry/ComplexVertexAttribute.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ComplexVertexAttribute: () => (/* binding */ ComplexVertexAttribute) /* harmony export */ }); class ComplexVertexAttribute { constructor(semanticAttribute, attributes) { this.__components = []; this.__offsets = []; this.__semantic = semanticAttribute; this.__offsets = []; this.__components = []; for (const [joinedString, accessor] of attributes) { const split = joinedString.split(','); for (let i = 0; i < split.length; i++) { const attributeComponentName = split[i]; if (attributeComponentName === semanticAttribute.X) { this.__offsets[0] = i; this.__components[0] = accessor; } if (attributeComponentName === semanticAttribute.Y) { this.__offsets[1] = i; this.__components[1] = accessor; } if (attributeComponentName === semanticAttribute.Z) { this.__offsets[2] = i; this.__components[2] = accessor; } if (attributeComponentName === semanticAttribute.W) { this.__offsets[3] = i; this.__components[3] = accessor; } } } } get semantic() { return this.__semantic; } getScalarAsArray(i, option) { return [this.__components[0].getScalarAt(i, this.__offsets[0], option)]; } getVec2AsArray(i, option) { return [ this.__components[0].getScalarAt(i, this.__offsets[0], option), this.__components[1].getScalarAt(i, this.__offsets[1], option), ]; } getVec3AsArray(i, option) { return [ this.__components[0].getScalarAt(i, this.__offsets[0], option), this.__components[1].getScalarAt(i, this.__offsets[1], option), this.__components[2].getScalarAt(i, this.__offsets[2], option), ]; } getVec4AsArray(i, option) { return [ this.__components[0].getScalarAt(i, this.__offsets[0], option), this.__components[1].getScalarAt(i, this.__offsets[1], option), this.__components[2].getScalarAt(i, this.__offsets[2], option), this.__components[3].getScalarAt(i, this.__offsets[3], option), ]; } } /***/ }), /***/ "./src/foundation/geometry/Frustum.ts": /*!********************************************!*\ !*** ./src/foundation/geometry/Frustum.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Frustum: () => (/* binding */ Frustum) /* harmony export */ }); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /** * The view frustum class. */ class Frustum { constructor() { this.top = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); this.bottom = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); this.right = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); this.left = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); this.zNear = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); this.zFar = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); this.__updated = false; this.__vp = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.zero(); this.__invProjMat = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.zero(); this.__invViewMat = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.zero(); this.corners = []; } /** * Updates this view frustum data from the view and projection matrices. * @param viewMatrix The view matrix. * @param projectionMatrix The projection matrix. */ update(viewMatrix, projectionMatrix) { // Calculate the planes of the view frustum. _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.multiplyTo(projectionMatrix, viewMatrix, this.__vp); this.zNear.x = this.__vp.m20 + this.__vp.m30; this.zNear.y = this.__vp.m21 + this.__vp.m31; this.zNear.z = this.__vp.m22 + this.__vp.m32; this.zNear.w = this.__vp.m23 + this.__vp.m33; // this.zNear.normalize3(); this.zFar.x = -this.__vp.m20 + this.__vp.m30; this.zFar.y = -this.__vp.m21 + this.__vp.m31; this.zFar.z = -this.__vp.m22 + this.__vp.m32; this.zFar.w = -this.__vp.m23 + this.__vp.m33; // this.zFar.normalize3(); this.bottom.x = this.__vp.m10 + this.__vp.m30; this.bottom.y = this.__vp.m11 + this.__vp.m31; this.bottom.z = this.__vp.m12 + this.__vp.m32; this.bottom.w = this.__vp.m13 + this.__vp.m33; // this.bottom.normalize3(); this.top.x = -this.__vp.m10 + this.__vp.m30; this.top.y = -this.__vp.m11 + this.__vp.m31; this.top.z = -this.__vp.m12 + this.__vp.m32; this.top.w = -this.__vp.m13 + this.__vp.m33; // this.top.normalize3(); this.left.x = this.__vp.m00 + this.__vp.m30; this.left.y = this.__vp.m01 + this.__vp.m31; this.left.z = this.__vp.m02 + this.__vp.m32; this.left.w = this.__vp.m03 + this.__vp.m33; // this.left.normalize3(); this.right.x = -this.__vp.m00 + this.__vp.m30; this.right.y = -this.__vp.m01 + this.__vp.m31; this.right.z = -this.__vp.m02 + this.__vp.m32; this.right.w = -this.__vp.m03 + this.__vp.m33; // this.right.normalize3(); // Calculate the corners of the view frustum. const hCorners = [ // near _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(-1, 1, 1, 1), _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(1, 1, 1, 1), _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(1, -1, 1, 1), _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(-1, -1, 1, 1), // far _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(-1, 1, -1, 1), _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(1, 1, -1, 1), _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(1, -1, -1, 1), _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(-1, -1, -1, 1), ]; _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.invertTo(projectionMatrix, this.__invProjMat); _math_Matrix44__WEBPACK_IMPORTED_MODULE_1__.Matrix44.invertTo(viewMatrix, this.__invViewMat); for (let i = 0; i < 8; i++) { hCorners[i] = this.__invProjMat.multiplyVector(hCorners[i]); hCorners[i] = _math_Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4.fromCopy4(hCorners[i].x / hCorners[i].w, hCorners[i].y / hCorners[i].w, hCorners[i].z / hCorners[i].w, 1); this.corners[i] = this.__invViewMat.multiplyVector(hCorners[i]); } } /** * false if fully outside, true if inside or intersects * * original idea is from https://iquilezles.org/articles/frustumcorrect/ */ culling(meshComponent) { const aabb = meshComponent.entity.getSceneGraph().worldMergedAABBWithSkeletal; // check box outside/inside of frustum for (let i = 0; i < 6; i++) { let out = 0; const plane = this.getPlane(i); out += plane.x * aabb.minPoint.x + plane.y * aabb.minPoint.y + plane.z * aabb.minPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.maxPoint.x + plane.y * aabb.minPoint.y + plane.z * aabb.minPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.minPoint.x + plane.y * aabb.maxPoint.y + plane.z * aabb.minPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.maxPoint.x + plane.y * aabb.maxPoint.y + plane.z * aabb.minPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.minPoint.x + plane.y * aabb.minPoint.y + plane.z * aabb.maxPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.maxPoint.x + plane.y * aabb.minPoint.y + plane.z * aabb.maxPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.minPoint.x + plane.y * aabb.maxPoint.y + plane.z * aabb.maxPoint.z + plane.w < 0 ? 1 : 0; out += plane.x * aabb.maxPoint.x + plane.y * aabb.maxPoint.y + plane.z * aabb.maxPoint.z + plane.w < 0 ? 1 : 0; if (out === 8) { return false; } } // check frustum outside/inside box let out = 0; out = 0; for (let i = 0; i < 8; i++) { const plane = this.corners[i]; out += plane.x > aabb.maxPoint.x ? 1 : 0; } if (out === 8) { return false; } out = 0; for (let i = 0; i < 8; i++) { const plane = this.corners[i]; out += plane.x < aabb.minPoint.x ? 1 : 0; } if (out === 8) { return false; } out = 0; for (let i = 0; i < 8; i++) { const plane = this.corners[i]; out += plane.y > aabb.maxPoint.y ? 1 : 0; } if (out === 8) { return false; } out = 0; for (let i = 0; i < 8; i++) { const plane = this.corners[i]; out += plane.y < aabb.minPoint.y ? 1 : 0; } if (out === 8) { return false; } out = 0; for (let i = 0; i < 8; i++) { const plane = this.corners[i]; out += plane.z > aabb.maxPoint.z ? 1 : 0; } if (out === 8) { return false; } out = 0; for (let i = 0; i < 8; i++) { const plane = this.corners[i]; out += plane.z < aabb.minPoint.z ? 1 : 0; } if (out === 8) { return false; } return true; } getPlane(i) { switch (i) { case 0: return this.top; case 1: return this.bottom; case 2: return this.right; case 3: return this.left; case 4: return this.zNear; case 5: return this.zFar; default: throw new Error('Invalid plane index.'); } } } /***/ }), /***/ "./src/foundation/geometry/ISemanticVertexAttribute.ts": /*!*************************************************************!*\ !*** ./src/foundation/geometry/ISemanticVertexAttribute.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/geometry/Mesh.ts": /*!*****************************************!*\ !*** ./src/foundation/geometry/Mesh.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Mesh: () => (/* binding */ Mesh) /* harmony export */ }); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_AABB__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../math/AABB */ "./src/foundation/math/AABB.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * The Mesh class. * This mesh object has primitives (geometries) or a reference of 'original mesh'. * If the latter, this mesh object is an 'instanced mesh', which has no primitives. * Instanced meshes refer original mesh's primitives when drawing. */ class Mesh { /** * Constructor */ constructor() { this.__primitives = []; this.__opaquePrimitives = []; this.__transparentPrimitives = []; this.__morphPrimitives = []; this.__localAABB = new _math_AABB__WEBPACK_IMPORTED_MODULE_7__.AABB(); this.__vaoUids = []; this.__variationVBOUid = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__latestPrimitivePositionAccessorVersionForAABB = 0; this.__latestPrimitivePositionAccessorVersionForSetUpDone = 0; this.__belongToEntities = []; /** * Specification of when calculate the tangent of a vertex to apply Normal texture (for pbr/MToon shader) * 0: Not calculate tangent (not apply normal texture) * 1: (default) Use original tangent in a vertex, if a vertex has tangent attribute. If a vertex does not have it, calculate a tangent in a shader. * 2: Use original tangent in a vertex, if a vertex has tangent attribute. If a vertex does not have it, precalculate a tangent in the javascript. * 3: Calculate all tangent in a shader. * 4: Precalculate all tangent in the javascript */ this.tangentCalculationMode = 1; this.__hasFaceNormal = false; this.__primitivePositionUpdateCount = 0; this.__meshUID = ++Mesh.__mesh_uid_count; } /// /// /// Public Members /// /// getVaoUids(index) { return this.__vaoUids[index]; } getVaoUidsByPrimitiveUid(primitiveUid) { const index = this.__primitives.findIndex((primitive) => primitive.primitiveUid === primitiveUid); return this.__vaoUids[index]; } get meshEntitiesInner() { return this.__belongToEntities; } _belongToMeshComponent(meshComponent) { this.__belongToEntities.push(meshComponent.entity); } /** * Adds primitive. * @param primitive The primitive object. */ addPrimitive(primitive) { primitive._belongToMesh(this); if (primitive.material == null || (!primitive.material.isBlend() && !primitive.material.isTranslucent)) { this.__opaquePrimitives.push(primitive); } else { this.__transparentPrimitives.push(primitive); } this.__setPrimitives(this.__opaquePrimitives.concat(this.__transparentPrimitives)); } __setPrimitives(primitives) { this.__primitives = primitives; } /** * Gets true if these primitives are all 'Blend' type */ isAllTranslucent() { if (this.__transparentPrimitives.length > 0 && this.__opaquePrimitives.length === 0) { return true; } else { return false; } } /** * Gets true if some primitives are 'Blend' type */ isPartiallyTranslucent() { if (this.__transparentPrimitives.length > 0 && this.__opaquePrimitives.length > 0) { return true; } else { return false; } } /** * Gets true if these primitives are all 'Opaque' type */ isAllOpaque() { if (this.__transparentPrimitives.length === 0 && this.__opaquePrimitives.length > 0) { return true; } else { return false; } } getPrimitiveAt(i) { // if (this.weights.length > 0) { // return this.__morphPrimitives[i]; // } else { return this.__primitives[i]; // } } getPrimitiveNumber() { return this.__primitives.length; } /** * @internal * @returns true: updated, false: not changed (not dirty) */ updateVariationVBO() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getCgApiResourceRepository(); if (this.__variationVBOUid !== _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { cgApiResourceRepository.deleteVertexBuffer(this.__variationVBOUid); } const instanceNum = this.__belongToEntities.length; // const entityInfo = new Float32Array(instanceNum); const entityInfo = new Float32Array(instanceNum * 4); for (let i = 0; i < instanceNum; i++) { entityInfo[4 * i + 0] = this.__belongToEntities[i].getSceneGraph().componentSID; const skeletal = this.__belongToEntities[i].tryToGetSkeletal(); if (skeletal != null) { entityInfo[4 * i + 1] = skeletal.componentSID; } else { entityInfo[4 * i + 1] = -1; } const blendShape = this.__belongToEntities[i].tryToGetBlendShape(); if (blendShape != null) { entityInfo[4 * i + 2] = blendShape.componentSID; } else { entityInfo[4 * i + 2] = -1; } } this.__variationVBOUid = cgApiResourceRepository.createVertexBufferFromTypedArray(entityInfo); return true; } /// /// Public WebGL-related Methods /// /** * @internal * @returns true: updated, false: not changed (not dirty) */ deleteVariationVBO() { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getCgApiResourceRepository(); if (this.__variationVBOUid !== _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { webglResourceRepository.deleteVertexBuffer(this.__variationVBOUid); this.__variationVBOUid = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid; return true; } return false; } updateVAO() { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getWebGLResourceRepository(); // create and update VAO for (let i = 0; i < this.__primitives.length; i++) { const primitive = this.__primitives[i]; const vertexHandles = primitive.vertexHandles; if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.undefined(vertexHandles)) { _misc_Logger__WEBPACK_IMPORTED_MODULE_12__.Logger.warn('Need to create 3DAPIVertexData before update VAO'); continue; } if (isNaN(this.__vaoUids[i]) || this.__vaoUids[i] === _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid || vertexHandles.vaoHandle === _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { this.__vaoUids[i] = webglResourceRepository.createVertexArray(); vertexHandles.vaoHandle = this.__vaoUids[i]; } webglResourceRepository.setVertexDataToPipeline(vertexHandles, primitive, this.__variationVBOUid); } // remove useless VAO for (let i = this.__primitives.length; i < this.__vaoUids.length; i++) { if (this.__vaoUids[i]) { webglResourceRepository.deleteVertexArray(this.__vaoUids[i]); this.__vaoUids[i] = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid; } } } deleteVAO() { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getWebGLResourceRepository(); for (let i = 0; i < this.__vaoUids.length; i++) { webglResourceRepository.deleteVertexArray(this.__vaoUids[i]); this.__vaoUids[i] = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.InvalidCGAPIResourceUid; } } castRay(srcPointInLocal, directionInLocal, dotThreshold = 0) { var _a; let finalShortestIntersectedPosVec3; let finalShortestT = Number.MAX_VALUE; let u = 0; let v = 0; for (const primitive of this.__primitives) { const result = primitive.castRay(srcPointInLocal, directionInLocal, true, true, dotThreshold, this.__hasFaceNormal); if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.defined(result.data) && ((_a = result.data) === null || _a === void 0 ? void 0 : _a.t) < finalShortestT) { finalShortestT = result.data.t; finalShortestIntersectedPosVec3 = result.data.position; u = result.data.u; v = result.data.v; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.defined(finalShortestIntersectedPosVec3)) { return { result: true, data: { t: finalShortestT, u, v, position: finalShortestIntersectedPosVec3, }, }; } else { return { result: false, }; } } /// /// /// Accessors /// /// get primitives() { return this.__primitives; } get meshUID() { return this.__meshUID; } /** * @internal */ get _variationVBOUid() { return this.__variationVBOUid; } _onPrimitivePositionUpdated() { this.__primitivePositionUpdateCount++; for (const entity of this.__belongToEntities) { entity.getMeshRenderer().moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_11__.ProcessStage.Load); } } get primitivePositionUpdateCount() { return this.__primitivePositionUpdateCount; } /** * Gets AABB in local space. */ get AABB() { if (this.__primitivePositionUpdateCount !== this.__latestPrimitivePositionAccessorVersionForAABB) { this.__localAABB.initialize(); this.__latestPrimitivePositionAccessorVersionForAABB = this.__primitivePositionUpdateCount; } if (this.__localAABB.isVanilla()) { for (const primitive of this.__primitives) { this.__localAABB.mergeAABB(primitive.AABB); } } return this.__localAABB; } /// /// // Friend Members /// /// /// /// /// Private Members /// /// __calcMorphPrimitives() { for (let i = 0; i < this.__primitives.length; i++) { const morphPrimitive = this.__morphPrimitives[i]; const primitive = this.__primitives[i]; const target0Attributes = primitive.targets[0]; target0Attributes.forEach((accessor, semantic) => { const morphAccessor = morphPrimitive.getAttribute(semantic); const elementCount = morphAccessor.elementCount; for (let j = 0; j < elementCount; j++) { morphAccessor.setElementFromSameCompositionAccessor(j, primitive.getAttribute(semantic)); } }); // primitive.targets.forEach((targetAttributes, k)=>{ // targetAttributes.forEach((accessor, semantic) => { // const morphAccessor = morphPrimitive.getAttribute(semantic)!; // const elementCount = morphAccessor.elementCount; // for (let j = 0; j < elementCount; j++) { // morphAccessor.addElementFromSameCompositionAccessor(j, accessor, this.weights[k]); // } // }); // }); } } /** * @internal */ _calcTangents() { if (!this.__usePreCalculatedTangent()) { return; } for (const primitive of this.__primitives) { const tangentIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Tangent.XYZ); if (tangentIdx !== -1 && this.tangentCalculationMode === 2) { continue; } const texcoordIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Texcoord0.XY); const normalIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Normal.XYZ); if (texcoordIdx !== -1 && normalIdx !== -1) { const positionIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ); const positionAccessor = primitive.attributeAccessors[positionIdx]; const texcoordAccessor = primitive.attributeAccessors[texcoordIdx]; const normalAccessor = primitive.attributeAccessors[normalIdx]; const indicesAccessor = primitive.indicesAccessor; let incrementNum = 3; // PrimitiveMode.Triangles if (primitive.primitiveMode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.TriangleStrip || primitive.primitiveMode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.TriangleFan) { incrementNum = 1; } const vertexNum = primitive.getVertexCountAsIndicesBased(); const buffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_2__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_3__.BufferUse.CPUGeneric); const tangentAttributeByteSize = (positionAccessor.byteLength * 4) / 3; const tangentBufferView = buffer .takeBufferView({ byteLengthToNeed: tangentAttributeByteSize, byteStride: 0, }) .unwrapForce(); const tangentAccessor = tangentBufferView .takeAccessor({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Float, count: positionAccessor.elementCount, }) .unwrapForce(); for (let i = 0; i < vertexNum - 2; i += incrementNum) { const pos0 = positionAccessor.getVec3(i, { indicesAccessor }); const pos1 = positionAccessor.getVec3(i + 1, { indicesAccessor }); const pos2 = positionAccessor.getVec3(i + 2, { indicesAccessor }); const uv0 = texcoordAccessor.getVec2(i, { indicesAccessor }); const uv1 = texcoordAccessor.getVec2(i + 1, { indicesAccessor }); const uv2 = texcoordAccessor.getVec2(i + 2, { indicesAccessor }); const norm0 = normalAccessor.getVec3(i, { indicesAccessor }); this.__calcTangentFor3Vertices(i, pos0, pos1, pos2, uv0, uv1, uv2, norm0, tangentAccessor, indicesAccessor); } primitive.setVertexAttribute(tangentAccessor, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Tangent.XYZ); } } } /** * @internal */ __calcTangentFor3Vertices(i, pos0, pos1, pos2, uv0, uv1, uv2, norm0, tangentAccessor, indicesAccessor) { const tan0Vec3 = this.__calcTangentPerVertex(pos0, pos1, pos2, uv0, uv1, uv2, norm0, Mesh.__tmpReturnVec3_0); const tan1Vec3 = this.__calcTangentPerVertex(pos1, pos2, pos0, uv1, uv2, uv0, norm0, Mesh.__tmpReturnVec3_1); const tan2Vec3 = this.__calcTangentPerVertex(pos2, pos0, pos1, uv2, uv0, uv1, norm0, Mesh.__tmpReturnVec3_2); tangentAccessor.setVec4(i, tan0Vec3.x, tan0Vec3.y, tan0Vec3.z, 1, { indicesAccessor, }); tangentAccessor.setVec4(i + 1, tan1Vec3.x, tan1Vec3.y, tan1Vec3.z, 1, { indicesAccessor, }); tangentAccessor.setVec4(i + 2, tan2Vec3.x, tan2Vec3.y, tan2Vec3.z, 1, { indicesAccessor, }); } __calcTangentPerVertex(pos0Vec3, pos1Vec3, pos2Vec3, uv0Vec2, uv1Vec2, uv2Vec2, norm0Vec3, returnVec3) { const cp0 = [ Mesh.__tmpVec3_0.setComponents(pos0Vec3.x, uv0Vec2.x, uv0Vec2.y), Mesh.__tmpVec3_1.setComponents(pos0Vec3.y, uv0Vec2.x, uv0Vec2.y), Mesh.__tmpVec3_2.setComponents(pos0Vec3.z, uv0Vec2.x, uv0Vec2.y), ]; const cp1 = [ Mesh.__tmpVec3_3.setComponents(pos1Vec3.x, uv1Vec2.x, uv1Vec2.y), Mesh.__tmpVec3_4.setComponents(pos1Vec3.y, uv1Vec2.x, uv1Vec2.y), Mesh.__tmpVec3_5.setComponents(pos1Vec3.z, uv1Vec2.x, uv1Vec2.y), ]; const cp2 = [ Mesh.__tmpVec3_6.setComponents(pos2Vec3.x, uv2Vec2.x, uv2Vec2.y), Mesh.__tmpVec3_7.setComponents(pos2Vec3.y, uv2Vec2.x, uv2Vec2.y), Mesh.__tmpVec3_8.setComponents(pos2Vec3.z, uv2Vec2.x, uv2Vec2.y), ]; const u = []; const v = []; for (let i = 0; i < 3; i++) { const v1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.subtractTo(cp1[i], cp0[i], Mesh.__tmpVec3_9); const v2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.subtractTo(cp2[i], cp1[i], Mesh.__tmpVec3_10); const abc = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.crossTo(v1, v2, Mesh.__tmpVec3_11); const validate = Math.abs(abc.x) < Number.EPSILON; if (validate) { _misc_Logger__WEBPACK_IMPORTED_MODULE_12__.Logger.assert(validate, 'Polygons or polygons on UV are degenerate!'); return _math_Vector3__WEBPACK_IMPORTED_MODULE_6__.Vector3.fromCopyArray([0, 0, 0]); } u[i] = -abc.y / abc.x; v[i] = -abc.z / abc.x; } if (u[0] * u[0] + u[1] * u[1] + u[2] * u[2] < Number.EPSILON) { _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.crossTo(norm0Vec3, pos1Vec3, returnVec3); return returnVec3.normalize(); } return returnVec3.setComponents(u[0], u[1], u[2]).normalize(); } __usePreCalculatedTangent() { if (this.tangentCalculationMode === 0 || this.tangentCalculationMode === 1 || this.tangentCalculationMode === 3) { return false; } else { return true; } } /** * @internal */ _calcBaryCentricCoord() { for (const primitive of this.__primitives) { const BaryCentricCoordId = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.BaryCentricCoord.XYZ); if (BaryCentricCoordId !== -1) { return; } const buffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_2__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_3__.BufferUse.CPUGeneric); const positionIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ); const positionAccessor = primitive.attributeAccessors[positionIdx]; const vertexNum = positionAccessor.elementCount; const num = vertexNum; const baryCentricCoordAttributeByteSize = num * 4 /* vec4 */ * 4; /* bytes */ const baryCentricCoordBufferView = buffer .takeBufferView({ byteLengthToNeed: baryCentricCoordAttributeByteSize, byteStride: 0, }) .unwrapForce(); const baryCentricCoordAccessor = baryCentricCoordBufferView .takeAccessor({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Float, count: num, }) .unwrapForce(); for (let ver_i = 0; ver_i < num; ver_i++) { baryCentricCoordAccessor.setVec4(ver_i, ver_i % 3 === 0 ? 1 : 0, // 1 0 0 1 0 0 1 0 0, ver_i % 3 === 1 ? 1 : 0, // 0 1 0 0 1 0 0 1 0, ver_i % 3 === 2 ? 1 : 0, // 0 0 1 0 0 1 0 0 1, ver_i, {}); } primitive.setVertexAttribute(baryCentricCoordAccessor, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.BaryCentricCoord.XYZ); } } /** * @internal */ _calcFaceNormalsIfNonNormal() { for (const primitive of this.__primitives) { const normalIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Normal.XYZ); if (normalIdx !== -1) { return; } this.__hasFaceNormal = true; const positionIdx = primitive.attributeSemantics.indexOf(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ); const positionAccessor = primitive.attributeAccessors[positionIdx]; const indicesAccessor = primitive.indicesAccessor; let incrementNum = 3; // PrimitiveMode.Triangles if (primitive.primitiveMode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.TriangleStrip || primitive.primitiveMode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.TriangleFan) { incrementNum = 1; } const vertexNum = primitive.getVertexCountAsIndicesBased(); const buffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_2__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_3__.BufferUse.CPUGeneric); const normalAttributeByteSize = positionAccessor.byteLength; const normalBufferView = buffer .takeBufferView({ byteLengthToNeed: normalAttributeByteSize, byteStride: 0, }) .unwrapForce(); const normalAccessor = normalBufferView .takeAccessor({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Float, count: positionAccessor.elementCount, }) .unwrapForce(); for (let i = 0; i < vertexNum - 2; i += incrementNum) { const pos0 = positionAccessor.getVec3(i, { indicesAccessor }); const pos1 = positionAccessor.getVec3(i + 1, { indicesAccessor }); const pos2 = positionAccessor.getVec3(i + 2, { indicesAccessor }); this.__calcFaceNormalFor3Vertices(i, pos0, pos1, pos2, normalAccessor, indicesAccessor); } primitive.setVertexAttribute(normalAccessor, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Normal.XYZ); } } __calcFaceNormalFor3Vertices(i, pos0, pos1, pos2, normalAccessor, indicesAccessor) { // Calc normal const ax = pos1.x - pos0.x; const ay = pos1.y - pos0.y; const az = pos1.z - pos0.z; const bx = pos2.x - pos0.x; const by = pos2.y - pos0.y; const bz = pos2.z - pos0.z; let nx = ay * bz - az * by; // cross product let ny = az * bx - ax * bz; let nz = ax * by - ay * bx; let da = Math.hypot(nx, ny, nz); // normalize if (da <= 1e-6) { da = 0.0001; } da = 1.0 / da; nx *= da; ny *= da; nz *= da; normalAccessor.setVec3(i, nx, ny, nz, { indicesAccessor }); normalAccessor.setVec3(i + 1, nx, ny, nz, { indicesAccessor }); normalAccessor.setVec3(i + 2, nx, ny, nz, { indicesAccessor }); } getPrimitiveIndexInMesh(primitive) { return this.primitives.indexOf(primitive); } /** * Apply a material variant to the mesh * @param variantName a variant name */ applyMaterialVariant(variantName) { for (const primitive of this.primitives) { primitive.applyMaterialVariant(variantName); } } getCurrentVariantName() { function allEqual(arr) { return arr.every((val) => val === arr[0]); } const variantNames = this.primitives.map((primitive) => primitive.getCurrentVariantName()); if (variantNames.length === 0) { return ''; } if (allEqual(variantNames)) { return variantNames[0]; } return ''; } getVariantNames() { const variants = []; for (const primitive of this.primitives) { Array.prototype.push.apply(variants, primitive.getVariantNames()); } return variants; } isSetUpDone() { let vertexHandlesReady = true; for (const primitive of this.primitives) { if (primitive.vertexHandles == null) { vertexHandlesReady = false; break; } } if (!vertexHandlesReady) { return false; } if (this.__latestPrimitivePositionAccessorVersionForSetUpDone !== this.__primitivePositionUpdateCount) { this.__latestPrimitivePositionAccessorVersionForSetUpDone = this.__primitivePositionUpdateCount; return false; } return true; } } Mesh.invalidateMeshUID = -1; Mesh.__mesh_uid_count = Mesh.invalidateMeshUID; Mesh.__tmpVec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_4 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_5 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_6 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_7 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_8 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_9 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_10 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpVec3_11 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpReturnVec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpReturnVec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); Mesh.__tmpReturnVec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_9__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/geometry/Primitive.ts": /*!**********************************************!*\ !*** ./src/foundation/geometry/Primitive.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Primitive: () => (/* binding */ Primitive) /* harmony export */ }); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_AABB__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../math/AABB */ "./src/foundation/math/AABB.ts"); /* harmony import */ var _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../helpers/MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./types/GeometryTypes */ "./src/foundation/geometry/types/GeometryTypes.ts"); /* harmony import */ var _misc_Option__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../misc/Option */ "./src/foundation/misc/Option.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _misc_RnException__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../misc/RnException */ "./src/foundation/misc/RnException.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class Primitive extends _core_RnObject__WEBPACK_IMPORTED_MODULE_2__.RnObject { constructor() { super(); this.__mode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.Unknown; this.__materialVariants = new Map(); this.__currentVariantName = ''; this.__attributes = new Map(); this.__oIndices = new _misc_Option__WEBPACK_IMPORTED_MODULE_13__.None(); this.__primitiveUid = -1; // start ID from zero this.__aabb = new _math_AABB__WEBPACK_IMPORTED_MODULE_6__.AABB(); this.__targets = []; this._sortkey = 0; this._viewDepth = 0; this.__latestPositionAccessorVersion = 0; this.__positionAccessorVersion = 0; this.__fingerPrint = ''; if (Primitive.__defaultMaterial == null) { Primitive.__defaultMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_7__.MaterialHelper.createClassicUberMaterial({ isSkinning: true, isLighting: true, }); } this.__material = Primitive.__defaultMaterial; this._prevMaterial = new WeakRef(Primitive.__defaultMaterial); } calcFingerPrint() { let str = ''; str += this.__mode.index; if (this.__oIndices.has()) { str += this.getIndexBitSize(); } str += this.targets.length; str += Primitive.getPrimitiveIdxHasMorph(this.__primitiveUid); for (const [semantic, accessor] of this.__attributes) { str += semantic; str += accessor.componentType.webgpu + accessor.compositionType.webgpu; str += accessor.actualByteStride; } this.__fingerPrint = str; } _getFingerPrint() { return this.__fingerPrint; } static getPrimitiveIdxHasMorph(primitiveUid) { return this.__primitiveUidIdxHasMorph.get(primitiveUid); } static getPrimitiveHasMorph(primitiveIdx) { var _a; return (_a = this.__idxPrimitiveUidHasMorph.get(primitiveIdx)) === null || _a === void 0 ? void 0 : _a.deref(); } getIndexBitSize() { const indexAccessor = this.__oIndices.unwrapOrUndefined(); if (indexAccessor == null) { throw new Error('indexAccessor is null'); } else { if (indexAccessor.componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.UnsignedShort) { return 'uint16'; } else if (indexAccessor.componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.UnsignedInt) { return 'uint32'; } else if (indexAccessor.componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.UnsignedByte) { return 'uint16'; } else { throw new Error('unknown indexAccessor.componentType'); } } } get _vertexHandles() { return this.__vertexHandles; } static get variantUpdateCount() { return this.__variantUpdateCount; } setMaterialVariant(variantName, material) { this.__materialVariants.set(variantName, material); Primitive.__variantUpdateCount++; } applyMaterialVariant(variantName) { const variant = this.__materialVariants.get(variantName); if (variant) { this.material = variant; this.__currentVariantName = variantName; Primitive.__variantUpdateCount++; } } getCurrentVariantName() { for (const [name, material] of this.__materialVariants) { if (material === this.__material) { return name; } } return ''; } getVariantNames() { return Array.from(this.__materialVariants.keys()); } getVariantMaterial(variantName) { return this.__materialVariants.get(variantName); } set material(mat) { this.__material = mat; this.setSortKey(_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__.PrimitiveSortKey_BitOffset_Material, _types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__.PrimitiveSortKey_BitLength_Material, mat.materialUID); let translucencyType = 0; // opaque if (mat.isTranslucentOpaque()) { translucencyType = 1; // translucent } else if (mat.isBlend()) { translucencyType = 2; // blend } this.setSortKey(_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__.PrimitiveSortKey_BitOffset_TranslucencyType, _types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__.PrimitiveSortKey_BitLength_TranslucencyType, translucencyType); mat._addBelongPrimitive(this); } get material() { return this.__material; } setSortKey(offset, length, value) { const offsetValue = value << offset; this._sortkey |= offsetValue; // Creates a mask with the specified bit length let mask = (1 << length) - 1; // Clear designated offset bits this._sortkey &= ~(mask << offset); // Writes a value to the specified offset this._sortkey |= (value & mask) << offset; } /** * belong to mesh (weak reference) * @param mesh */ _belongToMesh(mesh) { // this.setSortKey(PrimitiveSortKey_BitOffset_Mesh, mesh.meshUID); this.__mesh = mesh; } get mesh() { return this.__mesh; } _backupMaterial() { this._prevMaterial = new WeakRef(this.__material); } _restoreMaterial() { const material = this._prevMaterial.deref(); if (material != null) { this.__material = material; } } static getPrimitive(primitiveUid) { var _a; return (_a = this.__primitives[primitiveUid]) === null || _a === void 0 ? void 0 : _a.deref(); } static getPrimitiveCount() { return this.__primitiveCount; } onAccessorUpdated(accessorVersion) { this.__positionAccessorVersion = accessorVersion; if (this.__mesh != null) { this.__mesh._onPrimitivePositionUpdated(); } } setData(attributes, mode, material, indicesAccessor) { this.__oIndices = new _misc_Option__WEBPACK_IMPORTED_MODULE_13__.Option(indicesAccessor); this.__attributes = attributes; const positionAccessor = this.__attributes.get(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Position.XYZ); positionAccessor._primitive = new WeakRef(this); if (material != null) { this.material = material; } else { this.material = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_7__.MaterialHelper.createClassicUberMaterial({ isSkinning: true, isLighting: true, }); } this.__mode = mode; this.setSortKey(_types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__.PrimitiveSortKey_BitOffset_PrimitiveType, _types_GeometryTypes__WEBPACK_IMPORTED_MODULE_12__.PrimitiveSortKey_BitLength_PrimitiveType, mode.index); this.__primitiveUid = Primitive.__primitiveCount++; Primitive.__primitives[this.__primitiveUid] = new WeakRef(this); this.calcFingerPrint(); } static get maxPrimitiveCount() { return 500; } copyVertexData({ attributes, attributeSemantics, primitiveMode, indices, material, }) { let sumOfAttributesByteSize = 0; const byteAlign = 4; attributes.forEach((attribute) => { sumOfAttributesByteSize += attribute.byteLength; }); let bufferSize = sumOfAttributesByteSize; if (indices != null) { bufferSize += _misc_DataUtil__WEBPACK_IMPORTED_MODULE_14__.DataUtil.addPaddingBytes(indices.byteLength, byteAlign); } const buffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_4__.MemoryManager.getInstance().createBufferOnDemand(bufferSize, this, byteAlign); let indicesComponentType; let indicesAccessor; if (indices != null) { indicesComponentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.fromTypedArray(indices); const indicesBufferViewResult = buffer.takeBufferView({ byteLengthToNeed: indices.byteLength, byteStride: 0, }); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_16__.isErr)(indicesBufferViewResult)) { throw new _misc_RnException__WEBPACK_IMPORTED_MODULE_17__.RnException(indicesBufferViewResult.getRnError()); } const indicesAccessorResult = indicesBufferViewResult.get().takeAccessor({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__.CompositionType.Scalar, componentType: indicesComponentType, count: indices.byteLength / indicesComponentType.getSizeInBytes(), }); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_16__.isErr)(indicesAccessorResult)) { throw new _misc_RnException__WEBPACK_IMPORTED_MODULE_17__.RnException(indicesAccessorResult.getRnError()); } indicesAccessor = indicesAccessorResult.get(); // copy indices for (let i = 0; i < indices.byteLength / indicesAccessor.componentSizeInBytes; i++) { indicesAccessor.setScalar(i, indices[i], {}); } } const attributesBufferView = buffer .takeBufferView({ byteLengthToNeed: sumOfAttributesByteSize, byteStride: 0, }) .unwrapForce(); const attributeAccessors = []; const attributeComponentTypes = []; attributes.forEach((typedArray, i) => { const compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_5__.CompositionType.vectorFrom(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.toVectorComponentN(attributeSemantics[i])); attributeComponentTypes[i] = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.fromTypedArray(attributes[i]); const accessor = attributesBufferView .takeAccessor({ compositionType, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.fromTypedArray(attributes[i]), count: typedArray.byteLength / compositionType.getNumberOfComponents() / attributeComponentTypes[i].getSizeInBytes(), }) .unwrapForce(); accessor.copyFromTypedArray(typedArray); attributeAccessors.push(accessor); }); const attributeMap = new Map(); for (let i = 0; i < attributeSemantics.length; i++) { const attributeSemantic = attributeSemantics[i]; attributeMap.set(attributeSemantic, attributeAccessors[i]); } this.setData(attributeMap, primitiveMode, material, indicesAccessor); } static createPrimitive(desc) { const primitive = new Primitive(); primitive.copyVertexData(desc); return primitive; } get indicesAccessor() { return this.__oIndices.unwrapOrUndefined(); } getVertexCountAsIndicesBased() { if (this.indicesAccessor) { return this.indicesAccessor.elementCount; } else { return this.getVertexCountAsVerticesBased(); } } getVertexCountAsVerticesBased() { for (const accessor of this.__attributes.values()) { return accessor.elementCount; } return 0; } getTriangleCountAsIndicesBased() { if (this.indicesAccessor) { switch (this.__mode) { case _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.Triangles: return this.indicesAccessor.elementCount / 3; case _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.TriangleStrip: return this.indicesAccessor.elementCount - 2; case _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.TriangleFan: return this.indicesAccessor.elementCount - 2; default: return 0; } } else { return this.getTriangleCountAsVerticesBased(); } } getTriangleCountAsVerticesBased() { for (const accessor of this.__attributes.values()) { switch (this.__mode) { case _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.Triangles: return accessor.elementCount / 3; case _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.TriangleStrip: return accessor.elementCount - 2; case _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.TriangleFan: return accessor.elementCount - 2; default: return 0; } } return 0; } hasIndices() { return this.__oIndices.has(); } get attributeAccessors() { const accessors = []; this.__attributes.forEach((accessor, semantic) => { accessors.push(accessor); }); return accessors; } getAttribute(semantic) { return this.__attributes.get(semantic); } get attributeSemantics() { const semantics = []; this.__attributes.forEach((accessor, semantic) => { semantics.push(semantic); }); return semantics; } get attributeEntries() { return this.__attributes.entries(); } get attributeCompositionTypes() { const types = []; this.__attributes.forEach((accessor, semantic) => { types.push(accessor.compositionType); }); return types; } get attributeComponentTypes() { const types = []; this.__attributes.forEach((accessor, semantic) => { types.push(accessor.componentType); }); return types; } get primitiveMode() { return this.__mode; } get primitiveUid() { return this.__primitiveUid; } get positionAccessorVersion() { return this.__positionAccessorVersion; } get AABB() { if (this.__aabb.isVanilla() || this.positionAccessorVersion !== this.__latestPositionAccessorVersion) { const positionAccessor = this.__attributes.get(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Position.XYZ); const min = positionAccessor.min; this.__aabb.minPoint = Primitive.__tmpVec3_0.setComponents(min[0], min[1], min[2]); const max = positionAccessor.max; this.__aabb.maxPoint = Primitive.__tmpVec3_0.setComponents(max[0], max[1], max[2]); this.__latestPositionAccessorVersion = positionAccessor.version; } return this.__aabb; } setVertexAttribute(accessor, vertexSemantic) { this.__attributes.set(vertexSemantic, accessor); } removeIndices() { this.__oIndices = new _misc_Option__WEBPACK_IMPORTED_MODULE_13__.None(); } setIndices(accessor) { this.__oIndices = new _misc_Option__WEBPACK_IMPORTED_MODULE_13__.Some(accessor); } setBlendShapeTargets(targets) { if (Primitive.__primitiveUidIdxHasMorph.size >= _core_Config__WEBPACK_IMPORTED_MODULE_15__.Config.maxVertexPrimitiveNumberInShader) { _misc_Logger__WEBPACK_IMPORTED_MODULE_18__.Logger.error('Primitive.__primitiveUidsHasMorph.size exceeds the Config.maxMorphPrimitiveNumber'); } else { Primitive.__idxPrimitiveUidHasMorph.set(Primitive.__primitiveCountHasMorph, new WeakRef(this)); Primitive.__primitiveUidIdxHasMorph.set(this.__primitiveUid, Primitive.__primitiveCountHasMorph++); } this.__targets = targets; this.calcFingerPrint(); } getBlendShapeTargets() { return this.__targets.concat(); } get targets() { return this.__targets; } isBlend() { if (this.material == null || !this.material.isBlend()) { return false; } else { return true; } } isOpaque() { return !this.isBlend(); } create3DAPIVertexData() { if (this.__vertexHandles != null) { return false; } const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getCgApiResourceRepository(); this.__vertexHandles = cgApiResourceRepository.createVertexBufferAndIndexBuffer(this); return true; } update3DAPIVertexData() { const vertexHandles = this.__vertexHandles; if (_misc_Is__WEBPACK_IMPORTED_MODULE_11__.Is.not.exist(this.__vertexHandles)) { return false; } const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.updateVertexBufferAndIndexBuffer(this, vertexHandles); return true; } delete3DAPIVertexData() { if (this.__vertexHandles == null) { return false; } const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_8__.CGAPIResourceRepository.getWebGLResourceRepository(); webglResourceRepository.deleteVertexDataResources(this.__vertexHandles); this.__vertexHandles = undefined; return true; } get vertexHandles() { return this.__vertexHandles; } castRay(origVec3, dirVec3, isFrontFacePickable, isBackFacePickable, dotThreshold, hasFaceNormal) { let currentShortestT = Number.MAX_VALUE; let incrementNum = 3; // gl.TRIANGLES if (this.__mode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.TriangleStrip) { // gl.TRIANGLE_STRIP incrementNum = 1; } else if (this.__mode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.Points) { return { result: false, }; } let hitPos0IndexBase = 0; let hitPos1IndexBase = 0; const hitPos2IndexBase = 0; let u = 0; let v = 0; if (this.hasIndices()) { const indices = this.__oIndices.unwrapForce(); for (let i = 0; i < indices.elementCount - 2; i++) { const j = i * incrementNum; if (j + 2 > indices.elementCount - 1) { // gl.TRIANGLES break; } const pos0IndexBase = indices.getScalar(j, {}); const pos1IndexBase = indices.getScalar(j + 1, {}); const pos2IndexBase = indices.getScalar(j + 2, {}); const result = this.__castRayInnerTomasMoller(origVec3, dirVec3, i, pos0IndexBase, pos1IndexBase, pos2IndexBase, isFrontFacePickable, isBackFacePickable, dotThreshold, hasFaceNormal); if (_misc_Is__WEBPACK_IMPORTED_MODULE_11__.Is.false(result) || _misc_Is__WEBPACK_IMPORTED_MODULE_11__.Is.not.exist(result.data)) { continue; } else { if (result.data.t < currentShortestT) { currentShortestT = result.data.t; u = result.data.u; v = result.data.v; hitPos0IndexBase = pos0IndexBase; hitPos1IndexBase = pos1IndexBase; hitPos0IndexBase = pos2IndexBase; } } } } else { let elementCount = 0; for (const accessor of this.__attributes.values()) { elementCount = accessor.elementCount; break; } for (let i = 0; i < elementCount; i += incrementNum) { const pos0IndexBase = i; const pos1IndexBase = i + 1; const pos2IndexBase = i + 2; const result = this.__castRayInnerTomasMoller(origVec3, dirVec3, i, pos0IndexBase, pos1IndexBase, pos2IndexBase, isFrontFacePickable, isBackFacePickable, dotThreshold, hasFaceNormal); if (result.result && _misc_Is__WEBPACK_IMPORTED_MODULE_11__.Is.defined(result.data)) { const t = result.data.t; if (t < currentShortestT) { currentShortestT = t; u = result.data.u; v = result.data.v; hitPos0IndexBase = pos0IndexBase; hitPos1IndexBase = pos1IndexBase; hitPos0IndexBase = pos2IndexBase; } } } } if (currentShortestT === Number.MAX_VALUE) { return { result: false, }; } else { const currentShortestIntersectedPosVec3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.fromCopy3(dirVec3.x * currentShortestT + origVec3.x, dirVec3.y * currentShortestT + origVec3.y, dirVec3.z * currentShortestT + origVec3.z); return { result: true, data: { t: currentShortestT, u, v, position: currentShortestIntersectedPosVec3, }, }; } } __castRayInnerTomasMoller(origVec3, dirVec3, i, pos0IndexBase, pos1IndexBase, pos2IndexBase, isFrontFacePickable, isBackFacePickable, dotThreshold, hasFaceNormal) { if (hasFaceNormal) { const normalAccessor = this.__attributes.get(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Normal.XYZ); if (normalAccessor) { const normal = normalAccessor.getVec3(i, {}); if (normal.dot(dirVec3) < dotThreshold && !isFrontFacePickable) { return { result: false, }; } if (normal.dot(dirVec3) > -dotThreshold && !isBackFacePickable) { return { result: false, }; } } } const positionAccessor = this.__attributes.get(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Position.XYZ); const pos0Vec3 = positionAccessor.getVec3(pos0IndexBase, {}); const pos1Vec3 = positionAccessor.getVec3(pos1IndexBase, {}); const pos2Vec3 = positionAccessor.getVec3(pos2IndexBase, {}); const e1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero(); const e2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero(); const pvec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero(); const tvec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero(); const qvec = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero(); let u = 0, v = 0; _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.subtractTo(pos1Vec3, pos0Vec3, e1); _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.subtractTo(pos2Vec3, pos0Vec3, e2); _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.crossTo(dirVec3, e2, pvec); const det = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.dot(e1, pvec); if (det > 0.0001) { _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.subtractTo(origVec3, pos0Vec3, tvec); u = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.dot(tvec, pvec); if (u < 0.0 || u > det) { return { result: false, }; } _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.crossTo(tvec, e1, qvec); v = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.dot(dirVec3, qvec); if (v < 0.0 || u + v > det) { return { result: false, }; } } else if (det < -0.0001) { _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.subtractTo(origVec3, pos0Vec3, tvec); u = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.dot(tvec, pvec); if (u > 0.0 || u < det) { return { result: false, }; } _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.crossTo(tvec, e1, qvec); v = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.dot(dirVec3, qvec); if (v > 0.0 || u + v < det) { return { result: false, }; } } else { return { result: false, }; } const inv_det = 1.0 / det; let t = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.dot(e2, qvec); t *= inv_det; u *= inv_det; v *= inv_det; return { result: true, data: { t, u, v, }, }; } __calcNormalFromUV(pos0IndexBase, pos1IndexBase, pos2IndexBase, u, v) { const fDat = 1.0 - u - v; const positionAccessor = this.__attributes.get(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Position.XYZ); const pos0Vec3 = positionAccessor.getVec3(pos0IndexBase, {}); const pos1Vec3 = positionAccessor.getVec3(pos1IndexBase, {}); const pos2Vec3 = positionAccessor.getVec3(pos2IndexBase, {}); const pos0 = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.multiply(pos0Vec3, fDat); const pos1 = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.multiply(pos1Vec3, u); const pos2 = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.multiply(pos2Vec3, v); const intersectedPosVec3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero().add(pos0).add(pos1).add(pos2); return intersectedPosVec3; } } Primitive.__primitiveCount = 0; Primitive.__primitives = []; Primitive.__primitiveUidIdxHasMorph = new Map(); Primitive.__idxPrimitiveUidHasMorph = new Map(); Primitive.__primitiveCountHasMorph = 0; Primitive.__tmpVec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.zero(); Primitive.__variantUpdateCount = 0; /***/ }), /***/ "./src/foundation/geometry/SimpleVertexAttribute.ts": /*!**********************************************************!*\ !*** ./src/foundation/geometry/SimpleVertexAttribute.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SimpleVertexAttribute: () => (/* binding */ SimpleVertexAttribute) /* harmony export */ }); class SimpleVertexAttribute { constructor(semanticAttribute, accessor) { this.__semantic = semanticAttribute; this.__accessor = accessor; } get semantic() { return this.__semantic; } getScalarAsArray(i, option) { return [this.__accessor.getScalar(i, option)]; } getVec2AsArray(i, option) { return this.__accessor.getVec2AsArray(i, option); } getVec3AsArray(i, option) { return this.__accessor.getVec3AsArray(i, option); } getVec4AsArray(i, option) { return this.__accessor.getVec4AsArray(i, option); } } /***/ }), /***/ "./src/foundation/geometry/index.ts": /*!******************************************!*\ !*** ./src/foundation/geometry/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Axis: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Axis), /* harmony export */ ComplexVertexAttribute: () => (/* reexport safe */ _ComplexVertexAttribute__WEBPACK_IMPORTED_MODULE_2__.ComplexVertexAttribute), /* harmony export */ Cube: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Cube), /* harmony export */ Frustum: () => (/* reexport safe */ _Frustum__WEBPACK_IMPORTED_MODULE_3__.Frustum), /* harmony export */ Grid: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Grid), /* harmony export */ IShape: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.IShape), /* harmony export */ Joint: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Joint), /* harmony export */ Line: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Line), /* harmony export */ Mesh: () => (/* reexport safe */ _Mesh__WEBPACK_IMPORTED_MODULE_5__.Mesh), /* harmony export */ Plane: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Plane), /* harmony export */ Primitive: () => (/* reexport safe */ _Primitive__WEBPACK_IMPORTED_MODULE_6__.Primitive), /* harmony export */ PrimitiveSortKey_BitLength_Depth: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitLength_Depth), /* harmony export */ PrimitiveSortKey_BitLength_Material: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitLength_Material), /* harmony export */ PrimitiveSortKey_BitLength_PrimitiveType: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitLength_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitLength_TranslucencyType: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitLength_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_Material: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitOffset_Material), /* harmony export */ PrimitiveSortKey_BitOffset_PrimitiveType: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitOffset_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitOffset_TranslucencyType: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitOffset_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_ViewportLayer: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.PrimitiveSortKey_BitOffset_ViewportLayer), /* harmony export */ SimpleVertexAttribute: () => (/* reexport safe */ _SimpleVertexAttribute__WEBPACK_IMPORTED_MODULE_7__.SimpleVertexAttribute), /* harmony export */ Sphere: () => (/* reexport safe */ _shapes_index__WEBPACK_IMPORTED_MODULE_0__.Sphere), /* harmony export */ isBlend: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.isBlend), /* harmony export */ isTranslucent: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_1__.isTranslucent) /* harmony export */ }); /* harmony import */ var _shapes_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shapes/index */ "./src/foundation/geometry/shapes/index.ts"); /* harmony import */ var _types_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types/index */ "./src/foundation/geometry/types/index.ts"); /* harmony import */ var _ComplexVertexAttribute__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ComplexVertexAttribute */ "./src/foundation/geometry/ComplexVertexAttribute.ts"); /* harmony import */ var _Frustum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Frustum */ "./src/foundation/geometry/Frustum.ts"); /* harmony import */ var _ISemanticVertexAttribute__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ISemanticVertexAttribute */ "./src/foundation/geometry/ISemanticVertexAttribute.ts"); /* harmony import */ var _Mesh__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _Primitive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _SimpleVertexAttribute__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SimpleVertexAttribute */ "./src/foundation/geometry/SimpleVertexAttribute.ts"); /***/ }), /***/ "./src/foundation/geometry/shapes/Axis.ts": /*!************************************************!*\ !*** ./src/foundation/geometry/shapes/Axis.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Axis: () => (/* binding */ Axis) /* harmony export */ }); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _shapes_IShape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shapes/IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /** * the Axis class */ class Axis extends _shapes_IShape__WEBPACK_IMPORTED_MODULE_2__.IShape { /** * Generates a axis object * @param _desc a descriptor object of a Axis */ generate(_desc) { var _a; const desc = { length: (_a = _desc.length) !== null && _a !== void 0 ? _a : 1, material: _desc.material, }; // prettier-ignore const positions = [ // X axis 0, 0, 0, desc.length, 0, 0, // Y axis 0, 0, 0, 0, desc.length, 0, // Z axis 0, 0, 0, 0, 0, desc.length, ]; // prettier-ignore const colors = [ // X axis as Red 1, 0, 0, 1, 0, 0, // Y axis as Green 0, 1, 0, 0, 1, 0, // Z axis as Blue 0, 0, 1, 0, 0, 1, ]; const attributes = [new Float32Array(positions), new Float32Array(colors)]; // Check Size const attributeSemantics = [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Color0.XYZ]; this.copyVertexData({ attributes, attributeSemantics, primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, material: desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/Cube.ts": /*!************************************************!*\ !*** ./src/foundation/geometry/shapes/Cube.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cube: () => (/* binding */ Cube) /* harmony export */ }); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /** * The Cube Primitive class */ class Cube extends _IShape__WEBPACK_IMPORTED_MODULE_4__.IShape { /** * Generates a cube object * @param _desc a descriptor object of a Cube */ generate(_desc) { var _a; const desc = { widthVector: (_a = _desc.widthVector) !== null && _a !== void 0 ? _a : _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopy3(1, 1, 1), color: _desc.color, material: _desc.material, }; // prettier-ignore const indices = [ 3, 1, 0, 2, 1, 3, 4, 5, 7, 7, 5, 6, 8, 9, 11, 11, 9, 10, 15, 13, 12, 14, 13, 15, 19, 17, 16, 18, 17, 19, 20, 21, 23, 23, 21, 22 ]; // prettier-ignore const positions = [ // upper -desc.widthVector.x / 2, desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, desc.widthVector.y / 2, desc.widthVector.z / 2, -desc.widthVector.x / 2, desc.widthVector.y / 2, desc.widthVector.z / 2, // lower -desc.widthVector.x / 2, -desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, -desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, -desc.widthVector.y / 2, desc.widthVector.z / 2, -desc.widthVector.x / 2, -desc.widthVector.y / 2, desc.widthVector.z / 2, // front -desc.widthVector.x / 2, -desc.widthVector.y / 2, desc.widthVector.z / 2, desc.widthVector.x / 2, -desc.widthVector.y / 2, desc.widthVector.z / 2, desc.widthVector.x / 2, desc.widthVector.y / 2, desc.widthVector.z / 2, -desc.widthVector.x / 2, desc.widthVector.y / 2, desc.widthVector.z / 2, // back -desc.widthVector.x / 2, -desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, -desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, desc.widthVector.y / 2, -desc.widthVector.z / 2, -desc.widthVector.x / 2, desc.widthVector.y / 2, -desc.widthVector.z / 2, // right desc.widthVector.x / 2, -desc.widthVector.y / 2, -desc.widthVector.z / 2, desc.widthVector.x / 2, -desc.widthVector.y / 2, desc.widthVector.z / 2, desc.widthVector.x / 2, desc.widthVector.y / 2, desc.widthVector.z / 2, desc.widthVector.x / 2, desc.widthVector.y / 2, -desc.widthVector.z / 2, // left -desc.widthVector.x / 2, -desc.widthVector.y / 2, -desc.widthVector.z / 2, -desc.widthVector.x / 2, -desc.widthVector.y / 2, desc.widthVector.z / 2, -desc.widthVector.x / 2, desc.widthVector.y / 2, desc.widthVector.z / 2, -desc.widthVector.x / 2, desc.widthVector.y / 2, -desc.widthVector.z / 2, ]; // prettier-ignore const colors = _misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.not.exist(desc.color) ? [] : [ desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, desc.color.r, desc.color.g, desc.color.b, desc.color.a, ]; // prettier-ignore const texcoords = [ // upper 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // lower 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // front 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // back 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // right 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // left 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, ]; // prettier-ignore const normals = [ // upper 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // lower 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, // front 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // back 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, // left -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, ]; /// Check Size /// const attributeSemantics = [ _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Normal.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Texcoord0.XY, ]; const attributes = [ new Float32Array(positions), new Float32Array(normals), new Float32Array(texcoords), ]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_3__.Is.exist(desc.color)) { attributeSemantics.push(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Color0.XYZ); attributes.push(new Float32Array(colors)); } const primitiveMode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode.Triangles; this.copyVertexData({ attributes, attributeSemantics, primitiveMode, indices: new Uint16Array(indices), material: desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/Grid.ts": /*!************************************************!*\ !*** ./src/foundation/geometry/shapes/Grid.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Grid: () => (/* binding */ Grid) /* harmony export */ }); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /** * the Grid class */ class Grid extends _IShape__WEBPACK_IMPORTED_MODULE_2__.IShape { /** * Generates a grid object * @param _desc a descriptor object of a Grid */ generate(_desc) { var _a, _b, _c, _d, _e; const desc = { length: (_a = _desc.length) !== null && _a !== void 0 ? _a : 1, division: (_b = _desc.division) !== null && _b !== void 0 ? _b : 10, isXY: (_c = _desc.isXY) !== null && _c !== void 0 ? _c : true, isXZ: (_d = _desc.isXZ) !== null && _d !== void 0 ? _d : true, isYZ: (_e = _desc.isYZ) !== null && _e !== void 0 ? _e : true, material: _desc.material, }; const positions = []; for (let i = 0; i < desc.division * 2 + 3; i++) { const start = -desc.length; const oneUnitLength = desc.length / (desc.division + 1); // XZ grid if (desc.isXZ) { positions.push(-desc.length, 0, start + oneUnitLength * i); positions.push(desc.length, 0, start + oneUnitLength * i); positions.push(start + oneUnitLength * i, 0, -desc.length); positions.push(start + oneUnitLength * i, 0, desc.length); } // XY grid if (desc.isXY) { positions.push(-desc.length, start + oneUnitLength * i, 0); positions.push(desc.length, start + oneUnitLength * i, 0); positions.push(start + oneUnitLength * i, -desc.length, 0); positions.push(start + oneUnitLength * i, desc.length, 0); } // YZ grid if (desc.isYZ) { positions.push(0, -desc.length, start + oneUnitLength * i); positions.push(0, desc.length, start + oneUnitLength * i); positions.push(0, start + oneUnitLength * i, -desc.length); positions.push(0, start + oneUnitLength * i, desc.length); } } const attributes = [new Float32Array(positions)]; // Index Buffer // Check Size const attributeSemantics = [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ]; this.copyVertexData({ attributes, attributeSemantics, primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, material: desc === null || desc === void 0 ? void 0 : desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/IShape.ts": /*!**************************************************!*\ !*** ./src/foundation/geometry/shapes/IShape.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ IShape: () => (/* binding */ IShape) /* harmony export */ }); /* harmony import */ var _Primitive__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Primitive */ "./src/foundation/geometry/Primitive.ts"); class IShape extends _Primitive__WEBPACK_IMPORTED_MODULE_0__.Primitive { } /***/ }), /***/ "./src/foundation/geometry/shapes/Joint.ts": /*!*************************************************!*\ !*** ./src/foundation/geometry/shapes/Joint.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Joint: () => (/* binding */ Joint) /* harmony export */ }); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /** * the Joint class */ class Joint extends _IShape__WEBPACK_IMPORTED_MODULE_3__.IShape { constructor() { super(...arguments); this.__worldPositionOfThisJoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, 0, 1]); this.__worldPositionOfParentJoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, 0, 0]); this.__width = 1; } /** * Generates a joint object */ generate(desc) { const length = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.lengthBtw(this.__worldPositionOfThisJoint, this.__worldPositionOfParentJoint); const arrowWidth = this.__width; const arrowheadLength = length / 7.5; const arrowStickLength = length - arrowheadLength; const deltaVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(this.__worldPositionOfParentJoint, this.__worldPositionOfThisJoint); let directionToParent = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, 1, 0]); if (!deltaVec.isEqual(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.zero())) { directionToParent = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(this.__worldPositionOfParentJoint, this.__worldPositionOfThisJoint)); } const arrowStickPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(this.__worldPositionOfThisJoint, _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(directionToParent, arrowStickLength)); let dummyVector = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, 1, 0]); let dummyVector2 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, -1, 0]); if (Math.abs(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.dot(directionToParent, dummyVector)) > 0.4) { dummyVector = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([1, 0, 0]); dummyVector2 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([-1, 0, 0]); } if (Math.abs(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.dot(directionToParent, dummyVector)) > 0.4) { dummyVector = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, 0, 1]); dummyVector2 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray3([0, 0, -1]); } const crossVector = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.cross(directionToParent, dummyVector)), arrowWidth); const crossVector2 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.cross(directionToParent, crossVector)), arrowWidth); const crossVector3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.cross(directionToParent, dummyVector2)), arrowWidth); const crossVector4 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalize(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.cross(directionToParent, crossVector3)), arrowWidth); const crossPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(arrowStickPosition, crossVector); const crossPosition2 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(arrowStickPosition, crossVector2); const crossPosition3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(arrowStickPosition, crossVector3); const crossPosition4 = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(arrowStickPosition, crossVector4); const pos = []; // Long Pyramid pos.push(this.__worldPositionOfThisJoint); pos.push(crossPosition); pos.push(this.__worldPositionOfThisJoint); pos.push(crossPosition2); pos.push(this.__worldPositionOfThisJoint); pos.push(crossPosition3); pos.push(this.__worldPositionOfThisJoint); pos.push(crossPosition4); // Plane pos.push(crossPosition); pos.push(crossPosition2); pos.push(crossPosition2); pos.push(crossPosition3); pos.push(crossPosition3); pos.push(crossPosition4); pos.push(crossPosition4); pos.push(crossPosition); // Short Pyramid pos.push(this.__worldPositionOfParentJoint); pos.push(crossPosition); pos.push(this.__worldPositionOfParentJoint); pos.push(crossPosition2); pos.push(this.__worldPositionOfParentJoint); pos.push(crossPosition3); pos.push(this.__worldPositionOfParentJoint); pos.push(crossPosition4); const positions = []; pos.map((vec) => { Array.prototype.push.apply(positions, vec.flattenAsArray()); }); const attributes = [new Float32Array(positions)]; // Check Size const attributeSemantics = [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__.VertexAttribute.Position.XYZ]; this.copyVertexData({ attributes, attributeSemantics, primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, material: desc === null || desc === void 0 ? void 0 : desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/Line.ts": /*!************************************************!*\ !*** ./src/foundation/geometry/shapes/Line.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Line: () => (/* binding */ Line) /* harmony export */ }); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /** * the Line class */ class Line extends _IShape__WEBPACK_IMPORTED_MODULE_2__.IShape { /** * Generates a line object * @param _desc a descriptor object of a Line */ generate(_desc) { var _a, _b, _c; const desc = { startPos: (_a = _desc.startPos) !== null && _a !== void 0 ? _a : _math_Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(0, 0, 0), endPos: (_b = _desc.endPos) !== null && _b !== void 0 ? _b : _math_Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(1, 0, 0), hasTerminalMark: (_c = _desc.hasTerminalMark) !== null && _c !== void 0 ? _c : true, material: _desc.material, }; const positions = []; positions.push(...desc.startPos.flattenAsArray()); positions.push(...desc.endPos.flattenAsArray()); if (desc.hasTerminalMark) { const length = desc.startPos.lengthTo(desc.endPos); const markSize = length * 0.1; positions.push(desc.startPos.x - markSize, desc.startPos.y, desc.startPos.z); positions.push(desc.startPos.x + markSize, desc.startPos.y, desc.startPos.z); positions.push(desc.startPos.x, desc.startPos.y, desc.startPos.z - markSize); positions.push(desc.startPos.x, desc.startPos.y, desc.startPos.z + markSize); positions.push(desc.endPos.x - markSize, desc.endPos.y, desc.endPos.z); positions.push(desc.endPos.x + markSize, desc.endPos.y, desc.endPos.z); positions.push(desc.endPos.x, desc.endPos.y, desc.endPos.z - markSize); positions.push(desc.endPos.x, desc.endPos.y, desc.endPos.z + markSize); } const attributes = [new Float32Array(positions)]; // Check Size const attributeSemantics = [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ]; this.copyVertexData({ attributes, attributeSemantics, primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, material: desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/Plane.ts": /*!*************************************************!*\ !*** ./src/foundation/geometry/shapes/Plane.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Plane: () => (/* binding */ Plane) /* harmony export */ }); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /** * Plane class * */ class Plane extends _IShape__WEBPACK_IMPORTED_MODULE_2__.IShape { /** * Generates a plane object * @param _desc a descriptor object of a Plane */ generate(_desc) { var _a, _b, _c, _d, _e, _f; const desc = { width: (_a = _desc.width) !== null && _a !== void 0 ? _a : 1, height: (_b = _desc.height) !== null && _b !== void 0 ? _b : 1, uSpan: (_c = _desc.uSpan) !== null && _c !== void 0 ? _c : 1, vSpan: (_d = _desc.vSpan) !== null && _d !== void 0 ? _d : 1, isUVRepeat: (_e = _desc.isUVRepeat) !== null && _e !== void 0 ? _e : false, flipTextureCoordinateY: (_f = _desc.flipTextureCoordinateY) !== null && _f !== void 0 ? _f : false, material: _desc.material, }; const positions = []; for (let i = 0; i <= desc.vSpan; i++) { for (let j = 0; j <= desc.uSpan; j++) { positions.push((j / desc.uSpan - 1 / 2) * desc.width); positions.push(0); positions.push((i / desc.vSpan - 1 / 2) * desc.height); } } const indices = []; for (let i = 0; i < desc.vSpan; i++) { let degenerate_left_index = 0; let degenerate_right_index = 0; for (let j = 0; j <= desc.uSpan; j++) { indices.push(i * (desc.uSpan + 1) + j); indices.push((i + 1) * (desc.uSpan + 1) + j); if (j === 0) { degenerate_left_index = (i + 1) * (desc.uSpan + 1) + j; } else if (j === desc.uSpan) { degenerate_right_index = (i + 1) * (desc.uSpan + 1) + j; } } indices.push(degenerate_right_index); indices.push(degenerate_left_index); } const normals = []; for (let i = 0; i <= desc.vSpan; i++) { for (let j = 0; j <= desc.uSpan; j++) { normals.push(0); normals.push(1); normals.push(0); } } const texcoords = []; for (let i = 0; i <= desc.vSpan; i++) { const i_ = desc.flipTextureCoordinateY ? i : desc.vSpan - i; for (let j = 0; j <= desc.uSpan; j++) { if (desc.isUVRepeat) { texcoords.push(j); texcoords.push(i_); } else { texcoords.push(j / desc.uSpan); texcoords.push(i_ / desc.vSpan); } } } // Check Size const attributeSemantics = [ _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Normal.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Texcoord0.XY, ]; const primitiveMode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.TriangleStrip; const attributes = [ new Float32Array(positions), new Float32Array(normals), new Float32Array(texcoords), ]; this.copyVertexData({ attributes, attributeSemantics, primitiveMode, indices: new Uint16Array(indices), material: desc === null || desc === void 0 ? void 0 : desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/Sphere.ts": /*!**************************************************!*\ !*** ./src/foundation/geometry/shapes/Sphere.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Sphere: () => (/* binding */ Sphere) /* harmony export */ }); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * Sphere class */ class Sphere extends _IShape__WEBPACK_IMPORTED_MODULE_3__.IShape { constructor() { super(); } generate(_desc) { var _a, _b, _c; const desc = { radius: (_a = _desc.radius) !== null && _a !== void 0 ? _a : 1, widthSegments: (_b = _desc.widthSegments) !== null && _b !== void 0 ? _b : 10, heightSegments: (_c = _desc.heightSegments) !== null && _c !== void 0 ? _c : 10, material: _desc.material, }; const positions = []; const texcoords = []; const normals = []; if (Math.abs(desc.radius) < Number.EPSILON) { _misc_Logger__WEBPACK_IMPORTED_MODULE_4__.Logger.warn('The argument radius is zero / nearly zero. Rn will take the radius as 0.001 for safety. Check your code.'); desc.radius = 0.001; } const shiftValue = 0.00001; // for avoid Singular point for (let latNumber = 0; latNumber <= desc.heightSegments; latNumber++) { const theta = (latNumber * Math.PI) / desc.heightSegments + shiftValue; const sinTheta = Math.sin(theta); const cosTheta = Math.cos(theta); for (let longNumber = 0; longNumber <= desc.widthSegments; longNumber++) { const phi = (longNumber * 2 * Math.PI) / desc.widthSegments; const sinPhi = Math.sin(phi); const cosPhi = Math.cos(phi); const x = desc.radius * cosPhi * sinTheta; const y = desc.radius * cosTheta; const z = desc.radius * sinPhi * sinTheta; const position = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([x, y, z]); positions.push(x); positions.push(y); positions.push(z); const u = 1 - longNumber / desc.widthSegments; const v = latNumber / desc.heightSegments; texcoords.push(u); texcoords.push(v); const normal = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.normalize(position); normals.push(normal.x); normals.push(normal.y); normals.push(normal.z); } } // first first+1 // +-------+ // | / | // | / | // | / | // +-------+ // second second+1 // const indices = []; for (let latNumber = 0; latNumber < desc.heightSegments; latNumber++) { for (let longNumber = 0; longNumber < desc.widthSegments; longNumber++) { const first = latNumber * (desc.widthSegments + 1) + longNumber; const second = first + desc.widthSegments + 1; indices.push(first + 1); indices.push(second); indices.push(first); indices.push(first + 1); indices.push(second + 1); indices.push(second); } } const attributeSemantics = [ _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Normal.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute.Texcoord0.XY, ]; const primitiveMode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Triangles; const attributes = [ new Float32Array(positions), new Float32Array(normals), new Float32Array(texcoords), ]; this.copyVertexData({ attributes, attributeSemantics, primitiveMode, indices: new Uint16Array(indices), material: desc.material, }); } } /***/ }), /***/ "./src/foundation/geometry/shapes/index.ts": /*!*************************************************!*\ !*** ./src/foundation/geometry/shapes/index.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Axis: () => (/* reexport safe */ _Axis__WEBPACK_IMPORTED_MODULE_0__.Axis), /* harmony export */ Cube: () => (/* reexport safe */ _Cube__WEBPACK_IMPORTED_MODULE_1__.Cube), /* harmony export */ Grid: () => (/* reexport safe */ _Grid__WEBPACK_IMPORTED_MODULE_2__.Grid), /* harmony export */ IShape: () => (/* reexport safe */ _IShape__WEBPACK_IMPORTED_MODULE_3__.IShape), /* harmony export */ Joint: () => (/* reexport safe */ _Joint__WEBPACK_IMPORTED_MODULE_4__.Joint), /* harmony export */ Line: () => (/* reexport safe */ _Line__WEBPACK_IMPORTED_MODULE_5__.Line), /* harmony export */ Plane: () => (/* reexport safe */ _Plane__WEBPACK_IMPORTED_MODULE_6__.Plane), /* harmony export */ Sphere: () => (/* reexport safe */ _Sphere__WEBPACK_IMPORTED_MODULE_7__.Sphere) /* harmony export */ }); /* harmony import */ var _Axis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Axis */ "./src/foundation/geometry/shapes/Axis.ts"); /* harmony import */ var _Cube__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Cube */ "./src/foundation/geometry/shapes/Cube.ts"); /* harmony import */ var _Grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Grid */ "./src/foundation/geometry/shapes/Grid.ts"); /* harmony import */ var _IShape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./IShape */ "./src/foundation/geometry/shapes/IShape.ts"); /* harmony import */ var _Joint__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Joint */ "./src/foundation/geometry/shapes/Joint.ts"); /* harmony import */ var _Line__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Line */ "./src/foundation/geometry/shapes/Line.ts"); /* harmony import */ var _Plane__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Plane */ "./src/foundation/geometry/shapes/Plane.ts"); /* harmony import */ var _Sphere__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Sphere */ "./src/foundation/geometry/shapes/Sphere.ts"); /***/ }), /***/ "./src/foundation/geometry/types/GeometryTypes.ts": /*!********************************************************!*\ !*** ./src/foundation/geometry/types/GeometryTypes.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PrimitiveSortKey_BitLength_Depth: () => (/* binding */ PrimitiveSortKey_BitLength_Depth), /* harmony export */ PrimitiveSortKey_BitLength_Material: () => (/* binding */ PrimitiveSortKey_BitLength_Material), /* harmony export */ PrimitiveSortKey_BitLength_PrimitiveType: () => (/* binding */ PrimitiveSortKey_BitLength_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitLength_TranslucencyType: () => (/* binding */ PrimitiveSortKey_BitLength_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_Material: () => (/* binding */ PrimitiveSortKey_BitOffset_Material), /* harmony export */ PrimitiveSortKey_BitOffset_PrimitiveType: () => (/* binding */ PrimitiveSortKey_BitOffset_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitOffset_TranslucencyType: () => (/* binding */ PrimitiveSortKey_BitOffset_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_ViewportLayer: () => (/* binding */ PrimitiveSortKey_BitOffset_ViewportLayer), /* harmony export */ isBlend: () => (/* binding */ isBlend), /* harmony export */ isTranslucent: () => (/* binding */ isTranslucent) /* harmony export */ }); const PrimitiveSortKey_BitLength_TranslucencyType = 2; const PrimitiveSortKey_BitLength_Material = 10; const PrimitiveSortKey_BitLength_PrimitiveType = 3; const PrimitiveSortKey_BitOffset_PrimitiveType = 0; const PrimitiveSortKey_BitOffset_Material = PrimitiveSortKey_BitLength_PrimitiveType; const PrimitiveSortKey_BitOffset_TranslucencyType = PrimitiveSortKey_BitLength_PrimitiveType + PrimitiveSortKey_BitLength_Material; const PrimitiveSortKey_BitOffset_ViewportLayer = PrimitiveSortKey_BitLength_PrimitiveType + PrimitiveSortKey_BitLength_Material + PrimitiveSortKey_BitLength_TranslucencyType; const PrimitiveSortKey_BitLength_Depth = 32; // export function isTranslucent(primitive: Primitive) { // return primitive._sortkey & 0b00000000_00000000_00000000_00000001; // } function readBits(primitive, offset, length) { // Creates a mask with the specified bit length let mask = (1 << length) - 1; // Read data from a specified offset return (primitive._sortkey >> offset) & mask; } // const translucencyBitOffset = PrimitiveSortKey_BitOffset_TranslucencyType + 1; // export function isTranslucent(primitive: Primitive) { // return (primitive._sortkey >> translucencyBitOffset) & 1; // } function isBlend(primitive) { return (readBits(primitive, PrimitiveSortKey_BitOffset_TranslucencyType, PrimitiveSortKey_BitLength_TranslucencyType) === 2 // blend ); } function isTranslucent(primitive) { return (readBits(primitive, PrimitiveSortKey_BitOffset_TranslucencyType, PrimitiveSortKey_BitLength_TranslucencyType) === 1 // translucent ); } /***/ }), /***/ "./src/foundation/geometry/types/index.ts": /*!************************************************!*\ !*** ./src/foundation/geometry/types/index.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PrimitiveSortKey_BitLength_Depth: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_Depth), /* harmony export */ PrimitiveSortKey_BitLength_Material: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_Material), /* harmony export */ PrimitiveSortKey_BitLength_PrimitiveType: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitLength_TranslucencyType: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_Material: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_Material), /* harmony export */ PrimitiveSortKey_BitOffset_PrimitiveType: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitOffset_TranslucencyType: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_ViewportLayer: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_ViewportLayer), /* harmony export */ isBlend: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.isBlend), /* harmony export */ isTranslucent: () => (/* reexport safe */ _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__.isTranslucent) /* harmony export */ }); /* harmony import */ var _GeometryTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GeometryTypes */ "./src/foundation/geometry/types/GeometryTypes.ts"); /***/ }), /***/ "./src/foundation/gizmos/AABBGizmo.ts": /*!********************************************!*\ !*** ./src/foundation/gizmos/AABBGizmo.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AABBGizmo: () => (/* binding */ AABBGizmo) /* harmony export */ }); /* harmony import */ var _Gizmo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Gizmo */ "./src/foundation/gizmos/Gizmo.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /** * AABB Gizmo class */ class AABBGizmo extends _Gizmo__WEBPACK_IMPORTED_MODULE_0__.Gizmo { /** * Constructor * @param target the object which this gizmo belong to */ constructor(target) { super(target); } /// /// /// Accessors /// /// get isSetup() { if (this.__topEntity != null) { return true; } else { return false; } } /// /// /// Friends Members /// /// /** * @internal * setup entities of Gizmo if not done yet */ _setup() { if (this.__toSkipSetup()) { return; } this.__topEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_7__.createMeshEntity)(); this.__topEntity.tryToSetUniqueName(`AABBGizmo_of_${this.__target.uniqueName}`, true); this.__topEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; this.__target.getSceneGraph()._addGizmoChild(this.__topEntity.getSceneGraph()); const meshComponent = this.__topEntity.tryToGetMesh(); AABBGizmo.__mesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_5__.Mesh(); AABBGizmo.__mesh.addPrimitive(AABBGizmo.generatePrimitive()); meshComponent.setMesh(AABBGizmo.__mesh); this.setGizmoTag(); } /** * generate the primitive of the gizmo * @returns a primitive of the gizmo */ static generatePrimitive() { const indices = new Uint32Array([ // XY Plane on -Z 0, 1, 1, 2, 2, 3, 3, 0, // XY Plane on +Z 4, 5, 5, 6, 6, 7, 7, 4, // YZ Plane on -X 0, 3, 3, 7, 7, 4, 4, 0, // YZ Plane on +X 1, 2, 2, 6, 6, 5, 5, 1, // XZ Plane on -Y 0, 1, 1, 5, 5, 4, 4, 0, // XZ Plane on +Y 3, 2, 2, 6, 6, 7, 7, 3, ]); const length = 1; const positions = new Float32Array([ /// -Z // 0 -length, -length, -length, // 1 length, -length, -length, // 2 length, length, -length, // 3 -length, length, -length, /// +Z // 4 -length, -length, length, // 5 length, -length, length, // 6 length, length, length, // 7 -length, length, length, ]); const primitive = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive.createPrimitive({ indices: indices, attributeSemantics: [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__.VertexAttribute.Position.XYZ], attributes: [positions], primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, }); return primitive; } /** * @internal * update the transform and etc of the gizmo */ _update() { if (this.__topEntity == null) { return; } const sg = this.__target.getSceneGraph(); const aabb = sg.worldMergedAABBWithSkeletal; this.__topEntity.getTransform().localPosition = aabb.centerPoint; this.__topEntity.getTransform().localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopyArray([ aabb.sizeX / 2, aabb.sizeY / 2, aabb.sizeZ / 2, ]); } _destroy() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_6__.Is.exist(this.__topEntity)) { this.__topEntity._destroy(); } } } /***/ }), /***/ "./src/foundation/gizmos/Gizmo.ts": /*!****************************************!*\ !*** ./src/foundation/gizmos/Gizmo.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Gizmo: () => (/* binding */ Gizmo) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _components_SceneGraph_SceneGraphOps__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/SceneGraph/SceneGraphOps */ "./src/foundation/components/SceneGraph/SceneGraphOps.ts"); /** * Abstract Gizmo class */ class Gizmo extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { /** * Constructor * @param entity the object which this gizmo belong to */ constructor(target) { super(); this.__isVisible = false; this.__target = target; this.setGizmoTag(); } /// /// /// Accessors /// /// set isVisible(flg) { this.__setVisible(flg); } get isVisible() { return this.__isVisible; } __setVisible(flg) { this.__isVisible = flg; if (this.__topEntity) { this.__topEntity.getSceneGraph().setVisibilityRecursively(flg); } } __toSkipSetup() { if (this.isSetup) { return true; } if (this.__target.matchTag('Being', 'gizmo')) { return true; } return false; } setGizmoTag() { if (this.__topEntity) { this.__topEntity.tryToSetTag({ tag: 'Being', value: 'gizmo' }); this.__topEntity.tryToSetTag({ tag: 'Gizmo', value: 'top' }); const sceneGraphs = (0,_components_SceneGraph_SceneGraphOps__WEBPACK_IMPORTED_MODULE_1__.flattenHierarchy)(this.__topEntity.getSceneGraph(), false); for (const sg of sceneGraphs) { sg.entity.tryToSetTag({ tag: 'Being', value: 'gizmo' }); } this.__topEntity.tryToSetTag({ tag: 'type', value: 'background-assets', }); } } } /***/ }), /***/ "./src/foundation/gizmos/LightGizmo.ts": /*!*********************************************!*\ !*** ./src/foundation/gizmos/LightGizmo.ts ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LightGizmo: () => (/* binding */ LightGizmo) /* harmony export */ }); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _Gizmo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Gizmo */ "./src/foundation/gizmos/Gizmo.ts"); class LightGizmo extends _Gizmo__WEBPACK_IMPORTED_MODULE_7__.Gizmo { /** * Constructor * @param target the object which this gizmo belong to */ constructor(target) { super(target); } /// /// /// Accessors /// /// get isSetup() { if (this.__topEntity != null) { return true; } else { return false; } } /// /// /// Friends Members /// /// /** * @internal * setup entities of Gizmo if not done yet */ _setup() { if (this.__toSkipSetup()) { return; } this.__topEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_0__.createMeshEntity)(); this.__topEntity.tryToSetUniqueName(`LightGizmo_of_${this.__target.uniqueName}`, true); this.__topEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; this.__target.getSceneGraph()._addGizmoChild(this.__topEntity.getSceneGraph()); const meshComponent = this.__topEntity.tryToGetMesh(); LightGizmo.__mesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_3__.Mesh(); LightGizmo.__mesh.addPrimitive(LightGizmo.__generatePrimitive()); meshComponent.setMesh(LightGizmo.__mesh); this.setGizmoTag(); } /** * @internal * update the transform and etc of the gizmo */ _update() { if (this.__topEntity == null) { return; } const sg = this.__target.getSceneGraph(); const aabb = sg.worldMergedAABBWithSkeletal; if (aabb.isVanilla()) { this.__topEntity.getTransform().localPosition = sg.position; } else { this.__topEntity.getTransform().localPosition = aabb.centerPoint; } this.__topEntity.getTransform().localRotation = sg.rotation; this.__topEntity.getTransform().localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([ Math.max(1, aabb.isVanilla() ? 1 : aabb.sizeX / 2), Math.max(1, aabb.isVanilla() ? 1 : aabb.sizeY / 2), Math.max(1, aabb.isVanilla() ? 1 : aabb.sizeZ / 2), ]); } _destroy() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_6__.Is.exist(this.__topEntity)) { this.__topEntity._destroy(); } } /// /// /// Private Static Members /// /// static __generatePrimitive() { const positions = new Float32Array([ // Z axis 0, 0, 0, 0, 0, -this.__length, // Arrow 0, 0, -this.__length, -0.1, 0, -this.__length + 0.2, // Arrow end -0.1, 0, -this.__length + 0.2, 0, 0, -this.__length + 0.2, ]); const primitive = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_4__.Primitive.createPrimitive({ attributeSemantics: [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__.VertexAttribute.Position.XYZ], attributes: [positions], primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, }); return primitive; } } LightGizmo.__length = 1; /***/ }), /***/ "./src/foundation/gizmos/LocatorGizmo.ts": /*!***********************************************!*\ !*** ./src/foundation/gizmos/LocatorGizmo.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LocatorGizmo: () => (/* binding */ LocatorGizmo) /* harmony export */ }); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _Gizmo__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Gizmo */ "./src/foundation/gizmos/Gizmo.ts"); /** * Locator Gizmo class */ class LocatorGizmo extends _Gizmo__WEBPACK_IMPORTED_MODULE_7__.Gizmo { /** * Constructor * @param target the object which this gizmo belong to */ constructor(target) { super(target); } /// /// /// Accessors /// /// get isSetup() { if (this.__topEntity != null) { return true; } else { return false; } } set length(val) { LocatorGizmo.__length = val; } get length() { return LocatorGizmo.__length; } /// /// /// Friends Members /// /// /** * @internal * setup entities of Gizmo if not done yet */ _setup() { if (this.__toSkipSetup()) { return; } this.__topEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_0__.createMeshEntity)(); this.__topEntity.tryToSetUniqueName(`LocatorGizmo_of_${this.__target.uniqueName}`, true); this.__topEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; this.__target.getSceneGraph()._addGizmoChild(this.__topEntity.getSceneGraph()); const sceneGraphComponent = this.__topEntity.tryToGetMesh(); LocatorGizmo.__mesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_3__.Mesh(); LocatorGizmo.__mesh.addPrimitive(LocatorGizmo.__generatePrimitive()); sceneGraphComponent.setMesh(LocatorGizmo.__mesh); this.setGizmoTag(); } /** * @internal * update the transform and etc of the gizmo */ _update() { if (this.__topEntity == null) { return; } const sg = this.__target.getSceneGraph(); const aabb = sg.worldMergedAABBWithSkeletal; if (aabb.isVanilla()) { this.__topEntity.getTransform().localPosition = sg.position; } else { this.__topEntity.getTransform().localPosition = aabb.centerPoint; } this.__topEntity.getTransform().localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([ Math.max(1, aabb.isVanilla() ? 1 : aabb.sizeX / 2), Math.max(1, aabb.isVanilla() ? 1 : aabb.sizeY / 2), Math.max(1, aabb.isVanilla() ? 1 : aabb.sizeZ / 2), ]); } /// /// /// Private Static Members /// /// static __generatePrimitive() { const positions = new Float32Array([ // X axis 0, 0, 0, this.__length, 0, 0, // Y axis 0, 0, 0, 0, this.__length, 0, // Z axis 0, 0, 0, 0, 0, this.__length, ]); const color = new Float32Array([ // X axis as Red 1, 0, 0, 1, 0, 0, // Y axis as Green 0, 1, 0, 0, 1, 0, // Z axis as Blue 0, 0, 1, 0, 0, 1, ]); const primitive = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_4__.Primitive.createPrimitive({ attributeSemantics: [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_2__.VertexAttribute.Color0.XYZ], attributes: [positions, color], primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_1__.PrimitiveMode.Lines, }); return primitive; } _destroy() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_6__.Is.exist(this.__topEntity)) { this.__topEntity._destroy(); } } } LocatorGizmo.__length = 1; /***/ }), /***/ "./src/foundation/gizmos/ScaleGizmo.ts": /*!*********************************************!*\ !*** ./src/foundation/gizmos/ScaleGizmo.ts ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ScaleGizmo: () => (/* binding */ ScaleGizmo) /* harmony export */ }); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /* harmony import */ var _components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../geometry/shapes/Cube */ "./src/foundation/geometry/shapes/Cube.ts"); /* harmony import */ var _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../geometry/shapes/Plane */ "./src/foundation/geometry/shapes/Plane.ts"); /* harmony import */ var _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../helpers/MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _math_Matrix33__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../math/Matrix33 */ "./src/foundation/math/Matrix33.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_Quaternion__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _system_InputManager__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../system/InputManager */ "./src/foundation/system/InputManager.ts"); /* harmony import */ var _Gizmo__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Gizmo */ "./src/foundation/gizmos/Gizmo.ts"); /** * Translation Gizmo class */ class ScaleGizmo extends _Gizmo__WEBPACK_IMPORTED_MODULE_24__.Gizmo { /** * Constructor * @param target the object which this gizmo belong to */ constructor(target) { super(target); this.__pickStatedPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.zero(); this.__deltaPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.one(); this.__targetScaleBackup = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.one(); this.__isPointerDown = false; this.__onPointerDownFunc = this.__onPointerDown.bind(this); this.__onPointerMoveFunc = this.__onPointerMove.bind(this); this.__onPointerUpFunc = this.__onPointerUp.bind(this); } /// /// /// Accessors /// /// get isSetup() { if (this.__topEntity != null) { return true; } else { return false; } } set length(val) { ScaleGizmo.__length = val; } get length() { return ScaleGizmo.__length; } set isVisible(flg) { if (this.__isVisible === false && flg === true) { let eventTargetDom = window; if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.exist(_core_Config__WEBPACK_IMPORTED_MODULE_4__.Config.eventTargetDom)) { eventTargetDom = _core_Config__WEBPACK_IMPORTED_MODULE_4__.Config.eventTargetDom; } _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.register(_system_InputManager__WEBPACK_IMPORTED_MODULE_23__.INPUT_HANDLING_STATE_GIZMO_SCALE, [ { eventName: (0,_system_InputManager__WEBPACK_IMPORTED_MODULE_23__.getEvent)('start'), handler: this.__onPointerDownFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, { eventName: (0,_system_InputManager__WEBPACK_IMPORTED_MODULE_23__.getEvent)('move'), handler: this.__onPointerMoveFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, { eventName: (0,_system_InputManager__WEBPACK_IMPORTED_MODULE_23__.getEvent)('end'), handler: this.__onPointerUpFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, { eventName: 'pointerleave', handler: this.__onPointerUpFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, ]); this.__topEntity.getSceneGraph().addChild(ScaleGizmo.__groupEntity.getSceneGraph()); ScaleGizmo.__latestTargetEntity = this.__target; if (ScaleGizmo.__space === 'local') { const parent = this.__target.getSceneGraph(); let quaternion = _math_Quaternion__WEBPACK_IMPORTED_MODULE_17__.Quaternion.identity(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.exist(parent)) { quaternion = parent.getQuaternionRecursively(); } ScaleGizmo.__groupEntity.getTransform().localRotation = quaternion; } else if (ScaleGizmo.__space === 'world') { ScaleGizmo.__groupEntity.getTransform().localRotation = _math_Quaternion__WEBPACK_IMPORTED_MODULE_17__.Quaternion.fromCopy4(0, 0, 0, 1); } } if (this.__isVisible === true && flg === false) { _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.unregister(_system_InputManager__WEBPACK_IMPORTED_MODULE_23__.INPUT_HANDLING_STATE_GIZMO_SCALE); this.__deltaPoint = this.__target.getTransform().localScale; this.__pickStatedPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.zero(); this.__isPointerDown = false; this.__targetScaleBackup = this.__target.getTransform().localScale; ScaleGizmo.__activeAxis = 'none'; } _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.setActive(_system_InputManager__WEBPACK_IMPORTED_MODULE_23__.INPUT_HANDLING_STATE_GIZMO_SCALE, flg); this.__setVisible(flg); ScaleGizmo.__xyPlaneEntity.getSceneGraph().isVisible = false; ScaleGizmo.__yzPlaneEntity.getSceneGraph().isVisible = false; ScaleGizmo.__zxPlaneEntity.getSceneGraph().isVisible = false; } setSpace(space) { ScaleGizmo.__space = space; if (this.__isVisible) { this.isVisible = false; this.isVisible = true; } } get isVisible() { return this.__isVisible; } /// /// /// Friends Members /// /// /** * @internal * setup entities of Gizmo if not done yet */ _setup() { if (this.__toSkipSetup()) { return; } this.__topEntity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_2__.createGroupEntity)(); this.__topEntity.tryToSetUniqueName(`ScaleGizmo_of_${this.__target.uniqueName}`, true); this.__topEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; // add this topEntity to the target as gizmo this.__target.getSceneGraph()._addGizmoChild(this.__topEntity.getSceneGraph()); // setup the mesh // x if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__xCubeEntity)) { this.xMesh(); this.xEdgeMesh(); } // y if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__yCubeEntity)) { this.yMesh(); this.yEdgeMesh(); } // z if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__zCubeEntity)) { this.zMesh(); this.zEdgeMesh(); } // xy Plane if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__xyPlaneEntity)) { this.xyPlane(); } // yz Plane if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__yzPlaneEntity)) { this.yzPlane(); } // zx Plane if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__zxPlaneEntity)) { this.zxPlane(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.not.exist(ScaleGizmo.__groupEntity)) { ScaleGizmo.__groupEntity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_2__.createGroupEntity)(); } this.__topEntity.getSceneGraph().addChild(ScaleGizmo.__groupEntity.getSceneGraph()); ScaleGizmo.__groupEntity.getSceneGraph().addChild(ScaleGizmo.__xCubeEntity.getSceneGraph()); ScaleGizmo.__groupEntity.getSceneGraph().addChild(ScaleGizmo.__yCubeEntity.getSceneGraph()); ScaleGizmo.__groupEntity.getSceneGraph().addChild(ScaleGizmo.__zCubeEntity.getSceneGraph()); // ScaleGizmo.__groupEntity // .getSceneGraph() // .addChild(ScaleGizmo.__xEdgeCubeEntity.getSceneGraph()); // ScaleGizmo.__groupEntity // .getSceneGraph() // .addChild(ScaleGizmo.__yEdgeCubeEntity.getSceneGraph()); // ScaleGizmo.__groupEntity // .getSceneGraph() // .addChild(ScaleGizmo.__zEdgeCubeEntity.getSceneGraph()); ScaleGizmo.__groupEntity.getSceneGraph().addChild(ScaleGizmo.__xyPlaneEntity.getSceneGraph()); ScaleGizmo.__groupEntity.getSceneGraph().addChild(ScaleGizmo.__yzPlaneEntity.getSceneGraph()); ScaleGizmo.__groupEntity.getSceneGraph().addChild(ScaleGizmo.__zxPlaneEntity.getSceneGraph()); ScaleGizmo.__latestTargetEntity = this.__target; this.setGizmoTag(); } zxPlane() { ScaleGizmo.__zxPlaneEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xCubeEntity.tryToSetUniqueName('ScaleGizmo_zxPlane', true); ScaleGizmo.__zxPlaneEntity.getSceneGraph().isVisible = false; // TranslationGizmo.__zxPlaneEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; // TranslationGizmo.__zxPlaneEntity.getTransform().localEulerAngles = // Vector3.fromCopy3(90, 0, 0); ScaleGizmo.__zxPlaneMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__.MaterialHelper.createClassicUberMaterial(); ScaleGizmo.__zxPlaneMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopyArray4([0, 0.5, 0, 0])); ScaleGizmo.__zxPlaneMaterial.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_5__.AlphaMode.Blend; ScaleGizmo.__zxPlaneMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__zxPlanePrimitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_11__.Plane(); ScaleGizmo.__zxPlanePrimitive.generate({ width: 100000, height: 100000, uSpan: 1, vSpan: 1, isUVRepeat: true, flipTextureCoordinateY: false, material: ScaleGizmo.__zxPlaneMaterial, }); ScaleGizmo.__zxPlaneMesh.addPrimitive(ScaleGizmo.__zxPlanePrimitive); ScaleGizmo.__zxPlaneEntity.getMesh().setMesh(ScaleGizmo.__zxPlaneMesh); } yzPlane() { ScaleGizmo.__yzPlaneEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xCubeEntity.tryToSetUniqueName('ScaleGizmo_yzPlane', true); ScaleGizmo.__yzPlaneEntity.getSceneGraph().isVisible = false; // TranslationGizmo.__yzPlaneEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; ScaleGizmo.__yzPlaneEntity.getTransform().localEulerAngles = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0, 0, _math_MathUtil__WEBPACK_IMPORTED_MODULE_13__.MathUtil.degreeToRadian(90)); ScaleGizmo.__yzPlaneMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__.MaterialHelper.createClassicUberMaterial(); ScaleGizmo.__yzPlaneMaterial.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_5__.AlphaMode.Blend; ScaleGizmo.__yzPlaneMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopyArray4([0.5, 0, 0, 0])); ScaleGizmo.__yzPlaneMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__yzPlanePrimitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_11__.Plane(); ScaleGizmo.__yzPlanePrimitive.generate({ width: 100000, height: 100000, uSpan: 1, vSpan: 1, isUVRepeat: true, flipTextureCoordinateY: false, material: ScaleGizmo.__yzPlaneMaterial, }); ScaleGizmo.__yzPlaneMesh.addPrimitive(ScaleGizmo.__yzPlanePrimitive); ScaleGizmo.__yzPlaneEntity.getMesh().setMesh(ScaleGizmo.__yzPlaneMesh); } xyPlane() { ScaleGizmo.__xyPlaneEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xCubeEntity.tryToSetUniqueName('ScaleGizmo_xyPlane', true); ScaleGizmo.__xyPlaneEntity.getSceneGraph().isVisible = false; // TranslationGizmo.__xyPlaneEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; ScaleGizmo.__xyPlaneEntity.getTransform().localEulerAngles = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(_math_MathUtil__WEBPACK_IMPORTED_MODULE_13__.MathUtil.degreeToRadian(90), 0, 0); ScaleGizmo.__xyPlaneMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__.MaterialHelper.createClassicUberMaterial(); ScaleGizmo.__xyPlaneMaterial.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_5__.AlphaMode.Blend; ScaleGizmo.__xyPlaneMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopyArray4([0, 0, 0.5, 0])); ScaleGizmo.__xyPlaneMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__xyPlanePrimitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_11__.Plane(); ScaleGizmo.__xyPlanePrimitive.generate({ width: 100000, height: 100000, uSpan: 1, vSpan: 1, isUVRepeat: true, flipTextureCoordinateY: false, material: ScaleGizmo.__xyPlaneMaterial, }); ScaleGizmo.__xyPlaneMesh.addPrimitive(ScaleGizmo.__xyPlanePrimitive); ScaleGizmo.__xyPlaneEntity.getMesh().setMesh(ScaleGizmo.__xyPlaneMesh); } zMesh() { ScaleGizmo.__zCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xCubeEntity.tryToSetUniqueName('ScaleGizmo_zCube', true); ScaleGizmo.__zCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0, 0, 1); ScaleGizmo.__zCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__zCubeMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__.MaterialHelper.createClassicUberMaterial(); ScaleGizmo.__zCubeMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopyArray4([0, 0, 1, 1])); ScaleGizmo.__zCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__.Cube(); ScaleGizmo.__zCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0.05, 0.05, 1), material: ScaleGizmo.__zCubeMaterial, }); ScaleGizmo.__zCubeMesh.addPrimitive(ScaleGizmo.__zCubePrimitive); ScaleGizmo.__zCubeEntity.getMesh().setMesh(ScaleGizmo.__zCubeMesh); } yMesh() { ScaleGizmo.__yCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xCubeEntity.tryToSetUniqueName('ScaleGizmo_yCube', true); ScaleGizmo.__yCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0, 1, 0); ScaleGizmo.__yCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__yCubeMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__.MaterialHelper.createClassicUberMaterial(); ScaleGizmo.__yCubeMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopyArray4([0, 1, 0, 1])); ScaleGizmo.__yCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__.Cube(); ScaleGizmo.__yCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0.05, 1, 0.05), material: ScaleGizmo.__yCubeMaterial, }); ScaleGizmo.__yCubeMesh.addPrimitive(ScaleGizmo.__yCubePrimitive); ScaleGizmo.__yCubeEntity.getMesh().setMesh(ScaleGizmo.__yCubeMesh); } xMesh() { ScaleGizmo.__xCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xCubeEntity.tryToSetUniqueName('ScaleGizmo_xCube', true); ScaleGizmo.__xCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(1, 0, 0); ScaleGizmo.__xCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__xCubeMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_12__.MaterialHelper.createClassicUberMaterial(); ScaleGizmo.__xCubeMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopyArray4([1, 0, 0, 1])); ScaleGizmo.__xCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__.Cube(); ScaleGizmo.__xCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(1, 0.05, 0.05), material: ScaleGizmo.__xCubeMaterial, }); ScaleGizmo.__xCubeMesh.addPrimitive(ScaleGizmo.__xCubePrimitive); ScaleGizmo.__xCubeEntity.getMesh().setMesh(ScaleGizmo.__xCubeMesh); } xEdgeMesh() { ScaleGizmo.__xEdgeCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__xEdgeCubeEntity.tryToSetUniqueName('ScaleGizmo_xEdgeCube', true); ScaleGizmo.__xEdgeCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(1, 0, 0); ScaleGizmo.__xEdgeCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__xEdgeCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__.Cube(); ScaleGizmo.__xEdgeCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0.1, 0.1, 0.1), material: ScaleGizmo.__xCubeMaterial, }); ScaleGizmo.__xEdgeCubeMesh.addPrimitive(ScaleGizmo.__xEdgeCubePrimitive); ScaleGizmo.__xEdgeCubeEntity.getMesh().setMesh(ScaleGizmo.__xEdgeCubeMesh); ScaleGizmo.__xCubeEntity.addChild(ScaleGizmo.__xEdgeCubeEntity.getSceneGraph()); } yEdgeMesh() { ScaleGizmo.__yEdgeCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__yEdgeCubeEntity.tryToSetUniqueName('ScaleGizmo_yEdgeCube', true); ScaleGizmo.__yEdgeCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0, 1, 0); ScaleGizmo.__yEdgeCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__yEdgeCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__.Cube(); ScaleGizmo.__yEdgeCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0.1, 0.1, 0.1), material: ScaleGizmo.__yCubeMaterial, }); ScaleGizmo.__yEdgeCubeMesh.addPrimitive(ScaleGizmo.__yEdgeCubePrimitive); ScaleGizmo.__yEdgeCubeEntity.getMesh().setMesh(ScaleGizmo.__yEdgeCubeMesh); ScaleGizmo.__yCubeEntity.addChild(ScaleGizmo.__yEdgeCubeEntity.getSceneGraph()); } zEdgeMesh() { ScaleGizmo.__zEdgeCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity)(); ScaleGizmo.__zEdgeCubeEntity.tryToSetUniqueName('ScaleGizmo_zEdgeCube', true); ScaleGizmo.__zEdgeCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0, 0, 1); ScaleGizmo.__zEdgeCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_8__.Mesh(); ScaleGizmo.__zEdgeCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_10__.Cube(); ScaleGizmo.__zEdgeCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(0.1, 0.1, 0.1), material: ScaleGizmo.__zCubeMaterial, }); ScaleGizmo.__zEdgeCubeMesh.addPrimitive(ScaleGizmo.__zEdgeCubePrimitive); ScaleGizmo.__zEdgeCubeEntity.getMesh().setMesh(ScaleGizmo.__zEdgeCubeMesh); ScaleGizmo.__zCubeEntity.addChild(ScaleGizmo.__zEdgeCubeEntity.getSceneGraph()); } /** * @internal * update the transform and etc of the gizmo */ _update() { if (this.__topEntity == null) { return; } const sg = this.__target.getSceneGraph(); const aabb = sg.worldMergedAABBWithSkeletal; if (aabb.isVanilla()) { this.__topEntity.getTransform().localPosition = sg.position; } else { this.__topEntity.getTransform().localPosition = aabb.centerPoint; } const max = Math.max(aabb.sizeX, aabb.sizeY, aabb.sizeZ); this.__topEntity.getTransform().localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopyArray([ Math.min(1, aabb.isVanilla() ? 1 : max / 2), Math.min(1, aabb.isVanilla() ? 1 : max / 2), Math.min(1, aabb.isVanilla() ? 1 : max / 2), ]); if (this.__isPointerDown) { if (ScaleGizmo.__latestTargetEntity === this.__target) { this.__target.getTransform().localScale = this.__deltaPoint.clone(); } } } /// /// /// Private Static Members /// /// static __generatePrimitive() { const positions = new Float32Array([ // X axis 0, 0, 0, this.__length, 0, 0, // Y axis 0, 0, 0, 0, this.__length, 0, // Z axis 0, 0, 0, 0, 0, this.__length, ]); const color = new Float32Array([ // X axis as Red 1, 0, 0, 1, 0, 0, // Y axis as Green 0, 1, 0, 0, 1, 0, // Z axis as Blue 0, 0, 1, 0, 0, 1, ]); const primitive = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_9__.Primitive.createPrimitive({ attributeSemantics: [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_7__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_7__.VertexAttribute.Color0.XYZ], attributes: [positions, color], primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_6__.PrimitiveMode.Lines, }); return primitive; } __onPointerDown(evt) { evt.preventDefault(); this.__isPointerDown = true; ScaleGizmo.__originalX = evt.clientX; ScaleGizmo.__originalY = evt.clientY; // InputManager.enableCameraController(); const worldMatrix = this.__target.getSceneGraph().matrix.getRotate(); const scaleVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.one(); let rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_14__.Matrix33.fromCopy9RowMajor(scaleVec.x * worldMatrix.m00, scaleVec.x * worldMatrix.m01, scaleVec.x * worldMatrix.m02, scaleVec.y * worldMatrix.m10, scaleVec.y * worldMatrix.m11, scaleVec.y * worldMatrix.m12, scaleVec.z * worldMatrix.m20, scaleVec.z * worldMatrix.m21, scaleVec.z * worldMatrix.m22); if (ScaleGizmo.__space === 'local') { rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_14__.Matrix33.transpose(rotMat); } else if (ScaleGizmo.__space === 'world') { rotMat = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_16__.MutableMatrix33.identity(); } const { xResult, yResult, zResult } = ScaleGizmo.castRay(evt); if (xResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__.assertExist)(xResult.data); this.__pickStatedPoint = rotMat.multiplyVector(xResult.data.position.clone()); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug('Down:' + this.__pickStatedPoint.toStringApproximately()); ScaleGizmo.__activeAxis = 'x'; } if (yResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__.assertExist)(yResult.data); this.__pickStatedPoint = rotMat.multiplyVector(yResult.data.position.clone()); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug('Down:' + this.__pickStatedPoint.toStringApproximately()); ScaleGizmo.__activeAxis = 'y'; } if (zResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__.assertExist)(zResult.data); this.__pickStatedPoint = rotMat.multiplyVector(zResult.data.position.clone()); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug('Down:' + this.__pickStatedPoint.toStringApproximately()); ScaleGizmo.__activeAxis = 'z'; } if (ScaleGizmo.__latestTargetEntity === this.__target) { this.__targetScaleBackup = this.__target.getTransform().localScale; } } __onPointerMove(evt) { evt.preventDefault(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.false(this.__isPointerDown)) { return; } const rect = evt.target.getBoundingClientRect(); const width = evt.target.clientWidth; const height = evt.target.clientHeight; const x = evt.clientX - rect.left; const y = rect.height - (evt.clientY - rect.top); const viewport = _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopy4(0, 0, width, height); const activeCamera = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_3__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); const worldMatrix = this.__target.getSceneGraph().matrix.getRotate(); const scaleVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.one(); //this.__target.getSceneGraph().worldMatrix.getScale(); let rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_14__.Matrix33.fromCopy9RowMajor(scaleVec.x * worldMatrix.m00, scaleVec.x * worldMatrix.m01, scaleVec.x * worldMatrix.m02, scaleVec.y * worldMatrix.m10, scaleVec.y * worldMatrix.m11, scaleVec.y * worldMatrix.m12, scaleVec.z * worldMatrix.m20, scaleVec.z * worldMatrix.m21, scaleVec.z * worldMatrix.m22); if (ScaleGizmo.__space === 'local') { rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_14__.Matrix33.transpose(rotMat); } else if (ScaleGizmo.__space === 'world') { rotMat = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_16__.MutableMatrix33.identity(); } let pickInMovingPoint = this.__pickStatedPoint.clone(); if (ScaleGizmo.__activeAxis === 'x') { const xResult = ScaleGizmo.__xyPlaneEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); if (xResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__.assertExist)(xResult.data); const position = rotMat.multiplyVector(xResult.data.position); pickInMovingPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(position.x, pickInMovingPoint.y, pickInMovingPoint.z); // pickInMovingPoint = Vector3.fromCopy3(xResult.data.position.x, pickInMovingPoint.y, pickInMovingPoint.z); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug('Move:' + xResult.data.position.toStringApproximately()); } _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.disableCameraController(); } if (ScaleGizmo.__activeAxis === 'y') { const yResult = ScaleGizmo.__xyPlaneEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); if (yResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__.assertExist)(yResult.data); const position = rotMat.multiplyVector(yResult.data.position); pickInMovingPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(pickInMovingPoint.x, position.y, pickInMovingPoint.z); // pickInMovingPoint = Vector3.fromCopy3(pickInMovingPoint.x, yResult.data.position.y, pickInMovingPoint.z); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug('Move:' + yResult.data.position.toStringApproximately()); } _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.disableCameraController(); } if (ScaleGizmo.__activeAxis === 'z') { const zResult = ScaleGizmo.__yzPlaneEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); if (zResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_22__.assertExist)(zResult.data); const position = rotMat.multiplyVector(zResult.data.position); pickInMovingPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(pickInMovingPoint.x, pickInMovingPoint.y, position.z); // pickInMovingPoint = Vector3.fromCopy3(pickInMovingPoint.x, pickInMovingPoint.y, zResult.data.position.z); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug('Move:' + zResult.data.position.toStringApproximately()); } _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.disableCameraController(); } const sg = this.__target.getSceneGraph(); const aabb = sg.worldMergedAABBWithSkeletal; const deltaVector3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.multiply(_math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.subtract(pickInMovingPoint, this.__pickStatedPoint), 1 / aabb.lengthCenterToCorner); _misc_Logger__WEBPACK_IMPORTED_MODULE_21__.Logger.debug(`${this.__target.uniqueName}: ` + deltaVector3.toStringApproximately()); if (ScaleGizmo.__space === 'local') { this.__deltaPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.add(this.__targetScaleBackup, deltaVector3); this.__deltaPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(Math.max(this.__deltaPoint.x, 0.01), Math.max(this.__deltaPoint.y, 0.01), Math.max(this.__deltaPoint.z, 0.01)); } else if (ScaleGizmo.__space === 'world') { const worldMat = _math_Matrix44__WEBPACK_IMPORTED_MODULE_15__.Matrix44.fromCopyQuaternion(this.__target.getSceneGraph().getQuaternionRecursively()); const existedScale = _math_Matrix44__WEBPACK_IMPORTED_MODULE_15__.Matrix44.multiply(worldMat, _math_Matrix44__WEBPACK_IMPORTED_MODULE_15__.Matrix44.scale(this.__targetScaleBackup)).getScale(); let scale = _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.add(deltaVector3, existedScale); scale = _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopy4(Math.max(scale.x, 0.01), Math.max(scale.y, 0.01), Math.max(scale.z, 0.01), Math.max(scale.w, 0.01)); this.__deltaPoint = _math_Matrix44__WEBPACK_IMPORTED_MODULE_15__.Matrix44.multiply(_math_Matrix44__WEBPACK_IMPORTED_MODULE_15__.Matrix44.invert(worldMat), _math_Matrix44__WEBPACK_IMPORTED_MODULE_15__.Matrix44.scale(scale)).getScale(); this.__deltaPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_18__.Vector3.fromCopy3(Math.max(this.__deltaPoint.x, 0.01), Math.max(this.__deltaPoint.y, 0.01), Math.max(this.__deltaPoint.z, 0.01)); // const parent = this.__target.getSceneGraph(); // let worldMatrix = Matrix44.identity(); // if (Is.exist(parent)) { // worldMatrix = parent.worldMatrix.getRotate(); // } // const scaleVec = Vector3.one(); // let rotMat = Matrix33.fromCopy9RowMajor( // scaleVec.x * worldMatrix.m00, // scaleVec.x * worldMatrix.m01, // scaleVec.x * worldMatrix.m02, // scaleVec.y * worldMatrix.m10, // scaleVec.y * worldMatrix.m11, // scaleVec.y * worldMatrix.m12, // scaleVec.z * worldMatrix.m20, // scaleVec.z * worldMatrix.m21, // scaleVec.z * worldMatrix.m22 // ); // rotMat = Matrix33.transpose(rotMat); // const deltaDeltaVector3 = Vector3.add( // this.__targetScaleBackup, // rotMat.multiplyVector(deltaVector3), // ); // this.__deltaPoint = deltaDeltaVector3; // this.__deltaPoint = Vector3.fromCopy3( // Math.max(this.__deltaPoint.x, 0.01), // Math.max(this.__deltaPoint.y, 0.01), // Math.max(this.__deltaPoint.z, 0.01) // ); } } __onPointerUp(evt) { evt.preventDefault(); this.__isPointerDown = false; ScaleGizmo.__activeAxis = 'none'; _system_InputManager__WEBPACK_IMPORTED_MODULE_23__.InputManager.enableCameraController(); if (ScaleGizmo.__latestTargetEntity === this.__target) { this.__targetScaleBackup = this.__target.getTransform().localScale; } } static castRay2(evt) { const rect = evt.target.getBoundingClientRect(); const width = evt.target.clientWidth; const height = evt.target.clientHeight; const x = evt.clientX - rect.left; const y = rect.height - (evt.clientY - rect.top); const viewport = _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopy4(0, 0, width, height); const activeCamera = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_3__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); const result = ScaleGizmo.__groupEntity .getSceneGraph() .castRayFromScreen(x, y, activeCamera, viewport, 0.0, []); return result; } static castRay(evt) { const rect = evt.target.getBoundingClientRect(); const width = evt.target.clientWidth; const height = evt.target.clientHeight; const x = evt.clientX - rect.left; const y = rect.height - (evt.clientY - rect.top); const viewport = _math_Vector4__WEBPACK_IMPORTED_MODULE_19__.Vector4.fromCopy4(0, 0, width, height); const activeCamera = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_3__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); const xResult = ScaleGizmo.__xCubeEntity .getSceneGraph() .castRayFromScreen(x, y, activeCamera, viewport, 0.0); const yResult = ScaleGizmo.__yCubeEntity .getSceneGraph() .castRayFromScreen(x, y, activeCamera, viewport, 0.0); const zResult = ScaleGizmo.__zCubeEntity .getSceneGraph() .castRayFromScreen(x, y, activeCamera, viewport, 0.0); return { xResult, yResult, zResult }; } _destroy() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_20__.Is.exist(this.__topEntity)) { this.__topEntity._destroy(); } } } ScaleGizmo.__originalX = 0; ScaleGizmo.__originalY = 0; ScaleGizmo.__activeAxis = 'none'; ScaleGizmo.__space = 'world'; ScaleGizmo.__length = 1; /***/ }), /***/ "./src/foundation/gizmos/TranslationGizmo.ts": /*!***************************************************!*\ !*** ./src/foundation/gizmos/TranslationGizmo.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TranslationGizmo: () => (/* binding */ TranslationGizmo) /* harmony export */ }); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../geometry/shapes/Cube */ "./src/foundation/geometry/shapes/Cube.ts"); /* harmony import */ var _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../geometry/shapes/Plane */ "./src/foundation/geometry/shapes/Plane.ts"); /* harmony import */ var _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../helpers/MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../math/Matrix33 */ "./src/foundation/math/Matrix33.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_Quaternion__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _system_InputManager__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../system/InputManager */ "./src/foundation/system/InputManager.ts"); /* harmony import */ var _Gizmo__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Gizmo */ "./src/foundation/gizmos/Gizmo.ts"); /* harmony import */ var _components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../components/SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * Translation Gizmo class */ class TranslationGizmo extends _Gizmo__WEBPACK_IMPORTED_MODULE_21__.Gizmo { /** * Constructor * @param target the object which this gizmo belong to */ constructor(target) { super(target); this.__pickStatedPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.zero(); this.__deltaPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.zero(); this.__targetPointBackup = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.zero(); this.__isPointerDown = false; this.__onPointerDownFunc = this.__onPointerDown.bind(this); this.__onPointerMoveFunc = this.__onPointerMove.bind(this); this.__onPointerUpFunc = this.__onPointerUp.bind(this); } /// /// /// Accessors /// /// get isSetup() { if (this.__topEntity != null) { return true; } else { return false; } } set length(val) { TranslationGizmo.__length = val; } get length() { return TranslationGizmo.__length; } set isVisible(flg) { if (this.__isVisible === false && flg === true) { let eventTargetDom = window; if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.exist(_core_Config__WEBPACK_IMPORTED_MODULE_2__.Config.eventTargetDom)) { eventTargetDom = _core_Config__WEBPACK_IMPORTED_MODULE_2__.Config.eventTargetDom; } _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.register(_system_InputManager__WEBPACK_IMPORTED_MODULE_20__.INPUT_HANDLING_STATE_GIZMO_TRANSLATION, [ { eventName: (0,_system_InputManager__WEBPACK_IMPORTED_MODULE_20__.getEvent)('start'), handler: this.__onPointerDownFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, { eventName: (0,_system_InputManager__WEBPACK_IMPORTED_MODULE_20__.getEvent)('move'), handler: this.__onPointerMoveFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, { eventName: (0,_system_InputManager__WEBPACK_IMPORTED_MODULE_20__.getEvent)('end'), handler: this.__onPointerUpFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, { eventName: 'pointerleave', handler: this.__onPointerUpFunc, options: {}, classInstance: this, eventTargetDom: eventTargetDom, }, ]); this.__topEntity.getSceneGraph().addChild(TranslationGizmo.__groupEntity.getSceneGraph()); this.__latestTargetEntity = this.__target; if (TranslationGizmo.__space === 'local') { const parent = this.__target.getSceneGraph().parent; let quaternion = _math_Quaternion__WEBPACK_IMPORTED_MODULE_15__.Quaternion.identity(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.exist(parent)) { quaternion = parent.getQuaternionRecursively(); } TranslationGizmo.__groupEntity.getTransform().localRotation = quaternion; } else if (TranslationGizmo.__space === 'world') { TranslationGizmo.__groupEntity.getTransform().localRotation = _math_Quaternion__WEBPACK_IMPORTED_MODULE_15__.Quaternion.fromCopy4(0, 0, 0, 1); } } if (this.__isVisible === true && flg === false) { _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.unregister(_system_InputManager__WEBPACK_IMPORTED_MODULE_20__.INPUT_HANDLING_STATE_GIZMO_TRANSLATION); this.__deltaPoint = this.__target.getTransform().localPosition; this.__pickStatedPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.zero(); this.__isPointerDown = false; this.__targetPointBackup = this.__target.getTransform().localPosition; TranslationGizmo.__activeAxis = 'none'; } _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.setActive(_system_InputManager__WEBPACK_IMPORTED_MODULE_20__.INPUT_HANDLING_STATE_GIZMO_TRANSLATION, flg); this.__setVisible(flg); TranslationGizmo.__xyPlaneEntity.getSceneGraph().isVisible = false; TranslationGizmo.__yzPlaneEntity.getSceneGraph().isVisible = false; TranslationGizmo.__zxPlaneEntity.getSceneGraph().isVisible = false; } setSpace(space) { TranslationGizmo.__space = space; if (this.__isVisible) { this.isVisible = false; this.isVisible = true; } } get isVisible() { return this.__isVisible; } /// /// /// Friends Members /// /// /** * @internal * setup entities of Gizmo if not done yet */ _setup() { if (this.__toSkipSetup()) { return; } this.__topEntity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_22__.createGroupEntity)(); this.__topEntity.tryToSetUniqueName(`TranslationGizmo_of_${this.__target.uniqueName}`, true); this.__topEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; // add this topEntity to the target as gizmo this.__target.getSceneGraph()._addGizmoChild(this.__topEntity.getSceneGraph()); // setup the mesh // x if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__xCubeEntity)) { TranslationGizmo.__xCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__.createMeshEntity)(); TranslationGizmo.__xCubeEntity.tryToSetUniqueName('TranslationGizmo_xCube', true); TranslationGizmo.__xCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(1, 0, 0); TranslationGizmo.__xCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__.Mesh(); TranslationGizmo.__xCubeMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__.MaterialHelper.createClassicUberMaterial(); TranslationGizmo.__xCubeMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopyArray4([1, 0, 0, 1])); TranslationGizmo.__xCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_8__.Cube(); TranslationGizmo.__xCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(1, 0.05, 0.05), material: TranslationGizmo.__xCubeMaterial, }); TranslationGizmo.__xCubeMesh.addPrimitive(TranslationGizmo.__xCubePrimitive); TranslationGizmo.__xCubeEntity.getMesh().setMesh(TranslationGizmo.__xCubeMesh); } // y if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__yCubeEntity)) { TranslationGizmo.__yCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__.createMeshEntity)(); TranslationGizmo.__xCubeEntity.tryToSetUniqueName('TranslationGizmo_yCube', true); TranslationGizmo.__yCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(0, 1, 0); TranslationGizmo.__yCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__.Mesh(); TranslationGizmo.__yCubeMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__.MaterialHelper.createClassicUberMaterial(); TranslationGizmo.__yCubeMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopyArray4([0, 1, 0, 1])); TranslationGizmo.__yCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_8__.Cube(); TranslationGizmo.__yCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(0.05, 1, 0.05), material: TranslationGizmo.__yCubeMaterial, }); TranslationGizmo.__yCubeMesh.addPrimitive(TranslationGizmo.__yCubePrimitive); TranslationGizmo.__yCubeEntity.getMesh().setMesh(TranslationGizmo.__yCubeMesh); } // z if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__zCubeEntity)) { TranslationGizmo.__zCubeEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__.createMeshEntity)(); TranslationGizmo.__xCubeEntity.tryToSetUniqueName('TranslationGizmo_zCube', true); TranslationGizmo.__zCubeEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(0, 0, 1); TranslationGizmo.__zCubeMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__.Mesh(); TranslationGizmo.__zCubeMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__.MaterialHelper.createClassicUberMaterial(); TranslationGizmo.__zCubeMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopyArray4([0, 0, 1, 1])); TranslationGizmo.__zCubePrimitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_8__.Cube(); TranslationGizmo.__zCubePrimitive.generate({ widthVector: _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(0.05, 0.05, 1), material: TranslationGizmo.__zCubeMaterial, }); TranslationGizmo.__zCubeMesh.addPrimitive(TranslationGizmo.__zCubePrimitive); TranslationGizmo.__zCubeEntity.getMesh().setMesh(TranslationGizmo.__zCubeMesh); } // xy Plane if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__xyPlaneEntity)) { TranslationGizmo.__xyPlaneEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__.createMeshEntity)(); TranslationGizmo.__xCubeEntity.tryToSetUniqueName('TranslationGizmo_xyPlane', true); TranslationGizmo.__xyPlaneEntity.getSceneGraph().isVisible = false; // TranslationGizmo.__xyPlaneEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; TranslationGizmo.__xyPlaneEntity.getTransform().localEulerAngles = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(_math_MathUtil__WEBPACK_IMPORTED_MODULE_12__.MathUtil.degreeToRadian(90), 0, 0); TranslationGizmo.__xyPlaneMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__.MaterialHelper.createClassicUberMaterial(); TranslationGizmo.__xyPlaneMaterial.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_3__.AlphaMode.Blend; TranslationGizmo.__xyPlaneMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopyArray4([0, 0, 0.5, 0])); TranslationGizmo.__xyPlaneMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__.Mesh(); TranslationGizmo.__xyPlanePrimitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_9__.Plane(); TranslationGizmo.__xyPlanePrimitive.generate({ width: 100000, height: 100000, uSpan: 1, vSpan: 1, isUVRepeat: true, flipTextureCoordinateY: false, material: TranslationGizmo.__xyPlaneMaterial, }); TranslationGizmo.__xyPlaneMesh.addPrimitive(TranslationGizmo.__xyPlanePrimitive); TranslationGizmo.__xyPlaneEntity.getMesh().setMesh(TranslationGizmo.__xyPlaneMesh); } // yz Plane if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__yzPlaneEntity)) { TranslationGizmo.__yzPlaneEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__.createMeshEntity)(); TranslationGizmo.__xCubeEntity.tryToSetUniqueName('TranslationGizmo_yzPlane', true); TranslationGizmo.__yzPlaneEntity.getSceneGraph().isVisible = false; // TranslationGizmo.__yzPlaneEntity.getSceneGraph().toMakeWorldMatrixTheSameAsLocalMatrix = true; TranslationGizmo.__yzPlaneEntity.getTransform().localEulerAngles = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(0, 0, _math_MathUtil__WEBPACK_IMPORTED_MODULE_12__.MathUtil.degreeToRadian(90)); TranslationGizmo.__yzPlaneMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__.MaterialHelper.createClassicUberMaterial(); TranslationGizmo.__yzPlaneMaterial.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_3__.AlphaMode.Blend; TranslationGizmo.__yzPlaneMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopyArray4([0.5, 0, 0, 0])); TranslationGizmo.__yzPlaneMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__.Mesh(); TranslationGizmo.__yzPlanePrimitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_9__.Plane(); TranslationGizmo.__yzPlanePrimitive.generate({ width: 100000, height: 100000, uSpan: 1, vSpan: 1, isUVRepeat: true, flipTextureCoordinateY: false, material: TranslationGizmo.__yzPlaneMaterial, }); TranslationGizmo.__yzPlaneMesh.addPrimitive(TranslationGizmo.__yzPlanePrimitive); TranslationGizmo.__yzPlaneEntity.getMesh().setMesh(TranslationGizmo.__yzPlaneMesh); } // zx Plane if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__zxPlaneEntity)) { TranslationGizmo.__zxPlaneEntity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_23__.createMeshEntity)(); TranslationGizmo.__xCubeEntity.tryToSetUniqueName('TranslationGizmo_zxPlane', true); TranslationGizmo.__zxPlaneEntity.getSceneGraph().isVisible = false; // Vector3.fromCopy3(90, 0, 0); TranslationGizmo.__zxPlaneMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_10__.MaterialHelper.createClassicUberMaterial(); TranslationGizmo.__zxPlaneMaterial.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopyArray4([0, 0.5, 0, 0])); TranslationGizmo.__zxPlaneMaterial.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_3__.AlphaMode.Blend; TranslationGizmo.__zxPlaneMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_6__.Mesh(); TranslationGizmo.__zxPlanePrimitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_9__.Plane(); TranslationGizmo.__zxPlanePrimitive.generate({ width: 100000, height: 100000, uSpan: 1, vSpan: 1, isUVRepeat: true, flipTextureCoordinateY: false, material: TranslationGizmo.__zxPlaneMaterial, }); TranslationGizmo.__zxPlaneMesh.addPrimitive(TranslationGizmo.__zxPlanePrimitive); TranslationGizmo.__zxPlaneEntity.getMesh().setMesh(TranslationGizmo.__zxPlaneMesh); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.not.exist(TranslationGizmo.__groupEntity)) { TranslationGizmo.__groupEntity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_22__.createGroupEntity)(); } this.__topEntity.getSceneGraph().addChild(TranslationGizmo.__groupEntity.getSceneGraph()); TranslationGizmo.__groupEntity .getSceneGraph() .addChild(TranslationGizmo.__xCubeEntity.getSceneGraph()); TranslationGizmo.__groupEntity .getSceneGraph() .addChild(TranslationGizmo.__yCubeEntity.getSceneGraph()); TranslationGizmo.__groupEntity .getSceneGraph() .addChild(TranslationGizmo.__zCubeEntity.getSceneGraph()); TranslationGizmo.__groupEntity .getSceneGraph() .addChild(TranslationGizmo.__xyPlaneEntity.getSceneGraph()); TranslationGizmo.__groupEntity .getSceneGraph() .addChild(TranslationGizmo.__yzPlaneEntity.getSceneGraph()); TranslationGizmo.__groupEntity .getSceneGraph() .addChild(TranslationGizmo.__zxPlaneEntity.getSceneGraph()); this.__latestTargetEntity = this.__target; this.setGizmoTag(); } /** * @internal * update the transform and etc of the gizmo */ _update() { if (this.__topEntity == null) { return; } const sg = this.__target.getSceneGraph(); const aabb = sg.worldMergedAABBWithSkeletal; if (aabb.isVanilla()) { this.__topEntity.getTransform().localPosition = sg.position; } else { this.__topEntity.getTransform().localPosition = aabb.centerPoint; } const max = Math.max(aabb.sizeX, aabb.sizeY, aabb.sizeZ); this.__topEntity.getTransform().localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopyArray([ Math.min(1, aabb.isVanilla() ? 1 : max / 2), Math.min(1, aabb.isVanilla() ? 1 : max / 2), Math.min(1, aabb.isVanilla() ? 1 : max / 2), ]); if (this.__isPointerDown) { if (this.__latestTargetEntity === this.__target) { this.__target.getTransform().localPosition = this.__deltaPoint.clone(); } } } /// /// /// Private Static Members /// /// static __generatePrimitive() { const positions = new Float32Array([ // X axis 0, 0, 0, this.__length, 0, 0, // Y axis 0, 0, 0, 0, this.__length, 0, // Z axis 0, 0, 0, 0, 0, this.__length, ]); const color = new Float32Array([ // X axis as Red 1, 0, 0, 1, 0, 0, // Y axis as Green 0, 1, 0, 0, 1, 0, // Z axis as Blue 0, 0, 1, 0, 0, 1, ]); const primitive = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_7__.Primitive.createPrimitive({ attributeSemantics: [_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Position.XYZ, _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Color0.XYZ], attributes: [positions, color], primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_4__.PrimitiveMode.Lines, }); return primitive; } __onPointerDown(evt) { evt.preventDefault(); this.__isPointerDown = true; TranslationGizmo.__originalX = evt.clientX; TranslationGizmo.__originalY = evt.clientY; const parent = this.__target.getSceneGraph().parent; let worldMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_11__.Matrix44.identity(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.exist(parent)) { worldMatrix = parent.matrixInner.getRotate(); } const scaleVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.one(); //this.__target.getSceneGraph().worldMatrix.getScale(); let rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__.Matrix33.fromCopy9RowMajor(scaleVec.x * worldMatrix.m00, scaleVec.x * worldMatrix.m01, scaleVec.x * worldMatrix.m02, scaleVec.y * worldMatrix.m10, scaleVec.y * worldMatrix.m11, scaleVec.y * worldMatrix.m12, scaleVec.z * worldMatrix.m20, scaleVec.z * worldMatrix.m21, scaleVec.z * worldMatrix.m22); if (TranslationGizmo.__space === 'local') { rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__.Matrix33.transpose(rotMat); } else if (TranslationGizmo.__space === 'world') { rotMat = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_14__.MutableMatrix33.identity(); } const { xResult, yResult, zResult } = TranslationGizmo.castRay(evt); if (xResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__.assertExist)(xResult.data); this.__pickStatedPoint = rotMat.multiplyVector(xResult.data.position.clone()); _misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.debug('Down:' + this.__pickStatedPoint.toStringApproximately()); TranslationGizmo.__activeAxis = 'x'; } if (yResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__.assertExist)(yResult.data); this.__pickStatedPoint = rotMat.multiplyVector(yResult.data.position.clone()); _misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.debug('Down:' + this.__pickStatedPoint.toStringApproximately()); TranslationGizmo.__activeAxis = 'y'; } if (zResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__.assertExist)(zResult.data); this.__pickStatedPoint = rotMat.multiplyVector(zResult.data.position.clone()); _misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.debug('Down:' + this.__pickStatedPoint.toStringApproximately()); TranslationGizmo.__activeAxis = 'z'; } if (this.__latestTargetEntity === this.__target) { this.__targetPointBackup = this.__target.getTransform().localPosition; } } __onPointerMove(evt) { evt.preventDefault(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.false(this.__isPointerDown)) { return; } const rect = evt.target.getBoundingClientRect(); const width = evt.target.clientWidth; const height = evt.target.clientHeight; const x = evt.clientX - rect.left; const y = rect.height - (evt.clientY - rect.top); const viewport = _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopy4(0, 0, width, height); const activeCamera = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); const parent = this.__target.getSceneGraph().parent; let worldMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_11__.Matrix44.identity(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.exist(parent)) { worldMatrix = parent.matrixInner.getRotate(); } const scaleVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.one(); let rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__.Matrix33.fromCopy9RowMajor(scaleVec.x * worldMatrix.m00, scaleVec.x * worldMatrix.m01, scaleVec.x * worldMatrix.m02, scaleVec.y * worldMatrix.m10, scaleVec.y * worldMatrix.m11, scaleVec.y * worldMatrix.m12, scaleVec.z * worldMatrix.m20, scaleVec.z * worldMatrix.m21, scaleVec.z * worldMatrix.m22); if (TranslationGizmo.__space === 'local') { rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__.Matrix33.transpose(rotMat); } else if (TranslationGizmo.__space === 'world') { rotMat = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_14__.MutableMatrix33.identity(); } let pickInMovingPoint = this.__pickStatedPoint.clone(); if (TranslationGizmo.__activeAxis === 'x') { const xResult = TranslationGizmo.__xyPlaneEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); if (xResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__.assertExist)(xResult.data); const position = rotMat.multiplyVector(xResult.data.position); pickInMovingPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(position.x, pickInMovingPoint.y, pickInMovingPoint.z); // console.log('Move:' + xResult.data.position.toStringApproximately()); } _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.disableCameraController(); } if (TranslationGizmo.__activeAxis === 'y') { const yResult = TranslationGizmo.__xyPlaneEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); if (yResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__.assertExist)(yResult.data); const position = rotMat.multiplyVector(yResult.data.position); pickInMovingPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(pickInMovingPoint.x, position.y, pickInMovingPoint.z); // console.log('Move:' + yResult.data.position.toStringApproximately()); } _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.disableCameraController(); } if (TranslationGizmo.__activeAxis === 'z') { const zResult = TranslationGizmo.__yzPlaneEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); if (zResult.result) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_19__.assertExist)(zResult.data); const position = rotMat.multiplyVector(zResult.data.position); pickInMovingPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.fromCopy3(pickInMovingPoint.x, pickInMovingPoint.y, position.z); // console.log('Move:' + zResult.data.position.toStringApproximately()); } _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.disableCameraController(); } const deltaVector3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.subtract(pickInMovingPoint, this.__pickStatedPoint); if (deltaVector3.length() === 0) { return; } _misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.debug(`${this.__target.uniqueName}: ` + deltaVector3.toStringApproximately()); if (TranslationGizmo.__space === 'local') { this.__deltaPoint = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.add(deltaVector3, this.__targetPointBackup); } else if (TranslationGizmo.__space === 'world') { const parent = this.__target.getSceneGraph().parent; let worldMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_11__.Matrix44.identity(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.exist(parent)) { worldMatrix = parent.matrix.getRotate(); } const scaleVec = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.one(); let rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__.Matrix33.fromCopy9RowMajor(scaleVec.x * worldMatrix.m00, scaleVec.x * worldMatrix.m01, scaleVec.x * worldMatrix.m02, scaleVec.y * worldMatrix.m10, scaleVec.y * worldMatrix.m11, scaleVec.y * worldMatrix.m12, scaleVec.z * worldMatrix.m20, scaleVec.z * worldMatrix.m21, scaleVec.z * worldMatrix.m22); rotMat = _math_Matrix33__WEBPACK_IMPORTED_MODULE_13__.Matrix33.transpose(rotMat); const deltaDeltaVector3 = _math_Vector3__WEBPACK_IMPORTED_MODULE_16__.Vector3.add(this.__targetPointBackup, rotMat.multiplyVector(deltaVector3)); this.__deltaPoint = deltaDeltaVector3; } } __onPointerUp(evt) { evt.preventDefault(); this.__isPointerDown = false; TranslationGizmo.__activeAxis = 'none'; _system_InputManager__WEBPACK_IMPORTED_MODULE_20__.InputManager.enableCameraController(); if (this.__latestTargetEntity === this.__target) { this.__targetPointBackup = this.__target.getTransform().localPosition; } } static castRay2(evt) { const rect = evt.target.getBoundingClientRect(); const width = evt.target.clientWidth; const height = evt.target.clientHeight; const x = evt.clientX - rect.left; const y = rect.height - (evt.clientY - rect.top); const viewport = _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopy4(0, 0, width, height); const activeCamera = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); const result = TranslationGizmo.__groupEntity .getSceneGraph() .castRayFromScreen(x, y, activeCamera, viewport, 0.0, []); return result; } static castRay(evt) { const rect = evt.target.getBoundingClientRect(); const width = evt.target.clientWidth; const height = evt.target.clientHeight; const x = evt.clientX - rect.left; const y = rect.height - (evt.clientY - rect.top); const viewport = _math_Vector4__WEBPACK_IMPORTED_MODULE_17__.Vector4.fromCopy4(0, 0, width, height); const activeCamera = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); const xResult = TranslationGizmo.__xCubeEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); const yResult = TranslationGizmo.__yCubeEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); const zResult = TranslationGizmo.__zCubeEntity .getMesh() .castRayFromScreenInWorld(x, y, activeCamera, viewport, 0.0); return { xResult, yResult, zResult }; } _destroy() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_18__.Is.exist(this.__topEntity)) { this.__topEntity._destroy(); } } } TranslationGizmo.__originalX = 0; TranslationGizmo.__originalY = 0; TranslationGizmo.__activeAxis = 'none'; TranslationGizmo.__space = 'world'; TranslationGizmo.__length = 1; /***/ }), /***/ "./src/foundation/gizmos/index.ts": /*!****************************************!*\ !*** ./src/foundation/gizmos/index.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AABBGizmo: () => (/* reexport safe */ _AABBGizmo__WEBPACK_IMPORTED_MODULE_0__.AABBGizmo), /* harmony export */ Gizmo: () => (/* reexport safe */ _Gizmo__WEBPACK_IMPORTED_MODULE_1__.Gizmo), /* harmony export */ LightGizmo: () => (/* reexport safe */ _LightGizmo__WEBPACK_IMPORTED_MODULE_3__.LightGizmo), /* harmony export */ LocatorGizmo: () => (/* reexport safe */ _LocatorGizmo__WEBPACK_IMPORTED_MODULE_2__.LocatorGizmo), /* harmony export */ ScaleGizmo: () => (/* reexport safe */ _ScaleGizmo__WEBPACK_IMPORTED_MODULE_4__.ScaleGizmo), /* harmony export */ TranslationGizmo: () => (/* reexport safe */ _TranslationGizmo__WEBPACK_IMPORTED_MODULE_5__.TranslationGizmo) /* harmony export */ }); /* harmony import */ var _AABBGizmo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AABBGizmo */ "./src/foundation/gizmos/AABBGizmo.ts"); /* harmony import */ var _Gizmo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Gizmo */ "./src/foundation/gizmos/Gizmo.ts"); /* harmony import */ var _LocatorGizmo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./LocatorGizmo */ "./src/foundation/gizmos/LocatorGizmo.ts"); /* harmony import */ var _LightGizmo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./LightGizmo */ "./src/foundation/gizmos/LightGizmo.ts"); /* harmony import */ var _ScaleGizmo__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ScaleGizmo */ "./src/foundation/gizmos/ScaleGizmo.ts"); /* harmony import */ var _TranslationGizmo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TranslationGizmo */ "./src/foundation/gizmos/TranslationGizmo.ts"); /***/ }), /***/ "./src/foundation/helpers/EntityHelper.ts": /*!************************************************!*\ !*** ./src/foundation/helpers/EntityHelper.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createLightWithCameraEntity: () => (/* binding */ createLightWithCameraEntity) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components */ "./src/foundation/components/index.ts"); function createLightWithCameraEntity() { const entity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity)(); const entityAddedComponent = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_components__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.LightComponentTID, entity); const entityAddedComponent2 = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.tryToAddComponentToEntityByTID(_components__WEBPACK_IMPORTED_MODULE_2__.WellKnownComponentTIDs.CameraComponentTID, entityAddedComponent); entityAddedComponent2.getCamera().isSyncToLight = true; return entityAddedComponent2; } /***/ }), /***/ "./src/foundation/helpers/ExpressionHelper.ts": /*!****************************************************!*\ !*** ./src/foundation/helpers/ExpressionHelper.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ExpressionHelper: () => (/* binding */ ExpressionHelper) /* harmony export */ }); /* harmony import */ var _MaterialHelper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _RenderPassHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RenderPassHelper */ "./src/foundation/helpers/RenderPassHelper.ts"); /* harmony import */ var _RenderableHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RenderableHelper */ "./src/foundation/helpers/RenderableHelper.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _math_Vector2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _renderer_Expression__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../renderer/Expression */ "./src/foundation/renderer/Expression.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); function createBloomExpression({ textureToBloom, parameters: { luminanceCriterion = 1.0, gaussianBlurLevelHighLuminance = 4, gaussianKernelSize = 10, gaussianVariance = 10, synthesizeCoefficient = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], // synthesizeCoefficient = [1.0 / 2, 1.0 / 4, 1.0 / 8, 1.0 / 16, 1.0 / 32, 1.0 / 64], }, }) { // Setup DetectHighLuminanceMaterial const renderPassDetectHighLuminance = createRenderPassDetectHighLuminance(textureToBloom, luminanceCriterion); // Setup RenderPasses for GaussianBlur const renderPassesBlurredHighLuminance = createRenderPassesBlurredHighLuminance(renderPassDetectHighLuminance, gaussianBlurLevelHighLuminance, gaussianKernelSize, gaussianVariance, textureToBloom.width, textureToBloom.height); // Setup SynthesizeMaterial const renderPassSynthesizeImage = createRenderPassSynthesizeImage(textureToBloom, renderPassesBlurredHighLuminance, synthesizeCoefficient); // Setup Expression const expression = new _renderer_Expression__WEBPACK_IMPORTED_MODULE_5__.Expression(); expression.addRenderPasses([ renderPassDetectHighLuminance, ...renderPassesBlurredHighLuminance, renderPassSynthesizeImage, ]); return { bloomExpression: expression, bloomedRenderTarget: renderPassSynthesizeImage.getFramebuffer() .colorAttachments[0], }; } function createRenderPassDetectHighLuminance(texture, luminanceCriterion) { const materialDetectHighLuminance = _MaterialHelper__WEBPACK_IMPORTED_MODULE_0__.MaterialHelper.createDetectHighLuminanceMaterial({ maxInstancesNumber: 1 }, texture); materialDetectHighLuminance.setParameter('luminanceCriterion', luminanceCriterion); // materialDetectHighLuminance.setParameter( // DetectHighLuminanceMaterialContent.LuminanceReduce, // luminanceReduce // ); const renderPassDetectHighLuminance = _RenderPassHelper__WEBPACK_IMPORTED_MODULE_1__.RenderPassHelper.createScreenDrawRenderPass(materialDetectHighLuminance); renderPassDetectHighLuminance.tryToSetUniqueName('renderPassDetectHighLuminance', true); const framebufferDetectHighLuminance = _RenderableHelper__WEBPACK_IMPORTED_MODULE_2__.RenderableHelper.createFrameBuffer({ width: texture.width, height: texture.height, textureNum: 1, textureFormats: [_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__.TextureFormat.RGBA8], createDepthBuffer: false, }); renderPassDetectHighLuminance.setFramebuffer(framebufferDetectHighLuminance); return renderPassDetectHighLuminance; } function createRenderPassesBlurredHighLuminance(renderPassHighLuminance, gaussianBlurLevelHighLuminance, gaussianKernelSize, gaussianVariance, maxResolutionWidth, maxResolutionHeight) { const renderPasses = []; for (let i = 0; i < gaussianBlurLevelHighLuminance; i++) { const resolutionWidthBlur = Math.max(maxResolutionWidth >> (i + 1), 1); const resolutionHeightBlur = Math.max(maxResolutionHeight >> (i + 1), 1); let renderPassBlurH; if (i === 0) { renderPassBlurH = createRenderPassGaussianBlur(renderPassHighLuminance, gaussianKernelSize, gaussianVariance, true, resolutionWidthBlur, resolutionHeightBlur); } else { renderPassBlurH = createRenderPassGaussianBlur(renderPasses[renderPasses.length - 1], gaussianKernelSize, gaussianVariance, true, resolutionWidthBlur, resolutionHeightBlur); } renderPassBlurH.tryToSetUniqueName('renderPassBlurH_' + i, true); const renderPassBlurHV = createRenderPassGaussianBlur(renderPassBlurH, gaussianKernelSize, gaussianVariance, false, resolutionWidthBlur, resolutionHeightBlur); renderPassBlurHV.tryToSetUniqueName('renderPassBlurHV_' + i, true); renderPasses.push(renderPassBlurH, renderPassBlurHV); } return renderPasses; } function createRenderPassGaussianBlur(renderPassBlurTarget, gaussianKernelSize, gaussianVariance, isHorizontal, resolutionWidthBlur, resolutionHeightBlur) { const material = _MaterialHelper__WEBPACK_IMPORTED_MODULE_0__.MaterialHelper.createGaussianBlurMaterial(); const gaussianDistributionRatio = _math_MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.computeGaussianDistributionRatioWhoseSumIsOne({ kernelSize: gaussianKernelSize, variance: gaussianVariance, }); material.setParameter('gaussianKernelSize', gaussianKernelSize); material.setParameter('gaussianRatio', new _math_VectorN__WEBPACK_IMPORTED_MODULE_6__.VectorN(new Float32Array(gaussianDistributionRatio))); material.setParameter('framebufferSize', _math_Vector2__WEBPACK_IMPORTED_MODULE_4__.Vector2.fromCopy2(resolutionWidthBlur, resolutionHeightBlur)); if (isHorizontal === false) { material.setParameter('isHorizontal', false); } const framebufferTarget = renderPassBlurTarget.getFramebuffer(); const TextureTarget = framebufferTarget.colorAttachments[0]; const renderPass = _RenderPassHelper__WEBPACK_IMPORTED_MODULE_1__.RenderPassHelper.createScreenDrawRenderPassWithBaseColorTexture(material, TextureTarget); const framebuffer = _RenderableHelper__WEBPACK_IMPORTED_MODULE_2__.RenderableHelper.createFrameBuffer({ width: resolutionWidthBlur, height: resolutionHeightBlur, textureNum: 1, textureFormats: [_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__.TextureFormat.RGBA8], createDepthBuffer: false, }); renderPass.setFramebuffer(framebuffer); return renderPass; } function createRenderPassSynthesizeImage(texture, renderPassesBlurredHighLuminance, synthesizeCoefficient) { const texturesSynthesize = [texture]; // original texture for (let i = 1; i < renderPassesBlurredHighLuminance.length; i += 2) { texturesSynthesize.push(renderPassesBlurredHighLuminance[i].getFramebuffer() // blurred textures .colorAttachments[0]); } const materialSynthesizeTextures = _MaterialHelper__WEBPACK_IMPORTED_MODULE_0__.MaterialHelper.createSynthesizeHDRMaterial({ maxInstancesNumber: 1, }, texturesSynthesize); materialSynthesizeTextures.setParameter('synthesizeCoefficient', synthesizeCoefficient); const renderPassSynthesizeGlare = _RenderPassHelper__WEBPACK_IMPORTED_MODULE_1__.RenderPassHelper.createScreenDrawRenderPass(materialSynthesizeTextures); renderPassSynthesizeGlare.tryToSetUniqueName('renderPassSynthesizeGlare', true); const framebufferSynthesizeImages = _RenderableHelper__WEBPACK_IMPORTED_MODULE_2__.RenderableHelper.createFrameBuffer({ width: texture.width, height: texture.height, textureNum: 1, textureFormats: [_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__.TextureFormat.R11F_G11F_B10F], createDepthBuffer: false, }); renderPassSynthesizeGlare.setFramebuffer(framebufferSynthesizeImages); return renderPassSynthesizeGlare; } const ExpressionHelper = Object.freeze({ createBloomExpression, }); /***/ }), /***/ "./src/foundation/helpers/MaterialHelper.ts": /*!**************************************************!*\ !*** ./src/foundation/helpers/MaterialHelper.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MaterialHelper: () => (/* binding */ MaterialHelper) /* harmony export */ }); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _materials_contents_DepthEncodeMaterialContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../materials/contents/DepthEncodeMaterialContent */ "./src/foundation/materials/contents/DepthEncodeMaterialContent.ts"); /* harmony import */ var _materials_contents_ShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../materials/contents/ShadowMapDecodeClassicMaterialContent */ "./src/foundation/materials/contents/ShadowMapDecodeClassicMaterialContent.ts"); /* harmony import */ var _materials_contents_EntityUIDOutputMaterialContent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../materials/contents/EntityUIDOutputMaterialContent */ "./src/foundation/materials/contents/EntityUIDOutputMaterialContent.ts"); /* harmony import */ var _materials_contents_MToonMaterialContent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../materials/contents/MToonMaterialContent */ "./src/foundation/materials/contents/MToonMaterialContent.ts"); /* harmony import */ var _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../materials/contents/CustomMaterialContent */ "./src/foundation/materials/contents/CustomMaterialContent.ts"); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _materials_contents_FurnaceTestMaterialContent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../materials/contents/FurnaceTestMaterialContent */ "./src/foundation/materials/contents/FurnaceTestMaterialContent.ts"); /* harmony import */ var _materials_contents_DetectHighLuminanceMaterialContent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../materials/contents/DetectHighLuminanceMaterialContent */ "./src/foundation/materials/contents/DetectHighLuminanceMaterialContent.ts"); /* harmony import */ var _materials_contents_SynthesizeHdrMaterialContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../materials/contents/SynthesizeHdrMaterialContent */ "./src/foundation/materials/contents/SynthesizeHdrMaterialContent.ts"); /* harmony import */ var _materials_contents_ColorGradingUsingLUTsMaterialContent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../materials/contents/ColorGradingUsingLUTsMaterialContent */ "./src/foundation/materials/contents/ColorGradingUsingLUTsMaterialContent.ts"); /* harmony import */ var _materials_contents_MatCapMaterialContent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../materials/contents/MatCapMaterialContent */ "./src/foundation/materials/contents/MatCapMaterialContent.ts"); /* harmony import */ var _materials_contents_VarianceShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../materials/contents/VarianceShadowMapDecodeClassicMaterialContent */ "./src/foundation/materials/contents/VarianceShadowMapDecodeClassicMaterialContent.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _webgl_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_vert__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert */ "./src/webgl/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_frag__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.frag */ "./src/webgl/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_vert__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert */ "./src/webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_frag__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.frag */ "./src/webgpu/shaderity_shaders/ClassicSingleShader/ClassicSingleShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_PbrSingleShader_PbrSingleShader_vert__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert */ "./src/webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_PbrSingleShader_PbrSingleShader_frag__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag */ "./src/webgl/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_PbrSingleShader_PbrSingleShader_vert__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert */ "./src/webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_PbrSingleShader_PbrSingleShader_frag__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag */ "./src/webgpu/shaderity_shaders/PbrSingleShader/PbrSingleShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_vert__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert */ "./src/webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_frag__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag */ "./src/webgl/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_vert__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert */ "./src/webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_frag__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag */ "./src/webgpu/shaderity_shaders/EnvConstantSingleShader/EnvConstantSingleShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_FXAA3QualityShader_FXAA3QualitySingleShader_vert__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.vert */ "./src/webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_FXAA3QualityShader_FXAA3QualitySingleShader_frag__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.frag */ "./src/webgl/shaderity_shaders/FXAA3QualityShader/FXAA3QualitySingleShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_vert__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert */ "./src/webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_frag__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag */ "./src/webgl/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_vert__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert */ "./src/webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_frag__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag */ "./src/webgpu/shaderity_shaders/GammaCorrectionShader/GammaCorrectionShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_ToneMappingShader_ToneMappingShader_vert__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert */ "./src/webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_ToneMappingShader_ToneMappingShader_frag__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag */ "./src/webgl/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_ToneMappingShader_ToneMappingShader_vert_wgsl__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert.wgsl */ "./src/webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.vert.wgsl"); /* harmony import */ var _webgpu_shaderity_shaders_ToneMappingShader_ToneMappingShader_frag_wgsl__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag.wgsl */ "./src/webgpu/shaderity_shaders/ToneMappingShader/ToneMappingShader.frag.wgsl"); /* harmony import */ var _webgl_shaderity_shaders_SummedAreaTableShader_SummedAreaTableShader_vert__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.vert */ "./src/webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_SummedAreaTableShader_SummedAreaTableShader_frag__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.frag */ "./src/webgl/shaderity_shaders/SummedAreaTableShader/SummedAreaTableShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_FlatSingleShader_FlatSingleShader_vert__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert */ "./src/webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_FlatSingleShader_FlatSingleShader_frag__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag */ "./src/webgl/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_FlatSingleShader_FlatSingleShader_vert__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert */ "./src/webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_FlatSingleShader_FlatSingleShader_frag__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag */ "./src/webgpu/shaderity_shaders/FlatSingleShader/FlatSingleShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_DepthMomentEncodeShader_DepthMomentEncodeShader_vert__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.vert */ "./src/webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_DepthMomentEncodeShader_DepthMomentEncodeShader_frag__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.frag */ "./src/webgl/shaderity_shaders/DepthMomentEncodeShader/DepthMomentEncodeShader.frag"); /* harmony import */ var _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../materials/core/MaterialRepository */ "./src/foundation/materials/core/MaterialRepository.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../materials/core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _webgl_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_vert__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert */ "./src/webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_frag__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag */ "./src/webgl/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_vert__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert */ "./src/webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_frag__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag */ "./src/webgpu/shaderity_shaders/GaussianBlurShader/GaussianBlurShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_GaussianBlurForEncodedDepthShader_GaussianBlurForEncodedDepthShader_vert__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.vert */ "./src/webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_GaussianBlurForEncodedDepthShader_GaussianBlurForEncodedDepthShader_frag__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.frag */ "./src/webgl/shaderity_shaders/GaussianBlurForEncodedDepthShader/GaussianBlurForEncodedDepthShader.frag"); /* harmony import */ var _webgl_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_vert__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert */ "./src/webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_frag__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag */ "./src/webgl/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_vert_wgsl__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert.wgsl */ "./src/webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.vert.wgsl"); /* harmony import */ var _webgpu_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_frag_wgsl__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag.wgsl */ "./src/webgpu/shaderity_shaders/PanoramaToCubeShader/PanoramaToCubeShader.frag.wgsl"); /* harmony import */ var _webgl_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_vert__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert */ "./src/webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_frag__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag */ "./src/webgl/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_vert_wgsl__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert.wgsl */ "./src/webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.vert.wgsl"); /* harmony import */ var _webgpu_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_frag_wgsl__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag.wgsl */ "./src/webgpu/shaderity_shaders/PrefilterIBLShader/PrefilterIBLShader.frag.wgsl"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _math_Vector2__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ../math/Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); function createMaterial(materialName, materialNode, maxInstancesNumber) { let group = 0; let isFull = false; do { const actualMaterialName = materialName + `__${group}`; isFull = _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.isFullOrOverOfThisMaterialType(actualMaterialName); if (!isFull) { _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.registerMaterial(actualMaterialName, materialNode, maxInstancesNumber); const material = _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.createMaterial(actualMaterialName, materialNode); return material; } group++; } while (isFull); throw new Error('Failed to create material'); } let lastChangeCountMap = new Map(); function reuseOrRecreateMaterial(materialName, currentMaterial, materialNode, maxInstancesNumber) { let material = currentMaterial; if (_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.isMaterialCompatible(material, materialNode)) { material._materialContent = materialNode; material.makeShadersInvalidate(); return material; } else { let changeCount = 0; const lastChangeCount = lastChangeCountMap.get(materialName); if (lastChangeCount != null) { changeCount = lastChangeCount; } const actualMaterialName = materialName + `___${changeCount++}`; lastChangeCountMap.set(materialName, changeCount); _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.registerMaterial(actualMaterialName, materialNode, maxInstancesNumber); material = _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.createMaterial(actualMaterialName, materialNode); return material; } } function recreateMaterial(materialName, materialNode, maxInstancesNumber) { _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.forceRegisterMaterial(materialName, materialNode, maxInstancesNumber); const material = _materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_47__.MaterialRepository.createMaterial(materialName, materialNode); return material; } function createPbrUberMaterial({ additionalName = '', isMorphing = true, isSkinning = true, isLighting = true, isClearCoat = false, isTransmission = false, isVolume = false, isSheen = false, isSpecular = false, isIridescence = false, isAnisotropy = false, isShadow = false, useTangentAttribute = false, useNormalTexture = true, maxInstancesNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType, } = {}) { const materialName = 'PbrUber' + `_${additionalName}_` + (isMorphing ? '+morphing' : '') + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting') + (isClearCoat ? '+clearcoat' : '') + (isTransmission ? '+transmission' : '') + (isVolume ? '+volume' : '') + (isSheen ? '+sheen' : '') + (isSpecular ? '+specular' : '') + (isIridescence ? '+iridescence' : '') + (isAnisotropy ? '+anisotropy' : '') + (useTangentAttribute ? '+tangentAttribute' : '') + (useNormalTexture ? '' : '-normalTexture'); let additionalShaderSemanticInfo = []; if (true) { additionalShaderSemanticInfo = [ { semantic: 'dataTextureMorphOffsetPosition', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(new Int32Array(_core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, { semantic: 'morphWeights', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(new Float32Array(_core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, ]; } const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_48__.Sampler({ minFilter: _definitions__WEBPACK_IMPORTED_MODULE_65__.TextureParameter.Linear, magFilter: _definitions__WEBPACK_IMPORTED_MODULE_65__.TextureParameter.Linear, wrapS: _definitions__WEBPACK_IMPORTED_MODULE_65__.TextureParameter.ClampToEdge, wrapT: _definitions__WEBPACK_IMPORTED_MODULE_65__.TextureParameter.ClampToEdge, }); let textureSlotIdx = 8; if (isClearCoat) { additionalShaderSemanticInfo.push({ semantic: 'clearCoatTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'clearCoatRoughnessTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'clearCoatNormalTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyBlueTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isTransmission) { additionalShaderSemanticInfo.push({ semantic: 'transmissionTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'backBufferTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isVolume) { additionalShaderSemanticInfo.push({ semantic: 'thicknessTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isSheen) { additionalShaderSemanticInfo.push({ semantic: 'sheenColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'sheenRoughnessTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'sheenLutTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.sheenLutTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isSpecular) { additionalShaderSemanticInfo.push({ semantic: 'specularTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'specularColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isIridescence) { additionalShaderSemanticInfo.push({ semantic: 'iridescenceTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); additionalShaderSemanticInfo.push({ semantic: 'iridescenceThicknessTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isAnisotropy) { additionalShaderSemanticInfo.push({ semantic: 'anisotropyTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyAnisotropyTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } if (isShadow) { additionalShaderSemanticInfo.push({ semantic: 'depthTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [textureSlotIdx++, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyWhiteTexture, sampler], min: 0, max: Number.MAX_VALUE, }); } const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning, isLighting, isMorphing, vertexShader: _webgl_shaderity_shaders_PbrSingleShader_PbrSingleShader_vert__WEBPACK_IMPORTED_MODULE_21__["default"], pixelShader: _webgl_shaderity_shaders_PbrSingleShader_PbrSingleShader_frag__WEBPACK_IMPORTED_MODULE_22__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_PbrSingleShader_PbrSingleShader_vert__WEBPACK_IMPORTED_MODULE_23__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_PbrSingleShader_PbrSingleShader_frag__WEBPACK_IMPORTED_MODULE_24__["default"], additionalShaderSemanticInfo, }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); if (isLighting) { material.addShaderDefine('RN_IS_LIGHTING'); } if (isShadow) { material.addShaderDefine('RN_USE_SHADOW_MAPPING'); } if (useNormalTexture) { material.addShaderDefine('RN_USE_NORMAL_TEXTURE'); } if (isClearCoat) { material.addShaderDefine('RN_USE_CLEARCOAT'); } if (isTransmission) { material.addShaderDefine('RN_USE_TRANSMISSION'); } if (isVolume) { material.addShaderDefine('RN_USE_VOLUME'); } if (isSheen) { material.addShaderDefine('RN_USE_SHEEN'); } if (isSpecular) { material.addShaderDefine('RN_USE_SPECULAR'); } if (isIridescence) { material.addShaderDefine('RN_USE_IRIDESCENCE'); } if (isAnisotropy) { material.addShaderDefine('RN_USE_ANISOTROPY'); } material.addShaderDefine('RN_IS_SKINNING'); return material; } function createClassicUberMaterial({ additionalName = '', isSkinning = true, isLighting = false, isMorphing = false, isShadow = false, maxInstancesNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType, } = {}) { const materialName = 'ClassicUber' + `_${additionalName}_` + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting'); const additionalShaderSemanticInfo = [ { semantic: 'dataTextureMorphOffsetPosition', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(new Int32Array(_core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, { semantic: 'morphWeights', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(new Float32Array(_core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, ]; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: 'ClassicUber', isSkinning, isLighting, isMorphing, vertexShader: _webgl_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_vert__WEBPACK_IMPORTED_MODULE_17__["default"], pixelShader: _webgl_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_frag__WEBPACK_IMPORTED_MODULE_18__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_vert__WEBPACK_IMPORTED_MODULE_19__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_ClassicSingleShader_ClassicSingleShader_frag__WEBPACK_IMPORTED_MODULE_20__["default"], additionalShaderSemanticInfo, }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); if (isLighting) { material.addShaderDefine('RN_IS_LIGHTING'); } if (isShadow) { material.addShaderDefine('RN_USE_SHADOW_MAPPING'); } material.addShaderDefine('RN_USE_NORMAL_TEXTURE'); material.addShaderDefine('RN_IS_SKINNING'); return material; } function createDepthMomentEncodeMaterial({ additionalName = '', isSkinning = true, isMorphing = false, maxInstancesNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType, } = {}) { const materialName = 'DepthMomentEncode' + `_${additionalName}_`; const additionalShaderSemanticInfo = [ { semantic: 'dataTextureMorphOffsetPosition', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(new Int32Array(_core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, { semantic: 'morphWeights', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(new Float32Array(_core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, ]; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: 'DepthMomentEncode', isSkinning, isLighting: false, isMorphing, vertexShader: _webgl_shaderity_shaders_DepthMomentEncodeShader_DepthMomentEncodeShader_vert__WEBPACK_IMPORTED_MODULE_45__["default"], pixelShader: _webgl_shaderity_shaders_DepthMomentEncodeShader_DepthMomentEncodeShader_frag__WEBPACK_IMPORTED_MODULE_46__["default"], additionalShaderSemanticInfo, }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); material.addShaderDefine('RN_IS_SKINNING'); return material; } function createFlatMaterial({ additionalName = '', isSkinning = true, isMorphing = false, maxInstancesNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType, } = {}) { const materialName = 'Flat' + `_${additionalName}_` + (isSkinning ? '+skinning' : ''); const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: 'Flat', isSkinning, isLighting: false, isMorphing, vertexShader: _webgl_shaderity_shaders_FlatSingleShader_FlatSingleShader_vert__WEBPACK_IMPORTED_MODULE_41__["default"], pixelShader: _webgl_shaderity_shaders_FlatSingleShader_FlatSingleShader_frag__WEBPACK_IMPORTED_MODULE_42__["default"], additionalShaderSemanticInfo: [], vertexShaderWebGpu: _webgpu_shaderity_shaders_FlatSingleShader_FlatSingleShader_vert__WEBPACK_IMPORTED_MODULE_43__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_FlatSingleShader_FlatSingleShader_frag__WEBPACK_IMPORTED_MODULE_44__["default"], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); material.addShaderDefine('RN_IS_SKINNING'); return material; } function createEnvConstantMaterial({ additionalName = '', maxInstancesNumber = 5, makeOutputSrgb = true, } = {}) { const materialName = 'EnvConstant' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_vert__WEBPACK_IMPORTED_MODULE_25__["default"], pixelShader: _webgl_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_frag__WEBPACK_IMPORTED_MODULE_26__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_vert__WEBPACK_IMPORTED_MODULE_27__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_EnvConstantSingleShader_EnvConstantSingleShader_frag__WEBPACK_IMPORTED_MODULE_28__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); material.setParameter('makeOutputSrgb', makeOutputSrgb ? 1 : 0); return material; } function createFXAA3QualityMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'FXAA3Quality' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_FXAA3QualityShader_FXAA3QualitySingleShader_vert__WEBPACK_IMPORTED_MODULE_29__["default"], pixelShader: _webgl_shaderity_shaders_FXAA3QualityShader_FXAA3QualitySingleShader_frag__WEBPACK_IMPORTED_MODULE_30__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createFurnaceTestMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'FurnaceTest' + `_${additionalName}`; const materialNode = new _materials_contents_FurnaceTestMaterialContent__WEBPACK_IMPORTED_MODULE_7__.FurnaceTestMaterialContent(); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createDepthEncodeMaterial({ additionalName = '', isSkinning = false, depthPow = 1.0, maxInstancesNumber = 10, } = {}) { const materialName = 'DepthEncode' + `_${additionalName}_` + (isSkinning ? '+skinning' : ''); const materialNode = new _materials_contents_DepthEncodeMaterialContent__WEBPACK_IMPORTED_MODULE_1__.DepthEncodeMaterialContent(depthPow, { isSkinning, }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); if (isSkinning) { material.addShaderDefine('RN_IS_SKINNING'); } return material; } function createShadowMapDecodeClassicSingleMaterial({ additionalName = '', isMorphing = false, isSkinning = false, isLighting = true, isDebugging = false, colorAttachmentsNumber = 0, maxInstancesNumber = 20, } = {}, depthEncodeRenderPass) { const materialName = 'ShadowMapDecodeClassic' + `_${additionalName}_` + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting'); const materialNode = new _materials_contents_ShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_2__.ShadowMapDecodeClassicMaterialContent({ isMorphing, isSkinning, isLighting, isDebugging, colorAttachmentsNumber, }, depthEncodeRenderPass); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); if (isSkinning) { material.addShaderDefine('RN_IS_SKINNING'); } if (isMorphing) { material.addShaderDefine('RN_IS_MORPHING'); } if (isLighting) { material.addShaderDefine('RN_IS_LIGHTING'); } if (isDebugging) { material.addShaderDefine('RN_IS_DEBUGGING'); } return material; } function createGaussianBlurForEncodedDepthMaterial({ additionalName = '', maxInstancesNumber = 10, } = {}) { const materialName = 'GaussianBlurForEncodedDepth' + `_${additionalName}`; const additionalShaderSemanticInfo = []; const gaussianRatio = new Float32Array(30); additionalShaderSemanticInfo.push({ semantic: 'isHorizontal', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Bool, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_64__.Scalar.fromCopyNumber(1), //true min: 0, max: 1, }, { semantic: 'gaussianRatio', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: 30, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(gaussianRatio), min: 0, max: 1, needUniformInDataTextureMode: true, }, { semantic: 'gaussianKernelSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_64__.Scalar.fromCopyNumber(1), min: 1, max: 30, }, { semantic: 'framebufferSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Vec2, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: _math_Vector2__WEBPACK_IMPORTED_MODULE_66__.Vector2.fromCopy2(1, 1), min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'baseColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [0, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyBlackTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }); const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_GaussianBlurForEncodedDepthShader_GaussianBlurForEncodedDepthShader_vert__WEBPACK_IMPORTED_MODULE_54__["default"], pixelShader: _webgl_shaderity_shaders_GaussianBlurForEncodedDepthShader_GaussianBlurForEncodedDepthShader_frag__WEBPACK_IMPORTED_MODULE_55__["default"], additionalShaderSemanticInfo, }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createVarianceShadowMapDecodeClassicSingleMaterial({ additionalName = '', isMorphing = false, isSkinning = false, isDebugging = false, isLighting = true, colorAttachmentsNumberDepth = 0, colorAttachmentsNumberSquareDepth = 0, depthCameraComponent = undefined, maxInstancesNumber = 10, }, encodedDepthRenderPasses) { const materialName = 'VarianceShadowMapDecodeShading' + `_${additionalName}_` + (isMorphing ? '+morphing' : '') + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting') + (isDebugging ? '' : '+debugging'); const materialNode = new _materials_contents_VarianceShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_12__.VarianceShadowMapDecodeClassicMaterialContent({ isMorphing, isSkinning, isLighting, isDebugging, colorAttachmentsNumberDepth, colorAttachmentsNumberSquareDepth, depthCameraComponent, }, encodedDepthRenderPasses); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); if (isSkinning) { material.addShaderDefine('RN_IS_SKINNING'); } if (isLighting) { material.addShaderDefine('RN_IS_LIGHTING'); } if (isMorphing) { material.addShaderDefine('RN_IS_MORPHING'); } if (isDebugging) { material.addShaderDefine('RN_IS_DEBUGGING'); } return material; } function createDetectHighLuminanceMaterial({ additionalName = '', maxInstancesNumber = 5 } = {}, textureToDetectHighLuminance) { const materialName = 'DetectHighLuminance' + `_${additionalName}_`; const materialNode = new _materials_contents_DetectHighLuminanceMaterialContent__WEBPACK_IMPORTED_MODULE_8__.DetectHighLuminanceMaterialContent(textureToDetectHighLuminance); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createGaussianBlurMaterial({ additionalName = '', maxInstancesNumber = 10 } = {}) { const materialName = 'GaussianBlur' + `_${additionalName}`; const additionalShaderSemanticInfo = []; const gaussianRatio = new Float32Array(30); additionalShaderSemanticInfo.push({ semantic: 'isHorizontal', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Bool, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_64__.Scalar.fromCopyNumber(1), //true min: 0, max: 1, }, { semantic: 'gaussianRatio', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.ScalarArray, arrayLength: 30, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_16__.VectorN(gaussianRatio), min: 0, max: 1, // needUniformInDataTextureMode: true, }, { semantic: 'gaussianKernelSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_64__.Scalar.fromCopyNumber(1), min: 1, max: 30, }, { semantic: 'framebufferSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Vec2, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: _math_Vector2__WEBPACK_IMPORTED_MODULE_66__.Vector2.fromCopy2(1, 1), min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'baseColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_14__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_15__.ShaderType.PixelShader, initialValue: [0, _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_49__.dummyBlackTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }); const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_vert__WEBPACK_IMPORTED_MODULE_50__["default"], pixelShader: _webgl_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_frag__WEBPACK_IMPORTED_MODULE_51__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_vert__WEBPACK_IMPORTED_MODULE_52__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_GaussianBlurShader_GaussianBlurShader_frag__WEBPACK_IMPORTED_MODULE_53__["default"], additionalShaderSemanticInfo, }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createSynthesizeHDRMaterial({ additionalName = '', maxInstancesNumber = 1, }, synthesizeTextures) { const materialName = 'SynthesizeHDR' + `_${additionalName}`; const materialNode = new _materials_contents_SynthesizeHdrMaterialContent__WEBPACK_IMPORTED_MODULE_9__.SynthesizeHdrMaterialContent(synthesizeTextures); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createColorGradingUsingLUTsMaterial({ additionalName = '', colorAttachmentsNumber = 0, uri, texture, maxInstancesNumber = 1, }, targetRenderPass) { const materialName = 'ColorGradingUsingLUTs' + `_${additionalName}`; const materialNode = new _materials_contents_ColorGradingUsingLUTsMaterialContent__WEBPACK_IMPORTED_MODULE_10__.ColorGradingUsingLUTsMaterialContent(targetRenderPass, colorAttachmentsNumber, uri, texture); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createGammaCorrectionMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'GammaCorrection' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_vert__WEBPACK_IMPORTED_MODULE_31__["default"], pixelShader: _webgl_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_frag__WEBPACK_IMPORTED_MODULE_32__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_vert__WEBPACK_IMPORTED_MODULE_33__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_GammaCorrectionShader_GammaCorrectionShader_frag__WEBPACK_IMPORTED_MODULE_34__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createToneMappingMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'ToneMapping' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_ToneMappingShader_ToneMappingShader_vert__WEBPACK_IMPORTED_MODULE_35__["default"], pixelShader: _webgl_shaderity_shaders_ToneMappingShader_ToneMappingShader_frag__WEBPACK_IMPORTED_MODULE_36__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_ToneMappingShader_ToneMappingShader_vert_wgsl__WEBPACK_IMPORTED_MODULE_37__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_ToneMappingShader_ToneMappingShader_frag_wgsl__WEBPACK_IMPORTED_MODULE_38__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); material.addShaderDefine('RN_USE_GT_TONEMAP'); return material; } function createSummedAreaTableMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'SummedAreaTable' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_SummedAreaTableShader_SummedAreaTableShader_vert__WEBPACK_IMPORTED_MODULE_39__["default"], pixelShader: _webgl_shaderity_shaders_SummedAreaTableShader_SummedAreaTableShader_frag__WEBPACK_IMPORTED_MODULE_40__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createPanoramaToCubeMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'PanoramaToCube' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_vert__WEBPACK_IMPORTED_MODULE_56__["default"], pixelShader: _webgl_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_frag__WEBPACK_IMPORTED_MODULE_57__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_vert_wgsl__WEBPACK_IMPORTED_MODULE_58__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_PanoramaToCubeShader_PanoramaToCubeShader_frag_wgsl__WEBPACK_IMPORTED_MODULE_59__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createPrefilterIBLMaterial({ additionalName = '', maxInstancesNumber = 1 } = {}) { const materialName = 'PrefilterIBL' + `_${additionalName}`; const materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning: false, isLighting: false, isMorphing: false, vertexShader: _webgl_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_vert__WEBPACK_IMPORTED_MODULE_60__["default"], pixelShader: _webgl_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_frag__WEBPACK_IMPORTED_MODULE_61__["default"], vertexShaderWebGpu: _webgpu_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_vert_wgsl__WEBPACK_IMPORTED_MODULE_62__["default"], pixelShaderWebGpu: _webgpu_shaderity_shaders_PrefilterIBLShader_PrefilterIBLShader_frag_wgsl__WEBPACK_IMPORTED_MODULE_63__["default"], additionalShaderSemanticInfo: [], }); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); return material; } function createMatCapMaterial({ additionalName = '', isSkinning = false, uri, texture, sampler, maxInstancesNumber = 10, }) { const materialName = 'MatCap' + `_${additionalName}` + (isSkinning ? '+skinning' : ''); const materialNode = new _materials_contents_MatCapMaterialContent__WEBPACK_IMPORTED_MODULE_11__.MatCapMaterialContent(isSkinning, uri, texture, sampler); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); if (isSkinning) { material.addShaderDefine('RN_IS_SKINNING'); } return material; } function createEntityUIDOutputMaterial({ additionalName = '', maxInstancesNumber = 10 } = {}) { const materialName = 'EntityUIDOutput' + `_${additionalName}`; const materialNode = new _materials_contents_EntityUIDOutputMaterialContent__WEBPACK_IMPORTED_MODULE_3__.EntityUIDOutputMaterialContent(); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); material.addShaderDefine('RN_IS_SKINNING'); return material; } function createMToonMaterial({ additionalName = '', isMorphing = false, isSkinning = false, isLighting = true, useTangentAttribute = false, isOutline = false, materialProperties, textures, samplers, debugMode, maxInstancesNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType, makeOutputSrgb = true, }) { const materialName = 'MToon' + `_${additionalName}_` + (isMorphing ? '+morphing' : '') + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting') + (useTangentAttribute ? '+tangentAttribute' : '') + (isOutline ? '-outline' : ''); const materialNode = new _materials_contents_MToonMaterialContent__WEBPACK_IMPORTED_MODULE_4__.MToonMaterialContent(isOutline, materialProperties, textures, samplers, isMorphing, isSkinning, isLighting, useTangentAttribute, debugMode, makeOutputSrgb, materialName); materialNode.isSingleOperation = true; const material = createMaterial(materialName, materialNode, maxInstancesNumber); materialNode.setMaterialParameters(material, isOutline); return material; } function reuseOrRecreateCustomMaterial(currentMaterial, vertexShaderStr, pixelShaderStr, { additionalName = '', isSkinning = true, isLighting = false, isMorphing = false, maxInstancesNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType, } = {}) { const materialName = 'Custom' + `_${additionalName}_` + (isMorphing ? '+morphing' : '') + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting'); let materialNode; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_67__.SystemState.currentProcessApproach === _definitions__WEBPACK_IMPORTED_MODULE_65__.ProcessApproach.WebGPU) { materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning, isLighting, isMorphing, vertexShaderWebGpu: { code: vertexShaderStr, shaderStage: 'vertex', isFragmentShader: false, }, pixelShaderWebGpu: { code: pixelShaderStr, shaderStage: 'fragment', isFragmentShader: true, }, additionalShaderSemanticInfo: [], }); } else { materialNode = new _materials_contents_CustomMaterialContent__WEBPACK_IMPORTED_MODULE_5__.CustomMaterialContent({ name: materialName, isSkinning, isLighting, isMorphing, vertexShader: { code: vertexShaderStr, shaderStage: 'vertex', isFragmentShader: false, }, pixelShader: { code: pixelShaderStr, shaderStage: 'fragment', isFragmentShader: true, }, additionalShaderSemanticInfo: [], }); } materialNode.isSingleOperation = true; const material = reuseOrRecreateMaterial(materialName, currentMaterial, materialNode, maxInstancesNumber); material.addShaderDefine('RN_IS_SKINNING'); return material; } function changeMaterial(entity, primitive, material) { const meshRendererComponent = entity.getMeshRenderer(); primitive.material = material; meshRendererComponent.moveStageTo(_definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_6__.ProcessStage.Load); } const MaterialHelper = Object.freeze({ createMaterial, recreateMaterial, reuseOrRecreateCustomMaterial, createClassicUberMaterial, createDepthMomentEncodeMaterial, createFlatMaterial, createPbrUberMaterial, createEnvConstantMaterial, createFXAA3QualityMaterial, createDepthEncodeMaterial, createShadowMapDecodeClassicSingleMaterial, createGammaCorrectionMaterial, createToneMappingMaterial, createPanoramaToCubeMaterial, createPrefilterIBLMaterial, createSummedAreaTableMaterial, createVarianceShadowMapDecodeClassicSingleMaterial, createEntityUIDOutputMaterial, createMToonMaterial, createFurnaceTestMaterial, createGaussianBlurForEncodedDepthMaterial, createDetectHighLuminanceMaterial, createGaussianBlurMaterial, createSynthesizeHDRMaterial, createColorGradingUsingLUTsMaterial, createMatCapMaterial, changeMaterial, }); /***/ }), /***/ "./src/foundation/helpers/MeshHelper.ts": /*!**********************************************!*\ !*** ./src/foundation/helpers/MeshHelper.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MeshHelper: () => (/* binding */ MeshHelper) /* harmony export */ }); /* harmony import */ var _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../geometry/shapes/Plane */ "./src/foundation/geometry/shapes/Plane.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _geometry_shapes_Axis__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../geometry/shapes/Axis */ "./src/foundation/geometry/shapes/Axis.ts"); /* harmony import */ var _geometry_shapes_Line__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../geometry/shapes/Line */ "./src/foundation/geometry/shapes/Line.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _geometry_shapes_Grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../geometry/shapes/Grid */ "./src/foundation/geometry/shapes/Grid.ts"); /* harmony import */ var _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../geometry/shapes/Cube */ "./src/foundation/geometry/shapes/Cube.ts"); /* harmony import */ var _geometry_shapes_Sphere__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../geometry/shapes/Sphere */ "./src/foundation/geometry/shapes/Sphere.ts"); /* harmony import */ var _geometry_shapes_Joint__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../geometry/shapes/Joint */ "./src/foundation/geometry/shapes/Joint.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../misc */ "./src/foundation/misc/index.ts"); /* harmony import */ var _components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/Physics/PhysicsComponent */ "./src/foundation/components/Physics/PhysicsComponent.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../physics/Oimo/OimoPhysicsStrategy */ "./src/foundation/physics/Oimo/OimoPhysicsStrategy.ts"); /* harmony import */ var _definitions_PhysicsShapeType__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../definitions/PhysicsShapeType */ "./src/foundation/definitions/PhysicsShapeType.ts"); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); const createPlane = (desc = {}) => { const primitive = new _geometry_shapes_Plane__WEBPACK_IMPORTED_MODULE_0__.Plane(); primitive.generate(desc); const entity = createShape(primitive); if (_misc__WEBPACK_IMPORTED_MODULE_9__.Is.not.exist(desc.direction)) { desc.direction = 'xz'; } if (desc.direction === 'xy') { entity.localEulerAngles = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(Math.PI / 2, 0, 0); } else if (desc.direction === 'yz') { entity.localEulerAngles = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, Math.PI / 2); } return entity; }; const createLine = (desc = {}) => { const primitive = new _geometry_shapes_Line__WEBPACK_IMPORTED_MODULE_3__.Line(); primitive.generate(desc); const entity = createShape(primitive); return entity; }; const createGrid = (desc = {}) => { const primitive = new _geometry_shapes_Grid__WEBPACK_IMPORTED_MODULE_5__.Grid(); primitive.generate(desc); const entity = createShape(primitive); return entity; }; const createCube = (desc = {}) => { var _a; const primitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_6__.Cube(); primitive.generate(desc); const entity = createShape(primitive); if (_misc__WEBPACK_IMPORTED_MODULE_9__.Is.exist(desc.physics) && desc.physics.use) { const newEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_11__.EntityRepository.addComponentToEntity(_components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_10__.PhysicsComponent, entity); const physicsComponent = newEntity.getPhysics(); const strategy = new _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_12__.OimoPhysicsStrategy(); const property = { type: _definitions_PhysicsShapeType__WEBPACK_IMPORTED_MODULE_13__.PhysicsShape.Box, size: (_a = desc.widthVector) !== null && _a !== void 0 ? _a : _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(1, 1, 1), position: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), rotation: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), move: desc.physics.move, density: desc.physics.density, friction: desc.physics.friction, restitution: desc.physics.restitution, }; strategy.setShape(property, newEntity); physicsComponent.setStrategy(strategy); } return entity; }; const createCubes = (numberToCreate, desc = {}) => { var _a; const primitive = new _geometry_shapes_Cube__WEBPACK_IMPORTED_MODULE_6__.Cube(); primitive.generate(desc); const mesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_1__.Mesh(); mesh.addPrimitive(primitive); const entities = []; for (let i = 0; i < numberToCreate; i++) { const entity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_14__.createMeshEntity)(); const meshComponent = entity.getMesh(); meshComponent.setMesh(mesh); if (_misc__WEBPACK_IMPORTED_MODULE_9__.Is.exist(desc.physics) && desc.physics.use) { const newEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_11__.EntityRepository.addComponentToEntity(_components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_10__.PhysicsComponent, entity); const physicsComponent = newEntity.getPhysics(); const strategy = new _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_12__.OimoPhysicsStrategy(); const property = { type: _definitions_PhysicsShapeType__WEBPACK_IMPORTED_MODULE_13__.PhysicsShape.Box, size: (_a = desc.widthVector) !== null && _a !== void 0 ? _a : _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(1, 1, 1), position: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), rotation: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), move: desc.physics.move, density: desc.physics.density, friction: desc.physics.friction, restitution: desc.physics.restitution, }; strategy.setShape(property, newEntity); physicsComponent.setStrategy(strategy); } entities.push(entity); } return entities; }; const createSphere = (desc = {}) => { const primitive = new _geometry_shapes_Sphere__WEBPACK_IMPORTED_MODULE_7__.Sphere(); primitive.generate(desc); const entity = createShape(primitive); if (_misc__WEBPACK_IMPORTED_MODULE_9__.Is.exist(desc.physics) && desc.physics.use) { const newEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_11__.EntityRepository.addComponentToEntity(_components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_10__.PhysicsComponent, entity); const physicsComponent = newEntity.getPhysics(); const strategy = new _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_12__.OimoPhysicsStrategy(); const property = { type: _definitions_PhysicsShapeType__WEBPACK_IMPORTED_MODULE_13__.PhysicsShape.Sphere, size: _misc__WEBPACK_IMPORTED_MODULE_9__.Is.exist(desc.radius) ? _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(desc.radius, desc.radius, desc.radius) : _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(1, 1, 1), position: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), rotation: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), move: desc.physics.move, density: desc.physics.density, friction: desc.physics.friction, restitution: desc.physics.restitution, }; strategy.setShape(property, newEntity); physicsComponent.setStrategy(strategy); } return entity; }; const createSpheres = (numberToCreate, desc = {}) => { const primitive = new _geometry_shapes_Sphere__WEBPACK_IMPORTED_MODULE_7__.Sphere(); primitive.generate(desc); const mesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_1__.Mesh(); mesh.addPrimitive(primitive); const entities = []; for (let i = 0; i < numberToCreate; i++) { const entity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_14__.createMeshEntity)(); const meshComponent = entity.getMesh(); meshComponent.setMesh(mesh); if (_misc__WEBPACK_IMPORTED_MODULE_9__.Is.exist(desc.physics) && desc.physics.use) { const newEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_11__.EntityRepository.addComponentToEntity(_components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_10__.PhysicsComponent, entity); const physicsComponent = newEntity.getPhysics(); const strategy = new _physics_Oimo_OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_12__.OimoPhysicsStrategy(); const property = { type: _definitions_PhysicsShapeType__WEBPACK_IMPORTED_MODULE_13__.PhysicsShape.Sphere, size: _misc__WEBPACK_IMPORTED_MODULE_9__.Is.exist(desc.radius) ? _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(desc.radius, desc.radius, desc.radius) : _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(1, 1, 1), position: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), rotation: _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopy3(0, 0, 0), move: desc.physics.move, density: desc.physics.density, friction: desc.physics.friction, restitution: desc.physics.restitution, }; strategy.setShape(property, newEntity); physicsComponent.setStrategy(strategy); } entities.push(entity); } return entities; }; const createJoint = (desc = {}) => { const primitive = new _geometry_shapes_Joint__WEBPACK_IMPORTED_MODULE_8__.Joint(); primitive.generate(desc); const entity = createShape(primitive); return entity; }; const createAxis = (desc = {}) => { const primitive = new _geometry_shapes_Axis__WEBPACK_IMPORTED_MODULE_2__.Axis(); primitive.generate(desc); const entity = createShape(primitive); return entity; }; function createShape(primitive) { const entity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_14__.createMeshEntity)(); const meshComponent = entity.getMesh(); const mesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_1__.Mesh(); mesh.addPrimitive(primitive); meshComponent.setMesh(mesh); return entity; } const MeshHelper = Object.freeze({ createPlane, createLine, createGrid, createCube, createCubes, createSphere, createSpheres, createJoint, createAxis, createShape, }); /***/ }), /***/ "./src/foundation/helpers/RenderPassHelper.ts": /*!****************************************************!*\ !*** ./src/foundation/helpers/RenderPassHelper.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderPassHelper: () => (/* binding */ RenderPassHelper) /* harmony export */ }); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../renderer/RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); let _sampler; /** * Creates a RenderPass for Screen rendering. * * @param material * @returns */ function createScreenDrawRenderPass(material) { const renderPass = new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_1__.RenderPass(); renderPass.toClearColorBuffer = false; renderPass.toClearDepthBuffer = false; renderPass.isDepthTest = false; renderPass.setBufferLessFullScreenRendering(material); return renderPass; } /** * Creates a RenderPass for Screen rendering. * * @param material * @returns */ function createScreenDrawRenderPassWithBaseColorTexture(material, texture, sampler) { if (_sampler === undefined) { _sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_2__.Sampler({ magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Linear, minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Linear, wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.ClampToEdge, }); _sampler.create(); } material.setTextureParameter('baseColorTexture', texture, sampler !== null && sampler !== void 0 ? sampler : _sampler); const renderPass = new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_1__.RenderPass(); renderPass.toClearColorBuffer = false; renderPass.toClearDepthBuffer = false; renderPass.isDepthTest = false; renderPass.setBufferLessFullScreenRendering(material); return renderPass; } const RenderPassHelper = Object.freeze({ createScreenDrawRenderPass, createScreenDrawRenderPassWithBaseColorTexture, }); /***/ }), /***/ "./src/foundation/helpers/RenderableHelper.ts": /*!****************************************************!*\ !*** ./src/foundation/helpers/RenderableHelper.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderableHelper: () => (/* binding */ RenderableHelper) /* harmony export */ }); /* harmony import */ var _renderer_FrameBuffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../renderer/FrameBuffer */ "./src/foundation/renderer/FrameBuffer.ts"); /* harmony import */ var _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../textures/RenderTargetTexture */ "./src/foundation/textures/RenderTargetTexture.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _textures_RenderBuffer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../textures/RenderBuffer */ "./src/foundation/textures/RenderBuffer.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _textures__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../textures */ "./src/foundation/textures/index.ts"); function createFrameBuffer(desc) { var _a; const frameBuffer = new _renderer_FrameBuffer__WEBPACK_IMPORTED_MODULE_0__.FrameBuffer(); frameBuffer.create(desc.width, desc.height); for (let i = 0; i < desc.textureNum; i++) { const renderTargetTexture = new _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_1__.RenderTargetTexture(); renderTargetTexture.create({ width: desc.width, height: desc.height, mipLevelCount: desc.mipLevelCount, format: desc.textureFormats[i], }); frameBuffer.setColorAttachmentAt(i, renderTargetTexture); } if (desc.createDepthBuffer) { const depthTexture = new _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_1__.RenderTargetTexture(); const depthBufferInternalFormat = (_a = desc.depthTextureFormat) !== null && _a !== void 0 ? _a : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__.TextureFormat.Depth32F; depthTexture.create({ width: desc.width, height: desc.height, mipLevelCount: 1, format: depthBufferInternalFormat, }); frameBuffer.setDepthAttachment(depthTexture); } return frameBuffer; } function createFrameBufferMSAA(desc) { const frameBuffer = new _renderer_FrameBuffer__WEBPACK_IMPORTED_MODULE_0__.FrameBuffer(); frameBuffer.create(desc.width, desc.height); for (let i = 0; i < desc.colorBufferNum; i++) { const renderBuffer = new _textures_RenderBuffer__WEBPACK_IMPORTED_MODULE_4__.RenderBuffer(); renderBuffer.create(desc.width, desc.height, desc.colorFormats[i], { isMSAA: true, sampleCountMSAA: desc.sampleCountMSAA, }); frameBuffer.setColorAttachmentAt(i, renderBuffer); } const renderBuffer = new _textures_RenderBuffer__WEBPACK_IMPORTED_MODULE_4__.RenderBuffer(); renderBuffer.create(desc.width, desc.height, desc.depthBufferFormat, { isMSAA: true, sampleCountMSAA: desc.sampleCountMSAA, }); frameBuffer.setDepthAttachment(renderBuffer); return frameBuffer; } function createFrameBufferTextureArray(desc) { const frameBuffer = new _renderer_FrameBuffer__WEBPACK_IMPORTED_MODULE_0__.FrameBuffer(); frameBuffer.create(desc.width, desc.height); const renderTargetTexture = new _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_1__.RenderTargetTexture(); renderTargetTexture.createTextureArray({ width: desc.width, height: desc.height, level: desc.level, internalFormat: desc.internalFormat, format: desc.format, type: desc.type, arrayLength: desc.arrayLength, }); frameBuffer.setColorAttachmentAt(0, renderTargetTexture); const renderTargetDepthStencilTexture = new _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_1__.RenderTargetTexture(); renderTargetDepthStencilTexture.createTextureArray({ width: desc.width, height: desc.height, level: desc.level, internalFormat: _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__.TextureFormat.Depth32FStencil8, format: _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.DepthStencil, type: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float, arrayLength: desc.arrayLength, }); frameBuffer.setDepthStencilAttachment(renderTargetDepthStencilTexture); return frameBuffer; } function createFrameBufferCubeMap(desc) { const frameBuffer = new _renderer_FrameBuffer__WEBPACK_IMPORTED_MODULE_0__.FrameBuffer(); frameBuffer.create(desc.width, desc.height); const renderTargetTexture = new _textures__WEBPACK_IMPORTED_MODULE_6__.RenderTargetTextureCube(); renderTargetTexture.create({ width: desc.width, height: desc.height, mipLevelCount: desc.mipLevelCount, format: desc.textureFormat, }); frameBuffer.setColorAttachmentCubeAt(0, 0, 0, renderTargetTexture); return [frameBuffer, renderTargetTexture]; } function createDepthBuffer(width, height, { level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__.TextureFormat.Depth32F }) { const frameBuffer = new _renderer_FrameBuffer__WEBPACK_IMPORTED_MODULE_0__.FrameBuffer(); frameBuffer.create(width, height); const depthTexture = new _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_1__.RenderTargetTexture(); depthTexture.create({ width, height, mipLevelCount: 1, format: internalFormat, }); frameBuffer.setDepthAttachment(depthTexture); return frameBuffer; } const RenderableHelper = Object.freeze({ createFrameBuffer, createFrameBufferMSAA, createFrameBufferTextureArray, createFrameBufferCubeMap, createDepthBuffer, }); /***/ }), /***/ "./src/foundation/helpers/index.ts": /*!*****************************************!*\ !*** ./src/foundation/helpers/index.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ExpressionHelper: () => (/* reexport safe */ _ExpressionHelper__WEBPACK_IMPORTED_MODULE_1__.ExpressionHelper), /* harmony export */ MaterialHelper: () => (/* reexport safe */ _MaterialHelper__WEBPACK_IMPORTED_MODULE_2__.MaterialHelper), /* harmony export */ MeshHelper: () => (/* reexport safe */ _MeshHelper__WEBPACK_IMPORTED_MODULE_3__.MeshHelper), /* harmony export */ RenderPassHelper: () => (/* reexport safe */ _RenderPassHelper__WEBPACK_IMPORTED_MODULE_5__.RenderPassHelper), /* harmony export */ RenderableHelper: () => (/* reexport safe */ _RenderableHelper__WEBPACK_IMPORTED_MODULE_4__.RenderableHelper), /* harmony export */ createLightWithCameraEntity: () => (/* reexport safe */ _EntityHelper__WEBPACK_IMPORTED_MODULE_0__.createLightWithCameraEntity) /* harmony export */ }); /* harmony import */ var _EntityHelper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EntityHelper */ "./src/foundation/helpers/EntityHelper.ts"); /* harmony import */ var _ExpressionHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ExpressionHelper */ "./src/foundation/helpers/ExpressionHelper.ts"); /* harmony import */ var _MaterialHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _MeshHelper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MeshHelper */ "./src/foundation/helpers/MeshHelper.ts"); /* harmony import */ var _RenderableHelper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RenderableHelper */ "./src/foundation/helpers/RenderableHelper.ts"); /* harmony import */ var _RenderPassHelper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RenderPassHelper */ "./src/foundation/helpers/RenderPassHelper.ts"); /***/ }), /***/ "./src/foundation/importer/AnimationAssigner.ts": /*!******************************************************!*\ !*** ./src/foundation/importer/AnimationAssigner.ts ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationAssigner: () => (/* binding */ AnimationAssigner) /* harmony export */ }); /* harmony import */ var _ModelConverter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ModelConverter */ "./src/foundation/importer/ModelConverter.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/AnimationInterpolation */ "./src/foundation/definitions/AnimationInterpolation.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components */ "./src/foundation/components/index.ts"); /* harmony import */ var _components_Skeletal_AnimationRetarget_GlobalRetargetReverse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/Skeletal/AnimationRetarget/GlobalRetargetReverse */ "./src/foundation/components/Skeletal/AnimationRetarget/GlobalRetargetReverse.ts"); /* harmony import */ var _components_AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/AnimationState/AnimationStateComponent */ "./src/foundation/components/AnimationState/AnimationStateComponent.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class AnimationAssigner { /** * Assign Animation Function * * @param rootEntity - The root entity of the model which you want to assign animation. * @param gltfModel - The glTF model that has animation data. * @param vrmModel - The corresponding VRM model to the glTF model. * @param isSameSkeleton * @param retargetMode - Retarget mode. 'none' | 'global' | 'global2' | 'absolute' * @param srcRootEntityForRetarget * @returns */ assignAnimation(rootEntity, gltfModel, vrmModel, isSameSkeleton, retargetMode) { this.__resetAnimationAndPose(rootEntity); this.__setupAnimationForSameSkeleton(rootEntity, gltfModel, vrmModel, isSameSkeleton, retargetMode); return rootEntity; } assignAnimationWithVrma(rootEntity, vrmaModel, postfixToTrackName) { this.__resetAnimationAndPose(rootEntity, postfixToTrackName); let trackNames = new Set(); const setRetarget = (vrma) => { if (vrma.animations == null || vrma.animations.length === 0) { return; } _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_components_AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_7__.AnimationStateComponent, rootEntity); for (const animation of vrma.animations) { for (const sampler of animation.samplers) { _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter._readBinaryFromAccessorAndSetItToAccessorExtras(sampler.inputObject); _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter._readBinaryFromAccessorAndSetItToAccessorExtras(sampler.outputObject); } } for (const animation of vrma.animations) { for (const channel of animation.channels) { // find the corresponding joint entity // const node = gltfModel.nodes[channel.target!.node!]; const rnEntity = this.__getCorrespondingEntityWithVrma(rootEntity, vrma, channel.target.node); if (rnEntity) { const newRnEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_2__.AnimationComponent, rnEntity); const animationComponent = newRnEntity.getAnimation(); const gltfEntity = vrma.extras.rnEntities[channel.target.node]; const humanBones = vrma.extensions.VRMC_vrm_animation.humanoidBoneNameMap; const humanoidBoneName = humanBones.get(channel.target.node); gltfEntity.tryToSetUniqueName(humanoidBoneName, true); let retarget; if (rootEntity.tryToGetVrm()._version === '0.x') { retarget = new _components_Skeletal_AnimationRetarget_GlobalRetargetReverse__WEBPACK_IMPORTED_MODULE_6__.GlobalRetargetReverse(gltfEntity); } else if (rootEntity.tryToGetVrm()._version === '1.0') { retarget = new _components__WEBPACK_IMPORTED_MODULE_5__.GlobalRetarget(gltfEntity); } const names = animationComponent._setRetarget(retarget, postfixToTrackName); names.forEach((name) => { trackNames.add(name); }); } } } }; // Set retarget setRetarget(vrmaModel); return Array.from(trackNames); } constructor() { } __resetAnimationAndPose(rootEntity, postfixToTrackName) { function resetAnimationAndPose(entity, postfixToTrackName) { const animationComponent = entity.tryToGetAnimation(); if (animationComponent != null) { if (postfixToTrackName != null) { animationComponent.resetAnimationTrackByPostfix(postfixToTrackName); } else { animationComponent.resetAnimationTracks(); } } entity.getTransform()._restoreTransformFromRest(); for (const child of entity.children) { resetAnimationAndPose(child.entity, postfixToTrackName); } } resetAnimationAndPose(rootEntity, postfixToTrackName); } /** * The static method to get singleton instance of this class. * @return The singleton instance of ModelConverter class */ static getInstance() { if (!this.__instance) { this.__instance = new AnimationAssigner(); } return this.__instance; } __getCorrespondingEntity(rootEntity, gltfModel, vrmModel, nodeIndex, nodeName, isSameSkeleton) { if (isSameSkeleton) { // isSameSkeleton is true, so we find joints from joints name. const rnEntities = rootEntity.getTagValue('rnEntitiesByNames'); const node = gltfModel.nodes[nodeIndex]; const rnEntity = rnEntities.get(node.name); return rnEntity; } else { // isSameSkeleton is false, so we find joints from humanoid bone mapping data if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(vrmModel.extensions.VRM)) { // VRM0.x const humanBones = vrmModel.extensions.VRM.humanoid.humanBones; let humanoidBoneName; const srcMapNodeIdName = new Map(); const srcMapNodeNameName = new Map(); for (const bone of humanBones) { srcMapNodeIdName.set(bone.node, bone.bone); srcMapNodeNameName.set(bone.name, bone.bone); } if (nodeName != null) { humanoidBoneName = srcMapNodeNameName.get(nodeName); if (humanoidBoneName == null) { humanoidBoneName = srcMapNodeIdName.get(nodeIndex); } } const dstMapNameNodeId = rootEntity.getTagValue('humanoid_map_name_nodeId'); const dstBoneNodeId = dstMapNameNodeId.get(humanoidBoneName); if (dstBoneNodeId != null) { const rnEntities = rootEntity.getTagValue('rnEntities'); return rnEntities[dstBoneNodeId]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_8__.Logger.info(`humanoidBoneName: ${humanoidBoneName}, nodeIndex: ${nodeIndex}, nodeName: ${nodeName}`); return void 0; } } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(vrmModel.extensions.VRMC_vrm)) { // VRM1.0 const humanBones = vrmModel.extensions.VRMC_vrm.humanoid.humanBones; let humanoidBoneName; const srcMapNodeIdName = new Map(); for (const boneName in humanBones) { const bone = humanBones[boneName]; srcMapNodeIdName.set(bone.node, boneName); } if (nodeName != null) { humanoidBoneName = srcMapNodeIdName.get(nodeIndex); } const dstMapNameNodeId = rootEntity.getTagValue('humanoid_map_name_nodeId'); const dstBoneNodeId = dstMapNameNodeId.get(humanoidBoneName); if (dstBoneNodeId != null) { const rnEntities = rootEntity.getTagValue('rnEntities'); return rnEntities[dstBoneNodeId]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_8__.Logger.info(`humanoidBoneName: ${humanoidBoneName}, nodeIndex: ${nodeIndex}, nodeName: ${nodeName}`); return void 0; } } return void 0; } } __getCorrespondingEntityWithVrma(rootEntity, gltfModel, nodeIndex) { // VRM1.0 const humanBones = gltfModel.extensions.VRMC_vrm_animation.humanoidBoneNameMap; const humanoidBoneName = humanBones.get(nodeIndex); const dstMapNameNodeId = rootEntity.getTagValue('humanoid_map_name_nodeId'); const dstBoneNodeId = dstMapNameNodeId.get(humanoidBoneName); if (dstBoneNodeId != null) { const rnEntities = rootEntity.getTagValue('rnEntities'); const rnEntity = rnEntities[dstBoneNodeId]; // if (humanoidBoneName === 'hips') { // rnEntity.parent!.scale = Vector3.fromCopy3(100, 100, 100); // } return rnEntity; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_8__.Logger.info(`humanoidBoneName: ${humanoidBoneName}, nodeIndex: ${nodeIndex}`); return void 0; } } __isHips(rootEntity, vrmModel, nodeIndex) { const srcMapNodeIdName = new Map(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(vrmModel.extensions.VRM)) { const humanBones = vrmModel.extensions.VRM.humanoid.humanBones; for (const bone of humanBones) { srcMapNodeIdName.set(bone.node, bone.bone); } } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(vrmModel.extensions.VRMC_vrm)) { const humanBones = vrmModel.extensions.VRMC_vrm.humanoid.humanBones; for (const boneName in humanBones) { const bone = humanBones[boneName]; srcMapNodeIdName.set(bone.node, boneName); } } const dstMapNameNodeId = rootEntity.getTagValue('humanoid_map_name_nodeId'); const humanoidBoneName = srcMapNodeIdName.get(nodeIndex); if (humanoidBoneName === 'hips') { return true; } else { return false; } } __setupAnimationForSameSkeleton(rootEntity, gltfModel, vrmModel, isSameSkeleton, retargetMode) { var _a, _b, _c, _d; if (gltfModel.animations == null || gltfModel.animations.length === 0) { return; } _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_components_AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_7__.AnimationStateComponent, rootEntity); for (const animation of gltfModel.animations) { for (const sampler of animation.samplers) { _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter._readBinaryFromAccessorAndSetItToAccessorExtras(sampler.inputObject); _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter._readBinaryFromAccessorAndSetItToAccessorExtras(sampler.outputObject); } } for (const animation of gltfModel.animations) { for (const channel of animation.channels) { // get animation data const animInputArray = (_b = (_a = channel.samplerObject) === null || _a === void 0 ? void 0 : _a.inputObject) === null || _b === void 0 ? void 0 : _b.extras.typedDataArray; const animOutputArray = (_d = (_c = channel.samplerObject) === null || _c === void 0 ? void 0 : _c.outputObject) === null || _d === void 0 ? void 0 : _d.extras.typedDataArray; const interpolation = channel.samplerObject.interpolation != null ? channel.samplerObject.interpolation : 'LINEAR'; // find the corresponding joint entity const node = gltfModel.nodes[channel.target.node]; const rnEntity = this.__getCorrespondingEntity(rootEntity, gltfModel, vrmModel, channel.target.node, node.name, isSameSkeleton); if (rnEntity) { const newRnEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_1__.EntityRepository.addComponentToEntity(_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_2__.AnimationComponent, rnEntity); const animationComponent = newRnEntity.getAnimation(); if (retargetMode === 'none') { // apply animation data to the target joint entity let animationAttributeType = 'translate'; if (channel.target.path === 'translation') { animationAttributeType = 'translate'; } else if (channel.target.path === 'rotation') { animationAttributeType = 'quaternion'; } else { animationAttributeType = channel.target.path; } if (animationAttributeType === 'quaternion') { animationComponent.setAnimation(_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(animation.name) ? animation.name : 'Untitled', animationAttributeType, animInputArray, animOutputArray, 4, // Quaternion _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_3__.AnimationInterpolation.fromString(interpolation)); } else if (animationAttributeType === 'translate' && this.__isHips(rootEntity, vrmModel, channel.target.node)) { animationComponent.setAnimation(_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(animation.name) ? animation.name : 'Untitled', animationAttributeType, animInputArray, animOutputArray, 3, // translate _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_3__.AnimationInterpolation.fromString(interpolation)); } } else { const gltfEntity = gltfModel.extras.rnEntities[channel.target.node]; let retarget; if (retargetMode === 'global') { retarget = new _components__WEBPACK_IMPORTED_MODULE_5__.GlobalRetarget(gltfEntity); } else if (retargetMode === 'absolute') { retarget = new _components__WEBPACK_IMPORTED_MODULE_5__.AbsoluteAnimation(gltfEntity); } else { throw new Error('unknown retarget mode'); } animationComponent._setRetarget(retarget); } } } } } } /***/ }), /***/ "./src/foundation/importer/DrcPointCloudImporter.ts": /*!**********************************************************!*\ !*** ./src/foundation/importer/DrcPointCloudImporter.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DrcPointCloudImporter: () => (/* binding */ DrcPointCloudImporter) /* harmony export */ }); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers/MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _misc_RnPromise__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/RnPromise */ "./src/foundation/misc/RnPromise.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * The draco Importer class. */ class DrcPointCloudImporter { constructor() { } /** * Import draco file of point cloud type * WEIGHTS_0 and JOINTS_0 attribute and all the mesh type and is not support yet. * @param uri - uri of drc file * @param options - options for loading process * @returns a glTF2 based JSON pre-processed */ async importPointCloud(uri, options) { const basePath = uri.substring(0, uri.lastIndexOf('/')) + '/'; // location of model file as basePath const defaultOptions = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createDefaultGltfOptions(); if (options && options.files) { for (const fileName in options.files) { const fileExtension = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.getExtension(fileName); if (fileExtension === 'drc') { const rnm2 = await this.__decodeDraco(options.files[fileName], defaultOptions, basePath, options); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(rnm2); } } } const r_arrayBuffer = await _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.fetchArrayBuffer(uri); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_9__.isErr)(r_arrayBuffer)) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'fetchArrayBuffer failed', error: r_arrayBuffer, }); } const rnm2 = await this.__decodeDraco(r_arrayBuffer.get(), defaultOptions, basePath, options); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(rnm2); } /** * Import the specified array buffer of draco file where the type must be point cloud. * WEIGHTS_0 and JOINTS_0 attribute and all the mesh type and is not support yet. * @param uri - uri of drc file * @param arrayBuffer - fetched array buffer of drc file * @param options - options for loading process * @returns a glTF2 based JSON pre-processed */ importArrayBuffer(uri, arrayBuffer, options) { const basePath = uri.substring(0, uri.lastIndexOf('/')) + '/'; // location of model file as basePath const defaultOptions = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createDefaultGltfOptions(); return this.__decodeDraco(arrayBuffer, defaultOptions, basePath, options).catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('__loadFromArrayBuffer error: ' + err); }); } async __loadFromArrayBuffer(arrayBuffer, defaultOptions, basePath, options) { const dataView = new DataView(arrayBuffer, 0, 20); const isLittleEndian = true; // Magic field const magic = dataView.getUint32(0, isLittleEndian); let result; // 0x46546C67 is 'glTF' in ASCII codes. if (magic !== 0x46546c67) { //const json = await response.json(); const gotText = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.arrayBufferToString(arrayBuffer); const json = JSON.parse(gotText); result = await this._loadAsTextJson(json, options, defaultOptions, basePath).catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('this.__loadAsTextJson error: ' + err); }); } else { result = await this._loadAsBinaryJson(dataView, isLittleEndian, arrayBuffer, options, defaultOptions, basePath).catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('this.__loadAsBinaryJson error: ' + err); }); } return result; } _getOptions(defaultOptions, json, options) { if (json.asset && json.asset.extras && json.asset.extras.rnLoaderOptions) { for (const optionName in json.asset.extras.rnLoaderOptions) { defaultOptions[optionName] = json.asset.extras.rnLoaderOptions[optionName]; } } for (const optionName in options) { defaultOptions[optionName] = options[optionName]; } if (options && options.loaderExtensionName && typeof options.loaderExtensionName === 'string') { if (Rn[options.loaderExtensionName] != null) { defaultOptions.loaderExtension = Rn[options.loaderExtensionName].getInstance(); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error(`${options.loaderExtensionName} not found!`); defaultOptions.loaderExtension = void 0; } } return defaultOptions; } async _loadAsBinaryJson(dataView, isLittleEndian, arrayBuffer, options, defaultOptions, basePath) { const lengthOfJSonChunkData = dataView.getUint32(12, isLittleEndian); const chunkType = dataView.getUint32(16, isLittleEndian); // 0x4E4F534A means JSON format (0x4E4F534A is 'JSON' in ASCII codes) if (chunkType !== 0x4e4f534a) { throw new Error('invalid chunkType of chunk0 in this binary glTF file.'); } const uint8ArrayJSonContent = new Uint8Array(arrayBuffer, 20, lengthOfJSonChunkData); const gotText = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.uint8ArrayToString(uint8ArrayJSonContent); const gltfJson = JSON.parse(gotText); options = this._getOptions(defaultOptions, gltfJson, options); const uint8array = new Uint8Array(arrayBuffer, 20 + lengthOfJSonChunkData + 8); if (gltfJson.asset.extras === undefined) { gltfJson.asset.extras = { fileType: 'glTF', version: '2' }; } this._mergeExtendedJson(gltfJson, options.extendedJson); gltfJson.asset.extras.rnLoaderOptions = options; try { await this._loadInner(uint8array, basePath, gltfJson, options); } catch (err) { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('this._loadInner error in _loadAsBinaryJson: ' + err); } return gltfJson; } async _loadAsTextJson(gltfJson, options, defaultOptions, basePath) { if (gltfJson.asset.extras === undefined) { gltfJson.asset.extras = { fileType: 'glTF', version: '2' }; } options = this._getOptions(defaultOptions, gltfJson, options); this._mergeExtendedJson(gltfJson, options.extendedJson); gltfJson.asset.extras.rnLoaderOptions = options; try { await this._loadInner(undefined, basePath, gltfJson, options); } catch (err) { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('this._loadInner error in _loadAsTextJson: ' + err); } return gltfJson; } _loadInner(uint8array, basePath, gltfJson, options) { const promises = []; const resources = { shaders: [], buffers: [], images: [], }; promises.push(this._loadResources(uint8array, basePath, gltfJson, options, resources)); promises.push(new Promise((resolve, reject) => { this._loadJsonContent(gltfJson, options); resolve(); })); return Promise.all(promises); } _loadJsonContent(gltfJson, options) { // Scene this._loadDependenciesOfScenes(gltfJson); // Node this._loadDependenciesOfNodes(gltfJson); // Mesh this._loadDependenciesOfMeshes(gltfJson); // Material this._loadDependenciesOfMaterials(gltfJson); // Texture this._loadDependenciesOfTextures(gltfJson); // Joint this._loadDependenciesOfJoints(gltfJson); // Animation this._loadDependenciesOfAnimations(gltfJson); // Accessor this._loadDependenciesOfAccessors(gltfJson); // BufferView this._loadDependenciesOfBufferViews(gltfJson); if (gltfJson.asset.extras === void 0) { gltfJson.asset.extras = {}; } } _loadDependenciesOfScenes(gltfJson) { for (const scene of gltfJson.scenes) { for (const i in scene.nodes) { scene.nodesObjects[i] = gltfJson.nodes[scene.nodes[i]]; } } } _loadDependenciesOfNodes(gltfJson) { for (const node of gltfJson.nodes) { // Hierarchy if (node.children) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(node.childrenObjects)) { node.childrenObjects = []; } for (const i in node.children) { node.childrenObjects[i] = gltfJson.nodes[node.children[i]]; } } // Mesh if (node.mesh !== void 0 && gltfJson.meshes !== void 0) { node.meshObject = gltfJson.meshes[node.mesh]; } // Skin if (node.skin !== void 0 && gltfJson.skins !== void 0) { node.skinObject = gltfJson.skins[node.skin]; if (node.meshObject.extras === void 0) { node.meshObject.extras = {}; } node.meshObject.extras._skin = node.skin; } // Camera if (node.camera !== void 0 && gltfJson.cameras !== void 0) { node.cameraObject = gltfJson.cameras[node.camera]; } // Lights if (node.extensions !== void 0 && gltfJson.extensions !== void 0 && gltfJson.extensions.KHR_lights_punctual !== void 0) { node.extensions.KHR_lights_punctual.lightIndex = node.extensions.KHR_lights_punctual.light; node.extensions.KHR_lights_punctual.light = gltfJson.extensions.KHR_lights_punctual.lights[node.extensions.KHR_lights_punctual.lightIndex]; } } } _loadDependenciesOfMeshes(gltfJson) { // Mesh for (const mesh of gltfJson.meshes) { for (const primitive of mesh.primitives) { if (primitive.material !== void 0) { primitive.materialObject = gltfJson.materials[primitive.material]; } for (const attributeName in primitive.attributes) { const accessorId = primitive.attributes[attributeName]; const accessor = gltfJson.accessors[accessorId]; accessor.extras = { toGetAsTypedArray: true, attributeName: attributeName, }; primitive.attributesObjects[attributeName] = accessor; } if (primitive.indices != null) { primitive.indicesObject = gltfJson.accessors[primitive.indices]; } if (primitive.targets != null) { primitive.targetsObjects = []; for (const target of primitive.targets) { const attributes = {}; for (const attributeName in target) { const targetShapeTargetAccessorId = target[attributeName]; if (targetShapeTargetAccessorId >= 0) { const accessor = gltfJson.accessors[targetShapeTargetAccessorId]; accessor.extras = { toGetAsTypedArray: true, attributeName: attributeName, }; attributes[attributeName] = accessor; } } primitive.targetsObjects.push(attributes); } } } } } _checkRnGltfLoaderOptionsExist(gltfModel) { if (gltfModel.asset.extras && gltfModel.asset.extras.rnLoaderOptions) { return true; } else { return false; } } _loadDependenciesOfMaterials(gltfJson) { if (!gltfJson.textures) gltfJson.textures = []; // Material if (gltfJson.materials) { for (const material of gltfJson.materials) { if (material.pbrMetallicRoughness) { const baseColorTexture = material.pbrMetallicRoughness.baseColorTexture; if (baseColorTexture !== void 0) { baseColorTexture.texture = gltfJson.textures[baseColorTexture.index]; } const metallicRoughnessTexture = material.pbrMetallicRoughness.metallicRoughnessTexture; if (metallicRoughnessTexture !== void 0) { metallicRoughnessTexture.texture = gltfJson.textures[metallicRoughnessTexture.index]; } } const normalTexture = material.normalTexture; if (normalTexture !== void 0) { normalTexture.texture = gltfJson.textures[normalTexture.index]; } const occlusionTexture = material.occlusionTexture; if (occlusionTexture !== void 0) { occlusionTexture.texture = gltfJson.textures[occlusionTexture.index]; } const emissiveTexture = material.emissiveTexture; if (emissiveTexture !== void 0) { emissiveTexture.texture = gltfJson.textures[emissiveTexture.index]; } if (this._checkRnGltfLoaderOptionsExist(gltfJson) && gltfJson.asset.extras.rnLoaderOptions.loaderExtension && gltfJson.asset.extras.rnLoaderOptions.loaderExtension.setTextures) { gltfJson.asset.extras.rnLoaderOptions.loaderExtension.setTextures(gltfJson, material); } } } } _loadDependenciesOfTextures(gltfJson) { // Texture if (gltfJson.textures) { for (const texture of gltfJson.textures) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_8__.ifDefinedThen)((v) => { texture.samplerObject = gltfJson.samplers[v]; }, texture.sampler); if (texture.source !== void 0) { texture.image = gltfJson.images[texture.source]; } } } } _loadDependenciesOfJoints(gltfJson) { if (gltfJson.skins) { for (const skin of gltfJson.skins) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(skin.skeleton)) { skin.skeletonObject = gltfJson.nodes[skin.skeleton]; (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_8__.ifDefinedThen)((v) => (skin.inverseBindMatricesObject = gltfJson.accessors[v]), skin.inverseBindMatrices); (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_8__.ifUndefinedThen)(() => (skin.skeletonObject = gltfJson.nodes[skin.joints[0]]), skin.skeleton); skin.jointsObjects = []; for (const jointIndex of skin.joints) { skin.jointsObjects.push(gltfJson.nodes[jointIndex]); } } } } } _loadDependenciesOfAnimations(gltfJson) { if (gltfJson.animations) { for (const animation of gltfJson.animations) { for (const channel of animation.channels) { channel.samplerObject = animation.samplers[channel.sampler]; channel.target.nodeObject = gltfJson.nodes[channel.target.node]; } for (const channel of animation.channels) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(channel.samplerObject)) { channel.samplerObject.inputObject = gltfJson.accessors[channel.samplerObject.input]; channel.samplerObject.outputObject = gltfJson.accessors[channel.samplerObject.output]; if (channel.samplerObject.outputObject.extras === void 0) { channel.samplerObject.outputObject.extras = {}; } if (channel.target.path === 'rotation') { channel.samplerObject.outputObject.extras.quaternionIfVec4 = true; } if (channel.target.path === 'weights') { const weightsArrayLength = channel.samplerObject.outputObject.count / channel.samplerObject.inputObject.count; channel.samplerObject.outputObject.extras.weightsArrayLength = weightsArrayLength; } } } } } } _loadDependenciesOfAccessors(gltfJson) { // Accessor for (const accessor of gltfJson.accessors) { if (accessor.bufferView == null) { accessor.bufferView = 0; } accessor.bufferViewObject = gltfJson.bufferViews[accessor.bufferView]; if (accessor.sparse != null) { const sparse = accessor.sparse; sparse.indices.bufferViewObject = gltfJson.bufferViews[sparse.indices.bufferView]; sparse.values.bufferViewObject = gltfJson.bufferViews[sparse.values.bufferView]; } } } _loadDependenciesOfBufferViews(gltfJson) { // BufferView for (const bufferView of gltfJson.bufferViews) { if (bufferView.buffer !== void 0) { bufferView.bufferObject = gltfJson.buffers[bufferView.buffer]; } } } _mergeExtendedJson(gltfJson, extendedData) { let extendedJson = null; if (extendedData instanceof ArrayBuffer) { const extendedJsonStr = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.arrayBufferToString(extendedData); extendedJson = JSON.parse(extendedJsonStr); } else if (typeof extendedData === 'string') { extendedJson = JSON.parse(extendedData); } else if (typeof extendedData === 'object') { extendedJson = extendedData; } Object.assign(gltfJson, extendedJson); } _loadResources(uint8Array, basePath, gltfJson, options, resources) { const promisesToLoadResources = []; // Shaders Async load // for (let _i in gltfJson.shaders) { // const i = _i as any as number; // resources.shaders[i] = {}; // let shaderJson = gltfJson.shaders[i]; // let shaderType = shaderJson.type; // if (typeof shaderJson.extensions !== 'undefined' && typeof shaderJson.extensions.KHR_binary_glTF !== 'undefined') { // resources.shaders[i].shaderText = this._accessBinaryAsShader(shaderJson.extensions.KHR_binary_glTF.bufferView, gltfJson, arrayBufferBinary); // resources.shaders[i].shaderType = shaderType; // continue; // } // let shaderUri = shaderJson.uri; // if (options.files) { // const splitted = shaderUri.split('/'); // const filename = splitted[splitted.length - 1]; // if (options.files[filename]) { // const arrayBuffer = options.files[filename]; // resources.shaders[i].shaderText = DataUtil.arrayBufferToString(arrayBuffer); // resources.shaders[i].shaderType = shaderType; // continue; // } // } // if (shaderUri.match(/^data:/)) { // promisesToLoadResources.push( // new Promise((resolve, rejected) => { // let arrayBuffer = DataUtil.dataUriToArrayBuffer(shaderUri); // resources.shaders[i].shaderText = DataUtil.arrayBufferToString(arrayBuffer); // resources.shaders[i].shaderType = shaderType; // resolve(); // }) // ); // } else { // shaderUri = basePath + shaderUri; // promisesToLoadResources.push( // DataUtil.loadResourceAsync(shaderUri, false, // (resolve:Function, response:any)=>{ // resources.shaders[i].shaderText = response; // resources.shaders[i].shaderType = shaderType; // resolve(gltfJson); // }, // (reject:Function, error:any)=>{ // } // ) // ); // } // } // Buffers Async load let rnpArrayBuffer; for (const i in gltfJson.buffers) { const bufferInfo = gltfJson.buffers[i]; let splitted; let filename; if (bufferInfo.uri) { splitted = bufferInfo.uri.split('/'); filename = splitted[splitted.length - 1]; } if (typeof bufferInfo.uri === 'undefined') { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_6__.RnPromise((resolve, rejected) => { resources.buffers[i] = uint8Array; bufferInfo.buffer = uint8Array; resolve(uint8Array); }); } else if (bufferInfo.uri.match(/^data:application\/(.*);base64,/)) { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_6__.RnPromise((resolve, rejected) => { const arrayBuffer = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.dataUriToArrayBuffer(bufferInfo.uri); resources.buffers[i] = new Uint8Array(arrayBuffer); bufferInfo.buffer = new Uint8Array(arrayBuffer); resolve(arrayBuffer); }); } else if (options.files && options.files[filename]) { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_6__.RnPromise((resolve, rejected) => { const arrayBuffer = options.files[filename]; resources.buffers[i] = new Uint8Array(arrayBuffer); bufferInfo.buffer = new Uint8Array(arrayBuffer); resolve(arrayBuffer); }); } else { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_6__.RnPromise(_misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.loadResourceAsync(basePath + bufferInfo.uri, true, (resolve, response) => { resources.buffers[i] = new Uint8Array(response); bufferInfo.buffer = new Uint8Array(response); resolve(response); }, (reject, error) => { })); } bufferInfo.bufferPromise = rnpArrayBuffer; promisesToLoadResources.push(rnpArrayBuffer); } // Textures Async load for (const _i in gltfJson.images) { const i = _i; const imageJson = gltfJson.images[i]; //let imageJson = gltfJson.images[textureJson.source]; //let samplerJson = gltfJson.samplers[textureJson.sampler]; let imageUri; if (typeof imageJson.uri === 'undefined') { let arrayBuffer = uint8Array; if (uint8Array == null) { const bufferView = gltfJson.bufferViews[imageJson.bufferView]; arrayBuffer = bufferView.bufferObject.buffer; } const imageUint8Array = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createUint8ArrayFromBufferViewInfo(gltfJson, imageJson.bufferView, uint8Array); imageUri = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createBlobImageUriFromUint8Array(imageUint8Array, imageJson.mimeType); } else { const imageFileStr = imageJson.uri; const splitted = imageFileStr.split('/'); const filename = splitted[splitted.length - 1]; if (options.files && options.files[filename]) { const arrayBuffer = options.files[filename]; imageUri = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createBlobImageUriFromUint8Array(new Uint8Array(arrayBuffer), imageJson.mimeType); } else if (imageFileStr.match(/^data:/)) { imageUri = imageFileStr; } else { imageUri = basePath + imageFileStr; } } // if (options.extensionLoader && options.extensionLoader.setUVTransformToTexture) { // options.extensionLoader.setUVTransformToTexture(texture, samplerJson); // } const promise = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createImageFromUri(imageUri, imageJson.mimeType).then((image) => { image.crossOrigin = 'Anonymous'; resources.images[i] = image; imageJson.image = image; }); promisesToLoadResources.push(promise); } return Promise.all(promisesToLoadResources).catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('Promise.all error: ' + err); }); } static getInstance() { if (!this.__instance) { this.__instance = new DrcPointCloudImporter(); } return this.__instance; } __decodeDraco(arrayBuffer, defaultOptions, basePath, options) { return this.__decodeBuffer(arrayBuffer).then((json) => { const gotText = JSON.stringify(json); const gltfJson = JSON.parse(gotText); return this._loadAsTextJson(gltfJson, options, defaultOptions, basePath).catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('this.__loadAsTextJson error: ' + err); }); }); } __decodeBuffer(arrayBuffer) { const draco = new DracoDecoderModule(); const decoder = new draco.Decoder(); const dracoGeometry = this.__getGeometryFromDracoBuffer(draco, decoder, arrayBuffer); if (dracoGeometry == null) { throw new Error('invalid dracoGeometry.'); } if (dracoGeometry.geometryType !== draco.POINT_CLOUD) { throw new Error('invalid geometryType of drc file.'); } const posAttId = decoder.GetAttributeId(dracoGeometry, draco.POSITION); if (posAttId === -1) { draco.destroy(decoder); draco.destroy(dracoGeometry); throw new Error('Draco: No position attribute found.'); } const attributeNames = ['POSITION', 'NORMAL', 'COLOR', 'TEX_COORD', 'GENERIC']; const numPoints = dracoGeometry.num_points(); const attributeDataAll = []; const attributeComponents = []; let bufferLength = 0; for (let i = 0; i < attributeNames.length; i++) { const attId = decoder.GetAttributeId(dracoGeometry, draco[attributeNames[i]]); if (attId === -1) { attributeNames.splice(i, 1); i--; continue; } const attribute = decoder.GetAttribute(dracoGeometry, attId); const attributeData = new draco.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(dracoGeometry, attribute, attributeData); attributeDataAll[i] = attributeData; const numComponent = attribute.num_components(); attributeComponents[i] = numComponent; if (attributeNames[i] === 'COLOR') { bufferLength += numPoints * 4; } else { bufferLength += numPoints * numComponent; } } const buffer = new Float32Array(bufferLength); for (let i = 0, currentBufferIndex = 0; i < attributeNames.length; i++) { if (attributeNames[i] === 'COLOR' && attributeComponents[i] === 3) { for (let j = 0; j < numPoints; currentBufferIndex += 4, j += 3) { buffer[currentBufferIndex] = attributeDataAll[i].GetValue(j); buffer[currentBufferIndex + 1] = attributeDataAll[i].GetValue(j + 1); buffer[currentBufferIndex + 2] = attributeDataAll[i].GetValue(j + 2); buffer[currentBufferIndex + 3] = 1.0; // alpha value } } else if (attributeNames[i] === 'TEX_COORD') { for (let j = 0; j < numPoints; currentBufferIndex += 2, j++) { buffer[currentBufferIndex] = attributeDataAll[i].GetValue(2 * j); buffer[currentBufferIndex + 1] = 1.0 - attributeDataAll[i].GetValue(2 * j + 1); } } else { for (let j = 0; j < numPoints * attributeComponents[i]; currentBufferIndex++, j++) { buffer[currentBufferIndex] = attributeDataAll[i].GetValue(j); } } draco.destroy(attributeDataAll[i]); } draco.destroy(decoder); draco.destroy(dracoGeometry); return this.__decodedBufferToJSON(buffer, numPoints, attributeNames, attributeComponents); } async __decodedBufferToJSON(buffer, numPoints, attributeNames, attributeComponents) { const json = { asset: { version: '2.0', }, extensionsUsed: ['KHR_materials_unlit'], extensionsRequired: ['KHR_materials_unlit'], nodes: [ { name: 'Node', mesh: 0, }, ], scenes: [ { nodes: [0], }, ], materials: [ { name: 'point-cloud_material', pbrMetallicRoughness: { baseColorFactor: [1.0, 1.0, 1.0, 1.0], }, extensions: { KHR_materials_unlit: {}, }, }, ], }; await this.__setBuffersToJSON(buffer, json); this.__setAccessorsAndBufferViewsToJSON(numPoints, attributeNames, attributeComponents, json); this.__setMeshesToJSON(attributeNames, json); return new Promise((resolve, reject) => { resolve(json); }); } __setBuffersToJSON(buffer, json) { return this.__convertBufferToURI(buffer.buffer) .then((uri) => { json['buffers'] = [ { name: 'input', byteLength: buffer.byteLength, uri: uri, }, ]; }) .catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error('this.__convertBufferToURI error: ' + err); }); } __convertBufferToURI(arrayBuffer) { return new Promise((resolve, reject) => { const blob = new Blob([arrayBuffer], { type: 'application/octet-stream' }); const fr = new FileReader(); fr.onload = () => { resolve(fr.result); }; fr.onerror = () => { reject(fr.error); }; fr.readAsDataURL(blob); }); } __setAccessorsAndBufferViewsToJSON(numPoints, attributeNames, attributeComponents, json) { const accessors = []; const bufferViews = []; let byteOffsetOfBufferView = 0; for (let i = 0, indexOfBufferView = 0; i < attributeNames.length; indexOfBufferView++) { const numOfComponents = attributeComponents[i]; let type; if (numOfComponents === 1) { type = 'SCALAR'; } else { type = 'VEC' + numOfComponents; } let byteOffsetOfAccessor = 0; const attributeName = attributeNames[i]; while (i < attributeNames.length) { accessors.push({ name: 'point-cloud_' + attributeName + '_' + i, componentType: 5126, // gl.FLOAT count: numPoints, type: type, bufferView: indexOfBufferView, byteOffset: byteOffsetOfAccessor, }); if (attributeNames[i] === 'COLOR') { byteOffsetOfAccessor += numPoints * 4 * 4; } else { byteOffsetOfAccessor += numPoints * numOfComponents * 4; } i++; if (attributeName != attributeNames[i]) { break; } } bufferViews[indexOfBufferView] = { name: 'bufferView_' + attributeName, buffer: 0, byteLength: byteOffsetOfAccessor, byteOffset: byteOffsetOfBufferView, byteStride: numOfComponents * 4, target: 34962, // gl.ARRAY_BUFFER }; byteOffsetOfBufferView += byteOffsetOfAccessor; } json['accessors'] = accessors; json['bufferViews'] = bufferViews; } __setMeshesToJSON(attributeNames, json) { const attributes = {}; for (let i = 0; i < attributeNames.length; i++) { if (attributeNames[i] === 'TEX_COORD') { attributes['TEXCOORD_0'] = i; } else if (attributeNames[i] === 'GENERIC') { attributes['TANGENT'] = i; } else { attributes[attributeNames[i]] = i; } } const mesh = { name: 'Node-Mesh', primitives: [ { mode: 0, material: 0, attributes: attributes, }, ], }; json['meshes'] = [mesh]; } /** * Import Draco file of point cloud type. * WEIGHTS_0 and JOINTS_0 attribute and all the mesh type and is not support yet. * @param uri - uri of glTF file * @returns a primitive of Rhodonite object */ async importPointCloudToPrimitive(uri) { const r_arrayBuffer = await _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.fetchArrayBuffer(uri); return this.__decodeDracoToPrimitive(r_arrayBuffer.unwrapForce()); } // tangent is not available __decodeDracoToPrimitive(arrayBuffer) { const draco = new DracoDecoderModule(); const decoder = new draco.Decoder(); const dracoGeometry = this.__getGeometryFromDracoBuffer(draco, decoder, arrayBuffer); if (dracoGeometry == null) { throw new Error('invalid dracoGeometry.'); } if (dracoGeometry.geometryType !== draco.POINT_CLOUD) { throw new Error('invalid geometryType of drc file.'); } const attributeCompositionTypes = []; const attributeSemantics = []; const attributes = []; this.__getPositions(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes); this.__getColors(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes); this.__getNormals(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes); this.__getTextureCoords(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes); const primitive = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_1__.Primitive.createPrimitive({ attributeSemantics: attributeSemantics, attributes: attributes, material: _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_2__.MaterialHelper.createClassicUberMaterial({ isSkinning: false, isLighting: true, }), primitiveMode: _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_4__.PrimitiveMode.Points, }); draco.destroy(decoder); draco.destroy(dracoGeometry); return primitive; } __getGeometryFromDracoBuffer(draco, decoder, arrayBuffer) { const buffer = new draco.DecoderBuffer(); buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength); const geometryType = decoder.GetEncodedGeometryType(buffer); let dracoGeometry; let decodingStatus; if (geometryType === draco.TRIANGULAR_MESH) { dracoGeometry = new draco.Mesh(); decodingStatus = decoder.DecodeBufferToMesh(buffer, dracoGeometry); } else if (geometryType === draco.POINT_CLOUD) { dracoGeometry = new draco.PointCloud(); decodingStatus = decoder.DecodeBufferToPointCloud(buffer, dracoGeometry); } else { const errorMsg = 'Unknown geometry type.'; _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error(errorMsg); } dracoGeometry.geometryType = geometryType; // store if (!decodingStatus.ok() || dracoGeometry.ptr == 0) { let errorMsg = 'Decoding failed: '; errorMsg += decodingStatus.error_msg(); _misc_Logger__WEBPACK_IMPORTED_MODULE_10__.Logger.error(errorMsg); draco.destroy(decoder); draco.destroy(dracoGeometry); return void 0; } draco.destroy(buffer); return dracoGeometry; } __getPositions(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes) { const posAttId = decoder.GetAttributeId(dracoGeometry, draco.POSITION); if (posAttId === -1) { draco.destroy(decoder); draco.destroy(dracoGeometry); throw new Error('Draco: No position attribute found.'); } const posAttribute = decoder.GetAttribute(dracoGeometry, posAttId); const posAttributeData = new draco.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(dracoGeometry, posAttribute, posAttributeData); const numPoints = dracoGeometry.num_points(); const numVertices = numPoints * 3; const positions = new Float32Array(numVertices); for (let i = 0; i < numVertices; i += 1) { positions[i] = posAttributeData.GetValue(i); // XYZ XYZ } attributeCompositionTypes.push(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec3); attributeSemantics.push(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Position.XYZ); attributes.push(positions); draco.destroy(posAttributeData); return positions; } __getColors(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes) { // Get color attributes if exists. const colorAttId = decoder.GetAttributeId(dracoGeometry, draco.COLOR); if (colorAttId === -1) { return null; } else { //console.log('Loaded color attribute.'); const colAttribute = decoder.GetAttribute(dracoGeometry, colorAttId); const colAttributeData = new draco.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(dracoGeometry, colAttribute, colAttributeData); const numPoints = dracoGeometry.num_points(); const numComponents = colAttribute.num_components(); const numVertices = numPoints * 4; const colors = new Float32Array(numVertices); for (let i = 0; i < numVertices; i += numComponents) { colors[i] = colAttributeData.GetValue(i); colors[i + 1] = colAttributeData.GetValue(i + 1); colors[i + 2] = colAttributeData.GetValue(i + 2); if (numComponents == 4) { colors[i + 3] = colAttributeData.GetValue(i + 3); } else { colors[i + 3] = 1.0; } } attributeCompositionTypes.push(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec3); attributeSemantics.push(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Color0.XYZ); attributes.push(colors); draco.destroy(colAttributeData); return colors; } } __getNormals(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes) { // Get normal attributes if exists. const normalAttId = decoder.GetAttributeId(dracoGeometry, draco.NORMAL); if (normalAttId === -1) { return null; } else { //console.log('Loaded normal attribute.'); const norAttribute = decoder.GetAttribute(dracoGeometry, normalAttId); const norAttributeData = new draco.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(dracoGeometry, norAttribute, norAttributeData); const numPoints = dracoGeometry.num_points(); const numVertices = numPoints * 3; const normals = new Float32Array(numVertices); for (let i = 0; i < numVertices; i += 1) { normals[i] = norAttributeData.GetValue(i); // XYZ XYZ } attributeCompositionTypes.push(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec3); attributeSemantics.push(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Normal.XYZ); attributes.push(normals); draco.destroy(norAttributeData); return normals; } } __getTextureCoords(draco, decoder, dracoGeometry, attributeCompositionTypes, attributeSemantics, attributes) { // Get texture coordinate attributes if exists. const texCoordAttId = decoder.GetAttributeId(dracoGeometry, draco.TEX_COORD); if (texCoordAttId === -1) { return null; } else { const texCoordAttribute = decoder.GetAttribute(dracoGeometry, texCoordAttId); const texCoordAttributeData = new draco.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(dracoGeometry, texCoordAttribute, texCoordAttributeData); const numPoints = dracoGeometry.num_points(); const numVertices = numPoints * 2; const texCoords = new Float32Array(numVertices); for (let i = 0; i < numVertices; i += 1) { texCoords[i] = texCoordAttributeData.GetValue(i); // XYZ XYZ } attributeCompositionTypes.push(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec2); attributeSemantics.push(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Texcoord0.XY); attributes.push(texCoords); draco.destroy(texCoordAttributeData); return texCoords; } } } /***/ }), /***/ "./src/foundation/importer/FormatDetector.ts": /*!***************************************************!*\ !*** ./src/foundation/importer/FormatDetector.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ detectFormatByArrayBuffers: () => (/* binding */ detectFormatByArrayBuffers), /* harmony export */ detectFormatByUri: () => (/* binding */ detectFormatByUri) /* harmony export */ }); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _foundation_definitions_FileType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../foundation/definitions/FileType */ "./src/foundation/definitions/FileType.ts"); function detectFormatByArrayBuffers(files) { for (const fileName in files) { const fileExtension = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.getExtension(fileName); if (fileExtension === 'gltf') { return _foundation_definitions_FileType__WEBPACK_IMPORTED_MODULE_1__.FileType.Gltf; } else if (fileExtension === 'glb') { return _foundation_definitions_FileType__WEBPACK_IMPORTED_MODULE_1__.FileType.GltfBinary; } else if (fileExtension === 'vrm') { return _foundation_definitions_FileType__WEBPACK_IMPORTED_MODULE_1__.FileType.VRM; } else if (fileExtension === 'drc') { return _foundation_definitions_FileType__WEBPACK_IMPORTED_MODULE_1__.FileType.Draco; } } return _foundation_definitions_FileType__WEBPACK_IMPORTED_MODULE_1__.FileType.Unknown; } function detectFormatByUri(uri) { const split = uri.split('.'); const fileExtension = split[split.length - 1]; if (fileExtension === 'efk') { return 'Effekseer'; } else if (fileExtension === 'drc') { return 'Draco'; } else if (fileExtension === 'vrm') { return 'VRM'; } else if (fileExtension === 'gltf') { return 'glTF'; } return 'Unknown'; // // glTF // return DataUtil.loadResourceAsync(uri, true, // (resolve: Function, response: any) => { // const arrayBuffer = response; // checkVersionOfGltf(arrayBuffer); // console.warn('discard downloaded arrayBuffer'); // }, (rejects: any, status: any) => { // console.log(status); // } // ); } function checkVersionOfGltf(arrayBuffer) { const isLittleEndian = true; const dataView = new DataView(arrayBuffer, 0, 20); // Magic field const magic = dataView.getUint32(0, isLittleEndian); // 0x46546C67 is 'glTF' in ASCII codes. if (magic !== 0x46546c67) { // It must be normal glTF (NOT binary) file... const gotText = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.arrayBufferToString(arrayBuffer); const gltfJson = JSON.parse(gotText); const glTFVer = checkGLTFVersion(gltfJson); return 'glTF' + glTFVer; } else { const glTFVer = dataView.getUint32(4, isLittleEndian); return 'glTF' + glTFVer; } } function checkGLTFVersion(gltfJson) { let glTFVer = 1.0; if (gltfJson.asset && gltfJson.asset.version) { glTFVer = parseFloat(gltfJson.asset.version); } return glTFVer; } /***/ }), /***/ "./src/foundation/importer/Gltf2Importer.ts": /*!**************************************************!*\ !*** ./src/foundation/importer/Gltf2Importer.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Gltf2Importer: () => (/* binding */ Gltf2Importer) /* harmony export */ }); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/RnPromise */ "./src/foundation/misc/RnPromise.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * The glTF2 Importer class. */ class Gltf2Importer { constructor() { } /** * Import glTF2 file * @param uri - uri of glTF file * @param options - options for loading process * @returns a glTF2 based JSON pre-processed */ static async importFromUri(uri, options) { var _a; const r_arrayBuffer = await _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.fetchArrayBuffer(uri); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_4__.isErr)(r_arrayBuffer)) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Err({ message: 'fetchArrayBuffer error', error: undefined, }); } const result = await this._importGltfOrGlbFromArrayBuffers(r_arrayBuffer.get(), (_a = options === null || options === void 0 ? void 0 : options.files) !== null && _a !== void 0 ? _a : {}, options, uri); return result; } static async importFromArrayBuffers(files, options) { for (const fileName in files) { const fileExtension = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.getExtension(fileName); if (fileExtension === 'gltf' || fileExtension === 'glb') { const result = await this._importGltfOrGlbFromArrayBuffers(files[fileName], files, options); return result; } } return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Err({ message: 'no gltf or glb file found', error: undefined, }); } /** * Import glTF2 array buffer. * @param arrayBuffer .gltf/.glb file in ArrayBuffer * @param otherFiles other resource files data in ArrayBuffers * @param options options for loading process (Optional) * @param uri .gltf file's uri (Optional) * @returns a glTF2 based JSON pre-processed */ static async _importGltfOrGlbFromArrayBuffers(arrayBuffer, otherFiles, options, uri) { const dataView = new DataView(arrayBuffer, 0, 20); // Magic field const magic = dataView.getUint32(0, true); // 0x46546C67 is 'glTF' in ASCII codes. if (magic !== 0x46546c67) { //const json = await response.json(); const gotText = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.arrayBufferToString(arrayBuffer); const json = JSON.parse(gotText); try { const gltfJson = await this._importGltf(json, otherFiles, options, uri); return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Ok(gltfJson); } catch (err) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Err({ message: 'this.__importGltf error', error: undefined, }); } } else { try { const gltfJson = await this._importGlb(arrayBuffer, otherFiles, options); return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Ok(gltfJson); } catch (err) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Err({ message: 'this.importGlb error', error: undefined, }); } } } static _getOptions(defaultOptions, json, options) { var _a, _b; if (((_b = (_a = json.asset) === null || _a === void 0 ? void 0 : _a.extras) === null || _b === void 0 ? void 0 : _b.rnLoaderOptions) != null) { for (const optionName in json.asset.extras.rnLoaderOptions) { defaultOptions[optionName] = json.asset.extras .rnLoaderOptions[optionName]; } } for (const optionName in options) { defaultOptions[optionName] = options[optionName]; } if (options && options.loaderExtensionName && typeof options.loaderExtensionName === 'string') { if (Rn[options.loaderExtensionName] != null) { defaultOptions.loaderExtension = Rn[options.loaderExtensionName].getInstance(); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.error(`${options.loaderExtensionName} not found!`); defaultOptions.loaderExtension = void 0; } } return defaultOptions; } static async _importGlb(arrayBuffer, files, options) { const dataView = new DataView(arrayBuffer, 0, 20); const gltfVer = dataView.getUint32(4, true); if (gltfVer !== 2) { throw new Error('invalid version field in this binary glTF file.'); } const lengthOfJSonChunkData = dataView.getUint32(12, true); const chunkType = dataView.getUint32(16, true); // 0x4E4F534A means JSON format (0x4E4F534A is 'JSON' in ASCII codes) if (chunkType !== 0x4e4f534a) { throw new Error('invalid chunkType of chunk0 in this binary glTF file.'); } const uint8ArrayJSonContent = new Uint8Array(arrayBuffer, 20, lengthOfJSonChunkData); const gotText = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.uint8ArrayToString(uint8ArrayJSonContent); const gltfJson = JSON.parse(gotText); const defaultOptions = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createDefaultGltfOptions(); options = this._getOptions(defaultOptions, gltfJson, options); const uint8array = new Uint8Array(arrayBuffer, 20 + lengthOfJSonChunkData + 8); if (gltfJson.asset.extras === undefined) { gltfJson.asset.extras = { fileType: 'glTF', version: '2' }; } this._mergeExtendedJson(gltfJson, options.extendedJson); gltfJson.asset.extras.rnLoaderOptions = options; try { await this._loadInner(gltfJson, files, options, uint8array); } catch (err) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.info('this._loadInner error in _loadAsBinaryJson: ' + err); } return gltfJson; } static async _importGltf(gltfJson, fileArrayBuffers, options, uri, callback) { const basePath = (uri === null || uri === void 0 ? void 0 : uri.substring(0, uri === null || uri === void 0 ? void 0 : uri.lastIndexOf('/'))) + '/'; // location of model file as basePath if (gltfJson.asset.extras === undefined) { gltfJson.asset.extras = { fileType: 'glTF', version: '2' }; } const defaultOptions = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createDefaultGltfOptions(); options = this._getOptions(defaultOptions, gltfJson, options); this._mergeExtendedJson(gltfJson, options.extendedJson); gltfJson.asset.extras.rnLoaderOptions = options; try { await this._loadInner(gltfJson, fileArrayBuffers, options, undefined, basePath, callback); } catch (err) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.error('this._loadInner error in _loadAsTextJson: ' + err); } return gltfJson; } static _loadInner(gltfJson, files, options, uint8arrayOfGlb, basePath, callback) { const promises = []; // Load resources to above resources object. promises.push(this._loadResources(uint8arrayOfGlb, gltfJson, files, options, basePath, callback)); // Parse glTF JSON promises.push(new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { this._loadJsonContent(gltfJson); resolve(); })); return _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise.all(promises); } static _loadJsonContent(gltfJson) { // Scene this._loadDependenciesOfScenes(gltfJson); // Node this._loadDependenciesOfNodes(gltfJson); // Mesh this._loadDependenciesOfMeshes(gltfJson); // Material this._loadDependenciesOfMaterials(gltfJson); // Texture this._loadDependenciesOfTextures(gltfJson); // Joint this._loadDependenciesOfJoints(gltfJson); // Animation this._loadDependenciesOfAnimations(gltfJson); // Accessor this._loadDependenciesOfAccessors(gltfJson); // BufferView this._loadDependenciesOfBufferViews(gltfJson); if (gltfJson.asset.extras === void 0) { gltfJson.asset.extras = {}; } } static _loadDependenciesOfScenes(gltfJson) { for (const scene of gltfJson.scenes) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.undefined(scene.nodesObjects)) { scene.nodesObjects = []; } for (const i of scene.nodes) { scene.nodesObjects[i] = gltfJson.nodes[scene.nodes[i]]; } } } static _loadDependenciesOfNodes(gltfJson) { var _a, _b; for (const node of gltfJson.nodes) { // Hierarchy node.childrenObjects = (_a = node.childrenObjects) !== null && _a !== void 0 ? _a : []; if (node.children) { for (const i of node.children) { node.childrenObjects[i] = gltfJson.nodes[i]; } } // Mesh if (node.mesh !== void 0 && gltfJson.meshes !== void 0) { node.meshObject = gltfJson.meshes[node.mesh]; } // Skin if (node.skin !== void 0 && gltfJson.skins !== void 0) { node.skinObject = gltfJson.skins[node.skin]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(node.skinObject)) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.not.exist((_b = node.meshObject) === null || _b === void 0 ? void 0 : _b.extras)) { node.meshObject.extras = {}; } node.meshObject.extras._skin = node.skin; } } // Camera if (node.camera !== void 0 && gltfJson.cameras !== void 0) { node.cameraObject = gltfJson.cameras[node.camera]; } // Lights if (node.extensions !== void 0 && gltfJson.extensions !== void 0 && gltfJson.extensions.KHR_lights_punctual !== void 0) { node.extensions.KHR_lights_punctual.lightIndex = node.extensions.KHR_lights_punctual.light; node.extensions.KHR_lights_punctual.light = gltfJson.extensions.KHR_lights_punctual.lights[node.extensions.KHR_lights_punctual.lightIndex]; } } } static _loadDependenciesOfMeshes(gltfJson) { var _a; // Mesh if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.not.exist(gltfJson.meshes)) { return; } for (const mesh of gltfJson.meshes) { for (const primitive of mesh.primitives) { if (primitive.material !== void 0) { primitive.materialObject = gltfJson.materials[primitive.material]; } if (((_a = primitive.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_variants) != null) { primitive.materialVariants = []; const mappings = primitive.extensions.KHR_materials_variants.mappings; const variantNames = gltfJson.extensions.KHR_materials_variants.variants; for (const mapping of mappings) { const variants = mapping.variants.map((variantIdx) => { return variantNames[variantIdx].name; }); const materialVariant = { materialObject: gltfJson.materials[mapping.material], material: mapping.material, variants: variants, }; primitive.materialVariants.push(materialVariant); } } primitive.attributesObjects = {}; for (const attributeName in primitive.attributes) { const accessorId = primitive.attributes[attributeName]; const accessor = gltfJson.accessors[accessorId]; accessor.extras = { toGetAsTypedArray: true, attributeName: attributeName, }; primitive.attributesObjects[attributeName] = accessor; } if (primitive.indices != null) { primitive.indicesObject = gltfJson.accessors[primitive.indices]; } if (primitive.targets != null) { primitive.targetsObjects = []; for (const target of primitive.targets) { const attributes = {}; for (const attributeName in target) { const targetShapeTargetAccessorId = target[attributeName]; if (targetShapeTargetAccessorId >= 0) { const accessor = gltfJson.accessors[targetShapeTargetAccessorId]; accessor.extras = { toGetAsTypedArray: true, attributeName: attributeName, }; attributes[attributeName] = accessor; } } primitive.targetsObjects.push(attributes); } } } } } static _checkRnGltfLoaderOptionsExist(gltfModel) { if (gltfModel.asset.extras && gltfModel.asset.extras.rnLoaderOptions) { return true; } else { return false; } } static _loadDependenciesOfMaterials(gltfJson) { if (!gltfJson.textures) gltfJson.textures = []; // Material if (gltfJson.materials) { for (const material of gltfJson.materials) { if (material.pbrMetallicRoughness) { const baseColorTexture = material.pbrMetallicRoughness.baseColorTexture; if (baseColorTexture !== void 0) { baseColorTexture.texture = gltfJson.textures[baseColorTexture.index]; } const metallicRoughnessTexture = material.pbrMetallicRoughness.metallicRoughnessTexture; if (metallicRoughnessTexture !== void 0) { metallicRoughnessTexture.texture = gltfJson.textures[metallicRoughnessTexture.index]; } } const normalTexture = material.normalTexture; if (normalTexture !== void 0) { normalTexture.texture = gltfJson.textures[normalTexture.index]; } const occlusionTexture = material.occlusionTexture; if (occlusionTexture !== void 0) { occlusionTexture.texture = gltfJson.textures[occlusionTexture.index]; } const emissiveTexture = material.emissiveTexture; if (emissiveTexture !== void 0) { emissiveTexture.texture = gltfJson.textures[emissiveTexture.index]; } if (this._checkRnGltfLoaderOptionsExist(gltfJson) && gltfJson.asset.extras.rnLoaderOptions.loaderExtension && gltfJson.asset.extras.rnLoaderOptions.loaderExtension.setTextures) { gltfJson.asset.extras.rnLoaderOptions.loaderExtension.setTextures(gltfJson, material); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(material.extensions)) { const extensions = material.extensions; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_clearcoat)) { const clearcoatTexture = extensions.KHR_materials_clearcoat.clearcoatTexture; if (clearcoatTexture !== void 0) { clearcoatTexture.texture = gltfJson.textures[clearcoatTexture.index]; } const clearcoatRoughnessTexture = extensions.KHR_materials_clearcoat.clearcoatRoughnessTexture; if (clearcoatRoughnessTexture !== void 0) { clearcoatRoughnessTexture.texture = gltfJson.textures[clearcoatRoughnessTexture.index]; } const clearcoatNormalTexture = extensions.KHR_materials_clearcoat.clearcoatNormalTexture; if (clearcoatNormalTexture !== void 0) { clearcoatNormalTexture.texture = gltfJson.textures[clearcoatNormalTexture.index]; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_transmission)) { const transmissionTexture = extensions.KHR_materials_transmission.transmissionTexture; if (transmissionTexture !== void 0) { transmissionTexture.texture = gltfJson.textures[transmissionTexture.index]; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_volume)) { const thicknessTexture = extensions.KHR_materials_volume.thicknessTexture; if (thicknessTexture !== void 0) { thicknessTexture.texture = gltfJson.textures[thicknessTexture.index]; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_sheen)) { const sheenColorTexture = extensions.KHR_materials_sheen.sheenColorTexture; if (sheenColorTexture !== void 0) { sheenColorTexture.texture = gltfJson.textures[sheenColorTexture.index]; } const sheenRoughnessTexture = extensions.KHR_materials_sheen.sheenRoughnessTexture; if (sheenRoughnessTexture !== void 0) { sheenRoughnessTexture.texture = gltfJson.textures[sheenRoughnessTexture.index]; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_specular)) { const specularTexture = extensions.KHR_materials_specular.specularTexture; if (specularTexture !== void 0) { specularTexture.texture = gltfJson.textures[specularTexture.index]; } const specularColorTexture = extensions.KHR_materials_specular.specularColorTexture; if (specularColorTexture !== void 0) { specularColorTexture.texture = gltfJson.textures[specularColorTexture.index]; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_iridescence)) { const iridescenceTexture = extensions.KHR_materials_iridescence.iridescenceTexture; if (iridescenceTexture !== void 0) { iridescenceTexture.texture = gltfJson.textures[iridescenceTexture.index]; } const iridescenceThicknessTexture = extensions.KHR_materials_iridescence.iridescenceThicknessTexture; if (iridescenceThicknessTexture !== void 0) { iridescenceThicknessTexture.texture = gltfJson.textures[iridescenceThicknessTexture.index]; } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(extensions.KHR_materials_anisotropy)) { const anisotropyTexture = extensions.KHR_materials_anisotropy.anisotropyTexture; if (anisotropyTexture !== void 0) { anisotropyTexture.texture = gltfJson.textures[anisotropyTexture.index]; } } } } } } static _loadDependenciesOfTextures(gltfJson) { var _a, _b; // Texture if (gltfJson.textures) { for (const texture of gltfJson.textures) { (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_3__.ifDefinedThen)((v) => (texture.samplerObject = gltfJson.samplers[v]), texture.sampler); if (((_b = (_a = texture.extensions) === null || _a === void 0 ? void 0 : _a.KHR_texture_basisu) === null || _b === void 0 ? void 0 : _b.source) != null) { texture.extensions.KHR_texture_basisu.fallbackSourceIndex = texture.source; texture.source = texture.extensions.KHR_texture_basisu.source; texture.image = gltfJson.images[texture.source]; } else if (texture.source !== void 0) { texture.image = gltfJson.images[texture.source]; } } } } static _loadDependenciesOfJoints(gltfJson) { if (gltfJson.skins) { for (const skin of gltfJson.skins) { skin.skeletonObject = gltfJson.nodes[skin.skeleton]; skin.inverseBindMatricesObject = gltfJson.accessors[skin.inverseBindMatrices]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.not.exist(skin.skeleton)) { skin.skeleton = skin.joints[0]; skin.skeletonObject = gltfJson.nodes[skin.skeleton]; } skin.jointsObjects = []; for (const jointIndex of skin.joints) { skin.jointsObjects.push(gltfJson.nodes[jointIndex]); } } } } static _loadDependenciesOfAnimations(gltfJson) { if (gltfJson.animations) { for (const animation of gltfJson.animations) { for (const channel of animation.channels) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(channel.sampler)) { channel.samplerObject = animation.samplers[channel.sampler]; channel.target.nodeObject = gltfJson.nodes[channel.target.node]; channel.samplerObject.inputObject = gltfJson.accessors[channel.samplerObject.input]; channel.samplerObject.outputObject = gltfJson.accessors[channel.samplerObject.output]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.undefined(channel.samplerObject.outputObject.extras)) { channel.samplerObject.outputObject.extras = {}; } if (channel.target.path === 'weights') { let weightsArrayLength = channel.samplerObject.outputObject.count / channel.samplerObject.inputObject.count; if (channel.samplerObject.interpolation === 'CUBICSPLINE') { // divided by 3, because in glTF CUBICSPLINE interpolation, // tangents (ak, bk) and values (vk) are grouped // within keyframes: a1,a2,…an,v1,v2,…vn,b1,b2,…bn weightsArrayLength = channel.samplerObject.outputObject.count / channel.samplerObject.inputObject.count / 3; } channel.samplerObject.outputObject.extras.weightsArrayLength = weightsArrayLength; } if (channel.target.path === 'rotation') { channel.samplerObject.outputObject.extras.quaternionIfVec4 = true; } } } } } } static _loadDependenciesOfAccessors(gltfJson) { // Accessor for (const accessor of gltfJson.accessors) { if (accessor.bufferView != null) { accessor.bufferViewObject = gltfJson.bufferViews[accessor.bufferView]; } if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(accessor.sparse)) { const sparse = accessor.sparse; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(sparse) && _misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(sparse.indices) && _misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(sparse.values)) { sparse.indices.bufferViewObject = gltfJson.bufferViews[sparse.indices.bufferView]; sparse.values.bufferViewObject = gltfJson.bufferViews[sparse.values.bufferView]; } } } } static _loadDependenciesOfBufferViews(gltfJson) { // BufferView for (const bufferView of gltfJson.bufferViews) { if (bufferView.buffer !== void 0) { bufferView.bufferObject = gltfJson.buffers[bufferView.buffer]; } } } static _mergeExtendedJson(gltfJson, extendedData) { let extendedJson = null; if (extendedData instanceof ArrayBuffer) { const extendedJsonStr = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.arrayBufferToString(extendedData); extendedJson = JSON.parse(extendedJsonStr); } else if (typeof extendedData === 'string') { extendedJson = JSON.parse(extendedData); } else if (typeof extendedData === 'object') { extendedJson = extendedData; } Object.assign(gltfJson, extendedJson); } static _loadResources(uint8ArrayOfGlb, gltfJson, files, options, basePath, callback) { var _a; const promisesToLoadResources = []; // Buffers Async load let rnpArrayBuffer; for (const rnm2Buffer of gltfJson.buffers) { let filename = ''; if (rnm2Buffer.uri) { const splitUri = rnm2Buffer.uri.split('/'); filename = splitUri[splitUri.length - 1]; } if (typeof rnm2Buffer.uri === 'undefined') { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { rnm2Buffer.buffer = uint8ArrayOfGlb; resolve(uint8ArrayOfGlb); }); } else if (rnm2Buffer.uri.match(/^data:application\/(.*);base64,/)) { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { const arrayBuffer = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.dataUriToArrayBuffer(rnm2Buffer.uri); rnm2Buffer.buffer = new Uint8Array(arrayBuffer); resolve(arrayBuffer); }); } else if (files && this.__containsFileName(files, filename)) { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { const fullPath = this.__getFullPathOfFileName(files, filename); const arrayBuffer = files[fullPath]; rnm2Buffer.buffer = new Uint8Array(arrayBuffer); resolve(arrayBuffer); }); } else { rnpArrayBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise(_misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.loadResourceAsync(basePath + rnm2Buffer.uri, true, (resolve, response) => { rnm2Buffer.buffer = new Uint8Array(response); resolve(response); }, (reject, error) => { reject('HTTP Error Status:' + error); })); } rnm2Buffer.bufferPromise = rnpArrayBuffer; promisesToLoadResources.push(rnpArrayBuffer); } // Textures Async load for (const rnm2Image of (_a = gltfJson.images) !== null && _a !== void 0 ? _a : []) { if (rnm2Image.uri == null) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(uint8ArrayOfGlb)) { // Glb // Load Texture from gltfJson.buffer const imageUint8Array = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createUint8ArrayFromBufferViewInfo(gltfJson, rnm2Image.bufferView, uint8ArrayOfGlb); const imageUri = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createBlobImageUriFromUint8Array(imageUint8Array, rnm2Image.mimeType); promisesToLoadResources.push(this.__loadImageUri(imageUri, rnm2Image, files)); } else { // glTF+bin // Load Texture from gltfJson.buffer const rnm2BufferView = gltfJson.bufferViews[rnm2Image.bufferView]; const bufferInfo = rnm2BufferView.bufferObject; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.not.exist(bufferInfo)) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.error('gltf2BufferView.bufferObject not found'); continue; } const bufferPromise = bufferInfo.bufferPromise; const loadImageAfterLoadingBuffer = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { bufferPromise.then((arraybuffer) => { const imageUint8Array = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createUint8ArrayFromBufferViewInfo(gltfJson, rnm2Image.bufferView, arraybuffer); const imageUri = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createBlobImageUriFromUint8Array(imageUint8Array, rnm2Image.mimeType); this.__loadImageUri(imageUri, rnm2Image, files).then(() => { resolve(arraybuffer); }); }); }); const bufferPromiseIndex = promisesToLoadResources.indexOf(bufferPromise); promisesToLoadResources[bufferPromiseIndex] = loadImageAfterLoadingBuffer; bufferInfo.bufferPromise = loadImageAfterLoadingBuffer; } } else { // Load Texture from URI const imageFileStr = rnm2Image.uri; const splitUri = imageFileStr.split('/'); const filename = splitUri[splitUri.length - 1]; let imageUri; if (files && this.__containsFileName(files, filename)) { const fullPath = this.__getFullPathOfFileName(files, filename); const arrayBuffer = files[fullPath]; imageUri = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createBlobImageUriFromUint8Array(new Uint8Array(arrayBuffer), rnm2Image.mimeType); } else if (imageFileStr.match(/^data:/)) { imageUri = imageFileStr; } else { imageUri = basePath + imageFileStr; } promisesToLoadResources.push(this.__loadImageUri(imageUri, rnm2Image, files)); } } return _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise.all(promisesToLoadResources, callback).catch((err) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.error('Promise.all error: ' + err); }); } static __containsFileName(optionsFiles, filename) { for (const key in optionsFiles) { const split = key.split('/'); const last = split[split.length - 1]; if (last === filename) { return true; } } return false; } static __getFullPathOfFileName(optionsFiles, filename) { for (const key in optionsFiles) { const split = key.split('/'); const last = split[split.length - 1]; if (last === filename) { return key; } } return undefined; } static __loadImageUri(imageUri, imageJson, files) { var _a, _b; let loadImagePromise; if (imageUri.match(/basis$/)) { // load basis file from uri loadImagePromise = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { fetch(imageUri, { mode: 'cors' }).then((response) => { response.arrayBuffer().then((buffer) => { const uint8Array = new Uint8Array(buffer); imageJson.basis = uint8Array; resolve(imageJson); }); }); }); } else if ((_a = imageJson.uri) === null || _a === void 0 ? void 0 : _a.match(/basis$/)) { // find basis file from files option loadImagePromise = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { imageJson.basis = new Uint8Array(files[imageJson.uri]); resolve(imageJson); }); } else if (imageUri.match(/\.ktx2$/) || imageUri.match(/^data:image\/ktx2/) || (imageJson.bufferView != null && imageJson.mimeType === 'image/ktx2')) { // load ktx2 file from uri(ktx2 file or data uri) or bufferView loadImagePromise = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { fetch(imageUri, { mode: 'cors' }).then((response) => { response.arrayBuffer().then((buffer) => { const uint8Array = new Uint8Array(buffer); imageJson.ktx2 = uint8Array; resolve(imageJson); }); }); }); } else if ((_b = imageJson.uri) === null || _b === void 0 ? void 0 : _b.match(/ktx2$/)) { // find ktx2 file from files option loadImagePromise = new _misc_RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { imageJson.ktx2 = new Uint8Array(files[imageJson.uri]); resolve(imageJson); }); } else { loadImagePromise = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.createImageFromUri(imageUri, imageJson.mimeType).then((image) => { image.crossOrigin = 'Anonymous'; imageJson.image = image; return imageJson; }); } return loadImagePromise; } } /***/ }), /***/ "./src/foundation/importer/GltfImporter.ts": /*!*************************************************!*\ !*** ./src/foundation/importer/GltfImporter.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GltfImporter: () => (/* binding */ GltfImporter) /* harmony export */ }); /* harmony import */ var _FormatDetector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormatDetector */ "./src/foundation/importer/FormatDetector.ts"); /* harmony import */ var _Gltf2Importer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Gltf2Importer */ "./src/foundation/importer/Gltf2Importer.ts"); /* harmony import */ var _ModelConverter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ModelConverter */ "./src/foundation/importer/ModelConverter.ts"); /* harmony import */ var _DrcPointCloudImporter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DrcPointCloudImporter */ "./src/foundation/importer/DrcPointCloudImporter.ts"); /* harmony import */ var _renderer_Expression__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../renderer/Expression */ "./src/foundation/renderer/Expression.ts"); /* harmony import */ var _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../renderer/RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _definitions_FileType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../definitions/FileType */ "./src/foundation/definitions/FileType.ts"); /* harmony import */ var _Vrm0xImporter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Vrm0xImporter */ "./src/foundation/importer/Vrm0xImporter.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _VrmImporter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./VrmImporter */ "./src/foundation/importer/VrmImporter.ts"); /** * Importer class which can import GLTF and VRM. */ class GltfImporter { constructor() { } /** * Import GLTF or VRM file. * @param uris uri or array of uri of glTF file * @param options options for loading process where the files property is ignored * @returns gltf expression where: * renderPasses[0]: model entities * renderPasses[1]: model outlines */ static async importFromUri(uri, options, callback) { var _a; options = this.__initOptions(options); const renderPasses = ((_a = options.expression) === null || _a === void 0 ? void 0 : _a.renderPasses) || []; if (renderPasses.length === 0) { renderPasses.push(new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_5__.RenderPass()); } const r_arrayBuffer = await _misc_DataUtil__WEBPACK_IMPORTED_MODULE_6__.DataUtil.fetchArrayBuffer(uri); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_9__.isErr)(r_arrayBuffer)) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'Failed to fetch array buffer', error: r_arrayBuffer, }); } options.files[uri] = r_arrayBuffer.get(); await this.__detectTheModelFileTypeAndImport(uri, renderPasses, options, uri, callback); if (options && options.cameraComponent) { for (const renderPass of renderPasses) { renderPass.cameraComponent = options.cameraComponent; } } const expression = this.__setRenderPassesToExpression(renderPasses, options); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(expression); } /** * Import GLTF or VRM from ArrayBuffers. * @param files ArrayBuffers of glTF/VRM files * @param options options for loading process where if you use files option, key name of files must be uri of the value array buffer * @returns gltf expression where: * renderPasses[0]: model entities * renderPasses[1]: model outlines */ static async importFromArrayBuffers(files, options, callback) { var _a; options = this.__initOptions(options); const renderPasses = ((_a = options.expression) === null || _a === void 0 ? void 0 : _a.renderPasses) || []; if (renderPasses.length === 0) { renderPasses.push(new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_5__.RenderPass()); } for (const fileName in files) { // filename is uri with file extension const fileExtension = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_6__.DataUtil.getExtension(fileName); // if the file is main file type? if (this.__isValidExtension(fileExtension)) { await this.__detectTheModelFileTypeAndImport(fileName, renderPasses, options, fileName, callback); } } if (options && options.cameraComponent) { for (const renderPass of renderPasses) { renderPass.cameraComponent = options.cameraComponent; } } const expression = this.__setRenderPassesToExpression(renderPasses, options); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(expression); } static __initOptions(options) { if (options == null) { options = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_6__.DataUtil.createDefaultGltfOptions(); } else { if (options.files == null) { options.files = {}; } for (const file in options.files) { if (file.match(/.*\.vrm$/) == null) { continue; } const fileName = file.split('.vrm')[0]; if (fileName) { const arraybuffer = options.files[file]; options.files[fileName + '.glb'] = arraybuffer; delete options.files[file]; } } if (Array.isArray(options.defaultMaterialHelperArgumentArray) === false) { options.defaultMaterialHelperArgumentArray = [{}]; } else { // avoid needless processing if (options.defaultMaterialHelperArgumentArray[0].isMorphing === false) { options.maxMorphTargetNumber = 0; } } } return options; } static __setRenderPassesToExpression(renderPasses, options) { var _a; const expression = (_a = options.expression) !== null && _a !== void 0 ? _a : new _renderer_Expression__WEBPACK_IMPORTED_MODULE_4__.Expression(); if (expression.renderPasses !== renderPasses) { expression.clearRenderPasses(); expression.addRenderPasses(renderPasses); } return expression; } static __isValidExtension(fileExtension) { if (fileExtension === 'gltf' || fileExtension === 'glb' || fileExtension === 'vrm' || fileExtension === 'drc') { return true; } else { return false; } } static __isGlb(arrayBuffer) { const dataView = new DataView(arrayBuffer, 0, 20); const isLittleEndian = true; // Magic field const magic = dataView.getUint32(0, isLittleEndian); let result; // The 0x46546C67 means 'glTF' string in glb files. if (magic === 0x46546c67) { return true; } else { return false; } } static __getGlbVersion(glbArrayBuffer) { const dataView = new DataView(glbArrayBuffer, 0, 20); const isLittleEndian = true; const glbVer = dataView.getUint32(4, isLittleEndian); return glbVer; } static __getGltfVersion(gltfJson) { var _a, _b; if (((_b = (_a = gltfJson.asset) === null || _a === void 0 ? void 0 : _a.version) === null || _b === void 0 ? void 0 : _b.charAt(0)) === '2') { return 2; } else { return 1; } } static async __detectTheModelFileTypeAndImport(fileName, renderPasses, options, uri, callback) { const optionalFileType = options.fileType; const fileType = this.__getFileTypeFromFilePromise(fileName, options, optionalFileType); const fileArrayBuffer = options.files[fileName]; options.__isImportVRM0x = false; let glTFVer = 0; // 0: not glTF, 1: glTF1, 2: glTF2 switch (fileType) { case _definitions_FileType__WEBPACK_IMPORTED_MODULE_7__.FileType.Gltf: { const gotText = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_6__.DataUtil.arrayBufferToString(fileArrayBuffer); const json = JSON.parse(gotText); glTFVer = this.__getGltfVersion(json); const importer = _Gltf2Importer__WEBPACK_IMPORTED_MODULE_1__.Gltf2Importer; const gltfModel = await importer._importGltf(json, options.files, options, fileName, callback); const rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_2__.ModelConverter.convertToRhodoniteObject(gltfModel); renderPasses[0].addEntities([rootGroup]); options.__importedType = 'gltf2'; return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } case _definitions_FileType__WEBPACK_IMPORTED_MODULE_7__.FileType.GltfBinary: { glTFVer = this.__getGlbVersion(fileArrayBuffer); const importer = _Gltf2Importer__WEBPACK_IMPORTED_MODULE_1__.Gltf2Importer; const gltfModel = await importer._importGlb(fileArrayBuffer, options.files, options); const rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_2__.ModelConverter.convertToRhodoniteObject(gltfModel); renderPasses[0].addEntities([rootGroup]); options.__importedType = 'glb2'; return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } case _definitions_FileType__WEBPACK_IMPORTED_MODULE_7__.FileType.Draco: { const importer = _DrcPointCloudImporter__WEBPACK_IMPORTED_MODULE_3__.DrcPointCloudImporter.getInstance(); const gltfModel = await importer.importArrayBuffer(uri, fileArrayBuffer, options); if (gltfModel == null) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'importArrayBuffer error is occurred', error: undefined, }); } else { options.__importedType = 'draco'; const rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_2__.ModelConverter.convertToRhodoniteObject(gltfModel); renderPasses[0].addEntities([rootGroup]); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } } case _definitions_FileType__WEBPACK_IMPORTED_MODULE_7__.FileType.VRM: { options.__isImportVRM0x = true; const result = await _Gltf2Importer__WEBPACK_IMPORTED_MODULE_1__.Gltf2Importer._importGltfOrGlbFromArrayBuffers(fileArrayBuffer, options.files, options); if ((0,_misc_Result__WEBPACK_IMPORTED_MODULE_9__.isOk)(result)) { const gltfModel = result.get(); if (gltfModel.extensionsUsed.indexOf('VRMC_vrm') >= 0) { options.__isImportVRM0x = false; gltfModel.asset.extras.rnLoaderOptions.__isImportVRM0x = false; options.__importedType = 'vrm1'; await _VrmImporter__WEBPACK_IMPORTED_MODULE_10__.VrmImporter.__importVRM(gltfModel, renderPasses); } else if (gltfModel.extensionsUsed.indexOf('VRM') >= 0) { options.__importedType = 'vrm0x'; await _Vrm0xImporter__WEBPACK_IMPORTED_MODULE_8__.Vrm0xImporter.__importVRM0x(gltfModel, renderPasses); } return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } else { (0,_misc_Result__WEBPACK_IMPORTED_MODULE_9__.assertIsErr)(result); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: result.getRnError().message, error: undefined, }); } } default: return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'detect invalid format', error: undefined, }); } } static __getFileTypeFromFilePromise(fileName, options, optionalFileType) { if (optionalFileType != null) { return _definitions_FileType__WEBPACK_IMPORTED_MODULE_7__.FileType.fromString(optionalFileType); } else { const fileType = (0,_FormatDetector__WEBPACK_IMPORTED_MODULE_0__.detectFormatByArrayBuffers)({ [fileName]: options.files[fileName], }); return fileType; } } } /***/ }), /***/ "./src/foundation/importer/ILoaderExtension.ts": /*!*****************************************************!*\ !*** ./src/foundation/importer/ILoaderExtension.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/importer/ModelConverter.ts": /*!***************************************************!*\ !*** ./src/foundation/importer/ModelConverter.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ModelConverter: () => (/* binding */ ModelConverter) /* harmony export */ }); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _components_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/Mesh/MeshComponent */ "./src/foundation/components/Mesh/MeshComponent.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Quaternion__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _math_Matrix44__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _memory_Buffer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../memory/Buffer */ "./src/foundation/memory/Buffer.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_CameraType__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../definitions/CameraType */ "./src/foundation/definitions/CameraType.ts"); /* harmony import */ var _textures_Texture__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../textures/Texture */ "./src/foundation/textures/Texture.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../definitions/AnimationInterpolation */ "./src/foundation/definitions/AnimationInterpolation.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _components_Skeletal_SkeletalComponent__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/Skeletal/SkeletalComponent */ "./src/foundation/components/Skeletal/SkeletalComponent.ts"); /* harmony import */ var _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../helpers/MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _math_Vector2__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../math/Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../definitions/ShadingModel */ "./src/foundation/definitions/ShadingModel.ts"); /* harmony import */ var _geometry_Mesh__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../geometry/Mesh */ "./src/foundation/geometry/Mesh.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _definitions_LightType__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../definitions/LightType */ "./src/foundation/definitions/LightType.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _types_glTF2__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../types/glTF2 */ "./src/types/glTF2.ts"); /* harmony import */ var _components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../components/BlendShape/BlendShapeComponent */ "./src/foundation/components/BlendShape/BlendShapeComponent.ts"); /* harmony import */ var _components_Light_LightComponent__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../components/Light/LightComponent */ "./src/foundation/components/Light/LightComponent.ts"); /* harmony import */ var _RhodoniteImportExtension__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./RhodoniteImportExtension */ "./src/foundation/importer/RhodoniteImportExtension.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _components_AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../components/AnimationState/AnimationStateComponent */ "./src/foundation/components/AnimationState/AnimationStateComponent.ts"); /* harmony import */ var _components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../components/SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../components/MeshRenderer/createMeshEntity */ "./src/foundation/components/MeshRenderer/createMeshEntity.ts"); /* harmony import */ var _components_Light_createLightEntity__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../components/Light/createLightEntity */ "./src/foundation/components/Light/createLightEntity.ts"); /* harmony import */ var _components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../components/Camera/createCameraEntity */ "./src/foundation/components/Camera/createCameraEntity.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * A converter class from glTF2 model to Rhodonite Native data */ class ModelConverter { // eslint-disable-next-line @typescript-eslint/no-empty-function constructor() { } static __generateGroupEntity(gltfModel) { const entity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_40__.createGroupEntity)(); this.addTags(entity, gltfModel); return entity; } static addTags(entity, gltfModel) { entity.tryToSetTag({ tag: 'SourceType', value: gltfModel.asset.extras.fileType, }); entity.tryToSetTag({ tag: 'SourceTypeVersion', value: gltfModel.asset.extras.version, }); } static __generateMeshEntity(gltfModel) { const entity = (0,_components_MeshRenderer_createMeshEntity__WEBPACK_IMPORTED_MODULE_41__.createMeshEntity)(); this.addTags(entity, gltfModel); return entity; } static __generateCameraEntity(gltfModel) { const entity = (0,_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_43__.createCameraEntity)(); this.addTags(entity, gltfModel); return entity; } static __generateLightEntity(gltfModel) { const entity = (0,_components_Light_createLightEntity__WEBPACK_IMPORTED_MODULE_42__.createLightEntity)(); this.addTags(entity, gltfModel); return entity; } static __setupMaterials(gltfModel) { const rnMaterials = []; if (gltfModel.materials != null) { for (const material of gltfModel.materials) { const rnMaterial = this.__setupMaterial(gltfModel, material); rnMaterials.push(rnMaterial); } } return rnMaterials; } static convertToRhodoniteObject(gltfModel) { var _a; gltfModel.asset.extras.rnMeshesAtGltMeshIdx = []; const rnBuffers = this.createRnBuffer(gltfModel); gltfModel.asset.extras.rnMaterials = {}; // Materials const rnMaterials = this.__setupMaterials(gltfModel); // Mesh, Camera, Group, ... const { rnEntities, rnEntitiesByNames } = this.__setupObjects(gltfModel, rnBuffers, rnMaterials); gltfModel.asset.extras.rnEntities = rnEntities; // Transform this._setupTransform(gltfModel, rnEntities); const rootGroup = this.__generateGroupEntity(gltfModel); // Animation this._setupAnimation(gltfModel, rnEntities, rnBuffers, rootGroup); // Skeleton this._setupSkeleton(gltfModel, rnEntities, rnBuffers); // Hierarchy this._setupHierarchy(gltfModel, rnEntities); rootGroup.tryToSetUniqueName('FileRoot', true); rootGroup.tryToSetTag({ tag: 'ObjectType', value: 'top' }); if (gltfModel.scenes[0].nodes) { for (const nodesIndex of gltfModel.scenes[0].nodes) { const sg = rnEntities[nodesIndex].getSceneGraph(); rootGroup.getSceneGraph().addChild(sg); } } if (gltfModel.asset.extras && gltfModel.asset.extras.rnLoaderOptions) { const options = gltfModel.asset.extras.rnLoaderOptions; if (options && options.loaderExtension && ((_a = options === null || options === void 0 ? void 0 : options.loaderExtension) === null || _a === void 0 ? void 0 : _a.loadExtensionInfoAndSetToRootGroup)) { options.loaderExtension.loadExtensionInfoAndSetToRootGroup(rootGroup, gltfModel); } if (options && options.expression) { options.expression.tryToSetTag({ tag: 'gltfModel', value: gltfModel, }); } } // rootGroup.allMeshes = rootGroup.searchElementsByType(M_Mesh); rootGroup.tryToSetTag({ tag: 'rnEntities', value: rnEntities }); rootGroup.tryToSetTag({ tag: 'rnEntitiesByNames', value: rnEntitiesByNames }); rootGroup.tryToSetTag({ tag: 'gltfModel', value: gltfModel }); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(gltfModel.extras)) { gltfModel.extras = {}; } gltfModel.extras.rnEntities = rnEntities; gltfModel.extras.rnEntitiesByNames = rnEntitiesByNames; // Effekseer _RhodoniteImportExtension__WEBPACK_IMPORTED_MODULE_36__.RhodoniteImportExtension.importEffect(gltfModel, rootGroup); // Billboard _RhodoniteImportExtension__WEBPACK_IMPORTED_MODULE_36__.RhodoniteImportExtension.importBillboard(gltfModel, rnEntities); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(gltfModel.extensionsUsed)) { if (gltfModel.extensionsUsed.indexOf('VRMC_vrm') > 0) { // this.__generateVrmNormalizedSkeleton(gltfModel, rnEntities); } } return rootGroup; } static createRnBuffer(gltfModel) { const rnBuffers = []; for (const buffer of gltfModel.buffers) { const rnBuffer = new _memory_Buffer__WEBPACK_IMPORTED_MODULE_6__.Buffer({ byteLength: buffer.byteLength, buffer: buffer.buffer, name: `gltf2Buffer_0_(${buffer.uri})`, byteAlign: 4, }); rnBuffers.push(rnBuffer); } return rnBuffers; } static _setupTransform(gltfModel, groups) { for (const node_i in gltfModel.nodes) { const group = groups[node_i]; const nodeJson = gltfModel.nodes[node_i]; const groupTransform = group.getTransform(); if (nodeJson.translation) { groupTransform.localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([ nodeJson.translation[0], nodeJson.translation[1], nodeJson.translation[2], ]); } if (nodeJson.scale) { groupTransform.localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([ nodeJson.scale[0], nodeJson.scale[1], nodeJson.scale[2], ]); } if (nodeJson.rotation) { groupTransform.localRotation = _math_Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.fromCopy4(nodeJson.rotation[0], nodeJson.rotation[1], nodeJson.rotation[2], nodeJson.rotation[3]); } if (nodeJson.matrix) { groupTransform.localMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_4__.Matrix44.fromCopyArrayColumnMajor(nodeJson.matrix); } } } static _setupHierarchy(gltfModel, rnEntities) { const groupSceneComponents = rnEntities.map((group) => { return group.getSceneGraph(); }); for (const node_i in gltfModel.nodes) { const parentNode_i = parseInt(node_i); const glTF2ParentNode = gltfModel.nodes[parentNode_i]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(glTF2ParentNode.children)) { const rnParentSceneGraphComponent = groupSceneComponents[parentNode_i]; for (const childNode_i of glTF2ParentNode.children) { const rnChildSceneGraphComponent = groupSceneComponents[childNode_i]; rnParentSceneGraphComponent.addChild(rnChildSceneGraphComponent); } } } } /** * @internal */ static _setupAnimation(gltfModel, rnEntities, rnBuffers, rootGroup) { var _a; if (gltfModel.animations == null || gltfModel.animations.length === 0) { return; } const newRootGroup = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.addComponentToEntity(_components_AnimationState_AnimationStateComponent__WEBPACK_IMPORTED_MODULE_39__.AnimationStateComponent, rootGroup); for (const animation of gltfModel.animations) { for (const sampler of animation.samplers) { this._readBinaryFromAccessorAndSetItToAccessorExtras(sampler.inputObject, rnBuffers); this._readBinaryFromAccessorAndSetItToAccessorExtras(sampler.outputObject, rnBuffers); } } for (const animation of gltfModel.animations) { for (const channel of animation.channels) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(channel.samplerObject)) { const animInputArray = channel.samplerObject.inputObject.extras.typedDataArray; const animOutputArray = channel.samplerObject.outputObject.extras.typedDataArray; const interpolation = (_a = channel.samplerObject.interpolation) !== null && _a !== void 0 ? _a : 'LINEAR'; let animationAttributeType = 'undefined'; if (channel.target.path === 'translation') { animationAttributeType = 'translate'; } else if (channel.target.path === 'rotation') { animationAttributeType = 'quaternion'; } else { animationAttributeType = channel.target.path; } const rnEntity = rnEntities[channel.target.node]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnEntity)) { let animationComponent = rnEntity.tryToGetAnimation(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(animationComponent)) { const newRnEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.addComponentToEntity(_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_14__.AnimationComponent, rnEntity); animationComponent = newRnEntity.getAnimation(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(animationComponent)) { const outputComponentN = channel.samplerObject.outputObject.extras.componentN; animationComponent.setAnimation(_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(animation.name) ? animation.name : 'Untitled_Animation', animationAttributeType, animInputArray, animOutputArray, outputComponentN, _definitions_AnimationInterpolation__WEBPACK_IMPORTED_MODULE_15__.AnimationInterpolation.fromString(interpolation)); } } } } } } static _setupSkeleton(gltfModel, rnEntities, rnBuffers) { if (gltfModel.skins == null) { return; } for (const node_i in gltfModel.nodes) { const node = gltfModel.nodes[node_i]; const sg = rnEntities[node_i].getSceneGraph(); let skeletalComponent; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject)) { const rnEntity = rnEntities[node_i]; const newRnEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.addComponentToEntity(_components_Skeletal_SkeletalComponent__WEBPACK_IMPORTED_MODULE_17__.SkeletalComponent, rnEntity); skeletalComponent = newRnEntity.getSkeletal(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject.bindShapeMatrix)) { skeletalComponent._bindShapeMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_4__.Matrix44.fromCopyArrayColumnMajor(node.skinObject.bindShapeMatrix); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject.skeleton)) { sg.isRootJoint = true; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.mesh)) { const joints = []; for (const i of node.skinObject.joints) { joints.push(rnEntities[i].getSceneGraph()); } skeletalComponent.setJoints(joints); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject.skeleton)) { skeletalComponent.topOfJointsHierarchy = rnEntities[node.skinObject.skeleton].getSceneGraph(); } else { skeletalComponent.topOfJointsHierarchy = joints[0]; } } } for (const joint_i of node.skinObject.joints) { const sg = rnEntities[joint_i].getSceneGraph(); sg.jointIndex = joint_i; } const inverseBindMatAccessor = node.skinObject.inverseBindMatricesObject; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(inverseBindMatAccessor)) { const rnBufferOfInverseBindMatAccessor = this.__getRnBufferViewAndRnAccessor(inverseBindMatAccessor, rnBuffers); skeletalComponent.setInverseBindMatricesAccessor(rnBufferOfInverseBindMatAccessor); } } } } static __setupObjects(gltfModel, rnBuffers, rnMaterials) { var _a, _b, _c, _d, _e; const rnEntities = []; const rnEntitiesByNames = new Map(); for (const node_i in gltfModel.nodes) { const node = gltfModel.nodes[parseInt(node_i)]; let entity; if (node.mesh != null) { const meshIdx = node.mesh; const meshEntity = this.__setupMesh(node.meshObject, meshIdx, rnBuffers, gltfModel, rnMaterials); if (node.name) { meshEntity.tryToSetUniqueName(node.name, true); } if ((_a = node.meshObject) === null || _a === void 0 ? void 0 : _a.name) { const meshComponent = meshEntity.getComponent(_components_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_1__.MeshComponent); meshComponent.tryToSetUniqueName(node.meshObject.name, true); } entity = meshEntity; } else if (node.cameraObject != null) { const cameraEntity = this.__setupCamera(node.cameraObject, gltfModel); if (node.name) { cameraEntity.tryToSetUniqueName(node.name, true); } entity = cameraEntity; } else if ((_b = node.extensions) === null || _b === void 0 ? void 0 : _b.KHR_lights_punctual) { const lightEntity = this.__setupLight(node.extensions.KHR_lights_punctual.light, gltfModel); entity = lightEntity; } else { const group = this.__generateGroupEntity(gltfModel); if (node.name) { group.tryToSetUniqueName(node.name, true); } entity = group; } if (this.__isMorphing(node, gltfModel)) { let weights = []; if (node.weights) { weights = node.weights; } else if ((_c = node.meshObject) === null || _c === void 0 ? void 0 : _c.weights) { weights = node.meshObject.weights; } else { let targetNum = 0; // get maximum target num for (const primitive of node.meshObject.primitives) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(primitive.targets)) { if (primitive.targets.length > targetNum) { targetNum = primitive.targets.length; } } } weights = new Array(targetNum).fill(0); } entity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_0__.EntityRepository.addComponentToEntity(_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_34__.BlendShapeComponent, entity); const blendShapeComponent = entity.getBlendShape(); blendShapeComponent.weights = weights; if ((_e = (_d = node.meshObject) === null || _d === void 0 ? void 0 : _d.primitives[0].extras) === null || _e === void 0 ? void 0 : _e.targetNames) { blendShapeComponent.targetNames = node.meshObject.primitives[0].extras.targetNames; } } entity.tryToSetTag({ tag: _types_glTF2__WEBPACK_IMPORTED_MODULE_33__.TagGltf2NodeIndex, value: node_i }); rnEntities.push(entity); rnEntitiesByNames.set(node.name, entity); } return { rnEntities, rnEntitiesByNames }; } static __isMorphing(node, gltfModel) { var _a, _b, _c; const argument = (_b = (_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions) === null || _b === void 0 ? void 0 : _b.defaultMaterialHelperArgumentArray[0]; if ((argument === null || argument === void 0 ? void 0 : argument.isMorphing) === false) { return false; } else { return ((_c = node.meshObject) === null || _c === void 0 ? void 0 : _c.primitives[0].targets) != null; } } static __setupLight(light, gltfModel) { var _a, _b; const lightEntity = this.__generateLightEntity(gltfModel); const lightComponent = lightEntity.getComponent(_components_Light_LightComponent__WEBPACK_IMPORTED_MODULE_35__.LightComponent); if (light.name != null) { lightComponent.tryToSetUniqueName(light.name, true); lightComponent.type = _definitions_LightType__WEBPACK_IMPORTED_MODULE_24__.LightType.fromString(light.type); let color = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray3([1, 1, 1]); let intensity = 1; if (light.color != null) { color = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray3(light.color); } if (light.intensity != null) { intensity = light.intensity; } lightComponent.intensity = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.multiply(color, intensity); if (light.range != null) { lightComponent.range = light.range; } if (light.type === 'spot') { if (((_a = light.spot) === null || _a === void 0 ? void 0 : _a.innerConeAngle) != null) { lightComponent.innerConeAngle = light.spot.innerConeAngle; } if (((_b = light.spot) === null || _b === void 0 ? void 0 : _b.outerConeAngle) != null) { lightComponent.outerConeAngle = light.spot.outerConeAngle; } } } return lightEntity; } static __setupCamera(camera, gltfModel) { const cameraEntity = this.__generateCameraEntity(gltfModel); const cameraComponent = cameraEntity.getCamera(); cameraComponent.direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([0, 0, -1]); if (gltfModel.asset && gltfModel.asset.LastSaved_ApplicationVendor) { // For an old exporter compatibility cameraComponent.direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([1, 0, 0]); cameraComponent.directionInner = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([1, 0, 0]); } cameraComponent.up = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([0, 1, 0]); cameraComponent.type = _definitions_CameraType__WEBPACK_IMPORTED_MODULE_11__.CameraType.fromString(camera.type); if (cameraComponent.type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_11__.CameraType.Perspective) { cameraComponent.aspect = camera.perspective.aspectRatio ? camera.perspective.aspectRatio : 1; cameraComponent.setFovyAndChangeFocalLength(_math_MathUtil__WEBPACK_IMPORTED_MODULE_16__.MathUtil.radianToDegree(camera.perspective.yfov)); cameraComponent.zNear = camera.perspective.znear; cameraComponent.zFar = camera.perspective.zfar ? camera.perspective.zfar : 100000; cameraComponent.tryToSetTag({ tag: 'OriginalFovY', value: cameraComponent.fovy, }); } else if (cameraComponent.type === _definitions_CameraType__WEBPACK_IMPORTED_MODULE_11__.CameraType.Orthographic) { cameraComponent.xMag = camera.orthographic.xmag; cameraComponent.yMag = camera.orthographic.ymag; cameraComponent.zNear = camera.orthographic.znear; cameraComponent.zFar = camera.orthographic.zfar; cameraComponent.tryToSetTag({ tag: 'OriginalXMag', value: cameraComponent.xMag, }); cameraComponent.tryToSetTag({ tag: 'OriginalYMag', value: cameraComponent.yMag, }); } cameraComponent.tryToSetTag({ tag: 'OriginalAspect', value: cameraComponent.aspect, }); return cameraEntity; } static __setupMesh(mesh, meshIndex, rnBuffers, gltfModel, rnMaterials) { var _a, _b, _c, _d, _e; const meshEntity = this.__generateMeshEntity(gltfModel); const existingRnMesh = (_a = gltfModel.asset.extras.rnMeshesAtGltMeshIdx[meshIndex]) === null || _a === void 0 ? void 0 : _a.deref(); let rnPrimitiveMode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_7__.PrimitiveMode.Triangles; const meshComponent = meshEntity.getMesh(); if (existingRnMesh != null) { meshComponent.setMesh(existingRnMesh); } else { const rnMesh = new _geometry_Mesh__WEBPACK_IMPORTED_MODULE_22__.Mesh(); // set flag to rnMesh with options const rnLoaderOptions = gltfModel.asset.extras.rnLoaderOptions; if ((rnLoaderOptions === null || rnLoaderOptions === void 0 ? void 0 : rnLoaderOptions.tangentCalculationMode) != null) { rnMesh.tangentCalculationMode = rnLoaderOptions.tangentCalculationMode; } const setupMaterialVariants = (rnPrimitive, primitive) => { const materialVariants = primitive.materialVariants; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(materialVariants)) { return; } for (const materialVariant of materialVariants) { const material = rnMaterials[materialVariant.material]; for (const variantName of materialVariant.variants) { rnPrimitive.setMaterialVariant(variantName, material); } } }; for (const i in mesh.primitives) { const primitive = mesh.primitives[i]; if (primitive.mode != null) { rnPrimitiveMode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_7__.PrimitiveMode.from(primitive.mode); } const rnPrimitive = new _geometry_Primitive__WEBPACK_IMPORTED_MODULE_5__.Primitive(); const rnMaterial = primitive.material != null ? rnMaterials[primitive.material] : this.__setupMaterial(gltfModel); setupMaterialVariants(rnPrimitive, primitive); if (rnMaterial.materialTypeName.indexOf('MToon') !== -1) { const VRMProperties = gltfModel.extensions.VRM; const rnExtension = VRMProperties.rnExtension; if (rnExtension != null) { const renderPassOutline = rnExtension.renderPassOutline; const outlineMaterial = (_d = (_c = (_b = primitive.materialObject) === null || _b === void 0 ? void 0 : _b.extras) === null || _c === void 0 ? void 0 : _c.outlineMaterial) === null || _d === void 0 ? void 0 : _d.deref(); if (outlineMaterial != null) { renderPassOutline.setMaterialForPrimitive(outlineMaterial, rnPrimitive); rnPrimitive.setMaterialVariant('outline', outlineMaterial); // To attach an outlineMaterial reference to the primitive } } } // indices let indicesRnAccessor; const map = new Map(); if ((_e = primitive.extensions) === null || _e === void 0 ? void 0 : _e.KHR_draco_mesh_compression) { indicesRnAccessor = this.__decodeDraco(primitive, rnBuffers, gltfModel, map); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(indicesRnAccessor)) { break; } } else { // indices if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(primitive.indices)) { indicesRnAccessor = this.__getRnBufferViewAndRnAccessor(primitive.indicesObject, rnBuffers); } // attributes const rnBufferViewMap = new Map(); for (const attributeName in primitive.attributesObjects) { const rnm2attribute = primitive.attributesObjects[attributeName]; const rnBuffer = rnBuffers[rnm2attribute.bufferViewObject.buffer]; let rnBufferView; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnm2attribute.bufferView)) { rnBufferView = rnBufferViewMap.get(rnm2attribute.bufferView); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(rnBufferView)) { rnBufferView = this.__getRnBufferView(rnm2attribute.bufferViewObject, rnBuffer); rnBufferViewMap.set(rnm2attribute.bufferView, rnBufferView); } } else { rnBufferView = rnBuffer .takeBufferView({ byteLengthToNeed: 0, byteStride: 0, }) .unwrapForce(); } const attributeRnAccessor = this.__getRnAccessor(rnm2attribute, rnBufferView); const joinedString = _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__.VertexAttribute.toVertexAttributeSemanticJoinedStringAsGltfStyle(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__.VertexAttribute.fromString(rnm2attribute.extras.attributeName)); map.set(joinedString, attributeRnAccessor); } } rnPrimitive.setData(map, rnPrimitiveMode, rnMaterial, indicesRnAccessor); // morph targets if (primitive.targets != null) { // set default number let maxMorphTargetNumber = _core_Config__WEBPACK_IMPORTED_MODULE_25__.Config.maxMorphTargetNumber; if ((rnLoaderOptions === null || rnLoaderOptions === void 0 ? void 0 : rnLoaderOptions.maxMorphTargetNumber) != null) { maxMorphTargetNumber = rnLoaderOptions.maxMorphTargetNumber; } const targets = []; for (let i = 0; i < primitive.targetsObjects.length; i++) { if (i >= maxMorphTargetNumber) { break; } const target = primitive.targetsObjects[i]; const targetMap = new Map(); for (const attributeName in target) { const attributeAccessor = target[attributeName]; const attributeRnAccessor = this.__getRnBufferViewAndRnAccessor(attributeAccessor, rnBuffers); const attributeRnAccessorInGPUVertexData = this.__copyRnAccessorAndBufferView(attributeRnAccessor); const vertexAttribute = _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__.VertexAttribute.fromString(attributeName); const joinedString = _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__.VertexAttribute.toVertexAttributeSemanticJoinedStringAsGltfStyle(vertexAttribute); targetMap.set(joinedString, attributeRnAccessorInGPUVertexData); } targets.push(targetMap); } rnPrimitive.setBlendShapeTargets(targets); } rnMesh.addPrimitive(rnPrimitive); } meshComponent.setMesh(rnMesh); gltfModel.asset.extras.rnMeshesAtGltMeshIdx[meshIndex] = new WeakRef(rnMesh); } return meshEntity; } static setSparseAccessor(accessor, rnAccessor) { var _a, _b, _c, _d; const count = accessor.sparse.count; // get sparse indices const sparseIndices = accessor.sparse.indices; const indicesBufferView = sparseIndices.bufferViewObject; let buffer = sparseIndices.bufferViewObject.bufferObject.buffer; const byteOffsetBufferViewAndSparseIndices = ((_a = indicesBufferView.byteOffset) !== null && _a !== void 0 ? _a : 0) + ((_b = sparseIndices.byteOffset) !== null && _b !== void 0 ? _b : 0); const componentBytesIndices = this._checkBytesPerComponent(sparseIndices); const byteLengthIndices = componentBytesIndices * count; // index is scalar const dataViewIndices = new DataView(buffer.buffer, byteOffsetBufferViewAndSparseIndices + buffer.byteOffset, byteLengthIndices); const dataViewMethodIndices = this._checkDataViewMethod(sparseIndices); // get sparse values const sparseValues = accessor.sparse.values; const valueBufferView = sparseValues.bufferViewObject; buffer = sparseValues.bufferViewObject.bufferObject.buffer; const byteOffsetBufferViewAndAccessorValues = ((_c = valueBufferView.byteOffset) !== null && _c !== void 0 ? _c : 0) + ((_d = sparseValues.byteOffset) !== null && _d !== void 0 ? _d : 0); const componentBytesValues = this._checkBytesPerComponent(accessor); const componentNValues = this._checkComponentNumber(accessor); const byteLengthValues = componentBytesValues * componentNValues * count; const dataViewValues = new DataView(buffer.buffer, byteOffsetBufferViewAndAccessorValues + buffer.byteOffset, byteLengthValues); const dataViewMethodValues = this._checkDataViewMethod(accessor); // set sparse values to rnAccessor const typedArray = rnAccessor.getTypedArray(); const littleEndian = true; for (let i = 0; i < count; i++) { const index = dataViewIndices[dataViewMethodIndices](componentBytesIndices * i, littleEndian); for (let j = 0; j < componentNValues; j++) { const value = dataViewValues[dataViewMethodValues](componentBytesValues * componentNValues * i + componentBytesValues * j, littleEndian); typedArray[index * componentNValues + j] = value; } } } static __setVRM1Material(gltfModel, materialJson, rnLoaderOptions) { const VRMProperties = gltfModel.extensions.VRM; const materialProperties = materialJson.extras.vrm0xMaterialProperty; const shaderName = materialProperties.shader; if (shaderName === 'VRM/MToon') { // argument const defaultMaterialHelperArgument = rnLoaderOptions.defaultMaterialHelperArgumentArray[0]; const additionalName = defaultMaterialHelperArgument.additionalName; const isMorphing = true; //this.__isMorphing(node, gltfModel); const isSkinning = true; // this.__isSkinning(node, gltfModel); const isLighting = this.__isLighting(gltfModel, materialJson); const useTangentAttribute = true; // this.__useTangentAttribute(gltfModel, primitive); const textures = defaultMaterialHelperArgument.textures; const samplers = defaultMaterialHelperArgument.samplers; const debugMode = defaultMaterialHelperArgument.debugMode; const maxInstancesNumber = defaultMaterialHelperArgument.maxInstancesNumber; const makeOutputSrgb = this.__makeOutputSrgb(gltfModel); // outline let renderPassOutline; const rnExtension = VRMProperties.rnExtension; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnExtension)) { renderPassOutline = rnExtension.renderPassOutline; renderPassOutline.isVrRendering = true; renderPassOutline.tryToSetUniqueName('VRM Outline RenderPass', true); } //exist outline if (renderPassOutline != null) { let outlineMaterial; if (materialProperties.floatProperties._OutlineWidthMode !== 0) { outlineMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper.createMToonMaterial({ additionalName, isMorphing, isSkinning, isLighting, useTangentAttribute, isOutline: true, materialProperties, textures, samplers, debugMode, maxInstancesNumber, makeOutputSrgb, }); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(outlineMaterial)) { materialJson.extras.outlineMaterial = new WeakRef(outlineMaterial); } } const material = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper.createMToonMaterial({ additionalName, isMorphing, isSkinning, isLighting, useTangentAttribute, isOutline: false, materialProperties, textures, samplers, debugMode, maxInstancesNumber, makeOutputSrgb, }); ModelConverter.setMToonTextures(textures, materialProperties, material, samplers); return material; } // use another material return undefined; } static setMToonTextures(textures, materialProperties, material, samplers) { const litColorTexture = textures[materialProperties.textureProperties._MainTex]; if (litColorTexture != null) { material.setTextureParameter('litColorTexture', litColorTexture, samplers[materialProperties.textureProperties._MainTex]); } const shadeColorTexture = textures[materialProperties.textureProperties._ShadeTexture]; if (shadeColorTexture != null) { material.setTextureParameter('shadeColorTexture', shadeColorTexture, samplers[materialProperties.textureProperties._ShadeTexture]); } const receiveShadowTexture = textures[materialProperties.textureProperties._ReceiveShadowTexture]; if (receiveShadowTexture != null) { material.setTextureParameter('receiveShadowTexture', receiveShadowTexture, samplers[materialProperties.textureProperties._ReceiveShadowTexture]); } const shadingGradeTexture = textures[materialProperties.textureProperties._ShadingGradeTexture]; if (shadingGradeTexture != null) { material.setTextureParameter('shadingGradeTexture', shadingGradeTexture, samplers[materialProperties.textureProperties._ShadingGradeTexture]); } const rimTexture = textures[materialProperties.textureProperties._RimTexture]; if (rimTexture != null) { material.setTextureParameter('rimTexture', rimTexture, samplers[materialProperties.textureProperties._RimTexture]); } const matCapTexture = textures[materialProperties.textureProperties._SphereAdd]; if (matCapTexture != null) { material.setTextureParameter('matCapTexture', matCapTexture, samplers[materialProperties.textureProperties._SphereAdd]); } const emissionTexture = textures[materialProperties.textureProperties._EmissionMap]; if (emissionTexture != null) { material.setTextureParameter('emissionTexture', emissionTexture, samplers[materialProperties.textureProperties._EmissionMap]); } const normalTexture = textures[materialProperties.textureProperties._BumpMap]; if (normalTexture != null) { material.setTextureParameter('normalTexture', normalTexture, samplers[materialProperties.textureProperties._BumpMap]); } const outlineWidthTexture = textures[materialProperties.textureProperties._OutlineWidthTexture]; if (outlineWidthTexture != null) { material.setTextureParameter('outlineWidthTexture', outlineWidthTexture, samplers[materialProperties.textureProperties._OutlineWidthTexture]); } } static __setVRM0xMaterial(gltfModel, // primitive: RnM2Primitive, materialJson, rnLoaderOptions) { const VRMProperties = gltfModel.extensions.VRM; const materialProperties = materialJson.extras.vrm0xMaterialProperty; const shaderName = materialProperties.shader; if (shaderName === 'VRM/MToon') { // argument const defaultMaterialHelperArgument = rnLoaderOptions.defaultMaterialHelperArgumentArray[0]; const additionalName = defaultMaterialHelperArgument.additionalName; const isMorphing = true; //this.__isMorphing(node, gltfModel); const isSkinning = true; //this.__isSkinning(node, gltfModel); const isLighting = this.__isLighting(gltfModel, materialJson); const useTangentAttribute = true; const textures = defaultMaterialHelperArgument.textures; const samplers = defaultMaterialHelperArgument.samplers; const debugMode = defaultMaterialHelperArgument.debugMode; const maxInstancesNumber = defaultMaterialHelperArgument.maxInstancesNumber; const makeOutputSrgb = this.__makeOutputSrgb(gltfModel); // outline let renderPassOutline; const rnExtension = VRMProperties.rnExtension; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnExtension)) { renderPassOutline = rnExtension.renderPassOutline; renderPassOutline.isVrRendering = true; renderPassOutline.tryToSetUniqueName('VRM Outline RenderPass', true); } //exist outline if (renderPassOutline != null) { let outlineMaterial; if (materialProperties.floatProperties._OutlineWidthMode !== 0) { outlineMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper.createMToonMaterial({ additionalName, isMorphing, isSkinning, isLighting, useTangentAttribute, isOutline: true, materialProperties, textures, samplers, debugMode, maxInstancesNumber, makeOutputSrgb, }); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(outlineMaterial)) { materialJson.extras.outlineMaterial = new WeakRef(outlineMaterial); } } const material = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper.createMToonMaterial({ additionalName, isMorphing, isSkinning, isLighting, useTangentAttribute, isOutline: false, materialProperties, textures, samplers, debugMode, maxInstancesNumber, makeOutputSrgb, }); ModelConverter.setMToonTextures(textures, materialProperties, material, samplers); return material; } // use another material return undefined; } static __generateAppropriateMaterial(gltfModel, materialJson) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; const isTranslucent = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_transmission); // if rnLoaderOptions is set something, do special deal if (((_b = gltfModel.asset.extras) === null || _b === void 0 ? void 0 : _b.rnLoaderOptions) != null) { const rnLoaderOptions = gltfModel.asset.extras.rnLoaderOptions; // For specified loader extension if (((_c = rnLoaderOptions.loaderExtension) === null || _c === void 0 ? void 0 : _c.isNeededToUseThisMaterial) != null && rnLoaderOptions.loaderExtension.isNeededToUseThisMaterial(gltfModel)) { const loaderExtension = (_e = (_d = gltfModel.asset.extras) === null || _d === void 0 ? void 0 : _d.rnLoaderOptions) === null || _e === void 0 ? void 0 : _e.loaderExtension; if ((loaderExtension === null || loaderExtension === void 0 ? void 0 : loaderExtension.generateMaterial) != null) { return loaderExtension.generateMaterial(materialJson); } } // For VRM0x if (rnLoaderOptions.__isImportVRM0x) { const material = this.__setVRM0xMaterial(gltfModel, materialJson, rnLoaderOptions); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(material)) { material.isTranslucent = isTranslucent; return material; } } // For specified default material helper const materialHelperName = rnLoaderOptions.defaultMaterialHelperName; if (materialHelperName != null) { return _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper[materialHelperName](...rnLoaderOptions.defaultMaterialHelperArgumentArray); } } // pre data const isMorphing = true; // this.__isMorphing(node, gltfModel); const isSkinning = true; //this.__isSkinning(node, gltfModel); const isLighting = this.__isLighting(gltfModel, materialJson); const additionalName = ''; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(materialJson)) { if (((_f = materialJson.extensions) === null || _f === void 0 ? void 0 : _f.VRMC_materials_mtoon) != null) { const rnLoaderOptions = gltfModel.asset.extras.rnLoaderOptions; const material = this.__setVRM1Material(gltfModel, materialJson, rnLoaderOptions); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(material)) { material.isTranslucent = isTranslucent; return material; } } } const maxMaterialInstanceNumber = _core_Config__WEBPACK_IMPORTED_MODULE_25__.Config.maxMaterialInstanceForEachType; if (parseFloat((_g = gltfModel.asset) === null || _g === void 0 ? void 0 : _g.version) >= 2) { const rnLoaderOptions = (_j = (_h = gltfModel.asset.extras) === null || _h === void 0 ? void 0 : _h.rnLoaderOptions) !== null && _j !== void 0 ? _j : {}; // For glTF 2 const useTangentAttribute = true; //this.__useTangentAttribute(gltfModel, primitive); const useNormalTexture = this.__useNormalTexture(gltfModel); const material = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper.createPbrUberMaterial({ isMorphing, isSkinning, isLighting, isClearCoat: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_k = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _k === void 0 ? void 0 : _k.KHR_materials_clearcoat), isTransmission: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_l = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _l === void 0 ? void 0 : _l.KHR_materials_transmission), isVolume: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_m = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _m === void 0 ? void 0 : _m.KHR_materials_volume), isSheen: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_o = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _o === void 0 ? void 0 : _o.KHR_materials_sheen), isSpecular: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_p = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _p === void 0 ? void 0 : _p.KHR_materials_specular), isIridescence: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_q = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _q === void 0 ? void 0 : _q.KHR_materials_iridescence), isAnisotropy: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_r = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _r === void 0 ? void 0 : _r.KHR_materials_anisotropy), isShadow: rnLoaderOptions.shadow ? true : false, useTangentAttribute, useNormalTexture, additionalName: additionalName, maxInstancesNumber: maxMaterialInstanceNumber, }); const makeOutputSrgb = this.__makeOutputSrgb(gltfModel); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(makeOutputSrgb)) { material.setParameter('makeOutputSrgb', makeOutputSrgb); } material.isTranslucent = isTranslucent; return material; } else { // For glTF 1 const material = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_19__.MaterialHelper.createClassicUberMaterial({ isSkinning, isLighting, additionalName: additionalName, maxInstancesNumber: maxMaterialInstanceNumber, }); material.isTranslucent = isTranslucent; return material; } } static __isLighting(gltfModel, materialJson) { var _a, _b, _c, _d; const argument = (_c = (_b = (_a = gltfModel === null || gltfModel === void 0 ? void 0 : gltfModel.asset) === null || _a === void 0 ? void 0 : _a.extras) === null || _b === void 0 ? void 0 : _b.rnLoaderOptions) === null || _c === void 0 ? void 0 : _c.defaultMaterialHelperArgumentArray[0]; if ((argument === null || argument === void 0 ? void 0 : argument.isLighting) != null) { return argument.isLighting; } else { return ((_d = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _d === void 0 ? void 0 : _d.KHR_materials_unlit) != null ? false : true; } } // private static __isSkinning(node: RnM2Node, gltfModel: RnM2) { // const argument = // gltfModel?.asset?.extras?.rnLoaderOptions?.defaultMaterialHelperArgumentArray![0]; // if (argument?.isSkinning === false) { // return false; // } else { // return node.skin != null; // } // } static __useTangentAttribute(gltfModel, primitive) { var _a, _b, _c; const tangentCalculationMode = (_c = (_b = (_a = gltfModel === null || gltfModel === void 0 ? void 0 : gltfModel.asset) === null || _a === void 0 ? void 0 : _a.extras) === null || _b === void 0 ? void 0 : _b.rnLoaderOptions) === null || _c === void 0 ? void 0 : _c.tangentCalculationMode; switch (tangentCalculationMode) { case 0: // do not use normal map return false; case 1: // tangent attribute + calculated tangent in shader break; case 2: // tangent attribute + pre-calculated tangent return true; case 3: // force calc in shader return false; case 4: // force pre-calc return true; default: } for (const attribute in primitive.attributes) { if (attribute === 'TANGENT') { return true; } } return false; } static __useNormalTexture(gltfModel) { var _a, _b, _c, _d, _e, _f; const argument = (_c = (_b = (_a = gltfModel === null || gltfModel === void 0 ? void 0 : gltfModel.asset) === null || _a === void 0 ? void 0 : _a.extras) === null || _b === void 0 ? void 0 : _b.rnLoaderOptions) === null || _c === void 0 ? void 0 : _c.defaultMaterialHelperArgumentArray[0]; if ((argument === null || argument === void 0 ? void 0 : argument.useNormalTexture) === false) { return false; } else { return ((_f = (_e = (_d = gltfModel === null || gltfModel === void 0 ? void 0 : gltfModel.asset) === null || _d === void 0 ? void 0 : _d.extras) === null || _e === void 0 ? void 0 : _e.rnLoaderOptions) === null || _f === void 0 ? void 0 : _f.tangentCalculationMode) !== 0; } } static __makeOutputSrgb(gltfModel) { var _a, _b, _c; const argument = (_c = (_b = (_a = gltfModel === null || gltfModel === void 0 ? void 0 : gltfModel.asset) === null || _a === void 0 ? void 0 : _a.extras) === null || _b === void 0 ? void 0 : _b.rnLoaderOptions) === null || _c === void 0 ? void 0 : _c.defaultMaterialHelperArgumentArray[0]; return argument === null || argument === void 0 ? void 0 : argument.makeOutputSrgb; } static __setupMaterial(gltfModel, materialJson) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; const isUnlit = ((_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_unlit) != null; const material = this.__generateAppropriateMaterial(gltfModel, materialJson); // avoid unexpected initialization if (!this.__needParameterInitialization(materialJson, material.materialTypeName)) return material; const options = gltfModel.asset.extras.rnLoaderOptions; const pbrMetallicRoughness = materialJson === null || materialJson === void 0 ? void 0 : materialJson.pbrMetallicRoughness; if (pbrMetallicRoughness != null) { // BaseColor Factor setupPbrMetallicRoughness(pbrMetallicRoughness, material, gltfModel, options, materialJson); } else { let param = _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Phong.index; if ((_b = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extras) === null || _b === void 0 ? void 0 : _b.technique) { switch (materialJson.extras.technique) { case _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Constant.str: param = _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Constant.index; break; case _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Lambert.str: param = _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Lambert.index; break; case _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.BlinnPhong.str: param = _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.BlinnPhong.index; break; case _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Phong.str: param = _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_21__.ShadingModel.Phong.index; break; } material.setParameter('shadingModel', _math_Scalar__WEBPACK_IMPORTED_MODULE_28__.Scalar.fromCopyNumber(param)); } } const emissiveFactor = isUnlit ? [0, 0, 0] : materialJson === null || materialJson === void 0 ? void 0 : materialJson.emissiveFactor; if (emissiveFactor != null) { material.setParameter('emissiveFactor', _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray3(emissiveFactor)); } const emissiveTexture = materialJson === null || materialJson === void 0 ? void 0 : materialJson.emissiveTexture; if (emissiveTexture != null && _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.falsy(isUnlit)) { const rnTexture = ModelConverter._createTexture(emissiveTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(emissiveTexture.texture); material.setTextureParameter('emissiveTexture', rnTexture, rnSampler); if (parseFloat((_c = gltfModel.asset) === null || _c === void 0 ? void 0 : _c.version) >= 2 && emissiveTexture.texCoord != null) { material.setParameter('emissiveTexcoordIndex', emissiveTexture.texCoord); } ModelConverter._setupTextureTransform(emissiveTexture, material, 'emissiveTextureTransform', 'emissiveTextureRotation'); } let alphaMode = materialJson === null || materialJson === void 0 ? void 0 : materialJson.alphaMode; if (options === null || options === void 0 ? void 0 : options.alphaMode) { alphaMode = options.alphaMode; } if (alphaMode != null) { material.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_18__.AlphaMode.fromGlTFString(alphaMode); // set alpha threshold except for VRM if (material.alphaMode === _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_18__.AlphaMode.Mask && !((_e = (_d = gltfModel.asset.extras) === null || _d === void 0 ? void 0 : _d.rnLoaderOptions) === null || _e === void 0 ? void 0 : _e.__isImportVRM0x)) { material.setParameter('alphaCutoff', _math_Scalar__WEBPACK_IMPORTED_MODULE_28__.Scalar.fromCopyNumber((_f = materialJson === null || materialJson === void 0 ? void 0 : materialJson.alphaCutoff) !== null && _f !== void 0 ? _f : 0.5)); } } material.isTranslucent = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_g = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _g === void 0 ? void 0 : _g.KHR_materials_transmission); const doubleSided = materialJson === null || materialJson === void 0 ? void 0 : materialJson.doubleSided; if (doubleSided != null) { material.cullFace = !doubleSided; } // For glTF1.0 if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(materialJson.diffuseColorTexture)) { const diffuseColorTexture = materialJson.diffuseColorTexture; const rnTexture = ModelConverter._createTexture(diffuseColorTexture, gltfModel, { autoDetectTransparency: options === null || options === void 0 ? void 0 : options.autoDetectTextureTransparency, }); const rnSampler = ModelConverter._createSampler(diffuseColorTexture); material.setTextureParameter('diffuseColorTexture', rnTexture, rnSampler); if (this._checkRnGltfLoaderOptionsExist(gltfModel) && ((_j = (_h = gltfModel.asset.extras) === null || _h === void 0 ? void 0 : _h.rnLoaderOptions) === null || _j === void 0 ? void 0 : _j.loaderExtension)) { const loaderExtension = gltfModel.asset.extras.rnLoaderOptions .loaderExtension; if (loaderExtension.setUVTransformToTexture) { loaderExtension.setUVTransformToTexture(material, diffuseColorTexture.samplerObject); } } } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(materialJson === null || materialJson === void 0 ? void 0 : materialJson.diffuseColorFactor)) { const diffuseColorFactor = materialJson === null || materialJson === void 0 ? void 0 : materialJson.diffuseColorFactor; material.setParameter('diffuseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_13__.Vector4.fromCopyArray4(diffuseColorFactor)); } const normalTexture = materialJson === null || materialJson === void 0 ? void 0 : materialJson.normalTexture; if (normalTexture != null && _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.falsy(isUnlit)) { const rnTexture = ModelConverter._createTexture(normalTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(normalTexture.texture); material.setTextureParameter('normalTexture', rnTexture, rnSampler); if (parseFloat((_k = gltfModel.asset) === null || _k === void 0 ? void 0 : _k.version) >= 2) { if (normalTexture.texCoord != null) { material.setParameter('normalTexcoordIndex', normalTexture.texCoord); } if (normalTexture.scale != null) { material.setParameter('normalScale', normalTexture.scale); } } } ModelConverter._setupTextureTransform(normalTexture, material, 'normalTextureTransform', 'normalTextureRotation'); // ModelConverter._setupTextureTransform(normalTexture, material, 'normalTextureTransform', 'normalTextureRotation') // For Extension if (this._checkRnGltfLoaderOptionsExist(gltfModel)) { const loaderExtension = (_m = (_l = gltfModel.asset.extras) === null || _l === void 0 ? void 0 : _l.rnLoaderOptions) === null || _m === void 0 ? void 0 : _m.loaderExtension; if ((loaderExtension === null || loaderExtension === void 0 ? void 0 : loaderExtension.setupMaterial) != null) { loaderExtension.setupMaterial(gltfModel, materialJson, material); } } return material; } static _createSampler(texture) { var _a, _b, _c, _d; const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_38__.Sampler({ magFilter: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_a = texture.samplerObject) === null || _a === void 0 ? void 0 : _a.magFilter) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.magFilter) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Linear, minFilter: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_b = texture.samplerObject) === null || _b === void 0 ? void 0 : _b.minFilter) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.minFilter) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Linear, wrapS: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_c = texture.samplerObject) === null || _c === void 0 ? void 0 : _c.wrapS) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.wrapS) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Repeat, wrapT: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_d = texture.samplerObject) === null || _d === void 0 ? void 0 : _d.wrapT) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.wrapT) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Repeat, }); sampler.create(); return sampler; } static _createTexture(texture, gltfModel, { autoDetectTransparency = false } = {}) { var _a, _b, _c, _d, _e, _f, _g, _h; const options = (_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions; const rnTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_12__.Texture(); rnTexture.autoDetectTransparency = autoDetectTransparency; rnTexture.autoResize = (options === null || options === void 0 ? void 0 : options.autoResizeTexture) === true; const textureOption = { magFilter: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_b = texture.samplerObject) === null || _b === void 0 ? void 0 : _b.magFilter) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.magFilter) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Linear, minFilter: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_c = texture.samplerObject) === null || _c === void 0 ? void 0 : _c.minFilter) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.minFilter) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Linear, wrapS: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_d = texture.samplerObject) === null || _d === void 0 ? void 0 : _d.wrapS) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.wrapS) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Repeat, wrapT: _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_e = texture.samplerObject) === null || _e === void 0 ? void 0 : _e.wrapT) ? _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.from(texture.samplerObject.wrapT) : _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Repeat, }; const image = texture.image; if (image.image) { const imageElem = image.image; const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_30__.CGAPIResourceRepository.getWebGLResourceRepository(); const isWebGL1 = !((_f = webglResourceRepository.currentWebGLContextWrapper) === null || _f === void 0 ? void 0 : _f.isWebGL2); if (isWebGL1 && !this.__sizeIsPowerOfTwo(imageElem) && this.__needResizeToPowerOfTwoOnWebGl1(textureOption)) { rnTexture.autoResize = true; } rnTexture.generateTextureFromImage(imageElem); rnTexture.loadFromImgLazy(); } else if (image.basis) { rnTexture.generateTextureFromBasis(image.basis, {}); } else if (image.ktx2) { rnTexture.generateTextureFromKTX2(image.ktx2); } if (image.uri) { rnTexture.name = image.uri; } else { const ext = (_g = image.mimeType) === null || _g === void 0 ? void 0 : _g.split('/')[1]; rnTexture.name = (_h = image.name) !== null && _h !== void 0 ? _h : texture.name + `.${ext}`; } rnTexture.tryToSetUniqueName(rnTexture.name, true); return rnTexture; } static __needResizeToPowerOfTwoOnWebGl1(textureOption) { if (textureOption.wrapS !== _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.ClampToEdge || textureOption.wrapT !== _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.ClampToEdge || (textureOption.minFilter !== _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Linear && textureOption.minFilter !== _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_29__.TextureParameter.Nearest)) { return true; } return false; } static __sizeIsPowerOfTwo(image) { const width = image.width; const height = image.height; if ((width & (width - 1)) === 0 && (height & (height - 1)) === 0) { return true; } else { return false; } } static __needParameterInitialization(materialJson, materialTypeName) { if (materialJson == null) return false; if (materialTypeName.match(/PbrUber/) != null || materialTypeName.match(/ClassicUber/) != null) { return true; } else { return false; } } static _checkRnGltfLoaderOptionsExist(gltfModel) { var _a; if ((_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions) { return true; } else { return false; } } static __rewrapWithTypedArray(typedArrayClass, uint8Array, byteOffset, length) { return new typedArrayClass(uint8Array.buffer, byteOffset + uint8Array.byteOffset, length); } static _checkBytesPerComponent(accessor) { let bytesPerComponent = 0; switch (accessor.componentType) { case 5120: // gl.BYTE bytesPerComponent = 1; break; case 5121: // gl.UNSIGNED_BYTE bytesPerComponent = 1; break; case 5122: // gl.SHORT bytesPerComponent = 2; break; case 5123: // gl.UNSIGNED_SHORT bytesPerComponent = 2; break; case 5124: // gl.INT bytesPerComponent = 4; break; case 5125: // gl.UNSIGNED_INT bytesPerComponent = 4; break; case 5126: // gl.FLOAT bytesPerComponent = 4; break; default: break; } return bytesPerComponent; } static _checkComponentNumber(accessor) { let componentN = 0; switch (accessor.type) { case 'SCALAR': componentN = 1; break; case 'VEC2': componentN = 2; break; case 'VEC3': componentN = 3; break; case 'VEC4': componentN = 4; break; case 'MAT4': componentN = 16; break; } return componentN; } static _checkDataViewMethod(accessor) { let dataViewMethod = ''; switch (accessor.componentType) { case 5120: // gl.BYTE dataViewMethod = 'getInt8'; break; case 5121: // gl.UNSIGNED_BYTE dataViewMethod = 'getUint8'; break; case 5122: // gl.SHORT dataViewMethod = 'getInt16'; break; case 5123: // gl.UNSIGNED_SHORT dataViewMethod = 'getUint16'; break; case 5124: // gl.INT dataViewMethod = 'getInt32'; break; case 5125: // gl.UNSIGNED_INT dataViewMethod = 'getUint32'; break; case 5126: // gl.FLOAT dataViewMethod = 'getFloat32'; break; default: break; } return dataViewMethod; } static _isSystemLittleEndian() { return !!new Uint8Array(new Uint16Array([0x00ff]).buffer)[0]; } static _readBinaryFromAccessorAndSetItToAccessorExtras(accessor, rnBuffers) { var _a, _b, _c; const bufferView = accessor.bufferViewObject; let byteOffsetFromBuffer = ((_a = bufferView.byteOffset) !== null && _a !== void 0 ? _a : 0) + ((_b = accessor.byteOffset) !== null && _b !== void 0 ? _b : 0); const buffer = bufferView.bufferObject; let uint8Array = buffer.buffer; const componentN = this._checkComponentNumber(accessor); const componentBytes = this._checkBytesPerComponent(accessor); const dataViewMethod = this._checkDataViewMethod(accessor); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(accessor.extras)) { accessor.extras = { attributeName: '', toGetAsTypedArray: true, typedDataArray: new Float32Array(), componentN: 0, componentBytes: 4, dataViewMethod: '', }; } // for weights animation accessor, set componentN as weightsArrayLength accessor.extras.componentN = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist((_c = accessor.extras) === null || _c === void 0 ? void 0 : _c.weightsArrayLength) ? accessor.extras.weightsArrayLength : componentN; accessor.extras.componentBytes = componentBytes; accessor.extras.dataViewMethod = dataViewMethod; const byteLength = componentBytes * componentN * accessor.count; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnBuffers)) { const rnBuffer = rnBuffers[accessor.bufferViewObject.buffer]; const rnBufferView = this.__getRnBufferView(bufferView, rnBuffer); const rnAccessor = this.__getRnAccessor(accessor, rnBufferView); uint8Array = rnAccessor.getUint8Array(); byteOffsetFromBuffer = 0; } let float32Array = new Float32Array(); const numberArray = []; if (ModelConverter._isSystemLittleEndian()) { // If this platform is Little Endian System, // the uint8array can let typedDataArray = new Float32Array(); if (dataViewMethod === 'getFloat32') { typedDataArray = this.__rewrapWithTypedArray(Float32Array, uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } else if (dataViewMethod === 'getInt8') { typedDataArray = new Int8Array(uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } else if (dataViewMethod === 'getUint8') { typedDataArray = new Uint8Array(uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } else if (dataViewMethod === 'getInt16') { typedDataArray = this.__rewrapWithTypedArray(Int16Array, uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } else if (dataViewMethod === 'getUint16') { typedDataArray = this.__rewrapWithTypedArray(Uint16Array, uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } else if (dataViewMethod === 'getInt32') { typedDataArray = this.__rewrapWithTypedArray(Int32Array, uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } else if (dataViewMethod === 'getUint32') { typedDataArray = this.__rewrapWithTypedArray(Uint32Array, uint8Array, byteOffsetFromBuffer, byteLength / componentBytes); } float32Array = this.__normalizeTypedArrayToFloat32Array(dataViewMethod, typedDataArray); } else { // for BigEndian process const dataView = new DataView(uint8Array.buffer, byteOffsetFromBuffer + uint8Array.byteOffset, byteLength); const byteDelta = componentBytes * componentN; const littleEndian = true; for (let pos = 0; pos < byteLength; pos += byteDelta) { switch (accessor.type) { case 'SCALAR': numberArray.push(dataView[dataViewMethod](pos, littleEndian)); break; case 'VEC2': numberArray.push(dataView[dataViewMethod](pos, littleEndian)); numberArray.push(dataView[dataViewMethod](pos + componentBytes, littleEndian)); break; case 'VEC3': numberArray.push(dataView[dataViewMethod](pos, littleEndian)); numberArray.push(dataView[dataViewMethod](pos + componentBytes, littleEndian)); numberArray.push(dataView[dataViewMethod](pos + componentBytes * 2, littleEndian)); break; case 'VEC4': for (let i = 0; i < 4; i++) { numberArray.push(dataView[dataViewMethod](pos + componentBytes * i, littleEndian)); } break; case 'MAT4': for (let i = 0; i < 16; i++) { numberArray.push(dataView[dataViewMethod](pos + componentBytes * i, littleEndian)); } break; } } float32Array = this.__normalizeTypedArrayToFloat32Array(dataViewMethod, numberArray); } accessor.extras.typedDataArray = float32Array; return float32Array; } /** * normalize values of TypedArray to Float32Array * See: the last part of 3.11.Animation at https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#animations * @param dataViewMethod * @param numberArray * @returns */ static __normalizeTypedArrayToFloat32Array(dataViewMethod, numberArray) { if (dataViewMethod === 'getInt8') { return _misc_DataUtil__WEBPACK_IMPORTED_MODULE_32__.DataUtil.normalizedInt8ArrayToFloat32Array(numberArray); } else if (dataViewMethod === 'getUint8') { return _misc_DataUtil__WEBPACK_IMPORTED_MODULE_32__.DataUtil.normalizedUint8ArrayToFloat32Array(numberArray); } else if (dataViewMethod === 'getInt16') { return _misc_DataUtil__WEBPACK_IMPORTED_MODULE_32__.DataUtil.normalizedInt16ArrayToFloat32Array(numberArray); } else if (dataViewMethod === 'getUint16') { return _misc_DataUtil__WEBPACK_IMPORTED_MODULE_32__.DataUtil.normalizedUint16ArrayToFloat32Array(numberArray); } else if (dataViewMethod === 'getInt32') { // typedDataArray = new Int32Array(numberArray); _misc_Logger__WEBPACK_IMPORTED_MODULE_44__.Logger.error('Not considered'); return new Float32Array(); } else if (dataViewMethod === 'getUint32') { // typedDataArray = new Uint32Array(numberArray); _misc_Logger__WEBPACK_IMPORTED_MODULE_44__.Logger.error('Not considered'); return new Float32Array(); } else if (dataViewMethod === 'getFloat32') { return new Float32Array(numberArray); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_44__.Logger.error('Not considered'); return new Float32Array(); } } static __addOffsetToIndices(meshComponent) { const primitiveNumber = meshComponent.mesh.getPrimitiveNumber(); let offsetSum = 0; for (let i = 0; i < primitiveNumber; i++) { const primitive = meshComponent.mesh.getPrimitiveAt(i); const indicesAccessor = primitive.indicesAccessor; if (indicesAccessor) { const elementNumber = indicesAccessor.elementCount; for (let j = 0; j < elementNumber; j++) { const index = indicesAccessor.getScalar(j, {}); indicesAccessor.setScalar(j, index + offsetSum, {}); } offsetSum += elementNumber; } } } /** * Take a Rn.Accessor from the Rn.Buffer * from the information of the Gltf2Buffer, Gltf2BufferView, and Gltf2Accessor. * @param accessor * @param rnBuffer * @returns */ static __getRnAccessor(accessor, rnBufferView) { var _a; let rnAccessor; if (rnBufferView != null) { rnAccessor = rnBufferView .takeAccessorWithByteOffset({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_8__.CompositionType.fromString(accessor.type), componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.from(accessor.componentType), count: accessor.count, byteOffsetInBufferView: (_a = accessor.byteOffset) !== null && _a !== void 0 ? _a : 0, byteStride: accessor.byteStride, max: accessor.max, min: accessor.min, normalized: accessor.normalized, }) .unwrapForce(); } else { // if accessor.bufferView is not defined, the accessor MUST be initialized with zeros. // See: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_accessor_bufferview const rnBuffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_27__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_26__.BufferUse.GPUVertexData); const compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_8__.CompositionType.fromString(accessor.type); const componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.from(accessor.componentType); const rnBufferView = rnBuffer .takeBufferView({ byteLengthToNeed: accessor.count * compositionType.getNumberOfComponents() * componentType.getSizeInBytes(), byteStride: compositionType.getNumberOfComponents() * componentType.getSizeInBytes(), }) .unwrapForce(); rnAccessor = rnBufferView .takeAccessor({ compositionType: compositionType, componentType: componentType, count: accessor.count, max: accessor.max, min: accessor.min, normalized: accessor.normalized, }) .unwrapForce(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(accessor.sparse)) { this.setSparseAccessor(accessor, rnAccessor); } return rnAccessor; } /** * Take a Rn.BufferView and a Rn.Accessor from the Rn.Buffer * from the information of the Gltf2Buffer, Gltf2BufferView, and Gltf2Accessor. * @param accessor * @param rnBuffer * @returns */ static __getRnBufferViewAndRnAccessor(accessor, rnBuffers) { const gltfBufferView = accessor.bufferViewObject; let rnBufferView; if (gltfBufferView != null) { const rnBuffer = rnBuffers[gltfBufferView.buffer]; rnBufferView = this.__getRnBufferView(gltfBufferView, rnBuffer); } const rnAccessor = this.__getRnAccessor(accessor, rnBufferView); return rnAccessor; } static __copyRnAccessorAndBufferView(srcRnAccessor) { const byteSize = srcRnAccessor.elementCount * 3 /* vec4 */ * 4; /* bytes */ const dstRnBuffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_27__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_26__.BufferUse.GPUVertexData); const dstRnBufferView = dstRnBuffer .takeBufferView({ byteLengthToNeed: byteSize, byteStride: 3 /* vec4 */ * 4 /* bytes */, }) .unwrapForce(); const dstRnAccessor = dstRnBufferView .takeAccessor({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_8__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_9__.ComponentType.Float, count: srcRnAccessor.elementCount, max: srcRnAccessor.max, min: srcRnAccessor.min, normalized: srcRnAccessor.normalized, }) .unwrapForce(); dstRnAccessor.copyBuffer(srcRnAccessor); return dstRnAccessor; } static __takeRnBufferViewAndRnAccessorForDraco(accessor, compositionNum, rnBuffer) { const rnBufferView = rnBuffer .takeBufferView({ byteLengthToNeed: accessor.count * compositionNum * 4, byteStride: 0, }) .unwrapForce(); const rnAccessor = this.__getRnAccessor(accessor, rnBufferView); return rnAccessor; } static __getRnBufferView(rnm2bufferView, rnBuffer) { var _a, _b; const rnBufferView = rnBuffer .takeBufferViewWithByteOffset({ byteLengthToNeed: rnm2bufferView.byteLength, byteStride: (_a = rnm2bufferView.byteStride) !== null && _a !== void 0 ? _a : 0, byteOffset: (_b = rnm2bufferView.byteOffset) !== null && _b !== void 0 ? _b : 0, }) .unwrapForce(); return rnBufferView; } static __getGeometryFromDracoBuffer(draco, decoder, arrayBuffer) { const buffer = new draco.DecoderBuffer(); buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength); const geometryType = decoder.GetEncodedGeometryType(buffer); let dracoGeometry; let decodingStatus; if (geometryType === draco.TRIANGULAR_MESH) { dracoGeometry = new draco.Mesh(); decodingStatus = decoder.DecodeBufferToMesh(buffer, dracoGeometry); } else if (geometryType === draco.POINT_CLOUD) { dracoGeometry = new draco.PointCloud(); decodingStatus = decoder.DecodeBufferToPointCloud(buffer, dracoGeometry); } else { const errorMsg = 'Unknown geometry type.'; _misc_Logger__WEBPACK_IMPORTED_MODULE_44__.Logger.error(errorMsg); } dracoGeometry.geometryType = geometryType; // store if (!decodingStatus.ok() || dracoGeometry.ptr === 0) { let errorMsg = 'Decoding failed: '; errorMsg += decodingStatus.error_msg(); _misc_Logger__WEBPACK_IMPORTED_MODULE_44__.Logger.error(errorMsg); draco.destroy(decoder); draco.destroy(dracoGeometry); return void 0; } draco.destroy(buffer); return dracoGeometry; } static __getIndicesFromDraco(draco, decoder, dracoGeometry, triangleStripDrawMode) { // For mesh, we need to generate the faces. const geometryType = dracoGeometry.geometryType; if (geometryType !== draco.TRIANGULAR_MESH) { return void 0; } let indices; if (triangleStripDrawMode) { const stripsArray = new draco.DracoInt32Array(); decoder.GetTriangleStripsFromMesh(dracoGeometry, stripsArray); indices = new Uint32Array(stripsArray.size()); for (let i = 0; i < stripsArray.size(); ++i) { indices[i] = stripsArray.GetValue(i); } draco.destroy(stripsArray); } else { // TRIANGLES const numFaces = dracoGeometry.num_faces(); const numIndices = numFaces * 3; indices = new Uint32Array(numIndices); const ia = new draco.DracoInt32Array(); for (let i = 0; i < numFaces; ++i) { decoder.GetFaceFromMesh(dracoGeometry, i, ia); const index = i * 3; indices[index] = ia.GetValue(0); indices[index + 1] = ia.GetValue(1); indices[index + 2] = ia.GetValue(2); } draco.destroy(ia); } return indices; } static __decodeDraco(primitive, rnBuffers, gltfModel, map) { const bufferView = gltfModel.bufferViews[primitive.extensions.KHR_draco_mesh_compression.bufferView]; const rnBufferView = this.__getRnBufferView(bufferView, rnBuffers[bufferView.buffer]); const arraybufferOfBufferView = new Uint8Array(rnBufferView.getUint8Array()).buffer; const draco = new DracoDecoderModule(); const decoder = new draco.Decoder(); const dracoGeometry = this.__getGeometryFromDracoBuffer(draco, decoder, arraybufferOfBufferView); if (dracoGeometry == null) { draco.destroy(dracoGeometry); draco.destroy(decoder); return void 0; } const numPoints = dracoGeometry.num_points(); const rnBufferForDraco = this.__createBufferForDecompressedData(primitive, numPoints); // decode indices const primitiveMode = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_7__.PrimitiveMode.from(primitive.mode); let isTriangleStrip = false; if (primitiveMode === _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_7__.PrimitiveMode.TriangleStrip) { isTriangleStrip = true; } const indices = this.__getIndicesFromDraco(draco, decoder, dracoGeometry, isTriangleStrip); const indicesRnAccessor = this.__takeRnBufferViewAndRnAccessorForDraco(primitive.indicesObject, 1, rnBufferForDraco); for (let i = 0; i < indices.length; i++) { indicesRnAccessor.setScalar(i, indices[i], {}); } // decode attributes for (const attributeName in primitive.attributes) { const dracoAttributeId = primitive.extensions.KHR_draco_mesh_compression.attributes[attributeName]; const attributeGltf2Accessor = primitive.attributesObjects[attributeName]; let attributeRnAccessor = undefined; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.not.exist(dracoAttributeId)) { // non-encoded data attributeRnAccessor = this.__getRnBufferViewAndRnAccessor(attributeGltf2Accessor, rnBuffers); } else { // encoded data const compositionNum = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_8__.CompositionType.fromString(attributeGltf2Accessor.type).getNumberOfComponents(); attributeRnAccessor = this.__takeRnBufferViewAndRnAccessorForDraco(attributeGltf2Accessor, compositionNum, rnBufferForDraco); const dracoAttributePointer = decoder.GetAttributeByUniqueId(dracoGeometry, dracoAttributeId); const decompressedAttributeData = new draco.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttributePointer, decompressedAttributeData); for (let i = 0; i < numPoints; i++) { if (compositionNum === 1) { attributeRnAccessor.setScalar(i, decompressedAttributeData.GetValue(i * compositionNum), {}); } else if (compositionNum === 2) { attributeRnAccessor.setVec2(i, decompressedAttributeData.GetValue(i * compositionNum), decompressedAttributeData.GetValue(i * compositionNum + 1), {}); } else if (compositionNum === 3) { attributeRnAccessor.setVec3(i, decompressedAttributeData.GetValue(i * compositionNum), decompressedAttributeData.GetValue(i * compositionNum + 1), decompressedAttributeData.GetValue(i * compositionNum + 2), {}); } else if (compositionNum === 4) { attributeRnAccessor.setVec4(i, decompressedAttributeData.GetValue(i * compositionNum), decompressedAttributeData.GetValue(i * compositionNum + 1), decompressedAttributeData.GetValue(i * compositionNum + 2), decompressedAttributeData.GetValue(i * compositionNum + 3), {}); } } draco.destroy(decompressedAttributeData); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(attributeGltf2Accessor.sparse)) { this.setSparseAccessor(attributeGltf2Accessor, attributeRnAccessor); } const joinedString = _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__.VertexAttribute.toVertexAttributeSemanticJoinedStringAsGltfStyle(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_10__.VertexAttribute.fromString(attributeGltf2Accessor.extras.attributeName)); map.set(joinedString, attributeRnAccessor); } draco.destroy(dracoGeometry); draco.destroy(decoder); return indicesRnAccessor; } static _setupTextureTransform(textureJson, rnMaterial, textureTransformShaderSemantic, textureRotationShaderSemantic) { var _a; if ((_a = textureJson === null || textureJson === void 0 ? void 0 : textureJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_texture_transform) { const transform = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_23__.MutableVector4.fromCopyArray([1.0, 1.0, 0.0, 0.0]); let rotation = 0; const transformJson = textureJson.extensions.KHR_texture_transform; if (transformJson.scale != null) { transform.x = transformJson.scale[0]; transform.y = transformJson.scale[1]; } if (transformJson.offset != null) { transform.z = transformJson.offset[0]; transform.w = transformJson.offset[1]; } if (transformJson.rotation != null) { rotation = transformJson.rotation; } rnMaterial.setParameter(textureTransformShaderSemantic, transform); rnMaterial.setParameter(textureRotationShaderSemantic, rotation); } } static __createBufferForDecompressedData(primitive, numPoints) { let byteLengthOfBufferForDraco = 0; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(primitive.indices)) { const count = primitive.indicesObject.count; byteLengthOfBufferForDraco += count * 4; } const drcAttributes = primitive.extensions.KHR_draco_mesh_compression.attributes; for (const attributeName in primitive.attributes) { if (drcAttributes[attributeName] == null) { // non-encoded data continue; } const accessor = primitive.attributesObjects[attributeName]; const compositionNum = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_8__.CompositionType.fromString(accessor.type).getNumberOfComponents(); const attributeByteLength = numPoints * compositionNum * 4; byteLengthOfBufferForDraco += attributeByteLength; } return new _memory_Buffer__WEBPACK_IMPORTED_MODULE_6__.Buffer({ byteLength: byteLengthOfBufferForDraco, buffer: new ArrayBuffer(byteLengthOfBufferForDraco), name: 'Draco', byteAlign: 4, }); } static __generateVrmNormalizedSkeleton(gltfModel, rnEntities) { // Create a Copy of Skeleton const backupRnJoints = []; const createHierarchyRecursively = (rnm2Node, rnEntity) => { if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnm2Node.children)) { for (const childIdx of rnm2Node.children) { const rnJoint = backupRnJoints[childIdx]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(rnJoint)) { rnEntity.getSceneGraph().addChild(rnJoint.getSceneGraph()); createHierarchyRecursively(gltfModel.nodes[childIdx], rnJoint); } } } }; for (const node of gltfModel.nodes) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject)) { const joints = node.skinObject.joints; for (const jointIdx of joints) { const rnJointEntity = rnEntities[jointIdx]; const newRnJointEntity = (0,_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_40__.createGroupEntity)(); newRnJointEntity.getTransform().localMatrix = rnJointEntity.getTransform().localMatrix; backupRnJoints[jointIdx] = newRnJointEntity; } } } for (const node of gltfModel.nodes) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject)) { const rnJointEntity = backupRnJoints[node.skinObject.joints[0]]; createHierarchyRecursively(node.skinObject.jointsObjects[0], rnJointEntity); } } // Normalize Skeleton for (let i = 0; i < gltfModel.nodes.length; i++) { const node = gltfModel.nodes[i]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject)) { const joints = node.skinObject.joints; for (const jointIdx of joints) { const rnJointEntity = rnEntities[jointIdx]; rnJointEntity.getTransform().localMatrix = _math_Matrix44__WEBPACK_IMPORTED_MODULE_4__.Matrix44.identity(); } for (const jointIdx of joints) { const rnJointEntity = rnEntities[jointIdx]; let parentInvWorldMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_37__.MutableMatrix44.identity(); if (backupRnJoints[jointIdx].getSceneGraph().parent) { parentInvWorldMatrix = backupRnJoints[jointIdx].getSceneGraph().parent.matrix.invert(); } rnJointEntity.getTransform().localPosition = parentInvWorldMatrix.multiplyVector3(backupRnJoints[jointIdx].getSceneGraph().position); } } } // Update Inverse Bind Matrices from the normalized skeleton for (let i = 0; i < gltfModel.nodes.length; i++) { const node = gltfModel.nodes[i]; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(node.skinObject)) { const joints = node.skinObject.joints; const rnSkeletalEntity = rnEntities[i]; const skeletalComponent = rnSkeletalEntity.tryToGetSkeletal(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(skeletalComponent)) { const accessor = skeletalComponent.getInverseBindMatricesAccessor(); for (let j = 0; j < joints.length; j++) { const jointIdx = joints[j]; const rnJointEntity = rnEntities[jointIdx]; accessor.setMat4AsMatrix44(j, rnJointEntity.getSceneGraph().matrix.invert(), {}); } } } } } } function setupPbrMetallicRoughness(pbrMetallicRoughness, material, gltfModel, options, materialJson) { var _a; const isUnlit = ((_a = materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_unlit) != null; const baseColorFactor = pbrMetallicRoughness.baseColorFactor; if (baseColorFactor != null) { material.setParameter('baseColorFactor', _math_Vector4__WEBPACK_IMPORTED_MODULE_13__.Vector4.fromCopyArray4(baseColorFactor)); } // BaseColor Texture const baseColorTexture = pbrMetallicRoughness.baseColorTexture; if (baseColorTexture != null) { const rnTexture = ModelConverter._createTexture(baseColorTexture.texture, gltfModel, { autoDetectTransparency: options === null || options === void 0 ? void 0 : options.autoDetectTextureTransparency, }); const rnSampler = ModelConverter._createSampler(baseColorTexture.texture); material.setTextureParameter('baseColorTexture', rnTexture, rnSampler); if (baseColorTexture.texCoord != null) { material.setParameter('baseColorTexcoordIndex', baseColorTexture.texCoord); } } // Ambient Occlusion Texture const occlusionTexture = materialJson.occlusionTexture; if (occlusionTexture != null && _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.falsy(isUnlit)) { const rnTexture = ModelConverter._createTexture(occlusionTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(occlusionTexture.texture); material.setTextureParameter('occlusionTexture', rnTexture, rnSampler); if (occlusionTexture.texCoord != null) { material.setParameter('occlusionTexcoordIndex', occlusionTexture.texCoord); } if (occlusionTexture.strength != null) { material.setParameter('occlusionStrength', occlusionTexture.strength); } ModelConverter._setupTextureTransform(occlusionTexture, material, 'occlusionTextureTransform', 'occlusionTextureRotation'); } // Metallic Factor let metallicFactor = pbrMetallicRoughness.metallicFactor; metallicFactor = isUnlit ? 0 : metallicFactor !== null && metallicFactor !== void 0 ? metallicFactor : 1; let roughnessFactor = pbrMetallicRoughness.roughnessFactor; roughnessFactor = isUnlit ? 1 : roughnessFactor !== null && roughnessFactor !== void 0 ? roughnessFactor : 1; material.setParameter('metallicRoughnessFactor', _math_Vector2__WEBPACK_IMPORTED_MODULE_20__.Vector2.fromCopyArray2([metallicFactor, roughnessFactor])); // Metallic roughness texture const metallicRoughnessTexture = pbrMetallicRoughness.metallicRoughnessTexture; if (metallicRoughnessTexture != null && _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.falsy(isUnlit)) { const rnTexture = ModelConverter._createTexture(metallicRoughnessTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(metallicRoughnessTexture.texture); material.setTextureParameter('metallicRoughnessTexture', rnTexture, rnSampler); if (metallicRoughnessTexture.texCoord != null) { material.setParameter('metallicRoughnessTexcoordIndex', metallicRoughnessTexture.texCoord); } } // if (Is.exist(metallicRoughnessTexture?.texture?.image?.image)) { // const image = metallicRoughnessTexture!.texture!.image!.image; // const width = image.width; // const height = image.height; // const metallicRoughnessCanvas = convertHTMLImageElementToCanvas(image, width, height); // } // ClearCoat setup_KHR_materials_clearcoat(materialJson, material, gltfModel); // Transmission const transmission = setup_KHR_materials_transmission(materialJson, material, gltfModel); if (!options.transmission) { options.transmission = transmission; } setup_KHR_materials_volume(materialJson, material, gltfModel); setup_KHR_materials_sheen(materialJson, material, gltfModel); setup_KHR_materials_specular(materialJson, material, gltfModel); setup_KHR_materials_ior(materialJson, material, gltfModel); setup_KHR_materials_iridescence(materialJson, material, gltfModel); setup_KHR_materials_anisotropy(materialJson, material, gltfModel); setup_KHR_materials_emissive_strength(materialJson, material, gltfModel); // BaseColor TexCoord Transform setup_KHR_texture_transform(baseColorTexture, material, metallicRoughnessTexture); } function setup_KHR_materials_transmission(materialJson, material, gltfModel) { var _a; const KHR_materials_transmission = (_a = materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_transmission; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_transmission)) { const transmissionFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_transmission.transmissionFactor) ? KHR_materials_transmission.transmissionFactor : 0.0; material.setParameter('transmissionFactor', transmissionFactor); const transmissionTexture = KHR_materials_transmission.transmissionTexture; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(transmissionTexture)) { const rnTransmissionTexture = ModelConverter._createTexture(transmissionTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(transmissionTexture.texture); material.setTextureParameter('transmissionTexture', rnTransmissionTexture, rnSampler); } return true; } return false; } function setup_KHR_materials_clearcoat(materialJson, material, gltfModel) { var _a; const KHR_materials_clearcoat = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_clearcoat; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_clearcoat)) { // ClearCoat Factor const clearCoatFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_clearcoat.clearcoatFactor) ? KHR_materials_clearcoat.clearcoatFactor : 0.0; material.setParameter('clearCoatFactor', clearCoatFactor); // ClearCoat Texture const clearCoatTexture = KHR_materials_clearcoat.clearcoatTexture; if (clearCoatTexture != null) { const rnClearCoatTexture = ModelConverter._createTexture(clearCoatTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(clearCoatTexture.texture); material.setTextureParameter('clearCoatTexture', rnClearCoatTexture, rnSampler); if (clearCoatTexture.texCoord != null) { material.setParameter('clearCoatTexcoordIndex', clearCoatTexture.texCoord); } // ClearCoat Texture Transform ModelConverter._setupTextureTransform(clearCoatTexture, material, 'clearCoatTextureTransform', 'clearCoatTextureRotation'); } // ClearCoat Roughness Factor const clearCoatRoughnessFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_clearcoat.clearcoatRoughnessFactor) ? KHR_materials_clearcoat.clearcoatRoughnessFactor : 0.0; material.setParameter('clearCoatRoughnessFactor', clearCoatRoughnessFactor); // ClearCoat Roughness Texture const clearCoatRoughnessTexture = KHR_materials_clearcoat.clearcoatRoughnessTexture; if (clearCoatRoughnessTexture != null) { const rnClearCoatRoughnessTexture = ModelConverter._createTexture(clearCoatRoughnessTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(clearCoatRoughnessTexture.texture); material.setTextureParameter('clearCoatRoughnessTexture', rnClearCoatRoughnessTexture, rnSampler); if (clearCoatRoughnessTexture.texCoord != null) { material.setParameter('clearCoatRoughnessTexcoordIndex', clearCoatRoughnessTexture.texCoord); } // ClearCoat Roughness Texture Transform ModelConverter._setupTextureTransform(clearCoatRoughnessTexture, material, 'clearCoatRoughnessTextureTransform', 'clearCoatRoughnessTextureRotation'); } // ClearCoat Normal Texture const clearCoatNormalTexture = KHR_materials_clearcoat.clearcoatNormalTexture; if (clearCoatNormalTexture != null) { const rnClearCoatNormalTexture = ModelConverter._createTexture(clearCoatNormalTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(clearCoatNormalTexture.texture); material.setTextureParameter('clearCoatNormalTexture', rnClearCoatNormalTexture, rnSampler); if (clearCoatNormalTexture.texCoord != null) { material.setParameter('clearCoatNormalTexcoordIndex', clearCoatNormalTexture.texCoord); } // ClearCoat Normal Texture Transform ModelConverter._setupTextureTransform(clearCoatNormalTexture, material, 'clearCoatNormalTextureTransform', 'clearCoatNormalTextureRotation'); } } } function setup_KHR_materials_volume(materialJson, material, gltfModel) { var _a; const KHR_materials_volume = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_volume; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_volume)) { const thicknessFactor = KHR_materials_volume.thicknessFactor ? KHR_materials_volume.thicknessFactor : 0.0; if (thicknessFactor != null) { material.setParameter('thicknessFactor', thicknessFactor); } const thicknessTexture = KHR_materials_volume.thicknessTexture; if (thicknessTexture != null) { const rnThicknessTexture = ModelConverter._createTexture(thicknessTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(thicknessTexture.texture); material.setTextureParameter('thicknessTexture', rnThicknessTexture, rnSampler); } const attenuationDistance = KHR_materials_volume.attenuationDistance ? KHR_materials_volume.attenuationDistance : 0.0; if (attenuationDistance != null) { material.setParameter('attenuationDistance', attenuationDistance); } const attenuationColor = KHR_materials_volume.attenuationColor ? _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray3(KHR_materials_volume.attenuationColor) : _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopy3(1.0, 1.0, 1.0); if (attenuationColor != null) { material.setParameter('attenuationColor', attenuationColor); } } } function setup_KHR_texture_transform(baseColorTexture, material, metallicRoughnessTexture) { ModelConverter._setupTextureTransform(baseColorTexture, material, 'baseColorTextureTransform', 'baseColorTextureRotation'); // Metallic Roughness Texcoord Transform ModelConverter._setupTextureTransform(metallicRoughnessTexture, material, 'metallicRoughnessTextureTransform', 'metallicRoughnessTextureRotation'); } function setup_KHR_materials_sheen(materialJson, material, gltfModel) { var _a; const KHR_materials_sheen = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_sheen; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_sheen)) { const sheenColorFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_sheen.sheenColorFactor) ? KHR_materials_sheen.sheenColorFactor : [0.0, 0.0, 0.0]; material.setParameter('sheenColorFactor', _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray3(sheenColorFactor)); const sheenColorTexture = KHR_materials_sheen.sheenColorTexture; if (sheenColorTexture != null) { const rnSheenColorTexture = ModelConverter._createTexture(sheenColorTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(sheenColorTexture.texture); material.setTextureParameter('sheenColorTexture', rnSheenColorTexture, rnSampler); } const sheenRoughnessFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_sheen.sheenRoughnessFactor) ? KHR_materials_sheen.sheenRoughnessFactor : 0.0; material.setParameter('sheenRoughnessFactor', sheenRoughnessFactor); const sheenRoughnessTexture = KHR_materials_sheen.sheenRoughnessTexture; if (sheenRoughnessTexture != null) { const rnSheenRoughnessTexture = ModelConverter._createTexture(sheenRoughnessTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(sheenRoughnessTexture.texture); material.setTextureParameter('sheenRoughnessTexture', rnSheenRoughnessTexture, rnSampler); } } } function setup_KHR_materials_specular(materialJson, material, gltfModel) { var _a; const KHR_materials_specular = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_specular; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_specular)) { const specularFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_specular.specularFactor) ? KHR_materials_specular.specularFactor : 1.0; material.setParameter('specularFactor', specularFactor); const specularTexture = KHR_materials_specular.specularTexture; if (specularTexture != null) { const rnSpecularTexture = ModelConverter._createTexture(specularTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(specularTexture.texture); material.setTextureParameter('specularTexture', rnSpecularTexture, rnSampler); } const SpecularColorFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_specular.specularColorFactor) ? KHR_materials_specular.specularColorFactor : [1.0, 1.0, 1.0]; material.setParameter('specularColorFactor', _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray3(SpecularColorFactor)); const SpecularColorTexture = KHR_materials_specular.specularColorTexture; if (SpecularColorTexture != null) { const rnSpecularColorTexture = ModelConverter._createTexture(SpecularColorTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(SpecularColorTexture.texture); material.setTextureParameter('specularColorTexture', rnSpecularColorTexture, rnSampler); } } } function setup_KHR_materials_ior(materialJson, material, gltfModel) { var _a; const KHR_materials_ior = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_ior; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_ior)) { const ior = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_ior.ior) ? KHR_materials_ior.ior : 1.5; material.setParameter('ior', ior); } } function setup_KHR_materials_iridescence(materialJson, material, gltfModel) { var _a; const KHR_materials_iridescence = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_iridescence; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_iridescence)) { const iridescenceFactor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_iridescence.iridescenceFactor) ? KHR_materials_iridescence.iridescenceFactor : 0.0; material.setParameter('iridescenceFactor', iridescenceFactor); const iridescenceTexture = KHR_materials_iridescence.iridescenceTexture; if (iridescenceTexture != null) { const rnIridescenceTexture = ModelConverter._createTexture(iridescenceTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(iridescenceTexture.texture); material.setTextureParameter('iridescenceTexture', rnIridescenceTexture, rnSampler); } const iridescenceIor = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_iridescence.iridescenceIor) ? KHR_materials_iridescence.iridescenceIor : 1.3; material.setParameter('iridescenceIor', iridescenceIor); const iridescenceThicknessMinimum = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_iridescence.iridescenceThicknessMinimum) ? KHR_materials_iridescence.iridescenceThicknessMinimum : 100.0; material.setParameter('iridescenceThicknessMinimum', iridescenceThicknessMinimum); const iridescenceThicknessMaximum = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_iridescence.iridescenceThicknessMaximum) ? KHR_materials_iridescence.iridescenceThicknessMaximum : 400.0; material.setParameter('iridescenceThicknessMaximum', iridescenceThicknessMaximum); const iridescenceThicknessTexture = KHR_materials_iridescence.iridescenceThicknessTexture; if (iridescenceThicknessTexture != null) { const rnIridescenceThicknessTexture = ModelConverter._createTexture(iridescenceThicknessTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(iridescenceThicknessTexture.texture); material.setTextureParameter('iridescenceThicknessTexture', rnIridescenceThicknessTexture, rnSampler); } } } function setup_KHR_materials_anisotropy(materialJson, material, gltfModel) { var _a; const KHR_materials_anisotropy = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_anisotropy; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_anisotropy)) { const anisotropyStrength = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_anisotropy.anisotropyStrength) ? KHR_materials_anisotropy.anisotropyStrength : 0.0; material.setParameter('anisotropyStrength', anisotropyStrength); const anisotropyRotation = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_anisotropy.anisotropyRotation) ? KHR_materials_anisotropy.anisotropyRotation : 0.0; material.setParameter('anisotropyRotation', _math_Vector2__WEBPACK_IMPORTED_MODULE_20__.Vector2.fromCopy2(Math.cos(anisotropyRotation), Math.sin(anisotropyRotation))); const anisotropyTexture = KHR_materials_anisotropy.anisotropyTexture; if (anisotropyTexture != null) { const rnAnisotropyTexture = ModelConverter._createTexture(anisotropyTexture.texture, gltfModel); const rnSampler = ModelConverter._createSampler(anisotropyTexture.texture); material.setTextureParameter('anisotropyTexture', rnAnisotropyTexture, rnSampler); } } } function setup_KHR_materials_emissive_strength(materialJson, material, gltfModel) { var _a; const KHR_materials_emissive_strength = (_a = materialJson === null || materialJson === void 0 ? void 0 : materialJson.extensions) === null || _a === void 0 ? void 0 : _a.KHR_materials_emissive_strength; if (_misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_emissive_strength)) { const emissiveStrength = _misc_Is__WEBPACK_IMPORTED_MODULE_31__.Is.exist(KHR_materials_emissive_strength.emissiveStrength) ? KHR_materials_emissive_strength.emissiveStrength : 1.0; material.setParameter('emissiveStrength', emissiveStrength); } } /***/ }), /***/ "./src/foundation/importer/RhodoniteImportExtension.ts": /*!*************************************************************!*\ !*** ./src/foundation/importer/RhodoniteImportExtension.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RhodoniteImportExtension: () => (/* binding */ RhodoniteImportExtension) /* harmony export */ }); /* harmony import */ var _effekseer_EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../effekseer/EffekseerComponent */ "./src/effekseer/EffekseerComponent.ts"); /* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components */ "./src/foundation/components/index.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class RhodoniteImportExtension { static importBillboard(gltfJson, groups) { const RHODONITE_billboard = 'RHODONITE_billboard'; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.not.exist(gltfJson.extensionsUsed) || gltfJson.extensionsUsed.findIndex((extension) => { return RHODONITE_billboard === extension; }) === -1) { return; } for (const node_i in gltfJson.nodes) { const group = groups[node_i]; const nodeJson = gltfJson.nodes[node_i]; const sceneGraphComponent = group.getSceneGraph(); if (nodeJson.extensions !== undefined) { if (nodeJson.extensions.RHODONITE_billboard !== undefined) { if (nodeJson.extensions.RHODONITE_billboard.isBillboard === true) { sceneGraphComponent.isBillboard = true; } } } } } static importEffect(gltfJson, rootGroup) { const RHODONITE_effekseer = 'RHODONITE_effekseer'; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.not.exist(gltfJson.extensions) || _misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.not.exist(gltfJson.extensions.RHODONITE_effekseer) || gltfJson.extensionsUsed.findIndex((extension) => { return RHODONITE_effekseer === extension; }) === -1) { return; } const entities = rootGroup.getTagValue('rnEntities'); const effects = gltfJson.extensions.RHODONITE_effekseer .effects; for (const effect of effects) { const entity = entities[effect.node]; const effekseerEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.addComponentToEntity(_effekseer_EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__.EffekseerComponent, entity); const effekseerComponent = effekseerEntity.getEffekseer(); effekseerComponent.playJustAfterLoaded = true; // effekseerComponent.randomSeed = 1; effekseerComponent.isLoop = true; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(effect.bufferView)) { const rnm2Buffer = gltfJson.buffers[0]; rnm2Buffer.bufferPromise.then((arrayBufferOfBuffer) => { const imageUint8Array = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.createUint8ArrayFromBufferViewInfo(gltfJson, effect.bufferView, arrayBufferOfBuffer); effekseerComponent.arrayBuffer = imageUint8Array.buffer.slice(imageUint8Array.byteOffset, imageUint8Array.byteOffset + imageUint8Array.byteLength); effekseerComponent.type = 'efkpkg'; }); } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(effect.uri)) { effekseerComponent.uri = effect.uri; effekseerComponent.type = 'efk'; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('No real effect data.'); } createEffekseerAnimation(effekseerEntity, effect); const Unzip = (__webpack_require__(/*! zlibjs/bin/unzip.min */ "./node_modules/zlibjs/bin/unzip.min.js").Zlib).Unzip; _effekseer_EffekseerComponent__WEBPACK_IMPORTED_MODULE_0__.EffekseerComponent.Unzip = Unzip; } } } function createEffekseerAnimation(entity, effect) { const effekseerComponent = entity.getComponentByComponentTID(_components__WEBPACK_IMPORTED_MODULE_1__.WellKnownComponentTIDs.EffekseerComponentTID); if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(effekseerComponent)) { effekseerComponent.playJustAfterLoaded = true; effekseerComponent.isLoop = true; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(effect.timelines)) { const timelines = effect.timelines; for (const timeline of timelines) { const values = timeline.values; const timelineName = timeline.name; const timelineValues = values.map((value) => { return { input: value.input, event: value.event, }; }); let animationComponent = entity.tryToGetAnimation(); let animationEntity; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.not.exist(animationComponent)) { animationEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_2__.EntityRepository.addComponentToEntity(_components__WEBPACK_IMPORTED_MODULE_1__.AnimationComponent, entity); } animationComponent = animationEntity.getAnimation(); animationComponent.setAnimation(_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(timelineName) ? timelineName : 'Default', 'effekseer', new Float32Array(timelineValues.map((value) => value.input)), new Float32Array(timelineValues.map((value) => { if (value.event === 'play') { return 1; } else if (value.event === 'pause') { return 0; } else { return 0; } })), 1, _definitions__WEBPACK_IMPORTED_MODULE_3__.AnimationInterpolation.Step, true); } } } } /***/ }), /***/ "./src/foundation/importer/Vrm0xImporter.ts": /*!**************************************************!*\ !*** ./src/foundation/importer/Vrm0xImporter.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Vrm0xImporter: () => (/* binding */ Vrm0xImporter) /* harmony export */ }); /* harmony import */ var _Gltf2Importer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Gltf2Importer */ "./src/foundation/importer/Gltf2Importer.ts"); /* harmony import */ var _ModelConverter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ModelConverter */ "./src/foundation/importer/ModelConverter.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _textures_Texture__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../textures/Texture */ "./src/foundation/textures/Texture.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _physics_VRMSpring_VRMSpringBonePhysicsStrategy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../physics/VRMSpring/VRMSpringBonePhysicsStrategy */ "./src/foundation/physics/VRMSpring/VRMSpringBonePhysicsStrategy.ts"); /* harmony import */ var _components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/Physics/PhysicsComponent */ "./src/foundation/components/Physics/PhysicsComponent.ts"); /* harmony import */ var _physics_VRMSpring_SphereCollider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../physics/VRMSpring/SphereCollider */ "./src/foundation/physics/VRMSpring/SphereCollider.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _physics_VRMSpring_VRMColliderGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../physics/VRMSpring/VRMColliderGroup */ "./src/foundation/physics/VRMSpring/VRMColliderGroup.ts"); /* harmony import */ var _physics_VRMSpring_VRMSpring__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../physics/VRMSpring/VRMSpring */ "./src/foundation/physics/VRMSpring/VRMSpring.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _components_Vrm_VrmComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../components/Vrm/VrmComponent */ "./src/foundation/components/Vrm/VrmComponent.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _physics_VRMSpring_VRMSpringBone__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../physics/VRMSpring/VRMSpringBone */ "./src/foundation/physics/VRMSpring/VRMSpringBone.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); /** * The VRM Importer class. * This class will be integrated into GltfImporter. */ class Vrm0xImporter { constructor() { } /** * Import VRM file. */ static async importFromUri(uri, options) { var _a, _b; options = this._getOptions(options); const result = await _Gltf2Importer__WEBPACK_IMPORTED_MODULE_0__.Gltf2Importer.importFromUri(uri, options); if (result._isErr()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_12__.Err({ message: 'Failed to import VRM file.', error: result, }); } (0,_misc_Result__WEBPACK_IMPORTED_MODULE_12__.assertIsOk)(result); const gltfModel = result.get(); const textures = Vrm0xImporter._createTextures(gltfModel); const samplers = Vrm0xImporter._createSamplers(gltfModel); const defaultMaterialHelperArgumentArray = (_b = (_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions) === null || _b === void 0 ? void 0 : _b.defaultMaterialHelperArgumentArray; if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(defaultMaterialHelperArgumentArray)) { defaultMaterialHelperArgumentArray[0].textures = textures; defaultMaterialHelperArgumentArray[0].samplers = samplers; } Vrm0xImporter._initializeMaterialProperties(gltfModel, textures.length); // setup rootGroup let rootGroups; const rootGroupMain = _ModelConverter__WEBPACK_IMPORTED_MODULE_1__.ModelConverter.convertToRhodoniteObject(gltfModel); const existOutline = Vrm0xImporter._existOutlineMaterial(gltfModel.extensions.VRM); if (existOutline) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(defaultMaterialHelperArgumentArray)) { defaultMaterialHelperArgumentArray[0].isOutline = true; } const rootGroupOutline = _ModelConverter__WEBPACK_IMPORTED_MODULE_1__.ModelConverter.convertToRhodoniteObject(gltfModel); rootGroups = [rootGroupMain, rootGroupOutline]; } else { rootGroups = [rootGroupMain]; } Vrm0xImporter._readSpringBone(gltfModel); Vrm0xImporter._readVRMHumanoidInfo(gltfModel, rootGroupMain); return new _misc_Result__WEBPACK_IMPORTED_MODULE_12__.Ok(rootGroups); } /** * For VRM file only * Generate JSON. */ static async importJsonOfVRM(uri, options) { options = this._getOptions(options); const result = await _Gltf2Importer__WEBPACK_IMPORTED_MODULE_0__.Gltf2Importer.importFromUri(uri, options); if (result._isErr()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_12__.Err({ message: 'Failed to import VRM file.', error: result, }); } (0,_misc_Result__WEBPACK_IMPORTED_MODULE_12__.assertIsOk)(result); const gltfJson = result.get(); Vrm0xImporter._readVRMHumanoidInfo(gltfJson); return new _misc_Result__WEBPACK_IMPORTED_MODULE_12__.Ok(gltfJson); } static async __importVRM0x(gltfModel, renderPasses) { var _a, _b, _c, _d, _e, _f; // process defaultMaterialHelperArgumentArray const defaultMaterialHelperArgumentArray = (_b = (_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions) === null || _b === void 0 ? void 0 : _b.defaultMaterialHelperArgumentArray; const textures = this._createTextures(gltfModel); const samplers = this._createSamplers(gltfModel); if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(defaultMaterialHelperArgumentArray)) { defaultMaterialHelperArgumentArray[0].textures = (_c = defaultMaterialHelperArgumentArray[0].textures) !== null && _c !== void 0 ? _c : textures; defaultMaterialHelperArgumentArray[0].samplers = (_d = defaultMaterialHelperArgumentArray[0].samplers) !== null && _d !== void 0 ? _d : samplers; defaultMaterialHelperArgumentArray[0].isLighting = (_e = defaultMaterialHelperArgumentArray[0].isLighting) !== null && _e !== void 0 ? _e : true; } this._initializeMaterialProperties(gltfModel, textures.length); // get rootGroup let rootGroup; const existOutline = this._existOutlineMaterial(gltfModel.extensions.VRM); if (existOutline) { renderPasses[1] = (_f = renderPasses[1]) !== null && _f !== void 0 ? _f : new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_3__.RenderPass(); const renderPassOutline = renderPasses[1]; renderPassOutline.toClearColorBuffer = false; renderPassOutline.toClearDepthBuffer = false; gltfModel.extensions.VRM.rnExtension = { renderPassOutline: renderPassOutline, }; rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_1__.ModelConverter.convertToRhodoniteObject(gltfModel); renderPassOutline.addEntities([rootGroup]); } else { rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_1__.ModelConverter.convertToRhodoniteObject(gltfModel); } const renderPassMain = renderPasses[0]; renderPassMain.tryToSetUniqueName('VRM Main RenderPass', true); renderPassMain.addEntities([rootGroup]); this._readSpringBone(gltfModel); this._readVRMHumanoidInfo(gltfModel, rootGroup); this._readBlendShapeGroup(gltfModel, rootGroup); } static _readBlendShapeGroup(gltfModel, rootEntity) { const vrmExpressions = []; const blendShapeGroups = gltfModel.extensions.VRM.blendShapeMaster.blendShapeGroups; for (const blendShapeGroup of blendShapeGroups) { const vrmExpression = { name: blendShapeGroup.presetName, isBinary: blendShapeGroup.isBinary, binds: blendShapeGroup.binds.map((bind) => { for (let i = 0; i < gltfModel.nodes.length; i++) { const node = gltfModel.nodes[i]; if (node.mesh === bind.mesh) { const rnEntity = gltfModel.extras.rnEntities[i]; return { entityIdx: rnEntity.entityUID, blendShapeIdx: bind.index, weight: bind.weight / 100, }; } } throw new Error('Not Found node in blendShapeGroup Process'); }), }; vrmExpressions.push(vrmExpression); } const vrmEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_5__.EntityRepository.addComponentToEntity(_components_Vrm_VrmComponent__WEBPACK_IMPORTED_MODULE_13__.VrmComponent, rootEntity); vrmEntity.getVrm().setVrmExpressions(vrmExpressions); vrmEntity.getVrm()._version = '0.x'; } static _readVRMHumanoidInfo(gltfModel, rootEntity) { const humanBones = gltfModel.extensions.VRM.humanoid.humanBones; const mapNameNodeId = new Map(); // const mapNameNodeName: Map = new Map(); for (const bone of humanBones) { mapNameNodeId.set(bone.bone, bone.node); const boneNode = gltfModel.nodes[bone.node]; bone.name = boneNode.name; } if (rootEntity != null) { rootEntity.tryToSetTag({ tag: 'humanoid_map_name_nodeId', value: mapNameNodeId, }); } } static _readSpringBone(gltfModel) { const colliderGroups = []; for (const colliderGroupIdx in gltfModel.extensions.VRM.secondaryAnimation.colliderGroups) { const colliderGroup = gltfModel.extensions.VRM.secondaryAnimation.colliderGroups[colliderGroupIdx]; const vrmColliderGroup = new _physics_VRMSpring_VRMColliderGroup__WEBPACK_IMPORTED_MODULE_10__.VRMColliderGroup(); colliderGroups.push(vrmColliderGroup); const colliders = []; const baseSg = gltfModel.asset.extras.rnEntities[colliderGroup.node].getSceneGraph(); for (const collider of colliderGroup.colliders) { const sphereCollider = new _physics_VRMSpring_SphereCollider__WEBPACK_IMPORTED_MODULE_8__.SphereCollider(); sphereCollider.baseSceneGraph = baseSg; sphereCollider.position = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.fromCopyArray([ collider.offset.x, collider.offset.y, collider.offset.z, ]); sphereCollider.radius = collider.radius; colliders.push(sphereCollider); } vrmColliderGroup.sphereColliders = colliders; } const boneGroups = []; for (const boneGroup of gltfModel.extensions.VRM.secondaryAnimation.boneGroups) { const jointRootIndex = boneGroup.bones[0]; const jointRootEntity = gltfModel.asset.extras.rnEntities[jointRootIndex]; const vrmSpringBoneGroup = new _physics_VRMSpring_VRMSpring__WEBPACK_IMPORTED_MODULE_11__.VRMSpring(jointRootEntity.getSceneGraph()); vrmSpringBoneGroup.tryToSetUniqueName(boneGroup.comment, true); vrmSpringBoneGroup.colliderGroups = boneGroup.colliderGroups.map((colliderGroupIndex) => { return colliderGroups[colliderGroupIndex]; }); const addedEntities = []; for (const idxOfArray in boneGroup.bones) { const boneNodeIndex = boneGroup.bones[idxOfArray]; const entity = gltfModel.asset.extras.rnEntities[boneNodeIndex]; // Find and add the missing joints from spring.joints. this.__addSpringBoneRecursively(vrmSpringBoneGroup, entity, boneGroup, addedEntities); } boneGroups.push(vrmSpringBoneGroup); } for (const boneGroup of boneGroups) { this.__addPhysicsComponent(boneGroup, boneGroup.rootBone); } } static __addSpringBoneRecursively(vrmSpring, entity, boneGroup, addedEntities) { const sg = entity.getSceneGraph(); const children = sg.children; if (!addedEntities.includes(entity)) { const springBone = new _physics_VRMSpring_VRMSpringBone__WEBPACK_IMPORTED_MODULE_15__.VRMSpringBone(entity); springBone.dragForce = boneGroup.dragForce; springBone.stiffnessForce = boneGroup.stiffiness; springBone.gravityPower = boneGroup.gravityPower; springBone.gravityDir = _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.fromCopyArray([ boneGroup.gravityDir.x, boneGroup.gravityDir.y, boneGroup.gravityDir.z, ]); springBone.hitRadius = boneGroup.hitRadius; vrmSpring.bones.push(springBone); addedEntities.push(entity); } for (const child of children) { this.__addSpringBoneRecursively(vrmSpring, child.entity, boneGroup, addedEntities); } } static __addPhysicsComponent(boneGroup, sg) { const entity = sg.entity; const newEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_5__.EntityRepository.addComponentToEntity(_components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_7__.PhysicsComponent, entity); const physicsComponent = newEntity.getPhysics(); const strategy = new _physics_VRMSpring_VRMSpringBonePhysicsStrategy__WEBPACK_IMPORTED_MODULE_6__.VRMSpringBonePhysicsStrategy(); strategy.setSpring(boneGroup); physicsComponent.setStrategy(strategy); } static _createTextures(gltfModel) { if (!gltfModel.textures) gltfModel.textures = []; const gltfTextures = gltfModel.textures; const rnTextures = []; for (let i = 0; i < gltfTextures.length; i++) { const rnTexture = _ModelConverter__WEBPACK_IMPORTED_MODULE_1__.ModelConverter._createTexture(gltfTextures[i], gltfModel); rnTextures[i] = rnTexture; } const dummyWhiteTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_4__.Texture(); dummyWhiteTexture.generate1x1TextureFrom(); rnTextures.push(dummyWhiteTexture); const dummyBlackTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_4__.Texture(); dummyBlackTexture.generate1x1TextureFrom('rgba(0, 0, 0, 1)'); rnTextures.push(dummyBlackTexture); return rnTextures; } static _createSamplers(gltfModel) { if (!gltfModel.textures) gltfModel.textures = []; const gltfTextures = gltfModel.textures; const rnSamplers = []; for (let i = 0; i < gltfTextures.length; i++) { const rnSampler = _ModelConverter__WEBPACK_IMPORTED_MODULE_1__.ModelConverter._createSampler(gltfTextures[i]); rnSamplers[i] = rnSampler; } const dummySampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_14__.Sampler({ wrapS: _definitions__WEBPACK_IMPORTED_MODULE_16__.TextureParameter.ClampToEdge, wrapT: _definitions__WEBPACK_IMPORTED_MODULE_16__.TextureParameter.ClampToEdge, minFilter: _definitions__WEBPACK_IMPORTED_MODULE_16__.TextureParameter.Linear, magFilter: _definitions__WEBPACK_IMPORTED_MODULE_16__.TextureParameter.Linear, }); dummySampler.create(); rnSamplers.push(dummySampler); rnSamplers.push(dummySampler); return rnSamplers; } static _existOutlineMaterial(extensionsVRM) { const materialProperties = extensionsVRM.materialProperties; if (materialProperties != null) { for (const materialProperty of materialProperties) { if (materialProperty.floatProperties._OutlineWidthMode !== 0) { return true; } } } return false; } static _initializeMaterialProperties(gltfModel, texturesLength) { const materialProperties = gltfModel.extensions.VRM.materialProperties; for (const materialProperty of materialProperties) { if (materialProperty.shader === 'VRM/MToon') { this.__initializeMToonMaterialProperties(gltfModel, texturesLength); break; } } } static __initializeMToonMaterialProperties(gltfModel, texturesLength) { const materialProperties = gltfModel.extensions.VRM.materialProperties; const dummyWhiteTextureNumber = texturesLength - 2; const dummyBlackTextureNumber = texturesLength - 1; for (let i = 0; i < materialProperties.length; i++) { const floatProperties = materialProperties[i].floatProperties; this.__initializeForUndefinedProperty(floatProperties, '_BlendMode', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_BumpScale', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_CullMode', 2.0); this.__initializeForUndefinedProperty(floatProperties, '_Cutoff', 0.5); this.__initializeForUndefinedProperty(floatProperties, '_DebugMode', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_DstBlend', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_IndirectLightIntensity', 0.1); this.__initializeForUndefinedProperty(floatProperties, '_LightColorAttenuation', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_OutlineColorMode', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_OutlineCullMode', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_OutlineLightingMix', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_OutlineScaledMaxDistance', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_OutlineWidth', 0.5); this.__initializeForUndefinedProperty(floatProperties, '_OutlineWidthMode', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_ReceiveShadowRate', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_RimFresnelPower', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_RimLift', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_RimLightingMix', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_ShadeShift', 0.0); this.__initializeForUndefinedProperty(floatProperties, '_ShadeToony', 0.9); this.__initializeForUndefinedProperty(floatProperties, '_ShadingGradeRate', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_SrcBlend', 1.0); this.__initializeForUndefinedProperty(floatProperties, '_ZWrite', 1.0); // this.__initializeForUndefinedProperty(floatProperties,"_UvAnimScrollX", 0.0); // this.__initializeForUndefinedProperty(floatProperties,"_UvAnimScrollY", 0.0); // this.__initializeForUndefinedProperty(floatProperties,"_UvAnimRotation", 0.0); const vectorProperties = materialProperties[i].vectorProperties; this.__initializeForUndefinedProperty(vectorProperties, '_Color', [1, 1, 1, 1]); this.__initializeForUndefinedProperty(vectorProperties, '_EmissionColor', [0, 0, 0]); this.__initializeForUndefinedProperty(vectorProperties, '_OutlineColor', [0, 0, 0, 1]); this.__initializeForUndefinedProperty(vectorProperties, '_ShadeColor', [0.97, 0.81, 0.86, 1]); this.__initializeForUndefinedProperty(vectorProperties, '_RimColor', [0, 0, 0]); // this.__initializeForUndefinedProperty(vectorProperties, "_BumpMap", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_EmissionMap", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_MainTex", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_OutlineWidthTexture", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_ReceiveShadowTexture", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_ShadeTexture", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_ShadingGradeTexture", [0, 0, 1, 1]); // this.__initializeForUndefinedProperty(vectorProperties, "_SphereAdd", [0, 0, 1, 1]); // set num of texture array const textureProperties = materialProperties[i].textureProperties; this.__initializeForUndefinedProperty(textureProperties, '_BumpMap', dummyWhiteTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_EmissionMap', dummyBlackTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_MainTex', dummyWhiteTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_OutlineWidthTexture', dummyWhiteTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_ReceiveShadowTexture', dummyWhiteTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_RimTexture', dummyBlackTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_ShadeTexture', dummyWhiteTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_ShadingGradeTexture', dummyWhiteTextureNumber); this.__initializeForUndefinedProperty(textureProperties, '_SphereAdd', dummyBlackTextureNumber); // this.__initializeForUndefinedProperty(textureProperties, "_UvAnimMaskTexture", dummyWhiteTextureNumber); } for (let i = 0; i < gltfModel.materials.length; i++) { const material = gltfModel.materials[i]; if (material.extras == null) { material.extras = {}; } material.extras.vrm0xMaterialProperty = materialProperties[i]; } } static __initializeForUndefinedProperty(object, propertyName, initialValue) { if (object[propertyName] == null) object[propertyName] = initialValue; } static _getOptions(options) { if (options != null) { for (const file in options.files) { const fileName = file.split('.vrm')[0]; if (fileName) { const arraybuffer = options.files[file]; options.files[fileName + '.glb'] = arraybuffer; delete options.files[file]; } } //set default values options.__isImportVRM0x = true; if (options.defaultMaterialHelperArgumentArray == null) { options.defaultMaterialHelperArgumentArray = [{}]; } if (!options.defaultMaterialHelperArgumentArray[0].isMorphing) { options.maxMorphTargetNumber = 0; } } else { options = { files: {}, loaderExtension: undefined, defaultMaterialHelperName: undefined, defaultMaterialHelperArgumentArray: [ { isLighting: true, isMorphing: true, isSkinning: true }, ], statesOfElements: [ { targets: [], states: { enable: [], functions: {}, }, isTransparent: true, opacity: 1.0, isTextureImageToLoadPreMultipliedAlpha: false, }, ], __isImportVRM0x: true, __importedType: 'vrm0x', }; } return options; } } /***/ }), /***/ "./src/foundation/importer/VrmImporter.ts": /*!************************************************!*\ !*** ./src/foundation/importer/VrmImporter.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmImporter: () => (/* binding */ VrmImporter) /* harmony export */ }); /* harmony import */ var _ModelConverter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ModelConverter */ "./src/foundation/importer/ModelConverter.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _textures_Texture__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../textures/Texture */ "./src/foundation/textures/Texture.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _physics_VRMSpring_VRMSpringBonePhysicsStrategy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../physics/VRMSpring/VRMSpringBonePhysicsStrategy */ "./src/foundation/physics/VRMSpring/VRMSpringBonePhysicsStrategy.ts"); /* harmony import */ var _components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/Physics/PhysicsComponent */ "./src/foundation/components/Physics/PhysicsComponent.ts"); /* harmony import */ var _physics_VRMSpring_SphereCollider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../physics/VRMSpring/SphereCollider */ "./src/foundation/physics/VRMSpring/SphereCollider.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _physics_VRMSpring_VRMColliderGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../physics/VRMSpring/VRMColliderGroup */ "./src/foundation/physics/VRMSpring/VRMColliderGroup.ts"); /* harmony import */ var _physics_VRMSpring_VRMSpring__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../physics/VRMSpring/VRMSpring */ "./src/foundation/physics/VRMSpring/VRMSpring.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _Gltf2Importer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Gltf2Importer */ "./src/foundation/importer/Gltf2Importer.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components */ "./src/foundation/components/index.ts"); /* harmony import */ var _physics_VRMSpring_VRMSpringBone__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../physics/VRMSpring/VRMSpringBone */ "./src/foundation/physics/VRMSpring/VRMSpringBone.ts"); /* harmony import */ var _physics_VRMSpring_CapsuleCollider__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../physics/VRMSpring/CapsuleCollider */ "./src/foundation/physics/VRMSpring/CapsuleCollider.ts"); /* harmony import */ var _components_Constraint__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/Constraint */ "./src/foundation/components/Constraint/index.ts"); /* harmony import */ var _constraints_VrmRollConstraint__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../constraints/VrmRollConstraint */ "./src/foundation/constraints/VrmRollConstraint.ts"); /* harmony import */ var _constraints_VrmAimConstraint__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../constraints/VrmAimConstraint */ "./src/foundation/constraints/VrmAimConstraint.ts"); /* harmony import */ var _constraints_VrmRotationConstraint__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../constraints/VrmRotationConstraint */ "./src/foundation/constraints/VrmRotationConstraint.ts"); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* eslint-disable prettier/prettier */ class VrmImporter { constructor() { } static async __importVRM(gltfModel, renderPasses) { var _a, _b, _c, _d, _e, _f, _g; // process defaultMaterialHelperArgumentArray const defaultMaterialHelperArgumentArray = (_b = (_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions) === null || _b === void 0 ? void 0 : _b.defaultMaterialHelperArgumentArray; const textures = this._createTextures(gltfModel); const samplers = this._createSamplers(gltfModel); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(defaultMaterialHelperArgumentArray)) { defaultMaterialHelperArgumentArray[0].textures = (_c = defaultMaterialHelperArgumentArray[0].textures) !== null && _c !== void 0 ? _c : textures; defaultMaterialHelperArgumentArray[0].samplers = (_d = defaultMaterialHelperArgumentArray[0].samplers) !== null && _d !== void 0 ? _d : samplers; defaultMaterialHelperArgumentArray[0].isLighting = (_e = defaultMaterialHelperArgumentArray[0].isLighting) !== null && _e !== void 0 ? _e : true; } const existOutline = this.__initializeMToonMaterialProperties(gltfModel, textures.length); // get rootGroup let rootGroup; if (existOutline) { renderPasses[1] = (_f = renderPasses[1]) !== null && _f !== void 0 ? _f : new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_2__.RenderPass(); const renderPassOutline = renderPasses[1]; renderPassOutline.toClearColorBuffer = false; renderPassOutline.toClearDepthBuffer = false; gltfModel.extensions.VRM = {}; gltfModel.extensions.VRM.rnExtension = { renderPassOutline: renderPassOutline, }; rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter.convertToRhodoniteObject(gltfModel); renderPassOutline.addEntities([rootGroup]); } else { rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter.convertToRhodoniteObject(gltfModel); } const renderPassMain = renderPasses[0]; renderPassMain.tryToSetUniqueName('VRM Main RenderPass', true); renderPassMain.addEntities([rootGroup]); this._readSpringBone(gltfModel); this._readVRMHumanoidInfo(gltfModel, rootGroup); this._readExpressions(gltfModel, rootGroup); this._readConstraints(gltfModel); if (((_g = gltfModel.asset.extras) === null || _g === void 0 ? void 0 : _g.rnLoaderOptions) != null) { // remove reference to defaultMaterialHelperArgumentArray gltfModel.asset.extras.rnLoaderOptions.defaultMaterialHelperArgumentArray = []; } } static _readConstraints(gltfModel) { var _a, _b; for (let i = 0; i < gltfModel.nodes.length; i++) { const node = gltfModel.nodes[i]; const constraint = (_b = (_a = node.extensions) === null || _a === void 0 ? void 0 : _a.VRMC_node_constraint) === null || _b === void 0 ? void 0 : _b.constraint; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(constraint)) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(constraint.roll)) { const roll = constraint.roll; const dstEntity_ = gltfModel.extras.rnEntities[i]; const srcEntity = gltfModel.extras.rnEntities[roll.source]; const dstEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__.EntityRepository.addComponentToEntity(_components_Constraint__WEBPACK_IMPORTED_MODULE_17__.ConstraintComponent, dstEntity_); const rollConstraint = new _constraints_VrmRollConstraint__WEBPACK_IMPORTED_MODULE_18__.VrmRollConstraint(srcEntity, roll.rollAxis, _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(roll.weight) ? roll.weight : 1.0, dstEntity); dstEntity.getConstraint().setConstraint(rollConstraint); } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(constraint.aim)) { const aim = constraint.aim; const dstEntity_ = gltfModel.extras.rnEntities[i]; const srcEntity = gltfModel.extras.rnEntities[aim.source]; const dstEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__.EntityRepository.addComponentToEntity(_components_Constraint__WEBPACK_IMPORTED_MODULE_17__.ConstraintComponent, dstEntity_); const aimConstraint = new _constraints_VrmAimConstraint__WEBPACK_IMPORTED_MODULE_19__.VrmAimConstraint(srcEntity, aim.aimAxis, _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(aim.weight) ? aim.weight : 1.0, dstEntity); dstEntity.getConstraint().setConstraint(aimConstraint); } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(constraint.rotation)) { const rotation = constraint.rotation; const dstEntity_ = gltfModel.extras.rnEntities[i]; const srcEntity = gltfModel.extras.rnEntities[rotation.source]; const dstEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__.EntityRepository.addComponentToEntity(_components_Constraint__WEBPACK_IMPORTED_MODULE_17__.ConstraintComponent, dstEntity_); const rotationConstraint = new _constraints_VrmRotationConstraint__WEBPACK_IMPORTED_MODULE_20__.VrmRotationConstraint(srcEntity, _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(rotation.weight) ? rotation.weight : 1.0, dstEntity); dstEntity.getConstraint().setConstraint(rotationConstraint); } } } } static _readExpressions(gltfModel, rootEntity) { var _a, _b; const vrmExpressions = []; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist((_b = (_a = gltfModel.extensions.VRMC_vrm) === null || _a === void 0 ? void 0 : _a.expressions) === null || _b === void 0 ? void 0 : _b.preset)) { return; } const expressions = gltfModel.extensions.VRMC_vrm.expressions.preset; for (const expressionName in expressions) { const expression = expressions[expressionName]; let binds = []; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(expression.morphTargetBinds)) { binds = expression.morphTargetBinds.map((bind) => { const rnEntity = gltfModel.extras.rnEntities[bind.node]; return { entityIdx: rnEntity.entityUID, blendShapeIdx: bind.index, weight: bind.weight, }; }); } const vrmExpression = { name: expressionName, isBinary: expression.isBinary, binds: binds, }; vrmExpressions.push(vrmExpression); } const vrmEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__.EntityRepository.addComponentToEntity(_components__WEBPACK_IMPORTED_MODULE_14__.VrmComponent, rootEntity); vrmEntity.getVrm().setVrmExpressions(vrmExpressions); vrmEntity.getVrm()._version = '1.0'; } static _readVRMHumanoidInfo(gltfModel, rootEntity) { const humanBones = gltfModel.extensions.VRMC_vrm.humanoid.humanBones; const mapNameNodeId = new Map(); for (const boneName in humanBones) { const bone = humanBones[boneName]; mapNameNodeId.set(boneName, bone.node); } if (rootEntity != null) { rootEntity.tryToSetTag({ tag: 'humanoid_map_name_nodeId', value: mapNameNodeId, }); } } static _readSpringBone(gltfModel) { var _a, _b; const colliderGroups = []; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist((_a = gltfModel.extensions.VRMC_springBone) === null || _a === void 0 ? void 0 : _a.colliderGroups)) { for (const colliderGroupIdx in gltfModel.extensions.VRMC_springBone.colliderGroups) { const colliderGroup = gltfModel.extensions.VRMC_springBone.colliderGroups[colliderGroupIdx]; const vrmColliderGroup = new _physics_VRMSpring_VRMColliderGroup__WEBPACK_IMPORTED_MODULE_9__.VRMColliderGroup(); colliderGroups.push(vrmColliderGroup); for (const colliderIdx of colliderGroup.colliders) { const collider = gltfModel.extensions.VRMC_springBone.colliders[colliderIdx]; const baseSg = gltfModel.asset.extras.rnEntities[collider.node].getSceneGraph(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(collider.shape.sphere)) { const sphereCollider = new _physics_VRMSpring_SphereCollider__WEBPACK_IMPORTED_MODULE_7__.SphereCollider(); sphereCollider.baseSceneGraph = baseSg; sphereCollider.position = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray([ collider.shape.sphere.offset[0], collider.shape.sphere.offset[1], collider.shape.sphere.offset[2], ]); sphereCollider.radius = collider.shape.sphere.radius; vrmColliderGroup.sphereColliders.push(sphereCollider); } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(collider.shape.capsule)) { const capsuleCollider = new _physics_VRMSpring_CapsuleCollider__WEBPACK_IMPORTED_MODULE_16__.CapsuleCollider(); capsuleCollider.baseSceneGraph = baseSg; capsuleCollider.position = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray([ collider.shape.capsule.offset[0], collider.shape.capsule.offset[1], collider.shape.capsule.offset[2], ]); capsuleCollider.radius = collider.shape.capsule.radius; capsuleCollider.tail = _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray([ collider.shape.capsule.tail[0], collider.shape.capsule.tail[1], collider.shape.capsule.tail[2], ]); vrmColliderGroup.capsuleColliders.push(capsuleCollider); } } } } const springs = []; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist((_b = gltfModel.extensions.VRMC_springBone) === null || _b === void 0 ? void 0 : _b.springs)) { for (const spring of gltfModel.extensions.VRMC_springBone.springs) { const jointRoot = spring.joints[0]; const jointRootEntity = gltfModel.asset.extras.rnEntities[jointRoot.node]; const vrmSpring = new _physics_VRMSpring_VRMSpring__WEBPACK_IMPORTED_MODULE_10__.VRMSpring(jointRootEntity.getSceneGraph()); vrmSpring.tryToSetUniqueName(spring.name, true); const colliderGroupIndices = _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(spring.colliderGroups) ? spring.colliderGroups : []; vrmSpring.colliderGroups = colliderGroupIndices.map((colliderGroupIdx) => { return colliderGroups[colliderGroupIdx]; }); const addedEntities = []; for (const jointIdx in spring.joints) { const joint = spring.joints[jointIdx]; const entity = gltfModel.asset.extras.rnEntities[joint.node]; const springBone = new _physics_VRMSpring_VRMSpringBone__WEBPACK_IMPORTED_MODULE_15__.VRMSpringBone(entity); springBone.dragForce = joint.dragForce; springBone.stiffnessForce = joint.stiffness; springBone.gravityPower = _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(joint.gravityPower) ? joint.gravityPower : 1; springBone.gravityDir = _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(joint.gravityDir) ? _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray3([ joint.gravityDir[0], joint.gravityDir[1], joint.gravityDir[2], ]) : _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray3([0, -1, 0]); springBone.hitRadius = joint.hitRadius; vrmSpring.bones.push(springBone); addedEntities.push(entity); } // Find and add the missing joints from spring.joints. this.__addSpringBoneRecursively(vrmSpring, jointRootEntity, addedEntities); springs.push(vrmSpring); } } for (const spring of springs) { this.__addPhysicsComponent(spring, spring.rootBone); } } static __addSpringBoneRecursively(vrmSpring, entity, addedEntities) { const sg = entity.getSceneGraph(); const children = sg.children; if (!addedEntities.includes(entity)) { const springBone = new _physics_VRMSpring_VRMSpringBone__WEBPACK_IMPORTED_MODULE_15__.VRMSpringBone(entity); vrmSpring.bones.push(springBone); addedEntities.push(entity); } for (const child of children) { this.__addSpringBoneRecursively(vrmSpring, child.entity, addedEntities); } } static __addPhysicsComponent(spring, sg) { const entity = sg.entity; const newEntity = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_4__.EntityRepository.addComponentToEntity(_components_Physics_PhysicsComponent__WEBPACK_IMPORTED_MODULE_6__.PhysicsComponent, entity); const physicsComponent = newEntity.getPhysics(); const strategy = new _physics_VRMSpring_VRMSpringBonePhysicsStrategy__WEBPACK_IMPORTED_MODULE_5__.VRMSpringBonePhysicsStrategy(); strategy.setSpring(spring); physicsComponent.setStrategy(strategy); } static _createTextures(gltfModel) { if (!gltfModel.textures) gltfModel.textures = []; const gltfTextures = gltfModel.textures; const rnTextures = []; for (let i = 0; i < gltfTextures.length; i++) { const rnTexture = _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter._createTexture(gltfTextures[i], gltfModel); rnTextures[i] = rnTexture; } const dummyWhiteTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_3__.Texture(); dummyWhiteTexture.generate1x1TextureFrom(); rnTextures.push(dummyWhiteTexture); const dummyBlackTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_3__.Texture(); dummyBlackTexture.generate1x1TextureFrom('rgba(0, 0, 0, 1)'); rnTextures.push(dummyBlackTexture); return rnTextures; } static _createSamplers(gltfModel) { if (!gltfModel.textures) gltfModel.textures = []; const gltfTextures = gltfModel.textures; const rnSamplers = []; for (let i = 0; i < gltfTextures.length; i++) { const rnTexture = _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter._createSampler(gltfTextures[i]); rnSamplers[i] = rnTexture; } const dummySampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_13__.Sampler({ wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_21__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_21__.TextureParameter.ClampToEdge, minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_21__.TextureParameter.Linear, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_21__.TextureParameter.Linear, }); dummySampler.create(); rnSamplers.push(dummySampler); rnSamplers.push(dummySampler); return rnSamplers; } static __initializeMToonMaterialProperties(gltfModel, texturesLength) { var _a, _b, _c; let isOutline = false; for (const material of gltfModel.materials) { const mtoonMaterial = (_a = material.extensions) === null || _a === void 0 ? void 0 : _a.VRMC_materials_mtoon; if (mtoonMaterial == null) { continue; } const dummyWhiteTextureNumber = -1; const dummyBlackTextureNumber = -1; const vrm0xMaterialProperty = { name: 'vrm0xMaterialProperty', renderQueue: 0, // dummy value shader: 'VRM/MToon', floatProperties: { _BlendMode: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.alphaMode) ? 0 : material.alphaMode === 'OPAQUE' ? 0 : material.alphaMode === 'MASK' ? 1 : material.alphaMode === 'BLEND' ? 2 : 3, _CullMode: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.doubleSided) ? 2 : material.doubleSided ? 0 : 2, _BumpScale: 1.0, _Cutoff: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.alphaCutoff) ? 0.5 : material.alphaCutoff, _DebugMode: 0, _SrcBlend: 5, _DstBlend: 10, _IndirectLightIntensity: 0.1, _LightColorAttenuation: 0.0, _OutlineColorMode: 1, _OutlineCullMode: 1, _OutlineLightingMix: mtoonMaterial.outlineLightingMixFactor, _OutlineScaledMaxDistance: 1.0, _OutlineWidth: mtoonMaterial.outlineWidthFactor * 100, _OutlineWidthMode: mtoonMaterial.outlineWidthMode === 'worldCoordinates' ? 1 : mtoonMaterial.outlineWidthMode === 'screenCoordinates' ? 2 : 0, _ReceiveShadowRate: 1.0, _RimFresnelPower: mtoonMaterial.parametricRimFresnelPowerFactor, _RimLift: mtoonMaterial.parametricRimLiftFactor, _RimLightingMix: mtoonMaterial.parametricRimLiftFactor, _ShadeShift: mtoonMaterial.shadingShiftFactor, _ShadeToony: mtoonMaterial.shadingToonyFactor, _ShadingGradeRate: 1.0, _ZWrite: mtoonMaterial.transparentWithZWrite ? 1 : 0, }, vectorProperties: { _Color: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist((_b = material.pbrMetallicRoughness) === null || _b === void 0 ? void 0 : _b.baseColorFactor) ? [1, 1, 1, 1] : material.pbrMetallicRoughness.baseColorFactor, _EmissionColor: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.emissiveFactor) ? [0, 0, 0] : material.emissiveFactor, _OutlineColor: mtoonMaterial.outlineColorFactor, _ShadeColor: mtoonMaterial.shadeColorFactor, _RimColor: mtoonMaterial.parametricRimColorFactor, _BumpMap: [0, 0, 1, 1], _EmissionMap: [0, 0, 1, 1], _MainTex: [0, 0, 1, 1], _OutlineWidthTexture: [0, 0, 1, 1], _ReceiveShadowTexture: [0, 0, 1, 1], _ShadeTexture: [0, 0, 1, 1], _ShadingGradeTexture: [0, 0, 1, 1], _SphereAdd: [0, 0, 1, 1], }, textureProperties: { _BumpMap: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.normalTexture) ? dummyWhiteTextureNumber : material.normalTexture.index, _EmissionMap: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.emissiveTexture) ? dummyBlackTextureNumber : material.emissiveTexture.index, _MainTex: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist((_c = material.pbrMetallicRoughness) === null || _c === void 0 ? void 0 : _c.baseColorTexture) ? dummyWhiteTextureNumber : material.pbrMetallicRoughness.baseColorTexture.index, _OutlineWidthTexture: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(mtoonMaterial.outlineWidthMultiplyTexture) ? dummyWhiteTextureNumber : mtoonMaterial.outlineWidthMultiplyTexture.index, _ReceiveShadowTexture: dummyWhiteTextureNumber, _ShadeTexture: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(mtoonMaterial.shadeMultiplyTexture) ? dummyWhiteTextureNumber : mtoonMaterial.shadeMultiplyTexture.index, _RimTexture: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(mtoonMaterial.rimMultiplyTexture) ? dummyBlackTextureNumber : mtoonMaterial.rimMultiplyTexture.index, _ShadingGradeTexture: dummyWhiteTextureNumber, _SphereAdd: dummyBlackTextureNumber, }, }; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.not.exist(material.extras)) { material.extras = {}; } material.extras.vrm0xMaterialProperty = vrm0xMaterialProperty; if (mtoonMaterial.outlineWidthMode !== 'none') { isOutline = true; } } return isOutline; } static _getOptions(options) { if (options != null) { for (const file in options.files) { const fileName = file.split('.vrm')[0]; if (fileName) { const arraybuffer = options.files[file]; options.files[fileName + '.glb'] = arraybuffer; delete options.files[file]; } } //set default values options.__isImportVRM0x = true; if (options.defaultMaterialHelperArgumentArray == null) { options.defaultMaterialHelperArgumentArray = [{}]; } if (!options.defaultMaterialHelperArgumentArray[0].isMorphing) { options.maxMorphTargetNumber = 0; } } else { options = { files: {}, loaderExtension: undefined, defaultMaterialHelperName: undefined, defaultMaterialHelperArgumentArray: [ { isLighting: true, isMorphing: true, isSkinning: true }, ], statesOfElements: [ { targets: [], states: { enable: [], functions: {}, }, isTransparent: true, opacity: 1.0, isTextureImageToLoadPreMultipliedAlpha: false, }, ], __isImportVRM0x: true, __importedType: 'vrm1', }; } return options; } /** * For VRM file only * Generate JSON. */ static async importJsonOfVRM(uri, options) { options = this._getOptions(options); const result = await _Gltf2Importer__WEBPACK_IMPORTED_MODULE_12__.Gltf2Importer.importFromUri(uri, options); if (result._isErr()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_11__.Err({ message: 'Failed to import VRM file.', error: result, }); } (0,_misc_Result__WEBPACK_IMPORTED_MODULE_11__.assertIsOk)(result); const gltfJson = result.get(); VrmImporter._readVRMHumanoidInfo(gltfJson); return new _misc_Result__WEBPACK_IMPORTED_MODULE_11__.Ok(gltfJson); } static async __importVRM0x(gltfModel, renderPasses) { var _a, _b, _c, _d, _e, _f; // process defaultMaterialHelperArgumentArray const defaultMaterialHelperArgumentArray = (_b = (_a = gltfModel.asset.extras) === null || _a === void 0 ? void 0 : _a.rnLoaderOptions) === null || _b === void 0 ? void 0 : _b.defaultMaterialHelperArgumentArray; const textures = this._createTextures(gltfModel); const samplers = this._createSamplers(gltfModel); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(defaultMaterialHelperArgumentArray)) { defaultMaterialHelperArgumentArray[0].textures = (_c = defaultMaterialHelperArgumentArray[0].textures) !== null && _c !== void 0 ? _c : textures; defaultMaterialHelperArgumentArray[0].samplers = (_d = defaultMaterialHelperArgumentArray[0].samplers) !== null && _d !== void 0 ? _d : samplers; defaultMaterialHelperArgumentArray[0].isLighting = (_e = defaultMaterialHelperArgumentArray[0].isLighting) !== null && _e !== void 0 ? _e : true; } const existOutline = this.__initializeMToonMaterialProperties(gltfModel, textures.length); // get rootGroup let rootGroup; if (existOutline) { renderPasses[1] = (_f = renderPasses[1]) !== null && _f !== void 0 ? _f : new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_2__.RenderPass(); const renderPassOutline = renderPasses[1]; renderPassOutline.toClearColorBuffer = false; renderPassOutline.toClearDepthBuffer = false; gltfModel.extensions.VRM.rnExtension = { renderPassOutline: renderPassOutline, }; rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter.convertToRhodoniteObject(gltfModel); renderPassOutline.addEntities([rootGroup]); } else { rootGroup = _ModelConverter__WEBPACK_IMPORTED_MODULE_0__.ModelConverter.convertToRhodoniteObject(gltfModel); } const renderPassMain = renderPasses[0]; renderPassMain.addEntities([rootGroup]); this._readSpringBone(gltfModel); this._readVRMHumanoidInfo(gltfModel, rootGroup); } } /***/ }), /***/ "./src/foundation/importer/VrmaImporter.ts": /*!*************************************************!*\ !*** ./src/foundation/importer/VrmaImporter.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VrmaImporter: () => (/* binding */ VrmaImporter) /* harmony export */ }); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _Gltf2Importer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Gltf2Importer */ "./src/foundation/importer/Gltf2Importer.ts"); class VrmaImporter { static async importFromUri(uri) { const options = {}; const result = await _Gltf2Importer__WEBPACK_IMPORTED_MODULE_2__.Gltf2Importer.importFromUri(uri, options); if (result._isErr()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_1__.Err({ message: 'Failed to import VRM file.', error: result, }); } (0,_misc_Result__WEBPACK_IMPORTED_MODULE_1__.assertIsOk)(result); const gltfJson = result.get(); this.readHumanoid(gltfJson); return new _misc_Result__WEBPACK_IMPORTED_MODULE_1__.Ok(gltfJson); } static async importFromArrayBuffer(arrayBuffer) { const options = {}; const result = await _Gltf2Importer__WEBPACK_IMPORTED_MODULE_2__.Gltf2Importer.importFromArrayBuffers({ 'data.glb': arrayBuffer }, options); if (result._isErr()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_1__.Err({ message: 'Failed to import VRM file.', error: result, }); } (0,_misc_Result__WEBPACK_IMPORTED_MODULE_1__.assertIsOk)(result); const gltfJson = result.get(); this.readHumanoid(gltfJson); return new _misc_Result__WEBPACK_IMPORTED_MODULE_1__.Ok(gltfJson); } static readHumanoid(rnm) { var _a; const humanBones = (_a = rnm.extensions.VRMC_vrm_animation.humanoid) === null || _a === void 0 ? void 0 : _a.humanBones; if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.not.exist(humanBones)) { return; } const humanoidBoneNameMap = new Map(); rnm.extensions.VRMC_vrm_animation.humanoidBoneNameMap = humanoidBoneNameMap; for (const boneName in humanBones) { const node = humanBones[boneName]; humanoidBoneNameMap.set(node.node, boneName); } } } /***/ }), /***/ "./src/foundation/importer/index.ts": /*!******************************************!*\ !*** ./src/foundation/importer/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AnimationAssigner: () => (/* reexport safe */ _AnimationAssigner__WEBPACK_IMPORTED_MODULE_0__.AnimationAssigner), /* harmony export */ DrcPointCloudImporter: () => (/* reexport safe */ _DrcPointCloudImporter__WEBPACK_IMPORTED_MODULE_1__.DrcPointCloudImporter), /* harmony export */ Gltf2Importer: () => (/* reexport safe */ _Gltf2Importer__WEBPACK_IMPORTED_MODULE_3__.Gltf2Importer), /* harmony export */ GltfImporter: () => (/* reexport safe */ _GltfImporter__WEBPACK_IMPORTED_MODULE_4__.GltfImporter), /* harmony export */ ModelConverter: () => (/* reexport safe */ _ModelConverter__WEBPACK_IMPORTED_MODULE_6__.ModelConverter), /* harmony export */ RhodoniteImportExtension: () => (/* reexport safe */ _RhodoniteImportExtension__WEBPACK_IMPORTED_MODULE_7__.RhodoniteImportExtension), /* harmony export */ Vrm0xImporter: () => (/* reexport safe */ _Vrm0xImporter__WEBPACK_IMPORTED_MODULE_8__.Vrm0xImporter), /* harmony export */ VrmImporter: () => (/* reexport safe */ _VrmImporter__WEBPACK_IMPORTED_MODULE_9__.VrmImporter), /* harmony export */ VrmaImporter: () => (/* reexport safe */ _VrmaImporter__WEBPACK_IMPORTED_MODULE_10__.VrmaImporter), /* harmony export */ detectFormatByArrayBuffers: () => (/* reexport safe */ _FormatDetector__WEBPACK_IMPORTED_MODULE_2__.detectFormatByArrayBuffers), /* harmony export */ detectFormatByUri: () => (/* reexport safe */ _FormatDetector__WEBPACK_IMPORTED_MODULE_2__.detectFormatByUri) /* harmony export */ }); /* harmony import */ var _AnimationAssigner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AnimationAssigner */ "./src/foundation/importer/AnimationAssigner.ts"); /* harmony import */ var _DrcPointCloudImporter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DrcPointCloudImporter */ "./src/foundation/importer/DrcPointCloudImporter.ts"); /* harmony import */ var _FormatDetector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FormatDetector */ "./src/foundation/importer/FormatDetector.ts"); /* harmony import */ var _Gltf2Importer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Gltf2Importer */ "./src/foundation/importer/Gltf2Importer.ts"); /* harmony import */ var _GltfImporter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./GltfImporter */ "./src/foundation/importer/GltfImporter.ts"); /* harmony import */ var _ILoaderExtension__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ILoaderExtension */ "./src/foundation/importer/ILoaderExtension.ts"); /* harmony import */ var _ModelConverter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ModelConverter */ "./src/foundation/importer/ModelConverter.ts"); /* harmony import */ var _RhodoniteImportExtension__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./RhodoniteImportExtension */ "./src/foundation/importer/RhodoniteImportExtension.ts"); /* harmony import */ var _Vrm0xImporter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Vrm0xImporter */ "./src/foundation/importer/Vrm0xImporter.ts"); /* harmony import */ var _VrmImporter__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./VrmImporter */ "./src/foundation/importer/VrmImporter.ts"); /* harmony import */ var _VrmaImporter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./VrmaImporter */ "./src/foundation/importer/VrmaImporter.ts"); /***/ }), /***/ "./src/foundation/index.ts": /*!*********************************!*\ !*** ./src/foundation/index.ts ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AABB: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.AABB), /* harmony export */ AABBGizmo: () => (/* reexport safe */ _gizmos_index__WEBPACK_IMPORTED_MODULE_7__.AABBGizmo), /* harmony export */ AbsoluteAnimation: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.AbsoluteAnimation), /* harmony export */ AbstractArrayBufferBaseMathNumber: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.AbstractArrayBufferBaseMathNumber), /* harmony export */ AbstractCameraController: () => (/* reexport safe */ _cameras_index__WEBPACK_IMPORTED_MODULE_0__.AbstractCameraController), /* harmony export */ AbstractMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AbstractMaterialContent), /* harmony export */ AbstractMatrix: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.AbstractMatrix), /* harmony export */ AbstractQuaternion: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.AbstractQuaternion), /* harmony export */ AbstractShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AbstractShaderNode), /* harmony export */ AbstractTexture: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.AbstractTexture), /* harmony export */ AbstractVector: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.AbstractVector), /* harmony export */ Accessor: () => (/* reexport safe */ _memory_index__WEBPACK_IMPORTED_MODULE_12__.Accessor), /* harmony export */ AddShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AddShaderNode), /* harmony export */ AlphaMode: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.AlphaMode), /* harmony export */ AnimationAssigner: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.AnimationAssigner), /* harmony export */ AnimationAttribute: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.AnimationAttribute), /* harmony export */ AnimationComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.AnimationComponent), /* harmony export */ AnimationInterpolation: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.AnimationInterpolation), /* harmony export */ AttributeColorShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AttributeColorShaderNode), /* harmony export */ AttributeNormalShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AttributeNormalShaderNode), /* harmony export */ AttributePositionShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AttributePositionShaderNode), /* harmony export */ AttributeTexcoordShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.AttributeTexcoordShaderNode), /* harmony export */ Axis: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Axis), /* harmony export */ BasisCompressionType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.BasisCompressionType), /* harmony export */ BlendShapeComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.BlendShapeComponent), /* harmony export */ BlockBeginShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.BlockBeginShaderNode), /* harmony export */ BlockEndShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.BlockEndShaderNode), /* harmony export */ BoneDataType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.BoneDataType), /* harmony export */ Buffer: () => (/* reexport safe */ _memory_index__WEBPACK_IMPORTED_MODULE_12__.Buffer), /* harmony export */ BufferUse: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.BufferUse), /* harmony export */ BufferView: () => (/* reexport safe */ _memory_index__WEBPACK_IMPORTED_MODULE_12__.BufferView), /* harmony export */ CGAPIResourceRepository: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.CGAPIResourceRepository), /* harmony export */ Cache: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Cache), /* harmony export */ CameraComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.CameraComponent), /* harmony export */ CameraControllerComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.CameraControllerComponent), /* harmony export */ CameraControllerType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.CameraControllerType), /* harmony export */ CameraType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.CameraType), /* harmony export */ CapsuleCollider: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.CapsuleCollider), /* harmony export */ ColorGradingUsingLUTsMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ColorGradingUsingLUTsMaterialContent), /* harmony export */ ColorRgb: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ColorRgb), /* harmony export */ ColorRgba: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ColorRgba), /* harmony export */ ComplexVertexAttribute: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.ComplexVertexAttribute), /* harmony export */ Component: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.Component), /* harmony export */ ComponentRepository: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository), /* harmony export */ ComponentType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ComponentType), /* harmony export */ CompositionType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.CompositionType), /* harmony export */ CompressionTextureType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.CompressionTextureType), /* harmony export */ Config: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.Config), /* harmony export */ ConstRgbaBlack: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstRgbaBlack), /* harmony export */ ConstRgbaWhite: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstRgbaWhite), /* harmony export */ ConstVector2_0_0: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector2_0_0), /* harmony export */ ConstVector2_1_1: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector2_1_1), /* harmony export */ ConstVector3_0_0_0: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector3_0_0_0), /* harmony export */ ConstVector3_1_1_1: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector3_1_1_1), /* harmony export */ ConstVector4_0_0_0_0: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector4_0_0_0_0), /* harmony export */ ConstVector4_0_0_0_1: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector4_0_0_0_1), /* harmony export */ ConstVector4_1_1_1_1: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.ConstVector4_1_1_1_1), /* harmony export */ ConstantScalarVariableShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ConstantScalarVariableShaderNode), /* harmony export */ ConstantVector2VariableShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ConstantVector2VariableShaderNode), /* harmony export */ ConstantVector3VariableShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ConstantVector3VariableShaderNode), /* harmony export */ ConstantVector4VariableShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ConstantVector4VariableShaderNode), /* harmony export */ Cube: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Cube), /* harmony export */ CubeTexture: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.CubeTexture), /* harmony export */ CustomMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.CustomMaterialContent), /* harmony export */ DataUtil: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.DataUtil), /* harmony export */ DefaultTextures: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.DefaultTextures), /* harmony export */ DepthEncodeMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.DepthEncodeMaterialContent), /* harmony export */ DetectHighLuminanceMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.DetectHighLuminanceMaterialContent), /* harmony export */ DotProductShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.DotProductShaderNode), /* harmony export */ DrcPointCloudImporter: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.DrcPointCloudImporter), /* harmony export */ EVENT_CLICK: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_CLICK), /* harmony export */ EVENT_KEY_DOWN: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_KEY_DOWN), /* harmony export */ EVENT_KEY_PRESS: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_KEY_PRESS), /* harmony export */ EVENT_KEY_UP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_KEY_UP), /* harmony export */ EVENT_MOUSE_DOWN: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_DOWN), /* harmony export */ EVENT_MOUSE_ENTER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_ENTER), /* harmony export */ EVENT_MOUSE_LEAVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_LEAVE), /* harmony export */ EVENT_MOUSE_MOVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_MOVE), /* harmony export */ EVENT_MOUSE_OVER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_OVER), /* harmony export */ EVENT_MOUSE_UP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_UP), /* harmony export */ EVENT_MOUSE_WHEEL: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MOUSE_WHEEL), /* harmony export */ EVENT_MSPOINTER_DOWN: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MSPOINTER_DOWN), /* harmony export */ EVENT_MSPOINTER_MOVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MSPOINTER_MOVE), /* harmony export */ EVENT_MSPOINTER_UP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_MSPOINTER_UP), /* harmony export */ EVENT_ORIENTATION_CHANGE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_ORIENTATION_CHANGE), /* harmony export */ EVENT_POINTER_CANCEL: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_CANCEL), /* harmony export */ EVENT_POINTER_DOWN: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_DOWN), /* harmony export */ EVENT_POINTER_ENTER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_ENTER), /* harmony export */ EVENT_POINTER_LEAVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_LEAVE), /* harmony export */ EVENT_POINTER_MOVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_MOVE), /* harmony export */ EVENT_POINTER_OUT: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_OUT), /* harmony export */ EVENT_POINTER_OVER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_OVER), /* harmony export */ EVENT_POINTER_UP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_POINTER_UP), /* harmony export */ EVENT_RESIZE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_RESIZE), /* harmony export */ EVENT_TOUCH_CANCEL: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_CANCEL), /* harmony export */ EVENT_TOUCH_DOUBLE_TAP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_DOUBLE_TAP), /* harmony export */ EVENT_TOUCH_DRAG: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_DRAG), /* harmony export */ EVENT_TOUCH_END: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_END), /* harmony export */ EVENT_TOUCH_ENTER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_ENTER), /* harmony export */ EVENT_TOUCH_HOLD: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_HOLD), /* harmony export */ EVENT_TOUCH_LEAVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_LEAVE), /* harmony export */ EVENT_TOUCH_LONG_TAP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_LONG_TAP), /* harmony export */ EVENT_TOUCH_MOVE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_MOVE), /* harmony export */ EVENT_TOUCH_OUT: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_OUT), /* harmony export */ EVENT_TOUCH_OVER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_OVER), /* harmony export */ EVENT_TOUCH_PINCH: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_PINCH), /* harmony export */ EVENT_TOUCH_START: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_START), /* harmony export */ EVENT_TOUCH_SWIPE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_SWIPE), /* harmony export */ EVENT_TOUCH_TAP: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EVENT_TOUCH_TAP), /* harmony export */ Entity: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.Entity), /* harmony export */ EntityRepository: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.EntityRepository), /* harmony export */ EntityUIDOutputMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.EntityUIDOutputMaterialContent), /* harmony export */ EnumClass: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.EnumClass), /* harmony export */ Err: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Err), /* harmony export */ EventPubSub: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.EventPubSub), /* harmony export */ Expression: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.Expression), /* harmony export */ ExpressionHelper: () => (/* reexport safe */ _helpers_index__WEBPACK_IMPORTED_MODULE_8__.ExpressionHelper), /* harmony export */ FileType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.FileType), /* harmony export */ ForwardRenderPipeline: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.ForwardRenderPipeline), /* harmony export */ Frame: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.Frame), /* harmony export */ FrameBuffer: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.FrameBuffer), /* harmony export */ Frustum: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Frustum), /* harmony export */ FurnaceTestMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.FurnaceTestMaterialContent), /* harmony export */ GLTF2_EXPORT_DRACO: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.GLTF2_EXPORT_DRACO), /* harmony export */ GLTF2_EXPORT_EMBEDDED: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.GLTF2_EXPORT_EMBEDDED), /* harmony export */ GLTF2_EXPORT_GLB: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.GLTF2_EXPORT_GLB), /* harmony export */ GLTF2_EXPORT_GLTF: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.GLTF2_EXPORT_GLTF), /* harmony export */ GLTF2_EXPORT_NO_DOWNLOAD: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.GLTF2_EXPORT_NO_DOWNLOAD), /* harmony export */ GetComponentFromEntities: () => (/* reexport safe */ _enhanced_js_objects_index__WEBPACK_IMPORTED_MODULE_4__.GetComponentFromEntities), /* harmony export */ Gizmo: () => (/* reexport safe */ _gizmos_index__WEBPACK_IMPORTED_MODULE_7__.Gizmo), /* harmony export */ GlobalDataRepository: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.GlobalDataRepository), /* harmony export */ GlobalRetarget: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.GlobalRetarget), /* harmony export */ GlobalRetargetReverse: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.GlobalRetargetReverse), /* harmony export */ Gltf2Exporter: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.Gltf2Exporter), /* harmony export */ Gltf2Importer: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.Gltf2Importer), /* harmony export */ GltfImporter: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.GltfImporter), /* harmony export */ GreaterShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.GreaterShaderNode), /* harmony export */ Grid: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Grid), /* harmony export */ HdriFormat: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.HdriFormat), /* harmony export */ INPUT_HANDLING_STATE_CAMERA_CONTROLLER: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_SCALE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.INPUT_HANDLING_STATE_GIZMO_SCALE), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_TRANSLATION: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.INPUT_HANDLING_STATE_GIZMO_TRANSLATION), /* harmony export */ INPUT_HANDLING_STATE_NONE: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.INPUT_HANDLING_STATE_NONE), /* harmony export */ IShape: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.IShape), /* harmony export */ IdentityMatrix33: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.IdentityMatrix33), /* harmony export */ IdentityMatrix44: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.IdentityMatrix44), /* harmony export */ IfStatementShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.IfStatementShaderNode), /* harmony export */ ImageUtil: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ImageUtil), /* harmony export */ InputManager: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.InputManager), /* harmony export */ Is: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Is), /* harmony export */ IsObj: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.IsObj), /* harmony export */ Joint: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Joint), /* harmony export */ LightComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.LightComponent), /* harmony export */ LightGizmo: () => (/* reexport safe */ _gizmos_index__WEBPACK_IMPORTED_MODULE_7__.LightGizmo), /* harmony export */ LightType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.LightType), /* harmony export */ Line: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Line), /* harmony export */ LocatorGizmo: () => (/* reexport safe */ _gizmos_index__WEBPACK_IMPORTED_MODULE_7__.LocatorGizmo), /* harmony export */ LogLevel: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.LogLevel), /* harmony export */ LogQuaternion: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.LogQuaternion), /* harmony export */ Logger: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Logger), /* harmony export */ MToonMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.MToonMaterialContent), /* harmony export */ MatCapMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.MatCapMaterialContent), /* harmony export */ Material: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.Material), /* harmony export */ MaterialHelper: () => (/* reexport safe */ _helpers_index__WEBPACK_IMPORTED_MODULE_8__.MaterialHelper), /* harmony export */ MaterialRepository: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.MaterialRepository), /* harmony export */ MathClassUtil: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MathClassUtil), /* harmony export */ MathUtil: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MathUtil), /* harmony export */ Matrix22: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Matrix22), /* harmony export */ Matrix33: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Matrix33), /* harmony export */ Matrix44: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Matrix44), /* harmony export */ MemoryManager: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.MemoryManager), /* harmony export */ MergeVectorShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.MergeVectorShaderNode), /* harmony export */ Mesh: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Mesh), /* harmony export */ MeshComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.MeshComponent), /* harmony export */ MeshHelper: () => (/* reexport safe */ _helpers_index__WEBPACK_IMPORTED_MODULE_8__.MeshHelper), /* harmony export */ MeshRendererComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.MeshRendererComponent), /* harmony export */ MiscUtil: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.MiscUtil), /* harmony export */ ModelConverter: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.ModelConverter), /* harmony export */ ModuleManager: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.ModuleManager), /* harmony export */ MultiplyShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.MultiplyShaderNode), /* harmony export */ MutableColorRgb: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableColorRgb), /* harmony export */ MutableColorRgba: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableColorRgba), /* harmony export */ MutableMatrix22: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableMatrix22), /* harmony export */ MutableMatrix33: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableMatrix33), /* harmony export */ MutableMatrix44: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableMatrix44), /* harmony export */ MutableQuaternion: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableQuaternion), /* harmony export */ MutableScalar: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableScalar), /* harmony export */ MutableScalar_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableScalar_), /* harmony export */ MutableScalard: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableScalard), /* harmony export */ MutableVector2: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector2), /* harmony export */ MutableVector2_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector2_), /* harmony export */ MutableVector2d: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector2d), /* harmony export */ MutableVector3: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector3), /* harmony export */ MutableVector3_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector3_), /* harmony export */ MutableVector3d: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector3d), /* harmony export */ MutableVector4: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector4), /* harmony export */ MutableVector4_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector4_), /* harmony export */ MutableVector4d: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.MutableVector4d), /* harmony export */ None: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.None), /* harmony export */ NormalMatrixShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.NormalMatrixShaderNode), /* harmony export */ NormalizeShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.NormalizeShaderNode), /* harmony export */ OimoPhysicsStrategy: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.OimoPhysicsStrategy), /* harmony export */ Ok: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Ok), /* harmony export */ Option: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Option), /* harmony export */ OrbitCameraController: () => (/* reexport safe */ _cameras_index__WEBPACK_IMPORTED_MODULE_0__.OrbitCameraController), /* harmony export */ OutColorShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.OutColorShaderNode), /* harmony export */ OutPositionShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.OutPositionShaderNode), /* harmony export */ PhysicsComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.PhysicsComponent), /* harmony export */ PixelFormat: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.PixelFormat), /* harmony export */ Plane: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Plane), /* harmony export */ Primitive: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Primitive), /* harmony export */ PrimitiveMode: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.PrimitiveMode), /* harmony export */ PrimitiveSortKey_BitLength_Depth: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitLength_Depth), /* harmony export */ PrimitiveSortKey_BitLength_Material: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitLength_Material), /* harmony export */ PrimitiveSortKey_BitLength_PrimitiveType: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitLength_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitLength_TranslucencyType: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitLength_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_Material: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitOffset_Material), /* harmony export */ PrimitiveSortKey_BitOffset_PrimitiveType: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitOffset_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitOffset_TranslucencyType: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitOffset_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_ViewportLayer: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.PrimitiveSortKey_BitOffset_ViewportLayer), /* harmony export */ ProcessApproach: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ProcessApproach), /* harmony export */ ProcessApproachClass: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ProcessApproachClass), /* harmony export */ ProcessStage: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ProcessStage), /* harmony export */ ProjectionMatrixShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ProjectionMatrixShaderNode), /* harmony export */ Quaternion: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Quaternion), /* harmony export */ RenderBuffer: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.RenderBuffer), /* harmony export */ RenderBufferTarget: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.RenderBufferTarget), /* harmony export */ RenderPass: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.RenderPass), /* harmony export */ RenderPassHelper: () => (/* reexport safe */ _helpers_index__WEBPACK_IMPORTED_MODULE_8__.RenderPassHelper), /* harmony export */ RenderTargetTexture: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.RenderTargetTexture), /* harmony export */ RenderTargetTextureCube: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.RenderTargetTextureCube), /* harmony export */ RenderableHelper: () => (/* reexport safe */ _helpers_index__WEBPACK_IMPORTED_MODULE_8__.RenderableHelper), /* harmony export */ RhodoniteImportExtension: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.RhodoniteImportExtension), /* harmony export */ RnException: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.RnException), /* harmony export */ RnObject: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.RnObject), /* harmony export */ RnPromise: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.RnPromise), /* harmony export */ Sampler: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.Sampler), /* harmony export */ Scalar: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Scalar), /* harmony export */ Scalar_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Scalar_), /* harmony export */ Scalard: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Scalard), /* harmony export */ ScaleGizmo: () => (/* reexport safe */ _gizmos_index__WEBPACK_IMPORTED_MODULE_7__.ScaleGizmo), /* harmony export */ SceneGraphComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.SceneGraphComponent), /* harmony export */ ShaderGraphResolver: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ShaderGraphResolver), /* harmony export */ ShaderNode: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShaderNode), /* harmony export */ ShaderSemantics: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShaderSemantics), /* harmony export */ ShaderSemanticsClass: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShaderSemanticsClass), /* harmony export */ ShaderType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShaderType), /* harmony export */ ShaderVariableType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShaderVariableType), /* harmony export */ ShaderityUtilityWebGL: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ShaderityUtilityWebGL), /* harmony export */ ShadingModel: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShadingModel), /* harmony export */ ShadowMap: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ShadowMap), /* harmony export */ ShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ShadowMapDecodeClassicMaterialContent), /* harmony export */ SimpleVertexAttribute: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.SimpleVertexAttribute), /* harmony export */ SkeletalComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.SkeletalComponent), /* harmony export */ Some: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Some), /* harmony export */ Sphere: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.Sphere), /* harmony export */ SphereCollider: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.SphereCollider), /* harmony export */ SplitVectorShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.SplitVectorShaderNode), /* harmony export */ SymbolWeakMap: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.SymbolWeakMap), /* harmony export */ SynthesizeHdrMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.SynthesizeHdrMaterialContent), /* harmony export */ System: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.System), /* harmony export */ SystemState: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.SystemState), /* harmony export */ Texture: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.Texture), /* harmony export */ TextureDataFloat: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.TextureDataFloat), /* harmony export */ TextureFormat: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.TextureFormat), /* harmony export */ TextureParameter: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.TextureParameter), /* harmony export */ Time: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.Time), /* harmony export */ ToneMappingType: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.ToneMappingType), /* harmony export */ Transform3D: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Transform3D), /* harmony export */ TransformComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.TransformComponent), /* harmony export */ TranslationGizmo: () => (/* reexport safe */ _gizmos_index__WEBPACK_IMPORTED_MODULE_7__.TranslationGizmo), /* harmony export */ UniformDataShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.UniformDataShaderNode), /* harmony export */ VRMColliderGroup: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.VRMColliderGroup), /* harmony export */ VRMSpring: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.VRMSpring), /* harmony export */ VRMSpringBone: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.VRMSpringBone), /* harmony export */ VRMSpringBonePhysicsStrategy: () => (/* reexport safe */ _physics_index__WEBPACK_IMPORTED_MODULE_14__.VRMSpringBonePhysicsStrategy), /* harmony export */ VarianceShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.VarianceShadowMapDecodeClassicMaterialContent), /* harmony export */ Vector2: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector2), /* harmony export */ Vector2_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector2_), /* harmony export */ Vector2d: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector2d), /* harmony export */ Vector3: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector3), /* harmony export */ Vector3_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector3_), /* harmony export */ Vector3d: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector3d), /* harmony export */ Vector4: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector4), /* harmony export */ Vector4_: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector4_), /* harmony export */ Vector4d: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.Vector4d), /* harmony export */ VectorN: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.VectorN), /* harmony export */ VertexAttribute: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.VertexAttribute), /* harmony export */ VertexAttributeClass: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.VertexAttributeClass), /* harmony export */ VideoTexture: () => (/* reexport safe */ _textures_index__WEBPACK_IMPORTED_MODULE_17__.VideoTexture), /* harmony export */ ViewMatrixShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.ViewMatrixShaderNode), /* harmony export */ Visibility: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.Visibility), /* harmony export */ Vrm0xImporter: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.Vrm0xImporter), /* harmony export */ VrmComponent: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.VrmComponent), /* harmony export */ VrmImporter: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.VrmImporter), /* harmony export */ VrmaImporter: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.VrmaImporter), /* harmony export */ WalkThroughCameraController: () => (/* reexport safe */ _cameras_index__WEBPACK_IMPORTED_MODULE_0__.WalkThroughCameraController), /* harmony export */ WeakNone: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.WeakNone), /* harmony export */ WeakOption: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.WeakOption), /* harmony export */ WeakSome: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.WeakSome), /* harmony export */ WellKnownComponentTIDs: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.WellKnownComponentTIDs), /* harmony export */ WireframeMaterialNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.WireframeMaterialNode), /* harmony export */ WorldMatrixShaderNode: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.WorldMatrixShaderNode), /* harmony export */ _from: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__._from), /* harmony export */ _fromString: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__._fromString), /* harmony export */ _fromStringCaseSensitively: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__._fromStringCaseSensitively), /* harmony export */ _getPropertyIndex2: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__._getPropertyIndex2), /* harmony export */ add2: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.add2), /* harmony export */ add2_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.add2_offset), /* harmony export */ add3: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.add3), /* harmony export */ add3_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.add3_offset), /* harmony export */ add4: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.add4), /* harmony export */ add4_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.add4_offset), /* harmony export */ addLineNumberToCode: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.addLineNumberToCode), /* harmony export */ applyMixins: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.applyMixins), /* harmony export */ array3_lerp_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.array3_lerp_offsetAsComposition), /* harmony export */ arrayN_lerp_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.arrayN_lerp_offsetAsComposition), /* harmony export */ assertDoesNotHave: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.assertDoesNotHave), /* harmony export */ assertExist: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.assertExist), /* harmony export */ assertHas: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.assertHas), /* harmony export */ assertIsErr: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.assertIsErr), /* harmony export */ assertIsOk: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.assertIsOk), /* harmony export */ calcAlignedByteLength: () => (/* reexport safe */ _definitions_index__WEBPACK_IMPORTED_MODULE_3__.calcAlignedByteLength), /* harmony export */ combineImages: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.combineImages), /* harmony export */ convertHTMLImageElementToCanvas: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.convertHTMLImageElementToCanvas), /* harmony export */ createCameraControllerEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createCameraControllerEntity), /* harmony export */ createCameraEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createCameraEntity), /* harmony export */ createEffekseer: () => (/* reexport safe */ _exporter_index__WEBPACK_IMPORTED_MODULE_5__.createEffekseer), /* harmony export */ createEntity: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_2__.createEntity), /* harmony export */ createGroupEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createGroupEntity), /* harmony export */ createLightEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createLightEntity), /* harmony export */ createLightWithCameraEntity: () => (/* reexport safe */ _helpers_index__WEBPACK_IMPORTED_MODULE_8__.createLightWithCameraEntity), /* harmony export */ createMeshEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createMeshEntity), /* harmony export */ createPhysicsEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createPhysicsEntity), /* harmony export */ createSkeletalEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createSkeletalEntity), /* harmony export */ createTransformEntity: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.createTransformEntity), /* harmony export */ deepCopyUsingJsonStringify: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.deepCopyUsingJsonStringify), /* harmony export */ defaultAnimationTrackName: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.defaultAnimationTrackName), /* harmony export */ defaultValue: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.defaultValue), /* harmony export */ detectFormatByArrayBuffers: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.detectFormatByArrayBuffers), /* harmony export */ detectFormatByUri: () => (/* reexport safe */ _importer_index__WEBPACK_IMPORTED_MODULE_9__.detectFormatByUri), /* harmony export */ downloadArrayBuffer: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.downloadArrayBuffer), /* harmony export */ downloadTypedArray: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.downloadTypedArray), /* harmony export */ dummyAnisotropyTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.dummyAnisotropyTexture), /* harmony export */ dummyBlackCubeTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.dummyBlackCubeTexture), /* harmony export */ dummyBlackTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.dummyBlackTexture), /* harmony export */ dummyBlueTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.dummyBlueTexture), /* harmony export */ dummySRGBGrayTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.dummySRGBGrayTexture), /* harmony export */ dummyWhiteTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.dummyWhiteTexture), /* harmony export */ enhanceArray: () => (/* reexport safe */ _enhanced_js_objects_index__WEBPACK_IMPORTED_MODULE_4__.enhanceArray), /* harmony export */ flattenHierarchy: () => (/* reexport safe */ _components_index__WEBPACK_IMPORTED_MODULE_1__.flattenHierarchy), /* harmony export */ get1: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get1), /* harmony export */ get1_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get1_offset), /* harmony export */ get1_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get1_offsetAsComposition), /* harmony export */ get2: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get2), /* harmony export */ get2_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get2_offset), /* harmony export */ get2_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get2_offsetAsComposition), /* harmony export */ get3: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get3), /* harmony export */ get3_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get3_offset), /* harmony export */ get3_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get3_offsetAsComposition), /* harmony export */ get4: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get4), /* harmony export */ get4_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get4_offset), /* harmony export */ get4_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.get4_offsetAsComposition), /* harmony export */ getEvent: () => (/* reexport safe */ _system_index__WEBPACK_IMPORTED_MODULE_16__.getEvent), /* harmony export */ getN_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.getN_offset), /* harmony export */ getN_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.getN_offsetAsComposition), /* harmony export */ greaterThan: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.greaterThan), /* harmony export */ ifDefinedThen: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifDefinedThen), /* harmony export */ ifDefinedThenWithReturn: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifDefinedThenWithReturn), /* harmony export */ ifExistsThen: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifExistsThen), /* harmony export */ ifExistsThenWithReturn: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifExistsThenWithReturn), /* harmony export */ ifNotExistsThen: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifNotExistsThen), /* harmony export */ ifNotExistsThenWithReturn: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifNotExistsThenWithReturn), /* harmony export */ ifUndefinedThen: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifUndefinedThen), /* harmony export */ ifUndefinedThenWithReturn: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.ifUndefinedThenWithReturn), /* harmony export */ initDefaultTextures: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.initDefaultTextures), /* harmony export */ isBlend: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.isBlend), /* harmony export */ isErr: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.isErr), /* harmony export */ isOk: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.isOk), /* harmony export */ isSkipDrawing: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.isSkipDrawing), /* harmony export */ isTranslucent: () => (/* reexport safe */ _geometry_index__WEBPACK_IMPORTED_MODULE_6__.isTranslucent), /* harmony export */ lessThan: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.lessThan), /* harmony export */ mulArray3WithScalar_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.mulArray3WithScalar_offset), /* harmony export */ mulArray4WithScalar_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.mulArray4WithScalar_offset), /* harmony export */ mulArrayNWithScalar_offset: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.mulArrayNWithScalar_offset), /* harmony export */ mulThatAndThisToOutAsMat44_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.mulThatAndThisToOutAsMat44_offsetAsComposition), /* harmony export */ normalizeArray4: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.normalizeArray4), /* harmony export */ nullishToEmptyArray: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.nullishToEmptyArray), /* harmony export */ nullishToEmptyMap: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.nullishToEmptyMap), /* harmony export */ objectCachify: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.objectCachify), /* harmony export */ primitiveCachify1: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.primitiveCachify1), /* harmony export */ qlerp_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.qlerp_offsetAsComposition), /* harmony export */ scalar_lerp_offsetAsComposition: () => (/* reexport safe */ _math_index__WEBPACK_IMPORTED_MODULE_11__.scalar_lerp_offsetAsComposition), /* harmony export */ sheenLutTexture: () => (/* reexport safe */ _materials_index__WEBPACK_IMPORTED_MODULE_10__.sheenLutTexture), /* harmony export */ updateVBOAndVAO: () => (/* reexport safe */ _renderer_index__WEBPACK_IMPORTED_MODULE_15__.updateVBOAndVAO), /* harmony export */ valueWithCompensation: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.valueWithCompensation), /* harmony export */ valueWithDefault: () => (/* reexport safe */ _misc_index__WEBPACK_IMPORTED_MODULE_13__.valueWithDefault) /* harmony export */ }); /* harmony import */ var _cameras_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cameras/index */ "./src/foundation/cameras/index.ts"); /* harmony import */ var _components_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/index */ "./src/foundation/components/index.ts"); /* harmony import */ var _core_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./core/index */ "./src/foundation/core/index.ts"); /* harmony import */ var _definitions_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./definitions/index */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _enhanced_js_objects_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./enhanced_js_objects/index */ "./src/foundation/enhanced_js_objects/index.ts"); /* harmony import */ var _exporter_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./exporter/index */ "./src/foundation/exporter/index.ts"); /* harmony import */ var _geometry_index__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./geometry/index */ "./src/foundation/geometry/index.ts"); /* harmony import */ var _gizmos_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./gizmos/index */ "./src/foundation/gizmos/index.ts"); /* harmony import */ var _helpers_index__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./helpers/index */ "./src/foundation/helpers/index.ts"); /* harmony import */ var _importer_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./importer/index */ "./src/foundation/importer/index.ts"); /* harmony import */ var _materials_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./materials/index */ "./src/foundation/materials/index.ts"); /* harmony import */ var _math_index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./math/index */ "./src/foundation/math/index.ts"); /* harmony import */ var _memory_index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./memory/index */ "./src/foundation/memory/index.ts"); /* harmony import */ var _misc_index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./misc/index */ "./src/foundation/misc/index.ts"); /* harmony import */ var _physics_index__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./physics/index */ "./src/foundation/physics/index.ts"); /* harmony import */ var _renderer_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./renderer/index */ "./src/foundation/renderer/index.ts"); /* harmony import */ var _system_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./system/index */ "./src/foundation/system/index.ts"); /* harmony import */ var _textures_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./textures/index */ "./src/foundation/textures/index.ts"); /***/ }), /***/ "./src/foundation/materials/contents/ColorGradingUsingLUTsMaterialContent.ts": /*!***********************************************************************************!*\ !*** ./src/foundation/materials/contents/ColorGradingUsingLUTsMaterialContent.ts ***! \***********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ColorGradingUsingLUTsMaterialContent: () => (/* binding */ ColorGradingUsingLUTsMaterialContent) /* harmony export */ }); /* harmony import */ var _textures_AbstractTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../textures/AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _textures_Texture__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../textures/Texture */ "./src/foundation/textures/Texture.ts"); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _webgl_shaderity_shaders_ColorGradingUsingLUTsShader_ColorGradingUsingLUTsShader_vert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.vert */ "./src/webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_ColorGradingUsingLUTsShader_ColorGradingUsingLUTsShader_frag__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.frag */ "./src/webgl/shaderity_shaders/ColorGradingUsingLUTsShader/ColorGradingUsingLUTsShader.frag"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class ColorGradingUsingLUTsMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_9__.AbstractMaterialContent { constructor(targetRenderPass, colorAttachmentsNumber, uri, texture) { super(null, 'colorGradingUsingLUTsShading', {}, _webgl_shaderity_shaders_ColorGradingUsingLUTsShader_ColorGradingUsingLUTsShader_vert__WEBPACK_IMPORTED_MODULE_10__["default"], _webgl_shaderity_shaders_ColorGradingUsingLUTsShader_ColorGradingUsingLUTsShader_frag__WEBPACK_IMPORTED_MODULE_11__["default"]); let targetTexture; const framebuffer = targetRenderPass.getFramebuffer(); if (framebuffer != null && framebuffer.colorAttachments[colorAttachmentsNumber] != null) { targetTexture = framebuffer.colorAttachments[colorAttachmentsNumber]; } else { targetTexture = _core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackTexture; if (framebuffer != null) { _misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('renderPass does not have framebuffer.colorAttachments[' + colorAttachmentsNumber + ']'); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('renderPass does not have framebuffer'); } } let lookupTableTexture; if (typeof uri === 'string') { lookupTableTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_7__.Texture(); (async function (uri) { lookupTableTexture.generateTextureFromUri(uri, { type: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.UnsignedByte, }); await lookupTableTexture.loadFromUrlLazy(); })(uri); } else if (texture instanceof _textures_AbstractTexture__WEBPACK_IMPORTED_MODULE_0__.AbstractTexture) { lookupTableTexture = texture; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('no LUT texture is specified'); lookupTableTexture = _core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackTexture; } const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_12__.Sampler({ minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_8__.TextureParameter.Nearest, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_8__.TextureParameter.Nearest, wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_8__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_8__.TextureParameter.ClampToEdge, anisotropy: false, }); sampler.create(); const shaderSemanticsInfoArray = [ { semantic: 'baseColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, initialValue: [0, targetTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'lookupTableTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_6__.ShaderType.PixelShader, initialValue: [1, lookupTableTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, ]; this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); } /// Matrices let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_3__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__.CameraComponent.current); } if (cameraComponent) { this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); } } } ColorGradingUsingLUTsMaterialContent.lookupTableTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_5__.ShaderSemanticsClass({ str: 'lookupTableTexture', }); /***/ }), /***/ "./src/foundation/materials/contents/CustomMaterialContent.ts": /*!********************************************************************!*\ !*** ./src/foundation/materials/contents/CustomMaterialContent.ts ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CustomMaterialContent: () => (/* binding */ CustomMaterialContent) /* harmony export */ }); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/HdriFormat */ "./src/foundation/definitions/HdriFormat.ts"); /* harmony import */ var _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_MutableVector2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); class CustomMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent { constructor({ name, isMorphing, isSkinning, isLighting, vertexShader, pixelShader, additionalShaderSemanticInfo, vertexShaderWebGpu, pixelShaderWebGpu, }) { super(null, name, { isMorphing, isSkinning, isLighting }); // Shader Reflection const shaderSemanticsInfoArray = this.doShaderReflection(vertexShader, pixelShader, vertexShaderWebGpu, pixelShaderWebGpu); if (!CustomMaterialContent.__diffuseIblCubeMapSampler.created) { CustomMaterialContent.__diffuseIblCubeMapSampler.create(); } if (!CustomMaterialContent.__specularIblCubeMapSampler.created) { CustomMaterialContent.__specularIblCubeMapSampler.create(); } this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray.concat(additionalShaderSemanticInfo)); } _setInternalSettingParametersToGpuWebGpu({ material, args, }) { const { mipmapLevelNumber, meshRenderComponent, diffuseHdriType, specularHdriType } = CustomMaterialContent.__setupHdriParameters(args); const tmp_vector4 = _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent.__tmp_vector4; tmp_vector4.x = mipmapLevelNumber; tmp_vector4.y = meshRenderComponent.diffuseCubeMapContribution; tmp_vector4.z = meshRenderComponent.specularCubeMapContribution; tmp_vector4.w = meshRenderComponent.rotationOfCubeMap; material.setParameter('iblParameter', tmp_vector4); const tmp_vector2 = _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent.__tmp_vector2; tmp_vector2.x = diffuseHdriType; tmp_vector2.y = specularHdriType; material.setParameter('hdriFormat', tmp_vector2); const meshRendererComponent = args.entity.tryToGetMeshRenderer(); if (meshRendererComponent != null && meshRendererComponent.diffuseCubeMap != null && meshRendererComponent.specularCubeMap != null) { const iblParameterVec4 = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__.MutableVector4.zero(); const hdriFormatVec2 = _math_MutableVector2__WEBPACK_IMPORTED_MODULE_8__.MutableVector2.zero(); iblParameterVec4.x = meshRendererComponent.specularCubeMap.mipmapLevelNumber; iblParameterVec4.y = meshRendererComponent.diffuseCubeMapContribution; iblParameterVec4.z = meshRendererComponent.specularCubeMapContribution; iblParameterVec4.w = meshRendererComponent.rotationOfCubeMap; material.setParameter('iblParameter', iblParameterVec4); hdriFormatVec2.x = meshRendererComponent.diffuseCubeMap.hdriFormat.index; hdriFormatVec2.y = meshRendererComponent.specularCubeMap.hdriFormat.index; material.setParameter('hdriFormat', hdriFormatVec2); } } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); this.setIsBillboard(shaderProgram, args.isBillboard); if (firstTime || args.isVr) { let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_3__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_3__.CameraComponent.current); } this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); } if (firstTime) { // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); } /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); } const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository.getWebGLResourceRepository(); // IBL Env map if (args.diffuseCube && args.diffuseCube.isTextureReady) { webglResourceRepository.setUniform1iForTexture(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.DiffuseEnvTexture.str, [5, args.diffuseCube, CustomMaterialContent.__diffuseIblCubeMapSampler]); } else { webglResourceRepository.setUniform1iForTexture(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.DiffuseEnvTexture.str, [5, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_6__.dummyBlackCubeTexture]); } if (args.specularCube && args.specularCube.isTextureReady) { webglResourceRepository.setUniform1iForTexture(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.SpecularEnvTexture.str, [6, args.specularCube, CustomMaterialContent.__specularIblCubeMapSampler]); } else { webglResourceRepository.setUniform1iForTexture(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.SpecularEnvTexture.str, [6, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_6__.dummyBlackCubeTexture]); } // IBL Parameters if (args.setUniform) { if (firstTime) { const { mipmapLevelNumber, meshRenderComponent, diffuseHdriType, specularHdriType } = CustomMaterialContent.__setupHdriParameters(args); webglResourceRepository.setUniformValue(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.IBLParameter.str, firstTime, { x: mipmapLevelNumber, y: meshRenderComponent.diffuseCubeMapContribution, z: meshRenderComponent.specularCubeMapContribution, w: meshRenderComponent.rotationOfCubeMap, }); webglResourceRepository.setUniformValue(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.HDRIFormat.str, firstTime, { x: diffuseHdriType, y: specularHdriType }); } } else { const { mipmapLevelNumber, meshRenderComponent, diffuseHdriType, specularHdriType } = CustomMaterialContent.__setupHdriParameters(args); const tmp_vector4 = _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent.__tmp_vector4; tmp_vector4.x = mipmapLevelNumber; tmp_vector4.y = meshRenderComponent.diffuseCubeMapContribution; tmp_vector4.z = meshRenderComponent.specularCubeMapContribution; tmp_vector4.w = meshRenderComponent.rotationOfCubeMap; material.setParameter('iblParameter', tmp_vector4); const tmp_vector2 = _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent.__tmp_vector2; tmp_vector2.x = diffuseHdriType; tmp_vector2.y = specularHdriType; material.setParameter('hdriFormat', tmp_vector2); } // Morph const blendShapeComponent = args.entity.tryToGetBlendShape(); this.setMorphInfo(shaderProgram, args.entity.getMesh(), args.primitive, blendShapeComponent); } static __setupHdriParameters(args) { let mipmapLevelNumber = 1; if (args.specularCube) { mipmapLevelNumber = args.specularCube.mipmapLevelNumber; } const meshRenderComponent = args.entity.getMeshRenderer(); let diffuseHdriType = _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_4__.HdriFormat.LDR_SRGB.index; let specularHdriType = _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_4__.HdriFormat.LDR_SRGB.index; if (meshRenderComponent.diffuseCubeMap) { diffuseHdriType = meshRenderComponent.diffuseCubeMap.hdriFormat.index; } if (meshRenderComponent.specularCubeMap) { specularHdriType = meshRenderComponent.specularCubeMap.hdriFormat.index; } return { mipmapLevelNumber, meshRenderComponent, diffuseHdriType, specularHdriType, }; } } CustomMaterialContent.__globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_5__.GlobalDataRepository.getInstance(); CustomMaterialContent.__diffuseIblCubeMapSampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_10__.Sampler({ minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.Linear, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.Linear, wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.ClampToEdge, wrapR: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.ClampToEdge, }); CustomMaterialContent.__specularIblCubeMapSampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_10__.Sampler({ minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.LinearMipmapLinear, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.Linear, wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.ClampToEdge, wrapR: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_11__.TextureParameter.ClampToEdge, }); /***/ }), /***/ "./src/foundation/materials/contents/DepthEncodeMaterialContent.ts": /*!*************************************************************************!*\ !*** ./src/foundation/materials/contents/DepthEncodeMaterialContent.ts ***! \*************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DepthEncodeMaterialContent: () => (/* binding */ DepthEncodeMaterialContent) /* harmony export */ }); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _webgl_shaderity_shaders_DepthEncodeSingleShader_DepthEncodeSingleShader_vert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.vert */ "./src/webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_DepthEncodeSingleShader_DepthEncodeSingleShader_frag__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.frag */ "./src/webgl/shaderity_shaders/DepthEncodeSingleShader/DepthEncodeSingleShader.frag"); class DepthEncodeMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__.AbstractMaterialContent { constructor(depthPow, { isSkinning }) { super(null, 'depthEncodeShading' + (isSkinning ? '+skinning' : ''), { isMorphing: false, isSkinning, isLighting: false }, _webgl_shaderity_shaders_DepthEncodeSingleShader_DepthEncodeSingleShader_vert__WEBPACK_IMPORTED_MODULE_9__["default"], _webgl_shaderity_shaders_DepthEncodeSingleShader_DepthEncodeSingleShader_frag__WEBPACK_IMPORTED_MODULE_10__["default"]); this.__lastZNear = 0.0; this.__lastZFar = 0.0; const shaderSemanticsInfoArray = [ { semantic: 'zNearInner', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(0.1), min: 0.0001, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'zFarInner', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(10000.0), min: 0.0001, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'isPointLight', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Bool, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(1), min: 0, max: 1, }, { semantic: 'depthPow', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(depthPow), min: 1, max: 2, }, { semantic: 'pointSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(30.0), min: 0, max: 100, }, { semantic: 'pointDistanceAttenuation', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_8__.Vector3.fromCopyArray([0.0, 0.1, 0.01]), min: 0, max: 1, }, ]; this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__.CameraComponent.current); } if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); if (firstTime || this.__lastZNear !== cameraComponent.zNearInner) { shaderProgram._gl.uniform1f(shaderProgram.zNearInner, cameraComponent.zNearInner); this.__lastZNear = cameraComponent.zNearInner; } if (this.__lastZFar !== cameraComponent.zFarInner) { shaderProgram._gl.uniform1f(shaderProgram.zFarInner, cameraComponent.zFarInner); this.__lastZFar = cameraComponent.zFarInner; } } else { material.setParameter('zNearInner', cameraComponent.zNearInner); material.setParameter('zFarInner', cameraComponent.zFarInner); } /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); } } DepthEncodeMaterialContent.zNearInner = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__.ShaderSemanticsClass({ str: 'zNearInner' }); DepthEncodeMaterialContent.zFarInner = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__.ShaderSemanticsClass({ str: 'zFarInner' }); DepthEncodeMaterialContent.isPointLight = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__.ShaderSemanticsClass({ str: 'isPointLight' }); DepthEncodeMaterialContent.depthPow = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__.ShaderSemanticsClass({ str: 'depthPow' }); /***/ }), /***/ "./src/foundation/materials/contents/DetectHighLuminanceMaterialContent.ts": /*!*********************************************************************************!*\ !*** ./src/foundation/materials/contents/DetectHighLuminanceMaterialContent.ts ***! \*********************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DetectHighLuminanceMaterialContent: () => (/* binding */ DetectHighLuminanceMaterialContent) /* harmony export */ }); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _webgl_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_vert__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert */ "./src/webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_frag__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag */ "./src/webgl/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_vert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert */ "./src/webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_frag__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag */ "./src/webgpu/shaderity_shaders/DetectHighLuminanceAndCorrectShader/DetectHighLuminanceAndCorrectShader.frag"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); class DetectHighLuminanceMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_7__.AbstractMaterialContent { // static LuminanceReduce: ShaderSemanticsEnum = new ShaderSemanticsClass({ // str: 'luminanceReduce', // }); constructor(textureToDetectHighLuminance) { super(null, 'HighLuminanceDetectShading', {}); const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_14__.Sampler({ wrapS: _definitions__WEBPACK_IMPORTED_MODULE_15__.TextureParameter.ClampToEdge, wrapT: _definitions__WEBPACK_IMPORTED_MODULE_15__.TextureParameter.ClampToEdge, minFilter: _definitions__WEBPACK_IMPORTED_MODULE_15__.TextureParameter.Linear, magFilter: _definitions__WEBPACK_IMPORTED_MODULE_15__.TextureParameter.Linear, }); sampler.create(); const shaderSemanticsInfoArray = [ { semantic: 'luminanceCriterion', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_3__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_6__.Scalar.fromCopyNumber(2), min: 0, max: Number.MAX_VALUE, }, // { // semantic: DetectHighLuminanceMaterialContent.LuminanceReduce, // componentType: ComponentType.Float, // compositionType: CompositionType.Scalar, // stage: ShaderType.PixelShader, // initialValue: Scalar.fromCopyNumber(0.25), // min: 0, // max: 1, // }, { semantic: 'baseColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_3__.ShaderType.PixelShader, initialValue: [0, textureToDetectHighLuminance, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, ]; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_12__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_13__.ProcessApproach.WebGPU) { this.__vertexShaderityObject = _webgpu_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_vert__WEBPACK_IMPORTED_MODULE_10__["default"]; this.__pixelShaderityObject = _webgpu_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_frag__WEBPACK_IMPORTED_MODULE_11__["default"]; } else { this.__vertexShaderityObject = _webgl_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_vert__WEBPACK_IMPORTED_MODULE_8__["default"]; this.__pixelShaderityObject = _webgl_shaderity_shaders_DetectHighLuminanceAndCorrectShader_DetectHighLuminanceAndCorrectShader_frag__WEBPACK_IMPORTED_MODULE_9__["default"]; } this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); /// Matrices let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_5__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_5__.CameraComponent.current); } if (cameraComponent) { this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); } } } } DetectHighLuminanceMaterialContent.LuminanceCriterion = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'luminanceCriterion', }); /***/ }), /***/ "./src/foundation/materials/contents/EntityUIDOutputMaterialContent.ts": /*!*****************************************************************************!*\ !*** ./src/foundation/materials/contents/EntityUIDOutputMaterialContent.ts ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EntityUIDOutputMaterialContent: () => (/* binding */ EntityUIDOutputMaterialContent) /* harmony export */ }); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _webgl_shaderity_shaders_EntityUIDOutputSingleShader_EntityUIDOutputSingleShader_vert__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.vert */ "./src/webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_EntityUIDOutputSingleShader_EntityUIDOutputSingleShader_frag__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.frag */ "./src/webgl/shaderity_shaders/EntityUIDOutputSingleShader/EntityUIDOutputSingleShader.frag"); class EntityUIDOutputMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__.AbstractMaterialContent { constructor() { super(null, 'entityUidOutputShading' + ( true ? '+skinning' : 0) + ( false ? 0 : '-lighting'), { isMorphing: false, isSkinning: true, isLighting: false }, _webgl_shaderity_shaders_EntityUIDOutputSingleShader_EntityUIDOutputSingleShader_vert__WEBPACK_IMPORTED_MODULE_8__["default"], _webgl_shaderity_shaders_EntityUIDOutputSingleShader_EntityUIDOutputSingleShader_frag__WEBPACK_IMPORTED_MODULE_9__["default"]); const shaderSemanticsInfoArray = [ // {semantic: ShaderSemantics.ViewMatrix, isComponentData: true, compositionType: CompositionType.Mat4, componentType: ComponentType.Float, // stage: ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, updateInterval: ShaderVariableUpdateInterval.FirstTimeOnly, initialValue: MutableMatrix44.zero() }, // {semantic: ShaderSemantics.ProjectionMatrix, isComponentData: true, compositionType: CompositionType.Mat4, componentType: ComponentType.Float, // stage: ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, updateInterval: ShaderVariableUpdateInterval.FirstTimeOnly, initialValue: MutableMatrix44.zero() }, // { // semantic: ShaderSemantics.ViewPosition, // compositionType: CompositionType.Vec3, // componentType: ComponentType.Float, // stage: ShaderType.VertexShader, // min: -Number.MAX_VALUE, // max: Number.MAX_VALUE, // isInternalSetting: true, // updateInterval: ShaderVariableUpdateInterval.FirstTimeOnly, // initialValue: Vector3.fromCopyArray([0, 0, 0]), // soloDatum: true // }, { semantic: 'pointSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(30.0), min: 0, max: 100, }, { semantic: 'pointDistanceAttenuation', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopyArray([0.0, 0.1, 0.01]), min: 0, max: 1, }, ]; this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); /// Matrices let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_6__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_7__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_7__.CameraComponent.current); } this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); } } } /***/ }), /***/ "./src/foundation/materials/contents/FurnaceTestMaterialContent.ts": /*!*************************************************************************!*\ !*** ./src/foundation/materials/contents/FurnaceTestMaterialContent.ts ***! \*************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ FurnaceTestMaterialContent: () => (/* binding */ FurnaceTestMaterialContent) /* harmony export */ }); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _math_Vector2__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _webgl_shaderity_shaders_FurnaceTestShader_FurnaceTestShader_vert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.vert */ "./src/webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_FurnaceTestShader_FurnaceTestShader_frag__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.frag */ "./src/webgl/shaderity_shaders/FurnaceTestShader/FurnaceTestShader.frag"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); class FurnaceTestMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_6__.AbstractMaterialContent { constructor() { super(null, 'FurnaceTestShading', {}, _webgl_shaderity_shaders_FurnaceTestShader_FurnaceTestShader_vert__WEBPACK_IMPORTED_MODULE_9__["default"], _webgl_shaderity_shaders_FurnaceTestShader_FurnaceTestShader_frag__WEBPACK_IMPORTED_MODULE_10__["default"]); const shaderSemanticsInfoArray = [ { semantic: 'debugView', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_2__.Scalar.fromCopyNumber(0), min: 0, max: 1, }, { semantic: 'disable_fresnel', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_2__.Scalar.fromCopyNumber(0), min: 0, max: 1, }, { semantic: 'f0', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_2__.Scalar.fromCopyNumber(1), min: 0, max: 1, }, { semantic: 'g_type', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_2__.Scalar.fromCopyNumber(0), min: 0, max: 3, }, { semantic: 'mode', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_2__.Scalar.fromCopyNumber(0), min: 0, max: 1, }, { semantic: 'screenInfo', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Vector2__WEBPACK_IMPORTED_MODULE_5__.Vector2.fromCopyArray2([0, 0]), min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'metallicRoughnessFactor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: _math_Vector2__WEBPACK_IMPORTED_MODULE_5__.Vector2.fromCopyArray2([1, 1]), min: 0, max: 2, }, { semantic: 'metallicRoughnessTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_4__.ShaderType.PixelShader, initialValue: [1, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_11__.dummyWhiteTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, ]; this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); if (firstTime) { /// Matrices let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_7__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_8__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_8__.CameraComponent.current); } this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); } } } } FurnaceTestMaterialContent.mode = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__.ShaderSemanticsClass({ str: 'mode' }); FurnaceTestMaterialContent.debugView = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__.ShaderSemanticsClass({ str: 'debugView' }); FurnaceTestMaterialContent.g_type = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__.ShaderSemanticsClass({ str: 'g_type' }); FurnaceTestMaterialContent.disable_fresnel = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__.ShaderSemanticsClass({ str: 'disable_fresnel' }); FurnaceTestMaterialContent.f0 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__.ShaderSemanticsClass({ str: 'f0' }); /***/ }), /***/ "./src/foundation/materials/contents/MToonMaterialContent.ts": /*!*******************************************************************!*\ !*** ./src/foundation/materials/contents/MToonMaterialContent.ts ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MToonMaterialContent: () => (/* binding */ MToonMaterialContent) /* harmony export */ }); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _webgl_shaderity_shaders_MToonSingleShader_MToonSingleShader_vert__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert */ "./src/webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_MToonSingleShader_MToonSingleShader_frag__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag */ "./src/webgl/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_MToonSingleShader_MToonSingleShader_vert__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert */ "./src/webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_MToonSingleShader_MToonSingleShader_frag__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag */ "./src/webgpu/shaderity_shaders/MToonSingleShader/MToonSingleShader.frag"); /* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../types */ "./src/types/index.ts"); /* harmony import */ var _definitions_Blend__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../definitions/Blend */ "./src/foundation/definitions/Blend.ts"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); class MToonMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__.AbstractMaterialContent { constructor(isOutline, materialProperties, textures, samplers, isMorphing, isSkinning, isLighting, useTangentAttribute, debugMode, makeOutputSrgb, materialName) { super(null, materialName, { isMorphing: isMorphing, isSkinning: isSkinning, isLighting: isLighting, }); this.__OutlineWidthModeIsScreen = false; this.__floatProperties = {}; this.__vectorProperties = {}; this.__textureProperties = {}; const shaderSemanticsInfoArray = this.doShaderReflection(_webgl_shaderity_shaders_MToonSingleShader_MToonSingleShader_vert__WEBPACK_IMPORTED_MODULE_14__["default"], _webgl_shaderity_shaders_MToonSingleShader_MToonSingleShader_frag__WEBPACK_IMPORTED_MODULE_15__["default"], _webgpu_shaderity_shaders_MToonSingleShader_MToonSingleShader_vert__WEBPACK_IMPORTED_MODULE_16__["default"], _webgpu_shaderity_shaders_MToonSingleShader_MToonSingleShader_frag__WEBPACK_IMPORTED_MODULE_17__["default"]); if (materialProperties != null) { this.__floatProperties = materialProperties.floatProperties; this.__vectorProperties = materialProperties.vectorProperties; this.__textureProperties = JSON.parse(JSON.stringify(materialProperties.textureProperties)); } else { this.__floatProperties._BlendMode = 0.0; this.__floatProperties._BumpScale = 1.0; this.__floatProperties._CullMode = 2.0; this.__floatProperties._Cutoff = 0.5; this.__floatProperties._DebugMode = 0.0; this.__floatProperties._DstBlend = 0.0; this.__floatProperties._IndirectLightIntensity = 0.1; this.__floatProperties._LightColorAttenuation = 0.0; this.__floatProperties._OutlineColorMode = 0.0; this.__floatProperties._OutlineCullMode = 1.0; this.__floatProperties._OutlineLightingMix = 1.0; this.__floatProperties._OutlineScaledMaxDistance = 1.0; this.__floatProperties._OutlineWidth = 0.5; this.__floatProperties._OutlineWidthMode = 0.0; this.__floatProperties._ReceiveShadowRate = 1.0; this.__floatProperties._RimFresnelPower = 1.0; this.__floatProperties._RimLift = 0.0; this.__floatProperties._RimLightingMix = 0.0; this.__floatProperties._ShadeShift = 0.0; this.__floatProperties._ShadeToony = 0.9; this.__floatProperties._ShadingGradeRate = 1.0; this.__floatProperties._SrcBlend = 1.0; this.__floatProperties._ZWrite = 1.0; // this.__floatProperties._UvAnimScrollX = 0.0; // this.__floatProperties._UvAnimScrollY = 0.0; // this.__floatProperties._UvAnimRotation = 0.0; this.__vectorProperties._Color = [1, 1, 1, 1]; this.__vectorProperties._EmissionColor = [0, 0, 0]; this.__vectorProperties._OutlineColor = [0, 0, 0, 1]; this.__vectorProperties._ShadeColor = [0.97, 0.81, 0.86, 1]; this.__vectorProperties._RimColor = [0, 0, 0]; // this.__vectorProperties._BumpMap = [0, 0, 1, 1]; // this.__vectorProperties._EmissionMap = [0, 0, 1, 1]; // this.__vectorProperties._MainTex = [0, 0, 1, 1]; // this.__vectorProperties._OutlineWidthTexture = [0, 0, 1, 1]; // this.__vectorProperties._ReceiveShadowTexture = [0, 0, 1, 1]; // this.__vectorProperties._ShadeTexture = [0, 0, 1, 1]; // this.__vectorProperties._ShadingGradeTexture = [0, 0, 1, 1]; // this.__vectorProperties._SphereAdd = [0, 0, 1, 1]; } if (debugMode) { this.__floatProperties._DebugMode = debugMode; } // non-Texture shaderSemanticsInfoArray.push({ semantic: 'cutoff', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._Cutoff), min: 0, max: 1, }, { semantic: 'litColor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec4, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_12__.Vector4.fromCopyArray(this.__vectorProperties._Color), min: 0, max: 1, }, { semantic: 'shadeColor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray(this.__vectorProperties._ShadeColor), min: 0, max: 1, }, { semantic: 'bumpScale', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._BumpScale), min: 0, max: 1, }, { semantic: 'receiveShadowRate', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._ReceiveShadowRate), min: 0, max: 1, }, { semantic: 'shadingGradeRate', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._ShadingGradeRate), min: 0, max: 1, }, { semantic: 'shadeShift', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._ShadeShift), min: 0, max: 1, }, { semantic: 'shadeToony', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._ShadeToony), min: 0, max: 1, }, { semantic: 'lightColorAttenuation', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._LightColorAttenuation), min: 0, max: 1, }, { semantic: 'ambientColor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray([0.5785, 0.5785, 0.5785]), min: 0, max: 1, }, // { // semantic: MToonMaterialContent._IndirectLightIntensity, componentType: ComponentType.Float, compositionType: CompositionType.Scalar, // stage: ShaderType.PixelShader, isInternalSetting: false, updateInterval: ShaderVariableUpdateInterval.EveryTime, soloDatum: false, // initialValue: Scalar.fromCopyNumber(this.floatPropertiesArray._IndirectLightIntensity), min: 0, max: 1 // }, { semantic: 'rimColor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray(this.__vectorProperties._RimColor), min: 0, max: 1, }, { semantic: 'rimLightingMix', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._RimLightingMix), min: 0, max: 1, }, { semantic: 'rimFresnelPower', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._RimFresnelPower), min: 0, max: 1, }, { semantic: 'rimLift', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._RimLift), min: 0, max: 1, }, { semantic: 'cameraUp', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, soloDatum: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray([0, 1, 0]), min: 0, max: 1, }, { semantic: 'emissionColor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray(this.__vectorProperties._EmissionColor), min: 0, max: 1, }, // { // semantic: MToonMaterialContent._UvAnimScrollX, componentType: ComponentType.Float, compositionType: CompositionType.Scalar, // stage: ShaderType.PixelShader, isInternalSetting: false, updateInterval: ShaderVariableUpdateInterval.EveryTime, soloDatum: false, // initialValue: Scalar.fromCopyNumber(this.floatPropertiesArray._UvAnimScrollX), min: 0, max: 1 // }, // { // semantic: MToonMaterialContent._UvAnimScrollY, componentType: ComponentType.Float, compositionType: CompositionType.Scalar, // stage: ShaderType.PixelShader, isInternalSetting: false, updateInterval: ShaderVariableUpdateInterval.EveryTime, soloDatum: false, // initialValue: Scalar.fromCopyNumber(this.floatPropertiesArray._UvAnimScrollY), min: 0, max: 1 // }, // { // semantic: MToonMaterialContent._UvAnimRotation, componentType: ComponentType.Float, compositionType: CompositionType.Scalar, // stage: ShaderType.PixelShader, isInternalSetting: false, updateInterval: ShaderVariableUpdateInterval.EveryTime, soloDatum: false, // initialValue: Scalar.fromCopyNumber(this.floatPropertiesArray._UvAnimRotation), min: 0, max: 1 // }, { semantic: 'wireframe', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray([0, 0, 1]), min: 0, max: 10, }, { semantic: 'makeOutputSrgb', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Bool, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, min: 0, max: 1, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(makeOutputSrgb ? 1 : 0), }); // _DebugMode switch (this.__floatProperties._DebugMode) { case 1: this.__definitions += '#define RN_MTOON_DEBUG_NORMAL\n'; break; case 2: this.__definitions += '#define RN_MTOON_DEBUG_LITSHADERATE\n'; break; } if (isOutline) { this.__definitions += '#define RN_MTOON_IS_OUTLINE\n'; // _OutlineWidthMode switch (this.__floatProperties._OutlineWidthMode) { case 0: this.__definitions += '#define RN_MTOON_OUTLINE_NONE\n'; break; case 1: this.__definitions += '#define RN_MTOON_OUTLINE_WIDTH_WORLD\n'; break; case 2: this.__definitions += '#define RN_MTOON_OUTLINE_WIDTH_SCREEN\n'; this.__OutlineWidthModeIsScreen = true; break; } // _OutlineColorMode switch (this.__floatProperties._OutlineColorMode) { case 0: this.__definitions += '#define RN_MTOON_OUTLINE_COLOR_FIXED\n'; break; case 1: this.__definitions += '#define RN_MTOON_OUTLINE_COLOR_MIXED\n'; break; } shaderSemanticsInfoArray.push({ semantic: 'outlineWidth', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._OutlineWidth), min: 0, max: 1, }, { semantic: 'outlineScaledMaxDistance', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._OutlineScaledMaxDistance), min: 0, max: 1, }, { semantic: 'outlineColor', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_11__.Vector3.fromCopyArray(this.__vectorProperties._OutlineColor), min: 0, max: 1, }, { semantic: 'outlineLightingMix', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(this.__floatProperties._OutlineLightingMix), min: 0, max: 1, }, { semantic: 'aspect', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_8__.Scalar.fromCopyNumber(1.0), min: 0, max: 1, }); } if (isLighting) { this.__definitions += '#define RN_IS_LIGHTING\n'; } if (isSkinning) { this.__definitions += '#define RN_IS_SKINNING\n'; } if (isMorphing) { this.__definitions += '#define RN_IS_MORPHING\n'; shaderSemanticsInfoArray.push({ semantic: 'dataTextureMorphOffsetPosition', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_7__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_13__.VectorN(new Int32Array(_core_Config__WEBPACK_IMPORTED_MODULE_7__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, { semantic: 'morphWeights', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_7__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader, isInternalSetting: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_13__.VectorN(new Float32Array(_core_Config__WEBPACK_IMPORTED_MODULE_7__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }); } if (useTangentAttribute) { this.__definitions += '#define RN_USE_TANGENT_ATTRIBUTE\n'; } // Texture if (this.__textureProperties._BumpMap >= 0) { //textures.length - 2 is dummyTexture this.__definitions += '#define RN_MTOON_HAS_BUMPMAP\n'; } if (this.__textureProperties._OutlineWidthTexture >= 0) { //textures.length - 2 is dummyTexture this.__definitions += '#define RN_MTOON_HAS_OUTLINE_WIDTH_TEXTURE\n'; } textures = [_core_DummyTextures__WEBPACK_IMPORTED_MODULE_20__.dummyWhiteTexture, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_20__.dummyBlackTexture]; this.__textureProperties._BumpMap = 0; this.__textureProperties._EmissionMap = 1; this.__textureProperties._MainTex = 0; this.__textureProperties._OutlineWidthTexture = 0; this.__textureProperties._ReceiveShadowTexture = 0; this.__textureProperties._RimTexture = 1; this.__textureProperties._ShadeTexture = 0; this.__textureProperties._ShadingGradeTexture = 0; this.__textureProperties._SphereAdd = 1; // this.__textureProperties._UvAnimMaskTexture = 0; this.__setDummyTextures(textures, samplers, shaderSemanticsInfoArray, isOutline); this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } __setDummyTextures(textures, samplers, shaderSemanticsInfoArray, isOutline) { shaderSemanticsInfoArray.push({ semantic: 'litColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 0, textures[this.__textureProperties._MainTex], samplers[this.__textureProperties._MainTex], ], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'shadeColorTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 1, textures[this.__textureProperties._ShadeTexture], samplers[this.__textureProperties._ShadeTexture], ], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'receiveShadowTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 2, textures[this.__textureProperties._ReceiveShadowTexture], samplers[this.__textureProperties._ReceiveShadowTexture], ], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'shadingGradeTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 3, textures[this.__textureProperties._ShadingGradeTexture], samplers[this.__textureProperties._ShadingGradeTexture], ], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'rimTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 4, textures[this.__textureProperties._RimTexture], samplers[this.__textureProperties._RimTexture], ], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'matCapTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 5, textures[this.__textureProperties._SphereAdd], samplers[this.__textureProperties._SphereAdd], ], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'emissionTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 6, textures[this.__textureProperties._EmissionMap], samplers[this.__textureProperties._EmissionMap], ], min: 0, max: Number.MAX_SAFE_INTEGER, }); shaderSemanticsInfoArray.push({ // number 7 of texture is the data Texture semantic: 'normalTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader, initialValue: [ 8, textures[this.__textureProperties._BumpMap], samplers[this.__textureProperties._BumpMap], ], min: 0, max: Number.MAX_SAFE_INTEGER, } // { // semantic: MToonMaterialContent._UvAnimMaskTexture, componentType: ComponentType.Int, compositionType: CompositionType.Texture2D, // stage: ShaderType.PixelShader, isInternalSetting: false, updateInterval: ShaderVariableUpdateInterval.EveryTime, // initialValue: [10, texturePropertiesArray._UvAnimMaskTexture], min: 0, max: Number.MAX_SAFE_INTEGER, // } ); if (isOutline) { shaderSemanticsInfoArray.push({ semantic: 'outlineWidthTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader, initialValue: [ 9, textures[this.__textureProperties._OutlineWidthTexture], samplers[this.__textureProperties._OutlineWidthTexture], ], min: 0, max: Number.MAX_SAFE_INTEGER, }); } } setMaterialParameters(material, isOutline) { if (MToonMaterialContent.usableBlendEquationModeAlpha == null) { MToonMaterialContent.__initializeUsableBlendEquationModeAlpha(); } if (this.__floatProperties._BlendMode !== 0) { switch (this.__floatProperties._BlendMode) { case 1: this.__definitions += '#define RN_ALPHATEST_ON\n'; material.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Mask; break; case 2: this.__definitions += '#define RN_ALPHABLEND_ON\n'; material.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend; break; case 3: this.__definitions += '#define RN_ALPHABLEND_ON\n'; material.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend; break; } const blendEquationMode = 32774; // gl.FUNC_ADD const blendEquationModeAlpha = MToonMaterialContent.usableBlendEquationModeAlpha; const blendFuncSrcFactor = MToonMaterialContent.unityBlendEnumCorrespondence(this.__floatProperties._SrcBlend); const blendFuncDstFactor = MToonMaterialContent.unityBlendEnumCorrespondence(this.__floatProperties._DstBlend); material.setBlendEquationMode(_definitions_Blend__WEBPACK_IMPORTED_MODULE_19__.Blend.from(blendEquationMode), blendEquationModeAlpha != null ? _definitions_Blend__WEBPACK_IMPORTED_MODULE_19__.Blend.from(blendEquationModeAlpha) : undefined); material.setBlendFuncFactor(_definitions_Blend__WEBPACK_IMPORTED_MODULE_19__.Blend.from(blendFuncSrcFactor), _definitions_Blend__WEBPACK_IMPORTED_MODULE_19__.Blend.from(blendFuncDstFactor)); } if (isOutline) { switch (this.__floatProperties._OutlineCullMode) { case 0: material.cullFace = false; break; case 1: material.cullFace = true; material.cullFrontFaceCCW = false; break; case 2: material.cullFace = true; material.cullFrontFaceCCW = true; break; } } else { switch (this.__floatProperties._CullMode) { case 0: material.cullFace = false; break; case 1: material.cullFace = true; material.cullFrontFaceCCW = false; break; case 2: material.cullFace = true; material.cullFrontFaceCCW = true; break; } } } static __initializeUsableBlendEquationModeAlpha() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_21__.SystemState.currentProcessApproach === _definitions__WEBPACK_IMPORTED_MODULE_22__.ProcessApproach.WebGPU) { MToonMaterialContent.usableBlendEquationModeAlpha = 32776; // gl.MAX } else { const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); const glw = webGLResourceRepository.currentWebGLContextWrapper; const gl = glw.getRawContextAsWebGL2(); if (glw.isWebGL2) { MToonMaterialContent.usableBlendEquationModeAlpha = gl.MAX; } else if (glw.webgl1ExtBM) { MToonMaterialContent.usableBlendEquationModeAlpha = glw.webgl1ExtBM.MAX_EXT; } else { MToonMaterialContent.usableBlendEquationModeAlpha = gl.FUNC_ADD; } } } _setInternalSettingParametersToGpuWebGpu({ material, args, }) { let cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__.ComponentRepository.getComponentFromComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_23__.WellKnownComponentTIDs.CameraComponentTID, args.cameraComponentSid); material.setParameter('cameraUp', cameraComponent.upInner); if (this.__OutlineWidthModeIsScreen) { material.setParameter('aspect', cameraComponent.aspect); } } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_2__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_2__.CameraComponent.current); } if (args.setUniform) { /// Matrices this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); shaderProgram._gl.uniform3fv(shaderProgram.cameraUp, cameraComponent.upInner._v); if (this.__OutlineWidthModeIsScreen) { shaderProgram._gl.uniform1f(shaderProgram.aspect, cameraComponent.aspect); } } else { material.setParameter('cameraUp', cameraComponent.upInner); if (this.__OutlineWidthModeIsScreen) { material.setParameter('aspect', cameraComponent.aspect); } } // Morph const blendShapeComponent = args.entity.tryToGetBlendShape(); this.setMorphInfo(shaderProgram, args.entity.getMesh(), args.primitive, blendShapeComponent); } static unityBlendEnumCorrespondence(enumNumber) { let result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ZERO; // gl.ZERO switch (enumNumber) { case 0: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ZERO; break; case 1: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ONE; break; case 2: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_DST_COLOR; break; case 3: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_SRC_COLOR; break; case 4: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ONE_MINUS_DST_COLOR; break; case 5: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_SRC_ALPHA; break; case 6: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ONE_MINUS_SRC_COLOR; break; case 7: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_DST_ALPHA; break; case 8: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ONE_MINUS_DST_ALPHA; break; case 9: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_SRC_ALPHA_SATURATE; break; case 10: result = _types__WEBPACK_IMPORTED_MODULE_18__.GL_ONE_MINUS_SRC_ALPHA; break; } return result; } } MToonMaterialContent._Cutoff = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'cutoff' }); MToonMaterialContent._Color = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'litColor' }); MToonMaterialContent._ShadeColor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'shadeColor' }); MToonMaterialContent._litColorTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'litColorTexture' }); MToonMaterialContent._shadeColorTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'shadeColorTexture', }); MToonMaterialContent._BumpScale = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'normalScale' }); MToonMaterialContent._normalTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'normalTexture' }); MToonMaterialContent._ReceiveShadowRate = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'receiveShadowRate', }); MToonMaterialContent._receiveShadowTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'receiveShadowTexture', }); MToonMaterialContent._ShadingGradeRate = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'shadingGradeRate', }); MToonMaterialContent._shadingGradeTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'shadingGradeTexture', }); MToonMaterialContent._ShadeShift = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'shadeShift' }); MToonMaterialContent._ShadeToony = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'shadeToony' }); MToonMaterialContent._LightColorAttenuation = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'lightColorAttenuation', }); MToonMaterialContent._AmbientColor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'ambientColor', }); // static readonly _IndirectLightIntensity = new ShaderSemanticsClass({ str: 'indirectLightIntensity' }); MToonMaterialContent._rimTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'rimTexture' }); MToonMaterialContent._RimColor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'rimColor' }); MToonMaterialContent._RimLightingMix = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'rimLightingMix', }); MToonMaterialContent._RimFresnelPower = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'rimFresnelPower', }); MToonMaterialContent._RimLift = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'rimLift' }); MToonMaterialContent._matCapTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'matCapTexture' }); MToonMaterialContent._EmissionColor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'emissionColor', }); MToonMaterialContent._emissionTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'emissionTexture', }); MToonMaterialContent._OutlineWidthTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'outlineWidthTexture', }); MToonMaterialContent._OutlineWidth = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'outlineWidth', }); MToonMaterialContent._OutlineScaledMaxDistance = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'outlineScaledMaxDistance', }); MToonMaterialContent._OutlineColor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'outlineColor', }); MToonMaterialContent._OutlineLightingMix = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'outlineLightingMix', }); MToonMaterialContent.Aspect = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'aspect' }); MToonMaterialContent.CameraUp = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_9__.ShaderSemanticsClass({ str: 'cameraUp' }); /***/ }), /***/ "./src/foundation/materials/contents/MatCapMaterialContent.ts": /*!********************************************************************!*\ !*** ./src/foundation/materials/contents/MatCapMaterialContent.ts ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MatCapMaterialContent: () => (/* binding */ MatCapMaterialContent) /* harmony export */ }); /* harmony import */ var _textures_AbstractTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../textures/AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _textures_Texture__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../textures/Texture */ "./src/foundation/textures/Texture.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _webgl_shaderity_shaders_MatCapShader_MatCapShader_vert__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/MatCapShader/MatCapShader.vert */ "./src/webgl/shaderity_shaders/MatCapShader/MatCapShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_MatCapShader_MatCapShader_frag__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/MatCapShader/MatCapShader.frag */ "./src/webgl/shaderity_shaders/MatCapShader/MatCapShader.frag"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class MatCapMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_10__.AbstractMaterialContent { constructor(isSkinning, uri, texture, sampler) { super(null, 'MatCapShading' + (isSkinning ? '+skinning' : ''), { isSkinning: isSkinning }, _webgl_shaderity_shaders_MatCapShader_MatCapShader_vert__WEBPACK_IMPORTED_MODULE_11__["default"], _webgl_shaderity_shaders_MatCapShader_MatCapShader_frag__WEBPACK_IMPORTED_MODULE_12__["default"]); let matCapTexture; if (typeof uri === 'string') { matCapTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_8__.Texture(); (async function (uri) { matCapTexture.generateTextureFromUri(uri, { type: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.UnsignedByte, }); await matCapTexture.loadFromUrlLazy(); })(uri); } else if (texture instanceof _textures_AbstractTexture__WEBPACK_IMPORTED_MODULE_0__.AbstractTexture) { matCapTexture = texture; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('no matcap texture'); matCapTexture = _core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackTexture; } const shaderSemanticsInfoArray = []; shaderSemanticsInfoArray.push({ semantic: 'wireframe', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.fromCopyArray([0, 0, 1]), min: 0, max: 10, }); // point cloud shaderSemanticsInfoArray.push({ semantic: 'pointSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_5__.Scalar.fromCopyNumber(30.0), min: 0, max: 100, }, { semantic: 'pointDistanceAttenuation', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_9__.Vector3.fromCopyArray([0.0, 0.1, 0.01]), min: 0, max: 1, }); shaderSemanticsInfoArray.push({ semantic: 'matCapTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [0, matCapTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }); this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); /// Matrices let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_2__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_1__.CameraComponent.current); } this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); } } } MatCapMaterialContent.MatCapTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_6__.ShaderSemanticsClass({ str: 'matCapTexture' }); /***/ }), /***/ "./src/foundation/materials/contents/ShadowMapDecodeClassicMaterialContent.ts": /*!************************************************************************************!*\ !*** ./src/foundation/materials/contents/ShadowMapDecodeClassicMaterialContent.ts ***! \************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShadowMapDecodeClassicMaterialContent: () => (/* binding */ ShadowMapDecodeClassicMaterialContent) /* harmony export */ }); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ShadingModel */ "./src/foundation/definitions/ShadingModel.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _webgl_shaderity_shaders_ShadowMapDecodeClassicSingleShader_ShadowMapDecodeClassicSingleShader_vert__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.vert */ "./src/webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_ShadowMapDecodeClassicSingleShader_ShadowMapDecodeClassicSingleShader_frag__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.frag */ "./src/webgl/shaderity_shaders/ShadowMapDecodeClassicSingleShader/ShadowMapDecodeClassicSingleShader.frag"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class ShadowMapDecodeClassicMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent { /** * The constructor of the ShadowMapDecodeClassicMaterialContent * @param isMorphing True if the morphing is to be applied * @param isSkinning True if the skeleton is to be applied * @param isLighting True if the lighting is to be applied. When isLighting is false, the Shader draws the original color of the material, except for the shadow area. * @param isDebugging True if the shader displays the DebugColorFactor color in areas outside of the depth map. * @param colorAttachmentsNumber The index of colorAttachment in a framebuffer. The colorAttachment must have depth information drawn by the DepthEncodeMaterialContent. * @param encodedDepthRenderPass The render pass where the depth information from the DepthEncodeMaterialContent is drawn to the frame buffer */ constructor({ isMorphing, isSkinning, isLighting, isDebugging, colorAttachmentsNumber, }, encodedDepthRenderPass) { super(null, 'ShadowMapDecodeClassicShading' + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting'), { isMorphing, isSkinning, isLighting }, _webgl_shaderity_shaders_ShadowMapDecodeClassicSingleShader_ShadowMapDecodeClassicSingleShader_vert__WEBPACK_IMPORTED_MODULE_15__["default"], _webgl_shaderity_shaders_ShadowMapDecodeClassicSingleShader_ShadowMapDecodeClassicSingleShader_frag__WEBPACK_IMPORTED_MODULE_16__["default"]); this.__encodedDepthRenderPass = encodedDepthRenderPass; const encodedDepthFramebuffer = encodedDepthRenderPass.getFramebuffer(); if (encodedDepthFramebuffer == null) { _misc_Logger__WEBPACK_IMPORTED_MODULE_18__.Logger.error('encodedDepthRenderPass does not have framebuffer'); return; } const encodedDepthTexture = encodedDepthFramebuffer.colorAttachments[colorAttachmentsNumber]; const viewport = encodedDepthRenderPass.getViewport(); viewport.setComponents(1, 1, viewport.z - 1, viewport.w - 1); encodedDepthRenderPass.setViewport(viewport); const shaderSemanticsInfoArray = [ { semantic: 'lightViewProjectionMatrix', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, initialValue: _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_14__.MutableMatrix44.zero(), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, }, { semantic: 'shadingModel', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(_definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_6__.ShadingModel.Constant.index), min: 0, max: 3, }, { semantic: 'shininess', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(5), min: 0, max: Number.MAX_VALUE, }, { semantic: 'allowableDepthError', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.0001), min: 0, max: 1, }, { semantic: 'shadowColorFactor', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([0.5, 0.5, 0.5, 1]), min: 0, max: 1, }, { semantic: 'diffuseColorFactor', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([1, 1, 1, 1]), min: 0, max: 2, }, { semantic: 'isPointLight', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Bool, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(1), min: 0, max: 1, }, { semantic: 'wireframe', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0, 0, 1]), min: 0, max: 10, }, { semantic: 'normalTexture', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [0, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__.dummyBlueTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'depthTexture', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [0, encodedDepthTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'diffuseColorTexture', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [1, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__.dummyWhiteTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'zNearInner', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.1), min: 0.0001, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'zFarInner', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(10000.0), min: 0.0001, max: Number.MAX_SAFE_INTEGER, }, ]; shaderSemanticsInfoArray.push({ semantic: 'pointSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(30.0), min: 0, max: 100, }, { semantic: 'pointDistanceAttenuation', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0.0, 0.1, 0.01]), min: 0, max: 1, }); if (isMorphing) { shaderSemanticsInfoArray.push({ semantic: 'morphTargetNumber', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0), min: 0, max: _core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader, needUniformInDataTextureMode: true, }, { semantic: 'dataTextureMorphOffsetPosition', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Int32Array(_core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, { semantic: 'morphWeights', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Float32Array(_core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }); } if (isDebugging) { shaderSemanticsInfoArray.push({ semantic: 'debugColorFactor', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([1, 0, 0, 1]), min: 0, max: 2, }); } this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_8__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_9__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_9__.CameraComponent.current); } const encodedDepthCameraComponent = this.__encodedDepthRenderPass .cameraComponent; if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); if (ShadowMapDecodeClassicMaterialContent.__lastZNear !== encodedDepthCameraComponent.zNearInner) { shaderProgram._gl.uniform1f(shaderProgram.zNearInner, encodedDepthCameraComponent.zNearInner); ShadowMapDecodeClassicMaterialContent.__lastZNear = encodedDepthCameraComponent.zNearInner; } if (ShadowMapDecodeClassicMaterialContent.__lastZFar !== encodedDepthCameraComponent.zFarInner) { shaderProgram._gl.uniform1f(shaderProgram.zFarInner, encodedDepthCameraComponent.zFarInner); ShadowMapDecodeClassicMaterialContent.__lastZFar = encodedDepthCameraComponent.zFarInner; } const __webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_13__.CGAPIResourceRepository.getWebGLResourceRepository(); __webglResourceRepository.setUniformValue(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.LightViewProjectionMatrix.str, true, this.__encodedDepthRenderPass.cameraComponent.viewProjectionMatrix); } else { material.setParameter('zNearInner', encodedDepthCameraComponent.zNearInner); material.setParameter('zFarInner', encodedDepthCameraComponent.zFarInner); material.setParameter('lightViewProjectionMatrix', this.__encodedDepthRenderPass.cameraComponent.viewProjectionMatrix); } /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); // Morph const blendShapeComponent = args.entity.tryToGetBlendShape(); this.setMorphInfo(shaderProgram, args.entity.getMesh(), args.primitive, blendShapeComponent); } } ShadowMapDecodeClassicMaterialContent.ShadowColorFactor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'shadowColorFactor', }); ShadowMapDecodeClassicMaterialContent.ShadowAlpha = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'shadowAlpha', }); ShadowMapDecodeClassicMaterialContent.NonShadowAlpha = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'nonShadowAlpha', }); ShadowMapDecodeClassicMaterialContent.AllowableDepthError = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'allowableDepthError', }); ShadowMapDecodeClassicMaterialContent.zNearInner = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'zNearInner' }); ShadowMapDecodeClassicMaterialContent.zFarInner = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'zFarInner' }); ShadowMapDecodeClassicMaterialContent.DebugColorFactor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'debugColorFactor', }); ShadowMapDecodeClassicMaterialContent.DepthTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'depthTexture', }); ShadowMapDecodeClassicMaterialContent.IsPointLight = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'isPointLight' }); ShadowMapDecodeClassicMaterialContent.__lastZNear = 0.0; ShadowMapDecodeClassicMaterialContent.__lastZFar = 0.0; /***/ }), /***/ "./src/foundation/materials/contents/SynthesizeHdrMaterialContent.ts": /*!***************************************************************************!*\ !*** ./src/foundation/materials/contents/SynthesizeHdrMaterialContent.ts ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SynthesizeHdrMaterialContent: () => (/* binding */ SynthesizeHdrMaterialContent) /* harmony export */ }); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _webgl_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_vert__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert */ "./src/webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_frag__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag */ "./src/webgl/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag"); /* harmony import */ var _webgpu_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_vert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert */ "./src/webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.vert"); /* harmony import */ var _webgpu_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_frag__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag */ "./src/webgpu/shaderity_shaders/SynthesizeHDRTextureShader/SynthesizeHDRTextureShader.frag"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class SynthesizeHdrMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_6__.AbstractMaterialContent { /** * This material node uses for the glare effect and so on. * * If the targetRegionTexture is not specified, the shader synthesizes all the * synthesizeTextures with all the pixels weighted by the synthesizeCoefficient. * * If the targetRegionTexture is specified, the shader synthesizes all the * synthesizeTextures with weights only for the non-white pixels of * targetRegionTexture (where the color is not (1.0, 1.0, 1.0, 1.0)). On the other * hand, in the white area, the output value is the product of the value of each * pixel in synthesizeTextures[0] and synthesizeCoefficient[0]. * * @synthesizeTextures Textures to be synthesized. The shader supports up to six texture syntheses. * @targetRegionTexture Texture to specify the area where the texture will be synthesized */ constructor(synthesizeTextures) { var _a, _b, _c, _d, _e, _f; super(null, 'synthesizeHDRTextureShading', {}); this.textureNumber = synthesizeTextures.length; const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_13__.Sampler({ wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.ClampToEdge, minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Linear, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Linear, }); sampler.create(); const shaderSemanticsInfoArray = [ { semantic: 'synthesizeCoefficient', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.ScalarArray, arrayLength: 6, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_7__.VectorN(new Float32Array(6)), min: 0, max: 1, needUniformInDataTextureMode: true, }, { semantic: 'synthesizeTexture0', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: [0, (_a = synthesizeTextures[0]) !== null && _a !== void 0 ? _a : _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'synthesizeTexture1', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: [1, (_b = synthesizeTextures[1]) !== null && _b !== void 0 ? _b : _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'synthesizeTexture2', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: [2, (_c = synthesizeTextures[2]) !== null && _c !== void 0 ? _c : _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'synthesizeTexture3', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: [3, (_d = synthesizeTextures[3]) !== null && _d !== void 0 ? _d : _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'synthesizeTexture4', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: [4, (_e = synthesizeTextures[4]) !== null && _e !== void 0 ? _e : _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'synthesizeTexture5', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: [5, (_f = synthesizeTextures[5]) !== null && _f !== void 0 ? _f : _core_DummyTextures__WEBPACK_IMPORTED_MODULE_12__.dummyBlackTexture, sampler], min: 0, max: Number.MAX_SAFE_INTEGER, }, ]; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_15__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_16__.ProcessApproach.WebGPU) { this.__vertexShaderityObject = _webgpu_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_vert__WEBPACK_IMPORTED_MODULE_10__["default"]; this.__pixelShaderityObject = _webgpu_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_frag__WEBPACK_IMPORTED_MODULE_11__["default"]; } else { this.__vertexShaderityObject = _webgl_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_vert__WEBPACK_IMPORTED_MODULE_8__["default"]; this.__pixelShaderityObject = _webgl_shaderity_shaders_SynthesizeHDRTextureShader_SynthesizeHDRTextureShader_frag__WEBPACK_IMPORTED_MODULE_9__["default"]; } this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); /// Matrices let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_0__.CameraComponent.current); } if (cameraComponent) { this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); } } shaderProgram._gl.uniform1fv(shaderProgram.synthesizeCoefficient, material.getParameter('synthesizeCoefficient')._v); } get synthesizeTextureNumber() { return this.textureNumber; } } SynthesizeHdrMaterialContent.SynthesizeCoefficient = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeCoefficient', }); SynthesizeHdrMaterialContent.TargetRegionTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'targetRegionTexture', }); SynthesizeHdrMaterialContent.SynthesizeTexture0 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeTexture0', }); SynthesizeHdrMaterialContent.SynthesizeTexture1 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeTexture1', }); SynthesizeHdrMaterialContent.SynthesizeTexture2 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeTexture2', }); SynthesizeHdrMaterialContent.SynthesizeTexture3 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeTexture3', }); SynthesizeHdrMaterialContent.SynthesizeTexture4 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeTexture4', }); SynthesizeHdrMaterialContent.SynthesizeTexture5 = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_4__.ShaderSemanticsClass({ str: 'synthesizeTexture5', }); /***/ }), /***/ "./src/foundation/materials/contents/VarianceShadowMapDecodeClassicMaterialContent.ts": /*!********************************************************************************************!*\ !*** ./src/foundation/materials/contents/VarianceShadowMapDecodeClassicMaterialContent.ts ***! \********************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VarianceShadowMapDecodeClassicMaterialContent: () => (/* binding */ VarianceShadowMapDecodeClassicMaterialContent) /* harmony export */ }); /* harmony import */ var _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ShadingModel */ "./src/foundation/definitions/ShadingModel.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _math_VectorN__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _webgl_shaderity_shaders_VarianceShadowMapDecodeClassicShader_VarianceShadowMapDecodeClassicShader_vert__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.vert */ "./src/webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.vert"); /* harmony import */ var _webgl_shaderity_shaders_VarianceShadowMapDecodeClassicShader_VarianceShadowMapDecodeClassicShader_frag__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.frag */ "./src/webgl/shaderity_shaders/VarianceShadowMapDecodeClassicShader/VarianceShadowMapDecodeClassicShader.frag"); /* harmony import */ var _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class VarianceShadowMapDecodeClassicMaterialContent extends _core_AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_1__.AbstractMaterialContent { /** * The constructor of the VarianceShadowMapDecodeClassicMaterialContent * @param isMorphing True if the morphing is to be applied * @param isSkinning True if the skeleton is to be applied * @param isLighting True if the lighting is to be applied. When isLighting is false, the Shader draws the original color of the material, except for the shadow area. * @param isDebugging True if the shader displays the DebugColorFactor color in areas outside of the depth map. * * * * * @param colorAttachmentsNumber The index of colorAttachment in a framebuffer. The colorAttachment must have depth information drawn by the DepthEncodeMaterialContent. * @param encodedDepthRenderPass The render pass where the depth information from the DepthEncodeMaterialContent is drawn to the frame buffer */ constructor({ isMorphing, isSkinning, isLighting, isDebugging, colorAttachmentsNumberDepth, colorAttachmentsNumberSquareDepth, depthCameraComponent, }, encodedDepthRenderPasses) { super(null, 'varianceShadowMapDecodeShading' + (isMorphing ? '+morphing' : '') + (isSkinning ? '+skinning' : '') + (isLighting ? '' : '-lighting') + (isDebugging ? '' : '+debugging'), { isMorphing, isSkinning, isLighting }, _webgl_shaderity_shaders_VarianceShadowMapDecodeClassicShader_VarianceShadowMapDecodeClassicShader_vert__WEBPACK_IMPORTED_MODULE_15__["default"], _webgl_shaderity_shaders_VarianceShadowMapDecodeClassicShader_VarianceShadowMapDecodeClassicShader_frag__WEBPACK_IMPORTED_MODULE_16__["default"]); if (encodedDepthRenderPasses.length !== 2) { _misc_Logger__WEBPACK_IMPORTED_MODULE_18__.Logger.error('invalid length of renderPasses'); } if (depthCameraComponent == null) { _misc_Logger__WEBPACK_IMPORTED_MODULE_18__.Logger.warn('need to set depth camera component'); } else { this.__depthCameraComponent = depthCameraComponent; } for (const encodedDepthRenderPass of encodedDepthRenderPasses) { const viewport = encodedDepthRenderPass.getViewport(); viewport.setComponents(1, 1, viewport.z - 1, viewport.w - 1); encodedDepthRenderPass.setViewport(viewport); } let depthTexture; const depthFramebuffer = encodedDepthRenderPasses[0].getFramebuffer(); if (depthFramebuffer) { depthTexture = depthFramebuffer.colorAttachments[colorAttachmentsNumberDepth]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_18__.Logger.warn('renderPass of depth does not have framebuffer'); depthTexture = _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__.dummyBlackTexture; } let squareDepthTexture; const squareDepthFramebuffer = encodedDepthRenderPasses[1].getFramebuffer(); if (squareDepthFramebuffer) { squareDepthTexture = squareDepthFramebuffer.colorAttachments[colorAttachmentsNumberSquareDepth]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_18__.Logger.warn('renderPass of square depth does not have framebuffer'); squareDepthTexture = _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__.dummyBlackTexture; } const shaderSemanticsInfoArray = [ { semantic: 'lightViewProjectionMatrix', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, initialValue: _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_14__.MutableMatrix44.zero(), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, }, { semantic: 'shadingModel', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(_definitions_ShadingModel__WEBPACK_IMPORTED_MODULE_6__.ShadingModel.Constant.index), min: 0, max: 3, }, { semantic: 'shininess', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(5), min: 0, max: Number.MAX_VALUE, }, { semantic: 'allowableDepthError', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.0001), min: 0, max: 1, }, { semantic: 'shadowColor', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([0.5, 0.5, 0.5, 1]), min: 0, max: 1, }, { semantic: 'diffuseColorFactor', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([1, 1, 1, 1]), min: 0, max: 2, }, { semantic: 'zNearInner', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.1), min: 0.0001, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'zFarInner', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, isInternalSetting: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(10000.0), min: 0.0001, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'isPointLight', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Bool, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(1), min: 0, max: 1, }, { semantic: 'wireframe', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0, 0, 1]), min: 0, max: 10, }, { semantic: 'depthAdjustment', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.0), min: 0, max: 1, }, { semantic: 'lightBleedingParameter', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.0), min: 0, max: 1, }, { semantic: 'minimumVariance', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.0000001), min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'textureDepthAdjustment', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0.0), min: 0, max: 1, }, { semantic: 'normalTexture', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [0, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__.dummyBlueTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'diffuseColorTexture', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [1, _core_DummyTextures__WEBPACK_IMPORTED_MODULE_17__.dummyWhiteTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'depthTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [2, depthTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, { semantic: 'squareDepthTexture', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: [3, squareDepthTexture], min: 0, max: Number.MAX_SAFE_INTEGER, }, ]; // point cloud shaderSemanticsInfoArray.push({ semantic: 'pointSize', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(30.0), min: 0, max: 100, }, { semantic: 'pointDistanceAttenuation', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, soloDatum: true, initialValue: _math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0.0, 0.1, 0.01]), min: 0, max: 1, }); if (isMorphing) { shaderSemanticsInfoArray.push({ semantic: 'morphTargetNumber', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: _math_Scalar__WEBPACK_IMPORTED_MODULE_11__.Scalar.fromCopyNumber(0), min: 0, max: _core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader, needUniformInDataTextureMode: true, }, { semantic: 'dataTextureMorphOffsetPosition', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Int32Array(_core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }, { semantic: 'morphWeights', componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.ScalarArray, arrayLength: _core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.VertexShader, isInternalSetting: true, soloDatum: true, initialValue: new _math_VectorN__WEBPACK_IMPORTED_MODULE_10__.VectorN(new Float32Array(_core_Config__WEBPACK_IMPORTED_MODULE_12__.Config.maxVertexMorphNumberInShader)), min: -Number.MAX_VALUE, max: Number.MAX_VALUE, needUniformInDataTextureMode: true, }); } if (isDebugging) { shaderSemanticsInfoArray.push({ semantic: 'debugColorFactor', compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, stage: _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_7__.ShaderType.PixelShader, initialValue: _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([1, 0, 0, 1]), min: 0, max: 2, }); } this.setShaderSemanticsInfoArray(shaderSemanticsInfoArray); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { var _a; let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_8__.ComponentRepository.getComponent(_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_9__.CameraComponent, _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_9__.CameraComponent.current); } const encodedDepthCameraComponent = (_a = this.__depthCameraComponent) !== null && _a !== void 0 ? _a : args.renderPass.cameraComponent; if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); if (VarianceShadowMapDecodeClassicMaterialContent.__lastZNear !== encodedDepthCameraComponent.zNearInner) { shaderProgram._gl.uniform1f(shaderProgram.zNearInner, encodedDepthCameraComponent.zNearInner); VarianceShadowMapDecodeClassicMaterialContent.__lastZNear = encodedDepthCameraComponent.zNearInner; } if (VarianceShadowMapDecodeClassicMaterialContent.__lastZFar !== encodedDepthCameraComponent.zFarInner) { shaderProgram._gl.uniform1f(shaderProgram.zFarInner, encodedDepthCameraComponent.zFarInner); VarianceShadowMapDecodeClassicMaterialContent.__lastZFar = encodedDepthCameraComponent.zFarInner; } const __webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_13__.CGAPIResourceRepository.getWebGLResourceRepository(); __webglResourceRepository.setUniformValue(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.LightViewProjectionMatrix.str, true, encodedDepthCameraComponent.viewProjectionMatrix); } else { material.setParameter('zNearInner', encodedDepthCameraComponent.zNearInner); material.setParameter('zFarInner', encodedDepthCameraComponent.zFarInner); material.setParameter('lightViewProjectionMatrix', encodedDepthCameraComponent.viewProjectionMatrix); } /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); // Morph const blendShapeComponent = args.entity.tryToGetBlendShape(); this.setMorphInfo(shaderProgram, args.entity.getMesh(), args.primitive, blendShapeComponent); const __webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_13__.CGAPIResourceRepository.getWebGLResourceRepository(); __webglResourceRepository.setUniformValue(shaderProgram, _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics.LightViewProjectionMatrix.str, true, encodedDepthCameraComponent.viewProjectionMatrix); } set depthCameraComponent(depthCameraComponent) { this.__depthCameraComponent = depthCameraComponent; } } VarianceShadowMapDecodeClassicMaterialContent.IsPointLight = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'isPointLight' }); VarianceShadowMapDecodeClassicMaterialContent.DepthTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'depthTexture' }); VarianceShadowMapDecodeClassicMaterialContent.SquareDepthTexture = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'squareDepthTexture', }); VarianceShadowMapDecodeClassicMaterialContent.DepthAdjustment = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'depthAdjustment' }); VarianceShadowMapDecodeClassicMaterialContent.TextureDepthAdjustment = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'textureDepthAdjustment', }); VarianceShadowMapDecodeClassicMaterialContent.MinimumVariance = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'minimumVariance' }); VarianceShadowMapDecodeClassicMaterialContent.LightBleedingParameter = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'lightBleedingParameter', }); VarianceShadowMapDecodeClassicMaterialContent.ShadowColor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'shadowColor' }); VarianceShadowMapDecodeClassicMaterialContent.AllowableDepthError = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'allowableDepthError', }); VarianceShadowMapDecodeClassicMaterialContent.zNearInner = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'zNearInner' }); VarianceShadowMapDecodeClassicMaterialContent.zFarInner = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'zFarInner' }); VarianceShadowMapDecodeClassicMaterialContent.DebugColorFactor = new _definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass({ str: 'debugColorFactor', }); VarianceShadowMapDecodeClassicMaterialContent.__lastZNear = 0.0; VarianceShadowMapDecodeClassicMaterialContent.__lastZFar = 0.0; /***/ }), /***/ "./src/foundation/materials/contents/index.ts": /*!****************************************************!*\ !*** ./src/foundation/materials/contents/index.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ColorGradingUsingLUTsMaterialContent: () => (/* reexport safe */ _ColorGradingUsingLUTsMaterialContent__WEBPACK_IMPORTED_MODULE_0__.ColorGradingUsingLUTsMaterialContent), /* harmony export */ CustomMaterialContent: () => (/* reexport safe */ _CustomMaterialContent__WEBPACK_IMPORTED_MODULE_1__.CustomMaterialContent), /* harmony export */ DepthEncodeMaterialContent: () => (/* reexport safe */ _DepthEncodeMaterialContent__WEBPACK_IMPORTED_MODULE_2__.DepthEncodeMaterialContent), /* harmony export */ DetectHighLuminanceMaterialContent: () => (/* reexport safe */ _DetectHighLuminanceMaterialContent__WEBPACK_IMPORTED_MODULE_3__.DetectHighLuminanceMaterialContent), /* harmony export */ EntityUIDOutputMaterialContent: () => (/* reexport safe */ _EntityUIDOutputMaterialContent__WEBPACK_IMPORTED_MODULE_4__.EntityUIDOutputMaterialContent), /* harmony export */ FurnaceTestMaterialContent: () => (/* reexport safe */ _FurnaceTestMaterialContent__WEBPACK_IMPORTED_MODULE_5__.FurnaceTestMaterialContent), /* harmony export */ MToonMaterialContent: () => (/* reexport safe */ _MToonMaterialContent__WEBPACK_IMPORTED_MODULE_6__.MToonMaterialContent), /* harmony export */ MatCapMaterialContent: () => (/* reexport safe */ _MatCapMaterialContent__WEBPACK_IMPORTED_MODULE_7__.MatCapMaterialContent), /* harmony export */ ShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _ShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_8__.ShadowMapDecodeClassicMaterialContent), /* harmony export */ SynthesizeHdrMaterialContent: () => (/* reexport safe */ _SynthesizeHdrMaterialContent__WEBPACK_IMPORTED_MODULE_9__.SynthesizeHdrMaterialContent), /* harmony export */ VarianceShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _VarianceShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_10__.VarianceShadowMapDecodeClassicMaterialContent) /* harmony export */ }); /* harmony import */ var _ColorGradingUsingLUTsMaterialContent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ColorGradingUsingLUTsMaterialContent */ "./src/foundation/materials/contents/ColorGradingUsingLUTsMaterialContent.ts"); /* harmony import */ var _CustomMaterialContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CustomMaterialContent */ "./src/foundation/materials/contents/CustomMaterialContent.ts"); /* harmony import */ var _DepthEncodeMaterialContent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DepthEncodeMaterialContent */ "./src/foundation/materials/contents/DepthEncodeMaterialContent.ts"); /* harmony import */ var _DetectHighLuminanceMaterialContent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DetectHighLuminanceMaterialContent */ "./src/foundation/materials/contents/DetectHighLuminanceMaterialContent.ts"); /* harmony import */ var _EntityUIDOutputMaterialContent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EntityUIDOutputMaterialContent */ "./src/foundation/materials/contents/EntityUIDOutputMaterialContent.ts"); /* harmony import */ var _FurnaceTestMaterialContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FurnaceTestMaterialContent */ "./src/foundation/materials/contents/FurnaceTestMaterialContent.ts"); /* harmony import */ var _MToonMaterialContent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MToonMaterialContent */ "./src/foundation/materials/contents/MToonMaterialContent.ts"); /* harmony import */ var _MatCapMaterialContent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./MatCapMaterialContent */ "./src/foundation/materials/contents/MatCapMaterialContent.ts"); /* harmony import */ var _ShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ShadowMapDecodeClassicMaterialContent */ "./src/foundation/materials/contents/ShadowMapDecodeClassicMaterialContent.ts"); /* harmony import */ var _SynthesizeHdrMaterialContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./SynthesizeHdrMaterialContent */ "./src/foundation/materials/contents/SynthesizeHdrMaterialContent.ts"); /* harmony import */ var _VarianceShadowMapDecodeClassicMaterialContent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./VarianceShadowMapDecodeClassicMaterialContent */ "./src/foundation/materials/contents/VarianceShadowMapDecodeClassicMaterialContent.ts"); /***/ }), /***/ "./src/foundation/materials/core/AbstractMaterialContent.ts": /*!******************************************************************!*\ !*** ./src/foundation/materials/core/AbstractMaterialContent.ts ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractMaterialContent: () => (/* binding */ AbstractMaterialContent) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _math_MutableVector2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../definitions/BoneDataType */ "./src/foundation/definitions/BoneDataType.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _ShaderityUtilityWebGPU__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ShaderityUtilityWebGPU */ "./src/foundation/materials/core/ShaderityUtilityWebGPU.ts"); /* harmony import */ var _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ShaderityUtilityWebGL */ "./src/foundation/materials/core/ShaderityUtilityWebGL.ts"); class AbstractMaterialContent extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor(shader, shaderFunctionName, { isMorphing = false, isSkinning = false, isLighting = false } = {}, vertexShaderityObject, pixelShaderityObject) { super(); this.__semantics = []; this.isSingleOperation = false; this.__definitions = ''; this.shaderType = _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexAndPixelShader; this.__shaderFunctionName = shaderFunctionName; this.__isMorphing = isMorphing; this.__isSkinning = isSkinning; this.__isLighting = isLighting; this.__vertexShaderityObject = vertexShaderityObject; this.__pixelShaderityObject = pixelShaderityObject; this.__definitions += `#define RN_MATERIAL_NODE_NAME ${shaderFunctionName}\n`; } get shaderFunctionName() { return this.__shaderFunctionName; } get vertexShaderityObject() { return this.__vertexShaderityObject; } get pixelShaderityObject() { return this.__pixelShaderityObject; } getDefinitions() { return this.__definitions; } static getMaterialNode(materialNodeUid) { return AbstractMaterialContent.materialNodes[materialNodeUid]; } get _semanticsInfoArray() { return this.__semantics; } get isSkinning() { return this.__isSkinning; } get isMorphing() { return this.__isMorphing; } get isLighting() { return this.__isLighting; } setShaderSemanticsInfoArray(shaderSemanticsInfoArray) { const infoArray = []; for (const info of shaderSemanticsInfoArray) { infoArray.push(info); } this.__semantics = infoArray; if (!AbstractMaterialContent.__semanticsMap.has(this.shaderFunctionName)) { AbstractMaterialContent.__semanticsMap.set(this.shaderFunctionName, new Map()); } const map = AbstractMaterialContent.__semanticsMap.get(this.shaderFunctionName); for (const semantic of this.__semantics) { map.set(semantic.semantic, semantic); } } getShaderSemanticInfoFromName(name) { const map = AbstractMaterialContent.__semanticsMap.get(this.shaderFunctionName); return map.get(name); } setupBasicInfo(args, shaderProgram, firstTime, material, CameraComponentClass) { if (args.setUniform) { this.setWorldMatrix(shaderProgram, args.worldMatrix); this.setNormalMatrix(shaderProgram, args.normalMatrix); this.setIsBillboard(shaderProgram, args.isBillboard); if (firstTime || args.isVr) { let cameraComponent = args.renderPass.cameraComponent; if (cameraComponent == null) { cameraComponent = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_12__.ComponentRepository.getComponent(CameraComponentClass, CameraComponentClass.current); } this.setViewInfo(shaderProgram, cameraComponent, args.isVr, args.displayIdx); this.setProjection(shaderProgram, cameraComponent, args.isVr, args.displayIdx); } if (firstTime) { // Lights this.setLightsInfo(shaderProgram, args.lightComponents, material, args.setUniform); /// Skinning const skeletalComponent = args.entity.tryToGetSkeletal(); this.setSkinning(shaderProgram, args.setUniform, skeletalComponent); } } // Morph const blendShapeComponent = args.entity.tryToGetBlendShape(); this.setMorphInfo(shaderProgram, args.entity.getMesh(), args.primitive, blendShapeComponent); } setWorldMatrix(shaderProgram, worldMatrix) { shaderProgram._gl.uniformMatrix4fv(shaderProgram.worldMatrix, false, worldMatrix._v); } setNormalMatrix(shaderProgram, normalMatrix) { shaderProgram._gl.uniformMatrix3fv(shaderProgram.normalMatrix, false, normalMatrix._v); } setIsBillboard(shaderProgram, isBillboard) { shaderProgram._gl.uniform1i(shaderProgram.isBillboard, isBillboard ? 1 : 0); } setViewInfo(shaderProgram, cameraComponent, isVr, displayIdx) { let viewMatrix; let cameraPosition; if (isVr) { const rnXRModule = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_11__.ModuleManager.getInstance().getModule('xr'); const webxrSystem = rnXRModule.WebXRSystem.getInstance(); if (webxrSystem.isWebXRMode) { viewMatrix = webxrSystem._getViewMatrixAt(displayIdx); cameraPosition = webxrSystem._getCameraWorldPositionAt(displayIdx); } } else if (cameraComponent) { cameraPosition = cameraComponent.worldPosition; viewMatrix = cameraComponent.viewMatrix; } else { viewMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__.MutableMatrix44.identity(); cameraPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_4__.Vector3.fromCopyArray([0, 0, 10]); } shaderProgram._gl.uniformMatrix4fv(shaderProgram.viewMatrix, false, viewMatrix._v); shaderProgram._gl.uniform3fv(shaderProgram.viewPosition, cameraPosition._v); } setProjection(shaderProgram, cameraComponent, isVr, displayIdx) { let projectionMatrix; if (isVr) { const rnXRModule = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_11__.ModuleManager.getInstance().getModule('xr'); const webxrSystem = rnXRModule.WebXRSystem.getInstance(); if (webxrSystem.isWebXRMode) { projectionMatrix = webxrSystem._getProjectMatrixAt(displayIdx); } } else if (cameraComponent) { projectionMatrix = cameraComponent.projectionMatrix; } else { projectionMatrix = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__.MutableMatrix44.identity(); } shaderProgram._gl.uniformMatrix4fv(shaderProgram.projectionMatrix, false, projectionMatrix._v); } setSkinning(shaderProgram, setUniform, skeletalComponent) { if (!this.__isSkinning) { return; } if (skeletalComponent) { if (setUniform) { if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_8__.BoneDataType.Mat43x1) { const jointMatricesArray = skeletalComponent.jointMatricesArray; shaderProgram._gl.uniformMatrix4x3fv(shaderProgram.boneMatrix, false, jointMatricesArray); } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_8__.BoneDataType.Vec4x2) { const jointTranslatePackedQuat = skeletalComponent.jointTranslatePackedQuat; const jointScalePackedQuat = skeletalComponent.jointScalePackedQuat; shaderProgram._gl.uniform4fv(shaderProgram.boneTranslatePackedQuat, jointTranslatePackedQuat); shaderProgram._gl.uniform4fv(shaderProgram.boneScalePackedQuat, jointScalePackedQuat); } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_8__.BoneDataType.Vec4x2Old) { const jointQuaternionArray = skeletalComponent.jointQuaternionArray; const jointTranslateScaleArray = skeletalComponent.jointTranslateScaleArray; shaderProgram._gl.uniform4fv(shaderProgram.boneQuaternion, jointQuaternionArray); shaderProgram._gl.uniform4fv(shaderProgram.boneTranslateScale, jointTranslateScaleArray); } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_8__.BoneDataType.Vec4x1) { const jointCompressedChunk = skeletalComponent.jointCompressedChunk; const jointCompressedInfo = skeletalComponent.jointCompressedInfo; shaderProgram._gl.uniform4fv(shaderProgram.boneCompressedChunk, jointCompressedChunk); shaderProgram._gl.uniform4fv(shaderProgram.boneCompressedInfo, jointCompressedInfo._v); } shaderProgram._gl.uniform1i(shaderProgram.skinningMode, skeletalComponent.componentSID); } } else { if (setUniform) { shaderProgram._gl.uniform1i(shaderProgram.skinningMode, -1); } } } setLightsInfo(shaderProgram, lightComponents, material, setUniform) { if (!this.__isLighting) { return; } if (setUniform) { const lightComponentsEnabled = lightComponents.filter((lightComponent) => lightComponent.enable); shaderProgram._gl.uniform1i(shaderProgram.lightNumber, lightComponentsEnabled.length); const length = Math.min(lightComponentsEnabled.length, _core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxLightNumberInShader); if (AbstractMaterialContent.__lightPositions.length !== 3 * length) { AbstractMaterialContent.__lightPositions = new Float32Array(3 * length); AbstractMaterialContent.__lightDirections = new Float32Array(3 * length); AbstractMaterialContent.__lightIntensities = new Float32Array(3 * length); AbstractMaterialContent.__lightProperties = new Float32Array(4 * length); } for (let i = 0; i < lightComponentsEnabled.length; i++) { if (i >= _core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxLightNumberInShader) { break; } if (shaderProgram.lightPosition == null) { break; } const lightComponent = lightComponentsEnabled[i]; const sceneGraphComponent = lightComponent.entity.getSceneGraph(); const worldLightPosition = sceneGraphComponent.worldPosition; const worldLightDirection = lightComponent.direction; const worldLightIntensity = lightComponent.intensity; AbstractMaterialContent.__lightPositions[i * 3 + 0] = worldLightPosition.x; AbstractMaterialContent.__lightPositions[i * 3 + 1] = worldLightPosition.y; AbstractMaterialContent.__lightPositions[i * 3 + 2] = worldLightPosition.z; const lightAngleScale = 1.0 / Math.max(0.001, Math.cos(lightComponent.innerConeAngle) - Math.cos(lightComponent.outerConeAngle)); const lightAngleOffset = -Math.cos(lightComponent.outerConeAngle) * lightAngleScale; AbstractMaterialContent.__lightDirections[i * 3 + 0] = worldLightDirection.x; AbstractMaterialContent.__lightDirections[i * 3 + 1] = worldLightDirection.y; AbstractMaterialContent.__lightDirections[i * 3 + 2] = worldLightDirection.z; AbstractMaterialContent.__lightIntensities[i * 3 + 0] = worldLightIntensity.x; AbstractMaterialContent.__lightIntensities[i * 3 + 1] = worldLightIntensity.y; AbstractMaterialContent.__lightIntensities[i * 3 + 2] = worldLightIntensity.z; AbstractMaterialContent.__lightProperties[i * 4 + 0] = // LightType lightComponent.enable ? lightComponent.type.index : -1; AbstractMaterialContent.__lightProperties[i * 4 + 1] = lightComponent.range; // Light Range AbstractMaterialContent.__lightProperties[i * 4 + 2] = lightAngleScale; AbstractMaterialContent.__lightProperties[i * 4 + 3] = lightAngleOffset; } if (length > 0) { shaderProgram._gl.uniform3fv(shaderProgram.lightPosition, AbstractMaterialContent.__lightPositions); shaderProgram._gl.uniform3fv(shaderProgram.lightDirection, AbstractMaterialContent.__lightDirections); shaderProgram._gl.uniform3fv(shaderProgram.lightIntensity, AbstractMaterialContent.__lightIntensities); shaderProgram._gl.uniform4fv(shaderProgram.lightProperty, AbstractMaterialContent.__lightProperties); } } } setMorphInfo(shaderProgram, meshComponent, primitive, blendShapeComponent) { if (!this.__isMorphing) { return; } if (primitive.targets.length === 0) { shaderProgram._gl.uniform1i(shaderProgram.morphTargetNumber, 0); return; } shaderProgram._gl.uniform1i(shaderProgram.morphTargetNumber, primitive.targets.length); const dataTextureMorphOffsetPositionOfTargets = primitive.targets.map((target) => { const accessor = target.get(_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_6__.VertexAttribute.Position.XYZ); let offset = 0; if (_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_7__.ProcessApproach.isDataTextureApproach(_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach)) { offset = _core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.totalSizeOfGPUShaderDataStorageExceptMorphData; } return (offset + accessor.byteOffsetInBuffer) / 4 / 4; }); shaderProgram._gl.uniform1iv(shaderProgram.dataTextureMorphOffsetPosition, dataTextureMorphOffsetPositionOfTargets); let weights; if (blendShapeComponent.weights.length > 0) { weights = blendShapeComponent.weights; } else { weights = new Float32Array(primitive.targets.length); } shaderProgram._gl.uniform1fv(shaderProgram.morphWeights, weights); } _setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { } _setInternalSettingParametersToGpuWebGpu({ material, args, }) { } getDefinition() { return ''; } doShaderReflection(vertexShader, pixelShader, vertexShaderWebGpu, pixelShaderWebGpu) { let vertexShaderData; let pixelShaderData; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_7__.ProcessApproach.WebGPU) { vertexShaderData = _ShaderityUtilityWebGPU__WEBPACK_IMPORTED_MODULE_13__.ShaderityUtilityWebGPU.getShaderDataReflection(vertexShaderWebGpu, AbstractMaterialContent.__semanticsMap.get(this.shaderFunctionName)); pixelShaderData = _ShaderityUtilityWebGPU__WEBPACK_IMPORTED_MODULE_13__.ShaderityUtilityWebGPU.getShaderDataReflection(pixelShaderWebGpu, AbstractMaterialContent.__semanticsMap.get(this.shaderFunctionName)); this.__vertexShaderityObject = vertexShaderData.shaderityObject; this.__pixelShaderityObject = pixelShaderData.shaderityObject; } else { vertexShaderData = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_14__.ShaderityUtilityWebGL.getShaderDataReflection(vertexShader, AbstractMaterialContent.__semanticsMap.get(this.shaderFunctionName)); pixelShaderData = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_14__.ShaderityUtilityWebGL.getShaderDataReflection(pixelShader, AbstractMaterialContent.__semanticsMap.get(this.shaderFunctionName)); this.__vertexShaderityObject = vertexShaderData.shaderityObject; this.__pixelShaderityObject = pixelShaderData.shaderityObject; } const shaderSemanticsInfoArray = []; for (const vertexShaderSemanticsInfo of vertexShaderData.shaderSemanticsInfoArray) { vertexShaderSemanticsInfo.stage = _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexShader; shaderSemanticsInfoArray.push(vertexShaderSemanticsInfo); } for (const pixelShaderSemanticsInfo of pixelShaderData.shaderSemanticsInfoArray) { const foundShaderSemanticsInfo = shaderSemanticsInfoArray.find((vertexInfo) => { if (vertexInfo.semantic === pixelShaderSemanticsInfo.semantic) { return true; } else { return false; } }); if (foundShaderSemanticsInfo) { foundShaderSemanticsInfo.stage = _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.VertexAndPixelShader; } else { pixelShaderSemanticsInfo.stage = _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_10__.ShaderType.PixelShader; shaderSemanticsInfoArray.push(pixelShaderSemanticsInfo); } } return shaderSemanticsInfoArray; } } AbstractMaterialContent.__semanticsMap = new Map(); AbstractMaterialContent.materialNodes = []; AbstractMaterialContent.__tmp_vector4 = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_3__.MutableVector4.zero(); AbstractMaterialContent.__tmp_vector2 = _math_MutableVector2__WEBPACK_IMPORTED_MODULE_2__.MutableVector2.zero(); AbstractMaterialContent.__lightPositions = new Float32Array(0); AbstractMaterialContent.__lightDirections = new Float32Array(0); AbstractMaterialContent.__lightIntensities = new Float32Array(0); AbstractMaterialContent.__lightProperties = new Float32Array(0); /***/ }), /***/ "./src/foundation/materials/core/AbstractShaderNode.ts": /*!*************************************************************!*\ !*** ./src/foundation/materials/core/AbstractShaderNode.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractShaderNode: () => (/* binding */ AbstractShaderNode) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../system */ "./src/foundation/system/index.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /** * AbstractShaderNode is a abstract class that represents a shader node. */ class AbstractShaderNode extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor(shaderNodeName, shader) { super(); this.__inputs = []; this.__outputs = []; this.__inputConnections = []; this._shaderStage = 'Neutral'; this.__shaderFunctionName = shaderNodeName; this.__codeGLSL = shader.codeGLSL; this.__codeWGSL = shader.codeWGSL; this.__shaderNodeUid = ++AbstractShaderNode.__invalidShaderNodeCount; AbstractShaderNode._shaderNodes[AbstractShaderNode.__invalidShaderNodeCount] = this; this.__commonPart = shader.commonPart; } setShaderStage(stage) { this._shaderStage = stage; } getShaderStage() { return this._shaderStage; } static getShaderNodeByUid(uid) { return AbstractShaderNode._shaderNodes[uid]; } /** * Add a node connection to this node as an input. * @param inputShaderNode - a shader node to connect to this node. * @param outputSocketOfInput- the output socket of the inputShaderNode. * @param inputSocketOfThis - the input socket of this node. */ addInputConnection(inputShaderNode, outputSocketOfInput, inputSocketOfThis) { let idx = -1; for (let i = 0; i < this.__inputs.length; i++) { if (this.__inputs[i].name === inputSocketOfThis.name) { idx = i; break; } } this.__inputConnections[idx] = { shaderNodeUid: inputShaderNode.shaderNodeUid, outputNameOfPrev: outputSocketOfInput.name, inputNameOfThis: inputSocketOfThis.name, }; } get shaderFunctionName() { return this.__shaderFunctionName; } getShaderFunctionNameDerivative() { return this.__shaderFunctionName; } getShaderCode(shaderStage) { if (this.__commonPart != null) { if (shaderStage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_1__.ShaderType.VertexShader) { return this.__commonPart.vertexShaderDefinitions; } else { return this.__commonPart.pixelShaderDefinitions; } } else { if (_system__WEBPACK_IMPORTED_MODULE_2__.SystemState.currentProcessApproach === _definitions__WEBPACK_IMPORTED_MODULE_3__.ProcessApproach.WebGPU) { return this.__codeWGSL; } else { return this.__codeGLSL; } } } get shaderNodeUid() { return this.__shaderNodeUid; } getInput(name) { for (const input of this.__inputs) { if (input.name === name) { return input; } } return void 0; } getInputs() { return this.__inputs; } getOutput(name) { for (const output of this.__outputs) { if (output.name === name) { return output; } } return void 0; } getOutputs() { return this.__outputs; } get inputConnections() { return this.__inputConnections; } makeCallStatement(i, shaderNode, functionName, varInputNames, varOutputNames) { let str = ''; const varNames = varInputNames[i].concat(varOutputNames[i]); if (shaderNode.getInputs().length === varInputNames[i].length && shaderNode.getOutputs().length === varOutputNames[i].length) { let rowStr = ''; if (varNames.length > 0) { // Call node functions rowStr += `${functionName}(`; for (let k = 0; k < varNames.length; k++) { const varName = varNames[k]; if (varName == null) { continue; } if (k !== 0) { rowStr += ', '; } if (_system__WEBPACK_IMPORTED_MODULE_2__.SystemState.currentProcessApproach === _definitions__WEBPACK_IMPORTED_MODULE_3__.ProcessApproach.WebGPU && k >= varInputNames[i].length) { rowStr += '&'; } rowStr += varNames[k]; } rowStr += ');\n'; } str += rowStr; } return str; } } AbstractShaderNode._shaderNodes = []; AbstractShaderNode.__invalidShaderNodeCount = -1; /***/ }), /***/ "./src/foundation/materials/core/DummyTextures.ts": /*!********************************************************!*\ !*** ./src/foundation/materials/core/DummyTextures.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DefaultTextures: () => (/* binding */ DefaultTextures), /* harmony export */ dummyAnisotropyTexture: () => (/* binding */ dummyAnisotropyTexture), /* harmony export */ dummyBlackCubeTexture: () => (/* binding */ dummyBlackCubeTexture), /* harmony export */ dummyBlackTexture: () => (/* binding */ dummyBlackTexture), /* harmony export */ dummyBlueTexture: () => (/* binding */ dummyBlueTexture), /* harmony export */ dummySRGBGrayTexture: () => (/* binding */ dummySRGBGrayTexture), /* harmony export */ dummyWhiteTexture: () => (/* binding */ dummyWhiteTexture), /* harmony export */ initDefaultTextures: () => (/* binding */ initDefaultTextures), /* harmony export */ sheenLutTexture: () => (/* binding */ sheenLutTexture) /* harmony export */ }); /* harmony import */ var _textures_CubeTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../textures/CubeTexture */ "./src/foundation/textures/CubeTexture.ts"); /* harmony import */ var _textures_Texture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../textures/Texture */ "./src/foundation/textures/Texture.ts"); const dummyWhiteTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_1__.Texture(); const dummyBlueTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_1__.Texture(); const dummyBlackTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_1__.Texture(); const dummyBlackCubeTexture = new _textures_CubeTexture__WEBPACK_IMPORTED_MODULE_0__.CubeTexture(); const sheenLutTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_1__.Texture(); const dummySRGBGrayTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_1__.Texture(); const dummyAnisotropyTexture = new _textures_Texture__WEBPACK_IMPORTED_MODULE_1__.Texture(); async function initDefaultTextures() { if (dummyWhiteTexture.isTextureReady) { return; } dummyWhiteTexture.tryToSetUniqueName('dummyWhiteTexture', true); dummyBlueTexture.tryToSetUniqueName('dummyBlueTexture', true); dummyBlackTexture.tryToSetUniqueName('dummyBlackTexture', true); dummyBlackCubeTexture.tryToSetUniqueName('dummyBlackCubeTexture', true); sheenLutTexture.tryToSetUniqueName('sheenLutTexture', true); dummySRGBGrayTexture.tryToSetUniqueName('dummySRGBGrayTexture', true); dummyAnisotropyTexture.tryToSetUniqueName('dummyAnisotropyTexture', true); dummyWhiteTexture.generate1x1TextureFrom(); dummyBlueTexture.generate1x1TextureFrom('rgba(127.5, 127.5, 255, 1)'); dummyBlackTexture.generate1x1TextureFrom('rgba(0, 0, 0, 1)'); dummyBlackCubeTexture.load1x1Texture('rgba(0, 0, 0, 1)'); await sheenLutTexture.generateSheenLutTextureFromDataUri(); dummySRGBGrayTexture.generate1x1TextureFrom('rgba(186, 186, 186, 1)'); dummyAnisotropyTexture.generate1x1TextureFrom('rgba(255, 127.5, 255, 1)'); } const DefaultTextures = { dummyWhiteTexture, dummyBlueTexture, dummyBlackTexture, dummyBlackCubeTexture, sheenLutTexture, dummySRGBGrayTexture, dummyAnisotropyTexture, }; /***/ }), /***/ "./src/foundation/materials/core/Material.ts": /*!***************************************************!*\ !*** ./src/foundation/materials/core/Material.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Material: () => (/* binding */ Material) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../math/MathClassUtil */ "./src/foundation/math/MathClassUtil.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../definitions/Blend */ "./src/foundation/definitions/Blend.ts"); /* harmony import */ var _ShaderHandler__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ShaderHandler */ "./src/foundation/materials/core/ShaderHandler.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * The material class. * This class has one or more material nodes. */ class Material extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor(materialTid, materialUid, materialSid, materialTypeName, materialNode) { super(); this._allFieldVariables = new Map(); this._autoFieldVariablesOnly = new Map(); this._allFieldsInfo = new Map(); this.__belongPrimitives = new Map(); // Ids this._shaderProgramUidMap = new Map(); this._primitiveFingerPrintBackUp = ''; this.__materialUid = -1; this.__materialSid = -1; // material serial Id in the material type // Common Rendering States this.__alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Opaque; this.isTranslucent = false; this.cullFace = true; // If true, enable gl.CULL_FACE this.cullFrontFaceCCW = true; this.__alphaToCoverage = false; this.__blendEquationMode = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.EquationFuncAdd; // gl.FUNC_ADD this.__blendEquationModeAlpha = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.EquationFuncAdd; // gl.FUNC_ADD this.__blendFuncSrcFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.One; // Not SrcAlpha. Because In Rhodonite, premultiplied alpha is used this.__blendFuncDstFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.OneMinusSrcAlpha; // gl.ONE_MINUS_SRC_ALPHA this.__blendFuncAlphaSrcFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.One; // gl.ONE this.__blendFuncAlphaDstFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.OneMinusSrcAlpha; // gl.ONE_MINUS_SRC_ALPHA this.__stateVersion = 0; this.__fingerPrint = ''; this.__shaderDefines = new Set(); this._materialContent = materialNode; this.__materialTid = materialTid; this.__materialUid = materialUid; this.__materialSid = materialSid; this.__materialTypeName = materialTypeName; } addShaderDefine(define) { this.__shaderDefines.add(define); this.makeShadersInvalidate(); } removeShaderDefine(define) { this.__shaderDefines.delete(define); this.makeShadersInvalidate(); } getShaderDefines() { return this.__shaderDefines; } calcFingerPrint() { let str = ''; str += this.alphaMode.index; str += this.blendFuncSrcFactor.webgpu; str += this.blendFuncDstFactor.webgpu; str += this.blendFuncAlphaSrcFactor.webgpu; str += this.blendFuncAlphaDstFactor.webgpu; str += this.blendEquationMode.webgpu; str += this.blendEquationModeAlpha.webgpu; str += this.cullFace ? '1' : '0'; str += this.cullFrontFaceCCW ? '1' : '0'; // for (const [key, value] of this._autoFieldVariablesOnly) { // if (CompositionType.isTexture(value.info.compositionType)) { // str += value.info.semantic.str; // str += value.value[0]; // str += value.value[1]; // str += value.value[2]; // } // } this.__fingerPrint = str; } _getFingerPrint() { return this.__fingerPrint; } static get stateVersion() { return Material.__stateVersion; } /// /// Parameter Setters /// setParameter(shaderSemanticName, value) { const info = this._allFieldsInfo.get(shaderSemanticName); if (info != null) { let valueObj; if (info.soloDatum) { valueObj = Material._soloDatumFields.get(this.__materialTypeName).get(shaderSemanticName); } else { valueObj = this._allFieldVariables.get(shaderSemanticName); } const updated = _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_3__.MathClassUtil._setForce(valueObj.value, value); if (updated) { this.__stateVersion++; Material.__stateVersion++; this.calcFingerPrint(); } } } setTextureParameter(shaderSemantic, texture, sampler) { if (!sampler.created) { sampler.create(); } if (this._allFieldsInfo.has(shaderSemantic)) { const setter = async () => { if (typeof texture.loadFromUrlLazy !== 'undefined') { await texture.loadFromUrlLazy(); await texture.loadFromImgLazy(); } const array = this._allFieldVariables.get(shaderSemantic); const shaderVariable = { value: [array.value[0], texture, sampler], info: array.info, }; this._allFieldVariables.set(shaderSemantic, shaderVariable); if (!array.info.isInternalSetting) { this._autoFieldVariablesOnly.set(shaderSemantic, shaderVariable); } if (shaderSemantic === 'diffuseColorTexture' || shaderSemantic === 'baseColorTexture') { if (texture.isTransparent) { this.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend; } } this.__stateVersion++; Material.__stateVersion++; this.calcFingerPrint(); }; if (typeof texture.hasDataToLoadLazy !== 'undefined') { if (texture.hasDataToLoadLazy) { setTimeout(setter, 0); } else { setter(); } } else { setter(); } } } getTextureParameter(shaderSemantic) { if (this._allFieldsInfo.has(shaderSemantic)) { const array = this._allFieldVariables.get(shaderSemantic); return array.value[1]; } return undefined; } setTextureParameterAsPromise(shaderSemantic, promise) { promise.then((texture) => { if (this._allFieldsInfo.has(shaderSemantic)) { const array = this._allFieldVariables.get(shaderSemantic); const shaderVariable = { value: [array.value[0], texture], info: array.info, }; this._allFieldVariables.set(shaderSemantic, shaderVariable); if (!array.info.isInternalSetting) { this._autoFieldVariablesOnly.set(shaderSemantic, shaderVariable); } if (shaderSemantic === 'diffuseColorTexture' || shaderSemantic === 'baseColorTexture') { if (texture.isTransparent) { this.alphaMode = _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend; } } } this.__stateVersion++; Material.__stateVersion++; this.calcFingerPrint(); }); } getParameter(shaderSemantic) { var _a, _b; const info = this._allFieldsInfo.get(shaderSemantic); if (info != null) { if (info.soloDatum) { return (_a = Material._soloDatumFields.get(this.__materialTypeName).get(shaderSemantic)) === null || _a === void 0 ? void 0 : _a.value; } else { return (_b = this._allFieldVariables.get(shaderSemantic)) === null || _b === void 0 ? void 0 : _b.value; } } return void 0; } /** * return whether the shader program ready or not * @returns is shader program ready or not */ isShaderProgramReady(primitive) { return this._shaderProgramUidMap.has(primitive._getFingerPrint()); } /** * @internal * called from WebGLStrategyDataTexture and WebGLStrategyUniform only * @param isUniformOnlyMode */ _setUniformLocationsOfMaterialNodes(isUniformOnlyMode, primitive) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); let array = []; if (this._materialContent != null) { const semanticsInfoArray = this._materialContent._semanticsInfoArray; array = array.concat(semanticsInfoArray); } const shaderProgramUid = this._shaderProgramUidMap.get(primitive != null ? primitive._getFingerPrint() : this._primitiveFingerPrintBackUp); webglResourceRepository.setupUniformLocations(shaderProgramUid, array, isUniformOnlyMode); } getShaderProgramUid(primitive) { var _a; const primitiveFingerPrint = primitive !== undefined ? primitive._getFingerPrint() : this._primitiveFingerPrintBackUp; return (_a = this._shaderProgramUidMap.get(primitiveFingerPrint)) !== null && _a !== void 0 ? _a : -1; } /** * @internal * called from Primitive class only * @param primitive */ _addBelongPrimitive(primitive) { this.__belongPrimitives.set(primitive.primitiveUid, primitive); } /** * @internal * called from WebGLStrategyDataTexture and WebGLStrategyUniform * @param vertexShaderMethodDefinitions_uniform * @param propertySetter * @param isWebGL2 * @returns */ _createProgramWebGL(vertexShaderMethodDefinitions_uniform, propertySetter, primitive, isWebGL2) { const { vertexPropertiesStr, pixelPropertiesStr } = this._getProperties(propertySetter, isWebGL2); const [programUid, newOne] = (0,_ShaderHandler__WEBPACK_IMPORTED_MODULE_8__._createProgramAsSingleOperationWebGL)(this, primitive, vertexPropertiesStr, pixelPropertiesStr, vertexShaderMethodDefinitions_uniform, isWebGL2); this._shaderProgramUidMap.set(primitive._getFingerPrint(), programUid); this._primitiveFingerPrintBackUp = primitive._getFingerPrint(); Material.__stateVersion++; return [programUid, newOne]; } _createProgramWebGpu(primitive, vertexShaderMethodDefinitions, propertySetter) { const { vertexPropertiesStr, pixelPropertiesStr } = this._getProperties(propertySetter, true); const programUid = (0,_ShaderHandler__WEBPACK_IMPORTED_MODULE_8__._createProgramAsSingleOperationWebGpu)(this, primitive, vertexShaderMethodDefinitions, vertexPropertiesStr, pixelPropertiesStr); this._shaderProgramUidMap.set(primitive._getFingerPrint(), programUid); this._primitiveFingerPrintBackUp = primitive._getFingerPrint(); Material.__stateVersion++; } /** * create program by updated shader source code * @internal * called from WebGLStrategyDataTexture and WebGLStrategyUniform * * @param updatedShaderSources - updated shader source code * @param onError * @returns */ _createProgramByUpdatedSources(updatedShaderSources, onError) { const [programUid, newOne] = (0,_ShaderHandler__WEBPACK_IMPORTED_MODULE_8__._createProgramAsSingleOperationByUpdatedSources)(this, this._materialContent, updatedShaderSources, onError); this._shaderProgramUidMap.set(this._primitiveFingerPrintBackUp, programUid); if (programUid > 0) { // this.__updatedShaderSources = updatedShaderSources; } Material.__stateVersion++; return [programUid, newOne]; } /** * @internal * called WebGLStrategyDataTexture and WebGLStrategyUniform only */ _setupBasicUniformsLocations(primitive) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); const primitiveFingerPrint = primitive != null ? primitive._getFingerPrint() : this._primitiveFingerPrintBackUp; const shaderProgramUid = this._shaderProgramUidMap.get(primitiveFingerPrint); webglResourceRepository.setupBasicUniformLocations(shaderProgramUid); } /** * @internal * called WebGLStrategyDataTexture and WebGLStrategyUniform only */ _setupAdditionalUniformLocations(shaderSemantics, isUniformOnlyMode, primitive) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); const primitiveFingerPrint = primitive != null ? primitive._getFingerPrint() : this._primitiveFingerPrintBackUp; const shaderProgramUid = this._shaderProgramUidMap.get(primitiveFingerPrint); webglResourceRepository.setupUniformLocations(shaderProgramUid, shaderSemantics, isUniformOnlyMode); } _setInternalSettingParametersToGpuWebGpu({ material, args, }) { this._materialContent._setInternalSettingParametersToGpuWebGpu({ material, args, }); } /** * @internal * called from WebGLStrategyDataTexture and WebGLStrategyUniform only */ _setParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }) { // For Auto Parameters this.__setAutoParametersToGpuWebGL(args.setUniform, firstTime, shaderProgram); // For Custom Setting Parameters this._materialContent._setInternalSettingParametersToGpuWebGL({ material, shaderProgram, firstTime, args, }); // For SoloDatum Parameters this.__setSoloDatumParametersToGpuWebGL({ shaderProgram, firstTime, isUniformMode: args.setUniform, }); } _setParametersToGpuWebGLWithOutInternalSetting({ shaderProgram, firstTime, isUniformMode, }) { // For Auto Parameters this.__setAutoParametersToGpuWebGL(isUniformMode, firstTime, shaderProgram); // For SoloDatum Parameters this.__setSoloDatumParametersToGpuWebGL({ shaderProgram, firstTime, isUniformMode, }); } /** * @internal * @param propertySetter */ _getProperties(propertySetter, isWebGL2) { let vertexPropertiesStr = ''; let pixelPropertiesStr = ''; this._allFieldsInfo.forEach((info) => { if (info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.VertexShader || info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.VertexAndPixelShader) { vertexPropertiesStr += propertySetter(this.__materialTypeName, info, false, isWebGL2); } if (info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader || info.stage === _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.VertexAndPixelShader) { pixelPropertiesStr += propertySetter(this.__materialTypeName, info, false, isWebGL2); } }); const globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_6__.GlobalDataRepository.getInstance(); [vertexPropertiesStr, pixelPropertiesStr] = globalDataRepository._addPropertiesStr(vertexPropertiesStr, pixelPropertiesStr, propertySetter, isWebGL2); return { vertexPropertiesStr, pixelPropertiesStr }; } __setAutoParametersToGpuWebGL(isUniformMode, firstTime, shaderProgram) { if (Material.__webglResourceRepository == null) { Material.__webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); } const webglResourceRepository = Material.__webglResourceRepository; if (isUniformMode) { this._autoFieldVariablesOnly.forEach((value) => { const info = value.info; webglResourceRepository.setUniformValue(shaderProgram, info.semantic, firstTime, value.value); }); } else { for (const [key, value] of this._autoFieldVariablesOnly) { const info = value.info; if (_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.isTexture(info.compositionType)) { if (firstTime) { webglResourceRepository.setUniform1iForTexture(shaderProgram, info.semantic, value.value); } else { webglResourceRepository.bindTexture(info, value.value); } } else if (info.needUniformInDataTextureMode) { webglResourceRepository.setUniformValue(shaderProgram, info.semantic, firstTime, value.value); } } } } __setSoloDatumParametersToGpuWebGL({ shaderProgram, firstTime, isUniformMode, }) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); const materialTypeName = this.__materialTypeName; const map = Material._soloDatumFields.get(materialTypeName); if (map == null) return; const values = map.values(); for (const value of values) { const info = value.info; if (isUniformMode || _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.isTexture(info.compositionType)) { if (!info.isInternalSetting) { if (firstTime) { webglResourceRepository.setUniformValue(shaderProgram, info.semantic, firstTime, value.value); } else { webglResourceRepository.bindTexture(info, value.value); } } } } } /** * Change the blendEquations * This method works only if this alphaMode is the blend * @param blendEquationMode the argument of gl.blendEquation of the first argument of gl.blendEquationSeparate such as gl.FUNC_ADD * @param blendEquationModeAlpha the second argument of gl.blendEquationSeparate */ setBlendEquationMode(blendEquationMode, blendEquationModeAlpha) { this.__blendEquationMode = blendEquationMode; this.__blendEquationModeAlpha = blendEquationModeAlpha !== null && blendEquationModeAlpha !== void 0 ? blendEquationModeAlpha : blendEquationMode; this.__treatForMinMax(); this.__stateVersion++; Material.__stateVersion++; this.calcFingerPrint(); } __treatForMinMax() { // due to the limitation of WebGPU, See the last part of https://www.w3.org/TR/webgpu/#fragment-state if (this.__blendEquationMode === _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.Min || this.__blendEquationMode === _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.Max) { this.__blendFuncDstFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.One; this.__blendFuncSrcFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.One; } if (this.__blendEquationModeAlpha === _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.Min || this.__blendEquationModeAlpha === _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.Max) { this.__blendFuncAlphaDstFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.One; this.__blendFuncAlphaSrcFactor = _definitions_Blend__WEBPACK_IMPORTED_MODULE_7__.Blend.One; } } /** * Change the blendFuncSeparateFactors * This method works only if this alphaMode is the blend */ setBlendFuncSeparateFactor(blendFuncSrcFactor, blendFuncDstFactor, blendFuncAlphaSrcFactor, blendFuncAlphaDstFactor) { this.__blendFuncSrcFactor = blendFuncSrcFactor; this.__blendFuncDstFactor = blendFuncDstFactor; this.__blendFuncAlphaSrcFactor = blendFuncAlphaSrcFactor; this.__blendFuncAlphaDstFactor = blendFuncAlphaDstFactor; this.__treatForMinMax(); this.__stateVersion++; Material.__stateVersion++; this.calcFingerPrint(); } /** * Change the blendFuncFactors * This method works only if this alphaMode is the blend */ setBlendFuncFactor(blendFuncSrcFactor, blendFuncDstFactor) { this.__blendFuncSrcFactor = blendFuncSrcFactor; this.__blendFuncDstFactor = blendFuncDstFactor; this.__blendFuncAlphaSrcFactor = blendFuncSrcFactor; this.__blendFuncAlphaDstFactor = blendFuncDstFactor; this.__treatForMinMax(); this.__stateVersion++; Material.__stateVersion++; this.calcFingerPrint(); } // setMaterialNode(materialNode: AbstractMaterialNode) { // this.__materialNode = materialNode; // } /// /// Getters /// isBlend() { if (this.alphaMode === _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend) { return true; } else { return false; } } /** * * @returns return true if (alphaMode is Opaque or Mask) and translucent */ isTranslucentOpaque() { if (this.alphaMode !== _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend && this.isTranslucent) { return true; } else { return false; } } isBlendOrTranslucent() { if (this.alphaMode === _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend || this.isTranslucent) { return true; } else { return false; } } isOpaque() { return this.alphaMode === _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Opaque; } isMask() { return this.alphaMode === _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Mask; } /** * NOTE: To apply the alphaToCoverage, the output alpha value must not be fixed to constant value. * However, some shaders in the Rhodonite fixes the output alpha value to 1 by setAlphaIfNotInAlphaBlendMode. * So we need to improve the shader to use the alphaToCoverage. * @param alphaToCoverage apply alphaToCoverage to this material or not */ set alphaToCoverage(alphaToCoverage) { if (alphaToCoverage && this.alphaMode === _definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_1__.AlphaMode.Blend) { _misc_Logger__WEBPACK_IMPORTED_MODULE_9__.Logger.warn('If you set alphaToCoverage = true on a material whose AlphaMode is Translucent, you may get drawing problems.'); } this.__alphaToCoverage = alphaToCoverage; this.makeShadersInvalidate(); this.calcFingerPrint(); } get alphaToCoverage() { return this.__alphaToCoverage; } /** * Gets materialTID. */ get materialTID() { return this.__materialTid; } get fieldsInfoArray() { return Array.from(this._allFieldsInfo.values()); } get blendEquationMode() { return this.__blendEquationMode; } get blendEquationModeAlpha() { return this.__blendEquationModeAlpha; } get blendFuncSrcFactor() { return this.__blendFuncSrcFactor; } get blendFuncDstFactor() { return this.__blendFuncDstFactor; } get blendFuncAlphaSrcFactor() { return this.__blendFuncAlphaSrcFactor; } get blendFuncAlphaDstFactor() { return this.__blendFuncAlphaDstFactor; } get alphaMode() { return this.__alphaMode; } set alphaMode(mode) { this.__alphaMode = mode; this.makeShadersInvalidate(); } get materialUID() { return this.__materialUid; } get materialSID() { return this.__materialSid; } get isSkinning() { return this._materialContent.isSkinning; } get isMorphing() { return this._materialContent.isMorphing; } get isLighting() { return this._materialContent.isLighting; } get materialTypeName() { return this.__materialTypeName; } get stateVersion() { return this.__stateVersion; } makeShadersInvalidate() { this._shaderProgramUidMap.clear(); this.__stateVersion++; Material.__stateVersion++; } } Material.__stateVersion = 0; // static fields Material._soloDatumFields = new Map(); /***/ }), /***/ "./src/foundation/materials/core/MaterialRepository.ts": /*!*************************************************************!*\ !*** ./src/foundation/materials/core/MaterialRepository.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MaterialRepository: () => (/* binding */ MaterialRepository) /* harmony export */ }); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _definitions_BufferUse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ShaderSemanticsInfo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ShaderSemanticsInfo */ "./src/foundation/definitions/ShaderSemanticsInfo.ts"); /* harmony import */ var _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../math/MathClassUtil */ "./src/foundation/math/MathClassUtil.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* harmony import */ var _Material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Material */ "./src/foundation/materials/core/Material.ts"); class MaterialRepository { /** * Registers the material type. * @param materialTypeName The type name of the material. * @param materialNodes The material nodes to register. * @param maxInstancesNumber The maximum number to create the material instances. */ static registerMaterial(materialTypeName, materialNode, maxInstanceNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType) { if (!MaterialRepository.__materialNodes.has(materialTypeName)) { MaterialRepository.__registerInner(materialTypeName, materialNode, maxInstanceNumber); return true; } else { // console.info(`${materialTypeName} is already registered.`); return false; } } static forceRegisterMaterial(materialTypeName, materialNode, maxInstanceNumber = _core_Config__WEBPACK_IMPORTED_MODULE_0__.Config.maxMaterialInstanceForEachType) { this.__registerInner(materialTypeName, materialNode, maxInstanceNumber); return true; } static isRegisteredMaterialType(materialTypeName) { return MaterialRepository.__materialNodes.has(materialTypeName); } static getMaterialByMaterialUid(materialUid) { var _a; return (_a = this.__materialMap.get(materialUid)) === null || _a === void 0 ? void 0 : _a.deref(); } static getAllMaterials() { return Array.from(MaterialRepository.__materialMap.values()); } /** * Creates an instance of this Material class. * @param materialTypeName The material type to create. * @param materialNodes_ The material nodes to add to the created material. */ static createMaterial(materialTypeName, materialNode) { // get the count of instance for the material type let countOfThisType = MaterialRepository.__materialInstanceCountOfType.get(materialTypeName); const material = new _Material__WEBPACK_IMPORTED_MODULE_9__.Material(MaterialRepository.__materialTids.get(materialTypeName), ++MaterialRepository.__materialUidCount, countOfThisType++, materialTypeName, materialNode); this.__initializeMaterial(material, countOfThisType); return material; } static isFullOrOverOfThisMaterialType(materialTypeName) { const countOfThisType = MaterialRepository.__materialInstanceCountOfType.get(materialTypeName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(countOfThisType)) { return false; } const maxCountOfThisType = MaterialRepository.__maxInstances.get(materialTypeName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(maxCountOfThisType)) { return false; } return countOfThisType >= maxCountOfThisType; } static isMaterialCompatible(currentMaterial, newMaterialNode) { var _a; const existingMaterial = (_a = MaterialRepository.__materialMap .get(currentMaterial.materialUID)) === null || _a === void 0 ? void 0 : _a.deref(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(existingMaterial)) { return false; } const existingShaderSemanticsInfoList = Array.from(existingMaterial._allFieldsInfo.values()); const newShaderSemanticsInfoList = newMaterialNode._semanticsInfoArray; if (JSON.stringify(existingShaderSemanticsInfoList) !== JSON.stringify(newShaderSemanticsInfoList)) { return false; } return true; } /** * Initialize Material Method */ static __initializeMaterial(material, countOfThisType) { // Set name material.tryToSetUniqueName(material.__materialTypeName, true); // Set meta data to MaterialRepository { MaterialRepository.__materialMap.set(material.materialUID, new WeakRef(material)); // set this material instance for the material type let map = MaterialRepository.__instances.get(material.__materialTypeName); if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(map)) { map = new Map(); MaterialRepository.__instances.set(material.materialTypeName, map); } map.set(material.materialSID, new WeakRef(material)); // set the count of instance for the material type MaterialRepository.__materialInstanceCountOfType.set(material.materialTypeName, countOfThisType); } // Set semanticsInfo and shaderVariables to the material instance if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(material._materialContent)) { const semanticsInfoArray = material._materialContent._semanticsInfoArray; const accessorMap = MaterialRepository.__accessors.get(material.materialTypeName); semanticsInfoArray.forEach((semanticsInfo) => { material._allFieldsInfo.set(semanticsInfo.semantic, semanticsInfo); if (!semanticsInfo.soloDatum) { const accessor = accessorMap.get(semanticsInfo.semantic); const typedArray = accessor.takeOne(); const shaderVariable = { info: semanticsInfo, value: _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_6__.MathClassUtil.initWithFloat32Array(semanticsInfo.initialValue, semanticsInfo.initialValue, typedArray, semanticsInfo.compositionType), }; material._allFieldVariables.set(semanticsInfo.semantic, shaderVariable); if (!semanticsInfo.isInternalSetting) { material._autoFieldVariablesOnly.set(semanticsInfo.semantic, shaderVariable); } } }); } } static getLocationOffsetOfMemberOfMaterial(materialTypeName, propertyName) { const map = MaterialRepository.__instances.get(materialTypeName); const materialRef = Array.from(map.values()).find((m) => m.deref() !== undefined); // find an actual exist material if (_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(materialRef === null || materialRef === void 0 ? void 0 : materialRef.deref())) { _misc_Logger__WEBPACK_IMPORTED_MODULE_8__.Logger.warn(`Material is not found. getLocationOffsetOfMemberOfMaterial returns invalid 0 value. materialTypeName: ${materialTypeName}`); return 0; } const material = materialRef.deref(); const info = material._allFieldsInfo.get(propertyName); if (info.soloDatum) { const value = _Material__WEBPACK_IMPORTED_MODULE_9__.Material._soloDatumFields.get(material.materialTypeName).get(propertyName); return value.value._v.byteOffset / 4 / 4; } else { const properties = this.__accessors.get(materialTypeName); const accessor = properties.get(propertyName); return accessor.byteOffsetInBuffer / 4 / 4; } } static __registerInner(materialTypeName, materialNode, maxInstanceNumber) { const materialTid = ++MaterialRepository.__materialTidCount; MaterialRepository.__materialNodes.set(materialTypeName, materialNode); MaterialRepository.__materialTids.set(materialTypeName, materialTid); MaterialRepository.__maxInstances.set(materialTypeName, maxInstanceNumber); MaterialRepository.__allocateBufferView(materialTypeName, materialNode); MaterialRepository.__materialInstanceCountOfType.set(materialTypeName, 0); } static __allocateBufferView(materialTypeName, materialNode) { // Calculate a BufferView size to take let totalByteLength = 0; const alignedByteLengthAndSemanticInfoArray = []; for (const semanticInfo of materialNode._semanticsInfoArray) { const alignedByteLength = (0,_definitions_ShaderSemanticsInfo__WEBPACK_IMPORTED_MODULE_5__.calcAlignedByteLength)(semanticInfo); let dataCount = 1; if (!semanticInfo.soloDatum) { dataCount = MaterialRepository.__maxInstances.get(materialTypeName); } totalByteLength += alignedByteLength * dataCount; alignedByteLengthAndSemanticInfoArray.push({ alignedByte: alignedByteLength, semanticInfo: semanticInfo, }); } if (!this.__accessors.has(materialTypeName)) { this.__accessors.set(materialTypeName, new Map()); } // take A Buffer View from GPUInstanceData buffer, or reuse it if it already exists const buffer = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance().createOrGetBuffer(_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_2__.BufferUse.GPUInstanceData); let bufferView; if (this.__bufferViews.has(materialTypeName)) { bufferView = this.__bufferViews.get(materialTypeName); } else { const result = buffer.takeBufferView({ byteLengthToNeed: totalByteLength, byteStride: 0, }); bufferView = result.unwrapForce(); this.__bufferViews.set(materialTypeName, bufferView); } // Take Accessors and register it for (let i = 0; i < alignedByteLengthAndSemanticInfoArray.length; i++) { const alignedByte = alignedByteLengthAndSemanticInfoArray[i].alignedByte; const semanticInfo = alignedByteLengthAndSemanticInfoArray[i].semanticInfo; let count = 1; if (!semanticInfo.soloDatum) { count = MaterialRepository.__maxInstances.get(materialTypeName); } let maxArrayLength = semanticInfo.arrayLength; if (_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.isArray(semanticInfo.compositionType) && maxArrayLength == null) { maxArrayLength = 100; } // take an Accessor const accessor = bufferView .takeAccessor({ compositionType: semanticInfo.compositionType, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, count: count, byteStride: alignedByte, arrayLength: maxArrayLength, }) .unwrapForce(); if (semanticInfo.soloDatum) { const typedArray = accessor.takeOne(); let map = _Material__WEBPACK_IMPORTED_MODULE_9__.Material._soloDatumFields.get(materialTypeName); if (map == null) { map = new Map(); _Material__WEBPACK_IMPORTED_MODULE_9__.Material._soloDatumFields.set(materialTypeName, map); } map.set(semanticInfo.semantic, { info: semanticInfo, value: _math_MathClassUtil__WEBPACK_IMPORTED_MODULE_6__.MathClassUtil.initWithFloat32Array(semanticInfo.initialValue, semanticInfo.initialValue, typedArray, semanticInfo.compositionType), }); } else { // Set an accessor to this.__accessors const properties = this.__accessors.get(materialTypeName); properties.set(semanticInfo.semantic, accessor); } } return bufferView; } static _makeShaderInvalidateToAllMaterials() { var _a; for (const material of MaterialRepository.__materialMap.values()) { (_a = material.deref()) === null || _a === void 0 ? void 0 : _a.makeShadersInvalidate(); } } } /// /// static members /// MaterialRepository.__materialMap = new Map(); MaterialRepository.__instances = new Map(); MaterialRepository.__materialTids = new Map(); MaterialRepository.__materialInstanceCountOfType = new Map(); MaterialRepository.__materialNodes = new Map(); MaterialRepository.__maxInstances = new Map(); MaterialRepository.__bufferViews = new Map(); MaterialRepository.__accessors = new Map(); MaterialRepository.__materialTidCount = -1; MaterialRepository.__materialUidCount = -1; /***/ }), /***/ "./src/foundation/materials/core/MaterialTypes.ts": /*!********************************************************!*\ !*** ./src/foundation/materials/core/MaterialTypes.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/materials/core/ShaderGraphResolver.ts": /*!**************************************************************!*\ !*** ./src/foundation/materials/core/ShaderGraphResolver.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderGraphResolver: () => (/* binding */ ShaderGraphResolver) /* harmony export */ }); /* harmony import */ var _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../webgl/shaders/CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _nodes_ConstantScalarVariableShaderNode__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../nodes/ConstantScalarVariableShaderNode */ "./src/foundation/materials/nodes/ConstantScalarVariableShaderNode.ts"); /* harmony import */ var _math_Scalar__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _nodes_ConstantVector2VariableShaderNode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../nodes/ConstantVector2VariableShaderNode */ "./src/foundation/materials/nodes/ConstantVector2VariableShaderNode.ts"); /* harmony import */ var _math_Vector2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _nodes_ConstantVector3VariableShaderNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../nodes/ConstantVector3VariableShaderNode */ "./src/foundation/materials/nodes/ConstantVector3VariableShaderNode.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _nodes_ConstantVector4VariableShaderNode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../nodes/ConstantVector4VariableShaderNode */ "./src/foundation/materials/nodes/ConstantVector4VariableShaderNode.ts"); /* harmony import */ var _nodes_UniformDataShaderNode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../nodes/UniformDataShaderNode */ "./src/foundation/materials/nodes/UniformDataShaderNode.ts"); /* harmony import */ var _nodes_AddShaderNode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../nodes/AddShaderNode */ "./src/foundation/materials/nodes/AddShaderNode.ts"); /* harmony import */ var _nodes_NormalizeShaderNode__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../nodes/NormalizeShaderNode */ "./src/foundation/materials/nodes/NormalizeShaderNode.ts"); /* harmony import */ var _nodes_DotProductShaderNode__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../nodes/DotProductShaderNode */ "./src/foundation/materials/nodes/DotProductShaderNode.ts"); /* harmony import */ var _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../nodes/MultiplyShaderNode */ "./src/foundation/materials/nodes/MultiplyShaderNode.ts"); /* harmony import */ var _nodes_AttributeColorShaderNode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../nodes/AttributeColorShaderNode */ "./src/foundation/materials/nodes/AttributeColorShaderNode.ts"); /* harmony import */ var _nodes_AttributeNormalShaderNode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../nodes/AttributeNormalShaderNode */ "./src/foundation/materials/nodes/AttributeNormalShaderNode.ts"); /* harmony import */ var _nodes_AttributePositionShaderNode__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../nodes/AttributePositionShaderNode */ "./src/foundation/materials/nodes/AttributePositionShaderNode.ts"); /* harmony import */ var _nodes_AttributeTexcoordShaderNode__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../nodes/AttributeTexcoordShaderNode */ "./src/foundation/materials/nodes/AttributeTexcoordShaderNode.ts"); /* harmony import */ var _nodes_WorldMatrixShaderNode__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../nodes/WorldMatrixShaderNode */ "./src/foundation/materials/nodes/WorldMatrixShaderNode.ts"); /* harmony import */ var _nodes_ViewMatrixShaderNode__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../nodes/ViewMatrixShaderNode */ "./src/foundation/materials/nodes/ViewMatrixShaderNode.ts"); /* harmony import */ var _nodes_ProjectionMatrixShaderNode__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../nodes/ProjectionMatrixShaderNode */ "./src/foundation/materials/nodes/ProjectionMatrixShaderNode.ts"); /* harmony import */ var _nodes_NormalMatrixShaderNode__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../nodes/NormalMatrixShaderNode */ "./src/foundation/materials/nodes/NormalMatrixShaderNode.ts"); /* harmony import */ var _nodes_GreaterShaderNode__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../nodes/GreaterShaderNode */ "./src/foundation/materials/nodes/GreaterShaderNode.ts"); /* harmony import */ var _nodes_OutPositionShaderNode__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../nodes/OutPositionShaderNode */ "./src/foundation/materials/nodes/OutPositionShaderNode.ts"); /* harmony import */ var _nodes_OutColorShaderNode__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../nodes/OutColorShaderNode */ "./src/foundation/materials/nodes/OutColorShaderNode.ts"); /* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../system */ "./src/foundation/system/index.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _nodes_TransformShaderNode__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../nodes/TransformShaderNode */ "./src/foundation/materials/nodes/TransformShaderNode.ts"); /* harmony import */ var _nodes__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../nodes */ "./src/foundation/materials/nodes/index.ts"); /* harmony import */ var _nodes_SinShaderNode__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../nodes/SinShaderNode */ "./src/foundation/materials/nodes/SinShaderNode.ts"); /* harmony import */ var _nodes_StepShaderNode__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../nodes/StepShaderNode */ "./src/foundation/materials/nodes/StepShaderNode.ts"); /* harmony import */ var _nodes_TimeShaderNode__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../nodes/TimeShaderNode */ "./src/foundation/materials/nodes/TimeShaderNode.ts"); /* harmony import */ var _nodes_SmoothStepShaderNode__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../nodes/SmoothStepShaderNode */ "./src/foundation/materials/nodes/SmoothStepShaderNode.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * ShaderGraphResolver is a class that resolves the shader node graph and generates shader code. */ class ShaderGraphResolver { /** * Create a vertex shader code from the given vertex nodes. * @param vertexNodes - Vertex nodes * @param varyingNodes - Varying nodes * @param isFullVersion - Whether to generate a full version of the shader code * @returns Vertex shader code */ static createVertexShaderCode(vertexNodes, varyingNodes, isFullVersion = true) { const shaderNodes = vertexNodes.concat(); // const isValid = this.__validateShaderNodes(shaderNodes); // if (!isValid) { // return undefined; // } // Topological Sorting const sortedShaderNodes = this.__sortTopologically(shaderNodes); // const sortedVaryingNodes = this.__sortTopologically(varyingNodes); // Add additional functions by system let vertexShaderPrerequisites = ''; const nodes = sortedShaderNodes.concat(varyingNodes); if (isFullVersion) { vertexShaderPrerequisites += _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getVertexPrerequisites(nodes); } let shaderBody = ''; // function definitions shaderBody += ShaderGraphResolver.__getFunctionDefinition( // sortedShaderNodes, sortedShaderNodes.concat(varyingNodes.filter((node) => node.getShaderStage() !== 'Fragment')), _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_1__.ShaderType.VertexShader); // main process try { shaderBody += ShaderGraphResolver.__constructShaderWithNodes(nodes, true, isFullVersion); } catch (e) { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error(e); return undefined; } const shader = vertexShaderPrerequisites + shaderBody; return shader; } /** * Create a pixel shader code from the given pixel nodes. * * @param pixelNodes - Pixel nodes * @param isFullVersion - Whether to generate a full version of the shader code * @returns Pixel shader code */ static createPixelShaderCode(pixelNodes, isFullVersion = true) { const shaderNodes = pixelNodes.concat(); // const isValid = this.__validateShaderNodes(shaderNodes); // if (!isValid) { // return undefined; // } // Topological Sorting const sortedShaderNodes = this.__sortTopologically(shaderNodes); // Add additional functions by system let pixelShaderPrerequisites = ''; if (isFullVersion) { pixelShaderPrerequisites += _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getPixelPrerequisites(sortedShaderNodes); } let shaderBody = ''; // function definitions shaderBody += ShaderGraphResolver.__getFunctionDefinition(sortedShaderNodes.filter((node) => node.getShaderStage() !== 'Vertex'), _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_1__.ShaderType.PixelShader); // main process try { shaderBody += ShaderGraphResolver.__constructShaderWithNodes(sortedShaderNodes, false, isFullVersion); } catch (e) { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error(e); return undefined; } const shader = pixelShaderPrerequisites + shaderBody; return shader; } static __validateShaderNodes(shaderNodes) { const shaderNodeUids = []; for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; for (let j = 0; j < shaderNode.inputConnections.length; j++) { const inputConnection = shaderNode.inputConnections[j]; if (inputConnection == null) { return false; } } } return true; } /** * Sort shader nodes topologically. * * @param shaderNodes - Shader nodes to sort * @returns Sorted shader nodes */ static __sortTopologically(shaderNodes) { const sortedNodeArray = []; const inputNumArray = []; // calculate inputNumArray const queue = []; for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; let count = 0; for (const inputConnection of shaderNode.inputConnections) { if (inputConnection != null) { count++; } } inputNumArray[i] = count; } // collect output nodes const outputNodes = []; for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; for (const inputConnection of shaderNode.inputConnections) { if (inputConnection == null) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); const inputNodeIdx = shaderNodes.indexOf(inputNode); if (outputNodes[inputNodeIdx] == null) { outputNodes[inputNodeIdx] = []; } outputNodes[inputNodeIdx].push(shaderNode); } } for (let i = 0; i < shaderNodes.length; i++) { if (outputNodes[i] == null) { outputNodes[i] = []; } } // collect nodes which have no input for (let i = 0; i < shaderNodes.length; i++) { if (inputNumArray[i] === 0) { queue.push(shaderNodes[i]); } } // topological sort (BFS) while (queue.length > 0) { const now = queue.shift(); sortedNodeArray.push(now); const nowIdx = shaderNodes.indexOf(now); for (const outputNode of outputNodes[nowIdx]) { inputNumArray[shaderNodes.indexOf(outputNode)]--; if (inputNumArray[shaderNodes.indexOf(outputNode)] === 0) { queue.push(outputNode); } } } if (sortedNodeArray.length != shaderNodes.length) { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('graph is cyclic'); } return sortedNodeArray; } /** * Get function definition from shader nodes. * * @param shaderNodes - Shader nodes * @param shaderType - Shader type * @returns Function definition as a string */ static __getFunctionDefinition(shaderNodes, shaderType) { let shaderText = ''; const existVertexFunctions = []; for (let i = 0; i < shaderNodes.length; i++) { const materialNode = shaderNodes[i]; if (existVertexFunctions.indexOf(materialNode.shaderFunctionName) !== -1) { continue; } shaderText += materialNode.getShaderCode(shaderType); existVertexFunctions.push(materialNode.shaderFunctionName); } return shaderText; } /** * Construct shader code with shader nodes. * * @param shaderNodes - Shader nodes * @param isVertexStage - Whether the shader is a vertex shader * @param isFullVersion - Whether to generate a full version of the shader code * @returns Shader code */ static __constructShaderWithNodes(shaderNodes, isVertexStage, isFullVersion) { let shaderBody = ''; // Define varying(out) variables if (_system__WEBPACK_IMPORTED_MODULE_29__.SystemState.currentProcessApproach !== _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_30__.ProcessApproach.WebGPU) { for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; for (let j = 0; j < shaderNode.inputConnections.length; j++) { const inputConnection = shaderNode.inputConnections[j]; if (inputConnection == null) { continue; } const input = shaderNode.getInputs()[j]; const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); if (inputNode.getShaderStage() === 'Vertex' && shaderNode.getShaderStage() === 'Fragment') { const type = input.compositionType.getGlslStr(input.componentType); shaderBody += `${isVertexStage ? 'out' : 'in'} ${type} v_${inputNode.shaderFunctionName}_${inputNode.shaderNodeUid};\n`; } } } } shaderBody += _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getMainBegin(isVertexStage); if (isFullVersion) { shaderBody += _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getMainPrerequisites(); } // Collects varInputNames and varOutputNames const varInputNames = []; // input names of topological sorted Nodes const varOutputNames = []; // output names of topological sorted Nodes { const existingInputs = new Set(); const existingOutputs = new Set(); const existingOutputsVarName = new Map(); for (let i = 1; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; if (varInputNames[i] == null) { varInputNames[i] = []; } if (i - 1 >= 0) { if (varOutputNames[i - 1] == null) { varOutputNames[i - 1] = []; } } const inputConnections = shaderNode.inputConnections; // Collects ExistingInputs for (let j = 0; j < inputConnections.length; j++) { const inputConnection = inputConnections[j]; if (inputConnection == null) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode._shaderNodes[inputConnection.shaderNodeUid]; const outputSocketOfPrev = inputNode.getOutput(inputConnection.outputNameOfPrev); const inputSocketOfThis = shaderNode.getInput(inputConnection.inputNameOfThis); const varName = `${outputSocketOfPrev.name}_${inputConnection.shaderNodeUid}_to_${shaderNode.shaderNodeUid}`; // if (!existingInputs.has(`${inputNode.shaderNodeUid}_${inputConnection.outputNameOfPrev}`)) { let rowStr = _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getAssignmentStatement(varName, inputSocketOfThis); if (!isVertexStage) { if (inputNode.getShaderStage() === 'Vertex' && shaderNode.getShaderStage() === 'Fragment') { rowStr = _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getAssignmentVaryingStatementInPixelShader(varName, inputSocketOfThis, inputNode); } } shaderBody += rowStr; } const existVarName = existingOutputsVarName.get(inputNode.shaderNodeUid); varInputNames[i].push(existVarName ? existVarName : varName); existingInputs.add(`${inputConnection.shaderNodeUid}_${inputConnection.outputNameOfPrev}`); } // Collects ExistingOutputs for (let j = i; j < shaderNodes.length; j++) { const targetShaderNode = shaderNodes[j]; const prevShaderNodeInner = shaderNodes[i - 1]; const targetNodeInputConnections = targetShaderNode.inputConnections; for (let k = 0; k < targetNodeInputConnections.length; k++) { const inputConnection = targetNodeInputConnections[k]; if (inputConnection == null) { continue; } if ((prevShaderNodeInner === null || prevShaderNodeInner === void 0 ? void 0 : prevShaderNodeInner.shaderNodeUid) !== inputConnection.shaderNodeUid) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode._shaderNodes[inputConnection.shaderNodeUid]; if (!existingOutputs.has(`${inputNode.shaderNodeUid}_${inputConnection.outputNameOfPrev}`)) { const outputSocketOfPrev = inputNode.getOutput(inputConnection.outputNameOfPrev); const varName = `${outputSocketOfPrev.name}_${inputConnection.shaderNodeUid}_to_${targetShaderNode.shaderNodeUid}`; if (i - 1 >= 0) { varOutputNames[i - 1].push(varName); } existingOutputsVarName.set(inputConnection.shaderNodeUid, varName); } existingOutputs.add(`${inputConnection.shaderNodeUid}_${inputConnection.outputNameOfPrev}`); } } } } // generate shader code by topological sorted nodes, varInputNames and varOutputNames for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; const functionName = shaderNode.getShaderFunctionNameDerivative(); if (varInputNames[i] == null) { varInputNames[i] = []; } if (varOutputNames[i] == null) { varOutputNames[i] = []; } if (isVertexStage && shaderNode.getShaderStage() === 'Fragment') { continue; } else if (!isVertexStage && shaderNode.getShaderStage() === 'Vertex') { continue; } shaderBody += shaderNode.makeCallStatement(i, shaderNode, functionName, varInputNames, varOutputNames); } if (isVertexStage) { for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; const varNames = varInputNames[i].concat(varOutputNames[i]); for (let j = 0; j < shaderNode.inputConnections.length; j++) { const inputConnection = shaderNode.inputConnections[j]; if (inputConnection == null) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); if (inputNode.getShaderStage() === 'Vertex' && shaderNode.getShaderStage() === 'Fragment') { shaderBody += _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getAssignmentVaryingStatementInVertexShader(inputNode, varNames, j); } } } } shaderBody += _webgl_shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_4__.CommonShaderPart.getMainEnd(isVertexStage); return shaderBody; } /** * Generate shader code from JSON. * * @param json - JSON data of a shader node graph * @returns Shader code */ static generateShaderCodeFromJson(json) { const constructedNodes = Object.values(constructNodes(json)); const nodes = this.__sortTopologically(constructedNodes); resolveShaderStage(nodes); const varyingNodes = filterNodesForVarying(nodes, 'outColor'); const vertexNodes = filterNodes(nodes, ['outPosition']); const pixelNodes = filterNodes(nodes, ['outColor']); if (vertexNodes.length === 0 || pixelNodes.length === 0) { return; } const vertexRet = ShaderGraphResolver.createVertexShaderCode(vertexNodes, varyingNodes); const pixelRet = ShaderGraphResolver.createPixelShaderCode(pixelNodes); if (vertexRet == null || pixelRet == null) { return; } return { vertexShader: vertexRet, pixelShader: pixelRet }; } } function filterNodesInner(nodes, endNodeName) { let endNode; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; if (node.shaderFunctionName.toLowerCase().includes(endNodeName.toLowerCase())) { endNode = node; break; } } if (endNode == null) { return []; } const filteredNodes = [endNode]; function traverseNodes(node) { for (let i = 0; i < node.inputConnections.length; i++) { const inputConnection = node.inputConnections[i]; if (inputConnection != null) { const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); if (inputNode != null) { filteredNodes.push(inputNode); traverseNodes(inputNode); } } } } traverseNodes(endNode); return filteredNodes; } function filterNodes(nodes, endNodesName) { let finalFilterNodes = []; for (let i = 0; i < endNodesName.length; i++) { const endNodeName = endNodesName[i]; const filteredNodes = filterNodesInner(nodes, endNodeName); finalFilterNodes = finalFilterNodes.concat(filteredNodes); } // Remove duplicates finalFilterNodes = [...new Set(finalFilterNodes)]; return finalFilterNodes; } function resolveShaderStage(shaderNodes) { for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; for (const inputConnection of shaderNode.inputConnections) { if (inputConnection == null) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); if (inputNode.getShaderStage() === 'Vertex' && shaderNode.getShaderStage() === 'Neutral') { shaderNode.setShaderStage('Vertex'); } else if (inputNode.getShaderStage() === 'Fragment') { shaderNode.setShaderStage('Fragment'); } } } } function filterNodesForVarying(nodes, endNodeName) { // Find the end node let endNode; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; if (node.shaderFunctionName.toLowerCase().includes(endNodeName.toLowerCase())) { endNode = node; break; } } if (endNode == null) { return []; } let varyingNodes = []; function traverseNodesAll(node) { for (let i = 0; i < node.inputConnections.length; i++) { const inputConnection = node.inputConnections[i]; if (inputConnection == null) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); varyingNodes.push(inputNode); traverseNodesAll(inputNode); } } function traverseNodes(node) { for (let i = 0; i < node.inputConnections.length; i++) { const inputConnection = node.inputConnections[i]; if (inputConnection == null) { continue; } const inputNode = _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); if (inputNode != null && inputNode.getShaderStage() === 'Vertex' && node.getShaderStage() === 'Fragment') { varyingNodes.push(inputNode); if (node.getShaderStage() === 'Fragment') { varyingNodes.unshift(node); } traverseNodesAll(inputNode); break; } traverseNodes(inputNode); } } traverseNodes(endNode); // Remove duplicates varyingNodes = [...new Set(varyingNodes)]; return varyingNodes.reverse(); } /** * Construct shader nodes from JSON. * * @param json - JSON data of a shader node graph * @returns Constructed shader nodes */ function constructNodes(json) { // Create Node Instances const nodeInstances = {}; const nodes = {}; for (const node of json.nodes) { nodes[node.id] = node; switch (node.name) { // case 'ConstantBool': { // const nodeInstance = new ConstantScalarVariableShaderNode(ComponentType.Bool); // nodeInstance.setDefaultInputValue(Scalar.fromCopyNumber(node.data.bool ? 1 : 0)); // nodeInstances[node.id] = nodeInstance; // break; // } case 'ConstantScalar': { const nodeInstance = new _nodes_ConstantScalarVariableShaderNode__WEBPACK_IMPORTED_MODULE_5__.ConstantScalarVariableShaderNode(_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); nodeInstance.setDefaultInputValue(_math_Scalar__WEBPACK_IMPORTED_MODULE_6__.Scalar.fromCopyNumber(node.controls['in1'].value)); nodeInstances[node.id] = nodeInstance; break; } case 'ConstantVector2': { const nodeInstance = new _nodes_ConstantVector2VariableShaderNode__WEBPACK_IMPORTED_MODULE_7__.ConstantVector2VariableShaderNode(_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); nodeInstance.setDefaultInputValue(_math_Vector2__WEBPACK_IMPORTED_MODULE_8__.Vector2.fromCopy2(node.controls['in1'].value, node.controls['in2'].value)); nodeInstances[node.id] = nodeInstance; break; } case 'ConstantVector3': { const nodeInstance = new _nodes_ConstantVector3VariableShaderNode__WEBPACK_IMPORTED_MODULE_9__.ConstantVector3VariableShaderNode(_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); nodeInstance.setDefaultInputValue(_math_Vector3__WEBPACK_IMPORTED_MODULE_10__.Vector3.fromCopy3(node.controls['in1'].value, node.controls['in2'].value, node.controls['in3'].value)); nodeInstances[node.id] = nodeInstance; break; } case 'ConstantVector4': { const nodeInstance = new _nodes_ConstantVector4VariableShaderNode__WEBPACK_IMPORTED_MODULE_12__.ConstantVector4VariableShaderNode(_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); nodeInstance.setDefaultInputValue(_math_Vector4__WEBPACK_IMPORTED_MODULE_11__.Vector4.fromCopy4(node.controls['in1'].value, node.controls['in2'].value, node.controls['in3'].value, node.controls['in4'].value)); nodeInstances[node.id] = nodeInstance; break; } case 'UniformVector4': { const nodeInstance = new _nodes_UniformDataShaderNode__WEBPACK_IMPORTED_MODULE_13__.UniformDataShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); nodeInstance.setDefaultInputValue('value', _math_Vector4__WEBPACK_IMPORTED_MODULE_11__.Vector4.fromCopyArray4([ node.controls['initialX'].value, node.controls['initialY'].value, node.controls['initialZ'].value, node.controls['initialW'].value, ])); nodeInstance.setUniformDataName(node.controls['name'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Time': { const nodeInstance = new _nodes_TimeShaderNode__WEBPACK_IMPORTED_MODULE_35__.TimeShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'Add': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Scalar') { nodeInstance = new _nodes_AddShaderNode__WEBPACK_IMPORTED_MODULE_14__.AddShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector2') { nodeInstance = new _nodes_AddShaderNode__WEBPACK_IMPORTED_MODULE_14__.AddShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_AddShaderNode__WEBPACK_IMPORTED_MODULE_14__.AddShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_AddShaderNode__WEBPACK_IMPORTED_MODULE_14__.AddShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Add node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Sin': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Scalar') { nodeInstance = new _nodes_SinShaderNode__WEBPACK_IMPORTED_MODULE_33__.SinShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector2') { nodeInstance = new _nodes_SinShaderNode__WEBPACK_IMPORTED_MODULE_33__.SinShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_SinShaderNode__WEBPACK_IMPORTED_MODULE_33__.SinShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_SinShaderNode__WEBPACK_IMPORTED_MODULE_33__.SinShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Sin node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Step': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Scalar') { nodeInstance = new _nodes_StepShaderNode__WEBPACK_IMPORTED_MODULE_34__.StepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector2') { nodeInstance = new _nodes_StepShaderNode__WEBPACK_IMPORTED_MODULE_34__.StepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_StepShaderNode__WEBPACK_IMPORTED_MODULE_34__.StepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_StepShaderNode__WEBPACK_IMPORTED_MODULE_34__.StepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Add node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'SmoothStep': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Scalar') { nodeInstance = new _nodes_SmoothStepShaderNode__WEBPACK_IMPORTED_MODULE_36__.SmoothStepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector2') { nodeInstance = new _nodes_SmoothStepShaderNode__WEBPACK_IMPORTED_MODULE_36__.SmoothStepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_SmoothStepShaderNode__WEBPACK_IMPORTED_MODULE_36__.SmoothStepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_SmoothStepShaderNode__WEBPACK_IMPORTED_MODULE_36__.SmoothStepShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Add node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Normalize': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Vector2') { nodeInstance = new _nodes_NormalizeShaderNode__WEBPACK_IMPORTED_MODULE_15__.NormalizeShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_NormalizeShaderNode__WEBPACK_IMPORTED_MODULE_15__.NormalizeShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_NormalizeShaderNode__WEBPACK_IMPORTED_MODULE_15__.NormalizeShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Normalize node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Dot': { const socketName = node.inputs.in1.socket.name; let nodeInstance; if (socketName === 'Vector2') { nodeInstance = new _nodes_DotProductShaderNode__WEBPACK_IMPORTED_MODULE_16__.DotProductShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_DotProductShaderNode__WEBPACK_IMPORTED_MODULE_16__.DotProductShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_DotProductShaderNode__WEBPACK_IMPORTED_MODULE_16__.DotProductShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Dot node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Multiply': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Scalar') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector2') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Matrix2') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Matrix3') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Matrix4') { nodeInstance = new _nodes_MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_17__.MultiplyShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Multiply node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'Transform': { const socketName = node.outputs.out1.socket.name; let nodeInstance; if (socketName === 'Vector2') { nodeInstance = new _nodes_TransformShaderNode__WEBPACK_IMPORTED_MODULE_31__.TransformShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector3') { nodeInstance = new _nodes_TransformShaderNode__WEBPACK_IMPORTED_MODULE_31__.TransformShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else if (socketName === 'Vector4') { nodeInstance = new _nodes_TransformShaderNode__WEBPACK_IMPORTED_MODULE_31__.TransformShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('Transform node: Unknown socket name: ' + socketName); break; } nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'SplitVector': { const nodeInstance = new _nodes__WEBPACK_IMPORTED_MODULE_32__.SplitVectorShaderNode(); nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'MergeVector': { const nodeInstance = new _nodes__WEBPACK_IMPORTED_MODULE_32__.MergeVectorShaderNode(); nodeInstance.setShaderStage(node.controls['shaderStage'].value); nodeInstances[node.id] = nodeInstance; break; } case 'AttributeColor': { const nodeInstance = new _nodes_AttributeColorShaderNode__WEBPACK_IMPORTED_MODULE_18__.AttributeColorShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'AttributeNormal': { const nodeInstance = new _nodes_AttributeNormalShaderNode__WEBPACK_IMPORTED_MODULE_19__.AttributeNormalShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'AttributePosition': { const nodeInstance = new _nodes_AttributePositionShaderNode__WEBPACK_IMPORTED_MODULE_20__.AttributePositionShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'AttributeTexcoord': { const nodeInstance = new _nodes_AttributeTexcoordShaderNode__WEBPACK_IMPORTED_MODULE_21__.AttributeTexcoordShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'WorldMatrix': { const nodeInstance = new _nodes_WorldMatrixShaderNode__WEBPACK_IMPORTED_MODULE_22__.WorldMatrixShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'ViewMatrix': { const nodeInstance = new _nodes_ViewMatrixShaderNode__WEBPACK_IMPORTED_MODULE_23__.ViewMatrixShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'ProjectionMatrix': { const nodeInstance = new _nodes_ProjectionMatrixShaderNode__WEBPACK_IMPORTED_MODULE_24__.ProjectionMatrixShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'NormalMatrix': { const nodeInstance = new _nodes_NormalMatrixShaderNode__WEBPACK_IMPORTED_MODULE_25__.NormalMatrixShaderNode(); nodeInstances[node.id] = nodeInstance; break; } // case 'If': { // const nodeInstance = new IfStatementShaderNode(); // nodeInstances[node.id] = nodeInstance; // break; // } // case 'BlockBegin': { // const nodeInstance = new BlockBeginShaderNode(); // for (const outputName in node.outputs) { // const compositionType = getCompositionType(outputName); // nodeInstance.addInputAndOutput(compositionType, ComponentType.Float); // } // nodeInstances[node.id] = nodeInstance; // break; // } // case 'BlockEnd': { // const nodeInstance = new BlockEndShaderNode(); // for (const outputName in node.outputs) { // const compositionType = getCompositionType(outputName); // nodeInstance.addInputAndOutput(compositionType, ComponentType.Float); // } // nodeInstances[node.id] = nodeInstance; // break; // } case 'Greater': { const nodeInstance = new _nodes_GreaterShaderNode__WEBPACK_IMPORTED_MODULE_26__.GreaterShaderNode(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float); nodeInstances[node.id] = nodeInstance; break; } case 'OutPosition': { const nodeInstance = new _nodes_OutPositionShaderNode__WEBPACK_IMPORTED_MODULE_27__.OutPositionShaderNode(); nodeInstances[node.id] = nodeInstance; break; } case 'OutColor': { const nodeInstance = new _nodes_OutColorShaderNode__WEBPACK_IMPORTED_MODULE_28__.OutColorShaderNode(); nodeInstances[node.id] = nodeInstance; break; } } } // for (const connection of json.connections) { for (let i = 0; i < json.connections.length; i++) { const connection = json.connections[i]; const inputNodeInstance = nodeInstances[connection.from.id]; const outputNodeInstance = nodeInstances[connection.to.id]; if (inputNodeInstance == null || outputNodeInstance == null) { _misc_Logger__WEBPACK_IMPORTED_MODULE_37__.Logger.error('inputNodeInstance or outputNodeInstance is null'); continue; } let idx = 0; for (const key in nodes[connection.to.id].inputs) { if (key === connection.to.portName) { break; } idx++; } let idx2 = 0; for (const key in nodes[connection.from.id].outputs) { if (key === connection.from.portName) { break; } idx2++; } const outputOfInputNode = inputNodeInstance.getOutputs()[idx2]; const inputOfOutputNode = outputNodeInstance.getInputs()[idx]; outputNodeInstance.addInputConnection(inputNodeInstance, outputOfInputNode, inputOfOutputNode); } return nodeInstances; } /***/ }), /***/ "./src/foundation/materials/core/ShaderHandler.ts": /*!********************************************************!*\ !*** ./src/foundation/materials/core/ShaderHandler.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderHandler: () => (/* binding */ ShaderHandler), /* harmony export */ _createProgramAsSingleOperationByUpdatedSources: () => (/* binding */ _createProgramAsSingleOperationByUpdatedSources), /* harmony export */ _createProgramAsSingleOperationWebGL: () => (/* binding */ _createProgramAsSingleOperationWebGL), /* harmony export */ _createProgramAsSingleOperationWebGpu: () => (/* binding */ _createProgramAsSingleOperationWebGpu), /* harmony export */ _getAttributeInfo: () => (/* binding */ _getAttributeInfo), /* harmony export */ _outputVertexAttributeBindingInfo: () => (/* binding */ _outputVertexAttributeBindingInfo), /* harmony export */ _setupGlobalShaderDefinitionWebGL: () => (/* binding */ _setupGlobalShaderDefinitionWebGL) /* harmony export */ }); /* harmony import */ var shaderity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! shaderity */ "./node_modules/shaderity/dist/esm/index.js"); /* harmony import */ var shaderity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(shaderity__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/BoneDataType */ "./src/foundation/definitions/BoneDataType.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ShaderityUtilityWebGL */ "./src/foundation/materials/core/ShaderityUtilityWebGL.ts"); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); class ShaderHandler { /** * Create a shader program Or Get a shader program from cache * @param material * @param vertexShader * @param pixelShader * @param attributeNames * @param attributeSemantics * @param onError * @returns */ static _createShaderProgramWithCache(material, vertexShader, pixelShader, attributeNames, attributeSemantics, onError) { // Cache const wholeShaderText = vertexShader + pixelShader; let shaderProgramUid = this.__shaderStringMap.get(wholeShaderText); if (shaderProgramUid) { return [shaderProgramUid, false]; } const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getCgApiResourceRepository(); shaderProgramUid = cgApiResourceRepository.createShaderProgram({ material, vertexShaderStr: vertexShader, fragmentShaderStr: pixelShader, attributeNames: attributeNames, attributeSemantics: attributeSemantics, onError, }); this.__shaderStringMap.set(wholeShaderText, shaderProgramUid); return [shaderProgramUid, true]; } } ShaderHandler.__shaderStringMap = new Map(); function _createProgramAsSingleOperationByUpdatedSources(material, materialNode, updatedShaderSources, onError) { const { attributeNames, attributeSemantics } = _getAttributeInfo(materialNode); const [shaderProgramUid, newOne] = ShaderHandler._createShaderProgramWithCache(material, updatedShaderSources.vertex, updatedShaderSources.pixel, attributeNames, attributeSemantics, onError); return [shaderProgramUid, newOne]; } function _getAttributeInfo(materialNode) { const reflection = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__.ShaderityUtilityWebGL.getAttributeReflection(materialNode.vertexShaderityObject); const attributeNames = reflection.names; const attributeSemantics = reflection.semantics; return { attributeNames, attributeSemantics }; } function _outputVertexAttributeBindingInfo(attributeNames, attributeSemantics) { let vertexAttributesBinding = '\n// Vertex Attributes Binding Info\n'; for (let i = 0; i < attributeNames.length; i++) { vertexAttributesBinding += `// ${attributeNames[i]}: ${attributeSemantics[i].str} \n`; } return vertexAttributesBinding; } /** * Create a shader program * * @remarks * This method creates the final shader source code * by embedding variables and adding definitions * to the prototype shader source code during processing. * * @param material - A material * @param vertexPropertiesStr - A string of vertex properties * @param pixelPropertiesStr - A string of pixel properties * @param vertexShaderMethodDefinitions_uniform - A string of vertex shader method definitions in Uniform Strategy * @param isWebGL2 - A flag whether the current WebGL context is WebGL2 or not * @returns */ function _createProgramAsSingleOperationWebGL(material, primitive, vertexPropertiesStr, pixelPropertiesStr, vertexShaderMethodDefinitions_uniform, isWebGL2) { const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); const materialNode = material._materialContent; let definitions = materialNode.getDefinitions(); const shaderDefines = material.getShaderDefines(); for (const shaderDefine of shaderDefines) { definitions += `#define ${shaderDefine}\n`; } const vertexAttributeDefines = defineAttributes(primitive); definitions += vertexAttributeDefines; // Shader Code Construction let vertexShader = _setupGlobalShaderDefinitionWebGL(material.__materialTypeName, primitive); vertexShader += '#define RN_IS_VERTEX_SHADER\n'; let pixelShader = _setupGlobalShaderDefinitionWebGL(material.__materialTypeName, primitive); pixelShader += '#define RN_IS_PIXEL_SHADER\n'; if (material.isBlend()) { pixelShader += '#define RN_IS_ALPHA_MODE_BLEND\n'; } if (material.isMask()) { pixelShader += '#define RN_IS_ALPHA_MODE_MASK\n'; } const vertexShaderityObject = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__.ShaderityUtilityWebGL.fillTemplate(materialNode.vertexShaderityObject, { getters: vertexPropertiesStr, definitions: definitions, dataUBODefinition: webglResourceRepository.getGlslDataUBODefinitionString(), dataUBOVec4Size: webglResourceRepository.getGlslDataUBOVec4SizeString(), matricesGetters: vertexShaderMethodDefinitions_uniform, }); const pixelShaderityObject = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__.ShaderityUtilityWebGL.fillTemplate(materialNode.pixelShaderityObject, { renderTargetBegin: webglResourceRepository.getGlslRenderTargetBeginString(4), getters: pixelPropertiesStr, definitions: definitions, dataUBODefinition: webglResourceRepository.getGlslDataUBODefinitionString(), dataUBOVec4Size: webglResourceRepository.getGlslDataUBOVec4SizeString(), matricesGetters: vertexShaderMethodDefinitions_uniform, renderTargetEnd: webglResourceRepository.getGlslRenderTargetEndString(4), }); vertexShader += vertexShaderityObject.code.replace(/#version\s+(100|300\s+es)/, ''); pixelShader += pixelShaderityObject.code.replace(/#version\s+(100|300\s+es)/, ''); const { attributeNames, attributeSemantics } = _getAttributeInfo(materialNode); const vertexAttributesBinding = _outputVertexAttributeBindingInfo(attributeNames, attributeSemantics); vertexShader += vertexAttributesBinding; const [shaderProgramUid, newOne] = ShaderHandler._createShaderProgramWithCache(material, vertexShader, pixelShader, attributeNames, attributeSemantics); return [shaderProgramUid, newOne]; } function _setupGlobalShaderDefinitionWebGL(materialTypeName, primitive) { let definitions = ''; const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); const glw = webglResourceRepository.currentWebGLContextWrapper; if (glw.isWebGL2) { definitions += '#version 300 es\n#define GLSL_ES3\n'; if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.isUboEnabled) { definitions += '#define RN_IS_UBO_ENABLED\n'; } } definitions += `#define RN_MATERIAL_TYPE_NAME ${materialTypeName}\n`; if (_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_3__.ProcessApproach.isDataTextureApproach(_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach)) { definitions += '#define RN_IS_DATATEXTURE_MODE\n'; } else { definitions += '#define RN_IS_UNIFORM_MODE\n'; } const rnXRModule = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__.ModuleManager.getInstance().getModule('xr'); const webXRSystem = rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebXRSystem.getInstance(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(webXRSystem) && webXRSystem.isWebXRMode && webglResourceRepository.isSupportMultiViewVRRendering()) { definitions += '#define WEBGL2_MULTI_VIEW\n'; } // if (glw._isWebXRMode && glw.is_multiview) { // definitions += '#define WEBXR_MULTI_VIEW_VIEW_NUM_2\n'; // } if (glw.isWebGL2 || glw.webgl1ExtDRV) { definitions += '#define RN_IS_SUPPORTING_STANDARD_DERIVATIVES\n'; } if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Mat43x1) { definitions += '#define RN_BONE_DATA_TYPE_Mat43x1\n'; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Vec4x2) { definitions += '#define RN_BONE_DATA_TYPE_VEC4X2\n'; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Vec4x2Old) { definitions += '#define RN_BONE_DATA_TYPE_VEC4X2_OLD\n'; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Vec4x1) { definitions += '#define RN_BONE_DATA_TYPE_VEC4X1\n'; } return definitions; } function _createProgramAsSingleOperationWebGpu(material, primitive, vertexShaderMethodDefinitions, vertexPropertiesStr, pixelPropertiesStr) { const materialNode = material._materialContent; let definitions = `// Material Type: ${material.materialTypeName}\n`; definitions += materialNode.getDefinitions(); const shaderDefines = material.getShaderDefines(); for (const shaderDefine of shaderDefines) { definitions += `#define ${shaderDefine}\n`; } const vertexAttributeDefines = defineAttributes(primitive); definitions += vertexAttributeDefines; if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Mat43x1) { definitions += '#define RN_BONE_DATA_TYPE_Mat43x1\n'; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Vec4x2) { definitions += '#define RN_BONE_DATA_TYPE_VEC4X2\n'; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Vec4x2Old) { definitions += '#define RN_BONE_DATA_TYPE_VEC4X2_OLD\n'; } else if (_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.boneDataType === _definitions_BoneDataType__WEBPACK_IMPORTED_MODULE_2__.BoneDataType.Vec4x1) { definitions += '#define RN_BONE_DATA_TYPE_VEC4X1\n'; } const vertexShaderityObject = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__.ShaderityUtilityWebGL.fillTemplate(materialNode.vertexShaderityObject, { getters: vertexPropertiesStr, definitions: '// RN_IS_VERTEX_SHADER\n#define RN_IS_VERTEX_SHADER\n' + definitions, matricesGetters: vertexShaderMethodDefinitions, maxMorphDataNumber: '' + Math.ceil((_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxVertexPrimitiveNumberInShader * _core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxVertexMorphNumberInShader) / 4), }); let alphaMode = ''; if (material.isBlend()) { alphaMode += '#define RN_IS_ALPHA_MODE_BLEND\n'; } if (material.isMask()) { alphaMode += '#define RN_IS_ALPHA_MODE_MASK\n'; } const pixelShaderityObject = _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__.ShaderityUtilityWebGL.fillTemplate(materialNode.pixelShaderityObject, { getters: pixelPropertiesStr, definitions: '// RN_IS_PIXEL_SHADER\n#define RN_IS_PIXEL_SHADER\n' + definitions + alphaMode, matricesGetters: vertexShaderMethodDefinitions, maxMorphDataNumber: '' + Math.ceil((_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxVertexPrimitiveNumberInShader * _core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxVertexMorphNumberInShader) / 4), }); const preprocessedVertex = shaderity__WEBPACK_IMPORTED_MODULE_0___default().processPragma(vertexShaderityObject); const preprocessedPixel = shaderity__WEBPACK_IMPORTED_MODULE_0___default().processPragma(pixelShaderityObject); const [programUid, newOne] = ShaderHandler._createShaderProgramWithCache(material, preprocessedVertex.code, preprocessedPixel.code, [], []); return programUid; } function defineAttributes(primitive) { let vertexAttributeDefines = ''; const attributeSemantics = primitive.attributeSemantics; for (const attributeSemantic of attributeSemantics) { if (attributeSemantic.indexOf('POSITION') !== -1) { vertexAttributeDefines += `#define RN_USE_POSITION\n`; const accessor = primitive.getAttribute(attributeSemantic); if (accessor.componentType.isFloatingPoint()) { vertexAttributeDefines += `#define RN_USE_POSITION_FLOAT\n`; } else if (accessor.componentType.isInteger()) { vertexAttributeDefines += `#define RN_USE_POSITION_INT\n`; } else { vertexAttributeDefines += `#define RN_USE_POSITION_UINT\n`; } } if (attributeSemantic.indexOf('NORMAL') !== -1) { vertexAttributeDefines += `#define RN_USE_NORMAL\n`; } if (attributeSemantic.indexOf('TANGENT') !== -1) { vertexAttributeDefines += `#define RN_USE_TANGENT\n`; } if (attributeSemantic.indexOf('TEXCOORD_0') !== -1) { vertexAttributeDefines += `#define RN_USE_TEXCOORD_0\n`; } if (attributeSemantic.indexOf('TEXCOORD_1') !== -1) { vertexAttributeDefines += `#define RN_USE_TEXCOORD_1\n`; } if (attributeSemantic.indexOf('COLOR_0') !== -1) { vertexAttributeDefines += `#define RN_USE_COLOR_0\n`; const accessor = primitive.getAttribute(attributeSemantic); if (accessor.componentType.isFloatingPoint()) { vertexAttributeDefines += `#define RN_USE_COLOR_0_FLOAT\n`; } else if (accessor.componentType.isInteger()) { vertexAttributeDefines += `#define RN_USE_COLOR_0_INT\n`; } else { vertexAttributeDefines += `#define RN_USE_COLOR_0_UINT\n`; } } if (attributeSemantic.indexOf('JOINTS_0') !== -1) { vertexAttributeDefines += `#define RN_USE_JOINTS_0\n`; } if (attributeSemantic.indexOf('WEIGHTS_0') !== -1) { vertexAttributeDefines += `#define RN_USE_WEIGHTS_0\n`; } if (attributeSemantic.indexOf('FACE_NORMAL') !== -1) { vertexAttributeDefines += `#define RN_USE_FACE_NORMAL\n`; } if (attributeSemantic.indexOf('BARY_CENTRIC_COORD') !== -1) { vertexAttributeDefines += `#define RN_USE_BARY_CENTRIC_COORD\n`; } if (attributeSemantic.indexOf('TEXCOORD_2') !== -1) { vertexAttributeDefines += `#define RN_USE_TEXCOORD_2\n`; } } if (primitive.targets != null && primitive.targets.length > 0) { vertexAttributeDefines += '#define RN_IS_MORPHING\n'; } vertexAttributeDefines += `#define RN_USE_INSTANCE\n`; return vertexAttributeDefines; } /***/ }), /***/ "./src/foundation/materials/core/ShaderityUtilityWebGL.ts": /*!****************************************************************!*\ !*** ./src/foundation/materials/core/ShaderityUtilityWebGL.ts ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderityUtilityWebGL: () => (/* binding */ ShaderityUtilityWebGL) /* harmony export */ }); /* harmony import */ var shaderity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! shaderity */ "./node_modules/shaderity/dist/esm/index.js"); /* harmony import */ var shaderity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(shaderity__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _math_MutableVector2__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../math/MutableScalar */ "./src/foundation/math/MutableScalar.ts"); /* harmony import */ var _math_MutableMatrix22__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../math/MutableMatrix22 */ "./src/foundation/math/MutableMatrix22.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _DummyTextures__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class ShaderityUtilityWebGL { static fillTemplate(shaderityObject, args) { const templateObject = Object.assign(args, { WellKnownComponentTIDs: _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__.WellKnownComponentTIDs, widthOfDataTexture: `const int widthOfDataTexture = ${_core_MemoryManager__WEBPACK_IMPORTED_MODULE_4__.MemoryManager.bufferWidthLength};`, heightOfDataTexture: `const int heightOfDataTexture = ${_core_MemoryManager__WEBPACK_IMPORTED_MODULE_4__.MemoryManager.bufferHeightLength};`, Config: _core_Config__WEBPACK_IMPORTED_MODULE_6__.Config, }); return shaderity__WEBPACK_IMPORTED_MODULE_0___default().fillTemplate(shaderityObject, templateObject); } static transformWebGLVersion(shaderityObject, isWebGL2) { if (isWebGL2) { return shaderity__WEBPACK_IMPORTED_MODULE_0___default().transformToGLSLES3(shaderityObject); } else { return shaderity__WEBPACK_IMPORTED_MODULE_0___default().transformToGLSLES1(shaderityObject, true); } } static getAttributeReflection(shaderityObject) { const reflection = shaderity__WEBPACK_IMPORTED_MODULE_0___default().createReflectionObject(shaderityObject); this.__setDefaultAttributeSemanticMap(reflection); reflection.reflect(); const names = reflection.attributesNames; const semantics = reflection.attributesSemantics.map((semantic) => { return _definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_3__.VertexAttribute.fromString(semantic); }); const compositions = reflection.attributesTypes.map((type) => { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.fromGlslString(type); }); const components = reflection.attributesTypes.map((type) => { return _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.fromGlslString(type); }); return { names, semantics, compositions, components, }; } static __setDefaultAttributeSemanticMap(reflection) { const attributeSemanticsMap = new Map(); attributeSemanticsMap.set('instanceinfo', 'INSTANCE'); attributeSemanticsMap.set('barycentriccoord', 'BARY_CENTRIC_COORD'); reflection.addAttributeSemanticsMap(attributeSemanticsMap); } static getShaderDataReflection(shaderityObject, existingShaderInfoMap) { const copiedShaderityObject = this.__copyShaderityObject(shaderityObject); const splitCode = shaderityObject.code.split(/\r\n|\n/); const uniformOmittedShaderRows = []; const shaderSemanticsInfoArray = []; for (const row of splitCode) { const reg = /^(?![/])[\t ]*uniform[\t ]+(\w+)[\t ]+(\w+);[\t ]*(\/\/)*[\t ]*(.*)/; const matchUniformDeclaration = row.match(reg); if (matchUniformDeclaration) { const type = matchUniformDeclaration[1]; const variableName = matchUniformDeclaration[2]; const info = matchUniformDeclaration[4]; if (this.__ignoreThisUniformDeclaration(info)) { uniformOmittedShaderRows.push(row); continue; } const shaderSemanticsInfo = this.__createShaderSemanticsInfo(type, variableName, info, shaderityObject.isFragmentShader, existingShaderInfoMap); shaderSemanticsInfoArray.push(shaderSemanticsInfo); } else { uniformOmittedShaderRows.push(row); } } copiedShaderityObject.code = uniformOmittedShaderRows.join('\n'); return { shaderSemanticsInfoArray: shaderSemanticsInfoArray, shaderityObject: copiedShaderityObject, }; } static __copyShaderityObject(obj) { const copiedObj = { code: obj.code, shaderStage: obj.shaderStage, isFragmentShader: obj.shaderStage === 'fragment', }; return copiedObj; } static __ignoreThisUniformDeclaration(info) { const skipProcess = info.match(/skipProcess[\t ]*=[\t ]*(\w+)[,\t ]*/); if ((skipProcess === null || skipProcess === void 0 ? void 0 : skipProcess[1]) === 'true') { return true; } return false; } static __createShaderSemanticsInfo(type, variableName, info, isFragmentShader, existingShaderInfoMap) { const componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.fromGlslString(type); const compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.fromGlslString(type); const stage = isFragmentShader ? _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_14__.ShaderType.PixelShader : _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_14__.ShaderType.VertexShader; const u_prefixedName = variableName.match(/u_(\w+)/); variableName = u_prefixedName[1]; const shaderSemanticsInfo = { semantic: variableName, compositionType, componentType, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: false, stage, }; this.__setRhodoniteOriginalParametersTo(shaderSemanticsInfo, info); return shaderSemanticsInfo; } static __setRhodoniteOriginalParametersTo(shaderSemanticsInfo, info) { const soloDatum = info.match(/soloDatum[\t ]*=[\t ]*(\w+)[,\t ]*/); let isSoloDatumFlg = false; if ((soloDatum === null || soloDatum === void 0 ? void 0 : soloDatum[1]) === 'true') { isSoloDatumFlg = true; } shaderSemanticsInfo.soloDatum = isSoloDatumFlg; const isInternalSetting = info.match(/isInternalSetting[\t ]*=[\t ]*(\w+)[,\t ]*/); let isInternalSettingFlg = false; if ((isInternalSetting === null || isInternalSetting === void 0 ? void 0 : isInternalSetting[1]) === 'true') { isInternalSettingFlg = true; } shaderSemanticsInfo.isInternalSetting = isInternalSettingFlg; const initialValue = info.match(/initialValue[\t ]*=[\t ]*(.+)[,\t ]*/); if (initialValue) { const initialValueText = initialValue[1]; shaderSemanticsInfo.initialValue = this.__getInitialValueFromText(shaderSemanticsInfo, initialValueText); } else { shaderSemanticsInfo.initialValue = this.__getDefaultInitialValue(shaderSemanticsInfo); } const needUniformInDataTextureMode = info.match(/needUniformInDataTextureMode[\t ]*=[\t ]*(.+)[,\t ]*/); if (needUniformInDataTextureMode) { let needUniformInDataTextureModeFlg = false; if ((needUniformInDataTextureMode === null || needUniformInDataTextureMode === void 0 ? void 0 : needUniformInDataTextureMode[1]) === 'true') { needUniformInDataTextureModeFlg = true; } shaderSemanticsInfo.needUniformInDataTextureMode = needUniformInDataTextureModeFlg; } } static __getInitialValueFromText(shaderSemanticsInfo, initialValueText) { const tuple = initialValueText.match(/\(([\d\w., ]+)\)/); const checkCompositionNumber = (expected) => { if (shaderSemanticsInfo.compositionType !== expected) { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('component number of initialValue is invalid:' + shaderSemanticsInfo.semantic); } }; let initialValue; if (tuple) { const text = tuple[1]; const split = text.split(','); switch (split.length) { case 1: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar); if (split[0] === 'true') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([1])); } else if (split[0] === 'false') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([0])); } else { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([parseFloat(split[0])])); } break; case 2: if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D || shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2DShadow) { const color = split[1].charAt(0).toUpperCase() + split[1].slice(1); initialValue = [parseInt(split[0]), _DummyTextures__WEBPACK_IMPORTED_MODULE_15__.DefaultTextures[`dummy${color}Texture`]]; } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.TextureCube) { const color = split[1].charAt(0).toUpperCase() + split[1].slice(1); initialValue = [ parseInt(split[0]), _DummyTextures__WEBPACK_IMPORTED_MODULE_15__.DefaultTextures[`dummy${color}CubeTexture`], ]; } else { checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2); initialValue = _math_MutableVector2__WEBPACK_IMPORTED_MODULE_7__.MutableVector2.fromCopyArray([ parseFloat(split[0]), parseFloat(split[1]), ]); } break; case 3: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3); initialValue = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.fromCopyArray([ parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), ]); break; case 4: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4); initialValue = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4.fromCopyArray([ parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), parseFloat(split[3]), ]); break; case 9: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat3); initialValue = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix33.fromCopy9RowMajor(parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), parseFloat(split[3]), parseFloat(split[4]), parseFloat(split[5]), parseFloat(split[6]), parseFloat(split[7]), parseFloat(split[8])); break; case 16: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4); initialValue = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_11__.MutableMatrix44.fromCopy16RowMajor(parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), parseFloat(split[3]), parseFloat(split[4]), parseFloat(split[5]), parseFloat(split[6]), parseFloat(split[7]), parseFloat(split[8]), parseFloat(split[9]), parseFloat(split[10]), parseFloat(split[11]), parseFloat(split[12]), parseFloat(split[13]), parseFloat(split[14]), parseFloat(split[15])); break; default: _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Invalid format'); } } else { checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar); if (initialValueText === 'true') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([1])); } else if (initialValueText === 'false') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([0])); } else { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([parseFloat(initialValueText)])); } } return initialValue; } static __getDefaultInitialValue(shaderSemanticsInfo) { if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar) { return new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_12__.MutableScalar(new Float32Array([0])); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2) { return _math_MutableVector2__WEBPACK_IMPORTED_MODULE_7__.MutableVector2.zero(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3) { return _math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.zero(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4) { return _math_MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4.zero(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat2) { return _math_MutableMatrix22__WEBPACK_IMPORTED_MODULE_13__.MutableMatrix22.identity(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat3) { return _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_10__.MutableMatrix33.identity(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4) { return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_11__.MutableMatrix44.identity(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D) { return [0, _DummyTextures__WEBPACK_IMPORTED_MODULE_15__.dummyWhiteTexture]; } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2DShadow) { return [0, _DummyTextures__WEBPACK_IMPORTED_MODULE_15__.dummyWhiteTexture]; } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.TextureCube) { return [0, _DummyTextures__WEBPACK_IMPORTED_MODULE_15__.dummyBlackTexture]; } _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.warn('initial value is not found'); return; } } /***/ }), /***/ "./src/foundation/materials/core/ShaderityUtilityWebGPU.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/core/ShaderityUtilityWebGPU.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ShaderityUtilityWebGPU: () => (/* binding */ ShaderityUtilityWebGPU) /* harmony export */ }); /* harmony import */ var shaderity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! shaderity */ "./node_modules/shaderity/dist/esm/index.js"); /* harmony import */ var shaderity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(shaderity__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../math/MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../math/MutableScalar */ "./src/foundation/math/MutableScalar.ts"); /* harmony import */ var _math_MutableMatrix22__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../math/MutableMatrix22 */ "./src/foundation/math/MutableMatrix22.ts"); /* harmony import */ var _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _DummyTextures__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../misc/Logger */ "./src/foundation/misc/Logger.ts"); class ShaderityUtilityWebGPU { static fillTemplate(shaderityObject, args) { const templateObject = Object.assign(args, { WellKnownComponentTIDs: _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_3__.WellKnownComponentTIDs, Config: _core_Config__WEBPACK_IMPORTED_MODULE_4__.Config, }); return shaderity__WEBPACK_IMPORTED_MODULE_0___default().fillTemplate(shaderityObject, templateObject); } static getShaderDataReflection(shaderityObject, existingShaderInfoMap) { const copiedShaderityObject = this.__copyShaderityObject(shaderityObject); const textureMap = new Map(); const splitCode = shaderityObject.code.split(/\r\n|\n/); const uniformOmittedShaderRows = []; const shaderSemanticsInfoArray = []; for (const row of splitCode) { const reg = /^[\t ]*\/\/[\t ]*#param[\t ]+(\w+)[ \t]*:[\t ]*([\w><]+);[\t ]*(\/\/)*[\t ]*(.*)/; const matchUniformDeclaration = row.match(reg); const tex = /^[\t ]*@group\(1\) @binding\((\d+)\)[ \t]*var[ \t]*(\w+)[ \t]*:[ \t]*([\w><]+);[\t ]*\/\/*[\t ]*(.*)/; const matchTextureDeclaration = row.match(tex); const sampler = /^[\t ]*@group\(2\) @binding\((\d+)\)[ \t]*var[ \t]*(\w+)[ \t]*:[ \t]*sampler;/; const matchSamplerDeclaration = row.match(sampler); if (matchUniformDeclaration) { const type = matchUniformDeclaration[2]; const variableName = matchUniformDeclaration[1]; const info = matchUniformDeclaration[4]; const shaderSemanticsInfo = this.__createShaderSemanticsInfo(type, variableName, info, shaderityObject.isFragmentShader, existingShaderInfoMap); shaderSemanticsInfoArray.push(shaderSemanticsInfo); } else if (matchTextureDeclaration) { const binding = parseInt(matchTextureDeclaration[1]); const variableName = matchTextureDeclaration[2]; const type = matchTextureDeclaration[3]; const info = matchTextureDeclaration[4]; const shaderSemanticsInfo = this.__createShaderSemanticInfoForTexture(type, variableName, binding, info, shaderityObject.isFragmentShader, existingShaderInfoMap); textureMap.set(binding, shaderSemanticsInfo); shaderSemanticsInfoArray.push(shaderSemanticsInfo); } else if (matchSamplerDeclaration) { const binding = parseInt(matchSamplerDeclaration[1]); const variableName = matchSamplerDeclaration[2]; if (textureMap.has(binding)) { const textureShaderSemanticsInfo = textureMap.get(binding); if (textureShaderSemanticsInfo) { const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_15__.Sampler({ magFilter: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Linear, minFilter: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Linear, wrapS: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Repeat, wrapT: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Repeat, wrapR: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Repeat, anisotropy: false, }); textureShaderSemanticsInfo.initialValue[2] = sampler; } } } else { // not match uniformOmittedShaderRows.push(row); } } copiedShaderityObject.code = uniformOmittedShaderRows.join('\n'); return { shaderSemanticsInfoArray: shaderSemanticsInfoArray, shaderityObject: copiedShaderityObject, }; } static __createShaderSemanticInfoForTexture(type, variableName, binding, info, isFragmentShader, existingShaderInfoMap) { const componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Int; let compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D; if (type.indexOf('texture_2d') !== -1) { compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D; } else if (type.indexOf('texture_cube') !== -1) { compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.TextureCube; } const stage = isFragmentShader ? _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.PixelShader : _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.VertexShader; const shaderSemanticsInfo = { semantic: variableName, compositionType, componentType, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: false, stage, }; const initialValue = info.match(/initialValue[\t ]*=[\t ]*(.+)[,\t ]*/); if (initialValue) { const initialValueText = initialValue[1]; shaderSemanticsInfo.initialValue = this.__getInitialValueFromTextForTexture(shaderSemanticsInfo, binding, initialValueText); } else { shaderSemanticsInfo.initialValue = this.__getDefaultInitialValue(shaderSemanticsInfo); } return shaderSemanticsInfo; } static __createShaderSemanticsInfo(type, variableName, info, isFragmentShader, existingShaderInfoMap) { const componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.fromWgslString(type); const compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.fromWgslString(type); const stage = isFragmentShader ? _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.PixelShader : _definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.VertexShader; const shaderSemanticsInfo = { semantic: variableName, compositionType, componentType, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: false, stage, }; this.__setRhodoniteOriginalParametersTo(shaderSemanticsInfo, info); return shaderSemanticsInfo; } static __setRhodoniteOriginalParametersTo(shaderSemanticsInfo, info) { const soloDatum = info.match(/soloDatum[\t ]*=[\t ]*(\w+)[,\t ]*/); let isSoloDatumFlg = false; if ((soloDatum === null || soloDatum === void 0 ? void 0 : soloDatum[1]) === 'true') { isSoloDatumFlg = true; } shaderSemanticsInfo.soloDatum = isSoloDatumFlg; const isInternalSetting = info.match(/isInternalSetting[\t ]*=[\t ]*(\w+)[,\t ]*/); let isInternalSettingFlg = false; if ((isInternalSetting === null || isInternalSetting === void 0 ? void 0 : isInternalSetting[1]) === 'true') { isInternalSettingFlg = true; } shaderSemanticsInfo.isInternalSetting = isInternalSettingFlg; const initialValue = info.match(/initialValue[\t ]*=[\t ]*(.+)[,\t ]*/); if (initialValue) { const initialValueText = initialValue[1]; shaderSemanticsInfo.initialValue = this.__getInitialValueFromText(shaderSemanticsInfo, initialValueText); } else { shaderSemanticsInfo.initialValue = this.__getDefaultInitialValue(shaderSemanticsInfo); } const needUniformInDataTextureMode = info.match(/needUniformInDataTextureMode[\t ]*=[\t ]*(.+)[,\t ]*/); if (needUniformInDataTextureMode) { let needUniformInDataTextureModeFlg = false; if ((needUniformInDataTextureMode === null || needUniformInDataTextureMode === void 0 ? void 0 : needUniformInDataTextureMode[1]) === 'true') { needUniformInDataTextureModeFlg = true; } shaderSemanticsInfo.needUniformInDataTextureMode = needUniformInDataTextureModeFlg; } } static __getInitialValueFromTextForTexture(shaderSemanticsInfo, binding, initialValueText) { let initialValue; const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_15__.Sampler({ magFilter: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Linear, minFilter: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.Linear, wrapS: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.ClampToEdge, wrapT: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.ClampToEdge, wrapR: _definitions__WEBPACK_IMPORTED_MODULE_14__.TextureParameter.ClampToEdge, anisotropy: false, }); if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D || shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2DShadow) { const color = initialValueText.charAt(0).toUpperCase() + initialValueText.slice(1); initialValue = [binding, _DummyTextures__WEBPACK_IMPORTED_MODULE_13__.DefaultTextures[`dummy${color}Texture`], sampler]; } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.TextureCube) { const color = initialValueText.charAt(0).toUpperCase() + initialValueText.slice(1); initialValue = [binding, _DummyTextures__WEBPACK_IMPORTED_MODULE_13__.DefaultTextures[`dummy${color}CubeTexture`], sampler]; } return initialValue; } static __getInitialValueFromText(shaderSemanticsInfo, initialValueText) { const tuple = initialValueText.match(/\(([\d\w., ]+)\)/); const checkCompositionNumber = (expected) => { if (shaderSemanticsInfo.compositionType !== expected) { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('component number of initialValue is invalid:' + shaderSemanticsInfo.semantic); } }; let initialValue; if (tuple) { const text = tuple[1]; const split = text.split(','); switch (split.length) { case 1: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar); if (split[0] === 'true') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([1])); } else if (split[0] === 'false') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([0])); } else { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([parseFloat(split[0])])); } break; case 2: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2); initialValue = _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__.MutableVector2.fromCopyArray([parseFloat(split[0]), parseFloat(split[1])]); break; case 3: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3); initialValue = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_6__.MutableVector3.fromCopyArray([ parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), ]); break; case 4: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4); initialValue = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__.MutableVector4.fromCopyArray([ parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), parseFloat(split[3]), ]); break; case 9: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat3); initialValue = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33.fromCopy9RowMajor(parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), parseFloat(split[3]), parseFloat(split[4]), parseFloat(split[5]), parseFloat(split[6]), parseFloat(split[7]), parseFloat(split[8])); break; case 16: checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4); initialValue = _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.fromCopy16RowMajor(parseFloat(split[0]), parseFloat(split[1]), parseFloat(split[2]), parseFloat(split[3]), parseFloat(split[4]), parseFloat(split[5]), parseFloat(split[6]), parseFloat(split[7]), parseFloat(split[8]), parseFloat(split[9]), parseFloat(split[10]), parseFloat(split[11]), parseFloat(split[12]), parseFloat(split[13]), parseFloat(split[14]), parseFloat(split[15])); break; default: _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Invalid format'); } } else { checkCompositionNumber(_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar); if (initialValueText === 'true') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([1])); } else if (initialValueText === 'false') { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([0])); } else { initialValue = new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([parseFloat(initialValueText)])); } } return initialValue; } static __getDefaultInitialValue(shaderSemanticsInfo) { if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar) { return new _math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar(new Float32Array([0])); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2) { return _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__.MutableVector2.zero(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3) { return _math_MutableVector3__WEBPACK_IMPORTED_MODULE_6__.MutableVector3.zero(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4) { return _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__.MutableVector4.zero(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat2) { return _math_MutableMatrix22__WEBPACK_IMPORTED_MODULE_11__.MutableMatrix22.identity(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat3) { return _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33.identity(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4) { return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.identity(); } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2D) { return [0, _DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyWhiteTexture]; } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Texture2DShadow) { return [0, _DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyWhiteTexture]; } else if (shaderSemanticsInfo.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.TextureCube) { return [0, _DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackTexture]; } _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.warn('initial value is not found'); return; } static __copyShaderityObject(obj) { const copiedObj = { code: obj.code, shaderStage: obj.shaderStage, isFragmentShader: obj.shaderStage === 'fragment', }; return copiedObj; } } /***/ }), /***/ "./src/foundation/materials/core/Socket.ts": /*!*************************************************!*\ !*** ./src/foundation/materials/core/Socket.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Socket: () => (/* binding */ Socket) /* harmony export */ }); class Socket { constructor(name, compositionType, componentType) { this.name = name; this.compositionType = compositionType; this.componentType = componentType; } } /***/ }), /***/ "./src/foundation/materials/core/index.ts": /*!************************************************!*\ !*** ./src/foundation/materials/core/index.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractMaterialContent: () => (/* reexport safe */ _AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__.AbstractMaterialContent), /* harmony export */ AbstractShaderNode: () => (/* reexport safe */ _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_1__.AbstractShaderNode), /* harmony export */ DefaultTextures: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.DefaultTextures), /* harmony export */ Material: () => (/* reexport safe */ _Material__WEBPACK_IMPORTED_MODULE_2__.Material), /* harmony export */ MaterialRepository: () => (/* reexport safe */ _MaterialRepository__WEBPACK_IMPORTED_MODULE_3__.MaterialRepository), /* harmony export */ ShaderGraphResolver: () => (/* reexport safe */ _ShaderGraphResolver__WEBPACK_IMPORTED_MODULE_5__.ShaderGraphResolver), /* harmony export */ ShaderityUtilityWebGL: () => (/* reexport safe */ _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__.ShaderityUtilityWebGL), /* harmony export */ dummyAnisotropyTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.dummyAnisotropyTexture), /* harmony export */ dummyBlackCubeTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.dummyBlackCubeTexture), /* harmony export */ dummyBlackTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.dummyBlackTexture), /* harmony export */ dummyBlueTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.dummyBlueTexture), /* harmony export */ dummySRGBGrayTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.dummySRGBGrayTexture), /* harmony export */ dummyWhiteTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.dummyWhiteTexture), /* harmony export */ initDefaultTextures: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.initDefaultTextures), /* harmony export */ sheenLutTexture: () => (/* reexport safe */ _DummyTextures__WEBPACK_IMPORTED_MODULE_7__.sheenLutTexture) /* harmony export */ }); /* harmony import */ var _AbstractMaterialContent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractMaterialContent */ "./src/foundation/materials/core/AbstractMaterialContent.ts"); /* harmony import */ var _AbstractShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _Material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Material */ "./src/foundation/materials/core/Material.ts"); /* harmony import */ var _MaterialRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MaterialRepository */ "./src/foundation/materials/core/MaterialRepository.ts"); /* harmony import */ var _MaterialTypes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MaterialTypes */ "./src/foundation/materials/core/MaterialTypes.ts"); /* harmony import */ var _ShaderGraphResolver__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ShaderGraphResolver */ "./src/foundation/materials/core/ShaderGraphResolver.ts"); /* harmony import */ var _ShaderityUtilityWebGL__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ShaderityUtilityWebGL */ "./src/foundation/materials/core/ShaderityUtilityWebGL.ts"); /* harmony import */ var _DummyTextures__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /***/ }), /***/ "./src/foundation/materials/index.ts": /*!*******************************************!*\ !*** ./src/foundation/materials/index.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractMaterialContent: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.AbstractMaterialContent), /* harmony export */ AbstractShaderNode: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode), /* harmony export */ AddShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.AddShaderNode), /* harmony export */ AttributeColorShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.AttributeColorShaderNode), /* harmony export */ AttributeNormalShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.AttributeNormalShaderNode), /* harmony export */ AttributePositionShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.AttributePositionShaderNode), /* harmony export */ AttributeTexcoordShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.AttributeTexcoordShaderNode), /* harmony export */ BlockBeginShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.BlockBeginShaderNode), /* harmony export */ BlockEndShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.BlockEndShaderNode), /* harmony export */ ColorGradingUsingLUTsMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.ColorGradingUsingLUTsMaterialContent), /* harmony export */ ConstantScalarVariableShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ConstantScalarVariableShaderNode), /* harmony export */ ConstantVector2VariableShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ConstantVector2VariableShaderNode), /* harmony export */ ConstantVector3VariableShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ConstantVector3VariableShaderNode), /* harmony export */ ConstantVector4VariableShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ConstantVector4VariableShaderNode), /* harmony export */ CustomMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.CustomMaterialContent), /* harmony export */ DefaultTextures: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.DefaultTextures), /* harmony export */ DepthEncodeMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.DepthEncodeMaterialContent), /* harmony export */ DetectHighLuminanceMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.DetectHighLuminanceMaterialContent), /* harmony export */ DotProductShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.DotProductShaderNode), /* harmony export */ EntityUIDOutputMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.EntityUIDOutputMaterialContent), /* harmony export */ FurnaceTestMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.FurnaceTestMaterialContent), /* harmony export */ GreaterShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.GreaterShaderNode), /* harmony export */ IfStatementShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.IfStatementShaderNode), /* harmony export */ MToonMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.MToonMaterialContent), /* harmony export */ MatCapMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.MatCapMaterialContent), /* harmony export */ Material: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.Material), /* harmony export */ MaterialRepository: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.MaterialRepository), /* harmony export */ MergeVectorShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.MergeVectorShaderNode), /* harmony export */ MultiplyShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.MultiplyShaderNode), /* harmony export */ NormalMatrixShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.NormalMatrixShaderNode), /* harmony export */ NormalizeShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.NormalizeShaderNode), /* harmony export */ OutColorShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.OutColorShaderNode), /* harmony export */ OutPositionShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.OutPositionShaderNode), /* harmony export */ ProjectionMatrixShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ProjectionMatrixShaderNode), /* harmony export */ ShaderGraphResolver: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.ShaderGraphResolver), /* harmony export */ ShaderityUtilityWebGL: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.ShaderityUtilityWebGL), /* harmony export */ ShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.ShadowMapDecodeClassicMaterialContent), /* harmony export */ SplitVectorShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.SplitVectorShaderNode), /* harmony export */ SynthesizeHdrMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.SynthesizeHdrMaterialContent), /* harmony export */ UniformDataShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.UniformDataShaderNode), /* harmony export */ VarianceShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _contents_index__WEBPACK_IMPORTED_MODULE_2__.VarianceShadowMapDecodeClassicMaterialContent), /* harmony export */ ViewMatrixShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ViewMatrixShaderNode), /* harmony export */ WireframeMaterialNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.WireframeMaterialNode), /* harmony export */ WorldMatrixShaderNode: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.WorldMatrixShaderNode), /* harmony export */ dummyAnisotropyTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.dummyAnisotropyTexture), /* harmony export */ dummyBlackCubeTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.dummyBlackCubeTexture), /* harmony export */ dummyBlackTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.dummyBlackTexture), /* harmony export */ dummyBlueTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.dummyBlueTexture), /* harmony export */ dummySRGBGrayTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.dummySRGBGrayTexture), /* harmony export */ dummyWhiteTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.dummyWhiteTexture), /* harmony export */ initDefaultTextures: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.initDefaultTextures), /* harmony export */ sheenLutTexture: () => (/* reexport safe */ _core_index__WEBPACK_IMPORTED_MODULE_0__.sheenLutTexture) /* harmony export */ }); /* harmony import */ var _core_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/index */ "./src/foundation/materials/core/index.ts"); /* harmony import */ var _nodes_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nodes/index */ "./src/foundation/materials/nodes/index.ts"); /* harmony import */ var _contents_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contents/index */ "./src/foundation/materials/contents/index.ts"); /***/ }), /***/ "./src/foundation/materials/nodes/AddShaderNode.ts": /*!*********************************************************!*\ !*** ./src/foundation/materials/nodes/AddShaderNode.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AddShaderNode: () => (/* binding */ AddShaderNode) /* harmony export */ }); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Add_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Add.glsl */ "./src/webgl/shaderity_shaders/nodes/Add.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Add_wgsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Add.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Add.wgsl"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); class AddShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode { constructor(compositionType, componentType) { super('add', { codeGLSL: _webgl_shaderity_shaders_nodes_Add_glsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Add_wgsl__WEBPACK_IMPORTED_MODULE_4__["default"].code, }); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_5__.Socket('lhs', compositionType, componentType)); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_5__.Socket('rhs', compositionType, componentType)); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_5__.Socket('outValue', compositionType, componentType)); } getSocketInputLhs() { return this.__inputs[0]; } getSocketInputRhs() { return this.__inputs[1]; } getSocketOutput() { return this.__outputs[0]; } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_7__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar) { if (this.__inputs[0].componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float && this.__inputs[1].componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float) { return this.__shaderFunctionName + 'F32F32'; } else if (this.__inputs[0].componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int && this.__inputs[1].componentType === _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Int) { return this.__shaderFunctionName + 'I32I32'; } else { throw new Error('Not implemented'); } } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2fVec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3fVec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4fVec4f'; } else { throw new Error('Not implemented'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/AttributeColorShaderNode.ts": /*!********************************************************************!*\ !*** ./src/foundation/materials/nodes/AttributeColorShaderNode.ts ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AttributeColorShaderNode: () => (/* binding */ AttributeColorShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_AttributeColor_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/AttributeColor.vert */ "./src/webgl/shaderity_shaders/nodes/AttributeColor.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_AttributeColor_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/AttributeColor.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/AttributeColor.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class AttributeColorShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('attributeColor', { codeGLSL: _webgl_shaderity_shaders_nodes_AttributeColor_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_AttributeColor_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/AttributeNormalShaderNode.ts": /*!*********************************************************************!*\ !*** ./src/foundation/materials/nodes/AttributeNormalShaderNode.ts ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AttributeNormalShaderNode: () => (/* binding */ AttributeNormalShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_AttributeNormal_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/AttributeNormal.vert */ "./src/webgl/shaderity_shaders/nodes/AttributeNormal.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_AttributeNormal_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/AttributeNormal.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/AttributeNormal.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class AttributeNormalShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('attributeNormal', { codeGLSL: _webgl_shaderity_shaders_nodes_AttributeNormal_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_AttributeNormal_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/AttributePositionShaderNode.ts": /*!***********************************************************************!*\ !*** ./src/foundation/materials/nodes/AttributePositionShaderNode.ts ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AttributePositionShaderNode: () => (/* binding */ AttributePositionShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_AttributePosition_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/AttributePosition.vert */ "./src/webgl/shaderity_shaders/nodes/AttributePosition.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_AttributePosition_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/AttributePosition.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/AttributePosition.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); class AttributePositionShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('attributePosition', { codeGLSL: _webgl_shaderity_shaders_nodes_AttributePosition_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_AttributePosition_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_5__.Socket('outValue', _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float)); } getSocketOutput() { return this.__outputs[0]; } } /***/ }), /***/ "./src/foundation/materials/nodes/AttributeTexcoordShaderNode.ts": /*!***********************************************************************!*\ !*** ./src/foundation/materials/nodes/AttributeTexcoordShaderNode.ts ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AttributeTexcoordShaderNode: () => (/* binding */ AttributeTexcoordShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_AttributeTexcoord_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/AttributeTexcoord.vert */ "./src/webgl/shaderity_shaders/nodes/AttributeTexcoord.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_AttributeTexcoord_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/AttributeTexcoord.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/AttributeTexcoord.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class AttributeTexcoordShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('attributeTexcoord', { codeGLSL: _webgl_shaderity_shaders_nodes_AttributeTexcoord_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_AttributeTexcoord_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/BlockBeginShaderNode.ts": /*!****************************************************************!*\ !*** ./src/foundation/materials/nodes/BlockBeginShaderNode.ts ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockBeginShaderNode: () => (/* binding */ BlockBeginShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaders_nodes_BlockBeginShader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/BlockBeginShader */ "./src/webgl/shaders/nodes/BlockBeginShader.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class BlockBeginShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__.AbstractShaderNode { constructor() { super('blockBegin', {}); this.__valueInputs = []; this.__valueOutputs = []; this.__shaderFunctionName += '_' + this.__shaderNodeUid; this.__commonPart = new _webgl_shaders_nodes_BlockBeginShader__WEBPACK_IMPORTED_MODULE_2__.BlockBeginShader(this.__shaderFunctionName, this.__valueInputs, this.__valueOutputs); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Bool, name: 'blockStart', }); } addInputAndOutput(compositionType, componentType) { const input = { compositionType: compositionType, componentType: componentType, name: `value_${this.__valueInputs.length}`, }; const output = { compositionType: compositionType, componentType: componentType, name: `outValue_${this.__valueOutputs.length}`, }; this.__inputs.push(input); this.__outputs.push(output); this.__valueInputs.push(input); this.__valueOutputs.push(output); } } /***/ }), /***/ "./src/foundation/materials/nodes/BlockEndShaderNode.ts": /*!**************************************************************!*\ !*** ./src/foundation/materials/nodes/BlockEndShaderNode.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockEndShaderNode: () => (/* binding */ BlockEndShaderNode) /* harmony export */ }); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _webgl_shaders_nodes_BlockEndShader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/BlockEndShader */ "./src/webgl/shaders/nodes/BlockEndShader.ts"); class BlockEndShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode { constructor() { super('blockEnd', {}); this.__shaderFunctionName += '_' + this.__shaderNodeUid; this.__commonPart = new _webgl_shaders_nodes_BlockEndShader__WEBPACK_IMPORTED_MODULE_1__.BlockEndShader(this.__shaderFunctionName, this.__inputs, this.__outputs); } addInputAndOutput(compositionType, componentType) { const input = { compositionType: compositionType, componentType: componentType, name: `value_${this.__inputs.length}`, }; const output = { compositionType: compositionType, componentType: componentType, name: `outValue_${this.__outputs.length}`, }; this.__inputs.push(input); this.__outputs.push(output); } } /***/ }), /***/ "./src/foundation/materials/nodes/ConstantScalarVariableShaderNode.ts": /*!****************************************************************************!*\ !*** ./src/foundation/materials/nodes/ConstantScalarVariableShaderNode.ts ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstantScalarVariableShaderNode: () => (/* binding */ ConstantScalarVariableShaderNode) /* harmony export */ }); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConstantVariableShaderNode */ "./src/foundation/materials/nodes/ConstantVariableShaderNode.ts"); class ConstantScalarVariableShaderNode extends _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__.ConstantVariableShaderNode { constructor(componentType) { super('ConstantScalar', _definitions__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar, componentType); } setDefaultInputValue(value) { this.__commonPart.setConstantValue(value); } } /***/ }), /***/ "./src/foundation/materials/nodes/ConstantVariableShaderNode.ts": /*!**********************************************************************!*\ !*** ./src/foundation/materials/nodes/ConstantVariableShaderNode.ts ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstantVariableShaderNode: () => (/* binding */ ConstantVariableShaderNode) /* harmony export */ }); /* harmony import */ var _webgl_shaders_nodes_ConstantVariableShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/ConstantVariableShader */ "./src/webgl/shaders/nodes/ConstantVariableShader.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); class ConstantVariableShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_1__.AbstractShaderNode { constructor(nodeName, compositionType, componentType) { super(nodeName, {}); this.__shaderFunctionName += '_' + this.__shaderNodeUid; this.__commonPart = new _webgl_shaders_nodes_ConstantVariableShader__WEBPACK_IMPORTED_MODULE_0__.ConstantVariableShader(this.__shaderFunctionName, compositionType, componentType); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_2__.Socket('outValue', compositionType, componentType)); } setDefaultInputValue(value) { this.__commonPart.setConstantValue(value); } getSocketOutput() { return this.__outputs[0]; } } /***/ }), /***/ "./src/foundation/materials/nodes/ConstantVector2VariableShaderNode.ts": /*!*****************************************************************************!*\ !*** ./src/foundation/materials/nodes/ConstantVector2VariableShaderNode.ts ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstantVector2VariableShaderNode: () => (/* binding */ ConstantVector2VariableShaderNode) /* harmony export */ }); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConstantVariableShaderNode */ "./src/foundation/materials/nodes/ConstantVariableShaderNode.ts"); class ConstantVector2VariableShaderNode extends _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__.ConstantVariableShaderNode { constructor(componentType) { super('ConstantVector2', _definitions__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2, componentType); } setDefaultInputValue(value) { this.__commonPart.setConstantValue(value); } } /***/ }), /***/ "./src/foundation/materials/nodes/ConstantVector3VariableShaderNode.ts": /*!*****************************************************************************!*\ !*** ./src/foundation/materials/nodes/ConstantVector3VariableShaderNode.ts ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstantVector3VariableShaderNode: () => (/* binding */ ConstantVector3VariableShaderNode) /* harmony export */ }); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConstantVariableShaderNode */ "./src/foundation/materials/nodes/ConstantVariableShaderNode.ts"); class ConstantVector3VariableShaderNode extends _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__.ConstantVariableShaderNode { constructor(componentType) { super('ConstantVector3', _definitions__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3, componentType); } setDefaultInputValue(value) { this.__commonPart.setConstantValue(value); } } /***/ }), /***/ "./src/foundation/materials/nodes/ConstantVector4VariableShaderNode.ts": /*!*****************************************************************************!*\ !*** ./src/foundation/materials/nodes/ConstantVector4VariableShaderNode.ts ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstantVector4VariableShaderNode: () => (/* binding */ ConstantVector4VariableShaderNode) /* harmony export */ }); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConstantVariableShaderNode */ "./src/foundation/materials/nodes/ConstantVariableShaderNode.ts"); class ConstantVector4VariableShaderNode extends _ConstantVariableShaderNode__WEBPACK_IMPORTED_MODULE_1__.ConstantVariableShaderNode { constructor(componentType) { super('ConstantVector4', _definitions__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, componentType); } setDefaultInputValue(value) { this.__commonPart.setConstantValue(value); } } /***/ }), /***/ "./src/foundation/materials/nodes/DotProductShaderNode.ts": /*!****************************************************************!*\ !*** ./src/foundation/materials/nodes/DotProductShaderNode.ts ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DotProductShaderNode: () => (/* binding */ DotProductShaderNode) /* harmony export */ }); /* harmony import */ var _webgl_shaderity_shaders_nodes_DotProduct_glsl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/DotProduct.glsl */ "./src/webgl/shaderity_shaders/nodes/DotProduct.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_DotProduct_wgsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/DotProduct.wgsl */ "./src/webgpu/shaderity_shaders/nodes/DotProduct.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class DotProductShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__.AbstractShaderNode { constructor(compositionType, componentType) { super('dotProduct', { codeGLSL: _webgl_shaderity_shaders_nodes_DotProduct_glsl__WEBPACK_IMPORTED_MODULE_0__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_DotProduct_wgsl__WEBPACK_IMPORTED_MODULE_1__["default"].code, }); this.__inputs.push({ compositionType: compositionType, componentType: componentType, name: 'lhs', }); this.__inputs.push({ compositionType: compositionType, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Float, name: 'rhs', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Scalar, componentType: componentType, name: 'outValue', }); } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4f'; } else { throw new Error('Not supported composition type.'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/GreaterShaderNode.ts": /*!*************************************************************!*\ !*** ./src/foundation/materials/nodes/GreaterShaderNode.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GreaterShaderNode: () => (/* binding */ GreaterShaderNode) /* harmony export */ }); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Greater_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Greater.glsl */ "./src/webgl/shaderity_shaders/nodes/Greater.glsl"); class GreaterShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode { constructor(compositionType, componentType) { super('greater', { codeGLSL: _webgl_shaderity_shaders_nodes_Greater_glsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.__inputs.push({ compositionType: compositionType, componentType: componentType, name: 'lhs', }); this.__inputs.push({ compositionType: compositionType, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Float, name: 'rhs', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.Bool, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/IfStatementShaderNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/IfStatementShaderNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ IfStatementShaderNode: () => (/* binding */ IfStatementShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaders_nodes_IfStatementShader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/IfStatementShader */ "./src/webgl/shaders/nodes/IfStatementShader.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class IfStatementShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__.AbstractShaderNode { constructor() { super('ifStatement', { commonPart: new _webgl_shaders_nodes_IfStatementShader__WEBPACK_IMPORTED_MODULE_2__.IfStatementShader(), }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Bool, name: 'condition', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Unknown, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Unknown, name: 'ifStart', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/MergeVectorShaderNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/MergeVectorShaderNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MergeVectorShaderNode: () => (/* binding */ MergeVectorShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_MergeVector_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/MergeVector.glsl */ "./src/webgl/shaderity_shaders/nodes/MergeVector.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_MergeVector_wgsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/MergeVector.wgsl */ "./src/webgpu/shaderity_shaders/nodes/MergeVector.wgsl"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class MergeVectorShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__.AbstractShaderNode { constructor() { super('mergeVector', { codeGLSL: _webgl_shaderity_shaders_nodes_MergeVector_glsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_MergeVector_wgsl__WEBPACK_IMPORTED_MODULE_4__["default"].code, }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xyz', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xy', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'zw', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'x', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'y', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'z', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'w', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xyzw', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xyz', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xy', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'zw', }); } getShaderFunctionNameDerivative() { if (this.inputConnections[0] != null && this.inputConnections[6] != null) { return this.__shaderFunctionName + 'XYZ_W'; } else if (this.inputConnections[1] != null && this.inputConnections[2] != null) { return this.__shaderFunctionName + 'XY_ZW'; } else if (this.inputConnections[1] != null && this.inputConnections[5] != null && this.inputConnections[6] != null) { return this.__shaderFunctionName + 'XY_Z_W'; } else if (this.inputConnections[2] != null && this.inputConnections[3] != null && this.inputConnections[4] != null) { return this.__shaderFunctionName + 'ZW_X_Y'; } else if (this.inputConnections[3] != null && this.inputConnections[4] != null && this.inputConnections[5] != null && this.inputConnections[6] != null) { return this.__shaderFunctionName + 'X_Y_Z_W'; } throw new Error('Not implemented'); } makeCallStatement(i, shaderNode, functionName, varInputNames, varOutputNames) { let str = ''; let rowStr = ''; if (varInputNames[i].length > 0 && varOutputNames[i].length > 0) { const dummyOutputVarDefines = _system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU ? [ `var dummyXYZW_${i}: vec4;`, `var dummyXYZ_${i}: vec3;`, `var dummyXY_${i}: vec2;`, `var dummyZW_${i}: vec2;`, ] : [ `vec4 dummyXYZW_${i};`, `vec3 dummyXYZ_${i};`, `vec2 dummyXY_${i};`, `vec2 dummyZW_${i};`, ]; const dummyOutputArguments = [ `dummyXYZW_${i}`, `dummyXYZ_${i}`, `dummyXY_${i}`, `dummyZW_${i}`, ]; for (let k = 0; k < varOutputNames[i].length; k++) { const outputName = varOutputNames[i][k]; if (outputName.indexOf('xyzw') >= 0) { dummyOutputVarDefines[0] = ''; dummyOutputArguments[0] = outputName; } else if (outputName.indexOf('xyz') >= 0) { dummyOutputVarDefines[1] = ''; dummyOutputArguments[1] = outputName; } else if (outputName.indexOf('xy') >= 0) { dummyOutputVarDefines[2] = ''; dummyOutputArguments[2] = outputName; } else if (outputName.indexOf('zw') >= 0) { dummyOutputVarDefines[3] = ''; dummyOutputArguments[3] = outputName; } } if (_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { for (let i = 0; i < dummyOutputArguments.length; i++) { dummyOutputArguments[i] = '&' + dummyOutputArguments[i]; } } // Call node functions rowStr += dummyOutputVarDefines.join('\n'); rowStr += `${functionName}(`; for (let k = 0; k < varInputNames[i].length; k++) { if (k !== 0) { rowStr += ', '; } const inputName = varInputNames[i][k]; rowStr += inputName; } rowStr += ', ' + dummyOutputArguments.join(', '); rowStr += ');\n'; } str += rowStr; return str; } } /***/ }), /***/ "./src/foundation/materials/nodes/MultiplyShaderNode.ts": /*!**************************************************************!*\ !*** ./src/foundation/materials/nodes/MultiplyShaderNode.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MultiplyShaderNode: () => (/* binding */ MultiplyShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Multiply_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Multiply.glsl */ "./src/webgl/shaderity_shaders/nodes/Multiply.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Multiply_wgsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Multiply.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Multiply.wgsl"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class MultiplyShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor(compositionType, componentType) { super('multiply', { codeGLSL: _webgl_shaderity_shaders_nodes_Multiply_glsl__WEBPACK_IMPORTED_MODULE_1__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Multiply_wgsl__WEBPACK_IMPORTED_MODULE_2__["default"].code, }); this.__inputs.push({ compositionType: compositionType, componentType: componentType, name: 'lhs', }); this.__inputs.push({ compositionType: compositionType, componentType: componentType, name: 'rhs', }); this.__outputs.push({ compositionType: compositionType, componentType: componentType, name: 'outValue', }); } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar) { if (this.__inputs[0].componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float && this.__inputs[1].componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float) { return this.__shaderFunctionName + 'F32F32'; } else if (this.__inputs[0].componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int && this.__inputs[1].componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int) { return this.__shaderFunctionName + 'I32I32'; } else { throw new Error('Not implemented'); } } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2fVec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3fVec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4fVec4f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat2 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat2) { return this.__shaderFunctionName + 'Mat2x2fMat2x2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3) { return this.__shaderFunctionName + 'Mat3x3fMat3x3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4) { return this.__shaderFunctionName + 'Mat4x4fMat4x4f'; } else { throw new Error('Not implemented'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/NormalMatrixShaderNode.ts": /*!******************************************************************!*\ !*** ./src/foundation/materials/nodes/NormalMatrixShaderNode.ts ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ NormalMatrixShaderNode: () => (/* binding */ NormalMatrixShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_NormalMatrix_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/NormalMatrix.vert */ "./src/webgl/shaderity_shaders/nodes/NormalMatrix.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_NormalMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/NormalMatrix.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/NormalMatrix.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class NormalMatrixShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('normalMatrix', { codeGLSL: _webgl_shaderity_shaders_nodes_NormalMatrix_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_NormalMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/NormalizeShaderNode.ts": /*!***************************************************************!*\ !*** ./src/foundation/materials/nodes/NormalizeShaderNode.ts ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ NormalizeShaderNode: () => (/* binding */ NormalizeShaderNode) /* harmony export */ }); /* harmony import */ var _webgl_shaderity_shaders_nodes_Normalize_glsl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Normalize.glsl */ "./src/webgl/shaderity_shaders/nodes/Normalize.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Normalize_wgsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Normalize.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Normalize.wgsl"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class NormalizeShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__.AbstractShaderNode { constructor(compositionType, componentType) { super('_normalize', { codeGLSL: _webgl_shaderity_shaders_nodes_Normalize_glsl__WEBPACK_IMPORTED_MODULE_0__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Normalize_wgsl__WEBPACK_IMPORTED_MODULE_1__["default"].code, }); this.__inputs.push({ compositionType: compositionType, componentType: componentType, name: 'value', }); this.__outputs.push({ compositionType: compositionType, componentType: componentType, name: 'outValue', }); } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2f'; } else if (this.__inputs[0].compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3f'; } else if (this.__inputs[0].compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4f'; } else { throw new Error('Not supported composition type.'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/OutColorShaderNode.ts": /*!**************************************************************!*\ !*** ./src/foundation/materials/nodes/OutColorShaderNode.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ OutColorShaderNode: () => (/* binding */ OutColorShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaders_nodes_EndShader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/EndShader */ "./src/webgl/shaders/nodes/EndShader.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); class OutColorShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__.AbstractShaderNode { constructor() { super('outColor', { commonPart: _webgl_shaders_nodes_EndShader__WEBPACK_IMPORTED_MODULE_2__.EndShader.getInstance(), }); this.setShaderStage('Fragment'); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('value', _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float)); } getSocketInput() { return this.__inputs[0]; } } /***/ }), /***/ "./src/foundation/materials/nodes/OutPositionShaderNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/OutPositionShaderNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ OutPositionShaderNode: () => (/* binding */ OutPositionShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaders_nodes_EndShader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/EndShader */ "./src/webgl/shaders/nodes/EndShader.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); class OutPositionShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__.AbstractShaderNode { constructor() { super('outPosition', { commonPart: _webgl_shaders_nodes_EndShader__WEBPACK_IMPORTED_MODULE_2__.EndShader.getInstance(), }); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('value', _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float)); } getSocketInput() { return this.__inputs[0]; } } /***/ }), /***/ "./src/foundation/materials/nodes/ProjectionMatrixShaderNode.ts": /*!**********************************************************************!*\ !*** ./src/foundation/materials/nodes/ProjectionMatrixShaderNode.ts ***! \**********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ProjectionMatrixShaderNode: () => (/* binding */ ProjectionMatrixShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_ProjectionMatrix_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/ProjectionMatrix.vert */ "./src/webgl/shaderity_shaders/nodes/ProjectionMatrix.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_ProjectionMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/ProjectionMatrix.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/ProjectionMatrix.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class ProjectionMatrixShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('projectionMatrix', { codeGLSL: _webgl_shaderity_shaders_nodes_ProjectionMatrix_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_ProjectionMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/SinShaderNode.ts": /*!*********************************************************!*\ !*** ./src/foundation/materials/nodes/SinShaderNode.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SinShaderNode: () => (/* binding */ SinShaderNode) /* harmony export */ }); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Sin_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Sin.glsl */ "./src/webgl/shaderity_shaders/nodes/Sin.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Sin_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Sin.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Sin.wgsl"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); class SinShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode { constructor(compositionType, componentType) { super('_sin', { codeGLSL: _webgl_shaderity_shaders_nodes_Sin_glsl__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Sin_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('value', compositionType, componentType)); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('outValue', compositionType, componentType)); } getSocketInputValue() { return this.__inputs[0]; } getSocketOutput() { return this.__outputs[0]; } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_6__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar) { return this.__shaderFunctionName + 'F32'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4f'; } else { throw new Error('Not implemented'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/SmoothStepShaderNode.ts": /*!****************************************************************!*\ !*** ./src/foundation/materials/nodes/SmoothStepShaderNode.ts ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SmoothStepShaderNode: () => (/* binding */ SmoothStepShaderNode) /* harmony export */ }); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_SmoothStep_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/SmoothStep.glsl */ "./src/webgl/shaderity_shaders/nodes/SmoothStep.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_SmoothStep_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/SmoothStep.wgsl */ "./src/webgpu/shaderity_shaders/nodes/SmoothStep.wgsl"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); class SmoothStepShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode { constructor(compositionType, componentType) { super('_smoothstep', { codeGLSL: _webgl_shaderity_shaders_nodes_SmoothStep_glsl__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_SmoothStep_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('value', compositionType, componentType)); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('edge0', compositionType, componentType)); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('edge1', compositionType, componentType)); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('outValue', compositionType, componentType)); } getSocketInputValue() { return this.__inputs[0]; } getSocketOutput() { return this.__outputs[0]; } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_6__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar) { return this.__shaderFunctionName + 'F32'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4f'; } else { throw new Error('Not implemented'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/SplitVectorShaderNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/SplitVectorShaderNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SplitVectorShaderNode: () => (/* binding */ SplitVectorShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_SplitVector_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/SplitVector.glsl */ "./src/webgl/shaderity_shaders/nodes/SplitVector.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_SplitVector_wgsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/SplitVector.wgsl */ "./src/webgpu/shaderity_shaders/nodes/SplitVector.wgsl"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class SplitVectorShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__.AbstractShaderNode { constructor() { super('splitVector', { codeGLSL: _webgl_shaderity_shaders_nodes_SplitVector_glsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_SplitVector_wgsl__WEBPACK_IMPORTED_MODULE_4__["default"].code, }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xyzw', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xyz', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xy', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xyz', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'xy', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'zw', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'x', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'y', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'z', }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float, name: 'w', }); } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { for (const inputConnection of this.inputConnections) { if (inputConnection != null) { if (inputConnection.inputNameOfThis === 'xyzw') { return this.__shaderFunctionName + 'XYZW'; } else if (inputConnection.inputNameOfThis === 'xyz') { return this.__shaderFunctionName + 'XYZ'; } else if (inputConnection.inputNameOfThis === 'xy') { return this.__shaderFunctionName + 'XY'; } } } throw new Error('Not implemented'); } else { return this.__shaderFunctionName; } } makeCallStatement(i, shaderNode, functionName, varInputNames, varOutputNames) { let str = ''; let rowStr = ''; if (varInputNames[i].length > 0 && varOutputNames[i].length > 0) { const dummyOutputVarDefines = _system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU ? [ `var dummyXYZ_${i}: vec3;`, `var dummyXY_${i}: vec2;`, `var dummyZW_${i}: vec2;`, `var dummyX_${i}: f32;`, `var dummyY_${i}: f32;`, `var dummyZ_${i}: f32;`, `var dummyW_${i}: f32;`, ] : [ `vec3 dummyXYZ_${i};`, `vec2 dummyXY_${i};`, `vec2 dummyZW_${i};`, `float dummyX_${i};`, `float dummyY_${i};`, `float dummyZ_${i};`, `float dummyW_${i};`, ]; const dummyOutputArguments = [ `dummyXYZ_${i}`, `dummyXY_${i}`, `dummyZW_${i}`, `dummyX_${i}`, `dummyY_${i}`, `dummyZ_${i}`, `dummyW_${i}`, ]; for (let k = 0; k < varOutputNames[i].length; k++) { const outputName = varOutputNames[i][k]; if (outputName.indexOf('xyz') >= 0) { dummyOutputVarDefines[0] = ''; dummyOutputArguments[0] = outputName; } else if (outputName.indexOf('xy') >= 0) { dummyOutputVarDefines[1] = ''; dummyOutputArguments[1] = outputName; } else if (outputName.indexOf('zw') >= 0) { dummyOutputVarDefines[2] = ''; dummyOutputArguments[2] = outputName; } else if (outputName.indexOf('x') >= 0) { dummyOutputVarDefines[3] = ''; dummyOutputArguments[3] = outputName; } else if (outputName.indexOf('y') >= 0) { dummyOutputVarDefines[4] = ''; dummyOutputArguments[4] = outputName; } else if (outputName.indexOf('z') >= 0) { dummyOutputVarDefines[5] = ''; dummyOutputArguments[5] = outputName; } else if (outputName.indexOf('w') >= 0) { dummyOutputVarDefines[6] = ''; dummyOutputArguments[6] = outputName; } } if (_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { for (let i = 0; i < dummyOutputArguments.length; i++) { dummyOutputArguments[i] = '&' + dummyOutputArguments[i]; } } // Call node functions rowStr += dummyOutputVarDefines.join('\n'); rowStr += `${functionName}(`; const inputName = varInputNames[i][0]; rowStr += inputName; rowStr += ', ' + dummyOutputArguments.join(', '); rowStr += ');\n'; } str += rowStr; return str; } } /***/ }), /***/ "./src/foundation/materials/nodes/StepShaderNode.ts": /*!**********************************************************!*\ !*** ./src/foundation/materials/nodes/StepShaderNode.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ StepShaderNode: () => (/* binding */ StepShaderNode) /* harmony export */ }); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Step_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Step.glsl */ "./src/webgl/shaderity_shaders/nodes/Step.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Step_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Step.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Step.wgsl"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); class StepShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode { constructor(compositionType, componentType) { super('_step', { codeGLSL: _webgl_shaderity_shaders_nodes_Step_glsl__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Step_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('value', compositionType, componentType)); this.__inputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('edge', compositionType, componentType)); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_4__.Socket('outValue', compositionType, componentType)); } getSocketInputValue() { return this.__inputs[0]; } getSocketOutput() { return this.__outputs[0]; } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_6__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar) { return this.__shaderFunctionName + 'F32'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Vec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Vec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Vec4f'; } else { throw new Error('Not implemented'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/TimeShaderNode.ts": /*!**********************************************************!*\ !*** ./src/foundation/materials/nodes/TimeShaderNode.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TimeShaderNode: () => (/* binding */ TimeShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Time_glsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Time.glsl */ "./src/webgl/shaderity_shaders/nodes/Time.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Time_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Time.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Time.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class TimeShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('time', { codeGLSL: _webgl_shaderity_shaders_nodes_Time_glsl__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Time_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/TransformShaderNode.ts": /*!***************************************************************!*\ !*** ./src/foundation/materials/nodes/TransformShaderNode.ts ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TransformShaderNode: () => (/* binding */ TransformShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Transform_glsl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Transform.glsl */ "./src/webgl/shaderity_shaders/nodes/Transform.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_Transform_wgsl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/Transform.wgsl */ "./src/webgpu/shaderity_shaders/nodes/Transform.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); class TransformShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_3__.AbstractShaderNode { constructor(lhsCompositionType, lhsComponentType, rhsCompositionType, rhsComponentType) { super('transform', { codeGLSL: _webgl_shaderity_shaders_nodes_Transform_glsl__WEBPACK_IMPORTED_MODULE_1__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_Transform_wgsl__WEBPACK_IMPORTED_MODULE_2__["default"].code, }); let outValueCompositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Unknown; if (lhsCompositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4 && rhsCompositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4) { outValueCompositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4; } else if (lhsCompositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3 && rhsCompositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3) { outValueCompositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3; } else if (lhsCompositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat2 && rhsCompositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2) { outValueCompositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2; } this.__inputs.push({ compositionType: lhsCompositionType, componentType: lhsComponentType, name: 'lhs', }); this.__inputs.push({ compositionType: rhsCompositionType, componentType: rhsComponentType, name: 'rhs', }); this.__outputs.push({ compositionType: outValueCompositionType, componentType: lhsComponentType, name: 'outValue', }); } getShaderFunctionNameDerivative() { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat2 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2) { return this.__shaderFunctionName + 'Mat2x2fVec2f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3) { return this.__shaderFunctionName + 'Mat3x3fVec3f'; } else if (this.__inputs[0].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4 && this.__inputs[1].compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4) { return this.__shaderFunctionName + 'Mat4x4fVec4f'; } else { throw new Error('Not implemented'); } } else { return this.__shaderFunctionName; } } } /***/ }), /***/ "./src/foundation/materials/nodes/UniformDataShaderNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/UniformDataShaderNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ UniformDataShaderNode: () => (/* binding */ UniformDataShaderNode) /* harmony export */ }); /* harmony import */ var _webgl_shaders_nodes_UniformDataShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../webgl/shaders/nodes/UniformDataShader */ "./src/webgl/shaders/nodes/UniformDataShader.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _core_Socket__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/Socket */ "./src/foundation/materials/core/Socket.ts"); class UniformDataShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_1__.AbstractShaderNode { constructor(compositionType, componentType) { super('uniformData', {}); this.__shaderFunctionName += '_' + this.__shaderNodeUid; this.__commonPart = new _webgl_shaders_nodes_UniformDataShader__WEBPACK_IMPORTED_MODULE_0__.UniformDataShader(this.__shaderFunctionName, compositionType, componentType); this.__outputs.push(new _core_Socket__WEBPACK_IMPORTED_MODULE_2__.Socket('outValue', compositionType, componentType)); } setDefaultInputValue(inputName, value) { if (inputName === 'value') { this.__commonPart.setDefaultValue(value); } } setUniformDataName(value) { this.__commonPart.setVariableName(value); } } /***/ }), /***/ "./src/foundation/materials/nodes/ViewMatrixShaderNode.ts": /*!****************************************************************!*\ !*** ./src/foundation/materials/nodes/ViewMatrixShaderNode.ts ***! \****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ViewMatrixShaderNode: () => (/* binding */ ViewMatrixShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_ViewMatrix_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/ViewMatrix.vert */ "./src/webgl/shaderity_shaders/nodes/ViewMatrix.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_ViewMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/ViewMatrix.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/ViewMatrix.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class ViewMatrixShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('viewMatrix', { codeGLSL: _webgl_shaderity_shaders_nodes_ViewMatrix_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_ViewMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/WireframeMaterialNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/WireframeMaterialNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WireframeMaterialNode: () => (/* binding */ WireframeMaterialNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_Wireframe_glsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/Wireframe.glsl */ "./src/webgl/shaderity_shaders/nodes/Wireframe.glsl"); class WireframeMaterialNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_2__.AbstractShaderNode { constructor() { super('wireframe', { codeGLSL: _webgl_shaderity_shaders_nodes_Wireframe_glsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); // Input this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'existingFragColor', }); this.__inputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'wireframeColor', }); // Output this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outColor', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/WorldMatrixShaderNode.ts": /*!*****************************************************************!*\ !*** ./src/foundation/materials/nodes/WorldMatrixShaderNode.ts ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WorldMatrixShaderNode: () => (/* binding */ WorldMatrixShaderNode) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _webgl_shaderity_shaders_nodes_WorldMatrix_vert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../webgl/shaderity_shaders/nodes/WorldMatrix.vert */ "./src/webgl/shaderity_shaders/nodes/WorldMatrix.vert"); /* harmony import */ var _webgpu_shaderity_shaders_nodes_WorldMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../webgpu/shaderity_shaders/nodes/WorldMatrix.vert.wgsl */ "./src/webgpu/shaderity_shaders/nodes/WorldMatrix.vert.wgsl"); /* harmony import */ var _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class WorldMatrixShaderNode extends _core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_4__.AbstractShaderNode { constructor() { super('worldMatrix', { codeGLSL: _webgl_shaderity_shaders_nodes_WorldMatrix_vert__WEBPACK_IMPORTED_MODULE_2__["default"].code, codeWGSL: _webgpu_shaderity_shaders_nodes_WorldMatrix_vert_wgsl__WEBPACK_IMPORTED_MODULE_3__["default"].code, }); this.setShaderStage('Vertex'); this.__outputs.push({ compositionType: _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4, componentType: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Float, name: 'outValue', }); } } /***/ }), /***/ "./src/foundation/materials/nodes/index.ts": /*!*************************************************!*\ !*** ./src/foundation/materials/nodes/index.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AddShaderNode: () => (/* reexport safe */ _AddShaderNode__WEBPACK_IMPORTED_MODULE_0__.AddShaderNode), /* harmony export */ AttributeColorShaderNode: () => (/* reexport safe */ _AttributeColorShaderNode__WEBPACK_IMPORTED_MODULE_1__.AttributeColorShaderNode), /* harmony export */ AttributeNormalShaderNode: () => (/* reexport safe */ _AttributeNormalShaderNode__WEBPACK_IMPORTED_MODULE_2__.AttributeNormalShaderNode), /* harmony export */ AttributePositionShaderNode: () => (/* reexport safe */ _AttributePositionShaderNode__WEBPACK_IMPORTED_MODULE_3__.AttributePositionShaderNode), /* harmony export */ AttributeTexcoordShaderNode: () => (/* reexport safe */ _AttributeTexcoordShaderNode__WEBPACK_IMPORTED_MODULE_4__.AttributeTexcoordShaderNode), /* harmony export */ BlockBeginShaderNode: () => (/* reexport safe */ _BlockBeginShaderNode__WEBPACK_IMPORTED_MODULE_5__.BlockBeginShaderNode), /* harmony export */ BlockEndShaderNode: () => (/* reexport safe */ _BlockEndShaderNode__WEBPACK_IMPORTED_MODULE_6__.BlockEndShaderNode), /* harmony export */ ConstantScalarVariableShaderNode: () => (/* reexport safe */ _ConstantScalarVariableShaderNode__WEBPACK_IMPORTED_MODULE_7__.ConstantScalarVariableShaderNode), /* harmony export */ ConstantVector2VariableShaderNode: () => (/* reexport safe */ _ConstantVector2VariableShaderNode__WEBPACK_IMPORTED_MODULE_8__.ConstantVector2VariableShaderNode), /* harmony export */ ConstantVector3VariableShaderNode: () => (/* reexport safe */ _ConstantVector3VariableShaderNode__WEBPACK_IMPORTED_MODULE_9__.ConstantVector3VariableShaderNode), /* harmony export */ ConstantVector4VariableShaderNode: () => (/* reexport safe */ _ConstantVector4VariableShaderNode__WEBPACK_IMPORTED_MODULE_10__.ConstantVector4VariableShaderNode), /* harmony export */ DotProductShaderNode: () => (/* reexport safe */ _DotProductShaderNode__WEBPACK_IMPORTED_MODULE_11__.DotProductShaderNode), /* harmony export */ GreaterShaderNode: () => (/* reexport safe */ _GreaterShaderNode__WEBPACK_IMPORTED_MODULE_12__.GreaterShaderNode), /* harmony export */ IfStatementShaderNode: () => (/* reexport safe */ _IfStatementShaderNode__WEBPACK_IMPORTED_MODULE_13__.IfStatementShaderNode), /* harmony export */ MergeVectorShaderNode: () => (/* reexport safe */ _MergeVectorShaderNode__WEBPACK_IMPORTED_MODULE_25__.MergeVectorShaderNode), /* harmony export */ MultiplyShaderNode: () => (/* reexport safe */ _MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_14__.MultiplyShaderNode), /* harmony export */ NormalMatrixShaderNode: () => (/* reexport safe */ _NormalMatrixShaderNode__WEBPACK_IMPORTED_MODULE_15__.NormalMatrixShaderNode), /* harmony export */ NormalizeShaderNode: () => (/* reexport safe */ _NormalizeShaderNode__WEBPACK_IMPORTED_MODULE_16__.NormalizeShaderNode), /* harmony export */ OutColorShaderNode: () => (/* reexport safe */ _OutColorShaderNode__WEBPACK_IMPORTED_MODULE_17__.OutColorShaderNode), /* harmony export */ OutPositionShaderNode: () => (/* reexport safe */ _OutPositionShaderNode__WEBPACK_IMPORTED_MODULE_18__.OutPositionShaderNode), /* harmony export */ ProjectionMatrixShaderNode: () => (/* reexport safe */ _ProjectionMatrixShaderNode__WEBPACK_IMPORTED_MODULE_19__.ProjectionMatrixShaderNode), /* harmony export */ SplitVectorShaderNode: () => (/* reexport safe */ _SplitVectorShaderNode__WEBPACK_IMPORTED_MODULE_24__.SplitVectorShaderNode), /* harmony export */ UniformDataShaderNode: () => (/* reexport safe */ _UniformDataShaderNode__WEBPACK_IMPORTED_MODULE_20__.UniformDataShaderNode), /* harmony export */ ViewMatrixShaderNode: () => (/* reexport safe */ _ViewMatrixShaderNode__WEBPACK_IMPORTED_MODULE_21__.ViewMatrixShaderNode), /* harmony export */ WireframeMaterialNode: () => (/* reexport safe */ _WireframeMaterialNode__WEBPACK_IMPORTED_MODULE_22__.WireframeMaterialNode), /* harmony export */ WorldMatrixShaderNode: () => (/* reexport safe */ _WorldMatrixShaderNode__WEBPACK_IMPORTED_MODULE_23__.WorldMatrixShaderNode) /* harmony export */ }); /* harmony import */ var _AddShaderNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AddShaderNode */ "./src/foundation/materials/nodes/AddShaderNode.ts"); /* harmony import */ var _AttributeColorShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AttributeColorShaderNode */ "./src/foundation/materials/nodes/AttributeColorShaderNode.ts"); /* harmony import */ var _AttributeNormalShaderNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AttributeNormalShaderNode */ "./src/foundation/materials/nodes/AttributeNormalShaderNode.ts"); /* harmony import */ var _AttributePositionShaderNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AttributePositionShaderNode */ "./src/foundation/materials/nodes/AttributePositionShaderNode.ts"); /* harmony import */ var _AttributeTexcoordShaderNode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AttributeTexcoordShaderNode */ "./src/foundation/materials/nodes/AttributeTexcoordShaderNode.ts"); /* harmony import */ var _BlockBeginShaderNode__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BlockBeginShaderNode */ "./src/foundation/materials/nodes/BlockBeginShaderNode.ts"); /* harmony import */ var _BlockEndShaderNode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./BlockEndShaderNode */ "./src/foundation/materials/nodes/BlockEndShaderNode.ts"); /* harmony import */ var _ConstantScalarVariableShaderNode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ConstantScalarVariableShaderNode */ "./src/foundation/materials/nodes/ConstantScalarVariableShaderNode.ts"); /* harmony import */ var _ConstantVector2VariableShaderNode__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ConstantVector2VariableShaderNode */ "./src/foundation/materials/nodes/ConstantVector2VariableShaderNode.ts"); /* harmony import */ var _ConstantVector3VariableShaderNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ConstantVector3VariableShaderNode */ "./src/foundation/materials/nodes/ConstantVector3VariableShaderNode.ts"); /* harmony import */ var _ConstantVector4VariableShaderNode__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ConstantVector4VariableShaderNode */ "./src/foundation/materials/nodes/ConstantVector4VariableShaderNode.ts"); /* harmony import */ var _DotProductShaderNode__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./DotProductShaderNode */ "./src/foundation/materials/nodes/DotProductShaderNode.ts"); /* harmony import */ var _GreaterShaderNode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./GreaterShaderNode */ "./src/foundation/materials/nodes/GreaterShaderNode.ts"); /* harmony import */ var _IfStatementShaderNode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./IfStatementShaderNode */ "./src/foundation/materials/nodes/IfStatementShaderNode.ts"); /* harmony import */ var _MultiplyShaderNode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./MultiplyShaderNode */ "./src/foundation/materials/nodes/MultiplyShaderNode.ts"); /* harmony import */ var _NormalMatrixShaderNode__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./NormalMatrixShaderNode */ "./src/foundation/materials/nodes/NormalMatrixShaderNode.ts"); /* harmony import */ var _NormalizeShaderNode__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./NormalizeShaderNode */ "./src/foundation/materials/nodes/NormalizeShaderNode.ts"); /* harmony import */ var _OutColorShaderNode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./OutColorShaderNode */ "./src/foundation/materials/nodes/OutColorShaderNode.ts"); /* harmony import */ var _OutPositionShaderNode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./OutPositionShaderNode */ "./src/foundation/materials/nodes/OutPositionShaderNode.ts"); /* harmony import */ var _ProjectionMatrixShaderNode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ProjectionMatrixShaderNode */ "./src/foundation/materials/nodes/ProjectionMatrixShaderNode.ts"); /* harmony import */ var _UniformDataShaderNode__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./UniformDataShaderNode */ "./src/foundation/materials/nodes/UniformDataShaderNode.ts"); /* harmony import */ var _ViewMatrixShaderNode__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ViewMatrixShaderNode */ "./src/foundation/materials/nodes/ViewMatrixShaderNode.ts"); /* harmony import */ var _WireframeMaterialNode__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./WireframeMaterialNode */ "./src/foundation/materials/nodes/WireframeMaterialNode.ts"); /* harmony import */ var _WorldMatrixShaderNode__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./WorldMatrixShaderNode */ "./src/foundation/materials/nodes/WorldMatrixShaderNode.ts"); /* harmony import */ var _SplitVectorShaderNode__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./SplitVectorShaderNode */ "./src/foundation/materials/nodes/SplitVectorShaderNode.ts"); /* harmony import */ var _MergeVectorShaderNode__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./MergeVectorShaderNode */ "./src/foundation/materials/nodes/MergeVectorShaderNode.ts"); /***/ }), /***/ "./src/foundation/math/AABB.ts": /*!*************************************!*\ !*** ./src/foundation/math/AABB.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AABB: () => (/* binding */ AABB) /* harmony export */ }); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _MutableVector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /** * A 3D axis-aligned bounding box. */ class AABB { constructor() { this.__min = _MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.fromCopyArray([ Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, ]); this.__max = _MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.fromCopyArray([ -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, ]); this.__centerPoint = _MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); this.__lengthCenterToCorner = 0; this.__isCenterPointDirty = false; this.__isLengthCenterToCornerDirty = false; this.__isVanilla = true; } /** * Clone this AABB. * @returns a cloned AABB. */ clone() { const instance = new AABB(); instance.__max = this.__max.clone(); instance.__min = this.__min.clone(); instance.__centerPoint = this.__centerPoint.clone(); instance.__lengthCenterToCorner = this.__lengthCenterToCorner; instance.__isCenterPointDirty = this.__isCenterPointDirty; instance.__isLengthCenterToCornerDirty = this.__isLengthCenterToCornerDirty; instance.__isVanilla = this.__isVanilla; return instance; } /** * Copy inner components from another AABB. * @param aabb * @returns this */ copyComponents(aabb) { this.__max.copyComponents(aabb.__max); this.__min.copyComponents(aabb.__min); this.__centerPoint.copyComponents(aabb.__centerPoint); this.__lengthCenterToCorner = aabb.__lengthCenterToCorner; this.__isCenterPointDirty = aabb.__isCenterPointDirty; this.__isLengthCenterToCornerDirty = aabb.__isLengthCenterToCornerDirty; this.__isVanilla = false; return this; } /** * initialize this AABB. */ initialize() { this.__min.setComponents(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); this.__max.setComponents(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); this.__centerPoint.zero(); this.__lengthCenterToCorner = 0; this.__isCenterPointDirty = false; this.__isLengthCenterToCornerDirty = false; this.__isVanilla = true; } set minPoint(val) { this.__min.copyComponents(val); this.__isCenterPointDirty = true; this.__isLengthCenterToCornerDirty = true; this.__isVanilla = false; } get minPoint() { return this.__min; } set maxPoint(val) { this.__max.copyComponents(val); this.__isCenterPointDirty = true; this.__isLengthCenterToCornerDirty = true; this.__isVanilla = false; } get maxPoint() { return this.__max; } /** * return whether this AABB is vanilla (not initialized) or not. * @returns true if this AABB is vanilla. */ isVanilla() { return this.__isVanilla; } /** * add a position for updating AABB. * @param positionVector * @returns given positionVector. */ addPosition(positionVector) { this.__min.x = positionVector.x < this.__min.x ? positionVector.x : this.__min.x; this.__min.y = positionVector.y < this.__min.y ? positionVector.y : this.__min.y; this.__min.z = positionVector.z < this.__min.z ? positionVector.z : this.__min.z; this.__max.x = this.__max.x < positionVector.x ? positionVector.x : this.__max.x; this.__max.y = this.__max.y < positionVector.y ? positionVector.y : this.__max.y; this.__max.z = this.__max.z < positionVector.z ? positionVector.z : this.__max.z; this.__isCenterPointDirty = true; this.__isLengthCenterToCornerDirty = true; this.__isVanilla = false; return positionVector; } /** * add a position for updating AABB. * @param array a position array. * @param index index of the position array to adding. * @returns given array. */ addPositionWithArray(array, index) { this.__min.x = array[index + 0] < this.__min.x ? array[index + 0] : this.__min.x; this.__min.y = array[index + 1] < this.__min.y ? array[index + 1] : this.__min.y; this.__min.z = array[index + 2] < this.__min.z ? array[index + 2] : this.__min.z; this.__max.x = this.__max.x < array[index + 0] ? array[index + 0] : this.__max.x; this.__max.y = this.__max.y < array[index + 1] ? array[index + 1] : this.__max.y; this.__max.z = this.__max.z < array[index + 2] ? array[index + 2] : this.__max.z; this.__isCenterPointDirty = true; this.__isLengthCenterToCornerDirty = true; this.__isVanilla = false; return array; } /** * merge with another AABB. * @param aabb another AABB to merge * @returns merge succeeded or not. */ mergeAABB(aabb) { if (aabb.isVanilla()) { return false; // can't merge with vanilla AABB. } this.__isCenterPointDirty = true; this.__isLengthCenterToCornerDirty = true; if (this.isVanilla()) { this.__min.copyComponents(aabb.minPoint); this.__max.copyComponents(aabb.maxPoint); this.__isVanilla = false; return true; } if (aabb.minPoint.x < this.__min.x) { this.__min.x = aabb.minPoint.x; } if (aabb.minPoint.y < this.__min.y) { this.__min.y = aabb.minPoint.y; } if (aabb.minPoint.z < this.__min.z) { this.__min.z = aabb.minPoint.z; } if (this.__max.x < aabb.maxPoint.x) { this.__max.x = aabb.maxPoint.x; } if (this.__max.y < aabb.maxPoint.y) { this.__max.y = aabb.maxPoint.y; } if (this.__max.z < aabb.maxPoint.z) { this.__max.z = aabb.maxPoint.z; } return true; } /** * the center of this AABB. */ get centerPoint() { if (this.__isCenterPointDirty) { _MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.addTo(this.__min, this.__max, this.__centerPoint).divide(2); this.__isCenterPointDirty = false; } return this.__centerPoint; } /** * the length from center to corner of this AABB. */ get lengthCenterToCorner() { if (this.__isLengthCenterToCornerDirty) { this.__lengthCenterToCorner = _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.lengthBtw(this.centerPoint, this.maxPoint); this.__isLengthCenterToCornerDirty = false; } return this.__lengthCenterToCorner; } /** * the length from min x to max x of this AABB. */ get sizeX() { return this.__max.x - this.__min.x; } /** * the length from min y to max y of this AABB. */ get sizeY() { return this.__max.y - this.__min.y; } /** * the length from min z to max z of this AABB. */ get sizeZ() { return this.__max.z - this.__min.z; } /** * multiply this AABB with a given matrix. * @param matrix a matrix to convert aabb. * @param aabb given AABB to convert. * @param outAabb converted AABB by given matrix. * @returns converted AABB. */ static multiplyMatrixTo(matrix, aabb, outAabb) { if (aabb.isVanilla()) { return outAabb.copyComponents(aabb); } outAabb.initialize(); AABB.__tmpVector3.x = aabb.__min.x; AABB.__tmpVector3.y = aabb.__min.y; AABB.__tmpVector3.z = aabb.__min.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__max.x; AABB.__tmpVector3.y = aabb.__min.y; AABB.__tmpVector3.z = aabb.__min.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__min.x; AABB.__tmpVector3.y = aabb.__max.y; AABB.__tmpVector3.z = aabb.__min.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__min.x; AABB.__tmpVector3.y = aabb.__min.y; AABB.__tmpVector3.z = aabb.__max.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__min.x; AABB.__tmpVector3.y = aabb.__max.y; AABB.__tmpVector3.z = aabb.__max.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__max.x; AABB.__tmpVector3.y = aabb.__min.y; AABB.__tmpVector3.z = aabb.__max.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__max.x; AABB.__tmpVector3.y = aabb.__max.y; AABB.__tmpVector3.z = aabb.__min.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); AABB.__tmpVector3.x = aabb.__max.x; AABB.__tmpVector3.y = aabb.__max.y; AABB.__tmpVector3.z = aabb.__max.z; matrix.multiplyVector3To(AABB.__tmpVector3, AABB.__tmpVector3); outAabb.addPosition(AABB.__tmpVector3); return outAabb; } /** * toString method. */ toString() { return ('AABB_min: ' + this.__min + '\n' + 'AABB_max: ' + this.__max + '\n' + 'centerPoint: ' + this.__centerPoint + '\n' + 'lengthCenterToCorner: ' + this.__lengthCenterToCorner); } /** * toString method (the numbers are Approximate) */ toStringApproximately() { return ('AABB_max: ' + this.__max.toStringApproximately() + '\n' + 'AABB_min: ' + this.__min.toStringApproximately() + '\n' + 'centerPoint: ' + this.centerPoint.toStringApproximately() + '\n' + 'lengthCenterToCorner: ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this.lengthCenterToCorner)); } } AABB.__tmpVector3 = _MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/math/AbstractMathNumber.ts": /*!***************************************************!*\ !*** ./src/foundation/math/AbstractMathNumber.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractArrayBufferBaseMathNumber: () => (/* binding */ AbstractArrayBufferBaseMathNumber) /* harmony export */ }); class AbstractArrayBufferBaseMathNumber { constructor() { this._v = new Float32Array(); } isTheSourceSame(arrayBuffer) { return this._v.buffer === arrayBuffer; } } /***/ }), /***/ "./src/foundation/math/AbstractMatrix.ts": /*!***********************************************!*\ !*** ./src/foundation/math/AbstractMatrix.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractMatrix: () => (/* binding */ AbstractMatrix) /* harmony export */ }); /** * the Abstract base class of Matrix classes */ class AbstractMatrix { constructor() { this._v = new Float32Array(); } at(row_i, column_i) { throw new Error('Method not implemented.'); } toString() { throw new Error('Method not implemented.'); } toStringApproximately() { throw new Error('Method not implemented.'); } flattenAsArray() { throw new Error('Method not implemented.'); } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } v(i) { return this._v[i]; } determinant() { throw new Error('Method not implemented.'); } get className() { return this.constructor.name; } get isIdentityMatrixClass() { return false; } isTheSourceSame(arrayBuffer) { return this._v.buffer === arrayBuffer; } } /***/ }), /***/ "./src/foundation/math/AbstractQuaternion.ts": /*!***************************************************!*\ !*** ./src/foundation/math/AbstractQuaternion.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractQuaternion: () => (/* binding */ AbstractQuaternion) /* harmony export */ }); class AbstractQuaternion { constructor() { this._v = new Float32Array(); } get className() { return this.constructor.name; } get x() { return this._v[0]; } get y() { return this._v[1]; } get z() { return this._v[2]; } get w() { return this._v[3]; } at(i) { return this._v[i]; } length() { return Math.hypot(this._v[0], this._v[1], this._v[2], this._v[3]); } lengthSquared() { return this._v[0] ** 2 + this._v[1] ** 2 + this._v[2] ** 2 + this._v[3] ** 2; } toString() { throw new Error('Method not implemented.'); } toStringApproximately() { throw new Error('Method not implemented.'); } flattenAsArray() { throw new Error('Method not implemented.'); } isDummy() { throw new Error('Method not implemented.'); } isEqual(vec, delta) { throw new Error('Method not implemented.'); } isStrictEqual(vec) { throw new Error('Method not implemented.'); } toEulerAnglesTo(out) { throw new Error('Method not implemented.'); } toEulerAngles() { throw new Error('Method not implemented.'); } transformVector3(vec) { throw new Error('Method not implemented.'); } transformVector3To(vec, out) { throw new Error('Method not implemented.'); } transformVector3Inverse(vec) { throw new Error('Method not implemented.'); } /** * dot product */ dot(quat) { return (this._v[0] * quat._v[0] + this._v[1] * quat._v[1] + this._v[2] * quat._v[2] + this._v[3] * quat._v[3]); } clone() { throw new Error('Method not implemented.'); } } /***/ }), /***/ "./src/foundation/math/AbstractVector.ts": /*!***********************************************!*\ !*** ./src/foundation/math/AbstractVector.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractVector: () => (/* binding */ AbstractVector) /* harmony export */ }); /** * the Abstract base class of Vector classes */ class AbstractVector { constructor() { this._v = new Float32Array(); } get x() { return this._v[0]; } get glslStrAsFloat() { throw new Error('Method not implemented.'); } get glslStrAsInt() { throw new Error('Method not implemented.'); } isEqual(vec, delta) { throw new Error('Method not implemented.'); } isStrictEqual(vec) { throw new Error('Method not implemented.'); } length() { throw new Error('Method not implemented.'); } lengthSquared() { throw new Error('Method not implemented.'); } lengthTo(vec) { throw new Error('Method not implemented.'); } dot(vec) { throw new Error('Method not implemented.'); } at(i) { return this._v[i]; } toString() { throw new Error('Method not implemented.'); } toStringApproximately() { throw new Error('Method not implemented.'); } flattenAsArray() { throw new Error('Method not implemented.'); } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } v(i) { return this._v[i]; } isTheSourceSame(arrayBuffer) { return this._v.buffer === arrayBuffer; } get className() { return this.constructor.name; } get bytesPerComponent() { throw new Error('Method not implemented.'); } } /***/ }), /***/ "./src/foundation/math/ColorRgb.ts": /*!*****************************************!*\ !*** ./src/foundation/math/ColorRgb.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ColorRgb: () => (/* binding */ ColorRgb) /* harmony export */ }); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /** * A RGB color. */ class ColorRgb extends _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3 { constructor(r) { super(r); } get x() { return this._v[0]; } get y() { return this._v[1]; } get z() { return this._v[2]; } get w() { return 1; } get r() { return this._v[0]; } get g() { return this._v[1]; } get b() { return this._v[2]; } get a() { return 1; } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } static cross(l_vec, r_vec) { return super._cross(l_vec, r_vec, Float32Array); } clone() { return super.clone(); } } /***/ }), /***/ "./src/foundation/math/ColorRgba.ts": /*!******************************************!*\ !*** ./src/foundation/math/ColorRgba.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ColorRgba: () => (/* binding */ ColorRgba), /* harmony export */ ConstRgbaBlack: () => (/* binding */ ConstRgbaBlack), /* harmony export */ ConstRgbaWhite: () => (/* binding */ ConstRgbaWhite) /* harmony export */ }); /* harmony import */ var _Vector4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector4 */ "./src/foundation/math/Vector4.ts"); /** * A RGBA color. */ class ColorRgba extends _Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4 { constructor(r) { super(r); } get x() { return this._v[0]; } get y() { return this._v[1]; } get z() { return this._v[2]; } get w() { return this._v[3]; } get r() { return this._v[0]; } get g() { return this._v[1]; } get b() { return this._v[2]; } get a() { return this._v[3]; } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } clone() { return super.clone(); } static fromCopyArray(array) { return this._fromCopyArray(array, Float32Array); } static fromCopyArray4(array) { return this._fromCopyArray4(array, Float32Array); } static fromCopy4(x, y, z, w) { return this._fromCopy4(x, y, z, w, Float32Array); } static fromCopyVector4(vec4) { return this._fromCopyVector4(vec4, Float32Array); } } const ConstRgbaWhite = new ColorRgba(new Float32Array([1, 1, 1, 1])); const ConstRgbaBlack = new ColorRgba(new Float32Array([0, 0, 0, 1])); /***/ }), /***/ "./src/foundation/math/IColor.ts": /*!***************************************!*\ !*** ./src/foundation/math/IColor.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/math/IMathNumber.ts": /*!********************************************!*\ !*** ./src/foundation/math/IMathNumber.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/math/IMatrix.ts": /*!****************************************!*\ !*** ./src/foundation/math/IMatrix.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/math/IQuaternion.ts": /*!********************************************!*\ !*** ./src/foundation/math/IQuaternion.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/math/IVector.ts": /*!****************************************!*\ !*** ./src/foundation/math/IVector.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/math/IdentityMatrix33.ts": /*!*************************************************!*\ !*** ./src/foundation/math/IdentityMatrix33.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ IdentityMatrix33: () => (/* binding */ IdentityMatrix33) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _AbstractMatrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbstractMatrix */ "./src/foundation/math/AbstractMatrix.ts"); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* eslint-disable prettier/prettier */ class IdentityMatrix33 extends _AbstractMatrix__WEBPACK_IMPORTED_MODULE_1__.AbstractMatrix { constructor() { super(); this._v = IdentityMatrix33.__v; } toString() { return `1 0 0 0 1 0 0 0 1 `; } toStringApproximately() { return this.toString(); } flattenAsArray() { return [1, 0, 0, 0, 1, 0, 0, 0, 1]; } isDummy() { return false; } isEqual(mat, delta = Number.EPSILON) { if (Math.abs(mat.m00 - 1) < delta && Math.abs(mat.m10) < delta && Math.abs(mat.m20) < delta && Math.abs(mat.m01) < delta && Math.abs(mat.m11 - 1) < delta && Math.abs(mat.m21) < delta && Math.abs(mat.m02) < delta && Math.abs(mat.m12) < delta && Math.abs(mat.m22 - 1) < delta) { return true; } else { return false; } } isStrictEqual(mat) { const v = mat._v; if (v[0] === 1 && v[1] === 0 && v[2] === 0 && v[3] === 0 && v[4] === 0 && v[5] === 0 && v[6] === 0 && v[7] === 0 && v[8] === 0 && v[9] === 0 && v[10] === 0 && v[11] === 0 && v[12] === 0 && v[13] === 0 && v[14] === 0 && v[15] === 0) { return true; } else { return false; } } at(row_i, column_i) { return row_i === column_i ? 1 : 0; } determinant() { return 1; } multiplyVector(vec) { return vec; } multiplyVectorTo(vec, outVec) { const v = vec._v; outVec._v[0] = v[0]; outVec._v[1] = v[1]; outVec._v[2] = v[2]; outVec._v[3] = v[3]; return outVec; } getScale() { return _Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([1, 1, 1]); } getScaleTo(outVec) { const v = outVec._v; v[0] = 1; v[1] = 1; v[2] = 1; return outVec; } clone() { return new IdentityMatrix33(); } getRotate() { return new IdentityMatrix33(); } get m00() { return 1; } get m10() { return 0; } get m20() { return 0; } get m30() { return 0; } get m01() { return 0; } get m11() { return 1; } get m21() { return 0; } get m31() { return 0; } get m02() { return 0; } get m12() { return 0; } get m22() { return 1; } get m32() { return 0; } get m03() { return 0; } get m13() { return 0; } get m23() { return 0; } get m33() { return 1; } get className() { return 'IdentityMatrix33'; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3; } get isIdentityMatrixClass() { return true; } } IdentityMatrix33.__v = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); /***/ }), /***/ "./src/foundation/math/IdentityMatrix44.ts": /*!*************************************************!*\ !*** ./src/foundation/math/IdentityMatrix44.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ IdentityMatrix44: () => (/* binding */ IdentityMatrix44) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _AbstractMatrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbstractMatrix */ "./src/foundation/math/AbstractMatrix.ts"); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* eslint-disable prettier/prettier */ class IdentityMatrix44 extends _AbstractMatrix__WEBPACK_IMPORTED_MODULE_1__.AbstractMatrix { constructor() { super(); this._v = IdentityMatrix44.__v; } toString() { return `1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 `; } toStringApproximately() { return this.toString(); } flattenAsArray() { return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; } isDummy() { return false; } isEqual(mat, delta = Number.EPSILON) { if (Math.abs(mat.m00 - 1) < delta && Math.abs(mat.m10) < delta && Math.abs(mat.m20) < delta && Math.abs(mat.m30) < delta && Math.abs(mat.m01) < delta && Math.abs(mat.m11 - 1) < delta && Math.abs(mat.m21) < delta && Math.abs(mat.m31) < delta && Math.abs(mat.m02) < delta && Math.abs(mat.m12) < delta && Math.abs(mat.m22 - 1) < delta && Math.abs(mat.m32) < delta && Math.abs(mat.m03) < delta && Math.abs(mat.m13) < delta && Math.abs(mat.m23) < delta && Math.abs(mat.m33 - 1) < delta) { return true; } else { return false; } } isStrictEqual(mat) { const v = mat._v; if (v[0] === 1 && v[1] === 0 && v[2] === 0 && v[3] === 0 && v[4] === 0 && v[5] === 1 && v[6] === 0 && v[7] === 0 && v[8] === 0 && v[9] === 0 && v[10] === 1 && v[11] === 0 && v[12] === 0 && v[13] === 0 && v[14] === 0 && v[15] === 1) { return true; } else { return false; } } at(row_i, column_i) { return row_i === column_i ? 1 : 0; } v(i) { return i % 5 === 0 ? 1 : 0; } determinant() { return 1; } multiplyVector(vec) { return vec; } multiplyVector3(vec) { return vec; } multiplyVectorTo(vec, outVec) { const v = vec._v; outVec._v[0] = v[0]; outVec._v[1] = v[1]; outVec._v[2] = v[2]; outVec._v[3] = v[3]; return outVec; } getScale() { return _Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.one(); } getScaleTo(outVec) { const v = outVec._v; v[0] = 1; v[1] = 1; v[2] = 1; return outVec; } clone() { return new IdentityMatrix44(); } getRotate() { return new IdentityMatrix44(); } getTranslate() { return _Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.zero(); } get m00() { return 1; } get m10() { return 0; } get m20() { return 0; } get m30() { return 0; } get m01() { return 0; } get m11() { return 1; } get m21() { return 0; } get m31() { return 0; } get m02() { return 0; } get m12() { return 0; } get m22() { return 1; } get m32() { return 0; } get m03() { return 0; } get m13() { return 0; } get m23() { return 0; } get m33() { return 1; } get translateX() { return 0; } get translateY() { return 0; } get translateZ() { return 0; } get className() { return 'IdentityMatrix44'; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4; } get isIdentityMatrixClass() { return true; } } IdentityMatrix44.__v = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); /***/ }), /***/ "./src/foundation/math/LogQuaternion.ts": /*!**********************************************!*\ !*** ./src/foundation/math/LogQuaternion.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LogQuaternion: () => (/* binding */ LogQuaternion) /* harmony export */ }); /* harmony import */ var _Quaternion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Quaternion */ "./src/foundation/math/Quaternion.ts"); class LogQuaternion { constructor(x) { this._v = x; } get x() { return this._v[0]; } get y() { return this._v[1]; } get z() { return this._v[2]; } get w() { return 1; } static fromFloat32Array(array) { return new LogQuaternion(array); } static fromCopyArray3(array) { return new _Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion(new Float32Array(array)); } static fromCopyArray(array) { return new _Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion(new Float32Array(array.slice(0, 3))); } static fromCopy3(x, y, z) { return new _Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion(new Float32Array([x, y, z])); } static fromCopyLogQuaternion(quat) { const v = new Float32Array(3); v[0] = quat._v[0]; v[1] = quat._v[1]; v[2] = quat._v[2]; return new _Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion(v); } static fromCopyVector4(vec) { const v = new Float32Array(3); v[0] = vec._v[0]; v[1] = vec._v[1]; v[2] = vec._v[2]; return new _Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion(v); } static fromCopyQuaternion(x) { const theta = Math.acos(x.w); const sin = Math.sin(theta); const v = new Float32Array(3); v[0] = x.x * (theta / sin); v[1] = x.y * (theta / sin); v[2] = x.z * (theta / sin); return new LogQuaternion(v); } get className() { return 'LogQuaternion'; } } /***/ }), /***/ "./src/foundation/math/MathClassUtil.ts": /*!**********************************************!*\ !*** ./src/foundation/math/MathClassUtil.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MathClassUtil: () => (/* binding */ MathClassUtil) /* harmony export */ }); /* harmony import */ var _Vector2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _Vector4__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _Quaternion__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _Matrix33__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Matrix33 */ "./src/foundation/math/Matrix33.ts"); /* harmony import */ var _Matrix44__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _MutableVector4__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _MutableVector3__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _MutableVector2__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _Scalar__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _MutableQuaternion__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _MutableScalar__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./MutableScalar */ "./src/foundation/math/MutableScalar.ts"); /* harmony import */ var _VectorN__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./VectorN */ "./src/foundation/math/VectorN.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class MathClassUtil { constructor() { } static arrayToVector(element) { if (Array.isArray(element)) { if (typeof element[3] !== 'undefined') { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray([element[0], element[1], element[2], element[3]]); } else if (typeof element[2] !== 'undefined') { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([element[0], element[1], element[2]]); } else { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.fromCopyArray2([element[0], element[1]]); } } else { return element; } } static arrayToVectorOrMatrix(element) { if (Array.isArray(element)) { if (typeof element[15] !== 'undefined') { return _Matrix44__WEBPACK_IMPORTED_MODULE_5__.Matrix44.fromCopyArrayRowMajor(element); } else if (typeof element[8] !== 'undefined') { return _Matrix33__WEBPACK_IMPORTED_MODULE_4__.Matrix33.fromCopyArrayRowMajor(element); } else if (typeof element[3] !== 'undefined') { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray([element[0], element[1], element[2], element[3]]); } else if (typeof element[2] !== 'undefined') { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([element[0], element[1], element[2]]); } else { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.fromCopyArray2([element[0], element[1]]); } } else { return element; } } static getImmutableValueClass(compositionType) { if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec2) { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3) { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec4) { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Mat3) { return _Matrix33__WEBPACK_IMPORTED_MODULE_4__.Matrix33; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Mat4) { return _Matrix44__WEBPACK_IMPORTED_MODULE_5__.Matrix44; } return void 0; } static getMutableValueClass(compositionType) { if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec2) { return _MutableVector2__WEBPACK_IMPORTED_MODULE_11__.MutableVector2; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec3) { return _MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Vec4) { return _MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Mat3) { return _MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33; } else if (compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_6__.CompositionType.Mat4) { return _MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44; } else { return void 0; } } static cloneOfMathObjects(element) { if (element instanceof _Matrix44__WEBPACK_IMPORTED_MODULE_5__.Matrix44) { return element.clone(); } else if (element instanceof _Matrix33__WEBPACK_IMPORTED_MODULE_4__.Matrix33) { return element.clone(); } else if (element instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { return element.clone(); } else if (element instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return element.clone(); } else if (element instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return element.clone(); } else { return element; } } static isAcceptableArrayForQuaternion(element) { if (Array.isArray(element)) { if (typeof element[3] !== 'undefined') { return true; } } return false; } static arrayToQuaternion(element) { return _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.fromCopy4(element[0], element[1], element[2], element[3]); } static makeSubArray(array, componentN) { if (componentN === 4) { return [array[0], array[1], array[2], array[3]]; } else if (componentN === 3) { return [array[0], array[1], array[2]]; } else if (componentN === 2) { return [array[0], array[1]]; } else { return array[0]; } } static vectorToArray(element) { if (element instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return [element.x, element.y]; } else if (element instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return [element.x, element.y, element.z]; } else if (element instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4 || element instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return [element.x, element.y, element.z, element.w]; } else { return element; } } /** * discriminate which Vector instance * @param element any Vector instance * @return number of Vector instance */ static componentNumberOfVector(element) { if (element instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return 2; } else if (element instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return 3; } else if (element instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4 || element instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return 4; } else if (Array.isArray(element)) { return element.length; } else { return 0; } } // values range must be [-1, 1] static packNormalizedVec4ToVec2(x, y, z, w, criteria) { let v0 = 0.0; let v1 = 0.0; x = (x + 1) / 2.0; y = (y + 1) / 2.0; z = (z + 1) / 2.0; w = (w + 1) / 2.0; const ir = Math.floor(x * (criteria - 1.0)); const ig = Math.floor(y * (criteria - 1.0)); const irg = ir * criteria + ig; v0 = irg / criteria; const ib = Math.floor(z * (criteria - 1.0)); const ia = Math.floor(w * (criteria - 1.0)); const iba = ib * criteria + ia; v1 = iba / criteria; return [v0, v1]; } static unProjectTo(windowPosX, windowPosY, windowPosZ, inversePVMat44, viewportVec4, out) { const input = this.__tmpVector4_0.setComponents(((windowPosX - viewportVec4.x) / viewportVec4.z) * 2 - 1.0, ((windowPosY - viewportVec4.y) / viewportVec4.w) * 2 - 1.0, 2 * windowPosZ - 1.0, 1.0); const outNonNormalized = inversePVMat44.multiplyVectorTo(input, this.__tmpVector4_1); if (outNonNormalized.w === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('0 division occurred!'); } return _MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.multiplyTo(outNonNormalized, 1.0 / outNonNormalized.w, out); } static add(lhs, rhs) { if (isFinite(lhs)) { // number? return lhs + rhs; } else if (lhs instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.add(lhs, rhs); } else if (lhs instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.add(lhs, rhs); } else if (lhs instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.add(lhs, rhs); } else if (lhs instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.add(lhs, rhs); } else if (Array.isArray(lhs)) { const arr = []; for (let i = 0; i < lhs.length; i++) { arr[i] = lhs[i] + rhs[i]; } return arr; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Non supported type!'); return; } } static subtract(lhs, rhs) { if (isFinite(lhs)) { // number? return lhs - rhs; } else if (lhs instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.subtract(lhs, rhs); } else if (lhs instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.subtract(lhs, rhs); } else if (lhs instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.subtract(lhs, rhs); } else if (lhs instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.subtract(lhs, rhs); } else if (Array.isArray(lhs)) { const arr = []; for (let i = 0; i < lhs.length; i++) { arr[i] = lhs[i] - rhs[i]; } return arr; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Non supported type!'); return; } } static multiplyNumber(lhs, rhs) { if (isFinite(lhs)) { // number? return lhs * rhs; } else if (lhs instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.multiply(lhs, rhs); } else if (lhs instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.multiply(lhs, rhs); } else if (lhs instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.multiply(lhs, rhs); } else if (lhs instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.multiplyNumber(lhs, rhs); } else if (Array.isArray(lhs)) { const arr = []; for (let i = 0; i < lhs.length; i++) { arr[i] = lhs[i] * rhs; } return arr; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Non supported type!'); return; } } static divideNumber(lhs, rhs) { if (isFinite(lhs)) { // number? return lhs / rhs; } else if (lhs instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.multiply(lhs, 1 / rhs); } else if (lhs instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.multiply(lhs, 1 / rhs); } else if (lhs instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.multiply(lhs, 1 / rhs); } else if (lhs instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.multiplyNumber(lhs, 1 / rhs); } else if (Array.isArray(lhs)) { const arr = []; for (let i = 0; i < lhs.length; i++) { arr[i] = lhs[i] / rhs; } return arr; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Non supported type!'); return; } } static initWithScalar(objForDetectType, val) { if (isFinite(objForDetectType)) { // number? return val; } else if (objForDetectType instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { return _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2.fromCopyArray2([val, val]); } else if (objForDetectType instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { return _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([val, val, val]); } else if (objForDetectType instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { return _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray([val, val, val, val]); } else if (objForDetectType instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { return _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion.fromCopy4(0, 0, 0, 1); } else if (Array.isArray(objForDetectType)) { const arr = []; for (let i = 0; i < objForDetectType.length; i++) { arr[i] = val; } return arr; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Non supported type!'); return void 0; } } static initWithFloat32Array(objForDetectType, val, floatArray, compositionType) { let obj; if (isFinite(objForDetectType)) { // number? const array = new Float32Array(floatArray); floatArray._v = void 0; array[0] = val; return new _Scalar__WEBPACK_IMPORTED_MODULE_12__.Scalar(array); } else if (objForDetectType instanceof _Scalar__WEBPACK_IMPORTED_MODULE_12__.Scalar || objForDetectType instanceof _MutableScalar__WEBPACK_IMPORTED_MODULE_14__.MutableScalar) { floatArray[0] = val.x; obj = new _MutableScalar__WEBPACK_IMPORTED_MODULE_14__.MutableScalar(floatArray); } else if (objForDetectType instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2 || objForDetectType instanceof _MutableVector2__WEBPACK_IMPORTED_MODULE_11__.MutableVector2) { floatArray[0] = val.x; floatArray[1] = val.y; obj = new _MutableVector2__WEBPACK_IMPORTED_MODULE_11__.MutableVector2(floatArray); } else if (objForDetectType instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3 || objForDetectType instanceof _MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3) { floatArray[0] = val.x; floatArray[1] = val.y; floatArray[2] = val.z; obj = _MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3.fromFloat32Array(floatArray); } else if (objForDetectType instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4 || objForDetectType instanceof _MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4) { floatArray[0] = val.x; floatArray[1] = val.y; floatArray[2] = val.z; floatArray[3] = val.w; obj = new _MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4(floatArray); } else if (objForDetectType instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion || objForDetectType instanceof _MutableQuaternion__WEBPACK_IMPORTED_MODULE_13__.MutableQuaternion) { floatArray[0] = val.x; floatArray[1] = val.y; floatArray[2] = val.z; floatArray[3] = val.w; obj = new _MutableQuaternion__WEBPACK_IMPORTED_MODULE_13__.MutableQuaternion(floatArray); } else if (objForDetectType instanceof _Matrix33__WEBPACK_IMPORTED_MODULE_4__.Matrix33 || objForDetectType instanceof _MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33) { obj = obj == null ? new _MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33(floatArray) : obj; obj.m00 = val.m00; obj.m01 = val.m01; obj.m02 = val.m02; obj.m10 = val.m10; obj.m11 = val.m11; obj.m12 = val.m12; obj.m20 = val.m20; obj.m21 = val.m21; obj.m22 = val.m22; } else if (objForDetectType instanceof _Matrix44__WEBPACK_IMPORTED_MODULE_5__.Matrix44 || objForDetectType instanceof _MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44) { obj = new _MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44(floatArray); obj.m00 = val.m00; obj.m01 = val.m01; obj.m02 = val.m02; obj.m03 = val.m03; obj.m10 = val.m10; obj.m11 = val.m11; obj.m12 = val.m12; obj.m13 = val.m13; obj.m20 = val.m20; obj.m21 = val.m21; obj.m22 = val.m22; obj.m23 = val.m23; obj.m30 = val.m30; obj.m31 = val.m31; obj.m32 = val.m32; obj.m33 = val.m33; } else if (objForDetectType instanceof _VectorN__WEBPACK_IMPORTED_MODULE_15__.VectorN) { for (let i = 0; i < val._v.length; i++) { floatArray[i] = val._v[i]; } obj = new _VectorN__WEBPACK_IMPORTED_MODULE_15__.VectorN(floatArray); } else if (objForDetectType == null) { let vec; switch (floatArray.length) { case 4: vec = _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyFloat32Array(floatArray); break; case 3: vec = _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyFloat32Array(floatArray); break; case 2: vec = new _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2(floatArray); break; case 1: vec = new _Scalar__WEBPACK_IMPORTED_MODULE_12__.Scalar(floatArray); break; } floatArray._v = void 0; return vec; } else if (Array.isArray(objForDetectType) || ArrayBuffer.isView(objForDetectType) || ArrayBuffer.isView(objForDetectType._v)) { return objForDetectType; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.error('Non supported type!'); return void 0; } floatArray._v = void 0; return obj; } static _setForce(objForDetectType, val) { if (objForDetectType instanceof _MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4 || objForDetectType instanceof _Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4) { if (objForDetectType.isEqual(val)) { return false; } objForDetectType._v[0] = val._v[0]; objForDetectType._v[1] = val._v[1]; objForDetectType._v[2] = val._v[2]; objForDetectType._v[3] = val._v[3]; } else if (objForDetectType instanceof _MutableVector2__WEBPACK_IMPORTED_MODULE_11__.MutableVector2 || objForDetectType instanceof _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2) { if (objForDetectType.isEqual(val)) { return false; } objForDetectType._v[0] = val._v[0]; objForDetectType._v[1] = val._v[1]; } else if (objForDetectType instanceof _MutableVector3__WEBPACK_IMPORTED_MODULE_10__.MutableVector3 || objForDetectType instanceof _Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3) { if (objForDetectType.isEqual(val)) { return false; } objForDetectType._v[0] = val._v[0]; objForDetectType._v[1] = val._v[1]; objForDetectType._v[2] = val._v[2]; } else if (objForDetectType instanceof _MutableScalar__WEBPACK_IMPORTED_MODULE_14__.MutableScalar || objForDetectType instanceof _Scalar__WEBPACK_IMPORTED_MODULE_12__.Scalar) { if (typeof val._v === 'undefined') { if (objForDetectType._v[0] == val) { return false; } objForDetectType._v[0] = val; } else { if (objForDetectType._v[0] == val._v[0]) { return false; } objForDetectType._v[0] = val._v[0]; } } else if (objForDetectType instanceof _MutableMatrix33__WEBPACK_IMPORTED_MODULE_8__.MutableMatrix33 || objForDetectType instanceof _Matrix33__WEBPACK_IMPORTED_MODULE_4__.Matrix33) { if (objForDetectType.isEqual(val)) { return false; } objForDetectType._v[0] = val._v[0]; objForDetectType._v[1] = val._v[1]; objForDetectType._v[2] = val._v[2]; objForDetectType._v[3] = val._v[3]; objForDetectType._v[4] = val._v[4]; objForDetectType._v[5] = val._v[5]; objForDetectType._v[6] = val._v[6]; objForDetectType._v[7] = val._v[7]; objForDetectType._v[8] = val._v[8]; } else if (objForDetectType instanceof _MutableMatrix44__WEBPACK_IMPORTED_MODULE_7__.MutableMatrix44 || objForDetectType instanceof _Matrix44__WEBPACK_IMPORTED_MODULE_5__.Matrix44) { if (objForDetectType.isEqual(val)) { return false; } objForDetectType._v[0] = val._v[0]; objForDetectType._v[1] = val._v[1]; objForDetectType._v[2] = val._v[2]; objForDetectType._v[3] = val._v[3]; objForDetectType._v[4] = val._v[4]; objForDetectType._v[5] = val._v[5]; objForDetectType._v[6] = val._v[6]; objForDetectType._v[7] = val._v[7]; objForDetectType._v[8] = val._v[8]; objForDetectType._v[9] = val._v[9]; objForDetectType._v[10] = val._v[10]; objForDetectType._v[11] = val._v[11]; objForDetectType._v[12] = val._v[12]; objForDetectType._v[13] = val._v[13]; objForDetectType._v[14] = val._v[14]; objForDetectType._v[15] = val._v[15]; } else if (objForDetectType instanceof _MutableQuaternion__WEBPACK_IMPORTED_MODULE_13__.MutableQuaternion || objForDetectType instanceof _Quaternion__WEBPACK_IMPORTED_MODULE_3__.Quaternion) { if (objForDetectType.isEqual(val)) { return false; } objForDetectType._v[0] = val._v[0]; objForDetectType._v[1] = val._v[1]; objForDetectType._v[2] = val._v[2]; objForDetectType._v[3] = val._v[3]; } else if (objForDetectType instanceof _VectorN__WEBPACK_IMPORTED_MODULE_15__.VectorN) { let valArray; if (val instanceof _VectorN__WEBPACK_IMPORTED_MODULE_15__.VectorN) { valArray = val._v; } else { valArray = val; } let isSame = true; for (let i = 0; i < valArray.length; i++) { if (objForDetectType._v[i] !== valArray[i]) { isSame = false; break; } } if (isSame) { return false; } for (let i = 0; i < valArray.length; i++) { objForDetectType._v[i] = valArray[i]; } } else if (Array.isArray(objForDetectType)) { let isSame = true; for (let i = 0; i < objForDetectType.length; i++) { if (objForDetectType[i] !== val._v[i]) { isSame = false; break; } } if (isSame) { return false; } for (let i = 0; i < objForDetectType.length; i++) { objForDetectType[i] = val._v[i]; } } else if (!isNaN(objForDetectType._v.length)) { let isSame = true; for (let i = 0; i < objForDetectType._v.length; i++) { if (Array.isArray(val)) { if (objForDetectType._v[i] !== val[i]) { isSame = false; break; } } else { if (objForDetectType._v[i] !== val._v[i]) { isSame = false; break; } } } if (isSame) { return false; } for (let i = 0; i < objForDetectType._v.length; i++) { if (Array.isArray(val)) { objForDetectType._v[i] = val[i]; } else { objForDetectType._v[i] = val._v[i]; } } } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_16__.Logger.warn('Unknown type _setForce'); } return true; } } MathClassUtil.__tmpVector4_0 = _MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4.zero(); MathClassUtil.__tmpVector4_1 = _MutableVector4__WEBPACK_IMPORTED_MODULE_9__.MutableVector4.zero(); /***/ }), /***/ "./src/foundation/math/MathUtil.ts": /*!*****************************************!*\ !*** ./src/foundation/math/MathUtil.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MathUtil: () => (/* binding */ MathUtil) /* harmony export */ }); function radianToDegree(rad) { return (rad * 180) / Math.PI; } function degreeToRadian(deg) { return (deg * Math.PI) / 180; } // https://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410 const toHalfFloat = () => { /* This method is faster than the OpenEXR implementation (very often * used, eg. in Ogre), with the additional benefit of rounding, inspired * by James Tursa?s half-precision code. */ return function toHalf(val) { const floatView = new Float32Array(1); const int32View = new Int32Array(floatView.buffer); floatView[0] = val; const x = int32View[0]; let bits = (x >> 16) & 0x8000; /* Get the sign */ let m = (x >> 12) & 0x07ff; /* Keep one extra bit for rounding */ const e = (x >> 23) & 0xff; /* Using int is faster here */ /* If zero, or denormal, or exponent underflows too much for a denormal * half, return signed zero. */ if (e < 103) { return bits; } /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */ if (e > 142) { bits |= 0x7c00; /* If exponent was 0xff and one mantissa bit was set, it means NaN, * not Inf, so make sure we set one mantissa bit too. */ bits |= (e == 255 ? 0 : 1) && x & 0x007fffff; return bits; } /* If exponent underflows but not too much, return a denormal */ if (e < 113) { m |= 0x0800; /* Extra rounding may overflow and set mantissa to 0 and exponent * to 1, which is OK. */ bits |= (m >> (114 - e)) + ((m >> (113 - e)) & 1); return bits; } bits |= ((e - 112) << 10) | (m >> 1); /* Extra rounding. An overflow will set mantissa to 0 and increment * the exponent, which is OK. */ bits += m & 1; return bits; }; }; /** * check whether or not this texture size is power of two. * * @param x texture size. * @returns check whether or not the size x is power of two. */ function isPowerOfTwo(x) { return (x & (x - 1)) == 0; } function isPowerOfTwoTexture(width, height) { return isPowerOfTwo(width) && isPowerOfTwo(height); } // values range must be [-1, 1] function packNormalizedVec4ToVec2(x, y, z, w, criteria) { // range to [0, s1] x = (x + 1) / 2.0; y = (y + 1) / 2.0; z = (z + 1) / 2.0; w = (w + 1) / 2.0; const ir = Math.floor(x * (criteria - 1.0)); const ig = Math.floor(y * (criteria - 1.0)); const irg = ir * criteria + ig; const v0 = irg / criteria; const ib = Math.floor(z * (criteria - 1.0)); const ia = Math.floor(w * (criteria - 1.0)); const iba = ib * criteria + ia; const v1 = iba / criteria; return [v0, v1]; } function erf(x) { // Save the sign of x let sign = 1; if (x < 0) sign = -1; x = Math.abs(x); // A&S formula 7.1.26 const t = 1 / (1 + 0.3275911 * x); const y = 1 - ((((1.061405429 * t + -1.453152027) * t + 1.421413741) * t + -0.284496736) * t + 0.254829592) * t * Math.exp(-x * x); return sign * y; } function invErf(x) { let w, p = 0; w = -Math.log((1.0 - x) * (1.0 + x)); if (w < 5.0) { w = w - 2.5; p = 2.81022636e-8; p = 3.43273939e-7 + p * w; p = -3.5233877e-6 + p * w; p = -4.39150654e-6 + p * w; p = 0.00021858087 + p * w; p = -0.00125372503 + p * w; p = -0.00417768164 + p * w; p = 0.246640727 + p * w; p = 1.50140941 + p * w; } else { w = Math.sqrt(w) - 3; p = -0.000200214257; p = 0.000100950558 + p * w; p = 0.00134934322 + p * w; p = -0.00367342844 + p * w; p = 0.00573950773 + p * w; p = -0.0076224613 + p * w; p = 0.00943887047 + p * w; p = 1.00167406 + p * w; p = 2.83297682 + p * w; } return p * x; } function gaussianCdf(x, mu, sigma) { const U = 0.5 * (1 + erf((x - mu) / (sigma * Math.sqrt(2.0)))); return U; } function invGaussianCdf(U, mu, sigma) { const x = sigma * Math.sqrt(2.0) * invErf(2.0 * U - 1) + mu; return x; } function computeEigenValuesAndVectors(A, Q, w) { const n = 3; let sd = 0; let so = 0; // Sums of diagonal resp. off-diagonal elements let s = 0; let c = 0; let t = 0; // sin(phi), cos(phi), tan(phi) and temporary storage let g = 0; let h = 0; let z = 0; let theta = 0; // More temporary storage let thresh = 0; // Initialize Q to the identitity matrix for (let i = 0; i < n; i++) { Q.setAt(i, i, 1.0); for (let j = 0; j < i; j++) { Q.setAt(i, j, 0.0); Q.setAt(j, i, 0.0); } } // Initialize w to diag(A) for (let i = 0; i < n; i++) w.setAt(i, A.at(i, i)); // Calculate SQR(tr(A)) sd = 0.0; for (let i = 0; i < n; i++) sd += Math.abs(w.at(i)); sd = sd * sd; // Main iteration loop for (let nIter = 0; nIter < 50; nIter++) { // Test for convergence so = 0.0; for (let p = 0; p < n; p++) { for (let q = p + 1; q < n; q++) so += Math.abs(A.at(p, q)); } if (so == 0.0) return 0; if (nIter < 4) thresh = (0.2 * so) / (n * n); else thresh = 0.0; // Do sweep for (let p = 0; p < n; p++) { for (let q = p + 1; q < n; q++) { g = 100.0 * Math.abs(A.at(p, q)); if (nIter > 4 && Math.abs(w.at(p)) + g == Math.abs(w.at(p)) && Math.abs(w.at(q)) + g == Math.abs(w.at(q))) { A.setAt(p, q, 0.0); } else if (Math.abs(A.at(p, q)) > thresh) { // Calculate Jacobi transformation h = w.at(q) - w.at(p); if (Math.abs(h) + g == Math.abs(h)) { t = A.at(p, q) / h; } else { theta = (0.5 * h) / A.at(p, q); if (theta < 0.0) t = -1.0 / (Math.sqrt(1.0 + theta * theta) - theta); else t = 1.0 / (Math.sqrt(1.0 + theta * theta) + theta); } c = 1.0 / Math.sqrt(1.0 + t * t); s = t * c; z = t * A.at(p, q); // Apply Jacobi transformation A.setAt(p, q, 0.0); w.setAt(p, w.at(p) - z); w.setAt(q, w.at(q) + z); for (let r = 0; r < p; r++) { t = A.at(r, p); A.setAt(r, p, c * t - s * A.at(r, q)); A.setAt(r, q, s * t + c * A.at(r, q)); } for (let r = p + 1; r < q; r++) { t = A.at(p, r); A.setAt(p, r, c * t - s * A.at(r, q)); A.setAt(r, q, s * t + c * A.at(r, q)); } for (let r = q + 1; r < n; r++) { t = A.at(p, r); A.setAt(p, r, c * t - s * A.at(q, r)); A.setAt(q, r, s * t + c * A.at(q, r)); } // Update eigenvectors for (let r = 0; r < n; r++) { t = Q.at(r, p); Q.setAt(r, p, c * t - s * Q.at(r, q)); Q.setAt(r, q, s * t + c * Q.at(r, q)); } } } } } return -1; } function convertToStringAsGLSLFloat(value) { if (Number.isInteger(value)) { return `${value}.0`; } else { return '' + value; } } function nearZeroToZero(value) { if (Math.abs(value) < 0.00001) { value = 0; } else if (0.99999 < value && value < 1.00001) { value = 1; } else if (-1.00001 < value && value < -0.99999) { value = -1; } return value; } function financial(val) { const fixedStr = Number.parseFloat(val).toFixed(7); if (val >= 0) { return ' ' + fixedStr; } return fixedStr; } function roundAsFloat(value) { return Math.round(value * 10000000) / 10000000; } function lerp(a, b, t) { return a * (1 - t) + b * t; } /** * This function calculates the ratio of a discrete Gaussian distribution. * The sampling points are one away from each other. The sum of the ratios is 1. * @kernelSize number of sampling points * @variance variance of the Gaussian distribution * @mean mean of the Gaussian distribution * e.g. kernelSize = 2 (mean=0) => the sampling points are -0.5 and 0.5 * e.g. kernelSize = 3 (mean=1) => the sampling points are 0.0, 1.0 and 2.0 * @effectiveDigit effectiveDigit of values in return array * @returns array of the Gaussian distribution where the sum of the elements is 1 */ function computeGaussianDistributionRatioWhoseSumIsOne({ kernelSize, variance, mean = 0, effectiveDigit = 4, }) { const ceiledHalfKernelSize = Math.ceil(kernelSize / 2.0); const gaussianDistributionRatio = new Array(ceiledHalfKernelSize); let totalSize = 0; // above mean side and center for (let i = 0; i < ceiledHalfKernelSize; i++) { gaussianDistributionRatio[i] = Math.exp(-((i - mean) ** 2) / (2.0 * variance)); totalSize += gaussianDistributionRatio[i]; } // below mean side totalSize *= 2; // if a center exists if ((kernelSize / 2.0) % 2 !== 0.0) { totalSize -= gaussianDistributionRatio[0]; } const gaussianDistributionRatioWhoseSumIsOne = new Array(kernelSize); let totalRatio = 0; const changeDigitParam = Math.pow(10, effectiveDigit); for (let i = 0; i < ceiledHalfKernelSize - 1; i++) { let ratio = gaussianDistributionRatio[ceiledHalfKernelSize - 1 - i] / totalSize; ratio *= changeDigitParam; ratio = Math.round(ratio); ratio /= changeDigitParam; gaussianDistributionRatioWhoseSumIsOne[i] = ratio; gaussianDistributionRatioWhoseSumIsOne[kernelSize - 1 - i] = ratio; totalRatio += 2 * ratio; } if (kernelSize % 2 === 0) { const value = (1 - totalRatio) / 2.0; gaussianDistributionRatioWhoseSumIsOne[ceiledHalfKernelSize - 1] = value; gaussianDistributionRatioWhoseSumIsOne[ceiledHalfKernelSize] = value; } else { const value = 1 - totalRatio; gaussianDistributionRatioWhoseSumIsOne[ceiledHalfKernelSize - 1] = value; } return gaussianDistributionRatioWhoseSumIsOne; } const MathUtil = Object.freeze({ radianToDegree, degreeToRadian, toHalfFloat, isPowerOfTwo, isPowerOfTwoTexture, packNormalizedVec4ToVec2, convertToStringAsGLSLFloat, nearZeroToZero, gaussianCdf, invGaussianCdf, computeEigenValuesAndVectors, computeGaussianDistributionRatioWhoseSumIsOne, roundAsFloat, financial, lerp, }); /***/ }), /***/ "./src/foundation/math/Matrix22.ts": /*!*****************************************!*\ !*** ./src/foundation/math/Matrix22.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Matrix22: () => (/* binding */ Matrix22) /* harmony export */ }); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _Vector2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _AbstractMatrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AbstractMatrix */ "./src/foundation/math/AbstractMatrix.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class Matrix22 extends _AbstractMatrix__WEBPACK_IMPORTED_MODULE_3__.AbstractMatrix { constructor(m) { super(); this._v = m; } get m00() { return this._v[0]; } get m10() { return this._v[1]; } get m01() { return this._v[2]; } get m11() { return this._v[3]; } get className() { return 'Matrix22'; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat2; } /** * Create zero matrix */ static zero() { return Matrix22.fromCopy4RowMajor(0, 0, 0, 0); } /** * Create identity matrix */ static identity() { return Matrix22.fromCopy4RowMajor(1, 0, 0, 1); } static dummy() { return new this(new Float32Array(0)); } /** * Create transpose matrix */ static transpose(mat) { return Matrix22.fromCopy4RowMajor(mat._v[0], mat._v[1], mat._v[2], mat._v[3]); } /** * Create invert matrix */ static invert(mat) { const det = mat.determinant(); if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_4__.Logger.error('the determinant is 0!'); } const m00 = mat._v[3] / det; const m01 = (mat._v[2] / det) * -1.0; const m10 = (mat._v[1] / det) * -1.0; const m11 = mat._v[0] / det; return Matrix22.fromCopy4RowMajor(m00, m01, m10, m11); } static invertTo(mat, outMat) { const det = mat.determinant(); if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_4__.Logger.error('the determinant is 0!'); } const m00 = mat._v[3] / det; const m01 = (mat._v[2] / det) * -1.0; const m10 = (mat._v[1] / det) * -1.0; const m11 = mat._v[0] / det; return outMat.setComponents(m00, m01, m10, m11); } /** * Create Rotation Matrix */ static rotate(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix22.fromCopy4RowMajor(cos, -sin, sin, cos); } /** * Create Scale Matrix */ static scale(vec) { return Matrix22.fromCopy4RowMajor(vec._v[0], 0, 0, vec._v[1]); } /** * multiply matrixes */ static multiply(l_mat, r_mat) { const m00 = l_mat._v[0] * r_mat._v[0] + l_mat._v[2] * r_mat._v[1]; const m10 = l_mat._v[1] * r_mat._v[0] + l_mat._v[3] * r_mat._v[1]; const m01 = l_mat._v[0] * r_mat._v[2] + l_mat._v[2] * r_mat._v[3]; const m11 = l_mat._v[1] * r_mat._v[2] + l_mat._v[3] * r_mat._v[3]; return Matrix22.fromCopy4RowMajor(m00, m01, m10, m11); } /** * multiply matrixes */ static multiplyTo(l_mat, r_mat, outMat) { const m00 = l_mat._v[0] * r_mat._v[0] + l_mat._v[2] * r_mat._v[1]; const m10 = l_mat._v[1] * r_mat._v[0] + l_mat._v[3] * r_mat._v[1]; const m01 = l_mat._v[0] * r_mat._v[2] + l_mat._v[2] * r_mat._v[3]; const m11 = l_mat._v[1] * r_mat._v[2] + l_mat._v[3] * r_mat._v[3]; return outMat.setComponents(m00, m01, m10, m11); } toString() { return this._v[0] + ' ' + this._v[2] + '\n' + this._v[1] + ' ' + this._v[3] + ' \n'; } toStringApproximately() { return (_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[2]) + '\n' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[1]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[3]) + ' \n'); } flattenAsArray() { return [this._v[0], this._v[1], this._v[2], this._v[3]]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(mat, delta = Number.EPSILON) { if (Math.abs(mat._v[0] - this._v[0]) < delta && Math.abs(mat._v[1] - this._v[1]) < delta && Math.abs(mat._v[2] - this._v[2]) < delta && Math.abs(mat._v[3] - this._v[3]) < delta) { return true; } else { return false; } } isStrictEqual(mat) { if (mat._v[0] === this._v[0] && mat._v[1] === this._v[1] && mat._v[2] === this._v[2] && mat._v[3] === this._v[3]) { return true; } else { return false; } } at(row_i, column_i) { return this._v[row_i + column_i * 2]; } determinant() { return this._v[0] * this._v[3] - this._v[1] * this._v[2]; } multiplyVector(vec) { const x = this._v[0] * vec._v[0] + this._v[2] * vec._v[1]; const y = this._v[1] * vec._v[0] + this._v[3] * vec._v[1]; return _Vector2__WEBPACK_IMPORTED_MODULE_1__.Vector2.fromCopyArray2([x, y]); } multiplyVectorTo(vec, outVec) { const x = this._v[0] * vec._v[0] + this._v[2] * vec._v[1]; const y = this._v[1] * vec._v[0] + this._v[3] * vec._v[1]; outVec._v[0] = x; outVec._v[1] = y; return outVec; } getScale() { return _Vector2__WEBPACK_IMPORTED_MODULE_1__.Vector2.fromCopyArray2([Math.hypot(this.m00, this.m01), Math.hypot(this.m10, this.m11)]); } getScaleTo(outVec) { outVec._v[0] = Math.hypot(this._v[0], this._v[2]); outVec._v[1] = Math.hypot(this._v[1], this._v[3]); return outVec; } clone() { return this.constructor.fromCopy4RowMajor(this._v[0], this._v[2], this._v[1], this._v[3]); } /** * Set values as Row Major * Note that WebGL matrix keeps the values in column major. * If you write 4 values in 2x2 style (2 values in each row), * It will becomes an intuitive handling. * @returns */ static fromCopy4RowMajor(m00, m01, m10, m11) { const v = new Float32Array(4); v[0] = m00; v[2] = m01; v[1] = m10; v[3] = m11; return new Matrix22(v); } /** * Set values as Column Major * Note that WebGL matrix keeps the values in column major. * @returns */ static fromCopy4ColumnMajor(m00, m10, m01, m11) { const v = new Float32Array(4); v[0] = m00; v[2] = m01; v[1] = m10; v[3] = m11; return new Matrix22(v); } static fromFloat32ArrayColumnMajor(float32Array) { return new Matrix22(float32Array); } static fromCopyFloat32ArrayColumnMajor(float32Array) { const v = new Float32Array(4); v.set(float32Array); return new Matrix22(v); } static fromCopyFloat32ArrayRowMajor(array) { const v = new Float32Array(4); v[0] = array[0]; v[3] = array[1]; v[1] = array[2]; v[4] = array[3]; return new Matrix22(v); } static fromCopyMatrix22(mat) { const v = new Float32Array(4); v[0] = mat._v[0]; v[3] = mat._v[1]; v[1] = mat._v[2]; v[4] = mat._v[3]; return new Matrix22(v); } static fromCopyArray9ColumnMajor(array) { const v = new Float32Array(4); v.set(array); return new Matrix22(v); } static fromCopyArrayColumnMajor(array) { const v = new Float32Array(4); v.set(array); return new Matrix22(v); } static fromCopyArray9RowMajor(array) { const v = new Float32Array(4); v[0] = array[0]; v[3] = array[1]; v[1] = array[2]; v[4] = array[3]; return new Matrix22(v); } static fromCopyArrayRowMajor(array) { const v = new Float32Array(4); v[0] = array[0]; v[3] = array[1]; v[1] = array[2]; v[4] = array[3]; return new Matrix22(v); } } /***/ }), /***/ "./src/foundation/math/Matrix33.ts": /*!*****************************************!*\ !*** ./src/foundation/math/Matrix33.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Matrix33: () => (/* binding */ Matrix33) /* harmony export */ }); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _AbstractMatrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AbstractMatrix */ "./src/foundation/math/AbstractMatrix.ts"); /* harmony import */ var _IdentityMatrix33__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IdentityMatrix33 */ "./src/foundation/math/IdentityMatrix33.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* eslint-disable prettier/prettier */ class Matrix33 extends _AbstractMatrix__WEBPACK_IMPORTED_MODULE_3__.AbstractMatrix { constructor(m) { super(); this._v = m; } get m00() { return this._v[0]; } get m10() { return this._v[1]; } get m20() { return this._v[2]; } get m01() { return this._v[3]; } get m11() { return this._v[4]; } get m21() { return this._v[5]; } get m02() { return this._v[6]; } get m12() { return this._v[7]; } get m22() { return this._v[8]; } get className() { return 'Matrix33'; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Mat3; } /** * zero matrix(static version) */ static zero() { return Matrix33.fromCopy9RowMajor(0, 0, 0, 0, 0, 0, 0, 0, 0); } /** * Create identity matrix */ static identity() { // return new this( // 1, 0, 0, // 0, 1, 0, // 0, 0, 1 // ); return new _IdentityMatrix33__WEBPACK_IMPORTED_MODULE_4__.IdentityMatrix33(); } static dummy() { return new this(new Float32Array(0)); } /** * Create transpose matrix */ static transpose(mat) { if (mat.isIdentityMatrixClass) { return mat; } return Matrix33.fromCopy9RowMajor(mat._v[0], mat._v[1], mat._v[2], mat._v[3], mat._v[4], mat._v[5], mat._v[6], mat._v[7], mat._v[8]); } /** * Create invert matrix */ static invert(mat) { if (mat.isIdentityMatrixClass) { return mat; } const det = mat.determinant(); if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.error('the determinant is 0!'); } const m00 = (mat._v[4] * mat._v[8] - mat._v[7] * mat._v[5]) / det; const m01 = (mat._v[6] * mat._v[5] - mat._v[3] * mat._v[8]) / det; const m02 = (mat._v[3] * mat._v[7] - mat._v[6] * mat._v[4]) / det; const m10 = (mat._v[7] * mat._v[2] - mat._v[1] * mat._v[8]) / det; const m11 = (mat._v[0] * mat._v[8] - mat._v[6] * mat._v[2]) / det; const m12 = (mat._v[6] * mat._v[1] - mat._v[0] * mat._v[7]) / det; const m20 = (mat._v[1] * mat._v[5] - mat._v[4] * mat._v[2]) / det; const m21 = (mat._v[3] * mat._v[2] - mat._v[0] * mat._v[5]) / det; const m22 = (mat._v[0] * mat._v[4] - mat._v[3] * mat._v[1]) / det; return Matrix33.fromCopy9RowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22); } static invertTo(mat, outMat) { if (mat.isIdentityMatrixClass) { return outMat.copyComponents(mat); } const det = mat.determinant(); if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.error('the determinant is 0!'); } const m00 = (mat._v[4] * mat._v[8] - mat._v[7] * mat._v[5]) / det; const m01 = (mat._v[6] * mat._v[5] - mat._v[3] * mat._v[8]) / det; const m02 = (mat._v[3] * mat._v[7] - mat._v[6] * mat._v[4]) / det; const m10 = (mat._v[7] * mat._v[2] - mat._v[1] * mat._v[8]) / det; const m11 = (mat._v[0] * mat._v[8] - mat._v[6] * mat._v[2]) / det; const m12 = (mat._v[6] * mat._v[1] - mat._v[0] * mat._v[7]) / det; const m20 = (mat._v[1] * mat._v[5] - mat._v[4] * mat._v[2]) / det; const m21 = (mat._v[3] * mat._v[2] - mat._v[0] * mat._v[5]) / det; const m22 = (mat._v[0] * mat._v[4] - mat._v[3] * mat._v[1]) / det; return outMat.setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22); } /** * Create X oriented Rotation Matrix */ static rotateX(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix33.fromCopy9RowMajor(1, 0, 0, 0, cos, -sin, 0, sin, cos); } /** * Create Y oriented Rotation Matrix */ static rotateY(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix33.fromCopy9RowMajor(cos, 0, sin, 0, 1, 0, -sin, 0, cos); } /** * Create Z oriented Rotation Matrix */ static rotateZ(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix33.fromCopy9RowMajor(cos, -sin, 0, sin, cos, 0, 0, 0, 1); } static rotateXYZ(x, y, z) { const cosX = Math.cos(x); const sinX = Math.sin(x); const cosY = Math.cos(y); const sinY = Math.sin(y); const cosZ = Math.cos(z); const sinZ = Math.sin(z); // const x00 = 1; // const x01 = 0; // const x02 = 0; // const x10 = 0; const x11 = cosX; const x12 = -sinX; // const x20 = 0; const x21 = sinX; const x22 = cosX; const y00 = cosY; // const y01 = 0; const y02 = sinY; // const y10 = 0; // const y11 = 1; // const y12 = 0; const y20 = -sinY; // const y21 = 0; const y22 = cosY; const z00 = cosZ; const z01 = -sinZ; // const z02 = 0; const z10 = sinZ; const z11 = cosZ; // const z12 = 0; // const z20 = 0; // const z21 = 0; // const z22 = 1; // calculate this.multiply(this.rotateY(y), this.rotateX(x)) const yx00 = y00; const yx01 = y02 * x21; const yx02 = y02 * x22; //const yx10 = 0; const yx11 = x11; const yx12 = x12; const yx20 = y20; const yx21 = y22 * x21; const yx22 = y22 * x22; // calculate this.multiply(this.rotateZ(z), this.multiply(this.rotateY(y), this.rotateX(x))) const m00 = z00 * yx00; const m01 = z00 * yx01 + z01 * yx11; const m02 = z00 * yx02 + z01 * yx12; const m10 = z10 * yx00; const m11 = z10 * yx01 + z11 * yx11; const m12 = z10 * yx02 + z11 * yx12; const m20 = yx20; const m21 = yx21; const m22 = yx22; return Matrix33.fromCopy9RowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22); } static rotate(vec) { return this.rotateXYZ(vec._v[0], vec._v[1], vec._v[2]); } /** * Create Scale Matrix */ static scale(vec) { return Matrix33.fromCopy9RowMajor(vec._v[0], 0, 0, 0, vec._v[1], 0, 0, 0, vec._v[2]); } /** * multiply matrixes */ static multiply(l_mat, r_mat) { if (l_mat.isIdentityMatrixClass) { return r_mat; } else if (r_mat.isIdentityMatrixClass) { return l_mat; } const m00 = l_mat._v[0] * r_mat._v[0] + l_mat._v[3] * r_mat._v[1] + l_mat._v[6] * r_mat._v[2]; const m10 = l_mat._v[1] * r_mat._v[0] + l_mat._v[4] * r_mat._v[1] + l_mat._v[7] * r_mat._v[2]; const m20 = l_mat._v[2] * r_mat._v[0] + l_mat._v[5] * r_mat._v[1] + l_mat._v[8] * r_mat._v[2]; const m01 = l_mat._v[0] * r_mat._v[3] + l_mat._v[3] * r_mat._v[4] + l_mat._v[6] * r_mat._v[5]; const m11 = l_mat._v[1] * r_mat._v[3] + l_mat._v[4] * r_mat._v[4] + l_mat._v[7] * r_mat._v[5]; const m21 = l_mat._v[2] * r_mat._v[3] + l_mat._v[5] * r_mat._v[4] + l_mat._v[8] * r_mat._v[5]; const m02 = l_mat._v[0] * r_mat._v[6] + l_mat._v[3] * r_mat._v[7] + l_mat._v[6] * r_mat._v[8]; const m12 = l_mat._v[1] * r_mat._v[6] + l_mat._v[4] * r_mat._v[7] + l_mat._v[7] * r_mat._v[8]; const m22 = l_mat._v[2] * r_mat._v[6] + l_mat._v[5] * r_mat._v[7] + l_mat._v[8] * r_mat._v[8]; return Matrix33.fromCopy9RowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22); } /** * multiply matrixes */ static multiplyTo(l_mat, r_mat, outMat) { if (l_mat.isIdentityMatrixClass) { return outMat.copyComponents(r_mat); } else if (r_mat.isIdentityMatrixClass) { return outMat.copyComponents(l_mat); } const m00 = l_mat._v[0] * r_mat._v[0] + l_mat._v[3] * r_mat._v[1] + l_mat._v[6] * r_mat._v[2]; const m10 = l_mat._v[1] * r_mat._v[0] + l_mat._v[4] * r_mat._v[1] + l_mat._v[7] * r_mat._v[2]; const m20 = l_mat._v[2] * r_mat._v[0] + l_mat._v[5] * r_mat._v[1] + l_mat._v[8] * r_mat._v[2]; const m01 = l_mat._v[0] * r_mat._v[3] + l_mat._v[3] * r_mat._v[4] + l_mat._v[6] * r_mat._v[5]; const m11 = l_mat._v[1] * r_mat._v[3] + l_mat._v[4] * r_mat._v[4] + l_mat._v[7] * r_mat._v[5]; const m21 = l_mat._v[2] * r_mat._v[3] + l_mat._v[5] * r_mat._v[4] + l_mat._v[8] * r_mat._v[5]; const m02 = l_mat._v[0] * r_mat._v[6] + l_mat._v[3] * r_mat._v[7] + l_mat._v[6] * r_mat._v[8]; const m12 = l_mat._v[1] * r_mat._v[6] + l_mat._v[4] * r_mat._v[7] + l_mat._v[7] * r_mat._v[8]; const m22 = l_mat._v[2] * r_mat._v[6] + l_mat._v[5] * r_mat._v[7] + l_mat._v[8] * r_mat._v[8]; return outMat.setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22); } toString() { return (this._v[0] + ' ' + this._v[3] + ' ' + this._v[6] + '\n' + this._v[1] + ' ' + this._v[4] + ' ' + this._v[7] + '\n' + this._v[2] + ' ' + this._v[5] + ' ' + this._v[8] + '\n'); } toStringApproximately() { return (_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[3]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[6]) + '\n' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[1]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[4]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[7]) + ' \n' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[2]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[5]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.financial(this._v[8]) + '\n'); } flattenAsArray() { return [ this._v[0], this._v[1], this._v[2], this._v[3], this._v[4], this._v[5], this._v[6], this._v[7], this._v[8], ]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(mat, delta = Number.EPSILON) { if (Math.abs(mat._v[0] - this._v[0]) < delta && Math.abs(mat._v[1] - this._v[1]) < delta && Math.abs(mat._v[2] - this._v[2]) < delta && Math.abs(mat._v[3] - this._v[3]) < delta && Math.abs(mat._v[4] - this._v[4]) < delta && Math.abs(mat._v[5] - this._v[5]) < delta && Math.abs(mat._v[6] - this._v[6]) < delta && Math.abs(mat._v[7] - this._v[7]) < delta && Math.abs(mat._v[8] - this._v[8]) < delta) { return true; } else { return false; } } isStrictEqual(mat) { if (mat._v[0] === this._v[0] && mat._v[1] === this._v[1] && mat._v[2] === this._v[2] && mat._v[3] === this._v[3] && mat._v[4] === this._v[4] && mat._v[5] === this._v[5] && mat._v[6] === this._v[6] && mat._v[7] === this._v[7] && mat._v[8] === this._v[8]) { return true; } else { return false; } } at(row_i, column_i) { return this._v[row_i + column_i * 3]; } v(i) { return this._v[i]; } determinant() { return (this._v[0] * this._v[4] * this._v[8] + this._v[1] * this._v[5] * this._v[6] + this._v[2] * this._v[3] * this._v[7] - this._v[0] * this._v[5] * this._v[7] - this._v[2] * this._v[4] * this._v[6] - this._v[1] * this._v[3] * this._v[8]); } multiplyVector(vec) { const x = this._v[0] * vec._v[0] + this._v[3] * vec._v[1] + this._v[6] * vec._v[2]; const y = this._v[1] * vec._v[0] + this._v[4] * vec._v[1] + this._v[7] * vec._v[2]; const z = this._v[2] * vec._v[0] + this._v[5] * vec._v[1] + this._v[8] * vec._v[2]; return new vec.constructor(new Float32Array([x, y, z])); } multiplyVectorTo(vec, outVec) { const x = this._v[0] * vec._v[0] + this._v[3] * vec._v[1] + this._v[6] * vec._v[2]; const y = this._v[1] * vec._v[0] + this._v[4] * vec._v[1] + this._v[7] * vec._v[2]; const z = this._v[2] * vec._v[0] + this._v[5] * vec._v[1] + this._v[8] * vec._v[2]; outVec._v[0] = x; outVec._v[1] = y; outVec._v[2] = z; return outVec; } getScale() { return _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([ Math.hypot(this._v[0], this._v[1], this._v[2]), Math.hypot(this._v[3], this._v[4], this._v[5]), Math.hypot(this._v[6], this._v[7], this._v[8]), ]); } getScaleTo(outVec) { outVec._v[0] = Math.hypot(this._v[0], this._v[1], this._v[2]); outVec._v[1] = Math.hypot(this._v[3], this._v[4], this._v[5]); outVec._v[2] = Math.hypot(this._v[6], this._v[7], this._v[8]); return outVec; } clone() { return this.constructor.fromCopy9RowMajor(this._v[0], this._v[3], this._v[6], this._v[1], this._v[4], this._v[7], this._v[2], this._v[5], this._v[8]); } /** * Set values as Row Major * Note that WebGL matrix keeps the values in column major. * If you write 9 values in 3x3 style (3 values in each row), * It will becomes an intuitive handling. * @returns */ static fromCopy9RowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22) { const v = new Float32Array(9); v[0] = m00; v[3] = m01; v[6] = m02; v[1] = m10; v[4] = m11; v[7] = m12; v[2] = m20; v[5] = m21; v[8] = m22; return new Matrix33(v); } /** * Set values as Column Major * Note that WebGL matrix keeps the values in column major. * @returns */ static fromCopy9ColumnMajor(m00, m10, m20, m01, m11, m21, m02, m12, m22) { const v = new Float32Array(9); v[0] = m00; v[3] = m01; v[6] = m02; v[1] = m10; v[4] = m11; v[7] = m12; v[2] = m20; v[5] = m21; v[8] = m22; return new Matrix33(v); } static fromCopyMatrix44(mat) { const v = new Float32Array(9); v[0] = mat._v[0]; v[1] = mat._v[1]; v[2] = mat._v[2]; v[3] = mat._v[5]; v[4] = mat._v[6]; v[5] = mat._v[7]; v[6] = mat._v[9]; v[7] = mat._v[10]; v[8] = mat._v[11]; return new Matrix33(v); } static fromFloat32ArrayColumnMajor(float32Array) { return new Matrix33(float32Array); } static fromCopyFloat32ArrayColumnMajor(float32Array) { const v = new Float32Array(9); v.set(float32Array); return new Matrix33(v); } static fromCopyFloat32ArrayRowMajor(array) { const v = new Float32Array(9); v[0] = array[0]; v[3] = array[1]; v[6] = array[2]; v[1] = array[3]; v[4] = array[4]; v[7] = array[5]; v[2] = array[6]; v[5] = array[7]; v[8] = array[8]; return new Matrix33(v); } static fromCopyMatrix33(mat) { const v = new Float32Array(9); v[0] = mat._v[0]; v[3] = mat._v[3]; v[6] = mat._v[6]; v[1] = mat._v[1]; v[4] = mat._v[4]; v[7] = mat._v[7]; v[2] = mat._v[2]; v[5] = mat._v[5]; v[8] = mat._v[8]; return new Matrix33(v); } static fromCopyArray9ColumnMajor(array) { const v = new Float32Array(9); v.set(array); return new Matrix33(v); } static fromCopyArrayColumnMajor(array) { const v = new Float32Array(9); v.set(array); return new Matrix33(v); } static fromCopyArray9RowMajor(array) { const v = new Float32Array(9); v[0] = array[0]; v[3] = array[1]; v[6] = array[2]; v[1] = array[3]; v[4] = array[4]; v[7] = array[5]; v[2] = array[6]; v[5] = array[7]; v[8] = array[8]; return new Matrix33(v); } static fromCopyArrayRowMajor(array) { const v = new Float32Array(9); v[0] = array[0]; v[3] = array[1]; v[6] = array[2]; v[1] = array[3]; v[4] = array[4]; v[7] = array[5]; v[2] = array[6]; v[5] = array[7]; v[8] = array[8]; return new Matrix33(v); } static fromCopyQuaternion(q) { const sx = q._v[0] * q._v[0]; const sy = q._v[1] * q._v[1]; const sz = q._v[2] * q._v[2]; const cx = q._v[1] * q._v[2]; const cy = q._v[0] * q._v[2]; const cz = q._v[0] * q._v[1]; const wx = q._v[3] * q._v[0]; const wy = q._v[3] * q._v[1]; const wz = q._v[3] * q._v[2]; const v = new Float32Array(9); v[0] = 1.0 - 2.0 * (sy + sz); v[3] = 2.0 * (cz - wz); v[6] = 2.0 * (cy + wy); v[1] = 2.0 * (cz + wz); v[4] = 1.0 - 2.0 * (sx + sz); v[7] = 2.0 * (cx - wx); v[2] = 2.0 * (cy - wy); v[5] = 2.0 * (cx + wx); v[8] = 1.0 - 2.0 * (sx + sy); return new Matrix33(v); } } /***/ }), /***/ "./src/foundation/math/Matrix44.ts": /*!*****************************************!*\ !*** ./src/foundation/math/Matrix44.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Matrix44: () => (/* binding */ Matrix44) /* harmony export */ }); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _Vector4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _IdentityMatrix44__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IdentityMatrix44 */ "./src/foundation/math/IdentityMatrix44.ts"); /* harmony import */ var _AbstractMatrix__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AbstractMatrix */ "./src/foundation/math/AbstractMatrix.ts"); /* harmony import */ var _raw_raw_extension__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./raw/raw_extension */ "./src/foundation/math/raw/raw_extension.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* eslint-disable prettier/prettier */ const FloatArray = Float32Array; class Matrix44 extends _AbstractMatrix__WEBPACK_IMPORTED_MODULE_5__.AbstractMatrix { constructor(m) { super(); this._v = m; } get m00() { return this._v[0]; } get m10() { return this._v[1]; } get m20() { return this._v[2]; } get m30() { return this._v[3]; } get m01() { return this._v[4]; } get m11() { return this._v[5]; } get m21() { return this._v[6]; } get m31() { return this._v[7]; } get m02() { return this._v[8]; } get m12() { return this._v[9]; } get m22() { return this._v[10]; } get m32() { return this._v[11]; } get m03() { return this._v[12]; } get m13() { return this._v[13]; } get m23() { return this._v[14]; } get m33() { return this._v[15]; } get translateX() { return this._v[12]; } get translateY() { return this._v[13]; } get translateZ() { return this._v[14]; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Mat4; } /** * zero matrix(static version) */ static zero() { return Matrix44.fromCopy16RowMajor(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } /** * Create identity matrix */ static identity() { return new _IdentityMatrix44__WEBPACK_IMPORTED_MODULE_4__.IdentityMatrix44(); } static dummy() { return new this(new Float32Array(0)); } /** * Create transpose matrix */ static transpose(mat) { if (mat.isIdentityMatrixClass) { return mat; } return Matrix44.fromCopyFloat32ArrayRowMajor(mat._v); } /** * Create invert matrix */ static invert(mat) { if (mat.isIdentityMatrixClass) { return mat; } const n00 = mat._v[0] * mat._v[5] - mat._v[4] * mat._v[1]; const n01 = mat._v[0] * mat._v[9] - mat._v[8] * mat._v[1]; const n02 = mat._v[0] * mat._v[13] - mat._v[12] * mat._v[1]; const n03 = mat._v[4] * mat._v[9] - mat._v[8] * mat._v[5]; const n04 = mat._v[4] * mat._v[13] - mat._v[12] * mat._v[5]; const n05 = mat._v[8] * mat._v[13] - mat._v[12] * mat._v[9]; const n06 = mat._v[2] * mat._v[7] - mat._v[6] * mat._v[3]; const n07 = mat._v[2] * mat._v[11] - mat._v[10] * mat._v[3]; const n08 = mat._v[2] * mat._v[15] - mat._v[14] * mat._v[3]; const n09 = mat._v[6] * mat._v[11] - mat._v[10] * mat._v[7]; const n10 = mat._v[6] * mat._v[15] - mat._v[14] * mat._v[7]; const n11 = mat._v[10] * mat._v[15] - mat._v[14] * mat._v[11]; const det = n00 * n11 - n01 * n10 + n02 * n09 + n03 * n08 - n04 * n07 + n05 * n06; if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.error('the determinant is 0!'); } const m00 = (mat._v[5] * n11 - mat._v[9] * n10 + mat._v[13] * n09) / det; const m01 = (mat._v[8] * n10 - mat._v[4] * n11 - mat._v[12] * n09) / det; const m02 = (mat._v[7] * n05 - mat._v[11] * n04 + mat._v[15] * n03) / det; const m03 = (mat._v[10] * n04 - mat._v[6] * n05 - mat._v[14] * n03) / det; const m10 = (mat._v[9] * n08 - mat._v[1] * n11 - mat._v[13] * n07) / det; const m11 = (mat._v[0] * n11 - mat._v[8] * n08 + mat._v[12] * n07) / det; const m12 = (mat._v[11] * n02 - mat._v[3] * n05 - mat._v[15] * n01) / det; const m13 = (mat._v[2] * n05 - mat._v[10] * n02 + mat._v[14] * n01) / det; const m20 = (mat._v[1] * n10 - mat._v[5] * n08 + mat._v[13] * n06) / det; const m21 = (mat._v[4] * n08 - mat._v[0] * n10 - mat._v[12] * n06) / det; const m22 = (mat._v[3] * n04 - mat._v[7] * n02 + mat._v[15] * n00) / det; const m23 = (mat._v[6] * n02 - mat._v[2] * n04 - mat._v[14] * n00) / det; const m30 = (mat._v[5] * n07 - mat._v[1] * n09 - mat._v[9] * n06) / det; const m31 = (mat._v[0] * n09 - mat._v[4] * n07 + mat._v[8] * n06) / det; const m32 = (mat._v[7] * n01 - mat._v[3] * n03 - mat._v[11] * n00) / det; const m33 = (mat._v[2] * n03 - mat._v[6] * n01 + mat._v[10] * n00) / det; return Matrix44.fromCopy16RowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } static invertTo(mat, outMat) { if (mat.isIdentityMatrixClass) { return outMat.copyComponents(mat); } const n00 = mat._v[0] * mat._v[5] - mat._v[4] * mat._v[1]; const n01 = mat._v[0] * mat._v[9] - mat._v[8] * mat._v[1]; const n02 = mat._v[0] * mat._v[13] - mat._v[12] * mat._v[1]; const n03 = mat._v[4] * mat._v[9] - mat._v[8] * mat._v[5]; const n04 = mat._v[4] * mat._v[13] - mat._v[12] * mat._v[5]; const n05 = mat._v[8] * mat._v[13] - mat._v[12] * mat._v[9]; const n06 = mat._v[2] * mat._v[7] - mat._v[6] * mat._v[3]; const n07 = mat._v[2] * mat._v[11] - mat._v[10] * mat._v[3]; const n08 = mat._v[2] * mat._v[15] - mat._v[14] * mat._v[3]; const n09 = mat._v[6] * mat._v[11] - mat._v[10] * mat._v[7]; const n10 = mat._v[6] * mat._v[15] - mat._v[14] * mat._v[7]; const n11 = mat._v[10] * mat._v[15] - mat._v[14] * mat._v[11]; const det = n00 * n11 - n01 * n10 + n02 * n09 + n03 * n08 - n04 * n07 + n05 * n06; if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.error('the determinant is 0!'); } const m00 = (mat._v[5] * n11 - mat._v[9] * n10 + mat._v[13] * n09) / det; const m01 = (mat._v[8] * n10 - mat._v[4] * n11 - mat._v[12] * n09) / det; const m02 = (mat._v[7] * n05 - mat._v[11] * n04 + mat._v[15] * n03) / det; const m03 = (mat._v[10] * n04 - mat._v[6] * n05 - mat._v[14] * n03) / det; const m10 = (mat._v[9] * n08 - mat._v[1] * n11 - mat._v[13] * n07) / det; const m11 = (mat._v[0] * n11 - mat._v[8] * n08 + mat._v[12] * n07) / det; const m12 = (mat._v[11] * n02 - mat._v[3] * n05 - mat._v[15] * n01) / det; const m13 = (mat._v[2] * n05 - mat._v[10] * n02 + mat._v[14] * n01) / det; const m20 = (mat._v[1] * n10 - mat._v[5] * n08 + mat._v[13] * n06) / det; const m21 = (mat._v[4] * n08 - mat._v[0] * n10 - mat._v[12] * n06) / det; const m22 = (mat._v[3] * n04 - mat._v[7] * n02 + mat._v[15] * n00) / det; const m23 = (mat._v[6] * n02 - mat._v[2] * n04 - mat._v[14] * n00) / det; const m30 = (mat._v[5] * n07 - mat._v[1] * n09 - mat._v[9] * n06) / det; const m31 = (mat._v[0] * n09 - mat._v[4] * n07 + mat._v[8] * n06) / det; const m32 = (mat._v[7] * n01 - mat._v[3] * n03 - mat._v[11] * n00) / det; const m33 = (mat._v[2] * n03 - mat._v[6] * n01 + mat._v[10] * n00) / det; return outMat.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } /** * Create translation Matrix */ static translate(vec) { return Matrix44.fromCopy16RowMajor(1, 0, 0, vec._v[0], 0, 1, 0, vec._v[1], 0, 0, 1, vec._v[2], 0, 0, 0, 1); } /** * Create X oriented Rotation Matrix */ static rotateX(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix44.fromCopy16RowMajor(1, 0, 0, 0, 0, cos, -sin, 0, 0, sin, cos, 0, 0, 0, 0, 1); } /** * Create Y oriented Rotation Matrix */ static rotateY(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix44.fromCopy16RowMajor(cos, 0, sin, 0, 0, 1, 0, 0, -sin, 0, cos, 0, 0, 0, 0, 1); } /** * Create Z oriented Rotation Matrix */ static rotateZ(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return Matrix44.fromCopy16RowMajor(cos, -sin, 0, 0, sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } static rotateXYZ(x, y, z) { const cosX = Math.cos(x); const sinX = Math.sin(x); const cosY = Math.cos(y); const sinY = Math.sin(y); const cosZ = Math.cos(z); const sinZ = Math.sin(z); // const x00 = 1; // const x01 = 0; // const x02 = 0; // const x10 = 0; const x11 = cosX; const x12 = -sinX; // const x20 = 0; const x21 = sinX; const x22 = cosX; const y00 = cosY; // const y01 = 0; const y02 = sinY; // const y10 = 0; // const y11 = 1; // const y12 = 0; const y20 = -sinY; // const y21 = 0; const y22 = cosY; const z00 = cosZ; const z01 = -sinZ; // const z02 = 0; const z10 = sinZ; const z11 = cosZ; // const z12 = 0; // const z20 = 0; // const z21 = 0; // const z22 = 1; // Y * X const yx00 = y00; const yx01 = y02 * x21; const yx02 = y02 * x22; //const yx10 = 0; const yx11 = x11; const yx12 = x12; const yx20 = y20; const yx21 = y22 * x21; const yx22 = y22 * x22; // Z * Y * X const m00 = z00 * yx00; const m01 = z00 * yx01 + z01 * yx11; const m02 = z00 * yx02 + z01 * yx12; const m10 = z10 * yx00; const m11 = z10 * yx01 + z11 * yx11; const m12 = z10 * yx02 + z11 * yx12; const m20 = yx20; const m21 = yx21; const m22 = yx22; const m03 = 0; const m13 = 0; const m23 = 0; const m30 = 0; const m31 = 0; const m32 = 0; const m33 = 1; return Matrix44.fromCopy16RowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } static rotate(vec) { return this.rotateXYZ(vec._v[0], vec._v[1], vec._v[2]); } /** * Create Scale Matrix */ static scale(vec) { return Matrix44.fromCopy16RowMajor(vec._v[0], 0, 0, 0, 0, vec._v[1], 0, 0, 0, 0, vec._v[2], 0, 0, 0, 0, 1); } /** * multiply matrixes */ static multiply(l_mat, r_mat) { if (l_mat.isIdentityMatrixClass) { return r_mat; } else if (r_mat.isIdentityMatrixClass) { return l_mat; } const lv = l_mat._v; const rv = r_mat._v; const m00 = lv[0] * rv[0] + lv[4] * rv[1] + lv[8] * rv[2] + lv[12] * rv[3]; const m10 = lv[1] * rv[0] + lv[5] * rv[1] + lv[9] * rv[2] + lv[13] * rv[3]; const m20 = lv[2] * rv[0] + lv[6] * rv[1] + lv[10] * rv[2] + lv[14] * rv[3]; const m30 = lv[3] * rv[0] + lv[7] * rv[1] + lv[11] * rv[2] + lv[15] * rv[3]; const m01 = lv[0] * rv[4] + lv[4] * rv[5] + lv[8] * rv[6] + lv[12] * rv[7]; const m11 = lv[1] * rv[4] + lv[5] * rv[5] + lv[9] * rv[6] + lv[13] * rv[7]; const m21 = lv[2] * rv[4] + lv[6] * rv[5] + lv[10] * rv[6] + lv[14] * rv[7]; const m31 = lv[3] * rv[4] + lv[7] * rv[5] + lv[11] * rv[6] + lv[15] * rv[7]; const m02 = lv[0] * rv[8] + lv[4] * rv[9] + lv[8] * rv[10] + lv[12] * rv[11]; const m12 = lv[1] * rv[8] + lv[5] * rv[9] + lv[9] * rv[10] + lv[13] * rv[11]; const m22 = lv[2] * rv[8] + lv[6] * rv[9] + lv[10] * rv[10] + lv[14] * rv[11]; const m32 = lv[3] * rv[8] + lv[7] * rv[9] + lv[11] * rv[10] + lv[15] * rv[11]; const m03 = lv[0] * rv[12] + lv[4] * rv[13] + lv[8] * rv[14] + lv[12] * rv[15]; const m13 = lv[1] * rv[12] + lv[5] * rv[13] + lv[9] * rv[14] + lv[13] * rv[15]; const m23 = lv[2] * rv[12] + lv[6] * rv[13] + lv[10] * rv[14] + lv[14] * rv[15]; const m33 = lv[3] * rv[12] + lv[7] * rv[13] + lv[11] * rv[14] + lv[15] * rv[15]; return Matrix44.fromCopy16RowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } /** * multiply matrixes */ static multiplyTo(l_mat, r_mat, outMat) { if (l_mat.isIdentityMatrixClass) { return outMat.copyComponents(r_mat); } else if (r_mat.isIdentityMatrixClass) { return outMat.copyComponents(l_mat); } const lv = l_mat._v; const rv = r_mat._v; const m00 = lv[0] * rv[0] + lv[4] * rv[1] + lv[8] * rv[2] + lv[12] * rv[3]; const m10 = lv[1] * rv[0] + lv[5] * rv[1] + lv[9] * rv[2] + lv[13] * rv[3]; const m20 = lv[2] * rv[0] + lv[6] * rv[1] + lv[10] * rv[2] + lv[14] * rv[3]; const m30 = lv[3] * rv[0] + lv[7] * rv[1] + lv[11] * rv[2] + lv[15] * rv[3]; const m01 = lv[0] * rv[4] + lv[4] * rv[5] + lv[8] * rv[6] + lv[12] * rv[7]; const m11 = lv[1] * rv[4] + lv[5] * rv[5] + lv[9] * rv[6] + lv[13] * rv[7]; const m21 = lv[2] * rv[4] + lv[6] * rv[5] + lv[10] * rv[6] + lv[14] * rv[7]; const m31 = lv[3] * rv[4] + lv[7] * rv[5] + lv[11] * rv[6] + lv[15] * rv[7]; const m02 = lv[0] * rv[8] + lv[4] * rv[9] + lv[8] * rv[10] + lv[12] * rv[11]; const m12 = lv[1] * rv[8] + lv[5] * rv[9] + lv[9] * rv[10] + lv[13] * rv[11]; const m22 = lv[2] * rv[8] + lv[6] * rv[9] + lv[10] * rv[10] + lv[14] * rv[11]; const m32 = lv[3] * rv[8] + lv[7] * rv[9] + lv[11] * rv[10] + lv[15] * rv[11]; const m03 = lv[0] * rv[12] + lv[4] * rv[13] + lv[8] * rv[14] + lv[12] * rv[15]; const m13 = lv[1] * rv[12] + lv[5] * rv[13] + lv[9] * rv[14] + lv[13] * rv[15]; const m23 = lv[2] * rv[12] + lv[6] * rv[13] + lv[10] * rv[14] + lv[14] * rv[15]; const m33 = lv[3] * rv[12] + lv[7] * rv[13] + lv[11] * rv[14] + lv[15] * rv[15]; return outMat.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } static multiplyTypedArrayTo(l_mat, r_array, outMat, offsetAsComposition) { r_array[_raw_raw_extension__WEBPACK_IMPORTED_MODULE_6__.mulThatAndThisToOutAsMat44_offsetAsComposition](offsetAsComposition, l_mat._v, 0, outMat._v); return outMat; } static fromQuaternionTo(quat, outMat) { const sx = quat._v[0] * quat._v[0]; const sy = quat._v[1] * quat._v[1]; const sz = quat._v[2] * quat._v[2]; const cx = quat._v[1] * quat._v[2]; const cy = quat._v[0] * quat._v[2]; const cz = quat._v[0] * quat._v[1]; const wx = quat._v[3] * quat._v[0]; const wy = quat._v[3] * quat._v[1]; const wz = quat._v[3] * quat._v[2]; const m00 = 1.0 - 2.0 * (sy + sz); const m01 = 2.0 * (cz - wz); const m02 = 2.0 * (cy + wy); const m03 = 0; const m10 = 2.0 * (cz + wz); const m11 = 1.0 - 2.0 * (sx + sz); const m12 = 2.0 * (cx - wx); const m13 = 0; const m20 = 2.0 * (cy - wy); const m21 = 2.0 * (cx + wx); const m22 = 1.0 - 2.0 * (sx + sy); const m23 = 0; const m30 = 0; const m31 = 0; const m32 = 0; const m33 = 1; return outMat.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } toString() { return (this._v[0] + ' ' + this._v[4] + ' ' + this._v[8] + ' ' + this._v[12] + ' \n' + this._v[1] + ' ' + this._v[5] + ' ' + this._v[9] + ' ' + this._v[13] + ' \n' + this._v[2] + ' ' + this._v[6] + ' ' + this._v[10] + ' ' + this._v[14] + ' \n' + this._v[3] + ' ' + this._v[7] + ' ' + this._v[11] + ' ' + this._v[15] + ' \n'); } toStringApproximately() { return (_MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[4]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[8]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[12]) + ' \n' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[1]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[5]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[9]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[13]) + ' \n' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[2]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[6]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[10]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[14]) + ' \n' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[3]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[7]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[11]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_3__.MathUtil.financial(this._v[15]) + ' \n'); } flattenAsArray() { return [ this._v[0], this._v[1], this._v[2], this._v[3], this._v[4], this._v[5], this._v[6], this._v[7], this._v[8], this._v[9], this._v[10], this._v[11], this._v[12], this._v[13], this._v[14], this._v[15], ]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(mat, delta = Number.EPSILON) { const v = mat._v; if (Math.abs(v[0] - this._v[0]) < delta && Math.abs(v[1] - this._v[1]) < delta && Math.abs(v[2] - this._v[2]) < delta && Math.abs(v[3] - this._v[3]) < delta && Math.abs(v[4] - this._v[4]) < delta && Math.abs(v[5] - this._v[5]) < delta && Math.abs(v[6] - this._v[6]) < delta && Math.abs(v[7] - this._v[7]) < delta && Math.abs(v[8] - this._v[8]) < delta && Math.abs(v[9] - this._v[9]) < delta && Math.abs(v[10] - this._v[10]) < delta && Math.abs(v[11] - this._v[11]) < delta && Math.abs(v[12] - this._v[12]) < delta && Math.abs(v[13] - this._v[13]) < delta && Math.abs(v[14] - this._v[14]) < delta && Math.abs(v[15] - this._v[15]) < delta) { return true; } else { return false; } } isStrictEqual(mat) { if (mat._v[0] === this._v[0] && mat._v[1] === this._v[1] && mat._v[2] === this._v[2] && mat._v[3] === this._v[3] && mat._v[4] === this._v[4] && mat._v[5] === this._v[5] && mat._v[6] === this._v[6] && mat._v[7] === this._v[7] && mat._v[8] === this._v[8] && mat._v[9] === this._v[9] && mat._v[10] === this._v[10] && mat._v[11] === this._v[11] && mat._v[12] === this._v[12] && mat._v[13] === this._v[13] && mat._v[14] === this._v[14] && mat._v[15] === this._v[15]) { return true; } else { return false; } } at(row_i, column_i) { return this._v[row_i + column_i * 4]; } determinant() { return (this._v[0] * this._v[5] * this._v[10] * this._v[15] + this._v[0] * this._v[9] * this._v[14] * this._v[7] + this._v[0] * this._v[13] * this._v[6] * this._v[11] + this._v[4] * this._v[1] * this._v[14] * this._v[11] + this._v[4] * this._v[9] * this._v[2] * this._v[15] + this._v[4] * this._v[13] * this._v[10] * this._v[3] + this._v[8] * this._v[1] * this._v[6] * this._v[15] + this._v[8] * this._v[5] * this._v[14] * this._v[3] + this._v[8] * this._v[13] * this._v[2] * this._v[7] + this._v[12] * this._v[1] * this._v[10] * this._v[7] + this._v[12] * this._v[5] * this._v[2] * this._v[11] + this._v[12] * this._v[9] * this._v[6] * this._v[3] - this._v[0] * this._v[5] * this._v[14] * this._v[11] - this._v[0] * this._v[9] * this._v[6] * this._v[15] - this._v[0] * this._v[13] * this._v[10] * this._v[7] - this._v[4] * this._v[1] * this._v[10] * this._v[15] - this._v[4] * this._v[9] * this._v[14] * this._v[3] - this._v[4] * this._v[13] * this._v[2] * this._v[11] - this._v[8] * this._v[1] * this._v[14] * this._v[7] - this._v[8] * this._v[5] * this._v[2] * this._v[15] - this._v[8] * this._v[13] * this._v[6] * this._v[3] - this._v[12] * this._v[1] * this._v[6] * this._v[11] - this._v[12] * this._v[5] * this._v[10] * this._v[3] - this._v[12] * this._v[9] * this._v[2] * this._v[7]); } multiplyVector(vec) { const x = this._v[0] * vec._v[0] + this._v[4] * vec._v[1] + this._v[8] * vec._v[2] + this._v[12] * vec._v[3]; const y = this._v[1] * vec._v[0] + this._v[5] * vec._v[1] + this._v[9] * vec._v[2] + this._v[13] * vec._v[3]; const z = this._v[2] * vec._v[0] + this._v[6] * vec._v[1] + this._v[10] * vec._v[2] + this._v[14] * vec._v[3]; const w = this._v[3] * vec._v[0] + this._v[7] * vec._v[1] + this._v[11] * vec._v[2] + this._v[15] * vec._v[3]; return _Vector4__WEBPACK_IMPORTED_MODULE_1__.Vector4.fromCopyArray([x, y, z, w]); } multiplyVectorTo(vec, outVec) { const x = this._v[0] * vec._v[0] + this._v[4] * vec._v[1] + this._v[8] * vec._v[2] + this._v[12] * vec._v[3]; const y = this._v[1] * vec._v[0] + this._v[5] * vec._v[1] + this._v[9] * vec._v[2] + this._v[13] * vec._v[3]; const z = this._v[2] * vec._v[0] + this._v[6] * vec._v[1] + this._v[10] * vec._v[2] + this._v[14] * vec._v[3]; const w = this._v[3] * vec._v[0] + this._v[7] * vec._v[1] + this._v[11] * vec._v[2] + this._v[15] * vec._v[3]; outVec._v[0] = x; outVec._v[1] = y; outVec._v[2] = z; outVec._v[3] = w; return outVec; } multiplyVectorToVec3(vec, outVec) { const x = this._v[0] * vec._v[0] + this._v[4] * vec._v[1] + this._v[8] * vec._v[2] + this._v[12] * vec._v[3]; const y = this._v[1] * vec._v[0] + this._v[5] * vec._v[1] + this._v[9] * vec._v[2] + this._v[13] * vec._v[3]; const z = this._v[2] * vec._v[0] + this._v[6] * vec._v[1] + this._v[10] * vec._v[2] + this._v[14] * vec._v[3]; outVec._v[0] = x; outVec._v[1] = y; outVec._v[2] = z; return outVec; } multiplyVector3(vec) { const x = this._v[0] * vec._v[0] + this._v[4] * vec._v[1] + this._v[8] * vec._v[2] + this._v[12]; // regards vec.w(vec._v[3]) as 1 const y = this._v[1] * vec._v[0] + this._v[5] * vec._v[1] + this._v[9] * vec._v[2] + this._v[13]; const z = this._v[2] * vec._v[0] + this._v[6] * vec._v[1] + this._v[10] * vec._v[2] + this._v[14]; return _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([x, y, z]); } multiplyVector3To(vec, outVec) { const x = this._v[0] * vec._v[0] + this._v[4] * vec._v[1] + this._v[8] * vec._v[2] + this._v[12]; // regards vec.w(vec._v[3]) as 1 const y = this._v[1] * vec._v[0] + this._v[5] * vec._v[1] + this._v[9] * vec._v[2] + this._v[13]; const z = this._v[2] * vec._v[0] + this._v[6] * vec._v[1] + this._v[10] * vec._v[2] + this._v[14]; outVec._v[0] = x; outVec._v[1] = y; outVec._v[2] = z; return outVec; } getTranslate() { return _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([this._v[12], this._v[13], this._v[14]]); } /** * get translate vector from this matrix */ getTranslateTo(outVec) { outVec._v[0] = this._v[12]; outVec._v[1] = this._v[13]; outVec._v[2] = this._v[14]; return outVec; } getScale() { return _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([ Math.hypot(this._v[0], this._v[1], this._v[2]), Math.hypot(this._v[4], this._v[5], this._v[6]), Math.hypot(this._v[8], this._v[9], this._v[10]), ]); } /** * get scale vector from this matrix */ getScaleTo(outVec) { outVec._v[0] = Math.hypot(this._v[0], this._v[1], this._v[2]); outVec._v[1] = Math.hypot(this._v[4], this._v[5], this._v[6]); outVec._v[2] = Math.hypot(this._v[8], this._v[9], this._v[10]); return outVec; } /** * @return Euler Angles Rotation (x, y, z) */ toEulerAngles() { let rotate; if (Math.abs(this._v[2]) !== 1.0) { const y = -Math.asin(this._v[2]); const x = Math.atan2(this._v[6] / Math.cos(y), this._v[10] / Math.cos(y)); const z = Math.atan2(this._v[1] / Math.cos(y), this._v[0] / Math.cos(y)); rotate = _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([x, y, z]); } else if (this._v[2] === -1.0) { rotate = _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([Math.atan2(this._v[4], this._v[8]), Math.PI / 2.0, 0.0]); } else { rotate = _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([Math.atan2(-this._v[4], -this._v[8]), -Math.PI / 2.0, 0.0]); } return rotate; } toEulerAnglesTo(outVec3) { if (Math.abs(this._v[2]) !== 1.0) { const y = -Math.asin(this._v[2]); const x = Math.atan2(this._v[6] / Math.cos(y), this._v[10] / Math.cos(y)); const z = Math.atan2(this._v[1] / Math.cos(y), this._v[0] / Math.cos(y)); outVec3._v[0] = x; outVec3._v[1] = y; outVec3._v[2] = z; } else if (this._v[2] === -1.0) { outVec3._v[0] = Math.atan2(this._v[4], this._v[8]); outVec3._v[1] = Math.PI / 2.0; outVec3._v[2] = 0.0; } else { outVec3._v[0] = Math.atan2(-this._v[4], -this._v[8]); outVec3._v[1] = -Math.PI / 2.0; outVec3._v[2] = 0.0; } return outVec3; } clone() { return this.constructor.fromCopy16RowMajor(this._v[0], this._v[4], this._v[8], this._v[12], this._v[1], this._v[5], this._v[9], this._v[13], this._v[2], this._v[6], this._v[10], this._v[14], this._v[3], this._v[7], this._v[11], this._v[15]); } getRotate() { // const quat = Quaternion.fromMatrix(this); // const rotateMat = (this.constructor as any).fromCopyQuaternion(quat) as Matrix44; const scaleX = Math.hypot(this._v[0], this._v[1], this._v[2]); const scaleY = Math.hypot(this._v[4], this._v[5], this._v[6]); const scaleZ = Math.hypot(this._v[8], this._v[9], this._v[10]); const mat = Matrix44.fromCopy16RowMajor(this._v[0] / scaleX, this._v[4], this._v[8], 0, this._v[1], this._v[5] / scaleY, this._v[9], 0, this._v[2], this._v[6], this._v[10] / scaleZ, 0, 0, 0, 0, 1); return mat; } /** * Set values as Row Major * Note that WebGL matrix keeps the values in column major. * If you write 16 values in 4x4 style (4 values in each row), * It will becomes an intuitive handling. * @returns */ static fromCopy16RowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { const v = new Float32Array(16); v[0] = m00; v[4] = m01; v[8] = m02; v[12] = m03; v[1] = m10; v[5] = m11; v[9] = m12; v[13] = m13; v[2] = m20; v[6] = m21; v[10] = m22; v[14] = m23; v[3] = m30; v[7] = m31; v[11] = m32; v[15] = m33; return new Matrix44(v); } /** * Set values as Column Major * Note that WebGL matrix keeps the values in column major. * @returns */ static fromCopy16ColumnMajor(m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33) { const v = new Float32Array(16); v[0] = m00; v[4] = m01; v[8] = m02; v[12] = m03; v[1] = m10; v[5] = m11; v[9] = m12; v[13] = m13; v[2] = m20; v[6] = m21; v[10] = m22; v[14] = m23; v[3] = m30; v[7] = m31; v[11] = m32; v[15] = m33; return new Matrix44(v); } static fromCopyMatrix44(mat) { const v = new Float32Array(16); v.set(mat._v); return new Matrix44(v); } static fromFloat32ArrayColumnMajor(float32Array) { return new Matrix44(float32Array); } static fromCopyFloat32ArrayColumnMajor(float32Array) { const v = new Float32Array(16); v.set(float32Array); return new Matrix44(v); } static fromCopyFloat32ArrayRowMajor(array) { const v = new Float32Array(16); v[0] = array[0]; v[4] = array[1]; v[8] = array[2]; v[12] = array[3]; v[1] = array[4]; v[5] = array[5]; v[9] = array[6]; v[13] = array[7]; v[2] = array[8]; v[6] = array[9]; v[10] = array[10]; v[14] = array[11]; v[3] = array[12]; v[7] = array[13]; v[11] = array[14]; v[15] = array[15]; return new Matrix44(v); } static fromCopyMatrix33(mat) { const v = new Float32Array(16); v[0] = mat._v[0]; v[4] = mat._v[3]; v[8] = mat._v[6]; v[12] = 0; v[1] = mat._v[1]; v[5] = mat._v[4]; v[9] = mat._v[7]; v[13] = 0; v[2] = mat._v[2]; v[6] = mat._v[5]; v[10] = mat._v[8]; v[14] = 0; v[3] = 0; v[7] = 0; v[11] = 0; v[15] = 1; return new Matrix44(v); } static fromCopyArray16ColumnMajor(array) { const v = new Float32Array(16); v.set(array); return new Matrix44(v); } static fromCopyArrayColumnMajor(array) { const v = new Float32Array(16); v.set(array); return new Matrix44(v); } static fromCopyArray16RowMajor(array) { const v = new Float32Array(16); v[0] = array[0]; v[4] = array[1]; v[8] = array[2]; v[12] = array[3]; v[1] = array[4]; v[5] = array[5]; v[9] = array[6]; v[13] = array[7]; v[2] = array[8]; v[6] = array[9]; v[10] = array[10]; v[14] = array[11]; v[3] = array[12]; v[7] = array[13]; v[11] = array[14]; v[15] = array[15]; return new Matrix44(v); } static fromCopyArrayRowMajor(array) { const v = new Float32Array(16); v[0] = array[0]; v[4] = array[1]; v[8] = array[2]; v[12] = array[3]; v[1] = array[4]; v[5] = array[5]; v[9] = array[6]; v[13] = array[7]; v[2] = array[8]; v[6] = array[9]; v[10] = array[10]; v[14] = array[11]; v[3] = array[12]; v[7] = array[13]; v[11] = array[14]; v[15] = array[15]; return new Matrix44(v); } static fromCopyQuaternion(q) { const sx = q._v[0] * q._v[0]; const sy = q._v[1] * q._v[1]; const sz = q._v[2] * q._v[2]; const cx = q._v[1] * q._v[2]; const cy = q._v[0] * q._v[2]; const cz = q._v[0] * q._v[1]; const wx = q._v[3] * q._v[0]; const wy = q._v[3] * q._v[1]; const wz = q._v[3] * q._v[2]; const v = new Float32Array(16); v[0] = 1.0 - 2.0 * (sy + sz); v[4] = 2.0 * (cz - wz); v[8] = 2.0 * (cy + wy); v[12] = 0; v[1] = 2.0 * (cz + wz); v[5] = 1.0 - 2.0 * (sx + sz); v[9] = 2.0 * (cx - wx); v[13] = 0; v[2] = 2.0 * (cy - wy); v[6] = 2.0 * (cx + wx); v[10] = 1.0 - 2.0 * (sx + sy); v[14] = 0; v[3] = 0; v[7] = 0; v[11] = 0; v[15] = 1; return new Matrix44(v); } } /***/ }), /***/ "./src/foundation/math/MutableColorRgb.ts": /*!************************************************!*\ !*** ./src/foundation/math/MutableColorRgb.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableColorRgb: () => (/* binding */ MutableColorRgb) /* harmony export */ }); /* harmony import */ var _MutableVector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); class MutableColorRgb extends _MutableVector3__WEBPACK_IMPORTED_MODULE_0__.MutableVector3 { constructor(r) { super(r); } get x() { return this._v[0]; } set x(val) { this._v[0] = val; } get y() { return this._v[1]; } set y(val) { this._v[1] = val; } get z() { return this._v[2]; } set z(val) { this._v[2] = val; } get w() { return 1; } get r() { return this._v[0]; } set r(val) { this._v[0] = val; } get g() { return this._v[1]; } set g(val) { this._v[1] = val; } get b() { return this._v[2]; } set b(val) { this._v[2] = val; } get a() { return 1; } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } static cross(l_vec, r_vec) { return super._cross(l_vec, r_vec, Float32Array); } clone() { return super.clone(); } } /***/ }), /***/ "./src/foundation/math/MutableColorRgba.ts": /*!*************************************************!*\ !*** ./src/foundation/math/MutableColorRgba.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableColorRgba: () => (/* binding */ MutableColorRgba) /* harmony export */ }); /* harmony import */ var _MutableVector4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); class MutableColorRgba extends _MutableVector4__WEBPACK_IMPORTED_MODULE_0__.MutableVector4 { constructor(r) { super(r); } get x() { return this._v[0]; } set x(val) { this._v[0] = val; } get y() { return this._v[1]; } set y(val) { this._v[1] = val; } get z() { return this._v[2]; } set z(val) { this._v[2] = val; } get w() { return this._v[3]; } set w(val) { this._v[3] = val; } get r() { return this._v[0]; } set r(val) { this._v[0] = val; } get g() { return this._v[1]; } set g(val) { this._v[1] = val; } get b() { return this._v[2]; } set b(val) { this._v[2] = val; } get a() { return this._v[3]; } set a(val) { this._v[3] = val; } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } clone() { return super.clone(); } } /***/ }), /***/ "./src/foundation/math/MutableMatrix22.ts": /*!************************************************!*\ !*** ./src/foundation/math/MutableMatrix22.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableMatrix22: () => (/* binding */ MutableMatrix22) /* harmony export */ }); /* harmony import */ var _Matrix22__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Matrix22 */ "./src/foundation/math/Matrix22.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class MutableMatrix22 extends _Matrix22__WEBPACK_IMPORTED_MODULE_0__.Matrix22 { constructor(m) { super(m); } set m00(val) { this._v[0] = val; } get m00() { return this._v[0]; } set m10(val) { this._v[1] = val; } get m10() { return this._v[1]; } set m01(val) { this._v[2] = val; } get m01() { return this._v[2]; } set m11(val) { this._v[3] = val; } get m11() { return this._v[3]; } get className() { return 'MutableMatrix22'; } /** * Create zero matrix */ static zero() { return super.zero(); } /** * Create identity matrix */ static identity() { return super.identity(); } static dummy() { return super.dummy(); } /** * Create transpose matrix */ static transpose(mat) { return super.transpose(mat); } /** * Create invert matrix */ static invert(mat) { return super.invert(mat); } /** * Create Rotation Matrix */ static rotate(radian) { return super.rotate(radian); } /** * Create Scale Matrix */ static scale(vec) { return super.scale(vec); } /** * multiply matrixes */ static multiply(l_mat, r_mat) { return super.multiply(l_mat, r_mat); } clone() { const result = super.clone(); return result; } raw() { return this._v; } setAt(row_i, column_i, value) { this._v[row_i + column_i * 2] = value; return this; } setComponents(m00, m01, m10, m11) { this._v[0] = m00; this._v[2] = m01; this._v[1] = m10; this._v[3] = m11; return this; } copyComponents(mat) { this._v[0] = mat.m00; this._v[2] = mat.m01; // mat.m01 is mat._v[2 or 3 or 4] this._v[1] = mat.m10; this._v[3] = mat.m11; return this; } /** * zero matrix */ zero() { return this.setComponents(0, 0, 0, 0); } identity() { return this.setComponents(1, 0, 0, 1); } _swap(l, r) { this._v[r] = [this._v[l], (this._v[l] = this._v[r])][0]; } /** * transpose */ transpose() { this._swap(1, 2); return this; } invert() { const det = this.determinant(); if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('the determinant is 0!'); } const m00 = this._v[3] / det; const m01 = (this._v[2] / det) * -1.0; const m10 = (this._v[1] / det) * -1.0; const m11 = this._v[0] / det; return this.setComponents(m00, m01, m10, m11); } /** * Create Rotation Matrix */ rotate(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(cos, -sin, sin, cos); } scale(vec) { return this.setComponents(vec._v[0], 0, 0, vec._v[1]); } multiplyScale(vec) { this._v[0] *= vec._v[0]; this._v[2] *= vec._v[0]; this._v[1] *= vec._v[1]; this._v[3] *= vec._v[1]; return this; } /** * multiply the input matrix from right side */ multiply(mat) { const m00 = this._v[0] * mat._v[0] + this._v[2] * mat._v[1]; const m01 = this._v[0] * mat._v[2] + this._v[2] * mat._v[3]; const m10 = this._v[1] * mat._v[0] + this._v[3] * mat._v[1]; const m11 = this._v[1] * mat._v[2] + this._v[3] * mat._v[3]; return this.setComponents(m00, m01, m10, m11); } multiplyByLeft(mat) { const m00 = mat._v[0] * this._v[0] + mat._v[2] * this._v[1]; const m01 = mat._v[0] * this._v[2] + mat._v[2] * this._v[3]; const m10 = mat._v[1] * this._v[0] + mat._v[3] * this._v[1]; const m11 = mat._v[1] * this._v[2] + mat._v[3] * this._v[3]; return this.setComponents(m00, m01, m10, m11); } /** * Set values as Row Major * Note that WebGL matrix keeps the values in column major. * If you write 4 values in 2x2 style (2 values in each row), * It will becomes an intuitive handling. * @returns */ static fromCopy4RowMajor(m00, m01, m10, m11) { const v = new Float32Array(4); v[0] = m00; v[2] = m01; v[1] = m10; v[3] = m11; return new MutableMatrix22(v); } /** * Set values as Column Major * Note that WebGL matrix keeps the values in column major. * @returns */ static fromCopy4ColumnMajor(m00, m10, m01, m11) { const v = new Float32Array(4); v[0] = m00; v[2] = m01; v[1] = m10; v[3] = m11; return new MutableMatrix22(v); } static fromFloat32ArrayColumnMajor(float32Array) { return new MutableMatrix22(float32Array); } static fromCopyFloat32ArrayColumnMajor(float32Array) { const v = new Float32Array(4); v.set(float32Array); return new MutableMatrix22(v); } static fromCopyFloat32ArrayRowMajor(array) { const v = new Float32Array(4); v[0] = array[0]; v[3] = array[1]; v[1] = array[2]; v[4] = array[3]; return new MutableMatrix22(v); } static fromCopyMatrix22(mat) { const v = new Float32Array(4); v[0] = mat._v[0]; v[3] = mat._v[1]; v[1] = mat._v[2]; v[4] = mat._v[3]; return new MutableMatrix22(v); } static fromCopyArray9ColumnMajor(array) { const v = new Float32Array(4); v.set(array); return new MutableMatrix22(v); } static fromCopyArrayColumnMajor(array) { const v = new Float32Array(4); v.set(array); return new MutableMatrix22(v); } static fromCopyArray9RowMajor(array) { const v = new Float32Array(4); v[0] = array[0]; v[3] = array[1]; v[1] = array[2]; v[4] = array[3]; return new MutableMatrix22(v); } static fromCopyArrayRowMajor(array) { const v = new Float32Array(4); v[0] = array[0]; v[3] = array[1]; v[1] = array[2]; v[4] = array[3]; return new MutableMatrix22(v); } } /***/ }), /***/ "./src/foundation/math/MutableMatrix33.ts": /*!************************************************!*\ !*** ./src/foundation/math/MutableMatrix33.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableMatrix33: () => (/* binding */ MutableMatrix33) /* harmony export */ }); /* harmony import */ var _Matrix33__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Matrix33 */ "./src/foundation/math/Matrix33.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* eslint-disable prettier/prettier */ class MutableMatrix33 extends _Matrix33__WEBPACK_IMPORTED_MODULE_0__.Matrix33 { constructor(m) { super(m); } set m00(val) { this._v[0] = val; } get m00() { return this._v[0]; } set m10(val) { this._v[1] = val; } get m10() { return this._v[1]; } set m20(val) { this._v[2] = val; } get m20() { return this._v[2]; } set m01(val) { this._v[3] = val; } get m01() { return this._v[3]; } set m11(val) { this._v[4] = val; } get m11() { return this._v[4]; } set m21(val) { this._v[5] = val; } get m21() { return this._v[5]; } set m02(val) { this._v[6] = val; } get m02() { return this._v[6]; } set m12(val) { this._v[7] = val; } get m12() { return this._v[7]; } set m22(val) { this._v[8] = val; } get m22() { return this._v[8]; } get className() { return 'MutableMatrix33'; } /** * zero matrix(static version) */ static zero() { return super.zero(); } /** * Create identity matrix */ static identity() { return MutableMatrix33.fromCopy9RowMajor(1, 0, 0, 0, 1, 0, 0, 0, 1); } static dummy() { return super.dummy(); } /** * Create transpose matrix */ static transpose(mat) { return super.transpose(mat); } /** * Create invert matrix */ static invert(mat) { return super.invert(mat); } /** * Create X oriented Rotation Matrix */ static rotateX(radian) { return super.rotateX(radian); } /** * Create Y oriented Rotation Matrix */ static rotateY(radian) { return super.rotateY(radian); } /** * Create Z oriented Rotation Matrix */ static rotateZ(radian) { return super.rotateZ(radian); } static rotateXYZ(x, y, z) { return super.rotateXYZ(x, y, z); } static rotate(vec) { return super.rotateXYZ(vec._v[0], vec._v[1], vec._v[2]); } /** * Create Scale Matrix */ static scale(vec) { return super.scale(vec); } /** * multiply matrixes */ static multiply(l_mat, r_mat) { return super.multiply(l_mat, r_mat); } clone() { const result = super.clone(); return result; } raw() { return this._v; } setAt(row_i, column_i, value) { this._v[row_i + column_i * 3] = value; return this; } setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22) { this._v[0] = m00; this._v[3] = m01; this._v[6] = m02; this._v[1] = m10; this._v[4] = m11; this._v[7] = m12; this._v[2] = m20; this._v[5] = m21; this._v[8] = m22; return this; } copyComponents(mat) { this._v[0] = mat.m00; this._v[3] = mat.m01; this._v[6] = mat.m02; // mat.m01 is mat._v[3 or 4] this._v[1] = mat.m10; this._v[4] = mat.m11; this._v[7] = mat.m12; this._v[2] = mat.m20; this._v[5] = mat.m21; this._v[8] = mat.m22; return this; } /** * zero matrix */ zero() { return this.setComponents(0, 0, 0, 0, 0, 0, 0, 0, 0); } identity() { return this.setComponents(1, 0, 0, 0, 1, 0, 0, 0, 1); } _swap(l, r) { this._v[r] = [this._v[l], (this._v[l] = this._v[r])][0]; } /** * transpose */ transpose() { this._swap(1, 3); this._swap(2, 6); this._swap(5, 8); return this; } invert() { const det = this.determinant(); if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('the determinant is 0!'); } const m00 = (this._v[4] * this._v[8] - this._v[7] * this._v[5]) / det; const m01 = (this._v[6] * this._v[5] - this._v[3] * this._v[8]) / det; const m02 = (this._v[3] * this._v[7] - this._v[6] * this._v[4]) / det; const m10 = (this._v[7] * this._v[2] - this._v[1] * this._v[8]) / det; const m11 = (this._v[0] * this._v[8] - this._v[6] * this._v[2]) / det; const m12 = (this._v[6] * this._v[1] - this._v[0] * this._v[7]) / det; const m20 = (this._v[1] * this._v[5] - this._v[4] * this._v[2]) / det; const m21 = (this._v[3] * this._v[2] - this._v[0] * this._v[5]) / det; const m22 = (this._v[0] * this._v[4] - this._v[3] * this._v[1]) / det; return this.setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22); } /** * Create X oriented Rotation Matrix */ rotateX(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(1, 0, 0, 0, cos, -sin, 0, sin, cos); } /** * Create Y oriented Rotation Matrix */ rotateY(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(cos, 0, sin, 0, 1, 0, -sin, 0, cos); } /** * Create Z oriented Rotation Matrix */ rotateZ(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(cos, -sin, 0, sin, cos, 0, 0, 0, 1); } rotateXYZ(x, y, z) { const cosX = Math.cos(x); const sinX = Math.sin(x); const cosY = Math.cos(y); const sinY = Math.sin(y); const cosZ = Math.cos(z); const sinZ = Math.sin(z); // const x00 = 1; // const x01 = 0; // const x02 = 0; // const x10 = 0; const x11 = cosX; const x12 = -sinX; // const x20 = 0; const x21 = sinX; const x22 = cosX; const y00 = cosY; // const y01 = 0; const y02 = sinY; // const y10 = 0; // const y11 = 1; // const y12 = 0; const y20 = -sinY; // const y21 = 0; const y22 = cosY; const z00 = cosZ; const z01 = -sinZ; // const z02 = 0; const z10 = sinZ; const z11 = cosZ; // const z12 = 0; // const z20 = 0; // const z21 = 0; // const z22 = 1; // calculate this.multiply(this.rotateY(y), this.rotateX(x)) const yx00 = y00; const yx01 = y02 * x21; const yx02 = y02 * x22; //const yx10 = 0; const yx11 = x11; const yx12 = x12; const yx20 = y20; const yx21 = y22 * x21; const yx22 = y22 * x22; // calculate this.multiply(this.rotateZ(z), this.multiply(this.rotateY(y), this.rotateX(x))) const m00 = z00 * yx00; const m01 = z00 * yx01 + z01 * yx11; const m02 = z00 * yx02 + z01 * yx12; const m10 = z10 * yx00; const m11 = z10 * yx01 + z11 * yx11; const m12 = z10 * yx02 + z11 * yx12; const m20 = yx20; const m21 = yx21; const m22 = yx22; return this.setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22); } rotate(vec) { return this.rotateXYZ(vec._v[0], vec._v[1], vec._v[2]); } scale(vec) { return this.setComponents(vec._v[0], 0, 0, 0, vec._v[1], 0, 0, 0, vec._v[2]); } multiplyScale(vec) { this._v[0] *= vec._v[0]; this._v[3] *= vec._v[0]; this._v[6] *= vec._v[0]; this._v[1] *= vec._v[1]; this._v[4] *= vec._v[1]; this._v[7] *= vec._v[1]; this._v[2] *= vec._v[2]; this._v[5] *= vec._v[2]; this._v[8] *= vec._v[2]; return this; } /** * multiply the input matrix from right side */ multiply(mat) { if (mat.isIdentityMatrixClass) { return this; } const m00 = this._v[0] * mat._v[0] + this._v[3] * mat._v[1] + this._v[6] * mat._v[2]; const m01 = this._v[0] * mat._v[3] + this._v[3] * mat._v[4] + this._v[6] * mat._v[5]; const m02 = this._v[0] * mat._v[6] + this._v[3] * mat._v[7] + this._v[6] * mat._v[8]; const m10 = this._v[1] * mat._v[0] + this._v[4] * mat._v[1] + this._v[7] * mat._v[2]; const m11 = this._v[1] * mat._v[3] + this._v[4] * mat._v[4] + this._v[7] * mat._v[5]; const m12 = this._v[1] * mat._v[6] + this._v[4] * mat._v[7] + this._v[7] * mat._v[8]; const m20 = this._v[2] * mat._v[0] + this._v[5] * mat._v[1] + this._v[8] * mat._v[2]; const m21 = this._v[2] * mat._v[3] + this._v[5] * mat._v[4] + this._v[8] * mat._v[5]; const m22 = this._v[2] * mat._v[6] + this._v[5] * mat._v[7] + this._v[8] * mat._v[8]; return this.setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22); } multiplyByLeft(mat) { if (mat.isIdentityMatrixClass) { return this; } const m00 = mat._v[0] * this._v[0] + mat._v[3] * this._v[1] + mat._v[6] * this._v[2]; const m01 = mat._v[0] * this._v[3] + mat._v[3] * this._v[4] + mat._v[6] * this._v[5]; const m02 = mat._v[0] * this._v[6] + mat._v[3] * this._v[7] + mat._v[6] * this._v[8]; const m10 = mat._v[1] * this._v[0] + mat._v[4] * this._v[1] + mat._v[7] * this._v[2]; const m11 = mat._v[1] * this._v[3] + mat._v[4] * this._v[4] + mat._v[7] * this._v[5]; const m12 = mat._v[1] * this._v[6] + mat._v[4] * this._v[7] + mat._v[7] * this._v[8]; const m20 = mat._v[2] * this._v[0] + mat._v[5] * this._v[1] + mat._v[8] * this._v[2]; const m21 = mat._v[2] * this._v[3] + mat._v[5] * this._v[4] + mat._v[8] * this._v[5]; const m22 = mat._v[2] * this._v[6] + mat._v[5] * this._v[7] + mat._v[8] * this._v[8]; return this.setComponents(m00, m01, m02, m10, m11, m12, m20, m21, m22); } /** * Set values as Row Major * Note that WebGL matrix keeps the values in column major. * If you write 9 values in 3x3 style (3 values in each row), * It will becomes an intuitive handling. * @returns */ static fromCopy9RowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22) { const v = new Float32Array(9); v[0] = m00; v[3] = m01; v[6] = m02; v[1] = m10; v[4] = m11; v[7] = m12; v[2] = m20; v[5] = m21; v[8] = m22; return new MutableMatrix33(v); } /** * Set values as Column Major * Note that WebGL matrix keeps the values in column major. * @returns */ static fromCopy9ColumnMajor(m00, m10, m20, m01, m11, m21, m02, m12, m22) { const v = new Float32Array(9); v[0] = m00; v[3] = m01; v[6] = m02; v[1] = m10; v[4] = m11; v[7] = m12; v[2] = m20; v[5] = m21; v[8] = m22; return new MutableMatrix33(v); } static fromCopyMatrix44(mat) { const v = new Float32Array(9); v.set(mat._v); return new MutableMatrix33(v); } static fromFloat32ArrayColumnMajor(float32Array) { return new MutableMatrix33(float32Array); } static fromCopyFloat32ArrayColumnMajor(float32Array) { const v = new Float32Array(9); v.set(float32Array); return new MutableMatrix33(v); } static fromCopyFloat32ArrayRowMajor(array) { const v = new Float32Array(9); v[0] = array[0]; v[3] = array[1]; v[6] = array[2]; v[1] = array[3]; v[4] = array[4]; v[7] = array[5]; v[2] = array[6]; v[5] = array[7]; v[8] = array[8]; return new MutableMatrix33(v); } static fromCopyMatrix33(mat) { const v = new Float32Array(9); v[0] = mat._v[0]; v[3] = mat._v[3]; v[6] = mat._v[6]; v[1] = mat._v[1]; v[4] = mat._v[4]; v[7] = mat._v[7]; v[2] = mat._v[2]; v[5] = mat._v[5]; v[8] = mat._v[8]; return new MutableMatrix33(v); } static fromCopyArray9ColumnMajor(array) { const v = new Float32Array(9); v.set(array); return new MutableMatrix33(v); } static fromCopyArrayColumnMajor(array) { const v = new Float32Array(9); v.set(array); return new MutableMatrix33(v); } static fromCopyArray9RowMajor(array) { const v = new Float32Array(9); v[0] = array[0]; v[3] = array[1]; v[6] = array[2]; v[1] = array[3]; v[4] = array[4]; v[7] = array[5]; v[2] = array[6]; v[5] = array[7]; v[8] = array[8]; return new MutableMatrix33(v); } static fromCopyArrayRowMajor(array) { const v = new Float32Array(9); v[0] = array[0]; v[3] = array[1]; v[6] = array[2]; v[1] = array[3]; v[4] = array[4]; v[7] = array[5]; v[2] = array[6]; v[5] = array[7]; v[8] = array[8]; return new MutableMatrix33(v); } static fromCopyQuaternion(q) { const sx = q._v[0] * q._v[0]; const sy = q._v[1] * q._v[1]; const sz = q._v[2] * q._v[2]; const cx = q._v[1] * q._v[2]; const cy = q._v[0] * q._v[2]; const cz = q._v[0] * q._v[1]; const wx = q._v[3] * q._v[0]; const wy = q._v[3] * q._v[1]; const wz = q._v[3] * q._v[2]; const v = new Float32Array(9); v[0] = 1.0 - 2.0 * (sy + sz); v[3] = 2.0 * (cz - wz); v[6] = 2.0 * (cy + wy); v[1] = 2.0 * (cz + wz); v[4] = 1.0 - 2.0 * (sx + sz); v[7] = 2.0 * (cx - wx); v[2] = 2.0 * (cy - wy); v[5] = 2.0 * (cx + wx); v[8] = 1.0 - 2.0 * (sx + sy); return new MutableMatrix33(v); } } /***/ }), /***/ "./src/foundation/math/MutableMatrix44.ts": /*!************************************************!*\ !*** ./src/foundation/math/MutableMatrix44.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableMatrix44: () => (/* binding */ MutableMatrix44) /* harmony export */ }); /* harmony import */ var _Matrix44__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /* eslint-disable prettier/prettier */ const FloatArray = Float32Array; class MutableMatrix44 extends _Matrix44__WEBPACK_IMPORTED_MODULE_0__.Matrix44 { constructor(m) { super(m); } set m00(val) { this._v[0] = val; } get m00() { return this._v[0]; } set m10(val) { this._v[1] = val; } get m10() { return this._v[1]; } set m20(val) { this._v[2] = val; } get m20() { return this._v[2]; } set m30(val) { this._v[3] = val; } get m30() { return this._v[3]; } set m01(val) { this._v[4] = val; } get m01() { return this._v[4]; } set m11(val) { this._v[5] = val; } get m11() { return this._v[5]; } set m21(val) { this._v[6] = val; } get m21() { return this._v[6]; } set m31(val) { this._v[7] = val; } get m31() { return this._v[7]; } set m02(val) { this._v[8] = val; } get m02() { return this._v[8]; } set m12(val) { this._v[9] = val; } get m12() { return this._v[9]; } set m22(val) { this._v[10] = val; } get m22() { return this._v[10]; } set m32(val) { this._v[11] = val; } get m32() { return this._v[11]; } set m03(val) { this._v[12] = val; } get m03() { return this._v[12]; } set m13(val) { this._v[13] = val; } get m13() { return this._v[13]; } set m23(val) { this._v[14] = val; } get m23() { return this._v[14]; } set m33(val) { this._v[15] = val; } get m33() { return this._v[15]; } get translateX() { return this._v[12]; } set translateX(val) { this._v[12] = val; } get translateY() { return this._v[13]; } set translateY(val) { this._v[13] = val; } get translateZ() { return this._v[14]; } set translateZ(val) { this._v[14] = val; } get className() { return 'MutableMatrix44'; } /** * zero matrix(static version) */ static zero() { return MutableMatrix44.fromCopy16RowMajor(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } /** * Create identity matrix */ static identity() { return MutableMatrix44.fromCopy16RowMajor(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } static dummy() { return super.dummy(); } /** * Create transpose matrix */ static transpose(mat) { if (mat.isIdentityMatrixClass) { return mat; } return MutableMatrix44.fromCopyFloat32ArrayRowMajor(mat._v); } /** * Create invert matrix */ static invert(mat) { return super.invert(mat); } /** * Create translation Matrix */ static translate(vec) { return super.translate(vec); } /** * Create X oriented Rotation Matrix */ static rotateX(radian) { return super.rotateX(radian); } /** * Create Y oriented Rotation Matrix */ static rotateY(radian) { return super.rotateY(radian); } /** * Create Z oriented Rotation Matrix */ static rotateZ(radian) { return super.rotateZ(radian); } static rotateXYZ(x, y, z) { return super.rotateXYZ(x, y, z); } static rotate(vec) { return super.rotateXYZ(vec._v[0], vec._v[1], vec._v[2]); } /** * Create Scale Matrix */ static scale(vec) { return super.scale(vec); } /** * multiply matrixes */ static multiply(l_mat, r_mat) { return super.multiply(l_mat, r_mat); } clone() { const result = super.clone(); return result; } getRotate() { const rotateMat = super.getRotate(); return rotateMat; } getTranslate() { const rotateMat = super.getTranslate(); return rotateMat; } getScale() { const rotateMat = super.getScale(); return rotateMat; } raw() { return this._v; } setAt(row_i, column_i, value) { this._v[row_i + column_i * 4] = value; return this; } setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { this._v[0] = m00; this._v[4] = m01; this._v[8] = m02; this._v[12] = m03; this._v[1] = m10; this._v[5] = m11; this._v[9] = m12; this._v[13] = m13; this._v[2] = m20; this._v[6] = m21; this._v[10] = m22; this._v[14] = m23; this._v[3] = m30; this._v[7] = m31; this._v[11] = m32; this._v[15] = m33; return this; } copyComponents(mat) { this._v[0] = mat._v[0]; this._v[4] = mat._v[4]; this._v[8] = mat._v[8]; this._v[12] = mat._v[12]; this._v[1] = mat._v[1]; this._v[5] = mat._v[5]; this._v[9] = mat._v[9]; this._v[13] = mat._v[13]; this._v[2] = mat._v[2]; this._v[6] = mat._v[6]; this._v[10] = mat._v[10]; this._v[14] = mat._v[14]; this._v[3] = mat._v[3]; this._v[7] = mat._v[7]; this._v[11] = mat._v[11]; this._v[15] = mat._v[15]; return this; } /** * zero matrix */ zero() { return this.setComponents(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } /** * to the identity matrix */ identity() { return this.setComponents(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } _swap(l, r) { this._v[r] = [this._v[l], (this._v[l] = this._v[r])][0]; } /** * transpose */ transpose() { this._swap(1, 4); this._swap(2, 8); this._swap(3, 12); this._swap(6, 9); this._swap(7, 13); this._swap(11, 14); return this; } invert() { const n00 = this._v[0] * this._v[5] - this._v[4] * this._v[1]; const n01 = this._v[0] * this._v[9] - this._v[8] * this._v[1]; const n02 = this._v[0] * this._v[13] - this._v[12] * this._v[1]; const n03 = this._v[4] * this._v[9] - this._v[8] * this._v[5]; const n04 = this._v[4] * this._v[13] - this._v[12] * this._v[5]; const n05 = this._v[8] * this._v[13] - this._v[12] * this._v[9]; const n06 = this._v[2] * this._v[7] - this._v[6] * this._v[3]; const n07 = this._v[2] * this._v[11] - this._v[10] * this._v[3]; const n08 = this._v[2] * this._v[15] - this._v[14] * this._v[3]; const n09 = this._v[6] * this._v[11] - this._v[10] * this._v[7]; const n10 = this._v[6] * this._v[15] - this._v[14] * this._v[7]; const n11 = this._v[10] * this._v[15] - this._v[14] * this._v[11]; const det = n00 * n11 - n01 * n10 + n02 * n09 + n03 * n08 - n04 * n07 + n05 * n06; if (det === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('the determinant is 0!'); } const m00 = (this._v[5] * n11 - this._v[9] * n10 + this._v[13] * n09) / det; const m01 = (this._v[8] * n10 - this._v[4] * n11 - this._v[12] * n09) / det; const m02 = (this._v[7] * n05 - this._v[11] * n04 + this._v[15] * n03) / det; const m03 = (this._v[10] * n04 - this._v[6] * n05 - this._v[14] * n03) / det; const m10 = (this._v[9] * n08 - this._v[1] * n11 - this._v[13] * n07) / det; const m11 = (this._v[0] * n11 - this._v[8] * n08 + this._v[12] * n07) / det; const m12 = (this._v[11] * n02 - this._v[3] * n05 - this._v[15] * n01) / det; const m13 = (this._v[2] * n05 - this._v[10] * n02 + this._v[14] * n01) / det; const m20 = (this._v[1] * n10 - this._v[5] * n08 + this._v[13] * n06) / det; const m21 = (this._v[4] * n08 - this._v[0] * n10 - this._v[12] * n06) / det; const m22 = (this._v[3] * n04 - this._v[7] * n02 + this._v[15] * n00) / det; const m23 = (this._v[6] * n02 - this._v[2] * n04 - this._v[14] * n00) / det; const m30 = (this._v[5] * n07 - this._v[1] * n09 - this._v[9] * n06) / det; const m31 = (this._v[0] * n09 - this._v[4] * n07 + this._v[8] * n06) / det; const m32 = (this._v[7] * n01 - this._v[3] * n03 - this._v[11] * n00) / det; const m33 = (this._v[2] * n03 - this._v[6] * n01 + this._v[10] * n00) / det; return this.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } translate(vec) { return this.setComponents(1, 0, 0, vec._v[0], 0, 1, 0, vec._v[1], 0, 0, 1, vec._v[2], 0, 0, 0, 1); } putTranslate(vec) { this._v[12] = vec._v[0]; this._v[13] = vec._v[1]; this._v[14] = vec._v[2]; return this; } addTranslate(vec) { this._v[12] += vec._v[0]; this._v[13] += vec._v[1]; this._v[14] += vec._v[2]; return this; } /** * Create X oriented Rotation Matrix */ rotateX(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(1, 0, 0, 0, 0, cos, -sin, 0, 0, sin, cos, 0, 0, 0, 0, 1); } /** * Create Y oriented Rotation Matrix */ rotateY(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(cos, 0, sin, 0, 0, 1, 0, 0, -sin, 0, cos, 0, 0, 0, 0, 1); } /** * Create Z oriented Rotation Matrix */ rotateZ(radian) { const cos = Math.cos(radian); const sin = Math.sin(radian); return this.setComponents(cos, -sin, 0, 0, sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } rotateXYZ(x, y, z) { const cosX = Math.cos(x); const sinX = Math.sin(x); const cosY = Math.cos(y); const sinY = Math.sin(y); const cosZ = Math.cos(z); const sinZ = Math.sin(z); // const x00 = 1; // const x01 = 0; // const x02 = 0; // const x10 = 0; const x11 = cosX; const x12 = -sinX; // const x20 = 0; const x21 = sinX; const x22 = cosX; const y00 = cosY; // const y01 = 0; const y02 = sinY; // const y10 = 0; // const y11 = 1; // const y12 = 0; const y20 = -sinY; // const y21 = 0; const y22 = cosY; const z00 = cosZ; const z01 = -sinZ; // const z02 = 0; const z10 = sinZ; const z11 = cosZ; // const z12 = 0; // const z20 = 0; // const z21 = 0; // const z22 = 1; // Y * X const yx00 = y00; const yx01 = y02 * x21; const yx02 = y02 * x22; //const yx10 = 0; const yx11 = x11; const yx12 = x12; const yx20 = y20; const yx21 = y22 * x21; const yx22 = y22 * x22; // Z * Y * X const m00 = z00 * yx00; const m01 = z00 * yx01 + z01 * yx11; const m02 = z00 * yx02 + z01 * yx12; const m10 = z10 * yx00; const m11 = z10 * yx01 + z11 * yx11; const m12 = z10 * yx02 + z11 * yx12; const m20 = yx20; const m21 = yx21; const m22 = yx22; const m03 = 0; const m13 = 0; const m23 = 0; const m30 = 0; const m31 = 0; const m32 = 0; const m33 = 1; return this.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } rotate(vec) { return this.rotateXYZ(vec._v[0], vec._v[1], vec._v[2]); } scale(vec) { return this.setComponents(vec._v[0], 0, 0, 0, 0, vec._v[1], 0, 0, 0, 0, vec._v[2], 0, 0, 0, 0, 1); } multiplyScale(vec) { this._v[0] *= vec._v[0]; this._v[4] *= vec._v[0]; this._v[8] *= vec._v[0]; this._v[12] *= vec._v[0]; this._v[1] *= vec._v[1]; this._v[5] *= vec._v[1]; this._v[9] *= vec._v[1]; this._v[13] *= vec._v[1]; this._v[2] *= vec._v[2]; this._v[6] *= vec._v[2]; this._v[10] *= vec._v[2]; this._v[14] *= vec._v[2]; return this; } /** * multiply the input matrix from right side */ multiply(mat) { if (mat.isIdentityMatrixClass) { return this; } const m00 = this._v[0] * mat._v[0] + this._v[4] * mat._v[1] + this._v[8] * mat._v[2] + this._v[12] * mat._v[3]; const m01 = this._v[0] * mat._v[4] + this._v[4] * mat._v[5] + this._v[8] * mat._v[6] + this._v[12] * mat._v[7]; const m02 = this._v[0] * mat._v[8] + this._v[4] * mat._v[9] + this._v[8] * mat._v[10] + this._v[12] * mat._v[11]; const m03 = this._v[0] * mat._v[12] + this._v[4] * mat._v[13] + this._v[8] * mat._v[14] + this._v[12] * mat._v[15]; const m10 = this._v[1] * mat._v[0] + this._v[5] * mat._v[1] + this._v[9] * mat._v[2] + this._v[13] * mat._v[3]; const m11 = this._v[1] * mat._v[4] + this._v[5] * mat._v[5] + this._v[9] * mat._v[6] + this._v[13] * mat._v[7]; const m12 = this._v[1] * mat._v[8] + this._v[5] * mat._v[9] + this._v[9] * mat._v[10] + this._v[13] * mat._v[11]; const m13 = this._v[1] * mat._v[12] + this._v[5] * mat._v[13] + this._v[9] * mat._v[14] + this._v[13] * mat._v[15]; const m20 = this._v[2] * mat._v[0] + this._v[6] * mat._v[1] + this._v[10] * mat._v[2] + this._v[14] * mat._v[3]; const m21 = this._v[2] * mat._v[4] + this._v[6] * mat._v[5] + this._v[10] * mat._v[6] + this._v[14] * mat._v[7]; const m22 = this._v[2] * mat._v[8] + this._v[6] * mat._v[9] + this._v[10] * mat._v[10] + this._v[14] * mat._v[11]; const m23 = this._v[2] * mat._v[12] + this._v[6] * mat._v[13] + this._v[10] * mat._v[14] + this._v[14] * mat._v[15]; const m30 = this._v[3] * mat._v[0] + this._v[7] * mat._v[1] + this._v[11] * mat._v[2] + this._v[15] * mat._v[3]; const m31 = this._v[3] * mat._v[4] + this._v[7] * mat._v[5] + this._v[11] * mat._v[6] + this._v[15] * mat._v[7]; const m32 = this._v[3] * mat._v[8] + this._v[7] * mat._v[9] + this._v[11] * mat._v[10] + this._v[15] * mat._v[11]; const m33 = this._v[3] * mat._v[12] + this._v[7] * mat._v[13] + this._v[11] * mat._v[14] + this._v[15] * mat._v[15]; return this.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } multiplyByLeft(mat) { if (mat.isIdentityMatrixClass) { return this; } const m00 = mat._v[0] * this._v[0] + mat._v[4] * this._v[1] + mat._v[8] * this._v[2] + mat._v[12] * this._v[3]; const m01 = mat._v[0] * this._v[4] + mat._v[4] * this._v[5] + mat._v[8] * this._v[6] + mat._v[12] * this._v[7]; const m02 = mat._v[0] * this._v[8] + mat._v[4] * this._v[9] + mat._v[8] * this._v[10] + mat._v[12] * this._v[11]; const m03 = mat._v[0] * this._v[12] + mat._v[4] * this._v[13] + mat._v[8] * this._v[14] + mat._v[12] * this._v[15]; const m10 = mat._v[1] * this._v[0] + mat._v[5] * this._v[1] + mat._v[9] * this._v[2] + mat._v[13] * this._v[3]; const m11 = mat._v[1] * this._v[4] + mat._v[5] * this._v[5] + mat._v[9] * this._v[6] + mat._v[13] * this._v[7]; const m12 = mat._v[1] * this._v[8] + mat._v[5] * this._v[9] + mat._v[9] * this._v[10] + mat._v[13] * this._v[11]; const m13 = mat._v[1] * this._v[12] + mat._v[5] * this._v[13] + mat._v[9] * this._v[14] + mat._v[13] * this._v[15]; const m20 = mat._v[2] * this._v[0] + mat._v[6] * this._v[1] + mat._v[10] * this._v[2] + mat._v[14] * this._v[3]; const m21 = mat._v[2] * this._v[4] + mat._v[6] * this._v[5] + mat._v[10] * this._v[6] + mat._v[14] * this._v[7]; const m22 = mat._v[2] * this._v[8] + mat._v[6] * this._v[9] + mat._v[10] * this._v[10] + mat._v[14] * this._v[11]; const m23 = mat._v[2] * this._v[12] + mat._v[6] * this._v[13] + mat._v[10] * this._v[14] + mat._v[14] * this._v[15]; const m30 = mat._v[3] * this._v[0] + mat._v[7] * this._v[1] + mat._v[11] * this._v[2] + mat._v[15] * this._v[3]; const m31 = mat._v[3] * this._v[4] + mat._v[7] * this._v[5] + mat._v[11] * this._v[6] + mat._v[15] * this._v[7]; const m32 = mat._v[3] * this._v[8] + mat._v[7] * this._v[9] + mat._v[11] * this._v[10] + mat._v[15] * this._v[11]; const m33 = mat._v[3] * this._v[12] + mat._v[7] * this._v[13] + mat._v[11] * this._v[14] + mat._v[15] * this._v[15]; return this.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } fromQuaternion(quat) { const sx = quat._v[0] * quat._v[0]; const sy = quat._v[1] * quat._v[1]; const sz = quat._v[2] * quat._v[2]; const cx = quat._v[1] * quat._v[2]; const cy = quat._v[0] * quat._v[2]; const cz = quat._v[0] * quat._v[1]; const wx = quat._v[3] * quat._v[0]; const wy = quat._v[3] * quat._v[1]; const wz = quat._v[3] * quat._v[2]; const m00 = 1.0 - 2.0 * (sy + sz); const m01 = 2.0 * (cz - wz); const m02 = 2.0 * (cy + wy); const m03 = 0; const m10 = 2.0 * (cz + wz); const m11 = 1.0 - 2.0 * (sx + sz); const m12 = 2.0 * (cx - wx); const m13 = 0; const m20 = 2.0 * (cy - wy); const m21 = 2.0 * (cx + wx); const m22 = 1.0 - 2.0 * (sx + sy); const m23 = 0; const m30 = 0; const m31 = 0; const m32 = 0; const m33 = 1; return this.setComponents(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33); } /** * Set values as Row Major * Note that WebGL matrix keeps the values in column major. * If you write 16 values in 4x4 style (4 values in each row), * It will becomes an intuitive handling. * @returns */ static fromCopy16RowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { const v = new Float32Array(16); v[0] = m00; v[4] = m01; v[8] = m02; v[12] = m03; v[1] = m10; v[5] = m11; v[9] = m12; v[13] = m13; v[2] = m20; v[6] = m21; v[10] = m22; v[14] = m23; v[3] = m30; v[7] = m31; v[11] = m32; v[15] = m33; return new MutableMatrix44(v); } /** * Set values as Column Major * Note that WebGL matrix keeps the values in column major. * @returns */ static fromCopy16ColumnMajor(m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33) { const v = new Float32Array(16); v[0] = m00; v[4] = m01; v[8] = m02; v[12] = m03; v[1] = m10; v[5] = m11; v[9] = m12; v[13] = m13; v[2] = m20; v[6] = m21; v[10] = m22; v[14] = m23; v[3] = m30; v[7] = m31; v[11] = m32; v[15] = m33; return new MutableMatrix44(v); } static fromCopyMatrix44(mat) { const v = new Float32Array(16); v.set(mat._v); return new MutableMatrix44(v); } static fromFloat32ArrayColumnMajor(float32Array) { return new MutableMatrix44(float32Array); } static fromCopyFloat32ArrayColumnMajor(float32Array) { const v = new Float32Array(16); v.set(float32Array); return new MutableMatrix44(v); } static fromCopyFloat32ArrayRowMajor(array) { const v = new Float32Array(16); v[0] = array[0]; v[4] = array[1]; v[8] = array[2]; v[12] = array[3]; v[1] = array[4]; v[5] = array[5]; v[9] = array[6]; v[13] = array[7]; v[2] = array[8]; v[6] = array[9]; v[10] = array[10]; v[14] = array[11]; v[3] = array[12]; v[7] = array[13]; v[11] = array[14]; v[15] = array[15]; return new MutableMatrix44(v); } static fromCopyMatrix33(mat) { const v = new Float32Array(16); v[0] = mat._v[0]; v[4] = mat._v[3]; v[8] = mat._v[6]; v[12] = 0; v[1] = mat._v[1]; v[5] = mat._v[4]; v[9] = mat._v[7]; v[13] = 0; v[2] = mat._v[2]; v[6] = mat._v[5]; v[10] = mat._v[8]; v[14] = 0; v[3] = 0; v[7] = 0; v[11] = 0; v[15] = 1; return new MutableMatrix44(v); } static fromCopyArray16ColumnMajor(array) { const v = new Float32Array(16); v.set(array); return new MutableMatrix44(v); } static fromCopyArrayColumnMajor(array) { const v = new Float32Array(16); v.set(array); return new MutableMatrix44(v); } static fromCopyArray16RowMajor(array) { const v = new Float32Array(16); v[0] = array[0]; v[4] = array[1]; v[8] = array[2]; v[12] = array[3]; v[1] = array[4]; v[5] = array[5]; v[9] = array[6]; v[13] = array[7]; v[2] = array[8]; v[6] = array[9]; v[10] = array[10]; v[14] = array[11]; v[3] = array[12]; v[7] = array[13]; v[11] = array[14]; v[15] = array[15]; return new MutableMatrix44(v); } static fromCopyArrayRowMajor(array) { const v = new Float32Array(16); v[0] = array[0]; v[4] = array[1]; v[8] = array[2]; v[12] = array[3]; v[1] = array[4]; v[5] = array[5]; v[9] = array[6]; v[13] = array[7]; v[2] = array[8]; v[6] = array[9]; v[10] = array[10]; v[14] = array[11]; v[3] = array[12]; v[7] = array[13]; v[11] = array[14]; v[15] = array[15]; return new MutableMatrix44(v); } static fromCopyQuaternion(q) { const sx = q._v[0] * q._v[0]; const sy = q._v[1] * q._v[1]; const sz = q._v[2] * q._v[2]; const cx = q._v[1] * q._v[2]; const cy = q._v[0] * q._v[2]; const cz = q._v[0] * q._v[1]; const wx = q._v[3] * q._v[0]; const wy = q._v[3] * q._v[1]; const wz = q._v[3] * q._v[2]; const v = new Float32Array(16); v[0] = 1.0 - 2.0 * (sy + sz); v[4] = 2.0 * (cz - wz); v[8] = 2.0 * (cy + wy); v[12] = 0; v[1] = 2.0 * (cz + wz); v[5] = 1.0 - 2.0 * (sx + sz); v[9] = 2.0 * (cx - wx); v[13] = 0; v[2] = 2.0 * (cy - wy); v[6] = 2.0 * (cx + wx); v[10] = 1.0 - 2.0 * (sx + sy); v[14] = 0; v[3] = 0; v[7] = 0; v[11] = 0; v[15] = 1; return new MutableMatrix44(v); } } /***/ }), /***/ "./src/foundation/math/MutableQuaternion.ts": /*!**************************************************!*\ !*** ./src/foundation/math/MutableQuaternion.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableQuaternion: () => (/* binding */ MutableQuaternion) /* harmony export */ }); /* harmony import */ var _Quaternion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class MutableQuaternion extends _Quaternion__WEBPACK_IMPORTED_MODULE_0__.Quaternion { constructor(x) { super(x); } set x(x) { this._v[0] = x; } get x() { return this._v[0]; } set y(y) { this._v[1] = y; } get y() { return this._v[1]; } set z(z) { this._v[2] = z; } get z() { return this._v[2]; } set w(w) { this._v[3] = w; } get w() { return this._v[3]; } get className() { return 'MutableQuaternion'; } static identity() { return MutableQuaternion.fromCopy4(0, 0, 0, 1); } static dummy() { return new this(new Float32Array(0)); } static invert(quat) { return super.invert(quat); } static qlerp(l_quat, r_quat, ratio) { return super.qlerp(l_quat, r_quat, ratio); } static lerp(l_quat, r_quat, ratio) { return super.lerp(l_quat, r_quat, ratio); } static axisAngle(vec, radian) { return super.axisAngle(vec, radian); } static fromMatrix(mat) { return super.fromMatrix(mat); } static fromPosition(vec) { return super.fromPosition(vec); } static add(l_quat, r_quat) { return super.add(l_quat, r_quat); } static subtract(l_quat, r_quat) { return super.subtract(l_quat, r_quat); } static multiply(l_quat, r_quat) { return super.multiply(l_quat, r_quat); } static multiplyNumber(quat, value) { return super.multiplyNumber(quat, value); } static divideNumber(quat, value) { return super.divideNumber(quat, value); } raw() { return this._v; } setAt(i, value) { this._v[i] = value; return this; } setComponents(x, y, z, w) { this._v[0] = x; this._v[1] = y; this._v[2] = z; this._v[3] = w; return this; } copyComponents(quat) { return this.setComponents(quat._v[0], quat._v[1], quat._v[2], quat._v[3]); } identity() { return this.setComponents(0, 0, 0, 1); } normalize() { const norm = this.length(); return this.divideNumber(norm); } invert() { const norm = this.length(); if (norm === 0.0) { return this; // [0, 0, 0, 0] } this._v[0] = -this._v[0] / norm; this._v[1] = -this._v[1] / norm; this._v[2] = -this._v[2] / norm; this._v[3] = this._v[3] / norm; return this; } qlerp(l_quat, r_quat, ratio) { let qr = l_quat._v[3] * r_quat._v[3] + l_quat._v[0] * r_quat._v[0] + l_quat._v[1] * r_quat._v[1] + l_quat._v[2] * r_quat._v[2]; const ss = 1.0 - qr * qr; if (ss === 0.0) { return this.copyComponents(l_quat); } else { if (qr > 1) { qr = 0.999; } else if (qr < -1) { qr = -0.999; } let ph = Math.acos(qr); let s2; if (qr < 0.0 && ph > Math.PI / 2.0) { qr = -l_quat._v[3] * r_quat._v[3] - l_quat._v[0] * r_quat._v[0] - l_quat._v[1] * r_quat._v[1] - l_quat._v[2] * r_quat._v[2]; ph = Math.acos(qr); s2 = (-1 * Math.sin(ph * ratio)) / Math.sin(ph); } else { s2 = Math.sin(ph * ratio) / Math.sin(ph); } const s1 = Math.sin(ph * (1.0 - ratio)) / Math.sin(ph); this._v[0] = l_quat._v[0] * s1 + r_quat._v[0] * s2; this._v[1] = l_quat._v[1] * s1 + r_quat._v[1] * s2; this._v[2] = l_quat._v[2] * s1 + r_quat._v[2] * s2; this._v[3] = l_quat._v[3] * s1 + r_quat._v[3] * s2; } return this; } lerp(l_quat, r_quat, ratio) { this._v[0] = l_quat._v[0] * (1 - ratio) + r_quat._v[0] * ratio; this._v[1] = l_quat._v[1] * (1 - ratio) + r_quat._v[1] * ratio; this._v[2] = l_quat._v[2] * (1 - ratio) + r_quat._v[2] * ratio; this._v[3] = l_quat._v[3] * (1 - ratio) + r_quat._v[3] * ratio; return this; } axisAngle(vec, radian) { const halfAngle = 0.5 * radian; const sin = Math.sin(halfAngle); const length = vec.length(); if (length === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_2__.Logger.error('0 division occurred!'); } this._v[3] = Math.cos(halfAngle); this._v[0] = (sin * vec._v[0]) / length; this._v[1] = (sin * vec._v[1]) / length; this._v[2] = (sin * vec._v[2]) / length; return this; } fromMatrix(mat) { let sx = Math.hypot(mat.m00, mat.m10, mat.m20); const sy = Math.hypot(mat.m01, mat.m11, mat.m21); const sz = Math.hypot(mat.m02, mat.m12, mat.m22); const det = mat.determinant(); if (det < 0) { sx = -sx; } const m = _MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.fromCopyMatrix44(mat); const invSx = 1 / sx; const invSy = 1 / sy; const invSz = 1 / sz; m.m00 *= invSx; m.m10 *= invSx; m.m20 *= invSx; m.m01 *= invSy; m.m11 *= invSy; m.m21 *= invSy; m.m02 *= invSz; m.m12 *= invSz; m.m22 *= invSz; const trace = m.m00 + m.m11 + m.m22; if (trace > 0) { const S = 0.5 / Math.sqrt(trace + 1.0); this._v[0] = (m.m21 - m.m12) * S; this._v[1] = (m.m02 - m.m20) * S; this._v[2] = (m.m10 - m.m01) * S; this._v[3] = 0.25 / S; } else if (m.m00 > m.m11 && m.m00 > m.m22) { const S = Math.sqrt(1.0 + m.m00 - m.m11 - m.m22) * 2; this._v[0] = 0.25 * S; this._v[1] = (m.m01 + m.m10) / S; this._v[2] = (m.m02 + m.m20) / S; this._v[3] = (m.m21 - m.m12) / S; } else if (m.m11 > m.m22) { const S = Math.sqrt(1.0 + m.m11 - m.m00 - m.m22) * 2; this._v[0] = (m.m01 + m.m10) / S; this._v[1] = 0.25 * S; this._v[2] = (m.m12 + m.m21) / S; this._v[3] = (m.m02 - m.m20) / S; } else { const S = Math.sqrt(1.0 + m.m22 - m.m00 - m.m11) * 2; this._v[0] = (m.m02 + m.m20) / S; this._v[1] = (m.m12 + m.m21) / S; this._v[2] = 0.25 * S; this._v[3] = (m.m10 - m.m01) / S; } return this; } fromPosition(vec) { return this.setComponents(vec._v[0], vec._v[1], vec._v[2], 0); } add(quat) { this._v[0] += quat._v[0]; this._v[1] += quat._v[1]; this._v[2] += quat._v[2]; this._v[3] += quat._v[3]; return this; } subtract(quat) { this._v[0] -= quat._v[0]; this._v[1] -= quat._v[1]; this._v[2] -= quat._v[2]; this._v[3] -= quat._v[3]; return this; } multiply(quat) { const x = quat._v[3] * this._v[0] + quat._v[2] * this._v[1] + quat._v[1] * this._v[2] - quat._v[0] * this._v[3]; const y = -quat._v[2] * this._v[0] + quat._v[3] * this._v[1] + quat._v[0] * this._v[2] - quat._v[1] * this._v[3]; const z = quat._v[1] * this._v[0] + quat._v[0] * this._v[1] + quat._v[3] * this._v[2] - quat._v[2] * this._v[3]; const w = -quat._v[0] * this._v[0] - quat._v[1] * this._v[1] - quat._v[2] * this._v[2] - quat._v[3] * this._v[3]; return this.setComponents(x, y, z, w); } multiplyNumber(value) { this._v[0] *= value; this._v[1] *= value; this._v[2] *= value; this._v[3] *= value; return this; } divideNumber(value) { if (value !== 0) { this._v[0] /= value; this._v[1] /= value; this._v[2] /= value; this._v[3] /= value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_2__.Logger.error('0 division occurred!'); this._v[0] = Infinity; this._v[1] = Infinity; this._v[2] = Infinity; this._v[3] = Infinity; } return this; } clone() { return MutableQuaternion.fromCopy4(this._v[0], this._v[1], this._v[2], this._v[3]); } static fromFloat32Array(array) { return new MutableQuaternion(array); } static fromCopyArray4(array) { return new MutableQuaternion(new Float32Array(array)); } static fromCopyArray(array) { return new MutableQuaternion(new Float32Array(array.slice(0, 4))); } static fromCopy4(x, y, z, w) { return new MutableQuaternion(new Float32Array([x, y, z, w])); } static fromCopyQuaternion(quat) { const v = new Float32Array(4); v[0] = quat._v[0]; v[1] = quat._v[1]; v[2] = quat._v[2]; v[3] = quat._v[3]; return new MutableQuaternion(v); } static fromCopyVector4(vec) { const v = new Float32Array(4); v[0] = vec._v[0]; v[1] = vec._v[1]; v[2] = vec._v[2]; v[3] = vec._v[3]; return new MutableQuaternion(v); } static fromCopyLogQuaternion(x) { const theta = x._v[0] * x._v[0] + x._v[1] * x._v[1] + x._v[2] * x._v[2]; const sin = Math.sin(theta); const v = new Float32Array(4); v[0] = x._v[0] * (sin / theta); v[1] = x._v[1] * (sin / theta); v[2] = x._v[2] * (sin / theta); v[3] = Math.cos(theta); return new MutableQuaternion(v); } } /***/ }), /***/ "./src/foundation/math/MutableScalar.ts": /*!**********************************************!*\ !*** ./src/foundation/math/MutableScalar.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableScalar: () => (/* binding */ MutableScalar), /* harmony export */ MutableScalar_: () => (/* binding */ MutableScalar_), /* harmony export */ MutableScalard: () => (/* binding */ MutableScalard) /* harmony export */ }); /* harmony import */ var _Scalar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /** * @internal */ class MutableScalar_ extends _Scalar__WEBPACK_IMPORTED_MODULE_0__.Scalar_ { constructor(x, { type }) { super(x, { type }); } copyComponents(vec) { this._v[0] = vec._v[0]; } get x() { return this._v[0]; } set x(x) { this._v[0] = x; } get y() { return 0; } get z() { return 0; } get w() { return 1; } /** * change to string */ toString() { return '(' + this._v[0] + ')'; } setValue(value) { this.x = value; return this; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Scalar; } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } } /** * Mutable Scalar class with 32bit float components */ class MutableScalar extends MutableScalar_ { constructor(x) { super(x, { type: Float32Array }); } clone() { return new MutableScalar(new Float32Array([this.x])); } static one() { return new MutableScalar(new Float32Array([1])); } static dummy() { return new MutableScalar(new Float32Array([])); } static zero() { return new MutableScalar(new Float32Array([0])); } get className() { return 'MutableScalar'; } } /** * Mutable Scalar class with 64bit float components */ class MutableScalard extends MutableScalar_ { constructor(x) { super(x, { type: Float64Array }); } clone() { return new MutableScalard(new Float64Array([this.x])); } static one() { return new MutableScalard(new Float64Array([1])); } static dummy() { return new MutableScalard(new Float64Array([])); } static zero() { return new MutableScalard(new Float64Array([0])); } } /***/ }), /***/ "./src/foundation/math/MutableVector2.ts": /*!***********************************************!*\ !*** ./src/foundation/math/MutableVector2.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableVector2: () => (/* binding */ MutableVector2), /* harmony export */ MutableVector2_: () => (/* binding */ MutableVector2_), /* harmony export */ MutableVector2d: () => (/* binding */ MutableVector2d) /* harmony export */ }); /* harmony import */ var _Vector2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * @internal */ class MutableVector2_ extends _Vector2__WEBPACK_IMPORTED_MODULE_0__.Vector2_ { constructor(x, { type }) { super(x, { type }); } set x(x) { this._v[0] = x; } get x() { return this._v[0]; } set y(y) { this._v[1] = y; } get y() { return this._v[1]; } get z() { return 0; } get w() { return 1; } raw() { return this._v; } setAt(i, value) { this._v[i] = value; return this; } setComponents(x, y) { this._v[0] = x; this._v[1] = y; return this; } copyComponents(vec) { return this.setComponents(vec._v[0], vec._v[1]); } zero() { return this.setComponents(0, 0); } one() { return this.setComponents(1, 1); } normalize() { const length = this.length(); this.divide(length); return this; } /** * add value */ add(vec) { this._v[0] += vec._v[0]; this._v[1] += vec._v[1]; return this; } /** * subtract */ subtract(vec) { this._v[0] -= vec._v[0]; this._v[1] -= vec._v[1]; return this; } /** * multiply */ multiply(value) { this._v[0] *= value; this._v[1] *= value; return this; } /** * multiply vector */ multiplyVector(vec) { this._v[0] *= vec._v[0]; this._v[1] *= vec._v[1]; return this; } /** * divide */ divide(value) { if (value !== 0) { this._v[0] /= value; this._v[1] /= value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('0 division occurred!'); this._v[0] = Infinity; this._v[1] = Infinity; } return this; } /** * divide vector */ divideVector(vec) { if (vec._v[0] !== 0 && vec._v[1] !== 0) { this._v[0] /= vec._v[0]; this._v[1] /= vec._v[1]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('0 division occurred!'); this._v[0] = vec._v[0] === 0 ? Infinity : this._v[0] / vec._v[0]; this._v[1] = vec._v[1] === 0 ? Infinity : this._v[1] / vec._v[1]; } return this; } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } } /** * Mutable 2D(x,y) Vector class with 32bit float components */ class MutableVector2 extends MutableVector2_ { constructor(x) { super(x, { type: Float32Array }); } static fromCopyArray2(array) { return new MutableVector2(new Float32Array(array)); } static fromCopyArray(array) { return new MutableVector2(new Float32Array(array.slice(0, 2))); } static fromFloat32Array(float32Array) { return new MutableVector2(float32Array); } static fromCopyFloat32Array(float32Array) { return new MutableVector2(new Float32Array(float32Array.buffer.slice(0))); } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } get className() { return 'MutableVector2'; } clone() { return super.clone(); } } /** * Mutable 2D(x,y) Vector class with 64bit float components */ class MutableVector2d extends MutableVector2_ { constructor(x) { super(x, { type: Float64Array }); } static fromCopyArray(array) { return new MutableVector2d(new Float64Array(array)); } static zero() { return super._zero(Float64Array); } static one() { return super._one(Float64Array); } static dummy() { return super._dummy(Float64Array); } static normalize(vec) { return super._normalize(vec, Float64Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float64Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float64Array); } static multiply(vec, value) { return super._multiply(vec, value, Float64Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float64Array); } static divide(vec, value) { return super._divide(vec, value, Float64Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float64Array); } clone() { return super.clone(); } } /***/ }), /***/ "./src/foundation/math/MutableVector3.ts": /*!***********************************************!*\ !*** ./src/foundation/math/MutableVector3.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableVector3: () => (/* binding */ MutableVector3), /* harmony export */ MutableVector3_: () => (/* binding */ MutableVector3_), /* harmony export */ MutableVector3d: () => (/* binding */ MutableVector3d) /* harmony export */ }); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * @internal */ class MutableVector3_ extends _Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3_ { constructor(v, { type }) { super(v, { type }); } set x(x) { this._v[0] = x; } get x() { return this._v[0]; } set y(y) { this._v[1] = y; } get y() { return this._v[1]; } set z(z) { this._v[2] = z; } get z() { return this._v[2]; } get w() { return 1; } raw() { return this._v; } setAt(i, value) { this._v[i] = value; return this; } setComponents(x, y, z) { this._v[0] = x; this._v[1] = y; this._v[2] = z; return this; } copyComponents(vec) { return this.setComponents(vec._v[0], vec._v[1], vec._v[2]); } zero() { return this.setComponents(0, 0, 0); } one() { return this.setComponents(1, 1, 1); } /** * normalize */ normalize() { const length = this.length(); this.divide(length); return this; } /** * add value */ add(vec) { this._v[0] += vec._v[0]; this._v[1] += vec._v[1]; this._v[2] += vec._v[2]; return this; } /** * subtract */ subtract(vec) { this._v[0] -= vec._v[0]; this._v[1] -= vec._v[1]; this._v[2] -= vec._v[2]; return this; } /** * multiply */ multiply(value) { this._v[0] *= value; this._v[1] *= value; this._v[2] *= value; return this; } /** * multiply vector */ multiplyVector(vec) { this._v[0] *= vec._v[0]; this._v[1] *= vec._v[1]; this._v[2] *= vec._v[2]; return this; } /** * divide */ divide(value) { if (value !== 0) { this._v[0] /= value; this._v[1] /= value; this._v[2] /= value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('0 division occurred!'); this._v[0] = Infinity; this._v[1] = Infinity; this._v[2] = Infinity; } return this; } /** * divide vector */ divideVector(vec) { if (vec._v[0] !== 0 && vec._v[1] !== 0 && vec._v[2] !== 0) { this._v[0] /= vec._v[0]; this._v[1] /= vec._v[1]; this._v[2] /= vec._v[2]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('0 division occurred!'); this._v[0] = vec._v[0] === 0 ? Infinity : this._v[0] / vec._v[0]; this._v[1] = vec._v[1] === 0 ? Infinity : this._v[1] / vec._v[1]; this._v[2] = vec._v[2] === 0 ? Infinity : this._v[2] / vec._v[2]; } return this; } /** * cross product */ cross(vec) { const x = this._v[1] * vec._v[2] - this._v[2] * vec._v[1]; const y = this._v[2] * vec._v[0] - this._v[0] * vec._v[2]; const z = this._v[0] * vec._v[1] - this._v[1] * vec._v[0]; return this.setComponents(x, y, z); } /** * quaternion * vector3 */ multiplyQuaternion(quat) { const num = quat._v[0] * 2; const num2 = quat._v[1] * 2; const num3 = quat._v[2] * 2; const num4 = quat._v[0] * num; const num5 = quat._v[1] * num2; const num6 = quat._v[2] * num3; const num7 = quat._v[0] * num2; const num8 = quat._v[0] * num3; const num9 = quat._v[1] * num3; const num10 = quat._v[3] * num; const num11 = quat._v[3] * num2; const num12 = quat._v[3] * num3; const x = (1 - (num5 + num6)) * this._v[0] + (num7 - num12) * this._v[1] + (num8 + num11) * this._v[2]; const y = (num7 + num12) * this._v[0] + (1 - (num4 + num6)) * this._v[1] + (num9 - num10) * this._v[2]; const z = (num8 - num11) * this._v[0] + (num9 + num10) * this._v[1] + (1 - (num4 + num5)) * this._v[2]; return this.setComponents(x, y, z); } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } static _fromCopy3(x, y, z, type) { return new this(new type([x, y, z]), { type }); } } /** * Mutable 3D(x,y,z) Vector class with 32bit float components */ class MutableVector3 extends MutableVector3_ { constructor(v) { super(v, { type: Float32Array }); } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } static cross(l_vec, r_vec) { return super._cross(l_vec, r_vec, Float32Array); } static multiplyQuaternion(quat, vec) { return super._multiplyQuaternion(quat, vec, Float32Array); } get className() { return 'MutableVector3'; } static fromCopy3(x, y, z) { return super._fromCopy3(x, y, z, Float32Array); } static fromCopy1(val) { return super._fromCopy3(val, val, val, Float32Array); } static fromCopyArray3(array) { return new MutableVector3(new Float32Array(array)); } static fromCopyArray(array) { return new MutableVector3(new Float32Array(array.slice(0, 3))); } static fromFloat32Array(float32Array) { return new MutableVector3(float32Array); } static fromCopyFloat32Array(float32Array) { return new MutableVector3(new Float32Array(float32Array.buffer.slice(0))); } static fromCopyVector3(vec) { return super._fromCopyVector3(vec, Float32Array); } static fromCopyVector4(vec) { return super._fromCopyVector4(vec, Float32Array); } clone() { return super.clone(); } static rotateX(vec3, radian, outVec) { const c = Math.cos(radian); const s = Math.sin(radian); outVec.y = vec3.y * c - vec3.z * s; outVec.z = vec3.y * s + vec3.z * c; } static rotateY(vec3, radian, outVec) { const c = Math.cos(radian); const s = Math.sin(radian); outVec.x = vec3.x * c + vec3.z * s; outVec.z = -vec3.x * s + vec3.z * c; } static rotateZ(vec3, radian, outVec) { const c = Math.cos(radian); const s = Math.sin(radian); outVec.x = vec3.x * c - vec3.y * s; outVec.y = vec3.x * s + vec3.y * c; } } /** * Mutable 3D(x,y,z) Vector class with 64bit float components */ class MutableVector3d extends MutableVector3_ { constructor(x) { super(x, { type: Float64Array }); } static zero() { return super._zero(Float64Array); } static one() { return super._one(Float64Array); } static dummy() { return super._dummy(Float64Array); } static normalize(vec) { return super._normalize(vec, Float64Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float64Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float64Array); } static multiply(vec, value) { return super._multiply(vec, value, Float64Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float64Array); } static divide(vec, value) { return super._divide(vec, value, Float64Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float64Array); } static cross(l_vec, r_vec) { return super._cross(l_vec, r_vec, Float64Array); } static multiplyQuaternion(quat, vec) { return super._multiplyQuaternion(quat, vec, Float64Array); } static fromCopy3(x, y, z) { return super._fromCopy3(x, y, z, Float64Array); } static fromCopy1(val) { return super._fromCopy3(val, val, val, Float64Array); } static fromCopyArray3(array) { return new MutableVector3d(new Float64Array(array)); } static fromCopyArray(array) { return new MutableVector3d(new Float64Array(array.slice(0, 3))); } static rotateX(vec3, radian, outVec) { const c = Math.cos(radian); const s = Math.sin(radian); outVec.y = vec3.y * c - vec3.z * s; outVec.z = vec3.y * s + vec3.z * c; } static rotateY(vec3, radian, outVec) { const c = Math.cos(radian); const s = Math.sin(radian); outVec.x = vec3.x * c + vec3.z * s; outVec.z = -vec3.x * s + vec3.z * c; } static rotateZ(vec3, radian, outVec) { const c = Math.cos(radian); const s = Math.sin(radian); outVec.x = vec3.x * c - vec3.y * s; outVec.y = vec3.x * s + vec3.y * c; } clone() { return super.clone(); } } /***/ }), /***/ "./src/foundation/math/MutableVector4.ts": /*!***********************************************!*\ !*** ./src/foundation/math/MutableVector4.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MutableVector4: () => (/* binding */ MutableVector4), /* harmony export */ MutableVector4_: () => (/* binding */ MutableVector4_), /* harmony export */ MutableVector4d: () => (/* binding */ MutableVector4d) /* harmony export */ }); /* harmony import */ var _Vector4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * @internal */ class MutableVector4_ extends _Vector4__WEBPACK_IMPORTED_MODULE_0__.Vector4_ { constructor(x, { type }) { super(x, { type }); this.__updateCount = 0; } set x(x) { this._v[0] = x; this.__updateCount++; } get x() { return this._v[0]; } set y(y) { this._v[1] = y; this.__updateCount++; } get y() { return this._v[1]; } set z(z) { this._v[2] = z; this.__updateCount++; } get z() { return this._v[2]; } set w(w) { this._v[3] = w; this.__updateCount++; } get w() { return this._v[3]; } raw() { return this._v; } setAt(i, value) { this._v[i] = value; this.__updateCount++; return this; } setComponents(x, y, z, w) { this._v[0] = x; this._v[1] = y; this._v[2] = z; this._v[3] = w; this.__updateCount++; return this; } copyComponents(vec) { return this.setComponents(vec._v[0], vec._v[1], vec._v[2], vec._v[3]); } zero() { return this.setComponents(0, 0, 0, 0); } one() { return this.setComponents(1, 1, 1, 1); } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } /** * normalize */ normalize() { const length = this.length(); this.divide(length); return this; } normalize3() { const length = Math.hypot(this._v[0], this._v[1], this._v[2]); this.divide(length); return this; } /** * add value */ add(vec) { this._v[0] += vec._v[0]; this._v[1] += vec._v[1]; this._v[2] += vec._v[2]; this._v[3] += vec._v[3]; return this; } /** * subtract */ subtract(vec) { this._v[0] -= vec._v[0]; this._v[1] -= vec._v[1]; this._v[2] -= vec._v[2]; this._v[3] -= vec._v[3]; return this; } /** * multiply */ multiply(value) { this._v[0] *= value; this._v[1] *= value; this._v[2] *= value; this._v[3] *= value; return this; } /** * multiply vector */ multiplyVector(vec) { this._v[0] *= vec._v[0]; this._v[1] *= vec._v[1]; this._v[2] *= vec._v[2]; this._v[3] *= vec._v[3]; return this; } /** * divide */ divide(value) { if (value !== 0) { this._v[0] /= value; this._v[1] /= value; this._v[2] /= value; this._v[3] /= value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('0 division occurred!'); this._v[0] = Infinity; this._v[1] = Infinity; this._v[2] = Infinity; this._v[3] = Infinity; } return this; } /** * divide vector */ divideVector(vec) { if (vec._v[0] !== 0 && vec._v[1] !== 0 && vec._v[2] !== 0 && vec._v[3] !== 0) { this._v[0] /= vec._v[0]; this._v[1] /= vec._v[1]; this._v[2] /= vec._v[2]; this._v[3] /= vec._v[3]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('0 division occurred!'); this._v[0] = vec._v[0] === 0 ? Infinity : this._v[0] / vec._v[0]; this._v[1] = vec._v[1] === 0 ? Infinity : this._v[1] / vec._v[1]; this._v[2] = vec._v[2] === 0 ? Infinity : this._v[2] / vec._v[2]; this._v[3] = vec._v[3] === 0 ? Infinity : this._v[3] / vec._v[3]; } return this; } get _updateCount() { return this.__updateCount; } } /** * Mutable 4D(x,y,z,w) Vector class with 32bit float components */ class MutableVector4 extends MutableVector4_ { constructor(x) { super(x, { type: Float32Array }); } static fromCopyArray(array) { return new MutableVector4(new Float32Array(array).slice(0, 4)); } static fromCopyArray4(array) { return new MutableVector4(new Float32Array(array)); } static fromCopy4(x, y, z, w) { return new MutableVector4(new Float32Array([x, y, z, w])); } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } get className() { return 'MutableVector4'; } clone() { return new this.constructor(new this._v.constructor([this._v[0], this._v[1], this._v[2], this._v[3]])); } } /** * Mutable 4D(x,y,z,w) Vector class with 64bit float components */ class MutableVector4d extends MutableVector4_ { constructor(x) { super(x, { type: Float64Array }); } static zero() { return super._zero(Float64Array); } static one() { return super._one(Float64Array); } static dummy() { return super._dummy(Float64Array); } static normalize(vec) { return super._normalize(vec, Float64Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float64Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float64Array); } static multiply(vec, value) { return super._multiply(vec, value, Float64Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float64Array); } static divide(vec, value) { return super._divide(vec, value, Float64Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float64Array); } static fromCopyArray4(array) { return new MutableVector4d(new Float64Array(array)); } static fromCopyArray(array) { return new MutableVector4d(new Float64Array(array.slice(0, 4))); } static fromCopy4(x, y, z, w) { return new MutableVector4d(new Float64Array([x, y, z, w])); } clone() { return super.clone(); } } /***/ }), /***/ "./src/foundation/math/Quaternion.ts": /*!*******************************************!*\ !*** ./src/foundation/math/Quaternion.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Quaternion: () => (/* binding */ Quaternion) /* harmony export */ }); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _AbstractQuaternion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractQuaternion */ "./src/foundation/math/AbstractQuaternion.ts"); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _MutableVector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class Quaternion extends _AbstractQuaternion__WEBPACK_IMPORTED_MODULE_2__.AbstractQuaternion { constructor(x) { super(); this._v = x; } get className() { return 'Quaternion'; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4; } static identity() { return Quaternion.fromCopy4(0, 0, 0, 1); } static dummy() { return new this(new Float32Array(0)); } static invert(quat) { const norm = quat.length(); if (norm === 0.0) { return Quaternion.fromCopy4(0, 0, 0, 0); } const x = -quat._v[0] / norm; const y = -quat._v[1] / norm; const z = -quat._v[2] / norm; const w = quat._v[3] / norm; return Quaternion.fromCopy4(x, y, z, w); } static invertTo(quat, out) { const norm = quat.length(); if (norm === 0.0) { return out.setComponents(0, 0, 0, 0); } out._v[0] = -quat._v[0] / norm; out._v[1] = -quat._v[1] / norm; out._v[2] = -quat._v[2] / norm; out._v[3] = quat._v[3] / norm; return out; } /** * Compute spherical linear interpolation */ static qlerp(l_quat, r_quat, ratio) { let dotProduct = l_quat._v[0] * r_quat._v[0] + l_quat._v[1] * r_quat._v[1] + l_quat._v[2] * r_quat._v[2] + l_quat._v[3] * r_quat._v[3]; const ss = 1.0 - dotProduct * dotProduct; if (ss === 0.0) { return l_quat.clone(); } else { if (dotProduct > 1) { dotProduct = 0.999; } else if (dotProduct < -1) { dotProduct = -0.999; } let theta = Math.acos(dotProduct); const sinTheta = Math.sin(theta); let s2; if (dotProduct < 0.0) { dotProduct *= -1; theta = Math.acos(dotProduct); s2 = (-1 * Math.sin(theta * ratio)) / sinTheta; } else { s2 = Math.sin(theta * ratio) / sinTheta; } const s1 = Math.sin(theta * (1.0 - ratio)) / sinTheta; let x = l_quat._v[0] * s1 + r_quat._v[0] * s2; let y = l_quat._v[1] * s1 + r_quat._v[1] * s2; let z = l_quat._v[2] * s1 + r_quat._v[2] * s2; let w = l_quat._v[3] * s1 + r_quat._v[3] * s2; // normalize const length = Math.hypot(x, y, z, w); x = x / length; y = y / length; z = z / length; w = w / length; return Quaternion.fromCopy4(x, y, z, w); } } /** * Compute the spherical linear interpolation and output it as the fourth argument */ static qlerpTo(l_quat, r_quat, ratio, out) { let dotProduct = l_quat._v[0] * r_quat._v[0] + l_quat._v[1] * r_quat._v[1] + l_quat._v[2] * r_quat._v[2] + l_quat._v[3] * r_quat._v[3]; const ss = 1.0 - dotProduct * dotProduct; if (ss === 0.0) { return out.copyComponents(l_quat); } else { if (dotProduct > 1) { dotProduct = 0.999; } else if (dotProduct < -1) { dotProduct = -0.999; } let theta = Math.acos(dotProduct); const sinTheta = Math.sin(theta); let s2; if (dotProduct < 0.0) { dotProduct *= -1; theta = Math.acos(dotProduct); s2 = (-1 * Math.sin(theta * ratio)) / sinTheta; } else { s2 = Math.sin(theta * ratio) / sinTheta; } const s1 = Math.sin(theta * (1.0 - ratio)) / sinTheta; out._v[0] = l_quat._v[0] * s1 + r_quat._v[0] * s2; out._v[1] = l_quat._v[1] * s1 + r_quat._v[1] * s2; out._v[2] = l_quat._v[2] * s1 + r_quat._v[2] * s2; out._v[3] = l_quat._v[3] * s1 + r_quat._v[3] * s2; } return out.normalize(); } static lerp(l_quat, r_quat, ratio) { const x = l_quat._v[0] * (1 - ratio) + r_quat._v[0] * ratio; const y = l_quat._v[1] * (1 - ratio) + r_quat._v[1] * ratio; const z = l_quat._v[2] * (1 - ratio) + r_quat._v[2] * ratio; const w = l_quat._v[3] * (1 - ratio) + r_quat._v[3] * ratio; return Quaternion.fromCopy4(x, y, z, w); } static lerpTo(l_quat, r_quat, ratio, out) { out._v[0] = l_quat._v[0] * (1 - ratio) + r_quat._v[0] * ratio; out._v[1] = l_quat._v[1] * (1 - ratio) + r_quat._v[1] * ratio; out._v[2] = l_quat._v[2] * (1 - ratio) + r_quat._v[2] * ratio; out._v[3] = l_quat._v[3] * (1 - ratio) + r_quat._v[3] * ratio; return out; } static axisAngle(vec, radian) { const halfAngle = 0.5 * radian; const sin = Math.sin(halfAngle); const length = vec.length(); if (length === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); } return Quaternion.fromCopy4((sin * vec._v[0]) / length, (sin * vec._v[1]) / length, (sin * vec._v[2]) / length, Math.cos(halfAngle)); } static fromMatrix(mat) { let sx = Math.hypot(mat.m00, mat.m10, mat.m20); const sy = Math.hypot(mat.m01, mat.m11, mat.m21); const sz = Math.hypot(mat.m02, mat.m12, mat.m22); const det = mat.determinant(); if (det < 0) { sx = -sx; } const m = _MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__.MutableMatrix44.fromCopyMatrix44(mat); const invSx = 1 / sx; const invSy = 1 / sy; const invSz = 1 / sz; m.m00 *= invSx; m.m10 *= invSx; m.m20 *= invSx; m.m01 *= invSy; m.m11 *= invSy; m.m21 *= invSy; m.m02 *= invSz; m.m12 *= invSz; m.m22 *= invSz; const trace = m.m00 + m.m11 + m.m22; if (trace > 0) { const S = 0.5 / Math.sqrt(trace + 1.0); const x = (m.m21 - m.m12) * S; const y = (m.m02 - m.m20) * S; const z = (m.m10 - m.m01) * S; const w = 0.25 / S; return Quaternion.fromCopy4(x, y, z, w); } else if (m.m00 > m.m11 && m.m00 > m.m22) { const S = Math.sqrt(1.0 + m.m00 - m.m11 - m.m22) * 2; const x = 0.25 * S; const y = (m.m01 + m.m10) / S; const z = (m.m02 + m.m20) / S; const w = (m.m21 - m.m12) / S; return Quaternion.fromCopy4(x, y, z, w); } else if (m.m11 > m.m22) { const S = Math.sqrt(1.0 + m.m11 - m.m00 - m.m22) * 2; const x = (m.m01 + m.m10) / S; const y = 0.25 * S; const z = (m.m12 + m.m21) / S; const w = (m.m02 - m.m20) / S; return Quaternion.fromCopy4(x, y, z, w); } else { const S = Math.sqrt(1.0 + m.m22 - m.m00 - m.m11) * 2; const x = (m.m02 + m.m20) / S; const y = (m.m12 + m.m21) / S; const z = 0.25 * S; const w = (m.m10 - m.m01) / S; return Quaternion.fromCopy4(x, y, z, w); } } static fromMatrixTo(mat, out) { let sx = Math.hypot(mat.m00, mat.m10, mat.m20); const sy = Math.hypot(mat.m01, mat.m11, mat.m21); const sz = Math.hypot(mat.m02, mat.m12, mat.m22); const det = mat.determinant(); if (det < 0) { sx = -sx; } const m = _MutableMatrix44__WEBPACK_IMPORTED_MODULE_5__.MutableMatrix44.fromCopyMatrix44(mat); const invSx = 1 / sx; const invSy = 1 / sy; const invSz = 1 / sz; m.m00 *= invSx; m.m10 *= invSx; m.m20 *= invSx; m.m01 *= invSy; m.m11 *= invSy; m.m21 *= invSy; m.m02 *= invSz; m.m12 *= invSz; m.m22 *= invSz; const trace = m.m00 + m.m11 + m.m22; if (trace > 0) { const S = 0.5 / Math.sqrt(trace + 1.0); out._v[0] = (m.m21 - m.m12) * S; out._v[1] = (m.m02 - m.m20) * S; out._v[2] = (m.m10 - m.m01) * S; out._v[3] = 0.25 / S; } else if (m.m00 > m.m11 && m.m00 > m.m22) { const S = Math.sqrt(1.0 + m.m00 - m.m11 - m.m22) * 2; out._v[0] = 0.25 * S; out._v[1] = (m.m01 + m.m10) / S; out._v[2] = (m.m02 + m.m20) / S; out._v[3] = (m.m21 - m.m12) / S; } else if (m.m11 > m.m22) { const S = Math.sqrt(1.0 + m.m11 - m.m00 - m.m22) * 2; out._v[0] = (m.m01 + m.m10) / S; out._v[1] = 0.25 * S; out._v[2] = (m.m12 + m.m21) / S; out._v[3] = (m.m02 - m.m20) / S; } else { const S = Math.sqrt(1.0 + m.m22 - m.m00 - m.m11) * 2; out._v[0] = (m.m02 + m.m20) / S; out._v[1] = (m.m12 + m.m21) / S; out._v[2] = 0.25 * S; out._v[3] = (m.m10 - m.m01) / S; } return out; } static lookFromTo(fromDirection, toDirection) { if (fromDirection.isEqual(toDirection)) { return Quaternion.fromCopy4(0, 0, 0, 1); } return this.qlerp(this.lookForward(fromDirection), this.lookForward(toDirection), 1); } static lookForward(forward) { if (Quaternion.__tmp_upVec == null) { Quaternion.__tmp_upVec = new forward.constructor(0, 1, 0); } return this.lookForwardAccordingToThisUp(forward, Quaternion.__tmp_upVec); } static lookForwardAccordingToThisUp(forward, up) { const forwardLength = forward.length(); if (forwardLength === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); } const forwardX = forward._v[0] / forwardLength; const forwardY = forward._v[1] / forwardLength; const forwardZ = forward._v[2] / forwardLength; const upLength = up.length(); if (upLength === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); } const upX = up._v[0] / upLength; const upY = up._v[1] / upLength; const upZ = up._v[2] / upLength; // Vector3.cross(up, forward) let rightX = up._v[1] * forward._v[2] - up._v[2] * forward._v[1]; let rightY = up._v[2] * forward._v[0] - up._v[0] * forward._v[2]; let rightZ = up._v[0] * forward._v[1] - up._v[1] * forward._v[0]; const rightLength = Math.hypot(rightX, rightY, rightZ); if (rightLength === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); } rightX /= rightLength; rightY /= rightLength; rightZ /= rightLength; const m00 = rightX; const m01 = rightY; const m02 = rightZ; const m10 = upX; const m11 = upY; const m12 = upZ; const m20 = forwardX; const m21 = forwardY; const m22 = forwardZ; const num8 = m00 + m11 + m22; if (num8 > 0) { const num = Math.sqrt(num8 + 1); const num2 = 0.5 / num; return Quaternion.fromCopy4((m12 - m21) * num2, (m20 - m02) * num2, (m01 - m10) * num2, num * 0.5); } else if (m00 >= m11 && m00 >= m22) { const num7 = Math.sqrt(1 + m00 - m11 - m22); const num4 = 0.5 / num7; return Quaternion.fromCopy4(0.5 * num7, (m01 + m10) * num4, (m02 + m20) * num4, (m12 - m21) * num4); } else if (m11 > m22) { const num6 = Math.sqrt(1 + m11 - m00 - m22); const num3 = 0.5 / num6; return Quaternion.fromCopy4((m10 + m01) * num3, 0.5 * num6, (m21 + m12) * num3, (m20 - m02) * num3); } else { const num5 = Math.sqrt(1 + m22 - m00 - m11); const num2 = 0.5 / num5; return Quaternion.fromCopy4((m20 + m02) * num2, (m21 + m12) * num2, 0.5 * num5, (m01 - m10) * num2); } } static fromPosition(vec) { return Quaternion.fromCopy4(vec._v[0], vec._v[1], vec._v[2], 0); } static add(l_quat, r_quat) { const x = l_quat._v[0] + r_quat._v[0]; const y = l_quat._v[1] + r_quat._v[1]; const z = l_quat._v[2] + r_quat._v[2]; const w = l_quat._v[3] + r_quat._v[3]; return Quaternion.fromCopy4(x, y, z, w); } static addTo(l_quat, r_quat, out) { out._v[0] = l_quat._v[0] + r_quat._v[0]; out._v[1] = l_quat._v[1] + r_quat._v[1]; out._v[2] = l_quat._v[2] + r_quat._v[2]; out._v[3] = l_quat._v[3] + r_quat._v[3]; return out; } static subtract(l_quat, r_quat) { const x = l_quat._v[0] - r_quat._v[0]; const y = l_quat._v[1] - r_quat._v[1]; const z = l_quat._v[2] - r_quat._v[2]; const w = l_quat._v[3] - r_quat._v[3]; return Quaternion.fromCopy4(x, y, z, w); } static subtractTo(l_quat, r_quat, out) { out._v[0] = l_quat._v[0] - r_quat._v[0]; out._v[1] = l_quat._v[1] - r_quat._v[1]; out._v[2] = l_quat._v[2] - r_quat._v[2]; out._v[3] = l_quat._v[3] - r_quat._v[3]; return out; } static multiply(l_quat, r_quat) { const x = r_quat._v[3] * l_quat._v[0] + r_quat._v[2] * l_quat._v[1] - r_quat._v[1] * l_quat._v[2] + r_quat._v[0] * l_quat._v[3]; const y = -r_quat._v[2] * l_quat._v[0] + r_quat._v[3] * l_quat._v[1] + r_quat._v[0] * l_quat._v[2] + r_quat._v[1] * l_quat._v[3]; const z = r_quat._v[1] * l_quat._v[0] - r_quat._v[0] * l_quat._v[1] + r_quat._v[3] * l_quat._v[2] + r_quat._v[2] * l_quat._v[3]; const w = -r_quat._v[0] * l_quat._v[0] - r_quat._v[1] * l_quat._v[1] - r_quat._v[2] * l_quat._v[2] + r_quat._v[3] * l_quat._v[3]; return Quaternion.fromCopy4(x, y, z, w); } static multiplyTo(l_quat, r_quat, out) { const x = r_quat._v[3] * l_quat._v[0] + r_quat._v[2] * l_quat._v[1] - r_quat._v[1] * l_quat._v[2] + r_quat._v[0] * l_quat._v[3]; const y = -r_quat._v[2] * l_quat._v[0] + r_quat._v[3] * l_quat._v[1] + r_quat._v[0] * l_quat._v[2] + r_quat._v[1] * l_quat._v[3]; const z = r_quat._v[1] * l_quat._v[0] - r_quat._v[0] * l_quat._v[1] + r_quat._v[3] * l_quat._v[2] + r_quat._v[2] * l_quat._v[3]; const w = -r_quat._v[0] * l_quat._v[0] - r_quat._v[1] * l_quat._v[1] - r_quat._v[2] * l_quat._v[2] + r_quat._v[3] * l_quat._v[3]; return out.setComponents(x, y, z, w); } static multiplyNumber(quat, value) { const x = quat._v[0] * value; const y = quat._v[1] * value; const z = quat._v[2] * value; const w = quat._v[3] * value; return Quaternion.fromCopy4(x, y, z, w); } static multiplyNumberTo(quat, value, out) { out._v[0] = quat._v[0] * value; out._v[1] = quat._v[1] * value; out._v[2] = quat._v[2] * value; out._v[3] = quat._v[3] * value; return out; } static divideNumber(quat, value) { if (value === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); } const x = quat._v[0] / value; const y = quat._v[1] / value; const z = quat._v[2] / value; const w = quat._v[3] / value; return Quaternion.fromCopy4(x, y, z, w); } static divideNumberTo(quat, value, out) { if (value === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); } out._v[0] = quat._v[0] / value; out._v[1] = quat._v[1] / value; out._v[2] = quat._v[2] / value; out._v[3] = quat._v[3] / value; return out; } toString() { return '(' + this._v[0] + ', ' + this._v[1] + ', ' + this._v[2] + ', ' + this._v[3] + ')'; } toStringApproximately() { return (_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[1]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[2]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[3]) + '\n'); } flattenAsArray() { return [this._v[0], this._v[1], this._v[2], this._v[3]]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(quat, delta = Number.EPSILON) { if (Math.abs(quat._v[0] - this._v[0]) < delta && Math.abs(quat._v[1] - this._v[1]) < delta && Math.abs(quat._v[2] - this._v[2]) < delta && Math.abs(quat._v[3] - this._v[3]) < delta) { return true; } else { return false; } } isStrictEqual(quat) { if (this._v[0] === quat._v[0] && this._v[1] === quat._v[1] && this._v[2] === quat._v[2] && this._v[3] === quat._v[3]) { return true; } else { return false; } } toEulerAnglesTo(out) { const t0 = 2 * (this._v[3] * this._v[0] + this._v[1] * this._v[2]); const t1 = 1 - 2 * (this._v[0] * this._v[0] + this._v[1] * this._v[1]); out._v[0] = Math.atan2(t0, t1); let t2 = 2 * (this._v[3] * this._v[1] - this._v[2] * this._v[0]); t2 = t2 > 1 ? 1 : t2; t2 = t2 < -1 ? -1 : t2; out._v[1] = Math.asin(t2); const t3 = 2 * (this._v[3] * this._v[2] + this._v[0] * this._v[1]); const t4 = 1 - 2 * (this._v[1] * this._v[1] + this._v[2] * this._v[2]); out._v[2] = Math.atan2(t3, t4); return out; } toEulerAngles() { const out = new _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3(new Float32Array(3)); const t0 = 2 * (this._v[3] * this._v[0] + this._v[1] * this._v[2]); const t1 = 1 - 2 * (this._v[0] * this._v[0] + this._v[1] * this._v[1]); out._v[0] = Math.atan2(t0, t1); let t2 = 2 * (this._v[3] * this._v[1] - this._v[2] * this._v[0]); t2 = t2 > 1 ? 1 : t2; t2 = t2 < -1 ? -1 : t2; out._v[1] = Math.asin(t2); const t3 = 2 * (this._v[3] * this._v[2] + this._v[0] * this._v[1]); const t4 = 1 - 2 * (this._v[1] * this._v[1] + this._v[2] * this._v[2]); out._v[2] = Math.atan2(t3, t4); return out; } /** * divide(static version) */ static _divide(vec, value) { let x; let y; let z; let w; if (value !== 0) { x = vec._v[0] / value; y = vec._v[1] / value; z = vec._v[2] / value; w = vec._v[3] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); x = Infinity; y = Infinity; z = Infinity; w = Infinity; } return Quaternion.fromCopy4(x, y, z, w); } /** * divide(static version) */ static _divideTo(vec, value, out) { let x; let y; let z; let w; if (value !== 0) { x = vec._v[0] / value; y = vec._v[1] / value; z = vec._v[2] / value; w = vec._v[3] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('0 division occurred!'); x = Infinity; y = Infinity; z = Infinity; w = Infinity; } out._v[0] = x; out._v[1] = y; out._v[2] = z; out._v[3] = w; return out; } /** * normalize(static version) */ static normalize(vec) { const length = vec.length(); return this._divide(vec, length); } /** * normalize(static version) */ static normalizeTo(vec, out) { const length = vec.length(); return this._divideTo(vec, length, out); } fromToRotation(from, to) { const v0 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(from); const v1 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(to); v0.normalize(); v1.normalize(); const d = v0.dot(v1); if (d > -1.0 + Number.EPSILON) { const s = Math.sqrt((1.0 + d) * 2.0); const invs = 1.0 / s; const c = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiply(v0.cross(v1), invs); this._v[0] = c.x; this._v[1] = c.y; this._v[2] = c.z; this._v[3] = s * 0.5; return Quaternion.normalize(this); } else { let axis = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(0, 1, 0); let axis2 = v0.cross(axis); if (axis2.length() < Number.EPSILON) { axis = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(1, 0, 0); axis2 = v0.cross(axis); } axis2.normalize(); return Quaternion.fromAxisAngle(axis2, Math.PI); } } static fromToRotation(from, to) { const v0 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(from); const v1 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(to); v0.normalize(); v1.normalize(); const d = v0.dot(v1); if (d > -1.0 + Number.EPSILON) { const s = Math.sqrt((1.0 + d) * 2.0); const invs = 1.0 / s; const c = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiply(v0.cross(v1), invs); return Quaternion.fromCopy4(c.x, c.y, c.z, s * 0.5); } else { let axis = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(0, 1, 0); let axis2 = v0.cross(axis); if (axis2.length() < Number.EPSILON) { axis = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(1, 0, 0); axis2 = v0.cross(axis); } axis2.normalize(); return Quaternion.fromAxisAngle(axis2, Math.PI); } } static fromToRotationTo(from, to, out) { const v0 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(from); const v1 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.fromCopyVector3(to); v0.normalize(); v1.normalize(); const d = v0.dot(v1); if (d > -1.0 + Number.EPSILON) { const s = Math.sqrt((1.0 + d) * 2.0); const invs = 1.0 / s; const c = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiplyTo(v0.cross(v1), invs, Quaternion.__tmp_vec3_0); out._v[0] = c.x; out._v[1] = c.y; out._v[2] = c.z; out._v[3] = s * 0.5; return out; } else { let axis = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(0, 1, 0); let axis2 = v0.cross(axis); if (axis2.length() < Number.EPSILON) { axis = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(1, 0, 0); axis2 = v0.cross(axis); } axis2.normalize(); return Quaternion.fromAxisAngleTo(axis2, Math.PI, out); } } transformVector3(v) { const u = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(this._v[0], this._v[1], this._v[2]); const uv = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.cross(u, v); const uuv = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.cross(u, uv); const uvw = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiply(uv, this._v[3]); const uuv_uvw = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.add(uuv, uvw); const uuv_uvw_2 = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiply(uuv_uvw, 2); return _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.add(v, uuv_uvw_2); } transformVector3To(v, out) { const u = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopy3(this._v[0], this._v[1], this._v[2]); const uv = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.crossTo(u, v, Quaternion.__tmp_vec3_0); const uuv = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.crossTo(u, uv, Quaternion.__tmp_vec3_1); const uvw = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiplyTo(uv, this._v[3], Quaternion.__tmp_vec3_2); const uuv_uvw = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.addTo(uuv, uvw, Quaternion.__tmp_vec3_3); const uuv_uvw_2 = _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiplyTo(uuv_uvw, 2, Quaternion.__tmp_vec3_4); return _Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.addTo(v, uuv_uvw_2, out); } transformVector3Inverse(v) { const inv = Quaternion.invert(this); return inv.transformVector3(v); } clone() { return Quaternion.fromCopy4(this._v[0], this._v[1], this._v[2], this._v[3]); } static fromFloat32Array(array) { return new Quaternion(array); } static fromCopyArray4(array) { return new Quaternion(new Float32Array(array)); } static fromCopyArray(array) { return new Quaternion(new Float32Array(array.slice(0, 4))); } static fromCopy4(x, y, z, w) { return new Quaternion(new Float32Array([x, y, z, w])); } static fromCopyQuaternion(quat) { const v = new Float32Array(4); v[0] = quat._v[0]; v[1] = quat._v[1]; v[2] = quat._v[2]; v[3] = quat._v[3]; return new Quaternion(v); } static fromCopyVector4(vec) { const v = new Float32Array(4); v[0] = vec._v[0]; v[1] = vec._v[1]; v[2] = vec._v[2]; v[3] = vec._v[3]; return new Quaternion(v); } static fromCopyLogQuaternion(x) { const theta = x._v[0] * x._v[0] + x._v[1] * x._v[1] + x._v[2] * x._v[2]; const sin = Math.sin(theta); const v = new Float32Array(4); v[0] = x._v[0] * (sin / theta); v[1] = x._v[1] * (sin / theta); v[2] = x._v[2] * (sin / theta); v[3] = Math.cos(theta); return new Quaternion(v); } static fromAxisAngle(axis, rad) { rad = rad * 0.5; const s = Math.sin(rad); return Quaternion.fromCopy4(s * axis.x, s * axis.y, s * axis.z, Math.cos(rad)); } static fromAxisAngleTo(axis, rad, out) { rad = rad * 0.5; const s = Math.sin(rad); out._v[0] = s * axis.x; out._v[1] = s * axis.y; out._v[2] = s * axis.z; out._v[3] = Math.cos(rad); return out; } } Quaternion.__tmp_upVec = undefined; Quaternion.__tmp_vec3_0 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.zero(); Quaternion.__tmp_vec3_1 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.zero(); Quaternion.__tmp_vec3_2 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.zero(); Quaternion.__tmp_vec3_3 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.zero(); Quaternion.__tmp_vec3_4 = _MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/math/Scalar.ts": /*!***************************************!*\ !*** ./src/foundation/math/Scalar.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Scalar: () => (/* binding */ Scalar), /* harmony export */ Scalar_: () => (/* binding */ Scalar_), /* harmony export */ Scalard: () => (/* binding */ Scalard) /* harmony export */ }); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _AbstractVector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbstractVector */ "./src/foundation/math/AbstractVector.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /** * @internal */ class Scalar_ extends _AbstractVector__WEBPACK_IMPORTED_MODULE_1__.AbstractVector { constructor(v, { type }) { super(); this._v = v; } getValue() { return this._v[0]; } getValueInArray() { return [this._v[0]]; } get x() { return this._v[0]; } get raw() { return this._v; } isStrictEqual(scalar) { if (this.x === scalar.x) { return true; } else { return false; } } isEqual(scalar, delta = Number.EPSILON) { if (Math.abs(scalar.x - this.x) < delta) { return true; } else { return false; } } get glslStrAsFloat() { return `${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this.x)}`; } get glslStrAsInt() { return `${Math.floor(this.x)}`; } static _fromCopyNumber(value, type) { return new this(new type([value]), { type }); } static _dummy(type) { return new this(new type(), { type }); } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_2__.CompositionType.Scalar; } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } } /** * Immutable Scalar class with 32bit float components */ class Scalar extends Scalar_ { constructor(x) { super(x, { type: Float32Array }); } static fromCopyNumber(value) { return super._fromCopyNumber(value, Float32Array); } static zero() { return Scalar.fromCopyNumber(0); } static one() { return Scalar.fromCopyNumber(1); } static dummy() { return super._dummy(Float32Array); } get className() { return 'Scalar'; } /** * change to string */ toString() { return '(' + this._v[0] + ')'; } clone() { return new Scalar(this._v); } } /** * Immutable Scalar class with 64bit float components */ class Scalard extends Scalar_ { constructor(x) { super(x, { type: Float64Array }); } static fromCopyNumber(value) { return super._fromCopyNumber(value, Float64Array); } static zero() { return Scalard.fromCopyNumber(0); } static one() { return Scalard.fromCopyNumber(1); } static dummy() { return super._dummy(Float64Array); } clone() { return new Scalard(this._v); } } /***/ }), /***/ "./src/foundation/math/Transform3D.ts": /*!********************************************!*\ !*** ./src/foundation/math/Transform3D.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Transform3D: () => (/* binding */ Transform3D) /* harmony export */ }); /* harmony import */ var _Matrix44__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _MutableVector3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _Quaternion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); class Transform3D { constructor(x) { // private _invMatrix: MutableMatrix44; // private _normalMatrix: MutableMatrix33; this.__is_position_updated = true; this.__is_scale_updated = true; this.__is_rotation_updated = true; this.__is_trs_matrix_updated = true; // private __is_inverse_trs_matrix_updated = true; // private __is_normal_trs_matrix_updated = true; this.__updateCount = 0; this.__position = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.dummy(); this.__scale = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.dummy(); this.__rotation = _MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__.MutableQuaternion.dummy(); this.__matrix = _MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.dummy(); // this._invMatrix = MutableMatrix44.dummy(); // this._normalMatrix = MutableMatrix33.dummy(); if (x !== undefined) { this.setTransform(x.positionInner, _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.fromCopyVector3(x.eulerAnglesInner), x.scaleInner, _MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__.MutableQuaternion.fromCopyQuaternion(x.rotationInner), x.matrixInner); } else { this.__position = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); this.__scale = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.one(); this.__rotation = _MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__.MutableQuaternion.identity(); this.__matrix = _MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.identity(); // this._invMatrix = MutableMatrix44.identity(); // this._normalMatrix = MutableMatrix33.identity(); } } isEqual(rhs, delta = Number.EPSILON) { return (this.positionInner.isEqual(rhs.positionInner, delta) && this.rotationInner.isEqual(rhs.rotationInner, delta) && this.scaleInner.isEqual(rhs.scaleInner, delta) && this.matrixInner.isEqual(rhs.matrixInner, delta)); } clone() { const clone = new Transform3D(this); return clone; } set position(vec) { this.__position.copyComponents(vec); this.__is_position_updated = true; this.__is_trs_matrix_updated = false; // this.__is_inverse_trs_matrix_updated = false; // this.__is_normal_trs_matrix_updated = false; this.__updateTransform(); } /** * return a copy of a local position vector */ get position() { return this.positionInner.clone(); } /** * return a local position vector */ get positionInner() { if (this.__is_position_updated) { return this.__position; } else if (this.__is_trs_matrix_updated) { this.__matrix.getTranslateTo(this.__position); this.__is_position_updated = true; } return this.__position; } set eulerAngles(vec) { // const rotationMat = Transform3D.__tmpMatrix44_0.rotate(vec); // this.rotation = Quaternion.fromMatrix(rotationMat); const sx = Math.sin(vec._v[0] * 0.5); const cx = Math.cos(vec._v[0] * 0.5); const sy = Math.sin(vec._v[1] * 0.5); const cy = Math.cos(vec._v[1] * 0.5); const sz = Math.sin(vec._v[2] * 0.5); const cz = Math.cos(vec._v[2] * 0.5); this.rotation = _MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__.MutableQuaternion.fromCopy4(sx * cy * cz - cx * sy * sz, cx * sy * cz + sx * cy * sz, cx * cy * sz - sx * sy * cz, cx * cy * cz + sx * sy * sz); } /** * return a copy of a local rotation (XYZ euler) vector */ get eulerAngles() { return this.eulerAnglesInner.clone(); } /** * return a local rotation (XYZ euler) vector */ get eulerAnglesInner() { // this._is_quaternion_updated return this.__rotation.toEulerAngles(); } set scale(vec) { this.__scale.copyComponents(vec); this.__is_scale_updated = true; this.__is_trs_matrix_updated = false; // this.__is_inverse_trs_matrix_updated = false; // this.__is_normal_trs_matrix_updated = false; this.__updateTransform(); } /** * return a copy of a local scale vector */ get scale() { return this.scaleInner.clone(); } /** * return a local scale vector */ get scaleInner() { if (this.__is_scale_updated) { return this.__scale; } else if (this.__is_trs_matrix_updated) { this.__matrix.getScaleTo(this.__scale); this.__is_scale_updated = true; } return this.__scale; } set rotation(quat) { this.__rotation.copyComponents(quat); this.__is_rotation_updated = true; this.__is_trs_matrix_updated = false; // this.__is_inverse_trs_matrix_updated = false; // this.__is_normal_trs_matrix_updated = false; this.__updateTransform(); } /** * return a copy of a local quaternion vector */ get rotation() { return this.rotationInner.clone(); } /** * return a local quaternion vector */ get rotationInner() { if (this.__is_rotation_updated) { return this.__rotation; } else if (!this.__is_rotation_updated) { if (this.__is_trs_matrix_updated) { this.__is_rotation_updated = true; this.__rotation.fromMatrix(this.__matrix); return this.__rotation; } } return this.__rotation; } __updateTransform() { this.__updateEulerAngles(); this.__updatePosition(); this.__updateScale(); //this.__updateMatrix(); this.__needUpdate(); } __updateEulerAngles() { if (!this.__is_rotation_updated && this.__is_trs_matrix_updated) { this.__rotation.fromMatrix(this.__matrix); this.__is_rotation_updated = true; } } __updatePosition() { if (!this.__is_position_updated && this.__is_trs_matrix_updated) { this.__matrix.getTranslateTo(this.__position); this.__is_position_updated = true; } } __updateScale() { if (!this.__is_scale_updated && this.__is_trs_matrix_updated) { this.__matrix.getScaleTo(this.__scale); this.__is_scale_updated = true; } } __updateMatrix() { if (!this.__is_trs_matrix_updated && this.__is_position_updated && this.__is_rotation_updated && this.__is_scale_updated) { const rotationMatrix = this.__matrix.fromQuaternion(this.__rotation); const scaleMat = Transform3D.__tmpMatrix44_0.scale(this.__scale); const rsMatrix = rotationMatrix.multiply(scaleMat); // rsMatrix references to this._matrix rsMatrix.putTranslate(this.__position); this.__is_trs_matrix_updated = true; } } set matrix(mat) { this.__matrix.copyComponents(mat); this.__is_trs_matrix_updated = true; this.__is_position_updated = false; this.__is_rotation_updated = false; this.__is_scale_updated = false; // this.__is_inverse_trs_matrix_updated = false; // this.__is_normal_trs_matrix_updated = false; this.__updateTransform(); } /** * return a copy of local transform matrix */ get matrix() { return this.matrixInner.clone(); } /** * return a local transform matrix */ get matrixInner() { if (this.__is_trs_matrix_updated) { return this.__matrix; } // Clear and set Scale const scale = this.scaleInner; const n00 = scale._v[0]; // const n01 = 0; // const n02 = 0; // const n03 = 0; // const n10 = 0; const n11 = scale._v[1]; // const n12 = 0; // const n13 = 0; // const n20 = 0; // const n21 = 0; const n22 = scale._v[2]; // const n23 = 0; // const n30 = 0; // const n31 = 0; // const n32 = 0; // const n33 = 1; const q = this.rotationInner; const sx = q._v[0] * q._v[0]; const sy = q._v[1] * q._v[1]; const sz = q._v[2] * q._v[2]; const cx = q._v[1] * q._v[2]; const cy = q._v[0] * q._v[2]; const cz = q._v[0] * q._v[1]; const wx = q._v[3] * q._v[0]; const wy = q._v[3] * q._v[1]; const wz = q._v[3] * q._v[2]; const m00 = 1.0 - 2.0 * (sy + sz); const m01 = 2.0 * (cz - wz); const m02 = 2.0 * (cy + wy); // const m03 = 0.0; const m10 = 2.0 * (cz + wz); const m11 = 1.0 - 2.0 * (sx + sz); const m12 = 2.0 * (cx - wx); // const m13 = 0.0; const m20 = 2.0 * (cy - wy); const m21 = 2.0 * (cx + wx); const m22 = 1.0 - 2.0 * (sx + sy); // const m23 = 0.0; // const m30 = 0.0; // const m31 = 0.0; // const m32 = 0.0; // const m33 = 1.0; const translate = this.positionInner; // TranslateMatrix * RotateMatrix * ScaleMatrix this.__matrix.m00 = m00 * n00; this.__matrix.m01 = m01 * n11; this.__matrix.m02 = m02 * n22; this.__matrix.m03 = translate.x; this.__matrix.m10 = m10 * n00; this.__matrix.m11 = m11 * n11; this.__matrix.m12 = m12 * n22; this.__matrix.m13 = translate.y; this.__matrix.m20 = m20 * n00; this.__matrix.m21 = m21 * n11; this.__matrix.m22 = m22 * n22; this.__matrix.m23 = translate.z; this.__matrix.m30 = 0; this.__matrix.m31 = 0; this.__matrix.m32 = 0; this.__matrix.m33 = 1; // const rotateMatrix = new Matrix44(this.quaternion); // const matrix = MutableMatrix44.multiply(rotateMatrix, Matrix44.scale(this.scale)); // matrix.m03 = this.translate.x; // matrix.m13 = this.translate.y; // matrix.m23 = this.translate.z; //this.__matrix.copyComponents(matrix); this.__is_trs_matrix_updated = true; return this.__matrix; } // /** // * return a copy of an inverse local transform matrix // */ // get inverseMatrix(): Matrix44 { // return this.inverseMatrixInner.clone(); // } // /** // * return an inverse local transform matrix // */ // get inverseMatrixInner() { // if (!this.__is_inverse_trs_matrix_updated) { // MutableMatrix44.invertTo(this.matrixInner, this._invMatrix); // this.__is_inverse_trs_matrix_updated = true; // } // return this._invMatrix; // } // get normalMatrix() { // return this.normalMatrixInner.clone(); // } // get normalMatrixInner() { // if (!this.__is_normal_trs_matrix_updated) { // const invertedMatrix44 = MutableMatrix44.invertTo( // this.matrixInner, // Transform3D.__tmpMatrix44_0 // ); // const newNormalMatrix = invertedMatrix44.transpose(); // this._normalMatrix.copyComponents(newNormalMatrix); // this.__is_normal_trs_matrix_updated = true; // } // return this._normalMatrix; // } __needUpdate() { this.__updateCount++; } get updateCount() { return this.__updateCount; } set rotateMatrix44(rotateMatrix) { this.rotation = Transform3D.__tmpQuaternion_0.fromMatrix(rotateMatrix); } get rotateMatrix44() { return _Matrix44__WEBPACK_IMPORTED_MODULE_0__.Matrix44.fromCopyQuaternion(this.rotation); } setPropertiesFromJson(arg) { let json = arg; if (typeof arg === 'string') { json = JSON.parse(arg); } for (const key in json) { if (json.hasOwnProperty(key) && key in this) { if (key === 'quaternion') { this['rotation'] = _Quaternion__WEBPACK_IMPORTED_MODULE_4__.Quaternion.fromCopyArray4(json[key]); } else if (key === 'matrix') { this[key] = _Matrix44__WEBPACK_IMPORTED_MODULE_0__.Matrix44.fromCopyArray16RowMajor(json[key]); } else { this[key] = _Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray(json[key]); } } } } setRotationFromNewUpAndFront(UpVec, FrontVec) { const yDir = UpVec; const xDir = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.crossTo(yDir, FrontVec, Transform3D.__tmpVector3_0); const zDir = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.crossTo(xDir, yDir, Transform3D.__tmpVector3_1); const rotateMatrix = Transform3D.__tmpMatrix44_0.setComponents(xDir.x, yDir.x, zDir.x, 0, xDir.y, yDir.y, zDir.y, 0, xDir.z, yDir.z, zDir.z, 0, 0, 0, 0, 1); this.rotateMatrix44 = rotateMatrix; } headToDirection(fromVec, toVec) { const fromDir = Transform3D.__tmpVector3_0.copyComponents(fromVec).normalize(); const toDir = Transform3D.__tmpVector3_1.copyComponents(toVec).normalize(); const rotationDir = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.crossTo(fromDir, toDir, Transform3D.__tmpVector3_2); const cosTheta = _Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.dot(fromDir, toDir); const theta = Math.acos(cosTheta); this.rotation = Transform3D.__tmpQuaternion_0.axisAngle(rotationDir, theta); } /** * Set multiple transform information at once. By using this method, * we reduce the cost of automatically updating other transform components inside this class. * This method may be useful for animation processing and so on. * * The transform components of these arguments must not be mutually discrepant. * for example. The transform components of matrix argument (translate, rotate/quaternion, scale) * must be equal to translate, rotate, scale, quaternion arguments. * And both rotate and quaternion arguments must be same rotation. * If there is an argument passed with null or undefined, it is interpreted as unchanged. * * @param {*} translate * @param {*} rotate * @param {*} scale * @param {*} quaternion * @param {*} matrix */ setTransform(translate, rotate, scale, quaternion, matrix) { this.__is_trs_matrix_updated = false; // this.__is_inverse_trs_matrix_updated = false; // this.__is_normal_trs_matrix_updated = false; // Matrix if (matrix != null) { this.__matrix = matrix.clone(); this.__is_trs_matrix_updated = true; this.__is_position_updated = false; this.__is_rotation_updated = false; this.__is_scale_updated = false; } // Translate if (translate != null) { this.__position = translate.clone(); this.__is_position_updated = true; } // Rotation if (rotate != null && quaternion != null) { this.__rotation = quaternion.clone(); this.__is_rotation_updated = true; } else if (rotate != null) { this.__is_rotation_updated = false; } else if (quaternion != null) { this.__rotation = quaternion.clone(); this.__is_rotation_updated = true; } // Scale if (scale != null) { this.__scale = scale.clone(); this.__is_scale_updated = true; } this.__updateTransform(); } } Transform3D.__tmpMatrix44_0 = _MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.zero(); Transform3D.__tmpVector3_0 = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); Transform3D.__tmpVector3_1 = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); Transform3D.__tmpVector3_2 = _MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); Transform3D.__tmpQuaternion_0 = _MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__.MutableQuaternion.identity(); /***/ }), /***/ "./src/foundation/math/Vector2.ts": /*!****************************************!*\ !*** ./src/foundation/math/Vector2.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstVector2_0_0: () => (/* binding */ ConstVector2_0_0), /* harmony export */ ConstVector2_1_1: () => (/* binding */ ConstVector2_1_1), /* harmony export */ Vector2: () => (/* binding */ Vector2), /* harmony export */ Vector2_: () => (/* binding */ Vector2_), /* harmony export */ Vector2d: () => (/* binding */ Vector2d) /* harmony export */ }); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _AbstractVector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractVector */ "./src/foundation/math/AbstractVector.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * @internal */ class Vector2_ extends _AbstractVector__WEBPACK_IMPORTED_MODULE_2__.AbstractVector { constructor(v, { type }) { super(); this._v = v; } get x() { return this._v[0]; } get y() { return this._v[1]; } get glslStrAsFloat() { return `vec2(${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[0])}, ${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[1])})`; } get glslStrAsInt() { return `ivec2(${Math.floor(this._v[0])}, ${Math.floor(this._v[1])})`; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec2; } /** * to square length(static version) */ static lengthSquared(vec) { return vec.lengthSquared(); } static lengthBtw(l_vec, r_vec) { return l_vec.lengthTo(r_vec); } static angleOfVectors(l_vec, r_vec) { const multipliedLength = l_vec.length() * r_vec.length(); if (multipliedLength === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('length of a vector is 0!'); } const cos_sita = l_vec.dot(r_vec) / multipliedLength; const sita = Math.acos(cos_sita); return sita; } static _zero(type) { return this._fromCopyArray2([0, 0], type); } static _one(type) { return this._fromCopyArray2([1, 1], type); } static _dummy(type) { return new this(new type(), { type }); } /** * normalize(static version) */ static _normalize(vec, type) { const length = vec.length(); return this._divide(vec, length, type); } /** * add value(static version) */ static _add(l_vec, r_vec, type) { const x = l_vec._v[0] + r_vec._v[0]; const y = l_vec._v[1] + r_vec._v[1]; return this._fromCopyArray2([x, y], type); } /** * add value(static version) */ static addTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] + r_vec._v[0]; out._v[1] = l_vec._v[1] + r_vec._v[1]; return out; } /** * subtract value(static version) */ static _subtract(l_vec, r_vec, type) { const x = l_vec._v[0] - r_vec._v[0]; const y = l_vec._v[1] - r_vec._v[1]; return this._fromCopyArray2([x, y], type); } /** * subtract value(static version) */ static subtractTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] - r_vec._v[0]; out._v[1] = l_vec._v[1] - r_vec._v[1]; return out; } /** * multiply value(static version) */ static _multiply(vec, value, type) { const x = vec._v[0] * value; const y = vec._v[1] * value; return this._fromCopyArray2([x, y], type); } /** * multiply value(static version) */ static multiplyTo(vec, value, out) { out._v[0] = vec._v[0] * value; out._v[1] = vec._v[1] * value; return out; } /** * multiply vector(static version) */ static _multiplyVector(l_vec, r_vec, type) { const x = l_vec._v[0] * r_vec._v[0]; const y = l_vec._v[1] * r_vec._v[1]; return this._fromCopyArray2([x, y], type); } /** * multiply vector(static version) */ static multiplyVectorTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] * r_vec._v[0]; out._v[1] = l_vec._v[1] * r_vec._v[1]; return out; } /** * divide by value(static version) */ static _divide(vec, value, type) { let x; let y; if (value !== 0) { x = vec._v[0] / value; y = vec._v[1] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); x = Infinity; y = Infinity; } return this._fromCopyArray2([x, y], type); } /** * divide by value(static version) */ static divideTo(vec, value, out) { if (value !== 0) { out._v[0] = vec._v[0] / value; out._v[1] = vec._v[1] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); out._v[0] = Infinity; out._v[1] = Infinity; } return out; } /** * divide by vector(static version) */ static _divideVector(l_vec, r_vec, type) { let x; let y; if (r_vec._v[0] !== 0 && r_vec._v[1] !== 0) { x = l_vec._v[0] / r_vec._v[0]; y = l_vec._v[1] / r_vec._v[1]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); x = r_vec._v[0] === 0 ? Infinity : l_vec._v[0] / r_vec._v[0]; y = r_vec._v[1] === 0 ? Infinity : l_vec._v[1] / r_vec._v[1]; } return this._fromCopyArray2([x, y], type); } /** * divide by vector(static version) */ static divideVectorTo(l_vec, r_vec, out) { if (r_vec._v[0] !== 0 && r_vec._v[1] !== 0) { out._v[0] = l_vec._v[0] / r_vec._v[0]; out._v[1] = l_vec._v[1] / r_vec._v[1]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); out._v[0] = r_vec._v[0] === 0 ? Infinity : l_vec._v[0] / r_vec._v[0]; out._v[1] = r_vec._v[1] === 0 ? Infinity : l_vec._v[1] / r_vec._v[1]; } return out; } /** * dot product(static version) */ static dot(l_vec, r_vec) { return l_vec.dot(r_vec); } /** * change to string */ toString() { return '(' + this._v[0] + ', ' + this._v[1] + ')'; } toStringApproximately() { return _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[1]) + '\n'; } flattenAsArray() { return [this._v[0], this._v[1]]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(vec, delta = Number.EPSILON) { if (Math.abs(vec._v[0] - this._v[0]) < delta && Math.abs(vec._v[1] - this._v[1]) < delta) { return true; } else { return false; } } isStrictEqual(vec) { if (this._v[0] === vec._v[0] && this._v[1] === vec._v[1]) { return true; } else { return false; } } at(i) { return this._v[i]; } length() { return Math.hypot(this._v[0], this._v[1]); } lengthSquared() { return this._v[0] ** 2 + this._v[1] ** 2; } lengthTo(vec) { const deltaX = this._v[0] - vec._v[0]; const deltaY = this._v[1] - vec._v[1]; return Math.hypot(deltaX, deltaY); } /** * dot product */ dot(vec) { return this._v[0] * vec._v[0] + this._v[1] * vec._v[1]; } clone() { return new this.constructor(new this._v.constructor([this._v[0], this._v[1]])); } static _fromCopyArray2(array, type) { return new this(new type(array), { type }); } static _fromCopy2(x, y, type) { return new this(new type([x, y]), { type }); } static _fromCopyArray(array, type) { return new this(new type(array.slice(0, 2)), { type }); } static _fromVector2(vec2, type) { const vec = new this(new type(vec2._v), { type, }); return vec; } static _fromCopyVector2(vec2, type) { const vec = new this(new type([vec2._v[0], vec2._v[1]]), { type, }); return vec; } static _fromCopyVector3(vec3, type) { const vec = new this(new type([vec3._v[0], vec3._v[1], vec3._v[2]]), { type, }); return vec; } static _fromCopyVector4(vec4, type) { const vec = new this(new type([vec4._v[0], vec4._v[1], vec4._v[2]]), { type, }); return vec; } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } } /** * Immutable 2D(x,y) Vector class with 32bit float components */ class Vector2 extends Vector2_ { constructor(x) { super(x, { type: Float32Array }); } static fromCopyArray2(array) { return super._fromCopyArray2(array, Float32Array); } static fromCopy2(x, y) { return super._fromCopy2(x, y, Float32Array); } static fromCopyArray(array) { return super._fromCopyArray(array, Float32Array); } static fromCopyVector2(vec2) { return super._fromCopyVector2(vec2, Float32Array); } static fromCopyVector4(vec4) { return super._fromCopyVector4(vec4, Float32Array); } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } get className() { return 'Vector2'; } clone() { return super.clone(); } } /** * Immutable 2D(x,y) Vector class with 64bit float components */ class Vector2d extends Vector2_ { constructor(x) { super(x, { type: Float64Array }); } static fromCopyArray2(array) { return super._fromCopyArray2(array, Float64Array); } static fromCopy2(x, y) { return super._fromCopy2(x, y, Float64Array); } static fromCopyArray(array) { return super._fromCopyArray(array, Float64Array); } static fromArrayBuffer(arrayBuffer) { return new Vector2d(new Float64Array(arrayBuffer)); } static fromFloat64Array(float64Array) { return new Vector2d(float64Array); } static zero() { return super._zero(Float64Array); } static one() { return super._one(Float64Array); } static dummy() { return super._dummy(Float64Array); } static normalize(vec) { return super._normalize(vec, Float64Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float64Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float64Array); } static multiply(vec, value) { return super._multiply(vec, value, Float64Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float64Array); } static divide(vec, value) { return super._divide(vec, value, Float64Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float64Array); } clone() { return super.clone(); } } const ConstVector2_1_1 = Vector2.fromCopy2(1, 1); const ConstVector2_0_0 = Vector2.fromCopy2(0, 0); /***/ }), /***/ "./src/foundation/math/Vector3.ts": /*!****************************************!*\ !*** ./src/foundation/math/Vector3.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstVector3_0_0_0: () => (/* binding */ ConstVector3_0_0_0), /* harmony export */ ConstVector3_1_1_1: () => (/* binding */ ConstVector3_1_1_1), /* harmony export */ Vector3: () => (/* binding */ Vector3), /* harmony export */ Vector3_: () => (/* binding */ Vector3_), /* harmony export */ Vector3d: () => (/* binding */ Vector3d) /* harmony export */ }); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _AbstractVector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractVector */ "./src/foundation/math/AbstractVector.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * @internal */ class Vector3_ extends _AbstractVector__WEBPACK_IMPORTED_MODULE_2__.AbstractVector { constructor(v, { type }) { super(); this._v = v; } get x() { return this._v[0]; } get y() { return this._v[1]; } get z() { return this._v[2]; } get w() { return 1; } get glslStrAsFloat() { return `vec3(${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[0])}, ${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[1])}, ${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[2])})`; } get glslStrAsInt() { return `ivec3(${Math.floor(this._v[0])}, ${Math.floor(this._v[1])}, ${Math.floor(this._v[2])})`; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec3; } /** * to square length(static version) */ static lengthSquared(vec) { return vec.lengthSquared(); } static lengthBtw(l_vec, r_vec) { return l_vec.lengthTo(r_vec); } static angleOfVectors(l_vec, r_vec) { const multipliedLength = l_vec.length() * r_vec.length(); if (multipliedLength === 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('length of a vector is 0!'); } const cos_sita = l_vec.dot(r_vec) / multipliedLength; const sita = Math.acos(cos_sita); return sita; } static _zero(type) { return this._fromCopyArray([0, 0, 0], type); } static _one(type) { return this._fromCopyArray([1, 1, 1], type); } static _dummy(type) { return new this(new type([]), { type }); } /** * normalize(static version) */ static _normalize(vec, type) { const length = vec.length(); return this._divide(vec, length, type); } /** * normalize(static version) */ static normalizeTo(vec, out) { const length = vec.length(); this.divideTo(vec, length, out); return out; } /** * add value(static version) */ static _add(l_vec, r_vec, type) { const x = l_vec._v[0] + r_vec._v[0]; const y = l_vec._v[1] + r_vec._v[1]; const z = l_vec._v[2] + r_vec._v[2]; return this._fromCopyArray([x, y, z], type); } /** * add value(static version) */ static addTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] + r_vec._v[0]; out._v[1] = l_vec._v[1] + r_vec._v[1]; out._v[2] = l_vec._v[2] + r_vec._v[2]; return out; } /** * subtract(subtract) */ static _subtract(l_vec, r_vec, type) { const x = l_vec._v[0] - r_vec._v[0]; const y = l_vec._v[1] - r_vec._v[1]; const z = l_vec._v[2] - r_vec._v[2]; return this._fromCopyArray([x, y, z], type); } /** * subtract(subtract) */ static subtractTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] - r_vec._v[0]; out._v[1] = l_vec._v[1] - r_vec._v[1]; out._v[2] = l_vec._v[2] - r_vec._v[2]; return out; } /** * multiply(static version) */ static _multiply(vec, value, type) { const x = vec._v[0] * value; const y = vec._v[1] * value; const z = vec._v[2] * value; return this._fromCopyArray([x, y, z], type); } /** * multiplyTo(static version) */ static multiplyTo(vec, value, out) { out._v[0] = vec._v[0] * value; out._v[1] = vec._v[1] * value; out._v[2] = vec._v[2] * value; return out; } /** * multiply vector(static version) */ static _multiplyVector(l_vec, r_vec, type) { const x = l_vec._v[0] * r_vec._v[0]; const y = l_vec._v[1] * r_vec._v[1]; const z = l_vec._v[2] * r_vec._v[2]; return this._fromCopyArray([x, y, z], type); } /** * multiply vector(static version) */ static multiplyVectorTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] * r_vec._v[0]; out._v[1] = l_vec._v[1] * r_vec._v[1]; out._v[2] = l_vec._v[2] * r_vec._v[2]; return out; } /** * divide(static version) */ static _divide(vec, value, type) { let x; let y; let z; if (value !== 0) { x = vec._v[0] / value; y = vec._v[1] / value; z = vec._v[2] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); x = Infinity; y = Infinity; z = Infinity; } return this._fromCopyArray([x, y, z], type); } /** * divide by value(static version) */ static divideTo(vec, value, out) { if (value !== 0) { out._v[0] = vec._v[0] / value; out._v[1] = vec._v[1] / value; out._v[2] = vec._v[2] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); out._v[0] = Infinity; out._v[1] = Infinity; out._v[2] = Infinity; } return out; } /** * divide vector(static version) */ static _divideVector(l_vec, r_vec, type) { let x; let y; let z; if (r_vec._v[0] !== 0 && r_vec._v[1] !== 0 && r_vec._v[2] !== 0) { x = l_vec._v[0] / r_vec._v[0]; y = l_vec._v[1] / r_vec._v[1]; z = l_vec._v[2] / r_vec._v[2]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); x = r_vec._v[0] === 0 ? Infinity : l_vec._v[0] / r_vec._v[0]; y = r_vec._v[1] === 0 ? Infinity : l_vec._v[1] / r_vec._v[1]; z = r_vec._v[2] === 0 ? Infinity : l_vec._v[2] / r_vec._v[2]; } return this._fromCopyArray([x, y, z], type); } /** * divide by vector(static version) */ static divideVectorTo(l_vec, r_vec, out) { if (r_vec._v[0] !== 0 && r_vec._v[1] !== 0 && r_vec._v[2] !== 0) { out._v[0] = l_vec._v[0] / r_vec._v[0]; out._v[1] = l_vec._v[1] / r_vec._v[1]; out._v[2] = l_vec._v[2] / r_vec._v[2]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); out._v[0] = r_vec._v[0] === 0 ? Infinity : l_vec._v[0] / r_vec._v[0]; out._v[1] = r_vec._v[1] === 0 ? Infinity : l_vec._v[1] / r_vec._v[1]; out._v[2] = r_vec._v[2] === 0 ? Infinity : l_vec._v[2] / r_vec._v[2]; } return out; } /** * dot product(static version) */ static dot(l_vec, r_vec) { return l_vec.dot(r_vec); } /** * cross product(static version) */ static _cross(l_vec, r_vec, type) { const x = l_vec._v[1] * r_vec._v[2] - l_vec._v[2] * r_vec._v[1]; const y = l_vec._v[2] * r_vec._v[0] - l_vec._v[0] * r_vec._v[2]; const z = l_vec._v[0] * r_vec._v[1] - l_vec._v[1] * r_vec._v[0]; return this._fromCopyArray([x, y, z], type); } /** * cross product(static version) */ static crossTo(l_vec, r_vec, out) { const x = l_vec._v[1] * r_vec._v[2] - l_vec._v[2] * r_vec._v[1]; const y = l_vec._v[2] * r_vec._v[0] - l_vec._v[0] * r_vec._v[2]; const z = l_vec._v[0] * r_vec._v[1] - l_vec._v[1] * r_vec._v[0]; return out.setComponents(x, y, z); } /** * quaternion * vector3 */ static _multiplyQuaternion(quat, vec, type) { const num = quat._v[0] * 2; const num2 = quat._v[1] * 2; const num3 = quat._v[2] * 2; const num4 = quat._v[0] * num; const num5 = quat._v[1] * num2; const num6 = quat._v[2] * num3; const num7 = quat._v[0] * num2; const num8 = quat._v[0] * num3; const num9 = quat._v[1] * num3; const num10 = quat._v[3] * num; const num11 = quat._v[3] * num2; const num12 = quat._v[3] * num3; const x = (1 - (num5 + num6)) * vec._v[0] + (num7 - num12) * vec._v[1] + (num8 + num11) * vec._v[2]; const y = (num7 + num12) * vec._v[0] + (1 - (num4 + num6)) * vec._v[1] + (num9 - num10) * vec._v[2]; const z = (num8 - num11) * vec._v[0] + (num9 + num10) * vec._v[1] + (1 - (num4 + num5)) * vec._v[2]; return this._fromCopyArray([x, y, z], type); } /** * quaternion * vector3 */ static multiplyQuaternionTo(quat, vec, out) { const num = quat._v[0] * 2; const num2 = quat._v[1] * 2; const num3 = quat._v[2] * 2; const num4 = quat._v[0] * num; const num5 = quat._v[1] * num2; const num6 = quat._v[2] * num3; const num7 = quat._v[0] * num2; const num8 = quat._v[0] * num3; const num9 = quat._v[1] * num3; const num10 = quat._v[3] * num; const num11 = quat._v[3] * num2; const num12 = quat._v[3] * num3; const x = (1 - (num5 + num6)) * vec._v[0] + (num7 - num12) * vec._v[1] + (num8 + num11) * vec._v[2]; const y = (num7 + num12) * vec._v[0] + (1 - (num4 + num6)) * vec._v[1] + (num9 - num10) * vec._v[2]; const z = (num8 - num11) * vec._v[0] + (num9 + num10) * vec._v[1] + (1 - (num4 + num5)) * vec._v[2]; return out.setComponents(x, y, z); } /** * change to string */ toString() { return '(' + this._v[0] + ', ' + this._v[1] + ', ' + this._v[2] + ')'; } toStringApproximately() { return (_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[1]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[2]) + '\n'); } flattenAsArray() { return [this._v[0], this._v[1], this._v[2]]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(vec, delta = Number.EPSILON) { if (Math.abs(vec._v[0] - this._v[0]) < delta && Math.abs(vec._v[1] - this._v[1]) < delta && Math.abs(vec._v[2] - this._v[2]) < delta) { return true; } else { return false; } } isStrictEqual(vec) { if (this._v[0] === vec._v[0] && this._v[1] === vec._v[1] && this._v[2] === vec._v[2]) { return true; } else { return false; } } at(i) { return this._v[i]; } length() { return Math.hypot(this._v[0], this._v[1], this._v[2]); } lengthSquared() { return this._v[0] ** 2 + this._v[1] ** 2 + this._v[2] ** 2; } lengthTo(vec) { const deltaX = this._v[0] - vec._v[0]; const deltaY = this._v[1] - vec._v[1]; const deltaZ = this._v[2] - vec._v[2]; return Math.hypot(deltaX, deltaY, deltaZ); } /** * dot product */ dot(vec) { return this._v[0] * vec._v[0] + this._v[1] * vec._v[1] + this._v[2] * vec._v[2]; } get className() { return 'Vector3'; } clone() { return new this.constructor(new this._v.constructor([this._v[0], this._v[1], this._v[2]], 0, 0)); } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } static _lerp(lhs, rhs, ratio, type) { return new this(new type([ lhs._v[0] * (1 - ratio) + rhs._v[0] * ratio, lhs._v[1] * (1 - ratio) + rhs._v[1] * ratio, lhs._v[2] * (1 - ratio) + rhs._v[2] * ratio, ]), { type }); } static _fromCopyArray3(array, type) { return new this(new type(array), { type }); } static _fromCopy3(x, y, z, type) { return new this(new type([x, y, z]), { type }); } static _fromCopyArray(array, type) { return new this(new type(array.slice(0, 3)), { type }); } static _fromCopyVector3(vec3, type) { const vec = new this(new type([vec3._v[0], vec3._v[1], vec3._v[2]]), { type, }); return vec; } static _fromCopyVector4(vec4, type) { const vec = new this(new type([vec4._v[0], vec4._v[1], vec4._v[2]]), { type, }); return vec; } static _fromVector2(vec2, type) { const vec = new this(new type([vec2._v[0], vec2._v[1], 0]), { type, }); return vec; } } /** * Immutable 3D(x,y,z) Vector class with 32bit float components */ class Vector3 extends Vector3_ { constructor(v) { super(v, { type: Float32Array }); } static fromCopyArray3(array) { return super._fromCopyArray3(array, Float32Array); } static fromCopy3(x, y, z) { return super._fromCopy3(x, y, z, Float32Array); } static fromCopy1(val) { return super._fromCopy3(val, val, val, Float32Array); } static fromCopyArray(array) { return super._fromCopyArray(array, Float32Array); } static fromCopyVector3(vec3) { return super._fromCopyVector3(vec3, Float32Array); } static fromCopyVector4(vec4) { return super._fromCopyVector4(vec4, Float32Array); } static fromArrayBuffer(arrayBuffer) { return new Vector3(new Float32Array(arrayBuffer)); } static fromFloat32Array(float32Array) { return new Vector3(float32Array); } static fromCopyFloat32Array(float32Array) { return new Vector3(float32Array.slice(0)); } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } static cross(l_vec, r_vec) { return super._cross(l_vec, r_vec, Float32Array); } static multiplyQuaternion(quat, vec) { return super._multiplyQuaternion(quat, vec, Float32Array); } static lerp(lhs, rhs, ratio) { return super._lerp(lhs, rhs, ratio, Float32Array); } } /** * Immutable 3D(x,y,z) Vector class with 64bit float components */ class Vector3d extends Vector3_ { constructor(v) { super(v, { type: Float64Array }); } static fromCopyArray3(array) { return super._fromCopyArray3(array, Float64Array); } static fromCopy3(x, y, z) { return super._fromCopy3(x, y, z, Float64Array); } static fromCopy1(val) { return super._fromCopy3(val, val, val, Float64Array); } static fromCopyArray(array) { return super._fromCopyArray(array, Float64Array); } static fromArrayBuffer(arrayBuffer) { return new Vector3d(new Float64Array(arrayBuffer)); } static fromFloat64Array(float64Array) { return new Vector3d(float64Array); } static zero() { return super._zero(Float64Array); } static one() { return super._one(Float64Array); } static dummy() { return super._dummy(Float64Array); } static normalize(vec) { return super._normalize(vec, Float64Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float64Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float64Array); } static multiply(vec, value) { return super._multiply(vec, value, Float64Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float64Array); } static divide(vec, value) { return super._divide(vec, value, Float64Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float64Array); } static cross(l_vec, r_vec) { return super._cross(l_vec, r_vec, Float64Array); } static multiplyQuaternion(quat, vec) { return super._multiplyQuaternion(quat, vec, Float64Array); } static lerp(lhs, rhs, ratio) { return super._lerp(lhs, rhs, ratio, Float64Array); } } const ConstVector3_1_1_1 = Vector3.fromCopy3(1, 1, 1); const ConstVector3_0_0_0 = Vector3.fromCopy3(0, 0, 0); /***/ }), /***/ "./src/foundation/math/Vector4.ts": /*!****************************************!*\ !*** ./src/foundation/math/Vector4.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstVector4_0_0_0_0: () => (/* binding */ ConstVector4_0_0_0_0), /* harmony export */ ConstVector4_0_0_0_1: () => (/* binding */ ConstVector4_0_0_0_1), /* harmony export */ ConstVector4_1_1_1_1: () => (/* binding */ ConstVector4_1_1_1_1), /* harmony export */ Vector4: () => (/* binding */ Vector4), /* harmony export */ Vector4_: () => (/* binding */ Vector4_), /* harmony export */ Vector4d: () => (/* binding */ Vector4d) /* harmony export */ }); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _AbstractVector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractVector */ "./src/foundation/math/AbstractVector.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * * @internal */ class Vector4_ extends _AbstractVector__WEBPACK_IMPORTED_MODULE_2__.AbstractVector { constructor(v, { type }) { super(); this._v = v; } get x() { return this._v[0]; } get y() { return this._v[1]; } get z() { return this._v[2]; } get w() { return this._v[3]; } get glslStrAsFloat() { return `vec4(${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[0])}, ${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[1])}, ${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[2])}, ${_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.convertToStringAsGLSLFloat(this._v[3])})`; } get glslStrAsInt() { return `ivec4(${Math.floor(this._v[0])}, ${Math.floor(this._v[1])}, ${Math.floor(this._v[2])}, ${Math.floor(this._v[3])})`; } static _fromCopyArray4(array, type) { return new this(new type(array), { type }); } static _fromCopy4(x, y, z, w, type) { return new this(new type([x, y, z, w]), { type }); } static _fromCopyArray(array, type) { return new this(new type(array.slice(0, 4)), { type }); } static _fromCopyVector4(vec4, type) { const vec = new this(new type([vec4._v[0], vec4._v[1], vec4._v[2], vec4._v[3]]), { type }); return vec; } static _fromCopyVector3(vec3, type) { const vec = new this(new type([vec3._v[0], vec3._v[1], vec3._v[2], 1]), { type, }); return vec; } static _fromVector2(vec2, type) { const vec = new this(new type([vec2._v[0], vec2._v[1], 0, 1]), { type, }); return vec; } static get compositionType() { return _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Vec4; } /** * to square length(static version) */ static lengthSquared(vec) { return vec.lengthSquared(); } static lengthBtw(l_vec, r_vec) { return l_vec.lengthTo(r_vec); } /** * Zero Vector */ static _zero(type) { return new this(new type([0, 0, 0, 0]), { type }); } static _one(type) { return new this(new type([1, 1, 1, 1]), { type }); } static _dummy(type) { return new this(new type([]), { type }); } /** * normalize(static version) */ static _normalize(vec, type) { const length = vec.length(); return this._divide(vec, length, type); } /** * add value(static version) */ static _add(l_vec, r_vec, type) { const x = l_vec._v[0] + r_vec._v[0]; const y = l_vec._v[1] + r_vec._v[1]; const z = l_vec._v[2] + r_vec._v[2]; const w = l_vec._v[3] + r_vec._v[3]; return new this(new type([x, y, z, w]), { type }); } /** * add value(static version) */ static addTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] + r_vec._v[0]; out._v[1] = l_vec._v[1] + r_vec._v[1]; out._v[2] = l_vec._v[2] + r_vec._v[2]; out._v[3] = l_vec._v[3] + r_vec._v[3]; return out; } /** * subtract(static version) */ static _subtract(l_vec, r_vec, type) { const x = l_vec._v[0] - r_vec._v[0]; const y = l_vec._v[1] - r_vec._v[1]; const z = l_vec._v[2] - r_vec._v[2]; const w = l_vec._v[3] - r_vec._v[3]; return new this(new type([x, y, z, w]), { type }); } /** * subtract(static version) */ static subtractTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] - r_vec._v[0]; out._v[1] = l_vec._v[1] - r_vec._v[1]; out._v[2] = l_vec._v[2] - r_vec._v[2]; out._v[3] = l_vec._v[3] - r_vec._v[3]; return out; } /** * multiply(static version) */ static _multiply(vec, value, type) { const x = vec._v[0] * value; const y = vec._v[1] * value; const z = vec._v[2] * value; const w = vec._v[3] * value; return new this(new type([x, y, z, w]), { type }); } /** * multiplyTo(static version) */ static multiplyTo(vec, value, out) { out._v[0] = vec._v[0] * value; out._v[1] = vec._v[1] * value; out._v[2] = vec._v[2] * value; out._v[3] = vec._v[3] * value; return out; } /** * multiply vector(static version) */ static _multiplyVector(l_vec, r_vec, type) { const x = l_vec._v[0] * r_vec._v[0]; const y = l_vec._v[1] * r_vec._v[1]; const z = l_vec._v[2] * r_vec._v[2]; const w = l_vec._v[3] * r_vec._v[3]; return new this(new type([x, y, z, w]), { type }); } /** * multiply vector(static version) */ static multiplyVectorTo(l_vec, r_vec, out) { out._v[0] = l_vec._v[0] * r_vec._v[0]; out._v[1] = l_vec._v[1] * r_vec._v[1]; out._v[2] = l_vec._v[2] * r_vec._v[2]; out._v[3] = l_vec._v[3] * r_vec._v[3]; return out; } /** * divide(static version) */ static _divide(vec, value, type) { let x; let y; let z; let w; if (value !== 0) { x = vec._v[0] / value; y = vec._v[1] / value; z = vec._v[2] / value; w = vec._v[3] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); x = Infinity; y = Infinity; z = Infinity; w = Infinity; } return new this(new type([x, y, z, w]), { type }); } /** * divide by value(static version) */ static divideTo(vec, value, out) { if (value !== 0) { out._v[0] = vec._v[0] / value; out._v[1] = vec._v[1] / value; out._v[2] = vec._v[2] / value; out._v[3] = vec._v[3] / value; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); out._v[0] = Infinity; out._v[1] = Infinity; out._v[2] = Infinity; out._v[3] = Infinity; } return out; } /** * divide vector(static version) */ static _divideVector(l_vec, r_vec, type) { let x; let y; let z; let w; if (r_vec._v[0] !== 0 && r_vec._v[1] !== 0 && r_vec._v[2] !== 0 && r_vec._v[3] !== 0) { x = l_vec._v[0] / r_vec._v[0]; y = l_vec._v[1] / r_vec._v[1]; z = l_vec._v[2] / r_vec._v[2]; w = l_vec._v[3] / r_vec._v[3]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); x = r_vec._v[0] === 0 ? Infinity : l_vec._v[0] / r_vec._v[0]; y = r_vec._v[1] === 0 ? Infinity : l_vec._v[1] / r_vec._v[1]; z = r_vec._v[2] === 0 ? Infinity : l_vec._v[2] / r_vec._v[2]; w = r_vec._v[3] === 0 ? Infinity : l_vec._v[3] / r_vec._v[3]; } return new this(new type([x, y, z, w]), { type }); } /** * divide by vector(static version) */ static divideVectorTo(l_vec, r_vec, out) { if (r_vec._v[0] !== 0 && r_vec._v[1] !== 0 && r_vec._v[2] !== 0 && r_vec._v[3] !== 0) { out._v[0] = l_vec._v[0] / r_vec._v[0]; out._v[1] = l_vec._v[1] / r_vec._v[1]; out._v[2] = l_vec._v[2] / r_vec._v[2]; out._v[3] = l_vec._v[3] / r_vec._v[3]; } else { _misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.error('0 division occurred!'); out._v[0] = r_vec._v[0] === 0 ? Infinity : l_vec._v[0] / r_vec._v[0]; out._v[1] = r_vec._v[1] === 0 ? Infinity : l_vec._v[1] / r_vec._v[1]; out._v[2] = r_vec._v[2] === 0 ? Infinity : l_vec._v[2] / r_vec._v[2]; out._v[3] = r_vec._v[3] === 0 ? Infinity : l_vec._v[3] / r_vec._v[3]; } return out; } /** * dot product(static version) */ static dot(l_vec, r_vec) { return l_vec.dot(r_vec); } toString() { return '(' + this._v[0] + ', ' + this._v[1] + ', ' + this._v[2] + ', ' + this._v[3] + ')'; } toStringApproximately() { return (_MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[0]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[1]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[2]) + ' ' + _MathUtil__WEBPACK_IMPORTED_MODULE_0__.MathUtil.financial(this._v[3]) + '\n'); } flattenAsArray() { return [this._v[0], this._v[1], this._v[2], this._v[3]]; } isDummy() { if (this._v.length === 0) { return true; } else { return false; } } isEqual(vec, delta = Number.EPSILON) { if (Math.abs(vec._v[0] - this._v[0]) < delta && Math.abs(vec._v[1] - this._v[1]) < delta && Math.abs(vec._v[2] - this._v[2]) < delta && Math.abs(vec._v[3] - this._v[3]) < delta) { return true; } else { return false; } } isStrictEqual(vec) { if (this._v[0] === vec._v[0] && this._v[1] === vec._v[1] && this._v[2] === vec._v[2] && this._v[3] === vec._v[3]) { return true; } else { return false; } } at(i) { return this._v[i]; } length() { return Math.hypot(this._v[0], this._v[1], this._v[2], this._v[3]); } lengthSquared() { return this._v[0] ** 2 + this._v[1] ** 2 + this._v[2] ** 2 + this._v[3] ** 2; } lengthTo(vec) { const deltaX = this._v[0] - vec._v[0]; const deltaY = this._v[1] - vec._v[1]; const deltaZ = this._v[2] - vec._v[2]; const deltaW = this._v[3] - vec._v[3]; return Math.hypot(deltaX, deltaY, deltaZ, deltaW); } /** * dot product */ dot(vec) { return (this._v[0] * vec._v[0] + this._v[1] * vec._v[1] + this._v[2] * vec._v[2] + this._v[3] * vec._v[3]); } get className() { return 'Vector4'; } clone() { return new this.constructor(new this._v.constructor([this._v[0], this._v[1], this._v[2], this._v[3]])); } get bytesPerComponent() { return this._v.BYTES_PER_ELEMENT; } } /** * Immutable 4D(x,y,z,w) Vector class with 32bit float components * * @example * ``` * const vec1 = Rn.Vector4.fromCopy4(1, 2, 3, 1); * const vec2 = Rn.Vector4.fromCopyArray4([2, 3, 3, 1]); * const dotProduct = vec1.dot(vec2); * ``` */ class Vector4 extends Vector4_ { constructor(x) { super(x, { type: Float32Array }); } static fromCopyArray(array) { return super._fromCopyArray(array, Float32Array); } static fromCopyArray4(array) { return super._fromCopyArray4(array, Float32Array); } static fromCopy4(x, y, z, w) { return super._fromCopy4(x, y, z, w, Float32Array); } static fromCopyVector3(vec3) { return super._fromCopyVector3(vec3, Float32Array); } static fromCopyVector4(vec4) { return super._fromCopyVector4(vec4, Float32Array); } static fromArrayBuffer(arrayBuffer) { return new Vector4(new Float32Array(arrayBuffer)); } static fromFloat32Array(float32Array) { return new Vector4(float32Array); } static fromCopyFloat32Array(float32Array) { return new Vector4(float32Array.slice(0)); } static zero() { return super._zero(Float32Array); } static one() { return super._one(Float32Array); } static dummy() { return super._dummy(Float32Array); } static normalize(vec) { return super._normalize(vec, Float32Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float32Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float32Array); } static multiply(vec, value) { return super._multiply(vec, value, Float32Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float32Array); } static divide(vec, value) { return super._divide(vec, value, Float32Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float32Array); } clone() { return super.clone(); } } /** * Immutable 4D(x,y,z,w) Vector class with 64bit float components */ class Vector4d extends Vector4_ { constructor(x) { super(x, { type: Float64Array }); } static fromCopyArray4(array) { return super._fromCopyArray4(array, Float64Array); } static fromCopy4(x, y, z, w) { return super._fromCopy4(x, y, z, w, Float64Array); } static fromCopyArray(array) { return super._fromCopyArray(array, Float64Array); } static fromArrayBuffer(arrayBuffer) { return new Vector4d(new Float64Array(arrayBuffer)); } static fromFloat64Array(float64Array) { return new Vector4d(float64Array); } static zero() { return super._zero(Float64Array); } static one() { return super._one(Float64Array); } static dummy() { return super._dummy(Float64Array); } static normalize(vec) { return super._normalize(vec, Float64Array); } static add(l_vec, r_vec) { return super._add(l_vec, r_vec, Float64Array); } static subtract(l_vec, r_vec) { return super._subtract(l_vec, r_vec, Float64Array); } static multiply(vec, value) { return super._multiply(vec, value, Float64Array); } static multiplyVector(l_vec, r_vec) { return super._multiplyVector(l_vec, r_vec, Float64Array); } static divide(vec, value) { return super._divide(vec, value, Float64Array); } static divideVector(l_vec, r_vec) { return super._divideVector(l_vec, r_vec, Float64Array); } clone() { return super.clone(); } } const ConstVector4_1_1_1_1 = Vector4.fromCopy4(1, 1, 1, 1); const ConstVector4_0_0_0_1 = Vector4.fromCopy4(0, 0, 0, 1); const ConstVector4_0_0_0_0 = Vector4.fromCopy4(0, 0, 0, 0); /***/ }), /***/ "./src/foundation/math/VectorN.ts": /*!****************************************!*\ !*** ./src/foundation/math/VectorN.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VectorN: () => (/* binding */ VectorN) /* harmony export */ }); class VectorN { constructor(typedArray) { this._v = typedArray; } } /***/ }), /***/ "./src/foundation/math/index.ts": /*!**************************************!*\ !*** ./src/foundation/math/index.ts ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AABB: () => (/* reexport safe */ _AABB__WEBPACK_IMPORTED_MODULE_1__.AABB), /* harmony export */ AbstractArrayBufferBaseMathNumber: () => (/* reexport safe */ _AbstractMathNumber__WEBPACK_IMPORTED_MODULE_2__.AbstractArrayBufferBaseMathNumber), /* harmony export */ AbstractMatrix: () => (/* reexport safe */ _AbstractMatrix__WEBPACK_IMPORTED_MODULE_3__.AbstractMatrix), /* harmony export */ AbstractQuaternion: () => (/* reexport safe */ _AbstractQuaternion__WEBPACK_IMPORTED_MODULE_4__.AbstractQuaternion), /* harmony export */ AbstractVector: () => (/* reexport safe */ _AbstractVector__WEBPACK_IMPORTED_MODULE_5__.AbstractVector), /* harmony export */ ColorRgb: () => (/* reexport safe */ _ColorRgb__WEBPACK_IMPORTED_MODULE_6__.ColorRgb), /* harmony export */ ColorRgba: () => (/* reexport safe */ _ColorRgba__WEBPACK_IMPORTED_MODULE_7__.ColorRgba), /* harmony export */ ConstRgbaBlack: () => (/* reexport safe */ _ColorRgba__WEBPACK_IMPORTED_MODULE_7__.ConstRgbaBlack), /* harmony export */ ConstRgbaWhite: () => (/* reexport safe */ _ColorRgba__WEBPACK_IMPORTED_MODULE_7__.ConstRgbaWhite), /* harmony export */ ConstVector2_0_0: () => (/* reexport safe */ _Vector2__WEBPACK_IMPORTED_MODULE_34__.ConstVector2_0_0), /* harmony export */ ConstVector2_1_1: () => (/* reexport safe */ _Vector2__WEBPACK_IMPORTED_MODULE_34__.ConstVector2_1_1), /* harmony export */ ConstVector3_0_0_0: () => (/* reexport safe */ _Vector3__WEBPACK_IMPORTED_MODULE_35__.ConstVector3_0_0_0), /* harmony export */ ConstVector3_1_1_1: () => (/* reexport safe */ _Vector3__WEBPACK_IMPORTED_MODULE_35__.ConstVector3_1_1_1), /* harmony export */ ConstVector4_0_0_0_0: () => (/* reexport safe */ _Vector4__WEBPACK_IMPORTED_MODULE_36__.ConstVector4_0_0_0_0), /* harmony export */ ConstVector4_0_0_0_1: () => (/* reexport safe */ _Vector4__WEBPACK_IMPORTED_MODULE_36__.ConstVector4_0_0_0_1), /* harmony export */ ConstVector4_1_1_1_1: () => (/* reexport safe */ _Vector4__WEBPACK_IMPORTED_MODULE_36__.ConstVector4_1_1_1_1), /* harmony export */ IdentityMatrix33: () => (/* reexport safe */ _IdentityMatrix33__WEBPACK_IMPORTED_MODULE_9__.IdentityMatrix33), /* harmony export */ IdentityMatrix44: () => (/* reexport safe */ _IdentityMatrix44__WEBPACK_IMPORTED_MODULE_10__.IdentityMatrix44), /* harmony export */ LogQuaternion: () => (/* reexport safe */ _LogQuaternion__WEBPACK_IMPORTED_MODULE_15__.LogQuaternion), /* harmony export */ MathClassUtil: () => (/* reexport safe */ _MathClassUtil__WEBPACK_IMPORTED_MODULE_16__.MathClassUtil), /* harmony export */ MathUtil: () => (/* reexport safe */ _MathUtil__WEBPACK_IMPORTED_MODULE_17__.MathUtil), /* harmony export */ Matrix22: () => (/* reexport safe */ _Matrix22__WEBPACK_IMPORTED_MODULE_18__.Matrix22), /* harmony export */ Matrix33: () => (/* reexport safe */ _Matrix33__WEBPACK_IMPORTED_MODULE_19__.Matrix33), /* harmony export */ Matrix44: () => (/* reexport safe */ _Matrix44__WEBPACK_IMPORTED_MODULE_20__.Matrix44), /* harmony export */ MutableColorRgb: () => (/* reexport safe */ _MutableColorRgb__WEBPACK_IMPORTED_MODULE_21__.MutableColorRgb), /* harmony export */ MutableColorRgba: () => (/* reexport safe */ _MutableColorRgba__WEBPACK_IMPORTED_MODULE_22__.MutableColorRgba), /* harmony export */ MutableMatrix22: () => (/* reexport safe */ _MutableMatrix22__WEBPACK_IMPORTED_MODULE_23__.MutableMatrix22), /* harmony export */ MutableMatrix33: () => (/* reexport safe */ _MutableMatrix33__WEBPACK_IMPORTED_MODULE_24__.MutableMatrix33), /* harmony export */ MutableMatrix44: () => (/* reexport safe */ _MutableMatrix44__WEBPACK_IMPORTED_MODULE_25__.MutableMatrix44), /* harmony export */ MutableQuaternion: () => (/* reexport safe */ _MutableQuaternion__WEBPACK_IMPORTED_MODULE_26__.MutableQuaternion), /* harmony export */ MutableScalar: () => (/* reexport safe */ _MutableScalar__WEBPACK_IMPORTED_MODULE_27__.MutableScalar), /* harmony export */ MutableScalar_: () => (/* reexport safe */ _MutableScalar__WEBPACK_IMPORTED_MODULE_27__.MutableScalar_), /* harmony export */ MutableScalard: () => (/* reexport safe */ _MutableScalar__WEBPACK_IMPORTED_MODULE_27__.MutableScalard), /* harmony export */ MutableVector2: () => (/* reexport safe */ _MutableVector2__WEBPACK_IMPORTED_MODULE_28__.MutableVector2), /* harmony export */ MutableVector2_: () => (/* reexport safe */ _MutableVector2__WEBPACK_IMPORTED_MODULE_28__.MutableVector2_), /* harmony export */ MutableVector2d: () => (/* reexport safe */ _MutableVector2__WEBPACK_IMPORTED_MODULE_28__.MutableVector2d), /* harmony export */ MutableVector3: () => (/* reexport safe */ _MutableVector3__WEBPACK_IMPORTED_MODULE_29__.MutableVector3), /* harmony export */ MutableVector3_: () => (/* reexport safe */ _MutableVector3__WEBPACK_IMPORTED_MODULE_29__.MutableVector3_), /* harmony export */ MutableVector3d: () => (/* reexport safe */ _MutableVector3__WEBPACK_IMPORTED_MODULE_29__.MutableVector3d), /* harmony export */ MutableVector4: () => (/* reexport safe */ _MutableVector4__WEBPACK_IMPORTED_MODULE_30__.MutableVector4), /* harmony export */ MutableVector4_: () => (/* reexport safe */ _MutableVector4__WEBPACK_IMPORTED_MODULE_30__.MutableVector4_), /* harmony export */ MutableVector4d: () => (/* reexport safe */ _MutableVector4__WEBPACK_IMPORTED_MODULE_30__.MutableVector4d), /* harmony export */ Quaternion: () => (/* reexport safe */ _Quaternion__WEBPACK_IMPORTED_MODULE_31__.Quaternion), /* harmony export */ Scalar: () => (/* reexport safe */ _Scalar__WEBPACK_IMPORTED_MODULE_32__.Scalar), /* harmony export */ Scalar_: () => (/* reexport safe */ _Scalar__WEBPACK_IMPORTED_MODULE_32__.Scalar_), /* harmony export */ Scalard: () => (/* reexport safe */ _Scalar__WEBPACK_IMPORTED_MODULE_32__.Scalard), /* harmony export */ Transform3D: () => (/* reexport safe */ _Transform3D__WEBPACK_IMPORTED_MODULE_33__.Transform3D), /* harmony export */ Vector2: () => (/* reexport safe */ _Vector2__WEBPACK_IMPORTED_MODULE_34__.Vector2), /* harmony export */ Vector2_: () => (/* reexport safe */ _Vector2__WEBPACK_IMPORTED_MODULE_34__.Vector2_), /* harmony export */ Vector2d: () => (/* reexport safe */ _Vector2__WEBPACK_IMPORTED_MODULE_34__.Vector2d), /* harmony export */ Vector3: () => (/* reexport safe */ _Vector3__WEBPACK_IMPORTED_MODULE_35__.Vector3), /* harmony export */ Vector3_: () => (/* reexport safe */ _Vector3__WEBPACK_IMPORTED_MODULE_35__.Vector3_), /* harmony export */ Vector3d: () => (/* reexport safe */ _Vector3__WEBPACK_IMPORTED_MODULE_35__.Vector3d), /* harmony export */ Vector4: () => (/* reexport safe */ _Vector4__WEBPACK_IMPORTED_MODULE_36__.Vector4), /* harmony export */ Vector4_: () => (/* reexport safe */ _Vector4__WEBPACK_IMPORTED_MODULE_36__.Vector4_), /* harmony export */ Vector4d: () => (/* reexport safe */ _Vector4__WEBPACK_IMPORTED_MODULE_36__.Vector4d), /* harmony export */ VectorN: () => (/* reexport safe */ _VectorN__WEBPACK_IMPORTED_MODULE_37__.VectorN), /* harmony export */ add2: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.add2), /* harmony export */ add2_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.add2_offset), /* harmony export */ add3: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.add3), /* harmony export */ add3_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.add3_offset), /* harmony export */ add4: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.add4), /* harmony export */ add4_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.add4_offset), /* harmony export */ array3_lerp_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.array3_lerp_offsetAsComposition), /* harmony export */ arrayN_lerp_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.arrayN_lerp_offsetAsComposition), /* harmony export */ get1: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get1), /* harmony export */ get1_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get1_offset), /* harmony export */ get1_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get1_offsetAsComposition), /* harmony export */ get2: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get2), /* harmony export */ get2_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get2_offset), /* harmony export */ get2_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get2_offsetAsComposition), /* harmony export */ get3: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get3), /* harmony export */ get3_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get3_offset), /* harmony export */ get3_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get3_offsetAsComposition), /* harmony export */ get4: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get4), /* harmony export */ get4_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get4_offset), /* harmony export */ get4_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.get4_offsetAsComposition), /* harmony export */ getN_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.getN_offset), /* harmony export */ getN_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.getN_offsetAsComposition), /* harmony export */ mulArray3WithScalar_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.mulArray3WithScalar_offset), /* harmony export */ mulArray4WithScalar_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.mulArray4WithScalar_offset), /* harmony export */ mulArrayNWithScalar_offset: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.mulArrayNWithScalar_offset), /* harmony export */ mulThatAndThisToOutAsMat44_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.mulThatAndThisToOutAsMat44_offsetAsComposition), /* harmony export */ normalizeArray4: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.normalizeArray4), /* harmony export */ qlerp_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.qlerp_offsetAsComposition), /* harmony export */ scalar_lerp_offsetAsComposition: () => (/* reexport safe */ _raw_index__WEBPACK_IMPORTED_MODULE_0__.scalar_lerp_offsetAsComposition) /* harmony export */ }); /* harmony import */ var _raw_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./raw/index */ "./src/foundation/math/raw/index.ts"); /* harmony import */ var _AABB__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AABB */ "./src/foundation/math/AABB.ts"); /* harmony import */ var _AbstractMathNumber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractMathNumber */ "./src/foundation/math/AbstractMathNumber.ts"); /* harmony import */ var _AbstractMatrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AbstractMatrix */ "./src/foundation/math/AbstractMatrix.ts"); /* harmony import */ var _AbstractQuaternion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AbstractQuaternion */ "./src/foundation/math/AbstractQuaternion.ts"); /* harmony import */ var _AbstractVector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AbstractVector */ "./src/foundation/math/AbstractVector.ts"); /* harmony import */ var _ColorRgb__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ColorRgb */ "./src/foundation/math/ColorRgb.ts"); /* harmony import */ var _ColorRgba__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ColorRgba */ "./src/foundation/math/ColorRgba.ts"); /* harmony import */ var _IColor__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./IColor */ "./src/foundation/math/IColor.ts"); /* harmony import */ var _IdentityMatrix33__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./IdentityMatrix33 */ "./src/foundation/math/IdentityMatrix33.ts"); /* harmony import */ var _IdentityMatrix44__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./IdentityMatrix44 */ "./src/foundation/math/IdentityMatrix44.ts"); /* harmony import */ var _IMathNumber__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./IMathNumber */ "./src/foundation/math/IMathNumber.ts"); /* harmony import */ var _IMatrix__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./IMatrix */ "./src/foundation/math/IMatrix.ts"); /* harmony import */ var _IQuaternion__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./IQuaternion */ "./src/foundation/math/IQuaternion.ts"); /* harmony import */ var _IVector__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./IVector */ "./src/foundation/math/IVector.ts"); /* harmony import */ var _LogQuaternion__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./LogQuaternion */ "./src/foundation/math/LogQuaternion.ts"); /* harmony import */ var _MathClassUtil__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./MathClassUtil */ "./src/foundation/math/MathClassUtil.ts"); /* harmony import */ var _MathUtil__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _Matrix22__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Matrix22 */ "./src/foundation/math/Matrix22.ts"); /* harmony import */ var _Matrix33__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Matrix33 */ "./src/foundation/math/Matrix33.ts"); /* harmony import */ var _Matrix44__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Matrix44 */ "./src/foundation/math/Matrix44.ts"); /* harmony import */ var _MutableColorRgb__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./MutableColorRgb */ "./src/foundation/math/MutableColorRgb.ts"); /* harmony import */ var _MutableColorRgba__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./MutableColorRgba */ "./src/foundation/math/MutableColorRgba.ts"); /* harmony import */ var _MutableMatrix22__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./MutableMatrix22 */ "./src/foundation/math/MutableMatrix22.ts"); /* harmony import */ var _MutableMatrix33__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _MutableMatrix44__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _MutableQuaternion__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _MutableScalar__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./MutableScalar */ "./src/foundation/math/MutableScalar.ts"); /* harmony import */ var _MutableVector2__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _MutableVector3__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _MutableVector4__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _Quaternion__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _Scalar__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _Transform3D__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Transform3D */ "./src/foundation/math/Transform3D.ts"); /* harmony import */ var _Vector2__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _Vector3__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _Vector4__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _VectorN__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./VectorN */ "./src/foundation/math/VectorN.ts"); /***/ }), /***/ "./src/foundation/math/raw/index.ts": /*!******************************************!*\ !*** ./src/foundation/math/raw/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ add2: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.add2), /* harmony export */ add2_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.add2_offset), /* harmony export */ add3: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.add3), /* harmony export */ add3_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.add3_offset), /* harmony export */ add4: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.add4), /* harmony export */ add4_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.add4_offset), /* harmony export */ array3_lerp_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.array3_lerp_offsetAsComposition), /* harmony export */ arrayN_lerp_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.arrayN_lerp_offsetAsComposition), /* harmony export */ get1: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get1), /* harmony export */ get1_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get1_offset), /* harmony export */ get1_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get1_offsetAsComposition), /* harmony export */ get2: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get2), /* harmony export */ get2_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get2_offset), /* harmony export */ get2_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get2_offsetAsComposition), /* harmony export */ get3: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get3), /* harmony export */ get3_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get3_offset), /* harmony export */ get3_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get3_offsetAsComposition), /* harmony export */ get4: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get4), /* harmony export */ get4_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get4_offset), /* harmony export */ get4_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.get4_offsetAsComposition), /* harmony export */ getN_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.getN_offset), /* harmony export */ getN_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.getN_offsetAsComposition), /* harmony export */ mulArray3WithScalar_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.mulArray3WithScalar_offset), /* harmony export */ mulArray4WithScalar_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.mulArray4WithScalar_offset), /* harmony export */ mulArrayNWithScalar_offset: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.mulArrayNWithScalar_offset), /* harmony export */ mulThatAndThisToOutAsMat44_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.mulThatAndThisToOutAsMat44_offsetAsComposition), /* harmony export */ normalizeArray4: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.normalizeArray4), /* harmony export */ qlerp_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.qlerp_offsetAsComposition), /* harmony export */ scalar_lerp_offsetAsComposition: () => (/* reexport safe */ _raw_extension__WEBPACK_IMPORTED_MODULE_0__.scalar_lerp_offsetAsComposition) /* harmony export */ }); /* harmony import */ var _raw_extension__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./raw_extension */ "./src/foundation/math/raw/raw_extension.ts"); /***/ }), /***/ "./src/foundation/math/raw/raw_extension.ts": /*!**************************************************!*\ !*** ./src/foundation/math/raw/raw_extension.ts ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ add2: () => (/* binding */ add2), /* harmony export */ add2_offset: () => (/* binding */ add2_offset), /* harmony export */ add3: () => (/* binding */ add3), /* harmony export */ add3_offset: () => (/* binding */ add3_offset), /* harmony export */ add4: () => (/* binding */ add4), /* harmony export */ add4_offset: () => (/* binding */ add4_offset), /* harmony export */ array3_lerp_offsetAsComposition: () => (/* binding */ array3_lerp_offsetAsComposition), /* harmony export */ arrayN_lerp_offsetAsComposition: () => (/* binding */ arrayN_lerp_offsetAsComposition), /* harmony export */ get1: () => (/* binding */ get1), /* harmony export */ get1_offset: () => (/* binding */ get1_offset), /* harmony export */ get1_offsetAsComposition: () => (/* binding */ get1_offsetAsComposition), /* harmony export */ get2: () => (/* binding */ get2), /* harmony export */ get2_offset: () => (/* binding */ get2_offset), /* harmony export */ get2_offsetAsComposition: () => (/* binding */ get2_offsetAsComposition), /* harmony export */ get3: () => (/* binding */ get3), /* harmony export */ get3_offset: () => (/* binding */ get3_offset), /* harmony export */ get3_offsetAsComposition: () => (/* binding */ get3_offsetAsComposition), /* harmony export */ get4: () => (/* binding */ get4), /* harmony export */ get4_offset: () => (/* binding */ get4_offset), /* harmony export */ get4_offsetAsComposition: () => (/* binding */ get4_offsetAsComposition), /* harmony export */ getN_offset: () => (/* binding */ getN_offset), /* harmony export */ getN_offsetAsComposition: () => (/* binding */ getN_offsetAsComposition), /* harmony export */ mulArray3WithScalar_offset: () => (/* binding */ mulArray3WithScalar_offset), /* harmony export */ mulArray4WithScalar_offset: () => (/* binding */ mulArray4WithScalar_offset), /* harmony export */ mulArrayNWithScalar_offset: () => (/* binding */ mulArrayNWithScalar_offset), /* harmony export */ mulThatAndThisToOutAsMat44_offsetAsComposition: () => (/* binding */ mulThatAndThisToOutAsMat44_offsetAsComposition), /* harmony export */ normalizeArray4: () => (/* binding */ normalizeArray4), /* harmony export */ qlerp_offsetAsComposition: () => (/* binding */ qlerp_offsetAsComposition), /* harmony export */ scalar_lerp_offsetAsComposition: () => (/* binding */ scalar_lerp_offsetAsComposition) /* harmony export */ }); const get1 = Symbol('get1'); const get1_offset = Symbol('get1_offset'); const get1_offsetAsComposition = Symbol('get1_offsetAsComposition'); const get2 = Symbol('get2'); const get2_offset = Symbol('get2_offset'); const get2_offsetAsComposition = Symbol('get2_offsetAsComposition'); const get3 = Symbol('get3'); const get3_offset = Symbol('get3_offset'); const get3_offsetAsComposition = Symbol('get3_offsetAsComposition'); const get4 = Symbol('get4'); const get4_offset = Symbol('get4_offset'); const get4_offsetAsComposition = Symbol('get4_offsetAsComposition'); const getN_offset = Symbol('getN_offset'); const getN_offsetAsComposition = Symbol('getN_offsetAsComposition'); const add2 = Symbol('add2'); const add2_offset = Symbol('add2_offset'); const add3 = Symbol('add3'); const add3_offset = Symbol('add3_offset'); const add4 = Symbol('add4'); const mulArray3WithScalar_offset = Symbol('mulArray3WithScalar_offset'); const mulArray4WithScalar_offset = Symbol('mulArray4WithScalar_offset'); const mulArrayNWithScalar_offset = Symbol('mulArrayNWithScalar_offset'); const mulThatAndThisToOutAsMat44_offsetAsComposition = Symbol('mulThatAndThisToOutAsMat44_offsetAsComposition'); const add4_offset = Symbol('add4_offset'); const qlerp_offsetAsComposition = Symbol('qlerp_offsetAsComposition'); const scalar_lerp_offsetAsComposition = Symbol('scalar_lerp_offsetAsComposition'); const array3_lerp_offsetAsComposition = Symbol('array3_lerp_offsetAsComposition'); const arrayN_lerp_offsetAsComposition = Symbol('arrayN_lerp_offsetAsComposition'); const normalizeArray4 = Symbol('normalizeArray4'); const get1_fn = function () { return [this[0]]; }; const get1_offset_fn = function (offset) { return [this[offset]]; }; const get1_offsetAsComposition_fn = function (offsetAsComposition) { return [this[offsetAsComposition]]; }; const get2_fn = function () { return [this[0], this[1]]; }; const get2_offset_fn = function (offset) { return [this[offset], this[offset + 1]]; }; const get2_offsetAsComposition_fn = function (offsetAsComposition) { return [this[offsetAsComposition * 2], this[offsetAsComposition * 2 + 1]]; }; const get3_fn = function () { return [this[0], this[1], this[2]]; }; const get3_offset_fn = function (offset) { return [this[offset], this[offset + 1], this[offset + 2]]; }; const get3_offsetAsComposition_fn = function (offsetAsComposition) { return [ this[offsetAsComposition * 3], this[offsetAsComposition * 3 + 1], this[offsetAsComposition * 3 + 2], ]; }; const get4_fn = function () { return [this[0], this[1], this[2], this[3]]; }; const get4_offset_fn = function (offset) { return [this[offset], this[offset + 1], this[offset + 2], this[offset + 3]]; }; const get4_offsetAsComposition_fn = function (offsetAsComposition) { return [ this[offsetAsComposition * 4], this[offsetAsComposition * 4 + 1], this[offsetAsComposition * 4 + 2], this[offsetAsComposition * 4 + 3], ]; }; const getN_offset_fn = function (offset, componentN) { const array = new Array(componentN); for (let i = 0; i < componentN; i++) { array[i] = this[offset + i]; } return array; }; const getN_offsetAsComposition_fn = function (offsetAsComposition, componentN) { const array = new Array(componentN); for (let i = 0; i < componentN; i++) { array[i] = this[offsetAsComposition * componentN + i]; } return array; }; const add2_fn = function (array) { this[0] += array[0]; this[1] += array[1]; return this; }; const add2_offset_fn = function (array, selfOffset, argOffset) { this[selfOffset] += array[argOffset]; this[selfOffset + 1] += array[argOffset + 1]; return this; }; const add3_fn = function (array) { this[0] += array[0]; this[1] += array[1]; this[2] += array[2]; return this; }; const add3_offset_fn = function (array, selfOffset, argOffset) { this[selfOffset] += array[argOffset]; this[selfOffset + 1] += array[argOffset + 1]; this[selfOffset + 2] += array[argOffset + 2]; return this; }; const add4_fn = function (array) { this[0] += array[0]; this[1] += array[1]; this[2] += array[2]; this[3] += array[3]; return this; }; const add4_offset_fn = function (array, selfOffset, argOffset) { this[selfOffset] += array[argOffset]; this[selfOffset + 1] += array[argOffset + 1]; this[selfOffset + 2] += array[argOffset + 2]; this[selfOffset + 3] += array[argOffset + 3]; return this; }; const mulArray3WithScalar_offset_fn = function (offset, value) { this[offset] *= value; this[offset + 1] *= value; this[offset + 2] *= value; return this; }; const mulArray4WithScalar_offset_fn = function (offset, value) { this[offset] *= value; this[offset + 1] *= value; this[offset + 2] *= value; this[offset + 3] *= value; return this; }; const mulArrayNWithScalar_offset_fn = function (offset, componentN, value) { for (let i = 0; i < componentN; i++) { this[offset + i] *= value; } return this; }; // prettier-ignore const mulThatAndThisToOutAsMat44_offsetAsComposition_fn = function (thisOffsetAsComposition, that, thatOffsetAsComposition, out) { const lv = that; // eslint-disable-next-line @typescript-eslint/no-this-alias const rv = this; const l = thatOffsetAsComposition * 16; const r = thisOffsetAsComposition * 16; out[0] = lv[l] * rv[r] + lv[l + 4] * rv[r + 1] + lv[l + 8] * rv[r + 2] + lv[l + 12] * rv[r + 3]; // m00 out[1] = lv[l + 1] * rv[r] + lv[l + 5] * rv[r + 1] + lv[l + 9] * rv[r + 2] + lv[l + 13] * rv[r + 3]; // m10 out[2] = lv[l + 2] * rv[r] + lv[l + 6] * rv[r + 1] + lv[l + 10] * rv[r + 2] + lv[l + 14] * rv[r + 3]; // m20 out[3] = lv[l + 3] * rv[r] + lv[l + 7] * rv[r + 1] + lv[l + 11] * rv[r + 2] + lv[l + 15] * rv[r + 3]; // m30 out[4] = lv[l] * rv[r + 4] + lv[l + 4] * rv[r + 5] + lv[l + 8] * rv[r + 6] + lv[l + 12] * rv[r + 7]; // m01 out[5] = lv[l + 1] * rv[r + 4] + lv[l + 5] * rv[r + 5] + lv[l + 9] * rv[r + 6] + lv[l + 13] * rv[r + 7]; // m11 out[6] = lv[l + 2] * rv[r + 4] + lv[l + 6] * rv[r + 5] + lv[l + 10] * rv[r + 6] + lv[l + 14] * rv[r + 7]; // m21 out[7] = lv[l + 3] * rv[r + 4] + lv[l + 7] * rv[r + 5] + lv[l + 11] * rv[r + 6] + lv[l + 15] * rv[r + 7]; // m31 out[8] = lv[l] * rv[r + 8] + lv[l + 4] * rv[r + 9] + lv[l + 8] * rv[r + 10] + lv[l + 12] * rv[r + 11]; // m02 out[9] = lv[l + 1] * rv[r + 8] + lv[l + 5] * rv[r + 9] + lv[l + 9] * rv[r + 10] + lv[l + 13] * rv[r + 11]; // m12 out[10] = lv[l + 2] * rv[r + 8] + lv[l + 6] * rv[r + 9] + lv[l + 10] * rv[r + 10] + lv[l + 14] * rv[r + 11]; // m22 out[11] = lv[l + 3] * rv[r + 8] + lv[l + 7] * rv[r + 9] + lv[l + 11] * rv[r + 10] + lv[l + 15] * rv[r + 11]; // m32 out[12] = lv[l] * rv[r + 12] + lv[l + 4] * rv[r + 13] + lv[l + 8] * rv[r + 14] + lv[l + 12] * rv[r + 15]; // m03 out[13] = lv[l + 1] * rv[r + 12] + lv[l + 5] * rv[r + 13] + lv[l + 9] * rv[r + 14] + lv[l + 13] * rv[r + 15]; // m13 out[14] = lv[l + 2] * rv[r + 12] + lv[l + 6] * rv[r + 13] + lv[l + 10] * rv[r + 14] + lv[l + 14] * rv[r + 15]; // m23 out[15] = lv[l + 3] * rv[r + 12] + lv[l + 7] * rv[r + 13] + lv[l + 11] * rv[r + 14] + lv[l + 15] * rv[r + 15]; // m33 }; const qlerp_offsetAsComposition_fn = function (array, ratio, selfOffsetAsComposition, argOffsetAsComposition) { const out = new Array(4); let dotProduct = this[0 + selfOffsetAsComposition * 4] * array[0 + argOffsetAsComposition * 4] + this[1 + selfOffsetAsComposition * 4] * array[1 + argOffsetAsComposition * 4] + this[2 + selfOffsetAsComposition * 4] * array[2 + argOffsetAsComposition * 4] + this[3 + selfOffsetAsComposition * 4] * array[3 + argOffsetAsComposition * 4]; const ss = 1.0 - dotProduct * dotProduct; if (ss === 0.0) { out[0] = this[0 + selfOffsetAsComposition * 4]; out[1] = this[1 + selfOffsetAsComposition * 4]; out[2] = this[2 + selfOffsetAsComposition * 4]; out[3] = this[3 + selfOffsetAsComposition * 4]; } else { if (dotProduct > 1) { dotProduct = 0.999; } else if (dotProduct < -1) { dotProduct = -0.999; } let theta = Math.acos(dotProduct); const sinTheta = Math.sin(theta); let s2; if (dotProduct < 0.0) { dotProduct *= -1; theta = Math.acos(dotProduct); s2 = (-1 * Math.sin(theta * ratio)) / sinTheta; } else { s2 = Math.sin(theta * ratio) / sinTheta; } const s1 = Math.sin(theta * (1.0 - ratio)) / sinTheta; out[0] = this[0 + selfOffsetAsComposition * 4] * s1 + array[0 + argOffsetAsComposition * 4] * s2; out[1] = this[1 + selfOffsetAsComposition * 4] * s1 + array[1 + argOffsetAsComposition * 4] * s2; out[2] = this[2 + selfOffsetAsComposition * 4] * s1 + array[2 + argOffsetAsComposition * 4] * s2; out[3] = this[3 + selfOffsetAsComposition * 4] * s1 + array[3 + argOffsetAsComposition * 4] * s2; } return out; }; const scalar_lerp_offsetAsComposition_fn = function (array, ratio, selfOffset, argOffset) { return this[selfOffset] * (1 - ratio) + array[argOffset] * ratio; }; const array3_lerp_offsetAsComposition_fn = function (array, ratio, selfOffsetAsComposition, argOffsetAsComposition) { const ret = new Array(3); for (let i = 0; i < 3; i++) { ret[i] = this[selfOffsetAsComposition * 3 + i] * (1 - ratio) + array[argOffsetAsComposition * 3 + i] * ratio; } return ret; }; const arrayN_lerp_offsetAsComposition_fn = function (array, componentN, ratio, selfOffsetAsComposition, argOffsetAsComposition) { const ret = new Array(componentN); for (let i = 0; i < componentN; i++) { ret[i] = this[selfOffsetAsComposition * componentN + i] * (1 - ratio) + array[argOffsetAsComposition * componentN + i] * ratio; } return ret; }; const normalizeArray4_fn = function () { const length = Math.hypot(this[0], this[1], this[2], this[3]); this[0] /= length; this[1] /= length; this[2] /= length; this[3] /= length; return this; }; const arrayTypes = [ Array, Float32Array, Float64Array, Int8Array, Int16Array, Int32Array, Uint8Array, Uint16Array, Uint32Array, ]; const operators = [ get1_offsetAsComposition, get2_offsetAsComposition, get1, get1_offset, get2, get2_offset, get3, get3_offset, get3_offsetAsComposition, get4, get4_offset, get4_offsetAsComposition, getN_offset, getN_offsetAsComposition, add2, add2_offset, add3, add3_offset, add4, add4_offset, mulArray3WithScalar_offset, mulArray4WithScalar_offset, mulArrayNWithScalar_offset, mulThatAndThisToOutAsMat44_offsetAsComposition, qlerp_offsetAsComposition, scalar_lerp_offsetAsComposition, array3_lerp_offsetAsComposition, arrayN_lerp_offsetAsComposition, normalizeArray4, ]; const functions = [ get1_offsetAsComposition_fn, get2_offsetAsComposition_fn, get1_fn, get1_offset_fn, get2_fn, get2_offset_fn, get3_fn, get3_offset_fn, get3_offsetAsComposition_fn, get4_fn, get4_offset_fn, get4_offsetAsComposition_fn, getN_offset_fn, getN_offsetAsComposition_fn, add2_fn, add2_offset_fn, add3_fn, add3_offset_fn, add4_fn, add4_offset_fn, mulArray3WithScalar_offset_fn, mulArray4WithScalar_offset_fn, mulArrayNWithScalar_offset_fn, mulThatAndThisToOutAsMat44_offsetAsComposition_fn, qlerp_offsetAsComposition_fn, scalar_lerp_offsetAsComposition_fn, array3_lerp_offsetAsComposition_fn, arrayN_lerp_offsetAsComposition_fn, normalizeArray4_fn, ]; for (let i = 0; i < arrayTypes.length; i++) { for (let j = 0; j < operators.length; j++) { arrayTypes[i].prototype[operators[j]] = functions[j]; } } /***/ }), /***/ "./src/foundation/memory/Accessor.ts": /*!*******************************************!*\ !*** ./src/foundation/memory/Accessor.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Accessor: () => (/* binding */ Accessor) /* harmony export */ }); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _math_Vector2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math/Vector2 */ "./src/foundation/math/Vector2.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math/MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _math_Matrix33__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../math/Matrix33 */ "./src/foundation/math/Matrix33.ts"); /* harmony import */ var _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class Accessor { constructor({ bufferView, byteOffsetInBufferView, compositionType, componentType, byteStride, count, raw, max, min, arrayLength, normalized, }) { var _a, _b, _c, _d, _e, _f, _g, _h; this.__compositionType = _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.Unknown; this.__componentType = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Unknown; this.__count = 0; this.__takenCount = 0; this.__byteStride = 0; // Accessor has the byteStride. BufferView doesn't. For supporting glTF1, not only glTF2 this.__max = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__.MutableVector4.fromCopyArray([ -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, ]); this.__min = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__.MutableVector4.fromCopyArray([ Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, ]); this.__arrayLength = 1; this.__normalized = false; this.__isMinMixDirty = true; this.__version = 0; this.__bufferView = bufferView; this.__byteOffsetInRawArrayBufferOfBuffer = bufferView.byteOffsetInRawArrayBufferOfBuffer + byteOffsetInBufferView; this.__compositionType = compositionType; this.__componentType = componentType; this.__count = count; this.__arrayLength = arrayLength; if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(max)) { this.__max.setComponents((_a = max[0]) !== null && _a !== void 0 ? _a : -Number.MAX_VALUE, (_b = max[1]) !== null && _b !== void 0 ? _b : -Number.MAX_VALUE, (_c = max[2]) !== null && _c !== void 0 ? _c : -Number.MAX_VALUE, (_d = max[3]) !== null && _d !== void 0 ? _d : -Number.MAX_VALUE); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(min)) { this.__min.setComponents((_e = min[0]) !== null && _e !== void 0 ? _e : Number.MAX_VALUE, (_f = min[1]) !== null && _f !== void 0 ? _f : Number.MAX_VALUE, (_g = min[2]) !== null && _g !== void 0 ? _g : Number.MAX_VALUE, (_h = min[3]) !== null && _h !== void 0 ? _h : Number.MAX_VALUE); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(max) && _misc_Is__WEBPACK_IMPORTED_MODULE_10__.Is.exist(min)) { this.__isMinMixDirty = false; } this.__raw = raw; this.__normalized = normalized; this.__byteStride = byteStride; if (this.__byteStride === 0) { this.__byteStride = this.__compositionType.getNumberOfComponents() * this.__componentType.getSizeInBytes() * this.__arrayLength; } const typedArrayClass = this.getTypedArrayClass(this.__componentType); this.__typedArrayClass = typedArrayClass; /// Check const maxExceededSizeOnAoS = this.__byteStride - this.__compositionType.getNumberOfComponents() * this.__componentType.getSizeInBytes(); const sizeFromAccessorBeginToArrayBufferEnd = this.__raw.byteLength - this.__byteOffsetInRawArrayBufferOfBuffer; const maxLimitSizeToAccess = this.byteStride * this.__count - maxExceededSizeOnAoS; if (sizeFromAccessorBeginToArrayBufferEnd < maxLimitSizeToAccess) { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error(`Requesting a data size that exceeds the remaining capacity of the buffer: ${this.bufferView.buffer.name}. Exceeded Size: ${maxLimitSizeToAccess - sizeFromAccessorBeginToArrayBufferEnd} this.__raw.byteLength: ${this.__raw.byteLength} this.__byteOffsetInRawArrayBufferOfBuffer: ${this.byteOffsetInRawArrayBufferOfBuffer} this.byteStride: ${this.byteStride} this.__count: ${this.__count} this.__raw.byteLength - this.__byteOffsetInRawArrayBufferOfBuffer: ${this.__raw.byteLength - this.__byteOffsetInRawArrayBufferOfBuffer} this.byteStride * this.__count: ${this.byteStride * this.__count} maxExceededSizeOnAoS: ${maxExceededSizeOnAoS} `); } this.__dataView = new DataView(this.__raw, this.__byteOffsetInRawArrayBufferOfBuffer, Math.min(this.__byteStride * this.__count, this.__raw.byteLength - this.__byteOffsetInRawArrayBufferOfBuffer)); this.__typedArray = new typedArrayClass(this.__raw, this.__byteOffsetInRawArrayBufferOfBuffer, this.__compositionType.getNumberOfComponents() * this.__count); this.__dataViewGetter = this.__dataView[this.getDataViewGetter(this.__componentType)].bind(this.__dataView); this.__dataViewSetter = this.__dataView[this.getDataViewSetter(this.__componentType)].bind(this.__dataView); } __onUpdated() { var _a; this.__version++; if (this._primitive != null) { (_a = this._primitive.deref()) === null || _a === void 0 ? void 0 : _a.onAccessorUpdated(this.__version); } } getTypedArrayClass(componentType) { switch (componentType) { case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Byte: return Int8Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedByte: return Uint8Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Short: return Int16Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedShort: return Uint16Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int: return Int32Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedInt: return Uint32Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float: return Float32Array; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Double: return Float64Array; default: _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('Unexpected ComponentType!'); return void 0; } } getDataViewGetter(componentType) { switch (componentType) { case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Byte: return 'getInt8'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedByte: return 'getUint8'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Short: return 'getInt16'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedShort: return 'getUint16'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int: return 'getInt32'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedInt: return 'getUint32'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float: return 'getFloat32'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Double: return 'getFloat64'; default: _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('Unexpected ComponentType!'); return 'unknown'; } } getDataViewSetter(componentType) { switch (componentType) { case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Byte: return 'setInt8'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedByte: return 'setUint8'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Short: return 'setInt16'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedShort: return 'setUint16'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Int: return 'setInt32'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.UnsignedInt: return 'setUint32'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Float: return 'setFloat32'; case _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_0__.ComponentType.Double: return 'setFloat64'; default: _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('Unexpected ComponentType!'); } return undefined; } takeOne() { const arrayBufferOfBufferView = this.__raw; // let stride = this.__compositionType.getNumberOfComponents() * this.__componentType.getSizeInBytes(); // if (this.__bufferView.isAoS) { // stride = this.__bufferView.byteStride; // } if (this.__takenCount >= this.__count) { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('You are trying to allocate more than you have secured.'); } const subTypedArray = new this.__typedArrayClass(arrayBufferOfBufferView, this.__byteOffsetInRawArrayBufferOfBuffer + this.__byteStride * this.__takenCount, this.__compositionType.getNumberOfComponents() * this.__arrayLength); // console.log(this.byteOffsetInRawArrayBufferOfBuffer, this.__byteStride, this.__takenCount, this.__arrayLength); subTypedArray._accessor = this; subTypedArray._idx_of_accessor = this.__takenCount; this.__takenCount += 1; return subTypedArray; } _takeExistedOne(idx) { const arrayBufferOfBufferView = this.__raw; if (idx >= this.__count) { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('You are trying to allocate more than you have secured.'); } const subTypedArray = new this.__typedArrayClass(arrayBufferOfBufferView, this.__byteOffsetInRawArrayBufferOfBuffer + this.__byteStride * idx, this.__compositionType.getNumberOfComponents() * this.__arrayLength); // console.log(this.byteOffsetInRawArrayBufferOfBuffer, this.__byteStride, this.__takenCount, this.__arrayLength); subTypedArray._accessor = this; subTypedArray._idx_of_accessor = idx; return subTypedArray; } get takenCount() { return this.takenCount; } get numberOfComponents() { return this.__compositionType.getNumberOfComponents(); } get componentSizeInBytes() { return this.__componentType.getSizeInBytes(); } get elementSizeInBytes() { return this.numberOfComponents * this.componentSizeInBytes; } /** * get element count * element may be scalar, vec2, vec3, vec4, ... */ get elementCount() { return this.__count; } get byteLength() { return this.__byteStride * this.__count; } get componentType() { return this.__componentType; } get compositionType() { return this.__compositionType; } /** * * @returns */ getTypedArray() { // if (this.__bufferView.isAoS) { // console.warn( // 'Be careful. this reference bufferView is AoS(Array on Structure), it means Interleaved Data. So you can not access your data properly by this TypedArray.' // ); // } return this.__typedArray; } getUint8Array() { // if (this.__bufferView.isAoS) { // console.warn( // 'Be careful. this reference bufferView is AoS(Array on Structure), it means Interleaved Data. So you can not access your data properly by this TypedArray.' // ); // } return new Uint8Array(this.bufferView.buffer.getArrayBuffer(), this.byteOffsetInRawArrayBufferOfBuffer, this.byteLength); } get isAoS() { return !this.isSoA; } get isSoA() { const isSoA = this.byteStride === this.__compositionType.getNumberOfComponents() * this.__componentType.getSizeInBytes(); return isSoA; } get byteStride() { return this.__byteStride; } getScalar(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } return this.__dataViewGetter(this.__byteStride * index, endian); } getScalarAt(i, compositionOffset, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } return this.__dataViewGetter(this.__byteStride * index + compositionOffset, endian); } getVec2AsArray(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return [ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), ]; } getVec3AsArray(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return [ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), ]; } getVec4AsArray(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return [ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), ]; } getMat3AsArray(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return [ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 4 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 5 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 6 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 7 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 8 * byteSize, endian), ]; } getMat4AsArray(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return [ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 4 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 5 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 6 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 7 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 8 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 9 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 10 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 11 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 12 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 13 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 14 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 15 * byteSize, endian), ]; } getVec2(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return _math_Vector2__WEBPACK_IMPORTED_MODULE_2__.Vector2.fromCopyArray2([ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), ]); } getVec3(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return _math_Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.fromCopyArray([ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), ]); } getVec4(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([ this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), ]); } getMat3(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return _math_Matrix33__WEBPACK_IMPORTED_MODULE_8__.Matrix33.fromCopy9RowMajor(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 4 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 5 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 6 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 7 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 8 * byteSize, endian)); } getMat4(i, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return _math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix44.fromCopy16RowMajor(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 4 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 5 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 6 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 7 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 8 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 9 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 10 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 11 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 12 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 13 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 14 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 15 * byteSize, endian)); } getVec2To(i, out, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return out.setComponents(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian)); } getVec3To(i, out, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return out.setComponents(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian)); } getVec4To(i, out, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return out.setComponents(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian)); } getMat3To(i, out, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return out.setComponents(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 4 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 5 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 6 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 7 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 8 * byteSize, endian)); } getMat4To(i, out, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const byteSize = this.componentSizeInBytes; return out.setComponents(this.__dataViewGetter(this.__byteStride * index, endian), this.__dataViewGetter(this.__byteStride * index + 1 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 2 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 3 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 4 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 5 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 6 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 7 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 8 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 9 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 10 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 11 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 12 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 13 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 14 * byteSize, endian), this.__dataViewGetter(this.__byteStride * index + 15 * byteSize, endian)); } setScalar(i, value, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } this.__dataViewSetter(this.__byteStride * index, value, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setVec2(i, x, y, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, x, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, y, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setVec3(i, x, y, z, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, x, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, y, endian); this.__dataViewSetter(this.__byteStride * index + 2 * sizeInBytes, z, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setVec4(i, x, y, z, w, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, x, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, y, endian); this.__dataViewSetter(this.__byteStride * index + 2 * sizeInBytes, z, endian); this.__dataViewSetter(this.__byteStride * index + 3 * sizeInBytes, w, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setMat4(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, v0, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, v1, endian); this.__dataViewSetter(this.__byteStride * index + 2 * sizeInBytes, v2, endian); this.__dataViewSetter(this.__byteStride * index + 3 * sizeInBytes, v3, endian); this.__dataViewSetter(this.__byteStride * index + 4 * sizeInBytes, v4, endian); this.__dataViewSetter(this.__byteStride * index + 5 * sizeInBytes, v5, endian); this.__dataViewSetter(this.__byteStride * index + 6 * sizeInBytes, v6, endian); this.__dataViewSetter(this.__byteStride * index + 7 * sizeInBytes, v7, endian); this.__dataViewSetter(this.__byteStride * index + 8 * sizeInBytes, v8, endian); this.__dataViewSetter(this.__byteStride * index + 9 * sizeInBytes, v9, endian); this.__dataViewSetter(this.__byteStride * index + 10 * sizeInBytes, v10, endian); this.__dataViewSetter(this.__byteStride * index + 11 * sizeInBytes, v11, endian); this.__dataViewSetter(this.__byteStride * index + 12 * sizeInBytes, v12, endian); this.__dataViewSetter(this.__byteStride * index + 13 * sizeInBytes, v13, endian); this.__dataViewSetter(this.__byteStride * index + 14 * sizeInBytes, v14, endian); this.__dataViewSetter(this.__byteStride * index + 15 * sizeInBytes, v15, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setVec2AsVector(i, vec, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, vec.x, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, vec.y, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setVec3AsVector(i, vec, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, vec.x, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, vec.y, endian); this.__dataViewSetter(this.__byteStride * index + 2 * sizeInBytes, vec.z, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setVec4AsVector(i, vec, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, vec.x, endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, vec.y, endian); this.__dataViewSetter(this.__byteStride * index + 2 * sizeInBytes, vec.z, endian); this.__dataViewSetter(this.__byteStride * index + 3 * sizeInBytes, vec.w, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setMat4AsMatrix44(i, mat, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } const sizeInBytes = this.componentSizeInBytes; this.__dataViewSetter(this.__byteStride * index, mat._v[0], endian); this.__dataViewSetter(this.__byteStride * index + 1 * sizeInBytes, mat._v[1], endian); this.__dataViewSetter(this.__byteStride * index + 2 * sizeInBytes, mat._v[2], endian); this.__dataViewSetter(this.__byteStride * index + 3 * sizeInBytes, mat._v[3], endian); this.__dataViewSetter(this.__byteStride * index + 4 * sizeInBytes, mat._v[4], endian); this.__dataViewSetter(this.__byteStride * index + 5 * sizeInBytes, mat._v[5], endian); this.__dataViewSetter(this.__byteStride * index + 6 * sizeInBytes, mat._v[6], endian); this.__dataViewSetter(this.__byteStride * index + 7 * sizeInBytes, mat._v[7], endian); this.__dataViewSetter(this.__byteStride * index + 8 * sizeInBytes, mat._v[8], endian); this.__dataViewSetter(this.__byteStride * index + 9 * sizeInBytes, mat._v[9], endian); this.__dataViewSetter(this.__byteStride * index + 10 * sizeInBytes, mat._v[10], endian); this.__dataViewSetter(this.__byteStride * index + 11 * sizeInBytes, mat._v[11], endian); this.__dataViewSetter(this.__byteStride * index + 12 * sizeInBytes, mat._v[12], endian); this.__dataViewSetter(this.__byteStride * index + 13 * sizeInBytes, mat._v[13], endian); this.__dataViewSetter(this.__byteStride * index + 14 * sizeInBytes, mat._v[14], endian); this.__dataViewSetter(this.__byteStride * index + 15 * sizeInBytes, mat._v[15], endian); this.__isMinMixDirty = true; this.__onUpdated(); } copyFromTypedArray(typedArray) { const componentN = this.numberOfComponents; for (let j = 0; j < typedArray.byteLength / this.componentSizeInBytes; j++) { const idx = Math.floor(j / componentN); const idxN = idx * componentN; switch (componentN) { case 1: this.setScalar(idx, typedArray[idxN + 0], {}); break; case 2: this.setVec2(idx, typedArray[idxN + 0], typedArray[idxN + 1], {}); break; case 3: this.setVec3(idx, typedArray[idxN + 0], typedArray[idxN + 1], typedArray[idxN + 2], {}); break; case 4: this.setVec4(idx, typedArray[idxN + 0], typedArray[idxN + 1], typedArray[idxN + 2], typedArray[idxN + 3], {}); break; default: throw new Error('Other than vectors are currently not supported.'); } } this.__isMinMixDirty = true; this.__onUpdated(); } setScalarAt(i, compositionOffset, value, { indicesAccessor, endian = true }) { let index = i; if (indicesAccessor) { index = indicesAccessor.getScalar(i, {}); } this.__dataViewSetter(this.__byteStride * index + compositionOffset, value, endian); this.__isMinMixDirty = true; this.__onUpdated(); } setElementFromSameCompositionAccessor(i, accessor, secondIdx) { const j = secondIdx !== null && secondIdx !== void 0 ? secondIdx : i; if (this.compositionType.getNumberOfComponents() === 1) { this.setScalar(i, accessor.getScalar(j, {}), {}); } else if (this.compositionType.getNumberOfComponents() === 2) { this.setVec2AsVector(i, accessor.getVec2(j, {}), {}); } else if (this.compositionType.getNumberOfComponents() === 3) { this.setVec3AsVector(i, accessor.getVec3(j, {}), {}); } else if (this.compositionType.getNumberOfComponents() === 4) { this.setVec4AsVector(i, accessor.getVec4(j, {}), {}); } this.__isMinMixDirty = true; this.__onUpdated(); } copyBuffer(accessor) { new Uint8Array(this.__raw).set(new Uint8Array(accessor.__raw, accessor.__byteOffsetInRawArrayBufferOfBuffer, accessor.byteLength), this.__byteOffsetInRawArrayBufferOfBuffer); this.__isMinMixDirty = true; this.__onUpdated(); } setElementFromAccessor(i, accessor, secondIdx) { const j = secondIdx !== null && secondIdx !== void 0 ? secondIdx : i; if (this.compositionType.getNumberOfComponents() === 1) { if (accessor.compositionType.getNumberOfComponents() === 1) { this.setScalar(i, accessor.getScalar(j, {}), {}); } else if (accessor.compositionType.getNumberOfComponents() === 2) { this.setScalar(i, accessor.getVec2(j, {}).x, {}); } else if (accessor.compositionType.getNumberOfComponents() === 3) { this.setScalar(i, accessor.getVec3(j, {}).x, {}); } else if (accessor.compositionType.getNumberOfComponents() === 4) { this.setScalar(i, accessor.getVec4(j, {}).x, {}); } } else if (this.compositionType.getNumberOfComponents() === 2) { if (accessor.compositionType.getNumberOfComponents() === 1) { const scalar = accessor.getScalar(j, {}); this.setVec2(i, scalar, 0, {}); } else if (accessor.compositionType.getNumberOfComponents() === 2) { this.setVec2AsVector(i, accessor.getVec2(j, {}), {}); } else if (accessor.compositionType.getNumberOfComponents() === 3) { const vec = accessor.getVec3(j, {}); this.setVec2(i, vec.x, vec.y, {}); } else if (accessor.compositionType.getNumberOfComponents() === 4) { const vec = accessor.getVec4(j, {}); this.setVec2(i, vec.x, vec.y, {}); } } else if (this.compositionType.getNumberOfComponents() === 3) { if (accessor.compositionType.getNumberOfComponents() === 1) { const scalar = accessor.getScalar(j, {}); this.setVec3(i, scalar, 0, 0, {}); } else if (accessor.compositionType.getNumberOfComponents() === 2) { const vec = accessor.getVec2(j, {}); this.setVec3(i, vec.x, vec.y, 0, {}); } else if (accessor.compositionType.getNumberOfComponents() === 3) { const vec = accessor.getVec3(j, {}); this.setVec3AsVector(i, vec, {}); } else if (accessor.compositionType.getNumberOfComponents() === 4) { const vec = accessor.getVec4(j, {}); this.setVec3(i, vec.x, vec.y, vec.z, {}); } } else if (this.compositionType.getNumberOfComponents() === 4) { if (accessor.compositionType.getNumberOfComponents() === 1) { const scalar = accessor.getScalar(j, {}); this.setVec4(i, scalar, 0, 0, 0, {}); } else if (accessor.compositionType.getNumberOfComponents() === 2) { const vec = accessor.getVec2(j, {}); this.setVec4(i, vec.x, vec.y, 0, 0, {}); } else if (accessor.compositionType.getNumberOfComponents() === 3) { const vec = accessor.getVec3(j, {}); this.setVec4(i, vec.x, vec.y, vec.z, 0, {}); } else if (accessor.compositionType.getNumberOfComponents() === 4) { const vec = accessor.getVec4(j, {}); this.setVec4AsVector(i, vec, {}); } } this.__isMinMixDirty = true; this.__onUpdated(); } addElementFromSameCompositionAccessor(i, accessor, coeff, secondIdx) { const j = secondIdx !== null && secondIdx !== void 0 ? secondIdx : i; if (this.compositionType.getNumberOfComponents() === 1) { this.setScalar(i, this.getScalar(i, {}) + coeff * accessor.getScalar(j, {}), {}); } else if (this.compositionType.getNumberOfComponents() === 2) { this.setVec2AsVector(i, _math_Vector2__WEBPACK_IMPORTED_MODULE_2__.Vector2.add(this.getVec2(i, {}), _math_Vector2__WEBPACK_IMPORTED_MODULE_2__.Vector2.multiply(accessor.getVec2(j, {}), coeff)), {}); } else if (this.compositionType.getNumberOfComponents() === 3) { this.setVec3AsVector(i, _math_Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.add(this.getVec3(i, {}), _math_Vector3__WEBPACK_IMPORTED_MODULE_3__.Vector3.multiply(accessor.getVec3(j, {}), coeff)), {}); } else if (this.compositionType.getNumberOfComponents() === 4) { this.setVec4AsVector(i, _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.add(this.getVec4(i, {}), _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.multiply(accessor.getVec4(j, {}), coeff)), {}); } this.__isMinMixDirty = true; this.__onUpdated(); } get arrayBufferOfBufferView() { return this.__raw; } get dataViewOfBufferView() { return this.__dataView; } get byteOffsetInBufferView() { return (this.__byteOffsetInRawArrayBufferOfBuffer - this.__bufferView.byteOffsetInRawArrayBufferOfBuffer); } get byteOffsetInBuffer() { return (this.__byteOffsetInRawArrayBufferOfBuffer - this.__bufferView.buffer.byteOffsetInRawArrayBuffer); } get byteOffsetInRawArrayBufferOfBuffer() { return this.__byteOffsetInRawArrayBufferOfBuffer; } get bufferView() { return this.__bufferView; } setMinMax(min, max) { const componentN = this.compositionType.getNumberOfComponents(); if (componentN === 1) { this.__min._v[0] = min[0]; this.__max._v[0] = max[0]; } else if (componentN === 2) { this.__min._v[0] = min[0]; this.__min._v[1] = min[1]; this.__max._v[0] = max[0]; this.__max._v[1] = max[1]; } else if (componentN === 3) { this.__min._v[0] = min[0]; this.__min._v[1] = min[1]; this.__min._v[2] = min[2]; this.__max._v[0] = max[0]; this.__max._v[1] = max[1]; this.__max._v[2] = max[2]; } else if (componentN === 4) { this.__min._v[0] = min[0]; this.__min._v[1] = min[1]; this.__min._v[2] = min[2]; this.__min._v[3] = min[3]; this.__max._v[0] = max[0]; this.__max._v[1] = max[1]; this.__max._v[2] = max[2]; this.__max._v[3] = max[3]; } this.__isMinMixDirty = false; } get min() { if (this.__isMinMixDirty) { this.__calcMinMax(); } const componentN = this.compositionType.getNumberOfComponents(); if (componentN === 4) { return [this.__min._v[0], this.__min._v[1], this.__min._v[2], this.__min._v[3]]; } else if (componentN === 3) { return [this.__min._v[0], this.__min._v[1], this.__min._v[2]]; } else if (componentN === 2) { return [this.__min._v[0], this.__min._v[1]]; } else { return [this.__min._v[0]]; } } get max() { if (this.__isMinMixDirty) { this.__calcMinMax(); } const componentN = this.compositionType.getNumberOfComponents(); if (componentN === 4) { return [this.__max._v[0], this.__max._v[1], this.__max._v[2], this.__max._v[3]]; } else if (componentN === 3) { return [this.__max._v[0], this.__max._v[1], this.__max._v[2]]; } else if (componentN === 2) { return [this.__max._v[0], this.__max._v[1]]; } else { return [this.__max._v[0]]; } } get normalized() { return this.__normalized; } __calcMinMax() { const componentN = this.compositionType.getNumberOfComponents(); if (componentN === 4) { this.__max.setComponents(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); this.__min.setComponents(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); const vec4 = Accessor.__tmpVector4_0; for (let i = 0; i < this.elementCount; i++) { this.getVec4To(i, vec4, {}); for (let j = 0; j < 4; j++) { if (this.__max._v[j] < vec4._v[j]) { this.__max._v[j] = vec4._v[j]; } if (vec4._v[j] < this.__min._v[j]) { this.__min._v[j] = vec4._v[j]; } } } } else if (componentN === 3) { this.__max.setComponents(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); this.__min.setComponents(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); const vec3 = Accessor.__tmpVector3_0; for (let i = 0; i < this.elementCount; i++) { this.getVec3To(i, vec3, {}); for (let j = 0; j < 3; j++) { if (this.__max._v[j] < vec3._v[j]) { this.__max._v[j] = vec3._v[j]; } if (vec3._v[j] < this.__min._v[j]) { this.__min._v[j] = vec3._v[j]; } } } } else if (componentN === 2) { this.__max.setComponents(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); this.__min.setComponents(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); const vec2 = Accessor.__tmpVector2_0; for (let i = 0; i < this.elementCount; i++) { this.getVec2To(i, vec2, {}); for (let j = 0; j < 2; j++) { if (this.__max._v[j] < vec2._v[j]) { this.__max._v[j] = vec2._v[j]; } if (vec2._v[j] < this.__min._v[j]) { this.__min._v[j] = vec2._v[j]; } } } } else if (componentN === 1) { this.__max.setComponents(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); this.__min.setComponents(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); for (let i = 0; i < this.elementCount; i++) { const scalar = this.getScalar(i, {}); if (this.__max._v[0] < scalar) { this.__max._v[0] = scalar; } if (scalar < this.__min._v[0]) { this.__min._v[0] = scalar; } } } this.__isMinMixDirty = false; } get isMinMaxDirty() { return this.__isMinMixDirty; } get version() { return this.__version; } get actualByteStride() { if (this.__byteStride === 0) { const actualByteStride = this.__compositionType.getNumberOfComponents() * this.__componentType.getSizeInBytes() * this.__arrayLength; return actualByteStride; } else { return this.__byteStride; } } isSame(rnAccessor) { return (this.byteLength === rnAccessor.byteLength && this.byteOffsetInRawArrayBufferOfBuffer === rnAccessor.byteOffsetInRawArrayBufferOfBuffer && this.bufferView.buffer.getArrayBuffer() === rnAccessor.bufferView.buffer.getArrayBuffer()); } } Accessor.__tmpVector4_0 = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_7__.MutableVector4.zero(); Accessor.__tmpVector3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_6__.MutableVector3.zero(); Accessor.__tmpVector2_0 = _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__.MutableVector2.zero(); /***/ }), /***/ "./src/foundation/memory/Buffer.ts": /*!*****************************************!*\ !*** ./src/foundation/memory/Buffer.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Buffer: () => (/* binding */ Buffer) /* harmony export */ }); /* harmony import */ var _BufferView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BufferView */ "./src/foundation/memory/BufferView.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class Buffer { constructor({ byteLength, buffer, name, byteAlign, }) { this.__byteLength = 0; this.__byteOffset = 0; this.__takenBytesIndex = 0; this.__name = ''; this.__bufferViews = []; this.__name = name; this.__byteLength = byteLength; this.__byteAlign = byteAlign; if (buffer instanceof Uint8Array) { this.__raw = buffer.buffer; this.__byteOffset = buffer.byteOffset; } else { this.__raw = buffer; } } set name(str) { this.__name = str; } get name() { return this.__name; } getArrayBuffer() { return this.__raw; } __padding(byteLengthToNeed, byteAlign) { const paddingSize = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_3__.DataUtil.calcPaddingBytes(byteLengthToNeed, byteAlign); if (paddingSize > 0) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.info('Padding bytes added to takenBytesIndex.'); } return paddingSize; } takeBufferView({ byteLengthToNeed, byteStride, }) { // const byteAlign = this.__byteAlign; // const paddingBytes = this.__padding(byteLengthToNeed, byteAlign); // const byteSizeToTake = byteLengthToNeed + paddingBytes; const byteSizeToTake = byteLengthToNeed; // + paddingBytes; // byteSizeToTake = DataUtil.addPaddingBytes(byteSizeToTake, this.__byteAlign); if (byteSizeToTake + this.__takenBytesIndex > this.byteLength) { const message = `The size of the BufferView you are trying to take exceeds the byte length left in the Buffer. Buffer.byteLength: ${this.byteLength}, Buffer.takenSizeInByte: ${this.takenSizeInByte}, byteSizeToTake: ${byteSizeToTake}, the byte length left in the Buffer: ${this.__byteLength - this.__takenBytesIndex}`; // console.error(message); return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Err({ message, error: { 'Buffer.byteLength': this.takenSizeInByte, 'Buffer.takenSizeInByte': this.takenSizeInByte, }, }); } const bufferView = new _BufferView__WEBPACK_IMPORTED_MODULE_0__.BufferView({ buffer: this, byteOffsetInBuffer: this.__takenBytesIndex, defaultByteStride: byteStride, byteLength: byteSizeToTake, raw: this.__raw, }); this.__takenBytesIndex += byteSizeToTake; this.__takenBytesIndex = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_3__.DataUtil.addPaddingBytes(this.__takenBytesIndex, this.__byteAlign); this.__bufferViews.push(bufferView); return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Ok(bufferView); } takeBufferViewWithByteOffset({ byteLengthToNeed, byteStride, byteOffset, }) { const byteSizeToTake = byteLengthToNeed; if (byteSizeToTake + byteOffset > this.byteLength) { const message = `The size of the BufferView you are trying to take exceeds the byte length left in the Buffer. Buffer.byteLength: ${this.byteLength}, Buffer.takenSizeInByte: ${this.takenSizeInByte}, byteSizeToTake: ${byteLengthToNeed}, the byte length left in the Buffer: ${this.__byteLength - this.__takenBytesIndex}`; return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Err({ message, error: undefined, }); } const bufferView = new _BufferView__WEBPACK_IMPORTED_MODULE_0__.BufferView({ buffer: this, byteOffsetInBuffer: byteOffset, defaultByteStride: byteStride, byteLength: byteLengthToNeed, raw: this.__raw, }); const takenBytesIndex = Uint8Array.BYTES_PER_ELEMENT * byteLengthToNeed + byteOffset; if (this.__takenBytesIndex < takenBytesIndex) { this.__takenBytesIndex = takenBytesIndex; } this.__bufferViews.push(bufferView); return new _misc_Result__WEBPACK_IMPORTED_MODULE_4__.Ok(bufferView); } _addTakenByteIndex(value) { this.__takenBytesIndex += value; } get byteLength() { return this.__byteLength; } get takenSizeInByte() { return this.__takenBytesIndex; } get byteOffsetInRawArrayBuffer() { return this.__byteOffset; } getTypedArray(offset4bytesUnit, compositionType, componentType, length = 100) { let ret; const typedArray = _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.toTypedArray(componentType); if (typedArray === undefined) { _misc_Logger__WEBPACK_IMPORTED_MODULE_5__.Logger.warn('componentType is Invalid'); } if (_foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.isArray(compositionType)) { ret = new typedArray(this.__raw, this.__byteOffset + offset4bytesUnit * 4, length); } else { ret = new typedArray(this.__raw, this.__byteOffset + offset4bytesUnit * 4, 1); } return ret; } isSame(buffer) { return this.__raw === buffer.__raw; } } /***/ }), /***/ "./src/foundation/memory/BufferView.ts": /*!*********************************************!*\ !*** ./src/foundation/memory/BufferView.ts ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BufferView: () => (/* binding */ BufferView) /* harmony export */ }); /* harmony import */ var _Accessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Accessor */ "./src/foundation/memory/Accessor.ts"); /* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc */ "./src/foundation/misc/index.ts"); class BufferView { constructor({ buffer, byteOffsetInBuffer, defaultByteStride, byteLength, raw, }) { this.__defaultByteStride = 0; this.__takenByte = 0; this.__takenAccessorCount = 0; this.__accessors = []; this.__buffer = buffer; this.__byteOffsetInBuffer = byteOffsetInBuffer; this.__byteOffsetInRawArrayBufferOfBuffer = buffer.byteOffsetInRawArrayBuffer + byteOffsetInBuffer; this.__byteLength = byteLength; this.__defaultByteStride = defaultByteStride; this.__raw = raw; } get defaultByteStride() { return this.__defaultByteStride; } get byteLength() { return this.__byteLength; } /** * byteOffset in Buffer (includes byteOffset of Buffer in it's inner arraybuffer) */ get byteOffsetInBuffer() { return this.__byteOffsetInRawArrayBufferOfBuffer - this.__buffer.byteOffsetInRawArrayBuffer; } /** * byteOffset in Buffer (includes byteOffset of Buffer in it's inner arraybuffer) */ get byteOffsetInRawArrayBufferOfBuffer() { return this.__byteOffsetInRawArrayBufferOfBuffer; } get buffer() { return this.__buffer; } get isSoA() { return !this.isAoS; } get isAoS() { for (const accessor of this.__accessors) { if (accessor.isAoS) { return true; } } return false; } /** * get memory buffer as Uint8Array of this BufferView memory area data */ getUint8Array() { return new Uint8Array(this.__raw, this.__byteOffsetInRawArrayBufferOfBuffer, this.__byteLength); } takeAccessor({ compositionType, componentType, count, byteStride = this.defaultByteStride, max, min, arrayLength = 1, normalized = false, }) { const accessor = this.__takeAccessorInner({ compositionType, componentType, count, byteStride, max, min, normalized, arrayLength, }); return accessor; } takeAccessorWithByteOffset({ compositionType, componentType, count, byteOffsetInBufferView, byteStride = this.defaultByteStride, max, min, normalized = false, }) { const accessor = this.__takeAccessorInnerWithByteOffset({ compositionType, componentType, count, byteStride, byteOffsetInBufferView, max, min, normalized, }); return accessor; } __takeAccessorInner({ compositionType, componentType, count, byteStride, max, min, arrayLength, normalized, }) { const byteOffsetInBufferView = this.__takenByte; let actualByteStride = byteStride; if (actualByteStride === 0) { actualByteStride = compositionType.getNumberOfComponents() * componentType.getSizeInBytes() * arrayLength; } // Each accessor MUST fit its bufferView, i.e., // accessor.byteOffset + EFFECTIVE_BYTE_STRIDE * (accessor.count - 1) + SIZE_OF_COMPONENT * NUMBER_OF_COMPONENTS // See: https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#data-alignment if (this.__takenByte + actualByteStride * (count - 1) + componentType.getSizeInBytes() * compositionType.getNumberOfComponents() > this.byteLength) { const message = `The size of the Accessor you are trying to take exceeds the byte length left in the BufferView. BufferView.byteLength: ${this.byteLength}, BufferView.takenSizeInByte: ${this.__takenByte}, Accessor.byteStride: ${byteStride}, Accessor.count: ${count}; byteSizeToTake: ${actualByteStride * count}, the byte length left in the Buffer: ${this.byteLength - this.__takenByte}`; // console.error(message); return new _misc__WEBPACK_IMPORTED_MODULE_1__.Err({ message, error: undefined, }); } const accessor = new _Accessor__WEBPACK_IMPORTED_MODULE_0__.Accessor({ bufferView: this, byteOffsetInBufferView: byteOffsetInBufferView, compositionType, componentType, byteStride, count, raw: this.__raw, max, min, arrayLength, normalized, }); this.__accessors.push(accessor); this.__takenByte += actualByteStride * count; return new _misc__WEBPACK_IMPORTED_MODULE_1__.Ok(accessor); } __takeAccessorInnerWithByteOffset({ compositionType, componentType, count, byteStride, byteOffsetInBufferView, max, min, normalized, }) { // Each accessor MUST fit its bufferView, i.e., // accessor.byteOffset + EFFECTIVE_BYTE_STRIDE * (accessor.count - 1) + SIZE_OF_COMPONENT * NUMBER_OF_COMPONENTS // See: https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#data-alignment if (this.__takenByte + byteStride * (count - 1) + componentType.getSizeInBytes() * compositionType.getNumberOfComponents() > this.byteLength) { const message = `The size of the Accessor you are trying to take exceeds the byte length left in the BufferView. BufferView.byteLength: ${this.byteLength}, BufferView.takenSizeInByte: ${this.__takenByte}, Accessor.byteStride: ${byteStride}, Accessor.count: ${count}; byteSizeToTake: ${byteStride * count}, the byte length left in the Buffer: ${this.byteLength - this.__takenByte}`; return new _misc__WEBPACK_IMPORTED_MODULE_1__.Err({ message, error: undefined, }); } const accessor = new _Accessor__WEBPACK_IMPORTED_MODULE_0__.Accessor({ bufferView: this, byteOffsetInBufferView, compositionType, componentType, byteStride, count, raw: this.__raw, max, min, arrayLength: 1, normalized, }); this.__accessors.push(accessor); return new _misc__WEBPACK_IMPORTED_MODULE_1__.Ok(accessor); } isSame(rnBufferView) { return (this.byteLength === rnBufferView.byteLength && this.byteOffsetInRawArrayBufferOfBuffer === rnBufferView.byteOffsetInRawArrayBufferOfBuffer && this.defaultByteStride === rnBufferView.defaultByteStride && this.buffer.getArrayBuffer() === rnBufferView.buffer.getArrayBuffer()); } } /***/ }), /***/ "./src/foundation/memory/index.ts": /*!****************************************!*\ !*** ./src/foundation/memory/index.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Accessor: () => (/* reexport safe */ _Accessor__WEBPACK_IMPORTED_MODULE_0__.Accessor), /* harmony export */ Buffer: () => (/* reexport safe */ _Buffer__WEBPACK_IMPORTED_MODULE_1__.Buffer), /* harmony export */ BufferView: () => (/* reexport safe */ _BufferView__WEBPACK_IMPORTED_MODULE_2__.BufferView) /* harmony export */ }); /* harmony import */ var _Accessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Accessor */ "./src/foundation/memory/Accessor.ts"); /* harmony import */ var _Buffer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Buffer */ "./src/foundation/memory/Buffer.ts"); /* harmony import */ var _BufferView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BufferView */ "./src/foundation/memory/BufferView.ts"); /***/ }), /***/ "./src/foundation/misc/DataUtil.ts": /*!*****************************************!*\ !*** ./src/foundation/misc/DataUtil.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DataUtil: () => (/* binding */ DataUtil) /* harmony export */ }); /* harmony import */ var _Result__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _RnPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RnPromise */ "./src/foundation/misc/RnPromise.ts"); class DataUtil { static isNode() { const isNode = window === void 0 && typeof process !== 'undefined' && "function" !== 'undefined'; return isNode; } static btoa(str) { const isNode = DataUtil.isNode(); if (isNode) { let buffer; if (Buffer.isBuffer(str)) { buffer = str; } else { buffer = Buffer.from(str.toString(), 'binary'); } return buffer.toString('base64'); } else { return btoa(str); } } static atob(str) { const isNode = DataUtil.isNode(); if (isNode) { return Buffer.from(str, 'base64').toString('binary'); } else { return atob(str); } } static dataUriToArrayBuffer(dataUri) { const splitDataUri = dataUri.split(','); const byteString = DataUtil.atob(splitDataUri[1]); const byteStringLength = byteString.length; const arrayBuffer = new ArrayBuffer(byteStringLength); const uint8Array = new Uint8Array(arrayBuffer); for (let i = 0; i < byteStringLength; i++) { uint8Array[i] = byteString.charCodeAt(i); } return arrayBuffer; } static arrayBufferToString(arrayBuffer) { if (typeof TextDecoder !== 'undefined') { const textDecoder = new TextDecoder(); return textDecoder.decode(arrayBuffer); } else { const bytes = new Uint8Array(arrayBuffer); const result = this.uint8ArrayToStringInner(bytes); return result; } } static uint8ArrayToString(uint8Array) { if (typeof TextDecoder !== 'undefined') { const textDecoder = new TextDecoder(); return textDecoder.decode(uint8Array); } else { const result = this.uint8ArrayToStringInner(uint8Array); return result; } } static stringToBase64(str) { let b64 = null; b64 = DataUtil.btoa(str); return b64; } static base64ToArrayBuffer(base64) { const binary_string = window.atob(base64); const len = binary_string.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); } return bytes.buffer; } static UInt8ArrayToDataURL(uint8array, width, height) { const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); const imageData = ctx.createImageData(width, height); for (let i = 0; i < imageData.data.length; i += 4) { imageData.data[i + 0] = uint8array[(height - Math.floor(i / (4 * width))) * (4 * width) + (i % (4 * width)) + 0]; imageData.data[i + 1] = uint8array[(height - Math.floor(i / (4 * width))) * (4 * width) + (i % (4 * width)) + 1]; imageData.data[i + 2] = uint8array[(height - Math.floor(i / (4 * width))) * (4 * width) + (i % (4 * width)) + 2]; imageData.data[i + 3] = uint8array[(height - Math.floor(i / (4 * width))) * (4 * width) + (i % (4 * width)) + 3]; } ctx.putImageData(imageData, 0, 0); canvas.remove(); return canvas.toDataURL('image/png'); } static loadResourceAsync(resourceUri, isBinary, resolveCallback, rejectCallback) { return new Promise((resolve, reject) => { const isNode = DataUtil.isNode(); if (isNode) { // const args: any[] = [resourceUri]; // const func: Function = (err:any, response: any) => { // if (err) { // if (rejectCallback) { // rejectCallback(reject, err); // } // return; // } // if (isBinary) { // const buffer = new Buffer(response, 'binary'); // const uint8Buffer = new Uint8Array(buffer); // response = uint8Buffer.buffer; // } // resolveCallback(resolve, response); // }; // if (isBinary) { // args.push(func); // } else { // args.push('utf8'); // args.push(func); // } // fs.readFile(...args); } else { const xmlHttp = new XMLHttpRequest(); if (isBinary) { xmlHttp.onload = (oEvent) => { let response = null; if (isBinary) { response = xmlHttp.response; } else { response = xmlHttp.responseText; } resolveCallback(resolve, response); }; xmlHttp.open('GET', resourceUri, true); xmlHttp.responseType = 'arraybuffer'; } else { xmlHttp.onreadystatechange = () => { if (xmlHttp.readyState === 4 && (Math.floor(xmlHttp.status / 100) === 2 || xmlHttp.status === 0)) { let response = null; if (isBinary) { response = xmlHttp.response; } else { response = xmlHttp.responseText; } resolveCallback(resolve, response); } else { if (rejectCallback) { rejectCallback(reject, xmlHttp.status); } } }; xmlHttp.open('GET', resourceUri, true); } xmlHttp.send(null); } }); } static toCRC32(str) { let crc = 0, x = 0, y = 0; const table = DataUtil.crc32table; crc = crc ^ -1; for (let i = 0, iTop = str.length; i < iTop; ++i) { y = (crc ^ str.charCodeAt(i)) & 0xff; x = '0x' + table[y]; crc = (crc >>> 8) ^ x; } return (crc ^ -1) >>> 0; } static accessBinaryAsImage(bufferViewIndex, json, buffer, mimeType) { const uint8BufferView = this.takeBufferViewAsUint8Array(json, bufferViewIndex, buffer); return this.accessArrayBufferAsImage(uint8BufferView, mimeType); } static createBlobImageUriFromUint8Array(uint8Array, mimeType) { const blob = new Blob([uint8Array], { type: mimeType }); const imageUrl = URL.createObjectURL(blob); return imageUrl; } static takeBufferViewAsUint8Array(json, bufferViewIndex, buffer) { var _a; const bufferViewJson = json.bufferViews[bufferViewIndex]; let byteOffset = (_a = bufferViewJson.byteOffset) !== null && _a !== void 0 ? _a : 0; const byteLength = bufferViewJson.byteLength; let arrayBuffer = buffer; if (buffer instanceof Uint8Array) { arrayBuffer = buffer.buffer; byteOffset += buffer.byteOffset; } const uint8BufferView = new Uint8Array(arrayBuffer, byteOffset, byteLength); return uint8BufferView; } static accessArrayBufferAsImage(arrayBuffer, imageType) { const binaryData = this.uint8ArrayToStringInner(new Uint8Array(arrayBuffer)); const imgSrc = this.getImageType(imageType); const dataUrl = imgSrc + DataUtil.btoa(binaryData); return dataUrl; } static uint8ArrayToStringInner(uint8) { const charCodeArray = new Array(uint8.byteLength); for (let i = 0; i < uint8.byteLength; i++) { charCodeArray[i] = uint8[i]; } // the argument of String.fromCharCode has the limit of array length const constant = 1024; const divisionNumber = Math.ceil(charCodeArray.length / constant); let binaryData = ''; for (let i = 0; i < divisionNumber; i++) { binaryData += String.fromCharCode.apply(this, charCodeArray.slice(i * constant, (i + 1) * constant)); } return binaryData; } static getImageType(imageType) { let imgSrc = null; if (imageType === 'image/jpeg' || imageType.toLowerCase() === 'jpg' || imageType.toLowerCase() === 'jpeg') { imgSrc = 'data:image/jpeg;base64,'; } else if (imageType === 'image/png' || imageType.toLowerCase() === 'png') { imgSrc = 'data:image/png;base64,'; } else if (imageType === 'image/gif' || imageType.toLowerCase() === 'gif') { imgSrc = 'data:image/gif;base64,'; } else if (imageType === 'image/bmp' || imageType.toLowerCase() === 'bmp') { imgSrc = 'data:image/bmp;base64,'; } else { imgSrc = 'data:image/unknown;base64,'; } return imgSrc; } static getMimeTypeFromExtension(extension) { let imgSrc = null; if (extension.toLowerCase() === 'jpg' || extension.toLowerCase() === 'jpeg') { imgSrc = 'image/jpeg'; } else if (extension.toLowerCase() === 'png') { imgSrc = 'image/png'; } else if (extension.toLowerCase() === 'gif') { imgSrc = 'image/gif'; } else if (extension.toLowerCase() === 'bmp') { imgSrc = 'image/bmp'; } else { imgSrc = 'image/unknown'; } return imgSrc; } static getExtension(fileName) { const splitted = fileName.split('.'); const fileExtension = splitted[splitted.length - 1]; return fileExtension; } static createUint8ArrayFromBufferViewInfo(json, bufferViewIndex, buffer) { var _a; const bufferViewJson = json.bufferViews[bufferViewIndex]; let byteOffset = (_a = bufferViewJson.byteOffset) !== null && _a !== void 0 ? _a : 0; const byteLength = bufferViewJson.byteLength; let arrayBuffer = buffer; if (buffer instanceof Uint8Array) { arrayBuffer = buffer.buffer; byteOffset += buffer.byteOffset; } const uint8BufferView = new Uint8Array(arrayBuffer, byteOffset, byteLength); return uint8BufferView; } static createImageFromUri(uri, mimeType) { return new _RnPromise__WEBPACK_IMPORTED_MODULE_1__.RnPromise((resolve) => { const img = new Image(); img.crossOrigin = 'Anonymous'; if (uri.match(/^blob:/) || uri.match(/^data:/)) { img.onload = () => { resolve(img); }; img.src = uri; } else { const load = (img, response) => { const bytes = new Uint8Array(response); const imageUri = DataUtil.createBlobImageUriFromUint8Array(bytes, mimeType); img.onload = () => { resolve(img); URL.revokeObjectURL(imageUri); }; img.src = imageUri; }; const loadBinaryImage = () => { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = (function (_img) { return function () { if (xhr.readyState === 4 && xhr.status === 200) { load(_img, xhr.response); } }; })(img); xhr.open('GET', uri); xhr.responseType = 'arraybuffer'; xhr.send(); }; loadBinaryImage(); } }); } static createDefaultGltfOptions() { const defaultOptions = { files: { // "foo.gltf": content of file as ArrayBuffer, // "foo.bin": content of file as ArrayBuffer, // "boo.png": content of file as ArrayBuffer }, loaderExtension: undefined, defaultMaterialHelperName: undefined, defaultMaterialHelperArgumentArray: [], statesOfElements: [ { targets: [], //["name_foo", "name_boo"], states: { enable: [ // 3042, // BLEND ], functions: { //"blendFuncSeparate": [1, 0, 1, 0], }, }, isTransparent: true, opacity: 1.0, isTextureImageToLoadPreMultipliedAlpha: false, }, ], tangentCalculationMode: 1, extendedJson: void 0, // URI string / JSON Object / ArrayBuffer __importedType: 'undefined', }; return defaultOptions; } static async fetchArrayBuffer(uri) { const response = await fetch(uri, { mode: 'cors' }); if (!response.ok) { return new _Result__WEBPACK_IMPORTED_MODULE_0__.Err({ message: `fetchArrayBuffer failed. uri: ${uri}`, error: response.statusText, }); } const arraybuffer = await response.arrayBuffer(); return new _Result__WEBPACK_IMPORTED_MODULE_0__.Ok(arraybuffer); } static getResizedCanvas(image, maxSize) { const canvas = document.createElement('canvas'); const potWidth = this.getNearestPowerOfTwo(image.width); const potHeight = this.getNearestPowerOfTwo(image.height); const aspect = potHeight / potWidth; let dstWidth = 0; let dstHeight = 0; if (potWidth > potHeight) { dstWidth = Math.min(potWidth, maxSize); dstHeight = dstWidth * aspect; } else { dstHeight = Math.min(potHeight, maxSize); dstWidth = dstHeight / aspect; } canvas.width = dstWidth; canvas.height = dstHeight; const ctx = canvas.getContext('2d'); ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, dstWidth, dstHeight); return [canvas, dstWidth, dstHeight]; } static detectTransparentPixelExistence(image, threshold = 1.0) { const dstWidth = image.width; const dstHeight = image.height; let ctx; let imageData; if (image instanceof ImageData) { imageData = image; } else if (image instanceof HTMLImageElement) { const canvas = document.createElement('canvas'); ctx = canvas.getContext('2d'); ctx.drawImage(image, 0, 0); imageData = ctx.getImageData(0, 0, dstWidth, dstHeight); } else { // must be HTMLCanvasHTML ctx = image.getContext('2d'); ctx.drawImage(image, 0, 0); imageData = ctx.getImageData(0, 0, dstWidth, dstHeight); } for (let y = 0; y < dstHeight; y++) { for (let x = 0; x < dstWidth; x++) { const alpha = imageData.data[(x + y * dstWidth) * 4 + 3]; if (alpha < threshold) { return true; } } } return false; } /** * get a value nearest power of two. * * @param x texture size. * @returns a value nearest power of two. */ static getNearestPowerOfTwo(x) { return Math.pow(2, Math.round(Math.log(x) / Math.LN2)); } static calcPaddingBytes(originalByteLength, byteAlign) { if (originalByteLength % byteAlign !== 0) { const sizeToPadding = byteAlign - (originalByteLength % byteAlign); return sizeToPadding; } return 0; } static addPaddingBytes(originalByteLength, byteAlign) { return originalByteLength + this.calcPaddingBytes(originalByteLength, byteAlign); } static normalizedInt8ArrayToFloat32Array(from) { const float32Array = new Float32Array(from.length); for (let i = 0; i < from.length; i++) { float32Array[i] = Math.max(from[i] / 127.0, -1.0); } return float32Array; } static normalizedUint8ArrayToFloat32Array(from) { const float32Array = new Float32Array(from.length); for (let i = 0; i < from.length; i++) { float32Array[i] = from[i] / 255.0; } return float32Array; } static normalizedInt16ArrayToFloat32Array(from) { const float32Array = new Float32Array(from.length); for (let i = 0; i < from.length; i++) { float32Array[i] = Math.max(from[i] / 32767.0, -1.0); } return float32Array; } static normalizedUint16ArrayToFloat32Array(from) { const float32Array = new Float32Array(from.length); for (let i = 0; i < from.length; i++) { float32Array[i] = from[i] / 65535.0; } return float32Array; } /** * get a copy of the src arraybuffer * @param param0 copy description * @returns copied memory as ArrayBuffer */ static getCopy({ src, srcByteOffset, copyByteLength, distByteOffset, }) { const dst = new ArrayBuffer(src.byteLength); const dist = new Uint8Array(dst, distByteOffset, copyByteLength); dist.set(new Uint8Array(src, srcByteOffset, copyByteLength)); return dist.buffer; } /** * get a copy of the src arraybuffer * @param param0 copy description * @returns copied memory as ArrayBuffer */ static getCopyAs4Bytes({ src, srcByteOffset, copyByteLength, distByteOffset, }) { if (srcByteOffset % 4 !== 0 || copyByteLength % 4 !== 0 || distByteOffset % 4 !== 0) { throw new Error('Invalid byte align for 4bytes unit copy operation.'); } const dst = new ArrayBuffer(src.byteLength); const dist = new Int32Array(dst, distByteOffset, copyByteLength / 4); dist.set(new Int32Array(src, srcByteOffset, copyByteLength / 4)); return dist.buffer; } /** * get a copy of the src arraybuffer * @param param0 copy description * @returns copied memory as ArrayBuffer */ static copyArrayBuffer({ src, dist, srcByteOffset, copyByteLength, distByteOffset = 0, }) { const dst = new Uint8Array(dist, distByteOffset, copyByteLength); dst.set(new Uint8Array(src, srcByteOffset, copyByteLength)); return dst.buffer; } /** * get a copy of the src arraybuffer * @param param0 copy description * @returns copied memory as ArrayBuffer */ static copyArrayBufferWithPadding({ src, dist, srcByteOffset, copyByteLength, distByteOffset, }) { const dst = new Uint8Array(dist, distByteOffset, copyByteLength); const byteDiff = src.byteLength - srcByteOffset - copyByteLength; if (byteDiff < 0) { dst.set(new Uint8Array(src, srcByteOffset, src.byteLength - srcByteOffset)); const byteCount = -byteDiff; const paddingArrayBuffer = new Uint8Array(byteCount); dst.set(paddingArrayBuffer); } else { dst.set(new Uint8Array(src, srcByteOffset, copyByteLength)); } return dst.buffer; } /** * get a copy of the src arraybuffer * @param param0 copy description * @returns copied memory as ArrayBuffer */ static copyArrayBufferAs4Bytes({ src, dist, srcByteOffset, copyByteLength, distByteOffset, }) { if (srcByteOffset % 4 !== 0 || copyByteLength % 4 !== 0 || distByteOffset % 4 !== 0) { throw new Error('Invalid byte align for 4bytes unit copy operation.'); } const dst = new Int32Array(dist, distByteOffset, copyByteLength / 4); dst.set(new Int32Array(src, srcByteOffset, copyByteLength / 4)); return dst.buffer; } /** * get a copy of the src arraybuffer with padding to be 4bytes aligined * @param param0 copy description * @returns copied memory as ArrayBuffer */ static copyArrayBufferAs4BytesWithPadding({ src, dist, srcByteOffset, copyByteLength, distByteOffset, }) { const dst = new Int32Array(dist, distByteOffset, copyByteLength / 4); const byteDiff = src.byteLength - srcByteOffset - copyByteLength; if (byteDiff < 0) { dst.set(new Int32Array(src, srcByteOffset, (src.byteLength - srcByteOffset) / 4)); const byteCount = -byteDiff; const paddingArrayBuffer = new Uint8Array(byteCount); dst.set(paddingArrayBuffer); } else { dst.set(new Int32Array(src, srcByteOffset, copyByteLength / 4)); } return dst.buffer; } static stringToBuffer(src) { const enc = new TextEncoder(); return enc.encode(src).buffer; } } DataUtil.crc32table = '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'.split(' '); /***/ }), /***/ "./src/foundation/misc/EnumIO.ts": /*!***************************************!*\ !*** ./src/foundation/misc/EnumIO.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EnumClass: () => (/* binding */ EnumClass), /* harmony export */ _from: () => (/* binding */ _from), /* harmony export */ _fromString: () => (/* binding */ _fromString), /* harmony export */ _fromStringCaseSensitively: () => (/* binding */ _fromStringCaseSensitively) /* harmony export */ }); // This code idea is from https://qiita.com/junkjunctions/items/5a6d8bed8df8eb3acceb class EnumClass { constructor({ index, str, noCheckStrUnique, }) { if (EnumClass.__indices.get(this.constructor) == null) { EnumClass.__indices.set(this.constructor, []); } if (EnumClass.__strings.get(this.constructor) == null) { EnumClass.__strings.set(this.constructor, []); } if (EnumClass.__indices.get(this.constructor).indexOf(index) !== -1) { throw new Error('Dont use duplicate index.'); } if (noCheckStrUnique !== true) { if (EnumClass.__strings.get(this.constructor).indexOf(str) !== -1) { throw new Error('Dont use duplicate str.'); } } this.index = index; this.str = str; this.symbol = Symbol(str); EnumClass.__indices.get(this.constructor).push(index); EnumClass.__strings.get(this.constructor).push(str); } toString() { return this.str; } toJSON() { return this.index; } } EnumClass.__indices = new Map(); EnumClass.__strings = new Map(); function _from({ typeList, index, }) { const match = typeList.find((type) => type.index === index); if (!match) { return void 0; } return match; } function _fromString({ typeList, str, }) { const match = typeList.find((type) => type.str.toLowerCase() === str.toLowerCase()); if (!match) { return void 0; } return match; } function _fromStringCaseSensitively({ typeList, str, }) { const match = typeList.find((type) => type.str === str); if (!match) { return void 0; } return match; } /***/ }), /***/ "./src/foundation/misc/ImageUtil.ts": /*!******************************************!*\ !*** ./src/foundation/misc/ImageUtil.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ImageUtil: () => (/* binding */ ImageUtil), /* harmony export */ combineImages: () => (/* binding */ combineImages), /* harmony export */ convertHTMLImageElementToCanvas: () => (/* binding */ convertHTMLImageElementToCanvas) /* harmony export */ }); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math/MathUtil */ "./src/foundation/math/MathUtil.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_ColorRgb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/ColorRgb */ "./src/foundation/math/ColorRgb.ts"); /* harmony import */ var _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math/MutableVector2 */ "./src/foundation/math/MutableVector2.ts"); /* harmony import */ var _textures_TextureDataFloat__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../textures/TextureDataFloat */ "./src/foundation/textures/TextureDataFloat.ts"); /* harmony import */ var _Is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Is */ "./src/foundation/misc/Is.ts"); // These codes are from https://eheitzresearch.wordpress.com/738-2/ // "Procedural Stochastic Textures by Tiling and Blending" // Thanks to the authors for permission to use. // // Compute the eigen vectors of the histogram of the input image function computeEigenVectors(input, eigenVectors) { // First and second order moments let R = 0, G = 0, B = 0, RR = 0, GG = 0, BB = 0, RG = 0, RB = 0, GB = 0; for (let y = 0; y < input.height; y++) { for (let x = 0; x < input.width; x++) { const col = input.getPixelAs(x, y, 3, _math_ColorRgb__WEBPACK_IMPORTED_MODULE_4__.ColorRgb); R += col.x; G += col.y; B += col.z; RR += col.x * col.x; GG += col.y * col.y; BB += col.z * col.z; RG += col.x * col.y; RB += col.x * col.z; GB += col.y * col.z; } } const inputImagePixelsNumber = input.width * input.height; R /= inputImagePixelsNumber; G /= inputImagePixelsNumber; B /= inputImagePixelsNumber; RR /= inputImagePixelsNumber; GG /= inputImagePixelsNumber; BB /= inputImagePixelsNumber; RG /= inputImagePixelsNumber; RB /= inputImagePixelsNumber; GB /= inputImagePixelsNumber; // Covariance matrix const covarMat = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix33.zero(); covarMat.m00 = RR - R * R; covarMat.m01 = RG - R * G; covarMat.m02 = RB - R * B; covarMat.m10 = RG - R * G; covarMat.m11 = GG - G * G; covarMat.m12 = GB - G * B; covarMat.m20 = RB - R * B; covarMat.m21 = GB - G * B; covarMat.m22 = BB - B * B; // Find eigen values and vectors using Jacobi algorithm const eigenVectorsTemp = _math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix33.zero(); const eigenValuesTemp = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.computeEigenValuesAndVectors(covarMat, eigenVectorsTemp, eigenValuesTemp); // Set return values eigenVectors[0] = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([ eigenVectorsTemp.m00, eigenVectorsTemp.m10, eigenVectorsTemp.m20, ]); eigenVectors[1] = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([ eigenVectorsTemp.m01, eigenVectorsTemp.m11, eigenVectorsTemp.m21, ]); eigenVectors[2] = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.fromCopyArray([ eigenVectorsTemp.m02, eigenVectorsTemp.m12, eigenVectorsTemp.m22, ]); } function decorrelateColorSpace(input, // input: example image input_decorrelated, // output: decorrelated input colorSpaceVector1, // output: color space vector1 colorSpaceVector2, // output: color space vector2 colorSpaceVector3, // output: color space vector3 colorSpaceOrigin) { // output: color space origin // Compute the eigenvectors of the histogram const eigenvectors = [_math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(), _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(), _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero()]; computeEigenVectors(input, eigenvectors); // Rotate to eigenvector space and for (let y = 0; y < input.height; y++) for (let x = 0; x < input.width; x++) for (let channel = 0; channel < 3; ++channel) { // Get current color const color = input.getPixelAs(x, y, 3, _math_ColorRgb__WEBPACK_IMPORTED_MODULE_4__.ColorRgb); // Project on eigenvector const new_channel_value = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.dot(color, eigenvectors[channel]); // Store input_decorrelated.setPixelAtChannel(x, y, channel, new_channel_value); } // Compute ranges of the new color space const colorSpaceRanges = [ _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__.MutableVector2.fromCopyArray2([Number.MAX_VALUE, -Number.MAX_VALUE]), _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__.MutableVector2.fromCopyArray2([Number.MAX_VALUE, -Number.MAX_VALUE]), _math_MutableVector2__WEBPACK_IMPORTED_MODULE_5__.MutableVector2.fromCopyArray2([Number.MAX_VALUE, -Number.MAX_VALUE]), ]; for (let y = 0; y < input.height; y++) { for (let x = 0; x < input.width; x++) { for (let channel = 0; channel < 3; ++channel) { colorSpaceRanges[channel].x = Math.min(colorSpaceRanges[channel].x, input_decorrelated.getPixelAsArray(x, y)[channel]); colorSpaceRanges[channel].y = Math.max(colorSpaceRanges[channel].y, input_decorrelated.getPixelAsArray(x, y)[channel]); } } } // Remap range to [0, 1] for (let y = 0; y < input.height; y++) { for (let x = 0; x < input.width; x++) { for (let channel = 0; channel < 3; ++channel) { // Get current value const value = input_decorrelated.getPixelAsArray(x, y)[channel]; // Remap in [0, 1] const remapped_value = (value - colorSpaceRanges[channel].x) / (colorSpaceRanges[channel].y - colorSpaceRanges[channel].x); // Store input_decorrelated.setPixelAtChannel(x, y, channel, remapped_value); } } } // Compute color space origin and vectors scaled for the normalized range colorSpaceOrigin.x = colorSpaceRanges[0].x * eigenvectors[0].x + colorSpaceRanges[1].x * eigenvectors[1].x + colorSpaceRanges[2].x * eigenvectors[2].x; colorSpaceOrigin.y = colorSpaceRanges[0].x * eigenvectors[0].y + colorSpaceRanges[1].x * eigenvectors[1].y + colorSpaceRanges[2].x * eigenvectors[2].y; colorSpaceOrigin.z = colorSpaceRanges[0].x * eigenvectors[0].z + colorSpaceRanges[1].x * eigenvectors[1].z + colorSpaceRanges[2].x * eigenvectors[2].z; colorSpaceVector1.x = eigenvectors[0].x * (colorSpaceRanges[0].y - colorSpaceRanges[0].x); colorSpaceVector1.y = eigenvectors[0].y * (colorSpaceRanges[0].y - colorSpaceRanges[0].x); colorSpaceVector1.z = eigenvectors[0].z * (colorSpaceRanges[0].y - colorSpaceRanges[0].x); colorSpaceVector2.x = eigenvectors[1].x * (colorSpaceRanges[1].y - colorSpaceRanges[1].x); colorSpaceVector2.y = eigenvectors[1].y * (colorSpaceRanges[1].y - colorSpaceRanges[1].x); colorSpaceVector2.z = eigenvectors[1].z * (colorSpaceRanges[1].y - colorSpaceRanges[1].x); colorSpaceVector3.x = eigenvectors[2].x * (colorSpaceRanges[2].y - colorSpaceRanges[2].x); colorSpaceVector3.y = eigenvectors[2].y * (colorSpaceRanges[2].y - colorSpaceRanges[2].x); colorSpaceVector3.z = eigenvectors[2].z * (colorSpaceRanges[2].y - colorSpaceRanges[2].x); } // Compute average subpixel variance at a given LOD function computeLODAverageSubpixelVariance(image, LOD, channel) { // Window width associated with const windowWidth = 1 << LOD; // Compute average variance in all the windows let average_window_variance = 0.0; // Loop over al the windows for (let window_y = 0; window_y < image.height; window_y += windowWidth) { for (let window_x = 0; window_x < image.width; window_x += windowWidth) { // Estimate variance of current window let v = 0.0; let v2 = 0.0; for (let y = 0; y < windowWidth; y++) { for (let x = 0; x < windowWidth; x++) { const value = image.getPixel(window_x + x, window_y + y, channel); v += value; v2 += value * value; } } v /= windowWidth * windowWidth; v2 /= windowWidth * windowWidth; const window_variance = Math.max(0.0, v2 - v * v); // Update average average_window_variance += window_variance / ((image.width * image.height) / windowWidth / windowWidth); } } return average_window_variance; } // Filter LUT by sampling a Gaussian N(mu, std�) function filterLUTValueAtx(LUT, x, std, channel, LUT_WIDTH = 128) { // Number of samples for filtering (heuristic: twice the LUT resolution) const numberOfSamples = 2 * LUT_WIDTH; // Filter let filtered_value = 0.0; for (let sample = 0; sample < numberOfSamples; sample++) { // Quantile used to sample the Gaussian const U = (sample + 0.5) / numberOfSamples; // Sample the Gaussian const sample_x = _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.invGaussianCdf(U, x, std); // Find sample texel in LUT (the LUT covers the domain [0, 1]) const sample_texel = Math.max(0, Math.min(LUT_WIDTH - 1, Math.floor(sample_x * LUT_WIDTH))); // Fetch LUT at level 0 const sample_value = LUT.getPixelAsArray(sample_texel, 0)[channel]; // Accumulate filtered_value += sample_value; } // Normalize and return filtered_value /= numberOfSamples; return filtered_value; } function prefilterLUT(image_T_Input, LUT_Tinv, channel) { // Prefilter for (let LOD = 1; LOD < LUT_Tinv.height; LOD++) { // Compute subpixel variance at LOD const window_variance = computeLODAverageSubpixelVariance(image_T_Input, LOD, channel); const window_std = Math.sqrt(window_variance); // Prefilter LUT with Gaussian kernel of this variance for (let i = 0; i < LUT_Tinv.width; i++) { // Texel position in [0, 1] const x_texel = (i + 0.5) / LUT_Tinv.width; // Filter look-up table around this position with Gaussian kernel const filteredValue = filterLUTValueAtx(LUT_Tinv, x_texel, window_std, channel); // Store filtered value LUT_Tinv.setPixelAtChannel(i, LOD, channel, filteredValue); } } } function generatePixelSortTypeArray(arrayLength) { const array = []; for (let i = 0; i < arrayLength; i++) { array.push({}); } return array; } function computeTinput(input, T_input, channel, GAUSSIAN_AVERAGE = 0.5, GAUSSIAN_STD = 0.16666) { // Sort pixels of example image const sortedInputValues = generatePixelSortTypeArray(input.height * input.width); for (let y = 0; y < input.height; y++) { for (let x = 0; x < input.width; x++) { sortedInputValues[y * input.width + x].x = x; sortedInputValues[y * input.width + x].y = y; sortedInputValues[y * input.width + x].value = input.getPixel(x, y, channel); } } sortedInputValues.sort((a, b) => { if (a.value < b.value) return -1; if (a.value > b.value) return 1; return 0; }); // Assign Gaussian value to each pixel for (let i = 0; i < sortedInputValues.length; i++) { // Pixel coordinates const x = sortedInputValues[i].x; const y = sortedInputValues[i].y; // Input quantile (given by its order in the sorting) const U = (i + 0.5) / sortedInputValues.length; // Gaussian quantile const G = _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.invGaussianCdf(U, GAUSSIAN_AVERAGE, GAUSSIAN_STD); // Store T_input.setPixelAtChannel(x, y, channel, G); } } function computeInvT(input, Tinv, channel, GAUSSIAN_AVERAGE = 0.5, GAUSSIAN_STD = 0.16666) { // Sort pixels of example image const sortedInputValues = []; for (let y = 0; y < input.height; y++) { for (let x = 0; x < input.width; x++) { sortedInputValues[y * input.width + x] = input.getPixel(x, y, channel); } } sortedInputValues.sort((a, b) => { if (a < b) return -1; if (a > b) return 1; return 0; }); // Generate Tinv look-up table for (let i = 0; i < Tinv.width; i++) { // Gaussian value in [0, 1] const G = (i + 0.5) / Tinv.width; // Quantile value const U = _math_MathUtil__WEBPACK_IMPORTED_MODULE_2__.MathUtil.gaussianCdf(G, GAUSSIAN_AVERAGE, GAUSSIAN_STD); // Find quantile in sorted pixel values const index = Math.floor(U * sortedInputValues.length); // Get input value const I = sortedInputValues[index]; // Store in LUT Tinv.setPixelAtChannel(i, 0, channel, I); } } function precomputations(input, // input: example image LUT_WIDTH = 128) { const retVal = {}; retVal.lutWidth = LUT_WIDTH; retVal.colorSpaceVector1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); retVal.colorSpaceVector2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); retVal.colorSpaceVector3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); retVal.colorSpaceOrigin = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_3__.MutableVector3.zero(); // Section 1.4 Improvement: using a decorrelated color space // const input_decorrelated:AbstractTexture = TextureDataFloat(input.width, input.height, 3); const input_decorrelated = new _textures_TextureDataFloat__WEBPACK_IMPORTED_MODULE_6__.TextureDataFloat(input.width, input.height, 3); decorrelateColorSpace(input, input_decorrelated, retVal.colorSpaceVector1, retVal.colorSpaceVector2, retVal.colorSpaceVector3, retVal.colorSpaceOrigin); // Section 1.3.2 Applying the histogram transformation T on the input //Tinput = TextureDataFloat(input.width, input.height, 3); const Tinput = new _textures_TextureDataFloat__WEBPACK_IMPORTED_MODULE_6__.TextureDataFloat(input.width, input.height, 3); retVal.Tinput = Tinput; for (let channel = 0; channel < 3; channel++) { computeTinput(input_decorrelated, Tinput, channel); } // Section 1.3.3 Precomputing the inverse histogram transformation T^{-1} const Tinv = new _textures_TextureDataFloat__WEBPACK_IMPORTED_MODULE_6__.TextureDataFloat(LUT_WIDTH, 1, 3); retVal.Tinv = Tinv; for (let channel = 0; channel < 3; channel++) { computeInvT(input_decorrelated, Tinv, channel); } // Section 1.5 Improvement: prefiltering the look-up table // Compute number of prefiltered levels and resize LUT Tinv.resize(Tinv.width, Math.floor(Math.log(Tinput.width) / Math.log(2.0)), 3); for (let channel = 0; channel < 3; channel++) { prefilterLUT(Tinput, Tinv, channel); } return retVal; } function convertHTMLImageElementToCanvas(image, width, height) { const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height); return canvas; } function combineImages(data) { const width = data.width; const height = data.height; const outputCanvas = document.createElement('canvas'); outputCanvas.width = width; outputCanvas.height = height; const outputCtx = outputCanvas.getContext('2d'); const outputImageData = outputCtx.getImageData(0, 0, width, height); if (_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(data.r_image)) { const inputR_ctx = data.r_image.getContext('2d'); const r_imageData = inputR_ctx.getImageData(0, 0, data.r_image.width, data.r_image.height); for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 0] = r_imageData.data[i * 4 + 0]; } } else { for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 0] = 0; } } if (_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(data.g_image)) { const inputG_ctx = data.g_image.getContext('2d'); const g_imageData = inputG_ctx.getImageData(0, 0, data.g_image.width, data.g_image.height); for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 1] = g_imageData.data[i * 4 + 1]; } } else { for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 1] = 0; } } if (_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(data.b_image)) { const inputB_ctx = data.b_image.getContext('2d'); const b_imageData = inputB_ctx.getImageData(0, 0, data.b_image.width, data.b_image.height); for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 2] = b_imageData.data[i * 4 + 2]; } } else { for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 2] = 0; } } if (_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(data.a_image)) { const inputA_ctx = data.a_image.getContext('2d'); const a_imageData = inputA_ctx.getImageData(0, 0, data.a_image.width, data.a_image.height); for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 3] = a_imageData.data[i * 4 + 3]; } } else { for (let i = 0; i < width * height; i++) { outputImageData.data[i * 4 + 3] = 0; } } outputCtx.putImageData(outputImageData, 0, 0); return outputCanvas; } const ImageUtil = Object.freeze({ precomputations }); /***/ }), /***/ "./src/foundation/misc/Is.ts": /*!***********************************!*\ !*** ./src/foundation/misc/Is.ts ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Is: () => (/* binding */ Is), /* harmony export */ IsObj: () => (/* binding */ IsObj) /* harmony export */ }); /* eslint-disable prefer-spread */ /* eslint-disable prefer-rest-params */ /* eslint-disable @typescript-eslint/no-unused-vars */ // Inspired by https://github.com/enricomarino/is const IsObj = { defined(val, ...args) { return val !== void 0; }, undefined(val, ...args) { return val === void 0; }, null(val, ...args) { return val === null; }, // is NOT null or undefined exist(val, ...args) { return val !== null && val !== undefined; }, function(val, ...args) { return typeof val === 'function'; }, true(val, ...args) { return val === true; }, truly(val, ...args) { return val ? true : false; }, false(val, ...args) { return val === false; }, falsy(val, ...args) { return !val ? true : false; }, stringContaining(thisStr, queryStr) { return thisStr.indexOf(queryStr) !== -1; }, }; const Derivatives = { not(fn) { return function () { return fn.apply(null, [...arguments]); }; }, all(fn) { return function () { if (Array.isArray(arguments[0])) { return arguments[0].every(fn); } return [...arguments].every(fn); }; }, any(fn) { return function () { if (Array.isArray(arguments[0])) { return arguments[0].some(fn); } return [...arguments].some(fn); }; }, }; const NotObj = { defined(val, ...args) { return val === void 0; }, undefined(val, ...args) { return val !== void 0; }, null(val, ...args) { return val !== null; }, exist(val, ...args) { return val === null || val === undefined; }, function(val, ...args) { return typeof val !== 'function'; }, true(val, ...args) { return val !== true; }, truly(val, ...args) { return val ? false : true; }, false(val, ...args) { return val !== false; }, falsy(val, ...args) { return !val ? false : true; }, }; // Add derivatives to the IsObj for (const subFn in Derivatives) { if (Object.prototype.hasOwnProperty.call(Derivatives, subFn)) { IsObj[subFn] = {}; for (const fn in IsObj) { if (Object.prototype.hasOwnProperty.call(IsObj, fn)) { if (subFn === 'not') { IsObj[subFn][fn] = Derivatives[subFn](NotObj[fn]); } else { IsObj[subFn][fn] = Derivatives[subFn](IsObj[fn]); } } } } } const Is = IsObj; /***/ }), /***/ "./src/foundation/misc/Logger.ts": /*!***************************************!*\ !*** ./src/foundation/misc/Logger.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LogLevel: () => (/* binding */ LogLevel), /* harmony export */ Logger: () => (/* binding */ Logger) /* harmony export */ }); var LogLevel; (function (LogLevel) { LogLevel[LogLevel["Debug"] = 0] = "Debug"; LogLevel[LogLevel["Info"] = 1] = "Info"; LogLevel[LogLevel["Warn"] = 2] = "Warn"; LogLevel[LogLevel["Error"] = 3] = "Error"; LogLevel[LogLevel["Assert"] = 4] = "Assert"; })(LogLevel || (LogLevel = {})); class Log { constructor() { this.message = ''; this.timestamp = 0; this.logLevel = LogLevel.Info; } } class Logger { static __common(message, logLevel) { if (!this.isAccumulateLog && !this.isRichLog) { return message; } // store log const log = new Log(); log.message = message; log.timestamp = Date.now(); log.logLevel = logLevel; if (this.isAccumulateLog) { this.__messages.push(log); } return this.__formatLogs(log); } static __clearAccumulatedLog() { this.__messages = []; } static __formatLogs(log) { if (!this.isRichLog) { return log.message; } // format log text const yyyymmdd = new Intl.DateTimeFormat(undefined, { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', }); const dateTime = yyyymmdd.format(log.timestamp); const finalMessage = `Rn[${this.__getLogLevelText(log.logLevel)}][${dateTime}]: ${log.message}`; return finalMessage; } static __getLogLevelText(logLevel) { return LogLevel[logLevel]; } static error(message) { if (this.logLevel <= LogLevel.Error) { const formattedMessage = this.__common(message, LogLevel.Error); console.error(formattedMessage); return formattedMessage; } return undefined; } static warn(message) { if (this.logLevel <= LogLevel.Warn) { const formattedMessage = this.__common(message, LogLevel.Warn); console.warn(formattedMessage); return formattedMessage; } return undefined; } static info(message) { if (this.logLevel <= LogLevel.Info) { const formattedMessage = this.__common(message, LogLevel.Info); console.info(formattedMessage); return formattedMessage; } return undefined; } static debug(message) { if (this.logLevel <= LogLevel.Debug) { const formattedMessage = this.__common(message, LogLevel.Debug); console.debug(formattedMessage); return formattedMessage; } return undefined; } static assert(condition, message) { if (this.logLevel <= LogLevel.Assert) { const formattedMessage = this.__common(message, LogLevel.Assert); console.assert(condition, formattedMessage); return formattedMessage; } return undefined; } static getAccumulatedLog() { return this.__messages.map((log) => this.__formatLogs(log)); } } Logger.__messages = []; Logger.logLevel = LogLevel.Warn; Logger.isRichLog = false; Logger.isAccumulateLog = false; /***/ }), /***/ "./src/foundation/misc/MiscUtil.ts": /*!*****************************************!*\ !*** ./src/foundation/misc/MiscUtil.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MiscUtil: () => (/* binding */ MiscUtil), /* harmony export */ addLineNumberToCode: () => (/* binding */ addLineNumberToCode), /* harmony export */ assertExist: () => (/* binding */ assertExist), /* harmony export */ deepCopyUsingJsonStringify: () => (/* binding */ deepCopyUsingJsonStringify), /* harmony export */ defaultValue: () => (/* binding */ defaultValue), /* harmony export */ downloadArrayBuffer: () => (/* binding */ downloadArrayBuffer), /* harmony export */ downloadTypedArray: () => (/* binding */ downloadTypedArray), /* harmony export */ greaterThan: () => (/* binding */ greaterThan), /* harmony export */ ifDefinedThen: () => (/* binding */ ifDefinedThen), /* harmony export */ ifDefinedThenWithReturn: () => (/* binding */ ifDefinedThenWithReturn), /* harmony export */ ifExistsThen: () => (/* binding */ ifExistsThen), /* harmony export */ ifExistsThenWithReturn: () => (/* binding */ ifExistsThenWithReturn), /* harmony export */ ifNotExistsThen: () => (/* binding */ ifNotExistsThen), /* harmony export */ ifNotExistsThenWithReturn: () => (/* binding */ ifNotExistsThenWithReturn), /* harmony export */ ifUndefinedThen: () => (/* binding */ ifUndefinedThen), /* harmony export */ ifUndefinedThenWithReturn: () => (/* binding */ ifUndefinedThenWithReturn), /* harmony export */ lessThan: () => (/* binding */ lessThan), /* harmony export */ nullishToEmptyArray: () => (/* binding */ nullishToEmptyArray), /* harmony export */ nullishToEmptyMap: () => (/* binding */ nullishToEmptyMap), /* harmony export */ valueWithCompensation: () => (/* binding */ valueWithCompensation), /* harmony export */ valueWithDefault: () => (/* binding */ valueWithDefault) /* harmony export */ }); /* harmony import */ var _Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Is */ "./src/foundation/misc/Is.ts"); const isMobileVr = function () { return /(Pacific Build.+OculusBrowser.+SamsungBrowser.+)|(SamsungBrowser)|(Mobile VR)/i.test(window.navigator.userAgent); }; const isMobile = function () { const ua = [ 'iPod', 'iPad', // for old version 'iPhone', 'Android', ]; for (let i = 0; i < ua.length; i++) { if (navigator.userAgent.indexOf(ua[i]) > 0) { return true; } } return isIPad(); }; const isSafari = function () { const toBe = 'Safari'; const noToBe = 'Chrome'; if (navigator.userAgent.indexOf(toBe) > 0 && navigator.userAgent.indexOf(noToBe) === -1) { return true; } return false; }; const isIOS = function () { const ua = [ 'iPod', 'iPad', // for old version 'iPhone', ]; for (let i = 0; i < ua.length; i++) { if (navigator.userAgent.indexOf(ua[i]) > 0) { return true; } } return isIPad(); }; const isIPad = function () { return navigator.userAgent.indexOf('Macintosh') > -1 && 'ontouchend' in document; }; const preventDefaultForDesktopOnly = function (e) { if (!isMobile()) { e.preventDefault(); } }; const isObject = function (o) { return o instanceof Object && !(o instanceof Array) ? true : false; }; // https://stackoverflow.com/questions/30003353/can-es6-template-literals-be-substituted-at-runtime-or-reused const fillTemplate = function (templateString, templateVars) { return new Function('return `' + templateString + '`;').call(templateVars); }; const isNode = function () { return typeof process !== 'undefined' && "function" !== 'undefined'; }; const concatArrayBuffers = function (segments, sizes, offsets, finalSize) { let sumLength = 0; for (let i = 0; i < sizes.length; ++i) { sumLength += sizes[i]; } let whole; if (finalSize != null) { whole = new Uint8Array(finalSize); } else { whole = new Uint8Array(sumLength); } const getExceededSize = (sizeToAdd) => { if (finalSize != null && offsetOfBase + sizeToAdd > finalSize) { return offsetOfBase + sizeToAdd - finalSize; } else { return 0; } }; let offsetOfBase = 0; const addData = (sizeToAdd, i) => { const exceededSize = getExceededSize(sizeToAdd); if (exceededSize) { whole.set(new Uint8Array(segments[i], offsets[i], exceededSize), offsetOfBase); offsetOfBase += exceededSize; return true; } else { whole.set(new Uint8Array(segments[i], offsets[i], sizeToAdd), offsetOfBase); offsetOfBase += sizeToAdd; return false; } }; const addOverSizeData = (overSize) => { const exceededSize = getExceededSize(overSize); if (exceededSize) { whole.set(new Uint8Array(exceededSize), offsetOfBase); offsetOfBase += exceededSize; return true; } else { whole.set(new Uint8Array(overSize), offsetOfBase); offsetOfBase += overSize; return false; } }; for (let i = 0; i < segments.length; ++i) { const delta = sizes[i] + offsets[i] - segments[i].byteLength; const overSize = delta > 0 ? delta : 0; const sizeToAdd = sizes[i] - overSize; if (addData(sizeToAdd, i)) { return whole.buffer; } if (overSize > 0) { if (addOverSizeData(overSize)) { return whole.buffer; } } } if (finalSize != null && offsetOfBase < finalSize) { whole.set(new Uint8Array(finalSize - offsetOfBase), offsetOfBase); } return whole.buffer; }; const concatArrayBuffers2 = ({ finalSize, srcs, srcsOffset, srcsCopySize, }) => { const dstBuf = new Uint8Array(new ArrayBuffer(finalSize)); let copiedSize = 0; for (const i in srcs) { const src = srcs[i]; const srcBuf = new Uint8Array(src, srcsOffset[i], srcsCopySize[i]); dstBuf.set(srcBuf, copiedSize); copiedSize += srcsCopySize[i]; } return dstBuf.buffer; }; const valueWithDefault = ({ value, defaultValue }) => { // eslint-disable-next-line eqeqeq if (value == null) { return defaultValue; } return value; }; const ifExistsThen = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value)) { callback(value); return true; } return false; }; const ifExistsThenWithReturn = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value)) { return callback(value); } return value; }; const ifDefinedThen = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value)) { callback(value); return true; } return false; }; const ifDefinedThenWithReturn = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value)) { return callback(value); } return value; }; const ifUndefinedThen = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.undefined(value)) { callback(); return false; } return true; }; const ifUndefinedThenWithReturn = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.undefined(value)) { return callback(); } return value; }; const ifNotExistsThen = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.undefined(value)) { callback(); } }; const ifNotExistsThenWithReturn = (callback, value) => { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.undefined(value)) { return callback(); } return value; }; const defaultValue = (defaultValue, value) => { // eslint-disable-next-line eqeqeq if (value == null) { return defaultValue; } return value; }; const valueWithCompensation = ({ value, compensation, }) => { // eslint-disable-next-line eqeqeq if (value == null) { return compensation(); } return value; }; const nullishToEmptyArray = (value) => { // eslint-disable-next-line eqeqeq if (value == null) { return []; } return value; }; const nullishToEmptyMap = (value) => { // eslint-disable-next-line eqeqeq if (value == null) { return new Map(); } return value; }; const greaterThan = (it, than) => { if (it > than) { return { result: true, greater: it, less: than }; } else { return { result: false, greater: than, less: it }; } }; const lessThan = (it, than) => { if (it < than) { return { result: true, greater: than, less: it }; } else { return { result: false, greater: it, less: than }; } }; const addLineNumberToCode = (shaderString) => { const shaderTextLines = shaderString.split(/\r\n|\r|\n/); let shaderTextWithLineNumber = ''; for (let i = 0; i < shaderTextLines.length; i++) { const lineIndex = i + 1; let splitter = ' : '; if (lineIndex < 10) { splitter = ' : '; } else if (lineIndex >= 100) { splitter = ': '; } shaderTextWithLineNumber += lineIndex + splitter + shaderTextLines[i] + '\n'; } return shaderTextWithLineNumber; }; function assertExist(val) { if (val === undefined || val === null) { throw new Error(`Expected 'val' to be existed, but received ${val}`); } } function deepCopyUsingJsonStringify(obj) { return JSON.parse(JSON.stringify(obj)); } function downloadArrayBuffer(fileNameToDownload, arrayBuffer) { const a = document.createElement('a'); a.download = fileNameToDownload; const blob = new Blob([arrayBuffer], { type: 'octet/stream' }); const url = URL.createObjectURL(blob); a.href = url; const e = new MouseEvent('click'); a.dispatchEvent(e); URL.revokeObjectURL(url); } function downloadTypedArray(fileNameToDownload, typedArray) { const a = document.createElement('a'); a.download = fileNameToDownload; const blob = new Blob([typedArray], { type: 'octet/stream' }); const url = URL.createObjectURL(blob); a.href = url; const e = new MouseEvent('click'); a.dispatchEvent(e); URL.revokeObjectURL(url); } const MiscUtil = Object.freeze({ isMobileVr, isMobile, isIOS, isSafari, preventDefaultForDesktopOnly, isObject, fillTemplate, isNode, concatArrayBuffers, concatArrayBuffers2, addLineNumberToCode, downloadArrayBuffer, downloadTypedArray, }); /***/ }), /***/ "./src/foundation/misc/Option.ts": /*!***************************************!*\ !*** ./src/foundation/misc/Option.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ None: () => (/* binding */ None), /* harmony export */ Option: () => (/* binding */ Option), /* harmony export */ Some: () => (/* binding */ Some), /* harmony export */ assertDoesNotHave: () => (/* binding */ assertDoesNotHave), /* harmony export */ assertHas: () => (/* binding */ assertHas) /* harmony export */ }); /* harmony import */ var _Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Is */ "./src/foundation/misc/Is.ts"); // Inspired from https://scleapt.com/typescript_option/ /** * An interface for handling values whose existence is uncertain. */ const errorStr = 'The value does not exist!'; class Option { constructor(value) { this.value = value; } set(val) { this.value = val; } then(f) { return _Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value) ? f(this.value) : new None(); } /** * @param altValue * @returns */ unwrapOrDefault(altValue) { return _Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value) ? this.value : altValue; } /** * @param altValue * @returns */ unwrapOrElse(f) { return _Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value) ? this.value : f(); } /** * @returns */ unwrapForce() { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value)) { return this.value; } else { throw new ReferenceError(errorStr); } } unwrapOrUndefined() { if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value)) { return this.value; } else { return undefined; } } has() { return _Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value); } doesNotHave() { return !_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(this.value); } } /** * a class indicating that the included value exists. */ class Some { constructor(value) { this.value = value; } then(f) { return f(this.value); } /** * @param altValue * @returns */ unwrapOrDefault(altValue) { return this.value; } /** * @param altValue * @returns */ unwrapOrElse(f) { return this.value; } /** * @param altValue * @returns */ unwrapForce() { return this.value; } unwrapOrUndefined() { return this.value; } get() { return this.value; } has() { return true; } doesNotHave() { return false; } } /** * a class indicating no existence. */ class None { then() { return this; } unwrapOrDefault(value) { return value; } unwrapOrElse(f) { return f(undefined); } unwrapForce() { throw new ReferenceError(errorStr); } unwrapOrUndefined() { return undefined; } has() { return false; } doesNotHave() { return true; } } function assertHas(value) { if (!value.has()) { throw new ReferenceError(errorStr); } } function assertDoesNotHave(value) { if (value.has()) { throw new ReferenceError(errorStr); } } /***/ }), /***/ "./src/foundation/misc/Result.ts": /*!***************************************!*\ !*** ./src/foundation/misc/Result.ts ***! \***************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Err: () => (/* binding */ Err), /* harmony export */ Ok: () => (/* binding */ Ok), /* harmony export */ assertIsErr: () => (/* binding */ assertIsErr), /* harmony export */ assertIsOk: () => (/* binding */ assertIsOk), /* harmony export */ isErr: () => (/* binding */ isErr), /* harmony export */ isOk: () => (/* binding */ isOk) /* harmony export */ }); /* harmony import */ var _RnException__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RnException */ "./src/foundation/misc/RnException.ts"); class CResult { constructor(val) { this.val = val; } match(obj) { if (this instanceof Ok) { return new Ok(obj.Ok(this.val)); } else if (this instanceof Err) { return new Err(obj.Err(this.val)); } throw new Error('This is neither Ok nor Err.'); } name() { return this.constructor.name; } } /** * a class indicating that the result is Ok (Succeeded). */ class Ok extends CResult { constructor(val) { super(val); } /** * This method is essentially same to the Ok::and_then() in Rust language * @param f */ // then(f: (value: T) => void): Finalizer { // f(this.val as T); // return new Finalizer(); // } unwrapWithCompensation(catchFn) { return this.val; } unwrapForce() { return this.val; } // catch(f: (value: RnError) => void): void {} true() { return true; } _isOk() { return true; } _isErr() { return false; } /** * get the inner value safely. * @returns the inner value */ get() { return this.val; } } /** * a class indicating that the result is Error (Failed). */ class Err extends CResult { constructor(val) { super(val); this._rnException = new _RnException__WEBPACK_IMPORTED_MODULE_0__.RnException(this.val); } unwrapWithCompensation(catchFn) { return catchFn(this.val); } unwrapForce() { throw this._rnException; } false() { return false; } _isOk() { return false; } _isErr() { return true; } /** * get the RnError object. * @returns the RnError object */ getRnError() { return this.val; } toString() { return this._rnException.stack; } } function isOk(result) { return result._isOk(); } function isErr(result) { return result._isErr(); } function assertIsOk(result) { if (result._isErr()) { throw new Error('This is Err. No Ok.'); } } function assertIsErr(result) { if (result._isOk()) { throw new Error('This is Ok. No Err.'); } } /***/ }), /***/ "./src/foundation/misc/RnException.ts": /*!********************************************!*\ !*** ./src/foundation/misc/RnException.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RnException: () => (/* binding */ RnException) /* harmony export */ }); class RnException extends Error { constructor(err) { super(` message: ${err.message} error: ${typeof err.error._rnException !== 'undefined' ? 'see below Exception ↓' + err.error.toString() : err.error} `); this.err = err; this.name = RnException._prefix; } getRnError() { return this.err; } } RnException._prefix = '\nRhodonite Exception'; /***/ }), /***/ "./src/foundation/misc/RnPromise.ts": /*!******************************************!*\ !*** ./src/foundation/misc/RnPromise.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RnPromise: () => (/* binding */ RnPromise) /* harmony export */ }); class RnPromise extends Promise { constructor(arg) { super((resolve, reject) => { }); this.name = ''; this.__callbackObj = { promiseAllNum: 0, resolvedNum: 0, rejectedNum: 0, pendingNum: 0, processedPromises: [], }; if (arg instanceof Promise) { this.__promise = arg; } else { this.__promise = new Promise(arg); } } static resolve(arg) { if (arg instanceof Promise) { return new RnPromise(arg); } else if (arg instanceof RnPromise) { return arg; } else if (arg.then != null) { const rnPromise = new RnPromise((resolve, reject) => { resolve(arg); }); rnPromise.then = arg.then; return rnPromise; } else { return new RnPromise((resolve, reject) => { resolve(arg); }); } } static all(promises, callback) { if (callback) { const rnPromises = []; const callbackObj = { promiseAllNum: promises.length, resolvedNum: 0, rejectedNum: 0, pendingNum: promises.length, processedPromises: [], }; for (const promise of promises) { const rnPromise = RnPromise.resolve(promise); rnPromise.__callback = callback; rnPromise.__callbackObj = callbackObj; rnPromises.push(rnPromise); } return new RnPromise(Promise.all(rnPromises)); } else { return new RnPromise(Promise.all(promises)); } } static race(args) { return new RnPromise(Promise.race(args)); } then(onfulfilled, onrejected) { let onFulfilledWrapper; if (onfulfilled) { onFulfilledWrapper = (value) => { if (this.__callbackObj.promiseAllNum !== 0 && this.__callbackObj.processedPromises.indexOf(this) === -1) { this.__callbackObj.pendingNum--; this.__callbackObj.resolvedNum++; this.__callbackObj.processedPromises.push(this); } if (this.__callback) { this.__callback(this.__callbackObj); } return onfulfilled(value); }; } return this.__promise.then(onFulfilledWrapper, onrejected); } catch(onRejected) { return new RnPromise(this.__promise.catch(onRejected)); } finally(onFinally) { return this.__promise.finally(onFinally); } static reject(e) { return new RnPromise(Promise.reject(e)); } } /***/ }), /***/ "./src/foundation/misc/Time.ts": /*!*************************************!*\ !*** ./src/foundation/misc/Time.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Time: () => (/* binding */ Time) /* harmony export */ }); class Time { /** * @internal */ static _processBegin() { Time.__currentProcessBeginTime = performance.now(); if (Time.__systemStartTime === 0) { Time.__systemStartTime = Time.__currentProcessBeginTime; } } /** * @internal */ static _processEnd() { Time.__lastProcessEndTime = performance.now(); Time.__lastTickTimeInterval = Time.__lastProcessEndTime - Time.__currentProcessBeginTime; } static get timeAtProcessBeginMilliseconds() { return Time.__currentProcessBeginTime; } static get timeAtProcessEndMilliseconds() { return Time.__lastProcessEndTime; } static get timeFromSystemStart() { return (performance.now() - Time.__systemStartTime) / 1000; } static get lastTickTimeInterval() { return Time.__lastTickTimeInterval / 1000; } static get lastTimeTimeIntervalInMilliseconds() { return Time.__lastTickTimeInterval; } } Time.__currentProcessBeginTime = 0; Time.__lastProcessEndTime = 0; Time.__lastTickTimeInterval = 0; Time.__systemStartTime = 0; /***/ }), /***/ "./src/foundation/misc/WeakOption.ts": /*!*******************************************!*\ !*** ./src/foundation/misc/WeakOption.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WeakNone: () => (/* binding */ WeakNone), /* harmony export */ WeakOption: () => (/* binding */ WeakOption), /* harmony export */ WeakSome: () => (/* binding */ WeakSome) /* harmony export */ }); /* harmony import */ var _Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Is */ "./src/foundation/misc/Is.ts"); // Inspired from https://scleapt.com/typescript_option/ /** * An interface for handling values whose existence is uncertain. */ const errorStr = 'The value does not exist!'; class WeakOption { constructor() { this.__weakMap = new WeakMap(); } set(base, val) { this.__weakMap.set(base, val); } /** * @param altValue * @returns */ unwrapOrDefault(base, altValue) { const value = this.__weakMap.get(base); return _Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value) ? value : altValue; } /** * @param altValue * @returns */ unwrapOrElse(base, f) { const value = this.__weakMap.get(base); return _Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value) ? value : f(); } /** * @returns */ unwrapForce(base) { const value = this.__weakMap.get(base); if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(value)) { return value; } else { throw new ReferenceError(errorStr); } } unwrapOrUndefined(base) { return this.__weakMap.get(base); } has(base) { return this.__weakMap.has(base); } } /** * a class indicating that the included value exists. */ class WeakSome { constructor(base, value) { this.__weakMap = new WeakMap(); this.__weakMap.set(base, value); } /** * @param altValue * @returns */ unwrapOrDefault(base, altValue) { return this.__weakMap.get(base); } /** * @param altValue * @returns */ unwrapOrElse(base, f) { return this.__weakMap.get(base); } /** * @param altValue * @returns */ unwrapForce(base) { return this.__weakMap.get(base); } get(base) { return this.__weakMap.get(base); } unwrapOrUndefined(base) { return this.__weakMap.get(base); } has(base) { return true; } } /** * a class indicating no existence. */ class WeakNone { then() { return this; } unwrapOrDefault(base, value) { return value; } unwrapOrElse(base, f) { return f(undefined); } unwrapForce(base) { throw new ReferenceError(errorStr); } unwrapOrUndefined(base) { return undefined; } has() { return false; } } /***/ }), /***/ "./src/foundation/misc/cache/Cache.ts": /*!********************************************!*\ !*** ./src/foundation/misc/cache/Cache.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cache: () => (/* binding */ Cache) /* harmony export */ }); /* harmony import */ var _SymbolWeakMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SymbolWeakMap */ "./src/foundation/misc/cache/SymbolWeakMap.ts"); class Cache { constructor() { this.__symbolWeakMap = new _SymbolWeakMap__WEBPACK_IMPORTED_MODULE_0__.SymbolWeakMap(); } register(value) { this.__symbolWeakMap.set(Symbol(), value); } } /***/ }), /***/ "./src/foundation/misc/cache/SymbolWeakMap.ts": /*!****************************************************!*\ !*** ./src/foundation/misc/cache/SymbolWeakMap.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SymbolWeakMap: () => (/* binding */ SymbolWeakMap) /* harmony export */ }); /* harmony import */ var _Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Is */ "./src/foundation/misc/Is.ts"); class SymbolWeakMap { constructor() { this.__weakMap = new WeakMap(); } /** * set key and value * @param symbol the key for access * @param value the value as a cache item * @returns true: succeed to set value, false: not set (already exists) */ set(symbol, value) { const isExist = this.__weakMap.has(symbol); if (isExist) { return false; } else { this.__weakMap.set(symbol, value); return true; } } /** * return the boolean value whether it have the key or not * @param symbol the key for access * @returns Whether it have the key or not. */ has(symbol) { const isExist = this.__weakMap.has(symbol); if (isExist) { return true; } else { return false; } } /** * return the number of this cache items * @returns the number of this cache items */ // public size(): number { // return this.__weakMap.size; // } /** * return the value in the cache by the key * @param symbol the key for access * @returns the value in the cache by the key */ get(symbol) { const keyObj = this.__weakMap.get(symbol); if (_Is__WEBPACK_IMPORTED_MODULE_0__.Is.not.exist(keyObj)) { return undefined; } const val = this.__weakMap.get(symbol); return val; } /** * delete the value * @param symbol the key for access * @returns the flag of the deletion was succeed or not */ delete(symbol) { const isExist = this.__weakMap.has(symbol); if (!isExist) { return false; } this.__weakMap.delete(symbol); return true; } } /***/ }), /***/ "./src/foundation/misc/cache/cachify.ts": /*!**********************************************!*\ !*** ./src/foundation/misc/cache/cachify.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ objectCachify: () => (/* binding */ objectCachify), /* harmony export */ primitiveCachify1: () => (/* binding */ primitiveCachify1) /* harmony export */ }); /** * This is from : https://github.com/threepointone/glamor/blob/667b480d31b3721a905021b26e1290ce92ca2879/docs/weakmaps.md#so-what-does-a-cache-built-with-a-weakmap-look-like * Thank you! */ /** * Return the caching wrapper function * @param fn the target function for caching result * @returns */ const objectCachify = (fn) => { const cache = new WeakMap(); return (arg) => { if (cache.has(arg)) { return cache.get(arg); } const value = fn(arg); cache.set(arg, value); return value; }; }; /** * Return the caching wrapper function * @param fn the target function for caching result * @returns */ const primitiveCachify1 = (fn) => { const cache = new Map(); return (arg) => { if (cache.has(arg)) { return cache.get(arg); } const value = fn(arg); cache.set(arg, value); return value; }; }; /***/ }), /***/ "./src/foundation/misc/cache/index.ts": /*!********************************************!*\ !*** ./src/foundation/misc/cache/index.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cache: () => (/* reexport safe */ _Cache__WEBPACK_IMPORTED_MODULE_0__.Cache), /* harmony export */ SymbolWeakMap: () => (/* reexport safe */ _SymbolWeakMap__WEBPACK_IMPORTED_MODULE_2__.SymbolWeakMap), /* harmony export */ objectCachify: () => (/* reexport safe */ _cachify__WEBPACK_IMPORTED_MODULE_1__.objectCachify), /* harmony export */ primitiveCachify1: () => (/* reexport safe */ _cachify__WEBPACK_IMPORTED_MODULE_1__.primitiveCachify1) /* harmony export */ }); /* harmony import */ var _Cache__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Cache */ "./src/foundation/misc/cache/Cache.ts"); /* harmony import */ var _cachify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cachify */ "./src/foundation/misc/cache/cachify.ts"); /* harmony import */ var _SymbolWeakMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SymbolWeakMap */ "./src/foundation/misc/cache/SymbolWeakMap.ts"); /***/ }), /***/ "./src/foundation/misc/index.ts": /*!**************************************!*\ !*** ./src/foundation/misc/index.ts ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cache: () => (/* reexport safe */ _cache__WEBPACK_IMPORTED_MODULE_0__.Cache), /* harmony export */ DataUtil: () => (/* reexport safe */ _DataUtil__WEBPACK_IMPORTED_MODULE_1__.DataUtil), /* harmony export */ EnumClass: () => (/* reexport safe */ _EnumIO__WEBPACK_IMPORTED_MODULE_2__.EnumClass), /* harmony export */ Err: () => (/* reexport safe */ _Result__WEBPACK_IMPORTED_MODULE_7__.Err), /* harmony export */ ImageUtil: () => (/* reexport safe */ _ImageUtil__WEBPACK_IMPORTED_MODULE_3__.ImageUtil), /* harmony export */ Is: () => (/* reexport safe */ _Is__WEBPACK_IMPORTED_MODULE_4__.Is), /* harmony export */ IsObj: () => (/* reexport safe */ _Is__WEBPACK_IMPORTED_MODULE_4__.IsObj), /* harmony export */ LogLevel: () => (/* reexport safe */ _Logger__WEBPACK_IMPORTED_MODULE_12__.LogLevel), /* harmony export */ Logger: () => (/* reexport safe */ _Logger__WEBPACK_IMPORTED_MODULE_12__.Logger), /* harmony export */ MiscUtil: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.MiscUtil), /* harmony export */ None: () => (/* reexport safe */ _Option__WEBPACK_IMPORTED_MODULE_6__.None), /* harmony export */ Ok: () => (/* reexport safe */ _Result__WEBPACK_IMPORTED_MODULE_7__.Ok), /* harmony export */ Option: () => (/* reexport safe */ _Option__WEBPACK_IMPORTED_MODULE_6__.Option), /* harmony export */ RnException: () => (/* reexport safe */ _RnException__WEBPACK_IMPORTED_MODULE_9__.RnException), /* harmony export */ RnPromise: () => (/* reexport safe */ _RnPromise__WEBPACK_IMPORTED_MODULE_8__.RnPromise), /* harmony export */ Some: () => (/* reexport safe */ _Option__WEBPACK_IMPORTED_MODULE_6__.Some), /* harmony export */ SymbolWeakMap: () => (/* reexport safe */ _cache__WEBPACK_IMPORTED_MODULE_0__.SymbolWeakMap), /* harmony export */ Time: () => (/* reexport safe */ _Time__WEBPACK_IMPORTED_MODULE_10__.Time), /* harmony export */ WeakNone: () => (/* reexport safe */ _WeakOption__WEBPACK_IMPORTED_MODULE_11__.WeakNone), /* harmony export */ WeakOption: () => (/* reexport safe */ _WeakOption__WEBPACK_IMPORTED_MODULE_11__.WeakOption), /* harmony export */ WeakSome: () => (/* reexport safe */ _WeakOption__WEBPACK_IMPORTED_MODULE_11__.WeakSome), /* harmony export */ _from: () => (/* reexport safe */ _EnumIO__WEBPACK_IMPORTED_MODULE_2__._from), /* harmony export */ _fromString: () => (/* reexport safe */ _EnumIO__WEBPACK_IMPORTED_MODULE_2__._fromString), /* harmony export */ _fromStringCaseSensitively: () => (/* reexport safe */ _EnumIO__WEBPACK_IMPORTED_MODULE_2__._fromStringCaseSensitively), /* harmony export */ addLineNumberToCode: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.addLineNumberToCode), /* harmony export */ assertDoesNotHave: () => (/* reexport safe */ _Option__WEBPACK_IMPORTED_MODULE_6__.assertDoesNotHave), /* harmony export */ assertExist: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.assertExist), /* harmony export */ assertHas: () => (/* reexport safe */ _Option__WEBPACK_IMPORTED_MODULE_6__.assertHas), /* harmony export */ assertIsErr: () => (/* reexport safe */ _Result__WEBPACK_IMPORTED_MODULE_7__.assertIsErr), /* harmony export */ assertIsOk: () => (/* reexport safe */ _Result__WEBPACK_IMPORTED_MODULE_7__.assertIsOk), /* harmony export */ combineImages: () => (/* reexport safe */ _ImageUtil__WEBPACK_IMPORTED_MODULE_3__.combineImages), /* harmony export */ convertHTMLImageElementToCanvas: () => (/* reexport safe */ _ImageUtil__WEBPACK_IMPORTED_MODULE_3__.convertHTMLImageElementToCanvas), /* harmony export */ deepCopyUsingJsonStringify: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.deepCopyUsingJsonStringify), /* harmony export */ defaultValue: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.defaultValue), /* harmony export */ downloadArrayBuffer: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.downloadArrayBuffer), /* harmony export */ downloadTypedArray: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.downloadTypedArray), /* harmony export */ greaterThan: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.greaterThan), /* harmony export */ ifDefinedThen: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifDefinedThen), /* harmony export */ ifDefinedThenWithReturn: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifDefinedThenWithReturn), /* harmony export */ ifExistsThen: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifExistsThen), /* harmony export */ ifExistsThenWithReturn: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifExistsThenWithReturn), /* harmony export */ ifNotExistsThen: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifNotExistsThen), /* harmony export */ ifNotExistsThenWithReturn: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifNotExistsThenWithReturn), /* harmony export */ ifUndefinedThen: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifUndefinedThen), /* harmony export */ ifUndefinedThenWithReturn: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.ifUndefinedThenWithReturn), /* harmony export */ isErr: () => (/* reexport safe */ _Result__WEBPACK_IMPORTED_MODULE_7__.isErr), /* harmony export */ isOk: () => (/* reexport safe */ _Result__WEBPACK_IMPORTED_MODULE_7__.isOk), /* harmony export */ lessThan: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.lessThan), /* harmony export */ nullishToEmptyArray: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.nullishToEmptyArray), /* harmony export */ nullishToEmptyMap: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.nullishToEmptyMap), /* harmony export */ objectCachify: () => (/* reexport safe */ _cache__WEBPACK_IMPORTED_MODULE_0__.objectCachify), /* harmony export */ primitiveCachify1: () => (/* reexport safe */ _cache__WEBPACK_IMPORTED_MODULE_0__.primitiveCachify1), /* harmony export */ valueWithCompensation: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.valueWithCompensation), /* harmony export */ valueWithDefault: () => (/* reexport safe */ _MiscUtil__WEBPACK_IMPORTED_MODULE_5__.valueWithDefault) /* harmony export */ }); /* harmony import */ var _cache__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cache */ "./src/foundation/misc/cache/index.ts"); /* harmony import */ var _DataUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _EnumIO__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EnumIO */ "./src/foundation/misc/EnumIO.ts"); /* harmony import */ var _ImageUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ImageUtil */ "./src/foundation/misc/ImageUtil.ts"); /* harmony import */ var _Is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _MiscUtil__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _Option__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Option */ "./src/foundation/misc/Option.ts"); /* harmony import */ var _Result__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _RnPromise__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./RnPromise */ "./src/foundation/misc/RnPromise.ts"); /* harmony import */ var _RnException__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RnException */ "./src/foundation/misc/RnException.ts"); /* harmony import */ var _Time__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Time */ "./src/foundation/misc/Time.ts"); /* harmony import */ var _WeakOption__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./WeakOption */ "./src/foundation/misc/WeakOption.ts"); /* harmony import */ var _Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Logger */ "./src/foundation/misc/Logger.ts"); /***/ }), /***/ "./src/foundation/physics/Oimo/OimoPhysicsStrategy.ts": /*!************************************************************!*\ !*** ./src/foundation/physics/Oimo/OimoPhysicsStrategy.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ OimoPhysicsStrategy: () => (/* binding */ OimoPhysicsStrategy) /* harmony export */ }); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); class OimoPhysicsStrategy { constructor() { this.__localScale = _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.one(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.not.exist(OimoPhysicsStrategy.__world)) { const world = new OIMO.World({ timestep: 1 / 60, iterations: 8, broadphase: 2, worldscale: 1, random: OimoPhysicsStrategy.__worldProperty.random, info: false, gravity: [ OimoPhysicsStrategy.__worldProperty.gravity.x, OimoPhysicsStrategy.__worldProperty.gravity.y, OimoPhysicsStrategy.__worldProperty.gravity.z, ], }); OimoPhysicsStrategy.__world = world; } } setShape(prop, entity) { const world = OimoPhysicsStrategy.__world; this.__localScale = prop.size; this.__property = { type: prop.type.str.toLowerCase(), size: [prop.size.x, prop.size.y, prop.size.z], pos: [prop.position.x, prop.position.y, prop.position.z], rot: [prop.rotation.x, prop.rotation.y, prop.rotation.z], move: prop.move, density: prop.density, friction: prop.friction, restitution: prop.restitution, }; this.__body = world.add(this.__property); this.__entity = entity; } update() { if (this.__entity === undefined) { return; } const pos = this.__body.getPosition(); const rot = this.__body.getQuaternion(); this.__entity.getSceneGraph().setPositionWithoutPhysics(_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(pos.x, pos.y, pos.z)); this.__entity .getSceneGraph() .setRotationWithoutPhysics(_math__WEBPACK_IMPORTED_MODULE_0__.Quaternion.fromCopy4(rot.x, rot.y, rot.z, rot.w)); } setPosition(worldPosition) { const world = OimoPhysicsStrategy.__world; if (this.__entity === undefined) { return; } this.__body.remove(); const prop = this.__property; this.__property = { type: prop.type, size: [prop.size[0], prop.size[1], prop.size[2]], pos: [worldPosition.x, worldPosition.y, worldPosition.z], rot: [this.__entity.eulerAngles.x, this.__entity.eulerAngles.y, this.__entity.eulerAngles.z], move: prop.move, density: prop.density, friction: prop.friction, restitution: prop.restitution, }; this.__body = world.add(this.__property); } setEulerAngle(eulerAngles) { const world = OimoPhysicsStrategy.__world; if (this.__entity === undefined) { return; } const pos = this.__body.getPosition(); this.__body.remove(); const prop = this.__property; this.__property = { type: prop.type, size: [prop.size[0], prop.size[1], prop.size[2]], pos: [pos.x, pos.y, pos.z], rot: [ _math__WEBPACK_IMPORTED_MODULE_0__.MathUtil.radianToDegree(eulerAngles.x), _math__WEBPACK_IMPORTED_MODULE_0__.MathUtil.radianToDegree(eulerAngles.y), _math__WEBPACK_IMPORTED_MODULE_0__.MathUtil.radianToDegree(eulerAngles.z), ], move: prop.move, density: prop.density, friction: prop.friction, restitution: prop.restitution, }; this.__body = world.add(this.__property); } setScale(scale) { const world = OimoPhysicsStrategy.__world; if (this.__entity === undefined) { return; } const pos = this.__body.getPosition(); this.__body.remove(); const prop = this.__property; this.__property = { type: prop.type, size: [ this.__localScale.x * scale.x, this.__localScale.y * scale.y, this.__localScale.z * scale.z, ], pos: [pos.x, pos.y, pos.z], rot: [this.__entity.eulerAngles.x, this.__entity.eulerAngles.y, this.__entity.eulerAngles.z], move: prop.move, density: prop.density, friction: prop.friction, restitution: prop.restitution, }; this.__body = world.add(this.__property); } static update() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_2__.Is.exist(OimoPhysicsStrategy.__world)) { OimoPhysicsStrategy.__world.step(); } } } OimoPhysicsStrategy.__worldProperty = { gravity: _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopy3(0, -9.8, 0), random: true, }; /***/ }), /***/ "./src/foundation/physics/Oimo/index.ts": /*!**********************************************!*\ !*** ./src/foundation/physics/Oimo/index.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ OimoPhysicsStrategy: () => (/* reexport safe */ _OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_0__.OimoPhysicsStrategy) /* harmony export */ }); /* harmony import */ var _OimoPhysicsStrategy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./OimoPhysicsStrategy */ "./src/foundation/physics/Oimo/OimoPhysicsStrategy.ts"); /***/ }), /***/ "./src/foundation/physics/PhysicsProperty.ts": /*!***************************************************!*\ !*** ./src/foundation/physics/PhysicsProperty.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/physics/PhysicsStrategy.ts": /*!***************************************************!*\ !*** ./src/foundation/physics/PhysicsStrategy.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/physics/PhysicsWorldProperty.ts": /*!********************************************************!*\ !*** ./src/foundation/physics/PhysicsWorldProperty.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/physics/VRMSpring/CapsuleCollider.ts": /*!*************************************************************!*\ !*** ./src/foundation/physics/VRMSpring/CapsuleCollider.ts ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CapsuleCollider: () => (/* binding */ CapsuleCollider) /* harmony export */ }); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); class CapsuleCollider { constructor() { this.position = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.zero(); this.radius = 0; this.tail = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.zero(); } collision(bonePosition, boneRadius) { const spherePosWorld = this.baseSceneGraph.getWorldPositionOf(this.position); let tailPosWorld = this.baseSceneGraph.getWorldPositionOf(this.tail); tailPosWorld = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(tailPosWorld, spherePosWorld); const lengthSqCapsule = tailPosWorld.lengthSquared(); let direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(bonePosition, spherePosWorld); const dot = tailPosWorld.dot(direction); if (dot <= 0.0) { // if bone is near from the head // do nothing } else if (lengthSqCapsule <= dot) { // if bone is near from the tail direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(direction, tailPosWorld); } else { // if bone is between two ends tailPosWorld = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiply(tailPosWorld, dot / lengthSqCapsule); direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtract(direction, tailPosWorld); } const radius = this.radius + boneRadius; const distance = direction.length() - radius; direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalize(direction); return { direction, distance }; } } /***/ }), /***/ "./src/foundation/physics/VRMSpring/SphereCollider.ts": /*!************************************************************!*\ !*** ./src/foundation/physics/VRMSpring/SphereCollider.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SphereCollider: () => (/* binding */ SphereCollider) /* harmony export */ }); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); class SphereCollider { constructor() { this.position = _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.zero(); this.radius = 0; } collision(bonePosition, boneRadius) { const spherePosWorld = this.baseSceneGraph.getWorldPositionOfTo(this.position, SphereCollider.__tmp_vec3_0); const delta = _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.subtractTo(bonePosition, spherePosWorld, SphereCollider.__tmp_vec3_1); const direction = _math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.normalizeTo(delta, SphereCollider.__tmp_vec3_2); const radius = this.radius + boneRadius; const distance = delta.length() - radius; return { direction, distance }; } } SphereCollider.__tmp_vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_0__.MutableVector3.zero(); SphereCollider.__tmp_vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_0__.MutableVector3.zero(); SphereCollider.__tmp_vec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_0__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/physics/VRMSpring/VRMColliderGroup.ts": /*!**************************************************************!*\ !*** ./src/foundation/physics/VRMSpring/VRMColliderGroup.ts ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VRMColliderGroup: () => (/* binding */ VRMColliderGroup) /* harmony export */ }); class VRMColliderGroup { constructor() { this.sphereColliders = []; this.capsuleColliders = []; } } /***/ }), /***/ "./src/foundation/physics/VRMSpring/VRMSpring.ts": /*!*******************************************************!*\ !*** ./src/foundation/physics/VRMSpring/VRMSpring.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VRMSpring: () => (/* binding */ VRMSpring) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/RnObject */ "./src/foundation/core/RnObject.ts"); class VRMSpring extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor(rootBone) { super(); this.bones = []; this.colliderGroups = []; this.rootBone = rootBone; } } /***/ }), /***/ "./src/foundation/physics/VRMSpring/VRMSpringBone.ts": /*!***********************************************************!*\ !*** ./src/foundation/physics/VRMSpring/VRMSpringBone.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VRMSpringBone: () => (/* binding */ VRMSpringBone) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../math */ "./src/foundation/math/index.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); class VRMSpringBone extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor(node) { super(); this.stiffnessForce = 0.5; this.gravityPower = 0; this.gravityDir = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.fromCopyArray([0, -1.0, 0]); this.dragForce = 0.05; this.hitRadius = 0.02; this.currentTail = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.zero(); // In World Space this.prevTail = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.zero(); // In World Space this.boneAxis = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.zero(); // In Local Space this.boneLength = 0; this.initialized = false; this.node = node; } setup(localChildPosition, center) { if (!this.initialized) { const scenegraph = this.node.getSceneGraph(); this.node.getTransform()._backupTransformAsRest(); const worldChildPosition = scenegraph.getWorldPositionOfTo(localChildPosition, VRMSpringBone.__tmp_vec3_0); this.currentTail = center != null ? center.getLocalPositionOf(worldChildPosition) : worldChildPosition; this.prevTail = this.currentTail.clone(); this.boneAxis = _math_Vector3__WEBPACK_IMPORTED_MODULE_2__.Vector3.normalize(localChildPosition); this.boneLength = localChildPosition.length(); this.initialized = true; } } } VRMSpringBone.__tmp_vec3_0 = _math__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/physics/VRMSpring/VRMSpringBonePhysicsStrategy.ts": /*!**************************************************************************!*\ !*** ./src/foundation/physics/VRMSpring/VRMSpringBonePhysicsStrategy.ts ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VRMSpringBonePhysicsStrategy: () => (/* binding */ VRMSpringBonePhysicsStrategy) /* harmony export */ }); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _math_Quaternion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _misc_Time__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/Time */ "./src/foundation/misc/Time.ts"); /* harmony import */ var _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../math/MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); class VRMSpringBonePhysicsStrategy { constructor() { } getParentRotation(head) { return head.parent != null ? head.parent.rotation : _math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.identity(); } update() { const spring = this.__spring; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(spring)) { this.updateInner(spring.bones, spring); } } updateInner(bones, spring) { const center = void 0; const collisionGroups = spring.colliderGroups; for (const bone of bones) { // setup VRMSpringBone const sg = bone.node.getSceneGraph(); const children = sg.children; if (children.length > 0) { const transform = children[0].entity.getTransform(); // const childPositionInLocal = MutableVector3.fromCopy3( // transform.localPosition.x * transform.localScale.x, // transform.localPosition.y * transform.localScale.y, // transform.localPosition.z * transform.localScale.z // ); const childPositionInLocal = transform.localPosition; if (childPositionInLocal.lengthSquared() < Number.EPSILON) { childPositionInLocal._v[1] = -1; } bone.setup(childPositionInLocal, void 0); } else { const childPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiplyTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalizeTo(sg.position, VRMSpringBonePhysicsStrategy.__tmp_updateInner_vec3_0), 0.07, VRMSpringBonePhysicsStrategy.__tmp_updateInner_vec3_1); const childPositionInLocal = sg.getLocalPositionOfTo(childPosition, VRMSpringBonePhysicsStrategy.__tmp_updateInner_vec3_2); bone.setup(childPositionInLocal, void 0); } // update VRMSpringBone this.process(collisionGroups, bone, center); } } process(collisionGroups, bone, center) { const dragForce = bone.dragForce; const stiffnessForce = bone.stiffnessForce * _misc_Time__WEBPACK_IMPORTED_MODULE_3__.Time.lastTickTimeInterval * 1; const currentTail = center != null ? center.getWorldPositionOfTo(bone.currentTail, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_0) : bone.currentTail; const prevTail = center != null ? center.getWorldPositionOfTo(bone.prevTail, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_1) : bone.prevTail; // Continues the previous frame's movement (there is also attenuation) const inertia = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.multiplyTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtractTo(currentTail, prevTail, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_2), 1.0 - dragForce, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_3); // Movement target of child bones due to parent's rotation const rotation = _math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.multiplyTo(this.getParentRotation(bone.node.getSceneGraph()), bone.node.localRotationRestInner, VRMSpringBonePhysicsStrategy.__tmp_process_quat_0); const stiffness = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiplyTo(rotation.transformVector3To(bone.boneAxis, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_4), stiffnessForce, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_5); // Calculate the nextTail const external = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiplyTo(bone.gravityDir, bone.gravityPower * _misc_Time__WEBPACK_IMPORTED_MODULE_3__.Time.lastTickTimeInterval * 1, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_6); let nextTail = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.addTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.addTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.addTo(currentTail, inertia, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_7), stiffness, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_8), external, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_9); // Normalize to bone length nextTail = this.normalizeBoneLength(nextTail, bone); // Movement by Collision nextTail = this.collision(collisionGroups, nextTail, bone.hitRadius, bone); // prevTail = currentTail; // currentTail = nextTail; bone.prevTail = center != null ? center.getLocalPositionOfTo(currentTail, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_10) : currentTail; bone.currentTail = center != null ? center.getLocalPositionOfTo(nextTail, VRMSpringBonePhysicsStrategy.__tmp_process_vec3_11) : nextTail; const resultRotation = this.applyRotation(nextTail, bone); bone.node.localRotation = resultRotation; // bone.node.rotation = resultRotation; } normalizeBoneLength(nextTail, bone) { const sub = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalizeTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtractTo(nextTail, bone.node.position, VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_0), VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_1); return _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.add(bone.node.position, _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiplyTo(sub, bone.boneLength, VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_2) // VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_3 ); } applyRotation(nextTail, bone) { // calc in local space const sub = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalizeTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.subtractTo(nextTail, bone.node.position, VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_0), VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_1); const to = _math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.invertTo(_math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.multiplyTo(bone.node.parent.rotation, bone.node.localRotationRestInner, VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_0), VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_1).transformVector3(sub); //, VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_2); const result = _math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.multiplyTo(bone.node.localRotationRestInner, _math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.normalizeTo(_math_Quaternion__WEBPACK_IMPORTED_MODULE_2__.Quaternion.fromToRotationTo(_math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalizeTo(bone.boneAxis, VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_3), _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.normalizeTo(to, VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_4), VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_2), VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_3), VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_4); // calc in world space // const rotation = Quaternion.multiply( // this.getParentRotation(bone.node.getSceneGraph()), // bone.node.localRotationRestInner // ); // const sub = Vector3.subtract(nextTail, bone.node.position); // let result = Quaternion.fromToRotation(rotation.transformVector3(bone.boneAxis), sub); // result = Quaternion.multiply(result, rotation); return result; } collision(collisionGroups, nextTail, boneHitRadius, bone) { for (const collisionGroup of collisionGroups) { for (const collider of collisionGroup.sphereColliders) { const { direction, distance } = collider.collision(nextTail, boneHitRadius); if (distance < 0) { // Hit nextTail = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.addTo(nextTail, _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiplyTo(direction, -distance, VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_0), VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_1); // normalize bone length nextTail = this.normalizeBoneLength(nextTail, bone); } } for (const collider of collisionGroup.capsuleColliders) { const { direction, distance } = collider.collision(nextTail, boneHitRadius); if (distance < 0) { // Hit nextTail = _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.addTo(nextTail, _math_Vector3__WEBPACK_IMPORTED_MODULE_0__.Vector3.multiplyTo(direction, -distance, VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_2), VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_3); // normalize bone length nextTail = this.normalizeBoneLength(nextTail, bone); } } } return nextTail; } setSpring(sgs) { this.__spring = sgs; } } VRMSpringBonePhysicsStrategy.__tmp_updateInner_vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_updateInner_vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_updateInner_vec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_4 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_5 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_6 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_7 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_8 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_9 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_10 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_vec3_11 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_process_quat_0 = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__.MutableQuaternion.identity(); VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_normalizeBoneLength_vec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_vec3_4 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_0 = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__.MutableQuaternion.identity(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_1 = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__.MutableQuaternion.identity(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_2 = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__.MutableQuaternion.identity(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_3 = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__.MutableQuaternion.identity(); VRMSpringBonePhysicsStrategy.__tmp_applyRotation_quat_4 = _math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_4__.MutableQuaternion.identity(); VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_0 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_1 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_2 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); VRMSpringBonePhysicsStrategy.__tmp_collision_vec3_3 = _math_MutableVector3__WEBPACK_IMPORTED_MODULE_1__.MutableVector3.zero(); /***/ }), /***/ "./src/foundation/physics/VRMSpring/index.ts": /*!***************************************************!*\ !*** ./src/foundation/physics/VRMSpring/index.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CapsuleCollider: () => (/* reexport safe */ _CapsuleCollider__WEBPACK_IMPORTED_MODULE_0__.CapsuleCollider), /* harmony export */ SphereCollider: () => (/* reexport safe */ _SphereCollider__WEBPACK_IMPORTED_MODULE_1__.SphereCollider), /* harmony export */ VRMColliderGroup: () => (/* reexport safe */ _VRMColliderGroup__WEBPACK_IMPORTED_MODULE_2__.VRMColliderGroup), /* harmony export */ VRMSpring: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_3__.VRMSpring), /* harmony export */ VRMSpringBone: () => (/* reexport safe */ _VRMSpringBone__WEBPACK_IMPORTED_MODULE_4__.VRMSpringBone), /* harmony export */ VRMSpringBonePhysicsStrategy: () => (/* reexport safe */ _VRMSpringBonePhysicsStrategy__WEBPACK_IMPORTED_MODULE_5__.VRMSpringBonePhysicsStrategy) /* harmony export */ }); /* harmony import */ var _CapsuleCollider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CapsuleCollider */ "./src/foundation/physics/VRMSpring/CapsuleCollider.ts"); /* harmony import */ var _SphereCollider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SphereCollider */ "./src/foundation/physics/VRMSpring/SphereCollider.ts"); /* harmony import */ var _VRMColliderGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./VRMColliderGroup */ "./src/foundation/physics/VRMSpring/VRMColliderGroup.ts"); /* harmony import */ var _VRMSpring__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./VRMSpring */ "./src/foundation/physics/VRMSpring/VRMSpring.ts"); /* harmony import */ var _VRMSpringBone__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./VRMSpringBone */ "./src/foundation/physics/VRMSpring/VRMSpringBone.ts"); /* harmony import */ var _VRMSpringBonePhysicsStrategy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./VRMSpringBonePhysicsStrategy */ "./src/foundation/physics/VRMSpring/VRMSpringBonePhysicsStrategy.ts"); /***/ }), /***/ "./src/foundation/physics/index.ts": /*!*****************************************!*\ !*** ./src/foundation/physics/index.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CapsuleCollider: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_1__.CapsuleCollider), /* harmony export */ OimoPhysicsStrategy: () => (/* reexport safe */ _Oimo__WEBPACK_IMPORTED_MODULE_0__.OimoPhysicsStrategy), /* harmony export */ SphereCollider: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_1__.SphereCollider), /* harmony export */ VRMColliderGroup: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_1__.VRMColliderGroup), /* harmony export */ VRMSpring: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_1__.VRMSpring), /* harmony export */ VRMSpringBone: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_1__.VRMSpringBone), /* harmony export */ VRMSpringBonePhysicsStrategy: () => (/* reexport safe */ _VRMSpring__WEBPACK_IMPORTED_MODULE_1__.VRMSpringBonePhysicsStrategy) /* harmony export */ }); /* harmony import */ var _Oimo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Oimo */ "./src/foundation/physics/Oimo/index.ts"); /* harmony import */ var _VRMSpring__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VRMSpring */ "./src/foundation/physics/VRMSpring/index.ts"); /* harmony import */ var _PhysicsStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PhysicsStrategy */ "./src/foundation/physics/PhysicsStrategy.ts"); /* harmony import */ var _PhysicsProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./PhysicsProperty */ "./src/foundation/physics/PhysicsProperty.ts"); /* harmony import */ var _PhysicsWorldProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PhysicsWorldProperty */ "./src/foundation/physics/PhysicsWorldProperty.ts"); /***/ }), /***/ "./src/foundation/renderer/CGAPIResourceRepository.ts": /*!************************************************************!*\ !*** ./src/foundation/renderer/CGAPIResourceRepository.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CGAPIResourceRepository: () => (/* binding */ CGAPIResourceRepository) /* harmony export */ }); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); class CGAPIResourceRepository { static getCgApiResourceRepository() { const moduleName = _definitions__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.isWebGL2Approach(_system_SystemState__WEBPACK_IMPORTED_MODULE_1__.SystemState.currentProcessApproach) ? 'webgl' : 'webgpu'; // const moduleName = 'webgl'; const moduleManager = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_0__.ModuleManager.getInstance(); const cgApiModule = moduleManager.getModule(moduleName); if (moduleName === 'webgl') { const webGLResourceRepository = cgApiModule.WebGLResourceRepository.getInstance(); return webGLResourceRepository; } else { // WebGPU const webGLResourceRepository = cgApiModule === null || cgApiModule === void 0 ? void 0 : cgApiModule.WebGpuResourceRepository.getInstance(); return webGLResourceRepository; } } static getWebGLResourceRepository() { const moduleName = 'webgl'; const moduleManager = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_0__.ModuleManager.getInstance(); const webglModule = moduleManager.getModule(moduleName); const webGLResourceRepository = webglModule.WebGLResourceRepository.getInstance(); return webGLResourceRepository; } static getWebGpuResourceRepository() { const moduleName = 'webgpu'; const moduleManager = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_0__.ModuleManager.getInstance(); const webgpuModule = moduleManager.getModule(moduleName); const webGpuResourceRepository = webgpuModule.WebGpuResourceRepository.getInstance(); return webGpuResourceRepository; } } CGAPIResourceRepository.InvalidCGAPIResourceUid = -1; /***/ }), /***/ "./src/foundation/renderer/Expression.ts": /*!***********************************************!*\ !*** ./src/foundation/renderer/Expression.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Expression: () => (/* binding */ Expression) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /** * Expression specifies the order of render passes on rendering process. */ class Expression extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor() { super(); this.__renderPasses = []; } clone() { const exp = new Expression(); const renderPasses = []; for (const renderPass of this.__renderPasses) { renderPasses.push(renderPass.clone()); } exp.addRenderPasses(renderPasses); return exp; } /** * Add render passes to the end of this expression. */ addRenderPasses(renderPasses) { for (const renderPass of renderPasses) { this.__renderPasses.push(renderPass); } } /** * Clear render passes of this expression. */ clearRenderPasses() { this.__renderPasses.length = 0; } /** * Gets the list of render passes of this expression. */ get renderPasses() { return this.__renderPasses; } setViewport(viewport) { for (const renderPass of this.__renderPasses) { renderPass.setViewport(viewport); } } } /***/ }), /***/ "./src/foundation/renderer/Frame.ts": /*!******************************************!*\ !*** ./src/foundation/renderer/Frame.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Frame: () => (/* binding */ Frame) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /** * Frame manages expressions and input/output dependencies between them */ class Frame extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor() { super(); this.__expressions = []; this.__expressionsCache = []; this.__expressionQueries = []; } /** * Add render passes to the end of this expression. */ addExpression(expression, { inputRenderPasses, outputs, } = { inputRenderPasses: [], outputs: [], }) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(outputs)) { for (const output of outputs) { let renderPass = output.renderPass.instance; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(output.renderPass.instance)) { renderPass = output.renderPass.instance; } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(output.renderPass.index)) { renderPass = expression.renderPasses[output.renderPass.index]; } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(output.renderPass.uniqueName)) { renderPass = _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject.getRnObjectByName(output.renderPass.uniqueName); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(renderPass)) { renderPass.setFramebuffer(output.frameBuffer); } } } this.__expressions.push({ expression, inputRenderPasses: _misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(inputRenderPasses) ? inputRenderPasses : [], }); this.__expressionsCache.push(expression); } /** * Get ColorAttachment RenderBuffer from input render pass of the expression * @param inputFrom input Expression * @param {inputIndex: number, colorAttachmentIndex: number} input RenderPass Index and ColorAttachmen tIndex * @returns {Promise} */ getColorAttachmentFromInputOf(inputFrom, renderPassArg = { renderPass: { index: 0, }, colorAttachmentIndex: 0, framebufferType: Frame.FrameBuffer, }) { const promise = new Promise((resolve) => { function* generatorFunc() { const renderTargetTexture = (yield); resolve(renderTargetTexture); return renderTargetTexture; } const generator = generatorFunc(); // register the generator this.__expressionQueries.push([ inputFrom, renderPassArg.renderPass, renderPassArg.colorAttachmentIndex, generator, renderPassArg.framebufferType, ]); }); return promise; } /** * */ resolve() { for (const [exp, renderPassArg, colorAttachmentIndex, generator, frameBufferType] of this .__expressionQueries) { for (const expData of this.__expressions) { if (exp === expData.expression) { let renderPassObj = renderPassArg.instance; if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(renderPassArg.instance)) { renderPassObj = renderPassArg.instance; } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(renderPassArg.index)) { renderPassObj = expData.inputRenderPasses[renderPassArg.index]; } else if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(renderPassArg.uniqueName)) { renderPassObj = _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject.getRnObjectByName(renderPassArg.uniqueName); } let framebuffer; if (frameBufferType === 'ResolveFrameBuffer2') { framebuffer = renderPassObj.getResolveFramebuffer2(); } else if (frameBufferType === 'ResolveFrameBuffer') { framebuffer = renderPassObj.getResolveFramebuffer(); } else if (frameBufferType === 'FrameBuffer') { framebuffer = renderPassObj.getFramebuffer(); } if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(framebuffer)) { const renderTargetTexture = framebuffer.getColorAttachedRenderTargetTexture(colorAttachmentIndex); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(renderTargetTexture)) { generator.next(renderTargetTexture); generator.next(renderTargetTexture); } } } } } } /** * Clear render passes of this expression. */ clearExpressions() { this.__expressions.length = 0; this.__expressionsCache.length = 0; } /** * Get expressions */ get expressions() { return this.__expressionsCache; } setViewport(viewport) { for (const exp of this.__expressions) { exp.expression.setViewport(viewport); } } } Frame.FrameBuffer = 'FrameBuffer'; Frame.ResolveFrameBuffer = 'ResolveFrameBuffer'; Frame.ResolveFrameBuffer2 = 'ResolveFrameBuffer2'; /***/ }), /***/ "./src/foundation/renderer/FrameBuffer.ts": /*!************************************************!*\ !*** ./src/foundation/renderer/FrameBuffer.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ FrameBuffer: () => (/* binding */ FrameBuffer) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _definitions_RenderBufferTarget__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/RenderBufferTarget */ "./src/foundation/definitions/RenderBufferTarget.ts"); /* harmony import */ var _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../textures/RenderTargetTexture */ "./src/foundation/textures/RenderTargetTexture.ts"); class FrameBuffer extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor() { super(); this.__colorAttachments = []; this.cgApiResourceUid = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.width = 0; this.height = 0; this.__colorAttachmentMap = new Map(); } get colorAttachmentsRenderBufferTargets() { return Array.from(this.__colorAttachmentMap.keys()); } get colorAttachments() { return this.__colorAttachments; } get depthAttachment() { return this.__depthAttachment; } get stencilAttachment() { return this.__stencilAttachment; } get depthStencilAttachment() { return this.__depthStencilAttachment; } getColorAttachedRenderTargetTexture(index) { if (this.__colorAttachments[index] == null || !(this.__colorAttachments[index] instanceof _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_3__.RenderTargetTexture)) { return undefined; } else { return this.__colorAttachments[index]; } } getDepthAttachedRenderTargetTexture() { if (this.__depthAttachment instanceof _textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_3__.RenderTargetTexture) { return this.__depthAttachment; } else { return undefined; } } create(width, height) { this.width = width; this.height = height; const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); this.cgApiResourceUid = cgApiResourceRepository.createFrameBufferObject(); return this.cgApiResourceUid; } get framebufferUID() { return this.cgApiResourceUid; } setColorAttachmentAt(index, renderable) { if (renderable.width !== this.width || renderable.height !== this.height) { return false; } this.__colorAttachments[index] = renderable; const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.attachColorBufferToFrameBufferObject(this, index, renderable); this.__colorAttachmentMap.set(_definitions_RenderBufferTarget__WEBPACK_IMPORTED_MODULE_2__.RenderBufferTarget.from(index), renderable); return true; } setColorAttachmentCubeAt(attachmentIndex, faceIndex, mipLevel, renderable) { if (renderable.width !== this.width || renderable.height !== this.height) { return false; } this.__colorAttachments[attachmentIndex] = renderable; const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.attachColorBufferCubeToFrameBufferObject(this, attachmentIndex, faceIndex, mipLevel, renderable); renderable.createCubeTextureViewAsRenderTarget(faceIndex, mipLevel); this.__colorAttachmentMap.set(_definitions_RenderBufferTarget__WEBPACK_IMPORTED_MODULE_2__.RenderBufferTarget.from(attachmentIndex), renderable); return true; } setDepthAttachment(renderable) { if (renderable.width !== this.width || renderable.height !== this.height) { return false; } this.__depthAttachment = renderable; const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.attachDepthBufferToFrameBufferObject(this, renderable); return true; } setStencilAttachment(renderable) { if (renderable.width !== this.width || renderable.height !== this.height) { return false; } this.__stencilAttachment = renderable; const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.attachStencilBufferToFrameBufferObject(this, renderable); return true; } setDepthStencilAttachment(renderable) { if (renderable.width !== this.width || renderable.height !== this.height) { return false; } this.__depthStencilAttachment = renderable; const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.attachDepthStencilBufferToFrameBufferObject(this, renderable); return true; } resize(width, height) { // this.destroy3DAPIResources(); const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.deleteFrameBufferObject(this.cgApiResourceUid); this.cgApiResourceUid = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.width = 0; this.height = 0; this.create(width, height); if (this.depthAttachment) { this.depthAttachment.resize(width, height); this.setDepthAttachment(this.depthAttachment); } if (this.depthStencilAttachment) { this.depthStencilAttachment.resize(width, height); this.setDepthStencilAttachment(this.depthStencilAttachment); } if (this.stencilAttachment) { this.stencilAttachment.resize(width, height); this.setStencilAttachment(this.stencilAttachment); } for (let i = 0; i < this.colorAttachments.length; i++) { this.colorAttachments[i].resize(width, height); this.setColorAttachmentAt(i, this.colorAttachments[i]); } } destroy3DAPIResources() { const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.deleteFrameBufferObject(this.cgApiResourceUid); this.cgApiResourceUid = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.width = 0; this.height = 0; if (this.depthAttachment) { this.depthAttachment.destroy3DAPIResources(); this.__depthAttachment = undefined; } if (this.depthStencilAttachment) { this.depthStencilAttachment.destroy3DAPIResources(); this.__depthStencilAttachment = undefined; } if (this.stencilAttachment) { this.stencilAttachment.destroy3DAPIResources(); this.__stencilAttachment = undefined; } for (const colorAttachment of this.colorAttachments) { colorAttachment.destroy3DAPIResources(); } this.__colorAttachmentMap = new Map(); } whichColorAttachment(renderable) { return this.__colorAttachments.indexOf(renderable); } } /***/ }), /***/ "./src/foundation/renderer/RenderPass.ts": /*!***********************************************!*\ !*** ./src/foundation/renderer/RenderPass.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderPass: () => (/* binding */ RenderPass) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _webgl_WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../webgl/WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _math_MutableVector4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/MutableVector4 */ "./src/foundation/math/MutableVector4.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/PrimitiveMode */ "./src/foundation/definitions/PrimitiveMode.ts"); /* harmony import */ var _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _components_SceneGraph_SceneGraphOps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/SceneGraph/SceneGraphOps */ "./src/foundation/components/SceneGraph/SceneGraphOps.ts"); /** * A render pass is a collection of the resources which is used in rendering process. */ class RenderPass extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor() { super(); this.__entities = []; this.__sceneGraphDirectlyAdded = []; this.__topLevelSceneGraphComponents = []; this.__meshComponents = []; this.__optimizedMeshComponents = []; this.__primitiveMaterial = new Map(); // Public RenderPass Settings this.toClearColorBuffer = false; this.toClearDepthBuffer = true; this.toClearStencilBuffer = false; this.isDepthTest = true; /** * depth write mask for primitives drawing * false does not prevent depth clear. */ this.depthWriteMask = true; this.clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_1__.Vector4.fromCopyArray([1, 1, 1, 1]); this.clearDepth = 1; this.clearStencil = 0; /** * If this value is greater than 1, buffer-less rendering is performed with the specified number of vertices. * In this case, registered Entities are ignored and they are not rendered. */ this._drawVertexNumberForBufferLessRendering = 0; this._primitiveModeForBufferLessRendering = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_6__.PrimitiveMode.Triangles; this._dummyPrimitiveForBufferLessRendering = new _geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive(); // VR this.isVrRendering = true; this.isOutputForVr = false; // Internal use this._lastOpaqueIndex = -1; this._lastTranslucentIndex = -1; this._lastBlendIndex = -1; this._lastPrimitiveUids = []; this._lastTransformComponentsUpdateCount = -1; this._lastCameraControllerComponentsUpdateCount = -1; this._lastSceneGraphComponentsUpdateCount = -1; this._renderedSomethingBefore = true; this._isChangedSortRenderResult = false; /** Whether or not to draw opaque primitives contained in this render pass. */ this._toRenderOpaquePrimitives = true; /** Whether or not to draw transparent primitives contained in this render pass. */ this._toRenderTransparentPrimitives = true; this.toRenderEffekseerEffects = false; this.__renderPassUID = ++RenderPass.__mesh_uid_count; } setToRenderOpaquePrimitives(toRender) { this._toRenderOpaquePrimitives = toRender; this.__calcMeshComponents(); } setToRenderTransparentPrimitives(toRender) { this._toRenderTransparentPrimitives = toRender; this.__calcMeshComponents(); } isBufferLessRenderingMode() { return this._drawVertexNumberForBufferLessRendering > 0; } /** * @brief Set this render pass to buffer-less rendering mode. * When this function is called, buffer-less rendering is performed only once with the specified number of vertices. * This is useful for e.g. full-screen drawing. * In this case, even if Entities are registered using the addEntities method, they will be ignored and will not be rendered. * @param primitiveMode The primitive mode to be used in buffer-less rendering. * @param drawVertexNumberWithoutEntities The number of vertices to be rendered in buffer-less rendering. * @param material The material to be used in buffer-less rendering. */ setBufferLessRendering(primitiveMode, drawVertexNumberWithoutEntities, material) { this._primitiveModeForBufferLessRendering = primitiveMode; this._drawVertexNumberForBufferLessRendering = drawVertexNumberWithoutEntities; this.__material = material; } /** * @brief Set this render pass to buffer-less rendering mode. * When this function is called, buffer-less rendering is performed only once with the specified number of vertices. * This is useful for e.g. full-screen drawing. * In this case, even if Entities are registered using the addEntities method, they will be ignored and will not be rendered. * @param material The material to be used in buffer-less rendering. */ setBufferLessFullScreenRendering(material) { this._primitiveModeForBufferLessRendering = _definitions_PrimitiveMode__WEBPACK_IMPORTED_MODULE_6__.PrimitiveMode.Triangles; this._drawVertexNumberForBufferLessRendering = 3; this.__material = material; } clone() { var _a, _b; const renderPass = new RenderPass(); renderPass.__entities = this.__entities.concat(); renderPass.__sceneGraphDirectlyAdded = this.__sceneGraphDirectlyAdded.concat(); renderPass.__topLevelSceneGraphComponents = this.__topLevelSceneGraphComponents.concat(); renderPass.__meshComponents = this.__meshComponents.concat(); renderPass.__optimizedMeshComponents = this.__optimizedMeshComponents.concat(); renderPass.__frameBuffer = this.__frameBuffer; renderPass.__resolveFrameBuffer = this.__resolveFrameBuffer; renderPass.__resolveFrameBuffer2 = this.__resolveFrameBuffer2; renderPass.__viewport = (_a = this.__viewport) === null || _a === void 0 ? void 0 : _a.clone(); renderPass.toClearColorBuffer = this.toClearColorBuffer; renderPass.toClearDepthBuffer = this.toClearDepthBuffer; renderPass.toClearStencilBuffer = this.toClearStencilBuffer; renderPass.isDepthTest = this.isDepthTest; renderPass.clearColor = this.clearColor.clone(); renderPass.clearDepth = this.clearDepth; renderPass.clearStencil = this.clearStencil; renderPass.cameraComponent = this.cameraComponent; renderPass.__material = this.__material; renderPass.__primitiveMaterial = new Map(this.__primitiveMaterial); renderPass.isVrRendering = this.isVrRendering; renderPass.isOutputForVr = this.isOutputForVr; renderPass._toRenderOpaquePrimitives = this._toRenderOpaquePrimitives; renderPass._toRenderTransparentPrimitives = this._toRenderTransparentPrimitives; renderPass.__postEachRenderFunc = this.__postEachRenderFunc; renderPass.__renderTargetColorAttachments = (_b = this.__renderTargetColorAttachments) === null || _b === void 0 ? void 0 : _b.concat(); return renderPass; } setPostRenderFunction(func) { this.__postEachRenderFunc = func; } doPostRender() { if (this.__postEachRenderFunc != null) { this.__postEachRenderFunc(); } } /** * Add entities to draw. * @param entities An array of entities. */ addEntities(entities) { for (const entity of entities) { const sceneGraphComponent = entity.getSceneGraph(); this.__sceneGraphDirectlyAdded.push(sceneGraphComponent); const collectedSgComponents = (0,_components_SceneGraph_SceneGraphOps__WEBPACK_IMPORTED_MODULE_8__.flattenHierarchy)(sceneGraphComponent, false); const collectedEntities = collectedSgComponents.map((sg) => { return sg.entity; }); // Eliminate duplicates const map = this.__entities .concat(collectedEntities) .reduce((map, entity) => { map.set(entity.entityUID, entity); return map; }, new Map()); this.__entities = Array.from(map.values()); } this.__calcMeshComponents(); this.__topLevelSceneGraphComponents = []; this.__collectTopLevelSceneGraphComponents(); } __calcMeshComponents() { this.__meshComponents = []; this.__optimizedMeshComponents = []; this.__collectMeshComponents(); } /** * Gets the list of entities on this render pass. * @return An array of entities */ get entities() { return this.__entities; } /** * Clear entities on this render pass. */ clearEntities() { this.__meshComponents = []; this.__optimizedMeshComponents = []; this.__topLevelSceneGraphComponents = []; this.__entities = []; } __collectTopLevelSceneGraphComponents() { const goToTopLevel = (sg) => { if (sg.parent) { goToTopLevel(sg.parent); } return sg; }; this.__topLevelSceneGraphComponents = this.__sceneGraphDirectlyAdded.map((sg) => { return goToTopLevel(sg); }); const set = new Set(this.__topLevelSceneGraphComponents); this.__topLevelSceneGraphComponents = Array.from(set); } __collectMeshComponents() { this.__meshComponents = []; this.__optimizedMeshComponents = []; this.__entities.filter((entity) => { const meshComponent = entity.getComponentByComponentTID(_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_5__.WellKnownComponentTIDs.MeshComponentTID); if (meshComponent != null && meshComponent.mesh != null) { this.__meshComponents.push(meshComponent); if (!this._toRenderOpaquePrimitives && meshComponent.mesh.isAllOpaque()) { return; } if (!this._toRenderTransparentPrimitives && meshComponent.mesh.isAllTranslucent()) { return; } this.__optimizedMeshComponents.push(meshComponent); } }); } /** * Get all the MeshComponents list of the entities on this render pass. * @return An array of MeshComponents */ get meshComponents() { return this.__meshComponents; } /** * Get MeshComponents list to render * @return An array of MeshComponents */ get _optimizedMeshComponents() { return this.__optimizedMeshComponents; } /** * Get all the highest level SceneGraphComponents list of the entities on this render pass. * @return An array of SceneGraphComponents */ get sceneTopLevelGraphComponents() { return this.__topLevelSceneGraphComponents; } /** * Sets the target framebuffer of this render pass. * If two or more render pass share a framebuffer, Rhodonite renders entities to the same framebuffer in those render passes. * @param framebuffer A framebuffer */ setFramebuffer(framebuffer) { this.__frameBuffer = framebuffer; if (framebuffer != null) { this.setViewport(_math_Vector4__WEBPACK_IMPORTED_MODULE_1__.Vector4.fromCopyArray([0, 0, framebuffer.width, framebuffer.height])); } else { this.__viewport = undefined; } } setRenderTargetColorAttachments(indeces) { this.__renderTargetColorAttachments = indeces; } getRenderTargetColorAttachments() { return this.__renderTargetColorAttachments; } /** * Gets the framebuffer if this render pass has the target framebuffer. * @return A framebuffer */ getFramebuffer() { return this.__frameBuffer; } /** * Remove the existing framebuffer */ removeFramebuffer() { this.__frameBuffer = undefined; } /** * Sets the viewport of this render pass. * @param vec A Vector4 (Origin of coordinatesX, origin of coordinatesY, width, height). */ setViewport(vec) { if (this.__viewport != null) { this.__viewport.copyComponents(vec); } else { this.__viewport = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_4__.MutableVector4.fromCopyArray([vec.x, vec.y, vec.z, vec.w]); } } /** * Gets the viewport if this render pass has the viewport. * @return A Vector4 (Origin of coordinatesX, origin of coordinatesY, width, height). */ getViewport() { let viewport = this.__viewport; if (viewport != null) { viewport = RenderPass.__tmp_Vector4_0.copyComponents(viewport); } return viewport; } setResolveFramebuffer(framebuffer) { this.__resolveFrameBuffer = framebuffer; } getResolveFramebuffer() { return this.__resolveFrameBuffer; } setResolveFramebuffer2(framebuffer) { this.__resolveFrameBuffer2 = framebuffer; } getResolveFramebuffer2() { return this.__resolveFrameBuffer2; } _copyFramebufferToResolveFramebuffersWebGL() { this.__copyFramebufferToResolveFramebufferInner(this.__resolveFrameBuffer); this.__copyFramebufferToResolveFramebufferInner(this.__resolveFrameBuffer2); } __copyFramebufferToResolveFramebufferInner(resolveFrameBuffer) { if (resolveFrameBuffer == null) { return; } const repo = _webgl_WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__.WebGLResourceRepository.getInstance(); const webGLResourceFrameBuffer = repo.getWebGLResource(this.__frameBuffer.cgApiResourceUid); const webGLResourceResolveFramebuffer = repo.getWebGLResource(resolveFrameBuffer.cgApiResourceUid); if (webGLResourceFrameBuffer == null || webGLResourceResolveFramebuffer == null) { return; } const glw = repo.currentWebGLContextWrapper; const gl = glw.getRawContextAsWebGL2(); gl.bindFramebuffer(gl.READ_FRAMEBUFFER, webGLResourceFrameBuffer); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, webGLResourceResolveFramebuffer); gl.blitFramebuffer(0, 0, this.__frameBuffer.width, this.__frameBuffer.height, 0, 0, resolveFrameBuffer.width, resolveFrameBuffer.height, gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT, gl.NEAREST); gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); } _copyResolve1ToResolve2WebGpu() { if (this.__resolveFrameBuffer == null || this.__resolveFrameBuffer2 == null) { return; } const webGpuResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.getWebGpuResourceRepository(); for (let i = 0; i < this.__resolveFrameBuffer.colorAttachments.length; i++) { if (this.__resolveFrameBuffer.colorAttachments[i] == null || this.__resolveFrameBuffer2.colorAttachments[i] == null || this.__resolveFrameBuffer.colorAttachments[i]._textureResourceUid === -1 || this.__resolveFrameBuffer2.colorAttachments[i]._textureResourceUid === -1) { continue; } // if ( // webGpuResourceRepository.isMippmappedTexture( // this.__resolveFrameBuffer2.colorAttachments[i]._textureResourceUid // ) // ) { webGpuResourceRepository.copyTextureData(this.__resolveFrameBuffer.colorAttachments[i]._textureResourceUid, this.__resolveFrameBuffer2.colorAttachments[i]._textureResourceUid); // } else { // webGpuResourceRepository.deleteTexture( // this.__resolveFrameBuffer2.colorAttachments[i]._textureResourceUid // ); // [ // this.__resolveFrameBuffer2.colorAttachments[i]._textureResourceUid, // this.__resolveFrameBuffer2.colorAttachments[i]._textureViewResourceUid, // ] = webGpuResourceRepository.duplicateTextureAsMipmapped( // this.__resolveFrameBuffer.colorAttachments[i]._textureResourceUid // ); // } } } /** * Sets a material for the primitive on this render pass. * If Rhodonite draw the primitive using this render pass, Rhodonite uses this material instead of the material on the primitive. * @param material A material attaching to the primitive * @param primitive A target primitive */ setMaterialForPrimitive(material, primitive) { this.__primitiveMaterial.set(primitive.objectUID, new WeakRef(material)); // this.__setupMaterial(material, primitive);s } /** * Sets a material for all the primitive on this render pass. * For all the primitive, Rhodonite uses this material instead of the material on the primitive. * Where if this render pass has a map between primitive and material by setMaterialForPrimitive, Rhodonite uses the material mapped by primitive. * @param material A material attaching to the primitive */ setMaterial(material) { this.__material = material; // this.__setupMaterial(material); } get material() { return this.__material; } _getMaterialOf(primitive) { var _a; return (_a = this.__primitiveMaterial.get(primitive.objectUID)) === null || _a === void 0 ? void 0 : _a.deref(); } __hasMaterialOf(primitive) { return this.__primitiveMaterial.has(primitive.objectUID); } getAppropriateMaterial(primitive) { let material = this._getMaterialOf(primitive); if (material != null) { } else if (this.__material != null) { material = this.__material; } else { material = primitive.material; } return material; } get renderPassUID() { return this.__renderPassUID; } } RenderPass.__tmp_Vector4_0 = _math_MutableVector4__WEBPACK_IMPORTED_MODULE_4__.MutableVector4.zero(); RenderPass.__mesh_uid_count = -1; /***/ }), /***/ "./src/foundation/renderer/RenderingCommonMethods.ts": /*!***********************************************************!*\ !*** ./src/foundation/renderer/RenderingCommonMethods.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ isSkipDrawing: () => (/* binding */ isSkipDrawing), /* harmony export */ updateVBOAndVAO: () => (/* binding */ updateVBOAndVAO) /* harmony export */ }); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); function isSkipDrawing(material, primitive) { if (material.getShaderProgramUid(primitive) === -1) { return true; } else { return false; } } function updateVBOAndVAO(mesh) { const primitiveNum = mesh.getPrimitiveNumber(); for (let i = 0; i < primitiveNum; i++) { const primitive = mesh.getPrimitiveAt(i); if (_misc_Is__WEBPACK_IMPORTED_MODULE_1__.Is.exist(primitive.vertexHandles)) { primitive.update3DAPIVertexData(); } else { primitive.create3DAPIVertexData(); } } mesh.updateVariationVBO(); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_2__.SystemState.currentProcessApproach !== _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { mesh.updateVAO(); } } /***/ }), /***/ "./src/foundation/renderer/index.ts": /*!******************************************!*\ !*** ./src/foundation/renderer/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CGAPIResourceRepository: () => (/* reexport safe */ _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository), /* harmony export */ Expression: () => (/* reexport safe */ _Expression__WEBPACK_IMPORTED_MODULE_2__.Expression), /* harmony export */ ForwardRenderPipeline: () => (/* reexport safe */ _pipelines__WEBPACK_IMPORTED_MODULE_0__.ForwardRenderPipeline), /* harmony export */ Frame: () => (/* reexport safe */ _Frame__WEBPACK_IMPORTED_MODULE_3__.Frame), /* harmony export */ FrameBuffer: () => (/* reexport safe */ _FrameBuffer__WEBPACK_IMPORTED_MODULE_4__.FrameBuffer), /* harmony export */ RenderPass: () => (/* reexport safe */ _RenderPass__WEBPACK_IMPORTED_MODULE_5__.RenderPass), /* harmony export */ isSkipDrawing: () => (/* reexport safe */ _RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_6__.isSkipDrawing), /* harmony export */ updateVBOAndVAO: () => (/* reexport safe */ _RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_6__.updateVBOAndVAO) /* harmony export */ }); /* harmony import */ var _pipelines__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pipelines */ "./src/foundation/renderer/pipelines/index.ts"); /* harmony import */ var _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _Expression__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Expression */ "./src/foundation/renderer/Expression.ts"); /* harmony import */ var _Frame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Frame */ "./src/foundation/renderer/Frame.ts"); /* harmony import */ var _FrameBuffer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FrameBuffer */ "./src/foundation/renderer/FrameBuffer.ts"); /* harmony import */ var _RenderPass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./RenderingCommonMethods */ "./src/foundation/renderer/RenderingCommonMethods.ts"); /***/ }), /***/ "./src/foundation/renderer/pipelines/ForwardRenderPipeline.ts": /*!********************************************************************!*\ !*** ./src/foundation/renderer/pipelines/ForwardRenderPipeline.ts ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ForwardRenderPipeline: () => (/* binding */ ForwardRenderPipeline) /* harmony export */ }); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../helpers/RenderableHelper */ "./src/foundation/helpers/RenderableHelper.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _misc_Option__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/Option */ "./src/foundation/misc/Option.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _Expression__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Expression */ "./src/foundation/renderer/Expression.ts"); /* harmony import */ var _Frame__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Frame */ "./src/foundation/renderer/Frame.ts"); /* harmony import */ var _RenderPass__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../helpers/MaterialHelper */ "./src/foundation/helpers/MaterialHelper.ts"); /* harmony import */ var _misc_Result__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _system_System__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../system/System */ "./src/foundation/system/System.ts"); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../helpers */ "./src/foundation/helpers/index.ts"); /* harmony import */ var _textures_Sampler__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _system__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../system */ "./src/foundation/system/index.ts"); /* harmony import */ var _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /** * ForwardRenderPipeline is a one of render pipelines * * @remarks * A render pipeline is a class of complex multi-pass setups already built in, * which allows users to easily benefit from advanced expressions such as refraction and MSAA. * (like the URP (Universal Render Pipeline) in the Unity engine). * * @example * ``` * const expressions = ...; * const matrix = ...; * // Create a render pipeline * const forwardRenderPipeline = new Rn.ForwardRenderPipeline(); * // Set up the render pipeline * forwardRenderPipeline.setup(1024, 1024, {isShadow: true}); * // Set expressions before calling other setter methods * forwardRenderPipeline.setExpressions(expressions); * // Set IBLs * const diffuseCubeTexture = new Rn.CubeTexture(); * diffuseCubeTexture.baseUriToLoad = './../../../assets/ibl/papermill/diffuse/diffuse'; * diffuseCubeTexture.isNamePosNeg = true; * diffuseCubeTexture.hdriFormat = Rn.HdriFormat.RGBE_PNG; * diffuseCubeTexture.mipmapLevelNumber = 1; * const specularCubeTexture = new Rn.CubeTexture(); * specularCubeTexture.baseUriToLoad = './../../../assets/ibl/papermill/specular/specular'; * specularCubeTexture.isNamePosNeg = true; * specularCubeTexture.hdriFormat = Rn.HdriFormat.RGBE_PNG; * specularCubeTexture.mipmapLevelNumber = 10; * forwardRenderPipeline.setIBLTextures(diffuseCubeTexture, specularCubeTexture); * // Set BiasViewProjectionMatrix for Shadow * forwardRenderPipeline.setBiasViewProjectionMatrixForShadow(matrix); * // Start Render Loop * forwardRenderPipeline.startRenderLoop((frame) => { * Rn.System.process(frame); * }); * ``` */ class ForwardRenderPipeline extends _core_RnObject__WEBPACK_IMPORTED_MODULE_11__.RnObject { constructor() { super(); this.__width = 0; this.__height = 0; this.__isShadow = false; this.__isBloom = false; this.__isSimple = false; this.__shadowMapSize = 1024; this.__oFrame = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameDepthMoment = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMultiView = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMultiViewBlit = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMultiViewBlitBackBuffer = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMsaa = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferResolve = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferResolveForReference = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oInitialExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); /** main expressions */ this.__expressions = []; this.__oGenerateMipmapsExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oMultiViewBlitBackBufferExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oMultiViewBlitExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__depthMomentExpressions = []; this.__oBloomExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oToneMappingExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oToneMappingMaterial = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__transparentOnlyExpressions = []; this.__oWebXRSystem = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oDrawFunc = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oDiffuseCubeTexture = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oSpecularCubeTexture = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oSamplerForBackBuffer = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__toneMappingType = _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.GT_ToneMap; } __destroyResources() { if (this.__oFrameDepthMoment.has()) { this.__oFrameDepthMoment.get().destroy3DAPIResources(); this.__oFrameDepthMoment = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } if (this.__oFrameBufferMultiView.has()) { this.__oFrameBufferMultiView.get().destroy3DAPIResources(); this.__oFrameBufferMultiView = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } if (this.__oFrameBufferMultiViewBlit.has()) { this.__oFrameBufferMultiViewBlit.get().destroy3DAPIResources(); this.__oFrameBufferMultiViewBlit = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } if (this.__oFrameBufferMsaa.has()) { this.__oFrameBufferMsaa.get().destroy3DAPIResources(); this.__oFrameBufferMsaa = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } if (this.__oFrameBufferResolve.has()) { this.__oFrameBufferResolve.get().destroy3DAPIResources(); this.__oFrameBufferResolve = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } if (this.__oFrameBufferResolveForReference.has()) { this.__oFrameBufferResolveForReference.get().destroy3DAPIResources(); this.__oFrameBufferResolveForReference = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } this.__oFrame = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oGenerateMipmapsExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oMultiViewBlitExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oBloomExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oToneMappingExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } /** * Initializes the pipeline. * @param canvasWidth - The width of the canvas. * @param canvasHeight - The height of the canvas. */ async setup(canvasWidth, canvasHeight, { isShadow = false, isBloom = false, shadowMapSize = 1024, isSimple = false } = {}) { this.__width = canvasWidth; this.__height = canvasHeight; this.__isBloom = isBloom; this.__isShadow = isShadow; this.__isSimple = isSimple; this.__shadowMapSize = shadowMapSize; if (this.__oFrame.has()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'Already setup', error: undefined, }); } const sFrame = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(new _Frame__WEBPACK_IMPORTED_MODULE_6__.Frame()); this.__oFrame = sFrame; if (!this.__isSimple) { this.__oSamplerForBackBuffer = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(new _textures_Sampler__WEBPACK_IMPORTED_MODULE_15__.Sampler({ wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Repeat, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Repeat, minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.LinearMipmapLinear, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Linear, })); this.__oSamplerForBackBuffer.unwrapForce().create(); // create Frame Buffers this.__createRenderTargets(canvasWidth, canvasHeight); // depth moment FrameBuffer if (isShadow && !this.__isSimple) { this.__oFrameDepthMoment = this.__setupDepthMomentFramebuffer(shadowMapSize); } if (this.__oFrameBufferResolveForReference.has()) { // generate mipmaps for process KHR_materials_transmittance this.__oGenerateMipmapsExpression = this.__setupGenerateMipmapsExpression(this.__oFrameBufferResolveForReference.unwrapForce()); } if (this.__oFrameBufferMultiView.has()) { // Make Blit Expression if VR MultiView is enabled this.__oMultiViewBlitBackBufferExpression = this.__setupMultiViewBlitBackBufferExpression(this.__oFrameBufferMultiView.unwrapForce()); this.__oMultiViewBlitExpression = this.__setupMultiViewBlitExpression(this.__oFrameBufferMultiView.unwrapForce()); } let toneMappingTargetRenderTargetTexture = this.__getMainFrameBufferResolve().unwrapForce().getColorAttachedRenderTargetTexture(0); // Bloom Expression if (isBloom && !this.__isSimple) { const frameBufferToBloom = this.__getMainFrameBufferResolve(); const textureToBloom = frameBufferToBloom .unwrapForce() .getColorAttachedRenderTargetTexture(0); const { bloomExpression, bloomedRenderTarget } = _helpers__WEBPACK_IMPORTED_MODULE_14__.ExpressionHelper.createBloomExpression({ textureToBloom, parameters: {}, }); this.__oBloomExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(bloomExpression); toneMappingTargetRenderTargetTexture = bloomedRenderTarget; } // ToneMapping Expression const toneMappingExpression = this.__setupToneMappingExpression(toneMappingTargetRenderTargetTexture); this.__oToneMappingExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(toneMappingExpression); } // Initial Expression const initialExpression = this.__setupInitialExpression(this.__oFrameDepthMoment); this.__oInitialExpression = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(initialExpression); const rnXRModule = await _system_ModuleManager__WEBPACK_IMPORTED_MODULE_12__.ModuleManager.getInstance().getModule('xr'); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(rnXRModule)) { this.__oWebXRSystem = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(rnXRModule.WebXRSystem.getInstance()); } if (this.__expressions.length > 0) { this.setExpressions(this.__expressions); } return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } __getMainFrameBufferBackBuffer() { if (this.__oFrameBufferMultiView.has()) { return this.__oFrameBufferMultiViewBlitBackBuffer; } else { return this.__oFrameBufferResolveForReference; } } __getMainFrameBufferResolve() { if (this.__oFrameBufferMultiView.has()) { return this.__oFrameBufferMultiViewBlit; } else { return this.__oFrameBufferResolve; } } __getMainFrameBuffer() { if (this.__oFrameBufferMultiView.has()) { return this.__oFrameBufferMultiView; } else { return this.__oFrameBufferMsaa; } } /** * set Expressions for drawing * @param expressions - expressions to draw * @param options - option parameters */ setExpressions(expressions, options = { isTransmission: true, }) { // const expressionsOpaque = expressions.map((expression) => expression.clone()); const expressionsTranslucent = expressions.map((expression) => expression.clone()); this.__setExpressionsInner(expressions, { isTransmission: options.isTransmission, }); if (options.isTransmission) { this.__setTransparentExpressionsForTransmission(expressionsTranslucent); } if (_system__WEBPACK_IMPORTED_MODULE_16__.SystemState.currentProcessApproach !== _definitions__WEBPACK_IMPORTED_MODULE_13__.ProcessApproach.WebGPU) { if (this.__oFrameDepthMoment.has()) { this.__setDepthTextureToEntityMaterials(); } } } __setDepthTextureToEntityMaterials() { if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.false(this.__isShadow)) { return; } // copy expressions as depth moment expressions this.__depthMomentExpressions = []; for (const expression of this.__expressions) { this.__depthMomentExpressions.push(expression.clone()); } // create depth moment encode material const depthMomentMaterial = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_8__.MaterialHelper.createDepthMomentEncodeMaterial(); // setup depth moment expression for (const expression of this.__depthMomentExpressions) { for (const renderPass of expression.renderPasses) { // Draw opaque primitives to depth moment FrameBuffer renderPass.setFramebuffer(this.__oFrameDepthMoment.unwrapForce()); renderPass.setResolveFramebuffer(undefined); renderPass.setResolveFramebuffer2(undefined); renderPass.toClearColorBuffer = true; renderPass.toClearDepthBuffer = true; // No need to render transparent primitives to depth buffer. renderPass.setToRenderTransparentPrimitives(false); renderPass.setMaterial(depthMomentMaterial); } } // set depth moment texture to entity materials in main expressions const sampler = new _textures_Sampler__WEBPACK_IMPORTED_MODULE_15__.Sampler({ wrapS: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.ClampToEdge, wrapT: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.ClampToEdge, minFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Linear, magFilter: _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Linear, anisotropy: false, }); sampler.create(); for (const expression of this.__expressions) { for (const renderPass of expression.renderPasses) { const entities = renderPass.entities; for (const entity of entities) { const meshComponent = entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshComponent)) { const mesh = meshComponent.mesh; if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(mesh)) { const primitives = mesh.primitives; for (const primitive of primitives) { const material = primitive.material; material.setTextureParameter('depthTexture', this.__oFrameDepthMoment.unwrapForce().getColorAttachedRenderTargetTexture(0), sampler); } } } } } } // this.__setDepthMomentRenderPassesAndDepthTextureToEntityMaterials(); } /** * Start rendering loop * @param func - function to be called when the frame is rendered * @returns RnResult */ startRenderLoop(func) { if (this.__oFrame.doesNotHave()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'not initialized.', error: undefined, }); } this.__oDrawFunc = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(func); _system_System__WEBPACK_IMPORTED_MODULE_10__.System.startRenderLoop(() => { this.__setExpressions(); func(this.__oFrame.unwrapForce()); }); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } /** * draw with the given function in startRenderLoop method */ draw() { this.__oDrawFunc.unwrapForce()(this.__oFrame.unwrapForce()); } /** * Resize screen * @param width - width of the screen * @param height - height of the screen * @returns RnResult */ resize(width, height) { if (this.__oFrame.doesNotHave()) { return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Err({ message: 'not initialized.', error: undefined, }); } const webXRSystem = this.__oWebXRSystem.unwrapOrUndefined(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(webXRSystem) && webXRSystem.isWebXRMode) { width = webXRSystem.getCanvasWidthForVr(); height = webXRSystem.getCanvasHeightForVr(); } _system_System__WEBPACK_IMPORTED_MODULE_10__.System.resizeCanvas(width, height); this.__destroyResources(); this.setup(width, height, { isShadow: this.__isShadow, isBloom: this.__isBloom, shadowMapSize: this.__shadowMapSize, isSimple: this.__isSimple, }); return new _misc_Result__WEBPACK_IMPORTED_MODULE_9__.Ok(); } /** * set IBL cube textures * @param diffuse - diffuse IBL Cube Texture * @param specular - specular IBL Cube Texture */ async setIBLTextures(diffuse, specular) { this.__oDiffuseCubeTexture = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(diffuse); this.__oSpecularCubeTexture = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(specular); await this.__setIblInner(); await this.__setIblInnerForTransparentOnly(); } /** * getter of initial expression */ getInitialExpression() { return this.__oInitialExpression.unwrapOrUndefined(); } /** * getter of ToneMapping expression */ getToneMappingExpression() { return this.__oToneMappingExpression.unwrapOrUndefined(); } /** * set diffuse IBL contribution * @param value - 0.0 ~ 1.0 or greater */ setDiffuseIBLContribution(value) { for (const expression of this.__expressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { meshRendererComponent.diffuseCubeMapContribution = value; } } } } for (const expression of this.__transparentOnlyExpressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { meshRendererComponent.diffuseCubeMapContribution = value; } } } } } /** * set specular IBL contribution * @param value - 0.0 ~ 1.0 or greater */ setSpecularIBLContribution(value) { for (const expression of this.__expressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { meshRendererComponent.specularCubeMapContribution = value; } } } } for (const expression of this.__transparentOnlyExpressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { meshRendererComponent.specularCubeMapContribution = value; } } } } } /** * set the rotation of IBL * @param radian - rotation in radian */ setIBLRotation(radian) { for (const expression of this.__expressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { meshRendererComponent.rotationOfCubeMap = radian; } } } } } setCameraComponentOfLight(cameraComponent) { if (this.__isShadow) { for (const expression of this.__depthMomentExpressions) { for (const renderPass of expression.renderPasses) { renderPass.cameraComponent = cameraComponent; } } for (const expression of this.__expressions) { for (const renderPass of expression.renderPasses) { // eslint-disable-next-line prefer-arrow-callback renderPass.setPostRenderFunction(function () { const entities = renderPass.entities; for (const entity of entities) { const meshComponent = entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshComponent)) { const mesh = meshComponent.mesh; if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(mesh)) { const primitives = mesh.primitives; for (const primitive of primitives) { const material = primitive.material; material.setParameter('depthBiasPV', cameraComponent.biasViewProjectionMatrix); } } } } }); } } } } async __setExpressionsInner(expressions, options = { isTransmission: true, }) { for (const expression of expressions) { for (const rp of expression.renderPasses) { rp.setToRenderOpaquePrimitives(true); if (options.isTransmission) { // if options.isTransmission is true, set toRenderTransparentPrimitives to false, // because transparent primitives are rendered in later expression. rp.setToRenderTransparentPrimitives(false); } else { // if options.isTransmission is false, set toRenderTransparentPrimitives to true. // because transparent primitives are rendered in this expression as well as opaque primitives. rp.setToRenderTransparentPrimitives(true); } // clearing depth is done in initial expression. so no need to clear depth in this render pass. rp.toClearDepthBuffer = false; if (!this.__isSimple) { const mainFrameBuffer = this.__getMainFrameBuffer(); if (mainFrameBuffer.has()) { rp.setFramebuffer(mainFrameBuffer.get()); if (this.__oFrameBufferMsaa.has()) { rp.setResolveFramebuffer(this.__oFrameBufferResolve.unwrapForce()); rp.setResolveFramebuffer2(this.__oFrameBufferResolveForReference.unwrapForce()); } } } } } this.__expressions = expressions; await this.__setIblInner(); } __setTransparentExpressionsForTransmission(expressions) { for (const expression of expressions) { expression.tryToSetUniqueName('modelTransparentForTransmission', true); for (const rp of expression.renderPasses) { rp.setToRenderOpaquePrimitives(false); // not to render opaque primitives in transmission expression. rp.setToRenderTransparentPrimitives(true); rp.toClearDepthBuffer = false; // rp.isDepthTest = false; // rp.depthWriteMask = false; if (!this.__isSimple) { rp.setFramebuffer(this.__getMainFrameBuffer().unwrapForce()); if (this.__oFrameBufferResolve.has()) { rp.setResolveFramebuffer(this.__oFrameBufferResolve.unwrapForce()); } for (const entity of rp.entities) { const meshComponent = entity.tryToGetMesh(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshComponent)) { const mesh = meshComponent.mesh; if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(mesh)) { for (let i = 0; i < mesh.getPrimitiveNumber(); i++) { const primitive = mesh.getPrimitiveAt(i); primitive.material.setTextureParameter('backBufferTexture', this.__getMainFrameBufferBackBuffer() .unwrapForce() .getColorAttachedRenderTargetTexture(0), this.__oSamplerForBackBuffer.unwrapForce()); } } } } } } } this.__transparentOnlyExpressions = expressions; this.__setIblInnerForTransparentOnly(); } __setupInitialExpression(oFrameDepthMoment) { const expression = new _Expression__WEBPACK_IMPORTED_MODULE_5__.Expression(); expression.tryToSetUniqueName('Initial', true); // render pass to clear buffers of render texture const initialRenderPass = new _RenderPass__WEBPACK_IMPORTED_MODULE_7__.RenderPass(); initialRenderPass.clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray4([0.0, 0.0, 0.0, 0.0]); initialRenderPass.toClearColorBuffer = true; initialRenderPass.toClearDepthBuffer = true; initialRenderPass.tryToSetUniqueName('InitialRenderPass', true); expression.addRenderPasses([initialRenderPass]); // render pass to clear buffers of framebuffer if (!this.__isSimple) { const initialRenderPassForFrameBuffer = new _RenderPass__WEBPACK_IMPORTED_MODULE_7__.RenderPass(); initialRenderPassForFrameBuffer.clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray4([0.0, 0.0, 0.0, 0.0]); initialRenderPassForFrameBuffer.toClearColorBuffer = true; initialRenderPassForFrameBuffer.toClearDepthBuffer = true; initialRenderPassForFrameBuffer.setFramebuffer(this.__getMainFrameBuffer().unwrapForce()); initialRenderPassForFrameBuffer.tryToSetUniqueName('InitialRenderPassForFrameBuffer', true); expression.addRenderPasses([initialRenderPassForFrameBuffer]); } if (oFrameDepthMoment.has()) { const frameDepthMoment = oFrameDepthMoment.get(); const initialRenderPassForDepthMoment = new _RenderPass__WEBPACK_IMPORTED_MODULE_7__.RenderPass(); initialRenderPassForDepthMoment.clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray4([1.0, 1.0, 1.0, 1.0]); initialRenderPassForDepthMoment.toClearColorBuffer = true; initialRenderPassForDepthMoment.toClearDepthBuffer = true; initialRenderPassForDepthMoment.setFramebuffer(frameDepthMoment); initialRenderPassForDepthMoment.tryToSetUniqueName('InitialRenderPassForDepthMoment', true); expression.addRenderPasses([initialRenderPassForDepthMoment]); } return expression; } __createRenderTargets(canvasWidth, canvasHeight) { const rnXRModule = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_12__.ModuleManager.getInstance().getModule('xr'); const webXRSystem = rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebXRSystem.getInstance(); const cgApiResourceRepository = _CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_17__.CGAPIResourceRepository.getCgApiResourceRepository(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(webXRSystem) && webXRSystem.isWebXRMode && cgApiResourceRepository.isSupportMultiViewVRRendering()) { const framebufferMultiView = _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBufferTextureArray({ width: canvasWidth / 2, height: canvasHeight, arrayLength: 2, level: 0, internalFormat: this.__isBloom ? _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.R11F_G11F_B10F : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RGBA8, format: this.__isBloom ? _definitions__WEBPACK_IMPORTED_MODULE_13__.PixelFormat.RGB : _definitions__WEBPACK_IMPORTED_MODULE_13__.PixelFormat.RGBA, type: this.__isBloom ? _definitions__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Float : _definitions__WEBPACK_IMPORTED_MODULE_13__.ComponentType.UnsignedByte, }); framebufferMultiView.tryToSetUniqueName('FramebufferTargetOfToneMappingMultiView', true); const framebufferMultiViewBlit = _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBuffer({ width: canvasWidth, height: canvasHeight, textureNum: 1, textureFormats: [this.__isBloom ? _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.R11F_G11F_B10F : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RGBA8], createDepthBuffer: false, }); framebufferMultiViewBlit.tryToSetUniqueName('FramebufferTargetOfToneMappingMultiViewBlit', true); const framebufferMultiViewBlitBackBuffer = _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBuffer({ width: canvasWidth, height: canvasHeight, textureNum: 1, textureFormats: [this.__isBloom ? _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.R11F_G11F_B10F : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RGBA8], createDepthBuffer: false, }); framebufferMultiViewBlit.tryToSetUniqueName('FramebufferTargetOfToneMappingMultiViewBlitBackBuffer', true); this.__oFrameBufferMultiView = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(framebufferMultiView); this.__oFrameBufferMultiViewBlit = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(framebufferMultiViewBlit); this.__oFrameBufferMultiViewBlitBackBuffer = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(framebufferMultiViewBlitBackBuffer); this.__oFrameBufferMsaa = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferResolve = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferResolveForReference = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); } else { // MSAA depth const framebufferMsaa = _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBufferMSAA({ width: canvasWidth, height: canvasHeight, colorBufferNum: 1, colorFormats: [this.__isBloom ? _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.R11F_G11F_B10F : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RGBA8], sampleCountMSAA: 4, depthBufferFormat: _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.Depth32F, }); framebufferMsaa.tryToSetUniqueName('FramebufferTargetOfToneMappingMsaa', true); // Resolve Color 1 const framebufferResolve = _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBuffer({ width: canvasWidth, height: canvasHeight, textureNum: 1, textureFormats: [this.__isBloom ? _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.R11F_G11F_B10F : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RGBA8], createDepthBuffer: true, depthTextureFormat: _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.Depth32F, }); framebufferResolve.tryToSetUniqueName('FramebufferTargetOfToneMappingResolve', true); // Resolve Color 2 const framebufferResolveForReference = _helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBuffer({ width: canvasWidth, height: canvasHeight, textureNum: 1, textureFormats: [this.__isBloom ? _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.R11F_G11F_B10F : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RGBA8], createDepthBuffer: false, }); framebufferResolveForReference.tryToSetUniqueName('FramebufferTargetOfToneMappingResolveForReference', true); // FrameBuffers this.__oFrameBufferMultiView = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMultiViewBlit = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMultiViewBlitBackBuffer = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.None(); this.__oFrameBufferMsaa = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(framebufferMsaa); this.__oFrameBufferResolve = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(framebufferResolve); this.__oFrameBufferResolveForReference = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(framebufferResolveForReference); } } __setupGenerateMipmapsExpression(resolveFramebuffer2) { const expression = new _Expression__WEBPACK_IMPORTED_MODULE_5__.Expression(); expression.tryToSetUniqueName('GenerateMipmaps', true); const renderPass = new _RenderPass__WEBPACK_IMPORTED_MODULE_7__.RenderPass(); expression.addRenderPasses([renderPass]); renderPass.tryToSetUniqueName('GenerateMipmaps', true); renderPass.toClearDepthBuffer = false; // Generate Mipmap of resolve Framebuffer 2 renderPass.setPostRenderFunction(function () { const renderTargetTexture = resolveFramebuffer2.getColorAttachedRenderTargetTexture(0); renderTargetTexture.generateMipmaps(); }); return new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(expression); } __setupMultiViewBlitBackBufferExpression(multiViewFrameBuffer) { const expression = new _Expression__WEBPACK_IMPORTED_MODULE_5__.Expression(); expression.tryToSetUniqueName('MultiViewBlitBackBuffer', true); const renderPass = new _RenderPass__WEBPACK_IMPORTED_MODULE_7__.RenderPass(); expression.addRenderPasses([renderPass]); renderPass.tryToSetUniqueName('MultiViewBlitBackBuffer', true); renderPass.toClearDepthBuffer = false; // Generate Mipmap of resolve Framebuffer 2 renderPass.setPostRenderFunction(() => { if (this.__oFrameBufferMultiViewBlitBackBuffer.has()) { const texture = this.__oFrameBufferMultiViewBlitBackBuffer.unwrapForce() .colorAttachments[0]; multiViewFrameBuffer.colorAttachments[0].blitToTexture2dFromTexture2dArrayFake(texture); texture.generateMipmaps(); } }); return new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(expression); } __setupMultiViewBlitExpression(multiViewFrameBuffer) { const expression = new _Expression__WEBPACK_IMPORTED_MODULE_5__.Expression(); expression.tryToSetUniqueName('MultiViewBlit', true); const renderPass = new _RenderPass__WEBPACK_IMPORTED_MODULE_7__.RenderPass(); expression.addRenderPasses([renderPass]); renderPass.tryToSetUniqueName('MultiViewBlit', true); renderPass.toClearDepthBuffer = false; // Generate Mipmap of resolve Framebuffer 2 renderPass.setPostRenderFunction(() => { if (this.__oFrameBufferMultiViewBlit.has()) { const texture = this.__oFrameBufferMultiViewBlit.unwrapForce() .colorAttachments[0]; multiViewFrameBuffer.colorAttachments[0].blitToTexture2dFromTexture2dArrayFake(texture); } }); return new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(expression); } __setupToneMappingExpression(toneMappingTargetRenderTargetTexture) { const expressionToneMappingEffect = new _Expression__WEBPACK_IMPORTED_MODULE_5__.Expression(); const materialToneMapping = _helpers_MaterialHelper__WEBPACK_IMPORTED_MODULE_8__.MaterialHelper.createToneMappingMaterial(); this.__oToneMappingMaterial = new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(materialToneMapping); this.setToneMappingType(this.__toneMappingType); // Rendering for Canvas Frame Buffer const renderPassToneMapping = _helpers__WEBPACK_IMPORTED_MODULE_14__.RenderPassHelper.createScreenDrawRenderPassWithBaseColorTexture(materialToneMapping, toneMappingTargetRenderTargetTexture); renderPassToneMapping.tryToSetUniqueName('renderPassToneMapping', true); renderPassToneMapping.toClearColorBuffer = false; renderPassToneMapping.toClearDepthBuffer = false; renderPassToneMapping.isDepthTest = false; renderPassToneMapping.clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray4([0.0, 0.0, 0.0, 0.0]); renderPassToneMapping.isVrRendering = false; renderPassToneMapping.isOutputForVr = false; // Rendering for VR HeadSet Frame Buffer const renderPassToneMappingVr = _helpers__WEBPACK_IMPORTED_MODULE_14__.RenderPassHelper.createScreenDrawRenderPassWithBaseColorTexture(materialToneMapping, toneMappingTargetRenderTargetTexture); renderPassToneMappingVr.tryToSetUniqueName('renderPassToneMappingVr', true); renderPassToneMappingVr.toClearColorBuffer = false; renderPassToneMappingVr.toClearDepthBuffer = false; renderPassToneMappingVr.isDepthTest = false; renderPassToneMappingVr.clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_2__.Vector4.fromCopyArray4([0.0, 0.0, 0.0, 0.0]); renderPassToneMappingVr.isVrRendering = false; renderPassToneMappingVr.isOutputForVr = true; expressionToneMappingEffect.addRenderPasses([renderPassToneMapping, renderPassToneMappingVr]); return expressionToneMappingEffect; } __setupDepthMomentFramebuffer(shadowMapSize) { return new _misc_Option__WEBPACK_IMPORTED_MODULE_3__.Some(_helpers_RenderableHelper__WEBPACK_IMPORTED_MODULE_1__.RenderableHelper.createFrameBuffer({ width: shadowMapSize, height: shadowMapSize, textureNum: 1, textureFormats: [_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.RG32F], createDepthBuffer: true, depthTextureFormat: _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_18__.TextureFormat.Depth32F, })); } async __setIblInner() { for (const expression of this.__expressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { await meshRendererComponent.setIBLCubeMap(this.__oDiffuseCubeTexture.unwrapOrUndefined(), this.__oSpecularCubeTexture.unwrapOrUndefined()); } } } } } async __setIblInnerForTransparentOnly() { for (const expression of this.__transparentOnlyExpressions) { for (const renderPass of expression.renderPasses) { for (const entity of renderPass.entities) { const meshRendererComponent = entity.tryToGetMeshRenderer(); if (_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.exist(meshRendererComponent)) { await meshRendererComponent.setIBLCubeMap(this.__oDiffuseCubeTexture.unwrapOrUndefined(), this.__oSpecularCubeTexture.unwrapOrUndefined()); } } } } } setToneMappingType(type) { if (!this.__oToneMappingMaterial.has()) { return; } this.__toneMappingType = type; this.__oToneMappingMaterial.get().removeShaderDefine('RN_USE_KHRONOS_PBR_NEUTRAL'); this.__oToneMappingMaterial.get().removeShaderDefine('RN_USE_REINHARD'); this.__oToneMappingMaterial.get().removeShaderDefine('RN_USE_GT_TONEMAP'); this.__oToneMappingMaterial.get().removeShaderDefine('RN_USE_ACES_NARKOWICZ'); this.__oToneMappingMaterial.get().removeShaderDefine('RN_USE_ACES_HILL'); this.__oToneMappingMaterial.get().removeShaderDefine('RN_USE_ACES_HILL_EXPOSURE_BOOST'); if (type === _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.KhronosPbrNeutral) { this.__oToneMappingMaterial.get().addShaderDefine('RN_USE_KHRONOS_PBR_NEUTRAL'); } else if (type === _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.Reinhard) { this.__oToneMappingMaterial.get().addShaderDefine('RN_USE_REINHARD'); } else if (type === _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.GT_ToneMap) { this.__oToneMappingMaterial.get().addShaderDefine('RN_USE_GT_TONEMAP'); } else if (type === _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.ACES_Narkowicz) { this.__oToneMappingMaterial.get().addShaderDefine('RN_USE_ACES_NARKOWICZ'); } else if (type === _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.ACES_Hill) { this.__oToneMappingMaterial.get().addShaderDefine('RN_USE_ACES_HILL'); } else if (type === _definitions__WEBPACK_IMPORTED_MODULE_13__.ToneMappingType.ACES_Hill_Exposure_Boost) { this.__oToneMappingMaterial.get().addShaderDefine('RN_USE_ACES_HILL_EXPOSURE_BOOST'); } } /** * setUp Frame * * @remarks * This method adds expressions to the frame. */ __setExpressions() { const frame = this.__oFrame.unwrapForce(); frame.clearExpressions(); frame.addExpression(this.getInitialExpression()); if (!this.__isSimple) { for (const exp of this.__depthMomentExpressions) { frame.addExpression(exp); } } for (const exp of this.__expressions) { frame.addExpression(exp); } if (!this.__isSimple && this.__oGenerateMipmapsExpression.has()) { frame.addExpression(this.__oGenerateMipmapsExpression.unwrapForce()); } if (!this.__isSimple && this.__oMultiViewBlitBackBufferExpression.has()) { frame.addExpression(this.__oMultiViewBlitBackBufferExpression.unwrapForce()); } for (const exp of this.__transparentOnlyExpressions) { frame.addExpression(exp); } if (!this.__isSimple && this.__oMultiViewBlitExpression.has()) { frame.addExpression(this.__oMultiViewBlitExpression.unwrapForce()); } if (!this.__isSimple && this.__isBloom) { frame.addExpression(this.__oBloomExpression.unwrapForce()); } if (!this.__isSimple && this.__oToneMappingExpression.has()) { frame.addExpression(this.getToneMappingExpression()); } } } /***/ }), /***/ "./src/foundation/renderer/pipelines/index.ts": /*!****************************************************!*\ !*** ./src/foundation/renderer/pipelines/index.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ForwardRenderPipeline: () => (/* reexport safe */ _ForwardRenderPipeline__WEBPACK_IMPORTED_MODULE_0__.ForwardRenderPipeline) /* harmony export */ }); /* harmony import */ var _ForwardRenderPipeline__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ForwardRenderPipeline */ "./src/foundation/renderer/pipelines/ForwardRenderPipeline.ts"); /***/ }), /***/ "./src/foundation/system/EventPubSub.ts": /*!**********************************************!*\ !*** ./src/foundation/system/EventPubSub.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EventPubSub: () => (/* binding */ EventPubSub) /* harmony export */ }); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); class EventPubSub { constructor() { this.__subscriberMap = new Map(); } subscribe(type, handler) { let subscribers = this.__subscriberMap.get(type); if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.not.exist(subscribers)) { this.__subscriberMap.set(type, []); subscribers = this.__subscriberMap.get(type); } return subscribers.push(handler) - 1; } unsubscribe(type, index) { const subscribers = this.__subscriberMap.get(type); // eslint-disable-next-line eqeqeq if (subscribers == null) { return; } subscribers.splice(index, 1); } unsubscribeAll(type) { this.__subscriberMap.delete(type); } publishAsync(type, event) { let count = 0; const subscribers = (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_1__.nullishToEmptyArray)(this.__subscriberMap.get(type)); for (const sub of subscribers) { setTimeout(sub.bind(this, event), 0); count++; } return count; } publishSync(type, event) { let count = 0; const subscribers = (0,_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_1__.nullishToEmptyArray)(this.__subscriberMap.get(type)); for (const sub of subscribers) { // Logger.log(sub); sub(event); count++; } return count; } } /***/ }), /***/ "./src/foundation/system/InputManager.ts": /*!***********************************************!*\ !*** ./src/foundation/system/InputManager.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EVENT_CLICK: () => (/* binding */ EVENT_CLICK), /* harmony export */ EVENT_KEY_DOWN: () => (/* binding */ EVENT_KEY_DOWN), /* harmony export */ EVENT_KEY_PRESS: () => (/* binding */ EVENT_KEY_PRESS), /* harmony export */ EVENT_KEY_UP: () => (/* binding */ EVENT_KEY_UP), /* harmony export */ EVENT_MOUSE_DOWN: () => (/* binding */ EVENT_MOUSE_DOWN), /* harmony export */ EVENT_MOUSE_ENTER: () => (/* binding */ EVENT_MOUSE_ENTER), /* harmony export */ EVENT_MOUSE_LEAVE: () => (/* binding */ EVENT_MOUSE_LEAVE), /* harmony export */ EVENT_MOUSE_MOVE: () => (/* binding */ EVENT_MOUSE_MOVE), /* harmony export */ EVENT_MOUSE_OVER: () => (/* binding */ EVENT_MOUSE_OVER), /* harmony export */ EVENT_MOUSE_UP: () => (/* binding */ EVENT_MOUSE_UP), /* harmony export */ EVENT_MOUSE_WHEEL: () => (/* binding */ EVENT_MOUSE_WHEEL), /* harmony export */ EVENT_MSPOINTER_DOWN: () => (/* binding */ EVENT_MSPOINTER_DOWN), /* harmony export */ EVENT_MSPOINTER_MOVE: () => (/* binding */ EVENT_MSPOINTER_MOVE), /* harmony export */ EVENT_MSPOINTER_UP: () => (/* binding */ EVENT_MSPOINTER_UP), /* harmony export */ EVENT_ORIENTATION_CHANGE: () => (/* binding */ EVENT_ORIENTATION_CHANGE), /* harmony export */ EVENT_POINTER_CANCEL: () => (/* binding */ EVENT_POINTER_CANCEL), /* harmony export */ EVENT_POINTER_DOWN: () => (/* binding */ EVENT_POINTER_DOWN), /* harmony export */ EVENT_POINTER_ENTER: () => (/* binding */ EVENT_POINTER_ENTER), /* harmony export */ EVENT_POINTER_LEAVE: () => (/* binding */ EVENT_POINTER_LEAVE), /* harmony export */ EVENT_POINTER_MOVE: () => (/* binding */ EVENT_POINTER_MOVE), /* harmony export */ EVENT_POINTER_OUT: () => (/* binding */ EVENT_POINTER_OUT), /* harmony export */ EVENT_POINTER_OVER: () => (/* binding */ EVENT_POINTER_OVER), /* harmony export */ EVENT_POINTER_UP: () => (/* binding */ EVENT_POINTER_UP), /* harmony export */ EVENT_RESIZE: () => (/* binding */ EVENT_RESIZE), /* harmony export */ EVENT_TOUCH_CANCEL: () => (/* binding */ EVENT_TOUCH_CANCEL), /* harmony export */ EVENT_TOUCH_DOUBLE_TAP: () => (/* binding */ EVENT_TOUCH_DOUBLE_TAP), /* harmony export */ EVENT_TOUCH_DRAG: () => (/* binding */ EVENT_TOUCH_DRAG), /* harmony export */ EVENT_TOUCH_END: () => (/* binding */ EVENT_TOUCH_END), /* harmony export */ EVENT_TOUCH_ENTER: () => (/* binding */ EVENT_TOUCH_ENTER), /* harmony export */ EVENT_TOUCH_HOLD: () => (/* binding */ EVENT_TOUCH_HOLD), /* harmony export */ EVENT_TOUCH_LEAVE: () => (/* binding */ EVENT_TOUCH_LEAVE), /* harmony export */ EVENT_TOUCH_LONG_TAP: () => (/* binding */ EVENT_TOUCH_LONG_TAP), /* harmony export */ EVENT_TOUCH_MOVE: () => (/* binding */ EVENT_TOUCH_MOVE), /* harmony export */ EVENT_TOUCH_OUT: () => (/* binding */ EVENT_TOUCH_OUT), /* harmony export */ EVENT_TOUCH_OVER: () => (/* binding */ EVENT_TOUCH_OVER), /* harmony export */ EVENT_TOUCH_PINCH: () => (/* binding */ EVENT_TOUCH_PINCH), /* harmony export */ EVENT_TOUCH_START: () => (/* binding */ EVENT_TOUCH_START), /* harmony export */ EVENT_TOUCH_SWIPE: () => (/* binding */ EVENT_TOUCH_SWIPE), /* harmony export */ EVENT_TOUCH_TAP: () => (/* binding */ EVENT_TOUCH_TAP), /* harmony export */ INPUT_HANDLING_STATE_CAMERA_CONTROLLER: () => (/* binding */ INPUT_HANDLING_STATE_CAMERA_CONTROLLER), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_SCALE: () => (/* binding */ INPUT_HANDLING_STATE_GIZMO_SCALE), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_TRANSLATION: () => (/* binding */ INPUT_HANDLING_STATE_GIZMO_TRANSLATION), /* harmony export */ INPUT_HANDLING_STATE_NONE: () => (/* binding */ INPUT_HANDLING_STATE_NONE), /* harmony export */ InputManager: () => (/* binding */ InputManager), /* harmony export */ getEvent: () => (/* binding */ getEvent) /* harmony export */ }); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); const EVENT_MOUSE_DOWN = 'mousedown'; const EVENT_MOUSE_MOVE = 'mousemove'; const EVENT_MOUSE_UP = 'mouseup'; const EVENT_MOUSE_WHEEL = 'wheel'; const EVENT_MOUSE_ENTER = 'mouseenter'; const EVENT_MOUSE_LEAVE = 'mouseleave'; const EVENT_MOUSE_OVER = 'mouseover'; const EVENT_CLICK = 'click'; const EVENT_KEY_DOWN = 'keydown'; const EVENT_KEY_UP = 'keyup'; const EVENT_KEY_PRESS = 'keypress'; const EVENT_POINTER_DOWN = 'pointerdown'; const EVENT_MSPOINTER_DOWN = 'MSPointerDown'; const EVENT_POINTER_MOVE = 'pointermove'; const EVENT_MSPOINTER_MOVE = 'MSPointerMove'; const EVENT_POINTER_UP = 'pointerup'; const EVENT_MSPOINTER_UP = 'MSPointerUp'; const EVENT_POINTER_CANCEL = 'pointercancel'; const EVENT_POINTER_ENTER = 'pointerenter'; const EVENT_POINTER_LEAVE = 'pointerleave'; const EVENT_POINTER_OVER = 'pointerover'; const EVENT_POINTER_OUT = 'pointerout'; const EVENT_RESIZE = 'resize'; const EVENT_ORIENTATION_CHANGE = 'orientationchange'; const EVENT_TOUCH_TAP = 'tap'; const EVENT_TOUCH_DOUBLE_TAP = 'doubletap'; const EVENT_TOUCH_LONG_TAP = 'longtap'; const EVENT_TOUCH_HOLD = 'hold'; const EVENT_TOUCH_DRAG = 'drag'; const EVENT_TOUCH_SWIPE = 'swipe'; const EVENT_TOUCH_PINCH = 'pinch'; const EVENT_TOUCH_START = 'touchstart'; const EVENT_TOUCH_MOVE = 'touchmove'; const EVENT_TOUCH_END = 'touchend'; const EVENT_TOUCH_CANCEL = 'touchcancel'; const EVENT_TOUCH_ENTER = 'touchenter'; const EVENT_TOUCH_LEAVE = 'touchleave'; const EVENT_TOUCH_OVER = 'touchover'; const EVENT_TOUCH_OUT = 'touchout'; function getEvent(type) { const deviceEvents = { Touch: typeof document.ontouchstart !== 'undefined', Pointer: window.navigator.pointerEnabled, MSPointer: window.navigator.msPointerEnabled, }; const EventNames = { start: deviceEvents.Pointer ? EVENT_POINTER_DOWN : deviceEvents.MSPointer ? EVENT_MSPOINTER_DOWN : deviceEvents.Touch ? EVENT_TOUCH_START : EVENT_MOUSE_DOWN, move: deviceEvents.Pointer ? EVENT_POINTER_MOVE : deviceEvents.MSPointer ? EVENT_MSPOINTER_MOVE : deviceEvents.Touch ? EVENT_TOUCH_MOVE : EVENT_MOUSE_MOVE, end: deviceEvents.Pointer ? EVENT_POINTER_UP : deviceEvents.MSPointer ? EVENT_MSPOINTER_UP : deviceEvents.Touch ? EVENT_TOUCH_END : EVENT_MOUSE_UP, click: EVENT_CLICK, }; return EventNames[type]; } const INPUT_HANDLING_STATE_NONE = 'None'; const INPUT_HANDLING_STATE_CAMERA_CONTROLLER = 'CameraController'; const INPUT_HANDLING_STATE_GIZMO_TRANSLATION = 'GizmoTranslation'; const INPUT_HANDLING_STATE_GIZMO_SCALE = 'GizmoScale'; class InputManager { static register(inputHandlingState, events) { // add event listeners this.__inputHandlingStateMap.set(inputHandlingState, events); this.__activeMap.set(inputHandlingState, true); this.__processEventListeners(); } static unregister(inputHandlingState) { this.__activeMap.set(inputHandlingState, false); this.__inputHandlingStateMap.delete(inputHandlingState); this.__processEventListeners(); } static setActive(inputHandlingState, active) { this.__activeMap.set(inputHandlingState, active); if (inputHandlingState === INPUT_HANDLING_STATE_GIZMO_TRANSLATION && active) { this.__activeMap.set(INPUT_HANDLING_STATE_GIZMO_SCALE, false); } else if (inputHandlingState === INPUT_HANDLING_STATE_GIZMO_SCALE && active) { this.__activeMap.set(INPUT_HANDLING_STATE_GIZMO_TRANSLATION, false); } this.__processEventListeners(); } static __addEventListeners(inputHandlingState) { const infos = InputManager.__inputHandlingStateMap.get(inputHandlingState); if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(infos)) { for (const inputHandlerInfo of infos) { inputHandlerInfo.eventTargetDom.addEventListener(inputHandlerInfo.eventName, inputHandlerInfo.handler, inputHandlerInfo.options); } } } static __removeEventListeners(inputHandlingState) { const infos = InputManager.__inputHandlingStateMap.get(inputHandlingState); if (_misc_Is__WEBPACK_IMPORTED_MODULE_0__.Is.exist(infos)) { for (const inputHandlerInfo of infos) { inputHandlerInfo.eventTargetDom.removeEventListener(inputHandlerInfo.eventName, inputHandlerInfo.handler, inputHandlerInfo.options); } } } static __processEventListeners() { const translationGizmoActive = InputManager.__inputHandlingStateMap.get(INPUT_HANDLING_STATE_GIZMO_TRANSLATION); const scaleGizmoActive = InputManager.__inputHandlingStateMap.get(INPUT_HANDLING_STATE_GIZMO_SCALE); const cameraControllerActive = InputManager.__inputHandlingStateMap.get(INPUT_HANDLING_STATE_CAMERA_CONTROLLER); if (cameraControllerActive) { this.__addEventListeners(INPUT_HANDLING_STATE_CAMERA_CONTROLLER); this.__currentState = INPUT_HANDLING_STATE_CAMERA_CONTROLLER; } // If translationGizmo enabled if (translationGizmoActive) { this.__addEventListeners(INPUT_HANDLING_STATE_GIZMO_TRANSLATION); // this.__removeEventListeners(INPUT_HANDLING_STATE_CAMERACONTROLLER); this.__removeEventListeners(INPUT_HANDLING_STATE_GIZMO_SCALE); this.__currentState = INPUT_HANDLING_STATE_GIZMO_TRANSLATION; } if (scaleGizmoActive) { this.__addEventListeners(INPUT_HANDLING_STATE_GIZMO_SCALE); // this.__removeEventListeners(INPUT_HANDLING_STATE_CAMERACONTROLLER); this.__removeEventListeners(INPUT_HANDLING_STATE_GIZMO_TRANSLATION); this.__currentState = INPUT_HANDLING_STATE_GIZMO_SCALE; } } static enableCameraController() { this.__addEventListeners(INPUT_HANDLING_STATE_CAMERA_CONTROLLER); this.__activeMap.set(INPUT_HANDLING_STATE_CAMERA_CONTROLLER, true); this.__processEventListeners(); } static disableCameraController() { this.__removeEventListeners(INPUT_HANDLING_STATE_CAMERA_CONTROLLER); this.__activeMap.set(INPUT_HANDLING_STATE_CAMERA_CONTROLLER, false); this.__processEventListeners(); } static getCurrentState() { return this.__currentState; } } InputManager.__inputHandlingStateMap = new Map(); /** * This active information is set externally and does not change state internally. * Using this externally set active information, this class will add and remove event listeners as appropriate. * As a result, event handling for the entire Rhodonite works properly. */ InputManager.__activeMap = new Map(); InputManager.__currentState = INPUT_HANDLING_STATE_NONE; /***/ }), /***/ "./src/foundation/system/ModuleManager.ts": /*!************************************************!*\ !*** ./src/foundation/system/ModuleManager.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ModuleManager: () => (/* binding */ ModuleManager) /* harmony export */ }); class ModuleManager { constructor() { this.__modules = new Map(); } /* eslint-disable prettier/prettier */ async loadModule(moduleName, options) { let module; if (moduleName.toLowerCase() === 'webgl') { module = await (await Promise.resolve(/*! import() | webgl */).then(__webpack_require__.bind(__webpack_require__, /*! ../../webgl/main */ "./src/webgl/main.ts"))).default; } else if (moduleName.toLowerCase() === 'webgpu') { module = await (await Promise.resolve(/*! import() | webgpu */).then(__webpack_require__.bind(__webpack_require__, /*! ../../webgpu/main */ "./src/webgpu/main.ts"))).default; } else if (moduleName.toLowerCase() === 'effekseer') { module = await (await Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../effekseer/main */ "./src/effekseer/main.ts"))).Effekseer; module.EffekseerComponent.wasmModuleUri = options === null || options === void 0 ? void 0 : options.wasm; } else if (moduleName.toLowerCase() === 'pbr') { module = await (await Promise.resolve(/*! import() | pbr */).then(__webpack_require__.bind(__webpack_require__, /*! ../../pbr/main */ "./src/pbr/main.ts"))).default; } else if (moduleName.toLowerCase() === 'xr') { module = await (await Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../xr/main */ "./src/xr/main.ts"))).default; } this.__modules.set(moduleName, module); // Logger.log('Module Loaded:', module); return module; } getModule(moduleName) { return this.__modules.get(moduleName); } static getInstance() { if (!this.__instance) { this.__instance = new ModuleManager(); } return this.__instance; } } /***/ }), /***/ "./src/foundation/system/System.ts": /*!*****************************************!*\ !*** ./src/foundation/system/System.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ System: () => (/* binding */ System) /* harmony export */ }); /* harmony import */ var _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/ProcessStage */ "./src/foundation/definitions/ProcessStage.ts"); /* harmony import */ var _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _ModuleManager__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _core_Component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _renderer_Expression__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../renderer/Expression */ "./src/foundation/renderer/Expression.ts"); /* harmony import */ var _core_EntityRepository__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _core_MemoryManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _math_Vector3__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _definitions_CameraType__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../definitions/CameraType */ "./src/foundation/definitions/CameraType.ts"); /* harmony import */ var _misc_Time__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../misc/Time */ "./src/foundation/misc/Time.ts"); /* harmony import */ var _SystemState__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _misc_MiscUtil__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _renderer_Frame__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../renderer/Frame */ "./src/foundation/renderer/Frame.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../renderer/RenderPass */ "./src/foundation/renderer/RenderPass.ts"); /* harmony import */ var _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../materials/core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _webgpu_WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../webgpu/WebGpuResourceRepository */ "./src/webgpu/WebGpuResourceRepository.ts"); /* harmony import */ var _webgpu_WebGpuStrategyBasic__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../webgpu/WebGpuStrategyBasic */ "./src/webgpu/WebGpuStrategyBasic.ts"); /* harmony import */ var _components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../components/Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../components/CameraController/CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /* harmony import */ var _components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../components/MeshRenderer/MeshRendererComponent */ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts"); /* harmony import */ var _components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../components/Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _geometry_Primitive__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../version */ "./src/version.ts"); /* harmony import */ var _components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../components/Camera/createCameraEntity */ "./src/foundation/components/Camera/createCameraEntity.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); /** * The system class is the entry point of the Rhodonite library. * * @example * ``` * await Rn.System.init({ * approach: Rn.ProcessApproach.DataTexture, * canvas: document.getElementById('world') as HTMLCanvasElement, * }); * * ... (create something) ... * * Rn.System.startRenderLoop((time, _myArg1, _myArg2) => { * Rn.System.process([expression]); * }, myArg1, myArg2); * ``` */ class System { constructor() { } /** * Starts a render loop. * * @example * ``` * Rn.System.startRenderLoop((time, _myArg1, _myArg2) => { * Rn.System.process([expression]); * }, myArg1, myArg2); * ``` * * @param renderLoopFunc - function to be called in each frame * @param args - arguments you want to be passed to renderLoopFunc */ static startRenderLoop(renderLoopFunc, ...args) { this.__renderLoopFunc = renderLoopFunc; this.__args = args; const animationFrameObject = this.__getAnimationFrameObject(); if (this.__rnXRModule === undefined) { this.__rnXRModule = _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().getModule('xr'); } this.__animationFrameId = animationFrameObject.requestAnimationFrame(((_time, xrFrame) => { if (this.__rnXRModule !== undefined) { const webXRSystem = this.__rnXRModule.WebXRSystem.getInstance(); const webARSystem = this.__rnXRModule.WebARSystem.getInstance(); if (webXRSystem.isReadyForWebXR) { webXRSystem._preRender(_time, xrFrame); renderLoopFunc.apply(renderLoopFunc, [_time, ...args]); webXRSystem._postRender(); } else if (webARSystem.isReadyForWebAR) { webARSystem._preRender(_time, xrFrame); renderLoopFunc.apply(renderLoopFunc, [_time, ...args]); webARSystem._preRender(_time, xrFrame); } else { renderLoopFunc.apply(renderLoopFunc, [_time, ...args]); } } else { renderLoopFunc.apply(renderLoopFunc, [_time, ...args]); } this.startRenderLoop(renderLoopFunc, ...args); })); } static __getAnimationFrameObject() { let animationFrameObject = window; const rnXRModule = _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().getModule('xr'); if (_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(rnXRModule)) { const webXRSystem = rnXRModule.WebXRSystem.getInstance(); const webARSystem = rnXRModule.WebARSystem.getInstance(); if (webXRSystem.requestedToEnterWebXR) { animationFrameObject = webXRSystem.xrSession; } else if (webARSystem.requestedToEnterWebAR) { animationFrameObject = webARSystem.arSession; } if (_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(animationFrameObject)) { return window; } } return animationFrameObject; } /** * Stops a existing render loop. */ static stopRenderLoop() { const animationFrameObject = this.__getAnimationFrameObject(); animationFrameObject.cancelAnimationFrame(this.__animationFrameId); this.__animationFrameId = -1; } /** * Restart a render loop. */ static restartRenderLoop() { if (this.__renderLoopFunc != null) { this.startRenderLoop(this.__renderLoopFunc, 0, this.__args); } } /** * A Simple version of process method * * @remarks * No need to create expressions and renderPasses and to register entities, etc... * It's suitable for simple use cases like sample apps. * * @param clearColor - color to clear the canvas */ static processAuto(clearColor = _math_Vector4__WEBPACK_IMPORTED_MODULE_18__.Vector4.fromCopy4(0, 0, 0, 1)) { if (_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(System.__expressionForProcessAuto)) { const expression = new _renderer_Expression__WEBPACK_IMPORTED_MODULE_6__.Expression(); const renderPassInit = new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_19__.RenderPass(); renderPassInit.toClearColorBuffer = true; renderPassInit.toClearDepthBuffer = true; renderPassInit.clearColor = clearColor; const renderPassMain = new _renderer_RenderPass__WEBPACK_IMPORTED_MODULE_19__.RenderPass(); expression.addRenderPasses([renderPassInit, renderPassMain]); System.__expressionForProcessAuto = expression; System.__renderPassForProcessAuto = renderPassMain; } System.__renderPassForProcessAuto.clearEntities(); const entities = _core_EntityRepository__WEBPACK_IMPORTED_MODULE_7__.EntityRepository._getEntities(); System.__renderPassForProcessAuto.addEntities(entities); this.process([System.__expressionForProcessAuto]); } static process(value) { _misc_Time__WEBPACK_IMPORTED_MODULE_12__.Time._processBegin(); let expressions = value; if (value instanceof _renderer_Frame__WEBPACK_IMPORTED_MODULE_17__.Frame) { expressions = value.expressions; } if (_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_24__.CameraComponent.current === _core_Component__WEBPACK_IMPORTED_MODULE_5__.Component.InvalidObjectUID) { System.createCamera(); } const time = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_9__.GlobalDataRepository.getInstance().getValue('time', 0); time._v[0] = _misc_Time__WEBPACK_IMPORTED_MODULE_12__.Time.timeFromSystemStart; if (this.processApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { const componentTids = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentTIDs(); const webGpuResourceRepository = _webgpu_WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_22__.WebGpuResourceRepository.getInstance(); for (const stage of _core_Component__WEBPACK_IMPORTED_MODULE_5__.Component._processStages) { const methodName = stage.methodName; const commonMethodName = 'common_' + methodName; if (stage === _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_0__.ProcessStage.Render) { const webGpuStrategyBasic = _webgpu_WebGpuStrategyBasic__WEBPACK_IMPORTED_MODULE_23__.WebGpuStrategyBasic.getInstance(); _components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_27__.MeshRendererComponent.common_$prerender(); for (const exp of expressions) { for (const renderPass of exp.renderPasses) { // clear Framebuffer this.__cgApiResourceRepository.clearFrameBuffer(renderPass); renderPass._isChangedSortRenderResult = false; const primitiveUids = _components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_27__.MeshRendererComponent.sort_$render(renderPass); let doRender = renderPass._renderedSomethingBefore; if (doRender) { doRender = !webGpuStrategyBasic.renderWithRenderBundle(renderPass); _SystemState__WEBPACK_IMPORTED_MODULE_13__.SystemState.webgpuRenderBundleMode || (_SystemState__WEBPACK_IMPORTED_MODULE_13__.SystemState.webgpuRenderBundleMode = doRender); } if (doRender) { const renderedSomething = _components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_27__.MeshRendererComponent.common_$render({ renderPass: renderPass, processStage: stage, renderPassTickCount: this.__renderPassTickCount, primitiveUids, }); renderPass._renderedSomethingBefore = renderedSomething; if (renderedSomething) { webGpuResourceRepository.finishRenderBundleEncoder(renderPass); } } renderPass._copyResolve1ToResolve2WebGpu(); renderPass.doPostRender(); this.__renderPassTickCount++; } } webGpuResourceRepository.flush(); } else { if (!_SystemState__WEBPACK_IMPORTED_MODULE_13__.SystemState.webgpuRenderBundleMode || _components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_25__.AnimationComponent.isAnimating || _components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_28__.TransformComponent.updateCount !== this.__lastTransformComponentsUpdateCount || _components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_26__.CameraControllerComponent.updateCount !== this.__lastCameraControllerComponentsUpdateCount) { for (const componentTid of componentTids) { const componentClass = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentClass(componentTid); const componentClass_commonMethod = componentClass[commonMethodName]; if (componentClass_commonMethod) { componentClass_commonMethod({ processApproach: this.__processApproach, renderPass: void 0, processStage: stage, renderPassTickCount: this.__renderPassTickCount, }); } componentClass.process(componentClass, stage); } } } } this.__lastCameraControllerComponentsUpdateCount = _components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_26__.CameraControllerComponent.updateCount; this.__lastTransformComponentsUpdateCount = _components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_28__.TransformComponent.updateCount; } else { const repo = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); const rnXRModule = _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().getModule('xr'); const componentTids = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentTIDs(); const renderingComponentTids = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getRenderingComponentTIDs(); for (const stage of _core_Component__WEBPACK_IMPORTED_MODULE_5__.Component._processStages) { const methodName = stage.methodName; const commonMethodName = 'common_' + methodName; if (stage === _definitions_ProcessStage__WEBPACK_IMPORTED_MODULE_0__.ProcessStage.Render) { _components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_27__.MeshRendererComponent.common_$prerender(); for (const exp of expressions) { for (const componentTid of renderingComponentTids) { const componentClass = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentClass(componentTid); for (const renderPass of exp.renderPasses) { if (typeof spector !== 'undefined') { spector.setMarker(`| ${exp.uniqueName}: ${renderPass.uniqueName}#`); } repo.switchDepthTest(renderPass.isDepthTest); if (componentTid === _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_20__.WellKnownComponentTIDs.MeshRendererComponentTID) { // bind Framebuffer System.bindFramebufferWebGL(renderPass, rnXRModule); // set Viewport for Normal (Not WebXR) System.setViewportForNormalRendering(renderPass, rnXRModule); } if (componentTid === _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_20__.WellKnownComponentTIDs.MeshRendererComponentTID) { // clear Framebuffer this.__cgApiResourceRepository.clearFrameBuffer(renderPass); } renderPass._isChangedSortRenderResult = false; const primitiveUids = _components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_27__.MeshRendererComponent.sort_$render(renderPass); let doRender = renderPass._renderedSomethingBefore; if (doRender) { const componentClass_commonMethod = componentClass[commonMethodName]; if (componentClass_commonMethod) { const renderedSomething = componentClass_commonMethod({ processApproach: this.__processApproach, renderPass: renderPass, processStage: stage, renderPassTickCount: this.__renderPassTickCount, primitiveUids, }); renderPass._renderedSomethingBefore = renderedSomething; } if (componentTid !== _components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_20__.WellKnownComponentTIDs.MeshRendererComponentTID) { componentClass.process(componentClass, stage); } } this.__renderPassTickCount++; renderPass._copyFramebufferToResolveFramebuffersWebGL(); renderPass.doPostRender(); } } } } else { if (_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_25__.AnimationComponent.isAnimating || _components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_28__.TransformComponent.updateCount !== this.__lastTransformComponentsUpdateCount || _components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_26__.CameraControllerComponent.updateCount !== this.__lastCameraControllerComponentsUpdateCount || _geometry_Primitive__WEBPACK_IMPORTED_MODULE_29__.Primitive.getPrimitiveCount() !== this.__lastPrimitiveCount) { for (const componentTid of componentTids) { const componentClass = _core_ComponentRepository__WEBPACK_IMPORTED_MODULE_1__.ComponentRepository.getComponentClass(componentTid); const componentClass_commonMethod = componentClass[commonMethodName]; if (componentClass_commonMethod) { componentClass_commonMethod({ processApproach: this.__processApproach, renderPass: void 0, processStage: stage, renderPassTickCount: this.__renderPassTickCount, }); } componentClass.process(componentClass, stage); } } } } this.__lastCameraControllerComponentsUpdateCount = _components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_26__.CameraControllerComponent.updateCount; this.__lastTransformComponentsUpdateCount = _components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_28__.TransformComponent.updateCount; this.__lastPrimitiveCount = _geometry_Primitive__WEBPACK_IMPORTED_MODULE_29__.Primitive.getPrimitiveCount(); } _misc_Time__WEBPACK_IMPORTED_MODULE_12__.Time._processEnd(); } static get processTime() { return _misc_Time__WEBPACK_IMPORTED_MODULE_12__.Time.lastTimeTimeIntervalInMilliseconds; } static get timeAtProcessBegin() { return _misc_Time__WEBPACK_IMPORTED_MODULE_12__.Time.timeAtProcessBeginMilliseconds; } static get timeAtProcessEnd() { return _misc_Time__WEBPACK_IMPORTED_MODULE_12__.Time.timeAtProcessEndMilliseconds; } static createCamera() { const cameraEntity = (0,_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_31__.createCameraEntity)(); cameraEntity.getTransform().localPosition = _math_Vector3__WEBPACK_IMPORTED_MODULE_10__.Vector3.fromCopyArray([0, 0, 1]); cameraEntity.getCamera().type = _definitions_CameraType__WEBPACK_IMPORTED_MODULE_11__.CameraType.Orthographic; cameraEntity.getCamera().zNear = 0.1; cameraEntity.getCamera().zFar = 10000; const webCGApiRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getCgApiResourceRepository(); const [width, height] = webCGApiRepository.getCanvasSize(); cameraEntity.getCamera().xMag = width / height; cameraEntity.getCamera().yMag = 1; } static setViewportForNormalRendering(renderPass, rnXRModule) { const webXRSystem = rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebXRSystem.getInstance(); const webARSystem = rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebARSystem.getInstance(); if ((!(webXRSystem === null || webXRSystem === void 0 ? void 0 : webXRSystem.isWebXRMode) || !renderPass.isVrRendering) && !(webARSystem === null || webARSystem === void 0 ? void 0 : webARSystem.isWebARMode)) { this.__cgApiResourceRepository.setViewport(renderPass.getViewport()); } } static bindFramebufferWebGL(renderPass, rnXRModule) { const webXRSystem = rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebXRSystem.getInstance(); const webARSystem = rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebARSystem.getInstance(); if ((webXRSystem === null || webXRSystem === void 0 ? void 0 : webXRSystem.isWebXRMode) && renderPass.isOutputForVr) { const glw = this.__cgApiResourceRepository .currentWebGLContextWrapper; const gl = glw.getRawContext(); gl.bindFramebuffer(gl.FRAMEBUFFER, webXRSystem.framebuffer); } else if (webARSystem === null || webARSystem === void 0 ? void 0 : webARSystem.isWebARMode) { const glw = this.__cgApiResourceRepository .currentWebGLContextWrapper; const gl = glw.getRawContext(); gl.bindFramebuffer(gl.FRAMEBUFFER, webARSystem.framebuffer); } else { this.__cgApiResourceRepository.bindFramebuffer(renderPass.getFramebuffer()); this.__cgApiResourceRepository.setDrawTargets(renderPass); } } static __displayRnInfo() { console.log(`%cRhodonite%cWeb3D Library%c %cversion%c${_version__WEBPACK_IMPORTED_MODULE_30__.VERSION.version}%c %cbranch%c${_version__WEBPACK_IMPORTED_MODULE_30__.VERSION.branch}%c %cmode%c${this.__processApproach.str}`, `font-weight: bold; padding: 4px 8px; border-radius: 6px 0px 0px 6px; background: linear-gradient(to right, #ff0084 0%,#ff0022 100%);`, `padding: 4px; border-radius: 0px 6px 6px 0px; background: linear-gradient(to right, #8400ff 0%,#4400ff 100%);`, ``, `background: #666; padding: 4px; border-radius: 6px 0px 0px 6px`, `background: firebrick; padding: 4px; border-radius: 0px 6px 6px 0px`, ``, `background: #666; padding: 4px; border-radius: 6px 0px 0px 6px`, `background: green; padding: 4px; border-radius: 0px 6px 6px 0px`, ``, `background: #666; padding: 4px; border-radius: 6px 0px 0px 6px`, `background: blue; padding: 4px; border-radius: 0px 6px 6px 0px`); } /** * Initialize the Rhodonite system. * * @remarks * Don't forget `await` to use this method. * * @example * ``` * await Rn.System.init({ * approach: Rn.ProcessApproach.DataTexture, * canvas: document.getElementById('world') as HTMLCanvasElement, * }); * ``` * * @param desc * @returns */ static async init(desc) { this.__processApproach = desc.approach; _SystemState__WEBPACK_IMPORTED_MODULE_13__.SystemState.currentProcessApproach = desc.approach; if (desc.notToDisplayRnInfoAtInit !== true) { this.__displayRnInfo(); } await _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().loadModule('webgl'); await _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().loadModule('webgpu'); await _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().loadModule('pbr'); await _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().loadModule('xr'); _core_Config__WEBPACK_IMPORTED_MODULE_16__.Config.eventTargetDom = desc.canvas; // Memory Settings _core_MemoryManager__WEBPACK_IMPORTED_MODULE_8__.MemoryManager.createInstanceIfNotCreated({ cpuGeneric: _misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(desc.memoryUsageOrder) ? desc.memoryUsageOrder.cpuGeneric : 0.1, gpuInstanceData: _misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(desc.memoryUsageOrder) ? desc.memoryUsageOrder.gpuInstanceData : 0.5, gpuVertexData: _misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(desc.memoryUsageOrder) ? desc.memoryUsageOrder.gpuVertexData : 0.5, }); System.__cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getCgApiResourceRepository(); if (desc.approach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { // WebGPU const memoryManager = _core_MemoryManager__WEBPACK_IMPORTED_MODULE_8__.MemoryManager.getInstance(); const requiredBufferSize = memoryManager.getMemorySize(); const webGpuResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getCgApiResourceRepository(); const module = _ModuleManager__WEBPACK_IMPORTED_MODULE_3__.ModuleManager.getInstance().getModule('webgpu'); const WebGpuDeviceWrapperClass = module.WebGpuDeviceWrapper; const adapter = await navigator.gpu.requestAdapter(); const { maxBufferSize, maxStorageBufferBindingSize } = adapter.limits; if (maxBufferSize < requiredBufferSize || maxStorageBufferBindingSize < requiredBufferSize) { throw new Error('The required buffer size is too large for this device.'); } const features = []; function addFeature(feature) { if (adapter.features.has(feature)) { features.push(feature); } } addFeature('float32-filterable'); addFeature('rg11b10ufloat-renderable'); addFeature('texture-compression-bc'); addFeature('texture-compression-etc2'); addFeature('texture-compression-astc'); const device = await adapter.requestDevice({ requiredFeatures: features, requiredLimits: { maxStorageBufferBindingSize, maxBufferSize, }, }); const webGpuDeviceWrapper = new WebGpuDeviceWrapperClass(desc.canvas, adapter, device); webGpuResourceRepository.addWebGpuDeviceWrapper(webGpuDeviceWrapper); webGpuResourceRepository.recreateSystemDepthTexture(); webGpuResourceRepository.createUniformMorphOffsetsBuffer(); webGpuResourceRepository.createUniformMorphWeightsBuffer(); } else { // WebGL const repo = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getWebGLResourceRepository(); repo.generateWebGLContext(desc.canvas, true, desc.webglOption); repo.switchDepthTest(true); } const globalDataRepository = _core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_9__.GlobalDataRepository.getInstance(); globalDataRepository.initialize(desc.approach); if (_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_14__.MiscUtil.isMobile() && _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.isUniformApproach(desc.approach)) { _misc_Logger__WEBPACK_IMPORTED_MODULE_32__.Logger.warn('The number of Uniform variables available on mobile devices is limited and may interfere with rendering. Use the DataTexture ProcessApproach for this device.'); } // Deal with WebGL context lost and restore desc.canvas.addEventListener('webglcontextlost', ((event) => { // Calling preventDefault signals to the page that you intent to handle context restoration. event.preventDefault(); this.stopRenderLoop(); _misc_Logger__WEBPACK_IMPORTED_MODULE_32__.Logger.error('WebGL context lost occurred.'); }).bind(this)); desc.canvas.addEventListener('webglcontextrestored', () => { // Once this function is called the gl context will be restored but any graphics resources // that were previously loaded will be lost, so the scene should be reloaded. _misc_Logger__WEBPACK_IMPORTED_MODULE_32__.Logger.error('WebGL context restored.'); // TODO: Implement restoring the previous graphics resources // loadSceneGraphics(gl); this.restartRenderLoop(); }); await (0,_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_21__.initDefaultTextures)(); _SystemState__WEBPACK_IMPORTED_MODULE_13__.SystemState.viewportAspectRatio = desc.canvas.width / desc.canvas.height; } static get processApproach() { return this.__processApproach; } static resizeCanvas(width, height) { const repo = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getCgApiResourceRepository(); repo.resizeCanvas(width, height); _SystemState__WEBPACK_IMPORTED_MODULE_13__.SystemState.viewportAspectRatio = width / height; } static getCanvasSize() { const repo = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_4__.CGAPIResourceRepository.getCgApiResourceRepository(); return repo.getCanvasSize(); } static getCurrentWebGLContextWrapper() { return this.__cgApiResourceRepository.currentWebGLContextWrapper; } } System.__processApproach = _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.None; System.__renderPassTickCount = 0; System.__animationFrameId = -1; System.__args = []; System.__lastCameraControllerComponentsUpdateCount = -1; System.__lastTransformComponentsUpdateCount = -1; System.__lastPrimitiveCount = -1; /***/ }), /***/ "./src/foundation/system/SystemState.ts": /*!**********************************************!*\ !*** ./src/foundation/system/SystemState.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SystemState: () => (/* binding */ SystemState) /* harmony export */ }); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); const currentProcessApproach = _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.None; const SystemState = { currentProcessApproach, viewportAspectRatio: 0, webgpuRenderBundleMode: false, }; /***/ }), /***/ "./src/foundation/system/index.ts": /*!****************************************!*\ !*** ./src/foundation/system/index.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EVENT_CLICK: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_CLICK), /* harmony export */ EVENT_KEY_DOWN: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_KEY_DOWN), /* harmony export */ EVENT_KEY_PRESS: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_KEY_PRESS), /* harmony export */ EVENT_KEY_UP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_KEY_UP), /* harmony export */ EVENT_MOUSE_DOWN: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_DOWN), /* harmony export */ EVENT_MOUSE_ENTER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_ENTER), /* harmony export */ EVENT_MOUSE_LEAVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_LEAVE), /* harmony export */ EVENT_MOUSE_MOVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_MOVE), /* harmony export */ EVENT_MOUSE_OVER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_OVER), /* harmony export */ EVENT_MOUSE_UP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_UP), /* harmony export */ EVENT_MOUSE_WHEEL: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MOUSE_WHEEL), /* harmony export */ EVENT_MSPOINTER_DOWN: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MSPOINTER_DOWN), /* harmony export */ EVENT_MSPOINTER_MOVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MSPOINTER_MOVE), /* harmony export */ EVENT_MSPOINTER_UP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_MSPOINTER_UP), /* harmony export */ EVENT_ORIENTATION_CHANGE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_ORIENTATION_CHANGE), /* harmony export */ EVENT_POINTER_CANCEL: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_CANCEL), /* harmony export */ EVENT_POINTER_DOWN: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_DOWN), /* harmony export */ EVENT_POINTER_ENTER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_ENTER), /* harmony export */ EVENT_POINTER_LEAVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_LEAVE), /* harmony export */ EVENT_POINTER_MOVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_MOVE), /* harmony export */ EVENT_POINTER_OUT: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_OUT), /* harmony export */ EVENT_POINTER_OVER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_OVER), /* harmony export */ EVENT_POINTER_UP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_POINTER_UP), /* harmony export */ EVENT_RESIZE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_RESIZE), /* harmony export */ EVENT_TOUCH_CANCEL: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_CANCEL), /* harmony export */ EVENT_TOUCH_DOUBLE_TAP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_DOUBLE_TAP), /* harmony export */ EVENT_TOUCH_DRAG: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_DRAG), /* harmony export */ EVENT_TOUCH_END: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_END), /* harmony export */ EVENT_TOUCH_ENTER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_ENTER), /* harmony export */ EVENT_TOUCH_HOLD: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_HOLD), /* harmony export */ EVENT_TOUCH_LEAVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_LEAVE), /* harmony export */ EVENT_TOUCH_LONG_TAP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_LONG_TAP), /* harmony export */ EVENT_TOUCH_MOVE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_MOVE), /* harmony export */ EVENT_TOUCH_OUT: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_OUT), /* harmony export */ EVENT_TOUCH_OVER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_OVER), /* harmony export */ EVENT_TOUCH_PINCH: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_PINCH), /* harmony export */ EVENT_TOUCH_START: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_START), /* harmony export */ EVENT_TOUCH_SWIPE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_SWIPE), /* harmony export */ EVENT_TOUCH_TAP: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.EVENT_TOUCH_TAP), /* harmony export */ EventPubSub: () => (/* reexport safe */ _EventPubSub__WEBPACK_IMPORTED_MODULE_0__.EventPubSub), /* harmony export */ INPUT_HANDLING_STATE_CAMERA_CONTROLLER: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_SCALE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.INPUT_HANDLING_STATE_GIZMO_SCALE), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_TRANSLATION: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.INPUT_HANDLING_STATE_GIZMO_TRANSLATION), /* harmony export */ INPUT_HANDLING_STATE_NONE: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.INPUT_HANDLING_STATE_NONE), /* harmony export */ InputManager: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.InputManager), /* harmony export */ ModuleManager: () => (/* reexport safe */ _ModuleManager__WEBPACK_IMPORTED_MODULE_2__.ModuleManager), /* harmony export */ System: () => (/* reexport safe */ _System__WEBPACK_IMPORTED_MODULE_3__.System), /* harmony export */ SystemState: () => (/* reexport safe */ _SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState), /* harmony export */ getEvent: () => (/* reexport safe */ _InputManager__WEBPACK_IMPORTED_MODULE_1__.getEvent) /* harmony export */ }); /* harmony import */ var _EventPubSub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventPubSub */ "./src/foundation/system/EventPubSub.ts"); /* harmony import */ var _InputManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./InputManager */ "./src/foundation/system/InputManager.ts"); /* harmony import */ var _ModuleManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _System__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./System */ "./src/foundation/system/System.ts"); /* harmony import */ var _SystemState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./SystemState */ "./src/foundation/system/SystemState.ts"); /***/ }), /***/ "./src/foundation/textures/AbstractTexture.ts": /*!****************************************************!*\ !*** ./src/foundation/textures/AbstractTexture.ts ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractTexture: () => (/* binding */ AbstractTexture) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _TextureDataFloat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TextureDataFloat */ "./src/foundation/textures/TextureDataFloat.ts"); /* harmony import */ var _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _misc_Is__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); class AbstractTexture extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor() { super(); this.__width = 0; this.__height = 0; this.__level = 0; this.__mipLevelCount = 1; this.__internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_6__.TextureFormat.RGBA8; this.__format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_1__.PixelFormat.RGBA; this.__type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte; this.__hasTransparentPixels = false; this.__isTextureReady = false; this.__startedToLoad = false; this.__name = 'untitled'; this._textureResourceUid = -1; this._samplerResourceUid = -1; this._textureViewResourceUid = -1; this._textureViewAsRenderTargetResourceUid = -1; this.__textureUid = ++AbstractTexture.__textureUidCount; } get textureUID() { return this.__textureUid; } get width() { return this.__width; } getWidthAtMipLevel(mipLevel) { return Math.max(1, Math.floor(this.__width / Math.pow(2, mipLevel))); } getHeightAtMipLevel(mipLevel) { return Math.max(1, Math.floor(this.__height / Math.pow(2, mipLevel))); } set width(val) { this.__width = val; } get height() { return this.__height; } set height(val) { this.__height = val; } get isTextureReady() { return this.__isTextureReady; } get startedToLoad() { return this.__startedToLoad; } get htmlImageElement() { return this.__htmlImageElement; } get htmlCanvasElement() { const canvas = document.createElement('canvas'); const ctx = canvas === null || canvas === void 0 ? void 0 : canvas.getContext('2d'); this.__htmlCanvasElement = canvas; if (_misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(ctx) && _misc_Is__WEBPACK_IMPORTED_MODULE_5__.Is.exist(this.__htmlImageElement)) { canvas.width = this.__htmlImageElement.width; canvas.height = this.__htmlImageElement.height; ctx.drawImage(this.__htmlImageElement, 0, 0, this.__htmlImageElement.width, this.__htmlImageElement.height); } return this.__htmlCanvasElement; } get uri() { return this.__uri; } set name(name) { this.__name = name; } get name() { return this.__name; } getImageData(x, y, width, height) { if (this.__canvasContext === undefined) { this.createInternalCanvasContext(); } return this.__canvasContext.getImageData(x, y, width, height); } getPixelAs(x, y, typeClass) { const pixel = this.getImageData(x, y, 1, 1); const data = pixel.data; if (typeClass.compositionType === _definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec4) { return new typeClass(new Float32Array([data[0], data[1], data[2], data[3]])); } else { return new typeClass(new Float32Array([data[0], data[1], data[2]])); } } /** * get the pixel data at (x,y) in the Texture as Uint8Clamped Array * @param x x position in the texture * @param y y position in the texture * @returns a pixel data as Uint8Clamped Array */ getPixelAsArray(x, y) { const pixel = this.getImageData(x, y, 1, 1); return pixel.data; } setPixel(x, y, value) { const pixel = this.getImageData(x, y, 1, 1); const data = pixel.data; const classOfValue = value.constructor; const numberOfComponents = classOfValue.compositionType.getNumberOfComponents(); for (let i = 0; i < numberOfComponents; i++) { data[i] = value.at(i); } this.__canvasContext.putImageData(pixel, x, y); } setPixelAtChannel(x, y, channelIdx, value) { const pixel = this.getImageData(x, y, 1, 1); const data = pixel.data; data[channelIdx] = value; this.__canvasContext.putImageData(pixel, x, y); } get isTransparent() { return this.__hasTransparentPixels; } createInternalCanvasContext() { let canvas; if (this.__htmlCanvasElement != null) { canvas = this.__htmlCanvasElement; } else { canvas = document.createElement('canvas'); canvas.width = this.width; canvas.height = this.height; } this.__htmlCanvasElement = canvas; this.__canvasContext = canvas.getContext('2d'); } getTextureDataFloat(channels) { const pixel = this.getImageData(0, 0, this.width, this.height); const textureDataFloat = new _TextureDataFloat__WEBPACK_IMPORTED_MODULE_3__.TextureDataFloat(this.width, this.height, channels); const data = pixel.data; for (let i = 0; i < this.height; i++) { for (let j = 0; j < this.width; j++) { for (let k = 0; k < channels; k++) { textureDataFloat.setPixelAtChannel(j, i, k, data[i * this.width * 4 + j * 4 + k] / 255); } } } return textureDataFloat; } } AbstractTexture.InvalidTextureUid = -1; AbstractTexture.__textureUidCount = AbstractTexture.InvalidTextureUid; /***/ }), /***/ "./src/foundation/textures/CubeTexture.ts": /*!************************************************!*\ !*** ./src/foundation/textures/CubeTexture.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CubeTexture: () => (/* binding */ CubeTexture) /* harmony export */ }); /* harmony import */ var _AbstractTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/HdriFormat */ "./src/foundation/definitions/HdriFormat.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class CubeTexture extends _AbstractTexture__WEBPACK_IMPORTED_MODULE_0__.AbstractTexture { constructor() { super(); this.mipmapLevelNumber = 1; this.hdriFormat = _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_1__.HdriFormat.LDR_SRGB; this.isNamePosNeg = false; this.__onTextureLoadedArray = []; } registerOnTextureLoaded(func) { this.__onTextureLoadedArray.push(func); } async loadTextureImages() { this.__startedToLoad = true; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.getCgApiResourceRepository(); const [resourceUid, sampler] = await cgApiResourceRepository.createCubeTextureFromFiles(this.baseUriToLoad, this.mipmapLevelNumber, this.isNamePosNeg, this.hdriFormat); this._recommendedTextureSampler = sampler; this._textureResourceUid = resourceUid; this._samplerResourceUid = sampler._samplerResourceUid; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureViewCube(this._textureResourceUid); } this.__isTextureReady = true; } loadTextureImagesAsync() { return new Promise((resolve) => { this.__startedToLoad = true; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository .createCubeTextureFromFiles(this.baseUriToLoad, this.mipmapLevelNumber, this.isNamePosNeg, this.hdriFormat) .then(([cubeTextureUid, sampler]) => { this._textureResourceUid = cubeTextureUid; this._recommendedTextureSampler = sampler; this._samplerResourceUid = sampler._samplerResourceUid; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureViewCube(this._textureResourceUid); } }) .then(() => { this.__isTextureReady = true; this.__onTextureLoadedArray.forEach((func) => { func(); }); this.__onTextureLoadedArray = []; resolve(); }); }); } loadTextureImagesFromBasis(uint8Array, { magFilter = _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_3__.TextureParameter.Linear, minFilter = _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_3__.TextureParameter.LinearMipmapLinear, wrapS = _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_3__.TextureParameter.Repeat, wrapT = _definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_3__.TextureParameter.Repeat, } = {}) { this.__startedToLoad = true; if (typeof BASIS === 'undefined') { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('Failed to call BASIS() function. Please check to import basis_transcoder.js.'); } BASIS().then((basisTransCoder) => { const { initializeBasis } = basisTransCoder; initializeBasis(); const BasisFile = basisTransCoder.BasisFile; const basisFile = new BasisFile(uint8Array); if (!basisFile.startTranscoding()) { _misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('failed to start transcoding.'); basisFile.close(); basisFile.delete(); return; } const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.getWebGLResourceRepository(); const texture = webGLResourceRepository.createCubeTextureFromBasis(basisFile, { magFilter: magFilter, minFilter: minFilter, wrapS: wrapS, wrapT: wrapT, }); this._textureResourceUid = texture; this.__isTextureReady = true; basisFile.close(); basisFile.delete(); }); } load1x1Texture(rgbaStr = 'rgba(0,0,0,1)') { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); ctx.fillStyle = rgbaStr; ctx.fillRect(0, 0, 1, 1); const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.getCgApiResourceRepository(); const [resourceUid, sampler] = cgApiResourceRepository.createCubeTexture(1, [ { posX: canvas, negX: canvas, posY: canvas, negY: canvas, posZ: canvas, negZ: canvas, }, ], 1, 1); this._textureResourceUid = resourceUid; this._recommendedTextureSampler = sampler; this._samplerResourceUid = sampler._samplerResourceUid; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_5__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureViewCube(this._textureResourceUid); } this.__isTextureReady = true; } /** * Generate cubemap texture object from typed array of cubemap images * @param typedArrays Array of typed array object for cubemap textures. The nth element is the nth mipmap reduction level(level 0 is the base image level). * @param width Texture width of the base image level texture * @param height Texture height of the base image level texture */ generateTextureFromTypedArrays(typedArrayImages, baseLevelWidth, baseLevelHeight) { const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.getWebGLResourceRepository(); const [resourceId, sampler] = webGLResourceRepository.createCubeTexture(typedArrayImages.length, typedArrayImages, baseLevelWidth, baseLevelHeight); this._recommendedTextureSampler = sampler; this._textureResourceUid = resourceId; this.__isTextureReady = true; this.__startedToLoad = true; } importWebGLTextureDirectly(webGLTexture, width = 0, height = 0) { this.__width = width; this.__height = height; const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.getWebGLResourceRepository(); const texture = webGLResourceRepository.setWebGLTextureDirectly(webGLTexture); this._textureResourceUid = texture; this.__startedToLoad = true; this.__isTextureReady = true; } } /***/ }), /***/ "./src/foundation/textures/IRenderable.ts": /*!************************************************!*\ !*** ./src/foundation/textures/IRenderable.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/foundation/textures/RenderBuffer.ts": /*!*************************************************!*\ !*** ./src/foundation/textures/RenderBuffer.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderBuffer: () => (/* binding */ RenderBuffer) /* harmony export */ }); /* harmony import */ var _core_RnObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/RnObject */ "./src/foundation/core/RnObject.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); class RenderBuffer extends _core_RnObject__WEBPACK_IMPORTED_MODULE_0__.RnObject { constructor() { super(); this.width = 0; this.height = 0; this.__internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_4__.TextureFormat.Depth24; this._textureResourceUid = -1; this._textureViewResourceUid = -1; this._textureViewAsRenderTargetResourceUid = -1; this.__isMSAA = false; this.__sampleCountMSAA = 4; } set _fbo(fbo) { this.__fbo = fbo; } get fbo() { return this.__fbo; } get sampleCount() { return this.__sampleCountMSAA; } create(width, height, internalFormat, { isMSAA = false, sampleCountMSAA = this.__sampleCountMSAA } = {}) { this.width = width; this.height = height; this.__isMSAA = isMSAA; this.__sampleCountMSAA = sampleCountMSAA; this.__internalFormat = internalFormat; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); this._textureResourceUid = cgApiResourceRepository.createRenderBuffer(width, height, internalFormat, isMSAA, sampleCountMSAA); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_2__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_3__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); this._textureViewAsRenderTargetResourceUid = cgApiResourceRepository.createTextureViewAsRenderTarget(this._textureResourceUid); } } createCubeTextureViewAsRenderTarget(faceIdx, mipLevel) { } resize(width, height) { this.destroy3DAPIResources(); this.create(width, height, this.__internalFormat, { isMSAA: this.__isMSAA }); } destroy3DAPIResources() { this.width = 0; this.height = 0; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.deleteRenderBuffer(this._textureResourceUid); this._textureResourceUid = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.InvalidCGAPIResourceUid; return true; } } /***/ }), /***/ "./src/foundation/textures/RenderTargetTexture.ts": /*!********************************************************!*\ !*** ./src/foundation/textures/RenderTargetTexture.ts ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderTargetTexture: () => (/* binding */ RenderTargetTexture) /* harmony export */ }); /* harmony import */ var _AbstractTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _math_Vector4__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); class RenderTargetTexture extends _AbstractTexture__WEBPACK_IMPORTED_MODULE_0__.AbstractTexture { constructor() { super(); this.__arrayLength = 0; } create({ width, height, mipLevelCount, format: internalFormat, }) { this.__width = width; this.__height = height; this.__mipLevelCount = mipLevelCount !== null && mipLevelCount !== void 0 ? mipLevelCount : Math.floor(Math.log2(Math.max(width, height))) + 1; const { format, type } = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__.TextureFormat.getPixelFormatAndComponentTypeFromTextureFormat(internalFormat); this.__internalFormat = internalFormat; this.__format = format; this.__type = type; this.__createRenderTargetTexture(); } createTextureArray({ width, height, level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_7__.TextureFormat.RGB8, format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_1__.PixelFormat.RGBA, type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte, arrayLength, }) { this.__width = width; this.__height = height; this.__level = level; this.__internalFormat = internalFormat; this.__format = format; this.__type = type; this.__arrayLength = arrayLength; this.__createRenderTargetTextureArray(); } set _fbo(fbo) { this.__fbo = fbo; } get fbo() { return this.__fbo; } get arrayLength() { return this.__arrayLength; } __createRenderTargetTexture() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const texture = cgApiResourceRepository.createRenderTargetTexture({ width: this.__width, height: this.__height, mipLevelCount: this.__mipLevelCount, format: this.__internalFormat, }); this._textureResourceUid = texture; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _definitions__WEBPACK_IMPORTED_MODULE_6__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); this._textureViewAsRenderTargetResourceUid = cgApiResourceRepository.createTextureViewAsRenderTarget(this._textureResourceUid); } } __createRenderTargetTextureArray() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const texture = cgApiResourceRepository.createRenderTargetTextureArray({ width: this.__width, height: this.__height, level: this.__level, internalFormat: this.__internalFormat, format: this.__format, type: this.__type, arrayLength: this.__arrayLength, }); this._textureResourceUid = texture; } resize(width, height) { this.destroy3DAPIResources(); this.__width = width; this.__height = height; if (this.__arrayLength > 0) { this.__createRenderTargetTextureArray(); } else { this.__createRenderTargetTexture(); } } destroy3DAPIResources() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.deleteTexture(this._textureResourceUid); this._textureResourceUid = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.InvalidCGAPIResourceUid; return true; } async getTexturePixelData() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const data = cgApiResourceRepository.getTexturePixelData(this._textureResourceUid, this.__width, this.__height, this.__fbo.framebufferUID, this.__fbo.whichColorAttachment(this)); return data; } async downloadTexturePixelData() { const data = await this.getTexturePixelData(); const canvas = document.createElement('canvas'); canvas.width = this.__width; canvas.height = this.__height; const ctx = canvas.getContext('2d'); const imageData = new ImageData(new Uint8ClampedArray(data.buffer), this.__width, this.__height); ctx.putImageData(imageData, this.__width, this.__height); const dataUri = canvas.toDataURL('image/png'); const a = document.createElement('a'); const e = document.createEvent('MouseEvent'); a.href = dataUri; a.download = 'texture.png'; e.initEvent('click', true, true); //, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null) a.dispatchEvent(e); } /** * Origin is left bottom * * @param x horizontal pixel position (0 is left) * @param y vertical pixel position (0 is bottom) * @param argByteArray Pixel Data as Uint8Array * @returns Pixel Value in Vector4 */ async getPixelValueAt(x, y, argByteArray) { let byteArray = argByteArray; if (!byteArray) { byteArray = await this.getTexturePixelData(); } const color = _math_Vector4__WEBPACK_IMPORTED_MODULE_4__.Vector4.fromCopyArray([ byteArray[(y * this.width + x) * 4 + 0], byteArray[(y * this.width + x) * 4 + 1], byteArray[(y * this.width + x) * 4 + 2], byteArray[(y * this.width + x) * 4 + 3], ]); return color; } generateMipmaps() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.generateMipmaps2d(this._textureResourceUid, this.width, this.height); } blitToTexture2dFromTexture2dArray(targetTexture2D) { if (this.__arrayLength === 0) { return; } const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); webglResourceRepository.blitToTexture2dFromTexture2dArray(this._textureResourceUid, targetTexture2D.__fbo.cgApiResourceUid, targetTexture2D.width, targetTexture2D.height); } blitToTexture2dFromTexture2dArrayFake(targetTexture2D) { if (this.__arrayLength === 0) { return; } const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); webglResourceRepository.blitToTexture2dFromTexture2dArrayFake(this._textureResourceUid, targetTexture2D.__fbo.cgApiResourceUid, targetTexture2D.width, targetTexture2D.height); } blitToTexture2dFromTexture2dArray2(targetTexture2D) { if (this.__arrayLength === 0) { return; } const webglResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); webglResourceRepository.blitToTexture2dFromTexture2dArray2(this._textureResourceUid, targetTexture2D._textureResourceUid, targetTexture2D.width / 2, targetTexture2D.height); } createCubeTextureViewAsRenderTarget(faceIdx, mipLevel) { } } /***/ }), /***/ "./src/foundation/textures/RenderTargetTextureCube.ts": /*!************************************************************!*\ !*** ./src/foundation/textures/RenderTargetTextureCube.ts ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RenderTargetTextureCube: () => (/* binding */ RenderTargetTextureCube) /* harmony export */ }); /* harmony import */ var _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/HdriFormat */ "./src/foundation/definitions/HdriFormat.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _AbstractTexture__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); class RenderTargetTextureCube extends _AbstractTexture__WEBPACK_IMPORTED_MODULE_5__.AbstractTexture { constructor() { super(); this.hdriFormat = _definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_0__.HdriFormat.HDR_LINEAR; this._textureViewAsRenderTargetResourceUid = -1; } create({ width, height, mipLevelCount, format: internalFormat, }) { this.__width = width; this.__height = height; this.__mipLevelCount = mipLevelCount !== null && mipLevelCount !== void 0 ? mipLevelCount : Math.floor(Math.log2(Math.max(width, height))) + 1; const { format, type } = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_2__.TextureFormat.getPixelFormatAndComponentTypeFromTextureFormat(internalFormat); this.__internalFormat = internalFormat; this.__format = format; this.__type = type; this.__createRenderTargetTexture(); } __createRenderTargetTexture() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const texture = cgApiResourceRepository.createRenderTargetTextureCube({ width: this.__width, height: this.__height, mipLevelCount: this.__mipLevelCount, format: this.__internalFormat, }); this._textureResourceUid = texture; if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_1__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureViewCube(this._textureResourceUid); this._textureViewAsRenderTargetResourceUid = cgApiResourceRepository.createCubeTextureViewAsRenderTarget(this._textureResourceUid, 0, 0); } } generateMipmaps() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.generateMipmapsCube(this._textureResourceUid, this.width, this.height); } resize(width, height) { this.destroy3DAPIResources(); this.__width = width; this.__height = height; this.__createRenderTargetTexture(); } destroy3DAPIResources() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.deleteTexture(this._textureResourceUid); this._textureResourceUid = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.InvalidCGAPIResourceUid; return true; } createCubeTextureViewAsRenderTarget(faceIdx, mipLevel) { if (_system_SystemState__WEBPACK_IMPORTED_MODULE_4__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_1__.ProcessApproach.WebGPU) { const webGpuResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGpuResourceRepository(); this._textureViewAsRenderTargetResourceUid = webGpuResourceRepository.createCubeTextureViewAsRenderTarget(this._textureResourceUid, faceIdx, mipLevel); } } set _fbo(fbo) { this.__fbo = fbo; } get fbo() { return this.__fbo; } get mipmapLevelNumber() { return this.__mipLevelCount; } setIsTextureReady() { this.__isTextureReady = true; } } /***/ }), /***/ "./src/foundation/textures/Sampler.ts": /*!********************************************!*\ !*** ./src/foundation/textures/Sampler.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Sampler: () => (/* binding */ Sampler) /* harmony export */ }); /* harmony import */ var _definitions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions */ "./src/foundation/definitions/index.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); class Sampler { constructor(desc) { var _a, _b, _c; this.__samplerResourceUid = -1; this.__minFilter = desc.minFilter; this.__magFilter = desc.magFilter; this.__wrapS = desc.wrapS; this.__wrapT = desc.wrapT; this.__wrapR = (_a = desc.wrapR) !== null && _a !== void 0 ? _a : _definitions__WEBPACK_IMPORTED_MODULE_0__.TextureParameter.Repeat; this.__anisotropy = (_b = desc.anisotropy) !== null && _b !== void 0 ? _b : true; this.__shadowCompareMode = (_c = desc.shadowCompareMode) !== null && _c !== void 0 ? _c : false; } create() { const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getCgApiResourceRepository(); this.__samplerResourceUid = webGLResourceRepository === null || webGLResourceRepository === void 0 ? void 0 : webGLResourceRepository.createTextureSampler({ minFilter: this.__minFilter, magFilter: this.__magFilter, wrapS: this.__wrapS, wrapT: this.__wrapT, wrapR: this.__wrapR, anisotropy: this.__anisotropy, shadowCompareMode: this.__shadowCompareMode, }); } get created() { return this.__samplerResourceUid !== -1; } get minFilter() { return this.__minFilter; } get magFilter() { return this.__magFilter; } get wrapS() { return this.__wrapS; } get wrapT() { return this.__wrapT; } get wrapR() { return this.__wrapR; } get _samplerResourceUid() { return this.__samplerResourceUid; } } /***/ }), /***/ "./src/foundation/textures/Texture.ts": /*!********************************************!*\ !*** ./src/foundation/textures/Texture.ts ***! \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Texture: () => (/* binding */ Texture) /* harmony export */ }); /* harmony import */ var _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _AbstractTexture__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _core_Config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _webgl_textureLoader_KTX2TextureLoader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../webgl/textureLoader/KTX2TextureLoader */ "./src/webgl/textureLoader/KTX2TextureLoader.ts"); /* harmony import */ var _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _system_SystemState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _misc_Logger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../misc/Logger */ "./src/foundation/misc/Logger.ts"); class Texture extends _AbstractTexture__WEBPACK_IMPORTED_MODULE_2__.AbstractTexture { constructor() { super(); this.autoResize = true; this.autoDetectTransparency = false; } __setTextureResourceUid(textureResourceUid, uniqueName) { this._textureResourceUid = textureResourceUid; Texture.managedRegistry.register(this, { textureResourceUid, uniqueName }, this); } get hasDataToLoadLazy() { return this.__uriToLoadLazy != null || this.__imgToLoadLazy != null; } generateTextureFromBasis(uint8Array, options) { var _a; this.__startedToLoad = true; if (typeof BASIS === 'undefined') { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('Failed to call BASIS() function. Please check to import basis_transcoder.js.'); } // download basis_transcoder.wasm once if (!Texture.__loadedBasisFunc) { Texture.__loadedBasisFunc = true; Texture.__basisLoadPromise = new Promise((resolve) => { BASIS().then((basisTransCoder) => { const { initializeBasis } = basisTransCoder; initializeBasis(); Texture.__BasisFile = basisTransCoder.BasisFile; this.__setBasisTexture(uint8Array, options); resolve(); }); }); } else { // already download basis_transcoder.wasm or not if (Texture.__BasisFile) { this.__setBasisTexture(uint8Array, options); } else { (_a = Texture.__basisLoadPromise) === null || _a === void 0 ? void 0 : _a.then(() => { this.__setBasisTexture(uint8Array, options); }); } } } __setBasisTexture(uint8Array, { level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8, format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap = true, } = {}) { this.__startedToLoad = true; const basisFile = new Texture.__BasisFile(uint8Array); if (!basisFile.startTranscoding()) { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.error('failed to start transcoding.'); basisFile.close(); basisFile.delete(); return; } const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const texture = cgApiResourceRepository.createCompressedTextureFromBasis(basisFile, { border: 0, format, type, }); this.__setTextureResourceUid(texture, this.uniqueName); this.__isTextureReady = true; basisFile.close(); basisFile.delete(); } async generateTextureFromKTX2(uint8Array) { this.__startedToLoad = true; const transcodedData = await _webgl_textureLoader_KTX2TextureLoader__WEBPACK_IMPORTED_MODULE_6__.KTX2TextureLoader.getInstance().transcode(uint8Array); this.__width = transcodedData.width; this.__height = transcodedData.height; this.generateCompressedTextureWithMipmapFromTypedArray(transcodedData.mipmapData, transcodedData.compressionTextureType); } generateTextureFromImage(image, { level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8, format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap = true, } = {}) { this.__imgToLoadLazy = image; this.__optionsToLoadLazy = { level, internalFormat, format, type, generateMipmap, }; } async loadFromImgLazy() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; if (this.__imgToLoadLazy == null) { return; } const image = this.__imgToLoadLazy; const level = (_b = (_a = this.__optionsToLoadLazy) === null || _a === void 0 ? void 0 : _a.level) !== null && _b !== void 0 ? _b : 0; const internalFormat = (_d = (_c = this.__optionsToLoadLazy) === null || _c === void 0 ? void 0 : _c.internalFormat) !== null && _d !== void 0 ? _d : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8; const format = (_f = (_e = this.__optionsToLoadLazy) === null || _e === void 0 ? void 0 : _e.format) !== null && _f !== void 0 ? _f : _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA; const type = (_h = (_g = this.__optionsToLoadLazy) === null || _g === void 0 ? void 0 : _g.type) !== null && _h !== void 0 ? _h : _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte; const generateMipmap = (_k = (_j = this.__optionsToLoadLazy) === null || _j === void 0 ? void 0 : _j.generateMipmap) !== null && _k !== void 0 ? _k : true; this.__startedToLoad = true; this.__htmlImageElement = image; let img = image; if (this.autoResize) { const [resizedCanvas, resizedWidth, resizedHeight] = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_5__.DataUtil.getResizedCanvas(img, _core_Config__WEBPACK_IMPORTED_MODULE_4__.Config.maxSizeLimitOfNonCompressedTexture); img = resizedCanvas; this.__width = resizedWidth; this.__height = resizedHeight; this.__htmlCanvasElement = resizedCanvas; } if (this.autoDetectTransparency) { this.__hasTransparentPixels = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_5__.DataUtil.detectTransparentPixelExistence(img); } this.__width = img.width; this.__height = img.height; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); let texture; if (img instanceof HTMLImageElement) { texture = await cgApiResourceRepository.createTextureFromHTMLImageElement(img, { level, internalFormat, width: this.__width, height: this.__height, border: 0, format, type, generateMipmap, }); } else if (img instanceof HTMLCanvasElement) { const textureHandle = cgApiResourceRepository.createTextureFromImageBitmapData(img, { level, internalFormat, width: this.__width, height: this.__height, border: 0, format, type, generateMipmap, }); texture = textureHandle; } else { throw new Error('Unsupported image type.'); } this.__setTextureResourceUid(texture, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__isTextureReady = true; this.__uri = image.src; this.__imgToLoadLazy = undefined; } generateTextureFromUri(imageUri, { level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8, format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap = true, } = {}) { this.__uriToLoadLazy = imageUri; this.__optionsToLoadLazy = { level, internalFormat, format, type, generateMipmap, }; } async loadFromUrlLazy() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; if (this.__uriToLoadLazy == null) { return; } const imageUri = this.__uriToLoadLazy; const level = (_b = (_a = this.__optionsToLoadLazy) === null || _a === void 0 ? void 0 : _a.level) !== null && _b !== void 0 ? _b : 0; const internalFormat = (_d = (_c = this.__optionsToLoadLazy) === null || _c === void 0 ? void 0 : _c.internalFormat) !== null && _d !== void 0 ? _d : _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8; const format = (_f = (_e = this.__optionsToLoadLazy) === null || _e === void 0 ? void 0 : _e.format) !== null && _f !== void 0 ? _f : _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA; const type = (_h = (_g = this.__optionsToLoadLazy) === null || _g === void 0 ? void 0 : _g.type) !== null && _h !== void 0 ? _h : _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte; const generateMipmap = (_k = (_j = this.__optionsToLoadLazy) === null || _j === void 0 ? void 0 : _j.generateMipmap) !== null && _k !== void 0 ? _k : true; this.__uri = imageUri; this.__startedToLoad = true; return new Promise((resolve, reject) => { this.__img = new Image(); if (!imageUri.match(/^data:/)) { this.__img.crossOrigin = 'Anonymous'; } this.__img.onload = () => { this.__htmlImageElement = this.__img; let img = this.__img; if (this.autoResize) { const [resizedCanvas, resizedWidth, resizedHeight] = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_5__.DataUtil.getResizedCanvas(img, _core_Config__WEBPACK_IMPORTED_MODULE_4__.Config.maxSizeLimitOfNonCompressedTexture); img = resizedCanvas; this.__width = resizedWidth; this.__height = resizedHeight; this.__htmlCanvasElement = resizedCanvas; } if (this.autoDetectTransparency) { this.__hasTransparentPixels = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_5__.DataUtil.detectTransparentPixelExistence(img); } this.__width = img.width; this.__height = img.height; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); let texture = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.InvalidCGAPIResourceUid; (async () => { if (img instanceof HTMLImageElement) { texture = await cgApiResourceRepository.createTextureFromHTMLImageElement(img, { level, internalFormat, width: this.__width, height: this.__height, border: 0, format, type, generateMipmap, }); } else if (img instanceof HTMLCanvasElement) { const textureHandle = cgApiResourceRepository.createTextureFromImageBitmapData(img, { level, internalFormat, width: this.__width, height: this.__height, border: 0, format, type, generateMipmap, }); texture = textureHandle; } else { throw new Error('Unsupported image type'); } this.__setTextureResourceUid(texture, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__isTextureReady = true; this.__uriToLoadLazy = undefined; resolve(); })(); }; this.__img.src = imageUri; }); } generate1x1TextureFrom(rgbaStr = 'rgba(255,255,255,1)') { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; this.__width = 1; this.__height = 1; const ctx = canvas.getContext('2d'); ctx.fillStyle = rgbaStr; ctx.fillRect(0, 0, 1, 1); const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const textureHandle = cgApiResourceRepository.createTextureFromImageBitmapData(canvas, { level: 0, internalFormat: _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8, width: 1, height: 1, border: 0, format: _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap: false, }); this.__setTextureResourceUid(textureHandle, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__isTextureReady = true; } async generateSheenLutTextureFromDataUri() { const moduleName = 'pbr'; const moduleManager = _system_ModuleManager__WEBPACK_IMPORTED_MODULE_7__.ModuleManager.getInstance(); const pbrModule = moduleManager.getModule(moduleName); const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const textureHandle = await cgApiResourceRepository.createTextureFromDataUri(pbrModule.sheen_E_and_DGTerm, { level: 0, internalFormat: _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_10__.TextureFormat.RGBA8, border: 0, format: _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap: false, }); this.__setTextureResourceUid(textureHandle, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__isTextureReady = true; } allocate(desc) { var _a; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); desc.mipLevelCount = (_a = desc.mipLevelCount) !== null && _a !== void 0 ? _a : Math.floor(Math.log2(Math.max(desc.width, desc.height))) + 1; const texture = cgApiResourceRepository.allocateTexture({ mipLevelCount: desc.mipLevelCount, width: desc.width, height: desc.height, format: desc.format, }); this.__setTextureResourceUid(texture, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__width = desc.width; this.__height = desc.height; this.__mipLevelCount = desc.mipLevelCount; this.__internalFormat = desc.format; } async loadImageToMipLevel(desc) { const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); await webGLResourceRepository.loadImageToMipLevelOfTexture2D({ mipLevel: desc.mipLevel, textureUid: this._textureResourceUid, format: this.__internalFormat, type: desc.type, xOffset: desc.xOffset, yOffset: desc.yOffset, width: desc.width, height: desc.height, rowSizeByPixel: desc.rowSizeByPixel, data: desc.data, }); if (desc.mipLevel === 0) { this.__isTextureReady = true; } } generateCompressedTextureFromTypedArray(typedArray, width, height, compressionTextureType) { this.__width = width; this.__height = height; const textureData = { level: 0, width, height, buffer: typedArray, }; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const texture = cgApiResourceRepository.createCompressedTexture([textureData], compressionTextureType); this.__setTextureResourceUid(texture, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__isTextureReady = true; } generateCompressedTextureWithMipmapFromTypedArray(textureDataArray, compressionTextureType) { const originalTextureData = textureDataArray.find((textureData) => textureData.level === 0); if (originalTextureData == null) { throw new Error('texture data with level 0 is not found'); } this.__width = originalTextureData.width; this.__height = originalTextureData.height; const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const texture = cgApiResourceRepository.createCompressedTexture(textureDataArray, compressionTextureType); this.__setTextureResourceUid(texture, this.uniqueName); if (_system_SystemState__WEBPACK_IMPORTED_MODULE_9__.SystemState.currentProcessApproach === _definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_8__.ProcessApproach.WebGPU) { this._textureViewResourceUid = cgApiResourceRepository.createTextureView2d(this._textureResourceUid); } this.__isTextureReady = true; } /** * Generate mipmaps for the texture. */ generateMipmaps() { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.generateMipmaps2d(this._textureResourceUid, this.__width, this.__height); } importWebGLTextureDirectly(webGLTexture, width = 0, height = 0) { this.__width = width; this.__height = height; const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); const texture = webGLResourceRepository.setWebGLTextureDirectly(webGLTexture); this.__setTextureResourceUid(texture, this.uniqueName); this.__startedToLoad = true; this.__isTextureReady = true; } destroy3DAPIResources() { Texture.__deleteInternalTexture(this._textureResourceUid); this._textureResourceUid = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__isTextureReady = false; this.__startedToLoad = false; return true; } static __deleteInternalTexture(textureResourceUid) { const cgApiResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); cgApiResourceRepository.deleteTexture(textureResourceUid); } [Symbol.dispose]() { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.debug('[Symbol.dispose] is called'); this.destroy(); } destroy() { this.destroy3DAPIResources(); this.unregister(); Texture.managedRegistry.unregister(this); } } Texture.__loadedBasisFunc = false; Texture.managedRegistry = new FinalizationRegistry((texObj) => { _misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(`WebGL/WebGPU texture "${texObj.uniqueName}" was automatically released along with GC. But explicit release is recommended.`); Texture.__deleteInternalTexture(texObj.textureResourceUid); }); /***/ }), /***/ "./src/foundation/textures/TextureDataFloat.ts": /*!*****************************************************!*\ !*** ./src/foundation/textures/TextureDataFloat.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TextureDataFloat: () => (/* binding */ TextureDataFloat) /* harmony export */ }); class TextureDataFloat { constructor(width, height, channels) { this.__channels = channels; this.__width = width; this.__height = height; this.__data = new Float32Array(width * height * channels); } resize(width, height, channels) { this.__width = width; this.__height = height; this.__channels = channels; this.__data = new Float32Array(TextureDataFloat.transfer(this.__data.buffer, width * height * channels * 4)); } setPixelAtChannel(x, y, channelIdx, value) { this.__data[y * this.__width * this.__channels + x * this.__channels + channelIdx] = value; } get width() { return this.__width; } get height() { return this.__height; } get data() { return this.__data; } getPixel(x, y, channelIdx) { return this.__data[y * this.__width * this.__channels + x * this.__channels + channelIdx]; } getPixelAs(x, y, channels, typeClass) { if (channels === 3) { return new typeClass(new Float32Array([ this.__data[y * this.__width * this.__channels + x * this.__channels + 0], this.__data[y * this.__width * this.__channels + x * this.__channels + 1], this.__data[y * this.__width * this.__channels + x * this.__channels + 2], ])); } else if (channels === 4) { return new typeClass(new Float32Array([ this.__data[y * this.__width * this.__channels + x * this.__channels + 0], this.__data[y * this.__width * this.__channels + x * this.__channels + 1], this.__data[y * this.__width * this.__channels + x * this.__channels + 2], this.__data[y * this.__width * this.__channels + x * this.__channels + 3], ])); } } getPixelAsArray(x, y) { const array = []; for (let i = 0; i < this.__channels; i++) { array.push(this.__data[y * this.__width * this.__channels + x * this.__channels + i]); } return array; } initialize(width, height, channels) { this.__width = width; this.__height = height; this.__channels = channels; this.__data = new Float32Array(width * height * channels); } static transfer(source, length) { source = Object(source); const dest = new ArrayBuffer(length); if (!(source instanceof ArrayBuffer) || !(dest instanceof ArrayBuffer)) { throw new TypeError('Source and destination must be ArrayBuffer instances'); } if (dest.byteLength >= source.byteLength) { let nextOffset = 0; let leftBytes = source.byteLength; const wordSizes = [8, 4, 2, 1]; wordSizes.forEach((_wordSize_) => { if (leftBytes >= _wordSize_) { const done = transferWith(_wordSize_, source, dest, nextOffset, leftBytes); nextOffset = done.nextOffset; leftBytes = done.leftBytes; } }); } return dest; function transferWith(wordSize, source, dest, nextOffset, leftBytes) { let ViewClass = Uint8Array; switch (wordSize) { case 8: ViewClass = Float64Array; break; case 4: ViewClass = Float32Array; break; case 2: ViewClass = Uint16Array; break; case 1: ViewClass = Uint8Array; break; default: ViewClass = Uint8Array; break; } const view_source = new ViewClass(source, nextOffset, Math.trunc(leftBytes / wordSize)); const view_dest = new ViewClass(dest, nextOffset, Math.trunc(leftBytes / wordSize)); for (let i = 0; i < view_dest.length; i++) { view_dest[i] = view_source[i]; } return { nextOffset: view_source.byteOffset + view_source.byteLength, leftBytes: source.byteLength - (view_source.byteOffset + view_source.byteLength), }; } } } /***/ }), /***/ "./src/foundation/textures/VideoTexture.ts": /*!*************************************************!*\ !*** ./src/foundation/textures/VideoTexture.ts ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VideoTexture: () => (/* binding */ VideoTexture) /* harmony export */ }); /* harmony import */ var _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _AbstractTexture__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _VideoTexture_htmlVideoElement; class VideoTexture extends _AbstractTexture__WEBPACK_IMPORTED_MODULE_2__.AbstractTexture { constructor() { super(); this.autoResize = true; this.autoDetectTransparency = false; _VideoTexture_htmlVideoElement.set(this, void 0); } __getResizedCanvas(image, maxSize) { const canvas = document.createElement('canvas'); const potWidth = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.getNearestPowerOfTwo(image.width); const potHeight = _misc_DataUtil__WEBPACK_IMPORTED_MODULE_4__.DataUtil.getNearestPowerOfTwo(image.height); const aspect = potHeight / potWidth; let dstWidth = 0; let dstHeight = 0; if (potWidth > potHeight) { dstWidth = Math.min(potWidth, maxSize); dstHeight = dstWidth * aspect; } else { dstHeight = Math.min(potHeight, maxSize); dstWidth = dstHeight / aspect; } canvas.width = dstWidth; canvas.height = dstHeight; const ctx = canvas.getContext('2d'); ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, dstWidth, dstHeight); if (this.autoDetectTransparency) { this.__imageData = ctx.getImageData(0, 0, dstWidth, dstHeight); for (let y = 0; y < dstHeight; y++) { for (let x = 0; x < dstWidth; x++) { const alpha = this.__imageData.data[(x + y * dstWidth) * 4 + 3]; if (alpha < 1) { this.__hasTransparentPixels = true; return canvas; } } } this.__hasTransparentPixels = false; } return canvas; } generateTextureFromVideo(video, { level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__.TextureFormat.RGBA8, format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap = false, mutedAutoPlay = true, } = {}) { this.__startedToLoad = true; __classPrivateFieldSet(this, _VideoTexture_htmlVideoElement, video, "f"); if (mutedAutoPlay) { video.autoplay = true; video.muted = true; } const img = video; this.__width = img.videoWidth; this.__height = img.videoHeight; const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const textureHandle = webGLResourceRepository.createTextureFromImageBitmapData(img, { level: level, internalFormat: internalFormat, width: this.__width, height: this.__height, border: 0, format: format, type: type, generateMipmap: generateMipmap, }); this._textureResourceUid = textureHandle; this.__isTextureReady = true; this.__uri = video.src; } generateTextureFromUri(videoUri, { level = 0, internalFormat = _definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_5__.TextureFormat.RGBA8, format = _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type = _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, generateMipmap = false, mutedAutoPlay = true, playButtonDomElement = undefined, } = {}) { this.__uri = videoUri; this.__startedToLoad = true; return new Promise((resolve, reject) => { const button = playButtonDomElement; const setupTexture = () => { this.__width = video.videoWidth; this.__height = video.videoHeight; const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getCgApiResourceRepository(); const textureHandle = webGLResourceRepository.createTextureFromImageBitmapData(video, { level: level, internalFormat: internalFormat, width: this.__width, height: this.__height, border: 0, format: format, type: type, generateMipmap: generateMipmap, }); this._textureResourceUid = textureHandle; this.__isTextureReady = true; resolve(); }; button === null || button === void 0 ? void 0 : button.addEventListener('click', () => { setupTexture(); video.play(); }, true); const video = document.createElement('video'); video.crossOrigin = 'anonymous'; video.setAttribute('playsinline', 'playsinline'); if (mutedAutoPlay) { video.autoplay = true; video.muted = true; } video.preload = 'auto'; __classPrivateFieldSet(this, _VideoTexture_htmlVideoElement, video, "f"); video.addEventListener('canplaythrough', () => { setupTexture(); video.play(); }, true); video.addEventListener('ended', () => { video.play(); }, true); video.src = videoUri; }); } updateTexture() { const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); if (this.__isTextureReady && __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f")) { webGLResourceRepository.updateTexture(this._textureResourceUid, __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f"), { level: 0, xoffset: 0, yoffset: 0, width: this.__width, height: this.__height, format: _definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_0__.PixelFormat.RGBA, type: _definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.UnsignedByte, }); } } getCurrentFramePixelData() { let pixel = undefined; const webGLResourceRepository = _renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_3__.CGAPIResourceRepository.getWebGLResourceRepository(); if (this.__isTextureReady && __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f")) { pixel = webGLResourceRepository.getPixelDataFromTexture(this._textureResourceUid, 0, 0, this.width, this.height); } return [pixel, this.width, this.height]; } set playbackRate(value) { if (__classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f")) { __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f").playbackRate = value; } } get playbackRate() { var _a; const playbackRate = (_a = __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f")) === null || _a === void 0 ? void 0 : _a.playbackRate; return playbackRate !== null && playbackRate !== void 0 ? playbackRate : 1; } play() { var _a; (_a = __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f")) === null || _a === void 0 ? void 0 : _a.play(); } pause() { __classPrivateFieldGet(this, _VideoTexture_htmlVideoElement, "f").pause(); } } _VideoTexture_htmlVideoElement = new WeakMap(); VideoTexture.__loadedBasisFunc = false; /***/ }), /***/ "./src/foundation/textures/index.ts": /*!******************************************!*\ !*** ./src/foundation/textures/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AbstractTexture: () => (/* reexport safe */ _AbstractTexture__WEBPACK_IMPORTED_MODULE_0__.AbstractTexture), /* harmony export */ CubeTexture: () => (/* reexport safe */ _CubeTexture__WEBPACK_IMPORTED_MODULE_1__.CubeTexture), /* harmony export */ RenderBuffer: () => (/* reexport safe */ _RenderBuffer__WEBPACK_IMPORTED_MODULE_3__.RenderBuffer), /* harmony export */ RenderTargetTexture: () => (/* reexport safe */ _RenderTargetTexture__WEBPACK_IMPORTED_MODULE_4__.RenderTargetTexture), /* harmony export */ RenderTargetTextureCube: () => (/* reexport safe */ _RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_5__.RenderTargetTextureCube), /* harmony export */ Sampler: () => (/* reexport safe */ _Sampler__WEBPACK_IMPORTED_MODULE_9__.Sampler), /* harmony export */ Texture: () => (/* reexport safe */ _Texture__WEBPACK_IMPORTED_MODULE_6__.Texture), /* harmony export */ TextureDataFloat: () => (/* reexport safe */ _TextureDataFloat__WEBPACK_IMPORTED_MODULE_7__.TextureDataFloat), /* harmony export */ VideoTexture: () => (/* reexport safe */ _VideoTexture__WEBPACK_IMPORTED_MODULE_8__.VideoTexture) /* harmony export */ }); /* harmony import */ var _AbstractTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AbstractTexture */ "./src/foundation/textures/AbstractTexture.ts"); /* harmony import */ var _CubeTexture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CubeTexture */ "./src/foundation/textures/CubeTexture.ts"); /* harmony import */ var _IRenderable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IRenderable */ "./src/foundation/textures/IRenderable.ts"); /* harmony import */ var _RenderBuffer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RenderBuffer */ "./src/foundation/textures/RenderBuffer.ts"); /* harmony import */ var _RenderTargetTexture__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RenderTargetTexture */ "./src/foundation/textures/RenderTargetTexture.ts"); /* harmony import */ var _RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RenderTargetTextureCube */ "./src/foundation/textures/RenderTargetTextureCube.ts"); /* harmony import */ var _Texture__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Texture */ "./src/foundation/textures/Texture.ts"); /* harmony import */ var _TextureDataFloat__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TextureDataFloat */ "./src/foundation/textures/TextureDataFloat.ts"); /* harmony import */ var _VideoTexture__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./VideoTexture */ "./src/foundation/textures/VideoTexture.ts"); /* harmony import */ var _Sampler__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Sampler */ "./src/foundation/textures/Sampler.ts"); /***/ }), /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AABB: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AABB), /* harmony export */ AABBGizmo: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AABBGizmo), /* harmony export */ AbsoluteAnimation: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbsoluteAnimation), /* harmony export */ AbstractArrayBufferBaseMathNumber: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractArrayBufferBaseMathNumber), /* harmony export */ AbstractCameraController: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractCameraController), /* harmony export */ AbstractMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractMaterialContent), /* harmony export */ AbstractMatrix: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractMatrix), /* harmony export */ AbstractQuaternion: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractQuaternion), /* harmony export */ AbstractShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractShaderNode), /* harmony export */ AbstractTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractTexture), /* harmony export */ AbstractVector: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AbstractVector), /* harmony export */ Accessor: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Accessor), /* harmony export */ AddShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AddShaderNode), /* harmony export */ AlphaMode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AlphaMode), /* harmony export */ AnimationAssigner: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AnimationAssigner), /* harmony export */ AnimationAttribute: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AnimationAttribute), /* harmony export */ AnimationComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AnimationComponent), /* harmony export */ AnimationInterpolation: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AnimationInterpolation), /* harmony export */ AttributeColorShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AttributeColorShaderNode), /* harmony export */ AttributeNormalShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AttributeNormalShaderNode), /* harmony export */ AttributePositionShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AttributePositionShaderNode), /* harmony export */ AttributeTexcoordShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.AttributeTexcoordShaderNode), /* harmony export */ Axis: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Axis), /* harmony export */ BasisCompressionType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BasisCompressionType), /* harmony export */ BlendShapeComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BlendShapeComponent), /* harmony export */ BlockBeginShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.BlockBeginShader), /* harmony export */ BlockBeginShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BlockBeginShaderNode), /* harmony export */ BlockEndShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.BlockEndShader), /* harmony export */ BlockEndShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BlockEndShaderNode), /* harmony export */ BoneDataType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BoneDataType), /* harmony export */ Buffer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Buffer), /* harmony export */ BufferUse: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BufferUse), /* harmony export */ BufferView: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.BufferView), /* harmony export */ CGAPIResourceRepository: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository), /* harmony export */ Cache: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Cache), /* harmony export */ CameraComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CameraComponent), /* harmony export */ CameraControllerComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CameraControllerComponent), /* harmony export */ CameraControllerType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CameraControllerType), /* harmony export */ CameraType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CameraType), /* harmony export */ CapsuleCollider: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CapsuleCollider), /* harmony export */ ClassicShadingShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.ClassicShadingShader), /* harmony export */ ColorGradingUsingLUTsMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ColorGradingUsingLUTsMaterialContent), /* harmony export */ ColorRgb: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ColorRgb), /* harmony export */ ColorRgba: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ColorRgba), /* harmony export */ CommonShaderPart: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.CommonShaderPart), /* harmony export */ ComplexVertexAttribute: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ComplexVertexAttribute), /* harmony export */ Component: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Component), /* harmony export */ ComponentRepository: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ComponentRepository), /* harmony export */ ComponentType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ComponentType), /* harmony export */ CompositionType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CompositionType), /* harmony export */ CompressionTextureType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CompressionTextureType), /* harmony export */ Config: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Config), /* harmony export */ ConstRgbaBlack: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstRgbaBlack), /* harmony export */ ConstRgbaWhite: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstRgbaWhite), /* harmony export */ ConstVector2_0_0: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector2_0_0), /* harmony export */ ConstVector2_1_1: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector2_1_1), /* harmony export */ ConstVector3_0_0_0: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector3_0_0_0), /* harmony export */ ConstVector3_1_1_1: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector3_1_1_1), /* harmony export */ ConstVector4_0_0_0_0: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector4_0_0_0_0), /* harmony export */ ConstVector4_0_0_0_1: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector4_0_0_0_1), /* harmony export */ ConstVector4_1_1_1_1: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstVector4_1_1_1_1), /* harmony export */ ConstantScalarVariableShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstantScalarVariableShaderNode), /* harmony export */ ConstantVariableShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.ConstantVariableShader), /* harmony export */ ConstantVector2VariableShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstantVector2VariableShaderNode), /* harmony export */ ConstantVector3VariableShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstantVector3VariableShaderNode), /* harmony export */ ConstantVector4VariableShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ConstantVector4VariableShaderNode), /* harmony export */ Cube: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Cube), /* harmony export */ CubeTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CubeTexture), /* harmony export */ CustomMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.CustomMaterialContent), /* harmony export */ DataUtil: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.DataUtil), /* harmony export */ DefaultTextures: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.DefaultTextures), /* harmony export */ DepthEncodeMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.DepthEncodeMaterialContent), /* harmony export */ DetectHighLuminanceMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.DetectHighLuminanceMaterialContent), /* harmony export */ DotProductShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.DotProductShaderNode), /* harmony export */ DrcPointCloudImporter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.DrcPointCloudImporter), /* harmony export */ EVENT_CLICK: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_CLICK), /* harmony export */ EVENT_KEY_DOWN: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_KEY_DOWN), /* harmony export */ EVENT_KEY_PRESS: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_KEY_PRESS), /* harmony export */ EVENT_KEY_UP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_KEY_UP), /* harmony export */ EVENT_MOUSE_DOWN: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_DOWN), /* harmony export */ EVENT_MOUSE_ENTER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_ENTER), /* harmony export */ EVENT_MOUSE_LEAVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_LEAVE), /* harmony export */ EVENT_MOUSE_MOVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_MOVE), /* harmony export */ EVENT_MOUSE_OVER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_OVER), /* harmony export */ EVENT_MOUSE_UP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_UP), /* harmony export */ EVENT_MOUSE_WHEEL: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MOUSE_WHEEL), /* harmony export */ EVENT_MSPOINTER_DOWN: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MSPOINTER_DOWN), /* harmony export */ EVENT_MSPOINTER_MOVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MSPOINTER_MOVE), /* harmony export */ EVENT_MSPOINTER_UP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_MSPOINTER_UP), /* harmony export */ EVENT_ORIENTATION_CHANGE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_ORIENTATION_CHANGE), /* harmony export */ EVENT_POINTER_CANCEL: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_CANCEL), /* harmony export */ EVENT_POINTER_DOWN: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_DOWN), /* harmony export */ EVENT_POINTER_ENTER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_ENTER), /* harmony export */ EVENT_POINTER_LEAVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_LEAVE), /* harmony export */ EVENT_POINTER_MOVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_MOVE), /* harmony export */ EVENT_POINTER_OUT: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_OUT), /* harmony export */ EVENT_POINTER_OVER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_OVER), /* harmony export */ EVENT_POINTER_UP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_POINTER_UP), /* harmony export */ EVENT_RESIZE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_RESIZE), /* harmony export */ EVENT_TOUCH_CANCEL: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_CANCEL), /* harmony export */ EVENT_TOUCH_DOUBLE_TAP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_DOUBLE_TAP), /* harmony export */ EVENT_TOUCH_DRAG: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_DRAG), /* harmony export */ EVENT_TOUCH_END: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_END), /* harmony export */ EVENT_TOUCH_ENTER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_ENTER), /* harmony export */ EVENT_TOUCH_HOLD: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_HOLD), /* harmony export */ EVENT_TOUCH_LEAVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_LEAVE), /* harmony export */ EVENT_TOUCH_LONG_TAP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_LONG_TAP), /* harmony export */ EVENT_TOUCH_MOVE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_MOVE), /* harmony export */ EVENT_TOUCH_OUT: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_OUT), /* harmony export */ EVENT_TOUCH_OVER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_OVER), /* harmony export */ EVENT_TOUCH_PINCH: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_PINCH), /* harmony export */ EVENT_TOUCH_START: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_START), /* harmony export */ EVENT_TOUCH_SWIPE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_SWIPE), /* harmony export */ EVENT_TOUCH_TAP: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EVENT_TOUCH_TAP), /* harmony export */ Effekseer: () => (/* reexport safe */ _effekseer_index__WEBPACK_IMPORTED_MODULE_4__.Effekseer), /* harmony export */ EffekseerComponent: () => (/* reexport safe */ _effekseer_index__WEBPACK_IMPORTED_MODULE_4__.EffekseerComponent), /* harmony export */ EndShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.EndShader), /* harmony export */ Entity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Entity), /* harmony export */ EntityRepository: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EntityRepository), /* harmony export */ EntityUIDOutputMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EntityUIDOutputMaterialContent), /* harmony export */ EnumClass: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EnumClass), /* harmony export */ Err: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Err), /* harmony export */ EventPubSub: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.EventPubSub), /* harmony export */ Expression: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Expression), /* harmony export */ ExpressionHelper: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ExpressionHelper), /* harmony export */ FileType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.FileType), /* harmony export */ ForwardRenderPipeline: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ForwardRenderPipeline), /* harmony export */ Frame: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Frame), /* harmony export */ FrameBuffer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.FrameBuffer), /* harmony export */ Frustum: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Frustum), /* harmony export */ FurnaceTestMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.FurnaceTestMaterialContent), /* harmony export */ GLTF2_EXPORT_DRACO: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_DRACO), /* harmony export */ GLTF2_EXPORT_EMBEDDED: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_EMBEDDED), /* harmony export */ GLTF2_EXPORT_GLB: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_GLB), /* harmony export */ GLTF2_EXPORT_GLTF: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_GLTF), /* harmony export */ GLTF2_EXPORT_NO_DOWNLOAD: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GLTF2_EXPORT_NO_DOWNLOAD), /* harmony export */ GL_ACTIVE_ATTRIBUTES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ACTIVE_ATTRIBUTES), /* harmony export */ GL_ACTIVE_TEXTURE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ACTIVE_TEXTURE), /* harmony export */ GL_ACTIVE_UNIFORMS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ACTIVE_UNIFORMS), /* harmony export */ GL_ACTIVE_UNIFORM_BLOCKS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ACTIVE_UNIFORM_BLOCKS), /* harmony export */ GL_ALIASED_LINE_WIDTH_RANGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ALIASED_LINE_WIDTH_RANGE), /* harmony export */ GL_ALIASED_POINT_SIZE_RANGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ALIASED_POINT_SIZE_RANGE), /* harmony export */ GL_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ALPHA), /* harmony export */ GL_ALPHA_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ALPHA_BITS), /* harmony export */ GL_ALREADY_SIGNALED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ALREADY_SIGNALED), /* harmony export */ GL_ALWAYS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ALWAYS), /* harmony export */ GL_ANY_SAMPLES_PASSED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ANY_SAMPLES_PASSED), /* harmony export */ GL_ANY_SAMPLES_PASSED_CONSERVATIVE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ANY_SAMPLES_PASSED_CONSERVATIVE), /* harmony export */ GL_ARRAY_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ARRAY_BUFFER), /* harmony export */ GL_ARRAY_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ARRAY_BUFFER_BINDING), /* harmony export */ GL_ATTACHED_SHADERS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ATTACHED_SHADERS), /* harmony export */ GL_BACK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BACK), /* harmony export */ GL_BLEND: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND), /* harmony export */ GL_BLEND_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_COLOR), /* harmony export */ GL_BLEND_DST_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_DST_ALPHA), /* harmony export */ GL_BLEND_DST_RGB: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_DST_RGB), /* harmony export */ GL_BLEND_EQUATION: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_EQUATION), /* harmony export */ GL_BLEND_EQUATION_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_EQUATION_ALPHA), /* harmony export */ GL_BLEND_EQUATION_RGB: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_EQUATION_RGB), /* harmony export */ GL_BLEND_SRC_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_SRC_ALPHA), /* harmony export */ GL_BLEND_SRC_RGB: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLEND_SRC_RGB), /* harmony export */ GL_BLUE_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BLUE_BITS), /* harmony export */ GL_BOOL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BOOL), /* harmony export */ GL_BOOL_VEC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BOOL_VEC2), /* harmony export */ GL_BOOL_VEC3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BOOL_VEC3), /* harmony export */ GL_BOOL_VEC4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BOOL_VEC4), /* harmony export */ GL_BROWSER_DEFAULT_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BROWSER_DEFAULT_WEBGL), /* harmony export */ GL_BUFFER_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BUFFER_SIZE), /* harmony export */ GL_BUFFER_USAGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_BUFFER_USAGE), /* harmony export */ GL_CCW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CCW), /* harmony export */ GL_CLAMP_TO_EDGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CLAMP_TO_EDGE), /* harmony export */ GL_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR), /* harmony export */ GL_COLOR_ATTACHMENT0: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT0), /* harmony export */ GL_COLOR_ATTACHMENT0_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT0_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT1: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT1), /* harmony export */ GL_COLOR_ATTACHMENT10: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT10), /* harmony export */ GL_COLOR_ATTACHMENT10_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT10_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT11: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT11), /* harmony export */ GL_COLOR_ATTACHMENT11_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT11_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT12: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT12), /* harmony export */ GL_COLOR_ATTACHMENT12_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT12_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT13: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT13), /* harmony export */ GL_COLOR_ATTACHMENT13_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT13_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT14: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT14), /* harmony export */ GL_COLOR_ATTACHMENT14_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT14_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT15: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT15), /* harmony export */ GL_COLOR_ATTACHMENT15_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT15_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT1_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT1_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT2), /* harmony export */ GL_COLOR_ATTACHMENT2_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT2_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT3), /* harmony export */ GL_COLOR_ATTACHMENT3_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT3_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT4), /* harmony export */ GL_COLOR_ATTACHMENT4_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT4_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT5: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT5), /* harmony export */ GL_COLOR_ATTACHMENT5_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT5_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT6: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT6), /* harmony export */ GL_COLOR_ATTACHMENT6_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT6_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT7: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT7), /* harmony export */ GL_COLOR_ATTACHMENT7_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT7_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT8), /* harmony export */ GL_COLOR_ATTACHMENT8_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT8_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT9: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT9), /* harmony export */ GL_COLOR_ATTACHMENT9_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_ATTACHMENT9_WEBGL), /* harmony export */ GL_COLOR_BUFFER_BIT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_BUFFER_BIT), /* harmony export */ GL_COLOR_CLEAR_VALUE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_CLEAR_VALUE), /* harmony export */ GL_COLOR_WRITEMASK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COLOR_WRITEMASK), /* harmony export */ GL_COMPARE_REF_TO_TEXTURE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPARE_REF_TO_TEXTURE), /* harmony export */ GL_COMPILE_STATUS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPILE_STATUS), /* harmony export */ GL_COMPRESSED_R11_EAC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_R11_EAC), /* harmony export */ GL_COMPRESSED_RG11_EAC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RG11_EAC), /* harmony export */ GL_COMPRESSED_RGB8_ETC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB8_ETC2), /* harmony export */ GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2), /* harmony export */ GL_COMPRESSED_RGBA8_ETC2_EAC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA8_ETC2_EAC), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X10_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_10X10_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_10X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X6_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_10X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X8_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_10X8_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_12X10_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_12X10_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_12X12_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_12X12_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_4X4_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_4X4_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_5X4_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_5X4_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_5X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_5X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_6X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_6X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_6X6_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_6X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_8X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X6_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_8X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X8_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ASTC_8X8_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL), /* harmony export */ GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL), /* harmony export */ GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT), /* harmony export */ GL_COMPRESSED_RGB_ATC_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB_ATC_WEBGL), /* harmony export */ GL_COMPRESSED_RGB_ETC1_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB_ETC1_WEBGL), /* harmony export */ GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGB_S3TC_DXT1_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_RGB_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_SIGNED_R11_EAC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SIGNED_R11_EAC), /* harmony export */ GL_COMPRESSED_SIGNED_RG11_EAC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SIGNED_RG11_EAC), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC), /* harmony export */ GL_COMPRESSED_SRGB8_ETC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_ETC2), /* harmony export */ GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT), /* harmony export */ GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_SRGB_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_TEXTURE_FORMATS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COMPRESSED_TEXTURE_FORMATS), /* harmony export */ GL_CONDITION_SATISFIED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CONDITION_SATISFIED), /* harmony export */ GL_CONSTANT_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CONSTANT_ALPHA), /* harmony export */ GL_CONSTANT_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CONSTANT_COLOR), /* harmony export */ GL_CONTEXT_LOST_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CONTEXT_LOST_WEBGL), /* harmony export */ GL_COPY_READ_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COPY_READ_BUFFER), /* harmony export */ GL_COPY_READ_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COPY_READ_BUFFER_BINDING), /* harmony export */ GL_COPY_WRITE_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COPY_WRITE_BUFFER), /* harmony export */ GL_COPY_WRITE_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_COPY_WRITE_BUFFER_BINDING), /* harmony export */ GL_CULL_FACE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CULL_FACE), /* harmony export */ GL_CULL_FACE_MODE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CULL_FACE_MODE), /* harmony export */ GL_CURRENT_PROGRAM: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CURRENT_PROGRAM), /* harmony export */ GL_CURRENT_QUERY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CURRENT_QUERY), /* harmony export */ GL_CURRENT_QUERY_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CURRENT_QUERY_EXT), /* harmony export */ GL_CURRENT_VERTEX_ATTRIB: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CURRENT_VERTEX_ATTRIB), /* harmony export */ GL_CW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_CW), /* harmony export */ GL_DATA_BYTE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_BYTE), /* harmony export */ GL_DATA_FLOAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_FLOAT), /* harmony export */ GL_DATA_INT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_INT), /* harmony export */ GL_DATA_SHORT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_SHORT), /* harmony export */ GL_DATA_UNSIGNED_BYTE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_UNSIGNED_BYTE), /* harmony export */ GL_DATA_UNSIGNED_INT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_UNSIGNED_INT), /* harmony export */ GL_DATA_UNSIGNED_SHORT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DATA_UNSIGNED_SHORT), /* harmony export */ GL_DECR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DECR), /* harmony export */ GL_DECR_WRAP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DECR_WRAP), /* harmony export */ GL_DELETE_STATUS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DELETE_STATUS), /* harmony export */ GL_DEPTH: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH), /* harmony export */ GL_DEPTH24_STENCIL8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH24_STENCIL8), /* harmony export */ GL_DEPTH32F_STENCIL8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH32F_STENCIL8), /* harmony export */ GL_DEPTH_ATTACHMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_ATTACHMENT), /* harmony export */ GL_DEPTH_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_BITS), /* harmony export */ GL_DEPTH_BUFFER_BIT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_BUFFER_BIT), /* harmony export */ GL_DEPTH_CLEAR_VALUE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_CLEAR_VALUE), /* harmony export */ GL_DEPTH_COMPONENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_COMPONENT), /* harmony export */ GL_DEPTH_COMPONENT16: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_COMPONENT16), /* harmony export */ GL_DEPTH_COMPONENT24: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_COMPONENT24), /* harmony export */ GL_DEPTH_COMPONENT32F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_COMPONENT32F), /* harmony export */ GL_DEPTH_FUNC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_FUNC), /* harmony export */ GL_DEPTH_RANGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_RANGE), /* harmony export */ GL_DEPTH_STENCIL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_STENCIL), /* harmony export */ GL_DEPTH_STENCIL_ATTACHMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_STENCIL_ATTACHMENT), /* harmony export */ GL_DEPTH_TEST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_TEST), /* harmony export */ GL_DEPTH_WRITEMASK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DEPTH_WRITEMASK), /* harmony export */ GL_DITHER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DITHER), /* harmony export */ GL_DONT_CARE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DONT_CARE), /* harmony export */ GL_DRAW_BUFFER0: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER0), /* harmony export */ GL_DRAW_BUFFER0_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER0_WEBGL), /* harmony export */ GL_DRAW_BUFFER1: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER1), /* harmony export */ GL_DRAW_BUFFER10: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER10), /* harmony export */ GL_DRAW_BUFFER10_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER10_WEBGL), /* harmony export */ GL_DRAW_BUFFER11: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER11), /* harmony export */ GL_DRAW_BUFFER11_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER11_WEBGL), /* harmony export */ GL_DRAW_BUFFER12: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER12), /* harmony export */ GL_DRAW_BUFFER12_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER12_WEBGL), /* harmony export */ GL_DRAW_BUFFER13: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER13), /* harmony export */ GL_DRAW_BUFFER13_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER13_WEBGL), /* harmony export */ GL_DRAW_BUFFER14: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER14), /* harmony export */ GL_DRAW_BUFFER14_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER14_WEBGL), /* harmony export */ GL_DRAW_BUFFER15: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER15), /* harmony export */ GL_DRAW_BUFFER15_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER15_WEBGL), /* harmony export */ GL_DRAW_BUFFER1_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER1_WEBGL), /* harmony export */ GL_DRAW_BUFFER2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER2), /* harmony export */ GL_DRAW_BUFFER2_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER2_WEBGL), /* harmony export */ GL_DRAW_BUFFER3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER3), /* harmony export */ GL_DRAW_BUFFER3_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER3_WEBGL), /* harmony export */ GL_DRAW_BUFFER4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER4), /* harmony export */ GL_DRAW_BUFFER4_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER4_WEBGL), /* harmony export */ GL_DRAW_BUFFER5: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER5), /* harmony export */ GL_DRAW_BUFFER5_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER5_WEBGL), /* harmony export */ GL_DRAW_BUFFER6: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER6), /* harmony export */ GL_DRAW_BUFFER6_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER6_WEBGL), /* harmony export */ GL_DRAW_BUFFER7: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER7), /* harmony export */ GL_DRAW_BUFFER7_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER7_WEBGL), /* harmony export */ GL_DRAW_BUFFER8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER8), /* harmony export */ GL_DRAW_BUFFER8_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER8_WEBGL), /* harmony export */ GL_DRAW_BUFFER9: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER9), /* harmony export */ GL_DRAW_BUFFER9_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_BUFFER9_WEBGL), /* harmony export */ GL_DRAW_FRAMEBUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_FRAMEBUFFER), /* harmony export */ GL_DRAW_FRAMEBUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DRAW_FRAMEBUFFER_BINDING), /* harmony export */ GL_DST_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DST_ALPHA), /* harmony export */ GL_DST_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DST_COLOR), /* harmony export */ GL_DYNAMIC_COPY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DYNAMIC_COPY), /* harmony export */ GL_DYNAMIC_DRAW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DYNAMIC_DRAW), /* harmony export */ GL_DYNAMIC_READ: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_DYNAMIC_READ), /* harmony export */ GL_ELEMENT_ARRAY_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ELEMENT_ARRAY_BUFFER), /* harmony export */ GL_ELEMENT_ARRAY_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ELEMENT_ARRAY_BUFFER_BINDING), /* harmony export */ GL_EQUAL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_EQUAL), /* harmony export */ GL_FASTEST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FASTEST), /* harmony export */ GL_FLOAT_32_UNSIGNED_INT_24_8_REV: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_32_UNSIGNED_INT_24_8_REV), /* harmony export */ GL_FLOAT_MAT2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT2), /* harmony export */ GL_FLOAT_MAT2X3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT2X3), /* harmony export */ GL_FLOAT_MAT2X4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT2X4), /* harmony export */ GL_FLOAT_MAT3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT3), /* harmony export */ GL_FLOAT_MAT3X2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT3X2), /* harmony export */ GL_FLOAT_MAT3X4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT3X4), /* harmony export */ GL_FLOAT_MAT4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT4), /* harmony export */ GL_FLOAT_MAT4X2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT4X2), /* harmony export */ GL_FLOAT_MAT4X3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_MAT4X3), /* harmony export */ GL_FLOAT_VEC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_VEC2), /* harmony export */ GL_FLOAT_VEC3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_VEC3), /* harmony export */ GL_FLOAT_VEC4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FLOAT_VEC4), /* harmony export */ GL_FRAGMENT_SHADER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAGMENT_SHADER), /* harmony export */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAGMENT_SHADER_DERIVATIVE_HINT), /* harmony export */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES), /* harmony export */ GL_FRAMEBUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL), /* harmony export */ GL_FRAMEBUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_BINDING), /* harmony export */ GL_FRAMEBUFFER_COMPLETE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_COMPLETE), /* harmony export */ GL_FRAMEBUFFER_DEFAULT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_DEFAULT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE), /* harmony export */ GL_FRAMEBUFFER_UNSUPPORTED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRAMEBUFFER_UNSUPPORTED), /* harmony export */ GL_FRONT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRONT), /* harmony export */ GL_FRONT_AND_BACK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRONT_AND_BACK), /* harmony export */ GL_FRONT_FACE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FRONT_FACE), /* harmony export */ GL_FUNC_ADD: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FUNC_ADD), /* harmony export */ GL_FUNC_REVERSE_SUBTRACT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FUNC_REVERSE_SUBTRACT), /* harmony export */ GL_FUNC_SUBSTRACT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_FUNC_SUBSTRACT), /* harmony export */ GL_GENERATE_MIPMAP_HINT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_GENERATE_MIPMAP_HINT), /* harmony export */ GL_GEQUAL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_GEQUAL), /* harmony export */ GL_GPU_DISJOINT_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_GPU_DISJOINT_EXT), /* harmony export */ GL_GREATER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_GREATER), /* harmony export */ GL_GREEN_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_GREEN_BITS), /* harmony export */ GL_HALF_FLOAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_HALF_FLOAT), /* harmony export */ GL_HALF_FLOAT_OES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_HALF_FLOAT_OES), /* harmony export */ GL_HIGH_FLOAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_HIGH_FLOAT), /* harmony export */ GL_HIGH_INT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_HIGH_INT), /* harmony export */ GL_IMPLEMENTATION_COLOR_READ_FORMAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_IMPLEMENTATION_COLOR_READ_FORMAT), /* harmony export */ GL_IMPLEMENTATION_COLOR_READ_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_IMPLEMENTATION_COLOR_READ_TYPE), /* harmony export */ GL_INCR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INCR), /* harmony export */ GL_INCR_WRAP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INCR_WRAP), /* harmony export */ GL_INTERLEAVED_ATTRIBS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INTERLEAVED_ATTRIBS), /* harmony export */ GL_INT_2_10_10_10_REV: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_2_10_10_10_REV), /* harmony export */ GL_INT_SAMPLER_2D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_SAMPLER_2D), /* harmony export */ GL_INT_SAMPLER_2D_ARRAY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_SAMPLER_2D_ARRAY), /* harmony export */ GL_INT_SAMPLER_3D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_SAMPLER_3D), /* harmony export */ GL_INT_SAMPLER_CUBE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_SAMPLER_CUBE), /* harmony export */ GL_INT_VEC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_VEC2), /* harmony export */ GL_INT_VEC3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_VEC3), /* harmony export */ GL_INT_VEC4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INT_VEC4), /* harmony export */ GL_INVALID_ENUM: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INVALID_ENUM), /* harmony export */ GL_INVALID_FRAMEBUFFER_OPERATION: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INVALID_FRAMEBUFFER_OPERATION), /* harmony export */ GL_INVALID_INDEX: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INVALID_INDEX), /* harmony export */ GL_INVALID_OPERATION: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INVALID_OPERATION), /* harmony export */ GL_INVALID_VALUE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INVALID_VALUE), /* harmony export */ GL_INVERT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_INVERT), /* harmony export */ GL_KEEP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_KEEP), /* harmony export */ GL_LEQUAL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LEQUAL), /* harmony export */ GL_LESS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LESS), /* harmony export */ GL_LINEAR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINEAR), /* harmony export */ GL_LINEAR_MIPMAP_LINEAR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINEAR_MIPMAP_LINEAR), /* harmony export */ GL_LINEAR_MIPMAP_NEAREST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINEAR_MIPMAP_NEAREST), /* harmony export */ GL_LINES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINES), /* harmony export */ GL_LINE_LOOP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINE_LOOP), /* harmony export */ GL_LINE_STRIP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINE_STRIP), /* harmony export */ GL_LINE_WIDTH: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINE_WIDTH), /* harmony export */ GL_LINK_STATUS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LINK_STATUS), /* harmony export */ GL_LOW_FLOAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LOW_FLOAT), /* harmony export */ GL_LOW_INT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LOW_INT), /* harmony export */ GL_LUMINANCE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LUMINANCE), /* harmony export */ GL_LUMINANCE_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_LUMINANCE_ALPHA), /* harmony export */ GL_MAX: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX), /* harmony export */ GL_MAX_3D_TEXTURE_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_3D_TEXTURE_SIZE), /* harmony export */ GL_MAX_ARRAY_TEXTURE_LAYERS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_ARRAY_TEXTURE_LAYERS), /* harmony export */ GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL), /* harmony export */ GL_MAX_COLOR_ATTACHMENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_COLOR_ATTACHMENTS), /* harmony export */ GL_MAX_COLOR_ATTACHMENTS_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_COLOR_ATTACHMENTS_WEBGL), /* harmony export */ GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_COMBINED_UNIFORM_BLOCKS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_COMBINED_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_CUBE_MAP_TEXTURE_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_CUBE_MAP_TEXTURE_SIZE), /* harmony export */ GL_MAX_DRAW_BUFFERS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_DRAW_BUFFERS), /* harmony export */ GL_MAX_DRAW_BUFFERS_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_DRAW_BUFFERS_WEBGL), /* harmony export */ GL_MAX_ELEMENTS_INDICES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_ELEMENTS_INDICES), /* harmony export */ GL_MAX_ELEMENTS_VERTICES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_ELEMENTS_VERTICES), /* harmony export */ GL_MAX_ELEMENT_INDEX: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_ELEMENT_INDEX), /* harmony export */ GL_MAX_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_EXT), /* harmony export */ GL_MAX_FRAGMENT_INPUT_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_FRAGMENT_INPUT_COMPONENTS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_BLOCKS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_FRAGMENT_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_VECTORS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_FRAGMENT_UNIFORM_VECTORS), /* harmony export */ GL_MAX_PROGRAM_TEXEL_OFFSET: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_PROGRAM_TEXEL_OFFSET), /* harmony export */ GL_MAX_RENDERBUFFER_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_RENDERBUFFER_SIZE), /* harmony export */ GL_MAX_SAMPLES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_SAMPLES), /* harmony export */ GL_MAX_SERVER_WAIT_TIMEOUT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_SERVER_WAIT_TIMEOUT), /* harmony export */ GL_MAX_TEXTURE_IMAGE_UNITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_TEXTURE_LOD_BIAS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TEXTURE_LOD_BIAS), /* harmony export */ GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT), /* harmony export */ GL_MAX_TEXTURE_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TEXTURE_SIZE), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS), /* harmony export */ GL_MAX_UNIFORM_BLOCK_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_UNIFORM_BLOCK_SIZE), /* harmony export */ GL_MAX_UNIFORM_BUFFER_BINDINGS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_UNIFORM_BUFFER_BINDINGS), /* harmony export */ GL_MAX_VARYING_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VARYING_COMPONENTS), /* harmony export */ GL_MAX_VARYING_VECTORS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VARYING_VECTORS), /* harmony export */ GL_MAX_VERTEX_ATTRIBS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VERTEX_ATTRIBS), /* harmony export */ GL_MAX_VERTEX_OUTPUT_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VERTEX_OUTPUT_COMPONENTS), /* harmony export */ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_BLOCKS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VERTEX_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_COMPONENTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VERTEX_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_VECTORS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VERTEX_UNIFORM_VECTORS), /* harmony export */ GL_MAX_VIEWPORT_DIMS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MAX_VIEWPORT_DIMS), /* harmony export */ GL_MEDIUM_FLOAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MEDIUM_FLOAT), /* harmony export */ GL_MEDIUM_INT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MEDIUM_INT), /* harmony export */ GL_MIN: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MIN), /* harmony export */ GL_MIN_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MIN_EXT), /* harmony export */ GL_MIN_PROGRAM_TEXEL_OFFSET: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MIN_PROGRAM_TEXEL_OFFSET), /* harmony export */ GL_MIRRORED_REPEAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_MIRRORED_REPEAT), /* harmony export */ GL_NEAREST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NEAREST), /* harmony export */ GL_NEAREST_MIPMAP_LINEAR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NEAREST_MIPMAP_LINEAR), /* harmony export */ GL_NEAREST_MIPMAP_NEAREST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NEAREST_MIPMAP_NEAREST), /* harmony export */ GL_NEVER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NEVER), /* harmony export */ GL_NICEST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NICEST), /* harmony export */ GL_NONE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NONE), /* harmony export */ GL_NOTEQUAL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NOTEQUAL), /* harmony export */ GL_NO_ERROR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_NO_ERROR), /* harmony export */ GL_OBJECT_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_OBJECT_TYPE), /* harmony export */ GL_ONE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE), /* harmony export */ GL_ONE_MINUS_CONSTANT_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE_MINUS_CONSTANT_ALPHA), /* harmony export */ GL_ONE_MINUS_CONSTANT_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE_MINUS_CONSTANT_COLOR), /* harmony export */ GL_ONE_MINUS_DST_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE_MINUS_DST_ALPHA), /* harmony export */ GL_ONE_MINUS_DST_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE_MINUS_DST_COLOR), /* harmony export */ GL_ONE_MINUS_SRC_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE_MINUS_SRC_ALPHA), /* harmony export */ GL_ONE_MINUS_SRC_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ONE_MINUS_SRC_COLOR), /* harmony export */ GL_OUT_OF_MEMORY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_OUT_OF_MEMORY), /* harmony export */ GL_PACK_ALIGNMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PACK_ALIGNMENT), /* harmony export */ GL_PACK_ROW_LENGTH: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PACK_ROW_LENGTH), /* harmony export */ GL_PACK_SKIP_PIXELS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PACK_SKIP_PIXELS), /* harmony export */ GL_PACK_SKIP_ROWS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PACK_SKIP_ROWS), /* harmony export */ GL_PIXEL_PACK_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_PACK_BUFFER), /* harmony export */ GL_PIXEL_PACK_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_PACK_BUFFER_BINDING), /* harmony export */ GL_PIXEL_UNPACK_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_UNPACK_BUFFER), /* harmony export */ GL_PIXEL_UNPACK_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_UNPACK_BUFFER_BINDING), /* harmony export */ GL_PIXEL_UNSIGNED_BYTE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_UNSIGNED_BYTE), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_4_4_4_4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_UNSIGNED_SHORT_4_4_4_4), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_5_5_5_1: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_UNSIGNED_SHORT_5_5_5_1), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_5_6_5: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_PIXEL_UNSIGNED_SHORT_5_6_5), /* harmony export */ GL_POINTS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_POINTS), /* harmony export */ GL_POLYGON_OFFSET_FACTOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_POLYGON_OFFSET_FACTOR), /* harmony export */ GL_POLYGON_OFFSET_FILL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_POLYGON_OFFSET_FILL), /* harmony export */ GL_POLYGON_OFFSET_UNITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_POLYGON_OFFSET_UNITS), /* harmony export */ GL_QUERY_COUNTER_BITS_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_QUERY_COUNTER_BITS_EXT), /* harmony export */ GL_QUERY_RESULT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_QUERY_RESULT), /* harmony export */ GL_QUERY_RESULT_AVAILABLE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_QUERY_RESULT_AVAILABLE), /* harmony export */ GL_QUERY_RESULT_AVAILABLE_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_QUERY_RESULT_AVAILABLE_EXT), /* harmony export */ GL_QUERY_RESULT_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_QUERY_RESULT_EXT), /* harmony export */ GL_R11F_G11F_B10F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R11F_G11F_B10F), /* harmony export */ GL_R16F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R16F), /* harmony export */ GL_R16I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R16I), /* harmony export */ GL_R16UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R16UI), /* harmony export */ GL_R32F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R32F), /* harmony export */ GL_R32I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R32I), /* harmony export */ GL_R32UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R32UI), /* harmony export */ GL_R8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R8), /* harmony export */ GL_R8I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R8I), /* harmony export */ GL_R8UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R8UI), /* harmony export */ GL_R8_SNORM: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_R8_SNORM), /* harmony export */ GL_RASTERIZER_DISCARD: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RASTERIZER_DISCARD), /* harmony export */ GL_READ_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_READ_BUFFER), /* harmony export */ GL_READ_FRAMEBUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_READ_FRAMEBUFFER), /* harmony export */ GL_READ_FRAMEBUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_READ_FRAMEBUFFER_BINDING), /* harmony export */ GL_RED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RED), /* harmony export */ GL_RED_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RED_BITS), /* harmony export */ GL_RED_INTEGER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RED_INTEGER), /* harmony export */ GL_RENDERBUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER), /* harmony export */ GL_RENDERBUFFER_ALPHA_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_ALPHA_SIZE), /* harmony export */ GL_RENDERBUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_BINDING), /* harmony export */ GL_RENDERBUFFER_BLUE_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_BLUE_SIZE), /* harmony export */ GL_RENDERBUFFER_DEPTH_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_DEPTH_SIZE), /* harmony export */ GL_RENDERBUFFER_GREEN_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_GREEN_SIZE), /* harmony export */ GL_RENDERBUFFER_HEIGHT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_HEIGHT), /* harmony export */ GL_RENDERBUFFER_INTERNAL_FORMAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_INTERNAL_FORMAT), /* harmony export */ GL_RENDERBUFFER_RED_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_RED_SIZE), /* harmony export */ GL_RENDERBUFFER_SAMPLES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_SAMPLES), /* harmony export */ GL_RENDERBUFFER_STENCIL_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_STENCIL_SIZE), /* harmony export */ GL_RENDERBUFFER_WIDTH: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERBUFFER_WIDTH), /* harmony export */ GL_RENDERER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RENDERER), /* harmony export */ GL_REPEAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_REPEAT), /* harmony export */ GL_REPLACE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_REPLACE), /* harmony export */ GL_RG: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG), /* harmony export */ GL_RG16F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG16F), /* harmony export */ GL_RG16I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG16I), /* harmony export */ GL_RG16UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG16UI), /* harmony export */ GL_RG32F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG32F), /* harmony export */ GL_RG32I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG32I), /* harmony export */ GL_RG32UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG32UI), /* harmony export */ GL_RG8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG8), /* harmony export */ GL_RG8I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG8I), /* harmony export */ GL_RG8UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG8UI), /* harmony export */ GL_RG8_SNORM: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG8_SNORM), /* harmony export */ GL_RGB: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB), /* harmony export */ GL_RGB10_A2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB10_A2), /* harmony export */ GL_RGB10_A2UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB10_A2UI), /* harmony export */ GL_RGB16F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB16F), /* harmony export */ GL_RGB16I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB16I), /* harmony export */ GL_RGB16UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB16UI), /* harmony export */ GL_RGB32F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB32F), /* harmony export */ GL_RGB32F_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB32F_EXT), /* harmony export */ GL_RGB32I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB32I), /* harmony export */ GL_RGB32UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB32UI), /* harmony export */ GL_RGB565: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB565), /* harmony export */ GL_RGB5_A1: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB5_A1), /* harmony export */ GL_RGB8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB8), /* harmony export */ GL_RGB8I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB8I), /* harmony export */ GL_RGB8UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB8UI), /* harmony export */ GL_RGB8_SNORM: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB8_SNORM), /* harmony export */ GL_RGB9_E5: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB9_E5), /* harmony export */ GL_RGBA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA), /* harmony export */ GL_RGBA16F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA16F), /* harmony export */ GL_RGBA16I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA16I), /* harmony export */ GL_RGBA16UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA16UI), /* harmony export */ GL_RGBA32F: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA32F), /* harmony export */ GL_RGBA32F_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA32F_EXT), /* harmony export */ GL_RGBA32I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA32I), /* harmony export */ GL_RGBA32UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA32UI), /* harmony export */ GL_RGBA4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA4), /* harmony export */ GL_RGBA8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA8), /* harmony export */ GL_RGBA8I: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA8I), /* harmony export */ GL_RGBA8UI: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA8UI), /* harmony export */ GL_RGBA8_SNORM: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA8_SNORM), /* harmony export */ GL_RGBA_INTEGER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGBA_INTEGER), /* harmony export */ GL_RGB_INTEGER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RGB_INTEGER), /* harmony export */ GL_RG_INTEGER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_RG_INTEGER), /* harmony export */ GL_SAMPLER_2D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_2D), /* harmony export */ GL_SAMPLER_2D_ARRAY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_2D_ARRAY), /* harmony export */ GL_SAMPLER_2D_ARRAY_SHADOW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_2D_ARRAY_SHADOW), /* harmony export */ GL_SAMPLER_2D_SHADOW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_2D_SHADOW), /* harmony export */ GL_SAMPLER_3D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_3D), /* harmony export */ GL_SAMPLER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_BINDING), /* harmony export */ GL_SAMPLER_CUBE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_CUBE), /* harmony export */ GL_SAMPLER_CUBE_SHADOW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLER_CUBE_SHADOW), /* harmony export */ GL_SAMPLES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLES), /* harmony export */ GL_SAMPLE_ALPHA_TO_COVERAGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLE_ALPHA_TO_COVERAGE), /* harmony export */ GL_SAMPLE_BUFFERS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLE_BUFFERS), /* harmony export */ GL_SAMPLE_COVERAGE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLE_COVERAGE), /* harmony export */ GL_SAMPLE_COVERAGE_INVERT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLE_COVERAGE_INVERT), /* harmony export */ GL_SAMPLE_COVERAGE_VALUE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SAMPLE_COVERAGE_VALUE), /* harmony export */ GL_SCISSOR_BOX: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SCISSOR_BOX), /* harmony export */ GL_SCISSOR_TEST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SCISSOR_TEST), /* harmony export */ GL_SEPARATE_ATTRIBS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SEPARATE_ATTRIBS), /* harmony export */ GL_SHADER_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SHADER_TYPE), /* harmony export */ GL_SHADING_LANGUAGE_VERSION: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SHADING_LANGUAGE_VERSION), /* harmony export */ GL_SIGNALED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SIGNALED), /* harmony export */ GL_SIGNED_NORMALIZED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SIGNED_NORMALIZED), /* harmony export */ GL_SRC_ALPHA: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRC_ALPHA), /* harmony export */ GL_SRC_ALPHA_SATURATE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRC_ALPHA_SATURATE), /* harmony export */ GL_SRC_COLOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRC_COLOR), /* harmony export */ GL_SRGB: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRGB), /* harmony export */ GL_SRGB8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRGB8), /* harmony export */ GL_SRGB8_ALPHA8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRGB8_ALPHA8), /* harmony export */ GL_SRGB8_ALPHA8_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRGB8_ALPHA8_EXT), /* harmony export */ GL_SRGB_ALPHA_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRGB_ALPHA_EXT), /* harmony export */ GL_SRGB_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SRGB_EXT), /* harmony export */ GL_STATIC_COPY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STATIC_COPY), /* harmony export */ GL_STATIC_DRAW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STATIC_DRAW), /* harmony export */ GL_STATIC_READ: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STATIC_READ), /* harmony export */ GL_STENCIL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL), /* harmony export */ GL_STENCIL_ATTACHMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_ATTACHMENT), /* harmony export */ GL_STENCIL_BACK_FAIL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_FAIL), /* harmony export */ GL_STENCIL_BACK_FUNC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_FUNC), /* harmony export */ GL_STENCIL_BACK_PASS_DEPTH_FAIL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_PASS_DEPTH_FAIL), /* harmony export */ GL_STENCIL_BACK_PASS_DEPTH_PASS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_PASS_DEPTH_PASS), /* harmony export */ GL_STENCIL_BACK_REF: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_REF), /* harmony export */ GL_STENCIL_BACK_VALUE_MASK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_VALUE_MASK), /* harmony export */ GL_STENCIL_BACK_WRITEMASK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BACK_WRITEMASK), /* harmony export */ GL_STENCIL_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BITS), /* harmony export */ GL_STENCIL_BUFFER_BIT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_BUFFER_BIT), /* harmony export */ GL_STENCIL_CLEAR_VALUE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_CLEAR_VALUE), /* harmony export */ GL_STENCIL_FAIL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_FAIL), /* harmony export */ GL_STENCIL_FUNC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_FUNC), /* harmony export */ GL_STENCIL_INDEX: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_INDEX), /* harmony export */ GL_STENCIL_INDEX8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_INDEX8), /* harmony export */ GL_STENCIL_PASS_DEPTH_FAIL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_PASS_DEPTH_FAIL), /* harmony export */ GL_STENCIL_PASS_DEPTH_PASS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_PASS_DEPTH_PASS), /* harmony export */ GL_STENCIL_REF: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_REF), /* harmony export */ GL_STENCIL_TEST: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_TEST), /* harmony export */ GL_STENCIL_VALUE_MASK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_VALUE_MASK), /* harmony export */ GL_STENCIL_WRITEMASK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STENCIL_WRITEMASK), /* harmony export */ GL_STREAM_COPY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STREAM_COPY), /* harmony export */ GL_STREAM_DRAW: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STREAM_DRAW), /* harmony export */ GL_STREAM_READ: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_STREAM_READ), /* harmony export */ GL_SUBPIXEL_BITS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SUBPIXEL_BITS), /* harmony export */ GL_SYNC_CONDITION: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SYNC_CONDITION), /* harmony export */ GL_SYNC_FENCE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SYNC_FENCE), /* harmony export */ GL_SYNC_FLAGS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SYNC_FLAGS), /* harmony export */ GL_SYNC_FLUSH_COMMANDS_BIT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SYNC_FLUSH_COMMANDS_BIT), /* harmony export */ GL_SYNC_GPU_COMMANDS_COMPLETE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SYNC_GPU_COMMANDS_COMPLETE), /* harmony export */ GL_SYNC_STATUS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_SYNC_STATUS), /* harmony export */ GL_TEXTURE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE), /* harmony export */ GL_TEXTURE0: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE0), /* harmony export */ GL_TEXTURE1: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE1), /* harmony export */ GL_TEXTURE10: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE10), /* harmony export */ GL_TEXTURE11: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE11), /* harmony export */ GL_TEXTURE12: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE12), /* harmony export */ GL_TEXTURE13: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE13), /* harmony export */ GL_TEXTURE14: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE14), /* harmony export */ GL_TEXTURE15: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE15), /* harmony export */ GL_TEXTURE16: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE16), /* harmony export */ GL_TEXTURE17: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE17), /* harmony export */ GL_TEXTURE18: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE18), /* harmony export */ GL_TEXTURE19: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE19), /* harmony export */ GL_TEXTURE2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE2), /* harmony export */ GL_TEXTURE20: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE20), /* harmony export */ GL_TEXTURE21: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE21), /* harmony export */ GL_TEXTURE22: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE22), /* harmony export */ GL_TEXTURE23: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE23), /* harmony export */ GL_TEXTURE24: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE24), /* harmony export */ GL_TEXTURE25: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE25), /* harmony export */ GL_TEXTURE26: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE26), /* harmony export */ GL_TEXTURE27: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE27), /* harmony export */ GL_TEXTURE28: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE28), /* harmony export */ GL_TEXTURE29: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE29), /* harmony export */ GL_TEXTURE3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE3), /* harmony export */ GL_TEXTURE30: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE30), /* harmony export */ GL_TEXTURE31: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE31), /* harmony export */ GL_TEXTURE4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE4), /* harmony export */ GL_TEXTURE5: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE5), /* harmony export */ GL_TEXTURE6: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE6), /* harmony export */ GL_TEXTURE7: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE7), /* harmony export */ GL_TEXTURE8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE8), /* harmony export */ GL_TEXTURE9: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE9), /* harmony export */ GL_TEXTURE_2D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_2D), /* harmony export */ GL_TEXTURE_2D_ARRAY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_2D_ARRAY), /* harmony export */ GL_TEXTURE_3D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_3D), /* harmony export */ GL_TEXTURE_BASE_LEVEL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_BASE_LEVEL), /* harmony export */ GL_TEXTURE_BINDING_2D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_BINDING_2D), /* harmony export */ GL_TEXTURE_BINDING_2D_ARRAY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_BINDING_2D_ARRAY), /* harmony export */ GL_TEXTURE_BINDING_3D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_BINDING_3D), /* harmony export */ GL_TEXTURE_BINDING_CUBE_MAP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_BINDING_CUBE_MAP), /* harmony export */ GL_TEXTURE_COMPARE_FUNC: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_COMPARE_FUNC), /* harmony export */ GL_TEXTURE_COMPARE_MODE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_COMPARE_MODE), /* harmony export */ GL_TEXTURE_CUBE_MAP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_X: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP_NEGATIVE_X), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_X: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP_POSITIVE_X), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_Y: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP_POSITIVE_Y), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_Z: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_CUBE_MAP_POSITIVE_Z), /* harmony export */ GL_TEXTURE_IMMUTABLE_FORMAT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_IMMUTABLE_FORMAT), /* harmony export */ GL_TEXTURE_IMMUTABLE_LEVELS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_IMMUTABLE_LEVELS), /* harmony export */ GL_TEXTURE_MAG_FILTER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_MAG_FILTER), /* harmony export */ GL_TEXTURE_MAX_ANISOTROPY_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_MAX_ANISOTROPY_EXT), /* harmony export */ GL_TEXTURE_MAX_LEVEL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_MAX_LEVEL), /* harmony export */ GL_TEXTURE_MAX_LOD: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_MAX_LOD), /* harmony export */ GL_TEXTURE_MIN_FILTER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_MIN_FILTER), /* harmony export */ GL_TEXTURE_MIN_LOD: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_MIN_LOD), /* harmony export */ GL_TEXTURE_WRAP_R: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_WRAP_R), /* harmony export */ GL_TEXTURE_WRAP_S: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_WRAP_S), /* harmony export */ GL_TEXTURE_WRAP_T: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TEXTURE_WRAP_T), /* harmony export */ GL_TIMEOUT_EXPIRED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TIMEOUT_EXPIRED), /* harmony export */ GL_TIMEOUT_IGNORED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TIMEOUT_IGNORED), /* harmony export */ GL_TIMESTAMP_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TIMESTAMP_EXT), /* harmony export */ GL_TIME_ELAPSED_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TIME_ELAPSED_EXT), /* harmony export */ GL_TRANSFORM_FEEDBACK: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK), /* harmony export */ GL_TRANSFORM_FEEDBACK_ACTIVE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_ACTIVE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_BINDING), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_BUFFER), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_BUFFER_BINDING), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_MODE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_BUFFER_MODE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_BUFFER_SIZE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_START: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_BUFFER_START), /* harmony export */ GL_TRANSFORM_FEEDBACK_PAUSED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_PAUSED), /* harmony export */ GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN), /* harmony export */ GL_TRANSFORM_FEEDBACK_VARYINGS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRANSFORM_FEEDBACK_VARYINGS), /* harmony export */ GL_TRIANGLES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRIANGLES), /* harmony export */ GL_TRIANGLE_FAN: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRIANGLE_FAN), /* harmony export */ GL_TRIANGLE_STRIP: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_TRIANGLE_STRIP), /* harmony export */ GL_UNIFORM_ARRAY_STRIDE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_ARRAY_STRIDE), /* harmony export */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS), /* harmony export */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES), /* harmony export */ GL_UNIFORM_BLOCK_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_BINDING), /* harmony export */ GL_UNIFORM_BLOCK_DATA_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_DATA_SIZE), /* harmony export */ GL_UNIFORM_BLOCK_INDEX: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_INDEX), /* harmony export */ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER), /* harmony export */ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER), /* harmony export */ GL_UNIFORM_BUFFER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BUFFER), /* harmony export */ GL_UNIFORM_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BUFFER_BINDING), /* harmony export */ GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT), /* harmony export */ GL_UNIFORM_BUFFER_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BUFFER_SIZE), /* harmony export */ GL_UNIFORM_BUFFER_START: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_BUFFER_START), /* harmony export */ GL_UNIFORM_IS_ROW_MAJOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_IS_ROW_MAJOR), /* harmony export */ GL_UNIFORM_MATRIX_STRIDE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_MATRIX_STRIDE), /* harmony export */ GL_UNIFORM_OFFSET: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_OFFSET), /* harmony export */ GL_UNIFORM_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_SIZE), /* harmony export */ GL_UNIFORM_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNIFORM_TYPE), /* harmony export */ GL_UNMASKED_RENDERER_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNMASKED_RENDERER_WEBGL), /* harmony export */ GL_UNMASKED_VENDOR_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNMASKED_VENDOR_WEBGL), /* harmony export */ GL_UNPACK_ALIGNMENT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_ALIGNMENT), /* harmony export */ GL_UNPACK_COLORSPACE_CONVERSION_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_COLORSPACE_CONVERSION_WEBGL), /* harmony export */ GL_UNPACK_FLIP_Y_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_FLIP_Y_WEBGL), /* harmony export */ GL_UNPACK_IMAGE_HEIGHT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_IMAGE_HEIGHT), /* harmony export */ GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL), /* harmony export */ GL_UNPACK_ROW_LENGTH: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_ROW_LENGTH), /* harmony export */ GL_UNPACK_SKIP_IMAGES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_SKIP_IMAGES), /* harmony export */ GL_UNPACK_SKIP_PIXELS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_SKIP_PIXELS), /* harmony export */ GL_UNPACK_SKIP_ROWS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNPACK_SKIP_ROWS), /* harmony export */ GL_UNSIGNALED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNALED), /* harmony export */ GL_UNSIGNED_INT_10F_11F_11F_REV: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_10F_11F_11F_REV), /* harmony export */ GL_UNSIGNED_INT_24_8: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_24_8), /* harmony export */ GL_UNSIGNED_INT_24_8_WEBGL: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_24_8_WEBGL), /* harmony export */ GL_UNSIGNED_INT_2_10_10_10_REV: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_2_10_10_10_REV), /* harmony export */ GL_UNSIGNED_INT_5_9_9_9_REV: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_5_9_9_9_REV), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_2D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_SAMPLER_2D), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_SAMPLER_2D_ARRAY), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_3D: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_SAMPLER_3D), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_CUBE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_SAMPLER_CUBE), /* harmony export */ GL_UNSIGNED_INT_VEC2: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_VEC2), /* harmony export */ GL_UNSIGNED_INT_VEC3: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_VEC3), /* harmony export */ GL_UNSIGNED_INT_VEC4: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_INT_VEC4), /* harmony export */ GL_UNSIGNED_NORMALIZED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_NORMALIZED), /* harmony export */ GL_UNSIGNED_NORMALIZED_EXT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_UNSIGNED_NORMALIZED_EXT), /* harmony export */ GL_VALIDATE_STATUS: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VALIDATE_STATUS), /* harmony export */ GL_VENDOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VENDOR), /* harmony export */ GL_VERSION: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERSION), /* harmony export */ GL_VERTEX_ARRAY_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ARRAY_BINDING), /* harmony export */ GL_VERTEX_ARRAY_BINDING_OES: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ARRAY_BINDING_OES), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_DIVISOR), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_ENABLED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_ENABLED), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_INTEGER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_INTEGER), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_NORMALIZED), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_POINTER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_POINTER), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_SIZE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_SIZE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_STRIDE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_STRIDE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_TYPE: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_ATTRIB_ARRAY_TYPE), /* harmony export */ GL_VERTEX_SHADER: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VERTEX_SHADER), /* harmony export */ GL_VIEWPORT: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_VIEWPORT), /* harmony export */ GL_WAIT_FAILED: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_WAIT_FAILED), /* harmony export */ GL_ZERO: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.GL_ZERO), /* harmony export */ GetComponentFromEntities: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GetComponentFromEntities), /* harmony export */ Gizmo: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Gizmo), /* harmony export */ GlobalDataRepository: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GlobalDataRepository), /* harmony export */ GlobalRetarget: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GlobalRetarget), /* harmony export */ GlobalRetargetReverse: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GlobalRetargetReverse), /* harmony export */ Gltf2Exporter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Gltf2Exporter), /* harmony export */ Gltf2Importer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Gltf2Importer), /* harmony export */ GltfImporter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GltfImporter), /* harmony export */ GreaterShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.GreaterShaderNode), /* harmony export */ Grid: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Grid), /* harmony export */ HdriFormat: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.HdriFormat), /* harmony export */ INPUT_HANDLING_STATE_CAMERA_CONTROLLER: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.INPUT_HANDLING_STATE_CAMERA_CONTROLLER), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_SCALE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.INPUT_HANDLING_STATE_GIZMO_SCALE), /* harmony export */ INPUT_HANDLING_STATE_GIZMO_TRANSLATION: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.INPUT_HANDLING_STATE_GIZMO_TRANSLATION), /* harmony export */ INPUT_HANDLING_STATE_NONE: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.INPUT_HANDLING_STATE_NONE), /* harmony export */ IShape: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.IShape), /* harmony export */ IdentityMatrix33: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrix33), /* harmony export */ IdentityMatrix44: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrix44), /* harmony export */ IfStatementShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.IfStatementShader), /* harmony export */ IfStatementShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.IfStatementShaderNode), /* harmony export */ ImageUtil: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ImageUtil), /* harmony export */ InputManager: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.InputManager), /* harmony export */ Is: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Is), /* harmony export */ IsObj: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.IsObj), /* harmony export */ Joint: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Joint), /* harmony export */ KTX2TextureLoader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.KTX2TextureLoader), /* harmony export */ LightComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.LightComponent), /* harmony export */ LightGizmo: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.LightGizmo), /* harmony export */ LightType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.LightType), /* harmony export */ Line: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Line), /* harmony export */ LocatorGizmo: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.LocatorGizmo), /* harmony export */ LogLevel: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.LogLevel), /* harmony export */ LogQuaternion: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.LogQuaternion), /* harmony export */ Logger: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Logger), /* harmony export */ MToonMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MToonMaterialContent), /* harmony export */ MatCapMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MatCapMaterialContent), /* harmony export */ Material: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Material), /* harmony export */ MaterialHelper: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MaterialHelper), /* harmony export */ MaterialRepository: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MaterialRepository), /* harmony export */ MathClassUtil: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MathClassUtil), /* harmony export */ MathUtil: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MathUtil), /* harmony export */ Matrix22: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Matrix22), /* harmony export */ Matrix33: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Matrix33), /* harmony export */ Matrix44: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Matrix44), /* harmony export */ MemoryManager: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MemoryManager), /* harmony export */ MergeVectorShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MergeVectorShaderNode), /* harmony export */ Mesh: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Mesh), /* harmony export */ MeshComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MeshComponent), /* harmony export */ MeshHelper: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MeshHelper), /* harmony export */ MeshRendererComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MeshRendererComponent), /* harmony export */ MiscUtil: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MiscUtil), /* harmony export */ ModelConverter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ModelConverter), /* harmony export */ ModuleManager: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ModuleManager), /* harmony export */ MultiplyShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MultiplyShaderNode), /* harmony export */ MutableColorRgb: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableColorRgb), /* harmony export */ MutableColorRgba: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableColorRgba), /* harmony export */ MutableMatrix22: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableMatrix22), /* harmony export */ MutableMatrix33: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableMatrix33), /* harmony export */ MutableMatrix44: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableMatrix44), /* harmony export */ MutableQuaternion: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableQuaternion), /* harmony export */ MutableScalar: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableScalar), /* harmony export */ MutableScalar_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableScalar_), /* harmony export */ MutableScalard: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableScalard), /* harmony export */ MutableVector2: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector2), /* harmony export */ MutableVector2_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector2_), /* harmony export */ MutableVector2d: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector2d), /* harmony export */ MutableVector3: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector3), /* harmony export */ MutableVector3_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector3_), /* harmony export */ MutableVector3d: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector3d), /* harmony export */ MutableVector4: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector4), /* harmony export */ MutableVector4_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector4_), /* harmony export */ MutableVector4d: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.MutableVector4d), /* harmony export */ None: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.None), /* harmony export */ NormalMatrixShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.NormalMatrixShaderNode), /* harmony export */ NormalizeShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.NormalizeShaderNode), /* harmony export */ OimoPhysicsStrategy: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.OimoPhysicsStrategy), /* harmony export */ Ok: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Ok), /* harmony export */ Option: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Option), /* harmony export */ OrbitCameraController: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.OrbitCameraController), /* harmony export */ OutColorShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.OutColorShaderNode), /* harmony export */ OutPositionShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.OutPositionShaderNode), /* harmony export */ PhysicsComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PhysicsComponent), /* harmony export */ PixelFormat: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PixelFormat), /* harmony export */ Plane: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Plane), /* harmony export */ Primitive: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Primitive), /* harmony export */ PrimitiveMode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveMode), /* harmony export */ PrimitiveSortKey_BitLength_Depth: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_Depth), /* harmony export */ PrimitiveSortKey_BitLength_Material: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_Material), /* harmony export */ PrimitiveSortKey_BitLength_PrimitiveType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitLength_TranslucencyType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitLength_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_Material: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_Material), /* harmony export */ PrimitiveSortKey_BitOffset_PrimitiveType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_PrimitiveType), /* harmony export */ PrimitiveSortKey_BitOffset_TranslucencyType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_TranslucencyType), /* harmony export */ PrimitiveSortKey_BitOffset_ViewportLayer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.PrimitiveSortKey_BitOffset_ViewportLayer), /* harmony export */ ProcessApproach: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach), /* harmony export */ ProcessApproachClass: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ProcessApproachClass), /* harmony export */ ProcessStage: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ProcessStage), /* harmony export */ ProjectionMatrixShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ProjectionMatrixShaderNode), /* harmony export */ Quaternion: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Quaternion), /* harmony export */ RenderBuffer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderBuffer), /* harmony export */ RenderBufferTarget: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderBufferTarget), /* harmony export */ RenderPass: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderPass), /* harmony export */ RenderPassHelper: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderPassHelper), /* harmony export */ RenderTargetTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderTargetTexture), /* harmony export */ RenderTargetTextureCube: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderTargetTextureCube), /* harmony export */ RenderableHelper: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RenderableHelper), /* harmony export */ RhodoniteImportExtension: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RhodoniteImportExtension), /* harmony export */ RnException: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RnException), /* harmony export */ RnObject: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RnObject), /* harmony export */ RnPromise: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.RnPromise), /* harmony export */ Sampler: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Sampler), /* harmony export */ Scalar: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Scalar), /* harmony export */ Scalar_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Scalar_), /* harmony export */ Scalard: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Scalard), /* harmony export */ ScaleGizmo: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ScaleGizmo), /* harmony export */ SceneGraphComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SceneGraphComponent), /* harmony export */ ShaderGraphResolver: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderGraphResolver), /* harmony export */ ShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderNode), /* harmony export */ ShaderSemantics: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderSemantics), /* harmony export */ ShaderSemanticsClass: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderSemanticsClass), /* harmony export */ ShaderType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderType), /* harmony export */ ShaderVariableType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderVariableType), /* harmony export */ ShaderityUtilityWebGL: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShaderityUtilityWebGL), /* harmony export */ ShadingModel: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShadingModel), /* harmony export */ ShadowMap: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShadowMap), /* harmony export */ ShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ShadowMapDecodeClassicMaterialContent), /* harmony export */ SimpleVertexAttribute: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SimpleVertexAttribute), /* harmony export */ SkeletalComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SkeletalComponent), /* harmony export */ Some: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Some), /* harmony export */ Sphere: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Sphere), /* harmony export */ SphereCollider: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SphereCollider), /* harmony export */ SplitVectorShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SplitVectorShaderNode), /* harmony export */ SymbolWeakMap: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SymbolWeakMap), /* harmony export */ SynthesizeHdrMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SynthesizeHdrMaterialContent), /* harmony export */ System: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.System), /* harmony export */ SystemState: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.SystemState), /* harmony export */ TagGltf2NodeIndex: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.TagGltf2NodeIndex), /* harmony export */ Texture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Texture), /* harmony export */ TextureDataFloat: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.TextureDataFloat), /* harmony export */ TextureFetchShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.TextureFetchShader), /* harmony export */ TextureFormat: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.TextureFormat), /* harmony export */ TextureParameter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.TextureParameter), /* harmony export */ Time: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Time), /* harmony export */ ToneMappingType: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ToneMappingType), /* harmony export */ Transform3D: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Transform3D), /* harmony export */ TransformComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.TransformComponent), /* harmony export */ TranslationGizmo: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.TranslationGizmo), /* harmony export */ UniformDataShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.UniformDataShader), /* harmony export */ UniformDataShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.UniformDataShaderNode), /* harmony export */ VERSION: () => (/* reexport safe */ _version__WEBPACK_IMPORTED_MODULE_6__.VERSION), /* harmony export */ VRMColliderGroup: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VRMColliderGroup), /* harmony export */ VRMSpring: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VRMSpring), /* harmony export */ VRMSpringBone: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VRMSpringBone), /* harmony export */ VRMSpringBonePhysicsStrategy: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VRMSpringBonePhysicsStrategy), /* harmony export */ VarianceShadowMapDecodeClassicMaterialContent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VarianceShadowMapDecodeClassicMaterialContent), /* harmony export */ VaryingVariableShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.VaryingVariableShader), /* harmony export */ Vector2: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector2), /* harmony export */ Vector2_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector2_), /* harmony export */ Vector2d: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector2d), /* harmony export */ Vector3: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector3), /* harmony export */ Vector3_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector3_), /* harmony export */ Vector3d: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector3d), /* harmony export */ Vector4: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector4), /* harmony export */ Vector4_: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector4_), /* harmony export */ Vector4d: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vector4d), /* harmony export */ VectorN: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VectorN), /* harmony export */ VertexAttribute: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VertexAttribute), /* harmony export */ VertexAttributeClass: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VertexAttributeClass), /* harmony export */ VideoTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VideoTexture), /* harmony export */ ViewMatrixShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ViewMatrixShaderNode), /* harmony export */ Visibility: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Visibility), /* harmony export */ Vrm0xImporter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.Vrm0xImporter), /* harmony export */ VrmComponent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VrmComponent), /* harmony export */ VrmImporter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VrmImporter), /* harmony export */ VrmaImporter: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.VrmaImporter), /* harmony export */ WalkThroughCameraController: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WalkThroughCameraController), /* harmony export */ WeakNone: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WeakNone), /* harmony export */ WeakOption: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WeakOption), /* harmony export */ WeakSome: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WeakSome), /* harmony export */ WebGLContextWrapper: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.WebGLContextWrapper), /* harmony export */ WebGLExtension: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.WebGLExtension), /* harmony export */ WebGLResourceRepository: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.WebGLResourceRepository), /* harmony export */ WebGLStrategyDataTexture: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.WebGLStrategyDataTexture), /* harmony export */ WebGLStrategyUniform: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.WebGLStrategyUniform), /* harmony export */ WebGpuDeviceWrapper: () => (/* reexport safe */ _webgpu_index__WEBPACK_IMPORTED_MODULE_2__.WebGpuDeviceWrapper), /* harmony export */ WebGpuResourceRepository: () => (/* reexport safe */ _webgpu_index__WEBPACK_IMPORTED_MODULE_2__.WebGpuResourceRepository), /* harmony export */ WebGpuStrategyBasic: () => (/* reexport safe */ _webgpu_index__WEBPACK_IMPORTED_MODULE_2__.WebGpuStrategyBasic), /* harmony export */ WebXRSystem: () => (/* reexport safe */ _xr_index__WEBPACK_IMPORTED_MODULE_5__.WebXRSystem), /* harmony export */ WellKnownComponentTIDs: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WellKnownComponentTIDs), /* harmony export */ WireframeMaterialNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WireframeMaterialNode), /* harmony export */ WorldMatrixShaderNode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.WorldMatrixShaderNode), /* harmony export */ _from: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__._from), /* harmony export */ _fromString: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__._fromString), /* harmony export */ _fromStringCaseSensitively: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__._fromStringCaseSensitively), /* harmony export */ _getPropertyIndex2: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__._getPropertyIndex2), /* harmony export */ add2: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.add2), /* harmony export */ add2_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.add2_offset), /* harmony export */ add3: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.add3), /* harmony export */ add3_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.add3_offset), /* harmony export */ add4: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.add4), /* harmony export */ add4_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.add4_offset), /* harmony export */ addLineNumberToCode: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.addLineNumberToCode), /* harmony export */ applyMixins: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.applyMixins), /* harmony export */ array3_lerp_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.array3_lerp_offsetAsComposition), /* harmony export */ arrayN_lerp_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.arrayN_lerp_offsetAsComposition), /* harmony export */ assertDoesNotHave: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.assertDoesNotHave), /* harmony export */ assertExist: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.assertExist), /* harmony export */ assertHas: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.assertHas), /* harmony export */ assertIsErr: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.assertIsErr), /* harmony export */ assertIsOk: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.assertIsOk), /* harmony export */ calcAlignedByteLength: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.calcAlignedByteLength), /* harmony export */ combineImages: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.combineImages), /* harmony export */ convertHTMLImageElementToCanvas: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.convertHTMLImageElementToCanvas), /* harmony export */ createCameraControllerEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createCameraControllerEntity), /* harmony export */ createCameraEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createCameraEntity), /* harmony export */ createEffekseer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createEffekseer), /* harmony export */ createEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createEntity), /* harmony export */ createGroupEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createGroupEntity), /* harmony export */ createLightEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createLightEntity), /* harmony export */ createLightWithCameraEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createLightWithCameraEntity), /* harmony export */ createMeshEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createMeshEntity), /* harmony export */ createMotionController: () => (/* reexport safe */ _xr_index__WEBPACK_IMPORTED_MODULE_5__.createMotionController), /* harmony export */ createPhysicsEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createPhysicsEntity), /* harmony export */ createSkeletalEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createSkeletalEntity), /* harmony export */ createTransformEntity: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.createTransformEntity), /* harmony export */ deepCopyUsingJsonStringify: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.deepCopyUsingJsonStringify), /* harmony export */ defaultAnimationTrackName: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.defaultAnimationTrackName), /* harmony export */ defaultValue: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.defaultValue), /* harmony export */ detectFormatByArrayBuffers: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.detectFormatByArrayBuffers), /* harmony export */ detectFormatByUri: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.detectFormatByUri), /* harmony export */ downloadArrayBuffer: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.downloadArrayBuffer), /* harmony export */ downloadTypedArray: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.downloadTypedArray), /* harmony export */ dummyAnisotropyTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.dummyAnisotropyTexture), /* harmony export */ dummyBlackCubeTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.dummyBlackCubeTexture), /* harmony export */ dummyBlackTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.dummyBlackTexture), /* harmony export */ dummyBlueTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.dummyBlueTexture), /* harmony export */ dummySRGBGrayTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.dummySRGBGrayTexture), /* harmony export */ dummyWhiteTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.dummyWhiteTexture), /* harmony export */ enhanceArray: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.enhanceArray), /* harmony export */ flattenHierarchy: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.flattenHierarchy), /* harmony export */ fromTensorToCompositionType: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.fromTensorToCompositionType), /* harmony export */ get1: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get1), /* harmony export */ get1_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get1_offset), /* harmony export */ get1_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get1_offsetAsComposition), /* harmony export */ get2: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get2), /* harmony export */ get2_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get2_offset), /* harmony export */ get2_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get2_offsetAsComposition), /* harmony export */ get3: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get3), /* harmony export */ get3_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get3_offset), /* harmony export */ get3_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get3_offsetAsComposition), /* harmony export */ get4: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get4), /* harmony export */ get4_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get4_offset), /* harmony export */ get4_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.get4_offsetAsComposition), /* harmony export */ getEvent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.getEvent), /* harmony export */ getMotionController: () => (/* reexport safe */ _xr_index__WEBPACK_IMPORTED_MODULE_5__.getMotionController), /* harmony export */ getN_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.getN_offset), /* harmony export */ getN_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.getN_offsetAsComposition), /* harmony export */ getWebXRSystem: () => (/* reexport safe */ _xr_index__WEBPACK_IMPORTED_MODULE_5__.getWebXRSystem), /* harmony export */ greaterThan: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.greaterThan), /* harmony export */ ifDefinedThen: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifDefinedThen), /* harmony export */ ifDefinedThenWithReturn: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifDefinedThenWithReturn), /* harmony export */ ifExistsThen: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifExistsThen), /* harmony export */ ifExistsThenWithReturn: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifExistsThenWithReturn), /* harmony export */ ifNotExistsThen: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifNotExistsThen), /* harmony export */ ifNotExistsThenWithReturn: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifNotExistsThenWithReturn), /* harmony export */ ifUndefinedThen: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifUndefinedThen), /* harmony export */ ifUndefinedThenWithReturn: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.ifUndefinedThenWithReturn), /* harmony export */ initDefaultTextures: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.initDefaultTextures), /* harmony export */ isBlend: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.isBlend), /* harmony export */ isErr: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.isErr), /* harmony export */ isOk: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.isOk), /* harmony export */ isSameGlTF2TextureSampler: () => (/* reexport safe */ _types_index__WEBPACK_IMPORTED_MODULE_3__.isSameGlTF2TextureSampler), /* harmony export */ isSkipDrawing: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.isSkipDrawing), /* harmony export */ isTranslucent: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.isTranslucent), /* harmony export */ lessThan: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.lessThan), /* harmony export */ mulArray3WithScalar_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.mulArray3WithScalar_offset), /* harmony export */ mulArray4WithScalar_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.mulArray4WithScalar_offset), /* harmony export */ mulArrayNWithScalar_offset: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.mulArrayNWithScalar_offset), /* harmony export */ mulThatAndThisToOutAsMat44_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.mulThatAndThisToOutAsMat44_offsetAsComposition), /* harmony export */ normalizeArray4: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.normalizeArray4), /* harmony export */ nullishToEmptyArray: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.nullishToEmptyArray), /* harmony export */ nullishToEmptyMap: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.nullishToEmptyMap), /* harmony export */ objectCachify: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.objectCachify), /* harmony export */ primitiveCachify1: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.primitiveCachify1), /* harmony export */ qlerp_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.qlerp_offsetAsComposition), /* harmony export */ scalar_lerp_offsetAsComposition: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.scalar_lerp_offsetAsComposition), /* harmony export */ setupShaderProgram: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_1__.setupShaderProgram), /* harmony export */ sheenLutTexture: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.sheenLutTexture), /* harmony export */ updateGamePad: () => (/* reexport safe */ _xr_index__WEBPACK_IMPORTED_MODULE_5__.updateGamePad), /* harmony export */ updateMotionControllerModel: () => (/* reexport safe */ _xr_index__WEBPACK_IMPORTED_MODULE_5__.updateMotionControllerModel), /* harmony export */ updateVBOAndVAO: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.updateVBOAndVAO), /* harmony export */ valueWithCompensation: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.valueWithCompensation), /* harmony export */ valueWithDefault: () => (/* reexport safe */ _foundation_index__WEBPACK_IMPORTED_MODULE_0__.valueWithDefault) /* harmony export */ }); /* harmony import */ var _foundation_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./foundation/index */ "./src/foundation/index.ts"); /* harmony import */ var _webgl_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl/index */ "./src/webgl/index.ts"); /* harmony import */ var _webgpu_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webgpu/index */ "./src/webgpu/index.ts"); /* harmony import */ var _types_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types/index */ "./src/types/index.ts"); /* harmony import */ var _effekseer_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./effekseer/index */ "./src/effekseer/index.ts"); /* harmony import */ var _xr_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./xr/index */ "./src/xr/index.ts"); /* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./version */ "./src/version.ts"); /***/ }), /***/ "./src/pbr/main.ts": /*!*************************!*\ !*** ./src/pbr/main.ts ***! \*************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); // r: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/master/assets/images/lut_sheen_E.png // g: https://google.github.io/filament/Filament.html#lighting/imagebasedlights/cloth // b: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/master/assets/images/lut_charlie.png const sheen_E_and_DGTerm = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGkmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4yLWMwMDAgNzkuNTY2ZWJjNWI0LCAyMDIyLzA1LzA5LTA4OjI1OjU1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjMuNCAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMTFUMDA6MDg6NDArMDk6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA3LTExVDEyOjU4OjE0KzA5OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA3LTExVDEyOjU4OjE0KzA5OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpkZjBkNDUyYS00ZTNjLTRlMDQtOGUwOC0zZTA4YzBhZmY5NWYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6YjMzNWYzNGYtOWZlNy00MWU3LWEyZWEtNWZlYzVmZmY3NDlmIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6YjMzNWYzNGYtOWZlNy00MWU3LWEyZWEtNWZlYzVmZmY3NDlmIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMzM1ZjM0Zi05ZmU3LTQxZTctYTJlYS01ZmVjNWZmZjc0OWYiIHN0RXZ0OndoZW49IjIwMjItMDctMTFUMDA6MDg6NDArMDk6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy40IChNYWNpbnRvc2gpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjYzQyMmE0NC1mM2QxLTRhZTEtYWMyNS02NGE3NGZkZGI0MTciIHN0RXZ0OndoZW49IjIwMjItMDctMTFUMTA6NTY6MjArMDk6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy40IChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpkZjBkNDUyYS00ZTNjLTRlMDQtOGUwOC0zZTA4YzBhZmY5NWYiIHN0RXZ0OndoZW49IjIwMjItMDctMTFUMTI6NTg6MTQrMDk6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy40IChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pi6E66IAAKbnSURBVHiclf1Lr3XLtiUGtR5z7X3OzXuvMm2wxSNBcgHJYFdApkqJX+CKK1iU+WdI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'; const PBR = Object.freeze({ sheen_E_and_DGTerm, }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PBR); /***/ }), /***/ "./src/types/AnimationTypes.ts": /*!*************************************!*\ !*** ./src/types/AnimationTypes.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/BasisTexture.ts": /*!***********************************!*\ !*** ./src/types/BasisTexture.ts ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/CommonTypes.ts": /*!**********************************!*\ !*** ./src/types/CommonTypes.ts ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/KTX2Texture.ts": /*!**********************************!*\ !*** ./src/types/KTX2Texture.ts ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/RnM2.ts": /*!***************************!*\ !*** ./src/types/RnM2.ts ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/RnM2Vrma.ts": /*!*******************************!*\ !*** ./src/types/RnM2Vrma.ts ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/ShaderNodeJson.ts": /*!*************************************!*\ !*** ./src/types/ShaderNodeJson.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/TypeConverter.ts": /*!************************************!*\ !*** ./src/types/TypeConverter.ts ***! \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ fromTensorToCompositionType: () => (/* binding */ fromTensorToCompositionType) /* harmony export */ }); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); function fromTensorToCompositionType(vec) { switch (vec.className) { case 'Scalar' || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Scalar; case 'Vector2' || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec2; case 'Vector3' || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec3; case 'Vector4' || 0 || 0 || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Vec4; case 'Matrix22' || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat2; case 'Matrix33' || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat3; case 'Matrix44' || 0: return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Mat4; default: _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_1__.Logger.error('CompositionType.Unknown'); return _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_0__.CompositionType.Unknown; } } /***/ }), /***/ "./src/types/TypeGenerators.ts": /*!*************************************!*\ !*** ./src/types/TypeGenerators.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/VRM0x.ts": /*!****************************!*\ !*** ./src/types/VRM0x.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/WebGLConstants.ts": /*!*************************************!*\ !*** ./src/types/WebGLConstants.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GL_ACTIVE_ATTRIBUTES: () => (/* binding */ GL_ACTIVE_ATTRIBUTES), /* harmony export */ GL_ACTIVE_TEXTURE: () => (/* binding */ GL_ACTIVE_TEXTURE), /* harmony export */ GL_ACTIVE_UNIFORMS: () => (/* binding */ GL_ACTIVE_UNIFORMS), /* harmony export */ GL_ACTIVE_UNIFORM_BLOCKS: () => (/* binding */ GL_ACTIVE_UNIFORM_BLOCKS), /* harmony export */ GL_ALIASED_LINE_WIDTH_RANGE: () => (/* binding */ GL_ALIASED_LINE_WIDTH_RANGE), /* harmony export */ GL_ALIASED_POINT_SIZE_RANGE: () => (/* binding */ GL_ALIASED_POINT_SIZE_RANGE), /* harmony export */ GL_ALPHA: () => (/* binding */ GL_ALPHA), /* harmony export */ GL_ALPHA_BITS: () => (/* binding */ GL_ALPHA_BITS), /* harmony export */ GL_ALREADY_SIGNALED: () => (/* binding */ GL_ALREADY_SIGNALED), /* harmony export */ GL_ALWAYS: () => (/* binding */ GL_ALWAYS), /* harmony export */ GL_ANY_SAMPLES_PASSED: () => (/* binding */ GL_ANY_SAMPLES_PASSED), /* harmony export */ GL_ANY_SAMPLES_PASSED_CONSERVATIVE: () => (/* binding */ GL_ANY_SAMPLES_PASSED_CONSERVATIVE), /* harmony export */ GL_ARRAY_BUFFER: () => (/* binding */ GL_ARRAY_BUFFER), /* harmony export */ GL_ARRAY_BUFFER_BINDING: () => (/* binding */ GL_ARRAY_BUFFER_BINDING), /* harmony export */ GL_ATTACHED_SHADERS: () => (/* binding */ GL_ATTACHED_SHADERS), /* harmony export */ GL_BACK: () => (/* binding */ GL_BACK), /* harmony export */ GL_BLEND: () => (/* binding */ GL_BLEND), /* harmony export */ GL_BLEND_COLOR: () => (/* binding */ GL_BLEND_COLOR), /* harmony export */ GL_BLEND_DST_ALPHA: () => (/* binding */ GL_BLEND_DST_ALPHA), /* harmony export */ GL_BLEND_DST_RGB: () => (/* binding */ GL_BLEND_DST_RGB), /* harmony export */ GL_BLEND_EQUATION: () => (/* binding */ GL_BLEND_EQUATION), /* harmony export */ GL_BLEND_EQUATION_ALPHA: () => (/* binding */ GL_BLEND_EQUATION_ALPHA), /* harmony export */ GL_BLEND_EQUATION_RGB: () => (/* binding */ GL_BLEND_EQUATION_RGB), /* harmony export */ GL_BLEND_SRC_ALPHA: () => (/* binding */ GL_BLEND_SRC_ALPHA), /* harmony export */ GL_BLEND_SRC_RGB: () => (/* binding */ GL_BLEND_SRC_RGB), /* harmony export */ GL_BLUE_BITS: () => (/* binding */ GL_BLUE_BITS), /* harmony export */ GL_BOOL: () => (/* binding */ GL_BOOL), /* harmony export */ GL_BOOL_VEC2: () => (/* binding */ GL_BOOL_VEC2), /* harmony export */ GL_BOOL_VEC3: () => (/* binding */ GL_BOOL_VEC3), /* harmony export */ GL_BOOL_VEC4: () => (/* binding */ GL_BOOL_VEC4), /* harmony export */ GL_BROWSER_DEFAULT_WEBGL: () => (/* binding */ GL_BROWSER_DEFAULT_WEBGL), /* harmony export */ GL_BUFFER_SIZE: () => (/* binding */ GL_BUFFER_SIZE), /* harmony export */ GL_BUFFER_USAGE: () => (/* binding */ GL_BUFFER_USAGE), /* harmony export */ GL_CCW: () => (/* binding */ GL_CCW), /* harmony export */ GL_CLAMP_TO_EDGE: () => (/* binding */ GL_CLAMP_TO_EDGE), /* harmony export */ GL_COLOR: () => (/* binding */ GL_COLOR), /* harmony export */ GL_COLOR_ATTACHMENT0: () => (/* binding */ GL_COLOR_ATTACHMENT0), /* harmony export */ GL_COLOR_ATTACHMENT0_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT0_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT1: () => (/* binding */ GL_COLOR_ATTACHMENT1), /* harmony export */ GL_COLOR_ATTACHMENT10: () => (/* binding */ GL_COLOR_ATTACHMENT10), /* harmony export */ GL_COLOR_ATTACHMENT10_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT10_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT11: () => (/* binding */ GL_COLOR_ATTACHMENT11), /* harmony export */ GL_COLOR_ATTACHMENT11_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT11_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT12: () => (/* binding */ GL_COLOR_ATTACHMENT12), /* harmony export */ GL_COLOR_ATTACHMENT12_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT12_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT13: () => (/* binding */ GL_COLOR_ATTACHMENT13), /* harmony export */ GL_COLOR_ATTACHMENT13_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT13_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT14: () => (/* binding */ GL_COLOR_ATTACHMENT14), /* harmony export */ GL_COLOR_ATTACHMENT14_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT14_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT15: () => (/* binding */ GL_COLOR_ATTACHMENT15), /* harmony export */ GL_COLOR_ATTACHMENT15_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT15_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT1_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT1_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT2: () => (/* binding */ GL_COLOR_ATTACHMENT2), /* harmony export */ GL_COLOR_ATTACHMENT2_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT2_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT3: () => (/* binding */ GL_COLOR_ATTACHMENT3), /* harmony export */ GL_COLOR_ATTACHMENT3_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT3_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT4: () => (/* binding */ GL_COLOR_ATTACHMENT4), /* harmony export */ GL_COLOR_ATTACHMENT4_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT4_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT5: () => (/* binding */ GL_COLOR_ATTACHMENT5), /* harmony export */ GL_COLOR_ATTACHMENT5_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT5_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT6: () => (/* binding */ GL_COLOR_ATTACHMENT6), /* harmony export */ GL_COLOR_ATTACHMENT6_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT6_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT7: () => (/* binding */ GL_COLOR_ATTACHMENT7), /* harmony export */ GL_COLOR_ATTACHMENT7_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT7_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT8: () => (/* binding */ GL_COLOR_ATTACHMENT8), /* harmony export */ GL_COLOR_ATTACHMENT8_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT8_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT9: () => (/* binding */ GL_COLOR_ATTACHMENT9), /* harmony export */ GL_COLOR_ATTACHMENT9_WEBGL: () => (/* binding */ GL_COLOR_ATTACHMENT9_WEBGL), /* harmony export */ GL_COLOR_BUFFER_BIT: () => (/* binding */ GL_COLOR_BUFFER_BIT), /* harmony export */ GL_COLOR_CLEAR_VALUE: () => (/* binding */ GL_COLOR_CLEAR_VALUE), /* harmony export */ GL_COLOR_WRITEMASK: () => (/* binding */ GL_COLOR_WRITEMASK), /* harmony export */ GL_COMPARE_REF_TO_TEXTURE: () => (/* binding */ GL_COMPARE_REF_TO_TEXTURE), /* harmony export */ GL_COMPILE_STATUS: () => (/* binding */ GL_COMPILE_STATUS), /* harmony export */ GL_COMPRESSED_R11_EAC: () => (/* binding */ GL_COMPRESSED_R11_EAC), /* harmony export */ GL_COMPRESSED_RG11_EAC: () => (/* binding */ GL_COMPRESSED_RG11_EAC), /* harmony export */ GL_COMPRESSED_RGB8_ETC2: () => (/* binding */ GL_COMPRESSED_RGB8_ETC2), /* harmony export */ GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: () => (/* binding */ GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2), /* harmony export */ GL_COMPRESSED_RGBA8_ETC2_EAC: () => (/* binding */ GL_COMPRESSED_RGBA8_ETC2_EAC), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X10_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_10X10_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X5_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_10X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X6_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_10X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X8_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_10X8_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_12X10_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_12X10_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_12X12_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_12X12_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_4X4_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_4X4_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_5X4_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_5X4_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_5X5_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_5X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_6X5_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_6X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_6X6_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_6X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X5_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_8X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X6_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_8X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X8_KHR: () => (/* binding */ GL_COMPRESSED_RGBA_ASTC_8X8_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: () => (/* binding */ GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL), /* harmony export */ GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: () => (/* binding */ GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL), /* harmony export */ GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: () => (/* binding */ GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: () => (/* binding */ GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: () => (/* binding */ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: () => (/* binding */ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: () => (/* binding */ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT), /* harmony export */ GL_COMPRESSED_RGB_ATC_WEBGL: () => (/* binding */ GL_COMPRESSED_RGB_ATC_WEBGL), /* harmony export */ GL_COMPRESSED_RGB_ETC1_WEBGL: () => (/* binding */ GL_COMPRESSED_RGB_ETC1_WEBGL), /* harmony export */ GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: () => (/* binding */ GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: () => (/* binding */ GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGB_S3TC_DXT1_EXT: () => (/* binding */ GL_COMPRESSED_RGB_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_SIGNED_R11_EAC: () => (/* binding */ GL_COMPRESSED_SIGNED_R11_EAC), /* harmony export */ GL_COMPRESSED_SIGNED_RG11_EAC: () => (/* binding */ GL_COMPRESSED_SIGNED_RG11_EAC), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: () => (/* binding */ GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC), /* harmony export */ GL_COMPRESSED_SRGB8_ETC2: () => (/* binding */ GL_COMPRESSED_SRGB8_ETC2), /* harmony export */ GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: () => (/* binding */ GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: () => (/* binding */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: () => (/* binding */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: () => (/* binding */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT), /* harmony export */ GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: () => (/* binding */ GL_COMPRESSED_SRGB_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_TEXTURE_FORMATS: () => (/* binding */ GL_COMPRESSED_TEXTURE_FORMATS), /* harmony export */ GL_CONDITION_SATISFIED: () => (/* binding */ GL_CONDITION_SATISFIED), /* harmony export */ GL_CONSTANT_ALPHA: () => (/* binding */ GL_CONSTANT_ALPHA), /* harmony export */ GL_CONSTANT_COLOR: () => (/* binding */ GL_CONSTANT_COLOR), /* harmony export */ GL_CONTEXT_LOST_WEBGL: () => (/* binding */ GL_CONTEXT_LOST_WEBGL), /* harmony export */ GL_COPY_READ_BUFFER: () => (/* binding */ GL_COPY_READ_BUFFER), /* harmony export */ GL_COPY_READ_BUFFER_BINDING: () => (/* binding */ GL_COPY_READ_BUFFER_BINDING), /* harmony export */ GL_COPY_WRITE_BUFFER: () => (/* binding */ GL_COPY_WRITE_BUFFER), /* harmony export */ GL_COPY_WRITE_BUFFER_BINDING: () => (/* binding */ GL_COPY_WRITE_BUFFER_BINDING), /* harmony export */ GL_CULL_FACE: () => (/* binding */ GL_CULL_FACE), /* harmony export */ GL_CULL_FACE_MODE: () => (/* binding */ GL_CULL_FACE_MODE), /* harmony export */ GL_CURRENT_PROGRAM: () => (/* binding */ GL_CURRENT_PROGRAM), /* harmony export */ GL_CURRENT_QUERY: () => (/* binding */ GL_CURRENT_QUERY), /* harmony export */ GL_CURRENT_QUERY_EXT: () => (/* binding */ GL_CURRENT_QUERY_EXT), /* harmony export */ GL_CURRENT_VERTEX_ATTRIB: () => (/* binding */ GL_CURRENT_VERTEX_ATTRIB), /* harmony export */ GL_CW: () => (/* binding */ GL_CW), /* harmony export */ GL_DATA_BYTE: () => (/* binding */ GL_DATA_BYTE), /* harmony export */ GL_DATA_FLOAT: () => (/* binding */ GL_DATA_FLOAT), /* harmony export */ GL_DATA_INT: () => (/* binding */ GL_DATA_INT), /* harmony export */ GL_DATA_SHORT: () => (/* binding */ GL_DATA_SHORT), /* harmony export */ GL_DATA_UNSIGNED_BYTE: () => (/* binding */ GL_DATA_UNSIGNED_BYTE), /* harmony export */ GL_DATA_UNSIGNED_INT: () => (/* binding */ GL_DATA_UNSIGNED_INT), /* harmony export */ GL_DATA_UNSIGNED_SHORT: () => (/* binding */ GL_DATA_UNSIGNED_SHORT), /* harmony export */ GL_DECR: () => (/* binding */ GL_DECR), /* harmony export */ GL_DECR_WRAP: () => (/* binding */ GL_DECR_WRAP), /* harmony export */ GL_DELETE_STATUS: () => (/* binding */ GL_DELETE_STATUS), /* harmony export */ GL_DEPTH: () => (/* binding */ GL_DEPTH), /* harmony export */ GL_DEPTH24_STENCIL8: () => (/* binding */ GL_DEPTH24_STENCIL8), /* harmony export */ GL_DEPTH32F_STENCIL8: () => (/* binding */ GL_DEPTH32F_STENCIL8), /* harmony export */ GL_DEPTH_ATTACHMENT: () => (/* binding */ GL_DEPTH_ATTACHMENT), /* harmony export */ GL_DEPTH_BITS: () => (/* binding */ GL_DEPTH_BITS), /* harmony export */ GL_DEPTH_BUFFER_BIT: () => (/* binding */ GL_DEPTH_BUFFER_BIT), /* harmony export */ GL_DEPTH_CLEAR_VALUE: () => (/* binding */ GL_DEPTH_CLEAR_VALUE), /* harmony export */ GL_DEPTH_COMPONENT: () => (/* binding */ GL_DEPTH_COMPONENT), /* harmony export */ GL_DEPTH_COMPONENT16: () => (/* binding */ GL_DEPTH_COMPONENT16), /* harmony export */ GL_DEPTH_COMPONENT24: () => (/* binding */ GL_DEPTH_COMPONENT24), /* harmony export */ GL_DEPTH_COMPONENT32F: () => (/* binding */ GL_DEPTH_COMPONENT32F), /* harmony export */ GL_DEPTH_FUNC: () => (/* binding */ GL_DEPTH_FUNC), /* harmony export */ GL_DEPTH_RANGE: () => (/* binding */ GL_DEPTH_RANGE), /* harmony export */ GL_DEPTH_STENCIL: () => (/* binding */ GL_DEPTH_STENCIL), /* harmony export */ GL_DEPTH_STENCIL_ATTACHMENT: () => (/* binding */ GL_DEPTH_STENCIL_ATTACHMENT), /* harmony export */ GL_DEPTH_TEST: () => (/* binding */ GL_DEPTH_TEST), /* harmony export */ GL_DEPTH_WRITEMASK: () => (/* binding */ GL_DEPTH_WRITEMASK), /* harmony export */ GL_DITHER: () => (/* binding */ GL_DITHER), /* harmony export */ GL_DONT_CARE: () => (/* binding */ GL_DONT_CARE), /* harmony export */ GL_DRAW_BUFFER0: () => (/* binding */ GL_DRAW_BUFFER0), /* harmony export */ GL_DRAW_BUFFER0_WEBGL: () => (/* binding */ GL_DRAW_BUFFER0_WEBGL), /* harmony export */ GL_DRAW_BUFFER1: () => (/* binding */ GL_DRAW_BUFFER1), /* harmony export */ GL_DRAW_BUFFER10: () => (/* binding */ GL_DRAW_BUFFER10), /* harmony export */ GL_DRAW_BUFFER10_WEBGL: () => (/* binding */ GL_DRAW_BUFFER10_WEBGL), /* harmony export */ GL_DRAW_BUFFER11: () => (/* binding */ GL_DRAW_BUFFER11), /* harmony export */ GL_DRAW_BUFFER11_WEBGL: () => (/* binding */ GL_DRAW_BUFFER11_WEBGL), /* harmony export */ GL_DRAW_BUFFER12: () => (/* binding */ GL_DRAW_BUFFER12), /* harmony export */ GL_DRAW_BUFFER12_WEBGL: () => (/* binding */ GL_DRAW_BUFFER12_WEBGL), /* harmony export */ GL_DRAW_BUFFER13: () => (/* binding */ GL_DRAW_BUFFER13), /* harmony export */ GL_DRAW_BUFFER13_WEBGL: () => (/* binding */ GL_DRAW_BUFFER13_WEBGL), /* harmony export */ GL_DRAW_BUFFER14: () => (/* binding */ GL_DRAW_BUFFER14), /* harmony export */ GL_DRAW_BUFFER14_WEBGL: () => (/* binding */ GL_DRAW_BUFFER14_WEBGL), /* harmony export */ GL_DRAW_BUFFER15: () => (/* binding */ GL_DRAW_BUFFER15), /* harmony export */ GL_DRAW_BUFFER15_WEBGL: () => (/* binding */ GL_DRAW_BUFFER15_WEBGL), /* harmony export */ GL_DRAW_BUFFER1_WEBGL: () => (/* binding */ GL_DRAW_BUFFER1_WEBGL), /* harmony export */ GL_DRAW_BUFFER2: () => (/* binding */ GL_DRAW_BUFFER2), /* harmony export */ GL_DRAW_BUFFER2_WEBGL: () => (/* binding */ GL_DRAW_BUFFER2_WEBGL), /* harmony export */ GL_DRAW_BUFFER3: () => (/* binding */ GL_DRAW_BUFFER3), /* harmony export */ GL_DRAW_BUFFER3_WEBGL: () => (/* binding */ GL_DRAW_BUFFER3_WEBGL), /* harmony export */ GL_DRAW_BUFFER4: () => (/* binding */ GL_DRAW_BUFFER4), /* harmony export */ GL_DRAW_BUFFER4_WEBGL: () => (/* binding */ GL_DRAW_BUFFER4_WEBGL), /* harmony export */ GL_DRAW_BUFFER5: () => (/* binding */ GL_DRAW_BUFFER5), /* harmony export */ GL_DRAW_BUFFER5_WEBGL: () => (/* binding */ GL_DRAW_BUFFER5_WEBGL), /* harmony export */ GL_DRAW_BUFFER6: () => (/* binding */ GL_DRAW_BUFFER6), /* harmony export */ GL_DRAW_BUFFER6_WEBGL: () => (/* binding */ GL_DRAW_BUFFER6_WEBGL), /* harmony export */ GL_DRAW_BUFFER7: () => (/* binding */ GL_DRAW_BUFFER7), /* harmony export */ GL_DRAW_BUFFER7_WEBGL: () => (/* binding */ GL_DRAW_BUFFER7_WEBGL), /* harmony export */ GL_DRAW_BUFFER8: () => (/* binding */ GL_DRAW_BUFFER8), /* harmony export */ GL_DRAW_BUFFER8_WEBGL: () => (/* binding */ GL_DRAW_BUFFER8_WEBGL), /* harmony export */ GL_DRAW_BUFFER9: () => (/* binding */ GL_DRAW_BUFFER9), /* harmony export */ GL_DRAW_BUFFER9_WEBGL: () => (/* binding */ GL_DRAW_BUFFER9_WEBGL), /* harmony export */ GL_DRAW_FRAMEBUFFER: () => (/* binding */ GL_DRAW_FRAMEBUFFER), /* harmony export */ GL_DRAW_FRAMEBUFFER_BINDING: () => (/* binding */ GL_DRAW_FRAMEBUFFER_BINDING), /* harmony export */ GL_DST_ALPHA: () => (/* binding */ GL_DST_ALPHA), /* harmony export */ GL_DST_COLOR: () => (/* binding */ GL_DST_COLOR), /* harmony export */ GL_DYNAMIC_COPY: () => (/* binding */ GL_DYNAMIC_COPY), /* harmony export */ GL_DYNAMIC_DRAW: () => (/* binding */ GL_DYNAMIC_DRAW), /* harmony export */ GL_DYNAMIC_READ: () => (/* binding */ GL_DYNAMIC_READ), /* harmony export */ GL_ELEMENT_ARRAY_BUFFER: () => (/* binding */ GL_ELEMENT_ARRAY_BUFFER), /* harmony export */ GL_ELEMENT_ARRAY_BUFFER_BINDING: () => (/* binding */ GL_ELEMENT_ARRAY_BUFFER_BINDING), /* harmony export */ GL_EQUAL: () => (/* binding */ GL_EQUAL), /* harmony export */ GL_FASTEST: () => (/* binding */ GL_FASTEST), /* harmony export */ GL_FLOAT_32_UNSIGNED_INT_24_8_REV: () => (/* binding */ GL_FLOAT_32_UNSIGNED_INT_24_8_REV), /* harmony export */ GL_FLOAT_MAT2: () => (/* binding */ GL_FLOAT_MAT2), /* harmony export */ GL_FLOAT_MAT2X3: () => (/* binding */ GL_FLOAT_MAT2X3), /* harmony export */ GL_FLOAT_MAT2X4: () => (/* binding */ GL_FLOAT_MAT2X4), /* harmony export */ GL_FLOAT_MAT3: () => (/* binding */ GL_FLOAT_MAT3), /* harmony export */ GL_FLOAT_MAT3X2: () => (/* binding */ GL_FLOAT_MAT3X2), /* harmony export */ GL_FLOAT_MAT3X4: () => (/* binding */ GL_FLOAT_MAT3X4), /* harmony export */ GL_FLOAT_MAT4: () => (/* binding */ GL_FLOAT_MAT4), /* harmony export */ GL_FLOAT_MAT4X2: () => (/* binding */ GL_FLOAT_MAT4X2), /* harmony export */ GL_FLOAT_MAT4X3: () => (/* binding */ GL_FLOAT_MAT4X3), /* harmony export */ GL_FLOAT_VEC2: () => (/* binding */ GL_FLOAT_VEC2), /* harmony export */ GL_FLOAT_VEC3: () => (/* binding */ GL_FLOAT_VEC3), /* harmony export */ GL_FLOAT_VEC4: () => (/* binding */ GL_FLOAT_VEC4), /* harmony export */ GL_FRAGMENT_SHADER: () => (/* binding */ GL_FRAGMENT_SHADER), /* harmony export */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT: () => (/* binding */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT), /* harmony export */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: () => (/* binding */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES), /* harmony export */ GL_FRAMEBUFFER: () => (/* binding */ GL_FRAMEBUFFER), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: () => (/* binding */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL), /* harmony export */ GL_FRAMEBUFFER_BINDING: () => (/* binding */ GL_FRAMEBUFFER_BINDING), /* harmony export */ GL_FRAMEBUFFER_COMPLETE: () => (/* binding */ GL_FRAMEBUFFER_COMPLETE), /* harmony export */ GL_FRAMEBUFFER_DEFAULT: () => (/* binding */ GL_FRAMEBUFFER_DEFAULT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: () => (/* binding */ GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: () => (/* binding */ GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: () => (/* binding */ GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: () => (/* binding */ GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE), /* harmony export */ GL_FRAMEBUFFER_UNSUPPORTED: () => (/* binding */ GL_FRAMEBUFFER_UNSUPPORTED), /* harmony export */ GL_FRONT: () => (/* binding */ GL_FRONT), /* harmony export */ GL_FRONT_AND_BACK: () => (/* binding */ GL_FRONT_AND_BACK), /* harmony export */ GL_FRONT_FACE: () => (/* binding */ GL_FRONT_FACE), /* harmony export */ GL_FUNC_ADD: () => (/* binding */ GL_FUNC_ADD), /* harmony export */ GL_FUNC_REVERSE_SUBTRACT: () => (/* binding */ GL_FUNC_REVERSE_SUBTRACT), /* harmony export */ GL_FUNC_SUBSTRACT: () => (/* binding */ GL_FUNC_SUBSTRACT), /* harmony export */ GL_GENERATE_MIPMAP_HINT: () => (/* binding */ GL_GENERATE_MIPMAP_HINT), /* harmony export */ GL_GEQUAL: () => (/* binding */ GL_GEQUAL), /* harmony export */ GL_GPU_DISJOINT_EXT: () => (/* binding */ GL_GPU_DISJOINT_EXT), /* harmony export */ GL_GREATER: () => (/* binding */ GL_GREATER), /* harmony export */ GL_GREEN_BITS: () => (/* binding */ GL_GREEN_BITS), /* harmony export */ GL_HALF_FLOAT: () => (/* binding */ GL_HALF_FLOAT), /* harmony export */ GL_HALF_FLOAT_OES: () => (/* binding */ GL_HALF_FLOAT_OES), /* harmony export */ GL_HIGH_FLOAT: () => (/* binding */ GL_HIGH_FLOAT), /* harmony export */ GL_HIGH_INT: () => (/* binding */ GL_HIGH_INT), /* harmony export */ GL_IMPLEMENTATION_COLOR_READ_FORMAT: () => (/* binding */ GL_IMPLEMENTATION_COLOR_READ_FORMAT), /* harmony export */ GL_IMPLEMENTATION_COLOR_READ_TYPE: () => (/* binding */ GL_IMPLEMENTATION_COLOR_READ_TYPE), /* harmony export */ GL_INCR: () => (/* binding */ GL_INCR), /* harmony export */ GL_INCR_WRAP: () => (/* binding */ GL_INCR_WRAP), /* harmony export */ GL_INTERLEAVED_ATTRIBS: () => (/* binding */ GL_INTERLEAVED_ATTRIBS), /* harmony export */ GL_INT_2_10_10_10_REV: () => (/* binding */ GL_INT_2_10_10_10_REV), /* harmony export */ GL_INT_SAMPLER_2D: () => (/* binding */ GL_INT_SAMPLER_2D), /* harmony export */ GL_INT_SAMPLER_2D_ARRAY: () => (/* binding */ GL_INT_SAMPLER_2D_ARRAY), /* harmony export */ GL_INT_SAMPLER_3D: () => (/* binding */ GL_INT_SAMPLER_3D), /* harmony export */ GL_INT_SAMPLER_CUBE: () => (/* binding */ GL_INT_SAMPLER_CUBE), /* harmony export */ GL_INT_VEC2: () => (/* binding */ GL_INT_VEC2), /* harmony export */ GL_INT_VEC3: () => (/* binding */ GL_INT_VEC3), /* harmony export */ GL_INT_VEC4: () => (/* binding */ GL_INT_VEC4), /* harmony export */ GL_INVALID_ENUM: () => (/* binding */ GL_INVALID_ENUM), /* harmony export */ GL_INVALID_FRAMEBUFFER_OPERATION: () => (/* binding */ GL_INVALID_FRAMEBUFFER_OPERATION), /* harmony export */ GL_INVALID_INDEX: () => (/* binding */ GL_INVALID_INDEX), /* harmony export */ GL_INVALID_OPERATION: () => (/* binding */ GL_INVALID_OPERATION), /* harmony export */ GL_INVALID_VALUE: () => (/* binding */ GL_INVALID_VALUE), /* harmony export */ GL_INVERT: () => (/* binding */ GL_INVERT), /* harmony export */ GL_KEEP: () => (/* binding */ GL_KEEP), /* harmony export */ GL_LEQUAL: () => (/* binding */ GL_LEQUAL), /* harmony export */ GL_LESS: () => (/* binding */ GL_LESS), /* harmony export */ GL_LINEAR: () => (/* binding */ GL_LINEAR), /* harmony export */ GL_LINEAR_MIPMAP_LINEAR: () => (/* binding */ GL_LINEAR_MIPMAP_LINEAR), /* harmony export */ GL_LINEAR_MIPMAP_NEAREST: () => (/* binding */ GL_LINEAR_MIPMAP_NEAREST), /* harmony export */ GL_LINES: () => (/* binding */ GL_LINES), /* harmony export */ GL_LINE_LOOP: () => (/* binding */ GL_LINE_LOOP), /* harmony export */ GL_LINE_STRIP: () => (/* binding */ GL_LINE_STRIP), /* harmony export */ GL_LINE_WIDTH: () => (/* binding */ GL_LINE_WIDTH), /* harmony export */ GL_LINK_STATUS: () => (/* binding */ GL_LINK_STATUS), /* harmony export */ GL_LOW_FLOAT: () => (/* binding */ GL_LOW_FLOAT), /* harmony export */ GL_LOW_INT: () => (/* binding */ GL_LOW_INT), /* harmony export */ GL_LUMINANCE: () => (/* binding */ GL_LUMINANCE), /* harmony export */ GL_LUMINANCE_ALPHA: () => (/* binding */ GL_LUMINANCE_ALPHA), /* harmony export */ GL_MAX: () => (/* binding */ GL_MAX), /* harmony export */ GL_MAX_3D_TEXTURE_SIZE: () => (/* binding */ GL_MAX_3D_TEXTURE_SIZE), /* harmony export */ GL_MAX_ARRAY_TEXTURE_LAYERS: () => (/* binding */ GL_MAX_ARRAY_TEXTURE_LAYERS), /* harmony export */ GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL: () => (/* binding */ GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL), /* harmony export */ GL_MAX_COLOR_ATTACHMENTS: () => (/* binding */ GL_MAX_COLOR_ATTACHMENTS), /* harmony export */ GL_MAX_COLOR_ATTACHMENTS_WEBGL: () => (/* binding */ GL_MAX_COLOR_ATTACHMENTS_WEBGL), /* harmony export */ GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: () => (/* binding */ GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: () => (/* binding */ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_COMBINED_UNIFORM_BLOCKS: () => (/* binding */ GL_MAX_COMBINED_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: () => (/* binding */ GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_CUBE_MAP_TEXTURE_SIZE: () => (/* binding */ GL_MAX_CUBE_MAP_TEXTURE_SIZE), /* harmony export */ GL_MAX_DRAW_BUFFERS: () => (/* binding */ GL_MAX_DRAW_BUFFERS), /* harmony export */ GL_MAX_DRAW_BUFFERS_WEBGL: () => (/* binding */ GL_MAX_DRAW_BUFFERS_WEBGL), /* harmony export */ GL_MAX_ELEMENTS_INDICES: () => (/* binding */ GL_MAX_ELEMENTS_INDICES), /* harmony export */ GL_MAX_ELEMENTS_VERTICES: () => (/* binding */ GL_MAX_ELEMENTS_VERTICES), /* harmony export */ GL_MAX_ELEMENT_INDEX: () => (/* binding */ GL_MAX_ELEMENT_INDEX), /* harmony export */ GL_MAX_EXT: () => (/* binding */ GL_MAX_EXT), /* harmony export */ GL_MAX_FRAGMENT_INPUT_COMPONENTS: () => (/* binding */ GL_MAX_FRAGMENT_INPUT_COMPONENTS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_BLOCKS: () => (/* binding */ GL_MAX_FRAGMENT_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: () => (/* binding */ GL_MAX_FRAGMENT_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_VECTORS: () => (/* binding */ GL_MAX_FRAGMENT_UNIFORM_VECTORS), /* harmony export */ GL_MAX_PROGRAM_TEXEL_OFFSET: () => (/* binding */ GL_MAX_PROGRAM_TEXEL_OFFSET), /* harmony export */ GL_MAX_RENDERBUFFER_SIZE: () => (/* binding */ GL_MAX_RENDERBUFFER_SIZE), /* harmony export */ GL_MAX_SAMPLES: () => (/* binding */ GL_MAX_SAMPLES), /* harmony export */ GL_MAX_SERVER_WAIT_TIMEOUT: () => (/* binding */ GL_MAX_SERVER_WAIT_TIMEOUT), /* harmony export */ GL_MAX_TEXTURE_IMAGE_UNITS: () => (/* binding */ GL_MAX_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_TEXTURE_LOD_BIAS: () => (/* binding */ GL_MAX_TEXTURE_LOD_BIAS), /* harmony export */ GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: () => (/* binding */ GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT), /* harmony export */ GL_MAX_TEXTURE_SIZE: () => (/* binding */ GL_MAX_TEXTURE_SIZE), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: () => (/* binding */ GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: () => (/* binding */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: () => (/* binding */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS), /* harmony export */ GL_MAX_UNIFORM_BLOCK_SIZE: () => (/* binding */ GL_MAX_UNIFORM_BLOCK_SIZE), /* harmony export */ GL_MAX_UNIFORM_BUFFER_BINDINGS: () => (/* binding */ GL_MAX_UNIFORM_BUFFER_BINDINGS), /* harmony export */ GL_MAX_VARYING_COMPONENTS: () => (/* binding */ GL_MAX_VARYING_COMPONENTS), /* harmony export */ GL_MAX_VARYING_VECTORS: () => (/* binding */ GL_MAX_VARYING_VECTORS), /* harmony export */ GL_MAX_VERTEX_ATTRIBS: () => (/* binding */ GL_MAX_VERTEX_ATTRIBS), /* harmony export */ GL_MAX_VERTEX_OUTPUT_COMPONENTS: () => (/* binding */ GL_MAX_VERTEX_OUTPUT_COMPONENTS), /* harmony export */ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: () => (/* binding */ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_BLOCKS: () => (/* binding */ GL_MAX_VERTEX_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_COMPONENTS: () => (/* binding */ GL_MAX_VERTEX_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_VECTORS: () => (/* binding */ GL_MAX_VERTEX_UNIFORM_VECTORS), /* harmony export */ GL_MAX_VIEWPORT_DIMS: () => (/* binding */ GL_MAX_VIEWPORT_DIMS), /* harmony export */ GL_MEDIUM_FLOAT: () => (/* binding */ GL_MEDIUM_FLOAT), /* harmony export */ GL_MEDIUM_INT: () => (/* binding */ GL_MEDIUM_INT), /* harmony export */ GL_MIN: () => (/* binding */ GL_MIN), /* harmony export */ GL_MIN_EXT: () => (/* binding */ GL_MIN_EXT), /* harmony export */ GL_MIN_PROGRAM_TEXEL_OFFSET: () => (/* binding */ GL_MIN_PROGRAM_TEXEL_OFFSET), /* harmony export */ GL_MIRRORED_REPEAT: () => (/* binding */ GL_MIRRORED_REPEAT), /* harmony export */ GL_NEAREST: () => (/* binding */ GL_NEAREST), /* harmony export */ GL_NEAREST_MIPMAP_LINEAR: () => (/* binding */ GL_NEAREST_MIPMAP_LINEAR), /* harmony export */ GL_NEAREST_MIPMAP_NEAREST: () => (/* binding */ GL_NEAREST_MIPMAP_NEAREST), /* harmony export */ GL_NEVER: () => (/* binding */ GL_NEVER), /* harmony export */ GL_NICEST: () => (/* binding */ GL_NICEST), /* harmony export */ GL_NONE: () => (/* binding */ GL_NONE), /* harmony export */ GL_NOTEQUAL: () => (/* binding */ GL_NOTEQUAL), /* harmony export */ GL_NO_ERROR: () => (/* binding */ GL_NO_ERROR), /* harmony export */ GL_OBJECT_TYPE: () => (/* binding */ GL_OBJECT_TYPE), /* harmony export */ GL_ONE: () => (/* binding */ GL_ONE), /* harmony export */ GL_ONE_MINUS_CONSTANT_ALPHA: () => (/* binding */ GL_ONE_MINUS_CONSTANT_ALPHA), /* harmony export */ GL_ONE_MINUS_CONSTANT_COLOR: () => (/* binding */ GL_ONE_MINUS_CONSTANT_COLOR), /* harmony export */ GL_ONE_MINUS_DST_ALPHA: () => (/* binding */ GL_ONE_MINUS_DST_ALPHA), /* harmony export */ GL_ONE_MINUS_DST_COLOR: () => (/* binding */ GL_ONE_MINUS_DST_COLOR), /* harmony export */ GL_ONE_MINUS_SRC_ALPHA: () => (/* binding */ GL_ONE_MINUS_SRC_ALPHA), /* harmony export */ GL_ONE_MINUS_SRC_COLOR: () => (/* binding */ GL_ONE_MINUS_SRC_COLOR), /* harmony export */ GL_OUT_OF_MEMORY: () => (/* binding */ GL_OUT_OF_MEMORY), /* harmony export */ GL_PACK_ALIGNMENT: () => (/* binding */ GL_PACK_ALIGNMENT), /* harmony export */ GL_PACK_ROW_LENGTH: () => (/* binding */ GL_PACK_ROW_LENGTH), /* harmony export */ GL_PACK_SKIP_PIXELS: () => (/* binding */ GL_PACK_SKIP_PIXELS), /* harmony export */ GL_PACK_SKIP_ROWS: () => (/* binding */ GL_PACK_SKIP_ROWS), /* harmony export */ GL_PIXEL_PACK_BUFFER: () => (/* binding */ GL_PIXEL_PACK_BUFFER), /* harmony export */ GL_PIXEL_PACK_BUFFER_BINDING: () => (/* binding */ GL_PIXEL_PACK_BUFFER_BINDING), /* harmony export */ GL_PIXEL_UNPACK_BUFFER: () => (/* binding */ GL_PIXEL_UNPACK_BUFFER), /* harmony export */ GL_PIXEL_UNPACK_BUFFER_BINDING: () => (/* binding */ GL_PIXEL_UNPACK_BUFFER_BINDING), /* harmony export */ GL_PIXEL_UNSIGNED_BYTE: () => (/* binding */ GL_PIXEL_UNSIGNED_BYTE), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_4_4_4_4: () => (/* binding */ GL_PIXEL_UNSIGNED_SHORT_4_4_4_4), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_5_5_5_1: () => (/* binding */ GL_PIXEL_UNSIGNED_SHORT_5_5_5_1), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_5_6_5: () => (/* binding */ GL_PIXEL_UNSIGNED_SHORT_5_6_5), /* harmony export */ GL_POINTS: () => (/* binding */ GL_POINTS), /* harmony export */ GL_POLYGON_OFFSET_FACTOR: () => (/* binding */ GL_POLYGON_OFFSET_FACTOR), /* harmony export */ GL_POLYGON_OFFSET_FILL: () => (/* binding */ GL_POLYGON_OFFSET_FILL), /* harmony export */ GL_POLYGON_OFFSET_UNITS: () => (/* binding */ GL_POLYGON_OFFSET_UNITS), /* harmony export */ GL_QUERY_COUNTER_BITS_EXT: () => (/* binding */ GL_QUERY_COUNTER_BITS_EXT), /* harmony export */ GL_QUERY_RESULT: () => (/* binding */ GL_QUERY_RESULT), /* harmony export */ GL_QUERY_RESULT_AVAILABLE: () => (/* binding */ GL_QUERY_RESULT_AVAILABLE), /* harmony export */ GL_QUERY_RESULT_AVAILABLE_EXT: () => (/* binding */ GL_QUERY_RESULT_AVAILABLE_EXT), /* harmony export */ GL_QUERY_RESULT_EXT: () => (/* binding */ GL_QUERY_RESULT_EXT), /* harmony export */ GL_R11F_G11F_B10F: () => (/* binding */ GL_R11F_G11F_B10F), /* harmony export */ GL_R16F: () => (/* binding */ GL_R16F), /* harmony export */ GL_R16I: () => (/* binding */ GL_R16I), /* harmony export */ GL_R16UI: () => (/* binding */ GL_R16UI), /* harmony export */ GL_R32F: () => (/* binding */ GL_R32F), /* harmony export */ GL_R32I: () => (/* binding */ GL_R32I), /* harmony export */ GL_R32UI: () => (/* binding */ GL_R32UI), /* harmony export */ GL_R8: () => (/* binding */ GL_R8), /* harmony export */ GL_R8I: () => (/* binding */ GL_R8I), /* harmony export */ GL_R8UI: () => (/* binding */ GL_R8UI), /* harmony export */ GL_R8_SNORM: () => (/* binding */ GL_R8_SNORM), /* harmony export */ GL_RASTERIZER_DISCARD: () => (/* binding */ GL_RASTERIZER_DISCARD), /* harmony export */ GL_READ_BUFFER: () => (/* binding */ GL_READ_BUFFER), /* harmony export */ GL_READ_FRAMEBUFFER: () => (/* binding */ GL_READ_FRAMEBUFFER), /* harmony export */ GL_READ_FRAMEBUFFER_BINDING: () => (/* binding */ GL_READ_FRAMEBUFFER_BINDING), /* harmony export */ GL_RED: () => (/* binding */ GL_RED), /* harmony export */ GL_RED_BITS: () => (/* binding */ GL_RED_BITS), /* harmony export */ GL_RED_INTEGER: () => (/* binding */ GL_RED_INTEGER), /* harmony export */ GL_RENDERBUFFER: () => (/* binding */ GL_RENDERBUFFER), /* harmony export */ GL_RENDERBUFFER_ALPHA_SIZE: () => (/* binding */ GL_RENDERBUFFER_ALPHA_SIZE), /* harmony export */ GL_RENDERBUFFER_BINDING: () => (/* binding */ GL_RENDERBUFFER_BINDING), /* harmony export */ GL_RENDERBUFFER_BLUE_SIZE: () => (/* binding */ GL_RENDERBUFFER_BLUE_SIZE), /* harmony export */ GL_RENDERBUFFER_DEPTH_SIZE: () => (/* binding */ GL_RENDERBUFFER_DEPTH_SIZE), /* harmony export */ GL_RENDERBUFFER_GREEN_SIZE: () => (/* binding */ GL_RENDERBUFFER_GREEN_SIZE), /* harmony export */ GL_RENDERBUFFER_HEIGHT: () => (/* binding */ GL_RENDERBUFFER_HEIGHT), /* harmony export */ GL_RENDERBUFFER_INTERNAL_FORMAT: () => (/* binding */ GL_RENDERBUFFER_INTERNAL_FORMAT), /* harmony export */ GL_RENDERBUFFER_RED_SIZE: () => (/* binding */ GL_RENDERBUFFER_RED_SIZE), /* harmony export */ GL_RENDERBUFFER_SAMPLES: () => (/* binding */ GL_RENDERBUFFER_SAMPLES), /* harmony export */ GL_RENDERBUFFER_STENCIL_SIZE: () => (/* binding */ GL_RENDERBUFFER_STENCIL_SIZE), /* harmony export */ GL_RENDERBUFFER_WIDTH: () => (/* binding */ GL_RENDERBUFFER_WIDTH), /* harmony export */ GL_RENDERER: () => (/* binding */ GL_RENDERER), /* harmony export */ GL_REPEAT: () => (/* binding */ GL_REPEAT), /* harmony export */ GL_REPLACE: () => (/* binding */ GL_REPLACE), /* harmony export */ GL_RG: () => (/* binding */ GL_RG), /* harmony export */ GL_RG16F: () => (/* binding */ GL_RG16F), /* harmony export */ GL_RG16I: () => (/* binding */ GL_RG16I), /* harmony export */ GL_RG16UI: () => (/* binding */ GL_RG16UI), /* harmony export */ GL_RG32F: () => (/* binding */ GL_RG32F), /* harmony export */ GL_RG32I: () => (/* binding */ GL_RG32I), /* harmony export */ GL_RG32UI: () => (/* binding */ GL_RG32UI), /* harmony export */ GL_RG8: () => (/* binding */ GL_RG8), /* harmony export */ GL_RG8I: () => (/* binding */ GL_RG8I), /* harmony export */ GL_RG8UI: () => (/* binding */ GL_RG8UI), /* harmony export */ GL_RG8_SNORM: () => (/* binding */ GL_RG8_SNORM), /* harmony export */ GL_RGB: () => (/* binding */ GL_RGB), /* harmony export */ GL_RGB10_A2: () => (/* binding */ GL_RGB10_A2), /* harmony export */ GL_RGB10_A2UI: () => (/* binding */ GL_RGB10_A2UI), /* harmony export */ GL_RGB16F: () => (/* binding */ GL_RGB16F), /* harmony export */ GL_RGB16I: () => (/* binding */ GL_RGB16I), /* harmony export */ GL_RGB16UI: () => (/* binding */ GL_RGB16UI), /* harmony export */ GL_RGB32F: () => (/* binding */ GL_RGB32F), /* harmony export */ GL_RGB32F_EXT: () => (/* binding */ GL_RGB32F_EXT), /* harmony export */ GL_RGB32I: () => (/* binding */ GL_RGB32I), /* harmony export */ GL_RGB32UI: () => (/* binding */ GL_RGB32UI), /* harmony export */ GL_RGB565: () => (/* binding */ GL_RGB565), /* harmony export */ GL_RGB5_A1: () => (/* binding */ GL_RGB5_A1), /* harmony export */ GL_RGB8: () => (/* binding */ GL_RGB8), /* harmony export */ GL_RGB8I: () => (/* binding */ GL_RGB8I), /* harmony export */ GL_RGB8UI: () => (/* binding */ GL_RGB8UI), /* harmony export */ GL_RGB8_SNORM: () => (/* binding */ GL_RGB8_SNORM), /* harmony export */ GL_RGB9_E5: () => (/* binding */ GL_RGB9_E5), /* harmony export */ GL_RGBA: () => (/* binding */ GL_RGBA), /* harmony export */ GL_RGBA16F: () => (/* binding */ GL_RGBA16F), /* harmony export */ GL_RGBA16I: () => (/* binding */ GL_RGBA16I), /* harmony export */ GL_RGBA16UI: () => (/* binding */ GL_RGBA16UI), /* harmony export */ GL_RGBA32F: () => (/* binding */ GL_RGBA32F), /* harmony export */ GL_RGBA32F_EXT: () => (/* binding */ GL_RGBA32F_EXT), /* harmony export */ GL_RGBA32I: () => (/* binding */ GL_RGBA32I), /* harmony export */ GL_RGBA32UI: () => (/* binding */ GL_RGBA32UI), /* harmony export */ GL_RGBA4: () => (/* binding */ GL_RGBA4), /* harmony export */ GL_RGBA8: () => (/* binding */ GL_RGBA8), /* harmony export */ GL_RGBA8I: () => (/* binding */ GL_RGBA8I), /* harmony export */ GL_RGBA8UI: () => (/* binding */ GL_RGBA8UI), /* harmony export */ GL_RGBA8_SNORM: () => (/* binding */ GL_RGBA8_SNORM), /* harmony export */ GL_RGBA_INTEGER: () => (/* binding */ GL_RGBA_INTEGER), /* harmony export */ GL_RGB_INTEGER: () => (/* binding */ GL_RGB_INTEGER), /* harmony export */ GL_RG_INTEGER: () => (/* binding */ GL_RG_INTEGER), /* harmony export */ GL_SAMPLER_2D: () => (/* binding */ GL_SAMPLER_2D), /* harmony export */ GL_SAMPLER_2D_ARRAY: () => (/* binding */ GL_SAMPLER_2D_ARRAY), /* harmony export */ GL_SAMPLER_2D_ARRAY_SHADOW: () => (/* binding */ GL_SAMPLER_2D_ARRAY_SHADOW), /* harmony export */ GL_SAMPLER_2D_SHADOW: () => (/* binding */ GL_SAMPLER_2D_SHADOW), /* harmony export */ GL_SAMPLER_3D: () => (/* binding */ GL_SAMPLER_3D), /* harmony export */ GL_SAMPLER_BINDING: () => (/* binding */ GL_SAMPLER_BINDING), /* harmony export */ GL_SAMPLER_CUBE: () => (/* binding */ GL_SAMPLER_CUBE), /* harmony export */ GL_SAMPLER_CUBE_SHADOW: () => (/* binding */ GL_SAMPLER_CUBE_SHADOW), /* harmony export */ GL_SAMPLES: () => (/* binding */ GL_SAMPLES), /* harmony export */ GL_SAMPLE_ALPHA_TO_COVERAGE: () => (/* binding */ GL_SAMPLE_ALPHA_TO_COVERAGE), /* harmony export */ GL_SAMPLE_BUFFERS: () => (/* binding */ GL_SAMPLE_BUFFERS), /* harmony export */ GL_SAMPLE_COVERAGE: () => (/* binding */ GL_SAMPLE_COVERAGE), /* harmony export */ GL_SAMPLE_COVERAGE_INVERT: () => (/* binding */ GL_SAMPLE_COVERAGE_INVERT), /* harmony export */ GL_SAMPLE_COVERAGE_VALUE: () => (/* binding */ GL_SAMPLE_COVERAGE_VALUE), /* harmony export */ GL_SCISSOR_BOX: () => (/* binding */ GL_SCISSOR_BOX), /* harmony export */ GL_SCISSOR_TEST: () => (/* binding */ GL_SCISSOR_TEST), /* harmony export */ GL_SEPARATE_ATTRIBS: () => (/* binding */ GL_SEPARATE_ATTRIBS), /* harmony export */ GL_SHADER_TYPE: () => (/* binding */ GL_SHADER_TYPE), /* harmony export */ GL_SHADING_LANGUAGE_VERSION: () => (/* binding */ GL_SHADING_LANGUAGE_VERSION), /* harmony export */ GL_SIGNALED: () => (/* binding */ GL_SIGNALED), /* harmony export */ GL_SIGNED_NORMALIZED: () => (/* binding */ GL_SIGNED_NORMALIZED), /* harmony export */ GL_SRC_ALPHA: () => (/* binding */ GL_SRC_ALPHA), /* harmony export */ GL_SRC_ALPHA_SATURATE: () => (/* binding */ GL_SRC_ALPHA_SATURATE), /* harmony export */ GL_SRC_COLOR: () => (/* binding */ GL_SRC_COLOR), /* harmony export */ GL_SRGB: () => (/* binding */ GL_SRGB), /* harmony export */ GL_SRGB8: () => (/* binding */ GL_SRGB8), /* harmony export */ GL_SRGB8_ALPHA8: () => (/* binding */ GL_SRGB8_ALPHA8), /* harmony export */ GL_SRGB8_ALPHA8_EXT: () => (/* binding */ GL_SRGB8_ALPHA8_EXT), /* harmony export */ GL_SRGB_ALPHA_EXT: () => (/* binding */ GL_SRGB_ALPHA_EXT), /* harmony export */ GL_SRGB_EXT: () => (/* binding */ GL_SRGB_EXT), /* harmony export */ GL_STATIC_COPY: () => (/* binding */ GL_STATIC_COPY), /* harmony export */ GL_STATIC_DRAW: () => (/* binding */ GL_STATIC_DRAW), /* harmony export */ GL_STATIC_READ: () => (/* binding */ GL_STATIC_READ), /* harmony export */ GL_STENCIL: () => (/* binding */ GL_STENCIL), /* harmony export */ GL_STENCIL_ATTACHMENT: () => (/* binding */ GL_STENCIL_ATTACHMENT), /* harmony export */ GL_STENCIL_BACK_FAIL: () => (/* binding */ GL_STENCIL_BACK_FAIL), /* harmony export */ GL_STENCIL_BACK_FUNC: () => (/* binding */ GL_STENCIL_BACK_FUNC), /* harmony export */ GL_STENCIL_BACK_PASS_DEPTH_FAIL: () => (/* binding */ GL_STENCIL_BACK_PASS_DEPTH_FAIL), /* harmony export */ GL_STENCIL_BACK_PASS_DEPTH_PASS: () => (/* binding */ GL_STENCIL_BACK_PASS_DEPTH_PASS), /* harmony export */ GL_STENCIL_BACK_REF: () => (/* binding */ GL_STENCIL_BACK_REF), /* harmony export */ GL_STENCIL_BACK_VALUE_MASK: () => (/* binding */ GL_STENCIL_BACK_VALUE_MASK), /* harmony export */ GL_STENCIL_BACK_WRITEMASK: () => (/* binding */ GL_STENCIL_BACK_WRITEMASK), /* harmony export */ GL_STENCIL_BITS: () => (/* binding */ GL_STENCIL_BITS), /* harmony export */ GL_STENCIL_BUFFER_BIT: () => (/* binding */ GL_STENCIL_BUFFER_BIT), /* harmony export */ GL_STENCIL_CLEAR_VALUE: () => (/* binding */ GL_STENCIL_CLEAR_VALUE), /* harmony export */ GL_STENCIL_FAIL: () => (/* binding */ GL_STENCIL_FAIL), /* harmony export */ GL_STENCIL_FUNC: () => (/* binding */ GL_STENCIL_FUNC), /* harmony export */ GL_STENCIL_INDEX: () => (/* binding */ GL_STENCIL_INDEX), /* harmony export */ GL_STENCIL_INDEX8: () => (/* binding */ GL_STENCIL_INDEX8), /* harmony export */ GL_STENCIL_PASS_DEPTH_FAIL: () => (/* binding */ GL_STENCIL_PASS_DEPTH_FAIL), /* harmony export */ GL_STENCIL_PASS_DEPTH_PASS: () => (/* binding */ GL_STENCIL_PASS_DEPTH_PASS), /* harmony export */ GL_STENCIL_REF: () => (/* binding */ GL_STENCIL_REF), /* harmony export */ GL_STENCIL_TEST: () => (/* binding */ GL_STENCIL_TEST), /* harmony export */ GL_STENCIL_VALUE_MASK: () => (/* binding */ GL_STENCIL_VALUE_MASK), /* harmony export */ GL_STENCIL_WRITEMASK: () => (/* binding */ GL_STENCIL_WRITEMASK), /* harmony export */ GL_STREAM_COPY: () => (/* binding */ GL_STREAM_COPY), /* harmony export */ GL_STREAM_DRAW: () => (/* binding */ GL_STREAM_DRAW), /* harmony export */ GL_STREAM_READ: () => (/* binding */ GL_STREAM_READ), /* harmony export */ GL_SUBPIXEL_BITS: () => (/* binding */ GL_SUBPIXEL_BITS), /* harmony export */ GL_SYNC_CONDITION: () => (/* binding */ GL_SYNC_CONDITION), /* harmony export */ GL_SYNC_FENCE: () => (/* binding */ GL_SYNC_FENCE), /* harmony export */ GL_SYNC_FLAGS: () => (/* binding */ GL_SYNC_FLAGS), /* harmony export */ GL_SYNC_FLUSH_COMMANDS_BIT: () => (/* binding */ GL_SYNC_FLUSH_COMMANDS_BIT), /* harmony export */ GL_SYNC_GPU_COMMANDS_COMPLETE: () => (/* binding */ GL_SYNC_GPU_COMMANDS_COMPLETE), /* harmony export */ GL_SYNC_STATUS: () => (/* binding */ GL_SYNC_STATUS), /* harmony export */ GL_TEXTURE: () => (/* binding */ GL_TEXTURE), /* harmony export */ GL_TEXTURE0: () => (/* binding */ GL_TEXTURE0), /* harmony export */ GL_TEXTURE1: () => (/* binding */ GL_TEXTURE1), /* harmony export */ GL_TEXTURE10: () => (/* binding */ GL_TEXTURE10), /* harmony export */ GL_TEXTURE11: () => (/* binding */ GL_TEXTURE11), /* harmony export */ GL_TEXTURE12: () => (/* binding */ GL_TEXTURE12), /* harmony export */ GL_TEXTURE13: () => (/* binding */ GL_TEXTURE13), /* harmony export */ GL_TEXTURE14: () => (/* binding */ GL_TEXTURE14), /* harmony export */ GL_TEXTURE15: () => (/* binding */ GL_TEXTURE15), /* harmony export */ GL_TEXTURE16: () => (/* binding */ GL_TEXTURE16), /* harmony export */ GL_TEXTURE17: () => (/* binding */ GL_TEXTURE17), /* harmony export */ GL_TEXTURE18: () => (/* binding */ GL_TEXTURE18), /* harmony export */ GL_TEXTURE19: () => (/* binding */ GL_TEXTURE19), /* harmony export */ GL_TEXTURE2: () => (/* binding */ GL_TEXTURE2), /* harmony export */ GL_TEXTURE20: () => (/* binding */ GL_TEXTURE20), /* harmony export */ GL_TEXTURE21: () => (/* binding */ GL_TEXTURE21), /* harmony export */ GL_TEXTURE22: () => (/* binding */ GL_TEXTURE22), /* harmony export */ GL_TEXTURE23: () => (/* binding */ GL_TEXTURE23), /* harmony export */ GL_TEXTURE24: () => (/* binding */ GL_TEXTURE24), /* harmony export */ GL_TEXTURE25: () => (/* binding */ GL_TEXTURE25), /* harmony export */ GL_TEXTURE26: () => (/* binding */ GL_TEXTURE26), /* harmony export */ GL_TEXTURE27: () => (/* binding */ GL_TEXTURE27), /* harmony export */ GL_TEXTURE28: () => (/* binding */ GL_TEXTURE28), /* harmony export */ GL_TEXTURE29: () => (/* binding */ GL_TEXTURE29), /* harmony export */ GL_TEXTURE3: () => (/* binding */ GL_TEXTURE3), /* harmony export */ GL_TEXTURE30: () => (/* binding */ GL_TEXTURE30), /* harmony export */ GL_TEXTURE31: () => (/* binding */ GL_TEXTURE31), /* harmony export */ GL_TEXTURE4: () => (/* binding */ GL_TEXTURE4), /* harmony export */ GL_TEXTURE5: () => (/* binding */ GL_TEXTURE5), /* harmony export */ GL_TEXTURE6: () => (/* binding */ GL_TEXTURE6), /* harmony export */ GL_TEXTURE7: () => (/* binding */ GL_TEXTURE7), /* harmony export */ GL_TEXTURE8: () => (/* binding */ GL_TEXTURE8), /* harmony export */ GL_TEXTURE9: () => (/* binding */ GL_TEXTURE9), /* harmony export */ GL_TEXTURE_2D: () => (/* binding */ GL_TEXTURE_2D), /* harmony export */ GL_TEXTURE_2D_ARRAY: () => (/* binding */ GL_TEXTURE_2D_ARRAY), /* harmony export */ GL_TEXTURE_3D: () => (/* binding */ GL_TEXTURE_3D), /* harmony export */ GL_TEXTURE_BASE_LEVEL: () => (/* binding */ GL_TEXTURE_BASE_LEVEL), /* harmony export */ GL_TEXTURE_BINDING_2D: () => (/* binding */ GL_TEXTURE_BINDING_2D), /* harmony export */ GL_TEXTURE_BINDING_2D_ARRAY: () => (/* binding */ GL_TEXTURE_BINDING_2D_ARRAY), /* harmony export */ GL_TEXTURE_BINDING_3D: () => (/* binding */ GL_TEXTURE_BINDING_3D), /* harmony export */ GL_TEXTURE_BINDING_CUBE_MAP: () => (/* binding */ GL_TEXTURE_BINDING_CUBE_MAP), /* harmony export */ GL_TEXTURE_COMPARE_FUNC: () => (/* binding */ GL_TEXTURE_COMPARE_FUNC), /* harmony export */ GL_TEXTURE_COMPARE_MODE: () => (/* binding */ GL_TEXTURE_COMPARE_MODE), /* harmony export */ GL_TEXTURE_CUBE_MAP: () => (/* binding */ GL_TEXTURE_CUBE_MAP), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_X: () => (/* binding */ GL_TEXTURE_CUBE_MAP_NEGATIVE_X), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: () => (/* binding */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: () => (/* binding */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_X: () => (/* binding */ GL_TEXTURE_CUBE_MAP_POSITIVE_X), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_Y: () => (/* binding */ GL_TEXTURE_CUBE_MAP_POSITIVE_Y), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_Z: () => (/* binding */ GL_TEXTURE_CUBE_MAP_POSITIVE_Z), /* harmony export */ GL_TEXTURE_IMMUTABLE_FORMAT: () => (/* binding */ GL_TEXTURE_IMMUTABLE_FORMAT), /* harmony export */ GL_TEXTURE_IMMUTABLE_LEVELS: () => (/* binding */ GL_TEXTURE_IMMUTABLE_LEVELS), /* harmony export */ GL_TEXTURE_MAG_FILTER: () => (/* binding */ GL_TEXTURE_MAG_FILTER), /* harmony export */ GL_TEXTURE_MAX_ANISOTROPY_EXT: () => (/* binding */ GL_TEXTURE_MAX_ANISOTROPY_EXT), /* harmony export */ GL_TEXTURE_MAX_LEVEL: () => (/* binding */ GL_TEXTURE_MAX_LEVEL), /* harmony export */ GL_TEXTURE_MAX_LOD: () => (/* binding */ GL_TEXTURE_MAX_LOD), /* harmony export */ GL_TEXTURE_MIN_FILTER: () => (/* binding */ GL_TEXTURE_MIN_FILTER), /* harmony export */ GL_TEXTURE_MIN_LOD: () => (/* binding */ GL_TEXTURE_MIN_LOD), /* harmony export */ GL_TEXTURE_WRAP_R: () => (/* binding */ GL_TEXTURE_WRAP_R), /* harmony export */ GL_TEXTURE_WRAP_S: () => (/* binding */ GL_TEXTURE_WRAP_S), /* harmony export */ GL_TEXTURE_WRAP_T: () => (/* binding */ GL_TEXTURE_WRAP_T), /* harmony export */ GL_TIMEOUT_EXPIRED: () => (/* binding */ GL_TIMEOUT_EXPIRED), /* harmony export */ GL_TIMEOUT_IGNORED: () => (/* binding */ GL_TIMEOUT_IGNORED), /* harmony export */ GL_TIMESTAMP_EXT: () => (/* binding */ GL_TIMESTAMP_EXT), /* harmony export */ GL_TIME_ELAPSED_EXT: () => (/* binding */ GL_TIME_ELAPSED_EXT), /* harmony export */ GL_TRANSFORM_FEEDBACK: () => (/* binding */ GL_TRANSFORM_FEEDBACK), /* harmony export */ GL_TRANSFORM_FEEDBACK_ACTIVE: () => (/* binding */ GL_TRANSFORM_FEEDBACK_ACTIVE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BINDING: () => (/* binding */ GL_TRANSFORM_FEEDBACK_BINDING), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER: () => (/* binding */ GL_TRANSFORM_FEEDBACK_BUFFER), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: () => (/* binding */ GL_TRANSFORM_FEEDBACK_BUFFER_BINDING), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_MODE: () => (/* binding */ GL_TRANSFORM_FEEDBACK_BUFFER_MODE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: () => (/* binding */ GL_TRANSFORM_FEEDBACK_BUFFER_SIZE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_START: () => (/* binding */ GL_TRANSFORM_FEEDBACK_BUFFER_START), /* harmony export */ GL_TRANSFORM_FEEDBACK_PAUSED: () => (/* binding */ GL_TRANSFORM_FEEDBACK_PAUSED), /* harmony export */ GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: () => (/* binding */ GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN), /* harmony export */ GL_TRANSFORM_FEEDBACK_VARYINGS: () => (/* binding */ GL_TRANSFORM_FEEDBACK_VARYINGS), /* harmony export */ GL_TRIANGLES: () => (/* binding */ GL_TRIANGLES), /* harmony export */ GL_TRIANGLE_FAN: () => (/* binding */ GL_TRIANGLE_FAN), /* harmony export */ GL_TRIANGLE_STRIP: () => (/* binding */ GL_TRIANGLE_STRIP), /* harmony export */ GL_UNIFORM_ARRAY_STRIDE: () => (/* binding */ GL_UNIFORM_ARRAY_STRIDE), /* harmony export */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: () => (/* binding */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS), /* harmony export */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: () => (/* binding */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES), /* harmony export */ GL_UNIFORM_BLOCK_BINDING: () => (/* binding */ GL_UNIFORM_BLOCK_BINDING), /* harmony export */ GL_UNIFORM_BLOCK_DATA_SIZE: () => (/* binding */ GL_UNIFORM_BLOCK_DATA_SIZE), /* harmony export */ GL_UNIFORM_BLOCK_INDEX: () => (/* binding */ GL_UNIFORM_BLOCK_INDEX), /* harmony export */ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: () => (/* binding */ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER), /* harmony export */ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: () => (/* binding */ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER), /* harmony export */ GL_UNIFORM_BUFFER: () => (/* binding */ GL_UNIFORM_BUFFER), /* harmony export */ GL_UNIFORM_BUFFER_BINDING: () => (/* binding */ GL_UNIFORM_BUFFER_BINDING), /* harmony export */ GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: () => (/* binding */ GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT), /* harmony export */ GL_UNIFORM_BUFFER_SIZE: () => (/* binding */ GL_UNIFORM_BUFFER_SIZE), /* harmony export */ GL_UNIFORM_BUFFER_START: () => (/* binding */ GL_UNIFORM_BUFFER_START), /* harmony export */ GL_UNIFORM_IS_ROW_MAJOR: () => (/* binding */ GL_UNIFORM_IS_ROW_MAJOR), /* harmony export */ GL_UNIFORM_MATRIX_STRIDE: () => (/* binding */ GL_UNIFORM_MATRIX_STRIDE), /* harmony export */ GL_UNIFORM_OFFSET: () => (/* binding */ GL_UNIFORM_OFFSET), /* harmony export */ GL_UNIFORM_SIZE: () => (/* binding */ GL_UNIFORM_SIZE), /* harmony export */ GL_UNIFORM_TYPE: () => (/* binding */ GL_UNIFORM_TYPE), /* harmony export */ GL_UNMASKED_RENDERER_WEBGL: () => (/* binding */ GL_UNMASKED_RENDERER_WEBGL), /* harmony export */ GL_UNMASKED_VENDOR_WEBGL: () => (/* binding */ GL_UNMASKED_VENDOR_WEBGL), /* harmony export */ GL_UNPACK_ALIGNMENT: () => (/* binding */ GL_UNPACK_ALIGNMENT), /* harmony export */ GL_UNPACK_COLORSPACE_CONVERSION_WEBGL: () => (/* binding */ GL_UNPACK_COLORSPACE_CONVERSION_WEBGL), /* harmony export */ GL_UNPACK_FLIP_Y_WEBGL: () => (/* binding */ GL_UNPACK_FLIP_Y_WEBGL), /* harmony export */ GL_UNPACK_IMAGE_HEIGHT: () => (/* binding */ GL_UNPACK_IMAGE_HEIGHT), /* harmony export */ GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL: () => (/* binding */ GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL), /* harmony export */ GL_UNPACK_ROW_LENGTH: () => (/* binding */ GL_UNPACK_ROW_LENGTH), /* harmony export */ GL_UNPACK_SKIP_IMAGES: () => (/* binding */ GL_UNPACK_SKIP_IMAGES), /* harmony export */ GL_UNPACK_SKIP_PIXELS: () => (/* binding */ GL_UNPACK_SKIP_PIXELS), /* harmony export */ GL_UNPACK_SKIP_ROWS: () => (/* binding */ GL_UNPACK_SKIP_ROWS), /* harmony export */ GL_UNSIGNALED: () => (/* binding */ GL_UNSIGNALED), /* harmony export */ GL_UNSIGNED_INT_10F_11F_11F_REV: () => (/* binding */ GL_UNSIGNED_INT_10F_11F_11F_REV), /* harmony export */ GL_UNSIGNED_INT_24_8: () => (/* binding */ GL_UNSIGNED_INT_24_8), /* harmony export */ GL_UNSIGNED_INT_24_8_WEBGL: () => (/* binding */ GL_UNSIGNED_INT_24_8_WEBGL), /* harmony export */ GL_UNSIGNED_INT_2_10_10_10_REV: () => (/* binding */ GL_UNSIGNED_INT_2_10_10_10_REV), /* harmony export */ GL_UNSIGNED_INT_5_9_9_9_REV: () => (/* binding */ GL_UNSIGNED_INT_5_9_9_9_REV), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_2D: () => (/* binding */ GL_UNSIGNED_INT_SAMPLER_2D), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: () => (/* binding */ GL_UNSIGNED_INT_SAMPLER_2D_ARRAY), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_3D: () => (/* binding */ GL_UNSIGNED_INT_SAMPLER_3D), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_CUBE: () => (/* binding */ GL_UNSIGNED_INT_SAMPLER_CUBE), /* harmony export */ GL_UNSIGNED_INT_VEC2: () => (/* binding */ GL_UNSIGNED_INT_VEC2), /* harmony export */ GL_UNSIGNED_INT_VEC3: () => (/* binding */ GL_UNSIGNED_INT_VEC3), /* harmony export */ GL_UNSIGNED_INT_VEC4: () => (/* binding */ GL_UNSIGNED_INT_VEC4), /* harmony export */ GL_UNSIGNED_NORMALIZED: () => (/* binding */ GL_UNSIGNED_NORMALIZED), /* harmony export */ GL_UNSIGNED_NORMALIZED_EXT: () => (/* binding */ GL_UNSIGNED_NORMALIZED_EXT), /* harmony export */ GL_VALIDATE_STATUS: () => (/* binding */ GL_VALIDATE_STATUS), /* harmony export */ GL_VENDOR: () => (/* binding */ GL_VENDOR), /* harmony export */ GL_VERSION: () => (/* binding */ GL_VERSION), /* harmony export */ GL_VERTEX_ARRAY_BINDING: () => (/* binding */ GL_VERTEX_ARRAY_BINDING), /* harmony export */ GL_VERTEX_ARRAY_BINDING_OES: () => (/* binding */ GL_VERTEX_ARRAY_BINDING_OES), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_ENABLED: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_ENABLED), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_INTEGER: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_INTEGER), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_NORMALIZED), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_POINTER: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_POINTER), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_SIZE: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_SIZE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_STRIDE: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_STRIDE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_TYPE: () => (/* binding */ GL_VERTEX_ATTRIB_ARRAY_TYPE), /* harmony export */ GL_VERTEX_SHADER: () => (/* binding */ GL_VERTEX_SHADER), /* harmony export */ GL_VIEWPORT: () => (/* binding */ GL_VIEWPORT), /* harmony export */ GL_WAIT_FAILED: () => (/* binding */ GL_WAIT_FAILED), /* harmony export */ GL_ZERO: () => (/* binding */ GL_ZERO) /* harmony export */ }); // This is from https://gist.github.com/TimvanScherpenzeel/1f4218a563789db17955a1926c8a8ee0#file-webgl-constants-ts. // Thank you TimvanScherpenzeel and all contributers! // ============================================================================================= // // The following defined constants and descriptions are directly ported from https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants. // Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/. // Contributors // https://developer.mozilla.org/en-US/profiles/Sheppy // https://developer.mozilla.org/en-US/profiles/fscholz // https://developer.mozilla.org/en-US/profiles/AtiX // https://developer.mozilla.org/en-US/profiles/Sebastianz // These constants are defined on the WebGLRenderingContext interface. // Clearing buffers // Constants passed to WebGLRenderingContext.clear() to clear buffer masks. /** * Passed to clear to clear the current depth buffer. * @constant {number} */ const GL_DEPTH_BUFFER_BIT = 0x00000100; /** * Passed to clear to clear the current stencil buffer. * @constant {number} */ const GL_STENCIL_BUFFER_BIT = 0x00000400; /** * Passed to clear to clear the current color buffer. * @constant {number} */ const GL_COLOR_BUFFER_BIT = 0x00004000; // Rendering primitives // Constants passed to WebGLRenderingContext.drawElements() or WebGLRenderingContext.drawArrays() to specify what kind of primitive to render. /** * Passed to drawElements or drawArrays to draw single points. * @constant {number} */ const GL_POINTS = 0x0000; /** * Passed to drawElements or drawArrays to draw lines. Each vertex connects to the one after it. * @constant {number} */ const GL_LINES = 0x0001; /** * Passed to drawElements or drawArrays to draw lines. Each set of two vertices is treated as a separate line segment. * @constant {number} */ const GL_LINE_LOOP = 0x0002; /** * Passed to drawElements or drawArrays to draw a connected group of line segments from the first vertex to the last. * @constant {number} */ const GL_LINE_STRIP = 0x0003; /** * Passed to drawElements or drawArrays to draw triangles. Each set of three vertices creates a separate triangle. * @constant {number} */ const GL_TRIANGLES = 0x0004; /** * Passed to drawElements or drawArrays to draw a connected group of triangles. * @constant {number} */ const GL_TRIANGLE_STRIP = 0x0005; /** * Passed to drawElements or drawArrays to draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan. * @constant {number} */ const GL_TRIANGLE_FAN = 0x0006; // Blending modes // Constants passed to WebGLRenderingContext.blendFunc() or WebGLRenderingContext.blendFuncSeparate() to specify the blending mode (for both, RBG and alpha, or separately). /** * Passed to blendFunc or blendFuncSeparate to turn off a component. * @constant {number} */ const GL_ZERO = 0; /** * Passed to blendFunc or blendFuncSeparate to turn on a component. * @constant {number} */ const GL_ONE = 1; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by the source elements color. * @constant {number} */ const GL_SRC_COLOR = 0x0300; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the source elements color. * @constant {number} */ const GL_ONE_MINUS_SRC_COLOR = 0x0301; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by the source's alpha. * @constant {number} */ const GL_SRC_ALPHA = 0x0302; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the source's alpha. * @constant {number} */ const GL_ONE_MINUS_SRC_ALPHA = 0x0303; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by the destination's alpha. * @constant {number} */ const GL_DST_ALPHA = 0x0304; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the destination's alpha. * @constant {number} */ const GL_ONE_MINUS_DST_ALPHA = 0x0305; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by the destination's color. * @constant {number} */ const GL_DST_COLOR = 0x0306; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the destination's color. * @constant {number} */ const GL_ONE_MINUS_DST_COLOR = 0x0307; /** * Passed to blendFunc or blendFuncSeparate to multiply a component by the minimum of source's alpha or one minus the destination's alpha. * @constant {number} */ const GL_SRC_ALPHA_SATURATE = 0x0308; /** * Passed to blendFunc or blendFuncSeparate to specify a constant color blend function. * @constant {number} */ const GL_CONSTANT_COLOR = 0x8001; /** * Passed to blendFunc or blendFuncSeparate to specify one minus a constant color blend function. * @constant {number} */ const GL_ONE_MINUS_CONSTANT_COLOR = 0x8002; /** * Passed to blendFunc or blendFuncSeparate to specify a constant alpha blend function. * @constant {number} */ const GL_CONSTANT_ALPHA = 0x8003; /** * Passed to blendFunc or blendFuncSeparate to specify one minus a constant alpha blend function. * @constant {number} */ const GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004; // Blending equations // Constants passed to WebGLRenderingContext.blendEquation() or WebGLRenderingContext.blendEquationSeparate() to control how the blending is calculated (for both, RBG and alpha, or separately). /** * Passed to blendEquation or blendEquationSeparate to set an addition blend function. * @constant {number} */ const GL_FUNC_ADD = 0x8006; /** * Passed to blendEquation or blendEquationSeparate to specify a subtraction blend function (source - destination). * @constant {number} */ const GL_FUNC_SUBSTRACT = 0x800a; /** * Passed to blendEquation or blendEquationSeparate to specify a reverse subtraction blend function (destination - source). * @constant {number} */ const GL_FUNC_REVERSE_SUBTRACT = 0x800b; // Getting GL parameter information // Constants passed to WebGLRenderingContext.getParameter() to specify what information to return. /** * Passed to getParameter to get the current RGB blend function. * @constant {number} */ const GL_BLEND_EQUATION = 0x8009; /** * Passed to getParameter to get the current RGB blend function. Same as BLEND_EQUATION. * @constant {number} */ const GL_BLEND_EQUATION_RGB = 0x8009; /** * Passed to getParameter to get the current alpha blend function. Same as BLEND_EQUATION. * @constant {number} */ const GL_BLEND_EQUATION_ALPHA = 0x883d; /** * Passed to getParameter to get the current destination RGB blend function. * @constant {number} */ const GL_BLEND_DST_RGB = 0x80c8; /** * Passed to getParameter to get the current source RGB blend function. * @constant {number} */ const GL_BLEND_SRC_RGB = 0x80c9; /** * Passed to getParameter to get the current destination alpha blend function. * @constant {number} */ const GL_BLEND_DST_ALPHA = 0x80ca; /** * Passed to getParameter to get the current source alpha blend function. * @constant {number} */ const GL_BLEND_SRC_ALPHA = 0x80cb; /** * Passed to getParameter to return a the current blend color. * @constant {number} */ const GL_BLEND_COLOR = 0x8005; /** * Passed to getParameter to get the array buffer binding. * @constant {number} */ const GL_ARRAY_BUFFER_BINDING = 0x8894; /** * Passed to getParameter to get the current element array buffer. * @constant {number} */ const GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895; /** * Passed to getParameter to get the current lineWidth (set by the lineWidth method). * @constant {number} */ const GL_LINE_WIDTH = 0x0b21; /** * Passed to getParameter to get the current size of a point drawn with gl.POINTS. * @constant {number} */ const GL_ALIASED_POINT_SIZE_RANGE = 0x846d; /** * Passed to getParameter to get the range of available widths for a line. Returns a length-2 array with the lo value at 0, and hight at 1. * @constant {number} */ const GL_ALIASED_LINE_WIDTH_RANGE = 0x846e; /** * Passed to getParameter to get the current value of cullFace. Should return FRONT, BACK, or FRONT_AND_BACK. * @constant {number} */ const GL_CULL_FACE_MODE = 0x0b45; /** * Passed to getParameter to determine the current value of frontFace. Should return CW or CCW. * @constant {number} */ const GL_FRONT_FACE = 0x0b46; /** * Passed to getParameter to return a length-2 array of floats giving the current depth range. * @constant {number} */ const GL_DEPTH_RANGE = 0x0b70; /** * Passed to getParameter to determine if the depth write mask is enabled. * @constant {number} */ const GL_DEPTH_WRITEMASK = 0x0b72; /** * Passed to getParameter to determine the current depth clear value. * @constant {number} */ const GL_DEPTH_CLEAR_VALUE = 0x0b73; /** * Passed to getParameter to get the current depth function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL. * @constant {number} */ const GL_DEPTH_FUNC = 0x0b74; /** * Passed to getParameter to get the value the stencil will be cleared to. * @constant {number} */ const GL_STENCIL_CLEAR_VALUE = 0x0b91; /** * Passed to getParameter to get the current stencil function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL. * @constant {number} */ const GL_STENCIL_FUNC = 0x0b92; /** * Passed to getParameter to get the current stencil fail function. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. * @constant {number} */ const GL_STENCIL_FAIL = 0x0b94; /** * Passed to getParameter to get the current stencil fail function should the depth buffer test fail. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. * @constant {number} */ const GL_STENCIL_PASS_DEPTH_FAIL = 0x0b95; /** * Passed to getParameter to get the current stencil fail function should the depth buffer test pass. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. * @constant {number} */ const GL_STENCIL_PASS_DEPTH_PASS = 0x0b96; /** * Passed to getParameter to get the reference value used for stencil tests. * @constant {number} */ const GL_STENCIL_REF = 0x0b97; /** * @constant {number} */ const GL_STENCIL_VALUE_MASK = 0x0b93; /** * @constant {number} */ const GL_STENCIL_WRITEMASK = 0x0b98; /** * @constant {number} */ const GL_STENCIL_BACK_FUNC = 0x8800; /** * @constant {number} */ const GL_STENCIL_BACK_FAIL = 0x8801; /** * @constant {number} */ const GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802; /** * @constant {number} */ const GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803; /** * @constant {number} */ const GL_STENCIL_BACK_REF = 0x8ca3; /** * @constant {number} */ const GL_STENCIL_BACK_VALUE_MASK = 0x8ca4; /** * @constant {number} */ const GL_STENCIL_BACK_WRITEMASK = 0x8ca5; /** * Returns an Int32Array with four elements for the current viewport dimensions. * @constant {number} */ const GL_VIEWPORT = 0x0ba2; /** * Returns an Int32Array with four elements for the current scissor box dimensions. * @constant {number} */ const GL_SCISSOR_BOX = 0x0c10; /** * @constant {number} */ const GL_COLOR_CLEAR_VALUE = 0x0c22; /** * @constant {number} */ const GL_COLOR_WRITEMASK = 0x0c23; /** * @constant {number} */ const GL_UNPACK_ALIGNMENT = 0x0cf5; /** * @constant {number} */ const GL_PACK_ALIGNMENT = 0x0d05; /** * @constant {number} */ const GL_MAX_TEXTURE_SIZE = 0x0d33; /** * @constant {number} */ const GL_MAX_VIEWPORT_DIMS = 0x0d3a; /** * @constant {number} */ const GL_SUBPIXEL_BITS = 0x0d50; /** * @constant {number} */ const GL_RED_BITS = 0x0d52; /** * @constant {number} */ const GL_GREEN_BITS = 0x0d53; /** * @constant {number} */ const GL_BLUE_BITS = 0x0d54; /** * @constant {number} */ const GL_ALPHA_BITS = 0x0d55; /** * @constant {number} */ const GL_DEPTH_BITS = 0x0d56; /** * @constant {number} */ const GL_STENCIL_BITS = 0x0d57; /** * @constant {number} */ const GL_POLYGON_OFFSET_UNITS = 0x2a00; /** * @constant {number} */ const GL_POLYGON_OFFSET_FACTOR = 0x8038; /** * @constant {number} */ const GL_TEXTURE_BINDING_2D = 0x8069; /** * @constant {number} */ const GL_SAMPLE_BUFFERS = 0x80a8; /** * @constant {number} */ const GL_SAMPLES = 0x80a9; /** * @constant {number} */ const GL_SAMPLE_COVERAGE_VALUE = 0x80aa; /** * @constant {number} */ const GL_SAMPLE_COVERAGE_INVERT = 0x80ab; /** * @constant {number} */ const GL_COMPRESSED_TEXTURE_FORMATS = 0x86a3; /** * @constant {number} */ const GL_VENDOR = 0x1f00; /** * @constant {number} */ const GL_RENDERER = 0x1f01; /** * @constant {number} */ const GL_VERSION = 0x1f02; /** * @constant {number} */ const GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8b9a; /** * @constant {number} */ const GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8b9b; /** * @constant {number} */ const GL_BROWSER_DEFAULT_WEBGL = 0x9244; // Buffers // Constants passed to WebGLRenderingContext.bufferData(), WebGLRenderingContext.bufferSubData(), WebGLRenderingContext.bindBuffer(), or WebGLRenderingContext.getBufferParameter(). /** * Passed to bufferData as a hint about whether the contents of the buffer are likely to be used often and not change often. * @constant {number} */ const GL_STATIC_DRAW = 0x88e4; /** * Passed to bufferData as a hint about whether the contents of the buffer are likely to not be used often. * @constant {number} */ const GL_STREAM_DRAW = 0x88e0; /** * Passed to bufferData as a hint about whether the contents of the buffer are likely to be used often and change often. * @constant {number} */ const GL_DYNAMIC_DRAW = 0x88e8; /** * Passed to bindBuffer or bufferData to specify the type of buffer being used. * @constant {number} */ const GL_ARRAY_BUFFER = 0x8892; /** * Passed to bindBuffer or bufferData to specify the type of buffer being used. * @constant {number} */ const GL_ELEMENT_ARRAY_BUFFER = 0x8893; /** * Passed to getBufferParameter to get a buffer's size. * @constant {number} */ const GL_BUFFER_SIZE = 0x8764; /** * Passed to getBufferParameter to get the hint for the buffer passed in when it was created. * @constant {number} */ const GL_BUFFER_USAGE = 0x8765; // Vertex attributes // Constants passed to WebGLRenderingContext.getVertexAttrib(). /** * Passed to getVertexAttrib to read back the current vertex attribute. * @constant {number} */ const GL_CURRENT_VERTEX_ATTRIB = 0x8626; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886a; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889f; // Culling // Constants passed to WebGLRenderingContext.cullFace(). /** * Passed to enable/disable to turn on/off culling. Can also be used with getParameter to find the current culling method. * @constant {number} */ const GL_CULL_FACE = 0x0b44; /** * Passed to cullFace to specify that only front faces should be culled. * @constant {number} */ const GL_FRONT = 0x0404; /** * Passed to cullFace to specify that only back faces should be culled. * @constant {number} */ const GL_BACK = 0x0405; /** * Passed to cullFace to specify that front and back faces should be culled. * @constant {number} */ const GL_FRONT_AND_BACK = 0x0408; // Enabling and disabling // Constants passed to WebGLRenderingContext.enable() or WebGLRenderingContext.disable(). /** * Passed to enable/disable to turn on/off blending. Can also be used with getParameter to find the current blending method. * @constant {number} */ const GL_BLEND = 0x0be2; /** * Passed to enable/disable to turn on/off the depth test. Can also be used with getParameter to query the depth test. * @constant {number} */ const GL_DEPTH_TEST = 0x0b71; /** * Passed to enable/disable to turn on/off dithering. Can also be used with getParameter to find the current dithering method. * @constant {number} */ const GL_DITHER = 0x0bd0; /** * Passed to enable/disable to turn on/off the polygon offset. Useful for rendering hidden-line images, decals, and or solids with highlighted edges. Can also be used with getParameter to query the scissor test. * @constant {number} */ const GL_POLYGON_OFFSET_FILL = 0x8037; /** * Passed to enable/disable to turn on/off the alpha to coverage. Used in multi-sampling alpha channels. * @constant {number} */ const GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809e; /** * Passed to enable/disable to turn on/off the sample coverage. Used in multi-sampling. * @constant {number} */ const GL_SAMPLE_COVERAGE = 0x80a0; /** * Passed to enable/disable to turn on/off the scissor test. Can also be used with getParameter to query the scissor test. * @constant {number} */ const GL_SCISSOR_TEST = 0x0c11; /** * Passed to enable/disable to turn on/off the stencil test. Can also be used with getParameter to query the stencil test. * @constant {number} */ const GL_STENCIL_TEST = 0x0b90; // Errors // Constants returned from WebGLRenderingContext.getError(). /** * Returned from getError. * @constant {number} */ const GL_NO_ERROR = 0; /** * Returned from getError. * @constant {number} */ const GL_INVALID_ENUM = 0x0500; /** * Returned from getError. * @constant {number} */ const GL_INVALID_VALUE = 0x0501; /** * Returned from getError. * @constant {number} */ const GL_INVALID_OPERATION = 0x0502; /** * Returned from getError. * @constant {number} */ const GL_OUT_OF_MEMORY = 0x0505; /** * Returned from getError. * @constant {number} */ const GL_CONTEXT_LOST_WEBGL = 0x9242; // Front face directions // Constants passed to WebGLRenderingContext.frontFace(). /** * Passed to frontFace to specify the front face of a polygon is drawn in the clockwise direction, * @constant {number} */ const GL_CW = 0x0900; /** * Passed to frontFace to specify the front face of a polygon is drawn in the counter clockwise direction. * @constant {number} */ const GL_CCW = 0x0901; // Hints // Constants passed to WebGLRenderingContext.hint(). /** * There is no preference for this behavior. * @constant {number} */ const GL_DONT_CARE = 0x1100; /** * The most efficient behavior should be used. * @constant {number} */ const GL_FASTEST = 0x1101; /** * The most correct or the highest quality option should be used. * @constant {number} */ const GL_NICEST = 0x1102; /** * Hint for the quality of filtering when generating mipmap images with WebGLRenderingContext.generateMipmap(). * @constant {number} */ const GL_GENERATE_MIPMAP_HINT = 0x8192; // Data types /** * @constant {number} */ const GL_DATA_BYTE = 0x1400; /** * @constant {number} */ const GL_DATA_UNSIGNED_BYTE = 0x1401; /** * @constant {number} */ const GL_DATA_SHORT = 0x1402; /** * @constant {number} */ const GL_DATA_UNSIGNED_SHORT = 0x1403; /** * @constant {number} */ const GL_DATA_INT = 0x1404; /** * @constant {number} */ const GL_DATA_UNSIGNED_INT = 0x1405; /** * @constant {number} */ const GL_DATA_FLOAT = 0x1406; // Pixel formats /** * @constant {number} */ const GL_DEPTH_COMPONENT = 0x1902; /** * @constant {number} */ const GL_ALPHA = 0x1906; /** * @constant {number} */ const GL_RGB = 0x1907; /** * @constant {number} */ const GL_RGBA = 0x1908; /** * @constant {number} */ const GL_LUMINANCE = 0x1909; /** * @constant {number} */ const GL_LUMINANCE_ALPHA = 0x190a; // Pixel types /** * @constant {number} */ const GL_PIXEL_UNSIGNED_BYTE = 0x1401; /** * @constant {number} */ const GL_PIXEL_UNSIGNED_SHORT_4_4_4_4 = 0x8033; /** * @constant {number} */ const GL_PIXEL_UNSIGNED_SHORT_5_5_5_1 = 0x8034; /** * @constant {number} */ const GL_PIXEL_UNSIGNED_SHORT_5_6_5 = 0x8363; // Shaders // Constants passed to WebGLRenderingContext.getShaderParameter(). /** * Passed to createShader to define a fragment shader. * @constant {number} */ const GL_FRAGMENT_SHADER = 0x8b30; /** * Passed to createShader to define a vertex shader. * @constant {number} */ const GL_VERTEX_SHADER = 0x8b31; /** * Passed to getShaderParamter to get the status of the compilation. Returns false if the shader was not compiled. You can then query getShaderInfoLog to find the exact error. * @constant {number} */ const GL_COMPILE_STATUS = 0x8b81; /** * Passed to getShaderParamter to determine if a shader was deleted via deleteShader. Returns true if it was, false otherwise. * @constant {number} */ const GL_DELETE_STATUS = 0x8b80; /** * Passed to getProgramParameter after calling linkProgram to determine if a program was linked correctly. Returns false if there were errors. Use getProgramInfoLog to find the exact error. * @constant {number} */ const GL_LINK_STATUS = 0x8b82; /** * Passed to getProgramParameter after calling validateProgram to determine if it is valid. Returns false if errors were found. * @constant {number} */ const GL_VALIDATE_STATUS = 0x8b83; /** * Passed to getProgramParameter after calling attachShader to determine if the shader was attached correctly. Returns false if errors occurred. * @constant {number} */ const GL_ATTACHED_SHADERS = 0x8b85; /** * Passed to getProgramParameter to get the number of attributes active in a program. * @constant {number} */ const GL_ACTIVE_ATTRIBUTES = 0x8b89; /** * Passed to getProgramParamter to get the number of uniforms active in a program. * @constant {number} */ const GL_ACTIVE_UNIFORMS = 0x8b86; /** * The maximum number of entries possible in the vertex attribute list. * @constant {number} */ const GL_MAX_VERTEX_ATTRIBS = 0x8869; /** * @constant {number} */ const GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8dfb; /** * @constant {number} */ const GL_MAX_VARYING_VECTORS = 0x8dfc; /** * @constant {number} */ const GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8b4d; /** * @constant {number} */ const GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8b4c; /** * Implementation dependent number of maximum texture units. At least 8. * @constant {number} */ const GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872; /** * @constant {number} */ const GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8dfd; /** * @constant {number} */ const GL_SHADER_TYPE = 0x8b4f; /** * @constant {number} */ const GL_SHADING_LANGUAGE_VERSION = 0x8b8c; /** * @constant {number} */ const GL_CURRENT_PROGRAM = 0x8b8d; // Depth or stencil tests // Constants passed to WebGLRenderingContext.stencilFunc(). /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn. * @constant {number} */ const GL_NEVER = 0x0200; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn. * @constant {number} */ const GL_ALWAYS = 0x0207; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value. * @constant {number} */ const GL_LESS = 0x0201; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value. * @constant {number} */ const GL_EQUAL = 0x0202; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value. * @constant {number} */ const GL_LEQUAL = 0x0203; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value. * @constant {number} */ const GL_GREATER = 0x0204; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value. * @constant {number} */ const GL_GEQUAL = 0x0206; /** * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value. * @constant {number} */ const GL_NOTEQUAL = 0x0205; // Stencil actions // Constants passed to WebGLRenderingContext.stencilOp(). /** * @constant {number} */ const GL_KEEP = 0x1e00; /** * @constant {number} */ const GL_REPLACE = 0x1e01; /** * @constant {number} */ const GL_INCR = 0x1e02; /** * @constant {number} */ const GL_DECR = 0x1e03; /** * @constant {number} */ const GL_INVERT = 0x150a; /** * @constant {number} */ const GL_INCR_WRAP = 0x8507; /** * @constant {number} */ const GL_DECR_WRAP = 0x8508; // Textures // Constants passed to WebGLRenderingContext.texParameteri(), WebGLRenderingContext.texParameterf(), WebGLRenderingContext.bindTexture(), WebGLRenderingContext.texImage2D(), and others. /** * @constant {number} */ const GL_NEAREST = 0x2600; /** * @constant {number} */ const GL_LINEAR = 0x2601; /** * @constant {number} */ const GL_NEAREST_MIPMAP_NEAREST = 0x2700; /** * @constant {number} */ const GL_LINEAR_MIPMAP_NEAREST = 0x2701; /** * @constant {number} */ const GL_NEAREST_MIPMAP_LINEAR = 0x2702; /** * @constant {number} */ const GL_LINEAR_MIPMAP_LINEAR = 0x2703; /** * @constant {number} */ const GL_TEXTURE_MAG_FILTER = 0x2800; /** * @constant {number} */ const GL_TEXTURE_MIN_FILTER = 0x2801; /** * @constant {number} */ const GL_TEXTURE_WRAP_S = 0x2802; /** * @constant {number} */ const GL_TEXTURE_WRAP_T = 0x2803; /** * @constant {number} */ const GL_TEXTURE_2D = 0x0de1; /** * @constant {number} */ const GL_TEXTURE = 0x1702; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP = 0x8513; /** * @constant {number} */ const GL_TEXTURE_BINDING_CUBE_MAP = 0x8514; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519; /** * @constant {number} */ const GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851a; /** * @constant {number} */ const GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851c; /** * A texture unit. * @constant {number} */ const GL_TEXTURE0 = 0x84c0; /** * A texture unit. * @constant {number} */ const GL_TEXTURE1 = 0x84c1; /** * A texture unit. * @constant {number} */ const GL_TEXTURE2 = 0x84c2; /** * A texture unit. * @constant {number} */ const GL_TEXTURE3 = 0x84c3; /** * A texture unit. * @constant {number} */ const GL_TEXTURE4 = 0x84c4; /** * A texture unit. * @constant {number} */ const GL_TEXTURE5 = 0x84c5; /** * A texture unit. * @constant {number} */ const GL_TEXTURE6 = 0x84c6; /** * A texture unit. * @constant {number} */ const GL_TEXTURE7 = 0x84c7; /** * A texture unit. * @constant {number} */ const GL_TEXTURE8 = 0x84c8; /** * A texture unit. * @constant {number} */ const GL_TEXTURE9 = 0x84c9; /** * A texture unit. * @constant {number} */ const GL_TEXTURE10 = 0x84ca; /** * A texture unit. * @constant {number} */ const GL_TEXTURE11 = 0x84cb; /** * A texture unit. * @constant {number} */ const GL_TEXTURE12 = 0x84cc; /** * A texture unit. * @constant {number} */ const GL_TEXTURE13 = 0x84cd; /** * A texture unit. * @constant {number} */ const GL_TEXTURE14 = 0x84ce; /** * A texture unit. * @constant {number} */ const GL_TEXTURE15 = 0x84cf; /** * A texture unit. * @constant {number} */ const GL_TEXTURE16 = 0x84d0; /** * A texture unit. * @constant {number} */ const GL_TEXTURE17 = 0x84d1; /** * A texture unit. * @constant {number} */ const GL_TEXTURE18 = 0x84d2; /** * A texture unit. * @constant {number} */ const GL_TEXTURE19 = 0x84d3; /** * A texture unit. * @constant {number} */ const GL_TEXTURE20 = 0x84d4; /** * A texture unit. * @constant {number} */ const GL_TEXTURE21 = 0x84d5; /** * A texture unit. * @constant {number} */ const GL_TEXTURE22 = 0x84d6; /** * A texture unit. * @constant {number} */ const GL_TEXTURE23 = 0x84d7; /** * A texture unit. * @constant {number} */ const GL_TEXTURE24 = 0x84d8; /** * A texture unit. * @constant {number} */ const GL_TEXTURE25 = 0x84d9; /** * A texture unit. * @constant {number} */ const GL_TEXTURE26 = 0x84da; /** * A texture unit. * @constant {number} */ const GL_TEXTURE27 = 0x84db; /** * A texture unit. * @constant {number} */ const GL_TEXTURE28 = 0x84dc; /** * A texture unit. * @constant {number} */ const GL_TEXTURE29 = 0x84dd; /** * A texture unit. * @constant {number} */ const GL_TEXTURE30 = 0x84de; /** * A texture unit. * @constant {number} */ const GL_TEXTURE31 = 0x84df; /** * The current active texture unit. * @constant {number} */ const GL_ACTIVE_TEXTURE = 0x84e0; /** * @constant {number} */ const GL_REPEAT = 0x2901; /** * @constant {number} */ const GL_CLAMP_TO_EDGE = 0x812f; /** * @constant {number} */ const GL_MIRRORED_REPEAT = 0x8370; // Uniform types /** * @constant {number} */ const GL_FLOAT_VEC2 = 0x8b50; /** * @constant {number} */ const GL_FLOAT_VEC3 = 0x8b51; /** * @constant {number} */ const GL_FLOAT_VEC4 = 0x8b52; /** * @constant {number} */ const GL_INT_VEC2 = 0x8b53; /** * @constant {number} */ const GL_INT_VEC3 = 0x8b54; /** * @constant {number} */ const GL_INT_VEC4 = 0x8b55; /** * @constant {number} */ const GL_BOOL = 0x8b56; /** * @constant {number} */ const GL_BOOL_VEC2 = 0x8b57; /** * @constant {number} */ const GL_BOOL_VEC3 = 0x8b58; /** * @constant {number} */ const GL_BOOL_VEC4 = 0x8b59; /** * @constant {number} */ const GL_FLOAT_MAT2 = 0x8b5a; /** * @constant {number} */ const GL_FLOAT_MAT3 = 0x8b5b; /** * @constant {number} */ const GL_FLOAT_MAT4 = 0x8b5c; /** * @constant {number} */ const GL_SAMPLER_2D = 0x8b5e; /** * @constant {number} */ const GL_SAMPLER_CUBE = 0x8b60; // Shader precision-specified types /** * @constant {number} */ const GL_LOW_FLOAT = 0x8df0; /** * @constant {number} */ const GL_MEDIUM_FLOAT = 0x8df1; /** * @constant {number} */ const GL_HIGH_FLOAT = 0x8df2; /** * @constant {number} */ const GL_LOW_INT = 0x8df3; /** * @constant {number} */ const GL_MEDIUM_INT = 0x8df4; /** * @constant {number} */ const GL_HIGH_INT = 0x8df5; // Framebuffers and renderbuffers /** * @constant {number} */ const GL_FRAMEBUFFER = 0x8d40; /** * @constant {number} */ const GL_RENDERBUFFER = 0x8d41; /** * @constant {number} */ const GL_RGBA4 = 0x8056; /** * @constant {number} */ const GL_RGB5_A1 = 0x8057; /** * @constant {number} */ const GL_RGB565 = 0x8d62; /** * @constant {number} */ const GL_DEPTH_COMPONENT16 = 0x81a5; /** * @constant {number} */ const GL_STENCIL_INDEX = 0x1901; /** * @constant {number} */ const GL_STENCIL_INDEX8 = 0x8d48; /** * @constant {number} */ const GL_DEPTH_STENCIL = 0x84f9; /** * @constant {number} */ const GL_RENDERBUFFER_WIDTH = 0x8d42; /** * @constant {number} */ const GL_RENDERBUFFER_HEIGHT = 0x8d43; /** * @constant {number} */ const GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8d44; /** * @constant {number} */ const GL_RENDERBUFFER_RED_SIZE = 0x8d50; /** * @constant {number} */ const GL_RENDERBUFFER_GREEN_SIZE = 0x8d51; /** * @constant {number} */ const GL_RENDERBUFFER_BLUE_SIZE = 0x8d52; /** * @constant {number} */ const GL_RENDERBUFFER_ALPHA_SIZE = 0x8d53; /** * @constant {number} */ const GL_RENDERBUFFER_DEPTH_SIZE = 0x8d54; /** * @constant {number} */ const GL_RENDERBUFFER_STENCIL_SIZE = 0x8d55; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8cd0; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8cd1; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8cd2; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8cd3; /** * @constant {number} */ const GL_COLOR_ATTACHMENT0 = 0x8ce0; /** * @constant {number} */ const GL_DEPTH_ATTACHMENT = 0x8d00; /** * @constant {number} */ const GL_STENCIL_ATTACHMENT = 0x8d20; /** * @constant {number} */ const GL_DEPTH_STENCIL_ATTACHMENT = 0x821a; /** * @constant {number} */ const GL_NONE = 0; /** * @constant {number} */ const GL_FRAMEBUFFER_COMPLETE = 0x8cd5; /** * @constant {number} */ const GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8cd6; /** * @constant {number} */ const GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8cd7; /** * @constant {number} */ const GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8cd9; /** * @constant {number} */ const GL_FRAMEBUFFER_UNSUPPORTED = 0x8cdd; /** * @constant {number} */ const GL_FRAMEBUFFER_BINDING = 0x8ca6; /** * @constant {number} */ const GL_RENDERBUFFER_BINDING = 0x8ca7; /** * @constant {number} */ const GL_MAX_RENDERBUFFER_SIZE = 0x84e8; /** * @constant {number} */ const GL_INVALID_FRAMEBUFFER_OPERATION = 0x0506; // Pixel storage modes // Constants passed to WebGLRenderingContext.pixelStorei(). /** * @constant {number} */ const GL_UNPACK_FLIP_Y_WEBGL = 0x9240; /** * @constant {number} */ const GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241; /** * @constant {number} */ const GL_UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243; // Additional constants defined WebGL 2 // These constants are defined on the WebGL2RenderingContext interface. All WebGL 1 constants are also available in a WebGL 2 context. // Getting GL parameter information // Constants passed to WebGLRenderingContext.getParameter() to specify what information to return. /** * @constant {number} */ const GL_READ_BUFFER = 0x0c02; /** * @constant {number} */ const GL_UNPACK_ROW_LENGTH = 0x0cf2; /** * @constant {number} */ const GL_UNPACK_SKIP_ROWS = 0x0cf3; /** * @constant {number} */ const GL_UNPACK_SKIP_PIXELS = 0x0cf4; /** * @constant {number} */ const GL_PACK_ROW_LENGTH = 0x0d02; /** * @constant {number} */ const GL_PACK_SKIP_ROWS = 0x0d03; /** * @constant {number} */ const GL_PACK_SKIP_PIXELS = 0x0d04; /** * @constant {number} */ const GL_TEXTURE_BINDING_3D = 0x806a; /** * @constant {number} */ const GL_UNPACK_SKIP_IMAGES = 0x806d; /** * @constant {number} */ const GL_UNPACK_IMAGE_HEIGHT = 0x806e; /** * @constant {number} */ const GL_MAX_3D_TEXTURE_SIZE = 0x8073; /** * @constant {number} */ const GL_MAX_ELEMENTS_VERTICES = 0x80e8; /** * @constant {number} */ const GL_MAX_ELEMENTS_INDICES = 0x80e9; /** * @constant {number} */ const GL_MAX_TEXTURE_LOD_BIAS = 0x84fd; /** * @constant {number} */ const GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8b49; /** * @constant {number} */ const GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8b4a; /** * @constant {number} */ const GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88ff; /** * @constant {number} */ const GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904; /** * @constant {number} */ const GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905; /** * @constant {number} */ const GL_MAX_VARYING_COMPONENTS = 0x8b4b; /** * @constant {number} */ const GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8b8b; /** * @constant {number} */ const GL_RASTERIZER_DISCARD = 0x8c89; /** * @constant {number} */ const GL_VERTEX_ARRAY_BINDING = 0x85b5; /** * @constant {number} */ const GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122; /** * @constant {number} */ const GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; /** * @constant {number} */ const GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; /** * @constant {number} */ const GL_MAX_ELEMENT_INDEX = 0x8d6b; // Textures // Constants passed to WebGLRenderingContext.texParameteri(), WebGLRenderingContext.texParameterf(), WebGLRenderingContext.bindTexture(), WebGLRenderingContext.texImage2D(), and others. /** * @constant {number} */ const GL_RED = 0x1903; /** * @constant {number} */ const GL_RGB8 = 0x8051; /** * @constant {number} */ const GL_RGBA8 = 0x8058; /** * @constant {number} */ const GL_RGB10_A2 = 0x8059; /** * @constant {number} */ const GL_TEXTURE_3D = 0x806f; /** * @constant {number} */ const GL_TEXTURE_WRAP_R = 0x8072; /** * @constant {number} */ const GL_TEXTURE_MIN_LOD = 0x813a; /** * @constant {number} */ const GL_TEXTURE_MAX_LOD = 0x813b; /** * @constant {number} */ const GL_TEXTURE_BASE_LEVEL = 0x813c; /** * @constant {number} */ const GL_TEXTURE_MAX_LEVEL = 0x813d; /** * @constant {number} */ const GL_TEXTURE_COMPARE_MODE = 0x884c; /** * @constant {number} */ const GL_TEXTURE_COMPARE_FUNC = 0x884d; /** * @constant {number} */ const GL_SRGB = 0x8c40; /** * @constant {number} */ const GL_SRGB8 = 0x8c41; /** * @constant {number} */ const GL_SRGB8_ALPHA8 = 0x8c43; /** * @constant {number} */ const GL_COMPARE_REF_TO_TEXTURE = 0x884e; /** * @constant {number} */ const GL_RGBA32F = 0x8814; /** * @constant {number} */ const GL_RGB32F = 0x8815; /** * @constant {number} */ const GL_RGBA16F = 0x881a; /** * @constant {number} */ const GL_RGB16F = 0x881b; /** * @constant {number} */ const GL_TEXTURE_2D_ARRAY = 0x8c1a; /** * @constant {number} */ const GL_TEXTURE_BINDING_2D_ARRAY = 0x8c1d; /** * @constant {number} */ const GL_R11F_G11F_B10F = 0x8c3a; /** * @constant {number} */ const GL_RGB9_E5 = 0x8c3d; /** * @constant {number} */ const GL_RGBA32UI = 0x8d70; /** * @constant {number} */ const GL_RGB32UI = 0x8d71; /** * @constant {number} */ const GL_RGBA16UI = 0x8d76; /** * @constant {number} */ const GL_RGB16UI = 0x8d77; /** * @constant {number} */ const GL_RGBA8UI = 0x8d7c; /** * @constant {number} */ const GL_RGB8UI = 0x8d7d; /** * @constant {number} */ const GL_RGBA32I = 0x8d82; /** * @constant {number} */ const GL_RGB32I = 0x8d83; /** * @constant {number} */ const GL_RGBA16I = 0x8d88; /** * @constant {number} */ const GL_RGB16I = 0x8d89; /** * @constant {number} */ const GL_RGBA8I = 0x8d8e; /** * @constant {number} */ const GL_RGB8I = 0x8d8f; /** * @constant {number} */ const GL_RED_INTEGER = 0x8d94; /** * @constant {number} */ const GL_RGB_INTEGER = 0x8d98; /** * @constant {number} */ const GL_RGBA_INTEGER = 0x8d99; /** * @constant {number} */ const GL_R8 = 0x8229; /** * @constant {number} */ const GL_RG8 = 0x822b; /** * @constant {number} */ const GL_R16F = 0x822d; /** * @constant {number} */ const GL_R32F = 0x822e; /** * @constant {number} */ const GL_RG16F = 0x822f; /** * @constant {number} */ const GL_RG32F = 0x8230; /** * @constant {number} */ const GL_R8I = 0x8231; /** * @constant {number} */ const GL_R8UI = 0x8232; /** * @constant {number} */ const GL_R16I = 0x8233; /** * @constant {number} */ const GL_R16UI = 0x8234; /** * @constant {number} */ const GL_R32I = 0x8235; /** * @constant {number} */ const GL_R32UI = 0x8236; /** * @constant {number} */ const GL_RG8I = 0x8237; /** * @constant {number} */ const GL_RG8UI = 0x8238; /** * @constant {number} */ const GL_RG16I = 0x8239; /** * @constant {number} */ const GL_RG16UI = 0x823a; /** * @constant {number} */ const GL_RG32I = 0x823b; /** * @constant {number} */ const GL_RG32UI = 0x823c; /** * @constant {number} */ const GL_R8_SNORM = 0x8f94; /** * @constant {number} */ const GL_RG8_SNORM = 0x8f95; /** * @constant {number} */ const GL_RGB8_SNORM = 0x8f96; /** * @constant {number} */ const GL_RGBA8_SNORM = 0x8f97; /** * @constant {number} */ const GL_RGB10_A2UI = 0x906f; /** * @constant {number} */ const GL_TEXTURE_IMMUTABLE_FORMAT = 0x912f; /** * @constant {number} */ const GL_TEXTURE_IMMUTABLE_LEVELS = 0x82df; // Pixel types /** * @constant {number} */ const GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; /** * @constant {number} */ const GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8c3b; /** * @constant {number} */ const GL_UNSIGNED_INT_5_9_9_9_REV = 0x8c3e; /** * @constant {number} */ const GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8dad; /** * @constant {number} */ const GL_UNSIGNED_INT_24_8 = 0x84fa; /** * @constant {number} */ const GL_HALF_FLOAT = 0x140b; /** * @constant {number} */ const GL_RG = 0x8227; /** * @constant {number} */ const GL_RG_INTEGER = 0x8228; /** * @constant {number} */ const GL_INT_2_10_10_10_REV = 0x8d9f; // Queries /** * @constant {number} */ const GL_CURRENT_QUERY = 0x8865; /** * @constant {number} */ const GL_QUERY_RESULT = 0x8866; /** * @constant {number} */ const GL_QUERY_RESULT_AVAILABLE = 0x8867; /** * @constant {number} */ const GL_ANY_SAMPLES_PASSED = 0x8c2f; /** * @constant {number} */ const GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8d6a; // Draw buffers /** * @constant {number} */ const GL_MAX_DRAW_BUFFERS = 0x8824; /** * @constant {number} */ const GL_DRAW_BUFFER0 = 0x8825; /** * @constant {number} */ const GL_DRAW_BUFFER1 = 0x8826; /** * @constant {number} */ const GL_DRAW_BUFFER2 = 0x8827; /** * @constant {number} */ const GL_DRAW_BUFFER3 = 0x8828; /** * @constant {number} */ const GL_DRAW_BUFFER4 = 0x8829; /** * @constant {number} */ const GL_DRAW_BUFFER5 = 0x882a; /** * @constant {number} */ const GL_DRAW_BUFFER6 = 0x882b; /** * @constant {number} */ const GL_DRAW_BUFFER7 = 0x882c; /** * @constant {number} */ const GL_DRAW_BUFFER8 = 0x882d; /** * @constant {number} */ const GL_DRAW_BUFFER9 = 0x882e; /** * @constant {number} */ const GL_DRAW_BUFFER10 = 0x882f; /** * @constant {number} */ const GL_DRAW_BUFFER11 = 0x8830; /** * @constant {number} */ const GL_DRAW_BUFFER12 = 0x8831; /** * @constant {number} */ const GL_DRAW_BUFFER13 = 0x8832; /** * @constant {number} */ const GL_DRAW_BUFFER14 = 0x8833; /** * @constant {number} */ const GL_DRAW_BUFFER15 = 0x8834; /** * @constant {number} */ const GL_MAX_COLOR_ATTACHMENTS = 0x8cdf; /** * @constant {number} */ const GL_COLOR_ATTACHMENT1 = 0x8ce1; /** * @constant {number} */ const GL_COLOR_ATTACHMENT2 = 0x8ce2; /** * @constant {number} */ const GL_COLOR_ATTACHMENT3 = 0x8ce3; /** * @constant {number} */ const GL_COLOR_ATTACHMENT4 = 0x8ce4; /** * @constant {number} */ const GL_COLOR_ATTACHMENT5 = 0x8ce5; /** * @constant {number} */ const GL_COLOR_ATTACHMENT6 = 0x8ce6; /** * @constant {number} */ const GL_COLOR_ATTACHMENT7 = 0x8ce7; /** * @constant {number} */ const GL_COLOR_ATTACHMENT8 = 0x8ce8; /** * @constant {number} */ const GL_COLOR_ATTACHMENT9 = 0x8ce9; /** * @constant {number} */ const GL_COLOR_ATTACHMENT10 = 0x8cea; /** * @constant {number} */ const GL_COLOR_ATTACHMENT11 = 0x8ceb; /** * @constant {number} */ const GL_COLOR_ATTACHMENT12 = 0x8cec; /** * @constant {number} */ const GL_COLOR_ATTACHMENT13 = 0x8ced; /** * @constant {number} */ const GL_COLOR_ATTACHMENT14 = 0x8cee; /** * @constant {number} */ const GL_COLOR_ATTACHMENT15 = 0x8cef; // Samplers /** * @constant {number} */ const GL_SAMPLER_3D = 0x8b5f; /** * @constant {number} */ const GL_SAMPLER_2D_SHADOW = 0x8b62; /** * @constant {number} */ const GL_SAMPLER_2D_ARRAY = 0x8dc1; /** * @constant {number} */ const GL_SAMPLER_2D_ARRAY_SHADOW = 0x8dc4; /** * @constant {number} */ const GL_SAMPLER_CUBE_SHADOW = 0x8dc5; /** * @constant {number} */ const GL_INT_SAMPLER_2D = 0x8dca; /** * @constant {number} */ const GL_INT_SAMPLER_3D = 0x8dcb; /** * @constant {number} */ const GL_INT_SAMPLER_CUBE = 0x8dcc; /** * @constant {number} */ const GL_INT_SAMPLER_2D_ARRAY = 0x8dcf; /** * @constant {number} */ const GL_UNSIGNED_INT_SAMPLER_2D = 0x8dd2; /** * @constant {number} */ const GL_UNSIGNED_INT_SAMPLER_3D = 0x8dd3; /** * @constant {number} */ const GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8dd4; /** * @constant {number} */ const GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8dd7; /** * @constant {number} */ const GL_MAX_SAMPLES = 0x8d57; /** * @constant {number} */ const GL_SAMPLER_BINDING = 0x8919; // Buffers /** * @constant {number} */ const GL_PIXEL_PACK_BUFFER = 0x88eb; /** * @constant {number} */ const GL_PIXEL_UNPACK_BUFFER = 0x88ec; /** * @constant {number} */ const GL_PIXEL_PACK_BUFFER_BINDING = 0x88ed; /** * @constant {number} */ const GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88ef; /** * @constant {number} */ const GL_COPY_READ_BUFFER = 0x8f36; /** * @constant {number} */ const GL_COPY_WRITE_BUFFER = 0x8f37; /** * @constant {number} */ const GL_COPY_READ_BUFFER_BINDING = 0x8f36; /** * @constant {number} */ const GL_COPY_WRITE_BUFFER_BINDING = 0x8f37; // Data types /** * @constant {number} */ const GL_FLOAT_MAT2X3 = 0x8b65; /** * @constant {number} */ const GL_FLOAT_MAT2X4 = 0x8b66; /** * @constant {number} */ const GL_FLOAT_MAT3X2 = 0x8b67; /** * @constant {number} */ const GL_FLOAT_MAT3X4 = 0x8b68; /** * @constant {number} */ const GL_FLOAT_MAT4X2 = 0x8b69; /** * @constant {number} */ const GL_FLOAT_MAT4X3 = 0x8b6a; /** * @constant {number} */ const GL_UNSIGNED_INT_VEC2 = 0x8dc6; /** * @constant {number} */ const GL_UNSIGNED_INT_VEC3 = 0x8dc7; /** * @constant {number} */ const GL_UNSIGNED_INT_VEC4 = 0x8dc8; /** * @constant {number} */ const GL_UNSIGNED_NORMALIZED = 0x8c17; /** * @constant {number} */ const GL_SIGNED_NORMALIZED = 0x8f9c; // Vertex attributes /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88fd; /** * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88fe; // Transform feedback /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8c7f; /** * @constant {number} */ const GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8c80; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8c83; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8c84; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8c85; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8c88; /** * @constant {number} */ const GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8c8a; /** * @constant {number} */ const GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8c8b; /** * @constant {number} */ const GL_INTERLEAVED_ATTRIBS = 0x8c8c; /** * @constant {number} */ const GL_SEPARATE_ATTRIBS = 0x8c8d; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_BUFFER = 0x8c8e; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8c8f; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK = 0x8e22; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_PAUSED = 0x8e23; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8e24; /** * @constant {number} */ const GL_TRANSFORM_FEEDBACK_BINDING = 0x8e25; // Framebuffers and renderbuffers /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; /** * @constant {number} */ const GL_FRAMEBUFFER_DEFAULT = 0x8218; /** * @constant {number} */ const GL_DEPTH24_STENCIL8 = 0x88f0; /** * @constant {number} */ const GL_DRAW_FRAMEBUFFER_BINDING = 0x8ca6; /** * @constant {number} */ const GL_READ_FRAMEBUFFER = 0x8ca8; /** * @constant {number} */ const GL_DRAW_FRAMEBUFFER = 0x8ca9; /** * @constant {number} */ const GL_READ_FRAMEBUFFER_BINDING = 0x8caa; /** * @constant {number} */ const GL_RENDERBUFFER_SAMPLES = 0x8cab; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8cd4; /** * @constant {number} */ const GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8d56; // Uniforms /** * @constant {number} */ const GL_UNIFORM_BUFFER = 0x8a11; /** * @constant {number} */ const GL_UNIFORM_BUFFER_BINDING = 0x8a28; /** * @constant {number} */ const GL_UNIFORM_BUFFER_START = 0x8a29; /** * @constant {number} */ const GL_UNIFORM_BUFFER_SIZE = 0x8a2a; /** * @constant {number} */ const GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8a2b; /** * @constant {number} */ const GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8a2d; /** * @constant {number} */ const GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8a2e; /** * @constant {number} */ const GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8a2f; /** * @constant {number} */ const GL_MAX_UNIFORM_BLOCK_SIZE = 0x8a30; /** * @constant {number} */ const GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8a31; /** * @constant {number} */ const GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8a33; /** * @constant {number} */ const GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8a34; /** * @constant {number} */ const GL_ACTIVE_UNIFORM_BLOCKS = 0x8a36; /** * @constant {number} */ const GL_UNIFORM_TYPE = 0x8a37; /** * @constant {number} */ const GL_UNIFORM_SIZE = 0x8a38; /** * @constant {number} */ const GL_UNIFORM_BLOCK_INDEX = 0x8a3a; /** * @constant {number} */ const GL_UNIFORM_OFFSET = 0x8a3b; /** * @constant {number} */ const GL_UNIFORM_ARRAY_STRIDE = 0x8a3c; /** * @constant {number} */ const GL_UNIFORM_MATRIX_STRIDE = 0x8a3d; /** * @constant {number} */ const GL_UNIFORM_IS_ROW_MAJOR = 0x8a3e; /** * @constant {number} */ const GL_UNIFORM_BLOCK_BINDING = 0x8a3f; /** * @constant {number} */ const GL_UNIFORM_BLOCK_DATA_SIZE = 0x8a40; /** * @constant {number} */ const GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8a42; /** * @constant {number} */ const GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8a43; /** * @constant {number} */ const GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8a44; /** * @constant {number} */ const GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8a46; // Sync objects /** * @constant {number} */ const GL_OBJECT_TYPE = 0x9112; /** * @constant {number} */ const GL_SYNC_CONDITION = 0x9113; /** * @constant {number} */ const GL_SYNC_STATUS = 0x9114; /** * @constant {number} */ const GL_SYNC_FLAGS = 0x9115; /** * @constant {number} */ const GL_SYNC_FENCE = 0x9116; /** * @constant {number} */ const GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; /** * @constant {number} */ const GL_UNSIGNALED = 0x9118; /** * @constant {number} */ const GL_SIGNALED = 0x9119; /** * @constant {number} */ const GL_ALREADY_SIGNALED = 0x911a; /** * @constant {number} */ const GL_TIMEOUT_EXPIRED = 0x911b; /** * @constant {number} */ const GL_CONDITION_SATISFIED = 0x911c; /** * @constant {number} */ const GL_WAIT_FAILED = 0x911d; /** * @constant {number} */ const GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001; // Miscellaneous constants /** * @constant {number} */ const GL_COLOR = 0x1800; /** * @constant {number} */ const GL_DEPTH = 0x1801; /** * @constant {number} */ const GL_STENCIL = 0x1802; /** * @constant {number} */ const GL_MIN = 0x8007; /** * @constant {number} */ const GL_MAX = 0x8008; /** * @constant {number} */ const GL_DEPTH_COMPONENT24 = 0x81a6; /** * @constant {number} */ const GL_STREAM_READ = 0x88e1; /** * @constant {number} */ const GL_STREAM_COPY = 0x88e2; /** * @constant {number} */ const GL_STATIC_READ = 0x88e5; /** * @constant {number} */ const GL_STATIC_COPY = 0x88e6; /** * @constant {number} */ const GL_DYNAMIC_READ = 0x88e9; /** * @constant {number} */ const GL_DYNAMIC_COPY = 0x88ea; /** * @constant {number} */ const GL_DEPTH_COMPONENT32F = 0x8cac; /** * @constant {number} */ const GL_DEPTH32F_STENCIL8 = 0x8cad; /** * @constant {number} */ const GL_INVALID_INDEX = 0xffffffff; /** * @constant {number} */ const GL_TIMEOUT_IGNORED = -1; /** * @constant {number} */ const GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247; // Constants defined in WebGL extensions // ANGLE_instanced_arrays // The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type. /** * Describes the frequency divisor used for instanced rendering. * @constant {number} */ const GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 0x88fe; // WEBGL_debug_renderer_info // The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes. /** * Passed to getParameter to get the vendor string of the graphics driver. * @constant {number} */ const GL_UNMASKED_VENDOR_WEBGL = 0x9245; /** * Passed to getParameter to get the renderer string of the graphics driver. * @constant {number} */ const GL_UNMASKED_RENDERER_WEBGL = 0x9246; // EXT_texture_filter_anisotropic // The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF). /** * Returns the maximum available anisotropy. * @constant {number} */ const GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84ff; /** * Passed to texParameter to set the desired maximum anisotropy for a texture. * @constant {number} */ const GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84fe; // WEBGL_compressed_texture_s3tc // The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats. /** * A DXT1-compressed image in an RGB image format. * @constant {number} */ const GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83f0; /** * A DXT1-compressed image in an RGB image format with a simple on/off alpha value. * @constant {number} */ const GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83f1; /** * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression. * @constant {number} */ const GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83f2; /** * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3 compression in how the alpha compression is done. * @constant {number} */ const GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83f3; // WEBGL_compressed_texture_s3tc_srgb // The WEBGL_compressed_texture_s3tc_srgb extension is part of the WebGL API and exposes four S3TC compressed texture formats for the sRGB colorspace. /** * A DXT1-compressed image in an sRGB image format. * @constant {number} */ const GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8c4c; /** * A DXT1-compressed image in an sRGB image format with a simple on/off alpha value. * @constant {number} */ const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8c4d; /** * A DXT3-compressed image in an sRGBA image format. * @constant {number} */ const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8c4e; /** * A DXT5-compressed image in an sRGBA image format. * @constant {number} */ const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8c4f; // WEBGL_compressed_texture_etc // The WEBGL_compressed_texture_etc extension is part of the WebGL API and exposes 10 ETC/EAC compressed texture formats. /** * One-channel (red) unsigned format compression. * @constant {number} */ const GL_COMPRESSED_R11_EAC = 0x9270; /** * One-channel (red) signed format compression. * @constant {number} */ const GL_COMPRESSED_SIGNED_R11_EAC = 0x9271; /** * Two-channel (red and green) unsigned format compression. * @constant {number} */ const GL_COMPRESSED_RG11_EAC = 0x9272; /** * Two-channel (red and green) signed format compression. * @constant {number} */ const GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; /** * Compresses RBG8 data with no alpha channel. * @constant {number} */ const GL_COMPRESSED_RGB8_ETC2 = 0x9274; /** * Compresses RGBA8 data. The RGB part is encoded the same as RGB_ETC2, but the alpha part is encoded separately. * @constant {number} */ const GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9275; /** * Compresses sRBG8 data with no alpha channel. * @constant {number} */ const GL_COMPRESSED_SRGB8_ETC2 = 0x9276; /** * Compresses sRGBA8 data. The sRGB part is encoded the same as SRGB_ETC2, but the alpha part is encoded separately. * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9277; /** * Similar to RGB8_ETC, but with ability to punch through the alpha channel, which means to make it completely opaque or transparent. * @constant {number} */ const GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9278; /** * Similar to SRGB8_ETC, but with ability to punch through the alpha channel, which means to make it completely opaque or transparent. * @constant {number} */ const GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9279; // WEBGL_compressed_texture_pvrtc // The WEBGL_compressed_texture_pvrtc extension is part of the WebGL API and exposes four PVRTC compressed texture formats. /** * RGB compression in 4-bit mode. One block for each 4×4 pixels. * @constant {number} */ const GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8c00; /** * RGBA compression in 4-bit mode. One block for each 4×4 pixels. * @constant {number} */ const GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8c02; /** * RGB compression in 2-bit mode. One block for each 8×4 pixels. * @constant {number} */ const GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8c01; /** * RGBA compression in 2-bit mode. One block for each 8×4 pixels. * @constant {number} */ const GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8c03; // WEBGL_compressed_texture_etc1 // The WEBGL_compressed_texture_etc1 extension is part of the WebGL API and exposes the ETC1 compressed texture format. /** * Compresses 24-bit RGB data with no alpha channel. * @constant {number} */ const GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8d64; // WEBGL_compressed_texture_atc // The WEBGL_compressed_texture_atc extension is part of the WebGL API and exposes 3 ATC compressed texture formats. ATC is a proprietary compression algorithm for compressing textures on handheld devices. /** * Compresses RGB textures with no alpha channel. * @constant {number} */ const GL_COMPRESSED_RGB_ATC_WEBGL = 0x8c92; /** * Compresses RGBA textures using explicit alpha encoding (useful when alpha transitions are sharp). * @constant {number} */ const GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8c92; /** * Compresses RGBA textures using interpolated alpha encoding (useful when alpha transitions are gradient). * @constant {number} */ const GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87ee; // WEBGL_compressed_texture_astc // The WEBGL_compressed_texture_astc extension is part of the WebGL API and exposes Adaptive Scalable Texture Compression (ASTC) compressed texture formats to WebGL. // https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/ // https://developer.nvidia.com/astc-texture-compression-for-game-assets /** * Compresses RGBA textures using ASTC compression in a blocksize of 4x4 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_4X4_KHR = 0x93b0; /** * Compresses RGBA textures using ASTC compression in a blocksize of 5x4 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_5X4_KHR = 0x93b1; /** * Compresses RGBA textures using ASTC compression in a blocksize of 5x5 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_5X5_KHR = 0x93b2; /** * Compresses RGBA textures using ASTC compression in a blocksize of 6x5 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_6X5_KHR = 0x93b3; /** * Compresses RGBA textures using ASTC compression in a blocksize of 6x6 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_6X6_KHR = 0x93b4; /** * Compresses RGBA textures using ASTC compression in a blocksize of 8x5 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_8X5_KHR = 0x93b5; /** * Compresses RGBA textures using ASTC compression in a blocksize of 8x6 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_8X6_KHR = 0x93b6; /** * Compresses RGBA textures using ASTC compression in a blocksize of 8x8 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_8X8_KHR = 0x93b7; /** * Compresses RGBA textures using ASTC compression in a blocksize of 10x5 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_10X5_KHR = 0x93b8; /** * Compresses RGBA textures using ASTC compression in a blocksize of 10x6 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_10X6_KHR = 0x93b9; /** * Compresses RGBA textures using ASTC compression in a blocksize of 10x8 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_10X8_KHR = 0x93ba; /** * Compresses RGBA textures using ASTC compression in a blocksize of 10x10 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_10X10_KHR = 0x93bb; /** * Compresses RGBA textures using ASTC compression in a blocksize of 12x10 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_12X10_KHR = 0x93bc; /** * Compresses RGBA textures using ASTC compression in a blocksize of 12x12 * @constant {number} */ const GL_COMPRESSED_RGBA_ASTC_12X12_KHR = 0x93bd; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 4x4 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR = 0x93d0; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 5x4 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR = 0x93d1; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 5x5 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR = 0x93d2; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 6x5 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR = 0x93d3; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 6x6 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR = 0x93d4; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x5 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR = 0x93d5; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x6 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR = 0x93d6; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x8 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR = 0x93d7; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x5 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR = 0x93d8; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x6 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR = 0x93d9; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x8 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR = 0x93da; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x10 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR = 0x93db; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 12x10 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR = 0x93dc; /** * Compresses SRGB8 textures using ASTC compression in a blocksize of 12x12 * @constant {number} */ const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR = 0x93dd; // WEBGL_depth_texture // The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures. /** * Unsigned integer type for 24-bit depth texture data. * @constant {number} */ const GL_UNSIGNED_INT_24_8_WEBGL = 0x84fa; // OES_texture_half_float // The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components. /** * Half floating-point type (16-bit). * @constant {number} */ const GL_HALF_FLOAT_OES = 0x8d61; // WEBGL_color_buffer_float // The WEBGL_color_buffer_float extension is part of the WebGL API and adds the ability to render to 32-bit floating-point color buffers. /** * RGBA 32-bit floating-point color-renderable format. * @constant {number} */ const GL_RGBA32F_EXT = 0x8814; /** * RGB 32-bit floating-point color-renderable format. * @constant {number} */ const GL_RGB32F_EXT = 0x8815; /** * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT = 0x8211; /** * @constant {number} */ const GL_UNSIGNED_NORMALIZED_EXT = 0x8c17; // EXT_blend_minmax // The EXT_blend_minmax extension is part of the WebGL API and extends blending capabilities by adding two new blend equations: the minimum or maximum color components of the source and destination colors. /** * Produces the minimum color components of the source and destination colors. * @constant {number} */ const GL_MIN_EXT = 0x8007; /** * Produces the maximum color components of the source and destination colors. * @constant {number} */ const GL_MAX_EXT = 0x8008; // EXT_sRGB // The EXT_sRGB extension is part of the WebGL API and adds sRGB support to textures and framebuffer objects. /** * Unsized sRGB format that leaves the precision up to the driver. * @constant {number} */ const GL_SRGB_EXT = 0x8c40; /** * Unsized sRGB format with unsized alpha component. * @constant {number} */ const GL_SRGB_ALPHA_EXT = 0x8c42; /** * Sized (8-bit) sRGB and alpha formats. * @constant {number} */ const GL_SRGB8_ALPHA8_EXT = 0x8c43; /** * Returns the framebuffer color encoding. * @constant {number} */ const GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210; // OES_standard_derivatives // The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth. /** * Indicates the accuracy of the derivative calculation for the GLSL built-in functions: dFdx, dFdy, and fwidth. * @constant {number} */ const GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8b8b; // WEBGL_draw_buffers // The WEBGL_draw_buffers extension is part of the WebGL API and enables a fragment shader to write to several textures, which is useful for deferred shading, for example. /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT0_WEBGL = 0x8ce0; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT1_WEBGL = 0x8ce1; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT2_WEBGL = 0x8ce2; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT3_WEBGL = 0x8ce3; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT4_WEBGL = 0x8ce4; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT5_WEBGL = 0x8ce5; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT6_WEBGL = 0x8ce6; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT7_WEBGL = 0x8ce7; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT8_WEBGL = 0x8ce8; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT9_WEBGL = 0x8ce9; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT10_WEBGL = 0x8cea; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT11_WEBGL = 0x8ceb; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT12_WEBGL = 0x8cec; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT13_WEBGL = 0x8ced; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT14_WEBGL = 0x8cee; /** * Framebuffer color attachment point. * @constant {number} */ const GL_COLOR_ATTACHMENT15_WEBGL = 0x8cef; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER0_WEBGL = 0x8825; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER1_WEBGL = 0x8826; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER2_WEBGL = 0x8827; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER3_WEBGL = 0x8828; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER4_WEBGL = 0x8829; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER5_WEBGL = 0x882a; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER6_WEBGL = 0x882b; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER7_WEBGL = 0x882c; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER8_WEBGL = 0x882d; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER9_WEBGL = 0x882e; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER10_WEBGL = 0x882f; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER11_WEBGL = 0x8830; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER12_WEBGL = 0x8831; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER13_WEBGL = 0x8832; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER14_WEBGL = 0x8833; /** * Draw buffer. * @constant {number} */ const GL_DRAW_BUFFER15_WEBGL = 0x8834; /** * Maximum number of framebuffer color attachment points. * @constant {number} */ const GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8cdf; /** * Maximum number of draw buffers. * @constant {number} */ const GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824; // OES_vertex_array_object // The OES_vertex_array_object extension is part of the WebGL API and provides vertex array objects (VAOs) which encapsulate vertex array states. These objects keep pointers to vertex data and provide names for different sets of vertex data. /** * The bound vertex array object (VAO). * @constant {number} */ const GL_VERTEX_ARRAY_BINDING_OES = 0x85b5; // EXT_disjoint_timer_query // The EXT_disjoint_timer_query extension is part of the WebGL API and provides a way to measure the duration of a set of GL commands, without stalling the rendering pipeline. /** * The number of bits used to hold the query result for the given target. * @constant {number} */ const GL_QUERY_COUNTER_BITS_EXT = 0x8864; /** * The currently active query. * @constant {number} */ const GL_CURRENT_QUERY_EXT = 0x8865; /** * The query result. * @constant {number} */ const GL_QUERY_RESULT_EXT = 0x8866; /** * A Boolean indicating whether or not a query result is available. * @constant {number} */ const GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867; /** * Elapsed time (in nanoseconds). * @constant {number} */ const GL_TIME_ELAPSED_EXT = 0x88bf; /** * The current time. * @constant {number} */ const GL_TIMESTAMP_EXT = 0x8e28; /** * A Boolean indicating whether or not the GPU performed any disjoint operation. * @constant {number} */ const GL_GPU_DISJOINT_EXT = 0x8fbb; /***/ }), /***/ "./src/types/glTF1.ts": /*!****************************!*\ !*** ./src/types/glTF1.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/glTF2.ts": /*!****************************!*\ !*** ./src/types/glTF2.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TagGltf2NodeIndex: () => (/* binding */ TagGltf2NodeIndex), /* harmony export */ isSameGlTF2TextureSampler: () => (/* binding */ isSameGlTF2TextureSampler) /* harmony export */ }); const TagGltf2NodeIndex = 'gltf_node_index'; function isSameGlTF2TextureSampler(lhs, rhs) { return (lhs.magFilter === rhs.magFilter && lhs.minFilter === rhs.minFilter && lhs.wrapS === rhs.wrapS && lhs.wrapT === rhs.wrapT); } /***/ }), /***/ "./src/types/glTF2ForOutput.ts": /*!*************************************!*\ !*** ./src/types/glTF2ForOutput.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/types/index.ts": /*!****************************!*\ !*** ./src/types/index.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ GL_ACTIVE_ATTRIBUTES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ACTIVE_ATTRIBUTES), /* harmony export */ GL_ACTIVE_TEXTURE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ACTIVE_TEXTURE), /* harmony export */ GL_ACTIVE_UNIFORMS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ACTIVE_UNIFORMS), /* harmony export */ GL_ACTIVE_UNIFORM_BLOCKS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ACTIVE_UNIFORM_BLOCKS), /* harmony export */ GL_ALIASED_LINE_WIDTH_RANGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ALIASED_LINE_WIDTH_RANGE), /* harmony export */ GL_ALIASED_POINT_SIZE_RANGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ALIASED_POINT_SIZE_RANGE), /* harmony export */ GL_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ALPHA), /* harmony export */ GL_ALPHA_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ALPHA_BITS), /* harmony export */ GL_ALREADY_SIGNALED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ALREADY_SIGNALED), /* harmony export */ GL_ALWAYS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ALWAYS), /* harmony export */ GL_ANY_SAMPLES_PASSED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ANY_SAMPLES_PASSED), /* harmony export */ GL_ANY_SAMPLES_PASSED_CONSERVATIVE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ANY_SAMPLES_PASSED_CONSERVATIVE), /* harmony export */ GL_ARRAY_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ARRAY_BUFFER), /* harmony export */ GL_ARRAY_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ARRAY_BUFFER_BINDING), /* harmony export */ GL_ATTACHED_SHADERS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ATTACHED_SHADERS), /* harmony export */ GL_BACK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BACK), /* harmony export */ GL_BLEND: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND), /* harmony export */ GL_BLEND_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_COLOR), /* harmony export */ GL_BLEND_DST_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_DST_ALPHA), /* harmony export */ GL_BLEND_DST_RGB: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_DST_RGB), /* harmony export */ GL_BLEND_EQUATION: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_EQUATION), /* harmony export */ GL_BLEND_EQUATION_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_EQUATION_ALPHA), /* harmony export */ GL_BLEND_EQUATION_RGB: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_EQUATION_RGB), /* harmony export */ GL_BLEND_SRC_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_SRC_ALPHA), /* harmony export */ GL_BLEND_SRC_RGB: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLEND_SRC_RGB), /* harmony export */ GL_BLUE_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BLUE_BITS), /* harmony export */ GL_BOOL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BOOL), /* harmony export */ GL_BOOL_VEC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BOOL_VEC2), /* harmony export */ GL_BOOL_VEC3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BOOL_VEC3), /* harmony export */ GL_BOOL_VEC4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BOOL_VEC4), /* harmony export */ GL_BROWSER_DEFAULT_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BROWSER_DEFAULT_WEBGL), /* harmony export */ GL_BUFFER_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BUFFER_SIZE), /* harmony export */ GL_BUFFER_USAGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_BUFFER_USAGE), /* harmony export */ GL_CCW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CCW), /* harmony export */ GL_CLAMP_TO_EDGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CLAMP_TO_EDGE), /* harmony export */ GL_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR), /* harmony export */ GL_COLOR_ATTACHMENT0: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT0), /* harmony export */ GL_COLOR_ATTACHMENT0_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT0_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT1: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT1), /* harmony export */ GL_COLOR_ATTACHMENT10: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT10), /* harmony export */ GL_COLOR_ATTACHMENT10_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT10_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT11: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT11), /* harmony export */ GL_COLOR_ATTACHMENT11_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT11_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT12: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT12), /* harmony export */ GL_COLOR_ATTACHMENT12_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT12_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT13: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT13), /* harmony export */ GL_COLOR_ATTACHMENT13_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT13_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT14: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT14), /* harmony export */ GL_COLOR_ATTACHMENT14_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT14_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT15: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT15), /* harmony export */ GL_COLOR_ATTACHMENT15_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT15_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT1_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT1_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT2), /* harmony export */ GL_COLOR_ATTACHMENT2_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT2_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT3), /* harmony export */ GL_COLOR_ATTACHMENT3_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT3_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT4), /* harmony export */ GL_COLOR_ATTACHMENT4_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT4_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT5: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT5), /* harmony export */ GL_COLOR_ATTACHMENT5_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT5_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT6: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT6), /* harmony export */ GL_COLOR_ATTACHMENT6_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT6_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT7: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT7), /* harmony export */ GL_COLOR_ATTACHMENT7_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT7_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT8), /* harmony export */ GL_COLOR_ATTACHMENT8_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT8_WEBGL), /* harmony export */ GL_COLOR_ATTACHMENT9: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT9), /* harmony export */ GL_COLOR_ATTACHMENT9_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_ATTACHMENT9_WEBGL), /* harmony export */ GL_COLOR_BUFFER_BIT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_BUFFER_BIT), /* harmony export */ GL_COLOR_CLEAR_VALUE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_CLEAR_VALUE), /* harmony export */ GL_COLOR_WRITEMASK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COLOR_WRITEMASK), /* harmony export */ GL_COMPARE_REF_TO_TEXTURE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPARE_REF_TO_TEXTURE), /* harmony export */ GL_COMPILE_STATUS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPILE_STATUS), /* harmony export */ GL_COMPRESSED_R11_EAC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_R11_EAC), /* harmony export */ GL_COMPRESSED_RG11_EAC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RG11_EAC), /* harmony export */ GL_COMPRESSED_RGB8_ETC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB8_ETC2), /* harmony export */ GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2), /* harmony export */ GL_COMPRESSED_RGBA8_ETC2_EAC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA8_ETC2_EAC), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X10_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_10X10_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_10X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X6_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_10X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_10X8_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_10X8_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_12X10_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_12X10_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_12X12_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_12X12_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_4X4_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_4X4_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_5X4_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_5X4_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_5X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_5X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_6X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_6X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_6X6_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_6X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_8X5_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X6_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_8X6_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ASTC_8X8_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ASTC_8X8_KHR), /* harmony export */ GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL), /* harmony export */ GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL), /* harmony export */ GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT), /* harmony export */ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT), /* harmony export */ GL_COMPRESSED_RGB_ATC_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB_ATC_WEBGL), /* harmony export */ GL_COMPRESSED_RGB_ETC1_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB_ETC1_WEBGL), /* harmony export */ GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG), /* harmony export */ GL_COMPRESSED_RGB_S3TC_DXT1_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_RGB_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_SIGNED_R11_EAC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SIGNED_R11_EAC), /* harmony export */ GL_COMPRESSED_SIGNED_RG11_EAC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SIGNED_RG11_EAC), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR), /* harmony export */ GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC), /* harmony export */ GL_COMPRESSED_SRGB8_ETC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_ETC2), /* harmony export */ GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT), /* harmony export */ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT), /* harmony export */ GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_SRGB_S3TC_DXT1_EXT), /* harmony export */ GL_COMPRESSED_TEXTURE_FORMATS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COMPRESSED_TEXTURE_FORMATS), /* harmony export */ GL_CONDITION_SATISFIED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CONDITION_SATISFIED), /* harmony export */ GL_CONSTANT_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CONSTANT_ALPHA), /* harmony export */ GL_CONSTANT_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CONSTANT_COLOR), /* harmony export */ GL_CONTEXT_LOST_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CONTEXT_LOST_WEBGL), /* harmony export */ GL_COPY_READ_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COPY_READ_BUFFER), /* harmony export */ GL_COPY_READ_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COPY_READ_BUFFER_BINDING), /* harmony export */ GL_COPY_WRITE_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COPY_WRITE_BUFFER), /* harmony export */ GL_COPY_WRITE_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_COPY_WRITE_BUFFER_BINDING), /* harmony export */ GL_CULL_FACE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CULL_FACE), /* harmony export */ GL_CULL_FACE_MODE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CULL_FACE_MODE), /* harmony export */ GL_CURRENT_PROGRAM: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CURRENT_PROGRAM), /* harmony export */ GL_CURRENT_QUERY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CURRENT_QUERY), /* harmony export */ GL_CURRENT_QUERY_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CURRENT_QUERY_EXT), /* harmony export */ GL_CURRENT_VERTEX_ATTRIB: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CURRENT_VERTEX_ATTRIB), /* harmony export */ GL_CW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_CW), /* harmony export */ GL_DATA_BYTE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_BYTE), /* harmony export */ GL_DATA_FLOAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_FLOAT), /* harmony export */ GL_DATA_INT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_INT), /* harmony export */ GL_DATA_SHORT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_SHORT), /* harmony export */ GL_DATA_UNSIGNED_BYTE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_UNSIGNED_BYTE), /* harmony export */ GL_DATA_UNSIGNED_INT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_UNSIGNED_INT), /* harmony export */ GL_DATA_UNSIGNED_SHORT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DATA_UNSIGNED_SHORT), /* harmony export */ GL_DECR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DECR), /* harmony export */ GL_DECR_WRAP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DECR_WRAP), /* harmony export */ GL_DELETE_STATUS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DELETE_STATUS), /* harmony export */ GL_DEPTH: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH), /* harmony export */ GL_DEPTH24_STENCIL8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH24_STENCIL8), /* harmony export */ GL_DEPTH32F_STENCIL8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH32F_STENCIL8), /* harmony export */ GL_DEPTH_ATTACHMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_ATTACHMENT), /* harmony export */ GL_DEPTH_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_BITS), /* harmony export */ GL_DEPTH_BUFFER_BIT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_BUFFER_BIT), /* harmony export */ GL_DEPTH_CLEAR_VALUE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_CLEAR_VALUE), /* harmony export */ GL_DEPTH_COMPONENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_COMPONENT), /* harmony export */ GL_DEPTH_COMPONENT16: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_COMPONENT16), /* harmony export */ GL_DEPTH_COMPONENT24: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_COMPONENT24), /* harmony export */ GL_DEPTH_COMPONENT32F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_COMPONENT32F), /* harmony export */ GL_DEPTH_FUNC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_FUNC), /* harmony export */ GL_DEPTH_RANGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_RANGE), /* harmony export */ GL_DEPTH_STENCIL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_STENCIL), /* harmony export */ GL_DEPTH_STENCIL_ATTACHMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_STENCIL_ATTACHMENT), /* harmony export */ GL_DEPTH_TEST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_TEST), /* harmony export */ GL_DEPTH_WRITEMASK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DEPTH_WRITEMASK), /* harmony export */ GL_DITHER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DITHER), /* harmony export */ GL_DONT_CARE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DONT_CARE), /* harmony export */ GL_DRAW_BUFFER0: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER0), /* harmony export */ GL_DRAW_BUFFER0_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER0_WEBGL), /* harmony export */ GL_DRAW_BUFFER1: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER1), /* harmony export */ GL_DRAW_BUFFER10: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER10), /* harmony export */ GL_DRAW_BUFFER10_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER10_WEBGL), /* harmony export */ GL_DRAW_BUFFER11: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER11), /* harmony export */ GL_DRAW_BUFFER11_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER11_WEBGL), /* harmony export */ GL_DRAW_BUFFER12: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER12), /* harmony export */ GL_DRAW_BUFFER12_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER12_WEBGL), /* harmony export */ GL_DRAW_BUFFER13: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER13), /* harmony export */ GL_DRAW_BUFFER13_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER13_WEBGL), /* harmony export */ GL_DRAW_BUFFER14: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER14), /* harmony export */ GL_DRAW_BUFFER14_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER14_WEBGL), /* harmony export */ GL_DRAW_BUFFER15: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER15), /* harmony export */ GL_DRAW_BUFFER15_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER15_WEBGL), /* harmony export */ GL_DRAW_BUFFER1_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER1_WEBGL), /* harmony export */ GL_DRAW_BUFFER2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER2), /* harmony export */ GL_DRAW_BUFFER2_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER2_WEBGL), /* harmony export */ GL_DRAW_BUFFER3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER3), /* harmony export */ GL_DRAW_BUFFER3_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER3_WEBGL), /* harmony export */ GL_DRAW_BUFFER4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER4), /* harmony export */ GL_DRAW_BUFFER4_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER4_WEBGL), /* harmony export */ GL_DRAW_BUFFER5: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER5), /* harmony export */ GL_DRAW_BUFFER5_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER5_WEBGL), /* harmony export */ GL_DRAW_BUFFER6: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER6), /* harmony export */ GL_DRAW_BUFFER6_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER6_WEBGL), /* harmony export */ GL_DRAW_BUFFER7: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER7), /* harmony export */ GL_DRAW_BUFFER7_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER7_WEBGL), /* harmony export */ GL_DRAW_BUFFER8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER8), /* harmony export */ GL_DRAW_BUFFER8_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER8_WEBGL), /* harmony export */ GL_DRAW_BUFFER9: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER9), /* harmony export */ GL_DRAW_BUFFER9_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_BUFFER9_WEBGL), /* harmony export */ GL_DRAW_FRAMEBUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_FRAMEBUFFER), /* harmony export */ GL_DRAW_FRAMEBUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DRAW_FRAMEBUFFER_BINDING), /* harmony export */ GL_DST_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DST_ALPHA), /* harmony export */ GL_DST_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DST_COLOR), /* harmony export */ GL_DYNAMIC_COPY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DYNAMIC_COPY), /* harmony export */ GL_DYNAMIC_DRAW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DYNAMIC_DRAW), /* harmony export */ GL_DYNAMIC_READ: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_DYNAMIC_READ), /* harmony export */ GL_ELEMENT_ARRAY_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ELEMENT_ARRAY_BUFFER), /* harmony export */ GL_ELEMENT_ARRAY_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ELEMENT_ARRAY_BUFFER_BINDING), /* harmony export */ GL_EQUAL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_EQUAL), /* harmony export */ GL_FASTEST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FASTEST), /* harmony export */ GL_FLOAT_32_UNSIGNED_INT_24_8_REV: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_32_UNSIGNED_INT_24_8_REV), /* harmony export */ GL_FLOAT_MAT2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT2), /* harmony export */ GL_FLOAT_MAT2X3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT2X3), /* harmony export */ GL_FLOAT_MAT2X4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT2X4), /* harmony export */ GL_FLOAT_MAT3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT3), /* harmony export */ GL_FLOAT_MAT3X2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT3X2), /* harmony export */ GL_FLOAT_MAT3X4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT3X4), /* harmony export */ GL_FLOAT_MAT4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT4), /* harmony export */ GL_FLOAT_MAT4X2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT4X2), /* harmony export */ GL_FLOAT_MAT4X3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_MAT4X3), /* harmony export */ GL_FLOAT_VEC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_VEC2), /* harmony export */ GL_FLOAT_VEC3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_VEC3), /* harmony export */ GL_FLOAT_VEC4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FLOAT_VEC4), /* harmony export */ GL_FRAGMENT_SHADER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAGMENT_SHADER), /* harmony export */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAGMENT_SHADER_DERIVATIVE_HINT), /* harmony export */ GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES), /* harmony export */ GL_FRAMEBUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER), /* harmony export */ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL), /* harmony export */ GL_FRAMEBUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_BINDING), /* harmony export */ GL_FRAMEBUFFER_COMPLETE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_COMPLETE), /* harmony export */ GL_FRAMEBUFFER_DEFAULT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_DEFAULT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT), /* harmony export */ GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE), /* harmony export */ GL_FRAMEBUFFER_UNSUPPORTED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRAMEBUFFER_UNSUPPORTED), /* harmony export */ GL_FRONT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRONT), /* harmony export */ GL_FRONT_AND_BACK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRONT_AND_BACK), /* harmony export */ GL_FRONT_FACE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FRONT_FACE), /* harmony export */ GL_FUNC_ADD: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FUNC_ADD), /* harmony export */ GL_FUNC_REVERSE_SUBTRACT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FUNC_REVERSE_SUBTRACT), /* harmony export */ GL_FUNC_SUBSTRACT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_FUNC_SUBSTRACT), /* harmony export */ GL_GENERATE_MIPMAP_HINT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_GENERATE_MIPMAP_HINT), /* harmony export */ GL_GEQUAL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_GEQUAL), /* harmony export */ GL_GPU_DISJOINT_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_GPU_DISJOINT_EXT), /* harmony export */ GL_GREATER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_GREATER), /* harmony export */ GL_GREEN_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_GREEN_BITS), /* harmony export */ GL_HALF_FLOAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_HALF_FLOAT), /* harmony export */ GL_HALF_FLOAT_OES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_HALF_FLOAT_OES), /* harmony export */ GL_HIGH_FLOAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_HIGH_FLOAT), /* harmony export */ GL_HIGH_INT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_HIGH_INT), /* harmony export */ GL_IMPLEMENTATION_COLOR_READ_FORMAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_IMPLEMENTATION_COLOR_READ_FORMAT), /* harmony export */ GL_IMPLEMENTATION_COLOR_READ_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_IMPLEMENTATION_COLOR_READ_TYPE), /* harmony export */ GL_INCR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INCR), /* harmony export */ GL_INCR_WRAP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INCR_WRAP), /* harmony export */ GL_INTERLEAVED_ATTRIBS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INTERLEAVED_ATTRIBS), /* harmony export */ GL_INT_2_10_10_10_REV: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_2_10_10_10_REV), /* harmony export */ GL_INT_SAMPLER_2D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_SAMPLER_2D), /* harmony export */ GL_INT_SAMPLER_2D_ARRAY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_SAMPLER_2D_ARRAY), /* harmony export */ GL_INT_SAMPLER_3D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_SAMPLER_3D), /* harmony export */ GL_INT_SAMPLER_CUBE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_SAMPLER_CUBE), /* harmony export */ GL_INT_VEC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_VEC2), /* harmony export */ GL_INT_VEC3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_VEC3), /* harmony export */ GL_INT_VEC4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INT_VEC4), /* harmony export */ GL_INVALID_ENUM: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INVALID_ENUM), /* harmony export */ GL_INVALID_FRAMEBUFFER_OPERATION: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INVALID_FRAMEBUFFER_OPERATION), /* harmony export */ GL_INVALID_INDEX: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INVALID_INDEX), /* harmony export */ GL_INVALID_OPERATION: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INVALID_OPERATION), /* harmony export */ GL_INVALID_VALUE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INVALID_VALUE), /* harmony export */ GL_INVERT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_INVERT), /* harmony export */ GL_KEEP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_KEEP), /* harmony export */ GL_LEQUAL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LEQUAL), /* harmony export */ GL_LESS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LESS), /* harmony export */ GL_LINEAR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINEAR), /* harmony export */ GL_LINEAR_MIPMAP_LINEAR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINEAR_MIPMAP_LINEAR), /* harmony export */ GL_LINEAR_MIPMAP_NEAREST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINEAR_MIPMAP_NEAREST), /* harmony export */ GL_LINES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINES), /* harmony export */ GL_LINE_LOOP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINE_LOOP), /* harmony export */ GL_LINE_STRIP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINE_STRIP), /* harmony export */ GL_LINE_WIDTH: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINE_WIDTH), /* harmony export */ GL_LINK_STATUS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LINK_STATUS), /* harmony export */ GL_LOW_FLOAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LOW_FLOAT), /* harmony export */ GL_LOW_INT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LOW_INT), /* harmony export */ GL_LUMINANCE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LUMINANCE), /* harmony export */ GL_LUMINANCE_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_LUMINANCE_ALPHA), /* harmony export */ GL_MAX: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX), /* harmony export */ GL_MAX_3D_TEXTURE_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_3D_TEXTURE_SIZE), /* harmony export */ GL_MAX_ARRAY_TEXTURE_LAYERS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_ARRAY_TEXTURE_LAYERS), /* harmony export */ GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL), /* harmony export */ GL_MAX_COLOR_ATTACHMENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_COLOR_ATTACHMENTS), /* harmony export */ GL_MAX_COLOR_ATTACHMENTS_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_COLOR_ATTACHMENTS_WEBGL), /* harmony export */ GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_COMBINED_UNIFORM_BLOCKS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_COMBINED_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_CUBE_MAP_TEXTURE_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_CUBE_MAP_TEXTURE_SIZE), /* harmony export */ GL_MAX_DRAW_BUFFERS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_DRAW_BUFFERS), /* harmony export */ GL_MAX_DRAW_BUFFERS_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_DRAW_BUFFERS_WEBGL), /* harmony export */ GL_MAX_ELEMENTS_INDICES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_ELEMENTS_INDICES), /* harmony export */ GL_MAX_ELEMENTS_VERTICES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_ELEMENTS_VERTICES), /* harmony export */ GL_MAX_ELEMENT_INDEX: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_ELEMENT_INDEX), /* harmony export */ GL_MAX_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_EXT), /* harmony export */ GL_MAX_FRAGMENT_INPUT_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_FRAGMENT_INPUT_COMPONENTS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_BLOCKS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_FRAGMENT_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_FRAGMENT_UNIFORM_VECTORS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_FRAGMENT_UNIFORM_VECTORS), /* harmony export */ GL_MAX_PROGRAM_TEXEL_OFFSET: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_PROGRAM_TEXEL_OFFSET), /* harmony export */ GL_MAX_RENDERBUFFER_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_RENDERBUFFER_SIZE), /* harmony export */ GL_MAX_SAMPLES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_SAMPLES), /* harmony export */ GL_MAX_SERVER_WAIT_TIMEOUT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_SERVER_WAIT_TIMEOUT), /* harmony export */ GL_MAX_TEXTURE_IMAGE_UNITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_TEXTURE_LOD_BIAS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TEXTURE_LOD_BIAS), /* harmony export */ GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT), /* harmony export */ GL_MAX_TEXTURE_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TEXTURE_SIZE), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS), /* harmony export */ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS), /* harmony export */ GL_MAX_UNIFORM_BLOCK_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_UNIFORM_BLOCK_SIZE), /* harmony export */ GL_MAX_UNIFORM_BUFFER_BINDINGS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_UNIFORM_BUFFER_BINDINGS), /* harmony export */ GL_MAX_VARYING_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VARYING_COMPONENTS), /* harmony export */ GL_MAX_VARYING_VECTORS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VARYING_VECTORS), /* harmony export */ GL_MAX_VERTEX_ATTRIBS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VERTEX_ATTRIBS), /* harmony export */ GL_MAX_VERTEX_OUTPUT_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VERTEX_OUTPUT_COMPONENTS), /* harmony export */ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_BLOCKS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VERTEX_UNIFORM_BLOCKS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_COMPONENTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VERTEX_UNIFORM_COMPONENTS), /* harmony export */ GL_MAX_VERTEX_UNIFORM_VECTORS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VERTEX_UNIFORM_VECTORS), /* harmony export */ GL_MAX_VIEWPORT_DIMS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MAX_VIEWPORT_DIMS), /* harmony export */ GL_MEDIUM_FLOAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MEDIUM_FLOAT), /* harmony export */ GL_MEDIUM_INT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MEDIUM_INT), /* harmony export */ GL_MIN: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MIN), /* harmony export */ GL_MIN_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MIN_EXT), /* harmony export */ GL_MIN_PROGRAM_TEXEL_OFFSET: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MIN_PROGRAM_TEXEL_OFFSET), /* harmony export */ GL_MIRRORED_REPEAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_MIRRORED_REPEAT), /* harmony export */ GL_NEAREST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NEAREST), /* harmony export */ GL_NEAREST_MIPMAP_LINEAR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NEAREST_MIPMAP_LINEAR), /* harmony export */ GL_NEAREST_MIPMAP_NEAREST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NEAREST_MIPMAP_NEAREST), /* harmony export */ GL_NEVER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NEVER), /* harmony export */ GL_NICEST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NICEST), /* harmony export */ GL_NONE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NONE), /* harmony export */ GL_NOTEQUAL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NOTEQUAL), /* harmony export */ GL_NO_ERROR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_NO_ERROR), /* harmony export */ GL_OBJECT_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_OBJECT_TYPE), /* harmony export */ GL_ONE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE), /* harmony export */ GL_ONE_MINUS_CONSTANT_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE_MINUS_CONSTANT_ALPHA), /* harmony export */ GL_ONE_MINUS_CONSTANT_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE_MINUS_CONSTANT_COLOR), /* harmony export */ GL_ONE_MINUS_DST_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE_MINUS_DST_ALPHA), /* harmony export */ GL_ONE_MINUS_DST_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE_MINUS_DST_COLOR), /* harmony export */ GL_ONE_MINUS_SRC_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE_MINUS_SRC_ALPHA), /* harmony export */ GL_ONE_MINUS_SRC_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ONE_MINUS_SRC_COLOR), /* harmony export */ GL_OUT_OF_MEMORY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_OUT_OF_MEMORY), /* harmony export */ GL_PACK_ALIGNMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PACK_ALIGNMENT), /* harmony export */ GL_PACK_ROW_LENGTH: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PACK_ROW_LENGTH), /* harmony export */ GL_PACK_SKIP_PIXELS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PACK_SKIP_PIXELS), /* harmony export */ GL_PACK_SKIP_ROWS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PACK_SKIP_ROWS), /* harmony export */ GL_PIXEL_PACK_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_PACK_BUFFER), /* harmony export */ GL_PIXEL_PACK_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_PACK_BUFFER_BINDING), /* harmony export */ GL_PIXEL_UNPACK_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_UNPACK_BUFFER), /* harmony export */ GL_PIXEL_UNPACK_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_UNPACK_BUFFER_BINDING), /* harmony export */ GL_PIXEL_UNSIGNED_BYTE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_UNSIGNED_BYTE), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_4_4_4_4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_UNSIGNED_SHORT_4_4_4_4), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_5_5_5_1: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_UNSIGNED_SHORT_5_5_5_1), /* harmony export */ GL_PIXEL_UNSIGNED_SHORT_5_6_5: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_PIXEL_UNSIGNED_SHORT_5_6_5), /* harmony export */ GL_POINTS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_POINTS), /* harmony export */ GL_POLYGON_OFFSET_FACTOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_POLYGON_OFFSET_FACTOR), /* harmony export */ GL_POLYGON_OFFSET_FILL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_POLYGON_OFFSET_FILL), /* harmony export */ GL_POLYGON_OFFSET_UNITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_POLYGON_OFFSET_UNITS), /* harmony export */ GL_QUERY_COUNTER_BITS_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_QUERY_COUNTER_BITS_EXT), /* harmony export */ GL_QUERY_RESULT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_QUERY_RESULT), /* harmony export */ GL_QUERY_RESULT_AVAILABLE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_QUERY_RESULT_AVAILABLE), /* harmony export */ GL_QUERY_RESULT_AVAILABLE_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_QUERY_RESULT_AVAILABLE_EXT), /* harmony export */ GL_QUERY_RESULT_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_QUERY_RESULT_EXT), /* harmony export */ GL_R11F_G11F_B10F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R11F_G11F_B10F), /* harmony export */ GL_R16F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R16F), /* harmony export */ GL_R16I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R16I), /* harmony export */ GL_R16UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R16UI), /* harmony export */ GL_R32F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R32F), /* harmony export */ GL_R32I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R32I), /* harmony export */ GL_R32UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R32UI), /* harmony export */ GL_R8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R8), /* harmony export */ GL_R8I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R8I), /* harmony export */ GL_R8UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R8UI), /* harmony export */ GL_R8_SNORM: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_R8_SNORM), /* harmony export */ GL_RASTERIZER_DISCARD: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RASTERIZER_DISCARD), /* harmony export */ GL_READ_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_READ_BUFFER), /* harmony export */ GL_READ_FRAMEBUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_READ_FRAMEBUFFER), /* harmony export */ GL_READ_FRAMEBUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_READ_FRAMEBUFFER_BINDING), /* harmony export */ GL_RED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RED), /* harmony export */ GL_RED_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RED_BITS), /* harmony export */ GL_RED_INTEGER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RED_INTEGER), /* harmony export */ GL_RENDERBUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER), /* harmony export */ GL_RENDERBUFFER_ALPHA_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_ALPHA_SIZE), /* harmony export */ GL_RENDERBUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_BINDING), /* harmony export */ GL_RENDERBUFFER_BLUE_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_BLUE_SIZE), /* harmony export */ GL_RENDERBUFFER_DEPTH_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_DEPTH_SIZE), /* harmony export */ GL_RENDERBUFFER_GREEN_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_GREEN_SIZE), /* harmony export */ GL_RENDERBUFFER_HEIGHT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_HEIGHT), /* harmony export */ GL_RENDERBUFFER_INTERNAL_FORMAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_INTERNAL_FORMAT), /* harmony export */ GL_RENDERBUFFER_RED_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_RED_SIZE), /* harmony export */ GL_RENDERBUFFER_SAMPLES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_SAMPLES), /* harmony export */ GL_RENDERBUFFER_STENCIL_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_STENCIL_SIZE), /* harmony export */ GL_RENDERBUFFER_WIDTH: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERBUFFER_WIDTH), /* harmony export */ GL_RENDERER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RENDERER), /* harmony export */ GL_REPEAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_REPEAT), /* harmony export */ GL_REPLACE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_REPLACE), /* harmony export */ GL_RG: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG), /* harmony export */ GL_RG16F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG16F), /* harmony export */ GL_RG16I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG16I), /* harmony export */ GL_RG16UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG16UI), /* harmony export */ GL_RG32F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG32F), /* harmony export */ GL_RG32I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG32I), /* harmony export */ GL_RG32UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG32UI), /* harmony export */ GL_RG8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG8), /* harmony export */ GL_RG8I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG8I), /* harmony export */ GL_RG8UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG8UI), /* harmony export */ GL_RG8_SNORM: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG8_SNORM), /* harmony export */ GL_RGB: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB), /* harmony export */ GL_RGB10_A2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB10_A2), /* harmony export */ GL_RGB10_A2UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB10_A2UI), /* harmony export */ GL_RGB16F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB16F), /* harmony export */ GL_RGB16I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB16I), /* harmony export */ GL_RGB16UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB16UI), /* harmony export */ GL_RGB32F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB32F), /* harmony export */ GL_RGB32F_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB32F_EXT), /* harmony export */ GL_RGB32I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB32I), /* harmony export */ GL_RGB32UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB32UI), /* harmony export */ GL_RGB565: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB565), /* harmony export */ GL_RGB5_A1: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB5_A1), /* harmony export */ GL_RGB8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB8), /* harmony export */ GL_RGB8I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB8I), /* harmony export */ GL_RGB8UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB8UI), /* harmony export */ GL_RGB8_SNORM: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB8_SNORM), /* harmony export */ GL_RGB9_E5: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB9_E5), /* harmony export */ GL_RGBA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA), /* harmony export */ GL_RGBA16F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA16F), /* harmony export */ GL_RGBA16I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA16I), /* harmony export */ GL_RGBA16UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA16UI), /* harmony export */ GL_RGBA32F: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA32F), /* harmony export */ GL_RGBA32F_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA32F_EXT), /* harmony export */ GL_RGBA32I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA32I), /* harmony export */ GL_RGBA32UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA32UI), /* harmony export */ GL_RGBA4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA4), /* harmony export */ GL_RGBA8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA8), /* harmony export */ GL_RGBA8I: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA8I), /* harmony export */ GL_RGBA8UI: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA8UI), /* harmony export */ GL_RGBA8_SNORM: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA8_SNORM), /* harmony export */ GL_RGBA_INTEGER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGBA_INTEGER), /* harmony export */ GL_RGB_INTEGER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RGB_INTEGER), /* harmony export */ GL_RG_INTEGER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_RG_INTEGER), /* harmony export */ GL_SAMPLER_2D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_2D), /* harmony export */ GL_SAMPLER_2D_ARRAY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_2D_ARRAY), /* harmony export */ GL_SAMPLER_2D_ARRAY_SHADOW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_2D_ARRAY_SHADOW), /* harmony export */ GL_SAMPLER_2D_SHADOW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_2D_SHADOW), /* harmony export */ GL_SAMPLER_3D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_3D), /* harmony export */ GL_SAMPLER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_BINDING), /* harmony export */ GL_SAMPLER_CUBE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_CUBE), /* harmony export */ GL_SAMPLER_CUBE_SHADOW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLER_CUBE_SHADOW), /* harmony export */ GL_SAMPLES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLES), /* harmony export */ GL_SAMPLE_ALPHA_TO_COVERAGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLE_ALPHA_TO_COVERAGE), /* harmony export */ GL_SAMPLE_BUFFERS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLE_BUFFERS), /* harmony export */ GL_SAMPLE_COVERAGE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLE_COVERAGE), /* harmony export */ GL_SAMPLE_COVERAGE_INVERT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLE_COVERAGE_INVERT), /* harmony export */ GL_SAMPLE_COVERAGE_VALUE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SAMPLE_COVERAGE_VALUE), /* harmony export */ GL_SCISSOR_BOX: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SCISSOR_BOX), /* harmony export */ GL_SCISSOR_TEST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SCISSOR_TEST), /* harmony export */ GL_SEPARATE_ATTRIBS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SEPARATE_ATTRIBS), /* harmony export */ GL_SHADER_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SHADER_TYPE), /* harmony export */ GL_SHADING_LANGUAGE_VERSION: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SHADING_LANGUAGE_VERSION), /* harmony export */ GL_SIGNALED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SIGNALED), /* harmony export */ GL_SIGNED_NORMALIZED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SIGNED_NORMALIZED), /* harmony export */ GL_SRC_ALPHA: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRC_ALPHA), /* harmony export */ GL_SRC_ALPHA_SATURATE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRC_ALPHA_SATURATE), /* harmony export */ GL_SRC_COLOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRC_COLOR), /* harmony export */ GL_SRGB: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRGB), /* harmony export */ GL_SRGB8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRGB8), /* harmony export */ GL_SRGB8_ALPHA8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRGB8_ALPHA8), /* harmony export */ GL_SRGB8_ALPHA8_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRGB8_ALPHA8_EXT), /* harmony export */ GL_SRGB_ALPHA_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRGB_ALPHA_EXT), /* harmony export */ GL_SRGB_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SRGB_EXT), /* harmony export */ GL_STATIC_COPY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STATIC_COPY), /* harmony export */ GL_STATIC_DRAW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STATIC_DRAW), /* harmony export */ GL_STATIC_READ: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STATIC_READ), /* harmony export */ GL_STENCIL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL), /* harmony export */ GL_STENCIL_ATTACHMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_ATTACHMENT), /* harmony export */ GL_STENCIL_BACK_FAIL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_FAIL), /* harmony export */ GL_STENCIL_BACK_FUNC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_FUNC), /* harmony export */ GL_STENCIL_BACK_PASS_DEPTH_FAIL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_PASS_DEPTH_FAIL), /* harmony export */ GL_STENCIL_BACK_PASS_DEPTH_PASS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_PASS_DEPTH_PASS), /* harmony export */ GL_STENCIL_BACK_REF: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_REF), /* harmony export */ GL_STENCIL_BACK_VALUE_MASK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_VALUE_MASK), /* harmony export */ GL_STENCIL_BACK_WRITEMASK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BACK_WRITEMASK), /* harmony export */ GL_STENCIL_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BITS), /* harmony export */ GL_STENCIL_BUFFER_BIT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_BUFFER_BIT), /* harmony export */ GL_STENCIL_CLEAR_VALUE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_CLEAR_VALUE), /* harmony export */ GL_STENCIL_FAIL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_FAIL), /* harmony export */ GL_STENCIL_FUNC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_FUNC), /* harmony export */ GL_STENCIL_INDEX: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_INDEX), /* harmony export */ GL_STENCIL_INDEX8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_INDEX8), /* harmony export */ GL_STENCIL_PASS_DEPTH_FAIL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_PASS_DEPTH_FAIL), /* harmony export */ GL_STENCIL_PASS_DEPTH_PASS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_PASS_DEPTH_PASS), /* harmony export */ GL_STENCIL_REF: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_REF), /* harmony export */ GL_STENCIL_TEST: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_TEST), /* harmony export */ GL_STENCIL_VALUE_MASK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_VALUE_MASK), /* harmony export */ GL_STENCIL_WRITEMASK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STENCIL_WRITEMASK), /* harmony export */ GL_STREAM_COPY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STREAM_COPY), /* harmony export */ GL_STREAM_DRAW: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STREAM_DRAW), /* harmony export */ GL_STREAM_READ: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_STREAM_READ), /* harmony export */ GL_SUBPIXEL_BITS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SUBPIXEL_BITS), /* harmony export */ GL_SYNC_CONDITION: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SYNC_CONDITION), /* harmony export */ GL_SYNC_FENCE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SYNC_FENCE), /* harmony export */ GL_SYNC_FLAGS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SYNC_FLAGS), /* harmony export */ GL_SYNC_FLUSH_COMMANDS_BIT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SYNC_FLUSH_COMMANDS_BIT), /* harmony export */ GL_SYNC_GPU_COMMANDS_COMPLETE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SYNC_GPU_COMMANDS_COMPLETE), /* harmony export */ GL_SYNC_STATUS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_SYNC_STATUS), /* harmony export */ GL_TEXTURE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE), /* harmony export */ GL_TEXTURE0: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE0), /* harmony export */ GL_TEXTURE1: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE1), /* harmony export */ GL_TEXTURE10: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE10), /* harmony export */ GL_TEXTURE11: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE11), /* harmony export */ GL_TEXTURE12: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE12), /* harmony export */ GL_TEXTURE13: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE13), /* harmony export */ GL_TEXTURE14: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE14), /* harmony export */ GL_TEXTURE15: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE15), /* harmony export */ GL_TEXTURE16: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE16), /* harmony export */ GL_TEXTURE17: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE17), /* harmony export */ GL_TEXTURE18: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE18), /* harmony export */ GL_TEXTURE19: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE19), /* harmony export */ GL_TEXTURE2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE2), /* harmony export */ GL_TEXTURE20: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE20), /* harmony export */ GL_TEXTURE21: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE21), /* harmony export */ GL_TEXTURE22: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE22), /* harmony export */ GL_TEXTURE23: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE23), /* harmony export */ GL_TEXTURE24: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE24), /* harmony export */ GL_TEXTURE25: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE25), /* harmony export */ GL_TEXTURE26: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE26), /* harmony export */ GL_TEXTURE27: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE27), /* harmony export */ GL_TEXTURE28: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE28), /* harmony export */ GL_TEXTURE29: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE29), /* harmony export */ GL_TEXTURE3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE3), /* harmony export */ GL_TEXTURE30: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE30), /* harmony export */ GL_TEXTURE31: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE31), /* harmony export */ GL_TEXTURE4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE4), /* harmony export */ GL_TEXTURE5: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE5), /* harmony export */ GL_TEXTURE6: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE6), /* harmony export */ GL_TEXTURE7: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE7), /* harmony export */ GL_TEXTURE8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE8), /* harmony export */ GL_TEXTURE9: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE9), /* harmony export */ GL_TEXTURE_2D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_2D), /* harmony export */ GL_TEXTURE_2D_ARRAY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_2D_ARRAY), /* harmony export */ GL_TEXTURE_3D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_3D), /* harmony export */ GL_TEXTURE_BASE_LEVEL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_BASE_LEVEL), /* harmony export */ GL_TEXTURE_BINDING_2D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_BINDING_2D), /* harmony export */ GL_TEXTURE_BINDING_2D_ARRAY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_BINDING_2D_ARRAY), /* harmony export */ GL_TEXTURE_BINDING_3D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_BINDING_3D), /* harmony export */ GL_TEXTURE_BINDING_CUBE_MAP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_BINDING_CUBE_MAP), /* harmony export */ GL_TEXTURE_COMPARE_FUNC: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_COMPARE_FUNC), /* harmony export */ GL_TEXTURE_COMPARE_MODE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_COMPARE_MODE), /* harmony export */ GL_TEXTURE_CUBE_MAP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_X: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP_NEGATIVE_X), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y), /* harmony export */ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_X: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP_POSITIVE_X), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_Y: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP_POSITIVE_Y), /* harmony export */ GL_TEXTURE_CUBE_MAP_POSITIVE_Z: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_CUBE_MAP_POSITIVE_Z), /* harmony export */ GL_TEXTURE_IMMUTABLE_FORMAT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_IMMUTABLE_FORMAT), /* harmony export */ GL_TEXTURE_IMMUTABLE_LEVELS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_IMMUTABLE_LEVELS), /* harmony export */ GL_TEXTURE_MAG_FILTER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_MAG_FILTER), /* harmony export */ GL_TEXTURE_MAX_ANISOTROPY_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_MAX_ANISOTROPY_EXT), /* harmony export */ GL_TEXTURE_MAX_LEVEL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_MAX_LEVEL), /* harmony export */ GL_TEXTURE_MAX_LOD: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_MAX_LOD), /* harmony export */ GL_TEXTURE_MIN_FILTER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_MIN_FILTER), /* harmony export */ GL_TEXTURE_MIN_LOD: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_MIN_LOD), /* harmony export */ GL_TEXTURE_WRAP_R: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_WRAP_R), /* harmony export */ GL_TEXTURE_WRAP_S: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_WRAP_S), /* harmony export */ GL_TEXTURE_WRAP_T: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TEXTURE_WRAP_T), /* harmony export */ GL_TIMEOUT_EXPIRED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TIMEOUT_EXPIRED), /* harmony export */ GL_TIMEOUT_IGNORED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TIMEOUT_IGNORED), /* harmony export */ GL_TIMESTAMP_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TIMESTAMP_EXT), /* harmony export */ GL_TIME_ELAPSED_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TIME_ELAPSED_EXT), /* harmony export */ GL_TRANSFORM_FEEDBACK: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK), /* harmony export */ GL_TRANSFORM_FEEDBACK_ACTIVE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_ACTIVE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_BINDING), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_BUFFER), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_BUFFER_BINDING), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_MODE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_BUFFER_MODE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_BUFFER_SIZE), /* harmony export */ GL_TRANSFORM_FEEDBACK_BUFFER_START: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_BUFFER_START), /* harmony export */ GL_TRANSFORM_FEEDBACK_PAUSED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_PAUSED), /* harmony export */ GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN), /* harmony export */ GL_TRANSFORM_FEEDBACK_VARYINGS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRANSFORM_FEEDBACK_VARYINGS), /* harmony export */ GL_TRIANGLES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRIANGLES), /* harmony export */ GL_TRIANGLE_FAN: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRIANGLE_FAN), /* harmony export */ GL_TRIANGLE_STRIP: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_TRIANGLE_STRIP), /* harmony export */ GL_UNIFORM_ARRAY_STRIDE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_ARRAY_STRIDE), /* harmony export */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS), /* harmony export */ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES), /* harmony export */ GL_UNIFORM_BLOCK_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_BINDING), /* harmony export */ GL_UNIFORM_BLOCK_DATA_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_DATA_SIZE), /* harmony export */ GL_UNIFORM_BLOCK_INDEX: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_INDEX), /* harmony export */ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER), /* harmony export */ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER), /* harmony export */ GL_UNIFORM_BUFFER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BUFFER), /* harmony export */ GL_UNIFORM_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BUFFER_BINDING), /* harmony export */ GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT), /* harmony export */ GL_UNIFORM_BUFFER_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BUFFER_SIZE), /* harmony export */ GL_UNIFORM_BUFFER_START: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_BUFFER_START), /* harmony export */ GL_UNIFORM_IS_ROW_MAJOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_IS_ROW_MAJOR), /* harmony export */ GL_UNIFORM_MATRIX_STRIDE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_MATRIX_STRIDE), /* harmony export */ GL_UNIFORM_OFFSET: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_OFFSET), /* harmony export */ GL_UNIFORM_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_SIZE), /* harmony export */ GL_UNIFORM_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNIFORM_TYPE), /* harmony export */ GL_UNMASKED_RENDERER_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNMASKED_RENDERER_WEBGL), /* harmony export */ GL_UNMASKED_VENDOR_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNMASKED_VENDOR_WEBGL), /* harmony export */ GL_UNPACK_ALIGNMENT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_ALIGNMENT), /* harmony export */ GL_UNPACK_COLORSPACE_CONVERSION_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_COLORSPACE_CONVERSION_WEBGL), /* harmony export */ GL_UNPACK_FLIP_Y_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_FLIP_Y_WEBGL), /* harmony export */ GL_UNPACK_IMAGE_HEIGHT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_IMAGE_HEIGHT), /* harmony export */ GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL), /* harmony export */ GL_UNPACK_ROW_LENGTH: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_ROW_LENGTH), /* harmony export */ GL_UNPACK_SKIP_IMAGES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_SKIP_IMAGES), /* harmony export */ GL_UNPACK_SKIP_PIXELS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_SKIP_PIXELS), /* harmony export */ GL_UNPACK_SKIP_ROWS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNPACK_SKIP_ROWS), /* harmony export */ GL_UNSIGNALED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNALED), /* harmony export */ GL_UNSIGNED_INT_10F_11F_11F_REV: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_10F_11F_11F_REV), /* harmony export */ GL_UNSIGNED_INT_24_8: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_24_8), /* harmony export */ GL_UNSIGNED_INT_24_8_WEBGL: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_24_8_WEBGL), /* harmony export */ GL_UNSIGNED_INT_2_10_10_10_REV: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_2_10_10_10_REV), /* harmony export */ GL_UNSIGNED_INT_5_9_9_9_REV: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_5_9_9_9_REV), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_2D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_SAMPLER_2D), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_SAMPLER_2D_ARRAY), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_3D: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_SAMPLER_3D), /* harmony export */ GL_UNSIGNED_INT_SAMPLER_CUBE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_SAMPLER_CUBE), /* harmony export */ GL_UNSIGNED_INT_VEC2: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_VEC2), /* harmony export */ GL_UNSIGNED_INT_VEC3: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_VEC3), /* harmony export */ GL_UNSIGNED_INT_VEC4: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_INT_VEC4), /* harmony export */ GL_UNSIGNED_NORMALIZED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_NORMALIZED), /* harmony export */ GL_UNSIGNED_NORMALIZED_EXT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_UNSIGNED_NORMALIZED_EXT), /* harmony export */ GL_VALIDATE_STATUS: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VALIDATE_STATUS), /* harmony export */ GL_VENDOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VENDOR), /* harmony export */ GL_VERSION: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERSION), /* harmony export */ GL_VERTEX_ARRAY_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ARRAY_BINDING), /* harmony export */ GL_VERTEX_ARRAY_BINDING_OES: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ARRAY_BINDING_OES), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_DIVISOR), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_ENABLED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_ENABLED), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_INTEGER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_INTEGER), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_NORMALIZED), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_POINTER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_POINTER), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_SIZE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_SIZE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_STRIDE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_STRIDE), /* harmony export */ GL_VERTEX_ATTRIB_ARRAY_TYPE: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_ATTRIB_ARRAY_TYPE), /* harmony export */ GL_VERTEX_SHADER: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VERTEX_SHADER), /* harmony export */ GL_VIEWPORT: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_VIEWPORT), /* harmony export */ GL_WAIT_FAILED: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_WAIT_FAILED), /* harmony export */ GL_ZERO: () => (/* reexport safe */ _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__.GL_ZERO), /* harmony export */ TagGltf2NodeIndex: () => (/* reexport safe */ _glTF2__WEBPACK_IMPORTED_MODULE_9__.TagGltf2NodeIndex), /* harmony export */ fromTensorToCompositionType: () => (/* reexport safe */ _TypeConverter__WEBPACK_IMPORTED_MODULE_4__.fromTensorToCompositionType), /* harmony export */ isSameGlTF2TextureSampler: () => (/* reexport safe */ _glTF2__WEBPACK_IMPORTED_MODULE_9__.isSameGlTF2TextureSampler) /* harmony export */ }); /* harmony import */ var _AnimationTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AnimationTypes */ "./src/types/AnimationTypes.ts"); /* harmony import */ var _BasisTexture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BasisTexture */ "./src/types/BasisTexture.ts"); /* harmony import */ var _CommonTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CommonTypes */ "./src/types/CommonTypes.ts"); /* harmony import */ var _KTX2Texture__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./KTX2Texture */ "./src/types/KTX2Texture.ts"); /* harmony import */ var _TypeConverter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TypeConverter */ "./src/types/TypeConverter.ts"); /* harmony import */ var _TypeGenerators__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TypeGenerators */ "./src/types/TypeGenerators.ts"); /* harmony import */ var _VRM0x__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./VRM0x */ "./src/types/VRM0x.ts"); /* harmony import */ var _WebGLConstants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebGLConstants */ "./src/types/WebGLConstants.ts"); /* harmony import */ var _glTF1__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./glTF1 */ "./src/types/glTF1.ts"); /* harmony import */ var _glTF2__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./glTF2 */ "./src/types/glTF2.ts"); /* harmony import */ var _glTF2ForOutput__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./glTF2ForOutput */ "./src/types/glTF2ForOutput.ts"); /* harmony import */ var _RnM2__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./RnM2 */ "./src/types/RnM2.ts"); /* harmony import */ var _RnM2Vrma__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./RnM2Vrma */ "./src/types/RnM2Vrma.ts"); /* harmony import */ var _ShaderNodeJson__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ShaderNodeJson */ "./src/types/ShaderNodeJson.ts"); /***/ }), /***/ "./src/version.ts": /*!************************!*\ !*** ./src/version.ts ***! \************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VERSION: () => (/* binding */ VERSION) /* harmony export */ }); // eslint-disable-next-line @typescript-eslint/no-var-requires const VERSION = (__webpack_require__(/*! ./../VERSION-FILE */ "./VERSION-FILE")["default"]); /***/ }), /***/ "./src/webgl/WebGLContextWrapper.ts": /*!******************************************!*\ !*** ./src/webgl/WebGLContextWrapper.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGLContextWrapper: () => (/* binding */ WebGLContextWrapper) /* harmony export */ }); /* harmony import */ var _WebGLExtension__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebGLExtension */ "./src/webgl/WebGLExtension.ts"); /* harmony import */ var _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); var __classPrivateFieldSet = (undefined && undefined.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (undefined && undefined.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _WebGLContextWrapper_alignedMaxUniformBlockSize, _WebGLContextWrapper_maxUniformBlockSize, _WebGLContextWrapper_uniformBufferOffsetAlignment, _WebGLContextWrapper_maxVertexUniformBlocks, _WebGLContextWrapper_maxFragmentUniformBlocks, _WebGLContextWrapper_maxConventionUniformBlocks; const INVALID_SIZE = -1; class WebGLContextWrapper { constructor(gl, canvas) { this.__webglVersion = 1; this.width = 0; this.height = 0; this.__activeTextureBackup = -1; this.__activeTextures2D = []; this.__activeTextures2DArray = []; this.__activeTexturesCube = []; this.__boundTextures = new Map(); this.__boundSamplers = new Map(); this.__viewport_left = 0; this.__viewport_top = 0; this.__viewport_width = 0; this.__viewport_height = 0; this.__default_viewport_left = 0; this.__default_viewport_top = 0; this.__default_viewport_width = 0; this.__default_viewport_height = 0; _WebGLContextWrapper_alignedMaxUniformBlockSize.set(this, INVALID_SIZE); _WebGLContextWrapper_maxUniformBlockSize.set(this, INVALID_SIZE); _WebGLContextWrapper_uniformBufferOffsetAlignment.set(this, INVALID_SIZE); _WebGLContextWrapper_maxVertexUniformBlocks.set(this, INVALID_SIZE); _WebGLContextWrapper_maxFragmentUniformBlocks.set(this, INVALID_SIZE); _WebGLContextWrapper_maxConventionUniformBlocks.set(this, INVALID_SIZE); this.__maxVertexUniformVectors = INVALID_SIZE; this.__maxFragmentUniformVectors = INVALID_SIZE; this._isWebXRMode = false; this.__extensions = new Map(); this.__gl = gl; this.width = canvas.width; this.height = canvas.height; this.canvas = canvas; this.__viewport_width = this.__default_viewport_width = this.width; this.__viewport_height = this.__default_viewport_height = this.height; this.__is_multiview = true; if (this.__gl.constructor.name === 'WebGL2RenderingContext') { this.__webglVersion = 2; this.webgl2ExtTFL = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.TextureFloatLinear); this.webgl2ExtTHFL = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.TextureHalfFloatLinear); this.webgl2ExtTFA = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.TextureFilterAnisotropic); this.webgl2ExtCBF = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.ColorBufferFloatWebGL2); this.webgl2ExtCBHF = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.ColorBufferHalfFloatWebGL2); this.webgl2ExtCTAstc = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTextureAstc); this.webgl2ExtCTS3tc = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTextureS3tc); this.webgl2ExtCTPvrtc = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTexturePvrtc); this.webgl2ExtCTAtc = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTextureAtc); this.webgl2ExtCTEtc = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTextureEtc); this.webgl2ExtCTEtc1 = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTextureEtc1); this.webgl2ExtCTBptc = this.__getCompressedTextureExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.CompressedTextureBptc); this.webgl2ExtMLTVIEW = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.OculusMultiview); if (this.webgl2ExtMLTVIEW) { this.webgl2ExtMLTVIEW.is_multisample = true; } else { this.webgl2ExtMLTVIEW = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.OvrMultiview2); if (this.webgl2ExtMLTVIEW) { this.webgl2ExtMLTVIEW.is_multisample = false; } else { if (_foundation_core_Config__WEBPACK_IMPORTED_MODULE_2__.Config.cgApiDebugConsoleOutput) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.info('OCULUS_multiview and OVR_multiview2 extensions are not supported'); } this.__is_multiview = false; } } this.webgl2ExtClipCtrl = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.ClipControl); this.webgl2ExtGmanWM = this.__getExtension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_0__.WebGLExtension.GMAN_WEBGL_MEMORY); } this.__getUniformBufferInfo(); this.__getMaxUniformVectors(); } getRawContext() { return this.__gl; } getRawContextAsWebGL1() { return this.__gl; } getRawContextAsWebGL2() { return this.__gl; } get viewport() { return _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_1__.Vector4.fromCopyArray([ this.__viewport_left, this.__viewport_top, this.__viewport_width, this.__viewport_height, ]); } get defaultViewport() { return _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_1__.Vector4.fromCopyArray([ this.__default_viewport_left, this.__default_viewport_top, this.__default_viewport_width, this.__default_viewport_height, ]); } isSupportWebGL1Extension(webGLExtension) { if (this.__getExtension(webGLExtension)) { return true; } else { return false; } } isNotSupportWebGL1Extension(webGLExtension) { return !this.isSupportWebGL1Extension(webGLExtension); } getIsWebGL2(gl) { return this.isWebGL2; } get isWebGL2() { if (this.__webglVersion === 2) { return true; } else { return false; } } createVertexArray() { if (this.getIsWebGL2(this.__gl)) { return this.__gl.createVertexArray(); } else { if (this.webgl1ExtVAO != null) { return this.webgl1ExtVAO.createVertexArrayOES(); } else { return undefined; } } } deleteVertexArray(vertexArray) { if (this.getIsWebGL2(this.__gl)) { this.__gl.deleteVertexArray(vertexArray); } else { if (this.webgl1ExtVAO != null) { this.webgl1ExtVAO.deleteVertexArrayOES(vertexArray); } } } bindVertexArray(vao) { if (this.getIsWebGL2(this.__gl)) { this.__gl.bindVertexArray(vao); } else { if (this.webgl1ExtVAO != null) { this.webgl1ExtVAO.bindVertexArrayOES(vao); } } } vertexAttribDivisor(index, divisor) { if (this.getIsWebGL2(this.__gl)) { this.__gl.vertexAttribDivisor(index, divisor); } else { this.webgl1ExtIA.vertexAttribDivisorANGLE(index, divisor); } } drawElementsInstanced(primitiveMode, indexCount, type, offset, instanceCount) { this.__gl.drawElementsInstanced(primitiveMode, indexCount, type, offset, instanceCount); } drawArraysInstanced(primitiveMode, first, count, instanceCount) { this.__gl.drawArraysInstanced(primitiveMode, first, count, instanceCount); } colorAttachment(index) { return 0x8ce0 + index; // GL_COLOR_ATTACHMENT0 = 0x8ce0 } drawBuffers(buffers) { const gl = this.__gl; if (buffers.length === 0) { gl.drawBuffers([gl.NONE]); return; } const buffer = buffers[0].webGLConstantValue(); gl.drawBuffers(buffers.map((buf) => { return buf.webGLConstantValue(); })); if (buffer === gl.NONE || buffers.length === 0) { gl.colorMask(false, false, false, false); } else { gl.colorMask(true, true, true, true); } } __activeTexture(activeTextureIndex) { if (this.__activeTextureBackup === activeTextureIndex) { return; } this.__gl.activeTexture(this.__gl.TEXTURE0 + activeTextureIndex); this.__activeTextureBackup = activeTextureIndex; } bindTexture2D(activeTextureIndex, texture) { const tex = this.__boundTextures.get(activeTextureIndex); if (tex !== texture) { this.__activeTexture(activeTextureIndex); this.__gl.bindTexture(this.__gl.TEXTURE_2D, texture); this.__boundTextures.set(activeTextureIndex, texture); } this.__activeTextures2D[activeTextureIndex] = texture; } bindTexture2DArray(activeTextureIndex, texture) { const tex = this.__boundTextures.get(activeTextureIndex); if (tex !== texture) { this.__activeTexture(activeTextureIndex); this.__gl.bindTexture(this.__gl.TEXTURE_2D_ARRAY, texture); this.__boundTextures.set(activeTextureIndex, texture); } this.__activeTextures2DArray[activeTextureIndex] = texture; } bindTextureSampler(activeTextureIndex, sampler) { // const samp = this.__boundSamplers.get(activeTextureIndex); // if (samp !== sampler) { this.__gl.bindSampler(activeTextureIndex, sampler); this.__boundSamplers.set(activeTextureIndex, sampler); // } } bindTextureCube(activeTextureIndex, texture) { const tex = this.__boundTextures.get(activeTextureIndex); if (tex !== texture) { this.__activeTexture(activeTextureIndex); this.__gl.bindTexture(this.__gl.TEXTURE_CUBE_MAP, texture); this.__boundTextures.set(activeTextureIndex, texture); } this.__activeTexturesCube[activeTextureIndex] = texture; } unbindTexture2D(activeTextureIndex) { this.__activeTexture(activeTextureIndex); this.__gl.bindTexture(this.__gl.TEXTURE_2D, null); this.__boundTextures.delete(activeTextureIndex); delete this.__activeTextures2D[activeTextureIndex]; } unbindTextureCube(activeTextureIndex) { this.__activeTexture(activeTextureIndex); this.__gl.bindTexture(this.__gl.TEXTURE_CUBE_MAP, null); this.__boundTextures.delete(activeTextureIndex); delete this.__activeTexturesCube[activeTextureIndex]; } unbindTextures() { for (let i = 0; i < this.__activeTextures2D.length; i++) { if (this.__activeTextures2D[i] == null) { continue; } this.__activeTexture(15); this.__gl.bindTexture(this.__gl.TEXTURE_2D, null); delete this.__activeTextures2D[i]; } for (let i = 0; i < this.__activeTextures2DArray.length; i++) { if (this.__activeTextures2DArray[i] == null) { continue; } this.__activeTexture(15); this.__gl.bindTexture(this.__gl.TEXTURE_2D_ARRAY, null); delete this.__activeTextures2DArray[i]; } for (let i = 0; i < this.__activeTexturesCube.length; i++) { if (this.__activeTexturesCube[i] == null) { continue; } this.__activeTexture(15); this.__gl.bindTexture(this.__gl.TEXTURE_CUBE_MAP, null); delete this.__activeTexturesCube[i]; } } __getExtension(extension) { const gl = this.__gl; if (!this.__extensions.has(extension)) { const extObj = gl.getExtension(extension.toString()); if (extObj == null && _foundation_core_Config__WEBPACK_IMPORTED_MODULE_2__.Config.cgApiDebugConsoleOutput) { const text = `${extension.toString()} Not Available in this environment`; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.info(text); } this.__extensions.set(extension, extObj); return extObj; } return this.__extensions.get(extension); } __getCompressedTextureExtension(extension) { var _a, _b; const gl = this.__gl; if (!this.__extensions.has(extension)) { const extensionName = extension.toString(); const extObj = (_b = (_a = gl.getExtension(extensionName)) !== null && _a !== void 0 ? _a : gl.getExtension('MOZ_' + extensionName)) !== null && _b !== void 0 ? _b : gl.getExtension('WEBKIT_' + extensionName); if (extObj == null && _foundation_core_Config__WEBPACK_IMPORTED_MODULE_2__.Config.cgApiDebugConsoleOutput) { const text = `${extension.toString()} Not Available in this environment`; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_3__.Logger.info(text); } else { this.__extensions.set(extension, extObj); } return extObj; } return this.__extensions.get(extension); } setViewport(left, top, width, height) { const gl = this.__gl; if (this.__viewport_width !== width || this.__viewport_height !== height || this.__viewport_left !== left || this.__viewport_top !== top) { gl.viewport(left, top, width, height); this.__viewport_left = left; this.__viewport_top = top; this.__viewport_width = width; this.__viewport_height = height; } } setViewportAsVector4(viewport) { const gl = this.__gl; if (this.__viewport_width !== viewport.z || this.__viewport_height !== viewport.w || this.__viewport_left !== viewport.x || this.__viewport_top !== viewport.y) { gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w); this.__viewport_left = viewport.x; this.__viewport_top = viewport.y; this.__viewport_width = viewport.z; this.__viewport_height = viewport.w; } } __getUniformBufferInfo() { if (!this.isWebGL2) { return; } const gl = this.__gl; const offsetAlignment = gl.getParameter(gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT); const maxBlockSize = gl.getParameter(gl.MAX_UNIFORM_BLOCK_SIZE); __classPrivateFieldSet(this, _WebGLContextWrapper_maxVertexUniformBlocks, gl.getParameter(gl.MAX_VERTEX_UNIFORM_BLOCKS), "f"); __classPrivateFieldSet(this, _WebGLContextWrapper_maxFragmentUniformBlocks, gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_BLOCKS), "f"); __classPrivateFieldSet(this, _WebGLContextWrapper_maxConventionUniformBlocks, Math.min(__classPrivateFieldGet(this, _WebGLContextWrapper_maxVertexUniformBlocks, "f"), __classPrivateFieldGet(this, _WebGLContextWrapper_maxFragmentUniformBlocks, "f")), "f"); __classPrivateFieldSet(this, _WebGLContextWrapper_alignedMaxUniformBlockSize, maxBlockSize - (maxBlockSize % offsetAlignment), "f"); __classPrivateFieldSet(this, _WebGLContextWrapper_uniformBufferOffsetAlignment, offsetAlignment, "f"); __classPrivateFieldSet(this, _WebGLContextWrapper_maxUniformBlockSize, maxBlockSize, "f"); } __getMaxUniformVectors() { const gl = this.getRawContext(); this.__maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); this.__maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); } getMaxConventionUniformBlocks() { return __classPrivateFieldGet(this, _WebGLContextWrapper_maxConventionUniformBlocks, "f"); } getAlignedMaxUniformBlockSize() { return __classPrivateFieldGet(this, _WebGLContextWrapper_alignedMaxUniformBlockSize, "f"); } getMaxVertexUniformVectors() { return this.__maxVertexUniformVectors; } getMaxFragmentUniformVectors() { return this.__maxFragmentUniformVectors; } getWebGLMemoryInfo() { if (this.webgl2ExtGmanWM) { const result = this.webgl2ExtGmanWM.getMemoryInfo(); return result; } return undefined; } isMultiview() { return this.__is_multiview && _foundation_core_Config__WEBPACK_IMPORTED_MODULE_2__.Config.multiViewForWebVR; } } _WebGLContextWrapper_alignedMaxUniformBlockSize = new WeakMap(), _WebGLContextWrapper_maxUniformBlockSize = new WeakMap(), _WebGLContextWrapper_uniformBufferOffsetAlignment = new WeakMap(), _WebGLContextWrapper_maxVertexUniformBlocks = new WeakMap(), _WebGLContextWrapper_maxFragmentUniformBlocks = new WeakMap(), _WebGLContextWrapper_maxConventionUniformBlocks = new WeakMap(); /***/ }), /***/ "./src/webgl/WebGLExtendedTypes.ts": /*!*****************************************!*\ !*** ./src/webgl/WebGLExtendedTypes.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/webgl/WebGLExtension.ts": /*!*************************************!*\ !*** ./src/webgl/WebGLExtension.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGLExtension: () => (/* binding */ WebGLExtension) /* harmony export */ }); /* harmony import */ var _foundation_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/misc/EnumIO */ "./src/foundation/misc/EnumIO.ts"); class WebGLExtensionClass extends _foundation_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__.EnumClass { constructor({ index, str }) { super({ index, str }); } } const VertexArrayObject = new WebGLExtensionClass({ index: 1, str: 'OES_vertex_array_object', }); const TextureFloat = new WebGLExtensionClass({ index: 2, str: 'OES_texture_float', }); const TextureHalfFloat = new WebGLExtensionClass({ index: 3, str: 'OES_texture_half_float', }); const TextureFloatLinear = new WebGLExtensionClass({ index: 4, str: 'OES_texture_float_linear', }); const TextureHalfFloatLinear = new WebGLExtensionClass({ index: 5, str: 'OES_texture_half_float_linear', }); const InstancedArrays = new WebGLExtensionClass({ index: 6, str: 'ANGLE_instanced_arrays', }); const TextureFilterAnisotropic = new WebGLExtensionClass({ index: 7, str: 'EXT_texture_filter_anisotropic', }); const ElementIndexUint = new WebGLExtensionClass({ index: 8, str: 'OES_element_index_uint', }); const ShaderTextureLod = new WebGLExtensionClass({ index: 9, str: 'EXT_shader_texture_lod', }); const ShaderDerivatives = new WebGLExtensionClass({ index: 10, str: 'OES_standard_derivatives', }); const DrawBuffers = new WebGLExtensionClass({ index: 11, str: 'WEBGL_draw_buffers', }); const BlendMinmax = new WebGLExtensionClass({ index: 12, str: 'EXT_blend_minmax', }); const ColorBufferFloatWebGL1 = new WebGLExtensionClass({ index: 13, str: 'WEBGL_color_buffer_float', }); const CompressedTextureAstc = new WebGLExtensionClass({ index: 14, str: 'WEBGL_compressed_texture_astc', }); const CompressedTextureS3tc = new WebGLExtensionClass({ index: 15, str: 'WEBGL_compressed_texture_s3tc', }); const CompressedTexturePvrtc = new WebGLExtensionClass({ index: 16, str: 'WEBGL_compressed_texture_pvrtc', }); const CompressedTextureAtc = new WebGLExtensionClass({ index: 17, str: 'WEBGL_compressed_texture_atc', }); const CompressedTextureEtc = new WebGLExtensionClass({ index: 18, str: 'WEBGL_compressed_texture_etc', }); const CompressedTextureEtc1 = new WebGLExtensionClass({ index: 19, str: 'WEBGL_compressed_texture_etc1', }); const CompressedTextureBptc = new WebGLExtensionClass({ index: 20, str: 'EXT_texture_compression_bptc', }); const GMAN_WEBGL_MEMORY = new WebGLExtensionClass({ index: 21, str: 'GMAN_webgl_memory', }); const ColorBufferFloatWebGL2 = new WebGLExtensionClass({ index: 22, str: 'EXT_color_buffer_float', }); const ColorBufferHalfFloatWebGL2 = new WebGLExtensionClass({ index: 23, str: 'EXT_color_buffer_half_float', }); const OculusMultiview = new WebGLExtensionClass({ index: 24, str: 'OCULUS_multiview', }); const OvrMultiview2 = new WebGLExtensionClass({ index: 25, str: 'OVR_multiview2', }); const ClipControl = new WebGLExtensionClass({ index: 26, str: 'EXT_clip_control', }); const typeList = [ VertexArrayObject, TextureFloat, TextureHalfFloat, TextureFloatLinear, TextureHalfFloatLinear, InstancedArrays, TextureFilterAnisotropic, ElementIndexUint, ShaderTextureLod, ShaderDerivatives, DrawBuffers, BlendMinmax, ColorBufferFloatWebGL1, CompressedTextureAstc, CompressedTextureS3tc, CompressedTexturePvrtc, CompressedTextureAtc, CompressedTextureEtc, CompressedTextureEtc1, CompressedTextureBptc, ColorBufferFloatWebGL2, ColorBufferHalfFloatWebGL2, OculusMultiview, OvrMultiview2, GMAN_WEBGL_MEMORY, ClipControl, ]; function from({ index }) { return (0,_foundation_misc_EnumIO__WEBPACK_IMPORTED_MODULE_0__._from)({ typeList, index }); } const WebGLExtension = Object.freeze({ VertexArrayObject, TextureFloat, TextureHalfFloat, TextureFloatLinear, TextureHalfFloatLinear, InstancedArrays, TextureFilterAnisotropic, ElementIndexUint, ShaderTextureLod, ShaderDerivatives, DrawBuffers, BlendMinmax, ColorBufferFloatWebGL1, CompressedTextureAstc, CompressedTextureS3tc, CompressedTexturePvrtc, CompressedTextureAtc, CompressedTextureEtc, CompressedTextureEtc1, CompressedTextureBptc, ColorBufferFloatWebGL2, ColorBufferHalfFloatWebGL2, OculusMultiview, OvrMultiview2, GMAN_WEBGL_MEMORY, ClipControl, }); /***/ }), /***/ "./src/webgl/WebGLResourceRepository.ts": /*!**********************************************!*\ !*** ./src/webgl/WebGLResourceRepository.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGLResourceRepository: () => (/* binding */ WebGLResourceRepository) /* harmony export */ }); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _WebGLContextWrapper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./WebGLContextWrapper */ "./src/webgl/WebGLContextWrapper.ts"); /* harmony import */ var _foundation_textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/textures/RenderTargetTexture */ "./src/foundation/textures/RenderTargetTexture.ts"); /* harmony import */ var _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/definitions/HdriFormat */ "./src/foundation/definitions/HdriFormat.ts"); /* harmony import */ var _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _foundation_definitions_RenderBufferTarget__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/definitions/RenderBufferTarget */ "./src/foundation/definitions/RenderBufferTarget.ts"); /* harmony import */ var _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _foundation_misc_DataUtil__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../foundation/misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../foundation/definitions/BasisCompressionType */ "./src/foundation/definitions/BasisCompressionType.ts"); /* harmony import */ var _WebGLExtension__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./WebGLExtension */ "./src/webgl/WebGLExtension.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _getRenderingStrategy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./getRenderingStrategy */ "./src/webgl/getRenderingStrategy.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _types_WebGLConstants__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../types/WebGLConstants */ "./src/types/WebGLConstants.ts"); /* harmony import */ var _foundation_textures_Sampler__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../foundation/textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _WebGLStereoUtil__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./WebGLStereoUtil */ "./src/webgl/WebGLStereoUtil.ts"); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../foundation/definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); const HDRImage = __webpack_require__(/*! ../../vendor/hdrpng.min.js */ "./vendor/hdrpng.min.js"); class WebGLResourceRepository extends _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository { constructor() { super(); this.__webglContexts = new Map(); this.__resourceCounter = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__webglResources = new Map(); this.__samplerClampToEdgeLinearUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__samplerClampToEdgeNearestUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__samplerRepeatNearestUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__samplerRepeatLinearUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__samplerShadowUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__samplerRepeatTriLinearUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__samplerRepeatAnisotropyLinearUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; } static getInstance() { if (!this.__instance) { this.__instance = new WebGLResourceRepository(); } return this.__instance; } addWebGLContext(gl, canvas, asCurrent) { const glw = new _WebGLContextWrapper__WEBPACK_IMPORTED_MODULE_6__.WebGLContextWrapper(gl, canvas); this.__webglContexts.set('default', glw); if (asCurrent) { this.__glw = glw; } } generateWebGLContext(canvas, asCurrent, webglOption) { const gl = canvas.getContext('webgl2', webglOption); this.addWebGLContext(gl, canvas, asCurrent); if (_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.MiscUtil.isSafari()) { // Safari (WebGL2 via Metal) does't support UBO properly at 2022/04/15 _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.isUboEnabled = false; } return gl; } get currentWebGLContextWrapper() { return this.__glw; } getResourceNumber() { return ++this.__resourceCounter; } __registerResource(obj) { const handle = this.getResourceNumber(); obj._resourceUid = handle; this.__webglResources.set(handle, obj); return handle; } getWebGLResource(WebGLResourceHandle) { const result = this.__webglResources.get(WebGLResourceHandle); return result !== null && result !== void 0 ? result : null; } createIndexBuffer(accessor) { const gl = this.__glw.getRawContext(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } this.__glw.bindVertexArray(null); const ibo = gl.createBuffer(); const resourceHandle = this.__registerResource(ibo); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo); // gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, accessor.bufferView.buffer.getArrayBuffer(), gl.STATIC_DRAW); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, accessor.getTypedArray(), gl.STATIC_DRAW); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); return resourceHandle; } updateIndexBuffer(accessor, resourceHandle) { const glw = this.__glw; const gl = glw === null || glw === void 0 ? void 0 : glw.getRawContext(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(gl)) { throw new Error('No WebGLRenderingContext set as Default.'); } const ibo = this.__webglResources.get(resourceHandle); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(ibo)) { throw new Error('Not found IBO.'); } glw.bindVertexArray(null); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo); gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, accessor.getTypedArray()); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); } createVertexBuffer(accessor) { const gl = this.__glw.getRawContext(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } this.__glw.bindVertexArray(null); const vbo = gl.createBuffer(); const resourceHandle = this.__registerResource(vbo); gl.bindBuffer(gl.ARRAY_BUFFER, vbo); gl.bufferData(gl.ARRAY_BUFFER, accessor.getUint8Array(), gl.STATIC_DRAW); // gl.bufferData(gl.ARRAY_BUFFER, accessor.getTypedArray(), gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, null); return resourceHandle; } createVertexBufferFromTypedArray(typedArray) { const gl = this.__glw.getRawContext(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } this.__glw.bindVertexArray(null); const vbo = gl.createBuffer(); const resourceHandle = this.__registerResource(vbo); gl.bindBuffer(gl.ARRAY_BUFFER, vbo); gl.bufferData(gl.ARRAY_BUFFER, typedArray, gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, null); return resourceHandle; } updateVertexBuffer(accessor, resourceHandle) { const glw = this.__glw; const gl = glw === null || glw === void 0 ? void 0 : glw.getRawContext(); if (!_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(gl)) { throw new Error('No WebGLRenderingContext set as Default.'); } const vbo = this.__webglResources.get(resourceHandle); if (!_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(vbo)) { throw new Error('Not found VBO.'); } glw.bindVertexArray(null); gl.bindBuffer(gl.ARRAY_BUFFER, vbo); gl.bufferSubData(gl.ARRAY_BUFFER, 0, accessor.bufferView.getUint8Array()); gl.bindBuffer(gl.ARRAY_BUFFER, null); } createVertexArray() { const gl = this.__glw; if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } const vao = this.__glw.createVertexArray(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(vao)) { return undefined; } const resourceHandle = this.__registerResource(vao); return resourceHandle; } /** * bind the Texture2D * @param textureSlotIndex * @param textureUid */ bindTexture2D(textureSlotIndex, textureUid) { const texture = this.getWebGLResource(textureUid); this.__glw.bindTexture2D(textureSlotIndex, texture); } /** * bind the Sampler * @param textureSlotIndex * @param samplerUid */ bindTextureSampler(textureSlotIndex, samplerUid) { if (samplerUid === -1) { this.__glw.bindTextureSampler(textureSlotIndex, null); } else { const sampler = this.getWebGLResource(samplerUid); this.__glw.bindTextureSampler(textureSlotIndex, sampler); } } /** * bind the TextureCube * @param textureSlotIndex * @param textureUid */ bindTextureCube(textureSlotIndex, textureUid) { const texture = this.getWebGLResource(textureUid); this.__glw.bindTextureCube(textureSlotIndex, texture); } /** * create a VertexBuffer and IndexBuffer * @param primitive * @returns */ createVertexBufferAndIndexBuffer(primitive) { let iboHandle; if (primitive.hasIndices()) { iboHandle = this.createIndexBuffer(primitive.indicesAccessor); } const attributesFlags = []; for (let i = 0; i < _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.AttributeTypeNumber; i++) { attributesFlags[i] = false; } const vboHandles = []; primitive.attributeAccessors.forEach((accessor, i) => { const vboHandle = this.createVertexBuffer(accessor); const slotIdx = _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.toAttributeSlotFromJoinedString(primitive.attributeSemantics[i]); attributesFlags[slotIdx] = true; vboHandles.push(vboHandle); }); return { vaoHandle: -1, iboHandle: iboHandle, vboHandles: vboHandles, attributesFlags: attributesFlags, setComplete: false, }; } /** * update the VertexBuffer and IndexBuffer * @param primitive * @param vertexHandles */ updateVertexBufferAndIndexBuffer(primitive, vertexHandles) { if (vertexHandles.iboHandle) { this.updateIndexBuffer(primitive.indicesAccessor, vertexHandles.iboHandle); } const attributeAccessors = primitive.attributeAccessors; for (let i = 0; i < attributeAccessors.length; i++) { this.updateVertexBuffer(attributeAccessors[i], vertexHandles.vboHandles[i]); } } /** * create a shader program * @returns a object which has shader modules */ createShaderProgram({ material, vertexShaderStr, fragmentShaderStr, attributeNames, attributeSemantics, onError, }) { const gl = this.__glw.getRawContext(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } const isDebugMode = _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.cgApiDebugConsoleOutput; const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderStr); gl.compileShader(vertexShader); if (isDebugMode) { const result = this.__checkShaderCompileStatus(material.materialTypeName, vertexShader, vertexShaderStr, onError); if (!result) { return _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; } } const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentShaderStr); gl.compileShader(fragmentShader); if (isDebugMode) { this.__checkShaderCompileStatus(material.materialTypeName, fragmentShader, fragmentShaderStr, onError); } const shaderProgram = gl.createProgram(); shaderProgram._gl = gl; shaderProgram._materialTypeName = material.materialTypeName; shaderProgram._vertexShaderStr = vertexShaderStr; shaderProgram._fragmentShaderStr = fragmentShaderStr; shaderProgram._shaderSemanticsInfoMap = new Map(); shaderProgram._material = new WeakRef(material); gl.attachShader(shaderProgram, vertexShader); gl.attachShader(shaderProgram, fragmentShader); attributeNames.forEach((attributeName, i) => { gl.bindAttribLocation(shaderProgram, attributeSemantics[i].getAttributeSlot(), attributeName); }); gl.linkProgram(shaderProgram); if (isDebugMode) { const result = this.__checkShaderProgramLinkStatus(material.materialTypeName, shaderProgram, vertexShaderStr, fragmentShaderStr); if (!result) { return _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid; } } shaderProgram.__SPECTOR_rebuildProgram = this.rebuildProgramBySpector.bind(shaderProgram); const resourceHandle = this.__registerResource(shaderProgram); gl.deleteShader(vertexShader); gl.deleteShader(fragmentShader); return resourceHandle; } __checkShaderCompileStatus(materialTypeName, shader, shaderText, onError) { const glw = this.__glw; const gl = glw.getRawContext(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.false(gl.getShaderParameter(shader, gl.COMPILE_STATUS)) && _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.false(gl.isContextLost())) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info('MaterialTypeName: ' + materialTypeName); const lineNumberedShaderText = _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.MiscUtil.addLineNumberToCode(shaderText); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(lineNumberedShaderText); const log = gl.getShaderInfoLog(shader); if (onError === undefined) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error('An error occurred compiling the shaders:' + log); return false; } else { onError(log); return false; } } return true; } __checkShaderProgramLinkStatus(materialTypeName, shaderProgram, vertexShaderText, fragmentShaderText) { const glw = this.__glw; const gl = glw.getRawContext(); // If creating the shader program failed, alert if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.false(gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) && _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.false(gl.isContextLost())) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info('MaterialTypeName: ' + materialTypeName); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.MiscUtil.addLineNumberToCode('Vertex Shader:')); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.MiscUtil.addLineNumberToCode(vertexShaderText)); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.MiscUtil.addLineNumberToCode('Fragment Shader:')); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_11__.MiscUtil.addLineNumberToCode(fragmentShaderText)); const log = gl.getProgramInfoLog(shaderProgram); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error('Unable to initialize the shader program: ' + log); return false; } return true; } /** * setup the uniform locations * @param shaderProgramUid * @param infoArray * @param isUniformOnlyMode * @returns */ setupUniformLocations(shaderProgramUid, infoArray, isUniformOnlyMode) { const glw = this.__glw; const gl = glw.getRawContext(); const shaderProgram = this.getWebGLResource(shaderProgramUid); const infoArrayLen = infoArray.length; for (let i = 0; i < infoArrayLen; i++) { const info = infoArray[i]; shaderProgram._shaderSemanticsInfoMap.set(info.semantic, info); } for (let i = 0; i < infoArrayLen; i++) { const info = infoArray[i]; const isUniformExist = isUniformOnlyMode || info.needUniformInDataTextureMode || _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.isTexture(info.compositionType); if (isUniformExist) { const semanticSingular = info.semantic; const identifier = semanticSingular; const shaderVarName = 'u_' + info.semantic; const location = gl.getUniformLocation(shaderProgram, shaderVarName); const _shaderProgram = shaderProgram; _shaderProgram[identifier] = location; if (location == null && _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.cgApiDebugConsoleOutput) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(`Can not get the uniform location: ${shaderVarName}. The uniform may be unused by other code so implicitly removed.`); } } } return shaderProgram; } setupBasicUniformLocations(shaderProgramUid) { const shaderProgram = this.getWebGLResource(shaderProgramUid); const gl = this.currentWebGLContextWrapper.getRawContext(); shaderProgram.dataTexture = gl.getUniformLocation(shaderProgram, 'u_dataTexture'); shaderProgram.isMainVr = gl.getUniformLocation(shaderProgram, 'u_isMainVr'); shaderProgram.currentComponentSIDs = gl.getUniformLocation(shaderProgram, 'u_currentComponentSIDs'); } setUniform1iForTexture(shaderProgram_, semanticStr, value) { const shaderProgram = shaderProgram_; const info = shaderProgram._shaderSemanticsInfoMap.get(semanticStr); if (info == null) { return; } const gl = this.__glw.getRawContext(); const loc = shaderProgram[semanticStr]; gl.uniform1i(loc, value[0]); this.bindTexture(info, value); } /** * set an uniform value */ setUniformValue(shaderProgram_, semanticStr, firstTime, value) { const shaderProgram = shaderProgram_; const info = shaderProgram._shaderSemanticsInfoMap.get(semanticStr); if (info == null) { return false; } let setAsMatrix = false; let componentNumber = 0; if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Mat3) { setAsMatrix = true; componentNumber = 3; } else if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Mat4) { setAsMatrix = true; componentNumber = 4; } else { componentNumber = info.compositionType.getNumberOfComponents(); } const isCompositionTypeArray = info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.ScalarArray || info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec4Array || info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec3Array || info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec2Array; const isCompositionTypeTexture = _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.isTexture(info.compositionType); const key = semanticStr; let updated = false; if (isCompositionTypeTexture) { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, false, { x: value[0] }); this.bindTexture(info, value); } else if (isCompositionTypeArray) { if (value._v == null) { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, true, { x: value }); } else { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, true, { x: value._v }); } } else if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Scalar) { if (value._v == null) { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, false, { x: value }); } else { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, true, { x: value._v }); } } else { // if CompositionType.Vec*|Mat*, then... if (value._v == null) { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, false, value); } else { updated = this.setUniformValueInner(shaderProgram_, key, info, setAsMatrix, componentNumber, true, { x: value._v }); } } return updated; } /** * bind the texture * @param info * @param value */ bindTexture(info, value) { var _a, _b; if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Texture2D || info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Texture2DShadow) { this.bindTexture2D(value[0], value[1]._textureResourceUid); if (value[2] != null) { // value[2] must be Sampler object this.bindTextureSampler(value[0], value[2]._samplerResourceUid); // } else { // this.bindTextureSampler(value[0], -1); // } } else { if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Texture2D) { const samplerUid = this.createOrGetTextureSamplerClampToEdgeLinear(); this.bindTextureSampler(value[0], samplerUid); } else if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Texture2DShadow) { const samplerUid = this.createOrGetTextureSamplerShadow(); this.bindTextureSampler(value[0], samplerUid); } } } else if (info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.TextureCube) { this.bindTextureCube(value[0], value[1]._textureResourceUid); if (value[2] != null) { // value[2] must be Sampler object this.bindTextureSampler(value[0], value[2]._samplerResourceUid); } else { // this.bindTextureSampler(value[0], -1); const textureCube = value[1]; // const samplerUid = this.createOrGetTextureSamplerRepeatTriLinear(); this.bindTextureSampler(value[0], (_b = (_a = textureCube._recommendedTextureSampler) === null || _a === void 0 ? void 0 : _a._samplerResourceUid) !== null && _b !== void 0 ? _b : -1); } } } /** * set the uniform value * @param shaderProgram * @param semanticStr * @param info * @param isMatrix * @param componentNumber * @param isVector * @param param6 * @param index * @returns */ setUniformValueInner(shaderProgram, semanticStr, info, isMatrix, componentNumber, isVector, { x, y, z, w, }) { const identifier = semanticStr; const loc = shaderProgram[identifier]; if (loc == null) { return false; } const uLocation = loc; const gl = this.__glw.getRawContext(); if (isMatrix) { if (componentNumber === 4) { gl.uniformMatrix4fv(uLocation, false, x); } else { gl.uniformMatrix3fv(uLocation, false, x); } } else if (isVector) { const componentType = info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int || info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Short || info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Byte; if (componentNumber === 1) { if (componentType) { gl.uniform1iv(uLocation, x); } else { gl.uniform1fv(uLocation, x); } } else if (componentNumber === 2) { if (componentType) { gl.uniform2iv(uLocation, x); } else { gl.uniform2fv(uLocation, x); } } else if (componentNumber === 3) { if (componentType) { gl.uniform3iv(uLocation, x); } else { gl.uniform3fv(uLocation, x); } } else if (componentNumber === 4) { if (componentType) { gl.uniform4iv(uLocation, x); } else { gl.uniform4fv(uLocation, x); } } } else { const componentType = info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Int || info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Short || info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Byte; if (componentNumber === 1) { if (componentType) { gl.uniform1i(uLocation, x); } else { gl.uniform1f(uLocation, x); } } else if (componentNumber === 2) { if (componentType) { gl.uniform2i(uLocation, x, y); } else { gl.uniform2f(uLocation, x, y); } } else if (componentNumber === 3) { if (componentType) { gl.uniform3i(uLocation, x, y, z); } else { gl.uniform3f(uLocation, x, y, z); } } else if (componentNumber === 4) { if (componentType) { gl.uniform4i(uLocation, x, y, z, w); } else { gl.uniform4f(uLocation, x, y, z, w); } } } return true; } /** * set the VertexData to the Pipeline */ setVertexDataToPipeline({ vaoHandle, iboHandle, vboHandles, }, primitive, instanceIDBufferUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContext(); const vao = this.getWebGLResource(vaoHandle); // VAO bind this.__glw.bindVertexArray(vao); // IBO bind if (iboHandle != null) { const ibo = this.getWebGLResource(iboHandle); if (ibo != null) { gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo); } else { throw new Error('Nothing Element Array Buffer!'); } } // bind vertex attributes to VBO's vboHandles.forEach((vboHandle, i) => { const vbo = this.getWebGLResource(vboHandle); if (vbo != null) { gl.bindBuffer(gl.ARRAY_BUFFER, vbo); } else { throw new Error('Nothing Element Array Buffer at index ' + i); } gl.enableVertexAttribArray(_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.toAttributeSlotFromJoinedString(primitive.attributeSemantics[i])); gl.vertexAttribPointer(_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.toAttributeSlotFromJoinedString(primitive.attributeSemantics[i]), primitive.attributeCompositionTypes[i].getNumberOfComponents(), primitive.attributeComponentTypes[i].index, primitive.attributeAccessors[i].normalized, primitive.attributeAccessors[i].byteStride, 0); }); /// for InstanceIDBuffer if (instanceIDBufferUid !== _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const instanceIDBuffer = this.getWebGLResource(instanceIDBufferUid); if (instanceIDBuffer != null) { gl.bindBuffer(gl.ARRAY_BUFFER, instanceIDBuffer); } else { throw new Error('Nothing Element Array Buffer at index'); } gl.enableVertexAttribArray(_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Instance.getAttributeSlot()); gl.vertexAttribPointer(_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Instance.getAttributeSlot(), _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_4__.CompositionType.Vec4.getNumberOfComponents(), _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.Float.index, false, 0, 0); this.__glw.vertexAttribDivisor(_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.Instance.getAttributeSlot(), 1); } gl.bindBuffer(gl.ARRAY_BUFFER, null); this.__glw.bindVertexArray(null); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); } /** * create a TexStorage2D * @param data * @param param1 * @returns */ createTexStorage2D({ levels, internalFormat, width, height, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); this.__glw.bindTexture2D(15, texture); gl.texStorage2D(_types_WebGLConstants__WEBPACK_IMPORTED_MODULE_18__.GL_TEXTURE_2D, levels, internalFormat.index, width, height); const resourceHandle = this.__registerResource(texture); this.__glw.unbindTexture2D(15); return resourceHandle; } createTextureSampler({ magFilter, minFilter, wrapS, wrapT, wrapR, anisotropy, isPremultipliedAlpha, shadowCompareMode, }) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, minFilter.index); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, magFilter.index); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, wrapS.index); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, wrapT.index); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, wrapR.index); if (shadowCompareMode) { gl.samplerParameteri(sampler, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); gl.samplerParameteri(sampler, gl.TEXTURE_COMPARE_FUNC, gl.LESS); } if (anisotropy) { if (this.__glw.webgl2ExtTFA) { gl.samplerParameteri(sampler, this.__glw.webgl2ExtTFA.TEXTURE_MAX_ANISOTROPY_EXT, 4); } } return resourceHandle; } createOrGetTextureSamplerClampToEdgeLinear() { if (this.__samplerClampToEdgeLinearUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerClampToEdgeLinearUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE); } return this.__samplerClampToEdgeLinearUid; } createOrGetTextureSamplerClampToEdgeNearest() { if (this.__samplerClampToEdgeNearestUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerClampToEdgeNearestUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE); } return this.__samplerClampToEdgeNearestUid; } createOrGetTextureSamplerRepeatNearest() { if (this.__samplerRepeatNearestUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerRepeatNearestUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, gl.REPEAT); } return this.__samplerRepeatNearestUid; } createOrGetTextureSamplerRepeatLinear() { if (this.__samplerRepeatLinearUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerRepeatLinearUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, gl.REPEAT); } return this.__samplerRepeatLinearUid; } createOrGetTextureSamplerRepeatTriLinear() { if (this.__samplerRepeatTriLinearUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerRepeatTriLinearUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, gl.REPEAT); } return this.__samplerRepeatTriLinearUid; } createOrGetTextureSamplerShadow() { if (this.__samplerShadowUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerShadowUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.samplerParameteri(sampler, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); gl.samplerParameteri(sampler, gl.TEXTURE_COMPARE_FUNC, gl.LESS); } return this.__samplerShadowUid; } createOrGetTextureSamplerRepeatAnisotropyLinear() { if (this.__samplerRepeatAnisotropyLinearUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const gl = this.__glw.getRawContextAsWebGL2(); const sampler = gl.createSampler(); const resourceHandle = this.__registerResource(sampler); this.__samplerRepeatAnisotropyLinearUid = resourceHandle; gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, gl.REPEAT); gl.samplerParameteri(sampler, this.__glw.webgl2ExtTFA.TEXTURE_MAX_ANISOTROPY_EXT, 4); } return this.__samplerRepeatAnisotropyLinearUid; } /** * create a Texture * @param imageData * @param param1 * @returns */ createTextureFromImageBitmapData(imageData, { level, internalFormat, width, height, border, format, type, generateMipmap, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const textureHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); const levels = Math.floor(Math.log2(Math.max(width, height))) + 1; gl.texStorage2D(_types_WebGLConstants__WEBPACK_IMPORTED_MODULE_18__.GL_TEXTURE_2D, levels, internalFormat.index, width, height); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, format.index, type.index, imageData); this.__createTextureInner(gl, width, height, generateMipmap); return textureHandle; } __createTextureInner(gl, width, height, generateMipmap) { // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS.index); // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT.index); // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter.index); // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter.index); // if (isPremultipliedAlpha) { // // gl.texParameteri(gl.TEXTURE_2D, gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false); // } else { // // gl.texParameteri(gl.TEXTURE_2D, gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); // } // if (MathUtil.isPowerOfTwoTexture(width, height)) { // if (anisotropy) { // if (this.__glw!.webgl2ExtTFA) { // gl.texParameteri(gl.TEXTURE_2D, this.__glw!.webgl2ExtTFA!.TEXTURE_MAX_ANISOTROPY_EXT, 4); // } // } gl.generateMipmap(gl.TEXTURE_2D); this.__glw.unbindTexture2D(15); } /** * create a Texture * @param imageData * @param param1 * @returns */ async createTextureFromHTMLImageElement(imageData, { level, internalFormat, width, height, border, format, type, generateMipmap, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); const levels = generateMipmap ? Math.max(Math.log2(width), Math.log2(height)) : 1; gl.texStorage2D(_types_WebGLConstants__WEBPACK_IMPORTED_MODULE_18__.GL_TEXTURE_2D, levels, internalFormat.index, width, height); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, format.index, type.index, imageData); this.__createTextureInner(gl, width, height, generateMipmap); return resourceHandle; } /** * allocate a Texture * @param format - the internal format of the texture * @param width - the width of the texture * @param height - the height of the texture * @param mipmapCount - the number of mipmap levels * @returns the handle of the texture */ allocateTexture({ format, width, height, mipLevelCount, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); gl.texStorage2D(_types_WebGLConstants__WEBPACK_IMPORTED_MODULE_18__.GL_TEXTURE_2D, mipLevelCount, format.index, width, height); this.__glw.unbindTexture2D(15); return resourceHandle; } /** * Load an image to a specific mip level of a texture * @param mipLevel - the mip level to load the image to * @param textureUid - the handle of the texture * @param format - the format of the image * @param type - the type of the data * @param xOffset - the x offset of copy region * @param yOffset - the y offset of copy region * @param width - the width of the image * @param height - the height of the image * @param data - the typedarray data of the image */ loadImageToMipLevelOfTexture2D({ mipLevel, textureUid, format, type, xOffset, yOffset, width, height, rowSizeByPixel, data, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = this.getWebGLResource(textureUid); const pixelFormat = _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_23__.TextureFormat.getPixelFormatFromTextureFormat(format); const compositionNum = _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.getCompositionNumFromPixelFormat(pixelFormat); const reducedData = new data.constructor(width * height * compositionNum); for (let y = 0; y < height; y++) { const srcOffset = y * rowSizeByPixel * compositionNum; const destOffset = y * width * compositionNum; for (let x = 0; x < width; x++) { reducedData.set(data.subarray(srcOffset + x * compositionNum, srcOffset + (x + 1) * compositionNum), destOffset + x * compositionNum); } } this.__glw.bindTexture2D(15, texture); gl.texSubImage2D(gl.TEXTURE_2D, mipLevel, xOffset, yOffset, width, height, pixelFormat.index, type.index, reducedData); this.__glw.unbindTexture2D(15); } /** * create a Texture from TypedArray * @param imageData * @param param1 * @returns */ createTextureFromTypedArray(imageData, { level, internalFormat, width, height, border, format, type, generateMipmap, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); const levels = generateMipmap ? Math.max(Math.log2(width), Math.log2(height)) : 1; gl.texStorage2D(_types_WebGLConstants__WEBPACK_IMPORTED_MODULE_18__.GL_TEXTURE_2D, levels, internalFormat.index, width, height); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, format.index, type.index, imageData); this.__createTextureInner(gl, width, height, generateMipmap); return resourceHandle; } /** * Create and bind compressed texture object * @param textureDataArray transcoded texture data for each mipmaps(levels) * @param compressionTextureType */ createCompressedTexture(textureDataArray, compressionTextureType) { const gl = this.__glw.getRawContext(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); const internalFormat = compressionTextureType.index; for (const textureData of textureDataArray) { gl.compressedTexImage2D(gl.TEXTURE_2D, textureData.level, internalFormat, textureData.width, textureData.height, 0, textureData.buffer); } this.__glw.unbindTexture2D(15); return resourceHandle; } /** * create CompressedTextureFromBasis * @param basisFile * @param param1 * @returns */ createCompressedTextureFromBasis(basisFile, { border, format, type, }) { let basisCompressionType; let compressionType; const gl = this.__glw.getRawContext(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc'); if (s3tc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.BC3; compressionType = s3tc.COMPRESSED_RGBA_S3TC_DXT5_EXT; } const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1'); if (etc1) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ETC1; compressionType = etc1.COMPRESSED_RGB_ETC1_WEBGL; } const atc = gl.getExtension('WEBGL_compressed_texture_atc'); if (atc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ATC_RGBA; compressionType = atc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL; } const etc2 = gl.getExtension('WEBGL_compressed_texture_etc'); if (etc2) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ETC2; compressionType = etc2.COMPRESSED_RGBA8_ETC2_EAC; } const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'); if (pvrtc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.PVRTC1_RGBA; compressionType = pvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; } const astc = gl.getExtension('WEBGL_compressed_texture_astc'); if (astc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ASTC; compressionType = astc.COMPRESSED_RGBA_ASTC_4x4_KHR; } const mipmapDepth = basisFile.getNumLevels(0); for (let i = 0; i < mipmapDepth; i++) { const width = basisFile.getImageWidth(0, i); const height = basisFile.getImageHeight(0, i); const textureSource = this.decodeBasisImage(basisFile, basisCompressionType, 0, i); gl.compressedTexImage2D(gl.TEXTURE_2D, i, compressionType, width, height, border, textureSource); } this.__glw.unbindTexture2D(15); return resourceHandle; } /** * decode the BasisImage * @param basisFile * @param basisCompressionType * @param imageIndex * @param levelIndex * @returns */ decodeBasisImage(basisFile, basisCompressionType, imageIndex, levelIndex) { const extractSize = basisFile.getImageTranscodedSizeInBytes(imageIndex, levelIndex, basisCompressionType.index); const textureSource = new Uint8Array(extractSize); if (!basisFile.transcodeImage(textureSource, imageIndex, levelIndex, basisCompressionType.index, 0, 0)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error('failed to transcode the image.'); } return textureSource; } /** * create a FrameBufferObject * @returns */ createFrameBufferObject() { const gl = this.__glw.getRawContext(); const fbo = gl.createFramebuffer(); const resourceHandle = this.__registerResource(fbo); return resourceHandle; } /** * attach the ColorBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a ColorBuffer */ attachColorBufferToFrameBufferObject(framebuffer, index, renderable) { const gl = this.__glw.getRawContextAsWebGL2(); const fbo = this.getWebGLResource(framebuffer.framebufferUID); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); const renderableWebGLResource = this.getWebGLResource(renderable._textureResourceUid); const attachmentId = this.__glw.colorAttachment(index); if (renderable instanceof _foundation_textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_7__.RenderTargetTexture && renderable.arrayLength > 0) { // It's must be TextureArray for MultiView VR Rendering renderable._fbo = framebuffer; if (this.__glw.webgl2ExtMLTVIEW.is_multisample) { this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultisampleMultiviewOVR(gl.DRAW_FRAMEBUFFER, attachmentId, renderableWebGLResource, 0, 4, // sample count 0, renderable.arrayLength); } else { this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultiviewOVR(gl.DRAW_FRAMEBUFFER, attachmentId, renderableWebGLResource, 0, 0, renderable.arrayLength); } } else if (renderable instanceof _foundation_textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_7__.RenderTargetTexture && renderable.arrayLength === 0) { renderable._fbo = framebuffer; gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentId, gl.TEXTURE_2D, renderableWebGLResource, 0); } else { // It's must be RenderBuffer renderable._fbo = framebuffer; gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachmentId, gl.RENDERBUFFER, renderableWebGLResource); } gl.bindFramebuffer(gl.FRAMEBUFFER, null); } /** * attach the ColorBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param attachmentIndex a attachment index * @param faceIndex a face index * @param mipLevel a mip level * @param renderable a ColorBuffer */ attachColorBufferCubeToFrameBufferObject(framebuffer, attachmentIndex, faceIndex, mipLevel, renderable) { const gl = this.__glw.getRawContextAsWebGL2(); const fbo = this.getWebGLResource(framebuffer.framebufferUID); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); const renderableWebGLResource = this.getWebGLResource(renderable._textureResourceUid); const attachmentId = this.__glw.colorAttachment(attachmentIndex); renderable._fbo = framebuffer; gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentId, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, renderableWebGLResource, mipLevel); gl.bindFramebuffer(gl.FRAMEBUFFER, null); } /** * attach the DepthBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a DepthBuffer */ attachDepthBufferToFrameBufferObject(framebuffer, renderable) { this.__attachDepthOrStencilBufferToFrameBufferObject(framebuffer, renderable, 36096); // gl.DEPTH_ATTACHMENT } /** * attach the StencilBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a StencilBuffer */ attachStencilBufferToFrameBufferObject(framebuffer, renderable) { this.__attachDepthOrStencilBufferToFrameBufferObject(framebuffer, renderable, 36128); // gl.STENCIL_ATTACHMENT } /** * attach the depthStencilBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a depthStencilBuffer */ attachDepthStencilBufferToFrameBufferObject(framebuffer, renderable) { this.__attachDepthOrStencilBufferToFrameBufferObject(framebuffer, renderable, 33306); // gl.DEPTH_STENCIL_ATTACHMENT } __attachDepthOrStencilBufferToFrameBufferObject(framebuffer, renderable, attachmentType) { const gl = this.__glw.getRawContextAsWebGL2(); const fbo = this.getWebGLResource(framebuffer.framebufferUID); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); const renderableWebGLResource = this.getWebGLResource(renderable._textureResourceUid); if (renderable instanceof _foundation_textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_7__.RenderTargetTexture && renderable.arrayLength > 0) { // It's must be TextureArray for MultiView VR Rendering renderable._fbo = framebuffer; if (this.__glw.webgl2ExtMLTVIEW.is_multisample) { this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultisampleMultiviewOVR(gl.DRAW_FRAMEBUFFER, attachmentType, renderableWebGLResource, 0, 4, // sample count 0, renderable.arrayLength); } else { this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultiviewOVR(gl.DRAW_FRAMEBUFFER, attachmentType, renderableWebGLResource, 0, 0, renderable.arrayLength); } } else if (renderable instanceof _foundation_textures_RenderTargetTexture__WEBPACK_IMPORTED_MODULE_7__.RenderTargetTexture && renderable.arrayLength === 0) { renderable._fbo = framebuffer; gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentType, gl.TEXTURE_2D, renderableWebGLResource, 0); } else { // It's must be RenderBuffer renderable._fbo = framebuffer; gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachmentType, gl.RENDERBUFFER, renderableWebGLResource); } gl.bindFramebuffer(gl.FRAMEBUFFER, null); } /** * create Renderbuffer */ createRenderBuffer(width, height, internalFormat, isMSAA, sampleCountMSAA) { const gl = this.__glw.getRawContext(); const renderBuffer = gl.createRenderbuffer(); const resourceHandle = this.__registerResource(renderBuffer); gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer); if (isMSAA) { gl.renderbufferStorageMultisample(gl.RENDERBUFFER, sampleCountMSAA, gl[internalFormat.str], width, height); } else { gl.renderbufferStorage(gl.RENDERBUFFER, gl[internalFormat.str], width, height); } gl.bindRenderbuffer(gl.RENDERBUFFER, null); return resourceHandle; } /** * set drawTargets * @param framebuffer */ setDrawTargets(renderPass) { const framebuffer = renderPass.getFramebuffer(); if (framebuffer) { const renderBufferTargetEnums = renderPass.getRenderTargetColorAttachments(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(renderBufferTargetEnums)) { this.__glw.drawBuffers(renderBufferTargetEnums); } else { this.__glw.drawBuffers(framebuffer.colorAttachmentsRenderBufferTargets); } } else { this.__glw.drawBuffers([_foundation_definitions_RenderBufferTarget__WEBPACK_IMPORTED_MODULE_10__.RenderBufferTarget.Back]); } } /** * bind Framebuffer * @param framebuffer */ bindFramebuffer(framebuffer) { const gl = this.__glw.getRawContext(); if (framebuffer) { const fboUid = framebuffer.cgApiResourceUid; const fbo = this.getWebGLResource(fboUid); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); } else { gl.bindFramebuffer(gl.FRAMEBUFFER, null); } } /** * unbind Framebuffer */ unbindFramebuffer() { const gl = this.__glw.getRawContext(); gl.bindFramebuffer(gl.FRAMEBUFFER, null); } /** * create a RenderTargetTexture * @param param0 * @returns */ createRenderTargetTexture({ width, height, mipLevelCount, format, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2D(15, texture); gl.texStorage2D(gl.TEXTURE_2D, mipLevelCount, format.index, width, height); this.__glw.unbindTexture2D(15); return resourceHandle; } /** * create a RenderTargetTextureArray * @param param0 * @returns */ createRenderTargetTextureArray({ width, height, level, internalFormat, format, type, arrayLength, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTexture2DArray(15, texture); gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, internalFormat.index, width, height, arrayLength); return resourceHandle; } /** * create a RenderTargetTextureCube * @param param0 * @returns */ createRenderTargetTextureCube({ width, height, mipLevelCount, format, }) { const gl = this.__glw.getRawContextAsWebGL2(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTextureCube(15, texture); gl.texStorage2D(gl.TEXTURE_CUBE_MAP, mipLevelCount, format.index, width, height); this.__glw.unbindTextureCube(15); return resourceHandle; } /** * create a CubeTexture * * @param mipLevelCount * @param images * @param width * @param height * @returns resource handle */ createCubeTexture(mipLevelCount, images, width, height) { const gl = this.__glw.getRawContext(); const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTextureCube(15, texture); const wrapS = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.ClampToEdge; const wrapT = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.ClampToEdge; let minFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Linear; let magFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Linear; if (images[0].posX.hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__.HdriFormat.HDR_LINEAR && this.__glw.isNotSupportWebGL1Extension(_WebGLExtension__WEBPACK_IMPORTED_MODULE_14__.WebGLExtension.TextureFloatLinear)) { if (mipLevelCount >= 2) { minFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.NearestMipmapNearest; } else { minFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Nearest; } magFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Nearest; } else { if (mipLevelCount >= 2) { minFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.LinearMipmapLinear; } else { minFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Linear; } magFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Linear; } const sampler = new _foundation_textures_Sampler__WEBPACK_IMPORTED_MODULE_19__.Sampler({ wrapS, wrapT, minFilter, magFilter }); sampler.create(); const loadImageToGPU = (image, cubeMapSide, i) => { if (image.hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__.HdriFormat.HDR_LINEAR) { const gl = this.__glw.getRawContextAsWebGL2(); gl.texImage2D(cubeMapSide, i, gl.RGB32F, image.width, image.height, 0, gl.RGB, gl.FLOAT, image.dataFloat); } else if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement) { gl.texImage2D(cubeMapSide, i, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); } else { gl.texImage2D(cubeMapSide, i, gl.RGBA, width / 2 ** i, height / 2 ** i, 0, gl.RGBA, gl.UNSIGNED_BYTE, image); } }; for (let i = 0; i < images.length; i++) { const image = images[i]; loadImageToGPU(image.posX, gl.TEXTURE_CUBE_MAP_POSITIVE_X, i); loadImageToGPU(image.negX, gl.TEXTURE_CUBE_MAP_NEGATIVE_X, i); loadImageToGPU(image.posY, gl.TEXTURE_CUBE_MAP_POSITIVE_Y, i); loadImageToGPU(image.negY, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, i); loadImageToGPU(image.posZ, gl.TEXTURE_CUBE_MAP_POSITIVE_Z, i); loadImageToGPU(image.negZ, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, i); } this.__glw.unbindTextureCube(15); return [resourceHandle, sampler]; } /** * Create Cube Texture from image files. * @param baseUri the base uri to load images; * @param mipLevelCount the number of mip levels (include root level). if no mipmap, the value should be 1; * @returns the WebGLResourceHandle for the generated Cube Texture */ async createCubeTextureFromFiles(baseUri, mipLevelCount, isNamePosNeg, hdriFormat) { const gl = this.__glw.getRawContext(); const imageArgs = []; let width = 0; let height = 0; for (let i = 0; i < mipLevelCount; i++) { const loadOneLevel = () => { return new Promise((resolve, reject) => { let loadedCount = 0; const images = []; let extension = '.jpg'; if (hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__.HdriFormat.HDR_LINEAR) { extension = '.hdr'; } else if (hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__.HdriFormat.RGBE_PNG) { extension = '.RGBE.PNG'; } let posX = '_right_'; let negX = '_left_'; let posY = '_top_'; let negY = '_bottom_'; let posZ = '_front_'; let negZ = '_back_'; if (isNamePosNeg) { posX = '_posx_'; negX = '_negx_'; posY = '_posy_'; negY = '_negy_'; posZ = '_posz_'; negZ = '_negz_'; } const faces = [ [baseUri + posX + i + extension, gl.TEXTURE_CUBE_MAP_POSITIVE_X], [baseUri + negX + i + extension, gl.TEXTURE_CUBE_MAP_NEGATIVE_X], [baseUri + posY + i + extension, gl.TEXTURE_CUBE_MAP_POSITIVE_Y], [baseUri + negY + i + extension, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y], [baseUri + posZ + i + extension, gl.TEXTURE_CUBE_MAP_POSITIVE_Z], [baseUri + negZ + i + extension, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z], ]; for (let j = 0; j < faces.length; j++) { const face = faces[j][1]; let image; if (hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__.HdriFormat.HDR_LINEAR || hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_8__.HdriFormat.RGB9_E5_PNG) { image = new HDRImage(); } else { image = new Image(); } image.hdriFormat = hdriFormat; image.side = face; image.uri = faces[j][0]; image.crossOrigin = 'Anonymous'; image.onload = () => { loadedCount++; images.push(image); if (loadedCount === 6) { resolve(images); } }; image.onerror = () => { reject(image.uri); }; image.src = faces[j][0]; } }); }; let images; try { images = await loadOneLevel(); } catch (e) { // Try again once try { images = await loadOneLevel(); } catch (uri) { // Give up _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error(`failed to load ${uri}`); } } const imageObj = {}; for (const image of images) { switch (image.side) { case gl.TEXTURE_CUBE_MAP_POSITIVE_X: imageObj.posX = image; break; case gl.TEXTURE_CUBE_MAP_POSITIVE_Y: imageObj.posY = image; break; case gl.TEXTURE_CUBE_MAP_POSITIVE_Z: imageObj.posZ = image; break; case gl.TEXTURE_CUBE_MAP_NEGATIVE_X: imageObj.negX = image; break; case gl.TEXTURE_CUBE_MAP_NEGATIVE_Y: imageObj.negY = image; break; case gl.TEXTURE_CUBE_MAP_NEGATIVE_Z: imageObj.negZ = image; break; } if (i === 0) { width = image.width; height = image.height; } } imageArgs.push(imageObj); } return this.createCubeTexture(mipLevelCount, imageArgs, width, height); } createCubeTextureFromBasis(basisFile, { magFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Linear, minFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.LinearMipmapLinear, wrapS = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Repeat, wrapT = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Repeat, border = 0, }) { const gl = this.__glw.getRawContext(); let basisCompressionType; let compressionType; const texture = gl.createTexture(); const resourceHandle = this.__registerResource(texture); this.__glw.bindTextureCube(15, texture); const s3tc = gl.getExtension('WEBGL_compressed_texture_s3tc'); if (s3tc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.BC3; compressionType = s3tc.COMPRESSED_RGBA_S3TC_DXT5_EXT; } const etc1 = gl.getExtension('WEBGL_compressed_texture_etc1'); if (etc1) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ETC1; compressionType = etc1.COMPRESSED_RGB_ETC1_WEBGL; } const atc = gl.getExtension('WEBGL_compressed_texture_atc'); if (atc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ATC_RGBA; compressionType = atc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL; } const etc2 = gl.getExtension('WEBGL_compressed_texture_etc'); if (etc2) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ETC2; compressionType = etc2.COMPRESSED_RGBA8_ETC2_EAC; } const pvrtc = gl.getExtension('WEBGL_compressed_texture_pvrtc') || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'); if (pvrtc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.PVRTC1_RGBA; compressionType = pvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; } const astc = gl.getExtension('WEBGL_compressed_texture_astc'); if (astc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_13__.BasisCompressionType.ASTC; compressionType = astc.COMPRESSED_RGBA_ASTC_4x4_KHR; } const numImages = basisFile.getNumImages(); const mipmapDepth = basisFile.getNumLevels(0); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrapS.index); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrapT.index); if (mipmapDepth >= 2) { gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, minFilter.index); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, magFilter.index); } else { let minFilter_ = minFilter; if (minFilter === _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.LinearMipmapLinear) { minFilter_ = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_2__.TextureParameter.Linear; } gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, minFilter_.index); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, magFilter.index); } for (let i = 0; i < mipmapDepth; i++) { for (let j = 0; j < numImages; j++) { const width = basisFile.getImageWidth(j, i); const height = basisFile.getImageHeight(j, i); const textureSource = this.decodeBasisImage(basisFile, basisCompressionType, j, i); gl.compressedTexImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + j, i, compressionType, width, height, border, textureSource); } } this.__glw.unbindTextureCube(15); return resourceHandle; } createDummyBlackCubeTexture() { const base64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg=='; const arrayBuffer = this.__createDummyTextureInner(base64); const typedArray = new Uint8Array(arrayBuffer); return this.createCubeTexture(1, [ { posX: typedArray, negX: typedArray, posY: typedArray, negY: typedArray, posZ: typedArray, negZ: typedArray, }, ], 1, 1); } createDummyCubeTexture(rgbaStr = 'rgba(0,0,0,1)') { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); ctx.fillStyle = rgbaStr; ctx.fillRect(0, 0, 1, 1); return this.createCubeTexture(1, [ { posX: canvas, negX: canvas, posY: canvas, negY: canvas, posZ: canvas, negZ: canvas, }, ], 1, 1); } setWebGLTextureDirectly(webGLTexture) { const texture = webGLTexture; const resourceHandle = this.__registerResource(texture); return resourceHandle; } async createTextureFromDataUri(dataUri, { level, internalFormat, border, format, type, generateMipmap, }) { return new Promise((resolve) => { const img = new Image(); if (!dataUri.match(/^data:/)) { img.crossOrigin = 'Anonymous'; } img.onload = () => { const width = img.width; const height = img.height; const texture = this.createTextureFromHTMLImageElement(img, { level, internalFormat, width, height, border, format, type, generateMipmap, }); resolve(texture); }; img.src = dataUri; }); } updateLevel0TextureAndGenerateMipmap(textureUid, textureData, { width, height, format, type, }) { const texture = this.getWebGLResource(textureUid); this.__glw.bindTexture2D(15, texture); const gl = this.__glw.getRawContextAsWebGL2(); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, format.index, type.index, textureData); gl.generateMipmap(gl.TEXTURE_2D); this.__glw.unbindTexture2D(15); } updateTexture(textureUid, textureData, { level, xoffset, yoffset, width, height, format, type, }) { const texture = this.getWebGLResource(textureUid); this.__glw.bindTexture2D(15, texture); const gl = this.__glw.getRawContextAsWebGL2(); gl.texSubImage2D(gl.TEXTURE_2D, level, 0, 0, width, height, format.index, type.index, textureData); this.__glw.unbindTexture2D(15); } deleteFrameBufferObject(frameBufferObjectHandle) { const fbo = this.getWebGLResource(frameBufferObjectHandle); const gl = this.__glw.getRawContext(); if (fbo != null) { gl.deleteFramebuffer(fbo); this.__webglResources.delete(frameBufferObjectHandle); } } deleteRenderBuffer(renderBufferUid) { const gl = this.__glw.getRawContext(); const renderBuffer = this.getWebGLResource(renderBufferUid); gl.deleteRenderbuffer(renderBuffer); this.__webglResources.delete(renderBufferUid); } deleteTexture(textureHandle) { const texture = this.getWebGLResource(textureHandle); const gl = this.__glw.getRawContext(); if (texture != null) { gl.deleteTexture(texture); this.__webglResources.delete(textureHandle); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.debug('gl.deleteTexture called: ' + textureHandle); } } createDummyTexture(rgbaStr = 'rgba(255,255,255,1)') { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); ctx.fillStyle = rgbaStr; ctx.fillRect(0, 0, 1, 1); return this.createTextureFromImageBitmapData(canvas, { level: 0, internalFormat: _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_23__.TextureFormat.RGBA8, width: 1, height: 1, border: 0, format: _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA, type: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.UnsignedByte, generateMipmap: false, }); } createDummyBlackTexture() { const base64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg=='; return this.__createDummyTextureInner(base64); } createDummyWhiteTexture() { const base64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5/hPwAIAgL/4d1j8wAAAABJRU5ErkJggg=='; return this.__createDummyTextureInner(base64); } createDummyNormalTexture() { const base64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOsr///HwAGgAL+v1RumAAAAABJRU5ErkJggg=='; return this.__createDummyTextureInner(base64); } __createDummyTextureInner(base64) { const arrayBuffer = _foundation_misc_DataUtil__WEBPACK_IMPORTED_MODULE_12__.DataUtil.base64ToArrayBuffer(base64); return this.createTextureFromTypedArray(new Uint8Array(arrayBuffer), { level: 0, internalFormat: _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_23__.TextureFormat.RGBA8, width: 1, height: 1, border: 0, format: _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.RGBA, type: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_5__.ComponentType.UnsignedByte, generateMipmap: false, }); } generateMipmaps2d(textureHandle, width, height) { const gl = this.__glw.getRawContext(); const texture = this.getWebGLResource(textureHandle); this.__glw.bindTexture2D(15, texture); gl.generateMipmap(gl.TEXTURE_2D); this.__glw.unbindTexture2D(15); } generateMipmapsCube(textureHandle, width, height) { const gl = this.__glw.getRawContext(); const texture = this.getWebGLResource(textureHandle); this.__glw.bindTextureCube(15, texture); gl.generateMipmap(gl.TEXTURE_CUBE_MAP); this.__glw.unbindTextureCube(15); } async getTexturePixelData(textureHandle, width, height, frameBufferUid, colorAttachmentIndex) { const gl = this.__glw.getRawContext(); // Create a framebuffer backed by the texture const fbo = this.getWebGLResource(frameBufferUid); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); // Read the contents of the framebuffer (data stores the pixel data) const data = new Uint8Array(width * height * 4); if (gl.readBuffer != null) { gl.readBuffer(36064 + colorAttachmentIndex); // 36064 means gl.COLOR_ATTACHMENT0 } gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data); gl.bindFramebuffer(gl.FRAMEBUFFER, null); return data; } createUniformBuffer(bufferView) { const gl = this.__glw.getRawContextAsWebGL2(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } const ubo = gl.createBuffer(); const resourceHandle = this.__registerResource(ubo); gl.bindBuffer(gl.UNIFORM_BUFFER, ubo); gl.bufferData(gl.UNIFORM_BUFFER, bufferView, gl.DYNAMIC_DRAW); gl.bindBuffer(gl.UNIFORM_BUFFER, null); return resourceHandle; } updateUniformBuffer(uboUid, typedArray, offsetByte, arrayLength) { const gl = this.__glw.getRawContextAsWebGL2(); const ubo = this.getWebGLResource(uboUid); gl.bindBuffer(gl.UNIFORM_BUFFER, ubo); gl.bufferSubData(gl.UNIFORM_BUFFER, 0, typedArray, offsetByte, arrayLength); gl.bindBuffer(gl.UNIFORM_BUFFER, null); } bindUniformBlock(shaderProgramUid, blockName, blockIndex) { const gl = this.__glw.getRawContextAsWebGL2(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } const shaderProgram = this.getWebGLResource(shaderProgramUid); const block = gl.getUniformBlockIndex(shaderProgram, blockName); gl.uniformBlockBinding(shaderProgram, block, blockIndex); } bindUniformBufferBase(blockIndex, uboUid) { const gl = this.__glw.getRawContextAsWebGL2(); if (gl == null) { throw new Error('No WebGLRenderingContext set as Default.'); } const ubo = this.getWebGLResource(uboUid); gl.bindBufferBase(gl.UNIFORM_BUFFER, blockIndex, ubo); } deleteUniformBuffer(uboUid) { const gl = this.__glw.getRawContext(); if (gl == null) { new Error('No WebGLRenderingContext set as Default.'); } const ubo = this.getWebGLResource(uboUid); this.__webglResources.delete(uboUid); gl.deleteBuffer(ubo); } setupUniformBufferDataArea(typedArray) { const gl = this.__glw.getRawContextAsWebGL2(); if (gl == null) { new Error('No WebGLRenderingContext set as Default.'); } const ubo = gl.createBuffer(); const resourceHandle = this.__registerResource(ubo); const maxConventionBlocks = this.__glw.getMaxConventionUniformBlocks(); const alignedMaxUniformBlockSize = this.__glw.getAlignedMaxUniformBlockSize(); const realSize = alignedMaxUniformBlockSize * maxConventionBlocks; const array = new Float32Array(realSize / 4); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.exist(typedArray)) { array.set(typedArray.subarray(0, array.length)); } gl.bindBuffer(gl.UNIFORM_BUFFER, ubo); gl.bufferData(gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW, 0, 0); for (let i = 0; i < maxConventionBlocks; i++) { gl.bindBufferRange(gl.UNIFORM_BUFFER, i, ubo, alignedMaxUniformBlockSize * i, alignedMaxUniformBlockSize); } gl.bindBuffer(gl.UNIFORM_BUFFER, null); return resourceHandle; } getGlslRenderTargetBeginString(renderTargetNumber) { let text = ''; for (let i = 0; i < renderTargetNumber; i++) { text += `layout(location = ${i}) out vec4 rt${i};`; } return text; } getGlslRenderTargetEndString(renderTargetNumber) { const text = ''; // if (Is.false(this.__glw!.isWebGL2)) { // for (let i = 0; i < renderTargetNumber; i++) { // text += `gl_FragData[${i}] = rt${i};`; // } // } return text; } getGlslDataUBODefinitionString() { let text = ''; const maxConventionblocks = this.__glw.getMaxConventionUniformBlocks(); const alignedMaxUniformBlockSize = this.__glw.getAlignedMaxUniformBlockSize(); for (let i = 0; i < maxConventionblocks; i++) { text += ` layout (std140) uniform Vec4Block${i} { vec4 vec4Block${i}[${alignedMaxUniformBlockSize / 4 / 4}]; }; `; } text += ` vec4 fetchVec4FromVec4Block(int vec4Idx) { int vec4IdxForEachBlock = vec4Idx % dataUBOVec4Size; if (vec4Idx < dataUBOVec4Size) { return vec4Block0[vec4IdxForEachBlock]; }`; for (let i = 1; i < maxConventionblocks; i++) { text += ` else if (vec4Idx < dataUBOVec4Size * ${i + 1}) { return vec4Block${i}[vec4IdxForEachBlock]; }`; } text += '}\n'; return text; } getGlslDataUBOVec4SizeString() { const alignedMaxUniformBlockSize = this.__glw.getAlignedMaxUniformBlockSize(); return `const int dataUBOVec4Size = ${alignedMaxUniformBlockSize / 4 / 4};`; } createMultiviewFramebuffer(width, height, samples) { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(this.__glw.webgl2ExtMLTVIEW)) { return [-1, -1]; } const gl = this.__glw.getRawContextAsWebGL2(); const framebuffer = gl.createFramebuffer(); const framebufferHandle = this.__registerResource(framebuffer); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, framebuffer); // color texture / attachment const colorTexture = gl.createTexture(); const colorTextureHandle = this.__registerResource(colorTexture); gl.bindTexture(gl.TEXTURE_2D_ARRAY, colorTexture); gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, width, height, 2); if (!this.__glw.webgl2ExtMLTVIEW.is_multisample) this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultiviewOVR(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, colorTexture, 0, 0, 2); else this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultisampleMultiviewOVR(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, colorTexture, 0, samples, 0, 2); // depth texture / attachment const depthStencilTex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D_ARRAY, depthStencilTex); gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.DEPTH32F_STENCIL8, width, height, 2); if (!this.__glw.webgl2ExtMLTVIEW.is_multisample) this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultiviewOVR(gl.DRAW_FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilTex, 0, 0, 2); else this.__glw.webgl2ExtMLTVIEW.framebufferTextureMultisampleMultiviewOVR(gl.DRAW_FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilTex, 0, samples, 0, 2); return [framebufferHandle, colorTextureHandle]; } createTransformFeedback() { const gl = this.__glw.getRawContextAsWebGL2(); const transformFeedback = gl.createTransformFeedback(); const resourceHandle = this.__registerResource(transformFeedback); gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, transformFeedback); return resourceHandle; } deleteTransformFeedback(transformFeedbackUid) { const gl = this.__glw.getRawContextAsWebGL2(); const transformFeedback = this.getWebGLResource(transformFeedbackUid); gl.deleteTransformFeedback(transformFeedback); this.__webglResources.delete(transformFeedbackUid); } setViewport(viewport) { var _a, _b; if (viewport) { (_a = this.__glw) === null || _a === void 0 ? void 0 : _a.setViewportAsVector4(viewport); _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__.SystemState.viewportAspectRatio = (viewport.z - viewport.x) / (viewport.w - viewport.y); } else { (_b = this.__glw) === null || _b === void 0 ? void 0 : _b.setViewport(0, 0, this.__glw.width, this.__glw.height); _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__.SystemState.viewportAspectRatio = this.__glw.width / this.__glw.height; } } clearFrameBuffer(renderPass) { const gl = this.__glw.getRawContext(); let bufferBit = 0; if (renderPass.toClearColorBuffer) { gl.clearColor(renderPass.clearColor.x, renderPass.clearColor.y, renderPass.clearColor.z, renderPass.clearColor.w); bufferBit |= gl.COLOR_BUFFER_BIT; } if (renderPass.toClearDepthBuffer) { gl.clearDepth(renderPass.clearDepth); bufferBit |= gl.DEPTH_BUFFER_BIT; } if (renderPass.toClearStencilBuffer) { gl.clearStencil(renderPass.clearStencil); bufferBit |= gl.STENCIL_BUFFER_BIT; } if (bufferBit !== 0) { gl.clear(bufferBit); } } deleteVertexDataResources(vertexHandles) { const gl = this.__glw.getRawContext(); const iboHandle = vertexHandles.iboHandle; if (iboHandle) { const ibo = this.getWebGLResource(iboHandle); gl.deleteBuffer(ibo); this.__webglResources.delete(iboHandle); } const vboHandles = vertexHandles.vboHandles; for (const vboHandle of vboHandles) { const vbo = this.getWebGLResource(vboHandle); gl.deleteBuffer(vbo); this.__webglResources.delete(vboHandle); } const vaoHandle = vertexHandles.vaoHandle; const vao = this.getWebGLResource(vaoHandle); this.__glw.deleteVertexArray(vao); this.__webglResources.delete(vaoHandle); } deleteVertexArray(vaoHandle) { const vao = this.getWebGLResource(vaoHandle); this.__glw.deleteVertexArray(vao); this.__webglResources.delete(vaoHandle); } deleteVertexBuffer(vboUid) { const gl = this.__glw.getRawContext(); const vbo = this.getWebGLResource(vboUid); gl.deleteBuffer(vbo); this.__webglResources.delete(vboUid); } resizeCanvas(width, height) { this.__glw.width = width; this.__glw.height = height; this.__glw.canvas.width = width; this.__glw.canvas.height = height; this.__glw.setViewportAsVector4(_foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_9__.Vector4.fromCopyArray([0, 0, width, height])); } getCanvasSize() { return [this.__glw.canvas.width, this.__glw.canvas.height]; } switchDepthTest(flag) { const gl = this.__glw.getRawContext(); if (flag) { gl.enable(gl.DEPTH_TEST); } else { gl.disable(gl.DEPTH_TEST); } } rebuildProgramBySpector(updatedVertexSourceCode, // The new vertex shader source updatedFragmentSourceCode, // The new fragment shader source onCompiled, // Callback triggered by your engine when the compilation is successful. It needs to send back the new linked program. onError) { // Callback triggered by your engine in case of error. It needs to send the WebGL error to allow the editor to display the error in the gutter. const material = this._material.deref(); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_15__.Is.not.exist(material)) { const warn = 'Material Not found'; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.warn(warn); onError(warn); return false; } const processApproach = _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__.SystemState.currentProcessApproach; const renderingStrategy = (0,_getRenderingStrategy__WEBPACK_IMPORTED_MODULE_16__["default"])(processApproach); const modifiedVertexSourceCode = updatedVertexSourceCode.replace(/! =/g, '!='); const modifiedPixelSourceCode = updatedFragmentSourceCode.replace(/! =/g, '!='); const programUid = renderingStrategy._reSetupShaderForMaterialBySpector(material, { vertex: modifiedVertexSourceCode, pixel: modifiedPixelSourceCode, }, onError); if (programUid < 0) { return false; } const webglResourceRepository = WebGLResourceRepository.getInstance(); const program = webglResourceRepository.getWebGLResource(programUid); if (programUid > 0) { onCompiled(program); } return true; } rebuildProgram(material, updatedVertexSourceCode, // The new vertex shader source updatedFragmentSourceCode // The new fragment shader source ) { const processApproach = _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__.SystemState.currentProcessApproach; const renderingStrategy = (0,_getRenderingStrategy__WEBPACK_IMPORTED_MODULE_16__["default"])(processApproach); const modifiedVertexSourceCode = updatedVertexSourceCode.replace(/! =/g, '!='); const modifiedPixelSourceCode = updatedFragmentSourceCode.replace(/! =/g, '!='); const programUid = renderingStrategy._reSetupShaderForMaterialBySpector(material, { vertex: modifiedVertexSourceCode, pixel: modifiedPixelSourceCode, }, (message) => { return; }); } getPixelDataFromTexture(texUid, x, y, width, height) { const gl = this.__glw.getRawContext(); const pixels = new Uint8Array((width - x) * (height - y) * 4); const texture = this.getWebGLResource(texUid); const fbo = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.deleteFramebuffer(fbo); return pixels; } setWebGLStateToDefault() { const gl = this.__glw.getRawContextAsWebGL2(); gl.bindBuffer(gl.ARRAY_BUFFER, null); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); gl.bindRenderbuffer(gl.RENDERBUFFER, null); gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.bindVertexArray(null); gl.clearColor(0, 0, 0, 0); gl.clearDepth(1); gl.clearStencil(0); gl.depthFunc(gl.LESS); gl.disable(gl.DEPTH_TEST); gl.disable(gl.STENCIL_TEST); gl.disable(gl.BLEND); gl.disable(gl.DITHER); gl.disable(gl.SCISSOR_TEST); gl.disable(gl.POLYGON_OFFSET_FILL); gl.disable(gl.SAMPLE_COVERAGE); gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); gl.disable(gl.CULL_FACE); gl.frontFace(gl.CCW); gl.cullFace(gl.BACK); gl.blendColor(0, 0, 0, 0); gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD); gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); gl.stencilOpSeparate(gl.FRONT, gl.KEEP, gl.KEEP, gl.KEEP); gl.stencilOpSeparate(gl.BACK, gl.KEEP, gl.KEEP, gl.KEEP); gl.stencilFuncSeparate(gl.FRONT, gl.ALWAYS, 0, 0xffffffff); gl.stencilFuncSeparate(gl.BACK, gl.ALWAYS, 0, 0xffffffff); gl.stencilMaskSeparate(gl.FRONT, 0xffffffff); gl.stencilMaskSeparate(gl.BACK, 0xffffffff); gl.colorMask(true, true, true, true); gl.depthMask(true); gl.sampleCoverage(1.0, false); for (let i = 0; i < 16; i++) { gl.activeTexture(gl.TEXTURE0 + i); gl.bindTexture(gl.TEXTURE_2D, null); gl.bindTexture(gl.TEXTURE_CUBE_MAP, null); gl.bindSampler(i, null); } } unbindTextureSamplers() { const gl = this.__glw.getRawContextAsWebGL2(); for (let i = 0; i < 16; i++) { gl.bindSampler(i, null); } } isSupportMultiViewVRRendering() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_22__.ProcessApproach.DataTexture) { return this.__glw.isMultiview(); } else { return false; } } blitToTexture2dFromTexture2dArray(srcTextureUid, dstFboUid, dstWidth, dstHeight) { const gl = this.__glw.getRawContextAsWebGL2(); const srcTexture = this.getWebGLResource(srcTextureUid); const dstFbo = this.getWebGLResource(dstFboUid); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, dstFbo); const webStereoUtil = _WebGLStereoUtil__WEBPACK_IMPORTED_MODULE_21__.WebGLStereoUtil.getInstance(gl); webStereoUtil.blit(srcTexture, 0, 0, 1, 1, dstWidth, dstHeight); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); } blitToTexture2dFromTexture2dArrayFake(srcTextureUid, dstFboUid, dstWidth, dstHeight) { const gl = this.__glw.getRawContextAsWebGL2(); const srcTexture = this.getWebGLResource(srcTextureUid); const dstFbo = this.getWebGLResource(dstFboUid); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, dstFbo); const webStereoUtil = _WebGLStereoUtil__WEBPACK_IMPORTED_MODULE_21__.WebGLStereoUtil.getInstance(gl); webStereoUtil.blitFake(srcTexture, 0, 0, 1, 1, dstWidth, dstHeight); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); } blitToTexture2dFromTexture2dArray2(srcTextureUid, dstTextureUid, dstWidth, dstHeight) { const gl = this.__glw.getRawContextAsWebGL2(); const srcTexture = this.getWebGLResource(srcTextureUid); const dstTexture = this.getWebGLResource(dstTextureUid); const webStereoUtil = _WebGLStereoUtil__WEBPACK_IMPORTED_MODULE_21__.WebGLStereoUtil.getInstance(gl); webStereoUtil.blit2(srcTexture, dstTexture, dstWidth, dstHeight); } } /***/ }), /***/ "./src/webgl/WebGLStereoUtil.ts": /*!**************************************!*\ !*** ./src/webgl/WebGLStereoUtil.ts ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGLStereoUtil: () => (/* binding */ WebGLStereoUtil) /* harmony export */ }); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); // This is from https://developer.oculus.com/documentation/web/web-multiview/ const VSMultiview = [ '#version 300 es', 'uniform vec2 u_offset;', 'uniform vec2 u_scale;', 'out mediump vec3 v_texcoord;', 'void main() {', // offset of eye quad in -1..1 space ' const float eye_offset_x[12] = float[12] (', ' 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,', ' 1.0, 1.0, 1.0, 1.0, 1.0, 1.0', ' );', // xy - coords of the quad, normalized to 0..1 // xy - UV of the source texture coordinate. // z - texture layer (eye) index - 0 or 1. ' const vec3 quad_positions[12] = vec3[12]', ' (', ' vec3(0.0, 0.0, 0.0),', ' vec3(1.0, 0.0, 0.0),', ' vec3(0.0, 1.0, 0.0),', ' vec3(0.0, 1.0, 0.0),', ' vec3(1.0, 0.0, 0.0),', ' vec3(1.0, 1.0, 0.0),', ' vec3(0.0, 0.0, 1.0),', ' vec3(1.0, 0.0, 1.0),', ' vec3(0.0, 1.0, 1.0),', ' vec3(0.0, 1.0, 1.0),', ' vec3(1.0, 0.0, 1.0),', ' vec3(1.0, 1.0, 1.0)', ' );', ' const vec2 pos_scale = vec2(0.5, 1.0);', ' vec2 eye_offset = vec2(eye_offset_x[gl_VertexID], 0.0);', ' gl_Position = vec4(((quad_positions[gl_VertexID].xy * u_scale + u_offset) * pos_scale * 2.0) - 1.0 + eye_offset, 0.0, 1.0);', ' v_texcoord = vec3(quad_positions[gl_VertexID].xy * u_scale + u_offset, quad_positions[gl_VertexID].z);', '}', ].join('\n'); const FSMultiview = [ '#version 300 es', 'uniform mediump sampler2DArray u_source_texture;', 'in mediump vec3 v_texcoord;', 'out mediump vec4 output_color;', 'void main()', '{', ' output_color = texture(u_source_texture, v_texcoord);', '}', ].join('\n'); class WebGLStereoUtil { constructor(gl) { this.__gl = gl; // this.__vao = gl.createVertexArray()!; this.__program = gl.createProgram(); this.__attachShaderSource(VSMultiview, gl.VERTEX_SHADER); this.__attachShaderSource(FSMultiview, gl.FRAGMENT_SHADER); this.__gl.linkProgram(this.__program); this.__bindAttribLocation({ v_texcoord: 0, }); this.__getUniformLocations(); } static getInstance(gl) { if (!this.__instance) { this.__instance = new WebGLStereoUtil(gl); } return this.__instance; } __attachShaderSource(source, type) { const gl = this.__gl; let shader; switch (type) { case gl.VERTEX_SHADER: this.__vertexShader = gl.createShader(type); shader = this.__vertexShader; break; case gl.FRAGMENT_SHADER: this.__fragmentShader = gl.createShader(type); shader = this.__fragmentShader; break; default: _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_0__.Logger.error('Invalid Shader Type: ' + type); return; } gl.attachShader(this.__program, shader); gl.shaderSource(shader, source); gl.compileShader(shader); } __bindAttribLocation(attribLocationMap) { const gl = this.__gl; if (attribLocationMap) { this.__attrib = {}; for (const attribName in attribLocationMap) { gl.bindAttribLocation(this.__program, attribLocationMap[attribName], attribName); this.__attrib[attribName] = attribLocationMap[attribName]; } } } __getUniformLocations() { const gl = this.__gl; if (this.__uniform == null) { this.__uniform = {}; const uniformCount = gl.getProgramParameter(this.__program, gl.ACTIVE_UNIFORMS); let uniformName = ''; for (let i = 0; i < uniformCount; i++) { const uniformInfo = gl.getActiveUniform(this.__program, i); uniformName = uniformInfo.name.replace('[0]', ''); this.__uniform[uniformName] = gl.getUniformLocation(this.__program, uniformName); } } } blit(source_texture, source_rect_uv_x, source_rect_uv_y, source_rect_uv_width, source_rect_uv_height, dest_surface_width, dest_surface_height) { const gl = this.__gl; const program = this.__program; gl.activeTexture(gl.TEXTURE15); gl.bindTexture(gl.TEXTURE_2D_ARRAY, source_texture); gl.useProgram(program); const depthTestEnabled = gl.getParameter(gl.DEPTH_TEST); const depthMask = gl.getParameter(gl.DEPTH_WRITEMASK); gl.disable(gl.SCISSOR_TEST); if (depthTestEnabled) { gl.disable(gl.DEPTH_TEST); } gl.disable(gl.STENCIL_TEST); gl.colorMask(true, true, true, true); if (depthMask) { gl.depthMask(false); } const viewport = gl.getParameter(gl.VIEWPORT); gl.viewport(0, 0, dest_surface_width, dest_surface_height); gl.uniform2f(this.__uniform['u_scale'], source_rect_uv_width, source_rect_uv_height); gl.uniform2f(this.__uniform['u_offset'], source_rect_uv_x, source_rect_uv_y); gl.uniform1i(this.__uniform['u_source_texture'], 15); // gl.bindVertexArray(this.__vao); gl.drawArrays(gl.TRIANGLES, 0, 12); // gl.useProgram((gl as any).__lastUseProgram); gl.__changedProgram = true; gl.viewport(viewport[0], viewport[1], viewport[2], viewport[3]); if (depthTestEnabled) { gl.enable(gl.DEPTH_TEST); } gl.depthMask(depthMask); gl.flush(); } blitFake(source_texture, source_rect_uv_x, source_rect_uv_y, source_rect_uv_width, source_rect_uv_height, dest_surface_width, dest_surface_height) { const gl = this.__gl; const program = this.__program; gl.activeTexture(gl.TEXTURE15); gl.bindTexture(gl.TEXTURE_2D_ARRAY, source_texture); gl.useProgram(program); // const depthTestEnabled = gl.getParameter(gl.DEPTH_TEST); // const depthMask = gl.getParameter(gl.DEPTH_WRITEMASK); // gl.disable(gl.SCISSOR_TEST); // if (depthTestEnabled) { // gl.disable(gl.DEPTH_TEST); // } // gl.disable(gl.STENCIL_TEST); // gl.colorMask(true, true, true, true); // if (depthMask) { // gl.depthMask(false); // } const viewport = gl.getParameter(gl.VIEWPORT); gl.viewport(0, 0, dest_surface_width, dest_surface_height); gl.uniform2f(this.__uniform['u_scale'], source_rect_uv_width, source_rect_uv_height); gl.uniform2f(this.__uniform['u_offset'], source_rect_uv_x, source_rect_uv_y); gl.uniform1i(this.__uniform['u_source_texture'], 15); gl.drawArrays(gl.TRIANGLES, 0, 12); // gl.useProgram((gl as any).__lastUseProgram); gl.__changedProgram = true; gl.viewport(viewport[0], viewport[1], viewport[2], viewport[3]); // if (depthTestEnabled) { // gl.enable(gl.DEPTH_TEST); // } // gl.depthMask(depthMask); } blit2(srcTexture, dstTexture, width, height) { const gl = this.__gl; const readFramebuffer = gl.createFramebuffer(); const drawFramebuffer = gl.createFramebuffer(); // ブリットの関数 function blitTextureArrayLayer(layer, xOffset) { // gl.bindFramebuffer(gl.FRAMEBUFFER, readFramebuffer); // gl.framebufferTextureLayer(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, srcTexture, 0, layer); // gl.bindFramebuffer(gl.FRAMEBUFFER, drawFramebuffer); // gl.framebufferTexture2D( // gl.DRAW_FRAMEBUFFER, // gl.COLOR_ATTACHMENT0, // gl.TEXTURE_2D, // dstTexture, // 0 // ); // // ブリット // gl.blitFramebuffer( // 0, // 0, // width, // height, // ソースの範囲 // xOffset, // 0, // xOffset + width, // height, // コピー先の範囲 // gl.COLOR_BUFFER_BIT, // gl.NEAREST // ); // レイヤーごとに個別のテクスチャを作成 const tempTexture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tempTexture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.bindFramebuffer(gl.READ_FRAMEBUFFER, readFramebuffer); gl.framebufferTextureLayer(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, srcTexture, 0, layer); // 一時的なテクスチャにレイヤーをコピー gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawFramebuffer); gl.framebufferTexture2D(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tempTexture, 0); gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, gl.COLOR_BUFFER_BIT, gl.NEAREST); // 一時的なテクスチャから最終テクスチャにコピー gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tempTexture, 0); gl.framebufferTexture2D(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, dstTexture, 0); gl.blitFramebuffer(0, 0, width, height, xOffset, 0, xOffset + width, height, gl.COLOR_BUFFER_BIT, gl.NEAREST); } // 0番目のレイヤーを左側にコピー blitTextureArrayLayer(0, 0); // 1番目のレイヤーを右側にコピー blitTextureArrayLayer(1, width); gl.bindFramebuffer(gl.FRAMEBUFFER, null); } } /***/ }), /***/ "./src/webgl/WebGLStrategy.ts": /*!************************************!*\ !*** ./src/webgl/WebGLStrategy.ts ***! \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/webgl/WebGLStrategyCommonMethod.ts": /*!************************************************!*\ !*** ./src/webgl/WebGLStrategyCommonMethod.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ setupShaderProgram: () => (/* binding */ setupShaderProgram) /* harmony export */ }); /* harmony import */ var _foundation_definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _foundation_math_Scalar__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/math/Scalar */ "./src/foundation/math/Scalar.ts"); /* harmony import */ var _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/math/Vector3 */ "./src/foundation/math/Vector3.ts"); let lastIsTransparentMode; let lastBlendEquationMode; let lastBlendEquationModeAlpha; let lastBlendFuncSrcFactor; let lastBlendFuncDstFactor; let lastBlendFuncAlphaSrcFactor; let lastBlendFuncAlphaDstFactor; let lastCullFace; let lastFrontFaceCCW; let lastAlphaToCoverage; function setWebGLParameters(material, gl) { setCull(material, gl); setBlendSettings(material, gl); setAlphaToCoverage(material, gl); } function setCull(material, gl) { const cullFace = material.cullFace; const cullFrontFaceCCW = material.cullFrontFaceCCW; if (lastCullFace !== cullFace) { if (cullFace) { gl.enable(gl.CULL_FACE); } else { gl.disable(gl.CULL_FACE); } lastCullFace = cullFace; } if (cullFace === true && lastFrontFaceCCW !== cullFrontFaceCCW) { if (cullFrontFaceCCW) { gl.frontFace(gl.CCW); } else { gl.frontFace(gl.CW); } lastFrontFaceCCW = cullFrontFaceCCW; } } function setBlendSettings(material, gl) { const isBlendMode = material.isBlend(); if (lastIsTransparentMode !== isBlendMode) { if (isBlendMode) { gl.enable(gl.BLEND); } else { gl.disable(gl.BLEND); } lastIsTransparentMode = isBlendMode; } if (material.alphaMode === _foundation_definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_0__.AlphaMode.Blend) { setBlendEquationMode(material.blendEquationMode.index, material.blendEquationModeAlpha.index, gl); setBlendFuncSrcFactor(material.blendFuncSrcFactor.index, material.blendFuncDstFactor.index, material.blendFuncAlphaSrcFactor.index, material.blendFuncAlphaDstFactor.index, gl); } } function setBlendEquationMode(blendEquationMode, blendEquationModeAlpha, gl) { const needUpdateBlendEquation = differentWithLastBlendEquation(blendEquationMode, blendEquationModeAlpha); if (needUpdateBlendEquation) { gl.blendEquationSeparate(blendEquationMode, blendEquationModeAlpha); lastBlendEquationMode = blendEquationMode; lastBlendEquationModeAlpha = blendEquationModeAlpha; } } function differentWithLastBlendEquation(equationMode, equationModeAlpha) { const result = lastBlendEquationMode !== equationMode || lastBlendEquationModeAlpha !== equationModeAlpha; return result; } function setBlendFuncSrcFactor(blendFuncSrcFactor, blendFuncDstFactor, blendFuncAlphaSrcFactor, blendFuncAlphaDstFactor, gl) { const needUpdateBlendFunc = differentWithLastBlendFuncFactor(blendFuncSrcFactor, blendFuncDstFactor, blendFuncAlphaSrcFactor, blendFuncAlphaDstFactor); if (needUpdateBlendFunc) { gl.blendFuncSeparate(blendFuncSrcFactor, blendFuncDstFactor, blendFuncAlphaSrcFactor, blendFuncAlphaDstFactor); lastBlendFuncSrcFactor = blendFuncSrcFactor; lastBlendFuncDstFactor = blendFuncDstFactor; lastBlendFuncAlphaSrcFactor = blendFuncAlphaSrcFactor; lastBlendFuncAlphaDstFactor = blendFuncAlphaDstFactor; } } function differentWithLastBlendFuncFactor(srcFactor, dstFactor, alphaSrcFactor, alphaDstFactor) { const result = lastBlendFuncSrcFactor !== srcFactor || lastBlendFuncDstFactor !== dstFactor || lastBlendFuncAlphaSrcFactor !== alphaSrcFactor || lastBlendFuncAlphaDstFactor !== alphaDstFactor; return result; } function setAlphaToCoverage(material, gl) { const alphaToCoverage = material.alphaToCoverage; if (alphaToCoverage !== lastAlphaToCoverage) { if (alphaToCoverage) { gl.enable(gl.SAMPLE_ALPHA_TO_COVERAGE); } else { gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); } lastAlphaToCoverage = alphaToCoverage; } } function getViewport(renderPass) { const webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__.WebGLResourceRepository.getInstance(); let viewport = renderPass.getViewport(); if (viewport == null) { viewport = webglResourceRepository.currentWebGLContextWrapper.defaultViewport; } return viewport; } function setVRViewport(renderPass, displayIdx) { const webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__.WebGLResourceRepository.getInstance(); const rnXRModule = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_1__.ModuleManager.getInstance().getModule('xr'); const webxrSystem = rnXRModule.WebXRSystem.getInstance(); if (webxrSystem.isWebXRMode) { webglResourceRepository.setViewport(webxrSystem._getViewportAt(displayIdx)); } } function getDisplayCount(isVRMainPass, webxrSystem) { if (webxrSystem.isWebXRMode) { if (webxrSystem.isMultiView()) { return 1; } else if (isVRMainPass) { return 2; } else { return 1; } } else { return 1; } } function isVrMainPass(renderPass) { const rnXRModule = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_1__.ModuleManager.getInstance().getModule('xr'); const isVRMainPass = (rnXRModule === null || rnXRModule === void 0 ? void 0 : rnXRModule.WebXRSystem.getInstance().isWebXRMode) && renderPass.isVrRendering; return isVRMainPass; } function getPointSpriteShaderSemanticsInfoArray() { return [ { semantic: 'pointSize', compositionType: _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Scalar, componentType: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Float, stage: _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: _foundation_math_Scalar__WEBPACK_IMPORTED_MODULE_6__.Scalar.fromCopyNumber(30.0), min: 0, max: Number.MAX_VALUE, isInternalSetting: false, }, { semantic: 'pointDistanceAttenuation', compositionType: _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_3__.CompositionType.Vec3, componentType: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_4__.ComponentType.Float, stage: _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_5__.ShaderType.PixelShader, initialValue: _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_7__.Vector3.fromCopyArray([0.0, 0.1, 0.01]), min: 0, max: 1, isInternalSetting: false, }, ]; } function setupShaderProgram(material, primitive, webglStrategy) { if (material == null) { return; } if (material.isShaderProgramReady(primitive)) { return; } try { primitive === null || primitive === void 0 ? void 0 : primitive._backupMaterial(); webglStrategy.setupShaderForMaterial(material, primitive); } catch (e) { // It is possible that a shader compilation error may occur, for example, in the middle of shader editing. // In this case, restore the shaders from a backup of the valid material. console.log(e); primitive === null || primitive === void 0 ? void 0 : primitive._restoreMaterial(); webglStrategy.setupShaderForMaterial(material, primitive); } } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({ setWebGLParameters, setVRViewport, getDisplayCount, isVrMainPass, getPointSpriteShaderSemanticsInfoArray, })); /***/ }), /***/ "./src/webgl/WebGLStrategyDataTexture.ts": /*!***********************************************!*\ !*** ./src/webgl/WebGLStrategyDataTexture.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGLStrategyDataTexture: () => (/* binding */ WebGLStrategyDataTexture) /* harmony export */ }); /* harmony import */ var _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _foundation_components_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/components/Mesh/MeshComponent */ "./src/foundation/components/Mesh/MeshComponent.ts"); /* harmony import */ var _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/materials/core/Material */ "./src/foundation/materials/core/Material.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_core_Component__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/components/SceneGraph/SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); /* harmony import */ var _foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../foundation/components/MeshRenderer/MeshRendererComponent */ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts"); /* harmony import */ var _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../foundation/core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../foundation/components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../foundation/core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _foundation_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../foundation/components/WellKnownComponentTIDs */ "./src/foundation/components/WellKnownComponentTIDs.ts"); /* harmony import */ var _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../foundation/misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./WebGLStrategyCommonMethod */ "./src/webgl/WebGLStrategyCommonMethod.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_components_Light_LightComponent__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../foundation/components/Light/LightComponent */ "./src/foundation/components/Light/LightComponent.ts"); /* harmony import */ var _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../foundation/materials/core/MaterialRepository */ "./src/foundation/materials/core/MaterialRepository.ts"); /* harmony import */ var _foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../foundation/renderer/RenderingCommonMethods */ "./src/foundation/renderer/RenderingCommonMethods.ts"); /* harmony import */ var _foundation_components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../foundation/components/CameraController/CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /* harmony import */ var _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../foundation/components/Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _foundation_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../foundation/components/Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../foundation/definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); class WebGLStrategyDataTexture { constructor() { this.__webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_0__.WebGLResourceRepository.getInstance(); this.__dataTextureUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__dataUBOUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__lastShader = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__lastMaterialStateVersion = -1; this.__lastRenderPassTickCount = -1; this._totalSizeOfGPUShaderDataStorageExceptMorphData = 0; this.__lastMaterialsUpdateCount = -1; this.__lastTransformComponentsUpdateCount = -1; this.__lastSceneGraphComponentsUpdateCount = -1; this.__lastCameraComponentsUpdateCount = -1; } static dumpDataTextureBuffer() { this.__isDebugOperationToDataTextureBufferDone = false; } static getVertexShaderMethodDefinitions_dataTexture() { return ` mat4 get_worldMatrix(float instanceId) { int index = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_10__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent, 'worldMatrix')} + 4 * int(instanceId); mat4 matrix = fetchMat4(index); return matrix; } mat3 get_normalMatrix(float instanceId) { int index = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_10__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent, 'normalMatrix')} * 4 + 9 * int(instanceId); mat3 matrix = fetchMat3No16BytesAligned(index); return matrix; } bool get_isVisible(float instanceId) { int index = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_10__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent, 'isVisible')} * 4 + int(instanceId); float visibility = fetchScalarNo16BytesAligned(index); return (visibility > 0.5) ? true : false; } bool get_isBillboard(float instanceId) { int index = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_10__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent, 'isBillboard')} * 4 + int(instanceId); float isBillboard = fetchScalarNo16BytesAligned(index); return (isBillboard > 0.5) ? true : false; } #ifdef RN_IS_VERTEX_SHADER #ifdef RN_IS_MORPHING vec3 get_position(float vertexId, vec3 basePosition) { vec3 position = basePosition; int scalar_idx = 3 * int(vertexId); for (int i=0; i<${_foundation_core_Config__WEBPACK_IMPORTED_MODULE_14__.Config.maxVertexMorphNumberInShader}; i++) { int basePosIn4bytes = u_dataTextureMorphOffsetPosition[i] * 4 + scalar_idx; vec3 addPos = fetchVec3No16BytesAligned(basePosIn4bytes); position += addPos * u_morphWeights[i]; if (i == u_morphTargetNumber-1) { break; } } return position; } #endif #endif `; } /** * setup shader program for the material in this WebGL strategy * @param material - a material to setup shader program */ setupShaderForMaterial(material, primitive) { const webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_0__.WebGLResourceRepository.getInstance(); const glw = webglResourceRepository.currentWebGLContextWrapper; const [programUid, newOne] = material._createProgramWebGL(WebGLStrategyDataTexture.getVertexShaderMethodDefinitions_dataTexture(), WebGLStrategyDataTexture.__getShaderProperty, primitive, glw.isWebGL2); if (newOne) { material._setupBasicUniformsLocations(primitive); material._setUniformLocationsOfMaterialNodes(false, primitive); material._setupAdditionalUniformLocations(_WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].getPointSpriteShaderSemanticsInfoArray(), false, primitive); WebGLStrategyDataTexture.__globalDataRepository._setUniformLocationsForDataTextureModeOnly(material.getShaderProgramUid(primitive)); } return programUid; } /** * re-setup shader program for the material in this WebGL strategy * @param material - a material to re-setup shader program * @param updatedShaderSources - updated shader sources * @param onError - callback function to handle error * @returns */ _reSetupShaderForMaterialBySpector(material, updatedShaderSources, onError) { const [programUid, newOne] = material._createProgramByUpdatedSources(updatedShaderSources, onError); if (programUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { return programUid; } if (newOne) { material._setupBasicUniformsLocations(); material._setUniformLocationsOfMaterialNodes(false); material._setupAdditionalUniformLocations(_WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].getPointSpriteShaderSemanticsInfoArray(), false); } WebGLStrategyDataTexture.__globalDataRepository._setUniformLocationsForDataTextureModeOnly(material.getShaderProgramUid()); return programUid; } static __getShaderProperty(materialTypeName, info, isGlobalData, isWebGL2) { var _a, _b; const returnType = info.compositionType.getGlslStr(info.componentType); let indexStr; const isTexture = _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.isTexture(info.compositionType); const methodName = info.semantic.replace('.', '_'); // definition of uniform variable for texture sampler or what must be explicitly uniform variabl) let varDef = ''; const varType = info.compositionType.getGlslStr(info.componentType); let varIndexStr = ''; if (info.arrayLength) { varIndexStr = `[${info.arrayLength}]`; } if (info.needUniformInDataTextureMode || isTexture) { varDef = ` uniform ${varType} u_${methodName}${varIndexStr};\n`; } // inner contents of 'get_' shader function const vec4SizeOfProperty = info.compositionType.getVec4SizeOfProperty(); // for non-`index` property (this is general case) const scalarSizeOfProperty = info.compositionType.getNumberOfComponents(); const offsetOfProperty = WebGLStrategyDataTexture.getOffsetOfPropertyInShader(isGlobalData, info.semantic, materialTypeName); if (offsetOfProperty === -1) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_29__.Logger.error('Could not get the location offset of the property.'); } let instanceSize = vec4SizeOfProperty; indexStr = `int vec4_idx = ${offsetOfProperty} + ${instanceSize} * instanceId;\n`; if (_foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.isArray(info.compositionType)) { instanceSize = vec4SizeOfProperty * ((_a = info.arrayLength) !== null && _a !== void 0 ? _a : 1); const paddedAsVec4 = Math.ceil(scalarSizeOfProperty / 4) * 4; const instanceSizeInScalar = paddedAsVec4 * ((_b = info.arrayLength) !== null && _b !== void 0 ? _b : 1); indexStr = `int vec4_idx = ${offsetOfProperty} + ${instanceSize} * instanceId + ${vec4SizeOfProperty} * idxOfArray;\n`; indexStr += `int scalar_idx = ${ // IndexOf4Bytes offsetOfProperty * 4 // IndexOf16bytes to IndexOf4Bytes } + ${instanceSizeInScalar} * instanceId + ${scalarSizeOfProperty} * idxOfArray;\n`; } let intStr = ''; if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int && info.compositionType !== _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Scalar) { intStr = 'i'; } let firstPartOfInnerFunc = ''; if (!isTexture && !info.needUniformInDataTextureMode) { firstPartOfInnerFunc += ` ${returnType} get_${methodName}(highp float _instanceId, const int idxOfArray) { int instanceId = int(_instanceId); ${indexStr} `; let str = `${varDef}\n${firstPartOfInnerFunc}`; switch (info.compositionType) { case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Vec4: case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Vec4Array: str += ' highp vec4 val = fetchElement(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Vec3: str += ' vec4 col0 = fetchElement(vec4_idx);\n'; str += ` highp ${intStr}vec3 val = ${intStr}vec3(col0.xyz);`; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Vec3Array: str += ' vec3 val = fetchVec3No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Vec2: str += ' highp vec4 col0 = fetchElement(vec4_idx);\n'; str += ` highp ${intStr}vec2 val = ${intStr}vec2(col0.xy);`; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Vec2Array: str += ' highp vec2 val = fetchVec2No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Scalar: str += ' vec4 col0 = fetchElement(vec4_idx);\n'; if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int) { str += ' int val = int(col0.x);'; } else if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Bool) { str += ' bool val = bool(col0.x);'; } else { str += ' float val = col0.x;'; } break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.ScalarArray: str += ' float col0 = fetchScalarNo16BytesAligned(scalar_idx);\n'; if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Int) { str += ' int val = int(col0);'; } else if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Bool) { str += ' bool val = bool(col0);'; } else { str += ' float val = col0;'; } break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat4: str += ' mat4 val = fetchMat4(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat4Array: str += ' mat4 val = fetchMat4(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat3: str += ' mat3 val = fetchMat3(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat3Array: str += ' mat3 val = fetchMat3No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat2: str += ' mat2 val = fetchMat2(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat2Array: str += ' mat2 val = fetchMat2No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_9__.CompositionType.Mat4x3Array: str += ' mat4x3 val = fetchMat4x3(vec4_idx);\n'; break; default: // Logger.error('unknown composition type', info.compositionType.str, memberName); str += ''; } str += ` return val; } `; return str; } else if (!isTexture && info.needUniformInDataTextureMode) { if (!isWebGL2 && info.arrayLength) { return `\n${varDef}\n`; } else { let varIndexStr = ''; if (info.arrayLength) { varIndexStr = '[idxOfArray]'; } const str = `${varDef} ${returnType} get_${methodName}(highp float _instanceId, const int idxOfArray) { return u_${methodName}${varIndexStr}; } `; return str; } } else { return varDef; } } static getOffsetOfPropertyInShader(isGlobalData, propertyName, materialTypeName) { if (isGlobalData) { const globalDataRepository = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__.GlobalDataRepository.getInstance(); const dataBeginPos = globalDataRepository.getLocationOffsetOfProperty(propertyName); return dataBeginPos; } else { const dataBeginPos = _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_23__.MaterialRepository.getLocationOffsetOfMemberOfMaterial(materialTypeName, propertyName); return dataBeginPos; } } $load(meshComponent) { const mesh = meshComponent.mesh; if (mesh == null) { _foundation_components_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_5__.MeshComponent.alertNoMeshSet(meshComponent); return false; } WebGLStrategyDataTexture.__currentComponentSIDs = WebGLStrategyDataTexture.__globalDataRepository.getValue('currentComponentSIDs', 0); // update VBO and VAO if (!mesh.isSetUpDone()) { this.deleteDataTexture(); // delete data texture to recreate one on next (0,_foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_24__.updateVBOAndVAO)(mesh); } return true; } __createAndUpdateDataTexture() { const memoryManager = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance(); // the GPU global Storage const gpuInstanceDataBuffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_4__.BufferUse.GPUInstanceData); const glw = this.__webglResourceRepository.currentWebGLContextWrapper; const uboTotalSize = glw.getAlignedMaxUniformBlockSize(); const startOffsetOfDataTextureOnGPUInstanceData = this.__isUboUse() ? uboTotalSize : 0; if (gpuInstanceDataBuffer == null) { return; } // const morphBuffer = memoryManager.getBuffer(BufferUse.GPUVertexData); // if all the necessary data fits in the UBO, then no data textures will be created. // if ( // this.__isUboUse() && // DataUtil.addPaddingBytes(gpuInstanceDataBuffer.takenSizeInByte, 4) + // DataUtil.addPaddingBytes(morphBuffer!.takenSizeInByte, 4) < // uboTotalSize // ) { // return; // } const dataTextureByteSize = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength * _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferHeightLength * 4 * 4; if (this.__dataTextureUid !== _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const bufferSizeForDataTextureInByte = gpuInstanceDataBuffer.takenSizeInByte - startOffsetOfDataTextureOnGPUInstanceData; const height = Math.min(Math.ceil(bufferSizeForDataTextureInByte / _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength / 4 / 4), _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferHeightLength); const updateByteSize = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength * height * 4 * 4; if (bufferSizeForDataTextureInByte > dataTextureByteSize) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_29__.Logger.warn('The buffer size exceeds the size of the data texture.'); } const floatDataTextureBuffer = new Float32Array(gpuInstanceDataBuffer.getArrayBuffer(), startOffsetOfDataTextureOnGPUInstanceData, updateByteSize / 4); this.__webglResourceRepository.updateTexture(this.__dataTextureUid, floatDataTextureBuffer, { level: 0, xoffset: 0, yoffset: 0, width: _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength, height: height, format: _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_2__.PixelFormat.RGBA, type: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, }); // debug if (!WebGLStrategyDataTexture.__isDebugOperationToDataTextureBufferDone) { _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_18__.MiscUtil.downloadTypedArray('Rhodonite_dataTextureBuffer.bin', floatDataTextureBuffer); WebGLStrategyDataTexture.__isDebugOperationToDataTextureBufferDone = true; } } else { const morphBuffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_4__.BufferUse.GPUVertexData); let morphBufferTakenSizeInByte = 0; let morphBufferArrayBuffer = new ArrayBuffer(0); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_21__.Is.exist(morphBuffer)) { morphBufferTakenSizeInByte = morphBuffer.takenSizeInByte; morphBufferArrayBuffer = morphBuffer.getArrayBuffer(); } let floatDataTextureBuffer; { const morphBuffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_4__.BufferUse.GPUVertexData); // the size of morph buffer. let morphBufferTakenSizeInByte = 0; if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_21__.Is.exist(morphBuffer)) { morphBufferTakenSizeInByte = morphBuffer.takenSizeInByte; } // the arraybuffer of morph buffer. let morphBufferArrayBuffer = new ArrayBuffer(0); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_21__.Is.exist(morphBuffer)) { morphBufferArrayBuffer = morphBuffer.getArrayBuffer(); } // the DataTexture size (GPU global storage size - UBO space size) const actualSpaceForDataTextureInByte = gpuInstanceDataBuffer.takenSizeInByte - startOffsetOfDataTextureOnGPUInstanceData; // spare padding texel for texture alignment (to edge of the width of texture) const paddingSpaceTexel = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength - ((actualSpaceForDataTextureInByte / 4 / 4) % _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength); const paddingSpaceBytes = paddingSpaceTexel * 4 * 4; const finalArrayBuffer = _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_18__.MiscUtil.concatArrayBuffers2({ finalSize: dataTextureByteSize, srcs: [gpuInstanceDataBuffer.getArrayBuffer(), morphBufferArrayBuffer], srcsCopySize: [ // final size = actualSpaceForDataTextureInByte + paddingSpaceBytes, morphBufferTakenSizeInByte, ], srcsOffset: [startOffsetOfDataTextureOnGPUInstanceData, 0], }); // warning if the used memory exceeds the size of the data texture. if (actualSpaceForDataTextureInByte + paddingSpaceBytes + morphBufferTakenSizeInByte > dataTextureByteSize) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_29__.Logger.warn('The buffer size exceeds the size of the data texture.'); } floatDataTextureBuffer = new Float32Array(finalArrayBuffer); _foundation_core_Config__WEBPACK_IMPORTED_MODULE_14__.Config.totalSizeOfGPUShaderDataStorageExceptMorphData = gpuInstanceDataBuffer.takenSizeInByte + paddingSpaceBytes; } // write data this.__dataTextureUid = this.__webglResourceRepository.createTextureFromTypedArray(floatDataTextureBuffer, { level: 0, internalFormat: _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_28__.TextureFormat.RGBA32F, width: _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferWidthLength, height: _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.bufferHeightLength, border: 0, format: _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_2__.PixelFormat.RGBA, type: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_3__.ComponentType.Float, generateMipmap: false, }); } } deleteDataTexture() { if (this.__dataTextureUid != null) { this.__webglResourceRepository.deleteTexture(this.__dataTextureUid); this.__dataTextureUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid; } } prerender() { if (_foundation_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_27__.AnimationComponent.isAnimating || _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_26__.TransformComponent.updateCount !== this.__lastTransformComponentsUpdateCount || _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent.updateCount !== this.__lastSceneGraphComponentsUpdateCount || _foundation_components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_25__.CameraControllerComponent.updateCount !== this.__lastCameraComponentsUpdateCount || _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_8__.Material.stateVersion !== this.__lastMaterialsUpdateCount) { // Setup GPU Storage (Data Texture & UBO) this.__createAndUpdateDataTexture(); this.__createAndUpdateUBO(); this.__lastTransformComponentsUpdateCount = _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_26__.TransformComponent.updateCount; this.__lastSceneGraphComponentsUpdateCount = _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_11__.SceneGraphComponent.updateCount; this.__lastCameraComponentsUpdateCount = _foundation_components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_25__.CameraControllerComponent.updateCount; this.__lastMaterialsUpdateCount = _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_8__.Material.stateVersion; } this.__lightComponents = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_13__.ComponentRepository.getComponentsWithType(_foundation_components_Light_LightComponent__WEBPACK_IMPORTED_MODULE_22__.LightComponent); } __isUboUse() { return (this.__webglResourceRepository.currentWebGLContextWrapper.isWebGL2 && _foundation_core_Config__WEBPACK_IMPORTED_MODULE_14__.Config.isUboEnabled); } __createAndUpdateUBO() { if (this.__isUboUse()) { const glw = this.__webglResourceRepository.currentWebGLContextWrapper; const alignedMaxUniformBlockSize = glw.getAlignedMaxUniformBlockSize(); const maxConventionBlocks = glw.getMaxConventionUniformBlocks(); const memoryManager = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance(); const buffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_4__.BufferUse.GPUInstanceData); if (this.__dataUBOUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_7__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { this.__dataUBOUid = this.__webglResourceRepository.setupUniformBufferDataArea(new Float32Array(buffer.getArrayBuffer())); } else { const array = new Float32Array(buffer.getArrayBuffer()); this.__webglResourceRepository.updateUniformBuffer(this.__dataUBOUid, array, 0, (alignedMaxUniformBlockSize * maxConventionBlocks) / 4 // (4 bytes unit) ); } } } attachGPUData(primitive) { } attachGPUDataInner(gl, shaderProgram) { } attachVertexData(i, primitive, glw, instanceIDBufferUid) { } attachVertexDataInner(mesh, primitive, primitiveIndex, glw, instanceIDBufferUid) { const vertexHandles = primitive.vertexHandles; const gl = glw.getRawContext(); // bind const vao = this.__webglResourceRepository.getWebGLResource(mesh.getVaoUids(primitiveIndex)); if (vao != null) { glw.bindVertexArray(vao); } else { this.__webglResourceRepository.setVertexDataToPipeline(vertexHandles, primitive, mesh._variationVBOUid); const ibo = this.__webglResourceRepository.getWebGLResource(vertexHandles.iboHandle); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo); } } static getInstance() { if (!this.__instance) { this.__instance = new WebGLStrategyDataTexture(); const rnXRModule = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_20__.ModuleManager.getInstance().getModule('xr'); const webxrSystem = rnXRModule.WebXRSystem.getInstance(); WebGLStrategyDataTexture.__webxrSystem = webxrSystem; } return this.__instance; } __setCurrentComponentSIDsForEachDisplayIdx(renderPass, displayIdx, isVRMainPass) { if (isVRMainPass) { let cameraComponentSid = -1; const webxrSystem = WebGLStrategyDataTexture.__webxrSystem; if (webxrSystem.isWebXRMode) { if (webxrSystem.isMultiView()) { cameraComponentSid = webxrSystem._getCameraComponentSIDAt(0); } else { cameraComponentSid = webxrSystem._getCameraComponentSIDAt(displayIdx); } } WebGLStrategyDataTexture.__currentComponentSIDs._v[_foundation_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_17__.WellKnownComponentTIDs.CameraComponentTID] = cameraComponentSid; } else { // Non-VR Rendering let cameraComponent = renderPass.cameraComponent; if (cameraComponent == null) { // if the renderPass has no cameraComponent, try to get the current cameraComponent cameraComponent = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_13__.ComponentRepository.getComponent(_foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_15__.CameraComponent, _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_15__.CameraComponent.current); } if (cameraComponent) { WebGLStrategyDataTexture.__currentComponentSIDs._v[_foundation_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_17__.WellKnownComponentTIDs.CameraComponentTID] = cameraComponent.componentSID; } else { WebGLStrategyDataTexture.__currentComponentSIDs._v[_foundation_components_WellKnownComponentTIDs__WEBPACK_IMPORTED_MODULE_17__.WellKnownComponentTIDs.CameraComponentTID] = -1; } } } __setCurrentComponentSIDsForEachPrimitive(gl, material, shaderProgram) { if (WebGLStrategyDataTexture.__currentComponentSIDs == null) { WebGLStrategyDataTexture.__currentComponentSIDs = WebGLStrategyDataTexture.__globalDataRepository.getValue('currentComponentSIDs', 0); } WebGLStrategyDataTexture.__currentComponentSIDs._v[0] = material.materialSID; } common_$render(primitiveUids, renderPass, renderPassTickCount) { if (typeof spector !== 'undefined') { spector.setMarker('| | DataTexture:common_$render#'); } const glw = this.__webglResourceRepository.currentWebGLContextWrapper; const gl = glw.getRawContextAsWebGL2(); if (renderPass.isBufferLessRenderingMode()) { this.__renderWithoutBuffers(gl, renderPass); return true; } let renderedSomething = false; // For opaque primitives if (renderPass._toRenderOpaquePrimitives) { if (!renderPass.depthWriteMask) { gl.depthMask(false); } for (let i = 0; i <= renderPass._lastOpaqueIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.__renderInner(primitiveUid, glw, renderPass); renderedSomething || (renderedSomething = rendered); } } // For translucent primitives if (renderPass._toRenderTransparentPrimitives) { for (let i = renderPass._lastOpaqueIndex + 1; i <= renderPass._lastTranslucentIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.__renderInner(primitiveUid, glw, renderPass); renderedSomething || (renderedSomething = rendered); } if (!_foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_12__.MeshRendererComponent.isDepthMaskTrueForBlendPrimitives) { // disable depth write for blend primitives gl.depthMask(false); } for (let i = renderPass._lastTranslucentIndex + 1; i <= renderPass._lastBlendIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.__renderInner(primitiveUid, glw, renderPass); renderedSomething || (renderedSomething = rendered); } } gl.depthMask(true); this.__lastRenderPassTickCount = renderPassTickCount; // this.__webglResourceRepository.unbindTextureSamplers(); return renderedSomething; } __renderWithoutBuffers(gl, renderPass) { // setup shader program const material = renderPass.material; const primitive = renderPass._dummyPrimitiveForBufferLessRendering; (0,_WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__.setupShaderProgram)(material, primitive, this); const shaderProgramUid = material.getShaderProgramUid(primitive); const shaderProgram = this.__webglResourceRepository.getWebGLResource(shaderProgramUid); gl.useProgram(shaderProgram); this.__lastShader = shaderProgramUid; // Bind DataTexture this.bindDataTexture(gl, shaderProgram); this.__setCurrentComponentSIDsForEachPrimitive(gl, material, shaderProgram); gl.uniform1fv(shaderProgram.currentComponentSIDs, WebGLStrategyDataTexture.__currentComponentSIDs._v); const isVRMainPass = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].isVrMainPass(renderPass); if (shaderProgram.vrState != null && isVRMainPass) { const vrState = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__.GlobalDataRepository.getInstance().getValue('vrState', 0); vrState._v[0] = isVRMainPass ? 1 : 0; vrState._v[1] = 0; shaderProgram._gl.uniform2iv(shaderProgram.vrState, vrState._v); } _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].setWebGLParameters(material, gl); material._setParametersToGpuWebGLWithOutInternalSetting({ shaderProgram, firstTime: true, isUniformMode: false, }); if (renderPass.depthWriteMask) { gl.depthMask(true); } else { gl.depthMask(false); } this.__webglResourceRepository.setViewport(renderPass.getViewport()); gl.drawArrays(renderPass._primitiveModeForBufferLessRendering.index, 0, renderPass._drawVertexNumberForBufferLessRendering); } __renderInner(primitiveUid, glw, renderPass) { var _a; const gl = glw.getRawContextAsWebGL2(); const primitive = _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_6__.Primitive.getPrimitive(primitiveUid); if (primitive == null) { return false; } const mesh = primitive.mesh; const entity = mesh.meshEntitiesInner[0]; // get base mesh for instancing draw // setup shader program const material = renderPass.getAppropriateMaterial(primitive); (0,_WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__.setupShaderProgram)(material, primitive, this); const meshRendererComponent = entity.getMeshRenderer(); const primitiveIndex = mesh.getPrimitiveIndexInMesh(primitive); this.attachVertexDataInner(mesh, primitive, primitiveIndex, glw, mesh._variationVBOUid); let firstTime = false; const shaderProgramUid = material.getShaderProgramUid(primitive); if (shaderProgramUid !== this.__lastShader || gl.__changedProgram) { if ((0,_foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_24__.isSkipDrawing)(material, primitive)) { return false; } const shaderProgram = this.__webglResourceRepository.getWebGLResource(shaderProgramUid); gl.useProgram(shaderProgram); gl.__changedProgram = false; // Bind DataTexture this.bindDataTexture(gl, shaderProgram); // gl.uniform1i((shaderProgram as any).isMainVr, isVRMainPass ? 1 : 0); // VR MultiView is not supported yet WebGLStrategyDataTexture.__shaderProgram = shaderProgram; firstTime = true; } if (((_a = this.__lastMaterial) === null || _a === void 0 ? void 0 : _a.deref()) !== material) { firstTime = true; this.__lastMaterial = new WeakRef(material); } if (this.__lastMaterialStateVersion !== material.stateVersion) { firstTime = true; this.__lastMaterialStateVersion = material.stateVersion; } const isVRMainPass = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].isVrMainPass(renderPass); if (firstTime) { this.__setCurrentComponentSIDsForEachPrimitive(gl, material, WebGLStrategyDataTexture.__shaderProgram); _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].setWebGLParameters(material, gl); material._setParametersToGpuWebGL({ material: material, shaderProgram: WebGLStrategyDataTexture.__shaderProgram, firstTime: firstTime, args: { glw: glw, entity: entity, worldMatrix: entity.getSceneGraph().matrixInner, normalMatrix: entity.getSceneGraph().normalMatrixInner, isBillboard: entity.getSceneGraph().isBillboard, lightComponents: this.__lightComponents, renderPass: renderPass, primitive: primitive, diffuseCube: meshRendererComponent.diffuseCubeMap, specularCube: meshRendererComponent.specularCubeMap, setUniform: false, isVr: isVRMainPass, displayIdx: -1, }, }); } const displayCount = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].getDisplayCount(isVRMainPass, WebGLStrategyDataTexture.__webxrSystem); for (let displayIdx = 0; displayIdx < displayCount; displayIdx++) { if (isVRMainPass) { _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_19__["default"].setVRViewport(renderPass, displayIdx); } this.__setCurrentComponentSIDsForEachDisplayIdx(renderPass, displayIdx, isVRMainPass); gl.uniform1fv(WebGLStrategyDataTexture.__shaderProgram.currentComponentSIDs, WebGLStrategyDataTexture.__currentComponentSIDs._v); if (WebGLStrategyDataTexture.__shaderProgram.vrState != null && isVRMainPass && displayCount > 1) { const vrState = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__.GlobalDataRepository.getInstance().getValue('vrState', 0); vrState._v[0] = isVRMainPass ? 1 : 0; vrState._v[1] = displayIdx; WebGLStrategyDataTexture.__shaderProgram._gl.uniform2iv(WebGLStrategyDataTexture.__shaderProgram.vrState, vrState._v); } if (primitive.indicesAccessor) { gl.drawElementsInstanced(primitive.primitiveMode.index, primitive.indicesAccessor.elementCount, primitive.indicesAccessor.componentType.index, 0, mesh.meshEntitiesInner.length); } else { gl.drawArraysInstanced(primitive.primitiveMode.index, 0, primitive.getVertexCountAsVerticesBased(), mesh.meshEntitiesInner.length); } } this.__lastShader = shaderProgramUid; return true; } bindDataTexture(gl, shaderProgram) { gl.uniform1i(shaderProgram.dataTexture, 7); this.__webglResourceRepository.bindTexture2D(7, this.__dataTextureUid); const samplerUid = this.__webglResourceRepository.createOrGetTextureSamplerRepeatNearest(); this.__webglResourceRepository.bindTextureSampler(7, samplerUid); } } WebGLStrategyDataTexture.__globalDataRepository = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_16__.GlobalDataRepository.getInstance(); WebGLStrategyDataTexture.__isDebugOperationToDataTextureBufferDone = true; /***/ }), /***/ "./src/webgl/WebGLStrategyUniform.ts": /*!*******************************************!*\ !*** ./src/webgl/WebGLStrategyUniform.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGLStrategyUniform: () => (/* binding */ WebGLStrategyUniform) /* harmony export */ }); /* harmony import */ var _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/definitions/ShaderSemantics */ "./src/foundation/definitions/ShaderSemantics.ts"); /* harmony import */ var _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _foundation_components_Light_LightComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/components/Light/LightComponent */ "./src/foundation/components/Light/LightComponent.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/components/MeshRenderer/MeshRendererComponent */ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../foundation/definitions/ShaderType */ "./src/foundation/definitions/ShaderType.ts"); /* harmony import */ var _foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../foundation/definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../foundation/core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../foundation/misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./WebGLStrategyCommonMethod */ "./src/webgl/WebGLStrategyCommonMethod.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../foundation/renderer/RenderingCommonMethods */ "./src/foundation/renderer/RenderingCommonMethods.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _foundation_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../foundation/components/Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../foundation/definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); class WebGLStrategyUniform { constructor() { this.__webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_0__.WebGLResourceRepository.getInstance(); this.__dataTextureUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__lastShader = -1; this.__lastRenderPassTickCount = -1; } /** * setup shader program for the material in this WebGL strategy * @param material - a material to setup shader program */ setupShaderForMaterial(material, primitive) { const webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_0__.WebGLResourceRepository.getInstance(); const glw = webglResourceRepository.currentWebGLContextWrapper; const [programUid, newOne] = material._createProgramWebGL(WebGLStrategyUniform.__vertexShaderMethodDefinitions_uniform, _foundation_definitions_ShaderSemantics__WEBPACK_IMPORTED_MODULE_3__.ShaderSemantics.getShaderProperty, primitive, glw.isWebGL2); if (newOne) { material._setupBasicUniformsLocations(primitive); material._setUniformLocationsOfMaterialNodes(true, primitive); const shaderSemanticsInfos = WebGLStrategyUniform.componentMatrices; const shaderSemanticsInfosPointSprite = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].getPointSpriteShaderSemanticsInfoArray(); material._setupAdditionalUniformLocations(shaderSemanticsInfos.concat(shaderSemanticsInfosPointSprite), true, primitive); WebGLStrategyUniform.__globalDataRepository._setUniformLocationsForUniformModeOnly(material.getShaderProgramUid(primitive)); } return programUid; } /** * re-setup shader program for the material in this WebGL strategy * @param material - a material to re-setup shader program * @param updatedShaderSources - updated shader sources * @param onError - callback function to handle error * @returns */ _reSetupShaderForMaterialBySpector(material, updatedShaderSources, onError) { const [programUid, newOne] = material._createProgramByUpdatedSources(updatedShaderSources, onError); if (programUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { return programUid; } if (newOne) { material._setupBasicUniformsLocations(); material._setUniformLocationsOfMaterialNodes(true); const shaderSemanticsInfos = WebGLStrategyUniform.componentMatrices; const shaderSemanticsInfosPointSprite = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].getPointSpriteShaderSemanticsInfoArray(); material._setupAdditionalUniformLocations(shaderSemanticsInfos.concat(shaderSemanticsInfosPointSprite), true); } WebGLStrategyUniform.__globalDataRepository._setUniformLocationsForUniformModeOnly(material.getShaderProgramUid()); return programUid; } $load(meshComponent) { const mesh = meshComponent.mesh; if (!_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_17__.Is.exist(mesh)) { return false; } // setup VBO and VAO if (!mesh.isSetUpDone()) { (0,_foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_18__.updateVBOAndVAO)(mesh); } return true; } prerender() { this.__lightComponents = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_4__.ComponentRepository.getComponentsWithType(_foundation_components_Light_LightComponent__WEBPACK_IMPORTED_MODULE_5__.LightComponent); // Setup Data Texture if (this.__dataTextureUid === _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const memoryManager = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.getInstance(); const buffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_13__.BufferUse.GPUVertexData); if (buffer == null) { return; } if (buffer.takenSizeInByte / _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.bufferWidthLength / 4 > _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.bufferHeightLength) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_22__.Logger.warn('The buffer size exceeds the size of the data texture.'); } const dataTextureByteSize = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.bufferWidthLength * _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.bufferHeightLength * 4 * 4; const concatArrayBuffer = _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_15__.MiscUtil.concatArrayBuffers2({ finalSize: dataTextureByteSize, srcs: [buffer.getArrayBuffer()], srcsCopySize: [buffer.takenSizeInByte], srcsOffset: [0], }); const floatDataTextureBuffer = new Float32Array(concatArrayBuffer); this.__dataTextureUid = this.__webglResourceRepository.createTextureFromTypedArray(floatDataTextureBuffer, { level: 0, internalFormat: _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_21__.TextureFormat.RGBA32F, width: _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.bufferWidthLength, height: _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_11__.MemoryManager.bufferHeightLength, border: 0, format: _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_7__.PixelFormat.RGBA, type: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_8__.ComponentType.Float, generateMipmap: false, }); } } attachGPUData(primitive) { } attachVertexData(i, primitive, glw, instanceIDBufferUid) { } attachVertexDataInner(mesh, primitive, primitiveUid, glw, instanceIDBufferUid) { const vaoHandles = primitive.vertexHandles; const vao = this.__webglResourceRepository.getWebGLResource(mesh.getVaoUidsByPrimitiveUid(primitiveUid)); const gl = glw.getRawContext(); if (vao != null) { glw.bindVertexArray(vao); } else { this.__webglResourceRepository.setVertexDataToPipeline(vaoHandles, primitive, instanceIDBufferUid); const ibo = this.__webglResourceRepository.getWebGLResource(vaoHandles.iboHandle); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo); } } dettachVertexData(glw) { const gl = glw.getRawContext(); if (glw.bindVertexArray) { glw.bindVertexArray(null); } gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); gl.bindBuffer(gl.ARRAY_BUFFER, null); } static getInstance() { if (!this.__instance) { this.__instance = new WebGLStrategyUniform(); const rnXRModule = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_19__.ModuleManager.getInstance().getModule('xr'); const webxrSystem = rnXRModule.WebXRSystem.getInstance(); WebGLStrategyUniform.__webxrSystem = webxrSystem; } return this.__instance; } common_$render(primitiveUids, renderPass, renderPassTickCount) { if (typeof spector !== 'undefined') { spector.setMarker('| | Uniform:$render#'); } const glw = this.__webglResourceRepository.currentWebGLContextWrapper; const gl = glw.getRawContextAsWebGL2(); if (renderPass.isBufferLessRenderingMode()) { this.__renderWithoutBuffers(gl, renderPass); return true; } let renderedSomething = false; // For opaque primitives if (renderPass._toRenderOpaquePrimitives) { if (!renderPass.depthWriteMask) { gl.depthMask(false); } for (let i = 0; i <= renderPass._lastOpaqueIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.renderInner(primitiveUid, glw, renderPass, renderPassTickCount); renderedSomething || (renderedSomething = rendered); } } // For translucent primitives if (renderPass._toRenderTransparentPrimitives) { for (let i = renderPass._lastOpaqueIndex + 1; i <= renderPass._lastTranslucentIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.renderInner(primitiveUid, glw, renderPass, renderPassTickCount); renderedSomething || (renderedSomething = rendered); } if (!_foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_9__.MeshRendererComponent.isDepthMaskTrueForBlendPrimitives) { // disable depth write for blend primitives gl.depthMask(false); } for (let i = renderPass._lastTranslucentIndex + 1; i <= renderPass._lastBlendIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.renderInner(primitiveUid, glw, renderPass, renderPassTickCount); renderedSomething || (renderedSomething = rendered); } } gl.depthMask(true); this.__webglResourceRepository.unbindTextureSamplers(); return renderedSomething; } __renderWithoutBuffers(gl, renderPass) { // setup shader program const material = renderPass.material; const primitive = renderPass._dummyPrimitiveForBufferLessRendering; (0,_WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__.setupShaderProgram)(material, primitive, this); const shaderProgramUid = material.getShaderProgramUid(primitive); const shaderProgram = this.__webglResourceRepository.getWebGLResource(shaderProgramUid); gl.useProgram(shaderProgram); this.__lastShader = shaderProgramUid; this.bindDataTexture(gl, shaderProgram); _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].setWebGLParameters(material, gl); material._setParametersToGpuWebGLWithOutInternalSetting({ shaderProgram, firstTime: true, isUniformMode: true, }); const isVrMainPass = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].isVrMainPass(renderPass); if (shaderProgram.vrState != null && isVrMainPass) { const vrState = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_14__.GlobalDataRepository.getInstance().getValue('vrState', 0); vrState._v[0] = isVrMainPass ? 1 : 0; vrState._v[1] = 0; shaderProgram._gl.uniform2iv(shaderProgram.vrState, vrState._v); } if (renderPass.depthWriteMask) { gl.depthMask(true); } else { gl.depthMask(false); } this.__webglResourceRepository.setViewport(renderPass.getViewport()); gl.drawArrays(renderPass._primitiveModeForBufferLessRendering.index, 0, renderPass._drawVertexNumberForBufferLessRendering); } renderInner(primitiveUid, glw, renderPass, renderPassTickCount) { var _a, _b, _c; const gl = glw.getRawContext(); const primitive = _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_1__.Primitive.getPrimitive(primitiveUid); if (primitive == null) { return false; } const material = renderPass.getAppropriateMaterial(primitive); (0,_WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__.setupShaderProgram)(material, primitive, this); const mesh = primitive.mesh; const meshEntities = mesh.meshEntitiesInner; let renderedSomething = false; const isVrMainPass = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].isVrMainPass(renderPass); const displayCount = _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].getDisplayCount(isVrMainPass, WebGLStrategyUniform.__webxrSystem); for (const entity of meshEntities) { if (entity.getSceneGraph()._isCulled) { continue; } const meshComponent = entity.getMesh(); this.attachVertexDataInner(meshComponent.mesh, primitive, primitiveUid, glw, _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_2__.CGAPIResourceRepository.InvalidCGAPIResourceUid); const shaderProgramUid = material.getShaderProgramUid(primitive); const shaderProgram = this.__webglResourceRepository.getWebGLResource(shaderProgramUid); let firstTime = true; if (shaderProgramUid !== this.__lastShader || gl.__changedProgram) { if ((0,_foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_18__.isSkipDrawing)(material, primitive)) { return false; } firstTime = true; gl.__changedProgram = false; gl.useProgram(shaderProgram); this.bindDataTexture(gl, shaderProgram); if (_foundation_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_20__.AnimationComponent.isAnimating) { const time = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_14__.GlobalDataRepository.getInstance().getValue('time', 0); shaderProgram._gl.uniform1f(shaderProgram.time, time._v[0]); } this.__lastShader = shaderProgramUid; } if (((_a = this.__lastMaterial) === null || _a === void 0 ? void 0 : _a.deref()) !== material) { firstTime = true; this.__lastMaterial = new WeakRef(material); } for (let displayIdx = 0; displayIdx < displayCount; displayIdx++) { if (isVrMainPass) { _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].setVRViewport(renderPass, displayIdx); } if (firstTime) { _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_16__["default"].setWebGLParameters(material, gl); material._setParametersToGpuWebGL({ material, shaderProgram, firstTime, args: { setUniform: true, glw: glw, entity, primitive: primitive, worldMatrix: entity.getSceneGraph().matrix, normalMatrix: entity.getSceneGraph().normalMatrix, isBillboard: entity.getSceneGraph().isBillboard, lightComponents: this.__lightComponents, renderPass: renderPass, diffuseCube: (_b = entity.tryToGetMeshRenderer()) === null || _b === void 0 ? void 0 : _b.diffuseCubeMap, specularCube: (_c = entity.tryToGetMeshRenderer()) === null || _c === void 0 ? void 0 : _c.specularCubeMap, isVr: isVrMainPass, displayIdx, }, }); } if (shaderProgram.vrState != null && isVrMainPass) { const vrState = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_14__.GlobalDataRepository.getInstance().getValue('vrState', 0); vrState._v[0] = isVrMainPass ? 1 : 0; vrState._v[1] = displayIdx; shaderProgram._gl.uniform2iv(shaderProgram.vrState, vrState._v); } if (primitive.indicesAccessor) { gl.drawElements(primitive.primitiveMode.index, primitive.indicesAccessor.elementCount, primitive.indicesAccessor.componentType.index, 0); } else { gl.drawArrays(primitive.primitiveMode.index, 0, primitive.getVertexCountAsVerticesBased()); } } renderedSomething = true; } return renderedSomething; } bindDataTexture(gl, shaderProgram) { gl.uniform1i(shaderProgram.dataTexture, 7); this.__webglResourceRepository.bindTexture2D(7, this.__dataTextureUid); const samplerUid = this.__webglResourceRepository.createOrGetTextureSamplerRepeatNearest(); this.__webglResourceRepository.bindTextureSampler(7, samplerUid); } } WebGLStrategyUniform.__globalDataRepository = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_14__.GlobalDataRepository.getInstance(); WebGLStrategyUniform.componentMatrices = [ { semantic: 'vertexAttributesExistenceArray', compositionType: _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_10__.CompositionType.ScalarArray, componentType: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_8__.ComponentType.Int, stage: _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.VertexShader, min: 0, max: 1, isInternalSetting: true, }, { semantic: 'worldMatrix', compositionType: _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_10__.CompositionType.Mat4, componentType: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_8__.ComponentType.Float, stage: _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, }, { semantic: 'normalMatrix', compositionType: _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_10__.CompositionType.Mat3, componentType: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_8__.ComponentType.Float, stage: _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, }, { semantic: 'isBillboard', compositionType: _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_10__.CompositionType.Scalar, componentType: _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_8__.ComponentType.Bool, stage: _foundation_definitions_ShaderType__WEBPACK_IMPORTED_MODULE_12__.ShaderType.VertexShader, min: -Number.MAX_VALUE, max: Number.MAX_VALUE, isInternalSetting: true, }, ]; WebGLStrategyUniform.__vertexShaderMethodDefinitions_uniform = `uniform mat4 u_worldMatrix; uniform mat3 u_normalMatrix; uniform bool u_isBillboard; mat4 get_worldMatrix(float instanceId) { return u_worldMatrix; } mat3 get_normalMatrix(float instanceId) { return u_normalMatrix; } bool get_isVisible(float instanceId) { return true; // visibility is handled in CPU side in WebGLStrategyUniform, so this is dummy value. } bool get_isBillboard(float instanceId) { return u_isBillboard; } #ifdef RN_IS_VERTEX_SHADER # ifdef RN_IS_MORPHING vec3 get_position(float vertexId, vec3 basePosition) { vec3 position = basePosition; int scalar_idx = 3 * int(vertexId); #ifdef GLSL_ES3 int posIn4bytes = scalar_idx % 4; #else int posIn4bytes = int(mod(float(scalar_idx), 4.0)); #endif for (int i=0; i<${_foundation_core_Config__WEBPACK_IMPORTED_MODULE_6__.Config.maxVertexMorphNumberInShader}; i++) { int basePosIn16bytes = u_dataTextureMorphOffsetPosition[i] + (scalar_idx - posIn4bytes)/4; vec3 addPos = vec3(0.0); if (posIn4bytes == 0) { vec4 val = fetchElement(basePosIn16bytes); addPos = val.xyz; } else if (posIn4bytes == 1) { vec4 val0 = fetchElement(basePosIn16bytes); addPos = vec3(val0.yzw); } else if (posIn4bytes == 2) { vec4 val0 = fetchElement(basePosIn16bytes); vec4 val1 = fetchElement(basePosIn16bytes+1); addPos = vec3(val0.zw, val1.x); } else if (posIn4bytes == 3) { vec4 val0 = fetchElement(basePosIn16bytes); vec4 val1 = fetchElement(basePosIn16bytes+1); addPos = vec3(val0.w, val1.xy); } // int index = u_dataTextureMorphOffsetPosition[i] + 1 * int(vertexId); // vec3 addPos = fetchElement(u_dataTexture, index, widthOfDataTexture, heightOfDataTexture).xyz; position += addPos * u_morphWeights[i]; if (i == u_morphTargetNumber-1) { break; } } return position; } # endif #endif `; /***/ }), /***/ "./src/webgl/getRenderingStrategy.ts": /*!*******************************************!*\ !*** ./src/webgl/getRenderingStrategy.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); const getRenderingStrategy = function (processApproach) { // Strategy const moduleName = 'webgl'; const moduleManager = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_1__.ModuleManager.getInstance(); const webglModule = moduleManager.getModule(moduleName); if (_foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.isDataTextureApproach(processApproach)) { return webglModule.WebGLStrategyDataTexture.getInstance(); } else if (_foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.isUniformApproach(processApproach)) { return webglModule.WebGLStrategyUniform.getInstance(); } return webglModule.WebGLStrategyUniform.getInstance(); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (getRenderingStrategy); /***/ }), /***/ "./src/webgl/index.ts": /*!****************************!*\ !*** ./src/webgl/index.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockBeginShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.BlockBeginShader), /* harmony export */ BlockEndShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.BlockEndShader), /* harmony export */ ClassicShadingShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.ClassicShadingShader), /* harmony export */ CommonShaderPart: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.CommonShaderPart), /* harmony export */ ConstantVariableShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.ConstantVariableShader), /* harmony export */ EndShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.EndShader), /* harmony export */ IfStatementShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.IfStatementShader), /* harmony export */ KTX2TextureLoader: () => (/* reexport safe */ _textureLoader_index__WEBPACK_IMPORTED_MODULE_10__.KTX2TextureLoader), /* harmony export */ TextureFetchShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.TextureFetchShader), /* harmony export */ UniformDataShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.UniformDataShader), /* harmony export */ VaryingVariableShader: () => (/* reexport safe */ _shaders_index__WEBPACK_IMPORTED_MODULE_9__.VaryingVariableShader), /* harmony export */ WebGLContextWrapper: () => (/* reexport safe */ _WebGLContextWrapper__WEBPACK_IMPORTED_MODULE_0__.WebGLContextWrapper), /* harmony export */ WebGLExtension: () => (/* reexport safe */ _WebGLExtension__WEBPACK_IMPORTED_MODULE_2__.WebGLExtension), /* harmony export */ WebGLResourceRepository: () => (/* reexport safe */ _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_3__.WebGLResourceRepository), /* harmony export */ WebGLStrategyDataTexture: () => (/* reexport safe */ _WebGLStrategyDataTexture__WEBPACK_IMPORTED_MODULE_6__.WebGLStrategyDataTexture), /* harmony export */ WebGLStrategyUniform: () => (/* reexport safe */ _WebGLStrategyUniform__WEBPACK_IMPORTED_MODULE_7__.WebGLStrategyUniform), /* harmony export */ setupShaderProgram: () => (/* reexport safe */ _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_5__.setupShaderProgram) /* harmony export */ }); /* harmony import */ var _WebGLContextWrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebGLContextWrapper */ "./src/webgl/WebGLContextWrapper.ts"); /* harmony import */ var _WebGLExtendedTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WebGLExtendedTypes */ "./src/webgl/WebGLExtendedTypes.ts"); /* harmony import */ var _WebGLExtension__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebGLExtension */ "./src/webgl/WebGLExtension.ts"); /* harmony import */ var _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _WebGLStrategy__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./WebGLStrategy */ "./src/webgl/WebGLStrategy.ts"); /* harmony import */ var _WebGLStrategyCommonMethod__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./WebGLStrategyCommonMethod */ "./src/webgl/WebGLStrategyCommonMethod.ts"); /* harmony import */ var _WebGLStrategyDataTexture__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./WebGLStrategyDataTexture */ "./src/webgl/WebGLStrategyDataTexture.ts"); /* harmony import */ var _WebGLStrategyUniform__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebGLStrategyUniform */ "./src/webgl/WebGLStrategyUniform.ts"); /* harmony import */ var _getRenderingStrategy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getRenderingStrategy */ "./src/webgl/getRenderingStrategy.ts"); /* harmony import */ var _shaders_index__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./shaders/index */ "./src/webgl/shaders/index.ts"); /* harmony import */ var _textureLoader_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textureLoader/index */ "./src/webgl/textureLoader/index.ts"); /* harmony import */ var _types_index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./types/index */ "./src/webgl/types/index.ts"); /***/ }), /***/ "./src/webgl/main.ts": /*!***************************!*\ !*** ./src/webgl/main.ts ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _getRenderingStrategy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getRenderingStrategy */ "./src/webgl/getRenderingStrategy.ts"); /* harmony import */ var _shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shaders/CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _WebGLContextWrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebGLContextWrapper */ "./src/webgl/WebGLContextWrapper.ts"); /* harmony import */ var _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _WebGLStrategyUniform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./WebGLStrategyUniform */ "./src/webgl/WebGLStrategyUniform.ts"); /* harmony import */ var _WebGLStrategyDataTexture__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./WebGLStrategyDataTexture */ "./src/webgl/WebGLStrategyDataTexture.ts"); const WebGL = Object.freeze({ getRenderingStrategy: _getRenderingStrategy__WEBPACK_IMPORTED_MODULE_0__["default"], CommonShaderPart: _shaders_CommonShaderPart__WEBPACK_IMPORTED_MODULE_1__.CommonShaderPart, WebGLContextWrapper: _WebGLContextWrapper__WEBPACK_IMPORTED_MODULE_2__.WebGLContextWrapper, WebGLResourceRepository: _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_3__.WebGLResourceRepository, WebGLStrategyUniform: _WebGLStrategyUniform__WEBPACK_IMPORTED_MODULE_4__.WebGLStrategyUniform, WebGLStrategyDataTexture: _WebGLStrategyDataTexture__WEBPACK_IMPORTED_MODULE_5__.WebGLStrategyDataTexture, }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WebGL); (0, eval)('this').RnWebGL = WebGL; /***/ }), /***/ "./src/webgl/shaders/CommonShaderPart.ts": /*!***********************************************!*\ !*** ./src/webgl/shaders/CommonShaderPart.ts ***! \***********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CommonShaderPart: () => (/* binding */ CommonShaderPart) /* harmony export */ }); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../foundation/definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WebGLResourceRepository */ "./src/webgl/WebGLResourceRepository.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _webgl_shaderity_shaders_common_prerequisites_glsl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/common/prerequisites.glsl */ "./src/webgl/shaderity_shaders/common/prerequisites.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_common_vertexInput_wgsl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/common/vertexInput.wgsl */ "./src/webgpu/shaderity_shaders/common/vertexInput.wgsl"); /* harmony import */ var _webgpu_shaderity_shaders_common_prerequisites_wgsl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/common/prerequisites.wgsl */ "./src/webgpu/shaderity_shaders/common/prerequisites.wgsl"); /* harmony import */ var _webgl_shaderity_shaders_common_mainPrerequisites_glsl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../webgl/shaderity_shaders/common/mainPrerequisites.glsl */ "./src/webgl/shaderity_shaders/common/mainPrerequisites.glsl"); /* harmony import */ var _webgpu_shaderity_shaders_common_mainPrerequisites_wgsl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../webgpu/shaderity_shaders/common/mainPrerequisites.wgsl */ "./src/webgpu/shaderity_shaders/common/mainPrerequisites.wgsl"); /* harmony import */ var _foundation_materials_core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../foundation/materials/core/AbstractShaderNode */ "./src/foundation/materials/core/AbstractShaderNode.ts"); class CommonShaderPart { constructor() { this.__webglResourceRepository = _WebGLResourceRepository__WEBPACK_IMPORTED_MODULE_2__.WebGLResourceRepository.getInstance(); } static getMainBegin(isVertexStage) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { if (isVertexStage) { let str = ` var output : VertexOutput; @vertex fn main( ${_webgpu_shaderity_shaders_common_vertexInput_wgsl__WEBPACK_IMPORTED_MODULE_5__["default"].code} ) -> VertexOutput { #ifdef RN_USE_INSTANCE a_instanceIds = instance_ids; #endif #ifdef RN_USE_POSITION a_position = vec3(position); #else a_position = vec3(0.0, 0.0, 0.0); #endif #ifdef RN_USE_NORMAL a_normal = normal; #endif #ifdef RN_USE_TEXCOORD_0 a_texcoord_0 = texcoord_0; #endif #ifdef RN_USE_COLOR_0 a_color_0 = vec4(color_0); #else a_color_0 = vec4(0.0, 0.0, 0.0, 1.0); #endif `; return str; } else { let str = ` var rt0: vec4 = vec4(0.0, 0.0, 0.0, 1.0); @fragment fn main( input: VertexOutput, @builtin(front_facing) isFront: bool, ) -> @location(0) vec4 { `; return str; } } else { return ` void main() { `; } } static getMainEnd(isVertexStage) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { if (isVertexStage) { return ` return output; } `; } else { return ` return rt0; } `; } } else { return ` } `; } } static getVertexPrerequisites(shaderNodes) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { const varyingVariables = CommonShaderPart.__makeVaryingVariablesWGSL(shaderNodes); let vertexShaderPrerequisites = ''; vertexShaderPrerequisites += ` /* shaderity: @{definitions} */ #define RN_IS_NODE_SHADER #ifdef RN_USE_INSTANCE var a_instanceIds: vec4; #endif var a_position: vec3; var a_normal: vec3; var a_texcoord_0: vec2; var a_color_0: vec4; struct VertexOutput { @builtin(position) position : vec4, ${varyingVariables} } ${_webgpu_shaderity_shaders_common_prerequisites_wgsl__WEBPACK_IMPORTED_MODULE_6__["default"].code} /* shaderity: @{getters} */ /* shaderity: @{matricesGetters} */ `; return vertexShaderPrerequisites; } else { let vertexShaderPrerequisites = ''; const in_ = 'in'; vertexShaderPrerequisites += ` #version 300 es precision highp float; precision highp int; ${_webgl_shaderity_shaders_common_prerequisites_glsl__WEBPACK_IMPORTED_MODULE_4__["default"].code} ${in_} vec4 a_instanceInfo;\n`; vertexShaderPrerequisites += ` uniform bool u_vertexAttributesExistenceArray[${_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_1__.VertexAttribute.AttributeTypeNumber}]; `; vertexShaderPrerequisites += '/* shaderity: @{matricesGetters} */'; vertexShaderPrerequisites += '/* shaderity: @{getters} */'; return vertexShaderPrerequisites; } } static __makeVaryingVariablesWGSL(shaderNodes) { const varyings = []; for (let i = 0; i < shaderNodes.length; i++) { const shaderNode = shaderNodes[i]; for (let j = 0; j < shaderNode.inputConnections.length; j++) { const inputConnection = shaderNode.inputConnections[j]; if (inputConnection == null) { continue; } const input = shaderNode.getInputs()[j]; const inputNode = _foundation_materials_core_AbstractShaderNode__WEBPACK_IMPORTED_MODULE_9__.AbstractShaderNode.getShaderNodeByUid(inputConnection.shaderNodeUid); if (inputNode.getShaderStage() === 'Vertex' && shaderNode.getShaderStage() === 'Fragment') { const type = input.compositionType.toWGSLType(input.componentType); varyings.push({ type: type, name: `${inputNode.shaderFunctionName}_${inputNode.shaderNodeUid}`, }); } } } varyings.sort((a, b) => { if (a.name < b.name) { return -1; } else { return 1; } }); let varyingVariables = ''; for (let i = 0; i < varyings.length; i++) { varyingVariables += `@location(${i}) ${varyings[i].name}: ${varyings[i].type},\n`; } return varyingVariables; } static getPixelPrerequisites(shaderNodes) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { const varyingVariables = CommonShaderPart.__makeVaryingVariablesWGSL(shaderNodes); let pixelShaderPrerequisites = ''; pixelShaderPrerequisites += ` /* shaderity: @{definitions} */ #define RN_IS_NODE_SHADER struct VertexOutput { @builtin(position) position : vec4, ${varyingVariables} } ${_webgpu_shaderity_shaders_common_prerequisites_wgsl__WEBPACK_IMPORTED_MODULE_6__["default"].code} /* shaderity: @{getters} */ /* shaderity: @{matricesGetters} */ `; return pixelShaderPrerequisites; } else { let pixelShaderPrerequisites = ''; pixelShaderPrerequisites += ` #version 300 es precision highp float; precision highp int; ${_webgl_shaderity_shaders_common_prerequisites_glsl__WEBPACK_IMPORTED_MODULE_4__["default"].code} `; pixelShaderPrerequisites += '/* shaderity: @{getters} */'; pixelShaderPrerequisites += 'layout(location = 0) out vec4 rt0;'; return pixelShaderPrerequisites; } } static getMainPrerequisites() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { return _webgpu_shaderity_shaders_common_mainPrerequisites_wgsl__WEBPACK_IMPORTED_MODULE_8__["default"].code; } else { return _webgl_shaderity_shaders_common_mainPrerequisites_glsl__WEBPACK_IMPORTED_MODULE_7__["default"].code; } } static getAssignmentStatement(varName, inputSocket) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { const wgslTypeStr = inputSocket.compositionType.toWGSLType(inputSocket.componentType); const wgslInitialValue = inputSocket.compositionType.getWgslInitialValue(inputSocket.componentType); const rowStr = `var ${varName}: ${wgslTypeStr} = ${wgslInitialValue};\n`; return rowStr; } else { const glslTypeStr = inputSocket.compositionType.getGlslStr(inputSocket.componentType); const glslInitialValue = inputSocket.compositionType.getGlslInitialValue(inputSocket.componentType); const rowStr = `${glslTypeStr} ${varName} = ${glslInitialValue};\n`; return rowStr; } } static getAssignmentVaryingStatementInPixelShader(varName, inputSocket, inputNode) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { const wgslTypeStr = inputSocket.compositionType.toWGSLType(inputSocket.componentType); const rowStr = `var ${varName}: ${wgslTypeStr} = input.${inputNode.shaderFunctionName}_${inputNode.shaderNodeUid};\n`; return rowStr; } else { const glslTypeStr = inputSocket.compositionType.getGlslStr(inputSocket.componentType); const rowStr = `${glslTypeStr} ${varName} = v_${inputNode.shaderFunctionName}_${inputNode.shaderNodeUid};\n`; return rowStr; } } static getAssignmentVaryingStatementInVertexShader(inputNode, varNames, j) { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_0__.ProcessApproach.WebGPU) { return `output.${inputNode.shaderFunctionName}_${inputNode.shaderNodeUid} = ${varNames[j]};\n`; } else { return `v_${inputNode.shaderFunctionName}_${inputNode.shaderNodeUid} = ${varNames[j]};\n`; } } } /***/ }), /***/ "./src/webgl/shaders/index.ts": /*!************************************!*\ !*** ./src/webgl/shaders/index.ts ***! \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockBeginShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.BlockBeginShader), /* harmony export */ BlockEndShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.BlockEndShader), /* harmony export */ ClassicShadingShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ClassicShadingShader), /* harmony export */ CommonShaderPart: () => (/* reexport safe */ _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart), /* harmony export */ ConstantVariableShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.ConstantVariableShader), /* harmony export */ EndShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.EndShader), /* harmony export */ IfStatementShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.IfStatementShader), /* harmony export */ TextureFetchShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.TextureFetchShader), /* harmony export */ UniformDataShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.UniformDataShader), /* harmony export */ VaryingVariableShader: () => (/* reexport safe */ _nodes_index__WEBPACK_IMPORTED_MODULE_1__.VaryingVariableShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _nodes_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nodes/index */ "./src/webgl/shaders/nodes/index.ts"); /***/ }), /***/ "./src/webgl/shaders/nodes/BlockBeginShader.ts": /*!*****************************************************!*\ !*** ./src/webgl/shaders/nodes/BlockBeginShader.ts ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockBeginShader: () => (/* binding */ BlockBeginShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); class BlockBeginShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor(__functionName, __valueInputs, __valueOutputs) { super(); this.__functionName = __functionName; this.__valueInputs = __valueInputs; this.__valueOutputs = __valueOutputs; } get vertexShaderDefinitions() { let funcStr = `void ${this.__functionName}( in bool context, `; for (let i = 0; i < this.__valueInputs.length; i++) { const input = this.__valueInputs[i]; const type = input.compositionType.getGlslStr(input.componentType); funcStr += ` in ${type} value${i},`; } for (let i = 0; i < this.__valueOutputs.length; i++) { const output = this.__valueOutputs[i]; const type = output.compositionType.getGlslStr(output.componentType); funcStr += ` out ${type} outValue${i}` + (i === this.__valueOutputs.length - 1 ? '' : ','); } funcStr += ') {\n'; for (let i = 0; i < this.__valueOutputs.length; i++) { funcStr += ` outValue${i} = value${i};\n`; } funcStr += '}'; return funcStr; } get pixelShaderDefinitions() { return this.vertexShaderDefinitions; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/BlockEndShader.ts": /*!***************************************************!*\ !*** ./src/webgl/shaders/nodes/BlockEndShader.ts ***! \***************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockEndShader: () => (/* binding */ BlockEndShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); class BlockEndShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor(__functionName, __valueInputs, __valueOutputs) { super(); this.__functionName = __functionName; this.__valueInputs = __valueInputs; this.__valueOutputs = __valueOutputs; } get vertexShaderDefinitions() { let funcStr = `void ${this.__functionName}(`; for (let i = 0; i < this.__valueInputs.length; i++) { const input = this.__valueInputs[i]; const type = input.compositionType.getGlslStr(input.componentType); funcStr += ` in ${type} value${i},`; } for (let i = 0; i < this.__valueOutputs.length; i++) { const output = this.__valueOutputs[i]; const type = output.compositionType.getGlslStr(output.componentType); funcStr += ` out ${type} outValue${i}` + (i === this.__valueOutputs.length - 1 ? '' : ','); } funcStr += ') {\n'; for (let i = 0; i < this.__valueOutputs.length; i++) { funcStr += ` outValue${i} = value${i};\n`; } funcStr += '}'; return funcStr; } get pixelShaderDefinitions() { return this.vertexShaderDefinitions; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/ClassicShadingShader.ts": /*!*********************************************************!*\ !*** ./src/webgl/shaders/nodes/ClassicShadingShader.ts ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ClassicShadingShader: () => (/* binding */ ClassicShadingShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _foundation_definitions_ShaderNode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../foundation/definitions/ShaderNode */ "./src/foundation/definitions/ShaderNode.ts"); class ClassicShadingShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor() { super(); this.vertexShaderBody = ` `; } static getInstance() { if (!this.__instance) { this.__instance = new ClassicShadingShader(); } return this.__instance; } get vertexShaderDefinitions() { return ` `; } get pixelShaderDefinitions() { return ` uniform int u_shadingModel; uniform float u_shininess; struct Light { vec4 lightPosition; vec4 lightDirection; vec4 lightIntensity; }; uniform Light u_lights[${_foundation_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxLightNumberInShader}]; uniform int u_lightNumber; uniform vec3 u_viewPosition; bool classicShading( in vec3 diffuseColor, in vec3 position_inWorld, in vec3 normal_inWorld, out vec3 outColor ) { // Lighting outColor = vec3(0.0, 0.0, 0.0); if (u_shadingModel > 0) { vec3 diffuse = vec3(0.0, 0.0, 0.0); vec3 specular = vec3(0.0, 0.0, 0.0); for (int i = 0; i < ${_foundation_core_Config__WEBPACK_IMPORTED_MODULE_1__.Config.maxLightNumberInShader}; i++) { if (i >= u_lightNumber) { break; } vec3 lightDirection = u_lights[i].lightDirection.xyz; float lightType = u_lights[i].lightPosition.w; float spotCosCutoff = u_lights[i].lightDirection.w; float spotExponent = u_lights[i].lightIntensity.w; if (0.75 < lightType) { // is pointlight or spotlight lightDirection = normalize(u_lights[i].lightPosition.xyz - position_inWorld.xyz); } float spotEffect = 1.0; if (lightType > 1.75) { // is spotlight spotEffect = dot(u_lights[i].lightDirection.xyz, lightDirection); if (spotEffect > spotCosCutoff) { spotEffect = pow(spotEffect, spotExponent); } else { spotEffect = 0.0; } } vec3 incidentLight = spotEffect * u_lights[i].lightIntensity.xyz; // incidentLight *= M_PI; normal_inWorld = normalize(normal_inWorld); diffuse += diffuseColor * max(0.0, dot(normal_inWorld, lightDirection)) * incidentLight; if (u_shadingModel == 2) {// BLINN // ViewDirection vec3 viewDirection = normalize(u_viewPosition - position_inWorld.xyz); vec3 halfVector = normalize(lightDirection + viewDirection); specular += pow(max(0.0, dot(halfVector, normal_inWorld)), u_shininess); } else if (u_shadingModel == 3) { // PHONG vec3 viewDirection = normalize(u_viewPosition - position_inWorld.xyz); vec3 R = reflect(lightDirection, normal_inWorld); specular += pow(max(0.0, dot(R, viewDirection)), u_shininess); } } outColor = diffuse + specular; } else { outColor = diffuseColor; } } `; } get pixelShaderBody() { return ''; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } ClassicShadingShader.materialElement = _foundation_definitions_ShaderNode__WEBPACK_IMPORTED_MODULE_2__.ShaderNode.PBRShading; /***/ }), /***/ "./src/webgl/shaders/nodes/ConstantVariableShader.ts": /*!***********************************************************!*\ !*** ./src/webgl/shaders/nodes/ConstantVariableShader.ts ***! \***********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ConstantVariableShader: () => (/* binding */ ConstantVariableShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); class ConstantVariableShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor(__functionName, __compositionType, __componentType) { super(); this.__functionName = __functionName; this.__compositionType = __compositionType; this.__componentType = __componentType; this.__constantValueStr = ''; } setConstantValue(value) { let constant = ''; if (this.__componentType.isFloatingPoint()) { constant = value.glslStrAsFloat; } else if (this.__componentType.isInteger()) { constant = value.glslStrAsInt; } else if (this.__componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_1__.ComponentType.Bool) { constant = value.x ? 'true' : 'false'; } this.__constantValueStr = constant; } get vertexShaderDefinitions() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { return ` fn ${this.__functionName}( outValue: ptr) { *outValue = ${this.__constantValueStr}; } `; } else { return ` void ${this.__functionName}( out ${this.__compositionType.getGlslStr(this.__componentType)} outValue) { outValue = ${this.__constantValueStr}; } `; } } get pixelShaderDefinitions() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { return ` fn ${this.__functionName}( outValue: ptr) { *outValue = ${this.__constantValueStr}; } `; } else { return ` void ${this.__functionName}( out ${this.__compositionType.getGlslStr(this.__componentType)} outValue) { outValue = ${this.__constantValueStr}; } `; } } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/EndShader.ts": /*!**********************************************!*\ !*** ./src/webgl/shaders/nodes/EndShader.ts ***! \**********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EndShader: () => (/* binding */ EndShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _foundation_definitions_ShaderNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../foundation/definitions/ShaderNode */ "./src/foundation/definitions/ShaderNode.ts"); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); class EndShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor() { super(); } static getInstance() { if (!this.__instance) { this.__instance = new EndShader(); } return this.__instance; } get vertexShaderDefinitions() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { return ` fn outPosition(inPosition: vec4) { output.position = inPosition; } `; } else { return ` void outPosition(in vec4 inPosition) { gl_Position = inPosition; } `; } } get vertexShaderBody() { return ` `; } get pixelShaderDefinitions() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_3__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_2__.ProcessApproach.WebGPU) { return ` fn outColor(inColor: vec4) { rt0 = inColor; } `; } else { return ` void outColor(in vec4 inColor) { rt0 = inColor; } `; } } getPixelShaderBody() { return ''; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } EndShader.materialElement = _foundation_definitions_ShaderNode__WEBPACK_IMPORTED_MODULE_1__.ShaderNode.PBRShading; /***/ }), /***/ "./src/webgl/shaders/nodes/IfStatementShader.ts": /*!******************************************************!*\ !*** ./src/webgl/shaders/nodes/IfStatementShader.ts ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ IfStatementShader: () => (/* binding */ IfStatementShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); class IfStatementShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor() { super(); } get vertexShaderDefinitions() { return ` `; } get pixelShaderDefinitions() { return ` `; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/TextureFetchShader.ts": /*!*******************************************************!*\ !*** ./src/webgl/shaders/nodes/TextureFetchShader.ts ***! \*******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TextureFetchShader: () => (/* binding */ TextureFetchShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); class TextureFetchShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor() { super(); this.__materialNodeUid = 0; this.vertexShaderBody = ` `; } set materialNodeUid(materialNodeUid) { this.__materialNodeUid = materialNodeUid; } getPixelShaderBody() { return ` `; } get vertexShaderDefinitions() { return ''; } get pixelShaderDefinitions() { return ''; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/UniformDataShader.ts": /*!******************************************************!*\ !*** ./src/webgl/shaders/nodes/UniformDataShader.ts ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ UniformDataShader: () => (/* binding */ UniformDataShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); class UniformDataShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor(__functionName, __compositionType, __componentType) { super(); this.__functionName = __functionName; this.__compositionType = __compositionType; this.__componentType = __componentType; this.__variableName = ''; this.__valueStr = ''; } setVariableName(name) { this.__variableName = name; } setDefaultValue(value) { this.__valueStr = value.toString(); } get vertexShaderDefinitions() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_2__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_1__.ProcessApproach.WebGPU) { return ` // #param ${this.__variableName}: ${this.__compositionType.toWGSLType(this.__componentType)}; // initialValue=${this.__valueStr} fn ${this.__functionName}(outValue: ptr) { *outValue = get_${this.__variableName}(_materialSID, 0); } `; } else { return ` uniform ${this.__compositionType.getGlslStr(this.__componentType)} u_${this.__variableName}; // initialValue=${this.__valueStr} void ${this.__functionName}(out ${this.__compositionType.getGlslStr(this.__componentType)} outValue) { #ifdef RN_IS_DATATEXTURE_MODE float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID #else float materialSID = u_materialSID; #endif outValue = get_${this.__variableName}(materialSID, 0); } `; } } get pixelShaderDefinitions() { if (_foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_2__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_1__.ProcessApproach.WebGPU) { return ` // #param ${this.__variableName}: ${this.__compositionType.toWGSLType(this.__componentType)}; // initialValue=${this.__valueStr} fn ${this.__functionName}(outValue: ptr) { *outValue = get_${this.__variableName}(_materialSID, 0); } `; } else { return ` uniform ${this.__compositionType.getGlslStr(this.__componentType)} u_${this.__variableName}; // initialValue=${this.__valueStr} void ${this.__functionName}(out ${this.__compositionType.getGlslStr(this.__componentType)} outValue) { #ifdef RN_IS_DATATEXTURE_MODE float materialSID = u_currentComponentSIDs[0]; // index 0 data is the materialSID #else float materialSID = u_materialSID; #endif outValue = get_${this.__variableName}(materialSID, 0); } `; } } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/VaryingVariableShader.ts": /*!**********************************************************!*\ !*** ./src/webgl/shaders/nodes/VaryingVariableShader.ts ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VaryingVariableShader: () => (/* binding */ VaryingVariableShader) /* harmony export */ }); /* harmony import */ var _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../CommonShaderPart */ "./src/webgl/shaders/CommonShaderPart.ts"); class VaryingVariableShader extends _CommonShaderPart__WEBPACK_IMPORTED_MODULE_0__.CommonShaderPart { constructor(__functionName, __compositionType, __componentType) { super(); this.__functionName = __functionName; this.__compositionType = __compositionType; this.__componentType = __componentType; this.__variableName = ''; } setVariableName(name) { this.__variableName = name; } get vertexShaderDefinitions() { return ` out ${this.__compositionType.getGlslStr(this.__componentType)} ${this.__variableName}; void ${this.__functionName}( in ${this.__compositionType.getGlslStr(this.__componentType)} value) { ${this.__variableName} = value; } `; } get pixelShaderDefinitions() { return ` in ${this.__compositionType.getGlslStr(this.__componentType)} ${this.__variableName}; void ${this.__functionName}( out ${this.__compositionType.getGlslStr(this.__componentType)} outValue) { outValue = ${this.__variableName}; } `; } get attributeNames() { return []; } get attributeSemantics() { return []; } get attributeCompositions() { return []; } } /***/ }), /***/ "./src/webgl/shaders/nodes/index.ts": /*!******************************************!*\ !*** ./src/webgl/shaders/nodes/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BlockBeginShader: () => (/* reexport safe */ _BlockBeginShader__WEBPACK_IMPORTED_MODULE_0__.BlockBeginShader), /* harmony export */ BlockEndShader: () => (/* reexport safe */ _BlockEndShader__WEBPACK_IMPORTED_MODULE_1__.BlockEndShader), /* harmony export */ ClassicShadingShader: () => (/* reexport safe */ _ClassicShadingShader__WEBPACK_IMPORTED_MODULE_2__.ClassicShadingShader), /* harmony export */ ConstantVariableShader: () => (/* reexport safe */ _ConstantVariableShader__WEBPACK_IMPORTED_MODULE_3__.ConstantVariableShader), /* harmony export */ EndShader: () => (/* reexport safe */ _EndShader__WEBPACK_IMPORTED_MODULE_4__.EndShader), /* harmony export */ IfStatementShader: () => (/* reexport safe */ _IfStatementShader__WEBPACK_IMPORTED_MODULE_5__.IfStatementShader), /* harmony export */ TextureFetchShader: () => (/* reexport safe */ _TextureFetchShader__WEBPACK_IMPORTED_MODULE_6__.TextureFetchShader), /* harmony export */ UniformDataShader: () => (/* reexport safe */ _UniformDataShader__WEBPACK_IMPORTED_MODULE_7__.UniformDataShader), /* harmony export */ VaryingVariableShader: () => (/* reexport safe */ _VaryingVariableShader__WEBPACK_IMPORTED_MODULE_8__.VaryingVariableShader) /* harmony export */ }); /* harmony import */ var _BlockBeginShader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BlockBeginShader */ "./src/webgl/shaders/nodes/BlockBeginShader.ts"); /* harmony import */ var _BlockEndShader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BlockEndShader */ "./src/webgl/shaders/nodes/BlockEndShader.ts"); /* harmony import */ var _ClassicShadingShader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ClassicShadingShader */ "./src/webgl/shaders/nodes/ClassicShadingShader.ts"); /* harmony import */ var _ConstantVariableShader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ConstantVariableShader */ "./src/webgl/shaders/nodes/ConstantVariableShader.ts"); /* harmony import */ var _EndShader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./EndShader */ "./src/webgl/shaders/nodes/EndShader.ts"); /* harmony import */ var _IfStatementShader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./IfStatementShader */ "./src/webgl/shaders/nodes/IfStatementShader.ts"); /* harmony import */ var _TextureFetchShader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TextureFetchShader */ "./src/webgl/shaders/nodes/TextureFetchShader.ts"); /* harmony import */ var _UniformDataShader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./UniformDataShader */ "./src/webgl/shaders/nodes/UniformDataShader.ts"); /* harmony import */ var _VaryingVariableShader__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./VaryingVariableShader */ "./src/webgl/shaders/nodes/VaryingVariableShader.ts"); /***/ }), /***/ "./src/webgl/textureLoader/KTX2TextureLoader.ts": /*!******************************************************!*\ !*** ./src/webgl/textureLoader/KTX2TextureLoader.ts ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ KTX2TextureLoader: () => (/* binding */ KTX2TextureLoader) /* harmony export */ }); /* harmony import */ var ktx_parse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ktx-parse */ "./node_modules/ktx-parse/dist/ktx-parse.modern.js"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../foundation/definitions/CompressionTextureType */ "./src/foundation/definitions/CompressionTextureType.ts"); /* harmony import */ var zstddec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zstddec */ "./node_modules/zstddec/dist/zstddec.modern.js"); /* harmony import */ var _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../foundation/definitions/ProcessApproach */ "./src/foundation/definitions/ProcessApproach.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); const CompressedTextureFormat = { ETC1S: 0, UASTC4x4: 1, }; const TranscodeTarget = { ETC1_RGB: 'ETC1_RGB', BC1_RGB: 'BC1_RGB', BC4_R: 'BC4_R', BC5_RG: 'BC5_RG', BC3_RGBA: 'BC3_RGBA', PVRTC1_4_RGB: 'PVRTC1_4_RGB', PVRTC1_4_RGBA: 'PVRTC1_4_RGBA', BC7_RGBA: 'BC7_RGBA', BC7_M6_RGB: 'BC7_M6_RGB', BC7_M5_RGBA: 'BC7_M5_RGBA', ETC2_RGBA: 'ETC2_RGBA', ASTC_4x4_RGBA: 'ASTC_4x4_RGBA', RGBA32: 'RGBA32', RGB565: 'RGB565', BGR565: 'BGR565', RGBA4444: 'RGBA4444', PVRTC2_4_RGB: 'PVRTC2_4_RGB', PVRTC2_4_RGBA: 'PVRTC2_4_RGBA', EAC_R11: 'EAC_R11', EAC_RG11: 'EAC_RG11', }; class KTX2TextureLoader { constructor() { if (typeof MSC_TRANSCODER === 'undefined') { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_6__.Logger.error('Failed to call MSC_TRANSCODER() function. Please check to import msc_basis_transcoder.js.'); } this.__mscTranscoderPromise = this.__loadMSCTranscoder(); } // ----- Public Methods ----------------------------------------------------- static getInstance() { if (!this.__instance) { this.__instance = new KTX2TextureLoader(); } return this.__instance; } transcode(uint8Array) { const ktx2Container = this.__parse(uint8Array); if (ktx2Container.pixelDepth > 0) { throw new Error('Only 2D textures are currently supported'); } if (ktx2Container.layerCount > 1) { throw new Error('Array textures are not currently supported'); } if (ktx2Container.faceCount > 1) { throw new Error('Cube textures are not currently supported'); } if (ktx2Container.supercompressionScheme === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2SupercompressionScheme.ZSTD) { if (KTX2TextureLoader.__zstdDecoder == null) { KTX2TextureLoader.__zstdDecoder = new zstddec__WEBPACK_IMPORTED_MODULE_3__.ZSTDDecoder(); } return KTX2TextureLoader.__zstdDecoder.init().then(() => { return this.__mscTranscoderPromise.then(() => { return this.__transcodeData(ktx2Container); }); }); } else { return this.__mscTranscoderPromise.then(() => { return this.__transcodeData(ktx2Container); }); } } // ----- Private Methods ---------------------------------------------------- __loadMSCTranscoder() { // load msc_basis_transcoder once return new Promise((resolve) => { if (KTX2TextureLoader.__mscTranscoderModule) { resolve(); } MSC_TRANSCODER().then((transcoderModule) => { transcoderModule.initTranscoders(); KTX2TextureLoader.__mscTranscoderModule = transcoderModule; resolve(); }); }); } __getDeviceDependentParametersWebGL(hasAlpha) { const webGLResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getWebGLResourceRepository(); const glw = webGLResourceRepository.currentWebGLContextWrapper; const astc = glw.webgl2ExtCTAstc || glw.webgl1ExtCTAstc; const bptc = glw.webgl2ExtCTBptc || glw.webgl1ExtCTBptc; const s3tc = glw.webgl2ExtCTS3tc || glw.webgl1ExtCTS3tc; const pvrtc = glw.webgl2ExtCTPvrtc || glw.webgl1ExtCTPvrtc; const etc2 = glw.webgl2ExtCTEtc || glw.webgl1ExtCTEtc; const etc1 = glw.webgl2ExtCTEtc1 || glw.webgl1ExtCTEtc1; let transcodeTargetStr; let compressionTextureType; if (astc) { transcodeTargetStr = TranscodeTarget.ASTC_4x4_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ASTC_RGBA_4x4; } else if (bptc) { transcodeTargetStr = TranscodeTarget.BC7_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.BPTC_RGBA; } else if (s3tc) { if (hasAlpha) { transcodeTargetStr = TranscodeTarget.BC3_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.S3TC_RGBA_DXT5; } else { transcodeTargetStr = TranscodeTarget.BC1_RGB; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.S3TC_RGB_DXT1; } } else if (pvrtc) { if (hasAlpha) { transcodeTargetStr = TranscodeTarget.PVRTC1_4_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.PVRTC_RGBA_4BPPV1; } else { transcodeTargetStr = TranscodeTarget.PVRTC1_4_RGB; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.PVRTC_RGB_4BPPV1; } } else if (etc2) { if (hasAlpha) { transcodeTargetStr = TranscodeTarget.ETC2_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ETC2_RGBA8_EAC; } else { transcodeTargetStr = TranscodeTarget.ETC1_RGB; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ETC2_RGB8; } } else if (etc1) { transcodeTargetStr = TranscodeTarget.ETC1_RGB; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ETC1_RGB; } else { transcodeTargetStr = TranscodeTarget.RGBA32; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.RGBA8_EXT; } return { transcodeTargetStr, compressionTextureType }; } __getDeviceDependentParametersWebGPU(hasAlpha) { const webGpuResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_1__.CGAPIResourceRepository.getWebGpuResourceRepository(); const adapter = webGpuResourceRepository.getWebGpuDeviceWrapper().gpuAdapter; const astc = adapter.features.has('texture-compression-astc'); const s3tc = adapter.features.has('texture-compression-bc'); const etc2 = adapter.features.has('texture-compression-etc2'); let transcodeTargetStr; let compressionTextureType; if (astc) { transcodeTargetStr = TranscodeTarget.ASTC_4x4_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ASTC_RGBA_4x4; } else if (s3tc) { if (hasAlpha) { transcodeTargetStr = TranscodeTarget.BC3_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.S3TC_RGBA_DXT5; } else { transcodeTargetStr = TranscodeTarget.BC1_RGB; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.S3TC_RGB_DXT1; } } else if (etc2) { if (hasAlpha) { transcodeTargetStr = TranscodeTarget.ETC2_RGBA; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ETC2_RGBA8_EAC; } else { transcodeTargetStr = TranscodeTarget.ETC1_RGB; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.ETC2_RGB8; } } else { transcodeTargetStr = TranscodeTarget.RGBA32; compressionTextureType = _foundation_definitions_CompressionTextureType__WEBPACK_IMPORTED_MODULE_2__.CompressionTextureType.RGBA8_EXT; } return { transcodeTargetStr, compressionTextureType }; } __parse(uint8Array) { // The parser can detect an invalid identifier. return (0,ktx_parse__WEBPACK_IMPORTED_MODULE_0__.read)(uint8Array); } __transcodeData(ktx2Container) { var _a; const width = ktx2Container.pixelWidth; const height = ktx2Container.pixelHeight; const faceCount = ktx2Container.faceCount; // faceCount is 6 if the transcoded data is a cube map (not support yet) const imageDescs = (_a = ktx2Container.globalData) === null || _a === void 0 ? void 0 : _a.imageDescs; const dfd = ktx2Container.dataFormatDescriptor[0]; const compressedTextureFormat = dfd.colorModel === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2Model.UASTC ? CompressedTextureFormat.UASTC4x4 : CompressedTextureFormat.ETC1S; const hasAlpha = this.__hasAlpha(dfd, compressedTextureFormat); const isVideo = false; const transcoderModule = KTX2TextureLoader.__mscTranscoderModule; const transcoder = compressedTextureFormat === CompressedTextureFormat.UASTC4x4 ? new transcoderModule.UastcImageTranscoder() : new transcoderModule.BasisLzEtc1sImageTranscoder(); const textureFormat = compressedTextureFormat === CompressedTextureFormat.UASTC4x4 ? transcoderModule.TextureFormat.UASTC4x4 : transcoderModule.TextureFormat.ETC1S; const { transcodeTargetStr, compressionTextureType } = _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_5__.SystemState.currentProcessApproach === _foundation_definitions_ProcessApproach__WEBPACK_IMPORTED_MODULE_4__.ProcessApproach.WebGPU ? this.__getDeviceDependentParametersWebGPU(hasAlpha) : this.__getDeviceDependentParametersWebGL(hasAlpha); const transcodeTarget = transcoderModule.TranscodeTarget[transcodeTargetStr]; const mipmapData = []; const transcodedData = { width, height, compressionTextureType, mipmapData, needGammaCorrection: dfd.transferFunction !== ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2Transfer.SRGB, }; for (let level = 0; level < ktx2Container.levels.length; level++) { const levelWidth = Math.max(1, width >> level); const levelHeight = Math.max(1, height >> level); const imageInfo = new transcoderModule.ImageInfo(textureFormat, levelWidth, levelHeight, level); let levelBuffer = ktx2Container.levels[level].levelData; const levelUncompressedByteLength = ktx2Container.levels[level].uncompressedByteLength; const levelBufferByteLength = imageInfo.numBlocksX * imageInfo.numBlocksY * dfd.bytesPlane[0]; if (ktx2Container.supercompressionScheme === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2SupercompressionScheme.ZSTD) { levelBuffer = KTX2TextureLoader.__zstdDecoder.decode(levelBuffer, levelUncompressedByteLength); } let faceBufferByteOffset = 0; const firstImageDescIndexInLevel = level * Math.max(ktx2Container.layerCount, 1) * faceCount * Math.max(ktx2Container.pixelDepth, 1); for (let faceIndex = 0; faceIndex < faceCount; faceIndex++) { let imageDesc = null; let faceBuffer; if (ktx2Container.supercompressionScheme === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2SupercompressionScheme.BASISLZ) { imageDesc = imageDescs === null || imageDescs === void 0 ? void 0 : imageDescs[firstImageDescIndexInLevel + faceIndex]; faceBuffer = new Uint8Array(levelBuffer, imageDesc.rgbSliceByteOffset, imageDesc.rgbSliceByteLength + imageDesc.alphaSliceByteLength); } else { faceBuffer = new Uint8Array(levelBuffer, faceBufferByteOffset, levelBufferByteLength); faceBufferByteOffset += levelBufferByteLength; } let result; if (compressedTextureFormat === CompressedTextureFormat.UASTC4x4) { imageInfo.flags = 0; imageInfo.rgbByteOffset = 0; imageInfo.rgbByteLength = levelUncompressedByteLength; imageInfo.alphaByteOffset = 0; imageInfo.alphaByteLength = 0; result = transcoder.transcodeImage(transcodeTarget, faceBuffer, imageInfo, 0, hasAlpha, isVideo); } else { const sgd = ktx2Container.globalData; const basisTranscoder = transcoder; basisTranscoder.decodePalettes(sgd.endpointCount, sgd.endpointsData, sgd.selectorCount, sgd.selectorsData); basisTranscoder.decodeTables(sgd.tablesData); imageInfo.flags = imageDesc.imageFlags; imageInfo.rgbByteOffset = 0; imageInfo.rgbByteLength = imageDesc.rgbSliceByteLength; imageInfo.alphaByteOffset = imageDesc.alphaSliceByteOffset > 0 ? imageDesc.rgbSliceByteLength : 0; imageInfo.alphaByteLength = imageDesc.alphaSliceByteLength; result = basisTranscoder.transcodeImage(transcodeTarget, faceBuffer, imageInfo, 0, isVideo); } if ((result === null || result === void 0 ? void 0 : result.transcodedImage) != null) { const transcodedTextureBuffer = result.transcodedImage.get_typed_memory_view().slice(); result.transcodedImage.delete(); const mipmap = { level, width: levelWidth, height: levelHeight, buffer: transcodedTextureBuffer, }; mipmapData.push(mipmap); } } } return transcodedData; } __hasAlpha(dfd, compressedTextureFormat) { if (compressedTextureFormat === CompressedTextureFormat.UASTC4x4) { return dfd.samples[0].channelID === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2ChannelUASTC.RGBA; } else { return (dfd.samples.length === 2 && (dfd.samples[0].channelID === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2ChannelETC1S.AAA || dfd.samples[1].channelID === ktx_parse__WEBPACK_IMPORTED_MODULE_0__.KTX2ChannelETC1S.AAA)); } } } /***/ }), /***/ "./src/webgl/textureLoader/index.ts": /*!******************************************!*\ !*** ./src/webgl/textureLoader/index.ts ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ KTX2TextureLoader: () => (/* reexport safe */ _KTX2TextureLoader__WEBPACK_IMPORTED_MODULE_0__.KTX2TextureLoader) /* harmony export */ }); /* harmony import */ var _KTX2TextureLoader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./KTX2TextureLoader */ "./src/webgl/textureLoader/KTX2TextureLoader.ts"); /***/ }), /***/ "./src/webgl/types/CommonTypes.ts": /*!****************************************!*\ !*** ./src/webgl/types/CommonTypes.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/webgl/types/index.ts": /*!**********************************!*\ !*** ./src/webgl/types/index.ts ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _CommonTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CommonTypes */ "./src/webgl/types/CommonTypes.ts"); /***/ }), /***/ "./src/webgpu/WebGpuDeviceWrapper.ts": /*!*******************************************!*\ !*** ./src/webgpu/WebGpuDeviceWrapper.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGpuDeviceWrapper: () => (/* binding */ WebGpuDeviceWrapper) /* harmony export */ }); class WebGpuDeviceWrapper { constructor(canvas, gpuAdapter, gpuDevice) { this.__canvas = canvas; this.__context = canvas.getContext('webgpu'); this.__gpuAdapter = gpuAdapter; this.__gpuDevice = gpuDevice; const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); this.__context.configure({ device: this.__gpuDevice, format: presentationFormat, alphaMode: 'premultiplied', }); } get canvas() { return this.__canvas; } get gpuAdapter() { return this.__gpuAdapter; } get gpuDevice() { return this.__gpuDevice; } get context() { return this.__context; } } /***/ }), /***/ "./src/webgpu/WebGpuResourceRepository.ts": /*!************************************************!*\ !*** ./src/webgpu/WebGpuResourceRepository.ts ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGpuResourceRepository: () => (/* binding */ WebGpuResourceRepository) /* harmony export */ }); /* harmony import */ var _foundation_misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/misc/DataUtil */ "./src/foundation/misc/DataUtil.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/definitions/PixelFormat */ "./src/foundation/definitions/PixelFormat.ts"); /* harmony import */ var _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/definitions/TextureParameter */ "./src/foundation/definitions/TextureParameter.ts"); /* harmony import */ var _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/materials/core/Material */ "./src/foundation/materials/core/Material.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_textures_Sampler__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/textures/Sampler */ "./src/foundation/textures/Sampler.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../foundation/definitions/HdriFormat */ "./src/foundation/definitions/HdriFormat.ts"); /* harmony import */ var _foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../foundation/materials/core/DummyTextures */ "./src/foundation/materials/core/DummyTextures.ts"); /* harmony import */ var _foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../foundation/components/MeshRenderer/MeshRendererComponent */ "./src/foundation/components/MeshRenderer/MeshRendererComponent.ts"); /* harmony import */ var _foundation_definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../foundation/definitions/AlphaMode */ "./src/foundation/definitions/AlphaMode.ts"); /* harmony import */ var _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../foundation/misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _foundation_textures_CubeTexture__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../foundation/textures/CubeTexture */ "./src/foundation/textures/CubeTexture.ts"); /* harmony import */ var _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../foundation/components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../foundation/core/EntityRepository */ "./src/foundation/core/EntityRepository.ts"); /* harmony import */ var _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../foundation/system/SystemState */ "./src/foundation/system/SystemState.ts"); /* harmony import */ var _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../foundation/definitions/BasisCompressionType */ "./src/foundation/definitions/BasisCompressionType.ts"); /* harmony import */ var _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../foundation/definitions/TextureFormat */ "./src/foundation/definitions/TextureFormat.ts"); /* harmony import */ var _foundation_textures_RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../foundation/textures/RenderTargetTextureCube */ "./src/foundation/textures/RenderTargetTextureCube.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); /// const HDRImage = __webpack_require__(/*! ../../vendor/hdrpng.min.js */ "./vendor/hdrpng.min.js"); const IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT = 16; const IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT = 17; class WebGpuResourceRepository extends _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository { constructor() { super(); this.__webGpuResources = new Map(); this.__resourceCounter = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__webGpuRenderPipelineMap = new Map(); this.__materialStateVersionMap = new Map(); this.__bindGroupTextureMap = new Map(); this.__bindGroupLayoutTextureMap = new Map(); this.__bindGroupSamplerMap = new Map(); this.__bindGroupLayoutSamplerMap = new Map(); this.__renderBundles = new Map(); this.__lastMaterialsUpdateCount = -1; this.__lastCurrentCameraComponentSid = -1; this.__lastEntityRepositoryUpdateCount = -1; this.__lastPrimitivesMaterialVariantUpdateCount = -1; this.__lastMeshRendererComponentsUpdateCount = -1; } clearCache() { this.__webGpuRenderPipelineMap.clear(); this.__materialStateVersionMap.clear(); this.__bindGroupTextureMap.clear(); this.__bindGroupLayoutTextureMap.clear(); this.__bindGroupSamplerMap.clear(); this.__bindGroupLayoutSamplerMap.clear(); this.__renderBundles.clear(); } addWebGpuDeviceWrapper(webGpuDeviceWrapper) { this.__webGpuDeviceWrapper = webGpuDeviceWrapper; this.__commandEncoder = this.__webGpuDeviceWrapper.gpuDevice.createCommandEncoder(); } getWebGpuDeviceWrapper() { return this.__webGpuDeviceWrapper; } static getInstance() { if (!this.__instance) { this.__instance = new WebGpuResourceRepository(); } return this.__instance; } getResourceNumber() { return ++this.__resourceCounter; } __registerResource(obj) { const handle = this.getResourceNumber(); obj._resourceUid = handle; this.__webGpuResources.set(handle, obj); return handle; } getCanvasSize() { const canvas = this.__webGpuDeviceWrapper.canvas; return [canvas.width, canvas.height]; } /** * create a WebGPU Texture * @param imageData - an ImageBitmapData * @param paramObject - a parameter object * @returns */ createTextureFromImageBitmapData(imageData, { level, internalFormat, width, height, border, format, type, generateMipmap, }) { const textureHandle = this.__createTextureInner(width, height, internalFormat, generateMipmap, imageData); return textureHandle; } async createTextureFromDataUri(dataUri, { level, internalFormat, border, format, type, generateMipmap, }) { return new Promise((resolve) => { const img = new Image(); if (!dataUri.match(/^data:/)) { img.crossOrigin = 'Anonymous'; } img.onload = async () => { const width = img.width; const height = img.height; const texture = await this.createTextureFromHTMLImageElement(img, { level, internalFormat, width, height, border, format, type, generateMipmap, }); resolve(texture); }; img.src = dataUri; }); } generateMipmaps2d(textureHandle, width, height) { const gpuTexture = this.__webGpuResources.get(textureHandle); const textureDescriptor = { size: [width, height, 1], format: gpuTexture.format, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, mipLevelCount: Math.floor(Math.log2(Math.max(width, height))) + 1, }; this.generateMipmaps(gpuTexture, textureDescriptor); } generateMipmapsCube(textureHandle, width, height) { const gpuTexture = this.__webGpuResources.get(textureHandle); const textureDescriptor = { size: [width, height, 6], format: gpuTexture.format, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, mipLevelCount: Math.floor(Math.log2(Math.max(width, height))) + 1, }; this.generateMipmaps(gpuTexture, textureDescriptor); } async getTexturePixelData(textureHandle, width, height, frameBufferUid, colorAttachmentIndex) { const gpuTexture = this.__webGpuResources.get(textureHandle); const textureData = new Uint8Array(width * height * 4); const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const commandEncoder = gpuDevice.createCommandEncoder(); const buffer = gpuDevice.createBuffer({ size: width * height * 4, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ, }); commandEncoder.copyTextureToBuffer({ texture: gpuTexture }, { buffer, bytesPerRow: width * 4 }, { width, height, depthOrArrayLayers: 1 }); gpuDevice.queue.submit([commandEncoder.finish()]); await buffer.mapAsync(GPUMapMode.READ); const arrayBuffer = buffer.getMappedRange(); textureData.set(new Uint8Array(arrayBuffer)); buffer.unmap(); return textureData; } /** * create a WebGPU Texture Mipmaps (including CubeMap support) * * @remarks * Adapted from: https://toji.dev/webgpu-best-practices/img-textures#generating-mipmaps * @param texture - a texture * @param textureDescriptor - a texture descriptor */ generateMipmaps(texture, textureDescriptor) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; if (this.__generateMipmapsShaderModule == null) { this.__generateMipmapsShaderModule = gpuDevice.createShaderModule({ code: ` var pos : array = array( vec2f(-1, 1), vec2f(1, 1), vec2f(-1, -1), vec2f(1, -1)); struct VertexOutput { @builtin(position) position : vec4f, @location(0) texCoord : vec2f, }; @vertex fn vertexMain(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput { var output : VertexOutput; output.texCoord = pos[vertexIndex] * vec2f(0.5, -0.5) + vec2f(0.5); output.position = vec4f(pos[vertexIndex], 0, 1); return output; } @group(0) @binding(0) var imgSampler : sampler; @group(0) @binding(1) var img : texture_2d; @fragment fn fragmentMain(@location(0) texCoord : vec2f) -> @location(0) vec4f { return textureSample(img, imgSampler, texCoord); } `, }); } if (this.__generateMipmapsPipeline != null && textureDescriptor.format != this.__generateMipmapsFormat) { this.__generateMipmapsPipeline = undefined; } if (this.__generateMipmapsPipeline == null) { this.__generateMipmapsPipeline = gpuDevice.createRenderPipeline({ layout: 'auto', vertex: { module: this.__generateMipmapsShaderModule, entryPoint: 'vertexMain', }, fragment: { module: this.__generateMipmapsShaderModule, entryPoint: 'fragmentMain', targets: [ { format: textureDescriptor.format, }, ], }, primitive: { topology: 'triangle-strip', stripIndexFormat: 'uint32', }, }); this.__generateMipmapsFormat = textureDescriptor.format; } if (this.__generateMipmapsSampler == null) { this.__generateMipmapsSampler = gpuDevice.createSampler({ minFilter: 'linear' }); } if (this.__renderPassEncoder != null) { if (this.__renderBundleEncoder != null) { this.__renderPassEncoder.executeBundles([this.__renderBundleEncoder.finish()]); } this.__renderPassEncoder.end(); this.__renderPassEncoder = undefined; } const isCubemap = texture.dimension === '2d' && texture.depthOrArrayLayers === 6; const layerCount = isCubemap ? 6 : 1; for (let layer = 0; layer < layerCount; ++layer) { let srcView = texture.createView({ dimension: '2d', baseMipLevel: 0, mipLevelCount: 1, baseArrayLayer: layer, arrayLayerCount: 1, }); for (let i = 1; i < textureDescriptor.mipLevelCount; ++i) { const dstView = texture.createView({ dimension: '2d', baseMipLevel: i, mipLevelCount: 1, baseArrayLayer: layer, arrayLayerCount: 1, }); const passEncoder = this.__commandEncoder.beginRenderPass({ colorAttachments: [ { view: dstView, loadOp: 'load', storeOp: 'store', }, ], }); const bindGroup = gpuDevice.createBindGroup({ layout: this.__generateMipmapsPipeline.getBindGroupLayout(0), entries: [ { binding: 0, resource: this.__generateMipmapsSampler, }, { binding: 1, resource: srcView, }, ], }); // Render passEncoder.setPipeline(this.__generateMipmapsPipeline); passEncoder.setBindGroup(0, bindGroup); passEncoder.draw(4); passEncoder.end(); srcView = dstView; } } } createTextureSampler({ magFilter, minFilter, wrapS, wrapT, wrapR, anisotropy, isPremultipliedAlpha, shadowCompareMode, }) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const maxAnisotropy = anisotropy ? 4 : 1; const desc = { magFilter: magFilter.webgpu, minFilter: minFilter.webgpu, mipmapFilter: minFilter === _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.LinearMipmapLinear || minFilter === _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.NearestMipmapLinear ? 'linear' : 'nearest', addressModeU: wrapS.webgpu, addressModeV: wrapT.webgpu, addressModeW: wrapR.webgpu, // lodMinClamp: 0, // lodMaxClamp: 32, maxAnisotropy, }; if (desc.magFilter === 'nearest' || desc.minFilter === 'nearest' || desc.mipmapFilter === 'nearest') { desc.maxAnisotropy = 1; } const sampler = gpuDevice.createSampler(desc); const samplerHandle = this.__registerResource(sampler); return samplerHandle; } /** * create a WebGPU Vertex Buffer * @param accessor - an accessor * @returns */ createVertexBuffer(accessor) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const vertexBuffer = gpuDevice.createBuffer({ size: accessor.byteLength, usage: GPUBufferUsage.VERTEX, mappedAtCreation: true, }); new Uint8Array(vertexBuffer.getMappedRange()).set(accessor.getUint8Array()); vertexBuffer.unmap(); const bufferHandle = this.__registerResource(vertexBuffer); return bufferHandle; } /** * create a WebGPU Vertex Buffer * @param typedArray - a typed array * @returns a WebGPUResourceHandle */ createVertexBufferFromTypedArray(typedArray) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const vertexBuffer = gpuDevice.createBuffer({ size: typedArray.byteLength, usage: GPUBufferUsage.VERTEX, mappedAtCreation: true, }); new Uint8Array(vertexBuffer.getMappedRange()).set(new Uint8Array(typedArray.buffer)); vertexBuffer.unmap(); const resourceHandle = this.__registerResource(vertexBuffer); return resourceHandle; } /** * create a WebGPU Index Buffer * @param accessor - an accessor * @returns a WebGPUResourceHandle */ createIndexBuffer(accessor) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; let uint8Array = accessor.getUint8Array(); if (accessor.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte) { // WebGPU does not support uint8 for index buffer. // So we need to convert uint8 to uint16. const uint16Array = new Uint16Array(accessor.byteLength); const typedArray = accessor.getTypedArray(); for (let i = 0; i < typedArray.length; i++) { uint16Array[i] = typedArray[i]; } uint8Array = new Uint8Array(uint16Array.buffer); } const size = _foundation_misc_DataUtil__WEBPACK_IMPORTED_MODULE_0__.DataUtil.addPaddingBytes(uint8Array.byteLength, 4); const indexBuffer = gpuDevice.createBuffer({ size: size, usage: GPUBufferUsage.INDEX, mappedAtCreation: true, }); new Uint8Array(indexBuffer.getMappedRange()).set(uint8Array); indexBuffer.unmap(); const bufferHandle = this.__registerResource(indexBuffer); return bufferHandle; } updateVertexBuffer(accessor, resourceHandle) { const vertexBuffer = this.__webGpuResources.get(resourceHandle); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(vertexBuffer)) { throw new Error('Not found VBO.'); } vertexBuffer.mapAsync(GPUMapMode.WRITE).then(() => { new Uint8Array(vertexBuffer.getMappedRange()).set(accessor.bufferView.getUint8Array()); vertexBuffer.unmap(); }); } updateIndexBuffer(accessor, resourceHandle) { const indexBuffer = this.__webGpuResources.get(resourceHandle); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(indexBuffer)) { throw new Error('Not found IBO.'); } indexBuffer.mapAsync(GPUMapMode.WRITE).then(() => { let uint8Array = accessor.getUint8Array(); if (accessor.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_2__.ComponentType.UnsignedByte) { // WebGPU does not support uint8 for index buffer. // So we need to convert uint8 to uint16. const uint16Array = new Uint16Array(accessor.byteLength); const typedArray = accessor.getTypedArray(); for (let i = 0; i < typedArray.length; i++) { uint16Array[i] = typedArray[i]; } uint8Array = new Uint8Array(uint16Array.buffer); } new Uint8Array(indexBuffer.getMappedRange()).set(uint8Array); indexBuffer.unmap(); }); } deleteVertexBuffer(resourceHandle) { const vertexBuffer = this.__webGpuResources.get(resourceHandle); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.not.exist(vertexBuffer)) { throw new Error('Not found VBO.'); } vertexBuffer.destroy(); this.__webGpuResources.delete(resourceHandle); } /** * create a VertexBuffer and IndexBuffer * @param primitive * @returns */ createVertexBufferAndIndexBuffer(primitive) { let iboHandle; if (primitive.hasIndices()) { iboHandle = this.createIndexBuffer(primitive.indicesAccessor); } const attributesFlags = []; for (let i = 0; i < _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.AttributeTypeNumber; i++) { attributesFlags[i] = false; } const vboHandles = []; primitive.attributeAccessors.forEach((accessor, i) => { const vboHandle = this.createVertexBuffer(accessor); const slotIdx = _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.toAttributeSlotFromJoinedString(primitive.attributeSemantics[i]); attributesFlags[slotIdx] = true; vboHandles.push(vboHandle); }); return { vaoHandle: -1, iboHandle: iboHandle, vboHandles: vboHandles, attributesFlags: attributesFlags, setComplete: false, }; } /** * update the VertexBuffer and IndexBuffer * @param primitive * @param vertexHandles */ updateVertexBufferAndIndexBuffer(primitive, vertexHandles) { if (vertexHandles.iboHandle) { this.updateIndexBuffer(primitive.indicesAccessor, vertexHandles.iboHandle); } const attributeAccessors = primitive.attributeAccessors; for (let i = 0; i < attributeAccessors.length; i++) { this.updateVertexBuffer(attributeAccessors[i], vertexHandles.vboHandles[i]); } } deleteVertexDataResources(vertexHandles) { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(vertexHandles.iboHandle)) { const indexBuffer = this.__webGpuResources.get(vertexHandles.iboHandle); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(indexBuffer)) { indexBuffer.destroy(); } } for (const vboHandle of vertexHandles.vboHandles) { const vertexBuffer = this.__webGpuResources.get(vboHandle); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(vertexBuffer)) { vertexBuffer.destroy(); } } } /** * set the VertexData to the Pipeline */ setVertexDataToPipeline({ vaoHandle, iboHandle, vboHandles, }, primitive, instanceIDBufferUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { const buffers = []; // Vertex Buffer Settings /// Each vertex attributes const attributes = []; for (let i = 0; i < vboHandles.length; i++) { const shaderLocation = _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.toAttributeSlotFromJoinedString(primitive.attributeSemantics[i]); const gpuVertexFormat = (primitive.attributeAccessors[i].componentType.webgpu + primitive.attributeAccessors[i].compositionType.webgpu); attributes.push({ shaderLocation, offset: primitive.attributeAccessors[i].byteOffsetInBufferView, format: gpuVertexFormat, }); } buffers[0] = { stepMode: 'vertex', attributes, arrayStride: primitive.attributeAccessors[0].byteStride, }; /// Instance Buffer const instanceIDBuffer = this.__webGpuResources.get(instanceIDBufferUid); buffers[1] = { stepMode: 'instance', attributes: [ { shaderLocation: _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Instance.getAttributeSlot(), offset: 0, format: 'float32x4', }, ], arrayStride: 4 * 4, }; } __checkShaderCompileStatus(materialTypeName, shaderText, info) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info('MaterialTypeName: ' + materialTypeName); const lineNumberedShaderText = _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_16__.MiscUtil.addLineNumberToCode(shaderText); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(lineNumberedShaderText); for (let i = 0; i < info.messages.length; i++) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.info(info.messages[i].message); return false; } return true; } /** * create a shader program * @param param0 * @returns */ createShaderProgram({ material, vertexShaderStr, fragmentShaderStr, attributeNames, attributeSemantics, onError, }) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const vsModule = gpuDevice.createShaderModule({ code: vertexShaderStr, }); if (_foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.cgApiDebugConsoleOutput) { vsModule.getCompilationInfo().then((info) => { if (info.messages.length > 0) { this.__checkShaderCompileStatus(material.materialTypeName, vertexShaderStr, info); } }); } const fsModule = gpuDevice.createShaderModule({ code: fragmentShaderStr, }); if (_foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.cgApiDebugConsoleOutput) { fsModule.getCompilationInfo().then((info) => { if (info.messages.length > 0) { this.__checkShaderCompileStatus(material.materialTypeName, fragmentShaderStr, info); } }); } const modules = { vsModule, fsModule, }; const modulesHandle = this.__registerResource(modules); return modulesHandle; } clearFrameBuffer(renderPass) { if (renderPass.entities.length > 0) { return; } // this method is executed when the renderPass has no entities. // If the renderPass has entities, the clear operation is executed in the createRenderPassEncoder method. if (!renderPass.toClearColorBuffer && !renderPass.toClearDepthBuffer) { return; } const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const context = this.__webGpuDeviceWrapper.context; const colorAttachments = []; let depthStencilAttachment; if (renderPass.toClearColorBuffer) { const framebuffer = renderPass.getFramebuffer(); if (framebuffer != null) { for (let colorAttachment of framebuffer.colorAttachments) { const textureView = this.__webGpuResources.get(colorAttachment._textureViewAsRenderTargetResourceUid); colorAttachments.push({ view: textureView, clearValue: { r: renderPass.clearColor.x, g: renderPass.clearColor.y, b: renderPass.clearColor.z, a: renderPass.clearColor.w, }, loadOp: 'clear', storeOp: 'store', }); } } else { if (this.__contextCurrentTextureView == null) { this.__contextCurrentTextureView = context.getCurrentTexture().createView(); } colorAttachments.push({ view: this.__contextCurrentTextureView, clearValue: { r: renderPass.clearColor.x, g: renderPass.clearColor.y, b: renderPass.clearColor.z, a: renderPass.clearColor.w, }, loadOp: 'clear', storeOp: 'store', }); } } if (renderPass.toClearDepthBuffer) { const framebuffer = renderPass.getFramebuffer(); if (framebuffer != null && framebuffer.depthAttachment != null) { const depthTextureView = this.__webGpuResources.get(framebuffer.depthAttachment._textureViewAsRenderTargetResourceUid); depthStencilAttachment = { view: depthTextureView, depthClearValue: renderPass.clearDepth, depthLoadOp: 'clear', depthStoreOp: 'store', }; } else { depthStencilAttachment = { view: this.__systemDepthTextureView, depthClearValue: renderPass.clearDepth, depthLoadOp: 'clear', depthStoreOp: 'store', }; } } const renderPassDescriptor = { colorAttachments: colorAttachments, depthStencilAttachment: depthStencilAttachment, label: renderPass.uniqueName, }; const passEncoder = this.__commandEncoder.beginRenderPass(renderPassDescriptor); passEncoder.end(); } draw(primitive, material, renderPass, cameraId, isOpaque) { const isBufferLessRendering = renderPass.isBufferLessRenderingMode(); const VertexHandles = primitive._vertexHandles; if (!isBufferLessRendering && VertexHandles == null) { return; } let meshRendererComponentSid = -1; let meshRendererComponentUpdateCount = -1; let diffuseCubeMap; let specularCubeMap; if (!isBufferLessRendering) { const mesh = primitive.mesh; const entity = mesh.meshEntitiesInner[0]; // get base mesh for instancing draw const meshRendererComponent = entity.getMeshRenderer(); material._setInternalSettingParametersToGpuWebGpu({ material: material, args: { cameraComponentSid: cameraId, entity, specularCube: meshRendererComponent.specularCubeMap, }, }); meshRendererComponentSid = meshRendererComponent.componentSID; meshRendererComponentUpdateCount = meshRendererComponent.updateCount; diffuseCubeMap = meshRendererComponent.diffuseCubeMap; specularCubeMap = meshRendererComponent.specularCubeMap; } const renderPipelineId = `${primitive._getFingerPrint()} ${material.materialUID} ${renderPass.renderPassUID} ${meshRendererComponentSid} ${meshRendererComponentUpdateCount} ${cameraId}, ${isOpaque} `; const [pipeline, recreated] = this.getOrCreateRenderPipeline(renderPipelineId, primitive, material, renderPass, cameraId, isOpaque, diffuseCubeMap, specularCubeMap); this.createRenderBundleEncoder(renderPass); const renderBundleEncoder = this.__renderBundleEncoder; renderBundleEncoder.setBindGroup(0, this.__bindGroupStorageBuffer); renderBundleEncoder.setPipeline(pipeline); renderBundleEncoder.setBindGroup(1, this.__bindGroupTextureMap.get(renderPipelineId)); renderBundleEncoder.setBindGroup(2, this.__bindGroupSamplerMap.get(renderPipelineId)); if (isBufferLessRendering) { renderBundleEncoder.draw(renderPass._drawVertexNumberForBufferLessRendering); } else { const mesh = primitive.mesh; const variationVBO = this.__webGpuResources.get(mesh._variationVBOUid); renderBundleEncoder.setVertexBuffer(0, variationVBO); VertexHandles.vboHandles.forEach((vboHandle, i) => { const vertexBuffer = this.__webGpuResources.get(vboHandle); renderBundleEncoder.setVertexBuffer(i + 1, vertexBuffer); }); if (primitive.hasIndices()) { const indicesBuffer = this.__webGpuResources.get(VertexHandles.iboHandle); const indexBitSize = primitive.getIndexBitSize(); renderBundleEncoder.setIndexBuffer(indicesBuffer, indexBitSize); const indicesAccessor = primitive.indicesAccessor; renderBundleEncoder.drawIndexed(indicesAccessor.elementCount, mesh.meshEntitiesInner.length); } else { const vertexCount = primitive.attributeAccessors[0].elementCount; renderBundleEncoder.draw(vertexCount, mesh.meshEntitiesInner.length); } } this.createRenderPassEncoder(renderPass); } createRenderBundleEncoder(renderPass) { if (this.__renderBundleEncoder == null) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const framebuffer = renderPass.getFramebuffer(); let colorFormats = [navigator.gpu.getPreferredCanvasFormat()]; let depthStencilFormat = this.__systemDepthTexture.format; if (framebuffer != null) { colorFormats = []; for (let colorAttachment of framebuffer.colorAttachments) { const texture = this.__webGpuResources.get(colorAttachment._textureResourceUid); colorFormats.push(texture.format); } if (framebuffer.depthAttachment != null) { const depthTexture = this.__webGpuResources.get(framebuffer.depthAttachment._textureResourceUid); depthStencilFormat = depthTexture.format; } else { depthStencilFormat = undefined; } } const renderBundleDescriptor = { colorFormats: colorFormats, depthStencilFormat: depthStencilFormat, sampleCount: renderPass.getResolveFramebuffer() != null ? renderPass.getFramebuffer().colorAttachments[0].sampleCount : 1, }; const encoder = gpuDevice.createRenderBundleEncoder(renderBundleDescriptor); this.__renderBundleEncoder = encoder; } } createRenderPassEncoder(renderPass) { if (this.__renderPassEncoder == null) { const framebuffer = renderPass.getFramebuffer(); const resolveFramebuffer = renderPass.getResolveFramebuffer(); const clearValue = renderPass.toClearColorBuffer ? { r: renderPass.clearColor.x, g: renderPass.clearColor.y, b: renderPass.clearColor.z, a: renderPass.clearColor.w, } : undefined; const depthClearValue = renderPass.toClearDepthBuffer ? renderPass.clearDepth : undefined; if (resolveFramebuffer != null && framebuffer != null) { let depthTextureView = this.__systemDepthTextureView; if (framebuffer.depthAttachment != null) { const depthTexture = this.__webGpuResources.get(framebuffer.depthAttachment._textureResourceUid); if (depthTexture != null) { depthTextureView = this.__webGpuResources.get(framebuffer.depthAttachment._textureViewResourceUid); } } const renderPassDescriptor = { colorAttachments: [], depthStencilAttachment: { view: depthTextureView, depthClearValue: depthClearValue, depthLoadOp: renderPass.toClearDepthBuffer ? 'clear' : 'load', depthStoreOp: 'store', }, label: renderPass.uniqueName, }; const colorAttachments = []; for (let i = 0; i < resolveFramebuffer.colorAttachments.length; i++) { const colorAttachment = framebuffer.colorAttachments[i]; const resolveColorAttachment = resolveFramebuffer.colorAttachments[i]; const textureView = this.__webGpuResources.get(colorAttachment._textureViewAsRenderTargetResourceUid); let resolveTextureView = this.__webGpuResources.get(resolveColorAttachment._textureViewAsRenderTargetResourceUid); colorAttachments.push({ view: textureView, resolveTarget: resolveTextureView, clearValue: clearValue, loadOp: renderPass.toClearColorBuffer ? 'clear' : 'load', storeOp: 'store', }); } renderPassDescriptor.colorAttachments = colorAttachments; this.__renderPassEncoder = this.__commandEncoder.beginRenderPass(renderPassDescriptor); } else if (framebuffer != null) { let depthTextureView = undefined; if (framebuffer.depthAttachment != null) { const depthTexture = this.__webGpuResources.get(framebuffer.depthAttachment._textureResourceUid); if (depthTexture != null) { depthTextureView = this.__webGpuResources.get(framebuffer.depthAttachment._textureViewAsRenderTargetResourceUid); } } let depthStencilAttachment = undefined; if (depthTextureView != null) { depthStencilAttachment = { view: depthTextureView, depthClearValue: depthClearValue, depthLoadOp: renderPass.toClearDepthBuffer ? 'clear' : 'load', depthStoreOp: 'store', }; } const renderPassDescriptor = { colorAttachments: [], depthStencilAttachment: depthStencilAttachment, label: renderPass.uniqueName, }; const colorAttachments = []; for (let colorAttachment of framebuffer.colorAttachments) { const textureView = this.__webGpuResources.get(colorAttachment._textureViewAsRenderTargetResourceUid); colorAttachments.push({ view: textureView, clearValue: clearValue, loadOp: renderPass.toClearColorBuffer ? 'clear' : 'load', storeOp: 'store', }); } renderPassDescriptor.colorAttachments = colorAttachments; this.__renderPassEncoder = this.__commandEncoder.beginRenderPass(renderPassDescriptor); } else { if (this.__contextCurrentTextureView == null) { const context = this.__webGpuDeviceWrapper.context; this.__contextCurrentTextureView = context.getCurrentTexture().createView(); } const renderPassDescriptor = { colorAttachments: [ { view: this.__contextCurrentTextureView, clearValue: clearValue, loadOp: renderPass.toClearColorBuffer ? 'clear' : 'load', storeOp: 'store', }, ], depthStencilAttachment: { view: this.__systemDepthTextureView, depthClearValue: depthClearValue, depthLoadOp: renderPass.toClearDepthBuffer ? 'clear' : 'load', depthStoreOp: 'store', }, label: renderPass.uniqueName, }; this.__renderPassEncoder = this.__commandEncoder.beginRenderPass(renderPassDescriptor); } } } __toClearRenderBundles() { if (_foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_7__.Material.stateVersion !== this.__lastMaterialsUpdateCount || _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_18__.CameraComponent.current !== this.__lastCurrentCameraComponentSid || _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_19__.EntityRepository.updateCount !== this.__lastEntityRepositoryUpdateCount || _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_6__.Primitive.variantUpdateCount !== this.__lastPrimitivesMaterialVariantUpdateCount || _foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_14__.MeshRendererComponent.updateCount !== this.__lastMeshRendererComponentsUpdateCount) { this.__renderBundles.clear(); _foundation_system_SystemState__WEBPACK_IMPORTED_MODULE_20__.SystemState.webgpuRenderBundleMode = false; this.__lastCurrentCameraComponentSid = _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_18__.CameraComponent.current; this.__lastMaterialsUpdateCount = _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_7__.Material.stateVersion; this.__lastEntityRepositoryUpdateCount = _foundation_core_EntityRepository__WEBPACK_IMPORTED_MODULE_19__.EntityRepository.updateCount; this.__lastPrimitivesMaterialVariantUpdateCount = _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_6__.Primitive.variantUpdateCount; this.__lastMeshRendererComponentsUpdateCount = _foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_14__.MeshRendererComponent.updateCount; } } executeRenderBundle(renderPass) { this.__toClearRenderBundles(); if (renderPass._isChangedSortRenderResult || !_foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.cacheWebGpuRenderBundles) { this.__renderBundles.clear(); } let renderBundle = this.__renderBundles.get(renderPass.renderPassUID); if (renderBundle != null) { this.createRenderPassEncoder(renderPass); if (this.__renderPassEncoder != null) { this.__renderPassEncoder.executeBundles([renderBundle]); this.__renderPassEncoder.end(); this.__renderPassEncoder = undefined; return true; } } return false; } finishRenderBundleEncoder(renderPass) { if (this.__renderPassEncoder != null && this.__renderBundleEncoder != null) { const renderBundle = this.__renderBundleEncoder.finish(); if (_foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.cacheWebGpuRenderBundles) { this.__renderBundles.set(renderPass.renderPassUID, renderBundle); } else { this.__renderBundles.clear(); } this.__renderPassEncoder.executeBundles([renderBundle]); this.__renderPassEncoder.end(); this.__renderBundleEncoder = undefined; this.__renderPassEncoder = undefined; } } getOrCreateRenderPipeline(renderPipelineId, primitive, material, renderPass, cameraId, isOpaque, diffuseCubeMap, specularCubeMap) { if (this.__webGpuRenderPipelineMap.has(renderPipelineId)) { const materialStateVersion = this.__materialStateVersionMap.get(renderPipelineId); if (materialStateVersion === material.stateVersion) { return [this.__webGpuRenderPipelineMap.get(renderPipelineId), false]; } } // const width = this.__webGpuDeviceWrapper!.canvas.width; // const height = this.__webGpuDeviceWrapper!.canvas.height; // const backBufferTextureSize = GlobalDataRepository.getInstance().getValue( // ShaderSemantics.BackBufferTextureSize, // 0 // ) as Vector2; // backBufferTextureSize._v[0] = width; // backBufferTextureSize._v[1] = height; this.__webGpuRenderPipelineMap.delete(renderPipelineId); this.__materialStateVersionMap.delete(renderPipelineId); this.__bindGroupTextureMap.delete(renderPipelineId); this.__bindGroupLayoutTextureMap.delete(renderPipelineId); this.__bindGroupSamplerMap.delete(renderPipelineId); this.__bindGroupLayoutSamplerMap.delete(renderPipelineId); this.__createBindGroup(renderPipelineId, material, diffuseCubeMap, specularCubeMap); const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); const modules = this.__webGpuResources.get(material.getShaderProgramUid(primitive)); if (modules != null) { new Error('Shader Modules is not found'); } const gpuVertexBufferLayouts = []; if (!renderPass.isBufferLessRenderingMode()) { gpuVertexBufferLayouts.push({ stepMode: 'instance', attributes: [ { shaderLocation: _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.Instance.getAttributeSlot(), offset: 0, format: 'float32x4', }, ], arrayStride: 4 * 4, }); } primitive.attributeAccessors.forEach((accessor, i) => { const slotIdx = _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_5__.VertexAttribute.toAttributeSlotFromJoinedString(primitive.attributeSemantics[i]); const attribute = { shaderLocation: slotIdx, offset: 0, format: (accessor.componentType.webgpu + accessor.compositionType.webgpu), }; gpuVertexBufferLayouts.push({ stepMode: 'vertex', arrayStride: primitive.attributeAccessors[i].actualByteStride, attributes: [attribute], }); }); const pipelineLayout = gpuDevice.createPipelineLayout({ bindGroupLayouts: [ this.__bindGroupLayoutStorageBuffer, this.__bindGroupLayoutTextureMap.get(renderPipelineId), this.__bindGroupLayoutSamplerMap.get(renderPipelineId), ], }); let blend; if (material.isBlend()) { if (material.alphaMode === _foundation_definitions_AlphaMode__WEBPACK_IMPORTED_MODULE_15__.AlphaMode.Blend) { blend = { color: { srcFactor: material.blendFuncSrcFactor.webgpu, dstFactor: material.blendFuncDstFactor.webgpu, operation: material.blendEquationMode.webgpu, }, alpha: { srcFactor: material.blendFuncAlphaSrcFactor.webgpu, dstFactor: material.blendFuncAlphaDstFactor.webgpu, operation: material.blendEquationModeAlpha.webgpu, }, }; } } const mode = renderPass.isBufferLessRenderingMode() ? renderPass._primitiveModeForBufferLessRendering : primitive.primitiveMode; const topology = mode.getWebGPUTypeStr(); let stripIndexFormat = undefined; if (topology === 'triangle-strip' || topology === 'line-strip') { stripIndexFormat = primitive.getIndexBitSize(); } const primitiveIdxHasMorph = _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_6__.Primitive.getPrimitiveIdxHasMorph(primitive.primitiveUid); const framebuffer = renderPass.getFramebuffer(); let targets = [ { // @location(0) in fragment shader format: presentationFormat, blend, }, ]; let depthStencilFormat = 'depth24plus'; if (framebuffer != null) { targets = []; for (let colorAttachment of framebuffer.colorAttachments) { const texture = this.__webGpuResources.get(colorAttachment._textureResourceUid); targets.push({ format: texture.format, blend, }); } if (framebuffer.depthAttachment != null) { const depthTexture = this.__webGpuResources.get(framebuffer.depthAttachment._textureResourceUid); depthStencilFormat = depthTexture.format; } else { depthStencilFormat = undefined; } } const pipeline = gpuDevice.createRenderPipeline({ layout: pipelineLayout, vertex: { module: modules.vsModule, entryPoint: 'main', constants: { _materialSID: material.materialSID, _currentPrimitiveIdx: primitiveIdxHasMorph !== null && primitiveIdxHasMorph !== void 0 ? primitiveIdxHasMorph : 0, _morphTargetNumber: primitive.targets.length, _cameraSID: cameraId, }, buffers: gpuVertexBufferLayouts, }, fragment: { module: modules.fsModule, entryPoint: 'main', constants: { _materialSID: material.materialSID, _cameraSID: cameraId, }, targets: targets, }, primitive: { topology: topology, stripIndexFormat: stripIndexFormat, frontFace: material.cullFrontFaceCCW ? 'ccw' : 'cw', cullMode: material.cullFace ? 'back' : 'none', }, depthStencil: depthStencilFormat == null ? undefined : { depthWriteEnabled: (renderPass.isDepthTest && renderPass.depthWriteMask && isOpaque) || (renderPass.isDepthTest && renderPass.depthWriteMask && !isOpaque && _foundation_components_MeshRenderer_MeshRendererComponent__WEBPACK_IMPORTED_MODULE_14__.MeshRendererComponent.isDepthMaskTrueForBlendPrimitives) ? true : false, depthCompare: renderPass.isDepthTest ? 'less' : 'always', format: depthStencilFormat, }, multisample: { count: renderPass.getResolveFramebuffer() != null ? renderPass.getFramebuffer().colorAttachments[0].sampleCount : 1, }, }); this.__webGpuRenderPipelineMap.set(renderPipelineId, pipeline); this.__materialStateVersionMap.set(renderPipelineId, material.stateVersion); return [pipeline, true]; } flush() { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; gpuDevice.queue.submit([this.__commandEncoder.finish()]); this.__commandEncoder = gpuDevice.createCommandEncoder(); if (this.__contextCurrentTextureView != null) { this.__contextCurrentTextureView = undefined; } } /** * Create Cube Texture from image files. * @param baseUri the base uri to load images; * @param mipLevelCount the number of mip levels (include root level). if no mipmap, the value should be 1; * @returns the WebGLResourceHandle for the generated Cube Texture */ async createCubeTextureFromFiles(baseUri, mipLevelCount, isNamePosNeg, hdriFormat) { const imageArgs = []; let width = 0; let height = 0; for (let i = 0; i < mipLevelCount; i++) { const loadOneLevel = () => { return new Promise((resolve, reject) => { let loadedCount = 0; const images = []; let extension = '.jpg'; if (hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.HDR_LINEAR) { extension = '.hdr'; } else if (hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.RGBE_PNG) { extension = '.RGBE.PNG'; } let posX = '_right_'; let negX = '_left_'; let posY = '_top_'; let negY = '_bottom_'; let posZ = '_front_'; let negZ = '_back_'; if (isNamePosNeg) { posX = '_posx_'; negX = '_negx_'; posY = '_posy_'; negY = '_negy_'; posZ = '_posz_'; negZ = '_negz_'; } const faces = [ [baseUri + posX + i + extension, 'posX'], [baseUri + negX + i + extension, 'negX'], [baseUri + posY + i + extension, 'posY'], [baseUri + negY + i + extension, 'negY'], [baseUri + posZ + i + extension, 'posZ'], [baseUri + negZ + i + extension, 'negZ'], ]; for (let j = 0; j < faces.length; j++) { const face = faces[j][1]; let image; if (hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.HDR_LINEAR || hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.RGB9_E5_PNG) { image = new HDRImage(); } else { image = new Image(); } image.hdriFormat = hdriFormat; image.side = face; image.uri = faces[j][0]; image.crossOrigin = 'Anonymous'; image.onload = () => { loadedCount++; images.push(image); if (loadedCount === 6) { resolve(images); } }; image.onerror = () => { reject(image.uri); }; image.src = faces[j][0]; } }); }; let images; try { images = await loadOneLevel(); } catch (e) { // Try again once try { images = await loadOneLevel(); } catch (uri) { // Give up _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error(`failed to load ${uri}`); } } const imageBitmaps = []; for (const image of images) { if (image.hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.HDR_LINEAR) { imageBitmaps.push(image); } else { await image.decode(); const imageBitmap = await createImageBitmap(image); imageBitmaps.push(imageBitmap); imageBitmap.side = image.side; } } const imageObj = {}; for (const imageBitmap of imageBitmaps) { switch (imageBitmap.side) { case 'posX': imageObj.posX = imageBitmap; break; case 'posY': imageObj.posY = imageBitmap; break; case 'posZ': imageObj.posZ = imageBitmap; break; case 'negX': imageObj.negX = imageBitmap; break; case 'negY': imageObj.negY = imageBitmap; break; case 'negZ': imageObj.negZ = imageBitmap; break; } if (i === 0) { width = imageBitmap.width; height = imageBitmap.height; } } imageArgs.push(imageObj); } return this.createCubeTexture(mipLevelCount, imageArgs, width, height); } /** * create a CubeTexture * * @param mipLevelCount * @param images * @param width * @param height * @returns resource handle */ createCubeTexture(mipLevelCount, images, width, height) { const mipmaps = []; for (let i = 0; i < mipLevelCount; i++) { const imageBitmaps = []; if (images[i].posX instanceof ImageBitmap || images[0].posX instanceof HTMLCanvasElement) { imageBitmaps.push(images[i].posX); imageBitmaps.push(images[i].negX); imageBitmaps.push(images[i].posY); imageBitmaps.push(images[i].negY); imageBitmaps.push(images[i].posZ); imageBitmaps.push(images[i].negZ); } mipmaps.push(imageBitmaps); } const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const cubemapTexture = gpuDevice.createTexture({ dimension: '2d', size: [width, height, 6], format: mipmaps[0][0].hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.HDR_LINEAR ? 'rgba32float' : 'rgba8unorm', mipLevelCount: mipLevelCount, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, }); for (let i = 0; i < mipLevelCount; i++) { for (let j = 0; j < mipmaps[i].length; j++) { const imageBitmap = mipmaps[i][j]; if (imageBitmap.hdriFormat === _foundation_definitions_HdriFormat__WEBPACK_IMPORTED_MODULE_12__.HdriFormat.HDR_LINEAR) { // HDR image is 3 channels, so we need to convert it to 4 channels const newFloat323Array = new Float32Array(imageBitmap.width * imageBitmap.height * 4); const dataFloat = imageBitmap.dataFloat; const size = imageBitmap.width * imageBitmap.height; for (let k = 0; k < size; k++) { newFloat323Array[k * 4] = dataFloat[k * 3]; newFloat323Array[k * 4 + 1] = dataFloat[k * 3 + 1]; newFloat323Array[k * 4 + 2] = dataFloat[k * 3 + 2]; newFloat323Array[k * 4 + 3] = 1.0; } // Align the row data size to multiple of 256 bytes const bytesPerRow = imageBitmap.width * 4 * Float32Array.BYTES_PER_ELEMENT; const paddedBytesPerRow = Math.ceil(bytesPerRow / 256) * 256; // 256-byte alignment (GPUImageCopyBuffer.bytesPerRow). See: https://www.w3.org/TR/webgpu/#gpuimagecopybuffer const paddedRowSize = paddedBytesPerRow / Float32Array.BYTES_PER_ELEMENT; const paddedFloatData = new Float32Array(paddedRowSize * imageBitmap.height); for (let y = 0; y < imageBitmap.height; y++) { const sourceStart = y * imageBitmap.width * 4; const sourceEnd = sourceStart + imageBitmap.width * 4; const destStart = y * paddedRowSize; paddedFloatData.set(newFloat323Array.subarray(sourceStart, sourceEnd), destStart); } const buffer = gpuDevice.createBuffer({ size: paddedFloatData.byteLength, usage: GPUBufferUsage.COPY_SRC, mappedAtCreation: true, }); new Float32Array(buffer.getMappedRange()).set(paddedFloatData); buffer.unmap(); const commandEncoder = gpuDevice.createCommandEncoder(); commandEncoder.copyBufferToTexture({ buffer: buffer, bytesPerRow: paddedBytesPerRow, rowsPerImage: imageBitmap.height, }, { texture: cubemapTexture, origin: [0, 0, j], mipLevel: i }, [imageBitmap.width, imageBitmap.height, 1]); const commandBuffer = commandEncoder.finish(); gpuDevice.queue.submit([commandBuffer]); } else { gpuDevice.queue.copyExternalImageToTexture({ source: imageBitmap }, { texture: cubemapTexture, origin: [0, 0, j], mipLevel: i }, [imageBitmap.width, imageBitmap.height, 1]); } } } const handle = this.__registerResource(cubemapTexture); const wrapS = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.Repeat; const wrapT = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.Repeat; const minFilter = mipLevelCount === 1 ? _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.Linear : _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.LinearMipmapLinear; const magFilter = _foundation_definitions_TextureParameter__WEBPACK_IMPORTED_MODULE_4__.TextureParameter.Linear; const sampler = new _foundation_textures_Sampler__WEBPACK_IMPORTED_MODULE_10__.Sampler({ wrapS, wrapT, minFilter, magFilter, anisotropy: false }); sampler.create(); return [handle, sampler]; } createStorageBuffer(inputArray) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const storageBuffer = gpuDevice.createBuffer({ size: inputArray.byteLength, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE, }); gpuDevice.queue.writeBuffer(storageBuffer, 0, inputArray); this.__storageBuffer = storageBuffer; const storageBufferHandle = this.__registerResource(storageBuffer); return storageBufferHandle; } updateStorageBuffer(storageBufferHandle, inputArray, updateComponentSize) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const storageBuffer = this.__webGpuResources.get(storageBufferHandle); gpuDevice.queue.writeBuffer(storageBuffer, 0, inputArray, 0, updateComponentSize); } createStorageBlendShapeBuffer(inputArray) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const storageBuffer = gpuDevice.createBuffer({ size: inputArray.byteLength, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE, }); gpuDevice.queue.writeBuffer(storageBuffer, 0, inputArray); this.__storageBlendShapeBuffer = storageBuffer; const storageBufferHandle = this.__registerResource(storageBuffer); return storageBufferHandle; } updateStorageBlendShapeBuffer(storageBufferHandle, inputArray, updateComponentSize) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const storageBuffer = this.__webGpuResources.get(storageBufferHandle); gpuDevice.queue.writeBuffer(storageBuffer, 0, inputArray, 0, updateComponentSize); } createUniformMorphOffsetsBuffer() { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const inputArray = new Uint32Array(Math.ceil((_foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.maxVertexPrimitiveNumberInShader * _foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.maxVertexMorphNumberInShader) / 4) * 4); const uniformBuffer = gpuDevice.createBuffer({ size: inputArray.byteLength, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM, }); gpuDevice.queue.writeBuffer(uniformBuffer, 0, inputArray); this.__uniformMorphOffsetsBuffer = uniformBuffer; const uniformBufferHandle = this.__registerResource(uniformBuffer); return uniformBufferHandle; } updateUniformMorphOffsetsBuffer(inputArray, elementNum) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; if (this.__uniformMorphOffsetsBuffer == null) { throw new Error('Not found uniform morph buffer.'); } gpuDevice.queue.writeBuffer(this.__uniformMorphOffsetsBuffer, 0, inputArray, 0, elementNum); } createUniformMorphWeightsBuffer() { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const inputArray = new Float32Array(Math.ceil((_foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.maxVertexPrimitiveNumberInShader * _foundation_core_Config__WEBPACK_IMPORTED_MODULE_11__.Config.maxVertexMorphNumberInShader) / 4) * 4); const uniformBuffer = gpuDevice.createBuffer({ size: inputArray.byteLength, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM, }); gpuDevice.queue.writeBuffer(uniformBuffer, 0, inputArray); this.__uniformMorphWeightsBuffer = uniformBuffer; const uniformBufferHandle = this.__registerResource(uniformBuffer); return uniformBufferHandle; } updateUniformMorphWeightsBuffer(inputArray, elementNum) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; if (this.__uniformMorphWeightsBuffer == null) { throw new Error('Not found uniform morph buffer.'); } gpuDevice.queue.writeBuffer(this.__uniformMorphWeightsBuffer, 0, inputArray, 0, elementNum); } __createBindGroup(renderPipelineId, material, diffuseCubeMap, specularCubeMap) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; // Group 0 (Storage Buffer, UniformMorph Buffer) { const entries = []; const bindGroupLayoutEntries = []; if (this.__storageBuffer != null) { entries.push({ binding: 0, resource: { buffer: this.__storageBuffer, }, }); bindGroupLayoutEntries.push({ binding: 0, buffer: { type: 'read-only-storage', }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); } if (this.__storageBlendShapeBuffer != null) { entries.push({ binding: 1, resource: { buffer: this.__storageBlendShapeBuffer, }, }); bindGroupLayoutEntries.push({ binding: 1, buffer: { type: 'read-only-storage', }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); } else { const dummyBuffer = gpuDevice.createBuffer({ size: 16, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE, }); entries.push({ binding: 1, resource: { buffer: dummyBuffer, }, }); bindGroupLayoutEntries.push({ binding: 1, buffer: { type: 'read-only-storage', }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); } if (this.__uniformMorphOffsetsBuffer != null) { entries.push({ binding: 2, resource: { buffer: this.__uniformMorphOffsetsBuffer, }, }); bindGroupLayoutEntries.push({ binding: 2, buffer: { type: 'uniform', }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); } if (this.__uniformMorphWeightsBuffer != null) { entries.push({ binding: 3, resource: { buffer: this.__uniformMorphWeightsBuffer, }, }); bindGroupLayoutEntries.push({ binding: 3, buffer: { type: 'uniform', }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); } const bindGroupLayoutDesc = { entries: bindGroupLayoutEntries, }; const bindGroupLayout = gpuDevice.createBindGroupLayout(bindGroupLayoutDesc); const uniformBindGroup = gpuDevice.createBindGroup({ layout: bindGroupLayout, entries: entries, }); this.__bindGroupStorageBuffer = uniformBindGroup; this.__bindGroupLayoutStorageBuffer = bindGroupLayout; } // Group 1 (Texture), Group 2 (Sampler) { const entriesForTexture = []; const bindGroupLayoutEntriesForTexture = []; const entriesForSampler = []; const bindGroupLayoutEntriesForSampler = []; material._autoFieldVariablesOnly.forEach((value) => { const info = value.info; if (info.semantic === 'diffuseEnvTexture' || info.semantic === 'specularEnvTexture') { return; } if (_foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_1__.CompositionType.isTexture(info.compositionType)) { const slot = value.value[0]; const texture = value.value[1]; const sampler = value.value[2]; // Texture const type = texture instanceof _foundation_textures_CubeTexture__WEBPACK_IMPORTED_MODULE_17__.CubeTexture || texture instanceof _foundation_textures_RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_23__.RenderTargetTextureCube ? 'cube' : '2d'; let gpuTextureView = this.__webGpuResources.get(texture._textureViewResourceUid); if (gpuTextureView == null) { if (texture instanceof _foundation_textures_CubeTexture__WEBPACK_IMPORTED_MODULE_17__.CubeTexture || texture instanceof _foundation_textures_RenderTargetTextureCube__WEBPACK_IMPORTED_MODULE_23__.RenderTargetTextureCube) { const gpuTexture = this.__webGpuResources.get(_foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackCubeTexture._textureResourceUid); gpuTextureView = gpuTexture.createView({ dimension: 'cube' }); } else { const gpuTexture = this.__webGpuResources.get(_foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyWhiteTexture._textureResourceUid); gpuTextureView = gpuTexture.createView(); } } entriesForTexture.push({ binding: slot, resource: gpuTextureView, }); bindGroupLayoutEntriesForTexture.push({ binding: slot, texture: { viewDimension: type, }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); // Sampler if (!sampler.created) { sampler.create(); } const gpuSampler = this.__webGpuResources.get(sampler._samplerResourceUid); entriesForSampler.push({ binding: slot, resource: gpuSampler, }); bindGroupLayoutEntriesForSampler.push({ binding: slot, sampler: { type: 'filtering', }, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, }); } }); // Diffuse IBL const diffuseCubeTextureView = this.__webGpuResources.get(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(diffuseCubeMap) ? diffuseCubeMap._textureViewResourceUid : -1); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(diffuseCubeTextureView)) { entriesForTexture.push({ binding: IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT, resource: diffuseCubeTextureView, }); } else { const dummyCubeTextureView = this.__webGpuResources.get(_foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackCubeTexture._textureViewResourceUid); entriesForTexture.push({ binding: IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT, resource: dummyCubeTextureView, }); } bindGroupLayoutEntriesForTexture.push({ binding: IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT, texture: { viewDimension: 'cube', }, visibility: GPUShaderStage.FRAGMENT, }); const diffuseCubeSampler = this.__webGpuResources.get(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(diffuseCubeMap) ? diffuseCubeMap._samplerResourceUid : -1); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(diffuseCubeSampler)) { entriesForSampler.push({ binding: IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT, resource: diffuseCubeSampler, }); } else { const dummyCubeSampler = this.__webGpuResources.get(_foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackCubeTexture._samplerResourceUid); entriesForSampler.push({ binding: IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT, resource: dummyCubeSampler, }); } bindGroupLayoutEntriesForSampler.push({ binding: IBL_DIFFUSE_CUBE_TEXTURE_BINDING_SLOT, sampler: { type: 'filtering', }, visibility: GPUShaderStage.FRAGMENT, }); // Specular IBL const specularCubeTextureView = this.__webGpuResources.get(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(specularCubeMap) ? specularCubeMap._textureViewResourceUid : -1); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(specularCubeTextureView)) { entriesForTexture.push({ binding: IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT, resource: specularCubeTextureView, }); } else { const dummyCubeTextureView = this.__webGpuResources.get(_foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackCubeTexture._textureViewResourceUid); entriesForTexture.push({ binding: IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT, resource: dummyCubeTextureView, }); } bindGroupLayoutEntriesForTexture.push({ binding: IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT, texture: { viewDimension: 'cube', }, visibility: GPUShaderStage.FRAGMENT, }); const specularCubeSampler = this.__webGpuResources.get(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(specularCubeMap) ? specularCubeMap._samplerResourceUid : -1); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_8__.Is.exist(specularCubeSampler)) { entriesForSampler.push({ binding: IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT, resource: specularCubeSampler, }); } else { const dummyCubeSampler = this.__webGpuResources.get(_foundation_materials_core_DummyTextures__WEBPACK_IMPORTED_MODULE_13__.dummyBlackCubeTexture._samplerResourceUid); entriesForSampler.push({ binding: IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT, resource: dummyCubeSampler, }); } bindGroupLayoutEntriesForSampler.push({ binding: IBL_SPECULAR_CUBE_TEXTURE_BINDING_SLOT, sampler: { type: 'filtering', }, visibility: GPUShaderStage.FRAGMENT, }); // Texture const bindGroupLayoutDescForTexture = { entries: bindGroupLayoutEntriesForTexture, }; const bindGroupLayoutForTexture = gpuDevice.createBindGroupLayout(bindGroupLayoutDescForTexture); const bindGroupForTexture = gpuDevice.createBindGroup({ layout: bindGroupLayoutForTexture, entries: entriesForTexture, }); this.__bindGroupTextureMap.set(renderPipelineId, bindGroupForTexture); this.__bindGroupLayoutTextureMap.set(renderPipelineId, bindGroupLayoutForTexture); // Sampler const bindGroupLayoutDescForSampler = { entries: bindGroupLayoutEntriesForSampler, }; const bindGroupLayoutForSampler = gpuDevice.createBindGroupLayout(bindGroupLayoutDescForSampler); const bindGroupForSampler = gpuDevice.createBindGroup({ layout: bindGroupLayoutForSampler, entries: entriesForSampler, }); this.__bindGroupSamplerMap.set(renderPipelineId, bindGroupForSampler); this.__bindGroupLayoutSamplerMap.set(renderPipelineId, bindGroupLayoutForSampler); } } /** * create a Texture * @param imageData * @param param1 * @returns */ async createTextureFromHTMLImageElement(imageData, { level, internalFormat, width, height, border, format, type, generateMipmap, }) { imageData.crossOrigin = 'Anonymous'; const textureHandle = this.__createTextureInner(width, height, internalFormat, generateMipmap, imageData); return textureHandle; } /** * create CompressedTextureFromBasis * @param basisFile * @param param1 * @returns */ createCompressedTextureFromBasis(basisFile, { border, format, type, }) { let basisCompressionType; let compressionType; const mipmapDepth = basisFile.getNumLevels(0); const width = basisFile.getImageWidth(0, 0); const height = basisFile.getImageHeight(0, 0); const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const gpuAdapter = this.__webGpuDeviceWrapper.gpuAdapter; const s3tc = gpuAdapter.features.has('texture-compression-bc'); if (s3tc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_21__.BasisCompressionType.BC3; compressionType = 'bc3-rgba-unorm'; // s3tc.COMPRESSED_RGBA_S3TC_DXT5_EXT; } const etc2 = gpuAdapter.features.has('texture-compression-etc2'); if (etc2) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_21__.BasisCompressionType.ETC2; compressionType = 'etc2-rgba8unorm'; // etc2.COMPRESSED_RGBA8_ETC2_EAC; } const astc = gpuAdapter.features.has('texture-compression-astc'); if (astc) { basisCompressionType = _foundation_definitions_BasisCompressionType__WEBPACK_IMPORTED_MODULE_21__.BasisCompressionType.ASTC; compressionType = 'astc-4x4-unorm'; // astc.COMPRESSED_RGBA_ASTC_4x4_KHR; } const textureDescriptor = { size: [width, height, 1], format: compressionType, mipLevelCount: mipmapDepth, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST, }; const gpuTexture = gpuDevice.createTexture(textureDescriptor); for (let i = 0; i < mipmapDepth; i++) { const width = basisFile.getImageWidth(0, i); const height = basisFile.getImageHeight(0, i); const textureSource = this.decodeBasisImage(basisFile, basisCompressionType, 0, i); const imageData = new ImageData(new Uint8ClampedArray(textureSource), width, height); gpuDevice.queue.copyExternalImageToTexture({ source: imageData }, { texture: gpuTexture, mipLevel: i }, [width, height, 1]); } const textureHandle = this.__registerResource(gpuTexture); return textureHandle; } /** * decode the BasisImage * @param basisFile * @param basisCompressionType * @param imageIndex * @param levelIndex * @returns */ decodeBasisImage(basisFile, basisCompressionType, imageIndex, levelIndex) { const extractSize = basisFile.getImageTranscodedSizeInBytes(imageIndex, levelIndex, basisCompressionType.index); const textureSource = new Uint8Array(extractSize); if (!basisFile.transcodeImage(textureSource, imageIndex, levelIndex, basisCompressionType.index, 0, 0)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error('failed to transcode the image.'); } return textureSource; } /** * Create and bind compressed texture object * @param textureDataArray transcoded texture data for each mipmaps(levels) * @param compressionTextureType */ createCompressedTexture(textureDataArray, compressionTextureType) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const blockInfo = compressionTextureType.blockInfo || { byteSize: 4, width: 1, height: 1 }; const textureDataLevel0 = textureDataArray[0]; const textureDescriptor = { size: [ Math.ceil(textureDataLevel0.width / blockInfo.width) * blockInfo.width, Math.ceil(textureDataLevel0.height / blockInfo.height) * blockInfo.height, 1, ], format: compressionTextureType.webgpu, mipLevelCount: textureDataArray.length, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST, }; const texture = gpuDevice.createTexture(textureDescriptor); for (let level = 0; level < textureDataArray.length; level++) { const textureData = textureDataArray[level]; const mipWidth = textureData.width; const mipHeight = textureData.height; const bytesPerRow = Math.ceil(mipWidth / blockInfo.width) * blockInfo.byteSize; const compressedTextureData = new Uint8Array(textureData.buffer.buffer); gpuDevice.queue.writeTexture({ texture, mipLevel: level, }, compressedTextureData, { offset: 0, bytesPerRow, }, { width: Math.ceil(mipWidth / blockInfo.width) * blockInfo.width, height: Math.ceil(mipHeight / blockInfo.height) * blockInfo.height, }); } const textureHandle = this.__registerResource(texture); return textureHandle; } /** * allocate a Texture * @param format - the format of the texture * @param width - the width of the texture * @param height - the height of the texture * @param mipmapCount - the number of mipmap levels * @returns the handle of the texture */ allocateTexture({ format, width, height, mipLevelCount, }) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const textureDescriptor = { size: [width, height, 1], mipLevelCount: mipLevelCount, format: format.webgpu, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, }; const gpuTexture = gpuDevice.createTexture(textureDescriptor); const textureHandle = this.__registerResource(gpuTexture); return textureHandle; } /** * Load an image to a specific mip level of a texture * @param mipLevel - the mip level to load the image to * @param textureUid - the handle of the texture * @param format - the format of the image * @param type - the type of the data * @param xOffset - the x offset of copy region * @param yOffset - the y offset of copy region * @param width - the width of the image * @param height - the height of the image * @param data - the typedarray data of the image */ async loadImageToMipLevelOfTexture2D({ mipLevel, textureUid, format, type, xOffset, yOffset, width, height, rowSizeByPixel, data, }) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const texture = this.__webGpuResources.get(textureUid); const pixelFormat = _foundation_definitions_TextureFormat__WEBPACK_IMPORTED_MODULE_22__.TextureFormat.getPixelFormatFromTextureFormat(format); const compositionNum = _foundation_definitions_PixelFormat__WEBPACK_IMPORTED_MODULE_3__.PixelFormat.getCompositionNumFromPixelFormat(pixelFormat); const bytesPerRow = rowSizeByPixel * compositionNum * type.getSizeInBytes(); // Align the row data size to multiple of 256 bytes due to the WebGPU spec const paddedBytesPerRow = Math.ceil(bytesPerRow / 256) * 256; // Copy data to padded buffer const paddedData = new Uint8Array(paddedBytesPerRow * height); for (let row = 0; row < height; row++) { const srcOffset = row * bytesPerRow; const dstOffset = row * paddedBytesPerRow; paddedData.set(new Uint8Array(data.buffer, srcOffset, bytesPerRow), dstOffset); } // バッファの作成 const buffer = gpuDevice.createBuffer({ size: paddedData.byteLength, usage: GPUBufferUsage.COPY_SRC, mappedAtCreation: true, }); new Uint8Array(buffer.getMappedRange()).set(paddedData); buffer.unmap(); const commandEncoder = gpuDevice.createCommandEncoder(); commandEncoder.copyBufferToTexture({ buffer, offset: 0, bytesPerRow: paddedBytesPerRow, rowsPerImage: height, }, { texture, mipLevel, origin: { x: xOffset, y: yOffset, z: 0 }, }, { width: width, height: height, depthOrArrayLayers: 1, }); const commandBuffer = commandEncoder.finish(); gpuDevice.queue.submit([commandBuffer]); try { await gpuDevice.queue.onSubmittedWorkDone(); } catch (e) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_24__.Logger.error(e); } } __createTextureInner(width, height, internalFormat, generateMipmap, imageData) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const textureDescriptor = { size: [width, height, 1], format: internalFormat.webgpu, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, }; if (generateMipmap) { textureDescriptor.mipLevelCount = Math.floor(Math.log2(Math.max(width, height))) + 1; } const gpuTexture = gpuDevice.createTexture(textureDescriptor); gpuDevice.queue.copyExternalImageToTexture({ source: imageData }, { texture: gpuTexture }, [ width, height, ]); if (generateMipmap) { this.generateMipmaps(gpuTexture, textureDescriptor); } const textureHandle = this.__registerResource(gpuTexture); return textureHandle; } /** * create a RenderTargetTexture * @param param0 * @returns */ createRenderTargetTexture({ width, height, mipLevelCount, format, }) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const textureDescriptor = { size: [width, height, 1], format: format.webgpu, mipLevelCount, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, }; const gpuTexture = gpuDevice.createTexture(textureDescriptor); const textureHandle = this.__registerResource(gpuTexture); return textureHandle; } /** * create a RenderTargetTextureArray * @param param0 * @returns */ createRenderTargetTextureArray({ width, height, level, internalFormat, format, type, arrayLength, }) { return -1; } /** * create a RenderTargetTextureCube * @param param0 * @returns */ createRenderTargetTextureCube({ width, height, mipLevelCount, format, }) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const textureDescriptor = { dimension: '2d', size: [width, height, 6], format: format.webgpu, mipLevelCount, usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, }; const gpuTexture = gpuDevice.createTexture(textureDescriptor); const textureHandle = this.__registerResource(gpuTexture); return textureHandle; } /** * create Renderbuffer */ createRenderBuffer(width, height, internalFormat, isMSAA, sampleCountMSAA) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const textureDescriptor = { size: [width, height, 1], format: internalFormat.webgpu, sampleCount: isMSAA ? sampleCountMSAA : 1, usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT, }; const gpuTexture = gpuDevice.createTexture(textureDescriptor); const textureHandle = this.__registerResource(gpuTexture); return textureHandle; } /** * delete a RenderBuffer * @param renderBufferUid */ deleteRenderBuffer(renderBufferUid) { this.flush(); this.clearCache(); const texture = this.__webGpuResources.get(renderBufferUid); if (texture != null) { texture.destroy(); this.__webGpuResources.delete(renderBufferUid); } } /** * copy Texture Data * @param fromTexture * @param toTexture */ copyTextureData(fromTexture, toTexture) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const from = this.__webGpuResources.get(fromTexture); const to = this.__webGpuResources.get(toTexture); if (this.__renderPassEncoder != null) { if (this.__renderBundleEncoder != null) { this.__renderPassEncoder.executeBundles([this.__renderBundleEncoder.finish()]); } this.__renderPassEncoder.end(); this.__renderPassEncoder = undefined; } this.__commandEncoder.copyTextureToTexture({ texture: from, }, { texture: to, }, [to.width, to.height, 1]); } isMippmappedTexture(textureHandle) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const texture = this.__webGpuResources.get(textureHandle); if (texture.mipLevelCount > 1) { return true; } else { return false; } } duplicateTextureAsMipmapped(fromTexture) { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const texture = this.__webGpuResources.get(fromTexture); // Create a new texture with the same descriptor const textureDescriptor = { size: { width: texture.width, height: texture.height, depthOrArrayLayers: texture.depthOrArrayLayers, }, mipLevelCount: Math.floor(Math.log2(Math.max(texture.width, texture.height))) + 1, format: texture.format, usage: texture.usage, }; const newTexture = gpuDevice.createTexture(textureDescriptor); if (this.__renderPassEncoder != null) { if (this.__renderBundleEncoder != null) { this.__renderPassEncoder.executeBundles([this.__renderBundleEncoder.finish()]); } this.__renderPassEncoder.end(); this.__renderPassEncoder = undefined; } // Copy the texture to the new texture this.__commandEncoder.copyTextureToTexture({ texture: texture }, { texture: newTexture }, { width: texture.width, height: texture.height, depthOrArrayLayers: 1 }); const textureHandle = this.__registerResource(newTexture); const textureViewHandle = this.__registerResource(newTexture.createView()); return [textureHandle, textureViewHandle]; } /** * attach the DepthBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a DepthBuffer */ attachDepthBufferToFrameBufferObject(framebuffer, renderable) { } /** * attach the StencilBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a StencilBuffer */ attachStencilBufferToFrameBufferObject(framebuffer, renderable) { } /** * attach the depthStencilBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a depthStencilBuffer */ attachDepthStencilBufferToFrameBufferObject(framebuffer, renderable) { } /** * create a FrameBufferObject * @returns */ createFrameBufferObject() { return -1; } /** * delete a FrameBufferObject * @param frameBufferObjectHandle */ deleteFrameBufferObject(frameBufferObjectHandle) { } /** * attach the ColorBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param renderable a ColorBuffer */ attachColorBufferToFrameBufferObject(framebuffer, index, renderable) { return; } /** * attach the ColorBuffer to the FrameBufferObject * @param framebuffer a Framebuffer * @param attachmentIndex a attachment index * @param faceIndex a face index * @param mipLevel a mip level * @param renderable a ColorBuffer */ attachColorBufferCubeToFrameBufferObject(framebuffer, attachmentIndex, faceIndex, mipLevel, renderable) { } createTextureView2d(textureHandle) { const texture = this.__webGpuResources.get(textureHandle); const textureView = texture.createView(); const textureViewHandle = this.__registerResource(textureView); return textureViewHandle; } createTextureViewAsRenderTarget(textureHandle) { const texture = this.__webGpuResources.get(textureHandle); const textureView = texture.createView({ baseMipLevel: 0, mipLevelCount: 1 }); const textureViewHandle = this.__registerResource(textureView); return textureViewHandle; } createTextureViewCube(textureHandle) { const texture = this.__webGpuResources.get(textureHandle); const textureView = texture.createView({ dimension: 'cube' }); const textureViewHandle = this.__registerResource(textureView); return textureViewHandle; } createCubeTextureViewAsRenderTarget(textureHandle, faceIdx, mipLevel) { const texture = this.__webGpuResources.get(textureHandle); const textureView = texture.createView({ dimension: '2d', arrayLayerCount: 1, baseArrayLayer: faceIdx, baseMipLevel: mipLevel, mipLevelCount: 1, aspect: 'all', }); const textureViewHandle = this.__registerResource(textureView); return textureViewHandle; } deleteTexture(textureHandle) { this.flush(); this.clearCache(); const texture = this.__webGpuResources.get(textureHandle); if (texture != null) { texture.destroy(); this.__webGpuResources.delete(textureHandle); } } recreateSystemDepthTexture() { const gpuDevice = this.__webGpuDeviceWrapper.gpuDevice; const canvas = this.__webGpuDeviceWrapper.canvas; if (this.__systemDepthTexture != null) { this.__systemDepthTexture.destroy(); } this.__systemDepthTexture = gpuDevice.createTexture({ size: [canvas.width, canvas.height], format: 'depth24plus', usage: GPUTextureUsage.RENDER_ATTACHMENT, }); this.__systemDepthTextureView = this.__systemDepthTexture.createView(); } resizeCanvas(width, height) { const canvas = this.__webGpuDeviceWrapper.canvas; canvas.width = width; canvas.height = height; this.recreateSystemDepthTexture(); } setViewport(viewport) { } isSupportMultiViewVRRendering() { return false; } } /***/ }), /***/ "./src/webgpu/WebGpuStrategyBasic.ts": /*!*******************************************!*\ !*** ./src/webgpu/WebGpuStrategyBasic.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGpuStrategyBasic: () => (/* binding */ WebGpuStrategyBasic) /* harmony export */ }); /* harmony import */ var _foundation_components_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/components/Mesh/MeshComponent */ "./src/foundation/components/Mesh/MeshComponent.ts"); /* harmony import */ var _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/core/MemoryManager */ "./src/foundation/core/MemoryManager.ts"); /* harmony import */ var _foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/definitions/BufferUse */ "./src/foundation/definitions/BufferUse.ts"); /* harmony import */ var _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/geometry/Primitive */ "./src/foundation/geometry/Primitive.ts"); /* harmony import */ var _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/materials/core/Material */ "./src/foundation/materials/core/Material.ts"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/renderer/RenderingCommonMethods */ "./src/foundation/renderer/RenderingCommonMethods.ts"); /* harmony import */ var _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebGpuResourceRepository */ "./src/webgpu/WebGpuResourceRepository.ts"); /* harmony import */ var _foundation_core_Component__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/core/Component */ "./src/foundation/core/Component.ts"); /* harmony import */ var _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/components/SceneGraph/SceneGraphComponent */ "./src/foundation/components/SceneGraph/SceneGraphComponent.ts"); /* harmony import */ var _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/core/GlobalDataRepository */ "./src/foundation/core/GlobalDataRepository.ts"); /* harmony import */ var _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/materials/core/MaterialRepository */ "./src/foundation/materials/core/MaterialRepository.ts"); /* harmony import */ var _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../foundation/definitions/CompositionType */ "./src/foundation/definitions/CompositionType.ts"); /* harmony import */ var _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../foundation/definitions/ComponentType */ "./src/foundation/definitions/ComponentType.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../foundation/core/ComponentRepository */ "./src/foundation/core/ComponentRepository.ts"); /* harmony import */ var _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../foundation/components/Camera/CameraComponent */ "./src/foundation/components/Camera/CameraComponent.ts"); /* harmony import */ var _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../foundation/core/Config */ "./src/foundation/core/Config.ts"); /* harmony import */ var _foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../foundation/definitions/VertexAttribute */ "./src/foundation/definitions/VertexAttribute.ts"); /* harmony import */ var _foundation_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../foundation/components/BlendShape/BlendShapeComponent */ "./src/foundation/components/BlendShape/BlendShapeComponent.ts"); /* harmony import */ var _foundation_components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../foundation/components/CameraController/CameraControllerComponent */ "./src/foundation/components/CameraController/CameraControllerComponent.ts"); /* harmony import */ var _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../foundation/components/Transform/TransformComponent */ "./src/foundation/components/Transform/TransformComponent.ts"); /* harmony import */ var _foundation_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../foundation/components/Animation/AnimationComponent */ "./src/foundation/components/Animation/AnimationComponent.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); class WebGpuStrategyBasic { constructor() { this.__storageBufferUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__storageBlendShapeBufferUid = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.InvalidCGAPIResourceUid; this.__lastMaterialsUpdateCount = -1; this.__lastTransformComponentsUpdateCount = -1; this.__lastSceneGraphComponentsUpdateCount = -1; this.__lastCameraControllerComponentsUpdateCount = -1; this.__lastBlendShapeComponentsUpdateCountForWeights = -1; this.__lastBlendShapeComponentsUpdateCountForBlendData = -1; } static getInstance() { if (!this.__instance) { this.__instance = new WebGpuStrategyBasic(); } return this.__instance; } static getVertexShaderMethodDefinitions_storageBuffer() { return ` fn get_worldMatrix(instanceId: u32) -> mat4x4 { let index: u32 = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_8__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_9__.SceneGraphComponent, 'worldMatrix')}u + 4u * instanceId; let matrix = fetchMat4(index); return matrix; } fn get_normalMatrix(instanceId: u32) -> mat3x3 { let index: u32 = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_8__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_9__.SceneGraphComponent, 'normalMatrix')}u * 4 + 9 * instanceId; let matrix = fetchMat3No16BytesAligned(index); return matrix; } fn get_isVisible(instanceId: u32) -> bool { let index: u32 = ${_foundation_core_Component__WEBPACK_IMPORTED_MODULE_8__.Component.getLocationOffsetOfMemberOfComponent(_foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_9__.SceneGraphComponent, 'isVisible')}u * 4u + instanceId; let visibility = fetchScalarNo16BytesAligned(index); if (visibility > 0.5) { return true; } else { return false; } } #ifdef RN_IS_VERTEX_SHADER #ifdef RN_IS_MORPHING fn get_position(vertexId: u32, basePosition: vec3, blendShapeComponentSID: u32) -> vec3 { var position = basePosition; let scalar_idx = 3u * vertexId; for (var i=0u; i<_morphTargetNumber; i++) { let idx = ${_foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader}u * _currentPrimitiveIdx + i; let offsets = uniformMorphOffsets.data[ idx / 4u]; let offsetPosition = offsets[idx % 4u]; let basePosIn4bytes = offsetPosition * 4u + scalar_idx; let addPos = fetchVec3No16BytesAlignedFromBlendShapeBuffer(basePosIn4bytes); let idx2 = ${_foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader}u * blendShapeComponentSID + i; let morphWeights: vec4f = uniformMorphWeights.data[ idx2 / 4u]; let morphWeight: f32 = morphWeights[idx2 % 4u]; position += addPos * morphWeight; } return position; } #endif #endif `; } static __getShaderProperty(materialTypeName, info, isGlobalData) { var _a, _b; const returnType = info.compositionType.toWGSLType(info.componentType); const methodName = info.semantic.replace('.', '_'); const isTexture = _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.isTexture(info.compositionType); if (isTexture) { const isCubeMap = info.compositionType === _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.TextureCube; const textureType = isCubeMap ? 'texture_cube' : 'texture_2d'; const samplerName = methodName.replace('Texture', 'Sampler'); return ` @group(1) @binding(${info.initialValue[0]}) var ${methodName}: ${textureType}; @group(2) @binding(${info.initialValue[0]}) var ${samplerName}: sampler; `; } // inner contents of 'get_' shader function const vec4SizeOfProperty = info.compositionType.getVec4SizeOfProperty(); // for non-`index` property (this is general case) const scalarSizeOfProperty = info.compositionType.getNumberOfComponents(); const offsetOfProperty = WebGpuStrategyBasic.getOffsetOfPropertyInShader(isGlobalData, info.semantic, materialTypeName); if (offsetOfProperty === -1) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_23__.Logger.error('Could not get the location offset of the property.'); } let indexStr; let instanceSize = vec4SizeOfProperty; indexStr = ` let vec4_idx: u32 = ${offsetOfProperty}u + ${instanceSize}u * instanceId;\n`; if (_foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.isArray(info.compositionType)) { instanceSize = vec4SizeOfProperty * ((_a = info.arrayLength) !== null && _a !== void 0 ? _a : 1); const paddedAsVec4 = Math.ceil(scalarSizeOfProperty / 4) * 4; const instanceSizeInScalar = paddedAsVec4 * ((_b = info.arrayLength) !== null && _b !== void 0 ? _b : 1); indexStr = ` let vec4_idx: u32 = ${offsetOfProperty}u + ${instanceSize} * instanceId + ${vec4SizeOfProperty}u * idxOfArray;\n`; indexStr += ` let scalar_idx: u32 = ${ // IndexOf4Bytes offsetOfProperty * 4 // IndexOf16bytes to IndexOf4Bytes } + ${instanceSizeInScalar} * instanceId + ${scalarSizeOfProperty}u * idxOfArray;\n`; } const firstPartOfInnerFunc = ` fn get_${methodName}(instanceId: u32, idxOfArray: u32) -> ${returnType} { ${indexStr} `; let str = `${firstPartOfInnerFunc}`; switch (info.compositionType) { case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Vec4: case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Vec4Array: str += ' let val = fetchElement(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Vec3: str += ' let col0 = fetchElement(vec4_idx);\n'; str += ` let val = ${returnType}(col0.xyz);`; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Vec3Array: str += ' let val = fetchVec3No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Vec2: str += ' let col0 = fetchElement(vec4_idx);\n'; str += ` let val = ${returnType}(col0.xy);`; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Vec2Array: str += ' let val = fetchVec2No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Scalar: str += ' let col0 = fetchElement(vec4_idx);\n'; if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int) { str += ` let val = i32(col0.x);`; } else if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.UnsignedInt) { str += ' let val = u32(col0.x);'; } else if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Bool) { str += ` let val = col0.x >= 0.5;`; } else { str += ' let val = col0.x;'; } break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.ScalarArray: str += ' let col0 = fetchScalarNo16BytesAligned(scalar_idx);\n'; if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Int) { str += ' let val = i32(col0);'; } else if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.UnsignedInt) { str += ' let val = u32(col0);'; } else if (info.componentType === _foundation_definitions_ComponentType__WEBPACK_IMPORTED_MODULE_13__.ComponentType.Bool) { str += ' let val = col0 >= 0.5;'; } else { str += ' let val = col0;'; } break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat4: str += ' let val = fetchMat4(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat4Array: str += ' let val = fetchMat4(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat3: str += ' let val = fetchMat3(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat3Array: str += ' let val = fetchMat3No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat2: str += ' let val = fetchMat2(vec4_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat2Array: str += ' let val = fetchMat2No16BytesAligned(scalar_idx);\n'; break; case _foundation_definitions_CompositionType__WEBPACK_IMPORTED_MODULE_12__.CompositionType.Mat4x3Array: str += ' let val = fetchMat4x3(vec4_idx);\n'; break; default: // Logger.error('unknown composition type', info.compositionType.str, memberName); str += ''; } str += ` return val; } `; return str; } static getOffsetOfPropertyInShader(isGlobalData, propertyName, materialTypeName) { if (isGlobalData) { const globalDataRepository = _foundation_core_GlobalDataRepository__WEBPACK_IMPORTED_MODULE_10__.GlobalDataRepository.getInstance(); const dataBeginPos = globalDataRepository.getLocationOffsetOfProperty(propertyName); return dataBeginPos; } else { const dataBeginPos = _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_11__.MaterialRepository.getLocationOffsetOfMemberOfMaterial(materialTypeName, propertyName); return dataBeginPos; } } $load(meshComponent) { const mesh = meshComponent.mesh; if (mesh == null) { return false; } // setup VBO and VAO if (!mesh.isSetUpDone()) { (0,_foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_6__.updateVBOAndVAO)(mesh); } return true; } common_$load() { if (this.__uniformMorphOffsetsTypedArray == null) { this.__uniformMorphOffsetsTypedArray = new Uint32Array(Math.ceil((_foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexPrimitiveNumberInShader * _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader) / 4) * 4); } if (this.__uniformMorphWeightsTypedArray == null) { this.__uniformMorphWeightsTypedArray = new Float32Array(Math.ceil((_foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexPrimitiveNumberInShader * _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader) / 4) * 4); } if (_foundation_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_19__.BlendShapeComponent.updateCount !== this.__lastBlendShapeComponentsUpdateCountForBlendData) { this.__createOrUpdateStorageBlendShapeBuffer(); this.__lastBlendShapeComponentsUpdateCountForBlendData = _foundation_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_19__.BlendShapeComponent.updateCount; } } __setupShaderProgramForMeshComponent(meshComponent) { if (meshComponent.mesh == null) { _foundation_components_Mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_0__.MeshComponent.alertNoMeshSet(meshComponent); return; } const primitiveNum = meshComponent.mesh.getPrimitiveNumber(); for (let i = 0; i < primitiveNum; i++) { const primitive = meshComponent.mesh.getPrimitiveAt(i); const material = primitive.material; this._setupShaderProgram(material, primitive); } } _setupShaderProgram(material, primitive) { if (material == null) { return; } if (material.isShaderProgramReady(primitive)) { return; } try { this.setupShaderForMaterial(material, primitive, WebGpuStrategyBasic.getVertexShaderMethodDefinitions_storageBuffer(), WebGpuStrategyBasic.__getShaderProperty); primitive._backupMaterial(); } catch (e) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_23__.Logger.error(e); primitive._restoreMaterial(); this.setupShaderForMaterial(primitive.material, primitive, WebGpuStrategyBasic.getVertexShaderMethodDefinitions_storageBuffer(), WebGpuStrategyBasic.__getShaderProperty); } } /** * setup shader program for the material in this WebGL strategy * @param material - a material to setup shader program */ setupShaderForMaterial(material, primitive, vertexShaderMethodDefinitions, propertySetter) { material._createProgramWebGpu(primitive, vertexShaderMethodDefinitions, propertySetter); } renderWithRenderBundle(renderPass) { const webGpuResourceRepository = _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__.WebGpuResourceRepository.getInstance(); return webGpuResourceRepository.executeRenderBundle(renderPass); } prerender() { if (_foundation_components_Animation_AnimationComponent__WEBPACK_IMPORTED_MODULE_22__.AnimationComponent.isAnimating || _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_21__.TransformComponent.updateCount !== this.__lastTransformComponentsUpdateCount || _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_9__.SceneGraphComponent.updateCount !== this.__lastSceneGraphComponentsUpdateCount || _foundation_components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_20__.CameraControllerComponent.updateCount !== this.__lastCameraControllerComponentsUpdateCount || _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_4__.Material.stateVersion !== this.__lastMaterialsUpdateCount) { this.__createAndUpdateStorageBuffer(); this.__lastTransformComponentsUpdateCount = _foundation_components_Transform_TransformComponent__WEBPACK_IMPORTED_MODULE_21__.TransformComponent.updateCount; this.__lastSceneGraphComponentsUpdateCount = _foundation_components_SceneGraph_SceneGraphComponent__WEBPACK_IMPORTED_MODULE_9__.SceneGraphComponent.updateCount; this.__lastCameraControllerComponentsUpdateCount = _foundation_components_CameraController_CameraControllerComponent__WEBPACK_IMPORTED_MODULE_20__.CameraControllerComponent.updateCount; this.__lastMaterialsUpdateCount = _foundation_materials_core_Material__WEBPACK_IMPORTED_MODULE_4__.Material.stateVersion; } if (_foundation_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_19__.BlendShapeComponent.updateCount !== this.__lastBlendShapeComponentsUpdateCountForWeights) { this.__updateUniformMorph(); this.__lastBlendShapeComponentsUpdateCountForWeights = _foundation_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_19__.BlendShapeComponent.updateCount; } } common_$render(primitiveUids, renderPass, renderPassTickCount) { if (renderPass.isBufferLessRenderingMode()) { this.__renderWithoutBuffers(renderPass); return true; } let renderedSomething = false; // For opaque primitives if (renderPass._toRenderOpaquePrimitives) { for (let i = 0; i <= renderPass._lastOpaqueIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.renderInner(primitiveUid, renderPass, true); renderedSomething || (renderedSomething = rendered); } } // For translucent primitives if (renderPass._toRenderTransparentPrimitives) { for (let i = renderPass._lastOpaqueIndex + 1; i <= renderPass._lastTranslucentIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.renderInner(primitiveUid, renderPass, true); renderedSomething || (renderedSomething = rendered); } for (let i = renderPass._lastTranslucentIndex + 1; i <= renderPass._lastBlendIndex; i++) { const primitiveUid = primitiveUids[i]; const rendered = this.renderInner(primitiveUid, renderPass, false); renderedSomething || (renderedSomething = rendered); } // gl.depthMask(true); } return renderedSomething; } __renderWithoutBuffers(renderPass) { const material = renderPass.material; const primitive = renderPass._dummyPrimitiveForBufferLessRendering; this._setupShaderProgram(material, primitive); const webGpuResourceRepository = _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__.WebGpuResourceRepository.getInstance(); webGpuResourceRepository.draw(primitive, material, renderPass, 0, true); } renderInner(primitiveUid, renderPass, isOpaque) { if (primitiveUid === -1) { return false; } const primitive = _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive.getPrimitive(primitiveUid); if (primitive == null) { return false; } const material = renderPass.getAppropriateMaterial(primitive); this._setupShaderProgram(material, primitive); if ((0,_foundation_renderer_RenderingCommonMethods__WEBPACK_IMPORTED_MODULE_6__.isSkipDrawing)(material, primitive)) { return false; } const webGpuResourceRepository = _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__.WebGpuResourceRepository.getInstance(); const cameraSID = this.__getAppropriateCameraComponentSID(renderPass, 0, false); webGpuResourceRepository.draw(primitive, material, renderPass, cameraSID, isOpaque); return true; } __createAndUpdateStorageBuffer() { const memoryManager = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance(); // the GPU global Storage const gpuInstanceDataBuffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_2__.BufferUse.GPUInstanceData); const webGpuResourceRepository = _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__.WebGpuResourceRepository.getInstance(); // const dataTextureByteSize = // MemoryManager.bufferWidthLength * MemoryManager.bufferHeightLength * 4 * 4; const float32Array = new Float32Array(gpuInstanceDataBuffer.getArrayBuffer()); if (this.__storageBufferUid !== _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { // Update const dataSizeForDataTexture = gpuInstanceDataBuffer.takenSizeInByte / 4; webGpuResourceRepository.updateStorageBuffer(this.__storageBufferUid, float32Array, dataSizeForDataTexture); } else { // Create this.__storageBufferUid = webGpuResourceRepository.createStorageBuffer(float32Array); } } __createOrUpdateStorageBlendShapeBuffer() { const memoryManager = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance(); // the GPU global Storage const blendShapeDataBuffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_2__.BufferUse.GPUVertexData); if (blendShapeDataBuffer == null) { return; } const webGpuResourceRepository = _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__.WebGpuResourceRepository.getInstance(); const float32Array = new Float32Array(blendShapeDataBuffer.getArrayBuffer()); if (this.__storageBlendShapeBufferUid !== _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_5__.CGAPIResourceRepository.InvalidCGAPIResourceUid) { // Update const componentSizeForDataTexture = blendShapeDataBuffer.takenSizeInByte / 4; webGpuResourceRepository.updateStorageBlendShapeBuffer(this.__storageBlendShapeBufferUid, float32Array, componentSizeForDataTexture); } else { // Create this.__storageBlendShapeBufferUid = webGpuResourceRepository.createStorageBlendShapeBuffer(float32Array); } let i = 0; for (; i < _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexPrimitiveNumberInShader; i++) { const primitive = _foundation_geometry_Primitive__WEBPACK_IMPORTED_MODULE_3__.Primitive.getPrimitiveHasMorph(i); if (primitive != null) { for (let j = 0; j < primitive.targets.length; j++) { const target = primitive.targets[j]; const accessor = target.get(_foundation_definitions_VertexAttribute__WEBPACK_IMPORTED_MODULE_18__.VertexAttribute.Position.XYZ); this.__uniformMorphOffsetsTypedArray[_foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader * i + j] = accessor.byteOffsetInBuffer / 4 / 4; } } else { break; } } const elementNumToCopy = _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader * i; webGpuResourceRepository.updateUniformMorphOffsetsBuffer(this.__uniformMorphOffsetsTypedArray, elementNumToCopy); } __updateUniformMorph() { const memoryManager = _foundation_core_MemoryManager__WEBPACK_IMPORTED_MODULE_1__.MemoryManager.getInstance(); const blendShapeDataBuffer = memoryManager.getBuffer(_foundation_definitions_BufferUse__WEBPACK_IMPORTED_MODULE_2__.BufferUse.GPUVertexData); if (blendShapeDataBuffer == null) { return; } const webGpuResourceRepository = _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_7__.WebGpuResourceRepository.getInstance(); const blendShapeComponents = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_15__.ComponentRepository.getComponentsWithType(_foundation_components_BlendShape_BlendShapeComponent__WEBPACK_IMPORTED_MODULE_19__.BlendShapeComponent); for (let i = 0; i < blendShapeComponents.length; i++) { const blendShapeComponent = blendShapeComponents[i]; const weights = blendShapeComponent.weights; for (let j = 0; j < weights.length; j++) { this.__uniformMorphWeightsTypedArray[_foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader * blendShapeComponent.componentSID + j] = weights[j]; } } if (blendShapeComponents.length > 0) { const elementNumToCopy = _foundation_core_Config__WEBPACK_IMPORTED_MODULE_17__.Config.maxVertexMorphNumberInShader * blendShapeComponents.length; webGpuResourceRepository.updateUniformMorphWeightsBuffer(this.__uniformMorphWeightsTypedArray, elementNumToCopy); } } __getAppropriateCameraComponentSID(renderPass, displayIdx, isVRMainPass) { if (isVRMainPass) { const rnXRModule = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_14__.ModuleManager.getInstance().getModule('xr'); const webxrSystem = rnXRModule.WebXRSystem.getInstance(); let cameraComponentSid = -1; if (webxrSystem.isWebXRMode) { if (webxrSystem.isMultiView()) { cameraComponentSid = webxrSystem._getCameraComponentSIDAt(0); } else { cameraComponentSid = webxrSystem._getCameraComponentSIDAt(displayIdx); } } return cameraComponentSid; } else { // Non-VR Rendering let cameraComponent = renderPass.cameraComponent; if (cameraComponent == null) { // if the renderPass has no cameraComponent, try to get the current cameraComponent cameraComponent = _foundation_core_ComponentRepository__WEBPACK_IMPORTED_MODULE_15__.ComponentRepository.getComponent(_foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_16__.CameraComponent, _foundation_components_Camera_CameraComponent__WEBPACK_IMPORTED_MODULE_16__.CameraComponent.current); } if (cameraComponent) { return cameraComponent.componentSID; } else { return -1; } } } } /***/ }), /***/ "./src/webgpu/index.ts": /*!*****************************!*\ !*** ./src/webgpu/index.ts ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebGpuDeviceWrapper: () => (/* reexport safe */ _WebGpuDeviceWrapper__WEBPACK_IMPORTED_MODULE_0__.WebGpuDeviceWrapper), /* harmony export */ WebGpuResourceRepository: () => (/* reexport safe */ _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_1__.WebGpuResourceRepository), /* harmony export */ WebGpuStrategyBasic: () => (/* reexport safe */ _WebGpuStrategyBasic__WEBPACK_IMPORTED_MODULE_2__.WebGpuStrategyBasic) /* harmony export */ }); /* harmony import */ var _WebGpuDeviceWrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebGpuDeviceWrapper */ "./src/webgpu/WebGpuDeviceWrapper.ts"); /* harmony import */ var _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WebGpuResourceRepository */ "./src/webgpu/WebGpuResourceRepository.ts"); /* harmony import */ var _WebGpuStrategyBasic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebGpuStrategyBasic */ "./src/webgpu/WebGpuStrategyBasic.ts"); /***/ }), /***/ "./src/webgpu/main.ts": /*!****************************!*\ !*** ./src/webgpu/main.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _WebGpuDeviceWrapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebGpuDeviceWrapper */ "./src/webgpu/WebGpuDeviceWrapper.ts"); /* harmony import */ var _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WebGpuResourceRepository */ "./src/webgpu/WebGpuResourceRepository.ts"); /* harmony import */ var _WebGpuStrategyBasic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WebGpuStrategyBasic */ "./src/webgpu/WebGpuStrategyBasic.ts"); const WebGpu = Object.freeze({ WebGpuDeviceWrapper: _WebGpuDeviceWrapper__WEBPACK_IMPORTED_MODULE_0__.WebGpuDeviceWrapper, WebGpuResourceRepository: _WebGpuResourceRepository__WEBPACK_IMPORTED_MODULE_1__.WebGpuResourceRepository, WebGpuStrategyBasic: _WebGpuStrategyBasic__WEBPACK_IMPORTED_MODULE_2__.WebGpuStrategyBasic, }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WebGpu); (0, eval)('this').RnWebGpu = WebGpu; /***/ }), /***/ "./src/xr/WebARSystem.ts": /*!*******************************!*\ !*** ./src/xr/WebARSystem.ts ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebARSystem: () => (/* binding */ WebARSystem) /* harmony export */ }); /* harmony import */ var _foundation_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/components/Camera/createCameraEntity */ "./src/foundation/components/Camera/createCameraEntity.ts"); /* harmony import */ var _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _foundation_math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/math/MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _foundation_math_MutableScalar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/math/MutableScalar */ "./src/foundation/math/MutableScalar.ts"); /* harmony import */ var _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); /* harmony import */ var _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/misc/Option */ "./src/foundation/misc/Option.ts"); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _foundation_system_System__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/system/System */ "./src/foundation/system/System.ts"); /* eslint-disable @typescript-eslint/no-empty-function */ const defaultUserPositionInVR = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0.0, 1.1, 0]); class WebARSystem { constructor() { this.__oGlw = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__isReadyForWebAR = false; this.__oArSession = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__oWebglLayer = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__spaceType = 'local'; this.__isWebARMode = false; this.__requestedToEnterWebAR = false; this.__oArViewerPose = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__oArReferenceSpace = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__defaultPositionInLocalSpaceMode = defaultUserPositionInVR; this.__canvasWidthForAR = 0; this.__canvasHeightForAR = 0; this._cameraEntity = (0,_foundation_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_0__.createCameraEntity)(); this.__viewerTranslate = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.zero(); this.__viewerAzimuthAngle = _foundation_math_MutableScalar__WEBPACK_IMPORTED_MODULE_3__.MutableScalar.zero(); this.__viewerOrientation = _foundation_math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_2__.MutableQuaternion.identity(); this.__viewerScale = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.one(); this._cameraEntity.tryToSetUniqueName('WebAR Viewer', true); this._cameraEntity.tryToSetTag({ tag: 'type', value: 'background-assets', }); } static getInstance() { if (!this.__instance) { this.__instance = new WebARSystem(); } return this.__instance; } /** * Ready for WebAR * * @param requestButtonDom * @returns true: prepared properly, false: failed to prepare */ async readyForWebAR(requestButtonDom) { await _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_10__.ModuleManager.getInstance().loadModule('xr'); const glw = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository.getWebGLResourceRepository().currentWebGLContextWrapper; if (glw == null) { throw new Error('WebGL Context is not ready yet.'); } this.__oGlw = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.Some(glw); const supported = await navigator.xr.isSessionSupported('immersive-ar'); if (supported) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.info('WebAR is supported.'); if (requestButtonDom) { requestButtonDom.style.display = 'block'; } else { const paragraph = document.createElement('p'); const anchor = document.createElement('a'); anchor.setAttribute('id', 'enter-ar'); const enterVr = document.createTextNode('Enter AR'); anchor.appendChild(enterVr); paragraph.appendChild(anchor); const canvas = glw.canvas; canvas.parentNode.insertBefore(paragraph, canvas); window.addEventListener('click', this.enterWebAR.bind(this)); } this.__isReadyForWebAR = true; } else { throw new Error('WebAR is not supported in this environment.'); } return []; } /** * Enter to WebXR (AR mode) * @param initialUserPosition the initial user position in world space * @param callbackOnXrSessionEnd the callback function for XrSession ending * @returns boolean value about succeeded or not */ async enterWebAR({ initialUserPosition, callbackOnXrSessionStart = () => { }, callbackOnXrSessionEnd = () => { }, }) { const webglResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository.getWebGLResourceRepository(); const glw = webglResourceRepository.currentWebGLContextWrapper; if (glw != null && this.__isReadyForWebAR) { const session = (await navigator.xr.requestSession('immersive-vr')); this.__oArSession = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.Some(session); session.addEventListener('end', () => { glw.__gl.bindFramebuffer(glw.__gl.FRAMEBUFFER, null); this.__oArSession = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__oWebglLayer = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__oArViewerPose = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__oArReferenceSpace = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.None(); this.__spaceType = 'local'; this.__isReadyForWebAR = false; this.__requestedToEnterWebAR = false; this.__isWebARMode = false; this.__defaultPositionInLocalSpaceMode = defaultUserPositionInVR; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.info('XRSession ends.'); _foundation_system_System__WEBPACK_IMPORTED_MODULE_11__.System.stopRenderLoop(); _foundation_system_System__WEBPACK_IMPORTED_MODULE_11__.System.restartRenderLoop(); callbackOnXrSessionEnd(); }); const referenceSpace = await session.requestReferenceSpace('local'); this.__spaceType = 'local'; this.__defaultPositionInLocalSpaceMode = initialUserPosition !== null && initialUserPosition !== void 0 ? initialUserPosition : defaultUserPositionInVR; this.__oArReferenceSpace = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.Some(referenceSpace); _foundation_system_System__WEBPACK_IMPORTED_MODULE_11__.System.stopRenderLoop(); await this.__setupWebGLLayer(session, callbackOnXrSessionStart); this.__requestedToEnterWebAR = true; _foundation_system_System__WEBPACK_IMPORTED_MODULE_11__.System.restartRenderLoop(); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.warn('End of enterWebXR.'); return; } else { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.error('WebGL context or WebXRSession is not ready yet.'); return; } } async __setupWebGLLayer(xrSession, callbackOnXrSessionStart) { const gl = this.__oGlw.unwrapForce().getRawContext(); if (gl != null) { // Make sure the canvas context we want to use is compatible with the current xr device. await gl.makeXRCompatible(); // The content that will be shown on the device is defined by the session's // baseLayer. this.__oWebglLayer = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.Some(window.XRWebGLLayer(xrSession, gl)); const webglLayer = this.__oWebglLayer.unwrapForce(); xrSession.updateRenderState({ baseLayer: webglLayer, depthNear: 0.1, depthFar: 10000, }); const webglResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_9__.CGAPIResourceRepository.getWebGLResourceRepository(); this.__canvasWidthForAR = webglLayer.framebufferWidth; this.__canvasHeightForAR = webglLayer.framebufferHeight; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.info(this.__canvasWidthForAR.toString()); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.info(this.__canvasHeightForAR.toString()); webglResourceRepository.resizeCanvas(this.__canvasWidthForAR, this.__canvasHeightForAR); this.__isWebARMode = true; callbackOnXrSessionStart(); } else { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.error('WebGL context is not ready for WebXR.'); } } /** * Disable WebXR (Close the XrSession) */ async exitWebAR() { if (this.__oArSession.has()) { // End the XR session now. await this.__oArSession.get().end(); } } /// Getter Methods getCanvasWidthForVr() { return this.__canvasWidthForAR; } getCanvasHeightForVr() { return this.__canvasHeightForAR; } get viewMatrix() { return this._cameraEntity.getCamera().viewMatrix; } __updateView(xrFrame) { this.__oArViewerPose = new _foundation_misc_Option__WEBPACK_IMPORTED_MODULE_8__.Some(xrFrame.getViewerPose(this.__oArReferenceSpace.unwrapForce())); this.__setCameraInfoFromXRViews(this.__oArViewerPose.unwrapForce()); } __setCameraInfoFromXRViews(xrViewerPose) { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_6__.Is.not.exist(xrViewerPose)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_7__.Logger.warn('xrViewerPose not exist'); return; } const xrView = xrViewerPose.views[0]; if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_6__.Is.not.exist(xrView)) { return; } const orientation = xrViewerPose.transform.orientation; this.__viewerOrientation.x = orientation.x; this.__viewerOrientation.y = orientation.y; this.__viewerOrientation.z = orientation.z; this.__viewerOrientation.w = orientation.w; const m = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(xrView === null || xrView === void 0 ? void 0 : xrView.transform.matrix); const rotateMat = m; const scale = this.__viewerScale.x; const pos = xrView.transform.position; const translateScaled = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.add(this.__defaultPositionInLocalSpaceMode, this.__viewerTranslate); const xrViewerPos = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([pos.x, pos.y, pos.z]); const translate = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_4__.MutableVector3.add(this.__defaultPositionInLocalSpaceMode, this.__viewerTranslate).add(xrViewerPos); const viewerTranslateScaledX = translateScaled.x; const viewerTranslateScaledZ = translateScaled.z; const viewerTranslateX = translate.x; const viewerTranslateZ = translate.z; const viewerTransform = this._cameraEntity.getTransform(); viewerTransform.localPosition = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([ viewerTranslateScaledX, 0, viewerTranslateScaledZ, ]); viewerTransform.localScale = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([scale, scale, scale]); viewerTransform.localEulerAngles = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_5__.Vector3.fromCopyArray([0, this.__viewerAzimuthAngle.x, 0]); rotateMat.translateY = translate.y; rotateMat.translateX = translate.x - viewerTranslateX; rotateMat.translateZ = translate.z - viewerTranslateZ; rotateMat.translateY += xrViewerPos.y; rotateMat.translateX += xrViewerPos.x; rotateMat.translateZ += xrViewerPos.z; this._cameraEntity.getTransform().localMatrix = rotateMat; } get projectionMatrix() { const xrView = this.__oArViewerPose.unwrapForce().views[0]; return _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_6__.Is.exist(xrView) ? xrView.projectionMatrix : _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_1__.MutableMatrix44.identity()._v); } /** * Pre process for rendering * @internal * @param xrFrame XRFrame object */ _preRender(time, xrFrame) { if (this.isWebARMode && this.__requestedToEnterWebAR && xrFrame != null) { this.__updateView(xrFrame); } } /** * Post process for rendering * @internal */ _postRender() { if (this.isWebARMode) { const gl = this.__oGlw.unwrapForce().getRawContext(); // gl?.bindFramebuffer(gl.FRAMEBUFFER, null); } if (this.requestedToEnterWebAR) { // this.__isWebXRMode = true; } } get isWebARMode() { return this.__isWebARMode; } get isReadyForWebAR() { return this.__isReadyForWebAR; } get requestedToEnterWebAR() { return this.__requestedToEnterWebAR; } get arSession() { return this.__oArSession.unwrapOrUndefined(); } get framebuffer() { var _a, _b; return (_b = (_a = this.__oArSession.unwrapOrUndefined()) === null || _a === void 0 ? void 0 : _a.renderState.baseLayer) === null || _b === void 0 ? void 0 : _b.framebuffer; } } /***/ }), /***/ "./src/xr/WebXRInput.ts": /*!******************************!*\ !*** ./src/xr/WebXRInput.ts ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createMotionController: () => (/* binding */ createMotionController), /* harmony export */ getMotionController: () => (/* binding */ getMotionController), /* harmony export */ updateGamePad: () => (/* binding */ updateGamePad), /* harmony export */ updateMotionControllerModel: () => (/* binding */ updateMotionControllerModel) /* harmony export */ }); /* harmony import */ var webxr_input_profiles_packages_motion_controllers_src_motionController_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! webxr-input-profiles/packages/motion-controllers/src/motionController.js */ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/motionController.js"); /* harmony import */ var webxr_input_profiles_packages_motion_controllers_src_profiles_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webxr-input-profiles/packages/motion-controllers/src/profiles.js */ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/profiles.js"); /* harmony import */ var _foundation_importer_Gltf2Importer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/importer/Gltf2Importer */ "./src/foundation/importer/Gltf2Importer.ts"); /* harmony import */ var _foundation_importer_ModelConverter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/importer/ModelConverter */ "./src/foundation/importer/ModelConverter.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_math_Quaternion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/math/Quaternion */ "./src/foundation/math/Quaternion.ts"); /* harmony import */ var _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../foundation/math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/misc/MiscUtil */ "./src/foundation/misc/MiscUtil.ts"); /* harmony import */ var _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _foundation_math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/math/MutableMatrix33 */ "./src/foundation/math/MutableMatrix33.ts"); /* harmony import */ var _foundation_misc_Result__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/misc/Result */ "./src/foundation/misc/Result.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); // const oculusProfile = require('webxr-input-profiles/packages/registry/profiles/oculus/oculus-touch.json'); const motionControllers = new Map(); const GeneralType = Object.freeze({ TRIGGER: 'trigger', SQUEEZE: 'squeeze', TOUCHPAD: 'touchpad', THUMBSTICK: 'thumbstick', BUTTON_1: 'button_1', BUTTON_2: 'button_2', BUTTON_3: 'button_3', BUTTON_SPECIAL: 'button_special', }); const wellKnownMapping = new Map(); wellKnownMapping.set('a_button', GeneralType.BUTTON_1); wellKnownMapping.set('b_button', GeneralType.BUTTON_2); wellKnownMapping.set('x_button', GeneralType.BUTTON_1); wellKnownMapping.set('y_button', GeneralType.BUTTON_2); wellKnownMapping.set('thumbrest', GeneralType.BUTTON_3); wellKnownMapping.set('menu', GeneralType.BUTTON_SPECIAL); wellKnownMapping.set('xr_standard_trigger', GeneralType.TRIGGER); wellKnownMapping.set('xr_standard_squeeze', GeneralType.SQUEEZE); wellKnownMapping.set('xr_standard_thumbstick', GeneralType.THUMBSTICK); wellKnownMapping.set('xr_standard_touchpad', GeneralType.TOUCHPAD); wellKnownMapping.set('trigger', GeneralType.TRIGGER); wellKnownMapping.set('squeeze', GeneralType.SQUEEZE); wellKnownMapping.set('thumbstick', GeneralType.THUMBSTICK); wellKnownMapping.set('touchpad', GeneralType.TOUCHPAD); async function createMotionController(xrInputSource, basePath, profilePriorities) { const { profile, assetPath } = await (0,webxr_input_profiles_packages_motion_controllers_src_profiles_js__WEBPACK_IMPORTED_MODULE_1__.fetchProfile)(xrInputSource, basePath); const motionController = new webxr_input_profiles_packages_motion_controllers_src_motionController_js__WEBPACK_IMPORTED_MODULE_0__.MotionController(xrInputSource, profile, assetPath); motionControllers.set(xrInputSource, motionController); const result = await addMotionControllerToScene(motionController); if ((0,_foundation_misc_Result__WEBPACK_IMPORTED_MODULE_10__.isOk)(result)) { const rootGroup = _foundation_importer_ModelConverter__WEBPACK_IMPORTED_MODULE_3__.ModelConverter.convertToRhodoniteObject(result.get()); return rootGroup; } else { return undefined; } } async function addMotionControllerToScene(motionController) { const asset = await _foundation_importer_Gltf2Importer__WEBPACK_IMPORTED_MODULE_2__.Gltf2Importer.importFromUri(motionController.assetUrl); addTouchPointDots(motionController, asset); // MyEngine.scene.add(asset); return asset; } function updateGamePad(timestamp, xrFrame, viewerData) { // Other frame-loop stuff ... Array.from(motionControllers.values()).forEach((motionController) => { motionController.updateFromGamepad(); Object.keys(motionController.components).forEach((componentId) => { const component = motionController.components[componentId]; processInput(component, motionController.xrInputSource.handedness, viewerData, timestamp); }); }); // Other frame-loop stuff ... } let lastTimestamp = 0; function processInput(component, handed, viewerData, timestamp) { const componentName = wellKnownMapping.get(component.rootNodeName); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.not.exist(componentName)) { return; } if (lastTimestamp === 0) { lastTimestamp = timestamp; return; } const deltaSec = (timestamp - lastTimestamp) * 0.000001; switch (componentName) { case GeneralType.TRIGGER: processTriggerInput(component, handed, viewerData, deltaSec); break; case GeneralType.THUMBSTICK: processThumbstickInput(component, handed, viewerData, deltaSec); break; case GeneralType.SQUEEZE: processSqueezeInput(component, handed, viewerData, deltaSec); break; case GeneralType.BUTTON_1: case GeneralType.BUTTON_2: case GeneralType.BUTTON_3: case GeneralType.BUTTON_SPECIAL: processButtonInput(component, handed, viewerData, deltaSec); break; case GeneralType.TOUCHPAD: processTouchpadInput(component, handed, viewerData, deltaSec); break; default: } } const scaleVec3 = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.one(); function processTriggerInput(triggerComponent, handed, viewerData, deltaSec) { let value = 0; const scale = 0.1; const componentName = wellKnownMapping.get(triggerComponent.rootNodeName); if (triggerComponent.values.state === "pressed" /* Constants.ComponentState.PRESSED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + triggerComponent.values.button + ', ' + handed); value = (0,_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__.valueWithDefault)({ value: triggerComponent.values.button, defaultValue: 0, }) * deltaSec; // Fire ray gun } else if (triggerComponent.values.state === "touched" /* Constants.ComponentState.TOUCHED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + triggerComponent.values.button + ', ' + handed); value = (0,_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__.valueWithDefault)({ value: triggerComponent.values.button, defaultValue: 0, }) * deltaSec; // Show ray gun charging up } if (handed === 'right') { value *= -1; } scaleVec3.x -= value * scale; scaleVec3.y -= value * scale; scaleVec3.z -= value * scale; scaleVec3.x = Math.max(scaleVec3.x, 0.05); scaleVec3.y = Math.max(scaleVec3.y, 0.05); scaleVec3.z = Math.max(scaleVec3.z, 0.05); scaleVec3.x = Math.min(scaleVec3.x, 3.0); scaleVec3.y = Math.min(scaleVec3.y, 3.0); scaleVec3.z = Math.min(scaleVec3.z, 3.0); viewerData.viewerScale.copyComponents(scaleVec3); } function processSqueezeInput(squeezeComponent, handed, viewerData, deltaSec) { const componentName = wellKnownMapping.get(squeezeComponent.rootNodeName); if (squeezeComponent.values.state === "pressed" /* Constants.ComponentState.PRESSED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + squeezeComponent.values.button + ', ' + handed); // Fire ray gun } else if (squeezeComponent.values.state === "touched" /* Constants.ComponentState.TOUCHED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + squeezeComponent.values.button + ', ' + handed); // Show ray gun charging up } } function processThumbstickInput(thumbstickComponent, handed, viewerData, deltaSec) { const componentName = wellKnownMapping.get(thumbstickComponent.rootNodeName); let xAxis = 0; let yAxis = 0; const deltaScaleHorizontal = 0.25; const deltaScaleVertical = 0.1; const deltaScaleAzimuthAngle = 0.15; if (thumbstickComponent.values.state === "pressed" /* Constants.ComponentState.PRESSED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + thumbstickComponent.values.button + ', ' + thumbstickComponent.values.state + ', ' + handed); xAxis = (0,_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__.valueWithDefault)({ value: thumbstickComponent.values.xAxis, defaultValue: 0, }) * deltaSec; yAxis = (0,_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__.valueWithDefault)({ value: thumbstickComponent.values.yAxis, defaultValue: 0, }) * deltaSec; // Align the world orientation to the user's current orientation } else if (thumbstickComponent.values.state === "touched" /* Constants.ComponentState.TOUCHED */) { xAxis = (0,_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__.valueWithDefault)({ value: thumbstickComponent.values.xAxis, defaultValue: 0, }) * deltaSec; yAxis = (0,_foundation_misc_MiscUtil__WEBPACK_IMPORTED_MODULE_7__.valueWithDefault)({ value: thumbstickComponent.values.yAxis, defaultValue: 0, }) * deltaSec; } xAxis = Math.min(xAxis, 1); yAxis = Math.min(yAxis, 1); const deltaVector = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.zero(); if (handed === 'right') { viewerData.viewerAzimuthAngle.x -= xAxis * deltaScaleAzimuthAngle; deltaVector.y -= yAxis * deltaScaleVertical * viewerData.viewerScale.x; } else { deltaVector.x += xAxis * deltaScaleHorizontal * viewerData.viewerScale.x; deltaVector.z += yAxis * deltaScaleHorizontal * viewerData.viewerScale.x; } const orientationMat = _foundation_math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix33.fromCopyQuaternion(viewerData.viewerOrientation); const rotateMat = orientationMat.multiply(_foundation_math_MutableMatrix33__WEBPACK_IMPORTED_MODULE_9__.MutableMatrix33.rotateY(viewerData.viewerAzimuthAngle.x)); rotateMat.multiplyVectorTo(deltaVector, deltaVector); viewerData.viewerTranslate.add(deltaVector); } function processButtonInput(buttonComponent, handed, viewerData, deltaSec) { const componentName = wellKnownMapping.get(buttonComponent.rootNodeName); if (buttonComponent.values.state === "pressed" /* Constants.ComponentState.PRESSED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + buttonComponent.values.button + ', ' + buttonComponent.values.state + ', ' + handed); } else if (buttonComponent.values.state === "touched" /* Constants.ComponentState.TOUCHED */) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.info(componentName + ', ' + buttonComponent.values.button + ', ' + buttonComponent.values.state + ', ' + handed); } } function processTouchpadInput(thumbstick, handed, viewerData, deltaSec) { if (thumbstick.values.state === "pressed" /* Constants.ComponentState.PRESSED */) { // Align the world orientation to the user's current orientation } else if (thumbstick.values.state === "touched" /* Constants.ComponentState.TOUCHED */ && thumbstick.values.yAxis !== 0) { const scootDistance = thumbstick.values.yAxis; //* scootIncrement; // Scoot the user forward } } function addTouchPointDots(motionController, asset) { Object.values(motionController.components).forEach((component) => { if (component.touchPointNodeName) { const touchPointRoot = asset.getChildByName(component.touchPointNodeName, true); // const sphereGeometry = new THREE.SphereGeometry(0.001); // const material = new THREE.MeshBasicMaterial({ color: 0x0000FF }); // const touchPointDot = new THREE.Mesh(sphereGeometry, material); // touchPointRoot.add(touchPointDot); } }); } function updateMotionControllerModel(entity, motionController) { // this codes are from https://immersive-web.github.io/webxr-input-profiles/packages/motion-controllers/#animating-components // Update the 3D model to reflect the button, thumbstick, and touchpad state const map = entity.getTagValue('rnEntitiesByNames'); Object.values(motionController.components).forEach((component) => { for (const visualResponseName in component.visualResponses) { const visualResponse = component.visualResponses[visualResponseName]; // Find the topmost node in the visualization const entity = map.get(visualResponse.valueNodeName); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.not.exist(entity)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.warn("The entity of the controller doesn't exist"); continue; } // Calculate the new properties based on the weight supplied if (visualResponse.valueNodeProperty === 'visibility') { entity.getSceneGraph().isVisible = !!visualResponse.value; } else if (visualResponse.valueNodeProperty === 'transform') { const minNode = map.get(visualResponse.minNodeName); const maxNode = map.get(visualResponse.maxNodeName); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.not.exist(minNode) || _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_4__.Is.not.exist(maxNode)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_11__.Logger.warn("The min/max Node of the component of the controller doesn't exist"); continue; } const minNodeTransform = minNode.getTransform(); const maxNodeTransform = maxNode.getTransform(); entity.getTransform().quaternion = _foundation_math_Quaternion__WEBPACK_IMPORTED_MODULE_5__.Quaternion.qlerp(minNodeTransform.localRotationInner, maxNodeTransform.localRotationInner, visualResponse.value); entity.getTransform().localPosition = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_6__.Vector3.lerp(minNodeTransform.localPositionInner, maxNodeTransform.localPositionInner, visualResponse.value); } } }); } function getMotionController(xrInputSource) { return motionControllers.get(xrInputSource); } /***/ }), /***/ "./src/xr/WebXRSystem.ts": /*!*******************************!*\ !*** ./src/xr/WebXRSystem.ts ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebXRSystem: () => (/* binding */ WebXRSystem) /* harmony export */ }); /* harmony import */ var _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/renderer/CGAPIResourceRepository */ "./src/foundation/renderer/CGAPIResourceRepository.ts"); /* harmony import */ var _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../foundation/math/Vector3 */ "./src/foundation/math/Vector3.ts"); /* harmony import */ var _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../foundation/math/MutableMatrix44 */ "./src/foundation/math/MutableMatrix44.ts"); /* harmony import */ var _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../foundation/math/Vector4 */ "./src/foundation/math/Vector4.ts"); /* harmony import */ var _foundation_system_System__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../foundation/system/System */ "./src/foundation/system/System.ts"); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); /* harmony import */ var _WebXRInput__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./WebXRInput */ "./src/xr/WebXRInput.ts"); /* harmony import */ var _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../foundation/misc/Is */ "./src/foundation/misc/Is.ts"); /* harmony import */ var _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../foundation/math/MutableVector3 */ "./src/foundation/math/MutableVector3.ts"); /* harmony import */ var _foundation_math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../foundation/math/MutableQuaternion */ "./src/foundation/math/MutableQuaternion.ts"); /* harmony import */ var _foundation_math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../foundation/math/MutableScalar */ "./src/foundation/math/MutableScalar.ts"); /* harmony import */ var _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../foundation/materials/core/MaterialRepository */ "./src/foundation/materials/core/MaterialRepository.ts"); /* harmony import */ var _foundation_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../foundation/components/SceneGraph/createGroupEntity */ "./src/foundation/components/SceneGraph/createGroupEntity.ts"); /* harmony import */ var _foundation_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../foundation/components/Camera/createCameraEntity */ "./src/foundation/components/Camera/createCameraEntity.ts"); /* harmony import */ var _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../foundation/misc/Logger */ "./src/foundation/misc/Logger.ts"); /* eslint-disable @typescript-eslint/no-empty-function */ const defaultUserPositionInVR = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([0.0, 1.1, 0]); /** * WebXRSystem class manages WebXR session and rendering */ class WebXRSystem { constructor() { this.__isWebXRMode = false; this.__spaceType = 'local'; this.__requestedToEnterWebXR = false; this.__isReadyForWebXR = false; this.__defaultPositionInLocalSpaceMode = defaultUserPositionInVR; this.__canvasWidthForVR = 0; this.__canvasHeightForVR = 0; this.__controllerEntities = []; this.__xrInputSources = []; this.__viewerTranslate = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.zero(); this.__viewerAzimuthAngle = _foundation_math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar.zero(); this.__viewerOrientation = _foundation_math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_9__.MutableQuaternion.identity(); this.__viewerScale = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.one(); this.__multiviewFramebufferHandle = -1; this.__multiviewColorTextureHandle = -1; this.__viewerEntity = (0,_foundation_components_SceneGraph_createGroupEntity__WEBPACK_IMPORTED_MODULE_12__.createGroupEntity)(); this.__viewerEntity.tryToSetUniqueName('WebXR Viewer', true); this.__viewerEntity.tryToSetTag({ tag: 'type', value: 'background-assets', }); this.__leftCameraEntity = (0,_foundation_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_13__.createCameraEntity)(); this.__leftCameraEntity.tryToSetUniqueName('WebXR Left Camera', true); this.__leftCameraEntity.tryToSetTag({ tag: 'type', value: 'background-assets', }); this.__leftCameraEntity.getCamera()._xrLeft = true; this.__rightCameraEntity = (0,_foundation_components_Camera_createCameraEntity__WEBPACK_IMPORTED_MODULE_13__.createCameraEntity)(); this.__rightCameraEntity.tryToSetUniqueName('WebXR Right Camera', true); this.__rightCameraEntity.tryToSetTag({ tag: 'type', value: 'background-assets', }); this.__rightCameraEntity.getCamera()._xrRight = true; this.__viewerEntity.getSceneGraph().addChild(this.__leftCameraEntity.getSceneGraph()); this.__viewerEntity.getSceneGraph().addChild(this.__rightCameraEntity.getSceneGraph()); } /// Public Methods /** * Ready for WebXR * * @param requestButtonDom * @returns true: prepared properly, false: failed to prepare */ async readyForWebXR(requestButtonDom, basePath) { this.__basePath = basePath; await _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_5__.ModuleManager.getInstance().loadModule('xr'); const glw = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.getWebGLResourceRepository().currentWebGLContextWrapper; if (glw == null) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.error('WebGL Context is not ready yet.'); return []; } this.__glw = glw; const supported = await navigator.xr.isSessionSupported('immersive-vr'); if (supported) { if (requestButtonDom) { requestButtonDom.style.display = 'block'; } else { const paragraph = document.createElement('p'); const anchor = document.createElement('a'); anchor.setAttribute('id', 'enter-vr'); const enterVr = document.createTextNode('Enter VR'); anchor.appendChild(enterVr); paragraph.appendChild(anchor); const canvas = glw.canvas; canvas.parentNode.insertBefore(paragraph, canvas); window.addEventListener('click', this.enterWebXR.bind(this)); } this.__isReadyForWebXR = true; } else { throw new Error('WebXR is not supported in this environment.'); } return []; } /** * Enter to WebXR (VR mode) * @param initialUserPosition the initial user position in world space * @param callbackOnXrSessionEnd the callback function for XrSession ending * @returns boolean value about succeeded or not */ async enterWebXR({ initialUserPosition, callbackOnXrSessionStart = () => { }, callbackOnXrSessionEnd = () => { }, profilePriorities = [], }) { const webglResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.getWebGLResourceRepository(); const glw = webglResourceRepository.currentWebGLContextWrapper; if (glw != null && this.__isReadyForWebXR) { let referenceSpace; const session = (await navigator.xr.requestSession('immersive-vr')); this.__xrSession = session; session.addEventListener('end', () => { glw.__gl.bindFramebuffer(glw.__gl.FRAMEBUFFER, null); this.__xrSession = undefined; this.__webglLayer = undefined; this.__xrViewerPose = undefined; this.__xrReferenceSpace = undefined; this.__spaceType = 'local'; this.__isReadyForWebXR = false; this.__requestedToEnterWebXR = false; this.__xrInputSources.length = 0; this.__setWebXRMode(false); _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_11__.MaterialRepository._makeShaderInvalidateToAllMaterials(); this.__defaultPositionInLocalSpaceMode = defaultUserPositionInVR; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.info('XRSession ends.'); _foundation_system_System__WEBPACK_IMPORTED_MODULE_4__.System.stopRenderLoop(); _foundation_system_System__WEBPACK_IMPORTED_MODULE_4__.System.restartRenderLoop(); callbackOnXrSessionEnd(); }); const promiseFn = (resolve) => { session.addEventListener('inputsourceschange', (e) => { this.__onInputSourcesChange(e, resolve, profilePriorities); }); }; const promise = new Promise(promiseFn); // try { // referenceSpace = await session.requestReferenceSpace('local-floor'); // this.__spaceType = 'local-floor'; // this.__defaultPositionInLocalSpaceMode = // initialUserPosition ?? Vector3.zero(); // } catch (err) { // Logger.error(`Failed to start XRSession: ${err}`); // eslint-disable-next-line prefer-const referenceSpace = await session.requestReferenceSpace('local'); this.__spaceType = 'local'; this.__defaultPositionInLocalSpaceMode = initialUserPosition !== null && initialUserPosition !== void 0 ? initialUserPosition : defaultUserPositionInVR; this.__xrReferenceSpace = referenceSpace; _foundation_system_System__WEBPACK_IMPORTED_MODULE_4__.System.stopRenderLoop(); await this.__setupWebGLLayer(session, callbackOnXrSessionStart); this.__requestedToEnterWebXR = true; _foundation_system_System__WEBPACK_IMPORTED_MODULE_4__.System.restartRenderLoop(); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('End of enterWebXR.'); return promise; } else { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.error('WebGL context or WebXRSession is not ready yet.'); return undefined; } } /** * Disable WebXR (Close the XrSession) */ async exitWebXR() { if (this.__xrSession != null) { // End the XR session now. await this.__xrSession.end(); } } /// Getter Methods getCanvasWidthForVr() { return this.__canvasWidthForVR; } getCanvasHeightForVr() { return this.__canvasHeightForVR; } getControllerEntities() { return this.__controllerEntities; } /// Accessors get leftViewMatrix() { return this.__leftCameraEntity.getCamera().viewMatrix; } get rightViewMatrix() { return this.__rightCameraEntity.getCamera().viewMatrix; } get leftProjectionMatrix() { var _a; const xrViewLeft = (_a = this.__xrViewerPose) === null || _a === void 0 ? void 0 : _a.views[0]; return _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(xrViewLeft) ? xrViewLeft.projectionMatrix : _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.identity()._v); } get rightProjectionMatrix() { var _a; const xrViewRight = (_a = this.__xrViewerPose) === null || _a === void 0 ? void 0 : _a.views[1]; return _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(xrViewRight) ? xrViewRight.projectionMatrix : _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.identity()._v); } get framebuffer() { // if (this.__multiviewFramebufferHandle > 0) { // const webglResourceRepository = CGAPIResourceRepository.getWebGLResourceRepository(); // const framebuffer = webglResourceRepository.getWebGLResource( // this.__multiviewFramebufferHandle // ); // return framebuffer as WebGLFramebuffer | undefined; // } var _a, _b; return (_b = (_a = this.__xrSession) === null || _a === void 0 ? void 0 : _a.renderState.baseLayer) === null || _b === void 0 ? void 0 : _b.framebuffer; } isMultiView() { const webglResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.getWebGLResourceRepository(); return webglResourceRepository.isSupportMultiViewVRRendering(); } get requestedToEnterWebXR() { return this.__requestedToEnterWebXR; } get xrSession() { return this.__xrSession; } get requestedToEnterWebVR() { return this.__requestedToEnterWebXR; } get isWebXRMode() { return this.__isWebXRMode; } __setWebXRMode(mode) { this.__isWebXRMode = mode; this.__glw._isWebXRMode = mode; } get isReadyForWebXR() { return this.__isReadyForWebXR; } /// Public Static Methods static getInstance() { if (!this.__instance) { this.__instance = new WebXRSystem(); } return this.__instance; } /// Friend methods /** * Getter of the view matrix of right eye * @param index (0: left, 1: right) * @internal * @returns The view matrix vector of right eye */ _getViewMatrixAt(index) { if (index === 0) { return this.leftViewMatrix; } else { return this.rightViewMatrix; } } /** * Getter of the project matrix of right eye * @param index (0: left, 1: right) * @internal * @returns The project matrix of right eye */ _getProjectMatrixAt(index) { if (index === 0) { return this.leftProjectionMatrix; } else { return this.rightProjectionMatrix; } } /** * Getter of the viewport vector * @param index (0: left, 1: right) * @internal * @returns the viewport vector */ _getViewportAt(index) { if (index === 0) { return this._getLeftViewport(); } else { return this._getRightViewport(); } } /** * Getter of the viewport vector of left eye * @internal * @returns The viewport vector of left eye */ _getLeftViewport() { return _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_3__.Vector4.fromCopyArray([0, 0, this.__canvasWidthForVR / 2, this.__canvasHeightForVR]); } /** * Getter of the viewport vector of right eye * @internal * @returns The viewport vector of right eye */ _getRightViewport() { if (this.isMultiView()) { return _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_3__.Vector4.fromCopyArray([0, 0, this.__canvasWidthForVR / 2, this.__canvasHeightForVR]); } else { return _foundation_math_Vector4__WEBPACK_IMPORTED_MODULE_3__.Vector4.fromCopyArray([ this.__canvasWidthForVR / 2, 0, this.__canvasWidthForVR / 2, this.__canvasHeightForVR, ]); } } _setValuesToGlobalDataRepository() { this.__leftCameraEntity.getCamera().projectionMatrix = this.leftProjectionMatrix; this.__rightCameraEntity.getCamera().projectionMatrix = this.rightProjectionMatrix; this.__leftCameraEntity.getCamera().setValuesToGlobalDataRepository(); this.__rightCameraEntity.getCamera().setValuesToGlobalDataRepository(); } /** * Getter of the position of the VR camera in world space * @internal * @param displayIdx (0: left, 1: right) * @returns The position of the VR camera in world space */ _getCameraWorldPositionAt(displayIdx) { var _a; const xrView = (_a = this.__xrViewerPose) === null || _a === void 0 ? void 0 : _a.views[displayIdx]; if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(xrView)) { const pos = xrView.transform.position; const def = this.__defaultPositionInLocalSpaceMode; const translate = this.__viewerTranslate; const viewerHeadPos = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.add(_foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([pos.x, pos.y, pos.z]), def); return _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([ (viewerHeadPos.x + translate.x) * this.__viewerScale.x, (viewerHeadPos.y + translate.y) * this.__viewerScale.y, (viewerHeadPos.z + translate.z) * this.__viewerScale.z, ]); } else { return this.__defaultPositionInLocalSpaceMode; } } /** * Getter of the CameraComponent SID of left/right eye * @internal * @param index (0: left, 1: right) * @returns the SID of the CameraComponent of left/right eye */ _getCameraComponentSIDAt(index) { if (index === 0) { return this.__leftCameraEntity.getCamera().componentSID; } else { return this.__rightCameraEntity.getCamera().componentSID; } } /** * Getter of the CameraComponent of left/right eye * @internal * @param index (0: left, 1: right) * @returns the CameraComponent of left/right eye */ _getCameraComponentAt(index) { if (index === 0) { return this.__leftCameraEntity.getCamera(); } else { return this.__rightCameraEntity.getCamera(); } } /** * Pre process for rendering * @internal * @param xrFrame XRFrame object */ _preRender(time, xrFrame) { if (this.isWebXRMode && this.__requestedToEnterWebXR && xrFrame != null) { this.__updateView(xrFrame); this.__updateInputSources(xrFrame); (0,_WebXRInput__WEBPACK_IMPORTED_MODULE_6__.updateGamePad)(time, xrFrame, { viewerTranslate: this.__viewerTranslate, viewerScale: this.__viewerScale, viewerOrientation: this.__viewerOrientation, viewerAzimuthAngle: this.__viewerAzimuthAngle, }); } } resetViewerTransform() { this.__viewerTranslate = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.zero(); this.__viewerAzimuthAngle = _foundation_math_MutableScalar__WEBPACK_IMPORTED_MODULE_10__.MutableScalar.zero(); this.__viewerOrientation = _foundation_math_MutableQuaternion__WEBPACK_IMPORTED_MODULE_9__.MutableQuaternion.identity(); this.__viewerScale = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.one(); } /** * Post process for rendering * @internal */ _postRender() { if (this.__isWebXRMode) { // const gl = this.__glw!.getRawContextAsWebGL2()!; // if (this.__multiviewFramebufferHandle > 0) { // const webglResourceRepository = CGAPIResourceRepository.getWebGLResourceRepository(); // gl.invalidateFramebuffer(gl.DRAW_FRAMEBUFFER, [gl.DEPTH_STENCIL_ATTACHMENT]); // gl.bindFramebuffer( // gl.DRAW_FRAMEBUFFER, // this.__xrSession!.renderState.baseLayer!.framebuffer! // ); // const colorTexture = webglResourceRepository.getWebGLResource( // this.__multiviewColorTextureHandle // ) as WebGLTexture; // this.__webglStereoUtil!.blit( // colorTexture!, // 0, // 0, // 1, // 1, // this.__canvasWidthForVR, // this.__canvasHeightForVR // ); // } } } /// Private Methods async __onInputSourcesChange(event, resolve, profilePriorities) { this.__xrInputSources.length = 0; for (const xrInputSource of event.added) { this.__xrInputSources.push(xrInputSource); const controller = await (0,_WebXRInput__WEBPACK_IMPORTED_MODULE_6__.createMotionController)(xrInputSource, this.__basePath, profilePriorities); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(controller)) { this.__controllerEntities.push(controller); this.__viewerEntity.getSceneGraph().addChild(controller.getSceneGraph()); } } resolve(this.__controllerEntities); } __setCameraInfoFromXRViews(xrViewerPose) { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(xrViewerPose)) { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('xrViewerPose not exist'); return; } const xrViewLeft = xrViewerPose.views[0]; const xrViewRight = xrViewerPose.views[1]; if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(xrViewLeft) || _foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.not.exist(xrViewRight)) { return; } const orientation = xrViewerPose.transform.orientation; this.__viewerOrientation.x = orientation.x; this.__viewerOrientation.y = orientation.y; this.__viewerOrientation.z = orientation.z; this.__viewerOrientation.w = orientation.w; const lm = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(xrViewLeft === null || xrViewLeft === void 0 ? void 0 : xrViewLeft.transform.matrix); const rm = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(xrViewRight === null || xrViewRight === void 0 ? void 0 : xrViewRight.transform.matrix); const rotateMatLeft = lm; const rotateMatRight = rm; const scale = this.__viewerScale.x; const pos = xrViewLeft.transform.position; const translateLeftScaled = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.add(this.__defaultPositionInLocalSpaceMode, this.__viewerTranslate); const translateRightScaled = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.add(this.__defaultPositionInLocalSpaceMode, this.__viewerTranslate); const xrViewerPosLeft = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([pos.x, pos.y, pos.z]); const xrViewerPosRight = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([pos.x, pos.y, pos.z]); const translateLeft = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.add(this.__defaultPositionInLocalSpaceMode, this.__viewerTranslate).add(xrViewerPosLeft); const translateRight = _foundation_math_MutableVector3__WEBPACK_IMPORTED_MODULE_8__.MutableVector3.add(this.__defaultPositionInLocalSpaceMode, this.__viewerTranslate).add(xrViewerPosRight); const viewerTranslateScaledX = (translateLeftScaled.x + translateRightScaled.x) / 2; const viewerTranslateScaledZ = (translateLeftScaled.z + translateRightScaled.z) / 2; const viewerTranslateX = (translateLeft.x + translateRight.x) / 2; const viewerTranslateZ = (translateLeft.z + translateRight.z) / 2; const viewerTransform = this.__viewerEntity.getTransform(); viewerTransform.localPosition = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([ viewerTranslateScaledX, 0, viewerTranslateScaledZ, ]); viewerTransform.localScale = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([scale, scale, scale]); viewerTransform.localEulerAngles = _foundation_math_Vector3__WEBPACK_IMPORTED_MODULE_1__.Vector3.fromCopyArray([0, this.__viewerAzimuthAngle.x, 0]); rotateMatLeft.translateY = translateLeft.y; rotateMatLeft.translateX = translateLeft.x - viewerTranslateX; rotateMatLeft.translateZ = translateLeft.z - viewerTranslateZ; rotateMatLeft.translateY += xrViewerPosLeft.y; rotateMatLeft.translateX += xrViewerPosLeft.x; rotateMatLeft.translateZ += xrViewerPosLeft.z; rotateMatRight.translateY = translateRight.y; rotateMatRight.translateX = translateRight.x - viewerTranslateX; rotateMatRight.translateZ = translateRight.z - viewerTranslateZ; rotateMatRight.translateY += xrViewerPosRight.y; rotateMatRight.translateX += xrViewerPosRight.x; rotateMatRight.translateZ += xrViewerPosRight.z; this.__leftCameraEntity.getTransform().localMatrix = rotateMatLeft; this.__rightCameraEntity.getTransform().localMatrix = rotateMatRight; } async __setupWebGLLayer(xrSession, callbackOnXrSessionStart) { var _a; const gl = (_a = this.__glw) === null || _a === void 0 ? void 0 : _a.getRawContextAsWebGL2(); if (gl != null) { // Make sure the canvas context we want to use is compatible with the current xr device. await gl.makeXRCompatible(); // The content that will be shown on the device is defined by the session's // baseLayer. this.__webglLayer = new window.XRWebGLLayer(xrSession, gl); const webglLayer = this.__webglLayer; xrSession.updateRenderState({ baseLayer: webglLayer, depthNear: 0.01, depthFar: 1000, }); const webglResourceRepository = _foundation_renderer_CGAPIResourceRepository__WEBPACK_IMPORTED_MODULE_0__.CGAPIResourceRepository.getWebGLResourceRepository(); this.__canvasWidthForVR = webglLayer.framebufferWidth; this.__canvasHeightForVR = webglLayer.framebufferHeight; _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.info(this.__canvasWidthForVR.toString()); _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.info(this.__canvasHeightForVR.toString()); // if (this.__multiviewFramebufferHandle === -1) { // const webglResourceRepository = CGAPIResourceRepository.getWebGLResourceRepository(); // [this.__multiviewFramebufferHandle, this.__multiviewColorTextureHandle] = // webglResourceRepository.createMultiviewFramebuffer( // webglLayer.framebufferWidth, // webglLayer.framebufferHeight, // 4 // ); // this.__webglStereoUtil = new WebGLStereoUtil(gl); // } _foundation_materials_core_MaterialRepository__WEBPACK_IMPORTED_MODULE_11__.MaterialRepository._makeShaderInvalidateToAllMaterials(); webglResourceRepository.resizeCanvas(this.__canvasWidthForVR, this.__canvasHeightForVR); this.__setWebXRMode(true); callbackOnXrSessionStart(); } else { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.error('WebGL context is not ready for WebXR.'); } } __updateView(xrFrame) { this.__xrViewerPose = xrFrame.getViewerPose(this.__xrReferenceSpace); this.__setCameraInfoFromXRViews(this.__xrViewerPose); } __updateInputSources(xrFrame) { this.__xrInputSources.forEach((input, i) => { if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(input.gripSpace)) { const xrPose = xrFrame.getPose(input.gripSpace, this.__xrReferenceSpace); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(xrPose)) { const hand = this.__controllerEntities[i]; if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(hand)) { // update the transform of the controller itself const handWorldMatrix = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.fromCopyFloat32ArrayColumnMajor(xrPose.transform.matrix); const rotateMat = _foundation_math_MutableMatrix44__WEBPACK_IMPORTED_MODULE_2__.MutableMatrix44.fromCopyMatrix44(handWorldMatrix); rotateMat.translateY += this.__defaultPositionInLocalSpaceMode.y; rotateMat.translateY += this.__viewerTranslate.y; hand.getTransform().localMatrix = rotateMat; // update the components (buttons, etc...) of the controller const motionController = (0,_WebXRInput__WEBPACK_IMPORTED_MODULE_6__.getMotionController)(input); if (_foundation_misc_Is__WEBPACK_IMPORTED_MODULE_7__.Is.exist(motionController)) { (0,_WebXRInput__WEBPACK_IMPORTED_MODULE_6__.updateMotionControllerModel)(hand, motionController); } else { _foundation_misc_Logger__WEBPACK_IMPORTED_MODULE_14__.Logger.warn('motionController not found'); } } } } }); } } /***/ }), /***/ "./src/xr/getModule.ts": /*!*****************************!*\ !*** ./src/xr/getModule.ts ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getWebXRSystem: () => (/* binding */ getWebXRSystem) /* harmony export */ }); /* harmony import */ var _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../foundation/system/ModuleManager */ "./src/foundation/system/ModuleManager.ts"); function getWebXRSystem() { const moduleName = 'xr'; const moduleManager = _foundation_system_ModuleManager__WEBPACK_IMPORTED_MODULE_0__.ModuleManager.getInstance(); const xrModule = moduleManager.getModule(moduleName); const webXRSystem = xrModule.WebXRSystem.getInstance(); return webXRSystem; } /***/ }), /***/ "./src/xr/index.ts": /*!*************************!*\ !*** ./src/xr/index.ts ***! \*************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebXRSystem: () => (/* reexport safe */ _WebXRSystem__WEBPACK_IMPORTED_MODULE_1__.WebXRSystem), /* harmony export */ createMotionController: () => (/* reexport safe */ _WebXRInput__WEBPACK_IMPORTED_MODULE_0__.createMotionController), /* harmony export */ getMotionController: () => (/* reexport safe */ _WebXRInput__WEBPACK_IMPORTED_MODULE_0__.getMotionController), /* harmony export */ getWebXRSystem: () => (/* reexport safe */ _getModule__WEBPACK_IMPORTED_MODULE_2__.getWebXRSystem), /* harmony export */ updateGamePad: () => (/* reexport safe */ _WebXRInput__WEBPACK_IMPORTED_MODULE_0__.updateGamePad), /* harmony export */ updateMotionControllerModel: () => (/* reexport safe */ _WebXRInput__WEBPACK_IMPORTED_MODULE_0__.updateMotionControllerModel) /* harmony export */ }); /* harmony import */ var _WebXRInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebXRInput */ "./src/xr/WebXRInput.ts"); /* harmony import */ var _WebXRSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WebXRSystem */ "./src/xr/WebXRSystem.ts"); /* harmony import */ var _getModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getModule */ "./src/xr/getModule.ts"); /* harmony import */ var _main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./main */ "./src/xr/main.ts"); /***/ }), /***/ "./src/xr/main.ts": /*!************************!*\ !*** ./src/xr/main.ts ***! \************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _WebXRSystem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WebXRSystem */ "./src/xr/WebXRSystem.ts"); /* harmony import */ var _WebARSystem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WebARSystem */ "./src/xr/WebARSystem.ts"); const XR = Object.freeze({ WebXRSystem: _WebXRSystem__WEBPACK_IMPORTED_MODULE_0__.WebXRSystem, WebARSystem: _WebARSystem__WEBPACK_IMPORTED_MODULE_1__.WebARSystem, }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (XR); (0, eval)('this').RnXR = XR; /***/ }), /***/ "./VERSION-FILE": /*!**********************!*\ !*** ./VERSION-FILE ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({"version":"v0.13.2-0-g6140b981d-dirty","branch":"main"}); /***/ }), /***/ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/components.js": /*!*****************************************************************************************!*\ !*** ./node_modules/webxr-input-profiles/packages/motion-controllers/src/components.js ***! \*****************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Component: () => (/* binding */ Component) /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/constants.js"); /* harmony import */ var _visualResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./visualResponse */ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/visualResponse.js"); class Component { /** * @param {Object} componentId - Id of the component * @param {Object} componentDescription - Description of the component to be created */ constructor(componentId, componentDescription) { if (!componentId || !componentDescription || !componentDescription.visualResponses || !componentDescription.gamepadIndices || Object.keys(componentDescription.gamepadIndices).length === 0) { throw new Error('Invalid arguments supplied'); } this.id = componentId; this.type = componentDescription.type; this.rootNodeName = componentDescription.rootNodeName; this.touchPointNodeName = componentDescription.touchPointNodeName; // Build all the visual responses for this component this.visualResponses = {}; Object.keys(componentDescription.visualResponses).forEach((responseName) => { const visualResponse = new _visualResponse__WEBPACK_IMPORTED_MODULE_1__.VisualResponse(componentDescription.visualResponses[responseName]); this.visualResponses[responseName] = visualResponse; }); // Set default values this.gamepadIndices = Object.assign({}, componentDescription.gamepadIndices); this.values = { state: _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.DEFAULT, button: (this.gamepadIndices.button !== undefined) ? 0 : undefined, xAxis: (this.gamepadIndices.xAxis !== undefined) ? 0 : undefined, yAxis: (this.gamepadIndices.yAxis !== undefined) ? 0 : undefined }; } get data() { const data = { id: this.id, ...this.values }; return data; } /** * @description Poll for updated data based on current gamepad state * @param {Object} gamepad - The gamepad object from which the component data should be polled */ updateFromGamepad(gamepad) { // Set the state to default before processing other data sources this.values.state = _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.DEFAULT; // Get and normalize button if (this.gamepadIndices.button !== undefined && gamepad.buttons.length > this.gamepadIndices.button) { const gamepadButton = gamepad.buttons[this.gamepadIndices.button]; this.values.button = gamepadButton.value; this.values.button = (this.values.button < 0) ? 0 : this.values.button; this.values.button = (this.values.button > 1) ? 1 : this.values.button; // Set the state based on the button if (gamepadButton.pressed || this.values.button === 1) { this.values.state = _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.PRESSED; } else if (gamepadButton.touched || this.values.button > _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ButtonTouchThreshold) { this.values.state = _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.TOUCHED; } } // Get and normalize x axis value if (this.gamepadIndices.xAxis !== undefined && gamepad.axes.length > this.gamepadIndices.xAxis) { this.values.xAxis = gamepad.axes[this.gamepadIndices.xAxis]; this.values.xAxis = (this.values.xAxis < -1) ? -1 : this.values.xAxis; this.values.xAxis = (this.values.xAxis > 1) ? 1 : this.values.xAxis; // If the state is still default, check if the xAxis makes it touched if (this.values.state === _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.DEFAULT && Math.abs(this.values.xAxis) > _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.AxisTouchThreshold) { this.values.state = _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.TOUCHED; } } // Get and normalize Y axis value if (this.gamepadIndices.yAxis !== undefined && gamepad.axes.length > this.gamepadIndices.yAxis) { this.values.yAxis = gamepad.axes[this.gamepadIndices.yAxis]; this.values.yAxis = (this.values.yAxis < -1) ? -1 : this.values.yAxis; this.values.yAxis = (this.values.yAxis > 1) ? 1 : this.values.yAxis; // If the state is still default, check if the yAxis makes it touched if (this.values.state === _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.DEFAULT && Math.abs(this.values.yAxis) > _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.AxisTouchThreshold) { this.values.state = _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.TOUCHED; } } // Update the visual response weights based on the current component data Object.values(this.visualResponses).forEach((visualResponse) => { visualResponse.updateFromComponent(this.values); }); } } /***/ }), /***/ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/constants.js": /*!****************************************************************************************!*\ !*** ./node_modules/webxr-input-profiles/packages/motion-controllers/src/constants.js ***! \****************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Constants: () => (/* binding */ Constants) /* harmony export */ }); const Constants = { Handedness: Object.freeze({ NONE: 'none', LEFT: 'left', RIGHT: 'right' }), ComponentState: Object.freeze({ DEFAULT: 'default', TOUCHED: 'touched', PRESSED: 'pressed' }), ComponentProperty: Object.freeze({ BUTTON: 'button', X_AXIS: 'xAxis', Y_AXIS: 'yAxis', STATE: 'state' }), ComponentType: Object.freeze({ TRIGGER: 'trigger', SQUEEZE: 'squeeze', TOUCHPAD: 'touchpad', THUMBSTICK: 'thumbstick', BUTTON: 'button' }), ButtonTouchThreshold: 0.05, AxisTouchThreshold: 0.1, VisualResponseProperty: Object.freeze({ TRANSFORM: 'transform', VISIBILITY: 'visibility' }) }; /***/ }), /***/ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/motionController.js": /*!***********************************************************************************************!*\ !*** ./node_modules/webxr-input-profiles/packages/motion-controllers/src/motionController.js ***! \***********************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MotionController: () => (/* binding */ MotionController) /* harmony export */ }); /* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components */ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/components.js"); /** * @description Builds a motion controller with components and visual responses based on the * supplied profile description. Data is polled from the xrInputSource's gamepad. * @author Nell Waliczek / https://github.com/NellWaliczek */ class MotionController { /** * @param {Object} xrInputSource - The XRInputSource to build the MotionController around * @param {Object} profile - The best matched profile description for the supplied xrInputSource * @param {Object} assetUrl */ constructor(xrInputSource, profile, assetUrl) { if (!xrInputSource) { throw new Error('No xrInputSource supplied'); } if (!profile) { throw new Error('No profile supplied'); } this.xrInputSource = xrInputSource; this.assetUrl = assetUrl; this.id = profile.profileId; // Build child components as described in the profile description this.layoutDescription = profile.layouts[xrInputSource.handedness]; this.components = {}; Object.keys(this.layoutDescription.components).forEach((componentId) => { const componentDescription = this.layoutDescription.components[componentId]; this.components[componentId] = new _components__WEBPACK_IMPORTED_MODULE_0__.Component(componentId, componentDescription); }); // Initialize components based on current gamepad state this.updateFromGamepad(); } get gripSpace() { return this.xrInputSource.gripSpace; } get targetRaySpace() { return this.xrInputSource.targetRaySpace; } /** * @description Returns a subset of component data for simplified debugging */ get data() { const data = []; Object.values(this.components).forEach((component) => { data.push(component.data); }); return data; } /** * @description Poll for updated data based on current gamepad state */ updateFromGamepad() { Object.values(this.components).forEach((component) => { component.updateFromGamepad(this.xrInputSource.gamepad); }); } } /***/ }), /***/ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/profiles.js": /*!***************************************************************************************!*\ !*** ./node_modules/webxr-input-profiles/packages/motion-controllers/src/profiles.js ***! \***************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ fetchProfile: () => (/* binding */ fetchProfile), /* harmony export */ fetchProfilesList: () => (/* binding */ fetchProfilesList) /* harmony export */ }); /** * @description Static helper function to fetch a JSON file and turn it into a JS object * @param {string} path - Path to JSON file to be fetched */ async function fetchJsonFile(path) { const response = await fetch(path); if (!response.ok) { throw new Error(response.statusText); } else { return response.json(); } } async function fetchProfilesList(basePath) { if (!basePath) { throw new Error('No basePath supplied'); } const profileListFileName = 'profilesList.json'; const profilesList = await fetchJsonFile(`${basePath}/${profileListFileName}`); return profilesList; } async function fetchProfile(xrInputSource, basePath, defaultProfile = null, getAssetPath = true) { if (!xrInputSource) { throw new Error('No xrInputSource supplied'); } if (!basePath) { throw new Error('No basePath supplied'); } // Get the list of profiles const supportedProfilesList = await fetchProfilesList(basePath); // Find the relative path to the first requested profile that is recognized let match; xrInputSource.profiles.some((profileId) => { const supportedProfile = supportedProfilesList[profileId]; if (supportedProfile) { match = { profileId, profilePath: `${basePath}/${supportedProfile.path}`, deprecated: !!supportedProfile.deprecated }; } return !!match; }); if (!match) { if (!defaultProfile) { throw new Error('No matching profile name found'); } const supportedProfile = supportedProfilesList[defaultProfile]; if (!supportedProfile) { throw new Error(`No matching profile name found and default profile "${defaultProfile}" missing.`); } match = { profileId: defaultProfile, profilePath: `${basePath}/${supportedProfile.path}`, deprecated: !!supportedProfile.deprecated }; } const profile = await fetchJsonFile(match.profilePath); let assetPath; if (getAssetPath) { let layout; if (xrInputSource.handedness === 'any') { layout = profile.layouts[Object.keys(profile.layouts)[0]]; } else { layout = profile.layouts[xrInputSource.handedness]; } if (!layout) { throw new Error( `No matching handedness, ${xrInputSource.handedness}, in profile ${match.profileId}` ); } if (layout.assetPath) { assetPath = match.profilePath.replace('profile.json', layout.assetPath); } } return { profile, assetPath }; } /***/ }), /***/ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/visualResponse.js": /*!*********************************************************************************************!*\ !*** ./node_modules/webxr-input-profiles/packages/motion-controllers/src/visualResponse.js ***! \*********************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VisualResponse: () => (/* binding */ VisualResponse) /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "./node_modules/webxr-input-profiles/packages/motion-controllers/src/constants.js"); /** @constant {Object} */ const defaultComponentValues = { xAxis: 0, yAxis: 0, button: 0, state: _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentState.DEFAULT }; /** * @description Converts an X, Y coordinate from the range -1 to 1 (as reported by the Gamepad * API) to the range 0 to 1 (for interpolation). Also caps the X, Y values to be bounded within * a circle. This ensures that thumbsticks are not animated outside the bounds of their physical * range of motion and touchpads do not report touch locations off their physical bounds. * @param {number} x The original x coordinate in the range -1 to 1 * @param {number} y The original y coordinate in the range -1 to 1 */ function normalizeAxes(x = 0, y = 0) { let xAxis = x; let yAxis = y; // Determine if the point is outside the bounds of the circle // and, if so, place it on the edge of the circle const hypotenuse = Math.sqrt((x * x) + (y * y)); if (hypotenuse > 1) { const theta = Math.atan2(y, x); xAxis = Math.cos(theta); yAxis = Math.sin(theta); } // Scale and move the circle so values are in the interpolation range. The circle's origin moves // from (0, 0) to (0.5, 0.5). The circle's radius scales from 1 to be 0.5. const result = { normalizedXAxis: (xAxis * 0.5) + 0.5, normalizedYAxis: (yAxis * 0.5) + 0.5 }; return result; } /** * Contains the description of how the 3D model should visually respond to a specific user input. * This is accomplished by initializing the object with the name of a node in the 3D model and * property that need to be modified in response to user input, the name of the nodes representing * the allowable range of motion, and the name of the input which triggers the change. In response * to the named input changing, this object computes the appropriate weighting to use for * interpolating between the range of motion nodes. */ class VisualResponse { constructor(visualResponseDescription) { this.componentProperty = visualResponseDescription.componentProperty; this.states = visualResponseDescription.states; this.valueNodeName = visualResponseDescription.valueNodeName; this.valueNodeProperty = visualResponseDescription.valueNodeProperty; if (this.valueNodeProperty === _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.VisualResponseProperty.TRANSFORM) { this.minNodeName = visualResponseDescription.minNodeName; this.maxNodeName = visualResponseDescription.maxNodeName; } // Initializes the response's current value based on default data this.value = 0; this.updateFromComponent(defaultComponentValues); } /** * Computes the visual response's interpolation weight based on component state * @param {Object} componentValues - The component from which to update * @param {number} xAxis - The reported X axis value of the component * @param {number} yAxis - The reported Y axis value of the component * @param {number} button - The reported value of the component's button * @param {string} state - The component's active state */ updateFromComponent({ xAxis, yAxis, button, state }) { const { normalizedXAxis, normalizedYAxis } = normalizeAxes(xAxis, yAxis); switch (this.componentProperty) { case _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentProperty.X_AXIS: this.value = (this.states.includes(state)) ? normalizedXAxis : 0.5; break; case _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentProperty.Y_AXIS: this.value = (this.states.includes(state)) ? normalizedYAxis : 0.5; break; case _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentProperty.BUTTON: this.value = (this.states.includes(state)) ? button : 0; break; case _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.ComponentProperty.STATE: if (this.valueNodeProperty === _constants__WEBPACK_IMPORTED_MODULE_0__.Constants.VisualResponseProperty.VISIBILITY) { this.value = (this.states.includes(state)); } else { this.value = this.states.includes(state) ? 1.0 : 0.0; } break; default: throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`); } } } /***/ }), /***/ "./node_modules/zlibjs/bin/unzip.min.js": /*!**********************************************!*\ !*** ./node_modules/zlibjs/bin/unzip.min.js ***! \**********************************************/ /***/ (function() { /** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';function l(a){throw a;}var r=void 0,t,aa=this;function v(a,b){var c=a.split("."),d=aa;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var f;c.length&&(f=c.shift());)!c.length&&b!==r?d[f]=b:d=d[f]?d[f]:d[f]={}};var y="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;new (y?Uint8Array:Array)(256);var z;for(z=0;256>z;++z)for(var B=z,ba=7,B=B>>>1;B;B>>>=1)--ba;var ca=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759, 2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977, 2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755, 2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956, 3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270, 936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],C=y?new Uint32Array(ca):ca;if(aa.Uint8Array!==r)try{eval("String.fromCharCode.apply(null, new Uint8Array([0]));")}catch(ea){String.fromCharCode.apply=function(a){return function(b,c){return a.call(String.fromCharCode,b,Array.prototype.slice.call(c))}}(String.fromCharCode.apply)};function D(a){var b=a.length,c=0,d=Number.POSITIVE_INFINITY,f,h,k,e,g,m,p,s,q,x;for(s=0;sc&&(c=a[s]),a[s]>=1;x=k<<16|s;for(q=m;qG;G++)switch(!0){case 143>=G:F.push([G+48,8]);break;case 255>=G:F.push([G-144+400,9]);break;case 279>=G:F.push([G-256+0,7]);break;case 287>=G:F.push([G-280+192,8]);break;default:l("invalid literal: "+G)} var fa=function(){function a(a){switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272, a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:l("invalid length: "+a)}}var b=[],c,d;for(c=3;258>=c;c++)d=a(c),b[c]=d[2]<<24|d[1]<< 16|d[0];return b}();y&&new Uint32Array(fa);function I(a,b){this.l=[];this.m=32768;this.d=this.f=this.c=this.t=0;this.input=y?new Uint8Array(a):a;this.u=!1;this.n=J;this.K=!1;if(b||!(b={}))b.index&&(this.c=b.index),b.bufferSize&&(this.m=b.bufferSize),b.bufferType&&(this.n=b.bufferType),b.resize&&(this.K=b.resize);switch(this.n){case ga:this.a=32768;this.b=new (y?Uint8Array:Array)(32768+this.m+258);break;case J:this.a=0;this.b=new (y?Uint8Array:Array)(this.m);this.e=this.W;this.B=this.R;this.q=this.V;break;default:l(Error("invalid inflate mode"))}} var ga=0,J=1; I.prototype.r=function(){for(;!this.u;){var a=K(this,3);a&1&&(this.u=!0);a>>>=1;switch(a){case 0:var b=this.input,c=this.c,d=this.b,f=this.a,h=b.length,k=r,e=r,g=d.length,m=r;this.d=this.f=0;c+1>=h&&l(Error("invalid uncompressed block header: LEN"));k=b[c++]|b[c++]<<8;c+1>=h&&l(Error("invalid uncompressed block header: NLEN"));e=b[c++]|b[c++]<<8;k===~e&&l(Error("invalid uncompressed block header: length verify"));c+k>b.length&&l(Error("input buffer is broken"));switch(this.n){case ga:for(;f+k>d.length;){m= g-f;k-=m;if(y)d.set(b.subarray(c,c+m),f),f+=m,c+=m;else for(;m--;)d[f++]=b[c++];this.a=f;d=this.e();f=this.a}break;case J:for(;f+k>d.length;)d=this.e({H:2});break;default:l(Error("invalid inflate mode"))}if(y)d.set(b.subarray(c,c+k),f),f+=k,c+=k;else for(;k--;)d[f++]=b[c++];this.c=c;this.a=f;this.b=d;break;case 1:this.q(ha,ia);break;case 2:for(var p=K(this,5)+257,s=K(this,5)+1,q=K(this,4)+4,x=new (y?Uint8Array:Array)(L.length),u=r,n=r,E=r,A=r,X=r,O=r,H=r,w=r,da=r,w=0;w=R?8:255>=R?9:279>=R?7:8;var ha=D(Q),S=new (y?Uint8Array:Array)(30),T,ra;T=0;for(ra=S.length;T=k&&l(Error("input buffer is broken")),c|=f[h++]<>>b;a.d=d-b;a.c=h;return e} function M(a,b){for(var c=a.f,d=a.d,f=a.input,h=a.c,k=f.length,e=b[0],g=b[1],m,p;d=k);)c|=f[h++]<>>16;p>d&&l(Error("invalid code length: "+p));a.f=c>>p;a.d=d-p;a.c=h;return m&65535}t=I.prototype; t.q=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length-258,h,k,e,g;256!==(h=M(this,a));)if(256>h)d>=f&&(this.a=d,c=this.e(),d=this.a),c[d++]=h;else{k=h-257;g=la[k];0=f&&(this.a=d,c=this.e(),d=this.a);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d}; t.V=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length,h,k,e,g;256!==(h=M(this,a));)if(256>h)d>=f&&(c=this.e(),f=c.length),c[d++]=h;else{k=h-257;g=la[k];0f&&(c=this.e(),f=c.length);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d}; t.e=function(){var a=new (y?Uint8Array:Array)(this.a-32768),b=this.a-32768,c,d,f=this.b;if(y)a.set(f.subarray(32768,a.length));else{c=0;for(d=a.length;cc;++c)f[c]=f[b+c];this.a=32768;return f}; t.W=function(a){var b,c=this.input.length/this.c+1|0,d,f,h,k=this.input,e=this.b;a&&("number"===typeof a.H&&(c=a.H),"number"===typeof a.P&&(c+=a.P));2>c?(d=(k.length-this.c)/this.C[2],h=258*(d/2)|0,f=hb&&(this.b.length=b),a=this.b);return this.buffer=a};function U(a){a=a||{};this.files=[];this.v=a.comment}U.prototype.L=function(a){this.j=a};U.prototype.s=function(a){var b=a[2]&65535|2;return b*(b^1)>>8&255};U.prototype.k=function(a,b){a[0]=(C[(a[0]^b)&255]^a[0]>>>8)>>>0;a[1]=(6681*(20173*(a[1]+(a[0]&255))>>>0)>>>0)+1>>>0;a[2]=(C[(a[2]^a[1]>>>24)&255]^a[2]>>>8)>>>0};U.prototype.T=function(a){var b=[305419896,591751049,878082192],c,d;y&&(b=new Uint32Array(b));c=0;for(d=a.length;c>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<< 8;this.g=a[b++]|a[b++]<<8;this.F=a[b++]|a[b++]<<8;this.ea=a[b++]|a[b++]<<8;this.ga=a[b++]|a[b++]<<8;this.fa=a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24;this.$=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.filename=String.fromCharCode.apply(null,y?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.X=y?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.v=y?a.subarray(b,b+this.F):a.slice(b,b+this.F);this.length=b-this.offset};function ua(a,b){this.input=a;this.offset=b}var va={N:1,ca:8,da:2048}; ua.prototype.parse=function(){var a=this.input,b=this.offset;(a[b++]!==Y[0]||a[b++]!==Y[1]||a[b++]!==Y[2]||a[b++]!==Y[3])&&l(Error("invalid local file header signature"));this.Z=a[b++]|a[b++]<<8;this.I=a[b++]|a[b++]<<8;this.A=a[b++]|a[b++]<<8;this.time=a[b++]|a[b++]<<8;this.U=a[b++]|a[b++]<<8;this.p=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<<8;this.g=a[b++]|a[b++]<<8;this.filename= String.fromCharCode.apply(null,y?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.X=y?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.length=b-this.offset}; function $(a){var b=[],c={},d,f,h,k;if(!a.i){if(a.o===r){var e=a.input,g;if(!a.D)a:{var m=a.input,p;for(p=m.length-12;0>>0;a.o=(e[g++]| e[g++]<<8|e[g++]<<16|e[g++]<<24)>>>0;a.w=e[g++]|e[g++]<<8;a.v=y?e.subarray(g,g+a.w):e.slice(g,g+a.w)}d=a.o;h=0;for(k=a.aa;h>>8^C[(n^m[u])&255];for(E=A>>3;E--;u+=8)n=n>>>8^C[(n^m[u])&255],n=n>>>8^C[(n^m[u+1])&255],n=n>>>8^C[(n^m[u+2])&255],n=n>>>8^C[(n^m[u+3])&255],n=n>>>8^C[(n^m[u+4])&255],n=n>>>8^C[(n^m[u+5])&255],n=n>>>8^C[(n^m[u+6])&255],n=n>>>8^C[(n^m[u+7])&255];p=(n^4294967295)>>>0;k.p!==p&&l(Error("wrong crc: file=0x"+ k.p.toString(16)+", data=0x"+p.toString(16)))}return m};t.L=function(a){this.j=a};function wa(a,b,c){c^=a.s(b);a.k(b,c);return c}t.k=U.prototype.k;t.S=U.prototype.T;t.s=U.prototype.s;v("Zlib.Unzip",V);v("Zlib.Unzip.prototype.decompress",V.prototype.r);v("Zlib.Unzip.prototype.getFilenames",V.prototype.Y);v("Zlib.Unzip.prototype.setPassword",V.prototype.L);}).call(this); /***/ }), /***/ "./node_modules/zstddec/dist/zstddec.modern.js": /*!*****************************************************!*\ !*** ./node_modules/zstddec/dist/zstddec.modern.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ZSTDDecoder: () => (/* binding */ Q) /* harmony export */ }); let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A="undefined"!=typeof fetch?fetch("data:application/wasm;base64,"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,"base64"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error("ZSTDDecoder: Await .init() before decoding.");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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"; //# sourceMappingURL=zstddec.modern.js.map /***/ }), /***/ "./vendor/hdrpng.min.js": /*!******************************!*\ !*** ./vendor/hdrpng.min.js ***! \******************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* hdrpng.js - by Enki - https://enkimute.github.io */ (function(name,context,definition){if( true&&module.exports)module.exports=definition();else if(true)__webpack_require__.amdD(name,definition);else {}})("HDRImage",this,function(){function HDRImage(){var res=document.createElement("canvas"),HDRsrc="t",HDRexposure=1,HDRgamma=2.2,HDRdata=null,context,HDRD;res.__defineGetter__("exposure",function(){return HDRexposure});res.__defineSetter__("exposure",function(val){HDRexposure=val;if(HDRdata){rgbeToLDR(HDRdata,HDRexposure,HDRgamma,HDRD.data);context.putImageData(HDRD,0,0)}});res.__defineGetter__("gamma",function(){return HDRgamma});res.__defineSetter__("gamma",function(val){HDRgamma=val;if(HDRdata){rgbeToLDR(HDRdata,HDRexposure,HDRgamma,HDRD.data);context.putImageData(HDRD,0,0)}});res.__defineGetter__("dataFloat",function(){return rgbeToFloat(HDRdata)});res.__defineGetter__("dataRGBE",function(){return HDRdata});res.toHDRBlob=function(cb,m,q){function createShader(gl,source,type){var shader=gl.createShader(type);gl.shaderSource(shader,source);gl.compileShader(shader);return shader}function createProgram(gl,vertexShaderSource,fragmentShaderSource){var program=gl.createProgram(),vs,fs;gl.attachShader(program,vs=createShader(gl,vertexShaderSource,gl.VERTEX_SHADER));gl.attachShader(program,fs=createShader(gl,fragmentShaderSource,gl.FRAGMENT_SHADER));gl.linkProgram(program);gl.deleteShader(vs);gl.deleteShader(fs);return program}var ar=m&&m.match(/rgb9_e5/i)?new Uint8Array(floatToRgb9_e5(rgbeToFloat(HDRdata)).buffer):new Uint8Array(HDRdata.buffer);var vs2="precision highp float;\nattribute vec3 position;\nvarying vec2 tex;\nvoid main() { tex = position.xy/2.0+0.5; gl_Position = vec4(position, 1.0); }";var fs2="precision highp float;\nprecision highp sampler2D;\nuniform sampler2D tx;\nvarying vec2 tex;\nvoid main() { gl_FragColor = texture2D(tx,tex); }";var x=this.width,y=this.height;if(x*y*4=400)return this.onerror();var header="",pos=0,d8=new Uint8Array(this.response),format;while(!header.match(/\n\n[^\n]+\n/g))header+=String.fromCharCode(d8[pos++]);format=header.match(/FORMAT=(.*)$/m)[1];if(format!="32-bit_rle_rgbe")return console.warn("unknown format : "+format),this.onerror();var rez=header.split(/\n/).reverse()[1].split(" "),width=rez[3]*1,height=rez[1]*1;var img=new Uint8Array(width*height*4),ipos=0;for(var j=0;j0){img.set(d8.slice(pos,pos+=4),ipos);if(img[ipos]==1&&img[ipos+1]==1&&img[ipos+2]==1){for(img[ipos+3]<0;i--){img.set(img.slice(ipos-4,ipos),ipos);ipos+=4;len--}rs+=8}else{len--;ipos+=4;rs=0}}}else{if((rgbe[2]<<8)+rgbe[3]!=width)return console.warn("HDR line mismatch .."),this.onerror();for(var i=0;i<4;i++){var ptr=i*width,ptr_end=(i+1)*width,buf,count;while(ptr128){count=buf[0]-128;while(count-- >0)scanline[ptr++]=buf[1]}else{count=buf[0]-1;scanline[ptr++]=buf[1];while(count-- >0)scanline[ptr++]=d8[pos++]}}}for(var i=0;i>2,res=res||new Float32Array(l*3);for(var i=0;i>>23)*s;res[i*3+1]=(v>>>14&511)*s;res[i*3+2]=(v>>>5&511)*s}return res}function floatToRgbe(buffer,res){var r,g,b,v,s,l=buffer.byteLength/12|0,res=res||new Uint8Array(l*4);for(var i=0;i>2,res=res||new Float32Array(l*3);for(var i=0;i>2,res=res||new Uint8ClampedArray(l*4);for(var i=0;i { /******/ __webpack_require__.amdD = function () { /******/ throw new Error('define cannot be used indirect'); /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be in strict mode. (() => { "use strict"; /*!********************!*\ !*** ./src/cjs.ts ***! \********************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./src/index.ts"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_index__WEBPACK_IMPORTED_MODULE_0__); })(); /******/ return __webpack_exports__; /******/ })() ; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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OztBQUVBOztBQUVBLCtDQUErQyxhQUFhO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Qsd0JBQXdCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELDRCQUE0QjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCx3QkFBd0I7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QztRQUM5QyxrQkFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLG9CQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsb0JBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLG9CQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMscUJBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQscUJBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQscUJBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsb0JBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRCxnQ0FBMkIsR0FBRyxJQUFJ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QkFBd0IsQ0FDbkQsQ0FBQyxDQUFDLENBQUMsRUFDSCxDQUFDLENBQUMsQ0FBQyxFQUNILENBQUMsQ0FBQyxDQUFDLEVBQ0gsQ0FBQyxDQUFDLENBQUMsRUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDaEIsQ0FBQztvQkFDRixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUV2QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO3FCQUFNLElBQUksaURBQU0sQ0FBQyxZQUFZLEtBQUssb0VBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUI7b0JBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMscUJBQXFCO29CQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQjtvQkFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBRUQsSUFBSSxpREFBTSxDQUFDLFlBQVksS0FBSyxvRUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNoRCxrQkFBa0I7b0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMscUJBQXFCO29CQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQjtvQkFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUI7b0JBQ3hELE1BQU0sV0FBVyxHQUFHLG9EQUFRLENBQUMsd0JBQXdCLENBQ25ELENBQUMsQ0FBQyxDQUFDLEVBQ0gsQ0FBQyxDQUFDLENBQUMsRUFDSCxDQUFDLENBQUMsQ0FBQyxFQUNILENBQUMsQ0FBQyxDQUFDLEVBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2hCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsaUJBQWlCO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGlEQUFNLENBQUMsWUFBWSxLQUFLLG9FQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEQsd0NBQXdDO1lBQ3hDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlDLHdDQUF3QztnQkFDeEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBRTFCLE1BQU0sV0FBVyxHQUFHLG9EQUFRLENBQUMsd0JBQXdCLENBQ25ELFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLFdBQVcsRUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDaEIsQ0FBQztnQkFDRixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLENBQVksRUFBRSxDQUFRO1FBQzdDLGFBQWE7UUFDYixhQUFhO1FBQ2IsY0FBYztRQUNkLGNBQWM7UUFFZCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sOEJBQThCO1FB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TUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxhQUFhLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDaEYsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsc0NBQXNDO0lBQzNDLE1BQU0sRUFBRSxxQkFBcUI7Q0FDOUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxjQUFjLEdBQStCLElBQUksMkJBQTJCLENBQUM7SUFDakYsS0FBSyxFQUFFLEtBQUs7SUFDWixH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dUJBQXVCLENBQUM7SUFDL0QsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNULEdBQUcsRUFBRSxNQUFNO0NBQ1osQ0FBQyxDQUFDO0FBQ0gsTUFBTSxJQUFJLEdBQTJCLElBQUksdUJBQXVCLENBQUM7SUFDL0QsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNULEdBQUcsRUFBRSxNQUFNO0NBQ1osQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUMzRSxLQUFLLEVBQUUsQ0FBQztJQUNSLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxpQkFBaUIsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUM1RSxLQUFLLEVBQUUsRUFBRTtJQUNULEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxpQkFBaUIsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUM1RSxLQUFLLEVBQUUsRUFBRTtJQUNULEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxpQkFBaUIsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUM1RSxLQUFLLEVBQUUsRUFBRTtJQUNULEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxpQkFBaUIsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUM1RSxLQUFLLEVBQUUsRUFBRTtJQUNULEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxpQkFBaUIsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUM1RSxLQUFLLEVBQUUsRUFBRTtJQUNULEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxpQkFBaUIsR0FBMkIsSUFBSSx1QkFBdUIsQ0FBQztJQUM1RSxLQUFLLEVBQUUsRUFBRTtJQUNULEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxRQUFRLEdBQUc7SUFDZixJQUFJO0lBQ0osSUFBSTtJQUNK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LENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzdDLDBCQUEwQjtRQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5Qyw0QkFBNEI7UUFFNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM1Qyx5QkFB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LENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNSLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDZCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDUixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUSxDQUFDLENBQVE7UUFDZixRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDO2dCQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNsQixLQUFLLENBQUM7Z0JBQ0osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCLEtBQUssQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEIsS0FBSyxDQUFDO2dCQUNKLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuQixLQUFLLENBQUM7Z0JBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtBQUssQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkI7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBRTNQZ0U7QUFDSjtBQUNQO0FBQ0Q7QUFDUTtBQUNJO0FBQ3ZCO0FBR047QUFDMEM7QUFFdEI7QUFFeEI7QUFLMkI7QUFDbkI7QUFFeEM7Ozs7O0dBS0c7QUFDSSxNQUFNLElBQUk7SUE4Q2Y7O09BRUc7SUFDSDtRQTdDUSxpQkFBWSxHQUFnQixFQUFFLENBQUM7UUFDL0IsdUJBQWtCLEdBQXFCLEVBQUUsQ0FBQztRQUMxQyw0QkFBdUIsR0FBcUIsRUFBRSxDQUFDO1FBQy9DLHNCQUFpQixHQUFxQixFQUFFLENBQUM7UUFDekMsZ0JBQVcsR0FBRyxJQUFJLDRDQUFJLEVBQUUsQ0FBQztRQUN6QixjQUFTLEdBQTBCLEVBQUUsQ0FBQztRQUN0QyxzQkFBaUIsR0FBd0Isc0ZBQXVCLENBQUMsdUJBQXVCLENBQUM7UUFDekYsb0RBQStDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELHlEQUFvRCxHQUFHLENBQUMsQ0FBQztRQUN6RCx1QkFBa0IsR0FBa0IsRUFBRSxDQUFDO1FBRS9DOzs7Ozs7O1dBT0c7UUFDSSwyQkFBc0IsR0FBVSxDQUFDLENBQUM7UUFFakMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFtQnhCLG1DQUE4QixHQUFHLENBQUMsQ0FBQztRQU16QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxHQUFHO0lBQ0gsR0FBRztJQUNILGtCQUFrQjtJQUNsQixHQUFHO0lBQ0gsR0FBRztJQUVJLFVBQVUsQ0FBQyxLQUFZO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sd0JBQXdCLENBQUMsWUFBbUI7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ3ZDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FDdkQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELHNCQUFzQixDQUFDLGFBQTRCO1FBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRDs7O09BR0c7SUFDSSxZQUFZLENBQUMsU0FBb0I7UUFDdEMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5QixJQUNFLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSTtZQUMxQixDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQ3BFLENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVPLGVBQWUsQ0FBQyxVQUF1QjtRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0I7UUFDckIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxzQkFBc0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVNLGNBQWMsQ0FBQyxDQUFTO1FBQzdCLGlDQUFpQztRQUNqQyxvQ0FBb0M7UUFDcEMsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJO0lBQ04sQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSx1QkFBdUIsR0FBRyxzRkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRXJGLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLHNGQUF1QixDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0UsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDbkQsb0RBQW9EO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNoRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMvRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDckIsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ25FLElBQUksVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN2QixVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ2xELENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxHQUFHO0lBQ0gsZ0NBQWdDO0lBQ2hDLEdBQUc7SUFFSDs7O09BR0c7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSx1QkFBdUIsR0FBRyxzRkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3JGLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLHNGQUF1QixDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0UsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLHNGQUF1QixDQUFDLHVCQUF1QixDQUFDO1lBRXpFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFNBQVM7UUFDZCxNQUFNLHVCQUF1QixHQUFHLHNGQUF1QixDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFckYsd0JBQXdCO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLGFBQThCLENBQUM7WUFDL0QsSUFBSSx5Q0FBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxpREFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO2dCQUNoRSxTQUFTO1lBQ1gsQ0FBQztZQUVELElBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssc0ZBQXVCLENBQUMsdUJBQXVCO2dCQUNyRSxhQUFhLENBQUMsU0FBUyxLQUFLLHNGQUF1QixDQUFDLHVCQUF1QixFQUMzRSxDQUFDO2dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsdUJBQXVCLENBQUMsaUJBQWlCLEVBQUcsQ0FBQztnQkFDakUsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFFRCx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FDN0MsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLENBQUMsaUJBQWlCLENBQ3ZCLENBQUM7UUFDSixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxzRkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxTQUFTO1FBQ2QsTUFBTSx1QkFBdUIsR0FBRyxzRkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3JGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9DLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLHNGQUF1QixDQUFDLHVCQUF1QixDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0lBRU0sT0FBTyxDQUNaLGVBQXlCLEVBQ3pCLGdCQUEwQixFQUMxQixZQUFZLEdBQUcsQ0FBQzs7UUFFaEIsSUFBSSwrQkFBcUQsQ0FBQztRQUMxRCxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzlCLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsSUFBSSxFQUNKLElBQUksRUFDSixZQUFZLEVBQ1osSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztZQUNGLElBQUkseUNBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGFBQU0sQ0FBQyxJQUFJLDBDQUFFLENBQUMsSUFBRyxjQUFjLEVBQUUsQ0FBQztnQkFDL0QsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMvQiwrQkFBK0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQztnQkFDeEQsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLHlDQUFFLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLEVBQUUsQ0FBQztZQUNoRCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxJQUFJO2dCQUNaLElBQUksRUFBRTtvQkFDSixDQUFDLEVBQUUsY0FBYztvQkFDakIsQ0FBQztvQkFDRCxDQUFDO29CQUNELFFBQVEsRUFBRSwrQkFBK0I7aUJBQzFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTztnQkFDTCxNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsYUFBYTtJQUNiLEdBQUc7SUFDSCxHQUFHO0lBRUgsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN0QyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxXQUFXLENBQUMsb0VBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksNEJBQTRCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksSUFBSTtRQUNOLElBQ0UsSUFBSSxDQUFDLDhCQUE4QixLQUFLLElBQUksQ0FBQywrQ0FBK0MsRUFDNUYsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLCtDQUErQyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztRQUM3RixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDakMsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCxpQkFBaUI7SUFDakIsR0FBRztJQUNILEdBQUc7SUFFSCxHQUFHO0lBQ0gsR0FBRztJQUNILG1CQUFtQjtJQUNuQixHQUFHO0lBQ0gsR0FBRztJQUVLLHFCQUFxQjtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUMvQyxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBRSxDQUFDO2dCQUM3RCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO2dCQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3RDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUUsQ0FBQyxDQUFDO2dCQUM1RixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxxREFBcUQ7WUFDckQsdURBQXVEO1lBQ3ZELG9FQUFvRTtZQUNwRSx1REFBdUQ7WUFDdkQsK0NBQStDO1lBQy9DLDJGQUEyRjtZQUMzRixRQUFRO1lBQ1IsUUFBUTtZQUNSLE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyx5RUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRixJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNELFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyx5RUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLHlFQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25GLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV2RixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQztnQkFFbEQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsMEJBQTBCO2dCQUNoRCxJQUNFLFNBQVMsQ0FBQyxhQUFhLEtBQUsscUVBQWEsQ0FBQyxhQUFhO29CQUN2RCxTQUFTLENBQUMsYUFBYSxLQUFLLHFFQUFhLENBQUMsV0FBVyxFQUNyRCxDQUFDO29CQUNELFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ25CLENBQUM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLDhEQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsaUJBQWlCLENBQUMsNkRBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFbkYsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0saUJBQWlCLEdBQUcsTUFBTTtxQkFDN0IsY0FBYyxDQUFDO29CQUNkLGdCQUFnQixFQUFFLHdCQUF3QjtvQkFDMUMsVUFBVSxFQUFFLENBQUM7aUJBQ2QsQ0FBQztxQkFDRCxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxlQUFlLEdBQUcsaUJBQWlCO3FCQUN0QyxZQUFZLENBQUM7b0JBQ1osZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtvQkFDckMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztvQkFDbEMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLFlBQVk7aUJBQ3JDLENBQUM7cUJBQ0QsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7b0JBQzlELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztvQkFDbEUsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztvQkFDN0QsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7b0JBQ2pFLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztvQkFFN0QsSUFBSSxDQUFDLHlCQUF5QixDQUM1QixDQUFDLEVBQ0QsSUFBSSxFQUNKLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsS0FBSyxFQUNMLGVBQWUsRUFDZixlQUFlLENBQ2hCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsZUFBZSxFQUFFLHlFQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0sseUJBQXlCLENBQy9CLENBQVEsRUFDUixJQUFhLEVBQ2IsSUFBYSxFQUNiLElBQWEsRUFDYixHQUFZLEVBQ1osR0FBWSxFQUNaLEdBQVksRUFDWixLQUFjLEVBQ2QsZUFBeUIsRUFDekIsZUFBMEI7UUFFMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUMxQyxJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxLQUFLLEVBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUMxQyxJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxLQUFLLEVBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUMxQyxJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxLQUFLLEVBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO1FBRUYsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hFLGVBQWU7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNwRSxlQUFlO1NBQ2hCLENBQUMsQ0FBQztRQUNILGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDcEUsZUFBZTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sc0JBQXNCLENBQzVCLFFBQWlCLEVBQ2pCLFFBQWlCLEVBQ2pCLFFBQWlCLEVBQ2pCLE9BQWdCLEVBQ2hCLE9BQWdCLEVBQ2hCLE9BQWdCLEVBQ2hCLFNBQWtCLEVBQ2xCLFVBQTBCO1FBRTFCLE1BQU0sR0FBRyxHQUFHO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDakUsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDakUsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDakUsQ0FBQztRQUVGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUViLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxnRUFBYyxDQUFDLFVBQVUsQ0FB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QUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUzQixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7UUFDNUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUUzQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZO1FBQzdDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2YsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNkLENBQUM7UUFDRCxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDVCxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ1QsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUVULGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUMz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QUFDLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN4RSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3hFLFFBQVE7WUFDUixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN2RSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN2RSxPQUFPO1lBQ1AsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDeEUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN4RSxRQUFRO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN4RSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN4RSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDdkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDdkUsT0FBTztZQUNQLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN6RSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3pFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3hFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDekUsQ0FBQztRQUVGLGtCQUFrQjtRQUNsQixNQUFNLE1BQU0sR0FBRyx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXRELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZELENBQUM7UUFFSixrQkFBa0I7UUFDbEIsTUFBTSxTQUFTLEdBQUc7WUFDaEIsUUFBUTtZQUNSLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEdBQUcsRUFBRSxHQUFHO1lBRVIsUUFBUTtZQUNSLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEdBQUcsRUFBRSxHQUFHO1lBRVIsUUFBUTtZQUNSLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEdBQUcsRUFBRSxHQUFHO1lBRVIsT0FBTztZQUNQLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEdBQUcsRUFBRSxHQUFHO1lBRVIsUUFBUTtZQUNSLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEdBQUcsRUFBRSxHQUFHO1lBRVIsT0FBTztZQUNQLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEdBQUcsRUFBRSxHQUFHO1NBQ1QsQ0FBQztRQUVGLGtCQUFrQjtRQUNsQixNQUFNLE9BQU8sR0FBRztZQUNkLFFBQVE7WUFDUixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDUCxRQUFRO1lBQ1IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNSLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUixRQUFRO1lBQ1IsQ0FBQyxFQUFFLENB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QUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV4RCxVQUFVO1lBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFMUQsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBRUQsVUFBVTtZQUNWLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBRyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRTFELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVELFVBQVU7WUFDVixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUUxRCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0QsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLGFBQWEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRWpELGVBQWU7UUFDZixhQUFhO1FBQ2IsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbEIsVUFBVTtZQUNWLGtCQUFrQjtZQUNsQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLFFBQVEsRUFBRSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUTtTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEZpRTtBQUUzRCxNQUFlLE1BQU8sU0FBUSxpREFBUztDQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKNEM7QUFFbUI7QUFDSTtBQUNsQztBQUlsQzs7R0FFRztBQUNJLE1BQU0sS0FBTSxTQUFRLDJDQUFNO0lBQWpDOztRQUNVLCtCQUEwQixHQUFHLGtEQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELGlDQUE0QixHQUFHLGtEQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLFlBQU8sR0FBRyxDQUFDLENBQUM7SUFxSHRCLENBQUM7SUFuSEM7O09BRUc7SUFDSSxRQUFRLENBQUMsSUFBcUI7UUFDbkMsTUFBTSxNQUFNLEdBQUcsa0RBQU8sQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQywwQkFBMEIsRUFDL0IsSUFBSSxDQUFDLDRCQUE0QixDQUNsQyxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxNQUFNLGVBQWUsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3JDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUVsRCxNQUFNLFFBQVEsR0FBRyxrREFBTyxDQUFDLFFBQVEsQ0FDL0IsSUFBSSxDQUFDLDRCQUE0QixFQUNqQyxJQUFJLENBQUMsMEJBQTBCLENBQ2hDLENBQUM7UUFDRixJQUFJLGlCQUFpQixHQUFHLGtEQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGtEQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3RDLGlCQUFpQixHQUFHLGtEQUFPLENBQUMsU0FBUyxDQUNuQyxrREFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQ3JGLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxrQkFBa0IsR0FBRyxrREFBTyxDQUFDLEdBQUcsQ0FDcEMsSUFBSSxDQUFDLDBCQUEwQixFQUMvQixrREFBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUN0RCxDQUFDO1FBRUYsSUFBSSxXQUFXLEdBQUcsa0RBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxZQUFZLEdBQUcsa0RBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsa0RBQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNoRSxXQUFXLEdBQUcsa0RBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsWUFBWSxHQUFHLGtEQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxrREFBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2hFLFdBQVcsR0FBRyxrREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxZQUFZLEdBQUcsa0RBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsa0RBQU8sQ0FBQyxRQUFRLENBQ2xDLGtEQUFPLENBQUMsU0FBUyxDQUFDLGtEQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQ2hFLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsa0RBQU8sQ0FBQyxRQUFRLENBQ25DLGtEQUFPLENBQUMsU0FBUyxDQUFDLGtEQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQ2hFLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsa0RBQU8sQ0FBQyxRQUFRLENBQ25DLGtEQUFPLENBQUMsU0FBUyxDQUFDLGtEQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQ2pFLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsa0RBQU8sQ0FBQyxRQUFRLENBQ25DLGtEQUFPLENBQUMsU0FBUyxDQUFDLGtEQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQ2pFLFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsa0RBQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkUsTUFBTSxjQUFjLEdBQUcsa0RBQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxjQUFjLEdBQUcsa0RBQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxjQUFjLEdBQUcsa0RBQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFckUsTUFBTSxHQUFHLEdBQWMsRUFBRSxDQUFDO1FBRTFCLGVBQWU7UUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDMUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekIsUUFBUTtRQUNSLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6QixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV4QixnQkFBZ0I7UUFDaEIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXhCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpCLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRWpELGFBQWE7UUFDYixNQUFNLGtCQUFrQixHQUFHLENBQUMseUVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQixVQUFVO1lBQ1Ysa0JBQWtCO1lBQ2xCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsUUFBUSxFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSW1FO0FBQ0o7QUFFOUI7QUFDVztBQVc3Qzs7R0FFRztBQUNJLE1BQU0sSUFBSyxTQUFRLDJDQUFNO0lBQzlCOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFxQjs7UUFDbkMsTUFBTSxJQUFJLEdBQUc7WUFDWCxRQUFRLEVBQUUsV0FBSyxDQUFDLFFBQVEsbUNBQUksa0RBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEQsTUFBTSxFQUFFLFdBQUssQ0FBQyxNQUFNLG1DQUFJLGtEQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELGVBQWUsRUFBRSxXQUFLLENBQUMsZUFBZSxtQ0FBSSxJQUFJO1lBQzlDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN6QixDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBRS9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbEQsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVoRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUU5QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN0UsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUM3RSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBRTdFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV2RSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVqRCxhQUFhO1FBQ2IsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbEIsVUFBVTtZQUNWLGtCQUFrQjtZQUNsQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRW1FO0FBQ0o7QUFFOUI7QUFpQmxDOzs7R0FHRztBQUNJLE1BQU0sS0FBTSxTQUFRLDJDQUFNO0lBQy9COzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFzQjs7UUFDcEMsTUFBTSxJQUFJLEdBQUc7WUFDWCxLQUFLLEVBQUUsV0FBSyxDQUFDLEtBQUssbUNBQUksQ0FBQztZQUN2QixNQUFNLEVBQUUsV0FBSyxDQUFDLE1BQU0sbUNBQUksQ0FBQztZQUN6QixLQUFLLEVBQUUsV0FBSyxDQUFDLEtBQUssbUNBQUksQ0FBQztZQUN2QixLQUFLLEVBQUUsV0FBSyxDQUFDLEtBQUssbUNBQUksQ0FBQztZQUN2QixVQUFVLEVBQUUsV0FBSyxDQUFDLFVBQVUsbUNBQUksS0FBSztZQUNyQyxzQkFBc0IsRUFBRSxXQUFLLENBQUMsc0JBQXNCLG1DQUFJLEtBQUs7WUFDN0QsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1NBQ3pCLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEQsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLHNCQUFzQixHQUFHLENBQUMsQ0FBQztZQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDWixxQkFBcUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDNUIsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBRTVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNwQixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMvQixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELGFBQWE7UUFDYixNQUFNLGtCQUFrQixHQUFHO1lBQ3pCLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDNUIseUVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRztZQUMxQix5RUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1NBQzdCLENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxxRUFBYSxDQUFDLGFBQWEsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRztZQUNqQixJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDM0IsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ3pCLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQztTQUM1QixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQixVQUFVO1lBQ1Ysa0JBQWtCO1lBQ2xCLGFBQWE7WUFDYixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUTtTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hIbUU7QUFDSjtBQUNuQjtBQUVYO0FBRVM7QUFnQjNDOztHQUVHO0FBQ0ksTUFBTSxNQUFPLFNBQVEsMkNBQU07SUFDaEM7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBdUI7O1FBQzlCLE1BQU0sSUFBSSxHQUFHO1lBQ1gsTUFBTSxFQUFFLFdBQUssQ0FBQyxNQUFNLG1DQUFJLENBQUM7WUFDekIsYUFBYSxFQUFFLFdBQUssQ0FBQyxhQUFhLG1DQUFJLEVBQUU7WUFDeEMsY0FBYyxFQUFFLFdBQUssQ0FBQyxjQUFjLG1DQUFJLEVBQUU7WUFDMUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1NBQ3pCLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVuQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxnREFBTSxDQUFDLElBQUksQ0FDVCwwR0FBMEcsQ0FDM0csQ0FBQztZQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQywyQkFBMkI7UUFDdkQsS0FBSyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUN0RSxNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7WUFDdkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWpDLEtBQUssSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ3hFLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFN0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO2dCQUMxQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztnQkFDakMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUM5QyxNQUFNLENBQUMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsTUFBTSxNQUFNLEdBQUcsa0RBQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFFRCxtQkFBbUI7UUFDbkIsZUFBZTtRQUNmLGVBQWU7UUFDZixlQUFlO1FBQ2YsZUFBZTtRQUNmLGVBQWU7UUFDZixvQkFBb0I7UUFDcEIsRUFBRTtRQUNGLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixLQUFLLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3JFLEtBQUssSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZFLE1BQU0sS0FBSyxHQUFHLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNoRSxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7Z0JBRTlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVwQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHO1lBQ3pCLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDNUIseUVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRztZQUMxQix5RUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1NBQzdCLENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxxRUFBYSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRztZQUNqQixJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDM0IsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ3pCLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQztTQUM1QixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQixVQUFVO1lBQ1Ysa0JBQWtCO1lBQ2xCLGFBQWE7WUFDYixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxSHNCO0FBQ0E7QUFDQTtBQUNFO0FBQ0Q7QUFDRDtBQUNDO0FBQ0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM0Q2xCLE1BQU0sMkNBQTJDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELE1BQU0sbUNBQW1DLEdBQUcsRUFBRSxDQUFDO0FBQy9DLE1BQU0sd0NBQXdDLEdBQUcsQ0FBQyxDQUFDO0FBRW5ELE1BQU0sd0NBQXdDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELE1BQU0sbUNBQW1DLEdBQUcsd0NBQXdDLENBQUM7QUFDckYsTUFBTSwyQ0FBMkMsR0FDdEQsd0NBQXdDLEdBQUcsbUNBQW1DLENBQUM7QUFDMUUsTUFBTSx3Q0FBd0MsR0FDbkQsd0NBQXdDO0lBQ3hDLG1DQUFtQztJQUNuQywyQ0FBMkMsQ0FBQztBQVd2QyxNQUFNLGdDQUFnQyxHQUFHLEVBQUUsQ0FBQztBQU1uRCx3REFBd0Q7QUFDeEQsdUVBQXVFO0FBQ3ZFLElBQUk7QUFDSixTQUFTLFFBQVEsQ0FDZixTQUFvQixFQUNwQixNQUE4QixFQUM5QixNQUE4QjtJQUU5QiwrQ0FBK0M7SUFDL0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLG9DQUFvQztJQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0MsQ0FBQztBQUVELGlGQUFpRjtBQUNqRix3REFBd0Q7QUFDeEQsOERBQThEO0FBQzlELElBQUk7QUFFRyxTQUFTLE9BQU8sQ0FBQyxTQUFvQjtJQUMxQyxPQUFPLENBQ0wsUUFBUSxDQUNOLFNBQVMsRUFDVCwyQ0FBMkMsRUFDM0MsMkNBQTJDLENBQzVDLEtBQUssQ0FBQyxDQUFDLFFBQVE7S0FDakIsQ0FBQztBQUNKLENBQUM7QUFFTSxTQUFTLGFBQWEsQ0FBQyxTQUFvQjtJQUNoRCxPQUFPLENBQ0wsUUFBUSxDQUNOLFNBQVMsRUFDVCwyQ0FBMkMsRUFDM0MsMkNBQTJDLENBQzVDLEtBQUssQ0FBQyxDQUFDLGNBQWM7S0FDdkIsQ0FBQztBQUNKLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEgrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDNkI7QUFDSTtBQUNmO0FBQ1I7QUFDRjtBQUVSO0FBQytDO0FBRS9FOztHQUVHO0FBQ0ksTUFBTSxTQUFVLFNBQVEseUNBQUs7SUFHbEM7OztPQUdHO0lBQ0gsWUFBWSxNQUF5QjtRQUNuQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsYUFBYTtJQUNiLEdBQUc7SUFDSCxHQUFHO0lBRUgsSUFBSSxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCxtQkFBbUI7SUFDbkIsR0FBRztJQUNILEdBQUc7SUFFSDs7O09BR0c7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsMkZBQWdCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBWSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFHLENBQUMscUNBQXFDLEdBQUcsSUFBSSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFHLENBQUMsQ0FBQztRQUVsRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBWSxDQUFDLFlBQVksRUFBRyxDQUFDO1FBQ3hELFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7UUFDOUIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUM3RCxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUI7UUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDOUIsaUJBQWlCO1lBQ2pCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRXRCLGlCQUFpQjtZQUNqQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUV0QixpQkFBaUI7WUFDakIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFdEIsaUJBQWlCO1lBQ2pCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRXRCLGlCQUFpQjtZQUNqQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUV0QixpQkFBaUI7WUFDakIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDO1lBQ2pDLE1BQU07WUFDTixJQUFJO1lBQ0osQ0FBQyxNQUFNO1lBQ1AsQ0FBQyxNQUFNO1lBQ1AsQ0FBQyxNQUFNO1lBRVAsSUFBSTtZQUNKLE1BQU07WUFDTixDQUFDLE1BQU07WUFDUCxDQUFDLE1BQU07WUFFUCxJQUFJO1lBQ0osTUFBTTtZQUNOLE1BQU07WUFDTixDQUFDLE1BQU07WUFFUCxJQUFJO1lBQ0osQ0FBQyxNQUFNO1lBQ1AsTUFBTTtZQUNOLENBQUMsTUFBTTtZQUVQLE1BQU07WUFDTixJQUFJO1lBQ0osQ0FBQyxNQUFNO1lBQ1AsQ0FBQyxNQUFNO1lBQ1AsTUFBTTtZQUVOLElBQUk7WUFDSixNQUFNO1lBQ04sQ0FBQyxNQUFNO1lBQ1AsTUFBTTtZQUVOLElBQUk7WUFDSixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFFTixJQUFJO1lBQ0osQ0FBQyxNQUFNO1lBQ1AsTUFBTTtZQUNOLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRywwREFBUyxDQUFDLGVBQWUsQ0FBQztZQUMxQyxPQUFPLEVBQUUsT0FBTztZQUNoQixrQkFBa0IsRUFBRSxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsRCxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDdkIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztTQUNuQyxDQUFDLENBQUM7UUFFSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFHLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUcsQ0FBQyxVQUFVLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUM7WUFDbEUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeksyQztBQUc4QjtBQUUxRTs7R0FFRztBQUNJLE1BQWUsS0FBTSxTQUFRLG9EQUFRO0lBYTFDOzs7T0FHRztJQUNILFlBQVksTUFBeUI7UUFDbkMsS0FBSyxFQUFFLENBQUM7UUFQQSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQVE1QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsYUFBYTtJQUNiLEdBQUc7SUFDSCxHQUFHO0lBRUgsSUFBSSxTQUFTLENBQUMsR0FBWTtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVTLFlBQVksQ0FBQyxHQUFZO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFHLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFrQlMsYUFBYTtRQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUU3RCxNQUFNLFdBQVcsR0FBRyxzRkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9FLEtBQUssTUFBTSxFQUFFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQzdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEtBQUssRUFBRSxtQkFBbUI7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUY4RTtBQUNsQjtBQUNJO0FBQ3pCO0FBQ1U7QUFFUjtBQUNWO0FBQ0E7QUFFekIsTUFBTSxVQUFXLFNBQVEseUNBQUs7SUFJbkM7OztPQUdHO0lBQ0gsWUFBWSxNQUF5QjtRQUNuQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsYUFBYTtJQUNiLEdBQUc7SUFDSCxHQUFHO0lBRUgsSUFBSSxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCxtQkFBbUI7SUFDbkIsR0FBRztJQUNILEdBQUc7SUFFSDs7O09BR0c7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsMkZBQWdCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFHLENBQUMscUNBQXFDLEdBQUcsSUFBSSxDQUFDO1FBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUVoRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBWSxDQUFDLFlBQVksRUFBRyxDQUFDO1FBQ3hELFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7UUFDL0IsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUNqRSxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFHLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDL0QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBRTdELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFHLENBQUMsVUFBVSxHQUFHLGtEQUFPLENBQUMsYUFBYSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCwwQkFBMEI7SUFDMUIsR0FBRztJQUNILEdBQUc7SUFFSyxNQUFNLENBQUMsbUJBQW1CO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDO1lBQ2pDLFNBQVM7WUFDVCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUMsSUFBSSxDQUFDLFFBQVE7WUFFZCxRQUFRO1lBQ1IsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2QsQ0FBQyxHQUFHO1lBQ0osQ0FBQztZQUNELENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHO1lBRXBCLFlBQVk7WUFDWixDQUFDLEdBQUc7WUFDSixDQUFDO1lBQ0QsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUc7WUFDcEIsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRztTQUNyQixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRywwREFBUyxDQUFDLGVBQWUsQ0FBQztZQUMxQyxrQkFBa0IsRUFBRSxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsRCxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDdkIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztTQUNuQyxDQUFDLENBQUM7UUFFSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOztBQTNIYyxtQkFBUSxHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWmlEO0FBQ2xCO0FBQ0k7QUFDekI7QUFDVTtBQUVSO0FBQ1Y7QUFDQTtBQUVoQzs7R0FFRztBQUNJLE1BQU0sWUFBYSxTQUFRLHlDQUFLO0lBR3JDOzs7T0FHRztJQUNILFlBQVksTUFBbUI7UUFDN0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxHQUFHO0lBQ0gsR0FBRztJQUNILGFBQWE7SUFDYixHQUFHO0lBQ0gsR0FBRztJQUVILElBQUksT0FBTztRQUNULElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEdBQVc7UUFDcEIsWUFBWSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUMvQixDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCxtQkFBbUI7SUFDbkIsR0FBRztJQUNILEdBQUc7SUFFSDs7O09BR0c7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsMkZBQWdCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBWSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFHLENBQUMscUNBQXFDLEdBQUcsSUFBSSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUVoRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxXQUFZLENBQUMsWUFBWSxFQUFHLENBQUM7UUFDOUQsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztRQUNqQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUcsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUcsQ0FBQyxVQUFVLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUM7WUFDbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsMEJBQTBCO0lBQzFCLEdBQUc7SUFDSCxHQUFHO0lBRUssTUFBTSxDQUFDLG1CQUFtQjtRQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQztZQUNqQyxTQUFTO1lBQ1QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVE7WUFDYixDQUFDO1lBQ0QsQ0FBQztZQUVELFNBQVM7WUFDVCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVE7WUFDYixDQUFDO1lBRUQsU0FBUztZQUNULENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVE7U0FDZCxDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQztZQUM3QixnQkFBZ0I7WUFDaEIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRWhCLGtCQUFrQjtZQUNsQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFaEIsaUJBQWlCO1lBQ2pCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRywwREFBUyxDQUFDLGVBQWUsQ0FBQztZQUMxQyxrQkFBa0IsRUFBRSxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSx5RUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDOUUsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztZQUM5QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1NBQ25DLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDOztBQTFJYyxxQkFBUSxHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmeUM7QUFDUTtBQUNBO0FBQ2I7QUFDMUI7QUFDYTtBQUNRO0FBQ0k7QUFDekI7QUFDVTtBQUNIO0FBQ0U7QUFFVTtBQUdmO0FBQ0E7QUFDQTtBQUNjO0FBQ1Y7QUFDTjtBQUNBO0FBQ1Y7QUFDUTtBQUNPO0FBQ21EO0FBQ2xFO0FBSWhDOztHQUVHO0FBQ0ksTUFBTSxVQUFXLFNBQVEsMENBQUs7SUFpRG5DOzs7T0FHRztJQUNILFlBQVksTUFBbUI7UUFDN0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBakJSLHNCQUFpQixHQUFHLG1EQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBRyxtREFBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLHdCQUFtQixHQUFHLG1EQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFLeEIsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFRMUQsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsYUFBYTtJQUNiLEdBQUc7SUFDSCxHQUFHO0lBRUgsSUFBSSxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsR0FBVztRQUNwQixVQUFVLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxHQUFZO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQztZQUM1QixJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLGdEQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsY0FBYyxHQUFHLGdEQUFNLENBQUMsY0FBYyxDQUFDO1lBQ3pDLENBQUM7WUFDRCwrREFBWSxDQUFDLFFBQVEsQ0FBQyxtRkFBZ0MsRUFBRTtnQkFDdEQ7b0JBQ0UsU0FBUyxFQUFFLCtEQUFRLENBQUMsT0FBTyxDQUFDO29CQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtvQkFDakMsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsYUFBYSxFQUFFLElBQUk7b0JBQ25CLGNBQWMsRUFBRSxjQUFjO2lCQUMvQjtnQkFDRDtvQkFDRSxTQUFTLEVBQUUsK0RBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUNqQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxhQUFhLEVBQUUsSUFBSTtvQkFDbkIsY0FBYyxFQUFFLGNBQWM7aUJBQy9CO2dCQUNEO29CQUNFLFNBQVMsRUFBRSwrREFBUSxDQUFDLEtBQUssQ0FBQztvQkFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7b0JBQy9CLE9BQU8sRUFBRSxFQUFFO29CQUNYLGFBQWEsRUFBRSxJQUFJO29CQUNuQixjQUFjLEVBQUUsY0FBYztpQkFDL0I7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLGNBQWM7b0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCO29CQUMvQixPQUFPLEVBQUUsRUFBRTtvQkFDWCxhQUFhLEVBQUUsSUFBSTtvQkFDbkIsY0FBYyxFQUFFLGNBQWM7aUJBQy9CO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2hELElBQUksVUFBVSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxVQUFVLEdBQWdCLHlEQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3BELElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDckIsVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztZQUNyRSxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDMUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLEdBQUcseURBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0YsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMvQywrREFBWSxDQUFDLFVBQVUsQ0FBQyxtRkFBZ0MsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDNUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLG1EQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ25FLFVBQVUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQ25DLENBQUM7UUFFRCwrREFBWSxDQUFDLFNBQVMsQ0FBQyxtRkFBZ0MsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUM3RCxVQUFVLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0QsVUFBVSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQy9ELENBQUM7SUFFRCxRQUFRLENBQUMsS0FBd0I7UUFDL0IsVUFBVSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELEdBQUc7SUFDSCxHQUFHO0lBQ0gsbUJBQW1CO0lBQ25CLEdBQUc7SUFDSCxHQUFHO0lBRUg7OztPQUdHO0lBQ0gsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDekIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLDJGQUFpQixFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsV0FBWSxDQUFDLGFBQWEsRUFBRyxDQUFDLHFDQUFxQyxHQUFHLElBQUksQ0FBQztRQUVoRiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRWhGLGlCQUFpQjtRQUNqQixJQUFJO1FBQ0osSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJO1FBQ0osSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJO1FBQ0osSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxXQUFXO1FBQ1gsSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFRCxXQUFXO1FBQ1gsSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFRCxXQUFXO1FBQ1gsSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLHlDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxVQUFVLENBQUMsYUFBYSxHQUFHLDJGQUFpQixFQUFFLENBQUM7UUFDakQsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUVyRixVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDNUYsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM1RiwyQkFBMkI7UUFDM0IscUJBQXFCO1FBQ3JCLDZEQUE2RDtRQUM3RCwyQkFBMkI7UUFDM0IscUJBQXFCO1FBQ3JCLDZEQUE2RDtRQUM3RCwyQkFBMkI7UUFDM0IscUJBQXFCO1FBQ3JCLDZEQUE2RDtRQUM3RCxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDOUYsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUU5RixVQUFVLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVoRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLE9BQU87UUFDYixVQUFVLENBQUMsZUFBZSxHQUFHLDJGQUFnQixFQUFFLENBQUM7UUFDaEQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RSxVQUFVLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0QsaUdBQWlHO1FBQ2pHLHFFQUFxRTtRQUNyRSwrQkFBK0I7UUFDL0IsVUFBVSxDQUFDLGlCQUFpQixHQUFHLG9FQUFjLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMxRSxVQUFVLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUN2QyxvQkFBb0IsRUFDcEIsbURBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN2QyxDQUFDO1FBQ0YsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLEtBQUssQ0FBQztRQUN6RCxVQUFVLENBQUMsYUFBYSxHQUFHLElBQUksZ0RBQUksRUFBRSxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLDBEQUFLLEVBQUUsQ0FBQztRQUM1QyxVQUFVLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1lBQ3JDLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsQ0FBQztZQUNSLEtBQUssRUFBRSxDQUFDO1lBQ1IsVUFBVSxFQUFFLElBQUk7WUFDaEIsc0JBQXNCLEVBQUUsS0FBSztZQUM3QixRQUFRLEVBQUUsVUFBVSxDQUFDLGlCQUFpQjtTQUN2QyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRSxVQUFVLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVPLE9BQU87UUFDYixVQUFVLENBQUMsZUFBZSxHQUFHLDJGQUFnQixFQUFFLENBQUM7UUFDaEQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RSxVQUFVLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0QsaUdBQWlHO1FBQ2pHLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQzVFLENBQUMsRUFDRCxDQUFDLEVBQ0QscURBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQzVCLENBQUM7UUFDRixVQUFVLENBQUMsaUJBQWlCLEdBQUcsb0VBQWMsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsNkRBQVMsQ0FBQyxLQUFLLENBQUM7UUFDekQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FDdkMsb0JBQW9CLEVBQ3BCLG1EQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdkMsQ0FBQztRQUNGLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7UUFDdEMsVUFBVSxDQUFDLGtCQUFrQixHQUFHLElBQUksMERBQUssRUFBRSxDQUFDO1FBQzVDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7WUFDckMsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLFFBQVEsRUFBRSxVQUFVLENBQUMsaUJBQWlCO1NBQ3ZDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JFLFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sT0FBTztRQUNiLFVBQVUsQ0FBQyxlQUFlLEdBQUcsMkZBQWdCLEVBQUUsQ0FBQztRQUNoRCxVQUFVLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hFLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUM3RCxpR0FBaUc7UUFDakcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FDNUUscURBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQzNCLENBQUMsRUFDRCxDQUFDLENBQ0YsQ0FBQztRQUNGLFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyxvRUFBYyxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDMUUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLEtBQUssQ0FBQztRQUN6RCxVQUFVLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUN2QyxvQkFBb0IsRUFDcEIsbURBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN2QyxDQUFDO1FBQ0YsVUFBVSxDQUFDLGFBQWEsR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztRQUN0QyxVQUFVLENBQUMsa0JBQWtCLEdBQUcsSUFBSSwwREFBSyxFQUFFLENBQUM7UUFDNUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztZQUNyQyxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsQ0FBQztZQUNSLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHNCQUFzQixFQUFFLEtBQUs7WUFDN0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUI7U0FDdkMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckUsVUFBVSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxLQUFLO1FBQ1gsVUFBVSxDQUFDLGFBQWEsR0FBRywyRkFBZ0IsRUFBRSxDQUFDO1FBQzlDLFVBQVUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRixVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksZ0RBQUksRUFBRSxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsb0VBQWMsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3hFLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUNyQyxvQkFBb0IsRUFDcEIsbURBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLGdCQUFnQixHQUFHLElBQUksd0RBQUksRUFBRSxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7WUFDbkMsV0FBVyxFQUFFLG1EQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLFFBQVEsRUFBRSxVQUFVLENBQUMsZUFBZTtTQUNyQyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNqRSxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLEtBQUs7UUFDWCxVQUFVLENBQUMsYUFBYSxHQUFHLDJGQUFnQixFQUFFLENBQUM7UUFDOUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RSxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25GLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7UUFDcEMsVUFBVSxDQUFDLGVBQWUsR0FBRyxvRUFBYyxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDeEUsVUFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ3JDLG9CQUFvQixFQUNwQixtREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3JDLENBQUM7UUFDRixVQUFVLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSx3REFBSSxFQUFFLENBQUM7UUFDekMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUNuQyxXQUFXLEVBQUUsbURBQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDN0MsUUFBUSxFQUFFLFVBQVUsQ0FBQyxlQUFlO1NBQ3JDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pFLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU8sS0FBSztRQUNYLFVBQVUsQ0FBQyxhQUFhLEdBQUcsMkZBQWdCLEVBQUUsQ0FBQztRQUM5QyxVQUFVLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztRQUNwQyxVQUFVLENBQUMsZUFBZSxHQUFHLG9FQUFjLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN4RSxVQUFVLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDckMsb0JBQW9CLEVBQ3BCLG1EQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDckMsQ0FBQztRQUNGLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHdEQUFJLEVBQUUsQ0FBQztRQUN6QyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBQ25DLFdBQVcsRUFBRSxtREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUM3QyxRQUFRLEVBQUUsVUFBVSxDQUFDLGVBQWU7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxTQUFTO1FBQ2YsVUFBVSxDQUFDLGlCQUFpQixHQUFHLDJGQUFnQixFQUFFLENBQUM7UUFDbEQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RixVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksZ0RBQUksRUFBRSxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLHdEQUFJLEVBQUUsQ0FBQztRQUM3QyxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3ZDLFdBQVcsRUFBRSxtREFBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM3QyxRQUFRLEVBQUUsVUFBVSxDQUFDLGVBQWU7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDekUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFM0UsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVPLFNBQVM7UUFDZixVQUFVLENBQUMsaUJBQWlCLEdBQUcsMkZBQWdCLEVBQUUsQ0FBQztRQUNsRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLFVBQVUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7UUFDeEMsVUFBVSxDQUFDLG9CQUFvQixHQUFHLElBQUksd0RBQUksRUFBRSxDQUFDO1FBQzdDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7WUFDdkMsV0FBVyxFQUFFLG1EQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzdDLFFBQVEsRUFBRSxVQUFVLENBQUMsZUFBZTtTQUNyQyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RSxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUzRSxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU8sU0FBUztRQUNmLFVBQVUsQ0FBQyxpQkFBaUIsR0FBRywyRkFBZ0IsRUFBRSxDQUFDO1FBQ2xELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RSxVQUFVLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsVUFBVSxDQUFDLGVBQWUsR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztRQUN4QyxVQUFVLENBQUMsb0JBQW9CLEdBQUcsSUFBSSx3REFBSSxFQUFFLENBQUM7UUFDN0MsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztZQUN2QyxXQUFXLEVBQUUsbURBQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDN0MsUUFBUSxFQUFFLFVBQVUsQ0FBQyxlQUFlO1NBQ3JDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTNFLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUcsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwRSxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFHLENBQUMsVUFBVSxHQUFHLG1EQUFPLENBQUMsYUFBYSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQzVDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksVUFBVSxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxHQUFHO0lBQ0gsR0FBRztJQUNILDBCQUEwQjtJQUMxQixHQUFHO0lBQ0gsR0FBRztJQUVLLE1BQU0sQ0FBQyxtQkFBbUI7UUFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUM7WUFDakMsU0FBUztZQUNULENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRO1lBQ2IsQ0FBQztZQUNELENBQUM7WUFFRCxTQUFTO1lBQ1QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRO1lBQ2IsQ0FBQztZQUVELFNBQVM7WUFDVCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUM7WUFDN0IsZ0JBQWdCO1lBQ2hCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUVoQixrQkFBa0I7WUFDbEIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRWhCLGlCQUFpQjtZQUNqQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDakIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxTQUFTLEdBQUcsMERBQVMsQ0FBQyxlQUFlLENBQUM7WUFDMUMsa0JBQWtCLEVBQUUsQ0FBQyx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUseUVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQzlFLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7WUFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztTQUNuQyxDQUFDLENBQUM7UUFFSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQWlCO1FBQ3ZDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixVQUFVLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDckMsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBRXJDLHlDQUF5QztRQUV6QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxtREFBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLElBQUksTUFBTSxHQUFHLHFEQUFRLENBQUMsaUJBQWlCLENBQ3JDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQzdCLENBQUM7UUFFRixJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDbkMsTUFBTSxHQUFHLHFEQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBYSxDQUFDO1FBQ2xELENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUMsTUFBTSxHQUFHLG1FQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsNERBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM5RSxpREFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUN2RSxVQUFVLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsNERBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM5RSxpREFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUN2RSxVQUFVLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsNERBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM5RSxpREFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUN2RSxVQUFVLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxHQUFpQjtRQUN2QyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFJLEdBQUcsQ0FBQyxNQUFzQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQUksR0FBRyxDQUFDLE1BQXNCLENBQUMsV0FBVyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFJLEdBQUcsQ0FBQyxNQUFzQixDQUFDLFlBQVksQ0FBQztRQUN4RCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBWSxDQUFDO1FBQ25FLE1BQU0sWUFBWSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDbkQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTyxDQUFDO1FBRWpDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLG1EQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1REFBdUQ7UUFDdkYsSUFBSSxNQUFNLEdBQUcscURBQVEsQ0FBQyxpQkFBaUIsQ0FDckMsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDN0IsQ0FBQztRQUNGLElBQUksVUFBVSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEdBQUcscURBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFhLENBQUM7UUFDbEQsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEdBQUcsbUVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsR0FBWSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEUsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxlQUFlO2lCQUN2QyxPQUFPLEVBQUU7aUJBQ1Qsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQiw0REFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5RCxpQkFBaUIsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUYsNEdBQTRHO2dCQUM1RyxpREFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCwrREFBWSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFlBQVksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsZUFBZTtpQkFDdkMsT0FBTyxFQUFFO2lCQUNULHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsNERBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUQsaUJBQWlCLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVGLDRHQUE0RztnQkFDNUcsaURBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBQ0QsK0RBQVksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxZQUFZLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDcEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLGVBQWU7aUJBQ3ZDLE9BQU8sRUFBRTtpQkFDVCx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQWEsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25CLDREQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlELGlCQUFpQixHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1Riw0R0FBNEc7Z0JBQzVHLGlEQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUNELCtEQUFZLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUcsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7UUFDNUMsTUFBTSxZQUFZLEdBQUcsbURBQU8sQ0FBQyxRQUFRLENBQ25DLG1EQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUMzRCxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUM5QixDQUFDO1FBRUYsaURBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFFckYsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsbURBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxZQUFZLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQ3BDLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE1BQU0sUUFBUSxHQUFHLHFEQUFRLENBQUMsa0JBQWtCLENBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsQ0FDekQsQ0FBQztZQUNGLE1BQU0sWUFBWSxHQUFHLHFEQUFRLENBQUMsUUFBUSxDQUNwQyxRQUFRLEVBQ1IscURBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQ3pDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLEtBQUssR0FBRyxtREFBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDcEQsS0FBSyxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxHQUFHLHFEQUFRLENBQUMsUUFBUSxDQUNuQyxxREFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFDekIscURBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQ3RCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUNwQyxDQUFDO1lBRUYsZ0RBQWdEO1lBQ2hELHlDQUF5QztZQUN6QywwQkFBMEI7WUFDMUIsa0RBQWtEO1lBQ2xELElBQUk7WUFFSixrQ0FBa0M7WUFDbEMsMkNBQTJDO1lBQzNDLGtDQUFrQztZQUNsQyxrQ0FBa0M7WUFDbEMsa0NBQWtDO1lBQ2xDLGtDQUFrQztZQUNsQyxrQ0FBa0M7WUFDbEMsa0NBQWtDO1lBQ2xDLGtDQUFrQztZQUNsQyxrQ0FBa0M7WUFDbEMsaUNBQWlDO1lBQ2pDLEtBQUs7WUFDTCx1Q0FBdUM7WUFDdkMseUNBQXlDO1lBQ3pDLDhCQUE4QjtZQUM5Qix5Q0FBeUM7WUFDekMsS0FBSztZQUNMLHlDQUF5QztZQUN6Qyx5Q0FBeUM7WUFDekMseUNBQXlDO1lBQ3pDLHlDQUF5QztZQUN6Qyx3Q0FBd0M7WUFDeEMsS0FBSztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQWlCO1FBQ3JDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixVQUFVLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUNqQywrREFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFdEMsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBaUI7UUFDdkMsTUFBTSxJQUFJLEdBQUksR0FBRyxDQUFDLE1BQXNCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNqRSxNQUFNLEtBQUssR0FBSSxHQUFHLENBQUMsTUFBc0IsQ0FBQyxXQUFXLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUksR0FBRyxDQUFDLE1BQXNCLENBQUMsWUFBWSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsTUFBTSxRQUFRLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFZLENBQUM7UUFDbkUsTUFBTSxZQUFZLEdBQUcsMEVBQW1CLENBQUMsWUFBWSxDQUNuRCwrRUFBZSxFQUNmLCtFQUFlLENBQUMsT0FBTyxDQUNPLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGFBQWE7YUFDcEMsYUFBYSxFQUFFO2FBQ2YsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFpQjtRQUN0QyxNQUFNLElBQUksR0FBSSxHQUFHLENBQUMsTUFBc0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sS0FBSyxHQUFJLEdBQUcsQ0FBQyxNQUFzQixDQUFDLFdBQVcsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBSSxHQUFHLENBQUMsTUFBc0IsQ0FBQyxZQUFZLENBQUM7UUFDeEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQVksQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBRywwRUFBbUIsQ0FBQyxZQUFZLENBQ25ELCtFQUFlLEVBQ2YsK0VBQWUsQ0FBQyxPQUFPLENBQ08sQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsYUFBYTthQUNyQyxhQUFhLEVBQUU7YUFDZixpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQWEsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLGFBQWE7YUFDckMsYUFBYSxFQUFFO2FBQ2YsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxhQUFhO2FBQ3JDLGFBQWEsRUFBRTthQUNmLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQzs7QUFydUJjLHNCQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLHNCQUFXLEdBQUcsQ0FBQyxDQUFDO0FBS2hCLHVCQUFZLEdBQTZCLE1BQU0sQ0FBQztBQUNoRCxrQkFBTyxHQUFzQixPQUFPLENBQUM7QUFFckMsbUJBQVEsR0FBRyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUV5QztBQUNMO0FBQzFCO0FBQ2E7QUFDUTtBQUNJO0FBQ3pCO0FBQ1U7QUFDSDtBQUNFO0FBRVU7QUFFZjtBQUNBO0FBQ0E7QUFDYztBQUNWO0FBQ047QUFDQTtBQUNWO0FBQ2U7QUFLZjtBQUNBO0FBRStDO0FBQ0E7QUFDdkM7QUFJeEM7O0dBRUc7QUFDSSxNQUFNLGdCQUFpQixTQUFRLDBDQUFLO0lBd0N6Qzs7O09BR0c7SUFDSCxZQUFZLE1BQW1CO1FBQzdCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQWpCUixzQkFBaUIsR0FBRyxtREFBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsbURBQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5Qix3QkFBbUIsR0FBRyxtREFBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBSXhCLHdCQUFtQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELHdCQUFtQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELHNCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBUzFELENBQUM7SUFFRCxHQUFHO0lBQ0gsR0FBRztJQUNILGFBQWE7SUFDYixHQUFHO0lBQ0gsR0FBRztJQUVILElBQUksT0FBTztRQUNULElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEdBQVc7UUFDcEIsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLEdBQVk7UUFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDO1lBQzVCLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxjQUFjLEdBQUcsZ0RBQU0sQ0FBQyxjQUFjLENBQUM7WUFDekMsQ0FBQztZQUNELCtEQUFZLENBQUMsUUFBUSxDQUFDLHlGQUFzQyxFQUFFO2dCQUM1RDtvQkFDRSxTQUFTLEVBQUUsK0RBQVEsQ0FBQyxPQUFPLENBQUM7b0JBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUNqQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxhQUFhLEVBQUUsSUFBSTtvQkFDbkIsY0FBYyxFQUFFLGNBQWM7aUJBQy9CO2dCQUNEO29CQUNFLFNBQVMsRUFBRSwrREFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQ2pDLE9BQU8sRUFBRSxFQUFFO29CQUNYLGFBQWEsRUFBRSxJQUFJO29CQUNuQixjQUFjLEVBQUUsY0FBYztpQkFDL0I7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLCtEQUFRLENBQUMsS0FBSyxDQUFDO29CQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtvQkFDL0IsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsYUFBYSxFQUFFLElBQUk7b0JBQ25CLGNBQWMsRUFBRSxjQUFjO2lCQUMvQjtnQkFDRDtvQkFDRSxTQUFTLEVBQUUsY0FBYztvQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7b0JBQy9CLE9BQU8sRUFBRSxFQUFFO29CQUNYLGFBQWEsRUFBRSxJQUFJO29CQUNuQixjQUFjLEVBQUUsY0FBYztpQkFDL0I7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUMzRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMxQyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BELElBQUksVUFBVSxHQUFnQix5REFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwRCxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDakQsQ0FBQztnQkFDRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztZQUMzRSxDQUFDO2lCQUFNLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNoRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLHlEQUFVLENBQUMsU0FBUyxDQUNoRixDQUFDLEVBQ0QsQ0FBQyxFQUNELENBQUMsRUFDRCxDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDL0MsK0RBQVksQ0FBQyxVQUFVLENBQUMseUZBQXNDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQy9ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxtREFBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUN0RSxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQ3pDLENBQUM7UUFFRCwrREFBWSxDQUFDLFNBQVMsQ0FBQyx5RkFBc0MsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ25FLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ25FLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBd0I7UUFDL0IsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCxtQkFBbUI7SUFDbkIsR0FBRztJQUNILEdBQUc7SUFFSDs7O09BR0c7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsNEZBQWlCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBWSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFHLENBQUMscUNBQXFDLEdBQUcsSUFBSSxDQUFDO1FBRWhGLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFaEYsaUJBQWlCO1FBQ2pCLElBQUk7UUFDSixJQUFJLHlDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2pELGdCQUFnQixDQUFDLGFBQWEsR0FBRyw0RkFBZ0IsRUFBRSxDQUFDO1lBQ3BELGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekYsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLElBQUksZ0RBQUksRUFBRSxDQUFDO1lBQzFDLGdCQUFnQixDQUFDLGVBQWUsR0FBRyxvRUFBYyxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDOUUsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDM0Msb0JBQW9CLEVBQ3BCLG1EQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDckMsQ0FBQztZQUNGLGdCQUFnQixDQUFDLGdCQUFnQixHQUFHLElBQUksdURBQUksRUFBRSxDQUFDO1lBQy9DLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztnQkFDekMsV0FBVyxFQUFFLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUM3QyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsZUFBZTthQUMzQyxDQUFDLENBQUM7WUFDSCxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDN0UsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBRUQsSUFBSTtRQUNKLElBQUkseUNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDakQsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLDRGQUFnQixFQUFFLENBQUM7WUFDcEQsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xGLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RixnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7WUFDMUMsZ0JBQWdCLENBQUMsZUFBZSxHQUFHLG9FQUFjLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUM5RSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUMzQyxvQkFBb0IsRUFDcEIsbURBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxDQUFDO1lBQ0YsZ0JBQWdCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSx1REFBSSxFQUFFLENBQUM7WUFDL0MsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO2dCQUN6QyxXQUFXLEVBQUUsbURBQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7Z0JBQzdDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxlQUFlO2FBQzNDLENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFFRCxJQUFJO1FBQ0osSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxnQkFBZ0IsQ0FBQyxhQUFhLEdBQUcsNEZBQWdCLEVBQUUsQ0FBQztZQUNwRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEYsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztZQUMxQyxnQkFBZ0IsQ0FBQyxlQUFlLEdBQUcsb0VBQWMsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQzlFLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQzNDLG9CQUFvQixFQUNwQixtREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3JDLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHVEQUFJLEVBQUUsQ0FBQztZQUMvQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7Z0JBQ3pDLFdBQVcsRUFBRSxtREFBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsUUFBUSxFQUFFLGdCQUFnQixDQUFDLGVBQWU7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdFLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUVELFdBQVc7UUFDWCxJQUFJLHlDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ25ELGdCQUFnQixDQUFDLGVBQWUsR0FBRyw0RkFBZ0IsRUFBRSxDQUFDO1lBQ3RELGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNuRSxpR0FBaUc7WUFDakcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDLGdCQUFnQixHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUNsRixxREFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFDM0IsQ0FBQyxFQUNELENBQUMsQ0FDRixDQUFDO1lBQ0YsZ0JBQWdCLENBQUMsaUJBQWlCLEdBQUcsb0VBQWMsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2hGLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLEtBQUssQ0FBQztZQUMvRCxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQzdDLG9CQUFvQixFQUNwQixtREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3ZDLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxhQUFhLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7WUFDNUMsZ0JBQWdCLENBQUMsa0JBQWtCLEdBQUcsSUFBSSx5REFBSyxFQUFFLENBQUM7WUFDbEQsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO2dCQUMzQyxLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLEVBQUUsQ0FBQztnQkFDUixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsc0JBQXNCLEVBQUUsS0FBSztnQkFDN0IsUUFBUSxFQUFFLGdCQUFnQixDQUFDLGlCQUFpQjthQUM3QyxDQUFDLENBQUM7WUFDSCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakYsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQsV0FBVztRQUNYLElBQUkseUNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsZ0JBQWdCLENBQUMsZUFBZSxHQUFHLDRGQUFnQixFQUFFLENBQUM7WUFDdEQsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BGLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ25FLGlHQUFpRztZQUNqRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQ2xGLENBQUMsRUFDRCxDQUFDLEVBQ0QscURBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQzVCLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxpQkFBaUIsR0FBRyxvRUFBYyxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDaEYsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxHQUFHLDZEQUFTLENBQUMsS0FBSyxDQUFDO1lBQy9ELGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FDN0Msb0JBQW9CLEVBQ3BCLG1EQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdkMsQ0FBQztZQUNGLGdCQUFnQixDQUFDLGFBQWEsR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLHlEQUFLLEVBQUUsQ0FBQztZQUNsRCxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7Z0JBQzNDLEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxDQUFDO2dCQUNSLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixzQkFBc0IsRUFBRSxLQUFLO2dCQUM3QixRQUFRLEVBQUUsZ0JBQWdCLENBQUMsaUJBQWlCO2FBQzdDLENBQUMsQ0FBQztZQUNILGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNqRixnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxXQUFXO1FBQ1gsSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxnQkFBZ0IsQ0FBQyxlQUFlLEdBQUcsNEZBQWdCLEVBQUUsQ0FBQztZQUN0RCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEYsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbkUsK0JBQStCO1lBQy9CLGdCQUFnQixDQUFDLGlCQUFpQixHQUFHLG9FQUFjLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNoRixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQzdDLG9CQUFvQixFQUNwQixtREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3ZDLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsNkRBQVMsQ0FBQyxLQUFLLENBQUM7WUFDL0QsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLElBQUksZ0RBQUksRUFBRSxDQUFDO1lBQzVDLGdCQUFnQixDQUFDLGtCQUFrQixHQUFHLElBQUkseURBQUssRUFBRSxDQUFDO1lBQ2xELGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztnQkFDM0MsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHNCQUFzQixFQUFFLEtBQUs7Z0JBQzdCLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxpQkFBaUI7YUFDN0MsQ0FBQyxDQUFDO1lBQ0gsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pGLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELElBQUkseUNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDakQsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLDRGQUFpQixFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRTNGLGdCQUFnQixDQUFDLGFBQWE7YUFDM0IsYUFBYSxFQUFFO2FBQ2YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzVELGdCQUFnQixDQUFDLGFBQWE7YUFDM0IsYUFBYSxFQUFFO2FBQ2YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzVELGdCQUFnQixDQUFDLGFBQWE7YUFDM0IsYUFBYSxFQUFFO2FBQ2YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzVELGdCQUFnQixDQUFDLGFBQWE7YUFDM0IsYUFBYSxFQUFFO2FBQ2YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzlELGdCQUFnQixDQUFDLGFBQWE7YUFDM0IsYUFBYSxFQUFFO2FBQ2YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzlELGdCQUFnQixDQUFDLGFBQWE7YUFDM0IsYUFBYSxFQUFFO2FBQ2YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRTFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFHLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUcsQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEUsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRyxDQUFDLFVBQVUsR0FBRyxtREFBTyxDQUFDLGFBQWEsQ0FBQztZQUNsRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUM1QyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRztJQUNILEdBQUc7SUFDSCwwQkFBMEI7SUFDMUIsR0FBRztJQUNILEdBQUc7SUFFSyxNQUFNLENBQUMsbUJBQW1CO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDO1lBQ2pDLFNBQVM7WUFDVCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUTtZQUNiLENBQUM7WUFDRCxDQUFDO1lBRUQsU0FBUztZQUNULENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUTtZQUNiLENBQUM7WUFFRCxTQUFTO1lBQ1QsQ0FBQztZQUNELENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQztZQUNELENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUTtTQUNkLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDO1lBQzdCLGdCQUFnQjtZQUNoQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFaEIsa0JBQWtCO1lBQ2xCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUVoQixpQkFBaUI7WUFDakIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLDBEQUFTLENBQUMsZUFBZSxDQUFDO1lBQzFDLGtCQUFrQixFQUFFLENBQUMseUVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLHlFQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUM5RSxVQUFVLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO1lBQzlCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxHQUFpQjtRQUN2QyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDM0MsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFFM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDcEQsSUFBSSxXQUFXLEdBQUcscURBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLG1EQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1REFBdUQ7UUFDdkYsSUFBSSxNQUFNLEdBQUcscURBQVEsQ0FBQyxpQkFBaUIsQ0FDckMsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDN0IsQ0FBQztRQUVGLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLE1BQU0sR0FBRyxxREFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQWEsQ0FBQztRQUNsRCxDQUFDO2FBQU0sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEQsTUFBTSxHQUFHLG1FQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQiw0REFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLGlEQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLGdCQUFnQixDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLDREQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUUsaURBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDdkUsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsNERBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM5RSxpREFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUN2RSxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQWlCO1FBQ3ZDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQixJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUksR0FBRyxDQUFDLE1BQXNCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNqRSxNQUFNLEtBQUssR0FBSSxHQUFHLENBQUMsTUFBc0IsQ0FBQyxXQUFXLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUksR0FBRyxDQUFDLE1BQXNCLENBQUMsWUFBWSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsTUFBTSxRQUFRLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFZLENBQUM7UUFDbkUsTUFBTSxZQUFZLEdBQUcsMEVBQW1CLENBQUMsWUFBWSxDQUNuRCwrRUFBZSxFQUNmLCtFQUFlLENBQUMsT0FBTyxDQUNPLENBQUM7UUFFakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDcEQsSUFBSSxXQUFXLEdBQUcscURBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLG1EQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxNQUFNLEdBQUcscURBQVEsQ0FBQyxpQkFBaUIsQ0FDckMsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDN0IsQ0FBQztRQUNGLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLE1BQU0sR0FBRyxxREFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQWEsQ0FBQztRQUNsRCxDQUFDO2FBQU0sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEQsTUFBTSxHQUFHLG1FQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksaUJBQWlCLEdBQVksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hFLElBQUksZ0JBQWdCLENBQUMsWUFBWSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLGVBQWU7aUJBQzdDLE9BQU8sRUFBRTtpQkFDVCx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQWEsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25CLDREQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlELGlCQUFpQixHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1Rix3RUFBd0U7WUFDMUUsQ0FBQztZQUNELCtEQUFZLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsZUFBZTtpQkFDN0MsT0FBTyxFQUFFO2lCQUNULHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsNERBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUQsaUJBQWlCLEdBQUcsbURBQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVGLHdFQUF3RTtZQUMxRSxDQUFDO1lBQ0QsK0RBQVksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLGdCQUFnQixDQUFDLFlBQVksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMxQyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlO2lCQUM3QyxPQUFPLEVBQUU7aUJBQ1Qsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQiw0REFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5RCxpQkFBaUIsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUYsd0VBQXdFO1lBQzFFLENBQUM7WUFDRCwrREFBWSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLG1EQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWpGLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBRUQsaURBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFFckYsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxtREFBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3BELElBQUksV0FBVyxHQUFHLHFEQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEMsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNyQixXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsbURBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQixJQUFJLE1BQU0sR0FBRyxxREFBUSxDQUFDLGlCQUFpQixDQUNyQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUM1QixRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQzVCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFDNUIsUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUM3QixDQUFDO1lBQ0YsTUFBTSxHQUFHLHFEQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBYSxDQUFDO1lBQ2hELE1BQU0saUJBQWlCLEdBQUcsbURBQU8sQ0FBQyxHQUFHLENBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FDcEMsQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsR0FBaUI7UUFDckMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLGdCQUFnQixDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDdkMsK0RBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRXRDLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQWlCO1FBQ3ZDLE1BQU0sSUFBSSxHQUFJLEdBQUcsQ0FBQyxNQUFzQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQUksR0FBRyxDQUFDLE1BQXNCLENBQUMsV0FBVyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFJLEdBQUcsQ0FBQyxNQUFzQixDQUFDLFlBQVksQ0FBQztRQUN4RCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBWSxDQUFDO1FBQ25FLE1BQU0sWUFBWSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDbkQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWE7YUFDMUMsYUFBYSxFQUFFO2FBQ2YsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFpQjtRQUN0QyxNQUFNLElBQUksR0FBSSxHQUFHLENBQUMsTUFBc0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sS0FBSyxHQUFJLEdBQUcsQ0FBQyxNQUFzQixDQUFDLFdBQVcsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBSSxHQUFHLENBQUMsTUFBc0IsQ0FBQyxZQUFZLENBQUM7UUFDeEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxtREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQVksQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBRywwRUFBbUIsQ0FBQyxZQUFZLENBQ25ELCtFQUFlLEVBQ2YsK0VBQWUsQ0FBQyxPQUFPLENBQ08sQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhO2FBQzNDLE9BQU8sRUFBRTthQUNULHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhO2FBQzNDLE9BQU8sRUFBRTthQUNULHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhO2FBQzNDLE9BQU8sRUFBRTthQUNULHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQzs7QUEvbkJjLDRCQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLDRCQUFXLEdBQUcsQ0FBQyxDQUFDO0FBS2hCLDZCQUFZLEdBQTZCLE1BQU0sQ0FBQztBQUNoRCx3QkFBTyxHQUFzQixPQUFPLENBQUM7QUFNckMseUJBQVEsR0FBRyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdFRjtBQUNKO0FBQ087QUFDRjtBQUNBO0FBQ007Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMeUI7QUFpQm1CO0FBQ3hCO0FBZWhELFNBQVMsMkJBQTJCO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLDJGQUFpQixFQUFFLENBQUM7SUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxvRUFBZ0IsQ0FBQyw4QkFBOEIsQ0FDMUUsK0RBQXNCLENBQUMsaUJBQWlCLEVBQ3hDLE1BQU0sQ0FDUyxDQUFDO0lBQ2xCLE1BQU0scUJBQXFCLEdBQUcsb0VBQWdCLENBQUMsOEJBQThCLENBQzNFLCtEQUFzQixDQUFDLGtCQUFrQixFQUN6QyxvQkFBb0IsQ0FDa0IsQ0FBQztJQUV6QyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBRXZELE9BQU8scUJBQXFCLENBQUM7QUFDL0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0NpRDtBQUVJO0FBQ0E7QUFFVjtBQUVGO0FBR1U7QUFFVjtBQUVtQjtBQUU3RCxTQUFTLHFCQUFxQixDQUFDLEVBQzdCLGNBQWMsRUFDZCxVQUFVLEVBQUUsRUFDVixrQkFBa0IsR0FBRyxHQUFHLEVBQ3hCLDhCQUE4QixHQUFHLENBQUMsRUFDbEMsa0JBQWtCLEdBQUcsRUFBRSxFQUN2QixnQkFBZ0IsR0FBRyxFQUFFLEVBQ3JCLHFCQUFxQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDdEQscUZBQXFGO0VBQ3RGLEdBVUY7SUFJQyxvQ0FBb0M7SUFDcEMsTUFBTSw2QkFBNkIsR0FBRyxtQ0FBbUMsQ0FDdkUsY0FBYyxFQUNkLGtCQUFrQixDQUNuQixDQUFDO0lBRUYsc0NBQXNDO0lBQ3RDLE1BQU0sZ0NBQWdDLEdBQUcsc0NBQXNDLENBQzdFLDZCQUE2QixFQUM3Qiw4QkFBOEIsRUFDOUIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixjQUFjLENBQUMsS0FBSyxFQUNwQixjQUFjLENBQUMsTUFBTSxDQUN0QixDQUFDO0lBRUYsMkJBQTJCO0lBQzNCLE1BQU0seUJBQXlCLEdBQUcsK0JBQStCLENBQy9ELGNBQWMsRUFDZCxnQ0FBZ0MsRUFDaEMscUJBQXFCLENBQ3RCLENBQUM7SUFFRixtQkFBbUI7SUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSw0REFBVSxFQUFFLENBQUM7SUFDcEMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6Qiw2QkFBNkI7UUFDN0IsR0FBRyxnQ0FBZ0M7UUFDbkMseUJBQXlCO0tBQzFCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxlQUFlLEVBQUUsVUFBVTtRQUMzQixtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQyxjQUFjLEVBQUc7YUFDN0QsZ0JBQWdCLENBQUMsQ0FBQyxDQUF3QjtLQUM5QyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsbUNBQW1DLENBQUMsT0FBd0IsRUFBRSxrQkFBMEI7SUFDL0YsTUFBTSwyQkFBMkIsR0FBRywyREFBYyxDQUFDLGlDQUFpQyxDQUNsRixFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUN6QixPQUFPLENBQ1IsQ0FBQztJQUNGLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ25GLDRDQUE0QztJQUM1Qyx3REFBd0Q7SUFDeEQsb0JBQW9CO0lBQ3BCLEtBQUs7SUFFTCxNQUFNLDZCQUE2QixHQUFHLCtEQUFnQixDQUFDLDBCQUEwQixDQUMvRSwyQkFBMkIsQ0FDNUIsQ0FBQztJQUNGLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXhGLE1BQU0sOEJBQThCLEdBQUcsK0RBQWdCLENBQUMsaUJBQWlCLENBQUM7UUFDeEUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixVQUFVLEVBQUUsQ0FBQztRQUNiLGNBQWMsRUFBRSxDQUFDLHFFQUFhLENBQUMsS0FBSyxDQUFDO1FBQ3JDLGlCQUFpQixFQUFFLEtBQUs7S0FDekIsQ0FBQyxDQUFDO0lBRUgsNkJBQTZCLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDN0UsT0FBTyw2QkFBNkIsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBUyxzQ0FBc0MsQ0FDN0MsdUJBQW1DLEVBQ25DLDhCQUFzQyxFQUN0QyxrQkFBMEIsRUFDMUIsZ0JBQXdCLEVBQ3hCLGtCQUEwQixFQUMxQixtQkFBMkI7SUFFM0IsTUFBTSxZQUFZLEdBQWlCLEVBQUUsQ0FBQztJQUV0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsOEJBQThCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXpFLElBQUksZUFBZSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ1osZUFBZSxHQUFHLDRCQUE0QixDQUM1Qyx1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osbUJBQW1CLEVBQ25CLG9CQUFvQixDQUNyQixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsNEJBQTRCLENBQzVDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNyQyxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLElBQUksRUFDSixtQkFBbUIsRUFDbkIsb0JBQW9CLENBQ3JCLENBQUM7UUFDSixDQUFDO1FBQ0QsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUNuRCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixDQUNyQixDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRW5FLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUNuQyxvQkFBZ0MsRUFDaEMsa0JBQTBCLEVBQzFCLGdCQUF3QixFQUN4QixZQUFxQixFQUNyQixtQkFBMkIsRUFDM0Isb0JBQTRCO0lBRTVCLE1BQU0sUUFBUSxHQUFHLDJEQUFjLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUU3RCxNQUFNLHlCQUF5QixHQUFHLG9EQUFRLENBQUMsNkNBQTZDLENBQUM7UUFDdkYsVUFBVSxFQUFFLGtCQUFrQjtRQUM5QixRQUFRLEVBQUUsZ0JBQWdCO0tBQzNCLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNoRSxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLGtEQUFPLENBQUMsSUFBSSxZQUFZLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsUUFBUSxDQUFDLFlBQVksQ0FDbkIsaUJBQWlCLEVBQ2pCLGtEQUFPLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixDQUFDLENBQzdELENBQUM7SUFFRixJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMzQixRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUcsQ0FBQztJQUNqRSxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQXdCLENBQUM7SUFDbkYsTUFBTSxVQUFVLEdBQUcsK0RBQWdCLENBQUMsOENBQThDLENBQ2hGLFFBQVEsRUFDUixhQUFhLENBQ2QsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLCtEQUFnQixDQUFDLGlCQUFpQixDQUFDO1FBQ3JELEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsTUFBTSxFQUFFLG9CQUFvQjtRQUM1QixVQUFVLEVBQUUsQ0FBQztRQUNiLGNBQWMsRUFBRSxDQUFDLHFFQUFhLENBQUMsS0FBSyxDQUFDO1FBQ3JDLGlCQUFpQixFQUFFLEtBQUs7S0FDekIsQ0FBQyxDQUFDO0lBQ0gsVUFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV2QyxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBUywrQkFBK0IsQ0FDdEMsT0FBd0IsRUFDeEIsZ0NBQThDLEVBQzlDLHFCQUF1RTtJQUV2RSxNQUFNLGtCQUFrQixHQUFHLENBQUMsT0FBTyxDQUFzQixDQUFDLENBQUMsbUJBQW1CO0lBQzlFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQ0FBZ0MsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BFLGtCQUFrQixDQUFDLElBQUksQ0FDckIsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFHLENBQUMsbUJBQW1CO2FBQ3RFLGdCQUFnQixDQUFDLENBQUMsQ0FBK0IsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLDBCQUEwQixHQUFHLDJEQUFjLENBQUMsMkJBQTJCLENBQzNFO1FBQ0Usa0JBQWtCLEVBQUUsQ0FBQztLQUN0QixFQUNELGtCQUFrQixDQUNuQixDQUFDO0lBQ0YsMEJBQTBCLENBQUMsWUFBWSxDQUFDLHVCQUF1QixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDeEYsTUFBTSx5QkFBeUIsR0FBRywrREFBZ0IsQ0FBQywwQkFBMEIsQ0FDM0UsMEJBQTBCLENBQzNCLENBQUM7SUFDRix5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRixNQUFNLDJCQUEyQixHQUFHLCtEQUFnQixDQUFDLGlCQUFpQixDQUFDO1FBQ3JFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsVUFBVSxFQUFFLENBQUM7UUFDYixjQUFjLEVBQUUsQ0FBQyxxRUFBYSxDQUFDLGNBQWMsQ0FBQztRQUM5QyxpQkFBaUIsRUFBRSxLQUFLO0tBQ3pCLENBQUMsQ0FBQztJQUNILHlCQUF5QixDQUFDLGNBQWMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBRXRFLE9BQU8seUJBQXlCLENBQUM7QUFDbkMsQ0FBQztBQUVNLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QyxxQkFBcUI7Q0FDdEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvT3FDO0FBSXNEO0FBQ3NCO0FBQ2Q7QUFDcEI7QUFDRTtBQUV6QjtBQUVtQztBQUNnQjtBQUNvQjtBQUNoQjtBQUM5QjtBQUNnRDtBQU12RTtBQUNJO0FBQ1Y7QUFDYjtBQUV5RTtBQUNFO0FBQ0s7QUFDRTtBQUNyQjtBQUNFO0FBQ0s7QUFDRTtBQUNlO0FBQ0U7QUFDSztBQUNFO0FBQ2xCO0FBQ0U7QUFDQztBQUNFO0FBQ0s7QUFDRTtBQUNqQjtBQUNFO0FBQ0k7QUFDRTtBQUNBO0FBQ0U7QUFDakI7QUFDRTtBQUNLO0FBQ0U7QUFDWTtBQUNFO0FBQ3ZEO0FBRTVCO0FBT0w7QUFDNkU7QUFDRTtBQUNLO0FBQ0U7QUFDb0M7QUFDRTtBQUMvQztBQUNFO0FBQ1U7QUFDRTtBQUNwQjtBQUNFO0FBQ1U7QUFDRTtBQUN0RjtBQUMyQjtBQUN6QjtBQUNVO0FBRXBELFNBQVMsY0FBYyxDQUNyQixZQUFvQixFQUNwQixZQUFxQyxFQUNyQyxrQkFBMEI7SUFFMUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLEdBQUcsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDdkQsTUFBTSxHQUFHLG1GQUFrQixDQUFDLDhCQUE4QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osbUZBQWtCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLGtCQUFtQixDQUFDLENBQUM7WUFDM0YsTUFBTSxRQUFRLEdBQUcsbUZBQWtCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUMsUUFBUSxNQUFNLEVBQUU7SUFFakIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFJRCxJQUFJLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0FBQ2xFLFNBQVMsdUJBQXVCLENBQzlCLFlBQW9CLEVBQ3BCLGVBQXlCLEVBQ3pCLFlBQXFDLEVBQ3JDLGtCQUF5QjtJQUV6QixJQUFJLFFBQVEsR0FBRyxlQUFlLENBQUM7SUFDL0IsSUFBSSxtRkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNwRSxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixXQUFXLEdBQUcsZUFBZSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLFlBQVksR0FBRyxNQUFNLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDaEUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsRCxtRkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUMxRixRQUFRLEdBQUcsbUZBQWtCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9FLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsWUFBb0IsRUFDcEIsWUFBcUMsRUFDckMsa0JBQTBCO0lBRTFCLG1GQUFrQixDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQW1CLENBQUMsQ0FBQztJQUUxRixNQUFNLFFBQVEsR0FBRyxtRkFBa0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQy9FLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEVBQzdCLGNBQWMsR0FBRyxFQUFFLEVBQ25CLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFdBQVcsR0FBRyxLQUFLLEVBQ25CLGNBQWMsR0FBRyxLQUFLLEVBQ3RCLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLE9BQU8sR0FBRyxLQUFLLEVBQ2YsVUFBVSxHQUFHLEtBQUssRUFDbEIsYUFBYSxHQUFHLEtBQUssRUFDckIsWUFBWSxHQUFHLEtBQUssRUFDcEIsUUFBUSxHQUFHLEtBQUssRUFDaEIsbUJBQW1CLEdBQUcsS0FBSyxFQUMzQixnQkFBZ0IsR0FBRyxJQUFJLEVBQ3ZCLGtCQUFrQixHQUFHLGdEQUFNLENBQUMsOEJBQThCLEdBQzNELEdBQUcsRUFBRTtJQUNKLE1BQU0sWUFBWSxHQUNoQixTQUFTO1FBQ1QsSUFBSSxjQUFjLEdBQUc7UUFDckIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDL0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25DLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTdDLElBQUksNEJBQTRCLEdBQTBCLEVBQUUsQ0FBQztJQUM3RCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsNEJBQTRCLEdBQUc7WUFDN0I7Z0JBQ0UsUUFBUSxFQUFFLGdDQUFnQztnQkFDMUMsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsV0FBVztnQkFDNUMsV0FBVyxFQUFFLGdEQUFNLENBQUMsNEJBQTRCO2dCQUNoRCxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxZQUFZO2dCQUM5QixpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixTQUFTLEVBQUUsSUFBSTtnQkFDZixZQUFZLEVBQUUsSUFBSSxtREFBTyxDQUFDLElBQUksVUFBVSxDQUFDLGdEQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDOUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDckIsNEJBQTRCLEVBQUUsSUFBSTthQUNuQztZQUNEO2dCQUNFLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxXQUFXO2dCQUM1QyxXQUFXLEVBQUUsZ0RBQU0sQ0FBQyw0QkFBNEI7Z0JBQ2hELEtBQUssRUFBRSxnRUFBVSxDQUFDLFlBQVk7Z0JBQzlCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsSUFBSSxZQUFZLENBQUMsZ0RBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUNoRixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUNyQiw0QkFBNEIsRUFBRSxJQUFJO2FBQ25DO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHVEQUFPLENBQUM7UUFDMUIsU0FBUyxFQUFFLDJEQUFnQixDQUFDLE1BQU07UUFDbEMsU0FBUyxFQUFFLDJEQUFnQixDQUFDLE1BQU07UUFDbEMsS0FBSyxFQUFFLDJEQUFnQixDQUFDLFdBQVc7UUFDbkMsS0FBSyxFQUFFLDJEQUFnQixDQUFDLFdBQVc7S0FDcEMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxTQUFTO1lBQzFDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsNkVBQWlCLEVBQUUsT0FBTyxDQUFDO1lBQzVELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQ3RCLENBQUMsQ0FBQztRQUNILDRCQUE0QixDQUFDLElBQUksQ0FBQztZQUNoQyxRQUFRLEVBQUUsMkJBQTJCO1lBQ3JDLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZFQUFpQixFQUFFLE9BQU8sQ0FBQztZQUM1RCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUN0QixDQUFDLENBQUM7UUFDSCw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7WUFDaEMsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSw0RUFBZ0IsRUFBRSxPQUFPLENBQUM7WUFDM0QsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkIsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxTQUFTO1lBQzFDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsNkVBQWlCLEVBQUUsT0FBTyxDQUFDO1lBQzVELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQ3RCLENBQUMsQ0FBQztRQUNILDRCQUE0QixDQUFDLElBQUksQ0FBQztZQUNoQyxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZFQUFpQixFQUFFLE9BQU8sQ0FBQztZQUM1RCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLDRCQUE0QixDQUFDLElBQUksQ0FBQztZQUNoQyxRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZFQUFpQixFQUFFLE9BQU8sQ0FBQztZQUM1RCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLDRCQUE0QixDQUFDLElBQUksQ0FBQztZQUNoQyxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZFQUFpQixFQUFFLE9BQU8sQ0FBQztZQUM1RCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUN0QixDQUFDLENBQUM7UUFDSCw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7WUFDaEMsUUFBUSxFQUFFLHVCQUF1QjtZQUNqQyxhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSw2RUFBaUIsRUFBRSxPQUFPLENBQUM7WUFDNUQsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxTQUFTO1lBQzFDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsMkVBQWUsRUFBRSxPQUFPLENBQUM7WUFDMUQsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksVUFBVSxFQUFFLENBQUM7UUFDZiw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7WUFDaEMsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSw2RUFBaUIsRUFBRSxPQUFPLENBQUM7WUFDNUQsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxzQkFBc0I7WUFDaEMsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxTQUFTO1lBQzFDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsNkVBQWlCLEVBQUUsT0FBTyxDQUFDO1lBQzVELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLDRCQUE0QixDQUFDLElBQUksQ0FBQztZQUNoQyxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZFQUFpQixFQUFFLE9BQU8sQ0FBQztZQUM1RCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUN0QixDQUFDLENBQUM7UUFDSCw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7WUFDaEMsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSw2RUFBaUIsRUFBRSxPQUFPLENBQUM7WUFDNUQsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxTQUFTO1lBQzFDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsa0ZBQXNCLEVBQUUsT0FBTyxDQUFDO1lBQ2pFLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLDZFQUFpQixFQUFFLE9BQU8sQ0FBQztZQUM1RCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSw0RkFBcUIsQ0FBQztRQUM3QyxJQUFJLEVBQUUsWUFBWTtRQUNsQixVQUFVO1FBQ1YsVUFBVTtRQUNWLFVBQVU7UUFDVixZQUFZLEVBQUUsc0dBQXFCO1FBQ25DLFdBQVcsRUFBRSxzR0FBdUI7UUFDcEMsa0JBQWtCLEVBQUUsdUdBQTJCO1FBQy9DLGlCQUFpQixFQUFFLHVHQUE2QjtRQUNoRCw0QkFBNEI7S0FDN0IsQ0FBQyxDQUFDO0lBRUgsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWhGLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixRQUFRLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixRQUFRLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixRQUFRLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsUUFBUSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25CLFFBQVEsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLFFBQVEsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixRQUFRLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsUUFBUSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLFFBQVEsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixRQUFRLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUzQyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxFQUNqQyxjQUFjLEdBQUcsRUFBRSxFQUNuQixVQUFVLEdBQUcsSUFBSSxFQUNqQixVQUFVLEdBQUcsS0FBSyxFQUNsQixVQUFVLEdBQUcsS0FBSyxFQUNsQixRQUFRLEdBQUcsS0FBSyxFQUNoQixrQkFBa0IsR0FBRyxnREFBTSxDQUFDLDhCQUE4QixHQUMzRCxHQUFHLEVBQUU7SUFDSixNQUFNLFlBQVksR0FDaEIsYUFBYTtRQUNiLElBQUksY0FBYyxHQUFHO1FBQ3JCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVsQyxNQUFNLDRCQUE0QixHQUFHO1FBQ25DO1lBQ0UsUUFBUSxFQUFFLGdDQUFnQztZQUMxQyxhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFdBQVc7WUFDNUMsV0FBVyxFQUFFLGdEQUFNLENBQUMsNEJBQTRCO1lBQ2hELEtBQUssRUFBRSxnRUFBVSxDQUFDLFlBQVk7WUFDOUIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsZ0RBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQzlFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztZQUNyQiw0QkFBNEIsRUFBRSxJQUFJO1NBQ25DO1FBQ0Q7WUFDRSxRQUFRLEVBQUUsY0FBYztZQUN4QixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFdBQVc7WUFDNUMsV0FBVyxFQUFFLGdEQUFNLENBQUMsNEJBQTRCO1lBQ2hELEtBQUssRUFBRSxnRUFBVSxDQUFDLFlBQVk7WUFDOUIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsSUFBSSxZQUFZLENBQUMsZ0RBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2hGLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztZQUNyQiw0QkFBNEIsRUFBRSxJQUFJO1NBQ25DO0tBQ0YsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLElBQUksNEZBQXFCLENBQUM7UUFDN0MsSUFBSSxFQUFFLGFBQWE7UUFDbkIsVUFBVTtRQUNWLFVBQVU7UUFDVixVQUFVO1FBQ1YsWUFBWSxFQUFFLDhHQUF5QjtRQUN2QyxXQUFXLEVBQUUsOEdBQTJCO1FBQ3hDLGtCQUFrQixFQUFFLCtHQUErQjtRQUNuRCxpQkFBaUIsRUFBRSwrR0FBaUM7UUFDcEQsNEJBQTRCO0tBQzdCLENBQUMsQ0FBQztJQUNILFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNoRixJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsUUFBUSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxRQUFRLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDbEQsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLEVBQ3ZDLGNBQWMsR0FBRyxFQUFFLEVBQ25CLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLGtCQUFrQixHQUFHLGdEQUFNLENBQUMsOEJBQThCLEdBQzNELEdBQUcsRUFBRTtJQUNKLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixHQUFHLElBQUksY0FBYyxHQUFHLENBQUM7SUFFakUsTUFBTSw0QkFBNEIsR0FBRztRQUNuQztZQUNFLFFBQVEsRUFBRSxnQ0FBZ0M7WUFDMUMsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxXQUFXO1lBQzVDLFdBQVcsRUFBRSxnREFBTSxDQUFDLDRCQUE0QjtZQUNoRCxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxZQUFZO1lBQzlCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSSxtREFBTyxDQUFDLElBQUksVUFBVSxDQUFDLGdEQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM5RSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztZQUN0QixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDckIsNEJBQTRCLEVBQUUsSUFBSTtTQUNuQztRQUNEO1lBQ0UsUUFBUSxFQUFFLGNBQWM7WUFDeEIsYUFBYSxFQUFFLHNFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxXQUFXO1lBQzVDLFdBQVcsRUFBRSxnREFBTSxDQUFDLDRCQUE0QjtZQUNoRCxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxZQUFZO1lBQzlCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSSxtREFBTyxDQUFDLElBQUksWUFBWSxDQUFDLGdEQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUNoRixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztZQUN0QixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDckIsNEJBQTRCLEVBQUUsSUFBSTtTQUNuQztLQUNGLENBQUM7SUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLDRGQUFxQixDQUFDO1FBQzdDLElBQUksRUFBRSxtQkFBbUI7UUFDekIsVUFBVTtRQUNWLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVU7UUFDVixZQUFZLEVBQUUsc0hBQTZCO1FBQzNDLFdBQVcsRUFBRSxzSEFBK0I7UUFDNUMsNEJBQTRCO0tBQzdCLENBQUMsQ0FBQztJQUNILFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNoRixRQUFRLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFM0MsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsRUFDMUIsY0FBYyxHQUFHLEVBQUUsRUFDbkIsVUFBVSxHQUFHLElBQUksRUFDakIsVUFBVSxHQUFHLEtBQUssRUFDbEIsa0JBQWtCLEdBQUcsZ0RBQU0sQ0FBQyw4QkFBOEIsR0FDM0QsR0FBRyxFQUFFO0lBQ0osTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFdEYsTUFBTSxZQUFZLEdBQUcsSUFBSSw0RkFBcUIsQ0FBQztRQUM3QyxJQUFJLEVBQUUsTUFBTTtRQUNaLFVBQVU7UUFDVixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVO1FBQ1YsWUFBWSxFQUFFLHdHQUFzQjtRQUNwQyxXQUFXLEVBQUUsd0dBQXdCO1FBQ3JDLDRCQUE0QixFQUFFLEVBQUU7UUFDaEMsa0JBQWtCLEVBQUUseUdBQTRCO1FBQ2hELGlCQUFpQixFQUFFLHlHQUE4QjtLQUNsRCxDQUFDLENBQUM7SUFDSCxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDaEYsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLEVBQ2pDLGNBQWMsR0FBRyxFQUFFLEVBQ25CLGtCQUFrQixHQUFHLENBQUMsRUFDdEIsY0FBYyxHQUFHLElBQUksR0FDdEIsR0FBRyxFQUFFO0lBQ0osTUFBTSxZQUFZLEdBQUcsYUFBYSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFMUQsTUFBTSxZQUFZLEdBQUcsSUFBSSw0RkFBcUIsQ0FBQztRQUM3QyxJQUFJLEVBQUUsWUFBWTtRQUNsQixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsS0FBSztRQUNqQixZQUFZLEVBQUUsc0hBQTZCO1FBQzNDLFdBQVcsRUFBRSxzSEFBK0I7UUFDNUMsa0JBQWtCLEVBQUUsdUhBQW1DO1FBQ3ZELGlCQUFpQixFQUFFLHVIQUFxQztRQUN4RCw0QkFBNEIsRUFBRSxFQUFFO0tBQ2pDLENBQUMsQ0FBQztJQUNILFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNoRixRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUywwQkFBMEIsQ0FBQyxFQUFFLGNBQWMsR0FBRyxFQUFFLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUN0RixNQUFNLFlBQVksR0FBRyxjQUFjLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUUzRCxNQUFNLFlBQVksR0FBRyxJQUFJLDRGQUFxQixDQUFDO1FBQzdDLElBQUksRUFBRSxZQUFZO1FBQ2xCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFlBQVksRUFBRSxrSEFBd0I7UUFDdEMsV0FBVyxFQUFFLGtIQUEwQjtRQUN2Qyw0QkFBNEIsRUFBRSxFQUFFO0tBQ2pDLENBQUMsQ0FBQztJQUNILFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUVoRixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxFQUFFLGNBQWMsR0FBRyxFQUFFLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNyRixNQUFNLFlBQVksR0FBRyxhQUFhLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUUxRCxNQUFNLFlBQVksR0FBRyxJQUFJLHNHQUEwQixFQUFFLENBQUM7SUFDdEQsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWhGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLEVBQ2pDLGNBQWMsR0FBRyxFQUFFLEVBQ25CLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFFBQVEsR0FBRyxHQUFHLEVBQ2Qsa0JBQWtCLEdBQUcsRUFBRSxHQUN4QixHQUFHLEVBQUU7SUFDSixNQUFNLFlBQVksR0FBRyxhQUFhLEdBQUcsSUFBSSxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU3RixNQUFNLFlBQVksR0FBRyxJQUFJLHNHQUEwQixDQUFDLFFBQVEsRUFBRTtRQUM1RCxVQUFVO0tBQ1gsQ0FBQyxDQUFDO0lBQ0gsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hGLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixRQUFRLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDBDQUEwQyxDQUNqRCxFQUNFLGNBQWMsR0FBRyxFQUFFLEVBQ25CLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFdBQVcsR0FBRyxLQUFLLEVBQ25CLHNCQUFzQixHQUFHLENBQUMsRUFDMUIsa0JBQWtCLEdBQUcsRUFBRSxHQUN4QixHQUFHLEVBQUUsRUFDTixxQkFBaUM7SUFFakMsTUFBTSxZQUFZLEdBQ2hCLHdCQUF3QjtRQUN4QixJQUFJLGNBQWMsR0FBRztRQUNyQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSw0SEFBcUMsQ0FDNUQ7UUFDRSxVQUFVO1FBQ1YsVUFBVTtRQUNWLFVBQVU7UUFDVixXQUFXO1FBQ1gsc0JBQXNCO0tBQ3ZCLEVBQ0QscUJBQXFCLENBQ3RCLENBQUM7SUFDRixZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDaEYsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixRQUFRLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHlDQUF5QyxDQUFDLEVBQ2pELGNBQWMsR0FBRyxFQUFFLEVBQ25CLGtCQUFrQixHQUFHLEVBQUUsR0FDeEIsR0FBRyxFQUFFO0lBQ0osTUFBTSxZQUFZLEdBQUcsNkJBQTZCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUUxRSxNQUFNLDRCQUE0QixHQUEwQixFQUFFLENBQUM7SUFDL0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0MsNEJBQTRCLENBQUMsSUFBSSxDQUMvQjtRQUNFLFFBQVEsRUFBRSxjQUFjO1FBQ3hCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLElBQUk7UUFDakMsZUFBZSxFQUFFLDBFQUFlLENBQUMsTUFBTTtRQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1FBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNO1FBQzlDLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLENBQUM7S0FDUCxFQUNEO1FBQ0UsUUFBUSxFQUFFLGVBQWU7UUFDekIsYUFBYSxFQUFFLHNFQUFhLENBQUMsS0FBSztRQUNsQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxXQUFXO1FBQzVDLFdBQVcsRUFBRSxFQUFFO1FBQ2YsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztRQUM3QixZQUFZLEVBQUUsSUFBSSxtREFBTyxDQUFDLGFBQWEsQ0FBQztRQUN4QyxHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxDQUFDO1FBQ04sNEJBQTRCLEVBQUUsSUFBSTtLQUNuQyxFQUNEO1FBQ0UsUUFBUSxFQUFFLG9CQUFvQjtRQUM5QixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1FBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLE1BQU07UUFDdkMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztRQUM3QixZQUFZLEVBQUUsaURBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLEVBQUU7S0FDUixFQUNEO1FBQ0UsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxLQUFLO1FBQ2xDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLElBQUk7UUFDckMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztRQUM3QixZQUFZLEVBQUUsbURBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO0tBQzdCLEVBQ0Q7UUFDRSxRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLGFBQWEsRUFBRSxzRUFBYSxDQUFDLEdBQUc7UUFDaEMsZUFBZSxFQUFFLDBFQUFlLENBQUMsU0FBUztRQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1FBQzdCLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSw2RUFBaUIsQ0FBQztRQUNwQyxHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO0tBQzdCLENBQ0YsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLElBQUksNEZBQXFCLENBQUM7UUFDN0MsSUFBSSxFQUFFLFlBQVk7UUFDbEIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsWUFBWSxFQUFFLDBJQUE2QztRQUMzRCxXQUFXLEVBQUUsMElBQStDO1FBQzVELDRCQUE0QjtLQUM3QixDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBRXRDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFaEYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsa0RBQWtELENBQ3pELEVBQ0UsY0FBYyxHQUFHLEVBQUUsRUFDbkIsVUFBVSxHQUFHLEtBQUssRUFDbEIsVUFBVSxHQUFHLEtBQUssRUFDbEIsV0FBVyxHQUFHLEtBQUssRUFDbkIsVUFBVSxHQUFHLElBQUksRUFDakIsMkJBQTJCLEdBQUcsQ0FBQyxFQUMvQixpQ0FBaUMsR0FBRyxDQUFDLEVBQ3JDLG9CQUFvQixHQUFHLFNBQVMsRUFDaEMsa0JBQWtCLEdBQUcsRUFBRSxHQVd4QixFQUNELHdCQUFzQztJQUV0QyxNQUFNLFlBQVksR0FDaEIsZ0NBQWdDO1FBQ2hDLElBQUksY0FBYyxHQUFHO1FBQ3JCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQy9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXBDLE1BQU0sWUFBWSxHQUFHLElBQUksNklBQTZDLENBQ3BFO1FBQ0UsVUFBVTtRQUNWLFVBQVU7UUFDVixVQUFVO1FBQ1YsV0FBVztRQUNYLDJCQUEyQjtRQUMzQixpQ0FBaUM7UUFDakMsb0JBQW9CO0tBQ3JCLEVBQ0Qsd0JBQXdCLENBQ3pCLENBQUM7SUFDRixZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDaEYsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixRQUFRLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLGlDQUFpQyxDQUN4QyxFQUFFLGNBQWMsR0FBRyxFQUFFLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUNwRCw0QkFBNkM7SUFFN0MsTUFBTSxZQUFZLEdBQUcscUJBQXFCLEdBQUcsSUFBSSxjQUFjLEdBQUcsQ0FBQztJQUNuRSxNQUFNLFlBQVksR0FBRyxJQUFJLHNIQUFrQyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDMUYsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFO0lBQ3ZGLE1BQU0sWUFBWSxHQUFHLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBRTNELE1BQU0sNEJBQTRCLEdBQTBCLEVBQUUsQ0FBQztJQUMvRCxNQUFNLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzQyw0QkFBNEIsQ0FBQyxJQUFJLENBQy9CO1FBQ0UsUUFBUSxFQUFFLGNBQWM7UUFDeEIsYUFBYSxFQUFFLHNFQUFhLENBQUMsSUFBSTtRQUNqQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxNQUFNO1FBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7UUFDN0IsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU07UUFDOUMsR0FBRyxFQUFFLENBQUM7UUFDTixHQUFHLEVBQUUsQ0FBQztLQUNQLEVBQ0Q7UUFDRSxRQUFRLEVBQUUsZUFBZTtRQUN6QixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxLQUFLO1FBQ2xDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFdBQVc7UUFDNUMsV0FBVyxFQUFFLEVBQUU7UUFDZixLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1FBQzdCLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsYUFBYSxDQUFDO1FBQ3hDLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLENBQUM7UUFDTixzQ0FBc0M7S0FDdkMsRUFDRDtRQUNFLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsYUFBYSxFQUFFLHNFQUFhLENBQUMsR0FBRztRQUNoQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxNQUFNO1FBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7UUFDN0IsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUN0QyxHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxFQUFFO0tBQ1IsRUFDRDtRQUNFLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IsYUFBYSxFQUFFLHNFQUFhLENBQUMsS0FBSztRQUNsQyxlQUFlLEVBQUUsMEVBQWUsQ0FBQyxJQUFJO1FBQ3JDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7UUFDN0IsWUFBWSxFQUFFLG1EQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsR0FBRyxFQUFFLENBQUM7UUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtLQUM3QixFQUNEO1FBQ0UsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixhQUFhLEVBQUUsc0VBQWEsQ0FBQyxHQUFHO1FBQ2hDLGVBQWUsRUFBRSwwRUFBZSxDQUFDLFNBQVM7UUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztRQUM3QixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsNkVBQWlCLENBQUM7UUFDcEMsR0FBRyxFQUFFLENBQUM7UUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtLQUM3QixDQUNGLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLDRGQUFxQixDQUFDO1FBQzdDLElBQUksRUFBRSxZQUFZO1FBQ2xCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFlBQVksRUFBRSw0R0FBOEI7UUFDNUMsV0FBVyxFQUFFLDRHQUFnQztRQUM3QyxrQkFBa0IsRUFBRSw2R0FBb0M7UUFDeEQsaUJBQWlCLEVBQUUsNkdBQXNDO1FBQ3pELDRCQUE0QjtLQUM3QixDQUFDLENBQUM7SUFDSCxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFaEYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQ2xDLEVBQ0UsY0FBYyxHQUFHLEVBQUUsRUFDbkIsa0JBQWtCLEdBQUcsQ0FBQyxHQUl2QixFQUNELGtCQUFxQztJQUVyQyxNQUFNLFlBQVksR0FBRyxlQUFlLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUU1RCxNQUFNLFlBQVksR0FBRyxJQUFJLDBHQUE0QixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDMUUsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWhGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLG1DQUFtQyxDQUMxQyxFQUNFLGNBQWMsR0FBRyxFQUFFLEVBQ25CLHNCQUFzQixHQUFHLENBQUMsRUFDMUIsR0FBRyxFQUNILE9BQU8sRUFDUCxrQkFBa0IsR0FBRyxDQUFDLEdBT3ZCLEVBQ0QsZ0JBQTRCO0lBRTVCLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFcEUsTUFBTSxZQUFZLEdBQUcsSUFBSSwySEFBb0MsQ0FDM0QsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixHQUFHLEVBQ0gsT0FBTyxDQUNSLENBQUM7SUFDRixZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFaEYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUMsRUFBRSxjQUFjLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDekYsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUU5RCxNQUFNLFlBQVksR0FBRyxJQUFJLDRGQUFxQixDQUFDO1FBQzdDLElBQUksRUFBRSxZQUFZO1FBQ2xCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFlBQVksRUFBRSxrSEFBMkI7UUFDekMsV0FBVyxFQUFFLGtIQUE2QjtRQUMxQyxrQkFBa0IsRUFBRSxtSEFBaUM7UUFDckQsaUJBQWlCLEVBQUUsbUhBQW1DO1FBQ3RELDRCQUE0QixFQUFFLEVBQUU7S0FDakMsQ0FBQyxDQUFDO0lBQ0gsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWhGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUFDLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ3JGLE1BQU0sWUFBWSxHQUFHLGFBQWEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBRTFELE1BQU0sWUFBWSxHQUFHLElBQUksNEZBQXFCLENBQUM7UUFDN0MsSUFBSSxFQUFFLFlBQVk7UUFDbEIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsWUFBWSxFQUFFLDBHQUEyQjtRQUN6QyxXQUFXLEVBQUUsMEdBQTZCO1FBQzFDLGtCQUFrQixFQUFFLGdIQUEyQjtRQUMvQyxpQkFBaUIsRUFBRSxnSEFBNkI7UUFDaEQsNEJBQTRCLEVBQUUsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFDSCxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDaEYsUUFBUSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRTlDLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDZCQUE2QixDQUFDLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ3pGLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFOUQsTUFBTSxZQUFZLEdBQUcsSUFBSSw0RkFBcUIsQ0FBQztRQUM3QyxJQUFJLEVBQUUsWUFBWTtRQUNsQixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsS0FBSztRQUNqQixZQUFZLEVBQUUsa0hBQTJCO1FBQ3pDLFdBQVcsRUFBRSxrSEFBNkI7UUFDMUMsNEJBQTRCLEVBQUUsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFDSCxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFaEYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsRUFBRSxjQUFjLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeEYsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUU3RCxNQUFNLFlBQVksR0FBRyxJQUFJLDRGQUFxQixDQUFDO1FBQzdDLElBQUksRUFBRSxZQUFZO1FBQ2xCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFlBQVksRUFBRSxnSEFBMEI7UUFDeEMsV0FBVyxFQUFFLGdIQUE0QjtRQUN6QyxrQkFBa0IsRUFBRSxzSEFBZ0M7UUFDcEQsaUJBQWlCLEVBQUUsc0hBQWtDO1FBQ3JELDRCQUE0QixFQUFFLEVBQUU7S0FDakMsQ0FBQyxDQUFDO0lBQ0gsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWhGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ3RGLE1BQU0sWUFBWSxHQUFHLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBRTNELE1BQU0sWUFBWSxHQUFHLElBQUksNEZBQXFCLENBQUM7UUFDN0MsSUFBSSxFQUFFLFlBQVk7UUFDbEIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsVUFBVSxFQUFFLEtBQUs7UUFDakIsWUFBWSxFQUFFLDRHQUF3QjtRQUN0QyxXQUFXLEVBQUUsNEdBQTBCO1FBQ3ZDLGtCQUFrQixFQUFFLGtIQUE4QjtRQUNsRCxpQkFBaUIsRUFBRSxrSEFBZ0M7UUFDbkQsNEJBQTRCLEVBQUUsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFDSCxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFaEYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsRUFDNUIsY0FBYyxHQUFHLEVBQUUsRUFDbkIsVUFBVSxHQUFHLEtBQUssRUFDbEIsR0FBRyxFQUNILE9BQU8sRUFDUCxPQUFPLEVBQ1Asa0JBQWtCLEdBQUcsRUFBRSxHQVF4QjtJQUNDLE1BQU0sWUFBWSxHQUFHLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXZGLE1BQU0sWUFBWSxHQUFHLElBQUksNkZBQXFCLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEYsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hGLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixRQUFRLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDZCQUE2QixDQUFDLEVBQUUsY0FBYyxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFO0lBQzFGLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFOUQsTUFBTSxZQUFZLEdBQUcsSUFBSSw4R0FBOEIsRUFBRSxDQUFDO0lBQzFELFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNoRixRQUFRLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDM0MsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsRUFDM0IsY0FBYyxHQUFHLEVBQUUsRUFDbkIsVUFBVSxHQUFHLEtBQUssRUFDbEIsVUFBVSxHQUFHLEtBQUssRUFDbEIsVUFBVSxHQUFHLElBQUksRUFDakIsbUJBQW1CLEdBQUcsS0FBSyxFQUMzQixTQUFTLEdBQUcsS0FBSyxFQUNqQixrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLEVBQ1Qsa0JBQWtCLEdBQUcsZ0RBQU0sQ0FBQyw4QkFBOEIsRUFDMUQsY0FBYyxHQUFHLElBQUksR0FjdEI7SUFDQyxNQUFNLFlBQVksR0FDaEIsT0FBTztRQUNQLElBQUksY0FBYyxHQUFHO1FBQ3JCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQy9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSwwRkFBb0IsQ0FDM0MsU0FBUyxFQUNULGtCQUFrQixFQUNsQixRQUFRLEVBQ1IsUUFBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixTQUFTLEVBQ1QsY0FBYyxFQUNkLFlBQVksQ0FDYixDQUFDO0lBRUYsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hGLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFeEQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQ3BDLGVBQXlCLEVBQ3pCLGVBQXVCLEVBQ3ZCLGNBQXNCLEVBQ3RCLEVBQ0UsY0FBYyxHQUFHLEVBQUUsRUFDbkIsVUFBVSxHQUFHLElBQUksRUFDakIsVUFBVSxHQUFHLEtBQUssRUFDbEIsVUFBVSxHQUFHLEtBQUssRUFDbEIsa0JBQWtCLEdBQUcsZ0RBQU0sQ0FBQyw4QkFBOEIsR0FDM0QsR0FBRyxFQUFFO0lBRU4sTUFBTSxZQUFZLEdBQ2hCLFFBQVE7UUFDUixJQUFJLGNBQWMsR0FBRztRQUNyQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRWxDLElBQUksWUFBbUMsQ0FBQztJQUN4QyxJQUFJLDZEQUFXLENBQUMsc0JBQXNCLEtBQUssMERBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsRSxZQUFZLEdBQUcsSUFBSSw0RkFBcUIsQ0FBQztZQUN2QyxJQUFJLEVBQUUsWUFBWTtZQUNsQixVQUFVO1lBQ1YsVUFBVTtZQUNWLFVBQVU7WUFDVixrQkFBa0IsRUFBRTtnQkFDbEIsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLFdBQVcsRUFBRSxRQUFRO2dCQUNyQixnQkFBZ0IsRUFBRSxLQUFLO2FBQ3hCO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCLElBQUksRUFBRSxjQUFjO2dCQUNwQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsZ0JBQWdCLEVBQUUsSUFBSTthQUN2QjtZQUNELDRCQUE0QixFQUFFLEVBQUU7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixZQUFZLEdBQUcsSUFBSSw0RkFBcUIsQ0FBQztZQUN2QyxJQUFJLEVBQUUsWUFBWTtZQUNsQixVQUFVO1lBQ1YsVUFBVTtZQUNWLFVBQVU7WUFDVixZQUFZLEVBQUU7Z0JBQ1osSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLFdBQVcsRUFBRSxRQUFRO2dCQUNyQixnQkFBZ0IsRUFBRSxLQUFLO2FBQ3hCO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxjQUFjO2dCQUNwQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsZ0JBQWdCLEVBQUUsSUFBSTthQUN2QjtZQUNELDRCQUE0QixFQUFFLEVBQUU7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQ3RDLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLGtCQUFrQixDQUNuQixDQUFDO0lBQ0YsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsTUFBa0MsRUFDbEMsU0FBb0IsRUFDcEIsUUFBa0I7SUFFbEIsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFHLENBQUM7SUFDeEQsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDOUIscUJBQXFCLENBQUMsV0FBVyxDQUFDLG1FQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVNLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDMUMsY0FBYztJQUNkLGdCQUFnQjtJQUNoQiw2QkFBNkI7SUFDN0IseUJBQXlCO0lBQ3pCLCtCQUErQjtJQUMvQixrQkFBa0I7SUFDbEIscUJBQXFCO0lBQ3JCLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDBDQUEwQztJQUMxQyw2QkFBNkI7SUFDN0IseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QiwwQkFBMEI7SUFDMUIsNkJBQTZCO0lBQzdCLGtEQUFrRDtJQUNsRCw2QkFBNkI7SUFDN0IsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6Qix5Q0FBeUM7SUFDekMsaUNBQWlDO0lBQ2pDLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsbUNBQW1DO0lBQ25DLG9CQUFvQjtJQUNwQixjQUFjO0NBQ2YsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN3VDK0Q7QUFDMUI7QUFFTztBQUVnQjtBQUNyQjtBQUNxQjtBQUNBO0FBQ007QUFDSDtBQUNyQztBQUM2QztBQUNkO0FBQ2M7QUFDWDtBQUNnQjtBQUUvRSxNQUFNLFdBQVcsR0FBRyxDQUNsQixPQUVJLEVBQUUsRUFDTixFQUFFO0lBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSx5REFBSyxFQUFFLENBQUM7SUFDOUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdEMsSUFBSSxxQ0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsZ0JBQWdCLEdBQUcsa0RBQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7U0FBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLGtEQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUF1QixFQUFFLEVBQUUsRUFBRTtJQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLHVEQUFJLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQXVCLEVBQUUsRUFBRSxFQUFFO0lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksdURBQUksRUFBRSxDQUFDO0lBQzdCLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBdUIsRUFBRSxFQUFFLEVBQUU7O0lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksdURBQUksRUFBRSxDQUFDO0lBQzdCLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXRDLElBQUkscUNBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUcscUVBQWdCLENBQUMsb0JBQW9CLENBQUMsbUZBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEYsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxtRkFBbUIsRUFBRSxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxFQUFFLHdFQUFZLENBQUMsR0FBRztZQUN0QixJQUFJLEVBQUUsVUFBSSxDQUFDLFdBQVcsbUNBQUksa0RBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEQsUUFBUSxFQUFFLGtEQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxrREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1NBQ3RDLENBQUM7UUFDRixRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsY0FBc0IsRUFBRSxPQUF1QixFQUFFLEVBQUUsRUFBRTs7SUFDeEUsTUFBTSxTQUFTLEdBQUcsSUFBSSx1REFBSSxFQUFFLENBQUM7SUFDN0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLGdEQUFJLEVBQUUsQ0FBQztJQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUVwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsNEZBQWdCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixJQUFJLHFDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQy9DLE1BQU0sU0FBUyxHQUFHLHFFQUFnQixDQUFDLG9CQUFvQixDQUFDLG1GQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksbUZBQW1CLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRztnQkFDZixJQUFJLEVBQUUsd0VBQVksQ0FBQyxHQUFHO2dCQUN0QixJQUFJLEVBQUUsVUFBSSxDQUFDLFdBQVcsbUNBQUksa0RBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BELFFBQVEsRUFBRSxrREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEMsUUFBUSxFQUFFLGtEQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2dCQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2dCQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2FBQ3RDLENBQUM7WUFDRixRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2QyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBeUIsRUFBRSxFQUFFLEVBQUU7SUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSwyREFBTSxFQUFFLENBQUM7SUFDL0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdEMsSUFBSSxxQ0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxxRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxtRkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLG1GQUFtQixFQUFFLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUc7WUFDZixJQUFJLEVBQUUsd0VBQVksQ0FBQyxNQUFNO1lBQ3pCLElBQUksRUFBRSxxQ0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN6QixDQUFDLENBQUMsa0RBQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQzFELENBQUMsQ0FBQyxrREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixRQUFRLEVBQUUsa0RBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEMsUUFBUSxFQUFFLGtEQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztZQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQy9CLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7U0FDdEMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxjQUFzQixFQUFFLE9BQXlCLEVBQUUsRUFBRSxFQUFFO0lBQzVFLE1BQU0sU0FBUyxHQUFHLElBQUksMkRBQU0sRUFBRSxDQUFDO0lBQy9CLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7SUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFFcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLDRGQUFnQixFQUFFLENBQUM7UUFDbEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsSUFBSSxxQ0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFNBQVMsR0FBRyxxRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxtRkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLG1GQUFtQixFQUFFLENBQUM7WUFDM0MsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsSUFBSSxFQUFFLHdFQUFZLENBQUMsTUFBTTtnQkFDekIsSUFBSSxFQUFFLHFDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLENBQUMsQ0FBQyxrREFBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDMUQsQ0FBQyxDQUFDLGtEQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixRQUFRLEVBQUUsa0RBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLFFBQVEsRUFBRSxrREFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFDL0IsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVzthQUN0QyxDQUFDO1lBQ0YsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdkMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQXdCLEVBQUUsRUFBRSxFQUFFO0lBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUkseURBQUssRUFBRSxDQUFDO0lBQzlCLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBdUIsRUFBRSxFQUFFLEVBQUU7SUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSx1REFBSSxFQUFFLENBQUM7SUFDN0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsU0FBUyxXQUFXLENBQUMsU0FBaUI7SUFDcEMsTUFBTSxNQUFNLEdBQUcsNEZBQWdCLEVBQUUsQ0FBQztJQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxnREFBSSxFQUFFLENBQUM7SUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFTSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RDLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsWUFBWTtJQUNaLGFBQWE7SUFDYixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7Q0FDWixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TmdFO0FBR2Y7QUFFTjtBQUc5QyxJQUFJLFFBQTZCLENBQUM7QUFFbEM7Ozs7O0dBS0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLFFBQWtCO0lBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksNERBQVUsRUFBRSxDQUFDO0lBQ3BDLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDdEMsVUFBVSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUN0QyxVQUFVLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMvQixVQUFVLENBQUMsZ0NBQWdDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdEQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyw4Q0FBOEMsQ0FDckQsUUFBa0IsRUFDbEIsT0FBd0IsRUFDeEIsT0FBaUI7SUFFakIsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLElBQUksc0RBQU8sQ0FBQztZQUNyQixTQUFTLEVBQUUsMkVBQWdCLENBQUMsTUFBTTtZQUNsQyxTQUFTLEVBQUUsMkVBQWdCLENBQUMsTUFBTTtZQUNsQyxLQUFLLEVBQUUsMkVBQWdCLENBQUMsV0FBVztZQUNuQyxLQUFLLEVBQUUsMkVBQWdCLENBQUMsV0FBVztTQUNwQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksUUFBUSxDQUFDLENBQUM7SUFFL0UsTUFBTSxVQUFVLEdBQUcsSUFBSSw0REFBVSxFQUFFLENBQUM7SUFDcEMsVUFBVSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUN0QyxVQUFVLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQy9CLFVBQVUsQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV0RCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRU0sTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzVDLDBCQUEwQjtJQUMxQiw4Q0FBOEM7Q0FDL0MsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdEbUQ7QUFDZ0I7QUFFVTtBQUNOO0FBQ2xCO0FBQ3dCO0FBQzFCO0FBaUJ0RCxTQUFTLGlCQUFpQixDQUFDLElBQTJCOztJQUNwRCxNQUFNLFdBQVcsR0FBRyxJQUFJLDhEQUFXLEVBQUUsQ0FBQztJQUN0QyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDhFQUFtQixFQUFFLENBQUM7UUFFdEQsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztTQUMvQixDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsTUFBTSxZQUFZLEdBQUcsSUFBSSw4RUFBbUIsRUFBRSxDQUFDO1FBQy9DLE1BQU0seUJBQXlCLEdBQUcsVUFBSSxDQUFDLGtCQUFrQixtQ0FBSSxxRUFBYSxDQUFDLFFBQVEsQ0FBQztRQUVwRixZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsYUFBYSxFQUFFLENBQUM7WUFDaEIsTUFBTSxFQUFFLHlCQUF5QjtTQUNsQyxDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFXRCxTQUFTLHFCQUFxQixDQUFDLElBQStCO0lBQzVELE1BQU0sV0FBVyxHQUFHLElBQUksOERBQVcsRUFBRSxDQUFDO0lBQ3RDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFlBQVksR0FBRyxJQUFJLGdFQUFZLEVBQUUsQ0FBQztRQUN4QyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pFLE1BQU0sRUFBRSxJQUFJO1lBQ1osZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQ3RDLENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLElBQUksZ0VBQVksRUFBRSxDQUFDO0lBQ3hDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtRQUNuRSxNQUFNLEVBQUUsSUFBSTtRQUNaLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtLQUN0QyxDQUFDLENBQUM7SUFDSCxXQUFXLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFN0MsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQVlELFNBQVMsNkJBQTZCLENBQUMsSUFBdUM7SUFDNUUsTUFBTSxXQUFXLEdBQUcsSUFBSSw4REFBVyxFQUFFLENBQUM7SUFDdEMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLG1CQUFtQixHQUFHLElBQUksOEVBQW1CLEVBQUUsQ0FBQztJQUN0RCxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQztRQUNyQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7UUFDbkMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztLQUM5QixDQUFDLENBQUM7SUFDSCxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFekQsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLDhFQUFtQixFQUFFLENBQUM7SUFDbEUsK0JBQStCLENBQUMsa0JBQWtCLENBQUM7UUFDakQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsY0FBYyxFQUFFLHFFQUFhLENBQUMsZ0JBQWdCO1FBQzlDLE1BQU0sRUFBRSxpRUFBVyxDQUFDLFlBQVk7UUFDaEMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSztRQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7S0FDOUIsQ0FBQyxDQUFDO0lBRUgsV0FBVyxDQUFDLHlCQUF5QixDQUFDLCtCQUErQixDQUFDLENBQUM7SUFFdkUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQVNELFNBQVMsd0JBQXdCLENBQy9CLElBQWtDO0lBRWxDLE1BQU0sV0FBVyxHQUFHLElBQUksOERBQVcsRUFBRSxDQUFDO0lBQ3RDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDhEQUF1QixFQUFFLENBQUM7SUFFMUQsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1FBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1FBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtLQUMzQixDQUFDLENBQUM7SUFFSCxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVuRSxPQUFPLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLEtBQWEsRUFDYixNQUFjLEVBQ2QsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLGNBQWMsR0FBRyxxRUFBYSxDQUFDLFFBQVEsRUFBRTtJQUV0RCxNQUFNLFdBQVcsR0FBRyxJQUFJLDhEQUFXLEVBQUUsQ0FBQztJQUN0QyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVsQyxNQUFNLFlBQVksR0FBRyxJQUFJLDhFQUFtQixFQUFFLENBQUM7SUFDL0MsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNsQixLQUFLO1FBQ0wsTUFBTTtRQUNOLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sRUFBRSxjQUFjO0tBQ3ZCLENBQUMsQ0FBQztJQUVILFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU3QyxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRU0sTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzVDLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsNkJBQTZCO0lBQzdCLHdCQUF3QjtJQUN4QixpQkFBaUI7Q0FDbEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4TDRCO0FBQ0k7QUFDRjtBQUNKO0FBQ007QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0plO0FBQ1U7QUFDb0I7QUFDRDtBQUcvQztBQUVzRDtBQUlpQjtBQUNSO0FBQ3ZEO0FBSWpDLE1BQU0saUJBQWlCO0lBRzVCOzs7Ozs7Ozs7O09BVUc7SUFDSCxlQUFlLENBQ2IsVUFBNkIsRUFDN0IsU0FBZSxFQUNmLFFBQXNCLEVBQ3RCLGNBQXVCLEVBQ3ZCLFlBQTBCO1FBRTFCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsK0JBQStCLENBQ2xDLFVBQVUsRUFDVixTQUFTLEVBQ1QsUUFBUSxFQUNSLGNBQWMsRUFDZCxZQUFZLENBQ2IsQ0FBQztRQUVGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCx1QkFBdUIsQ0FDckIsVUFBNkIsRUFDN0IsU0FBbUIsRUFDbkIsa0JBQTJCO1FBRTNCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUU3RCxJQUFJLFVBQVUsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQWMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVELE9BQU87WUFDVCxDQUFDO1lBRUQsb0VBQWdCLENBQUMsb0JBQW9CLENBQUMsdUdBQXVCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFM0UsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QywyREFBYyxDQUFDLCtDQUErQyxDQUFDLE9BQU8sQ0FBQyxXQUFZLENBQUMsQ0FBQztvQkFDckYsMkRBQWMsQ0FBQywrQ0FBK0MsQ0FBQyxPQUFPLENBQUMsWUFBYSxDQUFDLENBQUM7Z0JBQ3hGLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxzQ0FBc0M7b0JBQ3RDLHVEQUF1RDtvQkFDdkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUNwRCxVQUFVLEVBQ1YsSUFBSSxFQUNKLE9BQU8sQ0FBQyxNQUFPLENBQUMsSUFBSyxDQUN0QixDQUFDO29CQUNGLElBQUksUUFBUSxFQUFFLENBQUM7d0JBQ2IsTUFBTSxXQUFXLEdBQUcsb0VBQWdCLENBQUMsb0JBQW9CLENBQUMsd0ZBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ3hGLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUV0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTyxDQUFDLElBQUssQ0FBQyxDQUFDO3dCQUNqRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLG1CQUFvQixDQUFDO3dCQUMzRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU8sQ0FBQyxJQUFLLENBQUUsQ0FBQzt3QkFDaEUsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUV0RCxJQUFJLFFBQXdDLENBQUM7d0JBQzdDLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQzs0QkFDakQsUUFBUSxHQUFHLElBQUksK0dBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ25ELENBQUM7NkJBQU0sSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFHLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDOzRCQUN4RCxRQUFRLEdBQUcsSUFBSSx1REFBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUM1QyxDQUFDO3dCQUNELE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxRQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzt3QkFDN0UsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFOzRCQUNyQixVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN2QixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsZUFBZTtRQUNmLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUF1QixDQUFDO0lBRWhCLHVCQUF1QixDQUFDLFVBQTZCLEVBQUUsa0JBQTJCO1FBQ3hGLFNBQVMscUJBQXFCLENBQUMsTUFBeUIsRUFBRSxrQkFBMkI7WUFDbkYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN0RCxJQUFJLGtCQUFrQixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUMvQixJQUFJLGtCQUFrQixJQUFJLElBQUksRUFBRSxDQUFDO29CQUMvQixrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUMsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNsRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMscUJBQXFCLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBQ0QscUJBQXFCLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRU8sd0JBQXdCLENBQzlCLFVBQTZCLEVBQzdCLFNBQWUsRUFDZixRQUFzQixFQUN0QixTQUFnQixFQUNoQixRQUE0QixFQUM1QixjQUF1QjtRQUV2QixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLDhEQUE4RDtZQUM5RCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUc1RCxDQUFDO1lBQ0YsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFLLENBQUMsQ0FBQztZQUM1QyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNOLDZFQUE2RTtZQUM3RSxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsU0FBUztnQkFDVCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUMvRCxJQUFJLGdCQUFvQyxDQUFDO2dCQUN6QyxNQUFNLGdCQUFnQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLGtCQUFrQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUMxRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUM5QixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztnQkFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDckIsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO3dCQUM3QixnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFFLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBR3pFLENBQUM7Z0JBQ0YsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGdCQUFpQixDQUFDLENBQUM7Z0JBQzlELElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUMxQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBeUIsQ0FBQztvQkFDaEYsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ25DLENBQUM7cUJBQU0sQ0FBQztvQkFDTixnREFBTSxDQUFDLElBQUksQ0FDVCxxQkFBcUIsZ0JBQWdCLGdCQUFnQixTQUFTLGVBQWUsUUFBUSxFQUFFLENBQ3hGLENBQUM7b0JBQ0YsT0FBTyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELFNBQVM7Z0JBQ1QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztnQkFDcEUsSUFBSSxnQkFBb0MsQ0FBQztnQkFDekMsTUFBTSxnQkFBZ0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDeEQsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztnQkFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDckIsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBRSxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FHekUsQ0FBQztnQkFDRixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWlCLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzFCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUF5QixDQUFDO29CQUNoRixPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGdEQUFNLENBQUMsSUFBSSxDQUNULHFCQUFxQixnQkFBZ0IsZ0JBQWdCLFNBQVMsZUFBZSxRQUFRLEVBQUUsQ0FDeEYsQ0FBQztvQkFDRixPQUFPLEtBQUssQ0FBQyxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFTyxnQ0FBZ0MsQ0FDdEMsVUFBNkIsRUFDN0IsU0FBbUIsRUFDbkIsU0FBZ0I7UUFFaEIsU0FBUztRQUNULE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsbUJBQW9CLENBQUM7UUFDaEYsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FHekUsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxnQkFBaUIsQ0FBQyxDQUFDO1FBQzlELElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUF5QixDQUFDO1lBQ2hGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzQyxxQ0FBcUM7WUFDckMsK0RBQStEO1lBQy9ELElBQUk7WUFFSixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNOLGdEQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixnQkFBZ0IsZ0JBQWdCLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDOUUsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFFBQVEsQ0FBQyxVQUE2QixFQUFFLFFBQXNCLEVBQUUsU0FBZ0I7UUFDdEYsTUFBTSxnQkFBZ0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4RCxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQy9ELEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzlCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDcEUsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FHekUsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQzFELElBQUksZ0JBQWdCLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTywrQkFBK0IsQ0FDckMsVUFBNkIsRUFDN0IsU0FBZSxFQUNmLFFBQXNCLEVBQ3RCLGNBQXVCLEVBQ3ZCLFlBQTBCOztRQUUxQixJQUFJLFNBQVMsQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU87UUFDVCxDQUFDO1FBRUQsb0VBQWdCLENBQUMsb0JBQW9CLENBQUMsdUdBQXVCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFM0UsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLDJEQUFjLENBQUMsK0NBQStDLENBQUMsT0FBTyxDQUFDLFdBQVksQ0FBQyxDQUFDO2dCQUNyRiwyREFBYyxDQUFDLCtDQUErQyxDQUFDLE9BQU8sQ0FBQyxZQUFhLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxxQkFBcUI7Z0JBQ3JCLE1BQU0sY0FBYyxHQUFHLG1CQUFPLENBQUMsYUFBYSwwQ0FBRSxXQUFXLDBDQUFFLE1BQU0sQ0FBRSxjQUFjLENBQUM7Z0JBQ2xGLE1BQU0sZUFBZSxHQUFHLG1CQUFPLENBQUMsYUFBYSwwQ0FBRSxZQUFZLDBDQUFFLE1BQU0sQ0FBRSxjQUFjLENBQUM7Z0JBQ3BGLE1BQU0sYUFBYSxHQUNqQixPQUFPLENBQUMsYUFBYyxDQUFDLGFBQWEsSUFBSSxJQUFJO29CQUMxQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWMsQ0FBQyxhQUFhO29CQUN0QyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUVmLHNDQUFzQztnQkFDdEMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTyxDQUFDLElBQUssQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQzVDLFVBQVUsRUFDVixTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sQ0FBQyxNQUFPLENBQUMsSUFBSyxFQUNyQixJQUFJLENBQUMsSUFBSSxFQUNULGNBQWMsQ0FDZixDQUFDO2dCQUNGLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsTUFBTSxXQUFXLEdBQUcsb0VBQWdCLENBQUMsb0JBQW9CLENBQUMsd0ZBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3hGLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUV0RCxJQUFJLFlBQVksS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDNUIsa0RBQWtEO3dCQUNsRCxJQUFJLHNCQUFzQixHQUFHLFdBQVcsQ0FBQzt3QkFDekMsSUFBSSxPQUFPLENBQUMsTUFBTyxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQzs0QkFDM0Msc0JBQXNCLEdBQUcsV0FBVyxDQUFDO3dCQUN2QyxDQUFDOzZCQUFNLElBQUksT0FBTyxDQUFDLE1BQU8sQ0FBQyxJQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7NEJBQ2hELHNCQUFzQixHQUFHLFlBQVksQ0FBQzt3QkFDeEMsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxNQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoRCxDQUFDO3dCQUNELElBQUksc0JBQXNCLEtBQUssWUFBWSxFQUFFLENBQUM7NEJBQzVDLGtCQUFrQixDQUFDLFlBQVksQ0FDN0Isd0NBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQ3ZELHNCQUFzQixFQUN0QixjQUFlLEVBQ2YsZUFBZ0IsRUFDaEIsQ0FBQyxFQUFFLGFBQWE7NEJBQ2hCLHVGQUFzQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FDakQsQ0FBQzt3QkFDSixDQUFDOzZCQUFNLElBQ0wsc0JBQXNCLEtBQUssV0FBVzs0QkFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFPLENBQUMsSUFBSyxDQUFDLEVBQzFELENBQUM7NEJBQ0Qsa0JBQWtCLENBQUMsWUFBWSxDQUM3Qix3Q0FBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFDdkQsc0JBQXNCLEVBQ3RCLGNBQWUsRUFDZixlQUFnQixFQUNoQixDQUFDLEVBQUUsWUFBWTs0QkFDZix1RkFBc0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQ2pELENBQUM7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU8sQ0FBQyxJQUFLLENBQUMsQ0FBQzt3QkFDdEUsSUFBSSxRQUF3QyxDQUFDO3dCQUM3QyxJQUFJLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQzs0QkFDOUIsUUFBUSxHQUFHLElBQUksdURBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDNUMsQ0FBQzs2QkFBTSxJQUFJLFlBQVksS0FBSyxVQUFVLEVBQUUsQ0FBQzs0QkFDdkMsUUFBUSxHQUFHLElBQUksMERBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQy9DLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7d0JBQzNDLENBQUM7d0JBQ0Qsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM1QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbFgyQztBQUNNO0FBQ1M7QUFDMkI7QUFDekI7QUFJckI7QUFHTTtBQUNkO0FBQ2lCO0FBQ0U7QUFFSztBQUNoQjtBQUt4Qzs7R0FFRztBQUNJLE1BQU0scUJBQXFCO0lBR2hDLGdCQUF1QixDQUFDO0lBRXhCOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBVyxFQUNYLE9BQXdCO1FBRXhCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxxQ0FBcUM7UUFDcEcsTUFBTSxjQUFjLEdBQUcsb0RBQVEsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRTNELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxhQUFhLEdBQUcsb0RBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRXRELElBQUksYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQ2xDLE9BQU8sQ0FBQyxLQUFhLENBQUMsUUFBUSxDQUFDLEVBQ2hDLGNBQWMsRUFDZCxRQUFRLEVBQ1IsT0FBTyxDQUNSLENBQUM7b0JBRUYsT0FBTyxJQUFJLDRDQUFFLENBQUMsSUFBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sb0RBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxJQUFJLG1EQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksNkNBQUcsQ0FBQztnQkFDYixPQUFPLEVBQUUseUJBQXlCO2dCQUNsQyxLQUFLLEVBQUUsYUFBYTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTlGLE9BQU8sSUFBSSw0Q0FBRSxDQUFDLElBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQUMsR0FBVyxFQUFFLFdBQXdCLEVBQUUsT0FBd0I7UUFDL0UsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLHFDQUFxQztRQUNwRyxNQUFNLGNBQWMsR0FBRyxvREFBUSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3RGLGlEQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUIsQ0FDakMsV0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsUUFBZ0IsRUFDaEIsT0FBWTtRQUVaLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzVCLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNwRCxJQUFJLE1BQU0sQ0FBQztRQUNYLHVDQUF1QztRQUN2QyxJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QixxQ0FBcUM7WUFDckMsTUFBTSxPQUFPLEdBQUcsb0RBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQ2pDLElBQUksRUFDSixPQUF5QixFQUN6QixjQUFjLEVBQ2QsUUFBUSxDQUNULENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2QsaURBQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FDbkMsUUFBUSxFQUNSLGNBQWMsRUFDZCxXQUFXLEVBQ1gsT0FBeUIsRUFDekIsY0FBYyxFQUNkLFFBQVEsQ0FDVCxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNkLGlEQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsY0FBbUIsRUFBRSxJQUFVLEVBQUUsT0FBWTtRQUN2RCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekUsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDM0QsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEYsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5RixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsY0FBYyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGlEQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixhQUFhLENBQUMsQ0FBQztnQkFDMUQsY0FBYyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQ3JCLFFBQWtCLEVBQ2xCLGNBQXVCLEVBQ3ZCLFdBQXdCLEVBQ3hCLE9BQXVCLEVBQ3ZCLGNBQThCLEVBQzlCLFFBQWdCO1FBRWhCLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDekQscUVBQXFFO1FBQ3JFLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDckYsTUFBTSxPQUFPLEdBQUcsb0RBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRS9FLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUVoRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixpREFBTSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQ25CLFFBQWMsRUFDZCxPQUF1QixFQUN2QixjQUE4QixFQUM5QixRQUFnQjtRQUVoQixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUVELE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUVoRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixpREFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFVBQVUsQ0FDUixVQUFrQyxFQUNsQyxRQUFnQixFQUNoQixRQUFjLEVBQ2QsT0FBdUI7UUFFdkIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRXBCLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUM7UUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsUUFBUSxDQUFDLElBQUksQ0FDWCxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFrQixDQUNwQixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFjLEVBQUUsT0FBdUI7UUFDdEQsUUFBUTtRQUNSLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QyxPQUFPO1FBQ1AsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhDLE9BQU87UUFDUCxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekMsV0FBVztRQUNYLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1QyxVQUFVO1FBQ1YsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNDLFFBQVE7UUFDUixJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekMsWUFBWTtRQUNaLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3QyxXQUFXO1FBQ1gsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLGFBQWE7UUFDYixJQUFJLENBQUMsOEJBQThCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELHlCQUF5QixDQUFDLFFBQWM7UUFDdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBTSxFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsUUFBYztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxZQUFZO1lBQ1osSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksd0NBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsQ0FBQztnQkFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLGVBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTztZQUNQLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVELE9BQU87WUFDUCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLElBQUksQ0FBQyxVQUFXLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxVQUFXLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxJQUFJLENBQUMsVUFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QyxDQUFDO1lBRUQsU0FBUztZQUNULElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELFNBQVM7WUFDVCxJQUNFLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDO2dCQUMxQixRQUFRLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQztnQkFDOUIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLENBQUMsRUFDbEQsQ0FBQztnQkFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztnQkFDM0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO29CQUN2QyxRQUFRLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQy9DLENBQUM7WUFDTixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxRQUFjO1FBQ3RDLE9BQU87UUFDUCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2xDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BFLENBQUM7Z0JBRUQsS0FBSyxNQUFNLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVyxFQUFFLENBQUM7b0JBQ2xELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3ZELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2hELFFBQVEsQ0FBQyxNQUFNLEdBQUc7d0JBQ2hCLGlCQUFpQixFQUFFLElBQUk7d0JBQ3ZCLGFBQWEsRUFBRSxhQUFhO3FCQUM3QixDQUFDO29CQUNGLFNBQVMsQ0FBQyxpQkFBa0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQ3pELENBQUM7Z0JBRUQsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUM5QixTQUFTLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUVELElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDOUIsU0FBUyxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7b0JBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN2QyxNQUFNLFVBQVUsR0FBRyxFQUE4QyxDQUFDO3dCQUNsRSxLQUFLLE1BQU0sYUFBYSxJQUFJLE1BQU0sRUFBRSxDQUFDOzRCQUNuQyxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDMUQsSUFBSSwyQkFBMkIsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQ0FDckMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dDQUNqRSxRQUFRLENBQUMsTUFBTSxHQUFHO29DQUNoQixpQkFBaUIsRUFBRSxJQUFJO29DQUN2QixhQUFhLEVBQUUsYUFBYTtpQ0FDN0IsQ0FBQztnQ0FDRixVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDOzRCQUN2QyxDQUFDO3dCQUNILENBQUM7d0JBQ0QsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLDhCQUE4QixDQUFDLFNBQWU7UUFDcEQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELDRCQUE0QixDQUFDLFFBQWM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQUUsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFL0MsV0FBVztRQUNYLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO29CQUNsQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDeEUsSUFBSSxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNoQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdkUsQ0FBQztvQkFDRCxNQUFNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDeEYsSUFBSSx3QkFBd0IsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN4Qyx3QkFBd0IsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdkYsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7Z0JBQzdDLElBQUksYUFBYSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzdCLGFBQWEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pFLENBQUM7Z0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ25ELElBQUksZ0JBQWdCLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBRUQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztnQkFDakQsSUFBSSxlQUFlLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsZUFBZSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFFRCxJQUNFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUM7b0JBQzdDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLGVBQWdCLENBQUMsZUFBZTtvQkFDdkQsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsZUFBZ0IsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUNuRSxDQUFDO29CQUNELFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLGVBQWdCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzFGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxRQUFjO1FBQ3hDLFVBQVU7UUFDVixJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsNkRBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNsQixPQUFPLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXBCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM5QixPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCLENBQUMsUUFBYztRQUN0QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFFcEQsNkRBQWEsQ0FDWCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMvRCxJQUFJLENBQUMsbUJBQW1CLENBQ3pCLENBQUM7b0JBRUYsK0RBQWUsQ0FDYixHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUFDO29CQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO29CQUN4QixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxRQUFjO1FBQzFDLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssTUFBTSxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM1QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekMsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFNUQsT0FBTyxDQUFDLE1BQU8sQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTyxDQUFDLElBQUssQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO2dCQUNELEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO3dCQUNwQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3BGLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDdEYsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDekQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQVMsQ0FBQzt3QkFDeEQsQ0FBQzt3QkFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDOzRCQUN4QyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFPLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO3dCQUNyRSxDQUFDO3dCQUNELElBQUksT0FBTyxDQUFDLE1BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQ3ZDLE1BQU0sa0JBQWtCLEdBQ3RCLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7NEJBQ3JGLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU8sQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQzt3QkFDckYsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxRQUFjO1FBQ3pDLFdBQVc7UUFDWCxLQUFLLE1BQU0sUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFDRCxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFdEUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixNQUFNLENBQUMsT0FBUSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEYsTUFBTSxDQUFDLE1BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsOEJBQThCLENBQUMsUUFBYztRQUMzQyxhQUFhO1FBQ2IsS0FBSyxNQUFNLFVBQVUsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsUUFBYyxFQUFFLFlBQWlCO1FBQ2xELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLFlBQVksWUFBWSxXQUFXLEVBQUUsQ0FBQztZQUN4QyxNQUFNLGVBQWUsR0FBRyxvREFBUSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25FLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxjQUFjLENBQ1osVUFBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsUUFBYyxFQUNkLE9BQXVCLEVBQ3ZCLFNBSUM7UUFFRCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztRQUVuQyxxQkFBcUI7UUFFckIscUNBQXFDO1FBQ3JDLG1DQUFtQztRQUNuQywrQkFBK0I7UUFFL0IsMENBQTBDO1FBQzFDLHNDQUFzQztRQUN0Qyx3SEFBd0g7UUFDeEgsbUpBQW1KO1FBQ25KLG9EQUFvRDtRQUNwRCxnQkFBZ0I7UUFDaEIsTUFBTTtRQUVOLG9DQUFvQztRQUVwQyx5QkFBeUI7UUFDekIsNkNBQTZDO1FBQzdDLHNEQUFzRDtRQUN0RCxxQ0FBcUM7UUFDckMscURBQXFEO1FBQ3JELHFGQUFxRjtRQUNyRixzREFBc0Q7UUFDdEQsa0JBQWtCO1FBQ2xCLFFBQVE7UUFDUixNQUFNO1FBRU4scUNBQXFDO1FBQ3JDLG9DQUFvQztRQUNwQyw2Q0FBNkM7UUFDN0Msc0VBQXNFO1FBQ3RFLHVGQUF1RjtRQUN2Rix3REFBd0Q7UUFDeEQscUJBQXFCO1FBQ3JCLFdBQVc7UUFDWCxTQUFTO1FBQ1QsYUFBYTtRQUNiLHdDQUF3QztRQUN4QyxvQ0FBb0M7UUFDcEMscURBQXFEO1FBQ3JELDhDQUE4QztRQUM5Qyx3REFBd0Q7UUFDeEQsMERBQTBEO1FBQzFELCtCQUErQjtRQUMvQixhQUFhO1FBQ2IsMENBQTBDO1FBRTFDLFlBQVk7UUFDWixVQUFVO1FBQ1YsU0FBUztRQUNULE1BQU07UUFDTixJQUFJO1FBRUoscUJBQXFCO1FBQ3JCLElBQUksY0FBc0MsQ0FBQztRQUMzQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZDLElBQUksUUFBa0IsQ0FBQztZQUN2QixJQUFJLFFBQWdCLENBQUM7WUFDckIsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxJQUFJLE9BQU8sVUFBVSxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDMUMsY0FBYyxHQUFHLElBQUksc0RBQVMsQ0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDaEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQ2xDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO29CQUMvQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsY0FBYyxHQUFHLElBQUksc0RBQVMsQ0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDaEUsTUFBTSxXQUFXLEdBQUcsb0RBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsR0FBSSxDQUFDLENBQUM7b0JBQ25FLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ25ELFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2hELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELGNBQWMsR0FBRyxJQUFJLHNEQUFTLENBQWMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUU7b0JBQ2hFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ25ELFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2hELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sY0FBYyxHQUFHLElBQUksc0RBQVMsQ0FDNUIsb0RBQVEsQ0FBQyxpQkFBaUIsQ0FDeEIsUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQ3pCLElBQUksRUFDSixDQUFDLE9BQWlCLEVBQUUsUUFBcUIsRUFBRSxFQUFFO29CQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM3QyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BCLENBQUMsRUFDRCxDQUFDLE1BQWdCLEVBQUUsS0FBVSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQ3JDLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFDRCxVQUFVLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQztZQUMxQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxFQUFtQixDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFjLENBQUM7WUFDbEQsc0RBQXNEO1lBQ3RELDJEQUEyRDtZQUUzRCxJQUFJLFFBQWdCLENBQUM7WUFFckIsSUFBSSxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVcsQ0FBQyxDQUFDO29CQUMvRCxXQUFXLEdBQUcsVUFBVSxDQUFDLFlBQWEsQ0FBQyxNQUFPLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsTUFBTSxlQUFlLEdBQUcsb0RBQVEsQ0FBQyxrQ0FBa0MsQ0FDakUsUUFBUSxFQUNSLFNBQVMsQ0FBQyxVQUFXLEVBQ3JCLFVBQVUsQ0FDWCxDQUFDO2dCQUNGLFFBQVEsR0FBRyxvREFBUSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsUUFBUyxDQUFDLENBQUM7WUFDN0YsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ25DLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM3QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM1QyxRQUFRLEdBQUcsb0RBQVEsQ0FBQyxnQ0FBZ0MsQ0FDbEQsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQzNCLFNBQVMsQ0FBQyxRQUFTLENBQ3BCLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDeEMsUUFBUSxHQUFHLFlBQVksQ0FBQztnQkFDMUIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsR0FBRyxRQUFRLEdBQUcsWUFBWSxDQUFDO2dCQUNyQyxDQUFDO1lBQ0gsQ0FBQztZQUVELG9GQUFvRjtZQUNwRiwyRUFBMkU7WUFDM0UsSUFBSTtZQUVKLE1BQU0sT0FBTyxHQUFHLG9EQUFRLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDeEYsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7Z0JBQ2hDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUNILHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDeEQsaURBQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxhQUFhLENBQ25CLFdBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLFFBQWdCLEVBQ2hCLE9BQVk7UUFFWixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDekQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FDekIsUUFBUSxFQUNSLE9BQXlCLEVBQ3pCLGNBQWMsRUFDZCxRQUFRLENBQ1QsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDZCxpREFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxXQUF3QjtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckYsSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksUUFBUSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0UsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTdDLE1BQU0sZ0JBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sbUJBQW1CLEdBQWEsRUFBRSxDQUFDO1FBQ3pDLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixDQUFDLEVBQUUsQ0FBQztnQkFDSixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdELE1BQU0sYUFBYSxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDL0UsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDO1lBRXBDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoRCxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUM7WUFDdEMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ2xDLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixZQUFZLElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGtCQUFrQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxrQkFBa0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMvRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdELE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDckUsTUFBTSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLGNBQWM7Z0JBQ3RELENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLGtCQUFrQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM1RCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNsRixNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFN0IsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxNQUFvQixFQUNwQixTQUFpQixFQUNqQixjQUF3QixFQUN4QixtQkFBNkI7UUFFN0IsTUFBTSxJQUFJLEdBQVE7WUFDaEIsS0FBSyxFQUFFO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2FBQ2Y7WUFDRCxjQUFjLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUN2QyxrQkFBa0IsRUFBRSxDQUFDLHFCQUFxQixDQUFDO1lBQzNDLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsQ0FBQztpQkFDUjthQUNGO1lBQ0QsTUFBTSxFQUFFO2dCQUNOO29CQUNFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDWDthQUNGO1lBQ0QsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxzQkFBc0I7b0JBQzVCLG9CQUFvQixFQUFFO3dCQUNwQixlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7cUJBQ3RDO29CQUNELFVBQVUsRUFBRTt3QkFDVixtQkFBbUIsRUFBRSxFQUFFO3FCQUN4QjtpQkFDRjthQUNGO1NBQ0YsQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsa0NBQWtDLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTdDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQW9CLEVBQUUsSUFBUztRQUN4RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQzVDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUNoQjtvQkFDRSxJQUFJLEVBQUUsT0FBTztvQkFDYixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQzdCLEdBQUcsRUFBRSxHQUFHO2lCQUNUO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsaURBQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsV0FBd0I7UUFDbkQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQztZQUMzRSxNQUFNLEVBQUUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBRTVCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDO1lBQ0YsRUFBRSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDO1lBQ0YsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQ0FBa0MsQ0FDeEMsU0FBaUIsRUFDakIsY0FBd0IsRUFDeEIsbUJBQTZCLEVBQzdCLElBQVM7UUFFVCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXZCLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGlCQUFpQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDdEYsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFL0MsSUFBSSxJQUFJLENBQUM7WUFDVCxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxHQUFHLFFBQVEsQ0FBQztZQUNsQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxHQUFHLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDakMsQ0FBQztZQUVELElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsSUFBSSxFQUFFLGNBQWMsR0FBRyxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQzlDLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVztvQkFDaEMsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLElBQUksRUFBRSxJQUFJO29CQUNWLFVBQVUsRUFBRSxpQkFBaUI7b0JBQzdCLFVBQVUsRUFBRSxvQkFBb0I7aUJBQ2pDLENBQUMsQ0FBQztnQkFFSCxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDbEMsb0JBQW9CLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixvQkFBb0IsSUFBSSxTQUFTLEdBQUcsZUFBZSxHQUFHLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztnQkFFRCxDQUFDLEVBQUUsQ0FBQztnQkFDSixJQUFJLGFBQWEsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUVELFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO2dCQUMvQixJQUFJLEVBQUUsYUFBYSxHQUFHLGFBQWE7Z0JBQ25DLE1BQU0sRUFBRSxDQUFDO2dCQUNULFVBQVUsRUFBRSxvQkFBb0I7Z0JBQ2hDLFVBQVUsRUFBRSxzQkFBc0I7Z0JBQ2xDLFVBQVUsRUFBRSxlQUFlLEdBQUcsQ0FBQztnQkFDL0IsTUFBTSxFQUFFLEtBQUssRUFBRSxrQkFBa0I7YUFDbEMsQ0FBQztZQUNGLHNCQUFzQixJQUFJLG9CQUFvQixDQUFDO1FBQ2pELENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDcEMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLGNBQXdCLEVBQUUsSUFBUztRQUMzRCxNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFFM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMvQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixDQUFDO2lCQUFNLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQVE7WUFDaEIsSUFBSSxFQUFFLFdBQVc7WUFDakIsVUFBVSxFQUFFO2dCQUNWO29CQUNFLElBQUksRUFBRSxDQUFDO29CQUNQLFFBQVEsRUFBRSxDQUFDO29CQUNYLFVBQVUsRUFBRSxVQUFVO2lCQUN2QjthQUNGO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxHQUFXO1FBQzNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sb0RBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsMkJBQTJCO0lBQ25CLHdCQUF3QixDQUFDLFdBQXdCO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRixJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksYUFBYSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLHlCQUF5QixHQUErQixFQUFFLENBQUM7UUFDakUsTUFBTSxrQkFBa0IsR0FBZ0QsRUFBRSxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFzQixFQUFFLENBQUM7UUFFekMsSUFBSSxDQUFDLGNBQWMsQ0FDakIsS0FBSyxFQUNMLE9BQU8sRUFDUCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUNsQixVQUFVLENBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQ2QsS0FBSyxFQUNMLE9BQU8sRUFDUCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUNsQixVQUFVLENBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLENBQ2YsS0FBSyxFQUNMLE9BQU8sRUFDUCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUNsQixVQUFVLENBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsS0FBSyxFQUNMLE9BQU8sRUFDUCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUNsQixVQUFVLENBQ1gsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLDBEQUFTLENBQUMsZUFBZSxDQUFDO1lBQzFDLGtCQUFrQixFQUFFLGtCQUFrQjtZQUN0QyxVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsbUVBQWMsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakQsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUM7WUFDRixhQUFhLEVBQUUscUVBQWEsQ0FBQyxNQUFNO1NBQ3BDLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU3QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sNEJBQTRCLENBQUMsS0FBVSxFQUFFLE9BQVksRUFBRSxXQUF3QjtRQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsSUFBSSxhQUFhLENBQUM7UUFDbEIsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxZQUFZLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNDLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSSxZQUFZLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlDLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxjQUFjLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDO1lBQzFDLGlEQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxhQUFhLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLFFBQVE7UUFFbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksUUFBUSxHQUFHLG1CQUFtQixDQUFDO1lBQ25DLFFBQVEsSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkMsaURBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sS0FBSyxDQUFDLENBQUM7UUFDaEIsQ0FBQztRQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEIsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FDcEIsS0FBVSxFQUNWLE9BQVksRUFDWixhQUFrQixFQUNsQix5QkFBcUQsRUFDckQsa0JBQStELEVBQy9ELFVBQTZCO1FBRTdCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RSxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN2RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXJGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO1FBQ3pELENBQUM7UUFFRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMseUVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzQixLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLFdBQVcsQ0FDakIsS0FBVSxFQUNWLE9BQVksRUFDWixhQUFrQixFQUNsQix5QkFBcUQsRUFDckQsa0JBQStELEVBQy9ELFVBQTZCO1FBRTdCLGtDQUFrQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04seUNBQXlDO1lBRXpDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXJGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM3QyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN2QixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQztZQUNILENBQUM7WUFFRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMseUVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV4QixLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDaEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQ2xCLEtBQVUsRUFDVixPQUFZLEVBQ1osYUFBa0IsRUFDbEIseUJBQXFELEVBQ3JELGtCQUErRCxFQUMvRCxVQUE2QjtRQUU3QixtQ0FBbUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLDBDQUEwQztZQUUxQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN0RSxNQUFNLGdCQUFnQixHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUVyRixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0MsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDdkQsQ0FBQztZQUNELHlCQUF5QixDQUFDLElBQUksQ0FBQyx5RUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELGtCQUFrQixDQUFDLElBQUksQ0FBQyx5RUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXpCLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNoQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixLQUFVLEVBQ1YsT0FBWSxFQUNaLGFBQWtCLEVBQ2xCLHlCQUFxRCxFQUNyRCxrQkFBK0QsRUFDL0QsVUFBNkI7UUFFN0IsK0NBQStDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RSxJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzdFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1RCxPQUFPLENBQUMsNkJBQTZCLENBQ25DLGFBQWEsRUFDYixpQkFBaUIsRUFDakIscUJBQXFCLENBQ3RCLENBQUM7WUFFRixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0MsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDOUQsQ0FBQztZQUNELHlCQUF5QixDQUFDLElBQUksQ0FBQyx5RUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELGtCQUFrQixDQUFDLElBQUksQ0FBQyx5RUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTNCLEtBQUssQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNyQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMXJDMkM7QUFDbUM7QUFFeEUsU0FBUywwQkFBMEIsQ0FBQyxLQUFtQztJQUM1RSxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzdCLE1BQU0sYUFBYSxHQUFHLG9EQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRELElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sc0VBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU8sc0VBQVEsQ0FBQyxVQUFVLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU8sc0VBQVEsQ0FBQyxHQUFHLENBQUM7UUFDdEIsQ0FBQzthQUFNLElBQUksYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU8sc0VBQVEsQ0FBQyxLQUFLLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLHNFQUFRLENBQUMsT0FBTyxDQUFDO0FBQzFCLENBQUM7QUFFTSxTQUFTLGlCQUFpQixDQUFDLEdBQVc7SUFDM0MsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUU5QyxJQUFJLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM1QixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO1NBQU0sSUFBSSxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztTQUFNLElBQUksYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ25DLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztJQUVqQixVQUFVO0lBQ1YsK0NBQStDO0lBQy9DLDRDQUE0QztJQUM1QyxvQ0FBb0M7SUFDcEMsdUNBQXVDO0lBQ3ZDLHNEQUFzRDtJQUN0RCx3Q0FBd0M7SUFDeEMsMkJBQTJCO0lBQzNCLE1BQU07SUFDTixLQUFLO0FBQ1AsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsV0FBd0I7SUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsY0FBYztJQUNkLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXBELHVDQUF1QztJQUN2QyxJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN6Qiw4Q0FBOEM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsb0RBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsUUFBYTtJQUNyQyxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDbEIsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0UyQztBQUVxQjtBQUNqQztBQUNpQjtBQUVPO0FBQ2hCO0FBSXhDOztHQUVHO0FBQ0ksTUFBTSxhQUFhO0lBQ3hCLGdCQUF1QixDQUFDO0lBRXhCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQy9CLEdBQVcsRUFDWCxPQUF3Qjs7UUFFeEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxvREFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNELElBQUksbURBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSw2Q0FBRyxDQUFDO2dCQUNiLE9BQU8sRUFBRSx3QkFBd0I7Z0JBQ2pDLEtBQUssRUFBRSxTQUFTO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FDeEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUNuQixhQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsS0FBSyxtQ0FBSSxFQUFFLEVBQ3BCLE9BQU8sRUFDUCxHQUFHLENBQ0osQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUN4QyxLQUFzQixFQUN0QixPQUF3QjtRQUV4QixLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sYUFBYSxHQUFHLG9EQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXRELElBQUksYUFBYSxLQUFLLE1BQU0sSUFBSSxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzVGLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLDZDQUFHLENBQUM7WUFDYixPQUFPLEVBQUUsMkJBQTJCO1lBQ3BDLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDbEQsV0FBd0IsRUFDeEIsVUFBMkIsRUFDM0IsT0FBd0IsRUFDeEIsR0FBWTtRQUVaLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLHVDQUF1QztRQUN2QyxJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QixxQ0FBcUM7WUFDckMsTUFBTSxPQUFPLEdBQUcsb0RBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pFLE9BQU8sSUFBSSw0Q0FBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sSUFBSSw2Q0FBRyxDQUFDO29CQUNiLE9BQU8sRUFBRSx5QkFBeUI7b0JBQ2xDLEtBQUssRUFBRSxTQUFTO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBUSxDQUFDLENBQUM7Z0JBQzFFLE9BQU8sSUFBSSw0Q0FBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sSUFBSSw2Q0FBRyxDQUFDO29CQUNiLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLEtBQUssRUFBRSxTQUFTO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUNoQixjQUE4QixFQUM5QixJQUFVLEVBQ1YsT0FBdUI7O1FBRXZCLElBQUksaUJBQUksQ0FBQyxLQUFLLDBDQUFFLE1BQU0sMENBQUUsZUFBZSxLQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hELEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzFELGNBQXNCLENBQUMsVUFBa0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtxQkFDNUUsZUFBZSxDQUFDLFVBQWtDLENBQVEsQ0FBQztZQUNoRSxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsY0FBc0IsQ0FBQyxVQUFrQyxDQUFDLEdBQUcsT0FBTyxDQUNuRSxVQUFrQyxDQUM1QixDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5RixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsY0FBYyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGdEQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixhQUFhLENBQUMsQ0FBQztnQkFDMUQsY0FBYyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FDckIsV0FBd0IsRUFDeEIsS0FBc0IsRUFDdEIsT0FBdUI7UUFFdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MscUVBQXFFO1FBQ3JFLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDckYsTUFBTSxPQUFPLEdBQUcsb0RBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcsb0RBQVEsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzNELE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsR0FBRyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUvRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFlBQWEsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFFaEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsZ0RBQU0sQ0FBQyxJQUFJLENBQUMsOENBQThDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FDN0IsUUFBYyxFQUNkLGdCQUFpQyxFQUNqQyxPQUF1QixFQUN2QixHQUFZLEVBQ1osUUFBNEI7UUFFNUIsTUFBTSxRQUFRLEdBQUcsSUFBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFHLEdBQUcsQ0FBQyxDQUFDLHFDQUFxQztRQUN0RyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLG9EQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFlBQWEsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFFaEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLGdEQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FDZixRQUFjLEVBQ2QsS0FBc0IsRUFDdEIsT0FBdUIsRUFDdkIsZUFBNEIsRUFDNUIsUUFBaUIsRUFDakIsUUFBNEI7UUFFNUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRXBCLDRDQUE0QztRQUM1QyxRQUFRLENBQUMsSUFBSSxDQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZ0IsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQ3BGLENBQUM7UUFFRixrQkFBa0I7UUFDbEIsUUFBUSxDQUFDLElBQUksQ0FDWCxJQUFJLHNEQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQW9CLENBQ3RCLENBQUM7UUFFRixPQUFPLHNEQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBYztRQUNwQyxRQUFRO1FBQ1IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLE9BQU87UUFDUCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEMsT0FBTztRQUNQLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QyxXQUFXO1FBQ1gsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLFVBQVU7UUFDVixJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0MsUUFBUTtRQUNSLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QyxZQUFZO1FBQ1osSUFBSSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLFdBQVc7UUFDWCxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUMsYUFBYTtRQUNiLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLFFBQWM7UUFDN0MsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsSUFBSSx3Q0FBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDckMsS0FBSyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQU0sRUFBRSxDQUFDO2dCQUM3QixLQUFLLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxRQUFjOztRQUM1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxZQUFZO1lBQ1osSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFJLENBQUMsZUFBZSxtQ0FBSSxFQUFFLENBQUM7WUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM5QixJQUFJLENBQUMsZUFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU87WUFDUCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxPQUFPO1lBQ1AsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBSSxDQUFDLFVBQVUsMENBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLFVBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO29CQUMvQixDQUFDO29CQUVELElBQUksQ0FBQyxVQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQztZQUVELFNBQVM7WUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxTQUFTO1lBQ1QsSUFDRSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQztnQkFDMUIsUUFBUSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUM7Z0JBQzlCLFFBQVEsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDLEVBQ2xELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBQzNGLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsS0FBSztvQkFDdkMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUMvQyxDQUFDO1lBQ04sQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLFFBQWM7O1FBQzdDLE9BQU87UUFDUCxJQUFJLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsU0FBUyxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEUsQ0FBQztnQkFFRCxJQUFJLGdCQUFTLENBQUMsVUFBVSwwQ0FBRSxzQkFBc0IsS0FBSSxJQUFJLEVBQUUsQ0FBQztvQkFDekQsU0FBUyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7b0JBQ3RFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDO29CQUN6RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQWtCLEVBQUUsRUFBRTs0QkFDM0QsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUN2QyxDQUFDLENBQUMsQ0FBQzt3QkFFSCxNQUFNLGVBQWUsR0FBRzs0QkFDdEIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzs0QkFDcEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFROzRCQUMxQixRQUFRLEVBQUUsUUFBUTt5QkFDbkIsQ0FBQzt3QkFFRixTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNuRCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsU0FBUyxDQUFDLGlCQUFpQixHQUFHLEVBRTdCLENBQUM7Z0JBQ0YsS0FBSyxNQUFNLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3ZELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVyxDQUFDLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxNQUFNLEdBQUc7d0JBQ2hCLGlCQUFpQixFQUFFLElBQUk7d0JBQ3ZCLGFBQWEsRUFBRSxhQUFhO3FCQUM3QixDQUFDO29CQUNGLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQ3hELENBQUM7Z0JBRUQsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUM5QixTQUFTLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUVELElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDOUIsU0FBUyxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7b0JBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN2QyxNQUFNLFVBQVUsR0FBRyxFQUE4QyxDQUFDO3dCQUNsRSxLQUFLLE1BQU0sYUFBYSxJQUFJLE1BQU0sRUFBRSxDQUFDOzRCQUNuQyxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDMUQsSUFBSSwyQkFBMkIsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQ0FDckMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dDQUNqRSxRQUFRLENBQUMsTUFBTSxHQUFHO29DQUNoQixpQkFBaUIsRUFBRSxJQUFJO29DQUN2QixhQUFhLEVBQUUsYUFBYTtpQ0FDN0IsQ0FBQztnQ0FDRixVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDOzRCQUN2QyxDQUFDO3dCQUNILENBQUM7d0JBQ0QsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxTQUFlO1FBQzNELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsNEJBQTRCLENBQUMsUUFBYztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFBRSxRQUFRLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUUvQyxXQUFXO1FBQ1gsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzFDLElBQUksUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDO29CQUN4RSxJQUFJLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2hDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2RSxDQUFDO29CQUNELE1BQU0sd0JBQXdCLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLHdCQUF3QixDQUFDO29CQUN4RixJQUFJLHdCQUF3QixLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ3hDLHdCQUF3QixDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2RixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztnQkFDN0MsSUFBSSxhQUFhLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsYUFBYSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakUsQ0FBQztnQkFFRCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbkQsSUFBSSxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztnQkFFRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUNqRCxJQUFJLGVBQWUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQixlQUFlLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO2dCQUVELElBQ0UsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFFBQVEsQ0FBQztvQkFDN0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsZUFBZ0IsQ0FBQyxlQUFlO29CQUN2RCxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxlQUFnQixDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQ25FLENBQUM7b0JBQ0QsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsZUFBZ0IsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDMUYsQ0FBQztnQkFFRCxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUNsQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUN2QyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7d0JBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO3dCQUM3RSxJQUFJLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ2hDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN2RSxDQUFDO3dCQUNELE1BQU0seUJBQXlCLEdBQzdCLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyx5QkFBeUIsQ0FBQzt3QkFDL0QsSUFBSSx5QkFBeUIsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUN6Qyx5QkFBeUIsQ0FBQyxPQUFPO2dDQUMvQixRQUFRLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN2RCxDQUFDO3dCQUNELE1BQU0sc0JBQXNCLEdBQzFCLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDNUQsSUFBSSxzQkFBc0IsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUN0QyxzQkFBc0IsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDbkYsQ0FBQztvQkFDSCxDQUFDO29CQUNELElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQzt3QkFDcEQsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsMEJBQTBCLENBQUMsbUJBQW1CLENBQUM7d0JBQ3RGLElBQUksbUJBQW1CLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDbkMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzdFLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7d0JBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDO3dCQUMxRSxJQUFJLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ2hDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN2RSxDQUFDO29CQUNILENBQUM7b0JBQ0QsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO3dCQUM3QyxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDM0UsSUFBSSxpQkFBaUIsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUNqQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekUsQ0FBQzt3QkFDRCxNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQzt3QkFDbkYsSUFBSSxxQkFBcUIsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUNyQyxxQkFBcUIsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDakYsQ0FBQztvQkFDSCxDQUFDO29CQUNELElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQzt3QkFDaEQsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQzt3QkFDMUUsSUFBSSxlQUFlLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDL0IsZUFBZSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDckUsQ0FBQzt3QkFDRCxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDcEYsSUFBSSxvQkFBb0IsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUNwQyxvQkFBb0IsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0UsQ0FBQztvQkFDSCxDQUFDO29CQUNELElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQzt3QkFDbkQsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUM7d0JBQ25GLElBQUksa0JBQWtCLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDbEMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzNFLENBQUM7d0JBQ0QsTUFBTSwyQkFBMkIsR0FDL0IsVUFBVSxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixDQUFDO3dCQUNuRSxJQUFJLDJCQUEyQixLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQzNDLDJCQUEyQixDQUFDLE9BQU87Z0NBQ2pDLFFBQVEsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3pELENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7d0JBQ2xELE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDO3dCQUNoRixJQUFJLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ2pDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6RSxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxRQUFjOztRQUMvQyxVQUFVO1FBQ1YsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLDZEQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUV0RixJQUFJLG9CQUFPLENBQUMsVUFBVSwwQ0FBRSxrQkFBa0IsMENBQUUsTUFBTSxLQUFJLElBQUksRUFBRSxDQUFDO29CQUMzRCxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQzNFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFnQixDQUFDO29CQUN4RSxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO3FCQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU8sQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLFFBQWM7UUFDN0MsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUyxDQUFDLENBQUM7Z0JBRXJELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQyxDQUFDO2dCQUUvRSxJQUFJLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFFBQWM7UUFDakQsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsS0FBSyxNQUFNLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVDLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUM5QixPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUM1RCxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSyxDQUFDLENBQUM7d0JBQ2pFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFNLENBQUMsQ0FBQzt3QkFDckYsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU8sQ0FBQyxDQUFDO3dCQUN2RixJQUFJLHdDQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7NEJBQzVELE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFTLENBQUM7d0JBQ3hELENBQUM7d0JBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDdEMsSUFBSSxrQkFBa0IsR0FDcEIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQzs0QkFDckYsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQ0FDMUQsMkRBQTJEO2dDQUMzRCxrREFBa0Q7Z0NBQ2xELHdEQUF3RDtnQ0FDeEQsa0JBQWtCO29DQUNoQixPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLO3dDQUN4QyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLO3dDQUN2QyxDQUFDLENBQUM7NEJBQ04sQ0FBQzs0QkFDRCxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFPLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7d0JBQ3JGLENBQUM7d0JBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQzs0QkFDdkMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzt3QkFDckUsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsNEJBQTRCLENBQUMsUUFBYztRQUNoRCxXQUFXO1FBQ1gsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUMsSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNoQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUVELElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDbEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsOEJBQThCLENBQUMsUUFBYztRQUNsRCxhQUFhO1FBQ2IsS0FBSyxNQUFNLFVBQVUsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWMsRUFBRSxZQUEyQztRQUNuRixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxZQUFZLFlBQVksV0FBVyxFQUFFLENBQUM7WUFDeEMsTUFBTSxlQUFlLEdBQUcsb0RBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQzlCLENBQUM7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FDbkIsZUFBMkIsRUFDM0IsUUFBYyxFQUNkLEtBQXNCLEVBQ3RCLE9BQXVCLEVBQ3ZCLFFBQWlCLEVBQ2pCLFFBQTRCOztRQUU1QixNQUFNLHVCQUF1QixHQUF5QyxFQUFFLENBQUM7UUFFekUscUJBQXFCO1FBQ3JCLElBQUksY0FBc0MsQ0FBQztRQUMzQyxLQUFLLE1BQU0sVUFBVSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDbEIsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUVELElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMxQyxjQUFjLEdBQUcsSUFBSSxzREFBUyxDQUFjLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3RELFVBQVUsQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDO29CQUNwQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsY0FBYyxHQUFHLElBQUksc0RBQVMsQ0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN0RCxNQUFNLFdBQVcsR0FBRyxvREFBUSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxHQUFJLENBQUMsQ0FBQztvQkFDbkUsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDaEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxjQUFjLEdBQUcsSUFBSSxzREFBUyxDQUFjLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3RELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQy9ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFTLENBQUMsQ0FBQztvQkFDckMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDaEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixjQUFjLEdBQUcsSUFBSSxzREFBUyxDQUM1QixvREFBUSxDQUFDLGlCQUFpQixDQUN4QixRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFDekIsSUFBSSxFQUNKLENBQUMsT0FBaUIsRUFBRSxRQUFxQixFQUFFLEVBQUU7b0JBQzNDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEIsQ0FBQyxFQUNELENBQUMsTUFBZ0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtvQkFDbEMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLENBQ0YsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUNELFVBQVUsQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDO1lBQzFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLEtBQUssTUFBTSxTQUFTLElBQUksY0FBUSxDQUFDLE1BQU0sbUNBQUksRUFBRSxFQUFFLENBQUM7WUFDOUMsSUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUMxQixJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLE1BQU07b0JBQ04sb0NBQW9DO29CQUNwQyxNQUFNLGVBQWUsR0FBRyxvREFBUSxDQUFDLGtDQUFrQyxDQUNqRSxRQUFRLEVBQ1IsU0FBUyxDQUFDLFVBQVcsRUFDckIsZUFBZSxDQUNoQixDQUFDO29CQUNGLE1BQU0sUUFBUSxHQUFHLG9EQUFRLENBQUMsZ0NBQWdDLENBQ3hELGVBQWUsRUFDZixTQUFTLENBQUMsUUFBUyxDQUNwQixDQUFDO29CQUNGLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDaEYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFdBQVc7b0JBQ1gsb0NBQW9DO29CQUNwQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFXLENBQUMsQ0FBQztvQkFDbkUsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztvQkFDL0MsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQzt3QkFDN0IsZ0RBQU0sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQzt3QkFDdkQsU0FBUztvQkFDWCxDQUFDO29CQUVELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUF1QyxDQUFDO29CQUV6RSxNQUFNLDJCQUEyQixHQUFHLElBQUksc0RBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO3dCQUM1RCxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBd0IsRUFBRSxFQUFFOzRCQUM5QyxNQUFNLGVBQWUsR0FBRyxvREFBUSxDQUFDLGtDQUFrQyxDQUNqRSxRQUFRLEVBQ1IsU0FBUyxDQUFDLFVBQVcsRUFDckIsV0FBVyxDQUNaLENBQUM7NEJBQ0YsTUFBTSxRQUFRLEdBQUcsb0RBQVEsQ0FBQyxnQ0FBZ0MsQ0FDeEQsZUFBZSxFQUNmLFNBQVMsQ0FBQyxRQUFTLENBQ3BCLENBQUM7NEJBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0NBQ3hELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDdkIsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUEyQixDQUFDO29CQUU3QixNQUFNLGtCQUFrQixHQUFXLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbEYsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsR0FBRywyQkFBMkIsQ0FBQztvQkFDMUUsVUFBVSxDQUFDLGFBQWEsR0FBRywyQkFBMkIsQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTix3QkFBd0I7Z0JBQ3hCLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ25DLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUUvQyxJQUFJLFFBQVEsQ0FBQztnQkFDYixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3RELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQy9ELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFTLENBQUMsQ0FBQztvQkFDckMsUUFBUSxHQUFHLG9EQUFRLENBQUMsZ0NBQWdDLENBQ2xELElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUMzQixTQUFTLENBQUMsUUFBUyxDQUNwQixDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3hDLFFBQVEsR0FBRyxZQUFZLENBQUM7Z0JBQzFCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixRQUFRLEdBQUcsUUFBUSxHQUFHLFlBQVksQ0FBQztnQkFDckMsQ0FBQztnQkFFRCx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDaEYsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLHNEQUFTLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3pFLGdEQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxZQUEwQyxFQUFFLFFBQWdCO1FBQzVGLEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLE1BQU0sQ0FBQyx1QkFBdUIsQ0FDcEMsWUFBMEMsRUFDMUMsUUFBZ0I7UUFFaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN0QixPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxjQUFjLENBQzNCLFFBQWdCLEVBQ2hCLFNBQW9CLEVBQ3BCLEtBQXNCOztRQUV0QixJQUFJLGdCQUFzQyxDQUFDO1FBQzNDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdCLDJCQUEyQjtZQUMzQixnQkFBZ0IsR0FBRyxJQUFJLHNEQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0MsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNsRCxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUMxQyxTQUFTLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQzt3QkFDN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNyQixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksZUFBUyxDQUFDLEdBQUcsMENBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDMUMsb0NBQW9DO1lBQ3BDLGdCQUFnQixHQUFHLElBQUksc0RBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMzQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQ0wsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNuQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLEVBQ3JFLENBQUM7WUFDRCwrREFBK0Q7WUFDL0QsZ0JBQWdCLEdBQUcsSUFBSSxzREFBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDbEQsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDMUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7d0JBQzVCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDckIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLGVBQVMsQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3pDLG1DQUFtQztZQUNuQyxnQkFBZ0IsR0FBRyxJQUFJLHNEQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0MsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sZ0JBQWdCLEdBQUcsb0RBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVMsQ0FBQyxDQUFDLElBQUksQ0FDaEYsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDUixLQUFLLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztnQkFDaEMsU0FBUyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyMEI2RDtBQUNkO0FBRUU7QUFDYztBQUNaO0FBQ0E7QUFDUjtBQUNPO0FBSUg7QUFDdUM7QUFDM0M7QUFFNUM7O0dBRUc7QUFDSSxNQUFNLFlBQVk7SUFDdkIsZ0JBQXVCLENBQUM7SUFFeEI7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUN4QixHQUFXLEVBQ1gsT0FBd0IsRUFDeEIsUUFBNEI7O1FBRTVCLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRDLE1BQU0sWUFBWSxHQUFHLGNBQU8sQ0FBQyxVQUFVLDBDQUFFLFlBQVksS0FBSSxFQUFFLENBQUM7UUFDNUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSw0REFBVSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxvREFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNELElBQUksbURBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSw2Q0FBRyxDQUFDO2dCQUNiLE9BQU8sRUFBRSw4QkFBOEI7Z0JBQ3ZDLEtBQUssRUFBRSxhQUFhO2FBQ3JCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLENBQUMsS0FBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUxQyxNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFeEYsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0UsT0FBTyxJQUFJLDRDQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUNqQyxLQUFzQixFQUN0QixPQUF3QixFQUN4QixRQUE0Qjs7UUFFNUIsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEMsTUFBTSxZQUFZLEdBQUcsY0FBTyxDQUFDLFVBQVUsMENBQUUsWUFBWSxLQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLDREQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdCLHNDQUFzQztZQUN0QyxNQUFNLGFBQWEsR0FBRyxvREFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxpQ0FBaUM7WUFDakMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQzFDLFFBQVEsRUFDUixZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLENBQ1QsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFN0UsT0FBTyxJQUFJLDRDQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBd0I7UUFDbkQsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEIsT0FBTyxHQUFHLG9EQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUVELEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ25DLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQztvQkFDL0MsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDeEUsT0FBTyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLDRCQUE0QjtnQkFDNUIsSUFBSSxPQUFPLENBQUMsa0NBQW1DLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUN4RSxPQUFPLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sTUFBTSxDQUFDLDZCQUE2QixDQUMxQyxZQUEwQixFQUMxQixPQUF1Qjs7UUFFdkIsTUFBTSxVQUFVLEdBQUcsYUFBTyxDQUFDLFVBQVUsbUNBQUksSUFBSSw0REFBVSxFQUFFLENBQUM7UUFFMUQsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQzdDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQy9CLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsYUFBcUI7UUFDckQsSUFDRSxhQUFhLEtBQUssTUFBTTtZQUN4QixhQUFhLEtBQUssS0FBSztZQUN2QixhQUFhLEtBQUssS0FBSztZQUN2QixhQUFhLEtBQUssS0FBSyxFQUN2QixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQXdCO1FBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzVCLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNwRCxJQUFJLE1BQU0sQ0FBQztRQUNYLG1EQUFtRDtRQUNuRCxJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsY0FBMkI7UUFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDckQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFzQjs7UUFDcEQsSUFBSSxhQUFDLFFBQWlCLENBQUMsS0FBSywwQ0FBRSxPQUFPLDBDQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBSyxHQUFHLEVBQUUsQ0FBQztZQUN6RCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQ3BELFFBQWdCLEVBQ2hCLFlBQTBCLEVBQzFCLE9BQXVCLEVBQ3ZCLEdBQVcsRUFDWCxRQUE0QjtRQUU1QixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUV4RixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztRQUNuRCxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssMkRBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLE9BQU8sR0FBRyxvREFBUSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLFFBQVEsR0FBRyx5REFBYSxDQUFDO2dCQUMvQixNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQzFDLElBQUksRUFDSixPQUFPLENBQUMsS0FBTSxFQUNkLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxDQUNULENBQUM7Z0JBQ0YsTUFBTSxTQUFTLEdBQUcsMkRBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO2dCQUNqQyxPQUFPLElBQUksNENBQUUsRUFBRSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxLQUFLLDJEQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDekIsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sUUFBUSxHQUFHLHlEQUFhLENBQUM7Z0JBQy9CLE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLEtBQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDdEYsTUFBTSxTQUFTLEdBQUcsMkRBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO2dCQUNoQyxPQUFPLElBQUksNENBQUUsRUFBRSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxLQUFLLDJEQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxRQUFRLEdBQUcseUVBQXFCLENBQUMsV0FBVyxFQUEyQixDQUFDO2dCQUM5RSxNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxJQUFJLDZDQUFHLENBQUM7d0JBQ2IsT0FBTyxFQUFFLHFDQUFxQzt3QkFDOUMsS0FBSyxFQUFFLFNBQVM7cUJBQ2pCLENBQUMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7b0JBQ2pDLE1BQU0sU0FBUyxHQUFHLDJEQUFjLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3JFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxPQUFPLElBQUksNENBQUUsRUFBRSxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssMkRBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixPQUFPLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSx5REFBYSxDQUFDLGdDQUFnQyxDQUNqRSxlQUFlLEVBQ2YsT0FBTyxDQUFDLEtBQU0sRUFDZCxPQUFPLENBQ1IsQ0FBQztnQkFFRixJQUFJLGtEQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUMvQixJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUN0RCxPQUFPLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzt3QkFDaEMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsZUFBZ0IsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO3dCQUNqRSxPQUFPLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQzt3QkFDaEMsTUFBTSxzREFBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ3pELENBQUM7eUJBQU0sSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDeEQsT0FBTyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7d0JBQ2pDLE1BQU0seURBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUM3RCxDQUFDO29CQUNELE9BQU8sSUFBSSw0Q0FBRSxFQUFFLENBQUM7Z0JBQ2xCLENBQUM7cUJBQU0sQ0FBQztvQkFDTix5REFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNwQixPQUFPLElBQUksNkNBQUcsQ0FBQzt3QkFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU87d0JBQ3BDLEtBQUssRUFBRSxTQUFTO3FCQUNqQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFDRDtnQkFDRSxPQUFPLElBQUksNkNBQUcsQ0FBQztvQkFDYixPQUFPLEVBQUUsdUJBQXVCO29CQUNoQyxLQUFLLEVBQUUsU0FBUztpQkFDakIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsNEJBQTRCLENBQ3pDLFFBQWdCLEVBQ2hCLE9BQXVCLEVBQ3ZCLGdCQUF5QjtRQUV6QixJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE9BQU8sMkRBQVEsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sUUFBUSxHQUFHLDJFQUEwQixDQUFDO2dCQUMxQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFNLENBQUMsUUFBUSxDQUFDO2FBQ3JDLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FFbFQyRDtBQUNLO0FBQ3ZCO0FBQ007QUFDSjtBQUNNO0FBQ1I7QUFDbUI7QUFDSTtBQUNKO0FBSXJCO0FBQ2U7QUFDVDtBQUNKO0FBQ3NDO0FBQ0Q7QUFDbkM7QUFDaUM7QUFDeEI7QUFDTTtBQU1qQjtBQUVpQjtBQUVuQjtBQUNnQjtBQUNIO0FBMkJiO0FBQ2E7QUFDQztBQUVkO0FBQzJCO0FBQ1c7QUFDOUM7QUFDWTtBQUVxRDtBQVFkO0FBQ2Y7QUFHRTtBQUVaO0FBQ1o7QUFDaUQ7QUFDaEI7QUFDQTtBQUNMO0FBQ0c7QUFDckM7QUFJeEM7O0dBRUc7QUFDSSxNQUFNLGNBQWM7SUFDekIsZ0VBQWdFO0lBQ2hFLGdCQUF1QixDQUFDO0lBRWhCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFlO1FBQ2xELE1BQU0sTUFBTSxHQUFHLDRGQUFpQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBeUIsRUFBRSxTQUFlO1FBQy9ELE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDakIsR0FBRyxFQUFFLFlBQVk7WUFDakIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLFFBQVM7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNqQixHQUFHLEVBQUUsbUJBQW1CO1lBQ3hCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxPQUFRO1NBQ3hDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsU0FBZTtRQUNqRCxNQUFNLE1BQU0sR0FBRyw0RkFBZ0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxNQUFNLENBQUMsc0JBQXNCLENBQUMsU0FBZTtRQUNuRCxNQUFNLE1BQU0sR0FBRywwRkFBa0IsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBZTtRQUNsRCxNQUFNLE1BQU0sR0FBRyx1RkFBaUIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBZTtRQUM3QyxNQUFNLFdBQVcsR0FBZSxFQUFFLENBQUM7UUFDbkMsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDN0QsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNLENBQUMsd0JBQXdCLENBQUMsU0FBZTs7UUFDNUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBRTFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUV6QyxZQUFZO1FBQ1osTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXJELDJCQUEyQjtRQUMzQixNQUFNLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDM0QsU0FBUyxFQUNULFNBQVMsRUFDVCxXQUFXLENBQ1osQ0FBQztRQUNGLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFaEQsWUFBWTtRQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RCxZQUFZO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVsRSxXQUFXO1FBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRELFlBQVk7UUFDWixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1QyxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixLQUFLLE1BQU0sVUFBVSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbEQsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckUsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFPLENBQUMsZUFBZSxDQUFDO1lBQ3hELElBQ0UsT0FBTztnQkFDUCxPQUFPLENBQUMsZUFBZTtpQkFDdkIsYUFBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGVBQWUsMENBQUUsa0NBQWtDLEdBQzVELENBQUM7Z0JBQ0QsT0FBTyxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7b0JBQzdCLEdBQUcsRUFBRSxXQUFXO29CQUNoQixLQUFLLEVBQUUsU0FBUztpQkFDakIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxnRUFBZ0U7UUFDaEUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDaEUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUkseUNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFNBQWlCLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFFdkQsWUFBWTtRQUNaLGdGQUF3QixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFNUQsWUFBWTtRQUNaLGdGQUF3QixDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFaEUsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyRCwrREFBK0Q7WUFDakUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFlO1FBQzNDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixLQUFLLE1BQU0sTUFBTSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLGtEQUFNLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDN0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFPO2dCQUN0QixJQUFJLEVBQUUsa0JBQWtCLE1BQU0sQ0FBQyxHQUFHLEdBQUc7Z0JBQ3JDLFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBZSxFQUFFLE1BQTJCO1FBQ2pFLEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUcsQ0FBQztZQUM3QyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDekIsY0FBYyxDQUFDLGFBQWEsR0FBRyxrREFBTyxDQUFDLGFBQWEsQ0FBQztvQkFDbkQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZCLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUN2QixRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztpQkFDeEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixjQUFjLENBQUMsVUFBVSxHQUFHLGtEQUFPLENBQUMsYUFBYSxDQUFDO29CQUNoRCxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDakIsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNsQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLGNBQWMsQ0FBQyxhQUFhLEdBQUcsd0RBQVUsQ0FBQyxTQUFTLENBQ2pELFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQ3JCLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BCLGNBQWMsQ0FBQyxXQUFXLEdBQUcsb0RBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFlLEVBQUUsVUFBK0I7UUFDckUsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEQsT0FBTyxLQUFLLENBQUMsYUFBYSxFQUFHLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLE1BQU0sTUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RCxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLDJCQUEyQixHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2RSxLQUFLLE1BQU0sV0FBVyxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSwwQkFBMEIsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDckUsMkJBQTJCLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQ25FLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQ3BCLFNBQWUsRUFDZixVQUErQixFQUMvQixTQUFtQixFQUNuQixTQUE0Qjs7UUFFNUIsSUFBSSxTQUFTLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLG9FQUFnQixDQUFDLG9CQUFvQixDQUFDLHdHQUF1QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9GLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsK0NBQStDLENBQUMsT0FBTyxDQUFDLFdBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLCtDQUErQyxDQUFDLE9BQU8sQ0FBQyxZQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDekYsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDekMsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFZLENBQUMsTUFBTyxDQUFDLGNBQWUsQ0FBQztvQkFDbEYsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFhLENBQUMsTUFBTyxDQUFDLGNBQWUsQ0FBQztvQkFDcEYsTUFBTSxhQUFhLEdBQUcsYUFBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLG1DQUFJLFFBQVEsQ0FBQztvQkFFdEUsSUFBSSxzQkFBc0IsR0FBc0IsV0FBVyxDQUFDO29CQUM1RCxJQUFJLE9BQU8sQ0FBQyxNQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO3dCQUMzQyxzQkFBc0IsR0FBRyxXQUFXLENBQUM7b0JBQ3ZDLENBQUM7eUJBQU0sSUFBSSxPQUFPLENBQUMsTUFBTyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDL0Msc0JBQXNCLEdBQUcsWUFBWSxDQUFDO29CQUN4QyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sc0JBQXNCLEdBQUcsT0FBTyxDQUFDLE1BQU8sQ0FBQyxJQUF5QixDQUFDO29CQUNyRSxDQUFDO29CQUVELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUssQ0FBcUIsQ0FBQztvQkFDdEUsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUN2QixJQUFJLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUN0RCxJQUFJLHlDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7NEJBQ3JDLE1BQU0sV0FBVyxHQUFHLG9FQUFnQixDQUFDLG9CQUFvQixDQUN2RCx5RkFBa0IsRUFDbEIsUUFBUSxDQUNULENBQUM7NEJBQ0Ysa0JBQWtCLEdBQUcsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNsRCxDQUFDO3dCQUNELElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDOzRCQUNqQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBYSxDQUFDLE1BQU8sQ0FBQyxVQUFXLENBQUM7NEJBQ2pGLGtCQUFrQixDQUFDLFlBQVksQ0FDN0IseUNBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsRUFDaEUsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsZ0JBQW9DLEVBQ3BDLHdGQUFzQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FDakQsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBZSxFQUFFLFVBQStCLEVBQUUsU0FBbUI7UUFDekYsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFHLENBQUM7WUFDL0MsSUFBSSxpQkFBb0MsQ0FBQztZQUN6QyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sV0FBVyxHQUFHLG9FQUFnQixDQUFDLG9CQUFvQixDQUFDLHNGQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RixpQkFBaUIsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlDLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUM5QyxpQkFBaUIsQ0FBQyxnQkFBZ0IsR0FBRyxvREFBUSxDQUFDLHdCQUF3QixDQUNwRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FDaEMsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN2QyxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDdEIsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO3dCQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRyxDQUFDLENBQUM7d0JBQzlDLENBQUM7d0JBQ0QsaUJBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNyQyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzs0QkFDdkMsaUJBQWtCLENBQUMsb0JBQW9CO2dDQUNyQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDekQsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLGlCQUFrQixDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEQsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUM3QyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFHLENBQUM7b0JBQ2hELEVBQUUsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO2dCQUMxQixDQUFDO2dCQUVELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDekUsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3JDLE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUMxRSxzQkFBc0IsRUFDdEIsU0FBUyxDQUNWLENBQUM7b0JBQ0YsaUJBQWtCLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztnQkFDdEYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBZSxFQUFFLFNBQW1CLEVBQUUsV0FBdUI7O1FBQ3pGLE1BQU0sVUFBVSxHQUF3QixFQUFFLENBQUM7UUFDM0MsTUFBTSxpQkFBaUIsR0FBbUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVwRSxLQUFLLE1BQU0sTUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBYSxDQUFDO1lBQzNELElBQUksTUFBeUIsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQ2pDLElBQUksQ0FBQyxVQUFXLEVBQ2hCLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULFdBQVcsQ0FDWixDQUFDO2dCQUNGLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNkLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELElBQUksVUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxFQUFFLENBQUM7b0JBQzFCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMseUVBQWEsQ0FBRSxDQUFDO29CQUM5RCxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9ELENBQUM7Z0JBQ0QsTUFBTSxHQUFHLFVBQVUsQ0FBQztZQUN0QixDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDZCxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFDRCxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sSUFBSSxVQUFJLENBQUMsVUFBVSwwQ0FBRSxtQkFBbUIsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RixNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNkLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO2dCQUNELE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDakIsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO2dCQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDakIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3pCLENBQUM7cUJBQU0sSUFBSSxVQUFJLENBQUMsVUFBVSwwQ0FBRSxPQUFPLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUNwQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUNsQix5QkFBeUI7b0JBQ3pCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDcEQsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs0QkFDaEMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztnQ0FDekMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOzRCQUN2QyxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO2dCQUNELE1BQU0sR0FBRyxvRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyw0RkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxtQkFBbUIsR0FBSSxNQUE4QyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM1RixtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN0QyxJQUFJLGdCQUFJLENBQUMsVUFBVSwwQ0FBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQU0sMENBQUUsV0FBVyxFQUFFLENBQUM7b0JBQ3ZELG1CQUFtQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUNyRixDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsNERBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFOUQsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQWMsRUFBRSxTQUFlOztRQUN6RCxNQUFNLFFBQVEsR0FDWixxQkFBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGVBQWUsMENBQUUsa0NBQWtDLENBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsVUFBVSxNQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFdBQUksQ0FBQyxVQUFVLDBDQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFJLElBQUksQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBZ0MsRUFBRSxTQUFlOztRQUMzRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyw2RUFBYyxDQUFvQixDQUFDO1FBQ25GLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixjQUFjLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxjQUFjLENBQUMsSUFBSSxHQUFHLDhEQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxJQUFJLEtBQUssR0FBRyxrREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN4QixLQUFLLEdBQUcsa0RBQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzVCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzlCLENBQUM7WUFDRCxjQUFjLENBQUMsU0FBUyxHQUFHLGtEQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RCxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLGNBQWMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQyxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixJQUFJLFlBQUssQ0FBQyxJQUFJLDBDQUFFLGNBQWMsS0FBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdkMsY0FBYyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDNUQsQ0FBQztnQkFDRCxJQUFJLFlBQUssQ0FBQyxJQUFJLDBDQUFFLGNBQWMsS0FBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdkMsY0FBYyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxXQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWtCLEVBQUUsU0FBZTtRQUM5RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pELGVBQWUsQ0FBQyxTQUFTLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUssU0FBUyxDQUFDLEtBQWEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQzVFLG9DQUFvQztZQUNwQyxlQUFlLENBQUMsU0FBUyxHQUFHLGtEQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELGVBQWUsQ0FBQyxjQUFjLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELGVBQWUsQ0FBQyxFQUFFLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsZUFBZSxDQUFDLElBQUksR0FBRyxnRUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxlQUFlLENBQUMsSUFBSSxLQUFLLGdFQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsZUFBZSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBWSxDQUFDLFdBQVc7Z0JBQ3RELENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBWSxDQUFDLFdBQVc7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixlQUFlLENBQUMsMkJBQTJCLENBQ3pDLHFEQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFZLENBQUMsSUFBSSxDQUFDLENBQ2xELENBQUM7WUFDRixlQUFlLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFZLENBQUMsS0FBSyxDQUFDO1lBQ2xELGVBQWUsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDcEYsZUFBZSxDQUFDLFdBQVcsQ0FBQztnQkFDMUIsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLEtBQUssRUFBRSxlQUFlLENBQUMsSUFBSTthQUM1QixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxlQUFlLENBQUMsSUFBSSxLQUFLLGdFQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUQsZUFBZSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsWUFBYSxDQUFDLElBQUksQ0FBQztZQUNqRCxlQUFlLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxZQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2pELGVBQWUsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQWEsQ0FBQyxLQUFLLENBQUM7WUFDbkQsZUFBZSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsWUFBYSxDQUFDLElBQUksQ0FBQztZQUNqRCxlQUFlLENBQUMsV0FBVyxDQUFDO2dCQUMxQixHQUFHLEVBQUUsY0FBYztnQkFDbkIsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJO2FBQzVCLENBQUMsQ0FBQztZQUNILGVBQWUsQ0FBQyxXQUFXLENBQUM7Z0JBQzFCLEdBQUcsRUFBRSxjQUFjO2dCQUNuQixLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUk7YUFDNUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELGVBQWUsQ0FBQyxXQUFXLENBQUM7WUFDMUIsR0FBRyxFQUFFLGdCQUFnQjtZQUNyQixLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU07U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUE2QixDQUFDO0lBQ3ZDLENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUN4QixJQUFjLEVBQ2QsU0FBZ0IsRUFDaEIsU0FBbUIsRUFDbkIsU0FBZSxFQUNmLFdBQXVCOztRQUV2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsTUFBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxvQkFBb0IsQ0FDekUsU0FBUyxDQUNWLDBDQUFFLEtBQUssRUFBc0IsQ0FBQztRQUMvQixJQUFJLGVBQWUsR0FBRyxxRUFBYSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFM0MsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFLENBQUM7WUFDM0IsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sTUFBTSxHQUFHLElBQUksaURBQUksRUFBRSxDQUFDO1lBQzFCLGtDQUFrQztZQUNsQyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxlQUFlLENBQUM7WUFDaEUsSUFBSSxnQkFBZSxhQUFmLGVBQWUsdUJBQWYsZUFBZSxDQUFFLHNCQUFzQixLQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwRCxNQUFNLENBQUMsc0JBQXNCLEdBQUcsZUFBZSxDQUFDLHNCQUFzQixDQUFDO1lBQ3pFLENBQUM7WUFFRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsV0FBc0IsRUFBRSxTQUF3QixFQUFFLEVBQUU7Z0JBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO2dCQUNwRCxJQUFJLHlDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxLQUFLLE1BQU0sZUFBZSxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQy9DLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRXZELEtBQUssTUFBTSxXQUFXLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuRCxXQUFXLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN4RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQWtCLENBQUM7Z0JBQ3RELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDM0IsZUFBZSxHQUFHLHFFQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUUsQ0FBQztnQkFDeEQsQ0FBQztnQkFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLDBEQUFTLEVBQUUsQ0FBQztnQkFFcEMsTUFBTSxVQUFVLEdBQ2QsU0FBUyxDQUFDLFFBQVEsSUFBSSxJQUFJO29CQUN4QixDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7b0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0QyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBRTlDLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztvQkFDL0MsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztvQkFDOUMsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ3hCLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDO3dCQUN4RCxNQUFNLGVBQWUsR0FBRywyQkFBUyxDQUFDLGNBQWMsMENBQUUsTUFBTSwwQ0FBRSxlQUFlLDBDQUFFLEtBQUssRUFBRSxDQUFDO3dCQUNuRixJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDNUIsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDOzRCQUN4RSxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsMERBQTBEO3dCQUN4SCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxVQUFVO2dCQUNWLElBQUksaUJBQWlCLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxHQUF3RCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUMzRSxJQUFJLGVBQVMsQ0FBQyxVQUFVLDBDQUFFLDBCQUEwQixFQUFFLENBQUM7b0JBQ3JELGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBRTdFLElBQUkseUNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVO29CQUNWLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ2hDLGlCQUFpQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FDckQsU0FBUyxDQUFDLGFBQWMsRUFDeEIsU0FBUyxDQUNWLENBQUM7b0JBQ0osQ0FBQztvQkFFRCxhQUFhO29CQUNiLE1BQU0sZUFBZSxHQUE0QixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUMzRCxLQUFLLE1BQU0sYUFBYSxJQUFJLFNBQVMsQ0FBQyxpQkFBa0IsRUFBRSxDQUFDO3dCQUN6RCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFFLENBQUM7d0JBQ2xFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWlCLENBQUMsTUFBTyxDQUFDLENBQUM7d0JBQ3BFLElBQUksWUFBb0MsQ0FBQzt3QkFDekMsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQzs0QkFDdkMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUM3RCxJQUFJLHlDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dDQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztnQ0FDakYsZUFBZSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUM5RCxDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixZQUFZLEdBQUcsUUFBUTtpQ0FDcEIsY0FBYyxDQUFDO2dDQUNkLGdCQUFnQixFQUFFLENBQUM7Z0NBQ25CLFVBQVUsRUFBRSxDQUFDOzZCQUNkLENBQUM7aUNBQ0QsV0FBVyxFQUFFLENBQUM7d0JBQ25CLENBQUM7d0JBQ0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFFOUUsTUFBTSxZQUFZLEdBQUcsMEVBQWUsQ0FBQyxnREFBZ0QsQ0FDbkYsMEVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU8sQ0FBQyxhQUFhLENBQUMsQ0FDaEUsQ0FBQzt3QkFDRixHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUM3QyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUV6RSxnQkFBZ0I7Z0JBQ2hCLElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDOUIscUJBQXFCO29CQUNyQixJQUFJLG9CQUFvQixHQUFHLGlEQUFNLENBQUMsb0JBQW9CLENBQUM7b0JBQ3ZELElBQUksZ0JBQWUsYUFBZixlQUFlLHVCQUFmLGVBQWUsQ0FBRSxvQkFBb0IsS0FBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDbEQsb0JBQW9CLEdBQUcsZUFBZSxDQUFDLG9CQUFvQixDQUFDO29CQUM5RCxDQUFDO29CQUVELE1BQU0sT0FBTyxHQUErRCxFQUFFLENBQUM7b0JBQy9FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsY0FBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUMxRCxJQUFJLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDOzRCQUM5QixNQUFNO3dCQUNSLENBQUM7d0JBRUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLGNBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUMsTUFBTSxTQUFTLEdBQXdELElBQUksR0FBRyxFQUFFLENBQUM7d0JBQ2pGLEtBQUssTUFBTSxhQUFhLElBQUksTUFBTSxFQUFFLENBQUM7NEJBQ25DLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDOzRCQUNoRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FDN0QsaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDOzRCQUNGLE1BQU0sa0NBQWtDLEdBQ3RDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOzRCQUMxRCxNQUFNLGVBQWUsR0FBRywwRUFBZSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDbEUsTUFBTSxZQUFZLEdBQ2hCLDBFQUFlLENBQUMsZ0RBQWdELENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQ3BGLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7d0JBQ2xFLENBQUM7d0JBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDMUIsQ0FBQztvQkFFRCxXQUFXLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBRUQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixTQUFTLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFzQixFQUFFLFVBQW9COztRQUNuRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTyxDQUFDLEtBQUssQ0FBQztRQUVyQyxxQkFBcUI7UUFDckIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU8sQ0FBQyxPQUFRLENBQUM7UUFDaEQsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDekQsSUFBSSxNQUFNLEdBQWUsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQWEsQ0FBQyxNQUFPLENBQUM7UUFDOUUsTUFBTSxvQ0FBb0MsR0FDeEMsQ0FBQyx1QkFBaUIsQ0FBQyxVQUFVLG1DQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQWEsQ0FBQyxVQUFVLG1DQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFFLE1BQU0saUJBQWlCLEdBQUcscUJBQXFCLEdBQUcsS0FBSyxDQUFDLENBQUMsa0JBQWtCO1FBQzNFLE1BQU0sZUFBZSxHQUFRLElBQUksUUFBUSxDQUN2QyxNQUFNLENBQUMsTUFBTSxFQUNiLG9DQUFvQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQ3hELGlCQUFpQixDQUNsQixDQUFDO1FBRUYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdkUsb0JBQW9CO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUFPLENBQUMsTUFBTyxDQUFDO1FBQzlDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN0RCxNQUFNLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFlBQWEsQ0FBQyxNQUFPLENBQUM7UUFDN0QsTUFBTSxxQ0FBcUMsR0FDekMsQ0FBQyxxQkFBZSxDQUFDLFVBQVUsbUNBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBWSxDQUFDLFVBQVUsbUNBQUksQ0FBQyxDQUFDLENBQUM7UUFFckUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsR0FBRyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekUsTUFBTSxjQUFjLEdBQVEsSUFBSSxRQUFRLENBQ3RDLE1BQU0sQ0FBQyxNQUFNLEVBQ2IscUNBQXFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFDekQsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVqRSxrQ0FBa0M7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FDaEQsb0JBQW9CLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLG9CQUFvQixHQUFHLENBQUMsRUFDdEUsWUFBWSxDQUNiLENBQUM7Z0JBQ0YsVUFBVSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQixDQUM5QixTQUFlLEVBQ2YsWUFBMEIsRUFDMUIsZUFBK0I7UUFFL0IsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFFL0MsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsTUFBTyxDQUFDLHFCQUE4QyxDQUFDO1FBQy9GLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQixXQUFXO1lBQ1gsTUFBTSw2QkFBNkIsR0FBRyxlQUFlLENBQUMsa0NBQW1DLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN0YsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUMsY0FBYyxDQUFDO1lBQ3BFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLHFDQUFxQztZQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxzQ0FBc0M7WUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDOUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxvREFBb0Q7WUFDdEYsTUFBTSxRQUFRLEdBQUcsNkJBQTZCLENBQUMsUUFBUSxDQUFDO1lBQ3hELE1BQU0sUUFBUSxHQUFHLDZCQUE2QixDQUFDLFFBQVEsQ0FBQztZQUN4RCxNQUFNLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQyxTQUFTLENBQUM7WUFDMUQsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQztZQUM1RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFeEQsVUFBVTtZQUNWLElBQUksaUJBQWlCLENBQUM7WUFDdEIsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztZQUM5QyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDbEQsaUJBQWlCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDdkMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUVELGVBQWU7WUFDZixJQUFJLGlCQUFpQixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM5QixJQUFJLGVBQXFDLENBQUM7Z0JBQzFDLElBQUksa0JBQWtCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvRCxlQUFlLEdBQUcsb0VBQWMsQ0FBQyxtQkFBbUIsQ0FBQzt3QkFDbkQsY0FBYzt3QkFDZCxVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsVUFBVTt3QkFDVixtQkFBbUI7d0JBQ25CLFNBQVMsRUFBRSxJQUFJO3dCQUNmLGtCQUFrQjt3QkFDbEIsUUFBUTt3QkFDUixRQUFRO3dCQUNSLFNBQVM7d0JBQ1Qsa0JBQWtCO3dCQUNsQixjQUFjO3FCQUNmLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsWUFBWSxDQUFDLE1BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsb0VBQWMsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEQsY0FBYztnQkFDZCxVQUFVO2dCQUNWLFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixtQkFBbUI7Z0JBQ25CLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLFFBQVE7Z0JBQ1IsUUFBUTtnQkFDUixTQUFTO2dCQUNULGtCQUFrQjtnQkFDbEIsY0FBYzthQUNmLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWxGLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDN0IsUUFBYSxFQUNiLGtCQUF5QyxFQUN6QyxRQUFrQixFQUNsQixRQUFhO1FBRWIsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hGLElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQ3hELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkYsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixRQUFRLENBQUMsbUJBQW1CLENBQzFCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUM3RCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sb0JBQW9CLEdBQ3hCLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksb0JBQW9CLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakMsUUFBUSxDQUFDLG1CQUFtQixDQUMxQixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDaEcsSUFBSSxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQyxRQUFRLENBQUMsbUJBQW1CLENBQzFCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQ3BFLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQzNELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hGLElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BGLElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQzVELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlFLElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQ3hELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRyxJQUFJLG1CQUFtQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FDcEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUMvQixTQUFlO0lBQ2YsNEJBQTRCO0lBQzVCLFlBQTBCLEVBQzFCLGVBQStCO1FBRS9CLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBRS9DLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU8sQ0FBQyxxQkFBOEMsQ0FBQztRQUMvRixNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsV0FBVztZQUNYLE1BQU0sNkJBQTZCLEdBQUcsZUFBZSxDQUFDLGtDQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdGLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDLGNBQWMsQ0FBQztZQUNwRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxxQ0FBcUM7WUFDOUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMscUNBQXFDO1lBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLDZCQUE2QixDQUFDLFFBQVEsQ0FBQztZQUN4RCxNQUFNLFFBQVEsR0FBRyw2QkFBNkIsQ0FBQyxRQUFRLENBQUM7WUFDeEQsTUFBTSxTQUFTLEdBQUcsNkJBQTZCLENBQUMsU0FBUyxDQUFDO1lBQzFELE1BQU0sa0JBQWtCLEdBQUcsNkJBQTZCLENBQUMsa0JBQWtCLENBQUM7WUFDNUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXhELFVBQVU7WUFDVixJQUFJLGlCQUFpQixDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDOUMsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMxQixpQkFBaUIsR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2xELGlCQUFpQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCxlQUFlO1lBQ2YsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxlQUFxQyxDQUFDO2dCQUMxQyxJQUFJLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsZUFBZSxHQUFHLG9FQUFjLENBQUMsbUJBQW1CLENBQUM7d0JBQ25ELGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsbUJBQW1CO3dCQUNuQixTQUFTLEVBQUUsSUFBSTt3QkFDZixrQkFBa0I7d0JBQ2xCLFFBQVE7d0JBQ1IsUUFBUTt3QkFDUixTQUFTO3dCQUNULGtCQUFrQjt3QkFDbEIsY0FBYztxQkFDZixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLFlBQVksQ0FBQyxNQUFPLENBQUMsZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLG9FQUFjLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2xELGNBQWM7Z0JBQ2QsVUFBVTtnQkFDVixVQUFVO2dCQUNWLFVBQVU7Z0JBQ1YsbUJBQW1CO2dCQUNuQixTQUFTLEVBQUUsS0FBSztnQkFDaEIsa0JBQWtCO2dCQUNsQixRQUFRO2dCQUNSLFFBQVE7Z0JBQ1IsU0FBUztnQkFDVCxrQkFBa0I7Z0JBQ2xCLGNBQWM7YUFDZixDQUFDLENBQUM7WUFFSCxjQUFjLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUVsRixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxNQUFNLENBQUMsNkJBQTZCLENBQzFDLFNBQWUsRUFDZixZQUEyQjs7UUFFM0IsTUFBTSxhQUFhLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxVQUFVLDBDQUFFLDBCQUEwQixDQUFDLENBQUM7UUFDckYsdURBQXVEO1FBQ3ZELElBQUksZ0JBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSwwQ0FBRSxlQUFlLEtBQUksSUFBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBRS9ELGlDQUFpQztZQUNqQyxJQUNFLHNCQUFlLENBQUMsZUFBZSwwQ0FBRSx5QkFBeUIsS0FBSSxJQUFJO2dCQUNsRSxlQUFlLENBQUMsZUFBZSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxFQUNwRSxDQUFDO2dCQUNELE1BQU0sZUFBZSxHQUFHLHFCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxlQUFlLENBQUM7Z0JBQ2pGLElBQUksZ0JBQWUsYUFBZixlQUFlLHVCQUFmLGVBQWUsQ0FBRSxnQkFBZ0IsS0FBSSxJQUFJLEVBQUUsQ0FBQztvQkFDOUMsT0FBTyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsWUFBYSxDQUFDLENBQUM7Z0JBQ3pELENBQUM7WUFDSCxDQUFDO1lBRUQsWUFBWTtZQUNaLElBQUksZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDcEYsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN2QixRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztvQkFDdkMsT0FBTyxRQUFRLENBQUM7Z0JBQ2xCLENBQUM7WUFDSCxDQUFDO1lBRUQsd0NBQXdDO1lBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLHlCQUF5QixDQUFDO1lBQ3JFLElBQUksa0JBQWtCLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQy9CLE9BQVEsb0VBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FDaEQsR0FBRyxlQUFlLENBQUMsa0NBQW1DLENBQ3ZELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELFdBQVc7UUFDWCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxzQ0FBc0M7UUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMscUNBQXFDO1FBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlELE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUUxQixJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxtQkFBWSxDQUFDLFVBQVUsMENBQUUsb0JBQW9CLEtBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzFELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLGVBQWdCLENBQUM7Z0JBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZCLFFBQVEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO29CQUN2QyxPQUFPLFFBQVEsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSx5QkFBeUIsR0FBVyxpREFBTSxDQUFDLDhCQUE4QixDQUFDO1FBQ2hGLElBQUksVUFBVSxDQUFDLGVBQVMsQ0FBQyxLQUFLLDBDQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sZUFBZSxHQUFHLHFCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSxtQ0FBSSxFQUFFLENBQUM7WUFDdEUsYUFBYTtZQUNiLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLENBQUMsbURBQW1EO1lBQ3JGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sUUFBUSxHQUFHLG9FQUFjLENBQUMscUJBQXFCLENBQUM7Z0JBQ3BELFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixVQUFVO2dCQUNWLFdBQVcsRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsdUJBQXVCLENBQUM7Z0JBQ3hFLGNBQWMsRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsMEJBQTBCLENBQUM7Z0JBQzlFLFFBQVEsRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsb0JBQW9CLENBQUM7Z0JBQ2xFLE9BQU8sRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsbUJBQW1CLENBQUM7Z0JBQ2hFLFVBQVUsRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsc0JBQXNCLENBQUM7Z0JBQ3RFLGFBQWEsRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUseUJBQXlCLENBQUM7Z0JBQzVFLFlBQVksRUFBRSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsd0JBQXdCLENBQUM7Z0JBQzFFLFFBQVEsRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQy9DLG1CQUFtQjtnQkFDbkIsZ0JBQWdCO2dCQUNoQixjQUFjLEVBQUUsY0FBYztnQkFDOUIsa0JBQWtCLEVBQUUseUJBQXlCO2FBQzlDLENBQUMsQ0FBQztZQUNILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4RCxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLFFBQVEsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUNELFFBQVEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ3ZDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYTtZQUNiLE1BQU0sUUFBUSxHQUFHLG9FQUFjLENBQUMseUJBQXlCLENBQUM7Z0JBQ3hELFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixjQUFjLEVBQUUsY0FBYztnQkFDOUIsa0JBQWtCLEVBQUUseUJBQXlCO2FBQzlDLENBQUMsQ0FBQztZQUNILFFBQVEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ3ZDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFlLEVBQUUsWUFBMkI7O1FBQ3RFLE1BQU0sUUFBUSxHQUNaLDJCQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsS0FBSywwQ0FBRSxNQUFNLDBDQUFFLGVBQWUsMENBQUUsa0NBQWtDLENBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsVUFBVSxLQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pDLE9BQU8sUUFBUSxDQUFDLFVBQXFCLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLG1CQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsVUFBVSwwQ0FBRSxtQkFBbUIsS0FBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlFLENBQUM7SUFDSCxDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLHFCQUFxQjtJQUNyQix5RkFBeUY7SUFDekYsMENBQTBDO0lBQzFDLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZ0NBQWdDO0lBQ2hDLE1BQU07SUFDTixJQUFJO0lBRUksTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQWUsRUFBRSxTQUF3Qjs7UUFDNUUsTUFBTSxzQkFBc0IsR0FDMUIsMkJBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxLQUFLLDBDQUFFLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxzQkFBc0IsQ0FBQztRQUVwRSxRQUFRLHNCQUFzQixFQUFFLENBQUM7WUFDL0IsS0FBSyxDQUFDLEVBQUUsd0JBQXdCO2dCQUM5QixPQUFPLEtBQUssQ0FBQztZQUNmLEtBQUssQ0FBQyxFQUFFLG1EQUFtRDtnQkFDekQsTUFBTTtZQUNSLEtBQUssQ0FBQyxFQUFFLDZDQUE2QztnQkFDbkQsT0FBTyxJQUFJLENBQUM7WUFDZCxLQUFLLENBQUMsRUFBRSx1QkFBdUI7Z0JBQzdCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxDQUFDLEVBQUUsaUJBQWlCO2dCQUN2QixPQUFPLElBQUksQ0FBQztZQUNkLFFBQVE7UUFDVixDQUFDO1FBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0MsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBZTs7UUFDL0MsTUFBTSxRQUFRLEdBQ1osMkJBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxLQUFLLDBDQUFFLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxrQ0FBa0MsQ0FBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixJQUFJLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxnQkFBZ0IsTUFBSyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyw0QkFBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLEtBQUssMENBQUUsTUFBTSwwQ0FBRSxlQUFlLDBDQUFFLHNCQUFzQixNQUFLLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFlOztRQUM3QyxNQUFNLFFBQVEsR0FDWiwyQkFBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLEtBQUssMENBQUUsTUFBTSwwQ0FBRSxlQUFlLDBDQUFFLGtDQUFrQyxDQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLGNBQXFDLENBQUM7SUFDekQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBZSxFQUFFLFlBQTJCOztRQUN6RSxNQUFNLE9BQU8sR0FBRyxtQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsbUJBQW1CLEtBQUksSUFBSSxDQUFDO1FBRXRFLE1BQU0sUUFBUSxHQUFhLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFdkYsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBYSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvRSxPQUFPLFFBQVEsQ0FBQztRQUVsQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxlQUFlLENBQUM7UUFDeEQsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsb0JBQW9CLENBQUM7UUFDaEUsSUFBSSxvQkFBb0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxtQkFBbUI7WUFDbkIseUJBQXlCLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBYSxDQUFDLENBQUM7UUFDL0YsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEtBQUssR0FBVSxvRUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDNUMsSUFBSSxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLE1BQU0sMENBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLFFBQVEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDdEMsS0FBSyxvRUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHO3dCQUM1QixLQUFLLEdBQUcsb0VBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUNwQyxNQUFNO29CQUNSLEtBQUssb0VBQVksQ0FBQyxPQUFPLENBQUMsR0FBRzt3QkFDM0IsS0FBSyxHQUFHLG9FQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzt3QkFDbkMsTUFBTTtvQkFDUixLQUFLLG9FQUFZLENBQUMsVUFBVSxDQUFDLEdBQUc7d0JBQzlCLEtBQUssR0FBRyxvRUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7d0JBQ3RDLE1BQU07b0JBQ1IsS0FBSyxvRUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUN6QixLQUFLLEdBQUcsb0VBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO3dCQUNqQyxNQUFNO2dCQUNWLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsaURBQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBb0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLGNBQWMsQ0FBQztRQUM5RixJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGtEQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxlQUFlLENBQUM7UUFDdEQsSUFBSSxlQUFlLElBQUksSUFBSSxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsT0FBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQzFFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEUsSUFBSSxVQUFVLENBQUMsZUFBUyxDQUFDLEtBQUssMENBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2xGLFFBQVEsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNFLENBQUM7WUFDRCxjQUFjLENBQUMsc0JBQXNCLENBQ25DLGVBQWdCLEVBQ2hCLFFBQVEsRUFDUiwwQkFBMEIsRUFDMUIseUJBQXlCLENBQzFCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxTQUFTLEdBQUcsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFNBQVMsQ0FBQztRQUN4QyxJQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxTQUFTLEVBQUUsQ0FBQztZQUN2QixTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsUUFBUSxDQUFDLFNBQVMsR0FBRyw4REFBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUUsQ0FBQztZQUUxRCxxQ0FBcUM7WUFDckMsSUFDRSxRQUFRLENBQUMsU0FBUyxLQUFLLDhEQUFTLENBQUMsSUFBSTtnQkFDckMsQ0FBQyxzQkFBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGVBQWUsMENBQUUsZUFBZSxHQUN6RCxDQUFDO2dCQUNELFFBQVEsQ0FBQyxZQUFZLENBQ25CLGFBQWEsRUFDYixpREFBTSxDQUFDLGNBQWMsQ0FBQyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFdBQVcsbUNBQUksR0FBRyxDQUFDLENBQ3hELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELFFBQVEsQ0FBQyxhQUFhLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxVQUFVLDBDQUFFLDBCQUEwQixDQUFDLENBQUM7UUFFeEYsTUFBTSxXQUFXLEdBQUcsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFdBQVcsQ0FBQztRQUM5QyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ25DLENBQUM7UUFFRCxjQUFjO1FBQ2QsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBRSxZQUFvQixDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLG1CQUFtQixHQUFJLFlBQW9CLENBQUMsbUJBQWtDLENBQUM7WUFDckYsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUU7Z0JBQzlFLHNCQUFzQixFQUFFLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSw2QkFBNkI7YUFDL0QsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3JFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFMUUsSUFDRSxJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDO2lCQUM5QyxxQkFBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGVBQWUsMENBQUUsZUFBZSxHQUN4RCxDQUFDO2dCQUNELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLGVBQWdCO3FCQUM3RCxlQUFtQyxDQUFDO2dCQUN2QyxJQUFJLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUM1QyxlQUFlLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLGFBQWMsQ0FBQyxDQUFDO2dCQUN4RixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsa0JBQW9DLENBQUM7WUFDOUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxtREFBTyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxhQUFhLENBQUM7UUFDbEQsSUFBSSxhQUFhLElBQUksSUFBSSxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsT0FBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQ3hFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksVUFBVSxDQUFDLGVBQVMsQ0FBQyxLQUFLLDBDQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ25DLFFBQVEsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDO2dCQUVELElBQUksYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDaEMsUUFBUSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxjQUFjLENBQUMsc0JBQXNCLENBQ25DLGFBQWMsRUFDZCxRQUFRLEVBQ1Isd0JBQXdCLEVBQ3hCLHVCQUF1QixDQUN4QixDQUFDO1FBRUYsb0hBQW9IO1FBRXBILGdCQUFnQjtRQUNoQixJQUFJLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sZUFBZSxHQUFHLHFCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxlQUFlLENBQUM7WUFDakYsSUFBSSxnQkFBZSxhQUFmLGVBQWUsdUJBQWYsZUFBZSxDQUFFLGFBQWEsS0FBSSxJQUFJLEVBQUUsQ0FBQztnQkFDM0MsZUFBZSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsWUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBb0I7O1FBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksdURBQU8sQ0FBQztZQUMxQixTQUFTLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsU0FBUyxDQUFDO2dCQUNuRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtZQUMzQixTQUFTLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsU0FBUyxDQUFDO2dCQUNuRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtZQUMzQixLQUFLLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsS0FBSyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtZQUMzQixLQUFLLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsS0FBSyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtTQUM1QixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFakIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQ25CLE9BQW9CLEVBQ3BCLFNBQWUsRUFDZixFQUFFLHNCQUFzQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUU7O1FBRXZDLE1BQU0sT0FBTyxHQUFHLGVBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSwwQ0FBRSxlQUFlLENBQUM7UUFFeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSx1REFBTyxFQUFFLENBQUM7UUFDaEMsU0FBUyxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDO1FBQzFELFNBQVMsQ0FBQyxVQUFVLEdBQUcsUUFBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGlCQUFpQixNQUFLLElBQUksQ0FBQztRQUUzRCxNQUFNLGFBQWEsR0FBRztZQUNwQixTQUFTLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsU0FBUyxDQUFDO2dCQUNuRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtZQUMzQixTQUFTLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsU0FBUyxDQUFDO2dCQUNuRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtZQUMzQixLQUFLLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsS0FBSyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtZQUMzQixLQUFLLEVBQUUseUNBQUUsQ0FBQyxLQUFLLENBQUMsYUFBTyxDQUFDLGFBQWEsMENBQUUsS0FBSyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsNEVBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFjLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsNEVBQWdCLENBQUMsTUFBTTtTQUM1QixDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQWtCLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQXlCLENBQUM7WUFDbEQsTUFBTSx1QkFBdUIsR0FBRyx1RkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3JGLE1BQU0sUUFBUSxHQUFHLENBQUMsOEJBQXVCLENBQUMsMEJBQTBCLDBDQUFFLFFBQVEsRUFBQztZQUUvRSxJQUNFLFFBQVE7Z0JBQ1IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsYUFBYSxDQUFDLEVBQ3BELENBQUM7Z0JBQ0QsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDOUIsQ0FBQztZQUVELFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDOUIsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixTQUFTLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLFNBQVMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFHLFdBQUssQ0FBQyxRQUFRLDBDQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFLLENBQUMsSUFBSSxtQ0FBSSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDMUQsQ0FBQztRQUNELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRW5ELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsYUFBa0I7UUFDaEUsSUFDRSxhQUFhLENBQUMsS0FBSyxLQUFLLDRFQUFnQixDQUFDLFdBQVc7WUFDcEQsYUFBYSxDQUFDLEtBQUssS0FBSyw0RUFBZ0IsQ0FBQyxXQUFXO1lBQ3BELENBQUMsYUFBYSxDQUFDLFNBQVMsS0FBSyw0RUFBZ0IsQ0FBQyxNQUFNO2dCQUNsRCxhQUFhLENBQUMsU0FBUyxLQUFLLDRFQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUN2RCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQXVCO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsNkJBQTZCLENBQzFDLFlBQTBCLEVBQzFCLGdCQUF3QjtRQUV4QixJQUFJLFlBQVksSUFBSSxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdkMsSUFDRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSTtZQUN6QyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxFQUM3QyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsOEJBQThCLENBQUMsU0FBZTs7UUFDM0QsSUFBSSxlQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSxFQUFFLENBQUM7WUFDNUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsc0JBQXNCLENBQ25DLGVBQXNDLEVBQ3RDLFVBQXNCLEVBQ3RCLFVBQWdCLEVBQ2hCLE1BQVk7UUFFWixPQUFPLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxRQUEwQztRQUN2RSxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMxQixRQUFRLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMvQixLQUFLLElBQUksRUFBRSxVQUFVO2dCQUNuQixpQkFBaUIsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixLQUFLLElBQUksRUFBRSxtQkFBbUI7Z0JBQzVCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztnQkFDdEIsTUFBTTtZQUNSLEtBQUssSUFBSSxFQUFFLFdBQVc7Z0JBQ3BCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztnQkFDdEIsTUFBTTtZQUNSLEtBQUssSUFBSSxFQUFFLG9CQUFvQjtnQkFDN0IsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxJQUFJLEVBQUUsU0FBUztnQkFDbEIsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxJQUFJLEVBQUUsa0JBQWtCO2dCQUMzQixpQkFBaUIsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixLQUFLLElBQUksRUFBRSxXQUFXO2dCQUNwQixpQkFBaUIsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07WUFDUjtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztRQUNELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxRQUFzQjtRQUNqRCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsS0FBSyxRQUFRO2dCQUNYLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDZixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixNQUFNO1FBQ1YsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsUUFBMEM7UUFDcEUsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLFFBQVEsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9CLEtBQUssSUFBSSxFQUFFLFVBQVU7Z0JBQ25CLGNBQWMsR0FBRyxTQUFTLENBQUM7Z0JBQzNCLE1BQU07WUFDUixLQUFLLElBQUksRUFBRSxtQkFBbUI7Z0JBQzVCLGNBQWMsR0FBRyxVQUFVLENBQUM7Z0JBQzVCLE1BQU07WUFDUixLQUFLLElBQUksRUFBRSxXQUFXO2dCQUNwQixjQUFjLEdBQUcsVUFBVSxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsS0FBSyxJQUFJLEVBQUUsb0JBQW9CO2dCQUM3QixjQUFjLEdBQUcsV0FBVyxDQUFDO2dCQUM3QixNQUFNO1lBQ1IsS0FBSyxJQUFJLEVBQUUsU0FBUztnQkFDbEIsY0FBYyxHQUFHLFVBQVUsQ0FBQztnQkFDNUIsTUFBTTtZQUNSLEtBQUssSUFBSSxFQUFFLGtCQUFrQjtnQkFDM0IsY0FBYyxHQUFHLFdBQVcsQ0FBQztnQkFDN0IsTUFBTTtZQUNSLEtBQUssSUFBSSxFQUFFLFdBQVc7Z0JBQ3BCLGNBQWMsR0FBRyxZQUFZLENBQUM7Z0JBQzlCLE1BQU07WUFDUjtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMscUJBQXFCO1FBQzFCLE9BQU8sQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTSxDQUFDLCtDQUErQyxDQUNwRCxRQUFzQixFQUN0QixTQUFvQjs7UUFFcEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGdCQUFpQixDQUFDO1FBQzlDLElBQUksb0JBQW9CLEdBQVcsQ0FBQyxnQkFBVSxDQUFDLFVBQVUsbUNBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFRLENBQUMsVUFBVSxtQ0FBSSxDQUFDLENBQUMsQ0FBQztRQUM3RixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsWUFBYSxDQUFDO1FBQ3hDLElBQUksVUFBVSxHQUFlLE1BQU0sQ0FBQyxNQUFPLENBQUM7UUFFNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSx5Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEMsUUFBUSxDQUFDLE1BQU0sR0FBRztnQkFDaEIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGNBQWMsRUFBRSxJQUFJLFlBQVksRUFBRTtnQkFDbEMsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLGNBQWMsRUFBRSxFQUFFO2FBQ25CLENBQUM7UUFDSixDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHlDQUFFLENBQUMsS0FBSyxDQUFDLGNBQVEsQ0FBQyxNQUFNLDBDQUFFLGtCQUFrQixDQUFDO1lBQ3hFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTyxDQUFDLGtCQUFrQjtZQUNyQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2YsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ2hELFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVoRCxNQUFNLFVBQVUsR0FBRyxjQUFjLEdBQUcsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFFaEUsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWlCLENBQUMsTUFBTyxDQUFDLENBQUM7WUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNsRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNoRSxVQUFVLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7UUFFakMsSUFBSSxjQUFjLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDO1lBQzNDLDRDQUE0QztZQUM1Qyx1QkFBdUI7WUFDdkIsSUFBSSxjQUFjLEdBQWUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNwRCxJQUFJLGNBQWMsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDMUMsWUFBWSxFQUNaLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsVUFBVSxHQUFHLGNBQWMsQ0FDNUIsQ0FBQztZQUNKLENBQUM7aUJBQU0sSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hDLGNBQWMsR0FBRyxJQUFJLFNBQVMsQ0FDNUIsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixVQUFVLEdBQUcsY0FBYyxDQUM1QixDQUFDO1lBQ0osQ0FBQztpQkFBTSxJQUFJLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDekMsY0FBYyxHQUFHLElBQUksVUFBVSxDQUM3QixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLFVBQVUsR0FBRyxjQUFjLENBQzVCLENBQUM7WUFDSixDQUFDO2lCQUFNLElBQUksY0FBYyxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN6QyxjQUFjLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUMxQyxVQUFVLEVBQ1YsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixVQUFVLEdBQUcsY0FBYyxDQUM1QixDQUFDO1lBQ0osQ0FBQztpQkFBTSxJQUFJLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDMUMsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDMUMsV0FBVyxFQUNYLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsVUFBVSxHQUFHLGNBQWMsQ0FDNUIsQ0FBQztZQUNKLENBQUM7aUJBQU0sSUFBSSxjQUFjLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3pDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQzFDLFVBQVUsRUFDVixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLFVBQVUsR0FBRyxjQUFjLENBQzVCLENBQUM7WUFDSixDQUFDO2lCQUFNLElBQUksY0FBYyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMxQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUMxQyxXQUFXLEVBQ1gsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixVQUFVLEdBQUcsY0FBYyxDQUM1QixDQUFDO1lBQ0osQ0FBQztZQUNELFlBQVksR0FBRyxJQUFJLENBQUMsbUNBQW1DLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFGLENBQUM7YUFBTSxDQUFDO1lBQ04sd0JBQXdCO1lBQ3hCLE1BQU0sUUFBUSxHQUFRLElBQUksUUFBUSxDQUNoQyxVQUFVLENBQUMsTUFBTSxFQUNqQixvQkFBb0IsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUM1QyxVQUFVLENBQ1gsQ0FBQztZQUNGLE1BQU0sU0FBUyxHQUFHLGNBQWMsR0FBRyxVQUFVLENBQUM7WUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEIsS0FBSyxRQUFRO3dCQUNYLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUM5RCxNQUFNO29CQUNSLEtBQUssTUFBTTt3QkFDVCxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQzt3QkFDOUQsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxHQUFHLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUMvRSxNQUFNO29CQUNSLEtBQUssTUFBTTt3QkFDVCxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQzt3QkFDOUQsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxHQUFHLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUMvRSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNuRixNQUFNO29CQUNSLEtBQUssTUFBTTt3QkFDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7NEJBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxjQUFjLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7d0JBQ3JGLENBQUM7d0JBQ0QsTUFBTTtvQkFDUixLQUFLLE1BQU07d0JBQ1QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzRCQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNyRixDQUFDO3dCQUNELE1BQU07Z0JBQ1YsQ0FBQztZQUNILENBQUM7WUFDRCxZQUFZLEdBQUcsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBRUQsUUFBUSxDQUFDLE1BQU8sQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDO1FBRS9DLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMsbUNBQW1DLENBQ2hELGNBQXNCLEVBQ3RCLFdBQWtDO1FBRWxDLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8scURBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxXQUFtQyxDQUFDLENBQUM7UUFDekYsQ0FBQzthQUFNLElBQUksY0FBYyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8scURBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxXQUFvQyxDQUFDLENBQUM7UUFDM0YsQ0FBQzthQUFNLElBQUksY0FBYyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8scURBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxXQUFvQyxDQUFDLENBQUM7UUFDM0YsQ0FBQzthQUFNLElBQUksY0FBYyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzFDLE9BQU8scURBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyxXQUFxQyxDQUFDLENBQUM7UUFDN0YsQ0FBQzthQUFNLElBQUksY0FBYyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLGdEQUFnRDtZQUNoRCxpREFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9CLE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxjQUFjLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDMUMsaURBQWlEO1lBQ2pELGlEQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDL0IsT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLGNBQWMsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMvQixPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsYUFBNEI7UUFDOUQsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLElBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2pFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLElBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQztZQUNsRCxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDO2dCQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMvQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELFNBQVMsSUFBSSxhQUFhLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFzQixFQUFFLFlBQXlCOztRQUM5RSxJQUFJLFVBQW9CLENBQUM7UUFDekIsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsVUFBVSxHQUFHLFlBQVk7aUJBQ3RCLDBCQUEwQixDQUFDO2dCQUMxQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDMUQsYUFBYSxFQUFFLHFFQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7Z0JBQ3pELEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDckIsc0JBQXNCLEVBQUUsY0FBUSxDQUFDLFVBQVUsbUNBQUksQ0FBQztnQkFDaEQsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO2dCQUMvQixHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ2pCLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO2FBQ2hDLENBQUM7aUJBQ0QsV0FBVyxFQUFFLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixzRkFBc0Y7WUFDdEYsc0ZBQXNGO1lBQ3RGLE1BQU0sUUFBUSxHQUFHLCtEQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsaUJBQWlCLENBQUMsOERBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV4RixNQUFNLGVBQWUsR0FBRyx5RUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEUsTUFBTSxhQUFhLEdBQUcscUVBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRWpFLE1BQU0sWUFBWSxHQUFHLFFBQVE7aUJBQzFCLGNBQWMsQ0FBQztnQkFDZCxnQkFBZ0IsRUFDZCxRQUFRLENBQUMsS0FBSztvQkFDZCxlQUFlLENBQUMscUJBQXFCLEVBQUU7b0JBQ3ZDLGFBQWEsQ0FBQyxjQUFjLEVBQUU7Z0JBQ2hDLFVBQVUsRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsR0FBRyxhQUFhLENBQUMsY0FBYyxFQUFFO2FBQ3JGLENBQUM7aUJBQ0QsV0FBVyxFQUFFLENBQUM7WUFFakIsVUFBVSxHQUFHLFlBQVk7aUJBQ3RCLFlBQVksQ0FBQztnQkFDWixlQUFlLEVBQUUsZUFBZTtnQkFDaEMsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDckIsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO2dCQUNqQixHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTthQUNoQyxDQUFDO2lCQUNELFdBQVcsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMsOEJBQThCLENBQUMsUUFBc0IsRUFBRSxTQUFtQjtRQUN2RixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsSUFBSSxZQUFvQyxDQUFDO1FBQ3pDLElBQUksY0FBYyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTyxDQUFDLENBQUM7WUFDbkQsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxNQUFNLENBQUMsNkJBQTZCLENBQUMsYUFBdUI7UUFDbEUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDM0UsTUFBTSxXQUFXLEdBQUcsK0RBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyw4REFBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sZUFBZSxHQUFHLFdBQVc7YUFDaEMsY0FBYyxDQUFDO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtZQUMxQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsV0FBVztTQUN6QyxDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQUM7UUFFakIsTUFBTSxhQUFhLEdBQUcsZUFBZTthQUNsQyxZQUFZLENBQUM7WUFDWixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxZQUFZO1lBQ2pDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRztZQUN0QixHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUc7WUFDdEIsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO1NBQ3JDLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztRQUVqQixhQUFhLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXhDLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxNQUFNLENBQUMsdUNBQXVDLENBQ3BELFFBQXNCLEVBQ3RCLGNBQXFCLEVBQ3JCLFFBQWdCO1FBRWhCLE1BQU0sWUFBWSxHQUFHLFFBQVE7YUFDMUIsY0FBYyxDQUFDO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEtBQUssR0FBRyxjQUFjLEdBQUcsQ0FBQztZQUNyRCxVQUFVLEVBQUUsQ0FBQztTQUNkLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNoRSxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQThCLEVBQUUsUUFBZ0I7O1FBQy9FLE1BQU0sWUFBWSxHQUFHLFFBQVE7YUFDMUIsNEJBQTRCLENBQUM7WUFDNUIsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLFVBQVU7WUFDM0MsVUFBVSxFQUFFLG9CQUFjLENBQUMsVUFBVSxtQ0FBSSxDQUFDO1lBQzFDLFVBQVUsRUFBRSxvQkFBYyxDQUFDLFVBQVUsbUNBQUksQ0FBQztTQUMzQyxDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQUM7UUFFakIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxLQUFVLEVBQUUsT0FBWSxFQUFFLFdBQXdCO1FBQzVGLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxJQUFJLGFBQWEsQ0FBQztRQUNsQixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLFlBQVksS0FBSyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsYUFBYSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pDLGNBQWMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7YUFBTSxJQUFJLFlBQVksS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsYUFBYSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZDLGNBQWMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxRQUFRLEdBQUcsd0JBQXdCLENBQUM7WUFDMUMsaURBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELGFBQWEsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsUUFBUTtRQUVuRCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEQsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLENBQUM7WUFDbkMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxpREFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0IsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixLQUFVLEVBQ1YsT0FBWSxFQUNaLGFBQWtCLEVBQ2xCLHFCQUE4QjtRQUU5QiwyQ0FBMkM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUNoRCxJQUFJLFlBQVksS0FBSyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUM7UUFFWixJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDaEQsT0FBTyxDQUFDLHlCQUF5QixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM5RCxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVk7WUFDWixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNoQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQzFCLFNBQXdCLEVBQ3hCLFNBQW1CLEVBQ25CLFNBQWUsRUFDZixHQUF3RDtRQUV4RCxNQUFNLFVBQVUsR0FDZCxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdkYsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFcEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FDckQsS0FBSyxFQUNMLE9BQU8sRUFDUCx1QkFBdUIsQ0FDeEIsQ0FBQztRQUNGLElBQUksYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRGLGlCQUFpQjtRQUNqQixNQUFNLGFBQWEsR0FBRyxxRUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksYUFBYSxLQUFLLHFFQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbEQsZUFBZSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBRSxDQUFDO1FBQzVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVDQUF1QyxDQUNwRSxTQUFTLENBQUMsYUFBYyxFQUN4QixDQUFDLEVBQ0QsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsS0FBSyxNQUFNLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakQsTUFBTSxnQkFBZ0IsR0FDcEIsU0FBUyxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFNUUsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUMsaUJBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDM0UsSUFBSSxtQkFBbUIsR0FBeUIsU0FBUyxDQUFDO1lBRTFELElBQUkseUNBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDbkMsbUJBQW1CO2dCQUVuQixtQkFBbUIsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQ3ZELHNCQUF1QixFQUN2QixTQUFTLENBQ1YsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixlQUFlO2dCQUVmLE1BQU0sY0FBYyxHQUFHLHlFQUFlLENBQUMsVUFBVSxDQUMvQyxzQkFBdUIsQ0FBQyxJQUFJLENBQzdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUIsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHVDQUF1QyxDQUNoRSxzQkFBdUIsRUFDdkIsY0FBYyxFQUNkLGdCQUFnQixDQUNqQixDQUFDO2dCQUVGLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUMxRCxhQUFhLEVBQ2IsZ0JBQWdCLENBQ2pCLENBQUM7Z0JBQ0YsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNoRSxPQUFPLENBQUMsNkJBQTZCLENBQ25DLGFBQWEsRUFDYixxQkFBcUIsRUFDckIseUJBQXlCLENBQzFCLENBQUM7Z0JBRUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNuQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsbUJBQW1CLENBQUMsU0FBUyxDQUMzQixDQUFDLEVBQ0QseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsRUFDdEQsRUFBRSxDQUNILENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDaEMsbUJBQW1CLENBQUMsT0FBTyxDQUN6QixDQUFDLEVBQ0QseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsRUFDdEQseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQzFELEVBQUUsQ0FDSCxDQUFDO29CQUNKLENBQUM7eUJBQU0sSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2hDLG1CQUFtQixDQUFDLE9BQU8sQ0FDekIsQ0FBQyxFQUNELHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQ3RELHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUMxRCx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFDMUQsRUFBRSxDQUNILENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDaEMsbUJBQW1CLENBQUMsT0FBTyxDQUN6QixDQUFDLEVBQ0QseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsRUFDdEQseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQzFELHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUMxRCx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFDMUQsRUFBRSxDQUNILENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO2dCQUVELEtBQUssQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxzQkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXVCLEVBQUUsbUJBQW9CLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsMEVBQWUsQ0FBQyxnREFBZ0QsQ0FDbkYsMEVBQWUsQ0FBQyxVQUFVLENBQUMsc0JBQXVCLENBQUMsTUFBTyxDQUFDLGFBQWEsQ0FBQyxDQUMxRSxDQUFDO1lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsbUJBQW9CLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZCLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FDM0IsV0FBNEIsRUFDNUIsVUFBb0IsRUFDcEIsOEJBQW1ELEVBQ25ELDZCQUFrRDs7UUFFbEQsSUFBSSxpQkFBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFVBQVUsMENBQUUscUJBQXFCLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFNBQVMsR0FBRyxpRUFBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBRWpCLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUM7WUFDbkUsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNoQyxTQUFTLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNqQyxTQUFTLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNuQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNwQyxDQUFDO1lBRUQsVUFBVSxDQUFDLFlBQVksQ0FBQyw4QkFBOEIsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRSxVQUFVLENBQUMsWUFBWSxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGlDQUFpQyxDQUM5QyxTQUF3QixFQUN4QixTQUFpQjtRQUVqQixJQUFJLDBCQUEwQixHQUFHLENBQUMsQ0FBQztRQUVuQyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxhQUFjLENBQUMsS0FBSyxDQUFDO1lBQzdDLDBCQUEwQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDO1FBQ2pGLEtBQUssTUFBTSxhQUFhLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pELElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN6QyxtQkFBbUI7Z0JBRW5CLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGlCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdELE1BQU0sY0FBYyxHQUFHLHlFQUFlLENBQUMsVUFBVSxDQUFDLFFBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzFGLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7WUFDM0QsMEJBQTBCLElBQUksbUJBQW1CLENBQUM7UUFDcEQsQ0FBQztRQUVELE9BQU8sSUFBSSxrREFBTSxDQUFDO1lBQ2hCLFVBQVUsRUFBRSwwQkFBMEI7WUFDdEMsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLDBCQUEwQixDQUFDO1lBQ25ELElBQUksRUFBRSxPQUFPO1lBQ2IsU0FBUyxFQUFFLENBQUM7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLCtCQUErQixDQUFDLFNBQWUsRUFBRSxVQUErQjtRQUM3Riw0QkFBNEI7UUFDNUIsTUFBTSxjQUFjLEdBQXdCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBa0IsRUFBRSxRQUEyQixFQUFFLEVBQUU7WUFDckYsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDekMsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUN0QixRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO3dCQUMzRCwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNqRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RDLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQzlCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxnQkFBZ0IsR0FBRyw0RkFBaUIsRUFBRSxDQUFDO29CQUM3QyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztvQkFDdkYsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO2dCQUM5QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDOUUsQ0FBQztRQUNILENBQUM7UUFFRCxxQkFBcUI7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDdEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMzQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsV0FBVyxHQUFHLG9EQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pFLENBQUM7Z0JBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLG9CQUFvQixHQUFHLG1FQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RELElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNwRCxvQkFBb0IsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDMUYsQ0FBQztvQkFDRCxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxHQUFHLG9CQUFvQixDQUFDLGVBQWUsQ0FDL0UsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FDbEQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLDhCQUE4QixFQUFFLENBQUM7b0JBQ3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0IsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMzQyxRQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3BGLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyx5QkFBeUIsQ0FDaEMsb0JBQThDLEVBQzlDLFFBQWtCLEVBQ2xCLFNBQWUsRUFDZixPQUFtQyxFQUNuQyxZQUEwQjs7SUFFMUIsTUFBTSxPQUFPLEdBQUcsbUJBQVksQ0FBQyxVQUFVLDBDQUFFLG1CQUFtQixLQUFJLElBQUksQ0FBQztJQUVyRSxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7SUFDN0QsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7UUFDNUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxtREFBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvRCxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBUSxFQUFFLFNBQVMsRUFBRTtZQUNwRixzQkFBc0IsRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsNkJBQTZCO1NBQy9ELENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBUSxDQUFDLENBQUM7UUFDM0UsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QyxRQUFRLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDO0lBQ3ZELElBQUksZ0JBQWdCLElBQUksSUFBSSxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEYsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFRLENBQUMsQ0FBQztRQUMzRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksZ0JBQWdCLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksZ0JBQWdCLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELGNBQWMsQ0FBQyxzQkFBc0IsQ0FDbkMsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUiwyQkFBMkIsRUFDM0IsMEJBQTBCLENBQzNCLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksY0FBYyxHQUFHLG9CQUFvQixDQUFDLGNBQWMsQ0FBQztJQUN6RCxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsYUFBZCxjQUFjLGNBQWQsY0FBYyxHQUFJLENBQUMsQ0FBQztJQUNuRCxJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7SUFDM0QsZUFBZSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLGFBQWYsZUFBZSxjQUFmLGVBQWUsR0FBSSxDQUFDLENBQUM7SUFDckQsUUFBUSxDQUFDLFlBQVksQ0FDbkIseUJBQXlCLEVBQ3pCLG1EQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQzFELENBQUM7SUFFRiw2QkFBNkI7SUFDN0IsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQztJQUMvRSxJQUFJLHdCQUF3QixJQUFJLElBQUksSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzFELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsT0FBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsT0FBUSxDQUFDLENBQUM7UUFDbkYsUUFBUSxDQUFDLG1CQUFtQixDQUFDLDBCQUEwQixFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRSxJQUFJLHdCQUF3QixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QyxRQUFRLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxFQUFFLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLG1FQUFtRTtJQUNuRSwrQkFBK0I7SUFDL0IsaUNBQWlDO0lBRWpDLDJGQUEyRjtJQUMzRixJQUFJO0lBRUosWUFBWTtJQUNaLDZCQUE2QixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFakUsZUFBZTtJQUNmLE1BQU0sWUFBWSxHQUFHLGdDQUFnQyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekYsSUFBSSxDQUFDLE9BQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixPQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUN2QyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5RCx5QkFBeUIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTdELDRCQUE0QixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFaEUsdUJBQXVCLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUUzRCwrQkFBK0IsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRW5FLDhCQUE4QixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFbEUscUNBQXFDLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV6RSwrQkFBK0I7SUFDL0IsMkJBQTJCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFDcEYsQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQ3ZDLFlBQTBCLEVBQzFCLFFBQWtCLEVBQ2xCLFNBQWU7O0lBRWYsTUFBTSwwQkFBMEIsR0FBRyxrQkFBWSxDQUFDLFVBQVUsMENBQUUsMEJBQTBCLENBQUM7SUFDdkYsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxrQkFBa0IsR0FBRyx5Q0FBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRixDQUFDLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCO1lBQy9DLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFaEUsTUFBTSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQyxtQkFBbUIsQ0FBQztRQUMzRSxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQ3pELG1CQUFtQixDQUFDLE9BQVEsRUFDNUIsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQzlFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyw2QkFBNkIsQ0FDcEMsWUFBMEIsRUFDMUIsUUFBa0IsRUFDbEIsU0FBZTs7SUFFZixNQUFNLHVCQUF1QixHQUFHLGtCQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsVUFBVSwwQ0FBRSx1QkFBdUIsQ0FBQztJQUNsRixJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztRQUN0QyxtQkFBbUI7UUFDbkIsTUFBTSxlQUFlLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlO1lBQ3pDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzFELG9CQUFvQjtRQUNwQixNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO1FBQ2xFLElBQUksZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUN0RCxnQkFBZ0IsQ0FBQyxPQUFRLEVBQ3pCLFNBQVMsQ0FDVixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFRLENBQUMsQ0FBQztZQUMzRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDaEYsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3RDLFFBQVEsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUNELDhCQUE4QjtZQUM5QixjQUFjLENBQUMsc0JBQXNCLENBQ25DLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsMkJBQTJCLEVBQzNCLDBCQUEwQixDQUMzQixDQUFDO1FBQ0osQ0FBQztRQUNELDZCQUE2QjtRQUM3QixNQUFNLHdCQUF3QixHQUFHLHlDQUFFLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDO1lBQ3pGLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0I7WUFDbEQsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNSLFFBQVEsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUM1RSw4QkFBOEI7UUFDOUIsTUFBTSx5QkFBeUIsR0FBRyx1QkFBdUIsQ0FBQyx5QkFBeUIsQ0FBQztRQUNwRixJQUFJLHlCQUF5QixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RDLE1BQU0sMkJBQTJCLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FDL0QseUJBQXlCLENBQUMsT0FBUSxFQUNsQyxTQUFTLENBQ1YsQ0FBQztZQUNGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsT0FBUSxDQUFDLENBQUM7WUFDcEYsUUFBUSxDQUFDLG1CQUFtQixDQUMxQiwyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLFNBQVMsQ0FDVixDQUFDO1lBQ0YsSUFBSSx5QkFBeUIsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQy9DLFFBQVEsQ0FBQyxZQUFZLENBQ25CLGlDQUFpQyxFQUNqQyx5QkFBeUIsQ0FBQyxRQUFRLENBQ25DLENBQUM7WUFDSixDQUFDO1lBQ0Qsd0NBQXdDO1lBQ3hDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FDbkMseUJBQXlCLEVBQ3pCLFFBQVEsRUFDUixvQ0FBb0MsRUFDcEMsbUNBQW1DLENBQ3BDLENBQUM7UUFDSixDQUFDO1FBQ0QsMkJBQTJCO1FBQzNCLE1BQU0sc0JBQXNCLEdBQUcsdUJBQXVCLENBQUMsc0JBQXNCLENBQUM7UUFDOUUsSUFBSSxzQkFBc0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQyxNQUFNLHdCQUF3QixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQzVELHNCQUFzQixDQUFDLE9BQVEsRUFDL0IsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQ2pGLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsRUFBRSx3QkFBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1RixJQUFJLHNCQUFzQixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsUUFBUSxDQUFDLFlBQVksQ0FBQyw4QkFBOEIsRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6RixDQUFDO1lBQ0QscUNBQXFDO1lBQ3JDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FDbkMsc0JBQXNCLEVBQ3RCLFFBQVEsRUFDUixpQ0FBaUMsRUFDakMsZ0NBQWdDLENBQ2pDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUNqQyxZQUEwQixFQUMxQixRQUFrQixFQUNsQixTQUFlOztJQUVmLE1BQU0sb0JBQW9CLEdBQUcsa0JBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxVQUFVLDBDQUFFLG9CQUFvQixDQUFDO0lBQzVFLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLGVBQWU7WUFDMUQsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGVBQWU7WUFDdEMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNSLElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLFFBQVEsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUM7UUFDL0QsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQ3RELGdCQUFnQixDQUFDLE9BQVEsRUFDekIsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQzNFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQ0QsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0IsQ0FBQyxtQkFBbUI7WUFDbEUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQjtZQUMxQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ1IsSUFBSSxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQyxRQUFRLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUMsZ0JBQWdCO1lBQzVELENBQUMsQ0FBQyxrREFBTyxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvRCxDQUFDLENBQUMsa0RBQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLFFBQVEsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUNsQyxnQkFBNkMsRUFDN0MsUUFBa0IsRUFDbEIsd0JBQXFEO0lBRXJELGNBQWMsQ0FBQyxzQkFBc0IsQ0FDbkMsZ0JBQWlCLEVBQ2pCLFFBQVEsRUFDUiwyQkFBMkIsRUFDM0IsMEJBQTBCLENBQzNCLENBQUM7SUFFRix3Q0FBd0M7SUFDeEMsY0FBYyxDQUFDLHNCQUFzQixDQUNuQyx3QkFBeUIsRUFDekIsUUFBUSxFQUNSLG1DQUFtQyxFQUNuQyxrQ0FBa0MsQ0FDbkMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUNoQyxZQUEwQixFQUMxQixRQUFrQixFQUNsQixTQUFlOztJQUVmLE1BQU0sbUJBQW1CLEdBQUcsa0JBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxVQUFVLDBDQUFFLG1CQUFtQixDQUFDO0lBQzFFLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUM7WUFDckUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQjtZQUN0QyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsa0RBQU8sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUM7UUFDaEUsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQ3ZELGlCQUFpQixDQUFDLE9BQVEsRUFDMUIsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQzVFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQztZQUM3RSxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CO1lBQzFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDcEUsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RSxJQUFJLHFCQUFxQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FDM0QscUJBQXFCLENBQUMsT0FBUSxFQUM5QixTQUFTLENBQ1YsQ0FBQztZQUNGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsT0FBUSxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVGLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQ25DLFlBQTBCLEVBQzFCLFFBQWtCLEVBQ2xCLFNBQWU7O0lBRWYsTUFBTSxzQkFBc0IsR0FBRyxrQkFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFVBQVUsMENBQUUsc0JBQXNCLENBQUM7SUFDaEYsSUFBSSx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjO1lBQ3ZDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLGVBQWUsQ0FBQztRQUMvRCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM3RixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxPQUFRLENBQUMsQ0FBQztZQUMxRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUM7WUFDOUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQjtZQUM1QyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsa0RBQU8sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUMsb0JBQW9CLENBQUM7UUFDekUsSUFBSSxvQkFBb0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxNQUFNLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQzFELG9CQUFvQixDQUFDLE9BQVEsRUFDN0IsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQy9FLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLFlBQTBCLEVBQUUsUUFBa0IsRUFBRSxTQUFlOztJQUM5RixNQUFNLGlCQUFpQixHQUFHLGtCQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsVUFBVSwwQ0FBRSxpQkFBaUIsQ0FBQztJQUN0RSxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEdBQUcsR0FBRyx5Q0FBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDMUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUN0QyxZQUEwQixFQUMxQixRQUFrQixFQUNsQixTQUFlOztJQUVmLE1BQU0seUJBQXlCLEdBQUcsa0JBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxVQUFVLDBDQUFFLHlCQUF5QixDQUFDO0lBQ3RGLElBQUkseUNBQUUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE1BQU0saUJBQWlCLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUM7WUFDN0UsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLGlCQUFpQjtZQUM3QyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ1IsUUFBUSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELE1BQU0sa0JBQWtCLEdBQUcseUJBQXlCLENBQUMsa0JBQWtCLENBQUM7UUFDeEUsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixNQUFNLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQ3hELGtCQUFrQixDQUFDLE9BQVEsRUFDM0IsU0FBUyxDQUNWLENBQUM7WUFDRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQzdFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsY0FBYyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjO1lBQzFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDUixRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXhELE1BQU0sMkJBQTJCLEdBQUcseUNBQUUsQ0FBQyxLQUFLLENBQzFDLHlCQUF5QixDQUFDLDJCQUEyQixDQUN0RDtZQUNDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQywyQkFBMkI7WUFDdkQsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNWLFFBQVEsQ0FBQyxZQUFZLENBQUMsNkJBQTZCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUVsRixNQUFNLDJCQUEyQixHQUFHLHlDQUFFLENBQUMsS0FBSyxDQUMxQyx5QkFBeUIsQ0FBQywyQkFBMkIsQ0FDdEQ7WUFDQyxDQUFDLENBQUMseUJBQXlCLENBQUMsMkJBQTJCO1lBQ3ZELENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDVixRQUFRLENBQUMsWUFBWSxDQUFDLDZCQUE2QixFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFFbEYsTUFBTSwyQkFBMkIsR0FBRyx5QkFBeUIsQ0FBQywyQkFBMkIsQ0FBQztRQUMxRixJQUFJLDJCQUEyQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sNkJBQTZCLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FDakUsMkJBQTJCLENBQUMsT0FBUSxFQUNwQyxTQUFTLENBQ1YsQ0FBQztZQUNGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsMkJBQTJCLENBQUMsT0FBUSxDQUFDLENBQUM7WUFDdEYsUUFBUSxDQUFDLG1CQUFtQixDQUMxQiw2QkFBNkIsRUFDN0IsNkJBQTZCLEVBQzdCLFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyw4QkFBOEIsQ0FDckMsWUFBMEIsRUFDMUIsUUFBa0IsRUFDbEIsU0FBZTs7SUFFZixNQUFNLHdCQUF3QixHQUFHLGtCQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsVUFBVSwwQ0FBRSx3QkFBd0IsQ0FBQztJQUNwRixJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztRQUN2QyxNQUFNLGtCQUFrQixHQUFHLHlDQUFFLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDO1lBQzlFLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDN0MsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNSLFFBQVEsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNoRSxNQUFNLGtCQUFrQixHQUFHLHlDQUFFLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDO1lBQzlFLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDN0MsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNSLFFBQVEsQ0FBQyxZQUFZLENBQ25CLG9CQUFvQixFQUNwQixtREFBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQzlFLENBQUM7UUFFRixNQUFNLGlCQUFpQixHQUFHLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDO1FBQ3JFLElBQUksaUJBQWlCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUN2RCxpQkFBaUIsQ0FBQyxPQUFRLEVBQzFCLFNBQVMsQ0FDVixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFRLENBQUMsQ0FBQztZQUM1RSxRQUFRLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEYsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxxQ0FBcUMsQ0FDNUMsWUFBMEIsRUFDMUIsUUFBa0IsRUFDbEIsU0FBZTs7SUFFZixNQUFNLCtCQUErQixHQUFHLGtCQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsVUFBVSwwQ0FBRSwrQkFBK0IsQ0FBQztJQUNsRyxJQUFJLHlDQUFFLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLGdCQUFnQixHQUFHLHlDQUFFLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUFDO1lBQ2pGLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxnQkFBZ0I7WUFDbEQsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNSLFFBQVEsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0FBQ0gsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6bUZnRztBQWExRTtBQUVxQztBQUNKO0FBRVo7QUFDWjtBQUNRO0FBRWpDLE1BQU0sd0JBQXdCO0lBR25DLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBYyxFQUFFLE1BQTJCO1FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcscUJBQXFCLENBQUM7UUFDbEQsSUFDRSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUM5QyxPQUFPLG1CQUFtQixLQUFLLFNBQVMsQ0FBQztZQUMzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDVCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDakUsbUJBQW1CLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDekMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFjLEVBQUUsU0FBNEI7UUFDOUQsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztRQUNsRCxJQUNFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ2pDLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO1lBQ3JELFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQzlDLE9BQU8sbUJBQW1CLEtBQUssU0FBUyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNULENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUF3QixDQUFDO1FBQzVFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsbUJBQW1CO2FBQ3BELE9BQTBDLENBQUM7UUFFOUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sZUFBZSxHQUFHLG9FQUFnQixDQUFDLG9CQUFvQixDQUFDLDZFQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFGLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFELGtCQUFrQixDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztZQUM5QyxxQ0FBcUM7WUFDckMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxVQUFVLENBQUMsYUFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFnQyxFQUFFLEVBQUU7b0JBQ2xFLE1BQU0sZUFBZSxHQUFHLG9EQUFRLENBQUMsa0NBQWtDLENBQ2pFLFFBQVEsRUFDUixNQUFNLENBQUMsVUFBVyxFQUNsQixtQkFBbUIsQ0FDcEIsQ0FBQztvQkFDRixrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQzNELGVBQWUsQ0FBQyxVQUFVLEVBQzFCLGVBQWUsQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FDeEQsQ0FBQztvQkFDRixrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ3BDLGtCQUFrQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGdEQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUVELHdCQUF3QixDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVsRCxNQUFNLEtBQUssR0FBRyxnR0FBb0MsQ0FBQyxLQUFLLENBQUM7WUFDekQsNkVBQWtCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyx3QkFBd0IsQ0FDL0IsTUFBOEYsRUFDOUYsTUFBcUM7SUFFckMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQzFELCtEQUFzQixDQUFDLHFCQUFxQixDQUN2QixDQUFDO0lBQ3hCLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ2pDLGtCQUFrQixDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUM5QyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRWpDLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQThDLENBQUM7WUFDeEUsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQStDLENBQUM7Z0JBQ3hFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ25DLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDMUMsT0FBTzt3QkFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7d0JBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztxQkFDbkIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNwRCxJQUFJLGVBTVMsQ0FBQztnQkFDZCxJQUFJLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3JDLGVBQWUsR0FBRyxvRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQywyREFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdEYsQ0FBQztnQkFDRCxrQkFBa0IsR0FBRyxlQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNyRCxrQkFBa0IsQ0FBQyxZQUFZLENBQzdCLHdDQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDakQsV0FBVyxFQUNYLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1RCxJQUFJLFlBQVksQ0FDZCxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQzNCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDM0IsT0FBTyxDQUFDLENBQUM7b0JBQ1gsQ0FBQzt5QkFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7d0JBQ25DLE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLENBQUMsQ0FBQztvQkFDWCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUNILEVBQ0QsQ0FBQyxFQUNELGdFQUFzQixDQUFDLElBQUksRUFDM0IsSUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SitDO0FBQ0U7QUFDbEI7QUFJb0I7QUFDTjtBQUNjO0FBQ3FDO0FBQ3ZCO0FBRUw7QUFDM0I7QUFDK0I7QUFDZDtBQUNFO0FBQ2dCO0FBQy9CO0FBQ3FCO0FBQ2pCO0FBRWxEOzs7R0FHRztBQUNJLE1BQU0sYUFBYTtJQUN4QixnQkFBdUIsQ0FBQztJQUV4Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUMvQixHQUFXLEVBQ1gsT0FBd0I7O1FBRXhCLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0seURBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLDhDQUFHLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLDRCQUE0QjtnQkFDckMsS0FBSyxFQUFFLE1BQU07YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQseURBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sa0NBQWtDLEdBQ3RDLHFCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxrQ0FBa0MsQ0FBQztRQUM5RSxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQzFELGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDNUQsQ0FBQztRQUVELGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXhFLGtCQUFrQjtRQUNsQixJQUFJLFVBQVUsQ0FBQztRQUNmLE1BQU0sYUFBYSxHQUFHLDJEQUFjLENBQUMsd0JBQXdCLENBQUMsU0FBVSxDQUFDLENBQUM7UUFFMUUsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkYsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN6RCxDQUFDO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBRywyREFBYyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTVFLFVBQVUsR0FBRyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELGFBQWEsQ0FBQyxlQUFlLENBQUMsU0FBa0IsQ0FBQyxDQUFDO1FBQ2xELGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXRFLE9BQU8sSUFBSSw2Q0FBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDMUIsR0FBVyxFQUNYLE9BQXdCO1FBRXhCLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0seURBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLDhDQUFHLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLDRCQUE0QjtnQkFDckMsS0FBSyxFQUFFLE1BQU07YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQseURBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUIsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFFBQWlCLENBQUMsQ0FBQztRQUV0RCxPQUFPLElBQUksNkNBQUUsQ0FBQyxRQUFpQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQWUsRUFBRSxZQUEwQjs7UUFDcEUsNkNBQTZDO1FBQzdDLE1BQU0sa0NBQWtDLEdBQ3RDLHFCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxrQ0FBa0MsQ0FBQztRQUM5RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLENBQUM7WUFDakQsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtnQkFDNUMsd0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxtQ0FBSSxRQUFRLENBQUM7WUFDN0Qsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtnQkFDNUMsd0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxtQ0FBSSxRQUFRLENBQUM7WUFDN0Qsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTtnQkFDOUMsd0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxtQ0FBSSxJQUFJLENBQUM7UUFDN0QsQ0FBQztRQUNELElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9ELGdCQUFnQjtRQUNoQixJQUFJLFNBQVMsQ0FBQztRQUNkLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFZLENBQUMsQ0FBQyxDQUFDLG1DQUFJLElBQUksNERBQVUsRUFBRSxDQUFDO1lBQ3RELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGlCQUFpQixDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUM3QyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDN0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHO2dCQUNyQyxpQkFBaUIsRUFBRSxpQkFBaUI7YUFDckMsQ0FBQztZQUVGLFNBQVMsR0FBRywyREFBYyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9ELGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEdBQUcsMkRBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRCxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQWtCLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFNBQWdCLEVBQUUsVUFBNkI7UUFDekUsTUFBTSxjQUFjLEdBQW9CLEVBQUUsQ0FBQztRQUUzQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1FBQ3BGLEtBQUssTUFBTSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGFBQWEsR0FBa0I7Z0JBQ25DLElBQUksRUFBRSxlQUFlLENBQUMsVUFBVTtnQkFDaEMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO2dCQUNsQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ2hELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQzVCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNoRCxPQUFPO2dDQUNMLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztnQ0FDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLO2dDQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHOzZCQUMxQixDQUFDO3dCQUNKLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQy9ELENBQUMsQ0FBQzthQUNILENBQUM7WUFDRixjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxvRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyx1RUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFNBQWdCLEVBQUUsVUFBOEI7UUFDMUUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUNoRSxNQUFNLGFBQWEsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyRCwwREFBMEQ7UUFDMUQsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsVUFBVSxDQUFDLFdBQVcsQ0FBQztnQkFDckIsR0FBRyxFQUFFLDBCQUEwQjtnQkFDL0IsS0FBSyxFQUFFLGFBQWE7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWdCO1FBQ3JDLE1BQU0sY0FBYyxHQUF1QixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFGLE1BQU0sYUFBYSxHQUNqQixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMvRSxNQUFNLGdCQUFnQixHQUFHLElBQUksa0ZBQWdCLEVBQUUsQ0FBQztZQUNoRCxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdEMsTUFBTSxTQUFTLEdBQXFCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxVQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZGLEtBQUssTUFBTSxRQUFRLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLGNBQWMsR0FBRyxJQUFJLDZFQUFjLEVBQUUsQ0FBQztnQkFDNUMsY0FBYyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7Z0JBQ3ZDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUM7b0JBQzlDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDakIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxjQUFjLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELGdCQUFnQixDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDL0MsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUM7UUFDbkMsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvRSxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLFVBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1RSxNQUFNLGtCQUFrQixHQUFHLElBQUksb0VBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUUxRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9ELGtCQUFrQixDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ3RGLE9BQU8sY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLGFBQWEsR0FBd0IsRUFBRSxDQUFDO1lBQzlDLEtBQUssTUFBTSxVQUFVLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxVQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLHNEQUFzRDtnQkFDdEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQywwQkFBMEIsQ0FDdkMsU0FBb0IsRUFDcEIsTUFBeUIsRUFDekIsU0FBeUIsRUFDekIsYUFBa0M7UUFFbEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFFN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLDRFQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQzNDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNqRCxVQUFVLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxrREFBTyxDQUFDLGFBQWEsQ0FBQztnQkFDNUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0QixTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN2QixDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDM0MsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQW9CLEVBQUUsRUFBdUI7UUFDaEYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUN6QixNQUFNLFNBQVMsR0FBRyxvRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxrRkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRixNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLHlHQUE0QixFQUFFLENBQUM7UUFDcEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBZTtRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVqRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFjLEVBQUUsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sU0FBUyxHQUFHLDJEQUFjLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1RSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksc0RBQU8sRUFBRSxDQUFDO1FBQ3hDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDM0MsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25DLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxzREFBTyxFQUFFLENBQUM7UUFDeEMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3RCxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFbkMsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBZTtRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVqRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFjLEVBQUUsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sU0FBUyxHQUFHLDJEQUFjLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDNUIsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksdURBQU8sQ0FBQztZQUMvQixLQUFLLEVBQUUsMkRBQWdCLENBQUMsV0FBVztZQUNuQyxLQUFLLEVBQUUsMkRBQWdCLENBQUMsV0FBVztZQUNuQyxTQUFTLEVBQUUsMkRBQWdCLENBQUMsTUFBTTtZQUNsQyxTQUFTLEVBQUUsMkRBQWdCLENBQUMsTUFBTTtTQUNuQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTlCLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsYUFBa0I7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUM7UUFDNUQsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixLQUFLLE1BQU0sZ0JBQWdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzdELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFlLEVBQUUsY0FBc0I7UUFDMUUsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUV2RSxLQUFLLE1BQU0sZ0JBQWdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUNsRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDcEUsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FDaEQsU0FBZSxFQUNmLGNBQXNCO1FBRXRCLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFFdkUsTUFBTSx1QkFBdUIsR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUVuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkQsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBQzlELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxFQUFFLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2RSxnRkFBZ0Y7WUFDaEYsZ0ZBQWdGO1lBQ2hGLGlGQUFpRjtZQUVqRixNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1lBQ2hFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsZ0NBQWdDLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLHFGQUFxRjtZQUNyRix5RkFBeUY7WUFDekYscUZBQXFGO1lBQ3JGLGlHQUFpRztZQUNqRyxrR0FBa0c7WUFDbEcsMEZBQTBGO1lBQzFGLGlHQUFpRztZQUNqRyx1RkFBdUY7WUFFdkYsMkJBQTJCO1lBQzNCLE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7WUFDbEUsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxnQ0FBZ0MsQ0FDbkMsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCx1QkFBdUIsQ0FDeEIsQ0FBQztZQUNGLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsZ0NBQWdDLENBQ25DLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsZ0NBQWdDLENBQ25DLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsZ0NBQWdDLENBQ25DLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsZ0NBQWdDLENBQ25DLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsZ0NBQWdDLENBQ25DLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsZ0NBQWdDLENBQ25DLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osdUJBQXVCLENBQ3hCLENBQUM7WUFDRiwyR0FBMkc7UUFDN0csQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixRQUFRLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FDN0MsTUFBVyxFQUNYLFlBQW9CLEVBQ3BCLFlBQWlCO1FBRWpCLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUk7WUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsWUFBWSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQXdCO1FBQ3pDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BCLEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQztvQkFDL0MsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztZQUVELG9CQUFvQjtZQUNwQixPQUFPLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUMvQixJQUFJLE9BQU8sQ0FBQyxrQ0FBa0MsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkQsT0FBTyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzlELE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHO2dCQUNSLEtBQUssRUFBRSxFQUFFO2dCQUNULGVBQWUsRUFBRSxTQUFTO2dCQUMxQix5QkFBeUIsRUFBRSxTQUFTO2dCQUNwQyxrQ0FBa0MsRUFBRTtvQkFDbEMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtpQkFDekQ7Z0JBQ0QsZ0JBQWdCLEVBQUU7b0JBQ2hCO3dCQUNFLE9BQU8sRUFBRSxFQUFFO3dCQUNYLE1BQU0sRUFBRTs0QkFDTixNQUFNLEVBQUUsRUFBRTs0QkFDVixTQUFTLEVBQUUsRUFBRTt5QkFDZDt3QkFDRCxhQUFhLEVBQUUsSUFBSTt3QkFDbkIsT0FBTyxFQUFFLEdBQUc7d0JBQ1osc0NBQXNDLEVBQUUsS0FBSztxQkFDOUM7aUJBQ0Y7Z0JBQ0QsZUFBZSxFQUFFLElBQUk7Z0JBQ3JCLGNBQWMsRUFBRSxPQUFPO2FBQ3hCLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlmRCxzQ0FBc0M7QUFDWTtBQUNsQjtBQUdvQjtBQUNOO0FBQ2M7QUFDcUM7QUFDdkI7QUFFTDtBQUMzQjtBQUMrQjtBQUNkO0FBRUU7QUFDYjtBQUNGO0FBQ3NDO0FBQ2pCO0FBQ0k7QUFDUjtBQUNNO0FBQ0Y7QUFDVTtBQUNWO0FBRTVELE1BQU0sV0FBVztJQUN0QixnQkFBdUIsQ0FBQztJQUV4QixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFlLEVBQUUsWUFBMEI7O1FBQ2xFLDZDQUE2QztRQUM3QyxNQUFNLGtDQUFrQyxHQUN0QyxxQkFBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGVBQWUsMENBQUUsa0NBQWtDLENBQUM7UUFDOUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDO1lBQ2pELGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQzVDLHdDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsbUNBQUksUUFBUSxDQUFDO1lBQzdELGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQzVDLHdDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsbUNBQUksUUFBUSxDQUFDO1lBQzdELGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7Z0JBQzlDLHdDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsbUNBQUksSUFBSSxDQUFDO1FBQzdELENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUNBQW1DLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxRixnQkFBZ0I7UUFDaEIsSUFBSSxTQUFTLENBQUM7UUFDZCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBWSxDQUFDLENBQUMsQ0FBQyxtQ0FBSSxJQUFJLDREQUFVLEVBQUUsQ0FBQztZQUN0RCxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDN0MsaUJBQWlCLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM5QixTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUc7Z0JBQ3JDLGlCQUFpQixFQUFFLGlCQUFpQjthQUNyQyxDQUFDO1lBRUYsU0FBUyxHQUFHLDJEQUFjLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0QsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsR0FBRywyREFBYyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBaUIsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFpQixDQUFDLENBQUM7UUFFekMsSUFBSSxnQkFBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGVBQWUsS0FBSSxJQUFJLEVBQUUsQ0FBQztZQUNwRCx5REFBeUQ7WUFDekQsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztRQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFlOztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLGdCQUFJLENBQUMsVUFBVSwwQ0FBRSxvQkFBb0IsMENBQUUsVUFBVSxDQUFDO1lBQ3JFLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDN0IsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0QsTUFBTSxTQUFTLEdBQUcsb0VBQWdCLENBQUMsb0JBQW9CLENBQUMsd0VBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3pGLE1BQU0sY0FBYyxHQUFHLElBQUksOEVBQWlCLENBQzFDLFNBQVMsRUFDVCxJQUFJLENBQUMsUUFBUSxFQUNiLHdDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUN6QyxTQUFTLENBQ1YsQ0FBQztvQkFDRixTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO3FCQUFNLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7b0JBQzNCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFELE1BQU0sU0FBUyxHQUFHLG9FQUFnQixDQUFDLG9CQUFvQixDQUFDLHdFQUFtQixFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUN6RixNQUFNLGFBQWEsR0FBRyxJQUFJLDRFQUFnQixDQUN4QyxTQUFTLEVBQ1QsR0FBRyxDQUFDLE9BQU8sRUFDWCx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFDdkMsU0FBUyxDQUNWLENBQUM7b0JBQ0YsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDekQsQ0FBQztxQkFBTSxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN6QyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUNyQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMvRCxNQUFNLFNBQVMsR0FBRyxvRUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyx3RUFBbUIsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDekYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHNGQUFxQixDQUNsRCxTQUFTLEVBQ1Qsd0NBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQ2pELFNBQVMsQ0FDVixDQUFDO29CQUNGLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFlLEVBQUUsVUFBNkI7O1FBQ3BFLE1BQU0sY0FBYyxHQUFvQixFQUFFLENBQUM7UUFFM0MsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSwwQ0FBRSxXQUFXLDBDQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckUsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JFLEtBQUssTUFBTSxjQUFjLElBQUksV0FBVyxFQUFFLENBQUM7WUFDekMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9DLElBQUksS0FBSyxHQUE2QixFQUFFLENBQUM7WUFDekMsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxLQUFLLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUMvQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hELE9BQU87d0JBQ0wsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO3dCQUM3QixhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtxQkFDcEIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLGFBQWEsR0FBa0I7Z0JBQ25DLElBQUksRUFBRSxjQUFjO2dCQUNwQixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQztZQUNGLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLG9FQUFnQixDQUFDLG9CQUFvQixDQUFDLHNEQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEYsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsU0FBZSxFQUFFLFVBQThCO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDckUsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckQsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixVQUFVLENBQUMsV0FBVyxDQUFDO2dCQUNyQixHQUFHLEVBQUUsMEJBQTBCO2dCQUMvQixLQUFLLEVBQUUsYUFBYTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBZTs7UUFDcEMsTUFBTSxjQUFjLEdBQXVCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLGVBQVMsQ0FBQyxVQUFVLENBQUMsZUFBZSwwQ0FBRSxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ25FLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkYsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBRTVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxpRkFBZ0IsRUFBRSxDQUFDO2dCQUNoRCxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3RDLEtBQUssTUFBTSxXQUFXLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNsRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRTdFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLFVBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2xGLElBQUksd0NBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLDZFQUFjLEVBQUUsQ0FBQzt3QkFDNUMsY0FBYyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7d0JBQ3ZDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUM7NEJBQzlDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7NEJBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7NEJBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7eUJBQ2hDLENBQUMsQ0FBQzt3QkFDSCxjQUFjLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFDckQsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDeEQsQ0FBQzt5QkFBTSxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDNUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxnRkFBZSxFQUFFLENBQUM7d0JBQzlDLGVBQWUsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO3dCQUN4QyxlQUFlLENBQUMsUUFBUSxHQUFHLGtEQUFPLENBQUMsYUFBYSxDQUFDOzRCQUMvQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzRCQUNoQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzRCQUNoQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3lCQUNqQyxDQUFDLENBQUM7d0JBQ0gsZUFBZSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ3ZELGVBQWUsQ0FBQyxJQUFJLEdBQUcsa0RBQU8sQ0FBQyxhQUFhLENBQUM7NEJBQzNDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQzlCLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQzlCLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7eUJBQy9CLENBQUMsQ0FBQzt3QkFDSCxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQzFELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLHdDQUFFLENBQUMsS0FBSyxDQUFDLGVBQVMsQ0FBQyxVQUFVLENBQUMsZUFBZSwwQ0FBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVELEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLFVBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVFLE1BQU0sU0FBUyxHQUFHLElBQUksb0VBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDakUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sb0JBQW9CLEdBQUcsd0NBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFGLFNBQVMsQ0FBQyxjQUFjLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtvQkFDdkUsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsTUFBTSxhQUFhLEdBQXdCLEVBQUUsQ0FBQztnQkFDOUMsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3RDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLFVBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksNEVBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDN0MsVUFBVSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO29CQUN2QyxVQUFVLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7b0JBQzVDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsd0NBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hGLFVBQVUsQ0FBQyxVQUFVLEdBQUcsd0NBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQzt3QkFDaEQsQ0FBQyxDQUFDLGtEQUFPLENBQUMsY0FBYyxDQUFDOzRCQUNyQixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDbkIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7NEJBQ25CLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3lCQUNwQixDQUFDO3dCQUNKLENBQUMsQ0FBQyxrREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxVQUFVLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7b0JBQ3ZDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNqQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELHNEQUFzRDtnQkFDdEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQzNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLDBCQUEwQixDQUN2QyxTQUFvQixFQUNwQixNQUF5QixFQUN6QixhQUFrQztRQUVsQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUU3QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksNEVBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFpQixFQUFFLEVBQXVCO1FBQzdFLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsb0VBQWdCLENBQUMsb0JBQW9CLENBQUMsa0ZBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEYsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSx5R0FBNEIsRUFBRSxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWU7UUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQUUsU0FBUyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFakQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBYyxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRywyREFBYyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHNEQUFPLEVBQUUsQ0FBQztRQUN4QyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzNDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuQyxNQUFNLGlCQUFpQixHQUFHLElBQUksc0RBQU8sRUFBRSxDQUFDO1FBQ3hDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0QsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWU7UUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQUUsU0FBUyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFakQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBYyxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRywyREFBYyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLHVEQUFPLENBQUM7WUFDL0IsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7WUFDbkMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7WUFDbkMsU0FBUyxFQUFFLDRFQUFnQixDQUFDLE1BQU07WUFDbEMsU0FBUyxFQUFFLDRFQUFnQixDQUFDLE1BQU07U0FDbkMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU5QixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU8sTUFBTSxDQUFDLG1DQUFtQyxDQUNoRCxTQUFlLEVBQ2YsY0FBc0I7O1FBRXRCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxNQUFNLGFBQWEsR0FBeUIsY0FBUSxDQUFDLFVBQVUsMENBQUUsb0JBQW9CLENBQUM7WUFDdEYsSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzFCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRW5DLE1BQU0scUJBQXFCLEdBQTBCO2dCQUNuRCxJQUFJLEVBQUUsdUJBQXVCO2dCQUM3QixXQUFXLEVBQUUsQ0FBQyxFQUFFLGNBQWM7Z0JBQzlCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixlQUFlLEVBQUU7b0JBQ2YsVUFBVSxFQUFFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO3dCQUMxQyxDQUFDLENBQUMsQ0FBQzt3QkFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxRQUFROzRCQUNqQyxDQUFDLENBQUMsQ0FBQzs0QkFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxNQUFNO2dDQUMvQixDQUFDLENBQUMsQ0FBQztnQ0FDSCxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxPQUFPO29DQUNoQyxDQUFDLENBQUMsQ0FBQztvQ0FDSCxDQUFDLENBQUMsQ0FBQztvQkFDTCxTQUFTLEVBQUUsd0NBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hGLFVBQVUsRUFBRSxHQUFHO29CQUNmLE9BQU8sRUFBRSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXO29CQUN4RSxVQUFVLEVBQUUsQ0FBQztvQkFDYixTQUFTLEVBQUUsQ0FBQztvQkFDWixTQUFTLEVBQUUsRUFBRTtvQkFDYix1QkFBdUIsRUFBRSxHQUFHO29CQUM1QixzQkFBc0IsRUFBRSxHQUFHO29CQUMzQixpQkFBaUIsRUFBRSxDQUFDO29CQUNwQixnQkFBZ0IsRUFBRSxDQUFDO29CQUNuQixtQkFBbUIsRUFBRSxhQUFhLENBQUMsd0JBQXdCO29CQUMzRCx5QkFBeUIsRUFBRSxHQUFHO29CQUM5QixhQUFhLEVBQUUsYUFBYSxDQUFDLGtCQUFrQixHQUFHLEdBQUc7b0JBQ3JELGlCQUFpQixFQUNmLGFBQWEsQ0FBQyxnQkFBZ0IsS0FBSyxrQkFBa0I7d0JBQ25ELENBQUMsQ0FBQyxDQUFDO3dCQUNILENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEtBQUssbUJBQW1COzRCQUN4RCxDQUFDLENBQUMsQ0FBQzs0QkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDUCxrQkFBa0IsRUFBRSxHQUFHO29CQUN2QixnQkFBZ0IsRUFBRSxhQUFhLENBQUMsK0JBQStCO29CQUMvRCxRQUFRLEVBQUUsYUFBYSxDQUFDLHVCQUF1QjtvQkFDL0MsZUFBZSxFQUFFLGFBQWEsQ0FBQyx1QkFBdUI7b0JBQ3RELFdBQVcsRUFBRSxhQUFhLENBQUMsa0JBQWtCO29CQUM3QyxXQUFXLEVBQUUsYUFBYSxDQUFDLGtCQUFrQjtvQkFDN0MsaUJBQWlCLEVBQUUsR0FBRztvQkFDdEIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRDtnQkFDRCxnQkFBZ0IsRUFBRTtvQkFDaEIsTUFBTSxFQUFFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFRLENBQUMsb0JBQW9CLDBDQUFFLGVBQWUsQ0FBQzt3QkFDbEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNkLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQXFCLENBQUMsZUFBZTtvQkFDbEQsY0FBYyxFQUFFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO3dCQUNuRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDWCxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWM7b0JBQzNCLGFBQWEsRUFBRSxhQUFhLENBQUMsa0JBQWtCO29CQUMvQyxXQUFXLEVBQUUsYUFBYSxDQUFDLGdCQUFnQjtvQkFDM0MsU0FBUyxFQUFFLGFBQWEsQ0FBQyx3QkFBd0I7b0JBQ2pELFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQixRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RCLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNsQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbkMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMzQixvQkFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDbEMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN6QjtnQkFDRCxpQkFBaUIsRUFBRTtvQkFDakIsUUFBUSxFQUFFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO3dCQUM1QyxDQUFDLENBQUMsdUJBQXVCO3dCQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLO29CQUNoQyxZQUFZLEVBQUUsd0NBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7d0JBQ2xELENBQUMsQ0FBQyx1QkFBdUI7d0JBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUs7b0JBQ2xDLFFBQVEsRUFBRSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBUSxDQUFDLG9CQUFvQiwwQ0FBRSxnQkFBZ0IsQ0FBQzt3QkFDckUsQ0FBQyxDQUFDLHVCQUF1Qjt3QkFDekIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO29CQUN6RCxvQkFBb0IsRUFBRSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDO3dCQUMzRSxDQUFDLENBQUMsdUJBQXVCO3dCQUN6QixDQUFDLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLEtBQUs7b0JBQ25ELHFCQUFxQixFQUFFLHVCQUF1QjtvQkFDOUMsYUFBYSxFQUFFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUM7d0JBQzdELENBQUMsQ0FBQyx1QkFBdUI7d0JBQ3pCLENBQUMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsS0FBSztvQkFDNUMsV0FBVyxFQUFFLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUM7d0JBQ3pELENBQUMsQ0FBQyx1QkFBdUI7d0JBQ3pCLENBQUMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsS0FBSztvQkFDMUMsb0JBQW9CLEVBQUUsdUJBQXVCO29CQUM3QyxVQUFVLEVBQUUsdUJBQXVCO2lCQUNwQzthQUNGLENBQUM7WUFFRixJQUFJLHdDQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDdkIsQ0FBQztZQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7WUFFOUQsSUFBSSxhQUFhLENBQUMsZ0JBQWdCLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUF3QjtRQUN6QyxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwQixLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUM7b0JBQy9DLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7WUFFRCxvQkFBb0I7WUFDcEIsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDL0IsSUFBSSxPQUFPLENBQUMsa0NBQWtDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELE9BQU8sQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM5RCxPQUFPLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sR0FBRztnQkFDUixLQUFLLEVBQUUsRUFBRTtnQkFDVCxlQUFlLEVBQUUsU0FBUztnQkFDMUIseUJBQXlCLEVBQUUsU0FBUztnQkFDcEMsa0NBQWtDLEVBQUU7b0JBQ2xDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7aUJBQ3pEO2dCQUNELGdCQUFnQixFQUFFO29CQUNoQjt3QkFDRSxPQUFPLEVBQUUsRUFBRTt3QkFDWCxNQUFNLEVBQUU7NEJBQ04sTUFBTSxFQUFFLEVBQUU7NEJBQ1YsU0FBUyxFQUFFLEVBQUU7eUJBQ2Q7d0JBQ0QsYUFBYSxFQUFFLElBQUk7d0JBQ25CLE9BQU8sRUFBRSxHQUFHO3dCQUNaLHNDQUFzQyxFQUFFLEtBQUs7cUJBQzlDO2lCQUNGO2dCQUNELGVBQWUsRUFBRSxJQUFJO2dCQUNyQixjQUFjLEVBQUUsTUFBTTthQUN2QixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDMUIsR0FBVyxFQUNYLE9BQXdCO1FBRXhCLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0sMERBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLDhDQUFHLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLDRCQUE0QjtnQkFDckMsS0FBSyxFQUFFLE1BQU07YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQseURBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUIsV0FBVyxDQUFDLG9CQUFvQixDQUFDLFFBQWdCLENBQUMsQ0FBQztRQUVuRCxPQUFPLElBQUksNkNBQUUsQ0FBQyxRQUFnQixDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQWUsRUFBRSxZQUEwQjs7UUFDcEUsNkNBQTZDO1FBQzdDLE1BQU0sa0NBQWtDLEdBQ3RDLHFCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sMENBQUUsZUFBZSwwQ0FBRSxrQ0FBa0MsQ0FBQztRQUM5RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLENBQUM7WUFDakQsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtnQkFDNUMsd0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxtQ0FBSSxRQUFRLENBQUM7WUFDN0Qsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtnQkFDNUMsd0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxtQ0FBSSxRQUFRLENBQUM7WUFDN0Qsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTtnQkFDOUMsd0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxtQ0FBSSxJQUFJLENBQUM7UUFDN0QsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFGLGdCQUFnQjtRQUNoQixJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFZLENBQUMsQ0FBQyxDQUFDLG1DQUFJLElBQUksNERBQVUsRUFBRSxDQUFDO1lBQ3RELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLGlCQUFpQixDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUM3QyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDN0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHO2dCQUNyQyxpQkFBaUIsRUFBRSxpQkFBaUI7YUFDckMsQ0FBQztZQUVGLFNBQVMsR0FBRywyREFBYyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9ELGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEdBQUcsMkRBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBaUIsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hpQitCO0FBQzZCO0FBQ2I7QUFFekMsTUFBTSxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQVc7UUFDcEMsTUFBTSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUVuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLHlEQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSw2Q0FBRyxDQUFDO2dCQUNiLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLEtBQUssRUFBRSxNQUFNO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHdEQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkIsTUFBTSxRQUFRLEdBQWEsTUFBTSxDQUFDLEdBQUcsRUFBYyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUIsT0FBTyxJQUFJLDRDQUFFLENBQUMsUUFBb0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxXQUF3QjtRQUV4QixNQUFNLE9BQU8sR0FBbUIsRUFBRSxDQUFDO1FBRW5DLE1BQU0sTUFBTSxHQUFHLE1BQU0seURBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSw2Q0FBRyxDQUFDO2dCQUNiLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLEtBQUssRUFBRSxNQUFNO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHdEQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkIsTUFBTSxRQUFRLEdBQWEsTUFBTSxDQUFDLEdBQUcsRUFBYyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUIsT0FBTyxJQUFJLDRDQUFFLENBQUMsUUFBb0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQWE7O1FBQy9CLE1BQU0sVUFBVSxHQUFHLFNBQUcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsUUFBUSwwQ0FBRSxVQUFVLENBQUM7UUFDMUUsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDOUQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztRQUU1RSxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUEwQixDQUFDLENBQUM7WUFDcEQsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBMEIsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzRG1DO0FBQ0k7QUFDUDtBQUNEO0FBQ0Q7QUFDSTtBQUNGO0FBQ1U7QUFDWDtBQUNGO0FBQ0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWQztBQUNHO0FBQ047QUFDTztBQUNRO0FBQ1g7QUFDQTtBQUNGO0FBQ0M7QUFDQztBQUNDO0FBQ0w7QUFDRTtBQUNGO0FBQ0c7QUFDQztBQUNGO0FBQ0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQmdDO0FBQ1M7QUFDTjtBQUNDO0FBQ0w7QUFFMEI7QUFDaEM7QUFDVDtBQUNxQjtBQUVJO0FBRW9FO0FBQ0U7QUFHL0Y7QUFDUztBQUNmO0FBRXBDLE1BQU0sb0NBQXFDLFNBQVEsa0ZBQXVCO0lBSy9FLFlBQ0UsZ0JBQTRCLEVBQzVCLHNCQUE2QixFQUM3QixHQUFZLEVBQ1osT0FBeUI7UUFFekIsS0FBSyxDQUNILElBQUksRUFDSiw4QkFBOEIsRUFDOUIsRUFBRSxFQUNGLDhIQUFpQyxFQUNqQyw4SEFBbUMsQ0FDcEMsQ0FBQztRQUVGLElBQUksYUFBYSxDQUFDO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RELElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4RixhQUFhLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDTixhQUFhLEdBQUcsbUVBQWlCLENBQUM7WUFDbEMsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLGlEQUFNLENBQUMsSUFBSSxDQUNULHdEQUF3RCxHQUFHLHNCQUFzQixHQUFHLEdBQUcsQ0FDeEYsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixpREFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQztRQUN2QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLGtCQUFrQixHQUFHLElBQUksc0RBQU8sRUFBRSxDQUFDO1lBQ25DLENBQUMsS0FBSyxXQUFXLEdBQVc7Z0JBQzFCLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRTtvQkFDN0MsSUFBSSxFQUFFLHFFQUFhLENBQUMsWUFBWTtpQkFDakMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sa0JBQWtCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDO2FBQU0sSUFBSSxPQUFPLFlBQVksc0VBQWUsRUFBRSxDQUFDO1lBQzlDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLGlEQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDM0Msa0JBQWtCLEdBQUcsbUVBQWlCLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksdURBQU8sQ0FBQztZQUMxQixTQUFTLEVBQUUsMkVBQWdCLENBQUMsT0FBTztZQUNuQyxTQUFTLEVBQUUsMkVBQWdCLENBQUMsT0FBTztZQUNuQyxLQUFLLEVBQUUsMkVBQWdCLENBQUMsV0FBVztZQUNuQyxLQUFLLEVBQUUsMkVBQWdCLENBQUMsV0FBVztZQUNuQyxVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFakIsTUFBTSx3QkFBd0IsR0FBMEI7WUFDdEQ7Z0JBQ0UsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQztnQkFDaEMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7YUFDN0I7WUFDRDtnQkFDRSxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxTQUFTO2dCQUMxQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxDQUFDO2dCQUM5QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjthQUM3QjtTQUNGLENBQUM7UUFFRixJQUFJLENBQUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsdUNBQXVDLENBQUMsRUFDdEMsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxHQU1MO1FBQ0MsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxZQUFZO1FBQ1osSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7UUFDdEQsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUIsZUFBZSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDaEQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTCxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7O0FBN0dNLHVEQUFrQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDbkQsR0FBRyxFQUFFLG9CQUFvQjtDQUMxQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QitEO0FBQ007QUFDTDtBQUNLO0FBRWhCO0FBSWE7QUFDVDtBQUNIO0FBQ0E7QUFDc0I7QUFDaEM7QUFDcUI7QUFFL0QsTUFBTSxxQkFBc0IsU0FBUSxrRkFBdUI7SUFpQmhFLFlBQVksRUFDVixJQUFJLEVBQ0osVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCw0QkFBNEIsRUFDNUIsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQVdsQjtRQUNDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTFELG9CQUFvQjtRQUNwQixNQUFNLHdCQUF3QixHQUEwQixJQUFJLENBQUMsa0JBQWtCLENBQzdFLFlBQWEsRUFDYixXQUFZLEVBQ1osa0JBQW1CLEVBQ25CLGlCQUFrQixDQUNuQixDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlELHFCQUFxQixDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVELENBQUM7UUFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsMkJBQTJCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0QscUJBQXFCLENBQUMsMkJBQTJCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUVELElBQUksQ0FBQywyQkFBMkIsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCx3Q0FBd0MsQ0FBQyxFQUN2QyxRQUFRLEVBQ1IsSUFBSSxHQUlMO1FBQ0MsTUFBTSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxHQUNqRixxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxNQUFNLFdBQVcsR0FBRyxrRkFBdUIsQ0FBQyxhQUFhLENBQUM7UUFDMUQsV0FBVyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztRQUNsQyxXQUFXLENBQUMsQ0FBQyxHQUFHLG1CQUFvQixDQUFDLDBCQUEwQixDQUFDO1FBQ2hFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsbUJBQW9CLENBQUMsMkJBQTJCLENBQUM7UUFDakUsV0FBVyxDQUFDLENBQUMsR0FBRyxtQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztRQUN2RCxRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxrRkFBdUIsQ0FBQyxhQUFhLENBQUM7UUFDMUQsV0FBVyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7UUFDaEMsV0FBVyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUNqQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVqRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNqRSxJQUNFLHFCQUFxQixJQUFJLElBQUk7WUFDN0IscUJBQXFCLENBQUMsY0FBYyxJQUFJLElBQUk7WUFDNUMscUJBQXFCLENBQUMsZUFBZSxJQUFJLElBQUksRUFDN0MsQ0FBQztZQUNELE1BQU0sZ0JBQWdCLEdBQUcsZ0VBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGNBQWMsR0FBRyxnRUFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTdDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUM7WUFDN0UsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLDBCQUEwQixDQUFDO1lBQ3RFLGdCQUFnQixDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQywyQkFBMkIsQ0FBQztZQUN2RSxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsaUJBQWlCLENBQUM7WUFDN0QsUUFBUSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUV4RCxjQUFjLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ3pFLGNBQWMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDMUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRCx1Q0FBdUMsQ0FBQyxFQUN0QyxRQUFRLEVBQ1IsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLEdBTUw7UUFDQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO2dCQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDNUIsZUFBZSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDaEQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTCxDQUFDO2dCQUN2QixDQUFDO2dCQUNELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLFNBQVM7Z0JBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7WUFFRCxZQUFZO1lBQ1osTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxNQUFNLHVCQUF1QixHQUFHLHNGQUF1QixDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDckYsY0FBYztRQUNkLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hELHVCQUF1QixDQUFDLHNCQUFzQixDQUM1QyxhQUFhLEVBQ2IseUVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQ3JDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsMEJBQTBCLENBQUMsQ0FDeEUsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sdUJBQXVCLENBQUMsc0JBQXNCLENBQzVDLGFBQWEsRUFDYix5RUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFDckMsQ0FBQyxDQUFDLEVBQUUsc0VBQXFCLENBQUMsQ0FDM0IsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxRCx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FDNUMsYUFBYSxFQUNiLHlFQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUN0QyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDLENBQzFFLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLHVCQUF1QixDQUFDLHNCQUFzQixDQUM1QyxhQUFhLEVBQ2IseUVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQ3RDLENBQUMsQ0FBQyxFQUFFLHNFQUFxQixDQUFDLENBQzNCLENBQUM7UUFDSixDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxHQUNqRixxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsdUJBQXVCLENBQUMsZUFBZSxDQUNyQyxhQUFhLEVBQ2IseUVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUNoQyxTQUFTLEVBQ1Q7b0JBQ0UsQ0FBQyxFQUFFLGlCQUFpQjtvQkFDcEIsQ0FBQyxFQUFFLG1CQUFvQixDQUFDLDBCQUEwQjtvQkFDbEQsQ0FBQyxFQUFFLG1CQUFvQixDQUFDLDJCQUEyQjtvQkFDbkQsQ0FBQyxFQUFFLG1CQUFvQixDQUFDLGlCQUFpQjtpQkFDMUMsQ0FDRixDQUFDO2dCQUNGLHVCQUF1QixDQUFDLGVBQWUsQ0FDckMsYUFBYSxFQUNiLHlFQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFDOUIsU0FBUyxFQUNULEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FDNUMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsR0FDakYscUJBQXFCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUcsa0ZBQXVCLENBQUMsYUFBYSxDQUFDO1lBQzFELFdBQVcsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUM7WUFDbEMsV0FBVyxDQUFDLENBQUMsR0FBRyxtQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQztZQUNoRSxXQUFXLENBQUMsQ0FBQyxHQUFHLG1CQUFvQixDQUFDLDJCQUEyQixDQUFDO1lBQ2pFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsbUJBQW9CLENBQUMsaUJBQWlCLENBQUM7WUFDdkQsUUFBUSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsa0ZBQXVCLENBQUMsYUFBYSxDQUFDO1lBQzFELFdBQVcsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ2hDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7WUFDakMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELFFBQVE7UUFDUixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQTRDO1FBQy9FLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUM7UUFDMUQsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxRCxJQUFJLGVBQWUsR0FBRywrREFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDaEQsSUFBSSxnQkFBZ0IsR0FBRywrREFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDakQsSUFBSSxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QyxlQUFlLEdBQUcsbUJBQW1CLENBQUMsY0FBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEMsZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsZUFBZ0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzNFLENBQUM7UUFDRCxPQUFPO1lBQ0wsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQixlQUFlO1lBQ2YsZ0JBQWdCO1NBQ2pCLENBQUM7SUFDSixDQUFDOztBQXBPYyw0Q0FBc0IsR0FBRyw0RUFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM1RCxnREFBMEIsR0FBRyxJQUFJLHVEQUFPLENBQUM7SUFDdEQsU0FBUyxFQUFFLDRFQUFnQixDQUFDLE1BQU07SUFDbEMsU0FBUyxFQUFFLDRFQUFnQixDQUFDLE1BQU07SUFDbEMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7SUFDbkMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7SUFDbkMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7Q0FDcEMsQ0FBQyxDQUFDO0FBQ1ksaURBQTJCLEdBQUcsSUFBSSx1REFBTyxDQUFDO0lBQ3ZELFNBQVMsRUFBRSw0RUFBZ0IsQ0FBQyxrQkFBa0I7SUFDOUMsU0FBUyxFQUFFLDRFQUFnQixDQUFDLE1BQU07SUFDbEMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7SUFDbkMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7SUFDbkMsS0FBSyxFQUFFLDRFQUFnQixDQUFDLFdBQVc7Q0FDcEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQ3FFO0FBQ0E7QUFDTDtBQUNMO0FBQ0k7QUFFekI7QUFDK0M7QUFDaEM7QUFDYjtBQUNxRjtBQUNFO0FBSTdILE1BQU0sMEJBQTJCLFNBQVEsa0ZBQXVCO0lBU3JFLFlBQVksUUFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBMkI7UUFDbkUsS0FBSyxDQUNILElBQUksRUFDSixvQkFBb0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdEQsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQ3BELHFIQUE2QixFQUM3QixzSEFBK0IsQ0FDaEMsQ0FBQztRQVZJLGdCQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxHQUFHLENBQUM7UUFXdkIsTUFBTSx3QkFBd0IsR0FBMEI7WUFDdEQ7Z0JBQ0UsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLElBQUk7Z0JBQ2pDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztnQkFDN0MsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxZQUFZO2dCQUM5QixTQUFTLEVBQUUsSUFBSTtnQkFDZixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUN6QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsR0FBRzthQUNUO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLDBCQUEwQjtnQkFDcEMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtnQkFDckMsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtnQkFDOUIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsWUFBWSxFQUFFLGtEQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckQsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtTQUNGLENBQUM7UUFFRixJQUFJLENBQUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsdUNBQXVDLENBQUMsRUFDdEMsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxHQU1MO1FBQ0MsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFrQyxDQUFDO1FBQ3pFLElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLGVBQWUsR0FBRywwRUFBbUIsQ0FBQyxZQUFZLENBQ2hELCtFQUFlLEVBQ2YsK0VBQWUsQ0FBQyxPQUFPLENBQ0wsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRS9FLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoRSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pDLGFBQXFCLENBQUMsVUFBVSxFQUNqQyxlQUFlLENBQUMsVUFBVSxDQUMzQixDQUFDO2dCQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQztZQUNoRCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakQsYUFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQyxhQUFxQixDQUFDLFNBQVMsRUFDaEMsZUFBZSxDQUFDLFNBQVMsQ0FDMUIsQ0FBQztnQkFDRixJQUFJLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsWUFBWTtRQUNaLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN0RSxDQUFDOztBQWpJTSxxQ0FBVSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM3RCxvQ0FBUyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUMzRCx1Q0FBWSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztBQUNqRSxtQ0FBUSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmdkI7QUFDeUI7QUFDSjtBQUNOO0FBQ1c7QUFDSztBQUMvQjtBQUMrQjtBQUU0RjtBQUNFO0FBQ0s7QUFDRTtBQUl4SDtBQUNhO0FBQ25CO0FBQ0k7QUFFOUMsTUFBTSxrQ0FBbUMsU0FBUSxrRkFBdUI7SUFJN0UsMkVBQTJFO0lBQzNFLDRCQUE0QjtJQUM1QixNQUFNO0lBRU4sWUFBWSw0QkFBNkM7UUFDdkQsS0FBSyxDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLHVEQUFPLENBQUM7WUFDMUIsS0FBSyxFQUFFLDJEQUFnQixDQUFDLFdBQVc7WUFDbkMsS0FBSyxFQUFFLDJEQUFnQixDQUFDLFdBQVc7WUFDbkMsU0FBUyxFQUFFLDJEQUFnQixDQUFDLE1BQU07WUFDbEMsU0FBUyxFQUFFLDJEQUFnQixDQUFDLE1BQU07U0FDbkMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWpCLE1BQU0sd0JBQXdCLEdBQTBCO1lBQ3REO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUzthQUN0QjtZQUNELElBQUk7WUFDSixrRUFBa0U7WUFDbEUsd0NBQXdDO1lBQ3hDLDZDQUE2QztZQUM3QyxtQ0FBbUM7WUFDbkMsK0NBQStDO1lBQy9DLFlBQVk7WUFDWixZQUFZO1lBQ1osS0FBSztZQUNMO2dCQUNFLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7Z0JBQzFDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSw0QkFBNEIsRUFBRSxPQUFPLENBQUM7Z0JBQ3hELEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1NBQ0YsQ0FBQztRQUVGLElBQUksNkRBQVcsQ0FBQyxzQkFBc0IsS0FBSywwRUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRywrSUFBK0MsQ0FBQztZQUMvRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsK0lBQWlELENBQUM7UUFDbEYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsdUJBQXVCLEdBQUcsNklBQXlDLENBQUM7WUFDekUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLDZJQUEyQyxDQUFDO1FBQzVFLENBQUM7UUFFRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsdUNBQXVDLENBQUMsRUFDdEMsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxHQU1MO1FBQ0MsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JELFlBQVk7WUFDWixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsZUFBZSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDaEQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTCxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBckZNLHFEQUFrQixHQUF3QixJQUFJLDhFQUFvQixDQUFDO0lBQ3hFLEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCcUU7QUFDTjtBQUNKO0FBQ25CO0FBQ2E7QUFDZjtBQUMwQjtBQUNLO0FBRW9FO0FBQ0U7QUFJekksTUFBTSw4QkFBK0IsU0FBUSxrRkFBdUI7SUFDekU7UUFDRSxLQUFLLENBQ0gsSUFBSSxFQUNKLHdCQUF3QixHQUFHLENBQUMsS0FBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxHQUFHLENBQUMsTUFBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUNqRixFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQzFELDZIQUFpQyxFQUNqQyw2SEFBbUMsQ0FDcEMsQ0FBQztRQUVGLE1BQU0sd0JBQXdCLEdBQTBCO1lBQ3RELDJJQUEySTtZQUMzSSxnTkFBZ047WUFDaE4saUpBQWlKO1lBQ2pKLGdOQUFnTjtZQUNoTixJQUFJO1lBQ0osNENBQTRDO1lBQzVDLDJDQUEyQztZQUMzQyx3Q0FBd0M7WUFDeEMsb0NBQW9DO1lBQ3BDLDRCQUE0QjtZQUM1QiwyQkFBMkI7WUFDM0IsNkJBQTZCO1lBQzdCLGdFQUFnRTtZQUNoRSxvREFBb0Q7WUFDcEQsb0JBQW9CO1lBQ3BCLEtBQUs7WUFDTDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtnQkFDOUIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDekMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLEdBQUc7YUFDVDtZQUNEO2dCQUNFLFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7Z0JBQ3JDLEtBQUssRUFBRSwrREFBVSxDQUFDLFlBQVk7Z0JBQzlCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFlBQVksRUFBRSxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JELEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7U0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHVDQUF1QyxDQUFDLEVBQ3RDLFFBQVEsRUFDUixhQUFhLEVBQ2IsU0FBUyxFQUNULElBQUksR0FNTDtRQUNDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFdkQsWUFBWTtZQUNaLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1lBQ3RELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixlQUFlLEdBQUcsMEVBQW1CLENBQUMsWUFBWSxDQUNoRCwrRUFBZSxFQUNmLCtFQUFlLENBQUMsT0FBTyxDQUNMLENBQUM7WUFDdkIsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFL0UsWUFBWTtZQUNaLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUVwRSxTQUFTO1lBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7SUFDSCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyRytEO0FBQ0k7QUFDekI7QUFDK0M7QUFDaEM7QUFDYjtBQUM2QjtBQUNMO0FBRUs7QUFDc0M7QUFDRTtBQUd4RDtBQUVuRCxNQUFNLDBCQUEyQixTQUFRLGtGQUF1QjtJQU9yRTtRQUNFLEtBQUssQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxFQUFFLHlHQUF1QixFQUFFLDBHQUF5QixDQUFDLENBQUM7UUFFMUYsTUFBTSx3QkFBd0IsR0FBMEI7WUFDdEQ7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNEO2dCQUNFLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtnQkFDckMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGtEQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjthQUM3QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7Z0JBQ3JDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxrREFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNEO2dCQUNFLFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7Z0JBQzFDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxtRUFBaUIsQ0FBQztnQkFDcEMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7YUFDN0I7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHVDQUF1QyxDQUFDLEVBQ3RDLFFBQVEsRUFDUixhQUFhLEVBQ2IsU0FBUyxFQUNULElBQUksR0FNTDtRQUNDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFdkQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxZQUFZO2dCQUNaLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO2dCQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDNUIsZUFBZSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDaEQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTCxDQUFDO2dCQUN2QixDQUFDO2dCQUNELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUUvRSxTQUFTO2dCQUNULElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBckhNLCtCQUFJLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELG9DQUFTLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELGlDQUFNLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELDBDQUFlLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7QUFDdkUsNkJBQUUsR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQm9CO0FBQ2xCO0FBQ2tCO0FBQ087QUFDWjtBQUNMO0FBQ0k7QUFDekI7QUFFQTtBQUMrQztBQUNoQztBQUNiO0FBQ0E7QUFDQTtBQUdtRTtBQUNFO0FBQ0s7QUFDRTtBQWdCakc7QUFFd0I7QUFDNkI7QUFDdEI7QUFDbUI7QUFDTztBQUUxRSxNQUFNLG9CQUFxQixTQUFRLGtGQUF1QjtJQTZFL0QsWUFDRSxTQUFrQixFQUNsQixrQkFBcUQsRUFDckQsUUFBYSxFQUNiLFFBQW1CLEVBQ25CLFVBQW1CLEVBQ25CLFVBQW1CLEVBQ25CLFVBQW1CLEVBQ25CLG1CQUE0QixFQUM1QixTQUE0QixFQUM1QixjQUF1QixFQUN2QixZQUFvQjtRQUVwQixLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN4QixVQUFVLEVBQUUsVUFBVTtZQUN0QixVQUFVLEVBQUUsVUFBVTtZQUN0QixVQUFVLEVBQUUsVUFBVTtTQUN2QixDQUFDLENBQUM7UUEzQkcsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHNCQUFpQixHQUVyQixFQUFFLENBQUM7UUFDQyx1QkFBa0IsR0FFdEIsRUFBRSxDQUFDO1FBQ0Msd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBcUJwQyxNQUFNLHdCQUF3QixHQUEwQixJQUFJLENBQUMsa0JBQWtCLENBQzdFLDBHQUF1QixFQUN2QiwwR0FBeUIsRUFDekIsMkdBQTZCLEVBQzdCLDJHQUErQixDQUNoQyxDQUFDO1FBRUYsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsZUFBZSxDQUFDO1lBQzVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUM5RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUM5RixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsR0FBRyxHQUFHLENBQUM7WUFDckQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztZQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7WUFDOUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLEdBQUcsR0FBRyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7WUFDL0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztZQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO1lBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO1lBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7WUFDL0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDdkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDckMsK0NBQStDO1lBQy9DLCtDQUErQztZQUMvQyxnREFBZ0Q7WUFFaEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsbURBQW1EO1lBQ25ELHVEQUF1RDtZQUN2RCxtREFBbUQ7WUFDbkQsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSx3REFBd0Q7WUFDeEQsK0RBQStEO1lBQy9ELHFEQUFxRDtRQUN2RCxDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFFRCxjQUFjO1FBQ2Qsd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtZQUNFLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1lBQ25FLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUCxFQUNEO1lBQ0UsUUFBUSxFQUFFLFVBQVU7WUFDcEIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLG1EQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUF3QixDQUFDO1lBQ3JGLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUCxFQUNEO1lBQ0UsUUFBUSxFQUFFLFlBQVk7WUFDdEIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLG1EQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7WUFDeEUsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsV0FBVztZQUNyQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07WUFDdkMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztZQUN0RSxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1NBQ1AsRUFDRDtZQUNFLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQztZQUM5RSxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1NBQ1AsRUFDRDtZQUNFLFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztZQUM3RSxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1NBQ1AsRUFDRDtZQUNFLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1lBQ3ZFLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUCxFQUNEO1lBQ0UsUUFBUSxFQUFFLFlBQVk7WUFDdEIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7WUFDdkUsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsdUJBQXVCO1lBQ2pDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUM7WUFDbEYsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsY0FBYztZQUN4QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7WUFDckMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsbURBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUDtRQUNELElBQUk7UUFDSix5SUFBeUk7UUFDekksdUlBQXVJO1FBQ3ZJLDJHQUEyRztRQUMzRyxLQUFLO1FBQ0w7WUFDRSxRQUFRLEVBQUUsVUFBVTtZQUNwQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7WUFDckMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsbURBQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQTJCLENBQUM7WUFDeEYsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDO1lBQzNFLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUCxFQUNEO1lBQ0UsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07WUFDdkMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDO1lBQzVFLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUCxFQUNEO1lBQ0UsUUFBUSxFQUFFLFNBQVM7WUFDbkIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFDcEUsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsVUFBVTtZQUNwQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7WUFDckMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxtREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsZUFBZTtZQUN6QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7WUFDckMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsbURBQU8sQ0FBQyxhQUFhLENBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFnQyxDQUN6RDtZQUNELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUDtRQUNELElBQUk7UUFDSixnSUFBZ0k7UUFDaEksdUlBQXVJO1FBQ3ZJLGtHQUFrRztRQUNsRyxLQUFLO1FBQ0wsSUFBSTtRQUNKLGdJQUFnSTtRQUNoSSx1SUFBdUk7UUFDdkksbUdBQW1HO1FBQ25HLEtBQUs7UUFDTCxJQUFJO1FBQ0osaUlBQWlJO1FBQ2pJLHVJQUF1STtRQUN2SSxtR0FBbUc7UUFDbkcsS0FBSztRQUVMO1lBQ0UsUUFBUSxFQUFFLFdBQVc7WUFDckIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFLG1EQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxFQUFFO1NBQ1IsRUFDRDtZQUNFLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxJQUFJO1lBQ2pDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztZQUNOLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVELENBQ0YsQ0FBQztRQUVGLGFBQWE7UUFDYixRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxLQUFLLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSxpQ0FBaUMsQ0FBQztnQkFDeEQsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixJQUFJLENBQUMsYUFBYSxJQUFJLHVDQUF1QyxDQUFDO2dCQUM5RCxNQUFNO1FBQ1YsQ0FBQztRQUVELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsYUFBYSxJQUFJLCtCQUErQixDQUFDO1lBRXRELG9CQUFvQjtZQUNwQixRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNqRCxLQUFLLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSxpQ0FBaUMsQ0FBQztvQkFDeEQsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSx3Q0FBd0MsQ0FBQztvQkFDL0QsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSx5Q0FBeUMsQ0FBQztvQkFDaEUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztvQkFDdkMsTUFBTTtZQUNWLENBQUM7WUFFRCxvQkFBb0I7WUFDcEIsUUFBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDakQsS0FBSyxDQUFDO29CQUNKLElBQUksQ0FBQyxhQUFhLElBQUksd0NBQXdDLENBQUM7b0JBQy9ELE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLElBQUksQ0FBQyxhQUFhLElBQUksd0NBQXdDLENBQUM7b0JBQy9ELE1BQU07WUFDVixDQUFDO1lBRUQsd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtnQkFDRSxRQUFRLEVBQUUsY0FBYztnQkFDeEIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsS0FBSyxFQUFFLGdFQUFVLENBQUMsWUFBWTtnQkFDOUIsWUFBWSxFQUFFLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7Z0JBQ3pFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1AsRUFDRDtnQkFDRSxRQUFRLEVBQUUsMEJBQTBCO2dCQUNwQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxZQUFZO2dCQUM5QixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDO2dCQUNyRixHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7Z0JBQ3JDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxtREFBTyxDQUFDLGFBQWEsQ0FDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQStCLENBQ3hEO2dCQUNELEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1AsRUFDRDtnQkFDRSxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDO2dCQUMvRSxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFlBQVk7Z0JBQzlCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFlBQVksRUFBRSxnREFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1AsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsYUFBYSxJQUFJLDBCQUEwQixDQUFDO1FBQ25ELENBQUM7UUFFRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGFBQWEsSUFBSSwwQkFBMEIsQ0FBQztRQUNuRCxDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxhQUFhLElBQUksMEJBQTBCLENBQUM7WUFFakQsd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtnQkFDRSxRQUFRLEVBQUUsZ0NBQWdDO2dCQUMxQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxXQUFXO2dCQUM1QyxXQUFXLEVBQUUsZ0RBQU0sQ0FBQyw0QkFBNEI7Z0JBQ2hELEtBQUssRUFBRSxnRUFBVSxDQUFDLFlBQVk7Z0JBQzlCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsZ0RBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUM5RSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUNyQiw0QkFBNEIsRUFBRSxJQUFJO2FBQ25DLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFdBQVc7Z0JBQzVDLFdBQVcsRUFBRSxnREFBTSxDQUFDLDRCQUE0QjtnQkFDaEQsS0FBSyxFQUFFLGdFQUFVLENBQUMsWUFBWTtnQkFDOUIsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsWUFBWSxFQUFFLElBQUksbURBQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxnREFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQ2hGLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUN0QixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQ3JCLDRCQUE0QixFQUFFLElBQUk7YUFDbkMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxJQUFJLG9DQUFvQyxDQUFDO1FBQzdELENBQUM7UUFFRCxVQUFVO1FBQ1YsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNDLHFDQUFxQztZQUNyQyxJQUFJLENBQUMsYUFBYSxJQUFJLGdDQUFnQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2RCxxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLGFBQWEsSUFBSSw4Q0FBOEMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsUUFBUSxHQUFHLENBQUMsbUVBQWlCLEVBQUUsbUVBQWlCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUN4QyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFakYsSUFBSSxDQUFDLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixRQUFtQixFQUNuQixRQUFtQixFQUNuQix3QkFBK0MsRUFDL0MsU0FBa0I7UUFFbEIsd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtZQUNFLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztZQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxTQUFTO1lBQzFDLEtBQUssRUFBRSxnRUFBVSxDQUFDLFdBQVc7WUFDN0IsWUFBWSxFQUFFO2dCQUNaLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQzNDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO2FBQzVDO1lBQ0QsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtTQUM3QixFQUNEO1lBQ0UsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUU7Z0JBQ1osQ0FBQztnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztnQkFDaEQsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUM7YUFDakQ7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsc0JBQXNCO1lBQ2hDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRTtnQkFDWixDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUM7Z0JBQ3hELFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUM7YUFDekQ7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCLEVBQ0Q7WUFDRSxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRTtnQkFDWixDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3ZELFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUM7YUFDeEQ7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsWUFBWTtZQUN0QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUU7Z0JBQ1osQ0FBQztnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztnQkFDOUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7YUFDL0M7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsZUFBZTtZQUN6QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUU7Z0JBQ1osQ0FBQztnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQztnQkFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7YUFDOUM7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7WUFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztZQUMxQyxLQUFLLEVBQUUsZ0VBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRTtnQkFDWixDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQzthQUNoRDtZQUNELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7U0FDN0IsQ0FDRixDQUFDO1FBRUYsd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtZQUNFLDBDQUEwQztZQUMxQyxRQUFRLEVBQUUsZUFBZTtZQUN6QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUU7Z0JBQ1osQ0FBQztnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztnQkFDM0MsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7YUFDNUM7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCO1FBQ0QsSUFBSTtRQUNKLHFJQUFxSTtRQUNySSxxSEFBcUg7UUFDckgseUdBQXlHO1FBQ3pHLElBQUk7U0FDTCxDQUFDO1FBRUYsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFDNUIsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLGdFQUFVLENBQUMsWUFBWTtnQkFDOUIsWUFBWSxFQUFFO29CQUNaLENBQUM7b0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDdkQsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQztpQkFDeEQ7Z0JBQ0QsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7YUFDN0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFrQixFQUFFLFNBQWtCO1FBQzFELElBQUksb0JBQW9CLENBQUMsNEJBQTRCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUQsb0JBQW9CLENBQUMsd0NBQXdDLEVBQUUsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxLQUFLLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSwyQkFBMkIsQ0FBQztvQkFDbEQsUUFBUSxDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLElBQUksQ0FBQztvQkFDcEMsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSw0QkFBNEIsQ0FBQztvQkFDbkQsUUFBUSxDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLEtBQUssQ0FBQztvQkFDckMsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osSUFBSSxDQUFDLGFBQWEsSUFBSSw0QkFBNEIsQ0FBQztvQkFDbkQsUUFBUSxDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLEtBQUssQ0FBQztvQkFDckMsTUFBTTtZQUNWLENBQUM7WUFFRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLGNBQWM7WUFDL0MsTUFBTSxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQztZQUNqRixNQUFNLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDLDRCQUE0QixDQUMxRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUNqQyxDQUFDO1lBQ0YsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FDMUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FDakMsQ0FBQztZQUVGLFFBQVEsQ0FBQyxvQkFBb0IsQ0FDM0Isc0RBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFDN0Isc0JBQXNCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxzREFBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ2hGLENBQUM7WUFDRixRQUFRLENBQUMsa0JBQWtCLENBQUMsc0RBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxzREFBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUVELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNoRCxLQUFLLENBQUM7b0JBQ0osUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQzFCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUN6QixRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekIsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztvQkFDakMsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN6QyxLQUFLLENBQUM7b0JBQ0osUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQzFCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUN6QixRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekIsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztvQkFDakMsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyx3Q0FBd0M7UUFDckQsSUFBSSw2REFBVyxDQUFDLHNCQUFzQixLQUFLLDBEQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEUsb0JBQW9CLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDLENBQUMsU0FBUztRQUN0RSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sdUJBQXVCLEdBQUcsc0ZBQXVCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyRixNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxHQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLEdBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsb0JBQW9CLENBQUMsNEJBQTRCLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUM3RCxDQUFDO2lCQUFNLElBQUksR0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixvQkFBb0IsQ0FBQyw0QkFBNEIsR0FBRyxHQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUMvRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sb0JBQW9CLENBQUMsNEJBQTRCLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCx3Q0FBd0MsQ0FBQyxFQUN2QyxRQUFRLEVBQ1IsSUFBSSxHQUlMO1FBQ0MsSUFBSSxlQUFlLEdBQUcsMEVBQW1CLENBQUMsNEJBQTRCLENBQ3BFLHVGQUFzQixDQUFDLGtCQUFrQixFQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQ0wsQ0FBQztRQUNyQixRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRCx1Q0FBdUMsQ0FBQyxFQUN0QyxRQUFRLEVBQ1IsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLEdBTUw7UUFDQyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixlQUFlLEdBQUcsMEVBQW1CLENBQUMsWUFBWSxDQUNoRCwrRUFBZSxFQUNmLCtFQUFlLENBQUMsT0FBTyxDQUNMLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLFlBQVk7WUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFL0UsWUFBWTtZQUNaLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUVwRSxTQUFTO1lBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWxGLGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxRQUFRLEVBQy9CLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUMzQixDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDbkMsYUFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFFLGFBQXFCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5RixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0QsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDcEMsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBRUQsUUFBUTtRQUNSLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxNQUFNLENBQUMsNEJBQTRCLENBQUMsVUFBa0I7UUFDcEQsSUFBSSxNQUFNLEdBQUcsNENBQWlCLENBQUMsQ0FBQyxVQUFVO1FBQzFDLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDO2dCQUNKLE1BQU0sR0FBRyw0Q0FBTyxDQUFDO2dCQUNqQixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU0sR0FBRywyQ0FBTSxDQUFDO2dCQUNoQixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU0sR0FBRyxpREFBWSxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU0sR0FBRyxpREFBWSxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU0sR0FBRywyREFBc0IsQ0FBQztnQkFDaEMsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixNQUFNLEdBQUcsaURBQVksQ0FBQztnQkFDdEIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixNQUFNLEdBQUcsMkRBQXNCLENBQUM7Z0JBQ2hDLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osTUFBTSxHQUFHLGlEQUFZLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osTUFBTSxHQUFHLDJEQUFzQixDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLE1BQU0sR0FBRywwREFBcUIsQ0FBQztnQkFDL0IsTUFBTTtZQUNSLEtBQUssRUFBRTtnQkFDTCxNQUFNLEdBQUcsMkRBQXNCLENBQUM7Z0JBQ2hDLE1BQU07UUFDVixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7QUFsMEJlLDRCQUFPLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELDJCQUFNLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELGdDQUFXLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELHFDQUFnQixHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLHVDQUFrQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDbkUsR0FBRyxFQUFFLG1CQUFtQjtDQUN6QixDQUFDLENBQUM7QUFDYSwrQkFBVSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUN2RCxtQ0FBYyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztBQUMzRSx1Q0FBa0IsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQzVELEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ29CLDBDQUFxQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDdEUsR0FBRyxFQUFFLHNCQUFzQjtDQUM1QixDQUFDLENBQUM7QUFDYSxzQ0FBaUIsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQzNELEdBQUcsRUFBRSxrQkFBa0I7Q0FDeEIsQ0FBQyxDQUFDO0FBQ29CLHlDQUFvQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDckUsR0FBRyxFQUFFLHFCQUFxQjtDQUMzQixDQUFDLENBQUM7QUFDYSxnQ0FBVyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM5RCxnQ0FBVyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM5RCwyQ0FBc0IsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ2hFLEdBQUcsRUFBRSx1QkFBdUI7Q0FDN0IsQ0FBQyxDQUFDO0FBQ2Esa0NBQWEsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ3ZELEdBQUcsRUFBRSxjQUFjO0NBQ3BCLENBQUMsQ0FBQztBQUNILHlHQUF5RztBQUNsRixnQ0FBVyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUNyRSw4QkFBUyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUMxRCxvQ0FBZSxHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDekQsR0FBRyxFQUFFLGdCQUFnQjtDQUN0QixDQUFDLENBQUM7QUFDYSxxQ0FBZ0IsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQzFELEdBQUcsRUFBRSxpQkFBaUI7Q0FDdkIsQ0FBQyxDQUFDO0FBQ2EsNkJBQVEsR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDakQsbUNBQWMsR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7QUFDM0UsbUNBQWMsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ3hELEdBQUcsRUFBRSxlQUFlO0NBQ3JCLENBQUMsQ0FBQztBQUNvQixxQ0FBZ0IsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ2pFLEdBQUcsRUFBRSxpQkFBaUI7Q0FDdkIsQ0FBQyxDQUFDO0FBQ29CLHlDQUFvQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDckUsR0FBRyxFQUFFLHFCQUFxQjtDQUMzQixDQUFDLENBQUM7QUFDYSxrQ0FBYSxHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDdkQsR0FBRyxFQUFFLGNBQWM7Q0FDcEIsQ0FBQyxDQUFDO0FBQ2EsOENBQXlCLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQztJQUNuRSxHQUFHLEVBQUUsMEJBQTBCO0NBQ2hDLENBQUMsQ0FBQztBQUNhLGtDQUFhLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQztJQUN2RCxHQUFHLEVBQUUsY0FBYztDQUNwQixDQUFDLENBQUM7QUFDYSx3Q0FBbUIsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQzdELEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBRWEsMkJBQU0sR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDckQsNkJBQVEsR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1R1Y7QUFDUztBQUNMO0FBQ0w7QUFDSTtBQUN6QjtBQUMrQztBQUNoQztBQUNUO0FBQ0o7QUFDNkI7QUFFdUI7QUFDRTtBQUl6QztBQUNmO0FBRXBDLE1BQU0scUJBQXNCLFNBQVEsbUZBQXVCO0lBR2hFLFlBQVksVUFBbUIsRUFBRSxHQUFZLEVBQUUsT0FBeUIsRUFBRSxPQUFpQjtRQUN6RixLQUFLLENBQ0gsSUFBSSxFQUNKLGVBQWUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDakQsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQzFCLGdHQUFrQixFQUNsQixnR0FBb0IsQ0FDckIsQ0FBQztRQUVGLElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsYUFBYSxHQUFHLElBQUksc0RBQU8sRUFBRSxDQUFDO1lBQzlCLENBQUMsS0FBSyxXQUFXLEdBQVc7Z0JBQzFCLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUU7b0JBQ3hDLElBQUksRUFBRSxxRUFBYSxDQUFDLFlBQVk7aUJBQ2pDLENBQUMsQ0FBQztnQkFDSCxNQUFNLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxzRUFBZSxFQUFFLENBQUM7WUFDOUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLGlEQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakMsYUFBYSxHQUFHLG1FQUFpQixDQUFDO1FBQ3BDLENBQUM7UUFFRCxNQUFNLHdCQUF3QixHQUEwQixFQUFFLENBQUM7UUFFM0Qsd0JBQXdCLENBQUMsSUFBSSxDQUFDO1lBQzVCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtZQUNyQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsRUFBRTtTQUNSLENBQUMsQ0FBQztRQUVILGNBQWM7UUFDZCx3QkFBd0IsQ0FBQyxJQUFJLENBQzNCO1lBQ0UsUUFBUSxFQUFFLFdBQVc7WUFDckIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFlBQVk7WUFDOUIsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsZ0RBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3pDLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLEdBQUc7U0FDVCxFQUNEO1lBQ0UsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7WUFDckMsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtZQUM5QixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLENBQ0YsQ0FBQztRQUVGLHdCQUF3QixDQUFDLElBQUksQ0FBQztZQUM1QixRQUFRLEVBQUUsZUFBZTtZQUN6QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO1lBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7WUFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQztZQUN6QyxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1NBQzdCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQywyQkFBMkIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCx1Q0FBdUMsQ0FBQyxFQUN0QyxRQUFRLEVBQ1IsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLEdBTUw7UUFDQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXZELFlBQVk7WUFDWixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsZUFBZSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDaEQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTCxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRS9FLFlBQVk7WUFDWixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7O0FBMUdNLG1DQUFhLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCakM7QUFDK0I7QUFDTjtBQUNKO0FBQ25CO0FBQ0E7QUFDaUI7QUFDSjtBQUNXO0FBQ0s7QUFDN0I7QUFDRjtBQUNBO0FBRXNDO0FBR3BCO0FBRStGO0FBQ0U7QUFHbEY7QUFDakM7QUFFcEMsTUFBTSxxQ0FBc0MsU0FBUSxrRkFBdUI7SUE0QmhGOzs7Ozs7OztPQVFHO0lBQ0gsWUFDRSxFQUNFLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxzQkFBc0IsR0FPdkIsRUFDRCxzQkFBa0M7UUFFbEMsS0FBSyxDQUNILElBQUksRUFDSiwrQkFBK0I7WUFDN0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUNqQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQ3RDLDRJQUFpQyxFQUNqQyw0SUFBbUMsQ0FDcEMsQ0FBQztRQUVGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxzQkFBc0IsQ0FBQztRQUV2RCxNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hFLElBQUksdUJBQXVCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEMsaURBQU0sQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUNqRSxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUU3RixNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLEVBQW9CLENBQUM7UUFDeEUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0Qsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sd0JBQXdCLEdBQTBCO1lBQ3REO2dCQUNFLFFBQVEsRUFBRSwyQkFBMkI7Z0JBQ3JDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7Z0JBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLEtBQUssRUFBRSwrREFBVSxDQUFDLFlBQVk7Z0JBQzlCLFlBQVksRUFBRSxtRUFBZSxDQUFDLElBQUksRUFBRTtnQkFDcEMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUzthQUN0QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsaURBQU0sQ0FBQyxjQUFjLENBQUMsbUVBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNoRSxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUzthQUN0QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO2dCQUNyQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkQsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNEO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7Z0JBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLElBQUk7Z0JBQ2pDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtnQkFDckMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGtEQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLEVBQUU7YUFDUjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixlQUFlLEVBQUUseUVBQWUsQ0FBQyxTQUFTO2dCQUMxQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsa0VBQWdCLENBQUM7Z0JBQ25DLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7Z0JBQzFDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQztnQkFDdEMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7YUFDN0I7WUFDRDtnQkFDRSxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxTQUFTO2dCQUMxQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsbUVBQWlCLENBQUM7Z0JBQ3BDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1NBQ0YsQ0FBQztRQUVGLHdCQUF3QixDQUFDLElBQUksQ0FDM0I7WUFDRSxRQUFRLEVBQUUsV0FBVztZQUNyQixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07WUFDdkMsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtZQUM5QixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDekMsR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsR0FBRztTQUNULEVBQ0Q7WUFDRSxRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtZQUNyQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxZQUFZO1lBQzlCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLGtEQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1NBQ1AsQ0FDRixDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLHdCQUF3QixDQUFDLElBQUksQ0FDM0I7Z0JBQ0UsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtnQkFDOUIsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLGlEQUFNLENBQUMsNEJBQTRCO2dCQUN4Qyw0QkFBNEIsRUFBRSxJQUFJO2FBQ25DLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGdDQUFnQztnQkFDMUMsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsV0FBVztnQkFDNUMsV0FBVyxFQUFFLGlEQUFNLENBQUMsNEJBQTRCO2dCQUNoRCxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxZQUFZO2dCQUM5QixpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixTQUFTLEVBQUUsSUFBSTtnQkFDZixZQUFZLEVBQUUsSUFBSSxtREFBTyxDQUFDLElBQUksVUFBVSxDQUFDLGlEQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDOUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDckIsNEJBQTRCLEVBQUUsSUFBSTthQUNuQyxFQUNEO2dCQUNFLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxXQUFXO2dCQUM1QyxXQUFXLEVBQUUsaURBQU0sQ0FBQyw0QkFBNEI7Z0JBQ2hELEtBQUssRUFBRSwrREFBVSxDQUFDLFlBQVk7Z0JBQzlCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsSUFBSSxZQUFZLENBQUMsaURBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUNoRixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUNyQiw0QkFBNEIsRUFBRSxJQUFJO2FBQ25DLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFDNUIsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtnQkFDckMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGtEQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1AsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQywyQkFBMkIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCx1Q0FBdUMsQ0FBQyxFQUN0QyxRQUFRLEVBQ1IsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLEdBTUw7UUFDQyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixlQUFlLEdBQUcsMEVBQW1CLENBQUMsWUFBWSxDQUNoRCwrRUFBZSxFQUNmLCtFQUFlLENBQUMsT0FBTyxDQUNMLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QjthQUM5RCxlQUFrQyxDQUFDO1FBRXRDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUvRSxJQUNFLHFDQUFxQyxDQUFDLFdBQVcsS0FBSywyQkFBMkIsQ0FBQyxVQUFVLEVBQzVGLENBQUM7Z0JBQ0EsYUFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQyxhQUFxQixDQUFDLFVBQVUsRUFDakMsMkJBQTJCLENBQUMsVUFBVSxDQUN2QyxDQUFDO2dCQUNGLHFDQUFxQyxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLENBQUM7WUFDN0YsQ0FBQztZQUVELElBQ0UscUNBQXFDLENBQUMsVUFBVSxLQUFLLDJCQUEyQixDQUFDLFNBQVMsRUFDMUYsQ0FBQztnQkFDQSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pDLGFBQXFCLENBQUMsU0FBUyxFQUNoQywyQkFBMkIsQ0FBQyxTQUFTLENBQ3RDLENBQUM7Z0JBQ0YscUNBQXFDLENBQUMsVUFBVSxHQUFHLDJCQUEyQixDQUFDLFNBQVMsQ0FBQztZQUMzRixDQUFDO1lBQ0QsTUFBTSx5QkFBeUIsR0FBRyx1RkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3ZGLHlCQUF5QixDQUFDLGVBQWUsQ0FDdkMsYUFBYSxFQUNiLHlFQUFlLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUM3QyxJQUFJLEVBQ0osSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWdCLENBQUMsb0JBQW9CLENBQ3BFLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVFLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLFFBQVEsQ0FBQyxZQUFZLENBQ25CLDJCQUEyQixFQUMzQixJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZ0IsQ0FBQyxvQkFBb0IsQ0FDcEUsQ0FBQztRQUNKLENBQUM7UUFFRCxZQUFZO1FBQ1osTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRXBFLFNBQVM7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbkYsUUFBUTtRQUNSLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9GLENBQUM7O0FBL1ZNLHVEQUFpQixHQUF3QixJQUFJLDhFQUFvQixDQUFDO0lBQ3ZFLEdBQUcsRUFBRSxtQkFBbUI7Q0FDekIsQ0FBQyxDQUFDO0FBQ0ksaURBQVcsR0FBd0IsSUFBSSw4RUFBb0IsQ0FBQztJQUNqRSxHQUFHLEVBQUUsYUFBYTtDQUNuQixDQUFDLENBQUM7QUFDSSxvREFBYyxHQUF3QixJQUFJLDhFQUFvQixDQUFDO0lBQ3BFLEdBQUcsRUFBRSxnQkFBZ0I7Q0FDdEIsQ0FBQyxDQUFDO0FBQ0kseURBQW1CLEdBQXdCLElBQUksOEVBQW9CLENBQUM7SUFDekUsR0FBRyxFQUFFLHFCQUFxQjtDQUMzQixDQUFDLENBQUM7QUFDSSxnREFBVSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM3RCwrQ0FBUyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUMzRCxzREFBZ0IsR0FBd0IsSUFBSSw4RUFBb0IsQ0FBQztJQUN0RSxHQUFHLEVBQUUsa0JBQWtCO0NBQ3hCLENBQUMsQ0FBQztBQUNJLGtEQUFZLEdBQXdCLElBQUksOEVBQW9CLENBQUM7SUFDbEUsR0FBRyxFQUFFLGNBQWM7Q0FDcEIsQ0FBQyxDQUFDO0FBQ0ksa0RBQVksR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFFekQsaURBQVcsR0FBRyxHQUFHLENBQUM7QUFDbEIsZ0RBQVUsR0FBRyxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JEd0M7QUFDTDtBQUNMO0FBQ0k7QUFFc0I7QUFDaEM7QUFDZ0I7QUFFN0I7QUFDOEY7QUFDRTtBQUNLO0FBQ0U7QUFHMUY7QUFDVDtBQUNxQjtBQUNmO0FBQ2E7QUFFN0QsTUFBTSw0QkFBNkIsU0FBUSxrRkFBdUI7SUE0QnZFOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsWUFBWSxrQkFBcUM7O1FBQy9DLEtBQUssQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFFL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSx1REFBTyxDQUFDO1lBQzFCLEtBQUssRUFBRSw0RUFBZ0IsQ0FBQyxXQUFXO1lBQ25DLEtBQUssRUFBRSw0RUFBZ0IsQ0FBQyxXQUFXO1lBQ25DLFNBQVMsRUFBRSw0RUFBZ0IsQ0FBQyxNQUFNO1lBQ2xDLFNBQVMsRUFBRSw0RUFBZ0IsQ0FBQyxNQUFNO1NBQ25DLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUVqQixNQUFNLHdCQUF3QixHQUEwQjtZQUN0RDtnQkFDRSxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxXQUFXO2dCQUM1QyxXQUFXLEVBQUUsQ0FBQztnQkFDZCxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsSUFBSSxrREFBTyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQztnQkFDTiw0QkFBNEIsRUFBRSxJQUFJO2FBQ25DO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLHdCQUFrQixDQUFDLENBQUMsQ0FBQyxtQ0FBSSxtRUFBaUIsRUFBRSxPQUFPLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLHdCQUFrQixDQUFDLENBQUMsQ0FBQyxtQ0FBSSxtRUFBaUIsRUFBRSxPQUFPLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLHdCQUFrQixDQUFDLENBQUMsQ0FBQyxtQ0FBSSxtRUFBaUIsRUFBRSxPQUFPLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLHdCQUFrQixDQUFDLENBQUMsQ0FBQyxtQ0FBSSxtRUFBaUIsRUFBRSxPQUFPLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLHdCQUFrQixDQUFDLENBQUMsQ0FBQyxtQ0FBSSxtRUFBaUIsRUFBRSxPQUFPLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLHdCQUFrQixDQUFDLENBQUMsQ0FBQyxtQ0FBSSxtRUFBaUIsRUFBRSxPQUFPLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1NBQ0YsQ0FBQztRQUVGLElBQUksNkRBQVcsQ0FBQyxzQkFBc0IsS0FBSywwRUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyw2SEFBc0MsQ0FBQztZQUN0RSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsNkhBQXdDLENBQUM7UUFDekUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsdUJBQXVCLEdBQUcsMkhBQWdDLENBQUM7WUFDaEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLDJIQUFrQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsdUNBQXVDLENBQUMsRUFDdEMsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxHQU1MO1FBQ0MsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXJELFlBQVk7WUFDWixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsZUFBZSxHQUFHLDBFQUFtQixDQUFDLFlBQVksQ0FDaEQsK0VBQWUsRUFDZiwrRUFBZSxDQUFDLE9BQU8sQ0FDTCxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRixDQUFDO1FBQ0gsQ0FBQztRQUNBLGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxxQkFBcUIsRUFDNUMsUUFBUSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLHVCQUF1QjtRQUN6QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQzs7QUF6S00sa0RBQXFCLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQztJQUN0RCxHQUFHLEVBQUUsdUJBQXVCO0NBQzdCLENBQUMsQ0FBQztBQUNJLGdEQUFtQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDcEQsR0FBRyxFQUFFLHFCQUFxQjtDQUMzQixDQUFDLENBQUM7QUFDSSwrQ0FBa0IsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ25ELEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0ksK0NBQWtCLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQztJQUNuRCxHQUFHLEVBQUUsb0JBQW9CO0NBQzFCLENBQUMsQ0FBQztBQUNJLCtDQUFrQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDbkQsR0FBRyxFQUFFLG9CQUFvQjtDQUMxQixDQUFDLENBQUM7QUFDSSwrQ0FBa0IsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ25ELEdBQUcsRUFBRSxvQkFBb0I7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0ksK0NBQWtCLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQztJQUNuRCxHQUFHLEVBQUUsb0JBQW9CO0NBQzFCLENBQUMsQ0FBQztBQUNJLCtDQUFrQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDbkQsR0FBRyxFQUFFLG9CQUFvQjtDQUMxQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0NzQztBQUMrQjtBQUNOO0FBQ0o7QUFDbkI7QUFDQTtBQUNpQjtBQUNKO0FBQ1c7QUFDSztBQUM3QjtBQUNGO0FBQ0E7QUFFc0M7QUFHcEI7QUFFNEc7QUFDRTtBQUc1RTtBQUNwRDtBQUVwQyxNQUFNLDZDQUE4QyxTQUFRLGtGQUF1QjtJQTZCeEY7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsWUFDRSxFQUNFLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCwyQkFBMkIsRUFDM0IsaUNBQWlDLEVBQ2pDLG9CQUFvQixHQVNyQixFQUNELHdCQUFzQztRQUV0QyxLQUFLLENBQ0gsSUFBSSxFQUNKLGdDQUFnQztZQUM5QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUMvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFDbkMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUN0QyxnSkFBMEMsRUFDMUMsZ0pBQTRDLENBQzdDLENBQUM7UUFFRixJQUFJLHdCQUF3QixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxpREFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxJQUFJLG9CQUFvQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pDLGlEQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDcEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsc0JBQXNCLEdBQUcsb0JBQW9CLENBQUM7UUFDckQsQ0FBQztRQUVELEtBQUssTUFBTSxzQkFBc0IsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQzlELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFdBQVcsRUFBb0IsQ0FBQztZQUN4RSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RCxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDO1FBQ2pCLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUM3RCxZQUFZLEdBQUcsbUVBQWlCLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksa0JBQWtCLENBQUM7UUFDdkIsTUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1RSxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDM0Isa0JBQWtCO2dCQUNoQixzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQU0sQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUNwRSxrQkFBa0IsR0FBRyxtRUFBaUIsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSx3QkFBd0IsR0FBMEI7WUFDdEQ7Z0JBQ0UsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtnQkFDckMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtnQkFDOUIsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsWUFBWSxFQUFFLG1FQUFlLENBQUMsSUFBSSxFQUFFO2dCQUNwQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2FBQ3RCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxtRUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2FBQ3RCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNEO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO2dCQUNyQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkQsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUDtZQUNEO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLElBQUk7Z0JBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLElBQUk7Z0JBQ2pDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtnQkFDckMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGtEQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLEVBQUU7YUFDUjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07Z0JBQ3ZDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxpREFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxDQUFDO2FBQ1A7WUFDRDtnQkFDRSxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsaURBQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUN4QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGlCQUFpQjtnQkFDM0IsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtnQkFDdkMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFDOUMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7YUFDN0I7WUFDRDtnQkFDRSxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsaURBQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUN4QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsQ0FBQzthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7Z0JBQzFDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxrRUFBZ0IsQ0FBQztnQkFDbkMsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7YUFDN0I7WUFDRDtnQkFDRSxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxTQUFTO2dCQUMxQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsbUVBQWlCLENBQUM7Z0JBQ3BDLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEdBQUc7Z0JBQ2hDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFNBQVM7Z0JBQzFDLEtBQUssRUFBRSwrREFBVSxDQUFDLFdBQVc7Z0JBQzdCLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEdBQUcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2FBQzdCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsYUFBYSxFQUFFLHFFQUFhLENBQUMsR0FBRztnQkFDaEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLCtEQUFVLENBQUMsV0FBVztnQkFDN0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDO2dCQUNyQyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjthQUM3QjtTQUNGLENBQUM7UUFFRixjQUFjO1FBQ2Qsd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtZQUNFLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxZQUFZO1lBQzlCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLGlEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN6QyxHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxHQUFHO1NBQ1QsRUFDRDtZQUNFLFFBQVEsRUFBRSwwQkFBMEI7WUFDcEMsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztZQUNsQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLEtBQUssRUFBRSwrREFBVSxDQUFDLFlBQVk7WUFDOUIsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JELEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7U0FDUCxDQUNGLENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2Ysd0JBQXdCLENBQUMsSUFBSSxDQUMzQjtnQkFDRSxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO2dCQUN2QyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxZQUFZO2dCQUM5QixpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixTQUFTLEVBQUUsSUFBSTtnQkFDZixZQUFZLEVBQUUsaURBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxHQUFHLEVBQUUsQ0FBQztnQkFDTixHQUFHLEVBQUUsaURBQU0sQ0FBQyw0QkFBNEI7Z0JBQ3hDLDRCQUE0QixFQUFFLElBQUk7YUFDbkMsRUFDRDtnQkFDRSxRQUFRLEVBQUUsZ0NBQWdDO2dCQUMxQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxHQUFHO2dCQUNoQyxlQUFlLEVBQUUseUVBQWUsQ0FBQyxXQUFXO2dCQUM1QyxXQUFXLEVBQUUsaURBQU0sQ0FBQyw0QkFBNEI7Z0JBQ2hELEtBQUssRUFBRSwrREFBVSxDQUFDLFlBQVk7Z0JBQzlCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFlBQVksRUFBRSxJQUFJLG1EQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsaURBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUM5RSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUNyQiw0QkFBNEIsRUFBRSxJQUFJO2FBQ25DLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7Z0JBQ2xDLGVBQWUsRUFBRSx5RUFBZSxDQUFDLFdBQVc7Z0JBQzVDLFdBQVcsRUFBRSxpREFBTSxDQUFDLDRCQUE0QjtnQkFDaEQsS0FBSyxFQUFFLCtEQUFVLENBQUMsWUFBWTtnQkFDOUIsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsWUFBWSxFQUFFLElBQUksbURBQU8sQ0FBQyxJQUFJLFlBQVksQ0FBQyxpREFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQ2hGLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUN0QixHQUFHLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQ3JCLDRCQUE0QixFQUFFLElBQUk7YUFDbkMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsd0JBQXdCLENBQUMsSUFBSSxDQUFDO2dCQUM1QixRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO2dCQUNyQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO2dCQUNsQyxLQUFLLEVBQUUsK0RBQVUsQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsa0RBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakQsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLENBQUM7YUFDUCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHVDQUF1QyxDQUFDLEVBQ3RDLFFBQVEsRUFDUixhQUFhLEVBQ2IsU0FBUyxFQUNULElBQUksR0FNTDs7UUFDQyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixlQUFlLEdBQUcsMEVBQW1CLENBQUMsWUFBWSxDQUNoRCwrRUFBZSxFQUNmLCtFQUFlLENBQUMsT0FBTyxDQUNMLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sMkJBQTJCLEdBQy9CLFVBQUksQ0FBQyxzQkFBc0IsbUNBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFtQyxDQUFDO1FBRXRGLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUvRSxJQUNFLDZDQUE2QyxDQUFDLFdBQVc7Z0JBQ3pELDJCQUEyQixDQUFDLFVBQVUsRUFDdEMsQ0FBQztnQkFDQSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pDLGFBQXFCLENBQUMsVUFBVSxFQUNqQywyQkFBMkIsQ0FBQyxVQUFVLENBQ3ZDLENBQUM7Z0JBQ0YsNkNBQTZDLENBQUMsV0FBVztvQkFDdkQsMkJBQTJCLENBQUMsVUFBVSxDQUFDO1lBQzNDLENBQUM7WUFFRCxJQUNFLDZDQUE2QyxDQUFDLFVBQVU7Z0JBQ3hELDJCQUEyQixDQUFDLFNBQVMsRUFDckMsQ0FBQztnQkFDQSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pDLGFBQXFCLENBQUMsU0FBUyxFQUNoQywyQkFBMkIsQ0FBQyxTQUFTLENBQ3RDLENBQUM7Z0JBQ0YsNkNBQTZDLENBQUMsVUFBVTtvQkFDdEQsMkJBQTJCLENBQUMsU0FBUyxDQUFDO1lBQzFDLENBQUM7WUFDRCxNQUFNLHlCQUF5QixHQUFHLHVGQUF1QixDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDdkYseUJBQXlCLENBQUMsZUFBZSxDQUN2QyxhQUFhLEVBQ2IseUVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLEVBQzdDLElBQUksRUFDSiwyQkFBMkIsQ0FBQyxvQkFBb0IsQ0FDakQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsUUFBUSxDQUFDLFlBQVksQ0FDbkIsMkJBQTJCLEVBQzNCLDJCQUEyQixDQUFDLG9CQUFvQixDQUNqRCxDQUFDO1FBQ0osQ0FBQztRQUVELFlBQVk7UUFDWixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFcEUsU0FBUztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRixRQUFRO1FBQ1IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFN0YsTUFBTSx5QkFBeUIsR0FBRyx1RkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3ZGLHlCQUF5QixDQUFDLGVBQWUsQ0FDdkMsYUFBYSxFQUNiLHlFQUFlLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUM3QyxJQUFJLEVBQ0osMkJBQTJCLENBQUMsb0JBQW9CLENBQ2pELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxvQkFBcUM7UUFDNUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLG9CQUFvQixDQUFDO0lBQ3JELENBQUM7O0FBL2JNLDBEQUFZLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLDBEQUFZLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLGdFQUFrQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDbkQsR0FBRyxFQUFFLG9CQUFvQjtDQUMxQixDQUFDLENBQUM7QUFDSSw2REFBZSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZFLG9FQUFzQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDdkQsR0FBRyxFQUFFLHdCQUF3QjtDQUM5QixDQUFDLENBQUM7QUFDSSw2REFBZSxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZFLG9FQUFzQixHQUFHLElBQUksOEVBQW9CLENBQUM7SUFDdkQsR0FBRyxFQUFFLHdCQUF3QjtDQUM5QixDQUFDLENBQUM7QUFDSSx5REFBVyxHQUFHLElBQUksOEVBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUMvRCxpRUFBbUIsR0FBRyxJQUFJLDhFQUFvQixDQUFDO0lBQ3BELEdBQUcsRUFBRSxxQkFBcUI7Q0FDM0IsQ0FBQyxDQUFDO0FBQ0ksd0RBQVUsR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDN0QsdURBQVMsR0FBRyxJQUFJLDhFQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDM0QsOERBQWdCLEdBQXdCLElBQUksOEVBQW9CLENBQUM7SUFDdEUsR0FBRyxFQUFFLGtCQUFrQjtDQUN4QixDQUFDLENBQUM7QUFFWSx5REFBVyxHQUFHLEdBQUcsQ0FBQztBQUNsQix3REFBVSxHQUFHLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZEcUI7QUFDZjtBQUNLO0FBQ1E7QUFDSjtBQUNKO0FBQ047QUFDQztBQUNnQjtBQUNUO0FBQ2lCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVmpCO0FBUUo7QUFHZ0I7QUFDQTtBQUNkO0FBQ2dCO0FBSTRCO0FBRXJCO0FBRU47QUFDUDtBQUNtQjtBQUVmO0FBS1U7QUFHSDtBQUNGO0FBS3pELE1BQWUsdUJBQXdCLFNBQVEsb0RBQVE7SUEwQjVELFlBQ0UsTUFBK0IsRUFDL0Isa0JBQTBCLEVBQzFCLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQ25FLHFCQUF1QyxFQUN2QyxvQkFBc0M7UUFFdEMsS0FBSyxFQUFFLENBQUM7UUFoQ0EsZ0JBQVcsR0FBMEIsRUFBRSxDQUFDO1FBTzNDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUd2QixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQWF0QixlQUFVLEdBQW1CLGdFQUFVLENBQUMsb0JBQW9CLENBQUM7UUFVbEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO1FBRS9DLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBRS9CLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxxQkFBcUIsQ0FBQztRQUNyRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsb0JBQW9CLENBQUM7UUFFbkQsSUFBSSxDQUFDLGFBQWEsSUFBSSxpQ0FBaUMsa0JBQWtCLElBQUksQ0FBQztJQUNoRixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFnQztRQUNyRCxPQUFPLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyx3QkFBK0M7UUFDekUsTUFBTSxTQUFTLEdBQTBCLEVBQUUsQ0FBQztRQUM1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLHdCQUF3QixFQUFFLENBQUM7WUFDNUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFFN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUN6RSx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFFLENBQUM7UUFDakYsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQsNkJBQTZCLENBQUMsSUFBWTtRQUN4QyxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBRSxDQUFDO1FBQ2pGLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRVMsY0FBYyxDQUN0QixJQUF1QixFQUN2QixhQUEyQixFQUMzQixTQUFrQixFQUNsQixRQUFrQixFQUNsQixvQkFBNEM7UUFFNUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckQsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzQixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDdEQsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzVCLGVBQWUsR0FBRywyRUFBbUIsQ0FBQyxZQUFZLENBQ2hELG9CQUFvQixFQUNwQixvQkFBb0IsQ0FBQyxPQUFPLENBQ1YsQ0FBQztnQkFDdkIsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRixDQUFDO1lBQ0QsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxTQUFTO2dCQUNULElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkYsWUFBWTtnQkFDWixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsUUFBUTtRQUNSLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFUyxjQUFjLENBQUMsYUFBMkIsRUFBRSxXQUFxQjtRQUN4RSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FDeEMsYUFBcUIsQ0FBQyxXQUFXLEVBQ2xDLEtBQUssRUFDTCxXQUFXLENBQUMsRUFBRSxDQUNmLENBQUM7SUFDSixDQUFDO0lBRVMsZUFBZSxDQUFDLGFBQTJCLEVBQUUsWUFBdUI7UUFDM0UsYUFBcUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQ3hDLGFBQXFCLENBQUMsWUFBWSxFQUNuQyxLQUFLLEVBQ0wsWUFBWSxDQUFDLEVBQUUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFUyxjQUFjLENBQUMsYUFBMkIsRUFBRSxXQUFvQjtRQUN2RSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsYUFBcUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFUyxXQUFXLENBQ25CLGFBQTJCLEVBQzNCLGVBQWdDLEVBQ2hDLElBQWEsRUFDYixVQUFrQjtRQUVsQixJQUFJLFVBQW9CLENBQUM7UUFDekIsSUFBSSxjQUF3QixDQUFDO1FBQzdCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLFVBQVUsR0FBRyxpRUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQVMsQ0FBQztZQUN2RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pELElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixVQUFVLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RCxjQUFjLEdBQUcsV0FBVyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUMzQixjQUFjLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUMvQyxVQUFVLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsR0FBRyxrRUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLGNBQWMsR0FBRyxrREFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUEsYUFBcUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQ3hDLGFBQXFCLENBQUMsVUFBVSxFQUNqQyxLQUFLLEVBQ0wsVUFBVyxDQUFDLEVBQUUsQ0FDZixDQUFDO1FBQ0QsYUFBcUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFFLGFBQXFCLENBQUMsWUFBWSxFQUFFLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRVMsYUFBYSxDQUNyQixhQUEyQixFQUMzQixlQUFnQyxFQUNoQyxJQUFhLEVBQ2IsVUFBa0I7UUFFbEIsSUFBSSxnQkFBMEIsQ0FBQztRQUMvQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTSxVQUFVLEdBQUcsaUVBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFTLENBQUM7WUFDdkUsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6RCxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDNUIsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUMzQixnQkFBZ0IsR0FBRyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixnQkFBZ0IsR0FBRyxrRUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFDQSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FDeEMsYUFBcUIsQ0FBQyxnQkFBZ0IsRUFDdkMsS0FBSyxFQUNMLGdCQUFpQixDQUFDLEVBQUUsQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFFUyxXQUFXLENBQ25CLGFBQTJCLEVBQzNCLFVBQW1CLEVBQ25CLGlCQUFxQztRQUVyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNqRCxNQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO29CQUMvRCxhQUFxQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FDMUMsYUFBcUIsQ0FBQyxVQUFVLEVBQ2pDLEtBQUssRUFDTCxrQkFBa0IsQ0FDbkIsQ0FBQztnQkFDSixDQUFDO3FCQUFNLElBQUksZ0RBQU0sQ0FBQyxZQUFZLEtBQUssbUVBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdkQsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDNUUsTUFBTSxvQkFBb0IsR0FBRyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDbkUsYUFBcUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNsQyxhQUFxQixDQUFDLHVCQUF1QixFQUM5Qyx3QkFBd0IsQ0FDekIsQ0FBQztvQkFDRCxhQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xDLGFBQXFCLENBQUMsbUJBQW1CLEVBQzFDLG9CQUFvQixDQUNyQixDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMxRCxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO29CQUNwRSxNQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDO29CQUMzRSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xDLGFBQXFCLENBQUMsY0FBYyxFQUNyQyxvQkFBb0IsQ0FDckIsQ0FBQztvQkFDRCxhQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xDLGFBQXFCLENBQUMsa0JBQWtCLEVBQ3pDLHdCQUF3QixDQUN6QixDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN2RCxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO29CQUNwRSxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDO29CQUNqRSxhQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xDLGFBQXFCLENBQUMsbUJBQW1CLEVBQzFDLG9CQUFvQixDQUNyQixDQUFDO29CQUNELGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxrQkFBa0IsRUFDekMsbUJBQW1CLENBQUMsRUFBRSxDQUN2QixDQUFDO2dCQUNKLENBQUM7Z0JBRUEsYUFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQyxhQUFxQixDQUFDLFlBQVksRUFDbkMsaUJBQWlCLENBQUMsWUFBWSxDQUMvQixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZCxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsYUFBcUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFUyxhQUFhLENBQ3JCLGFBQTJCLEVBQzNCLGVBQWlDLEVBQ2pDLFFBQWtCLEVBQ2xCLFVBQW1CO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUNuRCxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDMUMsQ0FBQztZQUVELGFBQXFCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDakMsYUFBcUIsQ0FBQyxXQUFXLEVBQ2xDLHNCQUF1QixDQUFDLE1BQU0sQ0FDL0IsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXVCLENBQUMsTUFBTSxFQUFFLGdEQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN2RixJQUFJLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7Z0JBQ25FLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDeEUsdUJBQXVCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUN6RSx1QkFBdUIsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQzFFLHVCQUF1QixDQUFDLGlCQUFpQixHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUMzRSxDQUFDO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHNCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsSUFBSSxnREFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ3ZDLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxJQUFLLGFBQXFCLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLENBQUM7Z0JBRUQsTUFBTSxjQUFjLEdBQUcsc0JBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUcsQ0FBQztnQkFDbkUsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLENBQUM7Z0JBQzdELE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFDckQsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUVyRCx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDM0UsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUUzRSxNQUFNLGVBQWUsR0FDbkIsR0FBRztvQkFDSCxJQUFJLENBQUMsR0FBRyxDQUNOLEtBQUssRUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FDbEYsQ0FBQztnQkFDSixNQUFNLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUcsZUFBZSxDQUFDO2dCQUVwRix1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDN0UsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUU3RSx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDOUUsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUU5RSx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFlBQVk7b0JBQ2pFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekQsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYztnQkFDM0YsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7Z0JBQ3ZFLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7WUFDMUUsQ0FBQztZQUNELElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNkLGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxhQUFhLEVBQ3BDLHVCQUF1QixDQUFDLGdCQUFnQixDQUN6QyxDQUFDO2dCQUNELGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxjQUFjLEVBQ3JDLHVCQUF1QixDQUFDLGlCQUFpQixDQUMxQyxDQUFDO2dCQUNELGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxjQUFjLEVBQ3JDLHVCQUF1QixDQUFDLGtCQUFrQixDQUMzQyxDQUFDO2dCQUNELGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyxhQUFhLEVBQ3BDLHVCQUF1QixDQUFDLGlCQUFpQixDQUMxQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUNWLGFBQTJCLEVBQzNCLGFBQTRCLEVBQzVCLFNBQW9CLEVBQ3BCLG1CQUF5QztRQUV6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxhQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsYUFBcUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRixPQUFPO1FBQ1QsQ0FBQztRQUVBLGFBQXFCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDakMsYUFBcUIsQ0FBQyxpQkFBaUIsRUFDeEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3pCLENBQUM7UUFDRixNQUFNLHVDQUF1QyxHQUFhLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUM3RSxDQUFDLE1BQWtCLEVBQUUsRUFBRTtZQUNyQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlFQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBYSxDQUFDO1lBQ3RFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUVmLElBQUkseUVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyw0REFBVyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztnQkFDOUUsTUFBTSxHQUFHLGdEQUFNLENBQUMsOENBQThDLENBQUM7WUFDakUsQ0FBQztZQUNELE9BQU8sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQ0YsQ0FBQztRQUNELGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEMsYUFBcUIsQ0FBQyw4QkFBOEIsRUFDckQsdUNBQXVDLENBQ3hDLENBQUM7UUFDRixJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksbUJBQW9CLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEdBQUcsbUJBQW9CLENBQUMsT0FBTyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNBLGFBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBRSxhQUFxQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsdUNBQXVDLENBQUMsRUFDdEMsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxHQU1MLElBQUcsQ0FBQztJQUVMLHdDQUF3QyxDQUFDLEVBQ3ZDLFFBQVEsRUFDUixJQUFJLEdBSUwsSUFBRyxDQUFDO0lBRUwsYUFBYTtRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVTLGtCQUFrQixDQUMxQixZQUE2QixFQUM3QixXQUE0QixFQUM1QixrQkFBbUMsRUFDbkMsaUJBQWtDO1FBRWxDLElBQUksZ0JBR0gsQ0FBQztRQUNGLElBQUksZUFHSCxDQUFDO1FBQ0YsSUFBSSw0REFBVyxDQUFDLHNCQUFzQixLQUFLLHlFQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEUsZ0JBQWdCLEdBQUcsNEVBQXNCLENBQUMsdUJBQXVCLENBQy9ELGtCQUFtQixFQUNuQix1QkFBdUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUNwRSxDQUFDO1lBQ0YsZUFBZSxHQUFHLDRFQUFzQixDQUFDLHVCQUF1QixDQUM5RCxpQkFBa0IsRUFDbEIsdUJBQXVCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FDcEUsQ0FBQztZQUVGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUM7WUFDaEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUM7UUFDaEUsQ0FBQzthQUFNLENBQUM7WUFDTixnQkFBZ0IsR0FBRywwRUFBcUIsQ0FBQyx1QkFBdUIsQ0FDOUQsWUFBWSxFQUNaLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ3BFLENBQUM7WUFDRixlQUFlLEdBQUcsMEVBQXFCLENBQUMsdUJBQXVCLENBQzdELFdBQVcsRUFDWCx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUNwRSxDQUFDO1lBRUYsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztZQUNoRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQztRQUNoRSxDQUFDO1FBRUQsTUFBTSx3QkFBd0IsR0FBMEIsRUFBRSxDQUFDO1FBRTNELEtBQUssTUFBTSx5QkFBeUIsSUFBSSxnQkFBZ0IsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xGLHlCQUF5QixDQUFDLEtBQUssR0FBRyxnRUFBVSxDQUFDLFlBQVksQ0FBQztZQUMxRCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsS0FBSyxNQUFNLHdCQUF3QixJQUFJLGVBQWUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sd0JBQXdCLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUM1RCxDQUFDLFVBQStCLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM5RCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1lBQ0YsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO2dCQUM3Qix3QkFBd0IsQ0FBQyxLQUFLLEdBQUcsZ0VBQVUsQ0FBQyxvQkFBb0IsQ0FBQztZQUNuRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sd0JBQXdCLENBQUMsS0FBSyxHQUFHLGdFQUFVLENBQUMsV0FBVyxDQUFDO2dCQUN4RCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sd0JBQXdCLENBQUM7SUFDbEMsQ0FBQzs7QUE1ZWdCLHNDQUFjLEdBRzNCLElBQUksR0FBRyxFQUFFLENBQUM7QUFDUCxxQ0FBYSxHQUE4QixFQUFFLENBQUM7QUFNcEMscUNBQWEsR0FBRyxnRUFBYyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3RDLHFDQUFhLEdBQUcsZ0VBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUl4Qyx3Q0FBZ0IsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2Qyx5Q0FBaUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QywwQ0FBa0IsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6Qyx5Q0FBaUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1RFY7QUFPMkI7QUFDL0I7QUFDUztBQW9CcEQ7O0dBRUc7QUFDSSxNQUFlLGtCQUFtQixTQUFRLG9EQUFRO0lBYXZELFlBQ0UsY0FBc0IsRUFDdEIsTUFJQztRQUVELEtBQUssRUFBRSxDQUFDO1FBbEJBLGFBQVEsR0FBNkQsRUFBRSxDQUFDO1FBQ3hFLGNBQVMsR0FBNkQsRUFBRSxDQUFDO1FBQ3pFLHVCQUFrQixHQUFvQyxFQUFFLENBQUM7UUFNM0QsaUJBQVksR0FBZ0IsU0FBUyxDQUFDO1FBVzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsa0JBQWtCLENBQUMsd0JBQXdCLENBQUM7UUFDckUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3BGLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWtCO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBa0I7UUFDMUMsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQ2hCLGVBQW1DLEVBQ25DLG1CQUF5QyxFQUN6QyxpQkFBdUM7UUFFdkMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyRCxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNSLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRztZQUM3QixhQUFhLEVBQUUsZUFBZSxDQUFDLGFBQWE7WUFDNUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtZQUMxQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtTQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFRCwrQkFBK0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELGFBQWEsQ0FBQyxXQUEyQjtRQUN2QyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxXQUFXLEtBQUssK0RBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxnREFBVyxDQUFDLHNCQUFzQixLQUFLLHlEQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xFLE9BQU8sSUFBSSxDQUFDLFVBQVcsQ0FBQztZQUMxQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVk7UUFDbkIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN4QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVk7UUFDcEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN6QixPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsVUFBOEIsRUFDekQsWUFBb0IsRUFBRSxhQUF5QixFQUFFLGNBQTBCO1FBQzNFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFDRSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQ3pELFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDM0QsQ0FBQztZQUNELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLHNCQUFzQjtnQkFDdEIsTUFBTSxJQUFJLEdBQUcsWUFBWSxHQUFHLENBQUM7Z0JBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ3BCLFNBQVM7b0JBQ1gsQ0FBQztvQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDWixNQUFNLElBQUksSUFBSSxDQUFDO29CQUNqQixDQUFDO29CQUNELElBQ0UsZ0RBQVcsQ0FBQyxzQkFBc0IsS0FBSyx5REFBZSxDQUFDLE1BQU07d0JBQzdELENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUM1QixDQUFDO3dCQUNELE1BQU0sSUFBSSxHQUFHLENBQUM7b0JBQ2hCLENBQUM7b0JBQ0QsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxNQUFNLElBQUksTUFBTSxDQUFDO1lBQ25CLENBQUM7WUFFRCxHQUFHLElBQUksTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBaEtNLCtCQUFZLEdBQXlCLEVBQUUsQ0FBQztBQUtoQywyQ0FBd0IsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQ1U7QUFDUjtBQUUxQyxNQUFNLGlCQUFpQixHQUFHLElBQUksc0RBQU8sRUFBRSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxzREFBTyxFQUFFLENBQUM7QUFDdkMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHNEQUFPLEVBQUUsQ0FBQztBQUN4QyxNQUFNLHFCQUFxQixHQUFHLElBQUksOERBQVcsRUFBRSxDQUFDO0FBQ2hELE1BQU0sZUFBZSxHQUFHLElBQUksc0RBQU8sRUFBRSxDQUFDO0FBQ3RDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxzREFBTyxFQUFFLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLHNEQUFPLEVBQUUsQ0FBQztBQUU3QyxLQUFLLFVBQVUsbUJBQW1CO0lBQ3ZDLElBQUksaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckMsT0FBTztJQUNULENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RSxlQUFlLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEUsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFMUUsaUJBQWlCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUMzQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3RFLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDN0QscUJBQXFCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDekQsTUFBTSxlQUFlLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztJQUMzRCxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3RFLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVNLE1BQU0sZUFBZSxHQUFHO0lBQzdCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHNCQUFzQjtDQUN2QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFDNkM7QUFDd0I7QUFVSDtBQUNYO0FBQ3dCO0FBRXZCO0FBU2E7QUFPWjtBQVFsQztBQUdrQjtBQUkzQzs7O0dBR0c7QUFDSSxNQUFNLFFBQVMsU0FBUSxvREFBUTtJQXlDcEMsWUFDRSxXQUFrQixFQUNsQixXQUF3QixFQUN4QixXQUF3QixFQUN4QixnQkFBd0IsRUFDeEIsWUFBcUM7UUFFckMsS0FBSyxFQUFFLENBQUM7UUE1Q1YsdUJBQWtCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekUsNEJBQXVCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDOUUsbUJBQWMsR0FBa0QsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNsRSx1QkFBa0IsR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVyRSxNQUFNO1FBQ0UseUJBQW9CLEdBQW1ELElBQUksR0FBRyxFQUFFLENBQUM7UUFDakYsZ0NBQTJCLEdBQXlCLEVBQUUsQ0FBQztRQUMvRCxrQkFBYSxHQUFnQixDQUFDLENBQUMsQ0FBQztRQUVoQyxrQkFBYSxHQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztRQUUzRSwwQkFBMEI7UUFDbEIsZ0JBQVcsR0FBRyw2REFBUyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixhQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsK0JBQStCO1FBQ2hELHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN2QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsd0JBQW1CLEdBQUcscURBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxjQUFjO1FBQzNELDZCQUF3QixHQUFHLHFEQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsY0FBYztRQUNoRSx5QkFBb0IsR0FBRyxxREFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGtFQUFrRTtRQUNwRyx5QkFBb0IsR0FBRyxxREFBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMseUJBQXlCO1FBQ3hFLDhCQUF5QixHQUFHLHFEQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUztRQUNoRCw4QkFBeUIsR0FBRyxxREFBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMseUJBQXlCO1FBRTdFLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLG9CQUFlLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFnQi9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7SUFFRCxlQUFlLENBQUMsTUFBYztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBYztRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQzVCLEdBQUcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ3RDLEdBQUcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ3RDLEdBQUcsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1FBQzNDLEdBQUcsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1FBQzNDLEdBQUcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBQ3JDLEdBQUcsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDO1FBQzFDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxHQUFHLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUV6Qyw2REFBNkQ7UUFDN0QsaUVBQWlFO1FBQ2pFLHNDQUFzQztRQUN0Qyw2QkFBNkI7UUFDN0IsNkJBQTZCO1FBQzdCLDZCQUE2QjtRQUM3QixNQUFNO1FBQ04sSUFBSTtRQUVKLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNLEtBQUssWUFBWTtRQUNyQixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUM7SUFDakMsQ0FBQztJQUVELEdBQUc7SUFDSCxxQkFBcUI7SUFDckIsR0FBRztJQUVJLFlBQVksQ0FBQyxrQkFBdUMsRUFBRSxLQUFVO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxRQUFvQyxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixRQUFRLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsOERBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVoRSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sbUJBQW1CLENBQ3hCLGNBQW1DLEVBQ25DLE9BQXdCLEVBQ3hCLE9BQWdCO1FBRWhCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hCLElBQUksT0FBUSxPQUFtQixDQUFDLGVBQWUsS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDaEUsTUFBTyxPQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUM3QyxNQUFPLE9BQW1CLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQy9DLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUUsQ0FBQztnQkFDM0QsTUFBTSxjQUFjLEdBQUc7b0JBQ3JCLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztvQkFDekMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNqQixDQUFDO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUNsQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDbkUsQ0FBQztnQkFDRCxJQUFJLGNBQWMsS0FBSyxxQkFBcUIsSUFBSSxjQUFjLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztvQkFDdEYsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsNkRBQVMsQ0FBQyxLQUFLLENBQUM7b0JBQ25DLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQztZQUVGLElBQUksT0FBUSxPQUFtQixDQUFDLGlCQUFpQixLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNsRSxJQUFLLE9BQW1CLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDM0MsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sRUFBRSxDQUFDO2dCQUNYLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxFQUFFLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxjQUFtQztRQUM1RCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUUsQ0FBQztZQUMzRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSw0QkFBNEIsQ0FDakMsY0FBbUMsRUFDbkMsT0FBaUM7UUFFakMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUUsQ0FBQztnQkFDM0QsTUFBTSxjQUFjLEdBQUc7b0JBQ3JCLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO29CQUNoQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7aUJBQ2pCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO2dCQUNELElBQUksY0FBYyxLQUFLLHFCQUFxQixJQUFJLGNBQWMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO29CQUN0RixJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyw2REFBUyxDQUFDLEtBQUssQ0FBQztvQkFDbkMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFlBQVksQ0FBQyxjQUFtQzs7UUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sY0FBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLDBDQUFFLEtBQUssQ0FBQztZQUM1RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxVQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxLQUFLLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxvQkFBb0IsQ0FBQyxTQUFvQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQ0FBbUMsQ0FBQyxpQkFBMEIsRUFBRSxTQUFxQjtRQUNuRixNQUFNLHVCQUF1QixHQUFHLHNGQUF1QixDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFckYsSUFBSSxLQUFLLEdBQTBCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztZQUNyRSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQ3BELFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUNuRixDQUFDO1FBQ0YsdUJBQXVCLENBQUMscUJBQXFCLENBQUMsZ0JBQWlCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELG1CQUFtQixDQUFDLFNBQXFCOztRQUN2QyxNQUFNLG9CQUFvQixHQUN4QixTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUMzRixPQUFPLFVBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsbUNBQUksQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxTQUFvQjtRQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxtQkFBbUIsQ0FDakIscUNBQTZDLEVBQzdDLGNBQXFDLEVBQ3JDLFNBQW9CLEVBQ3BCLFFBQWlCO1FBRWpCLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQ3JFLGNBQWMsRUFDZCxRQUFRLENBQ1QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsb0ZBQW9DLENBQy9ELElBQUksRUFDSixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixxQ0FBcUMsRUFDckMsUUFBUSxDQUNULENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRS9ELFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUUxQixPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQkFBb0IsQ0FDbEIsU0FBb0IsRUFDcEIsNkJBQXFDLEVBQ3JDLGNBQXFDO1FBRXJDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlGLE1BQU0sVUFBVSxHQUFHLHFGQUFxQyxDQUN0RCxJQUFJLEVBQ0osU0FBUyxFQUNULDZCQUE2QixFQUM3QixtQkFBbUIsRUFDbkIsa0JBQWtCLENBQ25CLENBQUM7UUFFRixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9ELFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCw4QkFBOEIsQ0FDNUIsb0JBQW1DLEVBQ25DLE9BQW1DO1FBRW5DLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsK0ZBQStDLENBQzFFLElBQUksRUFDSixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLG9CQUFvQixFQUNwQixPQUFPLENBQ1IsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVFLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLHNEQUFzRDtRQUN4RCxDQUFDO1FBRUQsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILDRCQUE0QixDQUFDLFNBQXFCO1FBQ2hELE1BQU0sdUJBQXVCLEdBQUcsc0ZBQXVCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUVyRixNQUFNLG9CQUFvQixHQUN4QixTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUNyRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM3RSx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQyxnQkFBaUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQ0FBZ0MsQ0FDOUIsZUFBc0MsRUFDdEMsaUJBQTBCLEVBQzFCLFNBQXFCO1FBRXJCLE1BQU0sdUJBQXVCLEdBQUcsc0ZBQXVCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNyRixNQUFNLG9CQUFvQixHQUN4QixTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUNyRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM3RSx1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FDM0MsZ0JBQWlCLEVBQ2pCLGVBQWUsRUFDZixpQkFBaUIsQ0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRCx3Q0FBd0MsQ0FBQyxFQUN2QyxRQUFRLEVBQ1IsSUFBSSxHQUlMO1FBQ0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdDQUF3QyxDQUFDO1lBQzdELFFBQVE7WUFDUixJQUFJO1NBQ0wsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLEVBQ3ZCLFFBQVEsRUFDUixhQUFhLEVBQ2IsU0FBUyxFQUNULElBQUksR0FNTDtRQUNDLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFOUUsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1Q0FBdUMsQ0FBQztZQUM1RCxRQUFRO1lBQ1IsYUFBYTtZQUNiLFNBQVM7WUFDVCxJQUFJO1NBQ0wsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztZQUN0QyxhQUFhO1lBQ2IsU0FBUztZQUNULGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsOENBQThDLENBQUMsRUFDN0MsYUFBYSxFQUNiLFNBQVMsRUFDVCxhQUFhLEdBS2Q7UUFDQyxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFNUUsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztZQUN0QyxhQUFhO1lBQ2IsU0FBUztZQUNULGFBQWE7U0FDZCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLGNBQXFDLEVBQUUsUUFBaUI7UUFDckUsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQyxJQUNFLElBQUssQ0FBQyxLQUFLLEtBQUssK0RBQVUsQ0FBQyxZQUFZO2dCQUN2QyxJQUFLLENBQUMsS0FBSyxLQUFLLCtEQUFVLENBQUMsb0JBQW9CLEVBQy9DLENBQUM7Z0JBQ0QsbUJBQW1CLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFDRCxJQUNFLElBQUssQ0FBQyxLQUFLLEtBQUssK0RBQVUsQ0FBQyxXQUFXO2dCQUN0QyxJQUFLLENBQUMsS0FBSyxLQUFLLCtEQUFVLENBQUMsb0JBQW9CLEVBQy9DLENBQUM7Z0JBQ0Qsa0JBQWtCLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sb0JBQW9CLEdBQUcsNEVBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEUsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLGlCQUFpQixDQUNoRixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxRQUFRLENBQ1QsQ0FBQztRQUNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTyw2QkFBNkIsQ0FDbkMsYUFBc0IsRUFDdEIsU0FBa0IsRUFDbEIsYUFBMkI7UUFFM0IsSUFBSSxRQUFRLENBQUMseUJBQXlCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0MsUUFBUSxDQUFDLHlCQUF5QixHQUFHLHNGQUF1QixDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDNUYsQ0FBQztRQUNELE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDLHlCQUEwQixDQUFDO1FBQ3BFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUN4Qix1QkFBdUIsQ0FBQyxlQUFlLENBQ3JDLGFBQWEsRUFDYixJQUFJLENBQUMsUUFBUSxFQUNiLFNBQVMsRUFDVCxLQUFLLENBQUMsS0FBSyxDQUNaLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUN4QixJQUFJLHlFQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUNwRCxJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUNkLHVCQUF1QixDQUFDLHNCQUFzQixDQUM1QyxhQUFhLEVBQ2IsSUFBSSxDQUFDLFFBQVEsRUFDYixLQUFLLENBQUMsS0FBSyxDQUNaLENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6RCxDQUFDO2dCQUNILENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztvQkFDN0MsdUJBQXVCLENBQUMsZUFBZSxDQUNyQyxhQUFhLEVBQ2IsSUFBSSxDQUFDLFFBQVEsRUFDYixTQUFTLEVBQ1QsS0FBSyxDQUFDLEtBQUssQ0FDWixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxrQ0FBa0MsQ0FBQyxFQUN6QyxhQUFhLEVBQ2IsU0FBUyxFQUNULGFBQWEsR0FLZDtRQUNDLE1BQU0sdUJBQXVCLEdBQUcsc0ZBQXVCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNyRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUQsSUFBSSxHQUFHLElBQUksSUFBSTtZQUFFLE9BQU87UUFDeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLGFBQWEsSUFBSSx5RUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUM1QixJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUNkLHVCQUF1QixDQUFDLGVBQWUsQ0FDckMsYUFBYSxFQUNiLElBQUksQ0FBQyxRQUFRLEVBQ2IsU0FBUyxFQUNULEtBQUssQ0FBQyxLQUFLLENBQ1osQ0FBQztvQkFDSixDQUFDO3lCQUFNLENBQUM7d0JBQ04sdUJBQXVCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksb0JBQW9CLENBQUMsaUJBQTRCLEVBQUUsc0JBQWtDO1FBQzFGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQztRQUM3QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsc0JBQXNCLGFBQXRCLHNCQUFzQixjQUF0QixzQkFBc0IsR0FBSSxpQkFBaUIsQ0FBQztRQUU1RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLHFHQUFxRztRQUNyRyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxxREFBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUsscURBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyRixJQUFJLENBQUMsb0JBQW9CLEdBQUcscURBQUssQ0FBQyxHQUFHLENBQUM7WUFDdEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHFEQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUNFLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxREFBSyxDQUFDLEdBQUc7WUFDM0MsSUFBSSxDQUFDLHdCQUF3QixLQUFLLHFEQUFLLENBQUMsR0FBRyxFQUMzQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHFEQUFLLENBQUMsR0FBRyxDQUFDO1lBQzNDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxxREFBSyxDQUFDLEdBQUcsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDBCQUEwQixDQUMvQixrQkFBNkIsRUFDN0Isa0JBQTZCLEVBQzdCLHVCQUFrQyxFQUNsQyx1QkFBa0M7UUFFbEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztRQUMvQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsdUJBQXVCLENBQUM7UUFDekQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHVCQUF1QixDQUFDO1FBRXpELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxrQkFBa0IsQ0FBQyxrQkFBNkIsRUFBRSxrQkFBNkI7UUFDcEYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztRQUMvQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsa0JBQWtCLENBQUM7UUFDcEQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO1FBRXBELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsd0NBQXdDO0lBQ3hDLElBQUk7SUFFSixHQUFHO0lBQ0gsV0FBVztJQUNYLEdBQUc7SUFFSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLDZEQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLDZEQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssNkRBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyw2REFBUyxDQUFDLE1BQU0sQ0FBQztJQUM3QyxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyw2REFBUyxDQUFDLElBQUksQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJLGVBQWUsQ0FBQyxlQUF3QjtRQUMxQyxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLDZEQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUQsZ0RBQU0sQ0FBQyxJQUFJLENBQ1QsK0dBQStHLENBQ2hILENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztRQUN6QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksdUJBQXVCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLElBQW1CO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzVCLENBQUM7O0FBN3RCYyx1QkFBYyxHQUFHLENBQUMsQ0FBQztBQU9sQyxnQkFBZ0I7QUFDVCx5QkFBZ0IsR0FDckIsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRjZCO0FBQ2M7QUFDRDtBQUNRO0FBQ0k7QUFFK0I7QUFDMUM7QUFHdEI7QUFDUTtBQUVMO0FBRy9CLE1BQU0sa0JBQWtCO0lBaUI3Qjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDNUIsZ0JBQXdCLEVBQ3hCLFlBQXFDLEVBQ3JDLG9CQUE0QixnREFBTSxDQUFDLDhCQUE4QjtRQUVqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDOUQsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRXRGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTiw4REFBOEQ7WUFDOUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDakMsZ0JBQXdCLEVBQ3hCLFlBQXFDLEVBQ3JDLG9CQUE0QixnREFBTSxDQUFDLDhCQUE4QjtRQUVqRSxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBd0I7UUFDN0QsT0FBTyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxXQUF3Qjs7UUFDN0QsT0FBTyxVQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsMENBQUUsS0FBSyxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlO1FBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxjQUFjLENBQzFCLGdCQUF3QixFQUN4QixZQUFxQztRQUVyQyxrREFBa0Q7UUFDbEQsSUFBSSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUN4RSxnQkFBZ0IsQ0FDUCxDQUFDO1FBQ1osTUFBTSxRQUFRLEdBQUcsSUFBSSwrQ0FBUSxDQUMzQixrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFFLEVBQ3hELEVBQUUsa0JBQWtCLENBQUMsa0JBQWtCLEVBQ3ZDLGVBQWUsRUFBRSxFQUNqQixnQkFBZ0IsRUFDaEIsWUFBWSxDQUNiLENBQUM7UUFFRixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRXJELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxNQUFNLENBQUMsOEJBQThCLENBQUMsZ0JBQXdCO1FBQ25FLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQy9GLElBQUksd0NBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbkYsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sZUFBZSxJQUFJLGtCQUFrQixDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQ3pCLGVBQXlCLEVBQ3pCLGVBQXdDOztRQUV4QyxNQUFNLGdCQUFnQixHQUFHLHdCQUFrQixDQUFDLGFBQWE7YUFDdEQsR0FBRyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsMENBQy9CLEtBQUssRUFBRSxDQUFDO1FBQ1osSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3RixNQUFNLDBCQUEwQixHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RSxJQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLEVBQzlGLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFrQixFQUFFLGVBQXNCO1FBQzVFLFdBQVc7UUFDWCxRQUFRLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9ELHNDQUFzQztRQUN0QyxDQUFDO1lBQ0Msa0JBQWtCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFbEYsbURBQW1EO1lBQ25ELElBQUksR0FBRyxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUUsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUVyRCxrREFBa0Q7WUFDbEQsa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUNsRCxRQUFRLENBQUMsZ0JBQWdCLEVBQ3pCLGVBQWUsQ0FDaEIsQ0FBQztRQUNKLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsSUFBSSx3Q0FBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbEYsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQzNDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzdCLE1BQU0sUUFBUSxHQUFHLFdBQVksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBYSxDQUFDO29CQUN0RSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFrQixDQUFDO29CQUN0RCxNQUFNLGNBQWMsR0FBRzt3QkFDckIsSUFBSSxFQUFFLGFBQWE7d0JBQ25CLEtBQUssRUFBRSw4REFBYSxDQUFDLG9CQUFvQixDQUN2QyxhQUFhLENBQUMsWUFBWSxFQUMxQixhQUFhLENBQUMsWUFBWSxFQUMxQixVQUFVLEVBQ1YsYUFBYSxDQUFDLGVBQWUsQ0FDOUI7cUJBQ0YsQ0FBQztvQkFDRixRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDckMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO29CQUMvRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLG1DQUFtQyxDQUN4QyxnQkFBd0IsRUFDeEIsWUFBaUM7UUFFakMsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBRSxDQUFDO1FBQ2xFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDbkgsSUFBSSx3Q0FBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxnREFBTSxDQUFDLElBQUksQ0FDVCx5R0FBeUcsZ0JBQWdCLEVBQUUsQ0FDNUgsQ0FBQztZQUNGLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUcsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUUsQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixNQUFNLEtBQUssR0FBRywrQ0FBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUYsT0FBUSxLQUFNLENBQUMsS0FBSyxDQUFDLEVBQW1CLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFELE1BQU0sUUFBUSxHQUFHLFVBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0MsT0FBTyxRQUFTLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQzVCLGdCQUF3QixFQUN4QixZQUFxQyxFQUNyQyxpQkFBeUI7UUFFekIsTUFBTSxXQUFXLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQztRQUM1RCxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsa0JBQWtCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTNFLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3hFLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sTUFBTSxDQUFDLG9CQUFvQixDQUNqQyxnQkFBd0IsRUFDeEIsWUFBcUM7UUFFckMsc0NBQXNDO1FBQ3RDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLHFDQUFxQyxHQUdyQyxFQUFFLENBQUM7UUFDVCxLQUFLLE1BQU0sWUFBWSxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzVELE1BQU0saUJBQWlCLEdBQUcsdUZBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVCLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFFLENBQUM7WUFDdkUsQ0FBQztZQUVELGVBQWUsSUFBSSxpQkFBaUIsR0FBRyxTQUFTLENBQUM7WUFDakQscUNBQXFDLENBQUMsSUFBSSxDQUFDO2dCQUN6QyxXQUFXLEVBQUUsaUJBQWlCO2dCQUM5QixZQUFZLEVBQUUsWUFBWTthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELG1GQUFtRjtRQUNuRixNQUFNLE1BQU0sR0FBRyw4REFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLDZEQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEYsSUFBSSxVQUFVLENBQUM7UUFDZixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM3QyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQ25DLGdCQUFnQixFQUFFLGVBQWU7Z0JBQ2pDLFVBQVUsRUFBRSxDQUFDO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxxQ0FBcUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0RSxNQUFNLFdBQVcsR0FBRyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDekUsTUFBTSxZQUFZLEdBQUcscUNBQXFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBRTNFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVCLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFFLENBQUM7WUFDbkUsQ0FBQztZQUNELElBQUksY0FBYyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7WUFDOUMsSUFBSSx5RUFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksY0FBYyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwRixjQUFjLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxtQkFBbUI7WUFDbkIsTUFBTSxRQUFRLEdBQUcsVUFBVztpQkFDekIsWUFBWSxDQUFDO2dCQUNaLGVBQWUsRUFBRSxZQUFZLENBQUMsZUFBZTtnQkFDN0MsYUFBYSxFQUFFLHFFQUFhLENBQUMsS0FBSztnQkFDbEMsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osVUFBVSxFQUFFLFdBQVc7Z0JBQ3ZCLFdBQVcsRUFBRSxjQUFjO2FBQzVCLENBQUM7aUJBQ0QsV0FBVyxFQUFFLENBQUM7WUFFakIsSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQWtCLENBQUM7Z0JBQ3RELElBQUksR0FBRyxHQUFHLCtDQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzFELElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNoQixHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDaEIsK0NBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7Z0JBRUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO29CQUM3QixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsS0FBSyxFQUFFLDhEQUFhLENBQUMsb0JBQW9CLENBQ3ZDLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLFVBQVUsRUFDVixZQUFZLENBQUMsZUFBZSxDQUM3QjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sc0NBQXNDO2dCQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBRSxDQUFDO2dCQUMzRCxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLG1DQUFtQzs7UUFDeEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNqRSxjQUFRLENBQUMsS0FBSyxFQUFFLDBDQUFFLHFCQUFxQixFQUFFLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7O0FBblRELEdBQUc7QUFDSCxrQkFBa0I7QUFDbEIsR0FBRztBQUNZLGdDQUFhLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDL0QsOEJBQVcsR0FDeEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNHLGlDQUFjLEdBQXVDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDL0QsZ0RBQTZCLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEUsa0NBQWUsR0FDNUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNHLGlDQUFjLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDekQsZ0NBQWEsR0FBc0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM3RCw4QkFBVyxHQUE4RCxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ25GLHFDQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLHFDQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FFdkNnQztBQUVDO0FBQ047QUFDSjtBQUNXO0FBQ2tCO0FBQ2xEO0FBQ29EO0FBQ2xEO0FBQ2tEO0FBQ2xEO0FBQ0E7QUFDa0Q7QUFDeEI7QUFDaEI7QUFDWTtBQUNFO0FBQ0o7QUFDWTtBQUNFO0FBQ0k7QUFDQTtBQUNaO0FBQ0Y7QUFDWTtBQUNSO0FBQ1Y7QUFDUTtBQUNOO0FBQ3RCO0FBQ3lCO0FBQ0Q7QUFDSztBQUNqQjtBQUNFO0FBQ0E7QUFDWTtBQUUxQjtBQUUzQzs7R0FFRztBQUNJLE1BQU0sbUJBQW1CO0lBQzlCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FDM0IsV0FBaUMsRUFDakMsWUFBa0MsRUFDbEMsZ0JBQXlCLElBQUk7UUFFN0IsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXpDLDJEQUEyRDtRQUMzRCxrQkFBa0I7UUFDbEIsc0JBQXNCO1FBQ3RCLElBQUk7UUFFSixzQkFBc0I7UUFDdEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEUscUVBQXFFO1FBRXJFLHFDQUFxQztRQUNyQyxJQUFJLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztRQUVuQyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQix5QkFBeUIsSUFBSSw2RUFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXBCLHVCQUF1QjtRQUN2QixVQUFVLElBQUksbUJBQW1CLENBQUMsdUJBQXVCO1FBQ3ZELHFCQUFxQjtRQUNyQixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDLEVBQzdGLCtEQUFVLENBQUMsWUFBWSxDQUN4QixDQUFDO1FBRUYsZUFBZTtRQUNmLElBQUksQ0FBQztZQUNILFVBQVUsSUFBSSxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsaURBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBVyxDQUFDLENBQUM7WUFDMUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLHlCQUF5QixHQUFHLFVBQVUsQ0FBQztRQUV0RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFVBQWdDLEVBQUUsZ0JBQXlCLElBQUk7UUFDMUYsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXhDLDJEQUEyRDtRQUMzRCxrQkFBa0I7UUFDbEIsc0JBQXNCO1FBQ3RCLElBQUk7UUFFSixzQkFBc0I7UUFDdEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFaEUscUNBQXFDO1FBQ3JDLElBQUksd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsd0JBQXdCLElBQUksNkVBQWdCLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXBCLHVCQUF1QjtRQUN2QixVQUFVLElBQUksbUJBQW1CLENBQUMsdUJBQXVCLENBQ3ZELGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxFQUN0RSwrREFBVSxDQUFDLFdBQVcsQ0FDdkIsQ0FBQztRQUVGLGVBQWU7UUFDZixJQUFJLENBQUM7WUFDSCxVQUFVLElBQUksbUJBQW1CLENBQUMsMEJBQTBCLENBQzFELGlCQUFpQixFQUNqQixLQUFLLEVBQ0wsYUFBYSxDQUNkLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLGlEQUFNLENBQUMsS0FBSyxDQUFDLENBQVcsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsR0FBRyxVQUFVLENBQUM7UUFFckQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxXQUFpQztRQUNwRSxNQUFNLGNBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVELE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQWlDO1FBQ2xFLE1BQU0sZUFBZSxHQUF5QixFQUFFLENBQUM7UUFDakQsTUFBTSxhQUFhLEdBQVksRUFBRSxDQUFDO1FBRWxDLDBCQUEwQjtRQUMxQixNQUFNLEtBQUssR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLEtBQUssTUFBTSxlQUFlLElBQUksVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUM1QixLQUFLLEVBQUUsQ0FBQztnQkFDVixDQUFDO1lBQ0gsQ0FBQztZQUNELGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEtBQUssTUFBTSxlQUFlLElBQUksVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUM1QixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsbUVBQWtCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdEMsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDakMsQ0FBQztnQkFDRCxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFHLENBQUM7WUFDM0IsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN6RCxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pELGlEQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMsdUJBQXVCLENBQ3BDLFdBQWlDLEVBQ2pDLFVBQTBCO1FBRTFCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLG9CQUFvQixHQUFhLEVBQUUsQ0FBQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6RSxTQUFTO1lBQ1gsQ0FBQztZQUNELFVBQVUsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxNQUFNLENBQUMsMEJBQTBCLENBQ3ZDLFdBQWlDLEVBQ2pDLGFBQXNCLEVBQ3RCLGFBQXNCO1FBRXRCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVwQixnQ0FBZ0M7UUFDaEMsSUFBSSxpREFBVyxDQUFDLHNCQUFzQixLQUFLLDBFQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM1RCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUM1QixTQUFTO29CQUNYLENBQUM7b0JBQ0QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxNQUFNLFNBQVMsR0FBRyxtRUFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3ZGLElBQ0UsU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLFFBQVE7d0JBQ3ZDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxVQUFVLEVBQzFDLENBQUM7d0JBQ0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNuRSxVQUFVLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksTUFDbkQsU0FBUyxDQUFDLGtCQUNaLElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxDQUFDO29CQUNuQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELFVBQVUsSUFBSSw2RUFBZ0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFM0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixVQUFVLElBQUksNkVBQWdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN4RCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sYUFBYSxHQUF5QixFQUFFLENBQUMsQ0FBQywwQ0FBMEM7UUFDMUYsTUFBTSxjQUFjLEdBQXlCLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQztRQUM1RixDQUFDO1lBQ0MsTUFBTSxjQUFjLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDOUMsTUFBTSxlQUFlLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDL0MsTUFBTSxzQkFBc0IsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUM3QixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDZixJQUFJLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ2xDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUM3QixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7Z0JBRXJELDBCQUEwQjtnQkFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNqRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQzVCLFNBQVM7b0JBQ1gsQ0FBQztvQkFDRCxNQUFNLFNBQVMsR0FBRyxtRUFBa0IsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUVqRixNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQ2pGLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQy9FLE1BQU0sT0FBTyxHQUFHLEdBQUcsa0JBQW1CLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxhQUFhLE9BQzFFLFVBQVUsQ0FBQyxhQUNiLEVBQUUsQ0FBQztvQkFFSCxFQUFFO29CQUNGLElBQ0UsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUNyRixDQUFDO3dCQUNELElBQUksTUFBTSxHQUFHLDZFQUFnQixDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxpQkFBa0IsQ0FBQyxDQUFDO3dCQUNsRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7NEJBQ25CLElBQ0UsU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLFFBQVE7Z0NBQ3ZDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxVQUFVLEVBQzFDLENBQUM7Z0NBQ0QsTUFBTSxHQUFHLDZFQUFnQixDQUFDLDBDQUEwQyxDQUNsRSxPQUFPLEVBQ1AsaUJBQWtCLEVBQ2xCLFNBQVMsQ0FDVixDQUFDOzRCQUNKLENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxVQUFVLElBQUksTUFBTSxDQUFDO29CQUN2QixDQUFDO29CQUNELE1BQU0sWUFBWSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3pFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3RCxjQUFjLENBQUMsR0FBRyxDQUNoQixHQUFHLGVBQWUsQ0FBQyxhQUFhLElBQUksZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQ3ZFLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCwyQkFBMkI7Z0JBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLE1BQU0sMEJBQTBCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7b0JBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDM0QsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDOzRCQUM1QixTQUFTO3dCQUNYLENBQUM7d0JBQ0QsSUFBSSxvQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FBRSxhQUFhLE1BQUssZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUN6RSxTQUFTO3dCQUNYLENBQUM7d0JBQ0QsTUFBTSxTQUFTLEdBQUcsbUVBQWtCLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDakYsSUFDRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsYUFBYSxJQUFJLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQ3RGLENBQUM7NEJBQ0QsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzRCQUVqRixNQUFNLE9BQU8sR0FBRyxHQUFHLGtCQUFtQixDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsYUFBYSxPQUMxRSxnQkFBZ0IsQ0FBQyxhQUNuQixFQUFFLENBQUM7NEJBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dDQUNmLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUN0QyxDQUFDOzRCQUNELHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUNyRSxDQUFDO3dCQUNELGVBQWUsQ0FBQyxHQUFHLENBQ2pCLEdBQUcsZUFBZSxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FDdkUsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHFGQUFxRjtRQUNyRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUNsRSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN4QixDQUFDO1lBQ0QsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzlCLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUVELElBQUksYUFBYSxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDaEUsU0FBUztZQUNYLENBQUM7aUJBQU0sSUFBSSxDQUFDLGFBQWEsSUFBSSxVQUFVLENBQUMsY0FBYyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3RFLFNBQVM7WUFDWCxDQUFDO1lBRUQsVUFBVSxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FDeEMsQ0FBQyxFQUNELFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGNBQWMsQ0FDZixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM1RCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUM1QixTQUFTO29CQUNYLENBQUM7b0JBQ0QsTUFBTSxTQUFTLEdBQUcsbUVBQWtCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN2RixJQUNFLFNBQVMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxRQUFRO3dCQUN2QyxVQUFVLENBQUMsY0FBYyxFQUFFLEtBQUssVUFBVSxFQUMxQyxDQUFDO3dCQUNELFVBQVUsSUFBSSw2RUFBZ0IsQ0FBQywyQ0FBMkMsQ0FDeEUsU0FBUyxFQUNULFFBQVEsRUFDUixDQUFDLENBQ0YsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELFVBQVUsSUFBSSw2RUFBZ0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLDBCQUEwQixDQUN0QyxJQUFvQjtRQUVwQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekQsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTlELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXBELElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzVELENBQUM7Q0FDRjtBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBMkIsRUFBRSxXQUFtQjtJQUN4RSxJQUFJLE9BQXVDLENBQUM7SUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDOUUsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sYUFBYSxHQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRELFNBQVMsYUFBYSxDQUFDLElBQXdCO1FBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxtRUFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3ZGLElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN0QixhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM5QixhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFdkIsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQTJCLEVBQUUsWUFBc0I7SUFDdEUsSUFBSSxnQkFBZ0IsR0FBeUIsRUFBRSxDQUFDO0lBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMzRCxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBRWxELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsV0FBaUM7SUFDM0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsS0FBSyxNQUFNLGVBQWUsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRCxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxtRUFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkYsSUFBSSxTQUFTLENBQUMsY0FBYyxFQUFFLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekYsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLElBQUksU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyRCxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQTJCLEVBQUUsV0FBbUI7SUFDN0Usb0JBQW9CO0lBQ3BCLElBQUksT0FBdUMsQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5RSxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxZQUFZLEdBQXlCLEVBQUUsQ0FBQztJQUM1QyxTQUFTLGdCQUFnQixDQUFDLElBQXdCO1FBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLG1FQUFrQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxhQUFhLENBQUMsSUFBd0I7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzVCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsbUVBQWtCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZGLElBQ0UsU0FBUyxJQUFJLElBQUk7Z0JBQ2pCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxRQUFRO2dCQUN2QyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssVUFBVSxFQUNwQyxDQUFDO2dCQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUN6QyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsQ0FBQztZQUNELGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2QixvQkFBb0I7SUFDcEIsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLElBQW9CO0lBQzFDLHdCQUF3QjtJQUN4QixNQUFNLGFBQWEsR0FBdUMsRUFBRSxDQUFDO0lBQzdELE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdEIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIseUJBQXlCO1lBQ3pCLG1GQUFtRjtZQUNuRixzRkFBc0Y7WUFDdEYsMkNBQTJDO1lBQzNDLFdBQVc7WUFDWCxJQUFJO1lBQ0osS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sWUFBWSxHQUFHLElBQUkscUdBQWdDLENBQUMscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0UsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGdEQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDckYsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksdUdBQWlDLENBQUMscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEYsWUFBWSxDQUFDLG9CQUFvQixDQUMvQixrREFBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUMxRSxDQUFDO2dCQUNGLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLHVHQUFpQyxDQUFDLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hGLFlBQVksQ0FBQyxvQkFBb0IsQ0FDL0IsbURBQU8sQ0FBQyxTQUFTLENBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FDM0IsQ0FDRixDQUFDO2dCQUNGLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLHdHQUFpQyxDQUFDLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hGLFlBQVksQ0FBQyxvQkFBb0IsQ0FDL0IsbURBQU8sQ0FBQyxTQUFTLENBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQzNCLENBQ0YsQ0FBQztnQkFDRixhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxnRkFBcUIsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRixZQUFZLENBQUMsb0JBQW9CLENBQy9CLE9BQU8sRUFDUCxtREFBTyxDQUFDLGNBQWMsQ0FBQztvQkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLO29CQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUs7b0JBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSztvQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLO2lCQUNoQyxDQUFDLENBQ0gsQ0FBQztnQkFDRixZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0QsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sWUFBWSxHQUFHLElBQUksa0VBQWMsRUFBRSxDQUFDO2dCQUMxQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDakQsSUFBSSxZQUEyQixDQUFDO2dCQUNoQyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDNUIsWUFBWSxHQUFHLElBQUksZ0VBQWEsQ0FBQyx5RUFBZSxDQUFDLE1BQU0sRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRixDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSxnRUFBYSxDQUFDLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlFLENBQUM7cUJBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLFlBQVksR0FBRyxJQUFJLGdFQUFhLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUUsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksZ0VBQWEsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04saURBQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEdBQUcsVUFBVSxDQUFDLENBQUM7b0JBQzdELE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDWCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNqRCxJQUFJLFlBQTJCLENBQUM7Z0JBQ2hDLElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM1QixZQUFZLEdBQUcsSUFBSSxnRUFBYSxDQUFDLHlFQUFlLENBQUMsTUFBTSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hGLENBQUM7cUJBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLFlBQVksR0FBRyxJQUFJLGdFQUFhLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUUsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksZ0VBQWEsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSxnRUFBYSxDQUFDLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixpREFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxVQUFVLENBQUMsQ0FBQztvQkFDN0QsTUFBTTtnQkFDUixDQUFDO2dCQUNELFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pELElBQUksWUFBNEIsQ0FBQztnQkFDakMsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzVCLFlBQVksR0FBRyxJQUFJLGtFQUFjLENBQUMseUVBQWUsQ0FBQyxNQUFNLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksa0VBQWMsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvRSxDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSxrRUFBYyxDQUFDLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9FLENBQUM7cUJBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLFlBQVksR0FBRyxJQUFJLGtFQUFjLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0UsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGlEQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO29CQUM3RCxNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pELElBQUksWUFBNEIsQ0FBQztnQkFDakMsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzVCLFlBQVksR0FBRyxJQUFJLDhFQUFvQixDQUFDLHlFQUFlLENBQUMsTUFBTSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZGLENBQUM7cUJBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLFlBQVksR0FBRyxJQUFJLDhFQUFvQixDQUFDLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JGLENBQUM7cUJBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLFlBQVksR0FBRyxJQUFJLDhFQUFvQixDQUFDLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JGLENBQUM7cUJBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLFlBQVksR0FBRyxJQUFJLDhFQUFvQixDQUFDLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JGLENBQUM7cUJBQU0sQ0FBQztvQkFDTixpREFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxVQUFVLENBQUMsQ0FBQztvQkFDN0QsTUFBTTtnQkFDUixDQUFDO2dCQUNELFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNqRCxJQUFJLFlBQWlDLENBQUM7Z0JBQ3RDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM3QixZQUFZLEdBQUcsSUFBSSw0RUFBbUIsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwRixDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSw0RUFBbUIsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwRixDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSw0RUFBbUIsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwRixDQUFDO3FCQUFNLENBQUM7b0JBQ04saURBQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEdBQUcsVUFBVSxDQUFDLENBQUM7b0JBQ25FLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDWCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMvQyxJQUFJLFlBQWtDLENBQUM7Z0JBQ3ZDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM3QixZQUFZLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRixDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRixDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSw4RUFBb0IsQ0FBQyx5RUFBZSxDQUFDLElBQUksRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRixDQUFDO3FCQUFNLENBQUM7b0JBQ04saURBQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEdBQUcsVUFBVSxDQUFDLENBQUM7b0JBQzdELE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDakQsSUFBSSxZQUFnQyxDQUFDO2dCQUNyQyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDNUIsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxNQUFNLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksMEVBQWtCLENBQUMseUVBQWUsQ0FBQyxJQUFJLEVBQUUscUVBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGlEQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO29CQUNsRSxNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pELElBQUksWUFBaUMsQ0FBQztnQkFDdEMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzdCLFlBQVksR0FBRyxJQUFJLDRFQUFtQixDQUNwQyx5RUFBZSxDQUFDLElBQUksRUFDcEIscUVBQWEsQ0FBQyxLQUFLLEVBQ25CLHlFQUFlLENBQUMsSUFBSSxFQUNwQixxRUFBYSxDQUFDLEtBQUssQ0FDcEIsQ0FBQztnQkFDSixDQUFDO3FCQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsSUFBSSw0RUFBbUIsQ0FDcEMseUVBQWUsQ0FBQyxJQUFJLEVBQ3BCLHFFQUFhLENBQUMsS0FBSyxFQUNuQix5RUFBZSxDQUFDLElBQUksRUFDcEIscUVBQWEsQ0FBQyxLQUFLLENBQ3BCLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxHQUFHLElBQUksNEVBQW1CLENBQ3BDLHlFQUFlLENBQUMsSUFBSSxFQUNwQixxRUFBYSxDQUFDLEtBQUssRUFDbkIseUVBQWUsQ0FBQyxJQUFJLEVBQ3BCLHFFQUFhLENBQUMsS0FBSyxDQUNwQixDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTixpREFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsR0FBRyxVQUFVLENBQUMsQ0FBQztvQkFDbkUsTUFBTTtnQkFDUixDQUFDO2dCQUNELFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLDBEQUFxQixFQUFFLENBQUM7Z0JBQ2pELFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLDBEQUFxQixFQUFFLENBQUM7Z0JBQ2pELFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sWUFBWSxHQUFHLElBQUksc0ZBQXdCLEVBQUUsQ0FBQztnQkFDcEQsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksd0ZBQXlCLEVBQUUsQ0FBQztnQkFDckQsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksNEZBQTJCLEVBQUUsQ0FBQztnQkFDdkQsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksNEZBQTJCLEVBQUUsQ0FBQztnQkFDdkQsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLGdGQUFxQixFQUFFLENBQUM7Z0JBQ2pELGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSw4RUFBb0IsRUFBRSxDQUFDO2dCQUNoRCxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGtCQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSwwRkFBMEIsRUFBRSxDQUFDO2dCQUN0RCxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sWUFBWSxHQUFHLElBQUksa0ZBQXNCLEVBQUUsQ0FBQztnQkFDbEQsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsZUFBZTtZQUNmLHNEQUFzRDtZQUN0RCwyQ0FBMkM7WUFDM0MsV0FBVztZQUNYLElBQUk7WUFDSix1QkFBdUI7WUFDdkIscURBQXFEO1lBQ3JELDZDQUE2QztZQUM3Qyw4REFBOEQ7WUFDOUQsNEVBQTRFO1lBQzVFLE1BQU07WUFDTiwyQ0FBMkM7WUFDM0MsV0FBVztZQUNYLElBQUk7WUFDSixxQkFBcUI7WUFDckIsbURBQW1EO1lBQ25ELDZDQUE2QztZQUM3Qyw4REFBOEQ7WUFDOUQsNEVBQTRFO1lBQzVFLE1BQU07WUFDTiwyQ0FBMkM7WUFDM0MsV0FBVztZQUNYLElBQUk7WUFDSixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSx3RUFBaUIsQ0FBQyx5RUFBZSxDQUFDLE1BQU0sRUFBRSxxRUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RixhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE1BQU0sWUFBWSxHQUFHLElBQUksZ0ZBQXFCLEVBQUUsQ0FBQztnQkFDakQsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLFlBQVksR0FBRyxJQUFJLDBFQUFrQixFQUFFLENBQUM7Z0JBQzlDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQW1DLENBQUM7UUFDOUYsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQW1DLENBQUM7UUFDN0YsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLElBQUksa0JBQWtCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUQsaURBQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUNoRSxTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakQsSUFBSSxHQUFHLEtBQUssVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkMsTUFBTTtZQUNSLENBQUM7WUFDRCxHQUFHLEVBQUUsQ0FBQztRQUNSLENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BELElBQUksR0FBRyxLQUFLLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU07WUFDUixDQUFDO1lBQ0QsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOThCaUM7QUFLUztBQUNtQjtBQUNNO0FBR2E7QUFDMUI7QUFHUztBQUVMO0FBQ3hCO0FBRzVCLE1BQU0sYUFBYTtJQUd4Qjs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsNkJBQTZCLENBQ2xDLFFBQWtCLEVBQ2xCLFlBQW9CLEVBQ3BCLFdBQW1CLEVBQ25CLGNBQThCLEVBQzlCLGtCQUF5QyxFQUN6QyxPQUFtQztRQUVuQyxRQUFRO1FBQ1IsTUFBTSxlQUFlLEdBQUcsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNuRCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsTUFBTSx1QkFBdUIsR0FBRyxzRkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3JGLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDO1lBQzdELFFBQVE7WUFDUixlQUFlLEVBQUUsWUFBWTtZQUM3QixpQkFBaUIsRUFBRSxXQUFXO1lBQzlCLGNBQWMsRUFBRSxjQUFjO1lBQzlCLGtCQUFrQixFQUFFLGtCQUFrQjtZQUN0QyxPQUFPO1NBQ1IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7QUF0Q2MsK0JBQWlCLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7QUF5QzFFLFNBQVMsK0NBQStDLENBQzdELFFBQWtCLEVBQ2xCLFlBQXFDLEVBQ3JDLG9CQUFtQyxFQUNuQyxPQUFtQztJQUVuQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFL0UsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyw2QkFBNkIsQ0FDNUUsUUFBUSxFQUNSLG9CQUFvQixDQUFDLE1BQU0sRUFDM0Isb0JBQW9CLENBQUMsS0FBSyxFQUMxQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLE9BQU8sQ0FDUixDQUFDO0lBRUYsT0FBTyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFTSxTQUFTLGlCQUFpQixDQUFDLFlBQXFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLHlFQUFxQixDQUFDLHNCQUFzQixDQUM3RCxZQUFZLENBQUMscUJBQXNCLENBQ3BDLENBQUM7SUFDRixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUVNLFNBQVMsaUNBQWlDLENBQy9DLGNBQXdCLEVBQ3hCLGtCQUF5QztJQUV6QyxJQUFJLHVCQUF1QixHQUFHLHVDQUF1QyxDQUFDO0lBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDL0MsdUJBQXVCLElBQUksTUFBTSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDeEYsQ0FBQztJQUNELE9BQU8sdUJBQXVCLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0ksU0FBUyxvQ0FBb0MsQ0FDbEQsUUFBa0IsRUFDbEIsU0FBb0IsRUFDcEIsbUJBQTJCLEVBQzNCLGtCQUEwQixFQUMxQixxQ0FBNkMsRUFDN0MsUUFBaUI7SUFFakIsTUFBTSx1QkFBdUIsR0FBRyxzRkFBdUIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3JGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUUvQyxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDaEQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbEQsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUN6QyxXQUFXLElBQUksV0FBVyxZQUFZLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBQ0QsTUFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxXQUFXLElBQUksc0JBQXNCLENBQUM7SUFFdEMsMkJBQTJCO0lBQzNCLElBQUksWUFBWSxHQUFHLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3RixZQUFZLElBQUksK0JBQStCLENBQUM7SUFDaEQsSUFBSSxXQUFXLEdBQUcsaUNBQWlDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLFdBQVcsSUFBSSw4QkFBOEIsQ0FBQztJQUM5QyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLFdBQVcsSUFBSSxrQ0FBa0MsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUN0QixXQUFXLElBQUksaUNBQWlDLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0scUJBQXFCLEdBQUcseUVBQXFCLENBQUMsWUFBWSxDQUM5RCxZQUFZLENBQUMscUJBQXNCLEVBQ25DO1FBQ0UsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixXQUFXLEVBQUUsV0FBVztRQUN4QixpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQyw4QkFBOEIsRUFBRTtRQUMzRSxlQUFlLEVBQUUsdUJBQXVCLENBQUMsNEJBQTRCLEVBQUU7UUFDdkUsZUFBZSxFQUFFLHFDQUFxQztLQUN2RCxDQUNGLENBQUM7SUFFRixNQUFNLG9CQUFvQixHQUFHLHlFQUFxQixDQUFDLFlBQVksQ0FDN0QsWUFBWSxDQUFDLG9CQUFxQixFQUNsQztRQUNFLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztRQUM1RSxPQUFPLEVBQUUsa0JBQWtCO1FBQzNCLFdBQVcsRUFBRSxXQUFXO1FBQ3hCLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLDhCQUE4QixFQUFFO1FBQzNFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyw0QkFBNEIsRUFBRTtRQUN2RSxlQUFlLEVBQUUscUNBQXFDO1FBQ3RELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7S0FDekUsQ0FDRixDQUFDO0lBRUYsWUFBWSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEYsV0FBVyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEYsTUFBTSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9FLE1BQU0sdUJBQXVCLEdBQUcsaUNBQWlDLENBQy9ELGNBQWMsRUFDZCxrQkFBa0IsQ0FDbkIsQ0FBQztJQUNGLFlBQVksSUFBSSx1QkFBdUIsQ0FBQztJQUV4QyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLDZCQUE2QixDQUM1RSxRQUFRLEVBQ1IsWUFBWSxFQUNaLFdBQVcsRUFDWCxjQUFjLEVBQ2Qsa0JBQWtCLENBQ25CLENBQUM7SUFFRixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVNLFNBQVMsaUNBQWlDLENBQUMsZ0JBQXdCLEVBQUUsU0FBb0I7SUFDOUYsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sdUJBQXVCLEdBQUcsc0ZBQXVCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNyRixNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQywwQkFBaUQsQ0FBQztJQUN0RixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixXQUFXLElBQUkscUNBQXFDLENBQUM7UUFDckQsSUFBSSxnREFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFdBQVcsSUFBSSw2QkFBNkIsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUNELFdBQVcsSUFBSSxpQ0FBaUMsZ0JBQWdCLElBQUksQ0FBQztJQUNyRSxJQUFJLHlFQUFlLENBQUMscUJBQXFCLENBQUMsNERBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7UUFDOUUsV0FBVyxJQUFJLGtDQUFrQyxDQUFDO0lBQ3BELENBQUM7U0FBTSxDQUFDO1FBQ04sV0FBVyxJQUFJLDhCQUE4QixDQUFDO0lBQ2hELENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxnRUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQXFCLENBQUM7SUFDbkYsTUFBTSxXQUFXLEdBQUcsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxRCxJQUNFLHdDQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQixXQUFXLENBQUMsV0FBVztRQUN2Qix1QkFBdUIsQ0FBQyw2QkFBNkIsRUFBRSxFQUN2RCxDQUFDO1FBQ0QsV0FBVyxJQUFJLDZCQUE2QixDQUFDO0lBQy9DLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsNERBQTREO0lBQzVELElBQUk7SUFFSixJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JDLFdBQVcsSUFBSSxpREFBaUQsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pELFdBQVcsSUFBSSxxQ0FBcUMsQ0FBQztJQUN2RCxDQUFDO1NBQU0sSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZELFdBQVcsSUFBSSxvQ0FBb0MsQ0FBQztJQUN0RCxDQUFDO1NBQU0sSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFELFdBQVcsSUFBSSx3Q0FBd0MsQ0FBQztJQUMxRCxDQUFDO1NBQU0sSUFBSSxnREFBTSxDQUFDLFlBQVksS0FBSyxtRUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZELFdBQVcsSUFBSSxvQ0FBb0MsQ0FBQztJQUN0RCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVNLFNBQVMscUNBQXFDLENBQ25ELFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLDZCQUFxQyxFQUNyQyxtQkFBMkIsRUFDM0Isa0JBQTBCO0lBRTFCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUUvQyxJQUFJLFdBQVcsR0FBRyxxQkFBcUIsUUFBUSxDQUFDLGdCQUFnQixJQUFJLENBQUM7SUFDckUsV0FBVyxJQUFJLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM3QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNsRCxLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLFdBQVcsSUFBSSxXQUFXLFlBQVksSUFBSSxDQUFDO0lBQzdDLENBQUM7SUFDRCxNQUFNLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNELFdBQVcsSUFBSSxzQkFBc0IsQ0FBQztJQUV0QyxJQUFJLGdEQUFNLENBQUMsWUFBWSxLQUFLLG1FQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakQsV0FBVyxJQUFJLHFDQUFxQyxDQUFDO0lBQ3ZELENBQUM7U0FBTSxJQUFJLGdEQUFNLENBQUMsWUFBWSxLQUFLLG1FQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkQsV0FBVyxJQUFJLG9DQUFvQyxDQUFDO0lBQ3RELENBQUM7U0FBTSxJQUFJLGdEQUFNLENBQUMsWUFBWSxLQUFLLG1FQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUQsV0FBVyxJQUFJLHdDQUF3QyxDQUFDO0lBQzFELENBQUM7U0FBTSxJQUFJLGdEQUFNLENBQUMsWUFBWSxLQUFLLG1FQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkQsV0FBVyxJQUFJLG9DQUFvQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxNQUFNLHFCQUFxQixHQUFHLHlFQUFxQixDQUFDLFlBQVksQ0FDOUQsWUFBWSxDQUFDLHFCQUFzQixFQUNuQztRQUNFLE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsV0FBVyxFQUFFLHVEQUF1RCxHQUFHLFdBQVc7UUFDbEYsZUFBZSxFQUFFLDZCQUE2QjtRQUM5QyxrQkFBa0IsRUFDaEIsRUFBRTtZQUNGLElBQUksQ0FBQyxJQUFJLENBQ1AsQ0FBQyxnREFBTSxDQUFDLGdDQUFnQyxHQUFHLGdEQUFNLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQ3BGO0tBQ0osQ0FDRixDQUFDO0lBRUYsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ25CLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdkIsU0FBUyxJQUFJLGtDQUFrQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3RCLFNBQVMsSUFBSSxpQ0FBaUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxvQkFBb0IsR0FBRyx5RUFBcUIsQ0FBQyxZQUFZLENBQzdELFlBQVksQ0FBQyxvQkFBcUIsRUFDbEM7UUFDRSxPQUFPLEVBQUUsa0JBQWtCO1FBQzNCLFdBQVcsRUFBRSxxREFBcUQsR0FBRyxXQUFXLEdBQUcsU0FBUztRQUM1RixlQUFlLEVBQUUsNkJBQTZCO1FBQzlDLGtCQUFrQixFQUNoQixFQUFFO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FDUCxDQUFDLGdEQUFNLENBQUMsZ0NBQWdDLEdBQUcsZ0RBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FDcEY7S0FDSixDQUNGLENBQUM7SUFFRixNQUFNLGtCQUFrQixHQUFHLDhEQUF1QixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDMUUsTUFBTSxpQkFBaUIsR0FBRyw4REFBdUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLDZCQUE2QixDQUN0RSxRQUFRLEVBQ1Isa0JBQWtCLENBQUMsSUFBSSxFQUN2QixpQkFBaUIsQ0FBQyxJQUFJLEVBQ3RCLEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQztJQUNGLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFNBQW9CO0lBQzVDLElBQUksc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDO0lBQ3hELEtBQUssTUFBTSxpQkFBaUIsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ25ELElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsc0JBQXNCLElBQUksMkJBQTJCLENBQUM7WUFDdEQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNELElBQUksUUFBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxzQkFBc0IsSUFBSSxpQ0FBaUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLElBQUksUUFBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUMvQyxzQkFBc0IsSUFBSSwrQkFBK0IsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sc0JBQXNCLElBQUksZ0NBQWdDLENBQUM7WUFDN0QsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9DLHNCQUFzQixJQUFJLHlCQUF5QixDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELHNCQUFzQixJQUFJLDBCQUEwQixDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELHNCQUFzQixJQUFJLDZCQUE2QixDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELHNCQUFzQixJQUFJLDZCQUE2QixDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELHNCQUFzQixJQUFJLDBCQUEwQixDQUFDO1lBQ3JELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxJQUFJLFFBQVMsQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztnQkFDOUMsc0JBQXNCLElBQUksZ0NBQWdDLENBQUM7WUFDN0QsQ0FBQztpQkFBTSxJQUFJLFFBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDL0Msc0JBQXNCLElBQUksOEJBQThCLENBQUM7WUFDM0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHNCQUFzQixJQUFJLCtCQUErQixDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxzQkFBc0IsSUFBSSwyQkFBMkIsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxzQkFBc0IsSUFBSSw0QkFBNEIsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxzQkFBc0IsSUFBSSw4QkFBOEIsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNELHNCQUFzQixJQUFJLHFDQUFxQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELHNCQUFzQixJQUFJLDZCQUE2QixDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxzQkFBc0IsSUFBSSwwQkFBMEIsQ0FBQztJQUN2RCxDQUFDO0lBRUQsc0JBQXNCLElBQUksMkJBQTJCLENBQUM7SUFDdEQsT0FBTyxzQkFBc0IsQ0FBQztBQUNoQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDelhrRjtBQUNBO0FBQ007QUFDQTtBQUNoQztBQUN3QjtBQUN0QztBQU1nQjtBQUNBO0FBQ0E7QUFDRTtBQUNBO0FBQ0o7QUFDSTtBQUNIO0FBRThCO0FBQzdDO0FBYXBDLE1BQU0scUJBQXFCO0lBQ3pCLE1BQU0sQ0FBQyxZQUFZLENBQ3hCLGVBQWdDLEVBQ2hDLElBQW9CO1FBRXBCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3pDLHNCQUFzQjtZQUN0QixrQkFBa0IsRUFBRSxrQ0FBa0MsOERBQWEsQ0FBQyxpQkFBaUIsR0FBRztZQUN4RixtQkFBbUIsRUFBRSxtQ0FBbUMsOERBQWEsQ0FBQyxrQkFBa0IsR0FBRztZQUMzRixNQUFNO1NBQ1AsQ0FBbUIsQ0FBQztRQUVyQixPQUFPLDZEQUFzQixDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sTUFBTSxDQUFDLHFCQUFxQixDQUNqQyxlQUFnQyxFQUNoQyxRQUFpQjtRQUVqQixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxtRUFBNEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sbUVBQTRCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLHNCQUFzQixDQUFDLGVBQWdDO1FBQ25FLE1BQU0sVUFBVSxHQUFHLHVFQUFnQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsRCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFckIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDaEUsT0FBTyx5RUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDM0QsT0FBTyx5RUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekQsT0FBTyxxRUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxLQUFLO1lBQ0wsU0FBUztZQUNULFlBQVk7WUFDWixVQUFVO1NBQ1gsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsVUFBc0I7UUFDcEUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdEQscUJBQXFCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFcEUsVUFBVSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLE1BQU0sQ0FBQyx1QkFBdUIsQ0FDbkMsZUFBZ0MsRUFDaEMscUJBQXFFO1FBS3JFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1FBRXBDLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsTUFBTSxHQUFHLEdBQUcscUVBQXFFLENBQUM7WUFDbEYsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRS9DLElBQUksdUJBQXVCLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFeEMsSUFBSSxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDOUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNuQyxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQzFELElBQUksRUFDSixZQUFZLEVBQ1osSUFBSSxFQUNKLGVBQWUsQ0FBQyxnQkFBZ0IsRUFDaEMscUJBQXFCLENBQ3RCLENBQUM7Z0JBRUYsd0JBQXdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDckQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUVELHFCQUFxQixDQUFDLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakUsT0FBTztZQUNMLHdCQUF3QixFQUFFLHdCQUF3QjtZQUNsRCxlQUFlLEVBQUUscUJBQXFCO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQW9CO1FBQ3ZELE1BQU0sU0FBUyxHQUFvQjtZQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLFdBQVcsS0FBSyxVQUFVO1NBQ2pELENBQUM7UUFFRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sTUFBTSxDQUFDLDhCQUE4QixDQUFDLElBQVk7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksWUFBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFHLENBQUMsQ0FBQyxNQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLE1BQU0sQ0FBQywyQkFBMkIsQ0FDeEMsSUFBWSxFQUNaLFlBQW9CLEVBQ3BCLElBQVksRUFDWixnQkFBeUIsRUFDekIscUJBQXFFO1FBRXJFLE1BQU0sYUFBYSxHQUFHLHFFQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sZUFBZSxHQUFHLHlFQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnRUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0VBQVUsQ0FBQyxZQUFZLENBQUM7UUFFbEYsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxZQUFZLEdBQUcsY0FBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sbUJBQW1CLEdBQXdCO1lBQy9DLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLGVBQWU7WUFDZixhQUFhO1lBQ2IsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQ3JCLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsS0FBSztTQUNOLENBQUM7UUFFRixJQUFJLENBQUMsa0NBQWtDLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbkUsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTSxDQUFDLGtDQUFrQyxDQUMvQyxtQkFBd0MsRUFDeEMsSUFBWTtRQUVaLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNuRSxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxVQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUcsQ0FBQyxDQUFDLE1BQUssTUFBTSxFQUFFLENBQUM7WUFDOUIsY0FBYyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO1FBQ0QsbUJBQW1CLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUUvQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNuRixJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLGtCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFHLENBQUMsQ0FBQyxNQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBQ0QsbUJBQW1CLENBQUMsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7UUFFN0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3hFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDL0QsbUJBQW1CLEVBQ25CLGdCQUFnQixDQUNqQixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixtQkFBbUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDN0Msc0RBQXNELENBQ3ZELENBQUM7UUFDRixJQUFJLDRCQUE0QixFQUFFLENBQUM7WUFDakMsSUFBSSwrQkFBK0IsR0FBRyxLQUFLLENBQUM7WUFDNUMsSUFBSSw2QkFBNEIsYUFBNUIsNEJBQTRCLHVCQUE1Qiw0QkFBNEIsQ0FBRyxDQUFDLENBQUMsTUFBSyxNQUFNLEVBQUUsQ0FBQztnQkFDakQsK0JBQStCLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLENBQUM7WUFDRCxtQkFBbUIsQ0FBQyw0QkFBNEIsR0FBRywrQkFBK0IsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDdEMsbUJBQXdDLEVBQ3hDLGdCQUF3QjtRQUV4QixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN6RCxNQUFNLHNCQUFzQixHQUFHLENBQUMsUUFBNkIsRUFBRSxFQUFFO1lBQy9ELElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyRCxpREFBTSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxZQUFZLENBQUM7UUFDakIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLFFBQVEsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyQixLQUFLLENBQUM7b0JBQ0osc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7d0JBQ3hCLFlBQVksR0FBRyxJQUFJLCtEQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFELENBQUM7eUJBQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7d0JBQ2hDLFlBQVksR0FBRyxJQUFJLCtEQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFELENBQUM7eUJBQU0sQ0FBQzt3QkFDTixZQUFZLEdBQUcsSUFBSSwrREFBYSxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3RSxDQUFDO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLElBQ0UsbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsU0FBUzt3QkFDakUsbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsZUFBZSxFQUN2RSxDQUFDO3dCQUNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbkUsWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFHLDREQUF1QixDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUN4RixDQUFDO3lCQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQy9FLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbkUsWUFBWSxHQUFHOzRCQUNiLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2pCLDREQUF1QixDQUFDLFFBQVEsS0FBSyxhQUFhLENBQUM7eUJBQ3JELENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLHNCQUFzQixDQUFDLHlFQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdDLFlBQVksR0FBRyxnRUFBYyxDQUFDLGFBQWEsQ0FBQzs0QkFDMUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDckIsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsWUFBWSxHQUFHLGdFQUFjLENBQUMsYUFBYSxDQUFDO3dCQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyQixDQUFDLENBQUM7b0JBQ0gsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsWUFBWSxHQUFHLGdFQUFjLENBQUMsYUFBYSxDQUFDO3dCQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyQixDQUFDLENBQUM7b0JBQ0gsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsWUFBWSxHQUFHLG1FQUFlLENBQUMsaUJBQWlCLENBQzlDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JCLENBQUM7b0JBQ0YsTUFBTTtnQkFDUixLQUFLLEVBQUU7b0JBQ0wsc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsWUFBWSxHQUFHLG1FQUFlLENBQUMsa0JBQWtCLENBQy9DLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNyQixVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3JCLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDckIsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNyQixVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3JCLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdEIsQ0FBQztvQkFDRixNQUFNO2dCQUNSO29CQUNFLGlEQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQyxJQUFJLGdCQUFnQixLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxZQUFZLEdBQUcsSUFBSSwrREFBYSxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELENBQUM7aUJBQU0sSUFBSSxnQkFBZ0IsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEMsWUFBWSxHQUFHLElBQUksK0RBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxHQUFHLElBQUksK0RBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBd0M7UUFDOUUsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRSxPQUFPLElBQUksK0RBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPLGdFQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEUsT0FBTyxnRUFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hFLE9BQU8sZ0VBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPLG1FQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEMsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEUsT0FBTyxtRUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hFLE9BQU8sbUVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3RSxPQUFPLENBQUMsQ0FBQyxFQUFFLDhEQUFpQixDQUFDLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkYsT0FBTyxDQUFDLENBQUMsRUFBRSw4REFBaUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9FLE9BQU8sQ0FBQyxDQUFDLEVBQUUsOERBQWlCLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsaURBQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMxQyxPQUFPO0lBQ1QsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclhrRjtBQUNBO0FBQ007QUFHUjtBQUN0QztBQU1nQjtBQUNBO0FBQ0E7QUFDRTtBQUNBO0FBQ0o7QUFDSTtBQUNIO0FBRThCO0FBQ25DO0FBQ0o7QUFDTjtBQWVwQyxNQUFNLHNCQUFzQjtJQUMxQixNQUFNLENBQUMsWUFBWSxDQUN4QixlQUFnQyxFQUNoQyxJQUFvQjtRQUVwQixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUN6QyxzQkFBc0I7WUFDdEIsTUFBTTtTQUNQLENBQW1CLENBQUM7UUFFckIsT0FBTyw2REFBc0IsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLE1BQU0sQ0FBQyx1QkFBdUIsQ0FDbkMsZUFBZ0MsRUFDaEMscUJBQXFFO1FBS3JFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFnQyxDQUFDO1FBRTNELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1FBRXBDLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsTUFBTSxHQUFHLEdBQ1Asa0ZBQWtGLENBQUM7WUFDckYsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRS9DLE1BQU0sR0FBRyxHQUNQLHNHQUFzRyxDQUFDO1lBQ3pHLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLE9BQU8sR0FDWCwrRUFBK0UsQ0FBQztZQUNsRixNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbkQsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDMUQsSUFBSSxFQUNKLFlBQVksRUFDWixJQUFJLEVBQ0osZUFBZSxDQUFDLGdCQUFnQixFQUNoQyxxQkFBcUIsQ0FDdEIsQ0FBQztnQkFFRix3QkFBd0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyRCxDQUFDO2lCQUFNLElBQUksdUJBQXVCLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXhDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG9DQUFvQyxDQUNuRSxJQUFJLEVBQ0osWUFBWSxFQUNaLE9BQU8sRUFDUCxJQUFJLEVBQ0osZUFBZSxDQUFDLGdCQUFnQixFQUNoQyxxQkFBcUIsQ0FDdEIsQ0FBQztnQkFFRixVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUU3Qyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyRCxDQUFDO2lCQUFNLElBQUksdUJBQXVCLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSwwQkFBMEIsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzRCxJQUFJLDBCQUEwQixFQUFFLENBQUM7d0JBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksdURBQU8sQ0FBQzs0QkFDMUIsU0FBUyxFQUFFLDJEQUFnQixDQUFDLE1BQU07NEJBQ2xDLFNBQVMsRUFBRSwyREFBZ0IsQ0FBQyxNQUFNOzRCQUNsQyxLQUFLLEVBQUUsMkRBQWdCLENBQUMsTUFBTTs0QkFDOUIsS0FBSyxFQUFFLDJEQUFnQixDQUFDLE1BQU07NEJBQzlCLEtBQUssRUFBRSwyREFBZ0IsQ0FBQyxNQUFNOzRCQUM5QixVQUFVLEVBQUUsS0FBSzt5QkFDbEIsQ0FBQyxDQUFDO3dCQUNILDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ3ZELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixZQUFZO2dCQUNaLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUVELHFCQUFxQixDQUFDLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakUsT0FBTztZQUNMLHdCQUF3QixFQUFFLHdCQUF3QjtZQUNsRCxlQUFlLEVBQUUscUJBQXFCO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRU8sTUFBTSxDQUFDLG9DQUFvQyxDQUNqRCxJQUFZLEVBQ1osWUFBb0IsRUFDcEIsT0FBZSxFQUNmLElBQVksRUFDWixnQkFBeUIsRUFDekIscUJBQXFFO1FBRXJFLE1BQU0sYUFBYSxHQUFHLHFFQUFhLENBQUMsR0FBRyxDQUFDO1FBQ3hDLElBQUksZUFBZSxHQUF3Qix5RUFBZSxDQUFDLFNBQVMsQ0FBQztRQUNyRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxlQUFlLEdBQUcseUVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9DLGVBQWUsR0FBRyx5RUFBZSxDQUFDLFdBQVcsQ0FBQztRQUNoRCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdFQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnRUFBVSxDQUFDLFlBQVksQ0FBQztRQUVsRixNQUFNLG1CQUFtQixHQUF3QjtZQUMvQyxRQUFRLEVBQUUsWUFBWTtZQUN0QixlQUFlO1lBQ2YsYUFBYTtZQUNiLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztZQUNyQixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLEtBQUs7U0FDTixDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3hFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQ0FBbUMsQ0FDekUsbUJBQW1CLEVBQ25CLE9BQU8sRUFDUCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sbUJBQW1CLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRCxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFTyxNQUFNLENBQUMsMkJBQTJCLENBQ3hDLElBQVksRUFDWixZQUFvQixFQUNwQixJQUFZLEVBQ1osZ0JBQXlCLEVBQ3pCLHFCQUFxRTtRQUVyRSxNQUFNLGFBQWEsR0FBRyxxRUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyx5RUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0VBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGdFQUFVLENBQUMsWUFBWSxDQUFDO1FBRWxGLE1BQU0sbUJBQW1CLEdBQXdCO1lBQy9DLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLGVBQWU7WUFDZixhQUFhO1lBQ2IsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDdEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQ3JCLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsS0FBSztTQUNOLENBQUM7UUFFRixJQUFJLENBQUMsa0NBQWtDLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbkUsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTSxDQUFDLGtDQUFrQyxDQUMvQyxtQkFBd0MsRUFDeEMsSUFBWTtRQUVaLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNuRSxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxVQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUcsQ0FBQyxDQUFDLE1BQUssTUFBTSxFQUFFLENBQUM7WUFDOUIsY0FBYyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO1FBQ0QsbUJBQW1CLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUUvQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNuRixJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLGtCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFHLENBQUMsQ0FBQyxNQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBQ0QsbUJBQW1CLENBQUMsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7UUFFN0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3hFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDL0QsbUJBQW1CLEVBQ25CLGdCQUFnQixDQUNqQixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixtQkFBbUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDN0Msc0RBQXNELENBQ3ZELENBQUM7UUFDRixJQUFJLDRCQUE0QixFQUFFLENBQUM7WUFDakMsSUFBSSwrQkFBK0IsR0FBRyxLQUFLLENBQUM7WUFDNUMsSUFBSSw2QkFBNEIsYUFBNUIsNEJBQTRCLHVCQUE1Qiw0QkFBNEIsQ0FBRyxDQUFDLENBQUMsTUFBSyxNQUFNLEVBQUUsQ0FBQztnQkFDakQsK0JBQStCLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLENBQUM7WUFDRCxtQkFBbUIsQ0FBQyw0QkFBNEIsR0FBRywrQkFBK0IsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FDaEQsbUJBQXdDLEVBQ3hDLE9BQWUsRUFDZixnQkFBd0I7UUFFeEIsSUFBSSxZQUFZLENBQUM7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSx1REFBTyxDQUFDO1lBQzFCLFNBQVMsRUFBRSwyREFBZ0IsQ0FBQyxNQUFNO1lBQ2xDLFNBQVMsRUFBRSwyREFBZ0IsQ0FBQyxNQUFNO1lBQ2xDLEtBQUssRUFBRSwyREFBZ0IsQ0FBQyxXQUFXO1lBQ25DLEtBQUssRUFBRSwyREFBZ0IsQ0FBQyxXQUFXO1lBQ25DLEtBQUssRUFBRSwyREFBZ0IsQ0FBQyxXQUFXO1lBQ25DLFVBQVUsRUFBRSxLQUFLO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQ0UsbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsU0FBUztZQUNqRSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxlQUFlLEVBQ3ZFLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLFlBQVksR0FBRyxDQUFDLE9BQU8sRUFBRyw0REFBdUIsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEYsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0UsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRixZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUcsNERBQXVCLENBQUMsUUFBUSxLQUFLLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sTUFBTSxDQUFDLHlCQUF5QixDQUN0QyxtQkFBd0MsRUFDeEMsZ0JBQXdCO1FBRXhCLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUE2QixFQUFFLEVBQUU7WUFDL0QsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JELGlEQUFNLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlGLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLFlBQVksQ0FBQztRQUNqQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3JCLEtBQUssQ0FBQztvQkFDSixzQkFBc0IsQ0FBQyx5RUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMvQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDeEIsWUFBWSxHQUFHLElBQUksK0RBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUQsQ0FBQzt5QkFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDaEMsWUFBWSxHQUFHLElBQUksK0RBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFlBQVksR0FBRyxJQUFJLCtEQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdFLENBQUM7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osc0JBQXNCLENBQUMseUVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsWUFBWSxHQUFHLGdFQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFGLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLHNCQUFzQixDQUFDLHlFQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLFlBQVksR0FBRyxnRUFBYyxDQUFDLGFBQWEsQ0FBQzt3QkFDMUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDckIsQ0FBQyxDQUFDO29CQUNILE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLHNCQUFzQixDQUFDLHlFQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLFlBQVksR0FBRyxnRUFBYyxDQUFDLGFBQWEsQ0FBQzt3QkFDMUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDckIsQ0FBQyxDQUFDO29CQUNILE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLHNCQUFzQixDQUFDLHlFQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLFlBQVksR0FBRyxrRUFBZSxDQUFDLGlCQUFpQixDQUM5QyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyQixDQUFDO29CQUNGLE1BQU07Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLHNCQUFzQixDQUFDLHlFQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLFlBQVksR0FBRyxrRUFBZSxDQUFDLGtCQUFrQixDQUMvQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BCLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDckIsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNyQixVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3JCLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDckIsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNyQixVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3RCLENBQUM7b0JBQ0YsTUFBTTtnQkFDUjtvQkFDRSxpREFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLHNCQUFzQixDQUFDLHlFQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsSUFBSSxnQkFBZ0IsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsWUFBWSxHQUFHLElBQUksK0RBQWEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO2lCQUFNLElBQUksZ0JBQWdCLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3hDLFlBQVksR0FBRyxJQUFJLCtEQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksR0FBRyxJQUFJLCtEQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsbUJBQXdDO1FBQzlFLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkUsT0FBTyxJQUFJLCtEQUFhLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEUsT0FBTyxnRUFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hFLE9BQU8sZ0VBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPLGdFQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEUsT0FBTyxtRUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hFLE9BQU8sa0VBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPLGtFQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEMsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0UsT0FBTyxDQUFDLENBQUMsRUFBRSw4REFBaUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLG1CQUFtQixDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25GLE9BQU8sQ0FBQyxDQUFDLEVBQUUsOERBQWlCLENBQUMsQ0FBQztRQUNoQyxDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvRSxPQUFPLENBQUMsQ0FBQyxFQUFFLDhEQUFpQixDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELGlEQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDMUMsT0FBTztJQUNULENBQUM7SUFFTyxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBb0I7UUFDdkQsTUFBTSxTQUFTLEdBQW9CO1lBQ2pDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztZQUM1QixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsV0FBVyxLQUFLLFVBQVU7U0FDakQsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7OztBQzNaTSxNQUFNLE1BQU07SUFLakIsWUFDa0IsSUFBVSxFQUNWLGVBQWtCLEVBQ2xCLGFBQWdCO1FBRmhCLFNBQUksR0FBSixJQUFJLENBQU07UUFDVixvQkFBZSxHQUFmLGVBQWUsQ0FBRztRQUNsQixrQkFBYSxHQUFiLGFBQWEsQ0FBRztJQUMvQixDQUFDO0NBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYnlDO0FBQ0w7QUFDVjtBQUNVO0FBQ0w7QUFDTTtBQUNFO0FBQ1I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQSDtBQUNDO0FBQ0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0YrQjtBQUN5QjtBQUNOO0FBQ0U7QUFDQztBQUM5QztBQUM0QjtBQUNiO0FBRWhELE1BQU0sYUFBYyxTQUFRLHdFQUFrQjtJQUNuRCxZQUFZLGVBQW9DLEVBQUUsYUFBZ0M7UUFDaEYsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNYLFFBQVEsRUFBRSwrRUFBc0IsQ0FBQyxJQUFJO1lBQ3JDLFFBQVEsRUFBRSxnRkFBc0IsQ0FBQyxJQUFJO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksZ0RBQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxnREFBTSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLGdEQUFNLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsK0JBQStCO1FBQzdCLElBQUksNERBQVcsQ0FBQyxzQkFBc0IsS0FBSyx5RUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLElBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxNQUFNO2dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLE1BQU0sRUFDM0QsQ0FBQztnQkFDRCxJQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLHFFQUFhLENBQUMsS0FBSztvQkFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUsscUVBQWEsQ0FBQyxLQUFLLEVBQ3RELENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxDQUFDO2dCQUM5QyxDQUFDO3FCQUFNLElBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUsscUVBQWEsQ0FBQyxHQUFHO29CQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSyxxRUFBYSxDQUFDLEdBQUcsRUFDcEQsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUM7Z0JBQzlDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUksRUFDekQsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7WUFDbEQsQ0FBQztpQkFBTSxJQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSTtnQkFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJLEVBQ3pELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsWUFBWSxDQUFDO1lBQ2xELENBQUM7aUJBQU0sSUFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUk7Z0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSSxFQUN6RCxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixHQUFHLFlBQVksQ0FBQztZQUNsRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFFbUU7QUFDSjtBQUM0QztBQUNNO0FBQ2xEO0FBRXpELE1BQU0sd0JBQXlCLFNBQVEsd0VBQWtCO0lBQzlEO1FBQ0UsS0FBSyxDQUFDLGdCQUFnQixFQUFFO1lBQ3RCLFFBQVEsRUFBRSwwRkFBa0MsQ0FBQyxJQUFJO1lBQ2pELFFBQVEsRUFBRSxnR0FBa0MsQ0FBQyxJQUFJO1NBQ2xELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtZQUNyQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJtRTtBQUNKO0FBQzZDO0FBQ007QUFDbkQ7QUFFekQsTUFBTSx5QkFBMEIsU0FBUSx3RUFBa0I7SUFDL0Q7UUFDRSxLQUFLLENBQUMsaUJBQWlCLEVBQUU7WUFDdkIsUUFBUSxFQUFFLDJGQUFrQyxDQUFDLElBQUk7WUFDakQsUUFBUSxFQUFFLGlHQUFrQyxDQUFDLElBQUk7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLFVBQVU7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJtRTtBQUNKO0FBQ2lEO0FBQ007QUFDdkQ7QUFDeEI7QUFFakMsTUFBTSwyQkFBNEIsU0FBUSx3RUFBa0I7SUFDakU7UUFDRSxLQUFLLENBQUMsbUJBQW1CLEVBQUU7WUFDekIsUUFBUSxFQUFFLDZGQUFvQyxDQUFDLElBQUk7WUFDbkQsUUFBUSxFQUFFLG1HQUFvQyxDQUFDLElBQUk7U0FDcEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLGdEQUFNLENBQUMsVUFBVSxFQUFFLHlFQUFlLENBQUMsSUFBSSxFQUFFLHFFQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCbUU7QUFDSjtBQUNpRDtBQUNNO0FBQ3ZEO0FBRXpELE1BQU0sMkJBQTRCLFNBQVEsd0VBQWtCO0lBQ2pFO1FBQ0UsS0FBSyxDQUFDLG1CQUFtQixFQUFFO1lBQ3pCLFFBQVEsRUFBRSw2RkFBb0MsQ0FBQyxJQUFJO1lBQ25ELFFBQVEsRUFBRSxtR0FBb0MsQ0FBQyxJQUFJO1NBQ3BELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsZUFBZSxFQUFFLHlFQUFlLENBQUMsSUFBSTtZQUNyQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQndGO0FBQ047QUFDRjtBQUNIO0FBRXZFLE1BQU0sb0JBQXFCLFNBQVEsd0VBQWtCO0lBRzFEO1FBQ0UsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhsQixrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFDbkMsbUJBQWMsR0FBbUIsRUFBRSxDQUFDO1FBSTFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUV4RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksbUZBQWdCLENBQ3RDLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FDcEIsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE1BQU07WUFDdkMsYUFBYSxFQUFFLHFFQUFhLENBQUMsSUFBSTtZQUNqQyxJQUFJLEVBQUUsWUFBWTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsZUFBb0MsRUFBRSxhQUFnQztRQUN0RixNQUFNLEtBQUssR0FBRztZQUNaLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLGFBQWEsRUFBRSxhQUFhO1lBQzVCLElBQUksRUFBRSxTQUFTLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1NBQzNDLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRztZQUNiLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLGFBQWEsRUFBRSxhQUFhO1lBQzVCLElBQUksRUFBRSxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1NBQy9DLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hDK0Q7QUFDYTtBQUV0RSxNQUFNLGtCQUFtQixTQUFRLHdFQUFrQjtJQUN4RDtRQUNFLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdEIsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRXhELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSwrRUFBYyxDQUNwQyxJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQixDQUFDLGVBQW9DLEVBQUUsYUFBZ0M7UUFDdEYsTUFBTSxLQUFLLEdBQUc7WUFDWixlQUFlLEVBQUUsZUFBZTtZQUNoQyxhQUFhLEVBQUUsYUFBYTtZQUM1QixJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtTQUN0QyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUc7WUFDYixlQUFlLEVBQUUsZUFBZTtZQUNoQyxhQUFhLEVBQUUsYUFBYTtZQUM1QixJQUFJLEVBQUUsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtTQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvQm1EO0FBR3NCO0FBRW5FLE1BQU0sZ0NBRVgsU0FBUSxtRkFBNEQ7SUFDcEUsWUFBWSxhQUFnQjtRQUMxQixLQUFLLENBQUMsZ0JBQWdCLEVBQUUseURBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWM7UUFDaEMsSUFBSSxDQUFDLFlBQXVDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZDRGO0FBQzdCO0FBRXhCO0FBRWpDLE1BQWUsMEJBR3BCLFNBQVEsd0VBQWtCO0lBQzFCLFlBQVksUUFBZ0IsRUFBRSxlQUFrQixFQUFFLGFBQWdCO1FBQ2hFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFcEIsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRXhELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSwrRkFBc0IsQ0FDNUMsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixlQUFlLEVBQ2YsYUFBYSxDQUNkLENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLGdEQUFNLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFjO1FBQ2hDLElBQUksQ0FBQyxZQUF1QyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0JtRDtBQUdzQjtBQUVuRSxNQUFNLGlDQUVYLFNBQVEsbUZBQTBEO0lBQ2xFLFlBQVksYUFBZ0I7UUFDMUIsS0FBSyxDQUFDLGlCQUFpQixFQUFFLHlEQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFlO1FBQ2pDLElBQUksQ0FBQyxZQUF1QyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZm1EO0FBR3NCO0FBRW5FLE1BQU0saUNBRVgsU0FBUSxtRkFBMEQ7SUFDbEUsWUFBWSxhQUFnQjtRQUMxQixLQUFLLENBQUMsaUJBQWlCLEVBQUUseURBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWU7UUFDakMsSUFBSSxDQUFDLFlBQXVDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmbUQ7QUFHc0I7QUFFbkUsTUFBTSxpQ0FFWCxTQUFRLG1GQUEwRDtJQUNsRSxZQUFZLGFBQWdCO1FBQzFCLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSx5REFBZSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBZTtRQUNqQyxJQUFJLENBQUMsWUFBdUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEJrRztBQUNDO0FBR3BDO0FBQ0k7QUFDSjtBQUNUO0FBQ2E7QUFFN0QsTUFBTSxvQkFBcUIsU0FBUSx3RUFBa0I7SUFDMUQsWUFBWSxlQUFvQyxFQUFFLGFBQWdDO1FBQ2hGLEtBQUssQ0FBQyxZQUFZLEVBQUU7WUFDbEIsUUFBUSxFQUFFLHNGQUE2QixDQUFDLElBQUk7WUFDNUMsUUFBUSxFQUFFLHVGQUE2QixDQUFDLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakIsZUFBZSxFQUFFLGVBQWU7WUFDaEMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUsZUFBZTtZQUNoQyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxLQUFLO1lBQ2xDLElBQUksRUFBRSxLQUFLO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxhQUFhLEVBQUUsYUFBYTtZQUM1QixJQUFJLEVBQUUsVUFBVTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsK0JBQStCO1FBQzdCLElBQUksNERBQVcsQ0FBQyxzQkFBc0IsS0FBSyx5RUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUsseUVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyx5RUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxLQUFLLHlFQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztZQUM3QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakQrRDtBQUN5QjtBQUNOO0FBQ007QUFFbEYsTUFBTSxpQkFBa0IsU0FBUSx3RUFBa0I7SUFDdkQsWUFBWSxlQUFvQyxFQUFFLGFBQWdDO1FBQ2hGLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDZixRQUFRLEVBQUUsbUZBQXNCLENBQUMsSUFBSTtTQUN0QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUsZUFBZTtZQUNoQyxhQUFhLEVBQUUsYUFBYTtZQUM1QixJQUFJLEVBQUUsS0FBSztTQUNaLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pCLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLElBQUk7WUFDakMsSUFBSSxFQUFFLFVBQVU7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCbUU7QUFDSjtBQUNtQjtBQUNuQjtBQUV6RCxNQUFNLHFCQUFzQixTQUFRLHdFQUFrQjtJQUMzRDtRQUNFLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDbkIsVUFBVSxFQUFFLElBQUkscUZBQWlCLEVBQUU7U0FDcEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakIsZUFBZSxFQUFFLHlFQUFlLENBQUMsTUFBTTtZQUN2QyxhQUFhLEVBQUUscUVBQWEsQ0FBQyxJQUFJO1lBQ2pDLElBQUksRUFBRSxXQUFXO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLGVBQWUsRUFBRSx5RUFBZSxDQUFDLE9BQU87WUFDeEMsYUFBYSxFQUFFLHFFQUFhLENBQUMsT0FBTztZQUNwQyxJQUFJLEVBQUUsU0FBUztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEIrRDtBQUNJO0FBQ0o7QUFDcUM7QUFDQztBQUMvQztBQUNhO0FBRTdELE1BQU0scUJBQXNCLFNBQVEsd0VBQWtCO0lBQzNEO1FBQ0UsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUNuQixRQUFRLEVBQUUsdUZBQThCLENBQUMsSUFBSTtZQUM3QyxRQUFRLEVBQUUsd0ZBQThCLENBQUMsSUFBSTtTQUM5QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEdBQUc7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEdBQUc7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEdBQUc7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEdBQUc7U0FDVixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLE1BQU07U0FDYixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7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Q0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLE1BQU07U0FDYixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNqQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxJQUFJO1lBQ3JDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixlQUFlLEVBQUUseUVBQWUsQ0FBQyxNQUFNO1lBQ3ZDLGFBQWEsRUFBRSxxRUFBYSxDQUFDLEtBQUs7WUFDbEMsSUFBSSxFQUFFLEdBQUc7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LENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVqRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUM7UUFFMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFekIsT0FBTyxLQUFLLENB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LE1BQU0sQ0FBQyxPQUFPO1FBQ3BELElBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSztZQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7WUFDekIsSUFB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QUFZLCtDQUFRLEVBQ3BDLENBQUM7WUFDRCxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxnQkFBZ0IsQ0FB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QzVDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDL0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztJQUUxQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDL0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztJQUMxQixPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxDQUFTO0lBQ3BCLHFCQUFxQjtJQUNyQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhCLHFCQUFxQjtJQUNyQixNQUFNLENBQUMsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxHQUNMLENBQUM7UUFDRCxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FB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QUMsQ0FBQzt3QkFDZixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLENBQUM7b0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDL0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEMsQ0FBQztvQkFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcs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LENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDckMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFNUIsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBYztRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQVk7UUFDdkIsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWUsRUFBRSxLQUFlO1FBQzlDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbEUsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFlLEVBQUUsS0FBZSxFQUFFLE1BQXVCO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFD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QUFxQixFQUFFLENBQUM7WUFDOUIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsZ0RBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFbEUsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFjLEVBQUUsTUFBdUI7UUFDckQsSUFBSSxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLGdEQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRWxFLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QixpQkFBaUI7UUFDakIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2xCLGlCQUFpQjtRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBRWpCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztRQUNqQixpQkFBaUI7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsaUJBQWlCO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2xCLGlCQUFpQjtRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFFakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2xCLGlCQUFpQjtRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUVqQiw0REFBNEQ7UUFDNUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QixpQkFBaUI7UUFDakIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNqQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7UUFDakIsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRXZCLDRGQUE0RjtRQUM1RixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBRWpCLE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBWTtRQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQWE7UUFDeEIsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWdCLEVBQUUsS0FBZ0I7UUFDaEQsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFnQixFQUFFLEtBQWdCLEVBQUUsTUFBdUI7UUFDM0UsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdkMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sQ0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLEdBQUc7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLEdBQUc7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUk7WUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLEdBQUc7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLEdBQUc7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUk7WUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLEdBQUc7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLEdBQUc7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUVELHFCQUFxQjtRQUNuQixPQUFPLENBQ0wsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHO1lBQ0gsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHO1lBQ0gsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJO1lBQ0osK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHO1lBQ0gsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHO1lBQ0gsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixLQUFLO1lBQ0wsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHO1lBQ0gsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHO1lBQ0gsK0NBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTztZQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNYLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsR0FBYyxFQUFFLFFBQWdCLE1BQU0sQ0FBQyxPQUFPO1FBQ3BELElBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztZQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztZQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztZQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFDeEMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWE7UUFDekIsSUFDRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUN4QixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxFQUFFLENBQUMsS0FBYSxFQUFFLFFBQWdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxDQUFDLENBQUMsQ0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sQ0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFhO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sSUFBSyxHQUFHLENBQUMsV0FBbUIsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFhLEVBQUUsTUFBdUI7UUFDckQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLDZDQUFPLENBQUMsYUFBYSxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBc0I7UUFDL0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENB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QU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxF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QUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlELE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2xGLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsZ0RBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUV6RSxPQUFPLFFBQVEsQ0FBQyxrQkFBa0IsQ0FDaEMsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFjLEVBQUUsTUFBdUI7UUFDckQsSUFBSSxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlELE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2xGLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsZ0RBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hFLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FB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LENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFOUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEYsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVoRixPQUFPLFFBQVEsQ0FBQyxrQkFBa0IsQ0FDaEMsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWdCLEVBQUUsS0FBZ0IsRUFBRSxNQUF1QjtRQUMzRSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN2QyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFJLEtBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFJLEtBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0UsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFaEYsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUN6QixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLENBQ0osQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQ3pCLEtBQWdCLEVBQ2hCLE9BQWtCLEVBQ2xCLE1BQXVCLEVBQ3ZCLG1CQUEyQjtRQUUxQixPQUFlLENBQUMsOEZBQThDLENBQUMsQ0FDOUQsbUJBQW1CLEVBQ25CLEtBQUssQ0FBQyxFQUFFLEVBQ1IsQ0FBQyxFQUNELE1BQU0sQ0FBQyxFQUFFLENBQ1YsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBaUIsRUFBRSxNQUF1QjtRQUNoRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNkLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFZCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQ3pCLEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLENBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxLQUFLO1lBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxLQUFLO1lBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxLQUFLO1lBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxHQUFHO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUNMLCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsS0FBSztZQUNMLCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsS0FBSztZQUNMLCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsS0FBSztZQUNMLCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU87WUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNaLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsR0FBYyxFQUFFLFFBQWdCLE1BQU0sQ0FBQyxPQUFPO1FBQ3BELE1BQU0sQ0FBQyxHQUFJLEdBQWdCLENBQUMsRUFBRSxDQUFDO1FBQy9CLElBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxF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QyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBYTtRQUMxQixNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUIsT0FBTyw2Q0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQWEsRUFBRSxNQUFzQjtRQUNwRCxNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELG9CQUFvQixDQUFDLEdBQWEsRUFBRSxNQUFzQjtRQUN4RCxNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsZUFBZSxDQUFDLEdBQWE7UUFDM0IsTUFBTSxDQUFDLEdBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztRQUMxSCxNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sQ0FBQyxHQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFMUYsT0FBTyw2Q0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBYSxFQUFFLE1BQXNCO1FBQ3JELE1BQU0sQ0FBQyxHQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDMUgsTUFBTSxDQUFDLEdBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RixNQUFNLENBQUMsR0FDTCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FB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QUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sR0FBRyw2Q0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDL0IsTUFBTSxHQUFHLDZDQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLDZDQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENB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LEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1osT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FDMUIsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVztRQUVYLE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWixPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBYTtRQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxZQUEwQjtRQUMzRCxPQUFPLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxNQUFNLENBQUMsK0JBQStCLENBQUMsWUFBMEI7UUFDL0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQixPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsNEJBQTRCLENBQUMsS0FBbUI7UUFDckQsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBYztRQUNwQyxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEtBQXNCO1FBQ3RELE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBb0I7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNiLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFzQjtRQUNuRCxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFvQjtRQUMvQyxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFjO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxFQUFF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QyxHQUFhO1FBQzFCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUN6RSxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQzVFLE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDWCxPQUFPLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLENBQUMsMkJBQTJCLENBQUMsWUFBMEI7UUFDM0QsT0FBTyxJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsTUFBTSxDQUFDLCtCQUErQixDQUFDLFlBQTBCO1FBQy9ELE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEIsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEtBQW1CO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEIsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQWM7UUFDcEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEtBQXFCO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixPQUFPLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBb0I7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNiLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFxQjtRQUNqRCxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFvQjtRQUMvQyxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvU3FDO0FBS0U7QUFFeEMsc0NBQXNDO0FBQy9CLE1BQU0sZUFBZ0IsU0FBUSwrQ0FBUTtJQUMzQyxZQUFZLENBQWU7UUFDekIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLElBQUk7UUFDVCxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQXFCLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVE7UUFDYixPQUFPLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSztRQUNWLE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBcUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQWM7UUFDN0IsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBb0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQWM7UUFDMUIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBb0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDM0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBb0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDM0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBb0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDM0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBb0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDOUMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFvQixDQUFDO0lBQ3JELENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQWE7UUFDekIsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFvQixDQUFDO0lBQzdFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBYTtRQUN4QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFvQixDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBZ0IsRUFBRSxLQUFnQjtRQUNoRCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBb0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSztRQUNILE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQXFCLENBQUM7UUFDaEQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELEdBQUc7UUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxLQUFhO1FBQ2xELElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYSxDQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVyxFQUNYLEdBQVcsRUFDWCxHQUFXLEVBQ1gsR0FBVztRQUVYLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRWpCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUEwQjtRQUN2QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLDRCQUE0QjtRQUNsRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUVyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBUSxFQUFFLENBQVE7UUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsZ0RBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdEUs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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBWTtRQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFhO1FBQ3BCLElBQUksR0FBRyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFhO1FBQzFCLElBQUksR0FBRyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsT0FB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QUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQW9CO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFjO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRTdCLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3a0JxQztBQU9FO0FBRXhDLHNDQUFzQztBQUN0QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFHekIsTUFBTSxlQUFnQixTQUFRLCtDQUFRO0lBQzNDLFlBQVksQ0FBYTtRQUN2QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLEdBQUcsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsR0FBRyxDQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxHQUFHLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFVBQVUsQ0FBQyxHQUFXO1FBQy9CLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFVBQVUsQ0FBQyxHQUFXO1FBQy9CLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFVBQVUsQ0FBQyxHQUFXO1FBQy9CLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFJO1FBQ1QsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVE7UUFDYixPQUFPLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUs7UUFDVixPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQXFCLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFhO1FBQzVCLElBQUksR0FBRyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDOUIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBYTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFvQixDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBWTtRQUMzQixPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFvQixDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFvQixDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFvQixDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFvQixDQUFD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QyxHQUFHLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUVsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBYztRQUMzQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFRLEVBQUUsQ0FBUTtRQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRW5CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVsRSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNsRixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLGdEQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDNUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3RSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDNUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENB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R0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0IsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUN2QixHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLENBQ0osQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBYTtRQUMxQixJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FDUCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQ1AsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FDUCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQ1AsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FDUCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0IsTUFBTSxHQUFHLEdBQ1AsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FDUCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQ1AsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sR0FBRyxHQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FDUCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQ1AsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQ3ZCLEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxFQUNILEdBQUcsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFpQjtRQUM5QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNkLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLENB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QUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVE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Q0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFD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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQW1CLEVBQUUsTUFBbUIsRUFBRSxLQUFhO1FBQzFELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMvRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDL0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQy9ELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUUvRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBYSxFQUFFLE1BQWM7UUFDckMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQixnREFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFFeEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQWM7UUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1osRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLDZEQUFlLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFckIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBRWYsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBRWYsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBRWYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFcEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FB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QzFCLE1BQU0sQ0FBQyxHQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FDTCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFhO1FBQzFCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FB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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUVoQyxNQUFNLENBQUMsR0FDTCxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxJ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QUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLE1BQWMsRUFBRSxNQUF1QjtRQUNwRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLE1BQWMsRUFBRSxNQUF1QjtRQUNwRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxD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RSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLGdEQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENB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QUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVqQyxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixVQUFVLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNqRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7WUFFdEQsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFOUMsWUFBWTtZQUNaLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDZixDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNmLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ2YsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFFZixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFnQixDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQW1CLEVBQUUsTUFBbUIsRUFBRSxLQUFhLEVBQUUsR0FBdUI7UUFDN0YsSUFBSSxVQUFVLEdBQ1osTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBRXpDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsT0FBTyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDckIsQ0FBQztpQkFBTSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQixVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDdEIsQ0FBQztZQUVELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVqQyxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixVQUFVLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNqRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7WUFFdEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsRCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xELEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwRCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBbUIsRUFBRSxNQUFtQixFQUFFLEtBQWE7UUFDakUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDNUQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1RCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBbUIsRUFBRSxNQUFtQixFQUFFLEtBQWEsRUFBRSxHQUF1QjtRQUM1RixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlELEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM5RCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFhLEVBQUUsTUFBYztRQUM1QyxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pCLGdEQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FDekIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFDMUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFDMUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQWM7UUFDOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1osRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLDZEQUFlLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFckIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBRWYsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBRWYsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBRWYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFcEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENB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S0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFFZixDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFFZixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVwQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN2QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNyQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNyQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FB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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFtQixFQUFFLE1BQW1CO1FBQ2pELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBbUIsRUFBRSxNQUFtQixFQUFFLEdBQXVCO1FBQzVFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBbUIsRUFBRSxNQUFtQjtRQUN0RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQW1CLEVBQUUsTUFBbUIsRUFBRSxHQUF1QjtRQUNqRixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQW1CLEVBQUUsTUFBbUI7UUFDdEQsTUFBTSxDQUFDLEdBQ0wsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUNMLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUNMLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FDTCxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBbUIsRUFBRSxNQUFtQixFQUFFLEdBQXVCO1FBQ2pGLE1BQU0sQ0FBQyxHQUNMLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FDTCxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FDTCxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxDQUFDLEdBQ0wsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1B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SSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRS9CLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckIsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxD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S0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBZSxFQUFFLEtBQWUsRUFBRSxHQUFvQjtRQUNqRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBZSxFQUFFLEtBQWUsRUFBRSxJQUFnQztRQUNqRixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBZSxFQUFFLEtBQWUsRUFBRSxHQUFvQjtRQUN0RSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBYSxFQUFFLEtBQWEsRUFBRSxJQUFnQztRQUM3RSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxV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LENBQUMsS0FBZSxFQUFFLEtBQWUsRUFBRSxHQUFvQjtRQUMxRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixnREFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FB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QUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFaEMsTUFBTSxDQUFDLEdBQ0wsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixNQUFNLENBQUMsR0FDTCxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sQ0FBQyxHQUNMLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBaUIsRUFBRSxHQUFhLEVBQUUsR0FBb0I7UUFDaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFaEMsTUFBTSxDQUFDLEdBQ0wsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixNQUFNLENBQUMsR0FDTCxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sQ0FBQyxHQUNMLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUYsT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUNMLCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsR0FBRztZQUNILCtDQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFhLEVBQUUsUUFBZ0IsTUFBTSxDQUFDLE9BQU87UUFDbkQsSUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7WUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUN4QyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsR0FBYTtRQUN6QixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxFQUFFLENBQUMsQ0FBUztRQUNWLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQWE7UUFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLEdBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSyxJQUFJLENBQUMsV0FBbUIsQ0FDbEMsSUFBSyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0UsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBYSxFQUFFLEdBQWEsRUFBRSxLQUFhLEVBQUUsSUFBZ0M7UUFDeEYsT0FBTyxJQUFJLElBQUksQ0FDYixJQUFJLElBQUksQ0FBQztZQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO1NBQzVDLENBQUMsRUFDRixFQUFFLElBQUksRUFBRSxDQUNULENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFxQixFQUFFLElBQWdDO1FBQzVFLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLElBQWdDO1FBQ2pGLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQW9CLEVBQUUsSUFBZ0M7UUFDMUUsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQWMsRUFBRSxJQUFnQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFD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QUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFlLEVBQUUsS0FBZSxFQUFFLEdBQW9CO1FBQ3RFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMs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Q0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWUsRUFBRSxLQUFlLEVBQUUsR0FBb0I7UUFDMUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JGLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ04sZ0RBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUNyQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtB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QUFDLENBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07SUFDcEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtJQUNwRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUksRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO0lBRXBHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBSSxFQUFFLENBQUMsQ0FBQyxDQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07SUFDcEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07SUFDcEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07SUFDcEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07SUFFcEcsR0FBRyxDQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtJQUNyRyxHQUFHLENBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtJQUNyRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtJQUNyRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtJQUVyRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNO0lBQ3JHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNO0lBQ3JHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNO0lBQ3JHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENB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L0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsRUFBRSxH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QUFJLENBQUMsWUFBWSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUss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MUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDTCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNoRSxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDO2FBQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIs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UUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQTZCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDL0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzRixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzRixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMs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QUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVFM7QUFDTDtBQUNDO0FBQ0Q7QUFDSTtBQUNQO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOMUIsa0dBQWtHO0FBQ2xHLHFGQUFxRjtBQUNyRixrR0FBa0c7QUFFbEcsTUFBTSxrQkFBa0Is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QUNJLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUVyQzs7R0FFRztBQUNJLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUV0Qzs7R0FFRztBQUNJLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUU1Qjs7R0FFRztBQUNJLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUU3Qjs7R0FFRztBQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU5Qjs7R0FFRztBQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU5Qjs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUU3Qjs7R0FFRztBQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU5Qjs7R0FFRztBQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU5Qjs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU5Qjs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUU5Qjs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztBQUVoQzs7R0FFRztBQUNJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQjs7R0FFRztBQUNJLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztBQUVoQzs7R0FFRztBQUNJLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUVsQzs7R0FFRztBQUNJLE1BQU0sWUFBWSxHQUFH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QUFFdEQ7OztHQUdHO0FBQ0ksTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0ksTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0ksTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxNQUFNLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxNQUFNLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxNQUFNLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx1Q0FBdUMsR0FBRyxNQUFNLENBQUM7QUFFOUQ7OztHQUdHO0FBQ0ksTUFBTSx3Q0FBd0MsR0FBRyxNQUFNLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0ksTUFBTSx3Q0FBd0MsR0FBRyxNQUFNLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0ksTUFBTSx3Q0FBd0MsR0FBRyxNQUFNLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0ksTUFBTSx5Q0FBeUMsR0FBRyxNQUFNLENBQUM7QUFFaEU7OztHQUdHO0FBQ0ksTUFBTSx5Q0FBeUMsR0FBRyxNQUFNLENBQUM7QUFFaEU7OztHQUdHO0FBQ0ksTUFBTSx5Q0FBeUMsR0FBRyxNQUFNLENBQUM7QUFFaEUsc0JBQXNCO0FBQ3RCLDhHQUE4RztBQUM5Rzs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRCx5QkFBeUI7QUFDekIseUpBQXlKO0FBQ3pKOzs7R0FHRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBRXhDLDJCQUEyQjtBQUMzQix5SUFBeUk7QUFDekk7OztHQUdHO0FBQ0ksTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBRXJDOzs7R0FHRztBQUNJLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUVwQzs7R0FFRztBQUNJLE1BQU0sNENBQTRDLEdBQUcsTUFBTSxDQUFDO0FBRW5FOztHQUVHO0FBQ0ksTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUM7QUFFakQsbUJBQW1CO0FBQ25CLDZNQUE2TTtBQUM3TTs7O0dBR0c7QUFDSSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFFakM7OztHQUdHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBRWpDLFdBQVc7QUFDWCw2R0FBNkc7QUFDN0c7OztHQUdHO0FBQ0ksTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBRWxDOzs7R0FHRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBRXhDOzs7R0FHRztBQUNJLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDO0FBRTFDOzs7R0FHRztBQUNJLE1BQU0sNENBQTRDLEdBQUcsTUFBTSxDQUFDO0FBRW5FLDJCQUEyQjtBQUMzQixpSUFBaUk7QUFDakk7OztHQUdHO0FBQ0ksTUFBTSxzQ0FBc0MsR0FBRyxNQUFNLENBQUM7QUFFN0QscUJBQXFCO0FBQ3JCLDJLQUEySztBQUMzSzs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUVsRDs7O0dBR0c7QUFDSSxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUVsRDs7O0dBR0c7QUFDSSxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUVsRDs7O0dBR0c7QUFDSSxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUVsRDs7O0dBR0c7QUFDSSxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUVsRDs7O0dBR0c7QUFDSSxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUVsRDs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7O0dBR0c7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eEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7Ozs7Ozs7Ozs7OztBQ044QjtBQUU5QixpRUFBZSxtQ0FBRSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmhvZG9uaXRlL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9ub2RlX21vZHVsZXMva3R4LXBhcnNlL2Rpc3Qva3R4LXBhcnNlLm1vZGVybi5qcyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvQ2xhc3NpY1NpbmdsZVNoYWRlci9DbGFzc2ljU2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0NsYXNzaWNTaW5nbGVTaGFkZXIvQ2xhc3NpY1NpbmdsZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9Db2xvckdyYWRpbmdVc2luZ0xVVHNTaGFkZXIvQ29sb3JHcmFkaW5nVXNpbmdMVVRzU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0NvbG9yR3JhZGluZ1VzaW5nTFVUc1NoYWRlci9Db2xvckdyYWRpbmdVc2luZ0xVVHNTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXIvRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXIvRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGVwdGhNb21lbnRFbmNvZGVTaGFkZXIvRGVwdGhNb21lbnRFbmNvZGVTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGVwdGhNb21lbnRFbmNvZGVTaGFkZXIvRGVwdGhNb21lbnRFbmNvZGVTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyL0VudGl0eVVJRE91dHB1dFNpbmdsZVNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9FbnRpdHlVSURPdXRwdXRTaW5nbGVTaGFkZXIvRW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0ZYQUEzUXVhbGl0eVNoYWRlci9GWEFBM1F1YWxpdHlTaW5nbGVTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRlhBQTNRdWFsaXR5U2hhZGVyL0ZYQUEzUXVhbGl0eVNpbmdsZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9GbGF0U2luZ2xlU2hhZGVyL0ZsYXRTaW5nbGVTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRmxhdFNpbmdsZVNoYWRlci9GbGF0U2luZ2xlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0Z1cm5hY2VUZXN0U2hhZGVyL0Z1cm5hY2VUZXN0U2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0Z1cm5hY2VUZXN0U2hhZGVyL0Z1cm5hY2VUZXN0U2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlci9HYW1tYUNvcnJlY3Rpb25TaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvR2FtbWFDb3JyZWN0aW9uU2hhZGVyL0dhbW1hQ29ycmVjdGlvblNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9HYXVzc2lhbkJsdXJGb3JFbmNvZGVkRGVwdGhTaGFkZXIvR2F1c3NpYW5CbHVyRm9yRW5jb2RlZERlcHRoU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0dhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aFNoYWRlci9HYXVzc2lhbkJsdXJGb3JFbmNvZGVkRGVwdGhTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvR2F1c3NpYW5CbHVyU2hhZGVyL0dhdXNzaWFuQmx1clNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9HYXVzc2lhbkJsdXJTaGFkZXIvR2F1c3NpYW5CbHVyU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL01Ub29uU2luZ2xlU2hhZGVyL01Ub29uU2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL01Ub29uU2luZ2xlU2hhZGVyL01Ub29uU2luZ2xlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL01hdENhcFNoYWRlci9NYXRDYXBTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvTWF0Q2FwU2hhZGVyL01hdENhcFNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QYW5vcmFtYVRvQ3ViZVNoYWRlci9QYW5vcmFtYVRvQ3ViZVNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QYW5vcmFtYVRvQ3ViZVNoYWRlci9QYW5vcmFtYVRvQ3ViZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QYnJTaW5nbGVTaGFkZXIvUGJyU2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1BiclNpbmdsZVNoYWRlci9QYnJTaW5nbGVTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvUHJlZmlsdGVySUJMU2hhZGVyL1ByZWZpbHRlcklCTFNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QcmVmaWx0ZXJJQkxTaGFkZXIvUHJlZmlsdGVySUJMU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1NoYWRvd01hcERlY29kZUNsYXNzaWNTaW5nbGVTaGFkZXIvU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NpbmdsZVNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9TaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2luZ2xlU2hhZGVyL1NoYWRvd01hcERlY29kZUNsYXNzaWNTaW5nbGVTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvU3VtbWVkQXJlYVRhYmxlU2hhZGVyL1N1bW1lZEFyZWFUYWJsZVNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9TdW1tZWRBcmVhVGFibGVTaGFkZXIvU3VtbWVkQXJlYVRhYmxlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1RvbmVNYXBwaW5nU2hhZGVyL1RvbmVNYXBwaW5nU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1RvbmVNYXBwaW5nU2hhZGVyL1RvbmVNYXBwaW5nU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1ZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRlci9WYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2hhZGVyL1ZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9jb21tb24vbWFpblByZXJlcXVpc2l0ZXMuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvY29tbW9uL3ByZXJlcXVpc2l0ZXMuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvQWRkLmdsc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZUNvbG9yLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZU5vcm1hbC52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVQb3NpdGlvbi52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVUZXhjb29yZC52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Eb3RQcm9kdWN0Lmdsc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0dyZWF0ZXIuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTWVyZ2VWZWN0b3IuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTXVsdGlwbHkuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTm9ybWFsTWF0cml4LnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL05vcm1hbGl6ZS5nbHNsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Qcm9qZWN0aW9uTWF0cml4LnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1Npbi5nbHNsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9TbW9vdGhTdGVwLmdsc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1NwbGl0VmVjdG9yLmdsc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1N0ZXAuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvVGltZS5nbHNsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9UcmFuc2Zvcm0uZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvVmlld01hdHJpeC52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9XaXJlZnJhbWUuZ2xzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvV29ybGRNYXRyaXgudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0NsYXNzaWNTaW5nbGVTaGFkZXIvQ2xhc3NpY1NpbmdsZVNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvQ2xhc3NpY1NpbmdsZVNoYWRlci9DbGFzc2ljU2luZ2xlU2hhZGVyLnZlcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9EZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlci9EZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9FbnZDb25zdGFudFNpbmdsZVNoYWRlci9FbnZDb25zdGFudFNpbmdsZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvRmxhdFNpbmdsZVNoYWRlci9GbGF0U2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9GbGF0U2luZ2xlU2hhZGVyL0ZsYXRTaW5nbGVTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlci9HYW1tYUNvcnJlY3Rpb25TaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlci9HYW1tYUNvcnJlY3Rpb25TaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0dhdXNzaWFuQmx1clNoYWRlci9HYXVzc2lhbkJsdXJTaGFkZXIuZnJhZyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0dhdXNzaWFuQmx1clNoYWRlci9HYXVzc2lhbkJsdXJTaGFkZXIudmVydCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL01Ub29uU2luZ2xlU2hhZGVyL01Ub29uU2luZ2xlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9NVG9vblNpbmdsZVNoYWRlci9NVG9vblNpbmdsZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvUGFub3JhbWFUb0N1YmVTaGFkZXIvUGFub3JhbWFUb0N1YmVTaGFkZXIuZnJhZy53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvUGFub3JhbWFUb0N1YmVTaGFkZXIvUGFub3JhbWFUb0N1YmVTaGFkZXIudmVydC53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvUGJyU2luZ2xlU2hhZGVyL1BiclNpbmdsZVNoYWRlci5mcmFnIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvUGJyU2luZ2xlU2hhZGVyL1BiclNpbmdsZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvUHJlZmlsdGVySUJMU2hhZGVyL1ByZWZpbHRlcklCTFNoYWRlci5mcmFnLndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9QcmVmaWx0ZXJJQkxTaGFkZXIvUHJlZmlsdGVySUJMU2hhZGVyLnZlcnQud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyLmZyYWciLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci52ZXJ0Iiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvVG9uZU1hcHBpbmdTaGFkZXIvVG9uZU1hcHBpbmdTaGFkZXIuZnJhZy53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvVG9uZU1hcHBpbmdTaGFkZXIvVG9uZU1hcHBpbmdTaGFkZXIudmVydC53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvY29tbW9uL21haW5QcmVyZXF1aXNpdGVzLndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9jb21tb24vcHJlcmVxdWlzaXRlcy53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvY29tbW9uL3ZlcnRleElucHV0Lndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BZGQud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZUNvbG9yLnZlcnQud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZU5vcm1hbC52ZXJ0Lndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVQb3NpdGlvbi52ZXJ0Lndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVUZXhjb29yZC52ZXJ0Lndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Eb3RQcm9kdWN0Lndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9NZXJnZVZlY3Rvci53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTXVsdGlwbHkud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL05vcm1hbE1hdHJpeC52ZXJ0Lndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Ob3JtYWxpemUud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1Byb2plY3Rpb25NYXRyaXgudmVydC53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvU2luLndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9TbW9vdGhTdGVwLndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9TcGxpdFZlY3Rvci53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvU3RlcC53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvVGltZS53Z3NsIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvVHJhbnNmb3JtLndnc2wiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9WaWV3TWF0cml4LnZlcnQud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1dvcmxkTWF0cml4LnZlcnQud2dzbCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9ub2RlX21vZHVsZXMvc2hhZGVyaXR5L2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9lZmZla3NlZXIvRWZmZWtzZWVyQ29tcG9uZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9lZmZla3NlZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2VmZmVrc2Vlci9tYWluLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NhbWVyYXMvQWJzdHJhY3RDYW1lcmFDb250cm9sbGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NhbWVyYXMvSUNhbWVyYUNvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY2FtZXJhcy9PcmJpdENhbWVyYUNvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY2FtZXJhcy9XYWxrVGhyb3VnaENhbWVyYUNvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY2FtZXJhcy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0FuaW1hdGlvbi9BbmltYXRpb25Db21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9BbmltYXRpb24vQW5pbWF0aW9uQ29uc3RhbnRzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQW5pbWF0aW9uL0FuaW1hdGlvbk9wcy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0FuaW1hdGlvbi9JQW5pbWF0aW9uRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQW5pbWF0aW9uL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQW5pbWF0aW9uU3RhdGUvQW5pbWF0aW9uU3RhdGVDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9CbGVuZFNoYXBlL0JsZW5kU2hhcGVDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9CbGVuZFNoYXBlL0lCbGVuZFNoYXBlRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQmxlbmRTaGFwZS9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmEvSUNhbWVyYUVudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0NhbWVyYS9jcmVhdGVDYW1lcmFFbnRpdHkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmEvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmFDb250cm9sbGVyL0NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmFDb250cm9sbGVyL0lDYW1lcmFDb250cm9sbGVyRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ2FtZXJhQ29udHJvbGxlci9jcmVhdGVDYW1lcmFDb250cm9sbGVyRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ2FtZXJhQ29udHJvbGxlci9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0NvbXBvbmVudFR5cGVzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ29uc3RyYWludC9Db25zdHJhaW50Q29tcG9uZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ29uc3RyYWludC9JQ29uc3RyYWludEVudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0NvbnN0cmFpbnQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9MaWdodC9JTGlnaHRFbnRpdHkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9MaWdodC9MaWdodENvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL0xpZ2h0L2NyZWF0ZUxpZ2h0RW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTGlnaHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9NZXNoL0lNZXNoRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaC9NZXNoQ29tcG9uZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaC9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9JTWVzaFJlbmRlcmVyRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL01lc2hSZW5kZXJlckNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9jcmVhdGVNZXNoRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvUGh5c2ljcy9JUGh5c2ljc0VudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1BoeXNpY3MvUGh5c2ljc0NvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1BoeXNpY3MvY3JlYXRlUGh5c2ljc0VudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1BoeXNpY3MvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9TY2VuZUdyYXBoL0lTY2VuZUdyYXBoRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoT3BzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1NjZW5lR3JhcGgvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9Ta2VsZXRhbC9BbmltYXRpb25SZXRhcmdldC9BYnNvbHV0ZUFuaW1hdGlvbi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1NrZWxldGFsL0FuaW1hdGlvblJldGFyZ2V0L0FuaW1hdGlvblJldGFyZ2V0LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvU2tlbGV0YWwvQW5pbWF0aW9uUmV0YXJnZXQvR2xvYmFsUmV0YXJnZXQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9Ta2VsZXRhbC9BbmltYXRpb25SZXRhcmdldC9HbG9iYWxSZXRhcmdldFJldmVyc2UudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9Ta2VsZXRhbC9BbmltYXRpb25SZXRhcmdldC9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1NrZWxldGFsL0lTa2VsZXRhbEVudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1NrZWxldGFsL1NrZWxldGFsQ29tcG9uZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvU2tlbGV0YWwvY3JlYXRlU2tlbGV0YWxFbnRpdHkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9Ta2VsZXRhbC9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1RyYW5zZm9ybS9JVHJhbnNmb3JtRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvVHJhbnNmb3JtL1RyYW5zZm9ybUNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1RyYW5zZm9ybS9jcmVhdGVUcmFuc2Zvcm1FbnRpdHkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9UcmFuc2Zvcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9Wcm0vSVZybUVudGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb21wb25lbnRzL1ZybS9Wcm1Db21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9Wcm0vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9XZWxsS25vd25Db21wb25lbnRUSURzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvbXBvbmVudHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29tcG9uZW50cy9yZWdpc3RlckNvbXBvbmVudHMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29uc3RyYWludHMvVnJtQWltQ29uc3RyYWludC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb25zdHJhaW50cy9Wcm1Sb2xsQ29uc3RyYWludC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb25zdHJhaW50cy9Wcm1Sb3RhdGlvbkNvbnN0cmFpbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29yZS9Db21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvcmUvQ29uZmlnLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvcmUvRW50aXR5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvcmUvRW50aXR5UmVwb3NpdG9yeS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb3JlL0dsb2JhbERhdGFSZXBvc2l0b3J5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvcmUvTWVtb3J5TWFuYWdlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9jb3JlL1JuT2JqZWN0LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2NvcmUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQWxwaGFNb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0FuaW1hdGlvbkF0dHJpYnV0ZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9BbmltYXRpb25JbnRlcnBvbGF0aW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0Jhc2lzQ29tcHJlc3Npb25UeXBlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0JsZW5kLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0JvbmVEYXRhVHlwZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9CdWZmZXJVc2UudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ2FtZXJhQ29udHJvbGxlclR5cGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ2FtZXJhVHlwZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wcmVzc2lvblRleHR1cmVUeXBlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0ZpbGVUeXBlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0hkcmlGb3JtYXQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvTGlnaHRUeXBlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1BoeXNpY3NTaGFwZVR5cGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvUGl4ZWxGb3JtYXQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvUHJpbWl0aXZlTW9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1JlbmRlckJ1ZmZlclRhcmdldC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclR5cGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvU2hhZGVyVmFyaWFibGVUeXBlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRpbmdNb2RlbC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkb3dNYXAudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9UZXh0dXJlUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1RvbmVNYXBwaW5nVHlwZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVmlzaWJpbGl0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9kZWZpbml0aW9ucy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9lbmhhbmNlZF9qc19vYmplY3RzL0FycmF5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2VuaGFuY2VkX2pzX29iamVjdHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZXhwb3J0ZXIvR2x0ZjJFeHBvcnRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9leHBvcnRlci9HbHRmMkV4cG9ydGVyRWZmZWtzZWVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2V4cG9ydGVyL0dsdGYyRXhwb3J0ZXJPcHMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZXhwb3J0ZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvQ29tcGxleFZlcnRleEF0dHJpYnV0ZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9nZW9tZXRyeS9GcnVzdHVtLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2dlb21ldHJ5L0lTZW1hbnRpY1ZlcnRleEF0dHJpYnV0ZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9nZW9tZXRyeS9NZXNoLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2dlb21ldHJ5L1ByaW1pdGl2ZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9nZW9tZXRyeS9TaW1wbGVWZXJ0ZXhBdHRyaWJ1dGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL0F4aXMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL0N1YmUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL0dyaWQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL0lTaGFwZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9nZW9tZXRyeS9zaGFwZXMvSm9pbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL0xpbmUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL1BsYW5lLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2dlb21ldHJ5L3NoYXBlcy9TcGhlcmUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvc2hhcGVzL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2dlb21ldHJ5L3R5cGVzL0dlb21ldHJ5VHlwZXMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2VvbWV0cnkvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2l6bW9zL0FBQkJHaXptby50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9naXptb3MvR2l6bW8udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2l6bW9zL0xpZ2h0R2l6bW8udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vZ2l6bW9zL0xvY2F0b3JHaXptby50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9naXptb3MvU2NhbGVHaXptby50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9naXptb3MvVHJhbnNsYXRpb25HaXptby50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9naXptb3MvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaGVscGVycy9FbnRpdHlIZWxwZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaGVscGVycy9FeHByZXNzaW9uSGVscGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2hlbHBlcnMvTWF0ZXJpYWxIZWxwZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaGVscGVycy9NZXNoSGVscGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL2hlbHBlcnMvUmVuZGVyUGFzc0hlbHBlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9oZWxwZXJzL1JlbmRlcmFibGVIZWxwZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaGVscGVycy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9BbmltYXRpb25Bc3NpZ25lci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9EcmNQb2ludENsb3VkSW1wb3J0ZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaW1wb3J0ZXIvRm9ybWF0RGV0ZWN0b3IudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaW1wb3J0ZXIvR2x0ZjJJbXBvcnRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9HbHRmSW1wb3J0ZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaW1wb3J0ZXIvSUxvYWRlckV4dGVuc2lvbi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9Nb2RlbENvbnZlcnRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9SaG9kb25pdGVJbXBvcnRFeHRlbnNpb24udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaW1wb3J0ZXIvVnJtMHhJbXBvcnRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9Wcm1JbXBvcnRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9pbXBvcnRlci9Wcm1hSW1wb3J0ZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaW1wb3J0ZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvbnRlbnRzL0NvbG9yR3JhZGluZ1VzaW5nTFVUc01hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvQ3VzdG9tTWF0ZXJpYWxDb250ZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9jb250ZW50cy9EZXB0aEVuY29kZU1hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvRGV0ZWN0SGlnaEx1bWluYW5jZU1hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvRW50aXR5VUlET3V0cHV0TWF0ZXJpYWxDb250ZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9jb250ZW50cy9GdXJuYWNlVGVzdE1hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvTVRvb25NYXRlcmlhbENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvbnRlbnRzL01hdENhcE1hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvU3ludGhlc2l6ZUhkck1hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29udGVudHMvVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljTWF0ZXJpYWxDb250ZW50LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9jb250ZW50cy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9BYnN0cmFjdE1hdGVyaWFsQ29udGVudC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9BYnN0cmFjdFNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvcmUvRHVtbXlUZXh0dXJlcy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbFJlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWxUeXBlcy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9TaGFkZXJHcmFwaFJlc29sdmVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL1NoYWRlckhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvcmUvU2hhZGVyaXR5VXRpbGl0eVdlYkdMLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL1NoYWRlcml0eVV0aWxpdHlXZWJHUFUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvcmUvU29ja2V0LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvQWRkU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvQXR0cmlidXRlQ29sb3JTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9BdHRyaWJ1dGVOb3JtYWxTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9BdHRyaWJ1dGVQb3NpdGlvblNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL0F0dHJpYnV0ZVRleGNvb3JkU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvQmxvY2tCZWdpblNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL0Jsb2NrRW5kU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvQ29uc3RhbnRTY2FsYXJWYXJpYWJsZVNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL0NvbnN0YW50VmFyaWFibGVTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9Db25zdGFudFZlY3RvcjJWYXJpYWJsZVNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL0NvbnN0YW50VmVjdG9yM1ZhcmlhYmxlU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvQ29uc3RhbnRWZWN0b3I0VmFyaWFibGVTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9Eb3RQcm9kdWN0U2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvR3JlYXRlclNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL0lmU3RhdGVtZW50U2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvTWVyZ2VWZWN0b3JTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9NdWx0aXBseVNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL05vcm1hbE1hdHJpeFNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL05vcm1hbGl6ZVNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL091dENvbG9yU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvT3V0UG9zaXRpb25TaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9Qcm9qZWN0aW9uTWF0cml4U2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvU2luU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvU21vb3RoU3RlcFNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL1NwbGl0VmVjdG9yU2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvU3RlcFNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL1RpbWVTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9UcmFuc2Zvcm1TaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9Vbmlmb3JtRGF0YVNoYWRlck5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL1ZpZXdNYXRyaXhTaGFkZXJOb2RlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGVyaWFscy9ub2Rlcy9XaXJlZnJhbWVNYXRlcmlhbE5vZGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL25vZGVzL1dvcmxkTWF0cml4U2hhZGVyTm9kZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRlcmlhbHMvbm9kZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9BQUJCLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvQWJzdHJhY3RNYXRoTnVtYmVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvQWJzdHJhY3RNYXRyaXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9BYnN0cmFjdFF1YXRlcm5pb24udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9BYnN0cmFjdFZlY3Rvci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL0NvbG9yUmdiLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvQ29sb3JSZ2JhLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvSUNvbG9yLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvSU1hdGhOdW1iZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9JTWF0cml4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvSVF1YXRlcm5pb24udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9JVmVjdG9yLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvSWRlbnRpdHlNYXRyaXgzMy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL0lkZW50aXR5TWF0cml4NDQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9Mb2dRdWF0ZXJuaW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvTWF0aENsYXNzVXRpbC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL01hdGhVdGlsLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvTWF0cml4MjIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9NYXRyaXgzMy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL01hdHJpeDQ0LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZUNvbG9yUmdiLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZUNvbG9yUmdiYS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL011dGFibGVNYXRyaXgyMi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL011dGFibGVNYXRyaXgzMy50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL011dGFibGVNYXRyaXg0NC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL011dGFibGVRdWF0ZXJuaW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZVNjYWxhci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL011dGFibGVWZWN0b3IyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZVZlY3RvcjMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9NdXRhYmxlVmVjdG9yNC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL1F1YXRlcm5pb24udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9TY2FsYXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9UcmFuc2Zvcm0zRC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9WZWN0b3IzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21hdGgvVmVjdG9yNC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL1ZlY3Rvck4udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWF0aC9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL3Jhdy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tYXRoL3Jhdy9yYXdfZXh0ZW5zaW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21lbW9yeS9BY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9tZW1vcnkvQnVmZmVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21lbW9yeS9CdWZmZXJWaWV3LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21lbW9yeS9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9taXNjL0RhdGFVdGlsLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21pc2MvRW51bUlPLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21pc2MvSW1hZ2VVdGlsLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21pc2MvSXMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWlzYy9NaXNjVXRpbC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9taXNjL09wdGlvbi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9taXNjL1Jlc3VsdC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9taXNjL1JuRXhjZXB0aW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21pc2MvUm5Qcm9taXNlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21pc2MvVGltZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9taXNjL1dlYWtPcHRpb24udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWlzYy9jYWNoZS9DYWNoZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9taXNjL2NhY2hlL1N5bWJvbFdlYWtNYXAudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWlzYy9jYWNoZS9jYWNoaWZ5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL21pc2MvY2FjaGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vbWlzYy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9waHlzaWNzL09pbW8vT2ltb1BoeXNpY3NTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9waHlzaWNzL09pbW8vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcGh5c2ljcy9QaHlzaWNzUHJvcGVydHkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcGh5c2ljcy9QaHlzaWNzU3RyYXRlZ3kudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcGh5c2ljcy9QaHlzaWNzV29ybGRQcm9wZXJ0eS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9waHlzaWNzL1ZSTVNwcmluZy9DYXBzdWxlQ29sbGlkZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcGh5c2ljcy9WUk1TcHJpbmcvU3BoZXJlQ29sbGlkZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcGh5c2ljcy9WUk1TcHJpbmcvVlJNQ29sbGlkZXJHcm91cC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9waHlzaWNzL1ZSTVNwcmluZy9WUk1TcHJpbmcudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcGh5c2ljcy9WUk1TcHJpbmcvVlJNU3ByaW5nQm9uZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9waHlzaWNzL1ZSTVNwcmluZy9WUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL3BoeXNpY3MvVlJNU3ByaW5nL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL3BoeXNpY3MvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcmVuZGVyZXIvRXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9yZW5kZXJlci9GcmFtZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9yZW5kZXJlci9GcmFtZUJ1ZmZlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9yZW5kZXJlci9SZW5kZXJQYXNzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL3JlbmRlcmVyL1JlbmRlcmluZ0NvbW1vbk1ldGhvZHMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcmVuZGVyZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vcmVuZGVyZXIvcGlwZWxpbmVzL0ZvcndhcmRSZW5kZXJQaXBlbGluZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9yZW5kZXJlci9waXBlbGluZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vc3lzdGVtL0V2ZW50UHViU3ViLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL3N5c3RlbS9JbnB1dE1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vc3lzdGVtL01vZHVsZU1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vc3lzdGVtL1N5c3RlbS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi9zeXN0ZW0vU3lzdGVtU3RhdGUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vc3lzdGVtL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL3RleHR1cmVzL0Fic3RyYWN0VGV4dHVyZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi90ZXh0dXJlcy9DdWJlVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi90ZXh0dXJlcy9JUmVuZGVyYWJsZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi90ZXh0dXJlcy9SZW5kZXJCdWZmZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vdGV4dHVyZXMvUmVuZGVyVGFyZ2V0VGV4dHVyZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi90ZXh0dXJlcy9SZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi90ZXh0dXJlcy9TYW1wbGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9mb3VuZGF0aW9uL3RleHR1cmVzL1RleHR1cmUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vdGV4dHVyZXMvVGV4dHVyZURhdGFGbG9hdC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvZm91bmRhdGlvbi90ZXh0dXJlcy9WaWRlb1RleHR1cmUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2ZvdW5kYXRpb24vdGV4dHVyZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy9wYnIvbWFpbi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvdHlwZXMvQW5pbWF0aW9uVHlwZXMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3R5cGVzL0Jhc2lzVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvdHlwZXMvQ29tbW9uVHlwZXMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3R5cGVzL0tUWDJUZXh0dXJlLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy90eXBlcy9Sbk0yLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy90eXBlcy9Sbk0yVnJtYS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvdHlwZXMvU2hhZGVyTm9kZUpzb24udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3R5cGVzL1R5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3R5cGVzL1R5cGVHZW5lcmF0b3JzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy90eXBlcy9WUk0weC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvdHlwZXMvV2ViR0xDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3R5cGVzL2dsVEYxLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy90eXBlcy9nbFRGMi50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvdHlwZXMvZ2xURjJGb3JPdXRwdXQudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3R5cGVzL2luZGV4LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy92ZXJzaW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9XZWJHTENvbnRleHRXcmFwcGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9XZWJHTEV4dGVuZGVkVHlwZXMudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL1dlYkdMRXh0ZW5zaW9uLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9XZWJHTFJlc291cmNlUmVwb3NpdG9yeS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvV2ViR0xTdGVyZW9VdGlsLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9XZWJHTFN0cmF0ZWd5LnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9XZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9XZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL1dlYkdMU3RyYXRlZ3lVbmlmb3JtLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9nZXRSZW5kZXJpbmdTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL21haW4udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcnMvQ29tbW9uU2hhZGVyUGFydC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVycy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVycy9ub2Rlcy9CbG9ja0JlZ2luU2hhZGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJzL25vZGVzL0Jsb2NrRW5kU2hhZGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJzL25vZGVzL0NsYXNzaWNTaGFkaW5nU2hhZGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJzL25vZGVzL0NvbnN0YW50VmFyaWFibGVTaGFkZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcnMvbm9kZXMvRW5kU2hhZGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJzL25vZGVzL0lmU3RhdGVtZW50U2hhZGVyLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC9zaGFkZXJzL25vZGVzL1RleHR1cmVGZXRjaFNoYWRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVycy9ub2Rlcy9Vbmlmb3JtRGF0YVNoYWRlci50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ2wvc2hhZGVycy9ub2Rlcy9WYXJ5aW5nVmFyaWFibGVTaGFkZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3NoYWRlcnMvbm9kZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3RleHR1cmVMb2FkZXIvS1RYMlRleHR1cmVMb2FkZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3RleHR1cmVMb2FkZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJnbC90eXBlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvd2ViZ3B1L1dlYkdwdURldmljZVdyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9XZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9XZWJHcHVTdHJhdGVneUJhc2ljLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy93ZWJncHUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3dlYmdwdS9tYWluLnRzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL3NyYy94ci9XZWJBUlN5c3RlbS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMveHIvV2ViWFJJbnB1dC50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMveHIvV2ViWFJTeXN0ZW0udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3hyL2dldE1vZHVsZS50cyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMveHIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vc3JjL3hyL21haW4udHMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vVkVSU0lPTi1GSUxFIiwid2VicGFjazovL3Job2Rvbml0ZS8uL25vZGVfbW9kdWxlcy93ZWJ4ci1pbnB1dC1wcm9maWxlcy9wYWNrYWdlcy9tb3Rpb24tY29udHJvbGxlcnMvc3JjL2NvbXBvbmVudHMuanMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vbm9kZV9tb2R1bGVzL3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL21vdGlvbi1jb250cm9sbGVycy9zcmMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL25vZGVfbW9kdWxlcy93ZWJ4ci1pbnB1dC1wcm9maWxlcy9wYWNrYWdlcy9tb3Rpb24tY29udHJvbGxlcnMvc3JjL21vdGlvbkNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vbm9kZV9tb2R1bGVzL3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL21vdGlvbi1jb250cm9sbGVycy9zcmMvcHJvZmlsZXMuanMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vbm9kZV9tb2R1bGVzL3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL21vdGlvbi1jb250cm9sbGVycy9zcmMvdmlzdWFsUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vbm9kZV9tb2R1bGVzL3psaWJqcy9iaW4vdW56aXAubWluLmpzIiwid2VicGFjazovL3Job2Rvbml0ZS8uL25vZGVfbW9kdWxlcy96c3RkZGVjL2Rpc3QvenN0ZGRlYy5tb2Rlcm4uanMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlLy4vdmVuZG9yL2hkcnBuZy5taW4uanMiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3Job2Rvbml0ZS93ZWJwYWNrL3J1bnRpbWUvYW1kIGRlZmluZSIsIndlYnBhY2s6Ly9yaG9kb25pdGUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vcmhvZG9uaXRlL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9yaG9kb25pdGUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9yaG9kb25pdGUvLi9zcmMvY2pzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KShnbG9iYWwsICgpID0+IHtcbnJldHVybiAiLCJjb25zdCB0PW5ldyBVaW50OEFycmF5KFswXSksZT1bMTcxLDc1LDg0LDg4LDMyLDUwLDQ4LDE4NywxMywxMCwyNiwxMF07dmFyIG4saSxzLGEscixvLGwsZjshZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09XCJOT05FXCIsdFt0LkJBU0lTTFo9MV09XCJCQVNJU0xaXCIsdFt0LlpTVEQ9Ml09XCJaU1REXCIsdFt0LlpMSUI9M109XCJaTElCXCJ9KG58fChuPXt9KSksZnVuY3Rpb24odCl7dFt0LkJBU0lDRk9STUFUPTBdPVwiQkFTSUNGT1JNQVRcIn0oaXx8KGk9e30pKSxmdW5jdGlvbih0KXt0W3QuVU5TUEVDSUZJRUQ9MF09XCJVTlNQRUNJRklFRFwiLHRbdC5FVEMxUz0xNjNdPVwiRVRDMVNcIix0W3QuVUFTVEM9MTY2XT1cIlVBU1RDXCJ9KHN8fChzPXt9KSksZnVuY3Rpb24odCl7dFt0LlVOU1BFQ0lGSUVEPTBdPVwiVU5TUEVDSUZJRURcIix0W3QuU1JHQj0xXT1cIlNSR0JcIn0oYXx8KGE9e30pKSxmdW5jdGlvbih0KXt0W3QuVU5TUEVDSUZJRUQ9MF09XCJVTlNQRUNJRklFRFwiLHRbdC5MSU5FQVI9MV09XCJMSU5FQVJcIix0W3QuU1JHQj0yXT1cIlNSR0JcIix0W3QuSVRVPTNdPVwiSVRVXCIsdFt0Lk5UU0M9NF09XCJOVFNDXCIsdFt0LlNMT0c9NV09XCJTTE9HXCIsdFt0LlNMT0cyPTZdPVwiU0xPRzJcIn0ocnx8KHI9e30pKSxmdW5jdGlvbih0KXt0W3QuQUxQSEFfU1RSQUlHSFQ9MF09XCJBTFBIQV9TVFJBSUdIVFwiLHRbdC5BTFBIQV9QUkVNVUxUSVBMSUVEPTFdPVwiQUxQSEFfUFJFTVVMVElQTElFRFwifShvfHwobz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5SR0I9MF09XCJSR0JcIix0W3QuUlJSPTNdPVwiUlJSXCIsdFt0LkdHRz00XT1cIkdHR1wiLHRbdC5BQUE9MTVdPVwiQUFBXCJ9KGx8fChsPXt9KSksZnVuY3Rpb24odCl7dFt0LlJHQj0wXT1cIlJHQlwiLHRbdC5SR0JBPTNdPVwiUkdCQVwiLHRbdC5SUlI9NF09XCJSUlJcIix0W3QuUlJSRz01XT1cIlJSUkdcIn0oZnx8KGY9e30pKTtjbGFzcyBVe2NvbnN0cnVjdG9yKCl7dGhpcy52a0Zvcm1hdD0wLHRoaXMudHlwZVNpemU9MSx0aGlzLnBpeGVsV2lkdGg9MCx0aGlzLnBpeGVsSGVpZ2h0PTAsdGhpcy5waXhlbERlcHRoPTAsdGhpcy5sYXllckNvdW50PTAsdGhpcy5mYWNlQ291bnQ9MSx0aGlzLnN1cGVyY29tcHJlc3Npb25TY2hlbWU9bi5OT05FLHRoaXMubGV2ZWxzPVtdLHRoaXMuZGF0YUZvcm1hdERlc2NyaXB0b3I9W3t2ZW5kb3JJZDowLGRlc2NyaXB0b3JUeXBlOmkuQkFTSUNGT1JNQVQsdmVyc2lvbk51bWJlcjoyLGRlc2NyaXB0b3JCbG9ja1NpemU6NDAsY29sb3JNb2RlbDpzLlVOU1BFQ0lGSUVELGNvbG9yUHJpbWFyaWVzOmEuU1JHQix0cmFuc2ZlckZ1bmN0aW9uOmEuU1JHQixmbGFnczpvLkFMUEhBX1NUUkFJR0hULHRleGVsQmxvY2tEaW1lbnNpb246e3g6NCx5OjQsejoxLHc6MX0sYnl0ZXNQbGFuZTpbXSxzYW1wbGVzOltdfV0sdGhpcy5rZXlWYWx1ZT17fSx0aGlzLmdsb2JhbERhdGE9bnVsbH19Y2xhc3MgY3tjb25zdHJ1Y3Rvcih0LGUsbixpKXt0aGlzLl9kYXRhVmlldz1uZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2UsbiksdGhpcy5fbGl0dGxlRW5kaWFuPWksdGhpcy5fb2Zmc2V0PTB9X25leHRVaW50OCgpe2NvbnN0IHQ9dGhpcy5fZGF0YVZpZXcuZ2V0VWludDgodGhpcy5fb2Zmc2V0KTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz0xLHR9X25leHRVaW50MTYoKXtjb25zdCB0PXRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNih0aGlzLl9vZmZzZXQsdGhpcy5fbGl0dGxlRW5kaWFuKTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz0yLHR9X25leHRVaW50MzIoKXtjb25zdCB0PXRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9vZmZzZXQsdGhpcy5fbGl0dGxlRW5kaWFuKTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz00LHR9X25leHRVaW50NjQoKXtjb25zdCB0PXRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9vZmZzZXQsdGhpcy5fbGl0dGxlRW5kaWFuKSsyKiozMip0aGlzLl9kYXRhVmlldy5nZXRVaW50MzIodGhpcy5fb2Zmc2V0KzQsdGhpcy5fbGl0dGxlRW5kaWFuKTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz04LHR9X3NraXAodCl7cmV0dXJuIHRoaXMuX29mZnNldCs9dCx0aGlzfV9zY2FuKHQsZT0wKXtjb25zdCBuPXRoaXMuX29mZnNldDtsZXQgaT0wO2Zvcig7dGhpcy5fZGF0YVZpZXcuZ2V0VWludDgodGhpcy5fb2Zmc2V0KSE9PWUmJmk8dDspaSsrLHRoaXMuX29mZnNldCsrO3JldHVybiBpPHQmJnRoaXMuX29mZnNldCsrLG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGFWaWV3LmJ1ZmZlcix0aGlzLl9kYXRhVmlldy5ieXRlT2Zmc2V0K24saSl9fWZ1bmN0aW9uIGgodCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFRleHRFbmNvZGVyPyhuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KTpCdWZmZXIuZnJvbSh0KX1mdW5jdGlvbiBfKHQpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj8obmV3IFRleHREZWNvZGVyKS5kZWNvZGUodCk6QnVmZmVyLmZyb20odCkudG9TdHJpbmcoXCJ1dGY4XCIpfWZ1bmN0aW9uIGcodCl7bGV0IGU9MDtmb3IoY29uc3QgbiBvZiB0KWUrPW4uYnl0ZUxlbmd0aDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUpO2xldCBpPTA7Zm9yKGNvbnN0IGUgb2YgdCluLnNldChuZXcgVWludDhBcnJheShlKSxpKSxpKz1lLmJ5dGVMZW5ndGg7cmV0dXJuIG59ZnVuY3Rpb24gcCh0KXtjb25zdCBuPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCxlLmxlbmd0aCk7aWYoblswXSE9PWVbMF18fG5bMV0hPT1lWzFdfHxuWzJdIT09ZVsyXXx8blszXSE9PWVbM118fG5bNF0hPT1lWzRdfHxuWzVdIT09ZVs1XXx8bls2XSE9PWVbNl18fG5bN10hPT1lWzddfHxuWzhdIT09ZVs4XXx8bls5XSE9PWVbOV18fG5bMTBdIT09ZVsxMF18fG5bMTFdIT09ZVsxMV0pdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBLVFggMi4wIGlkZW50aWZpZXIuXCIpO2NvbnN0IGk9bmV3IFUscz0xNypVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCxhPW5ldyBjKHQsZS5sZW5ndGgscywhMCk7aS52a0Zvcm1hdD1hLl9uZXh0VWludDMyKCksaS50eXBlU2l6ZT1hLl9uZXh0VWludDMyKCksaS5waXhlbFdpZHRoPWEuX25leHRVaW50MzIoKSxpLnBpeGVsSGVpZ2h0PWEuX25leHRVaW50MzIoKSxpLnBpeGVsRGVwdGg9YS5fbmV4dFVpbnQzMigpLGkubGF5ZXJDb3VudD1hLl9uZXh0VWludDMyKCksaS5mYWNlQ291bnQ9YS5fbmV4dFVpbnQzMigpO2NvbnN0IHI9YS5fbmV4dFVpbnQzMigpO2kuc3VwZXJjb21wcmVzc2lvblNjaGVtZT1hLl9uZXh0VWludDMyKCk7Y29uc3Qgbz1hLl9uZXh0VWludDMyKCksbD1hLl9uZXh0VWludDMyKCksZj1hLl9uZXh0VWludDMyKCksaD1hLl9uZXh0VWludDMyKCksZz1hLl9uZXh0VWludDY0KCkscD1hLl9uZXh0VWludDY0KCkseD1uZXcgYyh0LGUubGVuZ3RoK3MsMypyKjgsITApO2ZvcihsZXQgZT0wO2U8cjtlKyspaS5sZXZlbHMucHVzaCh7bGV2ZWxEYXRhOm5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCt4Ll9uZXh0VWludDY0KCkseC5fbmV4dFVpbnQ2NCgpKSx1bmNvbXByZXNzZWRCeXRlTGVuZ3RoOnguX25leHRVaW50NjQoKX0pO2NvbnN0IHU9bmV3IGModCxvLGwsITApLHk9e3ZlbmRvcklkOnUuX3NraXAoNCkuX25leHRVaW50MTYoKSxkZXNjcmlwdG9yVHlwZTp1Ll9uZXh0VWludDE2KCksdmVyc2lvbk51bWJlcjp1Ll9uZXh0VWludDE2KCksZGVzY3JpcHRvckJsb2NrU2l6ZTp1Ll9uZXh0VWludDE2KCksY29sb3JNb2RlbDp1Ll9uZXh0VWludDgoKSxjb2xvclByaW1hcmllczp1Ll9uZXh0VWludDgoKSx0cmFuc2ZlckZ1bmN0aW9uOnUuX25leHRVaW50OCgpLGZsYWdzOnUuX25leHRVaW50OCgpLHRleGVsQmxvY2tEaW1lbnNpb246e3g6dS5fbmV4dFVpbnQ4KCkrMSx5OnUuX25leHRVaW50OCgpKzEsejp1Ll9uZXh0VWludDgoKSsxLHc6dS5fbmV4dFVpbnQ4KCkrMX0sYnl0ZXNQbGFuZTpbdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCldLHNhbXBsZXM6W119LEQ9KHkuZGVzY3JpcHRvckJsb2NrU2l6ZS80LTYpLzQ7Zm9yKGxldCB0PTA7dDxEO3QrKyl5LnNhbXBsZXNbdF09e2JpdE9mZnNldDp1Ll9uZXh0VWludDE2KCksYml0TGVuZ3RoOnUuX25leHRVaW50OCgpLGNoYW5uZWxJRDp1Ll9uZXh0VWludDgoKSxzYW1wbGVQb3NpdGlvbjpbdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCksdS5fbmV4dFVpbnQ4KCldLHNhbXBsZUxvd2VyOnUuX25leHRVaW50MzIoKSxzYW1wbGVVcHBlcjp1Ll9uZXh0VWludDMyKCl9O2kuZGF0YUZvcm1hdERlc2NyaXB0b3IubGVuZ3RoPTAsaS5kYXRhRm9ybWF0RGVzY3JpcHRvci5wdXNoKHkpO2NvbnN0IGI9bmV3IGModCxmLGgsITApO2Zvcig7Yi5fb2Zmc2V0PGg7KXtjb25zdCB0PWIuX25leHRVaW50MzIoKSxlPWIuX3NjYW4odCksbj1fKGUpLHM9Yi5fc2Nhbih0LWUuYnl0ZUxlbmd0aCk7aS5rZXlWYWx1ZVtuXT1uLm1hdGNoKC9ea3R4L2kpP18ocyk6cyxiLl9vZmZzZXQlNCYmYi5fc2tpcCg0LWIuX29mZnNldCU0KX1pZihwPD0wKXJldHVybiBpO2NvbnN0IGQ9bmV3IGModCxnLHAsITApLEI9ZC5fbmV4dFVpbnQxNigpLHc9ZC5fbmV4dFVpbnQxNigpLEE9ZC5fbmV4dFVpbnQzMigpLFM9ZC5fbmV4dFVpbnQzMigpLG09ZC5fbmV4dFVpbnQzMigpLEw9ZC5fbmV4dFVpbnQzMigpLEk9W107Zm9yKGxldCB0PTA7dDxyO3QrKylJLnB1c2goe2ltYWdlRmxhZ3M6ZC5fbmV4dFVpbnQzMigpLHJnYlNsaWNlQnl0ZU9mZnNldDpkLl9uZXh0VWludDMyKCkscmdiU2xpY2VCeXRlTGVuZ3RoOmQuX25leHRVaW50MzIoKSxhbHBoYVNsaWNlQnl0ZU9mZnNldDpkLl9uZXh0VWludDMyKCksYWxwaGFTbGljZUJ5dGVMZW5ndGg6ZC5fbmV4dFVpbnQzMigpfSk7Y29uc3QgUj1nK2QuX29mZnNldCxFPVIrQSxUPUUrUyxPPVQrbSxQPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtSLEEpLEM9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K0UsUyksRj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrVCxtKSxHPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtPLEwpO3JldHVybiBpLmdsb2JhbERhdGE9e2VuZHBvaW50Q291bnQ6QixzZWxlY3RvckNvdW50OncsaW1hZ2VEZXNjczpJLGVuZHBvaW50c0RhdGE6UCxzZWxlY3RvcnNEYXRhOkMsdGFibGVzRGF0YTpGLGV4dGVuZGVkRGF0YTpHfSxpfWZ1bmN0aW9uIHgoKXtyZXR1cm4oeD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciBpIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4saSkmJih0W2ldPW5baV0pfXJldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNvbnN0IHU9e2tlZXBXcml0ZXI6ITF9O2Z1bmN0aW9uIHkobixzPXt9KXtzPXgoe30sdSxzKTtsZXQgYT1uZXcgQXJyYXlCdWZmZXIoMCk7aWYobi5nbG9iYWxEYXRhKXtjb25zdCB0PW5ldyBBcnJheUJ1ZmZlcigyMCs1Km4uZ2xvYmFsRGF0YS5pbWFnZURlc2NzLmxlbmd0aCo0KSxlPW5ldyBEYXRhVmlldyh0KTtlLnNldFVpbnQxNigwLG4uZ2xvYmFsRGF0YS5lbmRwb2ludENvdW50LCEwKSxlLnNldFVpbnQxNigyLG4uZ2xvYmFsRGF0YS5zZWxlY3RvckNvdW50LCEwKSxlLnNldFVpbnQzMig0LG4uZ2xvYmFsRGF0YS5lbmRwb2ludHNEYXRhLmJ5dGVMZW5ndGgsITApLGUuc2V0VWludDMyKDgsbi5nbG9iYWxEYXRhLnNlbGVjdG9yc0RhdGEuYnl0ZUxlbmd0aCwhMCksZS5zZXRVaW50MzIoMTIsbi5nbG9iYWxEYXRhLnRhYmxlc0RhdGEuYnl0ZUxlbmd0aCwhMCksZS5zZXRVaW50MzIoMTYsbi5nbG9iYWxEYXRhLmV4dGVuZGVkRGF0YS5ieXRlTGVuZ3RoLCEwKTtmb3IobGV0IHQ9MDt0PG4uZ2xvYmFsRGF0YS5pbWFnZURlc2NzLmxlbmd0aDt0Kyspe2NvbnN0IGk9bi5nbG9iYWxEYXRhLmltYWdlRGVzY3NbdF07ZS5zZXRVaW50MzIoMjArNSp0KjQrMCxpLmltYWdlRmxhZ3MsITApLGUuc2V0VWludDMyKDIwKzUqdCo0KzQsaS5yZ2JTbGljZUJ5dGVPZmZzZXQsITApLGUuc2V0VWludDMyKDIwKzUqdCo0KzgsaS5yZ2JTbGljZUJ5dGVMZW5ndGgsITApLGUuc2V0VWludDMyKDIwKzUqdCo0KzEyLGkuYWxwaGFTbGljZUJ5dGVPZmZzZXQsITApLGUuc2V0VWludDMyKDIwKzUqdCo0KzE2LGkuYWxwaGFTbGljZUJ5dGVMZW5ndGgsITApfWE9ZyhbdCxuLmdsb2JhbERhdGEuZW5kcG9pbnRzRGF0YSxuLmdsb2JhbERhdGEuc2VsZWN0b3JzRGF0YSxuLmdsb2JhbERhdGEudGFibGVzRGF0YSxuLmdsb2JhbERhdGEuZXh0ZW5kZWREYXRhXSl9Y29uc3Qgcj1bXTtsZXQgbz1uLmtleVZhbHVlO3Mua2VlcFdyaXRlcnx8KG89eCh7fSxuLmtleVZhbHVlLHtLVFh3cml0ZXI6XCJLVFgtUGFyc2UgdjAuMi4yXCJ9KSk7Zm9yKGNvbnN0IGUgaW4gbyl7Y29uc3Qgbj1vW2VdLGk9aChlKSxzPVwic3RyaW5nXCI9PXR5cGVvZiBuP2gobik6bixhPWkuYnl0ZUxlbmd0aCsxK3MuYnl0ZUxlbmd0aCsxLGw9YSU0PzQtYSU0OjA7ci5wdXNoKGcoW25ldyBVaW50MzJBcnJheShbYV0pLGksdCxzLHQsbmV3IFVpbnQ4QXJyYXkobCkuZmlsbCgwKV0pKX1jb25zdCBsPWcocik7aWYoMSE9PW4uZGF0YUZvcm1hdERlc2NyaXB0b3IubGVuZ3RofHxuLmRhdGFGb3JtYXREZXNjcmlwdG9yWzBdLmRlc2NyaXB0b3JUeXBlIT09aS5CQVNJQ0ZPUk1BVCl0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IEJBU0lDRk9STUFUIERhdGEgRm9ybWF0IERlc2NyaXB0b3Igb3V0cHV0IHN1cHBvcnRlZC5cIik7Y29uc3QgZj1uLmRhdGFGb3JtYXREZXNjcmlwdG9yWzBdLFU9bmV3IEFycmF5QnVmZmVyKDI4KzE2KmYuc2FtcGxlcy5sZW5ndGgpLGM9bmV3IERhdGFWaWV3KFUpO2Muc2V0VWludDMyKDAsVS5ieXRlTGVuZ3RoLCEwKSxjLnNldFVpbnQxNig0LGYudmVuZG9ySWQsITApLGMuc2V0VWludDE2KDYsZi5kZXNjcmlwdG9yVHlwZSwhMCksYy5zZXRVaW50MTYoOCxmLnZlcnNpb25OdW1iZXIsITApLGMuc2V0VWludDE2KDEwLGYuZGVzY3JpcHRvckJsb2NrU2l6ZSwhMCksYy5zZXRVaW50OCgxMixmLmNvbG9yTW9kZWwpLGMuc2V0VWludDgoMTMsZi5jb2xvclByaW1hcmllcyksYy5zZXRVaW50OCgxNCxmLnRyYW5zZmVyRnVuY3Rpb24pLGMuc2V0VWludDgoMTUsZi5mbGFncyksYy5zZXRVaW50OCgxNixmLnRleGVsQmxvY2tEaW1lbnNpb24ueC0xKSxjLnNldFVpbnQ4KDE3LGYudGV4ZWxCbG9ja0RpbWVuc2lvbi55LTEpLGMuc2V0VWludDgoMTgsZi50ZXhlbEJsb2NrRGltZW5zaW9uLnotMSksYy5zZXRVaW50OCgxOSxmLnRleGVsQmxvY2tEaW1lbnNpb24udy0xKTtmb3IobGV0IHQ9MDt0PDg7dCsrKWMuc2V0VWludDgoMjArdCxmLmJ5dGVzUGxhbmVbdF0pO2ZvcihsZXQgdD0wO3Q8Zi5zYW1wbGVzLmxlbmd0aDt0Kyspe2NvbnN0IGU9Zi5zYW1wbGVzW3RdLG49MjgrMTYqdDtjLnNldFVpbnQxNihuKzAsZS5iaXRPZmZzZXQsITApLGMuc2V0VWludDgobisyLGUuYml0TGVuZ3RoKSxjLnNldFVpbnQ4KG4rMyxlLmNoYW5uZWxJRCksYy5zZXRVaW50OChuKzQsZS5zYW1wbGVQb3NpdGlvblswXSksYy5zZXRVaW50OChuKzUsZS5zYW1wbGVQb3NpdGlvblsxXSksYy5zZXRVaW50OChuKzYsZS5zYW1wbGVQb3NpdGlvblsyXSksYy5zZXRVaW50OChuKzcsZS5zYW1wbGVQb3NpdGlvblszXSksYy5zZXRVaW50MzIobis4LGUuc2FtcGxlTG93ZXIsITApLGMuc2V0VWludDMyKG4rMTIsZS5zYW1wbGVVcHBlciwhMCl9Y29uc3QgXz1lLmxlbmd0aCs2OCszKm4ubGV2ZWxzLmxlbmd0aCo4LHA9XytVLmJ5dGVMZW5ndGg7bGV0IHk9cCtsLmJ5dGVMZW5ndGg7eSU4JiYoeSs9OC15JTgpO2NvbnN0IEQ9W10sYj1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDMqbi5sZXZlbHMubGVuZ3RoKjgpKTtsZXQgZD15K2EuYnl0ZUxlbmd0aDtmb3IobGV0IHQ9MDt0PG4ubGV2ZWxzLmxlbmd0aDt0Kyspe2NvbnN0IGU9bi5sZXZlbHNbdF07RC5wdXNoKGUubGV2ZWxEYXRhKSxiLnNldEJpZ1VpbnQ2NCgyNCp0KzAsQmlnSW50KGQpLCEwKSxiLnNldEJpZ1VpbnQ2NCgyNCp0KzgsQmlnSW50KGUubGV2ZWxEYXRhLmJ5dGVMZW5ndGgpLCEwKSxiLnNldEJpZ1VpbnQ2NCgyNCp0KzE2LEJpZ0ludChlLnVuY29tcHJlc3NlZEJ5dGVMZW5ndGgpLCEwKSxkKz1lLmxldmVsRGF0YS5ieXRlTGVuZ3RofWNvbnN0IEI9bmV3IEFycmF5QnVmZmVyKDY4KSx3PW5ldyBEYXRhVmlldyhCKTtyZXR1cm4gdy5zZXRVaW50MzIoMCxuLnZrRm9ybWF0LCEwKSx3LnNldFVpbnQzMig0LG4udHlwZVNpemUsITApLHcuc2V0VWludDMyKDgsbi5waXhlbFdpZHRoLCEwKSx3LnNldFVpbnQzMigxMixuLnBpeGVsSGVpZ2h0LCEwKSx3LnNldFVpbnQzMigxNixuLnBpeGVsRGVwdGgsITApLHcuc2V0VWludDMyKDIwLG4ubGF5ZXJDb3VudCwhMCksdy5zZXRVaW50MzIoMjQsbi5mYWNlQ291bnQsITApLHcuc2V0VWludDMyKDI4LG4ubGV2ZWxzLmxlbmd0aCwhMCksdy5zZXRVaW50MzIoMzIsbi5zdXBlcmNvbXByZXNzaW9uU2NoZW1lLCEwKSx3LnNldFVpbnQzMigzNixfLCEwKSx3LnNldFVpbnQzMig0MCxVLmJ5dGVMZW5ndGgsITApLHcuc2V0VWludDMyKDQ0LHAsITApLHcuc2V0VWludDMyKDQ4LGwuYnl0ZUxlbmd0aCwhMCksdy5zZXRCaWdVaW50NjQoNTIsQmlnSW50KHkpLCEwKSx3LnNldEJpZ1VpbnQ2NCg2MCxCaWdJbnQoYS5ieXRlTGVuZ3RoKSwhMCksbmV3IFVpbnQ4QXJyYXkoZyhbbmV3IFVpbnQ4QXJyYXkoZSkuYnVmZmVyLEIsYi5idWZmZXIsVSxsLG5ldyBBcnJheUJ1ZmZlcih5LShwK2wuYnl0ZUxlbmd0aCkpLGEsLi4uRF0pKX1leHBvcnR7bCBhcyBLVFgyQ2hhbm5lbEVUQzFTLGYgYXMgS1RYMkNoYW5uZWxVQVNUQyxVIGFzIEtUWDJDb250YWluZXIsaSBhcyBLVFgyRGVzY3JpcHRvclR5cGUsbyBhcyBLVFgyRmxhZ3MscyBhcyBLVFgyTW9kZWwsYSBhcyBLVFgyUHJpbWFyaWVzLG4gYXMgS1RYMlN1cGVyY29tcHJlc3Npb25TY2hlbWUsciBhcyBLVFgyVHJhbnNmZXIscCBhcyByZWFkLHkgYXMgd3JpdGV9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a3R4LXBhcnNlLm1vZGVybi5qcy5tYXBcbiIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbmluIHZlYzMgdl9jb2xvcjtcXG5pbiB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxuaW4gdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuaW4gdmVjMiB2X3RleGNvb3JkXzA7XFxuaW4gdmVjMyB2X2JhcnlDZW50cmljQ29vcmQ7XFxuaW4gdmVjNCB2X3NoYWRvd0Nvb3JkO1xcblxcbnVuaWZvcm0gaW50IHVfc2hhZGluZ01vZGVsOyAvLyBpbml0aWFsVmFsdWU9MFxcbnVuaWZvcm0gZmxvYXQgdV9hbHBoYUN1dG9mZjsgLy8gaW5pdGlhbFZhbHVlPTAuMDFcXG51bmlmb3JtIGZsb2F0IHVfc2hpbmluZXNzOyAvLyBpbml0aWFsVmFsdWU9NVxcbnVuaWZvcm0gdmVjNCB1X2RpZmZ1c2VDb2xvckZhY3RvcjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSwxKVxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfZGlmZnVzZUNvbG9yVGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSgwLHdoaXRlKVxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfbm9ybWFsVGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSgxLGJsdWUpXFxudW5pZm9ybSB2ZWM0IHVfZGlmZnVzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybTsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbnVuaWZvcm0gZmxvYXQgdV9kaWZmdXNlQ29sb3JUZXh0dXJlUm90YXRpb247IC8vIGluaXRpYWxWYWx1ZT0wXFxudW5pZm9ybSBzYW1wbGVyMkRTaGFkb3cgdV9kZXB0aFRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMix3aGl0ZSlcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuLy8gI3ByYWdtYSBzaGFkZXJpdHk6IHJlcXVpcmUoLi4vY29tbW9uL2RlbGlvdDIwMTlTZWFtbGVzc1RleHR1cmUuZ2xzbClcXG4vLyB1bmlmb3JtIHNhbXBsZXIyRCB1X3RJbnZUZXh0dXJlOyAvLyBpbml0aWFsVmFsdWU9KDEsd2hpdGUpXFxuLy8gdW5pZm9ybSB2ZWMzIHVfY29sb3JTcGFjZU9yaWdpbjtcXG4vLyB1bmlmb3JtIHZlYzMgdV9jb2xvclNwYWNlVmVjdG9yMTtcXG4vLyB1bmlmb3JtIHZlYzMgdV9jb2xvclNwYWNlVmVjdG9yMjtcXG4vLyB1bmlmb3JtIHZlYzMgdV9jb2xvclNwYWNlVmVjdG9yMztcXG4vLyB1bmlmb3JtIHZlYzQgdV9zY2FsZVRyYW5zbGF0ZTtcXG5cXG5cXG52ZWMyIHV2VHJhbnNmb3JtKHZlYzIgc2NhbGUsIHZlYzIgb2Zmc2V0LCBmbG9hdCByb3RhdGlvbiwgdmVjMiB1dikge1xcbiAgbWF0MyB0cmFuc2xhdGlvbk1hdCA9IG1hdDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbWF0MyByb3RhdGlvbk1hdCA9IG1hdDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbWF0MyBzY2FsZU1hdCA9IG1hdDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBtYXQzIG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIHZlYzIgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjMyh1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5zdHJ1Y3QgTGlnaHQge1xcbiAgaW50IHR5cGU7IC8vIDAgPSBkaXJlY3Rpb25hbCwgMSA9IHBvaW50LCAyID0gc3BvdFxcbiAgdmVjMyBwb3NpdGlvbjtcXG4gIHZlYzMgaW50ZW5zaXR5O1xcbiAgdmVjMyBhdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiAgdmVjMyBkaXJlY3Rpb25PZkxpZ2h0T2JqZWN0O1xcbiAgdmVjMyBkaXJlY3Rpb247IC8vIGRpcmVjdGlvbiBvZiBsaWdodCB2ZWN0b3IsIGVxdWFsIHRvIG5vcm1hbGl6ZShsaWdodC5wb2ludFRvTGlnaHQpXFxuICB2ZWMzIHBvaW50VG9MaWdodDsgLy8gbm90IG5vcm1hbGl6ZWRcXG4gIGZsb2F0IHNwb3RBbmdsZVNjYWxlO1xcbiAgZmxvYXQgc3BvdEFuZ2xlT2Zmc2V0O1xcbiAgZmxvYXQgZWZmZWN0aXZlUmFuZ2U7XFxufTtcXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNyYW5nZS1wcm9wZXJ0eVxcbmZsb2F0IGdldFJhbmdlQXR0ZW51YXRpb24oTGlnaHQgbGlnaHQpXFxue1xcbiAgZmxvYXQgZGlzdGFuY2UgPSBsZW5ndGgobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gIC8vIG1lYW5zIG5vIHJhbmdlIGxpbWl0XFxuICBpZiAobGlnaHQuZWZmZWN0aXZlUmFuZ2UgPD0gMC4wKVxcbiAge1xcbiAgICByZXR1cm4gMS4wIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbiAgfVxcbiAgcmV0dXJuIG1heChtaW4oMS4wIC0gcG93KGRpc3RhbmNlIC8gbGlnaHQuZWZmZWN0aXZlUmFuZ2UsIDQuMCksIDEuMCksIDAuMCkgLyBwb3coZGlzdGFuY2UsIDIuMCk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9saWdodHNfcHVuY3R1YWwvUkVBRE1FLm1kI2lubmVyLWFuZC1vdXRlci1jb25lLWFuZ2xlc1xcbmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbihMaWdodCBsaWdodClcXG57XFxuXFxuICBmbG9hdCBjZCA9IGRvdChsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0LCBsaWdodC5kaXJlY3Rpb24pO1xcbiAgZmxvYXQgYW5ndWxhckF0dGVudWF0aW9uID0gY2xhbXAoY2QgKiBsaWdodC5zcG90QW5nbGVTY2FsZSArIGxpZ2h0LnNwb3RBbmdsZU9mZnNldCwgMC4wLCAxLjApO1xcbiAgcmV0dXJuIGFuZ3VsYXJBdHRlbnVhdGlvbjtcXG59XFxuXFxudm9pZCBnZXRMaWdodEF0dGVudWF0ZWQoTGlnaHQgbGlnaHQpIHtcXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICAvLyBpZiAobGlnaHQudHlwZSA9PSAwKSB7IC8vIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIC8vIERpcmVjdGlvbmFsIExpZ2h0IGRvbid0IGF0dGVudWF0ZSBnZW9tZXRpY2FsbHlcXG4gIC8vIH1cXG5cXG4gIC8vIFBvaW50IExpZ2h0XFxuICBpZiAobGlnaHQudHlwZSA9PSAxKVxcbiAge1xcbiAgICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ICo9IGdldFJhbmdlQXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcbiAgLy8gU3BvdCBsaWdodFxcbiAgaWYgKGxpZ2h0LnR5cGUgPT0gMilcXG4gIHtcXG4gICAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSAqPSBnZXRTcG90QXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcbn1cXG5cXG5MaWdodCBnZXRMaWdodChpbnQgbGlnaHRJZHgsIHZlYzMgdl9wb3NpdGlvbl9pbldvcmxkKSB7XFxuICB2ZWMzIGxpZ2h0UG9zaXRpb24gPSBnZXRfbGlnaHRQb3NpdGlvbigwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzMgZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0ID0gZ2V0X2xpZ2h0RGlyZWN0aW9uKDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjMyBsaWdodEludGVuc2l0eSA9IGdldF9saWdodEludGVuc2l0eSgwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzQgbGlnaHRQcm9wZXJ0eSA9IGdldF9saWdodFByb3BlcnR5KDAuMCwgbGlnaHRJZHgpO1xcbiAgTGlnaHQgbGlnaHQ7XFxuICBsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ID0gZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0O1xcbiAgZmxvYXQgbGlnaHRUeXBlID0gbGlnaHRQcm9wZXJ0eS54O1xcbiAgbGlnaHQuZWZmZWN0aXZlUmFuZ2UgPSBsaWdodFByb3BlcnR5Lnk7XFxuICBsaWdodC5zcG90QW5nbGVTY2FsZSA9IGxpZ2h0UHJvcGVydHkuejtcXG4gIGxpZ2h0LnNwb3RBbmdsZU9mZnNldCA9IGxpZ2h0UHJvcGVydHkudztcXG5cXG4gIGxpZ2h0LmludGVuc2l0eSA9IGxpZ2h0SW50ZW5zaXR5O1xcbiAgbGlnaHQucG9zaXRpb24gPSBsaWdodFBvc2l0aW9uO1xcbiAgaWYgKGxpZ2h0VHlwZSA8IC0wLjUpIHsgLy8gZGlzYWJsZWQgbGlnaHRcXG4gICAgbGlnaHQuaW50ZW5zaXR5ID0gdmVjMygwLjApO1xcbiAgICBsaWdodC50eXBlID0gLTE7XFxuICB9IGVsc2UgaWYgKDAuNzUgPCBsaWdodFR5cGUpIHsgLy8gaXMgcG9pbnRsaWdodCBvciBzcG90bGlnaHRcXG4gICAgbGlnaHQucG9pbnRUb0xpZ2h0ID0gbGlnaHRQb3NpdGlvbiAtIHZfcG9zaXRpb25faW5Xb3JsZDtcXG4gICAgbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKGxpZ2h0LnBvaW50VG9MaWdodCk7XFxuICAgIGxpZ2h0LnR5cGUgPSAxO1xcbiAgfSBlbHNlIHsgLy8gaXMgRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgbGlnaHQudHlwZSA9IDA7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ICogLTEuMCk7XFxuICB9XFxuXFxuICBpZiAobGlnaHRUeXBlID4gMS43NSkgeyAvLyBpcyBzcG90bGlnaHRcXG4gICAgbGlnaHQudHlwZSA9IDI7XFxuICB9XFxuXFxuICBjb25zdCBmbG9hdCBNX1BJID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuICBsaWdodC5pbnRlbnNpdHkgKj0gTV9QSTsgLy8gUHVuY3R1YWwgTGlnaHRcXG5cXG4gIC8vIEF0dGVudWF0aW9uXFxuICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xcbiAgZ2V0TGlnaHRBdHRlbnVhdGVkKGxpZ2h0KTtcXG5cXG4gIHJldHVybiBsaWdodDtcXG59XFxuXFxuXFxudm9pZCBtYWluICgpXFxue1xcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIC8vIE5vcm1hbFxcbiAgdmVjMyBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZSh2X25vcm1hbF9pbldvcmxkKTtcXG5cXG4gIHZlYzQgZGlmZnVzZUNvbG9yRmFjdG9yID0gZ2V0X2RpZmZ1c2VDb2xvckZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuXFxuXFxuICAvLyBkaWZmdXNlQ29sb3IgKENvbnNpZGVyZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBhbHBoYSlcXG4gIHZlYzMgZGlmZnVzZUNvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gIGZsb2F0IGFscGhhID0gMS4wO1xcbiAgaWYgKHZfY29sb3IgIT0gZGlmZnVzZUNvbG9yICYmIGRpZmZ1c2VDb2xvckZhY3Rvci5yZ2IgIT0gZGlmZnVzZUNvbG9yKSB7XFxuICAgIGRpZmZ1c2VDb2xvciA9IHZfY29sb3IgKiBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGRpZmZ1c2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmICh2X2NvbG9yID09IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGRpZmZ1c2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmIChkaWZmdXNlQ29sb3JGYWN0b3IucmdiID09IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSB2X2NvbG9yO1xcbiAgfSBlbHNlIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gdmVjMygxLjAsIDEuMCwgMS4wKTtcXG4gIH1cXG5cXG4gIC8vIGRpZmZ1c2VDb2xvclRleHR1cmUgKENvbnNpZGVyZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBhbHBoYSlcXG4gIHZlYzQgZGlmZnVzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9kaWZmdXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IGRpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbiA9IGdldF9kaWZmdXNlQ29sb3JUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBkaWZmdXNlQ29sb3JUZXhVdiA9IHV2VHJhbnNmb3JtKGRpZmZ1c2VDb2xvclRleHR1cmVUcmFuc2Zvcm0ueHksIGRpZmZ1c2VDb2xvclRleHR1cmVUcmFuc2Zvcm0uencsIGRpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbiwgdl90ZXhjb29yZF8wKTtcXG4gIHZlYzQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZSh1X2RpZmZ1c2VDb2xvclRleHR1cmUsIGRpZmZ1c2VDb2xvclRleFV2KTtcXG4gIGRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlQ29sb3IucmdiO1xcbiAgYWxwaGEgKj0gdGV4dHVyZUNvbG9yLmE7XFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfTUFTS1xcbiAgZmxvYXQgYWxwaGFDdXRvZmYgPSBnZXRfYWxwaGFDdXRvZmYobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYgKGFscGhhIDwgYWxwaGFDdXRvZmYpIHtcXG4gICAgZGlzY2FyZDtcXG4gIH1cXG4jZW5kaWZcXG5cXG5cXG4gIC8vIExpZ2h0aW5nXFxuICB2ZWMzIHNoYWRpbmdDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICBpbnQgc2hhZGluZ01vZGVsID0gZ2V0X3NoYWRpbmdNb2RlbChtYXRlcmlhbFNJRCwgMCk7XFxuICBpZiAoc2hhZGluZ01vZGVsID4gMCkge1xcblxcbiAgICB2ZWMzIGRpZmZ1c2UgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xcbiAgICB2ZWMzIHNwZWN1bGFyID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAvKiBzaGFkZXJpdHk6IEB7Q29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXJ9ICovIDsgaSsrKSB7XFxuICAgICAgaWYgKGkgPj0gbGlnaHROdW1iZXIpIHtcXG4gICAgICAgIGJyZWFrO1xcbiAgICAgIH1cXG5cXG4gICAgICAvLyBMaWdodFxcbiAgICAgIExpZ2h0IGxpZ2h0ID0gZ2V0TGlnaHQoaSwgdl9wb3NpdGlvbl9pbldvcmxkLnh5eik7XFxuXFxuICAgICAgLy8gRGlmZnVzZVxcbiAgICAgIGRpZmZ1c2UgKz0gZGlmZnVzZUNvbG9yICogbWF4KDAuMCwgZG90KG5vcm1hbF9pbldvcmxkLCBsaWdodC5kaXJlY3Rpb24pKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuXFxuICAgICAgZmxvYXQgc2hpbmluZXNzID0gZ2V0X3NoaW5pbmVzcyhtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgaW50IHNoYWRpbmdNb2RlbCA9IGdldF9zaGFkaW5nTW9kZWwobWF0ZXJpYWxTSUQsIDApO1xcblxcbiAgICAgIHZlYzMgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcblxcbiAgICAgIC8vIFNwZWN1bGFyXFxuICAgICAgaWYgKHNoYWRpbmdNb2RlbCA9PSAyKSB7Ly8gQkxJTk5cXG4gICAgICAgIC8vIFZpZXdEaXJlY3Rpb25cXG4gICAgICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2aWV3UG9zaXRpb24gLSB2X3Bvc2l0aW9uX2luV29ybGQueHl6KTtcXG4gICAgICAgIHZlYzMgaGFsZlZlY3RvciA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyZWN0aW9uKTtcXG4gICAgICAgIHNwZWN1bGFyICs9IHBvdyhtYXgoMC4wLCBkb3QoaGFsZlZlY3Rvciwgbm9ybWFsX2luV29ybGQpKSwgc2hpbmluZXNzKTtcXG4gICAgICB9IGVsc2UgaWYgKHNoYWRpbmdNb2RlbCA9PSAzKSB7IC8vIFBIT05HXFxuICAgICAgICB2ZWMzIHZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodmlld1Bvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkLnh5eik7XFxuICAgICAgICB2ZWMzIFIgPSByZWZsZWN0KGxpZ2h0LmRpcmVjdGlvbiwgbm9ybWFsX2luV29ybGQpO1xcbiAgICAgICAgc3BlY3VsYXIgKz0gcG93KG1heCgwLjAsIGRvdChSLCB2aWV3RGlyZWN0aW9uKSksIHNoaW5pbmVzcyk7XFxuICAgICAgfVxcblxcbiAgICB9XFxuXFxuICAgIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2UgKyBzcGVjdWxhcjtcXG4gIH0gZWxzZSB7XFxuICAgIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2VDb2xvcjtcXG4gIH1cXG4jZWxzZVxcbiAgc2hhZGluZ0NvbG9yID0gZGlmZnVzZUNvbG9yO1xcbiNlbmRpZlxcblxcbiAgLy8gU2hhZG93XFxuI2lmZGVmIFJOX1VTRV9TSEFET1dfTUFQUElOR1xcbiAgZmxvYXQgdmlzaWJpbGl0eSA9IDEuMDtcXG4gIGZsb2F0IGJpYXMgPSAwLjAwMTtcXG5cXG4gIC8vIE5vbiBQQ0ZcXG4gIC8vIGlmICggdGV4dHVyZVByb2ooIHVfZGVwdGhUZXh0dXJlLCB2X3NoYWRvd0Nvb3JkICkuciAgPCAodl9zaGFkb3dDb29yZC56IC0gYmlhcykgLyB2X3NoYWRvd0Nvb3JkLncgKSB7XFxuICAvLyAgIHZpc2liaWxpdHkgPSAwLjU7XFxuICAvLyB9XFxuICAvLyBzaGFkaW5nQ29sb3IgKj0gdmlzaWJpbGl0eTtcXG5cXG4gIC8vIEhhcmR3YXJlIFBDRlxcbiAgdmVjNCBzaGFkb3dDb29yZCA9IHZfc2hhZG93Q29vcmQ7XFxuICBzaGFkb3dDb29yZC56IC09IGJpYXM7XFxuICBzaGFkaW5nQ29sb3IgKj0gdGV4dHVyZVByb2ooIHVfZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCApICogMC41ICsgMC41O1xcblxcbiAgLy8gc2hhZGluZ0NvbG9yLnJnYiA9IHRleHR1cmUoIHVfZGVwdGhUZXh0dXJlLCB2X3NoYWRvd0Nvb3JkLnh5ICkucnJyO1xcbiAgLy8gc2hhZGluZ0NvbG9yLnJnYiA9IHZlYzModl9zaGFkb3dDb29yZC54eSwgMC4wKTtcXG4gIC8vIHNoYWRpbmdDb2xvci5yZ2IgPSB2ZWMzKGRpZmZ1c2VDb2xvclRleFV2LCAwLjApO1xcbiAgLy8gc2hhZGluZ0NvbG9yLnJnYiA9IHZlYzModGV4dHVyZSggdV9kZXB0aFRleHR1cmUsIGRpZmZ1c2VDb2xvclRleFV2KS5ycnIpO1xcbiAgLy8gc2hhZGluZ0NvbG9yLnJnYiA9IHRleHR1cmUoIHVfZGVwdGhUZXh0dXJlLCBkaWZmdXNlQ29sb3JUZXhVdikucmdiO1xcbiAgLy8gc2hhZGluZ0NvbG9yLnJnYiA9IHZlYzModGV4dHVyZVByb2ooIHVfZGVwdGhUZXh0dXJlLCB2X3NoYWRvd0Nvb3JkICkueiwgMC4wLCAwLjApO1xcbiAgYWxwaGEgPSAxLjA7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfQkxFTkRcXG4jZWxzZVxcbiAgYWxwaGEgPSAxLjA7XFxuI2VuZGlmXFxuXFxuICBydDAgPSB2ZWM0KHNoYWRpbmdDb2xvciAqIGFscGhhLCBhbHBoYSk7XFxuICAvLyBydDAgPSB2ZWM0KHVfbGlnaHROdW1iZXIsIDAuMCwgMC4wLCAxLjApO1xcbiAgLy8gcnQwID0gdmVjNCgxLjAsIDAuMCwgMC4wLCAxLjApO1xcbiAgLy8gcnQwID0gdmVjNChub3JtYWxfaW5Xb3JsZCowLjUrMC41LCAxLjApO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4gIGxheW91dChudW1fdmlld3M9MikgaW47XFxuI2VuZGlmXFxuXFxuaW4gdmVjMyBhX3Bvc2l0aW9uO1xcbmluIHZlYzMgYV9jb2xvcjtcXG5pbiB2ZWMzIGFfbm9ybWFsO1xcbmluIHZlYzQgYV9pbnN0YW5jZUluZm87XFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxuaW4gdmVjNCBhX2pvaW50O1xcbmluIHZlYzQgYV93ZWlnaHQ7XFxuaW4gdmVjNCBhX2JhcnlDZW50cmljQ29vcmQ7XFxub3V0IHZlYzMgdl9jb2xvcjtcXG5vdXQgdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbm91dCB2ZWM0IHZfcG9zaXRpb25faW5Xb3JsZDtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxub3V0IHZlYzMgdl9iYXJ5Q2VudHJpY0Nvb3JkO1xcbm91dCB2ZWM0IHZfc2hhZG93Q29vcmQ7XFxuXFxudW5pZm9ybSBmbG9hdCB1X3BvaW50U2l6ZTsgLy8gaW5pdGlhbFZhbHVlPTMwXFxudW5pZm9ybSB2ZWMzIHVfcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uOyAvLyBpbml0aWFsVmFsdWU9KDAsMC4xLDAuMDEpXFxuXFxuLy8gQmlhc01hdHJpeCAqIExpZ2h0UHJvamVjdGlvbk1hdHJpeCAqIExpZ2h0Vmlld01hdHJpeCwgU2VlOiBodHRwOi8vd3d3Lm9wZW5nbC10dXRvcmlhbC5vcmcvaW50ZXJtZWRpYXRlLXR1dG9yaWFscy90dXRvcmlhbC0xNi1zaGFkb3ctbWFwcGluZy8jYmFzaWMtc2hhZGVyXFxudW5pZm9ybSBtYXQ0IHVfZGVwdGhCaWFzUFY7IC8vIGluaXRpYWxWYWx1ZT0oMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSlcXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5tYXQzIHRvTm9ybWFsTWF0cml4KG1hdDQgbSkge1xcbiAgZmxvYXQgYTAwID0gbVswXVswXSwgYTAxID0gbVswXVsxXSwgYTAyID0gbVswXVsyXSwgYTAzID0gbVswXVszXSxcXG4gIGExMCA9IG1bMV1bMF0sIGExMSA9IG1bMV1bMV0sIGExMiA9IG1bMV1bMl0sIGExMyA9IG1bMV1bM10sXFxuICBhMjAgPSBtWzJdWzBdLCBhMjEgPSBtWzJdWzFdLCBhMjIgPSBtWzJdWzJdLCBhMjMgPSBtWzJdWzNdLFxcbiAgYTMwID0gbVszXVswXSwgYTMxID0gbVszXVsxXSwgYTMyID0gbVszXVsyXSwgYTMzID0gbVszXVszXTtcXG5cXG4gIGZsb2F0IGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcXG4gIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcXG4gIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcXG4gIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcXG4gIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcXG4gIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcXG4gIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcXG4gIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcXG4gIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcXG4gIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcXG4gIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcXG4gIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcXG5cXG4gIGZsb2F0IGRldGVybWluYW50VmFsID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xcblxcbiAgcmV0dXJuIG1hdDMoXFxuICAgIGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSwgYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3LCBhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYsXFxuICAgIGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSwgYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3LCBhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYsXFxuICAgIGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMywgYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxLCBhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApIC8gZGV0ZXJtaW5hbnRWYWw7XFxufVxcblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcblxcbmhpZ2hwIG1hdDQgY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKCBoaWdocCB2ZWM0IHF1YXRlcm5pb24sIGhpZ2hwIHZlYzMgdHJhbnNsYXRpb24sIGhpZ2hwIHZlYzMgc2NhbGUgKSB7XFxuICBoaWdocCB2ZWM0IHEgPSBxdWF0ZXJuaW9uO1xcbiAgaGlnaHAgdmVjMyB0ID0gdHJhbnNsYXRpb247XFxuXFxuICBoaWdocCBmbG9hdCBzeCA9IHEueCAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHN5ID0gcS55ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgc3ogPSBxLnogKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeCA9IHEueSAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN5ID0gcS54ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ogPSBxLnggKiBxLnk7XFxuICBoaWdocCBmbG9hdCB3eCA9IHEudyAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHd5ID0gcS53ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ogPSBxLncgKiBxLno7XFxuXFxuICBoaWdocCBtYXQ0IG1hdCA9IG1hdDQoXFxuICAgIDEuMCAtIDIuMCAqIChzeSArIHN6KSwgMi4wICogKGN6ICsgd3opLCAyLjAgKiAoY3kgLSB3eSksIDAuMCxcXG4gICAgMi4wICogKGN6IC0gd3opLCAxLjAgLSAyLjAgKiAoc3ggKyBzeiksIDIuMCAqIChjeCArIHd4KSwgMC4wLFxcbiAgICAyLjAgKiAoY3kgKyB3eSksIDIuMCAqIChjeCAtIHd4KSwgMS4wIC0gMi4wICogKHN4ICsgc3kpLCAwLjAsXFxuICAgIHQueCwgdC55LCB0LnosIDEuMFxcbiAgKTtcXG5cXG4gIGhpZ2hwIG1hdDQgdW5pZm9ybVNjYWxlTWF0ID0gbWF0NChcXG4gICAgc2NhbGUueCwgMC4wLCAwLjAsIDAuMCxcXG4gICAgMC4wLCBzY2FsZS55LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIHNjYWxlLnosIDAuMCxcXG4gICAgMC4wLCAwLjAsIDAuMCwgMS4wXFxuICApO1xcblxcbiAgcmV0dXJuIG1hdCp1bmlmb3JtU2NhbGVNYXQ7XFxufVxcblxcbmhpZ2hwIHZlYzQgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChoaWdocCB2ZWMyIHZlY194eSwgaGlnaHAgZmxvYXQgY3JpdGVyaWEpe1xcblxcbiAgaGlnaHAgZmxvYXQgcjtcXG4gIGhpZ2hwIGZsb2F0IGc7XFxuICBoaWdocCBmbG9hdCBiO1xcbiAgaGlnaHAgZmxvYXQgYTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl4ID0gZmxvb3IodmVjX3h5LnggKiBjcml0ZXJpYSk7XFxuICBoaWdocCBmbG9hdCB2MXggPSBpeCAvIGNyaXRlcmlhO1xcbiAgaGlnaHAgZmxvYXQgdjF5ID0gaXggLSBmbG9vcih2MXgpICogY3JpdGVyaWE7XFxuXFxuICByID0gKCB2MXggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgZyA9ICggdjF5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl5ID0gZmxvb3IoIHZlY194eS55ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjJ4ID0gaXkgLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYyeSA9IGl5IC0gZmxvb3IodjJ4KSAqIGNyaXRlcmlhO1xcblxcbiAgYiA9ICggdjJ4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGEgPSAoIHYyeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICByIC09IDEuMC9jcml0ZXJpYTtcXG4gIGcgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYiAtPSAxLjAvY3JpdGVyaWE7XFxuICBhIC09IDEuMC9jcml0ZXJpYTtcXG5cXG4gIHIgPSByKjIuMC0xLjA7XFxuICBnID0gZyoyLjAtMS4wO1xcbiAgYiA9IGIqMi4wLTEuMDtcXG4gIGEgPSBhKjIuMC0xLjA7XFxuXFxuICByZXR1cm4gdmVjNChyLCBnLCBiLCBhKTtcXG59XFxuXFxubWF0NCBnZXRTa2luTWF0cml4KGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEKSB7XFxuXFxuI2lmZGVmIFJOX0JPTkVfREFUQV9UWVBFX01hdDQzeDFcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSkpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyKVxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcblxcbiAgdmVjNCB0cV94ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IHNxX3ggPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3gudywgc3FfeC53KSwgY3JpdGVyaWEueCk7XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3gueHl6LCBzcV94Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgc3FfeSA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3kudywgc3FfeS53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeS54eXosIHNxX3kueHl6KTtcXG5cXG4gIHZlYzQgdHFfeiA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBzcV96ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfei53LCBzcV96LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV96Lnh5eiwgc3Ffei54eXopO1xcblxcbiAgdmVjNCB0cV93ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICB2ZWM0IHNxX3cgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV93LncsIHNxX3cudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3cueHl6LCBzcV93Lnh5eik7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDJfT0xEKVxcbiAgdmVjNCB0c194ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgdmVjNCB0c195ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgxKVxcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ggPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1kgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ogPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1cgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcblxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZEluZm8gPSBnZXRfYm9uZUNvbXByZXNzZWRJbmZvKDAuMCwgMCk7XFxuXFxuICB2ZWM0IHRzX3ggPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1gueHksIGNyaXRlcmlhLngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnh5LCBjcml0ZXJpYS54KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi54eSwgY3JpdGVyaWEueCksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgdmVjNCB0c193ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cueHksIGNyaXRlcmlhLngpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG4jZW5kaWZcXG4gIHJldHVybiBza2luTWF0O1xcbn1cXG4jZW5kaWZcXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5ib29sIHNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQzIGluTm9ybWFsTWF0cml4LFxcbiAgb3V0IG1hdDMgb3V0Tm9ybWFsTWF0cml4LFxcbiAgaW4gdmVjMyBpblBvc2l0aW9uX2luTG9jYWwsXFxuICBvdXQgdmVjNCBvdXRQb3NpdGlvbl9pbldvcmxkLFxcbiAgaW4gdmVjMyBpbk5vcm1hbF9pbkxvY2FsLFxcbiAgb3V0IHZlYzMgb3V0Tm9ybWFsX2luV29ybGRcXG4gIClcXG57XFxuICBtYXQ0IHNraW5NYXQgPSBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lEKTtcXG4gIG91dFBvc2l0aW9uX2luV29ybGQgPSBza2luTWF0ICogdmVjNChpblBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICBvdXROb3JtYWxNYXRyaXggPSB0b05vcm1hbE1hdHJpeChza2luTWF0KTtcXG4gIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKG91dE5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcblxcbiAgcmV0dXJuIHRydWU7XFxufVxcbiNlbmRpZlxcblxcbmJvb2wgcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gIGluIG1hdDQgd29ybGRNYXRyaXgsXFxuICBpbiBtYXQ0IHZpZXdNYXRyaXgsXFxuICBpbiBib29sIGlzQmlsbGJvYXJkLFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuKSB7XFxuICBib29sIGlzU2tpbm5pbmcgPSBmYWxzZTtcXG5cXG4gIHZlYzMgcG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIGlmICh1X21vcnBoVGFyZ2V0TnVtYmVyID09IDApIHtcXG4jZW5kaWZcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGluUG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIH0gZWxzZSB7XFxuICAgIGZsb2F0IHZlcnRleElkeCA9IGFfYmFyeUNlbnRyaWNDb29yZC53O1xcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gZ2V0X3Bvc2l0aW9uKHZlcnRleElkeCwgaW5Qb3NpdGlvbl9pbkxvY2FsKTtcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIG1hdDQgd29ybGRNYXRyaXhJbm5lciA9IHdvcmxkTWF0cml4O1xcbiAgaWYgKGlzQmlsbGJvYXJkKSB7XFxuICAgIG1hdDQgaW52ZXJzZVZpZXdNYXRyaXggPSBpbnZlcnNlKHZpZXdNYXRyaXgpO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVswXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzBdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsxXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzFdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsyXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzJdO1xcbiAgICB3b3JsZE1hdHJpeElubmVyID0gaW52ZXJzZVZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeDtcXG4gIH1cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIGlmIChza2VsZXRhbENvbXBvbmVudFNJRCA+PSAwLjApIHtcXG4gICAgaXNTa2lubmluZyA9IHNraW5uaW5nKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbk5vcm1hbE1hdHJpeCwgb3V0Tm9ybWFsTWF0cml4LCBwb3NpdGlvbl9pbkxvY2FsLCBvdXRQb3NpdGlvbl9pbldvcmxkLCBpbk5vcm1hbF9pbkxvY2FsLCBvdXROb3JtYWxfaW5Xb3JsZCk7XFxuICB9IGVsc2Uge1xcbiNlbmRpZlxcbiAgICBvdXROb3JtYWxNYXRyaXggPSBpbk5vcm1hbE1hdHJpeDtcXG4gICAgb3V0UG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4SW5uZXIgKiB2ZWM0KHBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICAgIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGluTm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICB9XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gaXNTa2lubmluZztcXG59XFxuXFxuXFxudm9pZCBtYWluKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgbWF0NCB3b3JsZE1hdHJpeCA9IGdldF93b3JsZE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG4gIG1hdDQgdmlld01hdHJpeCA9IGdldF92aWV3TWF0cml4KGNhbWVyYVNJRCwgMCk7XFxuICBtYXQ0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0MyBub3JtYWxNYXRyaXggPSBnZXRfbm9ybWFsTWF0cml4KGFfaW5zdGFuY2VJbmZvLngpO1xcbiAgYm9vbCBpc0JpbGxib2FyZCA9IGdldF9pc0JpbGxib2FyZChhX2luc3RhbmNlSW5mby54KTtcXG5cXG4gIC8vIFNrZWxldGFsXFxuICBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICAgIHdvcmxkTWF0cml4LFxcbiAgICB2aWV3TWF0cml4LFxcbiAgICBpc0JpbGxib2FyZCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBub3JtYWxNYXRyaXgsXFxuICAgIGFfcG9zaXRpb24sXFxuICAgIHZfcG9zaXRpb25faW5Xb3JsZCxcXG4gICAgYV9ub3JtYWwsXFxuICAgIHZfbm9ybWFsX2luV29ybGRcXG4gICk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcblxcbiAgdl9jb2xvciA9IGFfY29sb3I7XFxuICB2X25vcm1hbF9pbldvcmxkID0gbm9ybWFsTWF0cml4ICogYV9ub3JtYWw7XFxuICB2X3RleGNvb3JkXzAgPSBhX3RleGNvb3JkXzA7XFxuICB2X2JhcnlDZW50cmljQ29vcmQgPSBhX2JhcnlDZW50cmljQ29vcmQueHl6O1xcblxcbiAgYm9vbCB2aXNpYmlsaXR5ID0gZ2V0X2lzVmlzaWJsZShhX2luc3RhbmNlSW5mby54KTtcXG4gIGlmICghdmlzaWJpbGl0eSlcXG4gIHtcXG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDAuMCk7XFxuICB9XFxuXFxuICB2X3NoYWRvd0Nvb3JkID0gZ2V0X2RlcHRoQmlhc1BWKG1hdGVyaWFsU0lELCAwKSAqIHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG4vLyAjaWZkZWYgUk5fSVNfUE9JTlRTUFJJVEVcXG5cXG52ZWM0IHBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG52ZWMzIHZpZXdQb3NpdGlvbiA9IGdldF92aWV3UG9zaXRpb24oY2FtZXJhU0lELCAwKTtcXG5mbG9hdCBkaXN0YW5jZUZyb21DYW1lcmEgPSBsZW5ndGgocG9zaXRpb25faW5Xb3JsZC54eXogLSB2aWV3UG9zaXRpb24pO1xcbnZlYzMgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uID0gZ2V0X3BvaW50RGlzdGFuY2VBdHRlbnVhdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciA9IHNxcnQoMS4wLyhwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueCArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi55ICogZGlzdGFuY2VGcm9tQ2FtZXJhICsgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnogKiBkaXN0YW5jZUZyb21DYW1lcmEgKiBkaXN0YW5jZUZyb21DYW1lcmEpKTtcXG5mbG9hdCBtYXhQb2ludFNpemUgPSBnZXRfcG9pbnRTaXplKG1hdGVyaWFsU0lELCAwKTtcXG5nbF9Qb2ludFNpemUgPSBjbGFtcChkaXN0YW5jZUF0dGVudWF0aW9uRmFjdG9yICogbWF4UG9pbnRTaXplLCAwLjAsIG1heFBvaW50U2l6ZSk7XFxuXFxuLy8gI2VuZGlmXFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmQ7XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG52b2lkIG1haW4gKClcXG57XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgdmVjNCB0ZXh0dXJlQ29sb3IgPSB0ZXh0dXJlKHVfYmFzZUNvbG9yVGV4dHVyZSwgdl90ZXhjb29yZCk7XFxuXFxuICBmbG9hdCByID0gdGV4dHVyZUNvbG9yLnI7XFxuICBmbG9hdCBnID0gdGV4dHVyZUNvbG9yLmc7XFxuICBmbG9hdCBiID0gdGV4dHVyZUNvbG9yLmI7XFxuICBmbG9hdCByMTYgPSByICogMTUuMDtcXG4gIGZsb2F0IGcxNiA9IGcgKiAxNS4wO1xcbiAgZmxvYXQgYjE2ID0gYiAqIDE1LjA7XFxuICBmbG9hdCBySW50ID0gZmxvb3IocjE2KTtcXG4gIGZsb2F0IGdJbnQgPSBmbG9vcihnMTYpO1xcbiAgZmxvYXQgYkludCA9IGZsb29yKGIxNik7XFxuXFxuICBmbG9hdCByUmF0ZSwgZ1JhdGUsIGJSYXRlO1xcbiAgZmxvYXQgckludEFkanVzdCwgZ0ludEFkanVzdCwgYkludEFkanVzdDtcXG5cXG4gIHZlYzMgbmV3Q29sb3IgPSB2ZWMzKDAuMCk7XFxuICBmb3IoaW50IGk9MDsgaTw4OyBpKyspe1xcbiAgICByUmF0ZSA9IDEuMCAtIGZyYWN0KHIxNik7XFxuICAgIGdSYXRlID0gMS4wIC0gZnJhY3QoZzE2KTtcXG4gICAgYlJhdGUgPSAxLjAgLSBmcmFjdChiMTYpO1xcbiAgICBySW50QWRqdXN0ID0gckludDtcXG4gICAgZ0ludEFkanVzdCA9IGdJbnQ7XFxuICAgIGJJbnRBZGp1c3QgPSBiSW50O1xcblxcbiAgICBpZihmcmFjdChmbG9hdChpKSAvIDIuMCkgIT0gMC4wKXtcXG4gICAgICBySW50QWRqdXN0ICs9IDEuMDtcXG4gICAgICByUmF0ZSA9IDEuMCAtIHJSYXRlO1xcbiAgICB9XFxuICAgIGlmKGZyYWN0KGZsb2F0KGkgLyAyKSAvIDIuMCkgIT0gMC4wKXtcXG4gICAgICBnSW50QWRqdXN0ICs9IDEuMDtcXG4gICAgICBnUmF0ZSA9IDEuMCAtIGdSYXRlO1xcbiAgICB9XFxuICAgIGlmKGZyYWN0KGZsb2F0KGkgLyA0KSAvIDIuMCkgIT0gMC4wKXtcXG4gICAgICBiSW50QWRqdXN0ICs9IDEuMDtcXG4gICAgICBiUmF0ZSA9IDEuMCAtIGJSYXRlO1xcbiAgICB9XFxuXFxuICAgIGlmKCByUmF0ZSAqIGdSYXRlICogYlJhdGUgIT0gMC4wKXtcXG4gICAgICBuZXdDb2xvciArPSB0ZXh0dXJlKHVfbG9va3VwVGFibGVUZXh0dXJlLCB2ZWMyKHJJbnRBZGp1c3QgLyAyNTYuMCArIGJJbnRBZGp1c3QgLyAxNi4wICArIDEuMCAvIDUxMi4wLCBnSW50QWRqdXN0IC8gMTYuMCArIDEuMCAvIDMyLjApKS5yZ2IgKiByUmF0ZSAqIGdSYXRlICogYlJhdGU7XFxuICAgIH1cXG4gIH1cXG5cXG4gIHJ0MCA9IHZlYzQobmV3Q29sb3IsIDEuMCk7XFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMyIGFfdGV4Y29vcmQ7XFxuaW4gdmVjMyBhX3Bvc2l0aW9uO1xcblxcbm91dCB2ZWMyIHZfdGV4Y29vcmQ7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxudm9pZCBtYWluKCl7XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbm1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxubWF0NCB2aWV3TWF0cml4ID0gZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5tYXQ0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG5cXG5cXG4gIHZfdGV4Y29vcmQgPSBhX3RleGNvb3JkO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWM0IHZfcG9zaXRpb25faW5Mb2NhbDtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxudmVjNCBlbmNvZGVEZXB0aFRvUkdCQShmbG9hdCBkZXB0aCl7XFxuICBmbG9hdCByID0gZGVwdGg7XFxuICBmbG9hdCBnID0gZnJhY3QociAqIDI1NS4wKTtcXG4gIGZsb2F0IGIgPSBmcmFjdChnICogMjU1LjApO1xcbiAgZmxvYXQgYSA9IGZyYWN0KGIgKiAyNTUuMCk7XFxuICBmbG9hdCBjb2VmID0gMS4wIC8gMjU1LjA7XFxuICByIC09IGcgKiBjb2VmO1xcbiAgZyAtPSBiICogY29lZjtcXG4gIGIgLT0gYSAqIGNvZWY7XFxuICByZXR1cm4gdmVjNChyLCBnLCBiLCBhKTtcXG59XFxuXFxudm9pZCBtYWluICgpe1xcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG4gIGZsb2F0IGRlcHRoO1xcbiAgYm9vbCBpc1BvaW50TGlnaHQgPSBnZXRfaXNQb2ludExpZ2h0KG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmKGlzUG9pbnRMaWdodCl7XFxuICAgIGZsb2F0IHpOZWFyID0gZ2V0X3pOZWFySW5uZXIobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBmbG9hdCB6RmFyID0gZ2V0X3pGYXJJbm5lcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGZsb2F0IG5vcm1hbGl6YXRpb25Db2VmZmljaWVudCA9IDEuMCAvICh6RmFyIC0gek5lYXIpO1xcbiAgICBkZXB0aCA9IG5vcm1hbGl6YXRpb25Db2VmZmljaWVudCAqIGxlbmd0aCh2X3Bvc2l0aW9uX2luTG9jYWwpO1xcbiAgfWVsc2V7XFxuICAgIGRlcHRoID0gZ2xfRnJhZ0Nvb3JkLno7XFxuICB9XFxuXFxuICBmbG9hdCBkZXB0aFBvdyA9IGdldF9kZXB0aFBvdyhtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCBkZXB0aERhdGEgPSBwb3coZGVwdGgsIGRlcHRoUG93KTtcXG4gIHZlYzQgZW5jb2RlZERlcHRoID0gZW5jb2RlRGVwdGhUb1JHQkEoZGVwdGhEYXRhKTtcXG5cXG4gIHJ0MCA9IGVuY29kZWREZXB0aDtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuaW4gdmVjMyBhX3Bvc2l0aW9uO1xcbmluIHZlYzMgYV9ub3JtYWw7XFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWM0IGFfam9pbnQ7XFxuaW4gdmVjNCBhX3dlaWdodDtcXG5cXG5vdXQgdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbm91dCB2ZWM0IHZfcG9zaXRpb25faW5Mb2NhbDtcXG5vdXQgdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxubWF0MyB0b05vcm1hbE1hdHJpeChtYXQ0IG0pIHtcXG4gIGZsb2F0IGEwMCA9IG1bMF1bMF0sIGEwMSA9IG1bMF1bMV0sIGEwMiA9IG1bMF1bMl0sIGEwMyA9IG1bMF1bM10sXFxuICBhMTAgPSBtWzFdWzBdLCBhMTEgPSBtWzFdWzFdLCBhMTIgPSBtWzFdWzJdLCBhMTMgPSBtWzFdWzNdLFxcbiAgYTIwID0gbVsyXVswXSwgYTIxID0gbVsyXVsxXSwgYTIyID0gbVsyXVsyXSwgYTIzID0gbVsyXVszXSxcXG4gIGEzMCA9IG1bM11bMF0sIGEzMSA9IG1bM11bMV0sIGEzMiA9IG1bM11bMl0sIGEzMyA9IG1bM11bM107XFxuXFxuICBmbG9hdCBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXFxuICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXFxuICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXFxuICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXFxuICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXFxuICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXFxuICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXFxuICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXFxuICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXFxuICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXFxuICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXFxuICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XFxuXFxuICBmbG9hdCBkZXRlcm1pbmFudFZhbCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcXG5cXG4gIHJldHVybiBtYXQzKFxcbiAgICBhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDksIGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNywgYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2LFxcbiAgICBhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDksIGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNywgYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2LFxcbiAgICBhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMsIGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSwgYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAvIGRldGVybWluYW50VmFsO1xcbn1cXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5cXG5oaWdocCBtYXQ0IGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZSggaGlnaHAgdmVjNCBxdWF0ZXJuaW9uLCBoaWdocCB2ZWMzIHRyYW5zbGF0aW9uLCBoaWdocCB2ZWMzIHNjYWxlICkge1xcbiAgaGlnaHAgdmVjNCBxID0gcXVhdGVybmlvbjtcXG4gIGhpZ2hwIHZlYzMgdCA9IHRyYW5zbGF0aW9uO1xcblxcbiAgaGlnaHAgZmxvYXQgc3ggPSBxLnggKiBxLng7XFxuICBoaWdocCBmbG9hdCBzeSA9IHEueSAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHN6ID0gcS56ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ggPSBxLnkgKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeSA9IHEueCAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN6ID0gcS54ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ggPSBxLncgKiBxLng7XFxuICBoaWdocCBmbG9hdCB3eSA9IHEudyAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHd6ID0gcS53ICogcS56O1xcblxcbiAgaGlnaHAgbWF0NCBtYXQgPSBtYXQ0KFxcbiAgICAxLjAgLSAyLjAgKiAoc3kgKyBzeiksIDIuMCAqIChjeiArIHd6KSwgMi4wICogKGN5IC0gd3kpLCAwLjAsXFxuICAgIDIuMCAqIChjeiAtIHd6KSwgMS4wIC0gMi4wICogKHN4ICsgc3opLCAyLjAgKiAoY3ggKyB3eCksIDAuMCxcXG4gICAgMi4wICogKGN5ICsgd3kpLCAyLjAgKiAoY3ggLSB3eCksIDEuMCAtIDIuMCAqIChzeCArIHN5KSwgMC4wLFxcbiAgICB0LngsIHQueSwgdC56LCAxLjBcXG4gICk7XFxuXFxuICBoaWdocCBtYXQ0IHVuaWZvcm1TY2FsZU1hdCA9IG1hdDQoXFxuICAgIHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgc2NhbGUueSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCBzY2FsZS56LCAwLjAsXFxuICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxcbiAgKTtcXG5cXG4gIHJldHVybiBtYXQqdW5pZm9ybVNjYWxlTWF0O1xcbn1cXG5cXG5oaWdocCB2ZWM0IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoaGlnaHAgdmVjMiB2ZWNfeHksIGhpZ2hwIGZsb2F0IGNyaXRlcmlhKXtcXG5cXG4gIGhpZ2hwIGZsb2F0IHI7XFxuICBoaWdocCBmbG9hdCBnO1xcbiAgaGlnaHAgZmxvYXQgYjtcXG4gIGhpZ2hwIGZsb2F0IGE7XFxuXFxuICBoaWdocCBmbG9hdCBpeCA9IGZsb29yKHZlY194eS54ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjF4ID0gaXggLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYxeSA9IGl4IC0gZmxvb3IodjF4KSAqIGNyaXRlcmlhO1xcblxcbiAgciA9ICggdjF4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGcgPSAoIHYxeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICBoaWdocCBmbG9hdCBpeSA9IGZsb29yKCB2ZWNfeHkueSAqIGNyaXRlcmlhKTtcXG4gIGhpZ2hwIGZsb2F0IHYyeCA9IGl5IC8gY3JpdGVyaWE7XFxuICBoaWdocCBmbG9hdCB2MnkgPSBpeSAtIGZsb29yKHYyeCkgKiBjcml0ZXJpYTtcXG5cXG4gIGIgPSAoIHYyeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBhID0gKCB2MnkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgciAtPSAxLjAvY3JpdGVyaWE7XFxuICBnIC09IDEuMC9jcml0ZXJpYTtcXG4gIGIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYSAtPSAxLjAvY3JpdGVyaWE7XFxuXFxuICByID0gcioyLjAtMS4wO1xcbiAgZyA9IGcqMi4wLTEuMDtcXG4gIGIgPSBiKjIuMC0xLjA7XFxuICBhID0gYSoyLjAtMS4wO1xcblxcbiAgcmV0dXJuIHZlYzQociwgZywgYiwgYSk7XFxufVxcblxcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCkge1xcblxcbiNpZmRlZiBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMilcXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG5cXG4gIHZlYzQgdHFfeCA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBzcV94ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV94LncsIHNxX3gudyksIGNyaXRlcmlhLngpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV94Lnh5eiwgc3FfeC54eXopO1xcblxcbiAgdmVjNCB0cV95ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICB2ZWM0IHNxX3kgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV95LncsIHNxX3kudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3kueHl6LCBzcV95Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgc3FfeiA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3oudywgc3Ffei53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfei54eXosIHNxX3oueHl6KTtcXG5cXG4gIHZlYzQgdHFfdyA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgdmVjNCBzcV93ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfdy53LCBzcV93LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV93Lnh5eiwgc3Ffdy54eXopO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRClcXG4gIHZlYzQgdHNfeCA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICB2ZWM0IHRzX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMSlcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NYID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NZID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NaID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NXID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG5cXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRJbmZvID0gZ2V0X2JvbmVDb21wcmVzc2VkSW5mbygwLjAsIDApO1xcblxcbiAgdmVjNCB0c194ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1guencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnh5LCBjcml0ZXJpYS54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICB2ZWM0IHRzX3kgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS54eSwgY3JpdGVyaWEueCksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1ouencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1oueHksIGNyaXRlcmlhLngpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnh5LCBjcml0ZXJpYS54KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuI2VuZGlmXFxuICByZXR1cm4gc2tpbk1hdDtcXG59XFxuI2VuZGlmXFxuXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuYm9vbCBza2lubmluZyhcXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuICApXFxue1xcbiAgbWF0NCBza2luTWF0ID0gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCk7XFxuICBvdXRQb3NpdGlvbl9pbldvcmxkID0gc2tpbk1hdCAqIHZlYzQoaW5Qb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgb3V0Tm9ybWFsTWF0cml4ID0gdG9Ob3JtYWxNYXRyaXgoc2tpbk1hdCk7XFxuICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShvdXROb3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG5cXG4gIHJldHVybiB0cnVlO1xcbn1cXG4jZW5kaWZcXG5cXG5ib29sIHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQ0IHdvcmxkTWF0cml4LFxcbiAgaW4gbWF0NCB2aWV3TWF0cml4LFxcbiAgaW4gYm9vbCBpc0JpbGxib2FyZCxcXG4gIGluIG1hdDMgaW5Ob3JtYWxNYXRyaXgsXFxuICBvdXQgbWF0MyBvdXROb3JtYWxNYXRyaXgsXFxuICBpbiB2ZWMzIGluUG9zaXRpb25faW5Mb2NhbCxcXG4gIG91dCB2ZWM0IG91dFBvc2l0aW9uX2luV29ybGQsXFxuICBpbiB2ZWMzIGluTm9ybWFsX2luTG9jYWwsXFxuICBvdXQgdmVjMyBvdXROb3JtYWxfaW5Xb3JsZFxcbikge1xcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuXFxuICB2ZWMzIHBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICBpZiAodV9tb3JwaFRhcmdldE51bWJlciA9PSAwKSB7XFxuI2VuZGlmXFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBpblBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICB9IGVsc2Uge1xcbiAgICBmbG9hdCB2ZXJ0ZXhJZHggPSBhX2JhcnlDZW50cmljQ29vcmQudztcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGdldF9wb3NpdGlvbih2ZXJ0ZXhJZHgsIGluUG9zaXRpb25faW5Mb2NhbCk7XFxuICB9XFxuI2VuZGlmXFxuXFxuICBtYXQ0IHdvcmxkTWF0cml4SW5uZXIgPSB3b3JsZE1hdHJpeDtcXG4gIGlmIChpc0JpbGxib2FyZCkge1xcbiAgICBtYXQ0IGludmVyc2VWaWV3TWF0cml4ID0gaW52ZXJzZSh2aWV3TWF0cml4KTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMF0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVswXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMV0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsxXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMl0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsyXTtcXG4gICAgd29ybGRNYXRyaXhJbm5lciA9IGludmVyc2VWaWV3TWF0cml4ICogd29ybGRNYXRyaXg7XFxuICB9XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICBpZiAoc2tlbGV0YWxDb21wb25lbnRTSUQgPj0gMC4wKSB7XFxuICAgIGlzU2tpbm5pbmcgPSBza2lubmluZyhza2VsZXRhbENvbXBvbmVudFNJRCwgaW5Ob3JtYWxNYXRyaXgsIG91dE5vcm1hbE1hdHJpeCwgcG9zaXRpb25faW5Mb2NhbCwgb3V0UG9zaXRpb25faW5Xb3JsZCwgaW5Ob3JtYWxfaW5Mb2NhbCwgb3V0Tm9ybWFsX2luV29ybGQpO1xcbiAgfSBlbHNlIHtcXG4jZW5kaWZcXG4gICAgb3V0Tm9ybWFsTWF0cml4ID0gaW5Ob3JtYWxNYXRyaXg7XFxuICAgIG91dFBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeElubmVyICogdmVjNChwb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbk5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgcmV0dXJuIGlzU2tpbm5pbmc7XFxufVxcblxcblxcbnZvaWQgbWFpbigpe1xcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIG1hdDMgbm9ybWFsTWF0cml4ID0gZ2V0X25vcm1hbE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG5cXG4gIC8vIFNrZWxldGFsXFxuICBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICAgIHdvcmxkTWF0cml4LFxcbiAgICB2aWV3TWF0cml4LFxcbiAgICBmYWxzZSxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBub3JtYWxNYXRyaXgsXFxuICAgIGFfcG9zaXRpb24sXFxuICAgIHZfcG9zaXRpb25faW5Xb3JsZCxcXG4gICAgYV9ub3JtYWwsXFxuICAgIHZfbm9ybWFsX2luV29ybGRcXG4gICk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcbiAgdl9wb3NpdGlvbl9pbkxvY2FsID0gZ2xfUG9zaXRpb247XFxuXFxuLy8gI2lmZGVmIFJOX0lTX1BPSU5UU1BSSVRFXFxuXFxudmVjNCBwb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sIDEuMCk7XFxudmVjMyB2aWV3UG9zaXRpb24gPSBnZXRfdmlld1Bvc2l0aW9uKGNhbWVyYVNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VGcm9tQ2FtZXJhID0gbGVuZ3RoKHBvc2l0aW9uX2luV29ybGQueHl6IC0gdmlld1Bvc2l0aW9uKTtcXG52ZWMzIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbiA9IGdldF9wb2ludERpc3RhbmNlQXR0ZW51YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbmZsb2F0IGRpc3RhbmNlQXR0ZW51YXRpb25GYWN0b3IgPSBzcXJ0KDEuMC8ocG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnggKyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueSAqIGRpc3RhbmNlRnJvbUNhbWVyYSArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi56ICogZGlzdGFuY2VGcm9tQ2FtZXJhICogZGlzdGFuY2VGcm9tQ2FtZXJhKSk7XFxuZmxvYXQgbWF4UG9pbnRTaXplID0gZ2V0X3BvaW50U2l6ZShtYXRlcmlhbFNJRCwgMCk7XFxuZ2xfUG9pbnRTaXplID0gY2xhbXAoZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciAqIG1heFBvaW50U2l6ZSwgMC4wLCBtYXhQb2ludFNpemUpO1xcblxcbi8vICNlbmRpZlxcblxcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWMzIHZfY29sb3I7XFxuaW4gdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbmluIHZlYzQgdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5cXG52b2lkIG1haW4gKCl7XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgZmxvYXQgZGVwdGggPSBnbF9GcmFnQ29vcmQuejtcXG4gIGZsb2F0IGR4ID0gZEZkeChkZXB0aCk7XFxuICBmbG9hdCBkeSA9IGRGZHkoZGVwdGgpO1xcblxcbiAgcnQwLnggPSBkZXB0aDsgLy8gTTFcXG4gIHJ0MC55ID0gc3EoZGVwdGgpICsgMC4yNSAqIChzcShkeCkgKyBzcShkeSkpOyAvLyBNMlxcbiAgcnQwLnogPSAwLjA7XFxuICBydDAudyA9IDEuMDtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuaW4gdmVjMyBhX3Bvc2l0aW9uO1xcbmluIHZlYzMgYV9jb2xvcjtcXG5pbiB2ZWMzIGFfbm9ybWFsO1xcbmluIHZlYzQgYV9pbnN0YW5jZUluZm87XFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxuaW4gdmVjMiBhX3RleGNvb3JkXzE7XFxuaW4gdmVjMiBhX3RleGNvb3JkXzI7XFxuaW4gdmVjNCBhX2pvaW50O1xcbmluIHZlYzQgYV93ZWlnaHQ7XFxuaW4gdmVjNCBhX2JhcnlDZW50cmljQ29vcmQ7XFxub3V0IHZlYzMgdl9jb2xvcjtcXG5vdXQgdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbm91dCB2ZWM0IHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG51bmlmb3JtIGZsb2F0IHVfcG9pbnRTaXplOyAvLyBpbml0aWFsVmFsdWU9MzAsIHNvbG9EYXR1bT10cnVlXFxudW5pZm9ybSB2ZWMzIHVfcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uOyAvLyBpbml0aWFsVmFsdWU9KDAuMCwgMC4xLCAwLjAxKSwgc29sb0RhdHVtPXRydWVcXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5tYXQzIHRvTm9ybWFsTWF0cml4KG1hdDQgbSkge1xcbiAgZmxvYXQgYTAwID0gbVswXVswXSwgYTAxID0gbVswXVsxXSwgYTAyID0gbVswXVsyXSwgYTAzID0gbVswXVszXSxcXG4gIGExMCA9IG1bMV1bMF0sIGExMSA9IG1bMV1bMV0sIGExMiA9IG1bMV1bMl0sIGExMyA9IG1bMV1bM10sXFxuICBhMjAgPSBtWzJdWzBdLCBhMjEgPSBtWzJdWzFdLCBhMjIgPSBtWzJdWzJdLCBhMjMgPSBtWzJdWzNdLFxcbiAgYTMwID0gbVszXVswXSwgYTMxID0gbVszXVsxXSwgYTMyID0gbVszXVsyXSwgYTMzID0gbVszXVszXTtcXG5cXG4gIGZsb2F0IGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcXG4gIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcXG4gIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcXG4gIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcXG4gIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcXG4gIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcXG4gIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcXG4gIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcXG4gIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcXG4gIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcXG4gIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcXG4gIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcXG5cXG4gIGZsb2F0IGRldGVybWluYW50VmFsID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xcblxcbiAgcmV0dXJuIG1hdDMoXFxuICAgIGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSwgYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3LCBhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYsXFxuICAgIGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSwgYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3LCBhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYsXFxuICAgIGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMywgYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxLCBhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApIC8gZGV0ZXJtaW5hbnRWYWw7XFxufVxcblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcblxcbmhpZ2hwIG1hdDQgY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKCBoaWdocCB2ZWM0IHF1YXRlcm5pb24sIGhpZ2hwIHZlYzMgdHJhbnNsYXRpb24sIGhpZ2hwIHZlYzMgc2NhbGUgKSB7XFxuICBoaWdocCB2ZWM0IHEgPSBxdWF0ZXJuaW9uO1xcbiAgaGlnaHAgdmVjMyB0ID0gdHJhbnNsYXRpb247XFxuXFxuICBoaWdocCBmbG9hdCBzeCA9IHEueCAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHN5ID0gcS55ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgc3ogPSBxLnogKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeCA9IHEueSAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN5ID0gcS54ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ogPSBxLnggKiBxLnk7XFxuICBoaWdocCBmbG9hdCB3eCA9IHEudyAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHd5ID0gcS53ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ogPSBxLncgKiBxLno7XFxuXFxuICBoaWdocCBtYXQ0IG1hdCA9IG1hdDQoXFxuICAgIDEuMCAtIDIuMCAqIChzeSArIHN6KSwgMi4wICogKGN6ICsgd3opLCAyLjAgKiAoY3kgLSB3eSksIDAuMCxcXG4gICAgMi4wICogKGN6IC0gd3opLCAxLjAgLSAyLjAgKiAoc3ggKyBzeiksIDIuMCAqIChjeCArIHd4KSwgMC4wLFxcbiAgICAyLjAgKiAoY3kgKyB3eSksIDIuMCAqIChjeCAtIHd4KSwgMS4wIC0gMi4wICogKHN4ICsgc3kpLCAwLjAsXFxuICAgIHQueCwgdC55LCB0LnosIDEuMFxcbiAgKTtcXG5cXG4gIGhpZ2hwIG1hdDQgdW5pZm9ybVNjYWxlTWF0ID0gbWF0NChcXG4gICAgc2NhbGUueCwgMC4wLCAwLjAsIDAuMCxcXG4gICAgMC4wLCBzY2FsZS55LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIHNjYWxlLnosIDAuMCxcXG4gICAgMC4wLCAwLjAsIDAuMCwgMS4wXFxuICApO1xcblxcbiAgcmV0dXJuIG1hdCp1bmlmb3JtU2NhbGVNYXQ7XFxufVxcblxcbmhpZ2hwIHZlYzQgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChoaWdocCB2ZWMyIHZlY194eSwgaGlnaHAgZmxvYXQgY3JpdGVyaWEpe1xcblxcbiAgaGlnaHAgZmxvYXQgcjtcXG4gIGhpZ2hwIGZsb2F0IGc7XFxuICBoaWdocCBmbG9hdCBiO1xcbiAgaGlnaHAgZmxvYXQgYTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl4ID0gZmxvb3IodmVjX3h5LnggKiBjcml0ZXJpYSk7XFxuICBoaWdocCBmbG9hdCB2MXggPSBpeCAvIGNyaXRlcmlhO1xcbiAgaGlnaHAgZmxvYXQgdjF5ID0gaXggLSBmbG9vcih2MXgpICogY3JpdGVyaWE7XFxuXFxuICByID0gKCB2MXggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgZyA9ICggdjF5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl5ID0gZmxvb3IoIHZlY194eS55ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjJ4ID0gaXkgLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYyeSA9IGl5IC0gZmxvb3IodjJ4KSAqIGNyaXRlcmlhO1xcblxcbiAgYiA9ICggdjJ4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGEgPSAoIHYyeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICByIC09IDEuMC9jcml0ZXJpYTtcXG4gIGcgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYiAtPSAxLjAvY3JpdGVyaWE7XFxuICBhIC09IDEuMC9jcml0ZXJpYTtcXG5cXG4gIHIgPSByKjIuMC0xLjA7XFxuICBnID0gZyoyLjAtMS4wO1xcbiAgYiA9IGIqMi4wLTEuMDtcXG4gIGEgPSBhKjIuMC0xLjA7XFxuXFxuICByZXR1cm4gdmVjNChyLCBnLCBiLCBhKTtcXG59XFxuXFxubWF0NCBnZXRTa2luTWF0cml4KGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEKSB7XFxuXFxuI2lmZGVmIFJOX0JPTkVfREFUQV9UWVBFX01hdDQzeDFcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSkpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyKVxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcblxcbiAgdmVjNCB0cV94ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IHNxX3ggPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3gudywgc3FfeC53KSwgY3JpdGVyaWEueCk7XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3gueHl6LCBzcV94Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgc3FfeSA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3kudywgc3FfeS53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeS54eXosIHNxX3kueHl6KTtcXG5cXG4gIHZlYzQgdHFfeiA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBzcV96ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfei53LCBzcV96LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV96Lnh5eiwgc3Ffei54eXopO1xcblxcbiAgdmVjNCB0cV93ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICB2ZWM0IHNxX3cgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV93LncsIHNxX3cudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3cueHl6LCBzcV93Lnh5eik7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDJfT0xEKVxcbiAgdmVjNCB0c194ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgdmVjNCB0c195ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgxKVxcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ggPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1kgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ogPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1cgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcblxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZEluZm8gPSBnZXRfYm9uZUNvbXByZXNzZWRJbmZvKDAuMCwgMCk7XFxuXFxuICB2ZWM0IHRzX3ggPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1gueHksIGNyaXRlcmlhLngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnh5LCBjcml0ZXJpYS54KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi54eSwgY3JpdGVyaWEueCksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgdmVjNCB0c193ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cueHksIGNyaXRlcmlhLngpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG4jZW5kaWZcXG4gIHJldHVybiBza2luTWF0O1xcbn1cXG4jZW5kaWZcXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5ib29sIHNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQzIGluTm9ybWFsTWF0cml4LFxcbiAgb3V0IG1hdDMgb3V0Tm9ybWFsTWF0cml4LFxcbiAgaW4gdmVjMyBpblBvc2l0aW9uX2luTG9jYWwsXFxuICBvdXQgdmVjNCBvdXRQb3NpdGlvbl9pbldvcmxkLFxcbiAgaW4gdmVjMyBpbk5vcm1hbF9pbkxvY2FsLFxcbiAgb3V0IHZlYzMgb3V0Tm9ybWFsX2luV29ybGRcXG4gIClcXG57XFxuICBtYXQ0IHNraW5NYXQgPSBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lEKTtcXG4gIG91dFBvc2l0aW9uX2luV29ybGQgPSBza2luTWF0ICogdmVjNChpblBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICBvdXROb3JtYWxNYXRyaXggPSB0b05vcm1hbE1hdHJpeChza2luTWF0KTtcXG4gIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKG91dE5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcblxcbiAgcmV0dXJuIHRydWU7XFxufVxcbiNlbmRpZlxcblxcbmJvb2wgcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gIGluIG1hdDQgd29ybGRNYXRyaXgsXFxuICBpbiBtYXQ0IHZpZXdNYXRyaXgsXFxuICBpbiBib29sIGlzQmlsbGJvYXJkLFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuKSB7XFxuICBib29sIGlzU2tpbm5pbmcgPSBmYWxzZTtcXG5cXG4gIHZlYzMgcG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIGlmICh1X21vcnBoVGFyZ2V0TnVtYmVyID09IDApIHtcXG4jZW5kaWZcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGluUG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIH0gZWxzZSB7XFxuICAgIGZsb2F0IHZlcnRleElkeCA9IGFfYmFyeUNlbnRyaWNDb29yZC53O1xcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gZ2V0X3Bvc2l0aW9uKHZlcnRleElkeCwgaW5Qb3NpdGlvbl9pbkxvY2FsKTtcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIG1hdDQgd29ybGRNYXRyaXhJbm5lciA9IHdvcmxkTWF0cml4O1xcbiAgaWYgKGlzQmlsbGJvYXJkKSB7XFxuICAgIG1hdDQgaW52ZXJzZVZpZXdNYXRyaXggPSBpbnZlcnNlKHZpZXdNYXRyaXgpO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVswXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzBdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsxXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzFdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsyXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzJdO1xcbiAgICB3b3JsZE1hdHJpeElubmVyID0gaW52ZXJzZVZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeDtcXG4gIH1cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIGlmIChza2VsZXRhbENvbXBvbmVudFNJRCA+PSAwLjApIHtcXG4gICAgaXNTa2lubmluZyA9IHNraW5uaW5nKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbk5vcm1hbE1hdHJpeCwgb3V0Tm9ybWFsTWF0cml4LCBwb3NpdGlvbl9pbkxvY2FsLCBvdXRQb3NpdGlvbl9pbldvcmxkLCBpbk5vcm1hbF9pbkxvY2FsLCBvdXROb3JtYWxfaW5Xb3JsZCk7XFxuICB9IGVsc2Uge1xcbiNlbmRpZlxcbiAgICBvdXROb3JtYWxNYXRyaXggPSBpbk5vcm1hbE1hdHJpeDtcXG4gICAgb3V0UG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4SW5uZXIgKiB2ZWM0KHBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICAgIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGluTm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICB9XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gaXNTa2lubmluZztcXG59XFxuXFxuXFxudm9pZCBtYWluKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgbWF0NCB3b3JsZE1hdHJpeCA9IGdldF93b3JsZE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG4gIG1hdDQgdmlld01hdHJpeCA9IGdldF92aWV3TWF0cml4KGNhbWVyYVNJRCwgMCk7XFxuICBtYXQ0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0MyBub3JtYWxNYXRyaXggPSBnZXRfbm9ybWFsTWF0cml4KGFfaW5zdGFuY2VJbmZvLngpO1xcbiAgYm9vbCBpc0JpbGxib2FyZCA9IGdldF9pc0JpbGxib2FyZChhX2luc3RhbmNlSW5mby54KTtcXG5cXG4gIHZfY29sb3IgPSBhX2NvbG9yO1xcblxcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuXFxuICBpc1NraW5uaW5nID0gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgaXNCaWxsYm9hcmQsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBhX3Bvc2l0aW9uLFxcbiAgICB2X3Bvc2l0aW9uX2luV29ybGQsXFxuICAgIGFfbm9ybWFsLFxcbiAgICB2X25vcm1hbF9pbldvcmxkXFxuICApO1xcblxcbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG4gIGJvb2wgdmlzaWJpbGl0eSA9IGdldF9pc1Zpc2libGUoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBpZiAoIXZpc2liaWxpdHkpXFxuICB7XFxuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgwLjApO1xcbiAgfVxcblxcbi8vICNpZmRlZiBSTl9JU19QT0lOVFNQUklURVxcblxcbnZlYzQgcG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLCAxLjApO1xcbnZlYzMgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcbmZsb2F0IGRpc3RhbmNlRnJvbUNhbWVyYSA9IGxlbmd0aChwb3NpdGlvbl9pbldvcmxkLnh5eiAtIHZpZXdQb3NpdGlvbik7XFxudmVjMyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24gPSBnZXRfcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG5mbG9hdCBkaXN0YW5jZUF0dGVudWF0aW9uRmFjdG9yID0gc3FydCgxLjAvKHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi54ICsgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnkgKiBkaXN0YW5jZUZyb21DYW1lcmEgKyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueiAqIGRpc3RhbmNlRnJvbUNhbWVyYSAqIGRpc3RhbmNlRnJvbUNhbWVyYSkpO1xcbmZsb2F0IG1heFBvaW50U2l6ZSA9IGdldF9wb2ludFNpemUobWF0ZXJpYWxTSUQsIDApO1xcbmdsX1BvaW50U2l6ZSA9IGNsYW1wKGRpc3RhbmNlQXR0ZW51YXRpb25GYWN0b3IgKiBtYXhQb2ludFNpemUsIDAuMCwgbWF4UG9pbnRTaXplKTtcXG5cXG4vLyAjZW5kaWZcXG5cXG5cXG59XFxuXFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX1NUQU5EQVJEX0RFUklWQVRJVkVTXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfRFJBV19CVUZGRVJTXFxuI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuaW4gdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxudm9pZCBtYWluICgpXFxue1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIHZlYzQgYmFzZUNvbG9yID0gdGV4dHVyZSh1X2Jhc2VDb2xvclRleHR1cmUsIHZfdGV4Y29vcmRfMCk7XFxuXFxuICBmbG9hdCBsdW1pbmFuY2UgPSBkb3QoYmFzZUNvbG9yLnJnYiwgdmVjMygwLjIxMjYsIDAuNzE1MiwgMC4wNzIyKSk7XFxuXFxuICBmbG9hdCBsdW1pbmFuY2VDcml0ZXJpb24gPSBnZXRfbHVtaW5hbmNlQ3JpdGVyaW9uKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIGJhc2VDb2xvci5yZ2IgPSBtaXgodmVjMygwLjApLCBiYXNlQ29sb3IucmdiLCAobHVtaW5hbmNlIC0gbHVtaW5hbmNlQ3JpdGVyaW9uKSAvIGx1bWluYW5jZUNyaXRlcmlvbik7XFxuICBiYXNlQ29sb3IuYSA9IDEuMDtcXG5cXG4gIHJ0MCA9IGJhc2VDb2xvcjtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMyIGFfdGV4Y29vcmRfMDtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxudm9pZCBtYWluKCl7XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcbmZsb2F0IHggPSBmbG9hdCgoZ2xfVmVydGV4SUQgJiAxKSA8PCAyKTtcXG5mbG9hdCB5ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMikgPDwgMSk7XFxudl90ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbnZfdGV4Y29vcmRfMC55ID0geSAqIDAuNTtcXG5nbF9Qb3NpdGlvbiA9IHZlYzQoeCAtIDEuMCwgeSAtIDEuMCwgMCwgMSk7XFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbmluIHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5pbiB2ZWM0IHZfcG9zaXRpb25faW5Xb3JsZDtcXG5pbiBmbG9hdCB2X2luc3RhbmNlSW5mbztcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuY29uc3QgdmVjNCBiaXRFbmMgPSB2ZWM0KDEuLDI1NS4sNjUwMjUuLDE2NTgxMzc1Lik7XFxuY29uc3QgdmVjNCBiaXREZWMgPSAxLi9iaXRFbmM7XFxuXFxudmVjNCBlbmNvZGVGbG9hdFJHQkEoZmxvYXQgdikge1xcbiAgZmxvYXQgdmFsID0gdjtcXG4gIGZsb2F0IHIgPSBtb2QodmFsLCAyNTUuMCk7XFxuICB2YWwgLT0gcjtcXG4gIGZsb2F0IGcgPSBtb2QodmFsLCA2NTAyNS4wKTtcXG4gIHZhbCAtPSBnO1xcbiAgZmxvYXQgYiA9IG1vZCh2YWwsIDE2NTgxMzc1LjApO1xcbiAgcmV0dXJuIHZlYzQoci8yNTUuMCwgZy82NTAyNS4wLCBiLzE2NTgxMzc1LjAsIDEuMCk7XFxufVxcblxcblxcbnZvaWQgbWFpbiAoKVxcbntcXG4jaWZkZWYgUk5fSVNfREFUQVRFWFRVUkVfTU9ERVxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICAjaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gYV9pbnN0YW5jZUluZm8ueTtcXG4gICAgI2Vsc2VcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuI2Vsc2UgLy8gUk5fSVNfVU5JRk9STV9NT0RFXFxuXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IC0xLjA7IC8vIG1hdGVyaWFsU0lEIGlzIG5vdCB1c2VkIGluIFVuaWZvcm0gbW9kZVxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBmbG9hdChnZXRfc2tpbm5pbmdNb2RlKDAuMCwgMCkpO1xcbiAgI2VuZGlmXFxuXFxuI2VuZGlmXFxuXFxuZmxvYXQgY2FtZXJhU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1svKiBzaGFkZXJpdHk6IEB7V2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUR9ICovXTtcXG5cXG4jaWYgZGVmaW5lZChXRUJHTDJfTVVMVElfVklFVykgJiYgZGVmaW5lZChSTl9JU19WRVJURVhfU0hBREVSKVxcbi8vIGlmICh1X2lzTWFpblZyID09IDEpIHtcXG4gIGNhbWVyYVNJRCArPSBmbG9hdChnbF9WaWV3SURfT1ZSKTtcXG4vLyB9XFxuI2VuZGlmXFxuXFxuXFxuICBydDAgPSBlbmNvZGVGbG9hdFJHQkEodl9pbnN0YW5jZUluZm8pO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxuaW4gdmVjMyBhX2NvbG9yO1xcbmluIHZlYzMgYV9ub3JtYWw7XFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMyIGFfdGV4Y29vcmRfMDtcXG5pbiB2ZWM0IGFfam9pbnQ7XFxuaW4gdmVjNCBhX3dlaWdodDtcXG5vdXQgdmVjMyB2X2NvbG9yO1xcbm91dCB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxub3V0IHZlYzQgdl9wb3NpdGlvbl9pbldvcmxkO1xcbm91dCB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5vdXQgZmxvYXQgdl9pbnN0YW5jZUluZm87XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxubWF0MyB0b05vcm1hbE1hdHJpeChtYXQ0IG0pIHtcXG4gIGZsb2F0IGEwMCA9IG1bMF1bMF0sIGEwMSA9IG1bMF1bMV0sIGEwMiA9IG1bMF1bMl0sIGEwMyA9IG1bMF1bM10sXFxuICBhMTAgPSBtWzFdWzBdLCBhMTEgPSBtWzFdWzFdLCBhMTIgPSBtWzFdWzJdLCBhMTMgPSBtWzFdWzNdLFxcbiAgYTIwID0gbVsyXVswXSwgYTIxID0gbVsyXVsxXSwgYTIyID0gbVsyXVsyXSwgYTIzID0gbVsyXVszXSxcXG4gIGEzMCA9IG1bM11bMF0sIGEzMSA9IG1bM11bMV0sIGEzMiA9IG1bM11bMl0sIGEzMyA9IG1bM11bM107XFxuXFxuICBmbG9hdCBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXFxuICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXFxuICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXFxuICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXFxuICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXFxuICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXFxuICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXFxuICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXFxuICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXFxuICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXFxuICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXFxuICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XFxuXFxuICBmbG9hdCBkZXRlcm1pbmFudFZhbCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcXG5cXG4gIHJldHVybiBtYXQzKFxcbiAgICBhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDksIGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNywgYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2LFxcbiAgICBhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDksIGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNywgYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2LFxcbiAgICBhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMsIGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSwgYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAvIGRldGVybWluYW50VmFsO1xcbn1cXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5cXG5oaWdocCBtYXQ0IGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZSggaGlnaHAgdmVjNCBxdWF0ZXJuaW9uLCBoaWdocCB2ZWMzIHRyYW5zbGF0aW9uLCBoaWdocCB2ZWMzIHNjYWxlICkge1xcbiAgaGlnaHAgdmVjNCBxID0gcXVhdGVybmlvbjtcXG4gIGhpZ2hwIHZlYzMgdCA9IHRyYW5zbGF0aW9uO1xcblxcbiAgaGlnaHAgZmxvYXQgc3ggPSBxLnggKiBxLng7XFxuICBoaWdocCBmbG9hdCBzeSA9IHEueSAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHN6ID0gcS56ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ggPSBxLnkgKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeSA9IHEueCAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN6ID0gcS54ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ggPSBxLncgKiBxLng7XFxuICBoaWdocCBmbG9hdCB3eSA9IHEudyAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHd6ID0gcS53ICogcS56O1xcblxcbiAgaGlnaHAgbWF0NCBtYXQgPSBtYXQ0KFxcbiAgICAxLjAgLSAyLjAgKiAoc3kgKyBzeiksIDIuMCAqIChjeiArIHd6KSwgMi4wICogKGN5IC0gd3kpLCAwLjAsXFxuICAgIDIuMCAqIChjeiAtIHd6KSwgMS4wIC0gMi4wICogKHN4ICsgc3opLCAyLjAgKiAoY3ggKyB3eCksIDAuMCxcXG4gICAgMi4wICogKGN5ICsgd3kpLCAyLjAgKiAoY3ggLSB3eCksIDEuMCAtIDIuMCAqIChzeCArIHN5KSwgMC4wLFxcbiAgICB0LngsIHQueSwgdC56LCAxLjBcXG4gICk7XFxuXFxuICBoaWdocCBtYXQ0IHVuaWZvcm1TY2FsZU1hdCA9IG1hdDQoXFxuICAgIHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgc2NhbGUueSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCBzY2FsZS56LCAwLjAsXFxuICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxcbiAgKTtcXG5cXG4gIHJldHVybiBtYXQqdW5pZm9ybVNjYWxlTWF0O1xcbn1cXG5cXG5oaWdocCB2ZWM0IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoaGlnaHAgdmVjMiB2ZWNfeHksIGhpZ2hwIGZsb2F0IGNyaXRlcmlhKXtcXG5cXG4gIGhpZ2hwIGZsb2F0IHI7XFxuICBoaWdocCBmbG9hdCBnO1xcbiAgaGlnaHAgZmxvYXQgYjtcXG4gIGhpZ2hwIGZsb2F0IGE7XFxuXFxuICBoaWdocCBmbG9hdCBpeCA9IGZsb29yKHZlY194eS54ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjF4ID0gaXggLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYxeSA9IGl4IC0gZmxvb3IodjF4KSAqIGNyaXRlcmlhO1xcblxcbiAgciA9ICggdjF4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGcgPSAoIHYxeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICBoaWdocCBmbG9hdCBpeSA9IGZsb29yKCB2ZWNfeHkueSAqIGNyaXRlcmlhKTtcXG4gIGhpZ2hwIGZsb2F0IHYyeCA9IGl5IC8gY3JpdGVyaWE7XFxuICBoaWdocCBmbG9hdCB2MnkgPSBpeSAtIGZsb29yKHYyeCkgKiBjcml0ZXJpYTtcXG5cXG4gIGIgPSAoIHYyeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBhID0gKCB2MnkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgciAtPSAxLjAvY3JpdGVyaWE7XFxuICBnIC09IDEuMC9jcml0ZXJpYTtcXG4gIGIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYSAtPSAxLjAvY3JpdGVyaWE7XFxuXFxuICByID0gcioyLjAtMS4wO1xcbiAgZyA9IGcqMi4wLTEuMDtcXG4gIGIgPSBiKjIuMC0xLjA7XFxuICBhID0gYSoyLjAtMS4wO1xcblxcbiAgcmV0dXJuIHZlYzQociwgZywgYiwgYSk7XFxufVxcblxcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCkge1xcblxcbiNpZmRlZiBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMilcXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG5cXG4gIHZlYzQgdHFfeCA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBzcV94ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV94LncsIHNxX3gudyksIGNyaXRlcmlhLngpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV94Lnh5eiwgc3FfeC54eXopO1xcblxcbiAgdmVjNCB0cV95ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICB2ZWM0IHNxX3kgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV95LncsIHNxX3kudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3kueHl6LCBzcV95Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgc3FfeiA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3oudywgc3Ffei53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfei54eXosIHNxX3oueHl6KTtcXG5cXG4gIHZlYzQgdHFfdyA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgdmVjNCBzcV93ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfdy53LCBzcV93LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV93Lnh5eiwgc3Ffdy54eXopO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRClcXG4gIHZlYzQgdHNfeCA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICB2ZWM0IHRzX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMSlcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NYID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NZID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NaID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NXID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG5cXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRJbmZvID0gZ2V0X2JvbmVDb21wcmVzc2VkSW5mbygwLjAsIDApO1xcblxcbiAgdmVjNCB0c194ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1guencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnh5LCBjcml0ZXJpYS54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICB2ZWM0IHRzX3kgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS54eSwgY3JpdGVyaWEueCksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1ouencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1oueHksIGNyaXRlcmlhLngpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnh5LCBjcml0ZXJpYS54KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuI2VuZGlmXFxuICByZXR1cm4gc2tpbk1hdDtcXG59XFxuI2VuZGlmXFxuXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuYm9vbCBza2lubmluZyhcXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuICApXFxue1xcbiAgbWF0NCBza2luTWF0ID0gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCk7XFxuICBvdXRQb3NpdGlvbl9pbldvcmxkID0gc2tpbk1hdCAqIHZlYzQoaW5Qb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgb3V0Tm9ybWFsTWF0cml4ID0gdG9Ob3JtYWxNYXRyaXgoc2tpbk1hdCk7XFxuICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShvdXROb3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG5cXG4gIHJldHVybiB0cnVlO1xcbn1cXG4jZW5kaWZcXG5cXG5ib29sIHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQ0IHdvcmxkTWF0cml4LFxcbiAgaW4gbWF0NCB2aWV3TWF0cml4LFxcbiAgaW4gYm9vbCBpc0JpbGxib2FyZCxcXG4gIGluIG1hdDMgaW5Ob3JtYWxNYXRyaXgsXFxuICBvdXQgbWF0MyBvdXROb3JtYWxNYXRyaXgsXFxuICBpbiB2ZWMzIGluUG9zaXRpb25faW5Mb2NhbCxcXG4gIG91dCB2ZWM0IG91dFBvc2l0aW9uX2luV29ybGQsXFxuICBpbiB2ZWMzIGluTm9ybWFsX2luTG9jYWwsXFxuICBvdXQgdmVjMyBvdXROb3JtYWxfaW5Xb3JsZFxcbikge1xcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuXFxuICB2ZWMzIHBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICBpZiAodV9tb3JwaFRhcmdldE51bWJlciA9PSAwKSB7XFxuI2VuZGlmXFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBpblBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICB9IGVsc2Uge1xcbiAgICBmbG9hdCB2ZXJ0ZXhJZHggPSBhX2JhcnlDZW50cmljQ29vcmQudztcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGdldF9wb3NpdGlvbih2ZXJ0ZXhJZHgsIGluUG9zaXRpb25faW5Mb2NhbCk7XFxuICB9XFxuI2VuZGlmXFxuXFxuICBtYXQ0IHdvcmxkTWF0cml4SW5uZXIgPSB3b3JsZE1hdHJpeDtcXG4gIGlmIChpc0JpbGxib2FyZCkge1xcbiAgICBtYXQ0IGludmVyc2VWaWV3TWF0cml4ID0gaW52ZXJzZSh2aWV3TWF0cml4KTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMF0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVswXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMV0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsxXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMl0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsyXTtcXG4gICAgd29ybGRNYXRyaXhJbm5lciA9IGludmVyc2VWaWV3TWF0cml4ICogd29ybGRNYXRyaXg7XFxuICB9XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICBpZiAoc2tlbGV0YWxDb21wb25lbnRTSUQgPj0gMC4wKSB7XFxuICAgIGlzU2tpbm5pbmcgPSBza2lubmluZyhza2VsZXRhbENvbXBvbmVudFNJRCwgaW5Ob3JtYWxNYXRyaXgsIG91dE5vcm1hbE1hdHJpeCwgcG9zaXRpb25faW5Mb2NhbCwgb3V0UG9zaXRpb25faW5Xb3JsZCwgaW5Ob3JtYWxfaW5Mb2NhbCwgb3V0Tm9ybWFsX2luV29ybGQpO1xcbiAgfSBlbHNlIHtcXG4jZW5kaWZcXG4gICAgb3V0Tm9ybWFsTWF0cml4ID0gaW5Ob3JtYWxNYXRyaXg7XFxuICAgIG91dFBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeElubmVyICogdmVjNChwb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbk5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgcmV0dXJuIGlzU2tpbm5pbmc7XFxufVxcblxcblxcblxcbnZvaWQgbWFpbigpXFxue1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIG1hdDMgbm9ybWFsTWF0cml4ID0gZ2V0X25vcm1hbE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG5cXG4gIC8vIFNrZWxldGFsXFxuICBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICAgIHdvcmxkTWF0cml4LFxcbiAgICB2aWV3TWF0cml4LFxcbiAgICBmYWxzZSxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBub3JtYWxNYXRyaXgsXFxuICAgIGFfcG9zaXRpb24sXFxuICAgIHZfcG9zaXRpb25faW5Xb3JsZCxcXG4gICAgYV9ub3JtYWwsXFxuICAgIHZfbm9ybWFsX2luV29ybGRcXG4gICk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcbi8vICNpZmRlZiBSTl9JU19QT0lOVFNQUklURVxcblxcbnZlYzQgcG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLCAxLjApO1xcbnZlYzMgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcbmZsb2F0IGRpc3RhbmNlRnJvbUNhbWVyYSA9IGxlbmd0aChwb3NpdGlvbl9pbldvcmxkLnh5eiAtIHZpZXdQb3NpdGlvbik7XFxudmVjMyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24gPSBnZXRfcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG5mbG9hdCBkaXN0YW5jZUF0dGVudWF0aW9uRmFjdG9yID0gc3FydCgxLjAvKHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi54ICsgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnkgKiBkaXN0YW5jZUZyb21DYW1lcmEgKyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueiAqIGRpc3RhbmNlRnJvbUNhbWVyYSAqIGRpc3RhbmNlRnJvbUNhbWVyYSkpO1xcbmZsb2F0IG1heFBvaW50U2l6ZSA9IGdldF9wb2ludFNpemUobWF0ZXJpYWxTSUQsIDApO1xcbmdsX1BvaW50U2l6ZSA9IGNsYW1wKGRpc3RhbmNlQXR0ZW51YXRpb25GYWN0b3IgKiBtYXhQb2ludFNpemUsIDAuMCwgbWF4UG9pbnRTaXplKTtcXG5cXG4vLyAjZW5kaWZcXG5cXG5cXG4gIHZfaW5zdGFuY2VJbmZvID0gYV9pbnN0YW5jZUluZm8ueDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX1NUQU5EQVJEX0RFUklWQVRJVkVTXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfRFJBV19CVUZGRVJTXFxuI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuaW4gdmVjMiB2X3RleGNvb3JkXzA7XFxuaW4gdmVjMyB2X2NvbG9yO1xcbmluIHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5pbiB2ZWMzIHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG51bmlmb3JtIGludCB1X2VudkhkcmlGb3JtYXQ7IC8vIGluaXRpYWxWYWx1ZT0wXFxudW5pZm9ybSBmbG9hdCB1X2VudlJvdGF0aW9uOyAvLyBpbml0aWFsVmFsdWU9MFxcbnVuaWZvcm0gdmVjNCB1X2RpZmZ1c2VDb2xvckZhY3RvcjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSwxKVxcbnVuaWZvcm0gc2FtcGxlckN1YmUgdV9jb2xvckVudlRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMCxibGFjaylcXG51bmlmb3JtIGJvb2wgdV9tYWtlT3V0cHV0U3JnYjsgLy8gaW5pdGlhbFZhbHVlPXRydWVcXG51bmlmb3JtIGJvb2wgdV9pbnZlcnNlRW52aXJvbm1lbnQ7IC8vIGluaXRpYWxWYWx1ZT10cnVlXFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbnZlYzMgbGluZWFyVG9TcmdiKHZlYzMgbGluZWFyQ29sb3IpIHtcXG4gIHJldHVybiBwb3cobGluZWFyQ29sb3IsIHZlYzMoMS4wLzIuMikpO1xcbn1cXG5cXG52ZWMzIHNyZ2JUb0xpbmVhcih2ZWMzIHNyZ2JDb2xvcikge1xcbiAgcmV0dXJuIHBvdyhzcmdiQ29sb3IsIHZlYzMoMi4yKSk7XFxufVxcblxcbnZvaWQgbWFpbigpIHtcXG4jaWZkZWYgUk5fSVNfREFUQVRFWFRVUkVfTU9ERVxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICAjaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gYV9pbnN0YW5jZUluZm8ueTtcXG4gICAgI2Vsc2VcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuI2Vsc2UgLy8gUk5fSVNfVU5JRk9STV9NT0RFXFxuXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IC0xLjA7IC8vIG1hdGVyaWFsU0lEIGlzIG5vdCB1c2VkIGluIFVuaWZvcm0gbW9kZVxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBmbG9hdChnZXRfc2tpbm5pbmdNb2RlKDAuMCwgMCkpO1xcbiAgI2VuZGlmXFxuXFxuI2VuZGlmXFxuXFxuZmxvYXQgY2FtZXJhU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1svKiBzaGFkZXJpdHk6IEB7V2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUR9ICovXTtcXG5cXG4jaWYgZGVmaW5lZChXRUJHTDJfTVVMVElfVklFVykgJiYgZGVmaW5lZChSTl9JU19WRVJURVhfU0hBREVSKVxcbi8vIGlmICh1X2lzTWFpblZyID09IDEpIHtcXG4gIGNhbWVyYVNJRCArPSBmbG9hdChnbF9WaWV3SURfT1ZSKTtcXG4vLyB9XFxuI2VuZGlmXFxuXFxuXFxuICAvLyBkaWZmdXNlQ29sb3JcXG4gIHZlYzMgZGlmZnVzZUNvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gIGZsb2F0IGFscGhhID0gMS4wO1xcbiAgdmVjNCBkaWZmdXNlQ29sb3JGYWN0b3IgPSBnZXRfZGlmZnVzZUNvbG9yRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmICh2X2NvbG9yICE9IGRpZmZ1c2VDb2xvciAmJiBkaWZmdXNlQ29sb3JGYWN0b3IucmdiICE9IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSB2X2NvbG9yICogZGlmZnVzZUNvbG9yRmFjdG9yLnJnYjtcXG4gICAgYWxwaGEgPSBkaWZmdXNlQ29sb3JGYWN0b3IuYTtcXG4gIH0gZWxzZSBpZiAodl9jb2xvciA9PSBkaWZmdXNlQ29sb3IpIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yRmFjdG9yLnJnYjtcXG4gICAgYWxwaGEgPSBkaWZmdXNlQ29sb3JGYWN0b3IuYTtcXG4gIH0gZWxzZSBpZiAoZGlmZnVzZUNvbG9yRmFjdG9yLnJnYiA9PSBkaWZmdXNlQ29sb3IpIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gdl9jb2xvcjtcXG4gIH0gZWxzZSB7XFxuICAgIGRpZmZ1c2VDb2xvciA9IHZlYzMoMS4wLCAxLjAsIDEuMCk7XFxuICB9XFxuXFxuICAvLyBkaWZmdXNlQ29sb3JUZXh0dXJlXFxuXFxuICAvLyBhZGFwdCBPcGVuR0wgKFJlbmRlck1hbikgQ3ViZU1hcCBjb252ZW50aW9uXFxuICBmbG9hdCBlbnZSb3RhdGlvbiA9IGdldF9lbnZSb3RhdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCByb3QgPSBlbnZSb3RhdGlvbiArIDMuMTQxNTtcXG4gIG1hdDMgcm90RW52TWF0cml4ID0gbWF0Myhjb3Mocm90KSwgMC4wLCAtc2luKHJvdCksIDAuMCwgMS4wLCAwLjAsIHNpbihyb3QpLCAwLjAsIGNvcyhyb3QpKTtcXG4gIHZlYzMgZW52Tm9ybWFsID0gbm9ybWFsaXplKHJvdEVudk1hdHJpeCAqIHZfcG9zaXRpb25faW5Xb3JsZCk7XFxuXFxuICBpZiAoZ2V0X2ludmVyc2VFbnZpcm9ubWVudChtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgZW52Tm9ybWFsLnggKj0gLTEuMDtcXG4gIH1cXG5cXG4gIHZlYzQgZGlmZnVzZVRleGVsID0gdGV4dHVyZSh1X2NvbG9yRW52VGV4dHVyZSwgZW52Tm9ybWFsKTtcXG4gIHZlYzMgdGV4dHVyZUNvbG9yO1xcbiAgaW50IEVudkhkcmlGb3JtYXQgPSBnZXRfZW52SGRyaUZvcm1hdChtYXRlcmlhbFNJRCwgMCk7XFxuICBpZiAoRW52SGRyaUZvcm1hdCA9PSAwKSB7IC8vIExEUl9TUkdCXFxuICAgIHRleHR1cmVDb2xvciA9IHNyZ2JUb0xpbmVhcihkaWZmdXNlVGV4ZWwucmdiKTtcXG4gIH0gZWxzZSBpZiAoRW52SGRyaUZvcm1hdCA9PSAzKSB7IC8vIFJHQkVcXG4gICAgdGV4dHVyZUNvbG9yID0gZGlmZnVzZVRleGVsLnJnYiAqIHBvdygyLjAsIGRpZmZ1c2VUZXhlbC5hKjI1NS4wLTEyOC4wKTtcXG4gIH0gZWxzZSB7XFxuICAgIHRleHR1cmVDb2xvciA9IGRpZmZ1c2VUZXhlbC5yZ2I7XFxuICB9XFxuICBkaWZmdXNlQ29sb3IgKj0gdGV4dHVyZUNvbG9yO1xcblxcbiAgcnQwID0gdmVjNChkaWZmdXNlQ29sb3IsIGFscGhhKTtcXG5cXG5mbG9hdCBtYWtlT3V0cHV0U3JnYiA9IGZsb2F0KGdldF9tYWtlT3V0cHV0U3JnYihtYXRlcmlhbFNJRCwgMCkpO1xcbnJ0MC5yZ2IgPSBtaXgocnQwLnJnYiwgbGluZWFyVG9TcmdiKHJ0MC5yZ2IpLCBtYWtlT3V0cHV0U3JnYik7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiAgbGF5b3V0KG51bV92aWV3cz0yKSBpbjtcXG4jZW5kaWZcXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMzIGFfY29sb3I7XFxuaW4gdmVjMyBhX25vcm1hbDtcXG5cXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxub3V0IHZlYzMgdl9jb2xvcjtcXG5vdXQgdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbm91dCB2ZWMzIHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG51bmlmb3JtIGJvb2wgdV9lbmFibGVWaWV3TWF0cml4OyAvLyBpbml0aWFsVmFsdWU9dHJ1ZVxcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbnZvaWQgbWFpbigpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5cXG4gIGlmIChnZXRfZW5hYmxlVmlld01hdHJpeChtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgbWF0NCByb3RhdGVNYXRyaXggPSB2aWV3TWF0cml4O1xcbiAgICByb3RhdGVNYXRyaXhbM11bMF0gPSAwLjA7XFxuICAgIHJvdGF0ZU1hdHJpeFszXVsxXSA9IDAuMDtcXG4gICAgcm90YXRlTWF0cml4WzNdWzJdID0gMC4wO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiByb3RhdGVNYXRyaXggKiB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG4gIH0gZWxzZSB7XFxuICAgIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHdvcmxkTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLCAxLjApO1xcbiAgfVxcblxcbiAgbWF0MyBub3JtYWxNYXRyaXggPSBnZXRfbm9ybWFsTWF0cml4KGFfaW5zdGFuY2VJbmZvLngpO1xcbiAgdl9ub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbE1hdHJpeCAqIGFfbm9ybWFsO1xcblxcbiAgdl9jb2xvciA9IGFfY29sb3I7XFxuICB2X3Bvc2l0aW9uX2luV29ybGQgPSAod29ybGRNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gIHZfdGV4Y29vcmRfMCA9IGFfdGV4Y29vcmRfMDtcXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX1NUQU5EQVJEX0RFUklWQVRJVkVTXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfRFJBV19CVUZGRVJTXFxuI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qKlxcbiAqIFRoaXMgZmlsZSBjb250YWlucyBzb3VyY2UgY29kZSBwcm92aWRlZCBieSBOVklESUEgQ29ycG9yYXRpb24uXFxuICogRlhBQSBhbnRpYWxpYXNpbmcgaXMgZGV2ZWxvcGVkIGJ5IE5WSURJQS5cXG4gKiBUaGUgY29kZXMgb2YgdGhpcyBmaWxlIGlzIG1vZGlmaWVkIGZyb20gb3JpZ2luYWwgY29kZSB0byB3b3JrIG9uIFdlYkdMMS5cXG4gKiBUaGUgbW9kaWZpY2F0aW9uIGZvciBHTFNMIDEwMCBpcyByZWZlcnJlZCBmcm9tIFRocmVlLmpzLCBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2Jsb2IvNWJhNGMyNWJjYjc0NTc3ZTFiMWUxNDkwNmYzNDUxMzU2MTBhOTRmMy9leGFtcGxlcy9qcy9zaGFkZXJzL0ZYQUFTaGFkZXIuanNcXG4gKiBUaGUgb3JpZ2luYWwgRlhBQSBjb2RlIGlzIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUFHYW1lV29ya3MvR3JhcGhpY3NTYW1wbGVzL2Jsb2IvODBlOGJhOGY1ZTg5MzU4MjE1MTMyMDcwMzM0OTA3MzVkZDMyNzlkOC9zYW1wbGVzL2VzMy1rZXBsZXIvRlhBQS9GWEFBM18xMS5oXFxuICovXFxuXFxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuLy8gRmlsZTogICAgICAgIGVzMy1rZXBsZXJcXFxcRlhBQS9GWEFBM18xMS5oXFxuLy8gU0RLIFZlcnNpb246IHYzLjAwXFxuLy8gRW1haWw6ICAgICAgIGdhbWV3b3Jrc0BudmlkaWEuY29tXFxuLy8gU2l0ZTogICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9cXG4vL1xcbi8vIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFxuLy9cXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcXG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcXG4vLyBhcmUgbWV0Olxcbi8vICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XFxuLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxcbi8vICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XFxuLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxcbi8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXFxuLy8gICogTmVpdGhlciB0aGUgbmFtZSBvZiBOVklESUEgQ09SUE9SQVRJT04gbm9yIHRoZSBuYW1lcyBvZiBpdHNcXG4vLyAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcXG4vLyAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXFxuLy9cXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyAnQVMgSVMnIEFORCBBTllcXG4vLyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxcbi8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxcbi8vIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SXFxuLy8gQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXFxuLy8gRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxcbi8vIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxcbi8vIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcXG4vLyBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcXG4vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxcbi8vXFxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuICAgICAgICAgICAgICAgICAgICBOVklESUEgRlhBQSAzLjExIGJ5IFRJTU9USFkgTE9UVEVTXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCB1X2Jhc2VDb2xvclRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMCx3aGl0ZSlcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuXFxuXFxuICAjZGVmaW5lIEZYQUFfUEMgMVxcbiAgI2RlZmluZSBGWEFBX1FVQUxJVFlQUkVTRVQgMzlcXG4gICNkZWZpbmUgRlhBQV9HUkVFTl9BU19MVU1BIDBcXG4gICNkZWZpbmUgRlhBQV9HTFNMXzEwMCAxXFxuXFxuICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVHUkFUSU9OIEtOT0JTXFxuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cXG4gIC8vXFxuICAvLyBGWEFBX1BTMyBhbmQgRlhBQV8zNjAgY2hvb3NlIHRoZSBjb25zb2xlIGFsZ29yaXRobSAoRlhBQTMgQ09OU09MRSkuXFxuICAvLyBGWEFBXzM2MF9PUFQgaXMgYSBwcm90b3R5cGUgZm9yIHRoZSBuZXcgb3B0aW1pemVkIDM2MCB2ZXJzaW9uLlxcbiAgLy9cXG4gIC8vIDEgPSBVc2UgQVBJLlxcbiAgLy8gMCA9IERvbid0IHVzZSBBUEkuXFxuICAvL1xcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfUFMzXFxuICAjZGVmaW5lIEZYQUFfUFMzIDBcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfMzYwXFxuICAjZGVmaW5lIEZYQUFfMzYwIDBcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfMzYwX09QVFxcbiAgI2RlZmluZSBGWEFBXzM2MF9PUFQgMFxcbiAgI2VuZGlmXFxuICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cXG4gICNpZm5kZWYgRlhBQV9QQ1xcbiAgLy9cXG4gIC8vIEZYQUEgUXVhbGl0eVxcbiAgLy8gVGhlIGhpZ2ggcXVhbGl0eSBQQyBhbGdvcml0aG0uXFxuICAvL1xcbiAgI2RlZmluZSBGWEFBX1BDIDBcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfUENfQ09OU09MRVxcbiAgLy9cXG4gIC8vIFRoZSBjb25zb2xlIGFsZ29yaXRobSBmb3IgUEMgaXMgaW5jbHVkZWRcXG4gIC8vIGZvciBkZXZlbG9wZXJzIHRhcmdldGluZyByZWFsbHkgbG93IHNwZWMgbWFjaGluZXMuXFxuICAvLyBMaWtlbHkgYmV0dGVyIHRvIGp1c3QgcnVuIEZYQUFfUEMsIGFuZCB1c2UgYSByZWFsbHkgbG93IHByZXNldC5cXG4gIC8vXFxuICAjZGVmaW5lIEZYQUFfUENfQ09OU09MRSAwXFxuICAjZW5kaWZcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgI2lmbmRlZiBGWEFBX0dMU0xfMTIwXFxuICAjZGVmaW5lIEZYQUFfR0xTTF8xMjAgMFxcbiAgI2VuZGlmXFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gICNpZm5kZWYgRlhBQV9HTFNMXzEzMFxcbiAgI2RlZmluZSBGWEFBX0dMU0xfMTMwIDBcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfSExTTF8zXFxuICAjZGVmaW5lIEZYQUFfSExTTF8zIDBcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfSExTTF80XFxuICAjZGVmaW5lIEZYQUFfSExTTF80IDBcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWZuZGVmIEZYQUFfSExTTF81XFxuICAjZGVmaW5lIEZYQUFfSExTTF81IDBcXG4gICNlbmRpZlxcbiAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuICAjaWZuZGVmIEZYQUFfR1JFRU5fQVNfTFVNQVxcbiAgLy9cXG4gIC8vIEZvciB0aG9zZSB1c2luZyBub24tbGluZWFyIGNvbG9yLFxcbiAgLy8gYW5kIGVpdGhlciBub3QgYWJsZSB0byBnZXQgbHVtYSBpbiBhbHBoYSwgb3Igbm90IHdhbnRpbmcgdG8sXFxuICAvLyB0aGlzIGVuYWJsZXMgRlhBQSB0byBydW4gdXNpbmcgZ3JlZW4gYXMgYSBwcm94eSBmb3IgbHVtYS5cXG4gIC8vIFNvIHdpdGggdGhpcyBlbmFibGVkLCBubyBuZWVkIHRvIHBhY2sgbHVtYSBpbiBhbHBoYS5cXG4gIC8vXFxuICAvLyBUaGlzIHdpbGwgdHVybiBvZmYgQUEgb24gYW55dGhpbmcgd2hpY2ggbGFja3Mgc29tZSBhbW91bnQgb2YgZ3JlZW4uXFxuICAvLyBQdXJlIHJlZCBhbmQgYmx1ZSBvciBjb21iaW5hdGlvbiBvZiBvbmx5IFIgYW5kIEIsIHdpbGwgZ2V0IG5vIEFBLlxcbiAgLy9cXG4gIC8vIE1pZ2h0IHdhbnQgdG8gbG93ZXIgdGhlIHNldHRpbmdzIGZvciBib3RoLFxcbiAgLy8gICAgZnhhYUNvbnNvbGVFZGdlVGhyZXNob2xkTWluXFxuICAvLyAgICBmeGFhUXVhbGl0eUVkZ2VUaHJlc2hvbGRNaW5cXG4gIC8vIEluIG9yZGVyIHRvIGluc3VyZSBBQSBkb2VzIG5vdCBnZXQgdHVybmVkIG9mZiBvbiBjb2xvcnNcXG4gIC8vIHdoaWNoIGNvbnRhaW4gYSBtaW5vciBhbW91bnQgb2YgZ3JlZW4uXFxuICAvL1xcbiAgLy8gMSA9IE9uLlxcbiAgLy8gMCA9IE9mZi5cXG4gIC8vXFxuICAjZGVmaW5lIEZYQUFfR1JFRU5fQVNfTFVNQSAwXFxuICAjZW5kaWZcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgI2lmbmRlZiBGWEFBX0VBUkxZX0VYSVRcXG4gIC8vXFxuICAvLyBDb250cm9scyBhbGdvcml0aG0ncyBlYXJseSBleGl0IHBhdGguXFxuICAvLyBPbiBQUzMgdHVybmluZyB0aGlzIE9OIGFkZHMgMiBjeWNsZXMgdG8gdGhlIHNoYWRlci5cXG4gIC8vIE9uIDM2MCB0dXJuaW5nIHRoaXMgT0ZGIGFkZHMgMTB0aHMgb2YgYSBtaWxsaXNlY29uZCB0byB0aGUgc2hhZGVyLlxcbiAgLy8gVHVybmluZyB0aGlzIG9mZiBvbiBjb25zb2xlIHdpbGwgcmVzdWx0IGluIGEgbW9yZSBibHVycnkgaW1hZ2UuXFxuICAvLyBTbyB0aGlzIGRlZmF1bHRzIHRvIG9uLlxcbiAgLy9cXG4gIC8vIDEgPSBPbi5cXG4gIC8vIDAgPSBPZmYuXFxuICAvL1xcbiAgI2RlZmluZSBGWEFBX0VBUkxZX0VYSVQgMVxcbiAgI2VuZGlmXFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gICNpZm5kZWYgRlhBQV9ESVNDQVJEXFxuICAvL1xcbiAgLy8gT25seSB2YWxpZCBmb3IgUEMgT3BlbkdMIGN1cnJlbnRseS5cXG4gIC8vIFByb2JhYmx5IHdpbGwgbm90IHdvcmsgd2hlbiBGWEFBX0dSRUVOX0FTX0xVTUEgPSAxLlxcbiAgLy9cXG4gIC8vIDEgPSBVc2UgZGlzY2FyZCBvbiBwaXhlbHMgd2hpY2ggZG9uJ3QgbmVlZCBBQS5cXG4gIC8vICAgICBGb3IgQVBJcyB3aGljaCBlbmFibGUgY29uY3VycmVudCBURVgrUk9QIGZyb20gc2FtZSBzdXJmYWNlLlxcbiAgLy8gMCA9IFJldHVybiB1bmNoYW5nZWQgY29sb3Igb24gcGl4ZWxzIHdoaWNoIGRvbid0IG5lZWQgQUEuXFxuICAvL1xcbiAgI2RlZmluZSBGWEFBX0RJU0NBUkQgMFxcbiAgI2VuZGlmXFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gICNpZm5kZWYgRlhBQV9GQVNUX1BJWEVMX09GRlNFVFxcbiAgLy9cXG4gIC8vIFVzZWQgZm9yIEdMU0wgMTIwIG9ubHkuXFxuICAvL1xcbiAgLy8gMSA9IEdMIEFQSSBzdXBwb3J0cyBmYXN0IHBpeGVsIG9mZnNldHNcXG4gIC8vIDAgPSBkbyBub3QgdXNlIGZhc3QgcGl4ZWwgb2Zmc2V0c1xcbiAgLy9cXG4gICNpZmRlZiBHTEVYVF9ncHVfc2hhZGVyNFxcbiAgI2RlZmluZSBGWEFBX0ZBU1RfUElYRUxfT0ZGU0VUIDFcXG4gICNlbmRpZlxcbiAgI2lmZGVmIEdMTlZfZ3B1X3NoYWRlcjVcXG4gICNkZWZpbmUgRlhBQV9GQVNUX1BJWEVMX09GRlNFVCAxXFxuICAjZW5kaWZcXG4gICNpZmRlZiBHTEFSQl9ncHVfc2hhZGVyNVxcbiAgI2RlZmluZSBGWEFBX0ZBU1RfUElYRUxfT0ZGU0VUIDFcXG4gICNlbmRpZlxcbiAgI2lmbmRlZiBGWEFBX0ZBU1RfUElYRUxfT0ZGU0VUXFxuICAjZGVmaW5lIEZYQUFfRkFTVF9QSVhFTF9PRkZTRVQgMFxcbiAgI2VuZGlmXFxuICAjZW5kaWZcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgI2lmbmRlZiBGWEFBX0dBVEhFUjRfQUxQSEFcXG4gIC8vXFxuICAvLyAxID0gQVBJIHN1cHBvcnRzIGdhdGhlcjQgb24gYWxwaGEgY2hhbm5lbC5cXG4gIC8vIDAgPSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBnYXRoZXI0IG9uIGFscGhhIGNoYW5uZWwuXFxuICAvL1xcbiAgI2lmIChGWEFBX0hMU0xfNSA9PSAxKVxcbiAgI2RlZmluZSBGWEFBX0dBVEhFUjRfQUxQSEEgMVxcbiAgI2VuZGlmXFxuICAjaWZkZWYgR0xBUkJfZ3B1X3NoYWRlcjVcXG4gICNkZWZpbmUgRlhBQV9HQVRIRVI0X0FMUEhBIDFcXG4gICNlbmRpZlxcbiAgI2lmZGVmIEdMTlZfZ3B1X3NoYWRlcjVcXG4gICNkZWZpbmUgRlhBQV9HQVRIRVI0X0FMUEhBIDFcXG4gICNlbmRpZlxcbiAgI2lmbmRlZiBGWEFBX0dBVEhFUjRfQUxQSEFcXG4gICNkZWZpbmUgRlhBQV9HQVRIRVI0X0FMUEhBIDBcXG4gICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4gICAgICAgICAgICAgICAgICAgICAgICBGWEFBIENPTlNPTEUgUFMzIC0gVFVOSU5HIEtOT0JTXFxuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cXG4gICNpZm5kZWYgRlhBQV9DT05TT0xFUFMzX0VER0VfU0hBUlBORVNTXFxuICAvL1xcbiAgLy8gQ29uc29sZXMgdGhlIHNoYXJwbmVzcyBvZiBlZGdlcyBvbiBQUzMgb25seS5cXG4gIC8vIE5vbi1QUzMgdHVuaW5nIGlzIGRvbmUgd2l0aCBzaGFkZXIgaW5wdXQuXFxuICAvL1xcbiAgLy8gRHVlIHRvIHRoZSBQUzMgYmVpbmcgQUxVIGJvdW5kLFxcbiAgLy8gdGhlcmUgYXJlIG9ubHkgdHdvIHNhZmUgdmFsdWVzIGhlcmU6IDQgYW5kIDguXFxuICAvLyBUaGVzZSBvcHRpb25zIHVzZSB0aGUgc2hhZGVycyBhYmlsaXR5IHRvIGEgZnJlZSAqfC8gYnkgMnw0fDguXFxuICAvL1xcbiAgLy8gOC4wIGlzIHNoYXJwZXJcXG4gIC8vIDQuMCBpcyBzb2Z0ZXJcXG4gIC8vIDIuMCBpcyByZWFsbHkgc29mdCAoZ29vZCBmb3IgdmVjdG9yIGdyYXBoaWNzIGlucHV0cylcXG4gIC8vXFxuICAjaWYgMVxcbiAgI2RlZmluZSBGWEFBX0NPTlNPTEVQUzNfRURHRV9TSEFSUE5FU1MgOC4wXFxuICAjZW5kaWZcXG4gICNpZiAwXFxuICAjZGVmaW5lIEZYQUFfQ09OU09MRVBTM19FREdFX1NIQVJQTkVTUyA0LjBcXG4gICNlbmRpZlxcbiAgI2lmIDBcXG4gICNkZWZpbmUgRlhBQV9DT05TT0xFUFMzX0VER0VfU0hBUlBORVNTIDIuMFxcbiAgI2VuZGlmXFxuICAjZW5kaWZcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgI2lmbmRlZiBGWEFBX0NPTlNPTEVQUzNfRURHRV9USFJFU0hPTERcXG4gIC8vXFxuICAvLyBPbmx5IGVmZmVjdHMgUFMzLlxcbiAgLy8gTm9uLVBTMyB0dW5pbmcgaXMgZG9uZSB3aXRoIHNoYWRlciBpbnB1dC5cXG4gIC8vXFxuICAvLyBUaGUgbWluaW11bSBhbW91bnQgb2YgbG9jYWwgY29udHJhc3QgcmVxdWlyZWQgdG8gYXBwbHkgYWxnb3JpdGhtLlxcbiAgLy8gVGhlIGNvbnNvbGUgc2V0dGluZyBoYXMgYSBkaWZmZXJlbnQgbWFwcGluZyB0aGFuIHRoZSBxdWFsaXR5IHNldHRpbmcuXFxuICAvL1xcbiAgLy8gVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiBGWEFBX0VBUkxZX0VYSVQgaXMgMS5cXG4gIC8vXFxuICAvLyBEdWUgdG8gdGhlIFBTMyBiZWluZyBBTFUgYm91bmQsXFxuICAvLyB0aGVyZSBhcmUgb25seSB0d28gc2FmZSB2YWx1ZXMgaGVyZTogMC4yNSBhbmQgMC4xMjUuXFxuICAvLyBUaGVzZSBvcHRpb25zIHVzZSB0aGUgc2hhZGVycyBhYmlsaXR5IHRvIGEgZnJlZSAqfC8gYnkgMnw0fDguXFxuICAvL1xcbiAgLy8gMC4xMjUgbGVhdmVzIGxlc3MgYWxpYXNpbmcsIGJ1dCBpcyBzb2Z0ZXJcXG4gIC8vIDAuMjUgbGVhdmVzIG1vcmUgYWxpYXNpbmcsIGFuZCBpcyBzaGFycGVyXFxuICAvL1xcbiAgI2lmIDFcXG4gICNkZWZpbmUgRlhBQV9DT05TT0xFUFMzX0VER0VfVEhSRVNIT0xEIDAuMTI1XFxuICAjZWxzZVxcbiAgI2RlZmluZSBGWEFBX0NPTlNPTEVQUzNfRURHRV9USFJFU0hPTEQgMC4yNVxcbiAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4gIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBQSBRVUFMSVRZIC0gVFVOSU5HIEtOT0JTXFxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIE5PVEUgdGhlIG90aGVyIHR1bmluZyBrbm9icyBhcmUgbm93IGluIHRoZSBzaGFkZXIgZnVuY3Rpb24gaW5wdXRzIVxcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuICAjaWZuZGVmIEZYQUFfUVVBTElUWVBSRVNFVFxcbiAgLy9cXG4gIC8vIENob29zZSB0aGUgcXVhbGl0eSBwcmVzZXQuXFxuICAvLyBUaGlzIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGludG8gdGhlIHNoYWRlciBhcyBpdCBlZmZlY3RzIGNvZGUuXFxuICAvLyBCZXN0IG9wdGlvbiB0byBpbmNsdWRlIG11bHRpcGxlIHByZXNldHMgaXMgdG9cXG4gIC8vIGluIGVhY2ggc2hhZGVyIGRlZmluZSB0aGUgcHJlc2V0LCB0aGVuIGluY2x1ZGUgdGhpcyBmaWxlLlxcbiAgLy9cXG4gIC8vIE9QVElPTlNcXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICAvLyAxMCB0byAxNSAtIGRlZmF1bHQgbWVkaXVtIGRpdGhlciAoMTA9ZmFzdGVzdCwgMTU9aGlnaGVzdCBxdWFsaXR5KVxcbiAgLy8gMjAgdG8gMjkgLSBsZXNzIGRpdGhlciwgbW9yZSBleHBlbnNpdmUgKDIwPWZhc3Rlc3QsIDI5PWhpZ2hlc3QgcXVhbGl0eSlcXG4gIC8vIDM5ICAgICAgIC0gbm8gZGl0aGVyLCB2ZXJ5IGV4cGVuc2l2ZVxcbiAgLy9cXG4gIC8vIE5PVEVTXFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgLy8gMTIgPSBzbGlnaHRseSBmYXN0ZXIgdGhlbiBGWEFBIDMuOSBhbmQgaGlnaGVyIGVkZ2UgcXVhbGl0eSAoZGVmYXVsdClcXG4gIC8vIDEzID0gYWJvdXQgc2FtZSBzcGVlZCBhcyBGWEFBIDMuOSBhbmQgYmV0dGVyIHRoYW4gMTJcXG4gIC8vIDIzID0gY2xvc2VzdCB0byBGWEFBIDMuOSB2aXN1YWxseSBhbmQgcGVyZm9ybWFuY2Ugd2lzZVxcbiAgLy8gIF8gPSB0aGUgbG93ZXN0IGRpZ2l0IGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gcGVyZm9ybWFuY2VcXG4gIC8vIF8gID0gdGhlIGhpZ2hlc3QgZGlnaXQgaXMgZGlyZWN0bHkgcmVsYXRlZCB0byBzdHlsZVxcbiAgLy9cXG4gICNkZWZpbmUgRlhBQV9RVUFMSVRZUFJFU0VUIDEyXFxuICAjZW5kaWZcXG5cXG5cXG4gIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBQSBRVUFMSVRZIC0gUFJFU0VUU1xcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuXFxuICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4gICAgICAgICAgICAgICAgICAgICAgIEZYQUEgUVVBTElUWSAtIE1FRElVTSBESVRIRVIgUFJFU0VUU1xcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuICAjaWYoRlhBQV9RVUFMSVRZUFJFU0VUID09IDEwKVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgM1xcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAzLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDEyLjBcXG4jZW5kaWZcXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4jaWYgKEZYQUFfUVVBTElUWVBSRVNFVCA9PSAxMSlcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVBTIDRcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAzLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDEyLjBcXG4jZW5kaWZcXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4jaWYgKEZYQUFfUVVBTElUWVBSRVNFVCA9PSAxMilcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVBTIDVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDQuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMTIuMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDEzKVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgNlxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAxLjVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDMgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNCA0LjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA1IDEyLjBcXG4jZW5kaWZcXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4jaWYgKEZYQUFfUVVBTElUWVBSRVNFVCA9PSAxNClcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVBTIDdcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNSA0LjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA2IDEyLjBcXG4jZW5kaWZcXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4jaWYgKEZYQUFfUVVBTElUWVBSRVNFVCA9PSAxNSlcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVBTIDhcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNSAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA2IDQuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDcgMTIuMFxcbiNlbmRpZlxcblxcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiAgICAgICAgICAgICAgICAgICAgIEZYQUEgUVVBTElUWSAtIExPVyBESVRIRVIgUFJFU0VUU1xcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDIwKVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgM1xcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDIxKVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgNFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAxLjVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDMgOC4wXFxuI2VuZGlmXFxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuI2lmIChGWEFBX1FVQUxJVFlQUkVTRVQgPT0gMjIpXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQUyA1XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMCAxLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAxIDEuNVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDIgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMyAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA0IDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDIzKVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgNlxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAxLjVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDMgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNCAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA1IDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDI0KVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgN1xcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAxLjVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDMgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNCAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA1IDMuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDYgOC4wXFxuI2VuZGlmXFxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuI2lmIChGWEFBX1FVQUxJVFlQUkVTRVQgPT0gMjUpXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQUyA4XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMCAxLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAxIDEuNVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDIgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMyAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA0IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDUgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNiA0LjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA3IDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDI2KVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgOVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDAgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMSAxLjVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAyIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDMgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNCAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA1IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDYgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNyA0LjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA4IDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDI3KVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgMTBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNSAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA2IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDcgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQOCA0LjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA5IDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDI4KVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgMTFcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNSAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA2IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDcgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQOCAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA5IDQuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEwIDguMFxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDI5KVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgMTJcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS41XFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNSAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA2IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDcgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQOCAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA5IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEwIDQuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDExIDguMFxcbiNlbmRpZlxcblxcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiAgICAgICAgICAgICAgICAgICAgIEZYQUEgUVVBTElUWSAtIEVYVFJFTUUgUVVBTElUWVxcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xcbiNpZiAoRlhBQV9RVUFMSVRZUFJFU0VUID09IDM5KVxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUFMgMTJcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAwIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQMiAxLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVAzIDEuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDQgMS4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQNSAxLjVcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA2IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDcgMi4wXFxuI2RlZmluZSBGWEFBX1FVQUxJVFlQOCAyLjBcXG4jZGVmaW5lIEZYQUFfUVVBTElUWVA5IDIuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDEwIDQuMFxcbiNkZWZpbmUgRlhBQV9RVUFMSVRZUDExIDguMFxcbiNlbmRpZlxcblxcblxcblxcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJIFBPUlRJTkdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cXG4jaWYgKEZYQUFfR0xTTF8xMDAgPT0gMSkgfHwgKEZYQUFfR0xTTF8xMjAgPT0gMSkgfHwgKEZYQUFfR0xTTF8xMzAgPT0gMSlcXG4jZGVmaW5lIEZ4YWFCb29sIGJvb2xcXG4jZGVmaW5lIEZ4YWFEaXNjYXJkIGRpc2NhcmRcXG4jZGVmaW5lIEZ4YWFGbG9hdCBmbG9hdFxcbiNkZWZpbmUgRnhhYUZsb2F0MiB2ZWMyXFxuI2RlZmluZSBGeGFhRmxvYXQzIHZlYzNcXG4jZGVmaW5lIEZ4YWFGbG9hdDQgdmVjNFxcbiNkZWZpbmUgRnhhYUhhbGYgZmxvYXRcXG4jZGVmaW5lIEZ4YWFIYWxmMiB2ZWMyXFxuI2RlZmluZSBGeGFhSGFsZjMgdmVjM1xcbiNkZWZpbmUgRnhhYUhhbGY0IHZlYzRcXG4jZGVmaW5lIEZ4YWFJbnQyIGl2ZWMyXFxuI2RlZmluZSBGeGFhU2F0KHgpIGNsYW1wKHgsIDAuMCwgMS4wKVxcbiNkZWZpbmUgRnhhYVRleCBzYW1wbGVyMkRcXG4jZWxzZVxcbiNkZWZpbmUgRnhhYUJvb2wgYm9vbFxcbiNkZWZpbmUgRnhhYURpc2NhcmQgY2xpcCgtMSlcXG4jZGVmaW5lIEZ4YWFGbG9hdCBmbG9hdFxcbiNkZWZpbmUgRnhhYUZsb2F0MiBmbG9hdDJcXG4jZGVmaW5lIEZ4YWFGbG9hdDMgZmxvYXQzXFxuI2RlZmluZSBGeGFhRmxvYXQ0IGZsb2F0NFxcbiNkZWZpbmUgRnhhYUhhbGYgaGFsZlxcbiNkZWZpbmUgRnhhYUhhbGYyIGhhbGYyXFxuI2RlZmluZSBGeGFhSGFsZjMgaGFsZjNcXG4jZGVmaW5lIEZ4YWFIYWxmNCBoYWxmNFxcbiNkZWZpbmUgRnhhYVNhdCh4KSBzYXR1cmF0ZSh4KVxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9HTFNMXzEwMCA9PSAxKVxcbiNkZWZpbmUgRnhhYVRleFRvcCh0LCBwKSB0ZXh0dXJlKHQsIHAsIDAuMClcXG4jZGVmaW5lIEZ4YWFUZXhPZmYodCwgcCwgbywgcikgdGV4dHVyZSh0LCBwICsgKG8gKiByKSwgMC4wKVxcbiNlbmRpZlxcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiNpZiAoRlhBQV9HTFNMXzEyMCA9PSAxKVxcbi8vIFJlcXVpcmVzLFxcbi8vICAjdmVyc2lvbiAxMjBcXG4vLyBBbmQgYXQgbGVhc3QsXFxuLy8gICNleHRlbnNpb24gR0xFWFRfZ3B1X3NoYWRlcjQgOiBlbmFibGVcXG4vLyAgKG9yIHNldCBGWEFBX0ZBU1RfUElYRUxfT0ZGU0VUIDEgdG8gd29yayBsaWtlIERYOSlcXG4jZGVmaW5lIEZ4YWFUZXhUb3AodCwgcCkgdGV4dHVyZTJETG9kKHQsIHAsIDAuMClcXG4jaWYgKEZYQUFfRkFTVF9QSVhFTF9PRkZTRVQgPT0gMSlcXG4jZGVmaW5lIEZ4YWFUZXhPZmYodCwgcCwgbywgcikgdGV4dHVyZTJETG9kT2Zmc2V0KHQsIHAsIDAuMCwgbylcXG4jZWxzZVxcbiNkZWZpbmUgRnhhYVRleE9mZih0LCBwLCBvLCByKSB0ZXh0dXJlMkRMb2QodCwgcCArIChvICogciksIDAuMClcXG4jZW5kaWZcXG4jaWYgKEZYQUFfR0FUSEVSNF9BTFBIQSA9PSAxKVxcbi8vIHVzZSAjZXh0ZW5zaW9uIEdMQVJCX2dwdV9zaGFkZXI1IDogZW5hYmxlXFxuI2RlZmluZSBGeGFhVGV4QWxwaGE0KHQsIHApIHRleHR1cmVHYXRoZXIodCwgcCwgMylcXG4jZGVmaW5lIEZ4YWFUZXhPZmZBbHBoYTQodCwgcCwgbykgdGV4dHVyZUdhdGhlck9mZnNldCh0LCBwLCBvLCAzKVxcbiNkZWZpbmUgRnhhYVRleEdyZWVuNCh0LCBwKSB0ZXh0dXJlR2F0aGVyKHQsIHAsIDEpXFxuI2RlZmluZSBGeGFhVGV4T2ZmR3JlZW40KHQsIHAsIG8pIHRleHR1cmVHYXRoZXJPZmZzZXQodCwgcCwgbywgMSlcXG4jZW5kaWZcXG4jZW5kaWZcXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4jaWYgKEZYQUFfR0xTTF8xMzAgPT0gMSlcXG4vLyBSZXF1aXJlcyBcXFwiI3ZlcnNpb24gMTMwXFxcIiBvciBiZXR0ZXJcXG4jZGVmaW5lIEZ4YWFUZXhUb3AodCwgcCkgdGV4dHVyZUxvZCh0LCBwLCAwLjApXFxuI2RlZmluZSBGeGFhVGV4T2ZmKHQsIHAsIG8sIHIpIHRleHR1cmVMb2RPZmZzZXQodCwgcCwgMC4wLCBvKVxcbiNpZiAoRlhBQV9HQVRIRVI0X0FMUEhBID09IDEpXFxuLy8gdXNlICNleHRlbnNpb24gR0xBUkJfZ3B1X3NoYWRlcjUgOiBlbmFibGVcXG4jZGVmaW5lIEZ4YWFUZXhBbHBoYTQodCwgcCkgdGV4dHVyZUdhdGhlcih0LCBwLCAzKVxcbiNkZWZpbmUgRnhhYVRleE9mZkFscGhhNCh0LCBwLCBvKSB0ZXh0dXJlR2F0aGVyT2Zmc2V0KHQsIHAsIG8sIDMpXFxuI2RlZmluZSBGeGFhVGV4R3JlZW40KHQsIHApIHRleHR1cmVHYXRoZXIodCwgcCwgMSlcXG4jZGVmaW5lIEZ4YWFUZXhPZmZHcmVlbjQodCwgcCwgbykgdGV4dHVyZUdhdGhlck9mZnNldCh0LCBwLCBvLCAxKVxcbiNlbmRpZlxcbiNlbmRpZlxcblxcblxcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiAgICAgICAgICAgICAgICAgICBHUkVFTiBBUyBMVU1BIE9QVElPTiBTVVBQT1JUIEZVTkNUSU9OXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuI2lmIChGWEFBX0dSRUVOX0FTX0xVTUEgPT0gMClcXG4gIEZ4YWFGbG9hdCBGeGFhTHVtYShGeGFhRmxvYXQ0IHJnYmEpIHsgcmV0dXJuIGRvdChyZ2JhLnJnYiwgdmVjMygwLjI5ODkxMiwgMC41ODY2MTEsIDAuMTE0NDc4KSk7IH1cXG4gIC8vIEZ4YWFGbG9hdCBGeGFhTHVtYShGeGFhRmxvYXQ0IHJnYmEpIHsgcmV0dXJuIHJnYmEudzsgfVxcbiNlbHNlXFxuICBGeGFhRmxvYXQgRnhhYUx1bWEoRnhhYUZsb2F0NCByZ2JhKSB7IHJldHVybiByZ2JhLnk7IH1cXG4jZW5kaWZcXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQUEzIFFVQUxJVFkgLSBQQ1xcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xcbiNpZiAoRlhBQV9QQyA9PSAxKVxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICBGeGFhRmxvYXQ0IEZ4YWFQaXhlbFNoYWRlcihcXG4gICAgLy9cXG4gICAgLy8gVXNlIG5vcGVyc3BlY3RpdmUgaW50ZXJwb2xhdGlvbiBoZXJlICh0dXJuIG9mZiBwZXJzcGVjdGl2ZSBpbnRlcnBvbGF0aW9uKS5cXG4gICAgLy8ge3h5fSA9IGNlbnRlciBvZiBwaXhlbFxcbiAgICBGeGFhRmxvYXQyIHBvcyxcXG4gICAgLy9cXG4gICAgLy8gVXNlZCBvbmx5IGZvciBGWEFBIENvbnNvbGUsIGFuZCBub3QgdXNlZCBvbiB0aGUgMzYwIHZlcnNpb24uXFxuICAgIC8vIFVzZSBub3BlcnNwZWN0aXZlIGludGVycG9sYXRpb24gaGVyZSAodHVybiBvZmYgcGVyc3BlY3RpdmUgaW50ZXJwb2xhdGlvbikuXFxuICAgIC8vIHt4eX0gPSB1cHBlciBsZWZ0IG9mIHBpeGVsXFxuICAgIC8vIHt6d30gPSBsb3dlciByaWdodCBvZiBwaXhlbFxcbiAgICBGeGFhRmxvYXQ0IGZ4YWFDb25zb2xlUG9zUG9zLFxcbiAgICAvL1xcbiAgICAvLyBJbnB1dCBjb2xvciB0ZXh0dXJlLlxcbiAgICAvLyB7cmdiX30gPSBjb2xvciBpbiBsaW5lYXIgb3IgcGVyY2VwdHVhbCBjb2xvciBzcGFjZVxcbiAgICAvLyBpZiAoRlhBQV9HUkVFTl9BU19MVU1BID09IDApXFxuICAgIC8vICAgICB7X2F9ID0gbHVtYSBpbiBwZXJjZXB0dWFsIGNvbG9yIHNwYWNlIChub3QgbGluZWFyKVxcbiAgICBGeGFhVGV4IHRleCxcXG4gICAgLy9cXG4gICAgLy8gT25seSB1c2VkIG9uIHRoZSBvcHRpbWl6ZWQgMzYwIHZlcnNpb24gb2YgRlhBQSBDb25zb2xlLlxcbiAgICAvLyBGb3IgZXZlcnl0aGluZyBidXQgMzYwLCBqdXN0IHVzZSB0aGUgc2FtZSBpbnB1dCBoZXJlIGFzIGZvciBcXFwidGV4XFxcIi5cXG4gICAgLy8gRm9yIDM2MCwgc2FtZSB0ZXh0dXJlLCBqdXN0IGFsaWFzIHdpdGggYSAybmQgc2FtcGxlci5cXG4gICAgLy8gVGhpcyBzYW1wbGVyIG5lZWRzIHRvIGhhdmUgYW4gZXhwb25lbnQgYmlhcyBvZiAtMS5cXG4gICAgRnhhYVRleCBmeGFhQ29uc29sZTM2MFRleEV4cEJpYXNOZWdPbmUsXFxuICAgIC8vXFxuICAgIC8vIE9ubHkgdXNlZCBvbiB0aGUgb3B0aW1pemVkIDM2MCB2ZXJzaW9uIG9mIEZYQUEgQ29uc29sZS5cXG4gICAgLy8gRm9yIGV2ZXJ5dGhpbmcgYnV0IDM2MCwganVzdCB1c2UgdGhlIHNhbWUgaW5wdXQgaGVyZSBhcyBmb3IgXFxcInRleFxcXCIuXFxuICAgIC8vIEZvciAzNjAsIHNhbWUgdGV4dHVyZSwganVzdCBhbGlhcyB3aXRoIGEgM25kIHNhbXBsZXIuXFxuICAgIC8vIFRoaXMgc2FtcGxlciBuZWVkcyB0byBoYXZlIGFuIGV4cG9uZW50IGJpYXMgb2YgLTIuXFxuICAgIEZ4YWFUZXggZnhhYUNvbnNvbGUzNjBUZXhFeHBCaWFzTmVnVHdvLFxcbiAgICAvL1xcbiAgICAvLyBPbmx5IHVzZWQgb24gRlhBQSBRdWFsaXR5LlxcbiAgICAvLyBUaGlzIG11c3QgYmUgZnJvbSBhIGNvbnN0YW50L3VuaWZvcm0uXFxuICAgIC8vIHt4X30gPSAxLjAvc2NyZWVuV2lkdGhJblBpeGVsc1xcbiAgICAvLyB7X3l9ID0gMS4wL3NjcmVlbkhlaWdodEluUGl4ZWxzXFxuICAgIEZ4YWFGbG9hdDIgZnhhYVF1YWxpdHlSY3BGcmFtZSxcXG4gICAgLy9cXG4gICAgLy8gT25seSB1c2VkIG9uIEZYQUEgQ29uc29sZS5cXG4gICAgLy8gVGhpcyBtdXN0IGJlIGZyb20gYSBjb25zdGFudC91bmlmb3JtLlxcbiAgICAvLyBUaGlzIGVmZmVjdHMgc3ViLXBpeGVsIEFBIHF1YWxpdHkgYW5kIGludmVyc2VseSBzaGFycG5lc3MuXFxuICAgIC8vICAgV2hlcmUgTiByYW5nZXMgYmV0d2VlbixcXG4gICAgLy8gICAgIE4gPSAwLjUwIChkZWZhdWx0KVxcbiAgICAvLyAgICAgTiA9IDAuMzMgKHNoYXJwZXIpXFxuICAgIC8vIHt4X30gPSAtTi9zY3JlZW5XaWR0aEluUGl4ZWxzXFxuICAgIC8vIHtfeX0gPSAtTi9zY3JlZW5IZWlnaHRJblBpeGVsc1xcbiAgICAvLyB7el99ID0gIE4vc2NyZWVuV2lkdGhJblBpeGVsc1xcbiAgICAvLyB7X3d9ID0gIE4vc2NyZWVuSGVpZ2h0SW5QaXhlbHNcXG4gICAgRnhhYUZsb2F0NCBmeGFhQ29uc29sZVJjcEZyYW1lT3B0LFxcbiAgICAvL1xcbiAgICAvLyBPbmx5IHVzZWQgb24gRlhBQSBDb25zb2xlLlxcbiAgICAvLyBOb3QgdXNlZCBvbiAzNjAsIGJ1dCB1c2VkIG9uIFBTMyBhbmQgUEMuXFxuICAgIC8vIFRoaXMgbXVzdCBiZSBmcm9tIGEgY29uc3RhbnQvdW5pZm9ybS5cXG4gICAgLy8ge3hffSA9IC0yLjAvc2NyZWVuV2lkdGhJblBpeGVsc1xcbiAgICAvLyB7X3l9ID0gLTIuMC9zY3JlZW5IZWlnaHRJblBpeGVsc1xcbiAgICAvLyB7el99ID0gIDIuMC9zY3JlZW5XaWR0aEluUGl4ZWxzXFxuICAgIC8vIHtfd30gPSAgMi4wL3NjcmVlbkhlaWdodEluUGl4ZWxzXFxuICAgIEZ4YWFGbG9hdDQgZnhhYUNvbnNvbGVSY3BGcmFtZU9wdDIsXFxuICAgIC8vXFxuICAgIC8vIE9ubHkgdXNlZCBvbiBGWEFBIENvbnNvbGUuXFxuICAgIC8vIE9ubHkgdXNlZCBvbiAzNjAgaW4gcGxhY2Ugb2YgZnhhYUNvbnNvbGVSY3BGcmFtZU9wdDIuXFxuICAgIC8vIFRoaXMgbXVzdCBiZSBmcm9tIGEgY29uc3RhbnQvdW5pZm9ybS5cXG4gICAgLy8ge3hffSA9ICA4LjAvc2NyZWVuV2lkdGhJblBpeGVsc1xcbiAgICAvLyB7X3l9ID0gIDguMC9zY3JlZW5IZWlnaHRJblBpeGVsc1xcbiAgICAvLyB7el99ID0gLTQuMC9zY3JlZW5XaWR0aEluUGl4ZWxzXFxuICAgIC8vIHtfd30gPSAtNC4wL3NjcmVlbkhlaWdodEluUGl4ZWxzXFxuICAgIEZ4YWFGbG9hdDQgZnhhYUNvbnNvbGUzNjBSY3BGcmFtZU9wdDIsXFxuICAgIC8vXFxuICAgIC8vIE9ubHkgdXNlZCBvbiBGWEFBIFF1YWxpdHkuXFxuICAgIC8vIFRoaXMgdXNlZCB0byBiZSB0aGUgRlhBQV9RVUFMSVRZU1VCUElYIGRlZmluZS5cXG4gICAgLy8gSXQgaXMgaGVyZSBub3cgdG8gYWxsb3cgZWFzaWVyIHR1bmluZy5cXG4gICAgLy8gQ2hvb3NlIHRoZSBhbW91bnQgb2Ygc3ViLXBpeGVsIGFsaWFzaW5nIHJlbW92YWwuXFxuICAgIC8vIFRoaXMgY2FuIGVmZmVjdCBzaGFycG5lc3MuXFxuICAgIC8vICAgMS4wMCAtIHVwcGVyIGxpbWl0IChzb2Z0ZXIpXFxuICAgIC8vICAgMC43NSAtIGRlZmF1bHQgYW1vdW50IG9mIGZpbHRlcmluZ1xcbiAgICAvLyAgIDAuNTAgLSBsb3dlciBsaW1pdCAoc2hhcnBlciwgbGVzcyBzdWItcGl4ZWwgYWxpYXNpbmcgcmVtb3ZhbClcXG4gICAgLy8gICAwLjI1IC0gYWxtb3N0IG9mZlxcbiAgICAvLyAgIDAuMDAgLSBjb21wbGV0ZWx5IG9mZlxcbiAgICBGeGFhRmxvYXQgZnhhYVF1YWxpdHlTdWJwaXgsXFxuICAgIC8vXFxuICAgIC8vIE9ubHkgdXNlZCBvbiBGWEFBIFF1YWxpdHkuXFxuICAgIC8vIFRoaXMgdXNlZCB0byBiZSB0aGUgRlhBQV9RVUFMSVRZRURHRV9USFJFU0hPTEQgZGVmaW5lLlxcbiAgICAvLyBJdCBpcyBoZXJlIG5vdyB0byBhbGxvdyBlYXNpZXIgdHVuaW5nLlxcbiAgICAvLyBUaGUgbWluaW11bSBhbW91bnQgb2YgbG9jYWwgY29udHJhc3QgcmVxdWlyZWQgdG8gYXBwbHkgYWxnb3JpdGhtLlxcbiAgICAvLyAgIDAuMzMzIC0gdG9vIGxpdHRsZSAoZmFzdGVyKVxcbiAgICAvLyAgIDAuMjUwIC0gbG93IHF1YWxpdHlcXG4gICAgLy8gICAwLjE2NiAtIGRlZmF1bHRcXG4gICAgLy8gICAwLjEyNSAtIGhpZ2ggcXVhbGl0eVxcbiAgICAvLyAgIDAuMDYzIC0gb3ZlcmtpbGwgKHNsb3dlcilcXG4gICAgRnhhYUZsb2F0IGZ4YWFRdWFsaXR5RWRnZVRocmVzaG9sZCxcXG4gICAgLy9cXG4gICAgLy8gT25seSB1c2VkIG9uIEZYQUEgUXVhbGl0eS5cXG4gICAgLy8gVGhpcyB1c2VkIHRvIGJlIHRoZSBGWEFBX1FVQUxJVFlFREdFX1RIUkVTSE9MRF9NSU4gZGVmaW5lLlxcbiAgICAvLyBJdCBpcyBoZXJlIG5vdyB0byBhbGxvdyBlYXNpZXIgdHVuaW5nLlxcbiAgICAvLyBUcmltcyB0aGUgYWxnb3JpdGhtIGZyb20gcHJvY2Vzc2luZyBkYXJrcy5cXG4gICAgLy8gICAwLjA4MzMgLSB1cHBlciBsaW1pdCAoZGVmYXVsdCwgdGhlIHN0YXJ0IG9mIHZpc2libGUgdW5maWx0ZXJlZCBlZGdlcylcXG4gICAgLy8gICAwLjA2MjUgLSBoaWdoIHF1YWxpdHkgKGZhc3RlcilcXG4gICAgLy8gICAwLjAzMTIgLSB2aXNpYmxlIGxpbWl0IChzbG93ZXIpXFxuICAgIC8vIFNwZWNpYWwgbm90ZXMgd2hlbiB1c2luZyBGWEFBX0dSRUVOX0FTX0xVTUEsXFxuICAgIC8vICAgTGlrZWx5IHdhbnQgdG8gc2V0IHRoaXMgdG8gemVyby5cXG4gICAgLy8gICBBcyBjb2xvcnMgdGhhdCBhcmUgbW9zdGx5IG5vdC1ncmVlblxcbiAgICAvLyAgIHdpbGwgYXBwZWFyIHZlcnkgZGFyayBpbiB0aGUgZ3JlZW4gY2hhbm5lbCFcXG4gICAgLy8gICBUdW5lIGJ5IGxvb2tpbmcgYXQgbW9zdGx5IG5vbi1ncmVlbiBjb250ZW50LFxcbiAgICAvLyAgIHRoZW4gc3RhcnQgYXQgemVybyBhbmQgaW5jcmVhc2UgdW50aWwgYWxpYXNpbmcgaXMgYSBwcm9ibGVtLlxcbiAgICBGeGFhRmxvYXQgZnhhYVF1YWxpdHlFZGdlVGhyZXNob2xkTWluLFxcbiAgICAvL1xcbiAgICAvLyBPbmx5IHVzZWQgb24gRlhBQSBDb25zb2xlLlxcbiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgdGhlIEZYQUFfQ09OU09MRUVER0VfU0hBUlBORVNTIGRlZmluZS5cXG4gICAgLy8gSXQgaXMgaGVyZSBub3cgdG8gYWxsb3cgZWFzaWVyIHR1bmluZy5cXG4gICAgLy8gVGhpcyBkb2VzIG5vdCBlZmZlY3QgUFMzLCBhcyB0aGlzIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLlxcbiAgICAvLyAgIFVzZSBGWEFBX0NPTlNPTEVQUzNfRURHRV9TSEFSUE5FU1MgZm9yIFBTMy5cXG4gICAgLy8gICBEdWUgdG8gdGhlIFBTMyBiZWluZyBBTFUgYm91bmQsXFxuICAgIC8vICAgdGhlcmUgYXJlIG9ubHkgdGhyZWUgc2FmZSB2YWx1ZXMgaGVyZTogMiBhbmQgNCBhbmQgOC5cXG4gICAgLy8gICBUaGVzZSBvcHRpb25zIHVzZSB0aGUgc2hhZGVycyBhYmlsaXR5IHRvIGEgZnJlZSAqfC8gYnkgMnw0fDguXFxuICAgIC8vIEZvciBhbGwgb3RoZXIgcGxhdGZvcm1zIGNhbiBiZSBhIG5vbi1wb3dlciBvZiB0d28uXFxuICAgIC8vICAgOC4wIGlzIHNoYXJwZXIgKGRlZmF1bHQhISEpXFxuICAgIC8vICAgNC4wIGlzIHNvZnRlclxcbiAgICAvLyAgIDIuMCBpcyByZWFsbHkgc29mdCAoZ29vZCBvbmx5IGZvciB2ZWN0b3IgZ3JhcGhpY3MgaW5wdXRzKVxcbiAgICBGeGFhRmxvYXQgZnhhYUNvbnNvbGVFZGdlU2hhcnBuZXNzLFxcbiAgICAvL1xcbiAgICAvLyBPbmx5IHVzZWQgb24gRlhBQSBDb25zb2xlLlxcbiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgdGhlIEZYQUFfQ09OU09MRUVER0VfVEhSRVNIT0xEIGRlZmluZS5cXG4gICAgLy8gSXQgaXMgaGVyZSBub3cgdG8gYWxsb3cgZWFzaWVyIHR1bmluZy5cXG4gICAgLy8gVGhpcyBkb2VzIG5vdCBlZmZlY3QgUFMzLCBhcyB0aGlzIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLlxcbiAgICAvLyAgIFVzZSBGWEFBX0NPTlNPTEVQUzNfRURHRV9USFJFU0hPTEQgZm9yIFBTMy5cXG4gICAgLy8gICBEdWUgdG8gdGhlIFBTMyBiZWluZyBBTFUgYm91bmQsXFxuICAgIC8vICAgdGhlcmUgYXJlIG9ubHkgdHdvIHNhZmUgdmFsdWVzIGhlcmU6IDEvNCBhbmQgMS84LlxcbiAgICAvLyAgIFRoZXNlIG9wdGlvbnMgdXNlIHRoZSBzaGFkZXJzIGFiaWxpdHkgdG8gYSBmcmVlICp8LyBieSAyfDR8OC5cXG4gICAgLy8gVGhlIGNvbnNvbGUgc2V0dGluZyBoYXMgYSBkaWZmZXJlbnQgbWFwcGluZyB0aGFuIHRoZSBxdWFsaXR5IHNldHRpbmcuXFxuICAgIC8vIE90aGVyIHBsYXRmb3JtcyBjYW4gdXNlIG90aGVyIHZhbHVlcy5cXG4gICAgLy8gICAwLjEyNSBsZWF2ZXMgbGVzcyBhbGlhc2luZywgYnV0IGlzIHNvZnRlciAoZGVmYXVsdCEhISlcXG4gICAgLy8gICAwLjI1IGxlYXZlcyBtb3JlIGFsaWFzaW5nLCBhbmQgaXMgc2hhcnBlclxcbiAgICBGeGFhRmxvYXQgZnhhYUNvbnNvbGVFZGdlVGhyZXNob2xkLFxcbiAgICAvL1xcbiAgICAvLyBPbmx5IHVzZWQgb24gRlhBQSBDb25zb2xlLlxcbiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgdGhlIEZYQUFfQ09OU09MRUVER0VfVEhSRVNIT0xEX01JTiBkZWZpbmUuXFxuICAgIC8vIEl0IGlzIGhlcmUgbm93IHRvIGFsbG93IGVhc2llciB0dW5pbmcuXFxuICAgIC8vIFRyaW1zIHRoZSBhbGdvcml0aG0gZnJvbSBwcm9jZXNzaW5nIGRhcmtzLlxcbiAgICAvLyBUaGUgY29uc29sZSBzZXR0aW5nIGhhcyBhIGRpZmZlcmVudCBtYXBwaW5nIHRoYW4gdGhlIHF1YWxpdHkgc2V0dGluZy5cXG4gICAgLy8gVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiBGWEFBX0VBUkxZX0VYSVQgaXMgMS5cXG4gICAgLy8gVGhpcyBkb2VzIG5vdCBhcHBseSB0byBQUzMsXFxuICAgIC8vIFBTMyB3YXMgc2ltcGxpZmllZCB0byBhdm9pZCBtb3JlIHNoYWRlciBpbnN0cnVjdGlvbnMuXFxuICAgIC8vICAgMC4wNiAtIGZhc3RlciBidXQgbW9yZSBhbGlhc2luZyBpbiBkYXJrc1xcbiAgICAvLyAgIDAuMDUgLSBkZWZhdWx0XFxuICAgIC8vICAgMC4wNCAtIHNsb3dlciBhbmQgbGVzcyBhbGlhc2luZyBpbiBkYXJrc1xcbiAgICAvLyBTcGVjaWFsIG5vdGVzIHdoZW4gdXNpbmcgRlhBQV9HUkVFTl9BU19MVU1BLFxcbiAgICAvLyAgIExpa2VseSB3YW50IHRvIHNldCB0aGlzIHRvIHplcm8uXFxuICAgIC8vICAgQXMgY29sb3JzIHRoYXQgYXJlIG1vc3RseSBub3QtZ3JlZW5cXG4gICAgLy8gICB3aWxsIGFwcGVhciB2ZXJ5IGRhcmsgaW4gdGhlIGdyZWVuIGNoYW5uZWwhXFxuICAgIC8vICAgVHVuZSBieSBsb29raW5nIGF0IG1vc3RseSBub24tZ3JlZW4gY29udGVudCxcXG4gICAgLy8gICB0aGVuIHN0YXJ0IGF0IHplcm8gYW5kIGluY3JlYXNlIHVudGlsIGFsaWFzaW5nIGlzIGEgcHJvYmxlbS5cXG4gICAgRnhhYUZsb2F0IGZ4YWFDb25zb2xlRWRnZVRocmVzaG9sZE1pbixcXG4gICAgLy9cXG4gICAgLy8gRXh0cmEgY29uc3RhbnRzIGZvciAzNjAgRlhBQSBDb25zb2xlIG9ubHkuXFxuICAgIC8vIFVzZSB6ZXJvcyBvciBhbnl0aGluZyBlbHNlIGZvciBvdGhlciBwbGF0Zm9ybXMuXFxuICAgIC8vIFRoZXNlIG11c3QgYmUgaW4gcGh5c2ljYWwgY29uc3RhbnQgcmVnaXN0ZXJzIGFuZCBOT1QgaW1tZWRhdGVzLlxcbiAgICAvLyBJbW1lZGF0ZXMgd2lsbCByZXN1bHQgaW4gY29tcGlsZXIgdW4tb3B0aW1pemluZy5cXG4gICAgLy8ge3h5end9ID0gZmxvYXQ0KDEuMCwgLTEuMCwgMC4yNSwgLTAuMjUpXFxuICAgIEZ4YWFGbG9hdDQgZnhhYUNvbnNvbGUzNjBDb25zdERpclxcbiAgKSB7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIEZ4YWFGbG9hdDIgcG9zTTtcXG4gIHBvc00ueCA9IHBvcy54O1xcbiAgcG9zTS55ID0gcG9zLnk7XFxuICAjaWYgKEZYQUFfR0FUSEVSNF9BTFBIQSA9PSAxKVxcbiAgI2lmIChGWEFBX0RJU0NBUkQgPT0gMClcXG4gICAgRnhhYUZsb2F0NCByZ2J5TSA9IEZ4YWFUZXhUb3AodGV4LCBwb3NNKTtcXG4gICNpZiAoRlhBQV9HUkVFTl9BU19MVU1BID09IDApXFxuICAjZGVmaW5lIGx1bWFNIHJnYnlNLndcXG4gICNlbHNlXFxuICAjZGVmaW5lIGx1bWFNIHJnYnlNLnlcXG4gICNlbmRpZlxcbiAgI2VuZGlmXFxuICAjaWYgKEZYQUFfR1JFRU5fQVNfTFVNQSA9PSAwKVxcbiAgICBGeGFhRmxvYXQ0IGx1bWE0QSA9IEZ4YWFUZXhBbHBoYTQodGV4LCBwb3NNKTtcXG4gIEZ4YWFGbG9hdDQgbHVtYTRCID0gRnhhYVRleE9mZkFscGhhNCh0ZXgsIHBvc00sIEZ4YWFJbnQyKC0xLCAtMSkpO1xcbiAgI2Vsc2VcXG4gIEZ4YWFGbG9hdDQgbHVtYTRBID0gRnhhYVRleEdyZWVuNCh0ZXgsIHBvc00pO1xcbiAgRnhhYUZsb2F0NCBsdW1hNEIgPSBGeGFhVGV4T2ZmR3JlZW40KHRleCwgcG9zTSwgRnhhYUludDIoLTEsIC0xKSk7XFxuICAjZW5kaWZcXG4gICNpZiAoRlhBQV9ESVNDQVJEID09IDEpXFxuICAjZGVmaW5lIGx1bWFNIGx1bWE0QS53XFxuICAjZW5kaWZcXG4gICNkZWZpbmUgbHVtYUUgbHVtYTRBLnpcXG4gICNkZWZpbmUgbHVtYVMgbHVtYTRBLnhcXG4gICNkZWZpbmUgbHVtYVNFIGx1bWE0QS55XFxuICAjZGVmaW5lIGx1bWFOVyBsdW1hNEIud1xcbiAgI2RlZmluZSBsdW1hTiBsdW1hNEIuelxcbiAgI2RlZmluZSBsdW1hVyBsdW1hNEIueFxcbiAgI2Vsc2VcXG4gIEZ4YWFGbG9hdDQgcmdieU0gPSBGeGFhVGV4VG9wKHRleCwgcG9zTSk7XFxuICAjaWYgKEZYQUFfR1JFRU5fQVNfTFVNQSA9PSAwKVxcbiAgI2RlZmluZSBsdW1hTSByZ2J5TS53XFxuICAjZWxzZVxcbiAgI2RlZmluZSBsdW1hTSByZ2J5TS55XFxuICAjZW5kaWZcXG4gICNpZiAoRlhBQV9HTFNMXzEwMCA9PSAxKVxcbiAgICBGeGFhRmxvYXQgbHVtYVMgPSBGeGFhTHVtYShGeGFhVGV4T2ZmKHRleCwgcG9zTSwgRnhhYUZsb2F0MigwLjAsIDEuMCksIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpKTtcXG4gIEZ4YWFGbG9hdCBsdW1hRSA9IEZ4YWFMdW1hKEZ4YWFUZXhPZmYodGV4LCBwb3NNLCBGeGFhRmxvYXQyKDEuMCwgMC4wKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgRnhhYUZsb2F0IGx1bWFOID0gRnhhYUx1bWEoRnhhYVRleE9mZih0ZXgsIHBvc00sIEZ4YWFGbG9hdDIoMC4wLCAtMS4wKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgRnhhYUZsb2F0IGx1bWFXID0gRnhhYUx1bWEoRnhhYVRleE9mZih0ZXgsIHBvc00sIEZ4YWFGbG9hdDIoLTEuMCwgMC4wKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgI2Vsc2VcXG4gIEZ4YWFGbG9hdCBsdW1hUyA9IEZ4YWFMdW1hKEZ4YWFUZXhPZmYodGV4LCBwb3NNLCBGeGFhSW50MigwLCAxKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgRnhhYUZsb2F0IGx1bWFFID0gRnhhYUx1bWEoRnhhYVRleE9mZih0ZXgsIHBvc00sIEZ4YWFJbnQyKDEsIDApLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICBGeGFhRmxvYXQgbHVtYVcgPSBGeGFhTHVtYShGeGFhVGV4T2ZmKHRleCwgcG9zTSwgRnhhYUludDIoLTEsIDApLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICBGeGFhRmxvYXQgbHVtYU4gPSBGeGFhTHVtYShGeGFhVGV4T2ZmKHRleCwgcG9zTSwgRnhhYUludDIoMCwgLTEpLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICAjZW5kaWZcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICBGeGFhRmxvYXQgbWF4U00gPSBtYXgobHVtYVMsIGx1bWFNKTtcXG4gIEZ4YWFGbG9hdCBtaW5TTSA9IG1pbihsdW1hUywgbHVtYU0pO1xcbiAgRnhhYUZsb2F0IG1heEVTTSA9IG1heChsdW1hRSwgbWF4U00pO1xcbiAgRnhhYUZsb2F0IG1pbkVTTSA9IG1pbihsdW1hRSwgbWluU00pO1xcbiAgRnhhYUZsb2F0IG1heFdOID0gbWF4KGx1bWFOLCBsdW1hVyk7XFxuICBGeGFhRmxvYXQgbWluV04gPSBtaW4obHVtYU4sIGx1bWFXKTtcXG4gIEZ4YWFGbG9hdCByYW5nZU1heCA9IG1heChtYXhXTiwgbWF4RVNNKTtcXG4gIEZ4YWFGbG9hdCByYW5nZU1pbiA9IG1pbihtaW5XTiwgbWluRVNNKTtcXG4gIEZ4YWFGbG9hdCByYW5nZU1heFNjYWxlZCA9IHJhbmdlTWF4ICogZnhhYVF1YWxpdHlFZGdlVGhyZXNob2xkO1xcbiAgRnhhYUZsb2F0IHJhbmdlID0gcmFuZ2VNYXggLSByYW5nZU1pbjtcXG4gIEZ4YWFGbG9hdCByYW5nZU1heENsYW1wZWQgPSBtYXgoZnhhYVF1YWxpdHlFZGdlVGhyZXNob2xkTWluLCByYW5nZU1heFNjYWxlZCk7XFxuICBGeGFhQm9vbCBlYXJseUV4aXQgPSByYW5nZSA8IHJhbmdlTWF4Q2xhbXBlZDtcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgaWYgKGVhcmx5RXhpdClcXG4gICNpZiAoRlhBQV9ESVNDQVJEID09IDEpXFxuICAgIEZ4YWFEaXNjYXJkO1xcbiAgI2Vsc2VcXG4gIHJldHVybiByZ2J5TTtcXG4gICNlbmRpZlxcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAjaWYgKEZYQUFfR0FUSEVSNF9BTFBIQSA9PSAwKVxcbiAgI2lmIChGWEFBX0dMU0xfMTAwID09IDEpXFxuICAgIEZ4YWFGbG9hdCBsdW1hTlcgPSBGeGFhTHVtYShGeGFhVGV4T2ZmKHRleCwgcG9zTSwgRnhhYUZsb2F0MigtMS4wLCAtMS4wKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgRnhhYUZsb2F0IGx1bWFTRSA9IEZ4YWFMdW1hKEZ4YWFUZXhPZmYodGV4LCBwb3NNLCBGeGFhRmxvYXQyKDEuMCwgMS4wKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgRnhhYUZsb2F0IGx1bWFORSA9IEZ4YWFMdW1hKEZ4YWFUZXhPZmYodGV4LCBwb3NNLCBGeGFhRmxvYXQyKDEuMCwgLTEuMCksIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpKTtcXG4gIEZ4YWFGbG9hdCBsdW1hU1cgPSBGeGFhTHVtYShGeGFhVGV4T2ZmKHRleCwgcG9zTSwgRnhhYUZsb2F0MigtMS4wLCAxLjApLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICAjZWxzZVxcbiAgRnhhYUZsb2F0IGx1bWFOVyA9IEZ4YWFMdW1hKEZ4YWFUZXhPZmYodGV4LCBwb3NNLCBGeGFhSW50MigtMSwgLTEpLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICBGeGFhRmxvYXQgbHVtYVNFID0gRnhhYUx1bWEoRnhhYVRleE9mZih0ZXgsIHBvc00sIEZ4YWFJbnQyKDEsIDEpLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICBGeGFhRmxvYXQgbHVtYU5FID0gRnhhYUx1bWEoRnhhYVRleE9mZih0ZXgsIHBvc00sIEZ4YWFJbnQyKDEsIC0xKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgRnhhYUZsb2F0IGx1bWFTVyA9IEZ4YWFMdW1hKEZ4YWFUZXhPZmYodGV4LCBwb3NNLCBGeGFhSW50MigtMSwgMSksIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpKTtcXG4gICNlbmRpZlxcbiAgI2Vsc2VcXG4gIEZ4YWFGbG9hdCBsdW1hTkUgPSBGeGFhTHVtYShGeGFhVGV4T2ZmKHRleCwgcG9zTSwgRnhhYUludDIoMSwgLTEpLCBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSk7XFxuICBGeGFhRmxvYXQgbHVtYVNXID0gRnhhYUx1bWEoRnhhYVRleE9mZih0ZXgsIHBvc00sIEZ4YWFJbnQyKC0xLCAxKSwgZnhhYVF1YWxpdHlSY3BGcmFtZS54eSkpO1xcbiAgI2VuZGlmXFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIEZ4YWFGbG9hdCBsdW1hTlMgPSBsdW1hTiArIGx1bWFTO1xcbiAgRnhhYUZsb2F0IGx1bWFXRSA9IGx1bWFXICsgbHVtYUU7XFxuICBGeGFhRmxvYXQgc3VicGl4UmNwUmFuZ2UgPSAxLjAgLyByYW5nZTtcXG4gIEZ4YWFGbG9hdCBzdWJwaXhOU1dFID0gbHVtYU5TICsgbHVtYVdFO1xcbiAgRnhhYUZsb2F0IGVkZ2VIb3J6MSA9ICgtMi4wICogbHVtYU0pICsgbHVtYU5TO1xcbiAgRnhhYUZsb2F0IGVkZ2VWZXJ0MSA9ICgtMi4wICogbHVtYU0pICsgbHVtYVdFO1xcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICBGeGFhRmxvYXQgbHVtYU5FU0UgPSBsdW1hTkUgKyBsdW1hU0U7XFxuICBGeGFhRmxvYXQgbHVtYU5XTkUgPSBsdW1hTlcgKyBsdW1hTkU7XFxuICBGeGFhRmxvYXQgZWRnZUhvcnoyID0gKC0yLjAgKiBsdW1hRSkgKyBsdW1hTkVTRTtcXG4gIEZ4YWFGbG9hdCBlZGdlVmVydDIgPSAoLTIuMCAqIGx1bWFOKSArIGx1bWFOV05FO1xcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICBGeGFhRmxvYXQgbHVtYU5XU1cgPSBsdW1hTlcgKyBsdW1hU1c7XFxuICBGeGFhRmxvYXQgbHVtYVNXU0UgPSBsdW1hU1cgKyBsdW1hU0U7XFxuICBGeGFhRmxvYXQgZWRnZUhvcno0ID0gKGFicyhlZGdlSG9yejEpICogMi4wKSArIGFicyhlZGdlSG9yejIpO1xcbiAgRnhhYUZsb2F0IGVkZ2VWZXJ0NCA9IChhYnMoZWRnZVZlcnQxKSAqIDIuMCkgKyBhYnMoZWRnZVZlcnQyKTtcXG4gIEZ4YWFGbG9hdCBlZGdlSG9yejMgPSAoLTIuMCAqIGx1bWFXKSArIGx1bWFOV1NXO1xcbiAgRnhhYUZsb2F0IGVkZ2VWZXJ0MyA9ICgtMi4wICogbHVtYVMpICsgbHVtYVNXU0U7XFxuICBGeGFhRmxvYXQgZWRnZUhvcnogPSBhYnMoZWRnZUhvcnozKSArIGVkZ2VIb3J6NDtcXG4gIEZ4YWFGbG9hdCBlZGdlVmVydCA9IGFicyhlZGdlVmVydDMpICsgZWRnZVZlcnQ0O1xcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICBGeGFhRmxvYXQgc3VicGl4TldTV05FU0UgPSBsdW1hTldTVyArIGx1bWFORVNFO1xcbiAgRnhhYUZsb2F0IGxlbmd0aFNpZ24gPSBmeGFhUXVhbGl0eVJjcEZyYW1lLng7XFxuICBGeGFhQm9vbCBob3J6U3BhbiA9IGVkZ2VIb3J6ID49IGVkZ2VWZXJ0O1xcbiAgRnhhYUZsb2F0IHN1YnBpeEEgPSBzdWJwaXhOU1dFICogMi4wICsgc3VicGl4TldTV05FU0U7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIGlmICghaG9yelNwYW4pIGx1bWFOID0gbHVtYVc7XFxuICBpZiAoIWhvcnpTcGFuKSBsdW1hUyA9IGx1bWFFO1xcbiAgaWYgKGhvcnpTcGFuKSBsZW5ndGhTaWduID0gZnhhYVF1YWxpdHlSY3BGcmFtZS55O1xcbiAgRnhhYUZsb2F0IHN1YnBpeEIgPSAoc3VicGl4QSAqICgxLjAgLyAxMi4wKSkgLSBsdW1hTTtcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgRnhhYUZsb2F0IGdyYWRpZW50TiA9IGx1bWFOIC0gbHVtYU07XFxuICBGeGFhRmxvYXQgZ3JhZGllbnRTID0gbHVtYVMgLSBsdW1hTTtcXG4gIEZ4YWFGbG9hdCBsdW1hTk4gPSBsdW1hTiArIGx1bWFNO1xcbiAgRnhhYUZsb2F0IGx1bWFTUyA9IGx1bWFTICsgbHVtYU07XFxuICBGeGFhQm9vbCBwYWlyTiA9IGFicyhncmFkaWVudE4pID49IGFicyhncmFkaWVudFMpO1xcbiAgRnhhYUZsb2F0IGdyYWRpZW50ID0gbWF4KGFicyhncmFkaWVudE4pLCBhYnMoZ3JhZGllbnRTKSk7XFxuICBpZiAocGFpck4pIGxlbmd0aFNpZ24gPSAtbGVuZ3RoU2lnbjtcXG4gIEZ4YWFGbG9hdCBzdWJwaXhDID0gRnhhYVNhdChhYnMoc3VicGl4QikgKiBzdWJwaXhSY3BSYW5nZSk7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIEZ4YWFGbG9hdDIgcG9zQjtcXG4gIHBvc0IueCA9IHBvc00ueDtcXG4gIHBvc0IueSA9IHBvc00ueTtcXG4gIEZ4YWFGbG9hdDIgb2ZmTlA7XFxuICBvZmZOUC54ID0gKCFob3J6U3BhbikgPyAwLjAgOiBmeGFhUXVhbGl0eVJjcEZyYW1lLng7XFxuICBvZmZOUC55ID0gKGhvcnpTcGFuKSA/IDAuMCA6IGZ4YWFRdWFsaXR5UmNwRnJhbWUueTtcXG4gIGlmICghaG9yelNwYW4pIHBvc0IueCArPSBsZW5ndGhTaWduICogMC41O1xcbiAgaWYgKGhvcnpTcGFuKSBwb3NCLnkgKz0gbGVuZ3RoU2lnbiAqIDAuNTtcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgRnhhYUZsb2F0MiBwb3NOO1xcbiAgcG9zTi54ID0gcG9zQi54IC0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAwO1xcbiAgcG9zTi55ID0gcG9zQi55IC0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVAwO1xcbiAgRnhhYUZsb2F0MiBwb3NQO1xcbiAgcG9zUC54ID0gcG9zQi54ICsgb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAwO1xcbiAgcG9zUC55ID0gcG9zQi55ICsgb2ZmTlAueSAqIEZYQUFfUVVBTElUWVAwO1xcbiAgRnhhYUZsb2F0IHN1YnBpeEQgPSAoKC0yLjApICogc3VicGl4QykgKyAzLjA7XFxuICBGeGFhRmxvYXQgbHVtYUVuZE4gPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zTikpO1xcbiAgRnhhYUZsb2F0IHN1YnBpeEUgPSBzdWJwaXhDICogc3VicGl4QztcXG4gIEZ4YWFGbG9hdCBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQKSk7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIGlmICghcGFpck4pIGx1bWFOTiA9IGx1bWFTUztcXG4gIEZ4YWFGbG9hdCBncmFkaWVudFNjYWxlZCA9IGdyYWRpZW50ICogMS4wIC8gNC4wO1xcbiAgRnhhYUZsb2F0IGx1bWFNTSA9IGx1bWFNIC0gbHVtYU5OICogMC41O1xcbiAgRnhhYUZsb2F0IHN1YnBpeEYgPSBzdWJwaXhEICogc3VicGl4RTtcXG4gIEZ4YWFCb29sIGx1bWFNTFRaZXJvID0gbHVtYU1NIDwgMC4wO1xcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICBsdW1hRW5kTiAtPSBsdW1hTk4gKiAwLjU7XFxuICBsdW1hRW5kUCAtPSBsdW1hTk4gKiAwLjU7XFxuICBGeGFhQm9vbCBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICBGeGFhQm9vbCBkb25lUCA9IGFicyhsdW1hRW5kUCkgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICBpZiAoIWRvbmVOKSBwb3NOLnggLT0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAxO1xcbiAgaWYgKCFkb25lTikgcG9zTi55IC09IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQMTtcXG4gIEZ4YWFCb29sIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgaWYgKCFkb25lUCkgcG9zUC54ICs9IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQMTtcXG4gIGlmICghZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDE7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIGlmIChkb25lTlApIHtcXG4gICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zTi54eSkpO1xcbiAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQLnh5KSk7XFxuICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gbHVtYUVuZFAgLSBsdW1hTk4gKiAwLjU7XFxuICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICBpZiAoIWRvbmVOKSBwb3NOLnggLT0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAyO1xcbiAgICBpZiAoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVAyO1xcbiAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgaWYgKCFkb25lUCkgcG9zUC54ICs9IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQMjtcXG4gICAgaWYgKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQMjtcXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICNpZiAoRlhBQV9RVUFMSVRZUFMgPiAzKVxcbiAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc04ueHkpKTtcXG4gICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc1AueHkpKTtcXG4gICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IGx1bWFFbmRQIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgZG9uZU4gPSBhYnMobHVtYUVuZE4pID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgaWYgKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQMztcXG4gICAgICAgIGlmICghZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDM7XFxuICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgIGlmICghZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDM7XFxuICAgICAgICBpZiAoIWRvbmVQKSBwb3NQLnkgKz0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVAzO1xcbiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAjaWYgKEZYQUFfUVVBTElUWVBTID4gNClcXG4gICAgICAgICAgaWYgKGRvbmVOUCkge1xcbiAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc04ueHkpKTtcXG4gICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQLnh5KSk7XFxuICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBsdW1hRW5kTiAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IGx1bWFFbmRQIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgICAgICBkb25lUCA9IGFicyhsdW1hRW5kUCkgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgaWYgKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQNDtcXG4gICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVA0O1xcbiAgICAgICAgICAgIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDQ7XFxuICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQNDtcXG4gICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gICAgICAgICAgICAjaWYgKEZYQUFfUVVBTElUWVBTID4gNSlcXG4gICAgICAgICAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zTi54eSkpO1xcbiAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQLnh5KSk7XFxuICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gbHVtYUVuZFAgLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnggLT0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVA1O1xcbiAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVA1O1xcbiAgICAgICAgICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC54ICs9IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQNTtcXG4gICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQNTtcXG4gICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICNpZiAoRlhBQV9RVUFMSVRZUFMgPiA2KVxcbiAgICAgICAgICAgICAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc04ueHkpKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc1AueHkpKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IGx1bWFFbmRQIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgICAgICAgICAgICAgZG9uZU4gPSBhYnMobHVtYUVuZE4pID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQNjtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDY7XFxuICAgICAgICAgICAgICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDY7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBwb3NQLnkgKz0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVA2O1xcbiAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAjaWYgKEZYQUFfUVVBTElUWVBTID4gNylcXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmVOUCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc04ueHkpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQLnh5KSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBsdW1hRW5kTiAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IGx1bWFFbmRQIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lUCA9IGFicyhsdW1hRW5kUCkgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQNztcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVA3O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQNztcXG4gICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gICAgICAgICAgICAgICAgICAgICAgICAjaWYgKEZYQUFfUVVBTElUWVBTID4gOClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zTi54eSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQLnh5KSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gbHVtYUVuZFAgLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnggLT0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVA4O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVA4O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC54ICs9IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQODtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQODtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiAoRlhBQV9RVUFMSVRZUFMgPiA5KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc04ueHkpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gRnhhYUx1bWEoRnhhYVRleFRvcCh0ZXgsIHBvc1AueHkpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IGx1bWFFbmRQIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZU4gPSBhYnMobHVtYUVuZE4pID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiBGWEFBX1FVQUxJVFlQOTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBwb3NQLnkgKz0gb2ZmTlAueSAqIEZYQUFfUVVBTElUWVA5O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgKEZYQUFfUVVBTElUWVBTID4gMTApXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBsdW1hRW5kTiA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NOLnh5KSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgbHVtYUVuZFAgPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zUC54eSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIHBvc04ueCAtPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDEwO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDEwO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogRlhBQV9RVUFMSVRZUDEwO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDEwO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZiAoRlhBQV9RVUFMSVRZUFMgPiAxMSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lTlApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zTi54eSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKEZ4YWFUZXhUb3AodGV4LCBwb3NQLnh5KSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gbHVtYUVuZFAgLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnggLT0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAxMTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgcG9zTi55IC09IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQMTE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBwb3NQLnggKz0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAxMTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiBGWEFBX1FVQUxJVFlQMTE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgKEZYQUFfUVVBTElUWVBTID4gMTIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmVOUCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zTi54eSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lUCkgbHVtYUVuZFAgPSBGeGFhTHVtYShGeGFhVGV4VG9wKHRleCwgcG9zUC54eSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lTikgbHVtYUVuZE4gPSBsdW1hRW5kTiAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIGx1bWFFbmRQID0gbHVtYUVuZFAgLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lUCA9IGFicyhsdW1hRW5kUCkgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVOKSBwb3NOLnggLT0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAxMjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDEyO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZU5QID0gKCFkb25lTikgfHwgKCFkb25lUCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmVQKSBwb3NQLnggKz0gb2ZmTlAueCAqIEZYQUFfUVVBTElUWVAxMjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogRlhBQV9RVUFMSVRZUDEyO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmXFxuICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxcbiAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAjZW5kaWZcXG4gICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgI2VuZGlmXFxuICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgICAgIH1cXG4gICAgICAgICNlbmRpZlxcbiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICAgICAgfVxcbiAgICAjZW5kaWZcXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXFxuICB9XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIEZ4YWFGbG9hdCBkc3ROID0gcG9zTS54IC0gcG9zTi54O1xcbiAgRnhhYUZsb2F0IGRzdFAgPSBwb3NQLnggLSBwb3NNLng7XFxuICBpZiAoIWhvcnpTcGFuKSBkc3ROID0gcG9zTS55IC0gcG9zTi55O1xcbiAgaWYgKCFob3J6U3BhbikgZHN0UCA9IHBvc1AueSAtIHBvc00ueTtcXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xcbiAgRnhhYUJvb2wgZ29vZFNwYW5OID0gKGx1bWFFbmROIDwgMC4wKSAhPSBsdW1hTUxUWmVybztcXG4gIEZ4YWFGbG9hdCBzcGFuTGVuZ3RoID0gKGRzdFAgKyBkc3ROKTtcXG4gIEZ4YWFCb29sIGdvb2RTcGFuUCA9IChsdW1hRW5kUCA8IDAuMCkgIT0gbHVtYU1MVFplcm87XFxuICBGeGFhRmxvYXQgc3Bhbkxlbmd0aFJjcCA9IDEuMCAvIHNwYW5MZW5ndGg7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIEZ4YWFCb29sIGRpcmVjdGlvbk4gPSBkc3ROIDwgZHN0UDtcXG4gIEZ4YWFGbG9hdCBkc3QgPSBtaW4oZHN0TiwgZHN0UCk7XFxuICBGeGFhQm9vbCBnb29kU3BhbiA9IGRpcmVjdGlvbk4gPyBnb29kU3Bhbk4gOiBnb29kU3BhblA7XFxuICBGeGFhRmxvYXQgc3VicGl4RyA9IHN1YnBpeEYgKiBzdWJwaXhGO1xcbiAgRnhhYUZsb2F0IHBpeGVsT2Zmc2V0ID0gKGRzdCAqICgtc3Bhbkxlbmd0aFJjcCkpICsgMC41O1xcbiAgRnhhYUZsb2F0IHN1YnBpeEggPSBzdWJwaXhHICogZnhhYVF1YWxpdHlTdWJwaXg7XFxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cXG4gIEZ4YWFGbG9hdCBwaXhlbE9mZnNldEdvb2QgPSBnb29kU3BhbiA/IHBpeGVsT2Zmc2V0IDogMC4wO1xcbiAgRnhhYUZsb2F0IHBpeGVsT2Zmc2V0U3VicGl4ID0gbWF4KHBpeGVsT2Zmc2V0R29vZCwgc3VicGl4SCk7XFxuICBpZiAoIWhvcnpTcGFuKSBwb3NNLnggKz0gcGl4ZWxPZmZzZXRTdWJwaXggKiBsZW5ndGhTaWduO1xcbiAgaWYgKGhvcnpTcGFuKSBwb3NNLnkgKz0gcGl4ZWxPZmZzZXRTdWJwaXggKiBsZW5ndGhTaWduO1xcbiAgI2lmIChGWEFBX0RJU0NBUkQgPT0gMSlcXG4gICAgcmV0dXJuIEZ4YWFUZXhUb3AodGV4LCBwb3NNKTtcXG4gICNlbHNlXFxuICByZXR1cm4gRnhhYUZsb2F0NChGeGFhVGV4VG9wKHRleCwgcG9zTSkueHl6LCBsdW1hTSk7XFxuICAjZW5kaWZcXG59XFxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXFxuI2VuZGlmXFxuXFxuXFxudm9pZCBtYWluKCl7XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgdmVjMiBzY3JlZW5JbmZvID0gdmVjMih0ZXh0dXJlU2l6ZSh1X2Jhc2VDb2xvclRleHR1cmUsIDApKTtcXG4gIHJ0MCA9IEZ4YWFQaXhlbFNoYWRlcihcXG4gICAgICB2X3RleGNvb3JkXzAsXFxuICAgICAgdmVjNCgwLjApLFxcbiAgICAgIHVfYmFzZUNvbG9yVGV4dHVyZSxcXG4gICAgICB1X2Jhc2VDb2xvclRleHR1cmUsXFxuICAgICAgdV9iYXNlQ29sb3JUZXh0dXJlLFxcbiAgICAgIDEuMCAvIHNjcmVlbkluZm8sXFxuICAgICAgdmVjNCgwLjApLFxcbiAgICAgIHZlYzQoMC4wKSxcXG4gICAgICB2ZWM0KDAuMCksXFxuICAgICAgMC43NSxcXG4gICAgICAwLjE2NixcXG4gICAgICAwLjA4MzMsXFxuICAgICAgMC4wLFxcbiAgICAgIDAuMCxcXG4gICAgICAwLjAsXFxuICAgICAgdmVjNCgwLjApXFxuICApO1xcbiAgcnQwLmEgPSAxLjA7XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG52b2lkIG1haW4oKXtcXG4jaWZkZWYgUk5fSVNfREFUQVRFWFRVUkVfTU9ERVxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICAjaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gYV9pbnN0YW5jZUluZm8ueTtcXG4gICAgI2Vsc2VcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuI2Vsc2UgLy8gUk5fSVNfVU5JRk9STV9NT0RFXFxuXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IC0xLjA7IC8vIG1hdGVyaWFsU0lEIGlzIG5vdCB1c2VkIGluIFVuaWZvcm0gbW9kZVxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBmbG9hdChnZXRfc2tpbm5pbmdNb2RlKDAuMCwgMCkpO1xcbiAgI2VuZGlmXFxuXFxuI2VuZGlmXFxuXFxuZmxvYXQgY2FtZXJhU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1svKiBzaGFkZXJpdHk6IEB7V2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUR9ICovXTtcXG5cXG4jaWYgZGVmaW5lZChXRUJHTDJfTVVMVElfVklFVykgJiYgZGVmaW5lZChSTl9JU19WRVJURVhfU0hBREVSKVxcbi8vIGlmICh1X2lzTWFpblZyID09IDEpIHtcXG4gIGNhbWVyYVNJRCArPSBmbG9hdChnbF9WaWV3SURfT1ZSKTtcXG4vLyB9XFxuI2VuZGlmXFxuXFxuZmxvYXQgeCA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAmIDEpIDw8IDIpO1xcbmZsb2F0IHkgPSBmbG9hdCgoZ2xfVmVydGV4SUQgJiAyKSA8PCAxKTtcXG52X3RleGNvb3JkXzAueCA9IHggKiAwLjU7XFxudl90ZXhjb29yZF8wLnkgPSB5ICogMC41O1xcbmdsX1Bvc2l0aW9uID0gdmVjNCh4IC0gMS4wLCB5IC0gMS4wLCAwLCAxKTtcXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX1NUQU5EQVJEX0RFUklWQVRJVkVTXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfRFJBV19CVUZGRVJTXFxuI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuaW4gdmVjMyB2X2NvbG9yO1xcbmluIHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5pbiB2ZWM0IHZfcG9zaXRpb25faW5Xb3JsZDtcXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5pbiB2ZWMzIHZfYmFyeUNlbnRyaWNDb29yZDtcXG5cXG51bmlmb3JtIGludCB1X3NoYWRpbmdNb2RlbDsgLy8gaW5pdGlhbFZhbHVlPTBcXG51bmlmb3JtIGZsb2F0IHVfYWxwaGFDdXRvZmY7IC8vIGluaXRpYWxWYWx1ZT0wLjAxXFxudW5pZm9ybSB2ZWM0IHVfZGlmZnVzZUNvbG9yRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9KDEsMSwxLDEpXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9kaWZmdXNlQ29sb3JUZXh0dXJlOyAvLyBpbml0aWFsVmFsdWU9KDAsd2hpdGUpXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9ub3JtYWxUZXh0dXJlOyAvLyBpbml0aWFsVmFsdWU9KDEsYmx1ZSlcXG51bmlmb3JtIHZlYzQgdV9kaWZmdXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtOyAvLyBpbml0aWFsVmFsdWU9KDEsMSwwLDApXFxudW5pZm9ybSBmbG9hdCB1X2RpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbjsgLy8gaW5pdGlhbFZhbHVlPTBcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuXFxudmVjMiB1dlRyYW5zZm9ybSh2ZWMyIHNjYWxlLCB2ZWMyIG9mZnNldCwgZmxvYXQgcm90YXRpb24sIHZlYzIgdXYpIHtcXG4gIG1hdDMgdHJhbnNsYXRpb25NYXQgPSBtYXQzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIG1hdDMgcm90YXRpb25NYXQgPSBtYXQzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIG1hdDMgc2NhbGVNYXQgPSBtYXQzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbWF0MyBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICB2ZWMyIHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzModXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuc3RydWN0IExpZ2h0IHtcXG4gIGludCB0eXBlOyAvLyAwID0gZGlyZWN0aW9uYWwsIDEgPSBwb2ludCwgMiA9IHNwb3RcXG4gIHZlYzMgcG9zaXRpb247XFxuICB2ZWMzIGludGVuc2l0eTtcXG4gIHZlYzMgYXR0ZW51YXRlZEludGVuc2l0eTtcXG4gIHZlYzMgZGlyZWN0aW9uT2ZMaWdodE9iamVjdDtcXG4gIHZlYzMgZGlyZWN0aW9uOyAvLyBkaXJlY3Rpb24gb2YgbGlnaHQgdmVjdG9yLCBlcXVhbCB0byBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KVxcbiAgdmVjMyBwb2ludFRvTGlnaHQ7IC8vIG5vdCBub3JtYWxpemVkXFxuICBmbG9hdCBzcG90QW5nbGVTY2FsZTtcXG4gIGZsb2F0IHNwb3RBbmdsZU9mZnNldDtcXG4gIGZsb2F0IGVmZmVjdGl2ZVJhbmdlO1xcbn07XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL2Jsb2IvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2xpZ2h0c19wdW5jdHVhbC9SRUFETUUubWQjcmFuZ2UtcHJvcGVydHlcXG5mbG9hdCBnZXRSYW5nZUF0dGVudWF0aW9uKExpZ2h0IGxpZ2h0KVxcbntcXG4gIGZsb2F0IGRpc3RhbmNlID0gbGVuZ3RoKGxpZ2h0LnBvaW50VG9MaWdodCk7XFxuICAvLyBtZWFucyBubyByYW5nZSBsaW1pdFxcbiAgaWYgKGxpZ2h0LmVmZmVjdGl2ZVJhbmdlIDw9IDAuMClcXG4gIHtcXG4gICAgcmV0dXJuIDEuMCAvIHBvdyhkaXN0YW5jZSwgMi4wKTtcXG4gIH1cXG4gIHJldHVybiBtYXgobWluKDEuMCAtIHBvdyhkaXN0YW5jZSAvIGxpZ2h0LmVmZmVjdGl2ZVJhbmdlLCA0LjApLCAxLjApLCAwLjApIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbn1cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNpbm5lci1hbmQtb3V0ZXItY29uZS1hbmdsZXNcXG5mbG9hdCBnZXRTcG90QXR0ZW51YXRpb24oTGlnaHQgbGlnaHQpXFxue1xcblxcbiAgZmxvYXQgY2QgPSBkb3QobGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCwgbGlnaHQuZGlyZWN0aW9uKTtcXG4gIGZsb2F0IGFuZ3VsYXJBdHRlbnVhdGlvbiA9IGNsYW1wKGNkICogbGlnaHQuc3BvdEFuZ2xlU2NhbGUgKyBsaWdodC5zcG90QW5nbGVPZmZzZXQsIDAuMCwgMS4wKTtcXG4gIHJldHVybiBhbmd1bGFyQXR0ZW51YXRpb247XFxufVxcblxcbnZvaWQgZ2V0TGlnaHRBdHRlbnVhdGVkKExpZ2h0IGxpZ2h0KSB7XFxuICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xcbiAgLy8gaWYgKGxpZ2h0LnR5cGUgPT0gMCkgeyAvLyBEaXJlY3Rpb25hbCBMaWdodFxcbiAgICAvLyBEaXJlY3Rpb25hbCBMaWdodCBkb24ndCBhdHRlbnVhdGUgZ2VvbWV0aWNhbGx5XFxuICAvLyB9XFxuXFxuICAvLyBQb2ludCBMaWdodFxcbiAgaWYgKGxpZ2h0LnR5cGUgPT0gMSlcXG4gIHtcXG4gICAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSAqPSBnZXRSYW5nZUF0dGVudWF0aW9uKGxpZ2h0KTtcXG4gIH1cXG4gIC8vIFNwb3QgbGlnaHRcXG4gIGlmIChsaWdodC50eXBlID09IDIpXFxuICB7XFxuICAgIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0U3BvdEF0dGVudWF0aW9uKGxpZ2h0KTtcXG4gIH1cXG59XFxuXFxuTGlnaHQgZ2V0TGlnaHQoaW50IGxpZ2h0SWR4LCB2ZWMzIHZfcG9zaXRpb25faW5Xb3JsZCkge1xcbiAgdmVjMyBsaWdodFBvc2l0aW9uID0gZ2V0X2xpZ2h0UG9zaXRpb24oMC4wLCBsaWdodElkeCk7XFxuICB2ZWMzIGRpcmVjdGlvbl9hbmRfd19vZl9MaWdodE9iamVjdCA9IGdldF9saWdodERpcmVjdGlvbigwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzMgbGlnaHRJbnRlbnNpdHkgPSBnZXRfbGlnaHRJbnRlbnNpdHkoMC4wLCBsaWdodElkeCk7XFxuICB2ZWM0IGxpZ2h0UHJvcGVydHkgPSBnZXRfbGlnaHRQcm9wZXJ0eSgwLjAsIGxpZ2h0SWR4KTtcXG4gIExpZ2h0IGxpZ2h0O1xcbiAgbGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCA9IGRpcmVjdGlvbl9hbmRfd19vZl9MaWdodE9iamVjdDtcXG4gIGZsb2F0IGxpZ2h0VHlwZSA9IGxpZ2h0UHJvcGVydHkueDtcXG4gIGxpZ2h0LmVmZmVjdGl2ZVJhbmdlID0gbGlnaHRQcm9wZXJ0eS55O1xcbiAgbGlnaHQuc3BvdEFuZ2xlU2NhbGUgPSBsaWdodFByb3BlcnR5Lno7XFxuICBsaWdodC5zcG90QW5nbGVPZmZzZXQgPSBsaWdodFByb3BlcnR5Lnc7XFxuXFxuICBsaWdodC5pbnRlbnNpdHkgPSBsaWdodEludGVuc2l0eTtcXG4gIGxpZ2h0LnBvc2l0aW9uID0gbGlnaHRQb3NpdGlvbjtcXG4gIGlmIChsaWdodFR5cGUgPCAtMC41KSB7IC8vIGRpc2FibGVkIGxpZ2h0XFxuICAgIGxpZ2h0LmludGVuc2l0eSA9IHZlYzMoMC4wKTtcXG4gICAgbGlnaHQudHlwZSA9IC0xO1xcbiAgfSBlbHNlIGlmICgwLjc1IDwgbGlnaHRUeXBlKSB7IC8vIGlzIHBvaW50bGlnaHQgb3Igc3BvdGxpZ2h0XFxuICAgIGxpZ2h0LnBvaW50VG9MaWdodCA9IGxpZ2h0UG9zaXRpb24gLSB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5wb2ludFRvTGlnaHQpO1xcbiAgICBsaWdodC50eXBlID0gMTtcXG4gIH0gZWxzZSB7IC8vIGlzIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIGxpZ2h0LnR5cGUgPSAwO1xcbiAgICBsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUobGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCAqIC0xLjApO1xcbiAgfVxcblxcbiAgaWYgKGxpZ2h0VHlwZSA+IDEuNzUpIHsgLy8gaXMgc3BvdGxpZ2h0XFxuICAgIGxpZ2h0LnR5cGUgPSAyO1xcbiAgfVxcblxcbiAgY29uc3QgZmxvYXQgTV9QSSA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbiAgbGlnaHQuaW50ZW5zaXR5ICo9IE1fUEk7IC8vIFB1bmN0dWFsIExpZ2h0XFxuXFxuICAvLyBBdHRlbnVhdGlvblxcbiAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTtcXG4gIGdldExpZ2h0QXR0ZW51YXRlZChsaWdodCk7XFxuXFxuICByZXR1cm4gbGlnaHQ7XFxufVxcblxcblxcbnZvaWQgbWFpbiAoKVxcbntcXG5cXG4jaWZkZWYgUk5fSVNfREFUQVRFWFRVUkVfTU9ERVxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICAjaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gYV9pbnN0YW5jZUluZm8ueTtcXG4gICAgI2Vsc2VcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuI2Vsc2UgLy8gUk5fSVNfVU5JRk9STV9NT0RFXFxuXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IC0xLjA7IC8vIG1hdGVyaWFsU0lEIGlzIG5vdCB1c2VkIGluIFVuaWZvcm0gbW9kZVxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBmbG9hdChnZXRfc2tpbm5pbmdNb2RlKDAuMCwgMCkpO1xcbiAgI2VuZGlmXFxuXFxuI2VuZGlmXFxuXFxuZmxvYXQgY2FtZXJhU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1svKiBzaGFkZXJpdHk6IEB7V2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUR9ICovXTtcXG5cXG4jaWYgZGVmaW5lZChXRUJHTDJfTVVMVElfVklFVykgJiYgZGVmaW5lZChSTl9JU19WRVJURVhfU0hBREVSKVxcbi8vIGlmICh1X2lzTWFpblZyID09IDEpIHtcXG4gIGNhbWVyYVNJRCArPSBmbG9hdChnbF9WaWV3SURfT1ZSKTtcXG4vLyB9XFxuI2VuZGlmXFxuXFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfTUFTS1xcbiAgZmxvYXQgYWxwaGFDdXRvZmYgPSBnZXRfYWxwaGFDdXRvZmYobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYgKGFscGhhIDwgYWxwaGFDdXRvZmYpIHtcXG4gICAgZGlzY2FyZDtcXG4gIH1cXG4jZW5kaWZcXG5cXG5cXG4gIC8vIE5vcm1hbFxcbiAgdmVjMyBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZSh2X25vcm1hbF9pbldvcmxkKTtcXG5cXG4gIHZlYzQgZGlmZnVzZUNvbG9yRmFjdG9yID0gZ2V0X2RpZmZ1c2VDb2xvckZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuXFxuXFxuICAvLyBkaWZmdXNlQ29sb3IgKENvbnNpZGVyZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBhbHBoYSlcXG4gIHZlYzMgZGlmZnVzZUNvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gIGZsb2F0IGFscGhhID0gMS4wO1xcbiAgaWYgKHZfY29sb3IgIT0gZGlmZnVzZUNvbG9yICYmIGRpZmZ1c2VDb2xvckZhY3Rvci5yZ2IgIT0gZGlmZnVzZUNvbG9yKSB7XFxuICAgIGRpZmZ1c2VDb2xvciA9IHZfY29sb3IgKiBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGRpZmZ1c2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmICh2X2NvbG9yID09IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGRpZmZ1c2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmIChkaWZmdXNlQ29sb3JGYWN0b3IucmdiID09IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSB2X2NvbG9yO1xcbiAgfSBlbHNlIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gdmVjMygxLjAsIDEuMCwgMS4wKTtcXG4gIH1cXG5cXG4gIC8vIGRpZmZ1c2VDb2xvclRleHR1cmUgKENvbnNpZGVyZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBhbHBoYSlcXG4gIHZlYzQgZGlmZnVzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9kaWZmdXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IGRpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbiA9IGdldF9kaWZmdXNlQ29sb3JUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBkaWZmdXNlQ29sb3JUZXhVdiA9IHV2VHJhbnNmb3JtKGRpZmZ1c2VDb2xvclRleHR1cmVUcmFuc2Zvcm0ueHksIGRpZmZ1c2VDb2xvclRleHR1cmVUcmFuc2Zvcm0uencsIGRpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbiwgdl90ZXhjb29yZF8wKTtcXG4gIHZlYzQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZSh1X2RpZmZ1c2VDb2xvclRleHR1cmUsIGRpZmZ1c2VDb2xvclRleFV2KTtcXG4gIGRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlQ29sb3IucmdiO1xcbiAgYWxwaGEgKj0gdGV4dHVyZUNvbG9yLmE7XFxuXFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfQkxFTkRcXG4jZWxzZVxcbiAgYWxwaGEgPSAxLjA7XFxuI2VuZGlmXFxuXFxuICBydDAgPSB2ZWM0KGRpZmZ1c2VDb2xvciAqIGFscGhhLCBhbHBoYSk7XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG5cXG59XFxuXFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMzIGFfY29sb3I7XFxuaW4gdmVjMyBhX25vcm1hbDtcXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzQgYV9qb2ludDtcXG5pbiB2ZWM0IGFfd2VpZ2h0O1xcbmluIHZlYzQgYV9iYXJ5Q2VudHJpY0Nvb3JkO1xcbm91dCB2ZWMzIHZfY29sb3I7XFxub3V0IHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5vdXQgdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcbm91dCB2ZWMzIHZfYmFyeUNlbnRyaWNDb29yZDtcXG5cXG51bmlmb3JtIGZsb2F0IHVfcG9pbnRTaXplOyAvLyBpbml0aWFsVmFsdWU9MzBcXG51bmlmb3JtIHZlYzMgdV9wb2ludERpc3RhbmNlQXR0ZW51YXRpb247IC8vIGluaXRpYWxWYWx1ZT0oMCwwLjEsMC4wMSlcXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5tYXQzIHRvTm9ybWFsTWF0cml4KG1hdDQgbSkge1xcbiAgZmxvYXQgYTAwID0gbVswXVswXSwgYTAxID0gbVswXVsxXSwgYTAyID0gbVswXVsyXSwgYTAzID0gbVswXVszXSxcXG4gIGExMCA9IG1bMV1bMF0sIGExMSA9IG1bMV1bMV0sIGExMiA9IG1bMV1bMl0sIGExMyA9IG1bMV1bM10sXFxuICBhMjAgPSBtWzJdWzBdLCBhMjEgPSBtWzJdWzFdLCBhMjIgPSBtWzJdWzJdLCBhMjMgPSBtWzJdWzNdLFxcbiAgYTMwID0gbVszXVswXSwgYTMxID0gbVszXVsxXSwgYTMyID0gbVszXVsyXSwgYTMzID0gbVszXVszXTtcXG5cXG4gIGZsb2F0IGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcXG4gIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcXG4gIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcXG4gIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcXG4gIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcXG4gIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcXG4gIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcXG4gIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcXG4gIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcXG4gIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcXG4gIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcXG4gIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcXG5cXG4gIGZsb2F0IGRldGVybWluYW50VmFsID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xcblxcbiAgcmV0dXJuIG1hdDMoXFxuICAgIGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSwgYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3LCBhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYsXFxuICAgIGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSwgYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3LCBhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYsXFxuICAgIGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMywgYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxLCBhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApIC8gZGV0ZXJtaW5hbnRWYWw7XFxufVxcblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcblxcbmhpZ2hwIG1hdDQgY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKCBoaWdocCB2ZWM0IHF1YXRlcm5pb24sIGhpZ2hwIHZlYzMgdHJhbnNsYXRpb24sIGhpZ2hwIHZlYzMgc2NhbGUgKSB7XFxuICBoaWdocCB2ZWM0IHEgPSBxdWF0ZXJuaW9uO1xcbiAgaGlnaHAgdmVjMyB0ID0gdHJhbnNsYXRpb247XFxuXFxuICBoaWdocCBmbG9hdCBzeCA9IHEueCAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHN5ID0gcS55ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgc3ogPSBxLnogKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeCA9IHEueSAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN5ID0gcS54ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ogPSBxLnggKiBxLnk7XFxuICBoaWdocCBmbG9hdCB3eCA9IHEudyAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHd5ID0gcS53ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ogPSBxLncgKiBxLno7XFxuXFxuICBoaWdocCBtYXQ0IG1hdCA9IG1hdDQoXFxuICAgIDEuMCAtIDIuMCAqIChzeSArIHN6KSwgMi4wICogKGN6ICsgd3opLCAyLjAgKiAoY3kgLSB3eSksIDAuMCxcXG4gICAgMi4wICogKGN6IC0gd3opLCAxLjAgLSAyLjAgKiAoc3ggKyBzeiksIDIuMCAqIChjeCArIHd4KSwgMC4wLFxcbiAgICAyLjAgKiAoY3kgKyB3eSksIDIuMCAqIChjeCAtIHd4KSwgMS4wIC0gMi4wICogKHN4ICsgc3kpLCAwLjAsXFxuICAgIHQueCwgdC55LCB0LnosIDEuMFxcbiAgKTtcXG5cXG4gIGhpZ2hwIG1hdDQgdW5pZm9ybVNjYWxlTWF0ID0gbWF0NChcXG4gICAgc2NhbGUueCwgMC4wLCAwLjAsIDAuMCxcXG4gICAgMC4wLCBzY2FsZS55LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIHNjYWxlLnosIDAuMCxcXG4gICAgMC4wLCAwLjAsIDAuMCwgMS4wXFxuICApO1xcblxcbiAgcmV0dXJuIG1hdCp1bmlmb3JtU2NhbGVNYXQ7XFxufVxcblxcbmhpZ2hwIHZlYzQgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChoaWdocCB2ZWMyIHZlY194eSwgaGlnaHAgZmxvYXQgY3JpdGVyaWEpe1xcblxcbiAgaGlnaHAgZmxvYXQgcjtcXG4gIGhpZ2hwIGZsb2F0IGc7XFxuICBoaWdocCBmbG9hdCBiO1xcbiAgaGlnaHAgZmxvYXQgYTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl4ID0gZmxvb3IodmVjX3h5LnggKiBjcml0ZXJpYSk7XFxuICBoaWdocCBmbG9hdCB2MXggPSBpeCAvIGNyaXRlcmlhO1xcbiAgaGlnaHAgZmxvYXQgdjF5ID0gaXggLSBmbG9vcih2MXgpICogY3JpdGVyaWE7XFxuXFxuICByID0gKCB2MXggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgZyA9ICggdjF5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl5ID0gZmxvb3IoIHZlY194eS55ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjJ4ID0gaXkgLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYyeSA9IGl5IC0gZmxvb3IodjJ4KSAqIGNyaXRlcmlhO1xcblxcbiAgYiA9ICggdjJ4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGEgPSAoIHYyeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICByIC09IDEuMC9jcml0ZXJpYTtcXG4gIGcgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYiAtPSAxLjAvY3JpdGVyaWE7XFxuICBhIC09IDEuMC9jcml0ZXJpYTtcXG5cXG4gIHIgPSByKjIuMC0xLjA7XFxuICBnID0gZyoyLjAtMS4wO1xcbiAgYiA9IGIqMi4wLTEuMDtcXG4gIGEgPSBhKjIuMC0xLjA7XFxuXFxuICByZXR1cm4gdmVjNChyLCBnLCBiLCBhKTtcXG59XFxuXFxubWF0NCBnZXRTa2luTWF0cml4KGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEKSB7XFxuXFxuI2lmZGVmIFJOX0JPTkVfREFUQV9UWVBFX01hdDQzeDFcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSkpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyKVxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcblxcbiAgdmVjNCB0cV94ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IHNxX3ggPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3gudywgc3FfeC53KSwgY3JpdGVyaWEueCk7XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3gueHl6LCBzcV94Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgc3FfeSA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3kudywgc3FfeS53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeS54eXosIHNxX3kueHl6KTtcXG5cXG4gIHZlYzQgdHFfeiA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBzcV96ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfei53LCBzcV96LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV96Lnh5eiwgc3Ffei54eXopO1xcblxcbiAgdmVjNCB0cV93ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICB2ZWM0IHNxX3cgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV93LncsIHNxX3cudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3cueHl6LCBzcV93Lnh5eik7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDJfT0xEKVxcbiAgdmVjNCB0c194ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgdmVjNCB0c195ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgxKVxcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ggPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1kgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ogPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1cgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcblxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZEluZm8gPSBnZXRfYm9uZUNvbXByZXNzZWRJbmZvKDAuMCwgMCk7XFxuXFxuICB2ZWM0IHRzX3ggPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1gueHksIGNyaXRlcmlhLngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnh5LCBjcml0ZXJpYS54KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi54eSwgY3JpdGVyaWEueCksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgdmVjNCB0c193ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cueHksIGNyaXRlcmlhLngpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG4jZW5kaWZcXG4gIHJldHVybiBza2luTWF0O1xcbn1cXG4jZW5kaWZcXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5ib29sIHNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQzIGluTm9ybWFsTWF0cml4LFxcbiAgb3V0IG1hdDMgb3V0Tm9ybWFsTWF0cml4LFxcbiAgaW4gdmVjMyBpblBvc2l0aW9uX2luTG9jYWwsXFxuICBvdXQgdmVjNCBvdXRQb3NpdGlvbl9pbldvcmxkLFxcbiAgaW4gdmVjMyBpbk5vcm1hbF9pbkxvY2FsLFxcbiAgb3V0IHZlYzMgb3V0Tm9ybWFsX2luV29ybGRcXG4gIClcXG57XFxuICBtYXQ0IHNraW5NYXQgPSBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lEKTtcXG4gIG91dFBvc2l0aW9uX2luV29ybGQgPSBza2luTWF0ICogdmVjNChpblBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICBvdXROb3JtYWxNYXRyaXggPSB0b05vcm1hbE1hdHJpeChza2luTWF0KTtcXG4gIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKG91dE5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcblxcbiAgcmV0dXJuIHRydWU7XFxufVxcbiNlbmRpZlxcblxcbmJvb2wgcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gIGluIG1hdDQgd29ybGRNYXRyaXgsXFxuICBpbiBtYXQ0IHZpZXdNYXRyaXgsXFxuICBpbiBib29sIGlzQmlsbGJvYXJkLFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuKSB7XFxuICBib29sIGlzU2tpbm5pbmcgPSBmYWxzZTtcXG5cXG4gIHZlYzMgcG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIGlmICh1X21vcnBoVGFyZ2V0TnVtYmVyID09IDApIHtcXG4jZW5kaWZcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGluUG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIH0gZWxzZSB7XFxuICAgIGZsb2F0IHZlcnRleElkeCA9IGFfYmFyeUNlbnRyaWNDb29yZC53O1xcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gZ2V0X3Bvc2l0aW9uKHZlcnRleElkeCwgaW5Qb3NpdGlvbl9pbkxvY2FsKTtcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIG1hdDQgd29ybGRNYXRyaXhJbm5lciA9IHdvcmxkTWF0cml4O1xcbiAgaWYgKGlzQmlsbGJvYXJkKSB7XFxuICAgIG1hdDQgaW52ZXJzZVZpZXdNYXRyaXggPSBpbnZlcnNlKHZpZXdNYXRyaXgpO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVswXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzBdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsxXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzFdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsyXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzJdO1xcbiAgICB3b3JsZE1hdHJpeElubmVyID0gaW52ZXJzZVZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeDtcXG4gIH1cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIGlmIChza2VsZXRhbENvbXBvbmVudFNJRCA+PSAwLjApIHtcXG4gICAgaXNTa2lubmluZyA9IHNraW5uaW5nKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbk5vcm1hbE1hdHJpeCwgb3V0Tm9ybWFsTWF0cml4LCBwb3NpdGlvbl9pbkxvY2FsLCBvdXRQb3NpdGlvbl9pbldvcmxkLCBpbk5vcm1hbF9pbkxvY2FsLCBvdXROb3JtYWxfaW5Xb3JsZCk7XFxuICB9IGVsc2Uge1xcbiNlbmRpZlxcbiAgICBvdXROb3JtYWxNYXRyaXggPSBpbk5vcm1hbE1hdHJpeDtcXG4gICAgb3V0UG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4SW5uZXIgKiB2ZWM0KHBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICAgIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGluTm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICB9XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gaXNTa2lubmluZztcXG59XFxuXFxuXFxudm9pZCBtYWluKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgbWF0NCB3b3JsZE1hdHJpeCA9IGdldF93b3JsZE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG4gIG1hdDQgdmlld01hdHJpeCA9IGdldF92aWV3TWF0cml4KGNhbWVyYVNJRCwgMCk7XFxuICBtYXQ0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0MyBub3JtYWxNYXRyaXggPSBnZXRfbm9ybWFsTWF0cml4KGFfaW5zdGFuY2VJbmZvLngpO1xcbiAgYm9vbCBpc0JpbGxib2FyZCA9IGdldF9pc0JpbGxib2FyZChhX2luc3RhbmNlSW5mby54KTtcXG5cXG4gIC8vIFNrZWxldGFsXFxuICBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICAgIHdvcmxkTWF0cml4LFxcbiAgICB2aWV3TWF0cml4LFxcbiAgICBpc0JpbGxib2FyZCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBub3JtYWxNYXRyaXgsXFxuICAgIGFfcG9zaXRpb24sXFxuICAgIHZfcG9zaXRpb25faW5Xb3JsZCxcXG4gICAgYV9ub3JtYWwsXFxuICAgIHZfbm9ybWFsX2luV29ybGRcXG4gICk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcblxcbiAgdl9jb2xvciA9IGFfY29sb3I7XFxuICB2X25vcm1hbF9pbldvcmxkID0gbm9ybWFsTWF0cml4ICogYV9ub3JtYWw7XFxuICB2X3RleGNvb3JkXzAgPSBhX3RleGNvb3JkXzA7XFxuICB2X2JhcnlDZW50cmljQ29vcmQgPSBhX2JhcnlDZW50cmljQ29vcmQueHl6O1xcblxcbiAgYm9vbCB2aXNpYmlsaXR5ID0gZ2V0X2lzVmlzaWJsZShhX2luc3RhbmNlSW5mby54KTtcXG4gIGlmICghdmlzaWJpbGl0eSlcXG4gIHtcXG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDAuMCk7XFxuICB9XFxuXFxuLy8gI2lmZGVmIFJOX0lTX1BPSU5UU1BSSVRFXFxuXFxudmVjNCBwb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sIDEuMCk7XFxudmVjMyB2aWV3UG9zaXRpb24gPSBnZXRfdmlld1Bvc2l0aW9uKGNhbWVyYVNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VGcm9tQ2FtZXJhID0gbGVuZ3RoKHBvc2l0aW9uX2luV29ybGQueHl6IC0gdmlld1Bvc2l0aW9uKTtcXG52ZWMzIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbiA9IGdldF9wb2ludERpc3RhbmNlQXR0ZW51YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbmZsb2F0IGRpc3RhbmNlQXR0ZW51YXRpb25GYWN0b3IgPSBzcXJ0KDEuMC8ocG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnggKyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueSAqIGRpc3RhbmNlRnJvbUNhbWVyYSArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi56ICogZGlzdGFuY2VGcm9tQ2FtZXJhICogZGlzdGFuY2VGcm9tQ2FtZXJhKSk7XFxuZmxvYXQgbWF4UG9pbnRTaXplID0gZ2V0X3BvaW50U2l6ZShtYXRlcmlhbFNJRCwgMCk7XFxuZ2xfUG9pbnRTaXplID0gY2xhbXAoZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciAqIG1heFBvaW50U2l6ZSwgMC4wLCBtYXhQb2ludFNpemUpO1xcblxcbi8vICNlbmRpZlxcblxcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmQ7XFxuaW4gdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbmluIHZlYzQgdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4jZGVmaW5lIE1BVEhfUEkgMy4xNDE1OTJcXG5cXG4vLyBUaGVzZSBjb2RlcyBhcmUgcmVmZXJlbmNlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rbmFya293aWN6L0Z1cm5hY2VUZXN0XFxuZmxvYXQgcm91Z2huZXNzUmVtYXAoZmxvYXQgdXNlclJvdWdobmVzcykge1xcbiAgcmV0dXJuIHVzZXJSb3VnaG5lc3MgKiB1c2VyUm91Z2huZXNzO1xcbn1cXG5cXG4vLyBHR1ggTkRGXFxuZmxvYXQgZF9nZ3goZmxvYXQgdXNlclJvdWdobmVzcywgZmxvYXQgTkgpIHtcXG4gIGZsb2F0IGFscGhhUm91Z2huZXNzID0gdXNlclJvdWdobmVzcyAqIHVzZXJSb3VnaG5lc3M7XFxuICBmbG9hdCByb3VnaG5lc3NTcXIgPSBhbHBoYVJvdWdobmVzcyAqIGFscGhhUm91Z2huZXNzO1xcbiAgZmxvYXQgZiA9IChyb3VnaG5lc3NTcXIgLSAxLjApICogTkggKiBOSCArIDEuMDtcXG4gIHJldHVybiByb3VnaG5lc3NTcXIgLyAoTUFUSF9QSSAqIGYgKiBmKTtcXG59XFxuXFxuLy8gdGhpcyBpcyBmcm9tIGh0dHBzOi8vd3d3LnVucmVhbGVuZ2luZS5jb20vYmxvZy9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctb24tbW9iaWxlXFxudmVjMiBlbnZCUkRGQXBwcm94KCBmbG9hdCBSb3VnaG5lc3MsIGZsb2F0IE5vViApIHtcXG4gIGNvbnN0IHZlYzQgYzAgPSB2ZWM0KC0xLCAtMC4wMjc1LCAtMC41NzIsIDAuMDIyICk7XFxuICBjb25zdCB2ZWM0IGMxID0gdmVjNCgxLCAwLjA0MjUsIDEuMDQsIC0wLjA0ICk7XFxuICB2ZWM0IHIgPSBSb3VnaG5lc3MgKiBjMCArIGMxO1xcbiAgZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtOS4yOCAqIE5vViApICkgKiByLnggKyByLnk7XFxuICB2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcbiAgcmV0dXJuIEFCO1xcbn1cXG5cXG5mbG9hdCBzcGVjdWxhcklCTChmbG9hdCB1c2VyUm91Z2huZXNzLCBmbG9hdCBOViwgZmxvYXQgZjApIHtcXG4gIC8vLyBVc2Ugc3BlY3VsYXIgQlJERiBMVVRcXG4gIC8vIHZlYzMgYnJkZiA9IHRleHR1cmUodV9icmRmTHV0VGV4dHVyZSwgdmVjMihOViwgMS4wIC0gdXNlclJvdWdobmVzcykpLnJnYjtcXG4gIC8vIGZsb2F0IHNwZWN1bGFyID0gMS4wICogKGYwICogYnJkZi54ICsgYnJkZi55KTtcXG5cXG4gIC8vLyBVc2Ugc3BlY3VsYXIgQlJERiBBcHByb3hcXG4gIHZlYzIgZl9hYiA9IGVudkJSREZBcHByb3godXNlclJvdWdobmVzcywgTlYpO1xcbiAgdmVjMyBzcGVjdWxhciA9IHZlYzMoZjApICogZl9hYi54ICsgZl9hYi55O1xcbiAgcmV0dXJuIHNwZWN1bGFyLng7XFxufVxcblxcbi8vIFRoZSBTY2hsaWNrIEFwcHJveGltYXRpb24gdG8gRnJlc25lbFxcbmZsb2F0IGZyZXNuZWwoZmxvYXQgZjAsIGZsb2F0IFZIKSB7XFxuICByZXR1cm4gZjAgKyAoMS4wIC0gZjApICogcG93KDEuMCAtIFZILCA1LjApO1xcbn1cXG5cXG5mbG9hdCBzbWl0aEcxKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9WKVxcbntcXG5cXHRmbG9hdCBhID0gcm91Z2huZXNzUmVtYXAoIHJvdWdobmVzcyApO1xcblxcdGZsb2F0IGEyID0gYSAqIGE7XFxuXFx0ZmxvYXQgTm9WMiA9IE5vViAqIE5vVjtcXG5cXHRmbG9hdCBsYW1iZGEgPSAoLTEuMCArIHNxcnQoMS4wICsgYTIgKiAoMS4wIC0gTm9WMikgLyBOb1YyKSkgKiAwLjU7XFxuXFx0cmV0dXJuIDEuMCAvICgxLjAgKyBsYW1iZGEpO1xcbn1cXG5cXG5mbG9hdCBzbWl0aEcoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb1YsIGZsb2F0IE5vTClcXG57XFxuXFx0ZmxvYXQgYSA9IHJvdWdobmVzc1JlbWFwKCByb3VnaG5lc3MgKTtcXG5cXHRmbG9hdCBhMiA9IGEgKiBhO1xcblxcdGZsb2F0IE5vVjIgPSBOb1YgKiBOb1Y7XFxuXFx0ZmxvYXQgTm9MMiA9IE5vTCAqIE5vTDtcXG5cXHRmbG9hdCBsYW1iZGFWID0gKC0xLjAgKyBzcXJ0KDEuMCArIGEyICogKDEuMCAtIE5vVjIpIC8gTm9WMikpICogMC41O1xcblxcdGZsb2F0IGxhbWJkYUwgPSAoLTEuMCArIHNxcnQoMS4wICsgYTIgKiAoMS4wIC0gTm9MMikgLyBOb0wyKSkgKiAwLjU7XFxuXFx0cmV0dXJuIDEuMCAvICgxLjAgKyBsYW1iZGFWICsgbGFtYmRhTCk7XFxufVxcblxcbmZsb2F0IGdfc2hpZWxkaW5nRm9yV2VhayhmbG9hdCBhbHBoYVJvdWdobmVzcywgZmxvYXQgTlYsIGZsb2F0IE5MKSB7XFxuICBmbG9hdCByID0gYWxwaGFSb3VnaG5lc3M7XFxuXFxuICAvLyBMb2NhbCBNYXNraW5nIHVzaW5nIFxcXCJTY2hsaWNrLVNtaXRoXFxcIiBNYXNraW5nIEZ1bmN0aW9uXFxuICBmbG9hdCBsb2NhbE1hc2tpbmcgPSAyLjAgKiBOViAvIChOViArIHNxcnQociAqIHIgKyAoMS4wIC0gciAqIHIpICogKE5WICogTlYpKSk7XFxuXFxuICByZXR1cm4gbG9jYWxNYXNraW5nO1xcbn1cXG5cXG5cXG5mbG9hdCBnX3NoaWVsZGluZyhmbG9hdCByb3VnaG5lc3MsIGZsb2F0IE5WLCBmbG9hdCBOTCkge1xcbiAgZmxvYXQgYSA9IHJvdWdobmVzc1JlbWFwKCByb3VnaG5lc3MgKTtcXG4gIGZsb2F0IHIgPSBhO1xcblxcbiAgLy8gTG9jYWwgU2hhZG93aW5nIHVzaW5nIFxcXCJTY2hsaWNrLVNtaXRoXFxcIiBNYXNraW5nIEZ1bmN0aW9uXFxuICBmbG9hdCBsb2NhbFNoYWRvd2luZyA9IDIuMCAqIE5MIC8gKE5MICsgc3FydChyICogciArICgxLjAgLSByICogcikgKiAoTkwgKiBOTCkpKTtcXG5cXG4gIC8vIExvY2FsIE1hc2tpbmcgdXNpbmcgXFxcIlNjaGxpY2stU21pdGhcXFwiIE1hc2tpbmcgRnVuY3Rpb25cXG4gIGZsb2F0IGxvY2FsTWFza2luZyA9IDIuMCAqIE5WIC8gKE5WICsgc3FydChyICogciArICgxLjAgLSByICogcikgKiAoTlYgKiBOVikpKTtcXG5cXG4gIHJldHVybiBsb2NhbFNoYWRvd2luZyAqIGxvY2FsTWFza2luZztcXG59XFxuXFxuZmxvYXQgdl9HR1hDb3JyZWxhdGVkRm9yV2VhayhmbG9hdCByb3VnaG5lc3MsIGZsb2F0IE5WLCBmbG9hdCBOTCkge1xcbiAgZmxvYXQgYSA9IHJvdWdobmVzc1JlbWFwKCByb3VnaG5lc3MgKTtcXG4gIGZsb2F0IGEyID0gYSAqIGE7XFxuICBmbG9hdCBHR1hWID0gTkwgKiBzcXJ0KE5WICogTlYgKiAoMS4wIC0gYTIpICsgYTIpO1xcbiAgcmV0dXJuIDAuNSAvIChHR1hWKTtcXG59XFxuXFxuZmxvYXQgdl9HR1hDb3JyZWxhdGVkKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTlYsIGZsb2F0IE5MKSB7XFxuICBmbG9hdCBhID0gcm91Z2huZXNzUmVtYXAoIHJvdWdobmVzcyApO1xcbiAgZmxvYXQgYTIgPSBhICogYTtcXG4gIGZsb2F0IEdHWFYgPSBOTCAqIHNxcnQoTlYgKiBOViAqICgxLjAgLSBhMikgKyBhMik7XFxuICBmbG9hdCBHR1hMID0gTlYgKiBzcXJ0KE5MICogTkwgKiAoMS4wIC0gYTIpICsgYTIpO1xcbiAgcmV0dXJuIDAuNSAvIChHR1hWICsgR0dYTCk7XFxufVxcblxcbi8vIHRoaXMgaXMgZnJvbSBodHRwczovL2xlYXJub3BlbmdsLmNvbS9QQlIvSUJML1NwZWN1bGFyLUlCTFxcbmZsb2F0IHZhbkRlckNvcnB1cyhpbnQgbiwgaW50IGJhc2UpXFxue1xcbiAgICBmbG9hdCBpbnZCYXNlID0gMS4wIC8gZmxvYXQoYmFzZSk7XFxuICAgIGZsb2F0IGRlbm9tICAgPSAxLjA7XFxuICAgIGZsb2F0IHJlc3VsdCAgPSAwLjA7XFxuXFxuICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzMjsgKytpKVxcbiAgICB7XFxuICAgICAgICBpZihuID4gMClcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBkZW5vbSAgID0gbW9kKGZsb2F0KG4pLCAyLjApO1xcbiAgICAgICAgICAgIHJlc3VsdCArPSBkZW5vbSAqIGludkJhc2U7XFxuICAgICAgICAgICAgaW52QmFzZSA9IGludkJhc2UgLyAyLjA7XFxuICAgICAgICAgICAgbiAgICAgICA9IGludChmbG9hdChuKSAvIDIuMCk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG59XFxuXFxudmVjMiBoYW1tZXJzbGV5Tm9CaXRPcHMoaW50IGksIGludCBOKVxcbntcXG4gIHJldHVybiB2ZWMyKGZsb2F0KGkpL2Zsb2F0KE4pLCB2YW5EZXJDb3JwdXMoaSwgMikpO1xcbn1cXG5cXG5mbG9hdCByYWRpY2FsSW52ZXJzZV9WZEModWludCBiaXRzKVxcbntcXG4gICAgYml0cyA9IChiaXRzIDw8IDE2dSkgfCAoYml0cyA+PiAxNnUpO1xcbiAgICBiaXRzID0gKChiaXRzICYgMHg1NTU1NTU1NXUpIDw8IDF1KSB8ICgoYml0cyAmIDB4QUFBQUFBQUF1KSA+PiAxdSk7XFxuICAgIGJpdHMgPSAoKGJpdHMgJiAweDMzMzMzMzMzdSkgPDwgMnUpIHwgKChiaXRzICYgMHhDQ0NDQ0NDQ3UpID4+IDJ1KTtcXG4gICAgYml0cyA9ICgoYml0cyAmIDB4MEYwRjBGMEZ1KSA8PCA0dSkgfCAoKGJpdHMgJiAweEYwRjBGMEYwdSkgPj4gNHUpO1xcbiAgICBiaXRzID0gKChiaXRzICYgMHgwMEZGMDBGRnUpIDw8IDh1KSB8ICgoYml0cyAmIDB4RkYwMEZGMDB1KSA+PiA4dSk7XFxuICAgIHJldHVybiBmbG9hdChiaXRzKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIC8gMHgxMDAwMDAwMDBcXG59XFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbnZlYzIgaGFtbWVyc2xleSh1aW50IGksIHVpbnQgTilcXG57XFxuICAgIHJldHVybiB2ZWMyKGZsb2F0KGkpL2Zsb2F0KE4pLCByYWRpY2FsSW52ZXJzZV9WZEMoaSkpO1xcbn1cXG5cXG52ZWMzIHNhbXBsZUhlbWlzcGhlcmVHR1godmVjMiBYaSwgZmxvYXQgcm91Z2huZXNzKSB7XFxuICBmbG9hdCBhID0gcm91Z2huZXNzUmVtYXAocm91Z2huZXNzKTtcXG5cXHRmbG9hdCBhMiA9IGEgKiBhO1xcblxcbiAgZmxvYXQgcGhpID0gMi4wICogTUFUSF9QSSAqIFhpLng7XFxuICBmbG9hdCBjb3NQaGkgPSBjb3MocGhpKTtcXG4gIGZsb2F0IHNpblBoaSA9IHNpbihwaGkpO1xcbiAgZmxvYXQgY29zVGhldGEgPSBzcXJ0KCgxLjAgLSBYaS55KSAvICgxLjAgKyAoYTIgLSAxLjApICogWGkueSkpOyAvLyBHR1hcXG4gIGZsb2F0IHNpblRoZXRhID0gc3FydCgxLjAgLSBjb3NUaGV0YSAqIGNvc1RoZXRhKTtcXG5cXG4gIHJldHVybiB2ZWMzKHNpblRoZXRhICogY29zKHBoaSksIHNpblRoZXRhICogc2luKHBoaSksIGNvc1RoZXRhKTtcXG59XFxuXFxuZmxvYXQgd2Vha1doaXRlRnVybmFjZVRlc3QoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb1YsIGZsb2F0IGYwLCBpbnQgZ190eXBlLCBpbnQgZGlzYWJsZV9mcmVzbmVsKVxcbntcXG5cXHRmbG9hdCB2eCA9IHNxcnQoMS4wIC0gTm9WICogTm9WKTtcXG5cXHRmbG9hdCB2eSA9IDAuMDtcXG5cXHRmbG9hdCB2eiA9IE5vVjtcXG5cXG5cXHRmbG9hdCBpbnRlZ3JhbCA9IDAuMDtcXG5cXHRjb25zdCB1aW50IHNhbXBsZU51bSA9IDIwNDh1O1xcblxcdGZvciAodWludCBpID0gMHU7IGkgPCBzYW1wbGVOdW07ICsraSlcXG5cXHR7XFxuICAgIHZlYzIgWGkgPSBoYW1tZXJzbGV5KGksIHNhbXBsZU51bSk7XFxuXFxuICAgIHZlYzMgaHZlYyA9IHNhbXBsZUhlbWlzcGhlcmVHR1goWGksIHJvdWdobmVzcyk7XFxuXFxuXFx0XFx0ZmxvYXQgVm9IVW5zYXQgPSB2eCAqIGh2ZWMueCArIHZ5ICogaHZlYy55ICsgdnogKiBodmVjLno7XFxuXFxuICAgIGZsb2F0IGx6ID0gMi4wICogVm9IVW5zYXQgKiBodmVjLnogLSB2ejtcXG5cXG4gICAgZmxvYXQgTm9MID0gbWF4KGx6LCAwLjApO1xcblxcdFxcdGZsb2F0IE5vSCA9IG1heChodmVjLnosIDAuMCk7XFxuXFx0XFx0ZmxvYXQgVm9IID0gbWF4KFZvSFVuc2F0LCAwLjApO1xcblxcbiAgICBmbG9hdCBmID0gZnJlc25lbChmMCwgVm9IKTtcXG5cXG4gICAgZmxvYXQgZzEgPSAwLjA7XFxuICAgIGlmIChnX3R5cGUgPT0gMCkge1xcbiAgICAgIGcxID0gc21pdGhHMShyb3VnaG5lc3MsIE5vVik7XFxuICAgIH0gZWxzZSBpZiAoZ190eXBlID09IDEpIHtcXG4gICAgICBnMSA9IGdfc2hpZWxkaW5nRm9yV2Vhayhyb3VnaG5lc3MsIE5vViwgTm9MKTtcXG4gICAgfSBlbHNlIGlmIChnX3R5cGUgPT0gMikge1xcbiAgICAgIGcxID0gdl9HR1hDb3JyZWxhdGVkRm9yV2Vhayhyb3VnaG5lc3MsIE5vViwgTm9MKSAqIDQuMCAqIE5vViAqIE5vTDtcXG4gICAgfVxcblxcbiAgICBmbG9hdCBwZGYgPSA0LjAgKiBWb0ggLyBOb0g7XFxuICAgIGZsb2F0IGludGVncmFsVmFsdWUgPSAoZzEgKiBwZGYpIC8gKDQuMCAqIE5vVik7XFxuICAgIGlmIChkaXNhYmxlX2ZyZXNuZWwgPT0gMCkge1xcbiAgICAgIGludGVncmFsVmFsdWUgKj0gZjtcXG4gICAgfVxcbiAgICAvLyBpbnRlZ3JhbFZhbHVlICo9IDAuNTsgLy8gU2V0IGZ1cm5hY2UgY29sb3IgMC41XFxuXFxuICAgIGludGVncmFsICs9IGludGVncmFsVmFsdWU7XFxuXFxuXFx0fVxcblxcdGludGVncmFsIC89IGZsb2F0KHNhbXBsZU51bSk7XFxuXFx0cmV0dXJuIGNsYW1wKGludGVncmFsLCAwLjAsIDEuMCk7XFxufVxcblxcbmZsb2F0IHdoaXRlRnVybmFjZVRlc3QoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb1YsIGZsb2F0IGYwLCBpbnQgZ190eXBlLCBpbnQgZGlzYWJsZV9mcmVzbmVsKVxcbntcXG5cXHRmbG9hdCB2eCA9IHNxcnQoMS4wIC0gTm9WICogTm9WKTtcXG5cXHRmbG9hdCB2eSA9IDAuMDtcXG5cXHRmbG9hdCB2eiA9IE5vVjtcXG5cXG5cXHRmbG9hdCBpbnRlZ3JhbCA9IDAuMDtcXG5cXHRjb25zdCB1aW50IHNhbXBsZU51bSA9IDQwOTZ1O1xcblxcdGZvciAodWludCBpID0gMHU7IGkgPCBzYW1wbGVOdW07ICsraSlcXG5cXHR7XFxuXFxuICAgIHZlYzIgWGkgPSBoYW1tZXJzbGV5KGksIHNhbXBsZU51bSk7XFxuXFxuICAgIHZlYzMgaHZlYyA9IHNhbXBsZUhlbWlzcGhlcmVHR1goWGksIHJvdWdobmVzcyk7XFxuXFxuXFx0XFx0ZmxvYXQgVm9IVW5zYXQgPSB2eCAqIGh2ZWMueCArIHZ5ICogaHZlYy55ICsgdnogKiBodmVjLno7XFxuXFx0XFx0ZmxvYXQgbHggPSAyLjAgKiBWb0hVbnNhdCAqIGh2ZWMueCAtIHZ4O1xcblxcdFxcdGZsb2F0IGx5ID0gMi4wICogVm9IVW5zYXQgKiBodmVjLnkgLSB2eTtcXG5cXHRcXHRmbG9hdCBseiA9IDIuMCAqIFZvSFVuc2F0ICogaHZlYy56IC0gdno7XFxuXFxuXFx0XFx0ZmxvYXQgTm9MID0gbWF4KGx6LCAwLjApO1xcblxcdFxcdGZsb2F0IE5vSCA9IG1heChodmVjLnosIDAuMCk7XFxuICAgIGZsb2F0IFZvSCA9IG1heChWb0hVbnNhdCwgMC4wKTtcXG5cXG4gICAgZmxvYXQgZiA9IGZyZXNuZWwoZjAsIFZvSCk7XFxuXFxuICAgIGZsb2F0IGcgPSAwLjA7XFxuICAgIGlmIChnX3R5cGUgPT0gMCkge1xcbiAgICAgIGcgPSBzbWl0aEcocm91Z2huZXNzLCBOb1YsIE5vTCk7XFxuICAgIH0gZWxzZSBpZiAoZ190eXBlID09IDEpe1xcbiAgICAgIGcgPSBnX3NoaWVsZGluZyhyb3VnaG5lc3MsIE5vViwgTm9MKTtcXG4gICAgfSBlbHNlIGlmIChnX3R5cGUgPT0gMil7XFxuICAgICAgZyA9IHZfR0dYQ29ycmVsYXRlZChyb3VnaG5lc3MsIE5vViwgTm9MKSAqICg0LjAgKiBOb1YgKiBOb0wpO1xcbiAgICB9IGVsc2UgaWYgKGdfdHlwZSA9PSAzKSB7XFxuICAgICAgZyA9IDAuMDtcXG4gICAgfVxcblxcbiAgICBmbG9hdCBwZGYgPSA0LjAgKiBWb0ggLyBOb0g7XFxuICAgIGZsb2F0IGludGVncmFsVmFsdWUgPSAoZyAqIHBkZikgLyAoNC4wICogTm9WKTtcXG4gICAgaWYgKGRpc2FibGVfZnJlc25lbCA9PSAwICYmIGdfdHlwZSAhPSAzKSB7XFxuICAgICAgaW50ZWdyYWxWYWx1ZSAqPSBmO1xcbiAgICB9XFxuICAgIC8vIGludGVncmFsVmFsdWUgKj0gMC41OyAvLyBTZXQgZnVybmFjZSBjb2xvciAwLjVcXG4gICAgaW50ZWdyYWwgKz0gaW50ZWdyYWxWYWx1ZTtcXG5cXHR9XFxuICBpbnRlZ3JhbCAvPSBmbG9hdChzYW1wbGVOdW0pO1xcbiAgaWYgKGdfdHlwZSA9PSAzKSB7XFxuICAgIGludGVncmFsID0gc3BlY3VsYXJJQkwocm91Z2huZXNzLCBOb1YsIGYwKTtcXG4gIH1cXG5cXHRyZXR1cm4gY2xhbXAoaW50ZWdyYWwsIDAuMCwgMS4wKTtcXG59XFxuXFxudm9pZCBtYWluICgpXFxue1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIHZlYzIgcXVhZFNpemVJblBpeGVsID0gZ2V0X3NjcmVlbkluZm8obWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgcm91Z2huZXNzID0gMC4wO1xcbiAgZmxvYXQgTm9WID0gMC4wOyAvLyBub3JtYWwgZG90IHZpZXcgdmVjdG9yXFxuXFxuICAvLyAyRCBtb2RlXFxuICBpbnQgbW9kZSA9IGdldF9tb2RlKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChtb2RlID09IDApIHtcXG4gICAgcm91Z2huZXNzID0gKGdsX0ZyYWdDb29yZC55KSAvIHF1YWRTaXplSW5QaXhlbC55O1xcbiAgICBOb1YgPSAoZ2xfRnJhZ0Nvb3JkLngpIC8gcXVhZFNpemVJblBpeGVsLng7XFxuICB9IGVsc2Uge1xcbiAgICAvLyBvYmplY3QgbW9kZVxcbiAgICAvLyBSb3VnaG5lc3NcXG4gICAgY29uc3QgZmxvYXQgY19NaW5Sb3VnaG5lc3MgPSAwLjA0O1xcbiAgICB2ZWMyIG1ldGFsbGljUm91Z2huZXNzRmFjdG9yID0gZ2V0X21ldGFsbGljUm91Z2huZXNzRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgdXNlclJvdWdobmVzcyA9IG1ldGFsbGljUm91Z2huZXNzRmFjdG9yLnk7XFxuICAgIGZsb2F0IG1ldGFsbGljID0gbWV0YWxsaWNSb3VnaG5lc3NGYWN0b3IueDtcXG5cXG4gICAgdmVjNCBvcm1UZXhlbCA9IHRleHR1cmUodV9tZXRhbGxpY1JvdWdobmVzc1RleHR1cmUsIHZfdGV4Y29vcmQpO1xcbiAgICB1c2VyUm91Z2huZXNzID0gb3JtVGV4ZWwuZyAqIHVzZXJSb3VnaG5lc3M7XFxuICAgIHVzZXJSb3VnaG5lc3MgPSBjbGFtcCh1c2VyUm91Z2huZXNzLCBjX01pblJvdWdobmVzcywgMS4wKTtcXG4gICAgcm91Z2huZXNzID0gdXNlclJvdWdobmVzcztcXG5cXG4gICAgLy8gdmVjMyB2aWV3VmVjdG9yID0gbm9ybWFsaXplKHZlYzMoMC4wLCAwLjAsIDEwLjApIC0gdl9wb3NpdGlvbl9pbldvcmxkLnh5eik7XFxuICAgIC8vIHZlYzMgdmlld1ZlY3RvciA9IG5vcm1hbGl6ZSh1X3ZpZXdQb3NpdGlvbiAtIHZfcG9zaXRpb25faW5Xb3JsZC54eXopO1xcbiAgICB2ZWMzIHZpZXdWZWN0b3IgPSB2ZWMzKDAuMCwgMC4wLCAxLjApO1xcbiAgICBOb1YgPSBkb3Qodl9ub3JtYWxfaW5Xb3JsZCwgdmlld1ZlY3Rvcik7XFxuICB9XFxuXFxuICBpbnQgZGVidWdWaWV3ID0gZ2V0X2RlYnVnVmlldyhtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCBmMCA9IGdldF9mMChtYXRlcmlhbFNJRCwgMCk7XFxuICBpbnQgZ190eXBlID0gZ2V0X2dfdHlwZShtYXRlcmlhbFNJRCwgMCk7XFxuICBpbnQgZGlzYWJsZV9mcmVzbmVsID0gZ2V0X2Rpc2FibGVfZnJlc25lbChtYXRlcmlhbFNJRCwgMCk7XFxuXFxuICBpZiAoZGVidWdWaWV3ID09IDApIHtcXG4gICAgZmxvYXQgd2hpdGVGdXJuYWNlUmVzdWx0ID0gd2hpdGVGdXJuYWNlVGVzdChyb3VnaG5lc3MsIE5vViwgZjAsIGdfdHlwZSwgZGlzYWJsZV9mcmVzbmVsKTtcXG4gICAgcnQwID0gdmVjNCh3aGl0ZUZ1cm5hY2VSZXN1bHQsIHdoaXRlRnVybmFjZVJlc3VsdCwgd2hpdGVGdXJuYWNlUmVzdWx0LCAxLjApO1xcblxcbiAgfSBlbHNlIGlmIChkZWJ1Z1ZpZXcgPT0gMSkge1xcbiAgICBmbG9hdCB3ZWFrV2hpdGVGdXJuYWNlUmVzdWx0ID0gd2Vha1doaXRlRnVybmFjZVRlc3Qocm91Z2huZXNzLCBOb1YsIGYwLCBnX3R5cGUsIGRpc2FibGVfZnJlc25lbCk7XFxuICAgIHJ0MCA9IHZlYzQod2Vha1doaXRlRnVybmFjZVJlc3VsdCwgd2Vha1doaXRlRnVybmFjZVJlc3VsdCwgd2Vha1doaXRlRnVybmFjZVJlc3VsdCwgMS4wKTtcXG5cXG4gIH0gZWxzZSBpZiAoZGVidWdWaWV3ID09IDIpe1xcbiAgICBmbG9hdCBubiA9IE5vViowLjUrMC41O1xcbiAgICBydDAgPSB2ZWM0KG5uLCBubiwgbm4sIDEuMCk7XFxuXFxuICB9IGVsc2UgaWYgKGRlYnVnVmlldyA9PSAzKXtcXG4gICAgcnQwID0gdmVjNCh2X25vcm1hbF9pbldvcmxkLnh5eiwgMS4wKTtcXG5cXG4gIH0gZWxzZSBpZiAoZGVidWdWaWV3ID09IDQpe1xcbiAgICBmbG9hdCB3aGl0ZUZ1cm5hY2VSZXN1bHQgPSB3aGl0ZUZ1cm5hY2VUZXN0KHJvdWdobmVzcywgTm9WLCBmMCwgZ190eXBlLCBkaXNhYmxlX2ZyZXNuZWwpO1xcbiAgICBmbG9hdCB3ZWFrV2hpdGVGdXJuYWNlUmVzdWx0ID0gd2Vha1doaXRlRnVybmFjZVRlc3Qocm91Z2huZXNzLCBOb1YsIGYwLCBnX3R5cGUsIGRpc2FibGVfZnJlc25lbCk7XFxuICAgIHJ0MCA9IHZlYzQod2hpdGVGdXJuYWNlUmVzdWx0LCB3ZWFrV2hpdGVGdXJuYWNlUmVzdWx0LCAwLjAsIDEuMCk7XFxuXFxuICB9IGVsc2UgaWYgKGRlYnVnVmlldyA9PSA1KXtcXG4gICAgcnQwID0gdmVjNChyb3VnaG5lc3MsIE5vViwgMC4wLCAxLjApO1xcblxcbiAgfSBlbHNlIHtcXG4gICAgcnQwID0gdmVjNCgxLjAsIDEuMCwgMS4wLCAxLjApO1xcbiAgfVxcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZDtcXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxuaW4gdmVjMyBhX2NvbG9yO1xcbmluIHZlYzMgYV9ub3JtYWw7XFxuaW4gdmVjNCBhX2pvaW50O1xcbmluIHZlYzQgYV93ZWlnaHQ7XFxuXFxub3V0IHZlYzIgdl90ZXhjb29yZDtcXG5vdXQgdmVjMyB2X25vcm1hbF9pbldvcmxkO1xcbm91dCB2ZWM0IHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5tYXQzIHRvTm9ybWFsTWF0cml4KG1hdDQgbSkge1xcbiAgZmxvYXQgYTAwID0gbVswXVswXSwgYTAxID0gbVswXVsxXSwgYTAyID0gbVswXVsyXSwgYTAzID0gbVswXVszXSxcXG4gIGExMCA9IG1bMV1bMF0sIGExMSA9IG1bMV1bMV0sIGExMiA9IG1bMV1bMl0sIGExMyA9IG1bMV1bM10sXFxuICBhMjAgPSBtWzJdWzBdLCBhMjEgPSBtWzJdWzFdLCBhMjIgPSBtWzJdWzJdLCBhMjMgPSBtWzJdWzNdLFxcbiAgYTMwID0gbVszXVswXSwgYTMxID0gbVszXVsxXSwgYTMyID0gbVszXVsyXSwgYTMzID0gbVszXVszXTtcXG5cXG4gIGZsb2F0IGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcXG4gIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcXG4gIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcXG4gIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcXG4gIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcXG4gIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcXG4gIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcXG4gIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcXG4gIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcXG4gIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcXG4gIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcXG4gIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcXG5cXG4gIGZsb2F0IGRldGVybWluYW50VmFsID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xcblxcbiAgcmV0dXJuIG1hdDMoXFxuICAgIGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSwgYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3LCBhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYsXFxuICAgIGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSwgYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3LCBhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYsXFxuICAgIGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMywgYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxLCBhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApIC8gZGV0ZXJtaW5hbnRWYWw7XFxufVxcblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcblxcbmhpZ2hwIG1hdDQgY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKCBoaWdocCB2ZWM0IHF1YXRlcm5pb24sIGhpZ2hwIHZlYzMgdHJhbnNsYXRpb24sIGhpZ2hwIHZlYzMgc2NhbGUgKSB7XFxuICBoaWdocCB2ZWM0IHEgPSBxdWF0ZXJuaW9uO1xcbiAgaGlnaHAgdmVjMyB0ID0gdHJhbnNsYXRpb247XFxuXFxuICBoaWdocCBmbG9hdCBzeCA9IHEueCAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHN5ID0gcS55ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgc3ogPSBxLnogKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeCA9IHEueSAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN5ID0gcS54ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ogPSBxLnggKiBxLnk7XFxuICBoaWdocCBmbG9hdCB3eCA9IHEudyAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHd5ID0gcS53ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ogPSBxLncgKiBxLno7XFxuXFxuICBoaWdocCBtYXQ0IG1hdCA9IG1hdDQoXFxuICAgIDEuMCAtIDIuMCAqIChzeSArIHN6KSwgMi4wICogKGN6ICsgd3opLCAyLjAgKiAoY3kgLSB3eSksIDAuMCxcXG4gICAgMi4wICogKGN6IC0gd3opLCAxLjAgLSAyLjAgKiAoc3ggKyBzeiksIDIuMCAqIChjeCArIHd4KSwgMC4wLFxcbiAgICAyLjAgKiAoY3kgKyB3eSksIDIuMCAqIChjeCAtIHd4KSwgMS4wIC0gMi4wICogKHN4ICsgc3kpLCAwLjAsXFxuICAgIHQueCwgdC55LCB0LnosIDEuMFxcbiAgKTtcXG5cXG4gIGhpZ2hwIG1hdDQgdW5pZm9ybVNjYWxlTWF0ID0gbWF0NChcXG4gICAgc2NhbGUueCwgMC4wLCAwLjAsIDAuMCxcXG4gICAgMC4wLCBzY2FsZS55LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIHNjYWxlLnosIDAuMCxcXG4gICAgMC4wLCAwLjAsIDAuMCwgMS4wXFxuICApO1xcblxcbiAgcmV0dXJuIG1hdCp1bmlmb3JtU2NhbGVNYXQ7XFxufVxcblxcbmhpZ2hwIHZlYzQgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChoaWdocCB2ZWMyIHZlY194eSwgaGlnaHAgZmxvYXQgY3JpdGVyaWEpe1xcblxcbiAgaGlnaHAgZmxvYXQgcjtcXG4gIGhpZ2hwIGZsb2F0IGc7XFxuICBoaWdocCBmbG9hdCBiO1xcbiAgaGlnaHAgZmxvYXQgYTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl4ID0gZmxvb3IodmVjX3h5LnggKiBjcml0ZXJpYSk7XFxuICBoaWdocCBmbG9hdCB2MXggPSBpeCAvIGNyaXRlcmlhO1xcbiAgaGlnaHAgZmxvYXQgdjF5ID0gaXggLSBmbG9vcih2MXgpICogY3JpdGVyaWE7XFxuXFxuICByID0gKCB2MXggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgZyA9ICggdjF5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl5ID0gZmxvb3IoIHZlY194eS55ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjJ4ID0gaXkgLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYyeSA9IGl5IC0gZmxvb3IodjJ4KSAqIGNyaXRlcmlhO1xcblxcbiAgYiA9ICggdjJ4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGEgPSAoIHYyeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICByIC09IDEuMC9jcml0ZXJpYTtcXG4gIGcgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYiAtPSAxLjAvY3JpdGVyaWE7XFxuICBhIC09IDEuMC9jcml0ZXJpYTtcXG5cXG4gIHIgPSByKjIuMC0xLjA7XFxuICBnID0gZyoyLjAtMS4wO1xcbiAgYiA9IGIqMi4wLTEuMDtcXG4gIGEgPSBhKjIuMC0xLjA7XFxuXFxuICByZXR1cm4gdmVjNChyLCBnLCBiLCBhKTtcXG59XFxuXFxubWF0NCBnZXRTa2luTWF0cml4KGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEKSB7XFxuXFxuI2lmZGVmIFJOX0JPTkVfREFUQV9UWVBFX01hdDQzeDFcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSkpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyKVxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcblxcbiAgdmVjNCB0cV94ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IHNxX3ggPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3gudywgc3FfeC53KSwgY3JpdGVyaWEueCk7XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3gueHl6LCBzcV94Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgc3FfeSA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3kudywgc3FfeS53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeS54eXosIHNxX3kueHl6KTtcXG5cXG4gIHZlYzQgdHFfeiA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBzcV96ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfei53LCBzcV96LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV96Lnh5eiwgc3Ffei54eXopO1xcblxcbiAgdmVjNCB0cV93ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICB2ZWM0IHNxX3cgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV93LncsIHNxX3cudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3cueHl6LCBzcV93Lnh5eik7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDJfT0xEKVxcbiAgdmVjNCB0c194ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgdmVjNCB0c195ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgxKVxcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ggPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1kgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ogPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1cgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcblxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZEluZm8gPSBnZXRfYm9uZUNvbXByZXNzZWRJbmZvKDAuMCwgMCk7XFxuXFxuICB2ZWM0IHRzX3ggPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1gueHksIGNyaXRlcmlhLngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnh5LCBjcml0ZXJpYS54KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi54eSwgY3JpdGVyaWEueCksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgdmVjNCB0c193ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cueHksIGNyaXRlcmlhLngpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG4jZW5kaWZcXG4gIHJldHVybiBza2luTWF0O1xcbn1cXG4jZW5kaWZcXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5ib29sIHNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQzIGluTm9ybWFsTWF0cml4LFxcbiAgb3V0IG1hdDMgb3V0Tm9ybWFsTWF0cml4LFxcbiAgaW4gdmVjMyBpblBvc2l0aW9uX2luTG9jYWwsXFxuICBvdXQgdmVjNCBvdXRQb3NpdGlvbl9pbldvcmxkLFxcbiAgaW4gdmVjMyBpbk5vcm1hbF9pbkxvY2FsLFxcbiAgb3V0IHZlYzMgb3V0Tm9ybWFsX2luV29ybGRcXG4gIClcXG57XFxuICBtYXQ0IHNraW5NYXQgPSBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lEKTtcXG4gIG91dFBvc2l0aW9uX2luV29ybGQgPSBza2luTWF0ICogdmVjNChpblBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICBvdXROb3JtYWxNYXRyaXggPSB0b05vcm1hbE1hdHJpeChza2luTWF0KTtcXG4gIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKG91dE5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcblxcbiAgcmV0dXJuIHRydWU7XFxufVxcbiNlbmRpZlxcblxcbmJvb2wgcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gIGluIG1hdDQgd29ybGRNYXRyaXgsXFxuICBpbiBtYXQ0IHZpZXdNYXRyaXgsXFxuICBpbiBib29sIGlzQmlsbGJvYXJkLFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuKSB7XFxuICBib29sIGlzU2tpbm5pbmcgPSBmYWxzZTtcXG5cXG4gIHZlYzMgcG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIGlmICh1X21vcnBoVGFyZ2V0TnVtYmVyID09IDApIHtcXG4jZW5kaWZcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGluUG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIH0gZWxzZSB7XFxuICAgIGZsb2F0IHZlcnRleElkeCA9IGFfYmFyeUNlbnRyaWNDb29yZC53O1xcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gZ2V0X3Bvc2l0aW9uKHZlcnRleElkeCwgaW5Qb3NpdGlvbl9pbkxvY2FsKTtcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIG1hdDQgd29ybGRNYXRyaXhJbm5lciA9IHdvcmxkTWF0cml4O1xcbiAgaWYgKGlzQmlsbGJvYXJkKSB7XFxuICAgIG1hdDQgaW52ZXJzZVZpZXdNYXRyaXggPSBpbnZlcnNlKHZpZXdNYXRyaXgpO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVswXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzBdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsxXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzFdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsyXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzJdO1xcbiAgICB3b3JsZE1hdHJpeElubmVyID0gaW52ZXJzZVZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeDtcXG4gIH1cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIGlmIChza2VsZXRhbENvbXBvbmVudFNJRCA+PSAwLjApIHtcXG4gICAgaXNTa2lubmluZyA9IHNraW5uaW5nKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbk5vcm1hbE1hdHJpeCwgb3V0Tm9ybWFsTWF0cml4LCBwb3NpdGlvbl9pbkxvY2FsLCBvdXRQb3NpdGlvbl9pbldvcmxkLCBpbk5vcm1hbF9pbkxvY2FsLCBvdXROb3JtYWxfaW5Xb3JsZCk7XFxuICB9IGVsc2Uge1xcbiNlbmRpZlxcbiAgICBvdXROb3JtYWxNYXRyaXggPSBpbk5vcm1hbE1hdHJpeDtcXG4gICAgb3V0UG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4SW5uZXIgKiB2ZWM0KHBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICAgIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGluTm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICB9XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gaXNTa2lubmluZztcXG59XFxuXFxuXFxudm9pZCBtYWluKCl7XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbm1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxubWF0NCB2aWV3TWF0cml4ID0gZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5tYXQ0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG5cXG5cXG4gIG1hdDMgbm9ybWFsTWF0cml4ID0gZ2V0X25vcm1hbE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG4gIHZfbm9ybWFsX2luV29ybGQgPSBub3JtYWxNYXRyaXggKiBhX25vcm1hbDtcXG4gIHZfcG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4ICogdmVjNChhX3Bvc2l0aW9uLCAxLjApO1xcbiAgdl90ZXhjb29yZCA9IGFfdGV4Y29vcmQ7XFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbmluIHZlYzIgdl90ZXhjb29yZF8wO1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfYmFzZUNvbG9yVGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSgwLHdoaXRlKVxcbnVuaWZvcm0gYm9vbCB1X2VuYWJsZUxpbmVhclRvU3JnYjsgLy8gaW5pdGlhbFZhbHVlPXRydWVcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxudmVjMyBsaW5lYXJUb1NyZ2IodmVjMyBsaW5lYXJDb2xvcikge1xcbiAgcmV0dXJuIHBvdyhsaW5lYXJDb2xvciwgdmVjMygxLjAvMi4yKSk7XFxufVxcblxcbnZlYzMgc3JnYlRvTGluZWFyKHZlYzMgc3JnYkNvbG9yKSB7XFxuICByZXR1cm4gcG93KHNyZ2JDb2xvciwgdmVjMygyLjIpKTtcXG59XFxuXFxuXFxudm9pZCBtYWluICgpXFxue1xcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG52ZWM0IGJhc2VDb2xvciA9IHRleHR1cmUodV9iYXNlQ29sb3JUZXh0dXJlLCB2X3RleGNvb3JkXzApO1xcblxcbmlmIChnZXRfZW5hYmxlTGluZWFyVG9TcmdiKG1hdGVyaWFsU0lELCAwKSkge1xcbiAgYmFzZUNvbG9yLnJnYiA9IGxpbmVhclRvU3JnYihiYXNlQ29sb3IucmdiKTtcXG59XFxuXFxucnQwID0gYmFzZUNvbG9yO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxudm9pZCBtYWluKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcbmZsb2F0IHggPSBmbG9hdCgoZ2xfVmVydGV4SUQgJiAxKSA8PCAyKTtcXG5mbG9hdCB5ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMikgPDwgMSk7XFxudl90ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbnZfdGV4Y29vcmRfMC55ID0geSAqIDAuNTtcXG5nbF9Qb3NpdGlvbiA9IHZlYzQoeCAtIDEuMCwgeSAtIDEuMCwgMCwgMSk7XFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5mbG9hdCBkZWNvZGVSR0JBVG9EZXB0aCh2ZWM0IFJHQkEpe1xcbiAgY29uc3QgZmxvYXQgck1hc2sgPSAxLjA7XFxuICBjb25zdCBmbG9hdCBnTWFzayA9IDEuMCAvIDI1NS4wO1xcbiAgY29uc3QgZmxvYXQgYk1hc2sgPSAxLjAgLyAoMjU1LjAgKiAyNTUuMCk7XFxuICBjb25zdCBmbG9hdCBhTWFzayA9IDEuMCAvICgyNTUuMCAqIDI1NS4wICogMjU1LjApO1xcbiAgZmxvYXQgZGVwdGggPSBkb3QoUkdCQSwgdmVjNChyTWFzaywgZ01hc2ssIGJNYXNrLCBhTWFzaykpO1xcbiAgcmV0dXJuIGRlcHRoO1xcbn1cXG5cXG52ZWM0IGVuY29kZURlcHRoVG9SR0JBKGZsb2F0IGRlcHRoKXtcXG4gIGZsb2F0IHIgPSBkZXB0aDtcXG4gIGZsb2F0IGcgPSBmcmFjdChyICogMjU1LjApO1xcbiAgZmxvYXQgYiA9IGZyYWN0KGcgKiAyNTUuMCk7XFxuICBmbG9hdCBhID0gZnJhY3QoYiAqIDI1NS4wKTtcXG4gIGZsb2F0IGNvZWYgPSAxLjAgLyAyNTUuMDtcXG4gIHIgLT0gZyAqIGNvZWY7XFxuICBnIC09IGIgKiBjb2VmO1xcbiAgYiAtPSBhICogY29lZjtcXG4gIHJldHVybiB2ZWM0KHIsIGcsIGIsIGEpO1xcbn1cXG5cXG52b2lkIG1haW4gKClcXG57XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgZmxvYXQgZnJhbWVidWZmZXJTaXplO1xcbiAgdmVjMiBvZmZzZXQgPSBnbF9GcmFnQ29vcmQuc3Q7XFxuXFxuICB2ZWMyIGJsdXJEaXJlY3Rpb247XFxuICBib29sIGlzSG9yaXpvbnRhbCA9IGdldF9pc0hvcml6b250YWwobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYoaXNIb3Jpem9udGFsKXtcXG4gICAgZnJhbWVidWZmZXJTaXplID0gZ2V0X2ZyYW1lYnVmZmVyU2l6ZShtYXRlcmlhbFNJRCwgMCkueDtcXG4gICAgYmx1ckRpcmVjdGlvbiA9IHZlYzIoMS4wLDAuMCk7XFxuICB9ZWxzZXtcXG4gICAgZnJhbWVidWZmZXJTaXplID0gZ2V0X2ZyYW1lYnVmZmVyU2l6ZShtYXRlcmlhbFNJRCwgMCkueTtcXG4gICAgYmx1ckRpcmVjdGlvbiA9IHZlYzIoMC4wLDEuMCk7XFxuICB9XFxuXFx0ZmxvYXQgdEZyYWcgPSAxLjAgLyBmcmFtZWJ1ZmZlclNpemU7XFxuXFxuICBmbG9hdCBkZXB0aCA9IDAuMDtcXG4gIGludCBnYXVzc2lhbktlcm5lbFNpemUgPSBnZXRfZ2F1c3NpYW5LZXJuZWxTaXplKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IG1pblN0cmlkZUxlbmd0aCA9IC1mbG9hdChnYXVzc2lhbktlcm5lbFNpemUgLSAxKSAvIDIuMDtcXG5cXG4gIGZvcihpbnQgaT0wOyBpIDwgMzA7IGkrKykge1xcbiAgICBpZihnYXVzc2lhbktlcm5lbFNpemUgPT0gaSkge1xcbiAgICAgIGJyZWFrO1xcbiAgICB9XFxuXFxuICAgIGZsb2F0IHN0cmlkZUxlbmd0aCA9IG1pblN0cmlkZUxlbmd0aCArIGZsb2F0KGkpO1xcbiAgICB2ZWMyIHN0cmlkZSA9IHN0cmlkZUxlbmd0aCAqIGJsdXJEaXJlY3Rpb247XFxuICAgIGZsb2F0IGRlcHRoRGF0YSA9IGRlY29kZVJHQkFUb0RlcHRoKHRleHR1cmUodV9iYXNlQ29sb3JUZXh0dXJlLCAob2Zmc2V0ICsgc3RyaWRlKSAqIHRGcmFnKSk7XFxuICAgIGlmKGRlcHRoRGF0YSA+IDEuMCkgZGVwdGhEYXRhID0gMS4wO1xcblxcbiAgICBmbG9hdCBnYXVzc2lhblJhdGlvID0gdV9nYXVzc2lhblJhdGlvW2ldO1xcbiAgICBkZXB0aCArPSAgZGVwdGhEYXRhICogZ2F1c3NpYW5SYXRpbztcXG4gIH1cXG5cXG4gIHJ0MCA9IGVuY29kZURlcHRoVG9SR0JBKGRlcHRoKTtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbnZvaWQgbWFpbigpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5mbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMSkgPDwgMik7XFxuZmxvYXQgeSA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAmIDIpIDw8IDEpO1xcbnZfdGV4Y29vcmRfMC54ID0geCAqIDAuNTtcXG52X3RleGNvb3JkXzAueSA9IHkgKiAwLjU7XFxuZ2xfUG9zaXRpb24gPSB2ZWM0KHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuaW4gdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxuXFxudm9pZCBtYWluICgpXFxue1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIHZlYzIgb2Zmc2V0ID0gZ2xfRnJhZ0Nvb3JkLnN0O1xcbiAgaXZlYzIgdnJTdGF0ZSA9IGdldF92clN0YXRlKDAuMCwgMCk7XFxuICB2ZWMyIGZyYW1lYnVmZmVyU2l6ZSA9IGdldF9mcmFtZWJ1ZmZlclNpemUobWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBibHVyRGlyZWN0aW9uO1xcbiAgYm9vbCBpc0hvcml6b250YWwgPSBnZXRfaXNIb3Jpem9udGFsKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChpc0hvcml6b250YWwpIHtcXG4gICAgYmx1ckRpcmVjdGlvbiA9IHZlYzIoMS4wLCAwLjApO1xcbiAgfSBlbHNlIHsgLy8gdmVydGljYWxcXG4gICAgYmx1ckRpcmVjdGlvbiA9IHZlYzIoMC4wLCAxLjApO1xcbiAgfVxcblxcdHZlYzIgdEZyYWcgPSAxLjAgLyBmcmFtZWJ1ZmZlclNpemU7XFxuXFxuICB2ZWM0IGNvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbiAgaW50IGdhdXNzaWFuS2VybmVsU2l6ZSA9IGdldF9nYXVzc2lhbktlcm5lbFNpemUobWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgbWluU3RyaWRlTGVuZ3RoID0gLWZsb2F0KGdhdXNzaWFuS2VybmVsU2l6ZSAtIDEpIC8gMi4wO1xcblxcbiAgZm9yKGludCBpID0gMDsgaSA8IGdhdXNzaWFuS2VybmVsU2l6ZTsgaSsrKSB7XFxuICAgIGZsb2F0IHN0cmlkZUxlbmd0aCA9IG1pblN0cmlkZUxlbmd0aCArIGZsb2F0KGkpO1xcbiAgICB2ZWMyIHN0cmlkZSA9IHN0cmlkZUxlbmd0aCAqIGJsdXJEaXJlY3Rpb247XFxuICAgIGZsb2F0IGdhdXNzaWFuUmF0aW8gPSBnZXRfZ2F1c3NpYW5SYXRpbyhtYXRlcmlhbFNJRCwgaSk7XFxuICAgIHZlYzIgdXYgPSAob2Zmc2V0ICsgc3RyaWRlKSAqIHRGcmFnO1xcbiAgICBpZiAodnJTdGF0ZS54ID09IDEgJiYgaXNIb3Jpem9udGFsKSB7IC8vIGlmIGluIFZSIG1vZGUgYW5kIGhvcml6b250YWwgYmx1clxcbiAgICAgIGlmIChnbF9GcmFnQ29vcmQueCA8IGZyYW1lYnVmZmVyU2l6ZS54IC8gMi4wKSB7IC8vIGxlZnQgZXllXFxuICAgICAgICB1di54ID0gbWluKHV2LnggKiAwLjUsIDAuNSk7XFxuICAgICAgfSBlbHNlIHsgLy8gcmlnaHQgZXllXFxuICAgICAgICB1di54ID0gbWF4KHV2LnggKiAwLjUgLSAwLjUsIDAuNSk7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIGNvbG9yLnJnYiArPSB0ZXh0dXJlKHVfYmFzZUNvbG9yVGV4dHVyZSwgdXYpLnJnYiAqIGdhdXNzaWFuUmF0aW87XFxuICB9XFxuXFxuICBydDAgPSBjb2xvcjtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbnZvaWQgbWFpbigpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5mbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMSkgPDwgMik7XFxuZmxvYXQgeSA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAmIDIpIDw8IDEpO1xcbnZfdGV4Y29vcmRfMC54ID0geCAqIDAuNTtcXG52X3RleGNvb3JkXzAueSA9IHkgKiAwLjU7XFxuZ2xfUG9zaXRpb24gPSB2ZWM0KHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5jb25zdCBmbG9hdCBFUFNfQ09MID0gMC4wMDAwMTtcXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5pbiB2ZWMzIHZfYmFyeUNlbnRyaWNDb29yZDtcXG5pbiB2ZWMzIHZfbm9ybWFsX2luVmlldztcXG5pbiB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxuaW4gdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBpbiB2ZWMzIHZfdGFuZ2VudF9pbldvcmxkO1xcbiAgaW4gdmVjMyB2X2Jpbm9ybWFsX2luV29ybGQ7IC8vIGJpdGFuZ2VudF9pbldvcmxkXFxuI2VuZGlmXFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbnN0cnVjdCBMaWdodCB7XFxuICBpbnQgdHlwZTsgLy8gMCA9IGRpcmVjdGlvbmFsLCAxID0gcG9pbnQsIDIgPSBzcG90XFxuICB2ZWMzIHBvc2l0aW9uO1xcbiAgdmVjMyBpbnRlbnNpdHk7XFxuICB2ZWMzIGF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuICB2ZWMzIGRpcmVjdGlvbk9mTGlnaHRPYmplY3Q7XFxuICB2ZWMzIGRpcmVjdGlvbjsgLy8gZGlyZWN0aW9uIG9mIGxpZ2h0IHZlY3RvciwgZXF1YWwgdG8gbm9ybWFsaXplKGxpZ2h0LnBvaW50VG9MaWdodClcXG4gIHZlYzMgcG9pbnRUb0xpZ2h0OyAvLyBub3Qgbm9ybWFsaXplZFxcbiAgZmxvYXQgc3BvdEFuZ2xlU2NhbGU7XFxuICBmbG9hdCBzcG90QW5nbGVPZmZzZXQ7XFxuICBmbG9hdCBlZmZlY3RpdmVSYW5nZTtcXG59O1xcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9saWdodHNfcHVuY3R1YWwvUkVBRE1FLm1kI3JhbmdlLXByb3BlcnR5XFxuZmxvYXQgZ2V0UmFuZ2VBdHRlbnVhdGlvbihMaWdodCBsaWdodClcXG57XFxuICBmbG9hdCBkaXN0YW5jZSA9IGxlbmd0aChsaWdodC5wb2ludFRvTGlnaHQpO1xcbiAgLy8gbWVhbnMgbm8gcmFuZ2UgbGltaXRcXG4gIGlmIChsaWdodC5lZmZlY3RpdmVSYW5nZSA8PSAwLjApXFxuICB7XFxuICAgIHJldHVybiAxLjAgLyBwb3coZGlzdGFuY2UsIDIuMCk7XFxuICB9XFxuICByZXR1cm4gbWF4KG1pbigxLjAgLSBwb3coZGlzdGFuY2UgLyBsaWdodC5lZmZlY3RpdmVSYW5nZSwgNC4wKSwgMS4wKSwgMC4wKSAvIHBvdyhkaXN0YW5jZSwgMi4wKTtcXG59XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL2Jsb2IvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2xpZ2h0c19wdW5jdHVhbC9SRUFETUUubWQjaW5uZXItYW5kLW91dGVyLWNvbmUtYW5nbGVzXFxuZmxvYXQgZ2V0U3BvdEF0dGVudWF0aW9uKExpZ2h0IGxpZ2h0KVxcbntcXG5cXG4gIGZsb2F0IGNkID0gZG90KGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QsIGxpZ2h0LmRpcmVjdGlvbik7XFxuICBmbG9hdCBhbmd1bGFyQXR0ZW51YXRpb24gPSBjbGFtcChjZCAqIGxpZ2h0LnNwb3RBbmdsZVNjYWxlICsgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0LCAwLjAsIDEuMCk7XFxuICByZXR1cm4gYW5ndWxhckF0dGVudWF0aW9uO1xcbn1cXG5cXG52b2lkIGdldExpZ2h0QXR0ZW51YXRlZChMaWdodCBsaWdodCkge1xcbiAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTtcXG4gIC8vIGlmIChsaWdodC50eXBlID09IDApIHsgLy8gRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgLy8gRGlyZWN0aW9uYWwgTGlnaHQgZG9uJ3QgYXR0ZW51YXRlIGdlb21ldGljYWxseVxcbiAgLy8gfVxcblxcbiAgLy8gUG9pbnQgTGlnaHRcXG4gIGlmIChsaWdodC50eXBlID09IDEpXFxuICB7XFxuICAgIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0UmFuZ2VBdHRlbnVhdGlvbihsaWdodCk7XFxuICB9XFxuICAvLyBTcG90IGxpZ2h0XFxuICBpZiAobGlnaHQudHlwZSA9PSAyKVxcbiAge1xcbiAgICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ICo9IGdldFNwb3RBdHRlbnVhdGlvbihsaWdodCk7XFxuICB9XFxufVxcblxcbkxpZ2h0IGdldExpZ2h0KGludCBsaWdodElkeCwgdmVjMyB2X3Bvc2l0aW9uX2luV29ybGQpIHtcXG4gIHZlYzMgbGlnaHRQb3NpdGlvbiA9IGdldF9saWdodFBvc2l0aW9uKDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjMyBkaXJlY3Rpb25fYW5kX3dfb2ZfTGlnaHRPYmplY3QgPSBnZXRfbGlnaHREaXJlY3Rpb24oMC4wLCBsaWdodElkeCk7XFxuICB2ZWMzIGxpZ2h0SW50ZW5zaXR5ID0gZ2V0X2xpZ2h0SW50ZW5zaXR5KDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjNCBsaWdodFByb3BlcnR5ID0gZ2V0X2xpZ2h0UHJvcGVydHkoMC4wLCBsaWdodElkeCk7XFxuICBMaWdodCBsaWdodDtcXG4gIGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QgPSBkaXJlY3Rpb25fYW5kX3dfb2ZfTGlnaHRPYmplY3Q7XFxuICBmbG9hdCBsaWdodFR5cGUgPSBsaWdodFByb3BlcnR5Lng7XFxuICBsaWdodC5lZmZlY3RpdmVSYW5nZSA9IGxpZ2h0UHJvcGVydHkueTtcXG4gIGxpZ2h0LnNwb3RBbmdsZVNjYWxlID0gbGlnaHRQcm9wZXJ0eS56O1xcbiAgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0ID0gbGlnaHRQcm9wZXJ0eS53O1xcblxcbiAgbGlnaHQuaW50ZW5zaXR5ID0gbGlnaHRJbnRlbnNpdHk7XFxuICBsaWdodC5wb3NpdGlvbiA9IGxpZ2h0UG9zaXRpb247XFxuICBpZiAobGlnaHRUeXBlIDwgLTAuNSkgeyAvLyBkaXNhYmxlZCBsaWdodFxcbiAgICBsaWdodC5pbnRlbnNpdHkgPSB2ZWMzKDAuMCk7XFxuICAgIGxpZ2h0LnR5cGUgPSAtMTtcXG4gIH0gZWxzZSBpZiAoMC43NSA8IGxpZ2h0VHlwZSkgeyAvLyBpcyBwb2ludGxpZ2h0IG9yIHNwb3RsaWdodFxcbiAgICBsaWdodC5wb2ludFRvTGlnaHQgPSBsaWdodFBvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkO1xcbiAgICBsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gICAgbGlnaHQudHlwZSA9IDE7XFxuICB9IGVsc2UgeyAvLyBpcyBEaXJlY3Rpb25hbCBMaWdodFxcbiAgICBsaWdodC50eXBlID0gMDtcXG4gICAgbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QgKiAtMS4wKTtcXG4gIH1cXG5cXG4gIGlmIChsaWdodFR5cGUgPiAxLjc1KSB7IC8vIGlzIHNwb3RsaWdodFxcbiAgICBsaWdodC50eXBlID0gMjtcXG4gIH1cXG5cXG4gIGNvbnN0IGZsb2F0IE1fUEkgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG4gIGxpZ2h0LmludGVuc2l0eSAqPSBNX1BJOyAvLyBQdW5jdHVhbCBMaWdodFxcblxcbiAgLy8gQXR0ZW51YXRpb25cXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICBnZXRMaWdodEF0dGVudWF0ZWQobGlnaHQpO1xcblxcbiAgcmV0dXJuIGxpZ2h0O1xcbn1cXG5cXG5cXG5mbG9hdCBlZGdlX3JhdGlvKHZlYzMgYmFyeTMsIGZsb2F0IHdpcmVmcmFtZVdpZHRoSW5uZXIsIGZsb2F0IHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZSkge1xcbiAgdmVjMyBkID0gZndpZHRoKGJhcnkzKTtcXG4gIHZlYzMgeCA9IGJhcnkzK3ZlYzMoMS4wIC0gd2lyZWZyYW1lV2lkdGhJbm5lcikqZDtcXG4gIHZlYzMgYTMgPSBzbW9vdGhzdGVwKHZlYzMoMC4wKSwgZCwgeCk7XFxuICBmbG9hdCBmYWN0b3IgPSBtaW4obWluKGEzLngsIGEzLnkpLCBhMy56KTtcXG5cXG4gIHJldHVybiBjbGFtcCgoMS4wIC0gZmFjdG9yKSwgMC4wLCAxLjApO1xcbn1cXG5cXG52ZWMzIGxpbmVhclRvU3JnYih2ZWMzIGxpbmVhckNvbG9yKSB7XFxuICByZXR1cm4gcG93KGxpbmVhckNvbG9yLCB2ZWMzKDEuMC8yLjIpKTtcXG59XFxuXFxudmVjMyBzcmdiVG9MaW5lYXIodmVjMyBzcmdiQ29sb3IpIHtcXG4gIHJldHVybiBwb3coc3JnYkNvbG9yLCB2ZWMzKDIuMikpO1xcbn1cXG5cXG4jaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gIG1hdDMgZ2V0VEJOKHZlYzMgbm9ybWFsX2luV29ybGQsIHZlYzMgdmlld1ZlY3RvciwgdmVjMiB0ZXhjb29yZCkge1xcbiAgICB2ZWMzIHRhbmdlbnRfaW5Xb3JsZCA9IG5vcm1hbGl6ZSh2X3RhbmdlbnRfaW5Xb3JsZCk7XFxuICAgIHZlYzMgYmlub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZSh2X2Jpbm9ybWFsX2luV29ybGQpO1xcbiAgICBtYXQzIHRibk1hdF90YW5nZW50X3RvX3dvcmxkID0gbWF0Myh0YW5nZW50X2luV29ybGQsIGJpbm9ybWFsX2luV29ybGQsIG5vcm1hbF9pbldvcmxkKTtcXG5cXG4gICAgcmV0dXJuIHRibk1hdF90YW5nZW50X3RvX3dvcmxkO1xcbiAgfVxcbiNlbHNlXFxuICAgIC8vIFRoaXMgaXMgYmFzZWQgb24gaHR0cDovL3d3dy50aGV0ZW50aHBsYW5ldC5kZS9hcmNoaXZlcy8xMTgwXFxuICAgIG1hdDMgY290YW5nZW50X2ZyYW1lKHZlYzMgbm9ybWFsX2luV29ybGQsIHZlYzMgcG9zaXRpb24sIHZlYzIgdXYpIHtcXG4gICAgICB1diA9IGdsX0Zyb250RmFjaW5nID8gdXYgOiAtdXY7XFxuXFxuICAgICAgLy8gZ2V0IGVkZ2UgdmVjdG9ycyBvZiB0aGUgcGl4ZWwgdHJpYW5nbGVcXG4gICAgICB2ZWMzIGRwMSA9IGRGZHgocG9zaXRpb24pO1xcbiAgICAgIHZlYzMgZHAyID0gZEZkeShwb3NpdGlvbik7XFxuICAgICAgdmVjMiBkdXYxID0gZEZkeCh1dik7XFxuICAgICAgdmVjMiBkdXYyID0gZEZkeSh1dik7XFxuXFxuICAgICAgLy8gc29sdmUgdGhlIGxpbmVhciBzeXN0ZW1cXG4gICAgICB2ZWMzIGRwMnBlcnAgPSBjcm9zcyhkcDIsIG5vcm1hbF9pbldvcmxkKTtcXG4gICAgICB2ZWMzIGRwMXBlcnAgPSBjcm9zcyhub3JtYWxfaW5Xb3JsZCwgZHAxKTtcXG4gICAgICB2ZWMzIHRhbmdlbnQgPSBkcDJwZXJwICogZHV2MS54ICsgZHAxcGVycCAqIGR1djIueDtcXG4gICAgICB2ZWMzIGJpdGFuZ2VudCA9IGRwMnBlcnAgKiBkdXYxLnkgKyBkcDFwZXJwICogZHV2Mi55O1xcbiAgICAgIGJpdGFuZ2VudCAqPSAtMS4wO1xcblxcbiAgICAgIC8vIGNvbnN0cnVjdCBhIHNjYWxlLWludmFyaWFudCBmcmFtZVxcbiAgICAgIGZsb2F0IGludk1hdCA9IGludmVyc2VzcXJ0KG1heChkb3QodGFuZ2VudCwgdGFuZ2VudCksIGRvdChiaXRhbmdlbnQsIGJpdGFuZ2VudCkpKTtcXG4gICAgICByZXR1cm4gbWF0Myh0YW5nZW50ICogaW52TWF0LCBiaXRhbmdlbnQgKiBpbnZNYXQsIG5vcm1hbF9pbldvcmxkKTtcXG4gICAgfVxcblxcbiAgICBtYXQzIGdldFRCTih2ZWMzIG5vcm1hbF9pbldvcmxkLCB2ZWMzIHZpZXdWZWN0b3IsIHZlYzIgdGV4Y29vcmQpIHtcXG4gICAgICBtYXQzIHRibk1hdF90YW5nZW50X3RvX3dvcmxkID0gY290YW5nZW50X2ZyYW1lKG5vcm1hbF9pbldvcmxkLCAtdmlld1ZlY3RvciwgdGV4Y29vcmQpO1xcblxcbiAgICAgIHJldHVybiB0Ym5NYXRfdGFuZ2VudF90b193b3JsZDtcXG4gICAgfVxcbiNlbmRpZlxcblxcblxcbnZvaWQgbWFpbiAoKXtcXG4gICNpZmRlZiBSTl9NVE9PTl9JU19PVVRMSU5FXFxuICAgICNpZmRlZiBSTl9NVE9PTl9PVVRMSU5FX05PTkVcXG4gICAgICBkaXNjYXJkO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG5cXG4gIC8vIFRPRE9cXG4gIC8vIHV2IHRyYW5zZm9ybVxcblxcbiAgLy8gVE9ET1xcbiAgLy8gdXYgYW5pbWF0aW9uXFxuXFxuICAvLyBtYWluIGNvbG9yXFxuICB2ZWM0IGxpdFRleHR1cmVDb2xvciA9IHRleHR1cmUodV9saXRDb2xvclRleHR1cmUsIHZfdGV4Y29vcmRfMCk7XFxuICB2ZWM0IGxpdENvbG9yRmFjdG9yID0gZ2V0X2xpdENvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIC8vIGFscGhhXFxuICBmbG9hdCBhbHBoYSA9IDEuMDtcXG5cXG4gICNpZmRlZiBSTl9BTFBIQVRFU1RfT05cXG4gICAgYWxwaGEgPSBsaXRUZXh0dXJlQ29sb3IuYSAqIGxpdENvbG9yRmFjdG9yLmE7XFxuICAgIGZsb2F0IGN1dG9mZiA9IGdldF9jdXRvZmYobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBpZihhbHBoYSA8IGN1dG9mZikgZGlzY2FyZDtcXG4gICNlbGlmIGRlZmluZWQoUk5fQUxQSEFCTEVORF9PTilcXG4gICAgYWxwaGEgPSBsaXRUZXh0dXJlQ29sb3IuYSAqIGxpdENvbG9yRmFjdG9yLmE7XFxuICAjZW5kaWZcXG5cXG4gIGlmIChhbHBoYSA8IDAuMDEpIHtcXG4gICAgZGlzY2FyZDtcXG4gIH1lbHNle1xcbiAgICBydDAudyA9IGFscGhhO1xcbiAgfVxcblxcblxcbiAgI2lmZGVmIFJOX01UT09OX0lTX09VVExJTkVcXG4gICAgI2lmZGVmIFJOX01UT09OX09VVExJTkVfQ09MT1JfRklYRURcXG4gICAgICB2ZWMzIG91dGxpbmVDb2xvciA9IGdldF9vdXRsaW5lQ29sb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIHJ0MC54eXogPSBvdXRsaW5lQ29sb3I7XFxuXFxuICAgICAgcnQwLnh5eiA9IHNyZ2JUb0xpbmVhcihydDAueHl6KTtcXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbiAgICAgIHJldHVybjtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4gIC8vIHZpZXcgdmVjdG9yXFxuICB2ZWMzIHZpZXdQb3NpdGlvbiA9IGdldF92aWV3UG9zaXRpb24oY2FtZXJhU0lELCAwKTtcXG4gIHZlYzMgdmlld1ZlY3RvciA9IHZpZXdQb3NpdGlvbiAtIHZfcG9zaXRpb25faW5Xb3JsZC54eXo7XFxuXFxuICAvLyBOb3JtYWxcXG4gIHZlYzMgbm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUodl9ub3JtYWxfaW5Xb3JsZCk7XFxuICAjaWZkZWYgUk5fTVRPT05fSEFTX0JVTVBNQVBcXG4gICAgdmVjMyBub3JtYWwgPSB0ZXh0dXJlKHVfbm9ybWFsVGV4dHVyZSwgdl90ZXhjb29yZF8wKS54eXogKiAyLjAgLSAxLjA7XFxuICAgIG1hdDMgVEJOID0gZ2V0VEJOKG5vcm1hbF9pbldvcmxkLCB2aWV3VmVjdG9yLCB2X3RleGNvb3JkXzApO1xcbiAgICBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShUQk4gKiBub3JtYWwpO1xcbiAgI2VuZGlmXFxuXFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICBub3JtYWxfaW5Xb3JsZCAqPSAtMS4wO1xcbiAgI2VuZGlmXFxuXFxuXFxuICAvLyBMaWdodGluZywgRGlyZWN0IExpZ2h0XFxuXFxuICBmbG9hdCBzaGFkb3dBdHRlbnVhdGlvbiA9IDEuMDtcXG4gIC8vIFRPRE86IHNoYWRvd21hcCBjb21wdXRhdGlvblxcblxcbiAgZmxvYXQgcmVjZWl2ZVNoYWRvd1JhdGUgPSBnZXRfcmVjZWl2ZVNoYWRvd1JhdGUobWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgbGlnaHRBdHRlbnVhdGlvbiA9IHNoYWRvd0F0dGVudWF0aW9uICogbWl4KDEuMCwgc2hhZG93QXR0ZW51YXRpb24sIHJlY2VpdmVTaGFkb3dSYXRlICogdGV4dHVyZSh1X3JlY2VpdmVTaGFkb3dUZXh0dXJlLCB2X3RleGNvb3JkXzApLnIpO1xcblxcbiAgZmxvYXQgc2hhZGluZ0dyYWRlUmF0ZSA9IGdldF9zaGFkaW5nR3JhZGVSYXRlKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IHNoYWRpbmdHcmFkZSA9IDEuMCAtIHNoYWRpbmdHcmFkZVJhdGUgKiAoMS4wIC0gdGV4dHVyZSh1X3NoYWRpbmdHcmFkZVRleHR1cmUsIHZfdGV4Y29vcmRfMCkucik7XFxuICBmbG9hdCBsaWdodENvbG9yQXR0ZW51YXRpb24gPSBnZXRfbGlnaHRDb2xvckF0dGVudWF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIHZlYzMgc2hhZGVDb2xvckZhY3RvciA9IGdldF9zaGFkZUNvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIHZlYzMgc2hhZGVDb2xvciA9IHNoYWRlQ29sb3JGYWN0b3IgKiB0ZXh0dXJlKHVfc2hhZGVDb2xvclRleHR1cmUsIHZfdGV4Y29vcmRfMCkueHl6O1xcbiAgc2hhZGVDb2xvci54eXogPSBzcmdiVG9MaW5lYXIoc2hhZGVDb2xvci54eXopO1xcblxcbiAgdmVjMyBsaXRDb2xvciA9IGxpdENvbG9yRmFjdG9yLnh5eiAqIGxpdFRleHR1cmVDb2xvci54eXo7XFxuICBsaXRDb2xvci54eXogPSBzcmdiVG9MaW5lYXIobGl0Q29sb3IueHl6KTtcXG5cXG5cXG4gIGZsb2F0IHNoYWRlU2hpZnQgPSBnZXRfc2hhZGVTaGlmdChtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCBzaGFkZVRvb255ID0gZ2V0X3NoYWRlVG9vbnkobWF0ZXJpYWxTSUQsIDApO1xcblxcbiAgdmVjMyBsaWdodGluZ3NbLyogc2hhZGVyaXR5OiBAe0NvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyfSAqL107XFxuICAjaWZkZWYgUk5fTVRPT05fREVCVUdfTElUU0hBREVSQVRFXFxuICAgIGZsb2F0IGxpZ2h0SW50ZW5zaXRpZXNbLyogc2hhZGVyaXR5OiBAe0NvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyfSAqL107XFxuICAjZW5kaWZcXG4gIGZvciAoaW50IGkgPSAwOyBpIDwgLyogc2hhZGVyaXR5OiBAe0NvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyfSAqLzsgaSsrKSB7XFxuICAgIGlmIChpID49IGxpZ2h0TnVtYmVyKSB7XFxuICAgICAgYnJlYWs7XFxuICAgIH1cXG5cXG4gICAgLy8gTGlnaHRcXG4gICAgTGlnaHQgbGlnaHQgPSBnZXRMaWdodChpLCB2X3Bvc2l0aW9uX2luV29ybGQueHl6KTtcXG5cXG4gICAgLy8gbGlnaHRBdHRlbnVhdGlvbiAqPSBkaXN0YW5jZUF0dGVudWF0aW9uICogc3BvdEVmZmVjdDtcXG4gICAgZmxvYXQgZG90TkwgPSBkb3QobGlnaHQuZGlyZWN0aW9uLCBub3JtYWxfaW5Xb3JsZCk7XFxuICAgIGZsb2F0IGxpZ2h0SW50ZW5zaXR5ID0gZG90TkwgKiAwLjUgKyAwLjU7IC8vIGZyb20gWy0xLCArMV0gdG8gWzAsIDFdXFxuICAgIGxpZ2h0SW50ZW5zaXR5ID0gbGlnaHRJbnRlbnNpdHkgKiBsaWdodEF0dGVudWF0aW9uOyAvLyBUT0RPOiByZWNlaXZlIHNoYWRvd1xcbiAgICBsaWdodEludGVuc2l0eSA9IGxpZ2h0SW50ZW5zaXR5ICogc2hhZGluZ0dyYWRlOyAvLyBkYXJrZXJcXG4gICAgbGlnaHRJbnRlbnNpdHkgPSBsaWdodEludGVuc2l0eSAqIDIuMCAtIDEuMDsgLy8gZnJvbSBbMCwgMV0gdG8gWy0xLCArMV1cXG5cXG4gICAgLy8gdG9vbmVkLiBtYXBwaW5nIGZyb20gW21pbkludGVuc2l0eVRocmVzaG9sZCwgbWF4SW50ZW5zaXR5VGhyZXNob2xkXSB0byBbMCwgMV1cXG4gICAgZmxvYXQgbWF4SW50ZW5zaXR5VGhyZXNob2xkID0gbWl4KDEuMCwgc2hhZGVTaGlmdCwgc2hhZGVUb29ueSk7XFxuICAgIGZsb2F0IG1pbkludGVuc2l0eVRocmVzaG9sZCA9IHNoYWRlU2hpZnQ7XFxuICAgIGxpZ2h0SW50ZW5zaXR5ID0gY2xhbXAoKGxpZ2h0SW50ZW5zaXR5IC0gbWluSW50ZW5zaXR5VGhyZXNob2xkKSAvIG1heChFUFNfQ09MLCAobWF4SW50ZW5zaXR5VGhyZXNob2xkIC0gbWluSW50ZW5zaXR5VGhyZXNob2xkKSksIDAuMCwgMS4wKTtcXG4gICAgI2lmZGVmIFJOX01UT09OX0RFQlVHX0xJVFNIQURFUkFURVxcbiAgICAgIGxpZ2h0SW50ZW5zaXRpZXNbaV0gPSBsaWdodEludGVuc2l0eTtcXG4gICAgI2VuZGlmXFxuXFxuICAgIC8vIEFsYmVkbyBjb2xvclxcbiAgICB2ZWMzIGNvbCA9IG1peChzaGFkZUNvbG9yLCBsaXRDb2xvciwgbGlnaHRJbnRlbnNpdHkpO1xcblxcbiAgICAvLyBEaXJlY3QgTGlnaHRcXG4gICAgdmVjMyBsaWdodGluZyA9IGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuICAgIGxpZ2h0aW5nID0gbWl4KGxpZ2h0aW5nLCB2ZWMzKG1heChFUFNfQ09MLCBtYXgobGlnaHRpbmcueCwgbWF4KGxpZ2h0aW5nLnksIGxpZ2h0aW5nLnopKSkpLCBsaWdodENvbG9yQXR0ZW51YXRpb24pOyAvLyBjb2xvciBhdHRlblxcblxcblxcbiAgICBpZihpID4gMCl7XFxuICAgICAgbGlnaHRpbmcgKj0gMC41OyAvLyBkYXJrZW4gaWYgYWRkaXRpb25hbCBsaWdodC5cXG4gICAgICBsaWdodGluZyAqPSBtaW4oMC4wLCBkb3ROTCkgKyAxLjA7IC8vIGRhcmtlbiBkb3ROTCA8IDAgYXJlYSBieSB1c2luZyBoYWxmIGxhbWJlcnRcXG4gICAgICAvLyBsaWdodGluZyAqPSBzaGFkb3dBdHRlbnVhdGlvbjsgLy8gZGFya2VuIGlmIHJlY2VpdmluZyBzaGFkb3dcXG4gICAgICAjaWZkZWYgUk5fQUxQSEFCTEVORF9PTlxcbiAgICAgICAgbGlnaHRpbmcgKj0gc3RlcCgwLjAsIGRvdE5MKTsgLy8gZGFya2VuIGlmIHRyYW5zcGFyZW50LiBCZWNhdXNlIFVuaXR5J3MgdHJhbnNwYXJlbnQgbWF0ZXJpYWwgY2FuJ3QgcmVjZWl2ZSBzaGFkb3dBdHRlbnVhdGlvbi5cXG4gICAgICAjZW5kaWZcXG4gICAgfVxcblxcbiAgICBjb2wgKj0gbGlnaHRpbmc7XFxuICAgIGxpZ2h0aW5nc1tpXSA9IGxpZ2h0aW5nO1xcblxcbiAgICBydDAueHl6ICs9IGNvbDtcXG5cXG4gICAgbGlnaHRBdHRlbnVhdGlvbiA9IDEuMDtcXG4gIH1cXG5cXG5cXG4gIC8vIEluZGlyZWN0IExpZ2h0XFxuICB2ZWMzIGluZGlyZWN0TGlnaHRpbmcgPSBnZXRfYW1iaWVudENvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGluZGlyZWN0TGlnaHRpbmcgPSBzcmdiVG9MaW5lYXIoaW5kaXJlY3RMaWdodGluZyk7XFxuICBpbmRpcmVjdExpZ2h0aW5nID0gbWl4KGluZGlyZWN0TGlnaHRpbmcsIHZlYzMobWF4KEVQU19DT0wsIG1heChpbmRpcmVjdExpZ2h0aW5nLngsIG1heChpbmRpcmVjdExpZ2h0aW5nLnksIGluZGlyZWN0TGlnaHRpbmcueikpKSksIGxpZ2h0Q29sb3JBdHRlbnVhdGlvbik7IC8vIGNvbG9yIGF0dGVuXFxuICAvLyBUT0RPOiB1c2UgU2hhZGVJcmFkIGluIHd3dy5wcHNsb2FuLm9yZy9wdWJsaWNhdGlvbnMvU3R1cGlkU0gzNi5wZGZcXG5cXG4gIHJ0MC54eXogKz0gaW5kaXJlY3RMaWdodGluZyAqIGxpdENvbG9yO1xcbiAgcnQwLnh5eiA9IG1pbihydDAueHl6LCBsaXRDb2xvcik7IC8vIGNvbW1lbnQgb3V0IGlmIHlvdSB3YW50IHRvIFBCUiBhYnNvbHV0ZWx5LlxcblxcblxcbiAgI2lmZGVmIFJOX01UT09OX0lTX09VVExJTkVcXG4gICAgI2lmZGVmIFJOX01UT09OX09VVExJTkVfQ09MT1JfTUlYRURcXG4gICAgICB2ZWMzIG91dGxpbmVDb2xvciA9IGdldF9vdXRsaW5lQ29sb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIG91dGxpbmVDb2xvciA9IHNyZ2JUb0xpbmVhcihvdXRsaW5lQ29sb3IpO1xcbiAgICAgIGZsb2F0IG91dGxpbmVMaWdodGluZ01peCA9IGdldF9vdXRsaW5lTGlnaHRpbmdNaXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIHJ0MC54eXogPSBvdXRsaW5lQ29sb3IgKiBtaXgodmVjMygxLjApLCBydDAueHl6LCBvdXRsaW5lTGlnaHRpbmdNaXgpO1xcbiAgICAjZW5kaWZcXG4gICNlbHNlXFxuICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2aWV3VmVjdG9yKTtcXG5cXG4gICAgZmxvYXQgcmltRnJlc25lbFBvd2VyID0gZ2V0X3JpbUZyZXNuZWxQb3dlcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGZsb2F0IHJpbUxpZnQgPSBnZXRfcmltTGlmdChtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHZlYzMgcmltQ29sb3JGYWN0b3IgPSBnZXRfcmltQ29sb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgICB2ZWMzIHJpbVRleHR1cmVDb2xvciA9IHRleHR1cmUodV9yaW1UZXh0dXJlLCB2X3RleGNvb3JkXzApLnh5ejtcXG4gICAgdmVjMyByaW1Db2xvciA9IHNyZ2JUb0xpbmVhcihyaW1Db2xvckZhY3RvciAqIHJpbVRleHR1cmVDb2xvcik7XFxuICAgIHZlYzMgcmltID0gcG93KGNsYW1wKDEuMCAtIGRvdChub3JtYWxfaW5Xb3JsZCwgdmlld0RpcmVjdGlvbikgKyByaW1MaWZ0LCAwLjAsIDEuMCksIHJpbUZyZXNuZWxQb3dlcikgKiByaW1Db2xvcjtcXG5cXG4gICAgZmxvYXQgc3RhdGljUmltTGlnaHRpbmcgPSAxLjA7XFxuICAgIGZsb2F0IHJpbUxpZ2h0aW5nTWl4ID0gZ2V0X3JpbUxpZ2h0aW5nTWl4KG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAvKiBzaGFkZXJpdHk6IEB7Q29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXJ9ICovOyBpKyspIHtcXG4gICAgICBpZiAoaSA+PSBsaWdodE51bWJlcikgYnJlYWs7XFxuXFxuICAgICAgaWYoaSA+IDApIHN0YXRpY1JpbUxpZ2h0aW5nID0gMC4wO1xcblxcbiAgICAgIHZlYzMgcmltTGlnaHRpbmcgPSBtaXgodmVjMyhzdGF0aWNSaW1MaWdodGluZyksIGxpZ2h0aW5nc1tpXSwgdmVjMyhyaW1MaWdodGluZ01peCkpO1xcbiAgICAgIHJ0MC54eXogKz0gcmltICogcmltTGlnaHRpbmc7XFxuICAgIH1cXG5cXG4gICAgLy8gYWRkaXRpdmUgbWF0Y2FwXFxuICAgIHZlYzMgY2FtZXJhVXAgPSBnZXRfY2FtZXJhVXAoMC4wLCAwKTsgLy9zb2xvIGRhdHVtXFxuICAgIHZlYzMgd29ybGRWaWV3VXAgPSBub3JtYWxpemUoY2FtZXJhVXAgLSB2aWV3RGlyZWN0aW9uICogZG90KHZpZXdEaXJlY3Rpb24sIGNhbWVyYVVwKSk7XFxuICAgIHZlYzMgd29ybGRWaWV3UmlnaHQgPSBub3JtYWxpemUoY3Jvc3Modmlld0RpcmVjdGlvbiwgd29ybGRWaWV3VXApKTtcXG4gICAgdmVjMiBtYXRjYXBVdiA9IHZlYzIoZG90KHdvcmxkVmlld1JpZ2h0LCBub3JtYWxfaW5Xb3JsZCksIGRvdCh3b3JsZFZpZXdVcCwgbm9ybWFsX2luV29ybGQpKSAqIDAuNSArIDAuNTtcXG4gICAgdmVjMyBtYXRDYXBDb2xvciA9IHNyZ2JUb0xpbmVhcih0ZXh0dXJlKHVfbWF0Q2FwVGV4dHVyZSwgbWF0Y2FwVXYpLnh5eik7XFxuICAgIHJ0MC54eXogKz0gbWF0Q2FwQ29sb3I7XFxuXFxuXFxuICAgIC8vIEVtaXNzaW9uXFxuICAgIHZlYzMgZW1pc3Npb25Db2xvciA9IGdldF9lbWlzc2lvbkNvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgdmVjMyBlbWlzc2lvbiA9IHNyZ2JUb0xpbmVhcih0ZXh0dXJlKHVfZW1pc3Npb25UZXh0dXJlLCB2X3RleGNvb3JkXzApLnh5eikgKiBlbWlzc2lvbkNvbG9yO1xcbiAgICBydDAueHl6ICs9IGVtaXNzaW9uO1xcbiAgI2VuZGlmXFxuXFxuXFxuICAvLyBkZWJ1Z1xcbiAgI2lmZGVmIFJOX01UT09OX0RFQlVHX05PUk1BTFxcbiAgICBydDAgPSB2ZWM0KG5vcm1hbF9pbldvcmxkICogMC41ICsgMC41LCBhbHBoYSk7XFxuXFxuICAgIHJ0MC54eXogPSBzcmdiVG9MaW5lYXIocnQwLnh5eik7XFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG4gICAgcmV0dXJuO1xcbiAgI2VsaWYgZGVmaW5lZChSTl9NVE9PTl9ERUJVR19MSVRTSEFERVJBVEUpXFxuICAgIHJ0MCA9IHZlYzQoMC4wKTtcXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAvKiBzaGFkZXJpdHk6IEB7Q29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXJ9ICovOyBpKyspIHtcXG4gICAgICBpZiAoaSA+PSBsaWdodE51bWJlcikgYnJlYWs7XFxuICAgICAgcnQwICs9IHZlYzQobGlnaHRJbnRlbnNpdGllc1tpXSAqIGxpZ2h0aW5nc1tpXSwgYWxwaGEpO1xcbiAgICB9XFxuXFxuICAgIHJ0MC54eXogPSBzcmdiVG9MaW5lYXIocnQwLnh5eik7XFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG4gICAgcmV0dXJuO1xcbiAgI2VuZGlmXFxuXFxuXFxuICAvLyBXaXJlZnJhbWVcXG4gIGZsb2F0IHRocmVzaG9sZCA9IDAuMDAxO1xcbiAgdmVjMyB3aXJlZnJhbWUgPSBnZXRfd2lyZWZyYW1lKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoSW5uZXIgPSB3aXJlZnJhbWUuejtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZSA9IDEuMDtcXG4gIGlmICh3aXJlZnJhbWUueCA+IDAuNSAmJiB3aXJlZnJhbWUueSA8IDAuNSkge1xcbiAgICBydDAuYSA9IDAuMDtcXG4gIH1cXG4gIHZlYzQgd2lyZWZyYW1lUmVzdWx0ID0gcnQwO1xcbiAgdmVjNCB3aXJlZnJhbWVDb2xvciA9IHZlYzQoMC4yLCAwLjc1LCAwLjAsIDEuMCk7XFxuICBmbG9hdCBlZGdlUmF0aW8gPSBlZGdlX3JhdGlvKHZfYmFyeUNlbnRyaWNDb29yZCwgd2lyZWZyYW1lV2lkdGhJbm5lciwgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlKTtcXG4gIGZsb2F0IGVkZ2VSYXRpb01vZGlmaWVkID0gbWl4KHN0ZXAodGhyZXNob2xkLCBlZGdlUmF0aW8pLCBjbGFtcChlZGdlUmF0aW8qNC4wLCAwLjAsIDEuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvNC4wKTtcXG4gIC8vIGlmIHIwLmEgaXMgMC4wLCBpdCBpcyB3aXJlZnJhbWUgbm90IG9uIHNoYWRlZFxcbiAgd2lyZWZyYW1lUmVzdWx0LnJnYiA9IHdpcmVmcmFtZUNvbG9yLnJnYiAqIGVkZ2VSYXRpb01vZGlmaWVkICsgcnQwLnJnYiAqICgxLjAgLSBlZGdlUmF0aW9Nb2RpZmllZCk7XFxuICB3aXJlZnJhbWVSZXN1bHQuYSA9IG1heChydDAuYSwgd2lyZWZyYW1lQ29sb3IuYSAqIG1peChlZGdlUmF0aW9Nb2RpZmllZCwgcG93KGVkZ2VSYXRpb01vZGlmaWVkLCAxMDAuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvMS4wKSk7XFxuXFxuICBpZiAod2lyZWZyYW1lLnggPiAwLjUpIHtcXG4gICAgcnQwID0gd2lyZWZyYW1lUmVzdWx0O1xcbiAgICBpZiAod2lyZWZyYW1lLnkgPCAwLjUgJiYgcnQwLmEgPT0gMC4wKSB7XFxuICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgfVxcblxcbmZsb2F0IG1ha2VPdXRwdXRTcmdiID0gZmxvYXQoZ2V0X21ha2VPdXRwdXRTcmdiKG1hdGVyaWFsU0lELCAwKSk7XFxucnQwLnJnYiA9IG1peChydDAucmdiLCBsaW5lYXJUb1NyZ2IocnQwLnJnYiksIG1ha2VPdXRwdXRTcmdiKTtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuLy8gVGhpcyBzaGFkZXIgaXMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL1NhbnRhcmgvTVRvb25cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMzIGFfbm9ybWFsO1xcbmluIHZlYzQgYV9iYXJ5Q2VudHJpY0Nvb3JkO1xcbmluIHZlYzQgYV9qb2ludDtcXG5pbiB2ZWM0IGFfd2VpZ2h0O1xcblxcbm91dCB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5vdXQgdmVjMyB2X2JhcnlDZW50cmljQ29vcmQ7XFxub3V0IHZlYzMgdl9ub3JtYWxfaW5WaWV3O1xcbm91dCB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxub3V0IHZlYzQgdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcbiNpZmRlZiBSTl9VU0VfVEFOR0VOVFxcbmluIHZlYzQgYV90YW5nZW50O1xcbm91dCB2ZWMzIHZfdGFuZ2VudF9pbldvcmxkO1xcbm91dCB2ZWMzIHZfYmlub3JtYWxfaW5Xb3JsZDsgLy8gYml0YW5nZW50X2luV29ybGRcXG4jZW5kaWZcXG5cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5tYXQzIHRvTm9ybWFsTWF0cml4KG1hdDQgbSkge1xcbiAgZmxvYXQgYTAwID0gbVswXVswXSwgYTAxID0gbVswXVsxXSwgYTAyID0gbVswXVsyXSwgYTAzID0gbVswXVszXSxcXG4gIGExMCA9IG1bMV1bMF0sIGExMSA9IG1bMV1bMV0sIGExMiA9IG1bMV1bMl0sIGExMyA9IG1bMV1bM10sXFxuICBhMjAgPSBtWzJdWzBdLCBhMjEgPSBtWzJdWzFdLCBhMjIgPSBtWzJdWzJdLCBhMjMgPSBtWzJdWzNdLFxcbiAgYTMwID0gbVszXVswXSwgYTMxID0gbVszXVsxXSwgYTMyID0gbVszXVsyXSwgYTMzID0gbVszXVszXTtcXG5cXG4gIGZsb2F0IGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcXG4gIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcXG4gIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcXG4gIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcXG4gIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcXG4gIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcXG4gIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcXG4gIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcXG4gIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcXG4gIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcXG4gIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcXG4gIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcXG5cXG4gIGZsb2F0IGRldGVybWluYW50VmFsID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xcblxcbiAgcmV0dXJuIG1hdDMoXFxuICAgIGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSwgYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3LCBhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYsXFxuICAgIGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSwgYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3LCBhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYsXFxuICAgIGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMywgYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxLCBhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApIC8gZGV0ZXJtaW5hbnRWYWw7XFxufVxcblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcblxcbmhpZ2hwIG1hdDQgY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKCBoaWdocCB2ZWM0IHF1YXRlcm5pb24sIGhpZ2hwIHZlYzMgdHJhbnNsYXRpb24sIGhpZ2hwIHZlYzMgc2NhbGUgKSB7XFxuICBoaWdocCB2ZWM0IHEgPSBxdWF0ZXJuaW9uO1xcbiAgaGlnaHAgdmVjMyB0ID0gdHJhbnNsYXRpb247XFxuXFxuICBoaWdocCBmbG9hdCBzeCA9IHEueCAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHN5ID0gcS55ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgc3ogPSBxLnogKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeCA9IHEueSAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN5ID0gcS54ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ogPSBxLnggKiBxLnk7XFxuICBoaWdocCBmbG9hdCB3eCA9IHEudyAqIHEueDtcXG4gIGhpZ2hwIGZsb2F0IHd5ID0gcS53ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ogPSBxLncgKiBxLno7XFxuXFxuICBoaWdocCBtYXQ0IG1hdCA9IG1hdDQoXFxuICAgIDEuMCAtIDIuMCAqIChzeSArIHN6KSwgMi4wICogKGN6ICsgd3opLCAyLjAgKiAoY3kgLSB3eSksIDAuMCxcXG4gICAgMi4wICogKGN6IC0gd3opLCAxLjAgLSAyLjAgKiAoc3ggKyBzeiksIDIuMCAqIChjeCArIHd4KSwgMC4wLFxcbiAgICAyLjAgKiAoY3kgKyB3eSksIDIuMCAqIChjeCAtIHd4KSwgMS4wIC0gMi4wICogKHN4ICsgc3kpLCAwLjAsXFxuICAgIHQueCwgdC55LCB0LnosIDEuMFxcbiAgKTtcXG5cXG4gIGhpZ2hwIG1hdDQgdW5pZm9ybVNjYWxlTWF0ID0gbWF0NChcXG4gICAgc2NhbGUueCwgMC4wLCAwLjAsIDAuMCxcXG4gICAgMC4wLCBzY2FsZS55LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIHNjYWxlLnosIDAuMCxcXG4gICAgMC4wLCAwLjAsIDAuMCwgMS4wXFxuICApO1xcblxcbiAgcmV0dXJuIG1hdCp1bmlmb3JtU2NhbGVNYXQ7XFxufVxcblxcbmhpZ2hwIHZlYzQgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChoaWdocCB2ZWMyIHZlY194eSwgaGlnaHAgZmxvYXQgY3JpdGVyaWEpe1xcblxcbiAgaGlnaHAgZmxvYXQgcjtcXG4gIGhpZ2hwIGZsb2F0IGc7XFxuICBoaWdocCBmbG9hdCBiO1xcbiAgaGlnaHAgZmxvYXQgYTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl4ID0gZmxvb3IodmVjX3h5LnggKiBjcml0ZXJpYSk7XFxuICBoaWdocCBmbG9hdCB2MXggPSBpeCAvIGNyaXRlcmlhO1xcbiAgaGlnaHAgZmxvYXQgdjF5ID0gaXggLSBmbG9vcih2MXgpICogY3JpdGVyaWE7XFxuXFxuICByID0gKCB2MXggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgZyA9ICggdjF5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIGhpZ2hwIGZsb2F0IGl5ID0gZmxvb3IoIHZlY194eS55ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjJ4ID0gaXkgLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYyeSA9IGl5IC0gZmxvb3IodjJ4KSAqIGNyaXRlcmlhO1xcblxcbiAgYiA9ICggdjJ4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGEgPSAoIHYyeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICByIC09IDEuMC9jcml0ZXJpYTtcXG4gIGcgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYiAtPSAxLjAvY3JpdGVyaWE7XFxuICBhIC09IDEuMC9jcml0ZXJpYTtcXG5cXG4gIHIgPSByKjIuMC0xLjA7XFxuICBnID0gZyoyLjAtMS4wO1xcbiAgYiA9IGIqMi4wLTEuMDtcXG4gIGEgPSBhKjIuMC0xLjA7XFxuXFxuICByZXR1cm4gdmVjNChyLCBnLCBiLCBhKTtcXG59XFxuXFxubWF0NCBnZXRTa2luTWF0cml4KGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEKSB7XFxuXFxuI2lmZGVmIFJOX0JPTkVfREFUQV9UWVBFX01hdDQzeDFcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSkpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyKVxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcblxcbiAgdmVjNCB0cV94ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IHNxX3ggPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3gudywgc3FfeC53KSwgY3JpdGVyaWEueCk7XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3gueHl6LCBzcV94Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgc3FfeSA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3kudywgc3FfeS53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeS54eXosIHNxX3kueHl6KTtcXG5cXG4gIHZlYzQgdHFfeiA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBzcV96ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfei53LCBzcV96LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV96Lnh5eiwgc3Ffei54eXopO1xcblxcbiAgdmVjNCB0cV93ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICB2ZWM0IHNxX3cgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV93LncsIHNxX3cudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3cueHl6LCBzcV93Lnh5eik7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDJfT0xEKVxcbiAgdmVjNCB0c194ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgdmVjNCB0c195ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgxKVxcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ggPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1kgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1ogPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZENodW5rc1cgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcblxcbiAgdmVjMiBjcml0ZXJpYSA9IHZlYzIoNDA5Ni4wLCA0MDk2LjApO1xcbiAgdmVjNCBib25lQ29tcHJlc3NlZEluZm8gPSBnZXRfYm9uZUNvbXByZXNzZWRJbmZvKDAuMCwgMCk7XFxuXFxuICB2ZWM0IHRzX3ggPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1gueHksIGNyaXRlcmlhLngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnh5LCBjcml0ZXJpYS54KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICB2ZWM0IHRzX3ogPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi54eSwgY3JpdGVyaWEueCksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgdmVjNCB0c193ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cueHksIGNyaXRlcmlhLngpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG4jZW5kaWZcXG4gIHJldHVybiBza2luTWF0O1xcbn1cXG4jZW5kaWZcXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5ib29sIHNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQzIGluTm9ybWFsTWF0cml4LFxcbiAgb3V0IG1hdDMgb3V0Tm9ybWFsTWF0cml4LFxcbiAgaW4gdmVjMyBpblBvc2l0aW9uX2luTG9jYWwsXFxuICBvdXQgdmVjNCBvdXRQb3NpdGlvbl9pbldvcmxkLFxcbiAgaW4gdmVjMyBpbk5vcm1hbF9pbkxvY2FsLFxcbiAgb3V0IHZlYzMgb3V0Tm9ybWFsX2luV29ybGRcXG4gIClcXG57XFxuICBtYXQ0IHNraW5NYXQgPSBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lEKTtcXG4gIG91dFBvc2l0aW9uX2luV29ybGQgPSBza2luTWF0ICogdmVjNChpblBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICBvdXROb3JtYWxNYXRyaXggPSB0b05vcm1hbE1hdHJpeChza2luTWF0KTtcXG4gIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKG91dE5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcblxcbiAgcmV0dXJuIHRydWU7XFxufVxcbiNlbmRpZlxcblxcbmJvb2wgcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gIGluIG1hdDQgd29ybGRNYXRyaXgsXFxuICBpbiBtYXQ0IHZpZXdNYXRyaXgsXFxuICBpbiBib29sIGlzQmlsbGJvYXJkLFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuKSB7XFxuICBib29sIGlzU2tpbm5pbmcgPSBmYWxzZTtcXG5cXG4gIHZlYzMgcG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIGlmICh1X21vcnBoVGFyZ2V0TnVtYmVyID09IDApIHtcXG4jZW5kaWZcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGluUG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIH0gZWxzZSB7XFxuICAgIGZsb2F0IHZlcnRleElkeCA9IGFfYmFyeUNlbnRyaWNDb29yZC53O1xcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gZ2V0X3Bvc2l0aW9uKHZlcnRleElkeCwgaW5Qb3NpdGlvbl9pbkxvY2FsKTtcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIG1hdDQgd29ybGRNYXRyaXhJbm5lciA9IHdvcmxkTWF0cml4O1xcbiAgaWYgKGlzQmlsbGJvYXJkKSB7XFxuICAgIG1hdDQgaW52ZXJzZVZpZXdNYXRyaXggPSBpbnZlcnNlKHZpZXdNYXRyaXgpO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVswXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzBdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsxXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzFdO1xcbiAgICBpbnZlcnNlVmlld01hdHJpeFszXVsyXSA9IDAuMDsvL3dvcmxkTWF0cml4WzNdWzJdO1xcbiAgICB3b3JsZE1hdHJpeElubmVyID0gaW52ZXJzZVZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeDtcXG4gIH1cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIGlmIChza2VsZXRhbENvbXBvbmVudFNJRCA+PSAwLjApIHtcXG4gICAgaXNTa2lubmluZyA9IHNraW5uaW5nKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbk5vcm1hbE1hdHJpeCwgb3V0Tm9ybWFsTWF0cml4LCBwb3NpdGlvbl9pbkxvY2FsLCBvdXRQb3NpdGlvbl9pbldvcmxkLCBpbk5vcm1hbF9pbkxvY2FsLCBvdXROb3JtYWxfaW5Xb3JsZCk7XFxuICB9IGVsc2Uge1xcbiNlbmRpZlxcbiAgICBvdXROb3JtYWxNYXRyaXggPSBpbk5vcm1hbE1hdHJpeDtcXG4gICAgb3V0UG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4SW5uZXIgKiB2ZWM0KHBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICAgIG91dE5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGluTm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICB9XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gaXNTa2lubmluZztcXG59XFxuXFxuXFxudm9pZCBtYWluKCl7XFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICAjaWZkZWYgUk5fTVRPT05fT1VUTElORV9OT05FXFxuICAgICAgcmV0dXJuO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0MyBub3JtYWxNYXRyaXggPSBnZXRfbm9ybWFsTWF0cml4KGFfaW5zdGFuY2VJbmZvLngpO1xcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuICBpc1NraW5uaW5nID0gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgZmFsc2UsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBhX3Bvc2l0aW9uLFxcbiAgICB2X3Bvc2l0aW9uX2luV29ybGQsXFxuICAgIGFfbm9ybWFsLFxcbiAgICB2X25vcm1hbF9pbldvcmxkXFxuICApO1xcblxcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5cXG4gIHZfbm9ybWFsX2luVmlldyA9IHZlYzModmlld01hdHJpeCAqIHZlYzQodl9ub3JtYWxfaW5Xb3JsZCwgMC4wKSk7XFxuXFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICAjaWYgZGVmaW5lZChSTl9NVE9PTl9IQVNfT1VUTElORV9XSURUSF9URVhUVVJFKVxcbiAgICAgIGZsb2F0IG91dGxpbmVUZXggPSB0ZXh0dXJlKHVfb3V0bGluZVdpZHRoVGV4dHVyZSwgYV90ZXhjb29yZF8wKS5yO1xcbiAgICAjZWxzZVxcbiAgICAgIGZsb2F0IG91dGxpbmVUZXggPSAxLjA7XFxuICAgICNlbmRpZlxcblxcbiAgICAjaWYgZGVmaW5lZChSTl9NVE9PTl9PVVRMSU5FX1dJRFRIX1dPUkxEKVxcbiAgICAgIGZsb2F0IG91dGxpbmVXaWR0aCA9IGdldF9vdXRsaW5lV2lkdGgobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIHZlYzMgb3V0bGluZU9mZnNldCA9IDAuMDEgKiBvdXRsaW5lV2lkdGggKiBvdXRsaW5lVGV4ICogYV9ub3JtYWw7XFxuICAgICAgdmVjNCB3b3JsZE91dGxpbmVPZmZzZXQgPSB3b3JsZE1hdHJpeCAqIHZlYzQob3V0bGluZU9mZnNldCwgMC4wKTtcXG4gICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogKHZfcG9zaXRpb25faW5Xb3JsZCArIHdvcmxkT3V0bGluZU9mZnNldCk7XFxuXFxuICAgICNlbGlmIGRlZmluZWQoUk5fTVRPT05fT1VUTElORV9XSURUSF9TQ1JFRU4pXFxuICAgICAgdmVjNCB2ZXJ0ZXggPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG4gICAgICB2ZWMzIGNsaXBOb3JtYWwgPSAocHJvamVjdGlvbk1hdHJpeCAqIHZlYzQodl9ub3JtYWxfaW5WaWV3LCAxLjApKS54eXo7XFxuICAgICAgdmVjMiBwcm9qZWN0ZWROb3JtYWwgPSBub3JtYWxpemUoY2xpcE5vcm1hbC54eSk7XFxuICAgICAgZmxvYXQgb3V0bGluZVNjYWxlZE1heERpc3RhbmNlID0gZ2V0X291dGxpbmVTY2FsZWRNYXhEaXN0YW5jZShtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgcHJvamVjdGVkTm9ybWFsICo9IG1pbih2ZXJ0ZXgudywgb3V0bGluZVNjYWxlZE1heERpc3RhbmNlKTtcXG4gICAgICBmbG9hdCBhc3BlY3QgPSBhYnMoZ2V0X2FzcGVjdCgwLjAsIDApKTsgLy9zb2xvIGRhdHVtXFxuICAgICAgcHJvamVjdGVkTm9ybWFsLnggKj0gYXNwZWN0O1xcblxcbiAgICAgIGZsb2F0IG91dGxpbmVXaWR0aCA9IGdldF9vdXRsaW5lV2lkdGgobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIHZlcnRleC54eSArPSAwLjAxICogb3V0bGluZVdpZHRoICogb3V0bGluZVRleCAqIHByb2plY3RlZE5vcm1hbCAqIGNsYW1wKDEuMCAtIGFicyh2X25vcm1hbF9pblZpZXcueiksIDAuMCwgMS4wKTsgLy8gaWdub3JlIG9mZnNldCB3aGVuIG5vcm1hbCB0b3dhcmQgY2FtZXJhXFxuXFxuICAgICAgZ2xfUG9zaXRpb24gPSB2ZXJ0ZXg7XFxuICAgICNlbHNlXFxuICAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHZfcG9zaXRpb25faW5Xb3JsZDtcXG4gICAgI2VuZGlmXFxuICAjZWxzZVxcbiAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdl9wb3NpdGlvbl9pbldvcmxkO1xcbiAgI2VuZGlmXFxuXFxuICAjaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gICAgdl90YW5nZW50X2luV29ybGQgPSBub3JtYWxNYXRyaXggKiBhX3RhbmdlbnQueHl6O1xcbiAgICB2X2Jpbm9ybWFsX2luV29ybGQgPSBjcm9zcyh2X25vcm1hbF9pbldvcmxkLCB2X3RhbmdlbnRfaW5Xb3JsZCkgKiBhX3RhbmdlbnQudztcXG4gICNlbmRpZlxcblxcbiAgdl90ZXhjb29yZF8wID0gYV90ZXhjb29yZF8wO1xcbiAgdl9iYXJ5Q2VudHJpY0Nvb3JkID0gYV9iYXJ5Q2VudHJpY0Nvb3JkLnh5ejtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX1NUQU5EQVJEX0RFUklWQVRJVkVTXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfRFJBV19CVUZGRVJTXFxuI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbmluIHZlYzMgdl9iYXJ5Q2VudHJpY0Nvb3JkO1xcbmluIHZlYzMgdl9ub3JtYWxfaW5WaWV3O1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuZmxvYXQgZWRnZV9yYXRpbyh2ZWMzIGJhcnkzLCBmbG9hdCB3aXJlZnJhbWVXaWR0aElubmVyLCBmbG9hdCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUpIHtcXG4gIHZlYzMgZCA9IGZ3aWR0aChiYXJ5Myk7XFxuICB2ZWMzIHggPSBiYXJ5Myt2ZWMzKDEuMCAtIHdpcmVmcmFtZVdpZHRoSW5uZXIpKmQ7XFxuICB2ZWMzIGEzID0gc21vb3Roc3RlcCh2ZWMzKDAuMCksIGQsIHgpO1xcbiAgZmxvYXQgZmFjdG9yID0gbWluKG1pbihhMy54LCBhMy55KSwgYTMueik7XFxuXFxuICByZXR1cm4gY2xhbXAoKDEuMCAtIGZhY3RvciksIDAuMCwgMS4wKTtcXG59XFxuXFxudm9pZCBtYWluICgpXFxue1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIHZlYzMgbm9ybWFsX2luVmlldyA9IG5vcm1hbGl6ZSh2X25vcm1hbF9pblZpZXcpO1xcbiAgbm9ybWFsX2luVmlldy55ICo9IC0xLjA7XFxuICB2ZWMyIG5vcm1hbFVWQ29yZGluYXRlID0gbm9ybWFsX2luVmlldy54eSAqIDAuNSArIDAuNTtcXG4gIHZlYzQgbWF0Q2FwQ29sb3IgPSB0ZXh0dXJlKHVfbWF0Q2FwVGV4dHVyZSwgbm9ybWFsVVZDb3JkaW5hdGUpO1xcbiAgcnQwID0gbWF0Q2FwQ29sb3I7XFxuXFxuICAvLyBXaXJlZnJhbWVcXG4gIGZsb2F0IHRocmVzaG9sZCA9IDAuMDAxO1xcbiAgdmVjMyB3aXJlZnJhbWUgPSBnZXRfd2lyZWZyYW1lKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoSW5uZXIgPSB3aXJlZnJhbWUuejtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZSA9IDEuMDtcXG4gIGlmICh3aXJlZnJhbWUueCA+IDAuNSAmJiB3aXJlZnJhbWUueSA8IDAuNSkge1xcbiAgICBydDAuYSA9IDAuMDtcXG4gIH1cXG4gIHZlYzQgd2lyZWZyYW1lUmVzdWx0ID0gcnQwO1xcbiAgdmVjNCB3aXJlZnJhbWVDb2xvciA9IHZlYzQoMC4yLCAwLjc1LCAwLjAsIDEuMCk7XFxuICBmbG9hdCBlZGdlUmF0aW8gPSBlZGdlX3JhdGlvKHZfYmFyeUNlbnRyaWNDb29yZCwgd2lyZWZyYW1lV2lkdGhJbm5lciwgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlKTtcXG4gIGZsb2F0IGVkZ2VSYXRpb01vZGlmaWVkID0gbWl4KHN0ZXAodGhyZXNob2xkLCBlZGdlUmF0aW8pLCBjbGFtcChlZGdlUmF0aW8qNC4wLCAwLjAsIDEuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvNC4wKTtcXG4gIC8vIGlmIHIwLmEgaXMgMC4wLCBpdCBpcyB3aXJlZnJhbWUgbm90IG9uIHNoYWRlZFxcbiAgd2lyZWZyYW1lUmVzdWx0LnJnYiA9IHdpcmVmcmFtZUNvbG9yLnJnYiAqIGVkZ2VSYXRpb01vZGlmaWVkICsgcnQwLnJnYiAqICgxLjAgLSBlZGdlUmF0aW9Nb2RpZmllZCk7XFxuICB3aXJlZnJhbWVSZXN1bHQuYSA9IG1heChydDAuYSwgd2lyZWZyYW1lQ29sb3IuYSAqIG1peChlZGdlUmF0aW9Nb2RpZmllZCwgcG93KGVkZ2VSYXRpb01vZGlmaWVkLCAxMDAuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvMS4wKSk7XFxuXFxuICBpZiAod2lyZWZyYW1lLnggPiAwLjUpIHtcXG4gICAgcnQwID0gd2lyZWZyYW1lUmVzdWx0O1xcbiAgICBpZiAod2lyZWZyYW1lLnkgPCAwLjUgJiYgcnQwLmEgPT0gMC4wKSB7XFxuICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgfVxcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzMgYV9iYXJ5Q2VudHJpY0Nvb3JkO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMzIGFfbm9ybWFsO1xcbmluIHZlYzQgYV9qb2ludDtcXG5pbiB2ZWM0IGFfd2VpZ2h0O1xcblxcbm91dCB2ZWMzIHZfYmFyeUNlbnRyaWNDb29yZDtcXG5vdXQgdmVjMyB2X25vcm1hbF9pblZpZXc7XFxub3V0IHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5vdXQgdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxubWF0MyB0b05vcm1hbE1hdHJpeChtYXQ0IG0pIHtcXG4gIGZsb2F0IGEwMCA9IG1bMF1bMF0sIGEwMSA9IG1bMF1bMV0sIGEwMiA9IG1bMF1bMl0sIGEwMyA9IG1bMF1bM10sXFxuICBhMTAgPSBtWzFdWzBdLCBhMTEgPSBtWzFdWzFdLCBhMTIgPSBtWzFdWzJdLCBhMTMgPSBtWzFdWzNdLFxcbiAgYTIwID0gbVsyXVswXSwgYTIxID0gbVsyXVsxXSwgYTIyID0gbVsyXVsyXSwgYTIzID0gbVsyXVszXSxcXG4gIGEzMCA9IG1bM11bMF0sIGEzMSA9IG1bM11bMV0sIGEzMiA9IG1bM11bMl0sIGEzMyA9IG1bM11bM107XFxuXFxuICBmbG9hdCBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXFxuICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXFxuICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXFxuICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXFxuICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXFxuICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXFxuICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXFxuICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXFxuICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXFxuICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXFxuICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXFxuICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XFxuXFxuICBmbG9hdCBkZXRlcm1pbmFudFZhbCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcXG5cXG4gIHJldHVybiBtYXQzKFxcbiAgICBhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDksIGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNywgYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2LFxcbiAgICBhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDksIGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNywgYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2LFxcbiAgICBhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMsIGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSwgYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAvIGRldGVybWluYW50VmFsO1xcbn1cXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5cXG5oaWdocCBtYXQ0IGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZSggaGlnaHAgdmVjNCBxdWF0ZXJuaW9uLCBoaWdocCB2ZWMzIHRyYW5zbGF0aW9uLCBoaWdocCB2ZWMzIHNjYWxlICkge1xcbiAgaGlnaHAgdmVjNCBxID0gcXVhdGVybmlvbjtcXG4gIGhpZ2hwIHZlYzMgdCA9IHRyYW5zbGF0aW9uO1xcblxcbiAgaGlnaHAgZmxvYXQgc3ggPSBxLnggKiBxLng7XFxuICBoaWdocCBmbG9hdCBzeSA9IHEueSAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHN6ID0gcS56ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ggPSBxLnkgKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeSA9IHEueCAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN6ID0gcS54ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ggPSBxLncgKiBxLng7XFxuICBoaWdocCBmbG9hdCB3eSA9IHEudyAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHd6ID0gcS53ICogcS56O1xcblxcbiAgaGlnaHAgbWF0NCBtYXQgPSBtYXQ0KFxcbiAgICAxLjAgLSAyLjAgKiAoc3kgKyBzeiksIDIuMCAqIChjeiArIHd6KSwgMi4wICogKGN5IC0gd3kpLCAwLjAsXFxuICAgIDIuMCAqIChjeiAtIHd6KSwgMS4wIC0gMi4wICogKHN4ICsgc3opLCAyLjAgKiAoY3ggKyB3eCksIDAuMCxcXG4gICAgMi4wICogKGN5ICsgd3kpLCAyLjAgKiAoY3ggLSB3eCksIDEuMCAtIDIuMCAqIChzeCArIHN5KSwgMC4wLFxcbiAgICB0LngsIHQueSwgdC56LCAxLjBcXG4gICk7XFxuXFxuICBoaWdocCBtYXQ0IHVuaWZvcm1TY2FsZU1hdCA9IG1hdDQoXFxuICAgIHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgc2NhbGUueSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCBzY2FsZS56LCAwLjAsXFxuICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxcbiAgKTtcXG5cXG4gIHJldHVybiBtYXQqdW5pZm9ybVNjYWxlTWF0O1xcbn1cXG5cXG5oaWdocCB2ZWM0IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoaGlnaHAgdmVjMiB2ZWNfeHksIGhpZ2hwIGZsb2F0IGNyaXRlcmlhKXtcXG5cXG4gIGhpZ2hwIGZsb2F0IHI7XFxuICBoaWdocCBmbG9hdCBnO1xcbiAgaGlnaHAgZmxvYXQgYjtcXG4gIGhpZ2hwIGZsb2F0IGE7XFxuXFxuICBoaWdocCBmbG9hdCBpeCA9IGZsb29yKHZlY194eS54ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjF4ID0gaXggLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYxeSA9IGl4IC0gZmxvb3IodjF4KSAqIGNyaXRlcmlhO1xcblxcbiAgciA9ICggdjF4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGcgPSAoIHYxeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICBoaWdocCBmbG9hdCBpeSA9IGZsb29yKCB2ZWNfeHkueSAqIGNyaXRlcmlhKTtcXG4gIGhpZ2hwIGZsb2F0IHYyeCA9IGl5IC8gY3JpdGVyaWE7XFxuICBoaWdocCBmbG9hdCB2MnkgPSBpeSAtIGZsb29yKHYyeCkgKiBjcml0ZXJpYTtcXG5cXG4gIGIgPSAoIHYyeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBhID0gKCB2MnkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgciAtPSAxLjAvY3JpdGVyaWE7XFxuICBnIC09IDEuMC9jcml0ZXJpYTtcXG4gIGIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYSAtPSAxLjAvY3JpdGVyaWE7XFxuXFxuICByID0gcioyLjAtMS4wO1xcbiAgZyA9IGcqMi4wLTEuMDtcXG4gIGIgPSBiKjIuMC0xLjA7XFxuICBhID0gYSoyLjAtMS4wO1xcblxcbiAgcmV0dXJuIHZlYzQociwgZywgYiwgYSk7XFxufVxcblxcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCkge1xcblxcbiNpZmRlZiBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMilcXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG5cXG4gIHZlYzQgdHFfeCA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBzcV94ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV94LncsIHNxX3gudyksIGNyaXRlcmlhLngpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV94Lnh5eiwgc3FfeC54eXopO1xcblxcbiAgdmVjNCB0cV95ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICB2ZWM0IHNxX3kgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV95LncsIHNxX3kudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3kueHl6LCBzcV95Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgc3FfeiA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3oudywgc3Ffei53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfei54eXosIHNxX3oueHl6KTtcXG5cXG4gIHZlYzQgdHFfdyA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgdmVjNCBzcV93ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfdy53LCBzcV93LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV93Lnh5eiwgc3Ffdy54eXopO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRClcXG4gIHZlYzQgdHNfeCA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICB2ZWM0IHRzX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMSlcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NYID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NZID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NaID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NXID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG5cXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRJbmZvID0gZ2V0X2JvbmVDb21wcmVzc2VkSW5mbygwLjAsIDApO1xcblxcbiAgdmVjNCB0c194ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1guencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnh5LCBjcml0ZXJpYS54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICB2ZWM0IHRzX3kgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS54eSwgY3JpdGVyaWEueCksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1ouencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1oueHksIGNyaXRlcmlhLngpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnh5LCBjcml0ZXJpYS54KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuI2VuZGlmXFxuICByZXR1cm4gc2tpbk1hdDtcXG59XFxuI2VuZGlmXFxuXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuYm9vbCBza2lubmluZyhcXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuICApXFxue1xcbiAgbWF0NCBza2luTWF0ID0gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCk7XFxuICBvdXRQb3NpdGlvbl9pbldvcmxkID0gc2tpbk1hdCAqIHZlYzQoaW5Qb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgb3V0Tm9ybWFsTWF0cml4ID0gdG9Ob3JtYWxNYXRyaXgoc2tpbk1hdCk7XFxuICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShvdXROb3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG5cXG4gIHJldHVybiB0cnVlO1xcbn1cXG4jZW5kaWZcXG5cXG5ib29sIHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQ0IHdvcmxkTWF0cml4LFxcbiAgaW4gbWF0NCB2aWV3TWF0cml4LFxcbiAgaW4gYm9vbCBpc0JpbGxib2FyZCxcXG4gIGluIG1hdDMgaW5Ob3JtYWxNYXRyaXgsXFxuICBvdXQgbWF0MyBvdXROb3JtYWxNYXRyaXgsXFxuICBpbiB2ZWMzIGluUG9zaXRpb25faW5Mb2NhbCxcXG4gIG91dCB2ZWM0IG91dFBvc2l0aW9uX2luV29ybGQsXFxuICBpbiB2ZWMzIGluTm9ybWFsX2luTG9jYWwsXFxuICBvdXQgdmVjMyBvdXROb3JtYWxfaW5Xb3JsZFxcbikge1xcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuXFxuICB2ZWMzIHBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICBpZiAodV9tb3JwaFRhcmdldE51bWJlciA9PSAwKSB7XFxuI2VuZGlmXFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBpblBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICB9IGVsc2Uge1xcbiAgICBmbG9hdCB2ZXJ0ZXhJZHggPSBhX2JhcnlDZW50cmljQ29vcmQudztcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGdldF9wb3NpdGlvbih2ZXJ0ZXhJZHgsIGluUG9zaXRpb25faW5Mb2NhbCk7XFxuICB9XFxuI2VuZGlmXFxuXFxuICBtYXQ0IHdvcmxkTWF0cml4SW5uZXIgPSB3b3JsZE1hdHJpeDtcXG4gIGlmIChpc0JpbGxib2FyZCkge1xcbiAgICBtYXQ0IGludmVyc2VWaWV3TWF0cml4ID0gaW52ZXJzZSh2aWV3TWF0cml4KTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMF0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVswXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMV0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsxXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMl0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsyXTtcXG4gICAgd29ybGRNYXRyaXhJbm5lciA9IGludmVyc2VWaWV3TWF0cml4ICogd29ybGRNYXRyaXg7XFxuICB9XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICBpZiAoc2tlbGV0YWxDb21wb25lbnRTSUQgPj0gMC4wKSB7XFxuICAgIGlzU2tpbm5pbmcgPSBza2lubmluZyhza2VsZXRhbENvbXBvbmVudFNJRCwgaW5Ob3JtYWxNYXRyaXgsIG91dE5vcm1hbE1hdHJpeCwgcG9zaXRpb25faW5Mb2NhbCwgb3V0UG9zaXRpb25faW5Xb3JsZCwgaW5Ob3JtYWxfaW5Mb2NhbCwgb3V0Tm9ybWFsX2luV29ybGQpO1xcbiAgfSBlbHNlIHtcXG4jZW5kaWZcXG4gICAgb3V0Tm9ybWFsTWF0cml4ID0gaW5Ob3JtYWxNYXRyaXg7XFxuICAgIG91dFBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeElubmVyICogdmVjNChwb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbk5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgcmV0dXJuIGlzU2tpbm5pbmc7XFxufVxcblxcblxcbnZvaWQgbWFpbigpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQzIG5vcm1hbE1hdHJpeCA9IGdldF9ub3JtYWxNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcblxcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuICBpc1NraW5uaW5nID0gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgZmFsc2UsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBhX3Bvc2l0aW9uLFxcbiAgICB2X3Bvc2l0aW9uX2luV29ybGQsXFxuICAgIGFfbm9ybWFsLFxcbiAgICB2X25vcm1hbF9pbldvcmxkXFxuICApO1xcblxcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuXFxuICB2X25vcm1hbF9pblZpZXcgPSB2ZWMzKHZpZXdNYXRyaXggKiB2ZWM0KG5vcm1hbE1hdHJpeCAqIGFfbm9ybWFsLCAwLjApKTtcXG5cXG4vLyAjaWZkZWYgUk5fSVNfUE9JTlRTUFJJVEVcXG5cXG52ZWM0IHBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG52ZWMzIHZpZXdQb3NpdGlvbiA9IGdldF92aWV3UG9zaXRpb24oY2FtZXJhU0lELCAwKTtcXG5mbG9hdCBkaXN0YW5jZUZyb21DYW1lcmEgPSBsZW5ndGgocG9zaXRpb25faW5Xb3JsZC54eXogLSB2aWV3UG9zaXRpb24pO1xcbnZlYzMgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uID0gZ2V0X3BvaW50RGlzdGFuY2VBdHRlbnVhdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciA9IHNxcnQoMS4wLyhwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueCArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi55ICogZGlzdGFuY2VGcm9tQ2FtZXJhICsgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnogKiBkaXN0YW5jZUZyb21DYW1lcmEgKiBkaXN0YW5jZUZyb21DYW1lcmEpKTtcXG5mbG9hdCBtYXhQb2ludFNpemUgPSBnZXRfcG9pbnRTaXplKG1hdGVyaWFsU0lELCAwKTtcXG5nbF9Qb2ludFNpemUgPSBjbGFtcChkaXN0YW5jZUF0dGVudWF0aW9uRmFjdG9yICogbWF4UG9pbnRTaXplLCAwLjAsIG1heFBvaW50U2l6ZSk7XFxuXFxuLy8gI2VuZGlmXFxuXFxuXFxuICB2X2JhcnlDZW50cmljQ29vcmQgPSBhX2JhcnlDZW50cmljQ29vcmQ7XFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbmluIHZlYzIgdl90ZXhjb29yZF8wO1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfYmFzZUNvbG9yVGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSgwLHdoaXRlKVxcbnVuaWZvcm0gaW50IHVfY3ViZU1hcEZhY2VJZDsgLy8gaW5pdGlhbFZhbHVlPTBcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxudmVjMiBkaXJUb1Bhbm9yYW1hVVYodmVjMyBkaXIpXFxue1xcblxcdHJldHVybiB2ZWMyKFxcblxcdFxcdDAuNWYgKyAwLjVmICogYXRhbihkaXIueiwgZGlyLngpIC8gUEksXFxuXFx0XFx0MS5mIC0gYWNvcyhkaXIueSkgLyBQSSk7XFxufVxcblxcbnZlYzMgdXZUb0RpcmVjdGlvbihpbnQgZmFjZUlkLCB2ZWMyIHV2KVxcbntcXG5cXHRpZihmYWNlSWQgPT0gMClcXG5cXHRcXHRyZXR1cm4gdmVjMygxLmYsIHV2LnksIC11di54KTtcXG5cXHRlbHNlIGlmKGZhY2VJZCA9PSAxKVxcblxcdFxcdHJldHVybiB2ZWMzKC0xLmYsIHV2LnksIHV2LngpO1xcblxcdGVsc2UgaWYoZmFjZUlkID09IDIpXFxuXFx0XFx0cmV0dXJuIHZlYzMoK3V2LngsIC0xLmYsICt1di55KTtcXG5cXHRlbHNlIGlmKGZhY2VJZCA9PSAzKVxcblxcdFxcdHJldHVybiB2ZWMzKCt1di54LCAxLmYsIC11di55KTtcXG5cXHRlbHNlIGlmKGZhY2VJZCA9PSA0KVxcblxcdFxcdHJldHVybiB2ZWMzKCt1di54LCB1di55LCAxLmYpO1xcblxcdGVsc2VcXG4gICAgcmV0dXJuIHZlYzMoLXV2LngsICt1di55LCAtMS5mKTtcXG59XFxuXFxuLy8gbGVhcm5lZCBhIGxvdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtVmlld2VyXFxudm9pZCBtYWluICgpXFxue1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG5cXHR2ZWMyIHV2ID0gdl90ZXhjb29yZF8wICogMi4wIC0gMS4wO1xcblxcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKHV2VG9EaXJlY3Rpb24oZ2V0X2N1YmVNYXBGYWNlSWQobWF0ZXJpYWxTSUQsIDApLCB1dikpO1xcblxcdHZlYzIgcGFub3JhbWFVdiA9IGRpclRvUGFub3JhbWFVVihkaXJlY3Rpb24pO1xcblxcdHJ0MCA9IHZlYzQodGV4dHVyZSh1X2Jhc2VDb2xvclRleHR1cmUsIHBhbm9yYW1hVXYpLnJnYiwgMS4wKTtcXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMyIGFfdGV4Y29vcmRfMDtcXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbnZvaWQgbWFpbigpXFxue1xcbiAgXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcbmZsb2F0IHggPSBmbG9hdCgoZ2xfVmVydGV4SUQgJiAxKSA8PCAyKTtcXG5mbG9hdCB5ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMikgPDwgMSk7XFxudl90ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbnZfdGV4Y29vcmRfMC55ID0geSAqIDAuNTtcXG5nbF9Qb3NpdGlvbiA9IHZlYzQoeCAtIDEuMCwgeSAtIDEuMCwgMCwgMSk7XFxuXFxuICBcXG59XFxuXFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX1NUQU5EQVJEX0RFUklWQVRJVkVTXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfRFJBV19CVUZGRVJTXFxuI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuaW4gdmVjMyB2X2NvbG9yO1xcbmluIHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5pbiB2ZWM0IHZfcG9zaXRpb25faW5Xb3JsZDtcXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMTtcXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMjtcXG5pbiB2ZWMzIHZfYmFyeUNlbnRyaWNDb29yZDtcXG5pbiBmbG9hdCB2X2luc3RhbmNlSW5mbztcXG5pbiBmbG9hdCB2X2Rpc3BsYXlJZHg7XFxuXFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBpbiB2ZWMzIHZfdGFuZ2VudF9pbldvcmxkO1xcbiAgaW4gdmVjMyB2X2Jpbm9ybWFsX2luV29ybGQ7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9TSEFET1dfTUFQUElOR1xcbmluIHZlYzQgdl9zaGFkb3dDb29yZDtcXG4jZW5kaWZcXG5cXG51bmlmb3JtIHZlYzQgdV9iYXNlQ29sb3JGYWN0b3I7IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDEsMSlcXG51bmlmb3JtIHNhbXBsZXIyRCB1X2Jhc2VDb2xvclRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMCx3aGl0ZSlcXG51bmlmb3JtIHZlYzIgdV9tZXRhbGxpY1JvdWdobmVzc0ZhY3RvcjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEpXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9tZXRhbGxpY1JvdWdobmVzc1RleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMSx3aGl0ZSlcXG51bmlmb3JtIHNhbXBsZXIyRCB1X29jY2x1c2lvblRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMyx3aGl0ZSlcXG51bmlmb3JtIHZlYzMgdV9lbWlzc2l2ZUZhY3RvcjsgLy8gaW5pdGlhbFZhbHVlPSgwLDAsMClcXG51bmlmb3JtIHNhbXBsZXIyRCB1X2VtaXNzaXZlVGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSg0LHdoaXRlKVxcbnVuaWZvcm0gZmxvYXQgdV9lbWlzc2l2ZVN0cmVuZ3RoOyAvLyBpbml0aWFsVmFsdWU9MVxcbnVuaWZvcm0gdmVjMyB1X3dpcmVmcmFtZTsgLy8gaW5pdGlhbFZhbHVlPSgwLDAsMSlcXG51bmlmb3JtIGJvb2wgdV9pc091dHB1dEhEUjsgLy8gaW5pdGlhbFZhbHVlPTBcXG51bmlmb3JtIGJvb2wgdV9tYWtlT3V0cHV0U3JnYjsgLy8gaW5pdGlhbFZhbHVlPTFcXG51bmlmb3JtIHZlYzQgdV9pYmxQYXJhbWV0ZXI7IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDEsMSksIGlzSW50ZXJuYWxTZXR0aW5nPXRydWVcXG51bmlmb3JtIGl2ZWMyIHVfaGRyaUZvcm1hdDsgLy8gaW5pdGlhbFZhbHVlPSgwLDApLCBpc0ludGVybmFsU2V0dGluZz10cnVlXFxudW5pZm9ybSBzYW1wbGVyQ3ViZSB1X2RpZmZ1c2VFbnZUZXh0dXJlOyAvLyBpbml0aWFsVmFsdWU9KDUsd2hpdGUpLCBpc0ludGVybmFsU2V0dGluZz10cnVlXFxudW5pZm9ybSBzYW1wbGVyQ3ViZSB1X3NwZWN1bGFyRW52VGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSg2LHdoaXRlKSwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZVxcbnVuaWZvcm0gdmVjNCB1X2Jhc2VDb2xvclRleHR1cmVUcmFuc2Zvcm07IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDAsMClcXG51bmlmb3JtIGZsb2F0IHVfYmFzZUNvbG9yVGV4dHVyZVJvdGF0aW9uOyAvLyBpbml0aWFsVmFsdWU9MFxcbnVuaWZvcm0gdmVjNCB1X21ldGFsbGljUm91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybTsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbnVuaWZvcm0gZmxvYXQgdV9tZXRhbGxpY1JvdWdobmVzc1RleHR1cmVSb3RhdGlvbjsgLy8gaW5pdGlhbFZhbHVlPTBcXG51bmlmb3JtIGludCB1X2Jhc2VDb2xvclRleGNvb3JkSW5kZXg7IC8vIGluaXRpYWxWYWx1ZT0wXFxudW5pZm9ybSBpbnQgdV9tZXRhbGxpY1JvdWdobmVzc1RleGNvb3JkSW5kZXg7IC8vIGluaXRpYWxWYWx1ZT0wXFxudW5pZm9ybSBpbnQgdV9vY2NsdXNpb25UZXhjb29yZEluZGV4OyAvLyBpbml0aWFsVmFsdWU9MFxcbnVuaWZvcm0gdmVjNCB1X29jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm07IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDAsMClcXG51bmlmb3JtIGZsb2F0IHVfb2NjbHVzaW9uVGV4dHVyZVJvdGF0aW9uOyAvLyBpbml0aWFsVmFsdWU9MFxcbnVuaWZvcm0gaW50IHVfZW1pc3NpdmVUZXhjb29yZEluZGV4OyAvLyBpbml0aWFsVmFsdWU9MFxcbnVuaWZvcm0gdmVjNCB1X2VtaXNzaXZlVGV4dHVyZVRyYW5zZm9ybTsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbnVuaWZvcm0gZmxvYXQgdV9lbWlzc2l2ZVRleHR1cmVSb3RhdGlvbjsgLy8gaW5pdGlhbFZhbHVlPTBcXG51bmlmb3JtIGZsb2F0IHVfb2NjbHVzaW9uU3RyZW5ndGg7IC8vIGluaXRpYWxWYWx1ZT0xXFxudW5pZm9ybSBib29sIHVfaW52ZXJzZUVudmlyb25tZW50OyAvLyBpbml0aWFsVmFsdWU9dHJ1ZVxcbnVuaWZvcm0gZmxvYXQgdV9pb3I7IC8vIGluaXRpYWxWYWx1ZT0xLjVcXG5cXG4jaWZkZWYgUk5fVVNFX05PUk1BTF9URVhUVVJFXFxuICB1bmlmb3JtIHNhbXBsZXIyRCB1X25vcm1hbFRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMixibGFjaylcXG4gIHVuaWZvcm0gdmVjNCB1X25vcm1hbFRleHR1cmVUcmFuc2Zvcm07IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDAsMClcXG4gIHVuaWZvcm0gZmxvYXQgdV9ub3JtYWxUZXh0dXJlUm90YXRpb247IC8vIGluaXRpYWxWYWx1ZT0oMClcXG4gIHVuaWZvcm0gaW50IHVfbm9ybWFsVGV4Y29vcmRJbmRleDsgLy8gaW5pdGlhbFZhbHVlPSgwKVxcbiAgdW5pZm9ybSBmbG9hdCB1X25vcm1hbFNjYWxlOyAvLyBpbml0aWFsVmFsdWU9KDEpXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9DTEVBUkNPQVRcXG4gIHVuaWZvcm0gZmxvYXQgdV9jbGVhckNvYXRGYWN0b3I7IC8vIGluaXRpYWxWYWx1ZT0wXFxuICB1bmlmb3JtIGZsb2F0IHVfY2xlYXJDb2F0Um91Z2huZXNzRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9MFxcbiAgdW5pZm9ybSB2ZWM0IHVfY2xlYXJDb2F0VGV4dHVyZVRyYW5zZm9ybTsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbiAgdW5pZm9ybSBmbG9hdCB1X2NsZWFyQ29hdFRleHR1cmVSb3RhdGlvbjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4gIHVuaWZvcm0gdmVjNCB1X2NsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm07IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDAsMClcXG4gIHVuaWZvcm0gZmxvYXQgdV9jbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlUm90YXRpb247IC8vIGluaXRpYWxWYWx1ZT0wXFxuICB1bmlmb3JtIHZlYzQgdV9jbGVhckNvYXROb3JtYWxUZXh0dXJlVHJhbnNmb3JtOyAvLyBpbml0aWFsVmFsdWU9KDEsMSwwLDApXFxuICB1bmlmb3JtIGZsb2F0IHVfY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVJvdGF0aW9uOyAvLyBpbml0aWFsVmFsdWU9MFxcbiAgdW5pZm9ybSBpbnQgdV9jbGVhckNvYXRUZXhjb29yZEluZGV4OyAvLyBpbml0aWFsVmFsdWU9KDApXFxuICB1bmlmb3JtIGludCB1X2NsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkSW5kZXg7IC8vIGluaXRpYWxWYWx1ZT0oMClcXG4gIHVuaWZvcm0gaW50IHVfY2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmRJbmRleDsgLy8gaW5pdGlhbFZhbHVlPSgwKVxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuICB1bmlmb3JtIGZsb2F0IHVfdHJhbnNtaXNzaW9uRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9KDApXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9WT0xVTUVcXG4gIHVuaWZvcm0gZmxvYXQgdV90aGlja25lc3NGYWN0b3I7IC8vIGluaXRpYWxWYWx1ZT0oMClcXG4gIHVuaWZvcm0gZmxvYXQgdV9hdHRlbnVhdGlvbkRpc3RhbmNlOyAvLyBpbml0aWFsVmFsdWU9KDAuMDAwMDAxKVxcbiAgdW5pZm9ybSB2ZWMzIHVfYXR0ZW51YXRpb25Db2xvcjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSlcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX1NIRUVOXFxuICB1bmlmb3JtIHZlYzMgdV9zaGVlbkNvbG9yRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9KDAsMCwwKVxcbiAgdW5pZm9ybSBmbG9hdCB1X3NoZWVuUm91Z2huZXNzRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9KDApXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9TUEVDVUxBUlxcbiAgdW5pZm9ybSBmbG9hdCB1X3NwZWN1bGFyRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9MS4wXFxuICB1bmlmb3JtIHZlYzMgdV9zcGVjdWxhckNvbG9yRmFjdG9yOyAvLyBpbml0aWFsVmFsdWU9KDEsMSwxKVxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfSVJJREVTQ0VOQ0VcXG4gIHVuaWZvcm0gZmxvYXQgdV9pcmlkZXNjZW5jZUZhY3RvcjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4gIHVuaWZvcm0gZmxvYXQgdV9pcmlkZXNjZW5jZUlvcjsgLy8gaW5pdGlhbFZhbHVlPTEuM1xcbiAgdW5pZm9ybSBmbG9hdCB1X2lyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsgLy8gaW5pdGlhbFZhbHVlPTEwMFxcbiAgdW5pZm9ybSBmbG9hdCB1X2lyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsgLy8gaW5pdGlhbFZhbHVlPTQwMFxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfQU5JU09UUk9QWVxcbiAgdW5pZm9ybSBmbG9hdCB1X2FuaXNvdHJvcHlTdHJlbmd0aDsgLy8gaW5pdGlhbFZhbHVlPTBcXG4gIHVuaWZvcm0gdmVjMiB1X2FuaXNvdHJvcHlSb3RhdGlvbjsgLy8gaW5pdGlhbFZhbHVlPSgxLDApXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBmbG9hdCB1X2FscGhhQ3V0b2ZmOyAvLyBpbml0aWFsVmFsdWU9KDAuMDEpXFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbnN0cnVjdCBMaWdodCB7XFxuICBpbnQgdHlwZTsgLy8gMCA9IGRpcmVjdGlvbmFsLCAxID0gcG9pbnQsIDIgPSBzcG90XFxuICB2ZWMzIHBvc2l0aW9uO1xcbiAgdmVjMyBpbnRlbnNpdHk7XFxuICB2ZWMzIGF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuICB2ZWMzIGRpcmVjdGlvbk9mTGlnaHRPYmplY3Q7XFxuICB2ZWMzIGRpcmVjdGlvbjsgLy8gZGlyZWN0aW9uIG9mIGxpZ2h0IHZlY3RvciwgZXF1YWwgdG8gbm9ybWFsaXplKGxpZ2h0LnBvaW50VG9MaWdodClcXG4gIHZlYzMgcG9pbnRUb0xpZ2h0OyAvLyBub3Qgbm9ybWFsaXplZFxcbiAgZmxvYXQgc3BvdEFuZ2xlU2NhbGU7XFxuICBmbG9hdCBzcG90QW5nbGVPZmZzZXQ7XFxuICBmbG9hdCBlZmZlY3RpdmVSYW5nZTtcXG59O1xcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9saWdodHNfcHVuY3R1YWwvUkVBRE1FLm1kI3JhbmdlLXByb3BlcnR5XFxuZmxvYXQgZ2V0UmFuZ2VBdHRlbnVhdGlvbihMaWdodCBsaWdodClcXG57XFxuICBmbG9hdCBkaXN0YW5jZSA9IGxlbmd0aChsaWdodC5wb2ludFRvTGlnaHQpO1xcbiAgLy8gbWVhbnMgbm8gcmFuZ2UgbGltaXRcXG4gIGlmIChsaWdodC5lZmZlY3RpdmVSYW5nZSA8PSAwLjApXFxuICB7XFxuICAgIHJldHVybiAxLjAgLyBwb3coZGlzdGFuY2UsIDIuMCk7XFxuICB9XFxuICByZXR1cm4gbWF4KG1pbigxLjAgLSBwb3coZGlzdGFuY2UgLyBsaWdodC5lZmZlY3RpdmVSYW5nZSwgNC4wKSwgMS4wKSwgMC4wKSAvIHBvdyhkaXN0YW5jZSwgMi4wKTtcXG59XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL2Jsb2IvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2xpZ2h0c19wdW5jdHVhbC9SRUFETUUubWQjaW5uZXItYW5kLW91dGVyLWNvbmUtYW5nbGVzXFxuZmxvYXQgZ2V0U3BvdEF0dGVudWF0aW9uKExpZ2h0IGxpZ2h0KVxcbntcXG5cXG4gIGZsb2F0IGNkID0gZG90KGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QsIGxpZ2h0LmRpcmVjdGlvbik7XFxuICBmbG9hdCBhbmd1bGFyQXR0ZW51YXRpb24gPSBjbGFtcChjZCAqIGxpZ2h0LnNwb3RBbmdsZVNjYWxlICsgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0LCAwLjAsIDEuMCk7XFxuICByZXR1cm4gYW5ndWxhckF0dGVudWF0aW9uO1xcbn1cXG5cXG52b2lkIGdldExpZ2h0QXR0ZW51YXRlZChMaWdodCBsaWdodCkge1xcbiAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTtcXG4gIC8vIGlmIChsaWdodC50eXBlID09IDApIHsgLy8gRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgLy8gRGlyZWN0aW9uYWwgTGlnaHQgZG9uJ3QgYXR0ZW51YXRlIGdlb21ldGljYWxseVxcbiAgLy8gfVxcblxcbiAgLy8gUG9pbnQgTGlnaHRcXG4gIGlmIChsaWdodC50eXBlID09IDEpXFxuICB7XFxuICAgIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0UmFuZ2VBdHRlbnVhdGlvbihsaWdodCk7XFxuICB9XFxuICAvLyBTcG90IGxpZ2h0XFxuICBpZiAobGlnaHQudHlwZSA9PSAyKVxcbiAge1xcbiAgICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ICo9IGdldFNwb3RBdHRlbnVhdGlvbihsaWdodCk7XFxuICB9XFxufVxcblxcbkxpZ2h0IGdldExpZ2h0KGludCBsaWdodElkeCwgdmVjMyB2X3Bvc2l0aW9uX2luV29ybGQpIHtcXG4gIHZlYzMgbGlnaHRQb3NpdGlvbiA9IGdldF9saWdodFBvc2l0aW9uKDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjMyBkaXJlY3Rpb25fYW5kX3dfb2ZfTGlnaHRPYmplY3QgPSBnZXRfbGlnaHREaXJlY3Rpb24oMC4wLCBsaWdodElkeCk7XFxuICB2ZWMzIGxpZ2h0SW50ZW5zaXR5ID0gZ2V0X2xpZ2h0SW50ZW5zaXR5KDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjNCBsaWdodFByb3BlcnR5ID0gZ2V0X2xpZ2h0UHJvcGVydHkoMC4wLCBsaWdodElkeCk7XFxuICBMaWdodCBsaWdodDtcXG4gIGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QgPSBkaXJlY3Rpb25fYW5kX3dfb2ZfTGlnaHRPYmplY3Q7XFxuICBmbG9hdCBsaWdodFR5cGUgPSBsaWdodFByb3BlcnR5Lng7XFxuICBsaWdodC5lZmZlY3RpdmVSYW5nZSA9IGxpZ2h0UHJvcGVydHkueTtcXG4gIGxpZ2h0LnNwb3RBbmdsZVNjYWxlID0gbGlnaHRQcm9wZXJ0eS56O1xcbiAgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0ID0gbGlnaHRQcm9wZXJ0eS53O1xcblxcbiAgbGlnaHQuaW50ZW5zaXR5ID0gbGlnaHRJbnRlbnNpdHk7XFxuICBsaWdodC5wb3NpdGlvbiA9IGxpZ2h0UG9zaXRpb247XFxuICBpZiAobGlnaHRUeXBlIDwgLTAuNSkgeyAvLyBkaXNhYmxlZCBsaWdodFxcbiAgICBsaWdodC5pbnRlbnNpdHkgPSB2ZWMzKDAuMCk7XFxuICAgIGxpZ2h0LnR5cGUgPSAtMTtcXG4gIH0gZWxzZSBpZiAoMC43NSA8IGxpZ2h0VHlwZSkgeyAvLyBpcyBwb2ludGxpZ2h0IG9yIHNwb3RsaWdodFxcbiAgICBsaWdodC5wb2ludFRvTGlnaHQgPSBsaWdodFBvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkO1xcbiAgICBsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gICAgbGlnaHQudHlwZSA9IDE7XFxuICB9IGVsc2UgeyAvLyBpcyBEaXJlY3Rpb25hbCBMaWdodFxcbiAgICBsaWdodC50eXBlID0gMDtcXG4gICAgbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QgKiAtMS4wKTtcXG4gIH1cXG5cXG4gIGlmIChsaWdodFR5cGUgPiAxLjc1KSB7IC8vIGlzIHNwb3RsaWdodFxcbiAgICBsaWdodC50eXBlID0gMjtcXG4gIH1cXG5cXG4gIGNvbnN0IGZsb2F0IE1fUEkgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG4gIGxpZ2h0LmludGVuc2l0eSAqPSBNX1BJOyAvLyBQdW5jdHVhbCBMaWdodFxcblxcbiAgLy8gQXR0ZW51YXRpb25cXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICBnZXRMaWdodEF0dGVudWF0ZWQobGlnaHQpO1xcblxcbiAgcmV0dXJuIGxpZ2h0O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBNX1BJID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgZmxvYXQgUkVDSVBST0NBTF9QSSA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBmbG9hdCBjX01pblJvdWdobmVzcyA9IDAuMDQ7XFxuXFxuZmxvYXQgYW5ndWxhcl9uX2goZmxvYXQgTkgpIHtcXG4gIHJldHVybiBhY29zKE5IKTtcXG59XFxuXFxuZmxvYXQgZF9waG9uZyhmbG9hdCBOSCwgZmxvYXQgYzEpIHtcXG4gIHJldHVybiBwb3coXFxuICAgIGNvcyhhY29zKE5IKSlcXG4gICAgLCBjMVxcbiAgKTtcXG59XFxuXFxuLy8gdGhpcyBpcyBmcm9tIGh0dHBzOi8vd3d3LnVucmVhbGVuZ2luZS5jb20vYmxvZy9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctb24tbW9iaWxlXFxudmVjMiBlbnZCUkRGQXBwcm94KCBmbG9hdCBSb3VnaG5lc3MsIGZsb2F0IE5vViApIHtcXG4gIGNvbnN0IHZlYzQgYzAgPSB2ZWM0KC0xLCAtMC4wMjc1LCAtMC41NzIsIDAuMDIyICk7XFxuICBjb25zdCB2ZWM0IGMxID0gdmVjNCgxLCAwLjA0MjUsIDEuMDQsIC0wLjA0ICk7XFxuICB2ZWM0IHIgPSBSb3VnaG5lc3MgKiBjMCArIGMxO1xcbiAgZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtOS4yOCAqIE5vViApICkgKiByLnggKyByLnk7XFxuICB2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcbiAgcmV0dXJuIEFCO1xcbn1cXG5cXG4vLyBHR1ggTkRGXFxuZmxvYXQgZF9HR1goZmxvYXQgTkgsIGZsb2F0IGFscGhhUm91Z2huZXNzKSB7XFxuICBmbG9hdCByb3VnaG5lc3NTcXIgPSBhbHBoYVJvdWdobmVzcyAqIGFscGhhUm91Z2huZXNzO1xcbiAgZmxvYXQgZiA9IChyb3VnaG5lc3NTcXIgLSAxLjApICogTkggKiBOSCArIDEuMDtcXG4gIHJldHVybiByb3VnaG5lc3NTcXIgLyAoTV9QSSAqIGYgKiBmKTtcXG59XFxuXFxuZmxvYXQgZF90b3JyYW5jZV9yZWl6KGZsb2F0IE5ILCBmbG9hdCBjMykge1xcbiAgZmxvYXQgQ29zU3F1YXJlZCA9IE5IKk5IO1xcbiAgZmxvYXQgVGFuU3F1YXJlZCA9ICgxLjAgLSBDb3NTcXVhcmVkKS9Db3NTcXVhcmVkO1xcbiAgLy9yZXR1cm4gKDEuMC9NX1BJKSAqIHNxKGMzLyhDb3NTcXVhcmVkICogKGMzKmMzICsgVGFuU3F1YXJlZCkpKTsgIC8vIGdhbW1hID0gMiwgYWthIEdHWFxcbiAgcmV0dXJuICgxLjAvc3FydChNX1BJKSkgKiAoc3EoYzMpLyhDb3NTcXVhcmVkICogKGMzKmMzICsgVGFuU3F1YXJlZCkpKTsgLy8gZ2FtbWEgPSAxLCBEX0JlcnJ5XFxufVxcblxcbmZsb2F0IGRfYmVja21hbm4oZmxvYXQgTkgsIGZsb2F0IG0pIHtcXG4gIGZsb2F0IGNvID0gMS4wIC8gKDQuMCAqIG0gKiBtICogTkggKiBOSCAqIE5IICogTkgpO1xcbiAgZmxvYXQgZXhweCA9IGV4cCgoTkggKiBOSCAtIDEuMCkgLyAobSAqIG0gKiBOSCAqIE5IKSk7XFxuICByZXR1cm4gY28gKiBleHB4O1xcbn1cXG5cXG4vLyB0aGUgc2FtZSBhcyBnbFRGIFdlYkdMIHNhbXBsZVxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1XZWJHTC1QQlIvYmxvYi84OGVkYThjNTM1OGVmZTAzMTI4YjcyYjZjNWY1ZjZlNWI2ZDAyM2UxL3NoYWRlcnMvcGJyLWZyYWcuZ2xzbCNMMTg4XFxuLy8gVGhhdCBpcywgVW5yZWFsIEVuZ2luZSBiYXNlZCBhcHByb2FjaCwgYnV0IG1vZGlmaWVkIHRvIHVzZSBhbHBoYVJvdWdobmVzcyAoc3F1YXJlZCBhcnRpc3QncyByb3VnaG5lc3MgcGFyYW1ldGVyKSxcXG4vLyBhbmQgYmFzZWQgb24gJ1NlcGFyYWJsZSBNYXNraW5nIGFuZCBTaGFkb3dpbmcnIGFwcHJveGltYXRpb24gKHByb3Blc2VkIGJ5IENocmlzdG9waGUgU2NobGljaylcXG4vLyBodHRwczovL3d3dy5jcy52aXJnaW5pYS5lZHUvfmpkbC9iaWIvYXBwZWFyYW5jZS9hbmFseXRpYyUyMG1vZGVscy9zY2hsaWNrOTRiLnBkZlxcbmZsb2F0IGdfc2hpZWxkaW5nKGZsb2F0IE5MLCBmbG9hdCBOViwgZmxvYXQgYWxwaGFSb3VnaG5lc3MpIHtcXG4gIGZsb2F0IHIgPSBhbHBoYVJvdWdobmVzcztcXG5cXG4gIC8vIExvY2FsIFNoYWRvd2luZyB1c2luZyBcXFwiU2NobGljay1TbWl0aFxcXCIgTWFza2luZyBGdW5jdGlvblxcbiAgZmxvYXQgbG9jYWxTaGFkb3dpbmcgPSAyLjAgKiBOTCAvIChOTCArIHNxcnQociAqIHIgKyAoMS4wIC0gciAqIHIpICogKE5MICogTkwpKSk7XFxuXFxuICAvLyBMb2NhbCBNYXNraW5nIHVzaW5nIFxcXCJTY2hsaWNrLVNtaXRoXFxcIiBNYXNraW5nIEZ1bmN0aW9uXFxuICBmbG9hdCBsb2NhbE1hc2tpbmcgPSAyLjAgKiBOViAvIChOViArIHNxcnQociAqIHIgKyAoMS4wIC0gciAqIHIpICogKE5WICogTlYpKSk7XFxuXFxuICByZXR1cm4gbG9jYWxTaGFkb3dpbmcgKiBsb2NhbE1hc2tpbmc7XFxufVxcblxcbi8vIFRoZSBjb2RlIGZyb20gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lmh0bWwjbGlzdGluZ19hcHByb3hpbWF0ZWRzcGVjdWxhcnZcXG4vLyBUaGUgaWRlYSBpcyBmcm9tIFtIZWl0ejE0XSBFcmljIEhlaXR6LiAyMDE0LiBVbmRlcnN0YW5kaW5nIHRoZSBNYXNraW5nLVNoYWRvd2luZyBGdW5jdGlvbiBpbiBNaWNyb2ZhY2V0LUJhc2VkIEJSREZzLlxcbmZsb2F0IHZfR0dYQ29ycmVsYXRlZChmbG9hdCBOTCwgZmxvYXQgTlYsIGZsb2F0IGFscGhhUm91Z2huZXNzKSB7XFxuICBmbG9hdCBhMiA9IGFscGhhUm91Z2huZXNzICogYWxwaGFSb3VnaG5lc3M7XFxuICBmbG9hdCBHR1hWID0gTkwgKiBzcXJ0KE5WICogTlYgKiAoMS4wIC0gYTIpICsgYTIpO1xcbiAgZmxvYXQgR0dYTCA9IE5WICogc3FydChOTCAqIE5MICogKDEuMCAtIGEyKSArIGEyKTtcXG4gIHJldHVybiAwLjUgLyAoR0dYViArIEdHWEwpO1xcbn1cXG5cXG5mbG9hdCB2X0dHWENvcnJlbGF0ZWRGYXN0KGZsb2F0IE5MLCBmbG9hdCBOViwgZmxvYXQgYWxwaGFSb3VnaG5lc3MpIHtcXG4gIGZsb2F0IGEgPSBhbHBoYVJvdWdobmVzcztcXG4gIGZsb2F0IEdHWFYgPSBOTCAqIChOViAqICgxLjAgLSBhKSArIGEpO1xcbiAgZmxvYXQgR0dYTCA9IE5WICogKE5MICogKDEuMCAtIGEpICsgYSk7XFxuICByZXR1cm4gMC41IC8gKEdHWFYgKyBHR1hMKTtcXG59XFxuXFxuLy8gVGhlIFNjaGxpY2sgQXBwcm94aW1hdGlvbiB0byBGcmVzbmVsXFxuZmxvYXQgZnJlc25lbChmbG9hdCBmMCwgZmxvYXQgZjkwLCBmbG9hdCBWZG90SCkge1xcbiAgZmxvYXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICBmbG9hdCB4MiA9IHggKiB4O1xcbiAgZmxvYXQgeDUgPSB4ICogeDIgKiB4MjtcXG4gIHJldHVybiBmMCArIChmOTAgLSBmMCkgKiB4NTtcXG59XFxuXFxudmVjMyBmcmVzbmVsKHZlYzMgZjAsIHZlYzMgZjkwLCBmbG9hdCBWZG90SCkge1xcbiAgZmxvYXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICBmbG9hdCB4MiA9IHggKiB4O1xcbiAgZmxvYXQgeDUgPSB4ICogeDIgKiB4MjtcXG4gIHJldHVybiBmMCArIChmOTAgLSBmMCkgKiB4NTtcXG59XFxuXFxudmVjMyBmcmVzbmVsKHZlYzMgZjAsIGZsb2F0IGY5MCwgZmxvYXQgVmRvdEgpXFxue1xcbiAgZmxvYXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICBmbG9hdCB4MiA9IHggKiB4O1xcbiAgZmxvYXQgeDUgPSB4ICogeDIgKiB4MjtcXG4gIHJldHVybiBmMCArIChmOTAgLSBmMCkgKiB4NTtcXG59XFxuXFxuZmxvYXQgZnJlc25lbChmbG9hdCBmMCwgZmxvYXQgVmRvdEgpXFxue1xcbiAgZmxvYXQgZjkwID0gMS4wOyAvL2NsYW1wKDUwLjAgKiBmMCwgMC4wLCAxLjApO1xcbiAgcmV0dXJuIGZyZXNuZWwoZjAsIGY5MCwgVmRvdEgpO1xcbn1cXG52ZWMzIGZyZXNuZWwodmVjMyBmMCwgZmxvYXQgVmRvdEgpXFxue1xcbiAgZmxvYXQgZjkwID0gMS4wOyAvL2NsYW1wKDUwLjAgKiBmMCwgMC4wLCAxLjApO1xcbiAgcmV0dXJuIGZyZXNuZWwoZjAsIGY5MCwgVmRvdEgpO1xcbn1cXG5cXG52ZWMzIGNvb2tfdG9ycmFuY2Vfc3BlY3VsYXJfYnJkZihmbG9hdCBOSCwgZmxvYXQgTkwsIGZsb2F0IE5WLCB2ZWMzIEYsIGZsb2F0IGFscGhhUm91Z2huZXNzLCBmbG9hdCBzcGVjdWxhcldlaWdodCkge1xcbiAgZmxvYXQgRCA9IGRfR0dYKE5ILCBhbHBoYVJvdWdobmVzcyk7XFxuICBmbG9hdCBWID0gdl9HR1hDb3JyZWxhdGVkKE5MLCBOViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgcmV0dXJuIHZlYzMoRCkgKiB2ZWMzKFYpICogRiAqIHNwZWN1bGFyV2VpZ2h0O1xcbi8vICAgICAgZmxvYXQgRyA9IGdfc2hpZWxkaW5nKE5MLCBOViwgYWxwaGFSb3VnaG5lc3MpO1xcbi8vICAgICAgcmV0dXJuIHZlYzMoRCkqdmVjMyhHKSpGL3ZlYzMoNC4wKk5MKk5WKTtcXG5cXG59XFxuXFxuLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNkaWZmdXNlLWJyZGZcXG52ZWMzIEJSREZfbGFtYmVydGlhbih2ZWMzIGFsYmVkbywgdmVjMyBGLCBmbG9hdCBzcGVjdWxhcldlaWdodClcXG57XFxuICAvLyAoMS9waSkgKiBkaWZmdXNlQWxiZWRvXFxuICByZXR1cm4gKHZlYzMoMS4wKSAtIHNwZWN1bGFyV2VpZ2h0ICogRikgKiBhbGJlZG8gKiBSRUNJUFJPQ0FMX1BJO1xcbn1cXG5cXG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI3NwZWN1bGFyLWJyZGZcXG5mbG9hdCBzcGVjdWxhcl9icmRmKGZsb2F0IGFscGhhUm91Z2huZXNzLCBmbG9hdCBOZG90TCwgZmxvYXQgTmRvdFYsIGZsb2F0IE5kb3RIKSB7XFxuICBmbG9hdCBWID0gdl9HR1hDb3JyZWxhdGVkKE5kb3RMLCBOZG90ViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgZmxvYXQgRCA9IGRfR0dYKE5kb3RILCBhbHBoYVJvdWdobmVzcyk7XFxuICByZXR1cm4gViAqIEQ7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3RyYW5zbWlzc2lvbiNpbXBsZW1lbnRhdGlvbi1ub3Rlc1xcbmZsb2F0IHNwZWN1bGFyX2J0ZGYoZmxvYXQgYWxwaGFSb3VnaG5lc3MsIGZsb2F0IE5kb3RMLCBmbG9hdCBOZG90ViwgZmxvYXQgTmRvdEh0KSB7XFxuICBmbG9hdCBWID0gdl9HR1hDb3JyZWxhdGVkKE5kb3RMLCBOZG90ViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgZmxvYXQgRCA9IGRfR0dYKE5kb3RIdCwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgcmV0dXJuIFYgKiBEO1xcbn1cXG5cXG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI2ZyZXNuZWxcXG52ZWMzIGNvbmR1Y3Rvcl9mcmVzbmVsKHZlYzMgZjAsIGZsb2F0IGJyZGYsIGZsb2F0IGFscGhhUm91Z2huZXNzLCBmbG9hdCBWZG90SCkge1xcbiAgcmV0dXJuIHZlYzMoYnJkZikgKiAoZjAucmdiICsgKHZlYzMoMS4wKSAtIGYwLnJnYikgKiB2ZWMzKHBvdygxLjAgLSBhYnMoVmRvdEgpLCA1LjApKSk7XFxufVxcblxcbi8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjZnJlc25lbFxcbnZlYzMgZnJlc25lbF9taXgoZmxvYXQgaW9yLCB2ZWMzIGJhc2UsIHZlYzMgbGF5ZXIsIGZsb2F0IFZkb3RIKSB7XFxuICBmbG9hdCBmMCA9IHBvdygoMS4wIC0gaW9yKS8oMS4wICsgaW9yKSwgMi4wKTtcXG4gIGZsb2F0IGZyID0gZjAgKyAoMS4wIC0gZjApICogcG93KDEuMCAtIGFicyhWZG90SCksIDUuMCk7XFxuICByZXR1cm4gbWl4KGJhc2UsIGxheWVyLCBmcik7XFxufVxcblxcbi8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjbWV0YWwtYnJkZi1hbmQtZGllbGVjdHJpYy1icmRmXFxudmVjMyBtZXRhbF9icmRmKGZsb2F0IHBlcmNlcHR1YWxSb3VnaG5lc3MsIHZlYzMgYmFzZUNvbG9yLCBmbG9hdCBOZG90TCwgZmxvYXQgTmRvdFYsIGZsb2F0IE5kb3RILCBmbG9hdCBWZG90SCkge1xcbiAgZmxvYXQgYWxwaGFSb3VnaG5lc3MgPSBwZXJjZXB0dWFsUm91Z2huZXNzICogcGVyY2VwdHVhbFJvdWdobmVzcztcXG4gIHJldHVybiBjb25kdWN0b3JfZnJlc25lbChcXG4gICAgYmFzZUNvbG9yLFxcbiAgICBzcGVjdWxhcl9icmRmKGFscGhhUm91Z2huZXNzLCBOZG90TCwgTmRvdFYsIE5kb3RIKSxcXG4gICAgYWxwaGFSb3VnaG5lc3MsXFxuICAgIFZkb3RIXFxuICApO1xcbn1cXG5cXG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI21ldGFsLWJyZGYtYW5kLWRpZWxlY3RyaWMtYnJkZlxcbi8vIHZlYzMgZGllbGVjdHJpY19icmRmKGZsb2F0IGlvciwgdmVjMyBiYXNlQ29sb3IsIGZsb2F0IHBlcmNlcHR1YWxSb3VnaG5lc3MsIGZsb2F0IE5kb3RMLCBmbG9hdCBOZG90ViwgZmxvYXQgTmRvdEgsIGZsb2F0IFZkb3RIKSB7XFxuLy8gICB2ZWMzIGJhc2UgPSBCUkRGX2xhbWJlcnRpYW4oYmFzZUNvbG9yKTtcXG4vLyAgIGZsb2F0IGFscGhhUm91Z2huZXNzID0gcGVyY2VwdHVhbFJvdWdobmVzcyAqIHBlcmNlcHR1YWxSb3VnaG5lc3M7XFxuLy8gICB2ZWMzIGxheWVyID0gdmVjMyhzcGVjdWxhcl9icmRmKGFscGhhUm91Z2huZXNzLCBOZG90TCwgTmRvdFYsIE5kb3RIKSk7XFxuLy8gICByZXR1cm4gZnJlc25lbF9taXgoaW9yLCBiYXNlLCBsYXllciwgVmRvdEgpO1xcbi8vIH1cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19jbGVhcmNvYXQjbGF5ZXJpbmdcXG52ZWMzIGNvYXRlZF9tYXRlcmlhbF9zKHZlYzMgYmFzZSwgZmxvYXQgcGVyY2VwdHVhbFJvdWdobmVzcywgZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzLCBmbG9hdCBjbGVhcmNvYXQsIGZsb2F0IFZkb3ROYywgZmxvYXQgTGRvdE5jLCBmbG9hdCBOZG90SGMpIHtcXG4gIGZsb2F0IGNsZWFyY29hdEZyZXNuZWwgPSAwLjA0ICsgKDEuMCAtIDAuMDQpICogcG93KDEuMCAtIGFicyhWZG90TmMpLCA1LjApO1xcbiAgZmxvYXQgY2xlYXJjb2F0QWxwaGEgPSBjbGVhcmNvYXRSb3VnaG5lc3MgKiBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuICBmbG9hdCBhbHBoYVJvdWdobmVzcyA9IHBlcmNlcHR1YWxSb3VnaG5lc3MgKiBwZXJjZXB0dWFsUm91Z2huZXNzO1xcbiAgZmxvYXQgRCA9IGRfR0dYKE5kb3RIYywgY2xlYXJjb2F0QWxwaGEpO1xcbiAgZmxvYXQgViA9IHZfR0dYQ29ycmVsYXRlZChMZG90TmMsIFZkb3ROYywgY2xlYXJjb2F0QWxwaGEpO1xcbiAgZmxvYXQgZl9jbGVhcmNvYXQgPSBjbGVhcmNvYXRGcmVzbmVsICogRCAqIFY7XFxuXFxuICAvLyBiYXNlID0gKGZfZGlmZnVzZSArIGZfc3BlY3VsYXIpIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2NsZWFyY29hdCNsYXllcmluZ1xcbiAgcmV0dXJuIGJhc2UgKiB2ZWMzKDEuMCAtIGNsZWFyY29hdCAqIGNsZWFyY29hdEZyZXNuZWwpICsgdmVjMyhmX2NsZWFyY29hdCAqIGNsZWFyY29hdCk7XFxufVxcbnZlYzMgc3JnYlRvTGluZWFyKHZlYzMgc3JnYkNvbG9yKSB7XFxuICByZXR1cm4gcG93KHNyZ2JDb2xvciwgdmVjMygyLjIpKTtcXG59XFxuXFxuZmxvYXQgc3JnYlRvTGluZWFyKGZsb2F0IHZhbHVlKSB7XFxuICByZXR1cm4gcG93KHZhbHVlLCAyLjIpO1xcbn1cXG5cXG52ZWMzIGxpbmVhclRvU3JnYih2ZWMzIGxpbmVhckNvbG9yKSB7XFxuICByZXR1cm4gcG93KGxpbmVhckNvbG9yLCB2ZWMzKDEuMC8yLjIpKTtcXG59XFxuXFxuZmxvYXQgbGluZWFyVG9TcmdiKGZsb2F0IHZhbHVlKSB7XFxuICByZXR1cm4gcG93KHZhbHVlLCAxLjAvMi4yKTtcXG59XFxuXFxuLy8gUm91Z2huZXNzIERlcGVuZGVudCBGcmVzbmVsXFxuLy8gaHR0cHM6Ly93d3cuamNndC5vcmcvcHVibGlzaGVkLzAwMDgvMDEvMDMvcGFwZXIucGRmXFxudmVjMyBmcmVzbmVsU2NobGlja1JvdWdobmVzcyh2ZWMzIEYwLCBmbG9hdCBjb3NUaGV0YSwgZmxvYXQgcm91Z2huZXNzKVxcbntcXG4gIHZlYzMgRnIgPSBtYXgodmVjMygxLjAgLSByb3VnaG5lc3MpLCBGMCkgLSBGMDtcXG4gIHZlYzMga19TID0gRjAgKyBGciAqIHBvdygxLjAgLSBjb3NUaGV0YSwgNS4wKTtcXG4gIHJldHVybiBrX1M7XFxufVxcblxcbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtVmlld2VyL2Jsb2IvZTJjN2I4YzhiZDEyOTE2YzFhMzg3Y2Q0MWY5ZWYwNjFlZGM3MThkZi9zb3VyY2UvUmVuZGVyZXIvc2hhZGVycy9icmRmLmdsc2wjTDQ0LUw2NlxcbnZlYzMgU2NobGlja190b19GMCh2ZWMzIGYsIHZlYzMgZjkwLCBmbG9hdCBWZG90SCkge1xcbiAgICBmbG9hdCB4ID0gY2xhbXAoMS4wIC0gVmRvdEgsIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgeDIgPSB4ICogeDtcXG4gICAgZmxvYXQgeDUgPSBjbGFtcCh4ICogeDIgKiB4MiwgMC4wLCAwLjk5OTkpO1xcblxcbiAgICByZXR1cm4gKGYgLSBmOTAgKiB4NSkgLyAoMS4wIC0geDUpO1xcbn1cXG5cXG5mbG9hdCBTY2hsaWNrX3RvX0YwKGZsb2F0IGYsIGZsb2F0IGY5MCwgZmxvYXQgVmRvdEgpIHtcXG4gICAgZmxvYXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IHgyID0geCAqIHg7XFxuICAgIGZsb2F0IHg1ID0gY2xhbXAoeCAqIHgyICogeDIsIDAuMCwgMC45OTk5KTtcXG5cXG4gICAgcmV0dXJuIChmIC0gZjkwICogeDUpIC8gKDEuMCAtIHg1KTtcXG59XFxuXFxudmVjMyBTY2hsaWNrX3RvX0YwKHZlYzMgZiwgZmxvYXQgVmRvdEgpIHtcXG4gICAgcmV0dXJuIFNjaGxpY2tfdG9fRjAoZiwgdmVjMygxLjApLCBWZG90SCk7XFxufVxcblxcbmZsb2F0IFNjaGxpY2tfdG9fRjAoZmxvYXQgZiwgZmxvYXQgVmRvdEgpIHtcXG4gICAgcmV0dXJuIFNjaGxpY2tfdG9fRjAoZiwgMS4wLCBWZG90SCk7XFxufVxcblxcbnZlYzMgbm9ybWFsQmxlbmRpbmdVRE4oc2FtcGxlcjJEIGJhc2VNYXAsIHNhbXBsZXIyRCBkZXRhaWxNYXAsIHZlYzIgYmFzZVV2LCB2ZWMyIGRldGFpbFV2KSB7XFxuICB2ZWMzIHQgPSB0ZXh0dXJlKGJhc2VNYXAsICAgYmFzZVV2KS54eXogKiAyLjAgLSAxLjA7XFxuICB2ZWMzIHUgPSB0ZXh0dXJlKGRldGFpbE1hcCwgZGV0YWlsVXYpLnh5eiAqIDIuMCAtIDEuMDtcXG4gIHZlYzMgciA9IG5vcm1hbGl6ZSh2ZWMzKHQueHkgKyB1Lnh5LCB0LnopKTtcXG4gIHJldHVybiByO1xcbn1cXG5cXG52ZWMyIHV2VHJhbnNmb3JtKHZlYzIgc2NhbGUsIHZlYzIgb2Zmc2V0LCBmbG9hdCByb3RhdGlvbiwgdmVjMiB1dikge1xcbiAgbWF0MyB0cmFuc2xhdGlvbk1hdCA9IG1hdDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbWF0MyByb3RhdGlvbk1hdCA9IG1hdDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbWF0MyBzY2FsZU1hdCA9IG1hdDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBtYXQzIG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIHZlYzIgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjMyh1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG5mbG9hdCBJc290cm9waWNOREZGaWx0ZXJpbmcodmVjMyBub3JtYWwsIGZsb2F0IHJvdWdobmVzczIpIHtcXG4gIGZsb2F0IFNJR01BMiA9IDAuMTU5MTU0OTQ7XFxuICBmbG9hdCBLQVBQQSA9IDAuMTg7XFxuICB2ZWMzIGRuZHUgPSBkRmR4KG5vcm1hbCk7XFxuICB2ZWMzIGRuZHYgPSBkRmR5KG5vcm1hbCk7XFxuICBmbG9hdCBrZXJuZWxSb3VnaG5lc3MyID0gU0lHTUEyICogKGRvdChkbmR1LCBkbmR1KSArIGRvdChkbmR2LCBkbmR2KSk7XFxuICBmbG9hdCBjbGFtcGVkS2VybmVsUm91Z2huZXNzMiA9IG1pbihrZXJuZWxSb3VnaG5lc3MyLCBLQVBQQSk7XFxuICBmbG9hdCBmaWx0ZXJlZFJvdWdobmVzczIgPSBzYXR1cmF0ZShyb3VnaG5lc3MyICsgY2xhbXBlZEtlcm5lbFJvdWdobmVzczIpO1xcbiAgcmV0dXJuIGZpbHRlcmVkUm91Z2huZXNzMjtcXG59XFxuXFxuXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbi8vIGdsVEYgS0hSX21hdGVyaWFsc192b2x1bWVcXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuXFxuI2lmZGVmIFJOX1VTRV9WT0xVTUVcXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc192b2x1bWUvUkVBRE1FLm1kI2F0dGVudWF0aW9uXFxudmVjMyB2b2x1bWVBdHRlbnVhdGlvbih2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UsIHZlYzMgaW50ZW5zaXR5LCBmbG9hdCB0cmFuc21pc3Npb25EaXN0YW5jZSlcXG57XFxuICBpZiAoYXR0ZW51YXRpb25EaXN0YW5jZSA9PSAwLjApIHsgLy8gbWVhbnMgSW5maW5pdGUgZGlzdGFuY2VcXG4gICAgcmV0dXJuIGludGVuc2l0eTsgLy8gTm8gYXR0ZW51YXRpb25cXG4gIH0gZWxzZSB7XFxuICAgIHZlYzMgYXR0ZW51YXRpb25DbyA9IC1sb2coYXR0ZW51YXRpb25Db2xvcikgLyBhdHRlbnVhdGlvbkRpc3RhbmNlO1xcbiAgICB2ZWMzIGF0dGVudWF0ZWRUcmFuc21pdHRhbmNlID0gZXhwKC1hdHRlbnVhdGlvbkNvICogdHJhbnNtaXNzaW9uRGlzdGFuY2UpO1xcbiAgICByZXR1cm4gaW50ZW5zaXR5ICogYXR0ZW51YXRlZFRyYW5zbWl0dGFuY2U7XFxuICB9XFxufVxcbiNlbmRpZlxcblxcblxcblxcblxcblxcblxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4vLyBnbFRGIEtIUl9tYXRlcmlhbHNfYW5pc290cm9weVxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4jaWZkZWYgUk5fVVNFX0FOSVNPVFJPUFlcXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5XFxuZmxvYXQgRF9HR1hfYW5pc290cm9waWMoZmxvYXQgTmRvdEgsIGZsb2F0IFRkb3RILCBmbG9hdCBCZG90SCwgZmxvYXQgYXQsIGZsb2F0IGFiKVxcbntcXG4gICAgZmxvYXQgYTIgPSBhdCAqIGFiO1xcbiAgICB2ZWMzIGYgPSB2ZWMzKGFiICogVGRvdEgsIGF0ICogQmRvdEgsIGEyICogTmRvdEgpO1xcbiAgICBmbG9hdCB3MiA9IGEyIC8gZG90KGYsIGYpO1xcbiAgICByZXR1cm4gYTIgKiB3MiAqIHcyIC8gTV9QSTtcXG59XFxuXFxuZmxvYXQgVl9HR1hfYW5pc290cm9waWMoZmxvYXQgTmRvdEwsIGZsb2F0IE5kb3RWLCBmbG9hdCBCZG90ViwgZmxvYXQgVGRvdFYsIGZsb2F0IFRkb3RMLCBmbG9hdCBCZG90TCxcXG4gICAgZmxvYXQgYXQsIGZsb2F0IGFiKVxcbntcXG4gICAgZmxvYXQgR0dYViA9IE5kb3RMICogbGVuZ3RoKHZlYzMoYXQgKiBUZG90ViwgYWIgKiBCZG90ViwgTmRvdFYpKTtcXG4gICAgZmxvYXQgR0dYTCA9IE5kb3RWICogbGVuZ3RoKHZlYzMoYXQgKiBUZG90TCwgYWIgKiBCZG90TCwgTmRvdEwpKTtcXG4gICAgZmxvYXQgdiA9IDAuNSAvIChHR1hWICsgR0dYTCk7XFxuICAgIHJldHVybiBjbGFtcCh2LCAwLjAsIDEuMCk7XFxufVxcblxcbnZlYzMgQlJERl9zcGVjdWxhckFuaXNvdHJvcGljR0dYKHZlYzMgRiwgZmxvYXQgYWxwaGFSb3VnaG5lc3MsXFxuICAgIGZsb2F0IFZkb3RILCBmbG9hdCBOZG90TCwgZmxvYXQgTmRvdFYsIGZsb2F0IE5kb3RILCBmbG9hdCBCZG90ViwgZmxvYXQgVGRvdFYsXFxuICAgIGZsb2F0IFRkb3RMLCBmbG9hdCBCZG90TCwgZmxvYXQgVGRvdEgsIGZsb2F0IEJkb3RILCBmbG9hdCBhbmlzb3Ryb3B5KVxcbntcXG4gICAgZmxvYXQgYXQgPSBtaXgoYWxwaGFSb3VnaG5lc3MsIDEuMCwgYW5pc290cm9weSAqIGFuaXNvdHJvcHkpO1xcbiAgICBmbG9hdCBhYiA9IGFscGhhUm91Z2huZXNzO1xcblxcbiAgICBmbG9hdCBWID0gVl9HR1hfYW5pc290cm9waWMoTmRvdEwsIE5kb3RWLCBCZG90ViwgVGRvdFYsIFRkb3RMLCBCZG90TCwgYXQsIGFiKTtcXG4gICAgZmxvYXQgRCA9IERfR0dYX2FuaXNvdHJvcGljKE5kb3RILCBUZG90SCwgQmRvdEgsIGF0LCBhYik7XFxuXFxuICAgIHJldHVybiBGICogViAqIEQ7XFxufVxcbiNlbmRpZlxcblxcblxcblxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4vLyBnbFRGIEtIUl9tYXRlcmlhbHNfc2hlZW5cXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuXFxuI2lmZGVmIFJOX1VTRV9TSEVFTlxcbmZsb2F0IGRfQ2hhcmxpZShmbG9hdCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MsIGZsb2F0IE5vSCkge1xcbiAgLy8gRXN0ZXZleiBhbmQgS3VsbGEgMjAxNywgXFxcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXFxcIlxcbiAgZmxvYXQgYWxwaGFHID0gc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzICogc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzO1xcbiAgZmxvYXQgaW52QWxwaGEgID0gMS4wIC8gYWxwaGFHO1xcbiAgZmxvYXQgY29zMmggPSBOb0ggKiBOb0g7XFxuICBmbG9hdCBzaW4yaCA9IDEuMCAtIGNvczJoO1xcbiAgcmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3NoZWVuI3NoZWVuLXZpc2liaWxpdHlcXG5mbG9hdCBzaGVlblNpbXBsZVZpc2liaWxpdHkoZmxvYXQgTmRvdEwsIGZsb2F0IE5kb3RWKSB7XFxuICByZXR1cm4gMS4wIC8gKDQuMCAqIChOZG90TCArIE5kb3RWIC0gTmRvdEwgKiBOZG90VikpO1xcbn1cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19zaGVlbiNzaGVlbi12aXNpYmlsaXR5XFxuZmxvYXQgY2hhcmxpZUwoZmxvYXQgeCwgZmxvYXQgYWxwaGFHKSB7XFxuICBmbG9hdCBvbmVNaW51c0FscGhhU3EgPSAoMS4wIC0gYWxwaGFHKSAqICgxLjAgLSBhbHBoYUcpO1xcbiAgZmxvYXQgYSA9IG1peCgyMS41NDczLCAyNS4zMjQ1LCBvbmVNaW51c0FscGhhU3EpO1xcbiAgZmxvYXQgYiA9IG1peCgzLjgyOTg3LCAzLjMyNDM1LCBvbmVNaW51c0FscGhhU3EpO1xcbiAgZmxvYXQgYyA9IG1peCgwLjE5ODIzLCAwLjE2ODAxLCBvbmVNaW51c0FscGhhU3EpO1xcbiAgZmxvYXQgZCA9IG1peCgtMS45Nzc2MCwgLTEuMjczOTMsIG9uZU1pbnVzQWxwaGFTcSk7XFxuICBmbG9hdCBlID0gbWl4KC00LjMyMDU0LCAtNC44NTk2Nywgb25lTWludXNBbHBoYVNxKTtcXG4gIHJldHVybiBhIC8gKDEuMCArIGIgKiBwb3coeCwgYykpICsgZCAqIHggKyBlO1xcbn1cXG5cXG5mbG9hdCBsYW1iZGFTaGVlbihmbG9hdCBjb3NUaGV0YSwgZmxvYXQgYWxwaGFHKVxcbntcXG4gIHJldHVybiBhYnMoY29zVGhldGEpIDwgMC41ID8gZXhwKGNoYXJsaWVMKGNvc1RoZXRhLCBhbHBoYUcpKSA6IGV4cCgyLjAgKiBjaGFybGllTCgwLjUsIGFscGhhRykgLSBjaGFybGllTCgxLjAgLSBjb3NUaGV0YSwgYWxwaGFHKSk7XFxufVxcblxcbmZsb2F0IHNoZWVuQ2hhcmxpZVZpc2liaWxpdHkoZmxvYXQgTmRvdEwsIGZsb2F0IE5kb3RWLCBmbG9hdCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MpIHtcXG4gIGZsb2F0IGFscGhhRyA9IHNoZWVuUGVyY2VwdHVhbFJvdWdobmVzcyAqIHNoZWVuUGVyY2VwdHVhbFJvdWdobmVzcztcXG4gIGZsb2F0IHNoZWVuVmlzaWJpbGl0eSA9IDEuMCAvICgoMS4wICsgbGFtYmRhU2hlZW4oTmRvdFYsIGFscGhhRykgKyBsYW1iZGFTaGVlbihOZG90TCwgYWxwaGFHKSkgKiAoNC4wICogTmRvdFYgKiBOZG90TCkpO1xcbiAgcmV0dXJuIHNoZWVuVmlzaWJpbGl0eTtcXG59XFxuXFxudmVjMyBzaGVlbl9icmRmKHZlYzMgc2hlZW5Db2xvciwgZmxvYXQgc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzLCBmbG9hdCBOZG90TCwgZmxvYXQgTmRvdFYsIGZsb2F0IE5kb3RIKSB7XFxuICBmbG9hdCBzaGVlbkRpc3RyaWJ1dGlvbiA9IGRfQ2hhcmxpZShzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MsIE5kb3RIKTtcXG4gIGZsb2F0IHNoZWVuVmlzaWJpbGl0eSA9IHNoZWVuQ2hhcmxpZVZpc2liaWxpdHkoTmRvdEwsIE5kb3RWLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MpO1xcbiAgcmV0dXJuIHNoZWVuQ29sb3IgKiBzaGVlbkRpc3RyaWJ1dGlvbiAqIHNoZWVuVmlzaWJpbGl0eTtcXG59XFxuI2VuZGlmXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbi8vIGdsVEYgS0hSX21hdGVyaWFsc19pcmlyZGVzY2VuY2VcXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuXFxuI2lmZGVmIFJOX1VTRV9JUklERVNDRU5DRVxcbi8vIFhZWiB0byBSRUM3MDkoc1JHQikgY29udmVyc2lvbiBtYXRyaXhcXG5jb25zdCBtYXQzIFhZWl9UT19SRUM3MDkgPSBtYXQzKFxcbiAgICAgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAgMC4wNTU2NDM0LFxcbiAgICAtMS41MzcxMzg1LCAgMS44NzYwMTA4LCAtMC4yMDQwMjU5LFxcbiAgICAtMC40OTg1MzE0LCAgMC4wNDE1NTYwLCAgMS4wNTcyMjUyXFxuKTtcXG5cXG52ZWMzIGZyZXNuZWxTY2hsaWNrUm91Z2huZXNzV2l0aElyaWRlc2NlbmNlKFxcbiAgdmVjMyBGMCwgZmxvYXQgY29zVGhldGEsIGZsb2F0IHJvdWdobmVzcyxcXG4gIHZlYzMgaXJpZGVzY2VuY2VGcmVzbmVsLCBmbG9hdCBpcmlkZXNjZW5jZVxcbiAgKVxcbntcXG4gIHZlYzMgRnIgPSBtYXgodmVjMygxLjAgLSByb3VnaG5lc3MpLCBGMCkgLSBGMDtcXG4gIHZlYzMga19TID0gbWl4KEYwICsgRnIgKiBwb3coMS4wIC0gY29zVGhldGEsIDUuMCksIGlyaWRlc2NlbmNlRnJlc25lbCwgaXJpZGVzY2VuY2UpO1xcbiAgcmV0dXJuIGtfUztcXG59XFxuXFxuLy8gQXNzdW1lIGFpciBpbnRlcmZhY2UgZm9yIHRvcFxcbnZlYzMgRnJlc25lbDBUb0lvcih2ZWMzIEYwKSB7XFxuICAgIHZlYzMgc3FydEYwID0gc3FydChGMCk7XFxuICAgIHJldHVybiAodmVjMygxLjApICsgc3FydEYwKSAvICh2ZWMzKDEuMCkgLSBzcXJ0RjApO1xcbn1cXG5cXG4vLyBDb252ZXJzaW9uIGZyb20gSU9SIHRvIEYwXFxuLy8gaW9yIGlzIGEgdmFsdWUgYmV0d2VlbiAxLjAgYW5kIDMuMC4gMS4wIGlzIGFpciBpbnRlcmZhY2VcXG52ZWMzIElvclRvRnJlc25lbDAodmVjMyB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IpIHtcXG4gICAgcmV0dXJuIHNxKCh0cmFuc21pdHRlZElvciAtIHZlYzMoaW5jaWRlbnRJb3IpKSAvICh0cmFuc21pdHRlZElvciArIHZlYzMoaW5jaWRlbnRJb3IpKSk7XFxufVxcbmZsb2F0IElvclRvRnJlc25lbDAoZmxvYXQgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yKSB7XFxuICAgIHJldHVybiBzcSgodHJhbnNtaXR0ZWRJb3IgLSBpbmNpZGVudElvcikgLyAodHJhbnNtaXR0ZWRJb3IgKyBpbmNpZGVudElvcikpO1xcbn1cXG5cXG4vKipcXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZSNhbmFseXRpYy1zcGVjdHJhbC1pbnRlZ3JhdGlvblxcbiAqL1xcbnZlYzMgZXZhbFNlbnNpdGl2aXR5KGZsb2F0IE9QRCwgdmVjMyBzaGlmdCkge1xcbiAgICBmbG9hdCBwaGFzZSA9IDIuMCAqIE1fUEkgKiBPUEQgKiAxLjBlLTk7XFxuICAgIHZlYzMgdmFsID0gdmVjMyg1LjQ4NTZlLTEzLCA0LjQyMDFlLTEzLCA1LjI0ODFlLTEzKTtcXG4gICAgdmVjMyBwb3MgPSB2ZWMzKDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYpO1xcbiAgICB2ZWMzIHZhciA9IHZlYzMoNC4zMjc4ZSswOSwgOS4zMDQ2ZSswOSwgNi42MTIxZSswOSk7XFxuXFxuICAgIHZlYzMgeHl6ID0gdmFsICogc3FydCgyLjAgKiBNX1BJICogdmFyKSAqIGNvcyhwb3MgKiBwaGFzZSArIHNoaWZ0KSAqIGV4cCgtKHBoYXNlICogcGhhc2UpICogdmFyKTtcXG4gICAgeHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoMi4wICogTV9QSSAqIDQuNTI4MmUrMDkpICogY29zKDIuMjM5OWUrMDYgKiBwaGFzZSArIHNoaWZ0WzBdKSAqIGV4cCgtNC41MjgyZSswOSAqIChwaGFzZSAqIHBoYXNlKSk7XFxuICAgIHh5eiAvPSAxLjA2ODVlLTc7XFxuXFxuICAgIHZlYzMgcmdiID0gWFlaX1RPX1JFQzcwOSAqIHh5ejtcXG4gICAgcmV0dXJuIHJnYjtcXG59XFxuXFxuLyoqXFxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFpbi9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UjaXJpZGVzY2VuY2UtZnJlc25lbFxcbiAqL1xcbnZlYzMgY2FsY0lyaWRlc2NlbmNlKGZsb2F0IG91dHNpZGVJb3IsIGZsb2F0IGV0YTIsIGZsb2F0IGNvc1RoZXRhMSwgZmxvYXQgdGhpbkZpbG1UaGlja25lc3MsIHZlYzMgYmFzZUYwKSB7XFxuXFxuXFxuICAvLyBpcmlkZXNjZW5jZUlvciBpcyB0aGUgaW5kZXggb2YgcmVmcmFjdGlvbiBvZiB0aGUgdGhpbi1maWxtIGxheWVyXFxuICAvLyBGb3JjZSBpcmlkZXNjZW5jZUlvciAtPiBvdXRzaWRlSU9SIHdoZW4gdGhpbkZpbG1UaGlja25lc3MgLT4gMC4wXFxuICBmbG9hdCBpcmlkZXNjZW5jZUlvciA9IG1peChvdXRzaWRlSW9yLCBldGEyLCBzbW9vdGhzdGVwKDAuMCwgMC4wMywgdGhpbkZpbG1UaGlja25lc3MpKTtcXG5cXG4gIC8vIFRvIGNhbGN1bGF0ZSB0aGUgcmVmbGVjdGFuY2VzIFIxMiBhbmQgUjIzIGF0IHRoZSB2aWV3aW5nIGFuZ2xlcyAoYW5nbGUgaGl0dGluZyB0aGUgdGhpbi1maWxtIGxheWVyKVxcbiAgLy8gYW5kIChhbmdsZSBhZnRlciByZWZyYWN0aW9uIGluIHRoZSB0aGluLWZpbG0pIFNjaGxpY2sgRnJlc25lbCBpcyBhZ2FpbiB1c2VkLlxcbiAgLy8gVGhpcyBhcHByb3hpbWF0aW9uIGFsbG93cyB0byBlbGltaW5hdGUgdGhlIHNwbGl0IGludG8gUyBhbmQgUCBwb2xhcml6YXRpb24gZm9yIHRoZSBleGFjdCBGcmVzbmVsIGVxdWF0aW9ucy5cXG4gIC8vIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIFNuZWxsJ3MgbGF3ICh3aXRoICBiZWluZyBvdXRzaWRlSW9yIGFuZCBiZWluZyBpcmlkZXNjZW5jZUlvcik6XFxuICBmbG9hdCBzaW5UaGV0YTJTcSA9IHNxKG91dHNpZGVJb3IgLyBpcmlkZXNjZW5jZUlvcikgKiAoMS4wIC0gc3EoY29zVGhldGExKSk7XFxuICBmbG9hdCBjb3NUaGV0YTJTcSA9IDEuMCAtIHNpblRoZXRhMlNxO1xcblxcbiAgLy8gSGFuZGxlIHRvdGFsIGludGVybmFsIHJlZmxlY3Rpb25cXG4gIGlmIChjb3NUaGV0YTJTcSA8IDAuMCkge1xcbiAgICAgIHJldHVybiB2ZWMzKDEuMCk7XFxuICB9XFxuXFxuICBmbG9hdCBjb3NUaGV0YTIgPSBzcXJ0KGNvc1RoZXRhMlNxKTtcXG5cXG4gIC8vLyBNYXRlcmlhbCBJbnRlcmZhY2VzXFxuICAvLyBUaGUgaXJpZGVzY2VuY2UgbW9kZWwgZGVmaW5lZCBieSBCZWxjb3VyL0JhcmxhIG1vZGVscyB0d28gbWF0ZXJpYWwgaW50ZXJmYWNlc1xcbiAgLy8gLSBvbmUgZnJvbSB0aGUgb3V0c2lkZSB0byB0aGUgdGhpbi1maWxtIGxheWVyXFxuICAvLyBhbmQgYW5vdGhlciBvbmUgZnJvbSB0aGUgdGhpbi1maWxtIHRvIHRoZSBiYXNlIG1hdGVyaWFsLiBUaGVzZSB0d28gaW50ZXJmYWNlcyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOlxcblxcbiAgLy8gRmlyc3QgaW50ZXJmYWNlIChmcm9tIHRoZSBvdXRzaWRlIHRvIHRoZSB0aGluLWZpbG0gbGF5ZXIpXFxuICBmbG9hdCBSMCA9IElvclRvRnJlc25lbDAoaXJpZGVzY2VuY2VJb3IsIG91dHNpZGVJb3IpO1xcbiAgZmxvYXQgUjEyID0gZnJlc25lbChSMCwgY29zVGhldGExKTtcXG4gIGZsb2F0IFIyMSA9IFIxMjtcXG4gIGZsb2F0IFQxMjEgPSAxLjAgLSBSMTI7XFxuXFxuICAvLyBTZWNvbmQgaW50ZXJmYWNlIChmcm9tIHRoZSB0aGluLWZpbG0gdG8gdGhlIGJhc2UgbWF0ZXJpYWwpXFxuICB2ZWMzIGJhc2VJb3IgPSBGcmVzbmVsMFRvSW9yKGJhc2VGMCArIDAuMDAwMSk7IC8vIGd1YXJkIGFnYWluc3QgMS4wXFxuICB2ZWMzIFIxID0gSW9yVG9GcmVzbmVsMChiYXNlSW9yLCBpcmlkZXNjZW5jZUlvcik7XFxuICB2ZWMzIFIyMyA9IGZyZXNuZWwoUjEsIGNvc1RoZXRhMik7XFxuXFxuICAvLyBwaGkxMiBhbmQgcGhpMjMgZGVmaW5lIHRoZSBiYXNlIHBoYXNlcyBwZXIgaW50ZXJmYWNlIGFuZCBhcmUgYXBwcm94aW1hdGVkIHdpdGggMC4wXFxuICAvLyBpZiB0aGUgSU9SIG9mIHRoZSBoaXQgbWF0ZXJpYWwgKGlyaWRlc2NlbmNlSW9yIG9yIGJhc2VJb3IpIGlzIGhpZ2hlclxcbiAgLy8gdGhhbiB0aGUgSU9SIG9mIHRoZSBwcmV2aW91cyBtYXRlcmlhbCAob3V0c2lkZUlvciBvciBpcmlkZXNjZW5jZUlvcikgYW5kIM+AIG90aGVyd2lzZS5cXG4gIC8vIEFsc28gaGVyZSwgcG9sYXJpemF0aW9uIGlzIGlnbm9yZWQuICBmbG9hdCBwaGkxMiA9IDAuMDtcXG5cXG4gIC8vIEZpcnN0IGludGVyZmFjZSAoZnJvbSB0aGUgb3V0c2lkZSB0byB0aGUgdGhpbi1maWxtIGxheWVyKVxcbiAgZmxvYXQgcGhpMTIgPSAwLjA7XFxuICBpZiAoaXJpZGVzY2VuY2VJb3IgPCBvdXRzaWRlSW9yKSBwaGkxMiA9IE1fUEk7XFxuICBmbG9hdCBwaGkyMSA9IE1fUEkgLSBwaGkxMjtcXG5cXG4gIC8vIFNlY29uZCBpbnRlcmZhY2UgKGZyb20gdGhlIHRoaW4tZmlsbSB0byB0aGUgYmFzZSBtYXRlcmlhbClcXG4gIHZlYzMgcGhpMjMgPSB2ZWMzKDAuMCk7XFxuICBpZiAoYmFzZUlvclswXSA8IGlyaWRlc2NlbmNlSW9yKSBwaGkyM1swXSA9IE1fUEk7XFxuICBpZiAoYmFzZUlvclsxXSA8IGlyaWRlc2NlbmNlSW9yKSBwaGkyM1sxXSA9IE1fUEk7XFxuICBpZiAoYmFzZUlvclsyXSA8IGlyaWRlc2NlbmNlSW9yKSBwaGkyM1syXSA9IE1fUEk7XFxuXFxuICAvLyBPUEQgKG9wdGljYWwgcGF0aCBkaWZmZXJlbmNlKVxcbiAgZmxvYXQgT1BEID0gMi4wICogaXJpZGVzY2VuY2VJb3IgKiB0aGluRmlsbVRoaWNrbmVzcyAqIGNvc1RoZXRhMjtcXG4gIC8vIFBoYXNlIHNoaWZ0XFxuICB2ZWMzIHBoaSA9IHZlYzMocGhpMjEpICsgcGhpMjM7XFxuXFxuICAvLyBDb21wb3VuZCB0ZXJtc1xcbiAgdmVjMyBSMTIzID0gY2xhbXAoUjEyICogUjIzLCAxZS01LCAwLjk5OTkpO1xcbiAgdmVjMyByMTIzID0gc3FydChSMTIzKTtcXG4gIHZlYzMgUnMgPSAoVDEyMSAqIFQxMjEpICogUjIzIC8gKHZlYzMoMS4wKSAtIFIxMjMpO1xcblxcbiAgLy8gUmVmbGVjdGFuY2UgdGVybSBmb3IgbSA9IDAgKERDIHRlcm0gYW1wbGl0dWRlKVxcbiAgdmVjMyBDMCA9IFIxMiArIFJzO1xcbiAgdmVjMyBJID0gQzA7XFxuXFxuICAvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID4gMCAocGFpcnMgb2YgZGlyYWNzKVxcbiAgdmVjMyBDbSA9IFJzIC0gVDEyMTtcXG4gIGZvciAoaW50IG0gPSAxOyBtIDw9IDI7ICsrbSlcXG4gIHtcXG4gICAgICBDbSAqPSByMTIzO1xcbiAgICAgIHZlYzMgU20gPSAyLjAgKiBldmFsU2Vuc2l0aXZpdHkoZmxvYXQobSkgKiBPUEQsIGZsb2F0KG0pICogcGhpKTtcXG4gICAgICBJICs9IENtICogU207XFxuICB9XFxuXFxuICB2ZWMzIEZfaXJpZGVzY2VuY2UgPSBtYXgoSSwgdmVjMygwLjApKTtcXG5cXG4gIHJldHVybiBGX2lyaWRlc2NlbmNlO1xcbn1cXG5cXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMCNhY2tub3dsZWRnbWVudHMgQXBwZW5kaXhCXFxudmVjMyBCUkRGX2xhbWJlcnRpYW5JcmlkZXNjZW5jZSh2ZWMzIGYwLCB2ZWMzIGY5MCwgdmVjMyBpcmlkZXNjZW5jZUZyZXNuZWwsIGZsb2F0IGlyaWRlc2NlbmNlRmFjdG9yLCB2ZWMzIGRpZmZ1c2VDb2xvciwgZmxvYXQgc3BlY3VsYXJXZWlnaHQsIGZsb2F0IFZkb3RIKVxcbntcXG4gICAgdmVjMyBpcmlkZXNjZW5jZUZyZXNuZWxNYXggPSB2ZWMzKG1heChtYXgoaXJpZGVzY2VuY2VGcmVzbmVsLnIsIGlyaWRlc2NlbmNlRnJlc25lbC5nKSwgaXJpZGVzY2VuY2VGcmVzbmVsLmIpKTtcXG4gICAgdmVjMyBzY2hsaWNrRnJlc25lbCA9IFNjaGxpY2tfdG9fRjAoZjAsIGY5MCwgVmRvdEgpO1xcbiAgICB2ZWMzIEYgPSBtaXgoc2NobGlja0ZyZXNuZWwsIGlyaWRlc2NlbmNlRnJlc25lbE1heCwgaXJpZGVzY2VuY2VGYWN0b3IpO1xcblxcbiAgICAvLyBzZWUgaHR0cHM6Ly9zZWJsYWdhcmRlLndvcmRwcmVzcy5jb20vMjAxMi8wMS8wOC9waS1vci1ub3QtdG8tcGktaW4tZ2FtZS1saWdodGluZy1lcXVhdGlvbi9cXG4gICAgcmV0dXJuICgxLjAgLSBzcGVjdWxhcldlaWdodCAqIEYpICogKGRpZmZ1c2VDb2xvciAvIE1fUEkpO1xcbn1cXG5cXG52ZWMzIEJSREZfc3BlY3VsYXJHR1hJcmlkZXNjZW5jZSh2ZWMzIGYwLCB2ZWMzIGY5MCwgdmVjMyBpcmlkZXNjZW5jZUZyZXNuZWwsIGZsb2F0IGFscGhhUm91Z2huZXNzLCBmbG9hdCBpcmlkZXNjZW5jZUZhY3RvciwgZmxvYXQgc3BlY3VsYXJXZWlnaHQsIGZsb2F0IFZkb3RILCBmbG9hdCBOZG90TCwgZmxvYXQgTmRvdFYsIGZsb2F0IE5kb3RIKVxcbntcXG4gICAgdmVjMyBGID0gbWl4KFNjaGxpY2tfdG9fRjAoZjAsIGY5MCwgVmRvdEgpLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlRmFjdG9yKTtcXG4gICAgZmxvYXQgVmlzID0gdl9HR1hDb3JyZWxhdGVkKE5kb3RMLCBOZG90ViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgICBmbG9hdCBEID0gZF9HR1goTmRvdEgsIGFscGhhUm91Z2huZXNzKTtcXG5cXG4gICAgcmV0dXJuIHNwZWN1bGFyV2VpZ2h0ICogRiAqIFZpcyAqIEQ7XFxufVxcblxcbiNlbmRpZiAvLyBSTl9VU0VfSVJJREVTQ0VOQ0VcXG5cXG5cXG5cXG5cXG5cXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuLy8gbGlnaHRpbmcgd2l0aCBhIHB1bmN0dWFsIGxpZ2h0XFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbnZlYzMgbGlnaHRpbmdXaXRoUHVuY3R1YWxMaWdodChcXG4gIExpZ2h0IGxpZ2h0LFxcbiAgdmVjMyBub3JtYWxfaW5Xb3JsZCxcXG4gIHZlYzMgdmlld0RpcmVjdGlvbixcXG4gIGZsb2F0IE5kb3RWLFxcbiAgdmVjMyBhbGJlZG8sXFxuICBmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzLFxcbiAgZmxvYXQgbWV0YWxsaWMsXFxuICB2ZWMzIEYwLFxcbiAgdmVjMyBGOTAsXFxuICBmbG9hdCBpb3IsXFxuICBmbG9hdCB0cmFuc21pc3Npb24sXFxuICBmbG9hdCBjbGVhcmNvYXQsXFxuICBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3MsXFxuICB2ZWMzIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLFxcbiAgZmxvYXQgVmRvdE5jLFxcbiAgdmVjMyBhdHRlbnVhdGlvbkNvbG9yLFxcbiAgZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSxcXG4gIGZsb2F0IGFuaXNvdHJvcHksXFxuICB2ZWMzIGFuaXNvdHJvcGljVCxcXG4gIHZlYzMgYW5pc290cm9waWNCLFxcbiAgZmxvYXQgQmRvdFYsXFxuICBmbG9hdCBUZG90VixcXG4gIHZlYzMgc2hlZW5Db2xvcixcXG4gIGZsb2F0IHNoZWVuUm91Z2huZXNzLFxcbiAgZmxvYXQgYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFYsXFxuICBmbG9hdCBpcmlkZXNjZW5jZUZhY3RvcixcXG4gIHZlYzMgaXJpZGVzY2VuY2VGcmVzbmVsLFxcbiAgZmxvYXQgc3BlY3VsYXJXZWlnaHRcXG4gIClcXG57XFxuICBmbG9hdCBhbHBoYVJvdWdobmVzcyA9IHBlcmNlcHR1YWxSb3VnaG5lc3MgKiBwZXJjZXB0dWFsUm91Z2huZXNzO1xcblxcbiAgLy8gRnJlc25lbFxcbiAgdmVjMyBoYWxmVmVjdG9yID0gbm9ybWFsaXplKGxpZ2h0LmRpcmVjdGlvbiArIHZpZXdEaXJlY3Rpb24pO1xcbiAgZmxvYXQgVmRvdEggPSBkb3Qodmlld0RpcmVjdGlvbiwgaGFsZlZlY3Rvcik7XFxuICB2ZWMzIEYgPSBmcmVzbmVsKEYwLCBGOTAsIFZkb3RIKTtcXG5cXG4gIGZsb2F0IE5kb3RMID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KG5vcm1hbF9pbldvcmxkLCBsaWdodC5kaXJlY3Rpb24pKTtcXG5cXG4gIC8vIERpZmZ1c2VcXG4jaWZkZWYgUk5fVVNFX0lSSURFU0NFTkNFXFxuICB2ZWMzIGRpZmZ1c2VCcmRmID0gQlJERl9sYW1iZXJ0aWFuSXJpZGVzY2VuY2UoRjAsIEY5MCwgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZUZhY3RvciwgYWxiZWRvLCBzcGVjdWxhcldlaWdodCwgVmRvdEgpO1xcbiNlbHNlXFxuICB2ZWMzIGRpZmZ1c2VCcmRmID0gQlJERl9sYW1iZXJ0aWFuKGFsYmVkbywgRiwgc3BlY3VsYXJXZWlnaHQpO1xcbiNlbmRpZlxcblxcbiAgdmVjMyBwdXJlRGlmZnVzZSA9IGRpZmZ1c2VCcmRmICogdmVjMyhOZG90TCkgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcblxcbiNpZmRlZiBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuICB2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KC12aWV3RGlyZWN0aW9uLCBub3JtYWxfaW5Xb3JsZCwgMS4wIC8gaW9yKTtcXG4gIExpZ2h0IHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlID0gbGlnaHQ7XFxuICB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5wb2ludFRvTGlnaHQgLT0gcmVmcmFjdGlvblZlY3RvcjtcXG4gIHZlYzMgdHJhbnNtaXR0ZWRMaWdodERpcmVjdGlvbkZyb21VbmRlclN1cmZhY2UgPSBub3JtYWxpemUodHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2UucG9pbnRUb0xpZ2h0KTtcXG4gIHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlLmRpcmVjdGlvbiA9IHRyYW5zbWl0dGVkTGlnaHREaXJlY3Rpb25Gcm9tVW5kZXJTdXJmYWNlO1xcblxcbiAgdmVjMyBIdCA9IG5vcm1hbGl6ZSh2aWV3RGlyZWN0aW9uICsgdHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2UuZGlyZWN0aW9uKTtcXG4gIGZsb2F0IE5kb3RIdCA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChub3JtYWxfaW5Xb3JsZCwgSHQpKTtcXG4gIGZsb2F0IE5kb3RMdCA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChub3JtYWxfaW5Xb3JsZCwgdHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2UuZGlyZWN0aW9uKSk7XFxuXFxuICB2ZWMzIHRyYW5zbWl0dGVkQ29udHJpYiA9ICh2ZWMzKDEuMCkgLSBGKSAqIHNwZWN1bGFyX2J0ZGYoYWxwaGFSb3VnaG5lc3MsIE5kb3RMdCwgTmRvdFYsIE5kb3RIdCkgKiBhbGJlZG8gKiB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcblxcbiNpZmRlZiBSTl9VU0VfVk9MVU1FXFxuICB0cmFuc21pdHRlZENvbnRyaWIgPSB2b2x1bWVBdHRlbnVhdGlvbihhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCB0cmFuc21pdHRlZENvbnRyaWIsIGxlbmd0aCh0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5wb2ludFRvTGlnaHQpKTtcXG4jZW5kaWYgLy8gUk5fVVNFX1ZPTFVNRVxcblxcbiAgdmVjMyBkaWZmdXNlQ29udHJpYiA9IG1peChwdXJlRGlmZnVzZSwgdmVjMyh0cmFuc21pdHRlZENvbnRyaWIpLCB0cmFuc21pc3Npb24pO1xcbiNlbHNlXFxuICB2ZWMzIGRpZmZ1c2VDb250cmliID0gcHVyZURpZmZ1c2U7XFxuI2VuZGlmIC8vIFJOX1VTRV9UUkFOU01JU1NJT05cXG5cXG4gIC8vIFNwZWN1bGFyXFxuICBmbG9hdCBOZG90SCA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChub3JtYWxfaW5Xb3JsZCwgaGFsZlZlY3RvcikpO1xcblxcbiNpZmRlZiBSTl9VU0VfSVJJREVTQ0VOQ0VcXG4gIHZlYzMgc3BlY3VsYXJDb250cmliID0gQlJERl9zcGVjdWxhckdHWElyaWRlc2NlbmNlKEYwLCBGOTAsIGlyaWRlc2NlbmNlRnJlc25lbCwgYWxwaGFSb3VnaG5lc3MsIGlyaWRlc2NlbmNlRmFjdG9yLCBzcGVjdWxhcldlaWdodCwgVmRvdEgsIE5kb3RMLCBOZG90ViwgTmRvdEgpICogdmVjMyhOZG90TCkgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiNlbGlmIGRlZmluZWQoUk5fVVNFX0FOSVNPVFJPUFkpXFxuICBmbG9hdCBUZG90TCA9IGRvdChhbmlzb3Ryb3BpY1QsIGxpZ2h0LmRpcmVjdGlvbik7XFxuICBmbG9hdCBCZG90TCA9IGRvdChhbmlzb3Ryb3BpY0IsIGxpZ2h0LmRpcmVjdGlvbik7XFxuICBmbG9hdCBUZG90SCA9IGRvdChhbmlzb3Ryb3BpY1QsIGhhbGZWZWN0b3IpO1xcbiAgZmxvYXQgQmRvdEggPSBkb3QoYW5pc290cm9waWNCLCBoYWxmVmVjdG9yKTtcXG4gIHZlYzMgc3BlY3VsYXJDb250cmliID0gQlJERl9zcGVjdWxhckFuaXNvdHJvcGljR0dYKEYsIGFscGhhUm91Z2huZXNzLCBWZG90SCwgTmRvdEwsIE5kb3RWLCBOZG90SCwgQmRvdFYsIFRkb3RWLCBUZG90TCwgQmRvdEwsIFRkb3RILCBCZG90SCwgYW5pc290cm9weSkgKiB2ZWMzKE5kb3RMKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuI2Vsc2VcXG4gIHZlYzMgc3BlY3VsYXJDb250cmliID0gY29va190b3JyYW5jZV9zcGVjdWxhcl9icmRmKE5kb3RILCBOZG90TCwgTmRvdFYsIEYsIGFscGhhUm91Z2huZXNzLCBzcGVjdWxhcldlaWdodCkgKiB2ZWMzKE5kb3RMKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuI2VuZGlmIC8vIFJOX1VTRV9BTklTT1RST1BZXFxuXFxuICAvLyBCYXNlIExheWVyXFxuICB2ZWMzIGJhc2VMYXllciA9IGRpZmZ1c2VDb250cmliICsgc3BlY3VsYXJDb250cmliO1xcblxcbiNpZmRlZiBSTl9VU0VfU0hFRU5cXG4gIC8vIFNoZWVuXFxuICB2ZWMzIHNoZWVuQ29udHJpYiA9IHNoZWVuX2JyZGYoc2hlZW5Db2xvciwgc2hlZW5Sb3VnaG5lc3MsIE5kb3RMLCBOZG90ViwgTmRvdEgpICogTmRvdEwgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiAgZmxvYXQgYWxiZWRvU2hlZW5TY2FsaW5nID0gbWluKFxcbiAgICBhbGJlZG9TaGVlblNjYWxpbmdOZG90VixcXG4gICAgMS4wIC0gbWF4MyhzaGVlbkNvbG9yKSAqIHRleHR1cmUodV9zaGVlbkx1dFRleHR1cmUsIHZlYzIoTmRvdEwsIHNoZWVuUm91Z2huZXNzKSkucik7XFxuICB2ZWMzIGNvbG9yID0gc2hlZW5Db250cmliICsgYmFzZUxheWVyICogYWxiZWRvU2hlZW5TY2FsaW5nO1xcbiNlbHNlXFxuICB2ZWMzIGNvbG9yID0gYmFzZUxheWVyO1xcbiAgZmxvYXQgYWxiZWRvU2hlZW5TY2FsaW5nID0gMS4wO1xcbiNlbmRpZiAvLyBSTl9VU0VfU0hFRU5cXG5cXG4jaWZkZWYgUk5fVVNFX0NMRUFSQ09BVFxcbiAgLy8gQ2xlYXIgQ29hdCBMYXllclxcbiAgZmxvYXQgTmRvdEhjID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLCBoYWxmVmVjdG9yKSk7XFxuICBmbG9hdCBMZG90TmMgPSBzYXR1cmF0ZUVwc2lsb25Ub09uZShkb3QobGlnaHQuZGlyZWN0aW9uLCBjbGVhcmNvYXROb3JtYWxfaW5Xb3JsZCkpO1xcbiAgdmVjMyBjb2F0ZWQgPSBjb2F0ZWRfbWF0ZXJpYWxfcyhjb2xvciwgcGVyY2VwdHVhbFJvdWdobmVzcyxcXG4gICAgY2xlYXJjb2F0Um91Z2huZXNzLCBjbGVhcmNvYXQsIFZkb3ROYywgTGRvdE5jLCBOZG90SGMpO1xcbiAgdmVjMyBmaW5hbENvbG9yID0gY29hdGVkO1xcbiNlbHNlXFxuICB2ZWMzIGZpbmFsQ29sb3IgPSBjb2xvcjtcXG4jZW5kaWYgLy8gUk5fVVNFX0NMRUFSQ09BVFxcblxcbiAgcmV0dXJuIGZpbmFsQ29sb3I7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxuI2lmZGVmIFJOX1VTRV9TSEFET1dfTUFQUElOR1xcblxcbmNvbnN0IGZsb2F0IGdfbWluVmFyaWFuY2UgPSAwLjAwMDAxO1xcblxcbmZsb2F0IGNoZWJ5c2hldlVwcGVyQm91bmQodmVjMiBtb21lbnRzLCBmbG9hdCB0KSB7XFxuICBmbG9hdCBwID0gKHQgPD0gbW9tZW50cy54KSA/IDEuMCA6IDAuMDtcXG5cXG4gIGZsb2F0IHZhcmlhbmNlID0gbW9tZW50cy55IC0gc3EobW9tZW50cy54KTtcXG4gIHZhcmlhbmNlID0gbWF4KHZhcmlhbmNlLCBnX21pblZhcmlhbmNlKTtcXG5cXG4gIGZsb2F0IGQgPSB0IC0gbW9tZW50cy54O1xcbiAgZmxvYXQgcF9tYXggPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIHNxKGQpKTtcXG5cXG4gIHJldHVybiBtYXgocCwgcF9tYXgpO1xcbn1cXG5cXG5mbG9hdCB2YXJpYW5jZVNoYWRvd0NvbnRyaWJ1dGlvbih2ZWMyIGxpZ2h0VGV4Q29vcmQsIGZsb2F0IGRpc3RhbmNlVG9MaWdodCkge1xcbiAgdmVjMiBtb21lbnRzID0gdGV4dHVyZSh1X2RlcHRoVGV4dHVyZSwgbGlnaHRUZXhDb29yZCkueHk7XFxuXFxuICByZXR1cm4gY2hlYnlzaGV2VXBwZXJCb3VuZChtb21lbnRzLCBkaXN0YW5jZVRvTGlnaHQpO1xcbn1cXG5cXG4jZW5kaWZcXG5cXG5cXG52ZWMzIGdldF9pcnJhZGlhbmNlKHZlYzMgbm9ybWFsX2ZvckVudiwgZmxvYXQgbWF0ZXJpYWxTSUQsIGl2ZWMyIGhkcmlGb3JtYXQpIHtcXG4gIHZlYzQgZGlmZnVzZVRleGVsID0gdGV4dHVyZSh1X2RpZmZ1c2VFbnZUZXh0dXJlLCBub3JtYWxfZm9yRW52KTtcXG5cXG4gIHZlYzMgaXJyYWRpYW5jZTtcXG4gIGlmIChoZHJpRm9ybWF0LnggPT0gMCkge1xcbiAgICAvLyBMRFJfU1JHQlxcbiAgICBpcnJhZGlhbmNlID0gc3JnYlRvTGluZWFyKGRpZmZ1c2VUZXhlbC5yZ2IpO1xcbiAgfVxcbiAgZWxzZSBpZiAoaGRyaUZvcm1hdC54ID09IDMpIHtcXG4gICAgLy8gUkdCRVxcbiAgICBpcnJhZGlhbmNlID0gZGlmZnVzZVRleGVsLnJnYiAqIHBvdygyLjAsIGRpZmZ1c2VUZXhlbC5hKjI1NS4wLTEyOC4wKTtcXG4gIH1cXG4gIGVsc2Uge1xcbiAgICBpcnJhZGlhbmNlID0gZGlmZnVzZVRleGVsLnJnYjtcXG4gIH1cXG5cXG4gIHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG5cXG5mbG9hdCBzY2FsZUZvckxvZChmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzLCBmbG9hdCBpb3IpXFxue1xcbiAgLy8gU2NhbGUgcm91Z2huZXNzIHRvIHRoZSByYW5nZSBbMCwgMV0sXFxuICAvLyBpb3I9MS4wIHdpbGwgYmUgc2NhbGUgMCxcXG4gIC8vIGlvcj0xLjUgd2lsbCBiZSBzY2FsZSAxLjAsXFxuICAvLyBpb3I9MiB3aWxsIGJlIHNjYWxlIDEuMCAoY2xhbXBlZClcXG4gIC8vXFxuXFxuICBmbG9hdCBzY2FsZSA9IGNsYW1wKGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjApO1xcbiAgcmV0dXJuIHBlcmNlcHR1YWxSb3VnaG5lc3MgKiBzY2FsZTtcXG59XFxuXFxuI2lmZGVmIFJOX1VTRV9UUkFOU01JU1NJT05cXG52ZWMzIGdldF9zYW1wbGVfZnJvbV9iYWNrYnVmZmVyKGZsb2F0IG1hdGVyaWFsU0lELCB2ZWMyIHNhbXBsZUNvb3JkLCBmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzLCBmbG9hdCBpb3IpIHtcXG4gIGl2ZWMyIHZyU3RhdGUgPSBnZXRfdnJTdGF0ZSgwLjAsIDApO1xcbiAgdmVjMiBiYWNrQnVmZmVyVGV4dHVyZVNpemUgPSB2ZWMyKHRleHR1cmVTaXplKHVfYmFja0J1ZmZlclRleHR1cmUsIDApKTtcXG4gIGZsb2F0IGJhY2tCdWZmZXJUZXh0dXJlTGVuZ3RoID0gbWF4KGJhY2tCdWZmZXJUZXh0dXJlU2l6ZS54LCBiYWNrQnVmZmVyVGV4dHVyZVNpemUueSk7XFxuXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuICAvLyBGb3IgVlJcXG4gIGJhY2tCdWZmZXJUZXh0dXJlTGVuZ3RoID0gbWF4KGJhY2tCdWZmZXJUZXh0dXJlU2l6ZS54IC8gMi4wLCBiYWNrQnVmZmVyVGV4dHVyZVNpemUueSk7XFxuICBzYW1wbGVDb29yZC54ID0gc2FtcGxlQ29vcmQueCAqIDAuNTtcXG4gIGlmICh2X2Rpc3BsYXlJZHggPT0gMS4wKSB7IC8vIEZvciByaWdodCBleWVcXG4gICAgc2FtcGxlQ29vcmQueCArPSAwLjU7XFxuICB9XFxuI2Vsc2VcXG4gIGlmICh2clN0YXRlLnggPT0gMSkgeyAvLyBGb3IgVlJcXG4gICAgYmFja0J1ZmZlclRleHR1cmVMZW5ndGggPSBtYXgoYmFja0J1ZmZlclRleHR1cmVTaXplLnggLyAyLjAsIGJhY2tCdWZmZXJUZXh0dXJlU2l6ZS55KTtcXG4gICAgc2FtcGxlQ29vcmQueCA9IHNhbXBsZUNvb3JkLnggKiAwLjU7XFxuICAgIGlmICh2clN0YXRlLnkgPT0gMSkgeyAvLyBGb3IgcmlnaHQgZXllXFxuICAgICAgc2FtcGxlQ29vcmQueCArPSAwLjU7XFxuICAgIH1cXG4gIH1cXG4jZW5kaWZcXG5cXG4gIGZsb2F0IGZyYW1lYnVmZmVyTG9kID0gbG9nMihiYWNrQnVmZmVyVGV4dHVyZUxlbmd0aCkgKiBzY2FsZUZvckxvZChwZXJjZXB0dWFsUm91Z2huZXNzLCBpb3IpO1xcblxcbiAgI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuICAgIHZlYzMgdHJhbnNtaXR0ZWRMaWdodCA9IHRleHR1cmUyRExvZEVYVCh1X2JhY2tCdWZmZXJUZXh0dXJlLCBzYW1wbGVDb29yZCwgZnJhbWVidWZmZXJMb2QpLnJnYjtcXG4gICNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICAgIHZlYzMgdHJhbnNtaXR0ZWRMaWdodCA9IHRleHR1cmVMb2QodV9iYWNrQnVmZmVyVGV4dHVyZSwgc2FtcGxlQ29vcmQsIGZyYW1lYnVmZmVyTG9kKS5yZ2I7XFxuICAjZWxzZVxcbiAgICB2ZWMzIHRyYW5zbWl0dGVkTGlnaHQgPSB0ZXh0dXJlKHVfYmFja0J1ZmZlclRleHR1cmUsIHNhbXBsZUNvb3JkKS5yZ2I7XFxuICAjZW5kaWZcXG5cXG4gIHJldHVybiB0cmFuc21pdHRlZExpZ2h0O1xcbn1cXG4jZW5kaWZcXG5cXG52ZWMzIGdldF9yYWRpYW5jZSh2ZWMzIHJlZmxlY3Rpb24sIGZsb2F0IGxvZCwgaXZlYzIgaGRyaUZvcm1hdCkge1xcbiAgI2lmZGVmIFdFQkdMMV9FWFRfU0hBREVSX1RFWFRVUkVfTE9EXFxuICAgIHZlYzQgc3BlY3VsYXJUZXhlbCA9IHRleHR1cmVDdWJlTG9kRVhUKHVfc3BlY3VsYXJFbnZUZXh0dXJlLCByZWZsZWN0aW9uLCBsb2QpO1xcbiAgI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gICAgdmVjNCBzcGVjdWxhclRleGVsID0gdGV4dHVyZUxvZCh1X3NwZWN1bGFyRW52VGV4dHVyZSwgcmVmbGVjdGlvbiwgbG9kKTtcXG4gICNlbHNlXFxuICAgIHZlYzQgc3BlY3VsYXJUZXhlbCA9IHRleHR1cmUodV9zcGVjdWxhckVudlRleHR1cmUsIHJlZmxlY3Rpb24pO1xcbiAgI2VuZGlmXFxuXFxuLy8gI3ByYWdtYSBzaGFkZXJpdHk6IHJlcXVpcmUoLi8uLi9jb21tb24vZmV0Y2hDdWJlVGV4dHVyZS5nbHNsKVxcblxcbiAgdmVjMyByYWRpYW5jZTtcXG4gIGlmIChoZHJpRm9ybWF0LnkgPT0gMCkge1xcbiAgICAvLyBMRFJfU1JHQlxcbiAgICByYWRpYW5jZSA9IHNyZ2JUb0xpbmVhcihzcGVjdWxhclRleGVsLnJnYik7XFxuICB9XFxuICBlbHNlIGlmIChoZHJpRm9ybWF0LnkgPT0gMykge1xcbiAgICAvLyBSR0JFXFxuICAgIHJhZGlhbmNlID0gc3BlY3VsYXJUZXhlbC5yZ2IgKiBwb3coMi4wLCBzcGVjdWxhclRleGVsLmEqMjU1LjAtMTI4LjApO1xcbiAgfVxcbiAgZWxzZSB7XFxuICAgIHJhZGlhbmNlID0gc3BlY3VsYXJUZXhlbC5yZ2I7XFxuICB9XFxuXFxuICByZXR1cm4gcmFkaWFuY2U7XFxufVxcblxcbi8vIGZyb20gZ2xURiBTYW1wbGUgVmlld2VyOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYtU2FtcGxlLVZpZXdlclxcbnZlYzMgZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KHZlYzMgbiwgdmVjMyB2LCBmbG9hdCB0aGlja25lc3MsIGZsb2F0IGlvcilcXG57XFxuICB2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KC12LCBub3JtYWxpemUobiksIDEuMCAvIGlvcik7XFxuICBtYXQ0IHdvcmxkTWF0cml4ID0gZ2V0X3dvcmxkTWF0cml4KHZfaW5zdGFuY2VJbmZvKTtcXG5cXG4gIHZlYzMgbW9kZWxTY2FsZTtcXG4gIG1vZGVsU2NhbGUueCA9IGxlbmd0aCh2ZWMzKHdvcmxkTWF0cml4WzBdLnh5eikpO1xcbiAgbW9kZWxTY2FsZS55ID0gbGVuZ3RoKHZlYzMod29ybGRNYXRyaXhbMV0ueHl6KSk7XFxuICBtb2RlbFNjYWxlLnogPSBsZW5ndGgodmVjMyh3b3JsZE1hdHJpeFsyXS54eXopKTtcXG5cXG4gIHJldHVybiBub3JtYWxpemUocmVmcmFjdGlvblZlY3RvcikgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlO1xcbn1cXG5cXG5zdHJ1Y3QgSWJsUmVzdWx0XFxue1xcbiAgdmVjMyBzcGVjdWxhcjtcXG4gIHZlYzMgZGlmZnVzZTtcXG4gIHZlYzMgRnNzRXNzO1xcbn07XFxuXFxuI2lmZGVmIFJOX1VTRV9JUklERVNDRU5DRVxcbklibFJlc3VsdCBnZXRJQkxSYWRpYW5jZUdHWFdpdGhJcmlkZXNjZW5jZShmbG9hdCBtYXRlcmlhbFNJRCwgZmxvYXQgTmRvdFYsIHZlYzMgdmlld0RpcmVjdGlvbiwgdmVjMyBhbGJlZG8sIHZlYzMgRjAsXFxuICBmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzLCB2ZWM0IGlibFBhcmFtZXRlciwgaXZlYzIgaGRyaUZvcm1hdCwgbWF0MyByb3RFbnZNYXRyaXgsXFxuICB2ZWMzIG5vcm1hbF9mb3JFbnYsIHZlYzMgcmVmbGVjdGlvbiwgdmVjMyBpcmlkZXNjZW5jZUZyZXNuZWwsIGZsb2F0IGlyaWRlc2NlbmNlLCBmbG9hdCBzcGVjdWxhcldlaWdodClcXG57XFxuICAvLyBnZXQgcmFkaWFuY2VcXG4gIGZsb2F0IG1pcENvdW50ID0gaWJsUGFyYW1ldGVyLng7XFxuICBmbG9hdCBsb2QgPSAocGVyY2VwdHVhbFJvdWdobmVzcyAqIChtaXBDb3VudCAtIDEuMCkpO1xcbiAgdmVjMyByYWRpYW5jZSA9IGdldF9yYWRpYW5jZShyZWZsZWN0aW9uLCBsb2QsIGhkcmlGb3JtYXQpO1xcblxcbiAgLy8gUm91Z2huZXNzIGRlcGVuZGVudCBmcmVzbmVsXFxuICB2ZWMzIGtTID0gZnJlc25lbFNjaGxpY2tSb3VnaG5lc3NXaXRoSXJpZGVzY2VuY2UoRjAsIE5kb3RWLCBwZXJjZXB0dWFsUm91Z2huZXNzLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlKTtcXG4gIHZlYzIgZl9hYiA9IGVudkJSREZBcHByb3gocGVyY2VwdHVhbFJvdWdobmVzcywgTmRvdFYpO1xcbiAgdmVjMyBGc3NFc3MgPSBrUyAqIGZfYWIueCArIGZfYWIueTtcXG4gIElibFJlc3VsdCByZXN1bHQ7XFxuICByZXN1bHQuRnNzRXNzID0gRnNzRXNzO1xcblxcbiAgLy8gU3BlY3VsYXIgSUJMXFxuICB2ZWMzIHNwZWN1bGFyID0gRnNzRXNzICogcmFkaWFuY2UgKiBzcGVjdWxhcldlaWdodDtcXG5cXG4gIC8vIHNjYWxlIHdpdGggdXNlciBwYXJhbWV0ZXJzXFxuICBmbG9hdCBJQkxTcGVjdWxhckNvbnRyaWJ1dGlvbiA9IGlibFBhcmFtZXRlci56O1xcbiAgc3BlY3VsYXIgKj0gSUJMU3BlY3VsYXJDb250cmlidXRpb247XFxuXFxuICByZXN1bHQuc3BlY3VsYXIgPSBzcGVjdWxhcjtcXG5cXG4gIHJldHVybiByZXN1bHQ7XFxufVxcblxcbklibFJlc3VsdCBnZXRJQkxSYWRpYW5jZUxhbWJlcnRpYW5XaXRoSXJpZGVzY2VuY2UoZmxvYXQgbWF0ZXJpYWxTSUQsIGZsb2F0IE5kb3RWLCB2ZWMzIHZpZXdEaXJlY3Rpb24sIHZlYzMgYWxiZWRvLCB2ZWMzIEYwLFxcbiAgZmxvYXQgcGVyY2VwdHVhbFJvdWdobmVzcywgdmVjNCBpYmxQYXJhbWV0ZXIsIGl2ZWMyIGhkcmlGb3JtYXQsIG1hdDMgcm90RW52TWF0cml4LFxcbiAgdmVjMyBub3JtYWxfZm9yRW52LCB2ZWMzIHJlZmxlY3Rpb24sIHZlYzMgaXJpZGVzY2VuY2VGMCwgZmxvYXQgaXJpZGVzY2VuY2UsIGZsb2F0IHNwZWN1bGFyV2VpZ2h0KVxcbntcXG4gIC8vIGdldCBpcnJhZGlhbmNlXFxuICB2ZWMzIGlycmFkaWFuY2UgPSBnZXRfaXJyYWRpYW5jZShub3JtYWxfZm9yRW52LCBtYXRlcmlhbFNJRCwgaGRyaUZvcm1hdCk7XFxuXFxuICAvLyBVc2UgdGhlIG1heGltdW0gY29tcG9uZW50IG9mIHRoZSBpcmlkZXNjZW5jZSBGcmVzbmVsIGNvbG9yXFxuICAvLyBNYXhpbXVtIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgUkdCIHZhbHVlIHRvIG5vdCBnZXQgaW52ZXJzZSBjb2xvcnMgZm9yIHRoZSBkaWZmdXNlIEJSREZcXG4gIHZlYzMgaXJpZGVzY2VuY2VGME1heCA9IHZlYzMobWF4KG1heChpcmlkZXNjZW5jZUYwLnIsIGlyaWRlc2NlbmNlRjAuZyksIGlyaWRlc2NlbmNlRjAuYikpO1xcblxcbiAgLy8gQmxlbmQgYmV0d2VlbiBiYXNlIEYwIGFuZCBpcmlkZXNjZW5jZSBGMFxcbiAgdmVjMyBtaXhlZEYwID0gbWl4KEYwLCBpcmlkZXNjZW5jZUYwTWF4LCBpcmlkZXNjZW5jZSk7XFxuXFxuICAvLyBSb3VnaG5lc3MgZGVwZW5kZW50IGZyZXNuZWxcXG4gIHZlYzMga1MgPSBmcmVzbmVsU2NobGlja1JvdWdobmVzcyhtaXhlZEYwLCBOZG90ViwgcGVyY2VwdHVhbFJvdWdobmVzcyk7XFxuICB2ZWMyIGZfYWIgPSBlbnZCUkRGQXBwcm94KHBlcmNlcHR1YWxSb3VnaG5lc3MsIE5kb3RWKTtcXG4gIHZlYzMgRnNzRXNzID0gc3BlY3VsYXJXZWlnaHQgKiBrUyAqIGZfYWIueCArIGZfYWIueTtcXG4gIElibFJlc3VsdCByZXN1bHQ7XFxuICByZXN1bHQuRnNzRXNzID0gRnNzRXNzO1xcblxcbiAgLy8gTXVsdGlwbGUgc2NhdHRlcmluZywgRmRlei1BZ3VlcmEncyBhcHByb2FjaFxcbiAgZmxvYXQgRW1zID0gKDEuMCAtIChmX2FiLnggKyBmX2FiLnkpKTtcXG4gIHZlYzMgRl9hdmcgPSBzcGVjdWxhcldlaWdodCAqIChtaXhlZEYwICsgKDEuMCAtIG1peGVkRjApIC8gMjEuMCk7XFxuICB2ZWMzIEZtc0VtcyA9IEVtcyAqIEZzc0VzcyAqIEZfYXZnIC8gKDEuMCAtIEZfYXZnICogRW1zKTtcXG4gIHZlYzMga19EID0gYWxiZWRvICogKDEuMCAtIEZzc0VzcyAtIEZtc0Vtcyk7XFxuXFxuICAvLyBEaWZmdXNlIElCTFxcbiAgdmVjMyBkaWZmdXNlID0gKEZtc0VtcyArIGtfRCkgKiBpcnJhZGlhbmNlO1xcblxcbiAgLy8gc2NhbGUgd2l0aCB1c2VyIHBhcmFtZXRlcnNcXG4gIGZsb2F0IElCTERpZmZ1c2VDb250cmlidXRpb24gPSBpYmxQYXJhbWV0ZXIueTtcXG4gIGRpZmZ1c2UgKj0gSUJMRGlmZnVzZUNvbnRyaWJ1dGlvbjtcXG5cXG4gIHJlc3VsdC5kaWZmdXNlID0gZGlmZnVzZTtcXG5cXG4gIHJldHVybiByZXN1bHQ7XFxufVxcbiNlbmRpZiAvLyBSTl9VU0VfSVJJREVTQ0VOQ0VcXG5cXG5JYmxSZXN1bHQgZ2V0SUJMUmFkaWFuY2VMYW1iZXJ0aWFuKGZsb2F0IG1hdGVyaWFsU0lELCBmbG9hdCBOZG90ViwgdmVjMyB2aWV3RGlyZWN0aW9uLCB2ZWMzIGFsYmVkbywgdmVjMyBGMCxcXG4gIGZsb2F0IHBlcmNlcHR1YWxSb3VnaG5lc3MsIHZlYzQgaWJsUGFyYW1ldGVyLCBpdmVjMiBoZHJpRm9ybWF0LCBtYXQzIHJvdEVudk1hdHJpeCxcXG4gIHZlYzMgbm9ybWFsX2ZvckVudiwgdmVjMyByZWZsZWN0aW9uLCBmbG9hdCBzcGVjdWxhcldlaWdodClcXG57XFxuICAvLyBnZXQgaXJyYWRpYW5jZVxcbiAgdmVjMyBpcnJhZGlhbmNlID0gZ2V0X2lycmFkaWFuY2Uobm9ybWFsX2ZvckVudiwgbWF0ZXJpYWxTSUQsIGhkcmlGb3JtYXQpO1xcblxcbiAgLy8gUm91Z2huZXNzIGRlcGVuZGVudCBmcmVzbmVsXFxuICB2ZWMzIGtTID0gZnJlc25lbFNjaGxpY2tSb3VnaG5lc3MoRjAsIE5kb3RWLCBwZXJjZXB0dWFsUm91Z2huZXNzKTtcXG4gIHZlYzIgZl9hYiA9IGVudkJSREZBcHByb3gocGVyY2VwdHVhbFJvdWdobmVzcywgTmRvdFYpO1xcbiAgdmVjMyBGc3NFc3MgPSBzcGVjdWxhcldlaWdodCAqIGtTICogZl9hYi54ICsgZl9hYi55O1xcbiAgSWJsUmVzdWx0IHJlc3VsdDtcXG4gIHJlc3VsdC5Gc3NFc3MgPSBGc3NFc3M7XFxuXFxuICAvLyBNdWx0aXBsZSBzY2F0dGVyaW5nLCBGZGV6LUFndWVyYSdzIGFwcHJvYWNoXFxuICBmbG9hdCBFbXMgPSAoMS4wIC0gKGZfYWIueCArIGZfYWIueSkpO1xcbiAgdmVjMyBGX2F2ZyA9IHNwZWN1bGFyV2VpZ2h0ICogKEYwICsgKDEuMCAtIEYwKSAvIDIxLjApO1xcbiAgdmVjMyBGbXNFbXMgPSBFbXMgKiBGc3NFc3MgKiBGX2F2ZyAvICgxLjAgLSBGX2F2ZyAqIEVtcyk7XFxuICB2ZWMzIGtfRCA9IGFsYmVkbyAqICgxLjAgLSBGc3NFc3MgLSBGbXNFbXMpO1xcblxcbiAgLy8gRGlmZnVzZSBJQkxcXG4gIHZlYzMgZGlmZnVzZSA9IChGbXNFbXMgKyBrX0QpICogaXJyYWRpYW5jZTtcXG5cXG4gIC8vIHNjYWxlIHdpdGggdXNlciBwYXJhbWV0ZXJzXFxuICBmbG9hdCBJQkxEaWZmdXNlQ29udHJpYnV0aW9uID0gaWJsUGFyYW1ldGVyLnk7XFxuICBkaWZmdXNlICo9IElCTERpZmZ1c2VDb250cmlidXRpb247XFxuXFxuICByZXN1bHQuZGlmZnVzZSA9IGRpZmZ1c2U7XFxuXFxuICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5JYmxSZXN1bHQgZ2V0SUJMUmFkaWFuY2VHR1goZmxvYXQgbWF0ZXJpYWxTSUQsIGZsb2F0IE5kb3RWLCB2ZWMzIHZpZXdEaXJlY3Rpb24sIHZlYzMgYWxiZWRvLCB2ZWMzIEYwLFxcbiAgZmxvYXQgcGVyY2VwdHVhbFJvdWdobmVzcywgdmVjNCBpYmxQYXJhbWV0ZXIsIGl2ZWMyIGhkcmlGb3JtYXQsIG1hdDMgcm90RW52TWF0cml4LFxcbiAgdmVjMyBub3JtYWxfZm9yRW52LCB2ZWMzIHJlZmxlY3Rpb24sIGZsb2F0IHNwZWN1bGFyV2VpZ2h0KVxcbntcXG4gIC8vIGdldCByYWRpYW5jZVxcbiAgZmxvYXQgbWlwQ291bnQgPSBpYmxQYXJhbWV0ZXIueDtcXG4gIGZsb2F0IGxvZCA9IChwZXJjZXB0dWFsUm91Z2huZXNzICogKG1pcENvdW50IC0gMS4wKSk7XFxuICB2ZWMzIHJhZGlhbmNlID0gZ2V0X3JhZGlhbmNlKHJlZmxlY3Rpb24sIGxvZCwgaGRyaUZvcm1hdCk7XFxuXFxuICAvLyBSb3VnaG5lc3MgZGVwZW5kZW50IGZyZXNuZWxcXG4gIHZlYzMga1MgPSBmcmVzbmVsU2NobGlja1JvdWdobmVzcyhGMCwgTmRvdFYsIHBlcmNlcHR1YWxSb3VnaG5lc3MpO1xcbiAgdmVjMiBmX2FiID0gZW52QlJERkFwcHJveChwZXJjZXB0dWFsUm91Z2huZXNzLCBOZG90Vik7XFxuICB2ZWMzIEZzc0VzcyA9IGtTICogZl9hYi54ICsgZl9hYi55O1xcbiAgSWJsUmVzdWx0IHJlc3VsdDtcXG4gIHJlc3VsdC5Gc3NFc3MgPSBGc3NFc3M7XFxuXFxuICAvLyBTcGVjdWxhciBJQkxcXG4gIHZlYzMgc3BlY3VsYXIgPSBGc3NFc3MgKiByYWRpYW5jZSAqIHNwZWN1bGFyV2VpZ2h0O1xcblxcbiAgLy8gc2NhbGUgd2l0aCB1c2VyIHBhcmFtZXRlcnNcXG4gIGZsb2F0IElCTFNwZWN1bGFyQ29udHJpYnV0aW9uID0gaWJsUGFyYW1ldGVyLno7XFxuICBzcGVjdWxhciAqPSBJQkxTcGVjdWxhckNvbnRyaWJ1dGlvbjtcXG5cXG4gIHJlc3VsdC5zcGVjdWxhciA9IHNwZWN1bGFyO1xcblxcbiAgcmV0dXJuIHJlc3VsdDtcXG59XFxuXFxuI2lmZGVmIFJOX1VTRV9TSEVFTlxcbnZlYzMgc2hlZW5JQkwoZmxvYXQgTmRvdFYsIGZsb2F0IHNoZWVuUGVyY2VwdHVhbFJvdWdobmVzcywgdmVjMyBzaGVlbkNvbG9yLCB2ZWM0IGlibFBhcmFtZXRlciwgdmVjMyByZWZsZWN0aW9uLCBpdmVjMiBoZHJpRm9ybWF0KVxcbntcXG4gIGZsb2F0IG1pcENvdW50ID0gaWJsUGFyYW1ldGVyLng7XFxuICBmbG9hdCBsb2QgPSAoc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzICogKG1pcENvdW50IC0gMS4wKSk7XFxuXFxuICB2ZWMyIHNoZWVuTHV0VVYgPSB2ZWMyKE5kb3RWLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MpO1xcbiAgZmxvYXQgYnJkZiA9IHRleHR1cmUodV9zaGVlbkx1dFRleHR1cmUsIHNoZWVuTHV0VVYpLmI7XFxuICB2ZWMzIHNoZWVuTGlnaHQgPSBnZXRfcmFkaWFuY2UocmVmbGVjdGlvbiwgbG9kLCBoZHJpRm9ybWF0KTtcXG4gIGZsb2F0IElCTFNwZWN1bGFyQ29udHJpYnV0aW9uID0gaWJsUGFyYW1ldGVyLno7XFxuICBzaGVlbkxpZ2h0ICo9IElCTFNwZWN1bGFyQ29udHJpYnV0aW9uO1xcblxcbiAgcmV0dXJuIHNoZWVuTGlnaHQgKiBzaGVlbkNvbG9yICogYnJkZjtcXG59XFxuI2VuZGlmXFxuXFxudmVjMyBnZXROb3JtYWxGb3JFbnYobWF0MyByb3RFbnZNYXRyaXgsIHZlYzMgbm9ybWFsX2luV29ybGQsIGZsb2F0IG1hdGVyaWFsU0lEKSB7XFxuICB2ZWMzIG5vcm1hbF9mb3JFbnYgPSByb3RFbnZNYXRyaXggKiBub3JtYWxfaW5Xb3JsZDtcXG4gIGlmIChnZXRfaW52ZXJzZUVudmlyb25tZW50KG1hdGVyaWFsU0lELCAwKSkge1xcbiAgICBub3JtYWxfZm9yRW52LnggKj0gLTEuMDtcXG4gIH1cXG4gIHJldHVybiBub3JtYWxfZm9yRW52O1xcbn1cXG5cXG52ZWMzIGdldFJlZmxlY3Rpb24obWF0MyByb3RFbnZNYXRyaXgsIHZlYzMgdmlld0RpcmVjdGlvbiwgdmVjMyBub3JtYWxfaW5Xb3JsZCwgZmxvYXQgbWF0ZXJpYWxTSUQsIGZsb2F0IHBlcmNlcHR1YWxSb3VnaG5lc3MsIGZsb2F0IGFuaXNvdHJvcHksIHZlYzMgYW5pc290cm9weURpcmVjdGlvbikge1xcbiNpZmRlZiBSTl9VU0VfQU5JU09UUk9QWVxcblxcbiAgZmxvYXQgdGFuZ2VudFJvdWdobmVzcyA9IG1peChwZXJjZXB0dWFsUm91Z2huZXNzLCAxLjAsIGFuaXNvdHJvcHkgKiBhbmlzb3Ryb3B5KTtcXG4gIHZlYzMgIGFuaXNvdHJvcGljVGFuZ2VudCAgPSBjcm9zcyhhbmlzb3Ryb3B5RGlyZWN0aW9uLCB2aWV3RGlyZWN0aW9uKTtcXG4gIHZlYzMgIGFuaXNvdHJvcGljTm9ybWFsICAgPSBjcm9zcyhhbmlzb3Ryb3BpY1RhbmdlbnQsIGFuaXNvdHJvcHlEaXJlY3Rpb24pO1xcbiAgZmxvYXQgYmVuZEZhY3RvciAgICAgICAgICA9IDEuMCAtIGFuaXNvdHJvcHkgKiAoMS4wIC0gcGVyY2VwdHVhbFJvdWdobmVzcyk7XFxuICBmbG9hdCBiZW5kRmFjdG9yUG93NCAgICAgID0gYmVuZEZhY3RvciAqIGJlbmRGYWN0b3IgKiBiZW5kRmFjdG9yICogYmVuZEZhY3RvcjtcXG4gIHZlYzMgIGJlbnROb3JtYWwgICAgICAgICAgPSBub3JtYWxpemUobWl4KGFuaXNvdHJvcGljTm9ybWFsLCBub3JtYWxfaW5Xb3JsZCwgYmVuZEZhY3RvclBvdzQpKTtcXG4gIHZlYzMgcmVmbGVjdGlvbiA9IHJvdEVudk1hdHJpeCAqIHJlZmxlY3QoLXZpZXdEaXJlY3Rpb24sIGJlbnROb3JtYWwpO1xcbiNlbHNlXFxuICB2ZWMzIHJlZmxlY3Rpb24gPSByb3RFbnZNYXRyaXggKiByZWZsZWN0KC12aWV3RGlyZWN0aW9uLCBub3JtYWxfaW5Xb3JsZCk7XFxuI2VuZGlmXFxuICBpZiAoZ2V0X2ludmVyc2VFbnZpcm9ubWVudChtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgcmVmbGVjdGlvbi54ICo9IC0xLjA7XFxuICB9XFxuICByZXR1cm4gcmVmbGVjdGlvbjtcXG59XFxuXFxudmVjMyBJQkxDb250cmlidXRpb24oZmxvYXQgbWF0ZXJpYWxTSUQsIHZlYzMgbm9ybWFsX2luV29ybGQsIGZsb2F0IE5kb3RWLCB2ZWMzIHZpZXdEaXJlY3Rpb24sXFxuICB2ZWMzIGFsYmVkbywgdmVjMyBGMCwgZmxvYXQgcGVyY2VwdHVhbFJvdWdobmVzcywgZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzLCB2ZWMzIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLFxcbiAgZmxvYXQgY2xlYXJjb2F0LCBmbG9hdCBWZG90TmMsIHZlYzMgZ2VvbU5vcm1hbF9pbldvcmxkLCBmbG9hdCBjYW1lcmFTSUQsIGZsb2F0IHRyYW5zbWlzc2lvbiwgdmVjMyB2X3Bvc2l0aW9uX2luV29ybGQsXFxuICBmbG9hdCB0aGlja25lc3MsIHZlYzMgc2hlZW5Db2xvciwgZmxvYXQgc2hlZW5Sb3VnaG5lc3MsIGZsb2F0IGFsYmVkb1NoZWVuU2NhbGluZ05kb3RWLCBmbG9hdCBpb3IsXFxuICB2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbCwgdmVjMyBpcmlkZXNjZW5jZUYwLCBmbG9hdCBpcmlkZXNjZW5jZSwgZmxvYXQgYW5pc290cm9weSwgdmVjMyBhbmlzb3Ryb3B5RGlyZWN0aW9uLFxcbiAgZmxvYXQgc3BlY3VsYXJXZWlnaHQpXFxue1xcbiAgdmVjNCBpYmxQYXJhbWV0ZXIgPSBnZXRfaWJsUGFyYW1ldGVyKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IHJvdCA9IGlibFBhcmFtZXRlci53ICsgMy4xNDE1O1xcbiAgbWF0MyByb3RFbnZNYXRyaXggPSBtYXQzKGNvcyhyb3QpLCAwLjAsIC1zaW4ocm90KSwgMC4wLCAxLjAsIDAuMCwgc2luKHJvdCksIDAuMCwgY29zKHJvdCkpO1xcbiAgaXZlYzIgaGRyaUZvcm1hdCA9IGdldF9oZHJpRm9ybWF0KG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIHZlYzMgbm9ybWFsX2ZvckVudiA9IGdldE5vcm1hbEZvckVudihyb3RFbnZNYXRyaXgsIG5vcm1hbF9pbldvcmxkLCBtYXRlcmlhbFNJRCk7XFxuICB2ZWMzIHJlZmxlY3Rpb24gPSBnZXRSZWZsZWN0aW9uKHJvdEVudk1hdHJpeCwgdmlld0RpcmVjdGlvbiwgbm9ybWFsX2luV29ybGQsIG1hdGVyaWFsU0lELCBwZXJjZXB0dWFsUm91Z2huZXNzLCBhbmlzb3Ryb3B5LCBhbmlzb3Ryb3B5RGlyZWN0aW9uKTtcXG5cXG4gIC8vIElCTFxcbiAgI2lmZGVmIFJOX1VTRV9JUklERVNDRU5DRVxcbiAgICBJYmxSZXN1bHQgYmFzZVJhZGlhbmNlUmVzdWx0ID0gZ2V0SUJMUmFkaWFuY2VHR1hXaXRoSXJpZGVzY2VuY2UobWF0ZXJpYWxTSUQsIE5kb3RWLCB2aWV3RGlyZWN0aW9uLCBhbGJlZG8sIEYwLFxcbiAgICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBub3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlLCBzcGVjdWxhcldlaWdodCk7XFxuICAgIElibFJlc3VsdCBiYXNlTGFtYmVydGlhblJlc3VsdCA9IGdldElCTFJhZGlhbmNlTGFtYmVydGlhbldpdGhJcmlkZXNjZW5jZShtYXRlcmlhbFNJRCwgTmRvdFYsIHZpZXdEaXJlY3Rpb24sIGFsYmVkbywgRjAsXFxuICAgICAgcGVyY2VwdHVhbFJvdWdobmVzcywgaWJsUGFyYW1ldGVyLCBoZHJpRm9ybWF0LCByb3RFbnZNYXRyaXgsIG5vcm1hbF9mb3JFbnYsIHJlZmxlY3Rpb24sIGlyaWRlc2NlbmNlRjAsIGlyaWRlc2NlbmNlLCBzcGVjdWxhcldlaWdodCk7XFxuICAjZWxzZVxcbiAgICBJYmxSZXN1bHQgYmFzZVJhZGlhbmNlUmVzdWx0ID0gZ2V0SUJMUmFkaWFuY2VHR1gobWF0ZXJpYWxTSUQsIE5kb3RWLCB2aWV3RGlyZWN0aW9uLCBhbGJlZG8sIEYwLFxcbiAgICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBub3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBzcGVjdWxhcldlaWdodCk7XFxuICAgIElibFJlc3VsdCBiYXNlTGFtYmVydGlhblJlc3VsdCA9IGdldElCTFJhZGlhbmNlTGFtYmVydGlhbihtYXRlcmlhbFNJRCwgTmRvdFYsIHZpZXdEaXJlY3Rpb24sIGFsYmVkbywgRjAsXFxuICAgICAgcGVyY2VwdHVhbFJvdWdobmVzcywgaWJsUGFyYW1ldGVyLCBoZHJpRm9ybWF0LCByb3RFbnZNYXRyaXgsIG5vcm1hbF9mb3JFbnYsIHJlZmxlY3Rpb24sIHNwZWN1bGFyV2VpZ2h0KTtcXG4gICNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuICB2ZWMzIHJlZnJhY3RlZFJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheShnZW9tTm9ybWFsX2luV29ybGQsIHZpZXdEaXJlY3Rpb24sIHRoaWNrbmVzcywgaW9yKTtcXG4gIHZlYzMgcmVmcmFjdGVkUmF5RnJvbVZQb3NpdGlvbiA9IHZfcG9zaXRpb25faW5Xb3JsZCArIHJlZnJhY3RlZFJheTtcXG4gIHZlYzQgbmRjUG9pbnQgPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApICogZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKSAqIHZlYzQocmVmcmFjdGVkUmF5RnJvbVZQb3NpdGlvbiwgMS4wKTtcXG4gIHZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1BvaW50Lnh5IC8gbmRjUG9pbnQudztcXG4gIHJlZnJhY3Rpb25Db29yZHMgKz0gMS4wO1xcbiAgcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7XFxuICB2ZWMzIHRyYW5zbWl0dGVkTGlnaHQgPSBnZXRfc2FtcGxlX2Zyb21fYmFja2J1ZmZlcihtYXRlcmlhbFNJRCwgcmVmcmFjdGlvbkNvb3JkcywgcGVyY2VwdHVhbFJvdWdobmVzcywgaW9yKTtcXG5cXG4jaWZkZWYgUk5fVVNFX1ZPTFVNRVxcbiAgdmVjMyBhdHRlbnVhdGlvbkNvbG9yID0gZ2V0X2F0dGVudWF0aW9uQ29sb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSA9IGdldF9hdHRlbnVhdGlvbkRpc3RhbmNlKG1hdGVyaWFsU0lELCAwKTtcXG4gIHRyYW5zbWl0dGVkTGlnaHQgPSB2b2x1bWVBdHRlbnVhdGlvbihhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCB0cmFuc21pdHRlZExpZ2h0LCBsZW5ndGgocmVmcmFjdGVkUmF5KSk7XFxuI2VuZGlmXFxuXFxuICB2ZWMzIHRyYW5zbWlzc2lvbkNvbXAgPSAodmVjMygxLjApIC0gYmFzZVJhZGlhbmNlUmVzdWx0LkZzc0VzcykgKiB0cmFuc21pdHRlZExpZ2h0ICogYWxiZWRvO1xcbiAgdmVjMyBkaWZmdXNlID0gbWl4KGJhc2VMYW1iZXJ0aWFuUmVzdWx0LmRpZmZ1c2UsIHRyYW5zbWlzc2lvbkNvbXAsIHRyYW5zbWlzc2lvbik7XFxuICB2ZWMzIGJhc2UgPSBkaWZmdXNlICsgYmFzZVJhZGlhbmNlUmVzdWx0LnNwZWN1bGFyO1xcbiNlbHNlXFxuICB2ZWMzIGJhc2UgPSBiYXNlTGFtYmVydGlhblJlc3VsdC5kaWZmdXNlICsgYmFzZVJhZGlhbmNlUmVzdWx0LnNwZWN1bGFyO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfU0hFRU5cXG4gIHZlYzMgc2hlZW4gPSBzaGVlbklCTChOZG90Viwgc2hlZW5Sb3VnaG5lc3MsIHNoZWVuQ29sb3IsIGlibFBhcmFtZXRlciwgcmVmbGVjdGlvbiwgaGRyaUZvcm1hdCk7XFxuICB2ZWMzIGNvbG9yID0gc2hlZW4gKyBiYXNlICogYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFY7XFxuI2Vsc2VcXG4gIHZlYzMgY29sb3IgPSBiYXNlO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfQ0xFQVJDT0FUXFxuICBmbG9hdCBWZG90TmcgPSBkb3QoZ2VvbU5vcm1hbF9pbldvcmxkLCB2aWV3RGlyZWN0aW9uKTtcXG4gIHZlYzMgY2xlYXJjb2F0Tm9ybWFsX2ZvckVudiA9IGdldE5vcm1hbEZvckVudihyb3RFbnZNYXRyaXgsIG5vcm1hbF9pbldvcmxkLCBtYXRlcmlhbFNJRCk7XFxuICBJYmxSZXN1bHQgY29hdFJlc3VsdCA9IGdldElCTFJhZGlhbmNlR0dYKG1hdGVyaWFsU0lELCBWZG90TmMsIHZpZXdEaXJlY3Rpb24sIHZlYzMoMC4wKSwgRjAsXFxuICAgIGNsZWFyY29hdFJvdWdobmVzcywgaWJsUGFyYW1ldGVyLCBoZHJpRm9ybWF0LCByb3RFbnZNYXRyaXgsIGNsZWFyY29hdE5vcm1hbF9mb3JFbnYsIHJlZmxlY3Rpb24sIHNwZWN1bGFyV2VpZ2h0KTtcXG4gIHZlYzMgY29hdExheWVyID0gY29hdFJlc3VsdC5zcGVjdWxhcjtcXG5cXG4gIGZsb2F0IGNsZWFyY29hdEZyZXNuZWwgPSAwLjA0ICsgKDEuMCAtIDAuMDQpICogcG93KDEuMCAtIGFicyhWZG90TmMpLCA1LjApO1xcbiAgdmVjMyBjb2F0ZWQgPSBjb2xvciAqIHZlYzMoMS4wIC0gY2xlYXJjb2F0ICogY2xlYXJjb2F0RnJlc25lbCkgKyB2ZWMzKGNvYXRMYXllciAqIGNsZWFyY29hdCk7XFxuICByZXR1cm4gY29hdGVkO1xcbiNlbHNlXFxuICByZXR1cm4gY29sb3I7XFxuI2VuZGlmXFxuXFxufVxcblxcblxcbmZsb2F0IGVkZ2VfcmF0aW8odmVjMyBiYXJ5MywgZmxvYXQgd2lyZWZyYW1lV2lkdGhJbm5lciwgZmxvYXQgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlKSB7XFxuICB2ZWMzIGQgPSBmd2lkdGgoYmFyeTMpO1xcbiAgdmVjMyB4ID0gYmFyeTMrdmVjMygxLjAgLSB3aXJlZnJhbWVXaWR0aElubmVyKSpkO1xcbiAgdmVjMyBhMyA9IHNtb290aHN0ZXAodmVjMygwLjApLCBkLCB4KTtcXG4gIGZsb2F0IGZhY3RvciA9IG1pbihtaW4oYTMueCwgYTMueSksIGEzLnopO1xcblxcbiAgcmV0dXJuIGNsYW1wKCgxLjAgLSBmYWN0b3IpLCAwLjAsIDEuMCk7XFxufVxcblxcbnZlYzIgZ2V0VGV4Y29vcmQoaW50IHRleGNvb3JkSW5kZXgpIHtcXG4gIHZlYzIgdGV4Y29vcmQ7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IHZfdGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IHZfdGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IHZfdGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuXFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBtYXQzIGdldFRCTih2ZWMzIG5vcm1hbF9pbldvcmxkLCB2ZWMzIHZpZXdWZWN0b3IsIHZlYzIgdGV4Y29vcmQpIHtcXG4gICAgdmVjMyB0YW5nZW50X2luV29ybGQgPSBub3JtYWxpemUodl90YW5nZW50X2luV29ybGQpO1xcbiAgICB2ZWMzIGJpbm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUodl9iaW5vcm1hbF9pbldvcmxkKTtcXG4gICAgbWF0MyB0Ym5NYXRfdGFuZ2VudF90b193b3JsZCA9IG1hdDModGFuZ2VudF9pbldvcmxkLCBiaW5vcm1hbF9pbldvcmxkLCBub3JtYWxfaW5Xb3JsZCk7XFxuXFxuICAgIHJldHVybiB0Ym5NYXRfdGFuZ2VudF90b193b3JsZDtcXG4gIH1cXG4jZWxzZVxcbiAgICAvLyBUaGlzIGlzIGJhc2VkIG9uIGh0dHA6Ly93d3cudGhldGVudGhwbGFuZXQuZGUvYXJjaGl2ZXMvMTE4MFxcbiAgICBtYXQzIGNvdGFuZ2VudF9mcmFtZSh2ZWMzIG5vcm1hbF9pbldvcmxkLCB2ZWMzIHBvc2l0aW9uLCB2ZWMyIHV2KSB7XFxuICAgICAgdXYgPSBnbF9Gcm9udEZhY2luZyA/IHV2IDogLXV2O1xcblxcbiAgICAgIC8vIGdldCBlZGdlIHZlY3RvcnMgb2YgdGhlIHBpeGVsIHRyaWFuZ2xlXFxuICAgICAgdmVjMyBkcDEgPSBkRmR4KHBvc2l0aW9uKTtcXG4gICAgICB2ZWMzIGRwMiA9IGRGZHkocG9zaXRpb24pO1xcbiAgICAgIHZlYzIgZHV2MSA9IGRGZHgodXYpO1xcbiAgICAgIHZlYzIgZHV2MiA9IGRGZHkodXYpO1xcblxcbiAgICAgIC8vIHNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtXFxuICAgICAgdmVjMyBkcDJwZXJwID0gY3Jvc3MoZHAyLCBub3JtYWxfaW5Xb3JsZCk7XFxuICAgICAgdmVjMyBkcDFwZXJwID0gY3Jvc3Mobm9ybWFsX2luV29ybGQsIGRwMSk7XFxuICAgICAgdmVjMyB0YW5nZW50ID0gZHAycGVycCAqIGR1djEueCArIGRwMXBlcnAgKiBkdXYyLng7XFxuICAgICAgdmVjMyBiaXRhbmdlbnQgPSBkcDJwZXJwICogZHV2MS55ICsgZHAxcGVycCAqIGR1djIueTtcXG4gICAgICBiaXRhbmdlbnQgKj0gLTEuMDtcXG5cXG4gICAgICAvLyBjb25zdHJ1Y3QgYSBzY2FsZS1pbnZhcmlhbnQgZnJhbWVcXG4gICAgICBmbG9hdCBpbnZNYXQgPSBpbnZlcnNlc3FydChtYXgoZG90KHRhbmdlbnQsIHRhbmdlbnQpLCBkb3QoYml0YW5nZW50LCBiaXRhbmdlbnQpKSk7XFxuICAgICAgcmV0dXJuIG1hdDModGFuZ2VudCAqIGludk1hdCwgYml0YW5nZW50ICogaW52TWF0LCBub3JtYWxfaW5Xb3JsZCk7XFxuICAgIH1cXG5cXG4gICAgbWF0MyBnZXRUQk4odmVjMyBub3JtYWxfaW5Xb3JsZCwgdmVjMyB2aWV3VmVjdG9yLCB2ZWMyIHRleGNvb3JkKSB7XFxuICAgICAgbWF0MyB0Ym5NYXRfdGFuZ2VudF90b193b3JsZCA9IGNvdGFuZ2VudF9mcmFtZShub3JtYWxfaW5Xb3JsZCwgLXZpZXdWZWN0b3IsIHRleGNvb3JkKTtcXG5cXG4gICAgICByZXR1cm4gdGJuTWF0X3RhbmdlbnRfdG9fd29ybGQ7XFxuICAgIH1cXG4jZW5kaWZcXG5cXG5cXG52b2lkIG1haW4gKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgLy8gVmlldyBkaXJlY3Rpb25cXG4gIHZlYzMgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcbiAgdmVjMyB2aWV3VmVjdG9yID0gdmlld1Bvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkLnh5ejtcXG4gIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2aWV3VmVjdG9yKTtcXG5cXG4gIC8vIEJhc2VDb2xvclxcbiAgdmVjMyBiYXNlQ29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xcbiAgZmxvYXQgYWxwaGEgPSAxLjA7XFxuICB2ZWM0IGJhc2VDb2xvckZhY3RvciA9IGdldF9iYXNlQ29sb3JGYWN0b3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYgKHZfY29sb3IgIT0gYmFzZUNvbG9yICYmIGJhc2VDb2xvckZhY3Rvci5yZ2IgIT0gYmFzZUNvbG9yKSB7XFxuICAgIGJhc2VDb2xvciA9IHZfY29sb3IgKiBiYXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGJhc2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmICh2X2NvbG9yID09IGJhc2VDb2xvcikge1xcbiAgICBiYXNlQ29sb3IgPSBiYXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGJhc2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmIChiYXNlQ29sb3JGYWN0b3IucmdiID09IGJhc2VDb2xvcikge1xcbiAgICBiYXNlQ29sb3IgPSB2X2NvbG9yO1xcbiAgfSBlbHNlIHtcXG4gICAgYmFzZUNvbG9yID0gdmVjMygxLjAsIDEuMCwgMS4wKTtcXG4gIH1cXG4gIHZlYzQgYmFzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9iYXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IGJhc2VDb2xvclRleHR1cmVSb3RhdGlvbiA9IGdldF9iYXNlQ29sb3JUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgaW50IGJhc2VDb2xvclRleGNvb3JkSW5kZXggPSBnZXRfYmFzZUNvbG9yVGV4Y29vcmRJbmRleChtYXRlcmlhbFNJRCwgMCk7XFxuICB2ZWMyIGJhc2VDb2xvclRleGNvb3JkID0gZ2V0VGV4Y29vcmQoYmFzZUNvbG9yVGV4Y29vcmRJbmRleCk7XFxuICB2ZWMyIGJhc2VDb2xvclRleFV2ID0gdXZUcmFuc2Zvcm0oYmFzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybS54eSwgYmFzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybS56dywgYmFzZUNvbG9yVGV4dHVyZVJvdGF0aW9uLCBiYXNlQ29sb3JUZXhjb29yZCk7XFxuICB2ZWM0IHRleHR1cmVDb2xvciA9IHRleHR1cmUodV9iYXNlQ29sb3JUZXh0dXJlLCBiYXNlQ29sb3JUZXhVdik7XFxuICBiYXNlQ29sb3IgKj0gc3JnYlRvTGluZWFyKHRleHR1cmVDb2xvci5yZ2IpO1xcbiAgYWxwaGEgKj0gdGV4dHVyZUNvbG9yLmE7XFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfTUFTS1xcbiAgZmxvYXQgYWxwaGFDdXRvZmYgPSBnZXRfYWxwaGFDdXRvZmYobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYgKGFscGhhIDwgYWxwaGFDdXRvZmYpIHtcXG4gICAgZGlzY2FyZDtcXG4gIH1cXG4jZW5kaWZcXG5cXG5cXG4gIC8vIE5vcm1hbFxcbiAgdmVjMyBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZSh2X25vcm1hbF9pbldvcmxkKTtcXG4gIHZlYzMgZ2VvbU5vcm1hbF9pbldvcmxkID0gbm9ybWFsX2luV29ybGQ7XFxuICB2ZWM0IG5vcm1hbFRleHR1cmVUcmFuc2Zvcm0gPSBnZXRfbm9ybWFsVGV4dHVyZVRyYW5zZm9ybShtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCBub3JtYWxUZXh0dXJlUm90YXRpb24gPSBnZXRfbm9ybWFsVGV4dHVyZVJvdGF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG4gIGludCBub3JtYWxUZXhjb29yZEluZGV4ID0gZ2V0X25vcm1hbFRleGNvb3JkSW5kZXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBub3JtYWxUZXhjb29yZCA9IGdldFRleGNvb3JkKG5vcm1hbFRleGNvb3JkSW5kZXgpO1xcbiAgdmVjMiBub3JtYWxUZXhVdiA9IHV2VHJhbnNmb3JtKG5vcm1hbFRleHR1cmVUcmFuc2Zvcm0ueHksIG5vcm1hbFRleHR1cmVUcmFuc2Zvcm0uencsIG5vcm1hbFRleHR1cmVSb3RhdGlvbiwgbm9ybWFsVGV4Y29vcmQpO1xcbiAgbWF0MyBUQk4gPSBnZXRUQk4obm9ybWFsX2luV29ybGQsIHZpZXdWZWN0b3IsIG5vcm1hbFRleFV2KTtcXG4gICNpZmRlZiBSTl9VU0VfTk9STUFMX1RFWFRVUkVcXG4gICAgdmVjMyBub3JtYWxUZXhWYWx1ZSA9IHRleHR1cmUodV9ub3JtYWxUZXh0dXJlLCBub3JtYWxUZXhVdikueHl6O1xcbiAgICBpZihub3JtYWxUZXhWYWx1ZS5iID49IDEyOC4wIC8gMjU1LjApIHtcXG4gICAgICAvLyBub3JtYWwgdGV4dHVyZSBpcyBleGlzdGVuY2VcXG4gICAgICB2ZWMzIG5vcm1hbFRleCA9IG5vcm1hbFRleFZhbHVlICogMi4wIC0gMS4wO1xcbiAgICAgIGZsb2F0IG5vcm1hbFNjYWxlID0gZ2V0X25vcm1hbFNjYWxlKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgICB2ZWMzIHNjYWxlZE5vcm1hbCA9IG5vcm1hbGl6ZShub3JtYWxUZXggKiB2ZWMzKG5vcm1hbFNjYWxlLCBub3JtYWxTY2FsZSwgMS4wKSk7XFxuICAgICAgbm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUoVEJOICogc2NhbGVkTm9ybWFsKTtcXG4gICAgfVxcbiAgI2VuZGlmXFxuXFxuI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAvLyBNZXRhbGxpYyAmIFJvdWdobmVzc1xcbiAgdmVjMiBtZXRhbGxpY1JvdWdobmVzc0ZhY3RvciA9IGdldF9tZXRhbGxpY1JvdWdobmVzc0ZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCBtZXRhbGxpYyA9IG1ldGFsbGljUm91Z2huZXNzRmFjdG9yLng7XFxuICB2ZWM0IG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9tZXRhbGxpY1JvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0obWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24gPSBnZXRfbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgaW50IG1ldGFsbGljUm91Z2huZXNzVGV4Y29vcmRJbmRleCA9IGdldF9tZXRhbGxpY1JvdWdobmVzc1RleGNvb3JkSW5kZXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBtZXRhbGxpY1JvdWdobmVzc1RleGNvb3JkID0gZ2V0VGV4Y29vcmQobWV0YWxsaWNSb3VnaG5lc3NUZXhjb29yZEluZGV4KTtcXG4gIHZlYzIgbWV0YWxsaWNSb3VnaG5lc3NUZXhVdiA9IHV2VHJhbnNmb3JtKG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybS54eSwgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtLnp3LCBtZXRhbGxpY1JvdWdobmVzc1RleHR1cmVSb3RhdGlvbiwgbWV0YWxsaWNSb3VnaG5lc3NUZXhjb29yZCk7XFxuICB2ZWM0IG9ybVRleGVsID0gdGV4dHVyZSh1X21ldGFsbGljUm91Z2huZXNzVGV4dHVyZSwgbWV0YWxsaWNSb3VnaG5lc3NUZXhVdik7XFxuICBmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzID0gb3JtVGV4ZWwuZyAqIG1ldGFsbGljUm91Z2huZXNzRmFjdG9yLnk7XFxuICBtZXRhbGxpYyA9IG9ybVRleGVsLmIgKiBtZXRhbGxpYztcXG4gIG1ldGFsbGljID0gY2xhbXAobWV0YWxsaWMsIDAuMCwgMS4wKTtcXG4gIHBlcmNlcHR1YWxSb3VnaG5lc3MgPSBjbGFtcChwZXJjZXB0dWFsUm91Z2huZXNzLCBjX01pblJvdWdobmVzcywgMS4wKTtcXG4gIGZsb2F0IGFscGhhUm91Z2huZXNzID0gcGVyY2VwdHVhbFJvdWdobmVzcyAqIHBlcmNlcHR1YWxSb3VnaG5lc3M7XFxuICAgIC8vIGZpbHRlciBOREYgZm9yIHNwZWN1bGFyIEFBIC0tLSBodHRwczovL2pjZ3Qub3JnL3B1Ymxpc2hlZC8wMDEwLzAyLzAyL1xcbiAgZmxvYXQgYWxwaGFSb3VnaG5lc3MyID0gYWxwaGFSb3VnaG5lc3MgKiBhbHBoYVJvdWdobmVzcztcXG4gIGZsb2F0IGZpbHRlcmVkUm91Z2huZXNzMiA9IElzb3Ryb3BpY05ERkZpbHRlcmluZyhub3JtYWxfaW5Xb3JsZCwgYWxwaGFSb3VnaG5lc3MyKTtcXG4gIHBlcmNlcHR1YWxSb3VnaG5lc3MgPSBzcXJ0KHNxcnQoZmlsdGVyZWRSb3VnaG5lc3MyKSk7XFxuXFxuICAvLyBBbGJlZG9cXG4gIHZlYzMgYmxhY2sgPSB2ZWMzKDAuMCk7XFxuICB2ZWMzIGFsYmVkbyA9IG1peChiYXNlQ29sb3IucmdiLCBibGFjaywgbWV0YWxsaWMpO1xcblxcbiAgLy8gTmRvdFZcXG4gIGZsb2F0IE5kb3RWID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KG5vcm1hbF9pbldvcmxkLCB2aWV3RGlyZWN0aW9uKSk7XFxuXFxuICAjaWZkZWYgUk5fVVNFX0FOSVNPVFJPUFlcXG4gICAgZmxvYXQgYW5pc290cm9weSA9IGdldF9hbmlzb3Ryb3B5U3RyZW5ndGgobWF0ZXJpYWxTSUQsIDApO1xcbiAgICB2ZWMyIGFuaXNvdHJvcHlSb3RhdGlvbiA9IGdldF9hbmlzb3Ryb3B5Um90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgICB2ZWMyIGRpcmVjdGlvbiA9IGFuaXNvdHJvcHlSb3RhdGlvbjtcXG4gICAgdmVjMyBhbmlzb3Ryb3B5VGV4ID0gdGV4dHVyZSh1X2FuaXNvdHJvcHlUZXh0dXJlLCBiYXNlQ29sb3JUZXhVdikucmdiO1xcbiAgICBkaXJlY3Rpb24gPSBhbmlzb3Ryb3B5VGV4LnJnICogMi4wIC0gdmVjMigxLjApO1xcbiAgICBkaXJlY3Rpb24gPSBtYXQyKGFuaXNvdHJvcHlSb3RhdGlvbi54LCBhbmlzb3Ryb3B5Um90YXRpb24ueSwgLWFuaXNvdHJvcHlSb3RhdGlvbi55LCBhbmlzb3Ryb3B5Um90YXRpb24ueCkgKiBub3JtYWxpemUoZGlyZWN0aW9uKTtcXG4gICAgYW5pc290cm9weSAqPSBhbmlzb3Ryb3B5VGV4LmI7XFxuICAgIHZlYzMgYW5pc290cm9waWNUID0gbm9ybWFsaXplKFRCTiAqIHZlYzMoZGlyZWN0aW9uLCAwLjApKTtcXG4gICAgdmVjMyBhbmlzb3Ryb3BpY0IgPSBub3JtYWxpemUoY3Jvc3MoZ2VvbU5vcm1hbF9pbldvcmxkLCBhbmlzb3Ryb3BpY1QpKTtcXG4gICAgZmxvYXQgQmRvdFYgPSBkb3QoYW5pc290cm9waWNCLCB2aWV3RGlyZWN0aW9uKTtcXG4gICAgZmxvYXQgVGRvdFYgPSBkb3QoYW5pc290cm9waWNULCB2aWV3RGlyZWN0aW9uKTtcXG4gICNlbHNlXFxuICAgIGZsb2F0IGFuaXNvdHJvcHkgPSAwLjA7XFxuICAgIHZlYzMgYW5pc290cm9waWNUID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gICAgdmVjMyBhbmlzb3Ryb3BpY0IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xcbiAgICBmbG9hdCBCZG90ViA9IDAuMDtcXG4gICAgZmxvYXQgVGRvdFYgPSAwLjA7XFxuICAjZW5kaWZcXG5cXG4gICAgLy8gQ2xlYXJjb2F0XFxuICAjaWZkZWYgUk5fVVNFX0NMRUFSQ09BVFxcbiAgICBmbG9hdCBjbGVhcmNvYXRGYWN0b3IgPSBnZXRfY2xlYXJDb2F0RmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgdmVjNCBjbGVhcmNvYXRUZXh0dXJlVHJhbnNmb3JtID0gZ2V0X2NsZWFyQ29hdFRleHR1cmVUcmFuc2Zvcm0obWF0ZXJpYWxTSUQsIDApO1xcbiAgICBmbG9hdCBjbGVhcmNvYXRUZXh0dXJlUm90YXRpb24gPSBnZXRfY2xlYXJDb2F0VGV4dHVyZVJvdGF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgaW50IGNsZWFyQ29hdFRleGNvb3JkSW5kZXggPSBnZXRfY2xlYXJDb2F0VGV4Y29vcmRJbmRleChtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHZlYzIgY2xlYXJDb2F0VGV4Y29vcmQgPSBnZXRUZXhjb29yZChjbGVhckNvYXRUZXhjb29yZEluZGV4KTtcXG4gICAgdmVjMiBjbGVhcmNvYXRUZXhVdiA9IHV2VHJhbnNmb3JtKGNsZWFyY29hdFRleHR1cmVUcmFuc2Zvcm0ueHksIGNsZWFyY29hdFRleHR1cmVUcmFuc2Zvcm0uencsIGNsZWFyY29hdFRleHR1cmVSb3RhdGlvbiwgY2xlYXJDb2F0VGV4Y29vcmQpO1xcbiAgICBmbG9hdCBjbGVhcmNvYXRUZXh0dXJlID0gdGV4dHVyZSh1X2NsZWFyQ29hdFRleHR1cmUsIGNsZWFyY29hdFRleFV2KS5yO1xcbiAgICBmbG9hdCBjbGVhcmNvYXQgPSBjbGVhcmNvYXRGYWN0b3IgKiBjbGVhcmNvYXRUZXh0dXJlO1xcbiAgI2Vsc2VcXG4gICAgZmxvYXQgY2xlYXJjb2F0ID0gMC4wO1xcbiAgI2VuZGlmIC8vIFJOX1VTRV9DTEVBUkNPQVRcXG5cXG4gICAgLy8gVHJhbnNtaXNzaW9uXFxuICAjaWZkZWYgUk5fVVNFX1RSQU5TTUlTU0lPTlxcbiAgICBmbG9hdCB0cmFuc21pc3Npb25GYWN0b3IgPSBnZXRfdHJhbnNtaXNzaW9uRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgdHJhbnNtaXNzaW9uVGV4dHVyZSA9IHRleHR1cmUodV90cmFuc21pc3Npb25UZXh0dXJlLCBiYXNlQ29sb3JUZXhVdikucjtcXG4gICAgZmxvYXQgdHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uRmFjdG9yICogdHJhbnNtaXNzaW9uVGV4dHVyZTtcXG4gICAgLy8gYWxwaGEgKj0gdHJhbnNtaXNzaW9uO1xcbiAgI2Vsc2VcXG4gICAgZmxvYXQgdHJhbnNtaXNzaW9uID0gMC4wO1xcbiAgI2VuZGlmIC8vIFJOX1VTRV9UUkFOU01JU1NJT05cXG5cXG4gICNpZmRlZiBSTl9VU0VfU1BFQ1VMQVJcXG4gICAgZmxvYXQgc3BlY3VsYXJUZXh0dXJlID0gdGV4dHVyZSh1X3NwZWN1bGFyVGV4dHVyZSwgYmFzZUNvbG9yVGV4VXYpLmE7XFxuICAgIGZsb2F0IHNwZWN1bGFyID0gZ2V0X3NwZWN1bGFyRmFjdG9yKG1hdGVyaWFsU0lELCAwKSAqIHNwZWN1bGFyVGV4dHVyZTtcXG4gICAgdmVjMyBzcGVjdWxhckNvbG9yVGV4dHVyZSA9IHNyZ2JUb0xpbmVhcih0ZXh0dXJlKHVfc3BlY3VsYXJDb2xvclRleHR1cmUsIGJhc2VDb2xvclRleFV2KS5yZ2IpO1xcbiAgICB2ZWMzIHNwZWN1bGFyQ29sb3IgPSBnZXRfc3BlY3VsYXJDb2xvckZhY3RvcihtYXRlcmlhbFNJRCwgMCkgKiBzcGVjdWxhckNvbG9yVGV4dHVyZTtcXG4gICNlbHNlXFxuICAgIGZsb2F0IHNwZWN1bGFyID0gMS4wO1xcbiAgICB2ZWMzIHNwZWN1bGFyQ29sb3IgPSB2ZWMzKDEuMCwgMS4wLCAxLjApO1xcbiAgI2VuZGlmIC8vIFJOX1VTRV9TUEVDVUxBUlxcblxcbiAgLy8gRjAsIEY5MFxcbiAgZmxvYXQgaW9yID0gZ2V0X2lvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBmbG9hdCBvdXRzaWRlSW9yID0gMS4wO1xcbiAgdmVjMyBkaWVsZWN0cmljU3BlY3VsYXJGMCA9IG1pbihcXG4gICAgKChpb3IgLSBvdXRzaWRlSW9yKSAvIChpb3IgKyBvdXRzaWRlSW9yKSkgKiAoKGlvciAtIG91dHNpZGVJb3IpIC8gKGlvciArIG91dHNpZGVJb3IpKSAqIHNwZWN1bGFyQ29sb3IsXFxuICAgIHZlYzMoMS4wKVxcbiAgICApICogc3BlY3VsYXI7XFxuICB2ZWMzIGRpZWxlY3RyaWNTcGVjdWxhckY5MCA9IHZlYzMoc3BlY3VsYXIpO1xcbiAgdmVjMyBGMCA9IG1peChkaWVsZWN0cmljU3BlY3VsYXJGMCwgYmFzZUNvbG9yLnJnYiwgbWV0YWxsaWMpO1xcbiAgdmVjMyBGOTAgPSBtaXgoZGllbGVjdHJpY1NwZWN1bGFyRjkwLCB2ZWMzKDEuMCksIG1ldGFsbGljKTtcXG5cXG4gIC8vIElyaWRlc2NlbmNlXFxuICAjaWZkZWYgUk5fVVNFX0lSSURFU0NFTkNFXFxuICAgIGZsb2F0IGlyaWRlc2NlbmNlRmFjdG9yID0gZ2V0X2lyaWRlc2NlbmNlRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgaXJpZGVzY2VuY2VUZXh0dXJlID0gdGV4dHVyZSh1X2lyaWRlc2NlbmNlVGV4dHVyZSwgYmFzZUNvbG9yVGV4VXYpLnI7XFxuICAgIGZsb2F0IGlyaWRlc2NlbmNlID0gaXJpZGVzY2VuY2VGYWN0b3IgKiBpcmlkZXNjZW5jZVRleHR1cmU7XFxuICAgIGZsb2F0IGlyaWRlc2NlbmNlSW9yID0gZ2V0X2lyaWRlc2NlbmNlSW9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgdGhpY2tuZXNzUmF0aW8gPSB0ZXh0dXJlKHVfaXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlLCBiYXNlQ29sb3JUZXhVdikucjtcXG4gICAgZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtID0gZ2V0X2lyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bShtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSA9IGdldF9pcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0obWF0ZXJpYWxTSUQsIDApO1xcbiAgICBmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzcyA9IG1peChpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0sIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSwgdGhpY2tuZXNzUmF0aW8pO1xcbiAgICB2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbCA9IGNhbGNJcmlkZXNjZW5jZSgxLjAsIGlyaWRlc2NlbmNlSW9yLCBOZG90ViwgaXJpZGVzY2VuY2VUaGlja25lc3MsIEYwKTtcXG4gICAgdmVjMyBpcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMChpcmlkZXNjZW5jZUZyZXNuZWwsIE5kb3RWKTtcXG4gICNlbHNlXFxuICAgIGZsb2F0IGlyaWRlc2NlbmNlID0gMC4wO1xcbiAgICB2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbCA9IHZlYzMoMC4wKTtcXG4gICAgdmVjMyBpcmlkZXNjZW5jZUYwID0gRjA7XFxuICAjZW5kaWYgLy8gUk5fVVNFX0lSSURFU0NFTkNFXFxuXFxuICAjaWZkZWYgUk5fVVNFX0NMRUFSQ09BVFxcbiAgICAvLyBDbGVhcmNvYXRcXG4gICAgZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzRmFjdG9yID0gZ2V0X2NsZWFyQ29hdFJvdWdobmVzc0ZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGludCBjbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZEluZGV4ID0gZ2V0X2NsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkSW5kZXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgICB2ZWMyIGNsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkID0gZ2V0VGV4Y29vcmQoY2xlYXJDb2F0Um91Z2huZXNzVGV4Y29vcmRJbmRleCk7XFxuICAgIHZlYzQgY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9jbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZVJvdGF0aW9uID0gZ2V0X2NsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVSb3RhdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHZlYzIgY2xlYXJjb2F0Um91Z2huZXNzVGV4VXYgPSB1dlRyYW5zZm9ybShjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtLnh5LCBjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtLnp3LCBjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24sIGNsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkKTtcXG4gICAgZmxvYXQgdGV4dHVyZVJvdWdobmVzc1RleHR1cmUgPSB0ZXh0dXJlKHVfY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZSwgY2xlYXJjb2F0Um91Z2huZXNzVGV4VXYpLmc7XFxuICAgIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcyA9IGNsZWFyY29hdFJvdWdobmVzc0ZhY3RvciAqIHRleHR1cmVSb3VnaG5lc3NUZXh0dXJlO1xcblxcbiAgICBpbnQgY2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmRJbmRleCA9IGdldF9jbGVhckNvYXROb3JtYWxUZXhjb29yZEluZGV4KG1hdGVyaWFsU0lELCAwKTtcXG4gICAgdmVjMiBjbGVhckNvYXROb3JtYWxUZXhjb29yZCA9IGdldFRleGNvb3JkKGNsZWFyQ29hdE5vcm1hbFRleGNvb3JkSW5kZXgpO1xcbiAgICB2ZWM0IGNsZWFyY29hdE5vcm1hbFRleHR1cmVUcmFuc2Zvcm0gPSBnZXRfY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybShtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGZsb2F0IGNsZWFyY29hdE5vcm1hbFRleHR1cmVSb3RhdGlvbiA9IGdldF9jbGVhckNvYXROb3JtYWxUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgICB2ZWMyIGNsZWFyY29hdE5vcm1hbFRleFV2ID0gdXZUcmFuc2Zvcm0oY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybS54eSwgY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybS56dywgY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZVJvdGF0aW9uLCBjbGVhckNvYXROb3JtYWxUZXhjb29yZCk7XFxuICAgIHZlYzMgdGV4dHVyZU5vcm1hbF90YW5nZW50ID0gdGV4dHVyZSh1X2NsZWFyQ29hdE5vcm1hbFRleHR1cmUsIGNsZWFyY29hdE5vcm1hbFRleFV2KS54eXogKiB2ZWMzKDIuMCkgLSB2ZWMzKDEuMCk7XFxuICAgIHZlYzMgY2xlYXJjb2F0Tm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUoVEJOICogdGV4dHVyZU5vcm1hbF90YW5nZW50KTtcXG4gICAgZmxvYXQgVmRvdE5jID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KHZpZXdEaXJlY3Rpb24sIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkKSk7XFxuICAjZWxzZVxcbiAgICBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3MgPSAwLjA7XFxuICAgIHZlYzMgY2xlYXJjb2F0Tm9ybWFsX2luV29ybGQgPSB2ZWMzKDAuMCk7XFxuICAgIGZsb2F0IFZkb3ROYyA9IDAuMDtcXG4gICNlbmRpZiAvLyBSTl9VU0VfQ0xFQVJDT0FUXFxuXFxuICAjaWZkZWYgUk5fVVNFX1ZPTFVNRVxcbiAgICAvLyBWb2x1bWVcXG4gICAgZmxvYXQgdGhpY2tuZXNzRmFjdG9yID0gZ2V0X3RoaWNrbmVzc0ZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGZsb2F0IHRoaWNrbmVzc1RleHR1cmUgPSB0ZXh0dXJlKHVfdGhpY2tuZXNzVGV4dHVyZSwgYmFzZUNvbG9yVGV4VXYpLmc7XFxuICAgIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgPSBnZXRfYXR0ZW51YXRpb25EaXN0YW5jZShtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHZlYzMgYXR0ZW51YXRpb25Db2xvciA9IGdldF9hdHRlbnVhdGlvbkNvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgdGhpY2tuZXNzID0gdGhpY2tuZXNzRmFjdG9yICogdGhpY2tuZXNzVGV4dHVyZTtcXG4gICNlbHNlXFxuICAgIGZsb2F0IHRoaWNrbmVzcyA9IDAuMDtcXG4gICAgdmVjMyBhdHRlbnVhdGlvbkNvbG9yID0gdmVjMygwLjApO1xcbiAgICBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlID0gMC4wMDAwMDE7XFxuICAjZW5kaWYgLy8gUk5fVVNFX1ZPTFVNRVxcblxcbiAgI2lmZGVmIFJOX1VTRV9TSEVFTlxcbiAgICAvLyBTaGVlblxcbiAgICB2ZWMzIHNoZWVuQ29sb3JGYWN0b3IgPSBnZXRfc2hlZW5Db2xvckZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHZlYzMgc2hlZW5Db2xvclRleHR1cmUgPSB0ZXh0dXJlKHVfc2hlZW5Db2xvclRleHR1cmUsIGJhc2VDb2xvclRleFV2KS5yZ2I7XFxuICAgIGZsb2F0IHNoZWVuUm91Z2huZXNzRmFjdG9yID0gZ2V0X3NoZWVuUm91Z2huZXNzRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgc2hlZW5Sb3VnaG5lc3NUZXh0dXJlID0gdGV4dHVyZSh1X3NoZWVuUm91Z2huZXNzVGV4dHVyZSwgYmFzZUNvbG9yVGV4VXYpLmE7XFxuICAgIHZlYzMgc2hlZW5Db2xvciA9IHNoZWVuQ29sb3JGYWN0b3IgKiBzaGVlbkNvbG9yVGV4dHVyZTtcXG4gICAgZmxvYXQgc2hlZW5Sb3VnaG5lc3MgPSBjbGFtcChzaGVlblJvdWdobmVzc0ZhY3RvciAqIHNoZWVuUm91Z2huZXNzVGV4dHVyZSwgMC4wMDAwMDEsIDEuMCk7XFxuICAgIGZsb2F0IGFsYmVkb1NoZWVuU2NhbGluZ05kb3RWID0gMS4wIC0gbWF4MyhzaGVlbkNvbG9yKSAqIHRleHR1cmUodV9zaGVlbkx1dFRleHR1cmUsIHZlYzIoTmRvdFYsIHNoZWVuUm91Z2huZXNzKSkucjtcXG4gICNlbHNlXFxuICAgIHZlYzMgc2hlZW5Db2xvciA9IHZlYzMoMC4wKTtcXG4gICAgZmxvYXQgc2hlZW5Sb3VnaG5lc3MgPSAwLjAwMDAwMTtcXG4gICAgZmxvYXQgYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFYgPSAxLjA7XFxuICAjZW5kaWYgLy8gUk5fVVNFX1NIRUVOXFxuXFxuICBydDAgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIGFscGhhKTtcXG5cXG4gIC8vIExpZ2h0aW5nXFxuICBmb3IgKGludCBpID0gMDsgaSA8IGxpZ2h0TnVtYmVyOyBpKyspIHtcXG4gICAgTGlnaHQgbGlnaHQgPSBnZXRMaWdodChpLCB2X3Bvc2l0aW9uX2luV29ybGQueHl6KTtcXG4gICAgcnQwLnh5eiArPSBsaWdodGluZ1dpdGhQdW5jdHVhbExpZ2h0KGxpZ2h0LCBub3JtYWxfaW5Xb3JsZCwgdmlld0RpcmVjdGlvbiwgTmRvdFYsIGFsYmVkbyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZXB0dWFsUm91Z2huZXNzLCBtZXRhbGxpYywgRjAsIEY5MCwgaW9yLCB0cmFuc21pc3Npb24sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJjb2F0LCBjbGVhcmNvYXRSb3VnaG5lc3MsIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLCBWZG90TmMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmlzb3Ryb3B5LCBhbmlzb3Ryb3BpY1QsIGFuaXNvdHJvcGljQiwgQmRvdFYsIFRkb3RWLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWVuQ29sb3IsIHNoZWVuUm91Z2huZXNzLCBhbGJlZG9TaGVlblNjYWxpbmdOZG90VixcXG4gICAgICAgICAgICAgICAgICAgICAgICBpcmlkZXNjZW5jZSwgaXJpZGVzY2VuY2VGcmVzbmVsLCBzcGVjdWxhcik7XFxuICB9XFxuXFxuICAjaWZkZWYgUk5fVVNFX1NIQURPV19NQVBQSU5HXFxuICAgIGZsb2F0IGJpYXMgPSAwLjAwMTtcXG4gICAgdmVjMiBzaGFkb3dDb29yZCA9IHZfc2hhZG93Q29vcmQueHkgLyB2X3NoYWRvd0Nvb3JkLnc7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWJ1c2lvbiA9IDEuMDtcXG4gICAgaWYgKHNoYWRvd0Nvb3JkLnggPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnggPD0gMS4wICYmIHNoYWRvd0Nvb3JkLnkgPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnkgPD0gMS4wKSB7XFxuICAgICAgc2hhZG93Q29udHJpYnVzaW9uID0gdmFyaWFuY2VTaGFkb3dDb250cmlidXRpb24oc2hhZG93Q29vcmQsICh2X3NoYWRvd0Nvb3JkLnogLSBiaWFzKS92X3NoYWRvd0Nvb3JkLncpO1xcbiAgICB9XFxuICAgIC8vIHJ0MC5yZ2IgPSBydDAucmdiICogKDAuNSArIHNoYWRvd0NvbnRyaWJ1c2lvbiAqIDAuNSk7XFxuICAgIHJ0MC5yZ2IgPSBydDAucmdiICogc2hhZG93Q29udHJpYnVzaW9uO1xcbiAgI2VuZGlmXFxuXFxuICB2ZWMzIGlibCA9IElCTENvbnRyaWJ1dGlvbihtYXRlcmlhbFNJRCwgbm9ybWFsX2luV29ybGQsIE5kb3RWLCB2aWV3RGlyZWN0aW9uLFxcbiAgICBhbGJlZG8sIEYwLCBwZXJjZXB0dWFsUm91Z2huZXNzLCBjbGVhcmNvYXRSb3VnaG5lc3MsIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLFxcbiAgICBjbGVhcmNvYXQsIFZkb3ROYywgZ2VvbU5vcm1hbF9pbldvcmxkLCBjYW1lcmFTSUQsIHRyYW5zbWlzc2lvbiwgdl9wb3NpdGlvbl9pbldvcmxkLnh5eiwgdGhpY2tuZXNzLFxcbiAgICBzaGVlbkNvbG9yLCBzaGVlblJvdWdobmVzcywgYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFYsXFxuICAgIGlvciwgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZUYwLCBpcmlkZXNjZW5jZSxcXG4gICAgYW5pc290cm9weSwgYW5pc290cm9waWNCLCBzcGVjdWxhcik7XFxuXFxuICBpbnQgb2NjbHVzaW9uVGV4Y29vcmRJbmRleCA9IGdldF9vY2NsdXNpb25UZXhjb29yZEluZGV4KG1hdGVyaWFsU0lELCAwKTtcXG4gIHZlYzIgb2NjbHVzaW9uVGV4Y29vcmQgPSBnZXRUZXhjb29yZChvY2NsdXNpb25UZXhjb29yZEluZGV4KTtcXG4gIHZlYzQgb2NjbHVzaW9uVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9vY2NsdXNpb25UZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IG9jY2x1c2lvblRleHR1cmVSb3RhdGlvbiA9IGdldF9vY2NsdXNpb25UZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBvY2NsdXNpb25UZXhVdiA9IHV2VHJhbnNmb3JtKG9jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm0ueHksIG9jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm0uencsIG9jY2x1c2lvblRleHR1cmVSb3RhdGlvbiwgb2NjbHVzaW9uVGV4Y29vcmQpO1xcbiAgZmxvYXQgb2NjbHVzaW9uID0gdGV4dHVyZSh1X29jY2x1c2lvblRleHR1cmUsIG9jY2x1c2lvblRleFV2KS5yO1xcbiAgZmxvYXQgb2NjbHVzaW9uU3RyZW5ndGggPSBnZXRfb2NjbHVzaW9uU3RyZW5ndGgobWF0ZXJpYWxTSUQsIDApO1xcblxcbiAgLy8gT2NjbHV0aW9uIHRvIEluZGlyZWN0IExpZ2h0c1xcbiAgcnQwLnh5eiArPSBtaXgoaWJsLCBpYmwgKiBvY2NsdXNpb24sIG9jY2x1c2lvblN0cmVuZ3RoKTtcXG4jZWxzZVxcbiAgcnQwID0gdmVjNChiYXNlQ29sb3IsIGFscGhhKTtcXG4jZW5kaWYgLy8gUk5fSVNfTElHSFRJTkdcXG5cXG4gIC8vIEVtaXNzaXZlXFxuICB2ZWMzIGVtaXNzaXZlRmFjdG9yID0gZ2V0X2VtaXNzaXZlRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGludCBlbWlzc2l2ZVRleGNvb3JkSW5kZXggPSBnZXRfZW1pc3NpdmVUZXhjb29yZEluZGV4KG1hdGVyaWFsU0lELCAwKTtcXG4gIHZlYzIgZW1pc3NpdmVUZXhjb29yZCA9IGdldFRleGNvb3JkKGVtaXNzaXZlVGV4Y29vcmRJbmRleCk7XFxuICB2ZWM0IGVtaXNzaXZlVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9lbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0obWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgZW1pc3NpdmVUZXh0dXJlUm90YXRpb24gPSBnZXRfZW1pc3NpdmVUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgdmVjMiBlbWlzc2l2ZVRleFV2ID0gdXZUcmFuc2Zvcm0oZW1pc3NpdmVUZXh0dXJlVHJhbnNmb3JtLnh5LCBlbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0uencsIGVtaXNzaXZlVGV4dHVyZVJvdGF0aW9uLCBlbWlzc2l2ZVRleGNvb3JkKTtcXG4gIGZsb2F0IGVtaXNzaXZlU3RyZW5ndGggPSBnZXRfZW1pc3NpdmVTdHJlbmd0aChtYXRlcmlhbFNJRCwgMCk7XFxuICB2ZWMzIGVtaXNzaXZlID0gZW1pc3NpdmVGYWN0b3IgKiBzcmdiVG9MaW5lYXIodGV4dHVyZSh1X2VtaXNzaXZlVGV4dHVyZSwgZW1pc3NpdmVUZXhVdikueHl6KSAqIGVtaXNzaXZlU3RyZW5ndGg7XFxuXFxuI2lmZGVmIFJOX1VTRV9DTEVBUkNPQVRcXG4gIHZlYzMgY29hdGVkX2VtaXNzaXZlID0gZW1pc3NpdmUgKiBtaXgodmVjMygxLjApLCB2ZWMzKDAuMDQgKyAoMS4wIC0gMC4wNCkgKiBwb3coMS4wIC0gTmRvdFYsIDUuMCkpLCBjbGVhcmNvYXQpO1xcbiAgcnQwLnh5eiArPSBjb2F0ZWRfZW1pc3NpdmU7XFxuI2Vsc2VcXG4gIHJ0MC54eXogKz0gZW1pc3NpdmU7XFxuI2VuZGlmIC8vIFJOX1VTRV9DTEVBUkNPQVRcXG5cXG4gIGJvb2wgaXNPdXRwdXRIRFIgPSBnZXRfaXNPdXRwdXRIRFIobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYoaXNPdXRwdXRIRFIpe1xcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxuICAgIHJldHVybjtcXG4gIH1cXG5cXG4gIC8vIFdpcmVmcmFtZVxcbiAgZmxvYXQgdGhyZXNob2xkID0gMC4wMDE7XFxuICB2ZWMzIHdpcmVmcmFtZSA9IGdldF93aXJlZnJhbWUobWF0ZXJpYWxTSUQsIDApO1xcbiAgZmxvYXQgd2lyZWZyYW1lV2lkdGhJbm5lciA9IHdpcmVmcmFtZS56O1xcbiAgZmxvYXQgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlID0gMS4wO1xcbiAgaWYgKHdpcmVmcmFtZS54ID4gMC41ICYmIHdpcmVmcmFtZS55IDwgMC41KSB7XFxuICAgIHJ0MC5hID0gMC4wO1xcbiAgfVxcbiAgdmVjNCB3aXJlZnJhbWVSZXN1bHQgPSBydDA7XFxuICB2ZWM0IHdpcmVmcmFtZUNvbG9yID0gdmVjNCgwLjIsIDAuNzUsIDAuMCwgMS4wKTtcXG4gIGZsb2F0IGVkZ2VSYXRpbyA9IGVkZ2VfcmF0aW8odl9iYXJ5Q2VudHJpY0Nvb3JkLCB3aXJlZnJhbWVXaWR0aElubmVyLCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUpO1xcbiAgZmxvYXQgZWRnZVJhdGlvTW9kaWZpZWQgPSBtaXgoc3RlcCh0aHJlc2hvbGQsIGVkZ2VSYXRpbyksIGNsYW1wKGVkZ2VSYXRpbyo0LjAsIDAuMCwgMS4wKSwgd2lyZWZyYW1lV2lkdGhJbm5lciAvIHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZS80LjApO1xcbiAgLy8gaWYgcjAuYSBpcyAwLjAsIGl0IGlzIHdpcmVmcmFtZSBub3Qgb24gc2hhZGVkXFxuICB3aXJlZnJhbWVSZXN1bHQucmdiID0gd2lyZWZyYW1lQ29sb3IucmdiICogZWRnZVJhdGlvTW9kaWZpZWQgKyBydDAucmdiICogKDEuMCAtIGVkZ2VSYXRpb01vZGlmaWVkKTtcXG4gIHdpcmVmcmFtZVJlc3VsdC5hID0gbWF4KHJ0MC5hLCB3aXJlZnJhbWVDb2xvci5hICogbWl4KGVkZ2VSYXRpb01vZGlmaWVkLCBwb3coZWRnZVJhdGlvTW9kaWZpZWQsIDEwMC4wKSwgd2lyZWZyYW1lV2lkdGhJbm5lciAvIHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZS8xLjApKTtcXG5cXG4gIGlmICh3aXJlZnJhbWUueCA+IDAuNSkge1xcbiAgICBydDAgPSB3aXJlZnJhbWVSZXN1bHQ7XFxuICAgIGlmICh3aXJlZnJhbWUueSA8IDAuNSAmJiBydDAuYSA9PSAwLjApIHtcXG4gICAgICBkaXNjYXJkO1xcbiAgICB9XFxuICB9XFxuXFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfQkxFTkRcXG4jZWxzZVxcbiAgcnQwLmEgPSAxLjA7XFxuI2VuZGlmXFxuXFxuZmxvYXQgbWFrZU91dHB1dFNyZ2IgPSBmbG9hdChnZXRfbWFrZU91dHB1dFNyZ2IobWF0ZXJpYWxTSUQsIDApKTtcXG5ydDAucmdiID0gbWl4KHJ0MC5yZ2IsIGxpbmVhclRvU3JnYihydDAucmdiKSwgbWFrZU91dHB1dFNyZ2IpO1xcblxcbnJ0MC5yZ2IgPSBydDAucmdiICogcnQwLmE7IC8vIGFscGhhIHByZW11bHRpcGxpZWRcXG5ydDEgPSBydDA7XFxucnQyID0gcnQwO1xcbnJ0MyA9IHJ0MDtcXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0RW5kfSAqL1xcblxcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3MiA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuI2lmZGVmIFdFQkdMMl9NVUxUSV9WSUVXXFxuICBsYXlvdXQobnVtX3ZpZXdzPTIpIGluO1xcbiNlbmRpZlxcblxcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMzIGFfY29sb3I7XFxuaW4gdmVjMyBhX25vcm1hbDtcXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzIgYV90ZXhjb29yZF8xO1xcbmluIHZlYzIgYV90ZXhjb29yZF8yO1xcbmluIHZlYzQgYV9qb2ludDtcXG5pbiB2ZWM0IGFfd2VpZ2h0O1xcbmluIHZlYzQgYV9iYXJ5Q2VudHJpY0Nvb3JkO1xcbm91dCB2ZWMzIHZfY29sb3I7XFxub3V0IHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5vdXQgdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcbm91dCB2ZWMyIHZfdGV4Y29vcmRfMTtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzI7XFxub3V0IHZlYzMgdl9iYXJ5Q2VudHJpY0Nvb3JkO1xcbm91dCBmbG9hdCB2X2luc3RhbmNlSW5mbztcXG5vdXQgZmxvYXQgdl9kaXNwbGF5SWR4O1xcbiNpZmRlZiBSTl9VU0VfVEFOR0VOVFxcbiAgaW4gdmVjNCBhX3RhbmdlbnQ7XFxuICBvdXQgdmVjMyB2X3RhbmdlbnRfaW5Xb3JsZDtcXG4gIG91dCB2ZWMzIHZfYmlub3JtYWxfaW5Xb3JsZDtcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1NIQURPV19NQVBQSU5HXFxuICBvdXQgdmVjNCB2X3NoYWRvd0Nvb3JkO1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gZmxvYXQgdV9wb2ludFNpemU7IC8vIGluaXRpYWxWYWx1ZT0zMCwgc29sb0RhdHVtPXRydWVcXG51bmlmb3JtIHZlYzMgdV9wb2ludERpc3RhbmNlQXR0ZW51YXRpb247IC8vIGluaXRpYWxWYWx1ZT0oMC4wLCAwLjEsIDAuMDEpLCBzb2xvRGF0dW09dHJ1ZVxcblxcbi8vIEJpYXNNYXRyaXggKiBMaWdodFByb2plY3Rpb25NYXRyaXggKiBMaWdodFZpZXdNYXRyaXgsIFNlZTogaHR0cDovL3d3dy5vcGVuZ2wtdHV0b3JpYWwub3JnL2ludGVybWVkaWF0ZS10dXRvcmlhbHMvdHV0b3JpYWwtMTYtc2hhZG93LW1hcHBpbmcvI2Jhc2ljLXNoYWRlclxcbnVuaWZvcm0gbWF0NCB1X2RlcHRoQmlhc1BWOyAvLyBpbml0aWFsVmFsdWU9KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxubWF0MyB0b05vcm1hbE1hdHJpeChtYXQ0IG0pIHtcXG4gIGZsb2F0IGEwMCA9IG1bMF1bMF0sIGEwMSA9IG1bMF1bMV0sIGEwMiA9IG1bMF1bMl0sIGEwMyA9IG1bMF1bM10sXFxuICBhMTAgPSBtWzFdWzBdLCBhMTEgPSBtWzFdWzFdLCBhMTIgPSBtWzFdWzJdLCBhMTMgPSBtWzFdWzNdLFxcbiAgYTIwID0gbVsyXVswXSwgYTIxID0gbVsyXVsxXSwgYTIyID0gbVsyXVsyXSwgYTIzID0gbVsyXVszXSxcXG4gIGEzMCA9IG1bM11bMF0sIGEzMSA9IG1bM11bMV0sIGEzMiA9IG1bM11bMl0sIGEzMyA9IG1bM11bM107XFxuXFxuICBmbG9hdCBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXFxuICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXFxuICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXFxuICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXFxuICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXFxuICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXFxuICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXFxuICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXFxuICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXFxuICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXFxuICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXFxuICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XFxuXFxuICBmbG9hdCBkZXRlcm1pbmFudFZhbCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcXG5cXG4gIHJldHVybiBtYXQzKFxcbiAgICBhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDksIGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNywgYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2LFxcbiAgICBhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDksIGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNywgYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2LFxcbiAgICBhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMsIGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSwgYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAvIGRldGVybWluYW50VmFsO1xcbn1cXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5cXG5oaWdocCBtYXQ0IGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZSggaGlnaHAgdmVjNCBxdWF0ZXJuaW9uLCBoaWdocCB2ZWMzIHRyYW5zbGF0aW9uLCBoaWdocCB2ZWMzIHNjYWxlICkge1xcbiAgaGlnaHAgdmVjNCBxID0gcXVhdGVybmlvbjtcXG4gIGhpZ2hwIHZlYzMgdCA9IHRyYW5zbGF0aW9uO1xcblxcbiAgaGlnaHAgZmxvYXQgc3ggPSBxLnggKiBxLng7XFxuICBoaWdocCBmbG9hdCBzeSA9IHEueSAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHN6ID0gcS56ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ggPSBxLnkgKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeSA9IHEueCAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN6ID0gcS54ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ggPSBxLncgKiBxLng7XFxuICBoaWdocCBmbG9hdCB3eSA9IHEudyAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHd6ID0gcS53ICogcS56O1xcblxcbiAgaGlnaHAgbWF0NCBtYXQgPSBtYXQ0KFxcbiAgICAxLjAgLSAyLjAgKiAoc3kgKyBzeiksIDIuMCAqIChjeiArIHd6KSwgMi4wICogKGN5IC0gd3kpLCAwLjAsXFxuICAgIDIuMCAqIChjeiAtIHd6KSwgMS4wIC0gMi4wICogKHN4ICsgc3opLCAyLjAgKiAoY3ggKyB3eCksIDAuMCxcXG4gICAgMi4wICogKGN5ICsgd3kpLCAyLjAgKiAoY3ggLSB3eCksIDEuMCAtIDIuMCAqIChzeCArIHN5KSwgMC4wLFxcbiAgICB0LngsIHQueSwgdC56LCAxLjBcXG4gICk7XFxuXFxuICBoaWdocCBtYXQ0IHVuaWZvcm1TY2FsZU1hdCA9IG1hdDQoXFxuICAgIHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgc2NhbGUueSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCBzY2FsZS56LCAwLjAsXFxuICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxcbiAgKTtcXG5cXG4gIHJldHVybiBtYXQqdW5pZm9ybVNjYWxlTWF0O1xcbn1cXG5cXG5oaWdocCB2ZWM0IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoaGlnaHAgdmVjMiB2ZWNfeHksIGhpZ2hwIGZsb2F0IGNyaXRlcmlhKXtcXG5cXG4gIGhpZ2hwIGZsb2F0IHI7XFxuICBoaWdocCBmbG9hdCBnO1xcbiAgaGlnaHAgZmxvYXQgYjtcXG4gIGhpZ2hwIGZsb2F0IGE7XFxuXFxuICBoaWdocCBmbG9hdCBpeCA9IGZsb29yKHZlY194eS54ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjF4ID0gaXggLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYxeSA9IGl4IC0gZmxvb3IodjF4KSAqIGNyaXRlcmlhO1xcblxcbiAgciA9ICggdjF4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGcgPSAoIHYxeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICBoaWdocCBmbG9hdCBpeSA9IGZsb29yKCB2ZWNfeHkueSAqIGNyaXRlcmlhKTtcXG4gIGhpZ2hwIGZsb2F0IHYyeCA9IGl5IC8gY3JpdGVyaWE7XFxuICBoaWdocCBmbG9hdCB2MnkgPSBpeSAtIGZsb29yKHYyeCkgKiBjcml0ZXJpYTtcXG5cXG4gIGIgPSAoIHYyeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBhID0gKCB2MnkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgciAtPSAxLjAvY3JpdGVyaWE7XFxuICBnIC09IDEuMC9jcml0ZXJpYTtcXG4gIGIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYSAtPSAxLjAvY3JpdGVyaWE7XFxuXFxuICByID0gcioyLjAtMS4wO1xcbiAgZyA9IGcqMi4wLTEuMDtcXG4gIGIgPSBiKjIuMC0xLjA7XFxuICBhID0gYSoyLjAtMS4wO1xcblxcbiAgcmV0dXJuIHZlYzQociwgZywgYiwgYSk7XFxufVxcblxcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCkge1xcblxcbiNpZmRlZiBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMilcXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG5cXG4gIHZlYzQgdHFfeCA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBzcV94ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV94LncsIHNxX3gudyksIGNyaXRlcmlhLngpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV94Lnh5eiwgc3FfeC54eXopO1xcblxcbiAgdmVjNCB0cV95ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICB2ZWM0IHNxX3kgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV95LncsIHNxX3kudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3kueHl6LCBzcV95Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgc3FfeiA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3oudywgc3Ffei53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfei54eXosIHNxX3oueHl6KTtcXG5cXG4gIHZlYzQgdHFfdyA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgdmVjNCBzcV93ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfdy53LCBzcV93LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV93Lnh5eiwgc3Ffdy54eXopO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRClcXG4gIHZlYzQgdHNfeCA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICB2ZWM0IHRzX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMSlcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NYID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NZID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NaID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NXID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG5cXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRJbmZvID0gZ2V0X2JvbmVDb21wcmVzc2VkSW5mbygwLjAsIDApO1xcblxcbiAgdmVjNCB0c194ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1guencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnh5LCBjcml0ZXJpYS54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICB2ZWM0IHRzX3kgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS54eSwgY3JpdGVyaWEueCksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1ouencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1oueHksIGNyaXRlcmlhLngpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnh5LCBjcml0ZXJpYS54KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuI2VuZGlmXFxuICByZXR1cm4gc2tpbk1hdDtcXG59XFxuI2VuZGlmXFxuXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuYm9vbCBza2lubmluZyhcXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuICApXFxue1xcbiAgbWF0NCBza2luTWF0ID0gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCk7XFxuICBvdXRQb3NpdGlvbl9pbldvcmxkID0gc2tpbk1hdCAqIHZlYzQoaW5Qb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgb3V0Tm9ybWFsTWF0cml4ID0gdG9Ob3JtYWxNYXRyaXgoc2tpbk1hdCk7XFxuICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShvdXROb3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG5cXG4gIHJldHVybiB0cnVlO1xcbn1cXG4jZW5kaWZcXG5cXG5ib29sIHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQ0IHdvcmxkTWF0cml4LFxcbiAgaW4gbWF0NCB2aWV3TWF0cml4LFxcbiAgaW4gYm9vbCBpc0JpbGxib2FyZCxcXG4gIGluIG1hdDMgaW5Ob3JtYWxNYXRyaXgsXFxuICBvdXQgbWF0MyBvdXROb3JtYWxNYXRyaXgsXFxuICBpbiB2ZWMzIGluUG9zaXRpb25faW5Mb2NhbCxcXG4gIG91dCB2ZWM0IG91dFBvc2l0aW9uX2luV29ybGQsXFxuICBpbiB2ZWMzIGluTm9ybWFsX2luTG9jYWwsXFxuICBvdXQgdmVjMyBvdXROb3JtYWxfaW5Xb3JsZFxcbikge1xcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuXFxuICB2ZWMzIHBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICBpZiAodV9tb3JwaFRhcmdldE51bWJlciA9PSAwKSB7XFxuI2VuZGlmXFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBpblBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICB9IGVsc2Uge1xcbiAgICBmbG9hdCB2ZXJ0ZXhJZHggPSBhX2JhcnlDZW50cmljQ29vcmQudztcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGdldF9wb3NpdGlvbih2ZXJ0ZXhJZHgsIGluUG9zaXRpb25faW5Mb2NhbCk7XFxuICB9XFxuI2VuZGlmXFxuXFxuICBtYXQ0IHdvcmxkTWF0cml4SW5uZXIgPSB3b3JsZE1hdHJpeDtcXG4gIGlmIChpc0JpbGxib2FyZCkge1xcbiAgICBtYXQ0IGludmVyc2VWaWV3TWF0cml4ID0gaW52ZXJzZSh2aWV3TWF0cml4KTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMF0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVswXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMV0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsxXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMl0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsyXTtcXG4gICAgd29ybGRNYXRyaXhJbm5lciA9IGludmVyc2VWaWV3TWF0cml4ICogd29ybGRNYXRyaXg7XFxuICB9XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICBpZiAoc2tlbGV0YWxDb21wb25lbnRTSUQgPj0gMC4wKSB7XFxuICAgIGlzU2tpbm5pbmcgPSBza2lubmluZyhza2VsZXRhbENvbXBvbmVudFNJRCwgaW5Ob3JtYWxNYXRyaXgsIG91dE5vcm1hbE1hdHJpeCwgcG9zaXRpb25faW5Mb2NhbCwgb3V0UG9zaXRpb25faW5Xb3JsZCwgaW5Ob3JtYWxfaW5Mb2NhbCwgb3V0Tm9ybWFsX2luV29ybGQpO1xcbiAgfSBlbHNlIHtcXG4jZW5kaWZcXG4gICAgb3V0Tm9ybWFsTWF0cml4ID0gaW5Ob3JtYWxNYXRyaXg7XFxuICAgIG91dFBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeElubmVyICogdmVjNChwb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbk5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgcmV0dXJuIGlzU2tpbm5pbmc7XFxufVxcblxcblxcbnZvaWQgbWFpbigpXFxue1xcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIG1hdDMgbm9ybWFsTWF0cml4ID0gZ2V0X25vcm1hbE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG4gIGJvb2wgaXNCaWxsYm9hcmQgPSBnZXRfaXNCaWxsYm9hcmQoYV9pbnN0YW5jZUluZm8ueCk7XFxuXFxuICB2X2NvbG9yID0gYV9jb2xvcjtcXG5cXG4gIGJvb2wgaXNTa2lubmluZyA9IGZhbHNlO1xcblxcbiAgaXNTa2lubmluZyA9IHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gICAgd29ybGRNYXRyaXgsXFxuICAgIHZpZXdNYXRyaXgsXFxuICAgIGlzQmlsbGJvYXJkLFxcbiAgICBub3JtYWxNYXRyaXgsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgYV9wb3NpdGlvbixcXG4gICAgdl9wb3NpdGlvbl9pbldvcmxkLFxcbiAgICBhX25vcm1hbCxcXG4gICAgdl9ub3JtYWxfaW5Xb3JsZFxcbiAgKTtcXG5cXG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuXFxuICB2X3RleGNvb3JkXzAgPSBhX3RleGNvb3JkXzA7XFxuICB2X3RleGNvb3JkXzEgPSBhX3RleGNvb3JkXzE7XFxuICB2X3RleGNvb3JkXzIgPSBhX3RleGNvb3JkXzI7XFxuXFxuICAjaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gICAgdl90YW5nZW50X2luV29ybGQgPSBub3JtYWxNYXRyaXggKiBhX3RhbmdlbnQueHl6O1xcbiAgICB2X2Jpbm9ybWFsX2luV29ybGQgPSBjcm9zcyh2X3RhbmdlbnRfaW5Xb3JsZCwgdl9ub3JtYWxfaW5Xb3JsZCkgKiBhX3RhbmdlbnQudztcXG4gICNlbmRpZlxcbiAgdl9iYXJ5Q2VudHJpY0Nvb3JkID0gYV9iYXJ5Q2VudHJpY0Nvb3JkLnh5ejtcXG5cXG4gIHZfaW5zdGFuY2VJbmZvID0gYV9pbnN0YW5jZUluZm8ueDtcXG5cXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4gIHZfZGlzcGxheUlkeCA9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbiNlbmRpZlxcblxcbiAgYm9vbCB2aXNpYmlsaXR5ID0gZ2V0X2lzVmlzaWJsZShhX2luc3RhbmNlSW5mby54KTtcXG4gIGlmICghdmlzaWJpbGl0eSlcXG4gIHtcXG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDAuMCk7XFxuICB9XFxuXFxuI2lmZGVmIFJOX1VTRV9TSEFET1dfTUFQUElOR1xcbiAgdl9zaGFkb3dDb29yZCA9IGdldF9kZXB0aEJpYXNQVihtYXRlcmlhbFNJRCwgMCkgKiB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuI2VuZGlmXFxuXFxuLy8gI2lmZGVmIFJOX0lTX1BPSU5UU1BSSVRFXFxuXFxudmVjNCBwb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sIDEuMCk7XFxudmVjMyB2aWV3UG9zaXRpb24gPSBnZXRfdmlld1Bvc2l0aW9uKGNhbWVyYVNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VGcm9tQ2FtZXJhID0gbGVuZ3RoKHBvc2l0aW9uX2luV29ybGQueHl6IC0gdmlld1Bvc2l0aW9uKTtcXG52ZWMzIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbiA9IGdldF9wb2ludERpc3RhbmNlQXR0ZW51YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbmZsb2F0IGRpc3RhbmNlQXR0ZW51YXRpb25GYWN0b3IgPSBzcXJ0KDEuMC8ocG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnggKyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueSAqIGRpc3RhbmNlRnJvbUNhbWVyYSArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi56ICogZGlzdGFuY2VGcm9tQ2FtZXJhICogZGlzdGFuY2VGcm9tQ2FtZXJhKSk7XFxuZmxvYXQgbWF4UG9pbnRTaXplID0gZ2V0X3BvaW50U2l6ZShtYXRlcmlhbFNJRCwgMCk7XFxuZ2xfUG9pbnRTaXplID0gY2xhbXAoZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciAqIG1heFBvaW50U2l6ZSwgMC4wLCBtYXhQb2ludFNpemUpO1xcblxcbi8vICNlbmRpZlxcblxcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5cXG51bmlmb3JtIHNhbXBsZXJDdWJlIHVfYmFzZUNvbG9yVGV4dHVyZTsgLy8gaW5pdGlhbFZhbHVlPSgwLHdoaXRlKVxcbnVuaWZvcm0gaW50IHVfY3ViZU1hcEZhY2VJZDsgLy8gaW5pdGlhbFZhbHVlPTBcXG51bmlmb3JtIGludCB1X2Rpc3RyaWJ1dGlvblR5cGU7IC8vIGluaXRpYWxWYWx1ZT0wXFxudW5pZm9ybSBmbG9hdCB1X3JvdWdobmVzczsgLy8gaW5pdGlhbFZhbHVlPTAuMFxcbnVuaWZvcm0gaW50IHVfc2FtcGxlQ291bnQ7IC8vIGluaXRpYWxWYWx1ZT0xMDI0XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbmNvbnN0IGludCBjTGFtYmVydGlhbiA9IDA7XFxuY29uc3QgaW50IGNHR1ggPSAxO1xcblxcbi8vIGh0dHA6Ly9ob2xnZXIuZGFtbWVydHoub3JnL3N0dWZmL25vdGVzX0hhbW1lcnNsZXlPbkhlbWlzcGhlcmUuaHRtbFxcbmZsb2F0IHJhZGljYWxJbnZlcnNlX1ZkQyh1aW50IGJpdHMpXFxue1xcbiAgICBiaXRzID0gKGJpdHMgPDwgMTZ1KSB8IChiaXRzID4+IDE2dSk7XFxuICAgIGJpdHMgPSAoKGJpdHMgJiAweDU1NTU1NTU1dSkgPDwgMXUpIHwgKChiaXRzICYgMHhBQUFBQUFBQXUpID4+IDF1KTtcXG4gICAgYml0cyA9ICgoYml0cyAmIDB4MzMzMzMzMzN1KSA8PCAydSkgfCAoKGJpdHMgJiAweENDQ0NDQ0NDdSkgPj4gMnUpO1xcbiAgICBiaXRzID0gKChiaXRzICYgMHgwRjBGMEYwRnUpIDw8IDR1KSB8ICgoYml0cyAmIDB4RjBGMEYwRjB1KSA+PiA0dSk7XFxuICAgIGJpdHMgPSAoKGJpdHMgJiAweDAwRkYwMEZGdSkgPDwgOHUpIHwgKChiaXRzICYgMHhGRjAwRkYwMHUpID4+IDh1KTtcXG4gICAgcmV0dXJuIGZsb2F0KGJpdHMpICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gLyAweDEwMDAwMDAwMFxcbn1cXG5cXG52ZWMyIGhhbW1lcnNsZXkyZChpbnQgaSwgaW50IE4pIHtcXG4gICAgcmV0dXJuIHZlYzIoZmxvYXQoaSkvZmxvYXQoTiksIHJhZGljYWxJbnZlcnNlX1ZkQyh1aW50KGkpKSk7XFxufVxcblxcbm1hdDMgY3JlYXRlVEJOKHZlYzMgbm9ybWFsKVxcbntcXG4gICAgdmVjMyBiaXRhbmdlbnQgPSB2ZWMzKDAuMCwgMS4wLCAwLjApO1xcbiAgICBmbG9hdCBOZG90VXAgPSBkb3Qobm9ybWFsLCB2ZWMzKDAuMCwgMS4wLCAwLjApKTtcXG4gICAgZmxvYXQgZXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gICAgaWYgKDEuMCAtIGFicyhOZG90VXApIDw9IGVwc2lsb24pXFxuICAgIHtcXG4gICAgICBiaXRhbmdlbnQgPSAoTmRvdFVwID4gMC4wKSA/IHZlYzMoMC4wLCAwLjAsIDEuMCkgOiB2ZWMzKDAuMCwgMC4wLCAtMS4wKTtcXG4gICAgfVxcbiAgICB2ZWMzIHRhbmdlbnQgPSBub3JtYWxpemUoY3Jvc3MoYml0YW5nZW50LCBub3JtYWwpKTtcXG4gICAgYml0YW5nZW50ID0gY3Jvc3Mobm9ybWFsLCB0YW5nZW50KTtcXG4gICAgcmV0dXJuIG1hdDModGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwpO1xcbn1cXG5cXG52ZWM0IGdldEltcG9ydGFuY2VTYW1wbGVMYW1iZXJ0aWFuKGludCBzYW1wbGVJbmRleCwgdmVjMyBOLCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IG1hdGVyaWFsU0lEKVxcbntcXG4gICAgdmVjMiB4aSA9IGhhbW1lcnNsZXkyZChzYW1wbGVJbmRleCwgZ2V0X3NhbXBsZUNvdW50KG1hdGVyaWFsU0lELCAwKSk7XFxuXFxuICAgIGZsb2F0IHNpblRoZXRhID0gc3FydCgxLjAgLSB4aS55KTtcXG4gICAgZmxvYXQgY29zVGhldGEgPSBzcXJ0KHhpLnkpO1xcbiAgICBmbG9hdCBwaGkgPSAyLjAgKiBQSSAqIHhpLng7XFxuICAgIGZsb2F0IHBkZiA9IGNvc1RoZXRhIC8gUEk7XFxuXFxuICAgIHZlYzMgbG9jYWxEaXJlY3Rpb24gPSBub3JtYWxpemUodmVjMyhcXG4gICAgICAgIHNpblRoZXRhICogY29zKHBoaSksXFxuICAgICAgICBzaW5UaGV0YSAqIHNpbihwaGkpLFxcbiAgICAgICAgY29zVGhldGFcXG4gICAgKSk7XFxuICAgIHZlYzMgZGlyZWN0aW9uID0gY3JlYXRlVEJOKE4pICogbG9jYWxEaXJlY3Rpb247XFxuXFxuICAgIHJldHVybiB2ZWM0KGRpcmVjdGlvbiwgcGRmKTtcXG59XFxuXFxuLy8gR0dYIE5ERlxcbmZsb2F0IGRfR0dYKGZsb2F0IE5ILCBmbG9hdCBhbHBoYVJvdWdobmVzcykge1xcbiAgZmxvYXQgcm91Z2huZXNzU3FyID0gYWxwaGFSb3VnaG5lc3MgKiBhbHBoYVJvdWdobmVzcztcXG4gIGZsb2F0IGYgPSAocm91Z2huZXNzU3FyIC0gMS4wKSAqIE5IICogTkggKyAxLjA7XFxuICByZXR1cm4gcm91Z2huZXNzU3FyIC8gKFBJICogZiAqIGYpO1xcbn1cXG5cXG4vLyBXZSBsZWFybmQgYSBsb3QgZnJvbSB0aGUgZm9sbG93aW5nIHJlc291cmNlc1xcbi8vIGh0dHBzOi8vYnJ1b3AuZ2l0aHViLmlvL2libC9cXG52ZWM0IGdldEltcG9ydGFuY2VTYW1wbGVHR1goaW50IHNhbXBsZUluZGV4LCB2ZWMzIE4sIGZsb2F0IHJvdWdobmVzcywgZmxvYXQgbWF0ZXJpYWxTSUQpXFxue1xcbiAgICB2ZWMyIHhpID0gaGFtbWVyc2xleTJkKHNhbXBsZUluZGV4LCBnZXRfc2FtcGxlQ291bnQobWF0ZXJpYWxTSUQsIDApKTtcXG5cXG4gICAgZmxvYXQgYWxwaGEgPSByb3VnaG5lc3MgKiByb3VnaG5lc3M7XFxuICAgIGZsb2F0IGNvc1RoZXRhID0gY2xhbXAoc3FydCgoMS4wIC0geGkueSkgLyAoMS4wICsgKGFscGhhICogYWxwaGEgLSAxLjApICogeGkueSkpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IHNpblRoZXRhID0gc3FydCgxLjAgLSBjb3NUaGV0YSAqIGNvc1RoZXRhKTtcXG4gICAgZmxvYXQgcGhpID0gMi4wICogUEkgKiB4aS54O1xcbiAgICBmbG9hdCBwZGYgPSBkX0dHWChjb3NUaGV0YSwgYWxwaGEpO1xcbiAgICBwZGYgLz0gNC4wO1xcblxcbiAgICB2ZWMzIGxvY2FsRGlyZWN0aW9uID0gbm9ybWFsaXplKHZlYzMoXFxuICAgICAgICBzaW5UaGV0YSAqIGNvcyhwaGkpLFxcbiAgICAgICAgc2luVGhldGEgKiBzaW4ocGhpKSxcXG4gICAgICAgIGNvc1RoZXRhXFxuICAgICkpO1xcbiAgICB2ZWMzIGRpcmVjdGlvbiA9IGNyZWF0ZVRCTihOKSAqIGxvY2FsRGlyZWN0aW9uO1xcblxcbiAgICByZXR1cm4gdmVjNChkaXJlY3Rpb24sIHBkZik7XFxufVxcblxcbi8vIFdlIGxlYXJuZCBhIGxvdCBmcm9tIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzXFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL2dwdWdlbXMzL3BhcnQtaWlpLXJlbmRlcmluZy9jaGFwdGVyLTIwLWdwdS1iYXNlZC1pbXBvcnRhbmNlLXNhbXBsaW5nXFxuLy8gaHR0cHM6Ly9jZ2cubWZmLmN1bmkuY3ovfmphcm9zbGF2L3BhcGVycy8yMDA3LXNrZXRjaC1maXMvRmluYWxfc2FwXzAwNzMucGRmXFxuLy8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lmh0bWwjYW5uZXgvaW1wb3J0YW5jZXNhbXBsaW5nZm9ydGhlaWJsL3ByZS1maWx0ZXJlZGltcG9ydGFuY2VzYW1wbGluZ1xcbmZsb2F0IGNvbXB1dGVMb2QoZmxvYXQgcGRmLCBpbnQgd2lkdGgsIGludCBzYW1wbGVDb3VudClcXG57XFxuICAgIC8vIDYuMCBpcyB0aGUgbnVtYmVyIG9mIGZhY2VzIG9mIHRoZSBjdWJlbWFwXFxuICAgIC8vIGxvZzQgPSAwLjUgKiBsb2cyXFxuICAgIC8vIFdlIGRvbid0IHVzZSB0aGUgY29uc3RhbnQgSyBpbiB0aGUgZmlsYW1lbnQgZG9jdW1lbnRcXG4gICAgcmV0dXJuIDAuNSAqIGxvZzIoIDYuMCAqIGZsb2F0KHdpZHRoKSAqIGZsb2F0KHdpZHRoKSAvIChmbG9hdChzYW1wbGVDb3VudCkgKiBwZGYpKTtcXG59XFxuXFxudmVjMyBwcmVmaWx0ZXIodmVjMyBOLCBmbG9hdCBtYXRlcmlhbFNJRClcXG57XFxuICAgIHZlYzMgY29sb3IgPSB2ZWMzKDAuZik7XFxuICAgIGZsb2F0IHdlaWdodCA9IDAuMGY7XFxuICAgIGludCBzYW1wbGVDb3VudCA9IGdldF9zYW1wbGVDb3VudChtYXRlcmlhbFNJRCwgMCk7XFxuXFxuICAgIGl2ZWMyIHRleFNpemUgPSB0ZXh0dXJlU2l6ZSh1X2Jhc2VDb2xvclRleHR1cmUsIDApO1xcblxcbiAgICBmb3IoaW50IGkgPSAwOyBpIDwgZ2V0X3NhbXBsZUNvdW50KG1hdGVyaWFsU0lELCAwKTsgKytpKVxcbiAgICB7XFxuICAgICAgICB2ZWM0IGltcG9ydGFuY2VTYW1wbGU7XFxuXFxuICAgICAgICBpbnQgZGlzdHJpYnV0aW9uVHlwZSA9IGdldF9kaXN0cmlidXRpb25UeXBlKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgICAgIGlmKGRpc3RyaWJ1dGlvblR5cGUgPT0gY0xhbWJlcnRpYW4pIHtcXG4gICAgICAgICAgICBpbXBvcnRhbmNlU2FtcGxlID0gZ2V0SW1wb3J0YW5jZVNhbXBsZUxhbWJlcnRpYW4oaSwgTiwgZ2V0X3JvdWdobmVzcyhtYXRlcmlhbFNJRCwgMCksIG1hdGVyaWFsU0lEKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaW1wb3J0YW5jZVNhbXBsZSA9IGdldEltcG9ydGFuY2VTYW1wbGVHR1goaSwgTiwgZ2V0X3JvdWdobmVzcyhtYXRlcmlhbFNJRCwgMCksIG1hdGVyaWFsU0lEKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIHZlYzMgSCA9IHZlYzMoaW1wb3J0YW5jZVNhbXBsZS54eXopO1xcbiAgICAgICAgZmxvYXQgcGRmID0gaW1wb3J0YW5jZVNhbXBsZS53O1xcbiAgICAgICAgZmxvYXQgbG9kID0gY29tcHV0ZUxvZChwZGYsIHRleFNpemUueCwgc2FtcGxlQ291bnQpO1xcblxcbiAgICAgICAgaWYoZGlzdHJpYnV0aW9uVHlwZSA9PSBjTGFtYmVydGlhbilcXG4gICAgICAgIHtcXG4gICAgICAgICAgICB2ZWMzIGxhbWJlcnRpYW4gPSB0ZXh0dXJlTG9kKHVfYmFzZUNvbG9yVGV4dHVyZSwgSCwgbG9kKS5yZ2I7XFxuICAgICAgICAgICAgY29sb3IgKz0gbGFtYmVydGlhbjtcXG4gICAgICAgIH1cXG4gICAgICAgIGVsc2UgaWYoZGlzdHJpYnV0aW9uVHlwZSA9PSBjR0dYKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHZlYzMgViA9IE47XFxuICAgICAgICAgICAgdmVjMyBMID0gbm9ybWFsaXplKHJlZmxlY3QoLVYsIEgpKTtcXG4gICAgICAgICAgICBmbG9hdCBOZG90TCA9IGRvdChOLCBMKTtcXG5cXG4gICAgICAgICAgICBpZiAoTmRvdEwgPiAwLjApXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICB2ZWMzIHNhbXBsZUNvbG9yID0gdGV4dHVyZUxvZCh1X2Jhc2VDb2xvclRleHR1cmUsIEwsIGxvZCkucmdiO1xcbiAgICAgICAgICAgICAgICBjb2xvciArPSBzYW1wbGVDb2xvciAqIE5kb3RMO1xcbiAgICAgICAgICAgICAgICB3ZWlnaHQgKz0gTmRvdEw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIGlmKHdlaWdodCAhPSAwLjBmKVxcbiAgICB7XFxuICAgICAgICBjb2xvciAvPSB3ZWlnaHQ7XFxuICAgIH1cXG4gICAgZWxzZVxcbiAgICB7XFxuICAgICAgICBjb2xvciAvPSBmbG9hdChzYW1wbGVDb3VudCk7XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIGNvbG9yLnJnYjtcXG59XFxuXFxudmVjMyB1dlRvRGlyKGludCBmYWNlSWQsIHZlYzIgdXYpXFxue1xcblxcdGlmKGZhY2VJZCA9PSAwKVxcblxcdFxcdHJldHVybiB2ZWMzKDEuZiwgdXYueSwgLXV2LngpO1xcblxcdGVsc2UgaWYoZmFjZUlkID09IDEpXFxuXFx0XFx0cmV0dXJuIHZlYzMoLTEuZiwgdXYueSwgdXYueCk7XFxuXFx0ZWxzZSBpZihmYWNlSWQgPT0gMilcXG5cXHRcXHRyZXR1cm4gdmVjMygrdXYueCwgLTEuZiwgK3V2LnkpO1xcblxcdGVsc2UgaWYoZmFjZUlkID09IDMpXFxuXFx0XFx0cmV0dXJuIHZlYzMoK3V2LngsIDEuZiwgLXV2LnkpO1xcblxcdGVsc2UgaWYoZmFjZUlkID09IDQpXFxuXFx0XFx0cmV0dXJuIHZlYzMoK3V2LngsIHV2LnksIDEuZik7XFxuXFx0ZWxzZVxcbiAgICByZXR1cm4gdmVjMygtdXYueCwgK3V2LnksIC0xLmYpO1xcbn1cXG5cXG4vLyBsZWFybmVkIGEgbG90IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1WaWV3ZXJcXG52b2lkIG1haW4gKClcXG57XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgdmVjMiB1diA9IHZfdGV4Y29vcmRfMCAqIDIuMCAtIDEuMDtcXG4gIHZlYzMgc2NhbiA9IHV2VG9EaXIoZ2V0X2N1YmVNYXBGYWNlSWQobWF0ZXJpYWxTSUQsIDApLCB1dik7XFxuICB2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZShzY2FuKTtcXG4gIGRpcmVjdGlvbi55ID0gLWRpcmVjdGlvbi55O1xcblxcbiAgcnQwID0gdmVjNChwcmVmaWx0ZXIoZGlyZWN0aW9uLCBtYXRlcmlhbFNJRCksIDEuMCk7XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmluIHZlYzQgYV9pbnN0YW5jZUluZm87XFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxuaW4gdmVjMyBhX3Bvc2l0aW9uO1xcbm91dCB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5cXG5jb25zdCBmbG9hdCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiNkZWZpbmUgc2F0dXJhdGVFcHNpbG9uVG9PbmUoeCkgY2xhbXAoeCwgRXBzaWxvbiwgMS4wKVxcblxcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbnVuaWZvcm0gaW50IHVfbW9ycGhUYXJnZXROdW1iZXI7IC8vIGluaXRpYWxWYWx1ZT0wLCBpc0ludGVybmFsU2V0dGluZz10cnVlLCBzb2xvRGF0dW09ZmFsc2UsIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU9dHJ1ZVxcbi8vIHVuaWZvcm0gaW50IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW107XFxuLy8gdW5pZm9ybSBpbnQgdV9tb3JwaFdlaWdodHNbXTsgLy9cXG4jZW5kaWZcXG5cXG51bmlmb3JtIGludCB1X2lzTWFpblZyOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxudW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgdV9kYXRhVGV4dHVyZTsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbi8qIHNoYWRlcml0eTogQHt3aWR0aE9mRGF0YVRleHR1cmV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2hlaWdodE9mRGF0YVRleHR1cmV9ICovXFxuXFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT1ZlYzRTaXplfSAqL1xcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPRGVmaW5pdGlvbn0gKi9cXG4jZW5kaWZcXG5cXG5cXG5oaWdocCB2ZWM0IGZldGNoRWxlbWVudChpbnQgdmVjNF9pZHgpIHtcXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbiAgaWYgKHZlYzRfaWR4IDwgZGF0YVVCT1ZlYzRTaXplKSB7XFxuICAgIHJldHVybiBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKHZlYzRfaWR4KTtcXG4gIH0gZWxzZSB7XFxuICAgIGludCBpZHhPbkRhdGFUZXggPSB2ZWM0X2lkeCAtIGRhdGFVQk9WZWM0U2l6ZTtcXG4gICAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMihpZHhPbkRhdGFUZXggJSB3aWR0aE9mRGF0YVRleHR1cmUsIGlkeE9uRGF0YVRleCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICAgIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiAgfVxcbiNlbGlmIGRlZmluZWQoR0xTTF9FUzMpXFxuICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKHZlYzRfaWR4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCB2ZWM0X2lkeCAvIHdpZHRoT2ZEYXRhVGV4dHVyZSk7XFxuICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4jZWxzZVxcbiAgLy8gVGhpcyBpZGVhIGZyb20gaHR0cHM6Ly9xaWl0YS5jb20vWVZUL2l0ZW1zL2M2OTVhYjRiM2NmN2ZhYTkzODg1XFxuICBoaWdocCB2ZWMyIGludlNpemUgPSB2ZWMyKDEuMC9mbG9hdCh3aWR0aE9mRGF0YVRleHR1cmUpLCAxLjAvZmxvYXQoaGVpZ2h0T2ZEYXRhVGV4dHVyZSkpO1xcbiAgaGlnaHAgZmxvYXQgdCA9IChmbG9hdCh2ZWM0X2lkeCkgKyAwLjUpICogaW52U2l6ZS54O1xcbiAgaGlnaHAgZmxvYXQgeCA9IGZyYWN0KHQpO1xcbiAgaGlnaHAgZmxvYXQgeSA9IChmbG9vcih0KSArIDAuNSkgKiBpbnZTaXplLnk7XFxuICAjaWZkZWYgR0xTTF9FUzNcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbHNlXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZW5kaWZcXG4jZW5kaWZcXG59XFxuXFxudmVjMiBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC55eik7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC56dyk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAudywgdmFsMS54KTtcXG4gIH1cXG59XFxuXFxudmVjMyBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG52ZWM0IGZldGNoVmVjNChpbnQgdmVjNF9pZHgpIHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbG9hdCBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMykge1xcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiAgaW50IHZlYzRfaWR4ID0gc2NhbGFyX2lkeCo0O1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQyIGZldGNoTWF0MihpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MyBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxuXFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0Tm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIudywgY29sMy54LFxcbiAgICAgIGNvbDMueSwgY29sMy56LCBjb2wzLncsIGNvbDQueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsIGNvbDIueSxcXG4gICAgICBjb2wyLnosIGNvbDIudywgY29sMy54LCBjb2wzLnksXFxuICAgICAgY29sMy56LCBjb2wzLncsIGNvbDQueCwgY29sNC55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnksIGNvbDIueixcXG4gICAgICBjb2wyLncsIGNvbDMueCwgY29sMy55LCBjb2wzLnosXFxuICAgICAgY29sMy53LCBjb2w0LngsIGNvbDQueSwgY29sNC56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxubWF0NCBmZXRjaE1hdDQoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG4gIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDMpO1xcblxcbiAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDR4MyBmZXRjaE1hdDR4MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0NHgzIHZhbCA9IG1hdDR4MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5mbG9hdCByYW5kKGNvbnN0IHZlYzIgY28pe1xcbiAgcmV0dXJuIGZyYWN0KHNpbihkb3QoY28ueHkgLHZlYzIoMTIuOTg5OCw3OC4yMzMpKSkgKiA0Mzc1OC41NDUzKTtcXG59XFxuXFxudmVjMyBkZXNjcmFtYmxlKHZlYzMgdikge1xcbiAgZmxvYXQgc2VlZCA9IDAuMDtcXG4gIHYueCAtPSBzaW4oZnJhY3Qodi55KjIwLjApKTtcXG4gIHYueiAtPSBjb3MoZnJhY3QoLXYueSoxMC4wKSk7XFxuICByZXR1cm4gdjtcXG59XFxuXFxuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2O1xcblxcbmZsb2F0IG1heDModmVjMyB2KVxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZmxvYXQgc3EoZmxvYXQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzIgc3EodmVjMiB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMyBzcSh2ZWMzIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWM0IHNxKHZlYzQgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZsb2F0IHNhdHVyYXRlKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIGNsYW1wKHQsIDAuMCwgMS4wKTtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG52b2lkIG1haW4oKVxcbntcXG4gIFxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5mbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMSkgPDwgMik7XFxuZmxvYXQgeSA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAmIDIpIDw8IDEpO1xcbnZfdGV4Y29vcmRfMC54ID0geCAqIDAuNTtcXG52X3RleGNvb3JkXzAueSA9IHkgKiAwLjU7XFxuZ2xfUG9zaXRpb24gPSB2ZWM0KHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcbiAgXFxufVxcblxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbmluIHZlYzMgdl9jb2xvcjtcXG5pbiB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxuaW4gdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuaW4gdmVjMiB2X3RleGNvb3JkXzA7XFxuaW4gdmVjNCB2X3RleGNvb3JkXzE7XFxuaW4gdmVjNCB2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0O1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5zdHJ1Y3QgTGlnaHQge1xcbiAgaW50IHR5cGU7IC8vIDAgPSBkaXJlY3Rpb25hbCwgMSA9IHBvaW50LCAyID0gc3BvdFxcbiAgdmVjMyBwb3NpdGlvbjtcXG4gIHZlYzMgaW50ZW5zaXR5O1xcbiAgdmVjMyBhdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiAgdmVjMyBkaXJlY3Rpb25PZkxpZ2h0T2JqZWN0O1xcbiAgdmVjMyBkaXJlY3Rpb247IC8vIGRpcmVjdGlvbiBvZiBsaWdodCB2ZWN0b3IsIGVxdWFsIHRvIG5vcm1hbGl6ZShsaWdodC5wb2ludFRvTGlnaHQpXFxuICB2ZWMzIHBvaW50VG9MaWdodDsgLy8gbm90IG5vcm1hbGl6ZWRcXG4gIGZsb2F0IHNwb3RBbmdsZVNjYWxlO1xcbiAgZmxvYXQgc3BvdEFuZ2xlT2Zmc2V0O1xcbiAgZmxvYXQgZWZmZWN0aXZlUmFuZ2U7XFxufTtcXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNyYW5nZS1wcm9wZXJ0eVxcbmZsb2F0IGdldFJhbmdlQXR0ZW51YXRpb24oTGlnaHQgbGlnaHQpXFxue1xcbiAgZmxvYXQgZGlzdGFuY2UgPSBsZW5ndGgobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gIC8vIG1lYW5zIG5vIHJhbmdlIGxpbWl0XFxuICBpZiAobGlnaHQuZWZmZWN0aXZlUmFuZ2UgPD0gMC4wKVxcbiAge1xcbiAgICByZXR1cm4gMS4wIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbiAgfVxcbiAgcmV0dXJuIG1heChtaW4oMS4wIC0gcG93KGRpc3RhbmNlIC8gbGlnaHQuZWZmZWN0aXZlUmFuZ2UsIDQuMCksIDEuMCksIDAuMCkgLyBwb3coZGlzdGFuY2UsIDIuMCk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9saWdodHNfcHVuY3R1YWwvUkVBRE1FLm1kI2lubmVyLWFuZC1vdXRlci1jb25lLWFuZ2xlc1xcbmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbihMaWdodCBsaWdodClcXG57XFxuXFxuICBmbG9hdCBjZCA9IGRvdChsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0LCBsaWdodC5kaXJlY3Rpb24pO1xcbiAgZmxvYXQgYW5ndWxhckF0dGVudWF0aW9uID0gY2xhbXAoY2QgKiBsaWdodC5zcG90QW5nbGVTY2FsZSArIGxpZ2h0LnNwb3RBbmdsZU9mZnNldCwgMC4wLCAxLjApO1xcbiAgcmV0dXJuIGFuZ3VsYXJBdHRlbnVhdGlvbjtcXG59XFxuXFxudm9pZCBnZXRMaWdodEF0dGVudWF0ZWQoTGlnaHQgbGlnaHQpIHtcXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICAvLyBpZiAobGlnaHQudHlwZSA9PSAwKSB7IC8vIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIC8vIERpcmVjdGlvbmFsIExpZ2h0IGRvbid0IGF0dGVudWF0ZSBnZW9tZXRpY2FsbHlcXG4gIC8vIH1cXG5cXG4gIC8vIFBvaW50IExpZ2h0XFxuICBpZiAobGlnaHQudHlwZSA9PSAxKVxcbiAge1xcbiAgICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ICo9IGdldFJhbmdlQXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcbiAgLy8gU3BvdCBsaWdodFxcbiAgaWYgKGxpZ2h0LnR5cGUgPT0gMilcXG4gIHtcXG4gICAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSAqPSBnZXRTcG90QXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcbn1cXG5cXG5MaWdodCBnZXRMaWdodChpbnQgbGlnaHRJZHgsIHZlYzMgdl9wb3NpdGlvbl9pbldvcmxkKSB7XFxuICB2ZWMzIGxpZ2h0UG9zaXRpb24gPSBnZXRfbGlnaHRQb3NpdGlvbigwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzMgZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0ID0gZ2V0X2xpZ2h0RGlyZWN0aW9uKDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjMyBsaWdodEludGVuc2l0eSA9IGdldF9saWdodEludGVuc2l0eSgwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzQgbGlnaHRQcm9wZXJ0eSA9IGdldF9saWdodFByb3BlcnR5KDAuMCwgbGlnaHRJZHgpO1xcbiAgTGlnaHQgbGlnaHQ7XFxuICBsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ID0gZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0O1xcbiAgZmxvYXQgbGlnaHRUeXBlID0gbGlnaHRQcm9wZXJ0eS54O1xcbiAgbGlnaHQuZWZmZWN0aXZlUmFuZ2UgPSBsaWdodFByb3BlcnR5Lnk7XFxuICBsaWdodC5zcG90QW5nbGVTY2FsZSA9IGxpZ2h0UHJvcGVydHkuejtcXG4gIGxpZ2h0LnNwb3RBbmdsZU9mZnNldCA9IGxpZ2h0UHJvcGVydHkudztcXG5cXG4gIGxpZ2h0LmludGVuc2l0eSA9IGxpZ2h0SW50ZW5zaXR5O1xcbiAgbGlnaHQucG9zaXRpb24gPSBsaWdodFBvc2l0aW9uO1xcbiAgaWYgKGxpZ2h0VHlwZSA8IC0wLjUpIHsgLy8gZGlzYWJsZWQgbGlnaHRcXG4gICAgbGlnaHQuaW50ZW5zaXR5ID0gdmVjMygwLjApO1xcbiAgICBsaWdodC50eXBlID0gLTE7XFxuICB9IGVsc2UgaWYgKDAuNzUgPCBsaWdodFR5cGUpIHsgLy8gaXMgcG9pbnRsaWdodCBvciBzcG90bGlnaHRcXG4gICAgbGlnaHQucG9pbnRUb0xpZ2h0ID0gbGlnaHRQb3NpdGlvbiAtIHZfcG9zaXRpb25faW5Xb3JsZDtcXG4gICAgbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKGxpZ2h0LnBvaW50VG9MaWdodCk7XFxuICAgIGxpZ2h0LnR5cGUgPSAxO1xcbiAgfSBlbHNlIHsgLy8gaXMgRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgbGlnaHQudHlwZSA9IDA7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ICogLTEuMCk7XFxuICB9XFxuXFxuICBpZiAobGlnaHRUeXBlID4gMS43NSkgeyAvLyBpcyBzcG90bGlnaHRcXG4gICAgbGlnaHQudHlwZSA9IDI7XFxuICB9XFxuXFxuICBjb25zdCBmbG9hdCBNX1BJID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuICBsaWdodC5pbnRlbnNpdHkgKj0gTV9QSTsgLy8gUHVuY3R1YWwgTGlnaHRcXG5cXG4gIC8vIEF0dGVudWF0aW9uXFxuICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xcbiAgZ2V0TGlnaHRBdHRlbnVhdGVkKGxpZ2h0KTtcXG5cXG4gIHJldHVybiBsaWdodDtcXG59XFxuXFxuXFxuZmxvYXQgZGVjb2RlUkdCQVRvRGVwdGgodmVjNCBSR0JBKXtcXG4gIGNvbnN0IGZsb2F0IHJNYXNrID0gMS4wO1xcbiAgY29uc3QgZmxvYXQgZ01hc2sgPSAxLjAgLyAyNTUuMDtcXG4gIGNvbnN0IGZsb2F0IGJNYXNrID0gMS4wIC8gKDI1NS4wICogMjU1LjApO1xcbiAgY29uc3QgZmxvYXQgYU1hc2sgPSAxLjAgLyAoMjU1LjAgKiAyNTUuMCAqIDI1NS4wKTtcXG4gIGZsb2F0IGRlcHRoID0gZG90KFJHQkEsIHZlYzQock1hc2ssIGdNYXNrLCBiTWFzaywgYU1hc2spKTtcXG4gIHJldHVybiBkZXB0aDtcXG59XFxuXFxudm9pZCBtYWluICgpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIC8vIE5vcm1hbFxcbiAgdmVjMyBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZSh2X25vcm1hbF9pbldvcmxkKTtcXG5cXG4gIC8vIGRpZmZ1c2VDb2xvclxcbiAgdmVjMyBkaWZmdXNlQ29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xcbiAgZmxvYXQgYWxwaGEgPSAxLjA7XFxuXFxuICB2ZWM0IGRpZmZ1c2VDb2xvckZhY3RvciA9IGdldF9kaWZmdXNlQ29sb3JGYWN0b3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgaWYgKHZfY29sb3IgIT0gZGlmZnVzZUNvbG9yICYmIGRpZmZ1c2VDb2xvckZhY3Rvci5yZ2IgIT0gZGlmZnVzZUNvbG9yKSB7XFxuICAgIGRpZmZ1c2VDb2xvciA9IHZfY29sb3IgKiBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGRpZmZ1c2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmICh2X2NvbG9yID09IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgICBhbHBoYSA9IGRpZmZ1c2VDb2xvckZhY3Rvci5hO1xcbiAgfSBlbHNlIGlmIChkaWZmdXNlQ29sb3JGYWN0b3IucmdiID09IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSB2X2NvbG9yO1xcbiAgfSBlbHNlIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gdmVjMygxLjAsIDEuMCwgMS4wKTtcXG4gIH1cXG5cXG4gIC8vIGRpZmZ1c2VDb2xvclRleHR1cmVcXG4gIHZlYzQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZSh1X2RpZmZ1c2VDb2xvclRleHR1cmUsIHZfdGV4Y29vcmRfMCk7XFxuICBpZiAodGV4dHVyZUNvbG9yLnIgPiAwLjA1KSB7XFxuICAgIGRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlQ29sb3IucmdiO1xcbiAgICBhbHBoYSAqPSB0ZXh0dXJlQ29sb3IuYTtcXG4gIH1cXG5cXG4gIC8vIHNoYWRvdyBtYXBwaW5nXFxuICBpZih2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0LncgPiAwLjApe1xcbiAgICBmbG9hdCB6TmVhciA9IGdldF96TmVhcklubmVyKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgZmxvYXQgekZhciA9IGdldF96RmFySW5uZXIobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBmbG9hdCBub3JtYWxpemF0aW9uQ29lZmZpY2llbnQgPSAxLjAgLyAoekZhciAtIHpOZWFyKTtcXG5cXG4gICAgdmVjMiBzaGFkb3dNYXBVViA9IHZfdGV4Y29vcmRfMS54eSAvIHZfdGV4Y29vcmRfMS53O1xcblxcbiAgICAjaWZkZWYgUk5fSVNfREVCVUdHSU5HXFxuICAgICAgYm9vbCBpblNoYWRvd01hcCA9IChzaGFkb3dNYXBVVi54ID49IDAuMCAmJiBzaGFkb3dNYXBVVi54IDw9IDEuMCkgJiYgKHNoYWRvd01hcFVWLnkgPj0gMC4wICYmIHNoYWRvd01hcFVWLnkgPD0gMS4wKTtcXG4gICAgICBpZihpblNoYWRvd01hcCA9PSBmYWxzZSl7XFxuICAgICAgICBydDAgPSBnZXRfZGVidWdDb2xvckZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG4gICAgICAgIHJldHVybjtcXG4gICAgICB9XFxuICAgICNlbmRpZlxcblxcbiAgICBmbG9hdCBtZWFzdXJlRGVwdGggPSBub3JtYWxpemF0aW9uQ29lZmZpY2llbnQgKiBsZW5ndGgodl9wcm9qUG9zaXRpb25fZnJvbV9saWdodCk7XFxuICAgIGZsb2F0IHRleHR1cmVEZXB0aCA9IGRlY29kZVJHQkFUb0RlcHRoKHRleHR1cmUodV9kZXB0aFRleHR1cmUsIHNoYWRvd01hcFVWKSk7XFxuICAgIGZsb2F0IGFsbG93YWJsZURlcHRoRXJyb3IgPSBnZXRfYWxsb3dhYmxlRGVwdGhFcnJvcihtYXRlcmlhbFNJRCwgMCk7XFxuXFxuICAgIGlmKG1lYXN1cmVEZXB0aCA+IHRleHR1cmVEZXB0aCArIGFsbG93YWJsZURlcHRoRXJyb3Ipe1xcbiAgICAgIC8vIGNhc2Ugb2Ygc2hhZG93XFxuICAgICAgdmVjNCBzaGFkb3dDb2xvckZhY3RvciA9IGdldF9zaGFkb3dDb2xvckZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgZGlmZnVzZUNvbG9yID0gc2hhZG93Q29sb3JGYWN0b3IucmdiO1xcbiAgICAgIGFscGhhID0gc2hhZG93Q29sb3JGYWN0b3IuYTtcXG4gICAgfVxcbiAgfVxcblxcbiAgLy8gTGlnaHRpbmdcXG4gIHZlYzMgc2hhZGluZ0NvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gIGludCBzaGFkaW5nTW9kZWwgPSBnZXRfc2hhZGluZ01vZGVsKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChzaGFkaW5nTW9kZWwgPiAwKSB7XFxuXFxuICAgIHZlYzMgZGlmZnVzZSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuICAgIHZlYzMgc3BlY3VsYXIgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xcbiAgICBpbnQgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IC8qIHNoYWRlcml0eTogQHtDb25maWcubWF4TGlnaHROdW1iZXJJblNoYWRlcn0gKi87IGkrKykge1xcbiAgICAgIGlmIChpID49IGxpZ2h0TnVtYmVyKSB7XFxuICAgICAgICBicmVhaztcXG4gICAgICB9XFxuXFxuICAgICAgLy8gTGlnaHRcXG4gICAgICBMaWdodCBsaWdodCA9IGdldExpZ2h0KGksIHZfcG9zaXRpb25faW5Xb3JsZC54eXopO1xcblxcbiAgICAgIGRpZmZ1c2UgKz0gZGlmZnVzZUNvbG9yICogbWF4KDAuMCwgZG90KG5vcm1hbF9pbldvcmxkLCBsaWdodC5kaXJlY3Rpb24pKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuXFxuICAgICAgdmVjMyB2aWV3UG9zaXRpb24gPSBnZXRfdmlld1Bvc2l0aW9uKGNhbWVyYVNJRCwgMCk7XFxuICAgICAgZmxvYXQgc2hpbmluZXNzID0gZ2V0X3NoaW5pbmVzcyhtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgaWYgKHNoYWRpbmdNb2RlbCA9PSAyKSB7Ly8gQkxJTk5cXG4gICAgICAgIC8vIFZpZXdEaXJlY3Rpb25cXG4gICAgICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2aWV3UG9zaXRpb24gLSB2X3Bvc2l0aW9uX2luV29ybGQueHl6KTtcXG4gICAgICAgIHZlYzMgaGFsZlZlY3RvciA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyZWN0aW9uKTtcXG4gICAgICAgIHNwZWN1bGFyICs9IHBvdyhtYXgoMC4wLCBkb3QoaGFsZlZlY3Rvciwgbm9ybWFsX2luV29ybGQpKSwgc2hpbmluZXNzKTtcXG4gICAgICB9IGVsc2UgaWYgKHNoYWRpbmdNb2RlbCA9PSAzKSB7IC8vIFBIT05HXFxuICAgICAgICB2ZWMzIHZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodmlld1Bvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkLnh5eik7XFxuICAgICAgICB2ZWMzIFIgPSByZWZsZWN0KGxpZ2h0LmRpcmVjdGlvbiwgbm9ybWFsX2luV29ybGQpO1xcbiAgICAgICAgc3BlY3VsYXIgKz0gcG93KG1heCgwLjAsIGRvdChSLCB2aWV3RGlyZWN0aW9uKSksIHNoaW5pbmVzcyk7XFxuICAgICAgfVxcblxcbiAgICB9XFxuXFxuICAgIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2UgKyBzcGVjdWxhcjtcXG4gIH0gZWxzZSB7XFxuICAgIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2VDb2xvcjtcXG4gIH1cXG5cXG4gIHJ0MCA9IHZlYzQoc2hhZGluZ0NvbG9yLCBhbHBoYSk7XFxuICAvL3J0MCA9IHZlYzQodV9saWdodE51bWJlciwgMC4wLCAwLjAsIDEuMCk7XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5pbiB2ZWMzIGFfY29sb3I7XFxuaW4gdmVjMyBhX25vcm1hbDtcXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzIgYV90ZXhjb29yZF8xO1xcbmluIHZlYzQgYV9qb2ludDtcXG5pbiB2ZWM0IGFfd2VpZ2h0O1xcbm91dCB2ZWMzIHZfY29sb3I7XFxub3V0IHZlYzMgdl9ub3JtYWxfaW5Xb3JsZDtcXG5vdXQgdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcbm91dCB2ZWM0IHZfdGV4Y29vcmRfMTtcXG5vdXQgdmVjNCB2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0O1xcblxcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbm1hdDMgdG9Ob3JtYWxNYXRyaXgobWF0NCBtKSB7XFxuICBmbG9hdCBhMDAgPSBtWzBdWzBdLCBhMDEgPSBtWzBdWzFdLCBhMDIgPSBtWzBdWzJdLCBhMDMgPSBtWzBdWzNdLFxcbiAgYTEwID0gbVsxXVswXSwgYTExID0gbVsxXVsxXSwgYTEyID0gbVsxXVsyXSwgYTEzID0gbVsxXVszXSxcXG4gIGEyMCA9IG1bMl1bMF0sIGEyMSA9IG1bMl1bMV0sIGEyMiA9IG1bMl1bMl0sIGEyMyA9IG1bMl1bM10sXFxuICBhMzAgPSBtWzNdWzBdLCBhMzEgPSBtWzNdWzFdLCBhMzIgPSBtWzNdWzJdLCBhMzMgPSBtWzNdWzNdO1xcblxcbiAgZmxvYXQgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxcbiAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxcbiAgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwLFxcbiAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxcbiAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxcbiAgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyLFxcbiAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxcbiAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxcbiAgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwLFxcbiAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxcbiAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxcbiAgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyO1xcblxcbiAgZmxvYXQgZGV0ZXJtaW5hbnRWYWwgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XFxuXFxuICByZXR1cm4gbWF0MyhcXG4gICAgYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5LCBhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcsIGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNixcXG4gICAgYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5LCBhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcsIGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNixcXG4gICAgYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzLCBhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEsIGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgLyBkZXRlcm1pbmFudFZhbDtcXG59XFxuXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuXFxuaGlnaHAgbWF0NCBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoIGhpZ2hwIHZlYzQgcXVhdGVybmlvbiwgaGlnaHAgdmVjMyB0cmFuc2xhdGlvbiwgaGlnaHAgdmVjMyBzY2FsZSApIHtcXG4gIGhpZ2hwIHZlYzQgcSA9IHF1YXRlcm5pb247XFxuICBoaWdocCB2ZWMzIHQgPSB0cmFuc2xhdGlvbjtcXG5cXG4gIGhpZ2hwIGZsb2F0IHN4ID0gcS54ICogcS54O1xcbiAgaGlnaHAgZmxvYXQgc3kgPSBxLnkgKiBxLnk7XFxuICBoaWdocCBmbG9hdCBzeiA9IHEueiAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN4ID0gcS55ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3kgPSBxLnggKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeiA9IHEueCAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHd4ID0gcS53ICogcS54O1xcbiAgaGlnaHAgZmxvYXQgd3kgPSBxLncgKiBxLnk7XFxuICBoaWdocCBmbG9hdCB3eiA9IHEudyAqIHEuejtcXG5cXG4gIGhpZ2hwIG1hdDQgbWF0ID0gbWF0NChcXG4gICAgMS4wIC0gMi4wICogKHN5ICsgc3opLCAyLjAgKiAoY3ogKyB3eiksIDIuMCAqIChjeSAtIHd5KSwgMC4wLFxcbiAgICAyLjAgKiAoY3ogLSB3eiksIDEuMCAtIDIuMCAqIChzeCArIHN6KSwgMi4wICogKGN4ICsgd3gpLCAwLjAsXFxuICAgIDIuMCAqIChjeSArIHd5KSwgMi4wICogKGN4IC0gd3gpLCAxLjAgLSAyLjAgKiAoc3ggKyBzeSksIDAuMCxcXG4gICAgdC54LCB0LnksIHQueiwgMS4wXFxuICApO1xcblxcbiAgaGlnaHAgbWF0NCB1bmlmb3JtU2NhbGVNYXQgPSBtYXQ0KFxcbiAgICBzY2FsZS54LCAwLjAsIDAuMCwgMC4wLFxcbiAgICAwLjAsIHNjYWxlLnksIDAuMCwgMC4wLFxcbiAgICAwLjAsIDAuMCwgc2NhbGUueiwgMC4wLFxcbiAgICAwLjAsIDAuMCwgMC4wLCAxLjBcXG4gICk7XFxuXFxuICByZXR1cm4gbWF0KnVuaWZvcm1TY2FsZU1hdDtcXG59XFxuXFxuaGlnaHAgdmVjNCB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGhpZ2hwIHZlYzIgdmVjX3h5LCBoaWdocCBmbG9hdCBjcml0ZXJpYSl7XFxuXFxuICBoaWdocCBmbG9hdCByO1xcbiAgaGlnaHAgZmxvYXQgZztcXG4gIGhpZ2hwIGZsb2F0IGI7XFxuICBoaWdocCBmbG9hdCBhO1xcblxcbiAgaGlnaHAgZmxvYXQgaXggPSBmbG9vcih2ZWNfeHkueCAqIGNyaXRlcmlhKTtcXG4gIGhpZ2hwIGZsb2F0IHYxeCA9IGl4IC8gY3JpdGVyaWE7XFxuICBoaWdocCBmbG9hdCB2MXkgPSBpeCAtIGZsb29yKHYxeCkgKiBjcml0ZXJpYTtcXG5cXG4gIHIgPSAoIHYxeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBnID0gKCB2MXkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgaGlnaHAgZmxvYXQgaXkgPSBmbG9vciggdmVjX3h5LnkgKiBjcml0ZXJpYSk7XFxuICBoaWdocCBmbG9hdCB2MnggPSBpeSAvIGNyaXRlcmlhO1xcbiAgaGlnaHAgZmxvYXQgdjJ5ID0gaXkgLSBmbG9vcih2MngpICogY3JpdGVyaWE7XFxuXFxuICBiID0gKCB2MnggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgYSA9ICggdjJ5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIHIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgZyAtPSAxLjAvY3JpdGVyaWE7XFxuICBiIC09IDEuMC9jcml0ZXJpYTtcXG4gIGEgLT0gMS4wL2NyaXRlcmlhO1xcblxcbiAgciA9IHIqMi4wLTEuMDtcXG4gIGcgPSBnKjIuMC0xLjA7XFxuICBiID0gYioyLjAtMS4wO1xcbiAgYSA9IGEqMi4wLTEuMDtcXG5cXG4gIHJldHVybiB2ZWM0KHIsIGcsIGIsIGEpO1xcbn1cXG5cXG5tYXQ0IGdldFNraW5NYXRyaXgoZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQpIHtcXG5cXG4jaWZkZWYgUk5fQk9ORV9EQVRBX1RZUEVfTWF0NDN4MVxcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKSk7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDIpXFxuICB2ZWMyIGNyaXRlcmlhID0gdmVjMig0MDk2LjAsIDQwOTYuMCk7XFxuXFxuICB2ZWM0IHRxX3ggPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgc3FfeCA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfeC53LCBzcV94LncpLCBjcml0ZXJpYS54KTtcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeC54eXosIHNxX3gueHl6KTtcXG5cXG4gIHZlYzQgdHFfeSA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgdmVjNCBzcV95ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfeS53LCBzcV95LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV95Lnh5eiwgc3FfeS54eXopO1xcblxcbiAgdmVjNCB0cV96ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICB2ZWM0IHNxX3ogPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV96LncsIHNxX3oudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3oueHl6LCBzcV96Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHZlYzQgc3FfdyA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3cudywgc3Ffdy53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfdy54eXosIHNxX3cueHl6KTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMl9PTEQpXFxuICB2ZWM0IHRzX3ggPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICB2ZWM0IHRzX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpLCB0c195Lnh5eiwgdmVjMyh0c195LncpKTtcXG4gIHZlYzQgdHNfeiA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgdmVjNCB0c193ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDEpXFxuICB2ZWM0IGJvbmVDb21wcmVzc2VkQ2h1bmtzWCA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC54KSk7XFxuICB2ZWM0IGJvbmVDb21wcmVzc2VkQ2h1bmtzWSA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICB2ZWM0IGJvbmVDb21wcmVzc2VkQ2h1bmtzWiA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICB2ZWM0IGJvbmVDb21wcmVzc2VkQ2h1bmtzVyA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuXFxuICB2ZWMyIGNyaXRlcmlhID0gdmVjMig0MDk2LjAsIDQwOTYuMCk7XFxuICB2ZWM0IGJvbmVDb21wcmVzc2VkSW5mbyA9IGdldF9ib25lQ29tcHJlc3NlZEluZm8oMC4wLCAwKTtcXG5cXG4gIHZlYzQgdHNfeCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC54eSwgY3JpdGVyaWEueCksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgdmVjNCB0c195ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1kuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1kueHksIGNyaXRlcmlhLngpLCB0c195Lnh5eiwgdmVjMyh0c195LncpKTtcXG4gIHZlYzQgdHNfeiA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NaLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NaLnh5LCBjcml0ZXJpYS54KSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICB2ZWM0IHRzX3cgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzVy56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzVy54eSwgY3JpdGVyaWEueCksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcbiNlbmRpZlxcbiAgcmV0dXJuIHNraW5NYXQ7XFxufVxcbiNlbmRpZlxcblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbmJvb2wgc2tpbm5pbmcoXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCxcXG4gIGluIG1hdDMgaW5Ob3JtYWxNYXRyaXgsXFxuICBvdXQgbWF0MyBvdXROb3JtYWxNYXRyaXgsXFxuICBpbiB2ZWMzIGluUG9zaXRpb25faW5Mb2NhbCxcXG4gIG91dCB2ZWM0IG91dFBvc2l0aW9uX2luV29ybGQsXFxuICBpbiB2ZWMzIGluTm9ybWFsX2luTG9jYWwsXFxuICBvdXQgdmVjMyBvdXROb3JtYWxfaW5Xb3JsZFxcbiAgKVxcbntcXG4gIG1hdDQgc2tpbk1hdCA9IGdldFNraW5NYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQpO1xcbiAgb3V0UG9zaXRpb25faW5Xb3JsZCA9IHNraW5NYXQgKiB2ZWM0KGluUG9zaXRpb25faW5Mb2NhbCwgMS4wKTtcXG4gIG91dE5vcm1hbE1hdHJpeCA9IHRvTm9ybWFsTWF0cml4KHNraW5NYXQpO1xcbiAgb3V0Tm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUob3V0Tm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuXFxuICByZXR1cm4gdHJ1ZTtcXG59XFxuI2VuZGlmXFxuXFxuYm9vbCBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgaW4gbWF0NCB3b3JsZE1hdHJpeCxcXG4gIGluIG1hdDQgdmlld01hdHJpeCxcXG4gIGluIGJvb2wgaXNCaWxsYm9hcmQsXFxuICBpbiBtYXQzIGluTm9ybWFsTWF0cml4LFxcbiAgb3V0IG1hdDMgb3V0Tm9ybWFsTWF0cml4LFxcbiAgaW4gdmVjMyBpblBvc2l0aW9uX2luTG9jYWwsXFxuICBvdXQgdmVjNCBvdXRQb3NpdGlvbl9pbldvcmxkLFxcbiAgaW4gdmVjMyBpbk5vcm1hbF9pbkxvY2FsLFxcbiAgb3V0IHZlYzMgb3V0Tm9ybWFsX2luV29ybGRcXG4pIHtcXG4gIGJvb2wgaXNTa2lubmluZyA9IGZhbHNlO1xcblxcbiAgdmVjMyBwb3NpdGlvbl9pbkxvY2FsO1xcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbiAgaWYgKHVfbW9ycGhUYXJnZXROdW1iZXIgPT0gMCkge1xcbiNlbmRpZlxcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gaW5Qb3NpdGlvbl9pbkxvY2FsO1xcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbiAgfSBlbHNlIHtcXG4gICAgZmxvYXQgdmVydGV4SWR4ID0gYV9iYXJ5Q2VudHJpY0Nvb3JkLnc7XFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBnZXRfcG9zaXRpb24odmVydGV4SWR4LCBpblBvc2l0aW9uX2luTG9jYWwpO1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgbWF0NCB3b3JsZE1hdHJpeElubmVyID0gd29ybGRNYXRyaXg7XFxuICBpZiAoaXNCaWxsYm9hcmQpIHtcXG4gICAgbWF0NCBpbnZlcnNlVmlld01hdHJpeCA9IGludmVyc2Uodmlld01hdHJpeCk7XFxuICAgIGludmVyc2VWaWV3TWF0cml4WzNdWzBdID0gMC4wOy8vd29ybGRNYXRyaXhbM11bMF07XFxuICAgIGludmVyc2VWaWV3TWF0cml4WzNdWzFdID0gMC4wOy8vd29ybGRNYXRyaXhbM11bMV07XFxuICAgIGludmVyc2VWaWV3TWF0cml4WzNdWzJdID0gMC4wOy8vd29ybGRNYXRyaXhbM11bMl07XFxuICAgIHdvcmxkTWF0cml4SW5uZXIgPSBpbnZlcnNlVmlld01hdHJpeCAqIHdvcmxkTWF0cml4O1xcbiAgfVxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgaWYgKHNrZWxldGFsQ29tcG9uZW50U0lEID49IDAuMCkge1xcbiAgICBpc1NraW5uaW5nID0gc2tpbm5pbmcoc2tlbGV0YWxDb21wb25lbnRTSUQsIGluTm9ybWFsTWF0cml4LCBvdXROb3JtYWxNYXRyaXgsIHBvc2l0aW9uX2luTG9jYWwsIG91dFBvc2l0aW9uX2luV29ybGQsIGluTm9ybWFsX2luTG9jYWwsIG91dE5vcm1hbF9pbldvcmxkKTtcXG4gIH0gZWxzZSB7XFxuI2VuZGlmXFxuICAgIG91dE5vcm1hbE1hdHJpeCA9IGluTm9ybWFsTWF0cml4O1xcbiAgICBvdXRQb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXhJbm5lciAqIHZlYzQocG9zaXRpb25faW5Mb2NhbCwgMS4wKTtcXG4gICAgb3V0Tm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUoaW5Ob3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIHJldHVybiBpc1NraW5uaW5nO1xcbn1cXG5cXG5cXG52b2lkIG1haW4oKXtcXG5cXG4jaWZkZWYgUk5fSVNfREFUQVRFWFRVUkVfTU9ERVxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICAjaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gYV9pbnN0YW5jZUluZm8ueTtcXG4gICAgI2Vsc2VcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuI2Vsc2UgLy8gUk5fSVNfVU5JRk9STV9NT0RFXFxuXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IC0xLjA7IC8vIG1hdGVyaWFsU0lEIGlzIG5vdCB1c2VkIGluIFVuaWZvcm0gbW9kZVxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBmbG9hdChnZXRfc2tpbm5pbmdNb2RlKDAuMCwgMCkpO1xcbiAgI2VuZGlmXFxuXFxuI2VuZGlmXFxuXFxuZmxvYXQgY2FtZXJhU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1svKiBzaGFkZXJpdHk6IEB7V2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUR9ICovXTtcXG5cXG4jaWYgZGVmaW5lZChXRUJHTDJfTVVMVElfVklFVykgJiYgZGVmaW5lZChSTl9JU19WRVJURVhfU0hBREVSKVxcbi8vIGlmICh1X2lzTWFpblZyID09IDEpIHtcXG4gIGNhbWVyYVNJRCArPSBmbG9hdChnbF9WaWV3SURfT1ZSKTtcXG4vLyB9XFxuI2VuZGlmXFxuXFxuXFxuICBtYXQ0IHdvcmxkTWF0cml4ID0gZ2V0X3dvcmxkTWF0cml4KGFfaW5zdGFuY2VJbmZvLngpO1xcbiAgbWF0NCB2aWV3TWF0cml4ID0gZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIG1hdDQgcHJvamVjdGlvbk1hdHJpeCA9IGdldF9wcm9qZWN0aW9uTWF0cml4KGNhbWVyYVNJRCwgMCk7XFxuICBtYXQzIG5vcm1hbE1hdHJpeCA9IGdldF9ub3JtYWxNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuXFxuICAvLyBTa2VsZXRhbFxcbiAgcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgZmFsc2UsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBhX3Bvc2l0aW9uLFxcbiAgICB2X3Bvc2l0aW9uX2luV29ybGQsXFxuICAgIGFfbm9ybWFsLFxcbiAgICB2X25vcm1hbF9pbldvcmxkXFxuICApO1xcblxcbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHZfcG9zaXRpb25faW5Xb3JsZDtcXG5cXG4vLyAjaWZkZWYgUk5fSVNfUE9JTlRTUFJJVEVcXG5cXG52ZWM0IHBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG52ZWMzIHZpZXdQb3NpdGlvbiA9IGdldF92aWV3UG9zaXRpb24oY2FtZXJhU0lELCAwKTtcXG5mbG9hdCBkaXN0YW5jZUZyb21DYW1lcmEgPSBsZW5ndGgocG9zaXRpb25faW5Xb3JsZC54eXogLSB2aWV3UG9zaXRpb24pO1xcbnZlYzMgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uID0gZ2V0X3BvaW50RGlzdGFuY2VBdHRlbnVhdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciA9IHNxcnQoMS4wLyhwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueCArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi55ICogZGlzdGFuY2VGcm9tQ2FtZXJhICsgcG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnogKiBkaXN0YW5jZUZyb21DYW1lcmEgKiBkaXN0YW5jZUZyb21DYW1lcmEpKTtcXG5mbG9hdCBtYXhQb2ludFNpemUgPSBnZXRfcG9pbnRTaXplKG1hdGVyaWFsU0lELCAwKTtcXG5nbF9Qb2ludFNpemUgPSBjbGFtcChkaXN0YW5jZUF0dGVudWF0aW9uRmFjdG9yICogbWF4UG9pbnRTaXplLCAwLjAsIG1heFBvaW50U2l6ZSk7XFxuXFxuLy8gI2VuZGlmXFxuXFxuXFxuICAvLyBTaGFkb3cgbWFwcGluZ1xcbiAgbWF0NCBsaWdodFZpZXdQcm9qZWN0aW9uTWF0cml4ID0gZ2V0X2xpZ2h0Vmlld1Byb2plY3Rpb25NYXRyaXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgdl9wcm9qUG9zaXRpb25fZnJvbV9saWdodCA9IGxpZ2h0Vmlld1Byb2plY3Rpb25NYXRyaXggKiB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuXFxuICAvLyBGb2xsb3dpbmcgdE1hdHJpeCBpcyBiYXNlZCBvbiBodHRwczovL3dnbGQub3JnL2Qvd2ViZ2wvdzA1MS5odG1sXFxuICBtYXQ0IHRNYXRyaXggPSBtYXQ0KFxcbiAgICAwLjUsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC41LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIDEuMCwgMC4wLFxcbiAgICAwLjUsIDAuNSwgMC4wLCAxLjBcXG4gICk7XFxuICB2X3RleGNvb3JkXzEgPSB0TWF0cml4ICogdl9wcm9qUG9zaXRpb25fZnJvbV9saWdodDtcXG5cXG4gIHZfY29sb3IgPSBhX2NvbG9yO1xcbiAgdl9ub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbE1hdHJpeCAqIGFfbm9ybWFsO1xcbiAgdl90ZXhjb29yZF8wID0gYV90ZXhjb29yZF8wO1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRFJlY3QgdV9iYXNlQ29sb3JUZXh0dXJlOyAvLyBpbml0aWFsVmFsdWU9KDAsd2hpdGUpXFxudW5pZm9ybSBmbG9hdCB1X2NvdW50OyAvLyBpbml0aWFsVmFsdWU9MC4wXFxudW5pZm9ybSBmbG9hdCB1X2RpcmVjdGlvbjsgLy8gaW5pdGlhbFZhbHVlPTAuMFxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG52b2lkIG1haW4gKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbmZsb2F0IGkgPSBnZXRfY291bnQobWF0ZXJpYWxTSUQsIDApO1xcbmZsb2F0IGRpciA9IGdldF9kaXJlY3Rpb24obWF0ZXJpYWxTSUQsIDApO1xcblxcbnJ0MCA9IHRleHR1cmUodV9iYXNlQ29sb3JUZXh0dXJlLCBnbF9GcmFnQ29vcmQueHkpO1xcblxcbmlmIChkaXIgPiAwLjApIHtcXG4gIC8vIGhvcml6b250YWxcXG4gIHJ0MCArPSB0ZXh0dXJlKHVfYmFzZUNvbG9yVGV4dHVyZSwgdmVjMihnbF9GcmFnQ29vcmQueCArIHBvdygyLjAsIGkpLCBnbF9GcmFnQ29vcmQueSkpO1xcbn0gZWxzZSB7XFxuICAvLyB2aXJ0aWNhbFxcbiAgcnQwICs9IHRleHR1cmUodV9iYXNlQ29sb3JUZXh0dXJlLCB2ZWMyKGdsX0ZyYWdDb29yZC54LCBnbF9GcmFnQ29vcmQueSArIHBvdygyLjAsIGkpKSk7XFxufVxcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxudm9pZCBtYWluKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbm1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxubWF0NCB2aWV3TWF0cml4ID0gZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5tYXQ0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB3b3JsZE1hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwgMS4wKTtcXG5cXG5cXG52X3RleGNvb3JkXzAgPSBhX3RleGNvb3JkXzA7XFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7cmVuZGVyVGFyZ2V0QmVnaW59ICovXFxuXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbmluIHZlYzIgdl90ZXhjb29yZF8wO1xcblxcbmZsb2F0IGVkZ2VfcmF0aW8odmVjMyBiYXJ5MywgZmxvYXQgd2lyZWZyYW1lV2lkdGhJbm5lciwgZmxvYXQgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlKSB7XFxuICB2ZWMzIGQgPSBmd2lkdGgoYmFyeTMpO1xcbiAgdmVjMyB4ID0gYmFyeTMgKyB2ZWMzKDEuMCAtIHdpcmVmcmFtZVdpZHRoSW5uZXIpICogZDtcXG4gIHZlYzMgYTMgPSBzbW9vdGhzdGVwKHZlYzMoMC4wKSwgZCwgeCk7XFxuICBmbG9hdCBmYWN0b3IgPSBtaW4obWluKGEzLngsIGEzLnkpLCBhMy56KTtcXG5cXG4gIHJldHVybiBjbGFtcCgoMS4wIC0gZmFjdG9yKSwgMC4wLCAxLjApO1xcbn1cXG5cXG52b2lkIG1haW4gKClcXG57XFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcblxcbiAgZmxvYXQgc3ludGhlc2l6ZUNvZWZmaWNpZW50MCA9IHVfc3ludGhlc2l6ZUNvZWZmaWNpZW50WzBdO1xcbiAgdmVjMyBjb2xvciA9IHN5bnRoZXNpemVDb2VmZmljaWVudDAgKiB0ZXh0dXJlKHVfc3ludGhlc2l6ZVRleHR1cmUwLCB2X3RleGNvb3JkXzApLnJnYjtcXG5cXG4gIGZsb2F0IHN5bnRoZXNpemVDb2VmZmljaWVudDEgPSB1X3N5bnRoZXNpemVDb2VmZmljaWVudFsxXTtcXG4gIGZsb2F0IHN5bnRoZXNpemVDb2VmZmljaWVudDIgPSB1X3N5bnRoZXNpemVDb2VmZmljaWVudFsyXTtcXG4gIGZsb2F0IHN5bnRoZXNpemVDb2VmZmljaWVudDMgPSB1X3N5bnRoZXNpemVDb2VmZmljaWVudFszXTtcXG4gIGZsb2F0IHN5bnRoZXNpemVDb2VmZmljaWVudDQgPSB1X3N5bnRoZXNpemVDb2VmZmljaWVudFs0XTtcXG4gIGZsb2F0IHN5bnRoZXNpemVDb2VmZmljaWVudDUgPSB1X3N5bnRoZXNpemVDb2VmZmljaWVudFs1XTtcXG5cXG4gIGNvbG9yICs9IHN5bnRoZXNpemVDb2VmZmljaWVudDEgKiB0ZXh0dXJlKHVfc3ludGhlc2l6ZVRleHR1cmUxLCB2X3RleGNvb3JkXzApLnJnYjtcXG4gIGNvbG9yICs9IHN5bnRoZXNpemVDb2VmZmljaWVudDIgKiB0ZXh0dXJlKHVfc3ludGhlc2l6ZVRleHR1cmUyLCB2X3RleGNvb3JkXzApLnJnYjtcXG4gIGNvbG9yICs9IHN5bnRoZXNpemVDb2VmZmljaWVudDMgKiB0ZXh0dXJlKHVfc3ludGhlc2l6ZVRleHR1cmUzLCB2X3RleGNvb3JkXzApLnJnYjtcXG4gIGNvbG9yICs9IHN5bnRoZXNpemVDb2VmZmljaWVudDQgKiB0ZXh0dXJlKHVfc3ludGhlc2l6ZVRleHR1cmU0LCB2X3RleGNvb3JkXzApLnJnYjtcXG4gIGNvbG9yICs9IHN5bnRoZXNpemVDb2VmZmljaWVudDUgKiB0ZXh0dXJlKHVfc3ludGhlc2l6ZVRleHR1cmU1LCB2X3RleGNvb3JkXzApLnJnYjtcXG5cXG4gIHJ0MCA9IHZlYzQoY29sb3IsIDEuMCk7XFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEVuZH0gKi9cXG5cXG59XFxuXFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDJfTVVMVElfVklFV1xcbiNleHRlbnNpb24gR0xfT1ZSX211bHRpdmlldzIgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxub3V0IHZlYzIgdl90ZXhjb29yZF8wO1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbnZvaWQgbWFpbigpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5mbG9hdCB4ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMSkgPDwgMik7XFxuZmxvYXQgeSA9IGZsb2F0KChnbF9WZXJ0ZXhJRCAmIDIpIDw8IDEpO1xcbnZfdGV4Y29vcmRfMC54ID0geCAqIDAuNTtcXG52X3RleGNvb3JkXzAueSA9IHkgKiAwLjU7XFxuZ2xfUG9zaXRpb24gPSB2ZWM0KHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wxX0VYVF9TSEFERVJfVEVYVFVSRV9MT0RcXG4jZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFdFQkdMMV9FWFRfU1RBTkRBUkRfREVSSVZBVElWRVNcXG4jZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9EUkFXX0JVRkZFUlNcXG4jZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlXFxuI2VuZGlmXFxuXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcblxcbmNvbnN0IGZsb2F0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuI2RlZmluZSBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4KSBjbGFtcCh4LCBFcHNpbG9uLCAxLjApXFxuXFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxudW5pZm9ybSBpbnQgdV9tb3JwaFRhcmdldE51bWJlcjsgLy8gaW5pdGlhbFZhbHVlPTAsIGlzSW50ZXJuYWxTZXR0aW5nPXRydWUsIHNvbG9EYXR1bT1mYWxzZSwgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT10cnVlXFxuLy8gdW5pZm9ybSBpbnQgdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25bXTtcXG4vLyB1bmlmb3JtIGludCB1X21vcnBoV2VpZ2h0c1tdOyAvL1xcbiNlbmRpZlxcblxcbnVuaWZvcm0gaW50IHVfaXNNYWluVnI7IC8vIHNraXBQcm9jZXNzPXRydWVcXG51bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCB1X2RhdGFUZXh0dXJlOyAvLyBza2lwUHJvY2Vzcz10cnVlXFxuLyogc2hhZGVyaXR5OiBAe3dpZHRoT2ZEYXRhVGV4dHVyZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7aGVpZ2h0T2ZEYXRhVGV4dHVyZX0gKi9cXG5cXG4jaWYgZGVmaW5lZChHTFNMX0VTMykgJiYgZGVmaW5lZChSTl9JU19EQVRBVEVYVFVSRV9NT0RFKSAmJiBkZWZpbmVkKFJOX0lTX1VCT19FTkFCTEVEKVxcbi8qIHNoYWRlcml0eTogQHtkYXRhVUJPVmVjNFNpemV9ICovXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9EZWZpbml0aW9ufSAqL1xcbiNlbmRpZlxcblxcblxcbmhpZ2hwIHZlYzQgZmV0Y2hFbGVtZW50KGludCB2ZWM0X2lkeCkge1xcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuICBpZiAodmVjNF9pZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcXG4gICAgcmV0dXJuIGZldGNoVmVjNEZyb21WZWM0QmxvY2sodmVjNF9pZHgpO1xcbiAgfSBlbHNlIHtcXG4gICAgaW50IGlkeE9uRGF0YVRleCA9IHZlYzRfaWR4IC0gZGF0YVVCT1ZlYzRTaXplO1xcbiAgICBoaWdocCBpdmVjMiB1diA9IGl2ZWMyKGlkeE9uRGF0YVRleCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgaWR4T25EYXRhVGV4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gICAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuICB9XFxuI2VsaWYgZGVmaW5lZChHTFNMX0VTMylcXG4gIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIodmVjNF9pZHggJSB3aWR0aE9mRGF0YVRleHR1cmUsIHZlYzRfaWR4IC8gd2lkdGhPZkRhdGFUZXh0dXJlKTtcXG4gIHJldHVybiB0ZXhlbEZldGNoKCB1X2RhdGFUZXh0dXJlLCB1diwgMCApO1xcbiNlbHNlXFxuICAvLyBUaGlzIGlkZWEgZnJvbSBodHRwczovL3FpaXRhLmNvbS9ZVlQvaXRlbXMvYzY5NWFiNGIzY2Y3ZmFhOTM4ODVcXG4gIGhpZ2hwIHZlYzIgaW52U2l6ZSA9IHZlYzIoMS4wL2Zsb2F0KHdpZHRoT2ZEYXRhVGV4dHVyZSksIDEuMC9mbG9hdChoZWlnaHRPZkRhdGFUZXh0dXJlKSk7XFxuICBoaWdocCBmbG9hdCB0ID0gKGZsb2F0KHZlYzRfaWR4KSArIDAuNSkgKiBpbnZTaXplLng7XFxuICBoaWdocCBmbG9hdCB4ID0gZnJhY3QodCk7XFxuICBoaWdocCBmbG9hdCB5ID0gKGZsb29yKHQpICsgMC41KSAqIGludlNpemUueTtcXG4gICNpZmRlZiBHTFNMX0VTM1xcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2Vsc2VcXG4gIHJldHVybiB0ZXh0dXJlKCB1X2RhdGFUZXh0dXJlLCB2ZWMyKHgsIHkpKTtcXG4gICNlbmRpZlxcbiNlbmRpZlxcbn1cXG5cXG52ZWMyIGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnl6KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLnp3KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzIodmFsMC53LCB2YWwxLngpO1xcbiAgfVxcbn1cXG5cXG52ZWMzIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMzKHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbnZlYzQgZmV0Y2hWZWM0KGludCB2ZWM0X2lkeCkge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZsb2F0IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxubWF0MiBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuICBpbnQgdmVjNF9pZHggPSBzY2FsYXJfaWR4KjQ7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDIgZmV0Y2hNYXQyKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG5cXG4gIG1hdDIgdmFsID0gbWF0MihcXG4gICAgY29sMC54LCBjb2wwLnksXFxuICAgIGNvbDAueiwgY29sMC53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQzIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG5cXG59XFxuXFxubWF0MyBmZXRjaE1hdDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NCBmZXRjaE1hdDRObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICB2ZWM0IGNvbDQgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDQpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53LCBjb2wzLngsXFxuICAgICAgY29sMy55LCBjb2wzLnosIGNvbDMudywgY29sNC54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCwgY29sMi55LFxcbiAgICAgIGNvbDIueiwgY29sMi53LCBjb2wzLngsIGNvbDMueSxcXG4gICAgICBjb2wzLnosIGNvbDMudywgY29sNC54LCBjb2w0LnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueSwgY29sMi56LFxcbiAgICAgIGNvbDIudywgY29sMy54LCBjb2wzLnksIGNvbDMueixcXG4gICAgICBjb2wzLncsIGNvbDQueCwgY29sNC55LCBjb2w0LnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NChpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcbiAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMyk7XFxuXFxuICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0NHgzIGZldGNoTWF0NHgzKGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuXFxuICBtYXQ0eDMgdmFsID0gbWF0NHgzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG4gIHJldHVybiB2YWw7XFxufVxcblxcbmZsb2F0IHJhbmQoY29uc3QgdmVjMiBjbyl7XFxuICByZXR1cm4gZnJhY3Qoc2luKGRvdChjby54eSAsdmVjMigxMi45ODk4LDc4LjIzMykpKSAqIDQzNzU4LjU0NTMpO1xcbn1cXG5cXG52ZWMzIGRlc2NyYW1ibGUodmVjMyB2KSB7XFxuICBmbG9hdCBzZWVkID0gMC4wO1xcbiAgdi54IC09IHNpbihmcmFjdCh2LnkqMjAuMCkpO1xcbiAgdi56IC09IGNvcyhmcmFjdCgtdi55KjEwLjApKTtcXG4gIHJldHVybiB2O1xcbn1cXG5cXG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7XFxuXFxuZmxvYXQgbWF4Myh2ZWMzIHYpXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbG9hdCBzcShmbG9hdCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjMiBzcSh2ZWMyIHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMzIHNxKHZlYzMgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzQgc3EodmVjNCB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZmxvYXQgc2F0dXJhdGUoZmxvYXQgdClcXG57XFxuICByZXR1cm4gY2xhbXAodCwgMC4wLCAxLjApO1xcbn1cXG5cXG5cXG5pbiB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCB1X2Jhc2VDb2xvclRleHR1cmU7IC8vIGluaXRpYWxWYWx1ZT0oMCx3aGl0ZSlcXG51bmlmb3JtIGJvb2wgdV9lbmFibGVMaW5lYXJUb1NyZ2I7IC8vIGluaXRpYWxWYWx1ZT10cnVlXFxuXFxuLyogc2hhZGVyaXR5OiBAe3JlbmRlclRhcmdldEJlZ2lufSAqL1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbnZlYzMgbGluZWFyVG9TcmdiKHZlYzMgbGluZWFyQ29sb3IpIHtcXG4gIHJldHVybiBwb3cobGluZWFyQ29sb3IsIHZlYzMoMS4wLzIuMikpO1xcbn1cXG5cXG52ZWMzIHNyZ2JUb0xpbmVhcih2ZWMzIHNyZ2JDb2xvcikge1xcbiAgcmV0dXJuIHBvdyhzcmdiQ29sb3IsIHZlYzMoMi4yKSk7XFxufVxcblxcblxcbiNpZmRlZiBSTl9VU0VfS0hST05PU19QQlJfTkVVVFJBTFxcbi8vIElucHV0IGNvbG9yIGlzIG5vbi1uZWdhdGl2ZSBhbmQgcmVzaWRlcyBpbiB0aGUgTGluZWFyIFJlYy4gNzA5IGNvbG9yIHNwYWNlLlxcbi8vIE91dHB1dCBjb2xvciBpcyBhbHNvIExpbmVhciBSZWMuIDcwOSwgYnV0IGluIHRoZSBbMCwgMV0gcmFuZ2UuXFxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1RvbmVNYXBwaW5nL3RyZWUvbWFpbi9QQlJfTmV1dHJhbFxcbnZlYzMgUEJSTmV1dHJhbFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcbiAgY29uc3QgZmxvYXQgc3RhcnRDb21wcmVzc2lvbiA9IDAuOCAtIDAuMDQ7XFxuICBjb25zdCBmbG9hdCBkZXNhdHVyYXRpb24gPSAwLjE1O1xcblxcbiAgZmxvYXQgeCA9IG1pbihjb2xvci5yLCBtaW4oY29sb3IuZywgY29sb3IuYikpO1xcbiAgZmxvYXQgb2Zmc2V0ID0geCA8IDAuMDggPyB4IC0gNi4yNSAqIHggKiB4IDogMC4wNDtcXG4gIGNvbG9yIC09IG9mZnNldDtcXG5cXG4gIGZsb2F0IHBlYWsgPSBtYXgoY29sb3IuciwgbWF4KGNvbG9yLmcsIGNvbG9yLmIpKTtcXG4gIGlmIChwZWFrIDwgc3RhcnRDb21wcmVzc2lvbikgcmV0dXJuIGNvbG9yO1xcblxcbiAgY29uc3QgZmxvYXQgZCA9IDEuIC0gc3RhcnRDb21wcmVzc2lvbjtcXG4gIGZsb2F0IG5ld1BlYWsgPSAxLiAtIGQgKiBkIC8gKHBlYWsgKyBkIC0gc3RhcnRDb21wcmVzc2lvbik7XFxuICBjb2xvciAqPSBuZXdQZWFrIC8gcGVhaztcXG5cXG4gIGZsb2F0IGcgPSAxLiAtIDEuIC8gKGRlc2F0dXJhdGlvbiAqIChwZWFrIC0gbmV3UGVhaykgKyAxLik7XFxuICByZXR1cm4gbWl4KGNvbG9yLCBuZXdQZWFrICogdmVjMygxLCAxLCAxKSwgZyk7XFxufVxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfUkVJTkhBUkRcXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuICByZXR1cm4gY29sb3IgLyAodmVjMygxLjApICsgY29sb3IpO1xcbn1cXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0FDRVNfTkFSS09XSUNaXFxuLy8gQUNFUyB0b25lIG1hcCAoZmFzdGVyIGFwcHJveGltYXRpb24pXFxuLy8gc2VlOiBodHRwczovL2tuYXJrb3dpY3oud29yZHByZXNzLmNvbS8yMDE2LzAxLzA2L2FjZXMtZmlsbWljLXRvbmUtbWFwcGluZy1jdXJ2ZS9cXG52ZWMzIEFDRVNfTmFya293aWN6X1RvbmVNYXBwaW5nKHZlYzMgY29sb3IpXFxue1xcbiAgICBjb25zdCBmbG9hdCBBID0gMi41MTtcXG4gICAgY29uc3QgZmxvYXQgQiA9IDAuMDM7XFxuICAgIGNvbnN0IGZsb2F0IEMgPSAyLjQzO1xcbiAgICBjb25zdCBmbG9hdCBEID0gMC41OTtcXG4gICAgY29uc3QgZmxvYXQgRSA9IDAuMTQ7XFxuICAgIHJldHVybiBjbGFtcCgoY29sb3IgKiAoQSAqIGNvbG9yICsgQikpIC8gKGNvbG9yICogKEMgKiBjb2xvciArIEQpICsgRSksIDAuMCwgMS4wKTtcXG59XFxuI2VuZGlmXFxuXFxuI2lmIGRlZmluZWQoUk5fVVNFX0FDRVNfSElMTCkgfHwgZGVmaW5lZChSTl9VU0VfQUNFU19ISUxMX0VYUE9TVVJFX0JPT1NUKVxcbi8vIHNSR0IgPT4gWFlaID0+IEQ2NV8yX0Q2MCA9PiBBUDEgPT4gUlJUX1NBVFxcbmNvbnN0IG1hdDMgQUNFU0lucHV0TWF0ID0gbWF0M1xcbihcXG4gIDAuNTk3MTksIDAuMDc2MDAsIDAuMDI4NDAsXFxuICAwLjM1NDU4LCAwLjkwODM0LCAwLjEzMzgzLFxcbiAgMC4wNDgyMywgMC4wMTU2NiwgMC44Mzc3N1xcbik7XFxuXFxuLy8gT0RUX1NBVCA9PiBYWVogPT4gRDYwXzJfRDY1ID0+IHNSR0JcXG5jb25zdCBtYXQzIEFDRVNPdXRwdXRNYXQgPSBtYXQzXFxuKFxcbiAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3LFxcbiAgLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NixcXG4gIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDJcXG4pO1xcblxcbnZlYzMgUlJUQW5kT0RURml0KHZlYzMgdilcXG57XFxuICB2ZWMzIGEgPSB2ICogKHYgKyAwLjAyNDU3ODZmKSAtIDAuMDAwMDkwNTM3ZjtcXG4gIHZlYzMgYiA9IHYgKiAoMC45ODM3MjlmICogdiArIDAuNDMyOTUxMGYpICsgMC4yMzgwODFmO1xcbiAgcmV0dXJuIGEgLyBiO1xcbn1cXG5cXG52ZWMzIEFDRVNfSGlsbF9Ub25lTWFwcGluZyh2ZWMzIGNvbG9yKVxcbntcXG4gIGNvbG9yID0gQUNFU0lucHV0TWF0ICogY29sb3I7XFxuXFxuICAvLyBBcHBseSBSUlQgYW5kIE9EVFxcbiAgY29sb3IgPSBSUlRBbmRPRFRGaXQoY29sb3IpO1xcblxcbiAgY29sb3IgPSBBQ0VTT3V0cHV0TWF0ICogY29sb3I7XFxuXFxuICAvLyBDbGFtcCB0byBbMCwgMV1cXG4gIGNvbG9yID0gY2xhbXAoY29sb3IsIDAuMCwgMS4wKTtcXG5cXG4gIHJldHVybiBjb2xvcjtcXG59XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9HVF9UT05FTUFQXFxuZmxvYXQgV19mKGZsb2F0IHgsIGZsb2F0IGUwLCBmbG9hdCBlMSkge1xcbiAgaWYgKHggPD0gZTApXFxuICAgIHJldHVybiAwLjtcXG4gIGlmICh4ID49IGUxKVxcbiAgICByZXR1cm4gMS47XFxuICBmbG9hdCBhID0gKHggLSBlMCkgLyAoZTEgLSBlMCk7XFxuICByZXR1cm4gYSAqIGEgKiAoMy4gLSAyLiAqIGEpO1xcbn1cXG5mbG9hdCBIX2YoZmxvYXQgeCwgZmxvYXQgZTAsIGZsb2F0IGUxKSB7XFxuICBpZiAoeCA8PSBlMClcXG4gICAgcmV0dXJuIDAuO1xcbiAgaWYgKHggPj0gZTEpXFxuICAgIHJldHVybiAxLjtcXG4gIHJldHVybiAoeCAtIGUwKSAvIChlMSAtIGUwKTtcXG59XFxuXFxuY29uc3QgZmxvYXQgZSA9IDIuNzE4Mjg7XFxuXFxuZmxvYXQgR1RfVG9uZU1hcGluZyhmbG9hdCB4KSB7XFxuICBmbG9hdCBQID0gMS47IC8vIHBlYWsgbHVtaW5hbmNlXFxuICBmbG9hdCBhID0gMS47IC8vIGNvbnRyYXN0IHBhcmFtZXRlclxcbiAgZmxvYXQgbSA9IDAuMjI7IC8vIGJlZ2lubmluZyBvZiB0aGUgbGluZWFyIHBhcnRcXG4gIGZsb2F0IGwgPSAwLjQ7IC8vIGxlbmd0aCBvZiB0aGUgbGluZWFyIHBhcnRcXG4gIGZsb2F0IGMgPSAxLjMzOyAvLyBwYXJhbWV0ZXIgb2YgYmxhY2sgY29sb3JcXG4gIGZsb2F0IGIgPSAwLjsgLy8gcGFyYW1ldGVyIG9mIGJsYWNrIGNvbG9yXFxuICBmbG9hdCBsMCA9IChQIC0gbSkgKiBsIC8gYTtcXG4gIGZsb2F0IFRfeCA9IG0gKiBwb3coeCAvIG0sIGMpICsgYjtcXG4gIGZsb2F0IExfeCA9IG0gKyBhICogKHggLSBtKTtcXG4gIGZsb2F0IFMwID0gbSArIGwwO1xcbiAgZmxvYXQgUzEgPSBtICsgYSAqIGwwO1xcbiAgZmxvYXQgQzIgPSBhICogUCAvIChQIC0gUzEpO1xcbiAgZmxvYXQgU194ID0gUCAtIChQIC0gUzEpICogcG93KGUsIC0oQzIgKiAoeCAtIFMwKSAvIFApKTtcXG4gIGZsb2F0IHcwX3ggPSAxLiAtIFdfZih4LCAwLiwgbSk7XFxuICBmbG9hdCB3Ml94ID0gSF9mKHgsIG0gKyBsMCwgbSArIGwwKTtcXG4gIGZsb2F0IHcxX3ggPSAxLiAtIHcwX3ggLSB3Ml94O1xcbiAgZmxvYXQgZl94ID0gVF94ICogdzBfeCArIExfeCAqIHcxX3ggKyBTX3ggKiB3Ml94O1xcbiAgcmV0dXJuIGZfeDtcXG59XFxuI2VuZGlmXFxuXFxudm9pZCBtYWluICgpXFxue1xcblxcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG52ZWM0IGJhc2VDb2xvciA9IHRleHR1cmUodV9iYXNlQ29sb3JUZXh0dXJlLCB2X3RleGNvb3JkXzApO1xcblxcbi8vIEFwcGx5IFRvbmUgTWFwcGluZ1xcbiNpZmRlZiBSTl9VU0VfS0hST05PU19QQlJfTkVVVFJBTFxcbmJhc2VDb2xvci5yZ2IgPSBQQlJOZXV0cmFsVG9uZU1hcHBpbmcoYmFzZUNvbG9yLnJnYik7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9SRUlOSEFSRFxcbmJhc2VDb2xvci5yZ2IgPSBSZWluaGFyZFRvbmVNYXBwaW5nKGJhc2VDb2xvci5yZ2IpO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfQUNFU19OQVJLT1dJQ1pcXG5iYXNlQ29sb3IucmdiID0gQUNFU19OYXJrb3dpY3pfVG9uZU1hcHBpbmcoYmFzZUNvbG9yLnJnYik7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9BQ0VTX0hJTExcXG5iYXNlQ29sb3IucmdiID0gQUNFU19IaWxsX1RvbmVNYXBwaW5nKGJhc2VDb2xvci5yZ2IpO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfQUNFU19ISUxMX0VYUE9TVVJFX0JPT1NUXFxuYmFzZUNvbG9yLnJnYiAvPSAwLjY7XFxuYmFzZUNvbG9yLnJnYiA9IEFDRVNfSGlsbF9Ub25lTWFwcGluZyhiYXNlQ29sb3IucmdiKTtcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0dUX1RPTkVNQVBcXG5iYXNlQ29sb3IuciA9IEdUX1RvbmVNYXBpbmcoYmFzZUNvbG9yLnIpO1xcbmJhc2VDb2xvci5nID0gR1RfVG9uZU1hcGluZyhiYXNlQ29sb3IuZyk7XFxuYmFzZUNvbG9yLmIgPSBHVF9Ub25lTWFwaW5nKGJhc2VDb2xvci5iKTtcXG4jZW5kaWZcXG5cXG5cXG4vLyBDb252ZXJ0IGxpbmVhciBjb2xvciB0byBzUkdCIGNvbG9yIHNwYWNlLlxcbmlmIChnZXRfZW5hYmxlTGluZWFyVG9TcmdiKG1hdGVyaWFsU0lELCAwKSkge1xcbiAgYmFzZUNvbG9yLnJnYiA9IGxpbmVhclRvU3JnYihiYXNlQ29sb3IucmdiKTtcXG59XFxuXFxucnQwID0gYmFzZUNvbG9yO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWM0IGFfaW5zdGFuY2VJbmZvO1xcbmluIHZlYzIgYV90ZXhjb29yZF8wO1xcbmluIHZlYzMgYV9wb3NpdGlvbjtcXG5vdXQgdmVjMiB2X3RleGNvb3JkXzA7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxudm9pZCBtYWluKClcXG57XFxuXFxuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1swXTsgLy8gaW5kZXggMCBkYXRhIGlzIHRoZSBtYXRlcmlhbFNJRFxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGFfaW5zdGFuY2VJbmZvLnk7XFxuICAgICNlbHNlXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiNlbHNlIC8vIFJOX0lTX1VOSUZPUk1fTU9ERVxcblxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSAtMS4wOyAvLyBtYXRlcmlhbFNJRCBpcyBub3QgdXNlZCBpbiBVbmlmb3JtIG1vZGVcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gZmxvYXQoZ2V0X3NraW5uaW5nTW9kZSgwLjAsIDApKTtcXG4gICNlbmRpZlxcblxcbiNlbmRpZlxcblxcbmZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSAqL107XFxuXFxuI2lmIGRlZmluZWQoV0VCR0wyX01VTFRJX1ZJRVcpICYmIGRlZmluZWQoUk5fSVNfVkVSVEVYX1NIQURFUilcXG4vLyBpZiAodV9pc01haW5WciA9PSAxKSB7XFxuICBjYW1lcmFTSUQgKz0gZmxvYXQoZ2xfVmlld0lEX09WUik7XFxuLy8gfVxcbiNlbmRpZlxcblxcbmZsb2F0IHggPSBmbG9hdCgoZ2xfVmVydGV4SUQgJiAxKSA8PCAyKTtcXG5mbG9hdCB5ID0gZmxvYXQoKGdsX1ZlcnRleElEICYgMikgPDwgMSk7XFxudl90ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbnZfdGV4Y29vcmRfMC55ID0geSAqIDAuNTtcXG5nbF9Qb3NpdGlvbiA9IHZlYzQoeCAtIDEuMCwgeSAtIDEuMCwgMCwgMSk7XFxuXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbiNpZmRlZiBXRUJHTDFfRVhUX1NIQURFUl9URVhUVVJFX0xPRFxcbiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG4jaWZkZWYgV0VCR0wxX0VYVF9TVEFOREFSRF9ERVJJVkFUSVZFU1xcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbiNpZmRlZiBXRUJHTDFfRVhUX0RSQVdfQlVGRkVSU1xcbiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmVcXG4jZW5kaWZcXG5cXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxucHJlY2lzaW9uIGhpZ2hwIGludDtcXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbmluIHZlYzMgdl9jb2xvcjtcXG5pbiB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxuaW4gdmVjNCB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuaW4gdmVjMiB2X3RleGNvb3JkXzA7XFxuaW4gdmVjNCB2X3RleGNvb3JkXzE7XFxuaW4gdmVjNCB2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0O1xcbmluIHZlYzMgdl9iYXJ5Q2VudHJpY0Nvb3JkO1xcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRCZWdpbn0gKi9cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5zdHJ1Y3QgTGlnaHQge1xcbiAgaW50IHR5cGU7IC8vIDAgPSBkaXJlY3Rpb25hbCwgMSA9IHBvaW50LCAyID0gc3BvdFxcbiAgdmVjMyBwb3NpdGlvbjtcXG4gIHZlYzMgaW50ZW5zaXR5O1xcbiAgdmVjMyBhdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiAgdmVjMyBkaXJlY3Rpb25PZkxpZ2h0T2JqZWN0O1xcbiAgdmVjMyBkaXJlY3Rpb247IC8vIGRpcmVjdGlvbiBvZiBsaWdodCB2ZWN0b3IsIGVxdWFsIHRvIG5vcm1hbGl6ZShsaWdodC5wb2ludFRvTGlnaHQpXFxuICB2ZWMzIHBvaW50VG9MaWdodDsgLy8gbm90IG5vcm1hbGl6ZWRcXG4gIGZsb2F0IHNwb3RBbmdsZVNjYWxlO1xcbiAgZmxvYXQgc3BvdEFuZ2xlT2Zmc2V0O1xcbiAgZmxvYXQgZWZmZWN0aXZlUmFuZ2U7XFxufTtcXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNyYW5nZS1wcm9wZXJ0eVxcbmZsb2F0IGdldFJhbmdlQXR0ZW51YXRpb24oTGlnaHQgbGlnaHQpXFxue1xcbiAgZmxvYXQgZGlzdGFuY2UgPSBsZW5ndGgobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gIC8vIG1lYW5zIG5vIHJhbmdlIGxpbWl0XFxuICBpZiAobGlnaHQuZWZmZWN0aXZlUmFuZ2UgPD0gMC4wKVxcbiAge1xcbiAgICByZXR1cm4gMS4wIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbiAgfVxcbiAgcmV0dXJuIG1heChtaW4oMS4wIC0gcG93KGRpc3RhbmNlIC8gbGlnaHQuZWZmZWN0aXZlUmFuZ2UsIDQuMCksIDEuMCksIDAuMCkgLyBwb3coZGlzdGFuY2UsIDIuMCk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9saWdodHNfcHVuY3R1YWwvUkVBRE1FLm1kI2lubmVyLWFuZC1vdXRlci1jb25lLWFuZ2xlc1xcbmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbihMaWdodCBsaWdodClcXG57XFxuXFxuICBmbG9hdCBjZCA9IGRvdChsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0LCBsaWdodC5kaXJlY3Rpb24pO1xcbiAgZmxvYXQgYW5ndWxhckF0dGVudWF0aW9uID0gY2xhbXAoY2QgKiBsaWdodC5zcG90QW5nbGVTY2FsZSArIGxpZ2h0LnNwb3RBbmdsZU9mZnNldCwgMC4wLCAxLjApO1xcbiAgcmV0dXJuIGFuZ3VsYXJBdHRlbnVhdGlvbjtcXG59XFxuXFxudm9pZCBnZXRMaWdodEF0dGVudWF0ZWQoTGlnaHQgbGlnaHQpIHtcXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICAvLyBpZiAobGlnaHQudHlwZSA9PSAwKSB7IC8vIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIC8vIERpcmVjdGlvbmFsIExpZ2h0IGRvbid0IGF0dGVudWF0ZSBnZW9tZXRpY2FsbHlcXG4gIC8vIH1cXG5cXG4gIC8vIFBvaW50IExpZ2h0XFxuICBpZiAobGlnaHQudHlwZSA9PSAxKVxcbiAge1xcbiAgICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ICo9IGdldFJhbmdlQXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcbiAgLy8gU3BvdCBsaWdodFxcbiAgaWYgKGxpZ2h0LnR5cGUgPT0gMilcXG4gIHtcXG4gICAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSAqPSBnZXRTcG90QXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcbn1cXG5cXG5MaWdodCBnZXRMaWdodChpbnQgbGlnaHRJZHgsIHZlYzMgdl9wb3NpdGlvbl9pbldvcmxkKSB7XFxuICB2ZWMzIGxpZ2h0UG9zaXRpb24gPSBnZXRfbGlnaHRQb3NpdGlvbigwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzMgZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0ID0gZ2V0X2xpZ2h0RGlyZWN0aW9uKDAuMCwgbGlnaHRJZHgpO1xcbiAgdmVjMyBsaWdodEludGVuc2l0eSA9IGdldF9saWdodEludGVuc2l0eSgwLjAsIGxpZ2h0SWR4KTtcXG4gIHZlYzQgbGlnaHRQcm9wZXJ0eSA9IGdldF9saWdodFByb3BlcnR5KDAuMCwgbGlnaHRJZHgpO1xcbiAgTGlnaHQgbGlnaHQ7XFxuICBsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ID0gZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0O1xcbiAgZmxvYXQgbGlnaHRUeXBlID0gbGlnaHRQcm9wZXJ0eS54O1xcbiAgbGlnaHQuZWZmZWN0aXZlUmFuZ2UgPSBsaWdodFByb3BlcnR5Lnk7XFxuICBsaWdodC5zcG90QW5nbGVTY2FsZSA9IGxpZ2h0UHJvcGVydHkuejtcXG4gIGxpZ2h0LnNwb3RBbmdsZU9mZnNldCA9IGxpZ2h0UHJvcGVydHkudztcXG5cXG4gIGxpZ2h0LmludGVuc2l0eSA9IGxpZ2h0SW50ZW5zaXR5O1xcbiAgbGlnaHQucG9zaXRpb24gPSBsaWdodFBvc2l0aW9uO1xcbiAgaWYgKGxpZ2h0VHlwZSA8IC0wLjUpIHsgLy8gZGlzYWJsZWQgbGlnaHRcXG4gICAgbGlnaHQuaW50ZW5zaXR5ID0gdmVjMygwLjApO1xcbiAgICBsaWdodC50eXBlID0gLTE7XFxuICB9IGVsc2UgaWYgKDAuNzUgPCBsaWdodFR5cGUpIHsgLy8gaXMgcG9pbnRsaWdodCBvciBzcG90bGlnaHRcXG4gICAgbGlnaHQucG9pbnRUb0xpZ2h0ID0gbGlnaHRQb3NpdGlvbiAtIHZfcG9zaXRpb25faW5Xb3JsZDtcXG4gICAgbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKGxpZ2h0LnBvaW50VG9MaWdodCk7XFxuICAgIGxpZ2h0LnR5cGUgPSAxO1xcbiAgfSBlbHNlIHsgLy8gaXMgRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgbGlnaHQudHlwZSA9IDA7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ICogLTEuMCk7XFxuICB9XFxuXFxuICBpZiAobGlnaHRUeXBlID4gMS43NSkgeyAvLyBpcyBzcG90bGlnaHRcXG4gICAgbGlnaHQudHlwZSA9IDI7XFxuICB9XFxuXFxuICBjb25zdCBmbG9hdCBNX1BJID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuICBsaWdodC5pbnRlbnNpdHkgKj0gTV9QSTsgLy8gUHVuY3R1YWwgTGlnaHRcXG5cXG4gIC8vIEF0dGVudWF0aW9uXFxuICBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xcbiAgZ2V0TGlnaHRBdHRlbnVhdGVkKGxpZ2h0KTtcXG5cXG4gIHJldHVybiBsaWdodDtcXG59XFxuXFxuXFxuZmxvYXQgZWRnZV9yYXRpbyh2ZWMzIGJhcnkzLCBmbG9hdCB3aXJlZnJhbWVXaWR0aElubmVyLCBmbG9hdCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUpIHtcXG4gIHZlYzMgZCA9IGZ3aWR0aChiYXJ5Myk7XFxuICB2ZWMzIHggPSBiYXJ5Myt2ZWMzKDEuMCAtIHdpcmVmcmFtZVdpZHRoSW5uZXIpKmQ7XFxuICB2ZWMzIGEzID0gc21vb3Roc3RlcCh2ZWMzKDAuMCksIGQsIHgpO1xcbiAgZmxvYXQgZmFjdG9yID0gbWluKG1pbihhMy54LCBhMy55KSwgYTMueik7XFxuXFxuICByZXR1cm4gY2xhbXAoKDEuMCAtIGZhY3RvciksIDAuMCwgMS4wKTtcXG59XFxuXFxuZmxvYXQgZGVjb2RlUkdCQVRvRGVwdGgodmVjNCBSR0JBKXtcXG4gIGNvbnN0IGZsb2F0IHJNYXNrID0gMS4wO1xcbiAgY29uc3QgZmxvYXQgZ01hc2sgPSAxLjAgLyAyNTUuMDtcXG4gIGNvbnN0IGZsb2F0IGJNYXNrID0gMS4wIC8gKDI1NS4wICogMjU1LjApO1xcbiAgY29uc3QgZmxvYXQgYU1hc2sgPSAxLjAgLyAoMjU1LjAgKiAyNTUuMCAqIDI1NS4wKTtcXG4gIGZsb2F0IGRlcHRoID0gZG90KFJHQkEsIHZlYzQock1hc2ssIGdNYXNrLCBiTWFzaywgYU1hc2spKTtcXG4gIHJldHVybiBkZXB0aDtcXG59XFxuXFxuZmxvYXQgbGluc3RlcChmbG9hdCBtaW4sZmxvYXQgbWF4LGZsb2F0IHYpe1xcbiAgcmV0dXJuIGNsYW1wKCh2LW1pbikvKG1heC1taW4pLDAuMCwxLjApO1xcbn1cXG5cXG5mbG9hdCByZWR1Y2VMaWdodEJsZWVkaW5nKGZsb2F0IHBfbWF4LCBmbG9hdCBwYXJhbWV0ZXIpe1xcbiAgcmV0dXJuIGxpbnN0ZXAocGFyYW1ldGVyLDEuMCxwX21heCk7XFxufVxcblxcbmZsb2F0IGNoZWJ5c2hldlVwcGVyQm91bmQoZmxvYXQgbWF0ZXJpYWxTSUQpe1xcbiAgZmxvYXQgdGV4dHVyZURlcHRoID0gZGVjb2RlUkdCQVRvRGVwdGgodGV4dHVyZVByb2oodV9kZXB0aFRleHR1cmUsIHZfdGV4Y29vcmRfMSkpO1xcbiAgZmxvYXQgdGV4dHVyZVNxdWFyZURlcHRoID0gZGVjb2RlUkdCQVRvRGVwdGgodGV4dHVyZVByb2oodV9zcXVhcmVEZXB0aFRleHR1cmUsIHZfdGV4Y29vcmRfMSkpO1xcbiAgaWYodGV4dHVyZURlcHRoID09IDEuMCB8fCB0ZXh0dXJlU3F1YXJlRGVwdGggPT0gMS4wKXtcXG4gICAgcmV0dXJuIDEuMDtcXG4gIH1cXG5cXG4gIGZsb2F0IG5vblNoYWRvd1Byb2IgPSAxLjA7XFxuXFxuICBpZih2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0LncgPiAwLjApe1xcbiAgICBmbG9hdCBtZWFzdXJlRGVwdGg7XFxuICAgIGJvb2wgaXNQb2ludExpZ2h0ID0gZ2V0X2lzUG9pbnRMaWdodChtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGlmKGlzUG9pbnRMaWdodCl7XFxuICAgICAgZmxvYXQgek5lYXIgPSBnZXRfek5lYXJJbm5lcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgZmxvYXQgekZhciA9IGdldF96RmFySW5uZXIobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIGZsb2F0IG5vcm1hbGl6YXRpb25Db2VmZmljaWVudCA9IDEuMCAvICh6RmFyIC0gek5lYXIpO1xcbiAgICAgIG1lYXN1cmVEZXB0aCA9IG5vcm1hbGl6YXRpb25Db2VmZmljaWVudCAqIGxlbmd0aCh2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0KTtcXG4gICAgfWVsc2V7XFxuICAgICAgbWVhc3VyZURlcHRoID0gKHZfcHJvalBvc2l0aW9uX2Zyb21fbGlnaHQgLyB2X3Byb2pQb3NpdGlvbl9mcm9tX2xpZ2h0LncpLno7XFxuICAgIH1cXG5cXG4gICAgZmxvYXQgZGVwdGhBZGp1c3RtZW50ID0gZ2V0X2RlcHRoQWRqdXN0bWVudChtYXRlcmlhbFNJRCwgMCk7XFxuICAgIG1lYXN1cmVEZXB0aCArPSBkZXB0aEFkanVzdG1lbnQ7XFxuXFxuICAgIGZsb2F0IHRleHR1cmVEZXB0aEFkanVzdG1lbnQgPSBnZXRfdGV4dHVyZURlcHRoQWRqdXN0bWVudChtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHRleHR1cmVEZXB0aCArPSB0ZXh0dXJlRGVwdGhBZGp1c3RtZW50O1xcblxcbiAgICBmbG9hdCBkID0gbWVhc3VyZURlcHRoIC0gdGV4dHVyZURlcHRoO1xcbiAgICBpZihkIDwgMC4wKSByZXR1cm4gMS4wO1xcblxcbiAgICBmbG9hdCB2YXJpYW5jZSA9IHRleHR1cmVTcXVhcmVEZXB0aCAtIHRleHR1cmVEZXB0aCAqIHRleHR1cmVEZXB0aDtcXG4gICAgZmxvYXQgbWluaW11bVZhcmlhbmNlID0gZ2V0X21pbmltdW1WYXJpYW5jZShtYXRlcmlhbFNJRCwgMCk7XFxuICAgIHZhcmlhbmNlID0gbWF4KHZhcmlhbmNlLCBtaW5pbXVtVmFyaWFuY2UpO1xcblxcbiAgICBub25TaGFkb3dQcm9iID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkICogZCk7XFxuXFxuXFxuICAgIGZsb2F0IGxpZ2h0QmxlZWRpbmdQYXJhbWV0ZXIgPSBnZXRfbGlnaHRCbGVlZGluZ1BhcmFtZXRlcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgIG5vblNoYWRvd1Byb2IgPSByZWR1Y2VMaWdodEJsZWVkaW5nKG5vblNoYWRvd1Byb2IsIGxpZ2h0QmxlZWRpbmdQYXJhbWV0ZXIpO1xcbiAgfVxcbiAgcmV0dXJuIG5vblNoYWRvd1Byb2I7XFxufVxcblxcbnZvaWQgbWFpbiAoKVxcbntcXG4jaWZkZWYgUk5fSVNfREFUQVRFWFRVUkVfTU9ERVxcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICAjaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gYV9pbnN0YW5jZUluZm8ueTtcXG4gICAgI2Vsc2VcXG4gICAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxuI2Vsc2UgLy8gUk5fSVNfVU5JRk9STV9NT0RFXFxuXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IC0xLjA7IC8vIG1hdGVyaWFsU0lEIGlzIG5vdCB1c2VkIGluIFVuaWZvcm0gbW9kZVxcblxcbiAgaW50IGxpZ2h0TnVtYmVyID0gMDtcXG4gICNpZmRlZiBSTl9JU19MSUdIVElOR1xcbiAgICBsaWdodE51bWJlciA9IGdldF9saWdodE51bWJlcigwLjAsIDApO1xcbiAgI2VuZGlmXFxuXFxuICBmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCA9IC0xLjA7XFxuICAjaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBmbG9hdChnZXRfc2tpbm5pbmdNb2RlKDAuMCwgMCkpO1xcbiAgI2VuZGlmXFxuXFxuI2VuZGlmXFxuXFxuZmxvYXQgY2FtZXJhU0lEID0gdV9jdXJyZW50Q29tcG9uZW50U0lEc1svKiBzaGFkZXJpdHk6IEB7V2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUR9ICovXTtcXG5cXG4jaWYgZGVmaW5lZChXRUJHTDJfTVVMVElfVklFVykgJiYgZGVmaW5lZChSTl9JU19WRVJURVhfU0hBREVSKVxcbi8vIGlmICh1X2lzTWFpblZyID09IDEpIHtcXG4gIGNhbWVyYVNJRCArPSBmbG9hdChnbF9WaWV3SURfT1ZSKTtcXG4vLyB9XFxuI2VuZGlmXFxuXFxuXFxuICAvLyBOb3JtYWxcXG4gIHZlYzMgbm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUodl9ub3JtYWxfaW5Xb3JsZCk7XFxuXFxuICAvLyBkaWZmdXNlQ29sb3JcXG4gIHZlYzMgZGlmZnVzZUNvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gIGZsb2F0IGFscGhhID0gMS4wO1xcblxcbiAgdmVjNCBkaWZmdXNlQ29sb3JGYWN0b3IgPSBnZXRfZGlmZnVzZUNvbG9yRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmICh2X2NvbG9yICE9IGRpZmZ1c2VDb2xvciAmJiBkaWZmdXNlQ29sb3JGYWN0b3IucmdiICE9IGRpZmZ1c2VDb2xvcikge1xcbiAgICBkaWZmdXNlQ29sb3IgPSB2X2NvbG9yICogZGlmZnVzZUNvbG9yRmFjdG9yLnJnYjtcXG4gICAgYWxwaGEgPSBkaWZmdXNlQ29sb3JGYWN0b3IuYTtcXG4gIH0gZWxzZSBpZiAodl9jb2xvciA9PSBkaWZmdXNlQ29sb3IpIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yRmFjdG9yLnJnYjtcXG4gICAgYWxwaGEgPSBkaWZmdXNlQ29sb3JGYWN0b3IuYTtcXG4gIH0gZWxzZSBpZiAoZGlmZnVzZUNvbG9yRmFjdG9yLnJnYiA9PSBkaWZmdXNlQ29sb3IpIHtcXG4gICAgZGlmZnVzZUNvbG9yID0gdl9jb2xvcjtcXG4gIH0gZWxzZSB7XFxuICAgIGRpZmZ1c2VDb2xvciA9IHZlYzMoMS4wLCAxLjAsIDEuMCk7XFxuICB9XFxuXFxuICAvLyBkaWZmdXNlQ29sb3JUZXh0dXJlXFxuICB2ZWM0IHRleHR1cmVDb2xvciA9IHRleHR1cmUodV9kaWZmdXNlQ29sb3JUZXh0dXJlLCB2X3RleGNvb3JkXzApO1xcbiAgaWYgKHRleHR1cmVDb2xvci5yID4gMC4wNSkge1xcbiAgICBkaWZmdXNlQ29sb3IgKj0gdGV4dHVyZUNvbG9yLnJnYjtcXG4gICAgYWxwaGEgKj0gdGV4dHVyZUNvbG9yLmE7XFxuICB9XFxuXFxuICAvLyBzaGFkb3cgbWFwcGluZ1xcbiAgdmVjNCBzaGFkb3dDb2xvciA9IGdldF9zaGFkb3dDb2xvcihtYXRlcmlhbFNJRCwgMCk7XFxuXFxuICBmbG9hdCBub25TaGFkb3dQcm9iID0gY2hlYnlzaGV2VXBwZXJCb3VuZChtYXRlcmlhbFNJRCk7XFxuICBkaWZmdXNlQ29sb3IgPSBub25TaGFkb3dQcm9iICogZGlmZnVzZUNvbG9yICsgKDEuMCAtIG5vblNoYWRvd1Byb2IpICogc2hhZG93Q29sb3IucmdiO1xcbiAgYWxwaGEgPSBub25TaGFkb3dQcm9iICogYWxwaGEgKyAoMS4wIC0gbm9uU2hhZG93UHJvYikgKiBzaGFkb3dDb2xvci5hO1xcblxcbiAgLy8gTGlnaHRpbmdcXG4gIHZlYzMgc2hhZGluZ0NvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG5cXG4gIGludCBzaGFkaW5nTW9kZWwgPSBnZXRfc2hhZGluZ01vZGVsKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChzaGFkaW5nTW9kZWwgPiAwKSB7XFxuICAgIHZlYzMgZGlmZnVzZSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuICAgIHZlYzMgc3BlY3VsYXIgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xcbiAgICBpbnQgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IC8qIHNoYWRlcml0eTogQHtDb25maWcubWF4TGlnaHROdW1iZXJJblNoYWRlcn0gKi8gOyBpKyspIHtcXG4gICAgICBpZiAoaSA+PSBsaWdodE51bWJlcikge1xcbiAgICAgICAgYnJlYWs7XFxuICAgICAgfVxcblxcbiAgICAgIC8vIExpZ2h0XFxuICAgICAgTGlnaHQgbGlnaHQgPSBnZXRMaWdodChpLCB2X3Bvc2l0aW9uX2luV29ybGQueHl6KTtcXG5cXG4gICAgICBkaWZmdXNlICs9IGRpZmZ1c2VDb2xvciAqIG1heCgwLjAsIGRvdChub3JtYWxfaW5Xb3JsZCwgbGlnaHQuZGlyZWN0aW9uKSkgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcblxcbiAgICAgIHZlYzMgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgZmxvYXQgc2hpbmluZXNzID0gZ2V0X3NoaW5pbmVzcyhtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgaWYgKHNoYWRpbmdNb2RlbCA9PSAyKSB7Ly8gQkxJTk5cXG4gICAgICAgIC8vIFZpZXdEaXJlY3Rpb25cXG4gICAgICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2aWV3UG9zaXRpb24gLSB2X3Bvc2l0aW9uX2luV29ybGQueHl6KTtcXG4gICAgICAgIHZlYzMgaGFsZlZlY3RvciA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyZWN0aW9uKTtcXG4gICAgICAgIHNwZWN1bGFyICs9IHBvdyhtYXgoMC4wLCBkb3QoaGFsZlZlY3Rvciwgbm9ybWFsX2luV29ybGQpKSwgc2hpbmluZXNzKTtcXG4gICAgICB9IGVsc2UgaWYgKHNoYWRpbmdNb2RlbCA9PSAzKSB7IC8vIFBIT05HXFxuICAgICAgICB2ZWMzIHZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodmlld1Bvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkLnh5eik7XFxuICAgICAgICB2ZWMzIFIgPSByZWZsZWN0KGxpZ2h0LmRpcmVjdGlvbiwgbm9ybWFsX2luV29ybGQpO1xcbiAgICAgICAgc3BlY3VsYXIgKz0gcG93KG1heCgwLjAsIGRvdChSLCB2aWV3RGlyZWN0aW9uKSksIHNoaW5pbmVzcyk7XFxuICAgICAgfVxcblxcbiAgICB9XFxuXFxuICAgIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2UgKyBzcGVjdWxhcjtcXG4gIH0gZWxzZSB7XFxuICAgIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2VDb2xvcjtcXG4gIH1cXG5cXG4gIHJ0MCA9IHZlYzQoc2hhZGluZ0NvbG9yLCBhbHBoYSk7XFxuXFxuICAvLyBXaXJlZnJhbWVcXG4gIGZsb2F0IHRocmVzaG9sZCA9IDAuMDAxO1xcbiAgdmVjMyB3aXJlZnJhbWUgPSBnZXRfd2lyZWZyYW1lKG1hdGVyaWFsU0lELCAwKTtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoSW5uZXIgPSB3aXJlZnJhbWUuejtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZSA9IDEuMDtcXG4gIGlmICh3aXJlZnJhbWUueCA+IDAuNSAmJiB3aXJlZnJhbWUueSA8IDAuNSkge1xcbiAgICBydDAuYSA9IDAuMDtcXG4gIH1cXG4gIHZlYzQgd2lyZWZyYW1lUmVzdWx0ID0gcnQwO1xcbiAgdmVjNCB3aXJlZnJhbWVDb2xvciA9IHZlYzQoMC4yLCAwLjc1LCAwLjAsIDEuMCk7XFxuICBmbG9hdCBlZGdlUmF0aW8gPSBlZGdlX3JhdGlvKHZfYmFyeUNlbnRyaWNDb29yZCwgd2lyZWZyYW1lV2lkdGhJbm5lciwgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlKTtcXG4gIGZsb2F0IGVkZ2VSYXRpb01vZGlmaWVkID0gbWl4KHN0ZXAodGhyZXNob2xkLCBlZGdlUmF0aW8pLCBjbGFtcChlZGdlUmF0aW8qNC4wLCAwLjAsIDEuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvNC4wKTtcXG4gIC8vIGlmIHIwLmEgaXMgMC4wLCBpdCBpcyB3aXJlZnJhbWUgbm90IG9uIHNoYWRlZFxcbiAgd2lyZWZyYW1lUmVzdWx0LnJnYiA9IHdpcmVmcmFtZUNvbG9yLnJnYiAqIGVkZ2VSYXRpb01vZGlmaWVkICsgcnQwLnJnYiAqICgxLjAgLSBlZGdlUmF0aW9Nb2RpZmllZCk7XFxuICB3aXJlZnJhbWVSZXN1bHQuYSA9IG1heChydDAuYSwgd2lyZWZyYW1lQ29sb3IuYSAqIG1peChlZGdlUmF0aW9Nb2RpZmllZCwgcG93KGVkZ2VSYXRpb01vZGlmaWVkLCAxMDAuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvMS4wKSk7XFxuXFxuICBpZiAod2lyZWZyYW1lLnggPiAwLjUpIHtcXG4gICAgcnQwID0gd2lyZWZyYW1lUmVzdWx0O1xcbiAgICBpZiAod2lyZWZyYW1lLnkgPCAwLjUgJiYgcnQwLmEgPT0gMC4wKSB7XFxuICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgfVxcblxcbi8qIHNoYWRlcml0eTogQHtyZW5kZXJUYXJnZXRFbmR9ICovXFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG4jaWZkZWYgV0VCR0wyX01VTFRJX1ZJRVdcXG4jZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcyIDogcmVxdWlyZVxcbiNlbmRpZlxcblxcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcblxcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5cXG5pbiB2ZWMzIGFfcG9zaXRpb247XFxuaW4gdmVjMyBhX2NvbG9yO1xcbmluIHZlYzMgYV9ub3JtYWw7XFxuaW4gdmVjNCBhX2luc3RhbmNlSW5mbztcXG5pbiB2ZWMyIGFfdGV4Y29vcmRfMDtcXG5pbiB2ZWM0IGFfam9pbnQ7XFxuaW4gdmVjNCBhX3dlaWdodDtcXG5pbiB2ZWM0IGFfYmFyeUNlbnRyaWNDb29yZDtcXG5vdXQgdmVjMyB2X2NvbG9yO1xcbm91dCB2ZWMzIHZfbm9ybWFsX2luV29ybGQ7XFxub3V0IHZlYzQgdl9wb3NpdGlvbl9pbldvcmxkO1xcbm91dCB2ZWMyIHZfdGV4Y29vcmRfMDtcXG5vdXQgdmVjNCB2X3RleGNvb3JkXzE7XFxub3V0IHZlYzQgdl9wcm9qUG9zaXRpb25fZnJvbV9saWdodDtcXG5vdXQgdmVjMyB2X2JhcnlDZW50cmljQ29vcmQ7XFxuXFxuY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxubWF0MyB0b05vcm1hbE1hdHJpeChtYXQ0IG0pIHtcXG4gIGZsb2F0IGEwMCA9IG1bMF1bMF0sIGEwMSA9IG1bMF1bMV0sIGEwMiA9IG1bMF1bMl0sIGEwMyA9IG1bMF1bM10sXFxuICBhMTAgPSBtWzFdWzBdLCBhMTEgPSBtWzFdWzFdLCBhMTIgPSBtWzFdWzJdLCBhMTMgPSBtWzFdWzNdLFxcbiAgYTIwID0gbVsyXVswXSwgYTIxID0gbVsyXVsxXSwgYTIyID0gbVsyXVsyXSwgYTIzID0gbVsyXVszXSxcXG4gIGEzMCA9IG1bM11bMF0sIGEzMSA9IG1bM11bMV0sIGEzMiA9IG1bM11bMl0sIGEzMyA9IG1bM11bM107XFxuXFxuICBmbG9hdCBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXFxuICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXFxuICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXFxuICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXFxuICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXFxuICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXFxuICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXFxuICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXFxuICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXFxuICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXFxuICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXFxuICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XFxuXFxuICBmbG9hdCBkZXRlcm1pbmFudFZhbCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcXG5cXG4gIHJldHVybiBtYXQzKFxcbiAgICBhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDksIGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNywgYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2LFxcbiAgICBhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDksIGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNywgYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2LFxcbiAgICBhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMsIGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSwgYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAvIGRldGVybWluYW50VmFsO1xcbn1cXG5cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5cXG5oaWdocCBtYXQ0IGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZSggaGlnaHAgdmVjNCBxdWF0ZXJuaW9uLCBoaWdocCB2ZWMzIHRyYW5zbGF0aW9uLCBoaWdocCB2ZWMzIHNjYWxlICkge1xcbiAgaGlnaHAgdmVjNCBxID0gcXVhdGVybmlvbjtcXG4gIGhpZ2hwIHZlYzMgdCA9IHRyYW5zbGF0aW9uO1xcblxcbiAgaGlnaHAgZmxvYXQgc3ggPSBxLnggKiBxLng7XFxuICBoaWdocCBmbG9hdCBzeSA9IHEueSAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHN6ID0gcS56ICogcS56O1xcbiAgaGlnaHAgZmxvYXQgY3ggPSBxLnkgKiBxLno7XFxuICBoaWdocCBmbG9hdCBjeSA9IHEueCAqIHEuejtcXG4gIGhpZ2hwIGZsb2F0IGN6ID0gcS54ICogcS55O1xcbiAgaGlnaHAgZmxvYXQgd3ggPSBxLncgKiBxLng7XFxuICBoaWdocCBmbG9hdCB3eSA9IHEudyAqIHEueTtcXG4gIGhpZ2hwIGZsb2F0IHd6ID0gcS53ICogcS56O1xcblxcbiAgaGlnaHAgbWF0NCBtYXQgPSBtYXQ0KFxcbiAgICAxLjAgLSAyLjAgKiAoc3kgKyBzeiksIDIuMCAqIChjeiArIHd6KSwgMi4wICogKGN5IC0gd3kpLCAwLjAsXFxuICAgIDIuMCAqIChjeiAtIHd6KSwgMS4wIC0gMi4wICogKHN4ICsgc3opLCAyLjAgKiAoY3ggKyB3eCksIDAuMCxcXG4gICAgMi4wICogKGN5ICsgd3kpLCAyLjAgKiAoY3ggLSB3eCksIDEuMCAtIDIuMCAqIChzeCArIHN5KSwgMC4wLFxcbiAgICB0LngsIHQueSwgdC56LCAxLjBcXG4gICk7XFxuXFxuICBoaWdocCBtYXQ0IHVuaWZvcm1TY2FsZU1hdCA9IG1hdDQoXFxuICAgIHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgc2NhbGUueSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCBzY2FsZS56LCAwLjAsXFxuICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxcbiAgKTtcXG5cXG4gIHJldHVybiBtYXQqdW5pZm9ybVNjYWxlTWF0O1xcbn1cXG5cXG5oaWdocCB2ZWM0IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoaGlnaHAgdmVjMiB2ZWNfeHksIGhpZ2hwIGZsb2F0IGNyaXRlcmlhKXtcXG5cXG4gIGhpZ2hwIGZsb2F0IHI7XFxuICBoaWdocCBmbG9hdCBnO1xcbiAgaGlnaHAgZmxvYXQgYjtcXG4gIGhpZ2hwIGZsb2F0IGE7XFxuXFxuICBoaWdocCBmbG9hdCBpeCA9IGZsb29yKHZlY194eS54ICogY3JpdGVyaWEpO1xcbiAgaGlnaHAgZmxvYXQgdjF4ID0gaXggLyBjcml0ZXJpYTtcXG4gIGhpZ2hwIGZsb2F0IHYxeSA9IGl4IC0gZmxvb3IodjF4KSAqIGNyaXRlcmlhO1xcblxcbiAgciA9ICggdjF4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGcgPSAoIHYxeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICBoaWdocCBmbG9hdCBpeSA9IGZsb29yKCB2ZWNfeHkueSAqIGNyaXRlcmlhKTtcXG4gIGhpZ2hwIGZsb2F0IHYyeCA9IGl5IC8gY3JpdGVyaWE7XFxuICBoaWdocCBmbG9hdCB2MnkgPSBpeSAtIGZsb29yKHYyeCkgKiBjcml0ZXJpYTtcXG5cXG4gIGIgPSAoIHYyeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBhID0gKCB2MnkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgciAtPSAxLjAvY3JpdGVyaWE7XFxuICBnIC09IDEuMC9jcml0ZXJpYTtcXG4gIGIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYSAtPSAxLjAvY3JpdGVyaWE7XFxuXFxuICByID0gcioyLjAtMS4wO1xcbiAgZyA9IGcqMi4wLTEuMDtcXG4gIGIgPSBiKjIuMC0xLjA7XFxuICBhID0gYSoyLjAtMS4wO1xcblxcbiAgcmV0dXJuIHZlYzQociwgZywgYiwgYSk7XFxufVxcblxcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBza2VsZXRhbENvbXBvbmVudFNJRCkge1xcblxcbiNpZmRlZiBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuICBtYXQ0IHNraW5NYXQgPSBhX3dlaWdodC54ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIG1hdDQoZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBtYXQ0KGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSkpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC53ICogbWF0NChnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMilcXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG5cXG4gIHZlYzQgdHFfeCA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpO1xcbiAgdmVjNCBzcV94ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV94LncsIHNxX3gudyksIGNyaXRlcmlhLngpO1xcbiAgbWF0NCBza2luTWF0ID0gYV93ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV94Lnh5eiwgc3FfeC54eXopO1xcblxcbiAgdmVjNCB0cV95ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSk7XFxuICB2ZWM0IHNxX3kgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueSkpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV95LncsIHNxX3kudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3kueHl6LCBzcV95Lnh5eik7XFxuXFxuICB2ZWM0IHRxX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgc3FfeiA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC56KSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3oudywgc3Ffei53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfei54eXosIHNxX3oueHl6KTtcXG5cXG4gIHZlYzQgdHFfdyA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpO1xcbiAgdmVjNCBzcV93ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfdy53LCBzcV93LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV93Lnh5eiwgc3Ffdy54eXopO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRClcXG4gIHZlYzQgdHNfeCA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueCkpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIHZlYzQgdHNfeSA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC55KSksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQueikpO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICB2ZWM0IHRzX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBpbnQoYV9qb2ludC53KSk7XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgaW50KGFfam9pbnQudykpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMSlcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NYID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LngpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NZID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnkpKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NaID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LnopKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRDaHVua3NXID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGludChhX2pvaW50LncpKTtcXG5cXG4gIHZlYzIgY3JpdGVyaWEgPSB2ZWMyKDQwOTYuMCwgNDA5Ni4wKTtcXG4gIHZlYzQgYm9uZUNvbXByZXNzZWRJbmZvID0gZ2V0X2JvbmVDb21wcmVzc2VkSW5mbygwLjAsIDApO1xcblxcbiAgdmVjNCB0c194ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1guencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIG1hdDQgc2tpbk1hdCA9IGFfd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnh5LCBjcml0ZXJpYS54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICB2ZWM0IHRzX3kgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSBhX3dlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS54eSwgY3JpdGVyaWEueCksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgdmVjNCB0c196ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1ouencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gYV93ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1oueHksIGNyaXRlcmlhLngpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIHZlYzQgdHNfdyA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IGFfd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnh5LCBjcml0ZXJpYS54KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuI2VuZGlmXFxuICByZXR1cm4gc2tpbk1hdDtcXG59XFxuI2VuZGlmXFxuXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuYm9vbCBza2lubmluZyhcXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgaW4gbWF0MyBpbk5vcm1hbE1hdHJpeCxcXG4gIG91dCBtYXQzIG91dE5vcm1hbE1hdHJpeCxcXG4gIGluIHZlYzMgaW5Qb3NpdGlvbl9pbkxvY2FsLFxcbiAgb3V0IHZlYzQgb3V0UG9zaXRpb25faW5Xb3JsZCxcXG4gIGluIHZlYzMgaW5Ob3JtYWxfaW5Mb2NhbCxcXG4gIG91dCB2ZWMzIG91dE5vcm1hbF9pbldvcmxkXFxuICApXFxue1xcbiAgbWF0NCBza2luTWF0ID0gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCk7XFxuICBvdXRQb3NpdGlvbl9pbldvcmxkID0gc2tpbk1hdCAqIHZlYzQoaW5Qb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgb3V0Tm9ybWFsTWF0cml4ID0gdG9Ob3JtYWxNYXRyaXgoc2tpbk1hdCk7XFxuICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShvdXROb3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG5cXG4gIHJldHVybiB0cnVlO1xcbn1cXG4jZW5kaWZcXG5cXG5ib29sIHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICBpbiBtYXQ0IHdvcmxkTWF0cml4LFxcbiAgaW4gbWF0NCB2aWV3TWF0cml4LFxcbiAgaW4gYm9vbCBpc0JpbGxib2FyZCxcXG4gIGluIG1hdDMgaW5Ob3JtYWxNYXRyaXgsXFxuICBvdXQgbWF0MyBvdXROb3JtYWxNYXRyaXgsXFxuICBpbiB2ZWMzIGluUG9zaXRpb25faW5Mb2NhbCxcXG4gIG91dCB2ZWM0IG91dFBvc2l0aW9uX2luV29ybGQsXFxuICBpbiB2ZWMzIGluTm9ybWFsX2luTG9jYWwsXFxuICBvdXQgdmVjMyBvdXROb3JtYWxfaW5Xb3JsZFxcbikge1xcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuXFxuICB2ZWMzIHBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICBpZiAodV9tb3JwaFRhcmdldE51bWJlciA9PSAwKSB7XFxuI2VuZGlmXFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBpblBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICB9IGVsc2Uge1xcbiAgICBmbG9hdCB2ZXJ0ZXhJZHggPSBhX2JhcnlDZW50cmljQ29vcmQudztcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGdldF9wb3NpdGlvbih2ZXJ0ZXhJZHgsIGluUG9zaXRpb25faW5Mb2NhbCk7XFxuICB9XFxuI2VuZGlmXFxuXFxuICBtYXQ0IHdvcmxkTWF0cml4SW5uZXIgPSB3b3JsZE1hdHJpeDtcXG4gIGlmIChpc0JpbGxib2FyZCkge1xcbiAgICBtYXQ0IGludmVyc2VWaWV3TWF0cml4ID0gaW52ZXJzZSh2aWV3TWF0cml4KTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMF0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVswXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMV0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsxXTtcXG4gICAgaW52ZXJzZVZpZXdNYXRyaXhbM11bMl0gPSAwLjA7Ly93b3JsZE1hdHJpeFszXVsyXTtcXG4gICAgd29ybGRNYXRyaXhJbm5lciA9IGludmVyc2VWaWV3TWF0cml4ICogd29ybGRNYXRyaXg7XFxuICB9XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICBpZiAoc2tlbGV0YWxDb21wb25lbnRTSUQgPj0gMC4wKSB7XFxuICAgIGlzU2tpbm5pbmcgPSBza2lubmluZyhza2VsZXRhbENvbXBvbmVudFNJRCwgaW5Ob3JtYWxNYXRyaXgsIG91dE5vcm1hbE1hdHJpeCwgcG9zaXRpb25faW5Mb2NhbCwgb3V0UG9zaXRpb25faW5Xb3JsZCwgaW5Ob3JtYWxfaW5Mb2NhbCwgb3V0Tm9ybWFsX2luV29ybGQpO1xcbiAgfSBlbHNlIHtcXG4jZW5kaWZcXG4gICAgb3V0Tm9ybWFsTWF0cml4ID0gaW5Ob3JtYWxNYXRyaXg7XFxuICAgIG91dFBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeElubmVyICogdmVjNChwb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgICBvdXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbk5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgcmV0dXJuIGlzU2tpbm5pbmc7XFxufVxcblxcblxcbnZvaWQgbWFpbigpe1xcbiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cXG5cXG4gIG1hdDMgbm9ybWFsTWF0cml4ID0gZ2V0X25vcm1hbE1hdHJpeChhX2luc3RhbmNlSW5mby54KTtcXG4gIG1hdDQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxuICBtYXQ0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcblxcbiAgYm9vbCBpc1NraW5uaW5nID0gZmFsc2U7XFxuICBpc1NraW5uaW5nID0gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgZmFsc2UsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBhX3Bvc2l0aW9uLFxcbiAgICB2X3Bvc2l0aW9uX2luV29ybGQsXFxuICAgIGFfbm9ybWFsLFxcbiAgICB2X25vcm1hbF9pbldvcmxkXFxuICApO1xcblxcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuXFxuLy8gI2lmZGVmIFJOX0lTX1BPSU5UU1BSSVRFXFxuXFxudmVjNCBwb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sIDEuMCk7XFxudmVjMyB2aWV3UG9zaXRpb24gPSBnZXRfdmlld1Bvc2l0aW9uKGNhbWVyYVNJRCwgMCk7XFxuZmxvYXQgZGlzdGFuY2VGcm9tQ2FtZXJhID0gbGVuZ3RoKHBvc2l0aW9uX2luV29ybGQueHl6IC0gdmlld1Bvc2l0aW9uKTtcXG52ZWMzIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbiA9IGdldF9wb2ludERpc3RhbmNlQXR0ZW51YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbmZsb2F0IGRpc3RhbmNlQXR0ZW51YXRpb25GYWN0b3IgPSBzcXJ0KDEuMC8ocG9pbnREaXN0YW5jZUF0dGVudWF0aW9uLnggKyBwb2ludERpc3RhbmNlQXR0ZW51YXRpb24ueSAqIGRpc3RhbmNlRnJvbUNhbWVyYSArIHBvaW50RGlzdGFuY2VBdHRlbnVhdGlvbi56ICogZGlzdGFuY2VGcm9tQ2FtZXJhICogZGlzdGFuY2VGcm9tQ2FtZXJhKSk7XFxuZmxvYXQgbWF4UG9pbnRTaXplID0gZ2V0X3BvaW50U2l6ZShtYXRlcmlhbFNJRCwgMCk7XFxuZ2xfUG9pbnRTaXplID0gY2xhbXAoZGlzdGFuY2VBdHRlbnVhdGlvbkZhY3RvciAqIG1heFBvaW50U2l6ZSwgMC4wLCBtYXhQb2ludFNpemUpO1xcblxcbi8vICNlbmRpZlxcblxcblxcbiAgdl9iYXJ5Q2VudHJpY0Nvb3JkID0gYV9iYXJ5Q2VudHJpY0Nvb3JkLnh5ejtcXG4gIHZfY29sb3IgPSBhX2NvbG9yO1xcbiAgdl90ZXhjb29yZF8wID0gYV90ZXhjb29yZF8wO1xcblxcbiAgLy8gU2hhZG93IG1hcHBpbmdcXG4gIG1hdDQgbGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeCA9IGdldF9saWdodFZpZXdQcm9qZWN0aW9uTWF0cml4KG1hdGVyaWFsU0lELCAwKTtcXG4gIHZfcHJvalBvc2l0aW9uX2Zyb21fbGlnaHQgPSBsaWdodFZpZXdQcm9qZWN0aW9uTWF0cml4ICogdl9wb3NpdGlvbl9pbldvcmxkO1xcblxcbiAgLy8gRm9sbG93aW5nIHRNYXRyaXggaXMgYmFzZWQgb24gaHR0cHM6Ly93Z2xkLm9yZy9kL3dlYmdsL3cwNTEuaHRtbFxcbiAgbWF0NCB0TWF0cml4ID0gbWF0NChcXG4gICAgMC41LCAwLjAsIDAuMCwgMC4wLFxcbiAgICAwLjAsIDAuNSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCAxLjAsIDAuMCxcXG4gICAgMC41LCAwLjUsIDAuMCwgMS4wXFxuICApO1xcbiAgdl90ZXhjb29yZF8xID0gdE1hdHJpeCAqIHZfcHJvalBvc2l0aW9uX2Zyb21fbGlnaHQ7XFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIiNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbMF07IC8vIGluZGV4IDAgZGF0YSBpcyB0aGUgbWF0ZXJpYWxTSURcXG5cXG4gIGludCBsaWdodE51bWJlciA9IDA7XFxuICAjaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gICAgbGlnaHROdW1iZXIgPSBnZXRfbGlnaHROdW1iZXIoMC4wLCAwKTtcXG4gICNlbmRpZlxcblxcbiAgZmxvYXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSAtMS4wO1xcbiAgI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICAgICNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXFxuICAgICAgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBhX2luc3RhbmNlSW5mby55O1xcbiAgICAjZWxzZVxcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jZWxzZSAvLyBSTl9JU19VTklGT1JNX01PREVcXG5cXG4gIGZsb2F0IG1hdGVyaWFsU0lEID0gLTEuMDsgLy8gbWF0ZXJpYWxTSUQgaXMgbm90IHVzZWQgaW4gVW5pZm9ybSBtb2RlXFxuXFxuICBpbnQgbGlnaHROdW1iZXIgPSAwO1xcbiAgI2lmZGVmIFJOX0lTX0xJR0hUSU5HXFxuICAgIGxpZ2h0TnVtYmVyID0gZ2V0X2xpZ2h0TnVtYmVyKDAuMCwgMCk7XFxuICAjZW5kaWZcXG5cXG4gIGZsb2F0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gLTEuMDtcXG4gICNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgICBza2VsZXRhbENvbXBvbmVudFNJRCA9IGZsb2F0KGdldF9za2lubmluZ01vZGUoMC4wLCAwKSk7XFxuICAjZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBjYW1lcmFTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWy8qIHNoYWRlcml0eTogQHtXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRH0gKi9dO1xcblxcbiNpZiBkZWZpbmVkKFdFQkdMMl9NVUxUSV9WSUVXKSAmJiBkZWZpbmVkKFJOX0lTX1ZFUlRFWF9TSEFERVIpXFxuLy8gaWYgKHVfaXNNYWluVnIgPT0gMSkge1xcbiAgY2FtZXJhU0lEICs9IGZsb2F0KGdsX1ZpZXdJRF9PVlIpO1xcbi8vIH1cXG4jZW5kaWZcXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiY29uc3QgZmxvYXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4jZGVmaW5lIHNhdHVyYXRlRXBzaWxvblRvT25lKHgpIGNsYW1wKHgsIEVwc2lsb24sIDEuMClcXG5cXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG51bmlmb3JtIGludCB1X21vcnBoVGFyZ2V0TnVtYmVyOyAvLyBpbml0aWFsVmFsdWU9MCwgaXNJbnRlcm5hbFNldHRpbmc9dHJ1ZSwgc29sb0RhdHVtPWZhbHNlLCBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPXRydWVcXG4vLyB1bmlmb3JtIGludCB1X2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbltdO1xcbi8vIHVuaWZvcm0gaW50IHVfbW9ycGhXZWlnaHRzW107IC8vXFxuI2VuZGlmXFxuXFxudW5pZm9ybSBpbnQgdV9pc01haW5WcjsgLy8gc2tpcFByb2Nlc3M9dHJ1ZVxcbnVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIHVfZGF0YVRleHR1cmU7IC8vIHNraXBQcm9jZXNzPXRydWVcXG4vKiBzaGFkZXJpdHk6IEB7d2lkdGhPZkRhdGFUZXh0dXJlfSAqL1xcbi8qIHNoYWRlcml0eTogQHtoZWlnaHRPZkRhdGFUZXh0dXJlfSAqL1xcblxcbiNpZiBkZWZpbmVkKEdMU0xfRVMzKSAmJiBkZWZpbmVkKFJOX0lTX0RBVEFURVhUVVJFX01PREUpICYmIGRlZmluZWQoUk5fSVNfVUJPX0VOQUJMRUQpXFxuLyogc2hhZGVyaXR5OiBAe2RhdGFVQk9WZWM0U2l6ZX0gKi9cXG4vKiBzaGFkZXJpdHk6IEB7ZGF0YVVCT0RlZmluaXRpb259ICovXFxuI2VuZGlmXFxuXFxuXFxuaGlnaHAgdmVjNCBmZXRjaEVsZW1lbnQoaW50IHZlYzRfaWR4KSB7XFxuI2lmIGRlZmluZWQoR0xTTF9FUzMpICYmIGRlZmluZWQoUk5fSVNfREFUQVRFWFRVUkVfTU9ERSkgJiYgZGVmaW5lZChSTl9JU19VQk9fRU5BQkxFRClcXG4gIGlmICh2ZWM0X2lkeCA8IGRhdGFVQk9WZWM0U2l6ZSkge1xcbiAgICByZXR1cm4gZmV0Y2hWZWM0RnJvbVZlYzRCbG9jayh2ZWM0X2lkeCk7XFxuICB9IGVsc2Uge1xcbiAgICBpbnQgaWR4T25EYXRhVGV4ID0gdmVjNF9pZHggLSBkYXRhVUJPVmVjNFNpemU7XFxuICAgIGhpZ2hwIGl2ZWMyIHV2ID0gaXZlYzIoaWR4T25EYXRhVGV4ICUgd2lkdGhPZkRhdGFUZXh0dXJlLCBpZHhPbkRhdGFUZXggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgICByZXR1cm4gdGV4ZWxGZXRjaCggdV9kYXRhVGV4dHVyZSwgdXYsIDAgKTtcXG4gIH1cXG4jZWxpZiBkZWZpbmVkKEdMU0xfRVMzKVxcbiAgaGlnaHAgaXZlYzIgdXYgPSBpdmVjMih2ZWM0X2lkeCAlIHdpZHRoT2ZEYXRhVGV4dHVyZSwgdmVjNF9pZHggLyB3aWR0aE9mRGF0YVRleHR1cmUpO1xcbiAgcmV0dXJuIHRleGVsRmV0Y2goIHVfZGF0YVRleHR1cmUsIHV2LCAwICk7XFxuI2Vsc2VcXG4gIC8vIFRoaXMgaWRlYSBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL1lWVC9pdGVtcy9jNjk1YWI0YjNjZjdmYWE5Mzg4NVxcbiAgaGlnaHAgdmVjMiBpbnZTaXplID0gdmVjMigxLjAvZmxvYXQod2lkdGhPZkRhdGFUZXh0dXJlKSwgMS4wL2Zsb2F0KGhlaWdodE9mRGF0YVRleHR1cmUpKTtcXG4gIGhpZ2hwIGZsb2F0IHQgPSAoZmxvYXQodmVjNF9pZHgpICsgMC41KSAqIGludlNpemUueDtcXG4gIGhpZ2hwIGZsb2F0IHggPSBmcmFjdCh0KTtcXG4gIGhpZ2hwIGZsb2F0IHkgPSAoZmxvb3IodCkgKyAwLjUpICogaW52U2l6ZS55O1xcbiAgI2lmZGVmIEdMU0xfRVMzXFxuICByZXR1cm4gdGV4dHVyZSggdV9kYXRhVGV4dHVyZSwgdmVjMih4LCB5KSk7XFxuICAjZWxzZVxcbiAgcmV0dXJuIHRleHR1cmUoIHVfZGF0YVRleHR1cmUsIHZlYzIoeCwgeSkpO1xcbiAgI2VuZGlmXFxuI2VuZGlmXFxufVxcblxcbnZlYzIgZmV0Y2hWZWMyTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAueXopO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XFxuICAgIHJldHVybiB2ZWMyKHZhbDAuencpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICB2ZWM0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzEpO1xcbiAgICByZXR1cm4gdmVjMih2YWwwLncsIHZhbDEueCk7XFxuICB9XFxufVxcblxcbnZlYzMgZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMyh2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcXG4gICAgcmV0dXJuIHZlYzModmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxudmVjNCBmZXRjaFZlYzQoaW50IHZlYzRfaWR4KSB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZmxvYXQgZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKGludCBzY2FsYXJfaWR4KSB7XFxuI2lmZGVmIEdMU0xfRVMzXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNDtcXG4jZWxzZVxcbiAgaW50IHBvc0luNGJ5dGVzID0gaW50KG1vZChmbG9hdChzY2FsYXJfaWR4KSwgNC4wKSk7XFxuI2VuZGlmXFxuICBpbnQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNDtcXG4gIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMikge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDMpIHtcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5tYXQyIGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4gIGludCB2ZWM0X2lkeCA9IHNjYWxhcl9pZHgqNDtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuXFxuICBtYXQyIHZhbCA9IG1hdDIoXFxuICAgIGNvbDAueCwgY29sMC55LFxcbiAgICBjb2wwLnosIGNvbDAud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxubWF0MiBmZXRjaE1hdDIoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcblxcbiAgbWF0MiB2YWwgPSBtYXQyKFxcbiAgICBjb2wwLngsIGNvbDAueSxcXG4gICAgY29sMC56LCBjb2wwLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcbm1hdDMgZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbnQgc2NhbGFyX2lkeCkge1xcbiNpZmRlZiBHTFNMX0VTM1xcbiAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XFxuI2Vsc2VcXG4gIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xcbiNlbmRpZlxcblxcbiAgaW50IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDQ7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMCkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIG1hdDMgdmFsID0gbWF0MyhcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDEpIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICBtYXQzIHZhbCA9IG1hdDMoXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcblxcbn1cXG5cXG5tYXQzIGZldGNoTWF0MyhpbnQgdmVjNF9pZHgpIHtcXG4gIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxKTtcXG4gIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDIpO1xcblxcbiAgbWF0MyB2YWwgPSBtYXQzKFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0IGZldGNoTWF0NE5vMTZCeXRlc0FsaWduZWQoaW50IHNjYWxhcl9pZHgpIHtcXG4jaWZkZWYgR0xTTF9FUzNcXG4gIGludCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0O1xcbiNlbHNlXFxuICBpbnQgcG9zSW40Ynl0ZXMgPSBpbnQobW9kKGZsb2F0KHNjYWxhcl9pZHgpLCA0LjApKTtcXG4jZW5kaWZcXG5cXG4gIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDApIHtcXG4gICAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICB2ZWM0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDEpO1xcbiAgICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDIpO1xcbiAgICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDMpO1xcbiAgICBtYXQ0IHZhbCA9IG1hdDQoXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMSkge1xcbiAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMSk7XFxuICAgIHZlYzQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMik7XFxuICAgIHZlYzQgY29sMyA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMyk7XFxuICAgIHZlYzQgY29sNCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgNCk7XFxuICAgIG1hdDQgdmFsID0gbWF0NChcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLncsIGNvbDMueCxcXG4gICAgICBjb2wzLnksIGNvbDMueiwgY29sMy53LCBjb2w0LnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAyKSB7XFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LCBjb2wyLnksXFxuICAgICAgY29sMi56LCBjb2wyLncsIGNvbDMueCwgY29sMy55LFxcbiAgICAgIGNvbDMueiwgY29sMy53LCBjb2w0LngsIGNvbDQueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIHZlYzQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxKTtcXG4gICAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAyKTtcXG4gICAgdmVjNCBjb2wzID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAzKTtcXG4gICAgdmVjNCBjb2w0ID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyA0KTtcXG4gICAgbWF0NCB2YWwgPSBtYXQ0KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55LCBjb2wyLnosXFxuICAgICAgY29sMi53LCBjb2wzLngsIGNvbDMueSwgY29sMy56LFxcbiAgICAgIGNvbDMudywgY29sNC54LCBjb2w0LnksIGNvbDQuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbm1hdDQgZmV0Y2hNYXQ0KGludCB2ZWM0X2lkeCkge1xcbiAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIHZlYzQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDEpO1xcbiAgdmVjNCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMik7XFxuICB2ZWM0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzKTtcXG5cXG4gIG1hdDQgdmFsID0gbWF0NChcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5tYXQ0eDMgZmV0Y2hNYXQ0eDMoaW50IHZlYzRfaWR4KSB7XFxuICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgdmVjNCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMSk7XFxuICB2ZWM0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAyKTtcXG5cXG4gIG1hdDR4MyB2YWwgPSBtYXQ0eDMoXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuZmxvYXQgcmFuZChjb25zdCB2ZWMyIGNvKXtcXG4gIHJldHVybiBmcmFjdChzaW4oZG90KGNvLnh5ICx2ZWMyKDEyLjk4OTgsNzguMjMzKSkpICogNDM3NTguNTQ1Myk7XFxufVxcblxcbnZlYzMgZGVzY3JhbWJsZSh2ZWMzIHYpIHtcXG4gIGZsb2F0IHNlZWQgPSAwLjA7XFxuICB2LnggLT0gc2luKGZyYWN0KHYueSoyMC4wKSk7XFxuICB2LnogLT0gY29zKGZyYWN0KC12LnkqMTAuMCkpO1xcbiAgcmV0dXJuIHY7XFxufVxcblxcbmNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjtcXG5cXG5mbG9hdCBtYXgzKHZlYzMgdilcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZsb2F0IHNxKGZsb2F0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG52ZWMyIHNxKHZlYzIgdClcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbnZlYzMgc3EodmVjMyB0KVxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxudmVjNCBzcSh2ZWM0IHQpXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbG9hdCBzYXR1cmF0ZShmbG9hdCB0KVxcbntcXG4gIHJldHVybiBjbGFtcCh0LCAwLjAsIDEuMCk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG52b2lkIGFkZChpbiBmbG9hdCBsZnMsIGluIGZsb2F0IHJocywgb3V0IGZsb2F0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyArIHJocztcXG59XFxudm9pZCBhZGQoaW4gaW50IGxmcywgaW4gaW50IHJocywgb3V0IGludCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBsZnMgKyByaHM7XFxufVxcbnZvaWQgYWRkKGluIHZlYzIgbGZzLCBpbiB2ZWMyIHJocywgb3V0IHZlYzIgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gbGZzICsgcmhzO1xcbn1cXG52b2lkIGFkZChpbiB2ZWMzIGxmcywgaW4gdmVjMyByaHMsIG91dCB2ZWMzIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyArIHJocztcXG59XFxudm9pZCBhZGQoaW4gdmVjNCBsZnMsIGluIHZlYzQgcmhzLCBvdXQgdmVjNCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBsZnMgKyByaHM7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG5pbiB2ZWM0IGFfY29sb3JfMDtcXG5cXG52b2lkIGF0dHJpYnV0ZUNvbG9yKG91dCB2ZWM0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGFfY29sb3JfMDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuaW4gdmVjMyBhX25vcm1hbDtcXG5cXG52b2lkIGF0dHJpYnV0ZU5vcm1hbChvdXQgdmVjMyBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBhX25vcm1hbDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuaW4gdmVjNCBhX3Bvc2l0aW9uO1xcblxcbnZvaWQgYXR0cmlidXRlUG9zaXRpb24ob3V0IHZlYzQgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gYV9wb3NpdGlvbjtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuaW4gdmVjMiBhX3RleGNvb3JkXzA7XFxuXFxudm9pZCBhdHRyaWJ1dGVUZXhjb29yZChvdXQgdmVjMiBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBhX3RleGNvb3JkXzA7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbnZvaWQgZG90UHJvZHVjdChpbiB2ZWMyIGxmcywgaW4gdmVjMiByaHMsIG91dCBmbG9hdCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBkb3QobGZzLCByaHMpO1xcbn1cXG52b2lkIGRvdFByb2R1Y3QoaW4gdmVjMyBsZnMsIGluIHZlYzMgcmhzLCBvdXQgZmxvYXQgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gZG90KGxmcywgcmhzKTtcXG59XFxudm9pZCBkb3RQcm9kdWN0KGluIHZlYzQgbGZzLCBpbiB2ZWM0IHJocywgb3V0IGZsb2F0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGRvdChsZnMsIHJocyk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG52b2lkIGdyZWF0ZXIoaW4gZmxvYXQgbGhzLCBpbiBmbG9hdCByaHMsIG91dCBib29sIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxocyA+IHJocztcXG59XFxuXFxudm9pZCBncmVhdGVyKGluIGludCBsaHMsIGluIGludCByaHMsIG91dCBib29sIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxocyA+IHJocztcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcInZvaWQgbWVyZ2VWZWN0b3JYWVpfVyhpbiB2ZWMzIHh5eiwgaW4gZmxvYXQgdywgb3V0IHZlYzQgb3V0WFlaVywgb3V0IHZlYzMgb3V0WFlaLCBvdXQgdmVjMiBvdXRYWSwgb3V0IHZlYzIgb3V0WlcpIHtcXG4gIG91dFhZWlcueCA9IHh5ei54O1xcbiAgb3V0WFlaVy55ID0geHl6Lnk7XFxuICBvdXRYWVpXLnogPSB4eXouejtcXG4gIG91dFhZWlcudyA9IHc7XFxuICBvdXRYWVogPSB4eXo7XFxuICBvdXRYWSA9IHh5ei54eTtcXG4gIG91dFpXID0gdmVjMih4eXoueiwgdyk7XFxufVxcblxcbnZvaWQgbWVyZ2VWZWN0b3JYWV9aVyhpbiB2ZWMyIHh5LCBpbiB2ZWMyIHp3LCBvdXQgdmVjNCBvdXRYWVpXLCBvdXQgdmVjMyBvdXRYWVosIG91dCB2ZWMyIG91dFhZLCBvdXQgdmVjMiBvdXRaVykge1xcbiAgb3V0WFlaVy54ID0geHkueDtcXG4gIG91dFhZWlcueSA9IHh5Lnk7XFxuICBvdXRYWVpXLnogPSB6dy54O1xcbiAgb3V0WFlaVy53ID0gencueTtcXG4gIG91dFhZWiA9IHZlYzMoeHksIHp3LngpO1xcbiAgb3V0WFkgPSB4eTtcXG4gIG91dFpXID0genc7XFxufVxcblxcbnZvaWQgbWVyZ2VWZWN0b3JYWV9aX1coaW4gdmVjMiB4eSwgaW4gZmxvYXQgeiwgaW4gZmxvYXQgdywgb3V0IHZlYzQgb3V0WFlaVywgb3V0IHZlYzMgb3V0WFlaLCBvdXQgdmVjMiBvdXRYWSwgb3V0IHZlYzIgb3V0WlcpIHtcXG4gIG91dFhZWlcueCA9IHh5Lng7XFxuICBvdXRYWVpXLnkgPSB4eS55O1xcbiAgb3V0WFlaVy56ID0gejtcXG4gIG91dFhZWlcudyA9IHc7XFxuICBvdXRYWVogPSB2ZWMzKHh5LCB6KTtcXG4gIG91dFhZID0geHk7XFxuICBvdXRaVyA9IHZlYzIoeiwgdyk7XFxufVxcblxcbnZvaWQgbWVyZ2VWZWN0b3JaV19YX1koaW4gdmVjMiB6dywgaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSwgb3V0IHZlYzQgb3V0WFlaVywgb3V0IHZlYzMgb3V0WFlaLCBvdXQgdmVjMiBvdXRYWSwgb3V0IHZlYzIgb3V0WlcpIHtcXG4gIG91dFhZWlcueCA9IHg7XFxuICBvdXRYWVpXLnkgPSB5O1xcbiAgb3V0WFlaVy56ID0gencueDtcXG4gIG91dFhZWlcudyA9IHp3Lnk7XFxuICBvdXRYWVogPSB2ZWMzKHgsIHksIHp3LngpO1xcbiAgb3V0WFkgPSB2ZWMyKHgsIHkpO1xcbiAgb3V0WlcgPSB6dztcXG59XFxuXFxudm9pZCBtZXJnZVZlY3RvclhfWV9aX1coaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSwgaW4gZmxvYXQgeiwgaW4gZmxvYXQgdywgb3V0IHZlYzQgb3V0WFlaVywgb3V0IHZlYzMgb3V0WFlaLCBvdXQgdmVjMiBvdXRYWSwgb3V0IHZlYzIgb3V0WlcpIHtcXG4gIG91dFhZWlcueCA9IHg7XFxuICBvdXRYWVpXLnkgPSB5O1xcbiAgb3V0WFlaVy56ID0gejtcXG4gIG91dFhZWlcudyA9IHc7XFxuICBvdXRYWVogPSB2ZWMzKHgsIHksIHopO1xcbiAgb3V0WFkgPSB2ZWMyKHgsIHkpO1xcbiAgb3V0WlcgPSB2ZWMyKHosIHcpO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxudm9pZCBtdWx0aXBseShpbiBmbG9hdCBsZnMsIGluIGZsb2F0IHJocywgb3V0IGZsb2F0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiBpbnQgbGZzLCBpbiBpbnQgcmhzLCBvdXQgaW50IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiB2ZWMyIGxmcywgaW4gdmVjMiByaHMsIG91dCB2ZWMyIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiB2ZWMzIGxmcywgaW4gdmVjMyByaHMsIG91dCB2ZWMzIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiB2ZWM0IGxmcywgaW4gdmVjNCByaHMsIG91dCB2ZWM0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiBtYXQyIGxmcywgaW4gbWF0MiByaHMsIG91dCBtYXQyIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiBtYXQzIGxmcywgaW4gbWF0MyByaHMsIG91dCBtYXQzIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCBtdWx0aXBseShpbiBtYXQ0IGxmcywgaW4gbWF0NCByaHMsIG91dCBtYXQ0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbnZvaWQgbm9ybWFsTWF0cml4KG91dCBtYXQzIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGdldF9ub3JtYWxNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbnZvaWQgX25vcm1hbGl6ZShpbiB2ZWMyIHZhbHVlLCBvdXQgdmVjMiBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBub3JtYWxpemUodmFsdWUpO1xcbn1cXG5cXG52b2lkIF9ub3JtYWxpemUoaW4gdmVjMyB2YWx1ZSwgb3V0IHZlYzMgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gbm9ybWFsaXplKHZhbHVlKTtcXG59XFxuXFxudm9pZCBfbm9ybWFsaXplKGluIHZlYzQgdmFsdWUsIG91dCB2ZWM0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IG5vcm1hbGl6ZSh2YWx1ZSk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG52b2lkIHByb2plY3Rpb25NYXRyaXgob3V0IG1hdDQgb3V0VmFsdWUpIHtcXG4gIGZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSovXTtcXG4gIG91dFZhbHVlID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwidm9pZCBfc2luKGluIGZsb2F0IHZhbHVlLCBvdXQgZmxvYXQgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gc2luKHZhbHVlKTtcXG59XFxudm9pZCBfc2luKGluIHZlYzIgdmFsdWUsIG91dCB2ZWMyIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IHNpbih2YWx1ZSk7XFxufVxcbnZvaWQgX3NpbihpbiB2ZWMzIHZhbHVlLCBvdXQgdmVjMyBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBzaW4odmFsdWUpO1xcbn1cXG52b2lkIF9zaW4oaW4gdmVjNCB2YWx1ZSwgb3V0IHZlYzQgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gc2luKHZhbHVlKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcInZvaWQgX3Ntb290aHN0ZXAoaW4gZmxvYXQgdmFsdWUsIGluIGZsb2F0IGVkZ2UwLCBpbiBmbG9hdCBlZGdlMSwgb3V0IGZsb2F0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IHNtb290aHN0ZXAoZWRnZTAsIGVkZ2UxLCB2YWx1ZSk7XFxufVxcbnZvaWQgX3Ntb290aHN0ZXAoaW4gdmVjMiB2YWx1ZSwgaW4gdmVjMiBlZGdlMCwgaW4gdmVjMiBlZGdlMSwgb3V0IHZlYzIgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gc21vb3Roc3RlcChlZGdlMCwgZWRnZTEsIHZhbHVlKTtcXG59XFxudm9pZCBfc21vb3Roc3RlcChpbiB2ZWMzIHZhbHVlLCBpbiB2ZWMzIGVkZ2UwLCBpbiB2ZWMzIGVkZ2UxLCBvdXQgdmVjMyBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBzbW9vdGhzdGVwKGVkZ2UwLCBlZGdlMSwgdmFsdWUpO1xcbn1cXG52b2lkIF9zbW9vdGhzdGVwKGluIHZlYzQgdmFsdWUsIGluIHZlYzQgZWRnZTAsIGluIHZlYzQgZWRnZTEsIG91dCB2ZWM0IG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IHNtb290aHN0ZXAoZWRnZTAsIGVkZ2UxLCB2YWx1ZSk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJ2b2lkIHNwbGl0VmVjdG9yKGluIHZlYzQgeHl6dywgb3V0IHZlYzMgb3V0WFlaLCBvdXQgdmVjMiBvdXRYWSwgb3V0IHZlYzIgb3V0WlcsIG91dCBmbG9hdCBvdXRYLCBvdXQgZmxvYXQgb3V0WSwgb3V0IGZsb2F0IG91dFosIG91dCBmbG9hdCBvdXRXKSB7XFxuICBvdXRYID0geHl6dy54O1xcbiAgb3V0WSA9IHh5encueTtcXG4gIG91dFogPSB4eXp3Lno7XFxuICBvdXRXID0geHl6dy53O1xcbiAgb3V0WFlaID0geHl6dy54eXo7XFxuICBvdXRYWSA9IHh5encueHk7XFxuICBvdXRaVyA9IHh5encuenc7XFxufVxcblxcbnZvaWQgc3BsaXRWZWN0b3IoaW4gdmVjMyB4eXosIG91dCB2ZWMzIG91dFhZWiwgb3V0IHZlYzIgb3V0WFksIG91dCB2ZWMyIG91dFpXLCBvdXQgZmxvYXQgb3V0WCwgb3V0IGZsb2F0IG91dFksIG91dCBmbG9hdCBvdXRaLCBvdXQgZmxvYXQgb3V0Vykge1xcbiAgb3V0WCA9IHh5ei54O1xcbiAgb3V0WSA9IHh5ei55O1xcbiAgb3V0WiA9IHh5ei56O1xcbiAgb3V0VyA9IDAuMDtcXG4gIG91dFhZWiA9IHh5ejtcXG4gIG91dFhZID0geHl6Lnh5O1xcbiAgb3V0WlcgPSB2ZWMyKHh5ei56LCAwLjApO1xcbn1cXG5cXG52b2lkIHNwbGl0VmVjdG9yKGluIHZlYzIgeHksIG91dCB2ZWMzIG91dFhZWiwgb3V0IHZlYzIgb3V0WFksIG91dCB2ZWMyIG91dFpXLCBvdXQgZmxvYXQgb3V0WCwgb3V0IGZsb2F0IG91dFksIG91dCBmbG9hdCBvdXRaLCBvdXQgZmxvYXQgb3V0Vykge1xcbiAgb3V0WCA9IHh5Lng7XFxuICBvdXRZID0geHkueTtcXG4gIG91dFogPSAwLjA7XFxuICBvdXRXID0gMC4wO1xcbiAgb3V0WFlaID0gdmVjMyh4eSwgMC4wKTtcXG4gIG91dFhZID0geHk7XFxuICBvdXRaVyA9IHZlYzIoMC4wKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcInZvaWQgX3N0ZXAoaW4gZmxvYXQgdmFsdWUsIGluIGZsb2F0IGVkZ2UsIG91dCBmbG9hdCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBzdGVwKGVkZ2UsIHZhbHVlKTtcXG59XFxudm9pZCBfc3RlcChpbiB2ZWMyIHZhbHVlLCBpbiB2ZWMyIGVkZ2UsIG91dCB2ZWMyIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IHN0ZXAoZWRnZSwgdmFsdWUpO1xcbn1cXG52b2lkIF9zdGVwKGluIHZlYzMgdmFsdWUsIGluIHZlYzMgZWRnZSwgb3V0IHZlYzMgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gc3RlcChlZGdlLCB2YWx1ZSk7XFxufVxcbnZvaWQgX3N0ZXAoaW4gdmVjNCB2YWx1ZSwgaW4gdmVjNCBlZGdlLCBvdXQgdmVjNCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBzdGVwKGVkZ2UsIHZhbHVlKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbnZvaWQgdGltZShvdXQgZmxvYXQgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gZ2V0X3RpbWUoMC4wLCAwKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcInZvaWQgdHJhbnNmb3JtKGluIG1hdDIgbGZzLCBpbiB2ZWMyIHJocywgb3V0IHZlYzIgb3V0VmFsdWUpIHtcXG4gIG91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG52b2lkIHRyYW5zZm9ybShpbiBtYXQzIGxmcywgaW4gdmVjMyByaHMsIG91dCB2ZWMzIG91dFZhbHVlKSB7XFxuICBvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxudm9pZCB0cmFuc2Zvcm0oaW4gbWF0NCBsZnMsIGluIHZlYzQgcmhzLCBvdXQgdmVjNCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBsZnMgKiByaHM7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG52b2lkIHZpZXdNYXRyaXgob3V0IG1hdDQgb3V0VmFsdWUpIHtcXG4gIGZsb2F0IGNhbWVyYVNJRCA9IHVfY3VycmVudENvbXBvbmVudFNJRHNbLyogc2hhZGVyaXR5OiBAe1dlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEfSovXTtcXG4gIG91dFZhbHVlID0gZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiYm9vbCB3aXJlZnJhbWUoXFxuICBpbiB2ZWM0IGV4aXN0aW5nRnJhZ0NvbG9yLFxcbiAgaW4gdmVjNCB3aXJlZnJhbWVDb2xvcixcXG4gIG91dCB2ZWM0IG91dENvbG9yXFxuKSB7XFxuICB2ZWMzIHdpcmVmcmFtZUluZm8gPSBnZXRfd2lyZWZyYW1lKGFfaW5zdGFuY2VJbmZvLngpO1xcblxcbiAgLy8gV2lyZWZyYW1lXFxuICBmbG9hdCB0aHJlc2hvbGQgPSAwLjAwMTtcXG4gIGZsb2F0IHdpcmVmcmFtZVdpZHRoSW5uZXIgPSB3aXJlZnJhbWVJbmZvLno7XFxuICBmbG9hdCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUgPSAxLjA7XFxuICBpZiAod2lyZWZyYW1lSW5mby54ID4gMC41ICYmIHdpcmVmcmFtZUluZm8ueSA8IDAuNSkge1xcbiAgICBvdXRDb2xvci5hID0gMC4wO1xcbiAgfVxcbiAgdmVjNCB3aXJlZnJhbWVSZXN1bHQgPSBleGlzdGluZ0ZyYWdDb2xvcjtcXG4gIGZsb2F0IGVkZ2VSYXRpbyA9IGVkZ2VfcmF0aW8odl9iYXJ5Q2VudHJpY0Nvb3JkLCB3aXJlZnJhbWVXaWR0aElubmVyLCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUpO1xcbiAgZmxvYXQgZWRnZVJhdGlvTW9kaWZpZWQgPSBtaXgoc3RlcCh0aHJlc2hvbGQsIGVkZ2VSYXRpbyksIGNsYW1wKGVkZ2VSYXRpbyo0LjAsIDAuMCwgMS4wKSwgd2lyZWZyYW1lV2lkdGhJbm5lciAvIHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZS80LjApO1xcbiAgLy8gaWYgcjAuYSBpcyAwLjAsIGl0IGlzIHdpcmVmcmFtZSBub3Qgb24gc2hhZGVkXFxuICB3aXJlZnJhbWVSZXN1bHQucmdiID0gd2lyZWZyYW1lQ29sb3IucmdiICogZWRnZVJhdGlvTW9kaWZpZWQgKyBleGlzdGluZ0ZyYWdDb2xvci5yZ2IgKiAoMS4wIC0gZWRnZVJhdGlvTW9kaWZpZWQpO1xcbiAgd2lyZWZyYW1lUmVzdWx0LmEgPSBtYXgoZXhpc3RpbmdGcmFnQ29sb3IuYSwgd2lyZWZyYW1lQ29sb3IuYSAqIG1peChlZGdlUmF0aW9Nb2RpZmllZCwgcG93KGVkZ2VSYXRpb01vZGlmaWVkLCAxMDAuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvMS4wKSk7XFxuXFxuICBpZiAod2lyZWZyYW1lSW5mby54ID4gMC41KSB7XFxuICAgIG91dENvbG9yID0gd2lyZWZyYW1lUmVzdWx0O1xcbiAgICBpZiAod2lyZWZyYW1lSW5mby55IDwgMC41ICYmIGV4aXN0aW5nRnJhZ0NvbG9yLmEgPT0gMC4wKSB7XFxuICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgfVxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxudm9pZCB3b3JsZE1hdHJpeChvdXQgbWF0NCBvdXRWYWx1ZSkge1xcbiAgb3V0VmFsdWUgPSBnZXRfd29ybGRNYXRyaXgoYV9pbnN0YW5jZUluZm8ueCk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5zdHJ1Y3QgTGlnaHQge1xcbiAgbGlnaHRUeXBlOiBpMzIsIC8vIDAgPSBkaXJlY3Rpb25hbCwgMSA9IHBvaW50LCAyID0gc3BvdFxcbiAgcG9zaXRpb246IHZlYzM8ZjMyPixcXG4gIGludGVuc2l0eTogdmVjMzxmMzI+LFxcbiAgYXR0ZW51YXRlZEludGVuc2l0eTogdmVjMzxmMzI+LFxcbiAgZGlyZWN0aW9uT2ZMaWdodE9iamVjdDogdmVjMzxmMzI+LFxcbiAgZGlyZWN0aW9uOiB2ZWMzPGYzMj4sIC8vIGRpcmVjdGlvbiBvZiBsaWdodCB2ZWN0b3IsIGVxdWFsIHRvIG5vcm1hbGl6ZShsaWdodC5wb2ludFRvTGlnaHQpXFxuICBwb2ludFRvTGlnaHQ6IHZlYzM8ZjMyPiwgLy8gbm90IG5vcm1hbGl6ZWRcXG4gIHNwb3RBbmdsZVNjYWxlOiBmMzIsXFxuICBzcG90QW5nbGVPZmZzZXQ6IGYzMixcXG4gIGVmZmVjdGl2ZVJhbmdlOiBmMzIsXFxufTtcXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNyYW5nZS1wcm9wZXJ0eVxcbmZuIGdldFJhbmdlQXR0ZW51YXRpb24obGlnaHQ6IExpZ2h0KSAtPiBmMzJcXG57XFxuICBsZXQgZGlzdGFuY2UgPSBsZW5ndGgobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gIC8vIG1lYW5zIG5vIHJhbmdlIGxpbWl0XFxuICBpZiAobGlnaHQuZWZmZWN0aXZlUmFuZ2UgPD0gMC4wKVxcbiAge1xcbiAgICByZXR1cm4gMS4wIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbiAgfVxcbiAgcmV0dXJuIG1heChtaW4oMS4wIC0gcG93KGRpc3RhbmNlIC8gbGlnaHQuZWZmZWN0aXZlUmFuZ2UsIDQuMCksIDEuMCksIDAuMCkgLyBwb3coZGlzdGFuY2UsIDIuMCk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9saWdodHNfcHVuY3R1YWwvUkVBRE1FLm1kI2lubmVyLWFuZC1vdXRlci1jb25lLWFuZ2xlc1xcbmZuIGdldFNwb3RBdHRlbnVhdGlvbihsaWdodDogTGlnaHQpIC0+IGYzMlxcbntcXG5cXG4gIGxldCBjZCA9IGRvdChsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0LCBsaWdodC5kaXJlY3Rpb24pO1xcbiAgbGV0IGFuZ3VsYXJBdHRlbnVhdGlvbiA9IGNsYW1wKGNkICogbGlnaHQuc3BvdEFuZ2xlU2NhbGUgKyBsaWdodC5zcG90QW5nbGVPZmZzZXQsIDAuMCwgMS4wKTtcXG4gIHJldHVybiBhbmd1bGFyQXR0ZW51YXRpb247XFxufVxcblxcbmZuIGdldExpZ2h0QXR0ZW51YXRlZChsaWdodDogTGlnaHQpIC0+IExpZ2h0IHtcXG4gIHZhciBuZXdMaWdodDogTGlnaHQgPSBsaWdodDtcXG4gIG5ld0xpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICAvLyBpZiAobGlnaHQubGlnaHRUeXBlID09IDApIHsgLy8gRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgLy8gRGlyZWN0aW9uYWwgTGlnaHQgZG9uJ3QgYXR0ZW51YXRlIGdlb21ldGljYWxseVxcbiAgLy8gfVxcblxcbiAgLy8gUG9pbnQgTGlnaHRcXG4gIGlmIChsaWdodC5saWdodFR5cGUgPT0gMSlcXG4gIHtcXG4gICAgbmV3TGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSAqPSBnZXRSYW5nZUF0dGVudWF0aW9uKGxpZ2h0KTtcXG4gIH1cXG4gIC8vIFNwb3QgbGlnaHRcXG4gIGlmIChsaWdodC5saWdodFR5cGUgPT0gMilcXG4gIHtcXG4gICAgbmV3TGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSAqPSBnZXRTcG90QXR0ZW51YXRpb24obGlnaHQpO1xcbiAgfVxcblxcbiAgcmV0dXJuIG5ld0xpZ2h0O1xcbn1cXG5cXG5mbiBnZXRMaWdodChsaWdodElkeDogdTMyLCB2X3Bvc2l0aW9uX2luV29ybGQ6IHZlYzM8ZjMyPikgLT4gTGlnaHQge1xcbiAgbGV0IGxpZ2h0UG9zaXRpb246IHZlYzM8ZjMyPiA9IGdldF9saWdodFBvc2l0aW9uKDB1LCBsaWdodElkeCk7XFxuICBsZXQgZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0OiB2ZWMzPGYzMj4gPSBnZXRfbGlnaHREaXJlY3Rpb24oMHUsIGxpZ2h0SWR4KTtcXG4gIGxldCBsaWdodEludGVuc2l0eTogdmVjMzxmMzI+ID0gZ2V0X2xpZ2h0SW50ZW5zaXR5KDB1LCBsaWdodElkeCk7XFxuICBsZXQgbGlnaHRQcm9wZXJ0eTogdmVjNDxmMzI+ID0gZ2V0X2xpZ2h0UHJvcGVydHkoMHUsIGxpZ2h0SWR4KTtcXG4gIHZhciBsaWdodDogTGlnaHQ7XFxuICBsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ID0gZGlyZWN0aW9uX2FuZF93X29mX0xpZ2h0T2JqZWN0O1xcbiAgbGV0IGxpZ2h0VHlwZSA9IGxpZ2h0UHJvcGVydHkueDtcXG4gIGxpZ2h0LmVmZmVjdGl2ZVJhbmdlID0gbGlnaHRQcm9wZXJ0eS55O1xcbiAgbGlnaHQuc3BvdEFuZ2xlU2NhbGUgPSBsaWdodFByb3BlcnR5Lno7XFxuICBsaWdodC5zcG90QW5nbGVPZmZzZXQgPSBsaWdodFByb3BlcnR5Lnc7XFxuXFxuICBsaWdodC5pbnRlbnNpdHkgPSBsaWdodEludGVuc2l0eTtcXG4gIGxpZ2h0LnBvc2l0aW9uID0gbGlnaHRQb3NpdGlvbjtcXG4gIGlmIChsaWdodFR5cGUgPCAtMC41KSB7IC8vIGRpc2FibGVkIGxpZ2h0XFxuICAgIGxpZ2h0LmludGVuc2l0eSA9IHZlYzNmKDAuMCk7XFxuICAgIGxpZ2h0LmxpZ2h0VHlwZSA9IC0xO1xcbiAgfSBlbHNlIGlmICgwLjc1IDwgbGlnaHRUeXBlKSB7IC8vIGlzIHBvaW50bGlnaHQgb3Igc3BvdGxpZ2h0XFxuICAgIGxpZ2h0LnBvaW50VG9MaWdodCA9IGxpZ2h0UG9zaXRpb24gLSB2X3Bvc2l0aW9uX2luV29ybGQ7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5wb2ludFRvTGlnaHQpO1xcbiAgICBsaWdodC5saWdodFR5cGUgPSAxO1xcbiAgfSBlbHNlIHsgLy8gaXMgRGlyZWN0aW9uYWwgTGlnaHRcXG4gICAgbGlnaHQubGlnaHRUeXBlID0gMDtcXG4gICAgbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKGxpZ2h0LmRpcmVjdGlvbk9mTGlnaHRPYmplY3QgKiAtMS4wKTtcXG4gIH1cXG5cXG4gIGlmIChsaWdodFR5cGUgPiAxLjc1KSB7IC8vIGlzIHNwb3RsaWdodFxcbiAgICBsaWdodC5saWdodFR5cGUgPSAyO1xcbiAgfVxcblxcbiAgbGlnaHQuaW50ZW5zaXR5ICo9IE1fUEk7IC8vIFB1bmN0dWFsIExpZ2h0XFxuXFxuICAvLyBBdHRlbnVhdGlvblxcbiAgbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTtcXG4gIGxldCBuZXdMaWdodCA9IGdldExpZ2h0QXR0ZW51YXRlZChsaWdodCk7XFxuXFxuICByZXR1cm4gbmV3TGlnaHQ7XFxufVxcblxcbiNpZmRlZiBSTl9VU0VfVEFOR0VOVFxcbiAgZm4gZ2V0VEJOKG5vcm1hbF9pbldvcmxkOiB2ZWMzZiwgaW5wdXQ6IFZlcnRleE91dHB1dCwgdmlld1ZlY3RvcjogdmVjM2YsIHRleGNvb3JkOiB2ZWMyZiwgaXNGcm9udDogYm9vbCkgLT4gbWF0M3gzPGYzMj4ge1xcbiAgICBsZXQgdGFuZ2VudF9pbldvcmxkID0gbm9ybWFsaXplKGlucHV0LnRhbmdlbnRfaW5Xb3JsZCk7XFxuICAgIGxldCBiaW5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGlucHV0LmJpbm9ybWFsX2luV29ybGQpO1xcbiAgICBsZXQgdGJuTWF0X3RhbmdlbnRfdG9fd29ybGQgPSBtYXQzeDM8ZjMyPih0YW5nZW50X2luV29ybGQsIGJpbm9ybWFsX2luV29ybGQsIG5vcm1hbF9pbldvcmxkKTtcXG5cXG4gICAgcmV0dXJuIHRibk1hdF90YW5nZW50X3RvX3dvcmxkO1xcbiAgfVxcbiNlbHNlXFxuICAgIC8vIFRoaXMgaXMgYmFzZWQgb24gaHR0cDovL3d3dy50aGV0ZW50aHBsYW5ldC5kZS9hcmNoaXZlcy8xMTgwXFxuICAgIGZuIGNvdGFuZ2VudF9mcmFtZShub3JtYWxfaW5Xb3JsZDogdmVjM2YsIHBvc2l0aW9uOiB2ZWMzZiwgdXZfOiB2ZWMyZiwgaXNGcm9udDogYm9vbCkgLT4gbWF0M3gzPGYzMj4ge1xcbiAgICAgIHZhciB1djogdmVjMmY7XFxuICAgICAgaWYgKGlzRnJvbnQpIHtcXG4gICAgICAgIHV2ID0gdXZfO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB1diA9IC11dl87XFxuICAgICAgfVxcblxcbiAgICAgIC8vIGdldCBlZGdlIHZlY3RvcnMgb2YgdGhlIHBpeGVsIHRyaWFuZ2xlXFxuICAgICAgbGV0IGRwMSA9IGRwZHgocG9zaXRpb24pO1xcbiAgICAgIGxldCBkcDIgPSBkcGR5KHBvc2l0aW9uKTtcXG4gICAgICBsZXQgZHV2MSA9IGRwZHgodXYpO1xcbiAgICAgIGxldCBkdXYyID0gZHBkeSh1dik7XFxuXFxuICAgICAgLy8gc29sdmUgdGhlIGxpbmVhciBzeXN0ZW1cXG4gICAgICBsZXQgZHAycGVycCA9IGNyb3NzKGRwMiwgbm9ybWFsX2luV29ybGQpO1xcbiAgICAgIGxldCBkcDFwZXJwID0gY3Jvc3Mobm9ybWFsX2luV29ybGQsIGRwMSk7XFxuICAgICAgbGV0IHRhbmdlbnQgPSBkcDJwZXJwICogZHV2MS54ICsgZHAxcGVycCAqIGR1djIueDtcXG4gICAgICB2YXIgYml0YW5nZW50ID0gZHAycGVycCAqIGR1djEueSArIGRwMXBlcnAgKiBkdXYyLnk7XFxuICAgICAgYml0YW5nZW50ICo9IC0xLjA7XFxuXFxuICAgICAgLy8gY29uc3RydWN0IGEgc2NhbGUtaW52YXJpYW50IGZyYW1lXFxuICAgICAgbGV0IGludk1hdCA9IDEuMCAvIHNxcnQobWF4KGRvdCh0YW5nZW50LCB0YW5nZW50KSwgZG90KGJpdGFuZ2VudCwgYml0YW5nZW50KSkpO1xcbiAgICAgIHJldHVybiBtYXQzeDM8ZjMyPih0YW5nZW50ICogaW52TWF0LCBiaXRhbmdlbnQgKiBpbnZNYXQsIG5vcm1hbF9pbldvcmxkKTtcXG4gICAgfVxcblxcbiAgICBmbiBnZXRUQk4obm9ybWFsX2luV29ybGQ6IHZlYzNmLCBpbnB1dDogVmVydGV4T3V0cHV0LCB2aWV3VmVjdG9yOiB2ZWMzZiwgdGV4Y29vcmQ6IHZlYzJmLCBpc0Zyb250OiBib29sKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICAgICAgbGV0IHRibk1hdF90YW5nZW50X3RvX3dvcmxkID0gY290YW5nZW50X2ZyYW1lKG5vcm1hbF9pbldvcmxkLCAtdmlld1ZlY3RvciwgdGV4Y29vcmQsIGlzRnJvbnQpO1xcblxcbiAgICAgIHJldHVybiB0Ym5NYXRfdGFuZ2VudF90b193b3JsZDtcXG4gICAgfVxcbiNlbmRpZlxcblxcbmZuIHNyZ2JUb0xpbmVhcihzcmdiQ29sb3I6IHZlYzNmKSAtPiB2ZWMzZiB7XFxuICByZXR1cm4gcG93KHNyZ2JDb2xvciwgdmVjM2YoMi4yKSk7XFxufVxcblxcbmZuIGxpbmVhclRvU3JnYihsaW5lYXJDb2xvcjogdmVjM2YpIC0+IHZlYzNmIHtcXG4gIHJldHVybiBwb3cobGluZWFyQ29sb3IsIHZlYzNmKDEuMC8yLjIpKTtcXG59XFxuXFxuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1WaWV3ZXIvYmxvYi9lMmM3YjhjOGJkMTI5MTZjMWEzODdjZDQxZjllZjA2MWVkYzcxOGRmL3NvdXJjZS9SZW5kZXJlci9zaGFkZXJzL2JyZGYuZ2xzbCNMNDQtTDY2XFxuZm4gU2NobGlja190b19GMF9GOTAoZjogdmVjM2YsIGY5MDogdmVjM2YsIFZkb3RIOiBmMzIpIC0+IHZlYzNmIHtcXG4gICAgbGV0IHggPSBjbGFtcCgxLjAgLSBWZG90SCwgMC4wLCAxLjApO1xcbiAgICBsZXQgeDIgPSB4ICogeDtcXG4gICAgbGV0IHg1ID0gY2xhbXAoeCAqIHgyICogeDIsIDAuMCwgMC45OTk5KTtcXG5cXG4gICAgcmV0dXJuIChmIC0gZjkwICogeDUpIC8gKDEuMCAtIHg1KTtcXG59XFxuXFxuZm4gU2NobGlja190b19GMF9GOTBfRjMyKGY6IGYzMiwgZjkwOiBmMzIsIFZkb3RIOiBmMzIpIC0+IGYzMiB7XFxuICAgIGxldCB4ID0gY2xhbXAoMS4wIC0gVmRvdEgsIDAuMCwgMS4wKTtcXG4gICAgbGV0IHgyID0geCAqIHg7XFxuICAgIGxldCB4NSA9IGNsYW1wKHggKiB4MiAqIHgyLCAwLjAsIDAuOTk5OSk7XFxuXFxuICAgIHJldHVybiAoZiAtIGY5MCAqIHg1KSAvICgxLjAgLSB4NSk7XFxufVxcblxcbmZuIFNjaGxpY2tfdG9fRjAoZjogdmVjM2YsIFZkb3RIOiBmMzIpIC0+IHZlYzNmIHtcXG4gICAgcmV0dXJuIFNjaGxpY2tfdG9fRjBfRjkwKGYsIHZlYzMoMS4wKSwgVmRvdEgpO1xcbn1cXG5cXG5mbiBTY2hsaWNrX3RvX0YwX0YzMihmOiBmMzIsIFZkb3RIOiBmMzIpIC0+IGYzMiB7XFxuICAgIHJldHVybiBTY2hsaWNrX3RvX0YwX0Y5MF9GMzIoZiwgMS4wLCBWZG90SCk7XFxufVxcblxcblxcbi8vIFRoZSBTY2hsaWNrIEFwcHJveGltYXRpb24gdG8gRnJlc25lbFxcbmZuIGZyZXNuZWwoZjAgOiB2ZWMzZiwgZjkwIDogdmVjM2YsIFZkb3RIIDogZjMyKSAtPiB2ZWMzZiB7XFxuICAgIGxldCB4ID0gY2xhbXAoMS4wIC0gVmRvdEgsIDAuMCwgMS4wKTtcXG4gICAgbGV0IHgyID0geCAqIHg7XFxuICAgIGxldCB4NSA9IHggKiB4MiAqIHgyO1xcbiAgICByZXR1cm4gZjAgKyAoZjkwIC0gZjApICogeDU7XFxufVxcblxcbmZuIGZyZXNuZWxGMzIoZjAgOiBmMzIsIGY5MCA6IGYzMiwgVmRvdEggOiBmMzIpIC0+IGYzMiB7XFxuICAgIGxldCB4ID0gY2xhbXAoMS4wIC0gVmRvdEgsIDAuMCwgMS4wKTtcXG4gICAgbGV0IHgyID0geCAqIHg7XFxuICAgIGxldCB4NSA9IHggKiB4MiAqIHgyO1xcbiAgICByZXR1cm4gZjAgKyAoZjkwIC0gZjApICogeDU7XFxufVxcblxcbmZuIGZyZXNuZWwyKGYwOiB2ZWMzZiwgVmRvdEg6IGYzMikgLT4gdmVjM2ZcXG57XFxuICBsZXQgZjkwID0gdmVjM2YoMS4wKTsgLy9jbGFtcCg1MC4wICogZjAsIDAuMCwgMS4wKTtcXG4gIHJldHVybiBmcmVzbmVsKGYwLCBmOTAsIFZkb3RIKTtcXG59XFxuXFxuZm4gZnJlc25lbDJGMzIoZjA6IGYzMiwgVmRvdEg6IGYzMikgLT4gZjMyXFxue1xcbiAgbGV0IGY5MCA9IDEuMDsgLy9jbGFtcCg1MC4wICogZjAsIDAuMCwgMS4wKTtcXG4gIHJldHVybiBmcmVzbmVsRjMyKGYwLCBmOTAsIFZkb3RIKTtcXG59XFxuXFxuLy8gUm91Z2huZXNzIERlcGVuZGVudCBGcmVzbmVsXFxuLy8gaHR0cHM6Ly93d3cuamNndC5vcmcvcHVibGlzaGVkLzAwMDgvMDEvMDMvcGFwZXIucGRmXFxuZm4gZnJlc25lbFNjaGxpY2tSb3VnaG5lc3MoRjA6IHZlYzNmLCBjb3NUaGV0YTogZjMyLCByb3VnaG5lc3M6IGYzMikgLT4gdmVjM2ZcXG57XFxuICBsZXQgRnIgPSBtYXgodmVjM2YoMS4wIC0gcm91Z2huZXNzKSwgRjApIC0gRjA7XFxuICBsZXQga19TID0gRjAgKyBGciAqIHBvdygxLjAgLSBjb3NUaGV0YSwgNS4wKTtcXG4gIHJldHVybiBrX1M7XFxufVxcblxcbi8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjZGlmZnVzZS1icmRmXFxuZm4gQlJERl9sYW1iZXJ0aWFuKGFsYmVkbzogdmVjM2YsIEY6IHZlYzNmLCBzcGVjdWxhcldlaWdodDogZjMyKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiAodmVjM2YoMS4wKSAtIHNwZWN1bGFyV2VpZ2h0ICogRikgKiBhbGJlZG8gKiBSRUNJUFJPQ0FMX1BJO1xcbn1cXG5cXG5cXG4vLyBHR1ggTkRGXFxuZm4gZF9HR1goTkg6IGYzMiwgYWxwaGFSb3VnaG5lc3M6IGYzMikgLT4gZjMyIHtcXG4gIGxldCByb3VnaG5lc3NTcXIgPSBhbHBoYVJvdWdobmVzcyAqIGFscGhhUm91Z2huZXNzO1xcbiAgbGV0IGYgPSAocm91Z2huZXNzU3FyIC0gMS4wKSAqIE5IICogTkggKyAxLjA7XFxuICByZXR1cm4gcm91Z2huZXNzU3FyIC8gKE1fUEkgKiBmICogZik7XFxufVxcblxcbi8vIFRoZSBjb2RlIGZyb20gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lmh0bWwjbGlzdGluZ19hcHByb3hpbWF0ZWRzcGVjdWxhcnZcXG4vLyBUaGUgaWRlYSBpcyBmcm9tIFtIZWl0ejE0XSBFcmljIEhlaXR6LiAyMDE0LiBVbmRlcnN0YW5kaW5nIHRoZSBNYXNraW5nLVNoYWRvd2luZyBGdW5jdGlvbiBpbiBNaWNyb2ZhY2V0LUJhc2VkIEJSREZzLlxcbmZuIHZfR0dYQ29ycmVsYXRlZChOTDogZjMyLCBOVjogZjMyLCBhbHBoYVJvdWdobmVzczogZjMyKSAtPiBmMzIge1xcbiAgbGV0IGEyID0gYWxwaGFSb3VnaG5lc3MgKiBhbHBoYVJvdWdobmVzcztcXG4gIGxldCBHR1hWID0gTkwgKiBzcXJ0KE5WICogTlYgKiAoMS4wIC0gYTIpICsgYTIpO1xcbiAgbGV0IEdHWEwgPSBOViAqIHNxcnQoTkwgKiBOTCAqICgxLjAgLSBhMikgKyBhMik7XFxuICByZXR1cm4gMC41IC8gKEdHWFYgKyBHR1hMKTtcXG59XFxuXFxuZm4gQlJERl9zcGVjdWxhckdHWChOSDogZjMyLCBOTDogZjMyLCBOVjogZjMyLCBGOiB2ZWMzZiwgYWxwaGFSb3VnaG5lc3M6IGYzMiwgc3BlY3VsYXJXZWlnaHQ6IGYzMikgLT4gdmVjM2Yge1xcbiAgbGV0IEQgPSBkX0dHWChOSCwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgbGV0IFYgPSB2X0dHWENvcnJlbGF0ZWQoTkwsIE5WLCBhbHBoYVJvdWdobmVzcyk7XFxuICByZXR1cm4gdmVjM2YoRCkgKiB2ZWMzZihWKSAqIEYgKiBzcGVjdWxhcldlaWdodDtcXG59XFxuXFxuLy8gdGhpcyBpcyBmcm9tIGh0dHBzOi8vd3d3LnVucmVhbGVuZ2luZS5jb20vYmxvZy9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctb24tbW9iaWxlXFxuZm4gZW52QlJERkFwcHJveCggUm91Z2huZXNzOiBmMzIsIE5vVjogZjMyICkgLT4gdmVjMmYge1xcbiAgbGV0IGMwID0gdmVjNGYoLTEsIC0wLjAyNzUsIC0wLjU3MiwgMC4wMjIgKTtcXG4gIGxldCBjMSA9IHZlYzRmKDEsIDAuMDQyNSwgMS4wNCwgLTAuMDQgKTtcXG4gIGxldCByID0gUm91Z2huZXNzICogYzAgKyBjMTtcXG4gIGxldCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC05LjI4ICogTm9WICkgKSAqIHIueCArIHIueTtcXG4gIGxldCBBQiA9IHZlYzJmKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XFxuXFxuICByZXR1cm4gQUI7XFxufVxcblxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2NsZWFyY29hdCNsYXllcmluZ1xcbmZuIGNvYXRlZF9tYXRlcmlhbF9zKGJhc2U6IHZlYzNmLCBwZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsIGNsZWFyY29hdFJvdWdobmVzczogZjMyLCBjbGVhcmNvYXQ6IGYzMiwgVmRvdE5jOiBmMzIsIExkb3ROYzogZjMyLCBOZG90SGM6IGYzMikgLT4gdmVjM2Yge1xcbiAgbGV0IGNsZWFyY29hdEZyZXNuZWwgPSAwLjA0ICsgKDEuMCAtIDAuMDQpICogcG93KDEuMCAtIGFicyhWZG90TmMpLCA1LjApO1xcbiAgbGV0IGNsZWFyY29hdEFscGhhID0gY2xlYXJjb2F0Um91Z2huZXNzICogY2xlYXJjb2F0Um91Z2huZXNzO1xcbiAgbGV0IGFscGhhUm91Z2huZXNzID0gcGVyY2VwdHVhbFJvdWdobmVzcyAqIHBlcmNlcHR1YWxSb3VnaG5lc3M7XFxuICBsZXQgRCA9IGRfR0dYKE5kb3RIYywgY2xlYXJjb2F0QWxwaGEpO1xcbiAgbGV0IFYgPSB2X0dHWENvcnJlbGF0ZWQoTGRvdE5jLCBWZG90TmMsIGNsZWFyY29hdEFscGhhKTtcXG4gIGxldCBmX2NsZWFyY29hdCA9IGNsZWFyY29hdEZyZXNuZWwgKiBEICogVjtcXG5cXG4gIC8vIGJhc2UgPSAoZl9kaWZmdXNlICsgZl9zcGVjdWxhcikgaW4gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFpbi9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfY2xlYXJjb2F0I2xheWVyaW5nXFxuICByZXR1cm4gYmFzZSAqIHZlYzNmKDEuMCAtIGNsZWFyY29hdCAqIGNsZWFyY29hdEZyZXNuZWwpICsgdmVjM2YoZl9jbGVhcmNvYXQgKiBjbGVhcmNvYXQpO1xcbn1cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc190cmFuc21pc3Npb24jaW1wbGVtZW50YXRpb24tbm90ZXNcXG5mbiBzcGVjdWxhcl9idGRmKGFscGhhUm91Z2huZXNzOiBmMzIsIE5kb3RMOiBmMzIsIE5kb3RWOiBmMzIsIE5kb3RIdDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IFYgPSB2X0dHWENvcnJlbGF0ZWQoTmRvdEwsIE5kb3RWLCBhbHBoYVJvdWdobmVzcyk7XFxuICBsZXQgRCA9IGRfR0dYKE5kb3RIdCwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgcmV0dXJuIFYgKiBEO1xcbn1cXG5cXG5cXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuLy8gZ2xURiBLSFJfbWF0ZXJpYWxzX3ZvbHVtZVxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG5cXG4jaWZkZWYgUk5fVVNFX1ZPTFVNRVxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3ZvbHVtZS9SRUFETUUubWQjYXR0ZW51YXRpb25cXG5mbiB2b2x1bWVBdHRlbnVhdGlvbihhdHRlbnVhdGlvbkNvbG9yOiB2ZWMzZiwgYXR0ZW51YXRpb25EaXN0YW5jZTogZjMyLCBpbnRlbnNpdHk6IHZlYzNmLCB0cmFuc21pc3Npb25EaXN0YW5jZTogZjMyKSAtPiB2ZWMzZlxcbntcXG4gIGlmIChhdHRlbnVhdGlvbkRpc3RhbmNlID09IDAuMCkgeyAvLyBtZWFucyBJbmZpbml0ZSBkaXN0YW5jZVxcbiAgICByZXR1cm4gaW50ZW5zaXR5OyAvLyBObyBhdHRlbnVhdGlvblxcbiAgfSBlbHNlIHtcXG4gICAgbGV0IGF0dGVudWF0aW9uQ286IHZlYzNmID0gLWxvZyhhdHRlbnVhdGlvbkNvbG9yKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XFxuICAgIGxldCBhdHRlbnVhdGVkVHJhbnNtaXR0YW5jZTogdmVjM2YgPSBleHAoLWF0dGVudWF0aW9uQ28gKiB0cmFuc21pc3Npb25EaXN0YW5jZSk7XFxuICAgIHJldHVybiBpbnRlbnNpdHkgKiBhdHRlbnVhdGVkVHJhbnNtaXR0YW5jZTtcXG4gIH1cXG59XFxuI2VuZGlmXFxuXFxuXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbi8vIGdsVEYgS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5XFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbiNpZmRlZiBSTl9VU0VfQU5JU09UUk9QWVxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2FuaXNvdHJvcHlcXG5mbiBEX0dHWF9hbmlzb3Ryb3BpYyhOZG90SDogZjMyLCBUZG90SDogZjMyLCBCZG90SDogZjMyLCBhdDogZjMyLCBhYjogZjMyKSAtPiBmMzJcXG57XFxuICAgIGxldCBhMiA9IGF0ICogYWI7XFxuICAgIGxldCBmID0gdmVjM2YoYWIgKiBUZG90SCwgYXQgKiBCZG90SCwgYTIgKiBOZG90SCk7XFxuICAgIGxldCB3MiA9IGEyIC8gZG90KGYsIGYpO1xcbiAgICByZXR1cm4gYTIgKiB3MiAqIHcyIC8gTV9QSTtcXG59XFxuXFxuZm4gVl9HR1hfYW5pc290cm9waWMoTmRvdEw6IGYzMiwgTmRvdFY6IGYzMiwgQmRvdFY6IGYzMiwgVGRvdFY6IGYzMiwgVGRvdEw6IGYzMiwgQmRvdEw6IGYzMixcXG4gICAgYXQ6IGYzMiwgYWI6IGYzMikgLT4gZjMyXFxue1xcbiAgICBsZXQgR0dYViA9IE5kb3RMICogbGVuZ3RoKHZlYzMoYXQgKiBUZG90ViwgYWIgKiBCZG90ViwgTmRvdFYpKTtcXG4gICAgbGV0IEdHWEwgPSBOZG90ViAqIGxlbmd0aCh2ZWMzKGF0ICogVGRvdEwsIGFiICogQmRvdEwsIE5kb3RMKSk7XFxuICAgIGxldCB2ID0gMC41IC8gKEdHWFYgKyBHR1hMKTtcXG4gICAgcmV0dXJuIGNsYW1wKHYsIDAuMCwgMS4wKTtcXG59XFxuXFxuZm4gQlJERl9zcGVjdWxhckFuaXNvdHJvcGljR0dYKEY6IHZlYzNmLCBhbHBoYVJvdWdobmVzczogZjMyLFxcbiAgICBWZG90SDogZjMyLCBOZG90TDogZjMyLCBOZG90VjogZjMyLCBOZG90SDogZjMyLCBCZG90VjogZjMyLCBUZG90VjogZjMyLFxcbiAgICBUZG90TDogZjMyLCBCZG90TDogZjMyLCBUZG90SDogZjMyLCBCZG90SDogZjMyLCBhbmlzb3Ryb3B5OiBmMzIpIC0+IHZlYzNmXFxue1xcbiAgICBsZXQgYXQgPSBtaXgoYWxwaGFSb3VnaG5lc3MsIDEuMCwgYW5pc290cm9weSAqIGFuaXNvdHJvcHkpO1xcbiAgICBsZXQgYWIgPSBhbHBoYVJvdWdobmVzcztcXG5cXG4gICAgbGV0IFYgPSBWX0dHWF9hbmlzb3Ryb3BpYyhOZG90TCwgTmRvdFYsIEJkb3RWLCBUZG90ViwgVGRvdEwsIEJkb3RMLCBhdCwgYWIpO1xcbiAgICBsZXQgRCA9IERfR0dYX2FuaXNvdHJvcGljKE5kb3RILCBUZG90SCwgQmRvdEgsIGF0LCBhYik7XFxuXFxuICAgIHJldHVybiBGICogViAqIEQ7XFxufVxcbiNlbmRpZlxcblxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4vLyBnbFRGIEtIUl9tYXRlcmlhbHNfc2hlZW5cXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuXFxuI2lmZGVmIFJOX1VTRV9TSEVFTlxcbmZuIGRfQ2hhcmxpZShzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMiwgTm9IOiBmMzIpIC0+IGYzMiB7XFxuICAvLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcXFwiUHJvZHVjdGlvbiBGcmllbmRseSBNaWNyb2ZhY2V0IFNoZWVuIEJSREZcXFwiXFxuICBsZXQgYWxwaGFHID0gc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzICogc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzO1xcbiAgbGV0IGludkFscGhhICA9IDEuMCAvIGFscGhhRztcXG4gIGxldCBjb3MyaCA9IE5vSCAqIE5vSDtcXG4gIGxldCBzaW4yaCA9IDEuMCAtIGNvczJoO1xcbiAgcmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBNX1BJKTtcXG59XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFpbi9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfc2hlZW4jc2hlZW4tdmlzaWJpbGl0eVxcbmZuIHNoZWVuU2ltcGxlVmlzaWJpbGl0eShOZG90TDogZjMyLCBOZG90VjogZjMyKSAtPiBmMzIge1xcbiAgcmV0dXJuIDEuMCAvICg0LjAgKiAoTmRvdEwgKyBOZG90ViAtIE5kb3RMICogTmRvdFYpKTtcXG59XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFpbi9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfc2hlZW4jc2hlZW4tdmlzaWJpbGl0eVxcbmZuIGNoYXJsaWVMKHg6IGYzMiwgYWxwaGFHOiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgb25lTWludXNBbHBoYVNxID0gKDEuMCAtIGFscGhhRykgKiAoMS4wIC0gYWxwaGFHKTtcXG4gIGxldCBhID0gbWl4KDIxLjU0NzMsIDI1LjMyNDUsIG9uZU1pbnVzQWxwaGFTcSk7XFxuICBsZXQgYiA9IG1peCgzLjgyOTg3LCAzLjMyNDM1LCBvbmVNaW51c0FscGhhU3EpO1xcbiAgbGV0IGMgPSBtaXgoMC4xOTgyMywgMC4xNjgwMSwgb25lTWludXNBbHBoYVNxKTtcXG4gIGxldCBkID0gbWl4KC0xLjk3NzYwLCAtMS4yNzM5Mywgb25lTWludXNBbHBoYVNxKTtcXG4gIGxldCBlID0gbWl4KC00LjMyMDU0LCAtNC44NTk2Nywgb25lTWludXNBbHBoYVNxKTtcXG4gIHJldHVybiBhIC8gKDEuMCArIGIgKiBwb3coeCwgYykpICsgZCAqIHggKyBlO1xcbn1cXG5cXG5mbiBsYW1iZGFTaGVlbihjb3NUaGV0YTogZjMyLCBhbHBoYUc6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHNlbGVjdChleHAoMi4wICogY2hhcmxpZUwoMC41LCBhbHBoYUcpIC0gY2hhcmxpZUwoMS4wIC0gY29zVGhldGEsIGFscGhhRykpLCBleHAoY2hhcmxpZUwoY29zVGhldGEsIGFscGhhRykpLCBhYnMoY29zVGhldGEpIDwgMC41KTtcXG59XFxuXFxuZm4gc2hlZW5DaGFybGllVmlzaWJpbGl0eShOZG90TDogZjMyLCBOZG90VjogZjMyLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBhbHBoYUcgPSBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MgKiBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3M7XFxuICBsZXQgc2hlZW5WaXNpYmlsaXR5ID0gMS4wIC8gKCgxLjAgKyBsYW1iZGFTaGVlbihOZG90ViwgYWxwaGFHKSArIGxhbWJkYVNoZWVuKE5kb3RMLCBhbHBoYUcpKSAqICg0LjAgKiBOZG90ViAqIE5kb3RMKSk7XFxuICByZXR1cm4gc2hlZW5WaXNpYmlsaXR5O1xcbn1cXG5cXG5mbiBzaGVlbl9icmRmKHNoZWVuQ29sb3I6IHZlYzNmLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMiwgTmRvdEw6IGYzMiwgTmRvdFY6IGYzMiwgTmRvdEg6IGYzMikgLT4gdmVjM2Yge1xcbiAgbGV0IHNoZWVuRGlzdHJpYnV0aW9uID0gZF9DaGFybGllKHNoZWVuUGVyY2VwdHVhbFJvdWdobmVzcywgTmRvdEgpO1xcbiAgbGV0IHNoZWVuVmlzaWJpbGl0eSA9IHNoZWVuQ2hhcmxpZVZpc2liaWxpdHkoTmRvdEwsIE5kb3RWLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MpO1xcbiAgcmV0dXJuIHNoZWVuQ29sb3IgKiBzaGVlbkRpc3RyaWJ1dGlvbiAqIHNoZWVuVmlzaWJpbGl0eTtcXG59XFxuI2VuZGlmIC8vIFJOX1VTRV9TSEVFTlxcblxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4vLyBnbFRGIEtIUl9tYXRlcmlhbHNfaXJpcmRlc2NlbmNlXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcblxcbiNpZmRlZiBSTl9VU0VfSVJJREVTQ0VOQ0VcXG4vLyBYWVogdG8gUkVDNzA5KHNSR0IpIGNvbnZlcnNpb24gbWF0cml4XFxuY29uc3QgWFlaX1RPX1JFQzcwOSA9IG1hdDN4MzxmMzI+KFxcbiAgICAgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAgMC4wNTU2NDM0LFxcbiAgICAtMS41MzcxMzg1LCAgMS44NzYwMTA4LCAtMC4yMDQwMjU5LFxcbiAgICAtMC40OTg1MzE0LCAgMC4wNDE1NTYwLCAgMS4wNTcyMjUyXFxuKTtcXG5cXG5mbiBmcmVzbmVsU2NobGlja1JvdWdobmVzc1dpdGhJcmlkZXNjZW5jZShcXG4gIEYwOiB2ZWMzZiwgY29zVGhldGE6IGYzMiwgcm91Z2huZXNzOiBmMzIsXFxuICBpcmlkZXNjZW5jZUZyZXNuZWw6IHZlYzNmLCBpcmlkZXNjZW5jZTogZjMyXFxuICApIC0+IHZlYzNmXFxue1xcbiAgbGV0IEZyID0gbWF4KHZlYzNmKDEuMCAtIHJvdWdobmVzcyksIEYwKSAtIEYwO1xcbiAgbGV0IGtfUyA9IG1peChGMCArIEZyICogcG93KDEuMCAtIGNvc1RoZXRhLCA1LjApLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlKTtcXG4gIHJldHVybiBrX1M7XFxufVxcblxcbi8vIEFzc3VtZSBhaXIgaW50ZXJmYWNlIGZvciB0b3BcXG5mbiBGcmVzbmVsMFRvSW9yKEYwOiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgICBsZXQgc3FydEYwID0gc3FydChGMCk7XFxuICAgIHJldHVybiAodmVjMygxLjApICsgc3FydEYwKSAvICh2ZWMzKDEuMCkgLSBzcXJ0RjApO1xcbn1cXG5cXG4vLyBDb252ZXJzaW9uIGZyb20gSU9SIHRvIEYwXFxuLy8gaW9yIGlzIGEgdmFsdWUgYmV0d2VlbiAxLjAgYW5kIDMuMC4gMS4wIGlzIGFpciBpbnRlcmZhY2VcXG5mbiBJb3JUb0ZyZXNuZWwwVmVjM2YodHJhbnNtaXR0ZWRJb3I6IHZlYzNmLCBpbmNpZGVudElvcjogZjMyKSAtPiB2ZWMzZiB7XFxuICAgIHJldHVybiBzcVZlYzNmKCh0cmFuc21pdHRlZElvciAtIHZlYzNmKGluY2lkZW50SW9yKSkgLyAodHJhbnNtaXR0ZWRJb3IgKyB2ZWMzKGluY2lkZW50SW9yKSkpO1xcbn1cXG5mbiBJb3JUb0ZyZXNuZWwwRjMyKHRyYW5zbWl0dGVkSW9yOiBmMzIsIGluY2lkZW50SW9yOiBmMzIpIC0+IGYzMiB7XFxuICAgIHJldHVybiBzcUYzMigodHJhbnNtaXR0ZWRJb3IgLSBpbmNpZGVudElvcikgLyAodHJhbnNtaXR0ZWRJb3IgKyBpbmNpZGVudElvcikpO1xcbn1cXG5cXG4vKipcXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZSNhbmFseXRpYy1zcGVjdHJhbC1pbnRlZ3JhdGlvblxcbiAqL1xcbmZuIGV2YWxTZW5zaXRpdml0eShPUEQ6IGYzMiwgc2hpZnQ6IHZlYzNmKSAtPiB2ZWMzZiB7XFxuICAgIGxldCBwaGFzZSA9IDIuMCAqIE1fUEkgKiBPUEQgKiAxLjBlLTk7XFxuICAgIGxldCB2YWwgPSB2ZWMzZig1LjQ4NTZlLTEzLCA0LjQyMDFlLTEzLCA1LjI0ODFlLTEzKTtcXG4gICAgbGV0IHBvcyA9IHZlYzNmKDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYpO1xcbiAgICBsZXQgdmFyXyA9IHZlYzNmKDQuMzI3OGUrMDksIDkuMzA0NmUrMDksIDYuNjEyMWUrMDkpO1xcblxcbiAgICB2YXIgeHl6ID0gdmFsICogc3FydCgyLjAgKiBNX1BJICogdmFyXykgKiBjb3MocG9zICogcGhhc2UgKyBzaGlmdCkgKiBleHAoLShwaGFzZSAqIHBoYXNlKSAqIHZhcl8pO1xcbiAgICB4eXoueCArPSA5Ljc0NzBlLTE0ICogc3FydCgyLjAgKiBNX1BJICogNC41MjgyZSswOSkgKiBjb3MoMi4yMzk5ZSswNiAqIHBoYXNlICsgc2hpZnRbMF0pICogZXhwKC00LjUyODJlKzA5ICogKHBoYXNlICogcGhhc2UpKTtcXG4gICAgeHl6IC89IDEuMDY4NWUtNztcXG5cXG4gICAgbGV0IHJnYiA9IFhZWl9UT19SRUM3MDkgKiB4eXo7XFxuICAgIHJldHVybiByZ2I7XFxufVxcblxcbi8qKlxcbiAqIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlI2lyaWRlc2NlbmNlLWZyZXNuZWxcXG4gKi9cXG5mbiBjYWxjSXJpZGVzY2VuY2Uob3V0c2lkZUlvcjogZjMyLCBldGEyOiBmMzIsIGNvc1RoZXRhMTogZjMyLCB0aGluRmlsbVRoaWNrbmVzczogZjMyLCBiYXNlRjA6IHZlYzNmKSAtPiB2ZWMzZiB7XFxuXFxuXFxuICAvLyBpcmlkZXNjZW5jZUlvciBpcyB0aGUgaW5kZXggb2YgcmVmcmFjdGlvbiBvZiB0aGUgdGhpbi1maWxtIGxheWVyXFxuICAvLyBGb3JjZSBpcmlkZXNjZW5jZUlvciAtPiBvdXRzaWRlSU9SIHdoZW4gdGhpbkZpbG1UaGlja25lc3MgLT4gMC4wXFxuICBsZXQgaXJpZGVzY2VuY2VJb3IgPSBtaXgob3V0c2lkZUlvciwgZXRhMiwgc21vb3Roc3RlcCgwLjAsIDAuMDMsIHRoaW5GaWxtVGhpY2tuZXNzKSk7XFxuXFxuICAvLyBUbyBjYWxjdWxhdGUgdGhlIHJlZmxlY3RhbmNlcyBSMTIgYW5kIFIyMyBhdCB0aGUgdmlld2luZyBhbmdsZXMgKGFuZ2xlIGhpdHRpbmcgdGhlIHRoaW4tZmlsbSBsYXllcilcXG4gIC8vIGFuZCAoYW5nbGUgYWZ0ZXIgcmVmcmFjdGlvbiBpbiB0aGUgdGhpbi1maWxtKSBTY2hsaWNrIEZyZXNuZWwgaXMgYWdhaW4gdXNlZC5cXG4gIC8vIFRoaXMgYXBwcm94aW1hdGlvbiBhbGxvd3MgdG8gZWxpbWluYXRlIHRoZSBzcGxpdCBpbnRvIFMgYW5kIFAgcG9sYXJpemF0aW9uIGZvciB0aGUgZXhhY3QgRnJlc25lbCBlcXVhdGlvbnMuXFxuICAvLyBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBTbmVsbCdzIGxhdyAod2l0aCAgYmVpbmcgb3V0c2lkZUlvciBhbmQgYmVpbmcgaXJpZGVzY2VuY2VJb3IpOlxcbiAgbGV0IHNpblRoZXRhMlNxID0gc3FGMzIob3V0c2lkZUlvciAvIGlyaWRlc2NlbmNlSW9yKSAqICgxLjAgLSBzcUYzMihjb3NUaGV0YTEpKTtcXG4gIGxldCBjb3NUaGV0YTJTcSA9IDEuMCAtIHNpblRoZXRhMlNxO1xcblxcbiAgLy8gSGFuZGxlIHRvdGFsIGludGVybmFsIHJlZmxlY3Rpb25cXG4gIGlmIChjb3NUaGV0YTJTcSA8IDAuMCkge1xcbiAgICAgIHJldHVybiB2ZWMzZigxLjApO1xcbiAgfVxcblxcbiAgbGV0IGNvc1RoZXRhMiA9IHNxcnQoY29zVGhldGEyU3EpO1xcblxcbiAgLy8vIE1hdGVyaWFsIEludGVyZmFjZXNcXG4gIC8vIFRoZSBpcmlkZXNjZW5jZSBtb2RlbCBkZWZpbmVkIGJ5IEJlbGNvdXIvQmFybGEgbW9kZWxzIHR3byBtYXRlcmlhbCBpbnRlcmZhY2VzXFxuICAvLyAtIG9uZSBmcm9tIHRoZSBvdXRzaWRlIHRvIHRoZSB0aGluLWZpbG0gbGF5ZXJcXG4gIC8vIGFuZCBhbm90aGVyIG9uZSBmcm9tIHRoZSB0aGluLWZpbG0gdG8gdGhlIGJhc2UgbWF0ZXJpYWwuIFRoZXNlIHR3byBpbnRlcmZhY2VzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6XFxuXFxuICAvLyBGaXJzdCBpbnRlcmZhY2UgKGZyb20gdGhlIG91dHNpZGUgdG8gdGhlIHRoaW4tZmlsbSBsYXllcilcXG4gIGxldCBSMCA9IElvclRvRnJlc25lbDBGMzIoaXJpZGVzY2VuY2VJb3IsIG91dHNpZGVJb3IpO1xcbiAgbGV0IFIxMiA9IGZyZXNuZWwyRjMyKFIwLCBjb3NUaGV0YTEpO1xcbiAgbGV0IFIyMSA9IFIxMjtcXG4gIGxldCBUMTIxID0gMS4wIC0gUjEyO1xcblxcbiAgLy8gU2Vjb25kIGludGVyZmFjZSAoZnJvbSB0aGUgdGhpbi1maWxtIHRvIHRoZSBiYXNlIG1hdGVyaWFsKVxcbiAgbGV0IGJhc2VJb3IgPSBGcmVzbmVsMFRvSW9yKGJhc2VGMCArIDAuMDAwMSk7IC8vIGd1YXJkIGFnYWluc3QgMS4wXFxuICBsZXQgUjEgPSBJb3JUb0ZyZXNuZWwwVmVjM2YoYmFzZUlvciwgaXJpZGVzY2VuY2VJb3IpO1xcbiAgbGV0IFIyMyA9IGZyZXNuZWwyKFIxLCBjb3NUaGV0YTIpO1xcblxcbiAgLy8gcGhpMTIgYW5kIHBoaTIzIGRlZmluZSB0aGUgYmFzZSBwaGFzZXMgcGVyIGludGVyZmFjZSBhbmQgYXJlIGFwcHJveGltYXRlZCB3aXRoIDAuMFxcbiAgLy8gaWYgdGhlIElPUiBvZiB0aGUgaGl0IG1hdGVyaWFsIChpcmlkZXNjZW5jZUlvciBvciBiYXNlSW9yKSBpcyBoaWdoZXJcXG4gIC8vIHRoYW4gdGhlIElPUiBvZiB0aGUgcHJldmlvdXMgbWF0ZXJpYWwgKG91dHNpZGVJb3Igb3IgaXJpZGVzY2VuY2VJb3IpIGFuZCDPgCBvdGhlcndpc2UuXFxuICAvLyBBbHNvIGhlcmUsIHBvbGFyaXphdGlvbiBpcyBpZ25vcmVkLiAgZmxvYXQgcGhpMTIgPSAwLjA7XFxuXFxuICAvLyBGaXJzdCBpbnRlcmZhY2UgKGZyb20gdGhlIG91dHNpZGUgdG8gdGhlIHRoaW4tZmlsbSBsYXllcilcXG4gIHZhciBwaGkxMiA9IDAuMDtcXG4gIGlmIChpcmlkZXNjZW5jZUlvciA8IG91dHNpZGVJb3IpIHsgcGhpMTIgPSBNX1BJOyB9XFxuICBsZXQgcGhpMjEgPSBNX1BJIC0gcGhpMTI7XFxuXFxuICAvLyBTZWNvbmQgaW50ZXJmYWNlIChmcm9tIHRoZSB0aGluLWZpbG0gdG8gdGhlIGJhc2UgbWF0ZXJpYWwpXFxuICB2YXIgcGhpMjMgPSB2ZWMzZigwLjApO1xcbiAgaWYgKGJhc2VJb3JbMF0gPCBpcmlkZXNjZW5jZUlvcikgeyBwaGkyM1swXSA9IE1fUEk7IH1cXG4gIGlmIChiYXNlSW9yWzFdIDwgaXJpZGVzY2VuY2VJb3IpIHsgcGhpMjNbMV0gPSBNX1BJOyB9XFxuICBpZiAoYmFzZUlvclsyXSA8IGlyaWRlc2NlbmNlSW9yKSB7IHBoaTIzWzJdID0gTV9QSTsgfVxcblxcbiAgLy8gT1BEIChvcHRpY2FsIHBhdGggZGlmZmVyZW5jZSlcXG4gIGxldCBPUEQgPSAyLjAgKiBpcmlkZXNjZW5jZUlvciAqIHRoaW5GaWxtVGhpY2tuZXNzICogY29zVGhldGEyO1xcbiAgLy8gUGhhc2Ugc2hpZnRcXG4gIGxldCBwaGkgPSB2ZWMzZihwaGkyMSkgKyBwaGkyMztcXG5cXG4gIC8vIENvbXBvdW5kIHRlcm1zXFxuICBsZXQgUjEyMyA9IGNsYW1wKFIxMiAqIFIyMywgdmVjM2YoMWUtNSksIHZlYzNmKDAuOTk5OSkpO1xcbiAgbGV0IHIxMjMgPSBzcXJ0KFIxMjMpO1xcbiAgbGV0IFJzID0gKFQxMjEgKiBUMTIxKSAqIFIyMyAvICh2ZWMzZigxLjApIC0gUjEyMyk7XFxuXFxuICAvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID0gMCAoREMgdGVybSBhbXBsaXR1ZGUpXFxuICBsZXQgQzAgPSBSMTIgKyBScztcXG4gIHZhciBJID0gQzA7XFxuXFxuICAvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID4gMCAocGFpcnMgb2YgZGlyYWNzKVxcbiAgdmFyIENtID0gUnMgLSBUMTIxO1xcbiAgZm9yICh2YXIgbSA9IDE7IG0gPD0gMjsgbSsrKVxcbiAge1xcbiAgICAgIENtICo9IHIxMjM7XFxuICAgICAgbGV0IFNtID0gMi4wICogZXZhbFNlbnNpdGl2aXR5KGYzMihtKSAqIE9QRCwgZjMyKG0pICogcGhpKTtcXG4gICAgICBJICs9IENtICogU207XFxuICB9XFxuXFxuICBsZXQgRl9pcmlkZXNjZW5jZSA9IG1heChJLCB2ZWMzZigwLjApKTtcXG5cXG4gIHJldHVybiBGX2lyaWRlc2NlbmNlO1xcbn1cXG5cXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMCNhY2tub3dsZWRnbWVudHMgQXBwZW5kaXhCXFxuZm4gQlJERl9sYW1iZXJ0aWFuSXJpZGVzY2VuY2UoZjA6IHZlYzNmLCBmOTA6IHZlYzNmLCBpcmlkZXNjZW5jZUZyZXNuZWw6IHZlYzNmLCBpcmlkZXNjZW5jZUZhY3RvcjogZjMyLCBkaWZmdXNlQ29sb3I6IHZlYzNmLCBzcGVjdWxhcldlaWdodDogZjMyLCBWZG90SDogZjMyKSAtPiB2ZWMzZlxcbntcXG4gICAgbGV0IGlyaWRlc2NlbmNlRnJlc25lbE1heCA9IHZlYzNmKG1heChtYXgoaXJpZGVzY2VuY2VGcmVzbmVsLnIsIGlyaWRlc2NlbmNlRnJlc25lbC5nKSwgaXJpZGVzY2VuY2VGcmVzbmVsLmIpKTtcXG5cXG4gICAgbGV0IHNjaGxpY2tGcmVzbmVsID0gU2NobGlja190b19GMF9GOTAoZjAsIGY5MCwgVmRvdEgpO1xcblxcbiAgICBsZXQgRiA9IG1peChzY2hsaWNrRnJlc25lbCwgaXJpZGVzY2VuY2VGcmVzbmVsTWF4LCBpcmlkZXNjZW5jZUZhY3Rvcik7XFxuXFxuICAgIC8vIHNlZSBodHRwczovL3NlYmxhZ2FyZGUud29yZHByZXNzLmNvbS8yMDEyLzAxLzA4L3BpLW9yLW5vdC10by1waS1pbi1nYW1lLWxpZ2h0aW5nLWVxdWF0aW9uL1xcbiAgICByZXR1cm4gKDEuMCAtIHNwZWN1bGFyV2VpZ2h0ICogRikgKiAoZGlmZnVzZUNvbG9yIC8gTV9QSSk7XFxufVxcblxcbmZuIEJSREZfc3BlY3VsYXJHR1hJcmlkZXNjZW5jZShmMDogdmVjM2YsIGY5MDogdmVjM2YsIGlyaWRlc2NlbmNlRnJlc25lbDogdmVjM2YsIGFscGhhUm91Z2huZXNzOiBmMzIsIGlyaWRlc2NlbmNlRmFjdG9yOiBmMzIsIHNwZWN1bGFyV2VpZ2h0OiBmMzIsIFZkb3RIOiBmMzIsIE5kb3RMOiBmMzIsIE5kb3RWOiBmMzIsIE5kb3RIOiBmMzIpIC0+IHZlYzNmXFxue1xcbiAgICBsZXQgRiA9IG1peChTY2hsaWNrX3RvX0YwX0Y5MChmMCwgZjkwLCBWZG90SCksIGlyaWRlc2NlbmNlRnJlc25lbCwgaXJpZGVzY2VuY2VGYWN0b3IpO1xcbiAgICBsZXQgVmlzID0gdl9HR1hDb3JyZWxhdGVkKE5kb3RMLCBOZG90ViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgICBsZXQgRCA9IGRfR0dYKE5kb3RILCBhbHBoYVJvdWdobmVzcyk7XFxuXFxuICAgIHJldHVybiBzcGVjdWxhcldlaWdodCAqIEYgKiBWaXMgKiBEO1xcbn1cXG5cXG4jZW5kaWYgLy8gUk5fVVNFX0lSSURFU0NFTkNFXFxuXFxuXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbi8vIGxpZ2h0aW5nIHdpdGggYSBwdW5jdHVhbCBsaWdodFxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG5mbiBsaWdodGluZ1dpdGhQdW5jdHVhbExpZ2h0KFxcbiAgbGlnaHQ6IExpZ2h0LFxcbiAgbm9ybWFsX2luV29ybGQ6IHZlYzNmLFxcbiAgdmlld0RpcmVjdGlvbjogdmVjM2YsXFxuICBOZG90VjogZjMyLFxcbiAgYWxiZWRvOiB2ZWMzZixcXG4gIHBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMixcXG4gIEYwOiB2ZWMzZixcXG4gIEY5MDogdmVjM2YsXFxuICB0cmFuc21pc3Npb246IGYzMixcXG4gIGlvcjogZjMyLFxcbiAgY2xlYXJjb2F0OiBmMzIsXFxuICBjbGVhcmNvYXRSb3VnaG5lc3M6IGYzMixcXG4gIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkOiB2ZWMzZixcXG4gIFZkb3ROYzogZjMyLFxcbiAgYXR0ZW51YXRpb25Db2xvcjogdmVjM2YsXFxuICBhdHRlbnVhdGlvbkRpc3RhbmNlOiBmMzIsXFxuICBhbmlzb3Ryb3B5OiBmMzIsXFxuICBhbmlzb3Ryb3BpY1Q6IHZlYzNmLFxcbiAgYW5pc290cm9waWNCOiB2ZWMzZixcXG4gIEJkb3RWOiBmMzIsXFxuICBUZG90VjogZjMyLFxcbiAgc2hlZW5Db2xvcjogdmVjM2YsXFxuICBzaGVlblJvdWdobmVzczogZjMyLFxcbiAgYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFY6IGYzMixcXG4gIGlyaWRlc2NlbmNlRmFjdG9yOiBmMzIsXFxuICBpcmlkZXNjZW5jZUZyZXNuZWw6IHZlYzNmLFxcbiAgc3BlY3VsYXJXZWlnaHQ6IGYzMixcXG4gICkgLT4gdmVjM2ZcXG57XFxuICBsZXQgYWxwaGFSb3VnaG5lc3MgPSBwZXJjZXB0dWFsUm91Z2huZXNzICogcGVyY2VwdHVhbFJvdWdobmVzcztcXG5cXG4gIC8vIEZyZXNuZWxcXG4gIGxldCBoYWxmVmVjdG9yID0gbm9ybWFsaXplKGxpZ2h0LmRpcmVjdGlvbiArIHZpZXdEaXJlY3Rpb24pO1xcbiAgbGV0IFZkb3RIID0gZG90KHZpZXdEaXJlY3Rpb24sIGhhbGZWZWN0b3IpO1xcbiAgbGV0IEYgPSBmcmVzbmVsKEYwLCBGOTAsIFZkb3RIKTtcXG5cXG4gIGxldCBOZG90TCA9IGNsYW1wKGRvdChub3JtYWxfaW5Xb3JsZCwgbGlnaHQuZGlyZWN0aW9uKSwgRXBzaWxvbiwgMS4wKTtcXG5cXG4gIC8vIERpZmZ1c2VcXG4jaWZkZWYgUk5fVVNFX0lSSURFU0NFTkNFXFxuICBsZXQgZGlmZnVzZUJyZGYgPSBCUkRGX2xhbWJlcnRpYW5JcmlkZXNjZW5jZShGMCwgRjkwLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlRmFjdG9yLCBhbGJlZG8sIHNwZWN1bGFyV2VpZ2h0LCBWZG90SCk7XFxuI2Vsc2VcXG4gIGxldCBkaWZmdXNlQnJkZiA9IEJSREZfbGFtYmVydGlhbihhbGJlZG8sIEYsIHNwZWN1bGFyV2VpZ2h0KTtcXG4jZW5kaWZcXG4gIGxldCBwdXJlRGlmZnVzZSA9IGRpZmZ1c2VCcmRmICogdmVjM2YoTmRvdEwpICogbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eTtcXG5cXG4jaWZkZWYgUk5fVVNFX1RSQU5TTUlTU0lPTlxcbiAgbGV0IHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KC12aWV3RGlyZWN0aW9uLCBub3JtYWxfaW5Xb3JsZCwgMS4wIC8gaW9yKTtcXG4gIHZhciB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZTogTGlnaHQgPSBsaWdodDtcXG4gIHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlLnBvaW50VG9MaWdodCAtPSByZWZyYWN0aW9uVmVjdG9yO1xcbiAgbGV0IHRyYW5zbWl0dGVkTGlnaHREaXJlY3Rpb25Gcm9tVW5kZXJTdXJmYWNlID0gbm9ybWFsaXplKHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlLnBvaW50VG9MaWdodCk7XFxuICB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5kaXJlY3Rpb24gPSB0cmFuc21pdHRlZExpZ2h0RGlyZWN0aW9uRnJvbVVuZGVyU3VyZmFjZTtcXG5cXG4gIGxldCBIdCA9IG5vcm1hbGl6ZSh2aWV3RGlyZWN0aW9uICsgdHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2UuZGlyZWN0aW9uKTtcXG4gIGxldCBOZG90SHQgPSBzYXR1cmF0ZUVwc2lsb25Ub09uZShkb3Qobm9ybWFsX2luV29ybGQsIEh0KSk7XFxuICBsZXQgTmRvdEx0ID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KG5vcm1hbF9pbldvcmxkLCB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5kaXJlY3Rpb24pKTtcXG5cXG4gIHZhciB0cmFuc21pdHRlZENvbnRyaWIgPSAodmVjM2YoMS4wKSAtIEYpICogc3BlY3VsYXJfYnRkZihhbHBoYVJvdWdobmVzcywgTmRvdEx0LCBOZG90ViwgTmRvdEh0KSAqIGFsYmVkbyAqIHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlLmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuXFxuI2lmZGVmIFJOX1VTRV9WT0xVTUVcXG4gIHRyYW5zbWl0dGVkQ29udHJpYiA9IHZvbHVtZUF0dGVudWF0aW9uKGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UsIHRyYW5zbWl0dGVkQ29udHJpYiwgbGVuZ3RoKHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlLnBvaW50VG9MaWdodCkpO1xcbiNlbmRpZiAvLyBSTl9VU0VfVk9MVU1FXFxuXFxuICBsZXQgZGlmZnVzZUNvbnRyaWIgPSBtaXgocHVyZURpZmZ1c2UsIHZlYzNmKHRyYW5zbWl0dGVkQ29udHJpYiksIHRyYW5zbWlzc2lvbik7XFxuI2Vsc2VcXG4gIGxldCBkaWZmdXNlQ29udHJpYiA9IHB1cmVEaWZmdXNlO1xcbiNlbmRpZiAvLyBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuXFxuICAvLyBTcGVjdWxhclxcbiAgbGV0IE5kb3RIID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KG5vcm1hbF9pbldvcmxkLCBoYWxmVmVjdG9yKSk7XFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9JUklERVNDRU5DRVxcbiAgbGV0IHNwZWN1bGFyQ29udHJpYiA9IEJSREZfc3BlY3VsYXJHR1hJcmlkZXNjZW5jZShGMCwgRjkwLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGFscGhhUm91Z2huZXNzLCBpcmlkZXNjZW5jZUZhY3Rvciwgc3BlY3VsYXJXZWlnaHQsIFZkb3RILCBOZG90TCwgTmRvdFYsIE5kb3RIKSAqIHZlYzNmKE5kb3RMKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuI2VsaWYgZGVmaW5lZChSTl9VU0VfQU5JU09UUk9QWSlcXG4gIGxldCBUZG90TCA9IGRvdChhbmlzb3Ryb3BpY1QsIGxpZ2h0LmRpcmVjdGlvbik7XFxuICBsZXQgQmRvdEwgPSBkb3QoYW5pc290cm9waWNCLCBsaWdodC5kaXJlY3Rpb24pO1xcbiAgbGV0IFRkb3RIID0gZG90KGFuaXNvdHJvcGljVCwgaGFsZlZlY3Rvcik7XFxuICBsZXQgQmRvdEggPSBkb3QoYW5pc290cm9waWNCLCBoYWxmVmVjdG9yKTtcXG4gIGxldCBzcGVjdWxhckNvbnRyaWIgPSBCUkRGX3NwZWN1bGFyQW5pc290cm9waWNHR1goRiwgYWxwaGFSb3VnaG5lc3MsIFZkb3RILCBOZG90TCwgTmRvdFYsIE5kb3RILCBCZG90ViwgVGRvdFYsIFRkb3RMLCBCZG90TCwgVGRvdEgsIEJkb3RILCBhbmlzb3Ryb3B5KSAqIHZlYzNmKE5kb3RMKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuI2Vsc2VcXG4gIGxldCBzcGVjdWxhckNvbnRyaWIgPSBCUkRGX3NwZWN1bGFyR0dYKE5kb3RILCBOZG90TCwgTmRvdFYsIEYsIGFscGhhUm91Z2huZXNzLCBzcGVjdWxhcldlaWdodCkgKiB2ZWMzZihOZG90TCkgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiNlbmRpZlxcblxcbiAgLy8gQmFzZSBMYXllclxcbiAgbGV0IGJhc2VMYXllciA9IGRpZmZ1c2VDb250cmliICsgc3BlY3VsYXJDb250cmliO1xcblxcbiNpZmRlZiBSTl9VU0VfU0hFRU5cXG4gIC8vIFNoZWVuXFxuICBsZXQgc2hlZW5Db250cmliID0gc2hlZW5fYnJkZihzaGVlbkNvbG9yLCBzaGVlblJvdWdobmVzcywgTmRvdEwsIE5kb3RWLCBOZG90SCkgKiBOZG90TCAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuICBsZXQgYWxiZWRvU2hlZW5TY2FsaW5nID0gbWluKFxcbiAgICBhbGJlZG9TaGVlblNjYWxpbmdOZG90VixcXG4gICAgMS4wIC0gbWF4MyhzaGVlbkNvbG9yKSAqIHRleHR1cmVTYW1wbGUoc2hlZW5MdXRUZXh0dXJlLCBzaGVlbkx1dFNhbXBsZXIsIHZlYzIoTmRvdEwsIHNoZWVuUm91Z2huZXNzKSkucik7XFxuICBsZXQgY29sb3IgPSBzaGVlbkNvbnRyaWIgKyBiYXNlTGF5ZXIgKiBhbGJlZG9TaGVlblNjYWxpbmc7XFxuI2Vsc2VcXG4gIGxldCBjb2xvciA9IGJhc2VMYXllcjtcXG4gIGxldCBhbGJlZG9TaGVlblNjYWxpbmcgPSAxLjA7XFxuI2VuZGlmIC8vIFJOX1VTRV9TSEVFTlxcblxcbiNpZmRlZiBSTl9VU0VfQ0xFQVJDT0FUXFxuICAvLyBDbGVhciBDb2F0IExheWVyXFxuICBsZXQgTmRvdEhjID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLCBoYWxmVmVjdG9yKSk7XFxuICBsZXQgTGRvdE5jID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KGxpZ2h0LmRpcmVjdGlvbiwgY2xlYXJjb2F0Tm9ybWFsX2luV29ybGQpKTtcXG4gIGxldCBjb2F0ZWQgPSBjb2F0ZWRfbWF0ZXJpYWxfcyhjb2xvciwgcGVyY2VwdHVhbFJvdWdobmVzcyxcXG4gICAgY2xlYXJjb2F0Um91Z2huZXNzLCBjbGVhcmNvYXQsIFZkb3ROYywgTGRvdE5jLCBOZG90SGMpO1xcbiAgbGV0IGZpbmFsQ29sb3IgPSBjb2F0ZWQ7XFxuI2Vsc2VcXG4gIGxldCBmaW5hbENvbG9yID0gY29sb3I7XFxuI2VuZGlmIC8vIFJOX1VTRV9DTEVBUkNPQVRcXG5cXG4gIHJldHVybiBmaW5hbENvbG9yO1xcbn1cXG5cXG5mbiBJc290cm9waWNOREZGaWx0ZXJpbmcobm9ybWFsOiB2ZWMzZiwgcm91Z2huZXNzMjogZjMyKSAtPiBmMzIge1xcbiAgbGV0IFNJR01BMiA9IDAuMTU5MTU0OTQ7XFxuICBsZXQgS0FQUEEgPSAwLjE4O1xcbiAgbGV0IGRuZHUgID0gZHBkeChub3JtYWwpO1xcbiAgbGV0IGRuZHYgPSBkcGR5KG5vcm1hbCk7XFxuICBsZXQga2VybmVsUm91Z2huZXNzMiA9IFNJR01BMiAqIChkb3QoZG5kdSwgZG5kdSkgKyBkb3QoZG5kdiwgZG5kdikpO1xcbiAgbGV0IGNsYW1wZWRLZXJuZWxSb3VnaG5lc3MyID0gbWluKGtlcm5lbFJvdWdobmVzczIsIEtBUFBBKTtcXG4gIGxldCBmaWx0ZXJlZFJvdWdobmVzczIgPSBzYXR1cmF0ZShyb3VnaG5lc3MyICsgY2xhbXBlZEtlcm5lbFJvdWdobmVzczIpO1xcbiAgcmV0dXJuIGZpbHRlcmVkUm91Z2huZXNzMjtcXG59XFxuXFxuXFxuLy8gI3BhcmFtIHNoYWRpbmdNb2RlbDogdTMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBhbHBoYUN1dG9mZjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MC4wMVxcbi8vICNwYXJhbSBzaGluaW5lc3M6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTVcXG4vLyAjcGFyYW0gZGlmZnVzZUNvbG9yRmFjdG9yOiB2ZWM0PGYzMj47IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDEsMSlcXG5AZ3JvdXAoMSkgQGJpbmRpbmcoMCkgdmFyIGRpZmZ1c2VDb2xvclRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPXdoaXRlXFxuQGdyb3VwKDIpIEBiaW5kaW5nKDApIHZhciBkaWZmdXNlQ29sb3JTYW1wbGVyOiBzYW1wbGVyO1xcbkBncm91cCgxKSBAYmluZGluZygxKSB2YXIgbm9ybWFsVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9Ymx1ZVxcbkBncm91cCgyKSBAYmluZGluZygxKSB2YXIgbm9ybWFsU2FtcGxlcjogc2FtcGxlcjtcXG4vLyAjcGFyYW0gZGlmZnVzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybTogdmVjNDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9KDEsMSwwLDApXFxuLy8gI3BhcmFtIGRpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbkBncm91cCgxKSBAYmluZGluZygyKSB2YXIgZGVwdGhUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47IC8vIGluaXRpYWxWYWx1ZT13aGl0ZVxcbkBncm91cCgyKSBAYmluZGluZygyKSB2YXIgZGVwdGhTYW1wbGVyOiBzYW1wbGVyO1xcblxcbkBmcmFnbWVudFxcbmZuIG1haW4gKFxcbiAgaW5wdXQ6IFZlcnRleE91dHB1dCxcXG4gIEBidWlsdGluKGZyb250X2ZhY2luZykgaXNGcm9udDogYm9vbCxcXG4pIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xcblxcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIC8vIE5vcm1hbFxcbiAgbGV0IG5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGlucHV0Lm5vcm1hbF9pbldvcmxkKTtcXG5cXG4gIGxldCBkaWZmdXNlQ29sb3JGYWN0b3IgPSBnZXRfZGlmZnVzZUNvbG9yRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIC8vIGRpZmZ1c2VDb2xvciAoQ29uc2lkZXJlZCB0byBiZSBwcmVtdWx0aXBsaWVkIGFscGhhKVxcbiAgdmFyIGRpZmZ1c2VDb2xvciA9IHZlYzNmKDEuMCwgMS4wLCAxLjApO1xcbiAgdmFyIGFscGhhID0gMS4wO1xcbiNpZmRlZiBSTl9VU0VfQ09MT1JfMFxcbiAgZGlmZnVzZUNvbG9yID0gaW5wdXQuY29sb3JfMC5yZ2I7XFxuICBhbHBoYSA9IGlucHV0LmNvbG9yXzAuYTtcXG4jZW5kaWZcXG4gIGRpZmZ1c2VDb2xvciAqPSBkaWZmdXNlQ29sb3JGYWN0b3IucmdiO1xcbiAgYWxwaGEgKj0gZGlmZnVzZUNvbG9yRmFjdG9yLmE7XFxuXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8wXFxuICAvLyBkaWZmdXNlQ29sb3JUZXh0dXJlIChDb25zaWRlcmVkIHRvIGJlIHByZW11bHRpcGxpZWQgYWxwaGEpXFxuICBsZXQgZGlmZnVzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9kaWZmdXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBkaWZmdXNlQ29sb3JUZXh0dXJlUm90YXRpb24gPSBnZXRfZGlmZnVzZUNvbG9yVGV4dHVyZVJvdGF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBkaWZmdXNlQ29sb3JUZXhVdiA9IHV2VHJhbnNmb3JtKGRpZmZ1c2VDb2xvclRleHR1cmVUcmFuc2Zvcm0ueHksIGRpZmZ1c2VDb2xvclRleHR1cmVUcmFuc2Zvcm0uencsIGRpZmZ1c2VDb2xvclRleHR1cmVSb3RhdGlvbiwgaW5wdXQudGV4Y29vcmRfMCk7XFxuICBsZXQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZVNhbXBsZShkaWZmdXNlQ29sb3JUZXh0dXJlLCBkaWZmdXNlQ29sb3JTYW1wbGVyLCBkaWZmdXNlQ29sb3JUZXhVdik7XFxuICBkaWZmdXNlQ29sb3IgKj0gdGV4dHVyZUNvbG9yLnJnYjtcXG4gIGFscGhhICo9IHRleHR1cmVDb2xvci5hO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9JU19BTFBIQV9NT0RFX01BU0tcXG4gIGxldCBhbHBoYUN1dG9mZiA9IGdldF9hbHBoYUN1dG9mZihtYXRlcmlhbFNJRCwgMCk7XFxuICBpZiAoYmFzZUNvbG9yLmEgPCBhbHBoYUN1dG9mZikge1xcbiAgICBkaXNjYXJkO1xcbiAgfVxcbiNlbmRpZlxcblxcblxcbiAgLy8gTGlnaHRpbmdcXG4gIHZhciBzaGFkaW5nQ29sb3IgPSB2ZWMzZigwLjAsIDAuMCwgMC4wKTtcXG4jaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gIGxldCBzaGFkaW5nTW9kZWwgPSBnZXRfc2hhZGluZ01vZGVsKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChzaGFkaW5nTW9kZWwgPiAwKSB7XFxuXFxuICAgIHZhciBkaWZmdXNlID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gICAgdmFyIHNwZWN1bGFyID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gICAgbGV0IGxpZ2h0TnVtYmVyID0gdTMyKGdldF9saWdodE51bWJlcigwdSwgMHUpKTtcXG4gICAgZm9yICh2YXIgaSA9IDB1OyBpIDwgbGlnaHROdW1iZXIgOyBpKyspIHtcXG5cXG4gICAgICAvLyBMaWdodFxcbiAgICAgIGxldCBsaWdodDogTGlnaHQgPSBnZXRMaWdodChpLCBpbnB1dC5wb3NpdGlvbl9pbldvcmxkLnh5eik7XFxuXFxuICAgICAgLy8gRGlmZnVzZVxcbiAgICAgIGRpZmZ1c2UgKz0gZGlmZnVzZUNvbG9yICogbWF4KDAuMCwgZG90KG5vcm1hbF9pbldvcmxkLCBsaWdodC5kaXJlY3Rpb24pKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuXFxuICAgICAgbGV0IHNoaW5pbmVzcyA9IGdldF9zaGluaW5lc3MobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIGxldCBzaGFkaW5nTW9kZWwgPSBnZXRfc2hhZGluZ01vZGVsKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gICAgICBsZXQgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcblxcbiAgICAgIC8vIFNwZWN1bGFyXFxuICAgICAgaWYgKHNoYWRpbmdNb2RlbCA9PSAyKSB7Ly8gQkxJTk5cXG4gICAgICAgIC8vIFZpZXdEaXJlY3Rpb25cXG4gICAgICAgIGxldCB2aWV3RGlyZWN0aW9uID0gbm9ybWFsaXplKHZpZXdQb3NpdGlvbiAtIGlucHV0LnBvc2l0aW9uX2luV29ybGQueHl6KTtcXG4gICAgICAgIGxldCBoYWxmVmVjdG9yID0gbm9ybWFsaXplKGxpZ2h0LmRpcmVjdGlvbiArIHZpZXdEaXJlY3Rpb24pO1xcbiAgICAgICAgc3BlY3VsYXIgKz0gcG93KG1heCgwLjAsIGRvdChoYWxmVmVjdG9yLCBub3JtYWxfaW5Xb3JsZCkpLCBzaGluaW5lc3MpO1xcbiAgICAgIH0gZWxzZSBpZiAoc2hhZGluZ01vZGVsID09IDMpIHsgLy8gUEhPTkdcXG4gICAgICAgIGxldCB2aWV3RGlyZWN0aW9uID0gbm9ybWFsaXplKHZpZXdQb3NpdGlvbiAtIGlucHV0LnBvc2l0aW9uX2luV29ybGQueHl6KTtcXG4gICAgICAgIGxldCBSID0gcmVmbGVjdChsaWdodC5kaXJlY3Rpb24sIG5vcm1hbF9pbldvcmxkKTtcXG4gICAgICAgIHNwZWN1bGFyICs9IHBvdyhtYXgoMC4wLCBkb3QoUiwgdmlld0RpcmVjdGlvbikpLCBzaGluaW5lc3MpO1xcbiAgICAgIH1cXG5cXG4gICAgfVxcblxcbiAgICBzaGFkaW5nQ29sb3IgPSBkaWZmdXNlICsgc3BlY3VsYXI7XFxuICB9IGVsc2Uge1xcbiAgICBzaGFkaW5nQ29sb3IgPSBkaWZmdXNlQ29sb3I7XFxuICB9XFxuI2Vsc2VcXG4gIHNoYWRpbmdDb2xvciA9IGRpZmZ1c2VDb2xvcjtcXG4jZW5kaWZcXG5cXG4gIC8vIFNoYWRvd1xcbi8vICNpZmRlZiBSTl9VU0VfU0hBRE9XX01BUFBJTkdcXG4vLyAgIGZsb2F0IHZpc2liaWxpdHkgPSAxLjA7XFxuLy8gICBmbG9hdCBiaWFzID0gMC4wMDE7XFxuXFxuLy8gLy8gIE5vbiBQQ0ZcXG4vLyAgIGlmICggdGV4dHVyZVByb2ooIHVfZGVwdGhUZXh0dXJlLCB2X3NoYWRvd0Nvb3JkICkuciAgPCAodl9zaGFkb3dDb29yZC56IC0gYmlhcykgLyB2X3NoYWRvd0Nvb3JkLncgKSB7XFxuLy8gICAgIHZpc2liaWxpdHkgPSAwLjU7XFxuLy8gICB9XFxuLy8gICBzaGFkaW5nQ29sb3IgKj0gdmlzaWJpbGl0eTtcXG5cXG4vLyAgIC8vIEhhcmR3YXJlIFBDRlxcbi8vICAgLy8gdmVjNCBzaGFkb3dDb29yZCA9IHZfc2hhZG93Q29vcmQ7XFxuLy8gICAvLyBzaGFkb3dDb29yZC56IC09IGJpYXM7XFxuLy8gICAvLyBzaGFkaW5nQ29sb3IgKj0gdGV4dHVyZVByb2ooIHVfZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCApICogMC41ICsgMC41O1xcblxcbi8vICAgYWxwaGEgPSAxLjA7XFxuLy8gI2VuZGlmXFxuXFxuI2lmZGVmIFJOX0lTX0FMUEhBX01PREVfQkxFTkRcXG4jZWxzZVxcbiAgYWxwaGEgPSAxLjA7XFxuI2VuZGlmXFxuXFxuICB2YXIgZmluYWxDb2xvciA9IHZlYzRmKHNoYWRpbmdDb2xvciAqIGFscGhhLCBhbHBoYSk7XFxuICAvLyBydDAgPSB2ZWM0KHVfbGlnaHROdW1iZXIsIDAuMCwgMC4wLCAxLjApO1xcbiAgLy8gcnQwID0gdmVjNCgxLjAsIDAuMCwgMC4wLCAxLjApO1xcbiAgLy8gcnQwID0gdmVjNChub3JtYWxfaW5Xb3JsZCowLjUrMC41LCAxLjApO1xcblxcbiAgcmV0dXJuIGZpbmFsQ29sb3I7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuXFxuZm4gY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKCBxdWF0ZXJuaW9uOiB2ZWM0PGYzMj4sIHRyYW5zbGF0aW9uOiB2ZWMzPGYzMj4sIHNjYWxlOiB2ZWMzPGYzMj4gKSAtPiBtYXQ0eDQ8ZjMyPiB7XFxuICBsZXQgcSA9IHF1YXRlcm5pb247XFxuICBsZXQgdCA9IHRyYW5zbGF0aW9uO1xcblxcbiAgbGV0IHN4ID0gcS54ICogcS54O1xcbiAgbGV0IHN5ID0gcS55ICogcS55O1xcbiAgbGV0IHN6ID0gcS56ICogcS56O1xcbiAgbGV0IGN4ID0gcS55ICogcS56O1xcbiAgbGV0IGN5ID0gcS54ICogcS56O1xcbiAgbGV0IGN6ID0gcS54ICogcS55O1xcbiAgbGV0IHd4ID0gcS53ICogcS54O1xcbiAgbGV0IHd5ID0gcS53ICogcS55O1xcbiAgbGV0IHd6ID0gcS53ICogcS56O1xcblxcbiAgbGV0IG1hdCA9IG1hdDR4NChcXG4gICAgMS4wIC0gMi4wICogKHN5ICsgc3opLCAyLjAgKiAoY3ogKyB3eiksIDIuMCAqIChjeSAtIHd5KSwgMC4wLFxcbiAgICAyLjAgKiAoY3ogLSB3eiksIDEuMCAtIDIuMCAqIChzeCArIHN6KSwgMi4wICogKGN4ICsgd3gpLCAwLjAsXFxuICAgIDIuMCAqIChjeSArIHd5KSwgMi4wICogKGN4IC0gd3gpLCAxLjAgLSAyLjAgKiAoc3ggKyBzeSksIDAuMCxcXG4gICAgdC54LCB0LnksIHQueiwgMS4wXFxuICApO1xcblxcbiAgbGV0IHVuaWZvcm1TY2FsZU1hdCA9IG1hdDR4NChcXG4gICAgc2NhbGUueCwgMC4wLCAwLjAsIDAuMCxcXG4gICAgMC4wLCBzY2FsZS55LCAwLjAsIDAuMCxcXG4gICAgMC4wLCAwLjAsIHNjYWxlLnosIDAuMCxcXG4gICAgMC4wLCAwLjAsIDAuMCwgMS4wXFxuICApO1xcblxcbiAgbGV0IG1hdDQ0ID0gbWF0KnVuaWZvcm1TY2FsZU1hdDtcXG4gIHJldHVybiBtYXQ0NDtcXG5cXG59XFxuXFxuZm4gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWNfeHk6IHZlYzI8ZjMyPiwgY3JpdGVyaWE6IGYzMikgLT4gdmVjNDxmMzI+IHtcXG5cXG4gIHZhciByOiBmMzI7XFxuICB2YXIgZzogZjMyO1xcbiAgdmFyIGI6IGYzMjtcXG4gIHZhciBhOiBmMzI7XFxuXFxuICBsZXQgaXggPSBmbG9vcih2ZWNfeHkueCAqIGNyaXRlcmlhKTtcXG4gIGxldCB2MXggPSBpeCAvIGNyaXRlcmlhO1xcbiAgbGV0IHYxeSA9IGl4IC0gZmxvb3IodjF4KSAqIGNyaXRlcmlhO1xcblxcbiAgciA9ICggdjF4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGcgPSAoIHYxeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICBsZXQgaXkgPSBmbG9vciggdmVjX3h5LnkgKiBjcml0ZXJpYSk7XFxuICBsZXQgdjJ4ID0gaXkgLyBjcml0ZXJpYTtcXG4gIGxldCB2MnkgPSBpeSAtIGZsb29yKHYyeCkgKiBjcml0ZXJpYTtcXG5cXG4gIGIgPSAoIHYyeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBhID0gKCB2MnkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgciAtPSAxLjAvY3JpdGVyaWE7XFxuICBnIC09IDEuMC9jcml0ZXJpYTtcXG4gIGIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYSAtPSAxLjAvY3JpdGVyaWE7XFxuXFxuICByID0gcioyLjAtMS4wO1xcbiAgZyA9IGcqMi4wLTEuMDtcXG4gIGIgPSBiKjIuMC0xLjA7XFxuICBhID0gYSoyLjAtMS4wO1xcblxcbiAgcmV0dXJuIHZlYzQ8ZjMyPihyLCBnLCBiLCBhKTtcXG59XFxuXFxuZm4gZ2V0X2JvbmVNYXRyaXhBc01hdDR4NChza2VsZXRhbENvbXBvbmVudFNJRDogdTMyLCBqb2ludDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPiB7XFxuICBsZXQgbWF0NDM6IG1hdDR4MzxmMzI+ID0gZ2V0X2JvbmVNYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50KTtcXG4gIHJldHVybiBtYXQ0eDQ8ZjMyPihcXG4gICAgdmVjNDxmMzI+KG1hdDQzWzBdLCAwLjApLFxcbiAgICB2ZWM0PGYzMj4obWF0NDNbMV0sIDAuMCksXFxuICAgIHZlYzQ8ZjMyPihtYXQ0M1syXSwgMC4wKSxcXG4gICAgdmVjNDxmMzI+KG1hdDQzWzNdLCAxLjApXFxuICApO1xcbn1cXG5cXG5mbiBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lEOiB1MzIsIGpvaW50OiB2ZWM0PHUzMj4sIHdlaWdodDogdmVjNDxmMzI+KSAtPiBtYXQ0eDQ8ZjMyPiB7XFxuXFxuI2lmZGVmIFJOX0JPTkVfREFUQV9UWVBFX01hdDQzeDFcXG4gIHZhciBza2luTWF0OiBtYXQ0eDQ8ZjMyPiA9IHdlaWdodC54ICogZ2V0X2JvbmVNYXRyaXhBc01hdDR4NChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueCk7XFxuICBza2luTWF0ICs9IHdlaWdodC55ICogZ2V0X2JvbmVNYXRyaXhBc01hdDR4NChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueSk7XFxuICBza2luTWF0ICs9IHdlaWdodC56ICogZ2V0X2JvbmVNYXRyaXhBc01hdDR4NChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueik7XFxuICBza2luTWF0ICs9IHdlaWdodC53ICogZ2V0X2JvbmVNYXRyaXhBc01hdDR4NChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQudyk7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDIpXFxuICBsZXQgY3JpdGVyaWEgPSB2ZWMyPGYzMj4oNDA5Ni4wLCA0MDk2LjApO1xcblxcbiAgbGV0IHRxX3ggPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LngpO1xcbiAgbGV0IHNxX3ggPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueCk7XFxuICB2YXIgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV94LncsIHNxX3gudyksIGNyaXRlcmlhLngpO1xcbiAgdmFyIHNraW5NYXQ6IG1hdDR4NDxmMzI+ID0gd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeC54eXosIHNxX3gueHl6KTtcXG5cXG4gIGxldCB0cV95ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC55KTtcXG4gIGxldCBzcV95ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnkpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV95LncsIHNxX3kudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV95Lnh5eiwgc3FfeS54eXopO1xcblxcbiAgbGV0IHRxX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnopO1xcbiAgbGV0IHNxX3ogPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueik7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3oudywgc3Ffei53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IHdlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3oueHl6LCBzcV96Lnh5eik7XFxuXFxuICBsZXQgdHFfdyA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQudyk7XFxuICBsZXQgc3FfdyA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC53KTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfdy53LCBzcV93LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfdy54eXosIHNxX3cueHl6KTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMl9PTEQpXFxuICBsZXQgdHNfeCA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LngpO1xcbiAgdmFyIHNraW5NYXQ6IG1hdDR4NDxmMzI+ID0gd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueCksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgbGV0IHRzX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC55KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueSksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgbGV0IHRzX3ogPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC56KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueiksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgbGV0IHRzX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC53KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIGdldF9ib25lUXVhdGVybmlvbihza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQudyksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgxKVxcbiAgbGV0IGJvbmVDb21wcmVzc2VkQ2h1bmtzWCA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC54KTtcXG4gIGxldCBib25lQ29tcHJlc3NlZENodW5rc1kgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueSk7XFxuICBsZXQgYm9uZUNvbXByZXNzZWRDaHVua3NaID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnopO1xcbiAgbGV0IGJvbmVDb21wcmVzc2VkQ2h1bmtzVyA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC53KTtcXG5cXG4gIGxldCBjcml0ZXJpYSA9IHZlYzI8ZjMyPig0MDk2LjAsIDQwOTYuMCk7XFxuICBsZXQgYm9uZUNvbXByZXNzZWRJbmZvID0gZ2V0X2JvbmVDb21wcmVzc2VkSW5mbygwLjAsIDApO1xcblxcbiAgbGV0IHRzX3ggPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgdmFyIHNraW5NYXQ6IG1hdDR4NDxmMzI+ID0gd2VpZ2h0LnggKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnh5LCBjcml0ZXJpYS54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICBsZXQgdHNfeSA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IHdlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS54eSwgY3JpdGVyaWEueCksIHRzX3kueHl6LCB2ZWMzKHRzX3kudykpO1xcbiAgbGV0IHRzX3ogPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1oueHksIGNyaXRlcmlhLngpLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIGxldCB0c193ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LncgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnh5LCBjcml0ZXJpYS54KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuI2VuZGlmXFxuICByZXR1cm4gc2tpbk1hdDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gdG9Ob3JtYWxNYXRyaXgobTogbWF0NHg0PGYzMj4pIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBhMDAgPSBtWzBdWzBdO1xcbiAgbGV0IGEwMSA9IG1bMF1bMV07XFxuICBsZXQgYTAyID0gbVswXVsyXTtcXG4gIGxldCBhMDMgPSBtWzBdWzNdO1xcbiAgbGV0IGExMCA9IG1bMV1bMF07XFxuICBsZXQgYTExID0gbVsxXVsxXTtcXG4gIGxldCBhMTIgPSBtWzFdWzJdO1xcbiAgbGV0IGExMyA9IG1bMV1bM107XFxuICBsZXQgYTIwID0gbVsyXVswXTtcXG4gIGxldCBhMjEgPSBtWzJdWzFdO1xcbiAgbGV0IGEyMiA9IG1bMl1bMl07XFxuICBsZXQgYTIzID0gbVsyXVszXTtcXG4gIGxldCBhMzAgPSBtWzNdWzBdO1xcbiAgbGV0IGEzMSA9IG1bM11bMV07XFxuICBsZXQgYTMyID0gbVszXVsyXTtcXG4gIGxldCBhMzMgPSBtWzNdWzNdO1xcblxcbiAgbGV0IGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcXG4gIGxldCBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XFxuICBsZXQgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xcbiAgbGV0IGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcXG4gIGxldCBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XFxuICBsZXQgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xcbiAgbGV0IGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcXG4gIGxldCBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XFxuICBsZXQgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xcbiAgbGV0IGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcXG4gIGxldCBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XFxuICBsZXQgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyO1xcblxcbiAgbGV0IGRldGVybWluYW50VmFsID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xcblxcbiAgcmV0dXJuIG1hdDN4MzxmMzI+KFxcbiAgICAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAvIGRldGVybWluYW50VmFsLFxcbiAgICAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAvIGRldGVybWluYW50VmFsXFxuICApO1xcbn1cXG5cXG5zdHJ1Y3QgR2VvbWV0b3J5T3V0cHV0IHtcXG4gIG5vcm1hbE1hdHJpeDogbWF0M3gzPGYzMj4sXFxuICBwb3NpdGlvbl9pbldvcmxkOiB2ZWM0PGYzMj4sXFxuICBub3JtYWxfaW5Xb3JsZDogdmVjMzxmMzI+LFxcbiAgaXNTa2lubmluZzogYm9vbCxcXG59XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuZm4gc2tpbm5pbmcoXFxuICBza2VsZXRhbENvbXBvbmVudFNJRDogdTMyLFxcbiAgaW5Ob3JtYWxNYXRyaXg6IG1hdDN4MzxmMzI+LFxcbiAgaW5Qb3NpdGlvbl9pbkxvY2FsOiB2ZWMzPGYzMj4sXFxuICBpbk5vcm1hbF9pbkxvY2FsOiB2ZWMzPGYzMj4sXFxuICBqb2ludDogdmVjNDx1MzI+LFxcbiAgd2VpZ2h0OiB2ZWM0PGYzMj4sXFxuICApIC0+IEdlb21ldG9yeU91dHB1dFxcbntcXG4gIHZhciBvdXRwdXQ6IEdlb21ldG9yeU91dHB1dDtcXG4gIGxldCBza2luTWF0ID0gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQsIHdlaWdodCk7XFxuICBvdXRwdXQucG9zaXRpb25faW5Xb3JsZCA9IHNraW5NYXQgKiB2ZWM0PGYzMj4oaW5Qb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgb3V0cHV0Lm5vcm1hbE1hdHJpeCA9IHRvTm9ybWFsTWF0cml4KHNraW5NYXQpO1xcbiAgb3V0cHV0Lm5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKG91dHB1dC5ub3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG4gIG91dHB1dC5pc1NraW5uaW5nID0gdHJ1ZTtcXG5cXG4gIHJldHVybiBvdXRwdXQ7XFxufVxcbiNlbmRpZlxcblxcblxcbmZuIHByb2Nlc3NHZW9tZXRyeVdpdGhNb3JwaGluZ0FuZFNraW5uaW5nKFxcbiAgc2tlbGV0YWxDb21wb25lbnRTSUQ6IGkzMixcXG4gIGJsZW5kU2hhcGVDb21wb25lbnRTSUQ6IHUzMixcXG4gIHdvcmxkTWF0cml4OiBtYXQ0eDQ8ZjMyPixcXG4gIHZpZXdNYXRyaXg6IG1hdDR4NDxmMzI+LFxcbiAgaXNCaWxsYm9hcmQ6IGJvb2wsXFxuICBpbk5vcm1hbE1hdHJpeDogbWF0M3gzPGYzMj4sXFxuICBpblBvc2l0aW9uX2luTG9jYWw6IHZlYzM8ZjMyPixcXG4gIGluTm9ybWFsX2luTG9jYWw6IHZlYzM8ZjMyPixcXG4gIGJhcnlDZW50cmljQ29vcmQ6IHZlYzQ8ZjMyPixcXG4gIGpvaW50OiB2ZWM0PHUzMj4sXFxuICB3ZWlnaHQ6IHZlYzQ8ZjMyPixcXG4pIC0+IEdlb21ldG9yeU91dHB1dCB7XFxuICB2YXIgb3V0cHV0OiBHZW9tZXRvcnlPdXRwdXQ7XFxuXFxuICB2YXIgcG9zaXRpb25faW5Mb2NhbDogdmVjMzxmMzI+O1xcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbiAgaWYgKF9tb3JwaFRhcmdldE51bWJlciA9PSAwdSkge1xcbiNlbmRpZlxcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gaW5Qb3NpdGlvbl9pbkxvY2FsO1xcbiNpZmRlZiBSTl9JU19NT1JQSElOR1xcbiAgfSBlbHNlIHtcXG4gICAgbGV0IHZlcnRleElkeCA9IHUzMihiYXJ5Q2VudHJpY0Nvb3JkLncpO1xcbiAgICBwb3NpdGlvbl9pbkxvY2FsID0gZ2V0X3Bvc2l0aW9uKHZlcnRleElkeCwgaW5Qb3NpdGlvbl9pbkxvY2FsLCBibGVuZFNoYXBlQ29tcG9uZW50U0lEKTtcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIHZhciB3b3JsZE1hdHJpeElubmVyID0gd29ybGRNYXRyaXg7XFxuXFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICBpZiAoc2tlbGV0YWxDb21wb25lbnRTSUQgPj0gMCkge1xcbiAgICBvdXRwdXQgPSBza2lubmluZyh1MzIoc2tlbGV0YWxDb21wb25lbnRTSUQpLCBpbk5vcm1hbE1hdHJpeCwgcG9zaXRpb25faW5Mb2NhbCwgaW5Ob3JtYWxfaW5Mb2NhbCwgam9pbnQsIHdlaWdodCk7XFxuICB9IGVsc2Uge1xcbiNlbmRpZlxcbiAgICBvdXRwdXQubm9ybWFsTWF0cml4ID0gaW5Ob3JtYWxNYXRyaXg7XFxuICAgIG91dHB1dC5wb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXhJbm5lciAqIHZlYzQocG9zaXRpb25faW5Mb2NhbCwgMS4wKTtcXG4gICAgb3V0cHV0Lm5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGluTm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuICAgIG91dHB1dC5pc1NraW5uaW5nID0gZmFsc2U7XFxuI2lmZGVmIFJOX0lTX1NLSU5OSU5HXFxuICB9XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gb3V0cHV0O1xcbn1cXG5cXG5cXG4vLyBCaWFzTWF0cml4ICogTGlnaHRQcm9qZWN0aW9uTWF0cml4ICogTGlnaHRWaWV3TWF0cml4LCBTZWU6IGh0dHA6Ly93d3cub3BlbmdsLXR1dG9yaWFsLm9yZy9pbnRlcm1lZGlhdGUtdHV0b3JpYWxzL3R1dG9yaWFsLTE2LXNoYWRvdy1tYXBwaW5nLyNiYXNpYy1zaGFkZXJcXG4vLyAjcGFyYW0gZGVwdGhCaWFzUFY6IG1hdDR4NDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpXFxuXFxuQHZlcnRleFxcbmZuIG1haW4oXFxuI2lmZGVmIFJOX1VTRV9JTlNUQU5DRVxcbiAgQGxvY2F0aW9uKDgpIGluc3RhbmNlX2lkczogdmVjNDxmMzI+LFxcbiNlbmRpZlxcblxcblxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fRkxPQVRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fSU5UXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzM8aTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1BPU0lUSU9OX1VJTlRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzx1MzI+LFxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfTk9STUFMXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsOiB2ZWMzPGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBAbG9jYXRpb24oMikgdGFuZ2VudDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMFxcbiAgQGxvY2F0aW9uKDMpIHRleGNvb3JkXzA6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzFcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xOiB2ZWMyPGYzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX0ZMT0FUXFxuICBAbG9jYXRpb24oNSkgY29sb3JfMDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQ09MT1JfMF9JTlRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PGkzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX1VJTlRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PHUzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9KT0lOVFNfMFxcbiAgQGxvY2F0aW9uKDYpIGpvaW50c18wOiB2ZWM0PHUzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9XRUlHSFRTXzBcXG4gIEBsb2NhdGlvbig3KSB3ZWlnaHRzXzA6IHZlYzQ8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0JBUllfQ0VOVFJJQ19DT09SRFxcbiAgQGxvY2F0aW9uKDEwKSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8yXFxuICBAbG9jYXRpb24oMTEpIHRleGNvb3JkXzI6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG4gIEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SWR4IDogdTMyLFxcblxcblxcbikgLT4gVmVydGV4T3V0cHV0IHtcXG5cXG5sZXQgbWF0ZXJpYWxTSUQgPSBfbWF0ZXJpYWxTSUQ7XFxubGV0IGN1cnJlbnRQcmltaXRpdmVJZHggPSBfY3VycmVudFByaW1pdGl2ZUlkeDtcXG5sZXQgbW9ycGhUYXJnZXROdW1iZXIgPSBfbW9ycGhUYXJnZXROdW1iZXI7XFxubGV0IGNhbWVyYVNJRCA9IF9jYW1lcmFTSUQ7XFxuXFxuXFxuICB2YXIgb3V0cHV0IDogVmVydGV4T3V0cHV0O1xcbiAgbGV0IGluc3RhbmNlSWQgPSB1MzIoaW5zdGFuY2VfaWRzLngpO1xcblxcbiAgbGV0IHdvcmxkTWF0cml4ID0gZ2V0X3dvcmxkTWF0cml4KGluc3RhbmNlSWQpO1xcbiAgbGV0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbGV0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbGV0IG5vcm1hbE1hdHJpeCA9IGdldF9ub3JtYWxNYXRyaXgoaW5zdGFuY2VJZCk7XFxuICAvLyBsZXQgaXNCaWxsYm9hcmQgPSBnZXRfaXNCaWxsYm9hcmQoaW5zdGFuY2VJZCk7XFxuXFxuICBsZXQgc2tlbGV0YWxDb21wb25lbnRTSUQgPSBpMzIoaW5zdGFuY2VfaWRzLnkpO1xcbiAgbGV0IGJsZW5kU2hhcGVDb21wb25lbnRTSUQgPSB1MzIoaW5zdGFuY2VfaWRzLnopO1xcblxcblxcbiNpZmRlZiBSTl9VU0VfTk9STUFMXFxuI2Vsc2VcXG4gIGxldCBub3JtYWwgPSB2ZWMzPGYzMj4oMC4wLCAwLjAsIDAuMCk7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9KT0lOVFNfMFxcbiAgbGV0IGpvaW50ID0gam9pbnRzXzA7XFxuI2Vsc2VcXG4gIGxldCBqb2ludCA9IHZlYzQ8dTMyPigwLCAwLCAwLCAwKTtcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1dFSUdIVFNfMFxcbiAgbGV0IHdlaWdodCA9IHdlaWdodHNfMDtcXG4jZWxzZVxcbiAgbGV0IHdlaWdodCA9IHZlYzQ8ZjMyPigwLjAsIDAuMCwgMC4wLCAwLjApO1xcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQkFSWV9DRU5UUklDX0NPT1JEXFxuI2Vsc2VcXG4gIGxldCBiYXJ5Q2VudHJpY0Nvb3JkID0gdmVjNDxmMzI+KDAuMCwgMC4wLCAwLjAsIDAuMCk7XFxuI2VuZGlmXFxuXFxuICAvLyBTa2VsZXRhbFxcbiAgbGV0IGdlb20gPSBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gICAgc2tlbGV0YWxDb21wb25lbnRTSUQsXFxuICAgIGJsZW5kU2hhcGVDb21wb25lbnRTSUQsXFxuICAgIHdvcmxkTWF0cml4LFxcbiAgICB2aWV3TWF0cml4LFxcbiAgICBmYWxzZSxcXG4gICAgbm9ybWFsTWF0cml4LFxcbiAgICBwb3NpdGlvbixcXG4gICAgbm9ybWFsLFxcbiAgICBiYXJ5Q2VudHJpY0Nvb3JkLFxcbiAgICBqb2ludCxcXG4gICAgd2VpZ2h0XFxuICApO1xcblxcbiAgb3V0cHV0LnBvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiBnZW9tLnBvc2l0aW9uX2luV29ybGQ7XFxuICBvdXRwdXQucG9zaXRpb25faW5Xb3JsZCA9IGdlb20ucG9zaXRpb25faW5Xb3JsZC54eXo7XFxuXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wXFxuICBvdXRwdXQuY29sb3JfMCA9IHZlYzRmKGNvbG9yXzApO1xcbiNlbHNlXFxuICBvdXRwdXQuY29sb3JfMCA9IHZlYzRmKDEuMCwgMS4wLCAxLjAsIDEuMCk7XFxuI2VuZGlmXFxuXFxuICBvdXRwdXQubm9ybWFsX2luV29ybGQgPSBub3JtYWxNYXRyaXggKiBub3JtYWw7XFxuXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8wXFxuICBvdXRwdXQudGV4Y29vcmRfMCA9IHRleGNvb3JkXzA7XFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8xXFxuICBvdXRwdXQudGV4Y29vcmRfMSA9IHRleGNvb3JkXzE7XFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8yXFxuICBvdXRwdXQudGV4Y29vcmRfMiA9IHRleGNvb3JkXzI7XFxuI2VuZGlmXFxuXFxuICBvdXRwdXQuYmFyeUNlbnRyaWNDb29yZCA9IGJhcnlDZW50cmljQ29vcmQueHl6O1xcblxcbiAgbGV0IHZpc2liaWxpdHkgPSBnZXRfaXNWaXNpYmxlKGluc3RhbmNlSWQpO1xcbiAgaWYgKCF2aXNpYmlsaXR5KVxcbiAge1xcbiAgICBvdXRwdXQucG9zaXRpb24gPSB2ZWM0ZigwLjAsIDAuMCwgMC4wLCAxLjApO1xcbiAgfVxcblxcbiNpZmRlZiBSTl9VU0VfU0hBRE9XX01BUFBJTkdcXG4gIG91dHB1dC5zaGFkb3dDb29yZCA9IGdldF9kZXB0aEJpYXNQVihtYXRlcmlhbFNJRCwgMCkgKiBnZW9tLnBvc2l0aW9uX2luV29ybGQ7XFxuI2VuZGlmXFxuXFxuICByZXR1cm4gb3V0cHV0O1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbkBmcmFnbWVudFxcbmZuIG1haW4gKFxcbiAgaW5wdXQ6IFZlcnRleE91dHB1dCxcXG4pIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIHZhciBiYXNlQ29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmFzZUNvbG9yVGV4dHVyZSwgYmFzZUNvbG9yU2FtcGxlciwgaW5wdXQudGV4Y29vcmRfMCwgMC4wKTtcXG5cXG4gIGxldCBsdW1pbmFuY2UgPSBkb3QoYmFzZUNvbG9yLnJnYiwgdmVjM2YoMC4yMTI2LCAwLjcxNTIsIDAuMDcyMikpO1xcblxcbiAgbGV0IGx1bWluYW5jZUNyaXRlcmlvbjogZjMyID0gZ2V0X2x1bWluYW5jZUNyaXRlcmlvbihtYXRlcmlhbFNJRCwgMCk7XFxuICBiYXNlQ29sb3IgPSB2ZWM0ZihtaXgodmVjM2YoMC4wKSwgYmFzZUNvbG9yLnJnYiwgKGx1bWluYW5jZSAtIGx1bWluYW5jZUNyaXRlcmlvbikgLyBsdW1pbmFuY2VDcml0ZXJpb24pLCAxLjApO1xcblxcbiAgcmV0dXJuIGJhc2VDb2xvcjtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5AdmVydGV4XFxuZm4gbWFpbihcXG4gIEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SWR4IDogdTMyLFxcbikgLT4gVmVydGV4T3V0cHV0IHtcXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcbmxldCB4ID0gZjMyKCh2ZXJ0ZXhJZHggJiAxdSkgPDwgMnUpO1xcbmxldCB5ID0gZjMyKCh2ZXJ0ZXhJZHggJiAydSkgPDwgMXUpO1xcbm91dHB1dC50ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbm91dHB1dC50ZXhjb29yZF8wLnkgPSB5ICogMC41O1xcbm91dHB1dC50ZXhjb29yZF8wLnkgPSAxLjAgLSBvdXRwdXQudGV4Y29vcmRfMC55O1xcbm91dHB1dC5wb3NpdGlvbiA9IHZlYzRmKHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcblxcbiAgcmV0dXJuIG91dHB1dDtcXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMikgdGV4Y29vcmRfMCA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbigzKSBjb2xvcl8wIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzEgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNSkgdGV4Y29vcmRfMiA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig2KSB0YW5nZW50X2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oNykgYmlub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig4KSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOSkgc2hhZG93Q29vcmQgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMTApIGluc3RhbmNlSW5mbyA6IGYzMixcXG4gIEBsb2NhdGlvbigxMSkgbm9ybWFsX2luVmlldyA6IHZlYzM8ZjMyPixcXG59XFxuXFxuc3RydWN0IFN0b3JhZ2VEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZT4gc3RvcmFnZURhdGE6IFN0b3JhZ2VEYXRhO1xcbnN0cnVjdCBCbGVuZFNoYXBlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2U+IGJsZW5kU2hhcGVEYXRhOiBCbGVuZFNoYXBlRGF0YTtcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoT2Zmc2V0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PHUzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoT2Zmc2V0czogVW5pZm9ybU1vcnBoT2Zmc2V0cztcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoV2VpZ2h0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoV2VpZ2h0czogVW5pZm9ybU1vcnBoV2VpZ2h0cztcXG5cXG5vdmVycmlkZSBfbWF0ZXJpYWxTSUQ6IHUzMjtcXG5vdmVycmlkZSBfY3VycmVudFByaW1pdGl2ZUlkeCA9IDB1O1xcbm92ZXJyaWRlIF9tb3JwaFRhcmdldE51bWJlcjogdTMyID0gMHU7XFxub3ZlcnJpZGUgX2NhbWVyYVNJRDogdTMyID0gMHU7XFxuY29uc3QgTV9QSTogZjMyID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgUkVDSVBST0NBTF9QSTogZjMyID0gMC4zMTgzMDk4ODYxODM3OTA3O1xcbmNvbnN0IEVwc2lsb246IGYzMiA9IDAuMDAwMDAwMTtcXG5jb25zdCBjX01pblJvdWdobmVzczogZjMyID0gMC4wNDtcXG5cXG5mbiBmZXRjaEVsZW1lbnQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIHN0b3JhZ2VEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcih2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gYmxlbmRTaGFwZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZEZyb21CbGVuZFNoYXBlQnVmZmVyKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjNCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj4ge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZuIGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IGYzMiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcblxcblxcblxcbmZuIGZldGNoTWF0NCh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPlxcbntcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuICBsZXQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDN1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDQ8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDR4Myh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDM8ZjMyPiB7XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4MzxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5mbiB1dlRyYW5zZm9ybShzY2FsZTogdmVjMmYsIG9mZnNldDogdmVjMmYsIHJvdGF0aW9uOiBmMzIsIHV2OiB2ZWMyZikgLT4gdmVjMmYge1xcbiAgbGV0IHRyYW5zbGF0aW9uTWF0ID0gbWF0M3gzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIGxldCByb3RhdGlvbk1hdCA9IG1hdDN4MyhcXG4gICAgICBjb3Mocm90YXRpb24pLCAtc2luKHJvdGF0aW9uKSwgMCxcXG4gICAgICBzaW4ocm90YXRpb24pLCBjb3Mocm90YXRpb24pLCAwLFxcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIDAsIDFcXG4gICk7XFxuICBsZXQgc2NhbGVNYXQgPSBtYXQzeDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBsZXQgbWF0cml4ID0gdHJhbnNsYXRpb25NYXQgKiByb3RhdGlvbk1hdCAqIHNjYWxlTWF0O1xcbiAgbGV0IHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzNmKHV2Lnh5LCAxKSApLnh5O1xcblxcbiAgcmV0dXJuIHV2VHJhbnNmb3JtZWQ7XFxufVxcblxcbiNpZmRlZiBSTl9JU19OT0RFX1NIQURFUlxcbiNlbHNlXFxuZm4gZ2V0VGV4Y29vcmQodGV4Y29vcmRJbmRleDogdTMyLCBpbnB1dDogVmVydGV4T3V0cHV0KSAtPiB2ZWMyPGYzMj4ge1xcbiAgdmFyIHRleGNvb3JkOiB2ZWMyZjtcXG4gIGlmKHRleGNvb3JkSW5kZXggPT0gMil7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzE7XFxuICB9ZWxzZXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8wO1xcbiAgfVxcbiAgcmV0dXJuIHRleGNvb3JkO1xcbn1cXG4jZW5kaWZcXG5cXG5mbiBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4OiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gIHJldHVybiBjbGFtcCh4LCBFcHNpbG9uLCAxLjApO1xcbn1cXG5cXG5mbiBtYXgzKHY6IHZlYzNmKSAtPiBmMzJcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZuIHNxRjMyKHQ6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzJmKHQ6IHZlYzJmKSAtPiB2ZWMyZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMzZih0OiB2ZWMzZikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjNGYodDogdmVjNGYpIC0+IHZlYzRmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG4vLyAjcGFyYW0gZW52SGRyaUZvcm1hdDogaTMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBlbnZSb3RhdGlvbjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBkaWZmdXNlQ29sb3JGYWN0b3I6IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSwxKVxcbkBncm91cCgxKSBAYmluZGluZygwKSB2YXIgY29sb3JFbnZUZXh0dXJlOiB0ZXh0dXJlX2N1YmU8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPWJsYWNrXFxuQGdyb3VwKDIpIEBiaW5kaW5nKDApIHZhciBjb2xvckVudlNhbXBsZXI6IHNhbXBsZXI7XFxuLy8gI3BhcmFtIG1ha2VPdXRwdXRTcmdiOiBib29sOyAvLyBpbml0aWFsVmFsdWU9MVxcbi8vICNwYXJhbSBpbnZlcnNlRW52aXJvbm1lbnQ6IGJvb2w7IC8vIGluaXRpYWxWYWx1ZT10cnVlXFxuXFxuZm4gbGluZWFyVG9TcmdiKGxpbmVhckNvbG9yOiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgcmV0dXJuIHBvdyhsaW5lYXJDb2xvciwgdmVjM2YoMS4wLzIuMikpO1xcbn1cXG5cXG5mbiBzcmdiVG9MaW5lYXIoc3JnYkNvbG9yOiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgcmV0dXJuIHBvdyhzcmdiQ29sb3IsIHZlYzNmKDIuMikpO1xcbn1cXG5cXG5cXG5AZnJhZ21lbnRcXG5mbiBtYWluKFxcbiAgaW5wdXQ6IFZlcnRleE91dHB1dCxcXG4pIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIHZhciBkaWZmdXNlQ29sb3IgPSB2ZWM0PGYzMj4oMSwgMSwgMSwgMSk7XFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wXFxuICBkaWZmdXNlQ29sb3IgPSBpbnB1dC5jb2xvcl8wO1xcbiNlbmRpZlxcbiAgbGV0IGRpZmZ1c2VDb2xvckZhY3RvciA9IGdldF9kaWZmdXNlQ29sb3JGYWN0b3IobWF0ZXJpYWxTSUQsIDB1KTtcXG4gIGRpZmZ1c2VDb2xvciAqPSBkaWZmdXNlQ29sb3JGYWN0b3I7XFxuXFxuICBsZXQgZW52Um90YXRpb246IGYzMiA9IGdldF9lbnZSb3RhdGlvbihtYXRlcmlhbFNJRCwgMHUpO1xcbiAgbGV0IHJvdCA9IGVudlJvdGF0aW9uICsgMy4xNDE1O1xcbiAgbGV0IHJvdEVudk1hdHJpeCA9IG1hdDN4MzxmMzI+KGNvcyhyb3QpLCAwLjAsIC1zaW4ocm90KSwgMC4wLCAxLjAsIDAuMCwgc2luKHJvdCksIDAuMCwgY29zKHJvdCkpO1xcbiAgdmFyIGVudk5vcm1hbDogdmVjM2YgPSBub3JtYWxpemUocm90RW52TWF0cml4ICogaW5wdXQucG9zaXRpb25faW5Xb3JsZCk7XFxuXFxuICBpZiAoZ2V0X2ludmVyc2VFbnZpcm9ubWVudChtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgZW52Tm9ybWFsLnggKj0gLTEuMDtcXG4gIH1cXG5cXG4gIGxldCBkaWZmdXNlVGV4ZWwgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoY29sb3JFbnZUZXh0dXJlLCBjb2xvckVudlNhbXBsZXIsIGVudk5vcm1hbCwgMC4wKTtcXG4gIHZhciB0ZXh0dXJlQ29sb3I6IHZlYzNmO1xcbiAgbGV0IEVudkhkcmlGb3JtYXQ6IGkzMiA9IGdldF9lbnZIZHJpRm9ybWF0KG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChFbnZIZHJpRm9ybWF0ID09IDApIHsgLy8gTERSX1NSR0JcXG4gICAgdGV4dHVyZUNvbG9yID0gc3JnYlRvTGluZWFyKGRpZmZ1c2VUZXhlbC5yZ2IpO1xcbiAgfSBlbHNlIGlmIChFbnZIZHJpRm9ybWF0ID09IDMpIHsgLy8gUkdCRVxcbiAgICB0ZXh0dXJlQ29sb3IgPSBkaWZmdXNlVGV4ZWwucmdiICogcG93KDIuMCwgZGlmZnVzZVRleGVsLmEqMjU1LjAtMTI4LjApO1xcbiAgfSBlbHNlIHtcXG4gICAgdGV4dHVyZUNvbG9yID0gZGlmZnVzZVRleGVsLnJnYjtcXG4gIH1cXG4gIGRpZmZ1c2VDb2xvciAqPSB2ZWM0Zih0ZXh0dXJlQ29sb3IsIDEuMCk7XFxuXFxuICB2YXIgcmVzdWx0Q29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbiAgbGV0IHJlc3VsdEFscGhhID0gZGlmZnVzZUNvbG9yLmE7XFxuXFxubGV0IG1ha2VPdXRwdXRTcmdiID0gZ2V0X21ha2VPdXRwdXRTcmdiKG1hdGVyaWFsU0lELCAwKTtcXG5yZXN1bHRDb2xvciA9IHNlbGVjdChyZXN1bHRDb2xvci5yZ2IsIGxpbmVhclRvU3JnYihyZXN1bHRDb2xvci5yZ2IpLCBtYWtlT3V0cHV0U3JnYik7XFxuXFxuXFxuICByZXR1cm4gdmVjNGYocmVzdWx0Q29sb3IsIHJlc3VsdEFscGhhKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG4vLyAjcGFyYW0gZW5hYmxlVmlld01hdHJpeDogYm9vbDsgLy8gaW5pdGlhbFZhbHVlPXRydWVcXG5cXG5AdmVydGV4XFxuZm4gbWFpbihcXG4jaWZkZWYgUk5fVVNFX0lOU1RBTkNFXFxuICBAbG9jYXRpb24oOCkgaW5zdGFuY2VfaWRzOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9GTE9BVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9JTlRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxpMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fVUlOVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPHUzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcXG4gIEBsb2NhdGlvbigxKSBub3JtYWw6IHZlYzM8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gIEBsb2NhdGlvbigyKSB0YW5nZW50OiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8wXFxuICBAbG9jYXRpb24oMykgdGV4Y29vcmRfMDogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMVxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzE6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfRkxPQVRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX0lOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8aTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfVUlOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0pPSU5UU18wXFxuICBAbG9jYXRpb24oNikgam9pbnRzXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1dFSUdIVFNfMFxcbiAgQGxvY2F0aW9uKDcpIHdlaWdodHNfMDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQkFSWV9DRU5UUklDX0NPT1JEXFxuICBAbG9jYXRpb24oMTApIGJhcnlDZW50cmljQ29vcmQ6IHZlYzQ8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzJcXG4gIEBsb2NhdGlvbigxMSkgdGV4Y29vcmRfMjogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiAgQGJ1aWx0aW4odmVydGV4X2luZGV4KSB2ZXJ0ZXhJZHggOiB1MzIsXFxuXFxuXFxuKSAtPiBWZXJ0ZXhPdXRwdXQge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxuXFxuICBsZXQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgodTMyKGluc3RhbmNlX2lkcy54KSk7XFxuICBsZXQgdmlld01hdHJpeCA9IGdldF92aWV3TWF0cml4KGNhbWVyYVNJRCwgMHUpO1xcbiAgbGV0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDB1KTtcXG5cXG4gIGlmIChnZXRfZW5hYmxlVmlld01hdHJpeChtYXRlcmlhbFNJRCwgMHUpKSB7XFxuICAgIHZhciByb3RhdGVNYXRyaXggPSB2aWV3TWF0cml4O1xcbiAgICByb3RhdGVNYXRyaXhbM11bMF0gPSAwLjA7XFxuICAgIHJvdGF0ZU1hdHJpeFszXVsxXSA9IDAuMDtcXG4gICAgcm90YXRlTWF0cml4WzNdWzJdID0gMC4wO1xcbiAgICBvdXRwdXQucG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogcm90YXRlTWF0cml4ICogd29ybGRNYXRyaXggKiB2ZWM0Zihwb3NpdGlvbiwgMS4wKTtcXG4gIH0gZWxzZSB7XFxuICAgIG91dHB1dC5wb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB3b3JsZE1hdHJpeCAqIHZlYzRmKHBvc2l0aW9uLCAxLjApO1xcbiAgfVxcblxcbiAgbGV0IG5vcm1hbE1hdHJpeCA9IGdldF9ub3JtYWxNYXRyaXgodTMyKGluc3RhbmNlX2lkcy54KSk7XFxuICBvdXRwdXQubm9ybWFsX2luV29ybGQgPSBub3JtYWxNYXRyaXggKiBub3JtYWw7XFxuXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wXFxuICBvdXRwdXQuY29sb3JfMCA9IGNvbG9yXzA7XFxuI2VuZGlmXFxuICBvdXRwdXQucG9zaXRpb25faW5Xb3JsZCA9ICh3b3JsZE1hdHJpeCAqIHZlYzRmKHBvc2l0aW9uLCAxLjApKS54eXo7XFxuICBvdXRwdXQudGV4Y29vcmRfMCA9IHRleGNvb3JkXzA7XFxuXFxuICByZXR1cm4gb3V0cHV0O1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbi8vICNwYXJhbSBkaWZmdXNlQ29sb3JGYWN0b3I6IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSwxKVxcblxcbkBncm91cCgxKSBAYmluZGluZygwKSB2YXIgYmFzZUNvbG9yVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9Ymx1ZVxcbkBncm91cCgyKSBAYmluZGluZygwKSB2YXIgYmFzZUNvbG9yU2FtcGxlcjogc2FtcGxlcjtcXG5cXG5AZnJhZ21lbnRcXG5mbiBtYWluKFxcbiAgaW5wdXQ6IFZlcnRleE91dHB1dFxcbikgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcbiAgdmFyIE5vcm1hbCA9IGlucHV0Lm5vcm1hbF9pbldvcmxkICogMC41ICsgMC41O1xcbiAgLy8gcmV0dXJuIHZlYzQ8ZjMyPihOb3JtYWwueCwgTm9ybWFsLnksIE5vcm1hbC56LCAxKTtcXG5cXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzBcXG4gIHZhciBiYXNlQ29sb3IgPSB0ZXh0dXJlU2FtcGxlKGJhc2VDb2xvclRleHR1cmUsIGJhc2VDb2xvclNhbXBsZXIsIGlucHV0LnRleGNvb3JkXzApO1xcbiAgcmV0dXJuIGJhc2VDb2xvcjtcXG4jZWxzZVxcbiAgcmV0dXJuIHZlYzQ8ZjMyPigxLCAwLCAwLCAxKTtcXG4jZW5kaWZcXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5AdmVydGV4XFxuZm4gbWFpbihcXG4jaWZkZWYgUk5fVVNFX0lOU1RBTkNFXFxuICBAbG9jYXRpb24oOCkgaW5zdGFuY2VfaWRzOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9GTE9BVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9JTlRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxpMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fVUlOVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPHUzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcXG4gIEBsb2NhdGlvbigxKSBub3JtYWw6IHZlYzM8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gIEBsb2NhdGlvbigyKSB0YW5nZW50OiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8wXFxuICBAbG9jYXRpb24oMykgdGV4Y29vcmRfMDogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMVxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzE6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfRkxPQVRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX0lOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8aTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfVUlOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0pPSU5UU18wXFxuICBAbG9jYXRpb24oNikgam9pbnRzXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1dFSUdIVFNfMFxcbiAgQGxvY2F0aW9uKDcpIHdlaWdodHNfMDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQkFSWV9DRU5UUklDX0NPT1JEXFxuICBAbG9jYXRpb24oMTApIGJhcnlDZW50cmljQ29vcmQ6IHZlYzQ8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzJcXG4gIEBsb2NhdGlvbigxMSkgdGV4Y29vcmRfMjogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiAgQGJ1aWx0aW4odmVydGV4X2luZGV4KSB2ZXJ0ZXhJZHggOiB1MzIsXFxuXFxuXFxuKSAtPiBWZXJ0ZXhPdXRwdXQge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxuXFxuICBsZXQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgodTMyKGluc3RhbmNlX2lkcy54KSk7XFxuICBsZXQgdmlld01hdHJpeCA9IGdldF92aWV3TWF0cml4KGNhbWVyYVNJRCwgMHUpO1xcbiAgbGV0IHByb2plY3Rpb25NYXRyaXggPSBnZXRfcHJvamVjdGlvbk1hdHJpeChjYW1lcmFTSUQsIDB1KTtcXG5cXG4gIG91dHB1dC5wb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogd29ybGRNYXRyaXggKiB2ZWM0PGYzMj4ocG9zaXRpb24sIDEuMCk7XFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcXG4gIG91dHB1dC5ub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZSgod29ybGRNYXRyaXggKiB2ZWM0PGYzMj4obm9ybWFsLCAwLjApKS54eXopO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMFxcbiAgb3V0cHV0LnRleGNvb3JkXzAgPSB0ZXhjb29yZF8wO1xcbiNlbmRpZlxcblxcbiAgLy8gb3V0cHV0LlBvc2l0aW9uID0gdmVjNDxmMzI+KHBvc2l0aW9uLCAxLjApO1xcblxcbiAgcmV0dXJuIG91dHB1dDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMikgdGV4Y29vcmRfMCA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbigzKSBjb2xvcl8wIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzEgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNSkgdGV4Y29vcmRfMiA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig2KSB0YW5nZW50X2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oNykgYmlub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig4KSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOSkgc2hhZG93Q29vcmQgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMTApIGluc3RhbmNlSW5mbyA6IGYzMixcXG4gIEBsb2NhdGlvbigxMSkgbm9ybWFsX2luVmlldyA6IHZlYzM8ZjMyPixcXG59XFxuXFxuc3RydWN0IFN0b3JhZ2VEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZT4gc3RvcmFnZURhdGE6IFN0b3JhZ2VEYXRhO1xcbnN0cnVjdCBCbGVuZFNoYXBlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2U+IGJsZW5kU2hhcGVEYXRhOiBCbGVuZFNoYXBlRGF0YTtcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoT2Zmc2V0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PHUzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoT2Zmc2V0czogVW5pZm9ybU1vcnBoT2Zmc2V0cztcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoV2VpZ2h0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoV2VpZ2h0czogVW5pZm9ybU1vcnBoV2VpZ2h0cztcXG5cXG5vdmVycmlkZSBfbWF0ZXJpYWxTSUQ6IHUzMjtcXG5vdmVycmlkZSBfY3VycmVudFByaW1pdGl2ZUlkeCA9IDB1O1xcbm92ZXJyaWRlIF9tb3JwaFRhcmdldE51bWJlcjogdTMyID0gMHU7XFxub3ZlcnJpZGUgX2NhbWVyYVNJRDogdTMyID0gMHU7XFxuY29uc3QgTV9QSTogZjMyID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgUkVDSVBST0NBTF9QSTogZjMyID0gMC4zMTgzMDk4ODYxODM3OTA3O1xcbmNvbnN0IEVwc2lsb246IGYzMiA9IDAuMDAwMDAwMTtcXG5jb25zdCBjX01pblJvdWdobmVzczogZjMyID0gMC4wNDtcXG5cXG5mbiBmZXRjaEVsZW1lbnQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIHN0b3JhZ2VEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcih2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gYmxlbmRTaGFwZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZEZyb21CbGVuZFNoYXBlQnVmZmVyKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjNCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj4ge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZuIGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IGYzMiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcblxcblxcblxcbmZuIGZldGNoTWF0NCh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPlxcbntcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuICBsZXQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDN1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDQ8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDR4Myh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDM8ZjMyPiB7XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4MzxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5mbiB1dlRyYW5zZm9ybShzY2FsZTogdmVjMmYsIG9mZnNldDogdmVjMmYsIHJvdGF0aW9uOiBmMzIsIHV2OiB2ZWMyZikgLT4gdmVjMmYge1xcbiAgbGV0IHRyYW5zbGF0aW9uTWF0ID0gbWF0M3gzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIGxldCByb3RhdGlvbk1hdCA9IG1hdDN4MyhcXG4gICAgICBjb3Mocm90YXRpb24pLCAtc2luKHJvdGF0aW9uKSwgMCxcXG4gICAgICBzaW4ocm90YXRpb24pLCBjb3Mocm90YXRpb24pLCAwLFxcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIDAsIDFcXG4gICk7XFxuICBsZXQgc2NhbGVNYXQgPSBtYXQzeDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBsZXQgbWF0cml4ID0gdHJhbnNsYXRpb25NYXQgKiByb3RhdGlvbk1hdCAqIHNjYWxlTWF0O1xcbiAgbGV0IHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzNmKHV2Lnh5LCAxKSApLnh5O1xcblxcbiAgcmV0dXJuIHV2VHJhbnNmb3JtZWQ7XFxufVxcblxcbiNpZmRlZiBSTl9JU19OT0RFX1NIQURFUlxcbiNlbHNlXFxuZm4gZ2V0VGV4Y29vcmQodGV4Y29vcmRJbmRleDogdTMyLCBpbnB1dDogVmVydGV4T3V0cHV0KSAtPiB2ZWMyPGYzMj4ge1xcbiAgdmFyIHRleGNvb3JkOiB2ZWMyZjtcXG4gIGlmKHRleGNvb3JkSW5kZXggPT0gMil7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzE7XFxuICB9ZWxzZXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8wO1xcbiAgfVxcbiAgcmV0dXJuIHRleGNvb3JkO1xcbn1cXG4jZW5kaWZcXG5cXG5mbiBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4OiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gIHJldHVybiBjbGFtcCh4LCBFcHNpbG9uLCAxLjApO1xcbn1cXG5cXG5mbiBtYXgzKHY6IHZlYzNmKSAtPiBmMzJcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZuIHNxRjMyKHQ6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzJmKHQ6IHZlYzJmKSAtPiB2ZWMyZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMzZih0OiB2ZWMzZikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjNGYodDogdmVjNGYpIC0+IHZlYzRmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5AZ3JvdXAoMSkgQGJpbmRpbmcoMCkgdmFyIGJhc2VDb2xvclRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPXdoaXRlXFxuQGdyb3VwKDIpIEBiaW5kaW5nKDApIHZhciBiYXNlQ29sb3JTYW1wbGVyOiBzYW1wbGVyO1xcblxcbi8vICNwYXJhbSBlbmFibGVMaW5lYXJUb1NyZ2I6IGJvb2w7IC8vIGluaXRpYWxWYWx1ZT10cnVlXFxuXFxuZm4gbGluZWFyVG9TcmdiKGxpbmVhckNvbG9yOiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgcmV0dXJuIHBvdyhsaW5lYXJDb2xvciwgdmVjM2YoMS4wLzIuMikpO1xcbn1cXG5cXG5mbiBzcmdiVG9MaW5lYXIoc3JnYkNvbG9yOiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgcmV0dXJuIHBvdyhzcmdiQ29sb3IsIHZlYzNmKDIuMikpO1xcbn1cXG5cXG5cXG5AZnJhZ21lbnRcXG5mbiBtYWluIChcXG4gIGlucHV0OiBWZXJ0ZXhPdXRwdXQsXFxuKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcXG5sZXQgbWF0ZXJpYWxTSUQgPSBfbWF0ZXJpYWxTSUQ7XFxubGV0IGN1cnJlbnRQcmltaXRpdmVJZHggPSBfY3VycmVudFByaW1pdGl2ZUlkeDtcXG5sZXQgbW9ycGhUYXJnZXROdW1iZXIgPSBfbW9ycGhUYXJnZXROdW1iZXI7XFxubGV0IGNhbWVyYVNJRCA9IF9jYW1lcmFTSUQ7XFxuXFxuXFxuICB2YXIgYmFzZUNvbG9yID0gdGV4dHVyZVNhbXBsZUxldmVsKGJhc2VDb2xvclRleHR1cmUsIGJhc2VDb2xvclNhbXBsZXIsIGlucHV0LnRleGNvb3JkXzAsIDAuMCk7XFxuXFxuICBpZiAoZ2V0X2VuYWJsZUxpbmVhclRvU3JnYihtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgYmFzZUNvbG9yID0gdmVjNGYobGluZWFyVG9TcmdiKGJhc2VDb2xvci5yZ2IpLCBiYXNlQ29sb3IuYSk7XFxuICB9XFxuXFxuICByZXR1cm4gYmFzZUNvbG9yO1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMikgdGV4Y29vcmRfMCA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbigzKSBjb2xvcl8wIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzEgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNSkgdGV4Y29vcmRfMiA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig2KSB0YW5nZW50X2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oNykgYmlub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig4KSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOSkgc2hhZG93Q29vcmQgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMTApIGluc3RhbmNlSW5mbyA6IGYzMixcXG4gIEBsb2NhdGlvbigxMSkgbm9ybWFsX2luVmlldyA6IHZlYzM8ZjMyPixcXG59XFxuXFxuc3RydWN0IFN0b3JhZ2VEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZT4gc3RvcmFnZURhdGE6IFN0b3JhZ2VEYXRhO1xcbnN0cnVjdCBCbGVuZFNoYXBlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2U+IGJsZW5kU2hhcGVEYXRhOiBCbGVuZFNoYXBlRGF0YTtcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoT2Zmc2V0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PHUzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoT2Zmc2V0czogVW5pZm9ybU1vcnBoT2Zmc2V0cztcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoV2VpZ2h0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoV2VpZ2h0czogVW5pZm9ybU1vcnBoV2VpZ2h0cztcXG5cXG5vdmVycmlkZSBfbWF0ZXJpYWxTSUQ6IHUzMjtcXG5vdmVycmlkZSBfY3VycmVudFByaW1pdGl2ZUlkeCA9IDB1O1xcbm92ZXJyaWRlIF9tb3JwaFRhcmdldE51bWJlcjogdTMyID0gMHU7XFxub3ZlcnJpZGUgX2NhbWVyYVNJRDogdTMyID0gMHU7XFxuY29uc3QgTV9QSTogZjMyID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgUkVDSVBST0NBTF9QSTogZjMyID0gMC4zMTgzMDk4ODYxODM3OTA3O1xcbmNvbnN0IEVwc2lsb246IGYzMiA9IDAuMDAwMDAwMTtcXG5jb25zdCBjX01pblJvdWdobmVzczogZjMyID0gMC4wNDtcXG5cXG5mbiBmZXRjaEVsZW1lbnQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIHN0b3JhZ2VEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcih2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gYmxlbmRTaGFwZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZEZyb21CbGVuZFNoYXBlQnVmZmVyKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjNCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj4ge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZuIGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IGYzMiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcblxcblxcblxcbmZuIGZldGNoTWF0NCh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPlxcbntcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuICBsZXQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDN1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDQ8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDR4Myh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDM8ZjMyPiB7XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4MzxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5mbiB1dlRyYW5zZm9ybShzY2FsZTogdmVjMmYsIG9mZnNldDogdmVjMmYsIHJvdGF0aW9uOiBmMzIsIHV2OiB2ZWMyZikgLT4gdmVjMmYge1xcbiAgbGV0IHRyYW5zbGF0aW9uTWF0ID0gbWF0M3gzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIGxldCByb3RhdGlvbk1hdCA9IG1hdDN4MyhcXG4gICAgICBjb3Mocm90YXRpb24pLCAtc2luKHJvdGF0aW9uKSwgMCxcXG4gICAgICBzaW4ocm90YXRpb24pLCBjb3Mocm90YXRpb24pLCAwLFxcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIDAsIDFcXG4gICk7XFxuICBsZXQgc2NhbGVNYXQgPSBtYXQzeDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBsZXQgbWF0cml4ID0gdHJhbnNsYXRpb25NYXQgKiByb3RhdGlvbk1hdCAqIHNjYWxlTWF0O1xcbiAgbGV0IHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzNmKHV2Lnh5LCAxKSApLnh5O1xcblxcbiAgcmV0dXJuIHV2VHJhbnNmb3JtZWQ7XFxufVxcblxcbiNpZmRlZiBSTl9JU19OT0RFX1NIQURFUlxcbiNlbHNlXFxuZm4gZ2V0VGV4Y29vcmQodGV4Y29vcmRJbmRleDogdTMyLCBpbnB1dDogVmVydGV4T3V0cHV0KSAtPiB2ZWMyPGYzMj4ge1xcbiAgdmFyIHRleGNvb3JkOiB2ZWMyZjtcXG4gIGlmKHRleGNvb3JkSW5kZXggPT0gMil7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzE7XFxuICB9ZWxzZXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8wO1xcbiAgfVxcbiAgcmV0dXJuIHRleGNvb3JkO1xcbn1cXG4jZW5kaWZcXG5cXG5mbiBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4OiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gIHJldHVybiBjbGFtcCh4LCBFcHNpbG9uLCAxLjApO1xcbn1cXG5cXG5mbiBtYXgzKHY6IHZlYzNmKSAtPiBmMzJcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZuIHNxRjMyKHQ6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzJmKHQ6IHZlYzJmKSAtPiB2ZWMyZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMzZih0OiB2ZWMzZikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjNGYodDogdmVjNGYpIC0+IHZlYzRmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbkB2ZXJ0ZXhcXG5mbiBtYWluKFxcbiAgQGJ1aWx0aW4odmVydGV4X2luZGV4KSB2ZXJ0ZXhJZHggOiB1MzIsXFxuKSAtPiBWZXJ0ZXhPdXRwdXQge1xcbiAgdmFyIG91dHB1dCA6IFZlcnRleE91dHB1dDtcXG5sZXQgbWF0ZXJpYWxTSUQgPSBfbWF0ZXJpYWxTSUQ7XFxubGV0IGN1cnJlbnRQcmltaXRpdmVJZHggPSBfY3VycmVudFByaW1pdGl2ZUlkeDtcXG5sZXQgbW9ycGhUYXJnZXROdW1iZXIgPSBfbW9ycGhUYXJnZXROdW1iZXI7XFxubGV0IGNhbWVyYVNJRCA9IF9jYW1lcmFTSUQ7XFxuXFxuXFxubGV0IHggPSBmMzIoKHZlcnRleElkeCAmIDF1KSA8PCAydSk7XFxubGV0IHkgPSBmMzIoKHZlcnRleElkeCAmIDJ1KSA8PCAxdSk7XFxub3V0cHV0LnRleGNvb3JkXzAueCA9IHggKiAwLjU7XFxub3V0cHV0LnRleGNvb3JkXzAueSA9IHkgKiAwLjU7XFxub3V0cHV0LnRleGNvb3JkXzAueSA9IDEuMCAtIG91dHB1dC50ZXhjb29yZF8wLnk7XFxub3V0cHV0LnBvc2l0aW9uID0gdmVjNGYoeCAtIDEuMCwgeSAtIDEuMCwgMCwgMSk7XFxuXFxuXFxuICByZXR1cm4gb3V0cHV0O1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJ2ZXJ0ZXhcIixcImlzRnJhZ21lbnRTaGFkZXJcIjpmYWxzZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcblxcbkBmcmFnbWVudFxcbmZuIG1haW4oXFxuICBpbnB1dDogVmVydGV4T3V0cHV0LFxcbikgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcbiAgbGV0IG9mZnNldCA9IGlucHV0LnBvc2l0aW9uLnh5O1xcblxcbiAgbGV0IGZyYW1lYnVmZmVyU2l6ZTogdmVjMmYgPSBnZXRfZnJhbWVidWZmZXJTaXplKG1hdGVyaWFsU0lELCAwKTtcXG4gIHZhciBibHVyRGlyZWN0aW9uOiB2ZWMyZjtcXG4gIGxldCBpc0hvcml6b250YWw6IGJvb2wgPSBnZXRfaXNIb3Jpem9udGFsKG1hdGVyaWFsU0lELCAwKTtcXG4gIGlmIChpc0hvcml6b250YWwpIHtcXG4gICAgYmx1ckRpcmVjdGlvbiA9IHZlYzJmKDEuMCwgMC4wKTtcXG4gIH0gZWxzZSB7IC8vIHZlcnRpY2FsXFxuICAgIGJsdXJEaXJlY3Rpb24gPSB2ZWMyZigwLjAsIDEuMCk7XFxuICB9XFxuXFx0bGV0IHRGcmFnOiB2ZWMyZiA9IDEuMCAvIGZyYW1lYnVmZmVyU2l6ZTtcXG5cXG4gIHZhciBjb2xvciA9IHZlYzRmKDAuMCwgMC4wLCAwLjAsIDEuMCk7XFxuICBsZXQgZ2F1c3NpYW5LZXJuZWxTaXplOiBpMzIgPSBnZXRfZ2F1c3NpYW5LZXJuZWxTaXplKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBtaW5TdHJpZGVMZW5ndGggPSAtIGYzMihnYXVzc2lhbktlcm5lbFNpemUgLSAxKSAvIDIuMDtcXG5cXG4gIGZvciAodmFyIGk9MHU7IGkgPCB1MzIoZ2F1c3NpYW5LZXJuZWxTaXplKTsgaSsrKSB7XFxuXFxuICAgIGxldCBzdHJpZGVMZW5ndGggPSBtaW5TdHJpZGVMZW5ndGggKyBmMzIoaSk7XFxuICAgIGxldCBzdHJpZGU6IHZlYzJmID0gc3RyaWRlTGVuZ3RoICogYmx1ckRpcmVjdGlvbjtcXG5cXG4gICAgbGV0IGdhdXNzaWFuUmF0aW8gPSBnZXRfZ2F1c3NpYW5SYXRpbyhtYXRlcmlhbFNJRCwgaSk7XFxuICAgIHZhciB1diA9IChvZmZzZXQgKyBzdHJpZGUpICogdEZyYWc7XFxuICAgIC8vIHV2LnkgPSAxLjAgLSB1di55O1xcbiAgICBjb2xvciArPSB2ZWM0Zih0ZXh0dXJlU2FtcGxlTGV2ZWwoYmFzZUNvbG9yVGV4dHVyZSwgYmFzZUNvbG9yU2FtcGxlciwgdXYsIDAuMCkucmdiLCAxLjApICogZ2F1c3NpYW5SYXRpbztcXG4gIH1cXG5cXG4gIHJldHVybiBjb2xvcjtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5AdmVydGV4XFxuZm4gbWFpbihcXG4gIEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SWR4IDogdTMyLFxcbikgLT4gVmVydGV4T3V0cHV0IHtcXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcbmxldCB4ID0gZjMyKCh2ZXJ0ZXhJZHggJiAxdSkgPDwgMnUpO1xcbmxldCB5ID0gZjMyKCh2ZXJ0ZXhJZHggJiAydSkgPDwgMXUpO1xcbm91dHB1dC50ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbm91dHB1dC50ZXhjb29yZF8wLnkgPSB5ICogMC41O1xcbm91dHB1dC50ZXhjb29yZF8wLnkgPSAxLjAgLSBvdXRwdXQudGV4Y29vcmRfMC55O1xcbm91dHB1dC5wb3NpdGlvbiA9IHZlYzRmKHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcblxcbiAgcmV0dXJuIG91dHB1dDtcXG5cXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMikgdGV4Y29vcmRfMCA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbigzKSBjb2xvcl8wIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzEgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNSkgdGV4Y29vcmRfMiA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig2KSB0YW5nZW50X2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oNykgYmlub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig4KSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOSkgc2hhZG93Q29vcmQgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMTApIGluc3RhbmNlSW5mbyA6IGYzMixcXG4gIEBsb2NhdGlvbigxMSkgbm9ybWFsX2luVmlldyA6IHZlYzM8ZjMyPixcXG59XFxuXFxuc3RydWN0IFN0b3JhZ2VEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZT4gc3RvcmFnZURhdGE6IFN0b3JhZ2VEYXRhO1xcbnN0cnVjdCBCbGVuZFNoYXBlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2U+IGJsZW5kU2hhcGVEYXRhOiBCbGVuZFNoYXBlRGF0YTtcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoT2Zmc2V0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PHUzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoT2Zmc2V0czogVW5pZm9ybU1vcnBoT2Zmc2V0cztcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoV2VpZ2h0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoV2VpZ2h0czogVW5pZm9ybU1vcnBoV2VpZ2h0cztcXG5cXG5vdmVycmlkZSBfbWF0ZXJpYWxTSUQ6IHUzMjtcXG5vdmVycmlkZSBfY3VycmVudFByaW1pdGl2ZUlkeCA9IDB1O1xcbm92ZXJyaWRlIF9tb3JwaFRhcmdldE51bWJlcjogdTMyID0gMHU7XFxub3ZlcnJpZGUgX2NhbWVyYVNJRDogdTMyID0gMHU7XFxuY29uc3QgTV9QSTogZjMyID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgUkVDSVBST0NBTF9QSTogZjMyID0gMC4zMTgzMDk4ODYxODM3OTA3O1xcbmNvbnN0IEVwc2lsb246IGYzMiA9IDAuMDAwMDAwMTtcXG5jb25zdCBjX01pblJvdWdobmVzczogZjMyID0gMC4wNDtcXG5cXG5mbiBmZXRjaEVsZW1lbnQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIHN0b3JhZ2VEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcih2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gYmxlbmRTaGFwZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZEZyb21CbGVuZFNoYXBlQnVmZmVyKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjNCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj4ge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZuIGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IGYzMiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcblxcblxcblxcbmZuIGZldGNoTWF0NCh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPlxcbntcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuICBsZXQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDN1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDQ8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDR4Myh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDM8ZjMyPiB7XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4MzxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5mbiB1dlRyYW5zZm9ybShzY2FsZTogdmVjMmYsIG9mZnNldDogdmVjMmYsIHJvdGF0aW9uOiBmMzIsIHV2OiB2ZWMyZikgLT4gdmVjMmYge1xcbiAgbGV0IHRyYW5zbGF0aW9uTWF0ID0gbWF0M3gzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIGxldCByb3RhdGlvbk1hdCA9IG1hdDN4MyhcXG4gICAgICBjb3Mocm90YXRpb24pLCAtc2luKHJvdGF0aW9uKSwgMCxcXG4gICAgICBzaW4ocm90YXRpb24pLCBjb3Mocm90YXRpb24pLCAwLFxcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIDAsIDFcXG4gICk7XFxuICBsZXQgc2NhbGVNYXQgPSBtYXQzeDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBsZXQgbWF0cml4ID0gdHJhbnNsYXRpb25NYXQgKiByb3RhdGlvbk1hdCAqIHNjYWxlTWF0O1xcbiAgbGV0IHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzNmKHV2Lnh5LCAxKSApLnh5O1xcblxcbiAgcmV0dXJuIHV2VHJhbnNmb3JtZWQ7XFxufVxcblxcbiNpZmRlZiBSTl9JU19OT0RFX1NIQURFUlxcbiNlbHNlXFxuZm4gZ2V0VGV4Y29vcmQodGV4Y29vcmRJbmRleDogdTMyLCBpbnB1dDogVmVydGV4T3V0cHV0KSAtPiB2ZWMyPGYzMj4ge1xcbiAgdmFyIHRleGNvb3JkOiB2ZWMyZjtcXG4gIGlmKHRleGNvb3JkSW5kZXggPT0gMil7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzE7XFxuICB9ZWxzZXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8wO1xcbiAgfVxcbiAgcmV0dXJuIHRleGNvb3JkO1xcbn1cXG4jZW5kaWZcXG5cXG5mbiBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4OiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gIHJldHVybiBjbGFtcCh4LCBFcHNpbG9uLCAxLjApO1xcbn1cXG5cXG5mbiBtYXgzKHY6IHZlYzNmKSAtPiBmMzJcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZuIHNxRjMyKHQ6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzJmKHQ6IHZlYzJmKSAtPiB2ZWMyZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMzZih0OiB2ZWMzZikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjNGYodDogdmVjNGYpIC0+IHZlYzRmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbmNvbnN0IEVQU19DT0w6IGYzMiA9IDAuMDAwMDE7XFxuXFxuc3RydWN0IExpZ2h0IHtcXG4gIGxpZ2h0VHlwZTogaTMyLCAvLyAwID0gZGlyZWN0aW9uYWwsIDEgPSBwb2ludCwgMiA9IHNwb3RcXG4gIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXFxuICBpbnRlbnNpdHk6IHZlYzM8ZjMyPixcXG4gIGF0dGVudWF0ZWRJbnRlbnNpdHk6IHZlYzM8ZjMyPixcXG4gIGRpcmVjdGlvbk9mTGlnaHRPYmplY3Q6IHZlYzM8ZjMyPixcXG4gIGRpcmVjdGlvbjogdmVjMzxmMzI+LCAvLyBkaXJlY3Rpb24gb2YgbGlnaHQgdmVjdG9yLCBlcXVhbCB0byBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KVxcbiAgcG9pbnRUb0xpZ2h0OiB2ZWMzPGYzMj4sIC8vIG5vdCBub3JtYWxpemVkXFxuICBzcG90QW5nbGVTY2FsZTogZjMyLFxcbiAgc3BvdEFuZ2xlT2Zmc2V0OiBmMzIsXFxuICBlZmZlY3RpdmVSYW5nZTogZjMyLFxcbn07XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL2Jsb2IvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2xpZ2h0c19wdW5jdHVhbC9SRUFETUUubWQjcmFuZ2UtcHJvcGVydHlcXG5mbiBnZXRSYW5nZUF0dGVudWF0aW9uKGxpZ2h0OiBMaWdodCkgLT4gZjMyXFxue1xcbiAgbGV0IGRpc3RhbmNlID0gbGVuZ3RoKGxpZ2h0LnBvaW50VG9MaWdodCk7XFxuICAvLyBtZWFucyBubyByYW5nZSBsaW1pdFxcbiAgaWYgKGxpZ2h0LmVmZmVjdGl2ZVJhbmdlIDw9IDAuMClcXG4gIHtcXG4gICAgcmV0dXJuIDEuMCAvIHBvdyhkaXN0YW5jZSwgMi4wKTtcXG4gIH1cXG4gIHJldHVybiBtYXgobWluKDEuMCAtIHBvdyhkaXN0YW5jZSAvIGxpZ2h0LmVmZmVjdGl2ZVJhbmdlLCA0LjApLCAxLjApLCAwLjApIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbn1cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNpbm5lci1hbmQtb3V0ZXItY29uZS1hbmdsZXNcXG5mbiBnZXRTcG90QXR0ZW51YXRpb24obGlnaHQ6IExpZ2h0KSAtPiBmMzJcXG57XFxuXFxuICBsZXQgY2QgPSBkb3QobGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCwgbGlnaHQuZGlyZWN0aW9uKTtcXG4gIGxldCBhbmd1bGFyQXR0ZW51YXRpb24gPSBjbGFtcChjZCAqIGxpZ2h0LnNwb3RBbmdsZVNjYWxlICsgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0LCAwLjAsIDEuMCk7XFxuICByZXR1cm4gYW5ndWxhckF0dGVudWF0aW9uO1xcbn1cXG5cXG5mbiBnZXRMaWdodEF0dGVudWF0ZWQobGlnaHQ6IExpZ2h0KSAtPiBMaWdodCB7XFxuICB2YXIgbmV3TGlnaHQ6IExpZ2h0ID0gbGlnaHQ7XFxuICBuZXdMaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xcbiAgLy8gaWYgKGxpZ2h0LmxpZ2h0VHlwZSA9PSAwKSB7IC8vIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIC8vIERpcmVjdGlvbmFsIExpZ2h0IGRvbid0IGF0dGVudWF0ZSBnZW9tZXRpY2FsbHlcXG4gIC8vIH1cXG5cXG4gIC8vIFBvaW50IExpZ2h0XFxuICBpZiAobGlnaHQubGlnaHRUeXBlID09IDEpXFxuICB7XFxuICAgIG5ld0xpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0UmFuZ2VBdHRlbnVhdGlvbihsaWdodCk7XFxuICB9XFxuICAvLyBTcG90IGxpZ2h0XFxuICBpZiAobGlnaHQubGlnaHRUeXBlID09IDIpXFxuICB7XFxuICAgIG5ld0xpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0U3BvdEF0dGVudWF0aW9uKGxpZ2h0KTtcXG4gIH1cXG5cXG4gIHJldHVybiBuZXdMaWdodDtcXG59XFxuXFxuZm4gZ2V0TGlnaHQobGlnaHRJZHg6IHUzMiwgdl9wb3NpdGlvbl9pbldvcmxkOiB2ZWMzPGYzMj4pIC0+IExpZ2h0IHtcXG4gIGxldCBsaWdodFBvc2l0aW9uOiB2ZWMzPGYzMj4gPSBnZXRfbGlnaHRQb3NpdGlvbigwdSwgbGlnaHRJZHgpO1xcbiAgbGV0IGRpcmVjdGlvbl9hbmRfd19vZl9MaWdodE9iamVjdDogdmVjMzxmMzI+ID0gZ2V0X2xpZ2h0RGlyZWN0aW9uKDB1LCBsaWdodElkeCk7XFxuICBsZXQgbGlnaHRJbnRlbnNpdHk6IHZlYzM8ZjMyPiA9IGdldF9saWdodEludGVuc2l0eSgwdSwgbGlnaHRJZHgpO1xcbiAgbGV0IGxpZ2h0UHJvcGVydHk6IHZlYzQ8ZjMyPiA9IGdldF9saWdodFByb3BlcnR5KDB1LCBsaWdodElkeCk7XFxuICB2YXIgbGlnaHQ6IExpZ2h0O1xcbiAgbGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCA9IGRpcmVjdGlvbl9hbmRfd19vZl9MaWdodE9iamVjdDtcXG4gIGxldCBsaWdodFR5cGUgPSBsaWdodFByb3BlcnR5Lng7XFxuICBsaWdodC5lZmZlY3RpdmVSYW5nZSA9IGxpZ2h0UHJvcGVydHkueTtcXG4gIGxpZ2h0LnNwb3RBbmdsZVNjYWxlID0gbGlnaHRQcm9wZXJ0eS56O1xcbiAgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0ID0gbGlnaHRQcm9wZXJ0eS53O1xcblxcbiAgbGlnaHQuaW50ZW5zaXR5ID0gbGlnaHRJbnRlbnNpdHk7XFxuICBsaWdodC5wb3NpdGlvbiA9IGxpZ2h0UG9zaXRpb247XFxuICBpZiAobGlnaHRUeXBlIDwgLTAuNSkgeyAvLyBkaXNhYmxlZCBsaWdodFxcbiAgICBsaWdodC5pbnRlbnNpdHkgPSB2ZWMzZigwLjApO1xcbiAgICBsaWdodC5saWdodFR5cGUgPSAtMTtcXG4gIH0gZWxzZSBpZiAoMC43NSA8IGxpZ2h0VHlwZSkgeyAvLyBpcyBwb2ludGxpZ2h0IG9yIHNwb3RsaWdodFxcbiAgICBsaWdodC5wb2ludFRvTGlnaHQgPSBsaWdodFBvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkO1xcbiAgICBsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gICAgbGlnaHQubGlnaHRUeXBlID0gMTtcXG4gIH0gZWxzZSB7IC8vIGlzIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIGxpZ2h0LmxpZ2h0VHlwZSA9IDA7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ICogLTEuMCk7XFxuICB9XFxuXFxuICBpZiAobGlnaHRUeXBlID4gMS43NSkgeyAvLyBpcyBzcG90bGlnaHRcXG4gICAgbGlnaHQubGlnaHRUeXBlID0gMjtcXG4gIH1cXG5cXG4gIGxpZ2h0LmludGVuc2l0eSAqPSBNX1BJOyAvLyBQdW5jdHVhbCBMaWdodFxcblxcbiAgLy8gQXR0ZW51YXRpb25cXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICBsZXQgbmV3TGlnaHQgPSBnZXRMaWdodEF0dGVudWF0ZWQobGlnaHQpO1xcblxcbiAgcmV0dXJuIG5ld0xpZ2h0O1xcbn1cXG5cXG5cXG5mbiBlZGdlX3JhdGlvKGJhcnkzOiB2ZWMzZiwgd2lyZWZyYW1lV2lkdGhJbm5lcjogZjMyLCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGU6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBkOiB2ZWMzZiA9IGZ3aWR0aChiYXJ5Myk7XFxuICBsZXQgeDogdmVjM2YgPSBiYXJ5MyArIHZlYzNmKDEuMCAtIHdpcmVmcmFtZVdpZHRoSW5uZXIpICogZDtcXG4gIGxldCBhMzogdmVjM2YgPSBzbW9vdGhzdGVwKHZlYzNmKDAuMCksIGQsIHgpO1xcbiAgbGV0IGZhY3RvciA9IG1pbihtaW4oYTMueCwgYTMueSksIGEzLnopO1xcblxcbiAgcmV0dXJuIGNsYW1wKCgxLjAgLSBmYWN0b3IpLCAwLjAsIDEuMCk7XFxufVxcblxcbmZuIGxpbmVhclRvU3JnYihsaW5lYXJDb2xvcjogdmVjM2YpIC0+IHZlYzNmIHtcXG4gIHJldHVybiBwb3cobGluZWFyQ29sb3IsIHZlYzNmKDEuMC8yLjIpKTtcXG59XFxuXFxuZm4gc3JnYlRvTGluZWFyKHNyZ2JDb2xvcjogdmVjM2YpIC0+IHZlYzNmIHtcXG4gIHJldHVybiBwb3coc3JnYkNvbG9yLCB2ZWMzZigyLjIpKTtcXG59XFxuXFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBmbiBnZXRUQk4obm9ybWFsX2luV29ybGQ6IHZlYzNmLCBpbnB1dDogVmVydGV4T3V0cHV0LCB2aWV3VmVjdG9yOiB2ZWMzZiwgdGV4Y29vcmQ6IHZlYzJmLCBpc0Zyb250OiBib29sKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICAgIGxldCB0YW5nZW50X2luV29ybGQgPSBub3JtYWxpemUoaW5wdXQudGFuZ2VudF9pbldvcmxkKTtcXG4gICAgbGV0IGJpbm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUoaW5wdXQuYmlub3JtYWxfaW5Xb3JsZCk7XFxuICAgIGxldCB0Ym5NYXRfdGFuZ2VudF90b193b3JsZCA9IG1hdDN4MzxmMzI+KHRhbmdlbnRfaW5Xb3JsZCwgYmlub3JtYWxfaW5Xb3JsZCwgbm9ybWFsX2luV29ybGQpO1xcblxcbiAgICByZXR1cm4gdGJuTWF0X3RhbmdlbnRfdG9fd29ybGQ7XFxuICB9XFxuI2Vsc2VcXG4gICAgLy8gVGhpcyBpcyBiYXNlZCBvbiBodHRwOi8vd3d3LnRoZXRlbnRocGxhbmV0LmRlL2FyY2hpdmVzLzExODBcXG4gICAgZm4gY290YW5nZW50X2ZyYW1lKG5vcm1hbF9pbldvcmxkOiB2ZWMzZiwgcG9zaXRpb246IHZlYzNmLCB1dl86IHZlYzJmLCBpc0Zyb250OiBib29sKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICAgICAgdmFyIHV2OiB2ZWMyZjtcXG4gICAgICBpZiAoaXNGcm9udCkge1xcbiAgICAgICAgdXYgPSB1dl87XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHV2ID0gLXV2XztcXG4gICAgICB9XFxuXFxuICAgICAgLy8gZ2V0IGVkZ2UgdmVjdG9ycyBvZiB0aGUgcGl4ZWwgdHJpYW5nbGVcXG4gICAgICBsZXQgZHAxID0gZHBkeChwb3NpdGlvbik7XFxuICAgICAgbGV0IGRwMiA9IGRwZHkocG9zaXRpb24pO1xcbiAgICAgIGxldCBkdXYxID0gZHBkeCh1dik7XFxuICAgICAgbGV0IGR1djIgPSBkcGR5KHV2KTtcXG5cXG4gICAgICAvLyBzb2x2ZSB0aGUgbGluZWFyIHN5c3RlbVxcbiAgICAgIGxldCBkcDJwZXJwID0gY3Jvc3MoZHAyLCBub3JtYWxfaW5Xb3JsZCk7XFxuICAgICAgbGV0IGRwMXBlcnAgPSBjcm9zcyhub3JtYWxfaW5Xb3JsZCwgZHAxKTtcXG4gICAgICBsZXQgdGFuZ2VudCA9IGRwMnBlcnAgKiBkdXYxLnggKyBkcDFwZXJwICogZHV2Mi54O1xcbiAgICAgIHZhciBiaXRhbmdlbnQgPSBkcDJwZXJwICogZHV2MS55ICsgZHAxcGVycCAqIGR1djIueTtcXG4gICAgICBiaXRhbmdlbnQgKj0gLTEuMDtcXG5cXG4gICAgICAvLyBjb25zdHJ1Y3QgYSBzY2FsZS1pbnZhcmlhbnQgZnJhbWVcXG4gICAgICBsZXQgaW52TWF0ID0gMS4wIC8gc3FydChtYXgoZG90KHRhbmdlbnQsIHRhbmdlbnQpLCBkb3QoYml0YW5nZW50LCBiaXRhbmdlbnQpKSk7XFxuICAgICAgcmV0dXJuIG1hdDN4MzxmMzI+KHRhbmdlbnQgKiBpbnZNYXQsIGJpdGFuZ2VudCAqIGludk1hdCwgbm9ybWFsX2luV29ybGQpO1xcbiAgICB9XFxuXFxuICAgIGZuIGdldFRCTihub3JtYWxfaW5Xb3JsZDogdmVjM2YsIGlucHV0OiBWZXJ0ZXhPdXRwdXQsIHZpZXdWZWN0b3I6IHZlYzNmLCB0ZXhjb29yZDogdmVjMmYsIGlzRnJvbnQ6IGJvb2wpIC0+IG1hdDN4MzxmMzI+IHtcXG4gICAgICBsZXQgdGJuTWF0X3RhbmdlbnRfdG9fd29ybGQgPSBjb3RhbmdlbnRfZnJhbWUobm9ybWFsX2luV29ybGQsIC12aWV3VmVjdG9yLCB0ZXhjb29yZCwgaXNGcm9udCk7XFxuXFxuICAgICAgcmV0dXJuIHRibk1hdF90YW5nZW50X3RvX3dvcmxkO1xcbiAgICB9XFxuI2VuZGlmXFxuXFxuXFxuQGZyYWdtZW50XFxuZm4gbWFpbiAoXFxuICBpbnB1dDogVmVydGV4T3V0cHV0LFxcbiAgQGJ1aWx0aW4oZnJvbnRfZmFjaW5nKSBpc0Zyb250OiBib29sXFxuKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcXG4gIHZhciBydDAgPSB2ZWM0ZigwLjAsIDAuMCwgMC4wLCAxLjApO1xcblxcbiAgI2lmZGVmIFJOX01UT09OX0lTX09VVExJTkVcXG4gICAgI2lmZGVmIFJOX01UT09OX09VVExJTkVfTk9ORVxcbiAgICAgIGRpc2NhcmQ7XFxuICAgICNlbmRpZlxcbiAgI2VuZGlmXFxuXFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcblxcbiAgLy8gVE9ET1xcbiAgLy8gdXYgdHJhbnNmb3JtXFxuXFxuICAvLyBUT0RPXFxuICAvLyB1diBhbmltYXRpb25cXG5cXG4gIC8vIG1haW4gY29sb3JcXG4gIGxldCBsaXRUZXh0dXJlQ29sb3I6IHZlYzRmID0gdGV4dHVyZVNhbXBsZShsaXRDb2xvclRleHR1cmUsIGxpdENvbG9yU2FtcGxlciwgaW5wdXQudGV4Y29vcmRfMCk7XFxuICBsZXQgbGl0Q29sb3JGYWN0b3I6IHZlYzRmID0gZ2V0X2xpdENvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIC8vIGFscGhhXFxuICB2YXIgYWxwaGEgPSAxLjA7XFxuXFxuICAjaWZkZWYgUk5fQUxQSEFURVNUX09OXFxuICAgIGFscGhhID0gbGl0VGV4dHVyZUNvbG9yLmEgKiBsaXRDb2xvckZhY3Rvci5hO1xcbiAgICBsZXQgY3V0b2ZmOiBmMzIgPSBnZXRfY3V0b2ZmKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgaWYgKGFscGhhIDwgY3V0b2ZmKSB7IGRpc2NhcmQ7IH1cXG4gICNlbGlmIGRlZmluZWQoUk5fQUxQSEFCTEVORF9PTilcXG4gICAgYWxwaGEgPSBsaXRUZXh0dXJlQ29sb3IuYSAqIGxpdENvbG9yRmFjdG9yLmE7XFxuICAjZW5kaWZcXG5cXG4gIGlmIChhbHBoYSA8IDAuMDEpIHtcXG4gICAgZGlzY2FyZDtcXG4gIH0gZWxzZSB7XFxuICAgIHJ0MC53ID0gYWxwaGE7XFxuICB9XFxuXFxuXFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICAjaWZkZWYgUk5fTVRPT05fT1VUTElORV9DT0xPUl9GSVhFRFxcbiAgICAgIGxldCBvdXRsaW5lQ29sb3I6IHZlYzNmID0gZ2V0X291dGxpbmVDb2xvcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgcnQwID0gdmVjNGYob3V0bGluZUNvbG9yLCBydDAudyk7XFxuXFxuICAgICAgcnQwID0gdmVjNChzcmdiVG9MaW5lYXIocnQwLnh5eiksIHJ0MC53KTtcXG4gICAgICByZXR1cm4gcnQwO1xcbiAgICAjZW5kaWZcXG4gICNlbmRpZlxcblxcbiAgLy8gdmlldyB2ZWN0b3JcXG4gIGxldCB2aWV3UG9zaXRpb246IHZlYzNmID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcbiAgbGV0IHZpZXdWZWN0b3I6IHZlYzNmID0gdmlld1Bvc2l0aW9uIC0gaW5wdXQucG9zaXRpb25faW5Xb3JsZC54eXo7XFxuXFxuICAvLyBOb3JtYWxcXG4gIHZhciBub3JtYWxfaW5Xb3JsZDogdmVjM2YgPSBub3JtYWxpemUoaW5wdXQubm9ybWFsX2luV29ybGQpO1xcbiAgI2lmZGVmIFJOX01UT09OX0hBU19CVU1QTUFQXFxuICAgIGxldCBub3JtYWw6IHZlYzNmID0gdGV4dHVyZVNhbXBsZShub3JtYWxUZXh0dXJlLCBub3JtYWxTYW1wbGVyLCBpbnB1dC50ZXhjb29yZF8wKS54eXogKiAyLjAgLSAxLjA7XFxuICAgIGxldCBUQk46IG1hdDN4MzxmMzI+ID0gZ2V0VEJOKG5vcm1hbF9pbldvcmxkLCBpbnB1dCwgdmlld1ZlY3RvciwgaW5wdXQudGV4Y29vcmRfMCwgaXNGcm9udCk7XFxuICAgIG5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKFRCTiAqIG5vcm1hbCk7XFxuICAjZW5kaWZcXG5cXG4gICNpZmRlZiBSTl9NVE9PTl9JU19PVVRMSU5FXFxuICAgIG5vcm1hbF9pbldvcmxkICo9IC0xLjA7XFxuICAjZW5kaWZcXG5cXG5cXG4gIC8vIExpZ2h0aW5nLCBEaXJlY3QgTGlnaHRcXG5cXG4gIGxldCBzaGFkb3dBdHRlbnVhdGlvbiA9IDEuMDtcXG4gIC8vIFRPRE86IHNoYWRvd21hcCBjb21wdXRhdGlvblxcblxcbiAgbGV0IHJlY2VpdmVTaGFkb3dSYXRlOiBmMzIgPSBnZXRfcmVjZWl2ZVNoYWRvd1JhdGUobWF0ZXJpYWxTSUQsIDApO1xcbiAgdmFyIGxpZ2h0QXR0ZW51YXRpb246IGYzMiA9IHNoYWRvd0F0dGVudWF0aW9uICogbWl4KDEuMCwgc2hhZG93QXR0ZW51YXRpb24sIHJlY2VpdmVTaGFkb3dSYXRlICogdGV4dHVyZVNhbXBsZShyZWNlaXZlU2hhZG93VGV4dHVyZSwgcmVjZWl2ZVNoYWRvd1NhbXBsZXIsIGlucHV0LnRleGNvb3JkXzApLnIpO1xcblxcbiAgbGV0IHNoYWRpbmdHcmFkZVJhdGU6IGYzMiA9IGdldF9zaGFkaW5nR3JhZGVSYXRlKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBzaGFkaW5nR3JhZGU6IGYzMiA9IDEuMCAtIHNoYWRpbmdHcmFkZVJhdGUgKiAoMS4wIC0gdGV4dHVyZVNhbXBsZShzaGFkaW5nR3JhZGVUZXh0dXJlLCBzaGFkaW5nR3JhZGVTYW1wbGVyLCBpbnB1dC50ZXhjb29yZF8wKS5yKTtcXG4gIGxldCBsaWdodENvbG9yQXR0ZW51YXRpb246IGYzMiA9IGdldF9saWdodENvbG9yQXR0ZW51YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcblxcbiAgbGV0IHNoYWRlQ29sb3JGYWN0b3I6IHZlYzNmID0gZ2V0X3NoYWRlQ29sb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgdmFyIHNoYWRlQ29sb3I6IHZlYzNmID0gc2hhZGVDb2xvckZhY3RvciAqIHRleHR1cmVTYW1wbGUoc2hhZGVDb2xvclRleHR1cmUsIHNoYWRlQ29sb3JTYW1wbGVyLCBpbnB1dC50ZXhjb29yZF8wKS54eXo7XFxuICBzaGFkZUNvbG9yID0gc3JnYlRvTGluZWFyKHNoYWRlQ29sb3IueHl6KTtcXG5cXG4gIHZhciBsaXRDb2xvcjogdmVjM2YgPSBsaXRDb2xvckZhY3Rvci54eXogKiBsaXRUZXh0dXJlQ29sb3IueHl6O1xcbiAgbGl0Q29sb3IgPSBzcmdiVG9MaW5lYXIobGl0Q29sb3IueHl6KTtcXG5cXG5cXG4gIGxldCBzaGFkZVNoaWZ0OiBmMzIgPSBnZXRfc2hhZGVTaGlmdChtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgc2hhZGVUb29ueTogZjMyID0gZ2V0X3NoYWRlVG9vbnkobWF0ZXJpYWxTSUQsIDApO1xcblxcbiAgdmFyIGxpZ2h0aW5nczogYXJyYXk8dmVjMzxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7Q29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXJ9ICovPjtcXG4gICNpZmRlZiBSTl9NVE9PTl9ERUJVR19MSVRTSEFERVJBVEVcXG4gICAgdmFyIGxpZ2h0SW50ZW5zaXRpZXNbLyogc2hhZGVyaXR5OiBAe0NvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyfSAqL106IGFycmF5PGYzMj47XFxuICAjZW5kaWZcXG4gIGxldCBsaWdodE51bWJlciA9IHUzMihnZXRfbGlnaHROdW1iZXIoMHUsIDB1KSk7XFxuICBmb3IgKHZhciBpID0gMHU7IGkgPCAvKiBzaGFkZXJpdHk6IEB7Q29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXJ9ICovOyBpKyspIHtcXG4gICAgaWYgKGkgPj0gbGlnaHROdW1iZXIpIHtcXG4gICAgICBicmVhaztcXG4gICAgfVxcblxcbiAgICAvLyBMaWdodFxcbiAgICBsZXQgbGlnaHQ6IExpZ2h0ID0gZ2V0TGlnaHQoaSwgaW5wdXQucG9zaXRpb25faW5Xb3JsZC54eXopO1xcblxcbiAgICAvLyBsaWdodEF0dGVudWF0aW9uICo9IGRpc3RhbmNlQXR0ZW51YXRpb24gKiBzcG90RWZmZWN0O1xcbiAgICBsZXQgZG90Tkw6IGYzMiA9IGRvdChsaWdodC5kaXJlY3Rpb24sIG5vcm1hbF9pbldvcmxkKTtcXG4gICAgdmFyIGxpZ2h0SW50ZW5zaXR5OiBmMzIgPSBkb3ROTCAqIDAuNSArIDAuNTsgLy8gZnJvbSBbLTEsICsxXSB0byBbMCwgMV1cXG4gICAgbGlnaHRJbnRlbnNpdHkgPSBsaWdodEludGVuc2l0eSAqIGxpZ2h0QXR0ZW51YXRpb247IC8vIFRPRE86IHJlY2VpdmUgc2hhZG93XFxuICAgIGxpZ2h0SW50ZW5zaXR5ID0gbGlnaHRJbnRlbnNpdHkgKiBzaGFkaW5nR3JhZGU7IC8vIGRhcmtlclxcbiAgICBsaWdodEludGVuc2l0eSA9IGxpZ2h0SW50ZW5zaXR5ICogMi4wIC0gMS4wOyAvLyBmcm9tIFswLCAxXSB0byBbLTEsICsxXVxcblxcbiAgICAvLyB0b29uZWQuIG1hcHBpbmcgZnJvbSBbbWluSW50ZW5zaXR5VGhyZXNob2xkLCBtYXhJbnRlbnNpdHlUaHJlc2hvbGRdIHRvIFswLCAxXVxcbiAgICBsZXQgbWF4SW50ZW5zaXR5VGhyZXNob2xkOiBmMzIgPSBtaXgoMS4wLCBzaGFkZVNoaWZ0LCBzaGFkZVRvb255KTtcXG4gICAgbGV0IG1pbkludGVuc2l0eVRocmVzaG9sZDogZjMyID0gc2hhZGVTaGlmdDtcXG4gICAgbGlnaHRJbnRlbnNpdHkgPSBjbGFtcCgobGlnaHRJbnRlbnNpdHkgLSBtaW5JbnRlbnNpdHlUaHJlc2hvbGQpIC8gbWF4KEVQU19DT0wsIChtYXhJbnRlbnNpdHlUaHJlc2hvbGQgLSBtaW5JbnRlbnNpdHlUaHJlc2hvbGQpKSwgMC4wLCAxLjApO1xcbiAgICAjaWZkZWYgUk5fTVRPT05fREVCVUdfTElUU0hBREVSQVRFXFxuICAgICAgbGlnaHRJbnRlbnNpdGllc1tpXSA9IGxpZ2h0SW50ZW5zaXR5O1xcbiAgICAjZW5kaWZcXG5cXG4gICAgLy8gQWxiZWRvIGNvbG9yXFxuICAgIHZhciBjb2w6IHZlYzNmID0gbWl4KHNoYWRlQ29sb3IsIGxpdENvbG9yLCBsaWdodEludGVuc2l0eSk7XFxuXFxuICAgIC8vIERpcmVjdCBMaWdodFxcbiAgICB2YXIgbGlnaHRpbmc6IHZlYzNmID0gbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eTtcXG4gICAgbGlnaHRpbmcgPSBtaXgobGlnaHRpbmcsIHZlYzMobWF4KEVQU19DT0wsIG1heChsaWdodGluZy54LCBtYXgobGlnaHRpbmcueSwgbGlnaHRpbmcueikpKSksIGxpZ2h0Q29sb3JBdHRlbnVhdGlvbik7IC8vIGNvbG9yIGF0dGVuXFxuXFxuXFxuICAgIGlmKGkgPiAwKXtcXG4gICAgICBsaWdodGluZyAqPSAwLjU7IC8vIGRhcmtlbiBpZiBhZGRpdGlvbmFsIGxpZ2h0LlxcbiAgICAgIGxpZ2h0aW5nICo9IG1pbigwLjAsIGRvdE5MKSArIDEuMDsgLy8gZGFya2VuIGRvdE5MIDwgMCBhcmVhIGJ5IHVzaW5nIGhhbGYgbGFtYmVydFxcbiAgICAgIC8vIGxpZ2h0aW5nICo9IHNoYWRvd0F0dGVudWF0aW9uOyAvLyBkYXJrZW4gaWYgcmVjZWl2aW5nIHNoYWRvd1xcbiAgICAgICNpZmRlZiBSTl9BTFBIQUJMRU5EX09OXFxuICAgICAgICBsaWdodGluZyAqPSBzdGVwKDAuMCwgZG90TkwpOyAvLyBkYXJrZW4gaWYgdHJhbnNwYXJlbnQuIEJlY2F1c2UgVW5pdHkncyB0cmFuc3BhcmVudCBtYXRlcmlhbCBjYW4ndCByZWNlaXZlIHNoYWRvd0F0dGVudWF0aW9uLlxcbiAgICAgICNlbmRpZlxcbiAgICB9XFxuXFxuICAgIGNvbCAqPSBsaWdodGluZztcXG4gICAgbGlnaHRpbmdzW2ldID0gbGlnaHRpbmc7XFxuXFxuICAgIHJ0MCArPSB2ZWM0Zihjb2wsIDAuMCk7XFxuXFxuICAgIGxpZ2h0QXR0ZW51YXRpb24gPSAxLjA7XFxuICB9XFxuXFxuXFxuICAvLyBJbmRpcmVjdCBMaWdodFxcbiAgdmFyIGluZGlyZWN0TGlnaHRpbmc6IHZlYzNmID0gZ2V0X2FtYmllbnRDb2xvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBpbmRpcmVjdExpZ2h0aW5nID0gc3JnYlRvTGluZWFyKGluZGlyZWN0TGlnaHRpbmcpO1xcbiAgaW5kaXJlY3RMaWdodGluZyA9IG1peChpbmRpcmVjdExpZ2h0aW5nLCB2ZWMzZihtYXgoRVBTX0NPTCwgbWF4KGluZGlyZWN0TGlnaHRpbmcueCwgbWF4KGluZGlyZWN0TGlnaHRpbmcueSwgaW5kaXJlY3RMaWdodGluZy56KSkpKSwgbGlnaHRDb2xvckF0dGVudWF0aW9uKTsgLy8gY29sb3IgYXR0ZW5cXG4gIC8vIFRPRE86IHVzZSBTaGFkZUlyYWQgaW4gd3d3LnBwc2xvYW4ub3JnL3B1YmxpY2F0aW9ucy9TdHVwaWRTSDM2LnBkZlxcblxcbiAgcnQwICs9IHZlYzRmKGluZGlyZWN0TGlnaHRpbmcgKiBsaXRDb2xvciwgMC4wKTtcXG4gIHJ0MCA9IHZlYzRmKG1pbihydDAueHl6LCBsaXRDb2xvciksIHJ0MC53KTsgLy8gY29tbWVudCBvdXQgaWYgeW91IHdhbnQgdG8gUEJSIGFic29sdXRlbHkuXFxuXFxuXFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICAjaWZkZWYgUk5fTVRPT05fT1VUTElORV9DT0xPUl9NSVhFRFxcbiAgICAgIHZhciBvdXRsaW5lQ29sb3I6IHZlYzNmID0gZ2V0X291dGxpbmVDb2xvcihtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgb3V0bGluZUNvbG9yID0gc3JnYlRvTGluZWFyKG91dGxpbmVDb2xvcik7XFxuICAgICAgbGV0IG91dGxpbmVMaWdodGluZ01peDogZjMyID0gZ2V0X291dGxpbmVMaWdodGluZ01peChtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgcnQwID0gdmVjNGYob3V0bGluZUNvbG9yICogbWl4KHZlYzNmKDEuMCksIHJ0MC54eXosIG91dGxpbmVMaWdodGluZ01peCksIHJ0MC53KTtcXG4gICAgI2VuZGlmXFxuICAjZWxzZVxcbiAgICBsZXQgdmlld0RpcmVjdGlvbjogdmVjM2YgPSBub3JtYWxpemUodmlld1ZlY3Rvcik7XFxuXFxuICAgIGxldCByaW1GcmVzbmVsUG93ZXI6IGYzMiA9IGdldF9yaW1GcmVzbmVsUG93ZXIobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBsZXQgcmltTGlmdDogZjMyID0gZ2V0X3JpbUxpZnQobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBsZXQgcmltQ29sb3JGYWN0b3I6IHZlYzNmID0gZ2V0X3JpbUNvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgbGV0IHJpbVRleHR1cmVDb2xvcjogdmVjM2YgPSB0ZXh0dXJlU2FtcGxlKHJpbVRleHR1cmUsIHJpbVNhbXBsZXIsIGlucHV0LnRleGNvb3JkXzApLnh5ejtcXG4gICAgbGV0IHJpbUNvbG9yOiB2ZWMzZiA9IHNyZ2JUb0xpbmVhcihyaW1Db2xvckZhY3RvciAqIHJpbVRleHR1cmVDb2xvcik7XFxuICAgIGxldCByaW06IHZlYzNmID0gcG93KGNsYW1wKDEuMCAtIGRvdChub3JtYWxfaW5Xb3JsZCwgdmlld0RpcmVjdGlvbikgKyByaW1MaWZ0LCAwLjAsIDEuMCksIHJpbUZyZXNuZWxQb3dlcikgKiByaW1Db2xvcjtcXG5cXG4gICAgdmFyIHN0YXRpY1JpbUxpZ2h0aW5nID0gMS4wO1xcbiAgICBsZXQgcmltTGlnaHRpbmdNaXg6IGYzMiA9IGdldF9yaW1MaWdodGluZ01peChtYXRlcmlhbFNJRCwgMCk7XFxuICAgIGZvciAodmFyIGkgPSAwdTsgaSA8IC8qIHNoYWRlcml0eTogQHtDb25maWcubWF4TGlnaHROdW1iZXJJblNoYWRlcn0gKi91OyBpKyspIHtcXG4gICAgICBpZiAoaSA+PSBsaWdodE51bWJlcikgeyBicmVhazsgfVxcblxcbiAgICAgIGlmIChpID4gMCkgeyBzdGF0aWNSaW1MaWdodGluZyA9IDAuMDsgfVxcblxcbiAgICAgIGxldCByaW1MaWdodGluZzogdmVjM2YgPSBtaXgodmVjM2Yoc3RhdGljUmltTGlnaHRpbmcpLCBsaWdodGluZ3NbaV0sIHZlYzNmKHJpbUxpZ2h0aW5nTWl4KSk7XFxuICAgICAgcnQwICs9IHZlYzRmKHJpbSAqIHJpbUxpZ2h0aW5nLCAwLjApO1xcbiAgICB9XFxuXFxuICAgIC8vIGFkZGl0aXZlIG1hdGNhcFxcbiAgICBsZXQgY2FtZXJhVXA6IHZlYzNmID0gZ2V0X2NhbWVyYVVwKDB1LCAwdSk7IC8vc29sbyBkYXR1bVxcbiAgICBsZXQgd29ybGRWaWV3VXA6IHZlYzNmID0gbm9ybWFsaXplKGNhbWVyYVVwIC0gdmlld0RpcmVjdGlvbiAqIGRvdCh2aWV3RGlyZWN0aW9uLCBjYW1lcmFVcCkpO1xcbiAgICBsZXQgd29ybGRWaWV3UmlnaHQ6IHZlYzNmID0gbm9ybWFsaXplKGNyb3NzKHZpZXdEaXJlY3Rpb24sIHdvcmxkVmlld1VwKSk7XFxuICAgIGxldCBtYXRjYXBVdjogdmVjMmYgPSB2ZWMyZihkb3Qod29ybGRWaWV3UmlnaHQsIG5vcm1hbF9pbldvcmxkKSwgZG90KHdvcmxkVmlld1VwLCBub3JtYWxfaW5Xb3JsZCkpICogMC41ICsgMC41O1xcbiAgICBsZXQgbWF0Q2FwQ29sb3I6IHZlYzNmID0gc3JnYlRvTGluZWFyKHRleHR1cmVTYW1wbGUobWF0Q2FwVGV4dHVyZSwgbWF0Q2FwU2FtcGxlciwgbWF0Y2FwVXYpLnh5eik7XFxuICAgIHJ0MCArPSB2ZWM0ZihtYXRDYXBDb2xvciwgMC4wKTtcXG5cXG5cXG4gICAgLy8gRW1pc3Npb25cXG4gICAgbGV0IGVtaXNzaW9uQ29sb3I6IHZlYzNmID0gZ2V0X2VtaXNzaW9uQ29sb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgICBsZXQgZW1pc3Npb246IHZlYzNmID0gc3JnYlRvTGluZWFyKHRleHR1cmVTYW1wbGUoZW1pc3Npb25UZXh0dXJlLCBlbWlzc2lvblNhbXBsZXIsIGlucHV0LnRleGNvb3JkXzApLnh5eikgKiBlbWlzc2lvbkNvbG9yO1xcbiAgICBydDAgKz0gdmVjNGYoZW1pc3Npb24sIDAuMCk7XFxuICAjZW5kaWZcXG5cXG5cXG4gIC8vIGRlYnVnXFxuICAjaWZkZWYgUk5fTVRPT05fREVCVUdfTk9STUFMXFxuICAgIHJ0MCA9IHZlYzRmKG5vcm1hbF9pbldvcmxkICogMC41ICsgMC41LCBhbHBoYSk7XFxuXFxuICAgIHJ0MCA9IHZlYzRmKHNyZ2JUb0xpbmVhcihydDAueHl6KSwgcnQwLncpO1xcbiAgICByZXR1cm4gcnQwO1xcbiAgI2VsaWYgZGVmaW5lZChSTl9NVE9PTl9ERUJVR19MSVRTSEFERVJBVEUpXFxuICAgIHJ0MCA9IHZlYzRmKDAuMCk7XFxuICAgIGZvciAodmFyIGkgPSAwdTsgaSA8IC8qIHNoYWRlcml0eTogQHtDb25maWcubWF4TGlnaHROdW1iZXJJblNoYWRlcn0gKi91OyBpKyspIHtcXG4gICAgICBpZiAoaSA+PSBsaWdodE51bWJlcikgeyBicmVhazsgfVxcbiAgICAgIHJ0MCArPSB2ZWM0ZihsaWdodEludGVuc2l0aWVzW2ldICogbGlnaHRpbmdzW2ldLCBhbHBoYSk7XFxuICAgIH1cXG5cXG4gICAgcnQwID0gdmVjNGYoc3JnYlRvTGluZWFyKHJ0MC54eXopLCBydDAudyk7XFxuICAgIHJldHVybiBydDA7XFxuICAjZW5kaWZcXG5cXG5cXG4gIC8vIFdpcmVmcmFtZVxcbiAgbGV0IHRocmVzaG9sZCA9IDAuMDAxO1xcbiAgbGV0IHdpcmVmcmFtZTogdmVjM2YgPSBnZXRfd2lyZWZyYW1lKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCB3aXJlZnJhbWVXaWR0aElubmVyID0gd2lyZWZyYW1lLno7XFxuICBsZXQgd2lyZWZyYW1lV2lkdGhSZWxhdGl2ZVNjYWxlID0gMS4wO1xcbiAgaWYgKHdpcmVmcmFtZS54ID4gMC41ICYmIHdpcmVmcmFtZS55IDwgMC41KSB7XFxuICAgIHJ0MC5hID0gMC4wO1xcbiAgfVxcbiAgdmFyIHdpcmVmcmFtZVJlc3VsdCA9IHJ0MDtcXG4gIGxldCB3aXJlZnJhbWVDb2xvciA9IHZlYzRmKDAuMiwgMC43NSwgMC4wLCAxLjApO1xcbiAgbGV0IGVkZ2VSYXRpbzogZjMyID0gZWRnZV9yYXRpbyhpbnB1dC5iYXJ5Q2VudHJpY0Nvb3JkLCB3aXJlZnJhbWVXaWR0aElubmVyLCB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUpO1xcbiAgbGV0IGVkZ2VSYXRpb01vZGlmaWVkOiBmMzIgPSBtaXgoc3RlcCh0aHJlc2hvbGQsIGVkZ2VSYXRpbyksIGNsYW1wKGVkZ2VSYXRpbyo0LjAsIDAuMCwgMS4wKSwgd2lyZWZyYW1lV2lkdGhJbm5lciAvIHdpcmVmcmFtZVdpZHRoUmVsYXRpdmVTY2FsZS80LjApO1xcbiAgLy8gaWYgcjAuYSBpcyAwLjAsIGl0IGlzIHdpcmVmcmFtZSBub3Qgb24gc2hhZGVkXFxuICB3aXJlZnJhbWVSZXN1bHQgPSB2ZWM0Zih3aXJlZnJhbWVDb2xvci5yZ2IgKiBlZGdlUmF0aW9Nb2RpZmllZCArIHJ0MC5yZ2IgKiAoMS4wIC0gZWRnZVJhdGlvTW9kaWZpZWQpLCB3aXJlZnJhbWVSZXN1bHQuYSk7XFxuICB3aXJlZnJhbWVSZXN1bHQuYSA9IG1heChydDAuYSwgd2lyZWZyYW1lQ29sb3IuYSAqIG1peChlZGdlUmF0aW9Nb2RpZmllZCwgcG93KGVkZ2VSYXRpb01vZGlmaWVkLCAxMDAuMCksIHdpcmVmcmFtZVdpZHRoSW5uZXIgLyB3aXJlZnJhbWVXaWR0aFJlbGF0aXZlU2NhbGUvMS4wKSk7XFxuXFxuICBpZiAod2lyZWZyYW1lLnggPiAwLjUpIHtcXG4gICAgcnQwID0gd2lyZWZyYW1lUmVzdWx0O1xcbiAgICBpZiAod2lyZWZyYW1lLnkgPCAwLjUgJiYgcnQwLmEgPT0gMC4wKSB7XFxuICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgfVxcblxcbiAgbGV0IG1ha2VPdXRwdXRTcmdiID0gZ2V0X21ha2VPdXRwdXRTcmdiKG1hdGVyaWFsU0lELCAwKTtcXG4gIHJ0MCA9IHZlYzRmKHNlbGVjdChydDAucmdiLCBsaW5lYXJUb1NyZ2IocnQwLnJnYiksIG1ha2VPdXRwdXRTcmdiKSwgcnQwLncpO1xcblxcbiAgcmV0dXJuIHJ0MDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG4vLyBUaGlzIHNoYWRlciBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vU2FudGFyaC9NVG9vblxcblxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcblxcbmZuIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZSggcXVhdGVybmlvbjogdmVjNDxmMzI+LCB0cmFuc2xhdGlvbjogdmVjMzxmMzI+LCBzY2FsZTogdmVjMzxmMzI+ICkgLT4gbWF0NHg0PGYzMj4ge1xcbiAgbGV0IHEgPSBxdWF0ZXJuaW9uO1xcbiAgbGV0IHQgPSB0cmFuc2xhdGlvbjtcXG5cXG4gIGxldCBzeCA9IHEueCAqIHEueDtcXG4gIGxldCBzeSA9IHEueSAqIHEueTtcXG4gIGxldCBzeiA9IHEueiAqIHEuejtcXG4gIGxldCBjeCA9IHEueSAqIHEuejtcXG4gIGxldCBjeSA9IHEueCAqIHEuejtcXG4gIGxldCBjeiA9IHEueCAqIHEueTtcXG4gIGxldCB3eCA9IHEudyAqIHEueDtcXG4gIGxldCB3eSA9IHEudyAqIHEueTtcXG4gIGxldCB3eiA9IHEudyAqIHEuejtcXG5cXG4gIGxldCBtYXQgPSBtYXQ0eDQoXFxuICAgIDEuMCAtIDIuMCAqIChzeSArIHN6KSwgMi4wICogKGN6ICsgd3opLCAyLjAgKiAoY3kgLSB3eSksIDAuMCxcXG4gICAgMi4wICogKGN6IC0gd3opLCAxLjAgLSAyLjAgKiAoc3ggKyBzeiksIDIuMCAqIChjeCArIHd4KSwgMC4wLFxcbiAgICAyLjAgKiAoY3kgKyB3eSksIDIuMCAqIChjeCAtIHd4KSwgMS4wIC0gMi4wICogKHN4ICsgc3kpLCAwLjAsXFxuICAgIHQueCwgdC55LCB0LnosIDEuMFxcbiAgKTtcXG5cXG4gIGxldCB1bmlmb3JtU2NhbGVNYXQgPSBtYXQ0eDQoXFxuICAgIHNjYWxlLngsIDAuMCwgMC4wLCAwLjAsXFxuICAgIDAuMCwgc2NhbGUueSwgMC4wLCAwLjAsXFxuICAgIDAuMCwgMC4wLCBzY2FsZS56LCAwLjAsXFxuICAgIDAuMCwgMC4wLCAwLjAsIDEuMFxcbiAgKTtcXG5cXG4gIGxldCBtYXQ0NCA9IG1hdCp1bmlmb3JtU2NhbGVNYXQ7XFxuICByZXR1cm4gbWF0NDQ7XFxuXFxufVxcblxcbmZuIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjX3h5OiB2ZWMyPGYzMj4sIGNyaXRlcmlhOiBmMzIpIC0+IHZlYzQ8ZjMyPiB7XFxuXFxuICB2YXIgcjogZjMyO1xcbiAgdmFyIGc6IGYzMjtcXG4gIHZhciBiOiBmMzI7XFxuICB2YXIgYTogZjMyO1xcblxcbiAgbGV0IGl4ID0gZmxvb3IodmVjX3h5LnggKiBjcml0ZXJpYSk7XFxuICBsZXQgdjF4ID0gaXggLyBjcml0ZXJpYTtcXG4gIGxldCB2MXkgPSBpeCAtIGZsb29yKHYxeCkgKiBjcml0ZXJpYTtcXG5cXG4gIHIgPSAoIHYxeCArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuICBnID0gKCB2MXkgKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcblxcbiAgbGV0IGl5ID0gZmxvb3IoIHZlY194eS55ICogY3JpdGVyaWEpO1xcbiAgbGV0IHYyeCA9IGl5IC8gY3JpdGVyaWE7XFxuICBsZXQgdjJ5ID0gaXkgLSBmbG9vcih2MngpICogY3JpdGVyaWE7XFxuXFxuICBiID0gKCB2MnggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgYSA9ICggdjJ5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIHIgLT0gMS4wL2NyaXRlcmlhO1xcbiAgZyAtPSAxLjAvY3JpdGVyaWE7XFxuICBiIC09IDEuMC9jcml0ZXJpYTtcXG4gIGEgLT0gMS4wL2NyaXRlcmlhO1xcblxcbiAgciA9IHIqMi4wLTEuMDtcXG4gIGcgPSBnKjIuMC0xLjA7XFxuICBiID0gYioyLjAtMS4wO1xcbiAgYSA9IGEqMi4wLTEuMDtcXG5cXG4gIHJldHVybiB2ZWM0PGYzMj4ociwgZywgYiwgYSk7XFxufVxcblxcbmZuIGdldF9ib25lTWF0cml4QXNNYXQ0eDQoc2tlbGV0YWxDb21wb25lbnRTSUQ6IHUzMiwgam9pbnQ6IHUzMikgLT4gbWF0NHg0PGYzMj4ge1xcbiAgbGV0IG1hdDQzOiBtYXQ0eDM8ZjMyPiA9IGdldF9ib25lTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludCk7XFxuICByZXR1cm4gbWF0NHg0PGYzMj4oXFxuICAgIHZlYzQ8ZjMyPihtYXQ0M1swXSwgMC4wKSxcXG4gICAgdmVjNDxmMzI+KG1hdDQzWzFdLCAwLjApLFxcbiAgICB2ZWM0PGYzMj4obWF0NDNbMl0sIDAuMCksXFxuICAgIHZlYzQ8ZjMyPihtYXQ0M1szXSwgMS4wKVxcbiAgKTtcXG59XFxuXFxuZm4gZ2V0U2tpbk1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRDogdTMyLCBqb2ludDogdmVjNDx1MzI+LCB3ZWlnaHQ6IHZlYzQ8ZjMyPikgLT4gbWF0NHg0PGYzMj4ge1xcblxcbiNpZmRlZiBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuICB2YXIgc2tpbk1hdDogbWF0NHg0PGYzMj4gPSB3ZWlnaHQueCAqIGdldF9ib25lTWF0cml4QXNNYXQ0eDQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LngpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueSAqIGdldF9ib25lTWF0cml4QXNNYXQ0eDQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnkpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueiAqIGdldF9ib25lTWF0cml4QXNNYXQ0eDQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnopO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQudyAqIGdldF9ib25lTWF0cml4QXNNYXQ0eDQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LncpO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyKVxcbiAgbGV0IGNyaXRlcmlhID0gdmVjMjxmMzI+KDQwOTYuMCwgNDA5Ni4wKTtcXG5cXG4gIGxldCB0cV94ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC54KTtcXG4gIGxldCBzcV94ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LngpO1xcbiAgdmFyIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfeC53LCBzcV94LncpLCBjcml0ZXJpYS54KTtcXG4gIHZhciBza2luTWF0OiBtYXQ0eDQ8ZjMyPiA9IHdlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3gueHl6LCBzcV94Lnh5eik7XFxuXFxuICBsZXQgdHFfeSA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueSk7XFxuICBsZXQgc3FfeSA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC55KTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfeS53LCBzcV95LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfeS54eXosIHNxX3kueHl6KTtcXG5cXG4gIGxldCB0cV96ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC56KTtcXG4gIGxldCBzcV96ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnopO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV96LncsIHNxX3oudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV96Lnh5eiwgc3Ffei54eXopO1xcblxcbiAgbGV0IHRxX3cgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LncpO1xcbiAgbGV0IHNxX3cgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQudyk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3cudywgc3Ffdy53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IHdlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3cueHl6LCBzcV93Lnh5eik7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDJfT0xEKVxcbiAgbGV0IHRzX3ggPSBnZXRfYm9uZVRyYW5zbGF0ZVNjYWxlKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC54KTtcXG4gIHZhciBza2luTWF0OiBtYXQ0eDQ8ZjMyPiA9IHdlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIGxldCB0c195ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueSk7XFxuICBza2luTWF0ICs9IHdlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnkpLCB0c195Lnh5eiwgdmVjMyh0c195LncpKTtcXG4gIGxldCB0c196ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueik7XFxuICBza2luTWF0ICs9IHdlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnopLCB0c196Lnh5eiwgdmVjMyh0c196LncpKTtcXG4gIGxldCB0c193ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQudyk7XFxuICBza2luTWF0ICs9IHdlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICBnZXRfYm9uZVF1YXRlcm5pb24oc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LncpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMSlcXG4gIGxldCBib25lQ29tcHJlc3NlZENodW5rc1ggPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueCk7XFxuICBsZXQgYm9uZUNvbXByZXNzZWRDaHVua3NZID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnkpO1xcbiAgbGV0IGJvbmVDb21wcmVzc2VkQ2h1bmtzWiA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC56KTtcXG4gIGxldCBib25lQ29tcHJlc3NlZENodW5rc1cgPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQudyk7XFxuXFxuICBsZXQgY3JpdGVyaWEgPSB2ZWMyPGYzMj4oNDA5Ni4wLCA0MDk2LjApO1xcbiAgbGV0IGJvbmVDb21wcmVzc2VkSW5mbyA9IGdldF9ib25lQ29tcHJlc3NlZEluZm8oMC4wLCAwKTtcXG5cXG4gIGxldCB0c194ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1guencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHZhciBza2luTWF0OiBtYXQ0eDQ8ZjMyPiA9IHdlaWdodC54ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWC54eSwgY3JpdGVyaWEueCksIHRzX3gueHl6LCB2ZWMzKHRzX3gudykpO1xcbiAgbGV0IHRzX3kgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWS56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1kueHksIGNyaXRlcmlhLngpLCB0c195Lnh5eiwgdmVjMyh0c195LncpKTtcXG4gIGxldCB0c196ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1ouencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NaLnh5LCBjcml0ZXJpYS54KSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICBsZXQgdHNfdyA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NXLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IHdlaWdodC53ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzVy54eSwgY3JpdGVyaWEueCksIHRzX3cueHl6LCB2ZWMzKHRzX3cudykpO1xcbiNlbmRpZlxcbiAgcmV0dXJuIHNraW5NYXQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHRvTm9ybWFsTWF0cml4KG06IG1hdDR4NDxmMzI+KSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgYTAwID0gbVswXVswXTtcXG4gIGxldCBhMDEgPSBtWzBdWzFdO1xcbiAgbGV0IGEwMiA9IG1bMF1bMl07XFxuICBsZXQgYTAzID0gbVswXVszXTtcXG4gIGxldCBhMTAgPSBtWzFdWzBdO1xcbiAgbGV0IGExMSA9IG1bMV1bMV07XFxuICBsZXQgYTEyID0gbVsxXVsyXTtcXG4gIGxldCBhMTMgPSBtWzFdWzNdO1xcbiAgbGV0IGEyMCA9IG1bMl1bMF07XFxuICBsZXQgYTIxID0gbVsyXVsxXTtcXG4gIGxldCBhMjIgPSBtWzJdWzJdO1xcbiAgbGV0IGEyMyA9IG1bMl1bM107XFxuICBsZXQgYTMwID0gbVszXVswXTtcXG4gIGxldCBhMzEgPSBtWzNdWzFdO1xcbiAgbGV0IGEzMiA9IG1bM11bMl07XFxuICBsZXQgYTMzID0gbVszXVszXTtcXG5cXG4gIGxldCBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XFxuICBsZXQgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xcbiAgbGV0IGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcXG4gIGxldCBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XFxuICBsZXQgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xcbiAgbGV0IGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcXG4gIGxldCBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XFxuICBsZXQgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xcbiAgbGV0IGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcXG4gIGxldCBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XFxuICBsZXQgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xcbiAgbGV0IGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcXG5cXG4gIGxldCBkZXRlcm1pbmFudFZhbCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcXG5cXG4gIHJldHVybiBtYXQzeDM8ZjMyPihcXG4gICAgKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgLyBkZXRlcm1pbmFudFZhbCxcXG4gICAgKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgLyBkZXRlcm1pbmFudFZhbFxcbiAgKTtcXG59XFxuXFxuc3RydWN0IEdlb21ldG9yeU91dHB1dCB7XFxuICBub3JtYWxNYXRyaXg6IG1hdDN4MzxmMzI+LFxcbiAgcG9zaXRpb25faW5Xb3JsZDogdmVjNDxmMzI+LFxcbiAgbm9ybWFsX2luV29ybGQ6IHZlYzM8ZjMyPixcXG4gIGlzU2tpbm5pbmc6IGJvb2wsXFxufVxcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbmZuIHNraW5uaW5nKFxcbiAgc2tlbGV0YWxDb21wb25lbnRTSUQ6IHUzMixcXG4gIGluTm9ybWFsTWF0cml4OiBtYXQzeDM8ZjMyPixcXG4gIGluUG9zaXRpb25faW5Mb2NhbDogdmVjMzxmMzI+LFxcbiAgaW5Ob3JtYWxfaW5Mb2NhbDogdmVjMzxmMzI+LFxcbiAgam9pbnQ6IHZlYzQ8dTMyPixcXG4gIHdlaWdodDogdmVjNDxmMzI+LFxcbiAgKSAtPiBHZW9tZXRvcnlPdXRwdXRcXG57XFxuICB2YXIgb3V0cHV0OiBHZW9tZXRvcnlPdXRwdXQ7XFxuICBsZXQgc2tpbk1hdCA9IGdldFNraW5NYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LCB3ZWlnaHQpO1xcbiAgb3V0cHV0LnBvc2l0aW9uX2luV29ybGQgPSBza2luTWF0ICogdmVjNDxmMzI+KGluUG9zaXRpb25faW5Mb2NhbCwgMS4wKTtcXG4gIG91dHB1dC5ub3JtYWxNYXRyaXggPSB0b05vcm1hbE1hdHJpeChza2luTWF0KTtcXG4gIG91dHB1dC5ub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShvdXRwdXQubm9ybWFsTWF0cml4ICogaW5Ob3JtYWxfaW5Mb2NhbCk7XFxuICBvdXRwdXQuaXNTa2lubmluZyA9IHRydWU7XFxuXFxuICByZXR1cm4gb3V0cHV0O1xcbn1cXG4jZW5kaWZcXG5cXG5cXG5mbiBwcm9jZXNzR2VvbWV0cnlXaXRoTW9ycGhpbmdBbmRTa2lubmluZyhcXG4gIHNrZWxldGFsQ29tcG9uZW50U0lEOiBpMzIsXFxuICBibGVuZFNoYXBlQ29tcG9uZW50U0lEOiB1MzIsXFxuICB3b3JsZE1hdHJpeDogbWF0NHg0PGYzMj4sXFxuICB2aWV3TWF0cml4OiBtYXQ0eDQ8ZjMyPixcXG4gIGlzQmlsbGJvYXJkOiBib29sLFxcbiAgaW5Ob3JtYWxNYXRyaXg6IG1hdDN4MzxmMzI+LFxcbiAgaW5Qb3NpdGlvbl9pbkxvY2FsOiB2ZWMzPGYzMj4sXFxuICBpbk5vcm1hbF9pbkxvY2FsOiB2ZWMzPGYzMj4sXFxuICBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWM0PGYzMj4sXFxuICBqb2ludDogdmVjNDx1MzI+LFxcbiAgd2VpZ2h0OiB2ZWM0PGYzMj4sXFxuKSAtPiBHZW9tZXRvcnlPdXRwdXQge1xcbiAgdmFyIG91dHB1dDogR2VvbWV0b3J5T3V0cHV0O1xcblxcbiAgdmFyIHBvc2l0aW9uX2luTG9jYWw6IHZlYzM8ZjMyPjtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIGlmIChfbW9ycGhUYXJnZXROdW1iZXIgPT0gMHUpIHtcXG4jZW5kaWZcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGluUG9zaXRpb25faW5Mb2NhbDtcXG4jaWZkZWYgUk5fSVNfTU9SUEhJTkdcXG4gIH0gZWxzZSB7XFxuICAgIGxldCB2ZXJ0ZXhJZHggPSB1MzIoYmFyeUNlbnRyaWNDb29yZC53KTtcXG4gICAgcG9zaXRpb25faW5Mb2NhbCA9IGdldF9wb3NpdGlvbih2ZXJ0ZXhJZHgsIGluUG9zaXRpb25faW5Mb2NhbCwgYmxlbmRTaGFwZUNvbXBvbmVudFNJRCk7XFxuICB9XFxuI2VuZGlmXFxuXFxuICB2YXIgd29ybGRNYXRyaXhJbm5lciA9IHdvcmxkTWF0cml4O1xcblxcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgaWYgKHNrZWxldGFsQ29tcG9uZW50U0lEID49IDApIHtcXG4gICAgb3V0cHV0ID0gc2tpbm5pbmcodTMyKHNrZWxldGFsQ29tcG9uZW50U0lEKSwgaW5Ob3JtYWxNYXRyaXgsIHBvc2l0aW9uX2luTG9jYWwsIGluTm9ybWFsX2luTG9jYWwsIGpvaW50LCB3ZWlnaHQpO1xcbiAgfSBlbHNlIHtcXG4jZW5kaWZcXG4gICAgb3V0cHV0Lm5vcm1hbE1hdHJpeCA9IGluTm9ybWFsTWF0cml4O1xcbiAgICBvdXRwdXQucG9zaXRpb25faW5Xb3JsZCA9IHdvcmxkTWF0cml4SW5uZXIgKiB2ZWM0KHBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICAgIG91dHB1dC5ub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbk5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiAgICBvdXRwdXQuaXNTa2lubmluZyA9IGZhbHNlO1xcbiNpZmRlZiBSTl9JU19TS0lOTklOR1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgcmV0dXJuIG91dHB1dDtcXG59XFxuXFxuXFxuQHZlcnRleFxcbmZuIG1haW4oXFxuI2lmZGVmIFJOX1VTRV9JTlNUQU5DRVxcbiAgQGxvY2F0aW9uKDgpIGluc3RhbmNlX2lkczogdmVjNDxmMzI+LFxcbiNlbmRpZlxcblxcblxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fRkxPQVRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fSU5UXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb246IHZlYzM8aTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1BPU0lUSU9OX1VJTlRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzx1MzI+LFxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfTk9STUFMXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsOiB2ZWMzPGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBAbG9jYXRpb24oMikgdGFuZ2VudDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMFxcbiAgQGxvY2F0aW9uKDMpIHRleGNvb3JkXzA6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzFcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xOiB2ZWMyPGYzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX0ZMT0FUXFxuICBAbG9jYXRpb24oNSkgY29sb3JfMDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQ09MT1JfMF9JTlRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PGkzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX1VJTlRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PHUzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9KT0lOVFNfMFxcbiAgQGxvY2F0aW9uKDYpIGpvaW50c18wOiB2ZWM0PHUzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9XRUlHSFRTXzBcXG4gIEBsb2NhdGlvbig3KSB3ZWlnaHRzXzA6IHZlYzQ8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0JBUllfQ0VOVFJJQ19DT09SRFxcbiAgQGxvY2F0aW9uKDEwKSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8yXFxuICBAbG9jYXRpb24oMTEpIHRleGNvb3JkXzI6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG4gIEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SWR4IDogdTMyLFxcblxcblxcbikgLT4gVmVydGV4T3V0cHV0IHtcXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICAjaWZkZWYgUk5fTVRPT05fT1VUTElORV9OT05FXFxuICAgICAgb3V0cHV0LnBvc2l0aW9uID0gdmVjNDxmMzI+KDAuMCwgMC4wLCAwLjAsIDEuMCk7XFxuICAgICAgcmV0dXJuIG91dHB1dDtcXG4gICAgI2VuZGlmXFxuICAjZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX05PUk1BTFxcbiNlbHNlXFxuICBsZXQgbm9ybWFsID0gdmVjMzxmMzI+KDAuMCwgMC4wLCAwLjApO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfSk9JTlRTXzBcXG4gIGxldCBqb2ludCA9IGpvaW50c18wO1xcbiNlbHNlXFxuICBsZXQgam9pbnQgPSB2ZWM0PHUzMj4oMCwgMCwgMCwgMCk7XFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9XRUlHSFRTXzBcXG4gIGxldCB3ZWlnaHQgPSB3ZWlnaHRzXzA7XFxuI2Vsc2VcXG4gIGxldCB3ZWlnaHQgPSB2ZWM0PGYzMj4oMC4wLCAwLjAsIDAuMCwgMC4wKTtcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0JBUllfQ0VOVFJJQ19DT09SRFxcbiNlbHNlXFxuICBsZXQgYmFyeUNlbnRyaWNDb29yZCA9IHZlYzQ8ZjMyPigwLjAsIDAuMCwgMC4wLCAwLjApO1xcbiNlbmRpZlxcblxcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIGxldCBpbnN0YW5jZUlkID0gdTMyKGluc3RhbmNlX2lkcy54KTtcXG4gIGxldCB3b3JsZE1hdHJpeCA9IGdldF93b3JsZE1hdHJpeChpbnN0YW5jZUlkKTtcXG4gIGxldCBub3JtYWxNYXRyaXggPSBnZXRfbm9ybWFsTWF0cml4KGluc3RhbmNlSWQpO1xcbiAgbGV0IHZpZXdNYXRyaXggPSBnZXRfdmlld01hdHJpeChjYW1lcmFTSUQsIDApO1xcbiAgbGV0IHNrZWxldGFsQ29tcG9uZW50U0lEID0gaTMyKGluc3RhbmNlX2lkcy55KTtcXG4gIGxldCBibGVuZFNoYXBlQ29tcG9uZW50U0lEID0gdTMyKGluc3RhbmNlX2lkcy56KTtcXG4gIGxldCBnZW9tID0gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICBibGVuZFNoYXBlQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgZmFsc2UsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgcG9zaXRpb24sXFxuICAgIG5vcm1hbCxcXG4gICAgYmFyeUNlbnRyaWNDb29yZCxcXG4gICAgam9pbnQsXFxuICAgIHdlaWdodFxcbiAgKTtcXG5cXG4gIGxldCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5cXG4gIG91dHB1dC5wb3NpdGlvbl9pbldvcmxkID0gZ2VvbS5wb3NpdGlvbl9pbldvcmxkLnh5ejtcXG4gIG91dHB1dC5ub3JtYWxfaW5Xb3JsZCA9IGdlb20ubm9ybWFsX2luV29ybGQ7XFxuICBvdXRwdXQubm9ybWFsX2luVmlldyA9ICh2aWV3TWF0cml4ICogdmVjNChnZW9tLm5vcm1hbF9pbldvcmxkLCAwLjApKS54eXo7XFxuXFxuICAjaWZkZWYgUk5fTVRPT05fSVNfT1VUTElORVxcbiAgICAjaWZkZWYgUk5fTVRPT05fSEFTX09VVExJTkVfV0lEVEhfVEVYVFVSRVxcbiAgICAgIGxldCB0ZXh0dXJlU2l6ZSA9IHRleHR1cmVEaW1lbnNpb25zKG91dGxpbmVXaWR0aFRleHR1cmUsIDApO1xcbiAgICAgIGxldCBvdXRsaW5lVGV4ID0gdGV4dHVyZUxvYWQob3V0bGluZVdpZHRoVGV4dHVyZSwgdmVjMnUodmVjMmYodGV4dHVyZVNpemUpICogdGV4Y29vcmRfMCksIDApLnI7XFxuICAgICNlbHNlXFxuICAgICAgbGV0IG91dGxpbmVUZXggPSAxLjA7XFxuICAgICNlbmRpZlxcblxcbiAgICAjaWZkZWYgUk5fTVRPT05fT1VUTElORV9XSURUSF9XT1JMRFxcbiAgICAgIGxldCBvdXRsaW5lV2lkdGg6IGYzMiA9IGdldF9vdXRsaW5lV2lkdGgobWF0ZXJpYWxTSUQsIDApO1xcbiAgICAgIGxldCBvdXRsaW5lT2Zmc2V0OiB2ZWMzZiA9IDAuMDEgKiBvdXRsaW5lV2lkdGggKiBvdXRsaW5lVGV4ICogbm9ybWFsO1xcbiAgICAgIGxldCB3b3JsZE91dGxpbmVPZmZzZXQ6IHZlYzRmID0gd29ybGRNYXRyaXggKiB2ZWM0ZihvdXRsaW5lT2Zmc2V0LCAwLjApO1xcbiAgICAgIG91dHB1dC5wb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogKGdlb20ucG9zaXRpb25faW5Xb3JsZCArIHdvcmxkT3V0bGluZU9mZnNldCk7XFxuXFxuICAgICNlbGlmIGRlZmluZWQoUk5fTVRPT05fT1VUTElORV9XSURUSF9TQ1JFRU4pXFxuICAgICAgbGV0IHZlcnRleDogdmVjNGYgPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIGdlb20ucG9zaXRpb25faW5Xb3JsZDtcXG5cXG4gICAgICBsZXQgY2xpcE5vcm1hbDogdmVjM2YgPSAocHJvamVjdGlvbk1hdHJpeCAqIHZlYzRmKG91dHB1dC5ub3JtYWxfaW5WaWV3LCAxLjApKS54eXo7XFxuICAgICAgdmFyIHByb2plY3RlZE5vcm1hbDogdmVjMmYgPSBub3JtYWxpemUoY2xpcE5vcm1hbC54eSk7XFxuICAgICAgbGV0IG91dGxpbmVTY2FsZWRNYXhEaXN0YW5jZTogZjMyID0gZ2V0X291dGxpbmVTY2FsZWRNYXhEaXN0YW5jZShtYXRlcmlhbFNJRCwgMCk7XFxuICAgICAgcHJvamVjdGVkTm9ybWFsICo9IG1pbih2ZXJ0ZXgudywgb3V0bGluZVNjYWxlZE1heERpc3RhbmNlKTtcXG4gICAgICBsZXQgYXNwZWN0OiBmMzIgPSBhYnMoZ2V0X2FzcGVjdCgwLCAwKSk7IC8vc29sbyBkYXR1bVxcbiAgICAgIHByb2plY3RlZE5vcm1hbC54ICo9IGFzcGVjdDtcXG5cXG4gICAgICBsZXQgb3V0bGluZVdpZHRoOiBmMzIgPSBnZXRfb3V0bGluZVdpZHRoKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgICB2ZXJ0ZXgueHkgKz0gMC4wMSAqIG91dGxpbmVXaWR0aCAqIG91dGxpbmVUZXggKiBwcm9qZWN0ZWROb3JtYWwgKiBjbGFtcCgxLjAgLSBhYnMob3V0cHV0Lm5vcm1hbF9pblZpZXcueiksIDAuMCwgMS4wKTsgLy8gaWdub3JlIG9mZnNldCB3aGVuIG5vcm1hbCB0b3dhcmQgY2FtZXJhXFxuXFxuICAgICAgb3V0cHV0LnBvc2l0aW9uID0gdmVydGV4O1xcbiAgICAjZWxzZVxcbiAgICAgIG91dHB1dC5wb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogZ2VvbS5wb3NpdGlvbl9pbldvcmxkO1xcbiAgICAjZW5kaWZcXG4gICNlbHNlXFxuICAgIG91dHB1dC5wb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogZ2VvbS5wb3NpdGlvbl9pbldvcmxkO1xcbiAgI2VuZGlmXFxuXFxuICAjaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gICAgb3V0cHV0LnRhbmdlbnRfaW5Xb3JsZCA9IG5vcm1hbE1hdHJpeCAqIHRhbmdlbnQueHl6O1xcbiAgICBvdXRwdXQuYmlub3JtYWxfaW5Xb3JsZCA9IGNyb3NzKGdlb20ubm9ybWFsX2luV29ybGQsIG91dHB1dC50YW5nZW50X2luV29ybGQpICogdGFuZ2VudC53O1xcbiAgI2VuZGlmXFxuXFxuICBvdXRwdXQudGV4Y29vcmRfMCA9IHRleGNvb3JkXzA7XFxuICBvdXRwdXQuYmFyeUNlbnRyaWNDb29yZCA9IGJhcnlDZW50cmljQ29vcmQueHl6O1xcblxcbiAgcmV0dXJuIG91dHB1dDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwidmVydGV4XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6ZmFsc2V9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMikgdGV4Y29vcmRfMCA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbigzKSBjb2xvcl8wIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzEgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNSkgdGV4Y29vcmRfMiA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig2KSB0YW5nZW50X2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oNykgYmlub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig4KSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOSkgc2hhZG93Q29vcmQgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMTApIGluc3RhbmNlSW5mbyA6IGYzMixcXG4gIEBsb2NhdGlvbigxMSkgbm9ybWFsX2luVmlldyA6IHZlYzM8ZjMyPixcXG59XFxuXFxuc3RydWN0IFN0b3JhZ2VEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZT4gc3RvcmFnZURhdGE6IFN0b3JhZ2VEYXRhO1xcbnN0cnVjdCBCbGVuZFNoYXBlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2U+IGJsZW5kU2hhcGVEYXRhOiBCbGVuZFNoYXBlRGF0YTtcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoT2Zmc2V0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PHUzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoT2Zmc2V0czogVW5pZm9ybU1vcnBoT2Zmc2V0cztcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoV2VpZ2h0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoV2VpZ2h0czogVW5pZm9ybU1vcnBoV2VpZ2h0cztcXG5cXG5vdmVycmlkZSBfbWF0ZXJpYWxTSUQ6IHUzMjtcXG5vdmVycmlkZSBfY3VycmVudFByaW1pdGl2ZUlkeCA9IDB1O1xcbm92ZXJyaWRlIF9tb3JwaFRhcmdldE51bWJlcjogdTMyID0gMHU7XFxub3ZlcnJpZGUgX2NhbWVyYVNJRDogdTMyID0gMHU7XFxuY29uc3QgTV9QSTogZjMyID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgUkVDSVBST0NBTF9QSTogZjMyID0gMC4zMTgzMDk4ODYxODM3OTA3O1xcbmNvbnN0IEVwc2lsb246IGYzMiA9IDAuMDAwMDAwMTtcXG5jb25zdCBjX01pblJvdWdobmVzczogZjMyID0gMC4wNDtcXG5cXG5mbiBmZXRjaEVsZW1lbnQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIHN0b3JhZ2VEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcih2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gYmxlbmRTaGFwZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZEZyb21CbGVuZFNoYXBlQnVmZmVyKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjNCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj4ge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZuIGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IGYzMiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcblxcblxcblxcbmZuIGZldGNoTWF0NCh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPlxcbntcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuICBsZXQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDN1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDQ8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDR4Myh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDM8ZjMyPiB7XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4MzxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5mbiB1dlRyYW5zZm9ybShzY2FsZTogdmVjMmYsIG9mZnNldDogdmVjMmYsIHJvdGF0aW9uOiBmMzIsIHV2OiB2ZWMyZikgLT4gdmVjMmYge1xcbiAgbGV0IHRyYW5zbGF0aW9uTWF0ID0gbWF0M3gzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIGxldCByb3RhdGlvbk1hdCA9IG1hdDN4MyhcXG4gICAgICBjb3Mocm90YXRpb24pLCAtc2luKHJvdGF0aW9uKSwgMCxcXG4gICAgICBzaW4ocm90YXRpb24pLCBjb3Mocm90YXRpb24pLCAwLFxcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIDAsIDFcXG4gICk7XFxuICBsZXQgc2NhbGVNYXQgPSBtYXQzeDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBsZXQgbWF0cml4ID0gdHJhbnNsYXRpb25NYXQgKiByb3RhdGlvbk1hdCAqIHNjYWxlTWF0O1xcbiAgbGV0IHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzNmKHV2Lnh5LCAxKSApLnh5O1xcblxcbiAgcmV0dXJuIHV2VHJhbnNmb3JtZWQ7XFxufVxcblxcbiNpZmRlZiBSTl9JU19OT0RFX1NIQURFUlxcbiNlbHNlXFxuZm4gZ2V0VGV4Y29vcmQodGV4Y29vcmRJbmRleDogdTMyLCBpbnB1dDogVmVydGV4T3V0cHV0KSAtPiB2ZWMyPGYzMj4ge1xcbiAgdmFyIHRleGNvb3JkOiB2ZWMyZjtcXG4gIGlmKHRleGNvb3JkSW5kZXggPT0gMil7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzE7XFxuICB9ZWxzZXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8wO1xcbiAgfVxcbiAgcmV0dXJuIHRleGNvb3JkO1xcbn1cXG4jZW5kaWZcXG5cXG5mbiBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4OiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gIHJldHVybiBjbGFtcCh4LCBFcHNpbG9uLCAxLjApO1xcbn1cXG5cXG5mbiBtYXgzKHY6IHZlYzNmKSAtPiBmMzJcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZuIHNxRjMyKHQ6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzJmKHQ6IHZlYzJmKSAtPiB2ZWMyZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMzZih0OiB2ZWMzZikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjNGYodDogdmVjNGYpIC0+IHZlYzRmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG5cXG5AZ3JvdXAoMSkgQGJpbmRpbmcoMCkgdmFyIGJhc2VDb2xvclRleHR1cmU6IHRleHR1cmVfMmQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPXdoaXRlXFxuQGdyb3VwKDIpIEBiaW5kaW5nKDApIHZhciBiYXNlQ29sb3JTYW1wbGVyOiBzYW1wbGVyO1xcblxcbi8vICNwYXJhbSBjdWJlTWFwRmFjZUlkOiBpMzI7IC8vIGluaXRpYWxWYWx1ZT0wXFxuXFxuZm4gZGlyVG9QYW5vcmFtYVVWKGRpcjogdmVjM2YpIC0+IHZlYzJmXFxue1xcblxcdHJldHVybiB2ZWMyZihcXG5cXHRcXHQwLjVmICsgMC41ZiAqIGF0YW4yKGRpci56LCBkaXIueCkgLyBNX1BJLFxcblxcdFxcdDEuZiAtIGFjb3MoZGlyLnkpIC8gTV9QSSk7XFxufVxcblxcbmZuIHV2VG9EaXJlY3Rpb24oZmFjZUlkOiBpMzIsIHV2OiB2ZWMyZikgLT4gdmVjM2ZcXG57XFxuXFx0aWYgKGZhY2VJZCA9PSAwKSB7XFxuXFx0XFx0cmV0dXJuIHZlYzNmKDEuZiwgdXYueSwgLXV2LngpO1xcbiAgfSBlbHNlIGlmKGZhY2VJZCA9PSAxKSB7XFxuXFx0XFx0cmV0dXJuIHZlYzNmKC0xLmYsIHV2LnksIHV2LngpO1xcbiAgfSBlbHNlIGlmKGZhY2VJZCA9PSAyKSB7XFxuXFx0XFx0cmV0dXJuIHZlYzNmKHV2LngsIC0xLmYsIHV2LnkpO1xcbiAgfSBlbHNlIGlmKGZhY2VJZCA9PSAzKSB7XFxuXFx0XFx0cmV0dXJuIHZlYzNmKHV2LngsIDEuZiwgLXV2LnkpO1xcbiAgfSBlbHNlIGlmKGZhY2VJZCA9PSA0KSB7XFxuXFx0XFx0cmV0dXJuIHZlYzNmKHV2LngsIHV2LnksIDEuZik7XFxuICB9IGVsc2Uge1xcbiAgICByZXR1cm4gdmVjM2YoLXV2LngsIHV2LnksIC0xLmYpO1xcbiAgfVxcbn1cXG5cXG4vLyBsZWFybmVkIGEgbG90IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1WaWV3ZXJcXG5AZnJhZ21lbnRcXG5mbiBtYWluIChcXG4gIGlucHV0OiBWZXJ0ZXhPdXRwdXQsXFxuKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcXG5sZXQgbWF0ZXJpYWxTSUQgPSBfbWF0ZXJpYWxTSUQ7XFxubGV0IGN1cnJlbnRQcmltaXRpdmVJZHggPSBfY3VycmVudFByaW1pdGl2ZUlkeDtcXG5sZXQgbW9ycGhUYXJnZXROdW1iZXIgPSBfbW9ycGhUYXJnZXROdW1iZXI7XFxubGV0IGNhbWVyYVNJRCA9IF9jYW1lcmFTSUQ7XFxuXFxuXFxuXFx0bGV0IHV2OiB2ZWMyZiA9IGlucHV0LnRleGNvb3JkXzAgKiAyLjAgLSAxLjA7XFxuXFx0bGV0IGRpcmVjdGlvbjogdmVjM2YgPSBub3JtYWxpemUodXZUb0RpcmVjdGlvbihnZXRfY3ViZU1hcEZhY2VJZChtYXRlcmlhbFNJRCwgMCksIHV2KSk7XFxuICBsZXQgcGFub3JhbWFVdjogdmVjMmYgPSBkaXJUb1Bhbm9yYW1hVVYoZGlyZWN0aW9uKTtcXG5cXHRsZXQgcnQwOiB2ZWM0ZiA9IHZlYzRmKHRleHR1cmVTYW1wbGVMZXZlbChiYXNlQ29sb3JUZXh0dXJlLCBiYXNlQ29sb3JTYW1wbGVyLCBwYW5vcmFtYVV2LCAwLjApLnJnYiwgMS4wKTtcXG4gIHJldHVybiBydDA7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxuQHZlcnRleFxcbmZuIG1haW4oXFxuICBAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleElkeCA6IHUzMixcXG4pIC0+IFZlcnRleE91dHB1dCB7XFxuICB2YXIgb3V0cHV0IDogVmVydGV4T3V0cHV0O1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG5sZXQgeCA9IGYzMigodmVydGV4SWR4ICYgMXUpIDw8IDJ1KTtcXG5sZXQgeSA9IGYzMigodmVydGV4SWR4ICYgMnUpIDw8IDF1KTtcXG5vdXRwdXQudGV4Y29vcmRfMC54ID0geCAqIDAuNTtcXG5vdXRwdXQudGV4Y29vcmRfMC55ID0geSAqIDAuNTtcXG5vdXRwdXQudGV4Y29vcmRfMC55ID0gMS4wIC0gb3V0cHV0LnRleGNvb3JkXzAueTtcXG5vdXRwdXQucG9zaXRpb24gPSB2ZWM0Zih4IC0gMS4wLCB5IC0gMS4wLCAwLCAxKTtcXG5cXG5cXG4gIHJldHVybiBvdXRwdXQ7XFxuXFxufVxcblxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxuc3RydWN0IExpZ2h0IHtcXG4gIGxpZ2h0VHlwZTogaTMyLCAvLyAwID0gZGlyZWN0aW9uYWwsIDEgPSBwb2ludCwgMiA9IHNwb3RcXG4gIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXFxuICBpbnRlbnNpdHk6IHZlYzM8ZjMyPixcXG4gIGF0dGVudWF0ZWRJbnRlbnNpdHk6IHZlYzM8ZjMyPixcXG4gIGRpcmVjdGlvbk9mTGlnaHRPYmplY3Q6IHZlYzM8ZjMyPixcXG4gIGRpcmVjdGlvbjogdmVjMzxmMzI+LCAvLyBkaXJlY3Rpb24gb2YgbGlnaHQgdmVjdG9yLCBlcXVhbCB0byBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KVxcbiAgcG9pbnRUb0xpZ2h0OiB2ZWMzPGYzMj4sIC8vIG5vdCBub3JtYWxpemVkXFxuICBzcG90QW5nbGVTY2FsZTogZjMyLFxcbiAgc3BvdEFuZ2xlT2Zmc2V0OiBmMzIsXFxuICBlZmZlY3RpdmVSYW5nZTogZjMyLFxcbn07XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL2Jsb2IvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2xpZ2h0c19wdW5jdHVhbC9SRUFETUUubWQjcmFuZ2UtcHJvcGVydHlcXG5mbiBnZXRSYW5nZUF0dGVudWF0aW9uKGxpZ2h0OiBMaWdodCkgLT4gZjMyXFxue1xcbiAgbGV0IGRpc3RhbmNlID0gbGVuZ3RoKGxpZ2h0LnBvaW50VG9MaWdodCk7XFxuICAvLyBtZWFucyBubyByYW5nZSBsaW1pdFxcbiAgaWYgKGxpZ2h0LmVmZmVjdGl2ZVJhbmdlIDw9IDAuMClcXG4gIHtcXG4gICAgcmV0dXJuIDEuMCAvIHBvdyhkaXN0YW5jZSwgMi4wKTtcXG4gIH1cXG4gIHJldHVybiBtYXgobWluKDEuMCAtIHBvdyhkaXN0YW5jZSAvIGxpZ2h0LmVmZmVjdGl2ZVJhbmdlLCA0LjApLCAxLjApLCAwLjApIC8gcG93KGRpc3RhbmNlLCAyLjApO1xcbn1cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbGlnaHRzX3B1bmN0dWFsL1JFQURNRS5tZCNpbm5lci1hbmQtb3V0ZXItY29uZS1hbmdsZXNcXG5mbiBnZXRTcG90QXR0ZW51YXRpb24obGlnaHQ6IExpZ2h0KSAtPiBmMzJcXG57XFxuXFxuICBsZXQgY2QgPSBkb3QobGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCwgbGlnaHQuZGlyZWN0aW9uKTtcXG4gIGxldCBhbmd1bGFyQXR0ZW51YXRpb24gPSBjbGFtcChjZCAqIGxpZ2h0LnNwb3RBbmdsZVNjYWxlICsgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0LCAwLjAsIDEuMCk7XFxuICByZXR1cm4gYW5ndWxhckF0dGVudWF0aW9uO1xcbn1cXG5cXG5mbiBnZXRMaWdodEF0dGVudWF0ZWQobGlnaHQ6IExpZ2h0KSAtPiBMaWdodCB7XFxuICB2YXIgbmV3TGlnaHQ6IExpZ2h0ID0gbGlnaHQ7XFxuICBuZXdMaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xcbiAgLy8gaWYgKGxpZ2h0LmxpZ2h0VHlwZSA9PSAwKSB7IC8vIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIC8vIERpcmVjdGlvbmFsIExpZ2h0IGRvbid0IGF0dGVudWF0ZSBnZW9tZXRpY2FsbHlcXG4gIC8vIH1cXG5cXG4gIC8vIFBvaW50IExpZ2h0XFxuICBpZiAobGlnaHQubGlnaHRUeXBlID09IDEpXFxuICB7XFxuICAgIG5ld0xpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0UmFuZ2VBdHRlbnVhdGlvbihsaWdodCk7XFxuICB9XFxuICAvLyBTcG90IGxpZ2h0XFxuICBpZiAobGlnaHQubGlnaHRUeXBlID09IDIpXFxuICB7XFxuICAgIG5ld0xpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgKj0gZ2V0U3BvdEF0dGVudWF0aW9uKGxpZ2h0KTtcXG4gIH1cXG5cXG4gIHJldHVybiBuZXdMaWdodDtcXG59XFxuXFxuZm4gZ2V0TGlnaHQobGlnaHRJZHg6IHUzMiwgdl9wb3NpdGlvbl9pbldvcmxkOiB2ZWMzPGYzMj4pIC0+IExpZ2h0IHtcXG4gIGxldCBsaWdodFBvc2l0aW9uOiB2ZWMzPGYzMj4gPSBnZXRfbGlnaHRQb3NpdGlvbigwdSwgbGlnaHRJZHgpO1xcbiAgbGV0IGRpcmVjdGlvbl9hbmRfd19vZl9MaWdodE9iamVjdDogdmVjMzxmMzI+ID0gZ2V0X2xpZ2h0RGlyZWN0aW9uKDB1LCBsaWdodElkeCk7XFxuICBsZXQgbGlnaHRJbnRlbnNpdHk6IHZlYzM8ZjMyPiA9IGdldF9saWdodEludGVuc2l0eSgwdSwgbGlnaHRJZHgpO1xcbiAgbGV0IGxpZ2h0UHJvcGVydHk6IHZlYzQ8ZjMyPiA9IGdldF9saWdodFByb3BlcnR5KDB1LCBsaWdodElkeCk7XFxuICB2YXIgbGlnaHQ6IExpZ2h0O1xcbiAgbGlnaHQuZGlyZWN0aW9uT2ZMaWdodE9iamVjdCA9IGRpcmVjdGlvbl9hbmRfd19vZl9MaWdodE9iamVjdDtcXG4gIGxldCBsaWdodFR5cGUgPSBsaWdodFByb3BlcnR5Lng7XFxuICBsaWdodC5lZmZlY3RpdmVSYW5nZSA9IGxpZ2h0UHJvcGVydHkueTtcXG4gIGxpZ2h0LnNwb3RBbmdsZVNjYWxlID0gbGlnaHRQcm9wZXJ0eS56O1xcbiAgbGlnaHQuc3BvdEFuZ2xlT2Zmc2V0ID0gbGlnaHRQcm9wZXJ0eS53O1xcblxcbiAgbGlnaHQuaW50ZW5zaXR5ID0gbGlnaHRJbnRlbnNpdHk7XFxuICBsaWdodC5wb3NpdGlvbiA9IGxpZ2h0UG9zaXRpb247XFxuICBpZiAobGlnaHRUeXBlIDwgLTAuNSkgeyAvLyBkaXNhYmxlZCBsaWdodFxcbiAgICBsaWdodC5pbnRlbnNpdHkgPSB2ZWMzZigwLjApO1xcbiAgICBsaWdodC5saWdodFR5cGUgPSAtMTtcXG4gIH0gZWxzZSBpZiAoMC43NSA8IGxpZ2h0VHlwZSkgeyAvLyBpcyBwb2ludGxpZ2h0IG9yIHNwb3RsaWdodFxcbiAgICBsaWdodC5wb2ludFRvTGlnaHQgPSBsaWdodFBvc2l0aW9uIC0gdl9wb3NpdGlvbl9pbldvcmxkO1xcbiAgICBsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUobGlnaHQucG9pbnRUb0xpZ2h0KTtcXG4gICAgbGlnaHQubGlnaHRUeXBlID0gMTtcXG4gIH0gZWxzZSB7IC8vIGlzIERpcmVjdGlvbmFsIExpZ2h0XFxuICAgIGxpZ2h0LmxpZ2h0VHlwZSA9IDA7XFxuICAgIGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb25PZkxpZ2h0T2JqZWN0ICogLTEuMCk7XFxuICB9XFxuXFxuICBpZiAobGlnaHRUeXBlID4gMS43NSkgeyAvLyBpcyBzcG90bGlnaHRcXG4gICAgbGlnaHQubGlnaHRUeXBlID0gMjtcXG4gIH1cXG5cXG4gIGxpZ2h0LmludGVuc2l0eSAqPSBNX1BJOyAvLyBQdW5jdHVhbCBMaWdodFxcblxcbiAgLy8gQXR0ZW51YXRpb25cXG4gIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XFxuICBsZXQgbmV3TGlnaHQgPSBnZXRMaWdodEF0dGVudWF0ZWQobGlnaHQpO1xcblxcbiAgcmV0dXJuIG5ld0xpZ2h0O1xcbn1cXG5cXG4jaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gIGZuIGdldFRCTihub3JtYWxfaW5Xb3JsZDogdmVjM2YsIGlucHV0OiBWZXJ0ZXhPdXRwdXQsIHZpZXdWZWN0b3I6IHZlYzNmLCB0ZXhjb29yZDogdmVjMmYsIGlzRnJvbnQ6IGJvb2wpIC0+IG1hdDN4MzxmMzI+IHtcXG4gICAgbGV0IHRhbmdlbnRfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbnB1dC50YW5nZW50X2luV29ybGQpO1xcbiAgICBsZXQgYmlub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShpbnB1dC5iaW5vcm1hbF9pbldvcmxkKTtcXG4gICAgbGV0IHRibk1hdF90YW5nZW50X3RvX3dvcmxkID0gbWF0M3gzPGYzMj4odGFuZ2VudF9pbldvcmxkLCBiaW5vcm1hbF9pbldvcmxkLCBub3JtYWxfaW5Xb3JsZCk7XFxuXFxuICAgIHJldHVybiB0Ym5NYXRfdGFuZ2VudF90b193b3JsZDtcXG4gIH1cXG4jZWxzZVxcbiAgICAvLyBUaGlzIGlzIGJhc2VkIG9uIGh0dHA6Ly93d3cudGhldGVudGhwbGFuZXQuZGUvYXJjaGl2ZXMvMTE4MFxcbiAgICBmbiBjb3RhbmdlbnRfZnJhbWUobm9ybWFsX2luV29ybGQ6IHZlYzNmLCBwb3NpdGlvbjogdmVjM2YsIHV2XzogdmVjMmYsIGlzRnJvbnQ6IGJvb2wpIC0+IG1hdDN4MzxmMzI+IHtcXG4gICAgICB2YXIgdXY6IHZlYzJmO1xcbiAgICAgIGlmIChpc0Zyb250KSB7XFxuICAgICAgICB1diA9IHV2XztcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgdXYgPSAtdXZfO1xcbiAgICAgIH1cXG5cXG4gICAgICAvLyBnZXQgZWRnZSB2ZWN0b3JzIG9mIHRoZSBwaXhlbCB0cmlhbmdsZVxcbiAgICAgIGxldCBkcDEgPSBkcGR4KHBvc2l0aW9uKTtcXG4gICAgICBsZXQgZHAyID0gZHBkeShwb3NpdGlvbik7XFxuICAgICAgbGV0IGR1djEgPSBkcGR4KHV2KTtcXG4gICAgICBsZXQgZHV2MiA9IGRwZHkodXYpO1xcblxcbiAgICAgIC8vIHNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtXFxuICAgICAgbGV0IGRwMnBlcnAgPSBjcm9zcyhkcDIsIG5vcm1hbF9pbldvcmxkKTtcXG4gICAgICBsZXQgZHAxcGVycCA9IGNyb3NzKG5vcm1hbF9pbldvcmxkLCBkcDEpO1xcbiAgICAgIGxldCB0YW5nZW50ID0gZHAycGVycCAqIGR1djEueCArIGRwMXBlcnAgKiBkdXYyLng7XFxuICAgICAgdmFyIGJpdGFuZ2VudCA9IGRwMnBlcnAgKiBkdXYxLnkgKyBkcDFwZXJwICogZHV2Mi55O1xcbiAgICAgIGJpdGFuZ2VudCAqPSAtMS4wO1xcblxcbiAgICAgIC8vIGNvbnN0cnVjdCBhIHNjYWxlLWludmFyaWFudCBmcmFtZVxcbiAgICAgIGxldCBpbnZNYXQgPSAxLjAgLyBzcXJ0KG1heChkb3QodGFuZ2VudCwgdGFuZ2VudCksIGRvdChiaXRhbmdlbnQsIGJpdGFuZ2VudCkpKTtcXG4gICAgICByZXR1cm4gbWF0M3gzPGYzMj4odGFuZ2VudCAqIGludk1hdCwgYml0YW5nZW50ICogaW52TWF0LCBub3JtYWxfaW5Xb3JsZCk7XFxuICAgIH1cXG5cXG4gICAgZm4gZ2V0VEJOKG5vcm1hbF9pbldvcmxkOiB2ZWMzZiwgaW5wdXQ6IFZlcnRleE91dHB1dCwgdmlld1ZlY3RvcjogdmVjM2YsIHRleGNvb3JkOiB2ZWMyZiwgaXNGcm9udDogYm9vbCkgLT4gbWF0M3gzPGYzMj4ge1xcbiAgICAgIGxldCB0Ym5NYXRfdGFuZ2VudF90b193b3JsZCA9IGNvdGFuZ2VudF9mcmFtZShub3JtYWxfaW5Xb3JsZCwgLXZpZXdWZWN0b3IsIHRleGNvb3JkLCBpc0Zyb250KTtcXG5cXG4gICAgICByZXR1cm4gdGJuTWF0X3RhbmdlbnRfdG9fd29ybGQ7XFxuICAgIH1cXG4jZW5kaWZcXG5cXG5mbiBzcmdiVG9MaW5lYXIoc3JnYkNvbG9yOiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgcmV0dXJuIHBvdyhzcmdiQ29sb3IsIHZlYzNmKDIuMikpO1xcbn1cXG5cXG5mbiBsaW5lYXJUb1NyZ2IobGluZWFyQ29sb3I6IHZlYzNmKSAtPiB2ZWMzZiB7XFxuICByZXR1cm4gcG93KGxpbmVhckNvbG9yLCB2ZWMzZigxLjAvMi4yKSk7XFxufVxcblxcbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtVmlld2VyL2Jsb2IvZTJjN2I4YzhiZDEyOTE2YzFhMzg3Y2Q0MWY5ZWYwNjFlZGM3MThkZi9zb3VyY2UvUmVuZGVyZXIvc2hhZGVycy9icmRmLmdsc2wjTDQ0LUw2NlxcbmZuIFNjaGxpY2tfdG9fRjBfRjkwKGY6IHZlYzNmLCBmOTA6IHZlYzNmLCBWZG90SDogZjMyKSAtPiB2ZWMzZiB7XFxuICAgIGxldCB4ID0gY2xhbXAoMS4wIC0gVmRvdEgsIDAuMCwgMS4wKTtcXG4gICAgbGV0IHgyID0geCAqIHg7XFxuICAgIGxldCB4NSA9IGNsYW1wKHggKiB4MiAqIHgyLCAwLjAsIDAuOTk5OSk7XFxuXFxuICAgIHJldHVybiAoZiAtIGY5MCAqIHg1KSAvICgxLjAgLSB4NSk7XFxufVxcblxcbmZuIFNjaGxpY2tfdG9fRjBfRjkwX0YzMihmOiBmMzIsIGY5MDogZjMyLCBWZG90SDogZjMyKSAtPiBmMzIge1xcbiAgICBsZXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICAgIGxldCB4MiA9IHggKiB4O1xcbiAgICBsZXQgeDUgPSBjbGFtcCh4ICogeDIgKiB4MiwgMC4wLCAwLjk5OTkpO1xcblxcbiAgICByZXR1cm4gKGYgLSBmOTAgKiB4NSkgLyAoMS4wIC0geDUpO1xcbn1cXG5cXG5mbiBTY2hsaWNrX3RvX0YwKGY6IHZlYzNmLCBWZG90SDogZjMyKSAtPiB2ZWMzZiB7XFxuICAgIHJldHVybiBTY2hsaWNrX3RvX0YwX0Y5MChmLCB2ZWMzKDEuMCksIFZkb3RIKTtcXG59XFxuXFxuZm4gU2NobGlja190b19GMF9GMzIoZjogZjMyLCBWZG90SDogZjMyKSAtPiBmMzIge1xcbiAgICByZXR1cm4gU2NobGlja190b19GMF9GOTBfRjMyKGYsIDEuMCwgVmRvdEgpO1xcbn1cXG5cXG5cXG4vLyBUaGUgU2NobGljayBBcHByb3hpbWF0aW9uIHRvIEZyZXNuZWxcXG5mbiBmcmVzbmVsKGYwIDogdmVjM2YsIGY5MCA6IHZlYzNmLCBWZG90SCA6IGYzMikgLT4gdmVjM2Yge1xcbiAgICBsZXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICAgIGxldCB4MiA9IHggKiB4O1xcbiAgICBsZXQgeDUgPSB4ICogeDIgKiB4MjtcXG4gICAgcmV0dXJuIGYwICsgKGY5MCAtIGYwKSAqIHg1O1xcbn1cXG5cXG5mbiBmcmVzbmVsRjMyKGYwIDogZjMyLCBmOTAgOiBmMzIsIFZkb3RIIDogZjMyKSAtPiBmMzIge1xcbiAgICBsZXQgeCA9IGNsYW1wKDEuMCAtIFZkb3RILCAwLjAsIDEuMCk7XFxuICAgIGxldCB4MiA9IHggKiB4O1xcbiAgICBsZXQgeDUgPSB4ICogeDIgKiB4MjtcXG4gICAgcmV0dXJuIGYwICsgKGY5MCAtIGYwKSAqIHg1O1xcbn1cXG5cXG5mbiBmcmVzbmVsMihmMDogdmVjM2YsIFZkb3RIOiBmMzIpIC0+IHZlYzNmXFxue1xcbiAgbGV0IGY5MCA9IHZlYzNmKDEuMCk7IC8vY2xhbXAoNTAuMCAqIGYwLCAwLjAsIDEuMCk7XFxuICByZXR1cm4gZnJlc25lbChmMCwgZjkwLCBWZG90SCk7XFxufVxcblxcbmZuIGZyZXNuZWwyRjMyKGYwOiBmMzIsIFZkb3RIOiBmMzIpIC0+IGYzMlxcbntcXG4gIGxldCBmOTAgPSAxLjA7IC8vY2xhbXAoNTAuMCAqIGYwLCAwLjAsIDEuMCk7XFxuICByZXR1cm4gZnJlc25lbEYzMihmMCwgZjkwLCBWZG90SCk7XFxufVxcblxcbi8vIFJvdWdobmVzcyBEZXBlbmRlbnQgRnJlc25lbFxcbi8vIGh0dHBzOi8vd3d3LmpjZ3Qub3JnL3B1Ymxpc2hlZC8wMDA4LzAxLzAzL3BhcGVyLnBkZlxcbmZuIGZyZXNuZWxTY2hsaWNrUm91Z2huZXNzKEYwOiB2ZWMzZiwgY29zVGhldGE6IGYzMiwgcm91Z2huZXNzOiBmMzIpIC0+IHZlYzNmXFxue1xcbiAgbGV0IEZyID0gbWF4KHZlYzNmKDEuMCAtIHJvdWdobmVzcyksIEYwKSAtIEYwO1xcbiAgbGV0IGtfUyA9IEYwICsgRnIgKiBwb3coMS4wIC0gY29zVGhldGEsIDUuMCk7XFxuICByZXR1cm4ga19TO1xcbn1cXG5cXG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI2RpZmZ1c2UtYnJkZlxcbmZuIEJSREZfbGFtYmVydGlhbihhbGJlZG86IHZlYzNmLCBGOiB2ZWMzZiwgc3BlY3VsYXJXZWlnaHQ6IGYzMikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gKHZlYzNmKDEuMCkgLSBzcGVjdWxhcldlaWdodCAqIEYpICogYWxiZWRvICogUkVDSVBST0NBTF9QSTtcXG59XFxuXFxuXFxuLy8gR0dYIE5ERlxcbmZuIGRfR0dYKE5IOiBmMzIsIGFscGhhUm91Z2huZXNzOiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgcm91Z2huZXNzU3FyID0gYWxwaGFSb3VnaG5lc3MgKiBhbHBoYVJvdWdobmVzcztcXG4gIGxldCBmID0gKHJvdWdobmVzc1NxciAtIDEuMCkgKiBOSCAqIE5IICsgMS4wO1xcbiAgcmV0dXJuIHJvdWdobmVzc1NxciAvIChNX1BJICogZiAqIGYpO1xcbn1cXG5cXG4vLyBUaGUgY29kZSBmcm9tIGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9maWxhbWVudC9GaWxhbWVudC5odG1sI2xpc3RpbmdfYXBwcm94aW1hdGVkc3BlY3VsYXJ2XFxuLy8gVGhlIGlkZWEgaXMgZnJvbSBbSGVpdHoxNF0gRXJpYyBIZWl0ei4gMjAxNC4gVW5kZXJzdGFuZGluZyB0aGUgTWFza2luZy1TaGFkb3dpbmcgRnVuY3Rpb24gaW4gTWljcm9mYWNldC1CYXNlZCBCUkRGcy5cXG5mbiB2X0dHWENvcnJlbGF0ZWQoTkw6IGYzMiwgTlY6IGYzMiwgYWxwaGFSb3VnaG5lc3M6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBhMiA9IGFscGhhUm91Z2huZXNzICogYWxwaGFSb3VnaG5lc3M7XFxuICBsZXQgR0dYViA9IE5MICogc3FydChOViAqIE5WICogKDEuMCAtIGEyKSArIGEyKTtcXG4gIGxldCBHR1hMID0gTlYgKiBzcXJ0KE5MICogTkwgKiAoMS4wIC0gYTIpICsgYTIpO1xcbiAgcmV0dXJuIDAuNSAvIChHR1hWICsgR0dYTCk7XFxufVxcblxcbmZuIEJSREZfc3BlY3VsYXJHR1goTkg6IGYzMiwgTkw6IGYzMiwgTlY6IGYzMiwgRjogdmVjM2YsIGFscGhhUm91Z2huZXNzOiBmMzIsIHNwZWN1bGFyV2VpZ2h0OiBmMzIpIC0+IHZlYzNmIHtcXG4gIGxldCBEID0gZF9HR1goTkgsIGFscGhhUm91Z2huZXNzKTtcXG4gIGxldCBWID0gdl9HR1hDb3JyZWxhdGVkKE5MLCBOViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgcmV0dXJuIHZlYzNmKEQpICogdmVjM2YoVikgKiBGICogc3BlY3VsYXJXZWlnaHQ7XFxufVxcblxcbi8vIHRoaXMgaXMgZnJvbSBodHRwczovL3d3dy51bnJlYWxlbmdpbmUuY29tL2Jsb2cvcGh5c2ljYWxseS1iYXNlZC1zaGFkaW5nLW9uLW1vYmlsZVxcbmZuIGVudkJSREZBcHByb3goIFJvdWdobmVzczogZjMyLCBOb1Y6IGYzMiApIC0+IHZlYzJmIHtcXG4gIGxldCBjMCA9IHZlYzRmKC0xLCAtMC4wMjc1LCAtMC41NzIsIDAuMDIyICk7XFxuICBsZXQgYzEgPSB2ZWM0ZigxLCAwLjA0MjUsIDEuMDQsIC0wLjA0ICk7XFxuICBsZXQgciA9IFJvdWdobmVzcyAqIGMwICsgYzE7XFxuICBsZXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtOS4yOCAqIE5vViApICkgKiByLnggKyByLnk7XFxuICBsZXQgQUIgPSB2ZWMyZiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcbiAgcmV0dXJuIEFCO1xcbn1cXG5cXG5cXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19jbGVhcmNvYXQjbGF5ZXJpbmdcXG5mbiBjb2F0ZWRfbWF0ZXJpYWxfcyhiYXNlOiB2ZWMzZiwgcGVyY2VwdHVhbFJvdWdobmVzczogZjMyLCBjbGVhcmNvYXRSb3VnaG5lc3M6IGYzMiwgY2xlYXJjb2F0OiBmMzIsIFZkb3ROYzogZjMyLCBMZG90TmM6IGYzMiwgTmRvdEhjOiBmMzIpIC0+IHZlYzNmIHtcXG4gIGxldCBjbGVhcmNvYXRGcmVzbmVsID0gMC4wNCArICgxLjAgLSAwLjA0KSAqIHBvdygxLjAgLSBhYnMoVmRvdE5jKSwgNS4wKTtcXG4gIGxldCBjbGVhcmNvYXRBbHBoYSA9IGNsZWFyY29hdFJvdWdobmVzcyAqIGNsZWFyY29hdFJvdWdobmVzcztcXG4gIGxldCBhbHBoYVJvdWdobmVzcyA9IHBlcmNlcHR1YWxSb3VnaG5lc3MgKiBwZXJjZXB0dWFsUm91Z2huZXNzO1xcbiAgbGV0IEQgPSBkX0dHWChOZG90SGMsIGNsZWFyY29hdEFscGhhKTtcXG4gIGxldCBWID0gdl9HR1hDb3JyZWxhdGVkKExkb3ROYywgVmRvdE5jLCBjbGVhcmNvYXRBbHBoYSk7XFxuICBsZXQgZl9jbGVhcmNvYXQgPSBjbGVhcmNvYXRGcmVzbmVsICogRCAqIFY7XFxuXFxuICAvLyBiYXNlID0gKGZfZGlmZnVzZSArIGZfc3BlY3VsYXIpIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2NsZWFyY29hdCNsYXllcmluZ1xcbiAgcmV0dXJuIGJhc2UgKiB2ZWMzZigxLjAgLSBjbGVhcmNvYXQgKiBjbGVhcmNvYXRGcmVzbmVsKSArIHZlYzNmKGZfY2xlYXJjb2F0ICogY2xlYXJjb2F0KTtcXG59XFxuXFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFpbi9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uI2ltcGxlbWVudGF0aW9uLW5vdGVzXFxuZm4gc3BlY3VsYXJfYnRkZihhbHBoYVJvdWdobmVzczogZjMyLCBOZG90TDogZjMyLCBOZG90VjogZjMyLCBOZG90SHQ6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBWID0gdl9HR1hDb3JyZWxhdGVkKE5kb3RMLCBOZG90ViwgYWxwaGFSb3VnaG5lc3MpO1xcbiAgbGV0IEQgPSBkX0dHWChOZG90SHQsIGFscGhhUm91Z2huZXNzKTtcXG4gIHJldHVybiBWICogRDtcXG59XFxuXFxuXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcbi8vIGdsVEYgS0hSX21hdGVyaWFsc192b2x1bWVcXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuXFxuI2lmZGVmIFJOX1VTRV9WT0xVTUVcXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc192b2x1bWUvUkVBRE1FLm1kI2F0dGVudWF0aW9uXFxuZm4gdm9sdW1lQXR0ZW51YXRpb24oYXR0ZW51YXRpb25Db2xvcjogdmVjM2YsIGF0dGVudWF0aW9uRGlzdGFuY2U6IGYzMiwgaW50ZW5zaXR5OiB2ZWMzZiwgdHJhbnNtaXNzaW9uRGlzdGFuY2U6IGYzMikgLT4gdmVjM2ZcXG57XFxuICBpZiAoYXR0ZW51YXRpb25EaXN0YW5jZSA9PSAwLjApIHsgLy8gbWVhbnMgSW5maW5pdGUgZGlzdGFuY2VcXG4gICAgcmV0dXJuIGludGVuc2l0eTsgLy8gTm8gYXR0ZW51YXRpb25cXG4gIH0gZWxzZSB7XFxuICAgIGxldCBhdHRlbnVhdGlvbkNvOiB2ZWMzZiA9IC1sb2coYXR0ZW51YXRpb25Db2xvcikgLyBhdHRlbnVhdGlvbkRpc3RhbmNlO1xcbiAgICBsZXQgYXR0ZW51YXRlZFRyYW5zbWl0dGFuY2U6IHZlYzNmID0gZXhwKC1hdHRlbnVhdGlvbkNvICogdHJhbnNtaXNzaW9uRGlzdGFuY2UpO1xcbiAgICByZXR1cm4gaW50ZW5zaXR5ICogYXR0ZW51YXRlZFRyYW5zbWl0dGFuY2U7XFxuICB9XFxufVxcbiNlbmRpZlxcblxcblxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4vLyBnbFRGIEtIUl9tYXRlcmlhbHNfYW5pc290cm9weVxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4jaWZkZWYgUk5fVVNFX0FOSVNPVFJPUFlcXG4vLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5XFxuZm4gRF9HR1hfYW5pc290cm9waWMoTmRvdEg6IGYzMiwgVGRvdEg6IGYzMiwgQmRvdEg6IGYzMiwgYXQ6IGYzMiwgYWI6IGYzMikgLT4gZjMyXFxue1xcbiAgICBsZXQgYTIgPSBhdCAqIGFiO1xcbiAgICBsZXQgZiA9IHZlYzNmKGFiICogVGRvdEgsIGF0ICogQmRvdEgsIGEyICogTmRvdEgpO1xcbiAgICBsZXQgdzIgPSBhMiAvIGRvdChmLCBmKTtcXG4gICAgcmV0dXJuIGEyICogdzIgKiB3MiAvIE1fUEk7XFxufVxcblxcbmZuIFZfR0dYX2FuaXNvdHJvcGljKE5kb3RMOiBmMzIsIE5kb3RWOiBmMzIsIEJkb3RWOiBmMzIsIFRkb3RWOiBmMzIsIFRkb3RMOiBmMzIsIEJkb3RMOiBmMzIsXFxuICAgIGF0OiBmMzIsIGFiOiBmMzIpIC0+IGYzMlxcbntcXG4gICAgbGV0IEdHWFYgPSBOZG90TCAqIGxlbmd0aCh2ZWMzKGF0ICogVGRvdFYsIGFiICogQmRvdFYsIE5kb3RWKSk7XFxuICAgIGxldCBHR1hMID0gTmRvdFYgKiBsZW5ndGgodmVjMyhhdCAqIFRkb3RMLCBhYiAqIEJkb3RMLCBOZG90TCkpO1xcbiAgICBsZXQgdiA9IDAuNSAvIChHR1hWICsgR0dYTCk7XFxuICAgIHJldHVybiBjbGFtcCh2LCAwLjAsIDEuMCk7XFxufVxcblxcbmZuIEJSREZfc3BlY3VsYXJBbmlzb3Ryb3BpY0dHWChGOiB2ZWMzZiwgYWxwaGFSb3VnaG5lc3M6IGYzMixcXG4gICAgVmRvdEg6IGYzMiwgTmRvdEw6IGYzMiwgTmRvdFY6IGYzMiwgTmRvdEg6IGYzMiwgQmRvdFY6IGYzMiwgVGRvdFY6IGYzMixcXG4gICAgVGRvdEw6IGYzMiwgQmRvdEw6IGYzMiwgVGRvdEg6IGYzMiwgQmRvdEg6IGYzMiwgYW5pc290cm9weTogZjMyKSAtPiB2ZWMzZlxcbntcXG4gICAgbGV0IGF0ID0gbWl4KGFscGhhUm91Z2huZXNzLCAxLjAsIGFuaXNvdHJvcHkgKiBhbmlzb3Ryb3B5KTtcXG4gICAgbGV0IGFiID0gYWxwaGFSb3VnaG5lc3M7XFxuXFxuICAgIGxldCBWID0gVl9HR1hfYW5pc290cm9waWMoTmRvdEwsIE5kb3RWLCBCZG90ViwgVGRvdFYsIFRkb3RMLCBCZG90TCwgYXQsIGFiKTtcXG4gICAgbGV0IEQgPSBEX0dHWF9hbmlzb3Ryb3BpYyhOZG90SCwgVGRvdEgsIEJkb3RILCBhdCwgYWIpO1xcblxcbiAgICByZXR1cm4gRiAqIFYgKiBEO1xcbn1cXG4jZW5kaWZcXG5cXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuLy8gZ2xURiBLSFJfbWF0ZXJpYWxzX3NoZWVuXFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xcblxcbiNpZmRlZiBSTl9VU0VfU0hFRU5cXG5mbiBkX0NoYXJsaWUoc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsIE5vSDogZjMyKSAtPiBmMzIge1xcbiAgLy8gRXN0ZXZleiBhbmQgS3VsbGEgMjAxNywgXFxcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXFxcIlxcbiAgbGV0IGFscGhhRyA9IHNoZWVuUGVyY2VwdHVhbFJvdWdobmVzcyAqIHNoZWVuUGVyY2VwdHVhbFJvdWdobmVzcztcXG4gIGxldCBpbnZBbHBoYSAgPSAxLjAgLyBhbHBoYUc7XFxuICBsZXQgY29zMmggPSBOb0ggKiBOb0g7XFxuICBsZXQgc2luMmggPSAxLjAgLSBjb3MyaDtcXG4gIHJldHVybiAoMi4wICsgaW52QWxwaGEpICogcG93KHNpbjJoLCBpbnZBbHBoYSAqIDAuNSkgLyAoMi4wICogTV9QSSk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3NoZWVuI3NoZWVuLXZpc2liaWxpdHlcXG5mbiBzaGVlblNpbXBsZVZpc2liaWxpdHkoTmRvdEw6IGYzMiwgTmRvdFY6IGYzMikgLT4gZjMyIHtcXG4gIHJldHVybiAxLjAgLyAoNC4wICogKE5kb3RMICsgTmRvdFYgLSBOZG90TCAqIE5kb3RWKSk7XFxufVxcblxcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21haW4vZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3NoZWVuI3NoZWVuLXZpc2liaWxpdHlcXG5mbiBjaGFybGllTCh4OiBmMzIsIGFscGhhRzogZjMyKSAtPiBmMzIge1xcbiAgbGV0IG9uZU1pbnVzQWxwaGFTcSA9ICgxLjAgLSBhbHBoYUcpICogKDEuMCAtIGFscGhhRyk7XFxuICBsZXQgYSA9IG1peCgyMS41NDczLCAyNS4zMjQ1LCBvbmVNaW51c0FscGhhU3EpO1xcbiAgbGV0IGIgPSBtaXgoMy44Mjk4NywgMy4zMjQzNSwgb25lTWludXNBbHBoYVNxKTtcXG4gIGxldCBjID0gbWl4KDAuMTk4MjMsIDAuMTY4MDEsIG9uZU1pbnVzQWxwaGFTcSk7XFxuICBsZXQgZCA9IG1peCgtMS45Nzc2MCwgLTEuMjczOTMsIG9uZU1pbnVzQWxwaGFTcSk7XFxuICBsZXQgZSA9IG1peCgtNC4zMjA1NCwgLTQuODU5NjcsIG9uZU1pbnVzQWxwaGFTcSk7XFxuICByZXR1cm4gYSAvICgxLjAgKyBiICogcG93KHgsIGMpKSArIGQgKiB4ICsgZTtcXG59XFxuXFxuZm4gbGFtYmRhU2hlZW4oY29zVGhldGE6IGYzMiwgYWxwaGFHOiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiBzZWxlY3QoZXhwKDIuMCAqIGNoYXJsaWVMKDAuNSwgYWxwaGFHKSAtIGNoYXJsaWVMKDEuMCAtIGNvc1RoZXRhLCBhbHBoYUcpKSwgZXhwKGNoYXJsaWVMKGNvc1RoZXRhLCBhbHBoYUcpKSwgYWJzKGNvc1RoZXRhKSA8IDAuNSk7XFxufVxcblxcbmZuIHNoZWVuQ2hhcmxpZVZpc2liaWxpdHkoTmRvdEw6IGYzMiwgTmRvdFY6IGYzMiwgc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgYWxwaGFHID0gc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzICogc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzO1xcbiAgbGV0IHNoZWVuVmlzaWJpbGl0eSA9IDEuMCAvICgoMS4wICsgbGFtYmRhU2hlZW4oTmRvdFYsIGFscGhhRykgKyBsYW1iZGFTaGVlbihOZG90TCwgYWxwaGFHKSkgKiAoNC4wICogTmRvdFYgKiBOZG90TCkpO1xcbiAgcmV0dXJuIHNoZWVuVmlzaWJpbGl0eTtcXG59XFxuXFxuZm4gc2hlZW5fYnJkZihzaGVlbkNvbG9yOiB2ZWMzZiwgc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsIE5kb3RMOiBmMzIsIE5kb3RWOiBmMzIsIE5kb3RIOiBmMzIpIC0+IHZlYzNmIHtcXG4gIGxldCBzaGVlbkRpc3RyaWJ1dGlvbiA9IGRfQ2hhcmxpZShzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MsIE5kb3RIKTtcXG4gIGxldCBzaGVlblZpc2liaWxpdHkgPSBzaGVlbkNoYXJsaWVWaXNpYmlsaXR5KE5kb3RMLCBOZG90Viwgc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzKTtcXG4gIHJldHVybiBzaGVlbkNvbG9yICogc2hlZW5EaXN0cmlidXRpb24gKiBzaGVlblZpc2liaWxpdHk7XFxufVxcbiNlbmRpZiAvLyBSTl9VU0VfU0hFRU5cXG5cXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuLy8gZ2xURiBLSFJfbWF0ZXJpYWxzX2lyaXJkZXNjZW5jZVxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG5cXG4jaWZkZWYgUk5fVVNFX0lSSURFU0NFTkNFXFxuLy8gWFlaIHRvIFJFQzcwOShzUkdCKSBjb252ZXJzaW9uIG1hdHJpeFxcbmNvbnN0IFhZWl9UT19SRUM3MDkgPSBtYXQzeDM8ZjMyPihcXG4gICAgIDMuMjQwNDU0MiwgLTAuOTY5MjY2MCwgIDAuMDU1NjQzNCxcXG4gICAgLTEuNTM3MTM4NSwgIDEuODc2MDEwOCwgLTAuMjA0MDI1OSxcXG4gICAgLTAuNDk4NTMxNCwgIDAuMDQxNTU2MCwgIDEuMDU3MjI1Mlxcbik7XFxuXFxuZm4gZnJlc25lbFNjaGxpY2tSb3VnaG5lc3NXaXRoSXJpZGVzY2VuY2UoXFxuICBGMDogdmVjM2YsIGNvc1RoZXRhOiBmMzIsIHJvdWdobmVzczogZjMyLFxcbiAgaXJpZGVzY2VuY2VGcmVzbmVsOiB2ZWMzZiwgaXJpZGVzY2VuY2U6IGYzMlxcbiAgKSAtPiB2ZWMzZlxcbntcXG4gIGxldCBGciA9IG1heCh2ZWMzZigxLjAgLSByb3VnaG5lc3MpLCBGMCkgLSBGMDtcXG4gIGxldCBrX1MgPSBtaXgoRjAgKyBGciAqIHBvdygxLjAgLSBjb3NUaGV0YSwgNS4wKSwgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZSk7XFxuICByZXR1cm4ga19TO1xcbn1cXG5cXG4vLyBBc3N1bWUgYWlyIGludGVyZmFjZSBmb3IgdG9wXFxuZm4gRnJlc25lbDBUb0lvcihGMDogdmVjM2YpIC0+IHZlYzNmIHtcXG4gICAgbGV0IHNxcnRGMCA9IHNxcnQoRjApO1xcbiAgICByZXR1cm4gKHZlYzMoMS4wKSArIHNxcnRGMCkgLyAodmVjMygxLjApIC0gc3FydEYwKTtcXG59XFxuXFxuLy8gQ29udmVyc2lvbiBmcm9tIElPUiB0byBGMFxcbi8vIGlvciBpcyBhIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAzLjAuIDEuMCBpcyBhaXIgaW50ZXJmYWNlXFxuZm4gSW9yVG9GcmVzbmVsMFZlYzNmKHRyYW5zbWl0dGVkSW9yOiB2ZWMzZiwgaW5jaWRlbnRJb3I6IGYzMikgLT4gdmVjM2Yge1xcbiAgICByZXR1cm4gc3FWZWMzZigodHJhbnNtaXR0ZWRJb3IgLSB2ZWMzZihpbmNpZGVudElvcikpIC8gKHRyYW5zbWl0dGVkSW9yICsgdmVjMyhpbmNpZGVudElvcikpKTtcXG59XFxuZm4gSW9yVG9GcmVzbmVsMEYzMih0cmFuc21pdHRlZElvcjogZjMyLCBpbmNpZGVudElvcjogZjMyKSAtPiBmMzIge1xcbiAgICByZXR1cm4gc3FGMzIoKHRyYW5zbWl0dGVkSW9yIC0gaW5jaWRlbnRJb3IpIC8gKHRyYW5zbWl0dGVkSW9yICsgaW5jaWRlbnRJb3IpKTtcXG59XFxuXFxuLyoqXFxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFpbi9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UjYW5hbHl0aWMtc3BlY3RyYWwtaW50ZWdyYXRpb25cXG4gKi9cXG5mbiBldmFsU2Vuc2l0aXZpdHkoT1BEOiBmMzIsIHNoaWZ0OiB2ZWMzZikgLT4gdmVjM2Yge1xcbiAgICBsZXQgcGhhc2UgPSAyLjAgKiBNX1BJICogT1BEICogMS4wZS05O1xcbiAgICBsZXQgdmFsID0gdmVjM2YoNS40ODU2ZS0xMywgNC40MjAxZS0xMywgNS4yNDgxZS0xMyk7XFxuICAgIGxldCBwb3MgPSB2ZWMzZigxLjY4MTBlKzA2LCAxLjc5NTNlKzA2LCAyLjIwODRlKzA2KTtcXG4gICAgbGV0IHZhcl8gPSB2ZWMzZig0LjMyNzhlKzA5LCA5LjMwNDZlKzA5LCA2LjYxMjFlKzA5KTtcXG5cXG4gICAgdmFyIHh5eiA9IHZhbCAqIHNxcnQoMi4wICogTV9QSSAqIHZhcl8pICogY29zKHBvcyAqIHBoYXNlICsgc2hpZnQpICogZXhwKC0ocGhhc2UgKiBwaGFzZSkgKiB2YXJfKTtcXG4gICAgeHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoMi4wICogTV9QSSAqIDQuNTI4MmUrMDkpICogY29zKDIuMjM5OWUrMDYgKiBwaGFzZSArIHNoaWZ0WzBdKSAqIGV4cCgtNC41MjgyZSswOSAqIChwaGFzZSAqIHBoYXNlKSk7XFxuICAgIHh5eiAvPSAxLjA2ODVlLTc7XFxuXFxuICAgIGxldCByZ2IgPSBYWVpfVE9fUkVDNzA5ICogeHl6O1xcbiAgICByZXR1cm4gcmdiO1xcbn1cXG5cXG4vKipcXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZSNpcmlkZXNjZW5jZS1mcmVzbmVsXFxuICovXFxuZm4gY2FsY0lyaWRlc2NlbmNlKG91dHNpZGVJb3I6IGYzMiwgZXRhMjogZjMyLCBjb3NUaGV0YTE6IGYzMiwgdGhpbkZpbG1UaGlja25lc3M6IGYzMiwgYmFzZUYwOiB2ZWMzZikgLT4gdmVjM2Yge1xcblxcblxcbiAgLy8gaXJpZGVzY2VuY2VJb3IgaXMgdGhlIGluZGV4IG9mIHJlZnJhY3Rpb24gb2YgdGhlIHRoaW4tZmlsbSBsYXllclxcbiAgLy8gRm9yY2UgaXJpZGVzY2VuY2VJb3IgLT4gb3V0c2lkZUlPUiB3aGVuIHRoaW5GaWxtVGhpY2tuZXNzIC0+IDAuMFxcbiAgbGV0IGlyaWRlc2NlbmNlSW9yID0gbWl4KG91dHNpZGVJb3IsIGV0YTIsIHNtb290aHN0ZXAoMC4wLCAwLjAzLCB0aGluRmlsbVRoaWNrbmVzcykpO1xcblxcbiAgLy8gVG8gY2FsY3VsYXRlIHRoZSByZWZsZWN0YW5jZXMgUjEyIGFuZCBSMjMgYXQgdGhlIHZpZXdpbmcgYW5nbGVzIChhbmdsZSBoaXR0aW5nIHRoZSB0aGluLWZpbG0gbGF5ZXIpXFxuICAvLyBhbmQgKGFuZ2xlIGFmdGVyIHJlZnJhY3Rpb24gaW4gdGhlIHRoaW4tZmlsbSkgU2NobGljayBGcmVzbmVsIGlzIGFnYWluIHVzZWQuXFxuICAvLyBUaGlzIGFwcHJveGltYXRpb24gYWxsb3dzIHRvIGVsaW1pbmF0ZSB0aGUgc3BsaXQgaW50byBTIGFuZCBQIHBvbGFyaXphdGlvbiBmb3IgdGhlIGV4YWN0IEZyZXNuZWwgZXF1YXRpb25zLlxcbiAgLy8gY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgU25lbGwncyBsYXcgKHdpdGggIGJlaW5nIG91dHNpZGVJb3IgYW5kIGJlaW5nIGlyaWRlc2NlbmNlSW9yKTpcXG4gIGxldCBzaW5UaGV0YTJTcSA9IHNxRjMyKG91dHNpZGVJb3IgLyBpcmlkZXNjZW5jZUlvcikgKiAoMS4wIC0gc3FGMzIoY29zVGhldGExKSk7XFxuICBsZXQgY29zVGhldGEyU3EgPSAxLjAgLSBzaW5UaGV0YTJTcTtcXG5cXG4gIC8vIEhhbmRsZSB0b3RhbCBpbnRlcm5hbCByZWZsZWN0aW9uXFxuICBpZiAoY29zVGhldGEyU3EgPCAwLjApIHtcXG4gICAgICByZXR1cm4gdmVjM2YoMS4wKTtcXG4gIH1cXG5cXG4gIGxldCBjb3NUaGV0YTIgPSBzcXJ0KGNvc1RoZXRhMlNxKTtcXG5cXG4gIC8vLyBNYXRlcmlhbCBJbnRlcmZhY2VzXFxuICAvLyBUaGUgaXJpZGVzY2VuY2UgbW9kZWwgZGVmaW5lZCBieSBCZWxjb3VyL0JhcmxhIG1vZGVscyB0d28gbWF0ZXJpYWwgaW50ZXJmYWNlc1xcbiAgLy8gLSBvbmUgZnJvbSB0aGUgb3V0c2lkZSB0byB0aGUgdGhpbi1maWxtIGxheWVyXFxuICAvLyBhbmQgYW5vdGhlciBvbmUgZnJvbSB0aGUgdGhpbi1maWxtIHRvIHRoZSBiYXNlIG1hdGVyaWFsLiBUaGVzZSB0d28gaW50ZXJmYWNlcyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOlxcblxcbiAgLy8gRmlyc3QgaW50ZXJmYWNlIChmcm9tIHRoZSBvdXRzaWRlIHRvIHRoZSB0aGluLWZpbG0gbGF5ZXIpXFxuICBsZXQgUjAgPSBJb3JUb0ZyZXNuZWwwRjMyKGlyaWRlc2NlbmNlSW9yLCBvdXRzaWRlSW9yKTtcXG4gIGxldCBSMTIgPSBmcmVzbmVsMkYzMihSMCwgY29zVGhldGExKTtcXG4gIGxldCBSMjEgPSBSMTI7XFxuICBsZXQgVDEyMSA9IDEuMCAtIFIxMjtcXG5cXG4gIC8vIFNlY29uZCBpbnRlcmZhY2UgKGZyb20gdGhlIHRoaW4tZmlsbSB0byB0aGUgYmFzZSBtYXRlcmlhbClcXG4gIGxldCBiYXNlSW9yID0gRnJlc25lbDBUb0lvcihiYXNlRjAgKyAwLjAwMDEpOyAvLyBndWFyZCBhZ2FpbnN0IDEuMFxcbiAgbGV0IFIxID0gSW9yVG9GcmVzbmVsMFZlYzNmKGJhc2VJb3IsIGlyaWRlc2NlbmNlSW9yKTtcXG4gIGxldCBSMjMgPSBmcmVzbmVsMihSMSwgY29zVGhldGEyKTtcXG5cXG4gIC8vIHBoaTEyIGFuZCBwaGkyMyBkZWZpbmUgdGhlIGJhc2UgcGhhc2VzIHBlciBpbnRlcmZhY2UgYW5kIGFyZSBhcHByb3hpbWF0ZWQgd2l0aCAwLjBcXG4gIC8vIGlmIHRoZSBJT1Igb2YgdGhlIGhpdCBtYXRlcmlhbCAoaXJpZGVzY2VuY2VJb3Igb3IgYmFzZUlvcikgaXMgaGlnaGVyXFxuICAvLyB0aGFuIHRoZSBJT1Igb2YgdGhlIHByZXZpb3VzIG1hdGVyaWFsIChvdXRzaWRlSW9yIG9yIGlyaWRlc2NlbmNlSW9yKSBhbmQgz4Agb3RoZXJ3aXNlLlxcbiAgLy8gQWxzbyBoZXJlLCBwb2xhcml6YXRpb24gaXMgaWdub3JlZC4gIGZsb2F0IHBoaTEyID0gMC4wO1xcblxcbiAgLy8gRmlyc3QgaW50ZXJmYWNlIChmcm9tIHRoZSBvdXRzaWRlIHRvIHRoZSB0aGluLWZpbG0gbGF5ZXIpXFxuICB2YXIgcGhpMTIgPSAwLjA7XFxuICBpZiAoaXJpZGVzY2VuY2VJb3IgPCBvdXRzaWRlSW9yKSB7IHBoaTEyID0gTV9QSTsgfVxcbiAgbGV0IHBoaTIxID0gTV9QSSAtIHBoaTEyO1xcblxcbiAgLy8gU2Vjb25kIGludGVyZmFjZSAoZnJvbSB0aGUgdGhpbi1maWxtIHRvIHRoZSBiYXNlIG1hdGVyaWFsKVxcbiAgdmFyIHBoaTIzID0gdmVjM2YoMC4wKTtcXG4gIGlmIChiYXNlSW9yWzBdIDwgaXJpZGVzY2VuY2VJb3IpIHsgcGhpMjNbMF0gPSBNX1BJOyB9XFxuICBpZiAoYmFzZUlvclsxXSA8IGlyaWRlc2NlbmNlSW9yKSB7IHBoaTIzWzFdID0gTV9QSTsgfVxcbiAgaWYgKGJhc2VJb3JbMl0gPCBpcmlkZXNjZW5jZUlvcikgeyBwaGkyM1syXSA9IE1fUEk7IH1cXG5cXG4gIC8vIE9QRCAob3B0aWNhbCBwYXRoIGRpZmZlcmVuY2UpXFxuICBsZXQgT1BEID0gMi4wICogaXJpZGVzY2VuY2VJb3IgKiB0aGluRmlsbVRoaWNrbmVzcyAqIGNvc1RoZXRhMjtcXG4gIC8vIFBoYXNlIHNoaWZ0XFxuICBsZXQgcGhpID0gdmVjM2YocGhpMjEpICsgcGhpMjM7XFxuXFxuICAvLyBDb21wb3VuZCB0ZXJtc1xcbiAgbGV0IFIxMjMgPSBjbGFtcChSMTIgKiBSMjMsIHZlYzNmKDFlLTUpLCB2ZWMzZigwLjk5OTkpKTtcXG4gIGxldCByMTIzID0gc3FydChSMTIzKTtcXG4gIGxldCBScyA9IChUMTIxICogVDEyMSkgKiBSMjMgLyAodmVjM2YoMS4wKSAtIFIxMjMpO1xcblxcbiAgLy8gUmVmbGVjdGFuY2UgdGVybSBmb3IgbSA9IDAgKERDIHRlcm0gYW1wbGl0dWRlKVxcbiAgbGV0IEMwID0gUjEyICsgUnM7XFxuICB2YXIgSSA9IEMwO1xcblxcbiAgLy8gUmVmbGVjdGFuY2UgdGVybSBmb3IgbSA+IDAgKHBhaXJzIG9mIGRpcmFjcylcXG4gIHZhciBDbSA9IFJzIC0gVDEyMTtcXG4gIGZvciAodmFyIG0gPSAxOyBtIDw9IDI7IG0rKylcXG4gIHtcXG4gICAgICBDbSAqPSByMTIzO1xcbiAgICAgIGxldCBTbSA9IDIuMCAqIGV2YWxTZW5zaXRpdml0eShmMzIobSkgKiBPUEQsIGYzMihtKSAqIHBoaSk7XFxuICAgICAgSSArPSBDbSAqIFNtO1xcbiAgfVxcblxcbiAgbGV0IEZfaXJpZGVzY2VuY2UgPSBtYXgoSSwgdmVjM2YoMC4wKSk7XFxuXFxuICByZXR1cm4gRl9pcmlkZXNjZW5jZTtcXG59XFxuXFxuLy9odHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvc3BlY2lmaWNhdGlvbi8yLjAjYWNrbm93bGVkZ21lbnRzIEFwcGVuZGl4QlxcbmZuIEJSREZfbGFtYmVydGlhbklyaWRlc2NlbmNlKGYwOiB2ZWMzZiwgZjkwOiB2ZWMzZiwgaXJpZGVzY2VuY2VGcmVzbmVsOiB2ZWMzZiwgaXJpZGVzY2VuY2VGYWN0b3I6IGYzMiwgZGlmZnVzZUNvbG9yOiB2ZWMzZiwgc3BlY3VsYXJXZWlnaHQ6IGYzMiwgVmRvdEg6IGYzMikgLT4gdmVjM2ZcXG57XFxuICAgIGxldCBpcmlkZXNjZW5jZUZyZXNuZWxNYXggPSB2ZWMzZihtYXgobWF4KGlyaWRlc2NlbmNlRnJlc25lbC5yLCBpcmlkZXNjZW5jZUZyZXNuZWwuZyksIGlyaWRlc2NlbmNlRnJlc25lbC5iKSk7XFxuXFxuICAgIGxldCBzY2hsaWNrRnJlc25lbCA9IFNjaGxpY2tfdG9fRjBfRjkwKGYwLCBmOTAsIFZkb3RIKTtcXG5cXG4gICAgbGV0IEYgPSBtaXgoc2NobGlja0ZyZXNuZWwsIGlyaWRlc2NlbmNlRnJlc25lbE1heCwgaXJpZGVzY2VuY2VGYWN0b3IpO1xcblxcbiAgICAvLyBzZWUgaHR0cHM6Ly9zZWJsYWdhcmRlLndvcmRwcmVzcy5jb20vMjAxMi8wMS8wOC9waS1vci1ub3QtdG8tcGktaW4tZ2FtZS1saWdodGluZy1lcXVhdGlvbi9cXG4gICAgcmV0dXJuICgxLjAgLSBzcGVjdWxhcldlaWdodCAqIEYpICogKGRpZmZ1c2VDb2xvciAvIE1fUEkpO1xcbn1cXG5cXG5mbiBCUkRGX3NwZWN1bGFyR0dYSXJpZGVzY2VuY2UoZjA6IHZlYzNmLCBmOTA6IHZlYzNmLCBpcmlkZXNjZW5jZUZyZXNuZWw6IHZlYzNmLCBhbHBoYVJvdWdobmVzczogZjMyLCBpcmlkZXNjZW5jZUZhY3RvcjogZjMyLCBzcGVjdWxhcldlaWdodDogZjMyLCBWZG90SDogZjMyLCBOZG90TDogZjMyLCBOZG90VjogZjMyLCBOZG90SDogZjMyKSAtPiB2ZWMzZlxcbntcXG4gICAgbGV0IEYgPSBtaXgoU2NobGlja190b19GMF9GOTAoZjAsIGY5MCwgVmRvdEgpLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlRmFjdG9yKTtcXG4gICAgbGV0IFZpcyA9IHZfR0dYQ29ycmVsYXRlZChOZG90TCwgTmRvdFYsIGFscGhhUm91Z2huZXNzKTtcXG4gICAgbGV0IEQgPSBkX0dHWChOZG90SCwgYWxwaGFSb3VnaG5lc3MpO1xcblxcbiAgICByZXR1cm4gc3BlY3VsYXJXZWlnaHQgKiBGICogVmlzICogRDtcXG59XFxuXFxuI2VuZGlmIC8vIFJOX1VTRV9JUklERVNDRU5DRVxcblxcblxcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cXG4vLyBsaWdodGluZyB3aXRoIGEgcHVuY3R1YWwgbGlnaHRcXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXFxuZm4gbGlnaHRpbmdXaXRoUHVuY3R1YWxMaWdodChcXG4gIGxpZ2h0OiBMaWdodCxcXG4gIG5vcm1hbF9pbldvcmxkOiB2ZWMzZixcXG4gIHZpZXdEaXJlY3Rpb246IHZlYzNmLFxcbiAgTmRvdFY6IGYzMixcXG4gIGFsYmVkbzogdmVjM2YsXFxuICBwZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsXFxuICBGMDogdmVjM2YsXFxuICBGOTA6IHZlYzNmLFxcbiAgdHJhbnNtaXNzaW9uOiBmMzIsXFxuICBpb3I6IGYzMixcXG4gIGNsZWFyY29hdDogZjMyLFxcbiAgY2xlYXJjb2F0Um91Z2huZXNzOiBmMzIsXFxuICBjbGVhcmNvYXROb3JtYWxfaW5Xb3JsZDogdmVjM2YsXFxuICBWZG90TmM6IGYzMixcXG4gIGF0dGVudWF0aW9uQ29sb3I6IHZlYzNmLFxcbiAgYXR0ZW51YXRpb25EaXN0YW5jZTogZjMyLFxcbiAgYW5pc290cm9weTogZjMyLFxcbiAgYW5pc290cm9waWNUOiB2ZWMzZixcXG4gIGFuaXNvdHJvcGljQjogdmVjM2YsXFxuICBCZG90VjogZjMyLFxcbiAgVGRvdFY6IGYzMixcXG4gIHNoZWVuQ29sb3I6IHZlYzNmLFxcbiAgc2hlZW5Sb3VnaG5lc3M6IGYzMixcXG4gIGFsYmVkb1NoZWVuU2NhbGluZ05kb3RWOiBmMzIsXFxuICBpcmlkZXNjZW5jZUZhY3RvcjogZjMyLFxcbiAgaXJpZGVzY2VuY2VGcmVzbmVsOiB2ZWMzZixcXG4gIHNwZWN1bGFyV2VpZ2h0OiBmMzIsXFxuICApIC0+IHZlYzNmXFxue1xcbiAgbGV0IGFscGhhUm91Z2huZXNzID0gcGVyY2VwdHVhbFJvdWdobmVzcyAqIHBlcmNlcHR1YWxSb3VnaG5lc3M7XFxuXFxuICAvLyBGcmVzbmVsXFxuICBsZXQgaGFsZlZlY3RvciA9IG5vcm1hbGl6ZShsaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyZWN0aW9uKTtcXG4gIGxldCBWZG90SCA9IGRvdCh2aWV3RGlyZWN0aW9uLCBoYWxmVmVjdG9yKTtcXG4gIGxldCBGID0gZnJlc25lbChGMCwgRjkwLCBWZG90SCk7XFxuXFxuICBsZXQgTmRvdEwgPSBjbGFtcChkb3Qobm9ybWFsX2luV29ybGQsIGxpZ2h0LmRpcmVjdGlvbiksIEVwc2lsb24sIDEuMCk7XFxuXFxuICAvLyBEaWZmdXNlXFxuI2lmZGVmIFJOX1VTRV9JUklERVNDRU5DRVxcbiAgbGV0IGRpZmZ1c2VCcmRmID0gQlJERl9sYW1iZXJ0aWFuSXJpZGVzY2VuY2UoRjAsIEY5MCwgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZUZhY3RvciwgYWxiZWRvLCBzcGVjdWxhcldlaWdodCwgVmRvdEgpO1xcbiNlbHNlXFxuICBsZXQgZGlmZnVzZUJyZGYgPSBCUkRGX2xhbWJlcnRpYW4oYWxiZWRvLCBGLCBzcGVjdWxhcldlaWdodCk7XFxuI2VuZGlmXFxuICBsZXQgcHVyZURpZmZ1c2UgPSBkaWZmdXNlQnJkZiAqIHZlYzNmKE5kb3RMKSAqIGxpZ2h0LmF0dGVudWF0ZWRJbnRlbnNpdHk7XFxuXFxuI2lmZGVmIFJOX1VTRV9UUkFOU01JU1NJT05cXG4gIGxldCByZWZyYWN0aW9uVmVjdG9yID0gcmVmcmFjdCgtdmlld0RpcmVjdGlvbiwgbm9ybWFsX2luV29ybGQsIDEuMCAvIGlvcik7XFxuICB2YXIgdHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2U6IExpZ2h0ID0gbGlnaHQ7XFxuICB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5wb2ludFRvTGlnaHQgLT0gcmVmcmFjdGlvblZlY3RvcjtcXG4gIGxldCB0cmFuc21pdHRlZExpZ2h0RGlyZWN0aW9uRnJvbVVuZGVyU3VyZmFjZSA9IG5vcm1hbGl6ZSh0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5wb2ludFRvTGlnaHQpO1xcbiAgdHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2UuZGlyZWN0aW9uID0gdHJhbnNtaXR0ZWRMaWdodERpcmVjdGlvbkZyb21VbmRlclN1cmZhY2U7XFxuXFxuICBsZXQgSHQgPSBub3JtYWxpemUodmlld0RpcmVjdGlvbiArIHRyYW5zbWl0dGVkTGlnaHRGcm9tVW5kZXJTdXJmYWNlLmRpcmVjdGlvbik7XFxuICBsZXQgTmRvdEh0ID0gc2F0dXJhdGVFcHNpbG9uVG9PbmUoZG90KG5vcm1hbF9pbldvcmxkLCBIdCkpO1xcbiAgbGV0IE5kb3RMdCA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChub3JtYWxfaW5Xb3JsZCwgdHJhbnNtaXR0ZWRMaWdodEZyb21VbmRlclN1cmZhY2UuZGlyZWN0aW9uKSk7XFxuXFxuICB2YXIgdHJhbnNtaXR0ZWRDb250cmliID0gKHZlYzNmKDEuMCkgLSBGKSAqIHNwZWN1bGFyX2J0ZGYoYWxwaGFSb3VnaG5lc3MsIE5kb3RMdCwgTmRvdFYsIE5kb3RIdCkgKiBhbGJlZG8gKiB0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcblxcbiNpZmRlZiBSTl9VU0VfVk9MVU1FXFxuICB0cmFuc21pdHRlZENvbnRyaWIgPSB2b2x1bWVBdHRlbnVhdGlvbihhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCB0cmFuc21pdHRlZENvbnRyaWIsIGxlbmd0aCh0cmFuc21pdHRlZExpZ2h0RnJvbVVuZGVyU3VyZmFjZS5wb2ludFRvTGlnaHQpKTtcXG4jZW5kaWYgLy8gUk5fVVNFX1ZPTFVNRVxcblxcbiAgbGV0IGRpZmZ1c2VDb250cmliID0gbWl4KHB1cmVEaWZmdXNlLCB2ZWMzZih0cmFuc21pdHRlZENvbnRyaWIpLCB0cmFuc21pc3Npb24pO1xcbiNlbHNlXFxuICBsZXQgZGlmZnVzZUNvbnRyaWIgPSBwdXJlRGlmZnVzZTtcXG4jZW5kaWYgLy8gUk5fVVNFX1RSQU5TTUlTU0lPTlxcblxcbiAgLy8gU3BlY3VsYXJcXG4gIGxldCBOZG90SCA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChub3JtYWxfaW5Xb3JsZCwgaGFsZlZlY3RvcikpO1xcblxcblxcbiNpZmRlZiBSTl9VU0VfSVJJREVTQ0VOQ0VcXG4gIGxldCBzcGVjdWxhckNvbnRyaWIgPSBCUkRGX3NwZWN1bGFyR0dYSXJpZGVzY2VuY2UoRjAsIEY5MCwgaXJpZGVzY2VuY2VGcmVzbmVsLCBhbHBoYVJvdWdobmVzcywgaXJpZGVzY2VuY2VGYWN0b3IsIHNwZWN1bGFyV2VpZ2h0LCBWZG90SCwgTmRvdEwsIE5kb3RWLCBOZG90SCkgKiB2ZWMzZihOZG90TCkgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiNlbGlmIGRlZmluZWQoUk5fVVNFX0FOSVNPVFJPUFkpXFxuICBsZXQgVGRvdEwgPSBkb3QoYW5pc290cm9waWNULCBsaWdodC5kaXJlY3Rpb24pO1xcbiAgbGV0IEJkb3RMID0gZG90KGFuaXNvdHJvcGljQiwgbGlnaHQuZGlyZWN0aW9uKTtcXG4gIGxldCBUZG90SCA9IGRvdChhbmlzb3Ryb3BpY1QsIGhhbGZWZWN0b3IpO1xcbiAgbGV0IEJkb3RIID0gZG90KGFuaXNvdHJvcGljQiwgaGFsZlZlY3Rvcik7XFxuICBsZXQgc3BlY3VsYXJDb250cmliID0gQlJERl9zcGVjdWxhckFuaXNvdHJvcGljR0dYKEYsIGFscGhhUm91Z2huZXNzLCBWZG90SCwgTmRvdEwsIE5kb3RWLCBOZG90SCwgQmRvdFYsIFRkb3RWLCBUZG90TCwgQmRvdEwsIFRkb3RILCBCZG90SCwgYW5pc290cm9weSkgKiB2ZWMzZihOZG90TCkgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiNlbHNlXFxuICBsZXQgc3BlY3VsYXJDb250cmliID0gQlJERl9zcGVjdWxhckdHWChOZG90SCwgTmRvdEwsIE5kb3RWLCBGLCBhbHBoYVJvdWdobmVzcywgc3BlY3VsYXJXZWlnaHQpICogdmVjM2YoTmRvdEwpICogbGlnaHQuYXR0ZW51YXRlZEludGVuc2l0eTtcXG4jZW5kaWZcXG5cXG4gIC8vIEJhc2UgTGF5ZXJcXG4gIGxldCBiYXNlTGF5ZXIgPSBkaWZmdXNlQ29udHJpYiArIHNwZWN1bGFyQ29udHJpYjtcXG5cXG4jaWZkZWYgUk5fVVNFX1NIRUVOXFxuICAvLyBTaGVlblxcbiAgbGV0IHNoZWVuQ29udHJpYiA9IHNoZWVuX2JyZGYoc2hlZW5Db2xvciwgc2hlZW5Sb3VnaG5lc3MsIE5kb3RMLCBOZG90ViwgTmRvdEgpICogTmRvdEwgKiBsaWdodC5hdHRlbnVhdGVkSW50ZW5zaXR5O1xcbiAgbGV0IGFsYmVkb1NoZWVuU2NhbGluZyA9IG1pbihcXG4gICAgYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFYsXFxuICAgIDEuMCAtIG1heDMoc2hlZW5Db2xvcikgKiB0ZXh0dXJlU2FtcGxlKHNoZWVuTHV0VGV4dHVyZSwgc2hlZW5MdXRTYW1wbGVyLCB2ZWMyKE5kb3RMLCBzaGVlblJvdWdobmVzcykpLnIpO1xcbiAgbGV0IGNvbG9yID0gc2hlZW5Db250cmliICsgYmFzZUxheWVyICogYWxiZWRvU2hlZW5TY2FsaW5nO1xcbiNlbHNlXFxuICBsZXQgY29sb3IgPSBiYXNlTGF5ZXI7XFxuICBsZXQgYWxiZWRvU2hlZW5TY2FsaW5nID0gMS4wO1xcbiNlbmRpZiAvLyBSTl9VU0VfU0hFRU5cXG5cXG4jaWZkZWYgUk5fVVNFX0NMRUFSQ09BVFxcbiAgLy8gQ2xlYXIgQ29hdCBMYXllclxcbiAgbGV0IE5kb3RIYyA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChjbGVhcmNvYXROb3JtYWxfaW5Xb3JsZCwgaGFsZlZlY3RvcikpO1xcbiAgbGV0IExkb3ROYyA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdChsaWdodC5kaXJlY3Rpb24sIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkKSk7XFxuICBsZXQgY29hdGVkID0gY29hdGVkX21hdGVyaWFsX3MoY29sb3IsIHBlcmNlcHR1YWxSb3VnaG5lc3MsXFxuICAgIGNsZWFyY29hdFJvdWdobmVzcywgY2xlYXJjb2F0LCBWZG90TmMsIExkb3ROYywgTmRvdEhjKTtcXG4gIGxldCBmaW5hbENvbG9yID0gY29hdGVkO1xcbiNlbHNlXFxuICBsZXQgZmluYWxDb2xvciA9IGNvbG9yO1xcbiNlbmRpZiAvLyBSTl9VU0VfQ0xFQVJDT0FUXFxuXFxuICByZXR1cm4gZmluYWxDb2xvcjtcXG59XFxuXFxuZm4gSXNvdHJvcGljTkRGRmlsdGVyaW5nKG5vcm1hbDogdmVjM2YsIHJvdWdobmVzczI6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBTSUdNQTIgPSAwLjE1OTE1NDk0O1xcbiAgbGV0IEtBUFBBID0gMC4xODtcXG4gIGxldCBkbmR1ICA9IGRwZHgobm9ybWFsKTtcXG4gIGxldCBkbmR2ID0gZHBkeShub3JtYWwpO1xcbiAgbGV0IGtlcm5lbFJvdWdobmVzczIgPSBTSUdNQTIgKiAoZG90KGRuZHUsIGRuZHUpICsgZG90KGRuZHYsIGRuZHYpKTtcXG4gIGxldCBjbGFtcGVkS2VybmVsUm91Z2huZXNzMiA9IG1pbihrZXJuZWxSb3VnaG5lc3MyLCBLQVBQQSk7XFxuICBsZXQgZmlsdGVyZWRSb3VnaG5lc3MyID0gc2F0dXJhdGUocm91Z2huZXNzMiArIGNsYW1wZWRLZXJuZWxSb3VnaG5lc3MyKTtcXG4gIHJldHVybiBmaWx0ZXJlZFJvdWdobmVzczI7XFxufVxcblxcblxcbi8vICNwYXJhbSBtYWtlT3V0cHV0U3JnYjogYm9vbDsgLy8gaW5pdGlhbFZhbHVlPTFcXG5cXG4vLyBDb2xvclxcbi8vICNwYXJhbSBiYXNlQ29sb3JGYWN0b3I6IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSwxKVxcbkBncm91cCgxKSBAYmluZGluZygwKSB2YXIgYmFzZUNvbG9yVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9d2hpdGVcXG5AZ3JvdXAoMikgQGJpbmRpbmcoMCkgdmFyIGJhc2VDb2xvclNhbXBsZXI6IHNhbXBsZXI7XFxuLy8gI3BhcmFtIGJhc2VDb2xvclRleHR1cmVUcmFuc2Zvcm06IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbi8vICNwYXJhbSBiYXNlQ29sb3JUZXh0dXJlUm90YXRpb246IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4vLyAjcGFyYW0gYmFzZUNvbG9yVGV4Y29vcmRJbmRleDogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcblxcbi8vICNwYXJhbSBpb3I6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTEuNVxcblxcbi8vICNwYXJhbSBtZXRhbGxpY1JvdWdobmVzc0ZhY3RvcjogdmVjMjxmMzI+OyAvLyBpbml0aWFsVmFsdWU9KDEsMSlcXG5AZ3JvdXAoMSkgQGJpbmRpbmcoMSkgdmFyIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9d2hpdGVcXG5AZ3JvdXAoMikgQGJpbmRpbmcoMSkgdmFyIG1ldGFsbGljUm91Z2huZXNzU2FtcGxlcjogc2FtcGxlcjtcXG4vLyAjcGFyYW0gbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtOiB2ZWM0PGYzMj47IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDAsMClcXG4vLyAjcGFyYW0gbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb246IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4vLyAjcGFyYW0gbWV0YWxsaWNSb3VnaG5lc3NUZXhjb29yZEluZGV4OiBmMzI7IC8vIGluaXRpYWxWYWx1ZT0wXFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxfVEVYVFVSRVxcbiAgQGdyb3VwKDEpIEBiaW5kaW5nKDIpIHZhciBub3JtYWxUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47IC8vIGluaXRpYWxWYWx1ZT1ibGFja1xcbiAgQGdyb3VwKDIpIEBiaW5kaW5nKDIpIHZhciBub3JtYWxTYW1wbGVyOiBzYW1wbGVyO1xcbiAgLy8gI3BhcmFtIG5vcm1hbFRleHR1cmVUcmFuc2Zvcm06IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbiAgLy8gI3BhcmFtIG5vcm1hbFRleHR1cmVSb3RhdGlvbjogZjMyOyAvLyBpbml0aWFsVmFsdWU9KDApXFxuICAvLyAjcGFyYW0gbm9ybWFsVGV4Y29vcmRJbmRleDogZjMyOyAvLyBpbml0aWFsVmFsdWU9KDApXFxuICAvLyAjcGFyYW0gbm9ybWFsU2NhbGU6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPSgxKVxcbiNlbmRpZlxcblxcbkBncm91cCgxKSBAYmluZGluZygzKSB2YXIgb2NjbHVzaW9uVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9d2hpdGVcXG5AZ3JvdXAoMikgQGJpbmRpbmcoMykgdmFyIG9jY2x1c2lvblNhbXBsZXI6IHNhbXBsZXI7XFxuLy8gI3BhcmFtIG9jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm06IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbi8vICNwYXJhbSBvY2NsdXNpb25UZXh0dXJlUm90YXRpb246IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4vLyAjcGFyYW0gb2NjbHVzaW9uVGV4Y29vcmRJbmRleDogdTMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBvY2NsdXNpb25TdHJlbmd0aDogZjMyOyAvLyBpbml0aWFsVmFsdWU9MVxcblxcbi8vICNwYXJhbSBlbWlzc2l2ZUZhY3RvcjogdmVjMzxmMzI+OyAvLyBpbml0aWFsVmFsdWU9KDAsMCwwKVxcbi8vICNwYXJhbSBlbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm06IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbi8vICNwYXJhbSBlbWlzc2l2ZVRleHR1cmVSb3RhdGlvbjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBlbWlzc2l2ZVRleGNvb3JkSW5kZXg6IHUzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG5AZ3JvdXAoMSkgQGJpbmRpbmcoNCkgdmFyIGVtaXNzaXZlVGV4dHVyZTogdGV4dHVyZV8yZDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9d2hpdGVcXG5AZ3JvdXAoMikgQGJpbmRpbmcoNCkgdmFyIGVtaXNzaXZlU2FtcGxlcjogc2FtcGxlcjtcXG4vLyAjcGFyYW0gZW1pc3NpdmVTdHJlbmd0aDogZjMyOyAvLyBpbml0aWFsVmFsdWU9MVxcblxcbiNpZmRlZiBSTl9VU0VfQ0xFQVJDT0FUXFxuLy8gI3BhcmFtIGNsZWFyQ29hdEZhY3RvcjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBjbGVhckNvYXRSb3VnaG5lc3NGYWN0b3I6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4vLyAjcGFyYW0gY2xlYXJDb2F0VGV4dHVyZVRyYW5zZm9ybTogdmVjNDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9KDEsMSwwLDApXFxuLy8gI3BhcmFtIGNsZWFyQ29hdFRleHR1cmVSb3RhdGlvbjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtOiB2ZWM0PGYzMj47IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDAsMClcXG4vLyAjcGFyYW0gY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZVJvdGF0aW9uOiBmMzI7IC8vIGluaXRpYWxWYWx1ZT0wXFxuLy8gI3BhcmFtIGNsZWFyQ29hdE5vcm1hbFRleHR1cmVUcmFuc2Zvcm06IHZlYzQ8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMCwwKVxcbi8vICNwYXJhbSBjbGVhckNvYXROb3JtYWxUZXh0dXJlUm90YXRpb246IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4vLyAjcGFyYW0gY2xlYXJDb2F0VGV4Y29vcmRJbmRleDogdTMyOyAvLyBpbml0aWFsVmFsdWU9KDApXFxuLy8gI3BhcmFtIGNsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkSW5kZXg6IHUzMjsgLy8gaW5pdGlhbFZhbHVlPSgwKVxcbi8vICNwYXJhbSBjbGVhckNvYXROb3JtYWxUZXhjb29yZEluZGV4OiB1MzI7IC8vIGluaXRpYWxWYWx1ZT0oMClcXG4jZW5kaWYgLy8gUk5fVVNFX0NMRUFSQ09BVFxcblxcblxcbiNpZmRlZiBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuLy8gI3BhcmFtIHRyYW5zbWlzc2lvbkZhY3RvcjogZjMyOyAvLyBpbml0aWFsVmFsdWU9KDApXFxuI2VuZGlmIC8vIFJOX1VTRV9UUkFOU01JU1NJT05cXG5cXG4jaWZkZWYgUk5fVVNFX1ZPTFVNRVxcbi8vICNwYXJhbSB0aGlja25lc3NGYWN0b3I6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPSgwKVxcbi8vICNwYXJhbSBhdHRlbnVhdGlvbkRpc3RhbmNlOiBmMzI7IC8vIGluaXRpYWxWYWx1ZT0oMC4wMDAwMDEpXFxuLy8gI3BhcmFtIGF0dGVudWF0aW9uQ29sb3I6IHZlYzM8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDEsMSlcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX1NIRUVOXFxuLy8gI3BhcmFtIHNoZWVuQ29sb3JGYWN0b3I6IHZlYzM8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgwLDAsMClcXG4vLyAjcGFyYW0gc2hlZW5Sb3VnaG5lc3NGYWN0b3I6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPSgwKVxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfU1BFQ1VMQVJcXG4vLyAjcGFyYW0gc3BlY3VsYXJGYWN0b3I6IGYzMjsgLy8gaW5pdGlhbFZhbHVlPTEuMFxcbi8vICNwYXJhbSBzcGVjdWxhckNvbG9yRmFjdG9yOiB2ZWMzPGYzMj47IC8vIGluaXRpYWxWYWx1ZT0oMSwxLDEpXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9JUklERVNDRU5DRVxcbi8vICNwYXJhbSBpcmlkZXNjZW5jZUZhY3RvcjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBpcmlkZXNjZW5jZUlvcjogZjMyOyAvLyBpbml0aWFsVmFsdWU9MS4zXFxuLy8gI3BhcmFtIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTogZjMyOyAvLyBpbml0aWFsVmFsdWU9MTAwXFxuLy8gI3BhcmFtIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTogZjMyOyAvLyBpbml0aWFsVmFsdWU9NDAwXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9BTklTT1RST1BZXFxuLy8gI3BhcmFtIGFuaXNvdHJvcHlTdHJlbmd0aDogZjMyOyAvLyBpbml0aWFsVmFsdWU9MFxcbi8vICNwYXJhbSBhbmlzb3Ryb3B5Um90YXRpb246IHZlYzI8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPSgxLDApXFxuI2VuZGlmXFxuXFxuLy8gI3BhcmFtIGFscGhhQ3V0b2ZmOiBmMzI7IC8vIGluaXRpYWxWYWx1ZT0wLjAxXFxuXFxuQGdyb3VwKDEpIEBiaW5kaW5nKDE2KSB2YXIgZGlmZnVzZUVudlRleHR1cmU6IHRleHR1cmVfY3ViZTxmMzI+OyAvLyBpbml0aWFsVmFsdWU9YmxhY2tcXG5AZ3JvdXAoMikgQGJpbmRpbmcoMTYpIHZhciBkaWZmdXNlRW52U2FtcGxlcjogc2FtcGxlcjtcXG5AZ3JvdXAoMSkgQGJpbmRpbmcoMTcpIHZhciBzcGVjdWxhckVudlRleHR1cmU6IHRleHR1cmVfY3ViZTxmMzI+OyAvLyBpbml0aWFsVmFsdWU9YmxhY2tcXG5AZ3JvdXAoMikgQGJpbmRpbmcoMTcpIHZhciBzcGVjdWxhckVudlNhbXBsZXI6IHNhbXBsZXI7XFxuXFxuXFxuLy8gI3BhcmFtIGlibFBhcmFtZXRlcjogdmVjNDxmMzI+OyAvLyBpbml0aWFsVmFsdWU9KDEsMSwxLDEpLCBpc0ludGVybmFsU2V0dGluZz10cnVlXFxuLy8gI3BhcmFtIGhkcmlGb3JtYXQ6IHZlYzI8aTMyPjsgLy8gaW5pdGlhbFZhbHVlPSgwLDApLCBpc0ludGVybmFsU2V0dGluZz10cnVlXFxuLy8gI3BhcmFtIGludmVyc2VFbnZpcm9ubWVudDogYm9vbDsgLy8gaW5pdGlhbFZhbHVlPXRydWVcXG5mbiBnZXRfaXJyYWRpYW5jZShub3JtYWxfZm9yRW52OiB2ZWMzZiwgaGRyaUZvcm1hdDogdmVjMjxpMzI+KSAtPiB2ZWMzZiB7XFxuICBsZXQgZGlmZnVzZVRleGVsOiB2ZWM0ZiA9IHRleHR1cmVTYW1wbGUoZGlmZnVzZUVudlRleHR1cmUsIGRpZmZ1c2VFbnZTYW1wbGVyLCBub3JtYWxfZm9yRW52KTtcXG5cXG4gIHZhciBpcnJhZGlhbmNlOiB2ZWMzZjtcXG4gIGlmIChoZHJpRm9ybWF0LnggPT0gMCkge1xcbiAgICAvLyBMRFJfU1JHQlxcbiAgICBpcnJhZGlhbmNlID0gc3JnYlRvTGluZWFyKGRpZmZ1c2VUZXhlbC5yZ2IpO1xcbiAgfVxcbiAgZWxzZSBpZiAoaGRyaUZvcm1hdC54ID09IDMpIHtcXG4gICAgLy8gUkdCRVxcbiAgICBpcnJhZGlhbmNlID0gZGlmZnVzZVRleGVsLnJnYiAqIHBvdygyLjAsIGRpZmZ1c2VUZXhlbC5hKjI1NS4wLTEyOC4wKTtcXG4gIH1cXG4gIGVsc2Uge1xcbiAgICBpcnJhZGlhbmNlID0gZGlmZnVzZVRleGVsLnJnYjtcXG4gIH1cXG5cXG4gIHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG5cXG5mbiBnZXRfcmFkaWFuY2UocmVmbGVjdGlvbjogdmVjM2YsIGxvZDogZjMyLCBoZHJpRm9ybWF0OiB2ZWMyPGkzMj4pIC0+IHZlYzNmIHtcXG4gIGxldCBzcGVjdWxhclRleGVsID0gdGV4dHVyZVNhbXBsZUxldmVsKHNwZWN1bGFyRW52VGV4dHVyZSwgc3BlY3VsYXJFbnZTYW1wbGVyLCByZWZsZWN0aW9uLCBsb2QpO1xcblxcbiAgdmFyIHJhZGlhbmNlOiB2ZWMzZjtcXG4gIGlmIChoZHJpRm9ybWF0LnkgPT0gMCkge1xcbiAgICAvLyBMRFJfU1JHQlxcbiAgICByYWRpYW5jZSA9IHNyZ2JUb0xpbmVhcihzcGVjdWxhclRleGVsLnJnYik7XFxuICB9XFxuICBlbHNlIGlmIChoZHJpRm9ybWF0LnkgPT0gMykge1xcbiAgICAvLyBSR0JFXFxuICAgIHJhZGlhbmNlID0gc3BlY3VsYXJUZXhlbC5yZ2IgKiBwb3coMi4wLCBzcGVjdWxhclRleGVsLmEqMjU1LjAtMTI4LjApO1xcbiAgfVxcbiAgZWxzZSB7XFxuICAgIHJhZGlhbmNlID0gc3BlY3VsYXJUZXhlbC5yZ2I7XFxuICB9XFxuXFxuICByZXR1cm4gcmFkaWFuY2U7XFxufVxcblxcbiNpZmRlZiBSTl9VU0VfU0hFRU5cXG5mbiBzaGVlbklCTChOZG90VjogZjMyLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMiwgc2hlZW5Db2xvcjogdmVjM2YsIGlibFBhcmFtZXRlcjogdmVjNGYsIHJlZmxlY3Rpb246IHZlYzNmLCBoZHJpRm9ybWF0OiB2ZWMyaSkgLT4gdmVjM2ZcXG57XFxuICBsZXQgbWlwQ291bnQgPSBpYmxQYXJhbWV0ZXIueDtcXG4gIGxldCBsb2QgPSAoc2hlZW5QZXJjZXB0dWFsUm91Z2huZXNzICogKG1pcENvdW50IC0gMS4wKSk7XFxuXFxuICBsZXQgc2hlZW5MdXRVViA9IHZlYzJmKE5kb3RWLCBzaGVlblBlcmNlcHR1YWxSb3VnaG5lc3MpO1xcbiAgbGV0IGJyZGYgPSB0ZXh0dXJlU2FtcGxlKHNoZWVuTHV0VGV4dHVyZSwgc2hlZW5MdXRTYW1wbGVyLCBzaGVlbkx1dFVWKS5iO1xcbiAgdmFyIHNoZWVuTGlnaHQgPSBnZXRfcmFkaWFuY2UocmVmbGVjdGlvbiwgbG9kLCBoZHJpRm9ybWF0KTtcXG4gIGxldCBJQkxTcGVjdWxhckNvbnRyaWJ1dGlvbiA9IGlibFBhcmFtZXRlci56O1xcbiAgc2hlZW5MaWdodCAqPSBJQkxTcGVjdWxhckNvbnRyaWJ1dGlvbjtcXG5cXG4gIHJldHVybiBzaGVlbkxpZ2h0ICogc2hlZW5Db2xvciAqIGJyZGY7XFxufVxcbiNlbmRpZlxcblxcbmZuIGdldE5vcm1hbEZvckVudihyb3RFbnZNYXRyaXg6IG1hdDN4MzxmMzI+LCBub3JtYWxfaW5Xb3JsZDogdmVjM2YsIG1hdGVyaWFsU0lEOiB1MzIpIC0+IHZlYzNmIHtcXG4gIHZhciBub3JtYWxfZm9yRW52ID0gcm90RW52TWF0cml4ICogbm9ybWFsX2luV29ybGQ7XFxuICBpZiAoZ2V0X2ludmVyc2VFbnZpcm9ubWVudChtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgbm9ybWFsX2ZvckVudi54ICo9IC0xLjA7XFxuICB9XFxuICByZXR1cm4gbm9ybWFsX2ZvckVudjtcXG59XFxuXFxuZm4gZ2V0UmVmbGVjdGlvbihyb3RFbnZNYXRyaXg6IG1hdDN4MzxmMzI+LCB2aWV3RGlyZWN0aW9uOiB2ZWMzZiwgbm9ybWFsX2luV29ybGQ6IHZlYzNmLFxcbiAgbWF0ZXJpYWxTSUQ6IHUzMiwgcGVyY2VwdHVhbFJvdWdobmVzczogZjMyLFxcbiAgYW5pc290cm9weTogZjMyLCBhbmlzb3Ryb3B5RGlyZWN0aW9uOiB2ZWMzZlxcbiAgKSAtPiB2ZWMzZiB7XFxuI2lmZGVmIFJOX1VTRV9BTklTT1RST1BZXFxuICBsZXQgdGFuZ2VudFJvdWdobmVzcyA9IG1peChwZXJjZXB0dWFsUm91Z2huZXNzLCAxLjAsIGFuaXNvdHJvcHkgKiBhbmlzb3Ryb3B5KTtcXG4gIGxldCBhbmlzb3Ryb3BpY1RhbmdlbnQgID0gY3Jvc3MoYW5pc290cm9weURpcmVjdGlvbiwgdmlld0RpcmVjdGlvbik7XFxuICBsZXQgYW5pc290cm9waWNOb3JtYWwgICA9IGNyb3NzKGFuaXNvdHJvcGljVGFuZ2VudCwgYW5pc290cm9weURpcmVjdGlvbik7XFxuICBsZXQgYmVuZEZhY3RvciAgICAgICAgICA9IDEuMCAtIGFuaXNvdHJvcHkgKiAoMS4wIC0gcGVyY2VwdHVhbFJvdWdobmVzcyk7XFxuICBsZXQgYmVuZEZhY3RvclBvdzQgICAgICA9IGJlbmRGYWN0b3IgKiBiZW5kRmFjdG9yICogYmVuZEZhY3RvciAqIGJlbmRGYWN0b3I7XFxuICBsZXQgYmVudE5vcm1hbCAgICAgICAgICA9IG5vcm1hbGl6ZShtaXgoYW5pc290cm9waWNOb3JtYWwsIG5vcm1hbF9pbldvcmxkLCBiZW5kRmFjdG9yUG93NCkpO1xcbiAgdmFyIHJlZmxlY3Rpb24gPSByb3RFbnZNYXRyaXggKiByZWZsZWN0KC12aWV3RGlyZWN0aW9uLCBiZW50Tm9ybWFsKTtcXG4jZWxzZVxcbiAgdmFyIHJlZmxlY3Rpb24gPSByb3RFbnZNYXRyaXggKiByZWZsZWN0KC12aWV3RGlyZWN0aW9uLCBub3JtYWxfaW5Xb3JsZCk7XFxuI2VuZGlmXFxuICBpZiAoZ2V0X2ludmVyc2VFbnZpcm9ubWVudChtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgcmVmbGVjdGlvbi54ICo9IC0xLjA7XFxuICB9XFxuICByZXR1cm4gcmVmbGVjdGlvbjtcXG59XFxuXFxuZm4gc2NhbGVGb3JMb2QocGVyY2VwdHVhbFJvdWdobmVzczogZjMyLCBpb3I6IGYzMikgLT4gZjMyXFxue1xcbiAgLy8gU2NhbGUgcm91Z2huZXNzIHRvIHRoZSByYW5nZSBbMCwgMV0sXFxuICAvLyBpb3I9MS4wIHdpbGwgYmUgc2NhbGUgMCxcXG4gIC8vIGlvcj0xLjUgd2lsbCBiZSBzY2FsZSAxLjAsXFxuICAvLyBpb3I9MiB3aWxsIGJlIHNjYWxlIDEuMCAoY2xhbXBlZClcXG4gIC8vXFxuXFxuICBsZXQgc2NhbGUgPSBjbGFtcChpb3IgKiAyLjAgLSAyLjAsIDAuMCwgMS4wKTtcXG4gIHJldHVybiBwZXJjZXB0dWFsUm91Z2huZXNzICogc2NhbGU7XFxufVxcblxcbiNpZmRlZiBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuZm4gZ2V0X3NhbXBsZV9mcm9tX2JhY2tidWZmZXIobWF0ZXJpYWxTSUQ6IHUzMiwgc2FtcGxlQ29vcmQ6IHZlYzJmLCBwZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsIGlvcjogZjMyKSAtPiB2ZWMzZiB7XFxuICBsZXQgdnJTdGF0ZTogdmVjMjxpMzI+ID0gZ2V0X3ZyU3RhdGUoMCwgMCk7XFxuICBsZXQgYmFja0J1ZmZlclRleHR1cmVTaXplID0gdmVjMmYodGV4dHVyZURpbWVuc2lvbnMoYmFja0J1ZmZlclRleHR1cmUsIDApKTtcXG4gIHZhciBiYWNrQnVmZmVyVGV4dHVyZUxlbmd0aCA9IG1heChiYWNrQnVmZmVyVGV4dHVyZVNpemUueCwgYmFja0J1ZmZlclRleHR1cmVTaXplLnkpO1xcbiAgdmFyIG5ld1NhbXBsZUNvb3JkID0gc2FtcGxlQ29vcmQ7XFxuICBuZXdTYW1wbGVDb29yZC55ID0gMS4wIC0gbmV3U2FtcGxlQ29vcmQueTtcXG4gIGlmICh2clN0YXRlLnggPT0gMSkgeyAvLyBGb3IgVlJcXG4gICAgYmFja0J1ZmZlclRleHR1cmVMZW5ndGggPSBtYXgoYmFja0J1ZmZlclRleHR1cmVTaXplLnggLyAyLjAsIGJhY2tCdWZmZXJUZXh0dXJlU2l6ZS55KTtcXG4gICAgbmV3U2FtcGxlQ29vcmQueCA9IHNhbXBsZUNvb3JkLnggKiAwLjU7XFxuICAgIGlmICh2clN0YXRlLnkgPT0gMSkgeyAvLyBGb3IgcmlnaHQgZXllXFxuICAgICAgbmV3U2FtcGxlQ29vcmQueCArPSAwLjU7XFxuICAgIH1cXG4gIH1cXG4gIGxldCBmcmFtZWJ1ZmZlckxvZCA9IGxvZzIoYmFja0J1ZmZlclRleHR1cmVMZW5ndGgpICogc2NhbGVGb3JMb2QocGVyY2VwdHVhbFJvdWdobmVzcywgaW9yKTtcXG5cXG4gIGxldCB0cmFuc21pdHRlZExpZ2h0ID0gdGV4dHVyZVNhbXBsZUxldmVsKGJhY2tCdWZmZXJUZXh0dXJlLCBiYWNrQnVmZmVyU2FtcGxlciwgbmV3U2FtcGxlQ29vcmQsIGZyYW1lYnVmZmVyTG9kKS5yZ2I7XFxuXFxuICByZXR1cm4gdHJhbnNtaXR0ZWRMaWdodDtcXG59XFxuXFxuLy8gZnJvbSBnbFRGIFNhbXBsZSBWaWV3ZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtVmlld2VyXFxuZm4gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KG46IHZlYzNmLCB2OiB2ZWMzZiwgdGhpY2tuZXNzOiBmMzIsIGlvcjogZjMyLCBpbnN0YW5jZUluZm86IHUzMikgLT4gdmVjM2ZcXG57XFxuICBsZXQgcmVmcmFjdGlvblZlY3RvciA9IHJlZnJhY3QoLXYsIG5vcm1hbGl6ZShuKSwgMS4wIC8gaW9yKTtcXG4gIGxldCB3b3JsZE1hdHJpeCA9IGdldF93b3JsZE1hdHJpeChpbnN0YW5jZUluZm8pO1xcblxcbiAgdmFyIG1vZGVsU2NhbGU6IHZlYzNmO1xcbiAgbW9kZWxTY2FsZS54ID0gbGVuZ3RoKHZlYzNmKHdvcmxkTWF0cml4WzBdLnh5eikpO1xcbiAgbW9kZWxTY2FsZS55ID0gbGVuZ3RoKHZlYzNmKHdvcmxkTWF0cml4WzFdLnh5eikpO1xcbiAgbW9kZWxTY2FsZS56ID0gbGVuZ3RoKHZlYzNmKHdvcmxkTWF0cml4WzJdLnh5eikpO1xcblxcbiAgcmV0dXJuIG5vcm1hbGl6ZShyZWZyYWN0aW9uVmVjdG9yKSAqIHRoaWNrbmVzcyAqIG1vZGVsU2NhbGU7XFxufVxcbiNlbmRpZiAvLyBSTl9VU0VfVFJBTlNNSVNTSU9OXFxuXFxuc3RydWN0IElibFJlc3VsdFxcbntcXG4gIHNwZWN1bGFyOiB2ZWMzZixcXG4gIGRpZmZ1c2U6IHZlYzNmLFxcbiAgRnNzRXNzOiB2ZWMzZixcXG59O1xcblxcblxcbiNpZmRlZiBSTl9VU0VfSVJJREVTQ0VOQ0VcXG5mbiBnZXRJQkxSYWRpYW5jZUdHWFdpdGhJcmlkZXNjZW5jZShtYXRlcmlhbFNJRDogdTMyLCBOZG90VjogZjMyLCB2aWV3RGlyZWN0aW9uOiB2ZWMzZiwgYWxiZWRvOiB2ZWMzZiwgRjA6IHZlYzNmLFxcbiAgcGVyY2VwdHVhbFJvdWdobmVzczogZjMyLCBpYmxQYXJhbWV0ZXI6IHZlYzRmLCBoZHJpRm9ybWF0OiB2ZWMyaSwgcm90RW52TWF0cml4OiBtYXQzeDM8ZjMyPixcXG4gIG5vcm1hbF9mb3JFbnY6IHZlYzNmLCByZWZsZWN0aW9uOiB2ZWMzZiwgaXJpZGVzY2VuY2VGcmVzbmVsOiB2ZWMzZiwgaXJpZGVzY2VuY2U6IGYzMiwgc3BlY3VsYXJXZWlnaHQ6IGYzMikgLT4gSWJsUmVzdWx0XFxue1xcbiAgLy8gZ2V0IHJhZGlhbmNlXFxuICBsZXQgbWlwQ291bnQgPSBpYmxQYXJhbWV0ZXIueDtcXG4gIGxldCBsb2QgPSAocGVyY2VwdHVhbFJvdWdobmVzcyAqIChtaXBDb3VudCAtIDEuMCkpO1xcbiAgbGV0IHJhZGlhbmNlID0gZ2V0X3JhZGlhbmNlKHJlZmxlY3Rpb24sIGxvZCwgaGRyaUZvcm1hdCk7XFxuXFxuICAvLyBSb3VnaG5lc3MgZGVwZW5kZW50IGZyZXNuZWxcXG4gIGxldCBrUyA9IGZyZXNuZWxTY2hsaWNrUm91Z2huZXNzV2l0aElyaWRlc2NlbmNlKEYwLCBOZG90ViwgcGVyY2VwdHVhbFJvdWdobmVzcywgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZSk7XFxuICBsZXQgZl9hYiA9IGVudkJSREZBcHByb3gocGVyY2VwdHVhbFJvdWdobmVzcywgTmRvdFYpO1xcbiAgbGV0IEZzc0VzcyA9IGtTICogZl9hYi54ICsgZl9hYi55O1xcbiAgdmFyIHJlc3VsdDogSWJsUmVzdWx0O1xcbiAgcmVzdWx0LkZzc0VzcyA9IEZzc0VzcztcXG5cXG4gIC8vIFNwZWN1bGFyIElCTFxcbiAgdmFyIHNwZWN1bGFyID0gRnNzRXNzICogcmFkaWFuY2UgKiBzcGVjdWxhcldlaWdodDtcXG5cXG4gIC8vIHNjYWxlIHdpdGggdXNlciBwYXJhbWV0ZXJzXFxuICBsZXQgSUJMU3BlY3VsYXJDb250cmlidXRpb24gPSBpYmxQYXJhbWV0ZXIuejtcXG4gIHNwZWN1bGFyICo9IElCTFNwZWN1bGFyQ29udHJpYnV0aW9uO1xcblxcbiAgcmVzdWx0LnNwZWN1bGFyID0gc3BlY3VsYXI7XFxuXFxuICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5mbiBnZXRJQkxSYWRpYW5jZUxhbWJlcnRpYW5XaXRoSXJpZGVzY2VuY2UobWF0ZXJpYWxTSUQ6IHUzMiwgTmRvdFY6IGYzMiwgdmlld0RpcmVjdGlvbjogdmVjM2YsIGFsYmVkbzogdmVjM2YsIEYwOiB2ZWMzZixcXG4gIHBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMiwgaWJsUGFyYW1ldGVyOiB2ZWM0ZiwgaGRyaUZvcm1hdDogdmVjMmksIHJvdEVudk1hdHJpeDogbWF0M3gzPGYzMj4sXFxuICBub3JtYWxfZm9yRW52OiB2ZWMzZiwgcmVmbGVjdGlvbjogdmVjM2YsIGlyaWRlc2NlbmNlRjA6IHZlYzNmLCBpcmlkZXNjZW5jZTogZjMyLCBzcGVjdWxhcldlaWdodDogZjMyKSAtPiBJYmxSZXN1bHRcXG57XFxuICAvLyBnZXQgaXJyYWRpYW5jZVxcbiAgbGV0IGlycmFkaWFuY2UgPSBnZXRfaXJyYWRpYW5jZShub3JtYWxfZm9yRW52LCBoZHJpRm9ybWF0KTtcXG5cXG4gIC8vIFVzZSB0aGUgbWF4aW11bSBjb21wb25lbnQgb2YgdGhlIGlyaWRlc2NlbmNlIEZyZXNuZWwgY29sb3JcXG4gIC8vIE1heGltdW0gaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBSR0IgdmFsdWUgdG8gbm90IGdldCBpbnZlcnNlIGNvbG9ycyBmb3IgdGhlIGRpZmZ1c2UgQlJERlxcbiAgbGV0IGlyaWRlc2NlbmNlRjBNYXggPSB2ZWMzZihtYXgobWF4KGlyaWRlc2NlbmNlRjAuciwgaXJpZGVzY2VuY2VGMC5nKSwgaXJpZGVzY2VuY2VGMC5iKSk7XFxuXFxuICAvLyBCbGVuZCBiZXR3ZWVuIGJhc2UgRjAgYW5kIGlyaWRlc2NlbmNlIEYwXFxuICBsZXQgbWl4ZWRGMCA9IG1peChGMCwgaXJpZGVzY2VuY2VGME1heCwgaXJpZGVzY2VuY2UpO1xcblxcbiAgLy8gUm91Z2huZXNzIGRlcGVuZGVudCBmcmVzbmVsXFxuICBsZXQga1MgPSBmcmVzbmVsU2NobGlja1JvdWdobmVzcyhtaXhlZEYwLCBOZG90ViwgcGVyY2VwdHVhbFJvdWdobmVzcyk7XFxuICBsZXQgZl9hYiA9IGVudkJSREZBcHByb3gocGVyY2VwdHVhbFJvdWdobmVzcywgTmRvdFYpO1xcbiAgbGV0IEZzc0VzcyA9IHNwZWN1bGFyV2VpZ2h0ICoga1MgKiBmX2FiLnggKyBmX2FiLnk7XFxuICB2YXIgcmVzdWx0OiBJYmxSZXN1bHQ7XFxuICByZXN1bHQuRnNzRXNzID0gRnNzRXNzO1xcblxcbiAgLy8gTXVsdGlwbGUgc2NhdHRlcmluZywgRmRlei1BZ3VlcmEncyBhcHByb2FjaFxcbiAgbGV0IEVtcyA9ICgxLjAgLSAoZl9hYi54ICsgZl9hYi55KSk7XFxuICBsZXQgRl9hdmcgPSBzcGVjdWxhcldlaWdodCAqIChtaXhlZEYwICsgKDEuMCAtIG1peGVkRjApIC8gMjEuMCk7XFxuICBsZXQgRm1zRW1zID0gRW1zICogRnNzRXNzICogRl9hdmcgLyAoMS4wIC0gRl9hdmcgKiBFbXMpO1xcbiAgbGV0IGtfRCA9IGFsYmVkbyAqICgxLjAgLSBGc3NFc3MgLSBGbXNFbXMpO1xcblxcbiAgLy8gRGlmZnVzZSBJQkxcXG4gIHZhciBkaWZmdXNlID0gKEZtc0VtcyArIGtfRCkgKiBpcnJhZGlhbmNlO1xcblxcbiAgLy8gc2NhbGUgd2l0aCB1c2VyIHBhcmFtZXRlcnNcXG4gIGxldCBJQkxEaWZmdXNlQ29udHJpYnV0aW9uID0gaWJsUGFyYW1ldGVyLnk7XFxuICBkaWZmdXNlICo9IElCTERpZmZ1c2VDb250cmlidXRpb247XFxuXFxuICByZXN1bHQuZGlmZnVzZSA9IGRpZmZ1c2U7XFxuXFxuICByZXR1cm4gcmVzdWx0O1xcbn1cXG4jZW5kaWYgLy8gUk5fVVNFX0lSSURFU0NFTkNFXFxuXFxuZm4gZ2V0SUJMUmFkaWFuY2VMYW1iZXJ0aWFuKG1hdGVyaWFsU0lEOiB1MzIsIE5kb3RWOiBmMzIsIHZpZXdEaXJlY3Rpb246IHZlYzNmLCBhbGJlZG86IHZlYzNmLCBGMDogdmVjM2YsXFxuICBwZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsIGlibFBhcmFtZXRlcjogdmVjNGYsIGhkcmlGb3JtYXQ6IHZlYzI8aTMyPiwgcm90RW52TWF0cml4OiBtYXQzeDM8ZjMyPixcXG4gIG5vcm1hbF9mb3JFbnY6IHZlYzNmLCByZWZsZWN0aW9uOiB2ZWMzZiwgc3BlY3VsYXJXZWlnaHQ6IGYzMikgLT4gSWJsUmVzdWx0XFxue1xcbiAgLy8gZ2V0IGlycmFkaWFuY2VcXG4gIGxldCBpcnJhZGlhbmNlOiB2ZWMzZiA9IGdldF9pcnJhZGlhbmNlKG5vcm1hbF9mb3JFbnYsIGhkcmlGb3JtYXQpO1xcblxcbiAgLy8gUm91Z2huZXNzIGRlcGVuZGVudCBmcmVzbmVsXFxuICBsZXQga1M6IHZlYzNmID0gZnJlc25lbFNjaGxpY2tSb3VnaG5lc3MoRjAsIE5kb3RWLCBwZXJjZXB0dWFsUm91Z2huZXNzKTtcXG4gIGxldCBmX2FiOiB2ZWMyZiA9IGVudkJSREZBcHByb3gocGVyY2VwdHVhbFJvdWdobmVzcywgTmRvdFYpO1xcbiAgbGV0IEZzc0VzczogdmVjM2YgPSBzcGVjdWxhcldlaWdodCAqIGtTICogZl9hYi54ICsgZl9hYi55O1xcbiAgdmFyIHJlc3VsdDogSWJsUmVzdWx0O1xcbiAgcmVzdWx0LkZzc0VzcyA9IEZzc0VzcztcXG5cXG4gIC8vIE11bHRpcGxlIHNjYXR0ZXJpbmcsIEZkZXotQWd1ZXJhJ3MgYXBwcm9hY2hcXG4gIGxldCBFbXMgPSAoMS4wIC0gKGZfYWIueCArIGZfYWIueSkpO1xcbiAgbGV0IEZfYXZnOiB2ZWMzZiA9IHNwZWN1bGFyV2VpZ2h0ICogKEYwICsgKDEuMCAtIEYwKSAvIDIxLjApO1xcbiAgbGV0IEZtc0VtczogdmVjM2YgPSBFbXMgKiBGc3NFc3MgKiBGX2F2ZyAvICgxLjAgLSBGX2F2ZyAqIEVtcyk7XFxuICBsZXQga19EOiB2ZWMzZiA9IGFsYmVkbyAqICgxLjAgLSBGc3NFc3MgLSBGbXNFbXMpO1xcblxcbiAgLy8gRGlmZnVzZSBJQkxcXG4gIHZhciBkaWZmdXNlOiB2ZWMzZiA9IChGbXNFbXMgKyBrX0QpICogaXJyYWRpYW5jZTtcXG5cXG4gIC8vIHNjYWxlIHdpdGggdXNlciBwYXJhbWV0ZXJzXFxuICBsZXQgSUJMRGlmZnVzZUNvbnRyaWJ1dGlvbiA9IGlibFBhcmFtZXRlci55O1xcbiAgZGlmZnVzZSAqPSBJQkxEaWZmdXNlQ29udHJpYnV0aW9uO1xcblxcbiAgcmVzdWx0LmRpZmZ1c2UgPSBkaWZmdXNlO1xcblxcbiAgcmV0dXJuIHJlc3VsdDtcXG59XFxuXFxuZm4gZ2V0SUJMUmFkaWFuY2VHR1gobWF0ZXJpYWxTSUQ6IHUzMiwgTmRvdFY6IGYzMiwgdmlld0RpcmVjdGlvbjogdmVjM2YsIGFsYmVkbzogdmVjM2YsIEYwOiB2ZWMzZixcXG4gIHBlcmNlcHR1YWxSb3VnaG5lc3M6IGYzMiwgaWJsUGFyYW1ldGVyOiB2ZWM0ZiwgaGRyaUZvcm1hdDogdmVjMjxpMzI+LCByb3RFbnZNYXRyaXg6IG1hdDN4MzxmMzI+LFxcbiAgbm9ybWFsX2ZvckVudjogdmVjM2YsIHJlZmxlY3Rpb246IHZlYzNmLCBzcGVjdWxhcldlaWdodDogZjMyKSAtPiBJYmxSZXN1bHRcXG57XFxuICAvLyBnZXQgcmFkaWFuY2VcXG4gIGxldCBtaXBDb3VudCA9IGlibFBhcmFtZXRlci54O1xcbiAgbGV0IGxvZCA9IChwZXJjZXB0dWFsUm91Z2huZXNzICogKG1pcENvdW50IC0gMS4wKSk7XFxuICBsZXQgcmFkaWFuY2U6IHZlYzNmID0gZ2V0X3JhZGlhbmNlKHJlZmxlY3Rpb24sIGxvZCwgaGRyaUZvcm1hdCk7XFxuXFxuICAvLyBSb3VnaG5lc3MgZGVwZW5kZW50IGZyZXNuZWxcXG4gIGxldCBrUzogdmVjM2YgPSBmcmVzbmVsU2NobGlja1JvdWdobmVzcyhGMCwgTmRvdFYsIHBlcmNlcHR1YWxSb3VnaG5lc3MpO1xcbiAgbGV0IGZfYWI6IHZlYzJmID0gZW52QlJERkFwcHJveChwZXJjZXB0dWFsUm91Z2huZXNzLCBOZG90Vik7XFxuICBsZXQgRnNzRXNzOiB2ZWMzZiA9IGtTICogZl9hYi54ICsgZl9hYi55O1xcbiAgdmFyIHJlc3VsdDogSWJsUmVzdWx0O1xcbiAgcmVzdWx0LkZzc0VzcyA9IEZzc0VzcztcXG5cXG4gIC8vIFNwZWN1bGFyIElCTFxcbiAgdmFyIHNwZWN1bGFyOiB2ZWMzZiA9IEZzc0VzcyAqIHJhZGlhbmNlICogc3BlY3VsYXJXZWlnaHQ7XFxuXFxuICAvLyBzY2FsZSB3aXRoIHVzZXIgcGFyYW1ldGVyc1xcbiAgbGV0IElCTFNwZWN1bGFyQ29udHJpYnV0aW9uID0gaWJsUGFyYW1ldGVyLno7XFxuICBzcGVjdWxhciAqPSBJQkxTcGVjdWxhckNvbnRyaWJ1dGlvbjtcXG5cXG4gIHJlc3VsdC5zcGVjdWxhciA9IHNwZWN1bGFyO1xcblxcbiAgcmV0dXJuIHJlc3VsdDtcXG59XFxuXFxuZm4gSUJMQ29udHJpYnV0aW9uKG1hdGVyaWFsU0lEOiB1MzIsIGNhbWVyYVNJRDogdTMyLCBub3JtYWxfaW5Xb3JsZDogdmVjM2YsIE5kb3RWOiBmMzIsIHZpZXdEaXJlY3Rpb246IHZlYzNmLFxcbiAgYWxiZWRvOiB2ZWMzZiwgRjA6IHZlYzNmLCBwZXJjZXB0dWFsUm91Z2huZXNzOiBmMzIsXFxuICBjbGVhcmNvYXRSb3VnaG5lc3M6IGYzMiwgY2xlYXJjb2F0Tm9ybWFsX2luV29ybGQ6IHZlYzNmLCBjbGVhcmNvYXQ6IGYzMiwgVmRvdE5jOiBmMzIsIGdlb21Ob3JtYWxfaW5Xb3JsZDogdmVjM2YsXFxuICB0cmFuc21pc3Npb246IGYzMiwgdl9wb3NpdGlvbl9pbldvcmxkOiB2ZWMzZiwgaW5zdGFuY2VJbmZvOiB1MzIsIHRoaWNrbmVzczogZjMyLCBpb3I6IGYzMixcXG4gIHNoZWVuQ29sb3I6IHZlYzNmLCBzaGVlblJvdWdobmVzczogZjMyLCBhbGJlZG9TaGVlblNjYWxpbmdOZG90VjogZjMyLFxcbiAgaXJpZGVzY2VuY2VGcmVzbmVsOiB2ZWMzZiwgaXJpZGVzY2VuY2VGMDogdmVjM2YsIGlyaWRlc2NlbmNlOiBmMzIsXFxuICBhbmlzb3Ryb3B5OiBmMzIsIGFuaXNvdHJvcHlEaXJlY3Rpb246IHZlYzNmLCBzcGVjdWxhcldlaWdodDogZjMyXFxuICApIC0+IHZlYzNmXFxue1xcbiAgbGV0IGlibFBhcmFtZXRlcjogdmVjNGYgPSBnZXRfaWJsUGFyYW1ldGVyKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCByb3QgPSBpYmxQYXJhbWV0ZXIudyArIDMuMTQxNTtcXG4gIGxldCByb3RFbnZNYXRyaXggPSBtYXQzeDM8ZjMyPihjb3Mocm90KSwgMC4wLCAtc2luKHJvdCksIDAuMCwgMS4wLCAwLjAsIHNpbihyb3QpLCAwLjAsIGNvcyhyb3QpKTtcXG4gIGxldCBoZHJpRm9ybWF0OiB2ZWMyPGkzMj4gPSBnZXRfaGRyaUZvcm1hdChtYXRlcmlhbFNJRCwgMCk7XFxuXFxuICBsZXQgbm9ybWFsX2ZvckVudjogdmVjM2YgPSBnZXROb3JtYWxGb3JFbnYocm90RW52TWF0cml4LCBub3JtYWxfaW5Xb3JsZCwgbWF0ZXJpYWxTSUQpO1xcbiAgbGV0IHJlZmxlY3Rpb246IHZlYzNmID0gZ2V0UmVmbGVjdGlvbihyb3RFbnZNYXRyaXgsIHZpZXdEaXJlY3Rpb24sIG5vcm1hbF9pbldvcmxkLCBtYXRlcmlhbFNJRCwgcGVyY2VwdHVhbFJvdWdobmVzcywgYW5pc290cm9weSwgYW5pc290cm9weURpcmVjdGlvbik7XFxuXFxuICAvLyBJQkxcXG4jaWZkZWYgUk5fVVNFX0lSSURFU0NFTkNFXFxuICBsZXQgYmFzZVJhZGlhbmNlUmVzdWx0OiBJYmxSZXN1bHQgPSBnZXRJQkxSYWRpYW5jZUdHWFdpdGhJcmlkZXNjZW5jZShtYXRlcmlhbFNJRCwgTmRvdFYsIHZpZXdEaXJlY3Rpb24sIGFsYmVkbywgRjAsXFxuICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBub3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlLCBzcGVjdWxhcldlaWdodCk7XFxuICBsZXQgYmFzZUxhbWJlcnRpYW5SZXN1bHQ6IElibFJlc3VsdCA9IGdldElCTFJhZGlhbmNlTGFtYmVydGlhbldpdGhJcmlkZXNjZW5jZShtYXRlcmlhbFNJRCwgTmRvdFYsIHZpZXdEaXJlY3Rpb24sIGFsYmVkbywgRjAsXFxuICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBub3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBpcmlkZXNjZW5jZUYwLCBpcmlkZXNjZW5jZSwgc3BlY3VsYXJXZWlnaHQpO1xcbiNlbHNlXFxuICBsZXQgYmFzZVJhZGlhbmNlUmVzdWx0OiBJYmxSZXN1bHQgPSBnZXRJQkxSYWRpYW5jZUdHWChtYXRlcmlhbFNJRCwgTmRvdFYsIHZpZXdEaXJlY3Rpb24sIGFsYmVkbywgRjAsXFxuICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBub3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBzcGVjdWxhcldlaWdodCk7XFxuICBsZXQgYmFzZUxhbWJlcnRpYW5SZXN1bHQ6IElibFJlc3VsdCA9IGdldElCTFJhZGlhbmNlTGFtYmVydGlhbihtYXRlcmlhbFNJRCwgTmRvdFYsIHZpZXdEaXJlY3Rpb24sIGFsYmVkbywgRjAsXFxuICAgIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBub3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBzcGVjdWxhcldlaWdodCk7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9UUkFOU01JU1NJT05cXG4gIGxldCByZWZyYWN0ZWRSYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoZ2VvbU5vcm1hbF9pbldvcmxkLCB2aWV3RGlyZWN0aW9uLCB0aGlja25lc3MsIGlvciwgaW5zdGFuY2VJbmZvKTtcXG4gIGxldCByZWZyYWN0ZWRSYXlGcm9tVlBvc2l0aW9uID0gdl9wb3NpdGlvbl9pbldvcmxkICsgcmVmcmFjdGVkUmF5O1xcbiAgbGV0IG5kY1BvaW50ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKSAqIGdldF92aWV3TWF0cml4KGNhbWVyYVNJRCwgMCkgKiB2ZWM0ZihyZWZyYWN0ZWRSYXlGcm9tVlBvc2l0aW9uLCAxLjApO1xcbiAgdmFyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb2ludC54eSAvIG5kY1BvaW50Lnc7XFxuICByZWZyYWN0aW9uQ29vcmRzICs9IDEuMDtcXG4gIHJlZnJhY3Rpb25Db29yZHMgLz0gMi4wO1xcbiAgdmFyIHRyYW5zbWl0dGVkTGlnaHQgPSBnZXRfc2FtcGxlX2Zyb21fYmFja2J1ZmZlcihtYXRlcmlhbFNJRCwgcmVmcmFjdGlvbkNvb3JkcywgcGVyY2VwdHVhbFJvdWdobmVzcywgaW9yKTtcXG5cXG4jaWZkZWYgUk5fVVNFX1ZPTFVNRVxcbiAgbGV0IGF0dGVudWF0aW9uQ29sb3IgPSBnZXRfYXR0ZW51YXRpb25Db2xvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgYXR0ZW51YXRpb25EaXN0YW5jZSA9IGdldF9hdHRlbnVhdGlvbkRpc3RhbmNlKG1hdGVyaWFsU0lELCAwKTtcXG4gIHRyYW5zbWl0dGVkTGlnaHQgPSB2b2x1bWVBdHRlbnVhdGlvbihhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCB0cmFuc21pdHRlZExpZ2h0LCBsZW5ndGgocmVmcmFjdGVkUmF5KSk7XFxuI2VuZGlmXFxuXFxuICBsZXQgdHJhbnNtaXNzaW9uQ29tcCA9ICh2ZWMzZigxLjApIC0gYmFzZVJhZGlhbmNlUmVzdWx0LkZzc0VzcykgKiB0cmFuc21pdHRlZExpZ2h0ICogYWxiZWRvO1xcbiAgbGV0IGRpZmZ1c2UgPSBtaXgoYmFzZUxhbWJlcnRpYW5SZXN1bHQuZGlmZnVzZSwgdHJhbnNtaXNzaW9uQ29tcCwgdHJhbnNtaXNzaW9uKTtcXG4gIGxldCBiYXNlID0gZGlmZnVzZSArIGJhc2VSYWRpYW5jZVJlc3VsdC5zcGVjdWxhcjtcXG4jZWxzZVxcbiAgbGV0IGJhc2U6IHZlYzNmID0gYmFzZUxhbWJlcnRpYW5SZXN1bHQuZGlmZnVzZSArIGJhc2VSYWRpYW5jZVJlc3VsdC5zcGVjdWxhcjtcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX1NIRUVOXFxuICBsZXQgc2hlZW4gPSBzaGVlbklCTChOZG90Viwgc2hlZW5Sb3VnaG5lc3MsIHNoZWVuQ29sb3IsIGlibFBhcmFtZXRlciwgcmVmbGVjdGlvbiwgaGRyaUZvcm1hdCk7XFxuICBsZXQgY29sb3IgPSBzaGVlbiArIGJhc2UgKiBhbGJlZG9TaGVlblNjYWxpbmdOZG90VjtcXG4jZWxzZVxcbiAgbGV0IGNvbG9yID0gYmFzZTtcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0NMRUFSQ09BVFxcbiAgbGV0IFZkb3ROZyA9IGRvdChnZW9tTm9ybWFsX2luV29ybGQsIHZpZXdEaXJlY3Rpb24pO1xcbiAgbGV0IGNsZWFyY29hdE5vcm1hbF9mb3JFbnYgPSBnZXROb3JtYWxGb3JFbnYocm90RW52TWF0cml4LCBub3JtYWxfaW5Xb3JsZCwgbWF0ZXJpYWxTSUQpO1xcbiAgbGV0IGNvYXRSZXN1bHQ6IElibFJlc3VsdCA9IGdldElCTFJhZGlhbmNlR0dYKG1hdGVyaWFsU0lELCBWZG90TmMsIHZpZXdEaXJlY3Rpb24sIHZlYzNmKDAuMCksIEYwLFxcbiAgICBjbGVhcmNvYXRSb3VnaG5lc3MsIGlibFBhcmFtZXRlciwgaGRyaUZvcm1hdCwgcm90RW52TWF0cml4LCBjbGVhcmNvYXROb3JtYWxfZm9yRW52LCByZWZsZWN0aW9uLCBzcGVjdWxhcldlaWdodCk7XFxuICBsZXQgY29hdExheWVyID0gY29hdFJlc3VsdC5zcGVjdWxhcjtcXG5cXG4gIGxldCBjbGVhcmNvYXRGcmVzbmVsID0gMC4wNCArICgxLjAgLSAwLjA0KSAqIHBvdygxLjAgLSBhYnMoVmRvdE5jKSwgNS4wKTtcXG4gIGxldCBjb2F0ZWQgPSBjb2xvciAqIHZlYzNmKDEuMCAtIGNsZWFyY29hdCAqIGNsZWFyY29hdEZyZXNuZWwpICsgdmVjM2YoY29hdExheWVyICogY2xlYXJjb2F0KTtcXG4gIHJldHVybiBjb2F0ZWQ7XFxuI2Vsc2VcXG4gIHJldHVybiBjb2xvcjtcXG4jZW5kaWZcXG59XFxuXFxuXFxuXFxuQGZyYWdtZW50XFxuZm4gbWFpbihcXG4gIGlucHV0OiBWZXJ0ZXhPdXRwdXQsXFxuICBAYnVpbHRpbihmcm9udF9mYWNpbmcpIGlzRnJvbnQ6IGJvb2wsXFxuKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcXG5sZXQgbWF0ZXJpYWxTSUQgPSBfbWF0ZXJpYWxTSUQ7XFxubGV0IGN1cnJlbnRQcmltaXRpdmVJZHggPSBfY3VycmVudFByaW1pdGl2ZUlkeDtcXG5sZXQgbW9ycGhUYXJnZXROdW1iZXIgPSBfbW9ycGhUYXJnZXROdW1iZXI7XFxubGV0IGNhbWVyYVNJRCA9IF9jYW1lcmFTSUQ7XFxuXFxuICBsZXQgdmlld1Bvc2l0aW9uID0gZ2V0X3ZpZXdQb3NpdGlvbihjYW1lcmFTSUQsIDApO1xcbiAgbGV0IHZpZXdWZWN0b3IgPSB2aWV3UG9zaXRpb24gLSBpbnB1dC5wb3NpdGlvbl9pbldvcmxkLnh5ejtcXG4gIGxldCB2aWV3RGlyZWN0aW9uID0gbm9ybWFsaXplKHZpZXdWZWN0b3IpO1xcblxcbi8vIEJhc2VDb2xvclxcbiAgdmFyIGJhc2VDb2xvciA9IHZlYzQ8ZjMyPigxLCAxLCAxLCAxKTtcXG4gIHZhciBiYXNlQ29sb3JGYWN0b3IgPSBnZXRfYmFzZUNvbG9yRmFjdG9yKG1hdGVyaWFsU0lELCAwdSk7XFxuXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wXFxuICBiYXNlQ29sb3IgPSBpbnB1dC5jb2xvcl8wO1xcbiNlbmRpZlxcblxcbiAgYmFzZUNvbG9yICo9IGJhc2VDb2xvckZhY3RvcjtcXG5cXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzBcXG4gIGxldCBiYXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtOiB2ZWM0ZiA9IGdldF9iYXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBiYXNlQ29sb3JUZXh0dXJlUm90YXRpb246IGYzMiA9IGdldF9iYXNlQ29sb3JUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IGJhc2VDb2xvclRleGNvb3JkSW5kZXg6IHUzMiA9IHUzMihnZXRfYmFzZUNvbG9yVGV4Y29vcmRJbmRleChtYXRlcmlhbFNJRCwgMCkpO1xcbiAgbGV0IGJhc2VDb2xvclRleGNvb3JkID0gZ2V0VGV4Y29vcmQoYmFzZUNvbG9yVGV4Y29vcmRJbmRleCwgaW5wdXQpO1xcbiAgbGV0IGJhc2VDb2xvclRleFV2ID0gdXZUcmFuc2Zvcm0oYmFzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybS54eSwgYmFzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybS56dywgYmFzZUNvbG9yVGV4dHVyZVJvdGF0aW9uLCBiYXNlQ29sb3JUZXhjb29yZCk7XFxuICBsZXQgdGV4dHVyZUNvbG9yID0gdGV4dHVyZVNhbXBsZShiYXNlQ29sb3JUZXh0dXJlLCBiYXNlQ29sb3JTYW1wbGVyLCBiYXNlQ29sb3JUZXhVdik7XFxuICBiYXNlQ29sb3IgKj0gdmVjNChzcmdiVG9MaW5lYXIodGV4dHVyZUNvbG9yLnJnYiksIHRleHR1cmVDb2xvci5hKTtcXG4jZWxzZVxcbiAgbGV0IGJhc2VDb2xvclRleFV2ID0gdmVjMmYoMC4wLCAwLjApO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9JU19BTFBIQV9NT0RFX01BU0tcXG4gIGxldCBhbHBoYUN1dG9mZiA9IGdldF9hbHBoYUN1dG9mZihtYXRlcmlhbFNJRCwgMCk7XFxuICBpZiAoYmFzZUNvbG9yLmEgPCBhbHBoYUN1dG9mZikge1xcbiAgICBkaXNjYXJkO1xcbiAgfVxcbiNlbmRpZlxcblxcblxcblxcbi8vIE5vcm1hbFxcbiAgdmFyIG5vcm1hbF9pbldvcmxkID0gbm9ybWFsaXplKGlucHV0Lm5vcm1hbF9pbldvcmxkKTtcXG4gIGxldCBnZW9tTm9ybWFsX2luV29ybGQgPSBub3JtYWxfaW5Xb3JsZDtcXG4gIGxldCBub3JtYWxUZXh0dXJlVHJhbnNmb3JtOiB2ZWM0ZiA9IGdldF9ub3JtYWxUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBub3JtYWxUZXh0dXJlUm90YXRpb246IGYzMiA9IGdldF9ub3JtYWxUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IG5vcm1hbFRleGNvb3JkSW5kZXg6IHUzMiA9IHUzMihnZXRfbm9ybWFsVGV4Y29vcmRJbmRleChtYXRlcmlhbFNJRCwgMCkpO1xcbiAgbGV0IG5vcm1hbFRleGNvb3JkOiB2ZWMyZiA9IGdldFRleGNvb3JkKG5vcm1hbFRleGNvb3JkSW5kZXgsIGlucHV0KTtcXG4gIGxldCBub3JtYWxUZXhVdjogdmVjMmYgPSB1dlRyYW5zZm9ybShub3JtYWxUZXh0dXJlVHJhbnNmb3JtLnh5LCBub3JtYWxUZXh0dXJlVHJhbnNmb3JtLnp3LCBub3JtYWxUZXh0dXJlUm90YXRpb24sIG5vcm1hbFRleGNvb3JkKTtcXG4gIGxldCBUQk46IG1hdDN4MzxmMzI+ID0gZ2V0VEJOKG5vcm1hbF9pbldvcmxkLCBpbnB1dCwgdmlld1ZlY3Rvciwgbm9ybWFsVGV4VXYsIGlzRnJvbnQpO1xcbiAgI2lmZGVmIFJOX1VTRV9OT1JNQUxfVEVYVFVSRVxcbiAgICBsZXQgbm9ybWFsVGV4VmFsdWU6IHZlYzNmID0gdGV4dHVyZVNhbXBsZShub3JtYWxUZXh0dXJlLCBub3JtYWxTYW1wbGVyLCBub3JtYWxUZXhVdikueHl6O1xcbiAgICBpZihub3JtYWxUZXhWYWx1ZS5iID49IDEyOC4wIC8gMjU1LjApIHtcXG4gICAgICAvLyBub3JtYWwgdGV4dHVyZSBpcyBleGlzdGVuY2VcXG4gICAgICBsZXQgbm9ybWFsVGV4ID0gbm9ybWFsVGV4VmFsdWUgKiAyLjAgLSAxLjA7XFxuICAgICAgbGV0IG5vcm1hbFNjYWxlID0gZ2V0X25vcm1hbFNjYWxlKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgICBsZXQgc2NhbGVkTm9ybWFsID0gbm9ybWFsaXplKG5vcm1hbFRleCAqIHZlYzMobm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlLCAxLjApKTtcXG4gICAgICBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShUQk4gKiBzY2FsZWROb3JtYWwpO1xcbiAgICB9XFxuICAjZW5kaWZcXG5cXG4jaWZkZWYgUk5fSVNfTElHSFRJTkdcXG4gIC8vIE1ldGFsbGljICYgUm91Z2huZXNzXFxuICBsZXQgbWV0YWxsaWNSb3VnaG5lc3NGYWN0b3I6IHZlYzJmID0gZ2V0X21ldGFsbGljUm91Z2huZXNzRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIHZhciBtZXRhbGxpYyA9IG1ldGFsbGljUm91Z2huZXNzRmFjdG9yLng7XFxuICBsZXQgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtID0gZ2V0X21ldGFsbGljUm91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybShtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24gPSBnZXRfbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IG1ldGFsbGljUm91Z2huZXNzVGV4Y29vcmRJbmRleCA9IHUzMihnZXRfbWV0YWxsaWNSb3VnaG5lc3NUZXhjb29yZEluZGV4KG1hdGVyaWFsU0lELCAwKSk7XFxuICBsZXQgbWV0YWxsaWNSb3VnaG5lc3NUZXhjb29yZCA9IGdldFRleGNvb3JkKG1ldGFsbGljUm91Z2huZXNzVGV4Y29vcmRJbmRleCwgaW5wdXQpO1xcbiAgbGV0IG1ldGFsbGljUm91Z2huZXNzVGV4VXYgPSB1dlRyYW5zZm9ybShtZXRhbGxpY1JvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0ueHksIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybS56dywgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24sIG1ldGFsbGljUm91Z2huZXNzVGV4Y29vcmQpO1xcbiAgbGV0IG9ybVRleGVsID0gdGV4dHVyZVNhbXBsZShtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUsIG1ldGFsbGljUm91Z2huZXNzU2FtcGxlciwgbWV0YWxsaWNSb3VnaG5lc3NUZXhVdik7XFxuICB2YXIgcGVyY2VwdHVhbFJvdWdobmVzcyA9IG9ybVRleGVsLmcgKiBtZXRhbGxpY1JvdWdobmVzc0ZhY3Rvci55O1xcbiAgbWV0YWxsaWMgPSBvcm1UZXhlbC5iICogbWV0YWxsaWM7XFxuICBtZXRhbGxpYyA9IGNsYW1wKG1ldGFsbGljLCAwLjAsIDEuMCk7XFxuICBwZXJjZXB0dWFsUm91Z2huZXNzID0gY2xhbXAocGVyY2VwdHVhbFJvdWdobmVzcywgY19NaW5Sb3VnaG5lc3MsIDEuMCk7XFxuICBsZXQgYWxwaGFSb3VnaG5lc3MgPSBwZXJjZXB0dWFsUm91Z2huZXNzICogcGVyY2VwdHVhbFJvdWdobmVzcztcXG4gICAgLy8gZmlsdGVyIE5ERiBmb3Igc3BlY3VsYXIgQUEgLS0tIGh0dHBzOi8vamNndC5vcmcvcHVibGlzaGVkLzAwMTAvMDIvMDIvXFxuICBsZXQgYWxwaGFSb3VnaG5lc3MyID0gYWxwaGFSb3VnaG5lc3MgKiBhbHBoYVJvdWdobmVzcztcXG4gIGxldCBmaWx0ZXJlZFJvdWdobmVzczIgPSBJc290cm9waWNOREZGaWx0ZXJpbmcobm9ybWFsX2luV29ybGQsIGFscGhhUm91Z2huZXNzMik7XFxuICBwZXJjZXB0dWFsUm91Z2huZXNzID0gc3FydChzcXJ0KGZpbHRlcmVkUm91Z2huZXNzMikpO1xcblxcbiAgLy8gQWxiZWRvXFxuICBsZXQgYmxhY2sgPSB2ZWMzZigwLjApO1xcbiAgbGV0IGFsYmVkbyA9IG1peChiYXNlQ29sb3IucmdiLCBibGFjaywgbWV0YWxsaWMpO1xcblxcbiAgLy8gTmRvdFZcXG4gIGxldCBOZG90ViA9IGNsYW1wKGRvdChub3JtYWxfaW5Xb3JsZCwgdmlld0RpcmVjdGlvbiksIEVwc2lsb24sIDEuMCk7XFxuXFxuI2lmZGVmIFJOX1VTRV9BTklTT1RST1BZXFxuICAvLyBBbmlzb3Ryb3B5XFxuICB2YXIgYW5pc290cm9weTogZjMyID0gZ2V0X2FuaXNvdHJvcHlTdHJlbmd0aChtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgYW5pc290cm9weVJvdGF0aW9uOiB2ZWMyZiA9IGdldF9hbmlzb3Ryb3B5Um90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgdmFyIGRpcmVjdGlvbjogdmVjMmYgPSBhbmlzb3Ryb3B5Um90YXRpb247XFxuICBsZXQgYW5pc290cm9weVRleDogdmVjM2YgPSB0ZXh0dXJlU2FtcGxlKGFuaXNvdHJvcHlUZXh0dXJlLCBhbmlzb3Ryb3B5U2FtcGxlciwgYmFzZUNvbG9yVGV4VXYpLnJnYjtcXG4gIGRpcmVjdGlvbiA9IGFuaXNvdHJvcHlUZXgucmcgKiAyLjAgLSB2ZWMyZigxLjApO1xcbiAgZGlyZWN0aW9uID0gbWF0MngyPGYzMj4oYW5pc290cm9weVJvdGF0aW9uLngsIGFuaXNvdHJvcHlSb3RhdGlvbi55LCAtYW5pc290cm9weVJvdGF0aW9uLnksIGFuaXNvdHJvcHlSb3RhdGlvbi54KSAqIG5vcm1hbGl6ZShkaXJlY3Rpb24pO1xcbiAgYW5pc290cm9weSAqPSBhbmlzb3Ryb3B5VGV4LmI7XFxuICBsZXQgYW5pc290cm9waWNUOiB2ZWMzZiA9IG5vcm1hbGl6ZShUQk4gKiB2ZWMzZihkaXJlY3Rpb24sIDAuMCkpO1xcbiAgbGV0IGFuaXNvdHJvcGljQjogdmVjM2YgPSBub3JtYWxpemUoY3Jvc3MoZ2VvbU5vcm1hbF9pbldvcmxkLCBhbmlzb3Ryb3BpY1QpKTtcXG4gIGxldCBCZG90VjogZjMyID0gZG90KGFuaXNvdHJvcGljQiwgdmlld0RpcmVjdGlvbik7XFxuICBsZXQgVGRvdFY6IGYzMiA9IGRvdChhbmlzb3Ryb3BpY1QsIHZpZXdEaXJlY3Rpb24pO1xcbiNlbHNlXFxuICBsZXQgYW5pc290cm9weSA9IDAuMDtcXG4gIGxldCBhbmlzb3Ryb3BpY1QgPSB2ZWMzZigwLjAsIDAuMCwgMC4wKTtcXG4gIGxldCBhbmlzb3Ryb3BpY0IgPSB2ZWMzZigwLjAsIDAuMCwgMC4wKTtcXG4gIGxldCBCZG90ViA9IDAuMDtcXG4gIGxldCBUZG90ViA9IDAuMDtcXG4jZW5kaWZcXG5cXG4gIC8vIENsZWFyY29hdFxcbiNpZmRlZiBSTl9VU0VfQ0xFQVJDT0FUXFxuICBsZXQgY2xlYXJjb2F0RmFjdG9yID0gZ2V0X2NsZWFyQ29hdEZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgY2xlYXJjb2F0VGV4dHVyZVRyYW5zZm9ybSA9IGdldF9jbGVhckNvYXRUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBjbGVhcmNvYXRUZXh0dXJlUm90YXRpb24gPSBnZXRfY2xlYXJDb2F0VGV4dHVyZVJvdGF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBjbGVhckNvYXRUZXhjb29yZEluZGV4ID0gZ2V0X2NsZWFyQ29hdFRleGNvb3JkSW5kZXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IGNsZWFyQ29hdFRleGNvb3JkID0gZ2V0VGV4Y29vcmQoY2xlYXJDb2F0VGV4Y29vcmRJbmRleCwgaW5wdXQpO1xcbiAgbGV0IGNsZWFyY29hdFRleFV2ID0gdXZUcmFuc2Zvcm0oY2xlYXJjb2F0VGV4dHVyZVRyYW5zZm9ybS54eSwgY2xlYXJjb2F0VGV4dHVyZVRyYW5zZm9ybS56dywgY2xlYXJjb2F0VGV4dHVyZVJvdGF0aW9uLCBjbGVhckNvYXRUZXhjb29yZCk7XFxuICBsZXQgY2xlYXJjb2F0VGV4dHVyZSA9IHRleHR1cmVTYW1wbGUoY2xlYXJDb2F0VGV4dHVyZSwgY2xlYXJDb2F0U2FtcGxlciwgY2xlYXJjb2F0VGV4VXYpLnI7XFxuICBsZXQgY2xlYXJjb2F0ID0gY2xlYXJjb2F0RmFjdG9yICogY2xlYXJjb2F0VGV4dHVyZTtcXG4jZWxzZVxcbiAgbGV0IGNsZWFyY29hdCA9IDAuMDtcXG4jZW5kaWYgLy8gUk5fVVNFX0NMRUFSQ09BVFxcblxcbiAgLy8gVHJhbnNtaXNzaW9uXFxuI2lmZGVmIFJOX1VTRV9UUkFOU01JU1NJT05cXG4gIGxldCB0cmFuc21pc3Npb25GYWN0b3IgPSBnZXRfdHJhbnNtaXNzaW9uRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCB0cmFuc21pc3Npb25UZXh0dXJlID0gdGV4dHVyZVNhbXBsZSh0cmFuc21pc3Npb25UZXh0dXJlLCB0cmFuc21pc3Npb25TYW1wbGVyLCBiYXNlQ29sb3JUZXhVdikucjtcXG4gIGxldCB0cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb25GYWN0b3IgKiB0cmFuc21pc3Npb25UZXh0dXJlO1xcbiAgICAvLyBhbHBoYSAqPSB0cmFuc21pc3Npb247XFxuI2Vsc2VcXG4gIGxldCB0cmFuc21pc3Npb24gPSAwLjA7XFxuI2VuZGlmIC8vIFJOX1VTRV9UUkFOU01JU1NJT05cXG5cXG4jaWZkZWYgUk5fVVNFX1NQRUNVTEFSXFxuICBsZXQgc3BlY3VsYXJUZXh0dXJlOiBmMzIgPSB0ZXh0dXJlU2FtcGxlKHNwZWN1bGFyVGV4dHVyZSwgc3BlY3VsYXJTYW1wbGVyLCBiYXNlQ29sb3JUZXhVdikuYTtcXG4gIGxldCBzcGVjdWxhcjogZjMyID0gZ2V0X3NwZWN1bGFyRmFjdG9yKG1hdGVyaWFsU0lELCAwKSAqIHNwZWN1bGFyVGV4dHVyZTtcXG4gIGxldCBzcGVjdWxhckNvbG9yVGV4dHVyZTogdmVjM2YgPSBzcmdiVG9MaW5lYXIodGV4dHVyZVNhbXBsZShzcGVjdWxhckNvbG9yVGV4dHVyZSwgc3BlY3VsYXJDb2xvclNhbXBsZXIsIGJhc2VDb2xvclRleFV2KS5yZ2IpO1xcbiAgbGV0IHNwZWN1bGFyQ29sb3I6IHZlYzNmID0gZ2V0X3NwZWN1bGFyQ29sb3JGYWN0b3IobWF0ZXJpYWxTSUQsIDApICogc3BlY3VsYXJDb2xvclRleHR1cmU7XFxuI2Vsc2VcXG4gIGxldCBzcGVjdWxhciA9IDEuMDtcXG4gIGxldCBzcGVjdWxhckNvbG9yID0gdmVjM2YoMS4wLCAxLjAsIDEuMCk7XFxuI2VuZGlmIC8vIFJOX1VTRV9TUEVDVUxBUlxcblxcbiAgLy8gRjAsIEY5MFxcbiAgbGV0IGlvciA9IGdldF9pb3IobWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IG91dHNpZGVJb3IgPSAxLjA7XFxuICBsZXQgZGllbGVjdHJpY1NwZWN1bGFyRjAgPSBtaW4oXFxuICAgICgoaW9yIC0gb3V0c2lkZUlvcikgLyAoaW9yICsgb3V0c2lkZUlvcikpICogKChpb3IgLSBvdXRzaWRlSW9yKSAvIChpb3IgKyBvdXRzaWRlSW9yKSkgKiBzcGVjdWxhckNvbG9yLFxcbiAgICB2ZWMzZigxLjApXFxuICAgICkgKiBzcGVjdWxhcjtcXG4gIGxldCBkaWVsZWN0cmljU3BlY3VsYXJGOTAgPSB2ZWMzZihzcGVjdWxhcik7XFxuICBsZXQgRjAgPSBtaXgoZGllbGVjdHJpY1NwZWN1bGFyRjAsIGJhc2VDb2xvci5yZ2IsIG1ldGFsbGljKTtcXG4gIGxldCBGOTAgPSBtaXgoZGllbGVjdHJpY1NwZWN1bGFyRjkwLCB2ZWMzZigxLjApLCBtZXRhbGxpYyk7XFxuXFxuLy8gSXJpZGVzY2VuY2VcXG4jaWZkZWYgUk5fVVNFX0lSSURFU0NFTkNFXFxuICBsZXQgaXJpZGVzY2VuY2VGYWN0b3I6IGYzMiA9IGdldF9pcmlkZXNjZW5jZUZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgaXJpZGVzY2VuY2VUZXh0dXJlOiBmMzIgPSB0ZXh0dXJlU2FtcGxlKGlyaWRlc2NlbmNlVGV4dHVyZSwgaXJpZGVzY2VuY2VTYW1wbGVyLCBiYXNlQ29sb3JUZXhVdikucjtcXG4gIGxldCBpcmlkZXNjZW5jZTogZjMyID0gaXJpZGVzY2VuY2VGYWN0b3IgKiBpcmlkZXNjZW5jZVRleHR1cmU7XFxuICBsZXQgaXJpZGVzY2VuY2VJb3I6IGYzMiA9IGdldF9pcmlkZXNjZW5jZUlvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgdGhpY2tuZXNzUmF0aW86IGYzMiA9IHRleHR1cmVTYW1wbGUoaXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlLCBpcmlkZXNjZW5jZVRoaWNrbmVzc1NhbXBsZXIsIGJhc2VDb2xvclRleFV2KS5yO1xcbiAgbGV0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTogZjMyID0gZ2V0X2lyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bShtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOiBmMzIgPSBnZXRfaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBpcmlkZXNjZW5jZVRoaWNrbmVzczogZjMyID0gbWl4KGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSwgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtLCB0aGlja25lc3NSYXRpbyk7XFxuICBsZXQgaXJpZGVzY2VuY2VGcmVzbmVsOiB2ZWMzZiA9IGNhbGNJcmlkZXNjZW5jZSgxLjAsIGlyaWRlc2NlbmNlSW9yLCBOZG90ViwgaXJpZGVzY2VuY2VUaGlja25lc3MsIEYwKTtcXG4gIGxldCBpcmlkZXNjZW5jZUYwOiB2ZWMzZiA9IFNjaGxpY2tfdG9fRjAoaXJpZGVzY2VuY2VGcmVzbmVsLCBOZG90Vik7XFxuI2Vsc2VcXG4gIGxldCBpcmlkZXNjZW5jZSA9IDAuMDtcXG4gIGxldCBpcmlkZXNjZW5jZUZyZXNuZWwgPSB2ZWMzZigwLjApO1xcbiAgbGV0IGlyaWRlc2NlbmNlRjA6IHZlYzNmID0gRjA7XFxuI2VuZGlmIC8vIFJOX1VTRV9JUklERVNDRU5DRVxcblxcbi8vIENsZWFyY29hdFxcbiNpZmRlZiBSTl9VU0VfQ0xFQVJDT0FUXFxuICBsZXQgY2xlYXJjb2F0Um91Z2huZXNzRmFjdG9yID0gZ2V0X2NsZWFyQ29hdFJvdWdobmVzc0ZhY3RvcihtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgY2xlYXJDb2F0Um91Z2huZXNzVGV4Y29vcmRJbmRleCA9IGdldF9jbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZEluZGV4KG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBjbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZCA9IGdldFRleGNvb3JkKGNsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkSW5kZXgsIGlucHV0KTtcXG4gIGxldCBjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtID0gZ2V0X2NsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0obWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IGNsZWFyY29hdFJvdWdobmVzc1RleHR1cmVSb3RhdGlvbiA9IGdldF9jbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IGNsZWFyY29hdFJvdWdobmVzc1RleFV2ID0gdXZUcmFuc2Zvcm0oY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybS54eSwgY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZVRyYW5zZm9ybS56dywgY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZVJvdGF0aW9uLCBjbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZCk7XFxuICBsZXQgdGV4dHVyZVJvdWdobmVzc1RleHR1cmUgPSB0ZXh0dXJlU2FtcGxlKGNsZWFyQ29hdFJvdWdobmVzc1RleHR1cmUsIGNsZWFyQ29hdFJvdWdobmVzc1NhbXBsZXIsIGNsZWFyY29hdFJvdWdobmVzc1RleFV2KS5nO1xcbiAgbGV0IGNsZWFyY29hdFJvdWdobmVzcyA9IGNsZWFyY29hdFJvdWdobmVzc0ZhY3RvciAqIHRleHR1cmVSb3VnaG5lc3NUZXh0dXJlO1xcblxcbiAgbGV0IGNsZWFyQ29hdE5vcm1hbFRleGNvb3JkSW5kZXggPSBnZXRfY2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmRJbmRleChtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgY2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmQgPSBnZXRUZXhjb29yZChjbGVhckNvYXROb3JtYWxUZXhjb29yZEluZGV4LCBpbnB1dCk7XFxuICBsZXQgY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybSA9IGdldF9jbGVhckNvYXROb3JtYWxUZXh0dXJlVHJhbnNmb3JtKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBjbGVhcmNvYXROb3JtYWxUZXh0dXJlUm90YXRpb24gPSBnZXRfY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVJvdGF0aW9uKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBjbGVhcmNvYXROb3JtYWxUZXhVdiA9IHV2VHJhbnNmb3JtKGNsZWFyY29hdE5vcm1hbFRleHR1cmVUcmFuc2Zvcm0ueHksIGNsZWFyY29hdE5vcm1hbFRleHR1cmVUcmFuc2Zvcm0uencsIGNsZWFyY29hdE5vcm1hbFRleHR1cmVSb3RhdGlvbiwgY2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmQpO1xcbiAgbGV0IHRleHR1cmVOb3JtYWxfdGFuZ2VudCA9IHRleHR1cmVTYW1wbGUoY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZSwgY2xlYXJDb2F0Tm9ybWFsU2FtcGxlciwgY2xlYXJjb2F0Tm9ybWFsVGV4VXYpLnh5eiAqIHZlYzMoMi4wKSAtIHZlYzMoMS4wKTtcXG4gIGxldCBjbGVhcmNvYXROb3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShUQk4gKiB0ZXh0dXJlTm9ybWFsX3RhbmdlbnQpO1xcbiAgbGV0IFZkb3ROYyA9IHNhdHVyYXRlRXBzaWxvblRvT25lKGRvdCh2aWV3RGlyZWN0aW9uLCBjbGVhcmNvYXROb3JtYWxfaW5Xb3JsZCkpO1xcbiNlbHNlXFxuICBsZXQgY2xlYXJjb2F0Um91Z2huZXNzID0gMC4wO1xcbiAgbGV0IGNsZWFyY29hdE5vcm1hbF9pbldvcmxkID0gdmVjM2YoMC4wKTtcXG4gIGxldCBWZG90TmMgPSAwLjA7XFxuI2VuZGlmIC8vIFJOX1VTRV9DTEVBUkNPQVRcXG5cXG5cXG4jaWZkZWYgUk5fVVNFX1ZPTFVNRVxcbiAgLy8gVm9sdW1lXFxuICBsZXQgdGhpY2tuZXNzRmFjdG9yOiBmMzIgPSBnZXRfdGhpY2tuZXNzRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCB0aGlja25lc3NUZXh0dXJlOiBmMzIgPSB0ZXh0dXJlU2FtcGxlKHRoaWNrbmVzc1RleHR1cmUsIHRoaWNrbmVzc1NhbXBsZXIsIGJhc2VDb2xvclRleFV2KS5nO1xcbiAgbGV0IGF0dGVudWF0aW9uRGlzdGFuY2U6IGYzMiA9IGdldF9hdHRlbnVhdGlvbkRpc3RhbmNlKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBhdHRlbnVhdGlvbkNvbG9yOiB2ZWMzZiA9IGdldF9hdHRlbnVhdGlvbkNvbG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCB0aGlja25lc3M6IGYzMiA9IHRoaWNrbmVzc0ZhY3RvciAqIHRoaWNrbmVzc1RleHR1cmU7XFxuI2Vsc2VcXG4gIGxldCB0aGlja25lc3MgPSAwLjA7XFxuICBsZXQgYXR0ZW51YXRpb25Db2xvciA9IHZlYzNmKDAuMCk7XFxuICBsZXQgYXR0ZW51YXRpb25EaXN0YW5jZSA9IDAuMDAwMDAxO1xcbiNlbmRpZiAvLyBSTl9VU0VfVk9MVU1FXFxuXFxuI2lmZGVmIFJOX1VTRV9TSEVFTlxcbiAgLy8gU2hlZW5cXG4gIGxldCBzaGVlbkNvbG9yRmFjdG9yOiB2ZWMzZiA9IGdldF9zaGVlbkNvbG9yRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBzaGVlbkNvbG9yVGV4dHVyZTogdmVjM2YgPSB0ZXh0dXJlU2FtcGxlKHNoZWVuQ29sb3JUZXh0dXJlLCBzaGVlbkNvbG9yU2FtcGxlciwgYmFzZUNvbG9yVGV4VXYpLnJnYjtcXG4gIGxldCBzaGVlblJvdWdobmVzc0ZhY3RvcjogZjMyID0gZ2V0X3NoZWVuUm91Z2huZXNzRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBzaGVlblJvdWdobmVzc1RleHR1cmU6IGYzMiA9IHRleHR1cmVTYW1wbGUoc2hlZW5Sb3VnaG5lc3NUZXh0dXJlLCBzaGVlblJvdWdobmVzc1NhbXBsZXIsIGJhc2VDb2xvclRleFV2KS5hO1xcbiAgbGV0IHNoZWVuQ29sb3I6IHZlYzNmID0gc2hlZW5Db2xvckZhY3RvciAqIHNoZWVuQ29sb3JUZXh0dXJlO1xcbiAgbGV0IHNoZWVuUm91Z2huZXNzOiBmMzIgPSBjbGFtcChzaGVlblJvdWdobmVzc0ZhY3RvciAqIHNoZWVuUm91Z2huZXNzVGV4dHVyZSwgMC4wMDAwMDEsIDEuMCk7XFxuICBsZXQgYWxiZWRvU2hlZW5TY2FsaW5nTmRvdFY6IGYzMiA9IDEuMCAtIG1heDMoc2hlZW5Db2xvcikgKiB0ZXh0dXJlU2FtcGxlKHNoZWVuTHV0VGV4dHVyZSwgc2hlZW5MdXRTYW1wbGVyLCB2ZWMyKE5kb3RWLCBzaGVlblJvdWdobmVzcykpLnI7XFxuI2Vsc2VcXG4gIGxldCBzaGVlbkNvbG9yID0gdmVjM2YoMC4wKTtcXG4gIGxldCBzaGVlblJvdWdobmVzcyA9IDAuMDAwMDAxO1xcbiAgbGV0IGFsYmVkb1NoZWVuU2NhbGluZ05kb3RWID0gMS4wO1xcbiNlbmRpZiAvLyBSTl9VU0VfU0hFRU5cXG5cXG4gIHZhciByZXN1bHRDb2xvciA9IHZlYzM8ZjMyPigwLCAwLCAwKTtcXG4gIHZhciByZXN1bHRBbHBoYSA9IGJhc2VDb2xvci5hO1xcblxcbiAgLy8gTGlnaHRpbmdcXG4gIGxldCBsaWdodE51bWJlciA9IHUzMihnZXRfbGlnaHROdW1iZXIoMHUsIDB1KSk7XFxuICBmb3IgKHZhciBpID0gMHU7IGkgPCBsaWdodE51bWJlcjsgaSsrKSB7XFxuICAgIGxldCBsaWdodDogTGlnaHQgPSBnZXRMaWdodChpLCBpbnB1dC5wb3NpdGlvbl9pbldvcmxkKTtcXG4gICAgcmVzdWx0Q29sb3IgKz0gbGlnaHRpbmdXaXRoUHVuY3R1YWxMaWdodChsaWdodCwgbm9ybWFsX2luV29ybGQsIHZpZXdEaXJlY3Rpb24sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5kb3RWLCBhbGJlZG8sIHBlcmNlcHR1YWxSb3VnaG5lc3MsIEYwLCBGOTAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbiwgaW9yLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmNvYXQsIGNsZWFyY29hdFJvdWdobmVzcywgY2xlYXJjb2F0Tm9ybWFsX2luV29ybGQsIFZkb3ROYyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pc290cm9weSwgYW5pc290cm9waWNULCBhbmlzb3Ryb3BpY0IsIEJkb3RWLCBUZG90VixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZW5Db2xvciwgc2hlZW5Sb3VnaG5lc3MsIGFsYmVkb1NoZWVuU2NhbGluZ05kb3RWLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcmlkZXNjZW5jZSwgaXJpZGVzY2VuY2VGcmVzbmVsLCBzcGVjdWxhclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xcbiAgfVxcblxcbiAgbGV0IGlibDogdmVjM2YgPSBJQkxDb250cmlidXRpb24obWF0ZXJpYWxTSUQsIGNhbWVyYVNJRCwgbm9ybWFsX2luV29ybGQsIE5kb3RWLCB2aWV3RGlyZWN0aW9uLFxcbiAgICBhbGJlZG8sIEYwLCBwZXJjZXB0dWFsUm91Z2huZXNzLFxcbiAgICBjbGVhcmNvYXRSb3VnaG5lc3MsIGNsZWFyY29hdE5vcm1hbF9pbldvcmxkLCBjbGVhcmNvYXQsIFZkb3ROYywgZ2VvbU5vcm1hbF9pbldvcmxkLFxcbiAgICB0cmFuc21pc3Npb24sIGlucHV0LnBvc2l0aW9uX2luV29ybGQueHl6LCB1MzIoaW5wdXQuaW5zdGFuY2VJbmZvKSwgdGhpY2tuZXNzLCBpb3IsXFxuICAgIHNoZWVuQ29sb3IsIHNoZWVuUm91Z2huZXNzLCBhbGJlZG9TaGVlblNjYWxpbmdOZG90VixcXG4gICAgaXJpZGVzY2VuY2VGcmVzbmVsLCBpcmlkZXNjZW5jZUYwLCBpcmlkZXNjZW5jZSxcXG4gICAgYW5pc290cm9weSwgYW5pc290cm9waWNCLCBzcGVjdWxhclxcbiAgKTtcXG5cXG4gIGxldCBvY2NsdXNpb25UZXhjb29yZEluZGV4ID0gZ2V0X29jY2x1c2lvblRleGNvb3JkSW5kZXgobWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IG9jY2x1c2lvblRleGNvb3JkID0gZ2V0VGV4Y29vcmQob2NjbHVzaW9uVGV4Y29vcmRJbmRleCwgaW5wdXQpO1xcbiAgbGV0IG9jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm0gPSBnZXRfb2NjbHVzaW9uVGV4dHVyZVRyYW5zZm9ybShtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgb2NjbHVzaW9uVGV4dHVyZVJvdGF0aW9uID0gZ2V0X29jY2x1c2lvblRleHR1cmVSb3RhdGlvbihtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgb2NjbHVzaW9uVGV4VXYgPSB1dlRyYW5zZm9ybShvY2NsdXNpb25UZXh0dXJlVHJhbnNmb3JtLnh5LCBvY2NsdXNpb25UZXh0dXJlVHJhbnNmb3JtLnp3LCBvY2NsdXNpb25UZXh0dXJlUm90YXRpb24sIG9jY2x1c2lvblRleGNvb3JkKTtcXG4gIGxldCBvY2NsdXNpb24gPSB0ZXh0dXJlU2FtcGxlKG9jY2x1c2lvblRleHR1cmUsIG9jY2x1c2lvblNhbXBsZXIsIG9jY2x1c2lvblRleFV2KS5yO1xcbiAgbGV0IG9jY2x1c2lvblN0cmVuZ3RoID0gZ2V0X29jY2x1c2lvblN0cmVuZ3RoKG1hdGVyaWFsU0lELCAwKTtcXG5cXG4gIC8vIE9jY2x1dGlvbiB0byBJbmRpcmVjdCBMaWdodHNcXG4gIHJlc3VsdENvbG9yICs9IG1peChpYmwsIGlibCAqIG9jY2x1c2lvbiwgb2NjbHVzaW9uU3RyZW5ndGgpO1xcbiNlbHNlXFxuICB2YXIgcmVzdWx0Q29sb3IgPSBiYXNlQ29sb3IucmdiO1xcbiAgdmFyIHJlc3VsdEFscGhhID0gYmFzZUNvbG9yLmE7XFxuI2VuZGlmIC8vIFJOX0lTX0xJR0hUSU5HXFxuXFxuICAvLyBFbWlzc2l2ZVxcbiAgbGV0IGVtaXNzaXZlRmFjdG9yID0gZ2V0X2VtaXNzaXZlRmFjdG9yKG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBlbWlzc2l2ZVRleGNvb3JkSW5kZXggPSBnZXRfZW1pc3NpdmVUZXhjb29yZEluZGV4KG1hdGVyaWFsU0lELCAwKTtcXG4gIGxldCBlbWlzc2l2ZVRleGNvb3JkID0gZ2V0VGV4Y29vcmQoZW1pc3NpdmVUZXhjb29yZEluZGV4LCBpbnB1dCk7XFxuICBsZXQgZW1pc3NpdmVUZXh0dXJlVHJhbnNmb3JtID0gZ2V0X2VtaXNzaXZlVGV4dHVyZVRyYW5zZm9ybShtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgZW1pc3NpdmVUZXh0dXJlUm90YXRpb24gPSBnZXRfZW1pc3NpdmVUZXh0dXJlUm90YXRpb24obWF0ZXJpYWxTSUQsIDApO1xcbiAgbGV0IGVtaXNzaXZlVGV4VXYgPSB1dlRyYW5zZm9ybShlbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0ueHksIGVtaXNzaXZlVGV4dHVyZVRyYW5zZm9ybS56dywgZW1pc3NpdmVUZXh0dXJlUm90YXRpb24sIGVtaXNzaXZlVGV4Y29vcmQpO1xcbiAgbGV0IGVtaXNzaXZlU3RyZW5ndGggPSBnZXRfZW1pc3NpdmVTdHJlbmd0aChtYXRlcmlhbFNJRCwgMCk7XFxuICBsZXQgZW1pc3NpdmUgPSBlbWlzc2l2ZUZhY3RvciAqIHNyZ2JUb0xpbmVhcih0ZXh0dXJlU2FtcGxlKGVtaXNzaXZlVGV4dHVyZSwgZW1pc3NpdmVTYW1wbGVyLCBlbWlzc2l2ZVRleFV2KS54eXopICogZW1pc3NpdmVTdHJlbmd0aDtcXG5cXG4jaWZkZWYgUk5fVVNFX0NMRUFSQ09BVFxcbiAgbGV0IGNvYXRlZF9lbWlzc2l2ZSA9IGVtaXNzaXZlICogbWl4KHZlYzNmKDEuMCksIHZlYzNmKDAuMDQgKyAoMS4wIC0gMC4wNCkgKiBwb3coMS4wIC0gTmRvdFYsIDUuMCkpLCBjbGVhcmNvYXQpO1xcbiAgcmVzdWx0Q29sb3IgKz0gY29hdGVkX2VtaXNzaXZlO1xcbiNlbHNlXFxuICByZXN1bHRDb2xvciArPSBlbWlzc2l2ZTtcXG4jZW5kaWYgLy8gUk5fVVNFX0NMRUFSQ09BVFxcblxcbiNpZmRlZiBSTl9JU19BTFBIQV9NT0RFX0JMRU5EXFxuI2Vsc2VcXG4gIHJlc3VsdEFscGhhID0gMS4wO1xcbiNlbmRpZlxcblxcbmxldCBtYWtlT3V0cHV0U3JnYiA9IGdldF9tYWtlT3V0cHV0U3JnYihtYXRlcmlhbFNJRCwgMCk7XFxucmVzdWx0Q29sb3IgPSBzZWxlY3QocmVzdWx0Q29sb3IucmdiLCBsaW5lYXJUb1NyZ2IocmVzdWx0Q29sb3IucmdiKSwgbWFrZU91dHB1dFNyZ2IpO1xcblxcbiAgcmV0dXJuIHZlYzRmKHJlc3VsdENvbG9yICogcmVzdWx0QWxwaGEsIHJlc3VsdEFscGhhKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5cXG5mbiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoIHF1YXRlcm5pb246IHZlYzQ8ZjMyPiwgdHJhbnNsYXRpb246IHZlYzM8ZjMyPiwgc2NhbGU6IHZlYzM8ZjMyPiApIC0+IG1hdDR4NDxmMzI+IHtcXG4gIGxldCBxID0gcXVhdGVybmlvbjtcXG4gIGxldCB0ID0gdHJhbnNsYXRpb247XFxuXFxuICBsZXQgc3ggPSBxLnggKiBxLng7XFxuICBsZXQgc3kgPSBxLnkgKiBxLnk7XFxuICBsZXQgc3ogPSBxLnogKiBxLno7XFxuICBsZXQgY3ggPSBxLnkgKiBxLno7XFxuICBsZXQgY3kgPSBxLnggKiBxLno7XFxuICBsZXQgY3ogPSBxLnggKiBxLnk7XFxuICBsZXQgd3ggPSBxLncgKiBxLng7XFxuICBsZXQgd3kgPSBxLncgKiBxLnk7XFxuICBsZXQgd3ogPSBxLncgKiBxLno7XFxuXFxuICBsZXQgbWF0ID0gbWF0NHg0KFxcbiAgICAxLjAgLSAyLjAgKiAoc3kgKyBzeiksIDIuMCAqIChjeiArIHd6KSwgMi4wICogKGN5IC0gd3kpLCAwLjAsXFxuICAgIDIuMCAqIChjeiAtIHd6KSwgMS4wIC0gMi4wICogKHN4ICsgc3opLCAyLjAgKiAoY3ggKyB3eCksIDAuMCxcXG4gICAgMi4wICogKGN5ICsgd3kpLCAyLjAgKiAoY3ggLSB3eCksIDEuMCAtIDIuMCAqIChzeCArIHN5KSwgMC4wLFxcbiAgICB0LngsIHQueSwgdC56LCAxLjBcXG4gICk7XFxuXFxuICBsZXQgdW5pZm9ybVNjYWxlTWF0ID0gbWF0NHg0KFxcbiAgICBzY2FsZS54LCAwLjAsIDAuMCwgMC4wLFxcbiAgICAwLjAsIHNjYWxlLnksIDAuMCwgMC4wLFxcbiAgICAwLjAsIDAuMCwgc2NhbGUueiwgMC4wLFxcbiAgICAwLjAsIDAuMCwgMC4wLCAxLjBcXG4gICk7XFxuXFxuICBsZXQgbWF0NDQgPSBtYXQqdW5pZm9ybVNjYWxlTWF0O1xcbiAgcmV0dXJuIG1hdDQ0O1xcblxcbn1cXG5cXG5mbiB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlY194eTogdmVjMjxmMzI+LCBjcml0ZXJpYTogZjMyKSAtPiB2ZWM0PGYzMj4ge1xcblxcbiAgdmFyIHI6IGYzMjtcXG4gIHZhciBnOiBmMzI7XFxuICB2YXIgYjogZjMyO1xcbiAgdmFyIGE6IGYzMjtcXG5cXG4gIGxldCBpeCA9IGZsb29yKHZlY194eS54ICogY3JpdGVyaWEpO1xcbiAgbGV0IHYxeCA9IGl4IC8gY3JpdGVyaWE7XFxuICBsZXQgdjF5ID0gaXggLSBmbG9vcih2MXgpICogY3JpdGVyaWE7XFxuXFxuICByID0gKCB2MXggKyAxLjAgKSAvIChjcml0ZXJpYS0xLjApO1xcbiAgZyA9ICggdjF5ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG5cXG4gIGxldCBpeSA9IGZsb29yKCB2ZWNfeHkueSAqIGNyaXRlcmlhKTtcXG4gIGxldCB2MnggPSBpeSAvIGNyaXRlcmlhO1xcbiAgbGV0IHYyeSA9IGl5IC0gZmxvb3IodjJ4KSAqIGNyaXRlcmlhO1xcblxcbiAgYiA9ICggdjJ4ICsgMS4wICkgLyAoY3JpdGVyaWEtMS4wKTtcXG4gIGEgPSAoIHYyeSArIDEuMCApIC8gKGNyaXRlcmlhLTEuMCk7XFxuXFxuICByIC09IDEuMC9jcml0ZXJpYTtcXG4gIGcgLT0gMS4wL2NyaXRlcmlhO1xcbiAgYiAtPSAxLjAvY3JpdGVyaWE7XFxuICBhIC09IDEuMC9jcml0ZXJpYTtcXG5cXG4gIHIgPSByKjIuMC0xLjA7XFxuICBnID0gZyoyLjAtMS4wO1xcbiAgYiA9IGIqMi4wLTEuMDtcXG4gIGEgPSBhKjIuMC0xLjA7XFxuXFxuICByZXR1cm4gdmVjNDxmMzI+KHIsIGcsIGIsIGEpO1xcbn1cXG5cXG5mbiBnZXRfYm9uZU1hdHJpeEFzTWF0NHg0KHNrZWxldGFsQ29tcG9uZW50U0lEOiB1MzIsIGpvaW50OiB1MzIpIC0+IG1hdDR4NDxmMzI+IHtcXG4gIGxldCBtYXQ0MzogbWF0NHgzPGYzMj4gPSBnZXRfYm9uZU1hdHJpeChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQpO1xcbiAgcmV0dXJuIG1hdDR4NDxmMzI+KFxcbiAgICB2ZWM0PGYzMj4obWF0NDNbMF0sIDAuMCksXFxuICAgIHZlYzQ8ZjMyPihtYXQ0M1sxXSwgMC4wKSxcXG4gICAgdmVjNDxmMzI+KG1hdDQzWzJdLCAwLjApLFxcbiAgICB2ZWM0PGYzMj4obWF0NDNbM10sIDEuMClcXG4gICk7XFxufVxcblxcbmZuIGdldFNraW5NYXRyaXgoc2tlbGV0YWxDb21wb25lbnRTSUQ6IHUzMiwgam9pbnQ6IHZlYzQ8dTMyPiwgd2VpZ2h0OiB2ZWM0PGYzMj4pIC0+IG1hdDR4NDxmMzI+IHtcXG5cXG4jaWZkZWYgUk5fQk9ORV9EQVRBX1RZUEVfTWF0NDN4MVxcbiAgdmFyIHNraW5NYXQ6IG1hdDR4NDxmMzI+ID0gd2VpZ2h0LnggKiBnZXRfYm9uZU1hdHJpeEFzTWF0NHg0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC54KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnkgKiBnZXRfYm9uZU1hdHJpeEFzTWF0NHg0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC55KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnogKiBnZXRfYm9uZU1hdHJpeEFzTWF0NHg0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC56KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LncgKiBnZXRfYm9uZU1hdHJpeEFzTWF0NHg0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC53KTtcXG5cXG4jZWxpZiBkZWZpbmVkKFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMilcXG4gIGxldCBjcml0ZXJpYSA9IHZlYzI8ZjMyPig0MDk2LjAsIDQwOTYuMCk7XFxuXFxuICBsZXQgdHFfeCA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueCk7XFxuICBsZXQgc3FfeCA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC54KTtcXG4gIHZhciBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3gudywgc3FfeC53KSwgY3JpdGVyaWEueCk7XFxuICB2YXIgc2tpbk1hdDogbWF0NHg0PGYzMj4gPSB3ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV94Lnh5eiwgc3FfeC54eXopO1xcblxcbiAgbGV0IHRxX3kgPSBnZXRfYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnkpO1xcbiAgbGV0IHNxX3kgPSBnZXRfYm9uZVNjYWxlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueSk7XFxuICBxdWF0ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNCh2ZWMyKHRxX3kudywgc3FfeS53KSwgY3JpdGVyaWEueCk7XFxuICBza2luTWF0ICs9IHdlaWdodC55ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKHF1YXQsIHRxX3kueHl6LCBzcV95Lnh5eik7XFxuXFxuICBsZXQgdHFfeiA9IGdldF9ib25lVHJhbnNsYXRlUGFja2VkUXVhdChza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueik7XFxuICBsZXQgc3FfeiA9IGdldF9ib25lU2NhbGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC56KTtcXG4gIHF1YXQgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KHZlYzIodHFfei53LCBzcV96LncpLCBjcml0ZXJpYS54KTtcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnogKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUocXVhdCwgdHFfei54eXosIHNxX3oueHl6KTtcXG5cXG4gIGxldCB0cV93ID0gZ2V0X2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC53KTtcXG4gIGxldCBzcV93ID0gZ2V0X2JvbmVTY2FsZVBhY2tlZFF1YXQoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LncpO1xcbiAgcXVhdCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQodmVjMih0cV93LncsIHNxX3cudyksIGNyaXRlcmlhLngpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShxdWF0LCB0cV93Lnh5eiwgc3Ffdy54eXopO1xcblxcbiNlbGlmIGRlZmluZWQoUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRClcXG4gIGxldCB0c194ID0gZ2V0X2JvbmVUcmFuc2xhdGVTY2FsZShza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueCk7XFxuICB2YXIgc2tpbk1hdDogbWF0NHg0PGYzMj4gPSB3ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC54KSwgdHNfeC54eXosIHZlYzModHNfeC53KSk7XFxuICBsZXQgdHNfeSA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnkpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueSAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC55KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICBsZXQgdHNfeiA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LnopO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQueiAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC56KSwgdHNfei54eXosIHZlYzModHNfei53KSk7XFxuICBsZXQgdHNfdyA9IGdldF9ib25lVHJhbnNsYXRlU2NhbGUoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LncpO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgZ2V0X2JvbmVRdWF0ZXJuaW9uKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC53KSwgdHNfdy54eXosIHZlYzModHNfdy53KSk7XFxuXFxuI2VsaWYgZGVmaW5lZChSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDEpXFxuICBsZXQgYm9uZUNvbXByZXNzZWRDaHVua3NYID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LngpO1xcbiAgbGV0IGJvbmVDb21wcmVzc2VkQ2h1bmtzWSA9IGdldF9ib25lQ29tcHJlc3NlZENodW5rKHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludC55KTtcXG4gIGxldCBib25lQ29tcHJlc3NlZENodW5rc1ogPSBnZXRfYm9uZUNvbXByZXNzZWRDaHVuayhza2VsZXRhbENvbXBvbmVudFNJRCwgam9pbnQueik7XFxuICBsZXQgYm9uZUNvbXByZXNzZWRDaHVua3NXID0gZ2V0X2JvbmVDb21wcmVzc2VkQ2h1bmsoc2tlbGV0YWxDb21wb25lbnRTSUQsIGpvaW50LncpO1xcblxcbiAgbGV0IGNyaXRlcmlhID0gdmVjMjxmMzI+KDQwOTYuMCwgNDA5Ni4wKTtcXG4gIGxldCBib25lQ29tcHJlc3NlZEluZm8gPSBnZXRfYm9uZUNvbXByZXNzZWRJbmZvKDAuMCwgMCk7XFxuXFxuICBsZXQgdHNfeCA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NYLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICB2YXIgc2tpbk1hdDogbWF0NHg0PGYzMj4gPSB3ZWlnaHQueCAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1gueHksIGNyaXRlcmlhLngpLCB0c194Lnh5eiwgdmVjMyh0c194LncpKTtcXG4gIGxldCB0c195ID0gdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1kuencsIGNyaXRlcmlhLnkpKmJvbmVDb21wcmVzc2VkSW5mbztcXG4gIHNraW5NYXQgKz0gd2VpZ2h0LnkgKiBjcmVhdGVNYXRyaXhGcm9tUXVhdGVybmlvblRyYW5zbGF0aW9uU2NhbGUoXFxuICAgIHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NZLnh5LCBjcml0ZXJpYS54KSwgdHNfeS54eXosIHZlYzModHNfeS53KSk7XFxuICBsZXQgdHNfeiA9IHVucGFja2VkVmVjMlRvTm9ybWFsaXplZFZlYzQoYm9uZUNvbXByZXNzZWRDaHVua3NaLnp3LCBjcml0ZXJpYS55KSpib25lQ29tcHJlc3NlZEluZm87XFxuICBza2luTWF0ICs9IHdlaWdodC56ICogY3JlYXRlTWF0cml4RnJvbVF1YXRlcm5pb25UcmFuc2xhdGlvblNjYWxlKFxcbiAgICB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzWi54eSwgY3JpdGVyaWEueCksIHRzX3oueHl6LCB2ZWMzKHRzX3oudykpO1xcbiAgbGV0IHRzX3cgPSB1bnBhY2tlZFZlYzJUb05vcm1hbGl6ZWRWZWM0KGJvbmVDb21wcmVzc2VkQ2h1bmtzVy56dywgY3JpdGVyaWEueSkqYm9uZUNvbXByZXNzZWRJbmZvO1xcbiAgc2tpbk1hdCArPSB3ZWlnaHQudyAqIGNyZWF0ZU1hdHJpeEZyb21RdWF0ZXJuaW9uVHJhbnNsYXRpb25TY2FsZShcXG4gICAgdW5wYWNrZWRWZWMyVG9Ob3JtYWxpemVkVmVjNChib25lQ29tcHJlc3NlZENodW5rc1cueHksIGNyaXRlcmlhLngpLCB0c193Lnh5eiwgdmVjMyh0c193LncpKTtcXG4jZW5kaWZcXG4gIHJldHVybiBza2luTWF0O1xcbn1cXG4jZW5kaWZcXG5cXG5mbiB0b05vcm1hbE1hdHJpeChtOiBtYXQ0eDQ8ZjMyPikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IGEwMCA9IG1bMF1bMF07XFxuICBsZXQgYTAxID0gbVswXVsxXTtcXG4gIGxldCBhMDIgPSBtWzBdWzJdO1xcbiAgbGV0IGEwMyA9IG1bMF1bM107XFxuICBsZXQgYTEwID0gbVsxXVswXTtcXG4gIGxldCBhMTEgPSBtWzFdWzFdO1xcbiAgbGV0IGExMiA9IG1bMV1bMl07XFxuICBsZXQgYTEzID0gbVsxXVszXTtcXG4gIGxldCBhMjAgPSBtWzJdWzBdO1xcbiAgbGV0IGEyMSA9IG1bMl1bMV07XFxuICBsZXQgYTIyID0gbVsyXVsyXTtcXG4gIGxldCBhMjMgPSBtWzJdWzNdO1xcbiAgbGV0IGEzMCA9IG1bM11bMF07XFxuICBsZXQgYTMxID0gbVszXVsxXTtcXG4gIGxldCBhMzIgPSBtWzNdWzJdO1xcbiAgbGV0IGEzMyA9IG1bM11bM107XFxuXFxuICBsZXQgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xcbiAgbGV0IGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcXG4gIGxldCBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XFxuICBsZXQgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xcbiAgbGV0IGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcXG4gIGxldCBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XFxuICBsZXQgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xcbiAgbGV0IGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcXG4gIGxldCBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XFxuICBsZXQgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xcbiAgbGV0IGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcXG4gIGxldCBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7XFxuXFxuICBsZXQgZGV0ZXJtaW5hbnRWYWwgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XFxuXFxuICByZXR1cm4gbWF0M3gzPGYzMj4oXFxuICAgIChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpIC8gZGV0ZXJtaW5hbnRWYWwsXFxuICAgIChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApIC8gZGV0ZXJtaW5hbnRWYWxcXG4gICk7XFxufVxcblxcbnN0cnVjdCBHZW9tZXRvcnlPdXRwdXQge1xcbiAgbm9ybWFsTWF0cml4OiBtYXQzeDM8ZjMyPixcXG4gIHBvc2l0aW9uX2luV29ybGQ6IHZlYzQ8ZjMyPixcXG4gIG5vcm1hbF9pbldvcmxkOiB2ZWMzPGYzMj4sXFxuICBpc1NraW5uaW5nOiBib29sLFxcbn1cXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG5mbiBza2lubmluZyhcXG4gIHNrZWxldGFsQ29tcG9uZW50U0lEOiB1MzIsXFxuICBpbk5vcm1hbE1hdHJpeDogbWF0M3gzPGYzMj4sXFxuICBpblBvc2l0aW9uX2luTG9jYWw6IHZlYzM8ZjMyPixcXG4gIGluTm9ybWFsX2luTG9jYWw6IHZlYzM8ZjMyPixcXG4gIGpvaW50OiB2ZWM0PHUzMj4sXFxuICB3ZWlnaHQ6IHZlYzQ8ZjMyPixcXG4gICkgLT4gR2VvbWV0b3J5T3V0cHV0XFxue1xcbiAgdmFyIG91dHB1dDogR2VvbWV0b3J5T3V0cHV0O1xcbiAgbGV0IHNraW5NYXQgPSBnZXRTa2luTWF0cml4KHNrZWxldGFsQ29tcG9uZW50U0lELCBqb2ludCwgd2VpZ2h0KTtcXG4gIG91dHB1dC5wb3NpdGlvbl9pbldvcmxkID0gc2tpbk1hdCAqIHZlYzQ8ZjMyPihpblBvc2l0aW9uX2luTG9jYWwsIDEuMCk7XFxuICBvdXRwdXQubm9ybWFsTWF0cml4ID0gdG9Ob3JtYWxNYXRyaXgoc2tpbk1hdCk7XFxuICBvdXRwdXQubm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUob3V0cHV0Lm5vcm1hbE1hdHJpeCAqIGluTm9ybWFsX2luTG9jYWwpO1xcbiAgb3V0cHV0LmlzU2tpbm5pbmcgPSB0cnVlO1xcblxcbiAgcmV0dXJuIG91dHB1dDtcXG59XFxuI2VuZGlmXFxuXFxuXFxuZm4gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICBza2VsZXRhbENvbXBvbmVudFNJRDogaTMyLFxcbiAgYmxlbmRTaGFwZUNvbXBvbmVudFNJRDogdTMyLFxcbiAgd29ybGRNYXRyaXg6IG1hdDR4NDxmMzI+LFxcbiAgdmlld01hdHJpeDogbWF0NHg0PGYzMj4sXFxuICBpc0JpbGxib2FyZDogYm9vbCxcXG4gIGluTm9ybWFsTWF0cml4OiBtYXQzeDM8ZjMyPixcXG4gIGluUG9zaXRpb25faW5Mb2NhbDogdmVjMzxmMzI+LFxcbiAgaW5Ob3JtYWxfaW5Mb2NhbDogdmVjMzxmMzI+LFxcbiAgYmFyeUNlbnRyaWNDb29yZDogdmVjNDxmMzI+LFxcbiAgam9pbnQ6IHZlYzQ8dTMyPixcXG4gIHdlaWdodDogdmVjNDxmMzI+LFxcbikgLT4gR2VvbWV0b3J5T3V0cHV0IHtcXG4gIHZhciBvdXRwdXQ6IEdlb21ldG9yeU91dHB1dDtcXG5cXG4gIHZhciBwb3NpdGlvbl9pbkxvY2FsOiB2ZWMzPGYzMj47XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICBpZiAoX21vcnBoVGFyZ2V0TnVtYmVyID09IDB1KSB7XFxuI2VuZGlmXFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBpblBvc2l0aW9uX2luTG9jYWw7XFxuI2lmZGVmIFJOX0lTX01PUlBISU5HXFxuICB9IGVsc2Uge1xcbiAgICBsZXQgdmVydGV4SWR4ID0gdTMyKGJhcnlDZW50cmljQ29vcmQudyk7XFxuICAgIHBvc2l0aW9uX2luTG9jYWwgPSBnZXRfcG9zaXRpb24odmVydGV4SWR4LCBpblBvc2l0aW9uX2luTG9jYWwsIGJsZW5kU2hhcGVDb21wb25lbnRTSUQpO1xcbiAgfVxcbiNlbmRpZlxcblxcbiAgdmFyIHdvcmxkTWF0cml4SW5uZXIgPSB3b3JsZE1hdHJpeDtcXG5cXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIGlmIChza2VsZXRhbENvbXBvbmVudFNJRCA+PSAwKSB7XFxuICAgIG91dHB1dCA9IHNraW5uaW5nKHUzMihza2VsZXRhbENvbXBvbmVudFNJRCksIGluTm9ybWFsTWF0cml4LCBwb3NpdGlvbl9pbkxvY2FsLCBpbk5vcm1hbF9pbkxvY2FsLCBqb2ludCwgd2VpZ2h0KTtcXG4gIH0gZWxzZSB7XFxuI2VuZGlmXFxuICAgIG91dHB1dC5ub3JtYWxNYXRyaXggPSBpbk5vcm1hbE1hdHJpeDtcXG4gICAgb3V0cHV0LnBvc2l0aW9uX2luV29ybGQgPSB3b3JsZE1hdHJpeElubmVyICogdmVjNChwb3NpdGlvbl9pbkxvY2FsLCAxLjApO1xcbiAgICBvdXRwdXQubm9ybWFsX2luV29ybGQgPSBub3JtYWxpemUoaW5Ob3JtYWxNYXRyaXggKiBpbk5vcm1hbF9pbkxvY2FsKTtcXG4gICAgb3V0cHV0LmlzU2tpbm5pbmcgPSBmYWxzZTtcXG4jaWZkZWYgUk5fSVNfU0tJTk5JTkdcXG4gIH1cXG4jZW5kaWZcXG5cXG4gIHJldHVybiBvdXRwdXQ7XFxufVxcblxcblxcbi8vIEJpYXNNYXRyaXggKiBMaWdodFByb2plY3Rpb25NYXRyaXggKiBMaWdodFZpZXdNYXRyaXgsIFNlZTogaHR0cDovL3d3dy5vcGVuZ2wtdHV0b3JpYWwub3JnL2ludGVybWVkaWF0ZS10dXRvcmlhbHMvdHV0b3JpYWwtMTYtc2hhZG93LW1hcHBpbmcvI2Jhc2ljLXNoYWRlclxcbi8vICNwYXJhbSBkZXB0aEJpYXNQVjogbWF0NHg0PGYzMj47IC8vIGluaXRpYWxWYWx1ZT0oMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSlcXG5cXG5AdmVydGV4XFxuZm4gbWFpbihcXG4jaWZkZWYgUk5fVVNFX0lOU1RBTkNFXFxuICBAbG9jYXRpb24oOCkgaW5zdGFuY2VfaWRzOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9GTE9BVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9JTlRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxpMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fVUlOVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPHUzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcXG4gIEBsb2NhdGlvbigxKSBub3JtYWw6IHZlYzM8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gIEBsb2NhdGlvbigyKSB0YW5nZW50OiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8wXFxuICBAbG9jYXRpb24oMykgdGV4Y29vcmRfMDogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMVxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzE6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfRkxPQVRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX0lOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8aTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfVUlOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0pPSU5UU18wXFxuICBAbG9jYXRpb24oNikgam9pbnRzXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1dFSUdIVFNfMFxcbiAgQGxvY2F0aW9uKDcpIHdlaWdodHNfMDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQkFSWV9DRU5UUklDX0NPT1JEXFxuICBAbG9jYXRpb24oMTApIGJhcnlDZW50cmljQ29vcmQ6IHZlYzQ8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzJcXG4gIEBsb2NhdGlvbigxMSkgdGV4Y29vcmRfMjogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiAgQGJ1aWx0aW4odmVydGV4X2luZGV4KSB2ZXJ0ZXhJZHggOiB1MzIsXFxuXFxuXFxuKSAtPiBWZXJ0ZXhPdXRwdXQge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxuICBsZXQgaW5zdGFuY2VJZCA9IHUzMihpbnN0YW5jZV9pZHMueCk7XFxuICBsZXQgd29ybGRNYXRyaXggPSBnZXRfd29ybGRNYXRyaXgoaW5zdGFuY2VJZCk7XFxuICBsZXQgbm9ybWFsTWF0cml4ID0gZ2V0X25vcm1hbE1hdHJpeChpbnN0YW5jZUlkKTtcXG4gIGxldCB2aWV3TWF0cml4ID0gZ2V0X3ZpZXdNYXRyaXgoY2FtZXJhU0lELCAwKTtcXG4gIGxldCBwcm9qZWN0aW9uTWF0cml4ID0gZ2V0X3Byb2plY3Rpb25NYXRyaXgoY2FtZXJhU0lELCAwKTtcXG5cXG4gIGxldCBza2VsZXRhbENvbXBvbmVudFNJRCA9IGkzMihpbnN0YW5jZV9pZHMueSk7XFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcXG4jZWxzZVxcbiAgbGV0IG5vcm1hbCA9IHZlYzM8ZjMyPigwLjAsIDAuMCwgMC4wKTtcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0pPSU5UU18wXFxuICBsZXQgam9pbnQgPSBqb2ludHNfMDtcXG4jZWxzZVxcbiAgbGV0IGpvaW50ID0gdmVjNDx1MzI+KDAsIDAsIDAsIDApO1xcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfV0VJR0hUU18wXFxuICBsZXQgd2VpZ2h0ID0gd2VpZ2h0c18wO1xcbiNlbHNlXFxuICBsZXQgd2VpZ2h0ID0gdmVjNDxmMzI+KDAuMCwgMC4wLCAwLjAsIDAuMCk7XFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9CQVJZX0NFTlRSSUNfQ09PUkRcXG4jZWxzZVxcbiAgbGV0IGJhcnlDZW50cmljQ29vcmQgPSB2ZWM0PGYzMj4oMC4wLCAwLjAsIDAuMCwgMC4wKTtcXG4jZW5kaWZcXG5cXG4gIGxldCBibGVuZFNoYXBlQ29tcG9uZW50U0lEID0gdTMyKGluc3RhbmNlX2lkcy56KTtcXG4gIGxldCBnZW9tID0gcHJvY2Vzc0dlb21ldHJ5V2l0aE1vcnBoaW5nQW5kU2tpbm5pbmcoXFxuICAgIHNrZWxldGFsQ29tcG9uZW50U0lELFxcbiAgICBibGVuZFNoYXBlQ29tcG9uZW50U0lELFxcbiAgICB3b3JsZE1hdHJpeCxcXG4gICAgdmlld01hdHJpeCxcXG4gICAgZmFsc2UsXFxuICAgIG5vcm1hbE1hdHJpeCxcXG4gICAgcG9zaXRpb24sXFxuICAgIG5vcm1hbCxcXG4gICAgYmFyeUNlbnRyaWNDb29yZCxcXG4gICAgam9pbnQsXFxuICAgIHdlaWdodFxcbiAgKTtcXG5cXG4gIG91dHB1dC5wb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogZ2VvbS5wb3NpdGlvbl9pbldvcmxkO1xcbiAgb3V0cHV0LnBvc2l0aW9uX2luV29ybGQgPSBnZW9tLnBvc2l0aW9uX2luV29ybGQueHl6O1xcbiAgb3V0cHV0Lm5vcm1hbF9pbldvcmxkID0gZ2VvbS5ub3JtYWxfaW5Xb3JsZDtcXG5cXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzBcXG4gIG91dHB1dC50ZXhjb29yZF8wID0gdGV4Y29vcmRfMDtcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzFcXG4gIG91dHB1dC50ZXhjb29yZF8xID0gdGV4Y29vcmRfMTtcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzJcXG4gIG91dHB1dC50ZXhjb29yZF8yID0gdGV4Y29vcmRfMjtcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBcXG4gIG91dHB1dC5jb2xvcl8wID0gdmVjNGYoY29sb3JfMCk7XFxuI2Vsc2VcXG4gIG91dHB1dC5jb2xvcl8wID0gdmVjNDxmMzI+KDEuMCwgMS4wLCAxLjAsIDEuMCk7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9UQU5HRU5UXFxuICBvdXRwdXQudGFuZ2VudF9pbldvcmxkID0gbm9ybWFsTWF0cml4ICogdGFuZ2VudC54eXo7XFxuICBvdXRwdXQuYmlub3JtYWxfaW5Xb3JsZCA9IGNyb3NzKG91dHB1dC50YW5nZW50X2luV29ybGQsIG91dHB1dC5ub3JtYWxfaW5Xb3JsZCkgKiB0YW5nZW50Lnc7XFxuI2VuZGlmXFxuXFxuICBvdXRwdXQuaW5zdGFuY2VJbmZvID0gaW5zdGFuY2VfaWRzLng7XFxuXFxuICBsZXQgdmlzaWJpbGl0eSA9IGdldF9pc1Zpc2libGUoaW5zdGFuY2VJZCk7XFxuICBpZiAoIXZpc2liaWxpdHkpXFxuICB7XFxuICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzRmKDAuMCwgMC4wLCAwLjAsIDEuMCk7XFxuICB9XFxuXFxuI2lmZGVmIFJOX1VTRV9TSEFET1dfTUFQUElOR1xcbiAgb3V0cHV0LnNoYWRvd0Nvb3JkID0gZ2V0X2RlcHRoQmlhc1BWKG1hdGVyaWFsU0lELCAwKSAqIGdlb20ucG9zaXRpb25faW5Xb3JsZDtcXG4jZW5kaWZcXG5cXG4gIHJldHVybiBvdXRwdXQ7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuXFxuQGdyb3VwKDEpIEBiaW5kaW5nKDApIHZhciBiYXNlQ29sb3JUZXh0dXJlOiB0ZXh0dXJlX2N1YmU8ZjMyPjsgLy8gaW5pdGlhbFZhbHVlPXdoaXRlXFxuQGdyb3VwKDIpIEBiaW5kaW5nKDApIHZhciBiYXNlQ29sb3JTYW1wbGVyOiBzYW1wbGVyO1xcbi8vICNwYXJhbSBjdWJlTWFwRmFjZUlkOiBpMzI7IC8vIGluaXRpYWxWYWx1ZT0wXFxuLy8gI3BhcmFtIGRpc3RyaWJ1dGlvblR5cGU6IGkzMjsgLy8gaW5pdGlhbFZhbHVlPTBcXG4vLyAjcGFyYW0gcm91Z2huZXNzOiBmMzI7IC8vIGluaXRpYWxWYWx1ZT0wLjBcXG4vLyAjcGFyYW0gc2FtcGxlQ291bnQ6IGkzMjsgLy8gaW5pdGlhbFZhbHVlPTEwMjRcXG5cXG5jb25zdCBjTGFtYmVydGlhbjogaTMyID0gMDtcXG5jb25zdCBjR0dYOiBpMzIgPSAxO1xcblxcbi8vIGh0dHA6Ly9ob2xnZXIuZGFtbWVydHoub3JnL3N0dWZmL25vdGVzX0hhbW1lcnNsZXlPbkhlbWlzcGhlcmUuaHRtbFxcbmZuIHJhZGljYWxJbnZlcnNlX1ZkQyhfYml0czogdTMyKSAtPiBmMzJcXG57XFxuICAgIHZhciBiaXRzID0gKF9iaXRzIDw8IDE2dSkgfCAoX2JpdHMgPj4gMTZ1KTtcXG4gICAgYml0cyA9ICgoYml0cyAmIDB4NTU1NTU1NTV1KSA8PCAxdSkgfCAoKGJpdHMgJiAweEFBQUFBQUFBdSkgPj4gMXUpO1xcbiAgICBiaXRzID0gKChiaXRzICYgMHgzMzMzMzMzM3UpIDw8IDJ1KSB8ICgoYml0cyAmIDB4Q0NDQ0NDQ0N1KSA+PiAydSk7XFxuICAgIGJpdHMgPSAoKGJpdHMgJiAweDBGMEYwRjBGdSkgPDwgNHUpIHwgKChiaXRzICYgMHhGMEYwRjBGMHUpID4+IDR1KTtcXG4gICAgYml0cyA9ICgoYml0cyAmIDB4MDBGRjAwRkZ1KSA8PCA4dSkgfCAoKGJpdHMgJiAweEZGMDBGRjAwdSkgPj4gOHUpO1xcbiAgICByZXR1cm4gZjMyKGJpdHMpICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gLyAweDEwMDAwMDAwMFxcbn1cXG5cXG5mbiBoYW1tZXJzbGV5MmQoaTogaTMyLCBOOiBpMzIpIC0+IHZlYzJmIHtcXG4gICAgcmV0dXJuIHZlYzJmKGYzMihpKS9mMzIoTiksIHJhZGljYWxJbnZlcnNlX1ZkQyh1MzIoaSkpKTtcXG59XFxuXFxuZm4gY3JlYXRlVEJOKG5vcm1hbDogdmVjM2YpIC0+IG1hdDN4MzxmMzI+XFxue1xcbiAgICB2YXIgYml0YW5nZW50ID0gdmVjM2YoMC4wLCAxLjAsIDAuMCk7XFxuICAgIGxldCBOZG90VXAgPSBkb3Qobm9ybWFsLCB2ZWMzZigwLjAsIDEuMCwgMC4wKSk7XFxuICAgIGxldCBlcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgICBpZiAoMS4wIC0gYWJzKE5kb3RVcCkgPD0gZXBzaWxvbilcXG4gICAge1xcbiAgICAgIGJpdGFuZ2VudCA9IHNlbGVjdCh2ZWMzKDAuMCwgMC4wLCAtMS4wKSwgdmVjMygwLjAsIDAuMCwgMS4wKSwgTmRvdFVwID4gMC4wKTtcXG4gICAgfVxcbiAgICBsZXQgdGFuZ2VudCA9IG5vcm1hbGl6ZShjcm9zcyhiaXRhbmdlbnQsIG5vcm1hbCkpO1xcbiAgICBiaXRhbmdlbnQgPSBjcm9zcyhub3JtYWwsIHRhbmdlbnQpO1xcbiAgICByZXR1cm4gbWF0M3gzPGYzMj4odGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwpO1xcbn1cXG5cXG5mbiBnZXRJbXBvcnRhbmNlU2FtcGxlTGFtYmVydGlhbihzYW1wbGVJbmRleDogaTMyLCBOOiB2ZWMzZiwgcm91Z2huZXNzOiBmMzIsIG1hdGVyaWFsU0lEOiB1MzIpIC0+IHZlYzRmXFxue1xcbiAgICBsZXQgeGkgPSBoYW1tZXJzbGV5MmQoc2FtcGxlSW5kZXgsIGdldF9zYW1wbGVDb3VudChtYXRlcmlhbFNJRCwgMCkpO1xcblxcbiAgICBsZXQgc2luVGhldGEgPSBzcXJ0KDEuMCAtIHhpLnkpO1xcbiAgICBsZXQgY29zVGhldGEgPSBzcXJ0KHhpLnkpO1xcbiAgICBsZXQgcGhpID0gMi4wICogTV9QSSAqIHhpLng7XFxuICAgIGxldCBwZGYgPSBjb3NUaGV0YSAvIE1fUEk7XFxuXFxuICAgIGxldCBsb2NhbERpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2ZWMzZihcXG4gICAgICAgIHNpblRoZXRhICogY29zKHBoaSksXFxuICAgICAgICBzaW5UaGV0YSAqIHNpbihwaGkpLFxcbiAgICAgICAgY29zVGhldGFcXG4gICAgKSk7XFxuICAgIGxldCBkaXJlY3Rpb24gPSBjcmVhdGVUQk4oTikgKiBsb2NhbERpcmVjdGlvbjtcXG5cXG4gICAgcmV0dXJuIHZlYzRmKGRpcmVjdGlvbiwgcGRmKTtcXG59XFxuXFxuLy8gR0dYIE5ERlxcbmZuIGRfR0dYKE5IOiBmMzIsIGFscGhhUm91Z2huZXNzOiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgcm91Z2huZXNzU3FyID0gYWxwaGFSb3VnaG5lc3MgKiBhbHBoYVJvdWdobmVzcztcXG4gIGxldCBmID0gKHJvdWdobmVzc1NxciAtIDEuMCkgKiBOSCAqIE5IICsgMS4wO1xcbiAgcmV0dXJuIHJvdWdobmVzc1NxciAvIChNX1BJICogZiAqIGYpO1xcbn1cXG5cXG4vLyBXZSBsZWFybmQgYSBsb3QgZnJvbSB0aGUgZm9sbG93aW5nIHJlc291cmNlc1xcbi8vIGh0dHBzOi8vYnJ1b3AuZ2l0aHViLmlvL2libC9cXG5mbiBnZXRJbXBvcnRhbmNlU2FtcGxlR0dYKHNhbXBsZUluZGV4OiBpMzIsIE46IHZlYzNmLCByb3VnaG5lc3M6IGYzMiwgbWF0ZXJpYWxTSUQ6IHUzMikgLT4gdmVjNGZcXG57XFxuICAgIGxldCB4aSA9IGhhbW1lcnNsZXkyZChzYW1wbGVJbmRleCwgZ2V0X3NhbXBsZUNvdW50KG1hdGVyaWFsU0lELCAwKSk7XFxuXFxuICAgIGxldCBhbHBoYSA9IHJvdWdobmVzcyAqIHJvdWdobmVzcztcXG4gICAgbGV0IGNvc1RoZXRhID0gY2xhbXAoc3FydCgoMS4wIC0geGkueSkgLyAoMS4wICsgKGFscGhhICogYWxwaGEgLSAxLjApICogeGkueSkpLCAwLjAsIDEuMCk7XFxuICAgIGxldCBzaW5UaGV0YSA9IHNxcnQoMS4wIC0gY29zVGhldGEgKiBjb3NUaGV0YSk7XFxuICAgIGxldCBwaGkgPSAyLjAgKiBNX1BJICogeGkueDtcXG4gICAgdmFyIHBkZiA9IGRfR0dYKGNvc1RoZXRhLCBhbHBoYSk7XFxuICAgIHBkZiAvPSA0LjA7XFxuXFxuICAgIGxldCBsb2NhbERpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2ZWMzZihcXG4gICAgICAgIHNpblRoZXRhICogY29zKHBoaSksXFxuICAgICAgICBzaW5UaGV0YSAqIHNpbihwaGkpLFxcbiAgICAgICAgY29zVGhldGFcXG4gICAgKSk7XFxuICAgIGxldCBkaXJlY3Rpb24gPSBjcmVhdGVUQk4oTikgKiBsb2NhbERpcmVjdGlvbjtcXG5cXG4gICAgcmV0dXJuIHZlYzRmKGRpcmVjdGlvbiwgcGRmKTtcXG59XFxuXFxuLy8gV2UgbGVhcm5kIGEgbG90IGZyb20gdGhlIGZvbGxvd2luZyByZXNvdXJjZXNcXG4vLyBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvZ3B1Z2VtczMvcGFydC1paWktcmVuZGVyaW5nL2NoYXB0ZXItMjAtZ3B1LWJhc2VkLWltcG9ydGFuY2Utc2FtcGxpbmdcXG4vLyBodHRwczovL2NnZy5tZmYuY3VuaS5jei9+amFyb3NsYXYvcGFwZXJzLzIwMDctc2tldGNoLWZpcy9GaW5hbF9zYXBfMDA3My5wZGZcXG4vLyBodHRwczovL2dvb2dsZS5naXRodWIuaW8vZmlsYW1lbnQvRmlsYW1lbnQuaHRtbCNhbm5leC9pbXBvcnRhbmNlc2FtcGxpbmdmb3J0aGVpYmwvcHJlLWZpbHRlcmVkaW1wb3J0YW5jZXNhbXBsaW5nXFxuZm4gY29tcHV0ZUxvZChwZGY6IGYzMiwgd2lkdGg6IHUzMiwgc2FtcGxlQ291bnQ6IGkzMikgLT4gZjMyXFxue1xcbiAgICAvLyA2LjAgaXMgdGhlIG51bWJlciBvZiBmYWNlcyBvZiB0aGUgY3ViZW1hcFxcbiAgICAvLyBsb2c0ID0gMC41ICogbG9nMlxcbiAgICAvLyBXZSBkb24ndCB1c2UgdGhlIGNvbnN0YW50IEsgaW4gdGhlIGZpbGFtZW50IGRvY3VtZW50XFxuICAgIHJldHVybiAwLjUgKiBsb2cyKCA2LjAgKiBmMzIod2lkdGgpICogZjMyKHdpZHRoKSAvIChmMzIoc2FtcGxlQ291bnQpICogcGRmKSk7XFxufVxcblxcbmZuIHByZWZpbHRlcihOOiB2ZWMzZiwgbWF0ZXJpYWxTSUQ6IHUzMikgLT4gdmVjM2ZcXG57XFxuICAgIHZhciBjb2xvciA9IHZlYzNmKDAuZik7XFxuICAgIHZhciB3ZWlnaHQgPSAwLjBmO1xcbiAgICBsZXQgc2FtcGxlQ291bnQgPSBnZXRfc2FtcGxlQ291bnQobWF0ZXJpYWxTSUQsIDApO1xcblxcbiAgICBsZXQgdGV4U2l6ZTogdmVjMjx1MzI+ID0gdGV4dHVyZURpbWVuc2lvbnMoYmFzZUNvbG9yVGV4dHVyZSwgMCk7XFxuXFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBnZXRfc2FtcGxlQ291bnQobWF0ZXJpYWxTSUQsIDApOyBpKyspXFxuICAgIHtcXG4gICAgICAgIHZhciBpbXBvcnRhbmNlU2FtcGxlOiB2ZWM0PGYzMj47XFxuXFxuICAgICAgICBsZXQgZGlzdHJpYnV0aW9uVHlwZSA9IGdldF9kaXN0cmlidXRpb25UeXBlKG1hdGVyaWFsU0lELCAwKTtcXG4gICAgICAgIGlmKGRpc3RyaWJ1dGlvblR5cGUgPT0gY0xhbWJlcnRpYW4pIHtcXG4gICAgICAgICAgICBpbXBvcnRhbmNlU2FtcGxlID0gZ2V0SW1wb3J0YW5jZVNhbXBsZUxhbWJlcnRpYW4oaSwgTiwgZ2V0X3JvdWdobmVzcyhtYXRlcmlhbFNJRCwgMCksIG1hdGVyaWFsU0lEKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaW1wb3J0YW5jZVNhbXBsZSA9IGdldEltcG9ydGFuY2VTYW1wbGVHR1goaSwgTiwgZ2V0X3JvdWdobmVzcyhtYXRlcmlhbFNJRCwgMCksIG1hdGVyaWFsU0lEKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGxldCBIID0gdmVjM2YoaW1wb3J0YW5jZVNhbXBsZS54eXopO1xcbiAgICAgICAgbGV0IHBkZiA9IGltcG9ydGFuY2VTYW1wbGUudztcXG4gICAgICAgIGxldCBsb2QgPSBjb21wdXRlTG9kKHBkZiwgdGV4U2l6ZS54LCBzYW1wbGVDb3VudCk7XFxuXFxuICAgICAgICBpZihkaXN0cmlidXRpb25UeXBlID09IGNMYW1iZXJ0aWFuKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxldCBsYW1iZXJ0aWFuID0gdGV4dHVyZVNhbXBsZUxldmVsKGJhc2VDb2xvclRleHR1cmUsIGJhc2VDb2xvclNhbXBsZXIsIEgsIGxvZCkucmdiO1xcbiAgICAgICAgICAgIGNvbG9yICs9IGxhbWJlcnRpYW47XFxuICAgICAgICB9XFxuICAgICAgICBlbHNlIGlmKGRpc3RyaWJ1dGlvblR5cGUgPT0gY0dHWClcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBsZXQgViA9IE47XFxuICAgICAgICAgICAgbGV0IEwgPSBub3JtYWxpemUocmVmbGVjdCgtViwgSCkpO1xcbiAgICAgICAgICAgIGxldCBOZG90TCA9IGRvdChOLCBMKTtcXG5cXG4gICAgICAgICAgICBpZiAoTmRvdEwgPiAwLjApXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBsZXQgc2FtcGxlQ29sb3IgPSB0ZXh0dXJlU2FtcGxlTGV2ZWwoYmFzZUNvbG9yVGV4dHVyZSwgYmFzZUNvbG9yU2FtcGxlciwgTCwgbG9kKS5yZ2I7XFxuICAgICAgICAgICAgICAgIGNvbG9yICs9IHNhbXBsZUNvbG9yICogTmRvdEw7XFxuICAgICAgICAgICAgICAgIHdlaWdodCArPSBOZG90TDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgaWYod2VpZ2h0ICE9IDAuMGYpXFxuICAgIHtcXG4gICAgICAgIGNvbG9yIC89IHdlaWdodDtcXG4gICAgfVxcbiAgICBlbHNlXFxuICAgIHtcXG4gICAgICAgIGNvbG9yIC89IGYzMihzYW1wbGVDb3VudCk7XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIGNvbG9yLnJnYjtcXG59XFxuXFxuZm4gdXZUb0RpcihmYWNlSWQ6IGkzMiwgdXY6IHZlYzJmKSAtPiB2ZWMzZlxcbntcXG5cXHRpZiAoZmFjZUlkID09IDApIHtcXG5cXHRcXHRyZXR1cm4gdmVjM2YoMS5mLCB1di55LCAtdXYueCk7XFxuICB9IGVsc2UgaWYoZmFjZUlkID09IDEpIHtcXG5cXHRcXHRyZXR1cm4gdmVjM2YoLTEuZiwgdXYueSwgdXYueCk7XFxuICB9IGVsc2UgaWYoZmFjZUlkID09IDIpIHtcXG5cXHRcXHRyZXR1cm4gdmVjM2YodXYueCwgLTEuZiwgdXYueSk7XFxuICB9IGVsc2UgaWYoZmFjZUlkID09IDMpIHtcXG5cXHRcXHRyZXR1cm4gdmVjM2YodXYueCwgMS5mLCAtdXYueSk7XFxuICB9IGVsc2UgaWYoZmFjZUlkID09IDQpIHtcXG5cXHRcXHRyZXR1cm4gdmVjM2YodXYueCwgdXYueSwgMS5mKTtcXG4gIH0gZWxzZSB7XFxuICAgIHJldHVybiB2ZWMzZigtdXYueCwgdXYueSwgLTEuZik7XFxuICB9XFxufVxcblxcbi8vIGxlYXJuZWQgYSBsb3QgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYtU2FtcGxlLVZpZXdlclxcbkBmcmFnbWVudFxcbmZuIG1haW4gKFxcbiAgaW5wdXQ6IFZlcnRleE91dHB1dCxcXG4pIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIGxldCB1diA9IGlucHV0LnRleGNvb3JkXzAgKiAyLjAgLSAxLjA7XFxuICBsZXQgc2NhbiA9IHV2VG9EaXIoZ2V0X2N1YmVNYXBGYWNlSWQobWF0ZXJpYWxTSUQsIDApLCB1dik7XFxuICB2YXIgZGlyZWN0aW9uID0gbm9ybWFsaXplKHNjYW4pO1xcbiAgZGlyZWN0aW9uLnkgPSAtZGlyZWN0aW9uLnk7XFxuXFxuICBsZXQgcnQwID0gdmVjNGYocHJlZmlsdGVyKGRpcmVjdGlvbiwgbWF0ZXJpYWxTSUQpLCAxLjApO1xcblxcbiAgcmV0dXJuIHJ0MDtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cXG5cXG5AdmVydGV4XFxuZm4gbWFpbihcXG4gIEBidWlsdGluKHZlcnRleF9pbmRleCkgdmVydGV4SWR4IDogdTMyLFxcbikgLT4gVmVydGV4T3V0cHV0IHtcXG4gIHZhciBvdXRwdXQgOiBWZXJ0ZXhPdXRwdXQ7XFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcbmxldCB4ID0gZjMyKCh2ZXJ0ZXhJZHggJiAxdSkgPDwgMnUpO1xcbmxldCB5ID0gZjMyKCh2ZXJ0ZXhJZHggJiAydSkgPDwgMXUpO1xcbm91dHB1dC50ZXhjb29yZF8wLnggPSB4ICogMC41O1xcbm91dHB1dC50ZXhjb29yZF8wLnkgPSB5ICogMC41O1xcbm91dHB1dC50ZXhjb29yZF8wLnkgPSAxLjAgLSBvdXRwdXQudGV4Y29vcmRfMC55O1xcbm91dHB1dC5wb3NpdGlvbiA9IHZlYzRmKHggLSAxLjAsIHkgLSAxLjAsIDAsIDEpO1xcblxcblxcbiAgcmV0dXJuIG91dHB1dDtcXG5cXG59XFxuXFxuXFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuQGZyYWdtZW50XFxuZm4gbWFpbiAoXFxuICBpbnB1dDogVmVydGV4T3V0cHV0LFxcbikgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7XFxubGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblxcblxcbiAgbGV0IHN5bnRoZXNpemVDb2VmZmljaWVudDAgPSBnZXRfc3ludGhlc2l6ZUNvZWZmaWNpZW50KG1hdGVyaWFsU0lELCAwKTtcXG4gIHZhciBjb2xvcjogdmVjM2YgPSBzeW50aGVzaXplQ29lZmZpY2llbnQwICogdGV4dHVyZVNhbXBsZShzeW50aGVzaXplVGV4dHVyZTAsIHN5bnRoZXNpemVTYW1wbGVyMCwgaW5wdXQudGV4Y29vcmRfMCkucmdiO1xcblxcbiAgbGV0IHN5bnRoZXNpemVDb2VmZmljaWVudDEgPSBnZXRfc3ludGhlc2l6ZUNvZWZmaWNpZW50KG1hdGVyaWFsU0lELCAxKTtcXG4gIGxldCBzeW50aGVzaXplQ29lZmZpY2llbnQyID0gZ2V0X3N5bnRoZXNpemVDb2VmZmljaWVudChtYXRlcmlhbFNJRCwgMik7XFxuICBsZXQgc3ludGhlc2l6ZUNvZWZmaWNpZW50MyA9IGdldF9zeW50aGVzaXplQ29lZmZpY2llbnQobWF0ZXJpYWxTSUQsIDMpO1xcbiAgbGV0IHN5bnRoZXNpemVDb2VmZmljaWVudDQgPSBnZXRfc3ludGhlc2l6ZUNvZWZmaWNpZW50KG1hdGVyaWFsU0lELCA0KTtcXG4gIGxldCBzeW50aGVzaXplQ29lZmZpY2llbnQ1ID0gZ2V0X3N5bnRoZXNpemVDb2VmZmljaWVudChtYXRlcmlhbFNJRCwgNSk7XFxuXFxuICBjb2xvciArPSBzeW50aGVzaXplQ29lZmZpY2llbnQxICogdGV4dHVyZVNhbXBsZShzeW50aGVzaXplVGV4dHVyZTEsIHN5bnRoZXNpemVTYW1wbGVyMCwgaW5wdXQudGV4Y29vcmRfMCkucmdiO1xcbiAgY29sb3IgKz0gc3ludGhlc2l6ZUNvZWZmaWNpZW50MiAqIHRleHR1cmVTYW1wbGUoc3ludGhlc2l6ZVRleHR1cmUyLCBzeW50aGVzaXplU2FtcGxlcjAsIGlucHV0LnRleGNvb3JkXzApLnJnYjtcXG4gIGNvbG9yICs9IHN5bnRoZXNpemVDb2VmZmljaWVudDMgKiB0ZXh0dXJlU2FtcGxlKHN5bnRoZXNpemVUZXh0dXJlMywgc3ludGhlc2l6ZVNhbXBsZXIwLCBpbnB1dC50ZXhjb29yZF8wKS5yZ2I7XFxuICBjb2xvciArPSBzeW50aGVzaXplQ29lZmZpY2llbnQ0ICogdGV4dHVyZVNhbXBsZShzeW50aGVzaXplVGV4dHVyZTQsIHN5bnRoZXNpemVTYW1wbGVyMCwgaW5wdXQudGV4Y29vcmRfMCkucmdiO1xcbiAgY29sb3IgKz0gc3ludGhlc2l6ZUNvZWZmaWNpZW50NSAqIHRleHR1cmVTYW1wbGUoc3ludGhlc2l6ZVRleHR1cmU1LCBzeW50aGVzaXplU2FtcGxlcjAsIGlucHV0LnRleGNvb3JkXzApLnJnYjtcXG5cXG4gIGxldCBydDAgPSB2ZWM0Zihjb2xvciwgMS4wKTtcXG5cXG4gIHJldHVybiBydDA7XFxufVxcblxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIvKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXFxuc3RydWN0IFZlcnRleE91dHB1dCB7XFxuICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMCkgcG9zaXRpb25faW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigxKSBub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbigyKSB0ZXhjb29yZF8wIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDMpIGNvbG9yXzAgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oNCkgdGV4Y29vcmRfMSA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig1KSB0ZXhjb29yZF8yIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDYpIHRhbmdlbnRfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig3KSBiaW5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDgpIGJhcnlDZW50cmljQ29vcmQ6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig5KSBzaGFkb3dDb29yZCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigxMCkgaW5zdGFuY2VJbmZvIDogZjMyLFxcbiAgQGxvY2F0aW9uKDExKSBub3JtYWxfaW5WaWV3IDogdmVjMzxmMzI+LFxcbn1cXG5cXG5zdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcblxcbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xcbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXFxuXFxuQHZlcnRleFxcbmZuIG1haW4oXFxuICBAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleElkeCA6IHUzMixcXG4pIC0+IFZlcnRleE91dHB1dCB7XFxuICB2YXIgb3V0cHV0IDogVmVydGV4T3V0cHV0O1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG5sZXQgeCA9IGYzMigodmVydGV4SWR4ICYgMXUpIDw8IDJ1KTtcXG5sZXQgeSA9IGYzMigodmVydGV4SWR4ICYgMnUpIDw8IDF1KTtcXG5vdXRwdXQudGV4Y29vcmRfMC54ID0geCAqIDAuNTtcXG5vdXRwdXQudGV4Y29vcmRfMC55ID0geSAqIDAuNTtcXG5vdXRwdXQudGV4Y29vcmRfMC55ID0gMS4wIC0gb3V0cHV0LnRleGNvb3JkXzAueTtcXG5vdXRwdXQucG9zaXRpb24gPSB2ZWM0Zih4IC0gMS4wLCB5IC0gMS4wLCAwLCAxKTtcXG5cXG5cXG4gIHJldHVybiBvdXRwdXQ7XFxuXFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcInZlcnRleFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOmZhbHNlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcXG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbl9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDEpIG5vcm1hbF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDIpIHRleGNvb3JkXzAgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oMykgY29sb3JfMCA6IHZlYzQ8ZjMyPixcXG4gIEBsb2NhdGlvbig0KSB0ZXhjb29yZF8xIDogdmVjMjxmMzI+LFxcbiAgQGxvY2F0aW9uKDUpIHRleGNvb3JkXzIgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNikgdGFuZ2VudF9pbldvcmxkIDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDcpIGJpbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOCkgYmFyeUNlbnRyaWNDb29yZDogdmVjMzxmMzI+LFxcbiAgQGxvY2F0aW9uKDkpIHNoYWRvd0Nvb3JkIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDEwKSBpbnN0YW5jZUluZm8gOiBmMzIsXFxuICBAbG9jYXRpb24oMTEpIG5vcm1hbF9pblZpZXcgOiB2ZWMzPGYzMj4sXFxufVxcblxcbnN0cnVjdCBTdG9yYWdlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2U+IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YTtcXG5zdHJ1Y3QgQmxlbmRTaGFwZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlPiBibGVuZFNoYXBlRGF0YTogQmxlbmRTaGFwZURhdGE7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaE9mZnNldHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDx1MzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaE9mZnNldHM6IFVuaWZvcm1Nb3JwaE9mZnNldHM7XFxuc3RydWN0IFVuaWZvcm1Nb3JwaFdlaWdodHMge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+LCAvKiBzaGFkZXJpdHk6IEB7bWF4TW9ycGhEYXRhTnVtYmVyfSAqLyA+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMykgdmFyPHVuaWZvcm0+IHVuaWZvcm1Nb3JwaFdlaWdodHM6IFVuaWZvcm1Nb3JwaFdlaWdodHM7XFxuXFxub3ZlcnJpZGUgX21hdGVyaWFsU0lEOiB1MzI7XFxub3ZlcnJpZGUgX2N1cnJlbnRQcmltaXRpdmVJZHggPSAwdTtcXG5vdmVycmlkZSBfbW9ycGhUYXJnZXROdW1iZXI6IHUzMiA9IDB1O1xcbm92ZXJyaWRlIF9jYW1lcmFTSUQ6IHUzMiA9IDB1O1xcbmNvbnN0IE1fUEk6IGYzMiA9IDMuMTQxNTkyNjUzNTg5NzkzO1xcbmNvbnN0IFJFQ0lQUk9DQUxfUEk6IGYzMiA9IDAuMzE4MzA5ODg2MTgzNzkwNztcXG5jb25zdCBFcHNpbG9uOiBmMzIgPSAwLjAwMDAwMDE7XFxuY29uc3QgY19NaW5Sb3VnaG5lc3M6IGYzMiA9IDAuMDQ7XFxuXFxuZm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBzdG9yYWdlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIGJsZW5kU2hhcGVEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmFsLnh5ejtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC56dywgdmFsMS54KTtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDNcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+IHtcXG4gIHJldHVybiBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbn1cXG5cXG5mbiBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBmMzIge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICByZXR1cm4gdmFsLng7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIHJldHVybiB2YWwueTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgcmV0dXJuIHZhbC56O1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgcmV0dXJuIHZhbC53O1xcbiAgfVxcbn1cXG5cXG5cXG5cXG5cXG5mbiBmZXRjaE1hdDQodmVjNF9pZHg6IHUzMikgLT4gbWF0NHg0PGYzMj5cXG57XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcbiAgbGV0IGNvbDMgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAzdSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHg0PGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncsXFxuICAgIGNvbDMueCwgY29sMy55LCBjb2wzLnosIGNvbDMud1xcbiAgICApO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQ0eDModmVjNF9pZHg6IHUzMikgLT4gbWF0NHgzPGYzMj4ge1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDM8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDNObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gbWF0M3gzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC54LCBjb2wwLnksIGNvbDAueixcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLnhcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgICAgY29sMS54LCBjb2wxLnksIGNvbDEueixcXG4gICAgICBjb2wxLncsIGNvbDIueCwgY29sMi55XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnosIGNvbDAudywgY29sMS54LFxcbiAgICAgIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgICAgY29sMi54LCBjb2wyLnksIGNvbDIuelxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueCxcXG4gICAgICBjb2wyLnksIGNvbDIueiwgY29sMi53XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH1cXG59XFxuXFxuZm4gdXZUcmFuc2Zvcm0oc2NhbGU6IHZlYzJmLCBvZmZzZXQ6IHZlYzJmLCByb3RhdGlvbjogZjMyLCB1djogdmVjMmYpIC0+IHZlYzJmIHtcXG4gIGxldCB0cmFuc2xhdGlvbk1hdCA9IG1hdDN4MygxLDAsMCwgMCwxLDAsIG9mZnNldC54LCBvZmZzZXQueSwgMSk7XFxuICBsZXQgcm90YXRpb25NYXQgPSBtYXQzeDMoXFxuICAgICAgY29zKHJvdGF0aW9uKSwgLXNpbihyb3RhdGlvbiksIDAsXFxuICAgICAgc2luKHJvdGF0aW9uKSwgY29zKHJvdGF0aW9uKSwgMCxcXG4gICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAwLCAxXFxuICApO1xcbiAgbGV0IHNjYWxlTWF0ID0gbWF0M3gzKHNjYWxlLngsMCwwLCAwLHNjYWxlLnksMCwgMCwwLDEpO1xcblxcbiAgbGV0IG1hdHJpeCA9IHRyYW5zbGF0aW9uTWF0ICogcm90YXRpb25NYXQgKiBzY2FsZU1hdDtcXG4gIGxldCB1dlRyYW5zZm9ybWVkID0gKCBtYXRyaXggKiB2ZWMzZih1di54eSwgMSkgKS54eTtcXG5cXG4gIHJldHVybiB1dlRyYW5zZm9ybWVkO1xcbn1cXG5cXG4jaWZkZWYgUk5fSVNfTk9ERV9TSEFERVJcXG4jZWxzZVxcbmZuIGdldFRleGNvb3JkKHRleGNvb3JkSW5kZXg6IHUzMiwgaW5wdXQ6IFZlcnRleE91dHB1dCkgLT4gdmVjMjxmMzI+IHtcXG4gIHZhciB0ZXhjb29yZDogdmVjMmY7XFxuICBpZih0ZXhjb29yZEluZGV4ID09IDIpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzI7XFxuICB9IGVsc2UgaWYodGV4Y29vcmRJbmRleCA9PSAxKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8xO1xcbiAgfWVsc2V7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMDtcXG4gIH1cXG4gIHJldHVybiB0ZXhjb29yZDtcXG59XFxuI2VuZGlmXFxuXFxuZm4gc2F0dXJhdGVFcHNpbG9uVG9PbmUoeDogZjMyKSAtPiBmMzIge1xcbiAgbGV0IEVwc2lsb24gPSAwLjAwMDAwMDE7XFxuICByZXR1cm4gY2xhbXAoeCwgRXBzaWxvbiwgMS4wKTtcXG59XFxuXFxuZm4gbWF4Myh2OiB2ZWMzZikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIG1heChtYXgodi54LCB2LnkpLCB2LnopO1xcbn1cXG5cXG5mbiBzcUYzMih0OiBmMzIpIC0+IGYzMlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMyZih0OiB2ZWMyZikgLT4gdmVjMmZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjM2YodDogdmVjM2YpIC0+IHZlYzNmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzRmKHQ6IHZlYzRmKSAtPiB2ZWM0ZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuXFxuLyogc2hhZGVyaXR5OiBAe2dldHRlcnN9ICovXFxuXFxuQGdyb3VwKDEpIEBiaW5kaW5nKDApIHZhciBiYXNlQ29sb3JUZXh0dXJlOiB0ZXh0dXJlXzJkPGYzMj47IC8vIGluaXRpYWxWYWx1ZT13aGl0ZVxcbkBncm91cCgyKSBAYmluZGluZygwKSB2YXIgYmFzZUNvbG9yU2FtcGxlcjogc2FtcGxlcjtcXG5cXG4vLyAjcGFyYW0gZW5hYmxlTGluZWFyVG9TcmdiOiBib29sOyAvLyBpbml0aWFsVmFsdWU9dHJ1ZVxcblxcbmZuIGxpbmVhclRvU3JnYihsaW5lYXJDb2xvcjogdmVjM2YpIC0+IHZlYzNmIHtcXG4gIHJldHVybiBwb3cobGluZWFyQ29sb3IsIHZlYzNmKDEuMC8yLjIpKTtcXG59XFxuXFxuZm4gc3JnYlRvTGluZWFyKHNyZ2JDb2xvcjogdmVjM2YpIC0+IHZlYzNmIHtcXG4gIHJldHVybiBwb3coc3JnYkNvbG9yLCB2ZWMzZigyLjIpKTtcXG59XFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9LSFJPTk9TX1BCUl9ORVVUUkFMXFxuLy8gSW5wdXQgY29sb3IgaXMgbm9uLW5lZ2F0aXZlIGFuZCByZXNpZGVzIGluIHRoZSBMaW5lYXIgUmVjLiA3MDkgY29sb3Igc3BhY2UuXFxuLy8gT3V0cHV0IGNvbG9yIGlzIGFsc28gTGluZWFyIFJlYy4gNzA5LCBidXQgaW4gdGhlIFswLCAxXSByYW5nZS5cXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVG9uZU1hcHBpbmcvdHJlZS9tYWluL1BCUl9OZXV0cmFsXFxuZm4gUEJSTmV1dHJhbFRvbmVNYXBwaW5nKCBpbkNvbG9yOiB2ZWMzZiApIC0+IHZlYzNmIHtcXG4gIGxldCBzdGFydENvbXByZXNzaW9uID0gMC44IC0gMC4wNDtcXG4gIGxldCBkZXNhdHVyYXRpb24gPSAwLjE1O1xcblxcbiAgbGV0IHggPSBtaW4oaW5Db2xvci5yLCBtaW4oaW5Db2xvci5nLCBpbkNvbG9yLmIpKTtcXG4gIGxldCBvZmZzZXQgPSBzZWxlY3QoMC4wNCwgeCAtIDYuMjUgKiB4ICogeCwgeCA8IDAuMDgpO1xcbiAgdmFyIGNvbG9yID0gaW5Db2xvciAtIG9mZnNldDtcXG5cXG4gIGxldCBwZWFrID0gbWF4KGNvbG9yLnIsIG1heChjb2xvci5nLCBjb2xvci5iKSk7XFxuICBpZiAocGVhayA8IHN0YXJ0Q29tcHJlc3Npb24pIHtcXG4gICAgcmV0dXJuIGNvbG9yO1xcbiAgfVxcblxcbiAgbGV0IGQgPSAxLjAgLSBzdGFydENvbXByZXNzaW9uO1xcbiAgbGV0IG5ld1BlYWsgPSAxLjAgLSBkICogZCAvIChwZWFrICsgZCAtIHN0YXJ0Q29tcHJlc3Npb24pO1xcbiAgY29sb3IgKj0gbmV3UGVhayAvIHBlYWs7XFxuXFxuICBsZXQgZyA9IDEuMCAtIDEuMCAvIChkZXNhdHVyYXRpb24gKiAocGVhayAtIG5ld1BlYWspICsgMS4wKTtcXG4gIHJldHVybiBtaXgoY29sb3IsIG5ld1BlYWsgKiB2ZWMzZigxLjAsIDEuMCwgMS4wKSwgZyk7XFxufVxcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfUkVJTkhBUkRcXG5mbiBSZWluaGFyZFRvbmVNYXBwaW5nKGNvbG9yOiB2ZWMzPGYzMj4gKSAtPiB2ZWMzPGYzMj4ge1xcbiAgcmV0dXJuIGNvbG9yIC8gKHZlYzM8ZjMyPigxLjApICsgY29sb3IpO1xcbn1cXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0FDRVNfTkFSS09XSUNaXFxuLy8gQUNFUyB0b25lIG1hcCAoZmFzdGVyIGFwcHJveGltYXRpb24pXFxuLy8gc2VlOiBodHRwczovL2tuYXJrb3dpY3oud29yZHByZXNzLmNvbS8yMDE2LzAxLzA2L2FjZXMtZmlsbWljLXRvbmUtbWFwcGluZy1jdXJ2ZS9cXG5mbiBBQ0VTX05hcmtvd2ljel9Ub25lTWFwcGluZyhjb2xvcjogdmVjMzxmMzI+KSAtPiB2ZWMzPGYzMj5cXG57XFxuICAgIGNvbnN0IEEgPSAyLjUxO1xcbiAgICBjb25zdCBCID0gMC4wMztcXG4gICAgY29uc3QgQyA9IDIuNDM7XFxuICAgIGNvbnN0IEQgPSAwLjU5O1xcbiAgICBjb25zdCBFID0gMC4xNDtcXG4gICAgcmV0dXJuIGNsYW1wKChjb2xvciAqIChBICogY29sb3IgKyBCKSkgLyAoY29sb3IgKiAoQyAqIGNvbG9yICsgRCkgKyBFKSwgdmVjMzxmMzI+KDAuMCksIHZlYzM8ZjMyPigxLjApKTtcXG59XFxuI2VuZGlmXFxuXFxuLy8gc1JHQiA9PiBYWVogPT4gRDY1XzJfRDYwID0+IEFQMSA9PiBSUlRfU0FUXFxuY29uc3QgQUNFU0lucHV0TWF0ID0gbWF0M3gzPGYzMj5cXG4oXFxuICAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwLFxcbiAgMC4zNTQ1OCwgMC45MDgzNCwgMC4xMzM4MyxcXG4gIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzdcXG4pO1xcblxcbi8vIE9EVF9TQVQgPT4gWFlaID0+IEQ2MF8yX0Q2NSA9PiBzUkdCXFxuY29uc3QgQUNFU091dHB1dE1hdCA9IG1hdDN4MzxmMzI+XFxuKFxcbiAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3LFxcbiAgLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NixcXG4gIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDJcXG4pO1xcblxcbmZuIFJSVEFuZE9EVEZpdCh2OiB2ZWMzPGYzMj4pIC0+IHZlYzM8ZjMyPlxcbntcXG4gIGxldCBhID0gdiAqICh2ICsgMC4wMjQ1Nzg2ZikgLSAwLjAwMDA5MDUzN2Y7XFxuICBsZXQgYiA9IHYgKiAoMC45ODM3MjlmICogdiArIDAuNDMyOTUxMGYpICsgMC4yMzgwODFmO1xcbiAgcmV0dXJuIGEgLyBiO1xcbn1cXG5cXG5mbiBBQ0VTX0hpbGxfVG9uZU1hcHBpbmcoaW5Db2xvcjogdmVjMzxmMzI+KSAtPiB2ZWMzPGYzMj5cXG57XFxuICB2YXIgY29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBpbkNvbG9yO1xcblxcbiAgLy8gQXBwbHkgUlJUIGFuZCBPRFRcXG4gIGNvbG9yID0gUlJUQW5kT0RURml0KGNvbG9yKTtcXG5cXG4gIGNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yO1xcblxcbiAgLy8gQ2xhbXAgdG8gWzAsIDFdXFxuICBjb2xvciA9IHNhdHVyYXRlKGNvbG9yKTtcXG5cXG4gIHJldHVybiBjb2xvcjtcXG59XFxuXFxuI2lmZGVmIFJOX1VTRV9HVF9UT05FTUFQXFxuICBmbiBXX2YoeDogZjMyLCBlMDogZjMyLCBlMTogZjMyKSAtPiBmMzIge1xcbiAgICBpZiAoeCA8PSBlMCkgeyByZXR1cm4gMC47IH1cXG4gICAgaWYgKHggPj0gZTEpIHsgcmV0dXJuIDEuOyB9XFxuICAgIGxldCBhID0gKHggLSBlMCkgLyAoZTEgLSBlMCk7XFxuICAgIHJldHVybiBhICogYSAqICgzLiAtIDIuICogYSk7XFxuICB9XFxuICBmbiBIX2YoeDogZjMyLCBlMDogZjMyLCBlMTogZjMyKSAtPiBmMzIge1xcbiAgICBpZiAoeCA8PSBlMCkgeyByZXR1cm4gMC47IH1cXG4gICAgaWYgKHggPj0gZTEpIHsgcmV0dXJuIDEuOyB9XFxuICAgIHJldHVybiAoeCAtIGUwKSAvIChlMSAtIGUwKTtcXG4gIH1cXG5cXG4gIGNvbnN0IGUgPSAyLjcxODI4O1xcblxcbiAgZm4gR1RfVG9uZU1hcGluZyh4OiBmMzIpIC0+IGYzMiB7XFxuICAgIGxldCBQID0gMS47IC8vIHBlYWsgbHVtaW5hbmNlXFxuICAgIGxldCBhID0gMS47IC8vIGNvbnRyYXN0IHBhcmFtZXRlclxcbiAgICBsZXQgbSA9IDAuMjI7IC8vIGJlZ2lubmluZyBvZiB0aGUgbGluZWFyIHBhcnRcXG4gICAgbGV0IGwgPSAwLjQ7IC8vIGxlbmd0aCBvZiB0aGUgbGluZWFyIHBhcnRcXG4gICAgbGV0IGMgPSAxLjMzOyAvLyBwYXJhbWV0ZXIgb2YgYmxhY2sgY29sb3JcXG4gICAgbGV0IGIgPSAwLjsgLy8gcGFyYW1ldGVyIG9mIGJsYWNrIGNvbG9yXFxuICAgIGxldCBsMCA9IChQIC0gbSkgKiBsIC8gYTtcXG4gICAgbGV0IFRfeCA9IG0gKiBwb3coeCAvIG0sIGMpICsgYjtcXG4gICAgbGV0IExfeCA9IG0gKyBhICogKHggLSBtKTtcXG4gICAgbGV0IFMwID0gbSArIGwwO1xcbiAgICBsZXQgUzEgPSBtICsgYSAqIGwwO1xcbiAgICBsZXQgQzIgPSBhICogUCAvIChQIC0gUzEpO1xcbiAgICBsZXQgU194ID0gUCAtIChQIC0gUzEpICogcG93KGUsIC0oQzIgKiAoeCAtIFMwKSAvIFApKTtcXG4gICAgbGV0IHcwX3ggPSAxLiAtIFdfZih4LCAwLiwgbSk7XFxuICAgIGxldCB3Ml94ID0gSF9mKHgsIG0gKyBsMCwgbSArIGwwKTtcXG4gICAgbGV0IHcxX3ggPSAxLiAtIHcwX3ggLSB3Ml94O1xcbiAgICBsZXQgZl94ID0gVF94ICogdzBfeCArIExfeCAqIHcxX3ggKyBTX3ggKiB3Ml94O1xcbiAgICByZXR1cm4gZl94O1xcbiAgfVxcbiNlbmRpZlxcblxcbkBmcmFnbWVudFxcbmZuIG1haW4gKFxcbiAgaW5wdXQ6IFZlcnRleE91dHB1dCxcXG4pIC0+IEBsb2NhdGlvbigwKSB2ZWM0PGYzMj4ge1xcbmxldCBtYXRlcmlhbFNJRCA9IF9tYXRlcmlhbFNJRDtcXG5sZXQgY3VycmVudFByaW1pdGl2ZUlkeCA9IF9jdXJyZW50UHJpbWl0aXZlSWR4O1xcbmxldCBtb3JwaFRhcmdldE51bWJlciA9IF9tb3JwaFRhcmdldE51bWJlcjtcXG5sZXQgY2FtZXJhU0lEID0gX2NhbWVyYVNJRDtcXG5cXG5cXG4gIHZhciBiYXNlQ29sb3IgPSB0ZXh0dXJlU2FtcGxlKGJhc2VDb2xvclRleHR1cmUsIGJhc2VDb2xvclNhbXBsZXIsIGlucHV0LnRleGNvb3JkXzApO1xcblxcbiNpZmRlZiBSTl9VU0VfS0hST05PU19QQlJfTkVVVFJBTFxcbiAgYmFzZUNvbG9yID0gdmVjNGYoUEJSTmV1dHJhbFRvbmVNYXBwaW5nKGJhc2VDb2xvci5yZ2IpLCBiYXNlQ29sb3IuYSk7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9SRUlOSEFSRFxcbiAgYmFzZUNvbG9yID0gdmVjNGYoUmVpbmhhcmRUb25lTWFwcGluZyhiYXNlQ29sb3IucmdiKSwgYmFzZUNvbG9yLmEpO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfQUNFU19OQVJLT1dJQ1pcXG4gIGJhc2VDb2xvciA9IHZlYzRmKEFDRVNfTmFya293aWN6X1RvbmVNYXBwaW5nKGJhc2VDb2xvci5yZ2IpLCBiYXNlQ29sb3IuYSk7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9BQ0VTX0hJTExcXG4gIGJhc2VDb2xvciA9IHZlYzRmKEFDRVNfSGlsbF9Ub25lTWFwcGluZyhiYXNlQ29sb3IucmdiKSwgYmFzZUNvbG9yLmEpO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBSTl9VU0VfQUNFU19ISUxMX0VYUE9TVVJFX0JPT1NUXFxuICBiYXNlQ29sb3IgLz0gMC42O1xcbiAgYmFzZUNvbG9yID0gdmVjNGYoQUNFU19IaWxsX1RvbmVNYXBwaW5nKGJhc2VDb2xvci5yZ2IpLCBiYXNlQ29sb3IuYSk7XFxuI2VuZGlmXFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9HVF9UT05FTUFQXFxuICBiYXNlQ29sb3IuciA9IEdUX1RvbmVNYXBpbmcoYmFzZUNvbG9yLnIpO1xcbiAgYmFzZUNvbG9yLmcgPSBHVF9Ub25lTWFwaW5nKGJhc2VDb2xvci5nKTtcXG4gIGJhc2VDb2xvci5iID0gR1RfVG9uZU1hcGluZyhiYXNlQ29sb3IuYik7XFxuI2VuZGlmXFxuXFxuICBpZiAoZ2V0X2VuYWJsZUxpbmVhclRvU3JnYihtYXRlcmlhbFNJRCwgMCkpIHtcXG4gICAgYmFzZUNvbG9yID0gdmVjNGYobGluZWFyVG9TcmdiKGJhc2VDb2xvci5yZ2IpLCBiYXNlQ29sb3IuYSk7XFxuICB9XFxuXFxuICByZXR1cm4gYmFzZUNvbG9yO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiLyogc2hhZGVyaXR5OiBAe2RlZmluaXRpb25zfSAqL1xcbnN0cnVjdCBWZXJ0ZXhPdXRwdXQge1xcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMSkgbm9ybWFsX2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oMikgdGV4Y29vcmRfMCA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbigzKSBjb2xvcl8wIDogdmVjNDxmMzI+LFxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzEgOiB2ZWMyPGYzMj4sXFxuICBAbG9jYXRpb24oNSkgdGV4Y29vcmRfMiA6IHZlYzI8ZjMyPixcXG4gIEBsb2NhdGlvbig2KSB0YW5nZW50X2luV29ybGQgOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oNykgYmlub3JtYWxfaW5Xb3JsZCA6IHZlYzM8ZjMyPixcXG4gIEBsb2NhdGlvbig4KSBiYXJ5Q2VudHJpY0Nvb3JkOiB2ZWMzPGYzMj4sXFxuICBAbG9jYXRpb24oOSkgc2hhZG93Q29vcmQgOiB2ZWM0PGYzMj4sXFxuICBAbG9jYXRpb24oMTApIGluc3RhbmNlSW5mbyA6IGYzMixcXG4gIEBsb2NhdGlvbigxMSkgbm9ybWFsX2luVmlldyA6IHZlYzM8ZjMyPixcXG59XFxuXFxuc3RydWN0IFN0b3JhZ2VEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZT4gc3RvcmFnZURhdGE6IFN0b3JhZ2VEYXRhO1xcbnN0cnVjdCBCbGVuZFNoYXBlRGF0YSB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4+LFxcbn1cXG5AZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2U+IGJsZW5kU2hhcGVEYXRhOiBCbGVuZFNoYXBlRGF0YTtcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoT2Zmc2V0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PHUzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygyKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoT2Zmc2V0czogVW5pZm9ybU1vcnBoT2Zmc2V0cztcXG5zdHJ1Y3QgVW5pZm9ybU1vcnBoV2VpZ2h0cyB7XFxuICBkYXRhOiBhcnJheTx2ZWM0PGYzMj4sIC8qIHNoYWRlcml0eTogQHttYXhNb3JwaERhdGFOdW1iZXJ9ICovID4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygzKSB2YXI8dW5pZm9ybT4gdW5pZm9ybU1vcnBoV2VpZ2h0czogVW5pZm9ybU1vcnBoV2VpZ2h0cztcXG5cXG5vdmVycmlkZSBfbWF0ZXJpYWxTSUQ6IHUzMjtcXG5vdmVycmlkZSBfY3VycmVudFByaW1pdGl2ZUlkeCA9IDB1O1xcbm92ZXJyaWRlIF9tb3JwaFRhcmdldE51bWJlcjogdTMyID0gMHU7XFxub3ZlcnJpZGUgX2NhbWVyYVNJRDogdTMyID0gMHU7XFxuY29uc3QgTV9QSTogZjMyID0gMy4xNDE1OTI2NTM1ODk3OTM7XFxuY29uc3QgUkVDSVBST0NBTF9QSTogZjMyID0gMC4zMTgzMDk4ODYxODM3OTA3O1xcbmNvbnN0IEVwc2lsb246IGYzMiA9IDAuMDAwMDAwMTtcXG5jb25zdCBjX01pblJvdWdobmVzczogZjMyID0gMC4wNDtcXG5cXG5mbiBmZXRjaEVsZW1lbnQodmVjNF9pZHg6IHUzMikgLT4gdmVjNDxmMzI+XFxue1xcbiAgcmV0dXJuIHN0b3JhZ2VEYXRhLmRhdGFbdmVjNF9pZHhdO1xcbn1cXG5cXG5mbiBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcih2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gYmxlbmRTaGFwZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnl6dyk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZEZyb21CbGVuZFNoYXBlQnVmZmVyKHNjYWxhcl9pZHg6IHUzMikgLT4gdmVjMzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2YWwueHl6O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IHZhbDEgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLnp3LCB2YWwxLngpO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAudywgdmFsMS54eSk7XFxuICB9XFxufVxcblxcbmZuIGZldGNoVmVjNCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj4ge1xcbiAgcmV0dXJuIGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxufVxcblxcbmZuIGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IGYzMiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBsZXQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIHJldHVybiB2YWwueDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgcmV0dXJuIHZhbC55O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICByZXR1cm4gdmFsLno7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzdVxcbiAgICByZXR1cm4gdmFsLnc7XFxuICB9XFxufVxcblxcblxcblxcblxcbmZuIGZldGNoTWF0NCh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDQ8ZjMyPlxcbntcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuICBsZXQgY29sMyA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDN1KTtcXG5cXG4gIGxldCB2YWwgPSBtYXQ0eDQ8ZjMyPihcXG4gICAgY29sMC54LCBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LCBjb2wxLncsXFxuICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnosIGNvbDIudyxcXG4gICAgY29sMy54LCBjb2wzLnksIGNvbDMueiwgY29sMy53XFxuICAgICk7XFxuXFxuICByZXR1cm4gdmFsO1xcbn1cXG5cXG5cXG5mbiBmZXRjaE1hdDR4Myh2ZWM0X2lkeDogdTMyKSAtPiBtYXQ0eDM8ZjMyPiB7XFxuICBsZXQgY29sMCA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCk7XFxuICBsZXQgY29sMSA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDF1KTtcXG4gIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMnUpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4MzxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53KTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0M05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LFxcbiAgICAgIGNvbDAudywgY29sMS54LCBjb2wxLnksXFxuICAgICAgY29sMS56LCBjb2wxLncsIGNvbDIueFxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgICBjb2wxLngsIGNvbDEueSwgY29sMS56LFxcbiAgICAgIGNvbDEudywgY29sMi54LCBjb2wyLnlcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueiwgY29sMC53LCBjb2wxLngsXFxuICAgICAgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgICBjb2wyLngsIGNvbDIueSwgY29sMi56XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54LFxcbiAgICAgIGNvbDIueSwgY29sMi56LCBjb2wyLndcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfVxcbn1cXG5cXG5mbiB1dlRyYW5zZm9ybShzY2FsZTogdmVjMmYsIG9mZnNldDogdmVjMmYsIHJvdGF0aW9uOiBmMzIsIHV2OiB2ZWMyZikgLT4gdmVjMmYge1xcbiAgbGV0IHRyYW5zbGF0aW9uTWF0ID0gbWF0M3gzKDEsMCwwLCAwLDEsMCwgb2Zmc2V0LngsIG9mZnNldC55LCAxKTtcXG4gIGxldCByb3RhdGlvbk1hdCA9IG1hdDN4MyhcXG4gICAgICBjb3Mocm90YXRpb24pLCAtc2luKHJvdGF0aW9uKSwgMCxcXG4gICAgICBzaW4ocm90YXRpb24pLCBjb3Mocm90YXRpb24pLCAwLFxcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIDAsIDFcXG4gICk7XFxuICBsZXQgc2NhbGVNYXQgPSBtYXQzeDMoc2NhbGUueCwwLDAsIDAsc2NhbGUueSwwLCAwLDAsMSk7XFxuXFxuICBsZXQgbWF0cml4ID0gdHJhbnNsYXRpb25NYXQgKiByb3RhdGlvbk1hdCAqIHNjYWxlTWF0O1xcbiAgbGV0IHV2VHJhbnNmb3JtZWQgPSAoIG1hdHJpeCAqIHZlYzNmKHV2Lnh5LCAxKSApLnh5O1xcblxcbiAgcmV0dXJuIHV2VHJhbnNmb3JtZWQ7XFxufVxcblxcbiNpZmRlZiBSTl9JU19OT0RFX1NIQURFUlxcbiNlbHNlXFxuZm4gZ2V0VGV4Y29vcmQodGV4Y29vcmRJbmRleDogdTMyLCBpbnB1dDogVmVydGV4T3V0cHV0KSAtPiB2ZWMyPGYzMj4ge1xcbiAgdmFyIHRleGNvb3JkOiB2ZWMyZjtcXG4gIGlmKHRleGNvb3JkSW5kZXggPT0gMil7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMjtcXG4gIH0gZWxzZSBpZih0ZXhjb29yZEluZGV4ID09IDEpe1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzE7XFxuICB9ZWxzZXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8wO1xcbiAgfVxcbiAgcmV0dXJuIHRleGNvb3JkO1xcbn1cXG4jZW5kaWZcXG5cXG5mbiBzYXR1cmF0ZUVwc2lsb25Ub09uZSh4OiBmMzIpIC0+IGYzMiB7XFxuICBsZXQgRXBzaWxvbiA9IDAuMDAwMDAwMTtcXG4gIHJldHVybiBjbGFtcCh4LCBFcHNpbG9uLCAxLjApO1xcbn1cXG5cXG5mbiBtYXgzKHY6IHZlYzNmKSAtPiBmMzJcXG57XFxuICByZXR1cm4gbWF4KG1heCh2LngsIHYueSksIHYueik7XFxufVxcblxcbmZuIHNxRjMyKHQ6IGYzMikgLT4gZjMyXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzJmKHQ6IHZlYzJmKSAtPiB2ZWMyZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWMzZih0OiB2ZWMzZikgLT4gdmVjM2ZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjNGYodDogdmVjNGYpIC0+IHZlYzRmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5cXG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cXG4vKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqL1xcblxcbkB2ZXJ0ZXhcXG5mbiBtYWluKFxcbiAgQGJ1aWx0aW4odmVydGV4X2luZGV4KSB2ZXJ0ZXhJZHggOiB1MzIsXFxuKSAtPiBWZXJ0ZXhPdXRwdXQge1xcbiAgdmFyIG91dHB1dCA6IFZlcnRleE91dHB1dDtcXG5sZXQgbWF0ZXJpYWxTSUQgPSBfbWF0ZXJpYWxTSUQ7XFxubGV0IGN1cnJlbnRQcmltaXRpdmVJZHggPSBfY3VycmVudFByaW1pdGl2ZUlkeDtcXG5sZXQgbW9ycGhUYXJnZXROdW1iZXIgPSBfbW9ycGhUYXJnZXROdW1iZXI7XFxubGV0IGNhbWVyYVNJRCA9IF9jYW1lcmFTSUQ7XFxuXFxuXFxubGV0IHggPSBmMzIoKHZlcnRleElkeCAmIDF1KSA8PCAydSk7XFxubGV0IHkgPSBmMzIoKHZlcnRleElkeCAmIDJ1KSA8PCAxdSk7XFxub3V0cHV0LnRleGNvb3JkXzAueCA9IHggKiAwLjU7XFxub3V0cHV0LnRleGNvb3JkXzAueSA9IHkgKiAwLjU7XFxub3V0cHV0LnRleGNvb3JkXzAueSA9IDEuMCAtIG91dHB1dC50ZXhjb29yZF8wLnk7XFxub3V0cHV0LnBvc2l0aW9uID0gdmVjNGYoeCAtIDEuMCwgeSAtIDEuMCwgMCwgMSk7XFxuXFxuXFxuICByZXR1cm4gb3V0cHV0O1xcblxcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwibGV0IG1hdGVyaWFsU0lEID0gX21hdGVyaWFsU0lEO1xcbmxldCBjdXJyZW50UHJpbWl0aXZlSWR4ID0gX2N1cnJlbnRQcmltaXRpdmVJZHg7XFxubGV0IG1vcnBoVGFyZ2V0TnVtYmVyID0gX21vcnBoVGFyZ2V0TnVtYmVyO1xcbmxldCBjYW1lcmFTSUQgPSBfY2FtZXJhU0lEO1xcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJzdHJ1Y3QgU3RvcmFnZURhdGEge1xcbiAgZGF0YTogYXJyYXk8dmVjNDxmMzI+PixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlPiBzdG9yYWdlRGF0YTogU3RvcmFnZURhdGE7XFxuc3RydWN0IEJsZW5kU2hhcGVEYXRhIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPj4sXFxufVxcbkBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZT4gYmxlbmRTaGFwZURhdGE6IEJsZW5kU2hhcGVEYXRhO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhPZmZzZXRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8dTMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhPZmZzZXRzOiBVbmlmb3JtTW9ycGhPZmZzZXRzO1xcbnN0cnVjdCBVbmlmb3JtTW9ycGhXZWlnaHRzIHtcXG4gIGRhdGE6IGFycmF5PHZlYzQ8ZjMyPiwgLyogc2hhZGVyaXR5OiBAe21heE1vcnBoRGF0YU51bWJlcn0gKi8gPixcXG59XFxuQGdyb3VwKDApIEBiaW5kaW5nKDMpIHZhcjx1bmlmb3JtPiB1bmlmb3JtTW9ycGhXZWlnaHRzOiBVbmlmb3JtTW9ycGhXZWlnaHRzO1xcblxcbm92ZXJyaWRlIF9tYXRlcmlhbFNJRDogdTMyO1xcbm92ZXJyaWRlIF9jdXJyZW50UHJpbWl0aXZlSWR4ID0gMHU7XFxub3ZlcnJpZGUgX21vcnBoVGFyZ2V0TnVtYmVyOiB1MzIgPSAwdTtcXG5vdmVycmlkZSBfY2FtZXJhU0lEOiB1MzIgPSAwdTtcXG5jb25zdCBNX1BJOiBmMzIgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5jb25zdCBSRUNJUFJPQ0FMX1BJOiBmMzIgPSAwLjMxODMwOTg4NjE4Mzc5MDc7XFxuY29uc3QgRXBzaWxvbjogZjMyID0gMC4wMDAwMDAxO1xcbmNvbnN0IGNfTWluUm91Z2huZXNzOiBmMzIgPSAwLjA0O1xcblxcbmZuIGZldGNoRWxlbWVudCh2ZWM0X2lkeDogdTMyKSAtPiB2ZWM0PGYzMj5cXG57XFxuICByZXR1cm4gc3RvcmFnZURhdGEuZGF0YVt2ZWM0X2lkeF07XFxufVxcblxcbmZuIGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPlxcbntcXG4gIHJldHVybiBibGVuZFNoYXBlRGF0YS5kYXRhW3ZlYzRfaWR4XTtcXG59XFxuXFxuZm4gZmV0Y2hWZWMzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IHZlYzM8ZjMyPiB7XFxuICBsZXQgcG9zSW40Ynl0ZXMgPSBzY2FsYXJfaWR4ICUgNHU7XFxuXFxuICBsZXQgYmFzZVBvc0luMTZieXRlcyA9IChzY2FsYXJfaWR4IC0gcG9zSW40Ynl0ZXMpIC8gNHU7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgbGV0IHZhbCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAueXp3KTtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMnUpIHtcXG4gICAgbGV0IHZhbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKzF1KTtcXG4gICAgcmV0dXJuIHZlYzM8ZjMyPih2YWwwLncsIHZhbDEueHkpO1xcbiAgfVxcbn1cXG5cXG5mbiBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoc2NhbGFyX2lkeDogdTMyKSAtPiB2ZWMzPGYzMj4ge1xcbiAgbGV0IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDR1O1xcblxcbiAgbGV0IGJhc2VQb3NJbjE2Ynl0ZXMgPSAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKSAvIDR1O1xcbiAgaWYgKHBvc0luNGJ5dGVzID09IDB1KSB7XFxuICAgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnRGcm9tQmxlbmRTaGFwZUJ1ZmZlcihiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgcmV0dXJuIHZhbC54eXo7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDF1KSB7XFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC55encpO1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAydSkge1xcbiAgICBsZXQgdmFsMCA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgdmFsMSA9IGZldGNoRWxlbWVudEZyb21CbGVuZFNoYXBlQnVmZmVyKGJhc2VQb3NJbjE2Ynl0ZXMrMXUpO1xcbiAgICByZXR1cm4gdmVjMzxmMzI+KHZhbDAuencsIHZhbDEueCk7XFxuICB9IGVsc2UgeyAvLyBwb3NJbjRieXRlcyA9PSAzXFxuICAgIGxldCB2YWwwID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCB2YWwxID0gZmV0Y2hFbGVtZW50RnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luMTZieXRlcysxdSk7XFxuICAgIHJldHVybiB2ZWMzPGYzMj4odmFsMC53LCB2YWwxLnh5KTtcXG4gIH1cXG59XFxuXFxuZm4gZmV0Y2hWZWM0KHZlYzRfaWR4OiB1MzIpIC0+IHZlYzQ8ZjMyPiB7XFxuICByZXR1cm4gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG59XFxuXFxuZm4gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHg6IHUzMikgLT4gZjMyIHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICBpZiAocG9zSW40Ynl0ZXMgPT0gMHUpIHtcXG4gICAgcmV0dXJuIHZhbC54O1xcbiAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxdSkge1xcbiAgICByZXR1cm4gdmFsLnk7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIHJldHVybiB2YWwuejtcXG4gIH0gZWxzZSB7IC8vIHBvc0luNGJ5dGVzID09IDN1XFxuICAgIHJldHVybiB2YWwudztcXG4gIH1cXG59XFxuXFxuXFxuXFxuXFxuZm4gZmV0Y2hNYXQ0KHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4NDxmMzI+XFxue1xcbiAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbiAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAxdSk7XFxuICBsZXQgY29sMiA9IGZldGNoRWxlbWVudCh2ZWM0X2lkeCArIDJ1KTtcXG4gIGxldCBjb2wzID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgM3UpO1xcblxcbiAgbGV0IHZhbCA9IG1hdDR4NDxmMzI+KFxcbiAgICBjb2wwLngsIGNvbDAueSwgY29sMC56LCBjb2wwLncsXFxuICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosIGNvbDEudyxcXG4gICAgY29sMi54LCBjb2wyLnksIGNvbDIueiwgY29sMi53LFxcbiAgICBjb2wzLngsIGNvbDMueSwgY29sMy56LCBjb2wzLndcXG4gICAgKTtcXG5cXG4gIHJldHVybiB2YWw7XFxufVxcblxcblxcbmZuIGZldGNoTWF0NHgzKHZlYzRfaWR4OiB1MzIpIC0+IG1hdDR4MzxmMzI+IHtcXG4gIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4gIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4ICsgMXUpO1xcbiAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHggKyAydSk7XFxuXFxuICBsZXQgdmFsID0gbWF0NHgzPGYzMj4oXFxuICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosIGNvbDAudyxcXG4gICAgY29sMS54LCBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICBjb2wyLngsIGNvbDIueSwgY29sMi56LCBjb2wyLncpO1xcblxcbiAgcmV0dXJuIHZhbDtcXG59XFxuXFxuXFxuZm4gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4OiB1MzIpIC0+IG1hdDN4MzxmMzI+IHtcXG4gIGxldCBwb3NJbjRieXRlcyA9IHNjYWxhcl9pZHggJSA0dTtcXG5cXG4gIGxldCBiYXNlUG9zSW4xNmJ5dGVzID0gKHNjYWxhcl9pZHggLSBwb3NJbjRieXRlcykgLyA0dTtcXG4gIGlmIChwb3NJbjRieXRlcyA9PSAwdSkge1xcbiAgICBsZXQgY29sMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcXG4gICAgbGV0IGNvbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDF1KTtcXG4gICAgbGV0IGNvbDIgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyArIDJ1KTtcXG4gICAgbGV0IHZhbCA9IG1hdDN4MzxmMzI+KFxcbiAgICAgIGNvbDAueCwgY29sMC55LCBjb2wwLnosXFxuICAgICAgY29sMC53LCBjb2wxLngsIGNvbDEueSxcXG4gICAgICBjb2wxLnosIGNvbDEudywgY29sMi54XFxuICAgICAgKTtcXG4gICAgcmV0dXJuIHZhbDtcXG4gIH0gZWxzZSBpZiAocG9zSW40Ynl0ZXMgPT0gMXUpIHtcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLnksIGNvbDAueiwgY29sMC53LFxcbiAgICAgIGNvbDEueCwgY29sMS55LCBjb2wxLnosXFxuICAgICAgY29sMS53LCBjb2wyLngsIGNvbDIueVxcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDJ1KSB7XFxuICAgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xcbiAgICBsZXQgY29sMSA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMXUpO1xcbiAgICBsZXQgY29sMiA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzICsgMnUpO1xcbiAgICBsZXQgdmFsID0gbWF0M3gzPGYzMj4oXFxuICAgICAgY29sMC56LCBjb2wwLncsIGNvbDEueCxcXG4gICAgICBjb2wxLnksIGNvbDEueiwgY29sMS53LFxcbiAgICAgIGNvbDIueCwgY29sMi55LCBjb2wyLnpcXG4gICAgICApO1xcbiAgICByZXR1cm4gdmFsO1xcbiAgfSBlbHNlIHsgLy8gcG9zSW40Ynl0ZXMgPT0gM3VcXG4gICAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcyk7XFxuICAgIGxldCBjb2wxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAxdSk7XFxuICAgIGxldCBjb2wyID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMgKyAydSk7XFxuICAgIGxldCB2YWwgPSBtYXQzeDM8ZjMyPihcXG4gICAgICBjb2wwLncsIGNvbDEueCwgY29sMS55LFxcbiAgICAgIGNvbDEueiwgY29sMS53LCBjb2wyLngsXFxuICAgICAgY29sMi55LCBjb2wyLnosIGNvbDIud1xcbiAgICAgICk7XFxuICAgIHJldHVybiB2YWw7XFxuICB9XFxufVxcblxcbmZuIHV2VHJhbnNmb3JtKHNjYWxlOiB2ZWMyZiwgb2Zmc2V0OiB2ZWMyZiwgcm90YXRpb246IGYzMiwgdXY6IHZlYzJmKSAtPiB2ZWMyZiB7XFxuICBsZXQgdHJhbnNsYXRpb25NYXQgPSBtYXQzeDMoMSwwLDAsIDAsMSwwLCBvZmZzZXQueCwgb2Zmc2V0LnksIDEpO1xcbiAgbGV0IHJvdGF0aW9uTWF0ID0gbWF0M3gzKFxcbiAgICAgIGNvcyhyb3RhdGlvbiksIC1zaW4ocm90YXRpb24pLCAwLFxcbiAgICAgIHNpbihyb3RhdGlvbiksIGNvcyhyb3RhdGlvbiksIDAsXFxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgMVxcbiAgKTtcXG4gIGxldCBzY2FsZU1hdCA9IG1hdDN4MyhzY2FsZS54LDAsMCwgMCxzY2FsZS55LDAsIDAsMCwxKTtcXG5cXG4gIGxldCBtYXRyaXggPSB0cmFuc2xhdGlvbk1hdCAqIHJvdGF0aW9uTWF0ICogc2NhbGVNYXQ7XFxuICBsZXQgdXZUcmFuc2Zvcm1lZCA9ICggbWF0cml4ICogdmVjM2YodXYueHksIDEpICkueHk7XFxuXFxuICByZXR1cm4gdXZUcmFuc2Zvcm1lZDtcXG59XFxuXFxuI2lmZGVmIFJOX0lTX05PREVfU0hBREVSXFxuI2Vsc2VcXG5mbiBnZXRUZXhjb29yZCh0ZXhjb29yZEluZGV4OiB1MzIsIGlucHV0OiBWZXJ0ZXhPdXRwdXQpIC0+IHZlYzI8ZjMyPiB7XFxuICB2YXIgdGV4Y29vcmQ6IHZlYzJmO1xcbiAgaWYodGV4Y29vcmRJbmRleCA9PSAyKXtcXG4gICAgdGV4Y29vcmQgPSBpbnB1dC50ZXhjb29yZF8yO1xcbiAgfSBlbHNlIGlmKHRleGNvb3JkSW5kZXggPT0gMSl7XFxuICAgIHRleGNvb3JkID0gaW5wdXQudGV4Y29vcmRfMTtcXG4gIH1lbHNle1xcbiAgICB0ZXhjb29yZCA9IGlucHV0LnRleGNvb3JkXzA7XFxuICB9XFxuICByZXR1cm4gdGV4Y29vcmQ7XFxufVxcbiNlbmRpZlxcblxcbmZuIHNhdHVyYXRlRXBzaWxvblRvT25lKHg6IGYzMikgLT4gZjMyIHtcXG4gIGxldCBFcHNpbG9uID0gMC4wMDAwMDAxO1xcbiAgcmV0dXJuIGNsYW1wKHgsIEVwc2lsb24sIDEuMCk7XFxufVxcblxcbmZuIG1heDModjogdmVjM2YpIC0+IGYzMlxcbntcXG4gIHJldHVybiBtYXgobWF4KHYueCwgdi55KSwgdi56KTtcXG59XFxuXFxuZm4gc3FGMzIodDogZjMyKSAtPiBmMzJcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblxcbmZuIHNxVmVjMmYodDogdmVjMmYpIC0+IHZlYzJmXFxue1xcbiAgcmV0dXJuIHQgKiB0O1xcbn1cXG5cXG5mbiBzcVZlYzNmKHQ6IHZlYzNmKSAtPiB2ZWMzZlxcbntcXG4gIHJldHVybiB0ICogdDtcXG59XFxuXFxuZm4gc3FWZWM0Zih0OiB2ZWM0ZikgLT4gdmVjNGZcXG57XFxuICByZXR1cm4gdCAqIHQ7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCIjaWZkZWYgUk5fVVNFX0lOU1RBTkNFXFxuICBAbG9jYXRpb24oOCkgaW5zdGFuY2VfaWRzOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuXFxuXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9GTE9BVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9QT1NJVElPTl9JTlRcXG4gIEBsb2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxpMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05fVUlOVFxcbiAgQGxvY2F0aW9uKDApIHBvc2l0aW9uOiB2ZWMzPHUzMj4sXFxuI2VuZGlmXFxuXFxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcXG4gIEBsb2NhdGlvbigxKSBub3JtYWw6IHZlYzM8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RBTkdFTlRcXG4gIEBsb2NhdGlvbigyKSB0YW5nZW50OiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9URVhDT09SRF8wXFxuICBAbG9jYXRpb24oMykgdGV4Y29vcmRfMDogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMVxcbiAgQGxvY2F0aW9uKDQpIHRleGNvb3JkXzE6IHZlYzI8ZjMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfRkxPQVRcXG4gIEBsb2NhdGlvbig1KSBjb2xvcl8wOiB2ZWM0PGYzMj4sXFxuI2VuZGlmXFxuI2lmZGVmIFJOX1VTRV9DT0xPUl8wX0lOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8aTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBfVUlOVFxcbiAgQGxvY2F0aW9uKDUpIGNvbG9yXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG5cXG4jaWZkZWYgUk5fVVNFX0pPSU5UU18wXFxuICBAbG9jYXRpb24oNikgam9pbnRzXzA6IHZlYzQ8dTMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1dFSUdIVFNfMFxcbiAgQGxvY2F0aW9uKDcpIHdlaWdodHNfMDogdmVjNDxmMzI+LFxcbiNlbmRpZlxcbiNpZmRlZiBSTl9VU0VfQkFSWV9DRU5UUklDX0NPT1JEXFxuICBAbG9jYXRpb24oMTApIGJhcnlDZW50cmljQ29vcmQ6IHZlYzQ8ZjMyPixcXG4jZW5kaWZcXG4jaWZkZWYgUk5fVVNFX1RFWENPT1JEXzJcXG4gIEBsb2NhdGlvbigxMSkgdGV4Y29vcmRfMjogdmVjMjxmMzI+LFxcbiNlbmRpZlxcbiAgQGJ1aWx0aW4odmVydGV4X2luZGV4KSB2ZXJ0ZXhJZHggOiB1MzIsXFxuXFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcIlxcbmZuIGFkZEYzMkYzMihsZnM6IGYzMiwgcmhzOiBmMzIsIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIGYzMj4pIHtcXG4gICpvdXRWYWx1ZSA9IGxmcyArIHJocztcXG59XFxuZm4gYWRkSTMySTMyKGxmczogaTMyLCByaHM6IGkzMiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgaTMyPikge1xcbiAgKm91dFZhbHVlID0gbGZzICsgcmhzO1xcbn1cXG5mbiBhZGRWZWMyZlZlYzJmKGxmczogdmVjMjxmMzI+LCByaHM6IHZlYzI8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICsgcmhzO1xcbn1cXG5mbiBhZGRWZWMzZlZlYzNmKGxmczogdmVjMzxmMzI+LCByaHM6IHZlYzM8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICsgcmhzO1xcbn1cXG5mbiBhZGRWZWM0ZlZlYzRmKGxmczogdmVjNDxmMzI+LCByaHM6IHZlYzQ8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjNDxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICsgcmhzO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gYXR0cmlidXRlQ29sb3Iob3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjNDxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gYV9jb2xvcl8wO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gYXR0cmlidXRlTm9ybWFsKG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzM8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IGFfbm9ybWFsO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gYXR0cmlidXRlUG9zaXRpb24ob3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjNGY+KSB7XFxuICAqb3V0VmFsdWUgPSB2ZWM0ZihhX3Bvc2l0aW9uLCAxLjApO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuZm4gYXR0cmlidXRlVGV4Y29vcmQob3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gYV90ZXhjb29yZF8wO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gZG90UHJvZHVjdFZlYzJmKGxmczogdmVjMjxmMzI+LCByaHM6IHZlYzI8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgZjMyPikge1xcbiAgKm91dFZhbHVlID0gZG90KGxmcywgcmhzKTtcXG59XFxuZm4gZG90UHJvZHVjdFZlYzNmKGxmczogdmVjMzxmMzI+LCByaHM6IHZlYzM8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgZjMyPikge1xcbiAgKm91dFZhbHVlID0gZG90KGxmcywgcmhzKTtcXG59XFxuZm4gZG90UHJvZHVjdFZlYzRmKGxmczogdmVjNDxmMzI+LCByaHM6IHZlYzQ8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgZjMyPikge1xcbiAgKm91dFZhbHVlID0gZG90KGxmcywgcmhzKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcImZuIG1lcmdlVmVjdG9yWFlaX1coeHl6OiB2ZWMzPGYzMj4sIHc6IGYzMiwgb3V0WFlaVzogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+LCBvdXRYWVo6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Piwgb3V0WFk6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Piwgb3V0Wlc6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFhZWlcgPSB2ZWM0PGYzMj4oeHl6LCB3KTtcXG4gICpvdXRYWVogPSB4eXo7XFxuICAqb3V0WFkgPSB4eXoueHk7XFxuICAqb3V0WlcgPSB2ZWMyZih4eXoueiwgdyk7XFxufVxcblxcbmZuIG1lcmdlVmVjdG9yWFlfWlcoeHk6IHZlYzI8ZjMyPiwgenc6IHZlYzI8ZjMyPiwgb3V0WFlaVzogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+LCBvdXRYWVo6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Piwgb3V0WFk6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Piwgb3V0Wlc6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFhZWlcgPSB2ZWM0PGYzMj4oeHksIHp3KTtcXG4gICpvdXRYWVogPSB2ZWMzZih4eSwgencueCk7XFxuICAqb3V0WFkgPSB4eTtcXG4gICpvdXRaVyA9IHp3O1xcbn1cXG5cXG5mbiBtZXJnZVZlY3RvclhZX1pfVyh4eTogdmVjMjxmMzI+LCB6OiBmMzIsIHc6IGYzMiwgb3V0WFlaVzogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+LCBvdXRYWVo6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Piwgb3V0WFk6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Piwgb3V0Wlc6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFhZWlcgPSB2ZWM0PGYzMj4oeHkueCwgeHkueSwgeiwgdyk7XFxuICAqb3V0WFlaID0gdmVjM2YoeHksIHopO1xcbiAgKm91dFhZID0geHk7XFxuICAqb3V0WlcgPSB2ZWMyZih6LCB3KTtcXG59XFxuXFxuZm4gbWVyZ2VWZWN0b3JaV19YX1koenc6IHZlYzI8ZjMyPiwgeDogZjMyLCB5OiBmMzIsIG91dFhZWlc6IHB0cjxmdW5jdGlvbiwgdmVjNDxmMzI+Piwgb3V0WFlaOiBwdHI8ZnVuY3Rpb24sIHZlYzM8ZjMyPj4sIG91dFhZOiBwdHI8ZnVuY3Rpb24sIHZlYzI8ZjMyPj4sIG91dFpXOiBwdHI8ZnVuY3Rpb24sIHZlYzI8ZjMyPj4pIHtcXG4gICpvdXRYWVpXID0gdmVjNDxmMzI+KHgsIHksIHp3LngsIHp3LnkpO1xcbiAgKm91dFhZWiA9IHZlYzNmKHgsIHksIHp3LngpO1xcbiAgKm91dFhZID0gdmVjMmYoeCwgeSk7XFxuICAqb3V0WlcgPSB6dztcXG59XFxuXFxuZm4gbWVyZ2VWZWN0b3JYX1lfWl9XKHg6IGYzMiwgeTogZjMyLCB6OiBmMzIsIHc6IGYzMiwgb3V0WFlaVzogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+LCBvdXRYWVo6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Piwgb3V0WFk6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Piwgb3V0Wlc6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFhZWlcgPSB2ZWM0PGYzMj4oeCwgeSwgeiwgdyk7XFxuICAqb3V0WFlaID0gdmVjM2YoeCwgeSwgeik7XFxuICAqb3V0WFkgPSB2ZWMyZih4LCB5KTtcXG4gICpvdXRaVyA9IHZlYzJmKHosIHcpO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gbXVsdGlwbHlGMzJGMzIobGZzOiBmMzIsIHJoczogZjMyLCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCBmMzI+KSB7XFxuICAqb3V0VmFsdWUgPSBsZnMgKiByaHM7XFxufVxcbmZuIG11bHRpcGx5STMySTMyKGxmczogaTMyLCByaHM6IGkzMiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgaTMyPikge1xcbiAgKm91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG5mbiBtdWx0aXBseVZlYzJmVmVjMmYobGZzOiB2ZWMyPGYzMj4sIHJoczogdmVjMjxmMzI+LCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCB2ZWMyPGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBsZnMgKiByaHM7XFxufVxcbmZuIG11bHRpcGx5VmVjM2ZWZWMzZihsZnM6IHZlYzM8ZjMyPiwgcmhzOiB2ZWMzPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzM8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxuZm4gbXVsdGlwbHlWZWM0ZlZlYzRmKGxmczogdmVjNDxmMzI+LCByaHM6IHZlYzQ8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjNDxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG5mbiBtdWx0aXBseU1hdDJ4MmZNYXQyeDJmKGxmczogbWF0MngyPGYzMj4sIHJoczogbWF0MngyPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIG1hdDJ4MjxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG5mbiBtdWx0aXBseU1hdDN4M2ZNYXQzeDNmKGxmczogbWF0M3gzPGYzMj4sIHJoczogbWF0M3gzPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIG1hdDN4MzxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG5mbiBtdWx0aXBseU1hdDR4NGZNYXQ0eDRmKGxmczogbWF0NHg0PGYzMj4sIHJoczogbWF0NHg0PGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIG1hdDR4NDxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuZm4gbm9ybWFsTWF0cml4KG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIG1hdDN4MzxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gZ2V0X25vcm1hbE1hdHJpeCh1MzIoYV9pbnN0YW5jZUlkcy54KSk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJcXG5mbiBfbm9ybWFsaXplVmVjMmYodmFsdWU6IHZlYzI8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbm9ybWFsaXplKHZhbHVlKTtcXG59XFxuXFxuZm4gX25vcm1hbGl6ZVZlYzNmKHZhbHVlOiB2ZWMzPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzM8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IG5vcm1hbGl6ZSh2YWx1ZSk7XFxufVxcblxcbmZuIF9ub3JtYWxpemVWZWM0Zih2YWx1ZTogdmVjNDxmMzI+LCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBub3JtYWxpemUodmFsdWUpO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuZm4gcHJvamVjdGlvbk1hdHJpeChvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCBtYXQ0eDQ8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IGdldF9wcm9qZWN0aW9uTWF0cml4KF9jYW1lcmFTSUQsIDApO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gX3NpbkYzMih2YWx1ZTogZjMyLCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCBmMzI+KSB7XFxuICAqb3V0VmFsdWUgPSBzaW4odmFsdWUpO1xcbn1cXG5mbiBfc2luVmVjMmYodmFsdWU6IHZlYzI8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gc2luKHZhbHVlKTtcXG59XFxuZm4gX3NpblZlYzNmKHZhbHVlOiB2ZWMzPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzM8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IHNpbih2YWx1ZSk7XFxufVxcbmZuIF9zaW5WZWM0Zih2YWx1ZTogdmVjNDxmMzI+LCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBzaW4odmFsdWUpO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gX3Ntb290aHN0ZXBGMzIodmFsdWU6IGYzMiwgZWRnZTA6IGYzMiwgZWRnZTE6IGYzMiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgZjMyPikge1xcbiAgKm91dFZhbHVlID0gc21vb3Roc3RlcChlZGdlMCwgZWRnZTEsIHZhbHVlKTtcXG59XFxuZm4gX3Ntb290aHN0ZXBWZWMyZih2YWx1ZTogdmVjMjxmMzI+LCBlZGdlMDogdmVjMjxmMzI+LCBlZGdlMTogdmVjMjxmMzI+LCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCB2ZWMyPGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBzbW9vdGhzdGVwKGVkZ2UwLCBlZGdlMSwgdmFsdWUpO1xcbn1cXG5mbiBfc21vb3Roc3RlcFZlYzNmKHZhbHVlOiB2ZWMzPGYzMj4sIGVkZ2UwOiB2ZWMzPGYzMj4sIGVkZ2UxOiB2ZWMzPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzM8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IHNtb290aHN0ZXAoZWRnZTAsIGVkZ2UxLCB2YWx1ZSk7XFxufVxcbmZuIF9zbW9vdGhzdGVwVmVjNGYodmFsdWU6IHZlYzQ8ZjMyPiwgZWRnZTA6IHZlYzQ8ZjMyPiwgZWRnZTE6IHZlYzQ8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjNDxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gc21vb3Roc3RlcChlZGdlMCwgZWRnZTEsIHZhbHVlKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcImZuIHNwbGl0VmVjdG9yWFlaVyh4eXp3OiB2ZWM0PGYzMj4sIG91dFhZWjogcHRyPGZ1bmN0aW9uLCB2ZWMzPGYzMj4+LCBvdXRYWTogcHRyPGZ1bmN0aW9uLCB2ZWMyPGYzMj4+LCBvdXRaVzogcHRyPGZ1bmN0aW9uLCB2ZWMyPGYzMj4+LCBvdXRYOiBwdHI8ZnVuY3Rpb24sIGYzMj4sIG91dFk6IHB0cjxmdW5jdGlvbiwgZjMyPiwgb3V0WjogcHRyPGZ1bmN0aW9uLCBmMzI+LCBvdXRXOiBwdHI8ZnVuY3Rpb24sIGYzMj4pIHtcXG4gICpvdXRYID0geHl6dy54O1xcbiAgKm91dFkgPSB4eXp3Lnk7XFxuICAqb3V0WiA9IHh5encuejtcXG4gICpvdXRXID0geHl6dy53O1xcbiAgKm91dFhZWiA9IHh5encueHl6O1xcbiAgKm91dFhZID0geHl6dy54eTtcXG4gICpvdXRaVyA9IHh5encuenc7XFxufVxcblxcbmZuIHNwbGl0VmVjdG9yWFlaKHh5ejogdmVjMzxmMzI+LCBvdXRYWVo6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Piwgb3V0WFk6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Piwgb3V0Wlc6IHB0cjxmdW5jdGlvbiwgdmVjMjxmMzI+Piwgb3V0WDogcHRyPGZ1bmN0aW9uLCBmMzI+LCBvdXRZOiBwdHI8ZnVuY3Rpb24sIGYzMj4sIG91dFo6IHB0cjxmdW5jdGlvbiwgZjMyPiwgb3V0VzogcHRyPGZ1bmN0aW9uLCBmMzI+KSB7XFxuICAqb3V0WCA9IHh5ei54O1xcbiAgKm91dFkgPSB4eXoueTtcXG4gICpvdXRaID0geHl6Lno7XFxuICAqb3V0VyA9IDAuMDtcXG4gICpvdXRYWVogPSB4eXo7XFxuICAqb3V0WFkgPSB4eXoueHk7XFxuICAqb3V0WlcgPSB2ZWMyKHh5ei56LCAwLjApO1xcbn1cXG5cXG5mbiBzcGxpdFZlY3RvclhZKHh5OiB2ZWMyPGYzMj4sIG91dFhZWjogcHRyPGZ1bmN0aW9uLCB2ZWMzPGYzMj4+LCBvdXRYWTogcHRyPGZ1bmN0aW9uLCB2ZWMyPGYzMj4+LCBvdXRaVzogcHRyPGZ1bmN0aW9uLCB2ZWMyPGYzMj4+LCBvdXRYOiBwdHI8ZnVuY3Rpb24sIGYzMj4sIG91dFk6IHB0cjxmdW5jdGlvbiwgZjMyPiwgb3V0WjogcHRyPGZ1bmN0aW9uLCBmMzI+LCBvdXRXOiBwdHI8ZnVuY3Rpb24sIGYzMj4pIHtcXG4gICpvdXRYID0geHkueDtcXG4gICpvdXRZID0geHkueTtcXG4gICpvdXRaID0gMC4wO1xcbiAgKm91dFcgPSAwLjA7XFxuICAqb3V0WFlaID0gdmVjMyh4eSwgMC4wKTtcXG4gICpvdXRYWSA9IHh5O1xcbiAgKm91dFpXID0gdmVjMigwLjApO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiZm4gX3N0ZXBGMzIodmFsdWU6IGYzMiwgZWRnZTogZjMyLCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCBmMzI+KSB7XFxuICAqb3V0VmFsdWUgPSBzdGVwKGVkZ2UsIHZhbHVlKTtcXG59XFxuZm4gX3N0ZXBWZWMyZih2YWx1ZTogdmVjMjxmMzI+LCBlZGdlOiB2ZWMyPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzI8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IHN0ZXAoZWRnZSwgdmFsdWUpO1xcbn1cXG5mbiBfc3RlcFZlYzNmKHZhbHVlOiB2ZWMzPGYzMj4sIGVkZ2U6IHZlYzM8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjMzxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gc3RlcChlZGdlLCB2YWx1ZSk7XFxufVxcbmZuIF9zdGVwVmVjNGYodmFsdWU6IHZlYzQ8ZjMyPiwgZWRnZTogdmVjNDxmMzI+LCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCB2ZWM0PGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBzdGVwKGVkZ2UsIHZhbHVlKTtcXG59XFxuXCIsXCJzaGFkZXJTdGFnZVwiOlwiZnJhZ21lbnRcIixcImlzRnJhZ21lbnRTaGFkZXJcIjp0cnVlfSIsImV4cG9ydCBkZWZhdWx0IHtcImNvZGVcIjpcImZuIHRpbWUob3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgZjMyPikge1xcbiAgKm91dFZhbHVlID0gZ2V0X3RpbWUoMCwgMCk7XFxufVxcblwiLFwic2hhZGVyU3RhZ2VcIjpcImZyYWdtZW50XCIsXCJpc0ZyYWdtZW50U2hhZGVyXCI6dHJ1ZX0iLCJleHBvcnQgZGVmYXVsdCB7XCJjb2RlXCI6XCJmbiB0cmFuc2Zvcm1NYXQyeDJmVmVjMmYobGZzOiBtYXQyeDI8ZjMyPiwgcmhzOiB2ZWMyPGYzMj4sIG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sIHZlYzI8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IGxmcyAqIHJocztcXG59XFxuZm4gdHJhbnNmb3JtTWF0M3gzZlZlYzNmKGxmczogbWF0M3gzPGYzMj4sIHJoczogdmVjMzxmMzI+LCBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCB2ZWMzPGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBsZnMgKiByaHM7XFxufVxcbmZuIHRyYW5zZm9ybU1hdDR4NGZWZWM0ZihsZnM6IG1hdDR4NDxmMzI+LCByaHM6IHZlYzQ8ZjMyPiwgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgdmVjNDxmMzI+Pikge1xcbiAgKm91dFZhbHVlID0gbGZzICogcmhzO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuZm4gdmlld01hdHJpeChvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCBtYXQ0eDQ8ZjMyPj4pIHtcXG4gICpvdXRWYWx1ZSA9IGdldF92aWV3TWF0cml4KF9jYW1lcmFTSUQsIDApO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwiZXhwb3J0IGRlZmF1bHQge1wiY29kZVwiOlwiXFxuZm4gd29ybGRNYXRyaXgob3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgbWF0NHg0PGYzMj4+KSB7XFxuICAqb3V0VmFsdWUgPSBnZXRfd29ybGRNYXRyaXgodTMyKGFfaW5zdGFuY2VJZHMueCkpO1xcbn1cXG5cIixcInNoYWRlclN0YWdlXCI6XCJmcmFnbWVudFwiLFwiaXNGcmFnbWVudFNoYWRlclwiOnRydWV9IiwibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi4vLi4vLi4vZGlzdC9cIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC50c1wiKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gXCIuL3NyYy9pbmRleC50c1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9pbmRleC50cyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgU2hhZGVyaXR5XzEgPSBfX2ltcG9ydERlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tYWluL1NoYWRlcml0eSAqLyBcIi4vc3JjL21haW4vU2hhZGVyaXR5LnRzXCIpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFNoYWRlcml0eV8xLmRlZmF1bHQ7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvbWFpbi9QcmVQcm9jZXNzb3IudHNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvbWFpbi9QcmVQcm9jZXNzb3IudHMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNsYXNzIFByZVByb2Nlc3NvciB7XG4gICAgc3RhdGljIHByb2Nlc3Moc3BsaXR0ZWRMaW5lcykge1xuICAgICAgICBjb25zdCBkZWZpbmUgPSAvI2RlZmluZVtcXHQgXSsoXFx3KykvO1xuICAgICAgICBjb25zdCBpZmRlZiA9IC8jaWZkZWZbXFx0IF0rKFxcdyspLztcbiAgICAgICAgY29uc3QgZWxpZiA9IC8jZWxpZltcXHQgXStkZWZpbmVkXFwoKFxcdyspXFwpLztcbiAgICAgICAgY29uc3QgX2Vsc2UgPSAvI2Vsc2UvO1xuICAgICAgICBjb25zdCBlbmRpZiA9IC8jZW5kaWYvO1xuICAgICAgICBjb25zdCBvdXRwdXRIaXN0b3J5ID0gW107XG4gICAgICAgIGxldCBvdXRwdXRGbGcgPSB0cnVlO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBpZmRlZnMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0TGluZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHNwbGl0dGVkTGluZXMpIHtcbiAgICAgICAgICAgIGxldCBpc1ByYWdtYSA9IGZhbHNlO1xuICAgICAgICAgICAgeyAvLyAjZGVmaW5lXG4gICAgICAgICAgICAgICAgY29uc3QgcmUgPSBsaW5lLm1hdGNoKGRlZmluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMucHVzaChyZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGlzUHJhZ21hID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3V0cHV0SGlzdG9yeS5pbmRleE9mKGZhbHNlKSA9PT0gLTEpIHsgLy8gI2lmZGVmXG4gICAgICAgICAgICAgICAgY29uc3QgcmUgPSBsaW5lLm1hdGNoKGlmZGVmKTtcbiAgICAgICAgICAgICAgICBpZiAocmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRIaXN0b3J5LnB1c2gob3V0cHV0RmxnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9DaGVja0RlZiA9IHJlWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZmRlZnMucHVzaChbdG9DaGVja0RlZl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMuaW5kZXhPZih0b0NoZWNrRGVmKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzUHJhZ21hID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3V0cHV0SGlzdG9yeS5pbmRleE9mKGZhbHNlKSA9PT0gLTEpIHsgLy8gI2VsaWZcbiAgICAgICAgICAgICAgICBjb25zdCByZSA9IGxpbmUubWF0Y2goZWxpZik7XG4gICAgICAgICAgICAgICAgaWYgKHJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9DaGVja0RlZiA9IHJlWzFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SWZkZWZzID0gaWZkZWZzW2lmZGVmcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50SWZkZWYgb2YgY3VycmVudElmZGVmcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmluaXRpb25zLmluZGV4T2YoY3VycmVudElmZGVmKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3RGb3VuZCAmJiBkZWZpbml0aW9ucy5pbmRleE9mKHRvQ2hlY2tEZWYpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJZmRlZnMucHVzaCh0b0NoZWNrRGVmKTtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmFnbWEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvdXRwdXRIaXN0b3J5LmluZGV4T2YoZmFsc2UpID09PSAtMSkgeyAvLyAjZWxzZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbGluZS5tYXRjaChfZWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudElmZGVmcyA9IGlmZGVmc1tpZmRlZnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdXRwdXRGbGdJbm5lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudElmZGVmIG9mIGN1cnJlbnRJZmRlZnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9ucy5pbmRleE9mKGN1cnJlbnRJZmRlZikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxnSW5uZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGcgPSBvdXRwdXRGbGdJbm5lcjtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmFnbWEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHsgLy8gI2VuZGlmXG4gICAgICAgICAgICAgICAgY29uc3QgcmUgPSBsaW5lLm1hdGNoKGVuZGlmKTtcbiAgICAgICAgICAgICAgICBpZiAocmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0SGlzdG9yeS5pbmRleE9mKGZhbHNlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNQcmFnbWEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZmRlZnMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEhpc3RvcnkucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEZsZyAmJiAhaXNQcmFnbWEpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRMaW5lcztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcmVQcm9jZXNzb3I7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvbWFpbi9SZWZsZWN0aW9uLnRzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9tYWluL1JlZmxlY3Rpb24udHMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFRoaXMgY2xhc3MgZ2V0cyB0aGUgYXR0cmlidXRlLCB2YXJ5aW5nLCBhbmQgdW5pZm9ybSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb2RlIHByb3BlcnR5IG9mIGEgc2hhZGVyaXR5IG9iamVjdC5cbiAqIFRoZSBtZXRob2RzIG9mIHRoZSBTaGFkZXJpdHkgaW5zdGFuY2UgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4gKlxuICogQmVmb3JlIGdldHRpbmcgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUsIHZhcnlpbmcsIGFuZCB1bmlmb3JtLCB5b3UgbmVlZCB0byBjYWxsIHRoZSByZWZsZWN0IG1ldGhvZCBvZiB0aGlzIGluc3RhbmNlLlxuICovXG5jbGFzcyBSZWZsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGxpdHRlZFNoYWRlcml0eVNoYWRlckNvZGUsIHNoYWRlclN0YWdlKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX191bmlmb3JtU2VtYW50aWNzTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICB0aGlzLl9fdmFyeWluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1zID0gW107XG4gICAgICAgIHRoaXMuX19zcGxpdHRlZFNoYWRlckNvZGUgPSBzcGxpdHRlZFNoYWRlcml0eVNoYWRlckNvZGU7XG4gICAgICAgIHRoaXMuX19zaGFkZXJTdGFnZSA9IHNoYWRlclN0YWdlO1xuICAgICAgICB0aGlzLl9fc2V0RGVmYXVsdEF0dHJpYnV0ZUFuZFVuaWZvcm1TZW1hbnRpY3NNYXAoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYXR0cmlidXRlIHZhcmlhYmxlIGluZm9ybWF0aW9uIGluIHRoZSBzaGFkZXIgY29kZS5cbiAgICAgKiBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgeW91IG5lZWQgdG8gY2FsbCB0aGUgcmVmbGVjdCBtZXRob2Qgb2YgdGhpcyBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBSZWZsZWN0aW9uQXR0cmlidXRlIG9iamVjdFxuICAgICAqL1xuICAgIGdldCBhdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHZhcnlpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24gaW4gdGhlIHNoYWRlciBjb2RlLlxuICAgICAqIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCB5b3UgbmVlZCB0byBjYWxsIHRoZSByZWZsZWN0IG1ldGhvZCBvZiB0aGlzIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIFJlZmxlY3Rpb25WYXJ5aW5nIG9iamVjdFxuICAgICAqL1xuICAgIGdldCB2YXJ5aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX192YXJ5aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgdW5pZm9ybSB2YXJpYWJsZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2hhZGVyIGNvZGUuXG4gICAgICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgUmVmbGVjdGlvblVuaWZvcm0gb2JqZWN0XG4gICAgICovXG4gICAgZ2V0IHVuaWZvcm1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3VuaWZvcm1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIGFsbCBhdHRyaWJ1dGVzIGluY2x1ZGVkIGluIHRoZSBzaGFkZXIuXG4gICAgICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQXJyYXkgb2Ygc3RyaW5nXG4gICAgICovXG4gICAgZ2V0IGF0dHJpYnV0ZXNOYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiB7IHJldHVybiBhdHRyaWJ1dGUubmFtZTsgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXR0cmlidXRlIHNlbWFudGljIChlLmcuICdQT1NJVElPTicpIG9mIGFsbCBhdHRyaWJ1dGVzIGluY2x1ZGVkIGluIHRoZSBzaGFkZXIuXG4gICAgICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgQXR0cmlidXRlU2VtYW50aWNzIG9iamVjdFxuICAgICAqL1xuICAgIGdldCBhdHRyaWJ1dGVzU2VtYW50aWNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IHsgcmV0dXJuIGF0dHJpYnV0ZS5zZW1hbnRpYzsgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFyaWFibGUgdHlwZSAoZS5nLiAndmVjNCcpIG9mIGFsbCBhdHRyaWJ1dGVzIGluY2x1ZGVkIGluIHRoZSBzaGFkZXIuXG4gICAgICogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgVmFyVHlwZSBvYmplY3RcbiAgICAgKi9cbiAgICBnZXQgYXR0cmlidXRlc1R5cGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IHsgcmV0dXJuIGF0dHJpYnV0ZS50eXBlOyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGFuIGF0dHJpYnV0ZVNlbWFudGljcy5cbiAgICAgKiBUaGUgYXR0cmlidXRlU2VtYW50aWNzIGlzIHVzZWQgaW4gdGhlIFJlZmxlY3Rpb25BdHRyaWJ1dGUuc2VtYW50aWNzXG4gICAgICogKFNlZSByZWZsZWN0IG1ldGhvZCBvZiB0aGlzIGNsYXNzKVxuICAgICAqL1xuICAgIGFkZEF0dHJpYnV0ZVNlbWFudGljc01hcChtYXApIHtcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcCA9IG5ldyBNYXAoWy4uLnRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAsIC4uLm1hcF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSB1bmlmb3JtU2VtYW50aWNzLlxuICAgICAqIFRoZSBhdHRyaWJ1dGVTZW1hbnRpY3MgaXMgdXNlZCBpbiB0aGUgUmVmbGVjdGlvbkF0dHJpYnV0ZS5zZW1hbnRpY3NcbiAgICAgKiAoU2VlIHJlZmxlY3QgbWV0aG9kIG9mIHRoaXMgY2xhc3MpXG4gICAgICovXG4gICAgYWRkVW5pZm9ybVNlbWFudGljc01hcChtYXApIHtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAgPSBuZXcgTWFwKFsuLi50aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcCwgLi4ubWFwXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBhdHRyaWJ1dGVTZW1hbnRpY3MuXG4gICAgICogVGhlIGF0dHJpYnV0ZVNlbWFudGljcyBpcyB1c2VkIGluIHRoZSBSZWZsZWN0aW9uQXR0cmlidXRlLnNlbWFudGljc1xuICAgICAqIChTZWUgcmVmbGVjdCBtZXRob2Qgb2YgdGhpcyBjbGFzcylcbiAgICAgKi9cbiAgICBhZGRBdHRyaWJ1dGVTZW1hbnRpY3Moa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgdW5pZm9ybVNlbWFudGljcy5cbiAgICAgKiBUaGUgYXR0cmlidXRlU2VtYW50aWNzIGlzIHVzZWQgaW4gdGhlIFJlZmxlY3Rpb25BdHRyaWJ1dGUuc2VtYW50aWNzXG4gICAgICogKFNlZSByZWZsZWN0IG1ldGhvZCBvZiB0aGlzIGNsYXNzKVxuICAgICAqL1xuICAgIGFkZFVuaWZvcm1TZW1hbnRpY3Moa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYXR0cmlidXRlU2VtYW50aWNzXG4gICAgICovXG4gICAgcmVzZXRBdHRyaWJ1dGVTZW1hbnRpY3MoKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdW5pZm9ybVNlbWFudGljc1xuICAgICAqL1xuICAgIHJlc2V0VW5pZm9ybVNlbWFudGljcygpIHtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuYWx5emUgc2hhZGVyIGNvZGUgb2YgdGhlIHNoYWRlcml0eSBhbmQgZ2V0IGluZm9ybWF0aW9uIG9mIGF0dHJpYnV0ZSwgdmFyeWluZyBhbmQgdW5pZm9ybS5cbiAgICAgKiBUaGUgaW5mb3JtYXRpb24gY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBnZXQgbWV0aG9kIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBUaGUgc2VtYW50aWMgcHJvcGVydHkgb2YgdGhlIFJlZmxlY3Rpb25BdHRyaWJ1dGUgaXMgYXNzaWduZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBzZW1hbnRpYyBpZlxuICAgICAqIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGxpbmUgb2YgdGhlIHNoYWRlciBjb2RlLiBJZiBub3QsIHRoZSBBdHRyaWJ1dGVTZW1hbnRpY3NNYXBcbiAgICAgKiBpcyBzZWFyY2hlZCBmb3IgbWF0Y2hpbmcgc2VtYW50aWNzLCBvciBVTktOT1dOLiBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBzZW1hbnRpYyBwcm9wZXJ0eSBvZlxuICAgICAqIFJlZmxlY3Rpb25Vbmlmb3JtLlxuICAgICAqL1xuICAgIHJlZmxlY3QoKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IHRoaXMuX19zcGxpdHRlZFNoYWRlckNvZGU7XG4gICAgICAgIGNvbnN0IHNoYWRlclN0YWdlID0gdGhpcy5fX3NoYWRlclN0YWdlO1xuICAgICAgICBmb3IgKGNvbnN0IHNoYWRlckNvZGVMaW5lIG9mIHNwbGl0dGVkU2hhZGVyQ29kZSkge1xuICAgICAgICAgICAgY29uc3QgaXNBdHRyaWJ1dGVMaW5lID0gdGhpcy5fX21hdGNoQXR0cmlidXRlKHNoYWRlckNvZGVMaW5lLCBzaGFkZXJTdGFnZSk7XG4gICAgICAgICAgICBpZiAoaXNBdHRyaWJ1dGVMaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX2FkZEF0dHJpYnV0ZShzaGFkZXJDb2RlTGluZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc1ZhcnlpbmdMaW5lID0gdGhpcy5fX21hdGNoVmFyeWluZyhzaGFkZXJDb2RlTGluZSwgc2hhZGVyU3RhZ2UpO1xuICAgICAgICAgICAgaWYgKGlzVmFyeWluZ0xpbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fYWRkVmFyeWluZyhzaGFkZXJDb2RlTGluZSwgc2hhZGVyU3RhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNVbmlmb3JtTGluZSA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKC9eKD8hW1xcL10pW1xcdCBdKnVuaWZvcm1bXFx0IF0rLyk7XG4gICAgICAgICAgICBpZiAoaXNVbmlmb3JtTGluZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19hZGRVbmlmb3JtKHNoYWRlckNvZGVMaW5lKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfX3NldERlZmF1bHRBdHRyaWJ1dGVBbmRVbmlmb3JtU2VtYW50aWNzTWFwKCkge1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgncG9zaXRpb24nLCAnUE9TSVRJT04nKTtcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcC5zZXQoJ2NvbG9yJCcsICdDT0xPUl8wJyk7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdjb2xvcl8/MCcsICdDT0xPUl8wJyk7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCd0ZXhjb29yZCQnLCAnVEVYQ09PUkRfMCcpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgndGV4Y29vcmRfPzAnLCAnVEVYQ09PUkRfMCcpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgndGV4Y29vcmRfPzEnLCAnVEVYQ09PUkRfMScpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgndGV4Y29vcmRfPzInLCAnVEVYQ09PUkRfMicpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnbm9ybWFsJywgJ05PUk1BTCcpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgndGFuZ2VudCcsICdUQU5HRU5UJyk7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdqb2ludCQnLCAnSk9JTlRTXzAnKTtcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcC5zZXQoJ2JvbmUkJywgJ0pPSU5UU18wJyk7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdqb2ludF8/MCcsICdKT0lOVFNfMCcpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnYm9uZV8/MCcsICdKT0lOVFNfMCcpO1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwLnNldCgnd2VpZ2h0JCcsICdXRUlHSFRTXzAnKTtcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVNlbWFudGljc01hcC5zZXQoJ3dlaWdodF8/MCcsICdXRUlHSFRTXzAnKTtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAuc2V0KCd3b3JsZG1hdHJpeCcsICdXb3JsZE1hdHJpeCcpO1xuICAgICAgICB0aGlzLl9fdW5pZm9ybVNlbWFudGljc01hcC5zZXQoJ25vcm1hbG1hdHJpeCcsICdOb3JtYWxNYXRyaXgnKTtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAuc2V0KCd2aWV3bWF0cml4JywgJ1ZpZXdNYXRyaXgnKTtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAuc2V0KCdwcm9qZWN0aW9ubWF0cml4JywgJ1Byb2plY3Rpb25NYXRyaXgnKTtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXAuc2V0KCdtb2RlbHZpZXdtYXRyaXgnLCAnTW9kZWxWaWV3TWF0cml4Jyk7XG4gICAgfVxuICAgIF9fbWF0Y2hBdHRyaWJ1dGUoc2hhZGVyQ29kZUxpbmUsIHNoYWRlclN0YWdlKSB7XG4gICAgICAgIGlmIChzaGFkZXJTdGFnZSAhPT0gJ3ZlcnRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hhZGVyQ29kZUxpbmUubWF0Y2goL14oPyFbXFwvXSlbXFx0IF0qKGF0dHJpYnV0ZXxpbilbXFx0IF0rLis7Lyk7XG4gICAgfVxuICAgIF9fYWRkQXR0cmlidXRlKHNoYWRlckNvZGVMaW5lKSB7XG4gICAgICAgIGNvbnN0IHJlZmxlY3Rpb25BdHRyaWJ1dGUgPSB7XG4gICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICBzZW1hbnRpYzogJ1VOS05PV04nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hdGNoVHlwZSA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKFJlZmxlY3Rpb24uYXR0cmlidXRlQW5kVmFyeWluZ1R5cGVSZWdFeHApO1xuICAgICAgICBpZiAobWF0Y2hUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gbWF0Y2hUeXBlWzFdO1xuICAgICAgICAgICAgcmVmbGVjdGlvbkF0dHJpYnV0ZS50eXBlID0gdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBtYXRjaFR5cGVbMl07XG4gICAgICAgICAgICByZWZsZWN0aW9uQXR0cmlidXRlLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hTZW1hbnRpYyA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKFJlZmxlY3Rpb24uc2VtYW50aWNSZWdFeHApO1xuICAgICAgICAgICAgaWYgKG1hdGNoU2VtYW50aWMpIHtcbiAgICAgICAgICAgICAgICByZWZsZWN0aW9uQXR0cmlidXRlLnNlbWFudGljID0gbWF0Y2hTZW1hbnRpY1sxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9fYXR0cmlidXRlU2VtYW50aWNzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLm1hdGNoKG5ldyBSZWdFeHAoa2V5LCAnaScpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbkF0dHJpYnV0ZS5zZW1hbnRpYyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVzLnB1c2gocmVmbGVjdGlvbkF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIF9fbWF0Y2hWYXJ5aW5nKHNoYWRlckNvZGVMaW5lLCBzaGFkZXJTdGFnZSkge1xuICAgICAgICBpZiAoc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2hhZGVyQ29kZUxpbmUubWF0Y2goL14oPyFbXFwvXSlbXFx0IF0qKHZhcnlpbmd8b3V0KVtcXHQgXSsuKzsvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzaGFkZXJDb2RlTGluZS5tYXRjaCgvXig/IVtcXC9dKVtcXHQgXSoodmFyeWluZ3xpbilbXFx0IF0rLis7Lyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19hZGRWYXJ5aW5nKHNoYWRlckNvZGVMaW5lLCBzaGFkZXJTdGFnZSkge1xuICAgICAgICBjb25zdCByZWZsZWN0aW9uVmFyeWluZyA9IHtcbiAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgICAgICAgIGlub3V0OiAnaW4nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hdGNoVHlwZSA9IHNoYWRlckNvZGVMaW5lLm1hdGNoKFJlZmxlY3Rpb24uYXR0cmlidXRlQW5kVmFyeWluZ1R5cGVSZWdFeHApO1xuICAgICAgICBpZiAobWF0Y2hUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gbWF0Y2hUeXBlWzFdO1xuICAgICAgICAgICAgcmVmbGVjdGlvblZhcnlpbmcudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbWF0Y2hUeXBlWzJdO1xuICAgICAgICAgICAgcmVmbGVjdGlvblZhcnlpbmcubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICByZWZsZWN0aW9uVmFyeWluZy5pbm91dCA9IChzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcpID8gJ291dCcgOiAnaW4nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX192YXJ5aW5ncy5wdXNoKHJlZmxlY3Rpb25WYXJ5aW5nKTtcbiAgICB9XG4gICAgX19hZGRVbmlmb3JtKHNoYWRlckNvZGVMaW5lKSB7XG4gICAgICAgIGNvbnN0IHJlZmxlY3Rpb25Vbmlmb3JtID0ge1xuICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgc2VtYW50aWM6ICdVTktOT1dOJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXRjaFR5cGUgPSBzaGFkZXJDb2RlTGluZS5tYXRjaChSZWZsZWN0aW9uLnVuaWZvcm1UeXBlUmVnRXhwKTtcbiAgICAgICAgaWYgKG1hdGNoVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IG1hdGNoVHlwZVsxXTtcbiAgICAgICAgICAgIHJlZmxlY3Rpb25Vbmlmb3JtLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1hdGNoVHlwZVsyXTtcbiAgICAgICAgICAgIHJlZmxlY3Rpb25Vbmlmb3JtLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hTZW1hbnRpY3MgPSBzaGFkZXJDb2RlTGluZS5tYXRjaChSZWZsZWN0aW9uLnNlbWFudGljUmVnRXhwKTtcbiAgICAgICAgICAgIGlmIChtYXRjaFNlbWFudGljcykge1xuICAgICAgICAgICAgICAgIHJlZmxlY3Rpb25Vbmlmb3JtLnNlbWFudGljID0gbWF0Y2hTZW1hbnRpY3NbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fX3VuaWZvcm1TZW1hbnRpY3NNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUubWF0Y2gobmV3IFJlZ0V4cChrZXksICdpJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uVW5pZm9ybS5zZW1hbnRpYyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX191bmlmb3Jtcy5wdXNoKHJlZmxlY3Rpb25Vbmlmb3JtKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWZsZWN0aW9uO1xuUmVmbGVjdGlvbi5hdHRyaWJ1dGVBbmRWYXJ5aW5nVHlwZVJlZ0V4cCA9IC9bXFx0IF0rKGZsb2F0fGludHx2ZWMyfHZlYzN8dmVjNHxtYXQyfG1hdDN8bWF0NHxpdmVjMnxpdmVjM3xpdmVjNClbXFx0IF0rKFxcdyspOy87XG5SZWZsZWN0aW9uLnVuaWZvcm1UeXBlUmVnRXhwID0gL1tcXHQgXSsoZmxvYXR8aW50fHZlYzJ8dmVjM3x2ZWM0fG1hdDJ8bWF0M3xtYXQ0fGl2ZWMyfGl2ZWMzfGl2ZWM0fHNhbXBsZXIyRHxzYW1wbGVyQ3ViZXxzYW1wbGVyM0QpW1xcdCBdKyhcXHcrKTsvO1xuUmVmbGVjdGlvbi5zZW1hbnRpY1JlZ0V4cCA9IC88LipzZW1hbnRpY1tcXHQgXSo9W1xcdCBdKihcXHcrKS4qPi87XG47XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvbWFpbi9TaGFkZXJFZGl0b3IudHNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvbWFpbi9TaGFkZXJFZGl0b3IudHMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogVGhpcyBjbGFzcyBlZGl0cyB0aGUgY29kZSBwcm9wZXJ0eSBvZiBhIHNoYWRlcml0eSBvYmplY3QuXG4gKi9cbmNsYXNzIFNoYWRlckVkaXRvciB7XG4gICAgc3RhdGljIF9pbnNlcnREZWZpbml0aW9uKHNwbGl0dGVkU2hhZGVyQ29kZSwgZGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBkZWZTdHIgPSBkZWZpbml0aW9uLnJlcGxhY2UoLyNkZWZpbmVbXFx0IF0rLywgJycpO1xuICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGUudW5zaGlmdChgI2RlZmluZSAke2RlZlN0cn1gKTtcbiAgICB9XG4gICAgc3RhdGljIF9maWxsVGVtcGxhdGUoc2hhZGVyQ29kZSwgdGVtcGxhdGVPYmplY3QpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHJpbmcgPSBzaGFkZXJDb2RlLnJlcGxhY2UoL1xcL1xcKltcXHQgXSpzaGFkZXJpdHk6W1xcdCBdKihAe1tcXHQgXSopKFxcUyspKFtcXHQgXSp9KVtcXHQgXSpcXCpcXC8vZywgJyR7dGhpcy4kMn0nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q29kZSA9IG5ldyBGdW5jdGlvbihcInJldHVybiBgXCIgKyB0ZW1wbGF0ZVN0cmluZyArIFwiYDtcIikuY2FsbCh0ZW1wbGF0ZU9iamVjdCk7XG4gICAgICAgIHJldHVybiByZXN1bHRDb2RlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNoYWRlckVkaXRvcjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9tYWluL1NoYWRlclRyYW5zZm9ybWVyLnRzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvbWFpbi9TaGFkZXJUcmFuc2Zvcm1lci50cyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFRoaXMgY2xhc3MgY29udmVydHMgdGhlIGNvZGUgcHJvcGVydHkgb2YgYSBzaGFkZXJpdHkgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0LlxuICovXG5jbGFzcyBTaGFkZXJUcmFuc2Zvcm1lciB7XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBUcmFuc2xhdGUgYSBHTFNMIEVTMyBzaGFkZXIgY29kZSB0byBhIEdMU0wgRVMxIHNoYWRlciBjb2RlXG4gICAgICovXG4gICAgc3RhdGljIF90cmFuc2Zvcm1Ub0dMU0xFUzEoc3BsaXR0ZWRTaGFkZXJDb2RlLCBpc0ZyYWdtZW50U2hhZGVyLCBlbWJlZEVycm9yc0luT3V0cHV0KSB7XG4gICAgICAgIHRoaXMuX19jb252ZXJ0T3JJbnNlcnRWZXJzaW9uR0xTTEVTMShzcGxpdHRlZFNoYWRlckNvZGUpO1xuICAgICAgICB0aGlzLl9fcmVtb3ZlRVMzUXVhbGlmaWVyKHNwbGl0dGVkU2hhZGVyQ29kZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgIHRoaXMuX19jb252ZXJ0SW4oc3BsaXR0ZWRTaGFkZXJDb2RlLCBpc0ZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgdGhpcy5fX2NvbnZlcnRPdXQoc3BsaXR0ZWRTaGFkZXJDb2RlLCBpc0ZyYWdtZW50U2hhZGVyLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcbiAgICAgICAgdGhpcy5fX3JlbW92ZVByZWNpc2lvbkZvckVTMyhzcGxpdHRlZFNoYWRlckNvZGUpO1xuICAgICAgICB0aGlzLl9fY29udmVydFRleHR1cmVGdW5jdGlvblRvRVMxKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlciwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlID0gc3BsaXR0ZWRTaGFkZXJDb2RlO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogVHJhbnNsYXRlIGEgR0xTTCBFUzEgc2hhZGVyIGNvZGUgdG8gYSBHTFNMIEVTMyBzaGFkZXIgY29kZVxuICAgICAqL1xuICAgIHN0YXRpYyBfdHJhbnNmb3JtVG9HTFNMRVMzKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlcikge1xuICAgICAgICB0aGlzLl9fY29udmVydE9ySW5zZXJ0VmVyc2lvbkdMU0xFUzMoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICAgICAgdGhpcy5fX2NvbnZlcnRBdHRyaWJ1dGUoc3BsaXR0ZWRTaGFkZXJDb2RlLCBpc0ZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgdGhpcy5fX2NvbnZlcnRWYXJ5aW5nKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlcik7XG4gICAgICAgIHRoaXMuX19jb252ZXJ0VGV4dHVyZUN1YmUoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICAgICAgdGhpcy5fX2NvbnZlcnRUZXh0dXJlMkQoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICAgICAgdGhpcy5fX2NvbnZlcnRUZXh0dXJlMkRQcm9kKHNwbGl0dGVkU2hhZGVyQ29kZSk7XG4gICAgICAgIHRoaXMuX19jb252ZXJ0VGV4dHVyZTNEKHNwbGl0dGVkU2hhZGVyQ29kZSk7XG4gICAgICAgIHRoaXMuX19jb252ZXJ0VGV4dHVyZTNEUHJvZChzcGxpdHRlZFNoYWRlckNvZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNwbGl0dGVkU2hhZGVyQ29kZSA9IHNwbGl0dGVkU2hhZGVyQ29kZTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIFRyYW5zbGF0ZSBhIEdMU0wgc2hhZGVyIGNvZGUgdG8gYSBzaGFkZXIgY29kZSBvZiBzcGVjaWZpZWQgR0xTTCB2ZXJzaW9uXG4gICAgICovXG4gICAgc3RhdGljIF90cmFuc2Zvcm1Ubyh2ZXJzaW9uLCBzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIsIGVtYmVkRXJyb3JzSW5PdXRwdXQpIHtcbiAgICAgICAgaWYgKHZlcnNpb24ubWF0Y2goL3dlYmdsMnxlczMvaSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm1Ub0dMU0xFUzMoc3BsaXR0ZWRTaGFkZXJDb2RlLCBpc0ZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2ZXJzaW9uLm1hdGNoKC93ZWJnbDF8ZXMxL2kpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtVG9HTFNMRVMxKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlciwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFZlcnNpb24nKTtcbiAgICAgICAgICAgIHJldHVybiBzcGxpdHRlZFNoYWRlckNvZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBJZiB0aGUgZmlyc3QgbGluZSBjb250YWlucyB2ZXJzaW9uIGluZm9ybWF0aW9uLCBvdmVyd3JpdGUgdGhlIGZpcnN0IGxpbmUgd2l0aCAnI3ZlcnNpb24gMTAwJy5cbiAgICAgKiBJZiBub3QsIGFkZCAnI3ZlcnNpb24gMTAwJyB0byB0aGUgZmlyc3QgbGluZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IElmIHRoZSBmaXJzdCBsaW5lIGlzIGNvbW1lbnRlZCBvdXQgYW5kIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gaW4gdGhlIHNlY29uZCBvciBsYXRlciBsaW5lLFxuICAgICAqIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpcnN0IGxpbmUgYW5kIHRoZSB1c2VyLWRlZmluZWQgdmVyc2lvbiBpbmZvcm1hdGlvblxuICAgICAqIGluIHRoZSBzZWNvbmQgb3IgbGF0ZXIgbGluZSB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydE9ySW5zZXJ0VmVyc2lvbkdMU0xFUzEoc3BsaXR0ZWRTaGFkZXJDb2RlKSB7XG4gICAgICAgIGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKiNbXFx0IF0qdmVyc2lvbltcXHQgXSsuKi87XG4gICAgICAgIHRoaXMuX19yZW1vdmVGaXJzdE1hdGNoaW5nTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZyk7XG4gICAgICAgIHNwbGl0dGVkU2hhZGVyQ29kZS51bnNoaWZ0KCcjdmVyc2lvbiAxMDAnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBJZiB0aGUgZmlyc3QgbGluZSBjb250YWlucyB2ZXJzaW9uIGluZm9ybWF0aW9uLCBvdmVyd3JpdGUgdGhlIGZpcnN0IGxpbmUgd2l0aCAnI3ZlcnNpb24gMzAwIGVzJy5cbiAgICAgKiBJZiBub3QsIGFkZCAnI3ZlcnNpb24gMzAwIGVzJyB0byB0aGUgZmlyc3QgbGluZS5cbiAgICAgKiBJbiBib3RoIGNhc2VzLCAnI2RlZmluZSBHTFNMX0VTMycgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgc2Vjb25kIGxpbmUuXG4gICAgICogVXNlIHRoZSAnI2RlZmluZSBHTFNMX0VTMycgZGlyZWN0aXZlIGlmIHlvdSB3YW50IHRvIHdyaXRlIGEgc2hhZGVyIGNvZGUgdGhhdCB3aWxsIG9ubHkgcnVuIGluIHRoZSBjYXNlIG9mIHdlYmdsMi5cbiAgICAgKlxuICAgICAqIE5vdGU6IElmIHRoZSBmaXJzdCBsaW5lIGlzIGNvbW1lbnRlZCBvdXQgYW5kIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gaW4gdGhlIHNlY29uZCBvciBsYXRlciBsaW5lLFxuICAgICAqIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpcnN0IGxpbmUgYW5kIHRoZSB1c2VyLWRlZmluZWQgdmVyc2lvbiBpbmZvcm1hdGlvblxuICAgICAqIGluIHRoZSBzZWNvbmQgb3IgbGF0ZXIgbGluZSB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydE9ySW5zZXJ0VmVyc2lvbkdMU0xFUzMoc3BsaXR0ZWRTaGFkZXJDb2RlKSB7XG4gICAgICAgIGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKiNbXFx0IF0qdmVyc2lvbltcXHQgXSsuKi87XG4gICAgICAgIHRoaXMuX19yZW1vdmVGaXJzdE1hdGNoaW5nTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZyk7XG4gICAgICAgIHNwbGl0dGVkU2hhZGVyQ29kZS51bnNoaWZ0KCcjZGVmaW5lIEdMU0xfRVMzJyk7XG4gICAgICAgIHNwbGl0dGVkU2hhZGVyQ29kZS51bnNoaWZ0KCcjdmVyc2lvbiAzMDAgZXMnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBGaW5kIHRoZSAnaW4nIHF1YWxpZmllciBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzEgcXVhbGlmaWVyKCdhdHRyaWJ1dGUnIG9yICd2YXJ5aW5nJylcbiAgICAgKiBUaGlzIG1ldGhvZCBkaXJlY3RseSByZXBsYWNlIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BsaXR0ZWRTaGFkZXJDb2RlIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBfX2NvbnZlcnRJbihzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIpIHtcbiAgICAgICAgY29uc3QgcmVnID0gL14oPyFbXFwvXSlbXFx0IF0qaW5bXFx0IF0rKChoaWdocHxtZWRpdW1wfGxvd3B8KVtcXHQgXSpcXHcrW1xcdCBdKlxcdytbXFx0IF0qOykvO1xuICAgICAgICBsZXQgcmVwbGFjZUZ1bmM7XG4gICAgICAgIGlmIChpc0ZyYWdtZW50U2hhZGVyKSB7XG4gICAgICAgICAgICByZXBsYWNlRnVuYyA9IGZ1bmN0aW9uIChtYXRjaCwgcDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3ZhcnlpbmcgJyArIHAxO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGxhY2VGdW5jID0gZnVuY3Rpb24gKG1hdGNoLCBwMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYXR0cmlidXRlICcgKyBwMTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCByZXBsYWNlRnVuYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogRmluZCB0aGUgXCJvdXRcIiBxdWFsaWZpZXIgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCBtb2RpZnkgdGhlIHNoYWRlciBjb2RlLlxuICAgICAqIElmIHRoZSBzaGFkZXIgc3RhZ2UgaXMgdmVydGV4LCB0aGUgXCJvdXRcIiBxdWFsaWZpZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgXCJ2YXJ5aW5nXCIgcXVhbGlmaWVyLlxuICAgICAqIElmIHRoZSBzaGFkZXIgc3RhZ2UgaXMgZnJhZ21lbnQgYW5kIHRoZSBzaGFkZXIgaGFzIFwib3V0XCIgcXVhbGlmaWVycywgdGhlIFwib3V0XCIgcXVhbGlmaWVycyB3aWxsXG4gICAgICogYmUgZGVsZXRlZCBhbmQgdGhlIHZhcmlhYmxlIGlzIHVzZWQgdG8gYXNzaWduIGEgdmFsdWUgdG8gZ2xfRnJhZ0NvbG9yLlxuICAgICAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydE91dChzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIsIGVtYmVkRXJyb3JzSW5PdXRwdXQpIHtcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRTaGFkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IHRoaXMuX19yZW1vdmVPdXRRdWFsaWZpZXIoc3BsaXR0ZWRTaGFkZXJDb2RlLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIG91dCBxdWFsaWZpZXJcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9fYWRkR0xGcmFnQ29sb3IodmFyaWFibGVOYW1lLCBzcGxpdHRlZFNoYWRlckNvZGUsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVnID0gL14oPyFbXFwvXSlbXFx0IF0qb3V0W1xcdCBdKygoaGlnaHB8bWVkaXVtcHxsb3dwfClbXFx0IF0qXFx3K1tcXHQgXSpcXHcrW1xcdCBdKjspLztcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VGdW5jID0gZnVuY3Rpb24gKG1hdGNoLCBwMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndmFyeWluZyAnICsgcDE7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCByZXBsYWNlRnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHBhcnQgb2YgX19jb252ZXJ0T3V0IG1ldGhvZC5cbiAgICAgKiBUaGlzIG1ldGhvZCBkZWxldGVzIHRoZSBcIm91dFwiIHF1YWxpZmllcnMgYW5kIGFkZHMgdGhlIGxpbmUgZm9yIGFzc2lnbmluZyB0byBnbF9GcmFnQ29sb3IuXG4gICAgICogSWYgdGhlIHNoYWRlciBkb2VzIG5vdCBoYXZlIHRoZSBcIm91dFwiIHF1YWxpZmllcnMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cbiAgICAgKi9cbiAgICBzdGF0aWMgX19yZW1vdmVPdXRRdWFsaWZpZXIoc3BsaXR0ZWRTaGFkZXJDb2RlLCBlbWJlZEVycm9yc0luT3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHJlZyA9IC9eKD8hW1xcL10pW1xcdCBdKm91dFtcXHQgXSsoKGhpZ2hwfG1lZGl1bXB8bG93cHwpW1xcdCBdKlxcdytbXFx0IF0qKFxcdyspW1xcdCBdKjspLztcbiAgICAgICAgbGV0IHZhcmlhYmxlTmFtZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2ldLm1hdGNoKHJlZyk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWUgPSBtYXRjaFszXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICBzdGF0aWMgX19hZGRHTEZyYWdDb2xvcih2YXJpYWJsZU5hbWUsIHNwbGl0dGVkU2hhZGVyQ29kZSwgZW1iZWRFcnJvcnNJbk91dHB1dCkge1xuICAgICAgICBjb25zdCBjbG9zZUJyYWNrZXRSZWcgPSAvKC4qKVxcfVtcXG5cXHQgXSokLztcbiAgICAgICAgY29uc3QgcmV0dXJuUmVnID0gL1tcXG5cXHQgXSpyZXR1cm5bXFxuXFx0IF0qOy87XG4gICAgICAgIGNvbnN0IG1haW5GdW5jU3RhcnRSZWcgPSAvKF58Xig/IVtcXC9dKVtcXHRcXG4gXSspdm9pZFtcXHRcXG4gXSttYWluKFtcXHRcXG4gXXxcXCh8JCkvO1xuICAgICAgICBjb25zdCBmcmFnQ29sb3JDb2RlID0gYCAgZ2xfRnJhZ0NvbG9yID0gJHt2YXJpYWJsZU5hbWV9O2A7XG4gICAgICAgIGxldCBzZXRHbEZyYWdDb2xvckluTGFzdExpbmUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXTtcbiAgICAgICAgICAgIGlmICghc2V0R2xGcmFnQ29sb3JJbkxhc3RMaW5lICYmIGxpbmUubWF0Y2goY2xvc2VCcmFja2V0UmVnKSkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBnbF9GcmFnQ29sb3IgdG8gbGFzdCBsaW5lIG9mIG1haW4gZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBsaW5lLnJlcGxhY2UoY2xvc2VCcmFja2V0UmVnLCBgJDFcXG4ke2ZyYWdDb2xvckNvZGV9XFxufVxcbmApO1xuICAgICAgICAgICAgICAgIHNldEdsRnJhZ0NvbG9ySW5MYXN0TGluZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGluZS5tYXRjaChyZXR1cm5SZWcpKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGdsX0ZyYWdDb2xvciBqdXN0IGJlZm9yZSByZXR1cm5cbiAgICAgICAgICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGUuc3BsaWNlKGksIDAsIGZyYWdDb2xvckNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxpbmUubWF0Y2gobWFpbkZ1bmNTdGFydFJlZykpIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgZ2xfRnJhZ0NvbG9yIG9ubHkgaW4gdGhlIG1haW4gZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNldEdsRnJhZ0NvbG9ySW5MYXN0TGluZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ19fcmVtb3ZlT3V0UXVhbGlmaWVyOiBOb3QgZm91bmQgdGhlIGNsb3NpbmcgYnJhY2tldHMgZm9yIHRoZSBtYWluIGZ1bmN0aW9uJztcbiAgICAgICAgICAgIHRoaXMuX19vdXRFcnJvcihzcGxpdHRlZFNoYWRlckNvZGUsIHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGgsIGVycm9yTWVzc2FnZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBGaW5kIHRoZSBxdWFsaWZpZXIgZm9yIGVzMyBvbmx5IGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVtb3ZlIGl0XG4gICAgICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgX19yZW1vdmVFUzNRdWFsaWZpZXIoc3BsaXR0ZWRTaGFkZXJDb2RlLCBlbWJlZEVycm9yc0luT3V0cHV0KSB7XG4gICAgICAgIHRoaXMuX19yZW1vdmVWYXJ5aW5nUXVhbGlmaWVyKHNwbGl0dGVkU2hhZGVyQ29kZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgIHRoaXMuX19yZW1vdmVMYXlvdXQoc3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBGaW5kIHRoZSBcImZsYXRcIiBhbmQgXCJzbW9vdGhcIiBxdWFsaWZpZXIgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZW1vdmUgaXRcbiAgICAgKi9cbiAgICBzdGF0aWMgX19yZW1vdmVWYXJ5aW5nUXVhbGlmaWVyKHNwbGl0dGVkU2hhZGVyQ29kZSwgZW1iZWRFcnJvcnNJbk91dHB1dCkge1xuICAgICAgICBjb25zdCByZWcgPSAvXig/IVtcXC9dKVtcXHQgXSooZmxhdHxzbW9vdGgpW1xcdCBdKigoaW58b3V0KVtcXHQgXSsuKikvO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnX19yZW1vdmVWYXJ5aW5nUXVhbGlmaWVyOiBnbHNsIGVzMSBkb2VzIG5vdCBzdXBwb3J0IGZsYXQgcXVhbGlmaWVyJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNwbGl0dGVkU2hhZGVyQ29kZVtpXSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXS5yZXBsYWNlKHJlZywgKG1hdGNoLCBwMSwgcDIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocDEgPT09ICdmbGF0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fb3V0RXJyb3Ioc3BsaXR0ZWRTaGFkZXJDb2RlLCBpICsgMSwgZXJyb3JNZXNzYWdlLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcDI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEZpbmQgdGhlIFwibGF5b3V0XCIgcXVhbGlmaWVyIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVtb3ZlIGl0XG4gICAgICovXG4gICAgc3RhdGljIF9fcmVtb3ZlTGF5b3V0KHNwbGl0dGVkU2hhZGVyQ29kZSkge1xuICAgICAgICBjb25zdCByZWcgPSAvXig/IVtcXC9dKVtcXHQgXSpsYXlvdXRbXFx0IF0qXFwoW1xcdCBdKmxvY2F0aW9uW1xcdCBdKlxcPVtcXHQgXSpcXGRbXFx0IF0qXFwpW1xcdCBdKy9nO1xuICAgICAgICB0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsICcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBGaW5kIHRoZSBcInByZWNpc2lvblwiIHF1YWxpZmllciBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlbW92ZSBpdCBpZiB0aGUgXCJwcmVjaXNpb25cIiBxdWFsaWZpZXIgaXMgdmFsaWQgZm9yIG9ubHkgR0xTTCBFUzNcbiAgICAgKiBUaGlzIG1ldGhvZCBkaXJlY3RseSByZXBsYWNlIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BsaXR0ZWRTaGFkZXJDb2RlIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBfX3JlbW92ZVByZWNpc2lvbkZvckVTMyhzcGxpdHRlZFNoYWRlckNvZGUpIHtcbiAgICAgICAgY29uc3QgcmVnID0gL14oPyFbXFwvXSlbXFx0IF0qcHJlY2lzaW9uW1xcdCBdKyhoaWdocHxtZWRpdW1wfGxvd3ApW1xcdCBdKyhcXHcrKVtcXHQgXSo7LztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2ldLm1hdGNoKHJlZyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSA9PT0gJ2ludCcgfHxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPT09ICdmbG9hdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPT09ICdzYW1wbGVyMkQnIHx8XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdID09PSAnc2FtcGxlckN1YmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHByZWNpc2lvbnMgYXJlIHN1cHBvcnRlZCBpbiBlczFcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGUuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogRmluZCB0aGUgXCJ0ZXh0dXJlXCIgYW5kIFwidGV4dHVyZVByb2pcIiBtZXRob2QgaW4gdGhlIHNoYWRlciBjb2RlIGFuZFxuICAgICAqIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzEgbWV0aG9kKCd0ZXh0dXJlMkQnLCAndGV4dHVyZTJEJywgYW5kIHNvIG9uKVxuICAgICAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydFRleHR1cmVGdW5jdGlvblRvRVMxKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlciwgZW1iZWRFcnJvcnNJbk91dHB1dCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBzYmwgPSB0aGlzLl9fcmVnU3ltYm9scygpO1xuICAgICAgICBjb25zdCByZWdUZXh0dXJlUHJvaiA9IG5ldyBSZWdFeHAoYCgke3NibH0rKXRleHR1cmVQcm9qKExvZHwpKCR7c2JsfSspYCwgJ2cnKTtcbiAgICAgICAgY29uc3QgcmVnVGV4dHVyZSA9IG5ldyBSZWdFeHAoYCgke3NibH0rKXRleHR1cmUoTG9kfCkoJHtzYmx9KylgLCAnZycpO1xuICAgICAgICBsZXQgYXJndW1lbnRTYW1wbGVyTWFwO1xuICAgICAgICBjb25zdCB1bmlmb3JtU2FtcGxlck1hcCA9IHRoaXMuX19jcmVhdGVVbmlmb3JtU2FtcGxlck1hcChzcGxpdHRlZFNoYWRlckNvZGUsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoVGV4dHVyZVByb2ogPSBsaW5lLm1hdGNoKC90ZXh0dXJlUHJvaihMb2R8KVtcXHQgXSpcXChbXFx0IF0qKFxcdyspLC8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoVGV4dHVyZVByb2opIHtcbiAgICAgICAgICAgICAgICBhcmd1bWVudFNhbXBsZXJNYXAgPSBhcmd1bWVudFNhbXBsZXJNYXAgIT09IG51bGwgJiYgYXJndW1lbnRTYW1wbGVyTWFwICE9PSB2b2lkIDAgPyBhcmd1bWVudFNhbXBsZXJNYXAgOiB0aGlzLl9fY3JlYXRlQXJndW1lbnRTYW1wbGVyTWFwKHNwbGl0dGVkU2hhZGVyQ29kZSwgaSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMb2RNZXRob2QgPSBtYXRjaFRleHR1cmVQcm9qWzFdID09PSAnTG9kJztcbiAgICAgICAgICAgICAgICBjb25zdCBleHRlbnNpb25TdHIgPSBpc0ZyYWdtZW50U2hhZGVyICYmIGlzTG9kTWV0aG9kID8gYEVYVGAgOiBgYDtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBtYXRjaFRleHR1cmVQcm9qWzJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhbXBsZXJUeXBlID0gKF9hID0gYXJndW1lbnRTYW1wbGVyTWFwID09PSBudWxsIHx8IGFyZ3VtZW50U2FtcGxlck1hcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJndW1lbnRTYW1wbGVyTWFwLmdldCh2YXJpYWJsZU5hbWUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmlmb3JtU2FtcGxlck1hcC5nZXQodmFyaWFibGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtcGxlclR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlclR5cGUgPT09ICdzYW1wbGVyMkQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGVbaV0gPSBzcGxpdHRlZFNoYWRlckNvZGVbaV0ucmVwbGFjZShyZWdUZXh0dXJlUHJvaiwgYCQxdGV4dHVyZTJEUHJvaiQyJHtleHRlbnNpb25TdHJ9JDNgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdfX2NvbnZlcnRUZXh0dXJlRnVuY3Rpb25Ub0VTMTogZG8gbm90IHN1cHBvcnQgJyArIHNhbXBsZXJUeXBlICsgJyB0eXBlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19vdXRFcnJvcihzcGxpdHRlZFNoYWRlckNvZGUsIGksIGVycm9yTWVzc2FnZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYXRjaFRleHR1cmUgPSBsaW5lLm1hdGNoKC90ZXh0dXJlKExvZHwpW1xcdCBdKlxcKFtcXHQgXSooXFx3KyksLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgYXJndW1lbnRTYW1wbGVyTWFwID0gYXJndW1lbnRTYW1wbGVyTWFwICE9PSBudWxsICYmIGFyZ3VtZW50U2FtcGxlck1hcCAhPT0gdm9pZCAwID8gYXJndW1lbnRTYW1wbGVyTWFwIDogdGhpcy5fX2NyZWF0ZUFyZ3VtZW50U2FtcGxlck1hcChzcGxpdHRlZFNoYWRlckNvZGUsIGksIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTG9kTWV0aG9kID0gbWF0Y2hUZXh0dXJlWzFdID09PSAnTG9kJztcbiAgICAgICAgICAgICAgICBjb25zdCBleHRlbnNpb25TdHIgPSBpc0ZyYWdtZW50U2hhZGVyICYmIGlzTG9kTWV0aG9kID8gYEVYVGAgOiBgYDtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBtYXRjaFRleHR1cmVbMl07XG4gICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlclR5cGUgPSAoX2IgPSBhcmd1bWVudFNhbXBsZXJNYXAgPT09IG51bGwgfHwgYXJndW1lbnRTYW1wbGVyTWFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcmd1bWVudFNhbXBsZXJNYXAuZ2V0KHZhcmlhYmxlTmFtZSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuaWZvcm1TYW1wbGVyTWFwLmdldCh2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChzYW1wbGVyVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlRnVuYztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZXJUeXBlID09PSAnc2FtcGxlcjJEJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZ1bmMgPSAndGV4dHVyZTJEJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzYW1wbGVyVHlwZSA9PT0gJ3NhbXBsZXJDdWJlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZ1bmMgPSAndGV4dHVyZUN1YmUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUZ1bmMgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdfX2NvbnZlcnRUZXh0dXJlRnVuY3Rpb25Ub0VTMTogZG8gbm90IHN1cHBvcnQgJyArIHNhbXBsZXJUeXBlICsgJyB0eXBlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19vdXRFcnJvcihzcGxpdHRlZFNoYWRlckNvZGUsIGksIGVycm9yTWVzc2FnZSwgZW1iZWRFcnJvcnNJbk91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmVGdW5jICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0ZWRTaGFkZXJDb2RlW2ldID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2ldLnJlcGxhY2UocmVnVGV4dHVyZSwgYCQxJHt0ZXh0dXJlRnVuY30kMiR7ZXh0ZW5zaW9uU3RyfSQzYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0Jsb2NrRW5kID0gISFsaW5lLm1hdGNoKC9cXH0vKTtcbiAgICAgICAgICAgIGlmIChpc0Jsb2NrRW5kKSB7XG4gICAgICAgICAgICAgICAgYXJndW1lbnRTYW1wbGVyTWFwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogVGhpcyBtZXRob2QgZmluZHMgdW5pZm9ybSBkZWNsYXJhdGlvbnMgb2Ygc2FtcGxlciB0eXBlcyBpbiB0aGUgc2hhZGVyIGFuZFxuICAgICAqIGNyZWF0ZXMgYSBtYXAgd2l0aCB2YXJpYWJsZSBuYW1lcyBhcyBrZXlzIGFuZCB0eXBlcyBhcyB2YWx1ZXMuXG4gICAgICovXG4gICAgc3RhdGljIF9fY3JlYXRlVW5pZm9ybVNhbXBsZXJNYXAoc3BsaXR0ZWRTaGFkZXJDb2RlLCBlbWJlZEVycm9yc0luT3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1TYW1wbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0dGVkU2hhZGVyQ29kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXig/IVtcXC9dKVtcXHQgXSp1bmlmb3JtKltcXHQgXSooaGlnaHB8bWVkaXVtcHxsb3dwfClbXFx0IF0qKHNhbXBsZXJcXHcrKVtcXHQgXSsoXFx3KykvKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhbXBsZXJUeXBlID0gbWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtU2FtcGxlck1hcC5nZXQobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ19fY3JlYXRlVW5pZm9ybVNhbXBsZXJNYXA6IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX291dEVycm9yKHNwbGl0dGVkU2hhZGVyQ29kZSwgaSwgZXJyb3JNZXNzYWdlLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5pZm9ybVNhbXBsZXJNYXAuc2V0KG5hbWUsIHNhbXBsZXJUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pZm9ybVNhbXBsZXJNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogVGhpcyBtZXRob2QgZmluZHMgc2FtcGxlciB0eXBlcyBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgYW5kXG4gICAgICogY3JlYXRlcyBhIG1hcCB3aXRoIHZhcmlhYmxlIG5hbWVzIGFzIGtleXMgYW5kIHR5cGVzIGFzIHZhbHVlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgX19jcmVhdGVBcmd1bWVudFNhbXBsZXJNYXAoc3BsaXR0ZWRTaGFkZXJDb2RlLCBsaW5lSW5kZXgsIGVtYmVkRXJyb3JzSW5PdXRwdXQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgYXJndW1lbnRTYW1wbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gbGluZUluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvY2tTdGFydExpbmUgPSAhIWxpbmUubWF0Y2goL1xcey8pO1xuICAgICAgICAgICAgaWYgKCFpc0Jsb2NrU3RhcnRMaW5lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBicmFja2V0U2VjdGlvbkNvZGUgPSB0aGlzLl9fZ2V0QnJhY2tldFNlY3Rpb24oc3BsaXR0ZWRTaGFkZXJDb2RlLCBpKTtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyQnJhY2tldFNlY3Rpb25Db2RlID0gKF9hID0gYnJhY2tldFNlY3Rpb25Db2RlLm1hdGNoKC8uKlxcKCguKilcXCkvKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzFdO1xuICAgICAgICAgICAgaWYgKGlubmVyQnJhY2tldFNlY3Rpb25Db2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUNhbmRpZGF0ZXMgPSBpbm5lckJyYWNrZXRTZWN0aW9uQ29kZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgY29uc3Qgc2FtcGxlclR5cGVEZWZpbml0aW9uUmVnID0gL1tcXG5cXHQgXSooaGlnaHB8bWVkaXVtcHxsb3dwfClbXFxuXFx0IF0qKHNhbXBsZXJcXHcrKVtcXG5cXHQgXSooXFx3KylbXFxuXFx0IF0qLztcbiAgICAgICAgICAgIGNvbnN0IGlzRnVuY3Rpb25CcmFja2V0ID0gISEoKF9iID0gdmFyaWFibGVDYW5kaWRhdGVzWzBdLm1hdGNoKHNhbXBsZXJUeXBlRGVmaW5pdGlvblJlZykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHZhcmlhYmxlQ2FuZGlkYXRlc1swXS5tYXRjaCgvXltcXG5cXHQgXSokLykpO1xuICAgICAgICAgICAgaWYgKCFpc0Z1bmN0aW9uQnJhY2tldCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZUNhbmRpZGF0ZSBvZiB2YXJpYWJsZUNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzYW1wbGVyVmFyaWFibGVNYXRjaCA9IHZhcmlhYmxlQ2FuZGlkYXRlLm1hdGNoKHNhbXBsZXJUeXBlRGVmaW5pdGlvblJlZyk7XG4gICAgICAgICAgICAgICAgaWYgKHNhbXBsZXJWYXJpYWJsZU1hdGNoID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNhbXBsZXJUeXBlID0gc2FtcGxlclZhcmlhYmxlTWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNhbXBsZXJWYXJpYWJsZU1hdGNoWzNdO1xuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudFNhbXBsZXJNYXAuZ2V0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdfX2NyZWF0ZUFyZ3VtZW50U2FtcGxlck1hcDogZHVwbGljYXRlIHZhcmlhYmxlIG5hbWUnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fb3V0RXJyb3Ioc3BsaXR0ZWRTaGFkZXJDb2RlLCBpLCBlcnJvck1lc3NhZ2UsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmd1bWVudFNhbXBsZXJNYXAuc2V0KG5hbWUsIHNhbXBsZXJUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmd1bWVudFNhbXBsZXJNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcGFydCBlbmNsb3NlZCBpbiBicmFja2V0cyg9ICcoKScpLlxuICAgICAqIEZvciBleGFtcGxlLCB5b3UgY2FuIGdldCBsaW5lcyB0aGF0IGNvbnRhaW4gZnVuY3Rpb24gYXJndW1lbnRzLCBjb25kaXRpb25hbCBleHByZXNzaW9ucyBmb3IgaWYgc3RhdGVtZW50cywgZXRjLlxuICAgICAqL1xuICAgIHN0YXRpYyBfX2dldEJyYWNrZXRTZWN0aW9uKHNwbGl0dGVkU2hhZGVyQ29kZSwgYnJhY2tldEVuZEluZGV4KSB7XG4gICAgICAgIGxldCBicmFja2V0U3RhcnRJbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSBicmFja2V0RW5kSW5kZXg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2pdO1xuICAgICAgICAgICAgY29uc3QgaXNCcmFja2V0U3RhcnRNYXRjaCA9ICEhbGluZS5tYXRjaCgvXFwoLyk7XG4gICAgICAgICAgICBpZiAoaXNCcmFja2V0U3RhcnRNYXRjaCkge1xuICAgICAgICAgICAgICAgIGJyYWNrZXRTdGFydEluZGV4ID0gajtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGFpbkJyYWNrZXRDb2RlID0gJyc7XG4gICAgICAgIGZvciAobGV0IGogPSBicmFja2V0U3RhcnRJbmRleDsgaiA8PSBicmFja2V0RW5kSW5kZXg7IGorKykge1xuICAgICAgICAgICAgY29udGFpbkJyYWNrZXRDb2RlICs9IHNwbGl0dGVkU2hhZGVyQ29kZVtqXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbkJyYWNrZXRDb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEZpbmQgdGhlICdhdHRyaWJ1dGUnIHF1YWxpZmllciBpbiB0aGUgdmVydGV4IHNoYWRlciBjb2RlIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIEdMU0wgRVMzIHF1YWxpZmllcignaW4nKVxuICAgICAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydEF0dHJpYnV0ZShzcGxpdHRlZFNoYWRlckNvZGUsIGlzRnJhZ21lbnRTaGFkZXIpIHtcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRTaGFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWcgPSAvXig/IVtcXC9dKVtcXHQgXSphdHRyaWJ1dGVbXFx0IF0rL2c7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VTdHIgPSAnaW4gJztcbiAgICAgICAgdGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCByZXBsYWNlU3RyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBGaW5kIHRoZSAndmFyeWluZycgcXVhbGlmaWVyIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMyBxdWFsaWZpZXIoJ2luJyBvciAnb3V0JylcbiAgICAgKiBUaGlzIG1ldGhvZCBkaXJlY3RseSByZXBsYWNlIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BsaXR0ZWRTaGFkZXJDb2RlIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBfX2NvbnZlcnRWYXJ5aW5nKHNwbGl0dGVkU2hhZGVyQ29kZSwgaXNGcmFnbWVudFNoYWRlcikge1xuICAgICAgICBjb25zdCByZWcgPSAvXig/IVtcXC9dKVtcXHQgXSp2YXJ5aW5nW1xcdCBdKy9nO1xuICAgICAgICBjb25zdCByZXBsYWNlU3RyID0gaXNGcmFnbWVudFNoYWRlciA/ICdpbiAnIDogJ291dCAnO1xuICAgICAgICB0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsIHJlcGxhY2VTdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEZpbmQgdGhlICd0ZXh0dXJlQ3ViZScgbWV0aG9kIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMyBtZXRob2QoJ3RleHR1cmUnKVxuICAgICAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydFRleHR1cmVDdWJlKHNwbGl0dGVkU2hhZGVyQ29kZSkge1xuICAgICAgICBjb25zdCBzYmwgPSB0aGlzLl9fcmVnU3ltYm9scygpO1xuICAgICAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKGAoJHtzYmx9KykodGV4dHVyZUN1YmUpKCR7c2JsfSspYCwgJ2cnKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZVN0ciA9ICd0ZXh0dXJlJztcbiAgICAgICAgdGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCAnJDEnICsgcmVwbGFjZVN0ciArICckMycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEZpbmQgdGhlICd0ZXh0dXJlMkQnIG1ldGhvZCBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzMgbWV0aG9kKCd0ZXh0dXJlJylcbiAgICAgKiBUaGlzIG1ldGhvZCBkaXJlY3RseSByZXBsYWNlIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BsaXR0ZWRTaGFkZXJDb2RlIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyBfX2NvbnZlcnRUZXh0dXJlMkQoc3BsaXR0ZWRTaGFkZXJDb2RlKSB7XG4gICAgICAgIGNvbnN0IHNibCA9IHRoaXMuX19yZWdTeW1ib2xzKCk7XG4gICAgICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoYCgke3NibH0rKSh0ZXh0dXJlMkQpKCR7c2JsfSspYCwgJ2cnKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZVN0ciA9ICd0ZXh0dXJlJztcbiAgICAgICAgdGhpcy5fX3JlcGxhY2VMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnLCAnJDEnICsgcmVwbGFjZVN0ciArICckMycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEZpbmQgdGhlICd0ZXh0dXJlMkRQcm9qJyBtZXRob2QgaW4gdGhlIHNoYWRlciBjb2RlIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIEdMU0wgRVMzIG1ldGhvZCgndGV4dHVyZVByb2onKVxuICAgICAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydFRleHR1cmUyRFByb2Qoc3BsaXR0ZWRTaGFkZXJDb2RlKSB7XG4gICAgICAgIGNvbnN0IHNibCA9IHRoaXMuX19yZWdTeW1ib2xzKCk7XG4gICAgICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoYCgke3NibH0rKSh0ZXh0dXJlMkRQcm9qKSgke3NibH0rKWAsICdnJyk7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VTdHIgPSAndGV4dHVyZVByb2onO1xuICAgICAgICB0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsICckMScgKyByZXBsYWNlU3RyICsgJyQzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogRmluZCB0aGUgJ3RleHR1cmUzRCcgbWV0aG9kIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBHTFNMIEVTMyBtZXRob2QoJ3RleHR1cmUnKVxuICAgICAqIFRoaXMgbWV0aG9kIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGxpdHRlZFNoYWRlckNvZGUgdmFyaWFibGUuXG4gICAgICovXG4gICAgc3RhdGljIF9fY29udmVydFRleHR1cmUzRChzcGxpdHRlZFNoYWRlckNvZGUpIHtcbiAgICAgICAgY29uc3Qgc2JsID0gdGhpcy5fX3JlZ1N5bWJvbHMoKTtcbiAgICAgICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cChgKCR7c2JsfSspKHRleHR1cmUzRCkoJHtzYmx9KylgLCAnZycpO1xuICAgICAgICBjb25zdCByZXBsYWNlU3RyID0gJ3RleHR1cmUnO1xuICAgICAgICB0aGlzLl9fcmVwbGFjZUxpbmUoc3BsaXR0ZWRTaGFkZXJDb2RlLCByZWcsICckMScgKyByZXBsYWNlU3RyICsgJyQzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogRmluZCB0aGUgJ3RleHR1cmUzRFByb2onIG1ldGhvZCBpbiB0aGUgc2hhZGVyIGNvZGUgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgR0xTTCBFUzMgbWV0aG9kKCd0ZXh0dXJlUHJvaicpXG4gICAgICogVGhpcyBtZXRob2QgZGlyZWN0bHkgcmVwbGFjZSB0aGUgZWxlbWVudHMgb2YgdGhlIHNwbGl0dGVkU2hhZGVyQ29kZSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgX19jb252ZXJ0VGV4dHVyZTNEUHJvZChzcGxpdHRlZFNoYWRlckNvZGUpIHtcbiAgICAgICAgY29uc3Qgc2JsID0gdGhpcy5fX3JlZ1N5bWJvbHMoKTtcbiAgICAgICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cChgKCR7c2JsfSspKHRleHR1cmUzRFByb2opKCR7c2JsfSspYCwgJ2cnKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZVN0ciA9ICd0ZXh0dXJlUHJvaic7XG4gICAgICAgIHRoaXMuX19yZXBsYWNlTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZywgJyQxJyArIHJlcGxhY2VTdHIgKyAnJDMnKTtcbiAgICB9XG4gICAgc3RhdGljIF9fcmVnU3ltYm9scygpIHtcbiAgICAgICAgcmV0dXJuIGBbIVwiIyQlJicoKVxcKlxcK1xcLVxcLixcXC86Ozw9Pj9AXFxbXFxcXFxcXV5gICsgJ2B7fH1+XFx0XFxuIF0nO1xuICAgIH1cbiAgICBzdGF0aWMgX19yZXBsYWNlTGluZShzcGxpdHRlZFNoYWRlckNvZGUsIHJlZywgcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNwbGl0dGVkU2hhZGVyQ29kZVtpXSA9IHNwbGl0dGVkU2hhZGVyQ29kZVtpXS5yZXBsYWNlKHJlZywgcmVwbGFjZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBfX3JlbW92ZUZpcnN0TWF0Y2hpbmdMaW5lKHNwbGl0dGVkU2hhZGVyQ29kZSwgcmVnKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWRTaGFkZXJDb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc3BsaXR0ZWRTaGFkZXJDb2RlW2ldLm1hdGNoKHJlZykpIHtcbiAgICAgICAgICAgICAgICBzcGxpdHRlZFNoYWRlckNvZGUuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBfX291dEVycm9yKHNwbGl0dGVkU2hhZGVyQ29kZSwgbGluZUluZGV4LCBlcnJvck1lc3NhZ2UsIGVtYmVkRXJyb3JzSW5PdXRwdXQpIHtcbiAgICAgICAgaWYgKGVtYmVkRXJyb3JzSW5PdXRwdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYWRlck91dHB1dE1lc3NhZ2UgPSBgLy8gbGluZSAke2xpbmVJbmRleH06ICR7ZXJyb3JNZXNzYWdlfVxcbmA7XG4gICAgICAgICAgICBjb25zdCBjbG9zZUJyYWNrZXRSZWcgPSAvKC4qKVxcfVtcXG5cXHQgXSokLztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzcGxpdHRlZFNoYWRlckNvZGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gc3BsaXR0ZWRTaGFkZXJDb2RlW2ldO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lLm1hdGNoKGNsb3NlQnJhY2tldFJlZykpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFNoYWRlckNvZGVbaV0gPT09IHNoYWRlck91dHB1dE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIHNwbGl0dGVkU2hhZGVyQ29kZS5wdXNoKHNoYWRlck91dHB1dE1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTaGFkZXJUcmFuc2Zvcm1lcjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9tYWluL1NoYWRlcml0eS50c1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9tYWluL1NoYWRlcml0eS50cyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgUmVmbGVjdGlvbl8xID0gX19pbXBvcnREZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vUmVmbGVjdGlvbiAqLyBcIi4vc3JjL21haW4vUmVmbGVjdGlvbi50c1wiKSk7XG5jb25zdCBTaGFkZXJUcmFuc2Zvcm1lcl8xID0gX19pbXBvcnREZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vU2hhZGVyVHJhbnNmb3JtZXIgKi8gXCIuL3NyYy9tYWluL1NoYWRlclRyYW5zZm9ybWVyLnRzXCIpKTtcbmNvbnN0IFNoYWRlckVkaXRvcl8xID0gX19pbXBvcnREZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vU2hhZGVyRWRpdG9yICovIFwiLi9zcmMvbWFpbi9TaGFkZXJFZGl0b3IudHNcIikpO1xuY29uc3QgVXRpbGl0eV8xID0gX19pbXBvcnREZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vVXRpbGl0eSAqLyBcIi4vc3JjL21haW4vVXRpbGl0eS50c1wiKSk7XG5jb25zdCBTaGFkZXJpdHlPYmplY3RDcmVhdG9yXzEgPSBfX2ltcG9ydERlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9TaGFkZXJpdHlPYmplY3RDcmVhdG9yICovIFwiLi9zcmMvbWFpbi9TaGFkZXJpdHlPYmplY3RDcmVhdG9yLnRzXCIpKTtcbmNvbnN0IFByZVByb2Nlc3Nvcl8xID0gX19pbXBvcnREZWZhdWx0KF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vUHJlUHJvY2Vzc29yICovIFwiLi9zcmMvbWFpbi9QcmVQcm9jZXNzb3IudHNcIikpO1xuY2xhc3MgU2hhZGVyaXR5IHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBzaGFkZXIgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlIGEgR0xTTCBFUzMgc2hhZGVyIGNvZGUgdG8gYSBHTFNMIEVTMSBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSBvYmogU2hhZGVyaXR5IG9iamVjdCB0byB0cmFuc2xhdGUgdG8gZ2xzbCBlczFcbiAgICAgKiBAcGFyYW0gZW1iZWRFcnJvcnNJbk91dHB1dCBJZiB0cnVlLCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBjb252ZXJzaW9uLFxuICAgICAqICAgIHRoZSBlcnJvciBhbmQgdGhlIG51bWJlciBvZiBsaW5lcyBhcmUgb3V0cHV0IGF0IHRoZSBib3R0b20gb2YgdGhlIHJldHVyblxuICAgICAqICAgIHZhbHVlIFNoYWRlcml0eU9iamVjdC5jb2RlLiBJZiBmYWxzZSwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICogQHJldHVybnMgU2hhZGVyaXR5T2JqZWN0IHdob3NlIGNvZGUgcHJvcGVydHkgaXMgdGhlIHNoYWRlciBjb2RlIGZvciBHTFNMIEVTMVxuICAgICAqL1xuICAgIHN0YXRpYyB0cmFuc2Zvcm1Ub0dMU0xFUzEob2JqLCBlbWJlZEVycm9yc0luT3V0cHV0ID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc3BsaXR0ZWRTaGFkZXJDb2RlID0gVXRpbGl0eV8xLmRlZmF1bHQuX3NwbGl0QnlMaW5lRmVlZENvZGUob2JqLmNvZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNwbGl0dGVkU2hhZGVyQ29kZSA9IFNoYWRlclRyYW5zZm9ybWVyXzEuZGVmYXVsdC5fdHJhbnNmb3JtVG9HTFNMRVMxKHNwbGl0dGVkU2hhZGVyQ29kZSwgb2JqLmlzRnJhZ21lbnRTaGFkZXIsIGVtYmVkRXJyb3JzSW5PdXRwdXQpO1xuICAgICAgICBjb25zdCByZXN1bHRDb2RlID0gVXRpbGl0eV8xLmRlZmF1bHQuX2pvaW5TcGxpdHRlZExpbmUodHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGUpO1xuICAgICAgICBjb25zdCByZXN1bHRPYmogPSB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHRDb2RlLFxuICAgICAgICAgICAgc2hhZGVyU3RhZ2U6IG9iai5zaGFkZXJTdGFnZSxcbiAgICAgICAgICAgIGlzRnJhZ21lbnRTaGFkZXI6IG9iai5pc0ZyYWdtZW50U2hhZGVyLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0T2JqO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgYSBHTFNMIEVTMSBzaGFkZXIgY29kZSB0byBhIEdMU0wgRVMzIHNoYWRlciBjb2RlXG4gICAgICovXG4gICAgc3RhdGljIHRyYW5zZm9ybVRvR0xTTEVTMyhvYmopIHtcbiAgICAgICAgY29uc3Qgc3BsaXR0ZWRTaGFkZXJDb2RlID0gVXRpbGl0eV8xLmRlZmF1bHQuX3NwbGl0QnlMaW5lRmVlZENvZGUob2JqLmNvZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNwbGl0dGVkU2hhZGVyQ29kZSA9IFNoYWRlclRyYW5zZm9ybWVyXzEuZGVmYXVsdC5fdHJhbnNmb3JtVG9HTFNMRVMzKHNwbGl0dGVkU2hhZGVyQ29kZSwgb2JqLmlzRnJhZ21lbnRTaGFkZXIpO1xuICAgICAgICBjb25zdCByZXN1bHRDb2RlID0gVXRpbGl0eV8xLmRlZmF1bHQuX2pvaW5TcGxpdHRlZExpbmUodHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGUpO1xuICAgICAgICBjb25zdCByZXN1bHRPYmogPSB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHRDb2RlLFxuICAgICAgICAgICAgc2hhZGVyU3RhZ2U6IG9iai5zaGFkZXJTdGFnZSxcbiAgICAgICAgICAgIGlzRnJhZ21lbnRTaGFkZXI6IG9iai5pc0ZyYWdtZW50U2hhZGVyLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0T2JqO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgYSBHTFNMIHNoYWRlciBjb2RlIHRvIGEgc2hhZGVyIGNvZGUgb2Ygc3BlY2lmaWVkIEdMU0wgdmVyc2lvblxuICAgICAqL1xuICAgIHN0YXRpYyB0cmFuc2Zvcm1Ubyh2ZXJzaW9uLCBvYmosIGVtYmVkRXJyb3JzSW5PdXRwdXQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzcGxpdHRlZFNoYWRlckNvZGUgPSBVdGlsaXR5XzEuZGVmYXVsdC5fc3BsaXRCeUxpbmVGZWVkQ29kZShvYmouY29kZSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlID0gU2hhZGVyVHJhbnNmb3JtZXJfMS5kZWZhdWx0Ll90cmFuc2Zvcm1Ubyh2ZXJzaW9uLCBzcGxpdHRlZFNoYWRlckNvZGUsIG9iai5pc0ZyYWdtZW50U2hhZGVyLCBlbWJlZEVycm9yc0luT3V0cHV0KTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q29kZSA9IFV0aWxpdHlfMS5kZWZhdWx0Ll9qb2luU3BsaXR0ZWRMaW5lKHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0T2JqID0ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0Q29kZSxcbiAgICAgICAgICAgIHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG4gICAgICAgICAgICBpc0ZyYWdtZW50U2hhZGVyOiBvYmouaXNGcmFnbWVudFNoYWRlcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9iajtcbiAgICB9XG4gICAgc3RhdGljIHByb2Nlc3NQcmFnbWEob2JqKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IFV0aWxpdHlfMS5kZWZhdWx0Ll9zcGxpdEJ5TGluZUZlZWRDb2RlKG9iai5jb2RlKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTcGxpdHRlZFNoYWRlckNvZGUgPSBQcmVQcm9jZXNzb3JfMS5kZWZhdWx0LnByb2Nlc3Moc3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q29kZSA9IFV0aWxpdHlfMS5kZWZhdWx0Ll9qb2luU3BsaXR0ZWRMaW5lKHRyYW5zZm9ybWVkU3BsaXR0ZWRTaGFkZXJDb2RlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0T2JqID0ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0Q29kZSxcbiAgICAgICAgICAgIHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG4gICAgICAgICAgICBpc0ZyYWdtZW50U2hhZGVyOiBvYmouaXNGcmFnbWVudFNoYWRlcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9iajtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gc2hhZGVyaXR5IG9iamVjdCBjcmVhdGlvbiBmdW5jdGlvbnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UgdG8gY3JlYXRlIHNoYWRlcml0eSBvYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVNoYWRlcml0eU9iamVjdENyZWF0b3Ioc2hhZGVyU3RhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaGFkZXJpdHlPYmplY3RDcmVhdG9yXzEuZGVmYXVsdChzaGFkZXJTdGFnZSk7XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIHNoYWRlciBlZGl0IGZ1bmN0aW9uc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBwYXR0ZXJuIGluIHRoZSBzaGFkZXIgY29kZSBhbmQgcmVwbGFjZSBrZXkgdG8gdmFsdWVcbiAgICAgKiBAcGFyYW0gdGVtcGxhdGVPYmplY3QgQW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3RyaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50XG4gICAgICogVGhlIGtleSBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LiBJZiBhbiBvYmplY3QgaXMgdXNlZCBhcyB0aGUga2V5LFxuICAgICAqIHRoZSBrZXkgaW4gdGhlIHBhdHRlcm4gb2Ygc2hhZGVyQ29kZSBtdXN0IGFsc28gbWF0Y2ggdGhlIG9iamVjdC5cbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGVtcGxhdGVPYmplY3QgaXNcbiAgICAgICAge1xuICAgICAgICAgICAgc2FtcGxlIHtcbiAgICAgICAgICAgICAgICBzYW1wbGVBOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgKiB0aGVuIHRoZSBrZXkgaW4gYSBzaGFkZXIgY29kZSBpcyBzYW1wbGUuc2FtcGxlQS5cbiAgICAgKi9cbiAgICAvLyBUaGUgdGVtcGxhdGUgcGF0dGVybiBpc1x0Lyogc2hhZGVyaXR5OiBAe2tleX0gKi9cbiAgICBzdGF0aWMgZmlsbFRlbXBsYXRlKG9iaiwgYXJnKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSB0aGlzLl9fY29weVNoYWRlcml0eU9iamVjdChvYmopO1xuICAgICAgICBjb3B5LmNvZGUgPSBTaGFkZXJFZGl0b3JfMS5kZWZhdWx0Ll9maWxsVGVtcGxhdGUoY29weS5jb2RlLCBhcmcpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGRlZmluZSBkaXJlY3RpdmVcbiAgICAgKi9cbiAgICBzdGF0aWMgaW5zZXJ0RGVmaW5pdGlvbihvYmosIGRlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3QgY29weSA9IHRoaXMuX19jb3B5U2hhZGVyaXR5T2JqZWN0KG9iaik7XG4gICAgICAgIGNvbnN0IHNwbGl0dGVkU2hhZGVyQ29kZSA9IFV0aWxpdHlfMS5kZWZhdWx0Ll9zcGxpdEJ5TGluZUZlZWRDb2RlKG9iai5jb2RlKTtcbiAgICAgICAgU2hhZGVyRWRpdG9yXzEuZGVmYXVsdC5faW5zZXJ0RGVmaW5pdGlvbihzcGxpdHRlZFNoYWRlckNvZGUsIGRlZmluaXRpb24pO1xuICAgICAgICBjb3B5LmNvZGUgPSBVdGlsaXR5XzEuZGVmYXVsdC5fam9pblNwbGl0dGVkTGluZShzcGxpdHRlZFNoYWRlckNvZGUpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gcmVmbGVjdGlvbiBmdW5jdGlvbnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUsIHZhcnlpbmcsIGFuZCB1bmlmb3JtIGluZm9ybWF0aW9uIGZyb20gYSBzaGFkZXIgY29kZSBvZiB0aGUgc2hhZGVyaXR5LlxuICAgICAqIFRvIGdldCB0aGVzZSBpbmZvcm1hdGlvbiwgeW91IG5lZWQgdG8gY2FsbCByZWZsZWN0aW9uLnJlZmxlY3QgbWV0aG9kLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVSZWZsZWN0aW9uT2JqZWN0KG9iaikge1xuICAgICAgICBjb25zdCBzcGxpdHRlZFNoYWRlckNvZGUgPSBVdGlsaXR5XzEuZGVmYXVsdC5fc3BsaXRCeUxpbmVGZWVkQ29kZShvYmouY29kZSk7XG4gICAgICAgIGNvbnN0IHJlZmxlY3Rpb24gPSBuZXcgUmVmbGVjdGlvbl8xLmRlZmF1bHQoc3BsaXR0ZWRTaGFkZXJDb2RlLCBvYmouc2hhZGVyU3RhZ2UpO1xuICAgICAgICByZXR1cm4gcmVmbGVjdGlvbjtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gcHJpdmF0ZSBmdW5jdGlvbnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBzdGF0aWMgX19jb3B5U2hhZGVyaXR5T2JqZWN0KG9iaikge1xuICAgICAgICBjb25zdCBjb3BpZWRPYmogPSB7XG4gICAgICAgICAgICBjb2RlOiBvYmouY29kZSxcbiAgICAgICAgICAgIHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG4gICAgICAgICAgICBpc0ZyYWdtZW50U2hhZGVyOiBvYmouaXNGcmFnbWVudFNoYWRlcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGNvcGllZE9iajtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTaGFkZXJpdHk7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvbWFpbi9TaGFkZXJpdHlPYmplY3RDcmVhdG9yLnRzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9tYWluL1NoYWRlcml0eU9iamVjdENyZWF0b3IudHMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBVdGlsaXR5XzEgPSBfX2ltcG9ydERlZmF1bHQoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9VdGlsaXR5ICovIFwiLi9zcmMvbWFpbi9VdGlsaXR5LnRzXCIpKTtcbi8qKlxuICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgc2hhZGVyaXR5IG9iamVjdC5cbiAqL1xuY2xhc3MgU2hhZGVyaXR5T2JqZWN0Q3JlYXRvciB7XG4gICAgY29uc3RydWN0b3Ioc2hhZGVyU3RhZ2UpIHtcbiAgICAgICAgdGhpcy5fX2Z1bmN0aW9uSWRDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuX19kZWZpbmVEaXJlY3RpdmVOYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLl9fZXh0ZW5zaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLl9fZ2xvYmFsUHJlY2lzaW9uID0ge1xuICAgICAgICAgICAgaW50OiAnaGlnaHAnLFxuICAgICAgICAgICAgZmxvYXQ6ICdoaWdocCcsXG4gICAgICAgICAgICBzYW1wbGVyMkQ6ICdoaWdocCcsXG4gICAgICAgICAgICBzYW1wbGVyQ3ViZTogJ2hpZ2hwJyxcbiAgICAgICAgICAgIHNhbXBsZXIzRDogJ2hpZ2hwJyxcbiAgICAgICAgICAgIHNhbXBsZXIyREFycmF5OiAnaGlnaHAnLFxuICAgICAgICAgICAgaXNhbXBsZXIyRDogJ2hpZ2hwJyxcbiAgICAgICAgICAgIGlzYW1wbGVyQ3ViZTogJ2hpZ2hwJyxcbiAgICAgICAgICAgIGlzYW1wbGVyM0Q6ICdoaWdocCcsXG4gICAgICAgICAgICBpc2FtcGxlcjJEQXJyYXk6ICdoaWdocCcsXG4gICAgICAgICAgICB1c2FtcGxlcjJEOiAnaGlnaHAnLFxuICAgICAgICAgICAgdXNhbXBsZXJDdWJlOiAnaGlnaHAnLFxuICAgICAgICAgICAgdXNhbXBsZXIzRDogJ2hpZ2hwJyxcbiAgICAgICAgICAgIHVzYW1wbGVyMkRBcnJheTogJ2hpZ2hwJyxcbiAgICAgICAgICAgIHNhbXBsZXIyRFNoYWRvdzogJ2hpZ2hwJyxcbiAgICAgICAgICAgIHNhbXBsZXJDdWJlU2hhZG93OiAnaGlnaHAnLFxuICAgICAgICAgICAgc2FtcGxlcjJEQXJyYXlTaGFkb3c6ICdoaWdocCcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzID0gW107XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVzID0gW107IC8vIGZvciB2ZXJ0ZXggc2hhZGVyIG9ubHlcbiAgICAgICAgdGhpcy5fX3ZhcnlpbmdzID0gW107XG4gICAgICAgIHRoaXMuX191bmlmb3JtcyA9IFtdO1xuICAgICAgICB0aGlzLl9fdW5pZm9ybVN0cnVjdHMgPSBbXTtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzID0gW107XG4gICAgICAgIHRoaXMuX19mdW5jdGlvbnMgPSBbXTsgLy8gZmlyc3QgaW5kZXggcmVwcmVzZW50IGRlcGVuZGVuY3kgbGV2ZWxcbiAgICAgICAgdGhpcy5fX21haW5GdW5jdGlvbkNvZGUgPSAndm9pZCBtYWluKCkge30nO1xuICAgICAgICB0aGlzLl9fb3V0cHV0Q29sb3JWYXJpYWJsZU5hbWUgPSAncmVuZGVyVGFyZ2V0MCc7IC8vIGZvciBmcmFnbWVudCBzaGFkZXIgb25seVxuICAgICAgICB0aGlzLl9fc2hhZGVyU3RhZ2UgPSBzaGFkZXJTdGFnZTtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gYWRkIHBhcmFtZXRlcnMgZnVuY3Rpb25zXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgYWRkRGVmaW5lRGlyZWN0aXZlKGRlZmluZURpcmVjdGl2ZU5hbWUpIHtcbiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSB0aGlzLl9fZGVmaW5lRGlyZWN0aXZlTmFtZXMuc29tZShuYW1lID0+IG5hbWUgPT09IGRlZmluZURpcmVjdGl2ZU5hbWUpO1xuICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignYWRkRGVmaW5lRGlyZWN0aXZlOiB0aGlzIGRlZmluZSBkaXJlY3RpdmUgaXMgYWxyZWFkeSBzZXQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZGVmaW5lRGlyZWN0aXZlTmFtZXMucHVzaChkZWZpbmVEaXJlY3RpdmVOYW1lKTtcbiAgICB9XG4gICAgYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUsIGJlaGF2aW9yID0gJ2VuYWJsZScpIHtcbiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSB0aGlzLl9fZXh0ZW5zaW9ucy5zb21lKGV4dGVuc2lvbiA9PiBleHRlbnNpb24uZXh0ZW5zaW9uTmFtZSA9PT0gZXh0ZW5zaW9uTmFtZSk7XG4gICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdhZGRFeHRlbnNpb246IHRoaXMgZXh0ZW5zaW9uIGlzIGFscmVhZHkgc2V0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX2V4dGVuc2lvbnMucHVzaCh7XG4gICAgICAgICAgICBleHRlbnNpb25OYW1lLFxuICAgICAgICAgICAgYmVoYXZpb3JcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG9ubHkgZGVmaW5lIHR5cGVzXG4gICAgYWRkU3RydWN0RGVmaW5pdGlvbihzdHJ1Y3ROYW1lLCBtZW1iZXJPYmplY3RzKSB7XG4gICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gdGhpcy5fX3N0cnVjdERlZmluaXRpb25zLnNvbWUoc3RydWN0RGVmaW5pdGlvbiA9PiBzdHJ1Y3REZWZpbml0aW9uLnN0cnVjdE5hbWUgPT09IHN0cnVjdE5hbWUpO1xuICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGFkZFN0cnVjdERlZmluaXRpb246IGR1cGxpY2F0ZSBzdHJ1Y3QgdHlwZSBuYW1lICR7c3RydWN0TmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBzdHJ1Y3ROYW1lLFxuICAgICAgICAgICAgbWVtYmVyT2JqZWN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZEdsb2JhbENvbnN0YW50VmFsdWUodmFyaWFibGVOYW1lLCB0eXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMuc29tZShnbG9iYWxDb25zdGFudFZhbHVlID0+IGdsb2JhbENvbnN0YW50VmFsdWUudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGFkZEdsb2JhbENvbnN0YW50VmFsdWU6IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzVmFsaWRDb21wb25lbnROdW1iZXIgPSBVdGlsaXR5XzEuZGVmYXVsdC5faXNWYWxpZENvbXBvbmVudENvdW50KHR5cGUsIHZhbHVlcyk7XG4gICAgICAgIGlmICghaXNWYWxpZENvbXBvbmVudE51bWJlcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYWRkR2xvYmFsQ29uc3RhbnRWYWx1ZTogdGhlIGNvbXBvbmVudCBjb3VudCBvZiAke3ZhcmlhYmxlTmFtZX0gaXMgaW52YWxpZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzSW50VHlwZSA9IFV0aWxpdHlfMS5kZWZhdWx0Ll9pc0ludFR5cGUodHlwZSk7XG4gICAgICAgIGlmIChpc0ludFR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0Tm9uSW50ZWdlclZhbHVlID0gU2hhZGVyaXR5T2JqZWN0Q3JlYXRvci5fX2V4aXN0Tm9uSW50ZWdlclZhbHVlKHZhbHVlcyk7XG4gICAgICAgICAgICBpZiAoZXhpc3ROb25JbnRlZ2VyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGFkZEdsb2JhbENvbnN0YW50VmFsdWU6IG5vbi1pbnRlZ2VyIHZhbHVlIGlzIHNldCB0byAke3ZhcmlhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMucHVzaCh7XG4gICAgICAgICAgICB2YXJpYWJsZU5hbWUsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gbmVlZCB0byBkZWZpbmUgc3RydWN0IGJ5IHRoZSBhZGRTdHJ1Y3REZWZpbml0aW9uIG1ldGhvZFxuICAgIC8vIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0dXJlIGlzIGRlZmluZWQgYnkgdGhlIF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGUgbWV0aG9kXG4gICAgYWRkR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZShzdHJ1Y3ROYW1lLCB2YXJpYWJsZU5hbWUsIHZhbHVlcykge1xuICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IHRoaXMuX19nbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlcy5zb21lKHN0cnVjdFZhbHVlID0+IHN0cnVjdFZhbHVlLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBhZGRHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZXMucHVzaCh7XG4gICAgICAgICAgICB2YXJpYWJsZU5hbWUsXG4gICAgICAgICAgICBzdHJ1Y3ROYW1lLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl9fc2hhZGVyU3RhZ2UgIT09ICd2ZXJ0ZXgnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdhZGRBdHRyaWJ1dGU6IHRoaXMgbWV0aG9kIGlzIGZvciB2ZXJ0ZXggc2hhZGVyIG9ubHknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IHRoaXMuX19hdHRyaWJ1dGVzLnNvbWUoYXR0cmlidXRlID0+IGF0dHJpYnV0ZS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYWRkQXR0cmlidXRlOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fYXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwcmVjaXNpb246IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sXG4gICAgICAgICAgICBsb2NhdGlvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkVmFyeWluZ0RlY2xhcmF0aW9uKHZhcmlhYmxlTmFtZSwgdHlwZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IHRoaXMuX192YXJ5aW5ncy5zb21lKHZhcnlpbmcgPT4gdmFyeWluZy52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYWRkVmFyeWluZzogZHVwbGljYXRlIHZhcmlhYmxlIG5hbWUgJHt2YXJpYWJsZU5hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNJbnRUeXBlID0gVXRpbGl0eV8xLmRlZmF1bHQuX2lzSW50VHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IGludGVycG9sYXRpb25UeXBlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmludGVycG9sYXRpb25UeXBlO1xuICAgICAgICBpZiAoaXNJbnRUeXBlICYmIGludGVycG9sYXRpb25UeXBlICE9PSAnZmxhdCcpIHtcbiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYWRkVmFyeWluZzogdGhlIGludGVycG9sYXRpb25UeXBlIG11c3QgYmUgZmxhdCBmb3IgaW50ZWdlciB0eXBlc2ApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgYWRkVmFyeWluZzogc2V0IHRoZSBpbnRlcnBvbGF0aW9uVHlwZSBvZiBpbnRlZ2VyIHR5cGVzIHRvIGZsYXQgdG8gYXZvaWQgY29tcGlsYXRpb24gZXJyb3JgKTtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uVHlwZSA9ICdmbGF0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fdmFyeWluZ3MucHVzaCh7XG4gICAgICAgICAgICB2YXJpYWJsZU5hbWUsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJlY2lzaW9uLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvblR5cGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGRVbmlmb3JtRGVjbGFyYXRpb24odmFyaWFibGVOYW1lLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gdGhpcy5fX3VuaWZvcm1zLnNvbWUodW5pZm9ybSA9PiB1bmlmb3JtLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBhZGRVbmlmb3JtOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2Jvb2wnICYmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJlY2lzaW9uKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYGFkZFVuaWZvcm06IHJlbW92ZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiBwcmVjaXNpb24gZm9yIGJvb2wgdHlwZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcmApO1xuICAgICAgICAgICAgb3B0aW9ucy5wcmVjaXNpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX3VuaWZvcm1zLnB1c2goe1xuICAgICAgICAgICAgdmFyaWFibGVOYW1lLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHByZWNpc2lvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG5lZWQgdG8gZGVmaW5lIHN0cnVjdCBieSB0aGUgYWRkU3RydWN0RGVmaW5pdGlvbiBtZXRob2RcbiAgICBhZGRVbmlmb3JtU3RydWN0RGVjbGFyYXRpb24oc3RydWN0TmFtZSwgdmFyaWFibGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gdGhpcy5fX3VuaWZvcm1TdHJ1Y3RzLnNvbWUodW5pZm9ybVN0cnVjdCA9PiB1bmlmb3JtU3RydWN0LnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBhZGRVbmlmb3JtU3RydWN0RGVjbGFyYXRpb246IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX191bmlmb3JtU3RydWN0cy5wdXNoKHtcbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgIHN0cnVjdE5hbWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBmb3IgZXMzXG4gICAgYWRkVW5pZm9ybUJ1ZmZlck9iamVjdERlY2xhcmF0aW9uKGJsb2NrTmFtZSwgdmFyaWFibGVPYmplY3RzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlzRHVwbGljYXRlQmxvY2tOYW1lID0gdGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzLnNvbWUodWJvID0+IHViby5ibG9ja05hbWUgPT09IGJsb2NrTmFtZSk7XG4gICAgICAgIGlmIChpc0R1cGxpY2F0ZUJsb2NrTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYWRkVW5pZm9ybUJ1ZmZlck9iamVjdERlY2xhcmF0aW9uOiBkdXBsaWNhdGUgYmxvY2sgbmFtZSAke2Jsb2NrTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHVibyBvZiB0aGlzLl9fdW5pZm9ybUJ1ZmZlck9iamVjdHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdWJvVmFyaWFibGVPYmplY3Qgb2YgdWJvLnZhcmlhYmxlT2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFyaWFibGVPYmplY3Qgb2YgdmFyaWFibGVPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1Ym9WYXJpYWJsZU9iamVjdC52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlT2JqZWN0LnZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgYWRkVW5pZm9ybUJ1ZmZlck9iamVjdERlY2xhcmF0aW9uOiBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlT2JqZWN0LnZhcmlhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fdW5pZm9ybUJ1ZmZlck9iamVjdHMucHVzaCh7XG4gICAgICAgICAgICBibG9ja05hbWUsXG4gICAgICAgICAgICB2YXJpYWJsZU9iamVjdHMsXG4gICAgICAgICAgICBpbnN0YW5jZU5hbWU6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbnN0YW5jZU5hbWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyB0aGUgcmV0dXJuIHZhbHVlIElkIGlzIGEgdmFsdWUgdG8gZGVsZXRlIHRoZSBmdW5jdGlvblxuICAgIC8vIHRoZSBtYWluIGZ1bmN0aW9uIGlzIGRlZmluZWQgKHVwZGF0ZWQpIGJ5IHRoZSB1cGRhdGVNYWluRnVuY3Rpb24gbWV0aG9kXG4gICAgYWRkRnVuY3Rpb25EZWZpbml0aW9uKGZ1bmN0aW9uQ29kZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gdGhpcy5fX2Z1bmN0aW9uSWRDb3VudCsrO1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5TGV2ZWwgPSAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVwZW5kZW5jeUxldmVsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICB0aGlzLl9fZnVuY3Rpb25zW2RlcGVuZGVuY3lMZXZlbF0gPSAoX2IgPSB0aGlzLl9fZnVuY3Rpb25zW2RlcGVuZGVuY3lMZXZlbF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgICAgICB0aGlzLl9fZnVuY3Rpb25zW2RlcGVuZGVuY3lMZXZlbF0ucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbkNvZGUsXG4gICAgICAgICAgICBmdW5jdGlvbklkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb25JZDtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gdXBkYXRlIHBhcmFtZXRlcnMgZnVuY3Rpb25zXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdXBkYXRlR2xvYmFsUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX19nbG9iYWxQcmVjaXNpb24sIHByZWNpc2lvbik7XG4gICAgfVxuICAgIHVwZGF0ZVN0cnVjdERlZmluaXRpb24oc3RydWN0TmFtZSwgbWVtYmVyT2JqZWN0cykge1xuICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnMuZmluZEluZGV4KHN0cnVjdERlZmluaXRpb24gPT4gc3RydWN0RGVmaW5pdGlvbi5zdHJ1Y3ROYW1lID09PSBzdHJ1Y3ROYW1lKTtcbiAgICAgICAgaWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHVwZGF0ZVN0cnVjdERlZmluaXRpb246IHRoZSBzdHJ1Y3QgdHlwZSBuYW1lICR7c3RydWN0TmFtZX0gaXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX3N0cnVjdERlZmluaXRpb25zW21hdGNoZWRJbmRleF0ubWVtYmVyT2JqZWN0cyA9IG1lbWJlck9iamVjdHM7XG4gICAgfVxuICAgIHVwZGF0ZUdsb2JhbENvbnN0YW50VmFsdWUodmFyaWFibGVOYW1lLCB2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEluZGV4ID0gdGhpcy5fX2dsb2JhbENvbnN0YW50VmFsdWVzLmZpbmRJbmRleChnbG9iYWxDb25zdGFudFZhbHVlID0+IGdsb2JhbENvbnN0YW50VmFsdWUudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgICAgICBpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGB1cGRhdGVHbG9iYWxDb25zdGFudFZhbHVlOiB0aGUgdmFyaWFibGUgbmFtZSAke3ZhcmlhYmxlTmFtZX0gaXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuX19nbG9iYWxDb25zdGFudFZhbHVlc1ttYXRjaGVkSW5kZXhdLnR5cGU7XG4gICAgICAgIGNvbnN0IGlzVmFsaWRDb21wb25lbnROdW1iZXIgPSBVdGlsaXR5XzEuZGVmYXVsdC5faXNWYWxpZENvbXBvbmVudENvdW50KHR5cGUsIHZhbHVlcyk7XG4gICAgICAgIGlmICghaXNWYWxpZENvbXBvbmVudE51bWJlcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndXBkYXRlR2xvYmFsQ29uc3RhbnRWYWx1ZTogdGhlIGNvbXBvbmVudCBjb3VudCBpcyBpbnZhbGlkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNJbnRUeXBlID0gVXRpbGl0eV8xLmRlZmF1bHQuX2lzSW50VHlwZSh0eXBlKTtcbiAgICAgICAgaWYgKGlzSW50VHlwZSkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3ROb25JbnRlZ2VyVmFsdWUgPSBTaGFkZXJpdHlPYmplY3RDcmVhdG9yLl9fZXhpc3ROb25JbnRlZ2VyVmFsdWUodmFsdWVzKTtcbiAgICAgICAgICAgIGlmIChleGlzdE5vbkludGVnZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgdXBkYXRlR2xvYmFsQ29uc3RhbnRWYWx1ZTogdGhlICR7dmFyaWFibGVOYW1lfSBoYXMgYSBub24taW50ZWdlciB2YWx1ZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXNbbWF0Y2hlZEluZGV4XS52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgfVxuICAgIHVwZGF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWUodmFyaWFibGVOYW1lLCB2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEluZGV4ID0gdGhpcy5fX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzLmZpbmRJbmRleChzdHJ1Y3RWYWx1ZSA9PiBzdHJ1Y3RWYWx1ZS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgICAgIGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGB1cGRhdGVHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlOiAgdGhlIHZhcmlhYmxlIG5hbWUgJHt2YXJpYWJsZU5hbWV9IGlzIG5vdCBleGlzdGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19nbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlc1ttYXRjaGVkSW5kZXhdLnZhbHVlcyA9IHZhbHVlcztcbiAgICB9XG4gICAgdXBkYXRlTWFpbkZ1bmN0aW9uKG1haW5GdW5jdGlvbkNvZGVJbm5lcikge1xuICAgICAgICB0aGlzLl9fbWFpbkZ1bmN0aW9uQ29kZSA9IG1haW5GdW5jdGlvbkNvZGVJbm5lcjtcbiAgICB9XG4gICAgLy8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGNvbG9yIHZhcmlhYmxlIGZyb20gdGhlIG1haW4gZnVuY3Rpb24gaW4gdGhlIGZyYWdtZW50IHNoYWRlci5cbiAgICAvLyB1c2VycyBoYXZlIHRvIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGZyYWdtZW50IHNoYWRlciBjYWxjdWxhdGlvbiB0byB0aGlzIHZhcmlhYmxlLlxuICAgIHVwZGF0ZU91dHB1dENvbG9yVmFyaWFibGVOYW1lKG91dHB1dENvbG9yVmFyaWFibGVOYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9fc2hhZGVyU3RhZ2UgIT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VwZGF0ZU91dHB1dENvbG9yVmFyaWFibGVOYW1lOiB0aGlzIG1ldGhvZCBpcyBmb3IgZnJhZ21lbnQgc2hhZGVyIG9ubHknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0cHV0Q29sb3JWYXJpYWJsZU5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1cGRhdGVPdXRwdXRDb2xvclZhcmlhYmxlTmFtZTogaW52YWxpZCBvdXRDb2xvclZhcmlhYmxlTmFtZScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19vdXRwdXRDb2xvclZhcmlhYmxlTmFtZSA9IG91dHB1dENvbG9yVmFyaWFibGVOYW1lO1xuICAgIH1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyByZW1vdmUgcGFyYW1ldGVycyBmdW5jdGlvbnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICByZW1vdmVEZWZpbmVEaXJlY3RpdmUoZGVmaW5lRGlyZWN0aXZlTmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fZGVmaW5lRGlyZWN0aXZlTmFtZXMuaW5kZXhPZihkZWZpbmVEaXJlY3RpdmVOYW1lKTtcbiAgICAgICAgaWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybigncmVtb3ZlZERlZmluZURpcmVjdGl2ZTogdGhpcyBkZWZpbmUgZGlyZWN0aXZlIGlzIG5vdCBleGlzdCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19kZWZpbmVEaXJlY3RpdmVOYW1lcy5zcGxpY2UobWF0Y2hlZEluZGV4LCAxKTtcbiAgICB9XG4gICAgcmVtb3ZlRXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEluZGV4ID0gdGhpcy5fX2V4dGVuc2lvbnMuZmluZEluZGV4KGV4dGVuc2lvbiA9PiBleHRlbnNpb24uZXh0ZW5zaW9uTmFtZSA9PT0gZXh0ZW5zaW9uTmFtZSk7XG4gICAgICAgIGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3JlbW92ZUV4dGVuc2lvbjogdGhpcyBleHRlbnNpb24gaXMgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX2V4dGVuc2lvbnMuc3BsaWNlKG1hdGNoZWRJbmRleCwgMSk7XG4gICAgfVxuICAgIHJlbW92ZVN0cnVjdERlZmluaXRpb24oc3RydWN0TmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnMuZmluZEluZGV4KHN0cnVjdERlZmluaXRpb24gPT4gc3RydWN0RGVmaW5pdGlvbi5zdHJ1Y3ROYW1lID09PSBzdHJ1Y3ROYW1lKTtcbiAgICAgICAgaWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHJlbW92ZVN0cnVjdERlZmluaXRpb246IHRoZSBzdHJ1Y3QgdHlwZSBuYW1lICR7c3RydWN0TmFtZX0gaXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX3N0cnVjdERlZmluaXRpb25zLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuICAgIH1cbiAgICByZW1vdmVHbG9iYWxDb25zdGFudFZhbHVlKHZhcmlhYmxlTmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMuZmluZEluZGV4KGdsb2JhbENvbnN0YW50VmFsdWUgPT4gZ2xvYmFsQ29uc3RhbnRWYWx1ZS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgICAgIGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYHJlbW92ZUdsb2JhbENvbnN0YW50VmFsdWU6IHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMuc3BsaWNlKG1hdGNoZWRJbmRleCwgMSk7XG4gICAgfVxuICAgIHJlbW92ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWUodmFyaWFibGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRJbmRleCA9IHRoaXMuX19nbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlcy5maW5kSW5kZXgoc3RydWN0VmFsdWUgPT4gc3RydWN0VmFsdWUudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgICAgICBpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdXBkYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZTogIHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZXMuc3BsaWNlKG1hdGNoZWRJbmRleCwgMSk7XG4gICAgfVxuICAgIHJlbW92ZUF0dHJpYnV0ZURlY2xhcmF0aW9uKHZhcmlhYmxlTmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fYXR0cmlidXRlcy5maW5kSW5kZXgoYXR0cmlidXRlID0+IGF0dHJpYnV0ZS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgICAgIGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYHJlbW92ZUF0dHJpYnV0ZTogdGhlIHZhcmlhYmxlIG5hbWUgJHt2YXJpYWJsZU5hbWV9IGlzIG5vdCBleGlzdGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuICAgIH1cbiAgICByZW1vdmVWYXJ5aW5nRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRJbmRleCA9IHRoaXMuX192YXJ5aW5ncy5maW5kSW5kZXgodmFyeWluZyA9PiB2YXJ5aW5nLnZhcmlhYmxlTmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICAgICAgaWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgcmVtb3ZlVmFyeWluZzogdGhlIHZhcmlhYmxlIG5hbWUgJHt2YXJpYWJsZU5hbWV9IGlzIG5vdCBleGlzdGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX192YXJ5aW5ncy5zcGxpY2UobWF0Y2hlZEluZGV4LCAxKTtcbiAgICB9XG4gICAgcmVtb3ZlVW5pZm9ybURlY2xhcmF0aW9uKHZhcmlhYmxlTmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fdW5pZm9ybXMuZmluZEluZGV4KHVuaWZvcm0gPT4gdW5pZm9ybS52YXJpYWJsZU5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgICAgIGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYHJlbW92ZVVuaWZvcm06IHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fdW5pZm9ybXMuc3BsaWNlKG1hdGNoZWRJbmRleCwgMSk7XG4gICAgfVxuICAgIHJlbW92ZVVuaWZvcm1TdHJ1Y3REZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEluZGV4ID0gdGhpcy5fX3VuaWZvcm1TdHJ1Y3RzLmZpbmRJbmRleCh1bmlmb3JtU3RydWN0ID0+IHVuaWZvcm1TdHJ1Y3QudmFyaWFibGVOYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgICAgICBpZiAobWF0Y2hlZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGByZW1vdmVVbmlmb3JtU3RydWN0RGVjbGFyYXRpb246IHRoZSB2YXJpYWJsZSBuYW1lICR7dmFyaWFibGVOYW1lfSBpcyBub3QgZXhpc3RgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fdW5pZm9ybVN0cnVjdHMuc3BsaWNlKG1hdGNoZWRJbmRleCwgMSk7XG4gICAgfVxuICAgIHJlbW92ZVVuaWZvcm1CdWZmZXJPYmplY3REZWNsYXJhdGlvbihibG9ja05hbWUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEluZGV4ID0gdGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzLmZpbmRJbmRleCh1Ym8gPT4gdWJvLmJsb2NrTmFtZSA9PT0gYmxvY2tOYW1lKTtcbiAgICAgICAgaWYgKG1hdGNoZWRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgcmVtb3ZlVW5pZm9ybVN0cnVjdERlY2xhcmF0aW9uOiB0aGUgdmFyaWFibGUgbmFtZSAke2Jsb2NrTmFtZX0gaXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuICAgIH1cbiAgICByZW1vdmVGdW5jdGlvbkRlZmluaXRpb24oZnVuY3Rpb25JZCkge1xuICAgICAgICB0aGlzLl9fZmlsbEVtcHR5RnVuY3Rpb25zKCk7XG4gICAgICAgIC8vIGlkIGlzIHRvbyBzbWFsbCBvciB0b28gYmlnXG4gICAgICAgIGlmIChmdW5jdGlvbklkIDwgMCB8fCBmdW5jdGlvbklkID49IHRoaXMuX19mdW5jdGlvbklkQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybigncmVtb3ZlRnVuY3Rpb25EZWZpbml0aW9uOiBpbnZhbGlkIGZ1bmN0aW9uIGlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmdW5jdGlvbk9iamVjdHMgb2YgdGhpcy5fX2Z1bmN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEluZGV4ID0gZnVuY3Rpb25PYmplY3RzLmZpbmRJbmRleChmdW5jdGlvbk9iamVjdCA9PiBmdW5jdGlvbk9iamVjdC5mdW5jdGlvbklkID09PSBmdW5jdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25PYmplY3RzLnNwbGljZShtYXRjaGVkSW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oYHJlbW92ZUZ1bmN0aW9uRGVmaW5pdGlvbjogbm90IGZvdW5kIHRoZSBmdW5jdGlvbiBvZiBmdW5jdGlvbklkICR7ZnVuY3Rpb25JZH1gKTtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gY3JlYXRlIHNoYWRlcml0eSBvYmplY3QgZnVuY3Rpb25cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjcmVhdGVTaGFkZXJpdHlPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IHNoYWRlcml0eU9iaiA9IHtcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuX19jcmVhdGVTaGFkZXJDb2RlKCksXG4gICAgICAgICAgICBzaGFkZXJTdGFnZTogdGhpcy5fX3NoYWRlclN0YWdlLFxuICAgICAgICAgICAgaXNGcmFnbWVudFNoYWRlcjogdGhpcy5fX3NoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc2hhZGVyaXR5T2JqO1xuICAgIH1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBwcml2YXRlIG1ldGhvZHNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBzdGF0aWMgX19leGlzdE5vbkludGVnZXJWYWx1ZSh2YWx1ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRPRE86IGltcGxlbWVudCBzaGFkZXIgY29kZSBpbXBvcnQgZmVhdHVyZSAobG93IHByaW9yaXR5KVxuICAgIC8vIHB1YmxpYyBpbXBvcnRTaGFkZXJDb2RlKGNvZGU6IHN0cmluZykge31cbiAgICAvLyBuZWVkIHRvIGFwcGx5IFNoYWRlcml0eS50cmFuc2Zvcm1Ub0dMU0xFUzEsIHRyYW5zZm9ybVRvR0xTTEVTMyBvciB0cmFuc2Zvcm1UbyBtZXRob2RcbiAgICBfX2NyZWF0ZVNoYWRlckNvZGUoKSB7XG4gICAgICAgIHRoaXMuX19maWxsRW1wdHlGdW5jdGlvbnMoKTtcbiAgICAgICAgY29uc3QgY29kZSA9IGAjdmVyc2lvbiAzMDAgZXNcXG5cXG5gXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVEZWZpbmVEaXJlY3RpdmVTaGFkZXJDb2RlKClcbiAgICAgICAgICAgICsgdGhpcy5fX2NyZWF0ZUV4dGVuc2lvblNoYWRlckNvZGUoKVxuICAgICAgICAgICAgKyB0aGlzLl9fY3JlYXRlR2xvYmFsUHJlY2lzaW9uU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVTdHJ1Y3REZWZpbml0aW9uU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVHbG9iYWxDb25zdGFudFZhbHVlU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvblNoYWRlckNvZGUoKVxuICAgICAgICAgICAgKyB0aGlzLl9fY3JlYXRlVmFyeWluZ0RlY2xhcmF0aW9uU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVPdXRwdXRDb2xvckRlY2xhcmF0aW9uU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVVbmlmb3JtRGVjbGFyYXRpb25TaGFkZXJDb2RlKClcbiAgICAgICAgICAgICsgdGhpcy5fX2NyZWF0ZVVuaWZvcm1TdHJ1Y3REZWNsYXJhdGlvblNoYWRlckNvZGUoKVxuICAgICAgICAgICAgKyB0aGlzLl9fY3JlYXRlVW5pZm9ybUJ1ZmZlck9iamVjdFNoYWRlckNvZGUoKVxuICAgICAgICAgICAgKyB0aGlzLl9fY3JlYXRlRnVuY3Rpb25EZWZpbml0aW9uU2hhZGVyQ29kZSgpXG4gICAgICAgICAgICArIHRoaXMuX19jcmVhdGVNYWluRnVuY3Rpb25EZWZpbml0aW9uU2hhZGVyQ29kZSgpO1xuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG4gICAgX19maWxsRW1wdHlGdW5jdGlvbnMoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9fZnVuY3Rpb25zW2ldID0gKF9hID0gdGhpcy5fX2Z1bmN0aW9uc1tpXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19jcmVhdGVEZWZpbmVEaXJlY3RpdmVTaGFkZXJDb2RlKCkge1xuICAgICAgICBsZXQgc2hhZGVyQ29kZSA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGRlZmluZURpcmVjdGl2ZU5hbWUgb2YgdGhpcy5fX2RlZmluZURpcmVjdGl2ZU5hbWVzKSB7XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGAjZGVmaW5lICR7ZGVmaW5lRGlyZWN0aXZlTmFtZX1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVdGlsaXR5XzEuZGVmYXVsdC5fYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNoYWRlckNvZGUpO1xuICAgICAgICA7XG4gICAgfVxuICAgIF9fY3JlYXRlRXh0ZW5zaW9uU2hhZGVyQ29kZSgpIHtcbiAgICAgICAgbGV0IHNoYWRlckNvZGUgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgdGhpcy5fX2V4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gYCNleHRlbnNpb24gJHtleHRlbnNpb24uZXh0ZW5zaW9uTmFtZX06ICR7ZXh0ZW5zaW9uLmJlaGF2aW9yfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxpdHlfMS5kZWZhdWx0Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG4gICAgfVxuICAgIC8vVE9ETzogcmVtb3ZlIG5lZWRsZXNzIHByZWNpc2lvbnNcbiAgICBfX2NyZWF0ZUdsb2JhbFByZWNpc2lvblNoYWRlckNvZGUoKSB7XG4gICAgICAgIGxldCBzaGFkZXJDb2RlID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBpbiB0aGlzLl9fZ2xvYmFsUHJlY2lzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVjaXNpb25UeXBlID0gdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvblF1YWxpZmllciA9IHRoaXMuX19nbG9iYWxQcmVjaXNpb25bcHJlY2lzaW9uVHlwZV07XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGBwcmVjaXNpb24gJHtwcmVjaXNpb25RdWFsaWZpZXJ9ICR7cHJlY2lzaW9uVHlwZX07XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbGl0eV8xLmRlZmF1bHQuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcbiAgICB9XG4gICAgX19jcmVhdGVTdHJ1Y3REZWZpbml0aW9uU2hhZGVyQ29kZSgpIHtcbiAgICAgICAgbGV0IHNoYWRlckNvZGUgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBzdHJ1Y3REZWZpbml0aW9uIG9mIHRoaXMuX19zdHJ1Y3REZWZpbml0aW9ucykge1xuICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgc3RydWN0ICR7c3RydWN0RGVmaW5pdGlvbi5zdHJ1Y3ROYW1lfSB7XFxuYDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RydWN0RGVmaW5pdGlvbi5tZW1iZXJPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSBzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgICBgO1xuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5wcmVjaXNpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJDb2RlICs9IGAke3ZhcmlhYmxlLnByZWNpc2lvbn0gYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgJHt2YXJpYWJsZS50eXBlfSAke3ZhcmlhYmxlLm1lbWJlck5hbWV9O1xcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGB9O1xcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxpdHlfMS5kZWZhdWx0Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG4gICAgfVxuICAgIF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRWYWx1ZVNoYWRlckNvZGUoKSB7XG4gICAgICAgIGxldCBzaGFkZXJDb2RlID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgZ2xvYmFsQ29uc3RhbnRWYWx1ZSBvZiB0aGlzLl9fZ2xvYmFsQ29uc3RhbnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBnbG9iYWxDb25zdGFudFZhbHVlLnR5cGU7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBnbG9iYWxDb25zdGFudFZhbHVlLnZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2xvYmFsQ29uc3RhbnRWYWx1ZS52YWx1ZXM7XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGBjb25zdCAke3R5cGV9ICR7dmFyaWFibGVOYW1lfSA9ICR7dHlwZX0oYDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzaGFkZXJDb2RlICs9IHZhbHVlW2ldICsgJywgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoYWRlckNvZGUgPSBzaGFkZXJDb2RlLnJlcGxhY2UoLyxcXHMkLywgJyk7XFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxpdHlfMS5kZWZhdWx0Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG4gICAgfVxuICAgIF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGUoKSB7XG4gICAgICAgIGxldCBzaGFkZXJDb2RlID0gJyc7XG4gICAgICAgIGZvciAoY29uc3Qgc3RydWN0VmFsdWUgb2YgdGhpcy5fX2dsb2JhbENvbnN0YW50U3RydWN0VmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkSW5kZXggPSB0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnMuZmluZEluZGV4KGRlZmluaXRpb24gPT4gZGVmaW5pdGlvbi5zdHJ1Y3ROYW1lID09PSBzdHJ1Y3RWYWx1ZS5zdHJ1Y3ROYW1lKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgX19jcmVhdGVHbG9iYWxDb25zdGFudFN0cnVjdFZhbHVlU2hhZGVyQ29kZTogdGhlIHN0cnVjdCB0eXBlICR7c3RydWN0VmFsdWUuc3RydWN0TmFtZX0gaXMgbm90IGRlZmluZWRgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gYGNvbnN0ICR7c3RydWN0VmFsdWUuc3RydWN0TmFtZX0gJHtzdHJ1Y3RWYWx1ZS52YXJpYWJsZU5hbWV9ID0gJHtzdHJ1Y3RWYWx1ZS5zdHJ1Y3ROYW1lfSAoXFxuYDtcbiAgICAgICAgICAgIGNvbnN0IHN0cnVjdERlZmluaXRpb24gPSB0aGlzLl9fc3RydWN0RGVmaW5pdGlvbnNbbWF0Y2hlZEluZGV4XTtcbiAgICAgICAgICAgIGlmIChzdHJ1Y3REZWZpbml0aW9uLm1lbWJlck9iamVjdHMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdHJ1Y3RWYWx1ZS52YWx1ZXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYF9fY3JlYXRlR2xvYmFsQ29uc3RhbnRTdHJ1Y3RWYWx1ZVNoYWRlckNvZGU6IEludmFsaWQgbnVtYmVyIG9mIHZhcmlhYmxlcyB0aGF0ICR7c3RydWN0VmFsdWUudmFyaWFibGVOYW1lfSBoYXNgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc1NhbXBsZXJUeXBlID0gc3RydWN0RGVmaW5pdGlvbi5tZW1iZXJPYmplY3RzLnNvbWUobWVtYmVyT2JqZWN0ID0+IFV0aWxpdHlfMS5kZWZhdWx0Ll9pc1NhbXBsZXJUeXBlKG1lbWJlck9iamVjdC50eXBlKSk7XG4gICAgICAgICAgICBpZiAoaGFzU2FtcGxlclR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBfX2NyZWF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWVTaGFkZXJDb2RlOiBDb25zdGFudFN0cnVjdFZhbHVlICgke3N0cnVjdFZhbHVlLnZhcmlhYmxlTmFtZX0pIGNhbm5vdCBoYXZlIHNhbXBsZXIgdHlwZSBwYXJhbWV0ZXJgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RydWN0RGVmaW5pdGlvbi5tZW1iZXJPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lID0gc3RydWN0RGVmaW5pdGlvbi5tZW1iZXJPYmplY3RzW2ldLm1lbWJlck5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzdHJ1Y3RWYWx1ZS52YWx1ZXNbdmFyaWFibGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBfX2NyZWF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWVTaGFkZXJDb2RlOiAke3N0cnVjdFZhbHVlLnZhcmlhYmxlTmFtZX0gZG9lcyBub3QgaGF2ZSB0aGUgdmFsdWUgb2YgJHt2YXJpYWJsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gc3RydWN0RGVmaW5pdGlvbi5tZW1iZXJPYmplY3RzW2ldLnR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNWYWxpZENvbXBvbmVudE51bWJlciA9IFV0aWxpdHlfMS5kZWZhdWx0Ll9pc1ZhbGlkQ29tcG9uZW50Q291bnQodHlwZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZENvbXBvbmVudE51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBfX2NyZWF0ZUdsb2JhbENvbnN0YW50U3RydWN0VmFsdWVTaGFkZXJDb2RlOiB0aGUgY29tcG9uZW50IGNvdW50IG9mICR7dmFyaWFibGVOYW1lfSBpbiAke3N0cnVjdFZhbHVlLnZhcmlhYmxlTmFtZX0gaXMgaW52YWxpZGApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgICAke3R5cGV9KGA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJDb2RlICs9IHZhbHVlW2ldICsgJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2hhZGVyQ29kZSA9IHNoYWRlckNvZGUucmVwbGFjZSgvLFxccyQvLCAnKSxcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoYWRlckNvZGUgPSBzaGFkZXJDb2RlLnJlcGxhY2UoLyxcXG4kLywgJ1xcbik7XFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxpdHlfMS5kZWZhdWx0Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG4gICAgfVxuICAgIF9fY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25TaGFkZXJDb2RlKCkge1xuICAgICAgICBsZXQgc2hhZGVyQ29kZSA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiB0aGlzLl9fYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5sb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgbGF5b3V0IChsb2NhdGlvbiA9ICR7YXR0cmlidXRlLmxvY2F0aW9ufSkgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gYGluIGA7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlLnByZWNpc2lvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgJHthdHRyaWJ1dGUucHJlY2lzaW9ufSBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgJHthdHRyaWJ1dGUudHlwZX0gJHthdHRyaWJ1dGUudmFyaWFibGVOYW1lfTtcXG5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVdGlsaXR5XzEuZGVmYXVsdC5fYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNoYWRlckNvZGUpO1xuICAgIH1cbiAgICBfX2NyZWF0ZVZhcnlpbmdEZWNsYXJhdGlvblNoYWRlckNvZGUoKSB7XG4gICAgICAgIGxldCBzaGFkZXJDb2RlID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdmFyeWluZyBvZiB0aGlzLl9fdmFyeWluZ3MpIHtcbiAgICAgICAgICAgIGlmICh2YXJ5aW5nLmludGVycG9sYXRpb25UeXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzaGFkZXJDb2RlICs9IGAke3ZhcnlpbmcuaW50ZXJwb2xhdGlvblR5cGV9IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IHRoaXMuX19zaGFkZXJTdGFnZSA9PSAndmVydGV4JyA/IGBvdXQgYCA6IGBpbiBgO1xuICAgICAgICAgICAgaWYgKHZhcnlpbmcucHJlY2lzaW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzaGFkZXJDb2RlICs9IGAke3ZhcnlpbmcucHJlY2lzaW9ufSBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hhZGVyQ29kZSArPSBgJHt2YXJ5aW5nLnR5cGV9ICR7dmFyeWluZy52YXJpYWJsZU5hbWV9O1xcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFV0aWxpdHlfMS5kZWZhdWx0Ll9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc2hhZGVyQ29kZSk7XG4gICAgfVxuICAgIC8vVE9ETzogdHJhbnNsYXRlIHdoZW4gZ2xzbCBlczFcbiAgICBfX2NyZWF0ZU91dHB1dENvbG9yRGVjbGFyYXRpb25TaGFkZXJDb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5fX3NoYWRlclN0YWdlICE9PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgdmVjNCAke3RoaXMuX19vdXRwdXRDb2xvclZhcmlhYmxlTmFtZX07XFxuXFxuYDtcbiAgICB9XG4gICAgX19jcmVhdGVVbmlmb3JtRGVjbGFyYXRpb25TaGFkZXJDb2RlKCkge1xuICAgICAgICBsZXQgc2hhZGVyQ29kZSA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IHVuaWZvcm0gb2YgdGhpcy5fX3VuaWZvcm1zKSB7XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGB1bmlmb3JtIGA7XG4gICAgICAgICAgICBpZiAodW5pZm9ybS5wcmVjaXNpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gYCR7dW5pZm9ybS5wcmVjaXNpb259IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGAke3VuaWZvcm0udHlwZX0gJHt1bmlmb3JtLnZhcmlhYmxlTmFtZX07XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbGl0eV8xLmRlZmF1bHQuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcbiAgICB9XG4gICAgX19jcmVhdGVVbmlmb3JtU3RydWN0RGVjbGFyYXRpb25TaGFkZXJDb2RlKCkge1xuICAgICAgICBsZXQgc2hhZGVyQ29kZSA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IHVuaWZvcm1TdHJ1Y3Qgb2YgdGhpcy5fX3VuaWZvcm1TdHJ1Y3RzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJ1Y3ROYW1lID0gdW5pZm9ybVN0cnVjdC5zdHJ1Y3ROYW1lO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RTdHJ1Y3REZWZpbml0aW9uID0gdGhpcy5fX3N0cnVjdERlZmluaXRpb25zLnNvbWUoZGVmaW5pdGlvbiA9PiBkZWZpbml0aW9uLnN0cnVjdE5hbWUgPT09IHN0cnVjdE5hbWUpO1xuICAgICAgICAgICAgaWYgKCFleGlzdFN0cnVjdERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBfX2NyZWF0ZVVuaWZvcm1TdHJ1Y3REZWNsYXJhdGlvblNoYWRlckNvZGU6IHRoZSBzdHJ1Y3QgdHlwZSAke3N0cnVjdE5hbWV9IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGB1bmlmb3JtICR7c3RydWN0TmFtZX0gJHt1bmlmb3JtU3RydWN0LnZhcmlhYmxlTmFtZX07XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbGl0eV8xLmRlZmF1bHQuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcbiAgICB9XG4gICAgX19jcmVhdGVVbmlmb3JtQnVmZmVyT2JqZWN0U2hhZGVyQ29kZSgpIHtcbiAgICAgICAgbGV0IHNoYWRlckNvZGUgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCB1Ym8gb2YgdGhpcy5fX3VuaWZvcm1CdWZmZXJPYmplY3RzKSB7XG4gICAgICAgICAgICBzaGFkZXJDb2RlICs9IGBsYXlvdXQgKHN0ZDE0MCkgdW5pZm9ybSAke3Viby5ibG9ja05hbWV9IHtcXG5gO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1Ym8udmFyaWFibGVPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVPYmogPSB1Ym8udmFyaWFibGVPYmplY3RzW2ldO1xuICAgICAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gYCAgJHt2YXJpYWJsZU9iai50eXBlfSAke3ZhcmlhYmxlT2JqLnZhcmlhYmxlTmFtZX07XFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1Ym8uaW5zdGFuY2VOYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzaGFkZXJDb2RlICs9IGB9ICR7dWJvLmluc3RhbmNlTmFtZX07XFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gYH07XFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbGl0eV8xLmRlZmF1bHQuX2FkZExpbmVGZWVkQ29kZUlmTm90TnVsbFN0cmluZyhzaGFkZXJDb2RlKTtcbiAgICB9XG4gICAgX19jcmVhdGVGdW5jdGlvbkRlZmluaXRpb25TaGFkZXJDb2RlKCkge1xuICAgICAgICBsZXQgc2hhZGVyQ29kZSA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19mdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uT2JqZWN0cyA9IHRoaXMuX19mdW5jdGlvbnNbaV07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZ1bmN0aW9uT2JqZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHNoYWRlckNvZGUgKz0gZnVuY3Rpb25PYmplY3RzW2pdLmZ1bmN0aW9uQ29kZSArIGBcXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVdGlsaXR5XzEuZGVmYXVsdC5fYWRkTGluZUZlZWRDb2RlSWZOb3ROdWxsU3RyaW5nKHNoYWRlckNvZGUpO1xuICAgIH1cbiAgICBfX2NyZWF0ZU1haW5GdW5jdGlvbkRlZmluaXRpb25TaGFkZXJDb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX21haW5GdW5jdGlvbkNvZGUgKyBgXFxuYDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTaGFkZXJpdHlPYmplY3RDcmVhdG9yO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL21haW4vVXRpbGl0eS50c1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvbWFpbi9VdGlsaXR5LnRzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY2xhc3MgVXRpbGl0eSB7XG4gICAgc3RhdGljIF9zcGxpdEJ5TGluZUZlZWRDb2RlKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnNwbGl0KC9cXHJcXG58XFxuLyk7XG4gICAgfVxuICAgIHN0YXRpYyBfam9pblNwbGl0dGVkTGluZShzcGxpdHRlZExpbmUpIHtcbiAgICAgICAgcmV0dXJuIHNwbGl0dGVkTGluZS5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgc3RhdGljIF9hZGRMaW5lRmVlZENvZGVJZk5vdE51bGxTdHJpbmcoc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2UgPT09ICcnID8gc291cmNlIDogc291cmNlICsgJ1xcbic7XG4gICAgfVxuICAgIHN0YXRpYyBfY29tcG9uZW50TnVtYmVyKHR5cGUpIHtcbiAgICAgICAgbGV0IGNvbXBvbmVudE51bWJlcjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdmbG9hdCcgfHwgdHlwZSA9PT0gJ2ludCcgfHwgdHlwZSA9PT0gJ2Jvb2wnIHx8IHR5cGUgPT09ICd1aW50JyB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gJ3NhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ3NhbXBsZXJDdWJlJyB8fCB0eXBlID09PSAnc2FtcGxlcjNEJyB8fCB0eXBlID09PSAnc2FtcGxlcjJEQXJyYXknIHx8XG4gICAgICAgICAgICB0eXBlID09PSAnaXNhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ2lzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ2lzYW1wbGVyM0QnIHx8IHR5cGUgPT09ICdpc2FtcGxlcjJEQXJyYXknIHx8XG4gICAgICAgICAgICB0eXBlID09PSAndXNhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ3VzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ3VzYW1wbGVyM0QnIHx8IHR5cGUgPT09ICd1c2FtcGxlcjJEQXJyYXknIHx8XG4gICAgICAgICAgICB0eXBlID09PSAnc2FtcGxlcjJEU2hhZG93JyB8fCB0eXBlID09PSAnc2FtcGxlckN1YmVTaGFkb3cnIHx8IHR5cGUgPT09ICdzYW1wbGVyMkRBcnJheVNoYWRvdycpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudE51bWJlciA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3ZlYzInIHx8IHR5cGUgPT09ICdpdmVjMicgfHwgdHlwZSA9PT0gJ2J2ZWMyJyB8fCB0eXBlID09PSAndXZlYzInKSB7XG4gICAgICAgICAgICBjb21wb25lbnROdW1iZXIgPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICd2ZWMzJyB8fCB0eXBlID09PSAnaXZlYzMnIHx8IHR5cGUgPT09ICdidmVjMycgfHwgdHlwZSA9PT0gJ3V2ZWMzJykge1xuICAgICAgICAgICAgY29tcG9uZW50TnVtYmVyID0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAndmVjNCcgfHwgdHlwZSA9PT0gJ2l2ZWM0JyB8fCB0eXBlID09PSAnYnZlYzQnIHx8IHR5cGUgPT09ICd1dmVjNCcgfHwgdHlwZSA9PT0gJ21hdDInIHx8IHR5cGUgPT09ICdtYXQyeDInKSB7XG4gICAgICAgICAgICBjb21wb25lbnROdW1iZXIgPSA0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdtYXQyeDMnIHx8IHR5cGUgPT09ICdtYXQzeDInKSB7XG4gICAgICAgICAgICBjb21wb25lbnROdW1iZXIgPSA2O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdtYXQyeDQnIHx8IHR5cGUgPT09ICdtYXQ0eDInKSB7XG4gICAgICAgICAgICBjb21wb25lbnROdW1iZXIgPSA4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdtYXQzJyB8fCB0eXBlID09PSAnbWF0M3gzJykge1xuICAgICAgICAgICAgY29tcG9uZW50TnVtYmVyID0gOTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbWF0M3g0JyB8fCB0eXBlID09PSAnbWF0NHgzJykge1xuICAgICAgICAgICAgY29tcG9uZW50TnVtYmVyID0gMTI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ21hdDQnIHx8IHR5cGUgPT09ICdtYXQ0eDQnKSB7XG4gICAgICAgICAgICBjb21wb25lbnROdW1iZXIgPSAxNjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVua25vd24gdHlwZVxuICAgICAgICAgICAgY29tcG9uZW50TnVtYmVyID0gMDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1V0aWxpdHkuX2NvbXBvbmVudE51bWJlcjogZGV0ZWN0IHVua25vd24gdHlwZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnROdW1iZXI7XG4gICAgfVxuICAgIHN0YXRpYyBfaXNJbnRUeXBlKHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdpbnQnIHx8IHR5cGUgPT09ICdpdmVjMicgfHwgdHlwZSA9PT0gJ2l2ZWMzJyB8fCB0eXBlID09PSAnaXZlYzQnIHx8XG4gICAgICAgICAgICB0eXBlID09PSAndWludCcgfHwgdHlwZSA9PT0gJ3V2ZWMyJyB8fCB0eXBlID09PSAndXZlYzMnIHx8IHR5cGUgPT09ICd1dmVjNCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBfaXNWYWxpZENvbXBvbmVudENvdW50KHR5cGUsIHZhbHVlcykge1xuICAgICAgICBjb25zdCB2YWxpZENvbXBvbmVudENvdW50ID0gVXRpbGl0eS5fY29tcG9uZW50TnVtYmVyKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRDb21wb25lbnRDb3VudCA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgX2lzU2FtcGxlclR5cGUodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ3NhbXBsZXJDdWJlJyB8fCB0eXBlID09PSAnc2FtcGxlcjNEJyB8fCB0eXBlID09PSAnc2FtcGxlcjJEQXJyYXknIHx8XG4gICAgICAgICAgICB0eXBlID09PSAnaXNhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ2lzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ2lzYW1wbGVyM0QnIHx8IHR5cGUgPT09ICdpc2FtcGxlcjJEQXJyYXknIHx8XG4gICAgICAgICAgICB0eXBlID09PSAndXNhbXBsZXIyRCcgfHwgdHlwZSA9PT0gJ3VzYW1wbGVyQ3ViZScgfHwgdHlwZSA9PT0gJ3VzYW1wbGVyM0QnIHx8IHR5cGUgPT09ICd1c2FtcGxlcjJEQXJyYXknIHx8XG4gICAgICAgICAgICB0eXBlID09PSAnc2FtcGxlcjJEU2hhZG93JyB8fCB0eXBlID09PSAnc2FtcGxlckN1YmVTaGFkb3cnIHx8IHR5cGUgPT09ICdzYW1wbGVyMkRBcnJheVNoYWRvdycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gVXRpbGl0eTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluZGxZbkJoWTJzNkx5OHZkMlZpY0dGamF5OWliMjkwYzNSeVlYQWlMQ0ozWldKd1lXTnJPaTh2THk0dmMzSmpMMmx1WkdWNExuUnpJaXdpZDJWaWNHRmphem92THk4dUwzTnlZeTl0WVdsdUwxQnlaVkJ5YjJObGMzTnZjaTUwY3lJc0luZGxZbkJoWTJzNkx5OHZMaTl6Y21NdmJXRnBiaTlTWldac1pXTjBhVzl1TG5Seklpd2lkMlZpY0dGamF6b3ZMeTh1TDNOeVl5OXRZV2x1TDFOb1lXUmxja1ZrYVhSdmNpNTBjeUlzSW5kbFluQmhZMnM2THk4dkxpOXpjbU12YldGcGJpOVRhR0ZrWlhKVWNtRnVjMlp2Y20xbGNpNTBjeUlzSW5kbFluQmhZMnM2THk4dkxpOXpjbU12YldGcGJpOVRhR0ZrWlhKcGRIa3VkSE1pTENKM1pXSndZV05yT2k4dkx5NHZjM0pqTDIxaGFXNHZVMmhoWkdWeWFYUjVUMkpxWldOMFEzSmxZWFJ2Y2k1MGN5SXNJbmRsWW5CaFkyczZMeTh2TGk5emNtTXZiV0ZwYmk5VmRHbHNhWFI1TG5SeklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN08xRkJRVUU3VVVGRFFUczdVVUZGUVR0UlFVTkJPenRSUVVWQk8xRkJRMEU3VVVGRFFUdFJRVU5CTzFGQlEwRTdVVUZEUVR0UlFVTkJPMUZCUTBFN1VVRkRRVHRSUVVOQk96dFJRVVZCTzFGQlEwRTdPMUZCUlVFN1VVRkRRVHM3VVVGRlFUdFJRVU5CTzFGQlEwRTdPenRSUVVkQk8xRkJRMEU3TzFGQlJVRTdVVUZEUVRzN1VVRkZRVHRSUVVOQk8xRkJRMEU3VVVGRFFTd3dRMEZCTUVNc1owTkJRV2RETzFGQlF6RkZPMUZCUTBFN08xRkJSVUU3VVVGRFFUdFJRVU5CTzFGQlEwRXNkMFJCUVhkRUxHdENRVUZyUWp0UlFVTXhSVHRSUVVOQkxHbEVRVUZwUkN4alFVRmpPMUZCUXk5RU96dFJRVVZCTzFGQlEwRTdVVUZEUVR0UlFVTkJPMUZCUTBFN1VVRkRRVHRSUVVOQk8xRkJRMEU3VVVGRFFUdFJRVU5CTzFGQlEwRTdVVUZEUVN4NVEwRkJlVU1zYVVOQlFXbERPMUZCUXpGRkxHZElRVUZuU0N4dFFrRkJiVUlzUlVGQlJUdFJRVU55U1R0UlFVTkJPenRSUVVWQk8xRkJRMEU3VVVGRFFUdFJRVU5CTERKQ1FVRXlRaXd3UWtGQk1FSXNSVUZCUlR0UlFVTjJSQ3hwUTBGQmFVTXNaVUZCWlR0UlFVTm9SRHRSUVVOQk8xRkJRMEU3TzFGQlJVRTdVVUZEUVN4elJFRkJjMFFzSzBSQlFTdEVPenRSUVVWeVNEdFJRVU5CT3pzN1VVRkhRVHRSUVVOQk96czdPenM3T3pzN096czdPenM3T3pzN1FVTnNSa0VzTkVkQlFYbERPMEZCZVVWNlF5eHJRa0ZCWlN4dFFrRkJVenM3T3pzN096czdPenM3T3pzN08wRkRla1Y0UWl4TlFVRnhRaXhaUVVGWk8wbEJRM1JDTEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJkVUk3VVVGRGVrTXNUVUZCVFN4TlFVRk5MRWRCUVVjc2IwSkJRVzlDTEVOQlFVTTdVVUZEY0VNc1RVRkJUU3hMUVVGTExFZEJRVWNzYlVKQlFXMUNMRU5CUVVNN1VVRkRiRU1zVFVGQlRTeEpRVUZKTEVkQlFVY3NOa0pCUVRaQ0xFTkJRVU03VVVGRE0wTXNUVUZCVFN4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRE8xRkJRM1JDTEUxQlFVMHNTMEZCU3l4SFFVRkhMRkZCUVZFc1EwRkJRenRSUVVOMlFpeE5RVUZOTEdGQlFXRXNSMEZCWXl4RlFVRkZMRU5CUVVNN1VVRkRjRU1zU1VGQlNTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRPMUZCUTNKQ0xFMUJRVTBzVjBGQlZ5eEhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTnFReXhOUVVGTkxFMUJRVTBzUjBGQlpTeEZRVUZGTEVOQlFVTTdVVUZET1VJc1RVRkJUU3hYUVVGWExFZEJRV0VzUlVGQlJTeERRVUZETzFGQlJXcERMRXRCUVVzc1RVRkJUU3hKUVVGSkxFbEJRVWtzWVVGQllTeEZRVUZGTzFsQlF6bENMRWxCUVVrc1VVRkJVU3hIUVVGSExFdEJRVXNzUTBGQlF6dFpRVU55UWl4RlFVRkZMRlZCUVZVN1owSkJRMUlzVFVGQlRTeEZRVUZGTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dG5Ra0ZET1VJc1NVRkJTU3hGUVVGRkxFbEJRVWtzU1VGQlNTeEZRVUZGTzI5Q1FVTmFMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2IwSkJRM2hDTEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNN2FVSkJRMjVDTzJGQlEwbzdXVUZGUkN4SlFVRkpMR0ZCUVdFc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hUUVVGVE8yZENRVU5vUkN4TlFVRk5MRVZCUVVVc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMmRDUVVNM1FpeEpRVUZKTEVWQlFVVXNTVUZCU1N4SlFVRkpMRVZCUVVVN2IwSkJRMW9zWVVGQllTeERRVUZETEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJRenR2UWtGRE9VSXNUVUZCVFN4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzI5Q1FVTjZRaXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRE1VSXNTVUZCU1N4WFFVRlhMRU5CUVVNc1QwRkJUeXhEUVVGRExGVkJRVlVzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPM2RDUVVONFF5eFRRVUZUTEVkQlFVY3NTMEZCU3l4RFFVRkRPM0ZDUVVOeVFqdHZRa0ZEUkN4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRE8ybENRVU51UWp0aFFVTktPMWxCUlVRc1NVRkJTU3hoUVVGaExFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzVVVGQlVUdG5Ra0ZETDBNc1RVRkJUU3hGUVVGRkxFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRuUWtGRE5VSXNTVUZCU1N4RlFVRkZMRWxCUVVrc1NVRkJTU3hGUVVGRk8yOUNRVU5hTEUxQlFVMHNWVUZCVlN4SFFVRkhMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHZRa0ZEZWtJc1RVRkJUU3hoUVVGaExFZEJRVWNzVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU03YjBKQlEyaEVMRWxCUVVrc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF6dHZRa0ZEY0VJc1MwRkJTeXhOUVVGTkxGbEJRVmtzU1VGQlNTeGhRVUZoTEVWQlFVVTdkMEpCUTNSRExFbEJRVWtzVjBGQlZ5eERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJUczBRa0ZETVVNc1VVRkJVU3hIUVVGSExFdEJRVXNzUTBGQlF6dDVRa0ZEY0VJN2NVSkJRMG83YjBKQlEwUXNTVUZCU1N4UlFVRlJMRWxCUVVrc1YwRkJWeXhEUVVGRExFOUJRVThzUTBGQlF5eFZRVUZWTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHQzUWtGRGNFUXNVMEZCVXl4SFFVRkhMRWxCUVVrc1EwRkJRenR4UWtGRGNFSTdlVUpCUVUwN2QwSkJRMGdzVTBGQlV5eEhRVUZITEV0QlFVc3NRMEZCUXp0eFFrRkRja0k3YjBKQlEwUXNZVUZCWVN4RFFVRkRMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF6dHZRa0ZETDBJc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF6dHBRa0ZEYmtJN1lVRkRTanRaUVVWRUxFbEJRVWtzWVVGQllTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEZGQlFWRTdaMEpCUXk5RExFMUJRVTBzUlVGQlJTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03WjBKQlF6ZENMRWxCUVVrc1JVRkJSU3hKUVVGSkxFbEJRVWtzUlVGQlJUdHZRa0ZEV2l4TlFVRk5MR0ZCUVdFc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRGFFUXNTVUZCU1N4alFVRmpMRWRCUVVjc1NVRkJTU3hEUVVGRE8yOUNRVU14UWl4TFFVRkxMRTFCUVUwc1dVRkJXU3hKUVVGSkxHRkJRV0VzUlVGQlJUdDNRa0ZEZEVNc1NVRkJTU3hYUVVGWExFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRk96UkNRVU14UXl4alFVRmpMRWRCUVVjc1MwRkJTeXhEUVVGRE8zbENRVU14UWp0eFFrRkRTanR2UWtGRFJDeFRRVUZUTEVkQlFVY3NZMEZCWXl4RFFVRkRPMjlDUVVNelFpeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRPMmxDUVVOdVFqdGhRVU5LTzFsQlJVUXNSVUZCUlN4VFFVRlRPMmRDUVVOUUxFMUJRVTBzUlVGQlJTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03WjBKQlF6ZENMRWxCUVVrc1JVRkJSU3hKUVVGSkxFbEJRVWtzUlVGQlJUdHZRa0ZEV2l4SlFVRkpMR0ZCUVdFc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN2QwSkJRM0pETEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNN2NVSkJRM0JDTzI5Q1FVTkVMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU03YjBKQlEyaENMRTFCUVUwc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dHZRa0ZEWWl4aFFVRmhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03YVVKQlEzWkNPMkZCUTBvN1dVRkZSQ3hKUVVGSkxGTkJRVk1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUlR0blFrRkRlRUlzVjBGQlZ5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRoUVVNeFFqdFRRVU5LTzFGQlEwUXNUMEZCVHl4WFFVRlhMRU5CUVVNN1NVRkRka0lzUTBGQlF6dERRVU5LTzBGQk1VWkVMQ3RDUVRCR1F6czdPenM3T3pzN096czdPenM3TzBGRGFFWkVPenM3T3p0SFFVdEhPMEZCUTBnc1RVRkJjVUlzVlVGQlZUdEpRV2RDT1VJc1dVRkJXU3d5UWtGQmNVTXNSVUZCUlN4WFFVRXlRanRSUVZSMFJTdzBRa0ZCZFVJc1IwRkJSeXhKUVVGSkxFZEJRVWNzUlVGQmEwSXNRMEZCUXp0UlFVTndSQ3d3UWtGQmNVSXNSMEZCUnl4SlFVRkpMRWRCUVVjc1JVRkJhMElzUTBGQlF6dFJRVU5zUkN4cFFrRkJXU3hIUVVFd1FpeEZRVUZGTEVOQlFVTTdVVUZEZWtNc1pVRkJWU3hIUVVGM1FpeEZRVUZGTEVOQlFVTTdVVUZEY2tNc1pVRkJWU3hIUVVGM1FpeEZRVUZGTEVOQlFVTTdVVUZOTlVNc1NVRkJTU3hEUVVGRExHOUNRVUZ2UWl4SFFVRkhMREpDUVVFeVFpeERRVUZETzFGQlEzaEVMRWxCUVVrc1EwRkJReXhoUVVGaExFZEJRVWNzVjBGQlZ5eERRVUZETzFGQlEycERMRWxCUVVrc1EwRkJReXd5UTBGQk1rTXNSVUZCUlN4RFFVRkRPMGxCUTNCRUxFTkJRVU03U1VGRlJEczdPenRQUVVsSE8wbEJRMGdzU1VGQlZ5eFZRVUZWTzFGQlEzQkNMRTlCUVU4c1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF6dEpRVU14UWl4RFFVRkRPMGxCUlVRN096czdUMEZKUnp0SlFVTklMRWxCUVZjc1VVRkJVVHRSUVVOc1FpeFBRVUZQTEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNN1NVRkRlRUlzUTBGQlF6dEpRVVZFT3pzN08wOUJTVWM3U1VGRFNDeEpRVUZYTEZGQlFWRTdVVUZEYkVJc1QwRkJUeXhKUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETzBsQlEzaENMRU5CUVVNN1NVRkZSRHM3T3p0UFFVbEhPMGxCUTBnc1NVRkJWeXhsUVVGbE8xRkJRM3BDTEU5QlFVOHNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eFRRVUZUTEVWQlFVVXNSVUZCUlN4SFFVRkZMRTlCUVU4c1UwRkJVeXhEUVVGRExFbEJRVWtzUjBGQlF5eERRVUZETEVOQlFVTTdTVUZEZEVVc1EwRkJRenRKUVVWRU96czdPMDlCU1VjN1NVRkRTQ3hKUVVGWExHMUNRVUZ0UWp0UlFVTTNRaXhQUVVGUExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1UwRkJVeXhGUVVGRkxFVkJRVVVzUjBGQlJTeFBRVUZQTEZOQlFWTXNRMEZCUXl4UlFVRlJMRWRCUVVNc1EwRkJReXhEUVVGRE8wbEJRekZGTEVOQlFVTTdTVUZGUkRzN096dFBRVWxITzBsQlEwZ3NTVUZCVnl4bFFVRmxPMUZCUTNwQ0xFOUJRVThzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhUUVVGVExFVkJRVVVzUlVGQlJTeEhRVUZGTEU5QlFVOHNVMEZCVXl4RFFVRkRMRWxCUVVrc1IwRkJReXhEUVVGRExFTkJRVU03U1VGRGRFVXNRMEZCUXp0SlFVVkVPenM3TzA5QlNVYzdTVUZEU1N4M1FrRkJkMElzUTBGQlF5eEhRVUYzUWp0UlFVTjJSQ3hKUVVGSkxFTkJRVU1zZFVKQlFYVkNMRWRCUVVjc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4MVFrRkJkVUlzUlVGQlJTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRia1lzUTBGQlF6dEpRVVZFT3pzN08wOUJTVWM3U1VGRFNTeHpRa0ZCYzBJc1EwRkJReXhIUVVGM1FqdFJRVU55UkN4SlFVRkpMRU5CUVVNc2NVSkJRWEZDTEVkQlFVY3NTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eHhRa0ZCY1VJc1JVRkJSU3hIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdTVUZETDBVc1EwRkJRenRKUVVWRU96czdPMDlCU1VjN1NVRkRTU3h4UWtGQmNVSXNRMEZCUXl4SFFVRlhMRVZCUVVVc1MwRkJZVHRSUVVOMFJDeEpRVUZKTEVOQlFVTXNkVUpCUVhWQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVNNVF5eERRVUZETzBsQlJVUTdPenM3VDBGSlJ6dEpRVU5KTEcxQ1FVRnRRaXhEUVVGRExFZEJRVmNzUlVGQlJTeExRVUZoTzFGQlEzQkVMRWxCUVVrc1EwRkJReXh4UWtGQmNVSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzBsQlF6VkRMRU5CUVVNN1NVRkZSRHM3VDBGRlJ6dEpRVU5KTEhWQ1FVRjFRanRSUVVNM1FpeEpRVUZKTEVOQlFVTXNkVUpCUVhWQ0xFZEJRVWNzU1VGQlNTeEhRVUZITEVWQlFXdENMRU5CUVVNN1NVRkRNVVFzUTBGQlF6dEpRVVZFT3p0UFFVVkhPMGxCUTBrc2NVSkJRWEZDTzFGQlF6TkNMRWxCUVVrc1EwRkJReXh4UWtGQmNVSXNSMEZCUnl4SlFVRkpMRWRCUVVjc1JVRkJhMElzUTBGQlF6dEpRVU40UkN4RFFVRkRPMGxCUlVRN096czdPenM3TzA5QlVVYzdTVUZEU1N4UFFVRlBPMUZCUTJJc1RVRkJUU3hyUWtGQmEwSXNSMEZCUnl4SlFVRkpMRU5CUVVNc2IwSkJRVzlDTEVOQlFVTTdVVUZEY2tRc1RVRkJUU3hYUVVGWExFZEJRVWNzU1VGQlNTeERRVUZETEdGQlFXRXNRMEZCUXp0UlFVVjJReXhMUVVGTExFMUJRVTBzWTBGQll5eEpRVUZKTEd0Q1FVRnJRaXhGUVVGRk8xbEJRMmhFTEUxQlFVMHNaVUZCWlN4SFFVRkhMRWxCUVVrc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4alFVRmpMRVZCUVVVc1YwRkJWeXhEUVVGRExFTkJRVU03V1VGRE0wVXNTVUZCU1N4bFFVRmxMRVZCUVVVN1owSkJRM0JDTEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1kwRkJZeXhEUVVGRExFTkJRVU03WjBKQlEzQkRMRk5CUVZNN1lVRkRWRHRaUVVWRUxFMUJRVTBzWVVGQllTeEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1kwRkJZeXhGUVVGRkxGZEJRVmNzUTBGQlF5eERRVUZETzFsQlEzWkZMRWxCUVVrc1lVRkJZU3hGUVVGRk8yZENRVU5zUWl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHTkJRV01zUlVGQlJTeFhRVUZYTEVOQlFVTXNRMEZCUXp0blFrRkRMME1zVTBGQlV6dGhRVU5VTzFsQlJVUXNUVUZCVFN4aFFVRmhMRWRCUVVjc1kwRkJZeXhEUVVGRExFdEJRVXNzUTBGQlF5dzRRa0ZCT0VJc1EwRkJReXhEUVVGRE8xbEJRek5GTEVsQlFVa3NZVUZCWVN4RlFVRkZPMmRDUVVOc1FpeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMR05CUVdNc1EwRkJReXhEUVVGRE8yZENRVU5zUXl4VFFVRlRPMkZCUTFRN1UwRkRSRHRKUVVOR0xFTkJRVU03U1VGRlR5d3lRMEZCTWtNN1VVRkRiRVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFZRVUZWTEVWQlFVVXNWVUZCVlN4RFFVRkRMRU5CUVVNN1VVRkRla1FzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNN1VVRkRkRVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFZRVUZWTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNN1VVRkRlRVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFhRVUZYTEVWQlFVVXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkROVVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eGhRVUZoTEVWQlFVVXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkRPVVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eGhRVUZoTEVWQlFVVXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkRPVVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eGhRVUZoTEVWQlFVVXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkRPVVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVWQlFVVXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkRja1FzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFRRVUZUTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNN1VVRkRka1FzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVWQlFVVXNWVUZCVlN4RFFVRkRMRU5CUVVNN1VVRkRka1FzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFBRVUZQTEVWQlFVVXNWVUZCVlN4RFFVRkRMRU5CUVVNN1VVRkRkRVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFZRVUZWTEVWQlFVVXNWVUZCVlN4RFFVRkRMRU5CUVVNN1VVRkRla1FzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFRRVUZUTEVWQlFVVXNWVUZCVlN4RFFVRkRMRU5CUVVNN1VVRkRlRVFzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFRRVUZUTEVWQlFVVXNWMEZCVnl4RFFVRkRMRU5CUVVNN1VVRkRla1FzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFhRVUZYTEVWQlFVVXNWMEZCVnl4RFFVRkRMRU5CUVVNN1VVRkZNMFFzU1VGQlNTeERRVUZETEhGQ1FVRnhRaXhEUVVGRExFZEJRVWNzUTBGQlF5eGhRVUZoTEVWQlFVVXNZVUZCWVN4RFFVRkRMRU5CUVVNN1VVRkROMFFzU1VGQlNTeERRVUZETEhGQ1FVRnhRaXhEUVVGRExFZEJRVWNzUTBGQlF5eGpRVUZqTEVWQlFVVXNZMEZCWXl4RFFVRkRMRU5CUVVNN1VVRkRMMFFzU1VGQlNTeERRVUZETEhGQ1FVRnhRaXhEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVWQlFVVXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkRNMFFzU1VGQlNTeERRVUZETEhGQ1FVRnhRaXhEUVVGRExFZEJRVWNzUTBGQlF5eHJRa0ZCYTBJc1JVRkJSU3hyUWtGQmEwSXNRMEZCUXl4RFFVRkRPMUZCUTNaRkxFbEJRVWtzUTBGQlF5eHhRa0ZCY1VJc1EwRkJReXhIUVVGSExFTkJRVU1zYVVKQlFXbENMRVZCUVVVc2FVSkJRV2xDTEVOQlFVTXNRMEZCUXp0SlFVTjBSU3hEUVVGRE8wbEJSVThzWjBKQlFXZENMRU5CUVVNc1kwRkJjMElzUlVGQlJTeFhRVUV5UWp0UlFVTXpSU3hKUVVGSkxGZEJRVmNzUzBGQlN5eFJRVUZSTEVWQlFVVTdXVUZETjBJc1QwRkJUeXhMUVVGTExFTkJRVU03VTBGRFlqdFJRVU5FTEU5QlFVOHNZMEZCWXl4RFFVRkRMRXRCUVVzc1EwRkJReXgzUTBGQmQwTXNRMEZCUXl4RFFVRkRPMGxCUTNaRkxFTkJRVU03U1VGRlR5eGpRVUZqTEVOQlFVTXNZMEZCYzBJN1VVRkROVU1zVFVGQlRTeHRRa0ZCYlVJc1IwRkJkMEk3V1VGRGFFUXNTVUZCU1N4RlFVRkZMRVZCUVVVN1dVRkRVaXhKUVVGSkxFVkJRVVVzVDBGQlR6dFpRVU5pTEZGQlFWRXNSVUZCUlN4VFFVRlRPMU5CUTI1Q0xFTkJRVU03VVVGRlJpeE5RVUZOTEZOQlFWTXNSMEZCUnl4alFVRmpMRU5CUVVNc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5dzJRa0ZCTmtJc1EwRkJReXhEUVVGRE8xRkJRMnBHTEVsQlFVa3NVMEZCVXl4RlFVRkZPMWxCUTJRc1RVRkJUU3hKUVVGSkxFZEJRVWNzVTBGQlV5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUXpGQ0xHMUNRVUZ0UWl4RFFVRkRMRWxCUVVrc1IwRkJSeXhKUVVGbExFTkJRVU03V1VGRE0wTXNUVUZCVFN4SlFVRkpMRWRCUVVjc1UwRkJVeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlF6RkNMRzFDUVVGdFFpeERRVUZETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNN1dVRkZhRU1zVFVGQlRTeGhRVUZoTEVkQlFVY3NZMEZCWXl4RFFVRkRMRXRCUVVzc1EwRkJReXhWUVVGVkxFTkJRVU1zWTBGQll5eERRVUZETzFsQlEzSkZMRWxCUVVrc1lVRkJZU3hGUVVGRk8yZENRVU5zUWl4dFFrRkJiVUlzUTBGQlF5eFJRVUZSTEVkQlFVY3NZVUZCWVN4RFFVRkRMRU5CUVVNc1EwRkJkVUlzUTBGQlF6dGhRVU4wUlR0cFFrRkJUVHRuUWtGRFRpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRVZCUVVVc1MwRkJTeXhEUVVGRExFbEJRVWtzU1VGQlNTeERRVUZETEhWQ1FVRjFRaXhGUVVGRk8yOUNRVU4wUkN4SlFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeE5RVUZOTEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVVU3ZDBKQlEzSkRMRzFDUVVGdFFpeERRVUZETEZGQlFWRXNSMEZCUnl4TFFVRXlRaXhEUVVGRE8zRkNRVU16UkR0cFFrRkRSRHRoUVVORU8xTkJRMFE3VVVGRFJDeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4RFFVRkRPMGxCUXpkRExFTkJRVU03U1VGRlR5eGpRVUZqTEVOQlFVTXNZMEZCYzBJc1JVRkJSU3hYUVVFeVFqdFJRVU42UlN4SlFVRkpMRmRCUVZjc1MwRkJTeXhSUVVGUkxFVkJRVVU3V1VGRE4wSXNUMEZCVHl4alFVRmpMRU5CUVVNc1MwRkJTeXhEUVVGRExIVkRRVUYxUXl4RFFVRkRMRU5CUVVNN1UwRkRja1U3WVVGQlRUdFpRVU5PTEU5QlFVOHNZMEZCWXl4RFFVRkRMRXRCUVVzc1EwRkJReXh6UTBGQmMwTXNRMEZCUXl4RFFVRkRPMU5CUTNCRk8wbEJRMFlzUTBGQlF6dEpRVVZQTEZsQlFWa3NRMEZCUXl4alFVRnpRaXhGUVVGRkxGZEJRVEpDTzFGQlEzWkZMRTFCUVUwc2FVSkJRV2xDTEVkQlFYTkNPMWxCUXpWRExFbEJRVWtzUlVGQlJTeEZRVUZGTzFsQlExSXNTVUZCU1N4RlFVRkZMRTlCUVU4N1dVRkRZaXhMUVVGTExFVkJRVVVzU1VGQlNUdFRRVU5ZTEVOQlFVTTdVVUZGUml4TlFVRk5MRk5CUVZNc1IwRkJSeXhqUVVGakxFTkJRVU1zUzBGQlN5eERRVUZETEZWQlFWVXNRMEZCUXl3MlFrRkJOa0lzUTBGQlF5eERRVUZETzFGQlEycEdMRWxCUVVrc1UwRkJVeXhGUVVGRk8xbEJRMlFzVFVGQlRTeEpRVUZKTEVkQlFVY3NVMEZCVXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRekZDTEdsQ1FVRnBRaXhEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZsTEVOQlFVTTdXVUZEZWtNc1RVRkJUU3hKUVVGSkxFZEJRVWNzVTBGQlV5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUXpGQ0xHbENRVUZwUWl4RFFVRkRMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU03V1VGRE9VSXNhVUpCUVdsQ0xFTkJRVU1zUzBGQlN5eEhRVUZITEVOQlFVTXNWMEZCVnl4TFFVRkxMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJRenRUUVVOd1JUdFJRVU5FTEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRU5CUVVNN1NVRkRla01zUTBGQlF6dEpRVVZQTEZsQlFWa3NRMEZCUXl4alFVRnpRanRSUVVNeFF5eE5RVUZOTEdsQ1FVRnBRaXhIUVVGelFqdFpRVU0xUXl4SlFVRkpMRVZCUVVVc1JVRkJSVHRaUVVOU0xFbEJRVWtzUlVGQlJTeFBRVUZQTzFsQlEySXNVVUZCVVN4RlFVRkZMRk5CUVZNN1UwRkRia0lzUTBGQlF6dFJRVVZHTEUxQlFVMHNVMEZCVXl4SFFVRkhMR05CUVdNc1EwRkJReXhMUVVGTExFTkJRVU1zVlVGQlZTeERRVUZETEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03VVVGRGNrVXNTVUZCU1N4VFFVRlRMRVZCUVVVN1dVRkRaQ3hOUVVGTkxFbEJRVWtzUjBGQlJ5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRNVUlzYVVKQlFXbENMRU5CUVVNc1NVRkJTU3hIUVVGSExFbEJRV1VzUTBGQlF6dFpRVU42UXl4TlFVRk5MRWxCUVVrc1IwRkJSeXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZETVVJc2FVSkJRV2xDTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenRaUVVVNVFpeE5RVUZOTEdOQlFXTXNSMEZCUnl4alFVRmpMRU5CUVVNc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5eGpRVUZqTEVOQlFVTTdXVUZEZEVVc1NVRkJTU3hqUVVGakxFVkJRVVU3WjBKQlEyNUNMR2xDUVVGcFFpeERRVUZETEZGQlFWRXNSMEZCUnl4alFVRmpMRU5CUVVNc1EwRkJReXhEUVVGeFFpeERRVUZETzJGQlEyNUZPMmxDUVVGTk8yZENRVU5PTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSU3hMUVVGTExFTkJRVU1zU1VGQlNTeEpRVUZKTEVOQlFVTXNjVUpCUVhGQ0xFVkJRVVU3YjBKQlEzQkVMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SFFVRkhMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU1zUlVGQlJUdDNRa0ZEY2tNc2FVSkJRV2xDTEVOQlFVTXNVVUZCVVN4SFFVRkhMRXRCUVVzc1EwRkJRenR4UWtGRGJrTTdhVUpCUTBRN1lVRkRSRHRUUVVORU8xRkJRMFFzU1VGQlNTeERRVUZETEZWQlFWVXNRMEZCUXl4SlFVRkpMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNRMEZCUXp0SlFVTjZReXhEUVVGRE96dEJRUzlSUml3MlFrRm5Va003UVVFdlVYZENMSGREUVVFMlFpeEhRVU5zUkN3clJVRkJLMFVzUTBGQlF6dEJRVU16UkN3MFFrRkJhVUlzUjBGRGRFTXNLMGRCUVN0SExFTkJRVU03UVVGRE0wWXNlVUpCUVdNc1IwRkJSeXhyUTBGQmEwTXNRMEZCUXp0QlFUSlJOVVVzUTBGQlF6czdPenM3T3pzN096czdPenM3TzBGRE9WSkdPenRIUVVWSE8wRkJRMGdzVFVGQmNVSXNXVUZCV1R0SlFVTm9ReXhOUVVGTkxFTkJRVU1zYVVKQlFXbENMRU5CUVVNc2EwSkJRVFJDTEVWQlFVVXNWVUZCYTBJN1VVRkRlRVVzVFVGQlRTeE5RVUZOTEVkQlFVY3NWVUZCVlN4RFFVRkRMRTlCUVU4c1EwRkJReXhsUVVGbExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTTdVVUZGZGtRc2EwSkJRV3RDTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1RVRkJUU3hGUVVGRkxFTkJRVU1zUTBGQlF6dEpRVU5xUkN4RFFVRkRPMGxCUlVRc1RVRkJUU3hEUVVGRExHRkJRV0VzUTBGQlF5eFZRVUZyUWl4RlFVRkZMR05CUVRoQ08xRkJRM1JGTEUxQlFVMHNZMEZCWXl4SFFVRkhMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU1zSzBSQlFTdEVMRVZCUVVVc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRmVrZ3NUVUZCVFN4VlFVRlZMRWRCUVVjc1NVRkJTU3hSUVVGUkxFTkJRVU1zVlVGQlZTeEhRVUZITEdOQlFXTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zWTBGQll5eERRVUZETEVOQlFVTTdVVUZEZWtZc1QwRkJUeXhWUVVGVkxFTkJRVU03U1VGRGJrSXNRMEZCUXp0RFFVTkVPMEZCWWtRc0swSkJZVU03T3pzN096czdPenM3T3pzN096dEJRMmhDUkRzN1IwRkZSenRCUVVOSUxFMUJRWEZDTEdsQ1FVRnBRanRKUVVOeVF6czdPMDlCUjBjN1NVRkRTQ3hOUVVGTkxFTkJRVU1zYlVKQlFXMUNMRU5CUTNwQ0xHdENRVUUwUWl4RlFVTTFRaXhuUWtGQmVVSXNSVUZEZWtJc2JVSkJRVFJDTzFGQlJUVkNMRWxCUVVrc1EwRkJReXdyUWtGQkswSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eERRVUZETzFGQlEzcEVMRWxCUVVrc1EwRkJReXh2UWtGQmIwSXNRMEZCUXl4clFrRkJhMElzUlVGQlJTeHRRa0ZCYlVJc1EwRkJReXhEUVVGRE8xRkJRMjVGTEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVNc2EwSkJRV3RDTEVWQlFVVXNaMEpCUVdkQ0xFTkJRVU1zUTBGQlF6dFJRVU4yUkN4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHdENRVUZyUWl4RlFVRkZMR2RDUVVGblFpeEZRVUZGTEcxQ1FVRnRRaXhEUVVGRExFTkJRVU03VVVGRE4wVXNTVUZCU1N4RFFVRkRMSFZDUVVGMVFpeERRVUZETEd0Q1FVRnJRaXhEUVVGRExFTkJRVU03VVVGRGFrUXNTVUZCU1N4RFFVRkRMRFpDUVVFMlFpeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxHZENRVUZuUWl4RlFVRkZMRzFDUVVGdFFpeERRVUZETEVOQlFVTTdVVUZET1VZc1RVRkJUU3cyUWtGQk5rSXNSMEZCUnl4clFrRkJhMElzUTBGQlF6dFJRVVY2UkN4UFFVRlBMRFpDUVVFMlFpeERRVUZETzBsQlEzUkRMRU5CUVVNN1NVRkZSRHM3TzA5QlIwYzdTVUZEU0N4TlFVRk5MRU5CUVVNc2JVSkJRVzFDTEVOQlFVTXNhMEpCUVRSQ0xFVkJRVVVzWjBKQlFYbENPMUZCUTJwR0xFbEJRVWtzUTBGQlF5d3JRa0ZCSzBJc1EwRkJReXhyUWtGQmEwSXNRMEZCUXl4RFFVRkRPMUZCUTNwRUxFbEJRVWtzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhyUWtGQmEwSXNSVUZCUlN4blFrRkJaMElzUTBGQlF5eERRVUZETzFGQlF6bEVMRWxCUVVrc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4clFrRkJhMElzUlVGQlJTeG5Ra0ZCWjBJc1EwRkJReXhEUVVGRE8xRkJRelZFTEVsQlFVa3NRMEZCUXl4dlFrRkJiMElzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRE8xRkJRemxETEVsQlFVa3NRMEZCUXl4clFrRkJhMElzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRE8xRkJRelZETEVsQlFVa3NRMEZCUXl4elFrRkJjMElzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRE8xRkJRMmhFTEVsQlFVa3NRMEZCUXl4clFrRkJhMElzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRE8xRkJRelZETEVsQlFVa3NRMEZCUXl4elFrRkJjMElzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRE8xRkJRMmhFTEUxQlFVMHNOa0pCUVRaQ0xFZEJRVWNzYTBKQlFXdENMRU5CUVVNN1VVRkZla1FzVDBGQlR5dzJRa0ZCTmtJc1EwRkJRenRKUVVOMFF5eERRVUZETzBsQlJVUTdPenRQUVVkSE8wbEJRMGdzVFVGQlRTeERRVUZETEZsQlFWa3NRMEZEYkVJc1QwRkJjMElzUlVGRGRFSXNhMEpCUVRSQ0xFVkJRelZDTEdkQ1FVRjVRaXhGUVVONlFpeHRRa0ZCTkVJN1VVRkZOVUlzU1VGQlNTeFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMR0ZCUVdFc1EwRkJReXhGUVVGRk8xbEJRMnBETEU5QlFVOHNTVUZCU1N4RFFVRkRMRzFDUVVGdFFpeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxHZENRVUZuUWl4RFFVRkRMRU5CUVVNN1UwRkRkRVU3WVVGQlRTeEpRVUZKTEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1lVRkJZU3hEUVVGRExFVkJRVVU3V1VGRGVFTXNUMEZCVHl4SlFVRkpMRU5CUVVNc2JVSkJRVzFDTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzWjBKQlFXZENMRVZCUVVVc2JVSkJRVzFDTEVOQlFVTXNRMEZCUXp0VFFVTXpSanRoUVVGTk8xbEJRMDRzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4cFFrRkJhVUlzUTBGQlF6dFpRVU5vUXl4UFFVRlBMR3RDUVVGclFpeERRVUZETzFOQlF6RkNPMGxCUTBZc1EwRkJRenRKUVVWRU96czdPenM3T3p0UFFWRkhPMGxCUTBzc1RVRkJUU3hEUVVGRExDdENRVUVyUWl4RFFVRkRMR3RDUVVFMFFqdFJRVU14UlN4TlFVRk5MRWRCUVVjc1IwRkJSeXgxUTBGQmRVTXNRMEZCUXp0UlFVTndSQ3hKUVVGSkxFTkJRVU1zZVVKQlFYbENMRU5CUVVNc2EwSkJRV3RDTEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkZlRVFzYTBKQlFXdENMRU5CUVVNc1QwRkJUeXhEUVVGRExHTkJRV01zUTBGQlF5eERRVUZETzBsQlF6VkRMRU5CUVVNN1NVRkZSRHM3T3pzN096czdPenRQUVZWSE8wbEJRMHNzVFVGQlRTeERRVUZETEN0Q1FVRXJRaXhEUVVGRExHdENRVUUwUWp0UlFVTXhSU3hOUVVGTkxFZEJRVWNzUjBGQlJ5eDFRMEZCZFVNc1EwRkJRenRSUVVOd1JDeEpRVUZKTEVOQlFVTXNlVUpCUVhsQ0xFTkJRVU1zYTBKQlFXdENMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRmVFUXNhMEpCUVd0Q0xFTkJRVU1zVDBGQlR5eERRVUZETEd0Q1FVRnJRaXhEUVVGRExFTkJRVU03VVVGREwwTXNhMEpCUVd0Q0xFTkJRVU1zVDBGQlR5eERRVUZETEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03U1VGREwwTXNRMEZCUXp0SlFVVkVPenM3TzA5QlNVYzdTVUZEU3l4TlFVRk5MRU5CUVVNc1YwRkJWeXhEUVVGRExHdENRVUUwUWl4RlFVRkZMR2RDUVVGNVFqdFJRVU5xUml4TlFVRk5MRWRCUVVjc1IwRkJSeXg1UlVGQmVVVXNRMEZCUXp0UlFVVjBSaXhKUVVGSkxGZEJRVmNzUTBGQlF6dFJRVU5vUWl4SlFVRkpMR2RDUVVGblFpeEZRVUZGTzFsQlEzSkNMRmRCUVZjc1IwRkJSeXhWUVVGVkxFdEJRV0VzUlVGQlJTeEZRVUZWTzJkQ1FVTm9SQ3hQUVVGUExGVkJRVlVzUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZEZUVJc1EwRkJRenRUUVVORU8yRkJRVTA3V1VGRFRpeFhRVUZYTEVkQlFVY3NWVUZCVlN4TFFVRmhMRVZCUVVVc1JVRkJWVHRuUWtGRGFFUXNUMEZCVHl4WlFVRlpMRWRCUVVjc1JVRkJSU3hEUVVGRE8xbEJRekZDTEVOQlFVTTdVMEZEUkR0UlFVVkVMRWxCUVVrc1EwRkJReXhoUVVGaExFTkJRVU1zYTBKQlFXdENMRVZCUVVVc1IwRkJSeXhGUVVGRkxGZEJRVmNzUTBGQlF5eERRVUZETzBsQlF6RkVMRU5CUVVNN1NVRkZSRHM3T3pzN096dFBRVTlITzBsQlEwc3NUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJReXhyUWtGQk5FSXNSVUZCUlN4blFrRkJlVUlzUlVGQlJTeHRRa0ZCTkVJN1VVRkRhRWdzU1VGQlNTeG5Ra0ZCWjBJc1JVRkJSVHRaUVVOeVFpeE5RVUZOTEZsQlFWa3NSMEZCUnl4SlFVRkpMRU5CUVVNc2IwSkJRVzlDTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzYlVKQlFXMUNMRU5CUVVNc1EwRkJRenRaUVVONFJpeEpRVUZKTEZsQlFWa3NTVUZCU1N4SlFVRkpMRVZCUVVVN1owSkJRM3BDTEcxQ1FVRnRRanRuUWtGRGJrSXNUMEZCVHp0aFFVTlFPMWxCUlVRc1NVRkJTU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRmxCUVZrc1JVRkJSU3hyUWtGQmEwSXNSVUZCUlN4dFFrRkJiVUlzUTBGQlF5eERRVUZETzFOQlF6ZEZPMkZCUVUwN1dVRkRUaXhOUVVGTkxFZEJRVWNzUjBGQlJ5d3dSVUZCTUVVc1EwRkJRenRaUVVOMlJpeE5RVUZOTEZkQlFWY3NSMEZCUnl4VlFVRlZMRXRCUVdFc1JVRkJSU3hGUVVGVk8yZENRVU4wUkN4UFFVRlBMRlZCUVZVc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRGVFSXNRMEZCUXp0WlFVTkVMRWxCUVVrc1EwRkJReXhoUVVGaExFTkJRVU1zYTBKQlFXdENMRVZCUVVVc1IwRkJSeXhGUVVGRkxGZEJRVmNzUTBGQlF5eERRVUZETzFOQlEzcEVPMGxCUTBZc1EwRkJRenRKUVVWRU96czdPenRQUVV0SE8wbEJSVXNzVFVGQlRTeERRVUZETEc5Q1FVRnZRaXhEUVVGRExHdENRVUUwUWl4RlFVRkZMRzFDUVVFMFFqdFJRVU0zUml4TlFVRk5MRWRCUVVjc1IwRkJSeXcwUlVGQk5FVXNRMEZCUXp0UlFVVjZSaXhKUVVGSkxGbEJRV2RETEVOQlFVTTdVVUZEY2tNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMR3RDUVVGclFpeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRaUVVOdVJDeE5RVUZOTEV0QlFVc3NSMEZCUnl4clFrRkJhMElzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGREwwTXNTVUZCU1N4TFFVRkxMRVZCUVVVN1owSkJRMVlzYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOcVF5eFpRVUZaTEVkQlFVY3NTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU40UWl4TlFVRk5PMkZCUTA0N1UwRkRSRHRSUVVWRUxFOUJRVThzV1VGQldTeERRVUZETzBsQlEzSkNMRU5CUVVNN1NVRkZUeXhOUVVGTkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1dVRkJiMElzUlVGQlJTeHJRa0ZCTkVJc1JVRkJSU3h0UWtGQk5FSTdVVUZETDBjc1RVRkJUU3hsUVVGbExFZEJRVWNzYVVKQlFXbENMRU5CUVVNN1VVRkRNVU1zVFVGQlRTeFRRVUZUTEVkQlFVY3NlVUpCUVhsQ0xFTkJRVU03VVVGRE5VTXNUVUZCVFN4blFrRkJaMElzUjBGQlJ5eHhSRUZCY1VRc1EwRkJRenRSUVVNdlJTeE5RVUZOTEdGQlFXRXNSMEZCUnl4dlFrRkJiMElzV1VGQldTeEhRVUZITEVOQlFVTTdVVUZGTVVRc1NVRkJTU3gzUWtGQmQwSXNSMEZCUnl4TFFVRkxMRU5CUVVNN1VVRkRja01zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdXVUZEZUVRc1RVRkJUU3hKUVVGSkxFZEJRVWNzYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGJrTXNTVUZCU1N4RFFVRkRMSGRDUVVGM1FpeEpRVUZKTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFVkJRVVU3WjBKQlF6ZEVMR2xFUVVGcFJEdG5Ra0ZEYWtRc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eGxRVUZsTEVWQlFVVXNUMEZCVHl4aFFVRmhMRTlCUVU4c1EwRkJReXhEUVVGRE8yZENRVU51Uml4M1FrRkJkMElzUjBGQlJ5eEpRVUZKTEVOQlFVTTdZVUZEYUVNN1dVRkZSQ3hKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNVMEZCVXl4RFFVRkRMRVZCUVVVN1owSkJRekZDTEhORFFVRnpRenRuUWtGRGRFTXNhMEpCUVd0Q0xFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1lVRkJZU3hEUVVGRExFTkJRVU03WVVGREwwTTdXVUZGUkN4SlFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1JVRkJSVHRuUWtGRGFrTXNOa05CUVRaRE8yZENRVU0zUXl4TlFVRk5PMkZCUTA0N1UwRkRSRHRSUVVWRUxFbEJRVWtzUTBGQlF5eDNRa0ZCZDBJc1JVRkJSVHRaUVVNNVFpeE5RVUZOTEZsQlFWa3NSMEZCUnl3MFJVRkJORVVzUTBGQlF6dFpRVU5zUnl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExHdENRVUZyUWl4RlFVRkZMR3RDUVVGclFpeERRVUZETEUxQlFVMHNSVUZCUlN4WlFVRlpMRVZCUVVVc2JVSkJRVzFDTEVOQlFVTXNRMEZCUXp0VFFVTnNSenRKUVVOR0xFTkJRVU03U1VGRlJEczdPenRQUVVsSE8wbEJRMHNzVFVGQlRTeERRVUZETEc5Q1FVRnZRaXhEUVVGRExHdENRVUUwUWl4RlFVRkZMRzFDUVVFMFFqdFJRVU0zUml4SlFVRkpMRU5CUVVNc2QwSkJRWGRDTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzYlVKQlFXMUNMRU5CUVVNc1EwRkJRenRSUVVOMlJTeEpRVUZKTEVOQlFVTXNZMEZCWXl4RFFVRkRMR3RDUVVGclFpeERRVUZETEVOQlFVTTdTVUZEZWtNc1EwRkJRenRKUVVWRU96czdUMEZIUnp0SlFVTkxMRTFCUVUwc1EwRkJReXgzUWtGQmQwSXNRMEZCUXl4clFrRkJORUlzUlVGQlJTeHRRa0ZCTkVJN1VVRkRha2NzVFVGQlRTeEhRVUZITEVkQlFVY3NjMFJCUVhORUxFTkJRVU03VVVGRGJrVXNUVUZCVFN4WlFVRlpMRWRCUVVjc2IwVkJRVzlGTEVOQlFVTTdVVUZGTVVZc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMR3RDUVVGclFpeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRaUVVOdVJDeHJRa0ZCYTBJc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1MwRkJZU3hGUVVGRkxFVkJRVlVzUlVGQlJTeEZRVUZWTEVWQlFVVXNSVUZCUlR0blFrRkRjRWNzU1VGQlNTeEZRVUZGTEV0QlFVc3NUVUZCVFN4RlFVRkZPMjlDUVVOc1FpeEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMR3RDUVVGclFpeEZRVUZGTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1dVRkJXU3hGUVVGRkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN2IwSkJRemxGTEU5QlFVOHNTMEZCU3l4RFFVRkRPMmxDUVVOaU8yZENRVU5FTEU5QlFVOHNSVUZCUlN4RFFVRkRPMWxCUTFnc1EwRkJReXhEUVVGRExFTkJRVU03VTBGRFNEdEpRVU5HTEVOQlFVTTdTVUZGUkRzN08wOUJSMGM3U1VGRFN5eE5RVUZOTEVOQlFVTXNZMEZCWXl4RFFVRkRMR3RDUVVFMFFqdFJRVU42UkN4TlFVRk5MRWRCUVVjc1IwRkJSeXcwUlVGQk5FVXNRMEZCUXp0UlFVTjZSaXhKUVVGSkxFTkJRVU1zWVVGQllTeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxFZEJRVWNzUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXp0SlFVTnFSQ3hEUVVGRE8wbEJSVVE3T3pzN1QwRkpSenRKUVVOTExFMUJRVTBzUTBGQlF5eDFRa0ZCZFVJc1EwRkJReXhyUWtGQk5FSTdVVUZEYkVVc1RVRkJUU3hIUVVGSExFZEJRVWNzYzBWQlFYTkZMRU5CUVVNN1VVRkZia1lzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExHdENRVUZyUWl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdFpRVU51UkN4TlFVRk5MRXRCUVVzc1IwRkJSeXhyUWtGQmEwSXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdXVUZETDBNc1NVRkJTU3hMUVVGTExFbEJRVWtzU1VGQlNTeEZRVUZGTzJkQ1FVTnNRaXhKUVVORExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4TFFVRkxPMjlDUVVOc1FpeExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1QwRkJUenR2UWtGRGNFSXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExGZEJRVmM3YjBKQlEzaENMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eGhRVUZoTEVWQlEzcENPMjlDUVVORUxIZERRVUYzUXp0dlFrRkRlRU1zVTBGQlV6dHBRa0ZEVkR0eFFrRkJUVHR2UWtGRFRpeHJRa0ZCYTBJc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN2FVSkJRMnhETzJGQlEwUTdVMEZEUkR0SlFVTkdMRU5CUVVNN1NVRkZSRHM3T3pzN1QwRkxSenRKUVVOTExFMUJRVTBzUTBGQlF5dzJRa0ZCTmtJc1EwRkJReXhyUWtGQk5FSXNSVUZCUlN4blFrRkJlVUlzUlVGQlJTeHRRa0ZCTkVJN08xRkJRMnBKTEUxQlFVMHNSMEZCUnl4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFVkJRVVVzUTBGQlF6dFJRVU5vUXl4TlFVRk5MR05CUVdNc1IwRkJSeXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVkQlFVY3NkVUpCUVhWQ0xFZEJRVWNzU1VGQlNTeEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUXpsRkxFMUJRVTBzVlVGQlZTeEhRVUZITEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1IwRkJSeXh0UWtGQmJVSXNSMEZCUnl4SlFVRkpMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRmRFVXNTVUZCU1N4clFrRkJiVVFzUTBGQlF6dFJRVU40UkN4TlFVRk5MR2xDUVVGcFFpeEhRVUZITEVsQlFVa3NRMEZCUXl4NVFrRkJlVUlzUTBGQlF5eHJRa0ZCYTBJc1JVRkJSU3h0UWtGQmJVSXNRMEZCUXl4RFFVRkRPMUZCUTJ4SExFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhyUWtGQmEwSXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRGJrUXNUVUZCVFN4SlFVRkpMRWRCUVVjc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkZia01zVFVGQlRTeG5Ra0ZCWjBJc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEhWRFFVRjFReXhEUVVGRExFTkJRVU03V1VGRE4wVXNTVUZCU1N4blFrRkJaMElzUlVGQlJUdG5Ra0ZEY2tJc2EwSkJRV3RDTEVkQlFVY3NhMEpCUVd0Q0xHRkJRV3hDTEd0Q1FVRnJRaXhqUVVGc1FpeHJRa0ZCYTBJc1IwRkJTU3hKUVVGSkxFTkJRVU1zTUVKQlFUQkNMRU5CUTNwRkxHdENRVUZyUWl4RlFVTnNRaXhEUVVGRExFVkJRMFFzYlVKQlFXMUNMRU5CUTI1Q0xFTkJRVU03WjBKQlJVWXNUVUZCVFN4WFFVRlhMRWRCUVVjc1owSkJRV2RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1MwRkJTeXhEUVVGRE8yZENRVU5zUkN4TlFVRk5MRmxCUVZrc1IwRkJSeXhuUWtGQlowSXNTVUZCU1N4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRPMmRDUVVOc1JTeE5RVUZOTEZsQlFWa3NSMEZCUnl4blFrRkJaMElzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRla01zVFVGQlRTeFhRVUZYTEZOQlFVY3NhMEpCUVd0Q0xHRkJRV3hDTEd0Q1FVRnJRaXgxUWtGQmJFSXNhMEpCUVd0Q0xFTkJRVVVzUjBGQlJ5eERRVUZETEZsQlFWa3NiME5CUVVzc2FVSkJRV2xDTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8yZENRVU5xUnl4SlFVRkpMRmRCUVZjc1NVRkJTU3hKUVVGSkxFVkJRVVU3YjBKQlEzaENMRWxCUVVrc1YwRkJWeXhMUVVGTExGZEJRVmNzUlVGQlJUdDNRa0ZEYUVNc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExHTkJRV01zUlVGQlJTeHZRa0ZCYjBJc1dVRkJXU3hKUVVGSkxFTkJRVU1zUTBGQlF6dHhRa0ZETlVjN2VVSkJRVTA3ZDBKQlEwNHNUVUZCVFN4WlFVRlpMRWRCUVVjc1owUkJRV2RFTEVkQlFVY3NWMEZCVnl4SFFVRkhMRTlCUVU4c1EwRkJRenQzUWtGRE9VWXNTVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhyUWtGQmEwSXNSVUZCUlN4RFFVRkRMRVZCUVVVc1dVRkJXU3hGUVVGRkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN2NVSkJRekZGTzJsQ1FVTkVPMmRDUVVORUxGTkJRVk03WVVGRFZEdFpRVVZFTEUxQlFVMHNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zYlVOQlFXMURMRU5CUVVNc1EwRkJRenRaUVVOeVJTeEpRVUZKTEZsQlFWa3NSVUZCUlR0blFrRkRha0lzYTBKQlFXdENMRWRCUVVjc2EwSkJRV3RDTEdGQlFXeENMR3RDUVVGclFpeGpRVUZzUWl4clFrRkJhMElzUjBGQlNTeEpRVUZKTEVOQlFVTXNNRUpCUVRCQ0xFTkJRM3BGTEd0Q1FVRnJRaXhGUVVOc1FpeERRVUZETEVWQlEwUXNiVUpCUVcxQ0xFTkJRMjVDTEVOQlFVTTdaMEpCUlVZc1RVRkJUU3hYUVVGWExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRXRCUVVzc1EwRkJRenRuUWtGRE9VTXNUVUZCVFN4WlFVRlpMRWRCUVVjc1owSkJRV2RDTEVsQlFVa3NWMEZCVnl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXp0blFrRkRiRVVzVFVGQlRTeFpRVUZaTEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU55UXl4TlFVRk5MRmRCUVZjc1UwRkJSeXhyUWtGQmEwSXNZVUZCYkVJc2EwSkJRV3RDTEhWQ1FVRnNRaXhyUWtGQmEwSXNRMEZCUlN4SFFVRkhMRU5CUVVNc1dVRkJXU3h2UTBGQlN5eHBRa0ZCYVVJc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdaMEpCUTJwSExFbEJRVWtzVjBGQlZ5eEpRVUZKTEVsQlFVa3NSVUZCUlR0dlFrRkRlRUlzU1VGQlNTeFhRVUZ0UWl4RFFVRkRPMjlDUVVONFFpeEpRVUZKTEZkQlFWY3NTMEZCU3l4WFFVRlhMRVZCUVVVN2QwSkJRMmhETEZkQlFWY3NSMEZCUnl4WFFVRlhMRU5CUVVNN2NVSkJRekZDTzNsQ1FVRk5MRWxCUVVrc1YwRkJWeXhMUVVGTExHRkJRV0VzUlVGQlJUdDNRa0ZEZWtNc1YwRkJWeXhIUVVGSExHRkJRV0VzUTBGQlF6dHhRa0ZETlVJN2VVSkJRVTA3ZDBKQlEwNHNWMEZCVnl4SFFVRkhMRVZCUVVVc1EwRkJRenQzUWtGRGFrSXNUVUZCVFN4WlFVRlpMRWRCUVVjc1owUkJRV2RFTEVkQlFVY3NWMEZCVnl4SFFVRkhMRTlCUVU4c1EwRkJRenQzUWtGRE9VWXNTVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhyUWtGQmEwSXNSVUZCUlN4RFFVRkRMRVZCUVVVc1dVRkJXU3hGUVVGRkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN2NVSkJRekZGTzI5Q1FVVkVMRWxCUVVrc1YwRkJWeXhMUVVGTExFVkJRVVVzUlVGQlJUdDNRa0ZEZGtJc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExGVkJRVlVzUlVGQlJTeExRVUZMTEZkQlFWY3NTMEZCU3l4WlFVRlpMRWxCUVVrc1EwRkJReXhEUVVGRE8zRkNRVU42Unp0cFFrRkRSRHRuUWtGRFJDeFRRVUZUTzJGQlExUTdXVUZGUkN4TlFVRk5MRlZCUVZVc1IwRkJSeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRaUVVOMFF5eEpRVUZKTEZWQlFWVXNSVUZCUlR0blFrRkRaaXhyUWtGQmEwSXNSMEZCUnl4VFFVRlRMRU5CUVVNN1lVRkRMMEk3VTBGRFJEdEpRVU5HTEVOQlFVTTdTVUZGUkRzN096dFBRVWxITzBsQlEwc3NUVUZCVFN4RFFVRkRMSGxDUVVGNVFpeERRVUZETEd0Q1FVRTBRaXhGUVVGRkxHMUNRVUUwUWp0UlFVTnNSeXhOUVVGTkxHbENRVUZwUWl4SFFVRjNRaXhKUVVGSkxFZEJRVWNzUlVGQlJTeERRVUZETzFGQlJYcEVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRia1FzVFVGQlRTeEpRVUZKTEVkQlFVY3NhMEpCUVd0Q0xFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEYmtNc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4cFJrRkJhVVlzUTBGQlF5eERRVUZETzFsQlF6VkhMRWxCUVVrc1MwRkJTeXhGUVVGRk8yZENRVU5XTEUxQlFVMHNWMEZCVnl4SFFVRkhMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBJc1RVRkJUU3hKUVVGSkxFZEJRVWNzUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOMFFpeEpRVUZKTEdsQ1FVRnBRaXhEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlR0dlFrRkRhRU1zVFVGQlRTeFpRVUZaTEVkQlFVY3NiMFJCUVc5RUxFTkJRVU03YjBKQlF6RkZMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zYTBKQlFXdENMRVZCUVVVc1EwRkJReXhGUVVGRkxGbEJRVmtzUlVGQlJTeHRRa0ZCYlVJc1EwRkJReXhEUVVGRE8ybENRVU14UlR0blFrRkRSQ3hwUWtGQmFVSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxGZEJRVmNzUTBGQlF5eERRVUZETzJGQlEzcERPMU5CUTBRN1VVRkRSQ3hQUVVGUExHbENRVUZwUWl4RFFVRkRPMGxCUXpGQ0xFTkJRVU03U1VGRlJEczdPenRQUVVsSE8wbEJRMHNzVFVGQlRTeERRVUZETERCQ1FVRXdRaXhEUVVONFF5eHJRa0ZCTkVJc1JVRkROVUlzVTBGQmFVSXNSVUZEYWtJc2JVSkJRVFJDT3p0UlFVVTFRaXhOUVVGTkxHdENRVUZyUWl4SFFVRjNRaXhKUVVGSkxFZEJRVWNzUlVGQlJTeERRVUZETzFGQlJURkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzVTBGQlV5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRGNFTXNUVUZCVFN4SlFVRkpMRWRCUVVjc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkZia01zVFVGQlRTeG5Ra0ZCWjBJc1IwRkJSeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRaUVVNMVF5eEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFVkJRVVU3WjBKQlEzUkNMRk5CUVZNN1lVRkRWRHRaUVVWRUxFMUJRVTBzYTBKQlFXdENMRWRCUVVjc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMR3RDUVVGclFpeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUlRORkxFMUJRVTBzZFVKQlFYVkNMRk5CUVVjc2EwSkJRV3RDTEVOQlFVTXNTMEZCU3l4RFFVRkRMRmxCUVZrc1EwRkJReXd3UTBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTTFSU3hKUVVGSkxIVkNRVUYxUWl4SlFVRkpMRWxCUVVrc1JVRkJSVHRuUWtGRGNFTXNUMEZCVHp0aFFVTlFPMWxCUlVRc1RVRkJUU3hyUWtGQmEwSXNSMEZCUnl4MVFrRkJkVUlzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRPVVFzVFVGQlRTeDNRa0ZCZDBJc1IwRkJSeXgzUlVGQmQwVXNRMEZCUXp0WlFVVXhSeXhOUVVGTkxHbENRVUZwUWl4SFFVRkhMRU5CUVVNc1EwRkJReXhQUVVGRExHdENRVUZyUWl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eDNRa0ZCZDBJc1EwRkJReXh0UTBGQlNTeHJRa0ZCYTBJc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVOcVNTeEpRVUZKTEVOQlFVTXNhVUpCUVdsQ0xFVkJRVVU3WjBKQlEzWkNMRk5CUVZNN1lVRkRWRHRaUVVWRUxFdEJRVXNzVFVGQlRTeHBRa0ZCYVVJc1NVRkJTU3hyUWtGQmEwSXNSVUZCUlR0blFrRkRia1FzVFVGQlRTeHZRa0ZCYjBJc1IwRkJSeXhwUWtGQmFVSXNRMEZCUXl4TFFVRkxMRU5CUVVNc2QwSkJRWGRDTEVOQlFVTXNRMEZCUXp0blFrRkRMMFVzU1VGQlNTeHZRa0ZCYjBJc1NVRkJTU3hKUVVGSkxFVkJRVVU3YjBKQlEycERMRk5CUVZNN2FVSkJRMVE3WjBKQlEwUXNUVUZCVFN4WFFVRlhMRWRCUVVjc2IwSkJRVzlDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRelZETEUxQlFVMHNTVUZCU1N4SFFVRkhMRzlDUVVGdlFpeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOeVF5eEpRVUZKTEd0Q1FVRnJRaXhEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlR0dlFrRkRha01zVFVGQlRTeFpRVUZaTEVkQlFVY3NjVVJCUVhGRUxFTkJRVU03YjBKQlF6TkZMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zYTBKQlFXdENMRVZCUVVVc1EwRkJReXhGUVVGRkxGbEJRVmtzUlVGQlJTeHRRa0ZCYlVJc1EwRkJReXhEUVVGRE8ybENRVU14UlR0blFrRkRSQ3hyUWtGQmEwSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxGZEJRVmNzUTBGQlF5eERRVUZETzJGQlF6RkRPMWxCUlVRc1RVRkJUVHRUUVVOT08xRkJSVVFzVDBGQlR5eHJRa0ZCYTBJc1EwRkJRenRKUVVNelFpeERRVUZETzBsQlJVUTdPenM3VDBGSlJ6dEpRVU5MTEUxQlFVMHNRMEZCUXl4dFFrRkJiVUlzUTBGQlF5eHJRa0ZCTkVJc1JVRkJSU3hsUVVGMVFqdFJRVU4yUml4SlFVRkpMR2xDUVVGcFFpeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTXhRaXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEdWQlFXVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFsQlF6RkRMRTFCUVUwc1NVRkJTU3hIUVVGSExHdENRVUZyUWl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRMjVETEUxQlFVMHNiVUpCUVcxQ0xFZEJRVWNzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03V1VGREwwTXNTVUZCU1N4dFFrRkJiVUlzUlVGQlJUdG5Ra0ZEZUVJc2FVSkJRV2xDTEVkQlFVY3NRMEZCUXl4RFFVRkRPMmRDUVVOMFFpeE5RVUZOTzJGQlEwNDdVMEZEUkR0UlFVVkVMRWxCUVVrc2EwSkJRV3RDTEVkQlFVY3NSVUZCUlN4RFFVRkRPMUZCUXpWQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NhVUpCUVdsQ0xFVkJRVVVzUTBGQlF5eEpRVUZKTEdWQlFXVXNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRaUVVNeFJDeHJRa0ZCYTBJc1NVRkJTU3hyUWtGQmEwSXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRUUVVNMVF6dFJRVVZFTEU5QlFVOHNhMEpCUVd0Q0xFTkJRVU03U1VGRE0wSXNRMEZCUXp0SlFVVkVPenM3TzA5QlNVYzdTVUZEU3l4TlFVRk5MRU5CUVVNc2EwSkJRV3RDTEVOQlFVTXNhMEpCUVRSQ0xFVkJRVVVzWjBKQlFYbENPMUZCUTNoR0xFbEJRVWtzWjBKQlFXZENMRVZCUVVVN1dVRkRja0lzVDBGQlR6dFRRVU5RTzFGQlJVUXNUVUZCVFN4SFFVRkhMRWRCUVVjc2FVTkJRV2xETEVOQlFVTTdVVUZET1VNc1RVRkJUU3hWUVVGVkxFZEJRVWNzUzBGQlN5eERRVUZETzFGQlJYcENMRWxCUVVrc1EwRkJReXhoUVVGaExFTkJRVU1zYTBKQlFXdENMRVZCUVVVc1IwRkJSeXhGUVVGRkxGVkJRVlVzUTBGQlF5eERRVUZETzBsQlEzcEVMRU5CUVVNN1NVRkZSRHM3T3p0UFFVbEhPMGxCUTBzc1RVRkJUU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMR3RDUVVFMFFpeEZRVUZGTEdkQ1FVRjVRanRSUVVOMFJpeE5RVUZOTEVkQlFVY3NSMEZCUnl3clFrRkJLMElzUTBGQlF6dFJRVU0xUXl4TlFVRk5MRlZCUVZVc1IwRkJSeXhuUWtGQlowSXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTTdVVUZGY2tRc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eHJRa0ZCYTBJc1JVRkJSU3hIUVVGSExFVkJRVVVzVlVGQlZTeERRVUZETEVOQlFVTTdTVUZEZWtRc1EwRkJRenRKUVVWRU96czdPMDlCU1VjN1NVRkRTeXhOUVVGTkxFTkJRVU1zYjBKQlFXOUNMRU5CUVVNc2EwSkJRVFJDTzFGQlF5OUVMRTFCUVUwc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eFpRVUZaTEVWQlFVVXNRMEZCUXp0UlFVTm9ReXhOUVVGTkxFZEJRVWNzUjBGQlJ5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRWRCUVVjc2JVSkJRVzFDTEVkQlFVY3NTVUZCU1N4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJReTlFTEUxQlFVMHNWVUZCVlN4SFFVRkhMRk5CUVZNc1EwRkJRenRSUVVVM1FpeEpRVUZKTEVOQlFVTXNZVUZCWVN4RFFVRkRMR3RDUVVGclFpeEZRVUZGTEVkQlFVY3NSVUZCUlN4SlFVRkpMRWRCUVVjc1ZVRkJWU3hIUVVGSExFbEJRVWtzUTBGQlF5eERRVUZETzBsQlEzWkZMRU5CUVVNN1NVRkZSRHM3T3p0UFFVbEhPMGxCUTBzc1RVRkJUU3hEUVVGRExHdENRVUZyUWl4RFFVRkRMR3RDUVVFMFFqdFJRVU0zUkN4TlFVRk5MRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTTdVVUZEYUVNc1RVRkJUU3hIUVVGSExFZEJRVWNzU1VGQlNTeE5RVUZOTEVOQlFVTXNTVUZCU1N4SFFVRkhMR2xDUVVGcFFpeEhRVUZITEVsQlFVa3NSVUZCUlN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVNM1JDeE5RVUZOTEZWQlFWVXNSMEZCUnl4VFFVRlRMRU5CUVVNN1VVRkZOMElzU1VGQlNTeERRVUZETEdGQlFXRXNRMEZCUXl4clFrRkJhMElzUlVGQlJTeEhRVUZITEVWQlFVVXNTVUZCU1N4SFFVRkhMRlZCUVZVc1IwRkJSeXhKUVVGSkxFTkJRVU1zUTBGQlF6dEpRVU4yUlN4RFFVRkRPMGxCUlVRN096czdUMEZKUnp0SlFVTkxMRTFCUVUwc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4clFrRkJORUk3VVVGRGFrVXNUVUZCVFN4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUlVGQlJTeERRVUZETzFGQlEyaERMRTFCUVUwc1IwRkJSeXhIUVVGSExFbEJRVWtzVFVGQlRTeERRVUZETEVsQlFVa3NSMEZCUnl4eFFrRkJjVUlzUjBGQlJ5eEpRVUZKTEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRha1VzVFVGQlRTeFZRVUZWTEVkQlFVY3NZVUZCWVN4RFFVRkRPMUZCUldwRExFbEJRVWtzUTBGQlF5eGhRVUZoTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzUjBGQlJ5eEZRVUZGTEVsQlFVa3NSMEZCUnl4VlFVRlZMRWRCUVVjc1NVRkJTU3hEUVVGRExFTkJRVU03U1VGRGRrVXNRMEZCUXp0SlFVVkVPenM3TzA5QlNVYzdTVUZEU3l4TlFVRk5MRU5CUVVNc2EwSkJRV3RDTEVOQlFVTXNhMEpCUVRSQ08xRkJRemRFTEUxQlFVMHNSMEZCUnl4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFVkJRVVVzUTBGQlF6dFJRVU5vUXl4TlFVRk5MRWRCUVVjc1IwRkJSeXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVkQlFVY3NhVUpCUVdsQ0xFZEJRVWNzU1VGQlNTeEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUXpkRUxFMUJRVTBzVlVGQlZTeEhRVUZITEZOQlFWTXNRMEZCUXp0UlFVVTNRaXhKUVVGSkxFTkJRVU1zWVVGQllTeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxFZEJRVWNzUlVGQlJTeEpRVUZKTEVkQlFVY3NWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhEUVVGRE8wbEJRM1pGTEVOQlFVTTdTVUZGUkRzN096dFBRVWxITzBsQlEwc3NUVUZCVFN4RFFVRkRMSE5DUVVGelFpeERRVUZETEd0Q1FVRTBRanRSUVVOcVJTeE5RVUZOTEVkQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFTkJRVU03VVVGRGFFTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEhGQ1FVRnhRaXhIUVVGSExFbEJRVWtzUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnFSU3hOUVVGTkxGVkJRVlVzUjBGQlJ5eGhRVUZoTEVOQlFVTTdVVUZGYWtNc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eHJRa0ZCYTBJc1JVRkJSU3hIUVVGSExFVkJRVVVzU1VGQlNTeEhRVUZITEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1EwRkJRenRKUVVOMlJTeERRVUZETzBsQlJVOHNUVUZCVFN4RFFVRkRMRmxCUVZrN1VVRkRNVUlzVDBGQlR5eHhRMEZCY1VNc1IwRkJSeXhoUVVGaExFTkJRVU03U1VGRE9VUXNRMEZCUXp0SlFVVlBMRTFCUVUwc1EwRkJReXhoUVVGaExFTkJRVU1zYTBKQlFUUkNMRVZCUVVVc1IwRkJWeXhGUVVGRkxGZEJRV2RDTzFGQlEzWkdMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRia1FzYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlN4WFFVRlhMRU5CUVVNc1EwRkJRenRUUVVONFJUdEpRVU5HTEVOQlFVTTdTVUZGVHl4TlFVRk5MRU5CUVVNc2VVSkJRWGxDTEVOQlFVTXNhMEpCUVRSQ0xFVkJRVVVzUjBGQlZ6dFJRVU5xUml4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NhMEpCUVd0Q0xFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUTI1RUxFbEJRVWtzYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZPMmRDUVVOeVF5eHJRa0ZCYTBJc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOb1F5eE5RVUZOTzJGQlEwNDdVMEZEUkR0SlFVTkdMRU5CUVVNN1NVRkZUeXhOUVVGTkxFTkJRVU1zVlVGQlZTeERRVU40UWl4clFrRkJORUlzUlVGRE5VSXNVMEZCYVVJc1JVRkRha0lzV1VGQmIwSXNSVUZEY0VJc2JVSkJRVFJDTzFGQlJUVkNMRWxCUVVrc2JVSkJRVzFDTEVWQlFVVTdXVUZEZUVJc1RVRkJUU3h0UWtGQmJVSXNSMEZCUnl4WFFVRlhMRk5CUVZNc1MwRkJTeXhaUVVGWkxFbEJRVWtzUTBGQlF6dFpRVU4wUlN4TlFVRk5MR1ZCUVdVc1IwRkJSeXhwUWtGQmFVSXNRMEZCUXp0WlFVTXhReXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEd0Q1FVRnJRaXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdG5Ra0ZEZUVRc1RVRkJUU3hKUVVGSkxFZEJRVWNzYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEyNURMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNSVUZCUlR0dlFrRkRhRU1zVFVGQlRUdHBRa0ZEVGp0blFrRkZSQ3hKUVVGSkxHdENRVUZyUWl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExHMUNRVUZ0UWl4RlFVRkZPMjlDUVVOc1JDeG5RMEZCWjBNN2IwSkJRMmhETEU5QlFVODdhVUpCUTFBN1lVRkRSRHRaUVVWRUxFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1dVRkROVUlzYTBKQlFXdENMRU5CUVVNc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN1UwRkROME03WVVGQlRUdFpRVU5PTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03VTBGRE9VSTdTVUZEUml4RFFVRkRPME5CUTBRN1FVRndhMEpFTEc5RFFXOXJRa003T3pzN096czdPenM3T3pzN096czdPenRCUTNwclFrUXNNRWRCUVhORE8wRkJSWFJETEN0SVFVRnZSRHRCUVVOd1JDeG5TRUZCTUVNN1FVRkRNVU1zYVVkQlFXZERPMEZCUTJoRExEaEpRVUU0UkR0QlFVTTVSQ3huU0VGQk1FTTdRVUZGTVVNc1RVRkJjVUlzVTBGQlV6dEpRVU0zUWl3MFIwRkJORWM3U1VGRE5VY3NhME5CUVd0RE8wbEJRMnhETERSSFFVRTBSenRKUVVVMVJ6czdPenM3T3p0UFFVOUhPMGxCUTBrc1RVRkJUU3hEUVVGRExHdENRVUZyUWl4RFFVRkRMRWRCUVc5Q0xFVkJRVVVzYlVKQlFXMUNMRWRCUVVjc1MwRkJTenRSUVVOcVJpeE5RVUZOTEd0Q1FVRnJRaXhIUVVGSExHbENRVUZQTEVOQlFVTXNiMEpCUVc5Q0xFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMUZCUld4RkxFMUJRVTBzTmtKQlFUWkNMRWRCUTJoRExESkNRVUZwUWl4RFFVRkRMRzFDUVVGdFFpeERRVU4wUXl4clFrRkJhMElzUlVGRGJFSXNSMEZCUnl4RFFVRkRMR2RDUVVGblFpeEZRVU53UWl4dFFrRkJiVUlzUTBGRGJrSXNRMEZCUXp0UlFVTklMRTFCUVUwc1ZVRkJWU3hIUVVGSExHbENRVUZQTEVOQlFVTXNhVUpCUVdsQ0xFTkJRVU1zTmtKQlFUWkNMRU5CUVVNc1EwRkJRenRSUVVVMVJTeE5RVUZOTEZOQlFWTXNSMEZCYjBJN1dVRkRiRU1zU1VGQlNTeEZRVUZGTEZWQlFWVTdXVUZEYUVJc1YwRkJWeXhGUVVGRkxFZEJRVWNzUTBGQlF5eFhRVUZYTzFsQlF6VkNMR2RDUVVGblFpeEZRVUZGTEVkQlFVY3NRMEZCUXl4blFrRkJaMEk3VTBGRGRFTXNRMEZCUXp0UlFVVkdMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMnhDTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOSkxFMUJRVTBzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhIUVVGdlFqdFJRVU53UkN4TlFVRk5MR3RDUVVGclFpeEhRVUZITEdsQ1FVRlBMRU5CUVVNc2IwSkJRVzlDTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8xRkJSV3hGTEUxQlFVMHNOa0pCUVRaQ0xFZEJRMmhETERKQ1FVRnBRaXhEUVVGRExHMUNRVUZ0UWl4RFFVRkRMR3RDUVVGclFpeEZRVUZGTEVkQlFVY3NRMEZCUXl4blFrRkJaMElzUTBGQlF5eERRVUZETzFGQlEyNUdMRTFCUVUwc1ZVRkJWU3hIUVVGSExHbENRVUZQTEVOQlFVTXNhVUpCUVdsQ0xFTkJRVU1zTmtKQlFUWkNMRU5CUVVNc1EwRkJRenRSUVVVMVJTeE5RVUZOTEZOQlFWTXNSMEZCYjBJN1dVRkRiRU1zU1VGQlNTeEZRVUZGTEZWQlFWVTdXVUZEYUVJc1YwRkJWeXhGUVVGRkxFZEJRVWNzUTBGQlF5eFhRVUZYTzFsQlF6VkNMR2RDUVVGblFpeEZRVUZGTEVkQlFVY3NRMEZCUXl4blFrRkJaMEk3VTBGRGRFTXNRMEZCUXp0UlFVVkdMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMnhDTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOSkxFMUJRVTBzUTBGQlF5eFhRVUZYTEVOQlFVTXNUMEZCYzBJc1JVRkJSU3hIUVVGdlFpeEZRVUZGTEcxQ1FVRnRRaXhIUVVGSExFdEJRVXM3VVVGRGJFY3NUVUZCVFN4clFrRkJhMElzUjBGQlJ5eHBRa0ZCVHl4RFFVRkRMRzlDUVVGdlFpeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRSUVVWc1JTeE5RVUZOTERaQ1FVRTJRaXhIUVVOb1F5d3lRa0ZCYVVJc1EwRkJReXhaUVVGWkxFTkJReTlDTEU5QlFVOHNSVUZEVUN4clFrRkJhMElzUlVGRGJFSXNSMEZCUnl4RFFVRkRMR2RDUVVGblFpeEZRVU53UWl4dFFrRkJiVUlzUTBGRGJrSXNRMEZCUXp0UlFVTklMRTFCUVUwc1ZVRkJWU3hIUVVGSExHbENRVUZQTEVOQlFVTXNhVUpCUVdsQ0xFTkJRVU1zTmtKQlFUWkNMRU5CUVVNc1EwRkJRenRSUVVVMVJTeE5RVUZOTEZOQlFWTXNSMEZCYjBJN1dVRkRiRU1zU1VGQlNTeEZRVUZGTEZWQlFWVTdXVUZEYUVJc1YwRkJWeXhGUVVGRkxFZEJRVWNzUTBGQlF5eFhRVUZYTzFsQlF6VkNMR2RDUVVGblFpeEZRVUZGTEVkQlFVY3NRMEZCUXl4blFrRkJaMEk3VTBGRGRFTXNRMEZCUXp0UlFVVkdMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMnhDTEVOQlFVTTdTVUZGVFN4TlFVRk5MRU5CUVVNc1lVRkJZU3hEUVVGRExFZEJRVzlDTzFGQlF5OURMRTFCUVUwc2EwSkJRV3RDTEVkQlFVY3NhVUpCUVU4c1EwRkJReXh2UWtGQmIwSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03VVVGRmJFVXNUVUZCVFN3MlFrRkJOa0lzUjBGRGFFTXNjMEpCUVZrc1EwRkJReXhQUVVGUExFTkJRVU1zYTBKQlFXdENMRU5CUVVNc1EwRkJRenRSUVVVMVF5eE5RVUZOTEZWQlFWVXNSMEZCUnl4cFFrRkJUeXhEUVVGRExHbENRVUZwUWl4RFFVRkRMRFpDUVVFMlFpeERRVUZETEVOQlFVTTdVVUZGTlVVc1RVRkJUU3hUUVVGVExFZEJRVzlDTzFsQlEyeERMRWxCUVVrc1JVRkJSU3hWUVVGVk8xbEJRMmhDTEZkQlFWY3NSVUZCUlN4SFFVRkhMRU5CUVVNc1YwRkJWenRaUVVNMVFpeG5Ra0ZCWjBJc1JVRkJSU3hIUVVGSExFTkJRVU1zWjBKQlFXZENPMU5CUTNSRExFTkJRVU03VVVGRlJpeFBRVUZQTEZOQlFWTXNRMEZCUXp0SlFVTnNRaXhEUVVGRE8wbEJSVVFzTkVkQlFUUkhPMGxCUXpWSExITkRRVUZ6UXp0SlFVTjBReXcwUjBGQk5FYzdTVUZGTlVjN08wOUJSVWM3U1VGRFNTeE5RVUZOTEVOQlFVTXNORUpCUVRSQ0xFTkJRVU1zVjBGQk1rSTdVVUZEY2tVc1QwRkJUeXhKUVVGSkxHZERRVUZ6UWl4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRE8wbEJRMmhFTEVOQlFVTTdTVUZGUkN3MFIwRkJORWM3U1VGRE5VY3NkMEpCUVhkQ08wbEJRM2hDTERSSFFVRTBSenRKUVVVMVJ6czdPenM3T3pzN096czdPMDlCV1VjN1NVRkRTQ3hyUkVGQmEwUTdTVUZETTBNc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZ2UWl4RlFVRkZMRWRCUVcxQ08xRkJRMjVGTEUxQlFVMHNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXh4UWtGQmNVSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVVM1F5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMSE5DUVVGWkxFTkJRVU1zWVVGQllTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRmRrUXNUMEZCVHl4SlFVRkpMRU5CUVVNN1NVRkRZaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU1N4TlFVRk5MRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNSMEZCYjBJc1JVRkJSU3hWUVVGclFqdFJRVU4wUlN4TlFVRk5MRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zY1VKQlFYRkNMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRE4wTXNUVUZCVFN4clFrRkJhMElzUjBGQlJ5eHBRa0ZCVHl4RFFVRkRMRzlDUVVGdlFpeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRSUVVWc1JTeHpRa0ZCV1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxGVkJRVlVzUTBGQlF5eERRVUZETzFGQlF5OUVMRWxCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzYVVKQlFVOHNRMEZCUXl4cFFrRkJhVUlzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhEUVVGRE8xRkJSVEZFTEU5QlFVOHNTVUZCU1N4RFFVRkRPMGxCUTJJc1EwRkJRenRKUVVWRUxEUkhRVUUwUnp0SlFVTTFSeXgxUWtGQmRVSTdTVUZEZGtJc05FZEJRVFJITzBsQlJUVkhPenM3VDBGSFJ6dEpRVU5KTEUxQlFVMHNRMEZCUXl4elFrRkJjMElzUTBGQlF5eEhRVUZ2UWp0UlFVTjRSQ3hOUVVGTkxHdENRVUZyUWl4SFFVRkhMR2xDUVVGUExFTkJRVU1zYjBKQlFXOUNMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlJXeEZMRTFCUVUwc1ZVRkJWU3hIUVVGSExFbEJRVWtzYjBKQlFWVXNRMEZCUXl4clFrRkJhMElzUlVGQlJTeEhRVUZITEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNN1VVRkRka1VzVDBGQlR5eFZRVUZWTEVOQlFVTTdTVUZEYmtJc1EwRkJRenRKUVVWRUxEUkhRVUUwUnp0SlFVTTFSeXh2UWtGQmIwSTdTVUZEY0VJc05FZEJRVFJITzBsQlJYQkhMRTFCUVUwc1EwRkJReXh4UWtGQmNVSXNRMEZCUXl4SFFVRnZRanRSUVVONFJDeE5RVUZOTEZOQlFWTXNSMEZCYjBJN1dVRkRiRU1zU1VGQlNTeEZRVUZGTEVkQlFVY3NRMEZCUXl4SlFVRkpPMWxCUTJRc1YwRkJWeXhGUVVGRkxFZEJRVWNzUTBGQlF5eFhRVUZYTzFsQlF6VkNMR2RDUVVGblFpeEZRVUZGTEVkQlFVY3NRMEZCUXl4blFrRkJaMEk3VTBGRGRFTTdVVUZGUkN4UFFVRlBMRk5CUVZNc1EwRkJRenRKUVVOc1FpeERRVUZETzBOQlEwUTdRVUV6UzBRc05FSkJNa3RET3pzN096czdPenM3T3pzN096czdPenM3UVVNeFNrUXNhVWRCUVdkRE8wRkJSV2hET3p0SFFVVkhPMEZCUTBnc1RVRkJjVUlzYzBKQlFYTkNPMGxCY1VNeFF5eFpRVUZaTEZkQlFUSkNPMUZCYmtNdlFpeHpRa0ZCYVVJc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRmRFSXNNa0pCUVhOQ0xFZEJRV0VzUlVGQlJTeERRVUZETzFGQlEzUkRMR2xDUVVGWkxFZEJRVFJDTEVWQlFVVXNRMEZCUXp0UlFVTXpReXh6UWtGQmFVSXNSMEZCTUVJN1dVRkRiRVFzUjBGQlJ5eEZRVUZGTEU5QlFVODdXVUZEV2l4TFFVRkxMRVZCUVVVc1QwRkJUenRaUVVOa0xGTkJRVk1zUlVGQlJTeFBRVUZQTzFsQlEyeENMRmRCUVZjc1JVRkJSU3hQUVVGUE8xbEJRM0JDTEZOQlFWTXNSVUZCUlN4UFFVRlBPMWxCUTJ4Q0xHTkJRV01zUlVGQlJTeFBRVUZQTzFsQlEzWkNMRlZCUVZVc1JVRkJSU3hQUVVGUE8xbEJRMjVDTEZsQlFWa3NSVUZCUlN4UFFVRlBPMWxCUTNKQ0xGVkJRVlVzUlVGQlJTeFBRVUZQTzFsQlEyNUNMR1ZCUVdVc1JVRkJSU3hQUVVGUE8xbEJRM2hDTEZWQlFWVXNSVUZCUlN4UFFVRlBPMWxCUTI1Q0xGbEJRVmtzUlVGQlJTeFBRVUZQTzFsQlEzSkNMRlZCUVZVc1JVRkJSU3hQUVVGUE8xbEJRMjVDTEdWQlFXVXNSVUZCUlN4UFFVRlBPMWxCUTNoQ0xHVkJRV1VzUlVGQlJTeFBRVUZQTzFsQlEzaENMR2xDUVVGcFFpeEZRVUZGTEU5QlFVODdXVUZETVVJc2IwSkJRVzlDTEVWQlFVVXNUMEZCVHp0VFFVTTNRaXhEUVVGRE8xRkJRMDBzZDBKQlFXMUNMRWRCUVcxRExFVkJRVVVzUTBGQlF6dFJRVU42UkN3eVFrRkJjMElzUjBGQlowTXNSVUZCUlN4RFFVRkRPMUZCUTNwRUxHbERRVUUwUWl4SFFVRnpReXhGUVVGRkxFTkJRVU03VVVGRGNrVXNhVUpCUVZrc1IwRkJORUlzUlVGQlJTeERRVUZETEVOQlFVTXNlVUpCUVhsQ08xRkJRM0pGTEdWQlFWVXNSMEZCTUVJc1JVRkJSU3hEUVVGRE8xRkJRM1pETEdWQlFWVXNSMEZCTUVJc1JVRkJSU3hEUVVGRE8xRkJRM1pETEhGQ1FVRm5RaXhIUVVGblF5eEZRVUZGTEVOQlFVTTdVVUZEYmtRc01rSkJRWE5DTEVkQlFXZERMRVZCUVVVc1EwRkJRenRSUVVONlJDeG5Ra0ZCVnl4SFFVRTJRaXhGUVVGRkxFTkJRVU1zUTBGQlF5eDVRMEZCZVVNN1VVRkRja1lzZFVKQlFXdENMRWRCUVZjc1owSkJRV2RDTEVOQlFVTTdVVUZET1VNc09FSkJRWGxDTEVkQlFWY3NaVUZCWlN4RFFVRkRMRU5CUVVNc01rSkJRVEpDTzFGQlIzWkdMRWxCUVVrc1EwRkJReXhoUVVGaExFZEJRVWNzVjBGQlZ5eERRVUZETzBsQlEyeERMRU5CUVVNN1NVRkZSQ3cwUjBGQk5FYzdTVUZETlVjc01rSkJRVEpDTzBsQlF6TkNMRFJIUVVFMFJ6dEpRVVZ5Unl4clFrRkJhMElzUTBGQlF5eHRRa0ZCTWtJN1VVRkRjRVFzVFVGQlRTeFhRVUZYTEVkQlEyaENMRWxCUVVrc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEV0QlFVc3NiVUpCUVcxQ0xFTkJRVU1zUTBGQlF6dFJRVU40UlN4SlFVRkpMRmRCUVZjc1JVRkJSVHRaUVVOb1FpeFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMREJFUVVFd1JDeERRVUZETEVOQlFVTTdXVUZEZWtVc1QwRkJUenRUUVVOUU8xRkJSVVFzU1VGQlNTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExFbEJRVWtzUTBGQlF5eHRRa0ZCYlVJc1EwRkJReXhEUVVGRE8wbEJRM1pFTEVOQlFVTTdTVUZGVFN4WlFVRlpMRU5CUVVNc1lVRkJjVUlzUlVGQlJTeFhRVUZ2UXl4UlFVRlJPMUZCUTNSR0xFMUJRVTBzVjBGQlZ5eEhRVU5vUWl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNSVUZCUlN4RFFVRkRMRk5CUVZNc1EwRkJReXhoUVVGaExFdEJRVXNzWVVGQllTeERRVUZETEVOQlFVTTdVVUZEYUVZc1NVRkJTU3hYUVVGWExFVkJRVVU3V1VGRGFFSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXcyUTBGQk5rTXNRMEZCUXl4RFFVRkRPMWxCUXpWRUxFOUJRVTg3VTBGRFVEdFJRVVZFTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hEUVVGRE8xbEJRM1JDTEdGQlFXRTdXVUZEWWl4UlFVRlJPMU5CUTFJc1EwRkJReXhEUVVGRE8wbEJRMG9zUTBGQlF6dEpRVVZFTEc5Q1FVRnZRanRKUVVOaUxHMUNRVUZ0UWl4RFFVRkRMRlZCUVd0Q0xFVkJRVVVzWVVGQmVVTTdVVUZEZGtZc1RVRkJUU3hYUVVGWExFZEJRMmhDTEVsQlFVa3NRMEZCUXl4dFFrRkJiVUlzUTBGQlF5eEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zUlVGQlJTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExGVkJRVlVzUzBGQlN5eFZRVUZWTEVOQlFVTXNRMEZCUXp0UlFVTXZSaXhKUVVGSkxGZEJRVmNzUlVGQlJUdFpRVU5vUWl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExHMUVRVUZ0UkN4VlFVRlZMRVZCUVVVc1EwRkJReXhEUVVGRE8xbEJReTlGTEU5QlFVODdVMEZEVUR0UlFVVkVMRWxCUVVrc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4SlFVRkpMRU5CUVVNN1dVRkROMElzVlVGQlZUdFpRVU5XTEdGQlFXRTdVMEZEWWl4RFFVRkRMRU5CUVVNN1NVRkRTaXhEUVVGRE8wbEJSVTBzYzBKQlFYTkNMRU5CUVVNc1dVRkJiMElzUlVGQlJTeEpRVUZ0UXl4RlFVRkZMRTFCUVdkQ08xRkJRM2hITEUxQlFVMHNWMEZCVnl4SFFVTm9RaXhKUVVGSkxFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRVZCUVVVc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4WlFVRlpMRXRCUVVzc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRE5VY3NTVUZCU1N4WFFVRlhMRVZCUVVVN1dVRkRhRUlzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4dFJFRkJiVVFzV1VGQldTeEZRVUZGTEVOQlFVTXNRMEZCUXp0WlFVTnFSaXhQUVVGUE8xTkJRMUE3VVVGRlJDeE5RVUZOTEhOQ1FVRnpRaXhIUVVGSExHbENRVUZQTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zU1VGQlNTeEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRPMUZCUXpWRkxFbEJRVWtzUTBGQlF5eHpRa0ZCYzBJc1JVRkJSVHRaUVVNMVFpeFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMR3RFUVVGclJDeFpRVUZaTEdGQlFXRXNRMEZCUXl4RFFVRkRPMWxCUXpOR0xFOUJRVTg3VTBGRFVEdFJRVVZFTEUxQlFVMHNVMEZCVXl4SFFVRkhMR2xDUVVGUExFTkJRVU1zVlVGQlZTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMUZCUXpORExFbEJRVWtzVTBGQlV5eEZRVUZGTzFsQlEyUXNUVUZCVFN4dlFrRkJiMElzUjBGQlJ5eHpRa0ZCYzBJc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRaUVVOdVJpeEpRVUZKTEc5Q1FVRnZRaXhGUVVGRk8yZENRVU42UWl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExIVkVRVUYxUkN4WlFVRlpMRVZCUVVVc1EwRkJReXhEUVVGRE8yRkJRM0JHTzFOQlEwUTdVVUZGUkN4SlFVRkpMRU5CUVVNc2MwSkJRWE5DTEVOQlFVTXNTVUZCU1N4RFFVRkRPMWxCUTJoRExGbEJRVms3V1VGRFdpeEpRVUZKTzFsQlEwb3NUVUZCVFR0VFFVTk9MRU5CUVVNc1EwRkJRenRKUVVOS0xFTkJRVU03U1VGRlJDd3dSRUZCTUVRN1NVRkRNVVFzYVVoQlFXbElPMGxCUXpGSExEUkNRVUUwUWl4RFFVRkRMRlZCUVd0Q0xFVkJRVVVzV1VGQmIwSXNSVUZCUlN4TlFVRTJRenRSUVVNeFNDeE5RVUZOTEZkQlFWY3NSMEZEYUVJc1NVRkJTU3hEUVVGRExEUkNRVUUwUWl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU1zUlVGQlJTeERRVUZETEZkQlFWY3NRMEZCUXl4WlFVRlpMRXRCUVVzc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRGJFY3NTVUZCU1N4WFFVRlhMRVZCUVVVN1dVRkRhRUlzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4NVJFRkJlVVFzV1VGQldTeEZRVUZGTEVOQlFVTXNRMEZCUXp0WlFVTjJSaXhQUVVGUE8xTkJRMUE3VVVGRlJDeEpRVUZKTEVOQlFVTXNORUpCUVRSQ0xFTkJRVU1zU1VGQlNTeERRVUZETzFsQlEzUkRMRmxCUVZrN1dVRkRXaXhWUVVGVk8xbEJRMVlzVFVGQlRUdFRRVU5PTEVOQlFVTXNRMEZCUXp0SlFVTktMRU5CUVVNN1NVRkZUU3gxUWtGQmRVSXNRMEZETjBJc1dVRkJiMElzUlVGRGNFSXNTVUZCTkVJc1JVRkROVUlzVDBGSFF6dFJRVVZFTEVsQlFVa3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1MwRkJTeXhSUVVGUkxFVkJRVVU3V1VGRGNFTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXh4UkVGQmNVUXNRMEZCUXl4RFFVRkRPMWxCUTNKRkxFOUJRVTg3VTBGRFVEdFJRVVZFTEUxQlFVMHNWMEZCVnl4SFFVTm9RaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1JVRkJSU3hEUVVGRExGTkJRVk1zUTBGQlF5eFpRVUZaTEV0QlFVc3NXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkRPVVVzU1VGQlNTeFhRVUZYTEVWQlFVVTdXVUZEYUVJc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eDVRMEZCZVVNc1dVRkJXU3hGUVVGRkxFTkJRVU1zUTBGQlF6dFpRVU4yUlN4UFFVRlBPMU5CUTFBN1VVRkZSQ3hKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NRMEZCUXp0WlFVTjBRaXhaUVVGWk8xbEJRMW9zU1VGQlNUdFpRVU5LTEZOQlFWTXNSVUZCUlN4UFFVRlBMR0ZCUVZBc1QwRkJUeXgxUWtGQlVDeFBRVUZQTEVOQlFVVXNVMEZCVXp0WlFVTTNRaXhSUVVGUkxFVkJRVVVzVDBGQlR5eGhRVUZRTEU5QlFVOHNkVUpCUVZBc1QwRkJUeXhEUVVGRkxGRkJRVkU3VTBGRE0wSXNRMEZCUXl4RFFVRkRPMGxCUTBvc1EwRkJRenRKUVVWTkxIRkNRVUZ4UWl4RFFVTXpRaXhaUVVGdlFpeEZRVU53UWl4SlFVRXdRaXhGUVVNeFFpeFBRVWRETzFGQlJVUXNUVUZCVFN4WFFVRlhMRWRCUTJoQ0xFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NTMEZCU3l4WlFVRlpMRU5CUVVNc1EwRkJRenRSUVVONFJTeEpRVUZKTEZkQlFWY3NSVUZCUlR0WlFVTm9RaXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEhWRFFVRjFReXhaUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETzFsQlEzSkZMRTlCUVU4N1UwRkRVRHRSUVVWRUxFMUJRVTBzVTBGQlV5eEhRVUZITEdsQ1FVRlBMRU5CUVVNc1ZVRkJWU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlF6TkRMRWxCUVVrc2FVSkJRV2xDTEVkQlFVY3NUMEZCVHl4aFFVRlFMRTlCUVU4c2RVSkJRVkFzVDBGQlR5eERRVUZGTEdsQ1FVRnBRaXhEUVVGRE8xRkJRMjVFTEVsQlFVa3NVMEZCVXl4SlFVRkpMR2xDUVVGcFFpeExRVUZMTEUxQlFVMHNSVUZCUlR0WlFVTTVReXhKUVVGSkxHbENRVUZwUWl4SlFVRkpMRWxCUVVrc1JVRkJSVHRuUWtGRE9VSXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhyUlVGQmEwVXNRMEZCUXl4RFFVRkRPMmRDUVVOc1JpeFBRVUZQTzJGQlExQTdhVUpCUVUwN1owSkJRMDRzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl3eVJrRkJNa1lzUTBGQlF5eERRVUZETzJkQ1FVTXhSeXhwUWtGQmFVSXNSMEZCUnl4TlFVRk5MRU5CUVVNN1lVRkRNMEk3VTBGRFJEdFJRVVZFTEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1NVRkJTU3hEUVVGRE8xbEJRM0JDTEZsQlFWazdXVUZEV2l4SlFVRkpPMWxCUTBvc1UwRkJVeXhGUVVGRkxFOUJRVThzWVVGQlVDeFBRVUZQTEhWQ1FVRlFMRTlCUVU4c1EwRkJSU3hUUVVGVE8xbEJRemRDTEdsQ1FVRnBRanRUUVVOcVFpeERRVUZETEVOQlFVTTdTVUZEU2l4RFFVRkRPMGxCUlUwc2NVSkJRWEZDTEVOQlF6TkNMRmxCUVc5Q0xFVkJRM0JDTEVsQlFUWkNMRVZCUXpkQ0xFOUJSVU03VVVGRlJDeE5RVUZOTEZkQlFWY3NSMEZEYUVJc1NVRkJTU3hEUVVGRExGVkJRVlVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeExRVUZMTEZsQlFWa3NRMEZCUXl4RFFVRkRPMUZCUTNoRkxFbEJRVWtzVjBGQlZ5eEZRVUZGTzFsQlEyaENMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zZFVOQlFYVkRMRmxCUVZrc1JVRkJSU3hEUVVGRExFTkJRVU03V1VGRGNrVXNUMEZCVHp0VFFVTlFPMUZCUlVRc1NVRkJTU3hKUVVGSkxFdEJRVXNzVFVGQlRTeEpRVUZKTEZGQlFVOHNZVUZCVUN4UFFVRlBMSFZDUVVGUUxFOUJRVThzUTBGQlJTeFRRVUZUTEV0QlFVa3NTVUZCU1N4RlFVRkZPMWxCUTJ4RUxFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNORVpCUVRSR0xFTkJRVU1zUTBGQlF6dFpRVU16Unl4UFFVRlBMRU5CUVVNc1UwRkJVeXhIUVVGSExGTkJRVk1zUTBGQlF6dFRRVU01UWp0UlFVVkVMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zU1VGQlNTeERRVUZETzFsQlEzQkNMRmxCUVZrN1dVRkRXaXhKUVVGSk8xbEJRMG9zVTBGQlV5eEZRVUZGTEU5QlFVOHNZVUZCVUN4UFFVRlBMSFZDUVVGUUxFOUJRVThzUTBGQlJTeFRRVUZUTzFOQlF6ZENMRU5CUVVNc1EwRkJRenRKUVVOS0xFTkJRVU03U1VGRlJDd3dSRUZCTUVRN1NVRkRia1FzTWtKQlFUSkNMRU5CUTJwRExGVkJRV3RDTEVWQlEyeENMRmxCUVc5Q08xRkJSWEJDTEUxQlFVMHNWMEZCVnl4SFFVTm9RaXhKUVVGSkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eEZRVUZGTEVOQlFVTXNZVUZCWVN4RFFVRkRMRmxCUVZrc1MwRkJTeXhaUVVGWkxFTkJRVU1zUTBGQlF6dFJRVU14Uml4SlFVRkpMRmRCUVZjc1JVRkJSVHRaUVVOb1FpeFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMSGRFUVVGM1JDeFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRPMWxCUTNSR0xFOUJRVTg3VTBGRFVEdFJRVVZFTEVsQlFVa3NRMEZCUXl4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTTdXVUZETVVJc1dVRkJXVHRaUVVOYUxGVkJRVlU3VTBGRFZpeERRVUZETEVOQlFVTTdTVUZEU2l4RFFVRkRPMGxCUlVRc1ZVRkJWVHRKUVVOSUxHbERRVUZwUXl4RFFVTjJReXhUUVVGcFFpeEZRVU5xUWl4bFFVRXdReXhGUVVNeFF5eFBRVVZETzFGQlJVUXNUVUZCVFN4dlFrRkJiMElzUjBGRGVrSXNTVUZCU1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eFRRVUZUTEV0QlFVc3NVMEZCVXl4RFFVRkRMRU5CUVVNN1VVRkRkRVVzU1VGQlNTeHZRa0ZCYjBJc1JVRkJSVHRaUVVONlFpeFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMREpFUVVFeVJDeFRRVUZUTEVWQlFVVXNRMEZCUXl4RFFVRkRPMWxCUTNSR0xFOUJRVTg3VTBGRFVEdFJRVVZFTEV0QlFVc3NUVUZCVFN4SFFVRkhMRWxCUVVrc1NVRkJTU3hEUVVGRExITkNRVUZ6UWl4RlFVRkZPMWxCUXpsRExFdEJRVXNzVFVGQlRTeHBRa0ZCYVVJc1NVRkJTU3hIUVVGSExFTkJRVU1zWlVGQlpTeEZRVUZGTzJkQ1FVTndSQ3hMUVVGTExFMUJRVTBzWTBGQll5eEpRVUZKTEdWQlFXVXNSVUZCUlR0dlFrRkROME1zU1VGQlNTeHBRa0ZCYVVJc1EwRkJReXhaUVVGWkxFdEJRVXNzWTBGQll5eERRVUZETEZsQlFWa3NSVUZCUlR0M1FrRkRia1VzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl3NFJFRkJPRVFzWTBGQll5eERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRMRU5CUVVNN2QwSkJRek5ITEU5QlFVODdjVUpCUTFBN2FVSkJRMFE3WVVGRFJEdFRRVU5FTzFGQlJVUXNTVUZCU1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NRMEZCUXp0WlFVTm9ReXhUUVVGVE8xbEJRMVFzWlVGQlpUdFpRVU5tTEZsQlFWa3NSVUZCUlN4UFFVRlBMR0ZCUVZBc1QwRkJUeXgxUWtGQlVDeFBRVUZQTEVOQlFVVXNXVUZCV1R0VFFVTnVReXhEUVVGRExFTkJRVU03U1VGRFNpeERRVUZETzBsQlJVUXNkMFJCUVhkRU8wbEJRM2hFTERCRlFVRXdSVHRKUVVOdVJTeHhRa0ZCY1VJc1EwRkRNMElzV1VGQmIwSXNSVUZEY0VJc1QwRkZRenM3VVVGRlJDeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNRMEZCUXp0UlFVVTFReXhOUVVGTkxHVkJRV1VzVTBGQlJ5eFBRVUZQTEdGQlFWQXNUMEZCVHl4MVFrRkJVQ3hQUVVGUExFTkJRVVVzWlVGQlpTeHRRMEZCU1N4RFFVRkRMRU5CUVVNN1VVRkRkRVFzU1VGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4bFFVRmxMRU5CUVVNc1UwRkJSeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEdWQlFXVXNRMEZCUXl4dFEwRkJTU3hGUVVGRkxFTkJRVU03VVVGRE5VVXNTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTTdXVUZEZEVNc1dVRkJXVHRaUVVOYUxGVkJRVlU3VTBGRFZpeERRVUZETEVOQlFVTTdVVUZGU0N4UFFVRlBMRlZCUVZVc1EwRkJRenRKUVVOdVFpeERRVUZETzBsQlJVUXNORWRCUVRSSE8wbEJRelZITERoQ1FVRTRRanRKUVVNNVFpdzBSMEZCTkVjN1NVRkZja2NzY1VKQlFYRkNMRU5CUVVNc1UwRkJaME03VVVGRE5VUXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zYVVKQlFXbENMRVZCUVVVc1UwRkJVeXhEUVVGRExFTkJRVU03U1VGRGJFUXNRMEZCUXp0SlFVVk5MSE5DUVVGelFpeERRVUZETEZWQlFXdENMRVZCUVVVc1lVRkJlVU03VVVGRE1VWXNUVUZCVFN4WlFVRlpMRWRCUTJwQ0xFbEJRVWtzUTBGQlF5eHRRa0ZCYlVJc1EwRkJReXhUUVVGVExFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1JVRkJSU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRlZCUVZVc1MwRkJTeXhWUVVGVkxFTkJRVU1zUTBGQlF6dFJRVU53Unl4SlFVRkpMRmxCUVZrc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJUdFpRVU40UWl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExHZEVRVUZuUkN4VlFVRlZMR1ZCUVdVc1EwRkJReXhEUVVGRE8xbEJRM3BHTEU5QlFVODdVMEZEVUR0UlFVVkVMRWxCUVVrc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhoUVVGaExFZEJRVWNzWVVGQllTeERRVUZETzBsQlEzUkZMRU5CUVVNN1NVRkZUU3g1UWtGQmVVSXNRMEZCUXl4WlFVRnZRaXhGUVVGRkxFMUJRV2RDTzFGQlEzUkZMRTFCUVUwc1dVRkJXU3hIUVVOcVFpeEpRVUZKTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zVTBGQlV5eERRVUZETEcxQ1FVRnRRaXhEUVVGRExFVkJRVVVzUTBGQlF5eHRRa0ZCYlVJc1EwRkJReXhaUVVGWkxFdEJRVXNzV1VGQldTeERRVUZETEVOQlFVTTdVVUZEYWtnc1NVRkJTU3haUVVGWkxFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdXVUZEZUVJc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eG5SRUZCWjBRc1dVRkJXU3hsUVVGbExFTkJRVU1zUTBGQlF6dFpRVU14Uml4UFFVRlBPMU5CUTFBN1VVRkZSQ3hOUVVGTkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRPMUZCUlRWRUxFMUJRVTBzYzBKQlFYTkNMRWRCUVVjc2FVSkJRVThzUTBGQlF5eHpRa0ZCYzBJc1EwRkJReXhKUVVGSkxFVkJRVVVzVFVGQlRTeERRVUZETEVOQlFVTTdVVUZETlVVc1NVRkJTU3hEUVVGRExITkNRVUZ6UWl4RlFVRkZPMWxCUXpWQ0xFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNNa1JCUVRKRUxFTkJRVU1zUTBGQlF6dFpRVU16UlN4UFFVRlBPMU5CUTFBN1VVRkZSQ3hOUVVGTkxGTkJRVk1zUjBGQlJ5eHBRa0ZCVHl4RFFVRkRMRlZCUVZVc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dFJRVU16UXl4SlFVRkpMRk5CUVZNc1JVRkJSVHRaUVVOa0xFMUJRVTBzYjBKQlFXOUNMRWRCUVVjc2MwSkJRWE5DTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdXVUZEYmtZc1NVRkJTU3h2UWtGQmIwSXNSVUZCUlR0blFrRkRla0lzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4clEwRkJhME1zV1VGQldTd3lRa0ZCTWtJc1EwRkJReXhEUVVGRE8yRkJRM2hHTzFOQlEwUTdVVUZGUkN4SlFVRkpMRU5CUVVNc2MwSkJRWE5DTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1RVRkJUU3hIUVVGSExFMUJRVTBzUTBGQlF6dEpRVU16UkN4RFFVRkRPMGxCUlUwc0swSkJRU3RDTEVOQlFVTXNXVUZCYjBJc1JVRkJSU3hOUVVFMlF6dFJRVU42Unl4TlFVRk5MRmxCUVZrc1IwRkRha0lzU1VGQlNTeERRVUZETERSQ1FVRTBRaXhEUVVGRExGTkJRVk1zUTBGQlF5eFhRVUZYTEVOQlFVTXNSVUZCUlN4RFFVRkRMRmRCUVZjc1EwRkJReXhaUVVGWkxFdEJRVXNzV1VGQldTeERRVUZETEVOQlFVTTdVVUZEZGtjc1NVRkJTU3haUVVGWkxFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdXVUZEZUVJc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eDFSRUZCZFVRc1dVRkJXU3hsUVVGbExFTkJRVU1zUTBGQlF6dFpRVU5zUnl4UFFVRlBPMU5CUTFBN1VVRkZSQ3hKUVVGSkxFTkJRVU1zTkVKQlFUUkNMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEUxQlFVMHNRMEZCUXp0SlFVTnFSU3hEUVVGRE8wbEJSVTBzYTBKQlFXdENMRU5CUVVNc2NVSkJRVFpDTzFGQlEzUkVMRWxCUVVrc1EwRkJReXhyUWtGQmEwSXNSMEZCUnl4eFFrRkJjVUlzUTBGQlF6dEpRVU5xUkN4RFFVRkRPMGxCUlVRc0swWkJRU3RHTzBsQlF5OUdMRzFHUVVGdFJqdEpRVU0xUlN3MlFrRkJOa0lzUTBGQlF5eDFRa0ZCSzBJN1VVRkRia1VzU1VGQlNTeEpRVUZKTEVOQlFVTXNZVUZCWVN4TFFVRkxMRlZCUVZVc1JVRkJSVHRaUVVOMFF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMSGRGUVVGM1JTeERRVUZETEVOQlFVTTdXVUZEZUVZc1QwRkJUenRUUVVOUU8xRkJSVVFzU1VGQlNTeDFRa0ZCZFVJc1EwRkJReXhOUVVGTkxFdEJRVXNzUTBGQlF5eEZRVUZGTzFsQlEzcERMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zTmtSQlFUWkVMRU5CUVVNc1EwRkJRenRaUVVNM1JTeFBRVUZQTzFOQlExQTdVVUZGUkN4SlFVRkpMRU5CUVVNc2VVSkJRWGxDTEVkQlFVY3NkVUpCUVhWQ0xFTkJRVU03U1VGRE1VUXNRMEZCUXp0SlFVVkVMRFJIUVVFMFJ6dEpRVU0xUnl3NFFrRkJPRUk3U1VGRE9VSXNORWRCUVRSSE8wbEJSWEpITEhGQ1FVRnhRaXhEUVVGRExHMUNRVUV5UWp0UlFVTjJSQ3hOUVVGTkxGbEJRVmtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zVDBGQlR5eERRVUZETEcxQ1FVRnRRaXhEUVVGRExFTkJRVU03VVVGRk9VVXNTVUZCU1N4WlFVRlpMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3V1VGRGVFSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXcwUkVGQk5FUXNRMEZCUXl4RFFVRkRPMWxCUXpORkxFOUJRVTg3VTBGRFVEdFJRVVZFTEVsQlFVa3NRMEZCUXl4elFrRkJjMElzUTBGQlF5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM0pFTEVOQlFVTTdTVUZGVFN4bFFVRmxMRU5CUVVNc1lVRkJjVUk3VVVGRE0wTXNUVUZCVFN4WlFVRlpMRWRCUTJwQ0xFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNVMEZCVXl4RFFVRkRMRk5CUVZNc1EwRkJReXhGUVVGRkxFTkJRVU1zVTBGQlV5eERRVUZETEdGQlFXRXNTMEZCU3l4aFFVRmhMRU5CUVVNc1EwRkJRenRSUVVWeVJpeEpRVUZKTEZsQlFWa3NTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHRaUVVONFFpeFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRGhEUVVFNFF5eERRVUZETEVOQlFVTTdXVUZETjBRc1QwRkJUenRUUVVOUU8xRkJSVVFzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1dVRkJXU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6TkRMRU5CUVVNN1NVRkZUU3h6UWtGQmMwSXNRMEZCUXl4VlFVRnJRanRSUVVNdlF5eE5RVUZOTEZsQlFWa3NSMEZEYWtJc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRk5CUVZNc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4RlFVRkZMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWVUZCVlN4TFFVRkxMRlZCUVZVc1EwRkJReXhEUVVGRE8xRkJRM0JITEVsQlFVa3NXVUZCV1N4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRk8xbEJRM2hDTEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1owUkJRV2RFTEZWQlFWVXNaVUZCWlN4RFFVRkRMRU5CUVVNN1dVRkRla1lzVDBGQlR6dFRRVU5RTzFGQlJVUXNTVUZCU1N4RFFVRkRMRzFDUVVGdFFpeERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRGJFUXNRMEZCUXp0SlFVVk5MSGxDUVVGNVFpeERRVUZETEZsQlFXOUNPMUZCUTNCRUxFMUJRVTBzV1VGQldTeEhRVU5xUWl4SlFVRkpMRU5CUVVNc2MwSkJRWE5DTEVOQlFVTXNVMEZCVXl4RFFVRkRMRzFDUVVGdFFpeERRVUZETEVWQlFVVXNRMEZCUXl4dFFrRkJiVUlzUTBGQlF5eFpRVUZaTEV0QlFVc3NXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkRha2dzU1VGQlNTeFpRVUZaTEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN1dVRkRlRUlzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4blJFRkJaMFFzV1VGQldTeGxRVUZsTEVOQlFVTXNRMEZCUXp0WlFVTXhSaXhQUVVGUE8xTkJRMUE3VVVGRlJDeEpRVUZKTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zVFVGQlRTeERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOeVJDeERRVUZETzBsQlJVMHNLMEpCUVN0Q0xFTkJRVU1zV1VGQmIwSTdVVUZETVVRc1RVRkJUU3haUVVGWkxFZEJRMnBDTEVsQlFVa3NRMEZCUXl3MFFrRkJORUlzUTBGQlF5eFRRVUZUTEVOQlFVTXNWMEZCVnl4RFFVRkRMRVZCUVVVc1EwRkJReXhYUVVGWExFTkJRVU1zV1VGQldTeExRVUZMTEZsQlFWa3NRMEZCUXl4RFFVRkRPMUZCUTNaSExFbEJRVWtzV1VGQldTeExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPMWxCUTNoQ0xFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNkVVJCUVhWRUxGbEJRVmtzWlVGQlpTeERRVUZETEVOQlFVTTdXVUZEYkVjc1QwRkJUenRUUVVOUU8xRkJSVVFzU1VGQlNTeERRVUZETERSQ1FVRTBRaXhEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRNMFFzUTBGQlF6dEpRVVZOTERCQ1FVRXdRaXhEUVVGRExGbEJRVzlDTzFGQlEzSkVMRTFCUVUwc1dVRkJXU3hIUVVOcVFpeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRk5CUVZNc1EwRkJReXhUUVVGVExFTkJRVU1zUlVGQlJTeERRVUZETEZOQlFWTXNRMEZCUXl4WlFVRlpMRXRCUVVzc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRGJrWXNTVUZCU1N4WlFVRlpMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3V1VGRGVFSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXh6UTBGQmMwTXNXVUZCV1N4bFFVRmxMRU5CUVVNc1EwRkJRenRaUVVOb1JpeFBRVUZQTzFOQlExQTdVVUZGUkN4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRNME1zUTBGQlF6dEpRVVZOTEhkQ1FVRjNRaXhEUVVGRExGbEJRVzlDTzFGQlEyNUVMRTFCUVUwc1dVRkJXU3hIUVVOcVFpeEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhQUVVGUExFTkJRVU1zUlVGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRXRCUVVzc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRE4wVXNTVUZCU1N4WlFVRlpMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3V1VGRGVFSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXh2UTBGQmIwTXNXVUZCV1N4bFFVRmxMRU5CUVVNc1EwRkJRenRaUVVNNVJTeFBRVUZQTzFOQlExQTdVVUZGUkN4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRla01zUTBGQlF6dEpRVVZOTEhkQ1FVRjNRaXhEUVVGRExGbEJRVzlDTzFGQlEyNUVMRTFCUVUwc1dVRkJXU3hIUVVOcVFpeEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhQUVVGUExFTkJRVU1zUlVGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRXRCUVVzc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRE4wVXNTVUZCU1N4WlFVRlpMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3V1VGRGVFSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXh2UTBGQmIwTXNXVUZCV1N4bFFVRmxMRU5CUVVNc1EwRkJRenRaUVVNNVJTeFBRVUZQTzFOQlExQTdVVUZGUkN4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRla01zUTBGQlF6dEpRVVZOTERoQ1FVRTRRaXhEUVVGRExGbEJRVzlDTzFGQlEzcEVMRTFCUVUwc1dVRkJXU3hIUVVOcVFpeEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVTBGQlV5eERRVUZETEdGQlFXRXNRMEZCUXl4RlFVRkZMRU5CUVVNc1lVRkJZU3hEUVVGRExGbEJRVmtzUzBGQlN5eFpRVUZaTEVOQlFVTXNRMEZCUXp0UlFVTXZSaXhKUVVGSkxGbEJRVmtzUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0WlFVTjRRaXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEhGRVFVRnhSQ3haUVVGWkxHVkJRV1VzUTBGQlF5eERRVUZETzFsQlF5OUdMRTlCUVU4N1UwRkRVRHRSUVVWRUxFbEJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhOUVVGTkxFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUXk5RExFTkJRVU03U1VGRlRTeHZRMEZCYjBNc1EwRkJReXhUUVVGcFFqdFJRVU0xUkN4TlFVRk5MRmxCUVZrc1IwRkRha0lzU1VGQlNTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExGTkJRVk1zUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhUUVVGVExFdEJRVXNzVTBGQlV5eERRVUZETEVOQlFVTTdVVUZETTBVc1NVRkJTU3haUVVGWkxFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdXVUZEZUVJc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eHhSRUZCY1VRc1UwRkJVeXhsUVVGbExFTkJRVU1zUTBGQlF6dFpRVU0xUml4UFFVRlBPMU5CUTFBN1VVRkZSQ3hKUVVGSkxFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1RVRkJUU3hEUVVGRExGbEJRVmtzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTnlSQ3hEUVVGRE8wbEJSVTBzZDBKQlFYZENMRU5CUVVNc1ZVRkJhMEk3VVVGRGFrUXNTVUZCU1N4RFFVRkRMRzlDUVVGdlFpeEZRVUZGTEVOQlFVTTdVVUZGTlVJc05rSkJRVFpDTzFGQlF6ZENMRWxCUVVrc1ZVRkJWU3hIUVVGSExFTkJRVU1zU1VGQlNTeFZRVUZWTEVsQlFVa3NTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeEZRVUZGTzFsQlF6TkVMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zSzBOQlFTdERMRU5CUVVNN1UwRkROMFE3VVVGRlJDeExRVUZMTEUxQlFVMHNaVUZCWlN4SlFVRkpMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRVVU3V1VGREwwTXNUVUZCVFN4WlFVRlpMRWRCUTJwQ0xHVkJRV1VzUTBGQlF5eFRRVUZUTEVOQlFVTXNZMEZCWXl4RFFVRkRMRVZCUVVVc1EwRkJReXhqUVVGakxFTkJRVU1zVlVGQlZTeExRVUZMTEZWQlFWVXNRMEZCUXl4RFFVRkRPMWxCUTNaR0xFbEJRVWtzV1VGQldTeExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPMmRDUVVONFFpeGxRVUZsTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmxCUVZrc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEZUVNc1QwRkJUenRoUVVOUU8xTkJRMFE3VVVGRlJDeFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMR3RGUVVGclJTeFZRVUZWTEVWQlFVVXNRMEZCUXl4RFFVRkRPMGxCUXpsR0xFTkJRVU03U1VGRlJDdzBSMEZCTkVjN1NVRkROVWNzYlVOQlFXMURPMGxCUTI1RExEUkhRVUUwUnp0SlFVVnlSeXh4UWtGQmNVSTdVVUZETTBJc1RVRkJUU3haUVVGWkxFZEJRVWM3V1VGRGNFSXNTVUZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhyUWtGQmEwSXNSVUZCUlR0WlFVTXZRaXhYUVVGWExFVkJRVVVzU1VGQlNTeERRVUZETEdGQlFXRTdXVUZETDBJc1owSkJRV2RDTEVWQlFVVXNTVUZCU1N4RFFVRkRMR0ZCUVdFc1MwRkJTeXhWUVVGVk8xTkJRMjVFTEVOQlFVTTdVVUZGUml4UFFVRlBMRmxCUVZrc1EwRkJRenRKUVVOeVFpeERRVUZETzBsQlJVUXNORWRCUVRSSE8wbEJRelZITEd0Q1FVRnJRanRKUVVOc1FpdzBSMEZCTkVjN1NVRkZjRWNzVFVGQlRTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExFMUJRV2RDTzFGQlEzSkVMRXRCUVVzc1RVRkJUU3hMUVVGTExFbEJRVWtzVFVGQlRTeEZRVUZGTzFsQlF6TkNMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVTBGQlV5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZPMmRDUVVNM1FpeFBRVUZQTEVsQlFVa3NRMEZCUXp0aFFVTmFPMU5CUTBRN1VVRkRSQ3hQUVVGUExFdEJRVXNzUTBGQlF6dEpRVU5rTEVOQlFVTTdTVUZGUkN3MFJFRkJORVE3U1VGRE5VUXNNa05CUVRKRE8wbEJSVE5ETEhWR1FVRjFSanRKUVVNdlJTeHJRa0ZCYTBJN1VVRkRla0lzU1VGQlNTeERRVUZETEc5Q1FVRnZRaXhGUVVGRkxFTkJRVU03VVVGRk5VSXNUVUZCVFN4SlFVRkpMRWRCUTFBc2NVSkJRWEZDTzJOQlEzSkNMRWxCUVVrc1EwRkJReXhwUTBGQmFVTXNSVUZCUlR0alFVTjRReXhKUVVGSkxFTkJRVU1zTWtKQlFUSkNMRVZCUVVVN1kwRkRiRU1zU1VGQlNTeERRVUZETEdsRFFVRnBReXhGUVVGRk8yTkJRM2hETEVsQlFVa3NRMEZCUXl4clEwRkJhME1zUlVGQlJUdGpRVU42UXl4SlFVRkpMRU5CUVVNc2NVTkJRWEZETEVWQlFVVTdZMEZETlVNc1NVRkJTU3hEUVVGRExESkRRVUV5UXl4RlFVRkZPMk5CUTJ4RUxFbEJRVWtzUTBGQlF5eHpRMEZCYzBNc1JVRkJSVHRqUVVNM1F5eEpRVUZKTEVOQlFVTXNiME5CUVc5RExFVkJRVVU3WTBGRE0wTXNTVUZCU1N4RFFVRkRMSGREUVVGM1F5eEZRVUZGTzJOQlF5OURMRWxCUVVrc1EwRkJReXh2UTBGQmIwTXNSVUZCUlR0alFVTXpReXhKUVVGSkxFTkJRVU1zTUVOQlFUQkRMRVZCUVVVN1kwRkRha1FzU1VGQlNTeERRVUZETEhGRFFVRnhReXhGUVVGRk8yTkJRelZETEVsQlFVa3NRMEZCUXl4dlEwRkJiME1zUlVGQlJUdGpRVU16UXl4SlFVRkpMRU5CUVVNc2QwTkJRWGRETEVWQlFVVXNRMEZCUXp0UlFVVnVSQ3hQUVVGUExFbEJRVWtzUTBGQlF6dEpRVU5pTEVOQlFVTTdTVUZGVHl4dlFrRkJiMEk3TzFGQlF6TkNMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0WlFVTnFSQ3hKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTXNRMEZCUXl4VFFVRkhMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU1zUTBGQlF5eERRVUZETEcxRFFVRkpMRVZCUVVVc1EwRkJRenRUUVVOb1JEdEpRVU5HTEVOQlFVTTdTVUZGVHl4cFEwRkJhVU03VVVGRGVFTXNTVUZCU1N4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRE8xRkJRM0JDTEV0QlFVc3NUVUZCVFN4dFFrRkJiVUlzU1VGQlNTeEpRVUZKTEVOQlFVTXNjMEpCUVhOQ0xFVkJRVVU3V1VGRE9VUXNWVUZCVlN4SlFVRkpMRmRCUVZjc2JVSkJRVzFDTEVsQlFVa3NRMEZCUXp0VFFVTnFSRHRSUVVWRUxFOUJRVThzYVVKQlFVOHNRMEZCUXl3clFrRkJLMElzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXp0UlFVRkJMRU5CUVVNN1NVRkROMFFzUTBGQlF6dEpRVVZQTERKQ1FVRXlRanRSUVVOc1F5eEpRVUZKTEZWQlFWVXNSMEZCUnl4RlFVRkZMRU5CUVVNN1VVRkRjRUlzUzBGQlN5eE5RVUZOTEZOQlFWTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1dVRkJXU3hGUVVGRk8xbEJRekZETEZWQlFWVXNTVUZCU1N4alFVRmpMRk5CUVZNc1EwRkJReXhoUVVGaExFdEJRVXNzVTBGQlV5eERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRPMU5CUXk5Rk8xRkJSVVFzVDBGQlR5eHBRa0ZCVHl4RFFVRkRMQ3RDUVVFclFpeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPMGxCUXpWRUxFTkJRVU03U1VGRlJDeHJRMEZCYTBNN1NVRkRNVUlzYVVOQlFXbERPMUZCUTNoRExFbEJRVWtzVlVGQlZTeEhRVUZITEVWQlFVVXNRMEZCUXp0UlFVTndRaXhMUVVGTExFMUJRVTBzU1VGQlNTeEpRVUZKTEVsQlFVa3NRMEZCUXl4cFFrRkJhVUlzUlVGQlJUdFpRVU14UXl4TlFVRk5MR0ZCUVdFc1IwRkJSeXhKUVVGblF5eERRVUZETzFsQlEzWkVMRTFCUVUwc2EwSkJRV3RDTEVkQlFVY3NTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEdGQlFXRXNRMEZCUXl4RFFVRkRPMWxCUldwRkxGVkJRVlVzU1VGQlNTeGhRVUZoTEd0Q1FVRnJRaXhKUVVGSkxHRkJRV0VzUzBGQlN5eERRVUZETzFOQlEzQkZPMUZCUlVRc1QwRkJUeXhwUWtGQlR5eERRVUZETEN0Q1FVRXJRaXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETzBsQlF6VkVMRU5CUVVNN1NVRkZUeXhyUTBGQmEwTTdVVUZEZWtNc1NVRkJTU3hWUVVGVkxFZEJRVWNzUlVGQlJTeERRVUZETzFGQlEzQkNMRXRCUVVzc1RVRkJUU3huUWtGQlowSXNTVUZCU1N4SlFVRkpMRU5CUVVNc2JVSkJRVzFDTEVWQlFVVTdXVUZEZUVRc1ZVRkJWU3hKUVVGSkxGVkJRVlVzWjBKQlFXZENMRU5CUVVNc1ZVRkJWU3hOUVVGTkxFTkJRVU03V1VGRk1VUXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEdkQ1FVRm5RaXhEUVVGRExHRkJRV0VzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJReTlFTEUxQlFVMHNVVUZCVVN4SFFVRkhMR2RDUVVGblFpeERRVUZETEdGQlFXRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGRmJrUXNWVUZCVlN4SlFVRkpMRWxCUVVrc1EwRkJRenRuUWtGRGJrSXNTVUZCU1N4UlFVRlJMRU5CUVVNc1UwRkJVeXhKUVVGSkxFbEJRVWtzUlVGQlJUdHZRa0ZETDBJc1ZVRkJWU3hKUVVGSkxFZEJRVWNzVVVGQlVTeERRVUZETEZOQlFWTXNSMEZCUnl4RFFVRkRPMmxDUVVOMlF6dG5Ra0ZGUkN4VlFVRlZMRWxCUVVrc1IwRkJSeXhSUVVGUkxFTkJRVU1zU1VGQlNTeEpRVUZKTEZGQlFWRXNRMEZCUXl4VlFVRlZMRXRCUVVzc1EwRkJRenRoUVVNelJEdFpRVVZFTEZWQlFWVXNTVUZCU1N4TlFVRk5MRU5CUVVNN1UwRkRja0k3VVVGRlJDeFBRVUZQTEdsQ1FVRlBMRU5CUVVNc0swSkJRU3RDTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNN1NVRkROVVFzUTBGQlF6dEpRVVZQTEhGRFFVRnhRenRSUVVNMVF5eEpRVUZKTEZWQlFWVXNSMEZCUnl4RlFVRkZMRU5CUVVNN1VVRkRjRUlzUzBGQlN5eE5RVUZOTEcxQ1FVRnRRaXhKUVVGSkxFbEJRVWtzUTBGQlF5eHpRa0ZCYzBJc1JVRkJSVHRaUVVNNVJDeE5RVUZOTEVsQlFVa3NSMEZCUnl4dFFrRkJiVUlzUTBGQlF5eEpRVUZKTEVOQlFVTTdXVUZEZEVNc1RVRkJUU3haUVVGWkxFZEJRVWNzYlVKQlFXMUNMRU5CUVVNc1dVRkJXU3hEUVVGRE8xbEJRM1JFTEUxQlFVMHNTMEZCU3l4SFFVRkhMRzFDUVVGdFFpeERRVUZETEUxQlFVMHNRMEZCUXp0WlFVVjZReXhWUVVGVkxFbEJRVWtzVTBGQlV5eEpRVUZKTEVsQlFVa3NXVUZCV1N4TlFVRk5MRWxCUVVrc1IwRkJSeXhEUVVGRE8xbEJRM3BFTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8yZENRVU4wUXl4VlFVRlZMRWxCUVVrc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXp0aFFVTTVRanRaUVVWRUxGVkJRVlVzUjBGQlJ5eFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dFRRVU5vUkR0UlFVVkVMRTlCUVU4c2FVSkJRVThzUTBGQlF5d3JRa0ZCSzBJc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF6dEpRVU0xUkN4RFFVRkRPMGxCUlU4c01rTkJRVEpETzFGQlEyeEVMRWxCUVVrc1ZVRkJWU3hIUVVGSExFVkJRVVVzUTBGQlF6dFJRVU53UWl4TFFVRkxMRTFCUVUwc1YwRkJWeXhKUVVGSkxFbEJRVWtzUTBGQlF5dzBRa0ZCTkVJc1JVRkJSVHRaUVVNMVJDeE5RVUZOTEZsQlFWa3NSMEZEYWtJc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRk5CUVZNc1EwRkJReXhWUVVGVkxFTkJRVU1zUlVGQlJTeERRVUZETEZWQlFWVXNRMEZCUXl4VlFVRlZMRXRCUVVzc1YwRkJWeXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETzFsQlEzQkhMRWxCUVVrc1dVRkJXU3hMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTzJkQ1FVTjRRaXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEdkRlFVRm5SU3hYUVVGWExFTkJRVU1zVlVGQlZTeHBRa0ZCYVVJc1EwRkJReXhEUVVGRE8yZENRVU4yU0N4VFFVRlRPMkZCUTFRN1dVRkZSQ3hWUVVGVkxFbEJRVWtzVTBGQlV5eFhRVUZYTEVOQlFVTXNWVUZCVlN4SlFVRkpMRmRCUVZjc1EwRkJReXhaUVVGWkxFMUJRVTBzVjBGQlZ5eERRVUZETEZWQlFWVXNUVUZCVFN4RFFVRkRPMWxCUlRWSExFMUJRVTBzWjBKQlFXZENMRWRCUVVjc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8xbEJRMmhGTEVsQlFVa3NaMEpCUVdkQ0xFTkJRVU1zWVVGQllTeERRVUZETEUxQlFVMHNTMEZCU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVN1owSkJRM0pHTEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc2FVWkJRV2xHTEZkQlFWY3NRMEZCUXl4WlFVRlpMRTFCUVUwc1EwRkJReXhEUVVGRE8yZENRVU12U0N4VFFVRlRPMkZCUTFRN1dVRkZSQ3hOUVVGTkxHTkJRV01zUjBGRGJrSXNaMEpCUVdkQ0xFTkJRVU1zWVVGQllTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1JVRkJSU3hEUVVGRExHbENRVUZQTEVOQlFVTXNZMEZCWXl4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEyaEhMRWxCUVVrc1kwRkJZeXhGUVVGRk8yZENRVU51UWl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExIRkZRVUZ4UlN4WFFVRlhMRU5CUVVNc1dVRkJXU3h6UTBGQmMwTXNRMEZCUXl4RFFVRkRPMmRDUVVOdVNpeFRRVUZUTzJGQlExUTdXVUZGUkN4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NaMEpCUVdkQ0xFTkJRVU1zWVVGQllTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRuUWtGREwwUXNUVUZCVFN4WlFVRlpMRWRCUVVjc1owSkJRV2RDTEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExGVkJRVlVzUTBGQlF6dG5Ra0ZEYkVVc1RVRkJUU3hMUVVGTExFZEJRVWNzVjBGQlZ5eERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRU5CUVVNN1owSkJRemxETEVsQlFVa3NTMEZCU3l4SlFVRkpMRWxCUVVrc1JVRkJSVHR2UWtGRGJFSXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhuUkVGQlowUXNWMEZCVnl4RFFVRkRMRmxCUVZrc0swSkJRU3RDTEZsQlFWa3NSVUZCUlN4RFFVRkRMRU5CUVVNN2IwSkJRM0pKTEZOQlFWTTdhVUpCUTFRN1owSkJSVVFzVFVGQlRTeEpRVUZKTEVkQlFVY3NaMEpCUVdkQ0xFTkJRVU1zWVVGQllTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJRenRuUWtGRGNFUXNUVUZCVFN4elFrRkJjMElzUjBGQlJ5eHBRa0ZCVHl4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRuUWtGRE0wVXNTVUZCU1N4RFFVRkRMSE5DUVVGelFpeEZRVUZGTzI5Q1FVTTFRaXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEhWRlFVRjFSU3haUVVGWkxFOUJRVThzVjBGQlZ5eERRVUZETEZsQlFWa3NZVUZCWVN4RFFVRkRMRU5CUVVNN2IwSkJReTlKTEZOQlFWTTdhVUpCUTFRN1owSkJSVVFzVlVGQlZTeEpRVUZKTEV0QlFVc3NTVUZCU1N4SFFVRkhMRU5CUVVNN1owSkJRek5DTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8yOUNRVU4wUXl4VlFVRlZMRWxCUVVrc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXp0cFFrRkRPVUk3WjBKQlJVUXNWVUZCVlN4SFFVRkhMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRPMkZCUTJoRU8xbEJSVVFzVlVGQlZTeEhRVUZITEZWQlFWVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRkxGRkJRVkVzUTBGQlF5eERRVUZETzFOQlEyeEVPMUZCUlVRc1QwRkJUeXhwUWtGQlR5eERRVUZETEN0Q1FVRXJRaXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETzBsQlF6VkVMRU5CUVVNN1NVRkZUeXh6UTBGQmMwTTdVVUZETjBNc1NVRkJTU3hWUVVGVkxFZEJRVWNzUlVGQlJTeERRVUZETzFGQlEzQkNMRXRCUVVzc1RVRkJUU3hUUVVGVExFbEJRVWtzU1VGQlNTeERRVUZETEZsQlFWa3NSVUZCUlR0WlFVTXhReXhKUVVGSkxGTkJRVk1zUTBGQlF5eFJRVUZSTEVsQlFVa3NTVUZCU1N4RlFVRkZPMmRDUVVNdlFpeFZRVUZWTEVsQlFVa3NjMEpCUVhOQ0xGTkJRVk1zUTBGQlF5eFJRVUZSTEVsQlFVa3NRMEZCUXp0aFFVTXpSRHRaUVVWRUxGVkJRVlVzU1VGQlNTeExRVUZMTEVOQlFVTTdXVUZGY0VJc1NVRkJTU3hUUVVGVExFTkJRVU1zVTBGQlV5eEpRVUZKTEVsQlFVa3NSVUZCUlR0blFrRkRhRU1zVlVGQlZTeEpRVUZKTEVkQlFVY3NVMEZCVXl4RFFVRkRMRk5CUVZNc1IwRkJSeXhEUVVGRE8yRkJRM2hETzFsQlJVUXNWVUZCVlN4SlFVRkpMRWRCUVVjc1UwRkJVeXhEUVVGRExFbEJRVWtzU1VGQlNTeFRRVUZUTEVOQlFVTXNXVUZCV1N4TFFVRkxMRU5CUVVNN1UwRkRMMFE3VVVGRlJDeFBRVUZQTEdsQ1FVRlBMRU5CUVVNc0swSkJRU3RDTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNN1NVRkROVVFzUTBGQlF6dEpRVVZQTEc5RFFVRnZRenRSUVVNelF5eEpRVUZKTEZWQlFWVXNSMEZCUnl4RlFVRkZMRU5CUVVNN1VVRkRjRUlzUzBGQlN5eE5RVUZOTEU5QlFVOHNTVUZCU1N4SlFVRkpMRU5CUVVNc1ZVRkJWU3hGUVVGRk8xbEJRM1JETEVsQlFVa3NUMEZCVHl4RFFVRkRMR2xDUVVGcFFpeEpRVUZKTEVsQlFVa3NSVUZCUlR0blFrRkRkRU1zVlVGQlZTeEpRVUZKTEVkQlFVY3NUMEZCVHl4RFFVRkRMR2xDUVVGcFFpeEhRVUZITEVOQlFVTTdZVUZET1VNN1dVRkZSQ3hWUVVGVkxFbEJRVWtzU1VGQlNTeERRVUZETEdGQlFXRXNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMWxCUlRsRUxFbEJRVWtzVDBGQlR5eERRVUZETEZOQlFWTXNTVUZCU1N4SlFVRkpMRVZCUVVVN1owSkJRemxDTEZWQlFWVXNTVUZCU1N4SFFVRkhMRTlCUVU4c1EwRkJReXhUUVVGVExFZEJRVWNzUTBGQlF6dGhRVU4wUXp0WlFVVkVMRlZCUVZVc1NVRkJTU3hIUVVGSExFOUJRVThzUTBGQlF5eEpRVUZKTEVsQlFVa3NUMEZCVHl4RFFVRkRMRmxCUVZrc1MwRkJTeXhEUVVGRE8xTkJRek5FTzFGQlJVUXNUMEZCVHl4cFFrRkJUeXhEUVVGRExDdENRVUVyUWl4RFFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRE8wbEJRelZFTEVOQlFVTTdTVUZGUkN3clFrRkJLMEk3U1VGRGRrSXNkME5CUVhkRE8xRkJReTlETEVsQlFVa3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1MwRkJTeXhWUVVGVkxFVkJRVVU3V1VGRGRFTXNUMEZCVHl4RlFVRkZMRU5CUVVNN1UwRkRWanRSUVVWRUxFOUJRVThzYVVOQlFXbERMRWxCUVVrc1EwRkJReXg1UWtGQmVVSXNUMEZCVHl4RFFVRkRPMGxCUXk5RkxFTkJRVU03U1VGRlR5eHZRMEZCYjBNN1VVRkRNME1zU1VGQlNTeFZRVUZWTEVkQlFVY3NSVUZCUlN4RFFVRkRPMUZCUTNCQ0xFdEJRVXNzVFVGQlRTeFBRVUZQTEVsQlFVa3NTVUZCU1N4RFFVRkRMRlZCUVZVc1JVRkJSVHRaUVVOMFF5eFZRVUZWTEVsQlFVa3NWVUZCVlN4RFFVRkRPMWxCUlhwQ0xFbEJRVWtzVDBGQlR5eERRVUZETEZOQlFWTXNTVUZCU1N4SlFVRkpMRVZCUVVVN1owSkJRemxDTEZWQlFWVXNTVUZCU1N4SFFVRkhMRTlCUVU4c1EwRkJReXhUUVVGVExFZEJRVWNzUTBGQlF6dGhRVU4wUXp0WlFVVkVMRlZCUVZVc1NVRkJTU3hIUVVGSExFOUJRVThzUTBGQlF5eEpRVUZKTEVsQlFVa3NUMEZCVHl4RFFVRkRMRmxCUVZrc1MwRkJTeXhEUVVGRE8xTkJRek5FTzFGQlJVUXNUMEZCVHl4cFFrRkJUeXhEUVVGRExDdENRVUVyUWl4RFFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRE8wbEJRelZFTEVOQlFVTTdTVUZGVHl3d1EwRkJNRU03VVVGRGFrUXNTVUZCU1N4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRE8xRkJRM0JDTEV0QlFVc3NUVUZCVFN4aFFVRmhMRWxCUVVrc1NVRkJTU3hEUVVGRExHZENRVUZuUWl4RlFVRkZPMWxCUTJ4RUxFMUJRVTBzVlVGQlZTeEhRVUZITEdGQlFXRXNRMEZCUXl4VlFVRlZMRU5CUVVNN1dVRkZOVU1zVFVGQlRTeHhRa0ZCY1VJc1IwRkRNVUlzU1VGQlNTeERRVUZETEcxQ1FVRnRRaXhEUVVGRExFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNSVUZCUlN4RFFVRkRMRlZCUVZVc1EwRkJReXhWUVVGVkxFdEJRVXNzVlVGQlZTeERRVUZETEVOQlFVTTdXVUZEYmtZc1NVRkJTU3hEUVVGRExIRkNRVUZ4UWl4RlFVRkZPMmRDUVVNelFpeFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMQ3RFUVVFclJDeFZRVUZWTEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03WjBKQlF6RkhMRk5CUVZNN1lVRkRWRHRaUVVWRUxGVkJRVlVzU1VGQlNTeFhRVUZYTEZWQlFWVXNTVUZCU1N4aFFVRmhMRU5CUVVNc1dVRkJXU3hMUVVGTExFTkJRVU03VTBGRGRrVTdVVUZGUkN4UFFVRlBMR2xDUVVGUExFTkJRVU1zSzBKQlFTdENMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03U1VGRE5VUXNRMEZCUXp0SlFVVlBMSEZEUVVGeFF6dFJRVU0xUXl4SlFVRkpMRlZCUVZVc1IwRkJSeXhGUVVGRkxFTkJRVU03VVVGRGNFSXNTMEZCU3l4TlFVRk5MRWRCUVVjc1NVRkJTU3hKUVVGSkxFTkJRVU1zYzBKQlFYTkNMRVZCUVVVN1dVRkRPVU1zVlVGQlZTeEpRVUZKTERKQ1FVRXlRaXhIUVVGSExFTkJRVU1zVTBGQlV5eE5RVUZOTEVOQlFVTTdXVUZGTjBRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhsUVVGbExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMmRDUVVOd1JDeE5RVUZOTEZkQlFWY3NSMEZCUnl4SFFVRkhMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTXpReXhWUVVGVkxFbEJRVWtzUzBGQlN5eFhRVUZYTEVOQlFVTXNTVUZCU1N4SlFVRkpMRmRCUVZjc1EwRkJReXhaUVVGWkxFdEJRVXNzUTBGQlF6dGhRVU55UlR0WlFVVkVMRWxCUVVrc1IwRkJSeXhEUVVGRExGbEJRVmtzU1VGQlNTeEpRVUZKTEVWQlFVVTdaMEpCUXpkQ0xGVkJRVlVzU1VGQlNTeExRVUZMTEVkQlFVY3NRMEZCUXl4WlFVRlpMRXRCUVVzc1EwRkJRenRoUVVONlF6dHBRa0ZCVFR0blFrRkRUaXhWUVVGVkxFbEJRVWtzVFVGQlRTeERRVUZETzJGQlEzSkNPMU5CUTBRN1VVRkZSQ3hQUVVGUExHbENRVUZQTEVOQlFVTXNLMEpCUVN0Q0xFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdTVUZETlVRc1EwRkJRenRKUVVWUExHOURRVUZ2UXp0UlFVTXpReXhKUVVGSkxGVkJRVlVzUjBGQlJ5eEZRVUZGTEVOQlFVTTdVVUZEY0VJc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUTJwRUxFMUJRVTBzWlVGQlpTeEhRVUZITEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRE5VTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEdWQlFXVXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEyaEVMRlZCUVZVc1NVRkJTU3hsUVVGbExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJRenRoUVVOeVJEdFRRVU5FTzFGQlJVUXNUMEZCVHl4cFFrRkJUeXhEUVVGRExDdENRVUVyUWl4RFFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRE8wbEJRelZFTEVOQlFVTTdTVUZGVHl4M1EwRkJkME03VVVGREwwTXNUMEZCVHl4SlFVRkpMRU5CUVVNc2EwSkJRV3RDTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUTNaRExFTkJRVU03UTBGRFJEdEJRVzU1UWtRc2VVTkJiWGxDUXpzN096czdPenM3T3pzN096czdPMEZETDNwQ1JDeE5RVUZ4UWl4UFFVRlBPMGxCUXpOQ0xFMUJRVTBzUTBGQlF5eHZRa0ZCYjBJc1EwRkJReXhOUVVGak8xRkJRM3BETEU5QlFVOHNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEpRVU5vUXl4RFFVRkRPMGxCUlVRc1RVRkJUU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRmxCUVhOQ08xRkJRemxETEU5QlFVOHNXVUZCV1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dEpRVU5vUXl4RFFVRkRPMGxCUlVRc1RVRkJUU3hEUVVGRExDdENRVUVyUWl4RFFVRkRMRTFCUVdNN1VVRkRjRVFzVDBGQlR5eE5RVUZOTEV0QlFVc3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRMME1zUTBGQlF6dEpRVVZFTEUxQlFVMHNRMEZCUXl4blFrRkJaMElzUTBGRGRFSXNTVUZCTmtjN1VVRkZOMGNzU1VGQlNTeGxRVUZsTEVOQlFVTTdVVUZEY0VJc1NVRkRReXhKUVVGSkxFdEJRVXNzVDBGQlR5eEpRVUZKTEVsQlFVa3NTMEZCU3l4TFFVRkxMRWxCUVVrc1NVRkJTU3hMUVVGTExFMUJRVTBzU1VGQlNTeEpRVUZKTEV0QlFVc3NUVUZCVFR0WlFVTjRSU3hKUVVGSkxFdEJRVXNzVjBGQlZ5eEpRVUZKTEVsQlFVa3NTMEZCU3l4aFFVRmhMRWxCUVVrc1NVRkJTU3hMUVVGTExGZEJRVmNzU1VGQlNTeEpRVUZKTEV0QlFVc3NaMEpCUVdkQ08xbEJRMjVITEVsQlFVa3NTMEZCU3l4WlFVRlpMRWxCUVVrc1NVRkJTU3hMUVVGTExHTkJRV01zU1VGQlNTeEpRVUZKTEV0QlFVc3NXVUZCV1N4SlFVRkpMRWxCUVVrc1MwRkJTeXhwUWtGQmFVSTdXVUZEZGtjc1NVRkJTU3hMUVVGTExGbEJRVmtzU1VGQlNTeEpRVUZKTEV0QlFVc3NZMEZCWXl4SlFVRkpMRWxCUVVrc1MwRkJTeXhaUVVGWkxFbEJRVWtzU1VGQlNTeExRVUZMTEdsQ1FVRnBRanRaUVVOMlJ5eEpRVUZKTEV0QlFVc3NhVUpCUVdsQ0xFbEJRVWtzU1VGQlNTeExRVUZMTEcxQ1FVRnRRaXhKUVVGSkxFbEJRVWtzUzBGQlN5eHpRa0ZCYzBJc1JVRkROVVk3V1VGRFJDeGxRVUZsTEVkQlFVY3NRMEZCUXl4RFFVRkRPMU5CUTNCQ08yRkJRVTBzU1VGQlNTeEpRVUZKTEV0QlFVc3NUVUZCVFN4SlFVRkpMRWxCUVVrc1MwRkJTeXhQUVVGUExFbEJRVWtzU1VGQlNTeExRVUZMTEU5QlFVOHNTVUZCU1N4SlFVRkpMRXRCUVVzc1QwRkJUeXhGUVVGRk8xbEJRM1pHTEdWQlFXVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1UwRkRjRUk3WVVGQlRTeEpRVUZKTEVsQlFVa3NTMEZCU3l4TlFVRk5MRWxCUVVrc1NVRkJTU3hMUVVGTExFOUJRVThzU1VGQlNTeEpRVUZKTEV0QlFVc3NUMEZCVHl4SlFVRkpMRWxCUVVrc1MwRkJTeXhQUVVGUExFVkJRVVU3V1VGRGRrWXNaVUZCWlN4SFFVRkhMRU5CUVVNc1EwRkJRenRUUVVOd1FqdGhRVUZOTEVsQlFVa3NTVUZCU1N4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxFdEJRVXNzVDBGQlR5eEpRVUZKTEVsQlFVa3NTMEZCU3l4UFFVRlBMRWxCUVVrc1NVRkJTU3hMUVVGTExFOUJRVThzU1VGQlNTeEpRVUZKTEV0QlFVc3NUVUZCVFN4SlFVRkpMRWxCUVVrc1MwRkJTeXhSUVVGUkxFVkJRVVU3V1VGREwwZ3NaVUZCWlN4SFFVRkhMRU5CUVVNc1EwRkJRenRUUVVOd1FqdGhRVUZOTEVsQlFVa3NTVUZCU1N4TFFVRkxMRkZCUVZFc1NVRkJTU3hKUVVGSkxFdEJRVXNzVVVGQlVTeEZRVUZGTzFsQlEyeEVMR1ZCUVdVc1IwRkJSeXhEUVVGRExFTkJRVU03VTBGRGNFSTdZVUZCVFN4SlFVRkpMRWxCUVVrc1MwRkJTeXhSUVVGUkxFbEJRVWtzU1VGQlNTeExRVUZMTEZGQlFWRXNSVUZCUlR0WlFVTnNSQ3hsUVVGbExFZEJRVWNzUTBGQlF5eERRVUZETzFOQlEzQkNPMkZCUVUwc1NVRkJTU3hKUVVGSkxFdEJRVXNzVFVGQlRTeEpRVUZKTEVsQlFVa3NTMEZCU3l4UlFVRlJMRVZCUVVVN1dVRkRhRVFzWlVGQlpTeEhRVUZITEVOQlFVTXNRMEZCUXp0VFFVTndRanRoUVVGTkxFbEJRVWtzU1VGQlNTeExRVUZMTEZGQlFWRXNTVUZCU1N4SlFVRkpMRXRCUVVzc1VVRkJVU3hGUVVGRk8xbEJRMnhFTEdWQlFXVXNSMEZCUnl4RlFVRkZMRU5CUVVNN1UwRkRja0k3WVVGQlRTeEpRVUZKTEVsQlFVa3NTMEZCU3l4TlFVRk5MRWxCUVVrc1NVRkJTU3hMUVVGTExGRkJRVkVzUlVGQlJUdFpRVU5vUkN4bFFVRmxMRWRCUVVjc1JVRkJSU3hEUVVGRE8xTkJRM0pDTzJGQlFVMDdXVUZEVGl4bFFVRmxPMWxCUTJZc1pVRkJaU3hIUVVGSExFTkJRVU1zUTBGQlF6dFpRVU53UWl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExDdERRVUVyUXl4RFFVRkRMRU5CUVVNN1UwRkRMMFE3VVVGRlJDeFBRVUZQTEdWQlFXVXNRMEZCUXp0SlFVTjRRaXhEUVVGRE8wbEJSVVFzVFVGQlRTeERRVUZETEZWQlFWVXNRMEZEYUVJc1NVRkJOa2M3VVVGRk4wY3NTVUZEUXl4SlFVRkpMRXRCUVVzc1MwRkJTeXhKUVVGSkxFbEJRVWtzUzBGQlN5eFBRVUZQTEVsQlFVa3NTVUZCU1N4TFFVRkxMRTlCUVU4c1NVRkJTU3hKUVVGSkxFdEJRVXNzVDBGQlR6dFpRVU14UlN4SlFVRkpMRXRCUVVzc1RVRkJUU3hKUVVGSkxFbEJRVWtzUzBGQlN5eFBRVUZQTEVsQlFVa3NTVUZCU1N4TFFVRkxMRTlCUVU4c1NVRkJTU3hKUVVGSkxFdEJRVXNzVDBGQlR5eEZRVU14UlR0WlFVTkVMRTlCUVU4c1NVRkJTU3hEUVVGRE8xTkJRMW83WVVGQlRUdFpRVU5PTEU5QlFVOHNTMEZCU3l4RFFVRkRPMU5CUTJJN1NVRkRSaXhEUVVGRE8wbEJSVVFzVFVGQlRTeERRVUZETEhOQ1FVRnpRaXhEUVVNMVFpeEpRVUUyUnl4RlFVTTNSeXhOUVVGblFqdFJRVVZvUWl4TlFVRk5MRzFDUVVGdFFpeEhRVUZITEU5QlFVOHNRMEZCUXl4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0UlFVTXpSQ3hKUVVGSkxHMUNRVUZ0UWl4TFFVRkxMRTFCUVUwc1EwRkJReXhOUVVGTkxFVkJRVVU3V1VGRE1VTXNUMEZCVHl4SlFVRkpMRU5CUVVNN1UwRkRXanRSUVVORUxFOUJRVThzUzBGQlN5eERRVUZETzBsQlEyUXNRMEZCUXp0SlFVVkVMRTFCUVUwc1EwRkJReXhqUVVGakxFTkJRM0JDTEVsQlFUWkhPMUZCUlRkSExFbEJRME1zU1VGQlNTeExRVUZMTEZkQlFWY3NTVUZCU1N4SlFVRkpMRXRCUVVzc1lVRkJZU3hKUVVGSkxFbEJRVWtzUzBGQlN5eFhRVUZYTEVsQlFVa3NTVUZCU1N4TFFVRkxMR2RDUVVGblFqdFpRVU51Unl4SlFVRkpMRXRCUVVzc1dVRkJXU3hKUVVGSkxFbEJRVWtzUzBGQlN5eGpRVUZqTEVsQlFVa3NTVUZCU1N4TFFVRkxMRmxCUVZrc1NVRkJTU3hKUVVGSkxFdEJRVXNzYVVKQlFXbENPMWxCUTNaSExFbEJRVWtzUzBGQlN5eFpRVUZaTEVsQlFVa3NTVUZCU1N4TFFVRkxMR05CUVdNc1NVRkJTU3hKUVVGSkxFdEJRVXNzV1VGQldTeEpRVUZKTEVsQlFVa3NTMEZCU3l4cFFrRkJhVUk3V1VGRGRrY3NTVUZCU1N4TFFVRkxMR2xDUVVGcFFpeEpRVUZKTEVsQlFVa3NTMEZCU3l4dFFrRkJiVUlzU1VGQlNTeEpRVUZKTEV0QlFVc3NjMEpCUVhOQ0xFVkJRelZHTzFsQlEwUXNUMEZCVHl4SlFVRkpMRU5CUVVNN1UwRkRXanRoUVVGTk8xbEJRMDRzVDBGQlR5eExRVUZMTEVOQlFVTTdVMEZEWWp0SlFVTkdMRU5CUVVNN1EwRkRSRHRCUVhoR1JDd3dRa0YzUmtNaUxDSm1hV3hsSWpvaWFXNWtaWGd1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SWdYSFF2THlCVWFHVWdiVzlrZFd4bElHTmhZMmhsWEc0Z1hIUjJZWElnYVc1emRHRnNiR1ZrVFc5a2RXeGxjeUE5SUh0OU8xeHVYRzRnWEhRdkx5QlVhR1VnY21WeGRXbHlaU0JtZFc1amRHbHZibHh1SUZ4MFpuVnVZM1JwYjI0Z1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5aHRiMlIxYkdWSlpDa2dlMXh1WEc0Z1hIUmNkQzh2SUVOb1pXTnJJR2xtSUcxdlpIVnNaU0JwY3lCcGJpQmpZV05vWlZ4dUlGeDBYSFJwWmlocGJuTjBZV3hzWldSTmIyUjFiR1Z6VzIxdlpIVnNaVWxrWFNrZ2UxeHVJRngwWEhSY2RISmxkSFZ5YmlCcGJuTjBZV3hzWldSTmIyUjFiR1Z6VzIxdlpIVnNaVWxrWFM1bGVIQnZjblJ6TzF4dUlGeDBYSFI5WEc0Z1hIUmNkQzh2SUVOeVpXRjBaU0JoSUc1bGR5QnRiMlIxYkdVZ0tHRnVaQ0J3ZFhRZ2FYUWdhVzUwYnlCMGFHVWdZMkZqYUdVcFhHNGdYSFJjZEhaaGNpQnRiMlIxYkdVZ1BTQnBibk4wWVd4c1pXUk5iMlIxYkdWelcyMXZaSFZzWlVsa1hTQTlJSHRjYmlCY2RGeDBYSFJwT2lCdGIyUjFiR1ZKWkN4Y2JpQmNkRngwWEhSc09pQm1ZV3h6WlN4Y2JpQmNkRngwWEhSbGVIQnZjblJ6T2lCN2ZWeHVJRngwWEhSOU8xeHVYRzRnWEhSY2RDOHZJRVY0WldOMWRHVWdkR2hsSUcxdlpIVnNaU0JtZFc1amRHbHZibHh1SUZ4MFhIUnRiMlIxYkdWelcyMXZaSFZzWlVsa1hTNWpZV3hzS0cxdlpIVnNaUzVsZUhCdmNuUnpMQ0J0YjJSMWJHVXNJRzF2WkhWc1pTNWxlSEJ2Y25SekxDQmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZLVHRjYmx4dUlGeDBYSFF2THlCR2JHRm5JSFJvWlNCdGIyUjFiR1VnWVhNZ2JHOWhaR1ZrWEc0Z1hIUmNkRzF2WkhWc1pTNXNJRDBnZEhKMVpUdGNibHh1SUZ4MFhIUXZMeUJTWlhSMWNtNGdkR2hsSUdWNGNHOXlkSE1nYjJZZ2RHaGxJRzF2WkhWc1pWeHVJRngwWEhSeVpYUjFjbTRnYlc5a2RXeGxMbVY0Y0c5eWRITTdYRzRnWEhSOVhHNWNibHh1SUZ4MEx5OGdaWGh3YjNObElIUm9aU0J0YjJSMWJHVnpJRzlpYW1WamRDQW9YMTkzWldKd1lXTnJYMjF2WkhWc1pYTmZYeWxjYmlCY2RGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOHViU0E5SUcxdlpIVnNaWE03WEc1Y2JpQmNkQzh2SUdWNGNHOXpaU0IwYUdVZ2JXOWtkV3hsSUdOaFkyaGxYRzRnWEhSZlgzZGxZbkJoWTJ0ZmNtVnhkV2x5WlY5ZkxtTWdQU0JwYm5OMFlXeHNaV1JOYjJSMWJHVnpPMXh1WEc0Z1hIUXZMeUJrWldacGJtVWdaMlYwZEdWeUlHWjFibU4wYVc5dUlHWnZjaUJvWVhKdGIyNTVJR1Y0Y0c5eWRITmNiaUJjZEY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4dVpDQTlJR1oxYm1OMGFXOXVLR1Y0Y0c5eWRITXNJRzVoYldVc0lHZGxkSFJsY2lrZ2UxeHVJRngwWEhScFppZ2hYMTkzWldKd1lXTnJYM0psY1hWcGNtVmZYeTV2S0dWNGNHOXlkSE1zSUc1aGJXVXBLU0I3WEc0Z1hIUmNkRngwVDJKcVpXTjBMbVJsWm1sdVpWQnliM0JsY25SNUtHVjRjRzl5ZEhNc0lHNWhiV1VzSUhzZ1pXNTFiV1Z5WVdKc1pUb2dkSEoxWlN3Z1oyVjBPaUJuWlhSMFpYSWdmU2s3WEc0Z1hIUmNkSDFjYmlCY2RIMDdYRzVjYmlCY2RDOHZJR1JsWm1sdVpTQmZYMlZ6VFc5a2RXeGxJRzl1SUdWNGNHOXlkSE5jYmlCY2RGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOHVjaUE5SUdaMWJtTjBhVzl1S0dWNGNHOXlkSE1wSUh0Y2JpQmNkRngwYVdZb2RIbHdaVzltSUZONWJXSnZiQ0FoUFQwZ0ozVnVaR1ZtYVc1bFpDY2dKaVlnVTNsdFltOXNMblJ2VTNSeWFXNW5WR0ZuS1NCN1hHNGdYSFJjZEZ4MFQySnFaV04wTG1SbFptbHVaVkJ5YjNCbGNuUjVLR1Y0Y0c5eWRITXNJRk41YldKdmJDNTBiMU4wY21sdVoxUmhaeXdnZXlCMllXeDFaVG9nSjAxdlpIVnNaU2NnZlNrN1hHNGdYSFJjZEgxY2JpQmNkRngwVDJKcVpXTjBMbVJsWm1sdVpWQnliM0JsY25SNUtHVjRjRzl5ZEhNc0lDZGZYMlZ6VFc5a2RXeGxKeXdnZXlCMllXeDFaVG9nZEhKMVpTQjlLVHRjYmlCY2RIMDdYRzVjYmlCY2RDOHZJR055WldGMFpTQmhJR1poYTJVZ2JtRnRaWE53WVdObElHOWlhbVZqZEZ4dUlGeDBMeThnYlc5a1pTQW1JREU2SUhaaGJIVmxJR2x6SUdFZ2JXOWtkV3hsSUdsa0xDQnlaWEYxYVhKbElHbDBYRzRnWEhRdkx5QnRiMlJsSUNZZ01qb2diV1Z5WjJVZ1lXeHNJSEJ5YjNCbGNuUnBaWE1nYjJZZ2RtRnNkV1VnYVc1MGJ5QjBhR1VnYm5OY2JpQmNkQzh2SUcxdlpHVWdKaUEwT2lCeVpYUjFjbTRnZG1Gc2RXVWdkMmhsYmlCaGJISmxZV1I1SUc1eklHOWlhbVZqZEZ4dUlGeDBMeThnYlc5a1pTQW1JRGg4TVRvZ1ltVm9ZWFpsSUd4cGEyVWdjbVZ4ZFdseVpWeHVJRngwWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHk1MElEMGdablZ1WTNScGIyNG9kbUZzZFdVc0lHMXZaR1VwSUh0Y2JpQmNkRngwYVdZb2JXOWtaU0FtSURFcElIWmhiSFZsSUQwZ1gxOTNaV0p3WVdOclgzSmxjWFZwY21WZlh5aDJZV3gxWlNrN1hHNGdYSFJjZEdsbUtHMXZaR1VnSmlBNEtTQnlaWFIxY200Z2RtRnNkV1U3WEc0Z1hIUmNkR2xtS0NodGIyUmxJQ1lnTkNrZ0ppWWdkSGx3Wlc5bUlIWmhiSFZsSUQwOVBTQW5iMkpxWldOMEp5QW1KaUIyWVd4MVpTQW1KaUIyWVd4MVpTNWZYMlZ6VFc5a2RXeGxLU0J5WlhSMWNtNGdkbUZzZFdVN1hHNGdYSFJjZEhaaGNpQnVjeUE5SUU5aWFtVmpkQzVqY21WaGRHVW9iblZzYkNrN1hHNGdYSFJjZEY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4dWNpaHVjeWs3WEc0Z1hIUmNkRTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNodWN5d2dKMlJsWm1GMWJIUW5MQ0I3SUdWdWRXMWxjbUZpYkdVNklIUnlkV1VzSUhaaGJIVmxPaUIyWVd4MVpTQjlLVHRjYmlCY2RGeDBhV1lvYlc5a1pTQW1JRElnSmlZZ2RIbHdaVzltSUhaaGJIVmxJQ0U5SUNkemRISnBibWNuS1NCbWIzSW9kbUZ5SUd0bGVTQnBiaUIyWVd4MVpTa2dYMTkzWldKd1lXTnJYM0psY1hWcGNtVmZYeTVrS0c1ekxDQnJaWGtzSUdaMWJtTjBhVzl1S0d0bGVTa2dleUJ5WlhSMWNtNGdkbUZzZFdWYmEyVjVYVHNnZlM1aWFXNWtLRzUxYkd3c0lHdGxlU2twTzF4dUlGeDBYSFJ5WlhSMWNtNGdibk03WEc0Z1hIUjlPMXh1WEc0Z1hIUXZMeUJuWlhSRVpXWmhkV3gwUlhod2IzSjBJR1oxYm1OMGFXOXVJR1p2Y2lCamIyMXdZWFJwWW1sc2FYUjVJSGRwZEdnZ2JtOXVMV2hoY20xdmJua2diVzlrZFd4bGMxeHVJRngwWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHk1dUlEMGdablZ1WTNScGIyNG9iVzlrZFd4bEtTQjdYRzRnWEhSY2RIWmhjaUJuWlhSMFpYSWdQU0J0YjJSMWJHVWdKaVlnYlc5a2RXeGxMbDlmWlhOTmIyUjFiR1VnUDF4dUlGeDBYSFJjZEdaMWJtTjBhVzl1SUdkbGRFUmxabUYxYkhRb0tTQjdJSEpsZEhWeWJpQnRiMlIxYkdWYkoyUmxabUYxYkhRblhUc2dmU0E2WEc0Z1hIUmNkRngwWm5WdVkzUnBiMjRnWjJWMFRXOWtkV3hsUlhod2IzSjBjeWdwSUhzZ2NtVjBkWEp1SUcxdlpIVnNaVHNnZlR0Y2JpQmNkRngwWDE5M1pXSndZV05yWDNKbGNYVnBjbVZmWHk1a0tHZGxkSFJsY2l3Z0oyRW5MQ0JuWlhSMFpYSXBPMXh1SUZ4MFhIUnlaWFIxY200Z1oyVjBkR1Z5TzF4dUlGeDBmVHRjYmx4dUlGeDBMeThnVDJKcVpXTjBMbkJ5YjNSdmRIbHdaUzVvWVhOUGQyNVFjbTl3WlhKMGVTNWpZV3hzWEc0Z1hIUmZYM2RsWW5CaFkydGZjbVZ4ZFdseVpWOWZMbThnUFNCbWRXNWpkR2x2YmlodlltcGxZM1FzSUhCeWIzQmxjblI1S1NCN0lISmxkSFZ5YmlCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2IySnFaV04wTENCd2NtOXdaWEowZVNrN0lIMDdYRzVjYmlCY2RDOHZJRjlmZDJWaWNHRmphMTl3ZFdKc2FXTmZjR0YwYUY5ZlhHNGdYSFJmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmTG5BZ1BTQmNJaTR2TGk0dkxpNHZaR2x6ZEM5Y0lqdGNibHh1WEc0Z1hIUXZMeUJNYjJGa0lHVnVkSEo1SUcxdlpIVnNaU0JoYm1RZ2NtVjBkWEp1SUdWNGNHOXlkSE5jYmlCY2RISmxkSFZ5YmlCZlgzZGxZbkJoWTJ0ZmNtVnhkV2x5WlY5ZktGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOHVjeUE5SUZ3aUxpOXpjbU12YVc1a1pYZ3VkSE5jSWlrN1hHNGlMQ0pwYlhCdmNuUWdVMmhoWkdWeWFYUjVJR1p5YjIwZ0p5NHZiV0ZwYmk5VGFHRmtaWEpwZEhrbk8xeHlYRzVwYlhCdmNuUWdYMU5vWVdSbGNtbDBlVTlpYW1WamRFTnlaV0YwYjNJZ1puSnZiU0FuTGk5dFlXbHVMMU5vWVdSbGNtbDBlVTlpYW1WamRFTnlaV0YwYjNJbk8xeHlYRzVwYlhCdmNuUWdYMUpsWm14bFkzUnBiMjRnWm5KdmJTQW5MaTl0WVdsdUwxSmxabXhsWTNScGIyNG5PMXh5WEc1Y2NseHVhVzF3YjNKMElIdGNjbHh1SUNCQmRIUnlhV0oxZEdWVFpXMWhiblJwWTNNZ1lYTWdYMEYwZEhKcFluVjBaVk5sYldGdWRHbGpjeXhjY2x4dUlDQlNaV1pzWldOMGFXOXVRWFIwY21saWRYUmxJR0Z6SUY5U1pXWnNaV04wYVc5dVFYUjBjbWxpZFhSbExGeHlYRzRnSUZKbFpteGxZM1JwYjI1VmJtbG1iM0p0SUdGeklGOVNaV1pzWldOMGFXOXVWVzVwWm05eWJTeGNjbHh1SUNCU1pXWnNaV04wYVc5dVZtRnllV2x1WnlCaGN5QmZVbVZtYkdWamRHbHZibFpoY25scGJtY3NYSEpjYmlBZ1UyaGhaR1Z5YVhSNVQySnFaV04wSUdGeklGOVRhR0ZrWlhKcGRIbFBZbXBsWTNRc1hISmNiaUFnVTJoaFpHVnlSWGgwWlc1emFXOXVRbVZvWVhacGIzSWdZWE1nWDFOb1lXUmxja1Y0ZEdWdWMybHZia0psYUdGMmFXOXlMRnh5WEc0Z0lGTm9ZV1JsY2tOdmJuTjBZVzUwVm1Gc2RXVldZWEpVZVhCbFJWTXpJR0Z6SUY5VGFHRmtaWEpEYjI1emRHRnVkRlpoYkhWbFZtRnlWSGx3WlVWVE15eGNjbHh1SUNCVGFHRmtaWEpRY21WamFYTnBiMjVQWW1wbFkzUWdZWE1nWDFOb1lXUmxjbEJ5WldOcGMybHZiazlpYW1WamRDeGNjbHh1SUNCVGFHRmtaWEpUZEdGblpWTjBjaUJoY3lCZlUyaGhaR1Z5VTNSaFoyVlRkSElzWEhKY2JpQWdVMmhoWkdWeVVISmxZMmx6YVc5dVZIbHdaU0JoY3lCZlUyaGhaR1Z5VUhKbFkybHphVzl1Vkhsd1pTeGNjbHh1SUNCVGFHRmtaWEpCZEhSeWFXSjFkR1ZXWVhKVWVYQmxJR0Z6SUY5VGFHRmtaWEpCZEhSeWFXSjFkR1ZXWVhKVWVYQmxMRnh5WEc0Z0lGTm9ZV1JsY2xaaGNubHBibWRKYm5SbGNuQnZiR0YwYVc5dVZIbHdaU0JoY3lCZlUyaGhaR1Z5Vm1GeWVXbHVaMGx1ZEdWeWNHOXNZWFJwYjI1VWVYQmxMRnh5WEc0Z0lGTm9ZV1JsY2xaaGNubHBibWRXWVhKVWVYQmxJR0Z6SUY5VGFHRmtaWEpXWVhKNWFXNW5WbUZ5Vkhsd1pTeGNjbHh1SUNCVGFHRmtaWEpWYm1sbWIzSnRWbUZ5Vkhsd1pVVlRNeUJoY3lCZlUyaGhaR1Z5Vlc1cFptOXliVlpoY2xSNWNHVkZVek1zWEhKY2JpQWdVMmhoWkdWeVUzUnlkV04wVFdWdFltVnlUMkpxWldOMElHRnpJRjlUYUdGa1pYSlRkSEoxWTNSTlpXMWlaWEpQWW1wbFkzUXNYSEpjYmlBZ1UyaGhaR1Z5VlVKUFZtRnlhV0ZpYkdWUFltcGxZM1FnWVhNZ1gxTm9ZV1JsY2xWQ1QxWmhjbWxoWW14bFQySnFaV04wTEZ4eVhHNGdJRk5vWVdSbGNrRjBkSEpwWW5WMFpVOWlhbVZqZENCaGN5QmZVMmhoWkdWeVFYUjBjbWxpZFhSbFQySnFaV04wTEZ4eVhHNGdJRk5vWVdSbGNrTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVlBZbXBsWTNRZ1lYTWdYMU5vWVdSbGNrTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVlBZbXBsWTNRc1hISmNiaUFnVTJoaFpHVnlRMjl1YzNSaGJuUldZV3gxWlU5aWFtVmpkQ0JoY3lCZlUyaGhaR1Z5UTI5dWMzUmhiblJXWVd4MVpVOWlhbVZqZEN4Y2NseHVJQ0JUYUdGa1pYSkZlSFJsYm5OcGIyNVBZbXBsWTNRZ1lYTWdYMU5vWVdSbGNrVjRkR1Z1YzJsdmJrOWlhbVZqZEN4Y2NseHVJQ0JUYUdGa1pYSlRkSEoxWTNSRVpXWnBibWwwYVc5dVQySnFaV04wSUdGeklGOVRhR0ZrWlhKVGRISjFZM1JFWldacGJtbDBhVzl1VDJKcVpXTjBMRnh5WEc0Z0lGTm9ZV1JsY2xWdWFXWnZjbTFDZFdabVpYSlBZbXBsWTNRZ1lYTWdYMU5vWVdSbGNsVnVhV1p2Y20xQ2RXWm1aWEpQWW1wbFkzUXNYSEpjYmlBZ1UyaGhaR1Z5Vlc1cFptOXliVTlpYW1WamRDQmhjeUJmVTJoaFpHVnlWVzVwWm05eWJVOWlhbVZqZEN4Y2NseHVJQ0JUYUdGa1pYSlZibWxtYjNKdFUzUnlkV04wVDJKcVpXTjBJR0Z6SUY5VGFHRmtaWEpWYm1sbWIzSnRVM1J5ZFdOMFQySnFaV04wTEZ4eVhHNGdJRk5vWVdSbGNsWmhjbmxwYm1kUFltcGxZM1FnWVhNZ1gxTm9ZV1JsY2xaaGNubHBibWRQWW1wbFkzUXNYSEpjYmlBZ1UyaGhaR1Z5Vm1WeWMybHZiaUJoY3lCZlUyaGhaR1Z5Vm1WeWMybHZiaXhjY2x4dUlDQlVaVzF3YkdGMFpVOWlhbVZqZENCaGN5QmZWR1Z0Y0d4aGRHVlBZbXBsWTNRc1hISmNiaUFnVlc1cFptOXliVk5sYldGdWRHbGpjeUJoY3lCZlZXNXBabTl5YlZObGJXRnVkR2xqY3l4Y2NseHVJQ0JXWVhKVWVYQmxJR0Z6SUY5V1lYSlVlWEJsTEZ4eVhHNTlJR1p5YjIwZ0p5NHZkSGx3WlhNdmRIbHdaU2M3WEhKY2JseHlYRzVsZUhCdmNuUWdlMXh5WEc0Z0lGTm9ZV1JsY21sMGVVOWlhbVZqZEVOeVpXRjBiM0lnWVhNZ1gxTm9ZV1JsY21sMGVVOWlhbVZqZEVOeVpXRjBiM0lzWEhKY2JpQWdVbVZtYkdWamRHbHZiaUJoY3lCZlVtVm1iR1ZqZEdsdmJpeGNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJSFI1Y0dVZ1FYUjBjbWxpZFhSbFUyVnRZVzUwYVdOeklEMGdYMEYwZEhKcFluVjBaVk5sYldGdWRHbGpjenRjY2x4dVpYaHdiM0owSUhSNWNHVWdVbVZtYkdWamRHbHZia0YwZEhKcFluVjBaU0E5SUY5U1pXWnNaV04wYVc5dVFYUjBjbWxpZFhSbE8xeHlYRzVsZUhCdmNuUWdkSGx3WlNCU1pXWnNaV04wYVc5dVZXNXBabTl5YlNBOUlGOVNaV1pzWldOMGFXOXVWVzVwWm05eWJUdGNjbHh1Wlhod2IzSjBJSFI1Y0dVZ1VtVm1iR1ZqZEdsdmJsWmhjbmxwYm1jZ1BTQmZVbVZtYkdWamRHbHZibFpoY25scGJtYzdYSEpjYm1WNGNHOXlkQ0IwZVhCbElGTm9ZV1JsY21sMGVVOWlhbVZqZENBOUlGOVRhR0ZrWlhKcGRIbFBZbXBsWTNRN1hISmNibVY0Y0c5eWRDQjBlWEJsSUZOb1lXUmxja1Y0ZEdWdWMybHZia0psYUdGMmFXOXlJRDBnWDFOb1lXUmxja1Y0ZEdWdWMybHZia0psYUdGMmFXOXlPMXh5WEc1bGVIQnZjblFnZEhsd1pTQlRhR0ZrWlhKRGIyNXpkR0Z1ZEZaaGJIVmxWbUZ5Vkhsd1pVVlRNeUE5SUY5VGFHRmtaWEpEYjI1emRHRnVkRlpoYkhWbFZtRnlWSGx3WlVWVE16dGNjbHh1Wlhod2IzSjBJSFI1Y0dVZ1UyaGhaR1Z5VUhKbFkybHphVzl1VDJKcVpXTjBJRDBnWDFOb1lXUmxjbEJ5WldOcGMybHZiazlpYW1WamREdGNjbHh1Wlhod2IzSjBJSFI1Y0dVZ1UyaGhaR1Z5VTNSaFoyVlRkSElnUFNCZlUyaGhaR1Z5VTNSaFoyVlRkSEk3WEhKY2JtVjRjRzl5ZENCMGVYQmxJRk5vWVdSbGNsQnlaV05wYzJsdmJsUjVjR1VnUFNCZlUyaGhaR1Z5VUhKbFkybHphVzl1Vkhsd1pUdGNjbHh1Wlhod2IzSjBJSFI1Y0dVZ1UyaGhaR1Z5UVhSMGNtbGlkWFJsVm1GeVZIbHdaU0E5SUY5VGFHRmtaWEpCZEhSeWFXSjFkR1ZXWVhKVWVYQmxPMXh5WEc1bGVIQnZjblFnZEhsd1pTQlRhR0ZrWlhKV1lYSjVhVzVuU1c1MFpYSndiMnhoZEdsdmJsUjVjR1VnUFNCZlUyaGhaR1Z5Vm1GeWVXbHVaMGx1ZEdWeWNHOXNZWFJwYjI1VWVYQmxPMXh5WEc1bGVIQnZjblFnZEhsd1pTQlRhR0ZrWlhKV1lYSjVhVzVuVm1GeVZIbHdaU0E5SUY5VGFHRmtaWEpXWVhKNWFXNW5WbUZ5Vkhsd1pUdGNjbHh1Wlhod2IzSjBJSFI1Y0dVZ1UyaGhaR1Z5Vlc1cFptOXliVlpoY2xSNWNHVkZVek1nUFNCZlUyaGhaR1Z5Vlc1cFptOXliVlpoY2xSNWNHVkZVek03WEhKY2JtVjRjRzl5ZENCMGVYQmxJRk5vWVdSbGNsTjBjblZqZEUxbGJXSmxjazlpYW1WamRDQTlJRjlUYUdGa1pYSlRkSEoxWTNSTlpXMWlaWEpQWW1wbFkzUTdYSEpjYm1WNGNHOXlkQ0IwZVhCbElGTm9ZV1JsY2xWQ1QxWmhjbWxoWW14bFQySnFaV04wSUQwZ1gxTm9ZV1JsY2xWQ1QxWmhjbWxoWW14bFQySnFaV04wTzF4eVhHNWxlSEJ2Y25RZ2RIbHdaU0JUYUdGa1pYSkJkSFJ5YVdKMWRHVlBZbXBsWTNRZ1BTQmZVMmhoWkdWeVFYUjBjbWxpZFhSbFQySnFaV04wTzF4eVhHNWxlSEJ2Y25RZ2RIbHdaU0JUYUdGa1pYSkRiMjV6ZEdGdWRGTjBjblZqZEZaaGJIVmxUMkpxWldOMElEMGdYMU5vWVdSbGNrTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVlBZbXBsWTNRN1hISmNibVY0Y0c5eWRDQjBlWEJsSUZOb1lXUmxja052Ym5OMFlXNTBWbUZzZFdWUFltcGxZM1FnUFNCZlUyaGhaR1Z5UTI5dWMzUmhiblJXWVd4MVpVOWlhbVZqZER0Y2NseHVaWGh3YjNKMElIUjVjR1VnVTJoaFpHVnlSWGgwWlc1emFXOXVUMkpxWldOMElEMGdYMU5vWVdSbGNrVjRkR1Z1YzJsdmJrOWlhbVZqZER0Y2NseHVaWGh3YjNKMElIUjVjR1VnVTJoaFpHVnlVM1J5ZFdOMFJHVm1hVzVwZEdsdmJrOWlhbVZqZENBOUlGOVRhR0ZrWlhKVGRISjFZM1JFWldacGJtbDBhVzl1VDJKcVpXTjBPMXh5WEc1bGVIQnZjblFnZEhsd1pTQlRhR0ZrWlhKVmJtbG1iM0p0UW5WbVptVnlUMkpxWldOMElEMGdYMU5vWVdSbGNsVnVhV1p2Y20xQ2RXWm1aWEpQWW1wbFkzUTdYSEpjYm1WNGNHOXlkQ0IwZVhCbElGTm9ZV1JsY2xWdWFXWnZjbTFQWW1wbFkzUWdQU0JmVTJoaFpHVnlWVzVwWm05eWJVOWlhbVZqZER0Y2NseHVaWGh3YjNKMElIUjVjR1VnVTJoaFpHVnlWVzVwWm05eWJWTjBjblZqZEU5aWFtVmpkQ0E5SUY5VGFHRmtaWEpWYm1sbWIzSnRVM1J5ZFdOMFQySnFaV04wTzF4eVhHNWxlSEJ2Y25RZ2RIbHdaU0JUYUdGa1pYSldZWEo1YVc1blQySnFaV04wSUQwZ1gxTm9ZV1JsY2xaaGNubHBibWRQWW1wbFkzUTdYSEpjYm1WNGNHOXlkQ0IwZVhCbElGTm9ZV1JsY2xabGNuTnBiMjRnUFNCZlUyaGhaR1Z5Vm1WeWMybHZianRjY2x4dVpYaHdiM0owSUhSNWNHVWdWR1Z0Y0d4aGRHVlBZbXBsWTNRZ1BTQmZWR1Z0Y0d4aGRHVlBZbXBsWTNRN1hISmNibVY0Y0c5eWRDQjBlWEJsSUZWdWFXWnZjbTFUWlcxaGJuUnBZM01nUFNCZlZXNXBabTl5YlZObGJXRnVkR2xqY3p0Y2NseHVaWGh3YjNKMElIUjVjR1VnVm1GeVZIbHdaU0E5SUY5V1lYSlVlWEJsTzF4eVhHNWxlSEJ2Y25RZ2RIbHdaU0JUYUdGa1pYSnBkSGxQWW1wbFkzUkRjbVZoZEc5eUlEMGdYMU5vWVdSbGNtbDBlVTlpYW1WamRFTnlaV0YwYjNJN1hISmNibVY0Y0c5eWRDQjBlWEJsSUZKbFpteGxZM1JwYjI0Z1BTQmZVbVZtYkdWamRHbHZianRjY2x4dVhISmNibVY0Y0c5eWRDQmtaV1poZFd4MElGTm9ZV1JsY21sMGVWeHlYRzRpTENKbGVIQnZjblFnWkdWbVlYVnNkQ0JqYkdGemN5QlFjbVZRY205alpYTnpiM0lnZTF4dUlDQWdJSEIxWW14cFl5QnpkR0YwYVdNZ2NISnZZMlZ6Y3loemNHeHBkSFJsWkV4cGJtVnpPaUJ6ZEhKcGJtZGJYU2s2SUhOMGNtbHVaMXRkSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnWkdWbWFXNWxJRDBnTHlOa1pXWnBibVZiWEZ4MElGMHJLRnhjZHlzcEx6dGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2FXWmtaV1lnUFNBdkkybG1aR1ZtVzF4Y2RDQmRLeWhjWEhjcktTODdYRzRnSUNBZ0lDQWdJR052Ym5OMElHVnNhV1lnUFNBdkkyVnNhV1piWEZ4MElGMHJaR1ZtYVc1bFpGeGNLQ2hjWEhjcktWeGNLUzg3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJRjlsYkhObElEMGdMeU5sYkhObEx6dGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ1pXNWthV1lnUFNBdkkyVnVaR2xtTHp0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYjNWMGNIVjBTR2x6ZEc5eWVUb2dZbTl2YkdWaGJsdGRJRDBnVzEwN1hHNGdJQ0FnSUNBZ0lHeGxkQ0J2ZFhSd2RYUkdiR2NnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQmtaV1pwYm1sMGFXOXVjem9nYzNSeWFXNW5XMTBnUFNCYlhUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2FXWmtaV1p6T2lCemRISnBibWRiWFZ0ZElEMGdXMTA3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJRzkxZEhCMWRFeHBibVZ6T2lCemRISnBibWRiWFNBOUlGdGRPMXh1WEc0Z0lDQWdJQ0FnSUdadmNpQW9ZMjl1YzNRZ2JHbHVaU0J2WmlCemNHeHBkSFJsWkV4cGJtVnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaWFFnYVhOUWNtRm5iV0VnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIc2dMeThnSTJSbFptbHVaVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ym5OMElISmxJRDBnYkdsdVpTNXRZWFJqYUNoa1pXWnBibVVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHlaU0FoUFNCdWRXeHNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmxabWx1YVhScGIyNXpMbkIxYzJnb2NtVmJNVjBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBjMUJ5WVdkdFlTQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2IzVjBjSFYwU0dsemRHOXllUzVwYm1SbGVFOW1LR1poYkhObEtTQTlQVDBnTFRFcElIc2dMeThnSTJsbVpHVm1YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl1YzNRZ2NtVWdQU0JzYVc1bExtMWhkR05vS0dsbVpHVm1LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NtVWdJVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmRYUndkWFJJYVhOMGIzSjVMbkIxYzJnb2IzVjBjSFYwUm14bktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5dWMzUWdkRzlEYUdWamEwUmxaaUE5SUhKbFd6RmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFptUmxabk11Y0hWemFDaGJkRzlEYUdWamEwUmxabDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdWbWFXNXBkR2x2Ym5NdWFXNWtaWGhQWmloMGIwTm9aV05yUkdWbUtTQTlQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkSEIxZEVac1p5QTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbHpVSEpoWjIxaElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodmRYUndkWFJJYVhOMGIzSjVMbWx1WkdWNFQyWW9abUZzYzJVcElEMDlQU0F0TVNrZ2V5QXZMeUFqWld4cFpseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZibk4wSUhKbElEMGdiR2x1WlM1dFlYUmphQ2hsYkdsbUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY21VZ0lUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1emRDQjBiME5vWldOclJHVm1JRDBnY21WYk1WMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJuTjBJR04xY25KbGJuUkpabVJsWm5NZ1BTQnBabVJsWm5OYmFXWmtaV1p6TG14bGJtZDBhQ0F0SURGZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWlhRZ2JtOTBSbTkxYm1RZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJR04xY25KbGJuUkpabVJsWmlCdlppQmpkWEp5Wlc1MFNXWmtaV1p6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR1ZtYVc1cGRHbHZibk11YVc1a1pYaFBaaWhqZFhKeVpXNTBTV1prWldZcElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzV2ZEVadmRXNWtJRDBnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c1dmRFWnZkVzVrSUNZbUlHUmxabWx1YVhScGIyNXpMbWx1WkdWNFQyWW9kRzlEYUdWamEwUmxaaWtnSVQwOUlDMHhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2ZFhSd2RYUkdiR2NnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNWMGNIVjBSbXhuSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTNWeWNtVnVkRWxtWkdWbWN5NXdkWE5vS0hSdlEyaGxZMnRFWldZcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYzFCeVlXZHRZU0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iM1YwY0hWMFNHbHpkRzl5ZVM1cGJtUmxlRTltS0daaGJITmxLU0E5UFQwZ0xURXBJSHNnTHk4Z0kyVnNjMlZjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1emRDQnlaU0E5SUd4cGJtVXViV0YwWTJnb1gyVnNjMlVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHlaU0FoUFNCdWRXeHNLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZibk4wSUdOMWNuSmxiblJKWm1SbFpuTWdQU0JwWm1SbFpuTmJhV1prWldaekxteGxibWQwYUNBdElERmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1pYUWdiM1YwY0hWMFJteG5TVzV1WlhJZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJR04xY25KbGJuUkpabVJsWmlCdlppQmpkWEp5Wlc1MFNXWmtaV1p6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR1ZtYVc1cGRHbHZibk11YVc1a1pYaFBaaWhqZFhKeVpXNTBTV1prWldZcElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzkxZEhCMWRFWnNaMGx1Ym1WeUlEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzVjBjSFYwUm14bklEMGdiM1YwY0hWMFJteG5TVzV1WlhJN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x6VUhKaFoyMWhJRDBnZEhKMVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUhzZ0x5OGdJMlZ1WkdsbVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVjM1FnY21VZ1BTQnNhVzVsTG0xaGRHTm9LR1Z1WkdsbUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY21VZ0lUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2IzVjBjSFYwU0dsemRHOXllUzVwYm1SbGVFOW1LR1poYkhObEtTQTlQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkSEIxZEVac1p5QTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTlFjbUZuYldFZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBabVJsWm5NdWNHOXdLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkSEIxZEVocGMzUnZjbmt1Y0c5d0tDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iM1YwY0hWMFJteG5JQ1ltSUNGcGMxQnlZV2R0WVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOTFkSEIxZEV4cGJtVnpMbkIxYzJnb2JHbHVaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzkxZEhCMWRFeHBibVZ6TzF4dUlDQWdJSDFjYm4xY2JseHVJaXdpYVcxd2IzSjBJSHRjYmx4MFFYUjBjbWxpZFhSbFUyVnRZVzUwYVdOekxGeHVYSFJTWldac1pXTjBhVzl1UVhSMGNtbGlkWFJsTEZ4dVhIUlNaV1pzWldOMGFXOXVWVzVwWm05eWJTeGNibHgwVW1WbWJHVmpkR2x2YmxaaGNubHBibWNzWEc1Y2RGTm9ZV1JsY2xOMFlXZGxVM1J5TEZ4dVhIUlZibWxtYjNKdFUyVnRZVzUwYVdOekxGeHVYSFJXWVhKVWVYQmxMRnh1ZlNCbWNtOXRJQ2N1TGk5MGVYQmxjeTkwZVhCbEp6dGNibHh1THlvcVhHNGdLaUJVYUdseklHTnNZWE56SUdkbGRITWdkR2hsSUdGMGRISnBZblYwWlN3Z2RtRnllV2x1Wnl3Z1lXNWtJSFZ1YVdadmNtMGdhVzVtYjNKdFlYUnBiMjRnWm5KdmJTQjBhR1VnWTI5a1pTQndjbTl3WlhKMGVTQnZaaUJoSUhOb1lXUmxjbWwwZVNCdlltcGxZM1F1WEc0Z0tpQlVhR1VnYldWMGFHOWtjeUJ2WmlCMGFHVWdVMmhoWkdWeWFYUjVJR2x1YzNSaGJtTmxJR055WldGMFpTQmhiaUJwYm5OMFlXNWpaU0J2WmlCMGFHbHpJR05zWVhOekxseHVJQ3BjYmlBcUlFSmxabTl5WlNCblpYUjBhVzVuSUhSb1pTQnBibVp2Y20xaGRHbHZiaUJ2WmlCMGFHVWdZWFIwY21saWRYUmxMQ0IyWVhKNWFXNW5MQ0JoYm1RZ2RXNXBabTl5YlN3Z2VXOTFJRzVsWldRZ2RHOGdZMkZzYkNCMGFHVWdjbVZtYkdWamRDQnRaWFJvYjJRZ2IyWWdkR2hwY3lCcGJuTjBZVzVqWlM1Y2JpQXFMMXh1Wlhod2IzSjBJR1JsWm1GMWJIUWdZMnhoYzNNZ1VtVm1iR1ZqZEdsdmJpQjdYRzVjZEhCeWFYWmhkR1VnYzNSaGRHbGpJSEpsWVdSdmJteDVJR0YwZEhKcFluVjBaVUZ1WkZaaGNubHBibWRVZVhCbFVtVm5SWGh3WEc1Y2RGeDBQU0F2VzF4Y2RDQmRLeWhtYkc5aGRIeHBiblI4ZG1Wak1ueDJaV016ZkhabFl6UjhiV0YwTW54dFlYUXpmRzFoZERSOGFYWmxZeko4YVhabFl6TjhhWFpsWXpRcFcxeGNkQ0JkS3loY1hIY3JLVHN2TzF4dVhIUndjbWwyWVhSbElITjBZWFJwWXlCeVpXRmtiMjVzZVNCMWJtbG1iM0p0Vkhsd1pWSmxaMFY0Y0Z4dVhIUmNkRDBnTDF0Y1hIUWdYU3NvWm14dllYUjhhVzUwZkhabFl6SjhkbVZqTTN4MlpXTTBmRzFoZERKOGJXRjBNM3h0WVhRMGZHbDJaV015ZkdsMlpXTXpmR2wyWldNMGZITmhiWEJzWlhJeVJIeHpZVzF3YkdWeVEzVmlaWHh6WVcxd2JHVnlNMFFwVzF4Y2RDQmRLeWhjWEhjcktUc3ZPMXh1WEhSd2NtbDJZWFJsSUhOMFlYUnBZeUJ5WldGa2IyNXNlU0J6WlcxaGJuUnBZMUpsWjBWNGNDQTlJQzg4TGlwelpXMWhiblJwWTF0Y1hIUWdYU285VzF4Y2RDQmRLaWhjWEhjcktTNHFQaTg3WEc1Y2JseDBjSEpwZG1GMFpTQmZYMkYwZEhKcFluVjBaVk5sYldGdWRHbGpjMDFoY0NBOUlHNWxkeUJOWVhBOGMzUnlhVzVuTENCemRISnBibWMrS0NrN1hHNWNkSEJ5YVhaaGRHVWdYMTkxYm1sbWIzSnRVMlZ0WVc1MGFXTnpUV0Z3SUQwZ2JtVjNJRTFoY0R4emRISnBibWNzSUhOMGNtbHVaejRvS1R0Y2JseDBjSEpwZG1GMFpTQmZYMkYwZEhKcFluVjBaWE02SUZKbFpteGxZM1JwYjI1QmRIUnlhV0oxZEdWYlhTQTlJRnRkTzF4dVhIUndjbWwyWVhSbElGOWZkbUZ5ZVdsdVozTTZJRkpsWm14bFkzUnBiMjVXWVhKNWFXNW5XMTBnUFNCYlhUdGNibHgwY0hKcGRtRjBaU0JmWDNWdWFXWnZjbTF6T2lCU1pXWnNaV04wYVc5dVZXNXBabTl5YlZ0ZElEMGdXMTA3WEc1Y2JseDBjSEpwZG1GMFpTQnlaV0ZrYjI1c2VTQmZYM053YkdsMGRHVmtVMmhoWkdWeVEyOWtaVG9nYzNSeWFXNW5XMTA3WEc1Y2RIQnlhWFpoZEdVZ2NtVmhaRzl1YkhrZ1gxOXphR0ZrWlhKVGRHRm5aVG9nVTJoaFpHVnlVM1JoWjJWVGRISTdYRzVjYmx4MFkyOXVjM1J5ZFdOMGIzSW9jM0JzYVhSMFpXUlRhR0ZrWlhKcGRIbFRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU3dnYzJoaFpHVnlVM1JoWjJVNklGTm9ZV1JsY2xOMFlXZGxVM1J5S1NCN1hHNWNkRngwZEdocGN5NWZYM053YkdsMGRHVmtVMmhoWkdWeVEyOWtaU0E5SUhOd2JHbDBkR1ZrVTJoaFpHVnlhWFI1VTJoaFpHVnlRMjlrWlR0Y2JseDBYSFIwYUdsekxsOWZjMmhoWkdWeVUzUmhaMlVnUFNCemFHRmtaWEpUZEdGblpUdGNibHgwWEhSMGFHbHpMbDlmYzJWMFJHVm1ZWFZzZEVGMGRISnBZblYwWlVGdVpGVnVhV1p2Y20xVFpXMWhiblJwWTNOTllYQW9LVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCSFpYUnpJR0ZzYkNCaGRIUnlhV0oxZEdVZ2RtRnlhV0ZpYkdVZ2FXNW1iM0p0WVhScGIyNGdhVzRnZEdobElITm9ZV1JsY2lCamIyUmxMbHh1WEhRZ0tpQkNaV1p2Y21VZ1kyRnNiR2x1WnlCMGFHbHpJRzFsZEdodlpDd2dlVzkxSUc1bFpXUWdkRzhnWTJGc2JDQjBhR1VnY21WbWJHVmpkQ0J0WlhSb2IyUWdiMllnZEdocGN5QnBibk4wWVc1alpTNWNibHgwSUNvZ1FISmxkSFZ5Ym5NZ1FYSnlZWGtnYjJZZ1VtVm1iR1ZqZEdsdmJrRjBkSEpwWW5WMFpTQnZZbXBsWTNSY2JseDBJQ292WEc1Y2RIQjFZbXhwWXlCblpYUWdZWFIwY21saWRYUmxjeWdwSUh0Y2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1ZlgyRjBkSEpwWW5WMFpYTTdYRzVjZEgxY2JseHVYSFF2S2lwY2JseDBJQ29nUjJWMGN5QmhiR3dnZG1GeWVXbHVaeUIyWVhKcFlXSnNaU0JwYm1admNtMWhkR2x2YmlCcGJpQjBhR1VnYzJoaFpHVnlJR052WkdVdVhHNWNkQ0FxSUVKbFptOXlaU0JqWVd4c2FXNW5JSFJvYVhNZ2JXVjBhRzlrTENCNWIzVWdibVZsWkNCMGJ5QmpZV3hzSUhSb1pTQnlaV1pzWldOMElHMWxkR2h2WkNCdlppQjBhR2x6SUdsdWMzUmhibU5sTGx4dVhIUWdLaUJBY21WMGRYSnVjeUJCY25KaGVTQnZaaUJTWldac1pXTjBhVzl1Vm1GeWVXbHVaeUJ2WW1wbFkzUmNibHgwSUNvdlhHNWNkSEIxWW14cFl5Qm5aWFFnZG1GeWVXbHVaM01vS1NCN1hHNWNkRngwY21WMGRYSnVJSFJvYVhNdVgxOTJZWEo1YVc1bmN6dGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJIWlhSeklHRnNiQ0IxYm1sbWIzSnRJSFpoY21saFlteGxJR2x1Wm05eWJXRjBhVzl1SUdsdUlIUm9aU0J6YUdGa1pYSWdZMjlrWlM1Y2JseDBJQ29nUW1WbWIzSmxJR05oYkd4cGJtY2dkR2hwY3lCdFpYUm9iMlFzSUhsdmRTQnVaV1ZrSUhSdklHTmhiR3dnZEdobElISmxabXhsWTNRZ2JXVjBhRzlrSUc5bUlIUm9hWE1nYVc1emRHRnVZMlV1WEc1Y2RDQXFJRUJ5WlhSMWNtNXpJRUZ5Y21GNUlHOW1JRkpsWm14bFkzUnBiMjVWYm1sbWIzSnRJRzlpYW1WamRGeHVYSFFnS2k5Y2JseDBjSFZpYkdsaklHZGxkQ0IxYm1sbWIzSnRjeWdwSUh0Y2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1ZlgzVnVhV1p2Y20xek8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRWRsZENCMGFHVWdibUZ0WlhNZ2IyWWdZV3hzSUdGMGRISnBZblYwWlhNZ2FXNWpiSFZrWldRZ2FXNGdkR2hsSUhOb1lXUmxjaTVjYmx4MElDb2dRbVZtYjNKbElHTmhiR3hwYm1jZ2RHaHBjeUJ0WlhSb2IyUXNJSGx2ZFNCdVpXVmtJSFJ2SUdOaGJHd2dkR2hsSUhKbFpteGxZM1FnYldWMGFHOWtJRzltSUhSb2FYTWdhVzV6ZEdGdVkyVXVYRzVjZENBcUlFQnlaWFIxY201eklFRnljbUY1SUc5bUlITjBjbWx1WjF4dVhIUWdLaTljYmx4MGNIVmliR2xqSUdkbGRDQmhkSFJ5YVdKMWRHVnpUbUZ0WlhNb0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVYMTloZEhSeWFXSjFkR1Z6TG0xaGNDZ29ZWFIwY21saWRYUmxLU0E5UGlCN2NtVjBkWEp1SUdGMGRISnBZblYwWlM1dVlXMWxmU2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1IyVjBJSFJvWlNCaGRIUnlhV0oxZEdVZ2MyVnRZVzUwYVdNZ0tHVXVaeTRnSjFCUFUwbFVTVTlPSnlrZ2IyWWdZV3hzSUdGMGRISnBZblYwWlhNZ2FXNWpiSFZrWldRZ2FXNGdkR2hsSUhOb1lXUmxjaTVjYmx4MElDb2dRbVZtYjNKbElHTmhiR3hwYm1jZ2RHaHBjeUJ0WlhSb2IyUXNJSGx2ZFNCdVpXVmtJSFJ2SUdOaGJHd2dkR2hsSUhKbFpteGxZM1FnYldWMGFHOWtJRzltSUhSb2FYTWdhVzV6ZEdGdVkyVXVYRzVjZENBcUlFQnlaWFIxY201eklFRnljbUY1SUc5bUlFRjBkSEpwWW5WMFpWTmxiV0Z1ZEdsamN5QnZZbXBsWTNSY2JseDBJQ292WEc1Y2RIQjFZbXhwWXlCblpYUWdZWFIwY21saWRYUmxjMU5sYldGdWRHbGpjeWdwSUh0Y2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1ZlgyRjBkSEpwWW5WMFpYTXViV0Z3S0NoaGRIUnlhV0oxZEdVcElEMCtJSHR5WlhSMWNtNGdZWFIwY21saWRYUmxMbk5sYldGdWRHbGpmU2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1IyVjBJSFJvWlNCMllYSnBZV0pzWlNCMGVYQmxJQ2hsTG1jdUlDZDJaV00wSnlrZ2IyWWdZV3hzSUdGMGRISnBZblYwWlhNZ2FXNWpiSFZrWldRZ2FXNGdkR2hsSUhOb1lXUmxjaTVjYmx4MElDb2dRbVZtYjNKbElHTmhiR3hwYm1jZ2RHaHBjeUJ0WlhSb2IyUXNJSGx2ZFNCdVpXVmtJSFJ2SUdOaGJHd2dkR2hsSUhKbFpteGxZM1FnYldWMGFHOWtJRzltSUhSb2FYTWdhVzV6ZEdGdVkyVXVYRzVjZENBcUlFQnlaWFIxY201eklFRnljbUY1SUc5bUlGWmhjbFI1Y0dVZ2IySnFaV04wWEc1Y2RDQXFMMXh1WEhSd2RXSnNhV01nWjJWMElHRjBkSEpwWW5WMFpYTlVlWEJsY3lncElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NWZYMkYwZEhKcFluVjBaWE11YldGd0tDaGhkSFJ5YVdKMWRHVXBJRDArSUh0eVpYUjFjbTRnWVhSMGNtbGlkWFJsTG5SNWNHVjlLVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCQlpHUWdZVzRnWVhSMGNtbGlkWFJsVTJWdFlXNTBhV056TGx4dVhIUWdLaUJVYUdVZ1lYUjBjbWxpZFhSbFUyVnRZVzUwYVdOeklHbHpJSFZ6WldRZ2FXNGdkR2hsSUZKbFpteGxZM1JwYjI1QmRIUnlhV0oxZEdVdWMyVnRZVzUwYVdOelhHNWNkQ0FxSUNoVFpXVWdjbVZtYkdWamRDQnRaWFJvYjJRZ2IyWWdkR2hwY3lCamJHRnpjeWxjYmx4MElDb3ZYRzVjZEhCMVlteHBZeUJoWkdSQmRIUnlhV0oxZEdWVFpXMWhiblJwWTNOTllYQW9iV0Z3T2lCTllYQThjM1J5YVc1bkxDQnpkSEpwYm1jK0tTQjdYRzVjZEZ4MGRHaHBjeTVmWDJGMGRISnBZblYwWlZObGJXRnVkR2xqYzAxaGNDQTlJRzVsZHlCTllYQW9XeTR1TG5Sb2FYTXVYMTloZEhSeWFXSjFkR1ZUWlcxaGJuUnBZM05OWVhBc0lDNHVMbTFoY0YwcE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUZrWkNCaElIVnVhV1p2Y20xVFpXMWhiblJwWTNNdVhHNWNkQ0FxSUZSb1pTQmhkSFJ5YVdKMWRHVlRaVzFoYm5ScFkzTWdhWE1nZFhObFpDQnBiaUIwYUdVZ1VtVm1iR1ZqZEdsdmJrRjBkSEpwWW5WMFpTNXpaVzFoYm5ScFkzTmNibHgwSUNvZ0tGTmxaU0J5Wldac1pXTjBJRzFsZEdodlpDQnZaaUIwYUdseklHTnNZWE56S1Z4dVhIUWdLaTljYmx4MGNIVmliR2xqSUdGa1pGVnVhV1p2Y20xVFpXMWhiblJwWTNOTllYQW9iV0Z3T2lCTllYQThjM1J5YVc1bkxDQnpkSEpwYm1jK0tTQjdYRzVjZEZ4MGRHaHBjeTVmWDNWdWFXWnZjbTFUWlcxaGJuUnBZM05OWVhBZ1BTQnVaWGNnVFdGd0tGc3VMaTUwYUdsekxsOWZkVzVwWm05eWJWTmxiV0Z1ZEdsamMwMWhjQ3dnTGk0dWJXRndYU2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1FXUmtJR0Z1SUdGMGRISnBZblYwWlZObGJXRnVkR2xqY3k1Y2JseDBJQ29nVkdobElHRjBkSEpwWW5WMFpWTmxiV0Z1ZEdsamN5QnBjeUIxYzJWa0lHbHVJSFJvWlNCU1pXWnNaV04wYVc5dVFYUjBjbWxpZFhSbExuTmxiV0Z1ZEdsamMxeHVYSFFnS2lBb1UyVmxJSEpsWm14bFkzUWdiV1YwYUc5a0lHOW1JSFJvYVhNZ1kyeGhjM01wWEc1Y2RDQXFMMXh1WEhSd2RXSnNhV01nWVdSa1FYUjBjbWxpZFhSbFUyVnRZVzUwYVdOektHdGxlVG9nYzNSeWFXNW5MQ0IyWVd4MVpUb2djM1J5YVc1bktTQjdYRzVjZEZ4MGRHaHBjeTVmWDJGMGRISnBZblYwWlZObGJXRnVkR2xqYzAxaGNDNXpaWFFvYTJWNUxDQjJZV3gxWlNrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRV1JrSUdFZ2RXNXBabTl5YlZObGJXRnVkR2xqY3k1Y2JseDBJQ29nVkdobElHRjBkSEpwWW5WMFpWTmxiV0Z1ZEdsamN5QnBjeUIxYzJWa0lHbHVJSFJvWlNCU1pXWnNaV04wYVc5dVFYUjBjbWxpZFhSbExuTmxiV0Z1ZEdsamMxeHVYSFFnS2lBb1UyVmxJSEpsWm14bFkzUWdiV1YwYUc5a0lHOW1JSFJvYVhNZ1kyeGhjM01wWEc1Y2RDQXFMMXh1WEhSd2RXSnNhV01nWVdSa1ZXNXBabTl5YlZObGJXRnVkR2xqY3loclpYazZJSE4wY21sdVp5d2dkbUZzZFdVNklITjBjbWx1WnlrZ2UxeHVYSFJjZEhSb2FYTXVYMTkxYm1sbWIzSnRVMlZ0WVc1MGFXTnpUV0Z3TG5ObGRDaHJaWGtzSUhaaGJIVmxLVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCSmJtbDBhV0ZzYVhwbElHRjBkSEpwWW5WMFpWTmxiV0Z1ZEdsamMxeHVYSFFnS2k5Y2JseDBjSFZpYkdsaklISmxjMlYwUVhSMGNtbGlkWFJsVTJWdFlXNTBhV056S0NrZ2UxeHVYSFJjZEhSb2FYTXVYMTloZEhSeWFXSjFkR1ZUWlcxaGJuUnBZM05OWVhBZ1BTQnVaWGNnVFdGd1BITjBjbWx1Wnl3Z2MzUnlhVzVuUGlncE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRWx1YVhScFlXeHBlbVVnZFc1cFptOXliVk5sYldGdWRHbGpjMXh1WEhRZ0tpOWNibHgwY0hWaWJHbGpJSEpsYzJWMFZXNXBabTl5YlZObGJXRnVkR2xqY3lncElIdGNibHgwWEhSMGFHbHpMbDlmZFc1cFptOXliVk5sYldGdWRHbGpjMDFoY0NBOUlHNWxkeUJOWVhBOGMzUnlhVzVuTENCemRISnBibWMrS0NrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRVzVoYkhsNlpTQnphR0ZrWlhJZ1kyOWtaU0J2WmlCMGFHVWdjMmhoWkdWeWFYUjVJR0Z1WkNCblpYUWdhVzVtYjNKdFlYUnBiMjRnYjJZZ1lYUjBjbWxpZFhSbExDQjJZWEo1YVc1bklHRnVaQ0IxYm1sbWIzSnRMbHh1WEhRZ0tpQlVhR1VnYVc1bWIzSnRZWFJwYjI0Z1kyRnVJR0psSUhKbGRISnBaWFpsWkNCbWNtOXRJSFJvWlNCblpYUWdiV1YwYUc5a0lHOW1JSFJvYVhNZ2FXNXpkR0Z1WTJVdVhHNWNkQ0FxWEc1Y2RDQXFJRlJvWlNCelpXMWhiblJwWXlCd2NtOXdaWEowZVNCdlppQjBhR1VnVW1WbWJHVmpkR2x2YmtGMGRISnBZblYwWlNCcGN5QmhjM05wWjI1bFpDQjBieUIwYUdVZ2RtRnNkV1VnYjJZZ2RHaGxJSE5sYldGdWRHbGpJR2xtWEc1Y2RDQXFJR2wwSUdseklITndaV05wWm1sbFpDQnBiaUIwYUdVZ1lYUjBjbWxpZFhSbElHeHBibVVnYjJZZ2RHaGxJSE5vWVdSbGNpQmpiMlJsTGlCSlppQnViM1FzSUhSb1pTQkJkSFJ5YVdKMWRHVlRaVzFoYm5ScFkzTk5ZWEJjYmx4MElDb2dhWE1nYzJWaGNtTm9aV1FnWm05eUlHMWhkR05vYVc1bklITmxiV0Z1ZEdsamN5d2diM0lnVlU1TFRrOVhUaTRnVkdobElITmhiV1VnWVhCd2JHbGxjeUIwYnlCMGFHVWdjMlZ0WVc1MGFXTWdjSEp2Y0dWeWRIa2diMlpjYmx4MElDb2dVbVZtYkdWamRHbHZibFZ1YVdadmNtMHVYRzVjZENBcUwxeHVYSFJ3ZFdKc2FXTWdjbVZtYkdWamRDZ3BJSHRjYmx4MFhIUmpiMjV6ZENCemNHeHBkSFJsWkZOb1lXUmxja052WkdVZ1BTQjBhR2x6TGw5ZmMzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE8xeHVYSFJjZEdOdmJuTjBJSE5vWVdSbGNsTjBZV2RsSUQwZ2RHaHBjeTVmWDNOb1lXUmxjbE4wWVdkbE8xeHVYRzVjZEZ4MFptOXlJQ2hqYjI1emRDQnphR0ZrWlhKRGIyUmxUR2x1WlNCdlppQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXBJSHRjYmx4MFhIUmNkR052Ym5OMElHbHpRWFIwY21saWRYUmxUR2x1WlNBOUlIUm9hWE11WDE5dFlYUmphRUYwZEhKcFluVjBaU2h6YUdGa1pYSkRiMlJsVEdsdVpTd2djMmhoWkdWeVUzUmhaMlVwTzF4dVhIUmNkRngwYVdZZ0tHbHpRWFIwY21saWRYUmxUR2x1WlNrZ2UxeHVYSFJjZEZ4MFhIUjBhR2x6TGw5ZllXUmtRWFIwY21saWRYUmxLSE5vWVdSbGNrTnZaR1ZNYVc1bEtUdGNibHgwWEhSY2RGeDBZMjl1ZEdsdWRXVTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR052Ym5OMElHbHpWbUZ5ZVdsdVoweHBibVVnUFNCMGFHbHpMbDlmYldGMFkyaFdZWEo1YVc1bktITm9ZV1JsY2tOdlpHVk1hVzVsTENCemFHRmtaWEpUZEdGblpTazdYRzVjZEZ4MFhIUnBaaUFvYVhOV1lYSjVhVzVuVEdsdVpTa2dlMXh1WEhSY2RGeDBYSFIwYUdsekxsOWZZV1JrVm1GeWVXbHVaeWh6YUdGa1pYSkRiMlJsVEdsdVpTd2djMmhoWkdWeVUzUmhaMlVwTzF4dVhIUmNkRngwWEhSamIyNTBhVzUxWlR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MFkyOXVjM1FnYVhOVmJtbG1iM0p0VEdsdVpTQTlJSE5vWVdSbGNrTnZaR1ZNYVc1bExtMWhkR05vS0M5ZUtEOGhXMXhjTDEwcFcxeGNkQ0JkS25WdWFXWnZjbTFiWEZ4MElGMHJMeWs3WEc1Y2RGeDBYSFJwWmlBb2FYTlZibWxtYjNKdFRHbHVaU2tnZTF4dVhIUmNkRngwWEhSMGFHbHpMbDlmWVdSa1ZXNXBabTl5YlNoemFHRmtaWEpEYjJSbFRHbHVaU2s3WEc1Y2RGeDBYSFJjZEdOdmJuUnBiblZsTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4MGZWeHVYRzVjZEhCeWFYWmhkR1VnWDE5elpYUkVaV1poZFd4MFFYUjBjbWxpZFhSbFFXNWtWVzVwWm05eWJWTmxiV0Z1ZEdsamMwMWhjQ2dwSUh0Y2JseDBYSFIwYUdsekxsOWZZWFIwY21saWRYUmxVMlZ0WVc1MGFXTnpUV0Z3TG5ObGRDZ25jRzl6YVhScGIyNG5MQ0FuVUU5VFNWUkpUMDRuS1R0Y2JseDBYSFIwYUdsekxsOWZZWFIwY21saWRYUmxVMlZ0WVc1MGFXTnpUV0Z3TG5ObGRDZ25ZMjlzYjNJa0p5d2dKME5QVEU5U1h6QW5LVHRjYmx4MFhIUjBhR2x6TGw5ZllYUjBjbWxpZFhSbFUyVnRZVzUwYVdOelRXRndMbk5sZENnblkyOXNiM0pmUHpBbkxDQW5RMDlNVDFKZk1DY3BPMXh1WEhSY2RIUm9hWE11WDE5aGRIUnlhV0oxZEdWVFpXMWhiblJwWTNOTllYQXVjMlYwS0NkMFpYaGpiMjl5WkNRbkxDQW5WRVZZUTA5UFVrUmZNQ2NwTzF4dVhIUmNkSFJvYVhNdVgxOWhkSFJ5YVdKMWRHVlRaVzFoYm5ScFkzTk5ZWEF1YzJWMEtDZDBaWGhqYjI5eVpGOC9NQ2NzSUNkVVJWaERUMDlTUkY4d0p5azdYRzVjZEZ4MGRHaHBjeTVmWDJGMGRISnBZblYwWlZObGJXRnVkR2xqYzAxaGNDNXpaWFFvSjNSbGVHTnZiM0prWHo4eEp5d2dKMVJGV0VOUFQxSkVYekVuS1R0Y2JseDBYSFIwYUdsekxsOWZZWFIwY21saWRYUmxVMlZ0WVc1MGFXTnpUV0Z3TG5ObGRDZ25kR1Y0WTI5dmNtUmZQekluTENBblZFVllRMDlQVWtSZk1pY3BPMXh1WEhSY2RIUm9hWE11WDE5aGRIUnlhV0oxZEdWVFpXMWhiblJwWTNOTllYQXVjMlYwS0NkdWIzSnRZV3duTENBblRrOVNUVUZNSnlrN1hHNWNkRngwZEdocGN5NWZYMkYwZEhKcFluVjBaVk5sYldGdWRHbGpjMDFoY0M1elpYUW9KM1JoYm1kbGJuUW5MQ0FuVkVGT1IwVk9WQ2NwTzF4dVhIUmNkSFJvYVhNdVgxOWhkSFJ5YVdKMWRHVlRaVzFoYm5ScFkzTk5ZWEF1YzJWMEtDZHFiMmx1ZENRbkxDQW5TazlKVGxSVFh6QW5LVHRjYmx4MFhIUjBhR2x6TGw5ZllYUjBjbWxpZFhSbFUyVnRZVzUwYVdOelRXRndMbk5sZENnblltOXVaU1FuTENBblNrOUpUbFJUWHpBbktUdGNibHgwWEhSMGFHbHpMbDlmWVhSMGNtbGlkWFJsVTJWdFlXNTBhV056VFdGd0xuTmxkQ2duYW05cGJuUmZQekFuTENBblNrOUpUbFJUWHpBbktUdGNibHgwWEhSMGFHbHpMbDlmWVhSMGNtbGlkWFJsVTJWdFlXNTBhV056VFdGd0xuTmxkQ2duWW05dVpWOC9NQ2NzSUNkS1QwbE9WRk5mTUNjcE8xeHVYSFJjZEhSb2FYTXVYMTloZEhSeWFXSjFkR1ZUWlcxaGJuUnBZM05OWVhBdWMyVjBLQ2QzWldsbmFIUWtKeXdnSjFkRlNVZElWRk5mTUNjcE8xeHVYSFJjZEhSb2FYTXVYMTloZEhSeWFXSjFkR1ZUWlcxaGJuUnBZM05OWVhBdWMyVjBLQ2QzWldsbmFIUmZQekFuTENBblYwVkpSMGhVVTE4d0p5azdYRzVjYmx4MFhIUjBhR2x6TGw5ZmRXNXBabTl5YlZObGJXRnVkR2xqYzAxaGNDNXpaWFFvSjNkdmNteGtiV0YwY21sNEp5d2dKMWR2Y214a1RXRjBjbWw0SnlrN1hHNWNkRngwZEdocGN5NWZYM1Z1YVdadmNtMVRaVzFoYm5ScFkzTk5ZWEF1YzJWMEtDZHViM0p0WVd4dFlYUnlhWGduTENBblRtOXliV0ZzVFdGMGNtbDRKeWs3WEc1Y2RGeDBkR2hwY3k1ZlgzVnVhV1p2Y20xVFpXMWhiblJwWTNOTllYQXVjMlYwS0NkMmFXVjNiV0YwY21sNEp5d2dKMVpwWlhkTllYUnlhWGduS1R0Y2JseDBYSFIwYUdsekxsOWZkVzVwWm05eWJWTmxiV0Z1ZEdsamMwMWhjQzV6WlhRb0ozQnliMnBsWTNScGIyNXRZWFJ5YVhnbkxDQW5VSEp2YW1WamRHbHZiazFoZEhKcGVDY3BPMXh1WEhSY2RIUm9hWE11WDE5MWJtbG1iM0p0VTJWdFlXNTBhV056VFdGd0xuTmxkQ2duYlc5a1pXeDJhV1YzYldGMGNtbDRKeXdnSjAxdlpHVnNWbWxsZDAxaGRISnBlQ2NwTzF4dVhIUjlYRzVjYmx4MGNISnBkbUYwWlNCZlgyMWhkR05vUVhSMGNtbGlkWFJsS0hOb1lXUmxja052WkdWTWFXNWxPaUJ6ZEhKcGJtY3NJSE5vWVdSbGNsTjBZV2RsT2lCVGFHRmtaWEpUZEdGblpWTjBjaWtnZTF4dVhIUmNkR2xtSUNoemFHRmtaWEpUZEdGblpTQWhQVDBnSjNabGNuUmxlQ2NwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJtWVd4elpUdGNibHgwWEhSOVhHNWNkRngwY21WMGRYSnVJSE5vWVdSbGNrTnZaR1ZNYVc1bExtMWhkR05vS0M5ZUtEOGhXMXhjTDEwcFcxeGNkQ0JkS2loaGRIUnlhV0oxZEdWOGFXNHBXMXhjZENCZEt5NHJPeThwTzF4dVhIUjlYRzVjYmx4MGNISnBkbUYwWlNCZlgyRmtaRUYwZEhKcFluVjBaU2h6YUdGa1pYSkRiMlJsVEdsdVpUb2djM1J5YVc1bktTQjdYRzVjZEZ4MFkyOXVjM1FnY21WbWJHVmpkR2x2YmtGMGRISnBZblYwWlRvZ1VtVm1iR1ZqZEdsdmJrRjBkSEpwWW5WMFpTQTlJSHRjYmx4MFhIUmNkRzVoYldVNklDY25MRnh1WEhSY2RGeDBkSGx3WlRvZ0oyWnNiMkYwSnl4Y2JseDBYSFJjZEhObGJXRnVkR2xqT2lBblZVNUxUazlYVGlkY2JseDBYSFI5TzF4dVhHNWNkRngwWTI5dWMzUWdiV0YwWTJoVWVYQmxJRDBnYzJoaFpHVnlRMjlrWlV4cGJtVXViV0YwWTJnb1VtVm1iR1ZqZEdsdmJpNWhkSFJ5YVdKMWRHVkJibVJXWVhKNWFXNW5WSGx3WlZKbFowVjRjQ2s3WEc1Y2RGeDBhV1lnS0cxaGRHTm9WSGx3WlNrZ2UxeHVYSFJjZEZ4MFkyOXVjM1FnZEhsd1pTQTlJRzFoZEdOb1ZIbHdaVnN4WFR0Y2JseDBYSFJjZEhKbFpteGxZM1JwYjI1QmRIUnlhV0oxZEdVdWRIbHdaU0E5SUhSNWNHVWdZWE1nVm1GeVZIbHdaVHRjYmx4MFhIUmNkR052Ym5OMElHNWhiV1VnUFNCdFlYUmphRlI1Y0dWYk1sMDdYRzVjZEZ4MFhIUnlaV1pzWldOMGFXOXVRWFIwY21saWRYUmxMbTVoYldVZ1BTQnVZVzFsTzF4dVhHNWNkRngwWEhSamIyNXpkQ0J0WVhSamFGTmxiV0Z1ZEdsaklEMGdjMmhoWkdWeVEyOWtaVXhwYm1VdWJXRjBZMmdvVW1WbWJHVmpkR2x2Ymk1elpXMWhiblJwWTFKbFowVjRjQ2xjYmx4MFhIUmNkR2xtSUNodFlYUmphRk5sYldGdWRHbGpLU0I3WEc1Y2RGeDBYSFJjZEhKbFpteGxZM1JwYjI1QmRIUnlhV0oxZEdVdWMyVnRZVzUwYVdNZ1BTQnRZWFJqYUZObGJXRnVkR2xqV3pGZElHRnpJRUYwZEhKcFluVjBaVk5sYldGdWRHbGpjenRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkR1p2Y2lBb2JHVjBJRnRyWlhrc0lIWmhiSFZsWFNCdlppQjBhR2x6TGw5ZllYUjBjbWxpZFhSbFUyVnRZVzUwYVdOelRXRndLU0I3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLRzVoYldVdWJXRjBZMmdvYm1WM0lGSmxaMFY0Y0NoclpYa3NJQ2RwSnlrcEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSeVpXWnNaV04wYVc5dVFYUjBjbWxpZFhSbExuTmxiV0Z1ZEdsaklEMGdkbUZzZFdVZ1lYTWdRWFIwY21saWRYUmxVMlZ0WVc1MGFXTnpPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBYSFIwYUdsekxsOWZZWFIwY21saWRYUmxjeTV3ZFhOb0tISmxabXhsWTNScGIyNUJkSFJ5YVdKMWRHVXBPMXh1WEhSOVhHNWNibHgwY0hKcGRtRjBaU0JmWDIxaGRHTm9WbUZ5ZVdsdVp5aHphR0ZrWlhKRGIyUmxUR2x1WlRvZ2MzUnlhVzVuTENCemFHRmtaWEpUZEdGblpUb2dVMmhoWkdWeVUzUmhaMlZUZEhJcElIdGNibHgwWEhScFppQW9jMmhoWkdWeVUzUmhaMlVnUFQwOUlDZDJaWEowWlhnbktTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2MyaGhaR1Z5UTI5a1pVeHBibVV1YldGMFkyZ29MMTRvUHlGYlhGd3ZYU2xiWEZ4MElGMHFLSFpoY25scGJtZDhiM1YwS1Z0Y1hIUWdYU3N1S3pzdktUdGNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwY21WMGRYSnVJSE5vWVdSbGNrTnZaR1ZNYVc1bExtMWhkR05vS0M5ZUtEOGhXMXhjTDEwcFcxeGNkQ0JkS2loMllYSjVhVzVuZkdsdUtWdGNYSFFnWFNzdUt6c3ZLVHRjYmx4MFhIUjlYRzVjZEgxY2JseHVYSFJ3Y21sMllYUmxJRjlmWVdSa1ZtRnllV2x1WnloemFHRmtaWEpEYjJSbFRHbHVaVG9nYzNSeWFXNW5MQ0J6YUdGa1pYSlRkR0ZuWlRvZ1UyaGhaR1Z5VTNSaFoyVlRkSElwSUh0Y2JseDBYSFJqYjI1emRDQnlaV1pzWldOMGFXOXVWbUZ5ZVdsdVp6b2dVbVZtYkdWamRHbHZibFpoY25scGJtY2dQU0I3WEc1Y2RGeDBYSFJ1WVcxbE9pQW5KeXhjYmx4MFhIUmNkSFI1Y0dVNklDZG1iRzloZENjc1hHNWNkRngwWEhScGJtOTFkRG9nSjJsdUoxeHVYSFJjZEgwN1hHNWNibHgwWEhSamIyNXpkQ0J0WVhSamFGUjVjR1VnUFNCemFHRmtaWEpEYjJSbFRHbHVaUzV0WVhSamFDaFNaV1pzWldOMGFXOXVMbUYwZEhKcFluVjBaVUZ1WkZaaGNubHBibWRVZVhCbFVtVm5SWGh3S1R0Y2JseDBYSFJwWmlBb2JXRjBZMmhVZVhCbEtTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCMGVYQmxJRDBnYldGMFkyaFVlWEJsV3pGZE8xeHVYSFJjZEZ4MGNtVm1iR1ZqZEdsdmJsWmhjbmxwYm1jdWRIbHdaU0E5SUhSNWNHVWdZWE1nVm1GeVZIbHdaVHRjYmx4MFhIUmNkR052Ym5OMElHNWhiV1VnUFNCdFlYUmphRlI1Y0dWYk1sMDdYRzVjZEZ4MFhIUnlaV1pzWldOMGFXOXVWbUZ5ZVdsdVp5NXVZVzFsSUQwZ2JtRnRaVHRjYmx4MFhIUmNkSEpsWm14bFkzUnBiMjVXWVhKNWFXNW5MbWx1YjNWMElEMGdLSE5vWVdSbGNsTjBZV2RsSUQwOVBTQW5kbVZ5ZEdWNEp5a2dQeUFuYjNWMEp5QTZJQ2RwYmljN1hHNWNkRngwZlZ4dVhIUmNkSFJvYVhNdVgxOTJZWEo1YVc1bmN5NXdkWE5vS0hKbFpteGxZM1JwYjI1V1lYSjVhVzVuS1R0Y2JseDBmVnh1WEc1Y2RIQnlhWFpoZEdVZ1gxOWhaR1JWYm1sbWIzSnRLSE5vWVdSbGNrTnZaR1ZNYVc1bE9pQnpkSEpwYm1jcElIdGNibHgwWEhSamIyNXpkQ0J5Wldac1pXTjBhVzl1Vlc1cFptOXliVG9nVW1WbWJHVmpkR2x2YmxWdWFXWnZjbTBnUFNCN1hHNWNkRngwWEhSdVlXMWxPaUFuSnl4Y2JseDBYSFJjZEhSNWNHVTZJQ2RtYkc5aGRDY3NYRzVjZEZ4MFhIUnpaVzFoYm5ScFl6b2dKMVZPUzA1UFYwNG5YRzVjZEZ4MGZUdGNibHh1WEhSY2RHTnZibk4wSUcxaGRHTm9WSGx3WlNBOUlITm9ZV1JsY2tOdlpHVk1hVzVsTG0xaGRHTm9LRkpsWm14bFkzUnBiMjR1ZFc1cFptOXliVlI1Y0dWU1pXZEZlSEFwTzF4dVhIUmNkR2xtSUNodFlYUmphRlI1Y0dVcElIdGNibHgwWEhSY2RHTnZibk4wSUhSNWNHVWdQU0J0WVhSamFGUjVjR1ZiTVYwN1hHNWNkRngwWEhSeVpXWnNaV04wYVc5dVZXNXBabTl5YlM1MGVYQmxJRDBnZEhsd1pTQmhjeUJXWVhKVWVYQmxPMXh1WEhSY2RGeDBZMjl1YzNRZ2JtRnRaU0E5SUcxaGRHTm9WSGx3WlZzeVhUdGNibHgwWEhSY2RISmxabXhsWTNScGIyNVZibWxtYjNKdExtNWhiV1VnUFNCdVlXMWxPMXh1WEc1Y2RGeDBYSFJqYjI1emRDQnRZWFJqYUZObGJXRnVkR2xqY3lBOUlITm9ZV1JsY2tOdlpHVk1hVzVsTG0xaGRHTm9LRkpsWm14bFkzUnBiMjR1YzJWdFlXNTBhV05TWldkRmVIQXBYRzVjZEZ4MFhIUnBaaUFvYldGMFkyaFRaVzFoYm5ScFkzTXBJSHRjYmx4MFhIUmNkRngwY21WbWJHVmpkR2x2YmxWdWFXWnZjbTB1YzJWdFlXNTBhV01nUFNCdFlYUmphRk5sYldGdWRHbGpjMXN4WFNCaGN5QlZibWxtYjNKdFUyVnRZVzUwYVdOek8xeHVYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFptOXlJQ2hzWlhRZ1cydGxlU3dnZG1Gc2RXVmRJRzltSUhSb2FYTXVYMTkxYm1sbWIzSnRVMlZ0WVc1MGFXTnpUV0Z3S1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0c1aGJXVXViV0YwWTJnb2JtVjNJRkpsWjBWNGNDaHJaWGtzSUNkcEp5a3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnlaV1pzWldOMGFXOXVWVzVwWm05eWJTNXpaVzFoYm5ScFl5QTlJSFpoYkhWbE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4MFhIUjBhR2x6TGw5ZmRXNXBabTl5YlhNdWNIVnphQ2h5Wldac1pXTjBhVzl1Vlc1cFptOXliU2s3WEc1Y2RIMWNibjA3SWl3aWFXMXdiM0owSUh0VVpXMXdiR0YwWlU5aWFtVmpkSDBnWm5KdmJTQW5MaTR2ZEhsd1pYTXZkSGx3WlNjN1hHNWNiaThxS2x4dUlDb2dWR2hwY3lCamJHRnpjeUJsWkdsMGN5QjBhR1VnWTI5a1pTQndjbTl3WlhKMGVTQnZaaUJoSUhOb1lXUmxjbWwwZVNCdlltcGxZM1F1WEc0Z0tpOWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZOb1lXUmxja1ZrYVhSdmNpQjdYRzVjZEhOMFlYUnBZeUJmYVc1elpYSjBSR1ZtYVc1cGRHbHZiaWh6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1U2SUhOMGNtbHVaMXRkTENCa1pXWnBibWwwYVc5dU9pQnpkSEpwYm1jcElIdGNibHgwWEhSamIyNXpkQ0JrWldaVGRISWdQU0JrWldacGJtbDBhVzl1TG5KbGNHeGhZMlVvTHlOa1pXWnBibVZiWEZ4MElGMHJMeXdnSnljcE8xeHVYRzVjZEZ4MGMzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExuVnVjMmhwWm5Rb1lDTmtaV1pwYm1VZ0pIdGtaV1pUZEhKOVlDazdYRzVjZEgxY2JseHVYSFJ6ZEdGMGFXTWdYMlpwYkd4VVpXMXdiR0YwWlNoemFHRmtaWEpEYjJSbE9pQnpkSEpwYm1jc0lIUmxiWEJzWVhSbFQySnFaV04wT2lCVVpXMXdiR0YwWlU5aWFtVmpkQ2tnZTF4dVhIUmNkR052Ym5OMElIUmxiWEJzWVhSbFUzUnlhVzVuSUQwZ2MyaGhaR1Z5UTI5a1pTNXlaWEJzWVdObEtDOWNYQzljWENwYlhGeDBJRjBxYzJoaFpHVnlhWFI1T2x0Y1hIUWdYU29vUUh0YlhGeDBJRjBxS1NoY1hGTXJLU2hiWEZ4MElGMHFmU2xiWEZ4MElGMHFYRndxWEZ3dkwyY3NJQ2NrZTNSb2FYTXVKREo5SnlrN1hHNWNibHgwWEhSamIyNXpkQ0J5WlhOMWJIUkRiMlJsSUQwZ2JtVjNJRVoxYm1OMGFXOXVLRndpY21WMGRYSnVJR0JjSWlBcklIUmxiWEJzWVhSbFUzUnlhVzVuSUNzZ1hDSmdPMXdpS1M1allXeHNLSFJsYlhCc1lYUmxUMkpxWldOMEtUdGNibHgwWEhSeVpYUjFjbTRnY21WemRXeDBRMjlrWlR0Y2JseDBmVnh1ZlNJc0ltbHRjRzl5ZENCN1UyaGhaR1Z5Vm1WeWMybHZibjBnWm5KdmJTQW5MaTR2ZEhsd1pYTXZkSGx3WlNjN1hHNWNiaThxS2x4dUlDb2dWR2hwY3lCamJHRnpjeUJqYjI1MlpYSjBjeUIwYUdVZ1kyOWtaU0J3Y205d1pYSjBlU0J2WmlCaElITm9ZV1JsY21sMGVTQnZZbXBsWTNRZ2RHOGdkR2hsSUhOd1pXTnBabWxsWkNCbWIzSnRZWFF1WEc0Z0tpOWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZOb1lXUmxjbFJ5WVc1elptOXliV1Z5SUh0Y2JseDBMeW9xWEc1Y2RDQXFJRUJ3Y21sMllYUmxYRzVjZENBcUlGUnlZVzV6YkdGMFpTQmhJRWRNVTB3Z1JWTXpJSE5vWVdSbGNpQmpiMlJsSUhSdklHRWdSMHhUVENCRlV6RWdjMmhoWkdWeUlHTnZaR1ZjYmx4MElDb3ZYRzVjZEhOMFlYUnBZeUJmZEhKaGJuTm1iM0p0Vkc5SFRGTk1SVk14S0Z4dVhIUmNkSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVG9nYzNSeWFXNW5XMTBzWEc1Y2RGeDBhWE5HY21GbmJXVnVkRk5vWVdSbGNqb2dZbTl2YkdWaGJpeGNibHgwWEhSbGJXSmxaRVZ5Y205eWMwbHVUM1YwY0hWME9pQmliMjlzWldGdVhHNWNkQ2tnZTF4dVhIUmNkSFJvYVhNdVgxOWpiMjUyWlhKMFQzSkpibk5sY25SV1pYSnphVzl1UjB4VFRFVlRNU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VwTzF4dVhIUmNkSFJvYVhNdVgxOXlaVzF2ZG1WRlV6TlJkV0ZzYVdacFpYSW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxMQ0JsYldKbFpFVnljbTl5YzBsdVQzVjBjSFYwS1R0Y2JseDBYSFIwYUdsekxsOWZZMjl1ZG1WeWRFbHVLSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU3dnYVhOR2NtRm5iV1Z1ZEZOb1lXUmxjaWs3WEc1Y2RGeDBkR2hwY3k1ZlgyTnZiblpsY25SUGRYUW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxMQ0JwYzBaeVlXZHRaVzUwVTJoaFpHVnlMQ0JsYldKbFpFVnljbTl5YzBsdVQzVjBjSFYwS1R0Y2JseDBYSFIwYUdsekxsOWZjbVZ0YjNabFVISmxZMmx6YVc5dVJtOXlSVk16S0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlNrN1hHNWNkRngwZEdocGN5NWZYMk52Ym5abGNuUlVaWGgwZFhKbFJuVnVZM1JwYjI1VWIwVlRNU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUdselJuSmhaMjFsYm5SVGFHRmtaWElzSUdWdFltVmtSWEp5YjNKelNXNVBkWFJ3ZFhRcE8xeHVYSFJjZEdOdmJuTjBJSFJ5WVc1elptOXliV1ZrVTNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsSUQwZ2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE8xeHVYRzVjZEZ4MGNtVjBkWEp1SUhSeVlXNXpabTl5YldWa1UzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJ3Y21sMllYUmxYRzVjZENBcUlGUnlZVzV6YkdGMFpTQmhJRWRNVTB3Z1JWTXhJSE5vWVdSbGNpQmpiMlJsSUhSdklHRWdSMHhUVENCRlV6TWdjMmhoWkdWeUlHTnZaR1ZjYmx4MElDb3ZYRzVjZEhOMFlYUnBZeUJmZEhKaGJuTm1iM0p0Vkc5SFRGTk1SVk16S0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlRvZ2MzUnlhVzVuVzEwc0lHbHpSbkpoWjIxbGJuUlRhR0ZrWlhJNklHSnZiMnhsWVc0cElIdGNibHgwWEhSMGFHbHpMbDlmWTI5dWRtVnlkRTl5U1c1elpYSjBWbVZ5YzJsdmJrZE1VMHhGVXpNb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbEtUdGNibHgwWEhSMGFHbHpMbDlmWTI5dWRtVnlkRUYwZEhKcFluVjBaU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUdselJuSmhaMjFsYm5SVGFHRmtaWElwTzF4dVhIUmNkSFJvYVhNdVgxOWpiMjUyWlhKMFZtRnllV2x1WnloemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lHbHpSbkpoWjIxbGJuUlRhR0ZrWlhJcE8xeHVYSFJjZEhSb2FYTXVYMTlqYjI1MlpYSjBWR1Y0ZEhWeVpVTjFZbVVvYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsS1R0Y2JseDBYSFIwYUdsekxsOWZZMjl1ZG1WeWRGUmxlSFIxY21VeVJDaHpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXBPMXh1WEhSY2RIUm9hWE11WDE5amIyNTJaWEowVkdWNGRIVnlaVEpFVUhKdlpDaHpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXBPMXh1WEhSY2RIUm9hWE11WDE5amIyNTJaWEowVkdWNGRIVnlaVE5FS0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlNrN1hHNWNkRngwZEdocGN5NWZYMk52Ym5abGNuUlVaWGgwZFhKbE0wUlFjbTlrS0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlNrN1hHNWNkRngwWTI5dWMzUWdkSEpoYm5ObWIzSnRaV1JUY0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VnUFNCemNHeHBkSFJsWkZOb1lXUmxja052WkdVN1hHNWNibHgwWEhSeVpYUjFjbTRnZEhKaGJuTm1iM0p0WldSVGNHeHBkSFJsWkZOb1lXUmxja052WkdVN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRSEJ5YVhaaGRHVmNibHgwSUNvZ1ZISmhibk5zWVhSbElHRWdSMHhUVENCemFHRmtaWElnWTI5a1pTQjBieUJoSUhOb1lXUmxjaUJqYjJSbElHOW1JSE53WldOcFptbGxaQ0JIVEZOTUlIWmxjbk5wYjI1Y2JseDBJQ292WEc1Y2RITjBZWFJwWXlCZmRISmhibk5tYjNKdFZHOG9YRzVjZEZ4MGRtVnljMmx2YmpvZ1UyaGhaR1Z5Vm1WeWMybHZiaXhjYmx4MFhIUnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVTZJSE4wY21sdVoxdGRMRnh1WEhSY2RHbHpSbkpoWjIxbGJuUlRhR0ZrWlhJNklHSnZiMnhsWVc0c1hHNWNkRngwWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZERvZ1ltOXZiR1ZoYmx4dVhIUXBJSHRjYmx4MFhIUnBaaUFvZG1WeWMybHZiaTV0WVhSamFDZ3ZkMlZpWjJ3eWZHVnpNeTlwS1NrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTXVYM1J5WVc1elptOXliVlJ2UjB4VFRFVlRNeWh6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUdselJuSmhaMjFsYm5SVGFHRmtaWElwTzF4dVhIUmNkSDBnWld4elpTQnBaaUFvZG1WeWMybHZiaTV0WVhSamFDZ3ZkMlZpWjJ3eGZHVnpNUzlwS1NrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTXVYM1J5WVc1elptOXliVlJ2UjB4VFRFVlRNU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUdselJuSmhaMjFsYm5SVGFHRmtaWElzSUdWdFltVmtSWEp5YjNKelNXNVBkWFJ3ZFhRcE8xeHVYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJqYjI1emIyeGxMbVZ5Y205eUtDZEpiblpoYkdsa0lGWmxjbk5wYjI0bktWeHVYSFJjZEZ4MGNtVjBkWEp1SUhOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlR0Y2JseDBYSFI5WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1FIQnlhWFpoZEdWY2JseDBJQ29nU1dZZ2RHaGxJR1pwY25OMElHeHBibVVnWTI5dWRHRnBibk1nZG1WeWMybHZiaUJwYm1admNtMWhkR2x2Yml3Z2IzWmxjbmR5YVhSbElIUm9aU0JtYVhKemRDQnNhVzVsSUhkcGRHZ2dKeU4yWlhKemFXOXVJREV3TUNjdVhHNWNkQ0FxSUVsbUlHNXZkQ3dnWVdSa0lDY2pkbVZ5YzJsdmJpQXhNREFuSUhSdklIUm9aU0JtYVhKemRDQnNhVzVsTGx4dVhIUWdLbHh1WEhRZ0tpQk9iM1JsT2lCSlppQjBhR1VnWm1seWMzUWdiR2x1WlNCcGN5QmpiMjF0Wlc1MFpXUWdiM1YwSUdGdVpDQjBhR1VnZG1WeWMybHZiaUJwYm1admNtMWhkR2x2YmlCcGN5QjNjbWwwZEdWdUlHbHVJSFJvWlNCelpXTnZibVFnYjNJZ2JHRjBaWElnYkdsdVpTeGNibHgwSUNvZ2RHaGxJR0Z3Y0hKdmNISnBZWFJsSUhabGNuTnBiMjRnYVc1bWIzSnRZWFJwYjI0Z2QybHNiQ0JpWlNCaFpHUmxaQ0IwYnlCMGFHVWdabWx5YzNRZ2JHbHVaU0JoYm1RZ2RHaGxJSFZ6WlhJdFpHVm1hVzVsWkNCMlpYSnphVzl1SUdsdVptOXliV0YwYVc5dVhHNWNkQ0FxSUdsdUlIUm9aU0J6WldOdmJtUWdiM0lnYkdGMFpYSWdiR2x1WlNCM2FXeHNJR0psSUhKbGJXOTJaV1F1WEc1Y2RDQXFMMXh1WEhSd2NtbDJZWFJsSUhOMFlYUnBZeUJmWDJOdmJuWmxjblJQY2tsdWMyVnlkRlpsY25OcGIyNUhURk5NUlZNeEtITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pUb2djM1J5YVc1blcxMHBJSHRjYmx4MFhIUmpiMjV6ZENCeVpXY2dQU0F2WGlnL0lWdGNYQzlkS1Z0Y1hIUWdYU29qVzF4Y2RDQmRLblpsY25OcGIyNWJYRngwSUYwckxpb3ZPMXh1WEhSY2RIUm9hWE11WDE5eVpXMXZkbVZHYVhKemRFMWhkR05vYVc1blRHbHVaU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUhKbFp5azdYRzVjYmx4MFhIUnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXVkVzV6YUdsbWRDZ25JM1psY25OcGIyNGdNVEF3SnlrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRSEJ5YVhaaGRHVmNibHgwSUNvZ1NXWWdkR2hsSUdacGNuTjBJR3hwYm1VZ1kyOXVkR0ZwYm5NZ2RtVnljMmx2YmlCcGJtWnZjbTFoZEdsdmJpd2diM1psY25keWFYUmxJSFJvWlNCbWFYSnpkQ0JzYVc1bElIZHBkR2dnSnlOMlpYSnphVzl1SURNd01DQmxjeWN1WEc1Y2RDQXFJRWxtSUc1dmRDd2dZV1JrSUNjamRtVnljMmx2YmlBek1EQWdaWE1uSUhSdklIUm9aU0JtYVhKemRDQnNhVzVsTGx4dVhIUWdLaUJKYmlCaWIzUm9JR05oYzJWekxDQW5JMlJsWm1sdVpTQkhURk5NWDBWVE15Y2dkMmxzYkNCaVpTQnBibk5sY25SbFpDQnBiaUIwYUdVZ2MyVmpiMjVrSUd4cGJtVXVYRzVjZENBcUlGVnpaU0IwYUdVZ0p5TmtaV1pwYm1VZ1IweFRURjlGVXpNbklHUnBjbVZqZEdsMlpTQnBaaUI1YjNVZ2QyRnVkQ0IwYnlCM2NtbDBaU0JoSUhOb1lXUmxjaUJqYjJSbElIUm9ZWFFnZDJsc2JDQnZibXg1SUhKMWJpQnBiaUIwYUdVZ1kyRnpaU0J2WmlCM1pXSm5iREl1WEc1Y2RDQXFYRzVjZENBcUlFNXZkR1U2SUVsbUlIUm9aU0JtYVhKemRDQnNhVzVsSUdseklHTnZiVzFsYm5SbFpDQnZkWFFnWVc1a0lIUm9aU0IyWlhKemFXOXVJR2x1Wm05eWJXRjBhVzl1SUdseklIZHlhWFIwWlc0Z2FXNGdkR2hsSUhObFkyOXVaQ0J2Y2lCc1lYUmxjaUJzYVc1bExGeHVYSFFnS2lCMGFHVWdZWEJ3Y205d2NtbGhkR1VnZG1WeWMybHZiaUJwYm1admNtMWhkR2x2YmlCM2FXeHNJR0psSUdGa1pHVmtJSFJ2SUhSb1pTQm1hWEp6ZENCc2FXNWxJR0Z1WkNCMGFHVWdkWE5sY2kxa1pXWnBibVZrSUhabGNuTnBiMjRnYVc1bWIzSnRZWFJwYjI1Y2JseDBJQ29nYVc0Z2RHaGxJSE5sWTI5dVpDQnZjaUJzWVhSbGNpQnNhVzVsSUhkcGJHd2dZbVVnY21WdGIzWmxaQzVjYmx4MElDb3ZYRzVjZEhCeWFYWmhkR1VnYzNSaGRHbGpJRjlmWTI5dWRtVnlkRTl5U1c1elpYSjBWbVZ5YzJsdmJrZE1VMHhGVXpNb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE9pQnpkSEpwYm1kYlhTa2dlMXh1WEhSY2RHTnZibk4wSUhKbFp5QTlJQzllS0Q4aFcxeGNMMTBwVzF4Y2RDQmRLaU5iWEZ4MElGMHFkbVZ5YzJsdmJsdGNYSFFnWFNzdUtpODdYRzVjZEZ4MGRHaHBjeTVmWDNKbGJXOTJaVVpwY25OMFRXRjBZMmhwYm1kTWFXNWxLSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU3dnY21WbktUdGNibHh1WEhSY2RITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTNTFibk5vYVdaMEtDY2paR1ZtYVc1bElFZE1VMHhmUlZNekp5azdYRzVjZEZ4MGMzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExuVnVjMmhwWm5Rb0p5TjJaWEp6YVc5dUlETXdNQ0JsY3ljcE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJ3Y21sMllYUmxYRzVjZENBcUlFWnBibVFnZEdobElDZHBiaWNnY1hWaGJHbG1hV1Z5SUdsdUlIUm9aU0J6YUdGa1pYSWdZMjlrWlNCaGJtUWdjbVZ3YkdGalpTQnBkQ0IzYVhSb0lIUm9aU0JIVEZOTUlFVlRNU0J4ZFdGc2FXWnBaWElvSjJGMGRISnBZblYwWlNjZ2IzSWdKM1poY25scGJtY25LVnh1WEhRZ0tpQlVhR2x6SUcxbGRHaHZaQ0JrYVhKbFkzUnNlU0J5WlhCc1lXTmxJSFJvWlNCbGJHVnRaVzUwY3lCdlppQjBhR1VnYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsSUhaaGNtbGhZbXhsTGx4dVhIUWdLaTljYmx4MGNISnBkbUYwWlNCemRHRjBhV01nWDE5amIyNTJaWEowU1c0b2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE9pQnpkSEpwYm1kYlhTd2dhWE5HY21GbmJXVnVkRk5vWVdSbGNqb2dZbTl2YkdWaGJpa2dlMXh1WEhSY2RHTnZibk4wSUhKbFp5QTlJQzllS0Q4aFcxeGNMMTBwVzF4Y2RDQmRLbWx1VzF4Y2RDQmRLeWdvYUdsbmFIQjhiV1ZrYVhWdGNIeHNiM2R3ZkNsYlhGeDBJRjBxWEZ4M0sxdGNYSFFnWFNwY1hIY3JXMXhjZENCZEtqc3BMenRjYmx4dVhIUmNkR3hsZENCeVpYQnNZV05sUm5WdVl6dGNibHgwWEhScFppQW9hWE5HY21GbmJXVnVkRk5vWVdSbGNpa2dlMXh1WEhSY2RGeDBjbVZ3YkdGalpVWjFibU1nUFNCbWRXNWpkR2x2YmlBb2JXRjBZMmc2SUhOMGNtbHVaeXdnY0RFNklITjBjbWx1WnlrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z0ozWmhjbmxwYm1jZ0p5QXJJSEF4TzF4dVhIUmNkRngwZlZ4dVhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUnlaWEJzWVdObFJuVnVZeUE5SUdaMWJtTjBhVzl1SUNodFlYUmphRG9nYzNSeWFXNW5MQ0J3TVRvZ2MzUnlhVzVuS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlBbllYUjBjbWxpZFhSbElDY2dLeUJ3TVR0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2JseDBYSFIwYUdsekxsOWZjbVZ3YkdGalpVeHBibVVvYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsTENCeVpXY3NJSEpsY0d4aFkyVkdkVzVqS1R0Y2JseDBmVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFjSEpwZG1GMFpWeHVYSFFnS2lCR2FXNWtJSFJvWlNCY0ltOTFkRndpSUhGMVlXeHBabWxsY2lCcGJpQjBhR1VnYzJoaFpHVnlJR052WkdVZ1lXNWtJRzF2WkdsbWVTQjBhR1VnYzJoaFpHVnlJR052WkdVdVhHNWNkQ0FxSUVsbUlIUm9aU0J6YUdGa1pYSWdjM1JoWjJVZ2FYTWdkbVZ5ZEdWNExDQjBhR1VnWENKdmRYUmNJaUJ4ZFdGc2FXWnBaWEp6SUhkcGJHd2dZbVVnY21Wd2JHRmpaV1FnWW5rZ1hDSjJZWEo1YVc1blhDSWdjWFZoYkdsbWFXVnlMbHh1WEhRZ0tpQkpaaUIwYUdVZ2MyaGhaR1Z5SUhOMFlXZGxJR2x6SUdaeVlXZHRaVzUwSUdGdVpDQjBhR1VnYzJoaFpHVnlJR2hoY3lCY0ltOTFkRndpSUhGMVlXeHBabWxsY25Nc0lIUm9aU0JjSW05MWRGd2lJSEYxWVd4cFptbGxjbk1nZDJsc2JGeHVYSFFnS2lCaVpTQmtaV3hsZEdWa0lHRnVaQ0IwYUdVZ2RtRnlhV0ZpYkdVZ2FYTWdkWE5sWkNCMGJ5QmhjM05wWjI0Z1lTQjJZV3gxWlNCMGJ5Qm5iRjlHY21GblEyOXNiM0l1WEc1Y2RDQXFJRlJvYVhNZ2JXVjBhRzlrSUdScGNtVmpkR3g1SUhKbGNHeGhZMlVnZEdobElHVnNaVzFsYm5SeklHOW1JSFJvWlNCemNHeHBkSFJsWkZOb1lXUmxja052WkdVZ2RtRnlhV0ZpYkdVdVhHNWNkQ0FxTDF4dVhIUndjbWwyWVhSbElITjBZWFJwWXlCZlgyTnZiblpsY25SUGRYUW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU3dnYVhOR2NtRm5iV1Z1ZEZOb1lXUmxjam9nWW05dmJHVmhiaXdnWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZERvZ1ltOXZiR1ZoYmlrZ2UxeHVYSFJjZEdsbUlDaHBjMFp5WVdkdFpXNTBVMmhoWkdWeUtTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCMllYSnBZV0pzWlU1aGJXVWdQU0IwYUdsekxsOWZjbVZ0YjNabFQzVjBVWFZoYkdsbWFXVnlLSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU3dnWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZENrN1hHNWNkRngwWEhScFppQW9kbUZ5YVdGaWJHVk9ZVzFsSUQwOUlHNTFiR3dwSUh0Y2JseDBYSFJjZEZ4MEx5OGdibThnYjNWMElIRjFZV3hwWm1sbGNseHVYSFJjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RIUm9hWE11WDE5aFpHUkhURVp5WVdkRGIyeHZjaWgyWVhKcFlXSnNaVTVoYldVc0lITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTd2daVzFpWldSRmNuSnZjbk5KYms5MWRIQjFkQ2s3WEc1Y2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RHTnZibk4wSUhKbFp5QTlJQzllS0Q4aFcxeGNMMTBwVzF4Y2RDQmRLbTkxZEZ0Y1hIUWdYU3NvS0docFoyaHdmRzFsWkdsMWJYQjhiRzkzY0h3cFcxeGNkQ0JkS2x4Y2R5dGJYRngwSUYwcVhGeDNLMXRjWEhRZ1hTbzdLUzg3WEc1Y2RGeDBYSFJqYjI1emRDQnlaWEJzWVdObFJuVnVZeUE5SUdaMWJtTjBhVzl1SUNodFlYUmphRG9nYzNSeWFXNW5MQ0J3TVRvZ2MzUnlhVzVuS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlBbmRtRnllV2x1WnlBbklDc2djREU3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFIwYUdsekxsOWZjbVZ3YkdGalpVeHBibVVvYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsTENCeVpXY3NJSEpsY0d4aFkyVkdkVzVqS1R0Y2JseDBYSFI5WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1FIQnlhWFpoZEdWY2JseDBJQ29nVkdocGN5QnRaWFJvYjJRZ2FYTWdZU0J3WVhKMElHOW1JRjlmWTI5dWRtVnlkRTkxZENCdFpYUm9iMlF1WEc1Y2RDQXFJRlJvYVhNZ2JXVjBhRzlrSUdSbGJHVjBaWE1nZEdobElGd2liM1YwWENJZ2NYVmhiR2xtYVdWeWN5QmhibVFnWVdSa2N5QjBhR1VnYkdsdVpTQm1iM0lnWVhOemFXZHVhVzVuSUhSdklHZHNYMFp5WVdkRGIyeHZjaTVjYmx4MElDb2dTV1lnZEdobElITm9ZV1JsY2lCa2IyVnpJRzV2ZENCb1lYWmxJSFJvWlNCY0ltOTFkRndpSUhGMVlXeHBabWxsY25Nc0lIUm9hWE1nYldWMGFHOWtJR1J2WlhNZ2JtOTBhR2x1Wnk1Y2JseDBJQ292WEc1Y2JseDBjSEpwZG1GMFpTQnpkR0YwYVdNZ1gxOXlaVzF2ZG1WUGRYUlJkV0ZzYVdacFpYSW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU3dnWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZERvZ1ltOXZiR1ZoYmlrZ2UxeHVYSFJjZEdOdmJuTjBJSEpsWnlBOUlDOWVLRDhoVzF4Y0wxMHBXMXhjZENCZEttOTFkRnRjWEhRZ1hTc29LR2hwWjJod2ZHMWxaR2wxYlhCOGJHOTNjSHdwVzF4Y2RDQmRLbHhjZHl0YlhGeDBJRjBxS0Z4Y2R5c3BXMXhjZENCZEtqc3BMenRjYmx4dVhIUmNkR3hsZENCMllYSnBZV0pzWlU1aGJXVTZJSE4wY21sdVp5QjhJSFZ1WkdWbWFXNWxaRHRjYmx4MFhIUm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaUzVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVYSFJjZEZ4MFkyOXVjM1FnYldGMFkyZ2dQU0J6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1ZiYVYwdWJXRjBZMmdvY21WbktUdGNibHgwWEhSY2RHbG1JQ2h0WVhSamFDa2dlMXh1WEhSY2RGeDBYSFJ6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1ZiYVYwZ1BTQnRZWFJqYUZzeFhUdGNibHgwWEhSY2RGeDBkbUZ5YVdGaWJHVk9ZVzFsSUQwZ2JXRjBZMmhiTTEwN1hHNWNkRngwWEhSY2RHSnlaV0ZyTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQjJZWEpwWVdKc1pVNWhiV1U3WEc1Y2RIMWNibHh1WEhSd2NtbDJZWFJsSUhOMFlYUnBZeUJmWDJGa1pFZE1SbkpoWjBOdmJHOXlLSFpoY21saFlteGxUbUZ0WlRvZ2MzUnlhVzVuTENCemNHeHBkSFJsWkZOb1lXUmxja052WkdVNklITjBjbWx1WjF0ZExDQmxiV0psWkVWeWNtOXljMGx1VDNWMGNIVjBPaUJpYjI5c1pXRnVLU0I3WEc1Y2RGeDBZMjl1YzNRZ1kyeHZjMlZDY21GamEyVjBVbVZuSUQwZ0x5Z3VLaWxjWEgxYlhGeHVYRngwSUYwcUpDODdYRzVjZEZ4MFkyOXVjM1FnY21WMGRYSnVVbVZuSUQwZ0wxdGNYRzVjWEhRZ1hTcHlaWFIxY201YlhGeHVYRngwSUYwcU95ODdYRzVjZEZ4MFkyOXVjM1FnYldGcGJrWjFibU5UZEdGeWRGSmxaeUE5SUM4b1hueGVLRDhoVzF4Y0wxMHBXMXhjZEZ4Y2JpQmRLeWwyYjJsa1cxeGNkRnhjYmlCZEsyMWhhVzRvVzF4Y2RGeGNiaUJkZkZ4Y0tId2tLUzg3WEc1Y2RGeDBZMjl1YzNRZ1puSmhaME52Ykc5eVEyOWtaU0E5SUdBZ0lHZHNYMFp5WVdkRGIyeHZjaUE5SUNSN2RtRnlhV0ZpYkdWT1lXMWxmVHRnTzF4dVhHNWNkRngwYkdWMElITmxkRWRzUm5KaFowTnZiRzl5U1c1TVlYTjBUR2x1WlNBOUlHWmhiSE5sTzF4dVhIUmNkR1p2Y2lBb2JHVjBJR2tnUFNCemNHeHBkSFJsWkZOb1lXUmxja052WkdVdWJHVnVaM1JvSUMwZ01Uc2dhU0ErUFNBd095QnBMUzBwSUh0Y2JseDBYSFJjZEdOdmJuTjBJR3hwYm1VZ1BTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVmJhVjA3WEc1Y2RGeDBYSFJwWmlBb0lYTmxkRWRzUm5KaFowTnZiRzl5U1c1TVlYTjBUR2x1WlNBbUppQnNhVzVsTG0xaGRHTm9LR05zYjNObFFuSmhZMnRsZEZKbFp5a3BJSHRjYmx4MFhIUmNkRngwTHk4Z1lXUmtJR2RzWDBaeVlXZERiMnh2Y2lCMGJ5QnNZWE4wSUd4cGJtVWdiMllnYldGcGJpQm1kVzVqZEdsdmJseHVYSFJjZEZ4MFhIUnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVmJhVjBnUFNCc2FXNWxMbkpsY0d4aFkyVW9ZMnh2YzJWQ2NtRmphMlYwVW1WbkxDQmdKREZjWEc0a2UyWnlZV2REYjJ4dmNrTnZaR1Y5WEZ4dWZWeGNibUFwTzF4dVhIUmNkRngwWEhSelpYUkhiRVp5WVdkRGIyeHZja2x1VEdGemRFeHBibVVnUFNCMGNuVmxPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJwWmlBb2JHbHVaUzV0WVhSamFDaHlaWFIxY201U1pXY3BLU0I3WEc1Y2RGeDBYSFJjZEM4dklHRmtaQ0JuYkY5R2NtRm5RMjlzYjNJZ2FuVnpkQ0JpWldadmNtVWdjbVYwZFhKdVhHNWNkRngwWEhSY2RITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTNXpjR3hwWTJVb2FTd2dNQ3dnWm5KaFowTnZiRzl5UTI5a1pTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR2xtSUNoc2FXNWxMbTFoZEdOb0tHMWhhVzVHZFc1alUzUmhjblJTWldjcEtTQjdYRzVjZEZ4MFhIUmNkQzh2SUdGa1pDQm5iRjlHY21GblEyOXNiM0lnYjI1c2VTQnBiaUIwYUdVZ2JXRnBiaUJtZFc1amRHbHZibHh1WEhSY2RGeDBYSFJpY21WaGF6dGNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNibHgwWEhScFppQW9JWE5sZEVkc1JuSmhaME52Ykc5eVNXNU1ZWE4wVEdsdVpTa2dlMXh1WEhSY2RGeDBZMjl1YzNRZ1pYSnliM0pOWlhOellXZGxJRDBnSjE5ZmNtVnRiM1psVDNWMFVYVmhiR2xtYVdWeU9pQk9iM1FnWm05MWJtUWdkR2hsSUdOc2IzTnBibWNnWW5KaFkydGxkSE1nWm05eUlIUm9aU0J0WVdsdUlHWjFibU4wYVc5dUp6dGNibHgwWEhSY2RIUm9hWE11WDE5dmRYUkZjbkp2Y2loemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTNXNaVzVuZEdnc0lHVnljbTl5VFdWemMyRm5aU3dnWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZENrN1hHNWNkRngwZlZ4dVhIUjlYRzVjYmx4MEx5b3FYRzVjZENBcUlFQndjbWwyWVhSbFhHNWNkQ0FxSUVacGJtUWdkR2hsSUhGMVlXeHBabWxsY2lCbWIzSWdaWE16SUc5dWJIa2dhVzRnZEdobElITm9ZV1JsY2lCamIyUmxJR0Z1WkNCeVpXMXZkbVVnYVhSY2JseDBJQ29nVkdocGN5QnRaWFJvYjJRZ1pHbHlaV04wYkhrZ2NtVndiR0ZqWlNCMGFHVWdaV3hsYldWdWRITWdiMllnZEdobElITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTQjJZWEpwWVdKc1pTNWNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZjbVZ0YjNabFJWTXpVWFZoYkdsbWFXVnlLSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVG9nYzNSeWFXNW5XMTBzSUdWdFltVmtSWEp5YjNKelNXNVBkWFJ3ZFhRNklHSnZiMnhsWVc0cElIdGNibHgwWEhSMGFHbHpMbDlmY21WdGIzWmxWbUZ5ZVdsdVoxRjFZV3hwWm1sbGNpaHpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXNJR1Z0WW1Wa1JYSnliM0p6U1c1UGRYUndkWFFwTzF4dVhIUmNkSFJvYVhNdVgxOXlaVzF2ZG1WTVlYbHZkWFFvYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsS1R0Y2JseDBmVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFjSEpwZG1GMFpWeHVYSFFnS2lCR2FXNWtJSFJvWlNCY0ltWnNZWFJjSWlCaGJtUWdYQ0p6Ylc5dmRHaGNJaUJ4ZFdGc2FXWnBaWElnYVc0Z2RHaGxJSE5vWVdSbGNpQmpiMlJsSUdGdVpDQnlaVzF2ZG1VZ2FYUmNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZjbVZ0YjNabFZtRnllV2x1WjFGMVlXeHBabWxsY2loemNHeHBkSFJsWkZOb1lXUmxja052WkdVNklITjBjbWx1WjF0ZExDQmxiV0psWkVWeWNtOXljMGx1VDNWMGNIVjBPaUJpYjI5c1pXRnVLU0I3WEc1Y2RGeDBZMjl1YzNRZ2NtVm5JRDBnTDE0b1B5RmJYRnd2WFNsYlhGeDBJRjBxS0dac1lYUjhjMjF2YjNSb0tWdGNYSFFnWFNvb0tHbHVmRzkxZENsYlhGeDBJRjByTGlvcEx6dGNibHgwWEhSamIyNXpkQ0JsY25KdmNrMWxjM05oWjJVZ1BTQW5YMTl5WlcxdmRtVldZWEo1YVc1blVYVmhiR2xtYVdWeU9pQm5iSE5zSUdWek1TQmtiMlZ6SUc1dmRDQnpkWEJ3YjNKMElHWnNZWFFnY1hWaGJHbG1hV1Z5Snp0Y2JseHVYSFJjZEdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExteGxibWQwYURzZ2FTc3JLU0I3WEc1Y2RGeDBYSFJ6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1ZiYVYwZ1BTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVmJhVjB1Y21Wd2JHRmpaU2h5Wldjc0lDaHRZWFJqYURvZ2MzUnlhVzVuTENCd01Ub2djM1J5YVc1bkxDQndNam9nYzNSeWFXNW5LU0E5UGlCN1hHNWNkRngwWEhSY2RHbG1JQ2h3TVNBOVBUMGdKMlpzWVhRbktTQjdYRzVjZEZ4MFhIUmNkRngwZEdocGN5NWZYMjkxZEVWeWNtOXlLSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU3dnYVNBcklERXNJR1Z5Y205eVRXVnpjMkZuWlN3Z1pXMWlaV1JGY25KdmNuTkpiazkxZEhCMWRDazdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJRzFoZEdOb08xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQndNanRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkSDFjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUWdLaUJHYVc1a0lIUm9aU0JjSW14aGVXOTFkRndpSUhGMVlXeHBabWxsY2lCcGJpQjBhR1VnYzJoaFpHVnlJR052WkdVZ1lXNWtJSEpsYlc5MlpTQnBkRnh1WEhRZ0tpOWNibHgwY0hKcGRtRjBaU0J6ZEdGMGFXTWdYMTl5WlcxdmRtVk1ZWGx2ZFhRb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE9pQnpkSEpwYm1kYlhTa2dlMXh1WEhSY2RHTnZibk4wSUhKbFp5QTlJQzllS0Q4aFcxeGNMMTBwVzF4Y2RDQmRLbXhoZVc5MWRGdGNYSFFnWFNwY1hDaGJYRngwSUYwcWJHOWpZWFJwYjI1YlhGeDBJRjBxWEZ3OVcxeGNkQ0JkS2x4Y1pGdGNYSFFnWFNwY1hDbGJYRngwSUYwckwyYzdYRzVjZEZ4MGRHaHBjeTVmWDNKbGNHeGhZMlZNYVc1bEtITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTd2djbVZuTENBbkp5azdYRzVjZEgxY2JseHVYSFF2S2lwY2JseDBJQ29nUUhCeWFYWmhkR1ZjYmx4MElDb2dSbWx1WkNCMGFHVWdYQ0p3Y21WamFYTnBiMjVjSWlCeGRXRnNhV1pwWlhJZ2FXNGdkR2hsSUhOb1lXUmxjaUJqYjJSbElHRnVaQ0J5WlcxdmRtVWdhWFFnYVdZZ2RHaGxJRndpY0hKbFkybHphVzl1WENJZ2NYVmhiR2xtYVdWeUlHbHpJSFpoYkdsa0lHWnZjaUJ2Ym14NUlFZE1VMHdnUlZNelhHNWNkQ0FxSUZSb2FYTWdiV1YwYUc5a0lHUnBjbVZqZEd4NUlISmxjR3hoWTJVZ2RHaGxJR1ZzWlcxbGJuUnpJRzltSUhSb1pTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVWdkbUZ5YVdGaWJHVXVYRzVjZENBcUwxeHVYSFJ3Y21sMllYUmxJSE4wWVhScFl5QmZYM0psYlc5MlpWQnlaV05wYzJsdmJrWnZja1ZUTXloemNHeHBkSFJsWkZOb1lXUmxja052WkdVNklITjBjbWx1WjF0ZEtTQjdYRzVjZEZ4MFkyOXVjM1FnY21WbklEMGdMMTRvUHlGYlhGd3ZYU2xiWEZ4MElGMHFjSEpsWTJsemFXOXVXMXhjZENCZEt5aG9hV2RvY0h4dFpXUnBkVzF3Zkd4dmQzQXBXMXhjZENCZEt5aGNYSGNyS1Z0Y1hIUWdYU283THp0Y2JseHVYSFJjZEdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExteGxibWQwYURzZ2FTc3JLU0I3WEc1Y2RGeDBYSFJqYjI1emRDQnRZWFJqYUNBOUlITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pWdHBYUzV0WVhSamFDaHlaV2NwTzF4dVhIUmNkRngwYVdZZ0tHMWhkR05vSUNFOUlHNTFiR3dwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLRnh1WEhSY2RGeDBYSFJjZEcxaGRHTm9XekpkSUQwOVBTQW5hVzUwSnlCOGZGeHVYSFJjZEZ4MFhIUmNkRzFoZEdOb1d6SmRJRDA5UFNBblpteHZZWFFuSUh4OFhHNWNkRngwWEhSY2RGeDBiV0YwWTJoYk1sMGdQVDA5SUNkellXMXdiR1Z5TWtRbklIeDhYRzVjZEZ4MFhIUmNkRngwYldGMFkyaGJNbDBnUFQwOUlDZHpZVzF3YkdWeVEzVmlaU2RjYmx4MFhIUmNkRngwS1NCN1hHNWNkRngwWEhSY2RGeDBMeThnZEdobGMyVWdjSEpsWTJsemFXOXVjeUJoY21VZ2MzVndjRzl5ZEdWa0lHbHVJR1Z6TVZ4dVhIUmNkRngwWEhSY2RHTnZiblJwYm5WbE8xeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaUzV6Y0d4cFkyVW9hUzB0TENBeEtUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJBY0hKcGRtRjBaVnh1WEhRZ0tpQkdhVzVrSUhSb1pTQmNJblJsZUhSMWNtVmNJaUJoYm1RZ1hDSjBaWGgwZFhKbFVISnZhbHdpSUcxbGRHaHZaQ0JwYmlCMGFHVWdjMmhoWkdWeUlHTnZaR1VnWVc1a1hHNWNkQ0FxSUhKbGNHeGhZMlVnYVhRZ2QybDBhQ0IwYUdVZ1IweFRUQ0JGVXpFZ2JXVjBhRzlrS0NkMFpYaDBkWEpsTWtRbkxDQW5kR1Y0ZEhWeVpUSkVKeXdnWVc1a0lITnZJRzl1S1Z4dVhIUWdLaUJVYUdseklHMWxkR2h2WkNCa2FYSmxZM1JzZVNCeVpYQnNZV05sSUhSb1pTQmxiR1Z0Wlc1MGN5QnZaaUIwYUdVZ2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbElIWmhjbWxoWW14bExseHVYSFFnS2k5Y2JseDBjSEpwZG1GMFpTQnpkR0YwYVdNZ1gxOWpiMjUyWlhKMFZHVjRkSFZ5WlVaMWJtTjBhVzl1Vkc5RlV6RW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU3dnYVhOR2NtRm5iV1Z1ZEZOb1lXUmxjam9nWW05dmJHVmhiaXdnWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZERvZ1ltOXZiR1ZoYmlrZ2UxeHVYSFJjZEdOdmJuTjBJSE5pYkNBOUlIUm9hWE11WDE5eVpXZFRlVzFpYjJ4ektDazdYRzVjZEZ4MFkyOXVjM1FnY21WblZHVjRkSFZ5WlZCeWIyb2dQU0J1WlhjZ1VtVm5SWGh3S0dBb0pIdHpZbXg5S3lsMFpYaDBkWEpsVUhKdmFpaE1iMlI4S1Nna2UzTmliSDByS1dBc0lDZG5KeWs3WEc1Y2RGeDBZMjl1YzNRZ2NtVm5WR1Y0ZEhWeVpTQTlJRzVsZHlCU1pXZEZlSEFvWUNna2UzTmliSDByS1hSbGVIUjFjbVVvVEc5a2ZDa29KSHR6WW14OUt5bGdMQ0FuWnljcE8xeHVYRzVjZEZ4MGJHVjBJR0Z5WjNWdFpXNTBVMkZ0Y0d4bGNrMWhjRG9nVFdGd1BITjBjbWx1Wnl3Z2MzUnlhVzVuUGlCOElIVnVaR1ZtYVc1bFpEdGNibHgwWEhSamIyNXpkQ0IxYm1sbWIzSnRVMkZ0Y0d4bGNrMWhjQ0E5SUhSb2FYTXVYMTlqY21WaGRHVlZibWxtYjNKdFUyRnRjR3hsY2sxaGNDaHpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXNJR1Z0WW1Wa1JYSnliM0p6U1c1UGRYUndkWFFwTzF4dVhIUmNkR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsTG14bGJtZDBhRHNnYVNzcktTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCc2FXNWxJRDBnYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsVzJsZE8xeHVYRzVjZEZ4MFhIUmpiMjV6ZENCdFlYUmphRlJsZUhSMWNtVlFjbTlxSUQwZ2JHbHVaUzV0WVhSamFDZ3ZkR1Y0ZEhWeVpWQnliMm9vVEc5a2ZDbGJYRngwSUYwcVhGd29XMXhjZENCZEtpaGNYSGNyS1N3dktUdGNibHgwWEhSY2RHbG1JQ2h0WVhSamFGUmxlSFIxY21WUWNtOXFLU0I3WEc1Y2RGeDBYSFJjZEdGeVozVnRaVzUwVTJGdGNHeGxjazFoY0NBOUlHRnlaM1Z0Wlc1MFUyRnRjR3hsY2sxaGNDQS9QeUIwYUdsekxsOWZZM0psWVhSbFFYSm5kVzFsYm5SVFlXMXdiR1Z5VFdGd0tGeHVYSFJjZEZ4MFhIUmNkSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU3hjYmx4MFhIUmNkRngwWEhScExGeHVYSFJjZEZ4MFhIUmNkR1Z0WW1Wa1JYSnliM0p6U1c1UGRYUndkWFJjYmx4MFhIUmNkRngwS1R0Y2JseHVYSFJjZEZ4MFhIUmpiMjV6ZENCcGMweHZaRTFsZEdodlpDQTlJRzFoZEdOb1ZHVjRkSFZ5WlZCeWIycGJNVjBnUFQwOUlDZE1iMlFuTzF4dVhIUmNkRngwWEhSamIyNXpkQ0JsZUhSbGJuTnBiMjVUZEhJZ1BTQnBjMFp5WVdkdFpXNTBVMmhoWkdWeUlDWW1JR2x6VEc5a1RXVjBhRzlrSUQ4Z1lFVllWR0FnT2lCZ1lEdGNibHgwWEhSY2RGeDBZMjl1YzNRZ2RtRnlhV0ZpYkdWT1lXMWxJRDBnYldGMFkyaFVaWGgwZFhKbFVISnZhbHN5WFR0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnYzJGdGNHeGxjbFI1Y0dVZ1BTQmhjbWQxYldWdWRGTmhiWEJzWlhKTllYQS9MbWRsZENoMllYSnBZV0pzWlU1aGJXVXBJRDgvSUhWdWFXWnZjbTFUWVcxd2JHVnlUV0Z3TG1kbGRDaDJZWEpwWVdKc1pVNWhiV1VwTzF4dVhIUmNkRngwWEhScFppQW9jMkZ0Y0d4bGNsUjVjR1VnSVQwZ2JuVnNiQ2tnZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2h6WVcxd2JHVnlWSGx3WlNBOVBUMGdKM05oYlhCc1pYSXlSQ2NwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVnRwWFNBOUlITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pWdHBYUzV5WlhCc1lXTmxLSEpsWjFSbGVIUjFjbVZRY205cUxDQmdKREYwWlhoMGRYSmxNa1JRY205cUpESWtlMlY0ZEdWdWMybHZibE4wY24wa00yQXBPMXh1WEhSY2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmpiMjV6ZENCbGNuSnZjazFsYzNOaFoyVWdQU0FuWDE5amIyNTJaWEowVkdWNGRIVnlaVVoxYm1OMGFXOXVWRzlGVXpFNklHUnZJRzV2ZENCemRYQndiM0owSUNjZ0t5QnpZVzF3YkdWeVZIbHdaU0FySUNjZ2RIbHdaU2M3WEc1Y2RGeDBYSFJjZEZ4MFhIUjBhR2x6TGw5ZmIzVjBSWEp5YjNJb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExDQnBMQ0JsY25KdmNrMWxjM05oWjJVc0lHVnRZbVZrUlhKeWIzSnpTVzVQZFhSd2RYUXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmpiMjUwYVc1MVpUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBZMjl1YzNRZ2JXRjBZMmhVWlhoMGRYSmxJRDBnYkdsdVpTNXRZWFJqYUNndmRHVjRkSFZ5WlNoTWIyUjhLVnRjWEhRZ1hTcGNYQ2hiWEZ4MElGMHFLRnhjZHlzcExDOHBPMXh1WEhSY2RGeDBhV1lnS0cxaGRHTm9WR1Y0ZEhWeVpTa2dlMXh1WEhSY2RGeDBYSFJoY21kMWJXVnVkRk5oYlhCc1pYSk5ZWEFnUFNCaGNtZDFiV1Z1ZEZOaGJYQnNaWEpOWVhBZ1B6OGdkR2hwY3k1ZlgyTnlaV0YwWlVGeVozVnRaVzUwVTJGdGNHeGxjazFoY0NoY2JseDBYSFJjZEZ4MFhIUnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXNYRzVjZEZ4MFhIUmNkRngwYVN4Y2JseDBYSFJjZEZ4MFhIUmxiV0psWkVWeWNtOXljMGx1VDNWMGNIVjBYRzVjZEZ4MFhIUmNkQ2s3WEc1Y2JseDBYSFJjZEZ4MFkyOXVjM1FnYVhOTWIyUk5aWFJvYjJRZ1BTQnRZWFJqYUZSbGVIUjFjbVZiTVYwZ1BUMDlJQ2RNYjJRbk8xeHVYSFJjZEZ4MFhIUmpiMjV6ZENCbGVIUmxibk5wYjI1VGRISWdQU0JwYzBaeVlXZHRaVzUwVTJoaFpHVnlJQ1ltSUdselRHOWtUV1YwYUc5a0lEOGdZRVZZVkdBZ09pQmdZRHRjYmx4MFhIUmNkRngwWTI5dWMzUWdkbUZ5YVdGaWJHVk9ZVzFsSUQwZ2JXRjBZMmhVWlhoMGRYSmxXekpkTzF4dVhIUmNkRngwWEhSamIyNXpkQ0J6WVcxd2JHVnlWSGx3WlNBOUlHRnlaM1Z0Wlc1MFUyRnRjR3hsY2sxaGNEOHVaMlYwS0haaGNtbGhZbXhsVG1GdFpTa2dQejhnZFc1cFptOXliVk5oYlhCc1pYSk5ZWEF1WjJWMEtIWmhjbWxoWW14bFRtRnRaU2s3WEc1Y2RGeDBYSFJjZEdsbUlDaHpZVzF3YkdWeVZIbHdaU0FoUFNCdWRXeHNLU0I3WEc1Y2RGeDBYSFJjZEZ4MGJHVjBJSFJsZUhSMWNtVkdkVzVqT2lCemRISnBibWM3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLSE5oYlhCc1pYSlVlWEJsSUQwOVBTQW5jMkZ0Y0d4bGNqSkVKeWtnZTF4dVhIUmNkRngwWEhSY2RGeDBkR1Y0ZEhWeVpVWjFibU1nUFNBbmRHVjRkSFZ5WlRKRUp6dGNibHgwWEhSY2RGeDBYSFI5SUdWc2MyVWdhV1lnS0hOaGJYQnNaWEpVZVhCbElEMDlQU0FuYzJGdGNHeGxja04xWW1VbktTQjdYRzVjZEZ4MFhIUmNkRngwWEhSMFpYaDBkWEpsUm5WdVl5QTlJQ2QwWlhoMGRYSmxRM1ZpWlNjN1hHNWNkRngwWEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBYSFJjZEhSbGVIUjFjbVZHZFc1aklEMGdKeWM3WEc1Y2RGeDBYSFJjZEZ4MFhIUmpiMjV6ZENCbGNuSnZjazFsYzNOaFoyVWdQU0FuWDE5amIyNTJaWEowVkdWNGRIVnlaVVoxYm1OMGFXOXVWRzlGVXpFNklHUnZJRzV2ZENCemRYQndiM0owSUNjZ0t5QnpZVzF3YkdWeVZIbHdaU0FySUNjZ2RIbHdaU2M3WEc1Y2RGeDBYSFJjZEZ4MFhIUjBhR2x6TGw5ZmIzVjBSWEp5YjNJb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExDQnBMQ0JsY25KdmNrMWxjM05oWjJVc0lHVnRZbVZrUlhKeWIzSnpTVzVQZFhSd2RYUXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkR2xtSUNoMFpYaDBkWEpsUm5WdVl5QWhQVDBnSnljcElIdGNibHgwWEhSY2RGeDBYSFJjZEhOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlZ0cFhTQTlJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVnRwWFM1eVpYQnNZV05sS0hKbFoxUmxlSFIxY21Vc0lHQWtNU1I3ZEdWNGRIVnlaVVoxYm1OOUpESWtlMlY0ZEdWdWMybHZibE4wY24wa00yQXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmpiMjUwYVc1MVpUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBZMjl1YzNRZ2FYTkNiRzlqYTBWdVpDQTlJQ0VoYkdsdVpTNXRZWFJqYUNndlhGeDlMeWs3WEc1Y2RGeDBYSFJwWmlBb2FYTkNiRzlqYTBWdVpDa2dlMXh1WEhSY2RGeDBYSFJoY21kMWJXVnVkRk5oYlhCc1pYSk5ZWEFnUFNCMWJtUmxabWx1WldRN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUjlYRzVjYmx4MEx5b3FYRzVjZENBcUlFQndjbWwyWVhSbFhHNWNkQ0FxSUZSb2FYTWdiV1YwYUc5a0lHWnBibVJ6SUhWdWFXWnZjbTBnWkdWamJHRnlZWFJwYjI1eklHOW1JSE5oYlhCc1pYSWdkSGx3WlhNZ2FXNGdkR2hsSUhOb1lXUmxjaUJoYm1SY2JseDBJQ29nWTNKbFlYUmxjeUJoSUcxaGNDQjNhWFJvSUhaaGNtbGhZbXhsSUc1aGJXVnpJR0Z6SUd0bGVYTWdZVzVrSUhSNWNHVnpJR0Z6SUhaaGJIVmxjeTVjYmx4MElDb3ZYRzVjZEhCeWFYWmhkR1VnYzNSaGRHbGpJRjlmWTNKbFlYUmxWVzVwWm05eWJWTmhiWEJzWlhKTllYQW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU3dnWlcxaVpXUkZjbkp2Y25OSmJrOTFkSEIxZERvZ1ltOXZiR1ZoYmlrZ2UxeHVYSFJjZEdOdmJuTjBJSFZ1YVdadmNtMVRZVzF3YkdWeVRXRndPaUJOWVhBOGMzUnlhVzVuTENCemRISnBibWMrSUQwZ2JtVjNJRTFoY0NncE8xeHVYRzVjZEZ4MFptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVXViR1Z1WjNSb095QnBLeXNwSUh0Y2JseDBYSFJjZEdOdmJuTjBJR3hwYm1VZ1BTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVmJhVjA3WEc1Y2RGeDBYSFJqYjI1emRDQnRZWFJqYUNBOUlHeHBibVV1YldGMFkyZ29MMTRvUHlGYlhGd3ZYU2xiWEZ4MElGMHFkVzVwWm05eWJTcGJYRngwSUYwcUtHaHBaMmh3ZkcxbFpHbDFiWEI4Ykc5M2NId3BXMXhjZENCZEtpaHpZVzF3YkdWeVhGeDNLeWxiWEZ4MElGMHJLRnhjZHlzcEx5azdYRzVjZEZ4MFhIUnBaaUFvYldGMFkyZ3BJSHRjYmx4MFhIUmNkRngwWTI5dWMzUWdjMkZ0Y0d4bGNsUjVjR1VnUFNCdFlYUmphRnN5WFR0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnYm1GdFpTQTlJRzFoZEdOb1d6TmRPMXh1WEhSY2RGeDBYSFJwWmlBb2RXNXBabTl5YlZOaGJYQnNaWEpOWVhBdVoyVjBLRzVoYldVcEtTQjdYRzVjZEZ4MFhIUmNkRngwWTI5dWMzUWdaWEp5YjNKTlpYTnpZV2RsSUQwZ0oxOWZZM0psWVhSbFZXNXBabTl5YlZOaGJYQnNaWEpOWVhBNklHUjFjR3hwWTJGMFpTQjJZWEpwWVdKc1pTQnVZVzFsSnp0Y2JseDBYSFJjZEZ4MFhIUjBhR2x6TGw5ZmIzVjBSWEp5YjNJb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExDQnBMQ0JsY25KdmNrMWxjM05oWjJVc0lHVnRZbVZrUlhKeWIzSnpTVzVQZFhSd2RYUXBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEhWdWFXWnZjbTFUWVcxd2JHVnlUV0Z3TG5ObGRDaHVZVzFsTENCellXMXdiR1Z5Vkhsd1pTazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYSFJjZEhKbGRIVnliaUIxYm1sbWIzSnRVMkZ0Y0d4bGNrMWhjRHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUWdLaUJVYUdseklHMWxkR2h2WkNCbWFXNWtjeUJ6WVcxd2JHVnlJSFI1Y0dWeklHWnliMjBnZEdobElHWjFibU4wYVc5dUlHRnlaM1Z0Wlc1MGN5QmhibVJjYmx4MElDb2dZM0psWVhSbGN5QmhJRzFoY0NCM2FYUm9JSFpoY21saFlteGxJRzVoYldWeklHRnpJR3RsZVhNZ1lXNWtJSFI1Y0dWeklHRnpJSFpoYkhWbGN5NWNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZZM0psWVhSbFFYSm5kVzFsYm5SVFlXMXdiR1Z5VFdGd0tGeHVYSFJjZEhOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlRvZ2MzUnlhVzVuVzEwc1hHNWNkRngwYkdsdVpVbHVaR1Y0T2lCdWRXMWlaWElzWEc1Y2RGeDBaVzFpWldSRmNuSnZjbk5KYms5MWRIQjFkRG9nWW05dmJHVmhibHh1WEhRcElIdGNibHgwWEhSamIyNXpkQ0JoY21kMWJXVnVkRk5oYlhCc1pYSk5ZWEE2SUUxaGNEeHpkSEpwYm1jc0lITjBjbWx1Wno0Z1BTQnVaWGNnVFdGd0tDazdYRzVjYmx4MFhIUm1iM0lnS0d4bGRDQnBJRDBnYkdsdVpVbHVaR1Y0T3lCcElENDlJREE3SUdrdExTa2dlMXh1WEhSY2RGeDBZMjl1YzNRZ2JHbHVaU0E5SUhOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlZ0cFhUdGNibHh1WEhSY2RGeDBZMjl1YzNRZ2FYTkNiRzlqYTFOMFlYSjBUR2x1WlNBOUlDRWhiR2x1WlM1dFlYUmphQ2d2WEZ4N0x5azdYRzVjZEZ4MFhIUnBaaUFvSVdselFteHZZMnRUZEdGeWRFeHBibVVwSUh0Y2JseDBYSFJjZEZ4MFkyOXVkR2x1ZFdVN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RHTnZibk4wSUdKeVlXTnJaWFJUWldOMGFXOXVRMjlrWlNBOUlIUm9hWE11WDE5blpYUkNjbUZqYTJWMFUyVmpkR2x2YmloemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lHa3BPMXh1WEc1Y2RGeDBYSFJqYjI1emRDQnBibTVsY2tKeVlXTnJaWFJUWldOMGFXOXVRMjlrWlNBOUlHSnlZV05yWlhSVFpXTjBhVzl1UTI5a1pTNXRZWFJqYUNndkxpcGNYQ2dvTGlvcFhGd3BMeWsvTGxzeFhUdGNibHgwWEhSY2RHbG1JQ2hwYm01bGNrSnlZV05yWlhSVFpXTjBhVzl1UTI5a1pTQTlQU0J1ZFd4c0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBZMjl1YzNRZ2RtRnlhV0ZpYkdWRFlXNWthV1JoZEdWeklEMGdhVzV1WlhKQ2NtRmphMlYwVTJWamRHbHZia052WkdVdWMzQnNhWFFvSnl3bktUdGNibHgwWEhSY2RHTnZibk4wSUhOaGJYQnNaWEpVZVhCbFJHVm1hVzVwZEdsdmJsSmxaeUE5SUM5YlhGeHVYRngwSUYwcUtHaHBaMmh3ZkcxbFpHbDFiWEI4Ykc5M2NId3BXMXhjYmx4Y2RDQmRLaWh6WVcxd2JHVnlYRngzS3lsYlhGeHVYRngwSUYwcUtGeGNkeXNwVzF4Y2JseGNkQ0JkS2k4N1hHNWNibHgwWEhSY2RHTnZibk4wSUdselJuVnVZM1JwYjI1Q2NtRmphMlYwSUQwZ0lTRW9kbUZ5YVdGaWJHVkRZVzVrYVdSaGRHVnpXekJkTG0xaGRHTm9LSE5oYlhCc1pYSlVlWEJsUkdWbWFXNXBkR2x2YmxKbFp5a2dQejhnZG1GeWFXRmliR1ZEWVc1a2FXUmhkR1Z6V3pCZExtMWhkR05vS0M5ZVcxeGNibHhjZENCZEtpUXZLU2s3WEc1Y2RGeDBYSFJwWmlBb0lXbHpSblZ1WTNScGIyNUNjbUZqYTJWMEtTQjdYRzVjZEZ4MFhIUmNkR052Ym5ScGJuVmxPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJtYjNJZ0tHTnZibk4wSUhaaGNtbGhZbXhsUTJGdVpHbGtZWFJsSUc5bUlIWmhjbWxoWW14bFEyRnVaR2xrWVhSbGN5a2dlMXh1WEhSY2RGeDBYSFJqYjI1emRDQnpZVzF3YkdWeVZtRnlhV0ZpYkdWTllYUmphQ0E5SUhaaGNtbGhZbXhsUTJGdVpHbGtZWFJsTG0xaGRHTm9LSE5oYlhCc1pYSlVlWEJsUkdWbWFXNXBkR2x2YmxKbFp5azdYRzVjZEZ4MFhIUmNkR2xtSUNoellXMXdiR1Z5Vm1GeWFXRmliR1ZOWVhSamFDQTlQU0J1ZFd4c0tTQjdYRzVjZEZ4MFhIUmNkRngwWTI5dWRHbHVkV1U3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFkyOXVjM1FnYzJGdGNHeGxjbFI1Y0dVZ1BTQnpZVzF3YkdWeVZtRnlhV0ZpYkdWTllYUmphRnN5WFR0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnYm1GdFpTQTlJSE5oYlhCc1pYSldZWEpwWVdKc1pVMWhkR05vV3pOZE8xeHVYSFJjZEZ4MFhIUnBaaUFvWVhKbmRXMWxiblJUWVcxd2JHVnlUV0Z3TG1kbGRDaHVZVzFsS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkR052Ym5OMElHVnljbTl5VFdWemMyRm5aU0E5SUNkZlgyTnlaV0YwWlVGeVozVnRaVzUwVTJGdGNHeGxjazFoY0RvZ1pIVndiR2xqWVhSbElIWmhjbWxoWW14bElHNWhiV1VuTzF4dVhIUmNkRngwWEhSY2RIUm9hWE11WDE5dmRYUkZjbkp2Y2loemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lHa3NJR1Z5Y205eVRXVnpjMkZuWlN3Z1pXMWlaV1JGY25KdmNuTkpiazkxZEhCMWRDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWVhKbmRXMWxiblJUWVcxd2JHVnlUV0Z3TG5ObGRDaHVZVzFsTENCellXMXdiR1Z5Vkhsd1pTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR0p5WldGck8xeHVYSFJjZEgxY2JseHVYSFJjZEhKbGRIVnliaUJoY21kMWJXVnVkRk5oYlhCc1pYSk5ZWEE3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1FIQnlhWFpoZEdWY2JseDBJQ29nVkdocGN5QnRaWFJvYjJRZ2NtVjBkWEp1Y3lCMGFHVWdjR0Z5ZENCbGJtTnNiM05sWkNCcGJpQmljbUZqYTJWMGN5ZzlJQ2NvS1NjcExseHVYSFFnS2lCR2IzSWdaWGhoYlhCc1pTd2dlVzkxSUdOaGJpQm5aWFFnYkdsdVpYTWdkR2hoZENCamIyNTBZV2x1SUdaMWJtTjBhVzl1SUdGeVozVnRaVzUwY3l3Z1kyOXVaR2wwYVc5dVlXd2daWGh3Y21WemMybHZibk1nWm05eUlHbG1JSE4wWVhSbGJXVnVkSE1zSUdWMFl5NWNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZaMlYwUW5KaFkydGxkRk5sWTNScGIyNG9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU3dnWW5KaFkydGxkRVZ1WkVsdVpHVjRPaUJ1ZFcxaVpYSXBJSHRjYmx4MFhIUnNaWFFnWW5KaFkydGxkRk4wWVhKMFNXNWtaWGdnUFNBd08xeHVYSFJjZEdadmNpQW9iR1YwSUdvZ1BTQmljbUZqYTJWMFJXNWtTVzVrWlhnN0lHb2dQajBnTURzZ2FpMHRLU0I3WEc1Y2RGeDBYSFJqYjI1emRDQnNhVzVsSUQwZ2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbFcycGRPMXh1WEhSY2RGeDBZMjl1YzNRZ2FYTkNjbUZqYTJWMFUzUmhjblJOWVhSamFDQTlJQ0VoYkdsdVpTNXRZWFJqYUNndlhGd29MeWs3WEc1Y2RGeDBYSFJwWmlBb2FYTkNjbUZqYTJWMFUzUmhjblJOWVhSamFDa2dlMXh1WEhSY2RGeDBYSFJpY21GamEyVjBVM1JoY25SSmJtUmxlQ0E5SUdvN1hHNWNkRngwWEhSY2RHSnlaV0ZyTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4dVhIUmNkR3hsZENCamIyNTBZV2x1UW5KaFkydGxkRU52WkdVZ1BTQW5KenRjYmx4MFhIUm1iM0lnS0d4bGRDQnFJRDBnWW5KaFkydGxkRk4wWVhKMFNXNWtaWGc3SUdvZ1BEMGdZbkpoWTJ0bGRFVnVaRWx1WkdWNE95QnFLeXNwSUh0Y2JseDBYSFJjZEdOdmJuUmhhVzVDY21GamEyVjBRMjlrWlNBclBTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVmJhbDA3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlHTnZiblJoYVc1Q2NtRmphMlYwUTI5a1pUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJBY0hKcGRtRjBaVnh1WEhRZ0tpQkdhVzVrSUhSb1pTQW5ZWFIwY21saWRYUmxKeUJ4ZFdGc2FXWnBaWElnYVc0Z2RHaGxJSFpsY25SbGVDQnphR0ZrWlhJZ1kyOWtaU0JoYm1RZ2NtVndiR0ZqWlNCcGRDQjNhWFJvSUhSb1pTQkhURk5NSUVWVE15QnhkV0ZzYVdacFpYSW9KMmx1SnlsY2JseDBJQ29nVkdocGN5QnRaWFJvYjJRZ1pHbHlaV04wYkhrZ2NtVndiR0ZqWlNCMGFHVWdaV3hsYldWdWRITWdiMllnZEdobElITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTQjJZWEpwWVdKc1pTNWNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZZMjl1ZG1WeWRFRjBkSEpwWW5WMFpTaHpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVTZJSE4wY21sdVoxdGRMQ0JwYzBaeVlXZHRaVzUwVTJoaFpHVnlPaUJpYjI5c1pXRnVLU0I3WEc1Y2RGeDBhV1lnS0dselJuSmhaMjFsYm5SVGFHRmtaWElwSUh0Y2JseDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUjlYRzVjYmx4MFhIUmpiMjV6ZENCeVpXY2dQU0F2WGlnL0lWdGNYQzlkS1Z0Y1hIUWdYU3BoZEhSeWFXSjFkR1ZiWEZ4MElGMHJMMmM3WEc1Y2RGeDBZMjl1YzNRZ2NtVndiR0ZqWlZOMGNpQTlJQ2RwYmlBbk8xeHVYRzVjZEZ4MGRHaHBjeTVmWDNKbGNHeGhZMlZNYVc1bEtITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTd2djbVZuTENCeVpYQnNZV05sVTNSeUtUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJBY0hKcGRtRjBaVnh1WEhRZ0tpQkdhVzVrSUhSb1pTQW5kbUZ5ZVdsdVp5Y2djWFZoYkdsbWFXVnlJR2x1SUhSb1pTQnphR0ZrWlhJZ1kyOWtaU0JoYm1RZ2NtVndiR0ZqWlNCcGRDQjNhWFJvSUhSb1pTQkhURk5NSUVWVE15QnhkV0ZzYVdacFpYSW9KMmx1SnlCdmNpQW5iM1YwSnlsY2JseDBJQ29nVkdocGN5QnRaWFJvYjJRZ1pHbHlaV04wYkhrZ2NtVndiR0ZqWlNCMGFHVWdaV3hsYldWdWRITWdiMllnZEdobElITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTQjJZWEpwWVdKc1pTNWNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZZMjl1ZG1WeWRGWmhjbmxwYm1jb2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbE9pQnpkSEpwYm1kYlhTd2dhWE5HY21GbmJXVnVkRk5vWVdSbGNqb2dZbTl2YkdWaGJpa2dlMXh1WEhSY2RHTnZibk4wSUhKbFp5QTlJQzllS0Q4aFcxeGNMMTBwVzF4Y2RDQmRLblpoY25scGJtZGJYRngwSUYwckwyYzdYRzVjZEZ4MFkyOXVjM1FnY21Wd2JHRmpaVk4wY2lBOUlHbHpSbkpoWjIxbGJuUlRhR0ZrWlhJZ1B5QW5hVzRnSnlBNklDZHZkWFFnSnp0Y2JseHVYSFJjZEhSb2FYTXVYMTl5WlhCc1lXTmxUR2x1WlNoemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lISmxaeXdnY21Wd2JHRmpaVk4wY2lrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRSEJ5YVhaaGRHVmNibHgwSUNvZ1JtbHVaQ0IwYUdVZ0ozUmxlSFIxY21WRGRXSmxKeUJ0WlhSb2IyUWdhVzRnZEdobElITm9ZV1JsY2lCamIyUmxJR0Z1WkNCeVpYQnNZV05sSUdsMElIZHBkR2dnZEdobElFZE1VMHdnUlZNeklHMWxkR2h2WkNnbmRHVjRkSFZ5WlNjcFhHNWNkQ0FxSUZSb2FYTWdiV1YwYUc5a0lHUnBjbVZqZEd4NUlISmxjR3hoWTJVZ2RHaGxJR1ZzWlcxbGJuUnpJRzltSUhSb1pTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVWdkbUZ5YVdGaWJHVXVYRzVjZENBcUwxeHVYSFJ3Y21sMllYUmxJSE4wWVhScFl5QmZYMk52Ym5abGNuUlVaWGgwZFhKbFEzVmlaU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1U2SUhOMGNtbHVaMXRkS1NCN1hHNWNkRngwWTI5dWMzUWdjMkpzSUQwZ2RHaHBjeTVmWDNKbFoxTjViV0p2YkhNb0tUdGNibHgwWEhSamIyNXpkQ0J5WldjZ1BTQnVaWGNnVW1WblJYaHdLR0FvSkh0ellteDlLeWtvZEdWNGRIVnlaVU4xWW1VcEtDUjdjMkpzZlNzcFlDd2dKMmNuS1R0Y2JseDBYSFJqYjI1emRDQnlaWEJzWVdObFUzUnlJRDBnSjNSbGVIUjFjbVVuTzF4dVhHNWNkRngwZEdocGN5NWZYM0psY0d4aFkyVk1hVzVsS0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlN3Z2NtVm5MQ0FuSkRFbklDc2djbVZ3YkdGalpWTjBjaUFySUNja015Y3BPMXh1WEhSOVhHNWNibHgwTHlvcVhHNWNkQ0FxSUVCd2NtbDJZWFJsWEc1Y2RDQXFJRVpwYm1RZ2RHaGxJQ2QwWlhoMGRYSmxNa1FuSUcxbGRHaHZaQ0JwYmlCMGFHVWdjMmhoWkdWeUlHTnZaR1VnWVc1a0lISmxjR3hoWTJVZ2FYUWdkMmwwYUNCMGFHVWdSMHhUVENCRlV6TWdiV1YwYUc5a0tDZDBaWGgwZFhKbEp5bGNibHgwSUNvZ1ZHaHBjeUJ0WlhSb2IyUWdaR2x5WldOMGJIa2djbVZ3YkdGalpTQjBhR1VnWld4bGJXVnVkSE1nYjJZZ2RHaGxJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU0IyWVhKcFlXSnNaUzVjYmx4MElDb3ZYRzVjZEhCeWFYWmhkR1VnYzNSaGRHbGpJRjlmWTI5dWRtVnlkRlJsZUhSMWNtVXlSQ2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1U2SUhOMGNtbHVaMXRkS1NCN1hHNWNkRngwWTI5dWMzUWdjMkpzSUQwZ2RHaHBjeTVmWDNKbFoxTjViV0p2YkhNb0tUdGNibHgwWEhSamIyNXpkQ0J5WldjZ1BTQnVaWGNnVW1WblJYaHdLR0FvSkh0ellteDlLeWtvZEdWNGRIVnlaVEpFS1Nna2UzTmliSDByS1dBc0lDZG5KeWs3WEc1Y2RGeDBZMjl1YzNRZ2NtVndiR0ZqWlZOMGNpQTlJQ2QwWlhoMGRYSmxKenRjYmx4dVhIUmNkSFJvYVhNdVgxOXlaWEJzWVdObFRHbHVaU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUhKbFp5d2dKeVF4SnlBcklISmxjR3hoWTJWVGRISWdLeUFuSkRNbktUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJBY0hKcGRtRjBaVnh1WEhRZ0tpQkdhVzVrSUhSb1pTQW5kR1Y0ZEhWeVpUSkVVSEp2YWljZ2JXVjBhRzlrSUdsdUlIUm9aU0J6YUdGa1pYSWdZMjlrWlNCaGJtUWdjbVZ3YkdGalpTQnBkQ0IzYVhSb0lIUm9aU0JIVEZOTUlFVlRNeUJ0WlhSb2IyUW9KM1JsZUhSMWNtVlFjbTlxSnlsY2JseDBJQ29nVkdocGN5QnRaWFJvYjJRZ1pHbHlaV04wYkhrZ2NtVndiR0ZqWlNCMGFHVWdaV3hsYldWdWRITWdiMllnZEdobElITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTQjJZWEpwWVdKc1pTNWNibHgwSUNvdlhHNWNkSEJ5YVhaaGRHVWdjM1JoZEdsaklGOWZZMjl1ZG1WeWRGUmxlSFIxY21VeVJGQnliMlFvYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsT2lCemRISnBibWRiWFNrZ2UxeHVYSFJjZEdOdmJuTjBJSE5pYkNBOUlIUm9hWE11WDE5eVpXZFRlVzFpYjJ4ektDazdYRzVjZEZ4MFkyOXVjM1FnY21WbklEMGdibVYzSUZKbFowVjRjQ2hnS0NSN2MySnNmU3NwS0hSbGVIUjFjbVV5UkZCeWIyb3BLQ1I3YzJKc2ZTc3BZQ3dnSjJjbktUdGNibHgwWEhSamIyNXpkQ0J5WlhCc1lXTmxVM1J5SUQwZ0ozUmxlSFIxY21WUWNtOXFKenRjYmx4dVhIUmNkSFJvYVhNdVgxOXlaWEJzWVdObFRHbHVaU2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzSUhKbFp5d2dKeVF4SnlBcklISmxjR3hoWTJWVGRISWdLeUFuSkRNbktUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJBY0hKcGRtRjBaVnh1WEhRZ0tpQkdhVzVrSUhSb1pTQW5kR1Y0ZEhWeVpUTkVKeUJ0WlhSb2IyUWdhVzRnZEdobElITm9ZV1JsY2lCamIyUmxJR0Z1WkNCeVpYQnNZV05sSUdsMElIZHBkR2dnZEdobElFZE1VMHdnUlZNeklHMWxkR2h2WkNnbmRHVjRkSFZ5WlNjcFhHNWNkQ0FxSUZSb2FYTWdiV1YwYUc5a0lHUnBjbVZqZEd4NUlISmxjR3hoWTJVZ2RHaGxJR1ZzWlcxbGJuUnpJRzltSUhSb1pTQnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVWdkbUZ5YVdGaWJHVXVYRzVjZENBcUwxeHVYSFJ3Y21sMllYUmxJSE4wWVhScFl5QmZYMk52Ym5abGNuUlVaWGgwZFhKbE0wUW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxPaUJ6ZEhKcGJtZGJYU2tnZTF4dVhIUmNkR052Ym5OMElITmliQ0E5SUhSb2FYTXVYMTl5WldkVGVXMWliMnh6S0NrN1hHNWNkRngwWTI5dWMzUWdjbVZuSUQwZ2JtVjNJRkpsWjBWNGNDaGdLQ1I3YzJKc2ZTc3BLSFJsZUhSMWNtVXpSQ2tvSkh0ellteDlLeWxnTENBblp5Y3BPMXh1WEhSY2RHTnZibk4wSUhKbGNHeGhZMlZUZEhJZ1BTQW5kR1Y0ZEhWeVpTYzdYRzVjYmx4MFhIUjBhR2x6TGw5ZmNtVndiR0ZqWlV4cGJtVW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxMQ0J5Wldjc0lDY2tNU2NnS3lCeVpYQnNZV05sVTNSeUlDc2dKeVF6SnlrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRSEJ5YVhaaGRHVmNibHgwSUNvZ1JtbHVaQ0IwYUdVZ0ozUmxlSFIxY21VelJGQnliMm9uSUcxbGRHaHZaQ0JwYmlCMGFHVWdjMmhoWkdWeUlHTnZaR1VnWVc1a0lISmxjR3hoWTJVZ2FYUWdkMmwwYUNCMGFHVWdSMHhUVENCRlV6TWdiV1YwYUc5a0tDZDBaWGgwZFhKbFVISnZhaWNwWEc1Y2RDQXFJRlJvYVhNZ2JXVjBhRzlrSUdScGNtVmpkR3g1SUhKbGNHeGhZMlVnZEdobElHVnNaVzFsYm5SeklHOW1JSFJvWlNCemNHeHBkSFJsWkZOb1lXUmxja052WkdVZ2RtRnlhV0ZpYkdVdVhHNWNkQ0FxTDF4dVhIUndjbWwyWVhSbElITjBZWFJwWXlCZlgyTnZiblpsY25SVVpYaDBkWEpsTTBSUWNtOWtLSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVG9nYzNSeWFXNW5XMTBwSUh0Y2JseDBYSFJqYjI1emRDQnpZbXdnUFNCMGFHbHpMbDlmY21WblUzbHRZbTlzY3lncE8xeHVYSFJjZEdOdmJuTjBJSEpsWnlBOUlHNWxkeUJTWldkRmVIQW9ZQ2drZTNOaWJIMHJLU2gwWlhoMGRYSmxNMFJRY205cUtTZ2tlM05pYkgwcktXQXNJQ2RuSnlrN1hHNWNkRngwWTI5dWMzUWdjbVZ3YkdGalpWTjBjaUE5SUNkMFpYaDBkWEpsVUhKdmFpYzdYRzVjYmx4MFhIUjBhR2x6TGw5ZmNtVndiR0ZqWlV4cGJtVW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxMQ0J5Wldjc0lDY2tNU2NnS3lCeVpYQnNZV05sVTNSeUlDc2dKeVF6SnlrN1hHNWNkSDFjYmx4dVhIUndjbWwyWVhSbElITjBZWFJwWXlCZlgzSmxaMU41YldKdmJITW9LU0I3WEc1Y2RGeDBjbVYwZFhKdUlHQmJJVndpSXlRbEppY29LVnhjS2x4Y0sxeGNMVnhjTGl4Y1hDODZPenc5UGo5QVhGeGJYRnhjWEZ4Y1hWNWdJQ3NnSjJCN2ZIMStYRngwWEZ4dUlGMG5PMXh1WEhSOVhHNWNibHgwY0hKcGRtRjBaU0J6ZEdGMGFXTWdYMTl5WlhCc1lXTmxUR2x1WlNoemNHeHBkSFJsWkZOb1lXUmxja052WkdVNklITjBjbWx1WjF0ZExDQnlaV2M2SUZKbFowVjRjQ3dnY21Wd2JHRmpaVzFsYm5RNklHRnVlU2tnZTF4dVhIUmNkR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYzNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsTG14bGJtZDBhRHNnYVNzcktTQjdYRzVjZEZ4MFhIUnpjR3hwZEhSbFpGTm9ZV1JsY2tOdlpHVmJhVjBnUFNCemNHeHBkSFJsWkZOb1lXUmxja052WkdWYmFWMHVjbVZ3YkdGalpTaHlaV2NzSUhKbGNHeGhZMlZ0Wlc1MEtUdGNibHgwWEhSOVhHNWNkSDFjYmx4dVhIUndjbWwyWVhSbElITjBZWFJwWXlCZlgzSmxiVzkyWlVacGNuTjBUV0YwWTJocGJtZE1hVzVsS0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlRvZ2MzUnlhVzVuVzEwc0lISmxaem9nVW1WblJYaHdLU0I3WEc1Y2RGeDBabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0J6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1V1YkdWdVozUm9PeUJwS3lzcElIdGNibHgwWEhSY2RHbG1JQ2h6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1ZiYVYwdWJXRjBZMmdvY21WbktTa2dlMXh1WEhSY2RGeDBYSFJ6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1V1YzNCc2FXTmxLR2tzSURFcE8xeHVYSFJjZEZ4MFhIUmljbVZoYXp0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMWNibHh1WEhSd2NtbDJZWFJsSUhOMFlYUnBZeUJmWDI5MWRFVnljbTl5S0Z4dVhIUmNkSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVG9nYzNSeWFXNW5XMTBzWEc1Y2RGeDBiR2x1WlVsdVpHVjRPaUJ1ZFcxaVpYSXNYRzVjZEZ4MFpYSnliM0pOWlhOellXZGxPaUJ6ZEhKcGJtY3NYRzVjZEZ4MFpXMWlaV1JGY25KdmNuTkpiazkxZEhCMWREb2dZbTl2YkdWaGJseHVYSFFwSUh0Y2JseDBYSFJwWmlBb1pXMWlaV1JGY25KdmNuTkpiazkxZEhCMWRDa2dlMXh1WEhSY2RGeDBZMjl1YzNRZ2MyaGhaR1Z5VDNWMGNIVjBUV1Z6YzJGblpTQTlJR0F2THlCc2FXNWxJQ1I3YkdsdVpVbHVaR1Y0ZlRvZ0pIdGxjbkp2Y2sxbGMzTmhaMlY5WEZ4dVlEdGNibHgwWEhSY2RHTnZibk4wSUdOc2IzTmxRbkpoWTJ0bGRGSmxaeUE5SUM4b0xpb3BYRng5VzF4Y2JseGNkQ0JkS2lRdk8xeHVYSFJjZEZ4MFptOXlJQ2hzWlhRZ2FTQTlJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaUzVzWlc1bmRHZ2dMU0F4T3lCcElENDlJREE3SUdrdExTa2dlMXh1WEhSY2RGeDBYSFJqYjI1emRDQnNhVzVsSUQwZ2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbFcybGRPMXh1WEhSY2RGeDBYSFJwWmlBb2JHbHVaUzV0WVhSamFDaGpiRzl6WlVKeVlXTnJaWFJTWldjcEtTQjdYRzVjZEZ4MFhIUmNkRngwWW5KbFlXczdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhScFppQW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxXMmxkSUQwOVBTQnphR0ZrWlhKUGRYUndkWFJOWlhOellXZGxLU0I3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdZWFp2YVdRZ1pIVndiR2xqWVhSbElHVnljbTl5SUcxbGMzTmhaMlZjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MFkyOXVjMjlzWlM1bGNuSnZjaWhsY25KdmNrMWxjM05oWjJVcE8xeHVYSFJjZEZ4MGMzQnNhWFIwWldSVGFHRmtaWEpEYjJSbExuQjFjMmdvYzJoaFpHVnlUM1YwY0hWMFRXVnpjMkZuWlNrN1hHNWNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkSFJvY205M0lHNWxkeUJGY25KdmNpaGxjbkp2Y2sxbGMzTmhaMlVwTzF4dVhIUmNkSDFjYmx4MGZWeHVmVnh1SWl3aWFXMXdiM0owSUZKbFpteGxZM1JwYjI0Z1puSnZiU0FuTGk5U1pXWnNaV04wYVc5dUp6dGNibWx0Y0c5eWRDQjdVMmhoWkdWeWFYUjVUMkpxWldOMExDQlRhR0ZrWlhKVGRHRm5aVk4wY2l3Z1UyaGhaR1Z5Vm1WeWMybHZiaXdnVkdWdGNHeGhkR1ZQWW1wbFkzUjlJR1p5YjIwZ0p5NHVMM1I1Y0dWekwzUjVjR1VuTzF4dWFXMXdiM0owSUZOb1lXUmxjbFJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR2VTJoaFpHVnlWSEpoYm5ObWIzSnRaWEluTzF4dWFXMXdiM0owSUZOb1lXUmxja1ZrYVhSdmNpQm1jbTl0SUNjdUwxTm9ZV1JsY2tWa2FYUnZjaWM3WEc1cGJYQnZjblFnVlhScGJHbDBlU0JtY205dElDY3VMMVYwYVd4cGRIa25PMXh1YVcxd2IzSjBJRk5vWVdSbGNtbDBlVTlpYW1WamRFTnlaV0YwYjNJZ1puSnZiU0FuTGk5VGFHRmtaWEpwZEhsUFltcGxZM1JEY21WaGRHOXlKenRjYm1sdGNHOXlkQ0JRY21WUWNtOWpaWE56YjNJZ1puSnZiU0FuTGk5UWNtVlFjbTlqWlhOemIzSW5PMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JqYkdGemN5QlRhR0ZrWlhKcGRIa2dlMXh1WEhRdkx5QTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JseDBMeThnYzJoaFpHVnlJSFJ5WVc1elptOXliV0YwYVc5dUlHWjFibU4wYVc5dWMxeHVYSFF2THlBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDFjYmx4dVhIUXZLaXBjYmx4MElDb2dWSEpoYm5Oc1lYUmxJR0VnUjB4VFRDQkZVek1nYzJoaFpHVnlJR052WkdVZ2RHOGdZU0JIVEZOTUlFVlRNU0J6YUdGa1pYSWdZMjlrWlZ4dVhIUWdLaUJBY0dGeVlXMGdiMkpxSUZOb1lXUmxjbWwwZVNCdlltcGxZM1FnZEc4Z2RISmhibk5zWVhSbElIUnZJR2RzYzJ3Z1pYTXhYRzVjZENBcUlFQndZWEpoYlNCbGJXSmxaRVZ5Y205eWMwbHVUM1YwY0hWMElFbG1JSFJ5ZFdVc0lIZG9aVzRnZEdobGNtVWdhWE1nWVc0Z1pYSnliM0lnYVc0Z2RHaGxJR052Ym5abGNuTnBiMjRzWEc1Y2RDQXFJQ0FnSUhSb1pTQmxjbkp2Y2lCaGJtUWdkR2hsSUc1MWJXSmxjaUJ2WmlCc2FXNWxjeUJoY21VZ2IzVjBjSFYwSUdGMElIUm9aU0JpYjNSMGIyMGdiMllnZEdobElISmxkSFZ5Ymx4dVhIUWdLaUFnSUNCMllXeDFaU0JUYUdGa1pYSnBkSGxQWW1wbFkzUXVZMjlrWlM0Z1NXWWdabUZzYzJVc0lIUm9jbTkzSUdGdUlHVnljbTl5TGx4dVhIUWdLaUJBY21WMGRYSnVjeUJUYUdGa1pYSnBkSGxQWW1wbFkzUWdkMmh2YzJVZ1kyOWtaU0J3Y205d1pYSjBlU0JwY3lCMGFHVWdjMmhoWkdWeUlHTnZaR1VnWm05eUlFZE1VMHdnUlZNeFhHNWNkQ0FxTDF4dVhIUndkV0pzYVdNZ2MzUmhkR2xqSUhSeVlXNXpabTl5YlZSdlIweFRURVZUTVNodlltbzZJRk5vWVdSbGNtbDBlVTlpYW1WamRDd2daVzFpWldSRmNuSnZjbk5KYms5MWRIQjFkQ0E5SUdaaGJITmxLU0I3WEc1Y2RGeDBZMjl1YzNRZ2MzQnNhWFIwWldSVGFHRmtaWEpEYjJSbElEMGdWWFJwYkdsMGVTNWZjM0JzYVhSQ2VVeHBibVZHWldWa1EyOWtaU2h2WW1vdVkyOWtaU2s3WEc1Y2JseDBYSFJqYjI1emRDQjBjbUZ1YzJadmNtMWxaRk53YkdsMGRHVmtVMmhoWkdWeVEyOWtaVnh1WEhSY2RGeDBQU0JUYUdGa1pYSlVjbUZ1YzJadmNtMWxjaTVmZEhKaGJuTm1iM0p0Vkc5SFRGTk1SVk14S0Z4dVhIUmNkRngwWEhSemNHeHBkSFJsWkZOb1lXUmxja052WkdVc1hHNWNkRngwWEhSY2RHOWlhaTVwYzBaeVlXZHRaVzUwVTJoaFpHVnlMRnh1WEhSY2RGeDBYSFJsYldKbFpFVnljbTl5YzBsdVQzVjBjSFYwWEc1Y2RGeDBYSFFwTzF4dVhIUmNkR052Ym5OMElISmxjM1ZzZEVOdlpHVWdQU0JWZEdsc2FYUjVMbDlxYjJsdVUzQnNhWFIwWldSTWFXNWxLSFJ5WVc1elptOXliV1ZrVTNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsS1R0Y2JseHVYSFJjZEdOdmJuTjBJSEpsYzNWc2RFOWlham9nVTJoaFpHVnlhWFI1VDJKcVpXTjBJRDBnZTF4dVhIUmNkRngwWTI5a1pUb2djbVZ6ZFd4MFEyOWtaU3hjYmx4MFhIUmNkSE5vWVdSbGNsTjBZV2RsT2lCdlltb3VjMmhoWkdWeVUzUmhaMlVzWEc1Y2RGeDBYSFJwYzBaeVlXZHRaVzUwVTJoaFpHVnlPaUJ2WW1vdWFYTkdjbUZuYldWdWRGTm9ZV1JsY2l4Y2JseDBYSFI5TzF4dVhHNWNkRngwY21WMGRYSnVJSEpsYzNWc2RFOWlhanRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCVWNtRnVjMnhoZEdVZ1lTQkhURk5NSUVWVE1TQnphR0ZrWlhJZ1kyOWtaU0IwYnlCaElFZE1VMHdnUlZNeklITm9ZV1JsY2lCamIyUmxYRzVjZENBcUwxeHVYSFJ3ZFdKc2FXTWdjM1JoZEdsaklIUnlZVzV6Wm05eWJWUnZSMHhUVEVWVE15aHZZbW82SUZOb1lXUmxjbWwwZVU5aWFtVmpkQ2tnZTF4dVhIUmNkR052Ym5OMElITndiR2wwZEdWa1UyaGhaR1Z5UTI5a1pTQTlJRlYwYVd4cGRIa3VYM053YkdsMFFubE1hVzVsUm1WbFpFTnZaR1VvYjJKcUxtTnZaR1VwTzF4dVhHNWNkRngwWTI5dWMzUWdkSEpoYm5ObWIzSnRaV1JUY0d4cGRIUmxaRk5vWVdSbGNrTnZaR1ZjYmx4MFhIUmNkRDBnVTJoaFpHVnlWSEpoYm5ObWIzSnRaWEl1WDNSeVlXNXpabTl5YlZSdlIweFRURVZUTXloemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lHOWlhaTVwYzBaeVlXZHRaVzUwVTJoaFpHVnlLVHRjYmx4MFhIUmpiMjV6ZENCeVpYTjFiSFJEYjJSbElEMGdWWFJwYkdsMGVTNWZhbTlwYmxOd2JHbDBkR1ZrVEdsdVpTaDBjbUZ1YzJadmNtMWxaRk53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU2s3WEc1Y2JseDBYSFJqYjI1emRDQnlaWE4xYkhSUFltbzZJRk5vWVdSbGNtbDBlVTlpYW1WamRDQTlJSHRjYmx4MFhIUmNkR052WkdVNklISmxjM1ZzZEVOdlpHVXNYRzVjZEZ4MFhIUnphR0ZrWlhKVGRHRm5aVG9nYjJKcUxuTm9ZV1JsY2xOMFlXZGxMRnh1WEhSY2RGeDBhWE5HY21GbmJXVnVkRk5vWVdSbGNqb2diMkpxTG1selJuSmhaMjFsYm5SVGFHRmtaWElzWEc1Y2RGeDBmVHRjYmx4dVhIUmNkSEpsZEhWeWJpQnlaWE4xYkhSUFltbzdYRzVjZEgxY2JseHVYSFF2S2lwY2JseDBJQ29nVkhKaGJuTnNZWFJsSUdFZ1IweFRUQ0J6YUdGa1pYSWdZMjlrWlNCMGJ5QmhJSE5vWVdSbGNpQmpiMlJsSUc5bUlITndaV05wWm1sbFpDQkhURk5NSUhabGNuTnBiMjVjYmx4MElDb3ZYRzVjZEhCMVlteHBZeUJ6ZEdGMGFXTWdkSEpoYm5ObWIzSnRWRzhvZG1WeWMybHZiam9nVTJoaFpHVnlWbVZ5YzJsdmJpd2diMkpxT2lCVGFHRmtaWEpwZEhsUFltcGxZM1FzSUdWdFltVmtSWEp5YjNKelNXNVBkWFJ3ZFhRZ1BTQm1ZV3h6WlNrZ2UxeHVYSFJjZEdOdmJuTjBJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU0E5SUZWMGFXeHBkSGt1WDNOd2JHbDBRbmxNYVc1bFJtVmxaRU52WkdVb2IySnFMbU52WkdVcE8xeHVYRzVjZEZ4MFkyOXVjM1FnZEhKaGJuTm1iM0p0WldSVGNHeHBkSFJsWkZOb1lXUmxja052WkdWY2JseDBYSFJjZEQwZ1UyaGhaR1Z5VkhKaGJuTm1iM0p0WlhJdVgzUnlZVzV6Wm05eWJWUnZLRnh1WEhSY2RGeDBYSFIyWlhKemFXOXVMRnh1WEhSY2RGeDBYSFJ6Y0d4cGRIUmxaRk5vWVdSbGNrTnZaR1VzWEc1Y2RGeDBYSFJjZEc5aWFpNXBjMFp5WVdkdFpXNTBVMmhoWkdWeUxGeHVYSFJjZEZ4MFhIUmxiV0psWkVWeWNtOXljMGx1VDNWMGNIVjBYRzVjZEZ4MFhIUXBPMXh1WEhSY2RHTnZibk4wSUhKbGMzVnNkRU52WkdVZ1BTQlZkR2xzYVhSNUxsOXFiMmx1VTNCc2FYUjBaV1JNYVc1bEtIUnlZVzV6Wm05eWJXVmtVM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxLVHRjYmx4dVhIUmNkR052Ym5OMElISmxjM1ZzZEU5aWFqb2dVMmhoWkdWeWFYUjVUMkpxWldOMElEMGdlMXh1WEhSY2RGeDBZMjlrWlRvZ2NtVnpkV3gwUTI5a1pTeGNibHgwWEhSY2RITm9ZV1JsY2xOMFlXZGxPaUJ2WW1vdWMyaGhaR1Z5VTNSaFoyVXNYRzVjZEZ4MFhIUnBjMFp5WVdkdFpXNTBVMmhoWkdWeU9pQnZZbW91YVhOR2NtRm5iV1Z1ZEZOb1lXUmxjaXhjYmx4MFhIUjlPMXh1WEc1Y2RGeDBjbVYwZFhKdUlISmxjM1ZzZEU5aWFqdGNibHgwZlZ4dVhHNWNkSEIxWW14cFl5QnpkR0YwYVdNZ2NISnZZMlZ6YzFCeVlXZHRZU2h2WW1vNklGTm9ZV1JsY21sMGVVOWlhbVZqZENrZ2UxeHVYSFJjZEdOdmJuTjBJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU0E5SUZWMGFXeHBkSGt1WDNOd2JHbDBRbmxNYVc1bFJtVmxaRU52WkdVb2IySnFMbU52WkdVcE8xeHVYRzVjZEZ4MFkyOXVjM1FnZEhKaGJuTm1iM0p0WldSVGNHeHBkSFJsWkZOb1lXUmxja052WkdWY2JseDBYSFJjZEQwZ1VISmxVSEp2WTJWemMyOXlMbkJ5YjJObGMzTW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxLVHRjYmx4dVhIUmNkR052Ym5OMElISmxjM1ZzZEVOdlpHVWdQU0JWZEdsc2FYUjVMbDlxYjJsdVUzQnNhWFIwWldSTWFXNWxLSFJ5WVc1elptOXliV1ZrVTNCc2FYUjBaV1JUYUdGa1pYSkRiMlJsS1R0Y2JseHVYSFJjZEdOdmJuTjBJSEpsYzNWc2RFOWlham9nVTJoaFpHVnlhWFI1VDJKcVpXTjBJRDBnZTF4dVhIUmNkRngwWTI5a1pUb2djbVZ6ZFd4MFEyOWtaU3hjYmx4MFhIUmNkSE5vWVdSbGNsTjBZV2RsT2lCdlltb3VjMmhoWkdWeVUzUmhaMlVzWEc1Y2RGeDBYSFJwYzBaeVlXZHRaVzUwVTJoaFpHVnlPaUJ2WW1vdWFYTkdjbUZuYldWdWRGTm9ZV1JsY2l4Y2JseDBYSFI5TzF4dVhHNWNkRngwY21WMGRYSnVJSEpsYzNWc2RFOWlhanRjYmx4MGZWeHVYRzVjZEM4dklEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dVhIUXZMeUJ6YUdGa1pYSnBkSGtnYjJKcVpXTjBJR055WldGMGFXOXVJR1oxYm1OMGFXOXVjMXh1WEhRdkx5QTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JseHVYSFF2S2lwY2JseDBJQ29nUTNKbFlYUmxJR0Z1SUdsdWMzUmhibU5sSUhSdklHTnlaV0YwWlNCemFHRmtaWEpwZEhrZ2IySnFaV04wTGx4dVhIUWdLaTljYmx4MGNIVmliR2xqSUhOMFlYUnBZeUJqY21WaGRHVlRhR0ZrWlhKcGRIbFBZbXBsWTNSRGNtVmhkRzl5S0hOb1lXUmxjbE4wWVdkbE9pQlRhR0ZrWlhKVGRHRm5aVk4wY2lrNklGTm9ZV1JsY21sMGVVOWlhbVZqZEVOeVpXRjBiM0lnZTF4dVhIUmNkSEpsZEhWeWJpQnVaWGNnVTJoaFpHVnlhWFI1VDJKcVpXTjBRM0psWVhSdmNpaHphR0ZrWlhKVGRHRm5aU2s3WEc1Y2RIMWNibHh1WEhRdkx5QTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JseDBMeThnYzJoaFpHVnlJR1ZrYVhRZ1puVnVZM1JwYjI1elhHNWNkQzh2SUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkdhVzVrSUhSb1pTQm1iMnhzYjNkcGJtY2dkR1Z0Y0d4aGRHVWdjR0YwZEdWeWJpQnBiaUIwYUdVZ2MyaGhaR1Z5SUdOdlpHVWdZVzVrSUhKbGNHeGhZMlVnYTJWNUlIUnZJSFpoYkhWbFhHNWNkQ0FxSUVCd1lYSmhiU0IwWlcxd2JHRjBaVTlpYW1WamRDQkJiaUJ2WW1wbFkzUWdkR2hoZENCeVpYQnlaWE5sYm5SeklIUm9aU0J6ZEhKcGJtY2dZbVZtYjNKbElHRnVaQ0JoWm5SbGNpQjBhR1VnY21Wd2JHRmpaVzFsYm5SY2JseDBJQ29nVkdobElHdGxlU0JqWVc0Z1ltVWdZU0J6ZEhKcGJtY2diM0lnWVc0Z2IySnFaV04wTGlCSlppQmhiaUJ2WW1wbFkzUWdhWE1nZFhObFpDQmhjeUIwYUdVZ2EyVjVMRnh1WEhRZ0tpQjBhR1VnYTJWNUlHbHVJSFJvWlNCd1lYUjBaWEp1SUc5bUlITm9ZV1JsY2tOdlpHVWdiWFZ6ZENCaGJITnZJRzFoZEdOb0lIUm9aU0J2WW1wbFkzUXVYRzVjZENBcUlFWnZjaUJsZUdGdGNHeGxMQ0JwWmlCMFpXMXdiR0YwWlU5aWFtVmpkQ0JwYzF4dVhIUmNkSHRjYmx4MFhIUmNkSE5oYlhCc1pTQjdYRzVjZEZ4MFhIUmNkSE5oYlhCc1pVRTZJREJjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjZENBcUlIUm9aVzRnZEdobElHdGxlU0JwYmlCaElITm9ZV1JsY2lCamIyUmxJR2x6SUhOaGJYQnNaUzV6WVcxd2JHVkJMbHh1WEhRZ0tpOWNibHgwTHk4Z1ZHaGxJSFJsYlhCc1lYUmxJSEJoZEhSbGNtNGdhWE5jZEM4cUlITm9ZV1JsY21sMGVUb2dRSHRyWlhsOUlDb3ZYRzVjZEhCMVlteHBZeUJ6ZEdGMGFXTWdabWxzYkZSbGJYQnNZWFJsS0c5aWFqb2dVMmhoWkdWeWFYUjVUMkpxWldOMExDQmhjbWM2SUZSbGJYQnNZWFJsVDJKcVpXTjBLU0I3WEc1Y2RGeDBZMjl1YzNRZ1kyOXdlU0E5SUhSb2FYTXVYMTlqYjNCNVUyaGhaR1Z5YVhSNVQySnFaV04wS0c5aWFpazdYRzVjYmx4MFhIUmpiM0I1TG1OdlpHVWdQU0JUYUdGa1pYSkZaR2wwYjNJdVgyWnBiR3hVWlcxd2JHRjBaU2hqYjNCNUxtTnZaR1VzSUdGeVp5azdYRzVjYmx4MFhIUnlaWFIxY200Z1kyOXdlVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCSmJuTmxjblFnWkdWbWFXNWxJR1JwY21WamRHbDJaVnh1WEhRZ0tpOWNibHgwY0hWaWJHbGpJSE4wWVhScFl5QnBibk5sY25SRVpXWnBibWwwYVc5dUtHOWlham9nVTJoaFpHVnlhWFI1VDJKcVpXTjBMQ0JrWldacGJtbDBhVzl1T2lCemRISnBibWNwSUh0Y2JseDBYSFJqYjI1emRDQmpiM0I1SUQwZ2RHaHBjeTVmWDJOdmNIbFRhR0ZrWlhKcGRIbFBZbXBsWTNRb2IySnFLVHRjYmx4MFhIUmpiMjV6ZENCemNHeHBkSFJsWkZOb1lXUmxja052WkdVZ1BTQlZkR2xzYVhSNUxsOXpjR3hwZEVKNVRHbHVaVVpsWldSRGIyUmxLRzlpYWk1amIyUmxLVHRjYmx4dVhIUmNkRk5vWVdSbGNrVmthWFJ2Y2k1ZmFXNXpaWEowUkdWbWFXNXBkR2x2YmloemNHeHBkSFJsWkZOb1lXUmxja052WkdVc0lHUmxabWx1YVhScGIyNHBPMXh1WEhSY2RHTnZjSGt1WTI5a1pTQTlJRlYwYVd4cGRIa3VYMnB2YVc1VGNHeHBkSFJsWkV4cGJtVW9jM0JzYVhSMFpXUlRhR0ZrWlhKRGIyUmxLVHRjYmx4dVhIUmNkSEpsZEhWeWJpQmpiM0I1TzF4dVhIUjlYRzVjYmx4MEx5OGdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNWNkQzh2SUhKbFpteGxZM1JwYjI0Z1puVnVZM1JwYjI1elhHNWNkQzh2SUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkRjbVZoZEdVZ1lXNGdhVzV6ZEdGdVkyVWdkRzhnWjJWMElIUm9aU0JoZEhSeWFXSjFkR1VzSUhaaGNubHBibWNzSUdGdVpDQjFibWxtYjNKdElHbHVabTl5YldGMGFXOXVJR1p5YjIwZ1lTQnphR0ZrWlhJZ1kyOWtaU0J2WmlCMGFHVWdjMmhoWkdWeWFYUjVMbHh1WEhRZ0tpQlVieUJuWlhRZ2RHaGxjMlVnYVc1bWIzSnRZWFJwYjI0c0lIbHZkU0J1WldWa0lIUnZJR05oYkd3Z2NtVm1iR1ZqZEdsdmJpNXlaV1pzWldOMElHMWxkR2h2WkM1Y2JseDBJQ292WEc1Y2RIQjFZbXhwWXlCemRHRjBhV01nWTNKbFlYUmxVbVZtYkdWamRHbHZiazlpYW1WamRDaHZZbW82SUZOb1lXUmxjbWwwZVU5aWFtVmpkQ2s2SUZKbFpteGxZM1JwYjI0Z2UxeHVYSFJjZEdOdmJuTjBJSE53YkdsMGRHVmtVMmhoWkdWeVEyOWtaU0E5SUZWMGFXeHBkSGt1WDNOd2JHbDBRbmxNYVc1bFJtVmxaRU52WkdVb2IySnFMbU52WkdVcE8xeHVYRzVjZEZ4MFkyOXVjM1FnY21WbWJHVmpkR2x2YmlBOUlHNWxkeUJTWldac1pXTjBhVzl1S0hOd2JHbDBkR1ZrVTJoaFpHVnlRMjlrWlN3Z2IySnFMbk5vWVdSbGNsTjBZV2RsS1R0Y2JseDBYSFJ5WlhSMWNtNGdjbVZtYkdWamRHbHZianRjYmx4MGZWeHVYRzVjZEM4dklEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dVhIUXZMeUJ3Y21sMllYUmxJR1oxYm1OMGFXOXVjMXh1WEhRdkx5QTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JseHVYSFJ3Y21sMllYUmxJSE4wWVhScFl5QmZYMk52Y0hsVGFHRmtaWEpwZEhsUFltcGxZM1FvYjJKcU9pQlRhR0ZrWlhKcGRIbFBZbXBsWTNRcElIdGNibHgwWEhSamIyNXpkQ0JqYjNCcFpXUlBZbW82SUZOb1lXUmxjbWwwZVU5aWFtVmpkQ0E5SUh0Y2JseDBYSFJjZEdOdlpHVTZJRzlpYWk1amIyUmxMRnh1WEhSY2RGeDBjMmhoWkdWeVUzUmhaMlU2SUc5aWFpNXphR0ZrWlhKVGRHRm5aU3hjYmx4MFhIUmNkR2x6Um5KaFoyMWxiblJUYUdGa1pYSTZJRzlpYWk1cGMwWnlZV2R0Wlc1MFUyaGhaR1Z5TEZ4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQmpiM0JwWldSUFltbzdYRzVjZEgxY2JuMWNiaUlzSW1sdGNHOXlkQ0I3WEc1Y2RGTm9ZV1JsY2tOdmJuTjBZVzUwVm1Gc2RXVlBZbXBsWTNRc1hHNWNkRk5vWVdSbGNrVjRkR1Z1YzJsdmJrSmxhR0YyYVc5eUxGeHVYSFJUYUdGa1pYSkZlSFJsYm5OcGIyNVBZbXBsWTNRc1hHNWNkRk5vWVdSbGNtbDBlVTlpYW1WamRDeGNibHgwVTJoaFpHVnlRMjl1YzNSaGJuUldZV3gxWlZaaGNsUjVjR1ZGVXpNc1hHNWNkRk5vWVdSbGNsQnlaV05wYzJsdmJrOWlhbVZqZEN4Y2JseDBVMmhoWkdWeVVISmxZMmx6YVc5dVQySnFaV04wUzJWNUxGeHVYSFJUYUdGa1pYSlRkR0ZuWlZOMGNpeGNibHgwVTJoaFpHVnlRWFIwY21saWRYUmxUMkpxWldOMExGeHVYSFJUYUdGa1pYSlFjbVZqYVhOcGIyNVVlWEJsTEZ4dVhIUlRhR0ZrWlhKQmRIUnlhV0oxZEdWV1lYSlVlWEJsTEZ4dVhIUlRhR0ZrWlhKV1lYSjVhVzVuVDJKcVpXTjBMRnh1WEhSVGFHRmtaWEpXWVhKNWFXNW5TVzUwWlhKd2IyeGhkR2x2YmxSNWNHVXNYRzVjZEZOb1lXUmxjbFpoY25scGJtZFdZWEpVZVhCbExGeHVYSFJUYUdGa1pYSlZibWxtYjNKdFQySnFaV04wTEZ4dVhIUlRhR0ZrWlhKVmJtbG1iM0p0Vm1GeVZIbHdaVVZUTXl4Y2JseDBVMmhoWkdWeVUzUnlkV04wUkdWbWFXNXBkR2x2Yms5aWFtVmpkQ3hjYmx4MFUyaGhaR1Z5VTNSeWRXTjBUV1Z0WW1WeVQySnFaV04wTEZ4dVhIUlRhR0ZrWlhKRGIyNXpkR0Z1ZEZOMGNuVmpkRlpoYkhWbFQySnFaV04wTEZ4dVhIUlRhR0ZrWlhKVmJtbG1iM0p0VTNSeWRXTjBUMkpxWldOMExGeHVYSFJUYUdGa1pYSlZibWxtYjNKdFFuVm1abVZ5VDJKcVpXTjBMRnh1WEhSVGFHRmtaWEpWUWs5V1lYSnBZV0pzWlU5aWFtVmpkQ3hjYmx4MFUyaGhaR1Z5Um5WdVkzUnBiMjVQWW1wbFkzUXNYRzU5SUdaeWIyMGdKeTR1TDNSNWNHVnpMM1I1Y0dVbk8xeHVhVzF3YjNKMElGVjBhV3hwZEhrZ1puSnZiU0FuTGk5VmRHbHNhWFI1Snp0Y2JseHVMeW9xWEc0Z0tpQlVhR2x6SUdOc1lYTnpJR055WldGMFpYTWdZU0J6YUdGa1pYSnBkSGtnYjJKcVpXTjBMbHh1SUNvdlhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJUYUdGa1pYSnBkSGxQWW1wbFkzUkRjbVZoZEc5eUlIdGNibHgwY0hKcGRtRjBaU0JmWDNOb1lXUmxjbE4wWVdkbE9pQlRhR0ZrWlhKVGRHRm5aVk4wY2p0Y2JseDBjSEpwZG1GMFpTQmZYMloxYm1OMGFXOXVTV1JEYjNWdWRDQTlJREE3WEc1Y2JseDBjSEpwZG1GMFpTQmZYMlJsWm1sdVpVUnBjbVZqZEdsMlpVNWhiV1Z6T2lCemRISnBibWRiWFNBOUlGdGRPMXh1WEhSd2NtbDJZWFJsSUY5ZlpYaDBaVzV6YVc5dWN6b2dVMmhoWkdWeVJYaDBaVzV6YVc5dVQySnFaV04wVzEwZ1BTQmJYVHRjYmx4MGNISnBkbUYwWlNCZlgyZHNiMkpoYkZCeVpXTnBjMmx2YmpvZ1UyaGhaR1Z5VUhKbFkybHphVzl1VDJKcVpXTjBJRDBnZTF4dVhIUmNkR2x1ZERvZ0oyaHBaMmh3Snl4Y2JseDBYSFJtYkc5aGREb2dKMmhwWjJod0p5eGNibHgwWEhSellXMXdiR1Z5TWtRNklDZG9hV2RvY0Njc1hHNWNkRngwYzJGdGNHeGxja04xWW1VNklDZG9hV2RvY0Njc1hHNWNkRngwYzJGdGNHeGxjak5FT2lBbmFHbG5hSEFuTEZ4dVhIUmNkSE5oYlhCc1pYSXlSRUZ5Y21GNU9pQW5hR2xuYUhBbkxGeHVYSFJjZEdsellXMXdiR1Z5TWtRNklDZG9hV2RvY0Njc1hHNWNkRngwYVhOaGJYQnNaWEpEZFdKbE9pQW5hR2xuYUhBbkxGeHVYSFJjZEdsellXMXdiR1Z5TTBRNklDZG9hV2RvY0Njc1hHNWNkRngwYVhOaGJYQnNaWEl5UkVGeWNtRjVPaUFuYUdsbmFIQW5MRnh1WEhSY2RIVnpZVzF3YkdWeU1rUTZJQ2RvYVdkb2NDY3NYRzVjZEZ4MGRYTmhiWEJzWlhKRGRXSmxPaUFuYUdsbmFIQW5MRnh1WEhSY2RIVnpZVzF3YkdWeU0wUTZJQ2RvYVdkb2NDY3NYRzVjZEZ4MGRYTmhiWEJzWlhJeVJFRnljbUY1T2lBbmFHbG5hSEFuTEZ4dVhIUmNkSE5oYlhCc1pYSXlSRk5vWVdSdmR6b2dKMmhwWjJod0p5eGNibHgwWEhSellXMXdiR1Z5UTNWaVpWTm9ZV1J2ZHpvZ0oyaHBaMmh3Snl4Y2JseDBYSFJ6WVcxd2JHVnlNa1JCY25KaGVWTm9ZV1J2ZHpvZ0oyaHBaMmh3Snl4Y2JseDBmVHRjYmx4MGNISnBkbUYwWlNCZlgzTjBjblZqZEVSbFptbHVhWFJwYjI1ek9pQlRhR0ZrWlhKVGRISjFZM1JFWldacGJtbDBhVzl1VDJKcVpXTjBXMTBnUFNCYlhUdGNibHgwY0hKcGRtRjBaU0JmWDJkc2IySmhiRU52Ym5OMFlXNTBWbUZzZFdWek9pQlRhR0ZrWlhKRGIyNXpkR0Z1ZEZaaGJIVmxUMkpxWldOMFcxMGdQU0JiWFR0Y2JseDBjSEpwZG1GMFpTQmZYMmRzYjJKaGJFTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVnpPaUJUYUdGa1pYSkRiMjV6ZEdGdWRGTjBjblZqZEZaaGJIVmxUMkpxWldOMFcxMGdQU0JiWFR0Y2JseDBjSEpwZG1GMFpTQmZYMkYwZEhKcFluVjBaWE02SUZOb1lXUmxja0YwZEhKcFluVjBaVTlpYW1WamRGdGRJRDBnVzEwN0lDOHZJR1p2Y2lCMlpYSjBaWGdnYzJoaFpHVnlJRzl1YkhsY2JseDBjSEpwZG1GMFpTQmZYM1poY25scGJtZHpPaUJUYUdGa1pYSldZWEo1YVc1blQySnFaV04wVzEwZ1BTQmJYVHRjYmx4MGNISnBkbUYwWlNCZlgzVnVhV1p2Y20xek9pQlRhR0ZrWlhKVmJtbG1iM0p0VDJKcVpXTjBXMTBnUFNCYlhUdGNibHgwY0hKcGRtRjBaU0JmWDNWdWFXWnZjbTFUZEhKMVkzUnpPaUJUYUdGa1pYSlZibWxtYjNKdFUzUnlkV04wVDJKcVpXTjBXMTBnUFNCYlhUdGNibHgwY0hKcGRtRjBaU0JmWDNWdWFXWnZjbTFDZFdabVpYSlBZbXBsWTNSek9pQlRhR0ZrWlhKVmJtbG1iM0p0UW5WbVptVnlUMkpxWldOMFcxMGdQU0JiWFR0Y2JseDBjSEpwZG1GMFpTQmZYMloxYm1OMGFXOXVjem9nVTJoaFpHVnlSblZ1WTNScGIyNVBZbXBsWTNSYlhWdGRJRDBnVzEwN0lDOHZJR1pwY25OMElHbHVaR1Y0SUhKbGNISmxjMlZ1ZENCa1pYQmxibVJsYm1ONUlHeGxkbVZzWEc1Y2RIQnlhWFpoZEdVZ1gxOXRZV2x1Um5WdVkzUnBiMjVEYjJSbE9pQnpkSEpwYm1jZ1BTQW5kbTlwWkNCdFlXbHVLQ2tnZTMwbk8xeHVYSFJ3Y21sMllYUmxJRjlmYjNWMGNIVjBRMjlzYjNKV1lYSnBZV0pzWlU1aGJXVTZJSE4wY21sdVp5QTlJQ2R5Wlc1a1pYSlVZWEpuWlhRd0p6c2dMeThnWm05eUlHWnlZV2R0Wlc1MElITm9ZV1JsY2lCdmJteDVYRzVjYmx4MFkyOXVjM1J5ZFdOMGIzSW9jMmhoWkdWeVUzUmhaMlU2SUZOb1lXUmxjbE4wWVdkbFUzUnlLU0I3WEc1Y2RGeDBkR2hwY3k1ZlgzTm9ZV1JsY2xOMFlXZGxJRDBnYzJoaFpHVnlVM1JoWjJVN1hHNWNkSDFjYmx4dVhIUXZMeUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMWNibHgwTHk4Z1lXUmtJSEJoY21GdFpYUmxjbk1nWm5WdVkzUnBiMjV6WEc1Y2RDOHZJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVYRzVjZEhCMVlteHBZeUJoWkdSRVpXWnBibVZFYVhKbFkzUnBkbVVvWkdWbWFXNWxSR2x5WldOMGFYWmxUbUZ0WlRvZ2MzUnlhVzVuS1NCN1hHNWNkRngwWTI5dWMzUWdhWE5FZFhCc2FXTmhkR1VnUFZ4dVhIUmNkRngwZEdocGN5NWZYMlJsWm1sdVpVUnBjbVZqZEdsMlpVNWhiV1Z6TG5OdmJXVW9ibUZ0WlNBOVBpQnVZVzFsSUQwOVBTQmtaV1pwYm1WRWFYSmxZM1JwZG1WT1lXMWxLVHRjYmx4MFhIUnBaaUFvYVhORWRYQnNhV05oZEdVcElIdGNibHgwWEhSY2RHTnZibk52YkdVdWQyRnliaWduWVdSa1JHVm1hVzVsUkdseVpXTjBhWFpsT2lCMGFHbHpJR1JsWm1sdVpTQmthWEpsWTNScGRtVWdhWE1nWVd4eVpXRmtlU0J6WlhRbktUdGNibHgwWEhSY2RISmxkSFZ5Ymp0Y2JseDBYSFI5WEc1Y2JseDBYSFIwYUdsekxsOWZaR1ZtYVc1bFJHbHlaV04wYVhabFRtRnRaWE11Y0hWemFDaGtaV1pwYm1WRWFYSmxZM1JwZG1WT1lXMWxLVHRjYmx4MGZWeHVYRzVjZEhCMVlteHBZeUJoWkdSRmVIUmxibk5wYjI0b1pYaDBaVzV6YVc5dVRtRnRaVG9nYzNSeWFXNW5MQ0JpWldoaGRtbHZjam9nVTJoaFpHVnlSWGgwWlc1emFXOXVRbVZvWVhacGIzSWdQU0FuWlc1aFlteGxKeWtnZTF4dVhIUmNkR052Ym5OMElHbHpSSFZ3YkdsallYUmxJRDFjYmx4MFhIUmNkSFJvYVhNdVgxOWxlSFJsYm5OcGIyNXpMbk52YldVb1pYaDBaVzV6YVc5dUlEMCtJR1Y0ZEdWdWMybHZiaTVsZUhSbGJuTnBiMjVPWVcxbElEMDlQU0JsZUhSbGJuTnBiMjVPWVcxbEtUdGNibHgwWEhScFppQW9hWE5FZFhCc2FXTmhkR1VwSUh0Y2JseDBYSFJjZEdOdmJuTnZiR1V1ZDJGeWJpZ25ZV1JrUlhoMFpXNXphVzl1T2lCMGFHbHpJR1Y0ZEdWdWMybHZiaUJwY3lCaGJISmxZV1I1SUhObGRDY3BPMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEhSb2FYTXVYMTlsZUhSbGJuTnBiMjV6TG5CMWMyZ29lMXh1WEhSY2RGeDBaWGgwWlc1emFXOXVUbUZ0WlN4Y2JseDBYSFJjZEdKbGFHRjJhVzl5WEc1Y2RGeDBmU2s3WEc1Y2RIMWNibHh1WEhRdkx5QnZibXg1SUdSbFptbHVaU0IwZVhCbGMxeHVYSFJ3ZFdKc2FXTWdZV1JrVTNSeWRXTjBSR1ZtYVc1cGRHbHZiaWh6ZEhKMVkzUk9ZVzFsT2lCemRISnBibWNzSUcxbGJXSmxjazlpYW1WamRITTZJRk5vWVdSbGNsTjBjblZqZEUxbGJXSmxjazlpYW1WamRGdGRLU0I3WEc1Y2RGeDBZMjl1YzNRZ2FYTkVkWEJzYVdOaGRHVWdQVnh1WEhSY2RGeDBkR2hwY3k1ZlgzTjBjblZqZEVSbFptbHVhWFJwYjI1ekxuTnZiV1VvYzNSeWRXTjBSR1ZtYVc1cGRHbHZiaUE5UGlCemRISjFZM1JFWldacGJtbDBhVzl1TG5OMGNuVmpkRTVoYldVZ1BUMDlJSE4wY25WamRFNWhiV1VwTzF4dVhIUmNkR2xtSUNocGMwUjFjR3hwWTJGMFpTa2dlMXh1WEhSY2RGeDBZMjl1YzI5c1pTNWxjbkp2Y2loZ1lXUmtVM1J5ZFdOMFJHVm1hVzVwZEdsdmJqb2daSFZ3YkdsallYUmxJSE4wY25WamRDQjBlWEJsSUc1aGJXVWdKSHR6ZEhKMVkzUk9ZVzFsZldBcE8xeHVYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkSDFjYmx4dVhIUmNkSFJvYVhNdVgxOXpkSEoxWTNSRVpXWnBibWwwYVc5dWN5NXdkWE5vS0h0Y2JseDBYSFJjZEhOMGNuVmpkRTVoYldVc1hHNWNkRngwWEhSdFpXMWlaWEpQWW1wbFkzUnpMRnh1WEhSY2RIMHBPMXh1WEhSOVhHNWNibHgwY0hWaWJHbGpJR0ZrWkVkc2IySmhiRU52Ym5OMFlXNTBWbUZzZFdVb2RtRnlhV0ZpYkdWT1lXMWxPaUJ6ZEhKcGJtY3NJSFI1Y0dVNklGTm9ZV1JsY2tOdmJuTjBZVzUwVm1Gc2RXVldZWEpVZVhCbFJWTXpMQ0IyWVd4MVpYTTZJRzUxYldKbGNsdGRLU0I3WEc1Y2RGeDBZMjl1YzNRZ2FYTkVkWEJzYVdOaGRHVWdQVnh1WEhSY2RGeDBkR2hwY3k1ZlgyZHNiMkpoYkVOdmJuTjBZVzUwVm1Gc2RXVnpMbk52YldVb1oyeHZZbUZzUTI5dWMzUmhiblJXWVd4MVpTQTlQaUJuYkc5aVlXeERiMjV6ZEdGdWRGWmhiSFZsTG5aaGNtbGhZbXhsVG1GdFpTQTlQVDBnZG1GeWFXRmliR1ZPWVcxbEtUdGNibHgwWEhScFppQW9hWE5FZFhCc2FXTmhkR1VwSUh0Y2JseDBYSFJjZEdOdmJuTnZiR1V1WlhKeWIzSW9ZR0ZrWkVkc2IySmhiRU52Ym5OMFlXNTBWbUZzZFdVNklHUjFjR3hwWTJGMFpTQjJZWEpwWVdKc1pTQnVZVzFsSUNSN2RtRnlhV0ZpYkdWT1lXMWxmV0FwTzF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RHTnZibk4wSUdselZtRnNhV1JEYjIxd2IyNWxiblJPZFcxaVpYSWdQU0JWZEdsc2FYUjVMbDlwYzFaaGJHbGtRMjl0Y0c5dVpXNTBRMjkxYm5Rb2RIbHdaU3dnZG1Gc2RXVnpLVHRjYmx4MFhIUnBaaUFvSVdselZtRnNhV1JEYjIxd2IyNWxiblJPZFcxaVpYSXBJSHRjYmx4MFhIUmNkR052Ym5OdmJHVXVaWEp5YjNJb1lHRmtaRWRzYjJKaGJFTnZibk4wWVc1MFZtRnNkV1U2SUhSb1pTQmpiMjF3YjI1bGJuUWdZMjkxYm5RZ2IyWWdKSHQyWVhKcFlXSnNaVTVoYldWOUlHbHpJR2x1ZG1Gc2FXUmdLVHRjYmx4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSOVhHNWNibHgwWEhSamIyNXpkQ0JwYzBsdWRGUjVjR1VnUFNCVmRHbHNhWFI1TGw5cGMwbHVkRlI1Y0dVb2RIbHdaU2s3WEc1Y2RGeDBhV1lnS0dselNXNTBWSGx3WlNrZ2UxeHVYSFJjZEZ4MFkyOXVjM1FnWlhocGMzUk9iMjVKYm5SbFoyVnlWbUZzZFdVZ1BTQlRhR0ZrWlhKcGRIbFBZbXBsWTNSRGNtVmhkRzl5TGw5ZlpYaHBjM1JPYjI1SmJuUmxaMlZ5Vm1Gc2RXVW9kbUZzZFdWektUdGNibHgwWEhSY2RHbG1JQ2hsZUdsemRFNXZia2x1ZEdWblpYSldZV3gxWlNrZ2UxeHVYSFJjZEZ4MFhIUmpiMjV6YjJ4bExuZGhjbTRvWUdGa1pFZHNiMkpoYkVOdmJuTjBZVzUwVm1Gc2RXVTZJRzV2YmkxcGJuUmxaMlZ5SUhaaGJIVmxJR2x6SUhObGRDQjBieUFrZTNaaGNtbGhZbXhsVG1GdFpYMWdLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MFhIUjBhR2x6TGw5ZloyeHZZbUZzUTI5dWMzUmhiblJXWVd4MVpYTXVjSFZ6YUNoN1hHNWNkRngwWEhSMllYSnBZV0pzWlU1aGJXVXNYRzVjZEZ4MFhIUjBlWEJsTEZ4dVhIUmNkRngwZG1Gc2RXVnpMRnh1WEhSY2RIMHBPMXh1WEhSOVhHNWNibHgwTHk4Z2JtVmxaQ0IwYnlCa1pXWnBibVVnYzNSeWRXTjBJR0o1SUhSb1pTQmhaR1JUZEhKMVkzUkVaV1pwYm1sMGFXOXVJRzFsZEdodlpGeHVYSFF2THlCMllXeHBaR0YwWlNCMGFHRjBJSFJvWlNCamIzSnlaWE53YjI1a2FXNW5JSE4wY25WamRIVnlaU0JwY3lCa1pXWnBibVZrSUdKNUlIUm9aU0JmWDJOeVpXRjBaVWRzYjJKaGJFTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVlRhR0ZrWlhKRGIyUmxJRzFsZEdodlpGeHVYSFJ3ZFdKc2FXTWdZV1JrUjJ4dlltRnNRMjl1YzNSaGJuUlRkSEoxWTNSV1lXeDFaU2h6ZEhKMVkzUk9ZVzFsT2lCemRISnBibWNzSUhaaGNtbGhZbXhsVG1GdFpUb2djM1J5YVc1bkxDQjJZV3gxWlhNNklIdGJhMlY1Vm1GeWFXRmliR1ZPWVcxbE9pQnpkSEpwYm1kZE9pQnVkVzFpWlhKYlhYMHBJSHRjYmx4MFhIUmpiMjV6ZENCcGMwUjFjR3hwWTJGMFpTQTlYRzVjZEZ4MFhIUjBhR2x6TGw5ZloyeHZZbUZzUTI5dWMzUmhiblJUZEhKMVkzUldZV3gxWlhNdWMyOXRaU2h6ZEhKMVkzUldZV3gxWlNBOVBpQnpkSEoxWTNSV1lXeDFaUzUyWVhKcFlXSnNaVTVoYldVZ1BUMDlJSFpoY21saFlteGxUbUZ0WlNrN1hHNWNkRngwYVdZZ0tHbHpSSFZ3YkdsallYUmxLU0I3WEc1Y2RGeDBYSFJqYjI1emIyeGxMbVZ5Y205eUtHQmhaR1JIYkc5aVlXeERiMjV6ZEdGdWRGTjBjblZqZEZaaGJIVmxPaUJrZFhCc2FXTmhkR1VnZG1GeWFXRmliR1VnYm1GdFpTQWtlM1poY21saFlteGxUbUZ0WlgxZ0tUdGNibHgwWEhSY2RISmxkSFZ5Ymp0Y2JseDBYSFI5WEc1Y2JseDBYSFIwYUdsekxsOWZaMnh2WW1Gc1EyOXVjM1JoYm5SVGRISjFZM1JXWVd4MVpYTXVjSFZ6YUNoN1hHNWNkRngwWEhSMllYSnBZV0pzWlU1aGJXVXNYRzVjZEZ4MFhIUnpkSEoxWTNST1lXMWxMRnh1WEhSY2RGeDBkbUZzZFdWekxGeHVYSFJjZEgwcE8xeHVYSFI5WEc1Y2JseDBjSFZpYkdsaklHRmtaRUYwZEhKcFluVjBaVVJsWTJ4aGNtRjBhVzl1S0Z4dVhIUmNkSFpoY21saFlteGxUbUZ0WlRvZ2MzUnlhVzVuTEZ4dVhIUmNkSFI1Y0dVNklGTm9ZV1JsY2tGMGRISnBZblYwWlZaaGNsUjVjR1VzWEc1Y2RGeDBiM0IwYVc5dWN6ODZJSHRjYmx4MFhIUmNkSEJ5WldOcGMybHZiajg2SUZOb1lXUmxjbEJ5WldOcGMybHZibFI1Y0dVc1hHNWNkRngwWEhSc2IyTmhkR2x2Ymo4NklHNTFiV0psY2l4Y2JseDBYSFI5WEc1Y2RDa2dlMXh1WEhSY2RHbG1JQ2gwYUdsekxsOWZjMmhoWkdWeVUzUmhaMlVnSVQwOUlDZDJaWEowWlhnbktTQjdYRzVjZEZ4MFhIUmpiMjV6YjJ4bExtVnljbTl5S0NkaFpHUkJkSFJ5YVdKMWRHVTZJSFJvYVhNZ2JXVjBhRzlrSUdseklHWnZjaUIyWlhKMFpYZ2djMmhoWkdWeUlHOXViSGtuS1R0Y2JseDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUjlYRzVjYmx4MFhIUmpiMjV6ZENCcGMwUjFjR3hwWTJGMFpTQTlYRzVjZEZ4MFhIUjBhR2x6TGw5ZllYUjBjbWxpZFhSbGN5NXpiMjFsS0dGMGRISnBZblYwWlNBOVBpQmhkSFJ5YVdKMWRHVXVkbUZ5YVdGaWJHVk9ZVzFsSUQwOVBTQjJZWEpwWVdKc1pVNWhiV1VwTzF4dVhIUmNkR2xtSUNocGMwUjFjR3hwWTJGMFpTa2dlMXh1WEhSY2RGeDBZMjl1YzI5c1pTNWxjbkp2Y2loZ1lXUmtRWFIwY21saWRYUmxPaUJrZFhCc2FXTmhkR1VnZG1GeWFXRmliR1VnYm1GdFpTQWtlM1poY21saFlteGxUbUZ0WlgxZ0tUdGNibHgwWEhSY2RISmxkSFZ5Ymp0Y2JseDBYSFI5WEc1Y2JseDBYSFIwYUdsekxsOWZZWFIwY21saWRYUmxjeTV3ZFhOb0tIdGNibHgwWEhSY2RIWmhjbWxoWW14bFRtRnRaU3hjYmx4MFhIUmNkSFI1Y0dVc1hHNWNkRngwWEhSd2NtVmphWE5wYjI0NklHOXdkR2x2Ym5NL0xuQnlaV05wYzJsdmJpeGNibHgwWEhSY2RHeHZZMkYwYVc5dU9pQnZjSFJwYjI1elB5NXNiMk5oZEdsdmJpeGNibHgwWEhSOUtUdGNibHgwZlZ4dVhHNWNkSEIxWW14cFl5QmhaR1JXWVhKNWFXNW5SR1ZqYkdGeVlYUnBiMjRvWEc1Y2RGeDBkbUZ5YVdGaWJHVk9ZVzFsT2lCemRISnBibWNzWEc1Y2RGeDBkSGx3WlRvZ1UyaGhaR1Z5Vm1GeWVXbHVaMVpoY2xSNWNHVXNYRzVjZEZ4MGIzQjBhVzl1Y3o4NklIdGNibHgwWEhSY2RIQnlaV05wYzJsdmJqODZJRk5vWVdSbGNsQnlaV05wYzJsdmJsUjVjR1VzWEc1Y2RGeDBYSFJwYm5SbGNuQnZiR0YwYVc5dVZIbHdaVDg2SUZOb1lXUmxjbFpoY25scGJtZEpiblJsY25CdmJHRjBhVzl1Vkhsd1pTeGNibHgwWEhSOVhHNWNkQ2tnZTF4dVhIUmNkR052Ym5OMElHbHpSSFZ3YkdsallYUmxJRDFjYmx4MFhIUmNkSFJvYVhNdVgxOTJZWEo1YVc1bmN5NXpiMjFsS0haaGNubHBibWNnUFQ0Z2RtRnllV2x1Wnk1MllYSnBZV0pzWlU1aGJXVWdQVDA5SUhaaGNtbGhZbXhsVG1GdFpTazdYRzVjZEZ4MGFXWWdLR2x6UkhWd2JHbGpZWFJsS1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG1WeWNtOXlLR0JoWkdSV1lYSjVhVzVuT2lCa2RYQnNhV05oZEdVZ2RtRnlhV0ZpYkdVZ2JtRnRaU0FrZTNaaGNtbGhZbXhsVG1GdFpYMWdLVHRjYmx4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSOVhHNWNibHgwWEhSamIyNXpkQ0JwYzBsdWRGUjVjR1VnUFNCVmRHbHNhWFI1TGw5cGMwbHVkRlI1Y0dVb2RIbHdaU2s3WEc1Y2RGeDBiR1YwSUdsdWRHVnljRzlzWVhScGIyNVVlWEJsSUQwZ2IzQjBhVzl1Y3o4dWFXNTBaWEp3YjJ4aGRHbHZibFI1Y0dVN1hHNWNkRngwYVdZZ0tHbHpTVzUwVkhsd1pTQW1KaUJwYm5SbGNuQnZiR0YwYVc5dVZIbHdaU0FoUFQwZ0oyWnNZWFFuS1NCN1hHNWNkRngwWEhScFppQW9hVzUwWlhKd2IyeGhkR2x2YmxSNWNHVWdJVDBnYm5Wc2JDa2dlMXh1WEhSY2RGeDBYSFJqYjI1emIyeGxMbVZ5Y205eUtHQmhaR1JXWVhKNWFXNW5PaUIwYUdVZ2FXNTBaWEp3YjJ4aGRHbHZibFI1Y0dVZ2JYVnpkQ0JpWlNCbWJHRjBJR1p2Y2lCcGJuUmxaMlZ5SUhSNWNHVnpZQ2s3WEc1Y2RGeDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkR052Ym5OdmJHVXVkMkZ5YmloZ1lXUmtWbUZ5ZVdsdVp6b2djMlYwSUhSb1pTQnBiblJsY25CdmJHRjBhVzl1Vkhsd1pTQnZaaUJwYm5SbFoyVnlJSFI1Y0dWeklIUnZJR1pzWVhRZ2RHOGdZWFp2YVdRZ1kyOXRjR2xzWVhScGIyNGdaWEp5YjNKZ0tUdGNibHgwWEhSY2RGeDBhVzUwWlhKd2IyeGhkR2x2YmxSNWNHVWdQU0FuWm14aGRDYzdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYRzVjZEZ4MGRHaHBjeTVmWDNaaGNubHBibWR6TG5CMWMyZ29lMXh1WEhSY2RGeDBkbUZ5YVdGaWJHVk9ZVzFsTEZ4dVhIUmNkRngwZEhsd1pTeGNibHgwWEhSY2RIQnlaV05wYzJsdmJqb2diM0IwYVc5dWN6OHVjSEpsWTJsemFXOXVMRnh1WEhSY2RGeDBhVzUwWlhKd2IyeGhkR2x2YmxSNWNHVXNYRzVjZEZ4MGZTazdYRzVjZEgxY2JseHVYSFJ3ZFdKc2FXTWdZV1JrVlc1cFptOXliVVJsWTJ4aGNtRjBhVzl1S0Z4dVhIUmNkSFpoY21saFlteGxUbUZ0WlRvZ2MzUnlhVzVuTEZ4dVhIUmNkSFI1Y0dVNklGTm9ZV1JsY2xWdWFXWnZjbTFXWVhKVWVYQmxSVk16TEZ4dVhIUmNkRzl3ZEdsdmJuTS9PaUI3WEc1Y2RGeDBYSFJ3Y21WamFYTnBiMjQvT2lCVGFHRmtaWEpRY21WamFYTnBiMjVVZVhCbExGeHVYSFJjZEgxY2JseDBLU0I3WEc1Y2RGeDBZMjl1YzNRZ2FYTkVkWEJzYVdOaGRHVWdQVnh1WEhSY2RGeDBkR2hwY3k1ZlgzVnVhV1p2Y20xekxuTnZiV1VvZFc1cFptOXliU0E5UGlCMWJtbG1iM0p0TG5aaGNtbGhZbXhsVG1GdFpTQTlQVDBnZG1GeWFXRmliR1ZPWVcxbEtUdGNibHgwWEhScFppQW9hWE5FZFhCc2FXTmhkR1VwSUh0Y2JseDBYSFJjZEdOdmJuTnZiR1V1WlhKeWIzSW9ZR0ZrWkZWdWFXWnZjbTA2SUdSMWNHeHBZMkYwWlNCMllYSnBZV0pzWlNCdVlXMWxJQ1I3ZG1GeWFXRmliR1ZPWVcxbGZXQXBPMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEdsbUlDaDBlWEJsSUQwOVBTQW5ZbTl2YkNjZ0ppWWdiM0IwYVc5dWN6OHVjSEpsWTJsemFXOXVJQ0U5SUc1MWJHd3BJSHRjYmx4MFhIUmNkR052Ym5OdmJHVXVkMkZ5YmloZ1lXUmtWVzVwWm05eWJUb2djbVZ0YjNabElIUm9aU0J6Y0dWamFXWnBZMkYwYVc5dUlHOW1JSEJ5WldOcGMybHZiaUJtYjNJZ1ltOXZiQ0IwZVhCbElIUnZJR0YyYjJsa0lHTnZiWEJwYkdGMGFXOXVJR1Z5Y205eVlDazdYRzVjZEZ4MFhIUnZjSFJwYjI1ekxuQnlaV05wYzJsdmJpQTlJSFZ1WkdWbWFXNWxaRHRjYmx4MFhIUjlYRzVjYmx4MFhIUjBhR2x6TGw5ZmRXNXBabTl5YlhNdWNIVnphQ2g3WEc1Y2RGeDBYSFIyWVhKcFlXSnNaVTVoYldVc1hHNWNkRngwWEhSMGVYQmxMRnh1WEhSY2RGeDBjSEpsWTJsemFXOXVPaUJ2Y0hScGIyNXpQeTV3Y21WamFYTnBiMjRzWEc1Y2RGeDBmU2s3WEc1Y2RIMWNibHh1WEhRdkx5QnVaV1ZrSUhSdklHUmxabWx1WlNCemRISjFZM1FnWW5rZ2RHaGxJR0ZrWkZOMGNuVmpkRVJsWm1sdWFYUnBiMjRnYldWMGFHOWtYRzVjZEhCMVlteHBZeUJoWkdSVmJtbG1iM0p0VTNSeWRXTjBSR1ZqYkdGeVlYUnBiMjRvWEc1Y2RGeDBjM1J5ZFdOMFRtRnRaVG9nYzNSeWFXNW5MRnh1WEhSY2RIWmhjbWxoWW14bFRtRnRaVG9nYzNSeWFXNW5YRzVjZENrZ2UxeHVYSFJjZEdOdmJuTjBJR2x6UkhWd2JHbGpZWFJsSUQxY2JseDBYSFJjZEhSb2FYTXVYMTkxYm1sbWIzSnRVM1J5ZFdOMGN5NXpiMjFsS0hWdWFXWnZjbTFUZEhKMVkzUWdQVDRnZFc1cFptOXliVk4wY25WamRDNTJZWEpwWVdKc1pVNWhiV1VnUFQwOUlIWmhjbWxoWW14bFRtRnRaU2s3WEc1Y2RGeDBhV1lnS0dselJIVndiR2xqWVhSbEtTQjdYRzVjZEZ4MFhIUmpiMjV6YjJ4bExtVnljbTl5S0dCaFpHUlZibWxtYjNKdFUzUnlkV04wUkdWamJHRnlZWFJwYjI0NklHUjFjR3hwWTJGMFpTQjJZWEpwWVdKc1pTQnVZVzFsSUNSN2RtRnlhV0ZpYkdWT1lXMWxmV0FwTzF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RIUm9hWE11WDE5MWJtbG1iM0p0VTNSeWRXTjBjeTV3ZFhOb0tIdGNibHgwWEhSY2RIWmhjbWxoWW14bFRtRnRaU3hjYmx4MFhIUmNkSE4wY25WamRFNWhiV1VzWEc1Y2RGeDBmU2s3WEc1Y2RIMWNibHh1WEhRdkx5Qm1iM0lnWlhNelhHNWNkSEIxWW14cFl5QmhaR1JWYm1sbWIzSnRRblZtWm1WeVQySnFaV04wUkdWamJHRnlZWFJwYjI0b1hHNWNkRngwWW14dlkydE9ZVzFsT2lCemRISnBibWNzWEc1Y2RGeDBkbUZ5YVdGaWJHVlBZbXBsWTNSek9pQlRhR0ZrWlhKVlFrOVdZWEpwWVdKc1pVOWlhbVZqZEZ0ZExGeHVYSFJjZEc5d2RHbHZibk0vT2lCN1hHNWNkRngwWEhScGJuTjBZVzVqWlU1aGJXVS9PaUJUYUdGa1pYSlFjbVZqYVhOcGIyNVVlWEJsWEc1Y2RGeDBmVnh1WEhRcElIdGNibHgwWEhSamIyNXpkQ0JwYzBSMWNHeHBZMkYwWlVKc2IyTnJUbUZ0WlNBOVhHNWNkRngwWEhSMGFHbHpMbDlmZFc1cFptOXliVUoxWm1abGNrOWlhbVZqZEhNdWMyOXRaU2gxWW04Z1BUNGdkV0p2TG1Kc2IyTnJUbUZ0WlNBOVBUMGdZbXh2WTJ0T1lXMWxLVHRjYmx4MFhIUnBaaUFvYVhORWRYQnNhV05oZEdWQ2JHOWphMDVoYldVcElIdGNibHgwWEhSY2RHTnZibk52YkdVdVpYSnliM0lvWUdGa1pGVnVhV1p2Y20xQ2RXWm1aWEpQWW1wbFkzUkVaV05zWVhKaGRHbHZiam9nWkhWd2JHbGpZWFJsSUdKc2IyTnJJRzVoYldVZ0pIdGliRzlqYTA1aGJXVjlZQ2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MGZWeHVYRzVjZEZ4MFptOXlJQ2hqYjI1emRDQjFZbThnYjJZZ2RHaHBjeTVmWDNWdWFXWnZjbTFDZFdabVpYSlBZbXBsWTNSektTQjdYRzVjZEZ4MFhIUm1iM0lnS0dOdmJuTjBJSFZpYjFaaGNtbGhZbXhsVDJKcVpXTjBJRzltSUhWaWJ5NTJZWEpwWVdKc1pVOWlhbVZqZEhNcElIdGNibHgwWEhSY2RGeDBabTl5SUNoamIyNXpkQ0IyWVhKcFlXSnNaVTlpYW1WamRDQnZaaUIyWVhKcFlXSnNaVTlpYW1WamRITXBJSHRjYmx4MFhIUmNkRngwWEhScFppQW9kV0p2Vm1GeWFXRmliR1ZQWW1wbFkzUXVkbUZ5YVdGaWJHVk9ZVzFsSUQwOVBTQjJZWEpwWVdKc1pVOWlhbVZqZEM1MllYSnBZV0pzWlU1aGJXVXBJSHRjYmx4MFhIUmNkRngwWEhSY2RHTnZibk52YkdVdVpYSnliM0lvWUdGa1pGVnVhV1p2Y20xQ2RXWm1aWEpQWW1wbFkzUkVaV05zWVhKaGRHbHZiam9nWkhWd2JHbGpZWFJsSUhaaGNtbGhZbXhsSUc1aGJXVWdKSHQyWVhKcFlXSnNaVTlpYW1WamRDNTJZWEpwWVdKc1pVNWhiV1Y5WUNrN1hHNWNkRngwWEhSY2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhHNWNkRngwZEdocGN5NWZYM1Z1YVdadmNtMUNkV1ptWlhKUFltcGxZM1J6TG5CMWMyZ29lMXh1WEhSY2RGeDBZbXh2WTJ0T1lXMWxMRnh1WEhSY2RGeDBkbUZ5YVdGaWJHVlBZbXBsWTNSekxGeHVYSFJjZEZ4MGFXNXpkR0Z1WTJWT1lXMWxPaUJ2Y0hScGIyNXpQeTVwYm5OMFlXNWpaVTVoYldVc1hHNWNkRngwZlNrN1hHNWNkSDFjYmx4dVhIUXZMeUIwYUdVZ2NtVjBkWEp1SUhaaGJIVmxJRWxrSUdseklHRWdkbUZzZFdVZ2RHOGdaR1ZzWlhSbElIUm9aU0JtZFc1amRHbHZibHh1WEhRdkx5QjBhR1VnYldGcGJpQm1kVzVqZEdsdmJpQnBjeUJrWldacGJtVmtJQ2gxY0dSaGRHVmtLU0JpZVNCMGFHVWdkWEJrWVhSbFRXRnBia1oxYm1OMGFXOXVJRzFsZEdodlpGeHVYSFJ3ZFdKc2FXTWdZV1JrUm5WdVkzUnBiMjVFWldacGJtbDBhVzl1S0Z4dVhIUmNkR1oxYm1OMGFXOXVRMjlrWlRvZ2MzUnlhVzVuTEZ4dVhIUmNkRzl3ZEdsdmJuTS9PaUI3WEc1Y2RGeDBYSFJrWlhCbGJtUmxibU41VEdWMlpXdy9PaUJ1ZFcxaVpYSmNibHgwWEhSOVhHNWNkQ2tnZTF4dVhIUmNkR052Ym5OMElHWjFibU4wYVc5dVNXUWdQU0IwYUdsekxsOWZablZ1WTNScGIyNUpaRU52ZFc1MEt5czdYRzVjYmx4MFhIUmpiMjV6ZENCa1pYQmxibVJsYm1ONVRHVjJaV3dnUFNCdmNIUnBiMjV6UHk1a1pYQmxibVJsYm1ONVRHVjJaV3dnUHo4Z01EdGNibHgwWEhSMGFHbHpMbDlmWm5WdVkzUnBiMjV6VzJSbGNHVnVaR1Z1WTNsTVpYWmxiRjBnUFNCMGFHbHpMbDlmWm5WdVkzUnBiMjV6VzJSbGNHVnVaR1Z1WTNsTVpYWmxiRjBnUHo4Z1cxMDdYRzVjZEZ4MGRHaHBjeTVmWDJaMWJtTjBhVzl1YzF0a1pYQmxibVJsYm1ONVRHVjJaV3hkTG5CMWMyZ29lMXh1WEhSY2RGeDBablZ1WTNScGIyNURiMlJsTEZ4dVhIUmNkRngwWm5WdVkzUnBiMjVKWkZ4dVhIUmNkSDBwTzF4dVhHNWNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVTV1E3WEc1Y2RIMWNibHh1WEhRdkx5QTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JseDBMeThnZFhCa1lYUmxJSEJoY21GdFpYUmxjbk1nWm5WdVkzUnBiMjV6WEc1Y2RDOHZJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVYRzVjZEhCMVlteHBZeUIxY0dSaGRHVkhiRzlpWVd4UWNtVmphWE5wYjI0b2NISmxZMmx6YVc5dU9pQlRhR0ZrWlhKUWNtVmphWE5wYjI1UFltcGxZM1FwSUh0Y2JseDBYSFJQWW1wbFkzUXVZWE56YVdkdUtIUm9hWE11WDE5bmJHOWlZV3hRY21WamFYTnBiMjRzSUhCeVpXTnBjMmx2YmlrN1hHNWNkSDFjYmx4dVhIUndkV0pzYVdNZ2RYQmtZWFJsVTNSeWRXTjBSR1ZtYVc1cGRHbHZiaWh6ZEhKMVkzUk9ZVzFsT2lCemRISnBibWNzSUcxbGJXSmxjazlpYW1WamRITTZJRk5vWVdSbGNsTjBjblZqZEUxbGJXSmxjazlpYW1WamRGdGRLU0I3WEc1Y2RGeDBZMjl1YzNRZ2JXRjBZMmhsWkVsdVpHVjRJRDFjYmx4MFhIUmNkSFJvYVhNdVgxOXpkSEoxWTNSRVpXWnBibWwwYVc5dWN5NW1hVzVrU1c1a1pYZ29jM1J5ZFdOMFJHVm1hVzVwZEdsdmJpQTlQaUJ6ZEhKMVkzUkVaV1pwYm1sMGFXOXVMbk4wY25WamRFNWhiV1VnUFQwOUlITjBjblZqZEU1aGJXVXBPMXh1WEhSY2RHbG1JQ2h0WVhSamFHVmtTVzVrWlhnZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG1WeWNtOXlLR0IxY0dSaGRHVlRkSEoxWTNSRVpXWnBibWwwYVc5dU9pQjBhR1VnYzNSeWRXTjBJSFI1Y0dVZ2JtRnRaU0FrZTNOMGNuVmpkRTVoYldWOUlHbHpJRzV2ZENCbGVHbHpkR0FwTzF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RIUm9hWE11WDE5emRISjFZM1JFWldacGJtbDBhVzl1YzF0dFlYUmphR1ZrU1c1a1pYaGRMbTFsYldKbGNrOWlhbVZqZEhNZ1BTQnRaVzFpWlhKUFltcGxZM1J6TzF4dVhIUjlYRzVjYmx4MGNIVmliR2xqSUhWd1pHRjBaVWRzYjJKaGJFTnZibk4wWVc1MFZtRnNkV1VvZG1GeWFXRmliR1ZPWVcxbE9pQnpkSEpwYm1jc0lIWmhiSFZsY3pvZ2JuVnRZbVZ5VzEwcElIdGNibHgwWEhSamIyNXpkQ0J0WVhSamFHVmtTVzVrWlhnZ1BWeHVYSFJjZEZ4MGRHaHBjeTVmWDJkc2IySmhiRU52Ym5OMFlXNTBWbUZzZFdWekxtWnBibVJKYm1SbGVDaG5iRzlpWVd4RGIyNXpkR0Z1ZEZaaGJIVmxJRDArSUdkc2IySmhiRU52Ym5OMFlXNTBWbUZzZFdVdWRtRnlhV0ZpYkdWT1lXMWxJRDA5UFNCMllYSnBZV0pzWlU1aGJXVXBPMXh1WEhSY2RHbG1JQ2h0WVhSamFHVmtTVzVrWlhnZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG5kaGNtNG9ZSFZ3WkdGMFpVZHNiMkpoYkVOdmJuTjBZVzUwVm1Gc2RXVTZJSFJvWlNCMllYSnBZV0pzWlNCdVlXMWxJQ1I3ZG1GeWFXRmliR1ZPWVcxbGZTQnBjeUJ1YjNRZ1pYaHBjM1JnS1R0Y2JseDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUjlYRzVjYmx4MFhIUmpiMjV6ZENCMGVYQmxJRDBnZEdocGN5NWZYMmRzYjJKaGJFTnZibk4wWVc1MFZtRnNkV1Z6VzIxaGRHTm9aV1JKYm1SbGVGMHVkSGx3WlR0Y2JseHVYSFJjZEdOdmJuTjBJR2x6Vm1Gc2FXUkRiMjF3YjI1bGJuUk9kVzFpWlhJZ1BTQlZkR2xzYVhSNUxsOXBjMVpoYkdsa1EyOXRjRzl1Wlc1MFEyOTFiblFvZEhsd1pTd2dkbUZzZFdWektUdGNibHgwWEhScFppQW9JV2x6Vm1Gc2FXUkRiMjF3YjI1bGJuUk9kVzFpWlhJcElIdGNibHgwWEhSY2RHTnZibk52YkdVdVpYSnliM0lvSjNWd1pHRjBaVWRzYjJKaGJFTnZibk4wWVc1MFZtRnNkV1U2SUhSb1pTQmpiMjF3YjI1bGJuUWdZMjkxYm5RZ2FYTWdhVzUyWVd4cFpDY3BPMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEdOdmJuTjBJR2x6U1c1MFZIbHdaU0E5SUZWMGFXeHBkSGt1WDJselNXNTBWSGx3WlNoMGVYQmxLVHRjYmx4MFhIUnBaaUFvYVhOSmJuUlVlWEJsS1NCN1hHNWNkRngwWEhSamIyNXpkQ0JsZUdsemRFNXZia2x1ZEdWblpYSldZV3gxWlNBOUlGTm9ZV1JsY21sMGVVOWlhbVZqZEVOeVpXRjBiM0l1WDE5bGVHbHpkRTV2YmtsdWRHVm5aWEpXWVd4MVpTaDJZV3gxWlhNcE8xeHVYSFJjZEZ4MGFXWWdLR1Y0YVhOMFRtOXVTVzUwWldkbGNsWmhiSFZsS1NCN1hHNWNkRngwWEhSY2RHTnZibk52YkdVdWQyRnliaWhnZFhCa1lYUmxSMnh2WW1Gc1EyOXVjM1JoYm5SV1lXeDFaVG9nZEdobElDUjdkbUZ5YVdGaWJHVk9ZVzFsZlNCb1lYTWdZU0J1YjI0dGFXNTBaV2RsY2lCMllXeDFaUzVnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2JseDBYSFIwYUdsekxsOWZaMnh2WW1Gc1EyOXVjM1JoYm5SV1lXeDFaWE5iYldGMFkyaGxaRWx1WkdWNFhTNTJZV3gxWlhNZ1BTQjJZV3gxWlhNN1hHNWNkSDFjYmx4dVhIUndkV0pzYVdNZ2RYQmtZWFJsUjJ4dlltRnNRMjl1YzNSaGJuUlRkSEoxWTNSV1lXeDFaU2gyWVhKcFlXSnNaVTVoYldVNklITjBjbWx1Wnl3Z2RtRnNkV1Z6T2lCN1cydGxlVlpoY21saFlteGxUbUZ0WlRvZ2MzUnlhVzVuWFRvZ2JuVnRZbVZ5VzExOUtTQjdYRzVjZEZ4MFkyOXVjM1FnYldGMFkyaGxaRWx1WkdWNElEMWNibHgwWEhSY2RIUm9hWE11WDE5bmJHOWlZV3hEYjI1emRHRnVkRk4wY25WamRGWmhiSFZsY3k1bWFXNWtTVzVrWlhnb2MzUnlkV04wVm1Gc2RXVWdQVDRnYzNSeWRXTjBWbUZzZFdVdWRtRnlhV0ZpYkdWT1lXMWxJRDA5UFNCMllYSnBZV0pzWlU1aGJXVXBPMXh1WEhSY2RHbG1JQ2h0WVhSamFHVmtTVzVrWlhnZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG1WeWNtOXlLR0IxY0dSaGRHVkhiRzlpWVd4RGIyNXpkR0Z1ZEZOMGNuVmpkRlpoYkhWbE9pQWdkR2hsSUhaaGNtbGhZbXhsSUc1aGJXVWdKSHQyWVhKcFlXSnNaVTVoYldWOUlHbHpJRzV2ZENCbGVHbHpkR0FwTzF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RIUm9hWE11WDE5bmJHOWlZV3hEYjI1emRHRnVkRk4wY25WamRGWmhiSFZsYzF0dFlYUmphR1ZrU1c1a1pYaGRMblpoYkhWbGN5QTlJSFpoYkhWbGN6dGNibHgwZlZ4dVhHNWNkSEIxWW14cFl5QjFjR1JoZEdWTllXbHVSblZ1WTNScGIyNG9iV0ZwYmtaMWJtTjBhVzl1UTI5a1pVbHVibVZ5T2lCemRISnBibWNwSUh0Y2JseDBYSFIwYUdsekxsOWZiV0ZwYmtaMWJtTjBhVzl1UTI5a1pTQTlJRzFoYVc1R2RXNWpkR2x2YmtOdlpHVkpibTVsY2p0Y2JseDBmVnh1WEc1Y2RDOHZJSE53WldOcFpua2dkR2hsSUc1aGJXVWdiMllnZEdobElHOTFkSEIxZENCamIyeHZjaUIyWVhKcFlXSnNaU0JtY205dElIUm9aU0J0WVdsdUlHWjFibU4wYVc5dUlHbHVJSFJvWlNCbWNtRm5iV1Z1ZENCemFHRmtaWEl1WEc1Y2RDOHZJSFZ6WlhKeklHaGhkbVVnZEc4Z1lYTnphV2R1SUhSb1pTQnlaWE4xYkhRZ2IyWWdabkpoWjIxbGJuUWdjMmhoWkdWeUlHTmhiR04xYkdGMGFXOXVJSFJ2SUhSb2FYTWdkbUZ5YVdGaWJHVXVYRzVjZEhCMVlteHBZeUIxY0dSaGRHVlBkWFJ3ZFhSRGIyeHZjbFpoY21saFlteGxUbUZ0WlNodmRYUndkWFJEYjJ4dmNsWmhjbWxoWW14bFRtRnRaVG9nYzNSeWFXNW5LU0I3WEc1Y2RGeDBhV1lnS0hSb2FYTXVYMTl6YUdGa1pYSlRkR0ZuWlNBaFBUMGdKMlp5WVdkdFpXNTBKeWtnZTF4dVhIUmNkRngwWTI5dWMyOXNaUzVsY25KdmNpZ25kWEJrWVhSbFQzVjBjSFYwUTI5c2IzSldZWEpwWVdKc1pVNWhiV1U2SUhSb2FYTWdiV1YwYUc5a0lHbHpJR1p2Y2lCbWNtRm5iV1Z1ZENCemFHRmtaWElnYjI1c2VTY3BPMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEdsbUlDaHZkWFJ3ZFhSRGIyeHZjbFpoY21saFlteGxUbUZ0WlM1c1pXNW5kR2dnUFQwOUlEQXBJSHRjYmx4MFhIUmNkR052Ym5OdmJHVXVaWEp5YjNJb0ozVndaR0YwWlU5MWRIQjFkRU52Ykc5eVZtRnlhV0ZpYkdWT1lXMWxPaUJwYm5aaGJHbGtJRzkxZEVOdmJHOXlWbUZ5YVdGaWJHVk9ZVzFsSnlrN1hHNWNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBkR2hwY3k1ZlgyOTFkSEIxZEVOdmJHOXlWbUZ5YVdGaWJHVk9ZVzFsSUQwZ2IzVjBjSFYwUTI5c2IzSldZWEpwWVdKc1pVNWhiV1U3WEc1Y2RIMWNibHh1WEhRdkx5QTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JseDBMeThnY21WdGIzWmxJSEJoY21GdFpYUmxjbk1nWm5WdVkzUnBiMjV6WEc1Y2RDOHZJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVYRzVjZEhCMVlteHBZeUJ5WlcxdmRtVkVaV1pwYm1WRWFYSmxZM1JwZG1Vb1pHVm1hVzVsUkdseVpXTjBhWFpsVG1GdFpUb2djM1J5YVc1bktTQjdYRzVjZEZ4MFkyOXVjM1FnYldGMFkyaGxaRWx1WkdWNElEMGdkR2hwY3k1ZlgyUmxabWx1WlVScGNtVmpkR2wyWlU1aGJXVnpMbWx1WkdWNFQyWW9aR1ZtYVc1bFJHbHlaV04wYVhabFRtRnRaU2s3WEc1Y2JseDBYSFJwWmlBb2JXRjBZMmhsWkVsdVpHVjRJRDA5UFNBdE1Ta2dlMXh1WEhSY2RGeDBZMjl1YzI5c1pTNTNZWEp1S0NkeVpXMXZkbVZrUkdWbWFXNWxSR2x5WldOMGFYWmxPaUIwYUdseklHUmxabWx1WlNCa2FYSmxZM1JwZG1VZ2FYTWdibTkwSUdWNGFYTjBKeWs3WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGRHaHBjeTVmWDJSbFptbHVaVVJwY21WamRHbDJaVTVoYldWekxuTndiR2xqWlNodFlYUmphR1ZrU1c1a1pYZ3NJREVwTzF4dVhIUjlYRzVjYmx4MGNIVmliR2xqSUhKbGJXOTJaVVY0ZEdWdWMybHZiaWhsZUhSbGJuTnBiMjVPWVcxbE9pQnpkSEpwYm1jcElIdGNibHgwWEhSamIyNXpkQ0J0WVhSamFHVmtTVzVrWlhnZ1BWeHVYSFJjZEZ4MGRHaHBjeTVmWDJWNGRHVnVjMmx2Ym5NdVptbHVaRWx1WkdWNEtHVjRkR1Z1YzJsdmJpQTlQaUJsZUhSbGJuTnBiMjR1WlhoMFpXNXphVzl1VG1GdFpTQTlQVDBnWlhoMFpXNXphVzl1VG1GdFpTazdYRzVjYmx4MFhIUnBaaUFvYldGMFkyaGxaRWx1WkdWNElEMDlQU0F0TVNrZ2UxeHVYSFJjZEZ4MFkyOXVjMjlzWlM1M1lYSnVLQ2R5WlcxdmRtVkZlSFJsYm5OcGIyNDZJSFJvYVhNZ1pYaDBaVzV6YVc5dUlHbHpJRzV2ZENCbGVHbHpkQ2NwTzF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RIUm9hWE11WDE5bGVIUmxibk5wYjI1ekxuTndiR2xqWlNodFlYUmphR1ZrU1c1a1pYZ3NJREVwTzF4dVhIUjlYRzVjYmx4MGNIVmliR2xqSUhKbGJXOTJaVk4wY25WamRFUmxabWx1YVhScGIyNG9jM1J5ZFdOMFRtRnRaVG9nYzNSeWFXNW5LU0I3WEc1Y2RGeDBZMjl1YzNRZ2JXRjBZMmhsWkVsdVpHVjRJRDFjYmx4MFhIUmNkSFJvYVhNdVgxOXpkSEoxWTNSRVpXWnBibWwwYVc5dWN5NW1hVzVrU1c1a1pYZ29jM1J5ZFdOMFJHVm1hVzVwZEdsdmJpQTlQaUJ6ZEhKMVkzUkVaV1pwYm1sMGFXOXVMbk4wY25WamRFNWhiV1VnUFQwOUlITjBjblZqZEU1aGJXVXBPMXh1WEhSY2RHbG1JQ2h0WVhSamFHVmtTVzVrWlhnZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG1WeWNtOXlLR0J5WlcxdmRtVlRkSEoxWTNSRVpXWnBibWwwYVc5dU9pQjBhR1VnYzNSeWRXTjBJSFI1Y0dVZ2JtRnRaU0FrZTNOMGNuVmpkRTVoYldWOUlHbHpJRzV2ZENCbGVHbHpkR0FwTzF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RIUm9hWE11WDE5emRISjFZM1JFWldacGJtbDBhVzl1Y3k1emNHeHBZMlVvYldGMFkyaGxaRWx1WkdWNExDQXhLVHRjYmx4MGZWeHVYRzVjZEhCMVlteHBZeUJ5WlcxdmRtVkhiRzlpWVd4RGIyNXpkR0Z1ZEZaaGJIVmxLSFpoY21saFlteGxUbUZ0WlRvZ2MzUnlhVzVuS1NCN1hHNWNkRngwWTI5dWMzUWdiV0YwWTJobFpFbHVaR1Y0SUQxY2JseDBYSFJjZEhSb2FYTXVYMTluYkc5aVlXeERiMjV6ZEdGdWRGWmhiSFZsY3k1bWFXNWtTVzVrWlhnb1oyeHZZbUZzUTI5dWMzUmhiblJXWVd4MVpTQTlQaUJuYkc5aVlXeERiMjV6ZEdGdWRGWmhiSFZsTG5aaGNtbGhZbXhsVG1GdFpTQTlQVDBnZG1GeWFXRmliR1ZPWVcxbEtUdGNibHgwWEhScFppQW9iV0YwWTJobFpFbHVaR1Y0SUQwOVBTQXRNU2tnZTF4dVhIUmNkRngwWTI5dWMyOXNaUzUzWVhKdUtHQnlaVzF2ZG1WSGJHOWlZV3hEYjI1emRHRnVkRlpoYkhWbE9pQjBhR1VnZG1GeWFXRmliR1VnYm1GdFpTQWtlM1poY21saFlteGxUbUZ0WlgwZ2FYTWdibTkwSUdWNGFYTjBZQ2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGRHaHBjeTVmWDJkc2IySmhiRU52Ym5OMFlXNTBWbUZzZFdWekxuTndiR2xqWlNodFlYUmphR1ZrU1c1a1pYZ3NJREVwTzF4dVhIUjlYRzVjYmx4MGNIVmliR2xqSUhKbGJXOTJaVWRzYjJKaGJFTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVW9kbUZ5YVdGaWJHVk9ZVzFsT2lCemRISnBibWNwSUh0Y2JseDBYSFJqYjI1emRDQnRZWFJqYUdWa1NXNWtaWGdnUFZ4dVhIUmNkRngwZEdocGN5NWZYMmRzYjJKaGJFTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVnpMbVpwYm1SSmJtUmxlQ2h6ZEhKMVkzUldZV3gxWlNBOVBpQnpkSEoxWTNSV1lXeDFaUzUyWVhKcFlXSnNaVTVoYldVZ1BUMDlJSFpoY21saFlteGxUbUZ0WlNrN1hHNWNkRngwYVdZZ0tHMWhkR05vWldSSmJtUmxlQ0E5UFQwZ0xURXBJSHRjYmx4MFhIUmNkR052Ym5OdmJHVXVaWEp5YjNJb1lIVndaR0YwWlVkc2IySmhiRU52Ym5OMFlXNTBVM1J5ZFdOMFZtRnNkV1U2SUNCMGFHVWdkbUZ5YVdGaWJHVWdibUZ0WlNBa2UzWmhjbWxoWW14bFRtRnRaWDBnYVhNZ2JtOTBJR1Y0YVhOMFlDazdYRzVjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwZlZ4dVhHNWNkRngwZEdocGN5NWZYMmRzYjJKaGJFTnZibk4wWVc1MFUzUnlkV04wVm1Gc2RXVnpMbk53YkdsalpTaHRZWFJqYUdWa1NXNWtaWGdzSURFcE8xeHVYSFI5WEc1Y2JseDBjSFZpYkdsaklISmxiVzkyWlVGMGRISnBZblYwWlVSbFkyeGhjbUYwYVc5dUtIWmhjbWxoWW14bFRtRnRaVG9nYzNSeWFXNW5LU0I3WEc1Y2RGeDBZMjl1YzNRZ2JXRjBZMmhsWkVsdVpHVjRJRDFjYmx4MFhIUmNkSFJvYVhNdVgxOWhkSFJ5YVdKMWRHVnpMbVpwYm1SSmJtUmxlQ2hoZEhSeWFXSjFkR1VnUFQ0Z1lYUjBjbWxpZFhSbExuWmhjbWxoWW14bFRtRnRaU0E5UFQwZ2RtRnlhV0ZpYkdWT1lXMWxLVHRjYmx4MFhIUnBaaUFvYldGMFkyaGxaRWx1WkdWNElEMDlQU0F0TVNrZ2UxeHVYSFJjZEZ4MFkyOXVjMjlzWlM1M1lYSnVLR0J5WlcxdmRtVkJkSFJ5YVdKMWRHVTZJSFJvWlNCMllYSnBZV0pzWlNCdVlXMWxJQ1I3ZG1GeWFXRmliR1ZPWVcxbGZTQnBjeUJ1YjNRZ1pYaHBjM1JnS1R0Y2JseDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUjlYRzVjYmx4MFhIUjBhR2x6TGw5ZllYUjBjbWxpZFhSbGN5NXpjR3hwWTJVb2JXRjBZMmhsWkVsdVpHVjRMQ0F4S1R0Y2JseDBmVnh1WEc1Y2RIQjFZbXhwWXlCeVpXMXZkbVZXWVhKNWFXNW5SR1ZqYkdGeVlYUnBiMjRvZG1GeWFXRmliR1ZPWVcxbE9pQnpkSEpwYm1jcElIdGNibHgwWEhSamIyNXpkQ0J0WVhSamFHVmtTVzVrWlhnZ1BWeHVYSFJjZEZ4MGRHaHBjeTVmWDNaaGNubHBibWR6TG1acGJtUkpibVJsZUNoMllYSjVhVzVuSUQwK0lIWmhjbmxwYm1jdWRtRnlhV0ZpYkdWT1lXMWxJRDA5UFNCMllYSnBZV0pzWlU1aGJXVXBPMXh1WEhSY2RHbG1JQ2h0WVhSamFHVmtTVzVrWlhnZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG5kaGNtNG9ZSEpsYlc5MlpWWmhjbmxwYm1jNklIUm9aU0IyWVhKcFlXSnNaU0J1WVcxbElDUjdkbUZ5YVdGaWJHVk9ZVzFsZlNCcGN5QnViM1FnWlhocGMzUmdLVHRjYmx4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSOVhHNWNibHgwWEhSMGFHbHpMbDlmZG1GeWVXbHVaM011YzNCc2FXTmxLRzFoZEdOb1pXUkpibVJsZUN3Z01TazdYRzVjZEgxY2JseHVYSFJ3ZFdKc2FXTWdjbVZ0YjNabFZXNXBabTl5YlVSbFkyeGhjbUYwYVc5dUtIWmhjbWxoWW14bFRtRnRaVG9nYzNSeWFXNW5LU0I3WEc1Y2RGeDBZMjl1YzNRZ2JXRjBZMmhsWkVsdVpHVjRJRDFjYmx4MFhIUmNkSFJvYVhNdVgxOTFibWxtYjNKdGN5NW1hVzVrU1c1a1pYZ29kVzVwWm05eWJTQTlQaUIxYm1sbWIzSnRMblpoY21saFlteGxUbUZ0WlNBOVBUMGdkbUZ5YVdGaWJHVk9ZVzFsS1R0Y2JseDBYSFJwWmlBb2JXRjBZMmhsWkVsdVpHVjRJRDA5UFNBdE1Ta2dlMXh1WEhSY2RGeDBZMjl1YzI5c1pTNTNZWEp1S0dCeVpXMXZkbVZWYm1sbWIzSnRPaUIwYUdVZ2RtRnlhV0ZpYkdVZ2JtRnRaU0FrZTNaaGNtbGhZbXhsVG1GdFpYMGdhWE1nYm05MElHVjRhWE4wWUNrN1hHNWNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBkR2hwY3k1ZlgzVnVhV1p2Y20xekxuTndiR2xqWlNodFlYUmphR1ZrU1c1a1pYZ3NJREVwTzF4dVhIUjlYRzVjYmx4MGNIVmliR2xqSUhKbGJXOTJaVlZ1YVdadmNtMVRkSEoxWTNSRVpXTnNZWEpoZEdsdmJpaDJZWEpwWVdKc1pVNWhiV1U2SUhOMGNtbHVaeWtnZTF4dVhIUmNkR052Ym5OMElHMWhkR05vWldSSmJtUmxlQ0E5WEc1Y2RGeDBYSFIwYUdsekxsOWZkVzVwWm05eWJWTjBjblZqZEhNdVptbHVaRWx1WkdWNEtIVnVhV1p2Y20xVGRISjFZM1FnUFQ0Z2RXNXBabTl5YlZOMGNuVmpkQzUyWVhKcFlXSnNaVTVoYldVZ1BUMDlJSFpoY21saFlteGxUbUZ0WlNrN1hHNWNkRngwYVdZZ0tHMWhkR05vWldSSmJtUmxlQ0E5UFQwZ0xURXBJSHRjYmx4MFhIUmNkR052Ym5OdmJHVXVkMkZ5YmloZ2NtVnRiM1psVlc1cFptOXliVk4wY25WamRFUmxZMnhoY21GMGFXOXVPaUIwYUdVZ2RtRnlhV0ZpYkdVZ2JtRnRaU0FrZTNaaGNtbGhZbXhsVG1GdFpYMGdhWE1nYm05MElHVjRhWE4wWUNrN1hHNWNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBkR2hwY3k1ZlgzVnVhV1p2Y20xVGRISjFZM1J6TG5Od2JHbGpaU2h0WVhSamFHVmtTVzVrWlhnc0lERXBPMXh1WEhSOVhHNWNibHgwY0hWaWJHbGpJSEpsYlc5MlpWVnVhV1p2Y20xQ2RXWm1aWEpQWW1wbFkzUkVaV05zWVhKaGRHbHZiaWhpYkc5amEwNWhiV1U2SUhOMGNtbHVaeWtnZTF4dVhIUmNkR052Ym5OMElHMWhkR05vWldSSmJtUmxlQ0E5WEc1Y2RGeDBYSFIwYUdsekxsOWZkVzVwWm05eWJVSjFabVpsY2s5aWFtVmpkSE11Wm1sdVpFbHVaR1Y0S0hWaWJ5QTlQaUIxWW04dVlteHZZMnRPWVcxbElEMDlQU0JpYkc5amEwNWhiV1VwTzF4dVhIUmNkR2xtSUNodFlYUmphR1ZrU1c1a1pYZ2dQVDA5SUMweEtTQjdYRzVjZEZ4MFhIUmpiMjV6YjJ4bExuZGhjbTRvWUhKbGJXOTJaVlZ1YVdadmNtMVRkSEoxWTNSRVpXTnNZWEpoZEdsdmJqb2dkR2hsSUhaaGNtbGhZbXhsSUc1aGJXVWdKSHRpYkc5amEwNWhiV1Y5SUdseklHNXZkQ0JsZUdsemRHQXBPMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEhSb2FYTXVYMTkxYm1sbWIzSnRRblZtWm1WeVQySnFaV04wY3k1emNHeHBZMlVvYldGMFkyaGxaRWx1WkdWNExDQXhLVHRjYmx4MGZWeHVYRzVjZEhCMVlteHBZeUJ5WlcxdmRtVkdkVzVqZEdsdmJrUmxabWx1YVhScGIyNG9ablZ1WTNScGIyNUpaRG9nYm5WdFltVnlLU0I3WEc1Y2RGeDBkR2hwY3k1ZlgyWnBiR3hGYlhCMGVVWjFibU4wYVc5dWN5Z3BPMXh1WEc1Y2RGeDBMeThnYVdRZ2FYTWdkRzl2SUhOdFlXeHNJRzl5SUhSdmJ5QmlhV2RjYmx4MFhIUnBaaUFvWm5WdVkzUnBiMjVKWkNBOElEQWdmSHdnWm5WdVkzUnBiMjVKWkNBK1BTQjBhR2x6TGw5ZlpuVnVZM1JwYjI1SlpFTnZkVzUwS1NCN1hHNWNkRngwWEhSamIyNXpiMnhsTG5kaGNtNG9KM0psYlc5MlpVWjFibU4wYVc5dVJHVm1hVzVwZEdsdmJqb2dhVzUyWVd4cFpDQm1kVzVqZEdsdmJpQnBaQ2NwWEc1Y2RGeDBmVnh1WEc1Y2RGeDBabTl5SUNoamIyNXpkQ0JtZFc1amRHbHZiazlpYW1WamRITWdiMllnZEdocGN5NWZYMloxYm1OMGFXOXVjeWtnZTF4dVhIUmNkRngwWTI5dWMzUWdiV0YwWTJobFpFbHVaR1Y0SUQxY2JseDBYSFJjZEZ4MFpuVnVZM1JwYjI1UFltcGxZM1J6TG1acGJtUkpibVJsZUNobWRXNWpkR2x2Yms5aWFtVmpkQ0E5UGlCbWRXNWpkR2x2Yms5aWFtVmpkQzVtZFc1amRHbHZia2xrSUQwOVBTQm1kVzVqZEdsdmJrbGtLVHRjYmx4MFhIUmNkR2xtSUNodFlYUmphR1ZrU1c1a1pYZ2dJVDA5SUMweEtTQjdYRzVjZEZ4MFhIUmNkR1oxYm1OMGFXOXVUMkpxWldOMGN5NXpjR3hwWTJVb2JXRjBZMmhsWkVsdVpHVjRMQ0F4S1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4dVhIUmNkR052Ym5OdmJHVXVkMkZ5YmloZ2NtVnRiM1psUm5WdVkzUnBiMjVFWldacGJtbDBhVzl1T2lCdWIzUWdabTkxYm1RZ2RHaGxJR1oxYm1OMGFXOXVJRzltSUdaMWJtTjBhVzl1U1dRZ0pIdG1kVzVqZEdsdmJrbGtmV0FwTzF4dVhIUjlYRzVjYmx4MEx5OGdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNWNkQzh2SUdOeVpXRjBaU0J6YUdGa1pYSnBkSGtnYjJKcVpXTjBJR1oxYm1OMGFXOXVYRzVjZEM4dklEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dVhHNWNkSEIxWW14cFl5QmpjbVZoZEdWVGFHRmtaWEpwZEhsUFltcGxZM1FvS1RvZ1UyaGhaR1Z5YVhSNVQySnFaV04wSUh0Y2JseDBYSFJqYjI1emRDQnphR0ZrWlhKcGRIbFBZbW9nUFNCN1hHNWNkRngwWEhSamIyUmxPaUIwYUdsekxsOWZZM0psWVhSbFUyaGhaR1Z5UTI5a1pTZ3BMRnh1WEhSY2RGeDBjMmhoWkdWeVUzUmhaMlU2SUhSb2FYTXVYMTl6YUdGa1pYSlRkR0ZuWlN4Y2JseDBYSFJjZEdselJuSmhaMjFsYm5SVGFHRmtaWEk2SUhSb2FYTXVYMTl6YUdGa1pYSlRkR0ZuWlNBOVBUMGdKMlp5WVdkdFpXNTBKeXhjYmx4MFhIUjlPMXh1WEc1Y2RGeDBjbVYwZFhKdUlITm9ZV1JsY21sMGVVOWlhanRjYmx4MGZWeHVYRzVjZEM4dklEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dVhIUXZMeUJ3Y21sMllYUmxJRzFsZEdodlpITmNibHgwTHk4Z1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5WEc1Y2JseDBjSEpwZG1GMFpTQnpkR0YwYVdNZ1gxOWxlR2x6ZEU1dmJrbHVkR1ZuWlhKV1lXeDFaU2gyWVd4MVpYTTZJRzUxYldKbGNsdGRLU0I3WEc1Y2RGeDBabTl5SUNoamIyNXpkQ0IyWVd4MVpTQnZaaUIyWVd4MVpYTXBJSHRjYmx4MFhIUmNkR2xtSUNnaFRuVnRZbVZ5TG1selNXNTBaV2RsY2loMllXeDFaU2twSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSeWRXVTdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYSFJjZEhKbGRIVnliaUJtWVd4elpUdGNibHgwZlZ4dVhHNWNkQzh2SUZSUFJFODZJR2x0Y0d4bGJXVnVkQ0J6YUdGa1pYSWdZMjlrWlNCcGJYQnZjblFnWm1WaGRIVnlaU0FvYkc5M0lIQnlhVzl5YVhSNUtWeHVYSFF2THlCd2RXSnNhV01nYVcxd2IzSjBVMmhoWkdWeVEyOWtaU2hqYjJSbE9pQnpkSEpwYm1jcElIdDlYRzVjYmx4MEx5OGdibVZsWkNCMGJ5QmhjSEJzZVNCVGFHRmtaWEpwZEhrdWRISmhibk5tYjNKdFZHOUhURk5NUlZNeExDQjBjbUZ1YzJadmNtMVViMGRNVTB4RlV6TWdiM0lnZEhKaGJuTm1iM0p0Vkc4Z2JXVjBhRzlrWEc1Y2RIQnlhWFpoZEdVZ1gxOWpjbVZoZEdWVGFHRmtaWEpEYjJSbEtDazZJSE4wY21sdVp5QjdYRzVjZEZ4MGRHaHBjeTVmWDJacGJHeEZiWEIwZVVaMWJtTjBhVzl1Y3lncE8xeHVYRzVjZEZ4MFkyOXVjM1FnWTI5a1pWeHVYSFJjZEZ4MFBTQmdJM1psY25OcGIyNGdNekF3SUdWelhGeHVYRnh1WUZ4dVhIUmNkRngwS3lCMGFHbHpMbDlmWTNKbFlYUmxSR1ZtYVc1bFJHbHlaV04wYVhabFUyaGhaR1Z5UTI5a1pTZ3BYRzVjZEZ4MFhIUXJJSFJvYVhNdVgxOWpjbVZoZEdWRmVIUmxibk5wYjI1VGFHRmtaWEpEYjJSbEtDbGNibHgwWEhSY2RDc2dkR2hwY3k1ZlgyTnlaV0YwWlVkc2IySmhiRkJ5WldOcGMybHZibE5vWVdSbGNrTnZaR1VvS1Z4dVhIUmNkRngwS3lCMGFHbHpMbDlmWTNKbFlYUmxVM1J5ZFdOMFJHVm1hVzVwZEdsdmJsTm9ZV1JsY2tOdlpHVW9LVnh1WEhSY2RGeDBLeUIwYUdsekxsOWZZM0psWVhSbFIyeHZZbUZzUTI5dWMzUmhiblJXWVd4MVpWTm9ZV1JsY2tOdlpHVW9LVnh1WEhSY2RGeDBLeUIwYUdsekxsOWZZM0psWVhSbFIyeHZZbUZzUTI5dWMzUmhiblJUZEhKMVkzUldZV3gxWlZOb1lXUmxja052WkdVb0tWeHVYSFJjZEZ4MEt5QjBhR2x6TGw5ZlkzSmxZWFJsUVhSMGNtbGlkWFJsUkdWamJHRnlZWFJwYjI1VGFHRmtaWEpEYjJSbEtDbGNibHgwWEhSY2RDc2dkR2hwY3k1ZlgyTnlaV0YwWlZaaGNubHBibWRFWldOc1lYSmhkR2x2YmxOb1lXUmxja052WkdVb0tWeHVYSFJjZEZ4MEt5QjBhR2x6TGw5ZlkzSmxZWFJsVDNWMGNIVjBRMjlzYjNKRVpXTnNZWEpoZEdsdmJsTm9ZV1JsY2tOdlpHVW9LVnh1WEhSY2RGeDBLeUIwYUdsekxsOWZZM0psWVhSbFZXNXBabTl5YlVSbFkyeGhjbUYwYVc5dVUyaGhaR1Z5UTI5a1pTZ3BYRzVjZEZ4MFhIUXJJSFJvYVhNdVgxOWpjbVZoZEdWVmJtbG1iM0p0VTNSeWRXTjBSR1ZqYkdGeVlYUnBiMjVUYUdGa1pYSkRiMlJsS0NsY2JseDBYSFJjZENzZ2RHaHBjeTVmWDJOeVpXRjBaVlZ1YVdadmNtMUNkV1ptWlhKUFltcGxZM1JUYUdGa1pYSkRiMlJsS0NsY2JseDBYSFJjZENzZ2RHaHBjeTVmWDJOeVpXRjBaVVoxYm1OMGFXOXVSR1ZtYVc1cGRHbHZibE5vWVdSbGNrTnZaR1VvS1Z4dVhIUmNkRngwS3lCMGFHbHpMbDlmWTNKbFlYUmxUV0ZwYmtaMWJtTjBhVzl1UkdWbWFXNXBkR2x2YmxOb1lXUmxja052WkdVb0tUdGNibHh1WEhSY2RISmxkSFZ5YmlCamIyUmxPMXh1WEhSOVhHNWNibHgwY0hKcGRtRjBaU0JmWDJacGJHeEZiWEIwZVVaMWJtTjBhVzl1Y3lncElIdGNibHgwWEhSbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElIUm9hWE11WDE5bWRXNWpkR2x2Ym5NdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmx4MFhIUmNkSFJvYVhNdVgxOW1kVzVqZEdsdmJuTmJhVjBnUFNCMGFHbHpMbDlmWm5WdVkzUnBiMjV6VzJsZElEOC9JRnRkTzF4dVhIUmNkSDFjYmx4MGZWeHVYRzVjZEhCeWFYWmhkR1VnWDE5amNtVmhkR1ZFWldacGJtVkVhWEpsWTNScGRtVlRhR0ZrWlhKRGIyUmxLQ2s2SUhOMGNtbHVaeUI3WEc1Y2RGeDBiR1YwSUhOb1lXUmxja052WkdVZ1BTQW5KenRjYmx4MFhIUm1iM0lnS0dOdmJuTjBJR1JsWm1sdVpVUnBjbVZqZEdsMlpVNWhiV1VnYjJZZ2RHaHBjeTVmWDJSbFptbHVaVVJwY21WamRHbDJaVTVoYldWektTQjdYRzVjZEZ4MFhIUnphR0ZrWlhKRGIyUmxJQ3M5SUdBalpHVm1hVzVsSUNSN1pHVm1hVzVsUkdseVpXTjBhWFpsVG1GdFpYMWNYRzVnTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQlZkR2xzYVhSNUxsOWhaR1JNYVc1bFJtVmxaRU52WkdWSlprNXZkRTUxYkd4VGRISnBibWNvYzJoaFpHVnlRMjlrWlNrN08xeHVYSFI5WEc1Y2JseDBjSEpwZG1GMFpTQmZYMk55WldGMFpVVjRkR1Z1YzJsdmJsTm9ZV1JsY2tOdlpHVW9LVG9nYzNSeWFXNW5JSHRjYmx4MFhIUnNaWFFnYzJoaFpHVnlRMjlrWlNBOUlDY25PMXh1WEhSY2RHWnZjaUFvWTI5dWMzUWdaWGgwWlc1emFXOXVJRzltSUhSb2FYTXVYMTlsZUhSbGJuTnBiMjV6S1NCN1hHNWNkRngwWEhSemFHRmtaWEpEYjJSbElDczlJR0FqWlhoMFpXNXphVzl1SUNSN1pYaDBaVzV6YVc5dUxtVjRkR1Z1YzJsdmJrNWhiV1Y5T2lBa2UyVjRkR1Z1YzJsdmJpNWlaV2hoZG1sdmNuMWNYRzVnTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQlZkR2xzYVhSNUxsOWhaR1JNYVc1bFJtVmxaRU52WkdWSlprNXZkRTUxYkd4VGRISnBibWNvYzJoaFpHVnlRMjlrWlNrN1hHNWNkSDFjYmx4dVhIUXZMMVJQUkU4NklISmxiVzkyWlNCdVpXVmtiR1Z6Y3lCd2NtVmphWE5wYjI1elhHNWNkSEJ5YVhaaGRHVWdYMTlqY21WaGRHVkhiRzlpWVd4UWNtVmphWE5wYjI1VGFHRmtaWEpEYjJSbEtDazZJSE4wY21sdVp5QjdYRzVjZEZ4MGJHVjBJSE5vWVdSbGNrTnZaR1VnUFNBbkp6dGNibHgwWEhSbWIzSWdLR052Ym5OMElIUjVjR1VnYVc0Z2RHaHBjeTVmWDJkc2IySmhiRkJ5WldOcGMybHZiaWtnZTF4dVhIUmNkRngwWTI5dWMzUWdjSEpsWTJsemFXOXVWSGx3WlNBOUlIUjVjR1VnWVhNZ1UyaGhaR1Z5VUhKbFkybHphVzl1VDJKcVpXTjBTMlY1TzF4dVhIUmNkRngwWTI5dWMzUWdjSEpsWTJsemFXOXVVWFZoYkdsbWFXVnlJRDBnZEdocGN5NWZYMmRzYjJKaGJGQnlaV05wYzJsdmJsdHdjbVZqYVhOcGIyNVVlWEJsWFR0Y2JseHVYSFJjZEZ4MGMyaGhaR1Z5UTI5a1pTQXJQU0JnY0hKbFkybHphVzl1SUNSN2NISmxZMmx6YVc5dVVYVmhiR2xtYVdWeWZTQWtlM0J5WldOcGMybHZibFI1Y0dWOU8xeGNibUE3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlGVjBhV3hwZEhrdVgyRmtaRXhwYm1WR1pXVmtRMjlrWlVsbVRtOTBUblZzYkZOMGNtbHVaeWh6YUdGa1pYSkRiMlJsS1R0Y2JseDBmVnh1WEc1Y2RIQnlhWFpoZEdVZ1gxOWpjbVZoZEdWVGRISjFZM1JFWldacGJtbDBhVzl1VTJoaFpHVnlRMjlrWlNncE9pQnpkSEpwYm1jZ2UxeHVYSFJjZEd4bGRDQnphR0ZrWlhKRGIyUmxJRDBnSnljN1hHNWNkRngwWm05eUlDaGpiMjV6ZENCemRISjFZM1JFWldacGJtbDBhVzl1SUc5bUlIUm9hWE11WDE5emRISjFZM1JFWldacGJtbDBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MGMyaGhaR1Z5UTI5a1pTQXJQU0JnYzNSeWRXTjBJQ1I3YzNSeWRXTjBSR1ZtYVc1cGRHbHZiaTV6ZEhKMVkzUk9ZVzFsZlNCN1hGeHVZRHRjYmx4dVhIUmNkRngwWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCemRISjFZM1JFWldacGJtbDBhVzl1TG0xbGJXSmxjazlpYW1WamRITXViR1Z1WjNSb095QnBLeXNwSUh0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnZG1GeWFXRmliR1VnUFNCemRISjFZM1JFWldacGJtbDBhVzl1TG0xbGJXSmxjazlpYW1WamRITmJhVjA3WEc1Y2JseDBYSFJjZEZ4MGMyaGhaR1Z5UTI5a1pTQXJQU0JnSUNCZ08xeHVYSFJjZEZ4MFhIUnBaaUFvZG1GeWFXRmliR1V1Y0hKbFkybHphVzl1SUNFOUlHNTFiR3dwSUh0Y2JseDBYSFJjZEZ4MFhIUnphR0ZrWlhKRGIyUmxJQ3M5SUdBa2UzWmhjbWxoWW14bExuQnlaV05wYzJsdmJuMGdZRHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnWUNSN2RtRnlhV0ZpYkdVdWRIbHdaWDBnSkh0MllYSnBZV0pzWlM1dFpXMWlaWEpPWVcxbGZUdGNYRzVnTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSemFHRmtaWEpEYjJSbElDczlJR0I5TzF4Y2JtQTdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGNtVjBkWEp1SUZWMGFXeHBkSGt1WDJGa1pFeHBibVZHWldWa1EyOWtaVWxtVG05MFRuVnNiRk4wY21sdVp5aHphR0ZrWlhKRGIyUmxLVHRjYmx4MGZWeHVYRzVjZEhCeWFYWmhkR1VnWDE5amNtVmhkR1ZIYkc5aVlXeERiMjV6ZEdGdWRGWmhiSFZsVTJoaFpHVnlRMjlrWlNncE9pQnpkSEpwYm1jZ2UxeHVYSFJjZEd4bGRDQnphR0ZrWlhKRGIyUmxJRDBnSnljN1hHNWNkRngwWm05eUlDaGpiMjV6ZENCbmJHOWlZV3hEYjI1emRHRnVkRlpoYkhWbElHOW1JSFJvYVhNdVgxOW5iRzlpWVd4RGIyNXpkR0Z1ZEZaaGJIVmxjeWtnZTF4dVhIUmNkRngwWTI5dWMzUWdkSGx3WlNBOUlHZHNiMkpoYkVOdmJuTjBZVzUwVm1Gc2RXVXVkSGx3WlR0Y2JseDBYSFJjZEdOdmJuTjBJSFpoY21saFlteGxUbUZ0WlNBOUlHZHNiMkpoYkVOdmJuTjBZVzUwVm1Gc2RXVXVkbUZ5YVdGaWJHVk9ZVzFsTzF4dVhIUmNkRngwWTI5dWMzUWdkbUZzZFdVZ1BTQm5iRzlpWVd4RGIyNXpkR0Z1ZEZaaGJIVmxMblpoYkhWbGN6dGNibHh1WEhSY2RGeDBjMmhoWkdWeVEyOWtaU0FyUFNCZ1kyOXVjM1FnSkh0MGVYQmxmU0FrZTNaaGNtbGhZbXhsVG1GdFpYMGdQU0FrZTNSNWNHVjlLR0E3WEc1Y2RGeDBYSFJtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUhaaGJIVmxMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNWNkRngwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnZG1Gc2RXVmJhVjBnS3lBbkxDQW5PMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ6YUdGa1pYSkRiMlJsSUQwZ2MyaGhaR1Z5UTI5a1pTNXlaWEJzWVdObEtDOHNYRnh6SkM4c0lDY3BPMXhjYmljcE8xeHVYSFJjZEgxY2JseHVYSFJjZEhKbGRIVnliaUJWZEdsc2FYUjVMbDloWkdSTWFXNWxSbVZsWkVOdlpHVkpaazV2ZEU1MWJHeFRkSEpwYm1jb2MyaGhaR1Z5UTI5a1pTazdYRzVjZEgxY2JseHVYSFJ3Y21sMllYUmxJRjlmWTNKbFlYUmxSMnh2WW1Gc1EyOXVjM1JoYm5SVGRISjFZM1JXWVd4MVpWTm9ZV1JsY2tOdlpHVW9LVG9nYzNSeWFXNW5JSHRjYmx4MFhIUnNaWFFnYzJoaFpHVnlRMjlrWlNBOUlDY25PMXh1WEhSY2RHWnZjaUFvWTI5dWMzUWdjM1J5ZFdOMFZtRnNkV1VnYjJZZ2RHaHBjeTVmWDJkc2IySmhiRU52Ym5OMFlXNTBVM1J5ZFdOMFZtRnNkV1Z6S1NCN1hHNWNkRngwWEhSamIyNXpkQ0J0WVhSamFHVmtTVzVrWlhnZ1BWeHVYSFJjZEZ4MFhIUjBhR2x6TGw5ZmMzUnlkV04wUkdWbWFXNXBkR2x2Ym5NdVptbHVaRWx1WkdWNEtHUmxabWx1YVhScGIyNGdQVDRnWkdWbWFXNXBkR2x2Ymk1emRISjFZM1JPWVcxbElEMDlQU0J6ZEhKMVkzUldZV3gxWlM1emRISjFZM1JPWVcxbEtUdGNibHgwWEhSY2RHbG1JQ2h0WVhSamFHVmtTVzVrWlhnZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSY2RHTnZibk52YkdVdVpYSnliM0lvWUY5ZlkzSmxZWFJsUjJ4dlltRnNRMjl1YzNSaGJuUlRkSEoxWTNSV1lXeDFaVk5vWVdSbGNrTnZaR1U2SUhSb1pTQnpkSEoxWTNRZ2RIbHdaU0FrZTNOMGNuVmpkRlpoYkhWbExuTjBjblZqZEU1aGJXVjlJR2x6SUc1dmRDQmtaV1pwYm1Wa1lDazdYRzVjZEZ4MFhIUmNkR052Ym5ScGJuVmxPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ6YUdGa1pYSkRiMlJsSUNzOUlHQmpiMjV6ZENBa2UzTjBjblZqZEZaaGJIVmxMbk4wY25WamRFNWhiV1Y5SUNSN2MzUnlkV04wVm1Gc2RXVXVkbUZ5YVdGaWJHVk9ZVzFsZlNBOUlDUjdjM1J5ZFdOMFZtRnNkV1V1YzNSeWRXTjBUbUZ0WlgwZ0tGeGNibUE3WEc1Y2JseDBYSFJjZEdOdmJuTjBJSE4wY25WamRFUmxabWx1YVhScGIyNGdQU0IwYUdsekxsOWZjM1J5ZFdOMFJHVm1hVzVwZEdsdmJuTmJiV0YwWTJobFpFbHVaR1Y0WFR0Y2JseDBYSFJjZEdsbUlDaHpkSEoxWTNSRVpXWnBibWwwYVc5dUxtMWxiV0psY2s5aWFtVmpkSE11YkdWdVozUm9JQ0U5UFNCUFltcGxZM1F1YTJWNWN5aHpkSEoxWTNSV1lXeDFaUzUyWVd4MVpYTXBMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJqYjI1emIyeGxMbVZ5Y205eUtHQmZYMk55WldGMFpVZHNiMkpoYkVOdmJuTjBZVzUwVTNSeWRXTjBWbUZzZFdWVGFHRmtaWEpEYjJSbE9pQkpiblpoYkdsa0lHNTFiV0psY2lCdlppQjJZWEpwWVdKc1pYTWdkR2hoZENBa2UzTjBjblZqZEZaaGJIVmxMblpoY21saFlteGxUbUZ0WlgwZ2FHRnpZQ2s3WEc1Y2RGeDBYSFJjZEdOdmJuUnBiblZsTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSamIyNXpkQ0JvWVhOVFlXMXdiR1Z5Vkhsd1pTQTlYRzVjZEZ4MFhIUmNkSE4wY25WamRFUmxabWx1YVhScGIyNHViV1Z0WW1WeVQySnFaV04wY3k1emIyMWxLRzFsYldKbGNrOWlhbVZqZENBOVBpQlZkR2xzYVhSNUxsOXBjMU5oYlhCc1pYSlVlWEJsS0cxbGJXSmxjazlpYW1WamRDNTBlWEJsS1NrN1hHNWNkRngwWEhScFppQW9hR0Z6VTJGdGNHeGxjbFI1Y0dVcElIdGNibHgwWEhSY2RGeDBZMjl1YzI5c1pTNWxjbkp2Y2loZ1gxOWpjbVZoZEdWSGJHOWlZV3hEYjI1emRHRnVkRk4wY25WamRGWmhiSFZsVTJoaFpHVnlRMjlrWlRvZ1EyOXVjM1JoYm5SVGRISjFZM1JXWVd4MVpTQW9KSHR6ZEhKMVkzUldZV3gxWlM1MllYSnBZV0pzWlU1aGJXVjlLU0JqWVc1dWIzUWdhR0YyWlNCellXMXdiR1Z5SUhSNWNHVWdjR0Z5WVcxbGRHVnlZQ2s3WEc1Y2RGeDBYSFJjZEdOdmJuUnBiblZsTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElITjBjblZqZEVSbFptbHVhWFJwYjI0dWJXVnRZbVZ5VDJKcVpXTjBjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVYSFJjZEZ4MFhIUmpiMjV6ZENCMllYSnBZV0pzWlU1aGJXVWdQU0J6ZEhKMVkzUkVaV1pwYm1sMGFXOXVMbTFsYldKbGNrOWlhbVZqZEhOYmFWMHViV1Z0WW1WeVRtRnRaVHRjYmx4MFhIUmNkRngwWTI5dWMzUWdkbUZzZFdVZ1BTQnpkSEoxWTNSV1lXeDFaUzUyWVd4MVpYTmJkbUZ5YVdGaWJHVk9ZVzFsWFZ4dVhIUmNkRngwWEhScFppQW9kbUZzZFdVZ1BUMGdiblZzYkNrZ2UxeHVYSFJjZEZ4MFhIUmNkR052Ym5OdmJHVXVaWEp5YjNJb1lGOWZZM0psWVhSbFIyeHZZbUZzUTI5dWMzUmhiblJUZEhKMVkzUldZV3gxWlZOb1lXUmxja052WkdVNklDUjdjM1J5ZFdOMFZtRnNkV1V1ZG1GeWFXRmliR1ZPWVcxbGZTQmtiMlZ6SUc1dmRDQm9ZWFpsSUhSb1pTQjJZV3gxWlNCdlppQWtlM1poY21saFlteGxUbUZ0WlgxZ0tUdGNibHgwWEhSY2RGeDBYSFJqYjI1MGFXNTFaVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RHTnZibk4wSUhSNWNHVWdQU0J6ZEhKMVkzUkVaV1pwYm1sMGFXOXVMbTFsYldKbGNrOWlhbVZqZEhOYmFWMHVkSGx3WlR0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnYVhOV1lXeHBaRU52YlhCdmJtVnVkRTUxYldKbGNpQTlJRlYwYVd4cGRIa3VYMmx6Vm1Gc2FXUkRiMjF3YjI1bGJuUkRiM1Z1ZENoMGVYQmxMQ0IyWVd4MVpTazdYRzVjZEZ4MFhIUmNkR2xtSUNnaGFYTldZV3hwWkVOdmJYQnZibVZ1ZEU1MWJXSmxjaWtnZTF4dVhIUmNkRngwWEhSY2RHTnZibk52YkdVdVpYSnliM0lvWUY5ZlkzSmxZWFJsUjJ4dlltRnNRMjl1YzNSaGJuUlRkSEoxWTNSV1lXeDFaVk5vWVdSbGNrTnZaR1U2SUhSb1pTQmpiMjF3YjI1bGJuUWdZMjkxYm5RZ2IyWWdKSHQyWVhKcFlXSnNaVTVoYldWOUlHbHVJQ1I3YzNSeWRXTjBWbUZzZFdVdWRtRnlhV0ZpYkdWT1lXMWxmU0JwY3lCcGJuWmhiR2xrWUNrN1hHNWNkRngwWEhSY2RGeDBZMjl1ZEdsdWRXVTdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSemFHRmtaWEpEYjJSbElDczlJR0FnSUNSN2RIbHdaWDBvWUR0Y2JseDBYSFJjZEZ4MFptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQjJZV3gxWlM1c1pXNW5kR2c3SUdrckt5a2dlMXh1WEhSY2RGeDBYSFJjZEhOb1lXUmxja052WkdVZ0t6MGdkbUZzZFdWYmFWMGdLeUFuTENBbk8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwYzJoaFpHVnlRMjlrWlNBOUlITm9ZV1JsY2tOdlpHVXVjbVZ3YkdGalpTZ3ZMRnhjY3lRdkxDQW5LU3hjWEc0bktUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjMmhoWkdWeVEyOWtaU0E5SUhOb1lXUmxja052WkdVdWNtVndiR0ZqWlNndkxGeGNiaVF2TENBblhGeHVLVHRjWEc0bktUdGNibHgwWEhSOVhHNWNibHgwWEhSeVpYUjFjbTRnVlhScGJHbDBlUzVmWVdSa1RHbHVaVVpsWldSRGIyUmxTV1pPYjNST2RXeHNVM1J5YVc1bktITm9ZV1JsY2tOdlpHVXBPMXh1WEhSOVhHNWNibHgwY0hKcGRtRjBaU0JmWDJOeVpXRjBaVUYwZEhKcFluVjBaVVJsWTJ4aGNtRjBhVzl1VTJoaFpHVnlRMjlrWlNncE9pQnpkSEpwYm1jZ2UxeHVYSFJjZEd4bGRDQnphR0ZrWlhKRGIyUmxJRDBnSnljN1hHNWNkRngwWm05eUlDaGpiMjV6ZENCaGRIUnlhV0oxZEdVZ2IyWWdkR2hwY3k1ZlgyRjBkSEpwWW5WMFpYTXBJSHRjYmx4MFhIUmNkR2xtSUNoaGRIUnlhV0oxZEdVdWJHOWpZWFJwYjI0Z0lUMGdiblZzYkNrZ2UxeHVYSFJjZEZ4MFhIUnphR0ZrWlhKRGIyUmxJQ3M5SUdCc1lYbHZkWFFnS0d4dlkyRjBhVzl1SUQwZ0pIdGhkSFJ5YVdKMWRHVXViRzlqWVhScGIyNTlLU0JnTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSemFHRmtaWEpEYjJSbElDczlJR0JwYmlCZ08xeHVYRzVjZEZ4MFhIUnBaaUFvWVhSMGNtbGlkWFJsTG5CeVpXTnBjMmx2YmlBaFBTQnVkV3hzS1NCN1hHNWNkRngwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnWUNSN1lYUjBjbWxpZFhSbExuQnlaV05wYzJsdmJuMGdZRHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwYzJoaFpHVnlRMjlrWlNBclBTQmdKSHRoZEhSeWFXSjFkR1V1ZEhsd1pYMGdKSHRoZEhSeWFXSjFkR1V1ZG1GeWFXRmliR1ZPWVcxbGZUdGNYRzVnTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQlZkR2xzYVhSNUxsOWhaR1JNYVc1bFJtVmxaRU52WkdWSlprNXZkRTUxYkd4VGRISnBibWNvYzJoaFpHVnlRMjlrWlNrN1hHNWNkSDFjYmx4dVhIUndjbWwyWVhSbElGOWZZM0psWVhSbFZtRnllV2x1WjBSbFkyeGhjbUYwYVc5dVUyaGhaR1Z5UTI5a1pTZ3BPaUJ6ZEhKcGJtY2dlMXh1WEhSY2RHeGxkQ0J6YUdGa1pYSkRiMlJsSUQwZ0p5YzdYRzVjZEZ4MFptOXlJQ2hqYjI1emRDQjJZWEo1YVc1bklHOW1JSFJvYVhNdVgxOTJZWEo1YVc1bmN5a2dlMXh1WEhSY2RGeDBhV1lnS0haaGNubHBibWN1YVc1MFpYSndiMnhoZEdsdmJsUjVjR1VnSVQwZ2JuVnNiQ2tnZTF4dVhIUmNkRngwWEhSemFHRmtaWEpEYjJSbElDczlJR0FrZTNaaGNubHBibWN1YVc1MFpYSndiMnhoZEdsdmJsUjVjR1Y5SUdBN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnZEdocGN5NWZYM05vWVdSbGNsTjBZV2RsSUQwOUlDZDJaWEowWlhnbklEOGdZRzkxZENCZ0lEb2dZR2x1SUdBN1hHNWNibHgwWEhSY2RHbG1JQ2gyWVhKNWFXNW5MbkJ5WldOcGMybHZiaUFoUFNCdWRXeHNLU0I3WEc1Y2RGeDBYSFJjZEhOb1lXUmxja052WkdVZ0t6MGdZQ1I3ZG1GeWVXbHVaeTV3Y21WamFYTnBiMjU5SUdBN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnWUNSN2RtRnllV2x1Wnk1MGVYQmxmU0FrZTNaaGNubHBibWN1ZG1GeWFXRmliR1ZPWVcxbGZUdGNYRzVnTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQlZkR2xzYVhSNUxsOWhaR1JNYVc1bFJtVmxaRU52WkdWSlprNXZkRTUxYkd4VGRISnBibWNvYzJoaFpHVnlRMjlrWlNrN1hHNWNkSDFjYmx4dVhIUXZMMVJQUkU4NklIUnlZVzV6YkdGMFpTQjNhR1Z1SUdkc2Myd2daWE14WEc1Y2RIQnlhWFpoZEdVZ1gxOWpjbVZoZEdWUGRYUndkWFJEYjJ4dmNrUmxZMnhoY21GMGFXOXVVMmhoWkdWeVEyOWtaU2dwT2lCemRISnBibWNnZTF4dVhIUmNkR2xtSUNoMGFHbHpMbDlmYzJoaFpHVnlVM1JoWjJVZ0lUMDlJQ2RtY21GbmJXVnVkQ2NwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUFuSnp0Y2JseDBYSFI5WEc1Y2JseDBYSFJ5WlhSMWNtNGdZR3hoZVc5MWRDaHNiMk5oZEdsdmJpQTlJREFwSUc5MWRDQjJaV00wSUNSN2RHaHBjeTVmWDI5MWRIQjFkRU52Ykc5eVZtRnlhV0ZpYkdWT1lXMWxmVHRjWEc1Y1hHNWdPMXh1WEhSOVhHNWNibHgwY0hKcGRtRjBaU0JmWDJOeVpXRjBaVlZ1YVdadmNtMUVaV05zWVhKaGRHbHZibE5vWVdSbGNrTnZaR1VvS1RvZ2MzUnlhVzVuSUh0Y2JseDBYSFJzWlhRZ2MyaGhaR1Z5UTI5a1pTQTlJQ2NuTzF4dVhIUmNkR1p2Y2lBb1kyOXVjM1FnZFc1cFptOXliU0J2WmlCMGFHbHpMbDlmZFc1cFptOXliWE1wSUh0Y2JseDBYSFJjZEhOb1lXUmxja052WkdVZ0t6MGdZSFZ1YVdadmNtMGdZRHRjYmx4dVhIUmNkRngwYVdZZ0tIVnVhV1p2Y20wdWNISmxZMmx6YVc5dUlDRTlJRzUxYkd3cElIdGNibHgwWEhSY2RGeDBjMmhoWkdWeVEyOWtaU0FyUFNCZ0pIdDFibWxtYjNKdExuQnlaV05wYzJsdmJuMGdZRHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwYzJoaFpHVnlRMjlrWlNBclBTQmdKSHQxYm1sbWIzSnRMblI1Y0dWOUlDUjdkVzVwWm05eWJTNTJZWEpwWVdKc1pVNWhiV1Y5TzF4Y2JtQTdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGNtVjBkWEp1SUZWMGFXeHBkSGt1WDJGa1pFeHBibVZHWldWa1EyOWtaVWxtVG05MFRuVnNiRk4wY21sdVp5aHphR0ZrWlhKRGIyUmxLVHRjYmx4MGZWeHVYRzVjZEhCeWFYWmhkR1VnWDE5amNtVmhkR1ZWYm1sbWIzSnRVM1J5ZFdOMFJHVmpiR0Z5WVhScGIyNVRhR0ZrWlhKRGIyUmxLQ2s2SUhOMGNtbHVaeUI3WEc1Y2RGeDBiR1YwSUhOb1lXUmxja052WkdVZ1BTQW5KenRjYmx4MFhIUm1iM0lnS0dOdmJuTjBJSFZ1YVdadmNtMVRkSEoxWTNRZ2IyWWdkR2hwY3k1ZlgzVnVhV1p2Y20xVGRISjFZM1J6S1NCN1hHNWNkRngwWEhSamIyNXpkQ0J6ZEhKMVkzUk9ZVzFsSUQwZ2RXNXBabTl5YlZOMGNuVmpkQzV6ZEhKMVkzUk9ZVzFsTzF4dVhHNWNkRngwWEhSamIyNXpkQ0JsZUdsemRGTjBjblZqZEVSbFptbHVhWFJwYjI0Z1BWeHVYSFJjZEZ4MFhIUjBhR2x6TGw5ZmMzUnlkV04wUkdWbWFXNXBkR2x2Ym5NdWMyOXRaU2hrWldacGJtbDBhVzl1SUQwK0lHUmxabWx1YVhScGIyNHVjM1J5ZFdOMFRtRnRaU0E5UFQwZ2MzUnlkV04wVG1GdFpTazdYRzVjZEZ4MFhIUnBaaUFvSVdWNGFYTjBVM1J5ZFdOMFJHVm1hVzVwZEdsdmJpa2dlMXh1WEhSY2RGeDBYSFJqYjI1emIyeGxMbVZ5Y205eUtHQmZYMk55WldGMFpWVnVhV1p2Y20xVGRISjFZM1JFWldOc1lYSmhkR2x2YmxOb1lXUmxja052WkdVNklIUm9aU0J6ZEhKMVkzUWdkSGx3WlNBa2UzTjBjblZqZEU1aGJXVjlJR2x6SUc1dmRDQmtaV1pwYm1Wa1lDazdYRzVjZEZ4MFhIUmNkR052Ym5ScGJuVmxPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ6YUdGa1pYSkRiMlJsSUNzOUlHQjFibWxtYjNKdElDUjdjM1J5ZFdOMFRtRnRaWDBnSkh0MWJtbG1iM0p0VTNSeWRXTjBMblpoY21saFlteGxUbUZ0WlgwN1hGeHVZRHRjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z1ZYUnBiR2wwZVM1ZllXUmtUR2x1WlVabFpXUkRiMlJsU1daT2IzUk9kV3hzVTNSeWFXNW5LSE5vWVdSbGNrTnZaR1VwTzF4dVhIUjlYRzVjYmx4MGNISnBkbUYwWlNCZlgyTnlaV0YwWlZWdWFXWnZjbTFDZFdabVpYSlBZbXBsWTNSVGFHRmtaWEpEYjJSbEtDazZJSE4wY21sdVp5QjdYRzVjZEZ4MGJHVjBJSE5vWVdSbGNrTnZaR1VnUFNBbkp6dGNibHgwWEhSbWIzSWdLR052Ym5OMElIVmlieUJ2WmlCMGFHbHpMbDlmZFc1cFptOXliVUoxWm1abGNrOWlhbVZqZEhNcElIdGNibHgwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnWUd4aGVXOTFkQ0FvYzNSa01UUXdLU0IxYm1sbWIzSnRJQ1I3ZFdKdkxtSnNiMk5yVG1GdFpYMGdlMXhjYm1BN1hHNWNibHgwWEhSY2RHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkV0p2TG5aaGNtbGhZbXhsVDJKcVpXTjBjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVYSFJjZEZ4MFhIUmpiMjV6ZENCMllYSnBZV0pzWlU5aWFpQTlJSFZpYnk1MllYSnBZV0pzWlU5aWFtVmpkSE5iYVYwN1hHNWNkRngwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnWUNBZ0pIdDJZWEpwWVdKc1pVOWlhaTUwZVhCbGZTQWtlM1poY21saFlteGxUMkpxTG5aaGNtbGhZbXhsVG1GdFpYMDdYRnh1WUR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGFXWWdLSFZpYnk1cGJuTjBZVzVqWlU1aGJXVWdJVDBnYm5Wc2JDa2dlMXh1WEhSY2RGeDBYSFJ6YUdGa1pYSkRiMlJsSUNzOUlHQjlJQ1I3ZFdKdkxtbHVjM1JoYm1ObFRtRnRaWDA3WEZ4dVlEdGNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RITm9ZV1JsY2tOdlpHVWdLejBnWUgwN1hGeHVZRHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z1ZYUnBiR2wwZVM1ZllXUmtUR2x1WlVabFpXUkRiMlJsU1daT2IzUk9kV3hzVTNSeWFXNW5LSE5vWVdSbGNrTnZaR1VwTzF4dVhIUjlYRzVjYmx4MGNISnBkbUYwWlNCZlgyTnlaV0YwWlVaMWJtTjBhVzl1UkdWbWFXNXBkR2x2YmxOb1lXUmxja052WkdVb0tUb2djM1J5YVc1bklIdGNibHgwWEhSc1pYUWdjMmhoWkdWeVEyOWtaU0E5SUNjbk8xeHVYSFJjZEdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2RHaHBjeTVmWDJaMWJtTjBhVzl1Y3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1WEhSY2RGeDBZMjl1YzNRZ1puVnVZM1JwYjI1UFltcGxZM1J6SUQwZ2RHaHBjeTVmWDJaMWJtTjBhVzl1YzF0cFhUdGNibHgwWEhSY2RHWnZjaUFvYkdWMElHb2dQU0F3T3lCcUlEd2dablZ1WTNScGIyNVBZbXBsWTNSekxteGxibWQwYURzZ2Fpc3JLU0I3WEc1Y2RGeDBYSFJjZEhOb1lXUmxja052WkdVZ0t6MGdablZ1WTNScGIyNVBZbXBsWTNSelcycGRMbVoxYm1OMGFXOXVRMjlrWlNBcklHQmNYRzVnTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQlZkR2xzYVhSNUxsOWhaR1JNYVc1bFJtVmxaRU52WkdWSlprNXZkRTUxYkd4VGRISnBibWNvYzJoaFpHVnlRMjlrWlNrN1hHNWNkSDFjYmx4dVhIUndjbWwyWVhSbElGOWZZM0psWVhSbFRXRnBia1oxYm1OMGFXOXVSR1ZtYVc1cGRHbHZibE5vWVdSbGNrTnZaR1VvS1RvZ2MzUnlhVzVuSUh0Y2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1ZlgyMWhhVzVHZFc1amRHbHZia052WkdVZ0t5QmdYRnh1WUR0Y2JseDBmVnh1ZlZ4dUlpd2lhVzF3YjNKMElIdFRhR0ZrWlhKQmRIUnlhV0oxZEdWV1lYSlVlWEJsTENCVGFHRmtaWEpEYjI1emRHRnVkRlpoYkhWbFZtRnlWSGx3WlVWVE15d2dVMmhoWkdWeVZXNXBabTl5YlZaaGNsUjVjR1ZGVXpNc0lGTm9ZV1JsY2xaaGNubHBibWRXWVhKVWVYQmxmU0JtY205dElDY3VMaTkwZVhCbGN5OTBlWEJsSnp0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kyeGhjM01nVlhScGJHbDBlU0I3WEc1Y2RITjBZWFJwWXlCZmMzQnNhWFJDZVV4cGJtVkdaV1ZrUTI5a1pTaHpiM1Z5WTJVNklITjBjbWx1WnlrZ2UxeHVYSFJjZEhKbGRIVnliaUJ6YjNWeVkyVXVjM0JzYVhRb0wxeGNjbHhjYm54Y1hHNHZLVHRjYmx4MGZWeHVYRzVjZEhOMFlYUnBZeUJmYW05cGJsTndiR2wwZEdWa1RHbHVaU2h6Y0d4cGRIUmxaRXhwYm1VNklITjBjbWx1WjF0ZEtTQjdYRzVjZEZ4MGNtVjBkWEp1SUhOd2JHbDBkR1ZrVEdsdVpTNXFiMmx1S0NkY1hHNG5LVHRjYmx4MGZWeHVYRzVjZEhOMFlYUnBZeUJmWVdSa1RHbHVaVVpsWldSRGIyUmxTV1pPYjNST2RXeHNVM1J5YVc1bktITnZkWEpqWlRvZ2MzUnlhVzVuS1NCN1hHNWNkRngwY21WMGRYSnVJSE52ZFhKalpTQTlQVDBnSnljZ1B5QnpiM1Z5WTJVZ09pQnpiM1Z5WTJVZ0t5QW5YRnh1Snp0Y2JseDBmVnh1WEc1Y2RITjBZWFJwWXlCZlkyOXRjRzl1Wlc1MFRuVnRZbVZ5S0Z4dVhIUmNkSFI1Y0dVNklGTm9ZV1JsY2tOdmJuTjBZVzUwVm1Gc2RXVldZWEpVZVhCbFJWTXpJSHdnVTJoaFpHVnlRWFIwY21saWRYUmxWbUZ5Vkhsd1pTQjhJRk5vWVdSbGNsWmhjbmxwYm1kV1lYSlVlWEJsSUh3Z1UyaGhaR1Z5Vlc1cFptOXliVlpoY2xSNWNHVkZVek5jYmx4MEtTQjdYRzVjZEZ4MGJHVjBJR052YlhCdmJtVnVkRTUxYldKbGNqdGNibHgwWEhScFppQW9YRzVjZEZ4MFhIUjBlWEJsSUQwOVBTQW5abXh2WVhRbklIeDhJSFI1Y0dVZ1BUMDlJQ2RwYm5RbklIeDhJSFI1Y0dVZ1BUMDlJQ2RpYjI5c0p5QjhmQ0IwZVhCbElEMDlQU0FuZFdsdWRDY2dmSHhjYmx4MFhIUmNkSFI1Y0dVZ1BUMDlJQ2R6WVcxd2JHVnlNa1FuSUh4OElIUjVjR1VnUFQwOUlDZHpZVzF3YkdWeVEzVmlaU2NnZkh3Z2RIbHdaU0E5UFQwZ0ozTmhiWEJzWlhJelJDY2dmSHdnZEhsd1pTQTlQVDBnSjNOaGJYQnNaWEl5UkVGeWNtRjVKeUI4ZkZ4dVhIUmNkRngwZEhsd1pTQTlQVDBnSjJsellXMXdiR1Z5TWtRbklIeDhJSFI1Y0dVZ1BUMDlJQ2RwYzJGdGNHeGxja04xWW1VbklIeDhJSFI1Y0dVZ1BUMDlJQ2RwYzJGdGNHeGxjak5FSnlCOGZDQjBlWEJsSUQwOVBTQW5hWE5oYlhCc1pYSXlSRUZ5Y21GNUp5QjhmRnh1WEhSY2RGeDBkSGx3WlNBOVBUMGdKM1Z6WVcxd2JHVnlNa1FuSUh4OElIUjVjR1VnUFQwOUlDZDFjMkZ0Y0d4bGNrTjFZbVVuSUh4OElIUjVjR1VnUFQwOUlDZDFjMkZ0Y0d4bGNqTkVKeUI4ZkNCMGVYQmxJRDA5UFNBbmRYTmhiWEJzWlhJeVJFRnljbUY1SnlCOGZGeHVYSFJjZEZ4MGRIbHdaU0E5UFQwZ0ozTmhiWEJzWlhJeVJGTm9ZV1J2ZHljZ2ZId2dkSGx3WlNBOVBUMGdKM05oYlhCc1pYSkRkV0psVTJoaFpHOTNKeUI4ZkNCMGVYQmxJRDA5UFNBbmMyRnRjR3hsY2pKRVFYSnlZWGxUYUdGa2IzY25YRzVjZEZ4MEtTQjdYRzVjZEZ4MFhIUmpiMjF3YjI1bGJuUk9kVzFpWlhJZ1BTQXhPMXh1WEhSY2RIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKM1psWXpJbklIeDhJSFI1Y0dVZ1BUMDlJQ2RwZG1Wak1pY2dmSHdnZEhsd1pTQTlQVDBnSjJKMlpXTXlKeUI4ZkNCMGVYQmxJRDA5UFNBbmRYWmxZekluS1NCN1hHNWNkRngwWEhSamIyMXdiMjVsYm5ST2RXMWlaWElnUFNBeU8xeHVYSFJjZEgwZ1pXeHpaU0JwWmlBb2RIbHdaU0E5UFQwZ0ozWmxZek1uSUh4OElIUjVjR1VnUFQwOUlDZHBkbVZqTXljZ2ZId2dkSGx3WlNBOVBUMGdKMkoyWldNekp5QjhmQ0IwZVhCbElEMDlQU0FuZFhabFl6TW5LU0I3WEc1Y2RGeDBYSFJqYjIxd2IyNWxiblJPZFcxaVpYSWdQU0F6TzF4dVhIUmNkSDBnWld4elpTQnBaaUFvZEhsd1pTQTlQVDBnSjNabFl6UW5JSHg4SUhSNWNHVWdQVDA5SUNkcGRtVmpOQ2NnZkh3Z2RIbHdaU0E5UFQwZ0oySjJaV00wSnlCOGZDQjBlWEJsSUQwOVBTQW5kWFpsWXpRbklIeDhJSFI1Y0dVZ1BUMDlJQ2R0WVhReUp5QjhmQ0IwZVhCbElEMDlQU0FuYldGME1uZ3lKeWtnZTF4dVhIUmNkRngwWTI5dGNHOXVaVzUwVG5WdFltVnlJRDBnTkR0Y2JseDBYSFI5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkdFlYUXllRE1uSUh4OElIUjVjR1VnUFQwOUlDZHRZWFF6ZURJbktTQjdYRzVjZEZ4MFhIUmpiMjF3YjI1bGJuUk9kVzFpWlhJZ1BTQTJPMXh1WEhSY2RIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKMjFoZERKNE5DY2dmSHdnZEhsd1pTQTlQVDBnSjIxaGREUjRNaWNwSUh0Y2JseDBYSFJjZEdOdmJYQnZibVZ1ZEU1MWJXSmxjaUE5SURnN1hHNWNkRngwZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBbmJXRjBNeWNnZkh3Z2RIbHdaU0E5UFQwZ0oyMWhkRE40TXljcElIdGNibHgwWEhSY2RHTnZiWEJ2Ym1WdWRFNTFiV0psY2lBOUlEazdYRzVjZEZ4MGZTQmxiSE5sSUdsbUlDaDBlWEJsSUQwOVBTQW5iV0YwTTNnMEp5QjhmQ0IwZVhCbElEMDlQU0FuYldGME5IZ3pKeWtnZTF4dVhIUmNkRngwWTI5dGNHOXVaVzUwVG5WdFltVnlJRDBnTVRJN1hHNWNkRngwZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBbmJXRjBOQ2NnZkh3Z2RIbHdaU0E5UFQwZ0oyMWhkRFI0TkNjcElIdGNibHgwWEhSY2RHTnZiWEJ2Ym1WdWRFNTFiV0psY2lBOUlERTJPMXh1WEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhRdkx5QjFibXR1YjNkdUlIUjVjR1ZjYmx4MFhIUmNkR052YlhCdmJtVnVkRTUxYldKbGNpQTlJREE3WEc1Y2RGeDBYSFJqYjI1emIyeGxMbVZ5Y205eUtDZFZkR2xzYVhSNUxsOWpiMjF3YjI1bGJuUk9kVzFpWlhJNklHUmxkR1ZqZENCMWJtdHViM2R1SUhSNWNHVW5LVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z1kyOXRjRzl1Wlc1MFRuVnRZbVZ5TzF4dVhIUjlYRzVjYmx4MGMzUmhkR2xqSUY5cGMwbHVkRlI1Y0dVb1hHNWNkRngwZEhsd1pUb2dVMmhoWkdWeVEyOXVjM1JoYm5SV1lXeDFaVlpoY2xSNWNHVkZVek1nZkNCVGFHRmtaWEpCZEhSeWFXSjFkR1ZXWVhKVWVYQmxJSHdnVTJoaFpHVnlWbUZ5ZVdsdVoxWmhjbFI1Y0dVZ2ZDQlRhR0ZrWlhKVmJtbG1iM0p0Vm1GeVZIbHdaVVZUTTF4dVhIUXBJSHRjYmx4MFhIUnBaaUFvWEc1Y2RGeDBYSFIwZVhCbElEMDlQU0FuYVc1MEp5QjhmQ0IwZVhCbElEMDlQU0FuYVhabFl6SW5JSHg4SUhSNWNHVWdQVDA5SUNkcGRtVmpNeWNnZkh3Z2RIbHdaU0E5UFQwZ0oybDJaV00wSnlCOGZGeHVYSFJjZEZ4MGRIbHdaU0E5UFQwZ0ozVnBiblFuSUh4OElIUjVjR1VnUFQwOUlDZDFkbVZqTWljZ2ZId2dkSGx3WlNBOVBUMGdKM1YyWldNekp5QjhmQ0IwZVhCbElEMDlQU0FuZFhabFl6UW5YRzVjZEZ4MEtTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSY2RIMWNibHgwZlZ4dVhHNWNkSE4wWVhScFl5QmZhWE5XWVd4cFpFTnZiWEJ2Ym1WdWRFTnZkVzUwS0Z4dVhIUmNkSFI1Y0dVNklGTm9ZV1JsY2tOdmJuTjBZVzUwVm1Gc2RXVldZWEpVZVhCbFJWTXpJSHdnVTJoaFpHVnlRWFIwY21saWRYUmxWbUZ5Vkhsd1pTQjhJRk5vWVdSbGNsWmhjbmxwYm1kV1lYSlVlWEJsSUh3Z1UyaGhaR1Z5Vlc1cFptOXliVlpoY2xSNWNHVkZVek1zWEc1Y2RGeDBkbUZzZFdWek9pQnVkVzFpWlhKYlhWeHVYSFFwSUh0Y2JseDBYSFJqYjI1emRDQjJZV3hwWkVOdmJYQnZibVZ1ZEVOdmRXNTBJRDBnVlhScGJHbDBlUzVmWTI5dGNHOXVaVzUwVG5WdFltVnlLSFI1Y0dVcE8xeHVYSFJjZEdsbUlDaDJZV3hwWkVOdmJYQnZibVZ1ZEVOdmRXNTBJRDA5UFNCMllXeDFaWE11YkdWdVozUm9LU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdkSEoxWlR0Y2JseDBYSFI5WEc1Y2RGeDBjbVYwZFhKdUlHWmhiSE5sTzF4dVhIUjlYRzVjYmx4MGMzUmhkR2xqSUY5cGMxTmhiWEJzWlhKVWVYQmxLRnh1WEhSY2RIUjVjR1U2SUZOb1lXUmxja052Ym5OMFlXNTBWbUZzZFdWV1lYSlVlWEJsUlZNeklId2dVMmhoWkdWeVFYUjBjbWxpZFhSbFZtRnlWSGx3WlNCOElGTm9ZV1JsY2xaaGNubHBibWRXWVhKVWVYQmxJSHdnVTJoaFpHVnlWVzVwWm05eWJWWmhjbFI1Y0dWRlV6TmNibHgwS1NCN1hHNWNkRngwYVdZZ0tGeHVYSFJjZEZ4MGRIbHdaU0E5UFQwZ0ozTmhiWEJzWlhJeVJDY2dmSHdnZEhsd1pTQTlQVDBnSjNOaGJYQnNaWEpEZFdKbEp5QjhmQ0IwZVhCbElEMDlQU0FuYzJGdGNHeGxjak5FSnlCOGZDQjBlWEJsSUQwOVBTQW5jMkZ0Y0d4bGNqSkVRWEp5WVhrbklIeDhYRzVjZEZ4MFhIUjBlWEJsSUQwOVBTQW5hWE5oYlhCc1pYSXlSQ2NnZkh3Z2RIbHdaU0E5UFQwZ0oybHpZVzF3YkdWeVEzVmlaU2NnZkh3Z2RIbHdaU0E5UFQwZ0oybHpZVzF3YkdWeU0wUW5JSHg4SUhSNWNHVWdQVDA5SUNkcGMyRnRjR3hsY2pKRVFYSnlZWGtuSUh4OFhHNWNkRngwWEhSMGVYQmxJRDA5UFNBbmRYTmhiWEJzWlhJeVJDY2dmSHdnZEhsd1pTQTlQVDBnSjNWellXMXdiR1Z5UTNWaVpTY2dmSHdnZEhsd1pTQTlQVDBnSjNWellXMXdiR1Z5TTBRbklIeDhJSFI1Y0dVZ1BUMDlJQ2QxYzJGdGNHeGxjakpFUVhKeVlYa25JSHg4WEc1Y2RGeDBYSFIwZVhCbElEMDlQU0FuYzJGdGNHeGxjakpFVTJoaFpHOTNKeUI4ZkNCMGVYQmxJRDA5UFNBbmMyRnRjR3hsY2tOMVltVlRhR0ZrYjNjbklIeDhJSFI1Y0dVZ1BUMDlJQ2R6WVcxd2JHVnlNa1JCY25KaGVWTm9ZV1J2ZHlkY2JseDBYSFFwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUIwY25WbE8xeHVYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdabUZzYzJVN1hHNWNkRngwZlZ4dVhIUjlYRzU5WEc0aVhTd2ljMjkxY21ObFVtOXZkQ0k2SWlKOSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi92ZW5kb3IvZWZmZWtzZWVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBhcHBseU1peGlucywgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgRW50aXR5VUlELCBDb21wb25lbnRTSUQsIFNlY29uZCB9IGZyb20gJy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IE11dGFibGVNYXRyaXg0NCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0aC9NdXRhYmxlTWF0cml4NDQnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvSXMnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvTG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIEVmZmVrc2VlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQU5JTUFUSU9OX0VWRU5UX1BMQVkgPSAwO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFOSU1BVElPTl9FVkVOVF9QQVVTRSA9IDE7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQU5JTUFUSU9OX0VWRU5UX0VORCA9IDI7XG4gIHB1YmxpYyBzdGF0aWMgVW56aXA/OiBhbnk7XG4gIHB1YmxpYyB1cmk/OiBzdHJpbmc7XG4gIHB1YmxpYyBhcnJheUJ1ZmZlcj86IEFycmF5QnVmZmVyO1xuICBwdWJsaWMgdHlwZSA9ICdlZmsnO1xuICBwdWJsaWMgcGxheUp1c3RBZnRlckxvYWRlZCA9IGZhbHNlO1xuICBwdWJsaWMgaXNMb29wID0gZmFsc2U7XG4gIHB1YmxpYyBpc1BhdXNlID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgd2FzbU1vZHVsZVVyaSA9IHVuZGVmaW5lZDtcbiAgcHVibGljIHJhbmRvbVNlZWQgPSAtMTtcbiAgcHVibGljIGlzSW1hZ2VMb2FkV2l0aENyZWRlbnRpYWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2VmZmVjdD86IGVmZmVrc2Vlci5FZmZla3NlZXJFZmZlY3Q7XG4gIHByaXZhdGUgX19jb250ZXh0PzogZWZmZWtzZWVyLkVmZmVrc2VlckNvbnRleHQ7XG4gIHByaXZhdGUgX19oYW5kbGU/OiBlZmZla3NlZXIuRWZmZWtzZWVySGFuZGxlO1xuICBwcml2YXRlIF9fc3BlZWQgPSAxO1xuICBwcml2YXRlIF9fdGltZXI/OiBhbnk7XG4gIHByaXZhdGUgX19pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX2lkZW50aXR5TWF0cml4XzA6IE11dGFibGVNYXRyaXg0NCA9IE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9pZGVudGl0eU1hdHJpeF8xOiBNdXRhYmxlTWF0cml4NDQgPSBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKTtcblxuICBwcml2YXRlIGlzTG9hZEVmZmVjdCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0eVVpZDogRW50aXR5VUlELFxuICAgIGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lELFxuICAgIGVudGl0eVJlcG9zaXRvcnk6IEVudGl0eVJlcG9zaXRvcnksXG4gICAgaXNSZVVzZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihlbnRpdHlVaWQsIGNvbXBvbmVudFNpZCwgZW50aXR5UmVwb3NpdG9yeSwgaXNSZVVzZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLkVmZmVrc2VlckNvbXBvbmVudFRJRDtcbiAgfVxuXG4gIGNhbmNlbExvb3AoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9fdGltZXIgYXMgbnVtYmVyKTtcbiAgfVxuXG4gIGlzUGxheSgpOiBib29sZWFuIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2hhbmRsZSkpIHtcbiAgICAgIGlmICh0aGlzLl9faGFuZGxlLmV4aXN0cykge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNQYXVzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHBsYXkoKSB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fY29udGV4dCkpIHtcbiAgICAgIExvZ2dlci53YXJuKCdObyBFZmZla3NlZXIgY29udGV4dCB5ZXQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fZWZmZWN0KSkge1xuICAgICAgTG9nZ2VyLndhcm4oJ05vIEVmZmVrc2VlciBlZmZlY3QgeWV0Jyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wKCk7XG4gICAgdGhpcy5pc1BhdXNlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9faGFuZGxlID0gdGhpcy5fX2NvbnRleHQucGxheSh0aGlzLl9fZWZmZWN0LCAwLCAwLCAwKTtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2hhbmRsZSkgJiYgSXMuZXhpc3QodGhpcy5fX2hhbmRsZS5zZXRSYW5kb21TZWVkKSAmJiB0aGlzLnJhbmRvbVNlZWQgPiAwKSB7XG4gICAgICB0aGlzLl9faGFuZGxlLnNldFJhbmRvbVNlZWQodGhpcy5yYW5kb21TZWVkKTtcbiAgICB9XG5cbiAgICAvLyBpZiAodGhpcy5pc0xvb3ApIHtcbiAgICAvLyAgIHRoaXMuX190aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgICB0aGlzLnBsYXkoKTtcbiAgICAvLyAgIH0sIDUwMCk7XG4gICAgLy8gfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29udGludWUoKSB7XG4gICAgdGhpcy5pc1BhdXNlID0gZmFsc2U7XG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2hhbmRsZSkpIHtcbiAgICAgIHRoaXMuaXNQYXVzZSA9IHRydWU7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX190aW1lciEpO1xuICAgIH1cbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgaWYgKElzLmV4aXN0KHRoaXMuX19oYW5kbGUpKSB7XG4gICAgICB0aGlzLl9faGFuZGxlLnN0b3AoKTtcbiAgICAgIHRoaXMuaXNQYXVzZSA9IHRydWU7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX190aW1lciEpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBwbGF5U3BlZWQodmFsKSB7XG4gICAgaWYgKHRoaXMuX19oYW5kbGUpIHtcbiAgICAgIHRoaXMuX19oYW5kbGUuc2V0U3BlZWQodmFsKTtcbiAgICB9XG4gICAgdGhpcy5fX3NwZWVkID0gdmFsO1xuICB9XG5cbiAgZ2V0IHBsYXlTcGVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NwZWVkO1xuICB9XG5cbiAgc2V0VGltZSh0YXJnZXRTZWM6IFNlY29uZCkge1xuICAgIGlmICghdGhpcy5wbGF5KCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fY29udGV4dCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgdGltZSA9IDA7XG4gICAgY29uc3Qgb25lVGltZSA9IDAuMDE2NjtcbiAgICB0aW1lID0gb25lVGltZTtcbiAgICB3aGlsZSAodGltZSA8PSB0YXJnZXRTZWMpIHtcbiAgICAgIHRoaXMuX19jb250ZXh0LnVwZGF0ZSh0aW1lIC8gb25lVGltZSk7XG4gICAgICB0aW1lICs9IG9uZVRpbWU7XG4gICAgICBpZiAodGFyZ2V0U2VjIDwgdGltZSkge1xuICAgICAgICBjb25zdCBleGNlZWRlZFNlYyA9IHRhcmdldFNlYyAtIHRpbWU7XG4gICAgICAgIGNvbnN0IHJlbWFpblNlYyA9IG9uZVRpbWUgLSBleGNlZWRlZFNlYztcbiAgICAgICAgdGhpcy5fX2NvbnRleHQudXBkYXRlKHJlbWFpblNlYyAvIG9uZVRpbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdXNlKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNldCB0cmFuc2xhdGUodmVjOiBJVmVjdG9yMykge1xuICAgIGlmICh0aGlzLl9faGFuZGxlKSB7XG4gICAgICB0aGlzLl9faGFuZGxlLnNldExvY2F0aW9uKHZlYy54LCB2ZWMueSwgdmVjLnopO1xuICAgIH1cbiAgICB0aGlzLmVudGl0eS50cnlUb0dldFRyYW5zZm9ybSgpIS5sb2NhbFBvc2l0aW9uID0gdmVjO1xuICB9XG5cbiAgZ2V0IHRyYW5zbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnRpdHkudHJ5VG9HZXRUcmFuc2Zvcm0oKSEubG9jYWxQb3NpdGlvbjtcbiAgfVxuXG4gIHNldCByb3RhdGUodmVjKSB7XG4gICAgaWYgKHRoaXMuX19oYW5kbGUpIHtcbiAgICAgIHRoaXMuX19oYW5kbGUuc2V0Um90YXRpb24odmVjLngsIHZlYy55LCB2ZWMueik7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5LnRyeVRvR2V0VHJhbnNmb3JtKCkhLmxvY2FsRXVsZXJBbmdsZXMgPSB2ZWM7XG4gIH1cblxuICBnZXQgcm90YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmVudGl0eS50cnlUb0dldFRyYW5zZm9ybSgpIS5sb2NhbEV1bGVyQW5nbGVzO1xuICB9XG5cbiAgc2V0IHNjYWxlKHZlYykge1xuICAgIGlmICh0aGlzLl9faGFuZGxlKSB7XG4gICAgICB0aGlzLl9faGFuZGxlLnNldFNjYWxlKHZlYy54LCB2ZWMueSwgdmVjLnopO1xuICAgIH1cbiAgICB0aGlzLmVudGl0eS50cnlUb0dldFRyYW5zZm9ybSgpIS5sb2NhbFNjYWxlID0gdmVjO1xuICB9XG5cbiAgZ2V0IHNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmVudGl0eS50cnlUb0dldFRyYW5zZm9ybSgpIS5sb2NhbFNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NyZWF0ZUVmZmVrc2VlckNvbnRleHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLnVyaSkgJiYgSXMubm90LmV4aXN0KHRoaXMuYXJyYXlCdWZmZXIpKSB7XG4gICAgICAvLyBjb25zb2xlLmVycm9yKCdFZmZla3NlZXIgZGF0YSBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVmZmVrc2Vlci5zZXRJbWFnZUNyb3NzT3JpZ2luKHRoaXMuaXNJbWFnZUxvYWRXaXRoQ3JlZGVudGlhbCA/ICd1c2UtY3JlZGVudGlhbHMnIDogJycpO1xuICAgIHRoaXMuX19jb250ZXh0ID0gZWZmZWtzZWVyLmNyZWF0ZUNvbnRleHQoKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KHRoaXMuX19jb250ZXh0KSkge1xuICAgICAgTG9nZ2VyLmVycm9yKCdFZmZla3NlZXIgY29udGV4dCBjcmVhdGlvbiBmYWlscycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgZ2x3ID0gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXI7XG4gICAgdGhpcy5fX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IGdsID0gZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgY29uc3QgZGF0YSA9IElzLmV4aXN0KHRoaXMudXJpKSA/IHRoaXMudXJpIDogdGhpcy5hcnJheUJ1ZmZlcjtcbiAgICB0aGlzLl9fY29udGV4dC5pbml0KGdsLCB7IGVuYWJsZVByZW11bHRpcGxpZWRBbHBoYTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IG9uTG9hZCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsYXlKdXN0QWZ0ZXJMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9uRXJyb3IgPSAobWVzc2FnZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIExvZ2dlci5lcnJvcihtZXNzYWdlICsgJywgJyArIHBhdGgpO1xuICAgIH07XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2Vma3BrZycpIHtcbiAgICAgIGlmIChJcy5ub3QuZXhpc3QoRWZmZWtzZWVyQ29tcG9uZW50LlVuemlwKSkge1xuICAgICAgICBMb2dnZXIuZXJyb3IoJ1BsZWFzZSBTZXQgYW4gVW56aXAgb2JqZWN0IHRvIEVmZmVrc2VlckNvbXBvbmVudC5VbnppcCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLl9fZWZmZWN0ID0gdGhpcy5fX2NvbnRleHQubG9hZEVmZmVjdFBhY2thZ2UoXG4gICAgICAgIGRhdGEgYXMgYW55LFxuICAgICAgICBFZmZla3NlZXJDb21wb25lbnQuVW56aXAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgb25Mb2FkLmJpbmQodGhpcyksXG4gICAgICAgIG9uRXJyb3IuYmluZCh0aGlzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX2VmZmVjdCA9IHRoaXMuX19jb250ZXh0LmxvYWRFZmZlY3QoXG4gICAgICAgIGRhdGEgYXMgYW55LFxuICAgICAgICAxLjAsXG4gICAgICAgIG9uTG9hZC5iaW5kKHRoaXMpLFxuICAgICAgICBvbkVycm9yLmJpbmQodGhpcylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAkbG9hZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fY29udGV4dCkgJiYgSXMubm90LmV4aXN0KHRoaXMuX19lZmZlY3QpKSB7XG4gICAgICBjb25zdCB1c2VXQVNNID0gSXMuZXhpc3QoRWZmZWtzZWVyQ29tcG9uZW50Lndhc21Nb2R1bGVVcmkpO1xuICAgICAgaWYgKHVzZVdBU00pIHtcbiAgICAgICAgZWZmZWtzZWVyLmluaXRSdW50aW1lKFxuICAgICAgICAgIEVmZmVrc2VlckNvbXBvbmVudC53YXNtTW9kdWxlVXJpISxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWNjZWVkID0gdGhpcy5fX2NyZWF0ZUVmZmVrc2VlckNvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChzdWNjZWVkKSB7XG4gICAgICAgICAgICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgRWZmZWtzZWVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3VjY2VlZCA9IHRoaXMuX19jcmVhdGVFZmZla3NlZXJDb250ZXh0KCk7XG4gICAgICAgIGlmIChzdWNjZWVkKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlU3RhZ2VUbyhQcm9jZXNzU3RhZ2UuTG9naWMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJGxvZ2ljKCkge1xuICAgIGlmICghdGhpcy5pc1BhdXNlKSB7XG4gICAgICAvLyBQbGF5aW5nIC4uLlxuICAgICAgaWYgKElzLmV4aXN0KHRoaXMuX19jb250ZXh0KSAmJiBJcy5mYWxzZSh0aGlzLmlzUGF1c2UpKSB7XG4gICAgICAgIHRoaXMuX19jb250ZXh0LnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9faGFuZGxlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHdvcmxkTWF0cml4ID0gRWZmZWtzZWVyQ29tcG9uZW50Ll9fdG1wX2lkZW50aXR5TWF0cml4XzAuY29weUNvbXBvbmVudHMoXG4gICAgICAgIHRoaXMuZW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpIS5tYXRyaXhJbm5lclxuICAgICAgKTtcbiAgICAgIHRoaXMuX19oYW5kbGUuc2V0TWF0cml4KHdvcmxkTWF0cml4Ll92KTtcbiAgICAgIHRoaXMuX19oYW5kbGUuc2V0U3BlZWQodGhpcy5fX3NwZWVkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BhdXNlKSB7XG4gICAgICAvLyBJZiBQYXVzZSBtb2RlLi4uXG4gICAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5SZW5kZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTG9vcCkge1xuICAgICAgaWYgKCF0aGlzLmlzUGxheSgpKSB7XG4gICAgICAgIHRoaXMucGxheSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLlJlbmRlcik7XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5fZGVzdHJveSgpO1xuICAgIGlmIChJcy5leGlzdCh0aGlzLl9fY29udGV4dCkpIHtcbiAgICAgIHRoaXMuX19jb250ZXh0LnJlbGVhc2VFZmZlY3QoIXRoaXMuX19lZmZlY3QpO1xuICAgICAgZWZmZWtzZWVyLnJlbGVhc2VDb250ZXh0KHRoaXMuX19jb250ZXh0KTtcbiAgICAgIHRoaXMuX19jb250ZXh0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2hhbmRsZSkpIHtcbiAgICAgIHRoaXMuX19oYW5kbGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuX19lZmZlY3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAkcmVuZGVyKCkge1xuICAgIC8vIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID1cbiAgICAvLyAgIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgLy8gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0V2ViR0xTdGF0ZVRvRGVmYXVsdCgpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QodGhpcy5fX2VmZmVjdCkpIHtcbiAgICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvYWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYW1lcmFDb21wb25lbnQgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgKSBhcyBDYW1lcmFDb21wb25lbnQ7XG4gICAgY29uc3Qgdmlld01hdHJpeCA9IEVmZmVrc2VlckNvbXBvbmVudC5fX3RtcF9pZGVudGl0eU1hdHJpeF8wO1xuICAgIGNvbnN0IHByb2plY3Rpb25NYXRyaXggPSBFZmZla3NlZXJDb21wb25lbnQuX190bXBfaWRlbnRpdHlNYXRyaXhfMTtcblxuICAgIGlmIChjYW1lcmFDb21wb25lbnQpIHtcbiAgICAgIHZpZXdNYXRyaXguY29weUNvbXBvbmVudHMoY2FtZXJhQ29tcG9uZW50LnZpZXdNYXRyaXgpO1xuICAgICAgcHJvamVjdGlvbk1hdHJpeC5jb3B5Q29tcG9uZW50cyhjYW1lcmFDb21wb25lbnQucHJvamVjdGlvbk1hdHJpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpZXdNYXRyaXguaWRlbnRpdHkoKTtcbiAgICAgIHByb2plY3Rpb25NYXRyaXguaWRlbnRpdHkoKTtcbiAgICB9XG4gICAgaWYgKElzLmV4aXN0KHRoaXMuX19jb250ZXh0KSkge1xuICAgICAgdGhpcy5fX2NvbnRleHQuc2V0UHJvamVjdGlvbk1hdHJpeChwcm9qZWN0aW9uTWF0cml4Ll92KTtcbiAgICAgIHRoaXMuX19jb250ZXh0LnNldENhbWVyYU1hdHJpeCh2aWV3TWF0cml4Ll92KTtcbiAgICAgIHRoaXMuX19jb250ZXh0LmRyYXcoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5Mb2dpYyk7XG4gIH1cblxuICBzdGF0aWMgc29ydF8kcmVuZGVyKHJlbmRlclBhc3M6IFJlbmRlclBhc3MpOiBDb21wb25lbnRTSURbXSB7XG4gICAgaWYgKElzLmZhbHNlKHJlbmRlclBhc3MudG9SZW5kZXJFZmZla3NlZXJFZmZlY3RzKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjb21wb25lbnRzID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnRzV2l0aFR5cGUoRWZmZWtzZWVyQ29tcG9uZW50KTtcbiAgICByZXR1cm4gY29tcG9uZW50cy5tYXAoKGMpID0+IGMuY29tcG9uZW50U0lEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQWRkIHRoaXMgY29tcG9uZW50IHRvIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIGJhc2UgdGhlIHRhcmdldCBlbnRpdHlcbiAgICogQHBhcmFtIF9jb21wb25lbnRDbGFzcyB0aGUgY29tcG9uZW50IGNsYXNzIHRvIGFkZFxuICAgKi9cbiAgYWRkVGhpc0NvbXBvbmVudFRvRW50aXR5PEVudGl0eUJhc2UgZXh0ZW5kcyBJRW50aXR5LCBTb21lQ29tcG9uZW50Q2xhc3MgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PihcbiAgICBiYXNlOiBFbnRpdHlCYXNlLFxuICAgIF9jb21wb25lbnRDbGFzczogU29tZUNvbXBvbmVudENsYXNzXG4gICkge1xuICAgIGNsYXNzIEVmZmVrc2VlckVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAgICAgICBpc0FsaXZlOiBib29sZWFuLFxuICAgICAgICBjb21wb25lbnRzPzogTWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGVudGl0eVVJRCwgaXNBbGl2ZSwgY29tcG9uZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGdldEVmZmVrc2VlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICAgICAgRWZmZWtzZWVyQ29tcG9uZW50LmNvbXBvbmVudFRJRFxuICAgICAgICApIGFzIEVmZmVrc2VlckNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlNaXhpbnMoYmFzZSwgRWZmZWtzZWVyRW50aXR5KTtcbiAgICByZXR1cm4gYmFzZSBhcyB1bmtub3duIGFzIENvbXBvbmVudFRvQ29tcG9uZW50TWV0aG9kczxTb21lQ29tcG9uZW50Q2xhc3M+ICYgRW50aXR5QmFzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFZmZla3NlZXJFbnRpdHlNZXRob2RzIHtcbiAgZ2V0RWZmZWtzZWVyKCk6IEVmZmVrc2VlckNvbXBvbmVudDtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vbWFpbic7XG5leHBvcnQgKiBmcm9tICcuL0VmZmVrc2VlckNvbXBvbmVudCc7XG4iLCJpbXBvcnQgeyBFZmZla3NlZXJDb21wb25lbnQgfSBmcm9tICcuL0VmZmVrc2VlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgVHJhbnNmb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL1RyYW5zZm9ybS9UcmFuc2Zvcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuXG5jb25zdCBjcmVhdGVFZmZla3NlZXJFbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuY3JlYXRlRW50aXR5KCk7XG4gIGNvbnN0IGVudGl0eTEgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KFRyYW5zZm9ybUNvbXBvbmVudCwgZW50aXR5KTtcbiAgY29uc3QgZW50aXR5MiA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoU2NlbmVHcmFwaENvbXBvbmVudCwgZW50aXR5MSk7XG4gIGNvbnN0IGVudGl0eTMgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KEVmZmVrc2VlckNvbXBvbmVudCwgZW50aXR5Mik7XG5cbiAgcmV0dXJuIGVudGl0eTM7XG59O1xuXG5leHBvcnQgY29uc3QgRWZmZWtzZWVyID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEVmZmVrc2VlckNvbXBvbmVudCxcbiAgY3JlYXRlRWZmZWtzZWVyRW50aXR5LFxufSk7XG4iLCJpbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBBQUJCIH0gZnJvbSAnLi4vbWF0aC9BQUJCJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2FtZXJhQ29udHJvbGxlciB7XG4gIHB1YmxpYyB6TmVhck1heCA9IDAuMTtcbiAgcHVibGljIHpGYXJTY2FsaW5nRmFjdG9yID0gMTAwMDAwO1xuICBwdWJsaWMgYXV0b0NhbGN1bGF0ZVpOZWFyQW5kWkZhciA9IHRydWU7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfX3RhcmdldEVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwcm90ZWN0ZWQgX2NhbGNaTmVhcklubmVyKGNhbWVyYTogQ2FtZXJhQ29tcG9uZW50LCBleWVQb3NpdGlvbjogVmVjdG9yMywgZXllRGlyZWN0aW9uOiBWZWN0b3IzKSB7XG4gICAgaWYgKHRoaXMuYXV0b0NhbGN1bGF0ZVpOZWFyQW5kWkZhciAmJiB0aGlzLl9fdGFyZ2V0RW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWFiYiA9IG5ldyBBQUJCKCk7XG4gICAgICBmb3IgKGNvbnN0IHRhcmdldEVudGl0eSBvZiB0aGlzLl9fdGFyZ2V0RW50aXRpZXMpIHtcbiAgICAgICAgYWFiYi5tZXJnZUFBQkIodGFyZ2V0RW50aXR5LmdldFNjZW5lR3JhcGgoKS53b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0QUFCQiA9IGFhYmI7XG4gICAgICBjb25zdCBsZW5ndGhPZkNlbnRlclRvRXllID0gVmVjdG9yMy5sZW5ndGhCdHcoZXllUG9zaXRpb24sIHRhcmdldEFBQkIuY2VudGVyUG9pbnQpO1xuXG4gICAgICAvLyBjYWxjIGNvcyBiZXR3ZWVuIGV5ZVRvVGFyZ2V0IGFuZCBleWUgZGlyZWN0aW9uXG4gICAgICBjb25zdCBleWVUb1RhcmdldERpcmVjdGlvblggPSB0YXJnZXRBQUJCLmNlbnRlclBvaW50LnggLSBleWVQb3NpdGlvbi54O1xuICAgICAgY29uc3QgZXllVG9UYXJnZXREaXJlY3Rpb25ZID0gdGFyZ2V0QUFCQi5jZW50ZXJQb2ludC55IC0gZXllUG9zaXRpb24ueTtcbiAgICAgIGNvbnN0IGV5ZVRvVGFyZ2V0RGlyZWN0aW9uWiA9IHRhcmdldEFBQkIuY2VudGVyUG9pbnQueiAtIGV5ZVBvc2l0aW9uLno7XG4gICAgICBjb25zdCBjb3MgPVxuICAgICAgICAoZXllVG9UYXJnZXREaXJlY3Rpb25YICogZXllRGlyZWN0aW9uLnggK1xuICAgICAgICAgIGV5ZVRvVGFyZ2V0RGlyZWN0aW9uWSAqIGV5ZURpcmVjdGlvbi55ICtcbiAgICAgICAgICBleWVUb1RhcmdldERpcmVjdGlvblogKiBleWVEaXJlY3Rpb24ueikgL1xuICAgICAgICAoTWF0aC5oeXBvdChleWVUb1RhcmdldERpcmVjdGlvblgsIGV5ZVRvVGFyZ2V0RGlyZWN0aW9uWSwgZXllVG9UYXJnZXREaXJlY3Rpb25aKSAqXG4gICAgICAgICAgZXllRGlyZWN0aW9uLmxlbmd0aCgpKTtcblxuICAgICAgY2FtZXJhLnpOZWFySW5uZXIgPSBNYXRoLm1heChcbiAgICAgICAgTWF0aC5taW4obGVuZ3RoT2ZDZW50ZXJUb0V5ZSAqIGNvcyAtIHRhcmdldEFBQkIubGVuZ3RoQ2VudGVyVG9Db3JuZXIsIHRoaXMuek5lYXJNYXgpLFxuICAgICAgICAwLjAxXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW1lcmEuek5lYXJJbm5lciA9IGNhbWVyYS56TmVhcjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NhbGNaRmFySW5uZXIoY2FtZXJhOiBDYW1lcmFDb21wb25lbnQpIHtcbiAgICBpZiAodGhpcy5hdXRvQ2FsY3VsYXRlWk5lYXJBbmRaRmFyKSB7XG4gICAgICBjYW1lcmEuekZhcklubmVyID0gY2FtZXJhLnpOZWFySW5uZXIgKiB0aGlzLnpGYXJTY2FsaW5nRmFjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW1lcmEuek5lYXJJbm5lciA9IGNhbWVyYS56RmFyO1xuICAgIH1cbiAgfVxuXG4gIGFic3RyYWN0IHNldFRhcmdldCh0YXJnZXRFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogdm9pZDtcbiAgYWJzdHJhY3Qgc2V0VGFyZ2V0cyh0YXJnZXRFbnRpdGllczogSVNjZW5lR3JhcGhFbnRpdHlbXSk6IHZvaWQ7XG4gIGFic3RyYWN0IGdldFRhcmdldHMoKTogSVNjZW5lR3JhcGhFbnRpdHlbXTtcbn1cbiIsImltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FtZXJhQ29udHJvbGxlciB7XG4gIGxvZ2ljKGNhbWVyYUNvbXBvbmVudDogQ2FtZXJhQ29tcG9uZW50KTogdm9pZDtcbiAgcmVnaXN0ZXJFdmVudExpc3RlbmVycyhldmVudFRhcmdldERvbTogYW55KTogdm9pZDtcbiAgdW5yZWdpc3RlckV2ZW50TGlzdGVuZXJzKCk6IHZvaWQ7XG4gIHNldFRhcmdldCh0YXJnZXRFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogdm9pZDtcbiAgc2V0VGFyZ2V0cyh0YXJnZXRFbnRpdGllczogSVNjZW5lR3JhcGhFbnRpdHlbXSk6IHZvaWQ7XG4gIGdldFRhcmdldHMoKTogSVNjZW5lR3JhcGhFbnRpdHlbXTtcbiAgdXBkYXRlQ291bnQ6IG51bWJlcjtcbn1cbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbCc7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlTWF0cml4MzMnO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQ0JztcbmltcG9ydCB7IENvdW50LCBTaXplIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSUNhbWVyYUNvbnRyb2xsZXIgfSBmcm9tICcuL0lDYW1lcmFDb250cm9sbGVyJztcbmltcG9ydCB7IE11dGFibGVNYXRyaXg0NCB9IGZyb20gJy4uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IEFBQkIgfSBmcm9tICcuLi9tYXRoL0FBQkInO1xuaW1wb3J0IHsgQWJzdHJhY3RDYW1lcmFDb250cm9sbGVyIH0gZnJvbSAnLi9BYnN0cmFjdENhbWVyYUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgSW5wdXRNYW5hZ2VyLCBJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUiB9IGZyb20gJy4uL3N5c3RlbS9JbnB1dE1hbmFnZXInO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhQ29udHJvbGxlci9DYW1lcmFDb250cm9sbGVyQ29tcG9uZW50JztcblxuZGVjbGFyZSBsZXQgd2luZG93OiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBPcmJpdENhbWVyYUNvbnRyb2xsZXIgZXh0ZW5kcyBBYnN0cmFjdENhbWVyYUNvbnRyb2xsZXIgaW1wbGVtZW50cyBJQ2FtZXJhQ29udHJvbGxlciB7XG4gIHB1YmxpYyBkb2xseVNjYWxlID0gMi4wO1xuICBwdWJsaWMgc2NhbGVPZkxlbmd0aENlbnRlclRvQ2FtZXJhID0gMS4wO1xuICBwdWJsaWMgbW92ZVNwZWVkID0gMTtcbiAgcHVibGljIGZvbGxvd1RhcmdldEFBQkIgPSBmYWxzZTtcbiAgcHVibGljIGF1dG9VcGRhdGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgX191cGRhdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX191cGRhdGVDb3VudCA9IDA7XG4gIHByaXZhdGUgX19maXhlZExlbmd0aE9mQ2VudGVyVG9FeWUgPSAxO1xuICBwcml2YXRlIF9faXNNb3VzZURvd24gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2xhc3RNb3VzZURvd25UaW1lU3RhbXAgPSAwO1xuICBwcml2YXRlIF9fbGFzdE1vdXNlVXBUaW1lU3RhbXAgPSAwO1xuICBwcml2YXRlIF9fb3JpZ2luYWxZID0gLTE7XG4gIHByaXZhdGUgX19vcmlnaW5hbFggPSAtMTtcbiAgcHJpdmF0ZSBfX2J1dHRvbk51bWJlciA9IDA7XG4gIHByaXZhdGUgX19tb3VzZV90cmFuc2xhdGVfeSA9IDA7XG4gIHByaXZhdGUgX19tb3VzZV90cmFuc2xhdGVfeCA9IDA7XG4gIHByaXZhdGUgX19lZmZpY2llbmN5ID0gMTtcbiAgcHJpdmF0ZSBfX2xlbmd0aE9mQ2VudGVyVG9FeWUgPSAxO1xuICBwcml2YXRlIF9fZm92eUJpYXMgPSAxLjA7XG4gIHByaXZhdGUgX19zY2FsZU9mVHJhbnNsYXRpb24gPSAyLjg7XG4gIHByaXZhdGUgX19tb3VzZVRyYW5zbGF0ZVZlYyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBfX25ld0V5ZVZlYyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBfX25ld0NlbnRlclZlYyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBfX25ld1VwVmVjID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIF9fbmV3VGFuZ2VudFZlYyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgLy8gcHJpdmF0ZSBfX3ZlcnRpY2FsQW5nbGVUaHJlc2hvbGQgPSAwO1xuICAvLyBwcml2YXRlIF9fdmVydGljYWxBbmdsZU9mVmVjdG9ycyA9IDA7XG4gIHByaXZhdGUgX19pc1N5bW1ldHJ5TW9kZSA9IHRydWU7XG4gIC8vIHByaXZhdGUgX19kb1Jlc2V0V2hlbkNhbWVyYVNldHRpbmdDaGFuZ2VkID0gZmFsc2U7XG4gIHByaXZhdGUgX19yb3RfYmduX3ggPSAwO1xuICBwcml2YXRlIF9fcm90X2Jnbl95ID0gMDtcbiAgcHJpdmF0ZSBfX3JvdF94ID0gMDtcbiAgcHJpdmF0ZSBfX3JvdF95ID0gMDtcbiAgcHJpdmF0ZSBfX2RvbGx5ID0gMC41O1xuICBwcml2YXRlIF9fZXllVmVjID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIF9fY2VudGVyVmVjID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIF9fdXBWZWMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByb3RlY3RlZCBfX3RhcmdldEVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdID0gW107XG4gIHByaXZhdGUgX19zY2FsZU9mWk5lYXJBbmRaRmFyID0gNTAwMDtcbiAgcHJpdmF0ZSBfX2RvUHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2lzUHJlc3NpbmdTaGlmdCA9IGZhbHNlO1xuICBwcml2YXRlIF9faXNQcmVzc2luZ0N0cmwgPSBmYWxzZTtcblxuICBwcml2YXRlIF9fcGluY2hJbk91dENvbnRyb2wgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX3BpbmNoSW5PdXRPcmlnaW5hbERpc3RhbmNlPzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfX21heGltdW1feT86IG51bWJlcjtcbiAgcHJpdmF0ZSBfX21pbmltdW1feT86IG51bWJlcjtcblxuICBwcml2YXRlIF9fcmVzZXREb2xseVRvdWNoVGltZTogQ291bnQgPSAwO1xuXG4gIHByaXZhdGUgX19pbml0aWFsVGFyZ2V0QUFCQj86IEFBQkI7XG5cbiAgcHVibGljIGFhYmJXaXRoU2tlbGV0YWwgPSB0cnVlO1xuICBwdWJsaWMgdXNlSW5pdGlhbFRhcmdldEFBQkJGb3JMZW5ndGggPSBmYWxzZTtcblxuICAvLyBwcml2YXRlIF9fY29udHJvbGxlclRyYW5zbGF0ZSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBfX21vdXNlRG93bkZ1bmMgPSB0aGlzLl9fbW91c2VEb3duLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19tb3VzZVVwRnVuYyA9IHRoaXMuX19tb3VzZVVwLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19tb3VzZU1vdmVGdW5jID0gdGhpcy5fX21vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICBwcml2YXRlIF9fdG91Y2hEb3duRnVuYyA9IHRoaXMuX190b3VjaERvd24uYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfX3RvdWNoVXBGdW5jID0gdGhpcy5fX3RvdWNoVXAuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfX3RvdWNoTW92ZUZ1bmMgPSB0aGlzLl9fdG91Y2hNb3ZlLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19waW5jaEluT3V0RnVuYyA9IHRoaXMuX19waW5jaEluT3V0LmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19waW5jaEluT3V0RW5kRnVuYyA9IHRoaXMuX19waW5jaEluT3V0RW5kLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19tb3VzZVdoZWVsRnVuYyA9IHRoaXMuX19tb3VzZVdoZWVsLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19tb3VzZURibENsaWNrRnVuYyA9IHRoaXMuX19tb3VzZURibENsaWNrLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19jb250ZXh0TWVudUZ1bmMgPSB0aGlzLl9fY29udGV4dE1lbnUuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfX3ByZXNzU2hpZnRGdW5jID0gdGhpcy5fX3ByZXNzU2hpZnQuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfX3JlbGVhc2VTaGlmdEZ1bmMgPSB0aGlzLl9fcmVsZWFzZVNoaWZ0LmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX19wcmVzc0N0cmxGdW5jID0gdGhpcy5fX3ByZXNzQ3RybC5iaW5kKHRoaXMpO1xuICBwcml2YXRlIF9fcmVsZWFzZUN0cmxGdW5jID0gdGhpcy5fX3JlbGVhc2VDdHJsLmJpbmQodGhpcyk7XG5cbiAgcHJpdmF0ZSBfX3Jlc2V0RG9sbHlBbmRQb3NpdGlvbkZ1bmMgPSB0aGlzLl9fcmVzZXREb2xseUFuZFBvc2l0aW9uLmJpbmQodGhpcyk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX190bXBfdXA6IFZlY3RvcjMgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIDFdKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWMzXzA6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlYzNfMTogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM18yOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9yb3RhdGVNX1g6IE11dGFibGVNYXRyaXgzMyA9IE11dGFibGVNYXRyaXgzMy5pZGVudGl0eSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9yb3RhdGVNX1k6IE11dGFibGVNYXRyaXgzMyA9IE11dGFibGVNYXRyaXgzMy5pZGVudGl0eSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9yb3RhdGVNOiBNdXRhYmxlTWF0cml4MzMgPSBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfcm90YXRlTV9SZXNldDogTXV0YWJsZU1hdHJpeDMzID0gTXV0YWJsZU1hdHJpeDMzLmlkZW50aXR5KCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3JvdGF0ZU1fUmV2ZXJ0OiBNdXRhYmxlTWF0cml4MzMgPSBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3RtcE1hdDQ0XzA6IE11dGFibGVNYXRyaXg0NCA9IE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpO1xuXG4gIHByaXZhdGUgX19jYW1lcmFDb250cm9sbGVyQ29tcG9uZW50OiBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQ6IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuX19jYW1lcmFDb250cm9sbGVyQ29tcG9uZW50ID0gY2FtZXJhQ29udHJvbGxlckNvbXBvbmVudDtcbiAgfVxuXG4gIGdldCB1cGRhdGVDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZUNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ291bnQoKSB7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gICAgdGhpcy5fX2NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQuX3VwZGF0ZUNvdW50KHRoaXMuX191cGRhdGVDb3VudCk7XG4gIH1cblxuICByZXNldERvbGx5QW5kVHJhbnNsYXRpb24oKSB7XG4gICAgdGhpcy5fX2RvbGx5ID0gMC41O1xuICAgIHRoaXMuX19tb3VzZV90cmFuc2xhdGVfeCA9IDA7XG4gICAgdGhpcy5fX21vdXNlX3RyYW5zbGF0ZV95ID0gMDtcbiAgICB0aGlzLl9fbW91c2VUcmFuc2xhdGVWZWMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIH1cblxuICBzZXRUYXJnZXQodGFyZ2V0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSkge1xuICAgIHRoaXMuc2V0VGFyZ2V0cyhbdGFyZ2V0RW50aXR5XSk7XG4gIH1cblxuICBzZXRUYXJnZXRzKHRhcmdldEVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdKSB7XG4gICAgdGhpcy5fX3RhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXM7XG4gICAgdGhpcy5fX2luaXRpYWxUYXJnZXRBQUJCID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX191cGRhdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fdXBkYXRlQ291bnQoKTtcbiAgfVxuXG4gIGdldFRhcmdldHMoKTogSVNjZW5lR3JhcGhFbnRpdHlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX190YXJnZXRFbnRpdGllcztcbiAgfVxuXG4gIHNldCBkb1ByZXZlbnREZWZhdWx0KGZsYWc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCA9IGZsYWc7XG4gIH1cblxuICBnZXQgZG9QcmV2ZW50RGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2RvUHJldmVudERlZmF1bHQ7XG4gIH1cblxuICBfX21vdXNlRG93bihlOiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5fX3RyeVRvUHJldmVudERlZmF1bHQoZSk7XG4gICAgLy8gaWYgKHRoaXMuaXNNb3VzZURvd24pIHJldHVybjtcbiAgICBpZiAodGhpcy5fX2lzUHJlc3NpbmdDdHJsKSByZXR1cm47XG5cbiAgICB0aGlzLl9fb3JpZ2luYWxYID0gZS5jbGllbnRYO1xuICAgIHRoaXMuX19vcmlnaW5hbFkgPSBlLmNsaWVudFk7XG4gICAgdGhpcy5fX3JvdF9iZ25feCA9IHRoaXMuX19yb3RfeDtcbiAgICB0aGlzLl9fcm90X2Jnbl95ID0gdGhpcy5fX3JvdF95O1xuXG4gICAgdGhpcy5fX2lzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLl9fbGFzdE1vdXNlRG93blRpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ29yaWdpbmFsJywgdGhpcy5fX29yaWdpbmFsWCwgdGhpcy5fX29yaWdpbmFsWSk7XG5cbiAgICB0aGlzLl9fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBfX21vdXNlTW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5fX3RyeVRvUHJldmVudERlZmF1bHQoZSk7XG4gICAgaWYgKElzLmZhbHNlKHRoaXMuaXNNb3VzZURvd24pKSByZXR1cm47XG4gICAgaWYgKHRoaXMuX19pc1ByZXNzaW5nQ3RybCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX19idXR0b25OdW1iZXIgPT09IDApIHtcbiAgICAgIHRoaXMuX19idXR0b25OdW1iZXIgPSBlLmJ1dHRvbnM7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudE1vdXNlWCA9IGUuY2xpZW50WDtcbiAgICBjb25zdCBjdXJyZW50TW91c2VZID0gZS5jbGllbnRZO1xuICAgIC8vIGNvbnNvbGUubG9nKCdjdXJyZW50TW91c2U6ICcsIGN1cnJlbnRNb3VzZVgsIGN1cnJlbnRNb3VzZVkpO1xuICAgIHN3aXRjaCAodGhpcy5fX2J1dHRvbk51bWJlcikge1xuICAgICAgY2FzZSAxOiAvLyBsZWZ0XG4gICAgICAgIGlmICh0aGlzLl9faXNQcmVzc2luZ1NoaWZ0KSB7XG4gICAgICAgICAgdGhpcy5fX3BhcmFsbGVsVHJhbnNsYXRlQ29udHJvbChcbiAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFgsXG4gICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxZLFxuICAgICAgICAgICAgY3VycmVudE1vdXNlWCxcbiAgICAgICAgICAgIGN1cnJlbnRNb3VzZVlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX19yb3RhdGVDb250cm9sKHRoaXMuX19vcmlnaW5hbFgsIHRoaXMuX19vcmlnaW5hbFksIGN1cnJlbnRNb3VzZVgsIGN1cnJlbnRNb3VzZVkpO1xuICAgICAgICAgIHRoaXMuX19yb3RfYmduX3ggPSB0aGlzLl9fcm90X3g7XG4gICAgICAgICAgdGhpcy5fX3JvdF9iZ25feSA9IHRoaXMuX19yb3RfeTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogLy8gcmlnaHRcbiAgICAgICAgdGhpcy5fX3pvb21Db250cm9sKHRoaXMuX19vcmlnaW5hbFgsIGN1cnJlbnRNb3VzZVgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDogLy8gY2VudGVyXG4gICAgICAgIHRoaXMuX19wYXJhbGxlbFRyYW5zbGF0ZUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5fX29yaWdpbmFsWCxcbiAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxZLFxuICAgICAgICAgIGN1cnJlbnRNb3VzZVgsXG4gICAgICAgICAgY3VycmVudE1vdXNlWVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fX29yaWdpbmFsWCA9IGN1cnJlbnRNb3VzZVg7XG4gICAgdGhpcy5fX29yaWdpbmFsWSA9IGN1cnJlbnRNb3VzZVk7XG4gICAgdGhpcy5fX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgX19tb3VzZVVwKGU6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLl9fYnV0dG9uTnVtYmVyID0gMDtcbiAgICB0aGlzLl9fb3JpZ2luYWxYID0gLTE7XG4gICAgdGhpcy5fX29yaWdpbmFsWSA9IC0xO1xuXG4gICAgdGhpcy5fX2lzTW91c2VEb3duID0gZmFsc2U7XG4gICAgdGhpcy5fX2xhc3RNb3VzZVVwVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgdGhpcy5fX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgX190b3VjaERvd24oZTogVG91Y2hFdmVudCkge1xuICAgIHRoaXMuX190cnlUb1ByZXZlbnREZWZhdWx0KGUpO1xuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuX19vcmlnaW5hbFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHRoaXMuX19vcmlnaW5hbFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIHRoaXMuX19yb3RfYmduX3ggPSB0aGlzLl9fcm90X3g7XG4gICAgICB0aGlzLl9fcm90X2Jnbl95ID0gdGhpcy5fX3JvdF95O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fb3JpZ2luYWxYID0gKGUudG91Y2hlc1swXS5jbGllbnRYICsgZS50b3VjaGVzWzFdLmNsaWVudFgpICogMC41O1xuICAgICAgdGhpcy5fX29yaWdpbmFsWSA9IChlLnRvdWNoZXNbMF0uY2xpZW50WSArIGUudG91Y2hlc1sxXS5jbGllbnRZKSAqIDAuNTtcbiAgICB9XG5cbiAgICB0aGlzLl9faXNNb3VzZURvd24gPSB0cnVlO1xuICAgIHRoaXMuX19sYXN0TW91c2VEb3duVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgdGhpcy5fX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgX190b3VjaE1vdmUoZTogVG91Y2hFdmVudCkge1xuICAgIHRoaXMuX190cnlUb1ByZXZlbnREZWZhdWx0KGUpO1xuICAgIGlmIChJcy5mYWxzZSh0aGlzLmlzTW91c2VEb3duKSkgcmV0dXJuO1xuXG4gICAgbGV0IGN1cnJlbnRUb3VjaFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICBsZXQgY3VycmVudFRvdWNoWSA9IGUudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjdXJyZW50VG91Y2hYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICBjdXJyZW50VG91Y2hZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB0aGlzLl9fcm90YXRlQ29udHJvbCh0aGlzLl9fb3JpZ2luYWxYLCB0aGlzLl9fb3JpZ2luYWxZLCBjdXJyZW50VG91Y2hYLCBjdXJyZW50VG91Y2hZKTtcbiAgICAgIHRoaXMuX19yb3RfYmduX3ggPSB0aGlzLl9fcm90X3g7XG4gICAgICB0aGlzLl9fcm90X2Jnbl95ID0gdGhpcy5fX3JvdF95O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50VG91Y2hYID0gKGUudG91Y2hlc1swXS5jbGllbnRYICsgZS50b3VjaGVzWzFdLmNsaWVudFgpICogMC41O1xuICAgICAgY3VycmVudFRvdWNoWSA9IChlLnRvdWNoZXNbMF0uY2xpZW50WSArIGUudG91Y2hlc1sxXS5jbGllbnRZKSAqIDAuNTtcblxuICAgICAgdGhpcy5fX3BhcmFsbGVsVHJhbnNsYXRlQ29udHJvbChcbiAgICAgICAgdGhpcy5fX29yaWdpbmFsWCxcbiAgICAgICAgdGhpcy5fX29yaWdpbmFsWSxcbiAgICAgICAgY3VycmVudFRvdWNoWCxcbiAgICAgICAgY3VycmVudFRvdWNoWVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fX29yaWdpbmFsWCA9IGN1cnJlbnRUb3VjaFg7XG4gICAgdGhpcy5fX29yaWdpbmFsWSA9IGN1cnJlbnRUb3VjaFk7XG4gICAgdGhpcy5fX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgX190b3VjaFVwKGU6IFRvdWNoRXZlbnQpIHtcbiAgICBjb25zdCB0b3VjaE51bWJlciA9IGUudG91Y2hlcy5sZW5ndGg7XG4gICAgaWYgKHRvdWNoTnVtYmVyID09PSAwKSB7XG4gICAgICB0aGlzLl9fb3JpZ2luYWxYID0gLTE7XG4gICAgICB0aGlzLl9fb3JpZ2luYWxZID0gLTE7XG4gICAgfSBlbHNlIGlmICh0b3VjaE51bWJlciA9PT0gMSkge1xuICAgICAgdGhpcy5fX29yaWdpbmFsWCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgdGhpcy5fX29yaWdpbmFsWSA9IGUudG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgdGhpcy5fX3JvdF9iZ25feCA9IHRoaXMuX19yb3RfeDtcbiAgICAgIHRoaXMuX19yb3RfYmduX3kgPSB0aGlzLl9fcm90X3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19vcmlnaW5hbFggPSAoZS50b3VjaGVzWzBdLmNsaWVudFggKyBlLnRvdWNoZXNbMV0uY2xpZW50WCkgKiAwLjU7XG4gICAgICB0aGlzLl9fb3JpZ2luYWxZID0gKGUudG91Y2hlc1swXS5jbGllbnRZICsgZS50b3VjaGVzWzFdLmNsaWVudFkpICogMC41O1xuICAgIH1cbiAgICB0aGlzLl9faXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9fbGFzdE1vdXNlVXBUaW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcbiAgICB0aGlzLl9fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBzZXQgcm90WCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fX3JvdF94ID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgZ2V0IHJvdFgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19yb3RfeDtcbiAgfVxuXG4gIHNldCByb3RZKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9fcm90X3kgPSB2YWx1ZTtcbiAgICB0aGlzLl9fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBnZXQgcm90WSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3JvdF95O1xuICB9XG5cbiAgc2V0IG1heGltdW1ZKG1heGltdW1feTogbnVtYmVyKSB7XG4gICAgdGhpcy5fX21heGltdW1feSA9IG1heGltdW1feTtcbiAgfVxuICBzZXQgbWluaW11bVkobWluaW11bV95OiBudW1iZXIpIHtcbiAgICB0aGlzLl9fbWluaW11bV95ID0gbWluaW11bV95O1xuICB9XG5cbiAgX19yb3RhdGVDb250cm9sKG9yaWdpbmFsWDogU2l6ZSwgb3JpZ2luYWxZOiBTaXplLCBjdXJyZW50WDogU2l6ZSwgY3VycmVudFk6IFNpemUpIHtcbiAgICAvLyBjYWxjIHJvdGF0aW9uIGFuZ2xlXG4gICAgY29uc3QgZGVsdGFfeCA9IChjdXJyZW50WCAtIG9yaWdpbmFsWCkgKiB0aGlzLl9fZWZmaWNpZW5jeSAqIDAuMztcbiAgICBjb25zdCBkZWx0YV95ID0gKGN1cnJlbnRZIC0gb3JpZ2luYWxZKSAqIHRoaXMuX19lZmZpY2llbmN5ICogMC4zO1xuICAgIHRoaXMuX19yb3RfeCA9IHRoaXMuX19yb3RfYmduX3ggLSBkZWx0YV94O1xuICAgIHRoaXMuX19yb3RfeSA9IHRoaXMuX19yb3RfYmduX3kgLSBkZWx0YV95O1xuXG4gICAgLy8gY2hlY2sgaWYgcm90YXRpb24gYW5nbGUgaXMgd2l0aGluIHJhbmdlXG4gICAgLy8gaWYgKFxuICAgIC8vICAgdGhpcy5fX3ZlcnRpY2FsQW5nbGVUaHJlc2hvbGQgLSB0aGlzLl9fdmVydGljYWxBbmdsZU9mVmVjdG9ycyA8IHRoaXMuX19yb3RfeVxuICAgIC8vICkge1xuICAgIC8vICAgICAgICAgIHRoaXMuX3JvdF95IC09IHRoaXMuX3JvdF95IC0gKHRoaXMuX3ZlcnRpY2FsQW5nbGVUaHJlc2hvbGQgLSB0aGlzLl92ZXJ0aWNhbEFuZ2xlT2ZWZWN0b3JzKTtcbiAgICAvLyB9XG5cbiAgICAvLyBpZiAoXG4gICAgLy8gICB0aGlzLl9fcm90X3kgPCAtdGhpcy5fX3ZlcnRpY2FsQW5nbGVUaHJlc2hvbGQgKyB0aGlzLl9fdmVydGljYWxBbmdsZU9mVmVjdG9yc1xuICAgIC8vICkge1xuICAgIC8vICAgICAgICAgdGhpcy5fcm90X3kgKz0gdGhpcy5fcm90X3kgLSAodGhpcy5fdmVydGljYWxBbmdsZVRocmVzaG9sZCAtIHRoaXMuX3ZlcnRpY2FsQW5nbGVPZlZlY3RvcnMpO1xuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLl9fbWF4aW11bV95ICE9IG51bGwgJiYgdGhpcy5fX3JvdF95ID4gdGhpcy5fX21heGltdW1feSkge1xuICAgICAgdGhpcy5fX3JvdF95ID0gdGhpcy5fX21heGltdW1feTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19taW5pbXVtX3kgIT0gbnVsbCAmJiB0aGlzLl9fcm90X3kgPCB0aGlzLl9fbWluaW11bV95KSB7XG4gICAgICB0aGlzLl9fcm90X3kgPSB0aGlzLl9fbWluaW11bV95O1xuICAgIH1cbiAgfVxuXG4gIF9fem9vbUNvbnRyb2wob3JpZ2luYWxWYWx1ZTogU2l6ZSwgY3VycmVudFZhbHVlOiBTaXplKSB7XG4gICAgdGhpcy5kb2xseSAtPSAoKGN1cnJlbnRWYWx1ZSAtIG9yaWdpbmFsVmFsdWUpIC8gMTAwMCkgKiB0aGlzLl9fZWZmaWNpZW5jeTtcbiAgfVxuXG4gIF9fcGFyYWxsZWxUcmFuc2xhdGVDb250cm9sKG9yaWdpbmFsWDogU2l6ZSwgb3JpZ2luYWxZOiBTaXplLCBjdXJyZW50WDogU2l6ZSwgY3VycmVudFk6IFNpemUpIHtcbiAgICB0aGlzLl9fbW91c2VfdHJhbnNsYXRlX3kgPSAoKGN1cnJlbnRZIC0gb3JpZ2luYWxZKSAvIDEwMDApICogdGhpcy5fX2VmZmljaWVuY3k7XG4gICAgdGhpcy5fX21vdXNlX3RyYW5zbGF0ZV94ID0gKChjdXJyZW50WCAtIG9yaWdpbmFsWCkgLyAxMDAwKSAqIHRoaXMuX19lZmZpY2llbmN5O1xuXG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLl9fbGVuZ3RoT2ZDZW50ZXJUb0V5ZSAqIHRoaXMuX19mb3Z5QmlhcyAqIHRoaXMuX19zY2FsZU9mVHJhbnNsYXRpb247XG5cbiAgICBjb25zdCB1cERpclRyYW5zbGF0ZVZlYyA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcFZlYzNfMDtcbiAgICB1cERpclRyYW5zbGF0ZVZlY1xuICAgICAgLmNvcHlDb21wb25lbnRzKHRoaXMuX19uZXdVcFZlYylcbiAgICAgIC5ub3JtYWxpemUoKVxuICAgICAgLm11bHRpcGx5KHRoaXMuX19tb3VzZV90cmFuc2xhdGVfeSlcbiAgICAgIC5tdWx0aXBseShzY2FsZSk7XG5cbiAgICBjb25zdCB0YW5nZW50RGlyVHJhbnNsYXRlVmVjID0gT3JiaXRDYW1lcmFDb250cm9sbGVyLl9fdG1wVmVjM18xO1xuICAgIHRhbmdlbnREaXJUcmFuc2xhdGVWZWNcbiAgICAgIC5jb3B5Q29tcG9uZW50cyh0aGlzLl9fbmV3VGFuZ2VudFZlYylcbiAgICAgIC5ub3JtYWxpemUoKVxuICAgICAgLm11bHRpcGx5KHRoaXMuX19tb3VzZV90cmFuc2xhdGVfeClcbiAgICAgIC5tdWx0aXBseShzY2FsZSk7XG5cbiAgICB0aGlzLl9fbW91c2VUcmFuc2xhdGVWZWMuYWRkKHVwRGlyVHJhbnNsYXRlVmVjKS5hZGQodGFuZ2VudERpclRyYW5zbGF0ZVZlYyk7XG4gIH1cblxuICBfX2dldFRvdWNoZXNEaXN0YW5jZShlOiBUb3VjaEV2ZW50KSB7XG4gICAgY29uc3QgdG91Y2hlcyA9IGUudG91Y2hlcztcblxuICAgIGNvbnN0IGRpZmZYID0gdG91Y2hlc1sxXS5jbGllbnRYIC0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgIGNvbnN0IGRpZmZZID0gdG91Y2hlc1sxXS5jbGllbnRZIC0gdG91Y2hlc1swXS5jbGllbnRZO1xuXG4gICAgcmV0dXJuIE1hdGguaHlwb3QoZGlmZlgsIGRpZmZZKTtcbiAgfVxuXG4gIF9fcGluY2hJbk91dChlOiBUb3VjaEV2ZW50KSB7XG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fX3BpbmNoSW5PdXRPcmlnaW5hbERpc3RhbmNlID09IG51bGwpIHtcbiAgICAgIHRoaXMuX19waW5jaEluT3V0T3JpZ2luYWxEaXN0YW5jZSA9IHRoaXMuX19nZXRUb3VjaGVzRGlzdGFuY2UoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudERpc3RhbmNlID0gdGhpcy5fX2dldFRvdWNoZXNEaXN0YW5jZShlKTtcbiAgICBjb25zdCBvcmlnaW5hbERpc3RhbmNlID0gdGhpcy5fX3BpbmNoSW5PdXRPcmlnaW5hbERpc3RhbmNlO1xuICAgIGlmICghdGhpcy5fX3BpbmNoSW5PdXRDb250cm9sKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoY3VycmVudERpc3RhbmNlIC0gb3JpZ2luYWxEaXN0YW5jZSkgPiAzNS4wKSB7XG4gICAgICAgIHRoaXMuX19waW5jaEluT3V0T3JpZ2luYWxEaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTtcbiAgICAgICAgdGhpcy5fX3BpbmNoSW5PdXRDb250cm9sID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYXRpbyA9IG9yaWdpbmFsRGlzdGFuY2UgLyBjdXJyZW50RGlzdGFuY2U7XG4gICAgdGhpcy5kb2xseSAqPSBNYXRoLnBvdyhyYXRpbyAqIHRoaXMuX19lZmZpY2llbmN5LCAyLjIgLyAxNS4wKTtcblxuICAgIHRoaXMuX19waW5jaEluT3V0T3JpZ2luYWxEaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTtcbiAgICB0aGlzLl9fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBfX3BpbmNoSW5PdXRFbmQoZTogVG91Y2hFdmVudCkge1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoIDwgMikge1xuICAgICAgdGhpcy5fX3BpbmNoSW5PdXRDb250cm9sID0gZmFsc2U7XG4gICAgICB0aGlzLl9fcGluY2hJbk91dE9yaWdpbmFsRGlzdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9fdHJ5VG9QcmV2ZW50RGVmYXVsdChldnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX19kb1ByZXZlbnREZWZhdWx0KSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBfX21vdXNlV2hlZWwoZXZ0OiBXaGVlbEV2ZW50KSB7XG4gICAgdGhpcy5fX3RyeVRvUHJldmVudERlZmF1bHQoZXZ0KTtcbiAgICB0aGlzLmRvbGx5ICs9IE1hdGguc2lnbihldnQuZGVsdGFZKSAvIDIwMDtcbiAgICB0aGlzLl9fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBfX2NvbnRleHRNZW51KGV2dDogRXZlbnQpIHtcbiAgICB0aGlzLl9fdHJ5VG9QcmV2ZW50RGVmYXVsdChldnQpO1xuICB9XG5cbiAgc2V0IGRvbGx5KHZhbHVlKSB7XG4gICAgdmFsdWUgPSBNYXRoLm1pbih2YWx1ZSwgMSk7XG4gICAgdmFsdWUgPSBNYXRoLm1heCh2YWx1ZSwgMC4wMDAxKTtcbiAgICBsZXQgZ2FtbWEgPSBNYXRoLnBvdyh2YWx1ZSwgNSk7XG4gICAgZ2FtbWEgPSBNYXRoLm1heChnYW1tYSwgMC4wMDAxKTtcbiAgICB0aGlzLl9fZG9sbHkgPSBnYW1tYTtcbiAgfVxuXG4gIGdldCBkb2xseSgpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codGhpcy5fX2RvbGx5LCAxIC8gNSk7XG4gIH1cblxuICBfX21vdXNlRGJsQ2xpY2soZXZ0OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKGV2dC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5fX21vdXNlVHJhbnNsYXRlVmVjLnplcm8oKTtcbiAgICB9IGVsc2UgaWYgKGV2dC5jdHJsS2V5KSB7XG4gICAgICB0aGlzLl9fcm90X3kgPSAwO1xuICAgICAgdGhpcy5fX3JvdF94ID0gMDtcbiAgICAgIHRoaXMuX19yb3RfYmduX3kgPSAwO1xuICAgICAgdGhpcy5fX3JvdF9iZ25feCA9IDA7XG4gICAgfVxuICB9XG5cbiAgX19yZXNldERvbGx5QW5kUG9zaXRpb24oZTogVG91Y2hFdmVudCkge1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBpZiAoY3VycmVudFRpbWUgLSB0aGlzLl9fcmVzZXREb2xseVRvdWNoVGltZSA8IDMwMCkge1xuICAgICAgdGhpcy5kb2xseSA9IE1hdGgucG93KDAuNSwgMS4wIC8gMi4yKTtcbiAgICAgIHRoaXMuX19tb3VzZVRyYW5zbGF0ZVZlYy56ZXJvKCk7XG4gICAgICB0aGlzLl9fcm90X3ggPSAwO1xuICAgICAgdGhpcy5fX3JvdF95ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3Jlc2V0RG9sbHlUb3VjaFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB9XG4gIH1cblxuICBfX3ByZXNzU2hpZnQoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLnNoaWZ0S2V5ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLl9faXNQcmVzc2luZ1NoaWZ0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBfX3JlbGVhc2VTaGlmdChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUuc2hpZnRLZXkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9faXNQcmVzc2luZ1NoaWZ0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgX19wcmVzc0N0cmwoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmN0cmxLZXkgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuX19pc1ByZXNzaW5nQ3RybCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgX19yZWxlYXNlQ3RybChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUuY3RybEtleSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX19pc1ByZXNzaW5nQ3RybCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IGV2ZW50VGFyZ2V0RG9tID0gd2luZG93O1xuICAgIGlmIChJcy5leGlzdChDb25maWcuZXZlbnRUYXJnZXREb20pKSB7XG4gICAgICBldmVudFRhcmdldERvbSA9IENvbmZpZy5ldmVudFRhcmdldERvbTtcbiAgICB9XG5cbiAgICBpZiAoJ29udG91Y2hlbmQnIGluIGRvY3VtZW50KSB7XG4gICAgICAvLyB0b3VjaCBkZXZpY2VzXG4gICAgICBJbnB1dE1hbmFnZXIucmVnaXN0ZXIoSU5QVVRfSEFORExJTkdfU1RBVEVfQ0FNRVJBX0NPTlRST0xMRVIsIFtcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ3RvdWNoc3RhcnQnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX190b3VjaERvd25GdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICd0b3VjaG1vdmUnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX190b3VjaE1vdmVGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICd0b3VjaGVuZCcsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX3RvdWNoVXBGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICd0b3VjaG1vdmUnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19waW5jaEluT3V0RnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiAndG91Y2hlbmQnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19waW5jaEluT3V0RW5kRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiAndG91Y2hzdGFydCcsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX3Jlc2V0RG9sbHlBbmRQb3NpdGlvbkZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ2NvbnRleHRtZW51JyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9fY29udGV4dE1lbnVGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdkYmxjbGljaycsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX21vdXNlRGJsQ2xpY2tGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGMgZGV2aWNlc1xuICAgICAgSW5wdXRNYW5hZ2VyLnJlZ2lzdGVyKElOUFVUX0hBTkRMSU5HX1NUQVRFX0NBTUVSQV9DT05UUk9MTEVSLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdtb3VzZWRvd24nLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19tb3VzZURvd25GdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdtb3VzZXVwJyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9fbW91c2VVcEZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ21vdXNlbGVhdmUnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19tb3VzZVVwRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9fbW91c2VNb3ZlRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiAna2V5ZG93bicsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX3ByZXNzU2hpZnRGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdrZXl1cCcsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX3JlbGVhc2VTaGlmdEZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ2tleWRvd24nLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19wcmVzc0N0cmxGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdrZXl1cCcsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX3JlbGVhc2VDdHJsRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiAnY29udGV4dG1lbnUnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19jb250ZXh0TWVudUZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ3doZWVsJyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9fbW91c2VXaGVlbEZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ2RibGNsaWNrJyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9fbW91c2VEYmxDbGlja0Z1bmMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXJFdmVudExpc3RlbmVycygpIHtcbiAgICBJbnB1dE1hbmFnZXIudW5yZWdpc3RlcihJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUik7XG4gIH1cblxuICBfX2dldEZvdnlGcm9tQ2FtZXJhKGNhbWVyYTogQ2FtZXJhQ29tcG9uZW50KSB7XG4gICAgaWYgKGNhbWVyYS5mb3Z5KSB7XG4gICAgICByZXR1cm4gY2FtZXJhLmZvdnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoVXRpbC5yYWRpYW5Ub0RlZ3JlZShcbiAgICAgICAgMiAqIE1hdGguYXRhbihNYXRoLmFicyhjYW1lcmEudG9wIC0gY2FtZXJhLmJvdHRvbSkgLyAoMiAqIGNhbWVyYS56TmVhcikpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2ljKGNhbWVyYUNvbXBvbmVudDogQ2FtZXJhQ29tcG9uZW50KSB7XG4gICAgaWYgKCF0aGlzLl9fdXBkYXRlZCB8fCB0aGlzLmF1dG9VcGRhdGUpIHtcbiAgICAgIHRoaXMuX191cGRhdGVUYXJnZXRpbmcoY2FtZXJhQ29tcG9uZW50KTtcbiAgICAgIHRoaXMuX19jYWxjdWxhdGVJbmZsdWVuY2VPZkNvbnRyb2xsZXIoKTtcbiAgICAgIHRoaXMuX191cGRhdGVDYW1lcmFDb21wb25lbnQoY2FtZXJhQ29tcG9uZW50KTtcbiAgICAgIHRoaXMuX191cGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0VGFyZ2V0QUFCQih0YXJnZXRFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgaWYgKHRoaXMuYWFiYldpdGhTa2VsZXRhbCkge1xuICAgICAgcmV0dXJuIHRhcmdldEVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKSEud29ybGRNZXJnZWRBQUJCV2l0aFNrZWxldGFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGFyZ2V0RW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpIS53b3JsZE1lcmdlZEFBQkI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBjZW50ZXIsIGV5ZSBhbmQgdXAgdmVjdG9ycyBvZiBPcmJpdENhbWVyYUNvbnRyb2xsZXJcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfX3VwZGF0ZVRhcmdldGluZyhjYW1lcmE6IENhbWVyYUNvbXBvbmVudCkge1xuICAgIGNvbnN0IGV5ZVZlYyA9IGNhbWVyYS5leWU7XG4gICAgY29uc3QgY2VudGVyVmVjID0gKGNhbWVyYSBhcyBhbnkpLl9kaXJlY3Rpb24gYXMgVmVjdG9yMztcbiAgICBjb25zdCB1cFZlYyA9IChjYW1lcmEgYXMgYW55KS5fdXAgYXMgVmVjdG9yMztcblxuICAgIGNvbnN0IG5ld0V5ZVZlYyA9IHRoaXMuX19leWVWZWM7XG4gICAgY29uc3QgbmV3Q2VudGVyVmVjID0gdGhpcy5fX2NlbnRlclZlYztcbiAgICBjb25zdCBuZXdVcFZlYyA9IHRoaXMuX191cFZlYy5jb3B5Q29tcG9uZW50cyh1cFZlYyk7XG5cbiAgICBpZiAodGhpcy5fX3RhcmdldEVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmV3RXllVmVjLmNvcHlDb21wb25lbnRzKGV5ZVZlYyk7XG4gICAgICBuZXdDZW50ZXJWZWMuY29weUNvbXBvbmVudHMoY2VudGVyVmVjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX19pbml0aWFsVGFyZ2V0QUFCQiA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGFhYmIgPSBuZXcgQUFCQigpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhcmdldEVudGl0eSBvZiB0aGlzLl9fdGFyZ2V0RW50aXRpZXMpIHtcbiAgICAgICAgICBhYWJiLm1lcmdlQUFCQih0aGlzLl9fZ2V0VGFyZ2V0QUFCQih0YXJnZXRFbnRpdHkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9faW5pdGlhbFRhcmdldEFBQkIgPSBhYWJiLmNsb25lKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNhbGMgbmV3Q2VudGVyVmVjXG4gICAgICBsZXQgYWFiYlRvVXNlID0gdGhpcy5fX2luaXRpYWxUYXJnZXRBQUJCITtcbiAgICAgIGlmICh0aGlzLmZvbGxvd1RhcmdldEFBQkIpIHtcbiAgICAgICAgY29uc3QgYWFiYiA9IG5ldyBBQUJCKCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0RW50aXR5IG9mIHRoaXMuX190YXJnZXRFbnRpdGllcykge1xuICAgICAgICAgIGFhYmIubWVyZ2VBQUJCKHRoaXMuX19nZXRUYXJnZXRBQUJCKHRhcmdldEVudGl0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGFhYmJUb1VzZSA9IGFhYmI7XG4gICAgICB9XG4gICAgICBuZXdDZW50ZXJWZWMuY29weUNvbXBvbmVudHMoYWFiYlRvVXNlLmNlbnRlclBvaW50KTtcbiAgICAgIC8vIGNhbGMgbmV3RXllVmVjXG4gICAgICBjb25zdCBjZW50ZXJUb0NhbWVyYVZlYyA9IE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8oXG4gICAgICAgIGV5ZVZlYyxcbiAgICAgICAgY2VudGVyVmVjLFxuICAgICAgICBuZXdFeWVWZWNcbiAgICAgICkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gICAgICBjb25zdCBjZW50ZXJUb0NhbWVyYVZlY05vcm1hbGl6ZWQgPSBjZW50ZXJUb0NhbWVyYVZlYy5ub3JtYWxpemUoKTtcbiAgICAgIGNvbnN0IGxlbmd0aENlbnRlclRvQ29ybmVyID0gdGhpcy51c2VJbml0aWFsVGFyZ2V0QUFCQkZvckxlbmd0aFxuICAgICAgICA/IHRoaXMuX19pbml0aWFsVGFyZ2V0QUFCQi5sZW5ndGhDZW50ZXJUb0Nvcm5lclxuICAgICAgICA6IGFhYmJUb1VzZS5sZW5ndGhDZW50ZXJUb0Nvcm5lcjtcbiAgICAgIGxldCBsZW5ndGhDZW50ZXJUb0NhbWVyYSA9XG4gICAgICAgIGxlbmd0aENlbnRlclRvQ29ybmVyICpcbiAgICAgICAgKDEuMCArIDEuMCAvIE1hdGgudGFuKE1hdGhVdGlsLmRlZ3JlZVRvUmFkaWFuKGNhbWVyYS5mb3Z5IC8gMi4wKSkpICpcbiAgICAgICAgdGhpcy5zY2FsZU9mTGVuZ3RoQ2VudGVyVG9DYW1lcmE7XG4gICAgICBpZiAoTWF0aC5hYnMobGVuZ3RoQ2VudGVyVG9DYW1lcmEpIDwgMC4wMDAwMSkge1xuICAgICAgICBsZW5ndGhDZW50ZXJUb0NhbWVyYSA9IDE7XG4gICAgICB9XG4gICAgICBjZW50ZXJUb0NhbWVyYVZlY05vcm1hbGl6ZWQubXVsdGlwbHkobGVuZ3RoQ2VudGVyVG9DYW1lcmEpLmFkZChuZXdDZW50ZXJWZWMpO1xuXG4gICAgICBjb25zdCBzZyA9IGNhbWVyYS5lbnRpdHkudHJ5VG9HZXRTY2VuZUdyYXBoKCk7XG4gICAgICBpZiAoc2cgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpbnZNYXQgPSBNYXRyaXg0NC5pbnZlcnRUbyhzZy5tYXRyaXhJbm5lciwgT3JiaXRDYW1lcmFDb250cm9sbGVyLl9fdG1wTWF0NDRfMCk7XG5cbiAgICAgICAgaW52TWF0Lm11bHRpcGx5VmVjdG9yM1RvKG5ld0NlbnRlclZlYywgbmV3Q2VudGVyVmVjKTtcbiAgICAgICAgaW52TWF0Lm11bHRpcGx5VmVjdG9yM1RvKG5ld0V5ZVZlYywgbmV3RXllVmVjKTtcbiAgICAgICAgaW52TWF0Lm11bHRpcGx5VmVjdG9yM1RvKG5ld1VwVmVjLCBuZXdVcFZlYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB1cCwgZXllLCBjZW50ZXIgYW5kIHRhbmdlbnQgdmVjdG9yIHdpdGggY29udHJvbGxlciBpbmZsdWVuY2VcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfX2NhbGN1bGF0ZUluZmx1ZW5jZU9mQ29udHJvbGxlcigpIHtcbiAgICBjb25zdCBjZW50ZXJUb0V5ZVZlYyA9IE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8oXG4gICAgICB0aGlzLl9fZXllVmVjLFxuICAgICAgdGhpcy5fX2NlbnRlclZlYyxcbiAgICAgIE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcFZlYzNfMFxuICAgICk7XG5cbiAgICBjZW50ZXJUb0V5ZVZlYy5tdWx0aXBseSh0aGlzLl9fZG9sbHkgKiB0aGlzLmRvbGx5U2NhbGUpO1xuICAgIHRoaXMuX19sZW5ndGhPZkNlbnRlclRvRXllID0gY2VudGVyVG9FeWVWZWMubGVuZ3RoKCk7XG5cbiAgICBjb25zdCBuZXdVcFZlYyA9IHRoaXMuX19uZXdVcFZlYztcbiAgICBjb25zdCBuZXdFeWVWZWMgPSB0aGlzLl9fbmV3RXllVmVjO1xuICAgIGNvbnN0IG5ld0NlbnRlclZlYyA9IHRoaXMuX19uZXdDZW50ZXJWZWM7XG4gICAgY29uc3QgbmV3VGFuZ2VudFZlYyA9IHRoaXMuX19uZXdUYW5nZW50VmVjO1xuXG4gICAgaWYgKHRoaXMuX19pc1N5bW1ldHJ5TW9kZSkge1xuICAgICAgY29uc3QgcHJvamVjdGVkQ2VudGVyVG9FeWVWZWMgPSBPcmJpdENhbWVyYUNvbnRyb2xsZXIuX190bXBWZWMzXzE7XG4gICAgICBwcm9qZWN0ZWRDZW50ZXJUb0V5ZVZlYy5zZXRDb21wb25lbnRzKGNlbnRlclRvRXllVmVjLngsIDAsIGNlbnRlclRvRXllVmVjLnopO1xuXG4gICAgICBsZXQgaG9yaXpvbnRhbEFuZ2xlT2ZWZWN0b3JzID0gVmVjdG9yMy5hbmdsZU9mVmVjdG9ycyhcbiAgICAgICAgcHJvamVjdGVkQ2VudGVyVG9FeWVWZWMsXG4gICAgICAgIE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF91cFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhvcml6b250YWxTaWduID0gTWF0aC5zaWduKFxuICAgICAgICBwcm9qZWN0ZWRDZW50ZXJUb0V5ZVZlYy5jcm9zcyhPcmJpdENhbWVyYUNvbnRyb2xsZXIuX190bXBfdXApLnlcbiAgICAgICk7XG4gICAgICBob3Jpem9udGFsQW5nbGVPZlZlY3RvcnMgKj0gaG9yaXpvbnRhbFNpZ247XG5cbiAgICAgIGNvbnN0IHJvdGF0ZU1fWCA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF9yb3RhdGVNX1g7XG4gICAgICBjb25zdCByb3RhdGVNX1kgPSBPcmJpdENhbWVyYUNvbnRyb2xsZXIuX190bXBfcm90YXRlTV9ZO1xuICAgICAgY29uc3Qgcm90YXRlTV9SZXNldCA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF9yb3RhdGVNX1Jlc2V0O1xuICAgICAgY29uc3Qgcm90YXRlTV9SZXZlcnQgPSBPcmJpdENhbWVyYUNvbnRyb2xsZXIuX190bXBfcm90YXRlTV9SZXZlcnQ7XG5cbiAgICAgIHJvdGF0ZU1fWC5yb3RhdGVYKE1hdGhVdGlsLmRlZ3JlZVRvUmFkaWFuKHRoaXMuX19yb3RfeSkpO1xuICAgICAgcm90YXRlTV9ZLnJvdGF0ZVkoTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4odGhpcy5fX3JvdF94KSk7XG4gICAgICByb3RhdGVNX1Jlc2V0LnJvdGF0ZVkoTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4oaG9yaXpvbnRhbEFuZ2xlT2ZWZWN0b3JzKSk7XG4gICAgICByb3RhdGVNX1JldmVydC5yb3RhdGVZKE1hdGhVdGlsLmRlZ3JlZVRvUmFkaWFuKC1ob3Jpem9udGFsQW5nbGVPZlZlY3RvcnMpKTtcblxuICAgICAgY29uc3Qgcm90YXRlTSA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF9yb3RhdGVNO1xuICAgICAgTXV0YWJsZU1hdHJpeDMzLm11bHRpcGx5VG8ocm90YXRlTV9YLCByb3RhdGVNX1Jlc2V0LCByb3RhdGVNKTtcbiAgICAgIHJvdGF0ZU0ubXVsdGlwbHlCeUxlZnQocm90YXRlTV9ZKTtcbiAgICAgIHJvdGF0ZU0ubXVsdGlwbHlCeUxlZnQocm90YXRlTV9SZXZlcnQpO1xuXG4gICAgICByb3RhdGVNLm11bHRpcGx5VmVjdG9yVG8odGhpcy5fX3VwVmVjLCBuZXdVcFZlYyk7XG4gICAgICByb3RhdGVNLm11bHRpcGx5VmVjdG9yVG8oY2VudGVyVG9FeWVWZWMsIG5ld0V5ZVZlYykuYWRkKHRoaXMuX19jZW50ZXJWZWMpO1xuICAgICAgbmV3Q2VudGVyVmVjLmNvcHlDb21wb25lbnRzKHRoaXMuX19jZW50ZXJWZWMpO1xuXG4gICAgICBjb25zdCBuZXdFeWVUb0NlbnRlclZlYyA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcFZlYzNfMjtcbiAgICAgIE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8obmV3Q2VudGVyVmVjLCBuZXdFeWVWZWMsIG5ld0V5ZVRvQ2VudGVyVmVjKTtcbiAgICAgIE11dGFibGVWZWN0b3IzLmNyb3NzVG8obmV3VXBWZWMsIG5ld0V5ZVRvQ2VudGVyVmVjLCBuZXdUYW5nZW50VmVjKTtcblxuICAgICAgbmV3RXllVmVjLmFkZCh0aGlzLl9fbW91c2VUcmFuc2xhdGVWZWMpO1xuICAgICAgbmV3Q2VudGVyVmVjLmFkZCh0aGlzLl9fbW91c2VUcmFuc2xhdGVWZWMpO1xuXG4gICAgICAvLyBjb25zdCBob3Jpem9uUmVzZXRWZWMgPSBPcmJpdENhbWVyYUNvbnRyb2xsZXIuX190bXBWZWMzXzI7XG4gICAgICAvLyByb3RhdGVNX1Jlc2V0Lm11bHRpcGx5VmVjdG9yVG8oY2VudGVyVG9FeWVWZWMsIGhvcml6b25SZXNldFZlYyk7XG5cbiAgICAgIC8vIHRoaXMuX192ZXJ0aWNhbEFuZ2xlT2ZWZWN0b3JzID0gVmVjdG9yMy5hbmdsZU9mVmVjdG9ycyhob3Jpem9uUmVzZXRWZWMsIE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF91cCk7XG4gICAgICAvLyBjb25zdCB2ZXJ0aWNhbFNpZ24gPSBNYXRoLnNpZ24oVmVjdG9yMy5jcm9zc1RvKGhvcml6b25SZXNldFZlYywgT3JiaXRDYW1lcmFDb250cm9sbGVyLl9fdG1wX3VwLCBPcmJpdENhbWVyYUNvbnRyb2xsZXIuX190bXBfdmVydGljYWxTaWduKS54KTtcblxuICAgICAgLy90aGlzLl92ZXJ0aWNhbEFuZ2xlT2ZWZWN0b3JzICo9IHZlcnRpY2FsU2lnbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgcm90YXRlTV9YID0gT3JiaXRDYW1lcmFDb250cm9sbGVyLl9fdG1wX3JvdGF0ZU1fWDtcbiAgICAgIGNvbnN0IHJvdGF0ZU1fWSA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF9yb3RhdGVNX1k7XG5cbiAgICAgIHJvdGF0ZU1fWC5yb3RhdGVYKE1hdGhVdGlsLmRlZ3JlZVRvUmFkaWFuKHRoaXMuX19yb3RfeSkpO1xuICAgICAgcm90YXRlTV9ZLnJvdGF0ZVkoTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4odGhpcy5fX3JvdF94KSk7XG5cbiAgICAgIGNvbnN0IHJvdGF0ZU0gPSBNdXRhYmxlTWF0cml4MzMubXVsdGlwbHlUbyhcbiAgICAgICAgcm90YXRlTV9ZLFxuICAgICAgICByb3RhdGVNX1gsXG4gICAgICAgIE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcF9yb3RhdGVNXG4gICAgICApO1xuXG4gICAgICByb3RhdGVNLm11bHRpcGx5VmVjdG9yVG8odGhpcy5fX3VwVmVjLCBuZXdVcFZlYyk7XG4gICAgICByb3RhdGVNLm11bHRpcGx5VmVjdG9yVG8oY2VudGVyVG9FeWVWZWMsIG5ld0V5ZVZlYykuYWRkKHRoaXMuX19jZW50ZXJWZWMpO1xuICAgICAgbmV3Q2VudGVyVmVjLmNvcHlDb21wb25lbnRzKHRoaXMuX19jZW50ZXJWZWMpO1xuXG4gICAgICBjb25zdCBuZXdFeWVUb0NlbnRlclZlYyA9IE9yYml0Q2FtZXJhQ29udHJvbGxlci5fX3RtcFZlYzNfMTtcbiAgICAgIE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8obmV3Q2VudGVyVmVjLCBuZXdFeWVWZWMsIG5ld0V5ZVRvQ2VudGVyVmVjKTtcbiAgICAgIE11dGFibGVWZWN0b3IzLmNyb3NzVG8obmV3VXBWZWMsIG5ld0V5ZVRvQ2VudGVyVmVjLCBuZXdUYW5nZW50VmVjKTtcblxuICAgICAgbmV3RXllVmVjLmFkZCh0aGlzLl9fbW91c2VUcmFuc2xhdGVWZWMpO1xuICAgICAgbmV3Q2VudGVyVmVjLmFkZCh0aGlzLl9fbW91c2VUcmFuc2xhdGVWZWMpO1xuICAgIH1cbiAgfVxuXG4gIF9fdXBkYXRlQ2FtZXJhQ29tcG9uZW50KGNhbWVyYTogQ2FtZXJhQ29tcG9uZW50KSB7XG4gICAgY29uc3QgZXllRGlyZWN0aW9uID0gT3JiaXRDYW1lcmFDb250cm9sbGVyLl9fdG1wVmVjM18wLmNvcHlDb21wb25lbnRzKHRoaXMuX19uZXdDZW50ZXJWZWMpO1xuICAgIGV5ZURpcmVjdGlvbi5zdWJ0cmFjdCh0aGlzLl9fbmV3RXllVmVjKS5ub3JtYWxpemUoKTtcbiAgICB0aGlzLl9jYWxjWk5lYXJJbm5lcihjYW1lcmEsIHRoaXMuX19uZXdFeWVWZWMsIGV5ZURpcmVjdGlvbik7XG4gICAgdGhpcy5fY2FsY1pGYXJJbm5lcihjYW1lcmEpO1xuXG4gICAgY29uc3QgcmF0aW8gPSBjYW1lcmEuekZhciAvIGNhbWVyYS56TmVhcjtcbiAgICBjb25zdCBtaW5SYXRpbyA9IHRoaXMuX19zY2FsZU9mWk5lYXJBbmRaRmFyO1xuICAgIGNvbnN0IHNjYWxlID0gcmF0aW8gLyBtaW5SYXRpbztcblxuICAgIGNvbnN0IG5ld0xlZnQgPSBjYW1lcmEubGVmdCArIHNjYWxlO1xuICAgIGNvbnN0IG5ld1JpZ2h0ID0gY2FtZXJhLnJpZ2h0ICsgc2NhbGU7XG4gICAgY29uc3QgbmV3VG9wID0gY2FtZXJhLnRvcCArIHNjYWxlO1xuICAgIGNvbnN0IG5ld0JvdHRvbSA9IGNhbWVyYS5ib3R0b20gKyBzY2FsZTtcblxuICAgIGNvbnN0IGZvdnkgPSB0aGlzLl9fZ2V0Rm92eUZyb21DYW1lcmEoY2FtZXJhKTtcbiAgICB0aGlzLl9fZm92eUJpYXMgPSBNYXRoLnRhbihNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbihmb3Z5IC8gMi4wKSk7XG5cbiAgICBjYW1lcmEuZXllSW5uZXIgPSB0aGlzLl9fbmV3RXllVmVjO1xuICAgIGNhbWVyYS5kaXJlY3Rpb25Jbm5lciA9IHRoaXMuX19uZXdDZW50ZXJWZWM7XG4gICAgY2FtZXJhLnVwSW5uZXIgPSB0aGlzLl9fbmV3VXBWZWM7XG4gICAgY2FtZXJhLmxlZnRJbm5lciA9IG5ld0xlZnQ7XG4gICAgY2FtZXJhLnJpZ2h0SW5uZXIgPSBuZXdSaWdodDtcbiAgICBjYW1lcmEudG9wSW5uZXIgPSBuZXdUb3A7XG4gICAgY2FtZXJhLmJvdHRvbUlubmVyID0gbmV3Qm90dG9tO1xuICAgIGNhbWVyYS5mb3Z5SW5uZXIgPSBmb3Z5O1xuICB9XG5cbiAgc2V0IHNjYWxlT2ZaTmVhckFuZFpGYXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX19zY2FsZU9mWk5lYXJBbmRaRmFyID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgZ2V0IHNjYWxlT2ZaTmVhckFuZFpGYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zY2FsZU9mWk5lYXJBbmRaRmFyO1xuICB9XG5cbiAgZ2V0IGlzTW91c2VEb3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9faXNNb3VzZURvd247XG4gIH1cblxuICBnZXQgbGFzdE1vdXNlRG93blRpbWVTdGFtcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9fbGFzdE1vdXNlRG93blRpbWVTdGFtcDtcbiAgfVxuXG4gIGdldCBsYXN0TW91c2VVcFRpbWVTdGFtcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9fbGFzdE1vdXNlVXBUaW1lU3RhbXA7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1hdHJpeDQ0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0NCc7XG5pbXBvcnQgeyBNYXRoQ2xhc3NVdGlsIH0gZnJvbSAnLi4vbWF0aC9NYXRoQ2xhc3NVdGlsJztcbmltcG9ydCB7IE1pc2NVdGlsIH0gZnJvbSAnLi4vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQgeyBJQ2FtZXJhQ29udHJvbGxlciB9IGZyb20gJy4vSUNhbWVyYUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MzMgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBBYnN0cmFjdENhbWVyYUNvbnRyb2xsZXIgfSBmcm9tICcuL0Fic3RyYWN0Q2FtZXJhQ29udHJvbGxlcic7XG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWwnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHtcbiAgSW5wdXRIYW5kbGVySW5mbyxcbiAgSW5wdXRNYW5hZ2VyLFxuICBJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUixcbn0gZnJvbSAnLi4vc3lzdGVtL0lucHV0TWFuYWdlcic7XG5pbXBvcnQgeyBBQUJCIH0gZnJvbSAnLi4vbWF0aC9BQUJCJztcbmltcG9ydCB7IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYUNvbnRyb2xsZXIvQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCc7XG5cbnR5cGUgS2V5Ym9hcmRFdmVudExpc3RlbmVyID0gKGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gYW55O1xuXG5leHBvcnQgY2xhc3MgV2Fsa1Rocm91Z2hDYW1lcmFDb250cm9sbGVyXG4gIGV4dGVuZHMgQWJzdHJhY3RDYW1lcmFDb250cm9sbGVyXG4gIGltcGxlbWVudHMgSUNhbWVyYUNvbnRyb2xsZXJcbntcbiAgcHJpdmF0ZSBfX3VwZGF0ZUNvdW50ID0gMDtcbiAgcHJpdmF0ZSBfaG9yaXpvbnRhbFNwZWVkOiBudW1iZXI7XG4gIHByaXZhdGUgX3ZlcnRpY2FsU3BlZWQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdHVyblNwZWVkOiBudW1iZXI7XG4gIHByaXZhdGUgX21vdXNlV2hlZWxTcGVlZFNjYWxlOiBudW1iZXI7XG4gIHByaXZhdGUgX2ludmVyc2VWZXJ0aWNhbFJvdGF0aW5nOiBib29sZWFuO1xuICBwcml2YXRlIF9pbnZlcnNlSG9yaXpvbnRhbFJvdGF0aW5nOiBib29sZWFuO1xuICBwcml2YXRlIF9vbktleWRvd246IEtleWJvYXJkRXZlbnRMaXN0ZW5lcjtcbiAgcHJpdmF0ZSBfaXNLZXlEb3duID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzTW91c2VEcmFnID0gZmFsc2U7XG4gIHByaXZhdGUgX2xhc3RLZXlDb2RlID0gLTE7XG4gIHByaXZhdGUgX29uS2V5dXA6IEtleWJvYXJkRXZlbnRMaXN0ZW5lcjtcbiAgcHJpdmF0ZSBfY3VycmVudERpciA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIC0xXSk7XG4gIHByaXZhdGUgX2N1cnJlbnRQb3MgPSBNdXRhYmxlVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAwXSk7XG4gIHByaXZhdGUgX2N1cnJlbnRDZW50ZXIgPSBNdXRhYmxlVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAtMV0pO1xuICBwcml2YXRlIF9jdXJyZW50SG9yaXpvbnRhbERpciA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIC0xXSk7XG4gIHByaXZhdGUgX25ld0RpciA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIC0xXSk7XG4gIHByaXZhdGUgX2lzTW91c2VEb3duID0gZmFsc2U7XG4gIHByaXZhdGUgX2NsaWNrZWRNb3VzZVhPbkNhbnZhcyA9IC0xO1xuICBwcml2YXRlIF9jbGlja2VkTW91c2VZT25DYW52YXMgPSAtMTtcbiAgcHJpdmF0ZSBfZHJhZ2dlZE1vdXNlWE9uQ2FudmFzID0gLTE7XG4gIHByaXZhdGUgX2RyYWdnZWRNb3VzZVlPbkNhbnZhcyA9IC0xO1xuICBwcml2YXRlIF9kZWx0YU1vdXNlWE9uQ2FudmFzID0gLTE7XG4gIHByaXZhdGUgX2RlbHRhTW91c2VZT25DYW52YXMgPSAtMTtcbiAgcHJpdmF0ZSBfbW91c2VYQWRqdXN0U2NhbGUgPSAxO1xuICBwcml2YXRlIF9tb3VzZVlBZGp1c3RTY2FsZSA9IDE7XG4gIHByaXZhdGUgX2RlbHRhWSA9IC0xO1xuICBwcml2YXRlIF9kZWx0YVggPSAtMTtcbiAgcHJpdmF0ZSBfbW91c2VVcEJpbmQgPSAodGhpcy5fbW91c2VVcCBhcyBhbnkpLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgX21vdXNlRG93bkJpbmQgPSAodGhpcy5fbW91c2VEb3duIGFzIGFueSkuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfbW91c2VNb3ZlQmluZCA9ICh0aGlzLl9tb3VzZU1vdmUgYXMgYW55KS5iaW5kKHRoaXMpO1xuICBwcml2YXRlIF9tb3VzZVdoZWVsQmluZCA9ICh0aGlzLl9tb3VzZVdoZWVsIGFzIGFueSkuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfZXZlbnRUYXJnZXREb20/OiBhbnk7XG4gIHByaXZhdGUgX19kb1ByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gIHByaXZhdGUgX25lZWRJbml0aWFsaXplID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIF9fdGFyZ2V0RW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10gPSBbXTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3RtcEludk1hdDogTXV0YWJsZU1hdHJpeDQ0ID0gTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wUm90YXRlTWF0OiBNdXRhYmxlTWF0cml4MzMgPSBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfVmVjM18wOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfVmVjM18xOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBwdWJsaWMgYWFiYldpdGhTa2VsZXRhbCA9IHRydWU7XG4gIHByaXZhdGUgX19jYW1lcmFDb250cm9sbGVyQ29tcG9uZW50OiBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQ6IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQsXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGV2ZW50VGFyZ2V0RG9tOiBkb2N1bWVudCxcbiAgICAgIHZlcnRpY2FsU3BlZWQ6IDEsXG4gICAgICBob3Jpem9udGFsU3BlZWQ6IDEsXG4gICAgICB0dXJuU3BlZWQ6IDAuMjUsXG4gICAgICBtb3VzZVdoZWVsU3BlZWRTY2FsZTogMSxcbiAgICAgIGludmVyc2VWZXJ0aWNhbFJvdGF0aW5nOiBmYWxzZSxcbiAgICAgIGludmVyc2VIb3Jpem9udGFsUm90YXRpbmc6IGZhbHNlLFxuICAgIH1cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9fY2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCA9IGNhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQ7XG5cbiAgICB0aGlzLl9ob3Jpem9udGFsU3BlZWQgPSBvcHRpb25zLmhvcml6b250YWxTcGVlZDtcbiAgICB0aGlzLl92ZXJ0aWNhbFNwZWVkID0gb3B0aW9ucy52ZXJ0aWNhbFNwZWVkO1xuICAgIHRoaXMuX3R1cm5TcGVlZCA9IG9wdGlvbnMudHVyblNwZWVkO1xuICAgIHRoaXMuX21vdXNlWEFkanVzdFNjYWxlID0gdGhpcy5fdHVyblNwZWVkO1xuICAgIHRoaXMuX21vdXNlWUFkanVzdFNjYWxlID0gdGhpcy5fdHVyblNwZWVkO1xuICAgIHRoaXMuX21vdXNlV2hlZWxTcGVlZFNjYWxlID0gb3B0aW9ucy5tb3VzZVdoZWVsU3BlZWRTY2FsZTtcbiAgICB0aGlzLl9pbnZlcnNlVmVydGljYWxSb3RhdGluZyA9IG9wdGlvbnMuaW52ZXJzZVZlcnRpY2FsUm90YXRpbmc7XG4gICAgdGhpcy5faW52ZXJzZUhvcml6b250YWxSb3RhdGluZyA9IG9wdGlvbnMuaW52ZXJzZUhvcml6b250YWxSb3RhdGluZztcblxuICAgIHRoaXMucmVzZXQoKTtcblxuICAgIHRoaXMuX29uS2V5ZG93biA9IChlKSA9PiB7XG4gICAgICB0aGlzLl9pc0tleURvd24gPSB0cnVlO1xuICAgICAgdGhpcy5fbGFzdEtleUNvZGUgPSBlLmtleUNvZGU7XG4gICAgfTtcblxuICAgIHRoaXMuX29uS2V5dXAgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5faXNLZXlEb3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9sYXN0S2V5Q29kZSA9IC0xO1xuICAgIH07XG5cbiAgICBjb25zdCBldmVudFRhcmdldERvbSA9IG9wdGlvbnMuZXZlbnRUYXJnZXREb207XG5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoZXZlbnRUYXJnZXREb20pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ291bnQoKSB7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gICAgdGhpcy5fX2NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQuX3VwZGF0ZUNvdW50KHRoaXMuX191cGRhdGVDb3VudCk7XG4gIH1cblxuICBnZXQgdXBkYXRlQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX191cGRhdGVDb3VudDtcbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoZXZlbnRUYXJnZXREb206IERvY3VtZW50ID0gZG9jdW1lbnQpIHtcbiAgICB0aGlzLl9ldmVudFRhcmdldERvbSA9IGV2ZW50VGFyZ2V0RG9tO1xuXG4gICAgY29uc3QgaW5wdXRIYW5kbGVySW5mb3M6IElucHV0SGFuZGxlckluZm9bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgZXZlbnROYW1lOiAna2V5ZG93bicsXG4gICAgICAgIGhhbmRsZXI6IHRoaXMuX29uS2V5ZG93bixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBldmVudE5hbWU6ICdrZXl1cCcsXG4gICAgICAgIGhhbmRsZXI6IHRoaXMuX29uS2V5dXAsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmICgnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQpIHtcbiAgICAgIGlucHV0SGFuZGxlckluZm9zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICd0b3VjaHN0YXJ0JyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9tb3VzZURvd25CaW5kLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICd0b3VjaGVuZCcsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fbW91c2VVcEJpbmQsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ3RvdWNobW92ZScsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fbW91c2VNb3ZlQmluZCxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoJ29ubW91c2V1cCcgaW4gZG9jdW1lbnQpIHtcbiAgICAgIGlucHV0SGFuZGxlckluZm9zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdtb3VzZWRvd24nLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX21vdXNlRG93bkJpbmQsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ21vdXNldXAnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX21vdXNlVXBCaW5kLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdtb3VzZWxlYXZlJyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9tb3VzZVVwQmluZCxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBwYXNzaXZlOiAhdGhpcy5fX2RvUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9tb3VzZU1vdmVCaW5kLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhc3NpdmU6ICF0aGlzLl9fZG9QcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICgnb253aGVlbCcgaW4gZG9jdW1lbnQpIHtcbiAgICAgIGlucHV0SGFuZGxlckluZm9zLnB1c2goe1xuICAgICAgICBldmVudE5hbWU6ICd3aGVlbCcsXG4gICAgICAgIGhhbmRsZXI6IHRoaXMuX21vdXNlV2hlZWxCaW5kLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGFzc2l2ZTogIXRoaXMuX19kb1ByZXZlbnREZWZhdWx0LFxuICAgICAgICB9LFxuICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICBldmVudFRhcmdldERvbSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIElucHV0TWFuYWdlci5yZWdpc3RlcihJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUiwgaW5wdXRIYW5kbGVySW5mb3MpO1xuICB9XG5cbiAgdW5yZWdpc3RlckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIElucHV0TWFuYWdlci51bnJlZ2lzdGVyKElOUFVUX0hBTkRMSU5HX1NUQVRFX0NBTUVSQV9DT05UUk9MTEVSKTtcbiAgfVxuXG4gIHByaXZhdGUgX190cnlUb1ByZXZlbnREZWZhdWx0KGV2dDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5fX2RvUHJldmVudERlZmF1bHQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9tb3VzZVdoZWVsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICBpZiAodGhpcy5fY3VycmVudERpciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWx0YSA9XG4gICAgICAtMSAqIE1hdGguc2lnbigoZSBhcyBhbnkpLmRlbHRhWSkgKiB0aGlzLl9tb3VzZVdoZWVsU3BlZWRTY2FsZSAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICBjb25zdCBob3Jpem9udGFsRGlyID0gV2Fsa1Rocm91Z2hDYW1lcmFDb250cm9sbGVyLl9fdG1wX1ZlYzNfMDtcbiAgICBob3Jpem9udGFsRGlyLnNldENvbXBvbmVudHModGhpcy5fY3VycmVudERpci54LCAwLCB0aGlzLl9jdXJyZW50RGlyLnopLm5vcm1hbGl6ZSgpO1xuXG4gICAgY29uc3QgZGVsdGFWZWMgPSBNdXRhYmxlVmVjdG9yMy5tdWx0aXBseVRvKFxuICAgICAgaG9yaXpvbnRhbERpcixcbiAgICAgIGRlbHRhLFxuICAgICAgV2Fsa1Rocm91Z2hDYW1lcmFDb250cm9sbGVyLl9fdG1wX1ZlYzNfMVxuICAgICk7XG4gICAgdGhpcy5fY3VycmVudFBvcy5hZGQoZGVsdGFWZWMpO1xuICAgIHRoaXMuX2N1cnJlbnRDZW50ZXIuYWRkKGRlbHRhVmVjKTtcblxuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBfbW91c2VEb3duKGV2dDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuX190cnlUb1ByZXZlbnREZWZhdWx0KGV2dCk7XG4gICAgdGhpcy5faXNNb3VzZURvd24gPSB0cnVlO1xuXG4gICAgY29uc3QgcmVjdCA9IChldnQudGFyZ2V0ISBhcyBhbnkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuX2NsaWNrZWRNb3VzZVhPbkNhbnZhcyA9IGV2dC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuX2NsaWNrZWRNb3VzZVlPbkNhbnZhcyA9IGV2dC5jbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICB0aGlzLl91cGRhdGVDb3VudCgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9tb3VzZU1vdmUoZXZ0OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5fX3RyeVRvUHJldmVudERlZmF1bHQoZXZ0KTtcbiAgICBpZiAoIXRoaXMuX2lzTW91c2VEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IChldnQudGFyZ2V0ISBhcyBhbnkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuX2RyYWdnZWRNb3VzZVhPbkNhbnZhcyA9IGV2dC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuX2RyYWdnZWRNb3VzZVlPbkNhbnZhcyA9IGV2dC5jbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICB0aGlzLl9kZWx0YU1vdXNlWE9uQ2FudmFzID0gdGhpcy5fZHJhZ2dlZE1vdXNlWE9uQ2FudmFzIC0gdGhpcy5fY2xpY2tlZE1vdXNlWE9uQ2FudmFzO1xuICAgIHRoaXMuX2RlbHRhTW91c2VZT25DYW52YXMgPSB0aGlzLl9kcmFnZ2VkTW91c2VZT25DYW52YXMgLSB0aGlzLl9jbGlja2VkTW91c2VZT25DYW52YXM7XG5cbiAgICB0aGlzLl9pc01vdXNlRHJhZyA9IHRydWU7XG4gICAgdGhpcy5fdXBkYXRlQ291bnQoKTtcbiAgfVxuXG4gIF9tb3VzZVVwKGV2dDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuX2lzTW91c2VEb3duID0gZmFsc2U7XG4gICAgdGhpcy5faXNNb3VzZURyYWcgPSBmYWxzZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgYW55O1xuICAgIGlmICh0YXJnZXQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLl9jbGlja2VkTW91c2VYT25DYW52YXMgPSBldnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB0aGlzLl9jbGlja2VkTW91c2VZT25DYW52YXMgPSBldnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICB0cnlSZXNldCgpIHt9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5faXNLZXlEb3duID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdEtleUNvZGUgPSAtMTtcbiAgICB0aGlzLl9jdXJyZW50UG9zLnplcm8oKTtcbiAgICB0aGlzLl9jdXJyZW50Q2VudGVyLnNldENvbXBvbmVudHMoMCwgMCwgLTEpO1xuICAgIHRoaXMuX2N1cnJlbnREaXIuc2V0Q29tcG9uZW50cygwLCAwLCAtMSk7XG4gICAgdGhpcy5fY3VycmVudEhvcml6b250YWxEaXIuc2V0Q29tcG9uZW50cygwLCAwLCAtMSk7XG4gICAgdGhpcy5faXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc01vdXNlRHJhZyA9IGZhbHNlO1xuICAgIHRoaXMuX2RyYWdnZWRNb3VzZVhPbkNhbnZhcyA9IC0xO1xuICAgIHRoaXMuX2RyYWdnZWRNb3VzZVlPbkNhbnZhcyA9IC0xO1xuICAgIHRoaXMuX2RlbHRhTW91c2VYT25DYW52YXMgPSAtMTtcbiAgICB0aGlzLl9kZWx0YU1vdXNlWU9uQ2FudmFzID0gLTE7XG4gICAgdGhpcy5fbW91c2VYQWRqdXN0U2NhbGUgPSB0aGlzLl90dXJuU3BlZWQ7XG4gICAgdGhpcy5fbW91c2VZQWRqdXN0U2NhbGUgPSB0aGlzLl90dXJuU3BlZWQ7XG4gICAgdGhpcy5fZGVsdGFZID0gMDtcbiAgICB0aGlzLl9kZWx0YVggPSAwO1xuICAgIHRoaXMuX25ld0Rpci5zZXRDb21wb25lbnRzKDAsIDAsIC0xKTtcbiAgfVxuXG4gIGxvZ2ljKGNhbWVyYUNvbXBvbmVudDogQ2FtZXJhQ29tcG9uZW50KSB7XG4gICAgdGhpcy5fX3VwZGF0ZUNhbWVyYUNvbXBvbmVudChjYW1lcmFDb21wb25lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3VwZGF0ZUNhbWVyYUNvbXBvbmVudChjYW1lcmE6IENhbWVyYUNvbXBvbmVudCkge1xuICAgIGNvbnN0IGFhYmIgPSBuZXcgQUFCQigpO1xuICAgIGZvciAoY29uc3QgdGFyZ2V0RW50aXR5IG9mIHRoaXMuX190YXJnZXRFbnRpdGllcykge1xuICAgICAgYWFiYi5tZXJnZUFBQkIodGhpcy5fX2dldFRhcmdldEFBQkIodGFyZ2V0RW50aXR5KSk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEFBQkIgPSBhYWJiO1xuICAgIGlmICh0aGlzLl9uZWVkSW5pdGlhbGl6ZSAmJiB0YXJnZXRBQUJCICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGxlbmd0aENlbnRlclRvQ2FtZXJhID1cbiAgICAgICAgdGFyZ2V0QUFCQi5sZW5ndGhDZW50ZXJUb0Nvcm5lciAqXG4gICAgICAgICgxLjAgKyAxLjAgLyBNYXRoLnRhbihNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbihjYW1lcmEuZm92eSAvIDIuMCkpKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRQb3MuY29weUNvbXBvbmVudHModGFyZ2V0QUFCQi5jZW50ZXJQb2ludCk7XG4gICAgICB0aGlzLl9jdXJyZW50UG9zLnogKz0gbGVuZ3RoQ2VudGVyVG9DYW1lcmE7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRDZW50ZXIuY29weUNvbXBvbmVudHModGFyZ2V0QUFCQi5jZW50ZXJQb2ludCk7XG4gICAgICB0aGlzLl9jdXJyZW50RGlyLnNldENvbXBvbmVudHMoMCwgMCwgLTEpO1xuXG4gICAgICBjb25zdCBzY2VuZUNvbXBvbmVudCA9IGNhbWVyYS5lbnRpdHkudHJ5VG9HZXRTY2VuZUdyYXBoKCk7XG4gICAgICBpZiAoSXMuZXhpc3Qoc2NlbmVDb21wb25lbnQpKSB7XG4gICAgICAgIGNvbnN0IGludk1hdCA9IE1hdHJpeDQ0LmludmVydFRvKFxuICAgICAgICAgIHNjZW5lQ29tcG9uZW50Lm1hdHJpeElubmVyLFxuICAgICAgICAgIFdhbGtUaHJvdWdoQ2FtZXJhQ29udHJvbGxlci5fX3RtcEludk1hdFxuICAgICAgICApO1xuICAgICAgICBpbnZNYXQubXVsdGlwbHlWZWN0b3IzVG8odGhpcy5fY3VycmVudFBvcywgdGhpcy5fY3VycmVudFBvcyk7XG4gICAgICAgIGludk1hdC5tdWx0aXBseVZlY3RvcjNUbyh0aGlzLl9jdXJyZW50Q2VudGVyLCB0aGlzLl9jdXJyZW50Q2VudGVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbmVlZEluaXRpYWxpemUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ID0gdGhpcy5fZGVsdGFZIC8gOTA7XG4gICAgdGhpcy5fbmV3RGlyLnggPSB0aGlzLl9jdXJyZW50RGlyLnggKiAoMSAtIHQpO1xuICAgIHRoaXMuX25ld0Rpci55ID0gdDtcbiAgICB0aGlzLl9uZXdEaXIueiA9IHRoaXMuX2N1cnJlbnREaXIueiAqICgxIC0gdCk7XG4gICAgdGhpcy5fbmV3RGlyLm5vcm1hbGl6ZSgpO1xuXG4gICAgdGhpcy5fY3VycmVudEhvcml6b250YWxEaXIueCA9IHRoaXMuX2N1cnJlbnREaXIueDtcbiAgICB0aGlzLl9jdXJyZW50SG9yaXpvbnRhbERpci55ID0gMDtcbiAgICB0aGlzLl9jdXJyZW50SG9yaXpvbnRhbERpci56ID0gdGhpcy5fY3VycmVudERpci56O1xuICAgIHRoaXMuX2N1cnJlbnRIb3Jpem9udGFsRGlyLm5vcm1hbGl6ZSgpO1xuXG4gICAgY29uc3QgbW92ZVZlY3RvciA9IFdhbGtUaHJvdWdoQ2FtZXJhQ29udHJvbGxlci5fX3RtcF9WZWMzXzAuemVybygpO1xuICAgIHN3aXRjaCAodGhpcy5fbGFzdEtleUNvZGUpIHtcbiAgICAgIGNhc2UgODc6IC8vIHcga2V5XG4gICAgICBjYXNlIDM4OiAvLyBhcnJvdyB1cHBlciBrZXlcbiAgICAgICAgbW92ZVZlY3Rvci54ID0gdGhpcy5fY3VycmVudEhvcml6b250YWxEaXIueCAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICAgICAgbW92ZVZlY3Rvci56ID0gdGhpcy5fY3VycmVudEhvcml6b250YWxEaXIueiAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY1OiAvLyBhIGtleVxuICAgICAgY2FzZSAzNzogLy8gYXJyb3cgbGVmdCBrZXlcbiAgICAgICAgbW92ZVZlY3Rvci54ID0gdGhpcy5fY3VycmVudEhvcml6b250YWxEaXIueiAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICAgICAgbW92ZVZlY3Rvci56ID0gLXRoaXMuX2N1cnJlbnRIb3Jpem9udGFsRGlyLnggKiB0aGlzLl9ob3Jpem9udGFsU3BlZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4MzogLy8gcyBrZXlcbiAgICAgIGNhc2UgNDA6IC8vIGFycm93IGRvd24ga2V5XG4gICAgICAgIG1vdmVWZWN0b3IueCA9IC10aGlzLl9jdXJyZW50SG9yaXpvbnRhbERpci54ICogdGhpcy5faG9yaXpvbnRhbFNwZWVkO1xuICAgICAgICBtb3ZlVmVjdG9yLnogPSAtdGhpcy5fY3VycmVudEhvcml6b250YWxEaXIueiAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY4OiAvLyBkIGtleVxuICAgICAgY2FzZSAzOTogLy8gYXJyb3cgcmlnaHQga2V5XG4gICAgICAgIG1vdmVWZWN0b3IueCA9IC10aGlzLl9jdXJyZW50SG9yaXpvbnRhbERpci56ICogdGhpcy5faG9yaXpvbnRhbFNwZWVkO1xuICAgICAgICBtb3ZlVmVjdG9yLnogPSB0aGlzLl9jdXJyZW50SG9yaXpvbnRhbERpci54ICogdGhpcy5faG9yaXpvbnRhbFNwZWVkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgODE6IC8vIHEga2V5XG4gICAgICAgIG1vdmVWZWN0b3IueCA9IC10aGlzLl9uZXdEaXIueCAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICAgICAgbW92ZVZlY3Rvci55ID0gLXRoaXMuX25ld0Rpci55ICogdGhpcy5faG9yaXpvbnRhbFNwZWVkO1xuICAgICAgICBtb3ZlVmVjdG9yLnogPSAtdGhpcy5fbmV3RGlyLnogKiB0aGlzLl9ob3Jpem9udGFsU3BlZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OTogLy8gZSBrZXlcbiAgICAgICAgbW92ZVZlY3Rvci54ID0gdGhpcy5fbmV3RGlyLnggKiB0aGlzLl9ob3Jpem9udGFsU3BlZWQ7XG4gICAgICAgIG1vdmVWZWN0b3IueSA9IHRoaXMuX25ld0Rpci55ICogdGhpcy5faG9yaXpvbnRhbFNwZWVkO1xuICAgICAgICBtb3ZlVmVjdG9yLnogPSB0aGlzLl9uZXdEaXIueiAqIHRoaXMuX2hvcml6b250YWxTcGVlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDgyOiAvLyByIGtleVxuICAgICAgICBtb3ZlVmVjdG9yLnkgPSB0aGlzLl92ZXJ0aWNhbFNwZWVkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzA6IC8vIGYga2V5XG4gICAgICAgIG1vdmVWZWN0b3IueSA9IC10aGlzLl92ZXJ0aWNhbFNwZWVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5fY3VycmVudFBvcy5hZGQobW92ZVZlY3Rvcik7XG4gICAgdGhpcy5fY3VycmVudENlbnRlci5hZGQobW92ZVZlY3Rvcik7XG5cbiAgICBpZiAodGhpcy5faXNNb3VzZURyYWcpIHtcbiAgICAgIGlmICh0aGlzLl9pbnZlcnNlSG9yaXpvbnRhbFJvdGF0aW5nKSB7XG4gICAgICAgIHRoaXMuX2RlbHRhWCA9IHRoaXMuX2RlbHRhTW91c2VYT25DYW52YXMgKiB0aGlzLl9tb3VzZVhBZGp1c3RTY2FsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RlbHRhWCA9IC10aGlzLl9kZWx0YU1vdXNlWE9uQ2FudmFzICogdGhpcy5fbW91c2VYQWRqdXN0U2NhbGU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5faW52ZXJzZVZlcnRpY2FsUm90YXRpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVsdGFZICs9IHRoaXMuX2RlbHRhTW91c2VZT25DYW52YXMgKiB0aGlzLl9tb3VzZVlBZGp1c3RTY2FsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RlbHRhWSArPSAtdGhpcy5fZGVsdGFNb3VzZVlPbkNhbnZhcyAqIHRoaXMuX21vdXNlWUFkanVzdFNjYWxlO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGVsdGFZID0gTWF0aC5tYXgoLTEyMCwgTWF0aC5taW4oNTAsIHRoaXMuX2RlbHRhWSkpO1xuXG4gICAgICBjb25zdCByb3RhdGVNYXRyaXggPSBXYWxrVGhyb3VnaENhbWVyYUNvbnRyb2xsZXIuX190bXBSb3RhdGVNYXQucm90YXRlWShcbiAgICAgICAgTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4odGhpcy5fZGVsdGFYKVxuICAgICAgKTtcbiAgICAgIHJvdGF0ZU1hdHJpeC5tdWx0aXBseVZlY3RvclRvKHRoaXMuX2N1cnJlbnREaXIsIHRoaXMuX2N1cnJlbnREaXIpO1xuXG4gICAgICBjb25zdCBuZXdFeWVUb0NlbnRlciA9IE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8oXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDZW50ZXIsXG4gICAgICAgIHRoaXMuX2N1cnJlbnRQb3MsXG4gICAgICAgIFdhbGtUaHJvdWdoQ2FtZXJhQ29udHJvbGxlci5fX3RtcF9WZWMzXzFcbiAgICAgICkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gICAgICByb3RhdGVNYXRyaXgubXVsdGlwbHlWZWN0b3JUbyhuZXdFeWVUb0NlbnRlciwgbmV3RXllVG9DZW50ZXIpO1xuICAgICAgbmV3RXllVG9DZW50ZXIueCA9IG5ld0V5ZVRvQ2VudGVyLnggKiAoMSAtIHQpO1xuICAgICAgbmV3RXllVG9DZW50ZXIueSA9IHQ7XG4gICAgICBuZXdFeWVUb0NlbnRlci56ID0gbmV3RXllVG9DZW50ZXIueiAqICgxIC0gdCk7XG4gICAgICBuZXdFeWVUb0NlbnRlci5ub3JtYWxpemUoKTtcblxuICAgICAgdGhpcy5fY3VycmVudENlbnRlci5jb3B5Q29tcG9uZW50cyh0aGlzLl9jdXJyZW50UG9zKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRDZW50ZXIuYWRkKG5ld0V5ZVRvQ2VudGVyKTtcblxuICAgICAgdGhpcy5fY2xpY2tlZE1vdXNlWE9uQ2FudmFzID0gdGhpcy5fZHJhZ2dlZE1vdXNlWE9uQ2FudmFzO1xuICAgICAgdGhpcy5fY2xpY2tlZE1vdXNlWU9uQ2FudmFzID0gdGhpcy5fZHJhZ2dlZE1vdXNlWU9uQ2FudmFzO1xuICAgICAgdGhpcy5fZGVsdGFNb3VzZVhPbkNhbnZhcyA9IDA7XG4gICAgICB0aGlzLl9kZWx0YU1vdXNlWU9uQ2FudmFzID0gMDtcbiAgICB9XG5cbiAgICBjYW1lcmEuZXllSW5uZXIgPSB0aGlzLl9jdXJyZW50UG9zO1xuICAgIGNhbWVyYS5kaXJlY3Rpb25Jbm5lciA9IHRoaXMuX2N1cnJlbnRDZW50ZXI7XG4gICAgY2FtZXJhLnVwSW5uZXIgPSAoY2FtZXJhIGFzIGFueSkuX3VwO1xuICAgIGNhbWVyYS5sZWZ0SW5uZXIgPSBjYW1lcmEubGVmdDtcbiAgICBjYW1lcmEucmlnaHRJbm5lciA9IGNhbWVyYS5yaWdodDtcbiAgICBjYW1lcmEudG9wSW5uZXIgPSBjYW1lcmEudG9wO1xuICAgIGNhbWVyYS5ib3R0b21Jbm5lciA9IGNhbWVyYS5ib3R0b207XG4gICAgY2FtZXJhLmZvdnlJbm5lciA9IGNhbWVyYS5mb3Z5O1xuXG4gICAgdGhpcy5fY2FsY1pOZWFySW5uZXIoY2FtZXJhLCB0aGlzLl9jdXJyZW50UG9zLCB0aGlzLl9uZXdEaXIpO1xuICAgIHRoaXMuX2NhbGNaRmFySW5uZXIoY2FtZXJhKTtcbiAgfVxuICBnZXREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDZW50ZXIgIT09IG51bGwgPyB0aGlzLl9uZXdEaXIuY2xvbmUoKSA6IG51bGw7XG4gIH1cblxuICBzZXQgaG9yaXpvbnRhbFNwZWVkKHZhbHVlKSB7XG4gICAgdGhpcy5faG9yaXpvbnRhbFNwZWVkID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaG9yaXpvbnRhbFNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLl9ob3Jpem9udGFsU3BlZWQ7XG4gIH1cblxuICBzZXQgdmVydGljYWxTcGVlZCh2YWx1ZSkge1xuICAgIHRoaXMuX3ZlcnRpY2FsU3BlZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCB2ZXJ0aWNhbFNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLl92ZXJ0aWNhbFNwZWVkO1xuICB9XG5cbiAgc2V0IG1vdXNlV2hlZWxTcGVlZCh2YWx1ZSkge1xuICAgIHRoaXMuX21vdXNlV2hlZWxTcGVlZFNjYWxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbW91c2VXaGVlbFNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLl9tb3VzZVdoZWVsU3BlZWRTY2FsZTtcbiAgfVxuXG4gIHNldFRhcmdldCh0YXJnZXRFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgdGhpcy5zZXRUYXJnZXRzKFt0YXJnZXRFbnRpdHldKTtcbiAgfVxuXG4gIHByaXZhdGUgX19nZXRUYXJnZXRBQUJCKHRhcmdldEVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBpZiAodGhpcy5hYWJiV2l0aFNrZWxldGFsKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0RW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpIS53b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0YXJnZXRFbnRpdHkudHJ5VG9HZXRTY2VuZUdyYXBoKCkhLndvcmxkTWVyZ2VkQUFCQjtcbiAgICB9XG4gIH1cblxuICBzZXRUYXJnZXRzKHRhcmdldEVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdKSB7XG4gICAgY29uc3QgYWFiYiA9IG5ldyBBQUJCKCk7XG4gICAgZm9yIChjb25zdCB0YXJnZXRFbnRpdHkgb2YgdGFyZ2V0RW50aXRpZXMpIHtcbiAgICAgIGFhYmIubWVyZ2VBQUJCKHRoaXMuX19nZXRUYXJnZXRBQUJCKHRhcmdldEVudGl0eSkpO1xuICAgIH1cbiAgICBjb25zdCBzcGVlZCA9IGFhYmIubGVuZ3RoQ2VudGVyVG9Db3JuZXIgLyAxMDtcbiAgICB0aGlzLnZlcnRpY2FsU3BlZWQgPSBzcGVlZDtcbiAgICB0aGlzLmhvcml6b250YWxTcGVlZCA9IHNwZWVkO1xuXG4gICAgdGhpcy5fX3RhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXM7XG4gICAgdGhpcy5fbmVlZEluaXRpYWxpemUgPSB0cnVlO1xuICAgIHRoaXMuX3VwZGF0ZUNvdW50KCk7XG4gIH1cblxuICBnZXRUYXJnZXRzKCk6IElTY2VuZUdyYXBoRW50aXR5W10ge1xuICAgIHJldHVybiB0aGlzLl9fdGFyZ2V0RW50aXRpZXM7XG4gIH1cblxuICBnZXQgYWxsSW5mbygpIHtcbiAgICBjb25zdCBpbmZvOiBhbnkgPSB7fTtcblxuICAgIGluZm8udmVydGljYWxTcGVlZCA9IHRoaXMudmVydGljYWxTcGVlZDtcbiAgICBpbmZvLmhvcml6b250YWxTcGVlZCA9IHRoaXMuaG9yaXpvbnRhbFNwZWVkO1xuICAgIGluZm8uX3R1cm5TcGVlZCA9IHRoaXMuX3R1cm5TcGVlZDtcbiAgICBpZiAodGhpcy5fY3VycmVudFBvcykge1xuICAgICAgaW5mby5fY3VycmVudFBvcyA9IHRoaXMuX2N1cnJlbnRQb3MuY2xvbmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRDZW50ZXIpIHtcbiAgICAgIGluZm8uX2N1cnJlbnRDZW50ZXIgPSB0aGlzLl9jdXJyZW50Q2VudGVyLmNsb25lKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jdXJyZW50RGlyKSB7XG4gICAgICBpbmZvLl9jdXJyZW50RGlyID0gdGhpcy5fY3VycmVudERpci5jbG9uZSgpO1xuICAgIH1cbiAgICBpbmZvLl9kZWx0YVkgPSB0aGlzLl9kZWx0YVk7XG4gICAgaW5mby5fbmV3RGlyID0gdGhpcy5fbmV3RGlyLmNsb25lKCk7XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIHNldCBhbGxJbmZvKGFyZykge1xuICAgIGxldCBqc29uID0gYXJnO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAganNvbiA9IEpTT04ucGFyc2UoYXJnKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKGpzb24uaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkgaW4gdGhpcykge1xuICAgICAgICBpZiAoa2V5ID09PSAncXVhdGVybmlvbicpIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW2tleV0gPSBNYXRoQ2xhc3NVdGlsLmNsb25lT2ZNYXRoT2JqZWN0cyhcbiAgICAgICAgICAgIE1hdGhDbGFzc1V0aWwuYXJyYXlUb1F1YXRlcm5pb24oanNvbltrZXldKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtrZXldID0gTWF0aENsYXNzVXRpbC5jbG9uZU9mTWF0aE9iamVjdHMoXG4gICAgICAgICAgICBNYXRoQ2xhc3NVdGlsLmFycmF5VG9WZWN0b3JPck1hdHJpeChqc29uW2tleV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BYnN0cmFjdENhbWVyYUNvbnRyb2xsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9JQ2FtZXJhQ29udHJvbGxlcic7XG5leHBvcnQgKiBmcm9tICcuL09yYml0Q2FtZXJhQ29udHJvbGxlcic7XG5leHBvcnQgKiBmcm9tICcuL1dhbGtUaHJvdWdoQ2FtZXJhQ29udHJvbGxlcic7XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IGFwcGx5TWl4aW5zLCBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IEFuaW1hdGlvbkludGVycG9sYXRpb25FbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQW5pbWF0aW9uSW50ZXJwb2xhdGlvbic7XG5pbXBvcnQgeyBBbmltYXRpb25BdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9BbmltYXRpb25BdHRyaWJ1dGUnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50VElELFxuICBDb21wb25lbnRTSUQsXG4gIEVudGl0eVVJRCxcbiAgSW5kZXgsXG4gIEFycmF5NCxcbiAgQXJyYXkzLFxuICBWZWN0b3JDb21wb25lbnROLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQge1xuICBBbmltYXRpb25QYXRoTmFtZSxcbiAgQW5pbWF0aW9uVHJhY2ssXG4gIEFuaW1hdGlvbkNvbXBvbmVudEV2ZW50VHlwZSxcbiAgQW5pbWF0aW9uSW5mbyxcbiAgQW5pbWF0aW9uVHJhY2tOYW1lLFxuICBBbmltYXRpb25DaGFubmVsLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcy9BbmltYXRpb25UeXBlcyc7XG5pbXBvcnQgeyB2YWx1ZVdpdGhEZWZhdWx0LCB2YWx1ZVdpdGhDb21wZW5zYXRpb24gfSBmcm9tICcuLi8uLi9taXNjL01pc2NVdGlsJztcbmltcG9ydCB7IEV2ZW50UHViU3ViLCBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi8uLi9zeXN0ZW0vRXZlbnRQdWJTdWInO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBJQW5pbWF0aW9uRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5JztcbmltcG9ydCB7IENvbXBvbmVudFRvQ29tcG9uZW50TWV0aG9kcyB9IGZyb20gJy4uL0NvbXBvbmVudFR5cGVzJztcbmltcG9ydCB7IElBbmltYXRpb25SZXRhcmdldCB9IGZyb20gJy4uL1NrZWxldGFsJztcbmltcG9ydCB7IF9faW50ZXJwb2xhdGUgfSBmcm9tICcuL0FuaW1hdGlvbk9wcyc7XG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gJy4uLy4uL21hdGgnO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMnO1xuXG5jb25zdCBkZWZhdWx0QW5pbWF0aW9uSW5mbyA9IHtcbiAgbmFtZTogJycsXG4gIG1pblN0YXJ0SW5wdXRUaW1lOiAwLFxuICBtYXhFbmRJbnB1dFRpbWU6IDAsXG59O1xuXG5jb25zdCBDaGFuZ2VBbmltYXRpb25JbmZvID0gU3ltYm9sKCdBbmltYXRpb25Db21wb25lbnRFdmVudENoYW5nZUFuaW1hdGlvbkluZm8nKTtcbmNvbnN0IFBsYXlFbmQgPSBTeW1ib2woJ0FuaW1hdGlvbkNvbXBvbmVudEV2ZW50UGxheUVuZCcpO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBhbmltYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25Db21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvLy8gaW5uZXIgc3RhdGVzIC8vL1xuICAvLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBBY3RpdmUgVHJhY2tcbiAgcHJpdmF0ZSBfX2ZpcnN0QWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lPzogQW5pbWF0aW9uVHJhY2tOYW1lO1xuICBwcml2YXRlIF9fc2Vjb25kQWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lPzogQW5pbWF0aW9uVHJhY2tOYW1lOyAvLyBmb3IgYW5pbWF0aW9uIGJsZW5kaW5nXG4gIHB1YmxpYyBhbmltYXRpb25CbGVuZGluZ1JhdGlvID0gMDsgLy8gdGhlIHZhbHVlIHJhbmdlIGlzIFswLDFdXG5cbiAgLy8gQW5pbWF0aW9uIERhdGEgb2YgZWFjaCBBbmltYXRpb25Db21wb25lbnRcbiAgcHJpdmF0ZSBfX2FuaW1hdGlvblRyYWNrczogTWFwPEFuaW1hdGlvblRyYWNrTmFtZSwgQW5pbWF0aW9uVHJhY2s+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyBfX2FuaW1hdGlvbkdsb2JhbEluZm86IE1hcDxBbmltYXRpb25UcmFja05hbWUsIEFuaW1hdGlvbkluZm8+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgX19pc0VmZmVrc2VlclN0YXRlID0gLTE7XG5cbiAgLy8vIGZsYWdzIC8vL1xuICBwcml2YXRlIF9faXNBbmltYXRpbmcgPSB0cnVlO1xuICBzdGF0aWMgaXNBbmltYXRpbmcgPSB0cnVlO1xuICBwdWJsaWMgaXNMb29wID0gdHJ1ZTtcblxuICAvLyBHbG9iYWwgYW5pbWF0aW9uIHRpbWUgaW4gUmhvZG9uaXRlXG4gIHB1YmxpYyB1c2VHbG9iYWxUaW1lID0gdHJ1ZTtcbiAgcHVibGljIHN0YXRpYyBnbG9iYWxUaW1lID0gMDtcblxuICAvLyBhbmltYXRpb24gdGltZSBpbiB0aGlzIGFuaW1hdGlvbiBjb21wb25lbnRcbiAgcHVibGljIHRpbWUgPSAwO1xuXG4gIC8vIEV2ZW50IGZvciBwdWJzdWIgb2Ygbm90aWZpY2F0aW9uc1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEV2ZW50ID0ge1xuICAgIENoYW5nZUFuaW1hdGlvbkluZm8sXG4gICAgUGxheUVuZCxcbiAgfTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19wdWJzdWIgPSBuZXcgRXZlbnRQdWJTdWIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlVaWQ6IEVudGl0eVVJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRCxcbiAgICBlbnRpdHlSZXBvc2l0b3J5OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5VWlkLCBjb21wb25lbnRTaWQsIGVudGl0eVJlcG9zaXRvcnksIGlzUmVVc2UpO1xuICB9XG5cbiAgLy8vIExpZmVDeWNsZSBNZXRob2RzIC8vL1xuICAkbG9hZCgpIHtcbiAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5Mb2dpYyk7XG4gIH1cblxuICAkbG9naWMoKSB7XG4gICAgaWYgKCFBbmltYXRpb25Db21wb25lbnQuaXNBbmltYXRpbmcgfHwgIXRoaXMuaXNBbmltYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9fYXBwbHlBbmltYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX19hcHBseUFuaW1hdGlvbigpIHtcbiAgICBsZXQgdGltZSA9IHRoaXMudGltZTtcbiAgICBpZiAodGhpcy51c2VHbG9iYWxUaW1lKSB7XG4gICAgICB0aW1lID0gQW5pbWF0aW9uQ29tcG9uZW50Lmdsb2JhbFRpbWU7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNmb3JtQ29tcG9uZW50ID0gdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCk7XG4gICAgY29uc3QgYmxlbmRTaGFwZUNvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0QmxlbmRTaGFwZSgpO1xuICAgIGNvbnN0IGVmZmVrc2VlckNvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0RWZmZWtzZWVyKCk7XG5cbiAgICAvLyBwcm9jZXNzIHRoZSBmaXJzdCBhY3RpdmUgYW5pbWF0aW9uIHRyYWNrXG4gICAgaWYgKElzLmV4aXN0KHRoaXMuX19maXJzdEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSkgJiYgdGhpcy5hbmltYXRpb25CbGVuZGluZ1JhdGlvIDwgMSkge1xuICAgICAgaWYgKHRoaXMuaXNMb29wKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5nZXRFbmRJbnB1dFZhbHVlT2ZBbmltYXRpb24odGhpcy5fX2ZpcnN0QWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lISk7XG4gICAgICAgIHRpbWUgPVxuICAgICAgICAgICh0aW1lICUgZHVyYXRpb24pICtcbiAgICAgICAgICB0aGlzLmdldFN0YXJ0SW5wdXRWYWx1ZU9mQW5pbWF0aW9uKHRoaXMuX19maXJzdEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhbmltYXRpb25TZXRPZjFzdCA9IHRoaXMuX19hbmltYXRpb25UcmFja3MuZ2V0KHRoaXMuX19maXJzdEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSk7XG4gICAgICBpZiAoYW5pbWF0aW9uU2V0T2Yxc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBjaGFubmVsXSBvZiBhbmltYXRpb25TZXRPZjFzdCkge1xuICAgICAgICAgIGNvbnN0IGkgPSBBbmltYXRpb25BdHRyaWJ1dGUuZnJvbVN0cmluZyhhdHRyaWJ1dGVOYW1lKS5pbmRleDtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IF9faW50ZXJwb2xhdGUoY2hhbm5lbCwgdGltZSwgaSk7XG5cbiAgICAgICAgICBpZiAoaSA9PT0gQW5pbWF0aW9uQXR0cmlidXRlLlF1YXRlcm5pb24uaW5kZXgpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybUNvbXBvbmVudCEubG9jYWxSb3RhdGlvbiA9IFF1YXRlcm5pb24uZnJvbUNvcHlBcnJheTQodmFsdWUgYXMgQXJyYXk0PG51bWJlcj4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gQW5pbWF0aW9uQXR0cmlidXRlLlRyYW5zbGF0ZS5pbmRleCkge1xuICAgICAgICAgICAgdHJhbnNmb3JtQ29tcG9uZW50IS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weUFycmF5Myh2YWx1ZSBhcyBBcnJheTM8bnVtYmVyPik7XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSBBbmltYXRpb25BdHRyaWJ1dGUuU2NhbGUuaW5kZXgpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybUNvbXBvbmVudCEubG9jYWxTY2FsZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheTModmFsdWUgYXMgQXJyYXkzPG51bWJlcj4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gQW5pbWF0aW9uQXR0cmlidXRlLldlaWdodHMuaW5kZXgpIHtcbiAgICAgICAgICAgIGJsZW5kU2hhcGVDb21wb25lbnQhLndlaWdodHMgPSB2YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IEFuaW1hdGlvbkF0dHJpYnV0ZS5FZmZla3NlZXIuaW5kZXgpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVswXSA+IDAuNSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5fX2lzRWZmZWtzZWVyU3RhdGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBlZmZla3NlZXJDb21wb25lbnQ/LnBsYXkoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX19pc0VmZmVrc2VlclN0YXRlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWZmZWtzZWVyQ29tcG9uZW50Py5wYXVzZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9faXNFZmZla3NlZXJTdGF0ZSA9IHZhbHVlWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHByb2Nlc3MgdGhlIHNlY29uZCBhY3RpdmUgYW5pbWF0aW9uIHRyYWNrLCBhbmQgYmxlbmRpbmcgd2l0aCB0aGUgZmlyc3QncyBvbmVcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3NlY29uZEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSkgJiYgdGhpcy5hbmltYXRpb25CbGVuZGluZ1JhdGlvID4gMCkge1xuICAgICAgaWYgKHRoaXMuaXNMb29wKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5nZXRFbmRJbnB1dFZhbHVlT2ZBbmltYXRpb24odGhpcy5fX3NlY29uZEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSEpO1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAodGltZSAlIGR1cmF0aW9uKSArXG4gICAgICAgICAgdGhpcy5nZXRTdGFydElucHV0VmFsdWVPZkFuaW1hdGlvbih0aGlzLl9fc2Vjb25kQWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lISk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuaW1hdGlvblNldE9mMm5kID0gdGhpcy5fX2FuaW1hdGlvblRyYWNrcy5nZXQodGhpcy5fX3NlY29uZEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSk7XG4gICAgICBpZiAoYW5pbWF0aW9uU2V0T2YybmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBjaGFubmVsXSBvZiBhbmltYXRpb25TZXRPZjJuZCkge1xuICAgICAgICAgIGNvbnN0IGkgPSBBbmltYXRpb25BdHRyaWJ1dGUuZnJvbVN0cmluZyhhdHRyaWJ1dGVOYW1lKS5pbmRleDtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IF9faW50ZXJwb2xhdGUoY2hhbm5lbCwgdGltZSwgaSk7XG5cbiAgICAgICAgICBpZiAoaSA9PT0gQW5pbWF0aW9uQXR0cmlidXRlLlF1YXRlcm5pb24uaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1YXRPZjJuZCA9IFF1YXRlcm5pb24uZnJvbUNvcHlBcnJheTQodmFsdWUgYXMgQXJyYXk0PG51bWJlcj4pO1xuICAgICAgICAgICAgdHJhbnNmb3JtQ29tcG9uZW50IS5sb2NhbFJvdGF0aW9uID0gUXVhdGVybmlvbi5xbGVycChcbiAgICAgICAgICAgICAgdHJhbnNmb3JtQ29tcG9uZW50IS5sb2NhbFJvdGF0aW9uSW5uZXIsXG4gICAgICAgICAgICAgIHF1YXRPZjJuZCxcbiAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb25CbGVuZGluZ1JhdGlvXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gQW5pbWF0aW9uQXR0cmlidXRlLlRyYW5zbGF0ZS5pbmRleCkge1xuICAgICAgICAgICAgY29uc3QgdmVjM09mMm5kID0gVmVjdG9yMy5mcm9tQ29weUFycmF5Myh2YWx1ZSBhcyBBcnJheTM8bnVtYmVyPik7XG4gICAgICAgICAgICB0cmFuc2Zvcm1Db21wb25lbnQhLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmxlcnAoXG4gICAgICAgICAgICAgIHRyYW5zZm9ybUNvbXBvbmVudCEubG9jYWxQb3NpdGlvbklubmVyLFxuICAgICAgICAgICAgICB2ZWMzT2YybmQsXG4gICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uQmxlbmRpbmdSYXRpb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IEFuaW1hdGlvbkF0dHJpYnV0ZS5TY2FsZS5pbmRleCkge1xuICAgICAgICAgICAgY29uc3QgdmVjM29mMm5kID0gVmVjdG9yMy5mcm9tQ29weUFycmF5Myh2YWx1ZSBhcyBBcnJheTM8bnVtYmVyPik7XG4gICAgICAgICAgICB0cmFuc2Zvcm1Db21wb25lbnQhLmxvY2FsU2NhbGUgPSBWZWN0b3IzLmxlcnAoXG4gICAgICAgICAgICAgIHRyYW5zZm9ybUNvbXBvbmVudCEubG9jYWxTY2FsZUlubmVyLFxuICAgICAgICAgICAgICB2ZWMzb2YybmQsXG4gICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uQmxlbmRpbmdSYXRpb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IEFuaW1hdGlvbkF0dHJpYnV0ZS5XZWlnaHRzLmluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCB3ZWlnaHRzT2YybmQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2VpZ2h0c09mMm5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGJsZW5kU2hhcGVDb21wb25lbnQhLndlaWdodHNbaV0gPSBNYXRoVXRpbC5sZXJwKFxuICAgICAgICAgICAgICAgIGJsZW5kU2hhcGVDb21wb25lbnQhLndlaWdodHNbaV0sXG4gICAgICAgICAgICAgICAgd2VpZ2h0c09mMm5kW2ldLFxuICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uQmxlbmRpbmdSYXRpb1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gQW5pbWF0aW9uQXR0cmlidXRlLkVmZmVrc2Vlci5pbmRleCkge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzdWJzY3JpYmUodHlwZTogQW5pbWF0aW9uQ29tcG9uZW50RXZlbnRUeXBlLCBoYW5kbGVyOiBFdmVudEhhbmRsZXIpIHtcbiAgICBBbmltYXRpb25Db21wb25lbnQuX19wdWJzdWIuc3Vic2NyaWJlKHR5cGUsIGhhbmRsZXIpO1xuICB9XG5cbiAgc2V0SXNBbmltYXRpbmcoZmxnOiBib29sZWFuKSB7XG4gICAgdGhpcy5fX2lzQW5pbWF0aW5nID0gZmxnO1xuICB9XG5cbiAgc3RhdGljIHNldEFjdGl2ZUFuaW1hdGlvbkZvckFsbChhbmltYXRpb25UcmFja05hbWU6IEFuaW1hdGlvblRyYWNrTmFtZSkge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudHNXaXRoVHlwZShcbiAgICAgIEFuaW1hdGlvbkNvbXBvbmVudFxuICAgICkgYXMgQW5pbWF0aW9uQ29tcG9uZW50W107XG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgY29tcG9uZW50LnNldEFjdGl2ZUFuaW1hdGlvblRyYWNrKGFuaW1hdGlvblRyYWNrTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlQW5pbWF0aW9uVHJhY2soYW5pbWF0aW9uVHJhY2tOYW1lOiBBbmltYXRpb25UcmFja05hbWUpIHtcbiAgICBpZiAodGhpcy5fX2FuaW1hdGlvblRyYWNrcy5oYXMoYW5pbWF0aW9uVHJhY2tOYW1lKSkge1xuICAgICAgdGhpcy5fX2ZpcnN0QWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lID0gYW5pbWF0aW9uVHJhY2tOYW1lO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWNvbmRBY3RpdmVBbmltYXRpb25UcmFjayhhbmltYXRpb25UcmFja05hbWU6IEFuaW1hdGlvblRyYWNrTmFtZSkge1xuICAgIGlmICh0aGlzLl9fYW5pbWF0aW9uVHJhY2tzLmhhcyhhbmltYXRpb25UcmFja05hbWUpKSB7XG4gICAgICB0aGlzLl9fc2Vjb25kQWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lID0gYW5pbWF0aW9uVHJhY2tOYW1lO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVBbmltYXRpb25UcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZpcnN0QWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lO1xuICB9XG5cbiAgaGFzQW5pbWF0aW9uKHRyYWNrTmFtZTogQW5pbWF0aW9uVHJhY2tOYW1lLCBwYXRoTmFtZTogQW5pbWF0aW9uUGF0aE5hbWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbmltYXRpb25TZXQ6IE1hcDxBbmltYXRpb25QYXRoTmFtZSwgQW5pbWF0aW9uQ2hhbm5lbD4gfCB1bmRlZmluZWQgPVxuICAgICAgdGhpcy5fX2FuaW1hdGlvblRyYWNrcy5nZXQodHJhY2tOYW1lKTtcblxuICAgIGlmIChJcy5ub3QuZXhpc3QoYW5pbWF0aW9uU2V0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhbmltYXRpb25TZXQuaGFzKHBhdGhOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYW4gYW5pbWF0aW9uIGNoYW5uZWwgdG8gQW5pbWF0aW9uU2V0XG4gICAqIEBwYXJhbSB0cmFja05hbWUgLSB0aGUgbmFtZSBvZiBhbmltYXRpb24gdHJhY2tcbiAgICogQHBhcmFtIHBhdGhOYW1lIC0gdGhlIG5hbWUgb2YgYW5pbWF0aW9uIHBhdGhcbiAgICogQHBhcmFtIGlucHV0QXJyYXkgLSB0aGUgYXJyYXkgb2YgaW5wdXQgdmFsdWVzXG4gICAqIEBwYXJhbSBvdXRwdXRBcnJheSAtIHRoZSBhcnJheSBvZiBvdXRwdXQgdmFsdWVzXG4gICAqIEBwYXJhbSBvdXRwdXRDb21wb25lbnROIC0gdGhlIG51bWJlciBvZiBvdXRwdXQgdmFsdWUncyBjb21wb25lbnRzXG4gICAqIEBwYXJhbSBpbnRlcnBvbGF0aW9uIC0gdGhlIGludGVycG9sYXRpb24gdHlwZVxuICAgKiBAcGFyYW0gbWFrZVRoaXNBY3RpdmVBbmltYXRpb24gLSBpZiB0cnVlLCBzZXQgdGhpcyBhbmltYXRpb24gdHJhY2sgYXMgY3VycmVudCBhY3RpdmUgYW5pbWF0aW9uXG4gICAqL1xuICBzZXRBbmltYXRpb24oXG4gICAgdHJhY2tOYW1lOiBBbmltYXRpb25UcmFja05hbWUsXG4gICAgcGF0aE5hbWU6IEFuaW1hdGlvblBhdGhOYW1lLFxuICAgIGlucHV0QXJyYXk6IEZsb2F0MzJBcnJheSxcbiAgICBvdXRwdXRBcnJheTogRmxvYXQzMkFycmF5LFxuICAgIG91dHB1dENvbXBvbmVudE46IFZlY3RvckNvbXBvbmVudE4sXG4gICAgaW50ZXJwb2xhdGlvbjogQW5pbWF0aW9uSW50ZXJwb2xhdGlvbkVudW0sXG4gICAgbWFrZVRoaXNBY3RpdmVBbmltYXRpb24gPSB0cnVlXG4gICkge1xuICAgIC8vIHNldCB0aGUgY3VycmVudCBBY3RpdmUgQW5pbWF0aW9uVHJhY2tOYW1lXG4gICAgaWYgKG1ha2VUaGlzQWN0aXZlQW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLl9fZmlyc3RBY3RpdmVBbmltYXRpb25UcmFja05hbWUgPSB0cmFja05hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19maXJzdEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZSA9IHZhbHVlV2l0aERlZmF1bHQoe1xuICAgICAgICB2YWx1ZTogdGhpcy5fX2ZpcnN0QWN0aXZlQW5pbWF0aW9uVHJhY2tOYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHRyYWNrTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNldCBhbiBhbmltYXRpb24gY2hhbm5lbCB0byBBbmltYXRpb25TZXRcbiAgICBjb25zdCBhbmltYXRpb25TZXQ6IE1hcDxBbmltYXRpb25QYXRoTmFtZSwgQW5pbWF0aW9uQ2hhbm5lbD4gPSB2YWx1ZVdpdGhDb21wZW5zYXRpb24oe1xuICAgICAgdmFsdWU6IHRoaXMuX19hbmltYXRpb25UcmFja3MuZ2V0KHRyYWNrTmFtZSksXG4gICAgICBjb21wZW5zYXRpb246ICgpID0+IHtcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uU2V0ID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9fYW5pbWF0aW9uVHJhY2tzLnNldCh0cmFja05hbWUsIGFuaW1hdGlvblNldCk7XG4gICAgICAgIHJldHVybiBhbmltYXRpb25TZXQ7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGNoYW5uZWw6IEFuaW1hdGlvbkNoYW5uZWwgPSB7XG4gICAgICBzYW1wbGVyOiB7XG4gICAgICAgIGlucHV0OiBpbnB1dEFycmF5LFxuICAgICAgICBvdXRwdXQ6IG91dHB1dEFycmF5LFxuICAgICAgICBvdXRwdXRDb21wb25lbnROLFxuICAgICAgICBpbnRlcnBvbGF0aW9uTWV0aG9kOiBpbnRlcnBvbGF0aW9uLFxuICAgICAgfSxcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBwYXRoTmFtZTogcGF0aE5hbWUsXG4gICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXG4gICAgICB9LFxuICAgICAgYmVsb25nVHJhY2tOYW1lOiB0cmFja05hbWUsXG4gICAgfTtcbiAgICBhbmltYXRpb25TZXQuc2V0KHBhdGhOYW1lLCBjaGFubmVsKTtcblxuICAgIC8vIHVwZGF0ZSBBbmltYXRpb25JbmZvXG4gICAgY29uc3QgbmV3TWluU3RhcnRJbnB1dFRpbWUgPSBpbnB1dEFycmF5WzBdO1xuICAgIGNvbnN0IG5ld01heEVuZElucHV0VGltZSA9IGlucHV0QXJyYXlbaW5wdXRBcnJheS5sZW5ndGggLSAxXTtcblxuICAgIC8vIGNvbnN0IGV4aXN0aW5nQW5pbWF0aW9uSW5mbyA9IHZhbHVlV2l0aERlZmF1bHQ8QW5pbWF0aW9uSW5mbz4oe1xuICAgIC8vICAgdmFsdWU6IEFuaW1hdGlvbkNvbXBvbmVudC5fX2FuaW1hdGlvbkdsb2JhbEluZm8uZ2V0KHRyYWNrTmFtZSksXG4gICAgLy8gICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRBbmltYXRpb25JbmZvLFxuICAgIC8vIH0pO1xuICAgIC8vIGNvbnN0IGV4aXN0aW5nTWF4U3RhcnRJbnB1dFRpbWUgPSBleGlzdGluZ0FuaW1hdGlvbkluZm8ubWluU3RhcnRJbnB1dFRpbWU7XG4gICAgLy8gY29uc3QgZXhpc3RpbmdNYXhFbmRJbnB1dFRpbWUgPSBleGlzdGluZ0FuaW1hdGlvbkluZm8ubWF4RW5kSW5wdXRUaW1lO1xuXG4gICAgLy8gY29uc3Qgc3RhcnRSZXN1bHQgPSBsZXNzVGhhbihleGlzdGluZ01heFN0YXJ0SW5wdXRUaW1lLCBuZXdNYXhTdGFydElucHV0VGltZSk7XG4gICAgLy8gY29uc3QgZW5kUmVzdWx0ID0gZ3JlYXRlclRoYW4obmV3TWF4RW5kSW5wdXRUaW1lLCBleGlzdGluZ01heEVuZElucHV0VGltZSk7XG4gICAgLy8gaWYgKHN0YXJ0UmVzdWx0LnJlc3VsdCB8fCBlbmRSZXN1bHQucmVzdWx0KSB7XG4gICAgY29uc3QgaW5mbyA9IHtcbiAgICAgIG5hbWU6IHRyYWNrTmFtZSxcbiAgICAgIG1pblN0YXJ0SW5wdXRUaW1lOiBuZXdNaW5TdGFydElucHV0VGltZSxcbiAgICAgIG1heEVuZElucHV0VGltZTogbmV3TWF4RW5kSW5wdXRUaW1lLFxuICAgIH07XG4gICAgQW5pbWF0aW9uQ29tcG9uZW50Ll9fYW5pbWF0aW9uR2xvYmFsSW5mby5zZXQodHJhY2tOYW1lLCBpbmZvKTtcbiAgICBBbmltYXRpb25Db21wb25lbnQuX19wdWJzdWIucHVibGlzaEFzeW5jKEFuaW1hdGlvbkNvbXBvbmVudC5FdmVudC5DaGFuZ2VBbmltYXRpb25JbmZvLCB7XG4gICAgICBpbmZvTWFwOiBuZXcgTWFwKEFuaW1hdGlvbkNvbXBvbmVudC5fX2FuaW1hdGlvbkdsb2JhbEluZm8pLFxuICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGJhY2t1cCB0aGUgY3VycmVudCB0cmFuc2Zvcm0gYXMgcmVzdCBwb3NlXG4gICAgdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkuX2JhY2t1cFRyYW5zZm9ybUFzUmVzdCgpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXJ0SW5wdXRWYWx1ZU9mQW5pbWF0aW9uKGFuaW1hdGlvblRyYWNrTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgbWF4U3RhcnRJbnB1dFRpbWUgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgY29uc3QgYW5pbWF0aW9uVHJhY2sgPSB0aGlzLl9fYW5pbWF0aW9uVHJhY2tzLmdldChhbmltYXRpb25UcmFja05hbWUpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoYW5pbWF0aW9uVHJhY2spKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uVHJhY2suZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBjaGFubmVsLnNhbXBsZXIuaW5wdXRbMF07XG4gICAgICBpZiAoaW5wdXQgPCBtYXhTdGFydElucHV0VGltZSkge1xuICAgICAgICBtYXhTdGFydElucHV0VGltZSA9IGlucHV0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1heFN0YXJ0SW5wdXRUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldEVuZElucHV0VmFsdWVPZkFuaW1hdGlvbihhbmltYXRpb25UcmFja05hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgYW5pbWF0aW9uVHJhY2sgPSB0aGlzLl9fYW5pbWF0aW9uVHJhY2tzLmdldChhbmltYXRpb25UcmFja05hbWUpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoYW5pbWF0aW9uVHJhY2spKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGxldCBtYXhFbmRJbnB1dFRpbWUgPSAwO1xuICAgIGFuaW1hdGlvblRyYWNrLmZvckVhY2goKGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gY2hhbm5lbC5zYW1wbGVyLmlucHV0W2NoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChtYXhFbmRJbnB1dFRpbWUgPCBpbnB1dCkge1xuICAgICAgICBtYXhFbmRJbnB1dFRpbWUgPSBpbnB1dDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtYXhFbmRJbnB1dFRpbWU7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBBcnJheSBvZiBBbmltYXRpb24gVHJhY2sgTmFtZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBBbmltYXRpb24gVHJhY2sgTmFtZVxuICAgKi9cbiAgc3RhdGljIGdldEFuaW1hdGlvbkxpc3QoKTogQW5pbWF0aW9uVHJhY2tOYW1lW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX19hbmltYXRpb25HbG9iYWxJbmZvLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBBbmltYXRpb25JbmZvIG9mIHRoZSBDb21wb25lbnRcbiAgICogQHJldHVybnMgdGhlIG1hcCBvZlxuICAgKi9cbiAgc3RhdGljIGdldEFuaW1hdGlvbkluZm8oKTogTWFwPEFuaW1hdGlvblRyYWNrTmFtZSwgQW5pbWF0aW9uSW5mbz4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuX19hbmltYXRpb25HbG9iYWxJbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYW5pbWF0aW9uIHRyYWNrIG5hbWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGFuaW1hdGlvbiB0cmFjayBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0QW5pbWF0aW9uVHJhY2tOYW1lcygpOiBBbmltYXRpb25UcmFja05hbWVbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fX2FuaW1hdGlvblRyYWNrcy5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgYW5pbWF0aW9uIGNoYW5uZWxzIG9mIHRoZSBhbmltYXRpb24gdHJhY2tcbiAgICogQHBhcmFtIGFuaW1hdGlvblRyYWNrTmFtZSB0aGUgbmFtZSBvZiBhbmltYXRpb24gdHJhY2sgdG8gZ2V0XG4gICAqIEByZXR1cm5zIHRoZSBjaGFubmVsIG1hcHMgb2YgdGhlIGFuaW1hdGlvbiB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldEFuaW1hdGlvbkNoYW5uZWxzT2ZUcmFjayhcbiAgICBhbmltYXRpb25UcmFja05hbWU6IEFuaW1hdGlvblRyYWNrTmFtZVxuICApOiBBbmltYXRpb25UcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX19hbmltYXRpb25UcmFja3MuZ2V0KGFuaW1hdGlvblRyYWNrTmFtZSk7XG4gIH1cblxuICBnZXQgaXNBbmltYXRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc0FuaW1hdGluZztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3RhcnRJbnB1dFZhbHVlKCkge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudHNXaXRoVHlwZShcbiAgICAgIEFuaW1hdGlvbkNvbXBvbmVudFxuICAgICkgYXMgQW5pbWF0aW9uQ29tcG9uZW50W107XG4gICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5mb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLl9fYW5pbWF0aW9uR2xvYmFsSW5mby52YWx1ZXMoKSk7XG4gICAgICBjb25zdCBsYXN0SW5mbyA9IGluZm9BcnJheVtpbmZvQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgICByZXR1cm4gbGFzdEluZm8ubWluU3RhcnRJbnB1dFRpbWU7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBlbmRJbnB1dFZhbHVlKCkge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudHNXaXRoVHlwZShcbiAgICAgIEFuaW1hdGlvbkNvbXBvbmVudFxuICAgICkgYXMgQW5pbWF0aW9uQ29tcG9uZW50W107XG4gICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5mb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLl9fYW5pbWF0aW9uR2xvYmFsSW5mby52YWx1ZXMoKSk7XG4gICAgICBjb25zdCBsYXN0SW5mbyA9IGluZm9BcnJheVtpbmZvQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgICByZXR1cm4gbGFzdEluZm8ubWF4RW5kSW5wdXRUaW1lO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQW5pbWF0aW9uQ29tcG9uZW50VElEO1xuICB9XG5cbiAgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLkFuaW1hdGlvbkNvbXBvbmVudFRJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIHRoZSBlbnRpdHkgd2hpY2ggaGFzIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBnZXQgZW50aXR5KCk6IElBbmltYXRpb25FbnRpdHkge1xuICAgIHJldHVybiBFbnRpdHlSZXBvc2l0b3J5LmdldEVudGl0eSh0aGlzLl9fZW50aXR5VWlkKSBhcyB1bmtub3duIGFzIElBbmltYXRpb25FbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApIHtcbiAgICBjbGFzcyBBbmltYXRpb25FbnRpdHkgZXh0ZW5kcyAoYmFzZS5jb25zdHJ1Y3RvciBhcyBhbnkpIHtcbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbnRpdHlVSUQ6IEVudGl0eVVJRCxcbiAgICAgICAgaXNBbGl2ZTogYm9vbGVhbixcbiAgICAgICAgY29tcG9uZW50cz86IE1hcDxDb21wb25lbnRUSUQsIENvbXBvbmVudD5cbiAgICAgICkge1xuICAgICAgICBzdXBlcihlbnRpdHlVSUQsIGlzQWxpdmUsIGNvbXBvbmVudHMpO1xuICAgICAgfVxuXG4gICAgICBnZXRBbmltYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQW5pbWF0aW9uQ29tcG9uZW50VElEXG4gICAgICAgICkgYXMgQW5pbWF0aW9uQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBhcHBseU1peGlucyhiYXNlLCBBbmltYXRpb25FbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG5cbiAgYWRkS2V5RnJhbWUoXG4gICAgdHJhY2tOYW1lOiBBbmltYXRpb25UcmFja05hbWUsXG4gICAgcGF0aE5hbWU6IEFuaW1hdGlvblBhdGhOYW1lLFxuICAgIGZyYW1lVG9JbnNlcnQ6IEluZGV4LFxuICAgIGZwczogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IHNlY0JlZ2luID0gZnJhbWVUb0luc2VydCAvIGZwcztcbiAgICBjb25zdCBpbnB1dCA9IHNlY0JlZ2luO1xuICAgIGNvbnN0IHNlY0VuZCA9IChmcmFtZVRvSW5zZXJ0ICsgMSkgLyBmcHM7XG5cbiAgICBjb25zdCBhbmltYXRpb25TZXQ6IE1hcDxBbmltYXRpb25QYXRoTmFtZSwgQW5pbWF0aW9uQ2hhbm5lbD4gfCB1bmRlZmluZWQgPVxuICAgICAgdGhpcy5fX2FuaW1hdGlvblRyYWNrcy5nZXQodHJhY2tOYW1lKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KGFuaW1hdGlvblNldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gYW5pbWF0aW9uU2V0LmdldChwYXRoTmFtZSk7XG4gICAgaWYgKElzLm5vdC5leGlzdChjaGFubmVsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGkgPSBBbmltYXRpb25BdHRyaWJ1dGUuZnJvbVN0cmluZyhwYXRoTmFtZSkuaW5kZXg7XG4gICAgY29uc3Qgb3V0cHV0ID0gX19pbnRlcnBvbGF0ZShjaGFubmVsLCBBbmltYXRpb25Db21wb25lbnQuZ2xvYmFsVGltZSwgaSk7XG5cbiAgICBpZiAoY2hhbm5lbC5zYW1wbGVyLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgaW5wdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLmlucHV0KTtcbiAgICAgIGlucHV0QXJyYXkucHVzaChpbnB1dCk7XG4gICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXQgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0QXJyYXkpO1xuICAgICAgY29uc3Qgb3V0cHV0QXJyYXkgPSBBcnJheS5mcm9tKGNoYW5uZWwuc2FtcGxlci5vdXRwdXQpO1xuICAgICAgb3V0cHV0QXJyYXkucHVzaCguLi5vdXRwdXQpO1xuICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkob3V0cHV0QXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbC5zYW1wbGVyLmlucHV0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZXhpc3RlZElucHV0ID0gY2hhbm5lbC5zYW1wbGVyLmlucHV0WzBdO1xuICAgICAgaWYgKHNlY0VuZCA8IGV4aXN0ZWRJbnB1dCkge1xuICAgICAgICBjb25zdCBpbnB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIuaW5wdXQpO1xuICAgICAgICBpbnB1dEFycmF5LnVuc2hpZnQoaW5wdXQpO1xuICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXQgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0QXJyYXkpO1xuICAgICAgICBjb25zdCBvdXRwdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLm91dHB1dCk7XG4gICAgICAgIG91dHB1dEFycmF5LnVuc2hpZnQoLi4ub3V0cHV0KTtcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkob3V0cHV0QXJyYXkpO1xuICAgICAgfSBlbHNlIGlmIChleGlzdGVkSW5wdXQgPCBzZWNCZWdpbikge1xuICAgICAgICBjb25zdCBpbnB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIuaW5wdXQpO1xuICAgICAgICBpbnB1dEFycmF5LnB1c2goaW5wdXQpO1xuICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXQgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0QXJyYXkpO1xuICAgICAgICBjb25zdCBvdXRwdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLm91dHB1dCk7XG4gICAgICAgIG91dHB1dEFycmF5LnB1c2goLi4ub3V0cHV0KTtcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkob3V0cHV0QXJyYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2VjQmVnaW4gPD0gZXhpc3RlZElucHV0IDw9IHNlY0VuZFxuICAgICAgICBjb25zdCBpbnB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIuaW5wdXQpO1xuICAgICAgICBpbnB1dEFycmF5LnNwbGljZSgwLCAwLCBpbnB1dCk7XG4gICAgICAgIGNoYW5uZWwuc2FtcGxlci5pbnB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoaW5wdXRBcnJheSk7XG4gICAgICAgIGNvbnN0IG91dHB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIub3V0cHV0KTtcbiAgICAgICAgb3V0cHV0QXJyYXkuc3BsaWNlKDAsIDAsIC4uLm91dHB1dCk7XG4gICAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KG91dHB1dEFycmF5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hhbm5lbC5zYW1wbGVyLmlucHV0Lmxlbmd0aCA+PSAyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBleGlzdGVkSW5wdXQgPSBjaGFubmVsLnNhbXBsZXIuaW5wdXRbaV07XG4gICAgICAgIGlmIChzZWNCZWdpbiA8PSBleGlzdGVkSW5wdXQpIHtcbiAgICAgICAgICBpZiAoc2VjQmVnaW4gPD0gZXhpc3RlZElucHV0ICYmIGV4aXN0ZWRJbnB1dCA8PSBzZWNFbmQpIHtcbiAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlci5pbnB1dFtpXSA9IGlucHV0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TjsgaisrKSB7XG4gICAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRbaSAqIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROICsgal0gPSBvdXRwdXRbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0QXJyYXkgPSBBcnJheS5mcm9tKGNoYW5uZWwuc2FtcGxlci5pbnB1dCk7XG4gICAgICAgICAgICBpbnB1dEFycmF5LnNwbGljZShpLCAwLCBpbnB1dCk7XG4gICAgICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXQgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0QXJyYXkpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0QXJyYXkgPSBBcnJheS5mcm9tKGNoYW5uZWwuc2FtcGxlci5vdXRwdXQpO1xuICAgICAgICAgICAgb3V0cHV0QXJyYXkuc3BsaWNlKGkgKiBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TiwgMCwgLi4ub3V0cHV0KTtcbiAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KG91dHB1dEFycmF5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFkZEtleUZyYW1lV2l0aFZhbHVlKFxuICAgIHRyYWNrTmFtZTogQW5pbWF0aW9uVHJhY2tOYW1lLFxuICAgIHBhdGhOYW1lOiBBbmltYXRpb25QYXRoTmFtZSxcbiAgICBmcmFtZVRvSW5zZXJ0OiBJbmRleCxcbiAgICBvdXRwdXQ6IEFycmF5PG51bWJlcj4sXG4gICAgZnBzOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgc2VjQmVnaW4gPSBmcmFtZVRvSW5zZXJ0IC8gZnBzO1xuICAgIGNvbnN0IGlucHV0ID0gc2VjQmVnaW47XG4gICAgY29uc3Qgc2VjRW5kID0gKGZyYW1lVG9JbnNlcnQgKyAxKSAvIGZwcztcblxuICAgIGNvbnN0IGFuaW1hdGlvblNldDogTWFwPEFuaW1hdGlvblBhdGhOYW1lLCBBbmltYXRpb25DaGFubmVsPiB8IHVuZGVmaW5lZCA9XG4gICAgICB0aGlzLl9fYW5pbWF0aW9uVHJhY2tzLmdldCh0cmFja05hbWUpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoYW5pbWF0aW9uU2V0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwgPSBhbmltYXRpb25TZXQuZ2V0KHBhdGhOYW1lKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KGNoYW5uZWwpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGlucHV0QXJyYXkgPSBBcnJheS5mcm9tKGNoYW5uZWwuc2FtcGxlci5pbnB1dCk7XG4gICAgICBpbnB1dEFycmF5LnB1c2goaW5wdXQpO1xuICAgICAgY2hhbm5lbC5zYW1wbGVyLmlucHV0ID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dEFycmF5KTtcbiAgICAgIGNvbnN0IG91dHB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIub3V0cHV0KTtcbiAgICAgIG91dHB1dEFycmF5LnB1c2goLi4ub3V0cHV0KTtcbiAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KG91dHB1dEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGV4aXN0ZWRJbnB1dCA9IGNoYW5uZWwuc2FtcGxlci5pbnB1dFswXTtcbiAgICAgIGlmIChzZWNFbmQgPCBleGlzdGVkSW5wdXQpIHtcbiAgICAgICAgY29uc3QgaW5wdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLmlucHV0KTtcbiAgICAgICAgaW5wdXRBcnJheS51bnNoaWZ0KGlucHV0KTtcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLmlucHV0ID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dEFycmF5KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0QXJyYXkgPSBBcnJheS5mcm9tKGNoYW5uZWwuc2FtcGxlci5vdXRwdXQpO1xuICAgICAgICBvdXRwdXRBcnJheS51bnNoaWZ0KC4uLm91dHB1dCk7XG4gICAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KG91dHB1dEFycmF5KTtcbiAgICAgIH0gZWxzZSBpZiAoZXhpc3RlZElucHV0IDwgc2VjQmVnaW4pIHtcbiAgICAgICAgY29uc3QgaW5wdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLmlucHV0KTtcbiAgICAgICAgaW5wdXRBcnJheS5wdXNoKGlucHV0KTtcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLmlucHV0ID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dEFycmF5KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0QXJyYXkgPSBBcnJheS5mcm9tKGNoYW5uZWwuc2FtcGxlci5vdXRwdXQpO1xuICAgICAgICBvdXRwdXRBcnJheS5wdXNoKC4uLm91dHB1dCk7XG4gICAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KG91dHB1dEFycmF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNlY0JlZ2luIDw9IGV4aXN0ZWRJbnB1dCA8PSBzZWNFbmRcbiAgICAgICAgY29uc3QgaW5wdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLmlucHV0KTtcbiAgICAgICAgaW5wdXRBcnJheS5zcGxpY2UoMCwgMCwgaW5wdXQpO1xuICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXQgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0QXJyYXkpO1xuICAgICAgICBjb25zdCBvdXRwdXRBcnJheSA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLm91dHB1dCk7XG4gICAgICAgIG91dHB1dEFycmF5LnNwbGljZSgwLCAwLCAuLi5vdXRwdXQpO1xuICAgICAgICBjaGFubmVsLnNhbXBsZXIub3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShvdXRwdXRBcnJheSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGggPj0gMlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFubmVsLnNhbXBsZXIuaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXhpc3RlZElucHV0ID0gY2hhbm5lbC5zYW1wbGVyLmlucHV0W2ldO1xuICAgICAgICBpZiAoc2VjQmVnaW4gPD0gZXhpc3RlZElucHV0KSB7XG4gICAgICAgICAgaWYgKHNlY0JlZ2luIDw9IGV4aXN0ZWRJbnB1dCAmJiBleGlzdGVkSW5wdXQgPD0gc2VjRW5kKSB7XG4gICAgICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXRbaV0gPSBpbnB1dDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE47IGorKykge1xuICAgICAgICAgICAgICBjaGFubmVsLnNhbXBsZXIub3V0cHV0W2kgKiBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TiArIGpdID0gb3V0cHV0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIuaW5wdXQpO1xuICAgICAgICAgICAgaW5wdXRBcnJheS5zcGxpY2UoaSwgMCwgaW5wdXQpO1xuICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyLmlucHV0ID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dEFycmF5KTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEFycmF5ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIub3V0cHV0KTtcbiAgICAgICAgICAgIG91dHB1dEFycmF5LnNwbGljZShpICogY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE4sIDAsIC4uLm91dHB1dCk7XG4gICAgICAgICAgICBjaGFubmVsLnNhbXBsZXIub3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShvdXRwdXRBcnJheSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBkZWxldGVLZXlzQXRGcmFtZShcbiAgICB0cmFja05hbWU6IEFuaW1hdGlvblRyYWNrTmFtZSxcbiAgICBwYXRoTmFtZTogQW5pbWF0aW9uUGF0aE5hbWUsXG4gICAgZnJhbWVUb0RlbGV0ZTogSW5kZXgsXG4gICAgZnBzOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgc2VjQmVnaW4gPSBmcmFtZVRvRGVsZXRlIC8gZnBzO1xuICAgIGNvbnN0IHNlY0VuZCA9IChmcmFtZVRvRGVsZXRlICsgMSkgLyBmcHM7XG5cbiAgICBjb25zdCBhbmltYXRpb25TZXQ6IE1hcDxBbmltYXRpb25QYXRoTmFtZSwgQW5pbWF0aW9uQ2hhbm5lbD4gfCB1bmRlZmluZWQgPVxuICAgICAgdGhpcy5fX2FuaW1hdGlvblRyYWNrcy5nZXQodHJhY2tOYW1lKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KGFuaW1hdGlvblNldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gYW5pbWF0aW9uU2V0LmdldChwYXRoTmFtZSk7XG4gICAgaWYgKElzLm5vdC5leGlzdChjaGFubmVsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbm5lbC5zYW1wbGVyLmlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGNoYW5uZWwuc2FtcGxlci5pbnB1dFtpXTtcbiAgICAgIGlmIChzZWNCZWdpbiA8PSBpbnB1dCAmJiBpbnB1dCA8IHNlY0VuZCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IEFycmF5LmZyb20oY2hhbm5lbC5zYW1wbGVyLmlucHV0KTtcbiAgICAgICAgaW5wdXQuc3BsaWNlKGksIDEpO1xuICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW5wdXQgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuZnJvbShjaGFubmVsLnNhbXBsZXIub3V0cHV0KTtcbiAgICAgICAgb3V0cHV0LnNwbGljZShpICogY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE4sIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROKTtcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkob3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGhhc0tleUZyYW1lc0F0RnJhbWUoXG4gICAgdHJhY2tOYW1lOiBBbmltYXRpb25UcmFja05hbWUsXG4gICAgcGF0aE5hbWU6IEFuaW1hdGlvblBhdGhOYW1lLFxuICAgIGZyYW1lOiBJbmRleCxcbiAgICBmcHM6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBzZWNCZWdpbiA9IGZyYW1lIC8gZnBzO1xuICAgIGNvbnN0IHNlY0VuZCA9IChmcmFtZSArIDEpIC8gZnBzO1xuXG4gICAgY29uc3QgYW5pbWF0aW9uU2V0OiBNYXA8QW5pbWF0aW9uUGF0aE5hbWUsIEFuaW1hdGlvbkNoYW5uZWw+IHwgdW5kZWZpbmVkID1cbiAgICAgIHRoaXMuX19hbmltYXRpb25UcmFja3MuZ2V0KHRyYWNrTmFtZSk7XG4gICAgaWYgKElzLm5vdC5leGlzdChhbmltYXRpb25TZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IGFuaW1hdGlvblNldC5nZXQocGF0aE5hbWUpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoY2hhbm5lbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXQgPSBjaGFubmVsLnNhbXBsZXIuaW5wdXRbaV07XG4gICAgICBpZiAoc2VjQmVnaW4gPD0gaW5wdXQgJiYgaW5wdXQgPCBzZWNFbmQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIHNldElzQW5pbWF0aW5nKGZsYWc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmxhZztcbiAgfVxuXG4gIF9zaGFsbG93Q29weUZyb20oY29tcG9uZW50XzogQ29tcG9uZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gY29tcG9uZW50XyBhcyBBbmltYXRpb25Db21wb25lbnQ7XG5cbiAgICB0aGlzLl9fZmlyc3RBY3RpdmVBbmltYXRpb25UcmFja05hbWUgPSBjb21wb25lbnQuX19maXJzdEFjdGl2ZUFuaW1hdGlvblRyYWNrTmFtZTtcbiAgICB0aGlzLl9fYW5pbWF0aW9uVHJhY2tzID0gbmV3IE1hcChjb21wb25lbnQuX19hbmltYXRpb25UcmFja3MpO1xuICAgIHRoaXMuX19pc0VmZmVrc2VlclN0YXRlID0gY29tcG9uZW50Ll9faXNFZmZla3NlZXJTdGF0ZTtcbiAgICB0aGlzLl9faXNBbmltYXRpbmcgPSBjb21wb25lbnQuX19pc0FuaW1hdGluZztcbiAgfVxuXG4gIF9zZXRSZXRhcmdldChyZXRhcmdldDogSUFuaW1hdGlvblJldGFyZ2V0LCBwb3N0Zml4VG9UcmFja05hbWU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3JjRW50aXR5ID0gcmV0YXJnZXQuZ2V0RW50aXR5KCk7XG4gICAgY29uc3Qgc3JjQW5pbSA9IHNyY0VudGl0eS50cnlUb0dldEFuaW1hdGlvbigpO1xuICAgIGNvbnN0IGRzdEVudGl0eSA9IHRoaXMuZW50aXR5O1xuICAgIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLl9iYWNrdXBUcmFuc2Zvcm1Bc1Jlc3QoKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KHNyY0FuaW0pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHNyY0FuaW0udXNlR2xvYmFsVGltZSA9IGZhbHNlO1xuICAgIGNvbnN0IHRyYWNrTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBbX3RyYWNrTmFtZSwgdHJhY2tdIG9mIHNyY0FuaW0uX19hbmltYXRpb25UcmFja3MpIHtcbiAgICAgIGNvbnN0IHRyYWNrTmFtZSA9IF90cmFja05hbWUgKyAocG9zdGZpeFRvVHJhY2tOYW1lID8/ICcnKTtcbiAgICAgIHRyYWNrTmFtZXMucHVzaCh0cmFja05hbWUpO1xuICAgICAgZm9yIChjb25zdCBbcGF0aE5hbWUsIGNoYW5uZWxdIG9mIHRyYWNrKSB7XG4gICAgICAgIGlmIChjaGFubmVsID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY2hhbm5lbC5zYW1wbGVyLmlucHV0O1xuICAgICAgICBpZiAoY2hhbm5lbC50YXJnZXQucGF0aE5hbWUgPT09ICd0cmFuc2xhdGUnKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHJldGFyZ2V0VHJhbnNsYXRlKGlucHV0LCBzcmNBbmltKTtcbiAgICAgICAgICB0aGlzLnNldEFuaW1hdGlvbihcbiAgICAgICAgICAgIHRyYWNrTmFtZSxcbiAgICAgICAgICAgIHBhdGhOYW1lIGFzIEFuaW1hdGlvblBhdGhOYW1lLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgMyxcbiAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlci5pbnRlcnBvbGF0aW9uTWV0aG9kLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVsLnRhcmdldC5wYXRoTmFtZSA9PT0gJ3F1YXRlcm5pb24nKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHJldGFyZ2V0UXVhdGVybmlvbihpbnB1dCwgc3JjQW5pbSk7XG4gICAgICAgICAgdGhpcy5zZXRBbmltYXRpb24oXG4gICAgICAgICAgICB0cmFja05hbWUsXG4gICAgICAgICAgICBwYXRoTmFtZSBhcyBBbmltYXRpb25QYXRoTmFtZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIDQsXG4gICAgICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW50ZXJwb2xhdGlvbk1ldGhvZCxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbm5lbC50YXJnZXQucGF0aE5hbWUgPT09ICdzY2FsZScpIHtcbiAgICAgICAgICBjb25zdCBvdXRwdXRzID0gcmV0YXJnZXRTY2FsZShpbnB1dCwgc3JjQW5pbSk7XG4gICAgICAgICAgdGhpcy5zZXRBbmltYXRpb24oXG4gICAgICAgICAgICB0cmFja05hbWUsXG4gICAgICAgICAgICBwYXRoTmFtZSBhcyBBbmltYXRpb25QYXRoTmFtZSxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIDMsXG4gICAgICAgICAgICBjaGFubmVsLnNhbXBsZXIuaW50ZXJwb2xhdGlvbk1ldGhvZCxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJldGFyZ2V0VHJhbnNsYXRlKGlucHV0OiBGbG9hdDMyQXJyYXksIHNyY0FuaW06IEFuaW1hdGlvbkNvbXBvbmVudCkge1xuICAgICAgY29uc3Qgb3V0cHV0c1RyYW5zbGF0aW9uID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dC5sZW5ndGggKiAzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3JjQW5pbS50aW1lID0gaW5wdXRbaV07XG4gICAgICAgIHNyY0FuaW0uX19hcHBseUFuaW1hdGlvbigpO1xuICAgICAgICBjb25zdCBvdXRwdXRUcmFuc2xhdGlvbiA9IHJldGFyZ2V0LnJldGFyZ2V0VHJhbnNsYXRlKGRzdEVudGl0eSk7XG4gICAgICAgIG91dHB1dHNUcmFuc2xhdGlvbltpICogMyArIDBdID0gb3V0cHV0VHJhbnNsYXRpb24ueDtcbiAgICAgICAgb3V0cHV0c1RyYW5zbGF0aW9uW2kgKiAzICsgMV0gPSBvdXRwdXRUcmFuc2xhdGlvbi55O1xuICAgICAgICBvdXRwdXRzVHJhbnNsYXRpb25baSAqIDMgKyAyXSA9IG91dHB1dFRyYW5zbGF0aW9uLno7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0c1RyYW5zbGF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJldGFyZ2V0UXVhdGVybmlvbihpbnB1dDogRmxvYXQzMkFycmF5LCBzcmNBbmltOiBBbmltYXRpb25Db21wb25lbnQpIHtcbiAgICAgIGNvbnN0IG91dHB1dHNRdWF0ZXJuaW9uID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dC5sZW5ndGggKiA0KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3JjQW5pbS50aW1lID0gaW5wdXRbaV07XG4gICAgICAgIHNyY0FuaW0uX19hcHBseUFuaW1hdGlvbigpO1xuICAgICAgICBjb25zdCBvdXRwdXRRdWF0ZXJuaW9uID0gcmV0YXJnZXQucmV0YXJnZXRRdWF0ZXJuaW9uKGRzdEVudGl0eSk7XG4gICAgICAgIG91dHB1dHNRdWF0ZXJuaW9uW2kgKiA0ICsgMF0gPSBvdXRwdXRRdWF0ZXJuaW9uLng7XG4gICAgICAgIG91dHB1dHNRdWF0ZXJuaW9uW2kgKiA0ICsgMV0gPSBvdXRwdXRRdWF0ZXJuaW9uLnk7XG4gICAgICAgIG91dHB1dHNRdWF0ZXJuaW9uW2kgKiA0ICsgMl0gPSBvdXRwdXRRdWF0ZXJuaW9uLno7XG4gICAgICAgIG91dHB1dHNRdWF0ZXJuaW9uW2kgKiA0ICsgM10gPSBvdXRwdXRRdWF0ZXJuaW9uLnc7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0c1F1YXRlcm5pb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmV0YXJnZXRTY2FsZShpbnB1dDogRmxvYXQzMkFycmF5LCBzcmNBbmltOiBBbmltYXRpb25Db21wb25lbnQpIHtcbiAgICAgIGNvbnN0IG91dHB1dHNTY2FsZSA9IG5ldyBGbG9hdDMyQXJyYXkoaW5wdXQubGVuZ3RoICogMyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNyY0FuaW0udGltZSA9IGlucHV0W2ldO1xuICAgICAgICBzcmNBbmltLl9fYXBwbHlBbmltYXRpb24oKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2NhbGUgPSByZXRhcmdldC5yZXRhcmdldFNjYWxlKGRzdEVudGl0eSk7XG4gICAgICAgIG91dHB1dHNTY2FsZVtpICogMyArIDBdID0gb3V0cHV0U2NhbGUueDtcbiAgICAgICAgb3V0cHV0c1NjYWxlW2kgKiAzICsgMV0gPSBvdXRwdXRTY2FsZS55O1xuICAgICAgICBvdXRwdXRzU2NhbGVbaSAqIDMgKyAyXSA9IG91dHB1dFNjYWxlLno7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0c1NjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFja05hbWVzO1xuICB9XG5cbiAgcmVzZXRBbmltYXRpb25UcmFja3MoKSB7XG4gICAgdGhpcy5fX2FuaW1hdGlvblRyYWNrcy5jbGVhcigpO1xuICB9XG5cbiAgcmVzZXRBbmltYXRpb25UcmFjayh0cmFja05hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX19hbmltYXRpb25UcmFja3MuZGVsZXRlKHRyYWNrTmFtZSk7XG4gIH1cblxuICByZXNldEFuaW1hdGlvblRyYWNrQnlQb3N0Zml4KHBvc3RmaXg6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYWNrTmFtZXMgPSB0aGlzLmdldEFuaW1hdGlvblRyYWNrTmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IHRyYWNrTmFtZSBvZiB0cmFja05hbWVzKSB7XG4gICAgICBpZiAodHJhY2tOYW1lLmVuZHNXaXRoKHBvc3RmaXgpKSB7XG4gICAgICAgIHRoaXMuX19hbmltYXRpb25UcmFja3MuZGVsZXRlKHRyYWNrTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIuX2Rlc3Ryb3koKTtcbiAgICB0aGlzLl9fYW5pbWF0aW9uVHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5fX2lzQW5pbWF0aW5nID0gZmFsc2U7XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBkZWZhdWx0QW5pbWF0aW9uVHJhY2tOYW1lID0gJ0RlZmF1bHQnO1xuIiwiaW1wb3J0IHsgQW5pbWF0aW9uQ2hhbm5lbCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0FuaW1hdGlvblR5cGVzJztcbmltcG9ydCB7IEFycmF5MSwgQXJyYXkzLCBBcnJheTQsIEluZGV4IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQW5pbWF0aW9uQXR0cmlidXRlJztcbmltcG9ydCB7IEFuaW1hdGlvbkludGVycG9sYXRpb24gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9BbmltYXRpb25JbnRlcnBvbGF0aW9uJztcbmltcG9ydCB7XG4gIGFycmF5M19sZXJwX29mZnNldEFzQ29tcG9zaXRpb24sXG4gIGFycmF5Tl9sZXJwX29mZnNldEFzQ29tcG9zaXRpb24sXG4gIGdldDFfb2Zmc2V0LFxuICBnZXQxX29mZnNldEFzQ29tcG9zaXRpb24sXG4gIGdldDNfb2Zmc2V0LFxuICBnZXQzX29mZnNldEFzQ29tcG9zaXRpb24sXG4gIGdldDRfb2Zmc2V0LFxuICBnZXQ0X29mZnNldEFzQ29tcG9zaXRpb24sXG4gIGdldE5fb2Zmc2V0LFxuICBnZXROX29mZnNldEFzQ29tcG9zaXRpb24sXG4gIG11bEFycmF5M1dpdGhTY2FsYXJfb2Zmc2V0LFxuICBtdWxBcnJheTRXaXRoU2NhbGFyX29mZnNldCxcbiAgbXVsQXJyYXlOV2l0aFNjYWxhcl9vZmZzZXQsXG4gIG5vcm1hbGl6ZUFycmF5NCxcbiAgcWxlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbixcbn0gZnJvbSAnLi4vLi4vbWF0aC9yYXcvcmF3X2V4dGVuc2lvbic7XG5cbi8qKlxuICogQ29tcHV0ZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbi5cbiAqIEBwYXJhbSBwXzAgc3RhcnRpbmcgcG9pbnRcbiAqIEBwYXJhbSBwXzEgZW5kaW5nIHBvaW50XG4gKiBAcGFyYW0gbV8wIGluVGFuZ2VudFxuICogQHBhcmFtIG1fMSBvdXRUYW5nZW50XG4gKiBAcGFyYW0gdCByYXRpb1xuICogQHBhcmFtIGFuaW1hdGlvbkF0dHJpYnV0ZUluZGV4IGluZGV4IG9mIGF0dHJpYnV0aW9uXG4gKi9cbmZ1bmN0aW9uIGN1YmljU3BsaW5lKFxuICBwMDogQXJyYXk8bnVtYmVyPixcbiAgcDE6IEFycmF5PG51bWJlcj4sXG4gIG0wOiBBcnJheTxudW1iZXI+LFxuICBtMTogQXJyYXk8bnVtYmVyPixcbiAgdDogbnVtYmVyXG4pOiBBcnJheTxudW1iZXI+IHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KHAwLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcDAubGVuZ3RoOyBpKyspIHtcbiAgICByZXRbaV0gPVxuICAgICAgKDIgKiB0ICoqIDMgLSAzICogdCAqKiAyICsgMSkgKiBwMFtpXSArXG4gICAgICAodCAqKiAzIC0gMiAqIHQgKiogMiArIHQpICogbTBbaV0gK1xuICAgICAgKC0yICogdCAqKiAzICsgMyAqIHQgKiogMikgKiBwMVtpXSArXG4gICAgICAodCAqKiAzIC0gdCAqKiAyKSAqIG0xW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIF9fcHJlcGFyZVZhcmlhYmxlc0ZvckN1YmljU3BsaW5lKFxuICBvdXRwdXRBcnJheV86IEZsb2F0MzJBcnJheSB8IG51bWJlcltdLFxuICBpOiBudW1iZXIsXG4gIGNvbXBvbmVudE46IG51bWJlcixcbiAgdF9kaWZmOiBudW1iZXJcbik6IHtcbiAgcF8wOiBBcnJheTxudW1iZXI+O1xuICBwXzE6IEFycmF5PG51bWJlcj47XG4gIG1fMDogQXJyYXk8bnVtYmVyPjtcbiAgbV8xOiBBcnJheTxudW1iZXI+O1xufSB7XG4gIGNvbnN0IG91dHB1dEFycmF5ID0gb3V0cHV0QXJyYXlfIGFzIGdsb2JhbFRoaXMuRmxvYXQzMkFycmF5O1xuXG4gIGlmIChjb21wb25lbnROID09PSA0KSB7XG4gICAgY29uc3QgcF8wID0gb3V0cHV0QXJyYXlbZ2V0NF9vZmZzZXRdKFxuICAgICAgLy8gSW4gZ2xURiBDVUJJQ1NQTElORSBpbnRlcnBvbGF0aW9uLCB0YW5nZW50cyAoYWssIGJrKSBhbmQgdmFsdWVzICh2aykgYXJlIGdyb3VwZWQgd2l0aGluIGtleWZyYW1lczogYTEsYTIs4oCmYW4sdjEsdjIs4oCmdm4sYjEsYjIs4oCmYm5cbiAgICAgIGNvbXBvbmVudE4gKiAzICogaSArIGNvbXBvbmVudE5cbiAgICApO1xuICAgIGNvbnN0IHBfMSA9IG91dHB1dEFycmF5W2dldDRfb2Zmc2V0XShcbiAgICAgIC8vIEluIGdsVEYgQ1VCSUNTUExJTkUgaW50ZXJwb2xhdGlvbiwgdGFuZ2VudHMgKGFrLCBiaykgYW5kIHZhbHVlcyAodmspIGFyZSBncm91cGVkIHdpdGhpbiBrZXlmcmFtZXM6IGExLGEyLOKApmFuLHYxLHYyLOKApnZuLGIxLGIyLOKApmJuXG4gICAgICBjb21wb25lbnROICogMyAqIChpICsgMSkgKyBjb21wb25lbnROXG4gICAgKTtcbiAgICBjb25zdCBtXzAgPSBvdXRwdXRBcnJheVttdWxBcnJheTRXaXRoU2NhbGFyX29mZnNldF0oXG4gICAgICBjb21wb25lbnROICogMyAqIGkgKyBjb21wb25lbnROICogMixcbiAgICAgIHRfZGlmZlxuICAgICk7XG4gICAgY29uc3QgbV8xID0gb3V0cHV0QXJyYXlbbXVsQXJyYXk0V2l0aFNjYWxhcl9vZmZzZXRdKGNvbXBvbmVudE4gKiAzICogKGkgKyAxKSwgdF9kaWZmKTtcbiAgICByZXR1cm4geyBwXzAsIHBfMSwgbV8wLCBtXzEgfTtcbiAgfSBlbHNlIGlmIChjb21wb25lbnROID09PSAzKSB7XG4gICAgY29uc3QgcF8wID0gb3V0cHV0QXJyYXlbZ2V0M19vZmZzZXRdKFxuICAgICAgLy8gSW4gZ2xURiBDVUJJQ1NQTElORSBpbnRlcnBvbGF0aW9uLCB0YW5nZW50cyAoYWssIGJrKSBhbmQgdmFsdWVzICh2aykgYXJlIGdyb3VwZWQgd2l0aGluIGtleWZyYW1lczogYTEsYTIs4oCmYW4sdjEsdjIs4oCmdm4sYjEsYjIs4oCmYm5cbiAgICAgIGNvbXBvbmVudE4gKiAzICogaSArIGNvbXBvbmVudE5cbiAgICApIGFzIEFycmF5PG51bWJlcj47XG4gICAgY29uc3QgcF8xID0gb3V0cHV0QXJyYXlbZ2V0M19vZmZzZXRdKFxuICAgICAgLy8gSW4gZ2xURiBDVUJJQ1NQTElORSBpbnRlcnBvbGF0aW9uLCB0YW5nZW50cyAoYWssIGJrKSBhbmQgdmFsdWVzICh2aykgYXJlIGdyb3VwZWQgd2l0aGluIGtleWZyYW1lczogYTEsYTIs4oCmYW4sdjEsdjIs4oCmdm4sYjEsYjIs4oCmYm5cbiAgICAgIGNvbXBvbmVudE4gKiAzICogKGkgKyAxKSArIGNvbXBvbmVudE5cbiAgICApIGFzIEFycmF5PG51bWJlcj47XG4gICAgY29uc3QgbV8wID0gb3V0cHV0QXJyYXlbbXVsQXJyYXkzV2l0aFNjYWxhcl9vZmZzZXRdKFxuICAgICAgY29tcG9uZW50TiAqIDMgKiBpICsgY29tcG9uZW50TiAqIDIsXG4gICAgICB0X2RpZmZcbiAgICApIGFzIEFycmF5PG51bWJlcj47XG4gICAgY29uc3QgbV8xID0gb3V0cHV0QXJyYXlbbXVsQXJyYXkzV2l0aFNjYWxhcl9vZmZzZXRdKFxuICAgICAgY29tcG9uZW50TiAqIDMgKiAoaSArIDEpLFxuICAgICAgdF9kaWZmXG4gICAgKSBhcyBBcnJheTxudW1iZXI+O1xuICAgIHJldHVybiB7IHBfMCwgcF8xLCBtXzAsIG1fMSB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBfMCA9IG91dHB1dEFycmF5W2dldE5fb2Zmc2V0XShcbiAgICAgIC8vIEluIGdsVEYgQ1VCSUNTUExJTkUgaW50ZXJwb2xhdGlvbiwgdGFuZ2VudHMgKGFrLCBiaykgYW5kIHZhbHVlcyAodmspIGFyZSBncm91cGVkIHdpdGhpbiBrZXlmcmFtZXM6IGExLGEyLOKApmFuLHYxLHYyLOKApnZuLGIxLGIyLOKApmJuXG4gICAgICBjb21wb25lbnROICogMyAqIGkgKyBjb21wb25lbnROLFxuICAgICAgY29tcG9uZW50TlxuICAgICk7XG4gICAgY29uc3QgcF8xID0gb3V0cHV0QXJyYXlbZ2V0Tl9vZmZzZXRdKFxuICAgICAgLy8gSW4gZ2xURiBDVUJJQ1NQTElORSBpbnRlcnBvbGF0aW9uLCB0YW5nZW50cyAoYWssIGJrKSBhbmQgdmFsdWVzICh2aykgYXJlIGdyb3VwZWQgd2l0aGluIGtleWZyYW1lczogYTEsYTIs4oCmYW4sdjEsdjIs4oCmdm4sYjEsYjIs4oCmYm5cbiAgICAgIGNvbXBvbmVudE4gKiAzICogKGkgKyAxKSArIGNvbXBvbmVudE4sXG4gICAgICBjb21wb25lbnROXG4gICAgKTtcbiAgICBjb25zdCBtXzAgPSBvdXRwdXRBcnJheVttdWxBcnJheU5XaXRoU2NhbGFyX29mZnNldF0oXG4gICAgICBjb21wb25lbnROICogMyAqIGkgKyBjb21wb25lbnROICogMixcbiAgICAgIGNvbXBvbmVudE4sXG4gICAgICB0X2RpZmZcbiAgICApIGFzIEFycmF5PG51bWJlcj47XG4gICAgY29uc3QgbV8xID0gb3V0cHV0QXJyYXlbbXVsQXJyYXlOV2l0aFNjYWxhcl9vZmZzZXRdKFxuICAgICAgY29tcG9uZW50TiAqIDMgKiAoaSArIDEpLFxuICAgICAgY29tcG9uZW50TixcbiAgICAgIHRfZGlmZlxuICAgICkgYXMgQXJyYXk8bnVtYmVyPjtcbiAgICByZXR1cm4geyBwXzAsIHBfMSwgbV8wLCBtXzEgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfX2dldE91dHB1dFZhbHVlKFxuICBrZXlGcmFtZUlkOiBJbmRleCxcbiAgY2hhbm5lbDogQW5pbWF0aW9uQ2hhbm5lbCxcbiAgYXJyYXlfOiBGbG9hdDMyQXJyYXkgfCBudW1iZXJbXVxuKSB7XG4gIGNvbnN0IGFycmF5ID0gYXJyYXlfIGFzIGdsb2JhbFRoaXMuRmxvYXQzMkFycmF5O1xuICBpZiAoY2hhbm5lbC5zYW1wbGVyLmludGVycG9sYXRpb25NZXRob2QgPT09IEFuaW1hdGlvbkludGVycG9sYXRpb24uQ3ViaWNTcGxpbmUpIHtcbiAgICAvLyBJbiBnbFRGIENVQklDU1BMSU5FIGludGVycG9sYXRpb24sIHRhbmdlbnRzIChhaywgYmspIGFuZCB2YWx1ZXMgKHZrKSBhcmUgZ3JvdXBlZCB3aXRoaW4ga2V5ZnJhbWVzOiBhMSxhMizigKZhbix2MSx2MizigKZ2bixiMSxiMizigKZiblxuICAgIGlmIChjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TiA9PT0gNCkge1xuICAgICAgLy8gUXVhdGVybmlvbi93ZWlnaHRzXG4gICAgICBjb25zdCB2YWx1ZSA9IGFycmF5W2dldDRfb2Zmc2V0XShcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE4gKiAzICoga2V5RnJhbWVJZCArIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROXG4gICAgICApIGFzIEFycmF5NDxudW1iZXI+O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE4gPT09IDMpIHtcbiAgICAgIC8vIFRyYW5zbGF0ZS9TY2FsZS93ZWlnaHRzXG4gICAgICBjb25zdCB2YWx1ZSA9IGFycmF5W2dldDNfb2Zmc2V0XShcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE4gKiAzICoga2V5RnJhbWVJZCArIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROXG4gICAgICApIGFzIEFycmF5MzxudW1iZXI+O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE4gPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbZ2V0MV9vZmZzZXRdKFxuICAgICAgICBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TiAqIDMgKiBrZXlGcmFtZUlkICsgY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE5cbiAgICAgICkgYXMgQXJyYXkxPG51bWJlcj47XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlaWdodHMgLy8gb3V0cHV0Q29tcG9uZW50TiA9PT0gTlxuICAgICAgY29uc3QgdmFsdWUgPSBhcnJheVtnZXROX29mZnNldF0oXG4gICAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROICogMyAqIGtleUZyYW1lSWQgKyBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TixcbiAgICAgICAgY2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE5cbiAgICAgICkgYXMgQXJyYXk8bnVtYmVyPjtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRm9yIE90aGVyIHRoYW4gQ1VCSUNTUExJTkUgaW50ZXJwb2xhdGlvblxuICAgIGlmIChjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TiA9PT0gNCkge1xuICAgICAgLy8gUXVhdGVybmlvbi93ZWlnaHRzXG4gICAgICBjb25zdCB2YWx1ZSA9IGFycmF5W2dldDRfb2Zmc2V0QXNDb21wb3NpdGlvbl0oa2V5RnJhbWVJZCkgYXMgQXJyYXk0PG51bWJlcj47XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TiA9PT0gMykge1xuICAgICAgLy8gVHJhbnNsYXRlL1NjYWxlL3dlaWdodHNcbiAgICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbZ2V0M19vZmZzZXRBc0NvbXBvc2l0aW9uXShrZXlGcmFtZUlkKSBhcyBBcnJheTM8bnVtYmVyPjtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROID09PSAxKSB7XG4gICAgICAvLyBFZmZla3NlZXIgKEFuaW1hdGlvbiBFdmVudClcbiAgICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbZ2V0MV9vZmZzZXRBc0NvbXBvc2l0aW9uXShrZXlGcmFtZUlkKSBhcyBBcnJheTE8bnVtYmVyPjtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2VpZ2h0c1xuICAgICAgY29uc3QgdmFsdWUgPSBhcnJheVtnZXROX29mZnNldEFzQ29tcG9zaXRpb25dKFxuICAgICAgICBrZXlGcmFtZUlkLFxuICAgICAgICBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TlxuICAgICAgKSBhcyBBcnJheTxudW1iZXI+O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goaW5wdXRBcnJheTogRmxvYXQzMkFycmF5LCBjdXJyZW50VGltZTogbnVtYmVyKSB7XG4gIGxldCBsb3cgPSAwO1xuICBsZXQgaGlnaCA9IGlucHV0QXJyYXkubGVuZ3RoIC0gMTtcbiAgbGV0IG1pZCA9IDA7XG4gIGxldCByZXRWYWwgPSAwO1xuICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpO1xuXG4gICAgaWYgKGlucHV0QXJyYXlbbWlkXSA8IGN1cnJlbnRUaW1lKSB7XG4gICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgcmV0VmFsID0gbWlkO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFRpbWUgPCBpbnB1dEFycmF5W21pZF0pIHtcbiAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgcmV0VmFsID0gaGlnaDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgKGlucHV0QXJyYXlbbWlkXSA9PT0gaW5wdXQpIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldFZhbDtcbn1cblxuZnVuY3Rpb24gYnJ1dGVGb3JjZVNlYXJjaChpbnB1dEFycmF5OiBGbG9hdDMyQXJyYXksIGN1cnJlbnRUaW1lOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGlucHV0QXJyYXlbaV0gPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBpbnB1dEFycmF5W2kgKyAxXSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnB1dEFycmF5Lmxlbmd0aCAtIDE7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRpb25TZWFyY2goaW5wdXRBcnJheTogRmxvYXQzMkFycmF5IHwgbnVtYmVyW10sIGN1cnJlbnRUaW1lOiBudW1iZXIpIHtcbiAgbGV0IG1pZCA9IDA7XG4gIGxldCBsb3dlciA9IDA7XG4gIGxldCB1cHBlciA9IGlucHV0QXJyYXkubGVuZ3RoIC0gMTtcbiAgbGV0IHJldFZhbCA9IDA7XG5cbiAgd2hpbGUgKGxvd2VyIDw9IHVwcGVyICYmIGN1cnJlbnRUaW1lID49IGlucHV0QXJyYXlbbG93ZXJdICYmIGN1cnJlbnRUaW1lIDw9IGlucHV0QXJyYXlbdXBwZXJdKSB7XG4gICAgbWlkID0gTWF0aC5mbG9vcihcbiAgICAgIGxvd2VyICtcbiAgICAgICAgKChjdXJyZW50VGltZSAtIGlucHV0QXJyYXlbbG93ZXJdKSAqICh1cHBlciAtIGxvd2VyKSkgL1xuICAgICAgICAgIChpbnB1dEFycmF5W3VwcGVyXSAtIGlucHV0QXJyYXlbbG93ZXJdKVxuICAgICk7XG5cbiAgICBpZiAoaW5wdXRBcnJheVttaWRdIDwgY3VycmVudFRpbWUpIHtcbiAgICAgIGxvd2VyID0gbWlkICsgMTtcbiAgICAgIHJldFZhbCA9IG1pZDtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRUaW1lIDwgaW5wdXRBcnJheVttaWRdKSB7XG4gICAgICB1cHBlciA9IG1pZCAtIDE7XG4gICAgICByZXRWYWwgPSB1cHBlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgKGlucHV0QXJyYXlbbWlkXSA9PT0gaW5wdXQpIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldFZhbDtcbn1cblxuZnVuY3Rpb24gX19sZXJwKFxuICBkYXRhXzogRmxvYXQzMkFycmF5IHwgbnVtYmVyW10sXG4gIHJhdGlvOiBudW1iZXIsXG4gIGFuaW1hdGlvbkF0dHJpYnV0ZUluZGV4OiBJbmRleCxcbiAgaTogSW5kZXgsXG4gIG91dHB1dENvbXBvbmVudE46IG51bWJlclxuKSB7XG4gIGNvbnN0IGRhdGEgPSBkYXRhXyBhcyBnbG9iYWxUaGlzLkZsb2F0MzJBcnJheTtcbiAgaWYgKGFuaW1hdGlvbkF0dHJpYnV0ZUluZGV4ID09PSBBbmltYXRpb25BdHRyaWJ1dGUuUXVhdGVybmlvbi5pbmRleCkge1xuICAgIGNvbnN0IGFycmF5NCA9IGRhdGFbcWxlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl0oZGF0YSwgcmF0aW8sIGksIGkgKyAxKTtcbiAgICByZXR1cm4gYXJyYXk0O1xuICB9IGVsc2UgaWYgKGFuaW1hdGlvbkF0dHJpYnV0ZUluZGV4ID09PSBBbmltYXRpb25BdHRyaWJ1dGUuV2VpZ2h0cy5pbmRleCkge1xuICAgIGNvbnN0IGFycmF5TiA9IGRhdGFbYXJyYXlOX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl0oZGF0YSwgb3V0cHV0Q29tcG9uZW50TiwgcmF0aW8sIGksIGkgKyAxKTtcbiAgICByZXR1cm4gYXJyYXlOO1xuICB9IGVsc2Uge1xuICAgIC8vIFRyYW5zbGF0ZSAvIFNjYWxlXG4gICAgY29uc3QgYXJyYXkzID0gZGF0YVthcnJheTNfbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uXShkYXRhLCByYXRpbywgaSwgaSArIDEpO1xuICAgIHJldHVybiBhcnJheTM7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW50ZXJwb2xhdGUoXG4gIGNoYW5uZWw6IEFuaW1hdGlvbkNoYW5uZWwsXG4gIGN1cnJlbnRUaW1lOiBudW1iZXIsXG4gIGFuaW1hdGlvbkF0dHJpYnV0ZUluZGV4OiBJbmRleFxuKTogQXJyYXk8bnVtYmVyPiB7XG4gIGNvbnN0IGlucHV0QXJyYXkgPSBjaGFubmVsLnNhbXBsZXIuaW5wdXQ7XG4gIGNvbnN0IG91dHB1dEFycmF5ID0gY2hhbm5lbC5zYW1wbGVyLm91dHB1dDtcbiAgY29uc3QgbWV0aG9kID0gY2hhbm5lbC5zYW1wbGVyLmludGVycG9sYXRpb25NZXRob2QgPz8gQW5pbWF0aW9uSW50ZXJwb2xhdGlvbi5MaW5lYXI7XG5cbiAgLy8gb3V0IG9mIHJhbmdlXG4gIGlmIChjdXJyZW50VGltZSA8PSBpbnB1dEFycmF5WzBdKSB7XG4gICAgY29uc3Qgb3V0cHV0T2ZaZXJvRnJhbWUgPSBfX2dldE91dHB1dFZhbHVlKDAsIGNoYW5uZWwsIG91dHB1dEFycmF5KTtcbiAgICByZXR1cm4gb3V0cHV0T2ZaZXJvRnJhbWU7XG4gIH0gZWxzZSBpZiAoaW5wdXRBcnJheVtpbnB1dEFycmF5Lmxlbmd0aCAtIDFdIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgY29uc3Qgb3V0cHV0T2ZFbmRGcmFtZSA9IF9fZ2V0T3V0cHV0VmFsdWUoaW5wdXRBcnJheS5sZW5ndGggLSAxLCBjaGFubmVsLCBvdXRwdXRBcnJheSk7XG4gICAgcmV0dXJuIG91dHB1dE9mRW5kRnJhbWU7XG4gIH1cblxuICBpZiAobWV0aG9kID09PSBBbmltYXRpb25JbnRlcnBvbGF0aW9uLkN1YmljU3BsaW5lKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL3NwZWNpZmljYXRpb24vMi4wI2FwcGVuZGl4LWMtc3BsaW5lLWludGVycG9sYXRpb25cbiAgICBjb25zdCBpID0gaW50ZXJwb2xhdGlvblNlYXJjaChpbnB1dEFycmF5LCBjdXJyZW50VGltZSk7XG4gICAgY29uc3QgdF9kaWZmID0gaW5wdXRBcnJheVtpICsgMV0gLSBpbnB1dEFycmF5W2ldOyAvLyB0XyhrKzEpIC0gdF9rXG4gICAgY29uc3QgdCA9IChjdXJyZW50VGltZSAtIGlucHV0QXJyYXlbaV0pIC8gdF9kaWZmO1xuICAgIGNvbnN0IHsgcF8wLCBwXzEsIG1fMCwgbV8xIH0gPSBfX3ByZXBhcmVWYXJpYWJsZXNGb3JDdWJpY1NwbGluZShcbiAgICAgIG91dHB1dEFycmF5LFxuICAgICAgaSxcbiAgICAgIGNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROLFxuICAgICAgdF9kaWZmXG4gICAgKTtcbiAgICBjb25zdCByZXQgPSBjdWJpY1NwbGluZShwXzAsIHBfMSwgbV8wLCBtXzEsIHQpIGFzIGdsb2JhbFRoaXMuQXJyYXk8bnVtYmVyPjtcbiAgICBpZiAoYW5pbWF0aW9uQXR0cmlidXRlSW5kZXggPT09IEFuaW1hdGlvbkF0dHJpYnV0ZS5RdWF0ZXJuaW9uLmluZGV4KSB7XG4gICAgICAocmV0IGFzIGFueSlbbm9ybWFsaXplQXJyYXk0XSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gQW5pbWF0aW9uSW50ZXJwb2xhdGlvbi5MaW5lYXIpIHtcbiAgICBjb25zdCBpID0gaW50ZXJwb2xhdGlvblNlYXJjaChpbnB1dEFycmF5LCBjdXJyZW50VGltZSk7XG4gICAgY29uc3QgcmF0aW8gPSAoY3VycmVudFRpbWUgLSBpbnB1dEFycmF5W2ldKSAvIChpbnB1dEFycmF5W2kgKyAxXSAtIGlucHV0QXJyYXlbaV0pO1xuICAgIGNvbnN0IHJldCA9IF9fbGVycChcbiAgICAgIG91dHB1dEFycmF5LFxuICAgICAgcmF0aW8sXG4gICAgICBhbmltYXRpb25BdHRyaWJ1dGVJbmRleCxcbiAgICAgIGksXG4gICAgICBjaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TlxuICAgICk7XG4gICAgcmV0dXJuIHJldCBhcyBBcnJheTxudW1iZXI+O1xuICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gQW5pbWF0aW9uSW50ZXJwb2xhdGlvbi5TdGVwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgaWYgKGlucHV0QXJyYXlbaV0gPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBpbnB1dEFycmF5W2kgKyAxXSkge1xuICAgICAgICBjb25zdCBvdXRwdXRfZnJhbWVfaSA9IF9fZ2V0T3V0cHV0VmFsdWUoaSwgY2hhbm5lbCwgb3V0cHV0QXJyYXkpO1xuICAgICAgICByZXR1cm4gb3V0cHV0X2ZyYW1lX2k7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dE9mRW5kRnJhbWUgPSBfX2dldE91dHB1dFZhbHVlKGlucHV0QXJyYXkubGVuZ3RoIC0gMSwgY2hhbm5lbCwgb3V0cHV0QXJyYXkpO1xuICAgIHJldHVybiBvdXRwdXRPZkVuZEZyYW1lO1xuICB9XG5cbiAgLy8gbm9uIHN1cHBvcnRlZCB0eXBlXG4gIHJldHVybiBbXTtcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eVVJRCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IE1peGluQmFzZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1R5cGVHZW5lcmF0b3JzJztcbmltcG9ydCB7IEFuaW1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQW5pbWF0aW9uL0FuaW1hdGlvbkNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFuaW1hdGlvbkVudGl0eU1ldGhvZHMge1xuICBnZXRBbmltYXRpb24oKTogQW5pbWF0aW9uQ29tcG9uZW50O1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BbmltYXRpb25Db21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9JQW5pbWF0aW9uRW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vQW5pbWF0aW9uQ29uc3RhbnRzJztcbiIsImltcG9ydCB7IEFuaW1hdGlvblRyYWNrTmFtZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0FuaW1hdGlvblR5cGVzJztcbmltcG9ydCB7IENvbXBvbmVudFNJRCwgQ29tcG9uZW50VElELCBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSwgYXBwbHlNaXhpbnMgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IElBbmltYXRpb25TdGF0ZUVudGl0eSwgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi8uLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9Db21wb25lbnRUeXBlcyc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25TdGF0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgX19hY3RpdmVBbmltYXRpb25UcmFjazogQW5pbWF0aW9uVHJhY2tOYW1lID0gJyc7XG4gIHByaXZhdGUgX19pbnRlcnBvbGF0aW9uU3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIHByaXZhdGUgX19ibGVuZGluZ0R1cmF0aW9uID0gMS4wO1xuICBwcml2YXRlIF9faXNCbGVuZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9fYmxlbmRpbmdSYXRpbyA9IDAuMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlVaWQ6IEVudGl0eVVJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRCxcbiAgICBlbnRpdHlDb21wb25lbnQ6IEVudGl0eVJlcG9zaXRvcnksXG4gICAgaXNSZVVzZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihlbnRpdHlVaWQsIGNvbXBvbmVudFNpZCwgZW50aXR5Q29tcG9uZW50LCBpc1JlVXNlKTtcblxuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQW5pbWF0aW9uU3RhdGVDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQW5pbWF0aW9uU3RhdGVDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgaXNCbGVuZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzQmxlbmRpbmc7XG4gIH1cblxuICBnZXQgYmxlbmRpbmdSYXRpbygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2JsZW5kaW5nUmF0aW87XG4gIH1cblxuICAkbG9naWMoKSB7XG4gICAgaWYgKCF0aGlzLl9faXNCbGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuX19pbnRlcnBvbGF0aW9uU3RhcnRUaW1lKSAvIDEwMDA7XG4gICAgY29uc3QgYmxlbmRpbmdUaW1lID0gZWxhcHNlZFRpbWUgLyB0aGlzLl9fYmxlbmRpbmdEdXJhdGlvbjtcbiAgICBpZiAoYmxlbmRpbmdUaW1lID49IDEpIHtcbiAgICAgIHRoaXMuX19pc0JsZW5kaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5taW4oYmxlbmRpbmdUaW1lLCAxKTtcbiAgICB0aGlzLnNldEFuaW1hdGlvbkJsZW5kaW5nUmF0aW8ocmF0aW8pO1xuICAgIHRoaXMuX19ibGVuZGluZ1JhdGlvID0gcmF0aW87XG4gIH1cblxuICBzZXRGaXJzdEFjdGl2ZUFuaW1hdGlvblRyYWNrKHRyYWNrTmFtZTogQW5pbWF0aW9uVHJhY2tOYW1lKSB7XG4gICAgdGhpcy5fX2FjdGl2ZUFuaW1hdGlvblRyYWNrID0gdHJhY2tOYW1lO1xuICAgIHRoaXMuc2V0QWN0aXZlQW5pbWF0aW9uVHJhY2sodHJhY2tOYW1lKTtcbiAgICB0aGlzLnNldEFuaW1hdGlvbkJsZW5kaW5nUmF0aW8oMCk7XG4gICAgdGhpcy5fX2lzQmxlbmRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGZvcmNlVHJhbnNpdGlvblRvKHRyYWNrTmFtZTogQW5pbWF0aW9uVHJhY2tOYW1lLCBkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgY29uc3QgcHJldlRyYWNrID0gdGhpcy5fX2FjdGl2ZUFuaW1hdGlvblRyYWNrO1xuXG4gICAgdGhpcy5zZXRBY3RpdmVBbmltYXRpb25UcmFjayhwcmV2VHJhY2spO1xuICAgIHRoaXMuc2V0U2Vjb25kQWN0aXZlQW5pbWF0aW9uVHJhY2sodHJhY2tOYW1lKTtcbiAgICB0aGlzLl9faW50ZXJwb2xhdGlvblN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHRoaXMuX19ibGVuZGluZ0R1cmF0aW9uID0gZHVyYXRpb247XG4gICAgdGhpcy5fX2FjdGl2ZUFuaW1hdGlvblRyYWNrID0gdHJhY2tOYW1lO1xuXG4gICAgdGhpcy5fX2lzQmxlbmRpbmcgPSB0cnVlO1xuICB9XG5cbiAgc2V0QWN0aXZlQW5pbWF0aW9uVHJhY2soYW5pbWF0aW9uVHJhY2tOYW1lOiBBbmltYXRpb25UcmFja05hbWUpIHtcbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVjdXJzaXZlbHkoZW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSkge1xuICAgICAgY29uc3QgYW5pbSA9IGVudGl0eS50cnlUb0dldEFuaW1hdGlvbigpO1xuICAgICAgaWYgKGFuaW0gIT0gbnVsbCkge1xuICAgICAgICBhbmltLnNldEFjdGl2ZUFuaW1hdGlvblRyYWNrKGFuaW1hdGlvblRyYWNrTmFtZSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVudGl0eS5jaGlsZHJlbikge1xuICAgICAgICBwcm9jZXNzUmVjdXJzaXZlbHkoY2hpbGQuZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc1JlY3Vyc2l2ZWx5KHRoaXMuZW50aXR5KTtcbiAgfVxuXG4gIHNldFNlY29uZEFjdGl2ZUFuaW1hdGlvblRyYWNrKGFuaW1hdGlvblRyYWNrTmFtZTogQW5pbWF0aW9uVHJhY2tOYW1lKSB7XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlY3Vyc2l2ZWx5KGVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICAgIGNvbnN0IGFuaW0gPSBlbnRpdHkudHJ5VG9HZXRBbmltYXRpb24oKTtcbiAgICAgIGlmIChhbmltICE9IG51bGwpIHtcbiAgICAgICAgYW5pbS5zZXRTZWNvbmRBY3RpdmVBbmltYXRpb25UcmFjayhhbmltYXRpb25UcmFja05hbWUpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbnRpdHkuY2hpbGRyZW4pIHtcbiAgICAgICAgcHJvY2Vzc1JlY3Vyc2l2ZWx5KGNoaWxkLmVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3NSZWN1cnNpdmVseSh0aGlzLmVudGl0eSk7XG4gIH1cblxuICBzZXRVc2VHbG9iYWxUaW1lKGZsZzogYm9vbGVhbikge1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWN1cnNpdmVseShlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgICBjb25zdCBhbmltID0gZW50aXR5LnRyeVRvR2V0QW5pbWF0aW9uKCk7XG4gICAgICBpZiAoYW5pbSAhPSBudWxsKSB7XG4gICAgICAgIGFuaW0udXNlR2xvYmFsVGltZSA9IGZsZztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZW50aXR5LmNoaWxkcmVuKSB7XG4gICAgICAgIHByb2Nlc3NSZWN1cnNpdmVseShjaGlsZC5lbnRpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9jZXNzUmVjdXJzaXZlbHkodGhpcy5lbnRpdHkpO1xuICB9XG5cbiAgc2V0SXNMb29wKGZsZzogYm9vbGVhbikge1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWN1cnNpdmVseShlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgICBjb25zdCBhbmltID0gZW50aXR5LnRyeVRvR2V0QW5pbWF0aW9uKCk7XG4gICAgICBpZiAoYW5pbSAhPSBudWxsKSB7XG4gICAgICAgIGFuaW0uaXNMb29wID0gZmxnO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbnRpdHkuY2hpbGRyZW4pIHtcbiAgICAgICAgcHJvY2Vzc1JlY3Vyc2l2ZWx5KGNoaWxkLmVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3NSZWN1cnNpdmVseSh0aGlzLmVudGl0eSk7XG4gIH1cblxuICBzZXRUaW1lKHRpbWU6IG51bWJlcikge1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWN1cnNpdmVseShlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgICBjb25zdCBhbmltID0gZW50aXR5LnRyeVRvR2V0QW5pbWF0aW9uKCk7XG4gICAgICBpZiAoYW5pbSAhPSBudWxsKSB7XG4gICAgICAgIGFuaW0udGltZSA9IHRpbWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVudGl0eS5jaGlsZHJlbikge1xuICAgICAgICBwcm9jZXNzUmVjdXJzaXZlbHkoY2hpbGQuZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc1JlY3Vyc2l2ZWx5KHRoaXMuZW50aXR5KTtcbiAgfVxuXG4gIHNldEFuaW1hdGlvbkJsZW5kaW5nUmF0aW8ocmF0aW86IG51bWJlcikge1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWN1cnNpdmVseShlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgICBjb25zdCBhbmltID0gZW50aXR5LnRyeVRvR2V0QW5pbWF0aW9uKCk7XG4gICAgICBpZiAoYW5pbSAhPSBudWxsKSB7XG4gICAgICAgIGFuaW0uYW5pbWF0aW9uQmxlbmRpbmdSYXRpbyA9IHJhdGlvO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbnRpdHkuY2hpbGRyZW4pIHtcbiAgICAgICAgcHJvY2Vzc1JlY3Vyc2l2ZWx5KGNoaWxkLmVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3NSZWN1cnNpdmVseSh0aGlzLmVudGl0eSk7XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5fZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgZW50aXR5IHdoaWNoIGhhcyB0aGlzIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnRcbiAgICovXG4gIGdldCBlbnRpdHkoKTogSUFuaW1hdGlvblN0YXRlRW50aXR5IHtcbiAgICByZXR1cm4gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkodGhpcy5fX2VudGl0eVVpZCkgYXMgdW5rbm93biBhcyBJQW5pbWF0aW9uU3RhdGVFbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApIHtcbiAgICBjbGFzcyBCbGVuZFNoYXBlRW50aXR5IGV4dGVuZHMgKGJhc2UuY29uc3RydWN0b3IgYXMgYW55KSB7XG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50aXR5VUlEOiBFbnRpdHlVSUQsXG4gICAgICAgIGlzQWxpdmU6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBvbmVudHM/OiBNYXA8Q29tcG9uZW50VElELCBDb21wb25lbnQ+XG4gICAgICApIHtcbiAgICAgICAgc3VwZXIoZW50aXR5VUlELCBpc0FsaXZlLCBjb21wb25lbnRzKTtcbiAgICAgIH1cblxuICAgICAgZ2V0QW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQW5pbWF0aW9uU3RhdGVDb21wb25lbnRUSURcbiAgICAgICAgKSBhcyBBbmltYXRpb25TdGF0ZUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlNaXhpbnMoYmFzZSwgQmxlbmRTaGFwZUVudGl0eSk7XG4gICAgcmV0dXJuIGJhc2UgYXMgdW5rbm93biBhcyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8U29tZUNvbXBvbmVudENsYXNzPiAmIEVudGl0eUJhc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcbmltcG9ydCB7IGFwcGx5TWl4aW5zLCBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NTdGFnZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUSUQsIENvbXBvbmVudFNJRCwgRW50aXR5VUlELCBJbmRleCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9Db21wb25lbnRUeXBlcyc7XG5cbi8qKlxuICogVGhlIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgdGhlIGJsZW5kIHNoYXBlLlxuICovXG5leHBvcnQgY2xhc3MgQmxlbmRTaGFwZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgX193ZWlnaHRzOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIF9fdGFyZ2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX191cGRhdGVDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgY29tcG9uZW50U2lkOiBDb21wb25lbnRTSUQsXG4gICAgZW50aXR5Q29tcG9uZW50OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5VWlkLCBjb21wb25lbnRTaWQsIGVudGl0eUNvbXBvbmVudCwgaXNSZVVzZSk7XG5cbiAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5Mb2dpYyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHVwZGF0ZUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlQ291bnQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLkJsZW5kU2hhcGVDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQmxlbmRTaGFwZUNvbXBvbmVudFRJRDtcbiAgfVxuXG4gIHNldCB3ZWlnaHRzKHdlaWdodHM6IG51bWJlcltdKSB7XG4gICAgdGhpcy5fX3dlaWdodHMgPSB3ZWlnaHRzO1xuICAgIEJsZW5kU2hhcGVDb21wb25lbnQuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHdlaWdodHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWlnaHRzO1xuICB9XG5cbiAgc2V0IHRhcmdldE5hbWVzKG5hbWVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX190YXJnZXROYW1lcyA9IG5hbWVzO1xuICAgIEJsZW5kU2hhcGVDb21wb25lbnQuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHRhcmdldE5hbWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9fdGFyZ2V0TmFtZXM7XG4gIH1cblxuICBzZXRXZWlnaHRCeUluZGV4KGluZGV4OiBJbmRleCwgd2VpZ2h0OiBudW1iZXIpIHtcbiAgICB0aGlzLl9fd2VpZ2h0c1tpbmRleF0gPSB3ZWlnaHQ7XG4gICAgQmxlbmRTaGFwZUNvbXBvbmVudC5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICAkbG9naWMoKSB7fVxuXG4gIF9kZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLl9kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApIHtcbiAgICBjbGFzcyBCbGVuZFNoYXBlRW50aXR5IGV4dGVuZHMgKGJhc2UuY29uc3RydWN0b3IgYXMgYW55KSB7XG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50aXR5VUlEOiBFbnRpdHlVSUQsXG4gICAgICAgIGlzQWxpdmU6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBvbmVudHM/OiBNYXA8Q29tcG9uZW50VElELCBDb21wb25lbnQ+XG4gICAgICApIHtcbiAgICAgICAgc3VwZXIoZW50aXR5VUlELCBpc0FsaXZlLCBjb21wb25lbnRzKTtcbiAgICAgIH1cblxuICAgICAgZ2V0QmxlbmRTaGFwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5CbGVuZFNoYXBlQ29tcG9uZW50VElEXG4gICAgICAgICkgYXMgQmxlbmRTaGFwZUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlNaXhpbnMoYmFzZSwgQmxlbmRTaGFwZUVudGl0eSk7XG4gICAgcmV0dXJuIGJhc2UgYXMgdW5rbm93biBhcyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8U29tZUNvbXBvbmVudENsYXNzPiAmIEVudGl0eUJhc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJsZW5kU2hhcGVDb21wb25lbnQgfSBmcm9tICcuLi9CbGVuZFNoYXBlL0JsZW5kU2hhcGVDb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElCbGVuZFNoYXBlRW50aXR5TWV0aG9kcyB7XG4gIGdldEJsZW5kU2hhcGUoKTogQmxlbmRTaGFwZUNvbXBvbmVudDtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQmxlbmRTaGFwZUNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0lCbGVuZFNoYXBlRW50aXR5JztcbiIsImltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMsIEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IENhbWVyYVR5cGVFbnVtLCBDYW1lcmFUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ2FtZXJhVHlwZSc7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NDQnO1xuaW1wb3J0IHsgQnVmZmVyVXNlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQnVmZmVyVXNlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IE11dGFibGVNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NTdGFnZSc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVZlY3RvcjQnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IEZydXN0dW0gfSBmcm9tICcuLi8uLi9nZW9tZXRyeS9GcnVzdHVtJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgQ29tcG9uZW50U0lELCBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBHbG9iYWxEYXRhUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvR2xvYmFsRGF0YVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoVXRpbCc7XG5pbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgUm5YUiB9IGZyb20gJy4uLy4uLy4uL3hyL21haW4nO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uLy4uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgSUNhbWVyYUVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9Db21wb25lbnRUeXBlcyc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgTGlnaHRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvTGlnaHRUeXBlJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9UcmFuc2Zvcm0vVHJhbnNmb3JtQ29tcG9uZW50JztcbmltcG9ydCB7IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQgfSBmcm9tICcuLi9DYW1lcmFDb250cm9sbGVyL0NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQnO1xuaW1wb3J0IHsgY3JlYXRlR3JvdXBFbnRpdHkgfSBmcm9tICcuLi9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcblxuLyoqXG4gKiBUaGUgQ29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBhIGNhbWVyYS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhlIGNhbWVyYSBpcyBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgbG9jYWwgK1ggYXhpcyBpcyB0byB0aGUgcmlnaHQsXG4gKiB0aGUg4oCcbGVuc+KAnSBsb29rcyB0b3dhcmRzIHRoZSBsb2NhbCAtWiBheGlzLFxuICogYW5kIHRoZSB0b3Agb2YgdGhlIGNhbWVyYSBpcyBhbGlnbmVkIHdpdGggdGhlIGxvY2FsICtZIGF4aXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW1lcmFDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfZXllOiBWZWN0b3IzID0gVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgX2V5ZUlubmVyOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLmR1bW15KCk7XG4gIHByaXZhdGUgX2RpcmVjdGlvbjogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy5kdW1teSgpO1xuICBwcml2YXRlIF9kaXJlY3Rpb25Jbm5lcjogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy5kdW1teSgpO1xuICBwcml2YXRlIF91cDogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy5kdW1teSgpO1xuICBwcml2YXRlIF91cElubmVyOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLmR1bW15KCk7XG4gIHByaXZhdGUgX2ZpbG1XaWR0aCA9IDM2OyAvLyBtaWxpIG1ldGVyXG4gIHByaXZhdGUgX2ZpbG1IZWlnaHQgPSAyNDsgLy8gbWlsaSBtZXRlclxuICBwcml2YXRlIF9mb2NhbExlbmd0aCA9IDIwO1xuICBwcml2YXRlIHByaW1pdGl2ZU1vZGUgPSBmYWxzZTtcbiAgLy8geDogbGVmdCwgeTpyaWdodCwgejp0b3AsIHc6IGJvdHRvbVxuICBwcml2YXRlIF9jb3JuZXI6IE11dGFibGVWZWN0b3I0ID0gTXV0YWJsZVZlY3RvcjQuZHVtbXkoKTtcbiAgcHJpdmF0ZSBfY29ybmVySW5uZXI6IE11dGFibGVWZWN0b3I0ID0gTXV0YWJsZVZlY3RvcjQuZHVtbXkoKTtcblxuICAvLyB4OiB6TmVhciwgeTogekZhcixcbiAgLy8gaWYgcGVyc3BlY3RpdmUsIHo6IGZvdnksIHc6IGFzcGVjdFxuICAvLyBpZiBvcnRobywgejogeG1hZywgdzogeW1hZ1xuICBwcml2YXRlIF9wYXJhbWV0ZXJzOiBNdXRhYmxlVmVjdG9yNCA9IE11dGFibGVWZWN0b3I0LmR1bW15KCk7XG4gIHByaXZhdGUgX3BhcmFtZXRlcnNJbm5lcjogTXV0YWJsZVZlY3RvcjQgPSBNdXRhYmxlVmVjdG9yNC5kdW1teSgpO1xuICBwcml2YXRlIF9fdHlwZTogQ2FtZXJhVHlwZUVudW0gPSBDYW1lcmFUeXBlLlBlcnNwZWN0aXZlO1xuXG4gIHByaXZhdGUgX3Byb2plY3Rpb25NYXRyaXg6IE11dGFibGVNYXRyaXg0NCA9IE11dGFibGVNYXRyaXg0NC5kdW1teSgpO1xuICBwcml2YXRlIF9faXNQcm9qZWN0aW9uTWF0cml4VXBUb0RhdGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmlld01hdHJpeDogTXV0YWJsZU1hdHJpeDQ0ID0gTXV0YWJsZU1hdHJpeDQ0LmR1bW15KCk7XG4gIHByaXZhdGUgX19pc1ZpZXdNYXRyaXhVcFRvRGF0ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fY3VycmVudDogQ29tcG9uZW50U0lEID0gLTE7XG4gIHByaXZhdGUgc3RhdGljIHJldHVyblZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlY3RvcjNfMDogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjdG9yM18xOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWN0b3IzXzI6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcE1hdHJpeDQ0XzAgPSBNdXRhYmxlTWF0cml4NDQuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcE1hdHJpeDQ0XzEgPSBNdXRhYmxlTWF0cml4NDQuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX2JpYXNNYXRyaXggPSBNYXRyaXg0NC5mcm9tQ29weTE2Q29sdW1uTWFqb3IoXG4gICAgMC41LFxuICAgIDAuMCxcbiAgICAwLjAsXG4gICAgMC4wLFxuICAgIDAuMCxcbiAgICAwLjUsXG4gICAgMC4wLFxuICAgIDAuMCxcbiAgICAwLjAsXG4gICAgMC4wLFxuICAgIDAuNSxcbiAgICAwLjAsXG4gICAgMC41LFxuICAgIDAuNSxcbiAgICAwLjUsXG4gICAgMS4wXG4gICk7XG4gIF94ckxlZnQgPSBmYWxzZTtcbiAgX3hyUmlnaHQgPSBmYWxzZTtcbiAgcHVibGljIGlzU3luY1RvTGlnaHQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9fZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7XG5cbiAgcHJpdmF0ZSBfX3VwZGF0ZUNvdW50ID0gMDtcbiAgcHJpdmF0ZSBfX2xhc3RVcGRhdGVDb3VudCA9IC0xO1xuICBwcml2YXRlIF9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuICBwcml2YXRlIF9fbGFzdExpZ2h0Q29tcG9uZW50c1VwZGF0ZUNvdW50ID0gLTE7XG4gIHByaXZhdGUgX19sYXN0Q2FtZXJhQ29udHJvbGxlckNvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0eVVpZDogRW50aXR5VUlELFxuICAgIGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lELFxuICAgIGVudGl0eVJlcG9zaXRvcnk6IEVudGl0eVJlcG9zaXRvcnksXG4gICAgaXNSZVVzZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihlbnRpdHlVaWQsIGNvbXBvbmVudFNpZCwgZW50aXR5UmVwb3NpdG9yeSwgaXNSZVVzZSk7XG5cbiAgICB0aGlzLl9zZXRNYXhOdW1iZXJPZkNvbXBvbmVudChNYXRoLm1heCgxMCwgTWF0aC5mbG9vcihDb25maWcubWF4RW50aXR5TnVtYmVyIC8gMTAwKSkpO1xuXG4gICAgdGhpcy5zZXRGb3Z5QW5kQ2hhbmdlRm9jYWxMZW5ndGgoOTApO1xuXG4gICAgaWYgKENhbWVyYUNvbXBvbmVudC5jdXJyZW50ID09PSAtMSkge1xuICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnQgPSBjb21wb25lbnRTaWQ7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3Rlck1lbWJlcihcbiAgICAgIEJ1ZmZlclVzZS5DUFVHZW5lcmljLFxuICAgICAgJ2V5ZUlubmVyJyxcbiAgICAgIE11dGFibGVWZWN0b3IzLFxuICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIFswLCAwLCAwXVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3Rlck1lbWJlcihcbiAgICAgIEJ1ZmZlclVzZS5DUFVHZW5lcmljLFxuICAgICAgJ2RpcmVjdGlvbicsXG4gICAgICBNdXRhYmxlVmVjdG9yMyxcbiAgICAgIENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBbMCwgMCwgLTFdXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKEJ1ZmZlclVzZS5DUFVHZW5lcmljLCAndXAnLCBNdXRhYmxlVmVjdG9yMywgQ29tcG9uZW50VHlwZS5GbG9hdCwgWzAsIDEsIDBdKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkNQVUdlbmVyaWMsXG4gICAgICAnZGlyZWN0aW9uSW5uZXInLFxuICAgICAgTXV0YWJsZVZlY3RvcjMsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzAsIDAsIC0xXVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3Rlck1lbWJlcihcbiAgICAgIEJ1ZmZlclVzZS5DUFVHZW5lcmljLFxuICAgICAgJ3VwSW5uZXInLFxuICAgICAgTXV0YWJsZVZlY3RvcjMsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzAsIDEsIDBdXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkNQVUdlbmVyaWMsXG4gICAgICAnY29ybmVyJyxcbiAgICAgIE11dGFibGVWZWN0b3I0LFxuICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIFstMSwgMSwgMSwgLTFdXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkNQVUdlbmVyaWMsXG4gICAgICAnY29ybmVySW5uZXInLFxuICAgICAgTXV0YWJsZVZlY3RvcjQsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWy0xLCAxLCAxLCAtMV1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJNZW1iZXIoXG4gICAgICBCdWZmZXJVc2UuQ1BVR2VuZXJpYyxcbiAgICAgICdwYXJhbWV0ZXJzJyxcbiAgICAgIE11dGFibGVWZWN0b3I0LFxuICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIFswLjEsIDEwMDAwLCA5MCwgMV1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJNZW1iZXIoXG4gICAgICBCdWZmZXJVc2UuQ1BVR2VuZXJpYyxcbiAgICAgICdwYXJhbWV0ZXJzSW5uZXInLFxuICAgICAgTXV0YWJsZVZlY3RvcjQsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzAuMSwgMTAwMDAsIDkwLCAxXVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkNQVUdlbmVyaWMsXG4gICAgICAncHJvamVjdGlvbk1hdHJpeCcsXG4gICAgICBNdXRhYmxlTWF0cml4NDQsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDFdXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkNQVUdlbmVyaWMsXG4gICAgICAndmlld01hdHJpeCcsXG4gICAgICBNdXRhYmxlTWF0cml4NDQsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDFdXG4gICAgKTtcblxuICAgIHRoaXMuc3VibWl0VG9BbGxvY2F0aW9uKENvbmZpZy5tYXhDYW1lcmFOdW1iZXIsIGlzUmVVc2UpO1xuXG4gICAgaWYgKGlzUmVVc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnbG9iYWxEYXRhUmVwb3NpdG9yeSA9IEdsb2JhbERhdGFSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgZ2xvYmFsRGF0YVJlcG9zaXRvcnkudGFrZU9uZSgndmlld01hdHJpeCcpO1xuICAgIGdsb2JhbERhdGFSZXBvc2l0b3J5LnRha2VPbmUoJ3Byb2plY3Rpb25NYXRyaXgnKTtcbiAgICBnbG9iYWxEYXRhUmVwb3NpdG9yeS50YWtlT25lKCd2aWV3UG9zaXRpb24nKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXQgY3VycmVudChjb21wb25lbnRTSUQ6IENvbXBvbmVudFNJRCkge1xuICAgIHRoaXMuX19jdXJyZW50ID0gY29tcG9uZW50U0lEO1xuICB9XG5cbiAgc3RhdGljIGdldCBjdXJyZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIHNldCB0eXBlKHR5cGU6IENhbWVyYVR5cGVFbnVtKSB7XG4gICAgdGhpcy5fX3R5cGUgPSB0eXBlO1xuICAgIGlmICh0eXBlID09PSBDYW1lcmFUeXBlLk9ydGhvZ3JhcGhpYykge1xuICAgICAgdGhpcy5fcGFyYW1ldGVycy56ID0gMTtcbiAgICAgIHRoaXMuX3BhcmFtZXRlcnMudyA9IDE7XG4gICAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIueiA9IDE7XG4gICAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIudyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0Rm92eUFuZENoYW5nZUZvY2FsTGVuZ3RoKDkwKTtcbiAgICAgIHRoaXMuX3BhcmFtZXRlcnMudyA9IDE7XG4gICAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIueiA9IDkwO1xuICAgICAgdGhpcy5fcGFyYW1ldGVyc0lubmVyLncgPSAxO1xuICAgIH1cblxuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX190eXBlO1xuICB9XG5cbiAgZ2V0IGV5ZSgpIHtcbiAgICAvLyBJbiBSaG9kb25pdGUsIGV5ZSBpcyBhbHdheXMgKDAsMCwwKS4gVXNlIFRyYW5zZm9ybUNvbXBvbmVudCBmb3IgQ2FtZXJhIHBvc2l0aW9uaW5nXG4gICAgcmV0dXJuIENhbWVyYUNvbXBvbmVudC5fZXllO1xuICB9XG5cbiAgc2V0IGV5ZShub1VzZVZlYzogVmVjdG9yMykge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgJ0luIFJob2Rvbml0ZSwgZXllIGlzIGFsd2F5cyAoMCwwLDApLiBVc2UgVHJhbnNmb3JtQ29tcG9uZW50IGZvciBDYW1lcmEgcG9zaXRpb25pbmcuJ1xuICAgICk7XG4gIH1cblxuICBnZXQgZXllSW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V5ZUlubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc2V0IGV5ZUlubmVyKHZlYzogVmVjdG9yMykge1xuICAgIHRoaXMuX2V5ZUlubmVyLmNvcHlDb21wb25lbnRzKHZlYyk7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBzZXQgdXBJbm5lcih2ZWM6IFZlY3RvcjMpIHtcbiAgICB0aGlzLl91cElubmVyLmNvcHlDb21wb25lbnRzKHZlYyk7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBzZXQgdXAodmVjOiBWZWN0b3IzKSB7XG4gICAgdGhpcy5fdXAuY29weUNvbXBvbmVudHModmVjKTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB1cCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXAuY2xvbmUoKTtcbiAgfVxuXG4gIGdldCB1cElubmVyKCkge1xuICAgIHJldHVybiB0aGlzLl91cElubmVyO1xuICB9XG5cbiAgc2V0IGRpcmVjdGlvbih2ZWM6IFZlY3RvcjMpIHtcbiAgICBjb25zdCBvbGREaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb247XG4gICAgY29uc3QgbmV3RGlyZWN0aW9uID0gdmVjO1xuICAgIGNvbnN0IG9sZFVwID0gdGhpcy5fdXA7XG5cbiAgICBjb25zdCBvcnRob2dvbmFsVmVjdG9yTmV3RGlyZWN0aW9uQW5kT2xkVXAgPSBNdXRhYmxlVmVjdG9yMy5jcm9zc1RvKFxuICAgICAgbmV3RGlyZWN0aW9uLFxuICAgICAgb2xkVXAsXG4gICAgICBDYW1lcmFDb21wb25lbnQuX190bXBWZWN0b3IzXzBcbiAgICApO1xuICAgIGNvbnN0IGlzT3J0aG9nb25hbE5ld0RpcmVjdGlvbkFuZE9sZFVwID0gb3J0aG9nb25hbFZlY3Rvck5ld0RpcmVjdGlvbkFuZE9sZFVwLmxlbmd0aCgpID09PSAwLjA7XG5cbiAgICBsZXQgbmV3VXBOb25Ob3JtYWxpemU7XG4gICAgaWYgKGlzT3J0aG9nb25hbE5ld0RpcmVjdGlvbkFuZE9sZFVwKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVhheGlzID0gTXV0YWJsZVZlY3RvcjMuY3Jvc3NUbyhcbiAgICAgICAgb2xkRGlyZWN0aW9uLFxuICAgICAgICBvbGRVcCxcbiAgICAgICAgQ2FtZXJhQ29tcG9uZW50Ll9fdG1wVmVjdG9yM18xXG4gICAgICApO1xuICAgICAgbmV3VXBOb25Ob3JtYWxpemUgPSBNdXRhYmxlVmVjdG9yMy5jcm9zc1RvKFxuICAgICAgICByZWxhdGl2ZVhheGlzLFxuICAgICAgICBuZXdEaXJlY3Rpb24sXG4gICAgICAgIENhbWVyYUNvbXBvbmVudC5fX3RtcFZlY3RvcjNfMlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3RGlyZWN0aW9uQ29tcG9uZW50SW5PbGRVcCA9IE11dGFibGVWZWN0b3IzLm11bHRpcGx5VG8oXG4gICAgICAgIG5ld0RpcmVjdGlvbixcbiAgICAgICAgbmV3RGlyZWN0aW9uLmRvdChvbGRVcCksXG4gICAgICAgIENhbWVyYUNvbXBvbmVudC5fX3RtcFZlY3RvcjNfMVxuICAgICAgKTtcbiAgICAgIG5ld1VwTm9uTm9ybWFsaXplID0gTXV0YWJsZVZlY3RvcjMuc3VidHJhY3RUbyhcbiAgICAgICAgb2xkVXAsXG4gICAgICAgIG5ld0RpcmVjdGlvbkNvbXBvbmVudEluT2xkVXAsXG4gICAgICAgIENhbWVyYUNvbXBvbmVudC5fX3RtcFZlY3RvcjNfMlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cC5jb3B5Q29tcG9uZW50cyhuZXdVcE5vbk5vcm1hbGl6ZSkubm9ybWFsaXplKCk7XG4gICAgdGhpcy5fZGlyZWN0aW9uLmNvcHlDb21wb25lbnRzKG5ld0RpcmVjdGlvbik7XG5cbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIHNldCBkaXJlY3Rpb25Jbm5lcih2ZWM6IFZlY3RvcjMpIHtcbiAgICB0aGlzLl9kaXJlY3Rpb25Jbm5lci5jb3B5Q29tcG9uZW50cyh2ZWMpO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IGRpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uLmNsb25lKCk7XG4gIH1cblxuICBnZXQgZGlyZWN0aW9uSW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbklubmVyO1xuICB9XG5cbiAgc2V0IGNvcm5lcih2ZWM6IFZlY3RvcjQpIHtcbiAgICB0aGlzLl9jb3JuZXIuY29weUNvbXBvbmVudHModmVjKTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCBjb3JuZXIoKTogVmVjdG9yNCB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvcm5lci5jbG9uZSgpO1xuICB9XG5cbiAgc2V0IGxlZnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nvcm5lci54ID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBzZXQgbGVmdElubmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jb3JuZXJJbm5lci54ID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBnZXQgbGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ybmVyLng7XG4gIH1cblxuICBzZXQgcmlnaHQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nvcm5lci55ID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBzZXQgcmlnaHRJbm5lcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY29ybmVySW5uZXIueSA9IHZhbHVlO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHJpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb3JuZXIueTtcbiAgfVxuXG4gIHNldCB0b3AodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nvcm5lci56ID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBzZXQgdG9wSW5uZXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2Nvcm5lcklubmVyLnogPSB2YWx1ZTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB0b3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvcm5lci56O1xuICB9XG5cbiAgc2V0IGJvdHRvbSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY29ybmVyLncgPSB2YWx1ZTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIHNldCBib3R0b21Jbm5lcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY29ybmVySW5uZXIudyA9IHZhbHVlO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IGJvdHRvbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ybmVyLnc7XG4gIH1cblxuICBzZXQgY29ybmVySW5uZXIodmVjOiBWZWN0b3I0KSB7XG4gICAgdGhpcy5fY29ybmVySW5uZXIuY29weUNvbXBvbmVudHModmVjKTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCBjb3JuZXJJbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ybmVySW5uZXI7XG4gIH1cblxuICAvLyBzZXQgcGFyYW1ldGVycyh2ZWM6IFZlY3RvcjQpIHtcbiAgLy8gICB0aGlzLl9wYXJhbWV0ZXJzLmNvcHlDb21wb25lbnRzKHZlYyk7XG4gIC8vIH1cblxuICBzZXQgcGFyYW1ldGVyc0lubmVyKHZlYzogVmVjdG9yNCkge1xuICAgIHRoaXMuX3BhcmFtZXRlcnNJbm5lci5jb3B5Q29tcG9uZW50cyh2ZWMpO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlcnNJbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVyc0lubmVyO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlcnMoKTogVmVjdG9yNCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnMuY2xvbmUoKTtcbiAgfVxuXG4gIHNldCB6TmVhcih2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX3BhcmFtZXRlcnMueCA9IHZhbDtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIHNldCB6TmVhcklubmVyKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGFyYW1ldGVyc0lubmVyLnggPSB2YWw7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBnZXQgek5lYXJJbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVyc0lubmVyLng7XG4gIH1cblxuICBnZXQgek5lYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnMueDtcbiAgfVxuXG4gIHNldCBmb2NhbExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2ZvY2FsTGVuZ3RoID0gdmFsO1xuICAgIHRoaXMuX3BhcmFtZXRlcnMueiA9IDIgKiBNYXRoVXRpbC5yYWRpYW5Ub0RlZ3JlZShNYXRoLmF0YW4odGhpcy5fZmlsbUhlaWdodCAvICh2YWwgKiAyKSkpO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG4gIGdldCBmb2NhbExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jYWxMZW5ndGg7XG4gIH1cblxuICBzZXQgekZhcih2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX3BhcmFtZXRlcnMueSA9IHZhbDtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIHNldCB6RmFySW5uZXIodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIueSA9IHZhbDtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB6RmFySW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnNJbm5lci55O1xuICB9XG5cbiAgZ2V0IHpGYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnMueTtcbiAgfVxuXG4gIHNldEZvdnlBbmRDaGFuZ2VGaWxtU2l6ZShkZWdyZWU6IG51bWJlcikge1xuICAgIHRoaXMuX3BhcmFtZXRlcnMueiA9IGRlZ3JlZTtcbiAgICB0aGlzLl9maWxtSGVpZ2h0ID0gMiAqIHRoaXMuZm9jYWxMZW5ndGggKiBNYXRoLnRhbihNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbihkZWdyZWUpIC8gMik7XG4gICAgdGhpcy5fZmlsbVdpZHRoID0gdGhpcy5fZmlsbUhlaWdodCAqIHRoaXMuYXNwZWN0O1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgc2V0Rm92eUFuZENoYW5nZUZvY2FsTGVuZ3RoKGRlZ3JlZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGFyYW1ldGVycy56ID0gZGVncmVlO1xuICAgIHRoaXMuX2ZvY2FsTGVuZ3RoID0gdGhpcy5fZmlsbUhlaWdodCAvIDIgLyBNYXRoLnRhbihNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbihkZWdyZWUpIC8gMik7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBnZXQgZm92eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVycy56O1xuICB9XG5cbiAgc2V0IGZvdnlJbm5lcih2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX3BhcmFtZXRlcnNJbm5lci56ID0gdmFsO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgc2V0IGFzcGVjdCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX3BhcmFtZXRlcnMudyA9IHZhbDtcbiAgICB0aGlzLl9maWxtV2lkdGggPSB0aGlzLl9maWxtSGVpZ2h0ICogdmFsO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgc2V0IGFzcGVjdElubmVyKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGFyYW1ldGVyc0lubmVyLncgPSB2YWw7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBnZXQgYXNwZWN0SW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnNJbm5lci53O1xuICB9XG5cbiAgZ2V0IGFzcGVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVycy53O1xuICB9XG5cbiAgc2V0IHhNYWcodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJzLnogPSB2YWw7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBnZXQgeE1hZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVycy56O1xuICB9XG5cbiAgc2V0IHlNYWcodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJzLncgPSB2YWw7XG4gIH1cblxuICBnZXQgeU1hZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVycy53O1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEO1xuICB9XG5cbiAgY2FsY1Byb2plY3Rpb25NYXRyaXgoKSB7XG4gICAgY29uc3Qgek5lYXIgPSB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIueDtcbiAgICBjb25zdCB6RmFyID0gdGhpcy5fcGFyYW1ldGVyc0lubmVyLnk7XG5cbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQ2FtZXJhVHlwZS5QZXJzcGVjdGl2ZSkge1xuICAgICAgICBjb25zdCBmb3Z5ID0gdGhpcy5fcGFyYW1ldGVyc0lubmVyLno7XG4gICAgICAgIGxldCBhc3BlY3QgPSB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIudztcbiAgICAgICAgaWYgKGFzcGVjdCA8IDApIHtcbiAgICAgICAgICBhc3BlY3QgPSBTeXN0ZW1TdGF0ZS52aWV3cG9ydEFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHlzY2FsZSA9IDEuMCAvIE1hdGgudGFuKCgwLjUgKiBmb3Z5ICogTWF0aC5QSSkgLyAxODApO1xuICAgICAgICBjb25zdCB4c2NhbGUgPSB5c2NhbGUgLyBhc3BlY3Q7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTAwID0geHNjYWxlO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0wMSA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTAyID0gMDtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMDMgPSAwO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0xMCA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTExID0geXNjYWxlO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0xMiA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTEzID0gMDtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMjAgPSAwO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0yMSA9IDA7XG4gICAgICAgIGlmICh6RmFyID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTIyID0gLTE7XG4gICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMjMgPSAtek5lYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmYgPSAxIC8gKHpOZWFyIC0gekZhcik7XG4gICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMjIgPSB6RmFyICogbmY7XG4gICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMjMgPSB6RmFyICogek5lYXIgKiBuZjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0zMCA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTMxID0gMDtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMzIgPSAtMTtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMzMgPSAwO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IENhbWVyYVR5cGUuT3J0aG9ncmFwaGljKSB7XG4gICAgICAgIGNvbnN0IHhtYWcgPSB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIuejtcbiAgICAgICAgY29uc3QgeW1hZyA9IHRoaXMuX3BhcmFtZXRlcnNJbm5lci53O1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4LnNldENvbXBvbmVudHMoXG4gICAgICAgICAgMSAvIHhtYWcsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAxIC8geW1hZyxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIC0xIC8gKHpGYXIgLSB6TmVhciksXG4gICAgICAgICAgLXpOZWFyIC8gKHpGYXIgLSB6TmVhciksXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMS4wXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy5fY29ybmVySW5uZXIueDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLl9jb3JuZXJJbm5lci55O1xuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLl9jb3JuZXJJbm5lci56O1xuICAgICAgICBjb25zdCBib3R0b20gPSB0aGlzLl9jb3JuZXJJbm5lci53O1xuICAgICAgICBjb25zdCBuZiA9IDEgLyAoek5lYXIgLSB6RmFyKTtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5zZXRDb21wb25lbnRzKFxuICAgICAgICAgICgyICogek5lYXIpIC8gKHJpZ2h0IC0gbGVmdCksXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCksXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAoMiAqIHpOZWFyKSAvICh0b3AgLSBib3R0b20pLFxuICAgICAgICAgICh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSksXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgekZhciAqIG5mLFxuICAgICAgICAgIHpGYXIgKiB6TmVhciAqIG5mLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgLTEuMCxcbiAgICAgICAgICAwLjBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQ2FtZXJhVHlwZS5QZXJzcGVjdGl2ZSkge1xuICAgICAgICBjb25zdCBmb3Z5ID0gdGhpcy5fcGFyYW1ldGVyc0lubmVyLno7XG4gICAgICAgIGxldCBhc3BlY3QgPSB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIudztcbiAgICAgICAgaWYgKGFzcGVjdCA8IDApIHtcbiAgICAgICAgICBhc3BlY3QgPSBTeXN0ZW1TdGF0ZS52aWV3cG9ydEFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHlzY2FsZSA9IDEuMCAvIE1hdGgudGFuKCgwLjUgKiBmb3Z5ICogTWF0aC5QSSkgLyAxODApO1xuICAgICAgICBjb25zdCB4c2NhbGUgPSB5c2NhbGUgLyBhc3BlY3Q7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTAwID0geHNjYWxlO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0wMSA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTAyID0gMDtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMDMgPSAwO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0xMCA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTExID0geXNjYWxlO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0xMiA9IDA7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTEzID0gMDtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMjAgPSAwO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0yMSA9IDA7XG4gICAgICAgIGlmICh6RmFyID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTIyID0gLTE7XG4gICAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMjMgPSAtMiAqIHpOZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5mID0gMSAvICh6TmVhciAtIHpGYXIpO1xuICAgICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTIyID0gKHpGYXIgKyB6TmVhcikgKiBuZjtcbiAgICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0yMyA9IDIuMCAqIHpGYXIgKiB6TmVhciAqIG5mO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgubTMwID0gMDtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeC5tMzEgPSAwO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0zMiA9IC0xO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4Lm0zMyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gQ2FtZXJhVHlwZS5PcnRob2dyYXBoaWMpIHtcbiAgICAgICAgY29uc3QgeG1hZyA9IHRoaXMuX3BhcmFtZXRlcnNJbm5lci56O1xuICAgICAgICBjb25zdCB5bWFnID0gdGhpcy5fcGFyYW1ldGVyc0lubmVyLnc7XG4gICAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXguc2V0Q29tcG9uZW50cyhcbiAgICAgICAgICAxIC8geG1hZyxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDEgLyB5bWFnLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgLTIgLyAoekZhciAtIHpOZWFyKSxcbiAgICAgICAgICAtKHpGYXIgKyB6TmVhcikgLyAoekZhciAtIHpOZWFyKSxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAxLjBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLl9jb3JuZXJJbm5lci54O1xuICAgICAgICBjb25zdCByaWdodCA9IHRoaXMuX2Nvcm5lcklubmVyLnk7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuX2Nvcm5lcklubmVyLno7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuX2Nvcm5lcklubmVyLnc7XG4gICAgICAgIGNvbnN0IG5mID0gMSAvICh6TmVhciAtIHpGYXIpO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4LnNldENvbXBvbmVudHMoXG4gICAgICAgICAgKDIgKiB6TmVhcikgLyAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgICgyICogek5lYXIpIC8gKHRvcCAtIGJvdHRvbSksXG4gICAgICAgICAgKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKSxcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuMCxcbiAgICAgICAgICAoekZhciArIHpOZWFyKSAqIG5mLFxuICAgICAgICAgIDIgKiB6RmFyICogek5lYXIgKiBuZixcbiAgICAgICAgICAwLjAsXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIC0xLjAsXG4gICAgICAgICAgMC4wXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb25NYXRyaXg7XG4gIH1cblxuICBjYWxjVmlld01hdHJpeCgpIHtcbiAgICBjb25zdCBleWUgPSB0aGlzLmV5ZUlubmVyO1xuICAgIGNvbnN0IGYgPSBNdXRhYmxlVmVjdG9yMy5zdWJ0cmFjdFRvKFxuICAgICAgdGhpcy5fZGlyZWN0aW9uSW5uZXIsXG4gICAgICBleWUsXG4gICAgICBDYW1lcmFDb21wb25lbnQuX190bXBWZWN0b3IzXzBcbiAgICApLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHMgPSBNdXRhYmxlVmVjdG9yMy5jcm9zc1RvKGYsIHRoaXMuX3VwSW5uZXIsIENhbWVyYUNvbXBvbmVudC5fX3RtcFZlY3RvcjNfMSkubm9ybWFsaXplKCk7XG4gICAgY29uc3QgdSA9IE11dGFibGVWZWN0b3IzLmNyb3NzVG8ocywgZiwgQ2FtZXJhQ29tcG9uZW50Ll9fdG1wVmVjdG9yM18yKTtcblxuICAgIHRoaXMuX3ZpZXdNYXRyaXguc2V0Q29tcG9uZW50cyhcbiAgICAgIHMueCxcbiAgICAgIHMueSxcbiAgICAgIHMueixcbiAgICAgIC1WZWN0b3IzLmRvdChzLCBleWUpLFxuICAgICAgdS54LFxuICAgICAgdS55LFxuICAgICAgdS56LFxuICAgICAgLVZlY3RvcjMuZG90KHUsIGV5ZSksXG4gICAgICAtZi54LFxuICAgICAgLWYueSxcbiAgICAgIC1mLnosXG4gICAgICBWZWN0b3IzLmRvdChmLCBleWUpLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMucHJpbWl0aXZlTW9kZSkge1xuICAgICAgY29uc3QgaW52ZXJ0V29ybGRNYXRyaXggPSBNdXRhYmxlTWF0cml4NDQuaW52ZXJ0VG8oXG4gICAgICAgIHRoaXMuZW50aXR5LmdldFNjZW5lR3JhcGgoKS5tYXRyaXhJbm5lcixcbiAgICAgICAgQ2FtZXJhQ29tcG9uZW50Ll9fdG1wTWF0cml4NDRfMFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fdmlld01hdHJpeC5tdWx0aXBseShpbnZlcnRXb3JsZE1hdHJpeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdNYXRyaXg7XG4gIH1cblxuICBnZXQgdmlld01hdHJpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld01hdHJpeDtcbiAgfVxuXG4gIHNldCB2aWV3TWF0cml4KHZpZXdNYXRyaXg6IE1hdHJpeDQ0KSB7XG4gICAgdGhpcy5fdmlld01hdHJpeC5jb3B5Q29tcG9uZW50cyh2aWV3TWF0cml4KTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCBwcm9qZWN0aW9uTWF0cml4KCkge1xuICAgIGlmICh0aGlzLl94ckxlZnQgfHwgdGhpcy5feHJSaWdodCkge1xuICAgICAgY29uc3Qgcm5YUk1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGUoJ3hyJykgYXMgUm5YUjtcbiAgICAgIGlmIChyblhSTW9kdWxlPy5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpLmlzV2ViWFJNb2RlKSB7XG4gICAgICAgIGNvbnN0IHdlYlhSU3lzdGVtID0gcm5YUk1vZHVsZS5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBpZiAodGhpcy5feHJMZWZ0KSB7XG4gICAgICAgICAgcmV0dXJuIHdlYlhSU3lzdGVtLmxlZnRQcm9qZWN0aW9uTWF0cml4O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3hyUmlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gd2ViWFJTeXN0ZW0ucmlnaHRQcm9qZWN0aW9uTWF0cml4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0aW9uTWF0cml4O1xuICB9XG5cbiAgc2V0IHByb2plY3Rpb25NYXRyaXgocHJvamVjdGlvbk1hdHJpeDogTWF0cml4NDQpIHtcbiAgICB0aGlzLl9wcm9qZWN0aW9uTWF0cml4LmNvcHlDb21wb25lbnRzKHByb2plY3Rpb25NYXRyaXgpO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHZpZXdQcm9qZWN0aW9uTWF0cml4KCkge1xuICAgIHJldHVybiBNdXRhYmxlTWF0cml4NDQubXVsdGlwbHlUbyhcbiAgICAgIHRoaXMuX3Byb2plY3Rpb25NYXRyaXgsXG4gICAgICB0aGlzLl92aWV3TWF0cml4LFxuICAgICAgQ2FtZXJhQ29tcG9uZW50Ll9fdG1wTWF0cml4NDRfMFxuICAgICk7XG4gIH1cblxuICBnZXQgYmlhc1ZpZXdQcm9qZWN0aW9uTWF0cml4KCkge1xuICAgIE11dGFibGVNYXRyaXg0NC5tdWx0aXBseVRvKFxuICAgICAgdGhpcy5fcHJvamVjdGlvbk1hdHJpeCxcbiAgICAgIHRoaXMuX3ZpZXdNYXRyaXgsXG4gICAgICBDYW1lcmFDb21wb25lbnQuX190bXBNYXRyaXg0NF8wXG4gICAgKTtcbiAgICByZXR1cm4gTXV0YWJsZU1hdHJpeDQ0Lm11bHRpcGx5VG8oXG4gICAgICBDYW1lcmFDb21wb25lbnQuX19iaWFzTWF0cml4LFxuICAgICAgQ2FtZXJhQ29tcG9uZW50Ll9fdG1wTWF0cml4NDRfMCxcbiAgICAgIENhbWVyYUNvbXBvbmVudC5fX3RtcE1hdHJpeDQ0XzFcbiAgICApO1xuICB9XG5cbiAgc2V0VmFsdWVzVG9HbG9iYWxEYXRhUmVwb3NpdG9yeU9ubHlNYXRyaWNlcygpIHtcbiAgICBDYW1lcmFDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5zZXRWYWx1ZShcbiAgICAgICd2aWV3TWF0cml4JyxcbiAgICAgIHRoaXMuY29tcG9uZW50U0lELFxuICAgICAgdGhpcy52aWV3TWF0cml4XG4gICAgKTtcbiAgICBDYW1lcmFDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5zZXRWYWx1ZShcbiAgICAgICdwcm9qZWN0aW9uTWF0cml4JyxcbiAgICAgIHRoaXMuY29tcG9uZW50U0lELFxuICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4XG4gICAgKTtcbiAgfVxuXG4gIHNldFZhbHVlc1RvR2xvYmFsRGF0YVJlcG9zaXRvcnkoKSB7XG4gICAgQ2FtZXJhQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuc2V0VmFsdWUoXG4gICAgICAndmlld01hdHJpeCcsXG4gICAgICB0aGlzLmNvbXBvbmVudFNJRCxcbiAgICAgIHRoaXMudmlld01hdHJpeFxuICAgICk7XG4gICAgQ2FtZXJhQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuc2V0VmFsdWUoXG4gICAgICAncHJvamVjdGlvbk1hdHJpeCcsXG4gICAgICB0aGlzLmNvbXBvbmVudFNJRCxcbiAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeFxuICAgICk7XG4gICAgQ2FtZXJhQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuc2V0VmFsdWUoXG4gICAgICAndmlld1Bvc2l0aW9uJyxcbiAgICAgIHRoaXMuY29tcG9uZW50U0lELFxuICAgICAgdGhpcy53b3JsZFBvc2l0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGdldCB3b3JsZFBvc2l0aW9uKCkge1xuICAgIHRoaXMuZW50aXR5XG4gICAgICAuZ2V0U2NlbmVHcmFwaCgpXG4gICAgICAubWF0cml4SW5uZXIubXVsdGlwbHlWZWN0b3IzVG8odGhpcy5leWVJbm5lciwgQ2FtZXJhQ29tcG9uZW50LnJldHVyblZlY3RvcjMpO1xuICAgIHJldHVybiBDYW1lcmFDb21wb25lbnQucmV0dXJuVmVjdG9yMztcbiAgfVxuXG4gIHVwZGF0ZUZydXN0dW0oKSB7XG4gICAgdGhpcy5fX2ZydXN0dW0udXBkYXRlKHRoaXMudmlld01hdHJpeCwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcbiAgfVxuXG4gIGdldCBmcnVzdHVtKCkge1xuICAgIHJldHVybiB0aGlzLl9fZnJ1c3R1bTtcbiAgfVxuXG4gICRsb2FkKCkge1xuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgfVxuXG4gICRsb2dpYygpIHtcbiAgICBjb25zdCBsaWdodENvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0TGlnaHQoKTtcbiAgICBsZXQgbGlnaHRDb21wb25lbnRVcGRhdGVDb3VudCA9IGxpZ2h0Q29tcG9uZW50ICE9IG51bGwgPyBsaWdodENvbXBvbmVudC51cGRhdGVDb3VudCA6IC0xO1xuICAgIGlmIChcbiAgICAgIHRoaXMuX19sYXN0VXBkYXRlQ291bnQgPT09IHRoaXMuX191cGRhdGVDb3VudCAmJlxuICAgICAgdGhpcy5fX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPT09IFRyYW5zZm9ybUNvbXBvbmVudC51cGRhdGVDb3VudCAmJlxuICAgICAgdGhpcy5fX2xhc3RMaWdodENvbXBvbmVudHNVcGRhdGVDb3VudCA9PT0gbGlnaHRDb21wb25lbnRVcGRhdGVDb3VudCAmJlxuICAgICAgdGhpcy5fX2xhc3RDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50c1VwZGF0ZUNvdW50ID09PSBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50LnVwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTeW5jVG9MaWdodCAmJiBJcy5leGlzdChsaWdodENvbXBvbmVudCkpIHtcbiAgICAgIC8vIGZvciBTaGFkb3cgTWFwcGluZ1xuICAgICAgdGhpcy5fZXllSW5uZXIuY29weUNvbXBvbmVudHMoQ2FtZXJhQ29tcG9uZW50Ll9leWUpO1xuICAgICAgdGhpcy5fZGlyZWN0aW9uSW5uZXIuY29weUNvbXBvbmVudHModGhpcy5fZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuX3VwSW5uZXIuY29weUNvbXBvbmVudHModGhpcy5fdXApO1xuICAgICAgaWYgKGxpZ2h0Q29tcG9uZW50LnR5cGUgPT09IExpZ2h0VHlwZS5TcG90KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENhbWVyYVR5cGUuUGVyc3BlY3RpdmU7XG4gICAgICAgIHRoaXMuc2V0Rm92eUFuZENoYW5nZUZpbG1TaXplKE1hdGhVdGlsLnJhZGlhblRvRGVncmVlKGxpZ2h0Q29tcG9uZW50Lm91dGVyQ29uZUFuZ2xlKSk7XG4gICAgICAgIHRoaXMuX2Nvcm5lcklubmVyLmNvcHlDb21wb25lbnRzKHRoaXMuX2Nvcm5lcik7XG4gICAgICAgIHRoaXMuYXNwZWN0ID0gMTtcbiAgICAgICAgdGhpcy56TmVhciA9IDAuMTtcbiAgICAgICAgdGhpcy56RmFyID0gbGlnaHRDb21wb25lbnQucmFuZ2UgIT09IC0xID8gbGlnaHRDb21wb25lbnQucmFuZ2UgOiAxMDAwMDtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyc0lubmVyLmNvcHlDb21wb25lbnRzKHRoaXMuX3BhcmFtZXRlcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaWdodENvbXBvbmVudC50eXBlID09PSBMaWdodFR5cGUuRGlyZWN0aW9uYWwpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQ2FtZXJhVHlwZS5PcnRob2dyYXBoaWM7XG4gICAgICAgIGNvbnN0IGFyZWFTaXplID0gbGlnaHRDb21wb25lbnQuc2hhZG93QXJlYVNpemVGb3JEaXJlY3Rpb25hbExpZ2h0O1xuICAgICAgICB0aGlzLl9jb3JuZXJJbm5lci5jb3B5Q29tcG9uZW50cyhcbiAgICAgICAgICBWZWN0b3I0LmZyb21Db3B5NCgtYXJlYVNpemUsIGFyZWFTaXplLCBhcmVhU2l6ZSwgLWFyZWFTaXplKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFzcGVjdCA9IDE7XG4gICAgICAgIHRoaXMuek5lYXIgPSAwLjE7XG4gICAgICAgIHRoaXMuekZhciA9IGxpZ2h0Q29tcG9uZW50LnJhbmdlICE9PSAtMSA/IGxpZ2h0Q29tcG9uZW50LnJhbmdlIDogMTAwO1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIuY29weUNvbXBvbmVudHModGhpcy5fcGFyYW1ldGVycyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldENhbWVyYUNvbnRyb2xsZXIoKTtcbiAgICAgIGlmIChJcy5leGlzdChjYW1lcmFDb250cm9sbGVyQ29tcG9uZW50KSkge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIudyA9IHRoaXMuX3BhcmFtZXRlcnMudztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5wcmltaXRpdmVNb2RlKSB7XG4gICAgICAgICAgdGhpcy5fZXllSW5uZXIuY29weUNvbXBvbmVudHMoQ2FtZXJhQ29tcG9uZW50Ll9leWUpO1xuICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbklubmVyLmNvcHlDb21wb25lbnRzKHRoaXMuX2RpcmVjdGlvbik7XG4gICAgICAgICAgdGhpcy5fdXBJbm5lci5jb3B5Q29tcG9uZW50cyh0aGlzLl91cCk7XG4gICAgICAgICAgdGhpcy5fY29ybmVySW5uZXIuY29weUNvbXBvbmVudHModGhpcy5fY29ybmVyKTtcbiAgICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzSW5uZXIuY29weUNvbXBvbmVudHModGhpcy5fcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNhbGNWaWV3TWF0cml4KCk7XG5cbiAgICBpZiAoIXRoaXMuX3hyTGVmdCAmJiAhdGhpcy5feHJSaWdodCkge1xuICAgICAgdGhpcy5jYWxjUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIH1cbiAgICB0aGlzLnNldFZhbHVlc1RvR2xvYmFsRGF0YVJlcG9zaXRvcnkoKTtcblxuICAgIHRoaXMuX19sYXN0VXBkYXRlQ291bnQgPSB0aGlzLl9fdXBkYXRlQ291bnQ7XG4gICAgdGhpcy5fX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPSBUcmFuc2Zvcm1Db21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgdGhpcy5fX2xhc3RMaWdodENvbXBvbmVudHNVcGRhdGVDb3VudCA9IGxpZ2h0Q29tcG9uZW50VXBkYXRlQ291bnQ7XG4gICAgdGhpcy5fX2xhc3RDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC51cGRhdGVDb3VudDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDdXJyZW50Q2FtZXJhRW50aXR5KCkge1xuICAgIGNvbnN0IGN1cnJlbnRDYW1lcmFDb21wb25lbnQgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLmN1cnJlbnRcbiAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICByZXR1cm4gY3VycmVudENhbWVyYUNvbXBvbmVudC5lbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBlbnRpdHkgd2hpY2ggaGFzIHRoaXMgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyB0aGUgZW50aXR5IHdoaWNoIGhhcyB0aGlzIGNvbXBvbmVudFxuICAgKi9cbiAgZ2V0IGVudGl0eSgpOiBJQ2FtZXJhRW50aXR5IHtcbiAgICByZXR1cm4gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkodGhpcy5fX2VudGl0eVVpZCkgYXMgdW5rbm93biBhcyBJQ2FtZXJhRW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvdmVycmlkZVxuICAgKiBBZGQgdGhpcyBjb21wb25lbnQgdG8gdGhlIGVudGl0eVxuICAgKiBAcGFyYW0gYmFzZSB0aGUgdGFyZ2V0IGVudGl0eVxuICAgKiBAcGFyYW0gX2NvbXBvbmVudENsYXNzIHRoZSBjb21wb25lbnQgY2xhc3MgdG8gYWRkXG4gICAqL1xuICBhZGRUaGlzQ29tcG9uZW50VG9FbnRpdHk8XG4gICAgRW50aXR5QmFzZUNsYXNzIGV4dGVuZHMgSUVudGl0eSxcbiAgICBTb21lQ29tcG9uZW50Q2xhc3MgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50XG4gID4oYmFzZTogRW50aXR5QmFzZUNsYXNzLCBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzcykge1xuICAgIGNsYXNzIENhbWVyYUVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAgICAgICBpc0FsaXZlOiBib29sZWFuLFxuICAgICAgICBjb21wb25lbnRzPzogTWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGVudGl0eVVJRCwgaXNBbGl2ZSwgY29tcG9uZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGdldENhbWVyYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSURcbiAgICAgICAgKSBhcyBDYW1lcmFDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGFwcGx5TWl4aW5zKGJhc2UsIENhbWVyYUVudGl0eSk7XG4gICAgcmV0dXJuIGJhc2UgYXMgdW5rbm93biBhcyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8U29tZUNvbXBvbmVudENsYXNzPiAmIEVudGl0eUJhc2VDbGFzcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgRW50aXR5VUlEIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgTWl4aW5CYXNlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvVHlwZUdlbmVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi9DYW1lcmFDb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDYW1lcmFFbnRpdHlNZXRob2RzIHtcbiAgZ2V0Q2FtZXJhKCk6IENhbWVyYUNvbXBvbmVudDtcbn1cbiIsImltcG9ydCB7IEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSUNhbWVyYUVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IGNyZWF0ZUdyb3VwRW50aXR5IH0gZnJvbSAnLi4vU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYW1lcmFFbnRpdHkoKTogSUNhbWVyYUVudGl0eSB7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZUdyb3VwRW50aXR5KCk7XG4gIGNvbnN0IGVudGl0eUFkZGVkQ29tcG9uZW50ID0gRW50aXR5UmVwb3NpdG9yeS50cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUQsXG4gICAgZW50aXR5XG4gICkgYXMgSUNhbWVyYUVudGl0eTtcbiAgcmV0dXJuIGVudGl0eUFkZGVkQ29tcG9uZW50O1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9DYW1lcmFDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9JQ2FtZXJhRW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlQ2FtZXJhRW50aXR5JztcbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eVVJRCwgQ29tcG9uZW50U0lELCBDb21wb25lbnRUSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBhcHBseU1peGlucywgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBPcmJpdENhbWVyYUNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9jYW1lcmFzL09yYml0Q2FtZXJhQ29udHJvbGxlcic7XG5pbXBvcnQgeyBJQ2FtZXJhQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2NhbWVyYXMvSUNhbWVyYUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgV2Fsa1Rocm91Z2hDYW1lcmFDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9XYWxrVGhyb3VnaENhbWVyYUNvbnRyb2xsZXInO1xuaW1wb3J0IHtcbiAgQ2FtZXJhQ29udHJvbGxlclR5cGVFbnVtLFxuICBDYW1lcmFDb250cm9sbGVyVHlwZSxcbn0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ2FtZXJhQ29udHJvbGxlclR5cGUnO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5JztcbmltcG9ydCB7IENvbXBvbmVudFRvQ29tcG9uZW50TWV0aG9kcyB9IGZyb20gJy4uL0NvbXBvbmVudFR5cGVzJztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IElDYW1lcmFDb250cm9sbGVyRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vLi4vbWlzYy9Mb2dnZXInO1xuXG4vKipcbiAqIFRoZSBDb21wb25lbnQgdGhhdCBjb250cm9scyBjYW1lcmEgcG9zdHVyZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIF9fY2FtZXJhQ29udHJvbGxlcjogSUNhbWVyYUNvbnRyb2xsZXI7XG4gIHByaXZhdGUgc3RhdGljIF9fdXBkYXRlQ291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0eVVpZDogRW50aXR5VUlELFxuICAgIGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lELFxuICAgIGVudGl0eVJlcG9zaXRvcnk6IEVudGl0eVJlcG9zaXRvcnksXG4gICAgaXNSZVVzZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihlbnRpdHlVaWQsIGNvbXBvbmVudFNpZCwgZW50aXR5UmVwb3NpdG9yeSwgaXNSZVVzZSk7XG4gICAgdGhpcy5fX2NhbWVyYUNvbnRyb2xsZXIgPSBuZXcgT3JiaXRDYW1lcmFDb250cm9sbGVyKHRoaXMpO1xuICB9XG5cbiAgc2V0IHR5cGUodHlwZTogQ2FtZXJhQ29udHJvbGxlclR5cGVFbnVtKSB7XG4gICAgdGhpcy5fX2NhbWVyYUNvbnRyb2xsZXIudW5yZWdpc3RlckV2ZW50TGlzdGVuZXJzKCk7XG4gICAgaWYgKHR5cGUgPT09IENhbWVyYUNvbnRyb2xsZXJUeXBlLk9yYml0KSB7XG4gICAgICB0aGlzLl9fY2FtZXJhQ29udHJvbGxlciA9IG5ldyBPcmJpdENhbWVyYUNvbnRyb2xsZXIodGhpcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBDYW1lcmFDb250cm9sbGVyVHlwZS5XYWxrVGhyb3VnaCkge1xuICAgICAgdGhpcy5fX2NhbWVyYUNvbnRyb2xsZXIgPSBuZXcgV2Fsa1Rocm91Z2hDYW1lcmFDb250cm9sbGVyKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIud2FybignTm90IHN1cHBvcnQgdHlwZSEnKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICBpZiAodGhpcy5fX2NhbWVyYUNvbnRyb2xsZXIgaW5zdGFuY2VvZiBPcmJpdENhbWVyYUNvbnRyb2xsZXIpIHtcbiAgICAgIHJldHVybiBDYW1lcmFDb250cm9sbGVyVHlwZS5PcmJpdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIENhbWVyYUNvbnRyb2xsZXJUeXBlLldhbGtUaHJvdWdoO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9fY2FtZXJhQ29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudFRJRDtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb250cm9sbGVyQ29tcG9uZW50VElEO1xuICB9XG5cbiAgJGxvYWQoKSB7XG4gICAgdGhpcy5tb3ZlU3RhZ2VUbyhQcm9jZXNzU3RhZ2UuTG9naWMpO1xuICB9XG5cbiAgJGxvZ2ljKCkge1xuICAgIGlmICh0aGlzLl9fY2FtZXJhQ29udHJvbGxlcikge1xuICAgICAgdGhpcy5fX2NhbWVyYUNvbnRyb2xsZXIubG9naWModGhpcy5lbnRpdHkudHJ5VG9HZXRDYW1lcmEoKSEpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVDb3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC5fX3VwZGF0ZUNvdW50ID0gY291bnQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHVwZGF0ZUNvdW50KCkge1xuICAgIHJldHVybiBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQ7XG4gIH1cblxuICBhZGRUaGlzQ29tcG9uZW50VG9FbnRpdHk8RW50aXR5QmFzZSBleHRlbmRzIElFbnRpdHksIFNvbWVDb21wb25lbnRDbGFzcyBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ+KFxuICAgIGJhc2U6IEVudGl0eUJhc2UsXG4gICAgX2NvbXBvbmVudENsYXNzOiBTb21lQ29tcG9uZW50Q2xhc3NcbiAgKSB7XG4gICAgY2xhc3MgQ2FtZXJhQ29udHJvbGxlckVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAgICAgICBpc0FsaXZlOiBib29sZWFuLFxuICAgICAgICBjb21wb25lbnRzPzogTWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGVudGl0eVVJRCwgaXNBbGl2ZSwgY29tcG9uZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGdldENhbWVyYUNvbnRyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudFRJRFxuICAgICAgICApIGFzIENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGFwcGx5TWl4aW5zKGJhc2UsIENhbWVyYUNvbnRyb2xsZXJFbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBNaXhpbkJhc2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9UeXBlR2VuZXJhdG9ycyc7XG5pbXBvcnQgeyBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50IH0gZnJvbSAnLi9DYW1lcmFDb250cm9sbGVyQ29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FtZXJhQ29udHJvbGxlckVudGl0eU1ldGhvZHMge1xuICBnZXRDYW1lcmFDb250cm9sbGVyKCk6IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQ7XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IElDYW1lcmFDb250cm9sbGVyRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlQ2FtZXJhRW50aXR5IH0gZnJvbSAnLi4vQ2FtZXJhL2NyZWF0ZUNhbWVyYUVudGl0eSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYW1lcmFDb250cm9sbGVyRW50aXR5KCk6IElDYW1lcmFDb250cm9sbGVyRW50aXR5IHtcbiAgY29uc3QgZW50aXR5ID0gY3JlYXRlQ2FtZXJhRW50aXR5KCk7XG4gIGNvbnN0IGVudGl0eUFkZGVkQ29tcG9uZW50ID0gRW50aXR5UmVwb3NpdG9yeS50cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb250cm9sbGVyQ29tcG9uZW50VElELFxuICAgIGVudGl0eVxuICApIGFzIElDYW1lcmFDb250cm9sbGVyRW50aXR5O1xuICByZXR1cm4gZW50aXR5QWRkZWRDb21wb25lbnQ7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9JQ2FtZXJhQ29udHJvbGxlckVudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZUNhbWVyYUNvbnRyb2xsZXJFbnRpdHknO1xuIiwiaW1wb3J0IHsgTWl4aW5CYXNlIH0gZnJvbSAnLi4vLi4vdHlwZXMvVHlwZUdlbmVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9BbmltYXRpb24vQW5pbWF0aW9uQ29tcG9uZW50JztcbmltcG9ydCB7IElBbmltYXRpb25FbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9BbmltYXRpb24vSUFuaW1hdGlvbkVudGl0eSc7XG5pbXBvcnQgeyBCbGVuZFNoYXBlQ29tcG9uZW50IH0gZnJvbSAnLi9CbGVuZFNoYXBlL0JsZW5kU2hhcGVDb21wb25lbnQnO1xuaW1wb3J0IHsgSUJsZW5kU2hhcGVFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9CbGVuZFNoYXBlL0lCbGVuZFNoYXBlRW50aXR5JztcbmltcG9ydCB7IElDYW1lcmFFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9DYW1lcmEvSUNhbWVyYUVudGl0eSc7XG5pbXBvcnQgeyBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50IH0gZnJvbSAnLi9DYW1lcmFDb250cm9sbGVyL0NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQnO1xuaW1wb3J0IHsgSUNhbWVyYUNvbnRyb2xsZXJFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9DYW1lcmFDb250cm9sbGVyL0lDYW1lcmFDb250cm9sbGVyRW50aXR5JztcbmltcG9ydCB7IElMaWdodEVudGl0eU1ldGhvZHMgfSBmcm9tICcuL0xpZ2h0L0lMaWdodEVudGl0eSc7XG5pbXBvcnQgeyBMaWdodENvbXBvbmVudCB9IGZyb20gJy4vTGlnaHQvTGlnaHRDb21wb25lbnQnO1xuaW1wb3J0IHsgSU1lc2hFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9NZXNoL0lNZXNoRW50aXR5JztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuL01lc2gvTWVzaENvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWVzaFJlbmRlcmVyRW50aXR5TWV0aG9kcyB9IGZyb20gJy4vTWVzaFJlbmRlcmVyL0lNZXNoUmVuZGVyZXJFbnRpdHknO1xuaW1wb3J0IHsgTWVzaFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9NZXNoUmVuZGVyZXIvTWVzaFJlbmRlcmVyQ29tcG9uZW50JztcbmltcG9ydCB7IElQaHlzaWNzRW50aXR5TWV0aG9kcyB9IGZyb20gJy4vUGh5c2ljcy9JUGh5c2ljc0VudGl0eSc7XG5pbXBvcnQgeyBQaHlzaWNzQ29tcG9uZW50IH0gZnJvbSAnLi9QaHlzaWNzL1BoeXNpY3NDb21wb25lbnQnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9TY2VuZUdyYXBoL0lTY2VuZUdyYXBoRW50aXR5JztcbmltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuL1NjZW5lR3JhcGgvU2NlbmVHcmFwaENvbXBvbmVudCc7XG5pbXBvcnQgeyBJU2tlbGV0YWxFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9Ta2VsZXRhbC9JU2tlbGV0YWxFbnRpdHknO1xuaW1wb3J0IHsgU2tlbGV0YWxDb21wb25lbnQgfSBmcm9tICcuL1NrZWxldGFsL1NrZWxldGFsQ29tcG9uZW50JztcbmltcG9ydCB7IElUcmFuc2Zvcm1FbnRpdHlNZXRob2RzIH0gZnJvbSAnLi9UcmFuc2Zvcm0vSVRyYW5zZm9ybUVudGl0eSc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db21wb25lbnQgfSBmcm9tICcuL1RyYW5zZm9ybS9UcmFuc2Zvcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgSUVmZmVrc2VlckVudGl0eU1ldGhvZHMsIEVmZmVrc2VlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VmZmVrc2Vlci9FZmZla3NlZXJDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IFZybUNvbXBvbmVudCB9IGZyb20gJy4vVnJtL1ZybUNvbXBvbmVudCc7XG5pbXBvcnQgeyBJVnJtRW50aXR5TWV0aG9kcyB9IGZyb20gJy4vVnJtL0lWcm1FbnRpdHknO1xuaW1wb3J0IHsgQ29uc3RyYWludENvbXBvbmVudCB9IGZyb20gJy4vQ29uc3RyYWludC9Db25zdHJhaW50Q29tcG9uZW50JztcbmltcG9ydCB7IElDb25zdHJhaW50RW50aXR5TWV0aG9kcyB9IGZyb20gJy4vQ29uc3RyYWludC9JQ29uc3RyYWludEVudGl0eSc7XG5pbXBvcnQgeyBBbmltYXRpb25TdGF0ZUNvbXBvbmVudCwgSUFuaW1hdGlvblN0YXRlRW50aXR5TWV0aG9kcyB9IGZyb20gJy4vQW5pbWF0aW9uU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBDb21wb25lbnRNaXhpbkZ1bmN0aW9uID0gPEVudGl0eUJhc2VDbGFzcyBleHRlbmRzIE1peGluQmFzZT4oXG4gIGJhc2VDbGFzczogRW50aXR5QmFzZUNsYXNzLFxuICBjb21wb25lbnRzOiAodHlwZW9mIENvbXBvbmVudClbXVxuKSA9PiB7XG4gIGVudGl0eUNsYXNzOiBNaXhpbkJhc2U7XG4gIGNvbXBvbmVudHM6ICh0eXBlb2YgQ29tcG9uZW50KVtdO1xufTtcblxudHlwZSBBbGxXZWxsS25vd25Db21wb25lbnRNZXRob2RzVHlwZXMgPVxuICB8IElBbmltYXRpb25TdGF0ZUVudGl0eU1ldGhvZHNcbiAgfCBJQW5pbWF0aW9uRW50aXR5TWV0aG9kc1xuICB8IElUcmFuc2Zvcm1FbnRpdHlNZXRob2RzXG4gIHwgSVNjZW5lR3JhcGhFbnRpdHlNZXRob2RzXG4gIHwgSU1lc2hFbnRpdHlNZXRob2RzXG4gIHwgSU1lc2hSZW5kZXJlckVudGl0eU1ldGhvZHNcbiAgfCBJTGlnaHRFbnRpdHlNZXRob2RzXG4gIHwgSUNhbWVyYUVudGl0eU1ldGhvZHNcbiAgfCBJQ2FtZXJhQ29udHJvbGxlckVudGl0eU1ldGhvZHNcbiAgfCBJU2tlbGV0YWxFbnRpdHlNZXRob2RzXG4gIHwgSUJsZW5kU2hhcGVFbnRpdHlNZXRob2RzXG4gIHwgSVBoeXNpY3NFbnRpdHlNZXRob2RzXG4gIHwgSUVmZmVrc2VlckVudGl0eU1ldGhvZHNcbiAgfCBJVnJtRW50aXR5TWV0aG9kcztcblxudHlwZSBJc1RoaXNBbmltYXRpb25TdGF0ZTxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgQW5pbWF0aW9uU3RhdGVDb21wb25lbnRcbiAgPyBJQW5pbWF0aW9uU3RhdGVFbnRpdHlNZXRob2RzXG4gIDogRXhjbHVkZTxQb3NzaWJsZXMsIElBbmltYXRpb25TdGF0ZUVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc0FuaW1hdGlvbjxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgQW5pbWF0aW9uQ29tcG9uZW50XG4gID8gSUFuaW1hdGlvbkVudGl0eU1ldGhvZHNcbiAgOiBFeGNsdWRlPFBvc3NpYmxlcywgSUFuaW1hdGlvbkVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc1RyYW5zZm9ybTxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgVHJhbnNmb3JtQ29tcG9uZW50XG4gID8gSVRyYW5zZm9ybUVudGl0eU1ldGhvZHNcbiAgOiBFeGNsdWRlPFBvc3NpYmxlcywgSVRyYW5zZm9ybUVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc1NjZW5lR3JhcGg8XG4gIFQgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50LFxuICBQb3NzaWJsZXMgZXh0ZW5kcyBBbGxXZWxsS25vd25Db21wb25lbnRNZXRob2RzVHlwZXNcbj4gPSBUIGV4dGVuZHMgdHlwZW9mIFNjZW5lR3JhcGhDb21wb25lbnRcbiAgPyBJU2NlbmVHcmFwaEVudGl0eU1ldGhvZHNcbiAgOiBFeGNsdWRlPFBvc3NpYmxlcywgSVNjZW5lR3JhcGhFbnRpdHlNZXRob2RzPjtcblxudHlwZSBJc1RoaXNNZXNoPFxuICBUIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudCxcbiAgUG9zc2libGVzIGV4dGVuZHMgQWxsV2VsbEtub3duQ29tcG9uZW50TWV0aG9kc1R5cGVzXG4+ID0gVCBleHRlbmRzIHR5cGVvZiBNZXNoQ29tcG9uZW50ID8gSU1lc2hFbnRpdHlNZXRob2RzIDogRXhjbHVkZTxQb3NzaWJsZXMsIElNZXNoRW50aXR5TWV0aG9kcz47XG5cbnR5cGUgSXNUaGlzTWVzaFJlbmRlcmVyPFxuICBUIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudCxcbiAgUG9zc2libGVzIGV4dGVuZHMgQWxsV2VsbEtub3duQ29tcG9uZW50TWV0aG9kc1R5cGVzXG4+ID0gVCBleHRlbmRzIHR5cGVvZiBNZXNoUmVuZGVyZXJDb21wb25lbnRcbiAgPyBJTWVzaFJlbmRlcmVyRW50aXR5TWV0aG9kc1xuICA6IEV4Y2x1ZGU8UG9zc2libGVzLCBJTWVzaFJlbmRlcmVyRW50aXR5TWV0aG9kcz47XG5cbnR5cGUgSXNUaGlzQ2FtZXJhQ29udHJvbGxlcjxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudFxuICA/IElDYW1lcmFDb250cm9sbGVyRW50aXR5TWV0aG9kc1xuICA6IEV4Y2x1ZGU8UG9zc2libGVzLCBJQ2FtZXJhQ29udHJvbGxlckVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc0NhbWVyYTxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgQ2FtZXJhQ29tcG9uZW50XG4gID8gSUNhbWVyYUVudGl0eU1ldGhvZHNcbiAgOiBFeGNsdWRlPFBvc3NpYmxlcywgSUNhbWVyYUVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc0xpZ2h0PFxuICBUIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudCxcbiAgUG9zc2libGVzIGV4dGVuZHMgQWxsV2VsbEtub3duQ29tcG9uZW50TWV0aG9kc1R5cGVzXG4+ID0gVCBleHRlbmRzIHR5cGVvZiBMaWdodENvbXBvbmVudCA/IElMaWdodEVudGl0eU1ldGhvZHMgOiBFeGNsdWRlPFBvc3NpYmxlcywgSUxpZ2h0RW50aXR5TWV0aG9kcz47XG5cbnR5cGUgSXNUaGlzU2tlbGV0YWw8XG4gIFQgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50LFxuICBQb3NzaWJsZXMgZXh0ZW5kcyBBbGxXZWxsS25vd25Db21wb25lbnRNZXRob2RzVHlwZXNcbj4gPSBUIGV4dGVuZHMgdHlwZW9mIFNrZWxldGFsQ29tcG9uZW50XG4gID8gSVNrZWxldGFsRW50aXR5TWV0aG9kc1xuICA6IEV4Y2x1ZGU8UG9zc2libGVzLCBJU2tlbGV0YWxFbnRpdHlNZXRob2RzPjtcblxudHlwZSBJc1RoaXNCbGVuZFNoYXBlPFxuICBUIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudCxcbiAgUG9zc2libGVzIGV4dGVuZHMgQWxsV2VsbEtub3duQ29tcG9uZW50TWV0aG9kc1R5cGVzXG4+ID0gVCBleHRlbmRzIHR5cGVvZiBCbGVuZFNoYXBlQ29tcG9uZW50XG4gID8gSUJsZW5kU2hhcGVFbnRpdHlNZXRob2RzXG4gIDogRXhjbHVkZTxQb3NzaWJsZXMsIElCbGVuZFNoYXBlRW50aXR5TWV0aG9kcz47XG5cbnR5cGUgSXNUaGlzUGh5c2ljczxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgUGh5c2ljc0NvbXBvbmVudFxuICA/IElQaHlzaWNzRW50aXR5TWV0aG9kc1xuICA6IEV4Y2x1ZGU8UG9zc2libGVzLCBJUGh5c2ljc0VudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc0VmZmVrc2VlcjxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgRWZmZWtzZWVyQ29tcG9uZW50XG4gID8gSUVmZmVrc2VlckVudGl0eU1ldGhvZHNcbiAgOiBFeGNsdWRlPFBvc3NpYmxlcywgSUVmZmVrc2VlckVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc1ZybTxcbiAgVCBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQsXG4gIFBvc3NpYmxlcyBleHRlbmRzIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlc1xuPiA9IFQgZXh0ZW5kcyB0eXBlb2YgVnJtQ29tcG9uZW50ID8gSVZybUVudGl0eU1ldGhvZHMgOiBFeGNsdWRlPFBvc3NpYmxlcywgSVZybUVudGl0eU1ldGhvZHM+O1xuXG50eXBlIElzVGhpc0NvbnN0cmFpbnQ8XG4gIFQgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50LFxuICBQb3NzaWJsZXMgZXh0ZW5kcyBBbGxXZWxsS25vd25Db21wb25lbnRNZXRob2RzVHlwZXNcbj4gPSBUIGV4dGVuZHMgdHlwZW9mIENvbnN0cmFpbnRDb21wb25lbnRcbiAgPyBJQ29uc3RyYWludEVudGl0eU1ldGhvZHNcbiAgOiBFeGNsdWRlPFBvc3NpYmxlcywgSUNvbnN0cmFpbnRFbnRpdHlNZXRob2RzPjtcblxuZXhwb3J0IHR5cGUgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFQgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PiA9IElzVGhpc0NvbnN0cmFpbnQ8XG4gIFQsXG4gIElzVGhpc1ZybTxcbiAgICBULFxuICAgIElzVGhpc0VmZmVrc2VlcjxcbiAgICAgIFQsXG4gICAgICBJc1RoaXNQaHlzaWNzPFxuICAgICAgICBULFxuICAgICAgICBJc1RoaXNCbGVuZFNoYXBlPFxuICAgICAgICAgIFQsXG4gICAgICAgICAgSXNUaGlzU2tlbGV0YWw8XG4gICAgICAgICAgICBULFxuICAgICAgICAgICAgSXNUaGlzTGlnaHQ8XG4gICAgICAgICAgICAgIFQsXG4gICAgICAgICAgICAgIElzVGhpc0NhbWVyYTxcbiAgICAgICAgICAgICAgICBULFxuICAgICAgICAgICAgICAgIElzVGhpc0NhbWVyYUNvbnRyb2xsZXI8XG4gICAgICAgICAgICAgICAgICBULFxuICAgICAgICAgICAgICAgICAgSXNUaGlzTWVzaFJlbmRlcmVyPFxuICAgICAgICAgICAgICAgICAgICBULFxuICAgICAgICAgICAgICAgICAgICBJc1RoaXNNZXNoPFxuICAgICAgICAgICAgICAgICAgICAgIFQsXG4gICAgICAgICAgICAgICAgICAgICAgSXNUaGlzU2NlbmVHcmFwaDxcbiAgICAgICAgICAgICAgICAgICAgICAgIFQsXG4gICAgICAgICAgICAgICAgICAgICAgICBJc1RoaXNUcmFuc2Zvcm08XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIElzVGhpc0FuaW1hdGlvbjxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzVGhpc0FuaW1hdGlvblN0YXRlPFQsIEFsbFdlbGxLbm93bkNvbXBvbmVudE1ldGhvZHNUeXBlcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPlxuICAgICAgICAgID5cbiAgICAgICAgPlxuICAgICAgPlxuICAgID5cbiAgPlxuPjtcblxudHlwZSBGb28gPSBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8dHlwZW9mIFRyYW5zZm9ybUNvbXBvbmVudD47XG4iLCJpbXBvcnQgeyBDb21wb25lbnRTSUQsIENvbXBvbmVudFRJRCwgRW50aXR5VUlEIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSVZybUNvbnN0cmFpbnQgfSBmcm9tICcuLi8uLi9jb25zdHJhaW50cy9JVnJtQ29uc3RyYWludCc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSwgYXBwbHlNaXhpbnMgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IElDb25zdHJhaW50RW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzIH0gZnJvbSAnLi4vQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuXG5leHBvcnQgY2xhc3MgQ29uc3RyYWludENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgX192cm1Db25zdHJhaW50PzogSVZybUNvbnN0cmFpbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgY29tcG9uZW50U2lkOiBDb21wb25lbnRTSUQsXG4gICAgZW50aXR5Q29tcG9uZW50OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5VWlkLCBjb21wb25lbnRTaWQsIGVudGl0eUNvbXBvbmVudCwgaXNSZVVzZSk7XG4gICAgdGhpcy5tb3ZlU3RhZ2VUbyhQcm9jZXNzU3RhZ2UuTG9naWMpO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIHRoZSBlbnRpdHkgd2hpY2ggaGFzIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBnZXQgZW50aXR5KCk6IElDb25zdHJhaW50RW50aXR5IHtcbiAgICByZXR1cm4gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkodGhpcy5fX2VudGl0eVVpZCkgYXMgdW5rbm93biBhcyBJQ29uc3RyYWludEVudGl0eTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ29uc3RyYWludENvbXBvbmVudFRJRDtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5Db25zdHJhaW50Q29tcG9uZW50VElEO1xuICB9XG5cbiAgJGxvZ2ljKCkge1xuICAgIGlmICh0aGlzLl9fdnJtQ29uc3RyYWludCkge1xuICAgICAgdGhpcy5fX3ZybUNvbnN0cmFpbnQudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q29uc3RyYWludChjb25zdHJhaW50OiBJVnJtQ29uc3RyYWludCkge1xuICAgIHRoaXMuX192cm1Db25zdHJhaW50ID0gY29uc3RyYWludDtcbiAgfVxuXG4gIF9kZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLl9kZXN0cm95KCk7XG4gICAgdGhpcy5fX3ZybUNvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBhZGRUaGlzQ29tcG9uZW50VG9FbnRpdHk8RW50aXR5QmFzZSBleHRlbmRzIElFbnRpdHksIFNvbWVDb21wb25lbnRDbGFzcyBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ+KFxuICAgIGJhc2U6IEVudGl0eUJhc2UsXG4gICAgX2NvbXBvbmVudENsYXNzOiBTb21lQ29tcG9uZW50Q2xhc3NcbiAgKSB7XG4gICAgY2xhc3MgQ29uc3RyYWludEVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAgICAgICBpc0FsaXZlOiBib29sZWFuLFxuICAgICAgICBjb21wb25lbnRzPzogTWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGVudGl0eVVJRCwgaXNBbGl2ZSwgY29tcG9uZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGdldENvbnN0cmFpbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ29uc3RyYWludENvbXBvbmVudFRJRFxuICAgICAgICApIGFzIENvbnN0cmFpbnRDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGFwcGx5TWl4aW5zKGJhc2UsIENvbnN0cmFpbnRFbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdHJhaW50Q29tcG9uZW50IH0gZnJvbSAnLi9Db25zdHJhaW50Q29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29uc3RyYWludEVudGl0eU1ldGhvZHMge1xuICBnZXRDb25zdHJhaW50KCk6IENvbnN0cmFpbnRDb21wb25lbnQ7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0lDb25zdHJhaW50RW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29uc3RyYWludENvbXBvbmVudCc7XG4iLCJpbXBvcnQgeyBMaWdodENvbXBvbmVudCB9IGZyb20gJy4vTGlnaHRDb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMaWdodEVudGl0eU1ldGhvZHMge1xuICBnZXRMaWdodCgpOiBMaWdodENvbXBvbmVudDtcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMsIEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgTGlnaHRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvTGlnaHRUeXBlJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgRW50aXR5VUlELCBDb21wb25lbnRTSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBHbG9iYWxEYXRhUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvR2xvYmFsRGF0YVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3I0JztcbmltcG9ydCB7IFZlY3Rvck4gfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3Rvck4nO1xuaW1wb3J0IHsgSUxpZ2h0RW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5JztcbmltcG9ydCB7IENvbXBvbmVudFRvQ29tcG9uZW50TWV0aG9kcyB9IGZyb20gJy4uL0NvbXBvbmVudFR5cGVzJztcbmltcG9ydCB7IExpZ2h0R2l6bW8gfSBmcm9tICcuLi8uLi9naXptb3MvTGlnaHRHaXptbyc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbWF0aC9TY2FsYXInO1xuaW1wb3J0IHsgVHJhbnNmb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vVHJhbnNmb3JtJztcbmltcG9ydCB7IGNyZWF0ZUdyb3VwRW50aXR5IH0gZnJvbSAnLi4vU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eSc7XG5cbi8qKlxuICogVGhlIENvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgYSBsaWdodC5cbiAqXG4gKiBAcmVtYXJrc1xuICogdGhlIGxpZ2h0IGxvb2tzIHRvd2FyZHMgdGhlIGxvY2FsIC1aIGF4aXMgaW4gcmlnaHQgaGFuZCBjb29yZGluYXRlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGNsYXNzIExpZ2h0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHR5cGUgPSBMaWdodFR5cGUuUG9pbnQ7XG4gIHByaXZhdGUgX19pbnRlbnNpdHkgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzEsIDEsIDFdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfX2luaXRpYWxEaXJlY3Rpb24gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIC0xXSk7XG4gIHByaXZhdGUgX19kaXJlY3Rpb24gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIC0xXSk7XG4gIHB1YmxpYyBpbm5lckNvbmVBbmdsZSA9IDAuMDtcbiAgcHVibGljIG91dGVyQ29uZUFuZ2xlID0gTWF0aC5QSSAvIDQuMDsgLy8gaW4gcmFkaWFuXG4gIHB1YmxpYyByYW5nZSA9IC0xO1xuICBwdWJsaWMgZW5hYmxlID0gdHJ1ZTtcbiAgcHVibGljIHNoYWRvd0FyZWFTaXplRm9yRGlyZWN0aW9uYWxMaWdodCA9IDEwO1xuICBwcml2YXRlIHN0YXRpYyBfX2dsb2JhbERhdGFSZXBvc2l0b3J5ID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfdmVjNCA9IE11dGFibGVWZWN0b3I0Lnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19saWdodFBvc2l0aW9ucyA9IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoMCkpO1xuICBwcml2YXRlIHN0YXRpYyBfX2xpZ2h0RGlyZWN0aW9ucyA9IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoMCkpO1xuICBwcml2YXRlIHN0YXRpYyBfX2xpZ2h0SW50ZW5zaXRpZXMgPSBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KDApKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19saWdodFByb3BlcnRpZXMgPSBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KDApKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19saWdodE51bWJlciA9IFNjYWxhci56ZXJvKCk7XG4gIHByaXZhdGUgX19saWdodEdpem1vPzogTGlnaHRHaXptbztcblxuICBwcml2YXRlIF9fdXBkYXRlQ291bnQgPSAwO1xuICBwcml2YXRlIF9fbGFzdFVwZGF0ZUNvdW50ID0gLTE7XG4gIHByaXZhdGUgX19sYXN0VHJhbnNmb3JtVXBkYXRlQ291bnQgPSAtMTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlVaWQ6IEVudGl0eVVJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRCxcbiAgICBlbnRpdHlSZXBvc2l0b3J5OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5VWlkLCBjb21wb25lbnRTaWQsIGVudGl0eVJlcG9zaXRvcnksIGlzUmVVc2UpO1xuXG4gICAgdGhpcy5fc2V0TWF4TnVtYmVyT2ZDb21wb25lbnQoTWF0aC5tYXgoMTAsIE1hdGguZmxvb3IoQ29uZmlnLm1heEVudGl0eU51bWJlciAvIDEwMCkpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTGlnaHRDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTGlnaHRDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgdXBkYXRlQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX191cGRhdGVDb3VudDtcbiAgfVxuXG4gIGdldCBkaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kaXJlY3Rpb247XG4gIH1cblxuICBzZXQgaW50ZW5zaXR5KHZhbHVlOiBWZWN0b3IzKSB7XG4gICAgdGhpcy5fX2ludGVuc2l0eSA9IHZhbHVlO1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IGludGVuc2l0eSgpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gdGhpcy5fX2ludGVuc2l0eTtcbiAgfVxuXG4gIGdldCBfdXAoKSB7XG4gICAgcmV0dXJuIFZlY3RvcjMuZnJvbUNvcHkzKDAsIDEsIDApO1xuICB9XG5cbiAgc2V0IGlzTGlnaHRHaXptb1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgaWYgKGZsZykge1xuICAgICAgaWYgKElzLm5vdC5kZWZpbmVkKHRoaXMuX19saWdodEdpem1vKSkge1xuICAgICAgICB0aGlzLl9fbGlnaHRHaXptbyA9IG5ldyBMaWdodEdpem1vKHRoaXMuZW50aXR5KTtcbiAgICAgICAgdGhpcy5fX2xpZ2h0R2l6bW8uX3NldHVwKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fbGlnaHRHaXptby5pc1Zpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoSXMuZGVmaW5lZCh0aGlzLl9fbGlnaHRHaXptbykpIHtcbiAgICAgICAgdGhpcy5fX2xpZ2h0R2l6bW8uaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IGlzTGlnaHRHaXptb1Zpc2libGUoKSB7XG4gICAgaWYgKElzLmRlZmluZWQodGhpcy5fX2xpZ2h0R2l6bW8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2xpZ2h0R2l6bW8uaXNWaXNpYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgJGxvYWQoKSB7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodFBvc2l0aW9ucyA9IExpZ2h0Q29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoXG4gICAgICAnbGlnaHRQb3NpdGlvbicsXG4gICAgICAwXG4gICAgKTtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0RGlyZWN0aW9ucyA9IExpZ2h0Q29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoXG4gICAgICAnbGlnaHREaXJlY3Rpb24nLFxuICAgICAgMFxuICAgICk7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodEludGVuc2l0aWVzID0gTGlnaHRDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRWYWx1ZShcbiAgICAgICdsaWdodEludGVuc2l0eScsXG4gICAgICAwXG4gICAgKTtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0UHJvcGVydGllcyA9IExpZ2h0Q29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoXG4gICAgICAnbGlnaHRQcm9wZXJ0eScsXG4gICAgICAwXG4gICAgKTtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0TnVtYmVyID0gTGlnaHRDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRWYWx1ZSgnbGlnaHROdW1iZXInLCAwKTtcblxuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgfVxuXG4gIHByaXZhdGUgX191cGRhdGVHaXptbygpIHtcbiAgICBpZiAoSXMuZGVmaW5lZCh0aGlzLl9fbGlnaHRHaXptbykgJiYgdGhpcy5fX2xpZ2h0R2l6bW8uaXNTZXR1cCAmJiB0aGlzLmlzTGlnaHRHaXptb1Zpc2libGUpIHtcbiAgICAgIHRoaXMuX19saWdodEdpem1vLl91cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY29tbW9uXyRsb2dpYygpIHtcbiAgICBjb25zdCBsaWdodENvbXBvbmVudHMgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudHNXaXRoVHlwZShcbiAgICAgIExpZ2h0Q29tcG9uZW50XG4gICAgKSBhcyBMaWdodENvbXBvbmVudFtdO1xuICAgIExpZ2h0Q29tcG9uZW50Ll9fbGlnaHROdW1iZXIuX3ZbMF0gPSBsaWdodENvbXBvbmVudHMubGVuZ3RoO1xuICB9XG5cbiAgJGxvZ2ljKCkge1xuICAgIGlmIChcbiAgICAgIFRyYW5zZm9ybUNvbXBvbmVudC51cGRhdGVDb3VudCA9PT0gdGhpcy5fX2xhc3RUcmFuc2Zvcm1VcGRhdGVDb3VudCAmJlxuICAgICAgdGhpcy5fX2xhc3RVcGRhdGVDb3VudCA9PT0gdGhpcy5fX3VwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVHcmFwaENvbXBvbmVudCA9IHRoaXMuZW50aXR5LmdldFNjZW5lR3JhcGgoKTtcblxuICAgIHRoaXMuX19kaXJlY3Rpb24gPSBzY2VuZUdyYXBoQ29tcG9uZW50Lm5vcm1hbE1hdHJpeElubmVyLm11bHRpcGx5VmVjdG9yKFxuICAgICAgdGhpcy5fX2luaXRpYWxEaXJlY3Rpb25cbiAgICApO1xuXG4gICAgY29uc3QgbGlnaHRBbmdsZVNjYWxlID1cbiAgICAgIDEuMCAvIE1hdGgubWF4KDAuMDAxLCBNYXRoLmNvcyh0aGlzLmlubmVyQ29uZUFuZ2xlKSAtIE1hdGguY29zKHRoaXMub3V0ZXJDb25lQW5nbGUpKTtcbiAgICBjb25zdCBsaWdodEFuZ2xlT2Zmc2V0ID0gLU1hdGguY29zKHRoaXMub3V0ZXJDb25lQW5nbGUpICogbGlnaHRBbmdsZVNjYWxlO1xuXG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodERpcmVjdGlvbnMuX3ZbMyAqIHRoaXMuY29tcG9uZW50U0lEICsgMF0gPSB0aGlzLl9fZGlyZWN0aW9uLng7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodERpcmVjdGlvbnMuX3ZbMyAqIHRoaXMuY29tcG9uZW50U0lEICsgMV0gPSB0aGlzLl9fZGlyZWN0aW9uLnk7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodERpcmVjdGlvbnMuX3ZbMyAqIHRoaXMuY29tcG9uZW50U0lEICsgMl0gPSB0aGlzLl9fZGlyZWN0aW9uLno7XG5cbiAgICBjb25zdCBsaWdodFBvc2l0aW9uID0gc2NlbmVHcmFwaENvbXBvbmVudC53b3JsZFBvc2l0aW9uO1xuICAgIExpZ2h0Q29tcG9uZW50Ll9fbGlnaHRQb3NpdGlvbnMuX3ZbMyAqIHRoaXMuY29tcG9uZW50U0lEICsgMF0gPSBsaWdodFBvc2l0aW9uLng7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodFBvc2l0aW9ucy5fdlszICogdGhpcy5jb21wb25lbnRTSUQgKyAxXSA9IGxpZ2h0UG9zaXRpb24ueTtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0UG9zaXRpb25zLl92WzMgKiB0aGlzLmNvbXBvbmVudFNJRCArIDJdID0gbGlnaHRQb3NpdGlvbi56O1xuXG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodEludGVuc2l0aWVzLl92WzMgKiB0aGlzLmNvbXBvbmVudFNJRCArIDBdID0gdGhpcy5fX2ludGVuc2l0eS54O1xuICAgIExpZ2h0Q29tcG9uZW50Ll9fbGlnaHRJbnRlbnNpdGllcy5fdlszICogdGhpcy5jb21wb25lbnRTSUQgKyAxXSA9IHRoaXMuX19pbnRlbnNpdHkueTtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0SW50ZW5zaXRpZXMuX3ZbMyAqIHRoaXMuY29tcG9uZW50U0lEICsgMl0gPSB0aGlzLl9faW50ZW5zaXR5Lno7XG5cbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0UHJvcGVydGllcy5fdls0ICogdGhpcy5jb21wb25lbnRTSUQgKyAwXSA9IHRoaXMuZW5hYmxlXG4gICAgICA/IHRoaXMudHlwZS5pbmRleFxuICAgICAgOiAtMTtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0UHJvcGVydGllcy5fdls0ICogdGhpcy5jb21wb25lbnRTSUQgKyAxXSA9IHRoaXMucmFuZ2U7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodFByb3BlcnRpZXMuX3ZbNCAqIHRoaXMuY29tcG9uZW50U0lEICsgMl0gPSBsaWdodEFuZ2xlU2NhbGU7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodFByb3BlcnRpZXMuX3ZbNCAqIHRoaXMuY29tcG9uZW50U0lEICsgM10gPSBsaWdodEFuZ2xlT2Zmc2V0O1xuXG4gICAgdGhpcy5fX3VwZGF0ZUdpem1vKCk7XG5cbiAgICB0aGlzLl9fbGFzdFRyYW5zZm9ybVVwZGF0ZUNvdW50ID0gVHJhbnNmb3JtQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICAgIHRoaXMuX19sYXN0VXBkYXRlQ291bnQgPSB0aGlzLl9fdXBkYXRlQ291bnQ7XG4gIH1cblxuICBfZGVzdHJveSgpIHtcbiAgICBzdXBlci5fZGVzdHJveSgpO1xuICAgIExpZ2h0Q29tcG9uZW50Ll9fbGlnaHRJbnRlbnNpdGllcy5fdlszICogdGhpcy5jb21wb25lbnRTSUQgKyAwXSA9IDA7XG4gICAgTGlnaHRDb21wb25lbnQuX19saWdodEludGVuc2l0aWVzLl92WzMgKiB0aGlzLmNvbXBvbmVudFNJRCArIDFdID0gMDtcbiAgICBMaWdodENvbXBvbmVudC5fX2xpZ2h0SW50ZW5zaXRpZXMuX3ZbMyAqIHRoaXMuY29tcG9uZW50U0lEICsgMl0gPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgZW50aXR5IHdoaWNoIGhhcyB0aGlzIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnRcbiAgICovXG4gIGdldCBlbnRpdHkoKTogSUxpZ2h0RW50aXR5IHtcbiAgICByZXR1cm4gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkodGhpcy5fX2VudGl0eVVpZCkgYXMgdW5rbm93biBhcyBJTGlnaHRFbnRpdHk7XG4gIH1cblxuICBhZGRUaGlzQ29tcG9uZW50VG9FbnRpdHk8RW50aXR5QmFzZSBleHRlbmRzIElFbnRpdHksIFNvbWVDb21wb25lbnRDbGFzcyBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ+KFxuICAgIGJhc2U6IEVudGl0eUJhc2UsXG4gICAgX2NvbXBvbmVudENsYXNzOiBTb21lQ29tcG9uZW50Q2xhc3NcbiAgKSB7XG4gICAgY2xhc3MgTGlnaHRFbnRpdHkgZXh0ZW5kcyAoYmFzZS5jb25zdHJ1Y3RvciBhcyBhbnkpIHtcbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbnRpdHlVSUQ6IEVudGl0eVVJRCxcbiAgICAgICAgaXNBbGl2ZTogYm9vbGVhbixcbiAgICAgICAgY29tcG9uZW50cz86IE1hcDxDb21wb25lbnRUSUQsIENvbXBvbmVudD5cbiAgICAgICkge1xuICAgICAgICBzdXBlcihlbnRpdHlVSUQsIGlzQWxpdmUsIGNvbXBvbmVudHMpO1xuICAgICAgfVxuXG4gICAgICBnZXRMaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5MaWdodENvbXBvbmVudFRJRFxuICAgICAgICApIGFzIExpZ2h0Q29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBhcHBseU1peGlucyhiYXNlLCBMaWdodEVudGl0eSk7XG4gICAgcmV0dXJuIGJhc2UgYXMgdW5rbm93biBhcyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8U29tZUNvbXBvbmVudENsYXNzPiAmIEVudGl0eUJhc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSUxpZ2h0RW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlR3JvdXBFbnRpdHkgfSBmcm9tICcuLi9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpZ2h0RW50aXR5KCk6IElMaWdodEVudGl0eSB7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZUdyb3VwRW50aXR5KCk7XG4gIGNvbnN0IGVudGl0eUFkZGVkQ29tcG9uZW50ID0gRW50aXR5UmVwb3NpdG9yeS50cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5MaWdodENvbXBvbmVudFRJRCxcbiAgICBlbnRpdHlcbiAgKSBhcyBJTGlnaHRFbnRpdHk7XG4gIHJldHVybiBlbnRpdHlBZGRlZENvbXBvbmVudDtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vSUxpZ2h0RW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vTGlnaHRDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGVMaWdodEVudGl0eSc7XG4iLCJpbXBvcnQgeyBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNaXhpbkJhc2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9UeXBlR2VuZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi9NZXNoQ29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJTWVzaEVudGl0eU1ldGhvZHMge1xuICBnZXRNZXNoKCk6IE1lc2hDb21wb25lbnQ7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBhcHBseU1peGlucywgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBQcm9jZXNzU3RhZ2UgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzU3RhZ2UnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uLy4uL2dlb21ldHJ5L01lc2gnO1xuaW1wb3J0IHsgSUVudGl0eSwgRW50aXR5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgQ29tcG9uZW50VElELCBFbnRpdHlVSUQsIENvbXBvbmVudFNJRCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IE1hdHJpeDQ0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0NCc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBNYXRoQ2xhc3NVdGlsIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoQ2xhc3NVdGlsJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2hFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBJTWVzaEVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IEJsZW5kU2hhcGVDb21wb25lbnQgfSBmcm9tICcuLi9CbGVuZFNoYXBlL0JsZW5kU2hhcGVDb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzIH0gZnJvbSAnLi4vQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgUmF5Y2FzdFJlc3VsdEV4MSB9IGZyb20gJy4uLy4uL2dlb21ldHJ5L3R5cGVzL0dlb21ldHJ5VHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0RXhpc3QgfSBmcm9tICcuLi8uLi9taXNjL01pc2NVdGlsJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL21pc2MvTG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIE1lc2hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIF9fdmlld0RlcHRoID0gLU51bWJlci5NQVhfVkFMVUU7XG4gIHByaXZhdGUgX19tZXNoPzogTWVzaDtcbiAgcHVibGljIGlzUGlja2FibGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjdG9yM18wOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWN0b3IzXzE6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlY3RvcjNfMjogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fcmV0dXJuVmVjdG9yMzogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBNYXRyaXg0NF8wOiBNdXRhYmxlTWF0cml4NDQgPSBNdXRhYmxlTWF0cml4NDQuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX2xhdGVzdFByaW1pdGl2ZVBvc2l0aW9uQWNjZXNzb3JWZXJzaW9uID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlVaWQ6IEVudGl0eVVJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRCxcbiAgICBlbnRpdHlSZXBvc2l0b3J5OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5VWlkLCBjb21wb25lbnRTaWQsIGVudGl0eVJlcG9zaXRvcnksIGlzUmVVc2UpO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5NZXNoQ29tcG9uZW50VElEO1xuICB9XG5cbiAgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLk1lc2hDb21wb25lbnRUSUQ7XG4gIH1cblxuICBzZXRNZXNoKG1lc2g6IE1lc2gpIHtcbiAgICB0aGlzLl9fbWVzaCA9IG1lc2g7XG4gICAgbWVzaC5fYmVsb25nVG9NZXNoQ29tcG9uZW50KHRoaXMpO1xuICB9XG5cbiAgdW5zZXRNZXNoKCkge1xuICAgIGlmICh0aGlzLl9fbWVzaCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX19tZXNoID0gdm9pZCAwO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgbWVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21lc2g7XG4gIH1cblxuICBjYWxjVmlld0RlcHRoKGNhbWVyYUNvbXBvbmVudDogQ2FtZXJhQ29tcG9uZW50KSB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fbWVzaCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlclBvc2l0aW9uX2luTG9jYWwgPSB0aGlzLl9fbWVzaC5BQUJCLmNlbnRlclBvaW50O1xuICAgIGNvbnN0IHNrZWxldGFsID0gdGhpcy5lbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgIGlmIChJcy5leGlzdChza2VsZXRhbCkgJiYgSXMuZXhpc3Qoc2tlbGV0YWwuX2JpbmRTaGFwZU1hdHJpeCkpIHtcbiAgICAgIHNrZWxldGFsLl9iaW5kU2hhcGVNYXRyaXgubXVsdGlwbHlWZWN0b3IzVG8oXG4gICAgICAgIHRoaXMuX19tZXNoLkFBQkIuY2VudGVyUG9pbnQsXG4gICAgICAgIGNlbnRlclBvc2l0aW9uX2luTG9jYWxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgd29ybGRNYXRyaXhJbm5lciA9IHRoaXMuZW50aXR5LmdldFNjZW5lR3JhcGgoKS5tYXRyaXhJbm5lcjtcbiAgICBjb25zdCBjZW50ZXJQb3NpdGlvbl9pbldvcmxkID0gd29ybGRNYXRyaXhJbm5lci5tdWx0aXBseVZlY3RvcjNUbyhcbiAgICAgIGNlbnRlclBvc2l0aW9uX2luTG9jYWwsXG4gICAgICBNZXNoQ29tcG9uZW50Ll9fdG1wVmVjdG9yM18wXG4gICAgKTtcblxuICAgIGNvbnN0IHZpZXdNYXRyaXggPSBjYW1lcmFDb21wb25lbnQudmlld01hdHJpeDtcbiAgICBjb25zdCBjZW50ZXJQb3NpdGlvbl9pblZpZXcgPSB2aWV3TWF0cml4Lm11bHRpcGx5VmVjdG9yM1RvKFxuICAgICAgY2VudGVyUG9zaXRpb25faW5Xb3JsZCxcbiAgICAgIE1lc2hDb21wb25lbnQuX190bXBWZWN0b3IzXzFcbiAgICApO1xuICAgIHRoaXMuX192aWV3RGVwdGggPSBjZW50ZXJQb3NpdGlvbl9pblZpZXcuejtcblxuICAgIHJldHVybiB0aGlzLl9fdmlld0RlcHRoO1xuICB9XG5cbiAgZ2V0IHZpZXdEZXB0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXdEZXB0aDtcbiAgfVxuXG4gIHN0YXRpYyBhbGVydE5vTWVzaFNldChtZXNoQ29tcG9uZW50OiBNZXNoQ29tcG9uZW50KSB7XG4gICAgTG9nZ2VyLmRlYnVnKCdObyBtZXNoIGlzIHNldCBvbiB0aGlzIE1lc2hDb21wb25lbnQ6JyArIG1lc2hDb21wb25lbnQuY29tcG9uZW50U0lEKTtcbiAgfVxuXG4gIGNhc3RSYXkoc3JjUG9pbnRJbldvcmxkOiBWZWN0b3IzLCBkaXJlY3Rpb25JbldvcmxkOiBWZWN0b3IzLCBkb3RUaHJlc2hvbGQgPSAwKTogUmF5Y2FzdFJlc3VsdEV4MSB7XG4gICAgaWYgKHRoaXMuX19tZXNoKSB7XG4gICAgICBsZXQgc3JjUG9pbnRJbkxvY2FsID0gc3JjUG9pbnRJbldvcmxkO1xuICAgICAgbGV0IGRpcmVjdGlvbkluTG9jYWwgPSBkaXJlY3Rpb25JbldvcmxkO1xuICAgICAgY29uc3Qgc2NlbmVHcmFwaENvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpO1xuICAgICAgaWYgKHNjZW5lR3JhcGhDb21wb25lbnQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpbnZXb3JsZE1hdHJpeCA9IE1hdHJpeDQ0LmludmVydChzY2VuZUdyYXBoQ29tcG9uZW50Lm1hdHJpeElubmVyKTtcbiAgICAgICAgc3JjUG9pbnRJbkxvY2FsID0gVmVjdG9yMy5mcm9tQ29weVZlY3RvcjQoXG4gICAgICAgICAgaW52V29ybGRNYXRyaXgubXVsdGlwbHlWZWN0b3IoVmVjdG9yNC5mcm9tQ29weVZlY3RvcjMoc3JjUG9pbnRJbldvcmxkKSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGlzdFZlY0luV29ybGQgPSBWZWN0b3IzLmFkZChzcmNQb2ludEluV29ybGQsIGRpcmVjdGlvbkluV29ybGQpO1xuICAgICAgICBjb25zdCBkaXN0VmVjSW5Mb2NhbCA9IFZlY3RvcjMuZnJvbUNvcHlWZWN0b3I0KFxuICAgICAgICAgIGludldvcmxkTWF0cml4Lm11bHRpcGx5VmVjdG9yKFZlY3RvcjQuZnJvbUNvcHlWZWN0b3IzKGRpc3RWZWNJbldvcmxkKSlcbiAgICAgICAgKTtcbiAgICAgICAgZGlyZWN0aW9uSW5Mb2NhbCA9IFZlY3RvcjMubm9ybWFsaXplKFZlY3RvcjMuc3VidHJhY3QoZGlzdFZlY0luTG9jYWwsIHNyY1BvaW50SW5Mb2NhbCkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX19tZXNoLmNhc3RSYXkoc3JjUG9pbnRJbkxvY2FsLCBkaXJlY3Rpb25JbkxvY2FsLCBkb3RUaHJlc2hvbGQpO1xuICAgICAgICBsZXQgaW50ZXJzZWN0UG9zaXRpb25JbldvcmxkID0gbnVsbDtcbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVzdWx0LmRhdGEpICYmIHJlc3VsdC5kYXRhLnQgPj0gMCkge1xuICAgICAgICAgIGludGVyc2VjdFBvc2l0aW9uSW5Xb3JsZCA9IFZlY3RvcjMuZnJvbUNvcHlWZWN0b3I0KFxuICAgICAgICAgICAgc2NlbmVHcmFwaENvbXBvbmVudC5tYXRyaXhJbm5lci5tdWx0aXBseVZlY3RvcihcbiAgICAgICAgICAgICAgVmVjdG9yNC5mcm9tQ29weVZlY3RvcjMocmVzdWx0LmRhdGEucG9zaXRpb24pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXN1bHQ6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHQ6IHJlc3VsdC5kYXRhLnQsXG4gICAgICAgICAgICAgIHU6IHJlc3VsdC5kYXRhLnUsXG4gICAgICAgICAgICAgIHY6IHJlc3VsdC5kYXRhLnYsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBpbnRlcnNlY3RQb3NpdGlvbkluV29ybGQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY2FzdFJheUZyb21TY3JlZW5JbkxvY2FsKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgY2FtZXJhOiBDYW1lcmFDb21wb25lbnQsXG4gICAgdmlld3BvcnQ6IFZlY3RvcjQsXG4gICAgZG90VGhyZXNob2xkID0gMFxuICApOiBSYXljYXN0UmVzdWx0RXgxIHtcbiAgICBpZiAodGhpcy5fX21lc2gpIHtcbiAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKTtcbiAgICAgIGlmIChzY2VuZUdyYXBoQ29tcG9uZW50ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW52UFZXID0gTXV0YWJsZU1hdHJpeDQ0Lm11bHRpcGx5VG8oXG4gICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsXG4gICAgICAgICAgY2FtZXJhLnZpZXdNYXRyaXgsXG4gICAgICAgICAgTWVzaENvbXBvbmVudC5fX3RtcE1hdHJpeDQ0XzBcbiAgICAgICAgKVxuICAgICAgICAgIC5tdWx0aXBseShzY2VuZUdyYXBoQ29tcG9uZW50Lm1hdHJpeElubmVyKVxuICAgICAgICAgIC5pbnZlcnQoKTtcblxuICAgICAgICBjb25zdCBzcmNQb2ludEluTG9jYWwgPSBNYXRoQ2xhc3NVdGlsLnVuUHJvamVjdFRvKFxuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGludlBWVyxcbiAgICAgICAgICB2aWV3cG9ydCxcbiAgICAgICAgICBNZXNoQ29tcG9uZW50Ll9fdG1wVmVjdG9yM18wXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRpc3RWZWNJbkxvY2FsID0gTWF0aENsYXNzVXRpbC51blByb2plY3RUbyhcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgICAgMSxcbiAgICAgICAgICBpbnZQVlcsXG4gICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgICAgTWVzaENvbXBvbmVudC5fX3RtcFZlY3RvcjNfMVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbkluTG9jYWwgPSBNdXRhYmxlVmVjdG9yMy5zdWJ0cmFjdFRvKFxuICAgICAgICAgIGRpc3RWZWNJbkxvY2FsLFxuICAgICAgICAgIHNyY1BvaW50SW5Mb2NhbCxcbiAgICAgICAgICBNZXNoQ29tcG9uZW50Ll9fdG1wVmVjdG9yM18yXG4gICAgICAgICkubm9ybWFsaXplKCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fX21lc2guY2FzdFJheShzcmNQb2ludEluTG9jYWwsIGRpcmVjdGlvbkluTG9jYWwsIGRvdFRocmVzaG9sZCk7XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlc3VsdC5kYXRhKSAmJiByZXN1bHQuZGF0YS50ID49IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzdWx0OiB0cnVlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICB0OiByZXN1bHQuZGF0YS50LFxuICAgICAgICAgICAgICB1OiByZXN1bHQuZGF0YS51LFxuICAgICAgICAgICAgICB2OiByZXN1bHQuZGF0YS52LFxuICAgICAgICAgICAgICBwb3NpdGlvbjogcmVzdWx0LmRhdGEucG9zaXRpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY2FzdFJheUZyb21TY3JlZW5JbldvcmxkKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgY2FtZXJhOiBDYW1lcmFDb21wb25lbnQsXG4gICAgdmlld3BvcnQ6IFZlY3RvcjQsXG4gICAgZG90VGhyZXNob2xkID0gMFxuICApOiBSYXljYXN0UmVzdWx0RXgxIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNhc3RSYXlGcm9tU2NyZWVuSW5Mb2NhbCh4LCB5LCBjYW1lcmEsIHZpZXdwb3J0LCBkb3RUaHJlc2hvbGQpO1xuICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKTtcbiAgICBpZiAodGhpcy5fX21lc2ggJiYgc2NlbmVHcmFwaENvbXBvbmVudCAhPSBudWxsICYmIHJlc3VsdC5yZXN1bHQpIHtcbiAgICAgIGFzc2VydEV4aXN0KHJlc3VsdC5kYXRhKTtcblxuICAgICAgLy8gY29udmVydCB0byBXb3JsZCBzcGFjZVxuICAgICAgY29uc3QgaW50ZXJzZWN0ZWRQb3NpdGlvbkluV29ybGQgPSBzY2VuZUdyYXBoQ29tcG9uZW50Lm1hdHJpeElubmVyLm11bHRpcGx5VmVjdG9yM1RvKFxuICAgICAgICByZXN1bHQuZGF0YS5wb3NpdGlvbixcbiAgICAgICAgTWVzaENvbXBvbmVudC5fX3JldHVyblZlY3RvcjNcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IHRydWUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB0OiByZXN1bHQuZGF0YS50LFxuICAgICAgICAgIHU6IHJlc3VsdC5kYXRhLnUsXG4gICAgICAgICAgdjogcmVzdWx0LmRhdGEudixcbiAgICAgICAgICBwb3NpdGlvbjogaW50ZXJzZWN0ZWRQb3NpdGlvbkluV29ybGQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gICRsb2FkKCkge1xuICAgIGlmICh0aGlzLl9fbWVzaCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vICAgIHRoaXMuX19tZXNoIS5tYWtlVmVydGljZXNTZXBhcmF0ZWQoKTtcbiAgICB0aGlzLl9fbWVzaC5fY2FsY1RhbmdlbnRzKCk7XG4gICAgLy8gdGhpcy5fX21lc2guX19pbml0TW9ycGhQcmltaXRpdmVzKCk7XG4gICAgdGhpcy5fX21lc2ghLl9jYWxjRmFjZU5vcm1hbHNJZk5vbk5vcm1hbCgpO1xuICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldEJsZW5kU2hhcGUoKTtcbiAgICBpZiAoYmxlbmRTaGFwZUNvbXBvbmVudCAhPSBudWxsICYmIGJsZW5kU2hhcGVDb21wb25lbnQud2VpZ2h0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9fbWVzaCEuX2NhbGNCYXJ5Q2VudHJpY0Nvb3JkKCk7XG4gICAgfVxuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgfVxuXG4gICRsb2dpYygpIHt9XG5cbiAgX3NoYWxsb3dDb3B5RnJvbShjb21wb25lbnRfOiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRfIGFzIE1lc2hDb21wb25lbnQ7XG4gICAgdGhpcy5fX3ZpZXdEZXB0aCA9IGNvbXBvbmVudC5fX3ZpZXdEZXB0aDtcbiAgICBpZiAoSXMuZXhpc3QoY29tcG9uZW50Ll9fbWVzaCkpIHtcbiAgICAgIHRoaXMuc2V0TWVzaChjb21wb25lbnQuX19tZXNoKTtcbiAgICB9XG4gICAgdGhpcy5pc1BpY2thYmxlID0gY29tcG9uZW50LmlzUGlja2FibGU7XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5fZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLl9fbWVzaCkge1xuICAgICAgdGhpcy5fX21lc2ggPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgZW50aXR5IHdoaWNoIGhhcyB0aGlzIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnRcbiAgICovXG4gIGdldCBlbnRpdHkoKTogSU1lc2hFbnRpdHkge1xuICAgIHJldHVybiBFbnRpdHlSZXBvc2l0b3J5LmdldEVudGl0eSh0aGlzLl9fZW50aXR5VWlkKSBhcyB1bmtub3duIGFzIElNZXNoRW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBvdmVycmlkZVxuICAgKiBBZGQgdGhpcyBjb21wb25lbnQgdG8gdGhlIGVudGl0eVxuICAgKiBAcGFyYW0gYmFzZSB0aGUgdGFyZ2V0IGVudGl0eVxuICAgKiBAcGFyYW0gX2NvbXBvbmVudENsYXNzIHRoZSBjb21wb25lbnQgY2xhc3MgdG8gYWRkXG4gICAqL1xuICBhZGRUaGlzQ29tcG9uZW50VG9FbnRpdHk8RW50aXR5QmFzZSBleHRlbmRzIElFbnRpdHksIFNvbWVDb21wb25lbnRDbGFzcyBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ+KFxuICAgIGJhc2U6IEVudGl0eUJhc2UsXG4gICAgX2NvbXBvbmVudENsYXNzOiBTb21lQ29tcG9uZW50Q2xhc3NcbiAgKSB7XG4gICAgY2xhc3MgTWVzaEVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAgICAgICBpc0FsaXZlOiBib29sZWFuLFxuICAgICAgICBjb21wb25lbnRzPzogTWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGVudGl0eVVJRCwgaXNBbGl2ZSwgY29tcG9uZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGdldE1lc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTWVzaENvbXBvbmVudFRJRFxuICAgICAgICApIGFzIE1lc2hDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGFwcGx5TWl4aW5zKGJhc2UsIE1lc2hFbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0lNZXNoRW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vTWVzaENvbXBvbmVudCc7XG4iLCJpbXBvcnQgeyBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNaXhpbkJhc2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9UeXBlR2VuZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBNZXNoUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL01lc2hSZW5kZXJlckNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc2hSZW5kZXJlckVudGl0eU1ldGhvZHMge1xuICBnZXRNZXNoUmVuZGVyZXIoKTogTWVzaFJlbmRlcmVyQ29tcG9uZW50O1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi4vTWVzaC9NZXNoQ29tcG9uZW50JztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCwgUHJvY2Vzc0FwcHJvYWNoRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBQcm9jZXNzU3RhZ2UsIFByb2Nlc3NTdGFnZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzU3RhZ2UnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMsIEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9DdWJlVGV4dHVyZSc7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi4vLi4vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQge1xuICBDb21wb25lbnRTSUQsXG4gIENHQVBJUmVzb3VyY2VIYW5kbGUsXG4gIENvdW50LFxuICBJbmRleCxcbiAgT2JqZWN0VUlELFxuICBDb21wb25lbnRUSUQsXG4gIEVudGl0eVVJRCxcbiAgUHJpbWl0aXZlVUlELFxufSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzIH0gZnJvbSAnLi4vQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgaXNCbGVuZCwgaXNUcmFuc2x1Y2VudCB9IGZyb20gJy4uLy4uL2dlb21ldHJ5L3R5cGVzL0dlb21ldHJ5VHlwZXMnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IENHQVBJU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9yZW5kZXJlci9DR0FQSVN0cmF0ZWd5JztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi8uLi8uLi94ci9tYWluJztcbmltcG9ydCB7IFRyYW5zZm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL1RyYW5zZm9ybS9UcmFuc2Zvcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCB9IGZyb20gJy4uL0NhbWVyYUNvbnRyb2xsZXIvQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBXZWJHcHVTdHJhdGVneUJhc2ljIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L1dlYkdwdVN0cmF0ZWd5QmFzaWMnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL1NjZW5lR3JhcGgvU2NlbmVHcmFwaENvbXBvbmVudCc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1JlbmRlclRhcmdldFRleHR1cmVDdWJlJztcbmltcG9ydCB7IElNZXNoRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlR3JvdXBFbnRpdHkgfSBmcm9tICcuLi9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcblxuZXhwb3J0IGNsYXNzIE1lc2hSZW5kZXJlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgX19kaWZmdXNlQ3ViZU1hcD86IEN1YmVUZXh0dXJlIHwgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmU7XG4gIHByaXZhdGUgX19zcGVjdWxhckN1YmVNYXA/OiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlO1xuICBwcml2YXRlIF9fZGlmZnVzZUN1YmVNYXBDb250cmlidXRpb24gPSAxLjA7XG4gIHByaXZhdGUgX19zcGVjdWxhckN1YmVNYXBDb250cmlidXRpb24gPSAxLjA7XG4gIHByaXZhdGUgX19yb3RhdGlvbk9mQ3ViZU1hcCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jZ0FwaVJlbmRlcmluZ1N0cmF0ZWd5PzogQ0dBUElTdHJhdGVneTtcbiAgcHVibGljIHN0YXRpYyBpc0RlcHRoTWFza1RydWVGb3JCbGVuZFByaW1pdGl2ZXMgPSBmYWxzZTtcbiAgc3RhdGljIF9fc2hhZGVyUHJvZ3JhbUhhbmRsZU9mUHJpbWl0aXZlT2JqZWN0VWlkczogTWFwPE9iamVjdFVJRCwgQ0dBUElSZXNvdXJjZUhhbmRsZT4gPVxuICAgIG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX3VwZGF0ZUNvdW50ID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX191cGRhdGVDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgY29tcG9uZW50U2lkOiBDb21wb25lbnRTSUQsXG4gICAgZW50aXR5UmVwb3NpdG9yeTogRW50aXR5UmVwb3NpdG9yeSxcbiAgICBpc1JlVXNlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKGVudGl0eVVpZCwgY29tcG9uZW50U2lkLCBlbnRpdHlSZXBvc2l0b3J5LCBpc1JlVXNlKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTWVzaFJlbmRlcmVyQ29tcG9uZW50VElEO1xuICB9XG5cbiAgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLk1lc2hSZW5kZXJlckNvbXBvbmVudFRJRDtcbiAgfVxuXG4gIGdldCBkaWZmdXNlQ3ViZU1hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2RpZmZ1c2VDdWJlTWFwO1xuICB9XG5cbiAgZ2V0IHNwZWN1bGFyQ3ViZU1hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NwZWN1bGFyQ3ViZU1hcDtcbiAgfVxuXG4gIGdldCB1cGRhdGVDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZUNvdW50O1xuICB9XG5cbiAgc3RhdGljIGdldCB1cGRhdGVDb3VudCgpIHtcbiAgICByZXR1cm4gTWVzaFJlbmRlcmVyQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQ7XG4gIH1cblxuICBnZXQgZGlmZnVzZUN1YmVNYXBDb250cmlidXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kaWZmdXNlQ3ViZU1hcENvbnRyaWJ1dGlvbjtcbiAgfVxuXG4gIHNldCBkaWZmdXNlQ3ViZU1hcENvbnRyaWJ1dGlvbihjb250cmlidXRpb246IG51bWJlcikge1xuICAgIHRoaXMuX19kaWZmdXNlQ3ViZU1hcENvbnRyaWJ1dGlvbiA9IGNvbnRyaWJ1dGlvbjtcbiAgICBNZXNoUmVuZGVyZXJDb21wb25lbnQuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHNwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbjtcbiAgfVxuXG4gIHNldCBzcGVjdWxhckN1YmVNYXBDb250cmlidXRpb24oY29udHJpYnV0aW9uOiBudW1iZXIpIHtcbiAgICB0aGlzLl9fc3BlY3VsYXJDdWJlTWFwQ29udHJpYnV0aW9uID0gY29udHJpYnV0aW9uO1xuICAgIE1lc2hSZW5kZXJlckNvbXBvbmVudC5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBnZXQgcm90YXRpb25PZkN1YmVNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19yb3RhdGlvbk9mQ3ViZU1hcDtcbiAgfVxuXG4gIHNldCByb3RhdGlvbk9mQ3ViZU1hcChyb3RhdGlvbjogbnVtYmVyKSB7XG4gICAgdGhpcy5fX3JvdGF0aW9uT2ZDdWJlTWFwID0gcm90YXRpb247XG4gICAgTWVzaFJlbmRlcmVyQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIHNldElCTEN1YmVNYXAoXG4gICAgZGlmZnVzZUN1YmVUZXh0dXJlOiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlLFxuICAgIHNwZWN1bGFyQ3ViZVRleHR1cmU6IEN1YmVUZXh0dXJlIHwgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmVcbiAgKSB7XG4gICAgaWYgKGRpZmZ1c2VDdWJlVGV4dHVyZSA9PSBudWxsIHx8IHNwZWN1bGFyQ3ViZVRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX19kaWZmdXNlQ3ViZU1hcCA9IGRpZmZ1c2VDdWJlVGV4dHVyZTtcbiAgICB0aGlzLl9fc3BlY3VsYXJDdWJlTWFwID0gc3BlY3VsYXJDdWJlVGV4dHVyZTtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBpZiAoZGlmZnVzZUN1YmVUZXh0dXJlIGluc3RhbmNlb2YgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmUpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgZGlmZnVzZUN1YmVUZXh0dXJlLnNldElzVGV4dHVyZVJlYWR5KCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBpZiAoIWRpZmZ1c2VDdWJlVGV4dHVyZS5zdGFydGVkVG9Mb2FkKSB7XG4gICAgICAgICAgICBkaWZmdXNlQ3ViZVRleHR1cmUubG9hZFRleHR1cmVJbWFnZXNBc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpZmZ1c2VDdWJlVGV4dHVyZS5pc1RleHR1cmVSZWFkeSkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaWZmdXNlQ3ViZVRleHR1cmUucmVnaXN0ZXJPblRleHR1cmVMb2FkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChzcGVjdWxhckN1YmVUZXh0dXJlIGluc3RhbmNlb2YgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmUpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc3BlY3VsYXJDdWJlVGV4dHVyZS5zZXRJc1RleHR1cmVSZWFkeSgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgaWYgKCFzcGVjdWxhckN1YmVUZXh0dXJlLnN0YXJ0ZWRUb0xvYWQpIHtcbiAgICAgICAgICAgIHNwZWN1bGFyQ3ViZVRleHR1cmUubG9hZFRleHR1cmVJbWFnZXNBc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwZWN1bGFyQ3ViZVRleHR1cmUuaXNUZXh0dXJlUmVhZHkpIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3BlY3VsYXJDdWJlVGV4dHVyZS5yZWdpc3Rlck9uVGV4dHVyZUxvYWRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICAgICAgTWVzaFJlbmRlcmVyQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjb21tb25fJGxvYWQoeyBwcm9jZXNzQXBwcm9hY2ggfTogeyBwcm9jZXNzQXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW0gfSkge1xuICAgIGNvbnN0IG1vZHVsZU1hbmFnZXIgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cbiAgICAvLyBTdHJhdGVneVxuICAgIGlmIChwcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSAnd2ViZ3B1JztcbiAgICAgIGNvbnN0IHdlYmdwdU1vZHVsZSA9IG1vZHVsZU1hbmFnZXIuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpISBhcyBhbnk7XG4gICAgICBNZXNoUmVuZGVyZXJDb21wb25lbnQuX19jZ0FwaVJlbmRlcmluZ1N0cmF0ZWd5ID1cbiAgICAgICAgd2ViZ3B1TW9kdWxlLldlYkdwdVN0cmF0ZWd5QmFzaWMuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIChNZXNoUmVuZGVyZXJDb21wb25lbnQuX19jZ0FwaVJlbmRlcmluZ1N0cmF0ZWd5IGFzIFdlYkdwdVN0cmF0ZWd5QmFzaWMpLmNvbW1vbl8kbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtb2R1bGVOYW1lID0gJ3dlYmdsJztcbiAgICAgIGNvbnN0IHdlYmdsTW9kdWxlID0gbW9kdWxlTWFuYWdlci5nZXRNb2R1bGUobW9kdWxlTmFtZSkhIGFzIGFueTtcbiAgICAgIE1lc2hSZW5kZXJlckNvbXBvbmVudC5fX2NnQXBpUmVuZGVyaW5nU3RyYXRlZ3kgPVxuICAgICAgICB3ZWJnbE1vZHVsZS5nZXRSZW5kZXJpbmdTdHJhdGVneShwcm9jZXNzQXBwcm9hY2gpO1xuICAgIH1cbiAgfVxuXG4gICRsb2FkKCkge1xuICAgIGNvbnN0IHJlYWR5ID0gTWVzaFJlbmRlcmVyQ29tcG9uZW50Ll9fY2dBcGlSZW5kZXJpbmdTdHJhdGVneSEuJGxvYWQoXG4gICAgICB0aGlzLmVudGl0eS50cnlUb0dldE1lc2goKSFcbiAgICApO1xuICAgIGlmIChyZWFkeSkge1xuICAgICAgdGhpcy5tb3ZlU3RhZ2VUbyhQcm9jZXNzU3RhZ2UuVW5rbm93bik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHNvcnRfJHJlbmRlcihyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKTogQ29tcG9uZW50U0lEW10ge1xuICAgIGlmIChcbiAgICAgIFRyYW5zZm9ybUNvbXBvbmVudC51cGRhdGVDb3VudCA9PT0gcmVuZGVyUGFzcy5fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCAmJlxuICAgICAgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC51cGRhdGVDb3VudCA9PT1cbiAgICAgICAgcmVuZGVyUGFzcy5fbGFzdENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnRzVXBkYXRlQ291bnQgJiZcbiAgICAgIFNjZW5lR3JhcGhDb21wb25lbnQudXBkYXRlQ291bnQgPT09IHJlbmRlclBhc3MuX2xhc3RTY2VuZUdyYXBoQ29tcG9uZW50c1VwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVuZGVyUGFzcy5fbGFzdFByaW1pdGl2ZVVpZHM7XG4gICAgfVxuXG4gICAgLy8gZ2V0IENhbWVyYUNvbXBvbmVudFxuICAgIGxldCBjYW1lcmFDb21wb25lbnQgPSByZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudDtcbiAgICAvLyBJZiB0aGUgcmVuZGVyUGFzcyBkb2Vzbid0IGhhdmUgYSBjYW1lcmFDb21wb25lbnQsIHRoZW4gd2UgZ2V0IGl0IG9mIHRoZSBtYWluIGNhbWVyYVxuICAgIGlmIChjYW1lcmFDb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnRcbiAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbWVyYUNvbXBvbmVudHMgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudHNXaXRoVHlwZShcbiAgICAgICAgQ2FtZXJhQ29tcG9uZW50XG4gICAgICApIGFzIENhbWVyYUNvbXBvbmVudFtdO1xuICAgICAgY2FtZXJhQ29tcG9uZW50ID0gY2FtZXJhQ29tcG9uZW50cy5maW5kKChjKSA9PiBjICE9IG51bGwgJiYgYy5faXNBbGl2ZSkhO1xuICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnQgPSBjYW1lcmFDb21wb25lbnQuY29tcG9uZW50U0lEO1xuICAgIH1cbiAgICBpZiAocmVuZGVyUGFzcy5pc1ZyUmVuZGVyaW5nKSB7XG4gICAgICBjb25zdCByblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSO1xuICAgICAgaWYgKHJuWFJNb2R1bGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCB3ZWJ4clN5c3RlbSA9IHJuWFJNb2R1bGUuV2ViWFJTeXN0ZW0uZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgaWYgKHdlYnhyU3lzdGVtLmlzV2ViWFJNb2RlKSB7XG4gICAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gd2VieHJTeXN0ZW0uX2dldENhbWVyYUNvbXBvbmVudEF0KDApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZydXN0dW1DdWxsaW5nXG4gICAgbGV0IHByaW1pdGl2ZXM6IFByaW1pdGl2ZVtdID0gW107XG4gICAgY29uc3QgbWVzaENvbXBvbmVudHMgPSByZW5kZXJQYXNzLl9vcHRpbWl6ZWRNZXNoQ29tcG9uZW50cztcbiAgICBwcmltaXRpdmVzID0gTWVzaFJlbmRlcmVyQ29tcG9uZW50Ll9fY3VsbGluZ1dpdGhWaWV3RnJ1c3R1bShjYW1lcmFDb21wb25lbnQsIG1lc2hDb21wb25lbnRzKTtcblxuICAgIC8vIEFmdGVyIEZydXN0dW0gQ3VsbGluZywgcmVtb3ZlIGR1cGxpY2F0ZWQgUHJpbWl0aXZlc1xuICAgIHByaW1pdGl2ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQocHJpbWl0aXZlcykpO1xuXG4gICAgLy8gU29ydCBieSBzb3J0a2V5XG4gICAgcHJpbWl0aXZlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoaXNCbGVuZChhKSAmJiBpc0JsZW5kKGIpKSB7XG4gICAgICAgIHJldHVybiBhLl92aWV3RGVwdGggLSBiLl92aWV3RGVwdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYS5fc29ydGtleSAtIGIuX3NvcnRrZXk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmltaXRpdmVVaWRzID0gcHJpbWl0aXZlcy5tYXAoKHByaW1pdGl2ZSkgPT4gcHJpbWl0aXZlLnByaW1pdGl2ZVVpZCk7XG4gICAgcHJpbWl0aXZlVWlkcy5wdXNoKC0xKTtcblxuICAgIGxldCBfbGFzdE9wYXF1ZUluZGV4ID0gcHJpbWl0aXZlcy5sZW5ndGggLSAxO1xuICAgIGxldCBfbGFzdFRyYW5zbHVjZW50SW5kZXggPSBwcmltaXRpdmVzLmxlbmd0aCAtIDE7XG4gICAgbGV0IF9sYXN0QmxlbmRJbmRleCA9IHByaW1pdGl2ZXMubGVuZ3RoIC0gMTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpbWl0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJpbWl0aXZlID0gcHJpbWl0aXZlc1tpXTtcbiAgICAgIGNvbnN0IHRyYW5zbHVjZW5jeSA9IGlzVHJhbnNsdWNlbnQocHJpbWl0aXZlKTtcbiAgICAgIGlmICh0cmFuc2x1Y2VuY3kpIHtcbiAgICAgICAgX2xhc3RPcGFxdWVJbmRleCA9IGkgLSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJsZW5kID0gaXNCbGVuZChwcmltaXRpdmUpO1xuICAgICAgaWYgKGJsZW5kKSB7XG4gICAgICAgIF9sYXN0T3BhcXVlSW5kZXggPSBpIC0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IF9sYXN0T3BhcXVlSW5kZXggKyAxOyBpIDwgcHJpbWl0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJpbWl0aXZlID0gcHJpbWl0aXZlc1tpXTtcbiAgICAgIGNvbnN0IHRyYW5zbHVjZW5jeSA9IGlzQmxlbmQocHJpbWl0aXZlKTtcbiAgICAgIGlmICh0cmFuc2x1Y2VuY3kpIHtcbiAgICAgICAgX2xhc3RUcmFuc2x1Y2VudEluZGV4ID0gaSAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZXN1bHRDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKF9sYXN0T3BhcXVlSW5kZXggIT0gcmVuZGVyUGFzcy5fbGFzdE9wYXF1ZUluZGV4KSB7XG4gICAgICByZW5kZXJQYXNzLl9sYXN0T3BhcXVlSW5kZXggPSBfbGFzdE9wYXF1ZUluZGV4O1xuICAgICAgcmVzdWx0Q2hhbmdlZCB8fD0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKF9sYXN0VHJhbnNsdWNlbnRJbmRleCAhPSByZW5kZXJQYXNzLl9sYXN0VHJhbnNsdWNlbnRJbmRleCkge1xuICAgICAgcmVuZGVyUGFzcy5fbGFzdFRyYW5zbHVjZW50SW5kZXggPSBfbGFzdFRyYW5zbHVjZW50SW5kZXg7XG4gICAgICByZXN1bHRDaGFuZ2VkIHx8PSB0cnVlO1xuICAgIH1cbiAgICBpZiAoX2xhc3RCbGVuZEluZGV4ICE9IHJlbmRlclBhc3MuX2xhc3RCbGVuZEluZGV4KSB7XG4gICAgICByZW5kZXJQYXNzLl9sYXN0QmxlbmRJbmRleCA9IF9sYXN0QmxlbmRJbmRleDtcbiAgICAgIHJlc3VsdENoYW5nZWQgfHw9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByaW1pdGl2ZVVpZHMubGVuZ3RoICE9PSByZW5kZXJQYXNzLl9sYXN0UHJpbWl0aXZlVWlkcy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdENoYW5nZWQgfHw9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBvcmRlciBvZiB0aGUgYmxlbmQgcHJpbWl0aXZlcyBoYXMgY2hhbmdlZFxuICAgICAgZm9yIChsZXQgaSA9IF9sYXN0VHJhbnNsdWNlbnRJbmRleCArIDE7IGkgPCBwcmltaXRpdmVVaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwcmltaXRpdmVVaWRzW2ldICE9PSByZW5kZXJQYXNzLl9sYXN0UHJpbWl0aXZlVWlkc1tpXSkge1xuICAgICAgICAgIHJlc3VsdENoYW5nZWQgfHw9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyUGFzcy5faXNDaGFuZ2VkU29ydFJlbmRlclJlc3VsdCA9IHJlc3VsdENoYW5nZWQ7XG5cbiAgICByZW5kZXJQYXNzLl9sYXN0UHJpbWl0aXZlVWlkcyA9IHByaW1pdGl2ZVVpZHM7XG5cbiAgICByZW5kZXJQYXNzLl9sYXN0VHJhbnNmb3JtQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gVHJhbnNmb3JtQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICAgIHJlbmRlclBhc3MuX2xhc3RDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC51cGRhdGVDb3VudDtcbiAgICByZW5kZXJQYXNzLl9sYXN0U2NlbmVHcmFwaENvbXBvbmVudHNVcGRhdGVDb3VudCA9IFNjZW5lR3JhcGhDb21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgcmVuZGVyUGFzcy5fcmVuZGVyZWRTb21ldGhpbmdCZWZvcmUgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHByaW1pdGl2ZVVpZHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2N1bGxpbmdXaXRoVmlld0ZydXN0dW0oXG4gICAgY2FtZXJhQ29tcG9uZW50OiBDYW1lcmFDb21wb25lbnQsXG4gICAgbWVzaENvbXBvbmVudHM6IE1lc2hDb21wb25lbnRbXVxuICApIHtcbiAgICBsZXQgZmlsdGVyZWRNZXNoQ29tcG9uZW50czogTWVzaENvbXBvbmVudFtdID0gW107XG4gICAgaWYgKGNhbWVyYUNvbXBvbmVudCkge1xuICAgICAgY2FtZXJhQ29tcG9uZW50LnVwZGF0ZUZydXN0dW0oKTtcblxuICAgICAgLy8gY29uc3Qgd2hldGhlckNvbnRhaW5zU2tlbGV0YWwgPSAoc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpOiBib29sZWFuID0+IHtcbiAgICAgIC8vICAgY29uc3Qgc2tlbGV0YWxDb21wb25lbnQgPSBzZy5lbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgICAgLy8gICBpZiAoSXMuZXhpc3Qoc2tlbGV0YWxDb21wb25lbnQpKSB7XG4gICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAvLyAgICAgY29uc3QgY2hpbGRyZW4gPSBzZy5jaGlsZHJlbjtcbiAgICAgIC8vICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAvLyAgICAgICByZXR1cm4gd2hldGhlckNvbnRhaW5zU2tlbGV0YWwoY2hpbGQpO1xuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH07XG5cbiAgICAgIGNvbnN0IGZydXN0dW0gPSBjYW1lcmFDb21wb25lbnQuZnJ1c3R1bTtcbiAgICAgIGNvbnN0IGZydXN0dW1DdWxsaW5nID0gKG1lc2hDb21wb25lbnQ6IE1lc2hDb21wb25lbnQsIG91dE1lc2hDb21wb25lbnRzOiBNZXNoQ29tcG9uZW50W10pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICBtZXNoQ29tcG9uZW50LmVudGl0eS5nZXRUYWdWYWx1ZSgndHlwZScpID09PSAnYmFja2dyb3VuZC1hc3NldHMnXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogZnJ1c3R1bS5jdWxsaW5nKG1lc2hDb21wb25lbnQpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgb3V0TWVzaENvbXBvbmVudHMucHVzaChtZXNoQ29tcG9uZW50KTtcbiAgICAgICAgICBtZXNoQ29tcG9uZW50LmVudGl0eS5nZXRTY2VuZUdyYXBoKCkuX2lzQ3VsbGVkID0gZmFsc2U7XG4gICAgICAgICAgY29uc3Qgc2tlbGV0YWwgPSBtZXNoQ29tcG9uZW50LmVudGl0eS50cnlUb0dldFNrZWxldGFsKCk7XG4gICAgICAgICAgaWYgKHNrZWxldGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNrZWxldGFsLl9pc0N1bGxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXNoQ29tcG9uZW50LmVudGl0eS5nZXRTY2VuZUdyYXBoKCkuX2lzQ3VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBza2VsZXRhbCA9IG1lc2hDb21wb25lbnQuZW50aXR5LnRyeVRvR2V0U2tlbGV0YWwoKTtcbiAgICAgICAgICBpZiAoc2tlbGV0YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2tlbGV0YWwuX2lzQ3VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IG1lc2hDb21wb25lbnQgb2YgbWVzaENvbXBvbmVudHMpIHtcbiAgICAgICAgaWYgKG1lc2hDb21wb25lbnQuX2lzQWxpdmUgJiYgbWVzaENvbXBvbmVudC5lbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSkge1xuICAgICAgICAgIGZydXN0dW1DdWxsaW5nKG1lc2hDb21wb25lbnQsIGZpbHRlcmVkTWVzaENvbXBvbmVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbHRlcmVkTWVzaENvbXBvbmVudHMgPSBtZXNoQ29tcG9uZW50cy5maWx0ZXIoXG4gICAgICAgIChtZXNoQ29tcG9uZW50KSA9PiBtZXNoQ29tcG9uZW50Ll9pc0FsaXZlICYmIG1lc2hDb21wb25lbnQuZW50aXR5LmdldFNjZW5lR3JhcGgoKS5pc1Zpc2libGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWl0aXZlczogUHJpbWl0aXZlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkTWVzaENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG1lc2hDb21wb25lbnQgPSBmaWx0ZXJlZE1lc2hDb21wb25lbnRzW2ldO1xuICAgICAgY29uc3Qgdmlld0RlcHRoID0gbWVzaENvbXBvbmVudC5jYWxjVmlld0RlcHRoKGNhbWVyYUNvbXBvbmVudCk7XG4gICAgICBjb25zdCBtZXNoID0gbWVzaENvbXBvbmVudC5tZXNoO1xuICAgICAgaWYgKG1lc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXNoUHJpbWl0aXZlcyA9IG1lc2gucHJpbWl0aXZlcztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtZXNoUHJpbWl0aXZlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IG1lc2hQcmltaXRpdmVzW2pdO1xuICAgICAgICAgIC8vIGlmIChpc1NraXBEcmF3aW5nKHByaW1pdGl2ZS5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAvLyBjb250aW51ZTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgcHJpbWl0aXZlLl92aWV3RGVwdGggPSB2aWV3RGVwdGg7XG4gICAgICAgICAgcHJpbWl0aXZlcy5wdXNoKHByaW1pdGl2ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByaW1pdGl2ZXM7XG4gIH1cblxuICBzdGF0aWMgY29tbW9uXyRwcmVyZW5kZXIoKSB7XG4gICAgaWYgKE1lc2hSZW5kZXJlckNvbXBvbmVudC5fX2NnQXBpUmVuZGVyaW5nU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgLy8gUG9zc2libGUgaWYgdGhlcmUgaXMgbm8gbWVzaCBlbnRpdHkgaW4gdGhlIHNjZW5lXG4gICAgICBjb25zdCBwcm9jZXNzQXBwcm9hY2ggPSBTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoO1xuICAgICAgdGhpcy5jb21tb25fJGxvYWQoeyBwcm9jZXNzQXBwcm9hY2ggfSk7XG4gICAgfVxuICAgIC8vIENhbGwgY29tbW9uXyRwcmVyZW5kZXIgb2YgV2ViR0xSZW5kZXJpbmdTdHJhdGVneVxuICAgIE1lc2hSZW5kZXJlckNvbXBvbmVudC5fX2NnQXBpUmVuZGVyaW5nU3RyYXRlZ3khLnByZXJlbmRlcigpO1xuICB9XG5cbiAgc3RhdGljIGNvbW1vbl8kcmVuZGVyKHtcbiAgICByZW5kZXJQYXNzLFxuICAgIHByb2Nlc3NTdGFnZSxcbiAgICByZW5kZXJQYXNzVGlja0NvdW50LFxuICAgIHByaW1pdGl2ZVVpZHMsXG4gIH06IHtcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzO1xuICAgIHByb2Nlc3NTdGFnZTogUHJvY2Vzc1N0YWdlRW51bTtcbiAgICByZW5kZXJQYXNzVGlja0NvdW50OiBDb3VudDtcbiAgICBwcmltaXRpdmVVaWRzOiBQcmltaXRpdmVVSURbXTtcbiAgfSk6IGJvb2xlYW4ge1xuICAgIC8vIENhbGwgY29tbW9uXyRyZW5kZXIgb2YgV2ViR0xSZW5kZXJpbmdTdHJhdGVneVxuICAgIHJldHVybiBNZXNoUmVuZGVyZXJDb21wb25lbnQuX19jZ0FwaVJlbmRlcmluZ1N0cmF0ZWd5IS5jb21tb25fJHJlbmRlcihcbiAgICAgIHByaW1pdGl2ZVVpZHMsXG4gICAgICByZW5kZXJQYXNzLFxuICAgICAgcmVuZGVyUGFzc1RpY2tDb3VudFxuICAgICk7XG4gIH1cblxuICAkcmVuZGVyKHtcbiAgICBpLFxuICAgIHJlbmRlclBhc3MsXG4gICAgcmVuZGVyUGFzc1RpY2tDb3VudCxcbiAgfToge1xuICAgIGk6IEluZGV4O1xuICAgIHJlbmRlclBhc3M6IFJlbmRlclBhc3M7XG4gICAgcmVuZGVyUGFzc1RpY2tDb3VudDogQ291bnQ7XG4gIH0pIHt9XG5cbiAgX3NoYWxsb3dDb3B5RnJvbShjb21wb25lbnRfOiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRfIGFzIE1lc2hSZW5kZXJlckNvbXBvbmVudDtcblxuICAgIHRoaXMuX19kaWZmdXNlQ3ViZU1hcCA9IGNvbXBvbmVudC5fX2RpZmZ1c2VDdWJlTWFwO1xuICAgIHRoaXMuX19zcGVjdWxhckN1YmVNYXAgPSBjb21wb25lbnQuX19zcGVjdWxhckN1YmVNYXA7XG4gICAgdGhpcy5kaWZmdXNlQ3ViZU1hcENvbnRyaWJ1dGlvbiA9IGNvbXBvbmVudC5kaWZmdXNlQ3ViZU1hcENvbnRyaWJ1dGlvbjtcbiAgICB0aGlzLnNwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbiA9IGNvbXBvbmVudC5zcGVjdWxhckN1YmVNYXBDb250cmlidXRpb247XG4gICAgdGhpcy5yb3RhdGlvbk9mQ3ViZU1hcCA9IGNvbXBvbmVudC5yb3RhdGlvbk9mQ3ViZU1hcDtcbiAgfVxuXG4gIF9kZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLl9kZXN0cm95KCk7XG4gICAgdGhpcy5fX2RpZmZ1c2VDdWJlTWFwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX19zcGVjdWxhckN1YmVNYXAgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApIHtcbiAgICBjbGFzcyBNZXNoUmVuZGVyZXJFbnRpdHkgZXh0ZW5kcyAoYmFzZS5jb25zdHJ1Y3RvciBhcyBhbnkpIHtcbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbnRpdHlVSUQ6IEVudGl0eVVJRCxcbiAgICAgICAgaXNBbGl2ZTogYm9vbGVhbixcbiAgICAgICAgY29tcG9uZW50cz86IE1hcDxDb21wb25lbnRUSUQsIENvbXBvbmVudD5cbiAgICAgICkge1xuICAgICAgICBzdXBlcihlbnRpdHlVSUQsIGlzQWxpdmUsIGNvbXBvbmVudHMpO1xuICAgICAgfVxuXG4gICAgICBnZXRNZXNoUmVuZGVyZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTWVzaFJlbmRlcmVyQ29tcG9uZW50VElEXG4gICAgICAgICkgYXMgTWVzaFJlbmRlcmVyQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBhcHBseU1peGlucyhiYXNlLCBNZXNoUmVuZGVyZXJFbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IElNZXNoRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlR3JvdXBFbnRpdHkgfSBmcm9tICcuLi9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lc2hFbnRpdHkoKTogSU1lc2hFbnRpdHkge1xuICBjb25zdCBlbnRpdHkgPSBjcmVhdGVHcm91cEVudGl0eSgpO1xuICBjb25zdCBlbnRpdHlBZGRlZENvbXBvbmVudCA9IEVudGl0eVJlcG9zaXRvcnkudHJ5VG9BZGRDb21wb25lbnRUb0VudGl0eUJ5VElEKFxuICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTWVzaENvbXBvbmVudFRJRCxcbiAgICBlbnRpdHlcbiAgKTtcbiAgY29uc3QgZW50aXR5QWRkZWRDb21wb25lbnQyID0gRW50aXR5UmVwb3NpdG9yeS50cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5NZXNoUmVuZGVyZXJDb21wb25lbnRUSUQsXG4gICAgZW50aXR5QWRkZWRDb21wb25lbnRcbiAgKSBhcyBJTWVzaEVudGl0eTtcbiAgcmV0dXJuIGVudGl0eUFkZGVkQ29tcG9uZW50Mjtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vSU1lc2hSZW5kZXJlckVudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL01lc2hSZW5kZXJlckNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZU1lc2hFbnRpdHknO1xuIiwiaW1wb3J0IHsgRW50aXR5VUlEIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWl4aW5CYXNlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvVHlwZUdlbmVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgUGh5c2ljc0NvbXBvbmVudCB9IGZyb20gJy4vUGh5c2ljc0NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBoeXNpY3NFbnRpdHlNZXRob2RzIHtcbiAgZ2V0UGh5c2ljcygpOiBQaHlzaWNzQ29tcG9uZW50O1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMsIEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgQ29tcG9uZW50U0lELCBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBQaHlzaWNzU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9waHlzaWNzL1BoeXNpY3NTdHJhdGVneSc7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzIH0gZnJvbSAnLi4vQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgT2ltb1BoeXNpY3NTdHJhdGVneSB9IGZyb20gJy4uLy4uL3BoeXNpY3MvT2ltby9PaW1vUGh5c2ljc1N0cmF0ZWd5JztcbmltcG9ydCB7IElQaHlzaWNzRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlR3JvdXBFbnRpdHkgfSBmcm9tICcuLi9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcblxuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIF9fc3RyYXRlZ3k/OiBQaHlzaWNzU3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgY29tcG9uZW50U2lkOiBDb21wb25lbnRTSUQsXG4gICAgZW50aXR5Q29tcG9uZW50OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5VWlkLCBjb21wb25lbnRTaWQsIGVudGl0eUNvbXBvbmVudCwgaXNSZVVzZSk7XG5cbiAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5Mb2dpYyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLlBoeXNpY3NDb21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuUGh5c2ljc0NvbXBvbmVudFRJRDtcbiAgfVxuXG4gIHNldFN0cmF0ZWd5KHN0cmF0ZWd5OiBQaHlzaWNzU3RyYXRlZ3kpIHtcbiAgICB0aGlzLl9fc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgfVxuXG4gIGdldCBzdHJhdGVneSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3N0cmF0ZWd5O1xuICB9XG5cbiAgc3RhdGljIGNvbW1vbl8kbG9naWMoKSB7XG4gICAgT2ltb1BoeXNpY3NTdHJhdGVneS51cGRhdGUoKTtcbiAgfVxuXG4gICRsb2dpYygpIHtcbiAgICB0aGlzLl9fc3RyYXRlZ3k/LnVwZGF0ZSgpO1xuICB9XG5cbiAgX2Rlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIuX2Rlc3Ryb3koKTtcbiAgICB0aGlzLl9fc3RyYXRlZ3kgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApIHtcbiAgICBjbGFzcyBQaHlzaWNzRW50aXR5IGV4dGVuZHMgKGJhc2UuY29uc3RydWN0b3IgYXMgYW55KSB7XG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50aXR5VUlEOiBFbnRpdHlVSUQsXG4gICAgICAgIGlzQWxpdmU6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBvbmVudHM/OiBNYXA8Q29tcG9uZW50VElELCBDb21wb25lbnQ+XG4gICAgICApIHtcbiAgICAgICAgc3VwZXIoZW50aXR5VUlELCBpc0FsaXZlLCBjb21wb25lbnRzKTtcbiAgICAgIH1cblxuICAgICAgZ2V0UGh5c2ljcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5QaHlzaWNzQ29tcG9uZW50VElEXG4gICAgICAgICkgYXMgUGh5c2ljc0NvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlNaXhpbnMoYmFzZSwgUGh5c2ljc0VudGl0eSk7XG4gICAgcmV0dXJuIGJhc2UgYXMgdW5rbm93biBhcyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8U29tZUNvbXBvbmVudENsYXNzPiAmIEVudGl0eUJhc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBoeXNpY3NFbnRpdHkgfSBmcm9tICcuLi8uLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBjcmVhdGVHcm91cEVudGl0eSB9IGZyb20gJy4uL1NjZW5lR3JhcGgvY3JlYXRlR3JvdXBFbnRpdHknO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGh5c2ljc0VudGl0eSgpOiBJUGh5c2ljc0VudGl0eSB7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZUdyb3VwRW50aXR5KCk7XG4gIGNvbnN0IGVudGl0eUFkZGVkQ29tcG9uZW50ID0gRW50aXR5UmVwb3NpdG9yeS50cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5QaHlzaWNzQ29tcG9uZW50VElELFxuICAgIGVudGl0eVxuICApIGFzIElQaHlzaWNzRW50aXR5O1xuICByZXR1cm4gZW50aXR5QWRkZWRDb21wb25lbnQ7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0lQaHlzaWNzRW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vUGh5c2ljc0NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZVBoeXNpY3NFbnRpdHknO1xuIiwiaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4vU2NlbmVHcmFwaENvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWF0cml4NDQgfSBmcm9tICcuLi8uLi9tYXRoL0lNYXRyaXgnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgSVF1YXRlcm5pb24gfSBmcm9tICcuLi8uLi9tYXRoL0lRdWF0ZXJuaW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBJU2NlbmVHcmFwaEVudGl0eU1ldGhvZHMge1xuICBnZXRTY2VuZUdyYXBoKCk6IFNjZW5lR3JhcGhDb21wb25lbnQ7XG4gIHBhcmVudD86IFNjZW5lR3JhcGhDb21wb25lbnQ7XG4gIG1hdHJpeDogSU1hdHJpeDQ0O1xuICBtYXRyaXhJbm5lcjogSU1hdHJpeDQ0O1xuICBwb3NpdGlvbjogSVZlY3RvcjM7XG4gIHBvc2l0aW9uUmVzdDogSVZlY3RvcjM7XG4gIHNjYWxlOiBJVmVjdG9yMztcbiAgZXVsZXJBbmdsZXM6IElWZWN0b3IzO1xuICByb3RhdGlvbjogSVF1YXRlcm5pb247XG4gIHJvdGF0aW9uUmVzdDogSVF1YXRlcm5pb247XG5cbiAgYWRkQ2hpbGQoc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpOiB2b2lkO1xuICBjaGlsZHJlbjogU2NlbmVHcmFwaENvbXBvbmVudFtdO1xuICByZW1vdmVDaGlsZChzZzogU2NlbmVHcmFwaENvbXBvbmVudCk6IHZvaWQ7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NDQnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMsIEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgQnVmZmVyVXNlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQnVmZmVyVXNlJztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NTdGFnZSc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MzMgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IEFBQkIgfSBmcm9tICcuLi8uLi9tYXRoL0FBQkInO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuLi9NZXNoL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50VElELCBDb21wb25lbnRTSUQsIEVudGl0eVVJRCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBBQUJCR2l6bW8gfSBmcm9tICcuLi8uLi9naXptb3MvQUFCQkdpem1vJztcbmltcG9ydCB7IExvY2F0b3JHaXptbyB9IGZyb20gJy4uLy4uL2dpem1vcy9Mb2NhdG9yR2l6bW8nO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi8uLi9taXNjL0lzJztcbmltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5LCBJTWVzaEVudGl0eSwgSVRyYW5zZm9ybUVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9Db21wb25lbnRUeXBlcyc7XG5pbXBvcnQgeyBSYXljYXN0UmVzdWx0RXgyIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvdHlwZXMvR2VvbWV0cnlUeXBlcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbkdpem1vIH0gZnJvbSAnLi4vLi4vZ2l6bW9zL1RyYW5zbGF0aW9uR2l6bW8nO1xuaW1wb3J0IHsgU2NhbGVHaXptbyB9IGZyb20gJy4uLy4uL2dpem1vcy9TY2FsZUdpem1vJztcbmltcG9ydCB7IElNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvSU1hdHJpeCc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiwgSVZlY3RvcjMsIE11dGFibGVTY2FsYXIsIFF1YXRlcm5pb24gfSBmcm9tICcuLi8uLi9tYXRoJztcbmltcG9ydCB7IE9pbW9QaHlzaWNzU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9waHlzaWNzL09pbW8vT2ltb1BoeXNpY3NTdHJhdGVneSc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9UcmFuc2Zvcm0vVHJhbnNmb3JtQ29tcG9uZW50JztcbmltcG9ydCB7IGZsYXR0ZW5IaWVyYXJjaHkgfSBmcm9tICcuL1NjZW5lR3JhcGhPcHMnO1xuXG5leHBvcnQgY2xhc3MgU2NlbmVHcmFwaENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgX19wYXJlbnQ/OiBTY2VuZUdyYXBoQ29tcG9uZW50O1xuICBwcml2YXRlIF9fY2hpbGRyZW46IFNjZW5lR3JhcGhDb21wb25lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9fZ2l6bW9DaGlsZHJlbjogU2NlbmVHcmFwaENvbXBvbmVudFtdID0gW107XG4gIHByaXZhdGUgX3dvcmxkTWF0cml4OiBNdXRhYmxlTWF0cml4NDQgPSBNdXRhYmxlTWF0cml4NDQuZHVtbXkoKTtcbiAgcHJpdmF0ZSBfd29ybGRNYXRyaXhSZXN0OiBNdXRhYmxlTWF0cml4NDQgPSBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBfbm9ybWFsTWF0cml4OiBNdXRhYmxlTWF0cml4MzMgPSBNdXRhYmxlTWF0cml4MzMuZHVtbXkoKTtcbiAgcHJpdmF0ZSBfX2lzV29ybGRNYXRyaXhVcFRvRGF0ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9faXNXb3JsZE1hdHJpeFJlc3RVcFRvRGF0ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9faXNOb3JtYWxNYXRyaXhVcFRvRGF0ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9fdG1wTWF0cml4ID0gTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gIHByaXZhdGUgX193b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWwgPSBuZXcgQUFCQigpO1xuICBwcml2YXRlIF9fd29ybGRNZXJnZWRBQUJCID0gbmV3IEFBQkIoKTtcbiAgcHJpdmF0ZSBfX2lzV29ybGRBQUJCRGlydHkgPSB0cnVlO1xuICBwcml2YXRlIF9pc1Zpc2libGU6IE11dGFibGVTY2FsYXIgPSBNdXRhYmxlU2NhbGFyLmR1bW15KCk7XG4gIHByaXZhdGUgX2lzQmlsbGJvYXJkOiBNdXRhYmxlU2NhbGFyID0gTXV0YWJsZVNjYWxhci5kdW1teSgpO1xuICBwcml2YXRlIF9fYWFiYkdpem1vPzogQUFCQkdpem1vO1xuICBwcml2YXRlIF9fbG9jYXRvckdpem1vPzogTG9jYXRvckdpem1vO1xuICBwcml2YXRlIF9fdHJhbnNsYXRpb25HaXptbz86IFRyYW5zbGF0aW9uR2l6bW87XG4gIHByaXZhdGUgX19zY2FsZUdpem1vPzogU2NhbGVHaXptbztcbiAgcHJpdmF0ZSBfX3RyYW5zZm9ybUdpem1vU3BhY2U6ICdsb2NhbCcgfCAnd29ybGQnID0gJ3dvcmxkJztcbiAgcHJpdmF0ZSBfX2xhdGVzdFByaW1pdGl2ZVBvc2l0aW9uQWNjZXNzb3JWZXJzaW9uID0gMDtcbiAgcHVibGljIHRvTWFrZVdvcmxkTWF0cml4VGhlU2FtZUFzTG9jYWxNYXRyaXggPSBmYWxzZTtcbiAgLy8gU2tlbGV0YWxcbiAgcHVibGljIGlzUm9vdEpvaW50ID0gZmFsc2U7XG4gIHB1YmxpYyBqb2ludEluZGV4ID0gLTE7XG4gIF9pc0N1bGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfX29yaWdpblZlY3RvcjMgPSBWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmV0dXJuVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19zY2VuZUdyYXBoczogV2Vha1JlZjxTY2VuZUdyYXBoQ29tcG9uZW50PltdID0gW107XG4gIHByaXZhdGUgc3RhdGljIGlzSm9pbnRBQUJCU2hvdWxkQmVDYWxjdWxhdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIGludmVydGVkTWF0cml4NDQgPSBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHlBcnJheTE2Q29sdW1uTWFqb3IoW1xuICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4gIF0pO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX21hdDQgPSBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3VwZGF0ZUNvdW50ID0gLTE7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBBQUJCID0gbmV3IEFBQkIoKTtcblxuICBwcml2YXRlIF9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0eVVpZDogRW50aXR5VUlELFxuICAgIGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lELFxuICAgIGVudGl0eVJlcG9zaXRvcnk6IEVudGl0eVJlcG9zaXRvcnksXG4gICAgaXNSZVVzZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihlbnRpdHlVaWQsIGNvbXBvbmVudFNpZCwgZW50aXR5UmVwb3NpdG9yeSwgaXNSZVVzZSk7XG5cbiAgICBTY2VuZUdyYXBoQ29tcG9uZW50Ll9fc2NlbmVHcmFwaHMucHVzaChuZXcgV2Vha1JlZih0aGlzKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkdQVUluc3RhbmNlRGF0YSxcbiAgICAgICd3b3JsZE1hdHJpeCcsXG4gICAgICBNdXRhYmxlTWF0cml4NDQsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDFdXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkdQVUluc3RhbmNlRGF0YSxcbiAgICAgICdub3JtYWxNYXRyaXgnLFxuICAgICAgTXV0YWJsZU1hdHJpeDMzLFxuICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3Rlck1lbWJlcihcbiAgICAgIEJ1ZmZlclVzZS5HUFVJbnN0YW5jZURhdGEsXG4gICAgICAnaXNWaXNpYmxlJyxcbiAgICAgIE11dGFibGVTY2FsYXIsXG4gICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgWzFdXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWVtYmVyKFxuICAgICAgQnVmZmVyVXNlLkdQVUluc3RhbmNlRGF0YSxcbiAgICAgICdpc0JpbGxib2FyZCcsXG4gICAgICBNdXRhYmxlU2NhbGFyLFxuICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIFswXVxuICAgICk7XG5cbiAgICB0aGlzLnN1Ym1pdFRvQWxsb2NhdGlvbih0aGlzLm1heE51bWJlck9mQ29tcG9uZW50LCBpc1JlVXNlKTtcbiAgfVxuXG4gIHNldCBpc1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNWaXNpYmxlLnNldFZhbHVlKGZsZyA/IDEgOiAwKTtcbiAgICBTY2VuZUdyYXBoQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZS5nZXRWYWx1ZSgpID09PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGdldCB1cGRhdGVDb3VudCgpIHtcbiAgICByZXR1cm4gU2NlbmVHcmFwaENvbXBvbmVudC5fX3VwZGF0ZUNvdW50O1xuICB9XG5cbiAgc2V0VmlzaWJpbGl0eVJlY3Vyc2l2ZWx5KGZsYWc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZsYWc7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLl9fY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnNldFZpc2liaWxpdHlSZWN1cnNpdmVseShmbGFnKTtcbiAgICB9XG4gIH1cblxuICBzZXQgaXNCaWxsYm9hcmQoZmxnOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNCaWxsYm9hcmQuc2V0VmFsdWUoZmxnID8gMSA6IDApO1xuICB9XG5cbiAgZ2V0IGlzQmlsbGJvYXJkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0JpbGxib2FyZC5nZXRWYWx1ZSgpID09PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgc2V0SXNCaWxsYm9hcmRSZWN1cnNpdmVseShmbGc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0JpbGxib2FyZC5zZXRWYWx1ZShmbGcgPyAxIDogMCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLl9fY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLmlzQmlsbGJvYXJkID0gZmxnO1xuICAgIH1cbiAgfVxuXG4gIHNldCBpc0FBQkJHaXptb1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgaWYgKGZsZykge1xuICAgICAgaWYgKElzLm5vdC5kZWZpbmVkKHRoaXMuX19hYWJiR2l6bW8pKSB7XG4gICAgICAgIHRoaXMuX19hYWJiR2l6bW8gPSBuZXcgQUFCQkdpem1vKHRoaXMuZW50aXR5KTtcbiAgICAgICAgdGhpcy5fX2FhYmJHaXptby5fc2V0dXAoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19hYWJiR2l6bW8uaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKElzLmV4aXN0KHRoaXMuX19hYWJiR2l6bW8pKSB7XG4gICAgICAgIHRoaXMuX19hYWJiR2l6bW8uaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzQUFCQkdpem1vVmlzaWJsZSgpIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2FhYmJHaXptbykpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fYWFiYkdpem1vLmlzVmlzaWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNldCBpc0xvY2F0b3JHaXptb1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgaWYgKGZsZykge1xuICAgICAgaWYgKElzLm5vdC5kZWZpbmVkKHRoaXMuX19sb2NhdG9yR2l6bW8pKSB7XG4gICAgICAgIHRoaXMuX19sb2NhdG9yR2l6bW8gPSBuZXcgTG9jYXRvckdpem1vKHRoaXMuZW50aXR5IGFzIElNZXNoRW50aXR5KTtcbiAgICAgICAgdGhpcy5fX2xvY2F0b3JHaXptby5fc2V0dXAoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19sb2NhdG9yR2l6bW8uaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKElzLmV4aXN0KHRoaXMuX19sb2NhdG9yR2l6bW8pKSB7XG4gICAgICAgIHRoaXMuX19sb2NhdG9yR2l6bW8uaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzTG9jYXRvckdpem1vVmlzaWJsZSgpIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2xvY2F0b3JHaXptbykpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fbG9jYXRvckdpem1vLmlzVmlzaWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNldCBpc1RyYW5zbGF0aW9uR2l6bW9WaXNpYmxlKGZsZzogYm9vbGVhbikge1xuICAgIGlmIChmbGcpIHtcbiAgICAgIGlmIChJcy5ub3QuZGVmaW5lZCh0aGlzLl9fdHJhbnNsYXRpb25HaXptbykpIHtcbiAgICAgICAgdGhpcy5fX3RyYW5zbGF0aW9uR2l6bW8gPSBuZXcgVHJhbnNsYXRpb25HaXptbyh0aGlzLmVudGl0eSBhcyBJTWVzaEVudGl0eSk7XG4gICAgICAgIHRoaXMuX190cmFuc2xhdGlvbkdpem1vLl9zZXR1cCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX3RyYW5zbGF0aW9uR2l6bW8uaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKElzLmV4aXN0KHRoaXMuX190cmFuc2xhdGlvbkdpem1vKSkge1xuICAgICAgICB0aGlzLl9fdHJhbnNsYXRpb25HaXptby5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXNUcmFuc2xhdGlvbkdpem1vVmlzaWJsZSgpIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3RyYW5zbGF0aW9uR2l6bW8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3RyYW5zbGF0aW9uR2l6bW8uaXNWaXNpYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2V0IGlzU2NhbGVHaXptb1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgaWYgKGZsZykge1xuICAgICAgaWYgKElzLm5vdC5kZWZpbmVkKHRoaXMuX19zY2FsZUdpem1vKSkge1xuICAgICAgICB0aGlzLl9fc2NhbGVHaXptbyA9IG5ldyBTY2FsZUdpem1vKHRoaXMuZW50aXR5IGFzIElNZXNoRW50aXR5KTtcbiAgICAgICAgdGhpcy5fX3NjYWxlR2l6bW8uX3NldHVwKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fc2NhbGVHaXptby5pc1Zpc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3NjYWxlR2l6bW8pKSB7XG4gICAgICAgIHRoaXMuX19zY2FsZUdpem1vLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBpc1NjYWxlR2l6bW9WaXNpYmxlKCkge1xuICAgIGlmIChJcy5leGlzdCh0aGlzLl9fc2NhbGVHaXptbykpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fc2NhbGVHaXptby5pc1Zpc2libGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0VG9wTGV2ZWxDb21wb25lbnRzKCk6IFNjZW5lR3JhcGhDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIFNjZW5lR3JhcGhDb21wb25lbnQuX19zY2VuZUdyYXBoc1xuICAgICAgLm1hcCgoc2dSZWYpID0+IHNnUmVmLmRlcmVmKCkpXG4gICAgICAuZmlsdGVyKChzZzogU2NlbmVHcmFwaENvbXBvbmVudCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBpZiAoc2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBzZy5pc1RvcExldmVsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHNnKSA9PiBzZyAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIGlzSm9pbnQoKSB7XG4gICAgaWYgKHRoaXMuam9pbnRJbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2NlbmVHcmFwaENvbXBvbmVudFRJRDtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5TY2VuZUdyYXBoQ29tcG9uZW50VElEO1xuICB9XG5cbiAgc2V0V29ybGRNYXRyaXhSZXN0RGlydHkoKSB7XG4gICAgdGhpcy5tYXRyaXhSZXN0SW5uZXI7XG4gICAgdGhpcy5zZXRXb3JsZE1hdHJpeFJlc3REaXJ0eVJlY3Vyc2l2ZWx5KCk7XG4gIH1cblxuICBzZXRXb3JsZE1hdHJpeFJlc3REaXJ0eVJlY3Vyc2l2ZWx5KCkge1xuICAgIHRoaXMuX19pc1dvcmxkTWF0cml4UmVzdFVwVG9EYXRlID0gZmFsc2U7XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgY2hpbGQuc2V0V29ybGRNYXRyaXhSZXN0RGlydHlSZWN1cnNpdmVseSgpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0V29ybGRNYXRyaXhEaXJ0eSgpIHtcbiAgICB0aGlzLnNldFdvcmxkTWF0cml4RGlydHlSZWN1cnNpdmVseSgpO1xuICAgIHRoaXMucGFyZW50Py5zZXRXb3JsZEFBQkJEaXJ0eVBhcmVudFJlY3Vyc2l2ZWx5KCk7XG4gIH1cblxuICBzZXRXb3JsZE1hdHJpeERpcnR5UmVjdXJzaXZlbHkoKSB7XG4gICAgdGhpcy5fX2lzV29ybGRNYXRyaXhVcFRvRGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX19pc05vcm1hbE1hdHJpeFVwVG9EYXRlID0gZmFsc2U7XG4gICAgdGhpcy5fX2lzV29ybGRBQUJCRGlydHkgPSB0cnVlO1xuXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgY2hpbGQuc2V0V29ybGRNYXRyaXhEaXJ0eVJlY3Vyc2l2ZWx5KCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRXb3JsZEFBQkJEaXJ0eVBhcmVudFJlY3Vyc2l2ZWx5KCkge1xuICAgIHRoaXMuX19pc1dvcmxkQUFCQkRpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLnBhcmVudD8uc2V0V29ybGRBQUJCRGlydHlQYXJlbnRSZWN1cnNpdmVseSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBhIFNjZW5lR3JhcGggY29tcG9uZW50IGFzIGEgY2hpbGQgb2YgdGhpc1xuICAgKiBAcGFyYW0gc2cgYSBTY2VuZUdyYXBoIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIGFkZENoaWxkKHNnOiBTY2VuZUdyYXBoQ29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKElzLmV4aXN0KHNnLl9fcGFyZW50KSkge1xuICAgICAgc2cuX19wYXJlbnQucmVtb3ZlQ2hpbGQoc2cpO1xuICAgIH1cbiAgICBzZy5fX3BhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5fX2NoaWxkcmVuLnB1c2goc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgY2hpbGQgU2NlbmVHcmFwaCBjb21wb25lbnQgZnJvbSB0aGlzXG4gICAqIEBwYXJhbSBzZyBhIFNjZW5lR3JhcGggY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQ2hpbGQoc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX19jaGlsZHJlbi5pbmRleE9mKHNnKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5fX2NoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHNnLl9fcGFyZW50ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBhIFNjZW5lR3JhcGggY29tcG9uZW50IGFzIGEgY2hpbGQgb2YgdGhpcyAoQnV0IEdpem1vIG9ubHkpXG4gICAqIEBwYXJhbSBzZyBhIFNjZW5lR3JhcGggY29tcG9uZW50IG9mIEdpem1vXG4gICAqL1xuICBfYWRkR2l6bW9DaGlsZChzZzogU2NlbmVHcmFwaENvbXBvbmVudCk6IHZvaWQge1xuICAgIHNnLl9fcGFyZW50ID0gdGhpcztcbiAgICB0aGlzLl9fZ2l6bW9DaGlsZHJlbi5wdXNoKHNnKTtcbiAgfVxuXG4gIGdldCBpc1RvcExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLl9fcGFyZW50ID09IG51bGw7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19jaGlsZHJlbjtcbiAgfVxuXG4gIGdldCBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wYXJlbnQ7XG4gIH1cblxuICBnZXQgbWF0cml4SW5uZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9faXNXb3JsZE1hdHJpeFVwVG9EYXRlKSB7XG4gICAgICB0aGlzLl93b3JsZE1hdHJpeC5jb3B5Q29tcG9uZW50cyh0aGlzLl9fY2FsY1dvcmxkTWF0cml4UmVjdXJzaXZlbHkoKSk7XG4gICAgICB0aGlzLl9faXNXb3JsZE1hdHJpeFVwVG9EYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ybGRNYXRyaXg7XG4gIH1cblxuICBnZXQgbWF0cml4KCkge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeElubmVyLmNsb25lKCk7XG4gIH1cblxuICBnZXQgbWF0cml4UmVzdElubmVyKCkge1xuICAgIGlmICghdGhpcy5fX2lzV29ybGRNYXRyaXhSZXN0VXBUb0RhdGUpIHtcbiAgICAgIHRoaXMuX3dvcmxkTWF0cml4UmVzdC5jb3B5Q29tcG9uZW50cyh0aGlzLl9fY2FsY1dvcmxkTWF0cml4UmVzdFJlY3Vyc2l2ZWx5KCkpO1xuICAgICAgdGhpcy5fX2lzV29ybGRNYXRyaXhSZXN0VXBUb0RhdGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JsZE1hdHJpeFJlc3Q7XG4gIH1cblxuICBnZXQgbWF0cml4UmVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhSZXN0SW5uZXIuY2xvbmUoKTtcbiAgfVxuXG4gIGdldCBub3JtYWxNYXRyaXhJbm5lcigpIHtcbiAgICBpZiAoIXRoaXMuX19pc05vcm1hbE1hdHJpeFVwVG9EYXRlKSB7XG4gICAgICBNYXRyaXg0NC5pbnZlcnRUbyh0aGlzLm1hdHJpeElubmVyLCBTY2VuZUdyYXBoQ29tcG9uZW50LmludmVydGVkTWF0cml4NDQpO1xuICAgICAgdGhpcy5fbm9ybWFsTWF0cml4LmNvcHlDb21wb25lbnRzKFNjZW5lR3JhcGhDb21wb25lbnQuaW52ZXJ0ZWRNYXRyaXg0NC50cmFuc3Bvc2UoKSk7XG4gICAgICB0aGlzLl9faXNOb3JtYWxNYXRyaXhVcFRvRGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ub3JtYWxNYXRyaXg7XG4gIH1cblxuICBnZXQgZW50aXR5V29ybGRXaXRoU2tlbGV0YWxNYXRyaXgoKTogTXV0YWJsZU1hdHJpeDQ0IHtcbiAgICByZXR1cm4gdGhpcy5lbnRpdHlXb3JsZE1hdHJpeFdpdGhTa2VsZXRhbElubmVyLmNsb25lKCk7XG4gIH1cblxuICBnZXQgZW50aXR5V29ybGRNYXRyaXhXaXRoU2tlbGV0YWxJbm5lcigpOiBNdXRhYmxlTWF0cml4NDQge1xuICAgIGNvbnN0IHNrZWxldGFsQ29tcG9uZW50ID0gdGhpcy5lbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgIGlmIChJcy5leGlzdChza2VsZXRhbENvbXBvbmVudCkgJiYgc2tlbGV0YWxDb21wb25lbnQuaXNXb3JsZE1hdHJpeFVwZGF0ZWQpIHtcbiAgICAgIHJldHVybiBza2VsZXRhbENvbXBvbmVudC53b3JsZE1hdHJpeElubmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzY2VuZUdyYXBoQ29tcG9uZW50ID0gdGhpcy5lbnRpdHkuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgcmV0dXJuIHNjZW5lR3JhcGhDb21wb25lbnQubWF0cml4SW5uZXI7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG5vcm1hbE1hdHJpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxNYXRyaXhJbm5lci5jbG9uZSgpO1xuICB9XG5cbiAgaXNXb3JsZE1hdHJpeFVwVG9EYXRlUmVjdXJzaXZlbHkoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX19pc1dvcmxkTWF0cml4VXBUb0RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9fcGFyZW50KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX19wYXJlbnQuaXNXb3JsZE1hdHJpeFVwVG9EYXRlUmVjdXJzaXZlbHkoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9fY2FsY1dvcmxkTWF0cml4UmVjdXJzaXZlbHkoKTogTXV0YWJsZU1hdHJpeDQ0IHtcbiAgICBpZiAodGhpcy5fX2lzV29ybGRNYXRyaXhVcFRvRGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dvcmxkTWF0cml4O1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuZ2V0RW50aXR5KHRoaXMuX19lbnRpdHlVaWQpIGFzIElUcmFuc2Zvcm1FbnRpdHk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gZW50aXR5LmdldFRyYW5zZm9ybSgpITtcblxuICAgIGlmICh0aGlzLl9fcGFyZW50ID09IG51bGwgfHwgdGhpcy50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4KSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtLmxvY2FsTWF0cml4SW5uZXI7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0cml4RnJvbUFuY2VzdG9yVG9QYXJlbnQgPSB0aGlzLl9fcGFyZW50Ll9fY2FsY1dvcmxkTWF0cml4UmVjdXJzaXZlbHkoKTtcbiAgICByZXR1cm4gTXV0YWJsZU1hdHJpeDQ0Lm11bHRpcGx5VG8oXG4gICAgICBtYXRyaXhGcm9tQW5jZXN0b3JUb1BhcmVudCxcbiAgICAgIHRyYW5zZm9ybS5sb2NhbE1hdHJpeElubmVyLFxuICAgICAgdGhpcy5fX3RtcE1hdHJpeFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fY2FsY1dvcmxkTWF0cml4UmVzdFJlY3Vyc2l2ZWx5KCk6IE11dGFibGVNYXRyaXg0NCB7XG4gICAgaWYgKHRoaXMuX19pc1dvcmxkTWF0cml4UmVzdFVwVG9EYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd29ybGRNYXRyaXhSZXN0O1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuZ2V0RW50aXR5KHRoaXMuX19lbnRpdHlVaWQpIGFzIElUcmFuc2Zvcm1FbnRpdHk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gZW50aXR5LmdldFRyYW5zZm9ybSgpITtcblxuICAgIGlmICh0aGlzLl9fcGFyZW50ID09IG51bGwgfHwgdGhpcy50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4KSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtLmxvY2FsTWF0cml4UmVzdElubmVyO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdHJpeEZyb21BbmNlc3RvclRvUGFyZW50ID0gdGhpcy5fX3BhcmVudC5fX2NhbGNXb3JsZE1hdHJpeFJlc3RSZWN1cnNpdmVseSgpO1xuICAgIHJldHVybiBNdXRhYmxlTWF0cml4NDQubXVsdGlwbHlUbyhcbiAgICAgIG1hdHJpeEZyb21BbmNlc3RvclRvUGFyZW50LFxuICAgICAgdHJhbnNmb3JtLmxvY2FsTWF0cml4UmVzdElubmVyLFxuICAgICAgdGhpcy5fX3RtcE1hdHJpeFxuICAgICk7XG4gIH1cblxuICBnZXRRdWF0ZXJuaW9uUmVjdXJzaXZlbHkoKTogSVF1YXRlcm5pb24ge1xuICAgIGlmIChJcy5ub3QuZXhpc3QodGhpcy5wYXJlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRyaXhGcm9tQW5jZXN0b3JUb1BhcmVudCA9IHRoaXMucGFyZW50LmdldFF1YXRlcm5pb25SZWN1cnNpdmVseSgpO1xuICAgIHJldHVybiBRdWF0ZXJuaW9uLm11bHRpcGx5KFxuICAgICAgbWF0cml4RnJvbUFuY2VzdG9yVG9QYXJlbnQsXG4gICAgICB0aGlzLmVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGdldCB3b3JsZFBvc2l0aW9uKCk6IFZlY3RvcjMge1xuICAgIGNvbnN0IHplcm9WZWN0b3IgPSBTY2VuZUdyYXBoQ29tcG9uZW50Ll9fb3JpZ2luVmVjdG9yMztcbiAgICB0aGlzLm1hdHJpeElubmVyLm11bHRpcGx5VmVjdG9yM1RvKHplcm9WZWN0b3IsIFNjZW5lR3JhcGhDb21wb25lbnQucmV0dXJuVmVjdG9yMyk7XG4gICAgcmV0dXJuIFNjZW5lR3JhcGhDb21wb25lbnQucmV0dXJuVmVjdG9yMyBhcyBWZWN0b3IzO1xuICB9XG5cbiAgZ2V0V29ybGRQb3NpdGlvbk9mKGxvY2FsUG9zaXRpb246IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhJbm5lci5tdWx0aXBseVZlY3RvcjMobG9jYWxQb3NpdGlvbik7XG4gIH1cblxuICBnZXRXb3JsZFBvc2l0aW9uT2ZUbyhsb2NhbFBvc2l0aW9uOiBWZWN0b3IzLCBvdXQ6IE11dGFibGVWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4SW5uZXIubXVsdGlwbHlWZWN0b3IzVG8obG9jYWxQb3NpdGlvbiwgb3V0KTtcbiAgfVxuXG4gIGdldExvY2FsUG9zaXRpb25PZih3b3JsZFBvc2l0aW9uOiBWZWN0b3IzKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIE1hdHJpeDQ0LmludmVydCh0aGlzLm1hdHJpeElubmVyKS5tdWx0aXBseVZlY3RvcjMod29ybGRQb3NpdGlvbik7XG4gIH1cblxuICBnZXRMb2NhbFBvc2l0aW9uT2ZUbyh3b3JsZFBvc2l0aW9uOiBWZWN0b3IzLCBvdXQ6IE11dGFibGVWZWN0b3IzKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIE1hdHJpeDQ0LmludmVydFRvKHRoaXMubWF0cml4SW5uZXIsIFNjZW5lR3JhcGhDb21wb25lbnQuX190bXBfbWF0NCkubXVsdGlwbHlWZWN0b3IzVG8oXG4gICAgICB3b3JsZFBvc2l0aW9uLFxuICAgICAgb3V0XG4gICAgKTtcbiAgfVxuXG4gIGdldFdvcmxkQUFCQigpIHtcbiAgICBjb25zdCBhYWJiID0gbmV3IEFBQkIoKTtcbiAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gdGhpcy5lbnRpdHkudHJ5VG9HZXRNZXNoKCk7XG4gICAgaWYgKElzLmV4aXN0KG1lc2hDb21wb25lbnQpICYmIElzLmV4aXN0KG1lc2hDb21wb25lbnQubWVzaCkpIHtcbiAgICAgIGFhYmIubWVyZ2VBQUJCKG1lc2hDb21wb25lbnQubWVzaC5BQUJCKTtcblxuICAgICAgQUFCQi5tdWx0aXBseU1hdHJpeFRvKFxuICAgICAgICB0aGlzLmVudGl0eS5nZXRTY2VuZUdyYXBoKCkubWF0cml4SW5uZXIsXG4gICAgICAgIGFhYmIsXG4gICAgICAgIFNjZW5lR3JhcGhDb21wb25lbnQuX190bXBBQUJCXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBTY2VuZUdyYXBoQ29tcG9uZW50Ll9fdG1wQUFCQi5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFNjZW5lR3JhcGhDb21wb25lbnQuX190bXBBQUJCO1xuICB9XG5cbiAgY2FsY1dvcmxkTWVyZ2VkQUFCQigpIHtcbiAgICBjb25zdCBhYWJiID0gdGhpcy5nZXRXb3JsZEFBQkIoKS5jbG9uZSgpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRBQUJCID0gY2hpbGQuY2FsY1dvcmxkTWVyZ2VkQUFCQigpO1xuICAgICAgYWFiYi5tZXJnZUFBQkIoY2hpbGRBQUJCKTtcbiAgICB9XG4gICAgdGhpcy5fX3dvcmxkTWVyZ2VkQUFCQiA9IGFhYmI7XG5cbiAgICByZXR1cm4gYWFiYjtcbiAgfVxuXG4gIGdldCB3b3JsZE1lcmdlZEFBQkIoKSB7XG4gICAgaWYgKHRoaXMuX19pc1dvcmxkQUFCQkRpcnR5KSB7XG4gICAgICB0aGlzLmNhbGNXb3JsZE1lcmdlZEFBQkIoKTtcbiAgICAgIHRoaXMuX19pc1dvcmxkQUFCQkRpcnR5ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fd29ybGRNZXJnZWRBQUJCO1xuICB9XG5cbiAgZ2V0V29ybGRBQUJCV2l0aFNrZWxldGFsKCkge1xuICAgIGNvbnN0IGFhYmIgPSBuZXcgQUFCQigpO1xuICAgIGNvbnN0IG1lc2hDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldE1lc2goKTtcbiAgICBpZiAoSXMuZXhpc3QobWVzaENvbXBvbmVudCkgJiYgSXMuZXhpc3QobWVzaENvbXBvbmVudC5tZXNoKSkge1xuICAgICAgYWFiYi5tZXJnZUFBQkIobWVzaENvbXBvbmVudC5tZXNoLkFBQkIpO1xuXG4gICAgICBBQUJCLm11bHRpcGx5TWF0cml4VG8oXG4gICAgICAgIHRoaXMuZW50aXR5LmdldFNjZW5lR3JhcGgoKS5lbnRpdHlXb3JsZE1hdHJpeFdpdGhTa2VsZXRhbElubmVyLFxuICAgICAgICBhYWJiLFxuICAgICAgICBTY2VuZUdyYXBoQ29tcG9uZW50Ll9fdG1wQUFCQlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgU2NlbmVHcmFwaENvbXBvbmVudC5fX3RtcEFBQkIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBTY2VuZUdyYXBoQ29tcG9uZW50Ll9fdG1wQUFCQjtcbiAgfVxuXG4gIGNhbGNXb3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWwoKSB7XG4gICAgY29uc3QgYWFiYiA9IHRoaXMuZ2V0V29ybGRBQUJCV2l0aFNrZWxldGFsKCkuY2xvbmUoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkQUFCQiA9IGNoaWxkLmNhbGNXb3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWwoKTtcbiAgICAgIGFhYmIubWVyZ2VBQUJCKGNoaWxkQUFCQik7XG4gICAgfVxuICAgIHRoaXMuX193b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWwgPSBhYWJiO1xuXG4gICAgcmV0dXJuIGFhYmI7XG4gIH1cblxuICBnZXQgd29ybGRNZXJnZWRBQUJCV2l0aFNrZWxldGFsKCkge1xuICAgIGlmICh0aGlzLl9faXNXb3JsZEFBQkJEaXJ0eSkge1xuICAgICAgdGhpcy5jYWxjV29ybGRNZXJnZWRBQUJCV2l0aFNrZWxldGFsKCk7XG4gICAgICB0aGlzLl9faXNXb3JsZEFBQkJEaXJ0eSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3dvcmxkTWVyZ2VkQUFCQldpdGhTa2VsZXRhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYXN0UmF5IE1ldGhvZHNcbiAgICpcbiAgICogQHBhcmFtIHNyY1BvaW50SW5Xb3JsZCBhIHNvdXJjZSBwb3NpdGlvbiBpbiB3b3JsZCBzcGFjZVxuICAgKiBAcGFyYW0gZGlyZWN0aW9uSW5Xb3JsZCBhIGRpcmVjdGlvbiB2ZWN0b3IgaW4gd29ybGQgc3BhY2VcbiAgICogQHBhcmFtIGRvdFRocmVzaG9sZCB0aHJlc2hvbGQgb2YgdGhlIGludGVyc2VjdGVkIHRyaWFuZ2xlIGFuZCB0aGUgcmF5XG4gICAqIEBwYXJhbSBpZ25vcmVNZXNoQ29tcG9uZW50cyBtZXNoIGNvbXBvbmVudHMgdG8gaWdub3JlXG4gICAqIEByZXR1cm5zIGluZm9ybWF0aW9uIG9mIGludGVyc2VjdGlvbiBpbiB3b3JsZCBzcGFjZVxuICAgKi9cbiAgcHVibGljIGNhc3RSYXkoXG4gICAgc3JjUG9pbnRJbldvcmxkOiBWZWN0b3IzLFxuICAgIGRpcmVjdGlvbkluV29ybGQ6IFZlY3RvcjMsXG4gICAgZG90VGhyZXNob2xkID0gMCxcbiAgICBpZ25vcmVNZXNoQ29tcG9uZW50czogTWVzaENvbXBvbmVudFtdID0gW11cbiAgKTogUmF5Y2FzdFJlc3VsdEV4MiB7XG4gICAgY29uc3QgY29sbGVjdGVkU2dDb21wb25lbnRzID0gZmxhdHRlbkhpZXJhcmNoeSh0aGlzLCBmYWxzZSk7XG4gICAgY29uc3QgbWVzaENvbXBvbmVudHM6IE1lc2hDb21wb25lbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2cgb2YgY29sbGVjdGVkU2dDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBtZXNoID0gc2cuZW50aXR5LnRyeVRvR2V0TWVzaCgpO1xuICAgICAgaWYgKG1lc2gpIHtcbiAgICAgICAgbWVzaENvbXBvbmVudHMucHVzaChtZXNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmF5RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIGxldCBpbnRlcnNlY3RlZFBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgIGxldCBzZWxlY3RlZE1lc2hDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHUgPSAwO1xuICAgIGxldCB2ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1lc2hDb21wb25lbnQgb2YgbWVzaENvbXBvbmVudHMpIHtcbiAgICAgIGlmICghbWVzaENvbXBvbmVudC5lbnRpdHkuZ2V0U2NlbmVHcmFwaCgpIS5pc1Zpc2libGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIW1lc2hDb21wb25lbnQuaXNQaWNrYWJsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpZ25vcmVNZXNoQ29tcG9uZW50cy5pbmRleE9mKG1lc2hDb21wb25lbnQpICE9PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1lc2hDb21wb25lbnQuY2FzdFJheShzcmNQb2ludEluV29ybGQsIGRpcmVjdGlvbkluV29ybGQsIGRvdFRocmVzaG9sZCk7XG4gICAgICBpZiAoSXMuZGVmaW5lZChyZXN1bHQuZGF0YSkgJiYgcmVzdWx0LmRhdGEudCA8IHJheURpc3RhbmNlKSB7XG4gICAgICAgIHJheURpc3RhbmNlID0gcmVzdWx0LmRhdGEudDtcbiAgICAgICAgaW50ZXJzZWN0ZWRQb3NpdGlvbiA9IHJlc3VsdC5kYXRhLnBvc2l0aW9uO1xuICAgICAgICBzZWxlY3RlZE1lc2hDb21wb25lbnQgPSBtZXNoQ29tcG9uZW50O1xuICAgICAgICB1ID0gcmVzdWx0LmRhdGEudTtcbiAgICAgICAgdiA9IHJlc3VsdC5kYXRhLnY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKElzLmV4aXN0KHNlbGVjdGVkTWVzaENvbXBvbmVudCkgJiYgSXMuZXhpc3QoaW50ZXJzZWN0ZWRQb3NpdGlvbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogdHJ1ZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHQ6IHJheURpc3RhbmNlLFxuICAgICAgICAgIHUsXG4gICAgICAgICAgdixcbiAgICAgICAgICBwb3NpdGlvbjogaW50ZXJzZWN0ZWRQb3NpdGlvbixcbiAgICAgICAgICBzZWxlY3RlZE1lc2hDb21wb25lbnQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FzdFJheUZyb21TY3JlZW4gTWV0aG9kc1xuICAgKlxuICAgKiBAcGFyYW0geCB4IHBvc2l0aW9uIG9mIHNjcmVlblxuICAgKiBAcGFyYW0geSB5IHBvc2l0aW9uIG9mIHNjcmVlblxuICAgKiBAcGFyYW0gY2FtZXJhIGEgY2FtZXJhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdmlld3BvcnQgYSB2aWV3cG9ydCB2ZWN0b3I0XG4gICAqIEBwYXJhbSBkb3RUaHJlc2hvbGQgdGhyZXNob2xkIG9mIHRoZSBpbnRlcnNlY3RlZCB0cmlhbmdsZSBhbmQgdGhlIHJheVxuICAgKiBAcGFyYW0gaWdub3JlTWVzaENvbXBvbmVudHMgbWVzaCBjb21wb25lbnRzIHRvIGlnbm9yZVxuICAgKiBAcmV0dXJucyBpbmZvcm1hdGlvbiBvZiBpbnRlcnNlY3Rpb24gaW4gd29ybGQgc3BhY2VcbiAgICovXG4gIGNhc3RSYXlGcm9tU2NyZWVuKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgY2FtZXJhOiBDYW1lcmFDb21wb25lbnQsXG4gICAgdmlld3BvcnQ6IFZlY3RvcjQsXG4gICAgZG90VGhyZXNob2xkID0gMCxcbiAgICBpZ25vcmVNZXNoQ29tcG9uZW50czogTWVzaENvbXBvbmVudFtdID0gW11cbiAgKTogUmF5Y2FzdFJlc3VsdEV4MiB7XG4gICAgY29uc3QgY29sbGVjdGVkU2dDb21wb25lbnRzID0gZmxhdHRlbkhpZXJhcmNoeSh0aGlzLCBmYWxzZSk7XG4gICAgY29uc3QgbWVzaENvbXBvbmVudHM6IE1lc2hDb21wb25lbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2cgb2YgY29sbGVjdGVkU2dDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBtZXNoID0gc2cuZW50aXR5LnRyeVRvR2V0TWVzaCgpO1xuICAgICAgaWYgKG1lc2gpIHtcbiAgICAgICAgbWVzaENvbXBvbmVudHMucHVzaChtZXNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmF5RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIGxldCBpbnRlcnNlY3RlZFBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgIGxldCBzZWxlY3RlZE1lc2hDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHUgPSAwO1xuICAgIGxldCB2ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1lc2hDb21wb25lbnQgb2YgbWVzaENvbXBvbmVudHMpIHtcbiAgICAgIGlmICghbWVzaENvbXBvbmVudC5lbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghbWVzaENvbXBvbmVudC5pc1BpY2thYmxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlnbm9yZU1lc2hDb21wb25lbnRzLmluZGV4T2YobWVzaENvbXBvbmVudCkgIT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbWVzaENvbXBvbmVudC5jYXN0UmF5RnJvbVNjcmVlbkluV29ybGQoeCwgeSwgY2FtZXJhLCB2aWV3cG9ydCwgZG90VGhyZXNob2xkKTtcbiAgICAgIGlmIChJcy5kZWZpbmVkKHJlc3VsdC5kYXRhKSAmJiByZXN1bHQuZGF0YS50IDwgcmF5RGlzdGFuY2UpIHtcbiAgICAgICAgcmF5RGlzdGFuY2UgPSByZXN1bHQuZGF0YS50O1xuICAgICAgICBpbnRlcnNlY3RlZFBvc2l0aW9uID0gcmVzdWx0LmRhdGEucG9zaXRpb247XG4gICAgICAgIHNlbGVjdGVkTWVzaENvbXBvbmVudCA9IG1lc2hDb21wb25lbnQ7XG4gICAgICAgIHUgPSByZXN1bHQuZGF0YS51O1xuICAgICAgICB2ID0gcmVzdWx0LmRhdGEudjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoSXMuZXhpc3Qoc2VsZWN0ZWRNZXNoQ29tcG9uZW50KSAmJiBJcy5leGlzdChpbnRlcnNlY3RlZFBvc2l0aW9uKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiB0cnVlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdDogcmF5RGlzdGFuY2UsXG4gICAgICAgICAgdSxcbiAgICAgICAgICB2LFxuICAgICAgICAgIHBvc2l0aW9uOiBpbnRlcnNlY3RlZFBvc2l0aW9uLFxuICAgICAgICAgIHNlbGVjdGVkTWVzaENvbXBvbmVudCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gICRsb2FkKCkge1xuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgfVxuXG4gICRsb2dpYygpIHtcbiAgICBpZiAodGhpcy5fX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPT09IFRyYW5zZm9ybUNvbXBvbmVudC51cGRhdGVDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWF0cml4SW5uZXI7XG4gICAgdGhpcy5ub3JtYWxNYXRyaXhJbm5lcjtcblxuICAgIHRoaXMuX191cGRhdGVHaXptb3MoKTtcblxuICAgIC8vIGNvbnN0IG1lc2hDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldE1lc2goKTtcbiAgICAvLyBpZiAobWVzaENvbXBvbmVudCAhPSBudWxsKSB7XG4gICAgLy8gICBjb25zdCBtZXNoID0gbWVzaENvbXBvbmVudC5tZXNoO1xuICAgIC8vICAgaWYgKG1lc2ggIT0gbnVsbCkge1xuICAgIC8vICAgICBjb25zdCBwcmltaXRpdmVOdW0gPSBtZXNoLmdldFByaW1pdGl2ZU51bWJlcigpO1xuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByaW1pdGl2ZU51bTsgaSsrKSB7XG4gICAgLy8gICAgICAgY29uc3QgcHJpbWl0aXZlID0gbWVzaC5nZXRQcmltaXRpdmVBdChpKTtcbiAgICAvLyAgICAgICBpZiAocHJpbWl0aXZlLnBvc2l0aW9uQWNjZXNzb3JWZXJzaW9uICE9PSB0aGlzLl9fbGF0ZXN0UHJpbWl0aXZlUG9zaXRpb25BY2Nlc3NvclZlcnNpb24pIHtcbiAgICAvLyAgICAgICAgIHRoaXMuc2V0V29ybGRBQUJCRGlydHlQYXJlbnRSZWN1cnNpdmVseSgpO1xuICAgIC8vICAgICAgICAgdGhpcy5fX2xhdGVzdFByaW1pdGl2ZVBvc2l0aW9uQWNjZXNzb3JWZXJzaW9uID0gcHJpbWl0aXZlLnBvc2l0aW9uQWNjZXNzb3JWZXJzaW9uITtcbiAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIHRoaXMuX19sYXN0VHJhbnNmb3JtQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gVHJhbnNmb3JtQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3VwZGF0ZUdpem1vcygpIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX2FhYmJHaXptbykgJiYgdGhpcy5fX2FhYmJHaXptby5pc1NldHVwICYmIHRoaXMuX19hYWJiR2l6bW8uaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLl9fYWFiYkdpem1vLl91cGRhdGUoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgSXMuZXhpc3QodGhpcy5fX2xvY2F0b3JHaXptbykgJiZcbiAgICAgIHRoaXMuX19sb2NhdG9yR2l6bW8uaXNTZXR1cCAmJlxuICAgICAgdGhpcy5fX2xvY2F0b3JHaXptby5pc1Zpc2libGVcbiAgICApIHtcbiAgICAgIHRoaXMuX19sb2NhdG9yR2l6bW8uX3VwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBJcy5leGlzdCh0aGlzLl9fdHJhbnNsYXRpb25HaXptbykgJiZcbiAgICAgIHRoaXMuX190cmFuc2xhdGlvbkdpem1vLmlzU2V0dXAgJiZcbiAgICAgIHRoaXMuX190cmFuc2xhdGlvbkdpem1vLmlzVmlzaWJsZVxuICAgICkge1xuICAgICAgdGhpcy5fX3RyYW5zbGF0aW9uR2l6bW8uX3VwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3NjYWxlR2l6bW8pICYmIHRoaXMuX19zY2FsZUdpem1vLmlzU2V0dXAgJiYgdGhpcy5fX3NjYWxlR2l6bW8uaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLl9fc2NhbGVHaXptby5fdXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UG9zaXRpb25XaXRob3V0UGh5c2ljcyh2ZWM6IElWZWN0b3IzKSB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fcGFyZW50KSkge1xuICAgICAgdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxQb3NpdGlvbiA9IHZlYztcbiAgICB9IGVsc2Uge1xuICAgICAgTXV0YWJsZU1hdHJpeDQ0LmludmVydFRvKHRoaXMuX19wYXJlbnQuZW50aXR5LmdldFNjZW5lR3JhcGgoKS5tYXRyaXhJbm5lciwgdGhpcy5fX3RtcE1hdHJpeCk7XG4gICAgICB0aGlzLmVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uID0gdGhpcy5fX3RtcE1hdHJpeC5tdWx0aXBseVZlY3RvcjModmVjKTtcbiAgICB9XG4gIH1cblxuICBzZXQgcG9zaXRpb24odmVjOiBJVmVjdG9yMykge1xuICAgIHRoaXMuc2V0UG9zaXRpb25XaXRob3V0UGh5c2ljcyh2ZWMpO1xuXG4gICAgY29uc3QgcGh5c2ljc0NvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0UGh5c2ljcygpO1xuICAgIGlmIChwaHlzaWNzQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwaHlzaWNzQ29tcG9uZW50LnN0cmF0ZWd5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHBoeXNpY3NDb21wb25lbnQuc3RyYXRlZ3kgaW5zdGFuY2VvZiBPaW1vUGh5c2ljc1N0cmF0ZWd5KSB7XG4gICAgICAgICAgY29uc3Qgc2NlbmVHcmFwaENvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICAgIGlmIChzY2VuZUdyYXBoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBoeXNpY3NDb21wb25lbnQuc3RyYXRlZ3kuc2V0UG9zaXRpb24odmVjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgcG9zaXRpb24oKTogTXV0YWJsZVZlY3RvcjMge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeElubmVyLmdldFRyYW5zbGF0ZSgpO1xuICB9XG5cbiAgZ2V0IHBvc2l0aW9uUmVzdCgpOiBNdXRhYmxlVmVjdG9yMyB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4UmVzdElubmVyLmdldFRyYW5zbGF0ZSgpO1xuICB9XG5cbiAgc2V0IGV1bGVyQW5nbGVzKHZlYzogSVZlY3RvcjMpIHtcbiAgICBpZiAoSXMubm90LmV4aXN0KHRoaXMuX19wYXJlbnQpKSB7XG4gICAgICB0aGlzLmVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbEV1bGVyQW5nbGVzID0gdmVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBxdWF0ID0gUXVhdGVybmlvbi5mcm9tTWF0cml4KHRoaXMuX19wYXJlbnQuZW50aXR5LmdldFNjZW5lR3JhcGgoKS5tYXRyaXhJbm5lcik7XG4gICAgICBjb25zdCBpbnZRdWF0ID0gUXVhdGVybmlvbi5pbnZlcnQocXVhdCk7XG4gICAgICBjb25zdCByb3RhdGlvbiA9IFF1YXRlcm5pb24uZnJvbU1hdHJpeChNYXRyaXg0NC5yb3RhdGUodmVjKSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBRdWF0ZXJuaW9uLm11bHRpcGx5KHJvdGF0aW9uLCBpbnZRdWF0KTtcbiAgICAgIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsRXVsZXJBbmdsZXMgPSByZXN1bHQudG9FdWxlckFuZ2xlcygpO1xuICAgIH1cblxuICAgIGNvbnN0IHBoeXNpY3NDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFBoeXNpY3MoKTtcbiAgICBpZiAocGh5c2ljc0NvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGh5c2ljc0NvbXBvbmVudC5zdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwaHlzaWNzQ29tcG9uZW50LnN0cmF0ZWd5IGluc3RhbmNlb2YgT2ltb1BoeXNpY3NTdHJhdGVneSkge1xuICAgICAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgICBpZiAoc2NlbmVHcmFwaENvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwaHlzaWNzQ29tcG9uZW50LnN0cmF0ZWd5LnNldEV1bGVyQW5nbGUodmVjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgZXVsZXJBbmdsZXMoKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4SW5uZXIudG9FdWxlckFuZ2xlcygpO1xuICB9XG5cbiAgc2V0Um90YXRpb25XaXRob3V0UGh5c2ljcyhxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIGlmIChJcy5ub3QuZXhpc3QodGhpcy5fX3BhcmVudCkpIHtcbiAgICAgIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUm90YXRpb24gPSBxdWF0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBxdWF0SW5uZXIgPSB0aGlzLl9fcGFyZW50LmVudGl0eS5nZXRTY2VuZUdyYXBoKCkucm90YXRpb247XG4gICAgICBjb25zdCBpbnZRdWF0ID0gUXVhdGVybmlvbi5pbnZlcnQocXVhdElubmVyKTtcbiAgICAgIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUm90YXRpb24gPSBRdWF0ZXJuaW9uLm11bHRpcGx5KHF1YXQsIGludlF1YXQpO1xuICAgIH1cbiAgfVxuXG4gIHNldCByb3RhdGlvbihxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIHRoaXMuc2V0Um90YXRpb25XaXRob3V0UGh5c2ljcyhxdWF0KTtcblxuICAgIGNvbnN0IHBoeXNpY3NDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFBoeXNpY3MoKTtcbiAgICBpZiAocGh5c2ljc0NvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGh5c2ljc0NvbXBvbmVudC5zdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChwaHlzaWNzQ29tcG9uZW50LnN0cmF0ZWd5IGluc3RhbmNlb2YgT2ltb1BoeXNpY3NTdHJhdGVneSkge1xuICAgICAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgICBpZiAoc2NlbmVHcmFwaENvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwaHlzaWNzQ29tcG9uZW50LnN0cmF0ZWd5LnNldEV1bGVyQW5nbGUocXVhdC50b0V1bGVyQW5nbGVzKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCByb3RhdGlvbigpOiBRdWF0ZXJuaW9uIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAocGFyZW50ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLm11bHRpcGx5KHBhcmVudC5yb3RhdGlvbiwgdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvbklubmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUm90YXRpb25Jbm5lcjtcbiAgfVxuXG4gIGdldCByb3RhdGlvblJlc3QoKTogUXVhdGVybmlvbiB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAgICAgcGFyZW50LnJvdGF0aW9uUmVzdCxcbiAgICAgICAgdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvblJlc3RJbm5lclxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUm90YXRpb25SZXN0SW5uZXI7XG4gIH1cblxuICBnZXRSb3RhdGlvblJlc3QoZW5kRm46IChzZzogU2NlbmVHcmFwaENvbXBvbmVudCkgPT4gYm9vbGVhbik6IFF1YXRlcm5pb24ge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGNvbnN0IElzRW5kID0gZW5kRm4odGhpcyk7XG4gICAgaWYgKHBhcmVudCAhPSBudWxsICYmICFJc0VuZCkge1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICAgIHBhcmVudC5nZXRSb3RhdGlvblJlc3QoZW5kRm4pLFxuICAgICAgICB0aGlzLmVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uUmVzdElubmVyXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvblJlc3RJbm5lcjtcbiAgfVxuXG4gIHNldCBzY2FsZSh2ZWM6IElWZWN0b3IzKSB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fcGFyZW50KSkge1xuICAgICAgdGhpcy5lbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxTY2FsZSA9IHZlYztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWF0ID0gdGhpcy5fX3BhcmVudC5lbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLm1hdHJpeDtcbiAgICAgIG1hdC5fdlsxMl0gPSAwO1xuICAgICAgbWF0Ll92WzEzXSA9IDA7XG4gICAgICBtYXQuX3ZbMTRdID0gMDtcbiAgICAgIGNvbnN0IGludk1hdCA9IE11dGFibGVNYXRyaXg0NC5pbnZlcnQobWF0KTtcbiAgICAgIHRoaXMuZW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsU2NhbGUgPSBpbnZNYXQubXVsdGlwbHlWZWN0b3IzKHZlYyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGh5c2ljc0NvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0UGh5c2ljcygpO1xuICAgIGlmIChwaHlzaWNzQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwaHlzaWNzQ29tcG9uZW50LnN0cmF0ZWd5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHBoeXNpY3NDb21wb25lbnQuc3RyYXRlZ3kgaW5zdGFuY2VvZiBPaW1vUGh5c2ljc1N0cmF0ZWd5KSB7XG4gICAgICAgICAgY29uc3Qgc2NlbmVHcmFwaENvbXBvbmVudCA9IHRoaXMuZW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICAgIGlmIChzY2VuZUdyYXBoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBoeXNpY3NDb21wb25lbnQuc3RyYXRlZ3kuc2V0U2NhbGUodmVjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2NhbGUoKTogTXV0YWJsZVZlY3RvcjMge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeElubmVyLmdldFNjYWxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9fY29weUNoaWxkKGNoaWxkOiBTY2VuZUdyYXBoQ29tcG9uZW50KTogSVNjZW5lR3JhcGhFbnRpdHkge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gRW50aXR5UmVwb3NpdG9yeS5fc2hhbGxvd0NvcHlFbnRpdHlJbm5lcihjaGlsZC5lbnRpdHkpIGFzIElTY2VuZUdyYXBoRW50aXR5O1xuICAgIG5ld0NoaWxkLmdldFNjZW5lR3JhcGgoKS5fX3BhcmVudCA9IHRoaXM7XG4gICAgcmV0dXJuIG5ld0NoaWxkO1xuICB9XG5cbiAgX3NoYWxsb3dDb3B5RnJvbShjb21wb25lbnRfOiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRfIGFzIFNjZW5lR3JhcGhDb21wb25lbnQ7XG5cbiAgICB0aGlzLl9fcGFyZW50ID0gY29tcG9uZW50Ll9fcGFyZW50O1xuICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9uZW50Ll9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvcHlDaGlsZCA9IHRoaXMuX19jb3B5Q2hpbGQoY29tcG9uZW50Ll9fY2hpbGRyZW5baV0pLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgIHRoaXMuX19jaGlsZHJlbi5wdXNoKGNvcHlDaGlsZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2dpem1vQ2hpbGRyZW4gPSBjb21wb25lbnQuX19naXptb0NoaWxkcmVuLmNvbmNhdCgpO1xuICAgIHRoaXMuX3dvcmxkTWF0cml4LmNvcHlDb21wb25lbnRzKGNvbXBvbmVudC5fd29ybGRNYXRyaXgpO1xuICAgIHRoaXMuX3dvcmxkTWF0cml4UmVzdC5jb3B5Q29tcG9uZW50cyhjb21wb25lbnQuX3dvcmxkTWF0cml4UmVzdCk7XG4gICAgdGhpcy5fbm9ybWFsTWF0cml4LmNvcHlDb21wb25lbnRzKGNvbXBvbmVudC5fbm9ybWFsTWF0cml4KTtcbiAgICB0aGlzLl9faXNXb3JsZE1hdHJpeFVwVG9EYXRlID0gZmFsc2U7XG4gICAgdGhpcy5fX2lzV29ybGRNYXRyaXhSZXN0VXBUb0RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9faXNOb3JtYWxNYXRyaXhVcFRvRGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX190bXBNYXRyaXguY29weUNvbXBvbmVudHMoY29tcG9uZW50Ll9fdG1wTWF0cml4KTtcbiAgICB0aGlzLl9fd29ybGRNZXJnZWRBQUJCV2l0aFNrZWxldGFsID0gY29tcG9uZW50Ll9fd29ybGRNZXJnZWRBQUJCV2l0aFNrZWxldGFsLmNsb25lKCk7XG4gICAgdGhpcy5fX2lzV29ybGRBQUJCRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX2lzVmlzaWJsZS5jb3B5Q29tcG9uZW50cyhjb21wb25lbnQuX2lzVmlzaWJsZSk7XG4gICAgdGhpcy5faXNCaWxsYm9hcmQuY29weUNvbXBvbmVudHMoY29tcG9uZW50Ll9pc0JpbGxib2FyZCk7XG4gICAgLy8gdGhpcy5fX2FhYmJHaXptbyA9IGNvbXBvbmVudC5fX2FhYmJHaXptbztcbiAgICAvLyB0aGlzLl9fbG9jYXRvckdpem1vID0gY29tcG9uZW50Ll9fbG9jYXRvckdpem1vO1xuICAgIC8vIHRoaXMuX190cmFuc2xhdGlvbkdpem1vID0gY29tcG9uZW50Ll9fdHJhbnNsYXRpb25HaXptbztcbiAgICAvLyB0aGlzLl9fc2NhbGVHaXptbyA9IGNvbXBvbmVudC5fX3NjYWxlR2l6bW87XG4gICAgdGhpcy5fX3RyYW5zZm9ybUdpem1vU3BhY2UgPSBjb21wb25lbnQuX190cmFuc2Zvcm1HaXptb1NwYWNlO1xuICAgIHRoaXMuX19sYXRlc3RQcmltaXRpdmVQb3NpdGlvbkFjY2Vzc29yVmVyc2lvbiA9XG4gICAgICBjb21wb25lbnQuX19sYXRlc3RQcmltaXRpdmVQb3NpdGlvbkFjY2Vzc29yVmVyc2lvbjtcbiAgICB0aGlzLnRvTWFrZVdvcmxkTWF0cml4VGhlU2FtZUFzTG9jYWxNYXRyaXggPSBjb21wb25lbnQudG9NYWtlV29ybGRNYXRyaXhUaGVTYW1lQXNMb2NhbE1hdHJpeDtcbiAgICB0aGlzLmlzUm9vdEpvaW50ID0gY29tcG9uZW50LmlzUm9vdEpvaW50O1xuICAgIHRoaXMuam9pbnRJbmRleCA9IGNvbXBvbmVudC5qb2ludEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgZW50aXR5IHdoaWNoIGhhcyB0aGlzIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnRcbiAgICovXG4gIGdldCBlbnRpdHkoKTogSVNjZW5lR3JhcGhFbnRpdHkge1xuICAgIHJldHVybiBFbnRpdHlSZXBvc2l0b3J5LmdldEVudGl0eSh0aGlzLl9fZW50aXR5VWlkKSBhcyB1bmtub3duIGFzIElTY2VuZUdyYXBoRW50aXR5O1xuICB9XG5cbiAgc2V0VHJhbnNmb3JtR2l6bW9TcGFjZShzcGFjZTogJ2xvY2FsJyB8ICd3b3JsZCcpIHtcbiAgICB0aGlzLl9fdHJhbnNmb3JtR2l6bW9TcGFjZSA9IHNwYWNlO1xuICAgIHRoaXMuX190cmFuc2xhdGlvbkdpem1vPy5zZXRTcGFjZShzcGFjZSk7XG4gICAgdGhpcy5fX3NjYWxlR2l6bW8/LnNldFNwYWNlKHNwYWNlKTtcbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIHN1cGVyLl9kZXN0cm95KCk7XG4gICAgdGhpcy5fX2FhYmJHaXptbz8uX2Rlc3Ryb3koKTtcbiAgICB0aGlzLl9fbG9jYXRvckdpem1vPy5fZGVzdHJveSgpO1xuICAgIHRoaXMuX190cmFuc2xhdGlvbkdpem1vPy5fZGVzdHJveSgpO1xuICAgIHRoaXMuX19zY2FsZUdpem1vPy5fZGVzdHJveSgpO1xuICAgIC8vIHRoaXMuX19lbnRpdHlSZXBvc2l0b3J5LnJlbW92ZUVudGl0eSh0aGlzLl9fZW50aXR5VWlkKTtcbiAgICB0aGlzLnBhcmVudD8ucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gY2hpbGQucGFyZW50Py5yZW1vdmVDaGlsZChjaGlsZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvdmVycmlkZVxuICAgKiBBZGQgdGhpcyBjb21wb25lbnQgdG8gdGhlIGVudGl0eVxuICAgKiBAcGFyYW0gYmFzZSB0aGUgdGFyZ2V0IGVudGl0eVxuICAgKiBAcGFyYW0gX2NvbXBvbmVudENsYXNzIHRoZSBjb21wb25lbnQgY2xhc3MgdG8gYWRkXG4gICAqL1xuICBhZGRUaGlzQ29tcG9uZW50VG9FbnRpdHk8RW50aXR5QmFzZSBleHRlbmRzIElFbnRpdHksIFNvbWVDb21wb25lbnRDbGFzcyBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ+KFxuICAgIGJhc2U6IEVudGl0eUJhc2UsXG4gICAgX2NvbXBvbmVudENsYXNzOiBTb21lQ29tcG9uZW50Q2xhc3NcbiAgKSB7XG4gICAgY2xhc3MgU2NlbmVHcmFwaEVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgcHJpdmF0ZSBfX3NjZW5lR3JhcGhjb21wb25lbnQ/OiBTY2VuZUdyYXBoQ29tcG9uZW50O1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAgICAgICBpc0FsaXZlOiBib29sZWFuLFxuICAgICAgICBjb21wb25lbnRzPzogTWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50PlxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGVudGl0eVVJRCwgaXNBbGl2ZSwgY29tcG9uZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGdldFNjZW5lR3JhcGgoKTogU2NlbmVHcmFwaENvbXBvbmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9fc2NlbmVHcmFwaENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fX3NjZW5lR3JhcGhDb21wb25lbnQgPSB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5TY2VuZUdyYXBoQ29tcG9uZW50VElEXG4gICAgICAgICAgKSBhcyBTY2VuZUdyYXBoQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2NlbmVHcmFwaENvbXBvbmVudDtcbiAgICAgIH1cblxuICAgICAgZ2V0IHBhcmVudCgpOiBTY2VuZUdyYXBoQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NlbmVHcmFwaCgpLnBhcmVudDtcbiAgICAgIH1cblxuICAgICAgZ2V0IG1hdHJpeCgpOiBJTWF0cml4NDQge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gdGhpcy5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICAgIHJldHVybiBzY2VuZUdyYXBoLm1hdHJpeDtcbiAgICAgIH1cbiAgICAgIGdldCBtYXRyaXhJbm5lcigpOiBJTWF0cml4NDQge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gdGhpcy5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICAgIHJldHVybiBzY2VuZUdyYXBoLm1hdHJpeElubmVyO1xuICAgICAgfVxuXG4gICAgICBnZXQgcG9zaXRpb24oKTogTXV0YWJsZVZlY3RvcjMge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gdGhpcy5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICAgIHJldHVybiBzY2VuZUdyYXBoLnBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICBzZXQgcG9zaXRpb24odmVjOiBJVmVjdG9yMykge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gdGhpcy5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICAgIHNjZW5lR3JhcGgucG9zaXRpb24gPSB2ZWM7XG4gICAgICB9XG5cbiAgICAgIGdldCBwb3NpdGlvblJlc3QoKTogTXV0YWJsZVZlY3RvcjMge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gdGhpcy5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICAgIHJldHVybiBzY2VuZUdyYXBoLnBvc2l0aW9uUmVzdDtcbiAgICAgIH1cblxuICAgICAgZ2V0IHNjYWxlKCk6IE11dGFibGVWZWN0b3IzIHtcbiAgICAgICAgY29uc3Qgc2NlbmVHcmFwaCA9IHRoaXMuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICByZXR1cm4gc2NlbmVHcmFwaC5zY2FsZTtcbiAgICAgIH1cblxuICAgICAgc2V0IHNjYWxlKHZlYzogSVZlY3RvcjMpIHtcbiAgICAgICAgY29uc3Qgc2NlbmVHcmFwaCA9IHRoaXMuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICBzY2VuZUdyYXBoLnNjYWxlID0gdmVjO1xuICAgICAgfVxuXG4gICAgICBnZXQgZXVsZXJBbmdsZXMoKTogVmVjdG9yMyB7XG4gICAgICAgIGNvbnN0IHNjZW5lR3JhcGggPSB0aGlzLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgcmV0dXJuIHNjZW5lR3JhcGguZXVsZXJBbmdsZXM7XG4gICAgICB9XG5cbiAgICAgIHNldCBldWxlckFuZ2xlcyh2ZWM6IElWZWN0b3IzKSB7XG4gICAgICAgIGNvbnN0IHNjZW5lR3JhcGggPSB0aGlzLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgc2NlbmVHcmFwaC5ldWxlckFuZ2xlcyA9IHZlYztcbiAgICAgIH1cblxuICAgICAgZ2V0IHJvdGF0aW9uKCk6IFF1YXRlcm5pb24ge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gdGhpcy5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICAgIHJldHVybiBzY2VuZUdyYXBoLnJvdGF0aW9uO1xuICAgICAgfVxuXG4gICAgICBzZXQgcm90YXRpb24ocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICAgICAgY29uc3Qgc2NlbmVHcmFwaCA9IHRoaXMuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICBzY2VuZUdyYXBoLnJvdGF0aW9uID0gcXVhdDtcbiAgICAgIH1cblxuICAgICAgZ2V0IHJvdGF0aW9uUmVzdCgpOiBRdWF0ZXJuaW9uIHtcbiAgICAgICAgY29uc3Qgc2NlbmVHcmFwaCA9IHRoaXMuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICByZXR1cm4gc2NlbmVHcmFwaC5yb3RhdGlvblJlc3Q7XG4gICAgICB9XG5cbiAgICAgIGFkZENoaWxkKHNnOiBTY2VuZUdyYXBoQ29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjZW5lR3JhcGggPSB0aGlzLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgc2NlbmVHcmFwaC5hZGRDaGlsZChzZyk7XG4gICAgICB9XG4gICAgICBnZXQgY2hpbGRyZW4oKTogU2NlbmVHcmFwaENvbXBvbmVudFtdIHtcbiAgICAgICAgY29uc3Qgc2NlbmVHcmFwaCA9IHRoaXMuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICByZXR1cm4gc2NlbmVHcmFwaC5jaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHJlbW92ZUNoaWxkKHNnOiBTY2VuZUdyYXBoQ29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjZW5lR3JhcGggPSB0aGlzLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgc2NlbmVHcmFwaC5yZW1vdmVDaGlsZChzZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFwcGx5TWl4aW5zKGJhc2UsIFNjZW5lR3JhcGhFbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuXG4vKipcbiAqIENvbGxlY3RzIGNoaWxkcmVuIGFuZCBpdHNlbGYgZnJvbSBzcGVjaWZpZWQgc2NlbmVHcmFwaENvbXBvbmVudC5cbiAqIEBwYXJhbSBzY2VuZUdyYXBoQ29tcG9uZW50IGNvbGxlY3RzIGNoaWxkcmVuIGFuZCBpdHNlbGYgZnJvbSB0aGUgc2NlbmVHcmFwaENvbXBvbmVudFxuICogQHBhcmFtIGlzSm9pbnRNb2RlIGNvbGxlY3RzIGpvaW50cyBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuSGllcmFyY2h5KFxuICBzY2VuZUdyYXBoQ29tcG9uZW50OiBTY2VuZUdyYXBoQ29tcG9uZW50LFxuICBpc0pvaW50TW9kZTogYm9vbGVhblxuKTogU2NlbmVHcmFwaENvbXBvbmVudFtdIHtcbiAgY29uc3QgcmVzdWx0czogU2NlbmVHcmFwaENvbXBvbmVudFtdID0gW107XG4gIGlmICghaXNKb2ludE1vZGUgfHwgc2NlbmVHcmFwaENvbXBvbmVudC5pc0pvaW50KCkpIHtcbiAgICByZXN1bHRzLnB1c2goc2NlbmVHcmFwaENvbXBvbmVudCk7XG4gIH1cblxuICBjb25zdCBjaGlsZHJlbiA9IHNjZW5lR3JhcGhDb21wb25lbnQuY2hpbGRyZW4hO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaGl0Q2hpbGRyZW4gPSBmbGF0dGVuSGllcmFyY2h5KGNoaWxkcmVuW2ldLCBpc0pvaW50TW9kZSk7XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0cywgaGl0Q2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNmb3JtRW50aXR5IH0gZnJvbSAnLi4vVHJhbnNmb3JtL2NyZWF0ZVRyYW5zZm9ybUVudGl0eSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHcm91cEVudGl0eSgpOiBJU2NlbmVHcmFwaEVudGl0eSB7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZVRyYW5zZm9ybUVudGl0eSgpO1xuICBjb25zdCBlbnRpdHlBZGRlZENvbXBvbmVudCA9IEVudGl0eVJlcG9zaXRvcnkudHJ5VG9BZGRDb21wb25lbnRUb0VudGl0eUJ5VElEKFxuICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2NlbmVHcmFwaENvbXBvbmVudFRJRCxcbiAgICBlbnRpdHlcbiAgKSBhcyBJU2NlbmVHcmFwaEVudGl0eTtcbiAgcmV0dXJuIGVudGl0eUFkZGVkQ29tcG9uZW50O1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9JU2NlbmVHcmFwaEVudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGVHcm91cEVudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL1NjZW5lR3JhcGhPcHMnO1xuIiwiLyogZXNsaW50LWRpc2FibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cbmltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgSVZlY3RvcjMsIE1hdHJpeDQ0LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vLi4vbWF0aCc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uLy4uL21hdGgvSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgSUFuaW1hdGlvblJldGFyZ2V0IH0gZnJvbSAnLi9BbmltYXRpb25SZXRhcmdldCc7XG5cbmV4cG9ydCBjbGFzcyBBYnNvbHV0ZUFuaW1hdGlvbiBpbXBsZW1lbnRzIElBbmltYXRpb25SZXRhcmdldCB7XG4gIHByaXZhdGUgX19zcmNFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuXG4gIGNvbnN0cnVjdG9yKHNyY0VudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICB0aGlzLl9fc3JjRW50aXR5ID0gc3JjRW50aXR5O1xuICB9XG5cbiAgZ2V0RW50aXR5KCk6IElTY2VuZUdyYXBoRW50aXR5IHtcbiAgICByZXR1cm4gdGhpcy5fX3NyY0VudGl0eTtcbiAgfVxuXG4gIHJldGFyZ2V0UXVhdGVybmlvbihkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogSVF1YXRlcm5pb24ge1xuICAgIGNvbnN0IHNyY0VudGl0eSA9IHRoaXMuX19zcmNFbnRpdHk7XG4gICAgcmV0dXJuIHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uSW5uZXI7XG4gIH1cblxuICByZXRhcmdldFRyYW5zbGF0ZShkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogSVZlY3RvcjMge1xuICAgIGNvbnN0IHNyY0VudGl0eSA9IHRoaXMuX19zcmNFbnRpdHk7XG5cbiAgICByZXR1cm4gc3JjRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb25Jbm5lcjtcbiAgfVxuXG4gIHJldGFyZ2V0U2NhbGUoZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSk6IElWZWN0b3IzIHtcbiAgICBjb25zdCBzcmNFbnRpdHkgPSB0aGlzLl9fc3JjRW50aXR5O1xuXG4gICAgcmV0dXJuIHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFNjYWxlSW5uZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBJVmVjdG9yMyB9IGZyb20gJy4uLy4uLy4uL21hdGgnO1xuaW1wb3J0IHsgSVF1YXRlcm5pb24gfSBmcm9tICcuLi8uLi8uLi9tYXRoL0lRdWF0ZXJuaW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBJQW5pbWF0aW9uUmV0YXJnZXQge1xuICByZXRhcmdldFF1YXRlcm5pb24oZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSk6IElRdWF0ZXJuaW9uO1xuICByZXRhcmdldFRyYW5zbGF0ZShkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogSVZlY3RvcjM7XG4gIHJldGFyZ2V0U2NhbGUoZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSk6IElWZWN0b3IzO1xuICBnZXRFbnRpdHkoKTogSVNjZW5lR3JhcGhFbnRpdHk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBwcmV0dGllci9wcmV0dGllciAqL1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBJVmVjdG9yMywgTWF0cml4NDQsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tICcuLi8uLi8uLi9tYXRoJztcbmltcG9ydCB7IElRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vLi4vbWF0aC9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uLy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgSUFuaW1hdGlvblJldGFyZ2V0IH0gZnJvbSAnLi9BbmltYXRpb25SZXRhcmdldCc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxSZXRhcmdldCBpbXBsZW1lbnRzIElBbmltYXRpb25SZXRhcmdldCB7XG4gIHByaXZhdGUgX19zcmNFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuXG4gIGNvbnN0cnVjdG9yKHNyY0VudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICB0aGlzLl9fc3JjRW50aXR5ID0gc3JjRW50aXR5O1xuICB9XG5cbiAgZ2V0RW50aXR5KCk6IElTY2VuZUdyYXBoRW50aXR5IHtcbiAgICByZXR1cm4gdGhpcy5fX3NyY0VudGl0eTtcbiAgfVxuXG4gIGdldFNyY1BHUmVzdFEoc3JjRW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSkge1xuICAgIGxldCBzcmNQR1Jlc3RROiBJUXVhdGVybmlvbjtcbiAgICBjb25zdCBwYXJlbnQgPSBzcmNFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLnBhcmVudDtcbiAgICBpZiAoSXMuZXhpc3QocGFyZW50KSkge1xuICAgICAgc3JjUEdSZXN0USA9IHBhcmVudC5nZXRSb3RhdGlvblJlc3QoKHNnKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNnLnBhcmVudDtcbiAgICAgICAgaWYgKElzLmV4aXN0KHBhcmVudCkpIHtcbiAgICAgICAgICBjb25zdCB2cm0gPSBwYXJlbnQuZW50aXR5LnRyeVRvR2V0VnJtKCk7XG4gICAgICAgICAgcmV0dXJuIElzLmV4aXN0KHZybSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcmNQR1Jlc3RRID0gUXVhdGVybmlvbi5pZGVudGl0eSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzcmNQR1Jlc3RRO1xuICB9XG5cbiAgZ2V0RHN0UEdSZXN0UShkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgbGV0IGRzdFBHUmVzdFE6IElRdWF0ZXJuaW9uO1xuICAgIGNvbnN0IHBhcmVudCA9IGRzdEVudGl0eS5nZXRTY2VuZUdyYXBoKCkucGFyZW50O1xuICAgIGlmIChJcy5leGlzdChwYXJlbnQpKSB7XG4gICAgICBkc3RQR1Jlc3RRID0gcGFyZW50LmdldFJvdGF0aW9uUmVzdCgoc2cpID0+IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2cucGFyZW50O1xuICAgICAgICBpZiAoSXMuZXhpc3QocGFyZW50KSkge1xuICAgICAgICAgIGNvbnN0IHZybSA9IHBhcmVudC5lbnRpdHkudHJ5VG9HZXRWcm0oKTtcbiAgICAgICAgICByZXR1cm4gSXMuZXhpc3QodnJtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRzdFBHUmVzdFEgPSBRdWF0ZXJuaW9uLmlkZW50aXR5KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdFBHUmVzdFE7XG4gIH1cblxuICByZXRhcmdldFF1YXRlcm5pb24oZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSk6IElRdWF0ZXJuaW9uIHtcbiAgICBjb25zdCBzcmNFbnRpdHkgPSB0aGlzLl9fc3JjRW50aXR5O1xuXG4gICAgLy8gZXh0cmFjdCBnbG9iYWwgcmV0YXJnZXQgcXVhdGVybmlvblxuICAgIGNvbnN0IHNyY1Bvc2VRID0gc3JjRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUm90YXRpb25Jbm5lcjtcbiAgICBjb25zdCBzcmNSZXN0USA9IHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uUmVzdElubmVyO1xuICAgIGNvbnN0IHNyY1BHUmVzdFEgPSB0aGlzLmdldFNyY1BHUmVzdFEoc3JjRW50aXR5KTtcblxuICAgIGNvbnN0IGFuaW1RID0gUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAgIHNyY1BHUmVzdFEsXG4gICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KFxuICAgICAgICBzcmNQb3NlUSxcbiAgICAgICAgUXVhdGVybmlvbi5tdWx0aXBseShRdWF0ZXJuaW9uLmludmVydChzcmNSZXN0USksIFF1YXRlcm5pb24uaW52ZXJ0KHNyY1BHUmVzdFEpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyByZXRhcmdldCBxdWF0ZXJuaW9uIHRvIGxvY2FsIHBvc2VcbiAgICBjb25zdCBkc3RSZXN0USA9IGRzdEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uUmVzdElubmVyO1xuICAgIGNvbnN0IGRzdFBnUmVzdFEgPSB0aGlzLmdldERzdFBHUmVzdFEoZHN0RW50aXR5KTtcblxuICAgIGNvbnN0IHRndFBvc2VRID0gUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAgIFF1YXRlcm5pb24uaW52ZXJ0KGRzdFBnUmVzdFEpLFxuICAgICAgUXVhdGVybmlvbi5tdWx0aXBseShhbmltUSwgUXVhdGVybmlvbi5tdWx0aXBseShkc3RQZ1Jlc3RRLCBkc3RSZXN0USkpXG4gICAgKTtcblxuICAgIHJldHVybiB0Z3RQb3NlUTtcbiAgfVxuXG4gIHJldGFyZ2V0VHJhbnNsYXRlKGRzdEVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpOiBJVmVjdG9yMyB7XG4gICAgY29uc3Qgc3JjRW50aXR5ID0gdGhpcy5fX3NyY0VudGl0eTtcblxuICAgIC8vIGV4dHJhY3QgZ2xvYmFsIHJldGFyZ2V0IHRyYW5zbGF0ZVxuICAgIGNvbnN0IHNyY1Bvc2VUID0gc3JjRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb25Jbm5lcjtcbiAgICBjb25zdCBzcmNSZXN0VCA9IHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uUmVzdElubmVyO1xuICAgIGNvbnN0IHNyY1BHUmVzdFEgPSB0aGlzLmdldFNyY1BHUmVzdFEoc3JjRW50aXR5KTtcbiAgICBjb25zdCBzcmNEZWx0YSA9IFZlY3RvcjMuc3VidHJhY3Qoc3JjUG9zZVQsIHNyY1Jlc3RUKTtcbiAgICBjb25zdCBBbmltVCA9IHNyY1BHUmVzdFEudHJhbnNmb3JtVmVjdG9yMyhzcmNEZWx0YSk7XG5cbiAgICAvLyByZXRhcmdldCB0cmFuc2xhdGUgdG8gbG9jYWwgcG9zZVxuICAgIGNvbnN0IGRzdFJlc3RUID0gZHN0RW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb25SZXN0SW5uZXI7XG4gICAgY29uc3QgZHN0UGdSZXN0USA9IHRoaXMuZ2V0RHN0UEdSZXN0UShkc3RFbnRpdHkpO1xuXG4gICAgY29uc3QgZHN0UG9zZVQgPSBWZWN0b3IzLmFkZChkc3RQZ1Jlc3RRLnRyYW5zZm9ybVZlY3RvcjNJbnZlcnNlKEFuaW1UKSwgZHN0UmVzdFQpO1xuXG4gICAgaWYgKHNyY0VudGl0eS51bmlxdWVOYW1lLmluZGV4T2YoJ2hpcHMnKSA+PSAwKSB7XG4gICAgICByZXR1cm4gVmVjdG9yMy5tdWx0aXBseShkc3RQb3NlVCwgc3JjRW50aXR5LnBhcmVudCEuc2NhbGUueCk7XG4gICAgfVxuICAgIHJldHVybiBkc3RQb3NlVDtcbiAgfVxuXG4gIHJldGFyZ2V0U2NhbGUoZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSk6IElWZWN0b3IzIHtcbiAgICBjb25zdCBzcmNFbnRpdHkgPSB0aGlzLl9fc3JjRW50aXR5O1xuXG4gICAgcmV0dXJuIHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFNjYWxlSW5uZXI7XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIHByZXR0aWVyL3ByZXR0aWVyICovXG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IElWZWN0b3IzLCBNYXRoVXRpbCwgTWF0cml4NDQsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tICcuLi8uLi8uLi9tYXRoJztcbmltcG9ydCB7IElRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vLi4vbWF0aC9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uLy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgSUFuaW1hdGlvblJldGFyZ2V0IH0gZnJvbSAnLi9BbmltYXRpb25SZXRhcmdldCc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxSZXRhcmdldFJldmVyc2UgaW1wbGVtZW50cyBJQW5pbWF0aW9uUmV0YXJnZXQge1xuICBwcml2YXRlIF9fc3JjRW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eTtcbiAgc3RhdGljIHJlYWRvbmx5IF9fcmV2ID0gUXVhdGVybmlvbi5mcm9tQXhpc0FuZ2xlKFZlY3RvcjMuZnJvbUNvcHkzKDAsIDEsIDApLCBNYXRoLlBJKTtcblxuICBjb25zdHJ1Y3RvcihzcmNFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgdGhpcy5fX3NyY0VudGl0eSA9IHNyY0VudGl0eTtcbiAgfVxuXG4gIGdldEVudGl0eSgpOiBJU2NlbmVHcmFwaEVudGl0eSB7XG4gICAgcmV0dXJuIHRoaXMuX19zcmNFbnRpdHk7XG4gIH1cblxuICBnZXRTcmNQR1Jlc3RRKHNyY0VudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBsZXQgc3JjUEdSZXN0UTogSVF1YXRlcm5pb247XG4gICAgY29uc3QgcGFyZW50ID0gc3JjRW50aXR5LmdldFNjZW5lR3JhcGgoKS5wYXJlbnQ7XG4gICAgaWYgKElzLmV4aXN0KHBhcmVudCkpIHtcbiAgICAgIHNyY1BHUmVzdFEgPSBwYXJlbnQuZ2V0Um90YXRpb25SZXN0KChzZykgPT4ge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZy5wYXJlbnQ7XG4gICAgICAgIGlmIChJcy5leGlzdChwYXJlbnQpKSB7XG4gICAgICAgICAgY29uc3QgdnJtID0gcGFyZW50LmVudGl0eS50cnlUb0dldFZybSgpO1xuICAgICAgICAgIHJldHVybiBJcy5leGlzdCh2cm0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3JjUEdSZXN0USA9IFF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3JjUEdSZXN0UTtcbiAgfVxuXG4gIGdldERzdFBHUmVzdFEoZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSkge1xuICAgIGxldCBkc3RQR1Jlc3RROiBJUXVhdGVybmlvbjtcbiAgICBjb25zdCBwYXJlbnQgPSBkc3RFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLnBhcmVudDtcbiAgICBpZiAoSXMuZXhpc3QocGFyZW50KSkge1xuICAgICAgZHN0UEdSZXN0USA9IHBhcmVudC5nZXRSb3RhdGlvblJlc3QoKHNnKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNnLnBhcmVudDtcbiAgICAgICAgaWYgKElzLmV4aXN0KHBhcmVudCkpIHtcbiAgICAgICAgICBjb25zdCB2cm0gPSBwYXJlbnQuZW50aXR5LnRyeVRvR2V0VnJtKCk7XG4gICAgICAgICAgcmV0dXJuIElzLmV4aXN0KHZybSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkc3RQR1Jlc3RRID0gUXVhdGVybmlvbi5pZGVudGl0eSgpO1xuICAgIH1cblxuICAgIHJldHVybiBkc3RQR1Jlc3RRO1xuICB9XG5cbiAgcmV0YXJnZXRRdWF0ZXJuaW9uKGRzdEVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpOiBJUXVhdGVybmlvbiB7XG4gICAgY29uc3Qgc3JjRW50aXR5ID0gdGhpcy5fX3NyY0VudGl0eTtcblxuICAgIC8vIGV4dHJhY3QgZ2xvYmFsIHJldGFyZ2V0IHF1YXRlcm5pb25cbiAgICBjb25zdCBzcmNQb3NlUSA9IHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uSW5uZXI7XG4gICAgY29uc3Qgc3JjUmVzdFEgPSBzcmNFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvblJlc3RJbm5lcjtcbiAgICBjb25zdCBzcmNQR1Jlc3RRID0gdGhpcy5nZXRTcmNQR1Jlc3RRKHNyY0VudGl0eSk7XG5cbiAgICBjb25zdCBhbmltUSA9IFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICBzcmNQR1Jlc3RRLFxuICAgICAgUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAgICAgc3JjUG9zZVEsXG4gICAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkoUXVhdGVybmlvbi5pbnZlcnQoc3JjUmVzdFEpLCBRdWF0ZXJuaW9uLmludmVydChzcmNQR1Jlc3RRKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gcmV0YXJnZXQgcXVhdGVybmlvbiB0byBsb2NhbCBwb3NlXG4gICAgY29uc3QgZHN0UmVzdFEgPSBkc3RFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvblJlc3RJbm5lcjtcbiAgICBjb25zdCBkc3RQZ1Jlc3RRID0gdGhpcy5nZXREc3RQR1Jlc3RRKGRzdEVudGl0eSk7XG5cbiAgICBjb25zdCB0Z3RQb3NlUSA9IFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICBRdWF0ZXJuaW9uLmludmVydChkc3RQZ1Jlc3RRKSxcbiAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkoYW5pbVEsIFF1YXRlcm5pb24ubXVsdGlwbHkoZHN0UGdSZXN0USwgZHN0UmVzdFEpKVxuICAgICk7XG5cbiAgICBjb25zdCB0Z3RQb3NlUVJldiA9IFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KEdsb2JhbFJldGFyZ2V0UmV2ZXJzZS5fX3JldiwgdGd0UG9zZVEpLFxuICAgICAgUXVhdGVybmlvbi5pbnZlcnQoR2xvYmFsUmV0YXJnZXRSZXZlcnNlLl9fcmV2KVxuICAgICk7XG5cbiAgICByZXR1cm4gdGd0UG9zZVFSZXY7XG4gIH1cblxuICByZXRhcmdldFRyYW5zbGF0ZShkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogSVZlY3RvcjMge1xuICAgIGNvbnN0IHNyY0VudGl0eSA9IHRoaXMuX19zcmNFbnRpdHk7XG5cbiAgICAvLyBleHRyYWN0IGdsb2JhbCByZXRhcmdldCB0cmFuc2xhdGVcbiAgICBjb25zdCBzcmNQb3NlVCA9IHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uSW5uZXI7XG4gICAgY29uc3Qgc3JjUmVzdFQgPSBzcmNFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxQb3NpdGlvblJlc3RJbm5lcjtcbiAgICBjb25zdCBzcmNQR1Jlc3RRID0gdGhpcy5nZXRTcmNQR1Jlc3RRKHNyY0VudGl0eSk7XG4gICAgY29uc3Qgc3JjRGVsdGEgPSBWZWN0b3IzLnN1YnRyYWN0KHNyY1Bvc2VULCBzcmNSZXN0VCk7XG4gICAgY29uc3QgQW5pbVQgPSBzcmNQR1Jlc3RRLnRyYW5zZm9ybVZlY3RvcjMoc3JjRGVsdGEpO1xuXG4gICAgLy8gcmV0YXJnZXQgdHJhbnNsYXRlIHRvIGxvY2FsIHBvc2VcbiAgICBjb25zdCBkc3RSZXN0VCA9IGRzdEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uUmVzdElubmVyO1xuICAgIGNvbnN0IGRzdFBnUmVzdFEgPSB0aGlzLmdldERzdFBHUmVzdFEoZHN0RW50aXR5KTtcblxuICAgIGNvbnN0IGRzdFBvc2VUID0gVmVjdG9yMy5hZGQoZHN0UGdSZXN0US50cmFuc2Zvcm1WZWN0b3IzSW52ZXJzZShBbmltVCksIGRzdFJlc3RUKTtcblxuICAgIGlmIChzcmNFbnRpdHkudW5pcXVlTmFtZS5pbmRleE9mKCdoaXBzJykgPj0gMCkge1xuICAgICAgY29uc3QgZHN0UG9zZVQyID0gVmVjdG9yMy5tdWx0aXBseShkc3RQb3NlVCwgc3JjRW50aXR5LnBhcmVudCEuc2NhbGUueCk7XG4gICAgICBjb25zdCBkc3RQb3NlVFJldiA9IEdsb2JhbFJldGFyZ2V0UmV2ZXJzZS5fX3Jldi50cmFuc2Zvcm1WZWN0b3IzKGRzdFBvc2VUMik7XG4gICAgICByZXR1cm4gZHN0UG9zZVRSZXY7XG4gICAgfVxuICAgIHJldHVybiBkc3RQb3NlVDtcbiAgfVxuXG4gIHJldGFyZ2V0U2NhbGUoZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSk6IElWZWN0b3IzIHtcbiAgICBjb25zdCBzcmNFbnRpdHkgPSB0aGlzLl9fc3JjRW50aXR5O1xuXG4gICAgcmV0dXJuIHNyY0VudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFNjYWxlSW5uZXI7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQW5pbWF0aW9uUmV0YXJnZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9HbG9iYWxSZXRhcmdldCc7XG5leHBvcnQgKiBmcm9tICcuL0dsb2JhbFJldGFyZ2V0UmV2ZXJzZSc7XG5leHBvcnQgKiBmcm9tICcuL0Fic29sdXRlQW5pbWF0aW9uJztcbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eVVJRCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IE1peGluQmFzZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1R5cGVHZW5lcmF0b3JzJztcbmltcG9ydCB7IFNrZWxldGFsQ29tcG9uZW50IH0gZnJvbSAnLi9Ta2VsZXRhbENvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNrZWxldGFsRW50aXR5TWV0aG9kcyB7XG4gIGdldFNrZWxldGFsKCk6IFNrZWxldGFsQ29tcG9uZW50O1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgYXBwbHlNaXhpbnMsIEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQ0JztcbmltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuLi9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgTWF0aFV0aWwgfSBmcm9tICcuLi8uLi9tYXRoL01hdGhVdGlsJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBDb21wb25lbnRUSUQsIENvbXBvbmVudFNJRCwgRW50aXR5VUlELCBJbmRleCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBHbG9iYWxEYXRhUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvR2xvYmFsRGF0YVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgQm9uZURhdGFUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQm9uZURhdGFUeXBlJztcbmltcG9ydCB7IElNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvSU1hdHJpeCc7XG5pbXBvcnQgeyBBY2Nlc3NvciB9IGZyb20gJy4uLy4uL21lbW9yeS9BY2Nlc3Nvcic7XG5pbXBvcnQgeyBJU2tlbGV0YWxFbnRpdHkgfSBmcm9tICcuLi8uLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzIH0gZnJvbSAnLi4vQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi8uLi9taXNjJztcbmltcG9ydCB7IGNyZWF0ZUdyb3VwRW50aXR5IH0gZnJvbSAnLi4vU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyBTa2VsZXRhbENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBfam9pbnRJbmRpY2VzOiBJbmRleFtdID0gW107XG4gIHByaXZhdGUgX19qb2ludHM6IFNjZW5lR3JhcGhDb21wb25lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9faW52ZXJzZUJpbmRNYXRyaWNlc0FjY2Vzc29yPzogQWNjZXNzb3I7XG4gIHB1YmxpYyBfYmluZFNoYXBlTWF0cml4PzogTWF0cml4NDQ7XG4gIHByaXZhdGUgX19qb2ludE1hdHJpY2VzPzogbnVtYmVyW107XG4gIHB1YmxpYyB0b3BPZkpvaW50c0hpZXJhcmNoeT86IFNjZW5lR3JhcGhDb21wb25lbnQ7XG4gIHB1YmxpYyBpc1NraW5uaW5nID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfX3FBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMCk7XG4gIHByaXZhdGUgX190c0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgwKTtcbiAgcHJpdmF0ZSBfX3RxQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDApO1xuICBwcml2YXRlIF9fc3FBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMCk7XG4gIHByaXZhdGUgX19xdHNBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMCk7XG4gIHByaXZhdGUgX19xdHNJbmZvID0gTXV0YWJsZVZlY3RvcjQuZHVtbXkoKTtcbiAgcHJpdmF0ZSBfX21hdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgwKTtcbiAgcHJpdmF0ZSBfX3dvcmxkTWF0cml4ID0gTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gIHByaXZhdGUgX19pc1dvcmxkTWF0cml4VmFuaWxsYSA9IHRydWU7XG4gIF9pc0N1bGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBfX2dsb2JhbERhdGFSZXBvc2l0b3J5ID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190b29rR2xvYmFsRGF0YU51bSA9IDA7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM18wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9tYXQ0ID0gTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3E6IE11dGFibGVRdWF0ZXJuaW9uID0gTXV0YWJsZVF1YXRlcm5pb24uZnJvbUNvcHk0KDAsIDAsIDAsIDEpO1xuICBwcml2YXRlIHN0YXRpYyBfX2lkZW50aXR5TWF0ID0gTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgY29tcG9uZW50U2lkOiBDb21wb25lbnRTSUQsXG4gICAgZW50aXR5UmVwb3NpdG9yeTogRW50aXR5UmVwb3NpdG9yeSxcbiAgICBpc1JlVXNlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKGVudGl0eVVpZCwgY29tcG9uZW50U2lkLCBlbnRpdHlSZXBvc2l0b3J5LCBpc1JlVXNlKTtcbiAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5Mb2dpYyk7XG5cbiAgICBpZiAoaXNSZVVzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChTa2VsZXRhbENvbXBvbmVudC5fX3Rvb2tHbG9iYWxEYXRhTnVtIDwgQ29uZmlnLm1heFNrZWxldG9uTnVtYmVyKSB7XG4gICAgICBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLk1hdDQzeDEpIHtcbiAgICAgICAgU2tlbGV0YWxDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS50YWtlT25lKCdib25lTWF0cml4Jyk7XG4gICAgICB9IGVsc2UgaWYgKENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5WZWM0eDIpIHtcbiAgICAgICAgU2tlbGV0YWxDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS50YWtlT25lKCdib25lVHJhbnNsYXRlUGFja2VkUXVhdCcpO1xuICAgICAgICBTa2VsZXRhbENvbXBvbmVudC5fX2dsb2JhbERhdGFSZXBvc2l0b3J5LnRha2VPbmUoJ2JvbmVTY2FsZVBhY2tlZFF1YXQnKTtcbiAgICAgIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mk9sZCkge1xuICAgICAgICBTa2VsZXRhbENvbXBvbmVudC5fX2dsb2JhbERhdGFSZXBvc2l0b3J5LnRha2VPbmUoJ2JvbmVRdWF0ZXJuaW9uJyk7XG4gICAgICAgIFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkudGFrZU9uZSgnYm9uZVRyYW5zbGF0ZVNjYWxlJyk7XG4gICAgICB9IGVsc2UgaWYgKENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5WZWM0eDEpIHtcbiAgICAgICAgU2tlbGV0YWxDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS50YWtlT25lKCdib25lVHJhbnNsYXRlU2NhbGUnKTtcbiAgICAgICAgU2tlbGV0YWxDb21wb25lbnQuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS50YWtlT25lKCdib25lQ29tcHJlc3NlZENodW5rJyk7XG4gICAgICB9XG4gICAgICBTa2VsZXRhbENvbXBvbmVudC5fX3Rvb2tHbG9iYWxEYXRhTnVtKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci53YXJuKCdUaGUgYWN0dWFsIG51bWJlciBvZiBTa2VsZXRvbiBnZW5lcmF0ZWQgZXhjZWVkcyBDb25maWcubWF4U2tlbGV0b25OdW1iZXIuJyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5Ta2VsZXRhbENvbXBvbmVudFRJRDtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5Ta2VsZXRhbENvbXBvbmVudFRJRDtcbiAgfVxuXG4gIHNldEludmVyc2VCaW5kTWF0cmljZXNBY2Nlc3NvcihpbnZlcnNlQmluZE1hdHJpY2VzQWNjZXNzb3I6IEFjY2Vzc29yKSB7XG4gICAgdGhpcy5fX2ludmVyc2VCaW5kTWF0cmljZXNBY2Nlc3NvciA9IGludmVyc2VCaW5kTWF0cmljZXNBY2Nlc3NvcjtcbiAgfVxuXG4gIHNldEpvaW50cyhqb2ludHM6IFNjZW5lR3JhcGhDb21wb25lbnRbXSkge1xuICAgIHRoaXMuX19qb2ludHMgPSBqb2ludHM7XG5cbiAgICAvLyBnZXQgZWFjaCBhcnJheSBkYXRhIGZyb20gZ2xvYmFsIGRhdGEgcmVwb3NpdG9yeVxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50U0lEIDwgQ29uZmlnLm1heFNrZWxldG9uTnVtYmVyKSB7XG4gICAgICBpbmRleCA9IHRoaXMuY29tcG9uZW50U0lEO1xuICAgIH1cbiAgICBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLk1hdDQzeDEpIHtcbiAgICAgIHRoaXMuX19tYXRBcnJheSA9IFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoJ2JvbmVNYXRyaXgnLCBpbmRleCkuX3Y7XG4gICAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyKSB7XG4gICAgICB0aGlzLl9fdHFBcnJheSA9IFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoXG4gICAgICAgICdib25lVHJhbnNsYXRlUGFja2VkUXVhdCcsXG4gICAgICAgIGluZGV4XG4gICAgICApLl92O1xuICAgICAgdGhpcy5fX3NxQXJyYXkgPSBTa2VsZXRhbENvbXBvbmVudC5fX2dsb2JhbERhdGFSZXBvc2l0b3J5LmdldFZhbHVlKFxuICAgICAgICAnYm9uZVNjYWxlUGFja2VkUXVhdCcsXG4gICAgICAgIGluZGV4XG4gICAgICApLl92O1xuICAgIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mk9sZCkge1xuICAgICAgdGhpcy5fX3FBcnJheSA9IFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoJ2JvbmVRdWF0ZXJuaW9uJywgaW5kZXgpLl92O1xuICAgICAgdGhpcy5fX3RzQXJyYXkgPSBTa2VsZXRhbENvbXBvbmVudC5fX2dsb2JhbERhdGFSZXBvc2l0b3J5LmdldFZhbHVlKFxuICAgICAgICAnYm9uZVRyYW5zbGF0ZVNjYWxlJyxcbiAgICAgICAgaW5kZXhcbiAgICAgICkuX3Y7XG4gICAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgxKSB7XG4gICAgICB0aGlzLl9fdHNBcnJheSA9IFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoXG4gICAgICAgICdib25lVHJhbnNsYXRlU2NhbGUnLFxuICAgICAgICBpbmRleFxuICAgICAgKS5fdjtcbiAgICAgIHRoaXMuX19xdHNBcnJheSA9IFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoXG4gICAgICAgICdib25lQ29tcHJlc3NlZENodW5rJyxcbiAgICAgICAgaW5kZXhcbiAgICAgICkuX3Y7XG4gICAgICB0aGlzLl9fcXRzSW5mbyA9IFNrZWxldGFsQ29tcG9uZW50Ll9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0VmFsdWUoJ2JvbmVDb21wcmVzc2VkSW5mbycsIDApO1xuICAgIH1cbiAgfVxuXG4gIGdldEpvaW50cygpOiBTY2VuZUdyYXBoQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9fam9pbnRzLmNvbmNhdCgpO1xuICB9XG5cbiAgZ2V0IHJvb3RKb2ludFdvcmxkTWF0cml4SW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9wT2ZKb2ludHNIaWVyYXJjaHk/Lm1hdHJpeElubmVyO1xuICB9XG5cbiAgZ2V0IGpvaW50TWF0cmljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19qb2ludE1hdHJpY2VzO1xuICB9XG5cbiAgZ2V0IGpvaW50UXVhdGVybmlvbkFycmF5KCkge1xuICAgIHJldHVybiB0aGlzLl9fcUFycmF5O1xuICB9XG5cbiAgZ2V0IGpvaW50VHJhbnNsYXRlU2NhbGVBcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RzQXJyYXk7XG4gIH1cblxuICBnZXQgam9pbnRUcmFuc2xhdGVQYWNrZWRRdWF0KCkge1xuICAgIHJldHVybiB0aGlzLl9fdHFBcnJheTtcbiAgfVxuXG4gIGdldCBqb2ludFNjYWxlUGFja2VkUXVhdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NxQXJyYXk7XG4gIH1cblxuICBnZXQgam9pbnRNYXRyaWNlc0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLl9fbWF0QXJyYXk7XG4gIH1cblxuICBnZXQgam9pbnRDb21wcmVzc2VkQ2h1bmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19xdHNBcnJheTtcbiAgfVxuXG4gIGdldCBqb2ludENvbXByZXNzZWRJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl9fcXRzSW5mbztcbiAgfVxuXG4gIGdldCB3b3JsZE1hdHJpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3dvcmxkTWF0cml4LmNsb25lKCk7XG4gIH1cblxuICBnZXQgd29ybGRNYXRyaXhJbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3dvcmxkTWF0cml4O1xuICB9XG5cbiAgZ2V0IGlzV29ybGRNYXRyaXhVcGRhdGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5fX2lzV29ybGRNYXRyaXhWYW5pbGxhO1xuICB9XG5cbiAgJGxvZ2ljKCkge1xuICAgIGlmICghdGhpcy5pc1NraW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBqb2ludCA9IHRoaXMuX19qb2ludHNbaV07XG4gICAgICBsZXQgbTtcbiAgICAgIGlmIChqb2ludC5pc1Zpc2libGUpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsSm9pbnRUcmFuc2Zvcm0gPSBqb2ludC5tYXRyaXhJbm5lcjtcblxuICAgICAgICBNdXRhYmxlTWF0cml4NDQubXVsdGlwbHlUeXBlZEFycmF5VG8oXG4gICAgICAgICAgZ2xvYmFsSm9pbnRUcmFuc2Zvcm0sXG4gICAgICAgICAgdGhpcy5fX2ludmVyc2VCaW5kTWF0cmljZXNBY2Nlc3NvciEuZ2V0VHlwZWRBcnJheSgpLFxuICAgICAgICAgIFNrZWxldGFsQ29tcG9uZW50Ll9fdG1wX21hdDQsXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5fYmluZFNoYXBlTWF0cml4KSB7XG4gICAgICAgICAgU2tlbGV0YWxDb21wb25lbnQuX190bXBfbWF0NC5tdWx0aXBseSh0aGlzLl9iaW5kU2hhcGVNYXRyaXgpOyAvLyBvbmx5IGZvciBnbFRGMVxuICAgICAgICB9XG4gICAgICAgIG0gPSBTa2VsZXRhbENvbXBvbmVudC5fX3RtcF9tYXQ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbSA9IFNrZWxldGFsQ29tcG9uZW50Ll9faWRlbnRpdHlNYXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSAwICYmIGpvaW50LmVudGl0eS50cnlUb0dldEFuaW1hdGlvbigpICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fX3dvcmxkTWF0cml4LmNvcHlDb21wb25lbnRzKG0pO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IDEgJiYgdGhpcy5fX2pvaW50c1swXS5lbnRpdHkudHJ5VG9HZXRBbmltYXRpb24oKSA9PSBudWxsKSB7XG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBqb2ludCBoYXMgbm8gYW5pbWF0aW9uIChlLmcuIFJvb3Qgam9pbnQpLCBleHBlY3QgdGhlIHNlY29uZCBqb2ludCB0byBoYXZlIGEgc2lnbmlmaWNhbnQgbWF0cml4XG4gICAgICAgIHRoaXMuX193b3JsZE1hdHJpeC5jb3B5Q29tcG9uZW50cyhtKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fX2lzV29ybGRNYXRyaXhWYW5pbGxhID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLl9pc0N1bGxlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuTWF0NDN4MSB8fFxuICAgICAgICBDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgxXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fX2NvcHlUb01hdEFycmF5KG0sIGkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSAhPT0gQm9uZURhdGFUeXBlLk1hdDQzeDEpIHtcbiAgICAgICAgY29uc3Qgc2NhbGVWZWMgPSBTa2VsZXRhbENvbXBvbmVudC5fX3RtcFZlYzNfMC5zZXRDb21wb25lbnRzKFxuICAgICAgICAgIE1hdGguaHlwb3QobS5fdlswXSwgbS5fdlsxXSwgbS5fdlsyXSksXG4gICAgICAgICAgTWF0aC5oeXBvdChtLl92WzRdLCBtLl92WzVdLCBtLl92WzZdKSxcbiAgICAgICAgICBNYXRoLmh5cG90KG0uX3ZbOF0sIG0uX3ZbOV0sIG0uX3ZbMTBdKVxuICAgICAgICApO1xuXG4gICAgICAgIG0ubTAwIC89IHNjYWxlVmVjLng7XG4gICAgICAgIG0ubTAxIC89IHNjYWxlVmVjLng7XG4gICAgICAgIG0ubTAyIC89IHNjYWxlVmVjLng7XG4gICAgICAgIG0ubTEwIC89IHNjYWxlVmVjLnk7XG4gICAgICAgIG0ubTExIC89IHNjYWxlVmVjLnk7XG4gICAgICAgIG0ubTEyIC89IHNjYWxlVmVjLnk7XG4gICAgICAgIG0ubTIwIC89IHNjYWxlVmVjLno7XG4gICAgICAgIG0ubTIxIC89IHNjYWxlVmVjLno7XG4gICAgICAgIG0ubTIyIC89IHNjYWxlVmVjLno7XG5cbiAgICAgICAgY29uc3QgcSA9IFNrZWxldGFsQ29tcG9uZW50Ll9fdG1wX3EuZnJvbU1hdHJpeChtKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mk9sZCB8fFxuICAgICAgICAgIENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5WZWM0eDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IG1heFNjYWxlID0gMTtcbiAgICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGVWZWMueCkgPiBNYXRoLmFicyhzY2FsZVZlYy55KSkge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlVmVjLngpID4gTWF0aC5hYnMoc2NhbGVWZWMueikpIHtcbiAgICAgICAgICAgICAgbWF4U2NhbGUgPSBzY2FsZVZlYy54O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWF4U2NhbGUgPSBzY2FsZVZlYy56O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGVWZWMueSkgPiBNYXRoLmFicyhzY2FsZVZlYy56KSkge1xuICAgICAgICAgICAgICBtYXhTY2FsZSA9IHNjYWxlVmVjLnk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtYXhTY2FsZSA9IHNjYWxlVmVjLno7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX190c0FycmF5W2kgKiA0ICsgM10gPSBtYXhTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyKSB7XG4gICAgICAgICAgY29uc3QgdmVjMlFQYWNrZWQgPSBNYXRoVXRpbC5wYWNrTm9ybWFsaXplZFZlYzRUb1ZlYzIoXG4gICAgICAgICAgICBxLngsXG4gICAgICAgICAgICBxLnksXG4gICAgICAgICAgICBxLnosXG4gICAgICAgICAgICBxLncsXG4gICAgICAgICAgICBNYXRoLnBvdygyLCAxMilcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuX190cUFycmF5W2kgKiA0ICsgMF0gPSBtLm0wMztcbiAgICAgICAgICB0aGlzLl9fdHFBcnJheVtpICogNCArIDFdID0gbS5tMTM7XG4gICAgICAgICAgdGhpcy5fX3RxQXJyYXlbaSAqIDQgKyAyXSA9IG0ubTIzO1xuICAgICAgICAgIHRoaXMuX19zcUFycmF5W2kgKiA0ICsgMF0gPSBzY2FsZVZlYy54O1xuICAgICAgICAgIHRoaXMuX19zcUFycmF5W2kgKiA0ICsgMV0gPSBzY2FsZVZlYy55O1xuICAgICAgICAgIHRoaXMuX19zcUFycmF5W2kgKiA0ICsgMl0gPSBzY2FsZVZlYy56O1xuXG4gICAgICAgICAgdGhpcy5fX3RxQXJyYXlbaSAqIDQgKyAzXSA9IHZlYzJRUGFja2VkWzBdO1xuICAgICAgICAgIHRoaXMuX19zcUFycmF5W2kgKiA0ICsgM10gPSB2ZWMyUVBhY2tlZFsxXTtcbiAgICAgICAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyT2xkKSB7XG4gICAgICAgICAgdGhpcy5fX3RzQXJyYXlbaSAqIDQgKyAwXSA9IG0ubTAzOyAvLyBtLmdldFRyYW5zbGF0ZSgpLnhcbiAgICAgICAgICB0aGlzLl9fdHNBcnJheVtpICogNCArIDFdID0gbS5tMTM7IC8vIG0uZ2V0VHJhbnNsYXRlKCkueVxuICAgICAgICAgIHRoaXMuX190c0FycmF5W2kgKiA0ICsgMl0gPSBtLm0yMzsgLy8gbS5nZXRUcmFuc2xhdGUoKS56XG4gICAgICAgICAgdGhpcy5fX3FBcnJheVtpICogNCArIDBdID0gcS54O1xuICAgICAgICAgIHRoaXMuX19xQXJyYXlbaSAqIDQgKyAxXSA9IHEueTtcbiAgICAgICAgICB0aGlzLl9fcUFycmF5W2kgKiA0ICsgMl0gPSBxLno7XG4gICAgICAgICAgdGhpcy5fX3FBcnJheVtpICogNCArIDNdID0gcS53O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5WZWM0eDEpIHtcbiAgICAgICAgICAvLyBwYWNrIHF1YXRlcm5pb25cbiAgICAgICAgICB0aGlzLl9fdHNBcnJheVtpICogNCArIDBdID0gbS5tMDM7IC8vIG0uZ2V0VHJhbnNsYXRlKCkueFxuICAgICAgICAgIHRoaXMuX190c0FycmF5W2kgKiA0ICsgMV0gPSBtLm0xMzsgLy8gbS5nZXRUcmFuc2xhdGUoKS55XG4gICAgICAgICAgdGhpcy5fX3RzQXJyYXlbaSAqIDQgKyAyXSA9IG0ubTIzOyAvLyBtLmdldFRyYW5zbGF0ZSgpLnpcbiAgICAgICAgICBjb25zdCB2ZWMyUVBhY2tlZCA9IE1hdGhVdGlsLnBhY2tOb3JtYWxpemVkVmVjNFRvVmVjMihcbiAgICAgICAgICAgIHEueCxcbiAgICAgICAgICAgIHEueSxcbiAgICAgICAgICAgIHEueixcbiAgICAgICAgICAgIHEudyxcbiAgICAgICAgICAgIE1hdGgucG93KDIsIDEyKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX3F0c0FycmF5W2kgKiA0ICsgMF0gPSB2ZWMyUVBhY2tlZFswXTtcbiAgICAgICAgICB0aGlzLl9fcXRzQXJyYXlbaSAqIDQgKyAxXSA9IHZlYzJRUGFja2VkWzFdO1xuICAgICAgICAgIC8vIHEubm9ybWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4MSkge1xuICAgICAgLy8gY29uc3QgbWF4U2NhbGUgPSBNYXRoLm1heCguLi5zY2FsZXMpO1xuICAgICAgbGV0IG1heEFic1ggPSAxO1xuICAgICAgbGV0IG1heEFic1kgPSAxO1xuICAgICAgbGV0IG1heEFic1ogPSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFic1ggPSBNYXRoLmFicyh0aGlzLl9fdHNBcnJheVtpICogNCArIDBdKTtcbiAgICAgICAgaWYgKGFic1ggPiBtYXhBYnNYKSB7XG4gICAgICAgICAgbWF4QWJzWCA9IGFic1g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWJzWSA9IE1hdGguYWJzKHRoaXMuX190c0FycmF5W2kgKiA0ICsgMV0pO1xuICAgICAgICBpZiAoYWJzWSA+IG1heEFic1kpIHtcbiAgICAgICAgICBtYXhBYnNZID0gYWJzWTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYnNaID0gTWF0aC5hYnModGhpcy5fX3RzQXJyYXlbaSAqIDQgKyAyXSk7XG4gICAgICAgIGlmIChhYnNaID4gbWF4QWJzWikge1xuICAgICAgICAgIG1heEFic1ogPSBhYnNaO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9fcXRzSW5mby54ID0gbWF4QWJzWDtcbiAgICAgIHRoaXMuX19xdHNJbmZvLnkgPSBtYXhBYnNZO1xuICAgICAgdGhpcy5fX3F0c0luZm8ueiA9IG1heEFic1o7XG4gICAgICB0aGlzLl9fcXRzSW5mby53ID0gMTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIHBhY2sgbm9ybWFsaXplZCBYWVogYW5kIFVuaWZvcm0gU2NhbGVcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX190c0FycmF5W2kgKiA0ICsgMF07XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLl9fdHNBcnJheVtpICogNCArIDFdO1xuICAgICAgICBjb25zdCB6ID0gdGhpcy5fX3RzQXJyYXlbaSAqIDQgKyAyXTtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLl9fdHNBcnJheVtpICogNCArIDNdO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkWCA9IHggLyBtYXhBYnNYO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkWSA9IHkgLyBtYXhBYnNZO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkWiA9IHogLyBtYXhBYnNaO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVyA9IHNjYWxlO1xuXG4gICAgICAgIGNvbnN0IHZlYzJUUGFja2VkID0gTWF0aFV0aWwucGFja05vcm1hbGl6ZWRWZWM0VG9WZWMyKFxuICAgICAgICAgIG5vcm1hbGl6ZWRYLFxuICAgICAgICAgIG5vcm1hbGl6ZWRZLFxuICAgICAgICAgIG5vcm1hbGl6ZWRaLFxuICAgICAgICAgIG5vcm1hbGl6ZWRXLFxuICAgICAgICAgIE1hdGgucG93KDIsIDEyKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9fcXRzQXJyYXlbaSAqIDQgKyAyXSA9IHZlYzJUUGFja2VkWzBdO1xuICAgICAgICB0aGlzLl9fcXRzQXJyYXlbaSAqIDQgKyAzXSA9IHZlYzJUUGFja2VkWzFdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19jb3B5VG9NYXRBcnJheShtOiBJTWF0cml4NDQsIGk6IEluZGV4KSB7XG4gICAgLy8gMCAgMSAgMiAgM1xuICAgIC8vIDQgIDUgIDYgIDdcbiAgICAvLyA4ICA5ICAxMCAxMVxuICAgIC8vIDEyIDEzIDE0IDE1XG5cbiAgICB0aGlzLl9fbWF0QXJyYXlbaSAqIDEyICsgMF0gPSBtLl92WzBdO1xuICAgIHRoaXMuX19tYXRBcnJheVtpICogMTIgKyAxXSA9IG0uX3ZbMV07XG4gICAgdGhpcy5fX21hdEFycmF5W2kgKiAxMiArIDJdID0gbS5fdlsyXTtcbiAgICB0aGlzLl9fbWF0QXJyYXlbaSAqIDEyICsgM10gPSBtLl92WzRdO1xuICAgIHRoaXMuX19tYXRBcnJheVtpICogMTIgKyA0XSA9IG0uX3ZbNV07XG4gICAgdGhpcy5fX21hdEFycmF5W2kgKiAxMiArIDVdID0gbS5fdls2XTtcbiAgICB0aGlzLl9fbWF0QXJyYXlbaSAqIDEyICsgNl0gPSBtLl92WzhdO1xuICAgIHRoaXMuX19tYXRBcnJheVtpICogMTIgKyA3XSA9IG0uX3ZbOV07XG4gICAgdGhpcy5fX21hdEFycmF5W2kgKiAxMiArIDhdID0gbS5fdlsxMF07XG4gICAgdGhpcy5fX21hdEFycmF5W2kgKiAxMiArIDldID0gbS5fdlsxMl07XG4gICAgdGhpcy5fX21hdEFycmF5W2kgKiAxMiArIDEwXSA9IG0uX3ZbMTNdO1xuICAgIHRoaXMuX19tYXRBcnJheVtpICogMTIgKyAxMV0gPSBtLl92WzE0XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJbnZlcnNlQmluZE1hdHJpY2VzQWNjZXNzb3IoKTogQWNjZXNzb3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9faW52ZXJzZUJpbmRNYXRyaWNlc0FjY2Vzc29yO1xuICB9XG5cbiAgX3NoYWxsb3dDb3B5RnJvbShjb21wb25lbnRfOiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRfIGFzIFNrZWxldGFsQ29tcG9uZW50O1xuXG4gICAgdGhpcy5fam9pbnRJbmRpY2VzID0gY29tcG9uZW50Ll9qb2ludEluZGljZXMuY29uY2F0KCk7XG4gICAgdGhpcy5zZXRKb2ludHMoY29tcG9uZW50Ll9fam9pbnRzLmNvbmNhdCgpKTtcbiAgICAvLyBjb25zdCBqb2ludHMgPSBbXTtcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudC5fX2pvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgaWYgKGNvbXBvbmVudC5fX2pvaW50c1tpXS5lbnRpdHkuX215TGF0ZXN0Q29weUVudGl0eVVJRCAhPT0gLTEpIHtcbiAgICAvLyAgICAgam9pbnRzW2ldID0gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkoXG4gICAgLy8gICAgICAgY29tcG9uZW50Ll9fam9pbnRzW2ldLmVudGl0eS5fbXlMYXRlc3RDb3B5RW50aXR5VUlEXG4gICAgLy8gICAgICkudHJ5VG9HZXRTY2VuZUdyYXBoKCkhO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICB0aGlzLnNldEpvaW50cyhbXSk7XG5cbiAgICB0aGlzLl9faW52ZXJzZUJpbmRNYXRyaWNlc0FjY2Vzc29yID0gY29tcG9uZW50Ll9faW52ZXJzZUJpbmRNYXRyaWNlc0FjY2Vzc29yO1xuICAgIGlmIChJcy5leGlzdChjb21wb25lbnQuX2JpbmRTaGFwZU1hdHJpeCkpIHtcbiAgICAgIHRoaXMuX2JpbmRTaGFwZU1hdHJpeCA9IGNvbXBvbmVudC5fYmluZFNoYXBlTWF0cml4LmNsb25lKCk7XG4gICAgfVxuICAgIGlmIChJcy5leGlzdChjb21wb25lbnQuX19qb2ludE1hdHJpY2VzKSkge1xuICAgICAgdGhpcy5fX2pvaW50TWF0cmljZXMgPSBjb21wb25lbnQuX19qb2ludE1hdHJpY2VzLmNvbmNhdCgpO1xuICAgIH1cbiAgICB0aGlzLnRvcE9mSm9pbnRzSGllcmFyY2h5ID0gY29tcG9uZW50LnRvcE9mSm9pbnRzSGllcmFyY2h5O1xuICAgIHRoaXMuaXNTa2lubmluZyA9IGNvbXBvbmVudC5pc1NraW5uaW5nO1xuICAgIHRoaXMuX19xQXJyYXkuc2V0KGNvbXBvbmVudC5fX3FBcnJheSk7XG4gICAgdGhpcy5fX3RzQXJyYXkuc2V0KGNvbXBvbmVudC5fX3RzQXJyYXkpO1xuICAgIHRoaXMuX190cUFycmF5LnNldChjb21wb25lbnQuX190cUFycmF5KTtcbiAgICB0aGlzLl9fc3FBcnJheS5zZXQoY29tcG9uZW50Ll9fc3FBcnJheSk7XG4gICAgdGhpcy5fX3F0c0FycmF5LnNldChjb21wb25lbnQuX19xdHNBcnJheSk7XG4gICAgdGhpcy5fX3F0c0luZm8uY29weUNvbXBvbmVudHMoY29tcG9uZW50Ll9fcXRzSW5mbyk7XG4gICAgdGhpcy5fX21hdEFycmF5LnNldChjb21wb25lbnQuX19tYXRBcnJheSk7XG4gICAgdGhpcy5fX3dvcmxkTWF0cml4LmNvcHlDb21wb25lbnRzKGNvbXBvbmVudC5fX3dvcmxkTWF0cml4KTtcbiAgICB0aGlzLl9faXNXb3JsZE1hdHJpeFZhbmlsbGEgPSBjb21wb25lbnQuX19pc1dvcmxkTWF0cml4VmFuaWxsYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIHRoZSBlbnRpdHkgd2hpY2ggaGFzIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBnZXQgZW50aXR5KCk6IElTa2VsZXRhbEVudGl0eSB7XG4gICAgcmV0dXJuIEVudGl0eVJlcG9zaXRvcnkuZ2V0RW50aXR5KHRoaXMuX19lbnRpdHlVaWQpIGFzIHVua25vd24gYXMgSVNrZWxldGFsRW50aXR5O1xuICB9XG5cbiAgX2Rlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIuX2Rlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQWRkIHRoaXMgY29tcG9uZW50IHRvIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIGJhc2UgdGhlIHRhcmdldCBlbnRpdHlcbiAgICogQHBhcmFtIF9jb21wb25lbnRDbGFzcyB0aGUgY29tcG9uZW50IGNsYXNzIHRvIGFkZFxuICAgKi9cbiAgYWRkVGhpc0NvbXBvbmVudFRvRW50aXR5PEVudGl0eUJhc2UgZXh0ZW5kcyBJRW50aXR5LCBTb21lQ29tcG9uZW50Q2xhc3MgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PihcbiAgICBiYXNlOiBFbnRpdHlCYXNlLFxuICAgIF9jb21wb25lbnRDbGFzczogU29tZUNvbXBvbmVudENsYXNzXG4gICkge1xuICAgIGNsYXNzIFNrZWxldGFsRW50aXR5IGV4dGVuZHMgKGJhc2UuY29uc3RydWN0b3IgYXMgYW55KSB7XG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50aXR5VUlEOiBFbnRpdHlVSUQsXG4gICAgICAgIGlzQWxpdmU6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBvbmVudHM/OiBNYXA8Q29tcG9uZW50VElELCBDb21wb25lbnQ+XG4gICAgICApIHtcbiAgICAgICAgc3VwZXIoZW50aXR5VUlELCBpc0FsaXZlLCBjb21wb25lbnRzKTtcbiAgICAgIH1cblxuICAgICAgZ2V0U2tlbGV0YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2tlbGV0YWxDb21wb25lbnRUSURcbiAgICAgICAgKSBhcyBTa2VsZXRhbENvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlNaXhpbnMoYmFzZSwgU2tlbGV0YWxFbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG5cbiAgX2dldEludmVyc2VCaW5kTWF0cmljZXMoc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpOiBJTWF0cml4NDQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fX2pvaW50cy5pbmRleE9mKHNnKTtcbiAgICBjb25zdCBmbG9hdDMyQXJyYXkgPSB0aGlzLl9faW52ZXJzZUJpbmRNYXRyaWNlc0FjY2Vzc29yIS5nZXRUeXBlZEFycmF5KCkgYXMgRmxvYXQzMkFycmF5O1xuICAgIGNvbnN0IG0gPSBuZXcgTWF0cml4NDQoZmxvYXQzMkFycmF5LnNsaWNlKGluZGV4ICogMTYsIGluZGV4ICogMTYgKyAxNikpO1xuICAgIHJldHVybiBtO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IElTa2VsZXRhbEVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IGNyZWF0ZUdyb3VwRW50aXR5IH0gZnJvbSAnLi4vU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTa2VsZXRhbEVudGl0eSgpOiBJU2tlbGV0YWxFbnRpdHkge1xuICBjb25zdCBlbnRpdHkgPSBjcmVhdGVHcm91cEVudGl0eSgpO1xuICBjb25zdCBlbnRpdHlBZGRlZENvbXBvbmVudCA9IEVudGl0eVJlcG9zaXRvcnkudHJ5VG9BZGRDb21wb25lbnRUb0VudGl0eUJ5VElEKFxuICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2tlbGV0YWxDb21wb25lbnRUSUQsXG4gICAgZW50aXR5XG4gICkgYXMgSVNrZWxldGFsRW50aXR5O1xuICByZXR1cm4gZW50aXR5QWRkZWRDb21wb25lbnQ7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvblJldGFyZ2V0JztcbmV4cG9ydCAqIGZyb20gJy4vSVNrZWxldGFsRW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vU2tlbGV0YWxDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGVTa2VsZXRhbEVudGl0eSc7XG4iLCJpbXBvcnQgeyBJVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uL21hdGgvSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgSU1hdHJpeDQ0IH0gZnJvbSAnLi4vLi4vbWF0aC9JTWF0cml4JztcbmltcG9ydCB7IFRyYW5zZm9ybUNvbXBvbmVudCB9IGZyb20gJy4vVHJhbnNmb3JtQ29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJVHJhbnNmb3JtRW50aXR5TWV0aG9kcyB7XG4gIGdldFRyYW5zZm9ybSgpOiBUcmFuc2Zvcm1Db21wb25lbnQ7XG4gIGxvY2FsUG9zaXRpb246IElWZWN0b3IzO1xuICBsb2NhbFNjYWxlOiBJVmVjdG9yMztcbiAgbG9jYWxFdWxlckFuZ2xlczogSVZlY3RvcjM7XG4gIGxvY2FsUm90YXRpb246IElRdWF0ZXJuaW9uO1xuICBsb2NhbE1hdHJpeDogSU1hdHJpeDQ0O1xuICBsb2NhbFBvc2l0aW9uSW5uZXI6IElWZWN0b3IzO1xuICBsb2NhbFNjYWxlSW5uZXI6IElWZWN0b3IzO1xuICBsb2NhbEV1bGVyQW5nbGVzSW5uZXI6IElWZWN0b3IzO1xuICBsb2NhbFJvdGF0aW9uSW5uZXI6IElRdWF0ZXJuaW9uO1xuICBsb2NhbE1hdHJpeElubmVyOiBJTWF0cml4NDQ7XG4gIGxvY2FsUG9zaXRpb25SZXN0OiBJVmVjdG9yMztcbiAgbG9jYWxTY2FsZVJlc3Q6IElWZWN0b3IzO1xuICBsb2NhbEV1bGVyQW5nbGVzUmVzdDogSVZlY3RvcjM7XG4gIGxvY2FsUm90YXRpb25SZXN0OiBJUXVhdGVybmlvbjtcbiAgbG9jYWxNYXRyaXhSZXN0OiBJTWF0cml4NDQ7XG4gIGxvY2FsUG9zaXRpb25SZXN0SW5uZXI6IElWZWN0b3IzO1xuICBsb2NhbFNjYWxlUmVzdElubmVyOiBJVmVjdG9yMztcbiAgbG9jYWxFdWxlckFuZ2xlc1Jlc3RJbm5lcjogSVZlY3RvcjM7XG4gIGxvY2FsUm90YXRpb25SZXN0SW5uZXI6IElRdWF0ZXJuaW9uO1xuICBsb2NhbE1hdHJpeFJlc3RJbm5lcjogSU1hdHJpeDQ0O1xufVxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBhcHBseU1peGlucywgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBQcm9jZXNzU3RhZ2UgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzU3RhZ2UnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgQ29tcG9uZW50U0lELCBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uL21hdGgvSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgSU1hdHJpeDQ0IH0gZnJvbSAnLi4vLi4vbWF0aC9JTWF0cml4JztcbmltcG9ydCB7IElWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9JVmVjdG9yJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9Db21wb25lbnRUeXBlcyc7XG5pbXBvcnQgeyBJVHJhbnNmb3JtRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBNdXRhYmxlUXVhdGVybmlvbiwgVHJhbnNmb3JtM0QgfSBmcm9tICcuLi8uLi9tYXRoJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vLi4vbWlzYyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Db21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIF9fcmVzdDogVHJhbnNmb3JtM0QgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX19wb3NlID0gbmV3IFRyYW5zZm9ybTNEKCk7XG4gIHByaXZhdGUgX191cGRhdGVDb3VudEF0TGFzdExvZ2ljID0gMDtcblxuICBwcml2YXRlIHN0YXRpYyBfX3VwZGF0ZUNvdW50ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlVaWQ6IEVudGl0eVVJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRCxcbiAgICBlbnRpdHlDb21wb25lbnQ6IEVudGl0eVJlcG9zaXRvcnksXG4gICAgaXNSZVVzZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihlbnRpdHlVaWQsIGNvbXBvbmVudFNpZCwgZW50aXR5Q29tcG9uZW50LCBpc1JlVXNlKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmVuZGVyZWRQcm9wZXJ0eUNvdW50KCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb25lbnRUSUQoKTogQ29tcG9uZW50VElEIHtcbiAgICByZXR1cm4gV2VsbEtub3duQ29tcG9uZW50VElEcy5UcmFuc2Zvcm1Db21wb25lbnRUSUQ7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuVHJhbnNmb3JtQ29tcG9uZW50VElEO1xuICB9XG5cbiAgZ2V0IHJlc3RPclBvc2UoKSB7XG4gICAgaWYgKHRoaXMuX19yZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fcmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX19wb3NlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgdXBkYXRlQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX191cGRhdGVDb3VudDtcbiAgfVxuXG4gIF9iYWNrdXBUcmFuc2Zvcm1Bc1Jlc3QoKSB7XG4gICAgaWYgKHRoaXMuX19yZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX19yZXN0ID0gdGhpcy5fX3Bvc2UuY2xvbmUoKTtcbiAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSB0aGlzLmVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKSE7XG4gICAgICBzY2VuZUdyYXBoQ29tcG9uZW50LnNldFdvcmxkTWF0cml4UmVzdERpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgX3Jlc3RvcmVUcmFuc2Zvcm1Gcm9tUmVzdCgpIHtcbiAgICBpZiAodGhpcy5fX3Jlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9fcG9zZS5zZXRUcmFuc2Zvcm0oXG4gICAgICB0aGlzLl9fcmVzdC5wb3NpdGlvbklubmVyLFxuICAgICAgTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlWZWN0b3IzKHRoaXMuX19yZXN0LmV1bGVyQW5nbGVzSW5uZXIpLFxuICAgICAgdGhpcy5fX3Jlc3Quc2NhbGVJbm5lcixcbiAgICAgIE11dGFibGVRdWF0ZXJuaW9uLmZyb21Db3B5UXVhdGVybmlvbih0aGlzLl9fcmVzdC5yb3RhdGlvbklubmVyKSxcbiAgICAgIHRoaXMuX19yZXN0Lm1hdHJpeElubmVyXG4gICAgKTtcbiAgfVxuXG4gIGdldCBsb2NhbFRyYW5zZm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Bvc2U7XG4gIH1cblxuICBzZXQgbG9jYWxUcmFuc2Zvcm0odHJhbnNmb3JtOiBUcmFuc2Zvcm0zRCkge1xuICAgIHRoaXMuX19wb3NlLnNldFRyYW5zZm9ybShcbiAgICAgIHRyYW5zZm9ybS5wb3NpdGlvbklubmVyLFxuICAgICAgTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlWZWN0b3IzKHRyYW5zZm9ybS5ldWxlckFuZ2xlc0lubmVyKSxcbiAgICAgIHRyYW5zZm9ybS5zY2FsZUlubmVyLFxuICAgICAgTXV0YWJsZVF1YXRlcm5pb24uZnJvbUNvcHlRdWF0ZXJuaW9uKHRyYW5zZm9ybS5yb3RhdGlvbklubmVyKSxcbiAgICAgIHRyYW5zZm9ybS5tYXRyaXhJbm5lclxuICAgICk7XG4gICAgVHJhbnNmb3JtQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCBsb2NhbFRyYW5zZm9ybVJlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdE9yUG9zZTtcbiAgfVxuXG4gIHNldCBsb2NhbFRyYW5zZm9ybVJlc3QodHJhbnNmb3JtOiBUcmFuc2Zvcm0zRCkge1xuICAgIGlmIChJcy51bmRlZmluZWQodGhpcy5fX3Jlc3QpKSB7XG4gICAgICB0aGlzLl9fcmVzdCA9IG5ldyBUcmFuc2Zvcm0zRCgpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVzdC5zZXRUcmFuc2Zvcm0oXG4gICAgICB0cmFuc2Zvcm0ucG9zaXRpb25Jbm5lcixcbiAgICAgIE11dGFibGVWZWN0b3IzLmZyb21Db3B5VmVjdG9yMyh0cmFuc2Zvcm0uZXVsZXJBbmdsZXNJbm5lciksXG4gICAgICB0cmFuc2Zvcm0uc2NhbGVJbm5lcixcbiAgICAgIE11dGFibGVRdWF0ZXJuaW9uLmZyb21Db3B5UXVhdGVybmlvbih0cmFuc2Zvcm0ucm90YXRpb25Jbm5lciksXG4gICAgICB0cmFuc2Zvcm0ubWF0cml4SW5uZXJcbiAgICApO1xuICAgIFRyYW5zZm9ybUNvbXBvbmVudC5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICBzZXQgbG9jYWxQb3NpdGlvbih2ZWM6IElWZWN0b3IzKSB7XG4gICAgdGhpcy5fX3Bvc2UucG9zaXRpb24gPSB2ZWM7XG4gICAgVHJhbnNmb3JtQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGEgbG9jYWwgdHJhbnNsYXRlIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wb3NlLnBvc2l0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHRyYW5zbGF0ZSB2ZWN0b3JcbiAgICovXG4gIGdldCBsb2NhbFBvc2l0aW9uSW5uZXIoKTogTXV0YWJsZVZlY3RvcjMge1xuICAgIHJldHVybiB0aGlzLl9fcG9zZS5wb3NpdGlvbklubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCBhIGxvY2FsIHRyYW5zbGF0ZSB2ZWN0b3IgYXMgUmVzdFxuICAgKi9cbiAgc2V0IGxvY2FsUG9zaXRpb25SZXN0KHZlYzogSVZlY3RvcjMpIHtcbiAgICBpZiAoSXMudW5kZWZpbmVkKHRoaXMuX19yZXN0KSkge1xuICAgICAgdGhpcy5fX3Jlc3QgPSB0aGlzLl9fcG9zZS5jbG9uZSgpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVzdC5wb3NpdGlvbiA9IHZlYztcbiAgICBUcmFuc2Zvcm1Db21wb25lbnQuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGNvcHkgb2YgYSBsb2NhbCB0cmFuc2xhdGUgdmVjdG9yXG4gICAqL1xuICBnZXQgbG9jYWxQb3NpdGlvblJlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdE9yUG9zZS5wb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBsb2NhbCB0cmFuc2xhdGUgdmVjdG9yXG4gICAqL1xuICBnZXQgbG9jYWxQb3NpdGlvblJlc3RJbm5lcigpOiBNdXRhYmxlVmVjdG9yMyB7XG4gICAgcmV0dXJuIHRoaXMucmVzdE9yUG9zZS5wb3NpdGlvbklubmVyO1xuICB9XG5cbiAgc2V0IGxvY2FsRXVsZXJBbmdsZXModmVjOiBJVmVjdG9yMykge1xuICAgIHRoaXMuX19wb3NlLmV1bGVyQW5nbGVzID0gdmVjO1xuICAgIFRyYW5zZm9ybUNvbXBvbmVudC5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGEgY29weSBvZiBhIGxvY2FsIHJvdGF0aW9uIChYWVogZXVsZXIpIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsRXVsZXJBbmdsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wb3NlLmV1bGVyQW5nbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHJvdGF0aW9uIChYWVogZXVsZXIpIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsRXVsZXJBbmdsZXNJbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Bvc2UuZXVsZXJBbmdsZXNJbm5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYSBsb2NhbCByb3RhdGlvbiAoWFlaIGV1bGVyKSB2ZWN0b3IgYXMgUmVzdFxuICAgKi9cbiAgc2V0IGxvY2FsRXVsZXJBbmdsZXNSZXN0KHZlYzogSVZlY3RvcjMpIHtcbiAgICBpZiAoSXMudW5kZWZpbmVkKHRoaXMuX19yZXN0KSkge1xuICAgICAgdGhpcy5fX3Jlc3QgPSB0aGlzLl9fcG9zZS5jbG9uZSgpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVzdC5ldWxlckFuZ2xlcyA9IHZlYztcbiAgICBUcmFuc2Zvcm1Db21wb25lbnQuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGNvcHkgb2YgYSBsb2NhbCByb3RhdGlvbiAoWFlaIGV1bGVyKSB2ZWN0b3JcbiAgICovXG4gIGdldCBsb2NhbEV1bGVyQW5nbGVzUmVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0T3JQb3NlLmV1bGVyQW5nbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHJvdGF0aW9uIChYWVogZXVsZXIpIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsRXVsZXJBbmdsZXNSZXN0SW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdE9yUG9zZS5ldWxlckFuZ2xlc0lubmVyO1xuICB9XG5cbiAgc2V0IGxvY2FsU2NhbGUodmVjOiBJVmVjdG9yMykge1xuICAgIHRoaXMuX19wb3NlLnNjYWxlID0gdmVjO1xuICAgIFRyYW5zZm9ybUNvbXBvbmVudC5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGEgY29weSBvZiBhIGxvY2FsIHNjYWxlIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsU2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wb3NlLnNjYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHNjYWxlIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsU2NhbGVJbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Bvc2Uuc2NhbGVJbm5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYSBsb2NhbCBzY2FsZSB2ZWN0b3IgYXMgUmVzdFxuICAgKi9cbiAgc2V0IGxvY2FsU2NhbGVSZXN0KHZlYzogSVZlY3RvcjMpIHtcbiAgICBpZiAoSXMudW5kZWZpbmVkKHRoaXMuX19yZXN0KSkge1xuICAgICAgdGhpcy5fX3Jlc3QgPSB0aGlzLl9fcG9zZS5jbG9uZSgpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVzdC5zY2FsZSA9IHZlYztcbiAgICBUcmFuc2Zvcm1Db21wb25lbnQuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGNvcHkgb2YgYSBsb2NhbCBzY2FsZSB2ZWN0b3JcbiAgICovXG4gIGdldCBsb2NhbFNjYWxlUmVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0T3JQb3NlLnNjYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHNjYWxlIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsU2NhbGVSZXN0SW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdE9yUG9zZS5zY2FsZUlubmVyO1xuICB9XG5cbiAgc2V0IGxvY2FsUm90YXRpb24ocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICB0aGlzLl9fcG9zZS5yb3RhdGlvbiA9IHF1YXQ7XG4gICAgVHJhbnNmb3JtQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGEgbG9jYWwgcXVhdGVybmlvbiB2ZWN0b3JcbiAgICovXG4gIGdldCBsb2NhbFJvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9fcG9zZS5yb3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBsb2NhbCBxdWF0ZXJuaW9uIHZlY3RvclxuICAgKi9cbiAgZ2V0IGxvY2FsUm90YXRpb25Jbm5lcigpOiBRdWF0ZXJuaW9uIHtcbiAgICByZXR1cm4gdGhpcy5fX3Bvc2Uucm90YXRpb25Jbm5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYSBsb2NhbCBxdWF0ZXJuaW9uIHZlY3RvciBhcyBSZXN0XG4gICAqL1xuICBzZXQgbG9jYWxSb3RhdGlvblJlc3QocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICBpZiAoSXMudW5kZWZpbmVkKHRoaXMuX19yZXN0KSkge1xuICAgICAgdGhpcy5fX3Jlc3QgPSB0aGlzLl9fcG9zZS5jbG9uZSgpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVzdC5yb3RhdGlvbiA9IHF1YXQ7XG4gICAgVHJhbnNmb3JtQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGEgbG9jYWwgcXVhdGVybmlvbiB2ZWN0b3JcbiAgICovXG4gIGdldCBsb2NhbFJvdGF0aW9uUmVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0T3JQb3NlLnJvdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHF1YXRlcm5pb24gdmVjdG9yXG4gICAqL1xuICBnZXQgbG9jYWxSb3RhdGlvblJlc3RJbm5lcigpOiBRdWF0ZXJuaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0T3JQb3NlLnJvdGF0aW9uSW5uZXI7XG4gIH1cblxuICBzZXQgbG9jYWxNYXRyaXgobWF0OiBJTWF0cml4NDQpIHtcbiAgICB0aGlzLl9fcG9zZS5tYXRyaXggPSBtYXQ7XG4gICAgVHJhbnNmb3JtQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGxvY2FsIHRyYW5zZm9ybSBtYXRyaXhcbiAgICovXG4gIGdldCBsb2NhbE1hdHJpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Bvc2UubWF0cml4O1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHRyYW5zZm9ybSBtYXRyaXhcbiAgICovXG4gIGdldCBsb2NhbE1hdHJpeElubmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9fcG9zZS5tYXRyaXhJbm5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYSBsb2NhbCB0cmFuc2Zvcm0gbWF0cml4IGFzIFJlc3RcbiAgICovXG4gIHNldCBsb2NhbE1hdHJpeFJlc3QobWF0OiBJTWF0cml4NDQpIHtcbiAgICBpZiAoSXMudW5kZWZpbmVkKHRoaXMuX19yZXN0KSkge1xuICAgICAgdGhpcy5fX3Jlc3QgPSB0aGlzLl9fcG9zZS5jbG9uZSgpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVzdC5tYXRyaXggPSBtYXQ7XG4gICAgVHJhbnNmb3JtQ29tcG9uZW50Ll9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGxvY2FsIHRyYW5zZm9ybSBtYXRyaXhcbiAgICovXG4gIGdldCBsb2NhbE1hdHJpeFJlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdE9yUG9zZS5tYXRyaXg7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGEgbG9jYWwgdHJhbnNmb3JtIG1hdHJpeFxuICAgKi9cbiAgZ2V0IGxvY2FsTWF0cml4UmVzdElubmVyKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3RPclBvc2UubWF0cml4SW5uZXI7XG4gIH1cblxuICAkbG9hZCgpIHtcbiAgICB0aGlzLm1vdmVTdGFnZVRvKFByb2Nlc3NTdGFnZS5Mb2dpYyk7XG4gIH1cblxuICAkbG9naWMoKSB7XG4gICAgaWYgKHRoaXMuX191cGRhdGVDb3VudEF0TGFzdExvZ2ljICE9PSB0aGlzLl9fcG9zZS51cGRhdGVDb3VudCkge1xuICAgICAgdGhpcy5lbnRpdHkudHJ5VG9HZXRTY2VuZUdyYXBoKCkhLnNldFdvcmxkTWF0cml4RGlydHkoKTtcbiAgICAgIHRoaXMuX191cGRhdGVDb3VudEF0TGFzdExvZ2ljID0gdGhpcy5fX3Bvc2UudXBkYXRlQ291bnQ7XG4gICAgfVxuICB9XG5cbiAgX3NoYWxsb3dDb3B5RnJvbShjb21wb25lbnRfOiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRfIGFzIFRyYW5zZm9ybUNvbXBvbmVudDtcbiAgICB0aGlzLl9fcG9zZSA9IGNvbXBvbmVudC5fX3Bvc2UuY2xvbmUoKTtcbiAgICBpZiAoY29tcG9uZW50Ll9fcmVzdCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fcmVzdCA9IGNvbXBvbmVudC5fX3Jlc3QuY2xvbmUoKTtcbiAgICB9XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50QXRMYXN0TG9naWMgPSBjb21wb25lbnQuX191cGRhdGVDb3VudEF0TGFzdExvZ2ljO1xuICAgIFRyYW5zZm9ybUNvbXBvbmVudC5fX3VwZGF0ZUNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBlbnRpdHkgd2hpY2ggaGFzIHRoaXMgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyB0aGUgZW50aXR5IHdoaWNoIGhhcyB0aGlzIGNvbXBvbmVudFxuICAgKi9cbiAgZ2V0IGVudGl0eSgpOiBJVHJhbnNmb3JtRW50aXR5IHtcbiAgICByZXR1cm4gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkodGhpcy5fX2VudGl0eVVpZCkgYXMgdW5rbm93biBhcyBJVHJhbnNmb3JtRW50aXR5O1xuICB9XG5cbiAgX2Rlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIuX2Rlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQWRkIHRoaXMgY29tcG9uZW50IHRvIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIGJhc2UgdGhlIHRhcmdldCBlbnRpdHlcbiAgICogQHBhcmFtIF9jb21wb25lbnRDbGFzcyB0aGUgY29tcG9uZW50IGNsYXNzIHRvIGFkZFxuICAgKi9cbiAgYWRkVGhpc0NvbXBvbmVudFRvRW50aXR5PEVudGl0eUJhc2UgZXh0ZW5kcyBJRW50aXR5LCBTb21lQ29tcG9uZW50Q2xhc3MgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PihcbiAgICBiYXNlOiBFbnRpdHlCYXNlLFxuICAgIF9jb21wb25lbnRDbGFzczogU29tZUNvbXBvbmVudENsYXNzXG4gICkge1xuICAgIGNsYXNzIFRyYW5zZm9ybUVudGl0eSBleHRlbmRzIChiYXNlLmNvbnN0cnVjdG9yIGFzIGFueSkge1xuICAgICAgcHJpdmF0ZSBfX3RyYW5zZm9ybUNvbXBvbmVudD86IFRyYW5zZm9ybUNvbXBvbmVudDtcbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbnRpdHlVSUQ6IEVudGl0eVVJRCxcbiAgICAgICAgaXNBbGl2ZTogYm9vbGVhbixcbiAgICAgICAgY29tcG9uZW50cz86IE1hcDxDb21wb25lbnRUSUQsIENvbXBvbmVudD5cbiAgICAgICkge1xuICAgICAgICBzdXBlcihlbnRpdHlVSUQsIGlzQWxpdmUsIGNvbXBvbmVudHMpO1xuICAgICAgfVxuXG4gICAgICBnZXRUcmFuc2Zvcm0oKTogVHJhbnNmb3JtQ29tcG9uZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX190cmFuc2Zvcm1Db21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX190cmFuc2Zvcm1Db21wb25lbnQgPSB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5UcmFuc2Zvcm1Db21wb25lbnRUSURcbiAgICAgICAgICApIGFzIFRyYW5zZm9ybUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fX3RyYW5zZm9ybUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIHNldCBsb2NhbFBvc2l0aW9uKHZlYzogSVZlY3RvcjMpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsUG9zaXRpb24gPSB2ZWM7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxQb3NpdGlvbklubmVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxQb3NpdGlvbklubmVyKCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zZm9ybSgpO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLmxvY2FsUG9zaXRpb25Jbm5lcjtcbiAgICAgIH1cbiAgICAgIHNldCBsb2NhbFBvc2l0aW9uUmVzdCh2ZWM6IElWZWN0b3IzKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uUmVzdCA9IHZlYztcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbFBvc2l0aW9uUmVzdCgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uUmVzdDtcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbFBvc2l0aW9uUmVzdElubmVyKCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zZm9ybSgpO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLmxvY2FsUG9zaXRpb25SZXN0SW5uZXI7XG4gICAgICB9XG4gICAgICBzZXQgbG9jYWxTY2FsZSh2ZWM6IElWZWN0b3IzKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbFNjYWxlID0gdmVjO1xuICAgICAgfVxuICAgICAgZ2V0IGxvY2FsU2NhbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsU2NhbGVJbm5lci5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgZ2V0IGxvY2FsU2NhbGVJbm5lcigpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5sb2NhbFNjYWxlSW5uZXI7XG4gICAgICB9XG4gICAgICBzZXQgbG9jYWxTY2FsZVJlc3QodmVjOiBJVmVjdG9yMykge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zZm9ybSgpO1xuICAgICAgICB0cmFuc2Zvcm0ubG9jYWxTY2FsZVJlc3QgPSB2ZWM7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxTY2FsZVJlc3QoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ubG9jYWxTY2FsZVJlc3Q7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxTY2FsZVJlc3RJbm5lcigpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5sb2NhbFNjYWxlUmVzdElubmVyO1xuICAgICAgfVxuICAgICAgc2V0IGxvY2FsRXVsZXJBbmdsZXModmVjOiBJVmVjdG9yMykge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zZm9ybSgpO1xuICAgICAgICB0cmFuc2Zvcm0ubG9jYWxFdWxlckFuZ2xlcyA9IHZlYztcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbEV1bGVyQW5nbGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbEV1bGVyQW5nbGVzSW5uZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbEV1bGVyQW5nbGVzSW5uZXIoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ubG9jYWxFdWxlckFuZ2xlc0lubmVyO1xuICAgICAgfVxuICAgICAgc2V0IGxvY2FsRXVsZXJBbmdsZXNSZXN0KHZlYzogSVZlY3RvcjMpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsRXVsZXJBbmdsZXNSZXN0ID0gdmVjO1xuICAgICAgfVxuICAgICAgZ2V0IGxvY2FsRXVsZXJBbmdsZXNSZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbEV1bGVyQW5nbGVzUmVzdElubmVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxFdWxlckFuZ2xlc1Jlc3RJbm5lcigpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5sb2NhbEV1bGVyQW5nbGVzUmVzdElubmVyO1xuICAgICAgfVxuICAgICAgc2V0IGxvY2FsUm90YXRpb24ocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsUm90YXRpb24gPSBxdWF0O1xuICAgICAgfVxuICAgICAgZ2V0IGxvY2FsUm90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsUm90YXRpb25Jbm5lci5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgZ2V0IGxvY2FsUm90YXRpb25Jbm5lcigpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uSW5uZXI7XG4gICAgICB9XG4gICAgICBzZXQgbG9jYWxSb3RhdGlvblJlc3QocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsUm90YXRpb25SZXN0ID0gcXVhdDtcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbFJvdGF0aW9uUmVzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxRdWF0ZXJuaW9uUmVzdElubmVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxSb3RhdGlvblJlc3RJbm5lcigpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uUmVzdElubmVyO1xuICAgICAgfVxuICAgICAgc2V0IGxvY2FsTWF0cml4KG1hdDogSU1hdHJpeDQ0KSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbE1hdHJpeCA9IG1hdDtcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbE1hdHJpeCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxNYXRyaXhJbm5lci5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgZ2V0IGxvY2FsTWF0cml4SW5uZXIoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ubG9jYWxNYXRyaXhJbm5lcjtcbiAgICAgIH1cbiAgICAgIHNldCBsb2NhbE1hdHJpeFJlc3QobWF0OiBJTWF0cml4NDQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsTWF0cml4UmVzdCA9IG1hdDtcbiAgICAgIH1cbiAgICAgIGdldCBsb2NhbE1hdHJpeFJlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsTWF0cml4UmVzdElubmVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICBnZXQgbG9jYWxNYXRyaXhSZXN0SW5uZXIoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ubG9jYWxNYXRyaXhSZXN0SW5uZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGFwcGx5TWl4aW5zKGJhc2UsIFRyYW5zZm9ybUVudGl0eSk7XG4gICAgcmV0dXJuIGJhc2UgYXMgdW5rbm93biBhcyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8U29tZUNvbXBvbmVudENsYXNzPiAmIEVudGl0eUJhc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVRyYW5zZm9ybUVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9XZWxsS25vd25Db21wb25lbnRUSURzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zZm9ybUVudGl0eSgpOiBJVHJhbnNmb3JtRW50aXR5IHtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5UmVwb3NpdG9yeS5jcmVhdGVFbnRpdHkoKTtcbiAgY29uc3QgZW50aXR5MSA9IEVudGl0eVJlcG9zaXRvcnkudHJ5VG9BZGRDb21wb25lbnRUb0VudGl0eUJ5VElEKFxuICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuVHJhbnNmb3JtQ29tcG9uZW50VElELFxuICAgIGVudGl0eVxuICApIGFzIElUcmFuc2Zvcm1FbnRpdHk7XG4gIHJldHVybiBlbnRpdHkxO1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9JVHJhbnNmb3JtRW50aXR5JztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNmb3JtQ29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY3JlYXRlVHJhbnNmb3JtRW50aXR5JztcbiIsImltcG9ydCB7IElWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9JVmVjdG9yJztcbmltcG9ydCB7IElRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vbWF0aC9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJTWF0cml4MjIgfSBmcm9tICcuLi8uLi9tYXRoL0lNYXRyaXgnO1xuaW1wb3J0IHsgVnJtQ29tcG9uZW50IH0gZnJvbSAnLi9Wcm1Db21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElWcm1FbnRpdHlNZXRob2RzIHtcbiAgZ2V0VnJtKCk6IFZybUNvbXBvbmVudDtcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudFNJRCwgQ29tcG9uZW50VElELCBFbnRpdHlVSUQsIEluZGV4IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uLy4uL2NvcmUvRW50aXR5JztcbmltcG9ydCB7IGFwcGx5TWl4aW5zLCBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NTdGFnZSc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uL21pc2MnO1xuaW1wb3J0IHsgQmxlbmRTaGFwZUNvbXBvbmVudCB9IGZyb20gJy4uL0JsZW5kU2hhcGUvQmxlbmRTaGFwZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9Db21wb25lbnRUeXBlcyc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5cbmV4cG9ydCB0eXBlIFZybUV4cHJlc3Npb25OYW1lID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgVnJtRXhwcmVzc2lvbk1vcnBoQmluZCA9IHtcbiAgZW50aXR5SWR4OiBJbmRleDsgLy9cbiAgYmxlbmRTaGFwZUlkeDogSW5kZXg7IC8vIG1vcnBoIHRhcmdldCBpbmRleCBpbiBwcmltaXRpdmVcbiAgd2VpZ2h0OiBudW1iZXI7IC8vIFswLDFdXG59O1xuZXhwb3J0IHR5cGUgVnJtRXhwcmVzc2lvbiA9IHtcbiAgbmFtZTogVnJtRXhwcmVzc2lvbk5hbWU7XG4gIGlzQmluYXJ5OiBib29sZWFuO1xuICBiaW5kczogVnJtRXhwcmVzc2lvbk1vcnBoQmluZFtdO1xufTtcblxuZXhwb3J0IGNsYXNzIFZybUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgX19leHByZXNzaW9uczogTWFwPFZybUV4cHJlc3Npb25OYW1lLCBWcm1FeHByZXNzaW9uPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX3dlaWdodHM6IE1hcDxWcm1FeHByZXNzaW9uTmFtZSwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX2JsZW5kU2hhcGVDb21wb25lbnQ/OiBCbGVuZFNoYXBlQ29tcG9uZW50O1xuXG4gIHB1YmxpYyBfdmVyc2lvbiA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0eVVpZDogRW50aXR5VUlELFxuICAgIGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lELFxuICAgIGVudGl0eUNvbXBvbmVudDogRW50aXR5UmVwb3NpdG9yeSxcbiAgICBpc1JlVXNlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKGVudGl0eVVpZCwgY29tcG9uZW50U2lkLCBlbnRpdHlDb21wb25lbnQsIGlzUmVVc2UpO1xuICAgIHRoaXMubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvZ2ljKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9uZW50VElEKCk6IENvbXBvbmVudFRJRCB7XG4gICAgcmV0dXJuIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuVnJtQ29tcG9uZW50VElEO1xuICB9XG5cbiAgZ2V0IGNvbXBvbmVudFRJRCgpOiBDb21wb25lbnRUSUQge1xuICAgIHJldHVybiBXZWxsS25vd25Db21wb25lbnRUSURzLlZybUNvbXBvbmVudFRJRDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWcm1FeHByZXNzaW9ucyhleHByZXNzaW9uczogVnJtRXhwcmVzc2lvbltdKSB7XG4gICAgZm9yIChjb25zdCBleHAgb2YgZXhwcmVzc2lvbnMpIHtcbiAgICAgIHRoaXMuX19leHByZXNzaW9ucy5zZXQoZXhwLm5hbWUsIGV4cCk7XG4gICAgICB0aGlzLl9fd2VpZ2h0cy5zZXQoZXhwLm5hbWUsIDApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHByZXNzaW9uV2VpZ2h0KGV4cHJlc3Npb25OYW1lOiBWcm1FeHByZXNzaW9uTmFtZSwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fX2V4cHJlc3Npb25zLmdldChleHByZXNzaW9uTmFtZSk7XG4gICAgaWYgKElzLm5vdC5leGlzdChleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9fd2VpZ2h0cy5zZXQoZXhwcmVzc2lvbk5hbWUsIHdlaWdodCk7XG4gICAgZm9yIChjb25zdCBiaW5kIG9mIGV4cHJlc3Npb24uYmluZHMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuZ2V0RW50aXR5KGJpbmQuZW50aXR5SWR4KTtcbiAgICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRCbGVuZFNoYXBlKCk7XG4gICAgICBpZiAoSXMuZXhpc3QoYmxlbmRTaGFwZUNvbXBvbmVudCkpIHtcbiAgICAgICAgYmxlbmRTaGFwZUNvbXBvbmVudC5zZXRXZWlnaHRCeUluZGV4KGJpbmQuYmxlbmRTaGFwZUlkeCwgd2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwcmVzc2lvbldlaWdodChleHByZXNzaW9uTmFtZTogVnJtRXhwcmVzc2lvbk5hbWUpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fd2VpZ2h0cy5nZXQoZXhwcmVzc2lvbk5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldEV4cHJlc3Npb25OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fX2V4cHJlc3Npb25zLmtleXMoKSk7XG4gIH1cblxuICBfc2hhbGxvd0NvcHlGcm9tKGNvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XG4gICAgY29uc3QgdnJtQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIFZybUNvbXBvbmVudDtcbiAgICB0aGlzLl9fZXhwcmVzc2lvbnMgPSBuZXcgTWFwKHZybUNvbXBvbmVudC5fX2V4cHJlc3Npb25zKTtcbiAgICB0aGlzLl9fd2VpZ2h0cyA9IG5ldyBNYXAodnJtQ29tcG9uZW50Ll9fd2VpZ2h0cyk7XG4gICAgdGhpcy5fdmVyc2lvbiA9IHZybUNvbXBvbmVudC5fdmVyc2lvbjtcbiAgfVxuXG4gIF9kZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLl9kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApIHtcbiAgICBjbGFzcyBWcm1FbnRpdHkgZXh0ZW5kcyAoYmFzZS5jb25zdHJ1Y3RvciBhcyBhbnkpIHtcbiAgICAgIHByaXZhdGUgX192cm1Db21wb25lbnQ/OiBWcm1Db21wb25lbnQ7XG4gICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50aXR5VUlEOiBFbnRpdHlVSUQsXG4gICAgICAgIGlzQWxpdmU6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBvbmVudHM/OiBNYXA8Q29tcG9uZW50VElELCBDb21wb25lbnQ+XG4gICAgICApIHtcbiAgICAgICAgc3VwZXIoZW50aXR5VUlELCBpc0FsaXZlLCBjb21wb25lbnRzKTtcbiAgICAgIH1cblxuICAgICAgZ2V0VnJtKCkge1xuICAgICAgICBpZiAodGhpcy5fX3ZybUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fX3ZybUNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICAgICAgICBXZWxsS25vd25Db21wb25lbnRUSURzLlZybUNvbXBvbmVudFRJRFxuICAgICAgICAgICkgYXMgVnJtQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9fdnJtQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBhcHBseU1peGlucyhiYXNlLCBWcm1FbnRpdHkpO1xuICAgIHJldHVybiBiYXNlIGFzIHVua25vd24gYXMgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4gJiBFbnRpdHlCYXNlO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0lWcm1FbnRpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9Wcm1Db21wb25lbnQnO1xuIiwiLy8gY29uc3QgTWF0ZXJpYWxTSUQgPSAwXG5jb25zdCBBbmltYXRpb25TdGF0ZUNvbXBvbmVudFRJRCA9IDE7XG5jb25zdCBBbmltYXRpb25Db21wb25lbnRUSUQgPSAyO1xuY29uc3QgVHJhbnNmb3JtQ29tcG9uZW50VElEID0gMztcbmNvbnN0IFNjZW5lR3JhcGhDb21wb25lbnRUSUQgPSA0O1xuY29uc3QgTWVzaENvbXBvbmVudFRJRCA9IDU7XG5jb25zdCBNZXNoUmVuZGVyZXJDb21wb25lbnRUSUQgPSA2O1xuY29uc3QgTGlnaHRDb21wb25lbnRUSUQgPSA3O1xuY29uc3QgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudFRJRCA9IDg7XG5jb25zdCBDYW1lcmFDb21wb25lbnRUSUQgPSA5O1xuY29uc3QgU2tlbGV0YWxDb21wb25lbnRUSUQgPSAxMDtcbmNvbnN0IEJsZW5kU2hhcGVDb21wb25lbnRUSUQgPSAxMTtcbmNvbnN0IFBoeXNpY3NDb21wb25lbnRUSUQgPSAxMjtcbmNvbnN0IEVmZmVrc2VlckNvbXBvbmVudFRJRCA9IDEzO1xuY29uc3QgVnJtQ29tcG9uZW50VElEID0gMTQ7XG5jb25zdCBDb25zdHJhaW50Q29tcG9uZW50VElEID0gMTU7XG5cbmNvbnN0IG1heFdlbGxLbm93blRpZE51bWJlciA9IDE1O1xuXG5leHBvcnQgY29uc3QgV2VsbEtub3duQ29tcG9uZW50VElEcyA9IE9iamVjdC5mcmVlemUoe1xuICBBbmltYXRpb25TdGF0ZUNvbXBvbmVudFRJRCxcbiAgQW5pbWF0aW9uQ29tcG9uZW50VElELFxuICBUcmFuc2Zvcm1Db21wb25lbnRUSUQsXG4gIFNjZW5lR3JhcGhDb21wb25lbnRUSUQsXG4gIE1lc2hDb21wb25lbnRUSUQsXG4gIE1lc2hSZW5kZXJlckNvbXBvbmVudFRJRCxcbiAgTGlnaHRDb21wb25lbnRUSUQsXG4gIENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnRUSUQsXG4gIENhbWVyYUNvbXBvbmVudFRJRCxcbiAgU2tlbGV0YWxDb21wb25lbnRUSUQsXG4gIEJsZW5kU2hhcGVDb21wb25lbnRUSUQsXG4gIFBoeXNpY3NDb21wb25lbnRUSUQsXG4gIEVmZmVrc2VlckNvbXBvbmVudFRJRCxcbiAgVnJtQ29tcG9uZW50VElELFxuICBDb25zdHJhaW50Q29tcG9uZW50VElELFxuICBtYXhXZWxsS25vd25UaWROdW1iZXIsXG59KTtcbiIsImV4cG9ydCAqIGZyb20gJy4vQW5pbWF0aW9uL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRTaGFwZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL0NhbWVyYS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL0NhbWVyYUNvbnRyb2xsZXIvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9MaWdodC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL01lc2gvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9NZXNoUmVuZGVyZXIvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9QaHlzaWNzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vU2NlbmVHcmFwaC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL1NrZWxldGFsL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNmb3JtL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vVnJtL2luZGV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9Db21wb25lbnRUeXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdpc3RlckNvbXBvbmVudHMnO1xuIiwiaW1wb3J0IHsgRWZmZWtzZWVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZWZmZWtzZWVyL0VmZmVrc2VlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IEFuaW1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vQW5pbWF0aW9uL0FuaW1hdGlvbkNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmltYXRpb25TdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vQW5pbWF0aW9uU3RhdGUvQW5pbWF0aW9uU3RhdGVDb21wb25lbnQnO1xuaW1wb3J0IHsgQmxlbmRTaGFwZUNvbXBvbmVudCB9IGZyb20gJy4vQmxlbmRTaGFwZS9CbGVuZFNoYXBlQ29tcG9uZW50JztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4vQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50IH0gZnJvbSAnLi9DYW1lcmFDb250cm9sbGVyL0NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQnO1xuaW1wb3J0IHsgQ29uc3RyYWludENvbXBvbmVudCB9IGZyb20gJy4vQ29uc3RyYWludC9Db25zdHJhaW50Q29tcG9uZW50JztcbmltcG9ydCB7IExpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi9MaWdodC9MaWdodENvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi9NZXNoL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzaFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9NZXNoUmVuZGVyZXIvTWVzaFJlbmRlcmVyQ29tcG9uZW50JztcbmltcG9ydCB7IFBoeXNpY3NDb21wb25lbnQgfSBmcm9tICcuL1BoeXNpY3MvUGh5c2ljc0NvbXBvbmVudCc7XG5pbXBvcnQgeyBTY2VuZUdyYXBoQ29tcG9uZW50IH0gZnJvbSAnLi9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuaW1wb3J0IHsgU2tlbGV0YWxDb21wb25lbnQgfSBmcm9tICcuL1NrZWxldGFsL1NrZWxldGFsQ29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zZm9ybUNvbXBvbmVudCB9IGZyb20gJy4vVHJhbnNmb3JtL1RyYW5zZm9ybUNvbXBvbmVudCc7XG5pbXBvcnQgeyBWcm1Db21wb25lbnQgfSBmcm9tICcuL1ZybS9Wcm1Db21wb25lbnQnO1xuXG5Db21wb25lbnRSZXBvc2l0b3J5LnJlZ2lzdGVyQ29tcG9uZW50Q2xhc3MoQW5pbWF0aW9uU3RhdGVDb21wb25lbnQpO1xuQ29tcG9uZW50UmVwb3NpdG9yeS5yZWdpc3RlckNvbXBvbmVudENsYXNzKEFuaW1hdGlvbkNvbXBvbmVudCk7XG5Db21wb25lbnRSZXBvc2l0b3J5LnJlZ2lzdGVyQ29tcG9uZW50Q2xhc3MoVHJhbnNmb3JtQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhTY2VuZUdyYXBoQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhNZXNoQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhNZXNoUmVuZGVyZXJDb21wb25lbnQpO1xuQ29tcG9uZW50UmVwb3NpdG9yeS5yZWdpc3RlckNvbXBvbmVudENsYXNzKExpZ2h0Q29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhDYW1lcmFDb21wb25lbnQpO1xuQ29tcG9uZW50UmVwb3NpdG9yeS5yZWdpc3RlckNvbXBvbmVudENsYXNzKFNrZWxldGFsQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhCbGVuZFNoYXBlQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhQaHlzaWNzQ29tcG9uZW50KTtcbkNvbXBvbmVudFJlcG9zaXRvcnkucmVnaXN0ZXJDb21wb25lbnRDbGFzcyhFZmZla3NlZXJDb21wb25lbnQpO1xuQ29tcG9uZW50UmVwb3NpdG9yeS5yZWdpc3RlckNvbXBvbmVudENsYXNzKFZybUNvbXBvbmVudCk7XG5Db21wb25lbnRSZXBvc2l0b3J5LnJlZ2lzdGVyQ29tcG9uZW50Q2xhc3MoQ29uc3RyYWludENvbXBvbmVudCk7XG5cbmV4cG9ydCB7fTtcbiIsImltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuXG5leHBvcnQgY2xhc3MgVnJtQWltQ29uc3RyYWludCB7XG4gIHByaXZhdGUgX19zcmNFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIF9fZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eTtcbiAgcHJpdmF0ZSBfX2FpbUF4aXM6XG4gICAgfCAnUG9zaXRpdmVYJ1xuICAgIHwgJ05lZ2F0aXZlWCdcbiAgICB8ICdQb3NpdGl2ZVknXG4gICAgfCAnTmVnYXRpdmVZJ1xuICAgIHwgJ1Bvc2l0aXZlWidcbiAgICB8ICdOZWdhdGl2ZVonO1xuICBwcml2YXRlIF9fd2VpZ2h0OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3JjRW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSxcbiAgICBhaW1BeGlzOiAnUG9zaXRpdmVYJyB8ICdOZWdhdGl2ZVgnIHwgJ1Bvc2l0aXZlWScgfCAnTmVnYXRpdmVZJyB8ICdQb3NpdGl2ZVonIHwgJ05lZ2F0aXZlWicsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICAgZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eVxuICApIHtcbiAgICB0aGlzLl9fc3JjRW50aXR5ID0gc3JjRW50aXR5O1xuICAgIHRoaXMuX19haW1BeGlzID0gYWltQXhpcztcbiAgICB0aGlzLl9fd2VpZ2h0ID0gd2VpZ2h0O1xuICAgIHRoaXMuX19kc3RFbnRpdHkgPSBkc3RFbnRpdHk7XG4gICAgdGhpcy5fX2RzdEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5fYmFja3VwVHJhbnNmb3JtQXNSZXN0KCk7XG4gIH1cblxuICBnZXRBeGlzVmVjdG9yKFxuICAgIGFpbUF4aXM6ICdQb3NpdGl2ZVgnIHwgJ05lZ2F0aXZlWCcgfCAnUG9zaXRpdmVZJyB8ICdOZWdhdGl2ZVknIHwgJ1Bvc2l0aXZlWicgfCAnTmVnYXRpdmVaJ1xuICApIHtcbiAgICBzd2l0Y2ggKGFpbUF4aXMpIHtcbiAgICAgIGNhc2UgJ1Bvc2l0aXZlWCc6XG4gICAgICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5MygxLCAwLCAwKTtcbiAgICAgIGNhc2UgJ05lZ2F0aXZlWCc6XG4gICAgICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5MygtMSwgMCwgMCk7XG4gICAgICBjYXNlICdQb3NpdGl2ZVknOlxuICAgICAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weTMoMCwgMSwgMCk7XG4gICAgICBjYXNlICdOZWdhdGl2ZVknOlxuICAgICAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weTMoMCwgLTEsIDApO1xuICAgICAgY2FzZSAnUG9zaXRpdmVaJzpcbiAgICAgICAgcmV0dXJuIFZlY3RvcjMuZnJvbUNvcHkzKDAsIDAsIDEpO1xuICAgICAgY2FzZSAnTmVnYXRpdmVaJzpcbiAgICAgICAgcmV0dXJuIFZlY3RvcjMuZnJvbUNvcHkzKDAsIDAsIC0xKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByb2xsIGF4aXMnKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgY29uc3QgYWltQXhpcyA9IHRoaXMuZ2V0QXhpc1ZlY3Rvcih0aGlzLl9fYWltQXhpcyk7XG4gICAgY29uc3QgZHN0UGFyZW50V29ybGRRdWF0ID0gSXMuZXhpc3QodGhpcy5fX2RzdEVudGl0eS5nZXRTY2VuZUdyYXBoKCkucGFyZW50KVxuICAgICAgPyB0aGlzLl9fZHN0RW50aXR5LmdldFNjZW5lR3JhcGgoKS5wYXJlbnQhLnJvdGF0aW9uXG4gICAgICA6IFF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgICBjb25zdCBkc3RSZXN0UXVhdCA9IHRoaXMuX19kc3RFbnRpdHkubG9jYWxSb3RhdGlvblJlc3RJbm5lcjtcbiAgICBjb25zdCBmcm9tVmVjID0gUXVhdGVybmlvbi5tdWx0aXBseShkc3RQYXJlbnRXb3JsZFF1YXQsIGRzdFJlc3RRdWF0KS50cmFuc2Zvcm1WZWN0b3IzKGFpbUF4aXMpO1xuICAgIGNvbnN0IHRvVmVjID0gVmVjdG9yMy5ub3JtYWxpemUoXG4gICAgICBWZWN0b3IzLnN1YnRyYWN0KHRoaXMuX19zcmNFbnRpdHkucG9zaXRpb24sIHRoaXMuX19kc3RFbnRpdHkucG9zaXRpb24pXG4gICAgKTtcbiAgICBjb25zdCBmcm9tVG9RdWF0ID0gUXVhdGVybmlvbi5mcm9tVG9Sb3RhdGlvbihmcm9tVmVjLCB0b1ZlYyk7XG5cbiAgICBjb25zdCB0YXJnZXRRdWF0ID0gUXVhdGVybmlvbi5sZXJwKFxuICAgICAgZHN0UmVzdFF1YXQsXG4gICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KFxuICAgICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KFxuICAgICAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkoUXVhdGVybmlvbi5pbnZlcnQoZHN0UGFyZW50V29ybGRRdWF0KSwgZnJvbVRvUXVhdCksXG4gICAgICAgICAgZHN0UGFyZW50V29ybGRRdWF0XG4gICAgICAgICksXG4gICAgICAgIGRzdFJlc3RRdWF0XG4gICAgICApLFxuICAgICAgdGhpcy5fX3dlaWdodFxuICAgICk7XG5cbiAgICB0aGlzLl9fZHN0RW50aXR5LmxvY2FsUm90YXRpb24gPSB0YXJnZXRRdWF0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuZXhwb3J0IGNsYXNzIFZybVJvbGxDb25zdHJhaW50IHtcbiAgcHJpdmF0ZSBfX3NyY0VudGl0eTogSVNjZW5lR3JhcGhFbnRpdHk7XG4gIHByaXZhdGUgX19kc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIF9fcm9sbEF4aXM6ICdYJyB8ICdZJyB8ICdaJztcbiAgcHJpdmF0ZSBfX3dlaWdodDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNyY0VudGl0eTogSVNjZW5lR3JhcGhFbnRpdHksXG4gICAgcm9sbEF4aXM6ICdYJyB8ICdZJyB8ICdaJyxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgICBkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5XG4gICkge1xuICAgIHRoaXMuX19zcmNFbnRpdHkgPSBzcmNFbnRpdHk7XG4gICAgdGhpcy5fX3JvbGxBeGlzID0gcm9sbEF4aXM7XG4gICAgdGhpcy5fX3dlaWdodCA9IHdlaWdodDtcbiAgICB0aGlzLl9fZHN0RW50aXR5ID0gZHN0RW50aXR5O1xuICAgIHRoaXMuX19kc3RFbnRpdHkuZ2V0VHJhbnNmb3JtKCkuX2JhY2t1cFRyYW5zZm9ybUFzUmVzdCgpO1xuICB9XG5cbiAgZ2V0QXhpc1ZlY3Rvcihyb2xsQXhpczogJ1gnIHwgJ1knIHwgJ1onKSB7XG4gICAgc3dpdGNoIChyb2xsQXhpcykge1xuICAgICAgY2FzZSAnWCc6XG4gICAgICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5MygxLCAwLCAwKTtcbiAgICAgIGNhc2UgJ1knOlxuICAgICAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weTMoMCwgMSwgMCk7XG4gICAgICBjYXNlICdaJzpcbiAgICAgICAgcmV0dXJuIFZlY3RvcjMuZnJvbUNvcHkzKDAsIDAsIDEpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJvbGwgYXhpcycpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCBkZWx0YVNyY1F1YXQgPSBRdWF0ZXJuaW9uLm11bHRpcGx5KFxuICAgICAgUXVhdGVybmlvbi5pbnZlcnQodGhpcy5fX3NyY0VudGl0eS5sb2NhbFJvdGF0aW9uUmVzdElubmVyKSxcbiAgICAgIHRoaXMuX19zcmNFbnRpdHkubG9jYWxSb3RhdGlvbklubmVyXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVNyY1F1YXRJblBhcmVudCA9IFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICBRdWF0ZXJuaW9uLm11bHRpcGx5KHRoaXMuX19zcmNFbnRpdHkubG9jYWxSb3RhdGlvblJlc3RJbm5lciwgZGVsdGFTcmNRdWF0KSxcbiAgICAgIFF1YXRlcm5pb24uaW52ZXJ0KHRoaXMuX19zcmNFbnRpdHkubG9jYWxSb3RhdGlvblJlc3RJbm5lcilcbiAgICApO1xuICAgIGNvbnN0IGRlbHRhU3JjUXVhdEluRHN0ID0gUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICAgIFF1YXRlcm5pb24uaW52ZXJ0KHRoaXMuX19kc3RFbnRpdHkubG9jYWxSb3RhdGlvblJlc3RJbm5lciksXG4gICAgICAgIGRlbHRhU3JjUXVhdEluUGFyZW50XG4gICAgICApLFxuICAgICAgdGhpcy5fX2RzdEVudGl0eS5sb2NhbFJvdGF0aW9uUmVzdElubmVyXG4gICAgKTtcblxuICAgIGNvbnN0IHJvbGxBeGlzID0gdGhpcy5nZXRBeGlzVmVjdG9yKHRoaXMuX19yb2xsQXhpcyk7XG4gICAgY29uc3QgdG9WZWMgPSBkZWx0YVNyY1F1YXRJbkRzdC50cmFuc2Zvcm1WZWN0b3IzKHJvbGxBeGlzKTtcbiAgICBjb25zdCBmcm9tVG9RdWF0ID0gUXVhdGVybmlvbi5mcm9tVG9Sb3RhdGlvbihyb2xsQXhpcywgdG9WZWMpO1xuXG4gICAgY29uc3QgdGFyZ2V0UXVhdCA9IFF1YXRlcm5pb24ubGVycChcbiAgICAgIHRoaXMuX19kc3RFbnRpdHkubG9jYWxSb3RhdGlvblJlc3RJbm5lcixcbiAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkoXG4gICAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHkodGhpcy5fX2RzdEVudGl0eS5sb2NhbFJvdGF0aW9uUmVzdElubmVyLCBRdWF0ZXJuaW9uLmludmVydChmcm9tVG9RdWF0KSksXG4gICAgICAgIGRlbHRhU3JjUXVhdEluRHN0XG4gICAgICApLFxuICAgICAgdGhpcy5fX3dlaWdodFxuICAgICk7XG5cbiAgICB0aGlzLl9fZHN0RW50aXR5LmxvY2FsUm90YXRpb24gPSB0YXJnZXRRdWF0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IElWcm1Db25zdHJhaW50IH0gZnJvbSAnLi9JVnJtQ29uc3RyYWludCc7XG5cbmV4cG9ydCBjbGFzcyBWcm1Sb3RhdGlvbkNvbnN0cmFpbnQgaW1wbGVtZW50cyBJVnJtQ29uc3RyYWludCB7XG4gIHByaXZhdGUgX19zcmNFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIF9fZHN0RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eTtcbiAgcHJpdmF0ZSBfX3dlaWdodDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNyY0VudGl0eTogSVNjZW5lR3JhcGhFbnRpdHksIHdlaWdodDogbnVtYmVyLCBkc3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSB7XG4gICAgdGhpcy5fX3NyY0VudGl0eSA9IHNyY0VudGl0eTtcbiAgICB0aGlzLl9fd2VpZ2h0ID0gd2VpZ2h0O1xuICAgIHRoaXMuX19kc3RFbnRpdHkgPSBkc3RFbnRpdHk7XG4gICAgdGhpcy5fX2RzdEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5fYmFja3VwVHJhbnNmb3JtQXNSZXN0KCk7XG4gIH1cblxuICB1cGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3JjRGVsdGFRdWF0ID0gUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAgIFF1YXRlcm5pb24uaW52ZXJ0KHRoaXMuX19zcmNFbnRpdHkubG9jYWxSb3RhdGlvblJlc3RJbm5lciksXG4gICAgICB0aGlzLl9fc3JjRW50aXR5LmxvY2FsUm90YXRpb25Jbm5lclxuICAgICk7XG5cbiAgICBjb25zdCB0YXJnZXRRdWF0ID0gUXVhdGVybmlvbi5sZXJwKFxuICAgICAgdGhpcy5fX2RzdEVudGl0eS5sb2NhbFJvdGF0aW9uUmVzdElubmVyLFxuICAgICAgUXVhdGVybmlvbi5tdWx0aXBseSh0aGlzLl9fZHN0RW50aXR5LmxvY2FsUm90YXRpb25SZXN0SW5uZXIsIHNyY0RlbHRhUXVhdCksXG4gICAgICB0aGlzLl9fd2VpZ2h0XG4gICAgKTtcblxuICAgIHRoaXMuX19kc3RFbnRpdHkubG9jYWxSb3RhdGlvbiA9IHRhcmdldFF1YXQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL01lbW9yeU1hbmFnZXInO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4vRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBCdWZmZXJWaWV3IH0gZnJvbSAnLi4vbWVtb3J5L0J1ZmZlclZpZXcnO1xuaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tICcuLi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHsgQnVmZmVyVXNlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0J1ZmZlclVzZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgUHJvY2Vzc1N0YWdlLCBQcm9jZXNzU3RhZ2VFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9Db25maWcnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuL1JuT2JqZWN0JztcbmltcG9ydCB7IEVudGl0eVVJRCwgQ29tcG9uZW50U0lELCBUeXBlZEFycmF5LCBDb3VudCwgQnl0ZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHMgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbXBvbmVudFR5cGVzJztcbmltcG9ydCB7IEVyciwgUmVzdWx0LCBpc0VyciB9IGZyb20gJy4uL21pc2MvUmVzdWx0JztcbmltcG9ydCB7IFJuRXhjZXB0aW9uIH0gZnJvbSAnLi4vbWlzYyc7XG5cbnR5cGUgTWVtYmVySW5mbyA9IHtcbiAgbWVtYmVyTmFtZTogc3RyaW5nO1xuICBidWZmZXJVc2U6IEJ1ZmZlclVzZUVudW07XG4gIGRhdGFDbGFzc1R5cGU6IHVua25vd247XG4gIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bTtcbiAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gIGluaXRWYWx1ZXM6IG51bWJlcltdO1xufTtcblxuLyoqXG4gKiBDb21wb25lbnQgaXMgYSBmdW5jdGlvbmFsIHVuaXQgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYW4gRW50aXR5IGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50IGV4dGVuZHMgUm5PYmplY3Qge1xuICBwcml2YXRlIF9jb21wb25lbnRfc2lkOiBudW1iZXI7XG4gIF9pc0FsaXZlID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIF9fY3VycmVudFByb2Nlc3NTdGFnZTogUHJvY2Vzc1N0YWdlRW51bSA9IFByb2Nlc3NTdGFnZS5Mb2FkO1xuICBwcml2YXRlIHN0YXRpYyBfX2J1ZmZlclZpZXdzOiBNYXA8RnVuY3Rpb24sIE1hcDxCdWZmZXJVc2VFbnVtLCBCdWZmZXJWaWV3Pj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fYWNjZXNzb3JzOiBNYXA8RnVuY3Rpb24sIE1hcDxzdHJpbmcsIEFjY2Vzc29yPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fYnl0ZUxlbmd0aFN1bU9mTWVtYmVyczogTWFwPEZ1bmN0aW9uLCBNYXA8QnVmZmVyVXNlRW51bSwgQnl0ZT4+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fbWVtYmVySW5mbzogTWFwPEZ1bmN0aW9uLCBNZW1iZXJJbmZvW10+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyBfX21lbWJlcnM6IE1hcDxGdW5jdGlvbiwgTWFwPEJ1ZmZlclVzZUVudW0sIEFycmF5PE1lbWJlckluZm8+Pj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19ieXRlT2Zmc2V0T2ZUaGlzQ29tcG9uZW50OiBCeXRlID0gLTE7XG5cbiAgLyoqIHRoZSBlbnRpdHkgdW5pcXVlIElkIHdoaWNoIHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8gICovXG4gIHByb3RlY3RlZCBfX2VudGl0eVVpZDogRW50aXR5VUlEO1xuXG4gIC8qKiB0aGUgaW5zdGFuY2Ugb2YgTWVtb3J5TWFuYWdlciAqL1xuICBwcm90ZWN0ZWQgX19tZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyO1xuXG4gIC8qKiB0aGUgaW5zdGFuY2Ugb2YgRW50aXR5UmVwb3NpdG9yeSAqL1xuICBwcm90ZWN0ZWQgX19lbnRpdHlSZXBvc2l0b3J5OiBFbnRpdHlSZXBvc2l0b3J5O1xuXG4gIC8qKiB0aGUgTWF4Q29tcG9uZW50IE51bWJlciBvZiBlbnRpdGllcyAqL1xuICBwcml2YXRlIF9fbWF4Q29tcG9uZW50TnVtYmVyOiBDb3VudCA9IENvbmZpZy5tYXhFbnRpdHlOdW1iZXI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBfcHJvY2Vzc1N0YWdlczogQXJyYXk8UHJvY2Vzc1N0YWdlRW51bT4gPSBbXG4gICAgLy8gUHJvY2Vzc1N0YWdlLkNyZWF0ZSxcbiAgICBQcm9jZXNzU3RhZ2UuTG9hZCxcbiAgICAvLyBQcm9jZXNzU3RhZ2UuTW91bnQsXG4gICAgUHJvY2Vzc1N0YWdlLkxvZ2ljLFxuICAgIFByb2Nlc3NTdGFnZS5SZW5kZXIsXG4gICAgLy8gUHJvY2Vzc1N0YWdlLlVubW91bnQsXG4gICAgLy8gUHJvY2Vzc1N0YWdlLkRpc2NhcmRcbiAgXTtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBDb21wb25lbnQgY2xhc3MuXG4gICAqIFdoZW4gY3JlYXRpbmcgYW4gQ29tcG9uZW50LCB1c2UgdGhlIGNyZWF0ZUNvbXBvbmVudCBtZXRob2Qgb2YgdGhlIENvbXBvbmVudFJlcG9zaXRvcnkgY2xhc3NcbiAgICogaW5zdGVhZCBvZiBkaXJlY3RseSBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSBlbnRpdHlVaWQgVW5pcXVlIElEIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eVxuICAgKiBAcGFyYW0gY29tcG9uZW50U2lkIFNjb3BlZCBJRCBvZiB0aGUgQ29tcG9uZW50XG4gICAqIEBwYXJhbSBlbnRpdHlSZXBvc2l0b3J5IFRoZSBpbnN0YW5jZSBvZiB0aGUgRW50aXR5UmVwb3NpdG9yeSBjbGFzcyAoRGVwZW5kZW5jeSBJbmplY3Rpb24pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHlVaWQ6IEVudGl0eVVJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRCxcbiAgICBlbnRpdHlSZXBvc2l0b3J5OiBFbnRpdHlSZXBvc2l0b3J5LFxuICAgIGlzUmVVc2U6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX19lbnRpdHlVaWQgPSBlbnRpdHlVaWQ7XG4gICAgdGhpcy5fY29tcG9uZW50X3NpZCA9IGNvbXBvbmVudFNpZDtcblxuICAgIGNvbnN0IHN0YWdlcyA9IENvbXBvbmVudC5fcHJvY2Vzc1N0YWdlcztcblxuICAgIHRoaXMuX19tZW1vcnlNYW5hZ2VyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMuX19lbnRpdHlSZXBvc2l0b3J5ID0gZW50aXR5UmVwb3NpdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIHRoZSBvdGhlciBzdGFnZXMgb2YgcHJvY2Vzc1xuICAgKiBAcGFyYW0gcHJvY2Vzc1N0YWdlIHN0YWdlIG9mIGNvbXBvbmVudCdzIHByb2Nlc3NcbiAgICovXG4gIG1vdmVTdGFnZVRvKHByb2Nlc3NTdGFnZTogUHJvY2Vzc1N0YWdlRW51bSkge1xuICAgIC8vIENvbXBvbmVudC5fX2RpcnR5T2ZBcnJheU9mUHJvY2Vzc1N0YWdlcy5zZXQodGhpcy5fX2N1cnJlbnRQcm9jZXNzU3RhZ2UsIGZhbHNlKTtcbiAgICAvLyBDb21wb25lbnQuX19kaXJ0eU9mQXJyYXlPZlByb2Nlc3NTdGFnZXMuc2V0KHByb2Nlc3NTdGFnZSwgdHJ1ZSk7XG4gICAgdGhpcy5fX2N1cnJlbnRQcm9jZXNzU3RhZ2UgPSBwcm9jZXNzU3RhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIHNldCB0aGUgTWF4IG51bWJlciBvZiBjb21wb25lbnRzXG4gICAqIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgKioqQ29tcG9uZW50IGNsYXNzZXMgb25seVxuICAgKi9cbiAgX3NldE1heE51bWJlck9mQ29tcG9uZW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9fbWF4Q29tcG9uZW50TnVtYmVyID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYXggbnVtYmVyIG9mIGNvbXBvbmVudHNcbiAgICovXG4gIGdldCBtYXhOdW1iZXJPZkNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21heENvbXBvbmVudE51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFR5cGUgSUQgb2YgdGhlIENvbXBvbmVudFxuICAgKi9cbiAgc3RhdGljIGdldCBjb21wb25lbnRUSUQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBUeXBlIElEIG9mIHRoZSBDb21wb25lbnRcbiAgICovXG4gIGdldCBjb21wb25lbnRUSUQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBTY29wZWQgSUQgb2YgdGhlIENvbXBvbmVudFxuICAgKi9cbiAgZ2V0IGNvbXBvbmVudFNJRCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50X3NpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgZW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGdldCBlbnRpdHlVSUQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19lbnRpdHlVaWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHByb2Nlc3Mgc3RhZ2Ugb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGdldCBjdXJyZW50UHJvY2Vzc1N0YWdlKCkge1xuICAgIHJldHVybiB0aGlzLl9fY3VycmVudFByb2Nlc3NTdGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJ1ZSBvciBmYWxzZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUHJvY2Vzc1N0YWdlIGV4aXN0cyBpbiBDb21wb25lbnQuXG4gICAqIEByZXR1cm5zIHRydWUgb3IgZmFsc2VcbiAgICovXG4gIHN0YXRpYyBkb2VzVGhlUHJvY2Vzc1N0YWdlTWV0aG9kRXhpc3QoXG4gICAgY29tcG9uZW50VHlwZTogdHlwZW9mIENvbXBvbmVudCxcbiAgICBwcm9jZXNzU3RhZ2U6IFByb2Nlc3NTdGFnZUVudW1cbiAgKSB7XG4gICAgaWYgKChjb21wb25lbnRUeXBlLnByb3RvdHlwZSBhcyBhbnkpW3Byb2Nlc3NTdGFnZS5tZXRob2ROYW1lXSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRydWUgb3IgZmFsc2Ugd2hldGhlciB0aGUgc3BlY2lmaWVkIFByb2Nlc3NTdGFnZSBleGlzdHMgaW4gQ29tcG9uZW50LlxuICAgKi9cbiAgaXNFeGlzdFByb2Nlc3NTdGFnZU1ldGhvZChwcm9jZXNzU3RhZ2U6IFByb2Nlc3NTdGFnZUVudW0pIHtcbiAgICBpZiAoKHRoaXMgYXMgYW55KVtwcm9jZXNzU3RhZ2UubWV0aG9kTmFtZV0gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIGNvbXBvbmVudHNcbiAgICogQHBhcmFtIHBhcmFtMCBwYXJhbXNcbiAgICovXG4gIHN0YXRpYyBwcm9jZXNzKGNvbXBvbmVudFR5cGU6IHR5cGVvZiBDb21wb25lbnQsIHByb2Nlc3NTdGFnZTogUHJvY2Vzc1N0YWdlRW51bSkge1xuICAgIGlmICghQ29tcG9uZW50LmRvZXNUaGVQcm9jZXNzU3RhZ2VNZXRob2RFeGlzdChjb21wb25lbnRUeXBlLCBwcm9jZXNzU3RhZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb2Nlc3NTdGFnZS5tZXRob2ROYW1lO1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IENvbXBvbmVudFtdIHwgdW5kZWZpbmVkID1cbiAgICAgIENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50c1dpdGhUeXBlKGNvbXBvbmVudFR5cGUpITtcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICBpZiAocHJvY2Vzc1N0YWdlID09PSBjb21wb25lbnQuX19jdXJyZW50UHJvY2Vzc1N0YWdlKSB7XG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KVttZXRob2ROYW1lXSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdGF0aWMgdXBkYXRlQ29tcG9uZW50c0ZvclJlbmRlclN0YWdlKFxuICAgIGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50LFxuICAgIHByb2Nlc3NTdGFnZTogUHJvY2Vzc1N0YWdlRW51bSxcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzXG4gICkge1xuICAgIGNvbnN0IG1ldGhvZCA9IChjb21wb25lbnRDbGFzcyBhcyBhbnkpWydzb3J0XyRyZW5kZXInXTtcbiAgICByZXR1cm4gbWV0aG9kKHJlbmRlclBhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBieXRlIGxlbmd0aCBvZiBzdW0gb2YgbWVtYmVyIGZpZWxkcyBpbiB0aGUgY29tcG9uZW50IGNsYXNzXG4gICAqL1xuICBzdGF0aWMgZ2V0Qnl0ZUxlbmd0aFN1bU9mTWVtYmVycyhidWZmZXJVc2U6IEJ1ZmZlclVzZUVudW0sIGNvbXBvbmVudENsYXNzOiBGdW5jdGlvbikge1xuICAgIGNvbnN0IGJ5dGVMZW5ndGhTdW1PZk1lbWJlcnMgPSB0aGlzLl9fYnl0ZUxlbmd0aFN1bU9mTWVtYmVycy5nZXQoY29tcG9uZW50Q2xhc3MpITtcbiAgICByZXR1cm4gYnl0ZUxlbmd0aFN1bU9mTWVtYmVycy5nZXQoYnVmZmVyVXNlKSE7XG4gIH1cblxuICAvKipcbiAgICogcmVnaXN0ZXIgYSBkZXBlbmRlbmN5IGZvciB0aGUgb3RoZXIgY29tcG9uZW50cy5cbiAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IHVzZWQgeWV0XG4gICAqL1xuICByZWdpc3RlckRlcGVuZGVuY3koY29tcG9uZW50OiBDb21wb25lbnQsIGlzTXVzdDogYm9vbGVhbikge31cblxuICAvLyAvKipcbiAgLy8gICogdGFrZSBhIGJ1ZmZlciB2aWV3IGZyb20gdGhlIGJ1ZmZlci5cbiAgLy8gICovXG4gIC8vIHN0YXRpYyB0YWtlQnVmZmVyVmlldyhcbiAgLy8gICBidWZmZXJVc2U6IEJ1ZmZlclVzZUVudW0sXG4gIC8vICAgY29tcG9uZW50Q2xhc3M6IEZ1bmN0aW9uLFxuICAvLyAgIGJ5dGVMZW5ndGhTdW1PZk1lbWJlcnM6IEJ5dGUsXG4gIC8vICAgY291bnQ6IENvdW50XG4gIC8vICkge1xuICAvLyAgIGNvbnN0IGJ1ZmZlciA9IE1lbW9yeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVPckdldEJ1ZmZlcihidWZmZXJVc2UpO1xuXG4gIC8vICAgaWYgKCF0aGlzLl9fYnVmZmVyVmlld3MuaGFzKGNvbXBvbmVudENsYXNzKSkge1xuICAvLyAgICAgdGhpcy5fX2J1ZmZlclZpZXdzLnNldChjb21wb25lbnRDbGFzcywgbmV3IE1hcCgpKTtcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCBidWZmZXJWaWV3cyA9IHRoaXMuX19idWZmZXJWaWV3cy5nZXQoY29tcG9uZW50Q2xhc3MpITtcbiAgLy8gICBpZiAoIWJ1ZmZlclZpZXdzLmhhcyhidWZmZXJVc2UpKSB7XG4gIC8vICAgICBjb25zdCBidWZmZXJWaWV3ID0gYnVmZmVyLnRha2VCdWZmZXJWaWV3KHtcbiAgLy8gICAgICAgYnl0ZUxlbmd0aFRvTmVlZDogYnl0ZUxlbmd0aFN1bU9mTWVtYmVycyAqIGNvdW50LFxuICAvLyAgICAgICBieXRlU3RyaWRlOiAwLFxuICAvLyAgICAgfSkudW53cmFwRm9yY2UoKTtcbiAgLy8gICAgIGJ1ZmZlclZpZXdzLnNldChidWZmZXJVc2UsIGJ1ZmZlclZpZXcpO1xuICAvLyAgICAgcmV0dXJuIGJ1ZmZlclZpZXc7XG4gIC8vICAgfVxuXG4gIC8vICAgcmV0dXJuIHZvaWQgMDtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiB0YWtlIG9uZSBtZW1vcnkgYXJlYSBmb3IgdGhlIHNwZWNpZmllZCBtZW1iZXIgZm9yIGFsbCBzYW1lIHR5cGUgb2YgdGhlIGNvbXBvbmVudCBpbnN0YW5jZXMuXG4gICAqL1xuICB0YWtlT25lKFxuICAgIG1lbWJlck5hbWU6IHN0cmluZyxcbiAgICBkYXRhQ2xhc3NUeXBlOiBhbnksXG4gICAgaW5pdFZhbHVlczogbnVtYmVyW10sXG4gICAgaXNSZVVzZTogYm9vbGVhbixcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRFxuICApOiBhbnkge1xuICAgIGlmICghKHRoaXMgYXMgYW55KVsnXycgKyBtZW1iZXJOYW1lXS5pc0R1bW15KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGFrZW46IFR5cGVkQXJyYXkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUmVVc2UpIHtcbiAgICAgIHRha2VuID0gQ29tcG9uZW50Ll9fYWNjZXNzb3JzXG4gICAgICAgIC5nZXQodGhpcy5jb25zdHJ1Y3RvcikhXG4gICAgICAgIC5nZXQobWVtYmVyTmFtZSkhXG4gICAgICAgIC5fdGFrZUV4aXN0ZWRPbmUoY29tcG9uZW50U2lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFrZW4gPSBDb21wb25lbnQuX19hY2Nlc3NvcnMuZ2V0KHRoaXMuY29uc3RydWN0b3IpIS5nZXQobWVtYmVyTmFtZSkhLnRha2VPbmUoKTtcbiAgICB9XG4gICAgKHRoaXMgYXMgYW55KVsnXycgKyBtZW1iZXJOYW1lXSA9IG5ldyBkYXRhQ2xhc3NUeXBlKHRha2VuLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0aGlzIGFzIGFueSlbJ18nICsgbWVtYmVyTmFtZV0uX3YubGVuZ3RoOyArK2kpIHtcbiAgICAgICh0aGlzIGFzIGFueSlbJ18nICsgbWVtYmVyTmFtZV0uX3ZbaV0gPSBpbml0VmFsdWVzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgdGFrZW4gYWNjZXNzb3IgZm9yIHRoZSBtZW1iZXIgZmllbGQuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWNjZXNzb3IobWVtYmVyTmFtZTogc3RyaW5nLCBjb21wb25lbnRDbGFzczogRnVuY3Rpb24pOiBBY2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMuX19hY2Nlc3NvcnMuZ2V0KGNvbXBvbmVudENsYXNzKSEuZ2V0KG1lbWJlck5hbWUpITtcbiAgfVxuXG4gIC8qKlxuICAgKiB0YWtlIG9uZSBhY2Nlc3NvciBmb3IgdGhlIG1lbWJlciBmaWVsZC5cbiAgICovXG4gIHN0YXRpYyB0YWtlQWNjZXNzb3IoXG4gICAgYnVmZmVyVXNlOiBCdWZmZXJVc2VFbnVtLFxuICAgIG1lbWJlck5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnRDbGFzczogRnVuY3Rpb24sXG4gICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtLFxuICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtLFxuICAgIGNvdW50OiBDb3VudFxuICApOiBSZXN1bHQ8QWNjZXNzb3IsIHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5fX2FjY2Vzc29ycy5oYXMoY29tcG9uZW50Q2xhc3MpKSB7XG4gICAgICB0aGlzLl9fYWNjZXNzb3JzLnNldChjb21wb25lbnRDbGFzcywgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSB0aGlzLl9fYWNjZXNzb3JzLmdldChjb21wb25lbnRDbGFzcykhO1xuXG4gICAgaWYgKCFhY2Nlc3NvcnMuaGFzKG1lbWJlck5hbWUpKSB7XG4gICAgICBjb25zdCBieXRlcyA9IGNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSAqIGNvbXBvbmVudFR5cGUuZ2V0U2l6ZUluQnl0ZXMoKTtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IE1lbW9yeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVPckdldEJ1ZmZlcihidWZmZXJVc2UpO1xuICAgICAgY29uc3QgYnVmZmVyVmlld1Jlc3VsdCA9IGJ1ZmZlci50YWtlQnVmZmVyVmlldyh7XG4gICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IGJ5dGVzICogY291bnQsXG4gICAgICAgIGJ5dGVTdHJpZGU6IDAsXG4gICAgICB9KTtcbiAgICAgIGlmIChpc0VycihidWZmZXJWaWV3UmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byB0YWtlIGJ1ZmZlciB2aWV3OiAnICsgYnVmZmVyVmlld1Jlc3VsdC5nZXRSbkVycm9yKCkubWVzc2FnZSxcbiAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjY2Vzc29yUmVzdWx0ID0gYnVmZmVyVmlld1Jlc3VsdC5nZXQoKS50YWtlQWNjZXNzb3Ioe1xuICAgICAgICBjb21wb3NpdGlvblR5cGUsXG4gICAgICAgIGNvbXBvbmVudFR5cGUsXG4gICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgYnl0ZVN0cmlkZTogYnl0ZXMsXG4gICAgICB9KTtcbiAgICAgIGlmIChpc0VycihhY2Nlc3NvclJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdGYWlsZWQgdG8gdGFrZSBhY2Nlc3NvcjogJyArIGFjY2Vzc29yUmVzdWx0LmdldFJuRXJyb3IoKS5tZXNzYWdlLFxuICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWNjZXNzb3JzLnNldChtZW1iZXJOYW1lLCBhY2Nlc3NvclJlc3VsdC5nZXQoKSk7XG4gICAgICByZXR1cm4gYWNjZXNzb3JSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZTogJ0FscmVhZHkgdGFrZW4nLFxuICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEJ5dGVPZmZzZXRPZlRoaXNDb21wb25lbnRUeXBlSW5CdWZmZXIoXG4gICAgYnVmZmVyVXNlOiBCdWZmZXJVc2VFbnVtLFxuICAgIGNvbXBvbmVudENsYXNzOiBGdW5jdGlvblxuICApOiBCeXRlIHtcbiAgICByZXR1cm4gdGhpcy5fX2J1ZmZlclZpZXdzLmdldChjb21wb25lbnRDbGFzcykhLmdldChidWZmZXJVc2UpIS5ieXRlT2Zmc2V0SW5CdWZmZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Qnl0ZU9mZnNldE9mRmlyc3RPZlRoaXNNZW1iZXJJbkJ1ZmZlcihcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50Q2xhc3M6IEZ1bmN0aW9uXG4gICk6IEJ5dGUge1xuICAgIHJldHVybiB0aGlzLl9fYWNjZXNzb3JzLmdldChjb21wb25lbnRDbGFzcykhLmdldChtZW1iZXJOYW1lKSEuYnl0ZU9mZnNldEluQnVmZmVyO1xuICB9XG5cbiAgc3RhdGljIGdldEJ5dGVPZmZzZXRPZkZpcnN0T2ZUaGlzTWVtYmVySW5CdWZmZXJWaWV3KFxuICAgIG1lbWJlck5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnRDbGFzczogRnVuY3Rpb25cbiAgKTogQnl0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX19hY2Nlc3NvcnMuZ2V0KGNvbXBvbmVudENsYXNzKSEuZ2V0KG1lbWJlck5hbWUpIS5ieXRlT2Zmc2V0SW5CdWZmZXJWaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbWVtYmVyIGZpZWxkIG9mIGNvbXBvbmVudCBjbGFzcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24uXG4gICAqIEBwYXJhbSBidWZmZXJVc2UgcHVycG9zZSB0eXBlIG9mIGJ1ZmZlciB1c2VcbiAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG5hbWUgb2YgbWVtYmVyIGZpZWxkXG4gICAqIEBwYXJhbSBkYXRhQ2xhc3NUeXBlIGEgY2xhc3Mgb2YgZGF0YVxuICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSBhIHR5cGUgb2YgbnVtYmVyXG4gICAqIEBwYXJhbSBpbml0VmFsdWVzIGEgaW5pdGlhbCB2YWx1ZVxuICAgKi9cbiAgcmVnaXN0ZXJNZW1iZXIoXG4gICAgYnVmZmVyVXNlOiBCdWZmZXJVc2VFbnVtLFxuICAgIG1lbWJlck5hbWU6IHN0cmluZyxcbiAgICBkYXRhQ2xhc3NUeXBlOiB1bmtub3duLFxuICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtLFxuICAgIGluaXRWYWx1ZXM6IG51bWJlcltdXG4gICkge1xuICAgIGlmICghQ29tcG9uZW50Ll9fbWVtYmVySW5mby5oYXModGhpcy5jb25zdHJ1Y3RvcikpIHtcbiAgICAgIENvbXBvbmVudC5fX21lbWJlckluZm8uc2V0KHRoaXMuY29uc3RydWN0b3IsIFtdKTtcbiAgICB9XG4gICAgY29uc3QgbWVtYmVySW5mb0FycmF5ID0gQ29tcG9uZW50Ll9fbWVtYmVySW5mby5nZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG5cbiAgICBtZW1iZXJJbmZvQXJyYXkhLnB1c2goe1xuICAgICAgYnVmZmVyVXNlOiBidWZmZXJVc2UsXG4gICAgICBtZW1iZXJOYW1lOiBtZW1iZXJOYW1lLFxuICAgICAgZGF0YUNsYXNzVHlwZTogZGF0YUNsYXNzVHlwZSBhcyBuZXZlcixcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogKGRhdGFDbGFzc1R5cGUgYXMgYW55KS5jb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlOiBjb21wb25lbnRUeXBlLFxuICAgICAgaW5pdFZhbHVlczogaW5pdFZhbHVlcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvY2F0ZSBtZW1vcnkgb2Ygc2VsZiBtZW1iZXIgZmllbGRzXG4gICAqIEBwYXJhbSBjb3VudCBhIG51bWJlciBvZiBlbnRpdGllcyB0byBuZWVkIGFsbG9jYXRlXG4gICAqL1xuICBzdWJtaXRUb0FsbG9jYXRpb24oY291bnQ6IENvdW50LCBpc1JlVXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudF9zaWQgPj0gY291bnQpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGAlYyR7Y29tcG9uZW50Q2xhc3MubmFtZX06IFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpcyBvdmVyIHRoZSBsaW1pdC4gVGhpcyBtYXkgbGVhZCB0byBpbmNvcnJlY3QgcHJvY2Vzc2luZyByZXN1bHRzLiBQbGVhc2UgY29uc2lkZXIgdG8gaW5jcmVhc2UgdGhlIGxpbWl0LiBZb3UgY2FuIHNldCB0aGUgbGltaXQgb24gUm4uQ29uZmlnLnh4eHh4eC5gLFxuICAgICAgICAnY29sb3I6IHJlZDsgYmFja2dyb3VuZDogeWVsbG93OyBmb250LXNpemU6IDJlbTsnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCBtZW1iZXJJbmZvQXJyYXkgPSBDb21wb25lbnQuX19tZW1iZXJJbmZvLmdldChjb21wb25lbnRDbGFzcykhO1xuXG4gICAgLy8gRG8gdGhpcyBvbmx5IGZvciB0aGUgZmlyc3QgZW50aXR5IG9mIHRoZSBjb21wb25lbnRcbiAgICBpZiAodGhpcy5fY29tcG9uZW50X3NpZCA9PT0gMCkge1xuICAgICAgZ2V0QnVmZmVyVmlld3NBbmRBY2Nlc3NvcnModGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVtYmVyID0gQ29tcG9uZW50Ll9fbWVtYmVycy5nZXQoY29tcG9uZW50Q2xhc3MpITtcblxuICAgIC8vIHRha2UgYSBmaWVsZCB2YWx1ZSBhbGxvY2F0aW9uIGZvciBlYWNoIGVudGl0eSBmb3IgZWFjaCBtZW1iZXIgZmllbGRcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlclVzZSBvZiBtZW1iZXIua2V5cygpKSB7XG4gICAgICBjb25zdCBpbmZvQXJyYXkgPSBtZW1iZXIuZ2V0KGJ1ZmZlclVzZSkhO1xuICAgICAgaW5mb0FycmF5LmZvckVhY2goKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy50YWtlT25lKFxuICAgICAgICAgIGluZm8ubWVtYmVyTmFtZSxcbiAgICAgICAgICBpbmZvLmRhdGFDbGFzc1R5cGUsXG4gICAgICAgICAgaW5mby5pbml0VmFsdWVzLFxuICAgICAgICAgIGlzUmVVc2UsXG4gICAgICAgICAgdGhpcy5fY29tcG9uZW50X3NpZFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuXG4gICAgLy8gaW5uZXIgZnVuY3Rpb25cbiAgICBmdW5jdGlvbiBnZXRCdWZmZXJWaWV3c0FuZEFjY2Vzc29ycyh0aGF0OiBDb21wb25lbnQpIHtcbiAgICAgIGlmICghQ29tcG9uZW50Ll9fbWVtYmVycy5oYXMoY29tcG9uZW50Q2xhc3MpKSB7XG4gICAgICAgIENvbXBvbmVudC5fX21lbWJlcnMuc2V0KGNvbXBvbmVudENsYXNzLCBuZXcgTWFwKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVtYmVyID0gQ29tcG9uZW50Ll9fbWVtYmVycy5nZXQoY29tcG9uZW50Q2xhc3MpITtcbiAgICAgIG1lbWJlckluZm9BcnJheS5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICAgIG1lbWJlci5zZXQoaW5mby5idWZmZXJVc2UsIFtdKTtcbiAgICAgIH0pO1xuICAgICAgbWVtYmVySW5mb0FycmF5LmZvckVhY2goKGluZm8pID0+IHtcbiAgICAgICAgbWVtYmVyLmdldChpbmZvLmJ1ZmZlclVzZSkhLnB1c2goaW5mbyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZm9yIGVhY2ggbWVtYmVyIGZpZWxkLCB0YWtlIGEgQnVmZmVyVmlldyBmb3IgYWxsIGVudGl0aWVzJyB0aGUgbWVtYmVyIGZpZWxkLlxuICAgICAgZm9yIChjb25zdCBidWZmZXJVc2Ugb2YgbWVtYmVyLmtleXMoKSkge1xuICAgICAgICBjb25zdCBpbmZvQXJyYXkgPSBtZW1iZXIuZ2V0KGJ1ZmZlclVzZSkhO1xuICAgICAgICBpZiAoIUNvbXBvbmVudC5fX2J5dGVMZW5ndGhTdW1PZk1lbWJlcnMuaGFzKGNvbXBvbmVudENsYXNzKSkge1xuICAgICAgICAgIENvbXBvbmVudC5fX2J5dGVMZW5ndGhTdW1PZk1lbWJlcnMuc2V0KGNvbXBvbmVudENsYXNzLCBuZXcgTWFwKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGhTdW1PZk1lbWJlcnMgPSBDb21wb25lbnQuX19ieXRlTGVuZ3RoU3VtT2ZNZW1iZXJzLmdldChjb21wb25lbnRDbGFzcykhO1xuICAgICAgICBpZiAoIWJ5dGVMZW5ndGhTdW1PZk1lbWJlcnMuaGFzKGJ1ZmZlclVzZSkpIHtcbiAgICAgICAgICBieXRlTGVuZ3RoU3VtT2ZNZW1iZXJzLnNldChidWZmZXJVc2UsIDApO1xuICAgICAgICB9XG4gICAgICAgIGluZm9BcnJheS5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICAgICAgYnl0ZUxlbmd0aFN1bU9mTWVtYmVycy5zZXQoXG4gICAgICAgICAgICBidWZmZXJVc2UsXG4gICAgICAgICAgICBieXRlTGVuZ3RoU3VtT2ZNZW1iZXJzLmdldChidWZmZXJVc2UpISArXG4gICAgICAgICAgICAgIGluZm8uY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpICogaW5mby5jb21wb25lbnRUeXBlLmdldFNpemVJbkJ5dGVzKClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluZm9BcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gY29uc3QgYnVmZmVyVmlldyA9IENvbXBvbmVudC50YWtlQnVmZmVyVmlldyhcbiAgICAgICAgICAvLyAgIGJ1ZmZlclVzZSxcbiAgICAgICAgICAvLyAgIGNvbXBvbmVudENsYXNzLFxuICAgICAgICAgIC8vICAgYnl0ZUxlbmd0aFN1bU9mTWVtYmVycy5nZXQoYnVmZmVyVXNlKSEsXG4gICAgICAgICAgLy8gICBjb3VudFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgLy8gdGhhdC5fX2J5dGVPZmZzZXRPZlRoaXNDb21wb25lbnQgPSBidWZmZXJWaWV3IS5ieXRlT2Zmc2V0SW5CdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdGFrZSBhIEFjY2Vzc29yIGZvciBhbGwgZW50aXRpZXMgZm9yIGVhY2ggbWVtYmVyIGZpZWxkcyAoc2FtZSBhcyBCdWZmZXJWaWV3KVxuICAgICAgZm9yIChjb25zdCBidWZmZXJVc2Ugb2YgbWVtYmVyLmtleXMoKSkge1xuICAgICAgICBjb25zdCBpbmZvQXJyYXkgPSBtZW1iZXIuZ2V0KGJ1ZmZlclVzZSkhO1xuICAgICAgICBpbmZvQXJyYXkuZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjY2Vzc29yUmVzdWx0ID0gQ29tcG9uZW50LnRha2VBY2Nlc3NvcihcbiAgICAgICAgICAgIGluZm8uYnVmZmVyVXNlLFxuICAgICAgICAgICAgaW5mby5tZW1iZXJOYW1lLFxuICAgICAgICAgICAgY29tcG9uZW50Q2xhc3MsXG4gICAgICAgICAgICBpbmZvLmNvbXBvc2l0aW9uVHlwZSxcbiAgICAgICAgICAgIGluZm8uY29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgIGNvdW50XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNFcnIoYWNjZXNzb3JSZXN1bHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUm5FeGNlcHRpb24oYWNjZXNzb3JSZXN1bHQuZ2V0Um5FcnJvcigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgKHRoYXQgYXMgYW55KVsnX2J5dGVPZmZzZXRPZkFjY2Vzc29ySW5CdWZmZXJfJyArIGluZm8ubWVtYmVyTmFtZV0gPVxuICAgICAgICAgICAgYWNjZXNzb3JSZXN1bHQuZ2V0KCkuYnl0ZU9mZnNldEluQnVmZmVyO1xuICAgICAgICAgICh0aGF0IGFzIGFueSlbJ19ieXRlT2Zmc2V0T2ZBY2Nlc3NvckluQ29tcG9uZW50XycgKyBpbmZvLm1lbWJlck5hbWVdID1cbiAgICAgICAgICAgIGFjY2Vzc29yUmVzdWx0LmdldCgpLmJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGVudGl0eSB3aGljaCBoYXMgdGhpcyBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIHRoZSBlbnRpdHkgd2hpY2ggaGFzIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBnZXQgZW50aXR5KCk6IElFbnRpdHkge1xuICAgIHJldHVybiB0aGlzLl9fZW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkodGhpcy5fX2VudGl0eVVpZCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBieXRlcyBJbmZvcm1hdGlvbiBvZiB0aGUgbWVtYmVyXG4gICAqIEBwYXJhbSBjb21wb25lbnQgYSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50XG4gICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgb2YgY29tcG9uZW50IGluIHN0cmluZ1xuICAgKiBAcmV0dXJucyBieXRlcyBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldERhdGFCeXRlSW5mb0lubmVyKGNvbXBvbmVudDogQ29tcG9uZW50LCBtZW1iZXJOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0gKGNvbXBvbmVudCBhcyBhbnkpWydfJyArIG1lbWJlck5hbWVdO1xuICAgIGNvbnN0IHR5cGVkQXJyYXkgPSBkYXRhLl92IGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgYnl0ZU9mZnNldEluQnVmZmVyID0gdHlwZWRBcnJheS5ieXRlT2Zmc2V0O1xuICAgIGNvbnN0IGJ5dGVMZW5ndGggPSB0eXBlZEFycmF5LmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgY29tcG9uZW50TnVtYmVyID0gdHlwZWRBcnJheS5sZW5ndGg7XG4gICAgY29uc3QgbG9jYXRpb25PZmZzZXRJbkJ1ZmZlciA9IGJ5dGVPZmZzZXRJbkJ1ZmZlciAvIDQgLyA0OyAvLyA0Ynl0ZSBpcyB0aGUgc2l6ZSBvZiBGbG9hdDMyQXJyYXksIGFuZCB0ZXhlbCBmZXRjaCBpcyA0IGNvbXBvbmVudHMgdW5pdC5cbiAgICBjb25zdCBieXRlT2Zmc2V0SW5UaGlzQ29tcG9uZW50ID1cbiAgICAgICh0aGlzIGFzIGFueSlbJ19ieXRlT2Zmc2V0T2ZBY2Nlc3NvckluQ29tcG9uZW50XycgKyBtZW1iZXJOYW1lXSArXG4gICAgICBjb21wb25lbnQuY29tcG9uZW50U0lEICogY29tcG9uZW50TnVtYmVyICogNDtcbiAgICBjb25zdCBsb2NhdGlvbk9mZnNldEluVGhpc0NvbXBvbmVudCA9XG4gICAgICAodGhpcyBhcyBhbnkpWydfYnl0ZU9mZnNldE9mQWNjZXNzb3JJbkNvbXBvbmVudF8nICsgbWVtYmVyTmFtZV0gK1xuICAgICAgY29tcG9uZW50LmNvbXBvbmVudFNJRCAqIGNvbXBvbmVudE51bWJlcjtcbiAgICBjb25zdCB0aGlzQ29tcG9uZW50Qnl0ZU9mZnNldEluQnVmZmVyID0gY29tcG9uZW50Ll9fYnl0ZU9mZnNldE9mVGhpc0NvbXBvbmVudDtcbiAgICBjb25zdCB0aGlzQ29tcG9uZW50TG9jYXRpb25PZmZzZXRJbkJ1ZmZlciA9IGNvbXBvbmVudC5fX2J5dGVPZmZzZXRPZlRoaXNDb21wb25lbnQgLyA0IC8gNDtcblxuICAgIHJldHVybiB7XG4gICAgICBieXRlTGVuZ3RoLFxuICAgICAgYnl0ZU9mZnNldEluQnVmZmVyLFxuICAgICAgYnl0ZU9mZnNldEluVGhpc0NvbXBvbmVudCxcbiAgICAgIGxvY2F0aW9uT2Zmc2V0SW5CdWZmZXIsXG4gICAgICBsb2NhdGlvbk9mZnNldEluVGhpc0NvbXBvbmVudCxcbiAgICAgIHRoaXNDb21wb25lbnRCeXRlT2Zmc2V0SW5CdWZmZXIsXG4gICAgICB0aGlzQ29tcG9uZW50TG9jYXRpb25PZmZzZXRJbkJ1ZmZlcixcbiAgICAgIGNvbXBvbmVudE51bWJlcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgYnl0ZXMgSW5mb3JtYXRpb24gb2YgdGhlIG1lbWJlclxuICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG9mIGNvbXBvbmVudCBpbiBzdHJpbmdcbiAgICogQHJldHVybnMgYnl0ZXMgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldERhdGFCeXRlSW5mbyhtZW1iZXJOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQ29tcG9uZW50LmdldERhdGFCeXRlSW5mb0lubmVyKHRoaXMsIG1lbWJlck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgYnl0ZXMgSW5mb3JtYXRpb24gb2YgdGhlIG1lbWJlciAoc3RhdGljIHZlcnNpb24pIGJ5IENvbXBvbmVudFNJRFxuICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSB0aGUgQ29tcG9uZW50IHR5cGVcbiAgICogQHBhcmFtIGNvbXBvbmVudFNJRCB0aGUgQ29tcG9uZW50U0lEIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBvZiBjb21wb25lbnQgaW4gc3RyaW5nXG4gICAqIEByZXR1cm5zIGJ5dGVzIGluZm9ybWF0aW9uXG4gICAqL1xuICBzdGF0aWMgZ2V0RGF0YUJ5dGVJbmZvQnlDb21wb25lbnRTSUQoXG4gICAgY29tcG9uZW50VHlwZTogdHlwZW9mIENvbXBvbmVudCxcbiAgICBjb21wb25lbnRTSUQ6IENvbXBvbmVudFNJRCxcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50U0lEKTtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50LmdldERhdGFCeXRlSW5mb0lubmVyKGNvbXBvbmVudCwgbWVtYmVyTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGJ5dGVzIEluZm9ybWF0aW9uIG9mIHRoZSBtZW1iZXIgKHN0YXRpYyB2ZXJzaW9uKSBieSBFbnRpdHlVSURcbiAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgdGhlIGNvbXBvbmVudCB0eXBlXG4gICAqIEBwYXJhbSBlbnRpdHlVSUQgdGhlIEVudGl0eVVJRFxuICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG9mIGNvbXBvbmVudCBpbiBzdHJpbmdcbiAgICogQHJldHVybnMgYnl0ZXMgaW5mb3JtYXRpb25cbiAgICovXG4gIC8vIHN0YXRpYyBnZXREYXRhQnl0ZUluZm9CeUVudGl0eVVJRChcbiAgLy8gICBjb21wb25lbnRUeXBlOiB0eXBlb2YgQ29tcG9uZW50LFxuICAvLyAgIGVudGl0eVVJRDogRW50aXR5VUlELFxuICAvLyAgIG1lbWJlck5hbWU6IHN0cmluZ1xuICAvLyApIHtcbiAgLy8gICBjb25zdCBjb21wb25lbnQgPSBFbnRpdHlSZXBvc2l0b3J5LmdldENvbXBvbmVudE9mRW50aXR5KGVudGl0eVVJRCwgY29tcG9uZW50VHlwZSk7XG4gIC8vICAgaWYgKGNvbXBvbmVudCkge1xuICAvLyAgICAgcmV0dXJuIENvbXBvbmVudC5nZXREYXRhQnl0ZUluZm9Jbm5lcihjb21wb25lbnQsIG1lbWJlck5hbWUpO1xuICAvLyAgIH1cblxuICAvLyAgIHJldHVybiB2b2lkIDA7XG4gIC8vIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBQaXhlbCBMb2NhdGlvbiBPZmZzZXQgaW4gdGhlIEJ1ZmZlciBvZiB0aGUgTWVtYmVyXG4gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlIHRoZSBjb21wb25lbnQgdHlwZSAoZS5nLiBUcmFuc2Zvcm1Db21wb25lbnQgKVxuICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUgaW4gc3RyaW5nXG4gICAqIEByZXR1cm5zIHRoZSBwaXhlbCBvZmZzZXRzXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IHR5cGVvZiBDb21wb25lbnQsIG1lbWJlck5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50KGNvbXBvbmVudFR5cGUsIDApO1xuICAgIHJldHVybiAoY29tcG9uZW50IGFzIGFueSlbJ19ieXRlT2Zmc2V0T2ZBY2Nlc3NvckluQnVmZmVyXycgKyBtZW1iZXJOYW1lXSAvIDQgLyA0O1xuICB9XG5cbiAgLyoqXG4gICAqIEB2aXJ0dWFsXG4gICAqIEFkZCB0aGlzIGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBiYXNlIHRoZSB0YXJnZXQgZW50aXR5XG4gICAqIEBwYXJhbSBfY29tcG9uZW50Q2xhc3MgdGhlIGNvbXBvbmVudCBjbGFzcyB0byBhZGRcbiAgICovXG4gIGFkZFRoaXNDb21wb25lbnRUb0VudGl0eTxFbnRpdHlCYXNlIGV4dGVuZHMgSUVudGl0eSwgU29tZUNvbXBvbmVudENsYXNzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gICAgYmFzZTogRW50aXR5QmFzZSxcbiAgICBfY29tcG9uZW50Q2xhc3M6IFNvbWVDb21wb25lbnRDbGFzc1xuICApOiBFbnRpdHlCYXNlICYgQ29tcG9uZW50VG9Db21wb25lbnRNZXRob2RzPFNvbWVDb21wb25lbnRDbGFzcz4ge1xuICAgIC8vIGNhbiBub3QgYmUgY2FsbGVkLiB0aGlzIGlzIGEgdmlydHVhbCBtZXRob2QuXG4gICAgdGhyb3cgJ0ludmFsaWQgQ2FsbGluZyc7XG4gIH1cblxuICAvLyAkY3JlYXRlKCkge1xuICAvLyAgIC8vIERlZmluZSBwcm9jZXNzIGRlcGVuZGVuY2llcyB3aXRoIG90aGVyIGNvbXBvbmVudHMuXG4gIC8vICAgLy8gSWYgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFyZSBkZXRlY3RlZCwgdGhlIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQuXG5cbiAgLy8gICAvLyB0aGlzLnJlZ2lzdGVyRGVwZW5kZW5jeShUcmFuc2Zvcm1Db21wb25lbnQpO1xuICAvLyB9XG5cbiAgLy8gJGxvYWQoKSB7fVxuXG4gIC8vICRtb3VudCgpIHt9XG5cbiAgLy8gJGxvZ2ljKCkge31cblxuICAvLyAkcHJlcmVuZGVyKGluc3RhbmNlSURCdWZmZXJVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUpIHt9XG5cbiAgLy8gJHJlbmRlcigpIHt9XG5cbiAgLy8gJHVubW91bnQoKSB7fVxuXG4gIC8vICRkaXNjYXJkKCkge31cblxuICAvLy9cbiAgLy8vIGNvbnZlbmllbnQgbWV0aG9kcyBidXQgbm90IHVzZWQgeWV0XG4gIC8vL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIENvbXBvc2l0aW9uVHlwZSBvZiB0aGUgbWVtYmVyXG4gICAqIEBwYXJhbSBtZW1iZXJOYW1lIC0gdGhlIG1lbWJlciBuYW1lXG4gICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyAtIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICogQHJldHVybnMgQ29tcG9zaXRpb25UeXBlIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGdldENvbXBvc2l0aW9uVHlwZU9mTWVtYmVyKFxuICAgIG1lbWJlck5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnRDbGFzczogRnVuY3Rpb25cbiAgKTogQ29tcG9zaXRpb25UeXBlRW51bSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWVtYmVySW5mb0FycmF5ID0gdGhpcy5fX21lbWJlckluZm8uZ2V0KGNvbXBvbmVudENsYXNzKSE7XG4gICAgY29uc3QgaW5mbyA9IG1lbWJlckluZm9BcnJheS5maW5kKChpbmZvKSA9PiB7XG4gICAgICByZXR1cm4gaW5mby5tZW1iZXJOYW1lID09PSBtZW1iZXJOYW1lO1xuICAgIH0pO1xuICAgIGlmIChpbmZvICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBpbmZvLmNvbXBvc2l0aW9uVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBDb21wb25lbnRUeXBlIG9mIHRoZSBtZW1iZXJcbiAgICogQHBhcmFtIG1lbWJlck5hbWUgLSB0aGUgbWVtYmVyIG5hbWVcbiAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIC0gdGhlIGNvbXBvbmVudCBjbGFzc1xuICAgKiBAcmV0dXJucyBDb21wb25lbnRUeXBlIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGdldENvbXBvbmVudFR5cGVPZk1lbWJlcihcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50Q2xhc3M6IEZ1bmN0aW9uXG4gICk6IENvbXBvbmVudFR5cGVFbnVtIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZW1iZXJJbmZvQXJyYXkgPSB0aGlzLl9fbWVtYmVySW5mby5nZXQoY29tcG9uZW50Q2xhc3MpITtcbiAgICBjb25zdCBpbmZvID0gbWVtYmVySW5mb0FycmF5LmZpbmQoKGluZm8pID0+IHtcbiAgICAgIHJldHVybiBpbmZvLm1lbWJlck5hbWUgPT09IG1lbWJlck5hbWU7XG4gICAgfSk7XG4gICAgaWYgKGluZm8gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGluZm8uY29tcG9uZW50VHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIE1hcmsgdGhlIGNvbXBvbmVudCBhcyBkZXN0cm95ZWRcbiAgICovXG4gIF9kZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzQWxpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIF9zaGFsbG93Q29weUZyb20oY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICAvLyBuZXcgRXJyb3IoJ05vdCBJbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbXBvbmVudCB9IGZyb20gJy4vQ29tcG9uZW50JztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vQ29uZmlnJztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgQ29tcG9uZW50U0lELCBFbnRpdHlVSUQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9XZWxsS25vd25Db21wb25lbnRUSURzJztcblxuLyoqXG4gKiBUaGUgY2xhc3MgdGhhdCBnZW5lcmF0ZXMgYW5kIG1hbmFnZXMgYWxsIGtpbmRzIG9mIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRSZXBvc2l0b3J5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19jb21wb25lbnRfc2lkX2NvdW50X21hcDogTWFwPENvbXBvbmVudFRJRCwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19jb21wb25lbnRzOiBNYXA8Q29tcG9uZW50VElELCBBcnJheTxDb21wb25lbnQ+PiA9IG5ldyBNYXAoKTsgLy8gaW5kZXggb2YgYXJyYXkgSXMgQ29tcG9uZW50U0lEXG4gIHN0YXRpYyBfX2NvbXBvbmVudENsYXNzZXM6IE1hcDxDb21wb25lbnRUSUQsIHR5cGVvZiBDb21wb25lbnQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyBfX2NvbXBvbmVudFRJRHM6IEFycmF5PENvbXBvbmVudFRJRD4gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19yZW5kZXJpbmdDb21wb25lbnRUSURzOiBBcnJheTxDb21wb25lbnRUSUQ+ID0gW107XG4gIHN0YXRpYyByZWFkb25seSBpbnZhbGlkQ29tcG9uZW50U0lEID0gLTE7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIEEgY2xhc3Mgb2JqZWN0IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyQ29tcG9uZW50Q2xhc3MoY29tcG9uZW50Q2xhc3M6IHR5cGVvZiBDb21wb25lbnQpIHtcbiAgICBjb25zdCB0aGlzQ2xhc3MgPSBDb21wb25lbnRSZXBvc2l0b3J5O1xuICAgIHRoaXNDbGFzcy5fX2NvbXBvbmVudENsYXNzZXMuc2V0KGNvbXBvbmVudENsYXNzLmNvbXBvbmVudFRJRCwgY29tcG9uZW50Q2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlcmVnaXN0ZXIgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGNvbXBvbmVudFRJRCBBIGNvbXBvbmVudFRJRFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZXJlZ2lzdGVyQ29tcG9uZW50Q2xhc3MoY29tcG9uZW50VElEOiBDb21wb25lbnRUSUQpIHtcbiAgICBjb25zdCB0aGlzQ2xhc3MgPSBDb21wb25lbnRSZXBvc2l0b3J5O1xuICAgIHRoaXNDbGFzcy5fX2NvbXBvbmVudENsYXNzZXMuZGVsZXRlKGNvbXBvbmVudFRJRCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY2xhc3Mgb2JqZWN0IG9mIHRoZSBjb21wb25lbnQgY29ycmVzcG9uZGluZyB0byBzcGVjaWZpZWQgQ29tcG9uZW50VElELlxuICAgKiBAcGFyYW0gY29tcG9uZW50VGlkIFRoZSBjb21wb25lbnRUSUQgdG8gZ2V0IHRoZSBjbGFzcyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldENvbXBvbmVudENsYXNzKGNvbXBvbmVudFRpZDogQ29tcG9uZW50VElEKTogdHlwZW9mIENvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21wb25lbnRDbGFzc2VzLmdldChjb21wb25lbnRUaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBmb3IgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIGNvbXBvbmVudFRpZCBUaGUgY29tcG9uZW50VElEIHRvIGNyZWF0ZSB0aGUgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBlbnRpdHlVaWQgVGhlIGVudGl0eVVJRCBvZiB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gZW50aXR5UmVwb3NpdG9yeSB0aGUgcmVmZXJlbmNlIG9mIHRoZSBlbnRpdHlSZXBvc2l0b3J5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVDb21wb25lbnQoXG4gICAgY29tcG9uZW50VGlkOiBDb21wb25lbnRUSUQsXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgZW50aXR5UmVwb3NpdG9yeTogRW50aXR5UmVwb3NpdG9yeVxuICApIHtcbiAgICBjb25zdCB0aGlzQ2xhc3MgPSBDb21wb25lbnRSZXBvc2l0b3J5O1xuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpc0NsYXNzLl9fY29tcG9uZW50Q2xhc3Nlcy5nZXQoY29tcG9uZW50VGlkKTtcbiAgICBpZiAoSXMuZXhpc3QoY29tcG9uZW50Q2xhc3MpKSB7XG4gICAgICAvLyBVcGRhdGUgX19jb21wb25lbnRfc2lkX2NvdW50X21hcFxuICAgICAgbGV0IGNvbXBvbmVudF9zaWRfY291bnQgPSB0aGlzLl9fY29tcG9uZW50X3NpZF9jb3VudF9tYXAuZ2V0KGNvbXBvbmVudFRpZCk7XG4gICAgICBpZiAoSXMubm90LmV4aXN0KGNvbXBvbmVudF9zaWRfY291bnQpKSB7XG4gICAgICAgIHRoaXMuX19jb21wb25lbnRfc2lkX2NvdW50X21hcC5zZXQoY29tcG9uZW50VGlkLCAwKTtcbiAgICAgICAgY29tcG9uZW50X3NpZF9jb3VudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuaW52YWxpZENvbXBvbmVudFNJRDtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgX19jb21wb25lbnRzIGFycmF5IHdoZXRoZXIgaXQgaGFzIHVuZGVmaW5lZCBlbGVtZW50XG4gICAgICBjb25zdCBjb21wb25lbnRBcnJheSA9IHRoaXMuX19jb21wb25lbnRzLmdldChjb21wb25lbnRUaWQpO1xuICAgICAgbGV0IHVuZGVmaW5lZFNpZCA9IC0xO1xuICAgICAgaWYgKElzLmV4aXN0KGNvbXBvbmVudEFycmF5KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKElzLm5vdC5leGlzdChjb21wb25lbnRBcnJheVtpXSkpIHtcbiAgICAgICAgICAgIHVuZGVmaW5lZFNpZCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lEID0gLTE7XG4gICAgICBsZXQgaXNSZVVzZSA9IGZhbHNlO1xuICAgICAgaWYgKHVuZGVmaW5lZFNpZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gdW5kZWZpbmVkIGVsZW1lbnQsIGlzc3VlIGEgbmV3IGNvbXBvbmVudF9zaWRcbiAgICAgICAgdGhpcy5fX2NvbXBvbmVudF9zaWRfY291bnRfbWFwLnNldChjb21wb25lbnRUaWQsICsrY29tcG9uZW50X3NpZF9jb3VudCk7XG4gICAgICAgIGNvbXBvbmVudFNpZCA9IGNvbXBvbmVudF9zaWRfY291bnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyB1bmRlZmluZWQgZWxlbWVudCwgcmV1c2UgdGhlIGNvbXBvbmVudF9zaWRcbiAgICAgICAgY29tcG9uZW50U2lkID0gdW5kZWZpbmVkU2lkO1xuICAgICAgICBpc1JlVXNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIGNyZWF0ZSB0aGUgY29tcG9uZW50XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgY29tcG9uZW50Q2xhc3MoXG4gICAgICAgIGVudGl0eVVpZCxcbiAgICAgICAgY29tcG9uZW50U2lkLFxuICAgICAgICBlbnRpdHlSZXBvc2l0b3J5LFxuICAgICAgICBpc1JlVXNlXG4gICAgICApIGFzIENvbXBvbmVudDtcblxuICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNvbXBvbmVudFxuICAgICAgaWYgKCF0aGlzLl9fY29tcG9uZW50cy5oYXMoY29tcG9uZW50VGlkKSkge1xuICAgICAgICB0aGlzLl9fY29tcG9uZW50cy5zZXQoY29tcG9uZW50VGlkLCBbXSk7XG4gICAgICAgIHRoaXMuX191cGRhdGVDb21wb25lbnRUSURzKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhcnJheSA9IHRoaXMuX19jb21wb25lbnRzLmdldChjb21wb25lbnRUaWQpO1xuICAgICAgYXJyYXkhW2NvbXBvbmVudC5jb21wb25lbnRTSURdID0gY29tcG9uZW50O1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQ29tcG9uZW50IENsYXNzIG9iamVjdCBpcyBpbnZhbGlkLicpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVsZXRlQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50KSB7XG4gICAgY29uc3QgdGhpc0NsYXNzID0gQ29tcG9uZW50UmVwb3NpdG9yeTtcbiAgICBjb25zdCBjb21wb25lbnRUaWQgPSBjb21wb25lbnQuY29tcG9uZW50VElEO1xuICAgIGNvbnN0IGNvbXBvbmVudFNpZCA9IGNvbXBvbmVudC5jb21wb25lbnRTSUQ7XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzQ2xhc3MuX19jb21wb25lbnRzLmdldChjb21wb25lbnRUaWQpO1xuICAgIGlmIChhcnJheSAhPSBudWxsKSB7XG4gICAgICBkZWxldGUgYXJyYXlbY29tcG9uZW50U2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBvbmVudCBjbGFzcyBhbmQgY29tcG9uZW50U0lELlxuICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgVGhlIGNsYXNzIG9iamVjdCB0byBnZXQgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGNvbXBvbmVudFNpZCBUaGUgY29tcG9uZW50U0lEIHRvIGdldCB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRDb21wb25lbnQoY29tcG9uZW50Q2xhc3M6IHR5cGVvZiBDb21wb25lbnQsIGNvbXBvbmVudFNpZDogQ29tcG9uZW50U0lEKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50RnJvbUNvbXBvbmVudFRJRChjb21wb25lbnRDbGFzcy5jb21wb25lbnRUSUQsIGNvbXBvbmVudFNpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBvbmVudFRJRCBhbmQgY29tcG9uZW50U0lELlxuICAgKiBAcGFyYW0gY29tcG9uZW50VGlkIFRoZSBjb21wb25lbnRUSUQgdG8gZ2V0IHRoZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBjb21wb25lbnRTaWQgVGhlIGNvbXBvbmVudFNJRCB0byBnZXQgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcG9uZW50RnJvbUNvbXBvbmVudFRJRChcbiAgICBjb21wb25lbnRUaWQ6IENvbXBvbmVudFRJRCxcbiAgICBjb21wb25lbnRTaWQ6IENvbXBvbmVudFNJRFxuICApIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLl9fY29tcG9uZW50cy5nZXQoY29tcG9uZW50VGlkKTtcbiAgICBpZiAobWFwICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG1hcFtjb21wb25lbnRTaWRdO1xuICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXBbY29tcG9uZW50U2lkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEdldHMgYW4gYXJyYXkgb2YgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIFRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2dldENvbXBvbmVudHMoY29tcG9uZW50Q2xhc3M6IHR5cGVvZiBDb21wb25lbnQpOiBBcnJheTxDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5fX2NvbXBvbmVudHMuZ2V0KGNvbXBvbmVudENsYXNzLmNvbXBvbmVudFRJRCk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEdldHMgYW4gYXJyYXkgb2YgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudCAoZGVhZCBjb21wb25lbnRzIGluY2x1ZGVkKS5cbiAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIFRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2dldENvbXBvbmVudHNJbmNsdWRpbmdEZWFkKFxuICAgIGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50XG4gICk6IEFycmF5PENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLl9fY29tcG9uZW50cy5nZXQoY29tcG9uZW50Q2xhc3MuY29tcG9uZW50VElEKTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWVtb3J5QmVnaW5JbmRleChjb21wb25lbnRUaWQ6IENvbXBvbmVudFRJRCkge1xuICAgIGxldCBtZW1vcnlCZWdpbkluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudFRpZDsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IENvbXBvbmVudFJlcG9zaXRvcnkuX19jb21wb25lbnRDbGFzc2VzLmdldChpKTtcbiAgICAgIGlmIChjb21wb25lbnRDbGFzcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNpemVPZkNvbXBvbmVudCA9IChjb21wb25lbnRDbGFzcyBhcyBhbnkpLnNpemVPZlRoaXNDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IG1heEVudGl0eU51bWJlciA9IENvbmZpZy5tYXhFbnRpdHlOdW1iZXI7XG4gICAgICAgIG1lbW9yeUJlZ2luSW5kZXggKz0gc2l6ZU9mQ29tcG9uZW50ICogbWF4RW50aXR5TnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVtb3J5QmVnaW5JbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFycmF5IG9mIGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgY2xhc3Mgb2JqZWN0IG9mIHRoZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlIFRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcG9uZW50c1dpdGhUeXBlKGNvbXBvbmVudFR5cGU6IHR5cGVvZiBDb21wb25lbnQpOiBBcnJheTxDb21wb25lbnQ+IHtcbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5fX2NvbXBvbmVudHMuZ2V0KGNvbXBvbmVudFR5cGUuY29tcG9uZW50VElEKTtcbiAgICBpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRzLmZpbHRlcigoY29tcG9uZW50KSA9PiBjb21wb25lbnQgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX3VwZGF0ZUNvbXBvbmVudFRJRHMoKSB7XG4gICAgY29uc3QgY29tcG9uZW50VGlkcyA9IEFycmF5LmZyb20odGhpcy5fX2NvbXBvbmVudHMua2V5cygpKTtcbiAgICBjb21wb25lbnRUaWRzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICB0aGlzLl9fY29tcG9uZW50VElEcyA9IGNvbXBvbmVudFRpZHM7XG5cbiAgICBjb25zdCByZW5kZXJpbmdDb21wb25lbnRUaWRzOiBDb21wb25lbnRUSURbXSA9IFtdO1xuICAgIHJlbmRlcmluZ0NvbXBvbmVudFRpZHMucHVzaChXZWxsS25vd25Db21wb25lbnRUSURzLk1lc2hSZW5kZXJlckNvbXBvbmVudFRJRCk7IC8vIE1lc2hSZW5kZXJlckNvbXBvbmVudCBpcyBhbHdheXMgYWN0aXZlXG5cbiAgICBpZiAodGhpcy5fX2NvbXBvbmVudHMuaGFzKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuRWZmZWtzZWVyQ29tcG9uZW50VElEKSkge1xuICAgICAgcmVuZGVyaW5nQ29tcG9uZW50VGlkcy5wdXNoKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuRWZmZWtzZWVyQ29tcG9uZW50VElEKTtcbiAgICB9XG4gICAgdGhpcy5fX3JlbmRlcmluZ0NvbXBvbmVudFRJRHMgPSByZW5kZXJpbmdDb21wb25lbnRUaWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGNvbXBvbmVudFRJRHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldENvbXBvbmVudFRJRHMoKTogQXJyYXk8Q29tcG9uZW50VElEPiB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21wb25lbnRUSURzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHJlbmRlcmluZyBjb21wb25lbnRUSURzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRSZW5kZXJpbmdDb21wb25lbnRUSURzKCk6IEFycmF5PENvbXBvbmVudFRJRD4ge1xuICAgIHJldHVybiB0aGlzLl9fcmVuZGVyaW5nQ29tcG9uZW50VElEcztcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWNvbnN0ICovXG5pbXBvcnQgeyBCb25lRGF0YVR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Cb25lRGF0YVR5cGUnO1xuaW1wb3J0IHsgTWlzY1V0aWwgfSBmcm9tICcuLi9taXNjJztcblxubGV0IG1heEVudGl0eU51bWJlciA9IDUwMDA7XG5sZXQgbWF4TGlnaHROdW1iZXJJblNoYWRlciA9IDQ7XG5sZXQgbWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlciA9IDEwMDtcbmxldCBtYXhWZXJ0ZXhQcmltaXRpdmVOdW1iZXJJblNoYWRlciA9IDIwO1xubGV0IG1heE1hdGVyaWFsSW5zdGFuY2VGb3JFYWNoVHlwZSA9IDEwO1xubGV0IG1heFNrZWxldG9uTnVtYmVyID0gMzM7XG5sZXQgbWF4Q2FtZXJhTnVtYmVyID0gMzA7XG5sZXQgbWF4U2l6ZUxpbWl0T2ZOb25Db21wcmVzc2VkVGV4dHVyZSA9IDUxMjtcblxuLy8vIFNoYWRlckdsb2JhbFN0b3JhZ2VTaXplIC8vL1xubGV0IG1heFNrZWxldGFsQm9uZU51bWJlciA9IDMwMDtcbmxldCBtYXhTa2VsZXRhbEJvbmVOdW1iZXJGb3JVbmlmb3JtTW9kZSA9IDUwOyAvLyBGb3IgVW5pZm9ybSBNb2RlXG5sZXQgZGF0YVRleHR1cmVXaWR0aCA9IE1hdGgucG93KDIsIDEyKTtcbmxldCBkYXRhVGV4dHVyZUhlaWdodCA9IE1hdGgucG93KDIsIDEyKTtcbmxldCBib25lRGF0YVR5cGUgPSBCb25lRGF0YVR5cGUuTWF0NDN4MTtcbmxldCBtYXhNb3JwaFRhcmdldE51bWJlciA9IDQ7XG5sZXQgdG90YWxTaXplT2ZHUFVTaGFkZXJEYXRhU3RvcmFnZUV4Y2VwdE1vcnBoRGF0YSA9IDA7XG5sZXQgaXNVYm9FbmFibGVkID0gZmFsc2U7XG5sZXQgZXZlbnRUYXJnZXREb206IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xubGV0IGNhY2hlV2ViR3B1UmVuZGVyQnVuZGxlcyA9IHRydWU7IC8vIEZvciBXZWJHUFUgZGVidWcsIHNldCBmYWxzZSB0byBkaXNhYmxlIGNhY2hlXG5sZXQgY2dBcGlEZWJ1Z0NvbnNvbGVPdXRwdXQgPSBmYWxzZTtcbmxldCBtdWx0aVZpZXdGb3JXZWJWUiA9IGZhbHNlO1xuXG5pZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgaWYgKE1pc2NVdGlsLmlzTW9iaWxlKCkgfHwgTWlzY1V0aWwuaXNNb2JpbGVWcigpKSB7XG4gICAgbWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlciA9IDQ7XG4gICAgbWF4U2tlbGV0b25OdW1iZXIgPSAzMjtcbiAgICBkYXRhVGV4dHVyZVdpZHRoID0gMiAqKiA5O1xuICAgIGRhdGFUZXh0dXJlSGVpZ2h0ID0gMiAqKiA5O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDb25maWcgPSB7XG4gIG1heEVudGl0eU51bWJlcixcbiAgbWF4TGlnaHROdW1iZXJJblNoYWRlcixcbiAgbWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcixcbiAgbWF4VmVydGV4UHJpbWl0aXZlTnVtYmVySW5TaGFkZXIsXG4gIG1heE1hdGVyaWFsSW5zdGFuY2VGb3JFYWNoVHlwZSxcbiAgYm9uZURhdGFUeXBlLFxuICBtYXhTa2VsZXRvbk51bWJlcixcbiAgbWF4Q2FtZXJhTnVtYmVyLFxuICBtYXhTaXplTGltaXRPZk5vbkNvbXByZXNzZWRUZXh0dXJlLFxuICBtYXhTa2VsZXRhbEJvbmVOdW1iZXIsXG4gIG1heFNrZWxldGFsQm9uZU51bWJlckZvclVuaWZvcm1Nb2RlLFxuICBkYXRhVGV4dHVyZVdpZHRoLFxuICBkYXRhVGV4dHVyZUhlaWdodCxcbiAgbWF4TW9ycGhUYXJnZXROdW1iZXIsXG4gIHRvdGFsU2l6ZU9mR1BVU2hhZGVyRGF0YVN0b3JhZ2VFeGNlcHRNb3JwaERhdGEsXG4gIGlzVWJvRW5hYmxlZCxcbiAgZXZlbnRUYXJnZXREb20sXG4gIGNhY2hlV2ViR3B1UmVuZGVyQnVuZGxlcyxcbiAgY2dBcGlEZWJ1Z0NvbnNvbGVPdXRwdXQsXG4gIG11bHRpVmlld0ZvcldlYlZSLFxufTtcbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4vQ29tcG9uZW50JztcbmltcG9ydCB7IElSbk9iamVjdCwgUm5PYmplY3QgfSBmcm9tICcuL1JuT2JqZWN0JztcbmltcG9ydCB7IENvbXBvbmVudFRJRCwgRW50aXR5VUlEIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IEJsZW5kU2hhcGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0JsZW5kU2hhcGUvQmxlbmRTaGFwZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYUNvbnRyb2xsZXIvQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWdodENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvTGlnaHQvTGlnaHRDb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvTWVzaC9NZXNoQ29tcG9uZW50JztcbmltcG9ydCB7IE1lc2hSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL01lc2hSZW5kZXJlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBQaHlzaWNzQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9QaHlzaWNzL1BoeXNpY3NDb21wb25lbnQnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50JztcbmltcG9ydCB7IFNrZWxldGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Ta2VsZXRhbC9Ta2VsZXRhbENvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL1RyYW5zZm9ybS9UcmFuc2Zvcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9BbmltYXRpb24vQW5pbWF0aW9uQ29tcG9uZW50JztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBWcm1Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL1ZybS9Wcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgQ29uc3RyYWludENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29uc3RyYWludC9Db25zdHJhaW50Q29tcG9uZW50JztcbmltcG9ydCB7IEVmZmVrc2VlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VmZmVrc2Vlcic7XG5pbXBvcnQgeyBBbmltYXRpb25TdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQW5pbWF0aW9uU3RhdGUvQW5pbWF0aW9uU3RhdGVDb21wb25lbnQnO1xuXG4vKipcbiAqIFRoZSBJbnRlcmZhY2UgZm9yIGFuIEVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRW50aXR5IGV4dGVuZHMgSVJuT2JqZWN0IHtcbiAgZW50aXR5VUlEOiBFbnRpdHlVSUQ7XG4gIF9pc0FsaXZlOiBib29sZWFuO1xuICBfbXlMYXRlc3RDb3B5RW50aXR5VUlEOiBFbnRpdHlVSUQ7XG4gIGdldENvbXBvbmVudChjb21wb25lbnRUeXBlOiB0eXBlb2YgQ29tcG9uZW50KTogQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICBnZXRDb21wb25lbnRCeUNvbXBvbmVudFRJRChjb21wb25lbnRUSUQ6IENvbXBvbmVudFRJRCk6IENvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgX3NldENvbXBvbmVudChjb21wb25lbnRUeXBlOiB0eXBlb2YgQ29tcG9uZW50LCBjb206IENvbXBvbmVudCk6IHZvaWQ7XG4gIGhhc0NvbXBvbmVudChjb21wb25lbnRUeXBlOiB0eXBlb2YgQ29tcG9uZW50KTogYm9vbGVhbjtcbiAgX3JlbW92ZUNvbXBvbmVudChjb21wb25lbnRUSUQ6IENvbXBvbmVudFRJRCk6IHZvaWQ7XG4gIHRyeVRvR2V0QmxlbmRTaGFwZSgpOiBCbGVuZFNoYXBlQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldENhbWVyYSgpOiBDYW1lcmFDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHRyeVRvR2V0Q2FtZXJhQ29udHJvbGxlcigpOiBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldExpZ2h0KCk6IExpZ2h0Q29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldE1lc2goKTogTWVzaENvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgdHJ5VG9HZXRNZXNoUmVuZGVyZXIoKTogTWVzaFJlbmRlcmVyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldFBoeXNpY3MoKTogUGh5c2ljc0NvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgdHJ5VG9HZXRTY2VuZUdyYXBoKCk6IFNjZW5lR3JhcGhDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHRyeVRvR2V0U2tlbGV0YWwoKTogU2tlbGV0YWxDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHRyeVRvR2V0VHJhbnNmb3JtKCk6IFRyYW5zZm9ybUNvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgdHJ5VG9HZXRBbmltYXRpb24oKTogQW5pbWF0aW9uQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldEFuaW1hdGlvblN0YXRlKCk6IEFuaW1hdGlvblN0YXRlQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldFZybSgpOiBWcm1Db21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHRyeVRvR2V0Q29uc3RyYWludCgpOiBDb25zdHJhaW50Q29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICB0cnlUb0dldEVmZmVrc2VlcigpOiBFZmZla3NlZXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIF9kZXN0cm95KCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBlbnRpdHkuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBSaG9kb25pdGUgRW50aXR5IENsYXNzIHdoaWNoIGFyZSBhbiBlbnRpdGllcyB0aGF0IGV4aXN0cyBpbiBzcGFjZS5cbiAqIEVudGl0aWVzIGNhbiBhY3F1aXJlIHZhcmlvdXMgZnVuY3Rpb25zIGJ5IGhhdmluZyBjb21wb25lbnRzIG9uIHRoZW1zZWx2ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnRpdHkgZXh0ZW5kcyBSbk9iamVjdCBpbXBsZW1lbnRzIElFbnRpdHkge1xuICAvKiogVGhlIFVuaXF1ZSBJRCBvZiBFbnRpdHkgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfX19lbnRpdHlfdWlkOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBNYXAgb2YgY29tcG9uZW50cy4gQWxsIGNvbXBvbmVudHMgbXVzdCBiZSBtYW5hZ2VkIGluIHRoaXMgbWFwICovXG4gIHByb3RlY3RlZCBfX2NvbXBvbmVudHM6IE1hcDxDb21wb25lbnRUSUQsIENvbXBvbmVudD47IC8vIGluZGV4IGlzIENvbXBvbmVudFRJRFxuXG4gIC8qKiBJbnZhbGlkIEVudGl0eSBVSUQgY29uc3RhbnQgdmFsdWUgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGludmFsaWRFbnRpdHlVSUQgPSAtMTtcbiAgcHVibGljIF9teUxhdGVzdENvcHlFbnRpdHlVSUQgPSBFbnRpdHkuaW52YWxpZEVudGl0eVVJRDtcblxuICAvKiogTm8gdXNlIHlldCAqL1xuICBfaXNBbGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBFbnRpdHkgY2xhc3MuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFdoZW4gY3JlYXRpbmcgYW4gRW50aXR5LCB1c2UgdGhlIGNyZWF0ZUVudGl0eSBtZXRob2Qgb2YgdGhlIEVudGl0eVJlcG9zaXRvcnkgY2xhc3NcbiAgICogaW5zdGVhZCBvZiBkaXJlY3RseSBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlVSUQgLSBUaGUgdW5pcXVlIElEIG9mIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIGlzQWxpdmUgLSBXaGV0aGVyIHRoaXMgZW50aXR5IGFsaXZlIG9yIG5vdFxuICAgKiBAcGFyYW0gZW50aXR5Q29tcG9uZW50IC0gVGhlIGluc3RhbmNlIG9mIEVudGl0eUNvbXBvbmVudCAoRGVwZW5kZW5jeSBJbmplY3Rpb24pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdHlVSUQ6IEVudGl0eVVJRCwgaXNBbGl2ZTogYm9vbGVhbiwgY29tcG9uZW50cz86IE1hcDxDb21wb25lbnRUSUQsIENvbXBvbmVudD4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX19fZW50aXR5X3VpZCA9IGVudGl0eVVJRDtcbiAgICB0aGlzLl9pc0FsaXZlID0gaXNBbGl2ZTtcblxuICAgIHRoaXMuX19jb21wb25lbnRzID0gSXMuZXhpc3QoY29tcG9uZW50cykgPyBjb21wb25lbnRzIDogbmV3IE1hcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBVbmlxdWUgSUQgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIGdldCBlbnRpdHlVSUQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19fZW50aXR5X3VpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgY29tcG9uZW50IHRvIHRoaXMgZW50aXR5LlxuICAgKiBAcGFyYW0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gc2V0LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRDb21wb25lbnQoY29tcG9uZW50VHlwZTogdHlwZW9mIENvbXBvbmVudCwgY29tcG9uZW50OiBDb21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9fY29tcG9uZW50cy5zZXQoY29tcG9uZW50VHlwZS5jb21wb25lbnRUSUQsIGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHdoZXRoZXIgdGhpcyBlbnRpdHkgaGFzIHRoZSBjb21wb25lbnQgb3Igbm90XG4gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlIC0gVGhlIGNvbXBvbmVudCB0byBjaGVja1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgaGFzQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IHR5cGVvZiBDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbXBvbmVudHMuaGFzKGNvbXBvbmVudFR5cGUuY29tcG9uZW50VElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbXBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0aGUgZW50aXR5IGhhc1xuICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZVxuICAgKi9cbiAgZ2V0Q29tcG9uZW50KGNvbXBvbmVudFR5cGU6IHR5cGVvZiBDb21wb25lbnQpOiBDb21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fY29tcG9uZW50cy5nZXQoY29tcG9uZW50VHlwZS5jb21wb25lbnRUSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBDb21wb25lbnRUSUQuXG4gICAqIEBwYXJhbSBjb21wb25lbnRUSUQgLSBUaGUgQ29tcG9uZW50VElEIHRvIGdldCB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoY29tcG9uZW50VElEOiBDb21wb25lbnRUSUQpOiBDb21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fY29tcG9uZW50cy5nZXQoY29tcG9uZW50VElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29tcG9uZW50VElEXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3JlbW92ZUNvbXBvbmVudChjb21wb25lbnRUSUQ6IENvbXBvbmVudFRJRCkge1xuICAgIHRoaXMuX19jb21wb25lbnRzLmRlbGV0ZShjb21wb25lbnRUSUQpO1xuICB9XG5cbiAgLy8vXG4gIC8vLyB0cnlUb0dldCBtZXRob2RzXG4gIC8vL1xuXG4gIC8qKlxuICAgKiB0cnkgdG8gZ2V0IGFuIEFuaW1hdGlvbiBDb21wb25lbnQgaWYgdGhlIGVudGl0eSBoYXMgaXQuXG4gICAqIEByZXR1cm5zIEFuaW1hdGlvbkNvbXBvbmVudCB8IHVuZGVmaW5lZFxuICAgKi9cbiAgdHJ5VG9HZXRBbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoV2VsbEtub3duQ29tcG9uZW50VElEcy5BbmltYXRpb25Db21wb25lbnRUSUQpIGFzXG4gICAgICB8IEFuaW1hdGlvbkNvbXBvbmVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnlUb0dldEFuaW1hdGlvblN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQW5pbWF0aW9uU3RhdGVDb21wb25lbnRUSUQpIGFzXG4gICAgICB8IEFuaW1hdGlvblN0YXRlQ29tcG9uZW50XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeVRvR2V0QmxlbmRTaGFwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRCeUNvbXBvbmVudFRJRChXZWxsS25vd25Db21wb25lbnRUSURzLkJsZW5kU2hhcGVDb21wb25lbnRUSUQpIGFzXG4gICAgICB8IEJsZW5kU2hhcGVDb21wb25lbnRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5VG9HZXRDYW1lcmEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUQpIGFzXG4gICAgICB8IENhbWVyYUNvbXBvbmVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnlUb0dldENhbWVyYUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb250cm9sbGVyQ29tcG9uZW50VElEKSBhc1xuICAgICAgfCBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeVRvR2V0TGlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoV2VsbEtub3duQ29tcG9uZW50VElEcy5MaWdodENvbXBvbmVudFRJRCkgYXNcbiAgICAgIHwgTGlnaHRDb21wb25lbnRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5VG9HZXRNZXNoKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTWVzaENvbXBvbmVudFRJRCkgYXNcbiAgICAgIHwgTWVzaENvbXBvbmVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnlUb0dldE1lc2hSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRCeUNvbXBvbmVudFRJRChXZWxsS25vd25Db21wb25lbnRUSURzLk1lc2hSZW5kZXJlckNvbXBvbmVudFRJRCkgYXNcbiAgICAgIHwgTWVzaFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeVRvR2V0UGh5c2ljcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRCeUNvbXBvbmVudFRJRChXZWxsS25vd25Db21wb25lbnRUSURzLlBoeXNpY3NDb21wb25lbnRUSUQpIGFzXG4gICAgICB8IFBoeXNpY3NDb21wb25lbnRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5VG9HZXRTY2VuZUdyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2NlbmVHcmFwaENvbXBvbmVudFRJRCkgYXNcbiAgICAgIHwgU2NlbmVHcmFwaENvbXBvbmVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnlUb0dldFNrZWxldGFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2tlbGV0YWxDb21wb25lbnRUSUQpIGFzXG4gICAgICB8IFNrZWxldGFsQ29tcG9uZW50XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeVRvR2V0VHJhbnNmb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuVHJhbnNmb3JtQ29tcG9uZW50VElEKSBhc1xuICAgICAgfCBUcmFuc2Zvcm1Db21wb25lbnRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5VG9HZXRWcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoV2VsbEtub3duQ29tcG9uZW50VElEcy5Wcm1Db21wb25lbnRUSUQpIGFzXG4gICAgICB8IFZybUNvbXBvbmVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnlUb0dldENvbnN0cmFpbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoV2VsbEtub3duQ29tcG9uZW50VElEcy5Db25zdHJhaW50Q29tcG9uZW50VElEKSBhc1xuICAgICAgfCBDb25zdHJhaW50Q29tcG9uZW50XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeVRvR2V0RWZmZWtzZWVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFdlbGxLbm93bkNvbXBvbmVudFRJRHMuRWZmZWtzZWVyQ29tcG9uZW50VElEKSBhc1xuICAgICAgfCBFZmZla3NlZXJDb21wb25lbnRcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIGVudGl0eSBhcyBkZXN0cm95ZWRcbiAgICovXG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMuX19jb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudCkgPT4ge1xuICAgICAgY29tcG9uZW50Ll9kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5faXNBbGl2ZSA9IGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJRW50aXR5LCBFbnRpdHkgfSBmcm9tICcuL0VudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuL0NvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZXBvc2l0b3J5IH0gZnJvbSAnLi9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IFJuVGFncywgRW50aXR5VUlELCBDb21wb25lbnRUSUQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyB2YWx1ZVdpdGhDb21wZW5zYXRpb24gfSBmcm9tICcuLi9taXNjL01pc2NVdGlsJztcbmltcG9ydCB7IENvbXBvbmVudFRvQ29tcG9uZW50TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29tcG9uZW50VHlwZXMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9jb21wb25lbnRzL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50JztcbmltcG9ydCB7IFNrZWxldGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Ta2VsZXRhbC9Ta2VsZXRhbENvbXBvbmVudCc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYyc7XG5cbi8qKlxuICogVGhlIGNsYXNzIHRoYXQgZ2VuZXJhdGVzIGFuZCBtYW5hZ2VzIGVudGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5UmVwb3NpdG9yeSB7XG4gIHByaXZhdGUgc3RhdGljIF9fZW50aXR5X3VpZF9jb3VudDogbnVtYmVyID0gRW50aXR5LmludmFsaWRFbnRpdHlVSUQ7XG4gIHByaXZhdGUgc3RhdGljIF9fZW50aXRpZXM6IEFycmF5PElFbnRpdHkgfCB1bmRlZmluZWQ+ID0gW107XG4gIHN0YXRpYyBfY29tcG9uZW50czogQXJyYXk8TWFwPENvbXBvbmVudFRJRCwgQ29tcG9uZW50Pj4gPSBbXTsgLy8gaW5kZXggaXMgRW50aXR5VUlEXG4gIHByaXZhdGUgc3RhdGljIF9fdXBkYXRlQ291bnQgPSAwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVFbnRpdHkoKTogSUVudGl0eSB7XG4gICAgLy8gY2hlY2sgZGVhZCBlbnRpdHlcbiAgICBsZXQgZGVhZFVpZCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX2VudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fX2VudGl0aWVzW2ldID09IG51bGwpIHtcbiAgICAgICAgZGVhZFVpZCA9IGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eVVpZCA9IC0xO1xuICAgIGlmIChkZWFkVWlkID09PSAtMSkge1xuICAgICAgLy8gaWYgYWxsIGVudGl0eSBpcyBhbGl2ZSwgaXNzdWUgYSBuZXcgZW50aXR5VWlkXG4gICAgICBlbnRpdHlVaWQgPSArK3RoaXMuX19lbnRpdHlfdWlkX2NvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB0aGVyZSBpcyBhIGRlYWQgZW50aXR5LCByZXVzZSB0aGUgZW50aXR5VWlkXG4gICAgICBlbnRpdHlVaWQgPSBkZWFkVWlkO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IG5ldyBFbnRpdHkoZW50aXR5VWlkLCB0cnVlKTtcbiAgICB0aGlzLl9fZW50aXRpZXNbZW50aXR5VWlkXSA9IGVudGl0eTtcblxuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuXG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVsZXRlRW50aXR5KGVudGl0eVVpZDogRW50aXR5VUlEKTogdm9pZCB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9jb21wb25lbnRzW2VudGl0eVVpZF0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2NvbXBvbmVudFRpZCwgY29tcG9uZW50XSBvZiB0aGlzLl9jb21wb25lbnRzW2VudGl0eVVpZF0pIHtcbiAgICAgIGlmIChjb21wb25lbnRUaWQgPT09IFdlbGxLbm93bkNvbXBvbmVudFRJRHMuU2NlbmVHcmFwaENvbXBvbmVudFRJRCkge1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoID0gY29tcG9uZW50IGFzIHVua25vd24gYXMgSVNjZW5lR3JhcGhFbnRpdHk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2NlbmVHcmFwaC5jaGlsZHJlbi5jb25jYXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIEVudGl0eVJlcG9zaXRvcnkuZGVsZXRlRW50aXR5KGNoaWxkLmVudGl0eS5lbnRpdHlVSUQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBDb21wb25lbnRSZXBvc2l0b3J5LmRlbGV0ZUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLl9fZW50aXRpZXNbZW50aXR5VWlkXT8uX2Rlc3Ryb3koKTtcbiAgICBkZWxldGUgdGhpcy5fX2VudGl0aWVzW2VudGl0eVVpZF07XG4gICAgZGVsZXRlIHRoaXMuX2NvbXBvbmVudHNbZW50aXR5VWlkXTtcblxuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkZWxldGVFbnRpdHlSZWN1cnNpdmVseShlbnRpdHlVaWQ6IEVudGl0eVVJRCk6IHZvaWQge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5KGVudGl0eVVpZCk7XG4gICAgY29uc3QgZW50aXRpZXM6IElFbnRpdHlbXSA9IFtdO1xuICAgIGNvbnN0IHNnID0gZW50aXR5LnRyeVRvR2V0U2NlbmVHcmFwaCgpO1xuICAgIGlmIChzZyAhPSBudWxsKSB7XG4gICAgICBlbnRpdGllcy5wdXNoKHNnLmVudGl0eSk7XG4gICAgICBhZGRDaGlsZChzZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ2hpbGQoc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2cuY2hpbGRyZW47XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGVudGl0aWVzLnB1c2goY2hpbGQuZW50aXR5KTtcbiAgICAgICAgYWRkQ2hpbGQoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICBFbnRpdHlSZXBvc2l0b3J5LmRlbGV0ZUVudGl0eShlbnRpdHkuZW50aXR5VUlEKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNoYWxsb3dDb3B5RW50aXR5KGVudGl0eTogSUVudGl0eSk6IElFbnRpdHkge1xuICAgIGNvbnN0IG5ld0VudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuX3NoYWxsb3dDb3B5RW50aXR5SW5uZXIoZW50aXR5KTtcblxuICAgIHRoaXMuX19zZXRKb2ludHMoZW50aXR5KTtcbiAgICB0aGlzLl9faGFuZGxlVGFnRGF0YShuZXdFbnRpdHkgYXMgdW5rbm93biBhcyBFbnRpdHkpO1xuXG4gICAgcmV0dXJuIG5ld0VudGl0eTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2V0Sm9pbnRzKGVudGl0eTogSUVudGl0eSkge1xuICAgIGNvbnN0IG5ld0VudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuZ2V0RW50aXR5KGVudGl0eS5fbXlMYXRlc3RDb3B5RW50aXR5VUlEKTtcbiAgICBjb25zdCBza2VsZXRhbENvbXBvbmVudE9mTmV3ID0gbmV3RW50aXR5LmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5Ta2VsZXRhbENvbXBvbmVudFRJRFxuICAgICkgYXMgU2tlbGV0YWxDb21wb25lbnQ7XG4gICAgY29uc3Qgc2tlbGV0YWxDb21wb25lbnRPZk9yaWdpbmFsID0gZW50aXR5LmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5Ta2VsZXRhbENvbXBvbmVudFRJRFxuICAgICkgYXMgU2tlbGV0YWxDb21wb25lbnQ7XG4gICAgaWYgKElzLmV4aXN0KHNrZWxldGFsQ29tcG9uZW50T2ZOZXcpICYmIElzLmV4aXN0KHNrZWxldGFsQ29tcG9uZW50T2ZPcmlnaW5hbCkpIHtcbiAgICAgIGNvbnN0IGpvaW50c09yaWdpbmFsID0gc2tlbGV0YWxDb21wb25lbnRPZk9yaWdpbmFsLmdldEpvaW50cygpO1xuICAgICAgY29uc3Qgam9pbnRzTmV3ID0gam9pbnRzT3JpZ2luYWwubWFwKChqb2ludCkgPT4ge1xuICAgICAgICByZXR1cm4gRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkoXG4gICAgICAgICAgam9pbnQuZW50aXR5Ll9teUxhdGVzdENvcHlFbnRpdHlVSURcbiAgICAgICAgKS50cnlUb0dldFNjZW5lR3JhcGgoKSE7XG4gICAgICB9KTtcbiAgICAgIHNrZWxldGFsQ29tcG9uZW50T2ZOZXcuc2V0Sm9pbnRzKGpvaW50c05ldyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVHcmFwaCA9IGVudGl0eS50cnlUb0dldFNjZW5lR3JhcGgoKTtcbiAgICBpZiAoSXMuZXhpc3Qoc2NlbmVHcmFwaCkpIHtcbiAgICAgIHNjZW5lR3JhcGguY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgRW50aXR5UmVwb3NpdG9yeS5fX3NldEpvaW50cyhjaGlsZC5lbnRpdHkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIF9zaGFsbG93Q29weUVudGl0eUlubmVyKGVudGl0eTogSUVudGl0eSkge1xuICAgIGNvbnN0IG5ld0VudGl0eSA9IHRoaXMuY3JlYXRlRW50aXR5KCk7XG4gICAgKG5ld0VudGl0eSBhcyBFbnRpdHkpLl90YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgKGVudGl0eSBhcyBFbnRpdHkpLl90YWdzKTtcblxuICAgIGVudGl0eS5fbXlMYXRlc3RDb3B5RW50aXR5VUlEID0gbmV3RW50aXR5LmVudGl0eVVJRDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBXZWxsS25vd25Db21wb25lbnRUSURzLm1heFdlbGxLbm93blRpZE51bWJlcjsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBlbnRpdHkuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoaSk7XG4gICAgICBpZiAoSXMuZXhpc3QoY29tcG9uZW50KSkge1xuICAgICAgICB0aGlzLnRyeVRvQWRkQ29tcG9uZW50VG9FbnRpdHlCeVRJRChpLCBuZXdFbnRpdHkpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRPZk5ld0VudGl0eSA9IG5ld0VudGl0eS5nZXRDb21wb25lbnRCeUNvbXBvbmVudFRJRChpKTtcbiAgICAgICAgaWYgKElzLmV4aXN0KGNvbXBvbmVudE9mTmV3RW50aXR5KSkge1xuICAgICAgICAgIGNvbXBvbmVudE9mTmV3RW50aXR5Ll9zaGFsbG93Q29weUZyb20oY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3RW50aXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19oYW5kbGVUYWdEYXRhKG5ld0VudGl0eTogRW50aXR5KSB7XG4gICAgY29uc3QgdGFncyA9IG5ld0VudGl0eS5fdGFncztcbiAgICBpZiAoSXMuZXhpc3QodGFncykpIHtcbiAgICAgIGNvbnN0IHRhZ0tleXMgPSBPYmplY3Qua2V5cyh0YWdzKTtcbiAgICAgIGZvciAoY29uc3QgdGFnS2V5IG9mIHRhZ0tleXMpIHtcbiAgICAgICAgaWYgKHRhZ0tleSA9PT0gJ3JuRW50aXRpZXMnKSB7XG4gICAgICAgICAgY29uc3QgZW50aXRpZXMgPSBuZXdFbnRpdHkuZ2V0VGFnVmFsdWUoJ3JuRW50aXRpZXMnKSBhcyBJU2NlbmVHcmFwaEVudGl0eVtdO1xuICAgICAgICAgIGNvbnN0IG5ld0VudGl0aWVzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbnRpdHlSZXBvc2l0b3J5LmdldEVudGl0eShlbnRpdHkuX215TGF0ZXN0Q29weUVudGl0eVVJRCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbmV3RW50aXR5LnRyeVRvU2V0VGFnKHtcbiAgICAgICAgICAgIHRhZzogJ3JuRW50aXRpZXMnLFxuICAgICAgICAgICAgdmFsdWU6IG5ld0VudGl0aWVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWdLZXkgPT09ICdybkVudGl0aWVzQnlOYW1lcycpIHtcbiAgICAgICAgICBjb25zdCBtYXAgPSBuZXdFbnRpdHkuZ2V0VGFnVmFsdWUoJ3JuRW50aXRpZXNCeU5hbWVzJykgYXMgTWFwPHN0cmluZywgSVNjZW5lR3JhcGhFbnRpdHk+O1xuICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBtYXAuZ2V0KG5hbWUpIGFzIElTY2VuZUdyYXBoRW50aXR5O1xuICAgICAgICAgICAgbWFwLnNldChcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgRW50aXR5UmVwb3NpdG9yeS5nZXRFbnRpdHkoZW50aXR5Ll9teUxhdGVzdENvcHlFbnRpdHlVSUQpIGFzIElTY2VuZUdyYXBoRW50aXR5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXdFbnRpdHkudHJ5VG9TZXRUYWcoe1xuICAgICAgICAgICAgdGFnOiAncm5FbnRpdGllc0J5TmFtZXMnLFxuICAgICAgICAgICAgdmFsdWU6IG1hcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lR3JhcGggPSBuZXdFbnRpdHkudHJ5VG9HZXRTY2VuZUdyYXBoKCk7XG4gICAgaWYgKElzLmV4aXN0KHNjZW5lR3JhcGgpKSB7XG4gICAgICBzY2VuZUdyYXBoLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIEVudGl0eVJlcG9zaXRvcnkuX19oYW5kbGVUYWdEYXRhKGNoaWxkLmVudGl0eSBhcyB1bmtub3duIGFzIEVudGl0eSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGFkZCBhIGNvbXBvbmVudCB0byB0aGUgZW50aXR5IGJ5IGNvbXBvbmVudFRJRC5cbiAgICogQHBhcmFtIGNvbXBvbmVudFRJRCAtIHRoZSBjb21wb25lbnRUSURcbiAgICogQHBhcmFtIGVudGl0eSAtIHRoZSBlbnRpdHlcbiAgICogQHJldHVybnMgdGhlIGVudGl0eSBhZGRlZCBhIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgY29tcG9uZW50VElEOiBDb21wb25lbnRUSUQsXG4gICAgZW50aXR5OiBJRW50aXR5XG4gICk6IElFbnRpdHkge1xuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnRDbGFzcyhjb21wb25lbnRUSUQpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoY29tcG9uZW50Q2xhc3MpKSB7XG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRUb0VudGl0eShjb21wb25lbnRDbGFzcywgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDb21wb25lbnQgdG8gdGhlIGVudGl0eVxuICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgLSBhIENvbXBvbmVudENsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0gZW50aXR5IC0gdGhlIGVudGl0eVxuICAgKiBAcmV0dXJucyB0aGUgZW50aXR5IGFkZGVkIGEgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFkZENvbXBvbmVudFRvRW50aXR5PFxuICAgIENvbXBvbmVudFR5cGUgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50LFxuICAgIEVudGl0eVR5cGUgZXh0ZW5kcyBJRW50aXR5XG4gID4oXG4gICAgY29tcG9uZW50Q2xhc3M6IENvbXBvbmVudFR5cGUsXG4gICAgZW50aXR5OiBFbnRpdHlUeXBlXG4gICk6IEVudGl0eVR5cGUgJiBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8Q29tcG9uZW50VHlwZT4ge1xuICAgIGlmIChlbnRpdHkuaGFzQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKSkge1xuICAgICAgTG9nZ2VyLmluZm8oJ1RoaXMgZW50aXR5IGFscmVhZHkgaGFzIHRoZSBDb21wb25lbnQuJyk7XG4gICAgICByZXR1cm4gZW50aXR5IGFzIEVudGl0eVR5cGUgJiBDb21wb25lbnRUb0NvbXBvbmVudE1ldGhvZHM8Q29tcG9uZW50VHlwZT47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIENvbXBvbmVudFxuICAgIGNvbnN0IGNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgY29tcG9uZW50Q2xhc3MuY29tcG9uZW50VElELFxuICAgICAgZW50aXR5LmVudGl0eVVJRCxcbiAgICAgIHRoaXNcbiAgICApO1xuXG4gICAgLy8gc2V0IHRoaXMgY29tcG9uZW50IHRvIHRoaXMuX2NvbXBvbmVudHMnIG1hcFxuICAgIGNvbnN0IG1hcCA9IHZhbHVlV2l0aENvbXBlbnNhdGlvbih7XG4gICAgICB2YWx1ZTogdGhpcy5fY29tcG9uZW50c1tlbnRpdHkuZW50aXR5VUlEXSxcbiAgICAgIGNvbXBlbnNhdGlvbjogKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudHNbZW50aXR5LmVudGl0eVVJRF0gPSBtYXA7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIG1hcC5zZXQoY29tcG9uZW50Q2xhc3MuY29tcG9uZW50VElELCBjb21wb25lbnQpO1xuXG4gICAgLy8gYWRkIHRoaXMgY29tcG9uZW50IHRvIHRoZSBlbnRpdHlcbiAgICBjb25zdCBlbnRpdHlDbGFzcyA9IGNvbXBvbmVudC5hZGRUaGlzQ29tcG9uZW50VG9FbnRpdHkoZW50aXR5LCBjb21wb25lbnRDbGFzcyk7XG4gICAgZW50aXR5Ll9zZXRDb21wb25lbnQoY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcblxuICAgIHJldHVybiBlbnRpdHkgYXMgdW5rbm93biBhcyB0eXBlb2YgZW50aXR5Q2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGNvbXBvbmVudHMgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBOb3RlOiB0aGUgcmV0dXJuZWQgZW50aXR5J3MgdHlwZSB3aWxsIGJlIElFbnRpdHkgKG1vc3QgYmFzaWMgdHlwZSkuXG4gICAqICAgICAgIFlvdSBoYXZlIHRvIGNhc3QgaXQgdG8gYXBwcm9wcmlhdGUgdHlwZSBsYXRlci5cbiAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIFRoZSBjbGFzcyBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmUuXG4gICAqIEBwYXJhbSBlbnRpdHlVaWQgVGhlIGVudGl0eVVJRCBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZW1vdmVDb21wb25lbnRGcm9tRW50aXR5KFxuICAgIGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50LFxuICAgIGVudGl0eTogSUVudGl0eVxuICApOiBJRW50aXR5IHtcbiAgICBsZXQgbWFwID0gdGhpcy5fY29tcG9uZW50c1tlbnRpdHkuZW50aXR5VUlEXTtcbiAgICBpZiAobWFwID09IG51bGwpIHtcbiAgICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudHNbZW50aXR5LmVudGl0eVVJRF0gPSBtYXA7XG4gICAgfVxuICAgIGNvbnN0IGNvbXBvbmVudCA9IG1hcC5nZXQoY29tcG9uZW50Q2xhc3MuY29tcG9uZW50VElEKTtcbiAgICBpZiAoSXMuZXhpc3QoY29tcG9uZW50KSkge1xuICAgICAgY29tcG9uZW50Ll9kZXN0cm95KCk7XG4gICAgICBtYXAuZGVsZXRlKGNvbXBvbmVudENsYXNzLmNvbXBvbmVudFRJRCk7XG4gICAgICBlbnRpdHkuX3JlbW92ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcy5jb21wb25lbnRUSUQpO1xuICAgIH1cblxuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBJRW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVudGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRpdHlVSUQuXG4gICAqIEBwYXJhbSBlbnRpdHlVaWQgVGhlIGVudGl0eVVJRCBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRFbnRpdHkoZW50aXR5VWlkOiBFbnRpdHlVSUQpOiBJRW50aXR5IHtcbiAgICByZXR1cm4gdGhpcy5fX2VudGl0aWVzW2VudGl0eVVpZF0hO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVudGl0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRpdHlVSUQuXG4gICAqIEBwYXJhbSBlbnRpdHlVaWQgVGhlIGVudGl0eVVJRCBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIGdldEVudGl0eShlbnRpdHlVaWQ6IEVudGl0eVVJRCk6IElFbnRpdHkge1xuICAgIHJldHVybiBFbnRpdHlSZXBvc2l0b3J5Ll9fZW50aXRpZXNbZW50aXR5VWlkXSE7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gZW50aXR5VWlkIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBjb21wb25lbnQgZnJvbS5cbiAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgVGhlIGNsYXNzIG9iamVjdCBvZiB0aGUgY29tcG9uZW50IHRvIGdldC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcG9uZW50T2ZFbnRpdHkoXG4gICAgZW50aXR5VWlkOiBFbnRpdHlVSUQsXG4gICAgY29tcG9uZW50VHlwZTogdHlwZW9mIENvbXBvbmVudFxuICApOiBDb21wb25lbnQgfCBudWxsIHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLl9jb21wb25lbnRzW2VudGl0eVVpZF07XG4gICAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG4gICAgaWYgKGVudGl0eSAhPSBudWxsKSB7XG4gICAgICBjb21wb25lbnQgPSBlbnRpdHkuZ2V0KGNvbXBvbmVudFR5cGUuY29tcG9uZW50VElEKTtcbiAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGVudGl0aWVzIGJ5IHRoZSBnaXZlbiB0YWdzLlxuICAgKiBAcGFyYW0gdGFncyBUaGUgdGFncyB0byBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VhcmNoQnlUYWdzKHRhZ3M6IFJuVGFncykge1xuICAgIGNvbnN0IG1hdGNoRW50aXRpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLl9fZW50aXRpZXMpIHtcbiAgICAgIGlmIChlbnRpdHk/Lm1hdGNoVGFncyh0YWdzKSkge1xuICAgICAgICBtYXRjaEVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoRW50aXRpZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBlbnRpdHkgYnkgdGhlIHVuaXF1ZSBuYW1lLlxuICAgKiBAcGFyYW0gdW5pcXVlTmFtZSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RW50aXR5QnlVbmlxdWVOYW1lKHVuaXF1ZU5hbWU6IHN0cmluZyk6IElFbnRpdHkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHRoaXMuX19lbnRpdGllcykge1xuICAgICAgaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS51bmlxdWVOYW1lID09PSB1bmlxdWVOYW1lKSB7XG4gICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEdldHMgYWxsIGVudGl0aWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZ2V0RW50aXRpZXMoKTogSUVudGl0eVtdIHtcbiAgICByZXR1cm4gdGhpcy5fX2VudGl0aWVzLmZpbHRlcigoZW50aXR5KSA9PiBlbnRpdHkgIT0gbnVsbCAmJiBlbnRpdHkhLl9pc0FsaXZlKSBhcyBJRW50aXR5W107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCBlbnRpdGllcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RW50aXRpZXNOdW1iZXIoKTogbnVtYmVyIHtcbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuX19lbnRpdGllcy5maWx0ZXIoKGVudGl0eSkgPT4gZW50aXR5ICE9IG51bGwgJiYgZW50aXR5IS5faXNBbGl2ZSk7XG4gICAgcmV0dXJuIGVudGl0aWVzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHVwZGF0ZUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlQ291bnQ7XG4gIH1cbn1cblxuLy8gVGhpcyBjYW4gbGl2ZSBhbnl3aGVyZSBpbiB5b3VyIGNvZGViYXNlOlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWl4aW5zKGRlcml2ZWRDdG9yOiBJRW50aXR5LCBiYXNlQ3RvcjogYW55KSB7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJhc2VDdG9yLnByb3RvdHlwZSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgIGRlcml2ZWRDdG9yLFxuICAgICAgbmFtZSxcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZUN0b3IucHJvdG90eXBlLCBuYW1lKSB8fCBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnRpdHkoKTogSUVudGl0eSB7XG4gIHJldHVybiBFbnRpdHlSZXBvc2l0b3J5LmNyZWF0ZUVudGl0eSgpO1xufVxuIiwiaW1wb3J0IHtcbiAgU2hhZGVyU2VtYW50aWNzSW5kZXgsXG4gIFNoYWRlclNlbWFudGljc0VudW0sXG4gIFNoYWRlclNlbWFudGljcyxcbiAgZ2V0U2hhZGVyUHJvcGVydHlGdW5jLFxuICBfZ2V0UHJvcGVydHlJbmRleDIsXG4gIFNoYWRlclNlbWFudGljc05hbWUsXG59IGZyb20gJy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBDb3VudCwgSW5kZXgsIENHQVBJUmVzb3VyY2VIYW5kbGUsIEluZGV4T2YxNkJ5dGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQnVmZmVyVXNlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQnVmZmVyVXNlJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuL01lbW9yeU1hbmFnZXInO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IEFjY2Vzc29yIH0gZnJvbSAnLi4vbWVtb3J5L0FjY2Vzc29yJztcbmltcG9ydCB7IE1hdGhDbGFzc1V0aWwgfSBmcm9tICcuLi9tYXRoL01hdGhDbGFzc1V0aWwnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBTaGFkZXJUeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvU2hhZGVyVHlwZSc7XG5pbXBvcnQgeyBWZWN0b3JOIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3JOJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vQ29uZmlnJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL21hdGgvU2NhbGFyJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IEJvbmVEYXRhVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0JvbmVEYXRhVHlwZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2gsIFByb2Nlc3NBcHByb2FjaEVudW0gfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBjYWxjQWxpZ25lZEJ5dGVMZW5ndGgsIFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoJztcblxudHlwZSBHbG9iYWxQcm9wZXJ0eVN0cnVjdCA9IHtcbiAgc2hhZGVyU2VtYW50aWNzSW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbztcbiAgdmFsdWVzOiBhbnlbXTtcbiAgbWF4Q291bnQ6IENvdW50O1xuICBhY2Nlc3NvcjogQWNjZXNzb3I7XG59O1xuXG4vKipcbiAqIFRoZSBjbGFzcyB3aGljaCBtYW5hZ2VzIGdsb2JhbCBkYXRhLlxuICovXG5leHBvcnQgY2xhc3MgR2xvYmFsRGF0YVJlcG9zaXRvcnkge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBHbG9iYWxEYXRhUmVwb3NpdG9yeTtcbiAgcHJpdmF0ZSBfX2ZpZWxkczogTWFwPFNoYWRlclNlbWFudGljc05hbWUsIEdsb2JhbFByb3BlcnR5U3RydWN0PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgR2xvYmFsRGF0YVJlcG9zaXRvcnlcbiAgICogQHBhcmFtIGFwcHJvYWNoIC0gUHJvY2Vzc0FwcHJvYWNoRW51bSBmb3IgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIGluaXRpYWxpemUoYXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW0pIHtcbiAgICAvLyBDdXJyZW50Q29tcG9uZW50U0lEc1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRTSURzSW5mbyA9IHtcbiAgICAgIHNlbWFudGljOiAnY3VycmVudENvbXBvbmVudFNJRHMnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyQXJyYXksXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgYXJyYXlMZW5ndGg6IFdlbGxLbm93bkNvbXBvbmVudFRJRHMubWF4V2VsbEtub3duVGlkTnVtYmVyLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4QW5kUGl4ZWxTaGFkZXIsXG4gICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KFdlbGxLbm93bkNvbXBvbmVudFRJRHMubWF4V2VsbEtub3duVGlkTnVtYmVyKSksXG4gICAgfTtcbiAgICB0aGlzLl9fcmVnaXN0ZXJQcm9wZXJ0eShjdXJyZW50Q29tcG9uZW50U0lEc0luZm8sIDEpO1xuICAgIHRoaXMudGFrZU9uZSgnY3VycmVudENvbXBvbmVudFNJRHMnKTtcblxuICAgIC8vIENhbWVyYVxuICAgIGNvbnN0IHZpZXdNYXRyaXhJbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICd2aWV3TWF0cml4JyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLk1hdDQsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4QW5kUGl4ZWxTaGFkZXIsXG4gICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpLFxuICAgIH07XG4gICAgY29uc3QgcHJvamVjdGlvbk1hdHJpeEluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ3Byb2plY3Rpb25NYXRyaXgnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuTWF0NCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhBbmRQaXhlbFNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCksXG4gICAgfTtcbiAgICBjb25zdCB2aWV3UG9zaXRpb25JbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICd2aWV3UG9zaXRpb24nLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhBbmRQaXhlbFNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAxXSksXG4gICAgfTtcbiAgICB0aGlzLl9fcmVnaXN0ZXJQcm9wZXJ0eSh2aWV3TWF0cml4SW5mbywgQ29uZmlnLm1heENhbWVyYU51bWJlcik7XG4gICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkocHJvamVjdGlvbk1hdHJpeEluZm8sIENvbmZpZy5tYXhDYW1lcmFOdW1iZXIpO1xuICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KHZpZXdQb3NpdGlvbkluZm8sIENvbmZpZy5tYXhDYW1lcmFOdW1iZXIpO1xuXG4gICAgY29uc3QgbWF4U2tlbGV0YWxCb25lTnVtYmVyID0gUHJvY2Vzc0FwcHJvYWNoLmlzVW5pZm9ybUFwcHJvYWNoKGFwcHJvYWNoKVxuICAgICAgPyBDb25maWcubWF4U2tlbGV0YWxCb25lTnVtYmVyRm9yVW5pZm9ybU1vZGVcbiAgICAgIDogQ29uZmlnLm1heFNrZWxldGFsQm9uZU51bWJlcjtcblxuICAgIC8vIFNraW5uaW5nXG4gICAgY29uc3QgYm9uZU1hdHJpeEluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ2JvbmVNYXRyaXgnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuTWF0NHgzQXJyYXksXG4gICAgICBhcnJheUxlbmd0aDogbWF4U2tlbGV0YWxCb25lTnVtYmVyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFZlY3Rvck4obmV3IEZsb2F0MzJBcnJheSgwKSksXG4gICAgfTtcbiAgICBjb25zdCBib25lUXVhdGVybmlvbkluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ2JvbmVRdWF0ZXJuaW9uJyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzRBcnJheSxcbiAgICAgIGFycmF5TGVuZ3RoOiBtYXhTa2VsZXRhbEJvbmVOdW1iZXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KDApKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvbmVUcmFuc2xhdGVTY2FsZUluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ2JvbmVUcmFuc2xhdGVTY2FsZScsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWM0QXJyYXksXG4gICAgICBhcnJheUxlbmd0aDogbWF4U2tlbGV0YWxCb25lTnVtYmVyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFZlY3Rvck4obmV3IEZsb2F0MzJBcnJheSgwKSksXG4gICAgfTtcbiAgICBjb25zdCBib25lVHJhbnNsYXRlUGFja2VkUXVhdEluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ2JvbmVUcmFuc2xhdGVQYWNrZWRRdWF0JyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzRBcnJheSxcbiAgICAgIGFycmF5TGVuZ3RoOiBtYXhTa2VsZXRhbEJvbmVOdW1iZXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KDApKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvbmVTY2FsZVBhY2tlZFF1YXRJbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICdib25lU2NhbGVQYWNrZWRRdWF0JyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzRBcnJheSxcbiAgICAgIGFycmF5TGVuZ3RoOiBtYXhTa2VsZXRhbEJvbmVOdW1iZXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KDApKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvbmVDb21wcmVzc2VkQ2h1bmtJbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICdib25lQ29tcHJlc3NlZENodW5rJyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzRBcnJheSxcbiAgICAgIGFycmF5TGVuZ3RoOiBtYXhTa2VsZXRhbEJvbmVOdW1iZXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KDApKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvbmVDb21wcmVzc2VkSW5mb0luZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ2JvbmVDb21wcmVzc2VkSW5mbycsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWM0LFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yNC56ZXJvKCksXG4gICAgfTtcbiAgICBjb25zdCBza2VsZXRhbENvbXBvbmVudFNJREluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ3NraW5uaW5nTW9kZScsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleEFuZFBpeGVsU2hhZGVyLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigtMSksXG4gICAgfTtcbiAgICBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLk1hdDQzeDEpIHtcbiAgICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KGJvbmVNYXRyaXhJbmZvLCBDb25maWcubWF4U2tlbGV0b25OdW1iZXIpO1xuICAgIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mikge1xuICAgICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkoYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXRJbmZvLCBDb25maWcubWF4U2tlbGV0b25OdW1iZXIpO1xuICAgICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkoYm9uZVNjYWxlUGFja2VkUXVhdEluZm8sIENvbmZpZy5tYXhTa2VsZXRvbk51bWJlcik7XG4gICAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyT2xkKSB7XG4gICAgICB0aGlzLl9fcmVnaXN0ZXJQcm9wZXJ0eShib25lUXVhdGVybmlvbkluZm8sIENvbmZpZy5tYXhTa2VsZXRvbk51bWJlcik7XG4gICAgICB0aGlzLl9fcmVnaXN0ZXJQcm9wZXJ0eShib25lVHJhbnNsYXRlU2NhbGVJbmZvLCBDb25maWcubWF4U2tlbGV0b25OdW1iZXIpO1xuICAgIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4MSkge1xuICAgICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkoYm9uZVRyYW5zbGF0ZVNjYWxlSW5mbywgQ29uZmlnLm1heFNrZWxldG9uTnVtYmVyKTtcbiAgICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KGJvbmVDb21wcmVzc2VkQ2h1bmtJbmZvLCBDb25maWcubWF4U2tlbGV0b25OdW1iZXIpO1xuICAgICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkoYm9uZUNvbXByZXNzZWRJbmZvSW5mbywgMSk7XG4gICAgICB0aGlzLnRha2VPbmUoJ2JvbmVDb21wcmVzc2VkSW5mbycpO1xuICAgIH1cbiAgICB0aGlzLl9fcmVnaXN0ZXJQcm9wZXJ0eShza2VsZXRhbENvbXBvbmVudFNJREluZm8sIDEpO1xuICAgIHRoaXMudGFrZU9uZSgnc2tpbm5pbmdNb2RlJyk7XG5cbiAgICAvLyBMaWdodGluZ1xuICAgIGNvbnN0IGxpZ2h0UG9zaXRpb25JbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICdsaWdodFBvc2l0aW9uJyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzNBcnJheSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGFycmF5TGVuZ3RoOiBDb25maWcubWF4TGlnaHROdW1iZXJJblNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFZlY3Rvck4obmV3IEZsb2F0MzJBcnJheShDb25maWcubWF4TGlnaHROdW1iZXJJblNoYWRlcikpLFxuICAgIH07XG4gICAgY29uc3QgbGlnaHREaXJlY3Rpb25JbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICdsaWdodERpcmVjdGlvbicsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzQXJyYXksXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXIsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoQ29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXIpKSxcbiAgICB9O1xuICAgIGNvbnN0IGxpZ2h0SW50ZW5zaXR5SW5mbyA9IHtcbiAgICAgIHNlbWFudGljOiAnbGlnaHRJbnRlbnNpdHknLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjM0FycmF5LFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgYXJyYXlMZW5ndGg6IENvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMCxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KENvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyKSksXG4gICAgfTtcbiAgICBjb25zdCBsaWdodFByb3BlcnR5SW5mbyA9IHtcbiAgICAgIHNlbWFudGljOiAnbGlnaHRQcm9wZXJ0eScsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWM0QXJyYXksXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoQ29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXIpKSxcbiAgICB9O1xuICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KGxpZ2h0UG9zaXRpb25JbmZvLCAxKTtcbiAgICB0aGlzLl9fcmVnaXN0ZXJQcm9wZXJ0eShsaWdodERpcmVjdGlvbkluZm8sIDEpO1xuICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KGxpZ2h0SW50ZW5zaXR5SW5mbywgMSk7XG4gICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkobGlnaHRQcm9wZXJ0eUluZm8sIDEpO1xuICAgIHRoaXMudGFrZU9uZSgnbGlnaHREaXJlY3Rpb24nKTtcbiAgICB0aGlzLnRha2VPbmUoJ2xpZ2h0SW50ZW5zaXR5Jyk7XG4gICAgdGhpcy50YWtlT25lKCdsaWdodFBvc2l0aW9uJyk7XG4gICAgdGhpcy50YWtlT25lKCdsaWdodFByb3BlcnR5Jyk7XG5cbiAgICBjb25zdCBsaWdodE51bWJlckluZm8gPSB7XG4gICAgICBzZW1hbnRpYzogJ2xpZ2h0TnVtYmVyJyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4QW5kUGl4ZWxTaGFkZXIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigwKSxcbiAgICB9O1xuICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KGxpZ2h0TnVtYmVySW5mbywgMSk7XG4gICAgdGhpcy50YWtlT25lKCdsaWdodE51bWJlcicpO1xuXG4gICAgLy8gQmFja0J1ZmZlclRleHR1cmVTaXplXG4gICAgY29uc3QgYmFja0J1ZmZlclRleHR1cmVTaXplID0ge1xuICAgICAgc2VtYW50aWM6ICdiYWNrQnVmZmVyVGV4dHVyZVNpemUnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU6IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjIuZnJvbUNvcHkyKDAsIDApLFxuICAgIH07XG4gICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkoYmFja0J1ZmZlclRleHR1cmVTaXplLCAxKTtcbiAgICB0aGlzLnRha2VPbmUoJ2JhY2tCdWZmZXJUZXh0dXJlU2l6ZScpO1xuXG4gICAgLy8gVnJTdGF0ZVxuICAgIGNvbnN0IHZyU3RhdGUgPSB7XG4gICAgICBzZW1hbnRpYzogJ3ZyU3RhdGUnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IyLmZyb21Db3B5MigwLCAwKSxcbiAgICAgIC8vIHg6IDA6IG5vdCB2ciwgMTogdnJcbiAgICAgIC8vIHk6IDA6IGxlZnQgZXllLCAxOiByaWdodCBleWVcbiAgICB9O1xuICAgIHRoaXMuX19yZWdpc3RlclByb3BlcnR5KHZyU3RhdGUsIDEpO1xuICAgIHRoaXMudGFrZU9uZSgndnJTdGF0ZScpO1xuXG4gICAgLy8gVGltZVxuICAgIGNvbnN0IHRpbWVJbmZvID0ge1xuICAgICAgc2VtYW50aWM6ICd0aW1lJyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhBbmRQaXhlbFNoYWRlcixcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDApLFxuICAgIH07XG4gICAgdGhpcy5fX3JlZ2lzdGVyUHJvcGVydHkodGltZUluZm8sIDEpO1xuICAgIHRoaXMudGFrZU9uZSgndGltZScpO1xuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgR2xvYmFsRGF0YVJlcG9zaXRvcnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgX19yZWdpc3RlclByb3BlcnR5KHNlbWFudGljSW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbywgbWF4Q291bnQ6IENvdW50KTogdm9pZCB7XG4gICAgY29uc3QgYnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZU9yR2V0QnVmZmVyKEJ1ZmZlclVzZS5HUFVJbnN0YW5jZURhdGEpO1xuXG4gICAgY29uc3QgYWxpZ25lZEJ5dGVMZW5ndGggPSBjYWxjQWxpZ25lZEJ5dGVMZW5ndGgoc2VtYW50aWNJbmZvKTtcblxuICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBidWZmZXJcbiAgICAgIC50YWtlQnVmZmVyVmlldyh7XG4gICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IGFsaWduZWRCeXRlTGVuZ3RoICogbWF4Q291bnQsXG4gICAgICAgIGJ5dGVTdHJpZGU6IDAsXG4gICAgICB9KVxuICAgICAgLnVud3JhcEZvcmNlKCk7XG5cbiAgICBsZXQgbWF4QXJyYXlMZW5ndGggPSBzZW1hbnRpY0luZm8uYXJyYXlMZW5ndGg7XG4gICAgaWYgKENvbXBvc2l0aW9uVHlwZS5pc0FycmF5KHNlbWFudGljSW5mby5jb21wb3NpdGlvblR5cGUpICYmIG1heEFycmF5TGVuZ3RoID09IG51bGwpIHtcbiAgICAgIG1heEFycmF5TGVuZ3RoID0gMTAwO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2Vzc29yID0gYnVmZmVyVmlld1xuICAgICAgLnRha2VBY2Nlc3Nvcih7XG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogc2VtYW50aWNJbmZvLmNvbXBvc2l0aW9uVHlwZSxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY291bnQ6IG1heENvdW50LFxuICAgICAgICBieXRlU3RyaWRlOiBhbGlnbmVkQnl0ZUxlbmd0aCxcbiAgICAgICAgYXJyYXlMZW5ndGg6IG1heEFycmF5TGVuZ3RoLFxuICAgICAgfSlcbiAgICAgIC51bndyYXBGb3JjZSgpO1xuXG4gICAgY29uc3QgZ2xvYmFsUHJvcGVydHlTdHJ1Y3Q6IEdsb2JhbFByb3BlcnR5U3RydWN0ID0ge1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mbzogc2VtYW50aWNJbmZvLFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIG1heENvdW50OiBtYXhDb3VudCxcbiAgICAgIGFjY2Vzc29yOiBhY2Nlc3NvcixcbiAgICB9O1xuXG4gICAgdGhpcy5fX2ZpZWxkcy5zZXQoc2VtYW50aWNJbmZvLnNlbWFudGljLCBnbG9iYWxQcm9wZXJ0eVN0cnVjdCk7XG4gIH1cblxuICBwdWJsaWMgdGFrZU9uZShzaGFkZXJTZW1hbnRpYzogU2hhZGVyU2VtYW50aWNzTmFtZSk6IGFueSB7XG4gICAgY29uc3QgZ2xvYmFsUHJvcGVydHlTdHJ1Y3QgPSB0aGlzLl9fZmllbGRzLmdldChzaGFkZXJTZW1hbnRpYyk7XG4gICAgaWYgKGdsb2JhbFByb3BlcnR5U3RydWN0KSB7XG4gICAgICBjb25zdCBzZW1hbnRpY0luZm8gPSBnbG9iYWxQcm9wZXJ0eVN0cnVjdC5zaGFkZXJTZW1hbnRpY3NJbmZvO1xuICAgICAgY29uc3QgdHlwZWRBcnJheSA9IGdsb2JhbFByb3BlcnR5U3RydWN0LmFjY2Vzc29yLnRha2VPbmUoKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBjb3VudEluZGV4ID0gZ2xvYmFsUHJvcGVydHlTdHJ1Y3QudmFsdWVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHZhbHVlT2JqID0gTWF0aENsYXNzVXRpbC5pbml0V2l0aEZsb2F0MzJBcnJheShcbiAgICAgICAgc2VtYW50aWNJbmZvLmluaXRpYWxWYWx1ZSxcbiAgICAgICAgc2VtYW50aWNJbmZvLmluaXRpYWxWYWx1ZSxcbiAgICAgICAgdHlwZWRBcnJheSxcbiAgICAgICAgc2VtYW50aWNJbmZvLmNvbXBvc2l0aW9uVHlwZVxuICAgICAgKTtcbiAgICAgIGdsb2JhbFByb3BlcnR5U3RydWN0LnZhbHVlc1tjb3VudEluZGV4XSA9IHZhbHVlT2JqO1xuICAgICAgcmV0dXJuIHZhbHVlT2JqO1xuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgcHVibGljIHNldFZhbHVlKHNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lLCBjb3VudEluZGV4OiBJbmRleCwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGdsb2JhbFByb3BlcnR5U3RydWN0ID0gdGhpcy5fX2ZpZWxkcy5nZXQoc2hhZGVyU2VtYW50aWMpO1xuICAgIGlmIChnbG9iYWxQcm9wZXJ0eVN0cnVjdCkge1xuICAgICAgY29uc3QgdmFsdWVPYmogPSBnbG9iYWxQcm9wZXJ0eVN0cnVjdC52YWx1ZXNbY291bnRJbmRleF07XG4gICAgICBNYXRoQ2xhc3NVdGlsLl9zZXRGb3JjZSh2YWx1ZU9iaiwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRWYWx1ZShzaGFkZXJTZW1hbnRpYzogU2hhZGVyU2VtYW50aWNzTmFtZSwgY291bnRJbmRleDogSW5kZXgpOiBhbnkge1xuICAgIGNvbnN0IGdsb2JhbFByb3BlcnR5U3RydWN0ID0gdGhpcy5fX2ZpZWxkcy5nZXQoc2hhZGVyU2VtYW50aWMpO1xuICAgIGlmIChnbG9iYWxQcm9wZXJ0eVN0cnVjdCkge1xuICAgICAgY29uc3QgdmFsdWVPYmogPSBnbG9iYWxQcm9wZXJ0eVN0cnVjdC52YWx1ZXNbY291bnRJbmRleF07XG4gICAgICByZXR1cm4gdmFsdWVPYmo7XG4gICAgfVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBnZXRHbG9iYWxQcm9wZXJ0eVN0cnVjdChwcm9wZXJ0eU5hbWU6IFNoYWRlclNlbWFudGljc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZpZWxkcy5nZXQocHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRHbG9iYWxQcm9wZXJ0aWVzKCk6IEdsb2JhbFByb3BlcnR5U3RydWN0W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX19maWVsZHMudmFsdWVzKCkpO1xuICB9XG5cbiAgX3NldFVuaWZvcm1Mb2NhdGlvbnNGb3JVbmlmb3JtTW9kZU9ubHkoc2hhZGVyUHJvZ3JhbVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCBzZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtdO1xuICAgIHRoaXMuX19maWVsZHMuZm9yRWFjaCgoZ2xvYmFsUHJvcGVydHlTdHJ1Y3Q6IEdsb2JhbFByb3BlcnR5U3RydWN0LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHNlbWFudGljSW5mbyA9IGdsb2JhbFByb3BlcnR5U3RydWN0LnNoYWRlclNlbWFudGljc0luZm87XG4gICAgICBzZW1hbnRpY3NJbmZvQXJyYXkucHVzaChzZW1hbnRpY0luZm8pO1xuICAgIH0pO1xuXG4gICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0dXBVbmlmb3JtTG9jYXRpb25zKHNoYWRlclByb2dyYW1VaWQsIHNlbWFudGljc0luZm9BcnJheSwgdHJ1ZSk7XG4gIH1cblxuICBfc2V0VW5pZm9ybUxvY2F0aW9uc0ZvckRhdGFUZXh0dXJlTW9kZU9ubHkoc2hhZGVyUHJvZ3JhbVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCBzZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtdO1xuICAgIHRoaXMuX19maWVsZHMuZm9yRWFjaCgoZ2xvYmFsUHJvcGVydHlTdHJ1Y3Q6IEdsb2JhbFByb3BlcnR5U3RydWN0LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHNlbWFudGljSW5mbyA9IGdsb2JhbFByb3BlcnR5U3RydWN0LnNoYWRlclNlbWFudGljc0luZm87XG4gICAgICBpZiAoc2VtYW50aWNJbmZvLm5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGUpIHtcbiAgICAgICAgc2VtYW50aWNzSW5mb0FycmF5LnB1c2goc2VtYW50aWNJbmZvKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldHVwVW5pZm9ybUxvY2F0aW9ucyhzaGFkZXJQcm9ncmFtVWlkLCBzZW1hbnRpY3NJbmZvQXJyYXksIHRydWUpO1xuICB9XG5cbiAgc2V0VW5pZm9ybVZhbHVlcyhzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW0pIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgdGhpcy5fX2ZpZWxkcy5mb3JFYWNoKChnbG9iYWxQcm9wZXJ0eVN0cnVjdDogR2xvYmFsUHJvcGVydHlTdHJ1Y3QsIGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IGdsb2JhbFByb3BlcnR5U3RydWN0LnNoYWRlclNlbWFudGljc0luZm87XG4gICAgICBjb25zdCB2YWx1ZXMgPSBnbG9iYWxQcm9wZXJ0eVN0cnVjdC52YWx1ZXM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5zZXRVbmlmb3JtVmFsdWUoc2hhZGVyUHJvZ3JhbSwgaW5mby5zZW1hbnRpYywgdHJ1ZSwgdmFsdWVzW2ldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldExvY2F0aW9uT2Zmc2V0T2ZQcm9wZXJ0eShwcm9wZXJ0eUluZGV4OiBJbmRleCwgY291bnRJbmRleDogSW5kZXgpIHtcbiAgLy8gICBjb25zdCBnbG9iYWxQcm9wZXJ0eVN0cnVjdCA9IHRoaXMuX19maWVsZHMuZ2V0KHByb3BlcnR5SW5kZXgpO1xuICAvLyAgIGlmIChnbG9iYWxQcm9wZXJ0eVN0cnVjdCkge1xuICAvLyAgICAgY29uc3QgdmFsdWUgPSBnbG9iYWxQcm9wZXJ0eVN0cnVjdC52YWx1ZXNbY291bnRJbmRleF07XG4gIC8vICAgICByZXR1cm4gKHZhbHVlLl92IGFzIEZsb2F0MzJBcnJheSkuYnl0ZU9mZnNldCAvIDQgLyA0O1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gdm9pZCAwO1xuICAvLyB9XG5cbiAgZ2V0TG9jYXRpb25PZmZzZXRPZlByb3BlcnR5KHByb3BlcnR5TmFtZTogU2hhZGVyU2VtYW50aWNzTmFtZSk6IEluZGV4T2YxNkJ5dGVzIHtcbiAgICBjb25zdCBnbG9iYWxQcm9wZXJ0eVN0cnVjdCA9IHRoaXMuX19maWVsZHMuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKGdsb2JhbFByb3BlcnR5U3RydWN0KSB7XG4gICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHlTdHJ1Y3QuYWNjZXNzb3IuYnl0ZU9mZnNldEluQnVmZmVyIC8gNCAvIDQ7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGdldEN1cnJlbnREYXRhTnVtYmVyT2ZUaGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IFNoYWRlclNlbWFudGljc05hbWUpIHtcbiAgICBjb25zdCBnbG9iYWxQcm9wZXJ0eVN0cnVjdCA9IHRoaXMuX19maWVsZHMuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKGdsb2JhbFByb3BlcnR5U3RydWN0KSB7XG4gICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHlTdHJ1Y3QudmFsdWVzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBfYWRkUHJvcGVydGllc1N0cihcbiAgICB2ZXJ0ZXhQcm9wZXJ0aWVzU3RyOiBzdHJpbmcsXG4gICAgcGl4ZWxQcm9wZXJ0aWVzU3RyOiBzdHJpbmcsXG4gICAgcHJvcGVydHlTZXR0ZXI6IGdldFNoYWRlclByb3BlcnR5RnVuYyxcbiAgICBpc1dlYkdMMjogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLl9fZmllbGRzLmZvckVhY2goKGdsb2JhbFByb3BlcnR5U3RydWN0OiBHbG9iYWxQcm9wZXJ0eVN0cnVjdCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IGdsb2JhbFByb3BlcnR5U3RydWN0LnNoYWRlclNlbWFudGljc0luZm87XG4gICAgICBpZiAoXG4gICAgICAgIGluZm8hLnN0YWdlID09PSBTaGFkZXJUeXBlLlZlcnRleFNoYWRlciB8fFxuICAgICAgICBpbmZvIS5zdGFnZSA9PT0gU2hhZGVyVHlwZS5WZXJ0ZXhBbmRQaXhlbFNoYWRlclxuICAgICAgKSB7XG4gICAgICAgIHZlcnRleFByb3BlcnRpZXNTdHIgKz0gcHJvcGVydHlTZXR0ZXIoJycsIGluZm8hLCB0cnVlLCBpc1dlYkdMMik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGluZm8hLnN0YWdlID09PSBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyIHx8XG4gICAgICAgIGluZm8hLnN0YWdlID09PSBTaGFkZXJUeXBlLlZlcnRleEFuZFBpeGVsU2hhZGVyXG4gICAgICApIHtcbiAgICAgICAgcGl4ZWxQcm9wZXJ0aWVzU3RyICs9IHByb3BlcnR5U2V0dGVyKCcnLCBpbmZvISwgdHJ1ZSwgaXNXZWJHTDIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFt2ZXJ0ZXhQcm9wZXJ0aWVzU3RyLCBwaXhlbFByb3BlcnRpZXNTdHJdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuLi9tZW1vcnkvQnVmZmVyJztcbmltcG9ydCB7IEJ1ZmZlclVzZSwgQnVmZmVyVXNlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0J1ZmZlclVzZSc7XG5pbXBvcnQgeyBTaXplLCBCeXRlLCBPYmplY3RVSUQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL0NvbmZpZyc7XG5pbXBvcnQgeyBSbk9iamVjdCB9IGZyb20gJy4vUm5PYmplY3QnO1xuaW1wb3J0IHsgTWlzY1V0aWwgfSBmcm9tICcuLi9taXNjL01pc2NVdGlsJztcblxuLyoqXG4gKiBVc2FnZVxuICogY29uc3QgbW0gPSBNZW1vcnlNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gKiB0aGlzLnRyYW5zbGF0ZSA9IG5ldyBWZWN0b3IzKFxuICogICBtbS5hc3NpZ25NZW0oY29tcG9uZW50VUlELCBwcm9wZXJ0eUlkLCBlbnRpdHlVSUQsIGlzUmVuZGVyZWQpXG4gKiApO1xuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5TWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIF9faW5zdGFuY2U6IE1lbW9yeU1hbmFnZXI7XG4gIC8vX19lbnRpdHlNYXhDb3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9fYnVmZmVyczogeyBbczogc3RyaW5nXTogQnVmZmVyIH0gPSB7fTtcbiAgcHJpdmF0ZSBfX2J1ZmZlcnNPbkRlbWFuZDogTWFwPE9iamVjdFVJRCwgQnVmZmVyPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX21lbW9yeVNpemVSYXRpb3M6IHsgW3M6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihjcHVHZW5lcmljOiBudW1iZXIsIGdwdUluc3RhbmNlRGF0YTogbnVtYmVyLCBncHVWZXJ0ZXhEYXRhOiBudW1iZXIpIHtcbiAgICB0aGlzLl9fbWVtb3J5U2l6ZVJhdGlvc1tCdWZmZXJVc2UuQ1BVR2VuZXJpYy5zdHJdID0gY3B1R2VuZXJpYztcbiAgICB0aGlzLl9fbWVtb3J5U2l6ZVJhdGlvc1tCdWZmZXJVc2UuR1BVSW5zdGFuY2VEYXRhLnN0cl0gPSBncHVJbnN0YW5jZURhdGE7XG4gICAgdGhpcy5fX21lbW9yeVNpemVSYXRpb3NbQnVmZmVyVXNlLkdQVVZlcnRleERhdGEuc3RyXSA9IGdwdVZlcnRleERhdGE7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2VJZk5vdENyZWF0ZWQoe1xuICAgIGNwdUdlbmVyaWMsXG4gICAgZ3B1SW5zdGFuY2VEYXRhLFxuICAgIGdwdVZlcnRleERhdGEsXG4gIH06IHtcbiAgICBjcHVHZW5lcmljOiBudW1iZXI7XG4gICAgZ3B1SW5zdGFuY2VEYXRhOiBudW1iZXI7XG4gICAgZ3B1VmVydGV4RGF0YTogbnVtYmVyO1xuICB9KSB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBNZW1vcnlNYW5hZ2VyKGNwdUdlbmVyaWMsIGdwdUluc3RhbmNlRGF0YSwgZ3B1VmVydGV4RGF0YSk7XG4gICAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfX21ha2VNdWx0aXBsZU9mNGJ5dGVTaXplKG1lbW9yeVNpemU6IG51bWJlcikge1xuICAgIHJldHVybiBtZW1vcnlTaXplICsgKG1lbW9yeVNpemUgJSA0ID09PSAwID8gMCA6IDQgLSAobWVtb3J5U2l6ZSAlIDQpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgZ2V0TWVtb3J5U2l6ZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgTWVtb3J5TWFuYWdlci5idWZmZXJXaWR0aExlbmd0aCAqXG4gICAgICBNZW1vcnlNYW5hZ2VyLmJ1ZmZlckhlaWdodExlbmd0aCAvKndpZHRoKmhlaWdodCovICpcbiAgICAgIDQgLypyZ2JhKi8gKlxuICAgICAgNCAvKmJ5dGUqL1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fY3JlYXRlQnVmZmVyKGJ1ZmZlclVzZTogQnVmZmVyVXNlRW51bSkge1xuICAgIGNvbnN0IG1lbW9yeVNpemUgPSB0aGlzLmdldE1lbW9yeVNpemUoKSAqIHRoaXMuX19tZW1vcnlTaXplUmF0aW9zW2J1ZmZlclVzZS5zdHJdO1xuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuX19tYWtlTXVsdGlwbGVPZjRieXRlU2l6ZShtZW1vcnlTaXplKSk7XG5cbiAgICBsZXQgYnl0ZUFsaWduID0gNDtcbiAgICBpZiAoYnVmZmVyVXNlID09PSBCdWZmZXJVc2UuR1BVSW5zdGFuY2VEYXRhIHx8IGJ1ZmZlclVzZSA9PT0gQnVmZmVyVXNlLkdQVVZlcnRleERhdGEpIHtcbiAgICAgIGJ5dGVBbGlnbiA9IDE2O1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBCdWZmZXIoe1xuICAgICAgYnl0ZUxlbmd0aDogYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgIGJ1ZmZlcjogYXJyYXlCdWZmZXIsXG4gICAgICBuYW1lOiBidWZmZXJVc2Uuc3RyLFxuICAgICAgYnl0ZUFsaWduOiBieXRlQWxpZ24sXG4gICAgfSk7XG4gICAgdGhpcy5fX2J1ZmZlcnNbYnVmZmVyLm5hbWVdID0gYnVmZmVyO1xuXG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCdWZmZXIoYnVmZmVyVXNlOiBCdWZmZXJVc2VFbnVtKTogQnVmZmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9fYnVmZmVyc1tidWZmZXJVc2UudG9TdHJpbmcoKV07XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVPckdldEJ1ZmZlcihidWZmZXJVc2U6IEJ1ZmZlclVzZUVudW0pOiBCdWZmZXIge1xuICAgIGxldCBidWZmZXIgPSB0aGlzLl9fYnVmZmVyc1tidWZmZXJVc2UudG9TdHJpbmcoKV07XG4gICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICBidWZmZXIgPSB0aGlzLl9fY3JlYXRlQnVmZmVyKGJ1ZmZlclVzZSk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQnVmZmVyT25EZW1hbmQoc2l6ZTogQnl0ZSwgb2JqZWN0OiBSbk9iamVjdCwgYnl0ZUFsaWduOiBCeXRlKSB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEJ1ZmZlcih7XG4gICAgICBieXRlTGVuZ3RoOiBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgYnVmZmVyOiBhcnJheUJ1ZmZlcixcbiAgICAgIG5hbWU6IEJ1ZmZlclVzZS5VQk9HZW5lcmljLnRvU3RyaW5nKCksXG4gICAgICBieXRlQWxpZ246IGJ5dGVBbGlnbixcbiAgICB9KTtcbiAgICB0aGlzLl9fYnVmZmVyc09uRGVtYW5kLnNldChvYmplY3Qub2JqZWN0VUlELCBidWZmZXIpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0QnVmZmVyT25EZW1hbmQob2JqZWN0OiBSbk9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLl9fYnVmZmVyc09uRGVtYW5kLmdldChvYmplY3Qub2JqZWN0VUlEKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgYnVmZmVyV2lkdGhMZW5ndGgoKTogU2l6ZSB7XG4gICAgcmV0dXJuIENvbmZpZy5kYXRhVGV4dHVyZVdpZHRoO1xuICB9XG5cbiAgc3RhdGljIGdldCBidWZmZXJIZWlnaHRMZW5ndGgoKTogU2l6ZSB7XG4gICAgcmV0dXJuIENvbmZpZy5kYXRhVGV4dHVyZUhlaWdodDtcbiAgfVxuXG4gIHB1YmxpYyBwcmludE1lbW9yeVVzYWdlKCkge1xuICAgIGNvbnN0IGNwdUdlbmVyaWMgPSB0aGlzLl9fYnVmZmVyc1tCdWZmZXJVc2UuQ1BVR2VuZXJpYy50b1N0cmluZygpXTtcbiAgICBjb25zdCBncHVJbnN0YW5jZURhdGEgPSB0aGlzLl9fYnVmZmVyc1tCdWZmZXJVc2UuR1BVSW5zdGFuY2VEYXRhLnRvU3RyaW5nKCldO1xuICAgIGNvbnN0IGdwdVZlcnRleERhdGEgPSB0aGlzLl9fYnVmZmVyc1tCdWZmZXJVc2UuR1BVVmVydGV4RGF0YS50b1N0cmluZygpXTtcbiAgICAvLyBjb25zdCB1Ym9HZW5lcmljID0gdGhpcy5fX2J1ZmZlcnNbQnVmZmVyVXNlLlVCT0dlbmVyaWMudG9TdHJpbmcoKV07XG5cbiAgICBjb25zb2xlLmxvZygnTWVtb3J5IFVzYWdlIGluIE1lbW9yeSBNYW5hZ2VyOicpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYENQVUdlbmVyaWM6ICR7Y3B1R2VuZXJpYy50YWtlblNpemVJbkJ5dGV9IGJ5dGUgb2YgJHtjcHVHZW5lcmljLmJ5dGVMZW5ndGh9IGJ5dGVzLiAoJHtcbiAgICAgICAgKGNwdUdlbmVyaWMudGFrZW5TaXplSW5CeXRlIC8gY3B1R2VuZXJpYy5ieXRlTGVuZ3RoKSAqIDEwMFxuICAgICAgfSAlKSBgXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBHUFVJbnN0YW5jZURhdGE6ICR7Z3B1SW5zdGFuY2VEYXRhLnRha2VuU2l6ZUluQnl0ZX0gYnl0ZSBvZiAke1xuICAgICAgICBncHVJbnN0YW5jZURhdGEuYnl0ZUxlbmd0aFxuICAgICAgfSBieXRlcy4gKCR7KGdwdUluc3RhbmNlRGF0YS50YWtlblNpemVJbkJ5dGUgLyBncHVJbnN0YW5jZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDB9ICUpIGBcbiAgICApO1xuICAgIGlmIChncHVWZXJ0ZXhEYXRhICE9IG51bGwpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgR1BVVmVydGV4RGF0YTogJHtncHVWZXJ0ZXhEYXRhLnRha2VuU2l6ZUluQnl0ZX0gYnl0ZSBvZiAke1xuICAgICAgICAgIGdwdVZlcnRleERhdGEuYnl0ZUxlbmd0aFxuICAgICAgICB9IGJ5dGVzLiAoJHsoZ3B1VmVydGV4RGF0YS50YWtlblNpemVJbkJ5dGUgLyBncHVWZXJ0ZXhEYXRhLmJ5dGVMZW5ndGgpICogMTAwfSAlKSBgXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhgVUJPR2VuZXJpYzogJHt1Ym9HZW5lcmljLnRha2VuU2l6ZUluQnl0ZX0gYnl0ZSBvZiAke3Vib0dlbmVyaWMuYnl0ZUxlbmd0aH0gYnl0ZXMuICgke3Vib0dlbmVyaWMudGFrZW5TaXplSW5CeXRlIC8gdWJvR2VuZXJpYy5ieXRlTGVuZ3RoICogMTAwfSAlKSBgKTtcbiAgfVxuXG4gIHB1YmxpYyBkdW1wQnVmZmVyKGJ1ZmZlclVzZTogQnVmZmVyVXNlRW51bSk6IEJ1ZmZlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fX2J1ZmZlcnNbYnVmZmVyVXNlLnRvU3RyaW5nKCldO1xuXG4gICAgTWlzY1V0aWwuZG93bmxvYWRBcnJheUJ1ZmZlcihidWZmZXJVc2UudG9TdHJpbmcoKSwgYnVmZmVyLmdldEFycmF5QnVmZmVyKCkpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJuVGFncywgT2JqZWN0VUlEIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgZGVlcENvcHlVc2luZ0pzb25TdHJpbmdpZnkgfSBmcm9tICcuLi9taXNjL01pc2NVdGlsJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vQ29uZmlnJztcblxuLyoqXG4gKiBBIFRhZyBjbGFzc1xuICovXG5leHBvcnQgdHlwZSBUYWcgPSB7XG4gIHRhZzogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xufTtcblxuLyoqXG4gKiBUaGUgSW50ZXJmYWNlIG9mIHRoZSBSbk9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUm5PYmplY3Qge1xuICBvYmplY3RVSUQ6IE9iamVjdFVJRDtcbiAgdW5pcXVlTmFtZTogc3RyaW5nO1xuICB0cnlUb1NldFVuaXF1ZU5hbWUobmFtZTogc3RyaW5nLCB0b0FkZE5hbWVJZkNvbmZsaWN0OiBib29sZWFuKTogYm9vbGVhbjtcbiAgdmFsaWRhdGVUYWdTdHJpbmcodmFsOiBzdHJpbmcpOiBib29sZWFuO1xuICB0cnlUb1NldFRhZyh0YWc6IFRhZyk6IGJvb2xlYW47XG4gIGdldFRhZ1ZhbHVlKHRhZ05hbWU6IHN0cmluZyk6IGFueTtcbiAgbWF0Y2hUYWcodGFnTmFtZTogc3RyaW5nLCB0YWdWYWx1ZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgbWF0Y2hUYWdzQXNGcmVlU3RyaW5ncyhzdHJpbmdBcnJheTogc3RyaW5nW10pOiBib29sZWFuO1xuICBtYXRjaFRhZ3ModGFnczogUm5UYWdzKTogYm9vbGVhbjtcbiAgX2NvcHlGcm9tKHJuT2JqZWN0OiBSbk9iamVjdCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIHJvb3QgY2xhc3Mgb2YgdGhlIG9iamVjdHMgaW4gUmhvZG9uaXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBSbk9iamVjdCBpbXBsZW1lbnRzIElSbk9iamVjdCB7XG4gIC8vLyBzdGF0aWMgbWVtYmVyc1xuICBzdGF0aWMgcmVhZG9ubHkgSW52YWxpZE9iamVjdFVJRCA9IC0xO1xuICBzdGF0aWMgY3VycmVudE1heE9iamVjdENvdW50ID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX191bmlxdWVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19vYmplY3RzQnlOYW1lTWFwOiBNYXA8c3RyaW5nLCBXZWFrUmVmPFJuT2JqZWN0Pj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fb2JqZWN0czogV2Vha1JlZjxSbk9iamVjdD5bXSA9IFtdO1xuXG4gIC8vLyBtZW1iZXJzXG4gIHByaXZhdGUgcmVhZG9ubHkgX19vYmplY3RVaWQ6IE9iamVjdFVJRCA9IFJuT2JqZWN0LmN1cnJlbnRNYXhPYmplY3RDb3VudCsrO1xuICBwcml2YXRlIF9fdW5pcXVlTmFtZTogc3RyaW5nO1xuICBfdGFnczogUm5UYWdzID0ge307IC8vIFRhZyBzdHJpbmcgYWxsb3dzIGFscGhhYmV0LCBkaWdpdCBhbmQgdW5kZXJzY29yZSAoXykgb25seVxuICBwcml2YXRlIF9fY29tYmluZWRUYWdTdHJpbmcgPSAnJzsgLy8gVGFnIHN0cmluZyBhbGxvd3MgYWxwaGFiZXQsIGRpZ2l0IGFuZCB1bmRlcnNjb3JlIChfKSBvbmx5XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fX3VuaXF1ZU5hbWUgPSBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9X191aWRfJHt0aGlzLl9fb2JqZWN0VWlkfWA7XG4gICAgdGhpcy5fX3VwZGF0ZUluZm8odGhpcy5fX3VuaXF1ZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3VwZGF0ZUluZm8odW5pcXVlTmFtZTogc3RyaW5nKSB7XG4gICAgUm5PYmplY3QuX191bmlxdWVOYW1lc1t0aGlzLl9fb2JqZWN0VWlkXSA9IHVuaXF1ZU5hbWU7XG4gICAgUm5PYmplY3QuX19vYmplY3RzW3RoaXMuX19vYmplY3RVaWRdID0gbmV3IFdlYWtSZWYodGhpcyk7XG4gICAgUm5PYmplY3QuX19vYmplY3RzQnlOYW1lTWFwLnNldCh0aGlzLl9fdW5pcXVlTmFtZSwgbmV3IFdlYWtSZWYodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXIoKSB7XG4gICAgZGVsZXRlIFJuT2JqZWN0Ll9fb2JqZWN0c1t0aGlzLl9fb2JqZWN0VWlkXTtcbiAgICBkZWxldGUgUm5PYmplY3QuX191bmlxdWVOYW1lc1t0aGlzLl9fb2JqZWN0VWlkXTtcbiAgICBSbk9iamVjdC5fX29iamVjdHNCeU5hbWVNYXAuZGVsZXRlKHRoaXMuX191bmlxdWVOYW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBzZWFyY2hCeVRhZyh0YWc6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGZvciAoY29uc3Qgb2JqIG9mIFJuT2JqZWN0Ll9fb2JqZWN0cykge1xuICAgICAgaWYgKG9iai5kZXJlZigpPy5nZXRUYWdWYWx1ZSh0YWcpID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9iamVjdFVJRCBvZiB0aGUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0IG9iamVjdFVJRCgpOiBPYmplY3RVSUQge1xuICAgIHJldHVybiB0aGlzLl9fb2JqZWN0VWlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9iamVjdCBieSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3RVSUQuXG4gICAqIEBwYXJhbSBvYmplY3RVaWQgVGhlIG9iamVjdFVJRCBvZiB0aGUgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGdldFJuT2JqZWN0KG9iamVjdFVpZDogT2JqZWN0VUlEKSB7XG4gICAgcmV0dXJuIFJuT2JqZWN0Ll9fb2JqZWN0c1tvYmplY3RVaWRdPy5kZXJlZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9iamVjdCBieSB0aGUgdW5pcXVlIG5hbWUuXG4gICAqIEBwYXJhbSB1bmlxdWVOYW1lIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGdldFJuT2JqZWN0QnlOYW1lKHVuaXF1ZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBSbk9iamVjdC5fX29iamVjdHNCeU5hbWVNYXAuZ2V0KHVuaXF1ZU5hbWUpPy5kZXJlZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBzZXQgYSB1bmlxdWUgbmFtZSBvZiB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gbmFtZVxuICAgKiBAcGFyYW0gdG9BZGROYW1lSWZDb25mbGljdCBJZiB0cnVlLCBmb3JjZSB0byBhZGQgbmFtZSBzdHJpbmcgdG8gdGhlIGN1cnJlbnQgdW5pcXVlIG5hbWUgc3RyaW5nLiBJZiBmYWxzZSwgZ2l2ZSB1cCB0byBjaGFuZ2UgbmFtZS5cbiAgICovXG4gIHRyeVRvU2V0VW5pcXVlTmFtZShuYW1lOiBzdHJpbmcsIHRvQWRkTmFtZUlmQ29uZmxpY3Q6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoUm5PYmplY3QuX191bmlxdWVOYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgLy8gQ29uZmxpY3RcbiAgICAgIGlmICh0b0FkZE5hbWVJZkNvbmZsaWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld05hbWUgPSBuYW1lICsgJ18oJyArIHRoaXMuX19vYmplY3RVaWQgKyAnKSc7XG4gICAgICAgIGlmIChSbk9iamVjdC5fX3VuaXF1ZU5hbWVzLmluZGV4T2YobmV3TmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgUm5PYmplY3QuX19vYmplY3RzQnlOYW1lTWFwLmRlbGV0ZSh0aGlzLl9fdW5pcXVlTmFtZSk7XG4gICAgICAgICAgdGhpcy5fX3VuaXF1ZU5hbWUgPSBuZXdOYW1lO1xuICAgICAgICAgIFJuT2JqZWN0Ll9fdW5pcXVlTmFtZXNbdGhpcy5fX29iamVjdFVpZF0gPSB0aGlzLl9fdW5pcXVlTmFtZTtcbiAgICAgICAgICBSbk9iamVjdC5fX29iamVjdHNCeU5hbWVNYXAuc2V0KHRoaXMuX191bmlxdWVOYW1lLCBuZXcgV2Vha1JlZih0aGlzKSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3VuaXF1ZU5hbWUgPSBuYW1lO1xuICAgICAgUm5PYmplY3QuX191bmlxdWVOYW1lc1t0aGlzLl9fb2JqZWN0VWlkXSA9IHRoaXMuX191bmlxdWVOYW1lO1xuICAgICAgUm5PYmplY3QuX19vYmplY3RzQnlOYW1lTWFwLnNldCh0aGlzLl9fdW5pcXVlTmFtZSwgbmV3IFdlYWtSZWYodGhpcykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdHJpbmcgb2YgdGFncy5cbiAgICogQHBhcmFtIHZhbCBUaGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgdmFsaWRhdGVUYWdTdHJpbmcodmFsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKC9bIVwiIyQlJicoKVxcKlxcK1xcLVxcc1xcLixcXC86Ozw9Pj9AXFxbXFxcXFxcXV5ge3x9fl0vZyk7XG4gICAgaWYgKHJlZy50ZXN0KHZhbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gc2V0IHRhZyAobmFtZSBhbmQgdmFsdWUpLlxuICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgdGFnIG5hbWUuXG4gICAqIEBwYXJhbSB0YWdWYWx1ZSBUaGEgdmFsdWUgb2YgdGhlIHRhZy5cbiAgICovXG4gIHRyeVRvU2V0VGFnKHRhZzogVGFnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVUYWdTdHJpbmcodGFnLnRhZykpIHtcbiAgICAgIGlmICh0aGlzLmhhc1RhZyh0YWcudGFnKSkge1xuICAgICAgICB0aGlzLnJlbW92ZVRhZyh0YWcudGFnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdGFnc1t0YWcudGFnXSA9IHRhZy52YWx1ZTtcbiAgICAgIHRoaXMuX19jb21iaW5lZFRhZ1N0cmluZyArPSBgJHt0YWcudGFnfToke3RhZy52YWx1ZX1gICsgJyAnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGFnLlxuICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgdGFnIG5hbWUuXG4gICAqL1xuICBnZXRUYWdWYWx1ZSh0YWdOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl90YWdzW3RhZ05hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRhZyBvYmplY3QuXG4gICAqIEBwYXJhbSB0YWdOYW1lIFRoZSB0YWcgbmFtZS5cbiAgICovXG4gIGdldFRhZyh0YWdOYW1lOiBzdHJpbmcpOiBUYWcge1xuICAgIGNvbnN0IHRhZzogVGFnID0ge1xuICAgICAgdGFnOiB0YWdOYW1lLFxuICAgICAgdmFsdWU6IHRoaXMuX3RhZ3NbdGFnTmFtZV0sXG4gICAgfTtcbiAgICByZXR1cm4gdGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJvb2xlYW4gdmFsdWUgd2hldGhlciB0aGlzIG9iamVjdCBoYXMgdGhlIHRhZyBvciBub3QuXG4gICAqIEBwYXJhbSB0YWdOYW1lIFRoZSB0YWcgbmFtZS5cbiAgICovXG4gIGhhc1RhZyh0YWdOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fdGFnc1t0YWdOYW1lXSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHRhZy5cbiAgICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyBuYW1lLlxuICAgKi9cbiAgcmVtb3ZlVGFnKHRhZ05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHN0clRvRGVsZXRlID0gYCR7dGFnTmFtZX06JHt0aGlzLl90YWdzW3RhZ05hbWVdfWAgKyAnICc7XG4gICAgdGhpcy5fX2NvbWJpbmVkVGFnU3RyaW5nLnJlcGxhY2UodGhpcy5fX2NvbWJpbmVkVGFnU3RyaW5nLCAnJyk7XG4gICAgZGVsZXRlIHRoaXMuX3RhZ3NbdGFnTmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybXMgdGhlIG1hdGNoaW5nIG9mIHRoZSB0YWcgbmFtZSBhbmQgdGFnIHZhbHVlLlxuICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgdGFnIG5hbWUuXG4gICAqIEBwYXJhbSB0YWdWYWx1ZSBUaGUgdGFnIHZhbHVlLlxuICAgKi9cbiAgbWF0Y2hUYWcodGFnTmFtZTogc3RyaW5nLCB0YWdWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3RhZ3NbdGFnTmFtZV0gPT09IHRhZ1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIHRoYXQgdGhpcyBvYmplY3QncyB0YWdzIGluY2x1ZGVzIGdpdmVuIGFuIGFycmF5IG9mIHN0cmluZy5cbiAgICogQHBhcmFtIHN0cmluZ0FycmF5IGFuIGFycmF5IG9mIHN0cmluZy5cbiAgICovXG4gIG1hdGNoVGFnc0FzRnJlZVN0cmluZ3Moc3RyaW5nQXJyYXk6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgbGV0IHJlZ0V4cFN0ciA9ICdeJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlZ0V4cFN0ciArPSBgKD89Lioke3N0cmluZ0FycmF5W2ldfSlgO1xuICAgIH1cbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKHJlZ0V4cFN0cik7XG4gICAgaWYgKHJlZy50ZXN0KHRoaXMuX19jb21iaW5lZFRhZ1N0cmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gdGhhdCB0aGlzIG9iamVjdCdzIHRhZ3MgaW5jbHVkZXMgZ2l2ZW4gc2V0IG9mIHRhZ3MuXG4gICAqIEBwYXJhbSB0YWdzIFRoZSBzZXQgb2YgdGFncy5cbiAgICovXG4gIG1hdGNoVGFncyh0YWdzOiBSblRhZ3MpOiBib29sZWFuIHtcbiAgICBsZXQgcmVnRXhwU3RyID0gJ14nO1xuXG4gICAgZm9yIChjb25zdCB0YWdOYW1lIGluIHRhZ3MpIHtcbiAgICAgIHJlZ0V4cFN0ciArPSBgKD89Lioke1t0YWdOYW1lXX06JHt0YWdzW3RhZ05hbWVdfSlgO1xuICAgIH1cbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKHJlZ0V4cFN0cik7XG4gICAgaWYgKHJlZy50ZXN0KHRoaXMuX19jb21iaW5lZFRhZ1N0cmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIGdldCB1bmlxdWVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9fdW5pcXVlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBfcmVzZXQoKSB7XG4gICAgdGhpcy5jdXJyZW50TWF4T2JqZWN0Q291bnQgPSAwO1xuICAgIHRoaXMuX191bmlxdWVOYW1lcyA9IFtdO1xuICAgIHRoaXMuX19vYmplY3RzQnlOYW1lTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX19vYmplY3RzID0gW107XG4gIH1cblxuICBfY29weUZyb20ocm5PYmplY3Q6IFJuT2JqZWN0KSB7XG4gICAgdGhpcy5fdGFncyA9IGRlZXBDb3B5VXNpbmdKc29uU3RyaW5naWZ5KHJuT2JqZWN0Ll90YWdzKTtcbiAgICB0aGlzLl9fY29tYmluZWRUYWdTdHJpbmcgPSBybk9iamVjdC5fX2NvbWJpbmVkVGFnU3RyaW5nO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnRpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9FbnRpdHlSZXBvc2l0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vR2xvYmFsRGF0YVJlcG9zaXRvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9NZW1vcnlNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUm5PYmplY3QnO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tLCBfZnJvbVN0cmluZyB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IGludGVyZmFjZSBBbHBoYU1vZGVFbnVtIGV4dGVuZHMgRW51bUlPIHtcbiAgdG9HbHRmU3RyaW5nKCk6IHN0cmluZztcbn1cblxuY2xhc3MgQWxwaGFNb2RlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBBbHBoYU1vZGVFbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxuXG4gIHRvR2x0ZlN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0cjtcbiAgfVxufVxuXG5jb25zdCBPcGFxdWU6IEFscGhhTW9kZUVudW0gPSBuZXcgQWxwaGFNb2RlQ2xhc3MoeyBpbmRleDogMCwgc3RyOiAnT1BBUVVFJyB9KTtcbmNvbnN0IE1hc2s6IEFscGhhTW9kZUVudW0gPSBuZXcgQWxwaGFNb2RlQ2xhc3MoeyBpbmRleDogMSwgc3RyOiAnTUFTSycgfSk7XG5jb25zdCBCbGVuZDogQWxwaGFNb2RlRW51bSA9IG5ldyBBbHBoYU1vZGVDbGFzcyh7XG4gIGluZGV4OiAyLFxuICBzdHI6ICdCTEVORCcsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbT3BhcXVlLCBNYXNrLCBCbGVuZF07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IEFscGhhTW9kZUVudW0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgQWxwaGFNb2RlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IEFscGhhTW9kZUVudW0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIEFscGhhTW9kZUVudW07XG59XG5cbmZ1bmN0aW9uIGZyb21HbFRGU3RyaW5nKHN0cjogc3RyaW5nKTogQWxwaGFNb2RlRW51bSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgQWxwaGFNb2RlRW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IEFscGhhTW9kZSA9IE9iamVjdC5mcmVlemUoe1xuICBPcGFxdWUsXG4gIE1hc2ssXG4gIEJsZW5kLFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxuICBmcm9tR2xURlN0cmluZyxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tLCBfZnJvbVN0cmluZyB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IHR5cGUgQW5pbWF0aW9uQXR0cmlidXRlRW51bSA9IEVudW1JTztcblxuY2xhc3MgQW5pbWF0aW9uQXR0cmlidXRlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBBbmltYXRpb25BdHRyaWJ1dGVFbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxufVxuXG5jb25zdCBRdWF0ZXJuaW9uOiBBbmltYXRpb25BdHRyaWJ1dGVFbnVtID0gbmV3IEFuaW1hdGlvbkF0dHJpYnV0ZUNsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ1F1YXRlcm5pb24nLFxufSk7XG5jb25zdCBUcmFuc2xhdGU6IEFuaW1hdGlvbkF0dHJpYnV0ZUVudW0gPSBuZXcgQW5pbWF0aW9uQXR0cmlidXRlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnVHJhbnNsYXRlJyxcbn0pO1xuY29uc3QgU2NhbGU6IEFuaW1hdGlvbkF0dHJpYnV0ZUVudW0gPSBuZXcgQW5pbWF0aW9uQXR0cmlidXRlQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnU2NhbGUnLFxufSk7XG5jb25zdCBXZWlnaHRzOiBBbmltYXRpb25BdHRyaWJ1dGVFbnVtID0gbmV3IEFuaW1hdGlvbkF0dHJpYnV0ZUNsYXNzKHtcbiAgaW5kZXg6IDMsXG4gIHN0cjogJ1dlaWdodHMnLFxufSk7XG5jb25zdCBFZmZla3NlZXI6IEFuaW1hdGlvbkF0dHJpYnV0ZUVudW0gPSBuZXcgQW5pbWF0aW9uQXR0cmlidXRlQ2xhc3Moe1xuICBpbmRleDogNCxcbiAgc3RyOiAnRWZmZWtzZWVyJyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtRdWF0ZXJuaW9uLCBUcmFuc2xhdGUsIFNjYWxlLCBXZWlnaHRzLCBFZmZla3NlZXJdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBBbmltYXRpb25BdHRyaWJ1dGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIEFuaW1hdGlvbkF0dHJpYnV0ZUVudW07XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBBbmltYXRpb25BdHRyaWJ1dGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBBbmltYXRpb25BdHRyaWJ1dGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgQW5pbWF0aW9uQXR0cmlidXRlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFF1YXRlcm5pb24sXG4gIFRyYW5zbGF0ZSxcbiAgU2NhbGUsXG4gIFdlaWdodHMsXG4gIEVmZmVrc2VlcixcbiAgZnJvbSxcbiAgZnJvbVN0cmluZyxcbn0pO1xuIiwiaW1wb3J0IHsgR2x0ZjJBbmltYXRpb25TYW1wbGVySW50ZXJwb2xhdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL2dsVEYyJztcbmltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbkVudW0gZXh0ZW5kcyBFbnVtSU8ge1xuICBHbHRmU3RyaW5nOiBHbHRmMkFuaW1hdGlvblNhbXBsZXJJbnRlcnBvbGF0aW9uO1xufVxuY2xhc3MgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbkNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbkVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG5cbiAgZ2V0IEdsdGZTdHJpbmcoKTogR2x0ZjJBbmltYXRpb25TYW1wbGVySW50ZXJwb2xhdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RyLnRvVXBwZXJDYXNlKCkgYXMgR2x0ZjJBbmltYXRpb25TYW1wbGVySW50ZXJwb2xhdGlvbjtcbiAgfVxufVxuXG5jb25zdCBMaW5lYXI6IEFuaW1hdGlvbkludGVycG9sYXRpb25FbnVtID0gbmV3IEFuaW1hdGlvbkludGVycG9sYXRpb25DbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICdMaW5lYXInLFxufSk7XG5jb25zdCBTdGVwOiBBbmltYXRpb25JbnRlcnBvbGF0aW9uRW51bSA9IG5ldyBBbmltYXRpb25JbnRlcnBvbGF0aW9uQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnU3RlcCcsXG59KTtcbmNvbnN0IEN1YmljU3BsaW5lOiBBbmltYXRpb25JbnRlcnBvbGF0aW9uRW51bSA9IG5ldyBBbmltYXRpb25JbnRlcnBvbGF0aW9uQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnQ3ViaWNTcGxpbmUnLFxufSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW0xpbmVhciwgU3RlcCwgQ3ViaWNTcGxpbmVdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBBbmltYXRpb25JbnRlcnBvbGF0aW9uRW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBBbmltYXRpb25JbnRlcnBvbGF0aW9uRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IEFuaW1hdGlvbkludGVycG9sYXRpb25FbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBBbmltYXRpb25JbnRlcnBvbGF0aW9uRW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IEFuaW1hdGlvbkludGVycG9sYXRpb24gPSBPYmplY3QuZnJlZXplKHtcbiAgTGluZWFyLFxuICBTdGVwLFxuICBDdWJpY1NwbGluZSxcbiAgZnJvbSxcbiAgZnJvbVN0cmluZyxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tLCBfZnJvbVN0cmluZyB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IHR5cGUgQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBCYXNpc0NvbXByZXNzaW9uVHlwZUNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxufVxuXG5jb25zdCBFVEMxOiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0gPSBuZXcgQmFzaXNDb21wcmVzc2lvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICdFVEMxJyxcbn0pO1xuY29uc3QgRVRDMjogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnRVRDMicsXG59KTtcbmNvbnN0IEJDMTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnQkMxJyxcbn0pO1xuY29uc3QgQkMzOiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0gPSBuZXcgQmFzaXNDb21wcmVzc2lvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAzLFxuICBzdHI6ICdCQzMnLFxufSk7XG5jb25zdCBCQzQ6IEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bSA9IG5ldyBCYXNpc0NvbXByZXNzaW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDQsXG4gIHN0cjogJ0JDNCcsXG59KTtcbmNvbnN0IEJDNTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogNSxcbiAgc3RyOiAnQkM1Jyxcbn0pO1xuY29uc3QgQkM3X002X09QQVFVRTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogNixcbiAgc3RyOiAnQkM3X002X09QQVFVRScsXG59KTtcbmNvbnN0IEJDN19NNTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogNyxcbiAgc3RyOiAnQkM3X001Jyxcbn0pO1xuY29uc3QgUFZSVEMxX1JHQjogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogOCxcbiAgc3RyOiAnUFZSVEMxX1JHQicsXG59KTtcbmNvbnN0IFBWUlRDMV9SR0JBOiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0gPSBuZXcgQmFzaXNDb21wcmVzc2lvblR5cGVDbGFzcyh7XG4gIGluZGV4OiA5LFxuICBzdHI6ICdQVlJUQzFfUkdCQScsXG59KTtcbmNvbnN0IEFTVEM6IEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bSA9IG5ldyBCYXNpc0NvbXByZXNzaW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDEwLFxuICBzdHI6ICdBU1RDJyxcbn0pO1xuY29uc3QgQVRDX1JHQjogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMTEsXG4gIHN0cjogJ0FUQ19SR0InLFxufSk7XG5jb25zdCBBVENfUkdCQTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtID0gbmV3IEJhc2lzQ29tcHJlc3Npb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMTIsXG4gIHN0cjogJ0FUQ19SR0JBJyxcbn0pO1xuY29uc3QgUkdCQTMyOiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0gPSBuZXcgQmFzaXNDb21wcmVzc2lvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAxMyxcbiAgc3RyOiAnUkdCQTMyJyxcbn0pO1xuY29uc3QgUkdCNTY1OiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0gPSBuZXcgQmFzaXNDb21wcmVzc2lvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAxNCxcbiAgc3RyOiAnUkdCNTY1Jyxcbn0pO1xuY29uc3QgQkdSNTY1OiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0gPSBuZXcgQmFzaXNDb21wcmVzc2lvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAxNSxcbiAgc3RyOiAnQkdSNTY1Jyxcbn0pO1xuY29uc3QgUkdCQTQ0NDQ6IEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bSA9IG5ldyBCYXNpc0NvbXByZXNzaW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDE2LFxuICBzdHI6ICdSR0JBNDQ0NCcsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbXG4gIEVUQzEsXG4gIEVUQzIsXG4gIEJDMSxcbiAgQkMzLFxuICBCQzQsXG4gIEJDNSxcbiAgQkM3X001LFxuICBCQzdfTTZfT1BBUVVFLFxuICBQVlJUQzFfUkdCLFxuICBQVlJUQzFfUkdCQSxcbiAgQVNUQyxcbiAgQVRDX1JHQixcbiAgQVRDX1JHQkEsXG4gIFJHQkEzMixcbiAgUkdCNTY1LFxuICBCR1I1NjUsXG4gIFJHQkE0NDQ0LFxuXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bSB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgQmFzaXNDb21wcmVzc2lvblR5cGUgPSBPYmplY3QuZnJlZXplKHtcbiAgRVRDMSxcbiAgRVRDMixcbiAgQkMxLFxuICBCQzMsXG4gIEJDNCxcbiAgQkM1LFxuICBCQzdfTTUsXG4gIEJDN19NNl9PUEFRVUUsXG4gIFBWUlRDMV9SR0IsXG4gIFBWUlRDMV9SR0JBLFxuICBBU1RDLFxuICBBVENfUkdCLFxuICBBVENfUkdCQSxcbiAgUkdCQTMyLFxuICBSR0I1NjUsXG4gIEJHUjU2NSxcbiAgUkdCQTQ0NDQsXG4gIGZyb20sXG4gIGZyb21TdHJpbmcsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IGludGVyZmFjZSBCbGVuZEVudW0gZXh0ZW5kcyBFbnVtSU8ge1xuICB3ZWJncHU6IHN0cmluZztcbn1cblxuY2xhc3MgQmxlbmRDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIEJsZW5kRW51bSB7XG4gIHJlYWRvbmx5IF9fd2ViZ3B1Pzogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIsIHdlYmdwdSB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nOyB3ZWJncHU/OiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgICB0aGlzLl9fd2ViZ3B1ID0gd2ViZ3B1O1xuICB9XG5cbiAgZ2V0IHdlYmdwdSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9fd2ViZ3B1ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZG9lcyBub3Qgc3VwcG9ydCAke3RoaXMuc3RyfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3dlYmdwdTtcbiAgfVxufVxuXG5jb25zdCBFcXVhdGlvbkZ1bmNBZGQ6IEJsZW5kRW51bSA9IG5ldyBCbGVuZENsYXNzKHtcbiAgaW5kZXg6IDMyNzc0LFxuICBzdHI6ICdFcXVhdGlvbl9GVU5DX0FERCcsXG4gIHdlYmdwdTogJ2FkZCcsXG59KTtcbmNvbnN0IFplcm86IEJsZW5kRW51bSA9IG5ldyBCbGVuZENsYXNzKHtcbiAgaW5kZXg6IDB4MCxcbiAgc3RyOiAnWkVSTycsXG4gIHdlYmdwdTogJ3plcm8nLFxufSk7XG5jb25zdCBPbmU6IEJsZW5kRW51bSA9IG5ldyBCbGVuZENsYXNzKHtcbiAgaW5kZXg6IDB4MSxcbiAgc3RyOiAnT05FJyxcbiAgd2ViZ3B1OiAnb25lJyxcbn0pO1xuY29uc3QgU3JjQWxwaGE6IEJsZW5kRW51bSA9IG5ldyBCbGVuZENsYXNzKHtcbiAgaW5kZXg6IDc3MCxcbiAgc3RyOiAnU1JDX0FMUEhBJyxcbiAgd2ViZ3B1OiAnc3JjLWFscGhhJyxcbn0pO1xuY29uc3QgT25lTWludXNTcmNBbHBoYTogQmxlbmRFbnVtID0gbmV3IEJsZW5kQ2xhc3Moe1xuICBpbmRleDogNzcxLFxuICBzdHI6ICdPTkVfTUlOVVNfU1JDX0FMUEhBJyxcbiAgd2ViZ3B1OiAnb25lLW1pbnVzLXNyYy1hbHBoYScsXG59KTtcbmNvbnN0IE1pbjogQmxlbmRFbnVtID0gbmV3IEJsZW5kQ2xhc3Moe1xuICBpbmRleDogMHg4MDA3LFxuICBzdHI6ICdFcXVhdGlvbl9GVU5DX01JTicsXG4gIHdlYmdwdTogJ21pbicsXG59KTtcbmNvbnN0IE1heDogQmxlbmRFbnVtID0gbmV3IEJsZW5kQ2xhc3Moe1xuICBpbmRleDogMHg4MDA4LFxuICBzdHI6ICdFcXVhdGlvbl9GVU5DX01BWCcsXG4gIHdlYmdwdTogJ21heCcsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbRXF1YXRpb25GdW5jQWRkLCBaZXJvLCBPbmUsIFNyY0FscGhhLCBPbmVNaW51c1NyY0FscGhhLCBNaW4sIE1heF07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IEJsZW5kRW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBCbGVuZEVudW07XG59XG5cbmV4cG9ydCBjb25zdCBCbGVuZCA9IE9iamVjdC5mcmVlemUoe1xuICBFcXVhdGlvbkZ1bmNBZGQsXG4gIFplcm8sXG4gIE9uZSxcbiAgU3JjQWxwaGEsXG4gIE9uZU1pbnVzU3JjQWxwaGEsXG4gIE1pbixcbiAgTWF4LFxuICBmcm9tLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgdHlwZSBCb25lRGF0YVR5cGVFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBCb25lRGF0YVR5cGVDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIEJvbmVEYXRhVHlwZUVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG59XG5cbmNvbnN0IE1hdDQzeDE6IEJvbmVEYXRhVHlwZUVudW0gPSBuZXcgQm9uZURhdGFUeXBlQ2xhc3Moe1xuICBpbmRleDogMCxcbiAgc3RyOiAnTWF0NDN4MScsXG59KTtcbmNvbnN0IFZlYzR4MjogQm9uZURhdGFUeXBlRW51bSA9IG5ldyBCb25lRGF0YVR5cGVDbGFzcyh7XG4gIGluZGV4OiAxLFxuICBzdHI6ICdWZWM0eDInLFxufSk7XG5jb25zdCBWZWM0eDJPbGQ6IEJvbmVEYXRhVHlwZUVudW0gPSBuZXcgQm9uZURhdGFUeXBlQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnVmVjNHgyT2xkJyxcbn0pO1xuY29uc3QgVmVjNHgxOiBCb25lRGF0YVR5cGVFbnVtID0gbmV3IEJvbmVEYXRhVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDMsXG4gIHN0cjogJ1ZlYzR4MScsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbTWF0NDN4MSwgVmVjNHgyLCBWZWM0eDFdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBCb25lRGF0YVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIEJvbmVEYXRhVHlwZUVudW07XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBCb25lRGF0YVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBCb25lRGF0YVR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgQm9uZURhdGFUeXBlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE1hdDQzeDEsXG4gIFZlYzR4MixcbiAgVmVjNHgyT2xkLFxuICBWZWM0eDEsXG4gIGZyb20sXG4gIGZyb21TdHJpbmcsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIEJ1ZmZlclVzZUVudW0gPSBFbnVtSU87XG5cbmNsYXNzIEJ1ZmZlclVzZUNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgQnVmZmVyVXNlRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgR1BVSW5zdGFuY2VEYXRhOiBCdWZmZXJVc2VFbnVtID0gbmV3IEJ1ZmZlclVzZUNsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ0dQVUluc3RhbmNlRGF0YScsXG59KTtcbmNvbnN0IEdQVVZlcnRleERhdGE6IEJ1ZmZlclVzZUVudW0gPSBuZXcgQnVmZmVyVXNlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnR1BVVmVydGV4RGF0YScsXG59KTtcbmNvbnN0IFVCT0dlbmVyaWM6IEJ1ZmZlclVzZUVudW0gPSBuZXcgQnVmZmVyVXNlQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnVUJPR2VuZXJpYycsXG59KTtcbmNvbnN0IENQVUdlbmVyaWM6IEJ1ZmZlclVzZUVudW0gPSBuZXcgQnVmZmVyVXNlQ2xhc3Moe1xuICBpbmRleDogMyxcbiAgc3RyOiAnQ1BVR2VuZXJpYycsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbR1BVSW5zdGFuY2VEYXRhLCBHUFVWZXJ0ZXhEYXRhLCBVQk9HZW5lcmljLCBDUFVHZW5lcmljXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogQnVmZmVyVXNlRW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBCdWZmZXJVc2VFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogQnVmZmVyVXNlRW51bSB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgQnVmZmVyVXNlRW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IEJ1ZmZlclVzZSA9IE9iamVjdC5mcmVlemUoe1xuICBHUFVJbnN0YW5jZURhdGEsXG4gIEdQVVZlcnRleERhdGEsXG4gIFVCT0dlbmVyaWMsXG4gIENQVUdlbmVyaWMsXG4gIGZyb20sXG4gIGZyb21TdHJpbmcsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIENhbWVyYUNvbnRyb2xsZXJUeXBlRW51bSA9IEVudW1JTztcblxuY2xhc3MgQ2FtZXJhQ29udHJvbGxlclR5cGVDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIENhbWVyYUNvbnRyb2xsZXJUeXBlRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgT3JiaXQ6IENhbWVyYUNvbnRyb2xsZXJUeXBlRW51bSA9IG5ldyBDYW1lcmFDb250cm9sbGVyVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ09yYml0Jyxcbn0pO1xuY29uc3QgV2Fsa1Rocm91Z2g6IENhbWVyYUNvbnRyb2xsZXJUeXBlRW51bSA9IG5ldyBDYW1lcmFDb250cm9sbGVyVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDEsXG4gIHN0cjogJ1dhbGtUaHJvdWdoJyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtPcmJpdCwgV2Fsa1Rocm91Z2hdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBDYW1lcmFDb250cm9sbGVyVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgQ2FtZXJhQ29udHJvbGxlclR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogQ2FtZXJhQ29udHJvbGxlclR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBDYW1lcmFDb250cm9sbGVyVHlwZUVudW07XG59XG5cbmV4cG9ydCBjb25zdCBDYW1lcmFDb250cm9sbGVyVHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBPcmJpdCxcbiAgV2Fsa1Rocm91Z2gsXG4gIGZyb20sXG4gIGZyb21TdHJpbmcsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIENhbWVyYVR5cGVFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBDYW1lcmFUeXBlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBDYW1lcmFUeXBlRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgUGVyc3BlY3RpdmU6IENhbWVyYVR5cGVFbnVtID0gbmV3IENhbWVyYVR5cGVDbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICdQZXJzcGVjdGl2ZScsXG59KTtcbmNvbnN0IE9ydGhvZ3JhcGhpYzogQ2FtZXJhVHlwZUVudW0gPSBuZXcgQ2FtZXJhVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDEsXG4gIHN0cjogJ09ydGhvZ3JhcGhpYycsXG59KTtcbmNvbnN0IEZydXN0dW06IENhbWVyYVR5cGVFbnVtID0gbmV3IENhbWVyYVR5cGVDbGFzcyh7IGluZGV4OiAyLCBzdHI6ICdGcnVzdHVtJyB9KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbUGVyc3BlY3RpdmUsIE9ydGhvZ3JhcGhpYywgRnJ1c3R1bV07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IENhbWVyYVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIENhbWVyYVR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogQ2FtZXJhVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIENhbWVyYVR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgQ2FtZXJhVHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBQZXJzcGVjdGl2ZSxcbiAgT3J0aG9ncmFwaGljLFxuICBGcnVzdHVtLFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuaW1wb3J0IHsgVHlwZWRBcnJheSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgR2x0ZjJBY2Nlc3NvckNvbXBvbmVudFR5cGVOdW1iZXIgfSBmcm9tICcuLi8uLi90eXBlcy9nbFRGMic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50VHlwZUVudW0gZXh0ZW5kcyBFbnVtSU8ge1xuICB3Z3NsOiBzdHJpbmc7XG4gIHdlYmdwdTogc3RyaW5nO1xuICBnZXRTaXplSW5CeXRlcygpOiBudW1iZXI7XG4gIGlzRmxvYXRpbmdQb2ludCgpOiBib29sZWFuO1xuICBpc0ludGVnZXIoKTogYm9vbGVhbjtcbn1cblxuY2xhc3MgQ29tcG9uZW50VHlwZUNsYXNzPFR5cGVOYW1lIGV4dGVuZHMgc3RyaW5nPiBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIENvbXBvbmVudFR5cGVFbnVtIHtcbiAgcmVhZG9ubHkgX193ZWJncHU6IHN0cmluZztcbiAgcmVhZG9ubHkgX193Z3NsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IF9fc2l6ZUluQnl0ZXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgX19kdW1teVN0cjogVHlwZU5hbWU7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBpbmRleCxcbiAgICBzdHIsXG4gICAgc2l6ZUluQnl0ZXMsXG4gICAgd2dzbCxcbiAgICB3ZWJncHUsXG4gIH06IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHN0cjogVHlwZU5hbWU7XG4gICAgc2l6ZUluQnl0ZXM6IG51bWJlcjtcbiAgICB3Z3NsOiBzdHJpbmc7XG4gICAgd2ViZ3B1OiBzdHJpbmc7XG4gIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gICAgdGhpcy5fX3NpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5fX3dlYmdwdSA9IHdlYmdwdTtcbiAgICB0aGlzLl9fd2dzbCA9IHdnc2w7XG4gICAgdGhpcy5fX2R1bW15U3RyID0gc3RyO1xuICB9XG5cbiAgZ2V0IHdnc2woKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fX3dnc2w7XG4gIH1cblxuICBnZXQgd2ViZ3B1KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWJncHU7XG4gIH1cblxuICBnZXRTaXplSW5CeXRlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9fc2l6ZUluQnl0ZXM7XG4gIH1cblxuICBpc0Zsb2F0aW5nUG9pbnQoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmRleCA9PT0gNTEyNiB8fCAvLyBGbG9hdFxuICAgICAgdGhpcy5pbmRleCA9PT0gNTEyNyB8fCAvLyBEb3VibGVcbiAgICAgIHRoaXMuaW5kZXggPT09IDB4OGQ2MSAvLyBIYWxmRmxvYXRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzSW50ZWdlcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmluZGV4ID09PSA1MTIwIHx8IC8vIEJ5dGVcbiAgICAgIHRoaXMuaW5kZXggPT09IDUxMjIgfHwgLy8gU2hvcnRcbiAgICAgIHRoaXMuaW5kZXggPT09IDUxMjQgLy8gSW50XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc1Vuc2lnbmVkSW50ZWdlcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmluZGV4ID09PSA1MTIxIHx8IC8vIFVuc2lnbmVkQnl0ZVxuICAgICAgdGhpcy5pbmRleCA9PT0gNTEyMyB8fCAvLyBVbnNpZ25lZFNob3J0XG4gICAgICB0aGlzLmluZGV4ID09PSA1MTI1IC8vIFVuc2lnbmVkSW50XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmNvbnN0IFVua25vd24gPSBuZXcgQ29tcG9uZW50VHlwZUNsYXNzKHtcbiAgaW5kZXg6IDUxMTksXG4gIHN0cjogJ1VOS05PV04nLFxuICBzaXplSW5CeXRlczogMCxcbiAgd2dzbDogJ3Vua25vd24nLFxuICB3ZWJncHU6ICd1bmtub3duJyxcbn0pO1xuY29uc3QgQnl0ZSA9IG5ldyBDb21wb25lbnRUeXBlQ2xhc3Moe1xuICBpbmRleDogNTEyMCxcbiAgc3RyOiAnQllURScsXG4gIHNpemVJbkJ5dGVzOiAxLFxuICB3Z3NsOiAnaTMyJyxcbiAgd2ViZ3B1OiAnc2ludDgnLFxufSk7XG5jb25zdCBVbnNpZ25lZEJ5dGUgPSBuZXcgQ29tcG9uZW50VHlwZUNsYXNzKHtcbiAgaW5kZXg6IDUxMjEsXG4gIHN0cjogJ1VOU0lHTkVEX0JZVEUnLFxuICBzaXplSW5CeXRlczogMSxcbiAgd2dzbDogJ3UzMicsXG4gIHdlYmdwdTogJ3VpbnQ4Jyxcbn0pO1xuY29uc3QgU2hvcnQgPSBuZXcgQ29tcG9uZW50VHlwZUNsYXNzKHtcbiAgaW5kZXg6IDUxMjIsXG4gIHN0cjogJ1NIT1JUJyxcbiAgc2l6ZUluQnl0ZXM6IDIsXG4gIHdnc2w6ICdpMzInLFxuICB3ZWJncHU6ICdzaW50MTYnLFxufSk7XG5jb25zdCBVbnNpZ25lZFNob3J0ID0gbmV3IENvbXBvbmVudFR5cGVDbGFzcyh7XG4gIGluZGV4OiA1MTIzLFxuICBzdHI6ICdVTlNJR05FRF9TSE9SVCcsXG4gIHNpemVJbkJ5dGVzOiAyLFxuICB3Z3NsOiAndTMyJyxcbiAgd2ViZ3B1OiAndWludDE2Jyxcbn0pO1xuY29uc3QgSW50ID0gbmV3IENvbXBvbmVudFR5cGVDbGFzcyh7XG4gIGluZGV4OiA1MTI0LFxuICBzdHI6ICdJTlQnLFxuICBzaXplSW5CeXRlczogNCxcbiAgd2dzbDogJ2kzMicsXG4gIHdlYmdwdTogJ3NpbnQzMicsXG59KTtcbmNvbnN0IFVuc2lnbmVkSW50ID0gbmV3IENvbXBvbmVudFR5cGVDbGFzcyh7XG4gIGluZGV4OiA1MTI1LFxuICBzdHI6ICdVTlNJR05FRF9JTlQnLFxuICBzaXplSW5CeXRlczogNCxcbiAgd2dzbDogJ3UzMicsXG4gIHdlYmdwdTogJ3VpbnQzMicsXG59KTtcbmNvbnN0IEZsb2F0ID0gbmV3IENvbXBvbmVudFR5cGVDbGFzcyh7XG4gIGluZGV4OiA1MTI2LFxuICBzdHI6ICdGTE9BVCcsXG4gIHNpemVJbkJ5dGVzOiA0LFxuICB3Z3NsOiAnZjMyJyxcbiAgd2ViZ3B1OiAnZmxvYXQzMicsXG59KTtcbmNvbnN0IERvdWJsZSA9IG5ldyBDb21wb25lbnRUeXBlQ2xhc3Moe1xuICBpbmRleDogNTEyNyxcbiAgc3RyOiAnRE9VQkxFJyxcbiAgc2l6ZUluQnl0ZXM6IDgsXG4gIHdnc2w6ICdmMzInLFxuICB3ZWJncHU6ICdmbG9hdDY0Jyxcbn0pO1xuY29uc3QgQm9vbCA9IG5ldyBDb21wb25lbnRUeXBlQ2xhc3Moe1xuICBpbmRleDogMzU2NzAsXG4gIHN0cjogJ0JPT0wnLFxuICBzaXplSW5CeXRlczogMSxcbiAgd2dzbDogJ2Jvb2wnLFxuICB3ZWJncHU6ICdib29sJyxcbn0pO1xuY29uc3QgSGFsZkZsb2F0ID0gbmV3IENvbXBvbmVudFR5cGVDbGFzcyh7XG4gIGluZGV4OiAweDE0MGIsXG4gIHN0cjogJ0hBTEZfRkxPQVQnLFxuICBzaXplSW5CeXRlczogMixcbiAgd2dzbDogJ2YxNicsXG4gIHdlYmdwdTogJ2Zsb2F0MTYnLFxufSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW1xuICBVbmtub3duLFxuICBCeXRlLFxuICBVbnNpZ25lZEJ5dGUsXG4gIFNob3J0LFxuICBVbnNpZ25lZFNob3J0LFxuICBJbnQsXG4gIFVuc2lnbmVkSW50LFxuICBGbG9hdCxcbiAgRG91YmxlLFxuICBIYWxmRmxvYXQsXG4gIEJvb2wsXG5dO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBDb21wb25lbnRUeXBlRW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBDb21wb25lbnRUeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IENvbXBvbmVudFR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBDb21wb25lbnRUeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVR5cGVkQXJyYXkodHlwZWRBcnJheTogVHlwZWRBcnJheSk6IENvbXBvbmVudFR5cGVFbnVtIHtcbiAgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gQnl0ZTtcbiAgfSBlbHNlIGlmICh0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICByZXR1cm4gVW5zaWduZWRCeXRlO1xuICB9IGVsc2UgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5KSB7XG4gICAgcmV0dXJuIFNob3J0O1xuICB9IGVsc2UgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkge1xuICAgIHJldHVybiBVbnNpZ25lZFNob3J0O1xuICB9IGVsc2UgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSB7XG4gICAgcmV0dXJuIEludDtcbiAgfSBlbHNlIGlmICh0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICByZXR1cm4gVW5zaWduZWRJbnQ7XG4gIH0gZWxzZSBpZiAodHlwZWRBcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIHJldHVybiBGbG9hdDtcbiAgfSBlbHNlIGlmICh0eXBlZEFycmF5IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgcmV0dXJuIERvdWJsZTtcbiAgfVxuXG4gIHJldHVybiBVbmtub3duO1xufVxuXG5mdW5jdGlvbiB0b1R5cGVkQXJyYXkoY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW0pOiBUeXBlZEFycmF5Q29uc3RydWN0b3IgfCB1bmRlZmluZWQge1xuICBpZiAoY29tcG9uZW50VHlwZSA9PT0gQnl0ZSkge1xuICAgIHJldHVybiBJbnQ4QXJyYXk7XG4gIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZSA9PT0gVW5zaWduZWRCeXRlKSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXk7XG4gIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZSA9PT0gU2hvcnQpIHtcbiAgICByZXR1cm4gSW50MTZBcnJheTtcbiAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlID09PSBVbnNpZ25lZFNob3J0KSB7XG4gICAgcmV0dXJuIFVpbnQxNkFycmF5O1xuICB9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGUgPT09IEludCkge1xuICAgIHJldHVybiBJbnQzMkFycmF5O1xuICB9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGUgPT09IFVuc2lnbmVkSW50KSB7XG4gICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICB9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGUgPT09IEZsb2F0KSB7XG4gICAgcmV0dXJuIEZsb2F0MzJBcnJheTtcbiAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlID09PSBEb3VibGUpIHtcbiAgICByZXR1cm4gRmxvYXQ2NEFycmF5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZnJvbVdnc2xTdHJpbmcoc3RyXzogc3RyaW5nKTogQ29tcG9uZW50VHlwZUVudW0ge1xuICBsZXQgc3RyID0gc3RyXztcbiAgc3dpdGNoIChzdHJfKSB7XG4gICAgY2FzZSAnYm9vbCc6XG4gICAgICBzdHIgPSAnQk9PTCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpMzInOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1MzInOlxuICAgICAgc3RyID0gJ1VOU0lHTkVEX0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmMzInOlxuICAgICAgc3RyID0gJ0ZMT0FUJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlYzI8ZjMyPic6XG4gICAgICBzdHIgPSAnRkxPQVQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmVjMzxmMzI+JzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZWM0PGYzMj4nOlxuICAgICAgc3RyID0gJ0ZMT0FUJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21hdDJ4MjxmMzI+JzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQzeDM8ZjMyPic6XG4gICAgICBzdHIgPSAnRkxPQVQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWF0NHg0PGYzMj4nOlxuICAgICAgc3RyID0gJ0ZMT0FUJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlYzI8aTMyPic6XG4gICAgICBzdHIgPSAnSU5UJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlYzM8aTMyPic6XG4gICAgICBzdHIgPSAnSU5UJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlYzQ8aTMyPic6XG4gICAgICBzdHIgPSAnSU5UJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NhbXBsZXJfMmQnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyXzJkX3NoYWRvdyc6XG4gICAgICBzdHIgPSAnSU5UJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NhbXBsZXJfM2QnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyX2N1YmUnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIENvbXBvbmVudFR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tR2xzbFN0cmluZyhzdHJfOiBzdHJpbmcpOiBDb21wb25lbnRUeXBlRW51bSB7XG4gIGxldCBzdHIgPSBzdHJfO1xuICBzd2l0Y2ggKHN0cl8pIHtcbiAgICBjYXNlICdib29sJzpcbiAgICAgIHN0ciA9ICdCT09MJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludCc6XG4gICAgICBzdHIgPSAnSU5UJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZWMyJzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZWMzJzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZWM0JzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQyJzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQzJzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQ0JzpcbiAgICAgIHN0ciA9ICdGTE9BVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpdmVjMic6XG4gICAgICBzdHIgPSAnSU5UJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2l2ZWMzJzpcbiAgICAgIHN0ciA9ICdJTlQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaXZlYzQnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyMkQnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyMkRTaGFkb3cnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyMkRSZWN0JzpcbiAgICAgIHN0ciA9ICdJTlQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2FtcGxlcjNEJzpcbiAgICAgIHN0ciA9ICdJTlQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2FtcGxlckN1YmUnOlxuICAgICAgc3RyID0gJ0lOVCc7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIENvbXBvbmVudFR5cGVFbnVtO1xufVxuXG5leHBvcnQgdHlwZSBHbHRmMkFjY2Vzc29yQ29tcG9uZW50VHlwZSA9XG4gIHwgdHlwZW9mIEJ5dGVcbiAgfCB0eXBlb2YgVW5zaWduZWRCeXRlXG4gIHwgdHlwZW9mIFNob3J0XG4gIHwgdHlwZW9mIFVuc2lnbmVkU2hvcnRcbiAgfCB0eXBlb2YgSW50XG4gIHwgdHlwZW9mIFVuc2lnbmVkSW50XG4gIHwgdHlwZW9mIEZsb2F0O1xuXG5mdW5jdGlvbiB0b0dsdGYyQWNjZXNzb3JDb21wb25lbnRUeXBlKFxuICBjb21wb25lbnRUeXBlRm9yR2x0ZjI6IENvbXBvbmVudFR5cGVFbnVtXG4pOiBHbHRmMkFjY2Vzc29yQ29tcG9uZW50VHlwZU51bWJlciB7XG4gIHJldHVybiBjb21wb25lbnRUeXBlRm9yR2x0ZjIuaW5kZXggYXMgR2x0ZjJBY2Nlc3NvckNvbXBvbmVudFR5cGVOdW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBDb21wb25lbnRUeXBlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVua25vd24sXG4gIEJ5dGUsXG4gIFVuc2lnbmVkQnl0ZSxcbiAgU2hvcnQsXG4gIFVuc2lnbmVkU2hvcnQsXG4gIEludCxcbiAgVW5zaWduZWRJbnQsXG4gIEZsb2F0LFxuICBEb3VibGUsXG4gIEJvb2wsXG4gIEhhbGZGbG9hdCxcbiAgZnJvbSxcbiAgZnJvbVR5cGVkQXJyYXksXG4gIHRvVHlwZWRBcnJheSxcbiAgdG9HbHRmMkFjY2Vzc29yQ29tcG9uZW50VHlwZSxcbiAgZnJvbVN0cmluZyxcbiAgZnJvbUdsc2xTdHJpbmcsXG4gIGZyb21XZ3NsU3RyaW5nLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuaW1wb3J0IHtcbiAgQ291bnQsXG4gIEluZGV4T2YxNkJ5dGVzLFxuICBTcXVhcmVNYXRyaXhDb21wb25lbnROLFxuICBWZWN0b3JBbmRTcXVhcmVNYXRyaXhDb21wb25lbnROLFxuICBWZWN0b3JDb21wb25lbnROLFxufSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcgfSBmcm9tICcuLi8uLi90eXBlcy9nbFRGMic7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zaXRpb25UeXBlRW51bSBleHRlbmRzIEVudW1JTyB7XG4gIHdlYmdwdTogc3RyaW5nO1xuICB3Z3NsOiBzdHJpbmc7XG4gIGdldE51bWJlck9mQ29tcG9uZW50cygpOiBDb3VudDtcbiAgZ2V0R2xzbFN0cihjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSk6IHN0cmluZztcbiAgZ2V0R2xzbEluaXRpYWxWYWx1ZShjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSk6IHN0cmluZztcbiAgdG9XR1NMVHlwZShjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSk6IHN0cmluZztcbiAgZ2V0V2dzbEluaXRpYWxWYWx1ZShjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSk6IHN0cmluZztcbiAgZ2V0VmVjNFNpemVPZlByb3BlcnR5KCk6IEluZGV4T2YxNkJ5dGVzO1xufVxuXG5jbGFzcyBDb21wb3NpdGlvblR5cGVDbGFzczxUeXBlTmFtZSBleHRlbmRzIHN0cmluZz5cbiAgZXh0ZW5kcyBFbnVtQ2xhc3NcbiAgaW1wbGVtZW50cyBDb21wb3NpdGlvblR5cGVFbnVtXG57XG4gIHJlYWRvbmx5IF9fbnVtYmVyT2ZDb21wb25lbnRzOiBudW1iZXI7XG4gIHJlYWRvbmx5IF9fZ2xzbFN0cjogc3RyaW5nO1xuICByZWFkb25seSBfX2hsc2xTdHI6IHN0cmluZztcbiAgcmVhZG9ubHkgX193ZWJncHVTdHI6IHN0cmluZztcbiAgcmVhZG9ubHkgX193Z3NsU3RyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IF9faXNBcnJheTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgX192ZWM0U2l6ZU9mUHJvcGVydHk6IEluZGV4T2YxNkJ5dGVzO1xuICByZWFkb25seSBfX2R1bW15U3RyOiBUeXBlTmFtZTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZGV4LFxuICAgIHN0cixcbiAgICBnbHNsU3RyLFxuICAgIGhsc2xTdHIsXG4gICAgd2dzbCxcbiAgICB3ZWJncHUsXG4gICAgbnVtYmVyT2ZDb21wb25lbnRzLFxuICAgIHZlYzRTaXplT2ZQcm9wZXJ0eSxcbiAgICBpc0FycmF5ID0gZmFsc2UsXG4gIH06IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHN0cjogVHlwZU5hbWU7XG4gICAgZ2xzbFN0cjogc3RyaW5nO1xuICAgIGhsc2xTdHI6IHN0cmluZztcbiAgICB3Z3NsOiBzdHJpbmc7XG4gICAgd2ViZ3B1OiBzdHJpbmc7XG4gICAgbnVtYmVyT2ZDb21wb25lbnRzOiBudW1iZXI7XG4gICAgdmVjNFNpemVPZlByb3BlcnR5OiBJbmRleE9mMTZCeXRlcztcbiAgICBpc0FycmF5PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgICB0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID0gbnVtYmVyT2ZDb21wb25lbnRzO1xuICAgIHRoaXMuX19nbHNsU3RyID0gZ2xzbFN0cjtcbiAgICB0aGlzLl9faGxzbFN0ciA9IGhsc2xTdHI7XG4gICAgdGhpcy5fX3ZlYzRTaXplT2ZQcm9wZXJ0eSA9IHZlYzRTaXplT2ZQcm9wZXJ0eTtcbiAgICB0aGlzLl9faXNBcnJheSA9IGlzQXJyYXk7XG4gICAgdGhpcy5fX3dlYmdwdVN0ciA9IHdlYmdwdTtcbiAgICB0aGlzLl9fd2dzbFN0ciA9IHdnc2w7XG4gICAgdGhpcy5fX2R1bW15U3RyID0gc3RyO1xuICB9XG5cbiAgZ2V0IHdlYmdwdSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3dlYmdwdVN0cjtcbiAgfVxuXG4gIGdldCB3Z3NsKCkge1xuICAgIHJldHVybiB0aGlzLl9fd2dzbFN0cjtcbiAgfVxuXG4gIGdldE51bWJlck9mQ29tcG9uZW50cygpOiBDb3VudCB7XG4gICAgcmV0dXJuIHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHM7XG4gIH1cblxuICBnZXRHbHNsU3RyKGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgaWYgKFxuICAgICAgY29tcG9uZW50VHlwZS5pbmRleCA9PT0gNTEyNiB8fCAvLyBGTE9BVFxuICAgICAgY29tcG9uZW50VHlwZS5pbmRleCA9PT0gNTEyNyB8fCAvLyBET1VCTEVcbiAgICAgIHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQgfHxcbiAgICAgIHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkRTaGFkb3cgfHxcbiAgICAgIHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkRSZWN0IHx8XG4gICAgICB0aGlzID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZUN1YmVcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZ2xzbFN0cjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29tcG9uZW50VHlwZS5pbmRleCA9PT0gNTEyMCB8fCAvLyBCWVRFXG4gICAgICBjb21wb25lbnRUeXBlLmluZGV4ID09PSA1MTIyIHx8IC8vIFNIT1JUXG4gICAgICBjb21wb25lbnRUeXBlLmluZGV4ID09PSA1MTI0IC8vIElOVFxuICAgICkge1xuICAgICAgaWYgKHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIgfHwgdGhpcyA9PT0gQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5KSB7XG4gICAgICAgIHJldHVybiAnaW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnaScgKyB0aGlzLl9fZ2xzbFN0cjtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxuICAgIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZS5pbmRleCA9PT0gMzU2NzApIHtcbiAgICAgIC8vIEJPT0xcbiAgICAgIHJldHVybiAnYm9vbCc7XG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bic7XG4gIH1cblxuICBnZXRHbHNsSW5pdGlhbFZhbHVlKGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgaWYgKFxuICAgICAgY29tcG9uZW50VHlwZS5pbmRleCA9PT0gNTEyNiB8fCAvLyBGTE9BVFxuICAgICAgY29tcG9uZW50VHlwZS5pbmRleCA9PT0gNTEyNyAvLyBET1VCTEVcbiAgICApIHtcbiAgICAgIGlmICh0aGlzID09PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyKSB7XG4gICAgICAgIHJldHVybiAnMC4wJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19nbHNsU3RyICsgJygwLjAsIDAuMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2dsc2xTdHIgKyAnKDAuMCwgMC4wLCAwLjApJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSA0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19nbHNsU3RyICsgJygwLjAsIDAuMCwgMC4wLCAwLjApJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSA5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19nbHNsU3RyICsgJygwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wKSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMTYpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fX2dsc2xTdHIgK1xuICAgICAgICAgICAgJygwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjApJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29tcG9uZW50VHlwZS5pbmRleCA9PT0gNTEyMCB8fCAvLyBCWVRFXG4gICAgICBjb21wb25lbnRUeXBlLmluZGV4ID09PSA1MTIyIHx8IC8vIFNIT1JUXG4gICAgICBjb21wb25lbnRUeXBlLmluZGV4ID09PSA1MTI0IC8vIElOVFxuICAgICkge1xuICAgICAgaWYgKHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuICcwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19nbHNsU3RyICsgJygwLCAwKSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMykge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fZ2xzbFN0ciArICcoMCwgMCwgMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2dsc2xTdHIgKyAnKDAsIDAsIDAsIDApJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSA5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19nbHNsU3RyICsgJygwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMTYpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2dsc2xTdHIgKyAnKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZXR0aWVyL3ByZXR0aWVyXG4gICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlLmluZGV4ID09PSAzNTY3MCkge1xuICAgICAgLy8gQk9PTFxuICAgICAgaWYgKHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuICdmYWxzZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMikge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fZ2xzbFN0ciArICcoZmFsc2UsIGZhbHNlKSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMykge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fZ2xzbFN0ciArICcoZmFsc2UsIGZhbHNlLCBmYWxzZSknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX2dsc2xTdHIgKyAnKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIGdldFdnc2xJbml0aWFsVmFsdWUoY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW0pIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50b1dHU0xUeXBlKGNvbXBvbmVudFR5cGUpO1xuICAgIGlmIChcbiAgICAgIGNvbXBvbmVudFR5cGUuaW5kZXggPT09IDUxMjYgfHwgLy8gRkxPQVRcbiAgICAgIGNvbXBvbmVudFR5cGUuaW5kZXggPT09IDUxMjcgLy8gRE9VQkxFXG4gICAgKSB7XG4gICAgICBpZiAodGhpcyA9PT0gQ29tcG9zaXRpb25UeXBlLlNjYWxhcikge1xuICAgICAgICByZXR1cm4gJzAuMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMikge1xuICAgICAgICAgIHJldHVybiB0eXBlICsgJygwLjAsIDAuMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDMpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZSArICcoMC4wLCAwLjAsIDAuMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDQpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZSArICcoMC4wLCAwLjAsIDAuMCwgMC4wKSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gOSkge1xuICAgICAgICAgIHJldHVybiB0eXBlICsgJygwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wKSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMTYpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZSArXG4gICAgICAgICAgICAnKDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCknXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjb21wb25lbnRUeXBlLmluZGV4ID09PSA1MTIwIHx8IC8vIEJZVEVcbiAgICAgIGNvbXBvbmVudFR5cGUuaW5kZXggPT09IDUxMjIgfHwgLy8gU0hPUlRcbiAgICAgIGNvbXBvbmVudFR5cGUuaW5kZXggPT09IDUxMjQgLy8gSU5UXG4gICAgKSB7XG4gICAgICBpZiAodGhpcyA9PT0gQ29tcG9zaXRpb25UeXBlLlNjYWxhcikge1xuICAgICAgICByZXR1cm4gJzAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZSArICcoMCwgMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDMpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZSArICcoMCwgMCwgMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDQpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZSArICcoMCwgMCwgMCwgMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDkpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZSArICcoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCknO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19udW1iZXJPZkNvbXBvbmVudHMgPT09IDE2KSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGUgKyAnKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZXR0aWVyL3ByZXR0aWVyXG4gICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlLmluZGV4ID09PSAzNTY3MCkge1xuICAgICAgLy8gQk9PTFxuICAgICAgaWYgKHRoaXMgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuICdmYWxzZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fX251bWJlck9mQ29tcG9uZW50cyA9PT0gMikge1xuICAgICAgICAgIHJldHVybiB0eXBlICsgJyhmYWxzZSwgZmFsc2UpJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSAzKSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGUgKyAnKGZhbHNlLCBmYWxzZSwgZmFsc2UpJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fbnVtYmVyT2ZDb21wb25lbnRzID09PSA0KSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGUgKyAnKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIHRvV0dTTFR5cGUoY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW0pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9fd2dzbFN0ci5yZXBsYWNlKCcjJywgY29tcG9uZW50VHlwZS53Z3NsKTtcbiAgfVxuXG4gIGdldFZlYzRTaXplT2ZQcm9wZXJ0eSgpOiBJbmRleE9mMTZCeXRlcyB7XG4gICAgcmV0dXJuIHRoaXMuX192ZWM0U2l6ZU9mUHJvcGVydHk7XG4gIH1cbn1cblxuY29uc3QgVW5rbm93biA9IG5ldyBDb21wb3NpdGlvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAtMSxcbiAgc3RyOiAnVU5LTk9XTicsXG4gIGdsc2xTdHI6ICd1bmtub3duJyxcbiAgaGxzbFN0cjogJ3Vua25vd24nLFxuICB3Z3NsOiAndW5rbm93bicsXG4gIHdlYmdwdTogJ3Vua25vd24nLFxuICBudW1iZXJPZkNvbXBvbmVudHM6IDAsXG4gIHZlYzRTaXplT2ZQcm9wZXJ0eTogMCxcbn0pO1xuY29uc3QgU2NhbGFyID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ1NDQUxBUicsXG4gIGdsc2xTdHI6ICdmbG9hdCcsXG4gIGhsc2xTdHI6ICdmbG9hdCcsXG4gIHdnc2w6ICcjJyxcbiAgd2ViZ3B1OiAnJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxLFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDEsXG59KTtcbmNvbnN0IFZlYzIgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnVkVDMicsXG4gIGdsc2xTdHI6ICd2ZWMyJyxcbiAgaGxzbFN0cjogJ2Zsb2F0MicsXG4gIHdnc2w6ICd2ZWMyPCM+JyxcbiAgd2ViZ3B1OiAneDInLFxuICBudW1iZXJPZkNvbXBvbmVudHM6IDIsXG4gIHZlYzRTaXplT2ZQcm9wZXJ0eTogMSxcbn0pO1xuY29uc3QgVmVjMyA9IG5ldyBDb21wb3NpdGlvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAyLFxuICBzdHI6ICdWRUMzJyxcbiAgZ2xzbFN0cjogJ3ZlYzMnLFxuICBobHNsU3RyOiAnZmxvYXQzJyxcbiAgd2dzbDogJ3ZlYzM8Iz4nLFxuICB3ZWJncHU6ICd4MycsXG4gIG51bWJlck9mQ29tcG9uZW50czogMyxcbiAgdmVjNFNpemVPZlByb3BlcnR5OiAxLFxufSk7XG5jb25zdCBWZWM0ID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDMsXG4gIHN0cjogJ1ZFQzQnLFxuICBnbHNsU3RyOiAndmVjNCcsXG4gIGhsc2xTdHI6ICdmbG9hdDQnLFxuICB3Z3NsOiAndmVjNDwjPicsXG4gIHdlYmdwdTogJ3g0JyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiA0LFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDEsXG59KTtcbmNvbnN0IE1hdDIgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogNCxcbiAgc3RyOiAnTUFUMicsXG4gIGdsc2xTdHI6ICdtYXQyJyxcbiAgaGxzbFN0cjogJ2Zsb2F0MngyJyxcbiAgd2dzbDogJ21hdDJ4MjwjPicsXG4gIHdlYmdwdTogJ3Vua25vd24nLFxuICBudW1iZXJPZkNvbXBvbmVudHM6IDQsXG4gIHZlYzRTaXplT2ZQcm9wZXJ0eTogMixcbn0pO1xuY29uc3QgTWF0MyA9IG5ldyBDb21wb3NpdGlvblR5cGVDbGFzcyh7XG4gIGluZGV4OiA1LFxuICBzdHI6ICdNQVQzJyxcbiAgZ2xzbFN0cjogJ21hdDMnLFxuICBobHNsU3RyOiAnZmxvYXQzeDMnLFxuICB3Z3NsOiAnbWF0M3gzPCM+JyxcbiAgd2ViZ3B1OiAndW5rbm93bicsXG4gIG51bWJlck9mQ29tcG9uZW50czogOSxcbiAgdmVjNFNpemVPZlByb3BlcnR5OiAzLFxufSk7XG5jb25zdCBNYXQ0ID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDYsXG4gIHN0cjogJ01BVDQnLFxuICBnbHNsU3RyOiAnbWF0NCcsXG4gIGhsc2xTdHI6ICdmbG9hdDR4NCcsXG4gIHdnc2w6ICdtYXQ0eDQ8Iz4nLFxuICB3ZWJncHU6ICd1bmtub3duJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxNixcbiAgdmVjNFNpemVPZlByb3BlcnR5OiA0LFxufSk7XG5jb25zdCBUZXh0dXJlMkQgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogNyxcbiAgc3RyOiAnVEVYVFVSRV8yRCcsXG4gIGdsc2xTdHI6ICdzYW1wbGVyMkQnLFxuICBobHNsU3RyOiAnVGV4dHVyZTJEJyxcbiAgd2dzbDogJ3RleHR1cmVfMmQnLFxuICB3ZWJncHU6ICd0ZXh0dXJlXzJkJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxLFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDEsXG59KTtcbmNvbnN0IFRleHR1cmVDdWJlID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDgsXG4gIHN0cjogJ1RFWFRVUkVfQ1VCRV9NQVAnLFxuICBnbHNsU3RyOiAnc2FtcGxlckN1YmUnLFxuICBobHNsU3RyOiAnVGV4dHVyZUN1YmUnLFxuICB3Z3NsOiAndGV4dHVyZV9jdWJlJyxcbiAgd2ViZ3B1OiAndGV4dHVyZV9jdWJlJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxLFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDEsXG59KTtcbmNvbnN0IFNjYWxhckFycmF5ID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDksXG4gIHN0cjogJ1NDQUxBUl9BUlJBWScsXG4gIGdsc2xTdHI6ICdmbG9hdCcsXG4gIGhsc2xTdHI6ICdmbG9hdCcsXG4gIHdnc2w6ICcjJyxcbiAgd2ViZ3B1OiAndW5rbm93bicsXG4gIG51bWJlck9mQ29tcG9uZW50czogMSxcbiAgdmVjNFNpemVPZlByb3BlcnR5OiAxLFxuICBpc0FycmF5OiB0cnVlLFxufSk7XG5jb25zdCBWZWMyQXJyYXkgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMTAsXG4gIHN0cjogJ1ZFQzJfQVJSQVknLFxuICBnbHNsU3RyOiAndmVjMicsXG4gIGhsc2xTdHI6ICdmbG9hdDInLFxuICB3Z3NsOiAndmVjMjwjPicsXG4gIHdlYmdwdTogJ3Vua25vd24nLFxuICBudW1iZXJPZkNvbXBvbmVudHM6IDIsXG4gIHZlYzRTaXplT2ZQcm9wZXJ0eTogMSxcbiAgaXNBcnJheTogdHJ1ZSxcbn0pO1xuY29uc3QgVmVjM0FycmF5ID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDExLFxuICBzdHI6ICdWRUMzX0FSUkFZJyxcbiAgZ2xzbFN0cjogJ3ZlYzMnLFxuICBobHNsU3RyOiAnZmxvYXQzJyxcbiAgd2dzbDogJ3ZlYzM8Iz4nLFxuICB3ZWJncHU6ICd1bmtub3duJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAzLFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDEsXG4gIGlzQXJyYXk6IHRydWUsXG59KTtcbmNvbnN0IFZlYzRBcnJheSA9IG5ldyBDb21wb3NpdGlvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAxMixcbiAgc3RyOiAnVkVDNF9BUlJBWScsXG4gIGdsc2xTdHI6ICd2ZWM0JyxcbiAgaGxzbFN0cjogJ2Zsb2F0NCcsXG4gIHdnc2w6ICd2ZWM0PCM+JyxcbiAgd2ViZ3B1OiAndW5rbm93bicsXG4gIG51bWJlck9mQ29tcG9uZW50czogNCxcbiAgdmVjNFNpemVPZlByb3BlcnR5OiAxLFxuICBpc0FycmF5OiB0cnVlLFxufSk7XG5jb25zdCBNYXQ0QXJyYXkgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMTMsXG4gIHN0cjogJ01BVDRfQVJSQVknLFxuICBnbHNsU3RyOiAnbWF0NCcsXG4gIGhsc2xTdHI6ICdmbG9hdDR4NCcsXG4gIHdnc2w6ICdtYXQ0eDQ8Iz4nLFxuICB3ZWJncHU6ICd1bmtub3duJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxNixcbiAgdmVjNFNpemVPZlByb3BlcnR5OiA0LFxuICBpc0FycmF5OiB0cnVlLFxufSk7XG5jb25zdCBNYXQzQXJyYXkgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMTQsXG4gIHN0cjogJ01BVDNfQVJSQVknLFxuICBnbHNsU3RyOiAnbWF0MycsXG4gIGhsc2xTdHI6ICdmbG9hdDN4MycsXG4gIHdnc2w6ICdtYXQzeDM8Iz4nLFxuICB3ZWJncHU6ICd1bmtub3duJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiA5LFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDMsXG4gIGlzQXJyYXk6IHRydWUsXG59KTtcbmNvbnN0IE1hdDJBcnJheSA9IG5ldyBDb21wb3NpdGlvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAxNSxcbiAgc3RyOiAnTUFUMl9BUlJBWScsXG4gIGdsc2xTdHI6ICdtYXQyJyxcbiAgaGxzbFN0cjogJ2Zsb2F0MngyJyxcbiAgd2dzbDogJ21hdDJ4MjwjPicsXG4gIHdlYmdwdTogJ3Vua25vd24nLFxuICBudW1iZXJPZkNvbXBvbmVudHM6IDQsXG4gIHZlYzRTaXplT2ZQcm9wZXJ0eTogMixcbiAgaXNBcnJheTogdHJ1ZSxcbn0pO1xuY29uc3QgVGV4dHVyZTJEU2hhZG93ID0gbmV3IENvbXBvc2l0aW9uVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDE2LFxuICBzdHI6ICdURVhUVVJFXzJEX1NIQURPVycsXG4gIGdsc2xTdHI6ICdoaWdocCBzYW1wbGVyMkRTaGFkb3cnLFxuICBobHNsU3RyOiAnVGV4dHVyZTJEJyxcbiAgd2dzbDogJ3RleHR1cmVfMmQnLFxuICB3ZWJncHU6ICd0ZXh0dXJlXzJkJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxLFxuICB2ZWM0U2l6ZU9mUHJvcGVydHk6IDEsXG59KTtcbmNvbnN0IFRleHR1cmUyRFJlY3QgPSBuZXcgQ29tcG9zaXRpb25UeXBlQ2xhc3Moe1xuICBpbmRleDogMTcsXG4gIHN0cjogJ1RFWFRVUkVfMkRfUkVDVCcsXG4gIGdsc2xTdHI6ICdzYW1wbGVyMkRSZWN0JyxcbiAgaGxzbFN0cjogJ1RleHR1cmUyRCcsXG4gIHdnc2w6ICd0ZXh0dXJlXzJkJyxcbiAgd2ViZ3B1OiAndGV4dHVyZV8yZCcsXG4gIG51bWJlck9mQ29tcG9uZW50czogMSxcbiAgdmVjNFNpemVPZlByb3BlcnR5OiAxLFxufSk7XG5jb25zdCBNYXQ0eDNBcnJheSA9IG5ldyBDb21wb3NpdGlvblR5cGVDbGFzcyh7XG4gIGluZGV4OiAxOCxcbiAgc3RyOiAnTUFUNHgzX0FSUkFZJyxcbiAgZ2xzbFN0cjogJ21hdDR4MycsXG4gIGhsc2xTdHI6ICdmbG9hdDR4MycsXG4gIHdnc2w6ICdtYXQ0eDM8Iz4nLFxuICB3ZWJncHU6ICd1bmtub3duJyxcbiAgbnVtYmVyT2ZDb21wb25lbnRzOiAxMixcbiAgdmVjNFNpemVPZlByb3BlcnR5OiAzLFxuICBpc0FycmF5OiB0cnVlLFxufSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW1xuICBVbmtub3duLFxuICBTY2FsYXIsXG4gIFZlYzIsXG4gIFZlYzMsXG4gIFZlYzQsXG4gIE1hdDIsXG4gIE1hdDMsXG4gIE1hdDQsXG4gIFZlYzJBcnJheSxcbiAgVmVjM0FycmF5LFxuICBWZWM0QXJyYXksXG4gIFNjYWxhckFycmF5LFxuICBNYXQyQXJyYXksXG4gIE1hdDNBcnJheSxcbiAgTWF0NEFycmF5LFxuICBUZXh0dXJlMkQsXG4gIFRleHR1cmUyRFNoYWRvdyxcbiAgVGV4dHVyZTJEUmVjdCxcbiAgVGV4dHVyZUN1YmUsXG4gIE1hdDR4M0FycmF5LFxuXTtcblxuZXhwb3J0IHR5cGUgVmVjdG9yQ29tcG9zaXRpb25UeXBlcyA9IHR5cGVvZiBTY2FsYXIgfCB0eXBlb2YgVmVjMiB8IHR5cGVvZiBWZWMzIHwgdHlwZW9mIFZlYzQ7XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IENvbXBvc2l0aW9uVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgQ29tcG9zaXRpb25UeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IENvbXBvc2l0aW9uVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIENvbXBvc2l0aW9uVHlwZUVudW07XG59XG5cbmZ1bmN0aW9uIHZlY3RvckZyb20oY29tcG9uZW50TjogbnVtYmVyKTogQ29tcG9zaXRpb25UeXBlRW51bSB7XG4gIGxldCBzdHIgPSAnJztcbiAgc3dpdGNoIChjb21wb25lbnROKSB7XG4gICAgY2FzZSAxOlxuICAgICAgc3RyID0gJ3NjYWxhcic7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBzdHIgPSAndmVjMic7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBzdHIgPSAndmVjMyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICBzdHIgPSAndmVjNCc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgTG9nZ2VyLmVycm9yKCdub3QgZm91bmQgYXBwcm9wcmlhdGUgVmVjdG9ycycpO1xuICB9XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgQ29tcG9zaXRpb25UeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbUdsc2xTdHJpbmcoc3RyXzogc3RyaW5nKTogQ29tcG9zaXRpb25UeXBlRW51bSB7XG4gIGxldCBzdHIgPSBzdHJfO1xuICBzd2l0Y2ggKHN0cl8pIHtcbiAgICBjYXNlICdib29sJzpcbiAgICAgIHN0ciA9ICdzY2FsYXInO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW50JzpcbiAgICAgIHN0ciA9ICdzY2FsYXInO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmxvYXQnOlxuICAgICAgc3RyID0gJ3NjYWxhcic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpdmVjMic6XG4gICAgICBzdHIgPSAndmVjMic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpdmVjMyc6XG4gICAgICBzdHIgPSAndmVjMyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpdmVjNCc6XG4gICAgICBzdHIgPSAndmVjNCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyMkQnOlxuICAgICAgc3RyID0gJ1RFWFRVUkVfMkQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2FtcGxlcjJEU2hhZG93JzpcbiAgICAgIHN0ciA9ICdURVhUVVJFXzJEX1NIQURPVyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyMkRSZWN0JzpcbiAgICAgIHN0ciA9ICdURVhUVVJFXzJEX1JFQ1QnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2FtcGxlckN1YmUnOlxuICAgICAgc3RyID0gJ1RFWFRVUkVfQ1VCRV9NQVAnO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBDb21wb3NpdGlvblR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tV2dzbFN0cmluZyhzdHJfOiBzdHJpbmcpOiBDb21wb3NpdGlvblR5cGVFbnVtIHtcbiAgbGV0IHN0ciA9IHN0cl87XG4gIHN3aXRjaCAoc3RyXykge1xuICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgc3RyID0gJ3NjYWxhcic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpMzInOlxuICAgICAgc3RyID0gJ3NjYWxhcic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1MzInOlxuICAgICAgc3RyID0gJ3NjYWxhcic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmMzInOlxuICAgICAgc3RyID0gJ3NjYWxhcic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZWMyPGYzMj4nOlxuICAgICAgc3RyID0gJ3ZlYzInO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmVjMzxmMzI+JzpcbiAgICAgIHN0ciA9ICd2ZWMzJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlYzQ8ZjMyPic6XG4gICAgICBzdHIgPSAndmVjNCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQyeDI8ZjMyPic6XG4gICAgICBzdHIgPSAnbWF0Mic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQzeDM8ZjMyPic6XG4gICAgICBzdHIgPSAnbWF0Myc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQ0eDQ8ZjMyPic6XG4gICAgICBzdHIgPSAnbWF0NCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZWMyPGkzMj4nOlxuICAgICAgc3RyID0gJ3ZlYzInO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmVjMzxpMzI+JzpcbiAgICAgIHN0ciA9ICd2ZWMzJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlYzQ8aTMyPic6XG4gICAgICBzdHIgPSAndmVjNCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQyeDI8aTMyPic6XG4gICAgICBzdHIgPSAnbWF0Mic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQzeDM8aTMyPic6XG4gICAgICBzdHIgPSAnbWF0Myc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXQ0eDQ8aTMyPic6XG4gICAgICBzdHIgPSAnbWF0NCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyXzJkJzpcbiAgICAgIHN0ciA9ICdURVhUVVJFXzJEJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NhbXBsZXJfMmRfc2hhZG93JzpcbiAgICAgIHN0ciA9ICdURVhUVVJFXzJEX1NIQURPVyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzYW1wbGVyX2N1YmUnOlxuICAgICAgc3RyID0gJ1RFWFRVUkVfQ1VCRV9NQVAnO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBDb21wb3NpdGlvblR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiB0b0dsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcoXG4gIGNvbXBvbmVudE46IFZlY3RvckFuZFNxdWFyZU1hdHJpeENvbXBvbmVudE5cbik6IEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcge1xuICBzd2l0Y2ggKGNvbXBvbmVudE4pIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gJ1NDQUxBUic7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICdWRUMyJztcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gJ1ZFQzMnO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnVkVDNCc7XG4gICAgY2FzZSA5OlxuICAgICAgcmV0dXJuICdNQVQzJztcbiAgICBjYXNlIDE2OlxuICAgICAgcmV0dXJuICdNQVQ0JztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbXBvbmVudE4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0dsdGYyQW5pbWF0aW9uQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcoXG4gIGNvbXBvbmVudE46IFZlY3RvckNvbXBvbmVudE5cbik6IEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcge1xuICBzd2l0Y2ggKGNvbXBvbmVudE4pIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gJ1NDQUxBUic7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICdWRUMyJztcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gJ1ZFQzMnO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnVkVDNCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wb25lbnROJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9HbHRmMlNxdWFyZU1hdHJpeEFjY2Vzc29yQ29tcG9zaXRpb25UeXBlU3RyaW5nKFxuICBjb21wb25lbnROOiBTcXVhcmVNYXRyaXhDb21wb25lbnROXG4pOiBHbHRmMkFjY2Vzc29yQ29tcG9zaXRpb25UeXBlU3RyaW5nIHtcbiAgc3dpdGNoIChjb21wb25lbnROKSB7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuICdWRUM0JztcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gJ01BVDMnO1xuICAgIGNhc2UgMTY6XG4gICAgICByZXR1cm4gJ01BVDQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcG9uZW50TicpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEdsdGYyQW5pbWF0aW9uQWNjZXNzb3JDb21wb3NpdGlvblR5cGUgPVxuICB8IHR5cGVvZiBTY2FsYXJcbiAgfCB0eXBlb2YgVmVjMlxuICB8IHR5cGVvZiBWZWMzXG4gIHwgdHlwZW9mIFZlYzQ7XG5cbmV4cG9ydCB0eXBlIEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGUgPVxuICB8IHR5cGVvZiBTY2FsYXJcbiAgfCB0eXBlb2YgVmVjMlxuICB8IHR5cGVvZiBWZWMzXG4gIHwgdHlwZW9mIFZlYzRcbiAgfCB0eXBlb2YgTWF0MlxuICB8IHR5cGVvZiBNYXQzXG4gIHwgdHlwZW9mIE1hdDQ7XG5cbmZ1bmN0aW9uIHRvR2x0ZjJBbmltYXRpb25BY2Nlc3NvckNvbXBvc2l0aW9uVHlwZShcbiAgY29tcG9uZW50TjogVmVjdG9yQ29tcG9uZW50TlxuKTogR2x0ZjJBbmltYXRpb25BY2Nlc3NvckNvbXBvc2l0aW9uVHlwZSB7XG4gIHN3aXRjaCAoY29tcG9uZW50Tikge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBTY2FsYXI7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIFZlYzI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIFZlYzM7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIFZlYzQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wb25lbnROJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcnJheShjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0pIHtcbiAgaWYgKFxuICAgIGNvbXBvc2l0aW9uVHlwZSA9PT0gU2NhbGFyQXJyYXkgfHxcbiAgICBjb21wb3NpdGlvblR5cGUgPT09IFZlYzJBcnJheSB8fFxuICAgIGNvbXBvc2l0aW9uVHlwZSA9PT0gVmVjM0FycmF5IHx8XG4gICAgY29tcG9zaXRpb25UeXBlID09PSBWZWM0QXJyYXkgfHxcbiAgICBjb21wb3NpdGlvblR5cGUgPT09IE1hdDR4M0FycmF5IHx8XG4gICAgY29tcG9zaXRpb25UeXBlID09PSBNYXQ0QXJyYXkgfHxcbiAgICBjb21wb3NpdGlvblR5cGUgPT09IE1hdDNBcnJheSB8fFxuICAgIGNvbXBvc2l0aW9uVHlwZSA9PT0gTWF0MkFycmF5XG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHR1cmUoY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtKSB7XG4gIGlmIChcbiAgICBjb21wb3NpdGlvblR5cGUgPT09IFRleHR1cmUyRCB8fFxuICAgIGNvbXBvc2l0aW9uVHlwZSA9PT0gVGV4dHVyZUN1YmUgfHxcbiAgICBjb21wb3NpdGlvblR5cGUgPT09IFRleHR1cmUyRFNoYWRvdyB8fFxuICAgIGNvbXBvc2l0aW9uVHlwZSA9PT0gVGV4dHVyZTJEUmVjdFxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IENvbXBvc2l0aW9uVHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBVbmtub3duLFxuICBTY2FsYXIsXG4gIFZlYzIsXG4gIFZlYzMsXG4gIFZlYzQsXG4gIE1hdDIsXG4gIE1hdDMsXG4gIE1hdDQsXG4gIFNjYWxhckFycmF5LFxuICBWZWMyQXJyYXksXG4gIFZlYzNBcnJheSxcbiAgVmVjNEFycmF5LFxuICBNYXQyQXJyYXksXG4gIE1hdDNBcnJheSxcbiAgTWF0NEFycmF5LFxuICBUZXh0dXJlMkQsXG4gIFRleHR1cmUyRFNoYWRvdyxcbiAgVGV4dHVyZUN1YmUsXG4gIFRleHR1cmUyRFJlY3QsXG4gIE1hdDR4M0FycmF5LFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxuICB2ZWN0b3JGcm9tLFxuICBmcm9tR2xzbFN0cmluZyxcbiAgZnJvbVdnc2xTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzVGV4dHVyZSxcbiAgdG9HbHRmMkFuaW1hdGlvbkFjY2Vzc29yQ29tcG9zaXRpb25UeXBlLFxuICB0b0dsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcsXG4gIHRvR2x0ZjJBbmltYXRpb25BY2Nlc3NvckNvbXBvc2l0aW9uVHlwZVN0cmluZyxcbiAgdG9HbHRmMlNxdWFyZU1hdHJpeEFjY2Vzc29yQ29tcG9zaXRpb25UeXBlU3RyaW5nLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG50eXBlIEJsb2NrSW5mbyA9IHtcbiAgYnl0ZVNpemU6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtIGV4dGVuZHMgRW51bUlPIHtcbiAgd2ViZ3B1Pzogc3RyaW5nO1xuICBibG9ja0luZm8/OiBCbG9ja0luZm9cbn1cblxuY2xhc3MgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0ge1xuICByZWFkb25seSBfX3dlYmdwdT86IHN0cmluZztcbiAgcmVhZG9ubHkgX19ibG9ja0luZm8/OiBCbG9ja0luZm87XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciwgd2ViZ3B1LCBibG9ja0luZm8gfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZzsgd2ViZ3B1Pzogc3RyaW5nLCBibG9ja0luZm8/OiBCbG9ja0luZm8gfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgICB0aGlzLl9fd2ViZ3B1ID0gd2ViZ3B1O1xuICAgIHRoaXMuX19ibG9ja0luZm8gPSBibG9ja0luZm87XG4gIH1cblxuICBnZXQgd2ViZ3B1KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX193ZWJncHUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkb2VzIG5vdCBzdXBwb3J0ICR7dGhpcy5zdHJ9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fd2ViZ3B1O1xuICB9XG5cbiAgZ2V0IGJsb2NrSW5mbygpOiBCbG9ja0luZm8ge1xuICAgIGlmICh0aGlzLl9fYmxvY2tJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZG9lcyBub3Qgc3VwcG9ydCAke3RoaXMuc3RyfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2Jsb2NrSW5mbztcbiAgfVxufVxuXG5jb25zdCBBU1RDX1JHQkFfNHg0OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4MDgsXG4gIHN0cjogJ0NPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTR4NC11bm9ybScsXG4gIGJsb2NrSW5mbzoge1xuICAgIGJ5dGVTaXplOiAxNixcbiAgICB3aWR0aDogNCxcbiAgICBoZWlnaHQ6IDQsXG4gIH1cbn0pO1xuY29uc3QgQVNUQ19SR0JBXzV4NDogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODA5LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfQVNUQ181eDRfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy01eDQtdW5vcm0nLFxufSk7XG5jb25zdCBBU1RDX1JHQkFfNXg1OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4MTAsXG4gIHN0cjogJ0NPTVBSRVNTRURfUkdCQV9BU1RDXzV4NV9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTV4NS11bm9ybScsXG59KTtcbmNvbnN0IEFTVENfUkdCQV82eDU6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzgxMSxcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JBX0FTVENfNng1X0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtNng1LXVub3JtJyxcbn0pO1xuY29uc3QgQVNUQ19SR0JBXzZ4NjogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODEyLFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfQVNUQ182eDZfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy02eDYtdW5vcm0nLFxufSk7XG5jb25zdCBBU1RDX1JHQkFfOHg1OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4MTMsXG4gIHN0cjogJ0NPTVBSRVNTRURfUkdCQV9BU1RDXzh4NV9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTh4NS11bm9ybScsXG59KTtcbmNvbnN0IEFTVENfUkdCQV84eDY6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzgxNCxcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg2X0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtOHg2LXVub3JtJyxcbn0pO1xuY29uc3QgQVNUQ19SR0JBXzh4ODogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODE1LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfQVNUQ184eDhfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy04eDgtdW5vcm0nLFxufSk7XG5jb25zdCBBU1RDX1JHQkFfMTB4NTogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODE2LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg1X0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtMTB4NS11bm9ybScsXG59KTtcbmNvbnN0IEFTVENfUkdCQV8xMHg2OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4MTcsXG4gIHN0cjogJ0NPTVBSRVNTRURfUkdCQV9BU1RDXzEweDZfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy0xMHg2LXVub3JtJyxcbn0pO1xuY29uc3QgQVNUQ19SR0JBXzEweDg6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzgxOCxcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4OF9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTEweDgtdW5vcm0nLFxufSk7XG5jb25zdCBBU1RDX1JHQkFfMTB4MTA6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzgxOSxcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy0xMHgxMC11bm9ybScsXG59KTtcbmNvbnN0IEFTVENfUkdCQV8xMngxMDogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODIwLFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTEyeDEwLXVub3JtJyxcbn0pO1xuY29uc3QgQVNUQ19SR0JBXzEyeDEyOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4MjEsXG4gIHN0cjogJ0NPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEyX0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtMTJ4MTItdW5vcm0nLFxufSk7XG5jb25zdCBBU1RDX1NSR0JfNHg0OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4NDAsXG4gIHN0cjogJ0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNHg0X0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtNHg0LXVub3JtLXNyZ2InLFxuICBibG9ja0luZm86IHtcbiAgICBieXRlU2l6ZTogMTYsXG4gICAgd2lkdGg6IDQsXG4gICAgaGVpZ2h0OiA0LFxuICB9XG59KTtcbmNvbnN0IEFTVENfU1JHQl81eDQ6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0MSxcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDRfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy01eDQtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl81eDU6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0MixcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDVfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy01eDUtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl82eDU6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0MyxcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDVfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy02eDUtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl82eDY6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0NCxcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy02eDYtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl84eDU6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0NSxcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDVfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy04eDUtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl84eDY6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0NixcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDZfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy04eDYtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl84eDg6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzg0NyxcbiAgc3RyOiAnQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDhfS0hSJyxcbiAgd2ViZ3B1OiAnYXN0Yy04eDgtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl8xMHg1OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4NDgsXG4gIHN0cjogJ0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4NV9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTEweDUtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl8xMHg2OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4NDksXG4gIHN0cjogJ0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTEweDYtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl8xMHg4OiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzc4NTAsXG4gIHN0cjogJ0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFInLFxuICB3ZWJncHU6ICdhc3RjLTEweDgtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl8xMHgxMDogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODUxLFxuICBzdHI6ICdDT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtMTB4MTAtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl8xMngxMDogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODUyLFxuICBzdHI6ICdDT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtMTJ4MTAtdW5vcm0tc3JnYicsXG59KTtcbmNvbnN0IEFTVENfU1JHQl8xMngxMjogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3ODUzLFxuICBzdHI6ICdDT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEyX0tIUicsXG4gIHdlYmdwdTogJ2FzdGMtMTJ4MTItdW5vcm0tc3JnYicsXG59KTtcblxuY29uc3QgUzNUQ19SR0JfRFhUMTogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDMzNzc2LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUJyxcbiAgd2ViZ3B1OiAnYmMxLXJnYmEtdW5vcm0nLFxuICBibG9ja0luZm86IHtcbiAgICBieXRlU2l6ZTogOCxcbiAgICB3aWR0aDogNCxcbiAgICBoZWlnaHQ6IDQsXG4gIH1cbn0pO1xuY29uc3QgUzNUQ19SR0JBX0RYVDE6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzMzc3NyxcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQnLFxuICB3ZWJncHU6ICdiYzEtcmdiYS11bm9ybScsXG4gIGJsb2NrSW5mbzoge1xuICAgIGJ5dGVTaXplOiA4LFxuICAgIHdpZHRoOiA0LFxuICAgIGhlaWdodDogNCxcbiAgfVxufSk7XG5jb25zdCBTM1RDX1JHQkFfRFhUMzogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDMzNzc4LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCcsXG4gIHdlYmdwdTogJ2JjMi1yZ2JhLXVub3JtJyxcbiAgYmxvY2tJbmZvOiB7XG4gICAgYnl0ZVNpemU6IDE2LFxuICAgIHdpZHRoOiA0LFxuICAgIGhlaWdodDogNCxcbiAgfVxufSk7XG5jb25zdCBTM1RDX1JHQkFfRFhUNTogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDMzNzc5LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCcsXG4gIHdlYmdwdTogJ2JjMy1yZ2JhLXVub3JtJyxcbiAgYmxvY2tJbmZvOiB7XG4gICAgYnl0ZVNpemU6IDE2LFxuICAgIHdpZHRoOiA0LFxuICAgIGhlaWdodDogNCxcbiAgfVxufSk7XG5jb25zdCBCUFRDX1JHQkE6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNjQ5MixcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhUJyxcbiAgd2ViZ3B1OiAnYmM3LXJnYmEtdW5vcm0nLFxuICBibG9ja0luZm86IHtcbiAgICBieXRlU2l6ZTogMTYsXG4gICAgd2lkdGg6IDQsXG4gICAgaGVpZ2h0OiA0LFxuICB9XG59KTtcbmNvbnN0IFBWUlRDX1JHQkFfNEJQUFYxOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSA9IG5ldyBDb21wcmVzc2lvblRleHR1cmVUeXBlQ2xhc3Moe1xuICBpbmRleDogMzU4NDIsXG4gIHN0cjogJ0NPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HJyxcbiAgYmxvY2tJbmZvOiB7XG4gICAgYnl0ZVNpemU6IDgsXG4gICAgd2lkdGg6IDQsXG4gICAgaGVpZ2h0OiA0LFxuICB9XG59KTtcbmNvbnN0IFBWUlRDX1JHQl80QlBQVjE6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNTg0MCxcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRycsXG4gIGJsb2NrSW5mbzoge1xuICAgIGJ5dGVTaXplOiA4LFxuICAgIHdpZHRoOiA0LFxuICAgIGhlaWdodDogNCxcbiAgfVxufSk7XG5jb25zdCBFVEMyX1JHQkE4X0VBQzogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDM3NDk2LFxuICBzdHI6ICdDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDJyxcbiAgd2ViZ3B1OiAnZXRjMi1yZ2JhOHVub3JtJyxcbiAgYmxvY2tJbmZvOiB7XG4gICAgYnl0ZVNpemU6IDE2LFxuICAgIHdpZHRoOiA0LFxuICAgIGhlaWdodDogNCxcbiAgfVxufSk7XG5jb25zdCBFVEMyX1JHQjg6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNzQ5MixcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0I4X0VUQzInLFxuICB3ZWJncHU6ICdldGMyLXJnYjh1bm9ybScsXG4gIGJsb2NrSW5mbzoge1xuICAgIGJ5dGVTaXplOiAxNixcbiAgICB3aWR0aDogNCxcbiAgICBoZWlnaHQ6IDQsXG4gIH1cbn0pO1xuY29uc3QgRVRDMV9SR0I6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtID0gbmV3IENvbXByZXNzaW9uVGV4dHVyZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzNjE5NixcbiAgc3RyOiAnQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTCcsXG59KTtcbmNvbnN0IFJHQkE4X0VYVDogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gPSBuZXcgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDMyODU2LFxuICBzdHI6ICdSR0JBOF9FWFQnLFxuICBibG9ja0luZm86IHtcbiAgICBieXRlU2l6ZTogNCxcbiAgICB3aWR0aDogMSxcbiAgICBoZWlnaHQ6IDEsXG4gIH1cbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtcbiAgQVNUQ19SR0JBXzR4NCxcbiAgQVNUQ19SR0JBXzV4NCxcbiAgQVNUQ19SR0JBXzV4NSxcbiAgQVNUQ19SR0JBXzZ4NSxcbiAgQVNUQ19SR0JBXzZ4NixcbiAgQVNUQ19SR0JBXzh4NSxcbiAgQVNUQ19SR0JBXzh4NixcbiAgQVNUQ19SR0JBXzh4OCxcbiAgQVNUQ19SR0JBXzEweDUsXG4gIEFTVENfUkdCQV8xMHg2LFxuICBBU1RDX1JHQkFfMTB4OCxcbiAgQVNUQ19SR0JBXzEweDEwLFxuICBBU1RDX1JHQkFfMTJ4MTAsXG4gIEFTVENfUkdCQV8xMngxMixcbiAgQVNUQ19TUkdCXzR4NCxcbiAgQVNUQ19TUkdCXzV4NCxcbiAgQVNUQ19TUkdCXzV4NSxcbiAgQVNUQ19TUkdCXzZ4NSxcbiAgQVNUQ19TUkdCXzZ4NixcbiAgQVNUQ19TUkdCXzh4NSxcbiAgQVNUQ19TUkdCXzh4NixcbiAgQVNUQ19TUkdCXzh4OCxcbiAgQVNUQ19TUkdCXzEweDUsXG4gIEFTVENfU1JHQl8xMHg2LFxuICBBU1RDX1NSR0JfMTB4OCxcbiAgQVNUQ19TUkdCXzEweDEwLFxuICBBU1RDX1NSR0JfMTJ4MTAsXG4gIEFTVENfU1JHQl8xMngxMixcbiAgUzNUQ19SR0JfRFhUMSxcbiAgUzNUQ19SR0JBX0RYVDEsXG4gIFMzVENfUkdCQV9EWFQzLFxuICBTM1RDX1JHQkFfRFhUNSxcbiAgQlBUQ19SR0JBLFxuICBQVlJUQ19SR0JBXzRCUFBWMSxcbiAgUFZSVENfUkdCXzRCUFBWMSxcbiAgRVRDMl9SR0JBOF9FQUMsXG4gIEVUQzJfUkdCOCxcbiAgRVRDMV9SR0IsXG4gIFJHQkE4X0VYVCxcbl07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIENvbXByZXNzaW9uVGV4dHVyZVR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgQ29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBBU1RDX1JHQkFfNHg0LFxuICBBU1RDX1JHQkFfNXg0LFxuICBBU1RDX1JHQkFfNXg1LFxuICBBU1RDX1JHQkFfNng1LFxuICBBU1RDX1JHQkFfNng2LFxuICBBU1RDX1JHQkFfOHg1LFxuICBBU1RDX1JHQkFfOHg2LFxuICBBU1RDX1JHQkFfOHg4LFxuICBBU1RDX1JHQkFfMTB4NSxcbiAgQVNUQ19SR0JBXzEweDYsXG4gIEFTVENfUkdCQV8xMHg4LFxuICBBU1RDX1JHQkFfMTB4MTAsXG4gIEFTVENfUkdCQV8xMngxMCxcbiAgQVNUQ19SR0JBXzEyeDEyLFxuICBBU1RDX1NSR0JfNHg0LFxuICBBU1RDX1NSR0JfNXg0LFxuICBBU1RDX1NSR0JfNXg1LFxuICBBU1RDX1NSR0JfNng1LFxuICBBU1RDX1NSR0JfNng2LFxuICBBU1RDX1NSR0JfOHg1LFxuICBBU1RDX1NSR0JfOHg2LFxuICBBU1RDX1NSR0JfOHg4LFxuICBBU1RDX1NSR0JfMTB4NSxcbiAgQVNUQ19TUkdCXzEweDYsXG4gIEFTVENfU1JHQl8xMHg4LFxuICBBU1RDX1NSR0JfMTB4MTAsXG4gIEFTVENfU1JHQl8xMngxMCxcbiAgQVNUQ19TUkdCXzEyeDEyLFxuICBTM1RDX1JHQl9EWFQxLFxuICBTM1RDX1JHQkFfRFhUMSxcbiAgUzNUQ19SR0JBX0RYVDMsXG4gIFMzVENfUkdCQV9EWFQ1LFxuICBCUFRDX1JHQkEsXG4gIFBWUlRDX1JHQkFfNEJQUFYxLFxuICBQVlJUQ19SR0JfNEJQUFYxLFxuICBFVEMyX1JHQkE4X0VBQyxcbiAgRVRDMl9SR0I4LFxuICBFVEMxX1JHQixcbiAgUkdCQThfRVhULFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgdHlwZSBGaWxlVHlwZUVudW0gPSBFbnVtSU87XG5cbmNsYXNzIEZpbGVUeXBlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBGaWxlVHlwZUVudW0ge1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYnJhbmQ6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZGV4LFxuICAgIHN0cixcbiAgICBleHQsXG4gICAgYnJhbmQsXG4gIH06IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHN0cjogc3RyaW5nO1xuICAgIGV4dDogc3RyaW5nO1xuICAgIGJyYW5kOiBzdHJpbmc7XG4gIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gICAgdGhpcy5leHRlbnNpb24gPSBleHQ7XG4gICAgdGhpcy5icmFuZCA9IGJyYW5kO1xuICB9XG59XG5cbmNvbnN0IFVua25vd246IEZpbGVUeXBlRW51bSA9IG5ldyBGaWxlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IC0xLFxuICBzdHI6ICd1bmtub3duJyxcbiAgZXh0OiAndW5rbm93bicsXG4gIGJyYW5kOiAnVW5Lbm93bicsXG59KTtcbmNvbnN0IEdsdGY6IEZpbGVUeXBlRW51bSA9IG5ldyBGaWxlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ2dsdGYnLFxuICBleHQ6ICdnbHRmJyxcbiAgYnJhbmQ6ICdnbFRGJyxcbn0pO1xuY29uc3QgR2x0ZkJpbmFyeTogRmlsZVR5cGVFbnVtID0gbmV3IEZpbGVUeXBlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnZ2xiJyxcbiAgZXh0OiAnZ2xiJyxcbiAgYnJhbmQ6ICdnbFRGJyxcbn0pO1xuY29uc3QgVlJNOiBGaWxlVHlwZUVudW0gPSBuZXcgRmlsZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAyLFxuICBzdHI6ICd2cm0nLFxuICBleHQ6ICd2cm0nLFxuICBicmFuZDogJ1ZSTScsXG59KTtcbmNvbnN0IERyYWNvOiBGaWxlVHlwZUVudW0gPSBuZXcgRmlsZVR5cGVDbGFzcyh7XG4gIGluZGV4OiAzLFxuICBzdHI6ICdkcmMnLFxuICBleHQ6ICdkcmMnLFxuICBicmFuZDogJ0RyYWNvJyxcbn0pO1xuY29uc3QgRWZmZWtzZWVyRWZmZWN0OiBGaWxlVHlwZUVudW0gPSBuZXcgRmlsZVR5cGVDbGFzcyh7XG4gIGluZGV4OiA0LFxuICBzdHI6ICdlZmsnLFxuICBleHQ6ICdlZmsnLFxuICBicmFuZDogJ0VmZmVrc2VlckVmZmVjdCcsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbVW5rbm93biwgR2x0ZiwgR2x0ZkJpbmFyeSwgVlJNLCBEcmFjbywgRWZmZWtzZWVyRWZmZWN0XTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogRmlsZVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIEZpbGVUeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IEZpbGVUeXBlRW51bSB7XG4gIGNvbnN0IGZpbGV0eXBlID0gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIEZpbGVUeXBlRW51bTtcbiAgaWYgKGZpbGV0eXBlICE9IG51bGwpIHtcbiAgICByZXR1cm4gZmlsZXR5cGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFVua25vd247XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNHbHRmT3JHbGIoZmlsZTogRmlsZVR5cGVFbnVtKSB7XG4gIGlmIChmaWxlID09PSBHbHRmIHx8IGZpbGUgPT09IEdsdGZCaW5hcnkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpbGVUeXBlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVua25vd24sXG4gIEdsdGYsXG4gIEdsdGZCaW5hcnksXG4gIFZSTSxcbiAgRHJhY28sXG4gIEVmZmVrc2VlckVmZmVjdCxcbiAgZnJvbSxcbiAgZnJvbVN0cmluZyxcbiAgaXNHbHRmT3JHbGIsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIEhkcmlGb3JtYXRFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBIZHJpRm9ybWF0Q2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBIZHJpRm9ybWF0RW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgTERSX1NSR0I6IEhkcmlGb3JtYXRFbnVtID0gbmV3IEhkcmlGb3JtYXRDbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICcubGRyX3NyZ2InLFxufSk7XG5jb25zdCBMRFJfTElORUFSOiBIZHJpRm9ybWF0RW51bSA9IG5ldyBIZHJpRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnLmxkcl9saW5lYXInLFxufSk7XG5jb25zdCBIRFJfTElORUFSOiBIZHJpRm9ybWF0RW51bSA9IG5ldyBIZHJpRm9ybWF0Q2xhc3MoeyBpbmRleDogMiwgc3RyOiAnLmhkcicgfSk7XG5jb25zdCBSR0JFX1BORzogSGRyaUZvcm1hdEVudW0gPSBuZXcgSGRyaUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDMsXG4gIHN0cjogJy5yZ2JlLnBuZycsXG59KTtcbmNvbnN0IFJHQjlfRTVfUE5HOiBIZHJpRm9ybWF0RW51bSA9IG5ldyBIZHJpRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogNCxcbiAgc3RyOiAnLnJnYjlfZTUucG5nJyxcbn0pO1xuY29uc3QgT3BlbkVYUjogSGRyaUZvcm1hdEVudW0gPSBuZXcgSGRyaUZvcm1hdENsYXNzKHsgaW5kZXg6IDUsIHN0cjogJy5leHInIH0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtMRFJfU1JHQiwgTERSX0xJTkVBUiwgSERSX0xJTkVBUiwgUkdCRV9QTkcsIFJHQjlfRTVfUE5HLCBPcGVuRVhSXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogSGRyaUZvcm1hdEVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgSGRyaUZvcm1hdEVudW07XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBIZHJpRm9ybWF0RW51bSB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgSGRyaUZvcm1hdEVudW07XG59XG5cbmV4cG9ydCBjb25zdCBIZHJpRm9ybWF0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIExEUl9TUkdCLFxuICBMRFJfTElORUFSLFxuICBIRFJfTElORUFSLFxuICBSR0JFX1BORyxcbiAgUkdCOV9FNV9QTkcsXG4gIE9wZW5FWFIsXG4gIGZyb20sXG4gIGZyb21TdHJpbmcsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIExpZ2h0VHlwZUVudW0gPSBFbnVtSU87XG5cbmNsYXNzIExpZ2h0VHlwZUNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgTGlnaHRUeXBlRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgRGlyZWN0aW9uYWw6IExpZ2h0VHlwZUVudW0gPSBuZXcgTGlnaHRUeXBlQ2xhc3Moe1xuICBpbmRleDogMCxcbiAgc3RyOiAnRGlyZWN0aW9uYWwnLFxufSk7XG5jb25zdCBQb2ludDogTGlnaHRUeXBlRW51bSA9IG5ldyBMaWdodFR5cGVDbGFzcyh7IGluZGV4OiAxLCBzdHI6ICdQb2ludCcgfSk7XG5jb25zdCBTcG90OiBMaWdodFR5cGVFbnVtID0gbmV3IExpZ2h0VHlwZUNsYXNzKHsgaW5kZXg6IDIsIHN0cjogJ1Nwb3QnIH0pO1xuY29uc3QgQW1iaWVudDogTGlnaHRUeXBlRW51bSA9IG5ldyBMaWdodFR5cGVDbGFzcyh7IGluZGV4OiAzLCBzdHI6ICdBbWJpZW50JyB9KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbUG9pbnQsIERpcmVjdGlvbmFsLCBTcG90LCBBbWJpZW50XTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogTGlnaHRUeXBlRW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBMaWdodFR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogTGlnaHRUeXBlRW51bSB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgTGlnaHRUeXBlRW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IExpZ2h0VHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBQb2ludCxcbiAgRGlyZWN0aW9uYWwsXG4gIFNwb3QsXG4gIEFtYmllbnQsXG4gIGZyb20sXG4gIGZyb21TdHJpbmcsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIFBoeXNpY3NTaGFwZVR5cGVFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBQaHlzaWNzU2hhcGVUeXBlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBQaHlzaWNzU2hhcGVUeXBlRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgU3BoZXJlOiBQaHlzaWNzU2hhcGVUeXBlRW51bSA9IG5ldyBQaHlzaWNzU2hhcGVUeXBlQ2xhc3Moe1xuICBpbmRleDogMCxcbiAgc3RyOiAnU3BoZXJlJyxcbn0pO1xuY29uc3QgQm94OiBQaHlzaWNzU2hhcGVUeXBlRW51bSA9IG5ldyBQaHlzaWNzU2hhcGVUeXBlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnQm94Jyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtTcGhlcmUsIEJveF07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IFBoeXNpY3NTaGFwZVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIFBoeXNpY3NTaGFwZVR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogUGh5c2ljc1NoYXBlVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIFBoeXNpY3NTaGFwZVR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgUGh5c2ljc1NoYXBlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFNwaGVyZSxcbiAgQm94LFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxufSk7XG4iLCJpbXBvcnQgeyBHTF9SRywgR0xfUkdCIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgdHlwZSBQaXhlbEZvcm1hdEVudW0gPSBFbnVtSU87XG5cbmNsYXNzIFBpeGVsRm9ybWF0Q2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBQaXhlbEZvcm1hdEVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG59XG5cbmNvbnN0IERlcHRoQ29tcG9uZW50OiBQaXhlbEZvcm1hdEVudW0gPSBuZXcgUGl4ZWxGb3JtYXRDbGFzcyh7XG4gIGluZGV4OiAweDE5MDIsXG4gIHN0cjogJ0RFUFRIX0NPTVBPTkVOVCcsXG59KTtcbmNvbnN0IERlcHRoU3RlbmNpbDogUGl4ZWxGb3JtYXRFbnVtID0gbmV3IFBpeGVsRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHg4NGY5LFxuICBzdHI6ICdERVBUSF9TVEVOQ0lMJyxcbn0pO1xuY29uc3QgQWxwaGE6IFBpeGVsRm9ybWF0RW51bSA9IG5ldyBQaXhlbEZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4MTkwNixcbiAgc3RyOiAnQUxQSEEnLFxufSk7XG5jb25zdCBSRzogUGl4ZWxGb3JtYXRFbnVtID0gbmV3IFBpeGVsRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogR0xfUkcsXG4gIHN0cjogJ1JHJyxcbn0pO1xuY29uc3QgUkdCOiBQaXhlbEZvcm1hdEVudW0gPSBuZXcgUGl4ZWxGb3JtYXRDbGFzcyh7XG4gIGluZGV4OiAweDE5MDcsXG4gIHN0cjogJ1JHQicsXG59KTtcbmNvbnN0IFJHQkE6IFBpeGVsRm9ybWF0RW51bSA9IG5ldyBQaXhlbEZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4MTkwOCxcbiAgc3RyOiAnUkdCQScsXG59KTtcbmNvbnN0IEx1bWluYW5jZTogUGl4ZWxGb3JtYXRFbnVtID0gbmV3IFBpeGVsRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHgxOTA5LFxuICBzdHI6ICdMVU1JTkFOQ0UnLFxufSk7XG5jb25zdCBMdW1pbmFuY2VBbHBoYTogUGl4ZWxGb3JtYXRFbnVtID0gbmV3IFBpeGVsRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHgxOTBhLFxuICBzdHI6ICdMVU1JTkFOQ0VfQUxQSEEnLFxufSk7XG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uTnVtRnJvbVBpeGVsRm9ybWF0KHBpeGVsRm9ybWF0OiBQaXhlbEZvcm1hdEVudW0pOiBudW1iZXIge1xuICBzd2l0Y2ggKHBpeGVsRm9ybWF0KSB7XG4gICAgY2FzZSBEZXB0aENvbXBvbmVudDpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgRGVwdGhTdGVuY2lsOlxuICAgICAgcmV0dXJuIDI7XG4gICAgY2FzZSBBbHBoYTpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgUkc6XG4gICAgICByZXR1cm4gMjtcbiAgICBjYXNlIFJHQjpcbiAgICAgIHJldHVybiAzO1xuICAgIGNhc2UgUkdCQTpcbiAgICAgIHJldHVybiA0O1xuICAgIGNhc2UgTHVtaW5hbmNlOlxuICAgICAgcmV0dXJuIDE7XG4gICAgY2FzZSBMdW1pbmFuY2VBbHBoYTpcbiAgICAgIHJldHVybiAyO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBzdXBwb3J0ZWQgJHtwaXhlbEZvcm1hdH1gKTtcbiAgfVxufVxuXG5jb25zdCB0eXBlTGlzdCA9IFtEZXB0aENvbXBvbmVudCwgRGVwdGhTdGVuY2lsLCBBbHBoYSwgUkcsIFJHQiwgUkdCQSwgTHVtaW5hbmNlLCBMdW1pbmFuY2VBbHBoYV07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IFBpeGVsRm9ybWF0RW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBQaXhlbEZvcm1hdEVudW07XG59XG5cbmV4cG9ydCBjb25zdCBQaXhlbEZvcm1hdCA9IE9iamVjdC5mcmVlemUoe1xuICBEZXB0aENvbXBvbmVudCxcbiAgRGVwdGhTdGVuY2lsLFxuICBBbHBoYSxcbiAgUkcsXG4gIFJHQixcbiAgUkdCQSxcbiAgTHVtaW5hbmNlLFxuICBMdW1pbmFuY2VBbHBoYSxcbiAgZnJvbSxcbiAgZ2V0Q29tcG9zaXRpb25OdW1Gcm9tUGl4ZWxGb3JtYXQsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IGludGVyZmFjZSBQcmltaXRpdmVNb2RlRW51bSBleHRlbmRzIEVudW1JTyB7XG4gIGdldFdlYkdQVVR5cGVTdHIoKTogc3RyaW5nO1xufVxuXG5jbGFzcyBQcmltaXRpdmVNb2RlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBQcmltaXRpdmVNb2RlRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cblxuICBnZXRXZWJHUFVUeXBlU3RyKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmluZGV4KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiAncG9pbnQtbGlzdCc7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiAnbGluZS1saXN0JztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgU3VwcG9ydGVkIGluIFdlYkdQVScpO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gJ2xpbmUtc3RyaXAnO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gJ3RyaWFuZ2xlLWxpc3QnO1xuICAgICAgY2FzZSA1OlxuICAgICAgICByZXR1cm4gJ3RyaWFuZ2xlLXN0cmlwJztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgU3VwcG9ydGVkIGluIFdlYkdQVScpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgU3VwcG9ydGVkIGluIFdlYkdQVScpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBVbmtub3duOiBQcmltaXRpdmVNb2RlRW51bSA9IG5ldyBQcmltaXRpdmVNb2RlQ2xhc3Moe1xuICBpbmRleDogLTEsXG4gIHN0cjogJ1VOS05PV04nLFxufSk7XG5jb25zdCBQb2ludHM6IFByaW1pdGl2ZU1vZGVFbnVtID0gbmV3IFByaW1pdGl2ZU1vZGVDbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICdQT0lOVFMnLFxufSk7XG5jb25zdCBMaW5lczogUHJpbWl0aXZlTW9kZUVudW0gPSBuZXcgUHJpbWl0aXZlTW9kZUNsYXNzKHtcbiAgaW5kZXg6IDEsXG4gIHN0cjogJ0xJTkVTJyxcbn0pO1xuY29uc3QgTGluZUxvb3A6IFByaW1pdGl2ZU1vZGVFbnVtID0gbmV3IFByaW1pdGl2ZU1vZGVDbGFzcyh7XG4gIGluZGV4OiAyLFxuICBzdHI6ICdMSU5FX0xPT1AnLFxufSk7XG5jb25zdCBMaW5lU3RyaXA6IFByaW1pdGl2ZU1vZGVFbnVtID0gbmV3IFByaW1pdGl2ZU1vZGVDbGFzcyh7XG4gIGluZGV4OiAzLFxuICBzdHI6ICdMSU5FX1NUUklQJyxcbn0pO1xuY29uc3QgVHJpYW5nbGVzOiBQcmltaXRpdmVNb2RlRW51bSA9IG5ldyBQcmltaXRpdmVNb2RlQ2xhc3Moe1xuICBpbmRleDogNCxcbiAgc3RyOiAnVFJJQU5HTEVTJyxcbn0pO1xuY29uc3QgVHJpYW5nbGVTdHJpcDogUHJpbWl0aXZlTW9kZUVudW0gPSBuZXcgUHJpbWl0aXZlTW9kZUNsYXNzKHtcbiAgaW5kZXg6IDUsXG4gIHN0cjogJ1RSSUFOR0xFX1NUUklQJyxcbn0pO1xuY29uc3QgVHJpYW5nbGVGYW46IFByaW1pdGl2ZU1vZGVFbnVtID0gbmV3IFByaW1pdGl2ZU1vZGVDbGFzcyh7XG4gIGluZGV4OiA2LFxuICBzdHI6ICdUUklBTkdMRV9GQU4nLFxufSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW1xuICBVbmtub3duLFxuICBQb2ludHMsXG4gIExpbmVzLFxuICBMaW5lTG9vcCxcbiAgTGluZVN0cmlwLFxuICBUcmlhbmdsZXMsXG4gIFRyaWFuZ2xlU3RyaXAsXG4gIFRyaWFuZ2xlRmFuLFxuXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogUHJpbWl0aXZlTW9kZUVudW0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgUHJpbWl0aXZlTW9kZUVudW0gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBQcmltaXRpdmVNb2RlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVua25vd24sXG4gIFBvaW50cyxcbiAgTGluZXMsXG4gIExpbmVMb29wLFxuICBMaW5lU3RyaXAsXG4gIFRyaWFuZ2xlcyxcbiAgVHJpYW5nbGVTdHJpcCxcbiAgVHJpYW5nbGVGYW4sXG4gIGZyb20sXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NBcHByb2FjaENsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgRW51bUlPIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxuXG4gIGdldCB3ZWJHTFZlcnNpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzKSB7XG4gICAgICBjYXNlIFVuaWZvcm06XG4gICAgICBjYXNlIERhdGFUZXh0dXJlOlxuICAgICAgICByZXR1cm4gMjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBQcm9jZXNzQXBwcm9hY2hFbnVtID0gUHJvY2Vzc0FwcHJvYWNoQ2xhc3M7XG5cbmNvbnN0IE5vbmU6IFByb2Nlc3NBcHByb2FjaEVudW0gPSBuZXcgUHJvY2Vzc0FwcHJvYWNoQ2xhc3Moe1xuICBpbmRleDogMCxcbiAgc3RyOiAnTk9ORScsXG59KTtcbmNvbnN0IFVuaWZvcm06IFByb2Nlc3NBcHByb2FjaEVudW0gPSBuZXcgUHJvY2Vzc0FwcHJvYWNoQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnVU5JRk9STScsXG59KTtcbmNvbnN0IERhdGFUZXh0dXJlOiBQcm9jZXNzQXBwcm9hY2hFbnVtID0gbmV3IFByb2Nlc3NBcHByb2FjaENsYXNzKHtcbiAgaW5kZXg6IDIsXG4gIHN0cjogJ0RhdGFUZXh0dXJlJyxcbn0pO1xuY29uc3QgV2ViR1BVOiBQcm9jZXNzQXBwcm9hY2hFbnVtID0gbmV3IFByb2Nlc3NBcHByb2FjaENsYXNzKHtcbiAgaW5kZXg6IDMsXG4gIHN0cjogJ1dlYkdQVScsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbTm9uZSwgVW5pZm9ybSwgRGF0YVRleHR1cmVdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBQcm9jZXNzQXBwcm9hY2hFbnVtIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIFByb2Nlc3NBcHByb2FjaEVudW07XG59XG5cbmNvbnN0IGlzRGF0YVRleHR1cmVBcHByb2FjaCA9IChwcm9jZXNzQXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW0pID0+IHtcbiAgc3dpdGNoIChwcm9jZXNzQXBwcm9hY2gpIHtcbiAgICBjYXNlIERhdGFUZXh0dXJlOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgaXNVbmlmb3JtQXBwcm9hY2ggPSAocHJvY2Vzc0FwcHJvYWNoOiBQcm9jZXNzQXBwcm9hY2hFbnVtKSA9PiB7XG4gIHN3aXRjaCAocHJvY2Vzc0FwcHJvYWNoKSB7XG4gICAgY2FzZSBVbmlmb3JtOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgaXNXZWJHcHVBcHByb2FjaCA9IChwcm9jZXNzQXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW0pID0+IHtcbiAgc3dpdGNoIChwcm9jZXNzQXBwcm9hY2gpIHtcbiAgICBjYXNlIFdlYkdQVTpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IGlzV2ViR0wyQXBwcm9hY2ggPSAocHJvY2Vzc0FwcHJvYWNoOiBQcm9jZXNzQXBwcm9hY2hFbnVtKSA9PiB7XG4gIHN3aXRjaCAocHJvY2Vzc0FwcHJvYWNoKSB7XG4gICAgY2FzZSBVbmlmb3JtOlxuICAgIGNhc2UgRGF0YVRleHR1cmU6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgUHJvY2Vzc0FwcHJvYWNoID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGlzRGF0YVRleHR1cmVBcHByb2FjaCxcbiAgaXNVbmlmb3JtQXBwcm9hY2gsXG4gIGlzV2ViR3B1QXBwcm9hY2gsXG4gIE5vbmUsXG4gIFVuaWZvcm0sXG4gIERhdGFUZXh0dXJlLFxuICBXZWJHUFUsXG4gIGlzV2ViR0wyQXBwcm9hY2gsXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzU3RhZ2VFbnVtIGV4dGVuZHMgRW51bUlPIHtcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xufVxuXG5jbGFzcyBQcm9jZXNzU3RhZ2VDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIFByb2Nlc3NTdGFnZUVudW0ge1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyLCBtZXRob2ROYW1lIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmc7IG1ldGhvZE5hbWU6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuXG4gICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTtcbiAgfVxufVxuXG5jb25zdCBVbmtub3duOiBQcm9jZXNzU3RhZ2VFbnVtID0gbmV3IFByb2Nlc3NTdGFnZUNsYXNzKHtcbiAgaW5kZXg6IC0xLFxuICBzdHI6ICdVTktOT1dOJyxcbiAgbWV0aG9kTmFtZTogJyR1bmtub3duJyxcbn0pO1xuY29uc3QgQ3JlYXRlOiBQcm9jZXNzU3RhZ2VFbnVtID0gbmV3IFByb2Nlc3NTdGFnZUNsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ0NSRUFURScsXG4gIG1ldGhvZE5hbWU6ICckY3JlYXRlJyxcbn0pO1xuY29uc3QgTG9hZDogUHJvY2Vzc1N0YWdlRW51bSA9IG5ldyBQcm9jZXNzU3RhZ2VDbGFzcyh7XG4gIGluZGV4OiAxLFxuICBzdHI6ICdMT0FEJyxcbiAgbWV0aG9kTmFtZTogJyRsb2FkJyxcbn0pO1xuY29uc3QgTW91bnQ6IFByb2Nlc3NTdGFnZUVudW0gPSBuZXcgUHJvY2Vzc1N0YWdlQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnTU9VTlQnLFxuICBtZXRob2ROYW1lOiAnJG1vdW50Jyxcbn0pO1xuY29uc3QgTG9naWM6IFByb2Nlc3NTdGFnZUVudW0gPSBuZXcgUHJvY2Vzc1N0YWdlQ2xhc3Moe1xuICBpbmRleDogMyxcbiAgc3RyOiAnTE9HSUMnLFxuICBtZXRob2ROYW1lOiAnJGxvZ2ljJyxcbn0pO1xuY29uc3QgUHJlUmVuZGVyOiBQcm9jZXNzU3RhZ2VFbnVtID0gbmV3IFByb2Nlc3NTdGFnZUNsYXNzKHtcbiAgaW5kZXg6IDQsXG4gIHN0cjogJ1BSRV9SRU5ERVInLFxuICBtZXRob2ROYW1lOiAnJHByZXJlbmRlcicsXG59KTtcbmNvbnN0IFJlbmRlcjogUHJvY2Vzc1N0YWdlRW51bSA9IG5ldyBQcm9jZXNzU3RhZ2VDbGFzcyh7XG4gIGluZGV4OiA1LFxuICBzdHI6ICdSRU5ERVInLFxuICBtZXRob2ROYW1lOiAnJHJlbmRlcicsXG59KTtcbmNvbnN0IFVubW91bnQ6IFByb2Nlc3NTdGFnZUVudW0gPSBuZXcgUHJvY2Vzc1N0YWdlQ2xhc3Moe1xuICBpbmRleDogNixcbiAgc3RyOiAnVU5NT1VOVCcsXG4gIG1ldGhvZE5hbWU6ICckdW5tb3VudCcsXG59KTtcbmNvbnN0IERpc2NhcmQ6IFByb2Nlc3NTdGFnZUVudW0gPSBuZXcgUHJvY2Vzc1N0YWdlQ2xhc3Moe1xuICBpbmRleDogNyxcbiAgc3RyOiAnRElTQ0FSRCcsXG4gIG1ldGhvZE5hbWU6ICckZGlzY2FyZCcsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbVW5rbm93biwgQ3JlYXRlLCBMb2FkLCBNb3VudCwgTG9naWMsIFByZVJlbmRlciwgUmVuZGVyLCBVbm1vdW50LCBEaXNjYXJkXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogUHJvY2Vzc1N0YWdlRW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBQcm9jZXNzU3RhZ2VFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgUHJvY2Vzc1N0YWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVua25vd24sXG4gIENyZWF0ZSxcbiAgTG9hZCxcbiAgTW91bnQsXG4gIExvZ2ljLFxuICBQcmVSZW5kZXIsXG4gIFJlbmRlcixcbiAgVW5tb3VudCxcbiAgRGlzY2FyZCxcbiAgZnJvbSxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckJ1ZmZlclRhcmdldEVudW0gZXh0ZW5kcyBFbnVtSU8ge1xuICB3ZWJHTENvbnN0YW50VmFsdWUoKTogbnVtYmVyO1xufVxuXG5jbGFzcyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIFJlbmRlckJ1ZmZlclRhcmdldEVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG5cbiAgd2ViR0xDb25zdGFudFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmluZGV4ID09PSAtMikge1xuICAgICAgcmV0dXJuIDB4MDsgLy8gZ2wuTk9ORVxuICAgIH0gZWxzZSBpZiAodGhpcy5pbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAweDA0MDU7IC8vIGdsLkJBQ0tcbiAgICB9XG4gICAgcmV0dXJuIDB4OGNlMCArIHRoaXMuaW5kZXg7IC8vIEdMX0NPTE9SX0FUVEFDSE1FTlQwID0gMHg4Y2UwXG4gIH1cbn1cblxuY29uc3QgTm9uZTogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bSA9IG5ldyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyh7XG4gIGluZGV4OiAtMixcbiAgc3RyOiAnTk9ORScsXG59KTtcbmNvbnN0IEJhY2s6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gPSBuZXcgUmVuZGVyQnVmZmVyVGFyZ2V0Q2xhc3Moe1xuICBpbmRleDogLTEsXG4gIHN0cjogJ0JBQ0snLFxufSk7XG5jb25zdCBDb2xvckF0dGFjaG1lbnQwOiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtID0gbmV3IFJlbmRlckJ1ZmZlclRhcmdldENsYXNzKHtcbiAgaW5kZXg6IDAsXG4gIHN0cjogJ0NPTE9SX0FUVEFDSE1FTlQwJyxcbn0pO1xuY29uc3QgQ29sb3JBdHRhY2htZW50MTogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bSA9IG5ldyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyh7XG4gIGluZGV4OiAxLFxuICBzdHI6ICdDT0xPUl9BVFRBQ0hNRU5UMScsXG59KTtcbmNvbnN0IENvbG9yQXR0YWNobWVudDI6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gPSBuZXcgUmVuZGVyQnVmZmVyVGFyZ2V0Q2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnQ09MT1JfQVRUQUNITUVOVDInLFxufSk7XG5jb25zdCBDb2xvckF0dGFjaG1lbnQzOiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtID0gbmV3IFJlbmRlckJ1ZmZlclRhcmdldENsYXNzKHtcbiAgaW5kZXg6IDMsXG4gIHN0cjogJ0NPTE9SX0FUVEFDSE1FTlQzJyxcbn0pO1xuY29uc3QgQ29sb3JBdHRhY2htZW50NDogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bSA9IG5ldyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyh7XG4gIGluZGV4OiA0LFxuICBzdHI6ICdDT0xPUl9BVFRBQ0hNRU5UNCcsXG59KTtcbmNvbnN0IENvbG9yQXR0YWNobWVudDU6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gPSBuZXcgUmVuZGVyQnVmZmVyVGFyZ2V0Q2xhc3Moe1xuICBpbmRleDogNSxcbiAgc3RyOiAnQ09MT1JfQVRUQUNITUVOVDUnLFxufSk7XG5jb25zdCBDb2xvckF0dGFjaG1lbnQ2OiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtID0gbmV3IFJlbmRlckJ1ZmZlclRhcmdldENsYXNzKHtcbiAgaW5kZXg6IDYsXG4gIHN0cjogJ0NPTE9SX0FUVEFDSE1FTlQ2Jyxcbn0pO1xuY29uc3QgQ29sb3JBdHRhY2htZW50NzogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bSA9IG5ldyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyh7XG4gIGluZGV4OiA3LFxuICBzdHI6ICdDT0xPUl9BVFRBQ0hNRU5UNycsXG59KTtcbmNvbnN0IENvbG9yQXR0YWNobWVudDg6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gPSBuZXcgUmVuZGVyQnVmZmVyVGFyZ2V0Q2xhc3Moe1xuICBpbmRleDogOCxcbiAgc3RyOiAnQ09MT1JfQVRUQUNITUVOVDgnLFxufSk7XG5jb25zdCBDb2xvckF0dGFjaG1lbnQ5OiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtID0gbmV3IFJlbmRlckJ1ZmZlclRhcmdldENsYXNzKHtcbiAgaW5kZXg6IDksXG4gIHN0cjogJ0NPTE9SX0FUVEFDSE1FTlQ5Jyxcbn0pO1xuY29uc3QgQ29sb3JBdHRhY2htZW50MTA6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gPSBuZXcgUmVuZGVyQnVmZmVyVGFyZ2V0Q2xhc3Moe1xuICBpbmRleDogMTAsXG4gIHN0cjogJ0NPTE9SX0FUVEFDSE1FTlQxMCcsXG59KTtcbmNvbnN0IENvbG9yQXR0YWNobWVudDExOiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtID0gbmV3IFJlbmRlckJ1ZmZlclRhcmdldENsYXNzKHtcbiAgaW5kZXg6IDExLFxuICBzdHI6ICdDT0xPUl9BVFRBQ0hNRU5UMTEnLFxufSk7XG5jb25zdCBDb2xvckF0dGFjaG1lbnQxMjogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bSA9IG5ldyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyh7XG4gIGluZGV4OiAxMixcbiAgc3RyOiAnQ09MT1JfQVRUQUNITUVOVDEyJyxcbn0pO1xuY29uc3QgQ29sb3JBdHRhY2htZW50MTM6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gPSBuZXcgUmVuZGVyQnVmZmVyVGFyZ2V0Q2xhc3Moe1xuICBpbmRleDogMTMsXG4gIHN0cjogJ0NPTE9SX0FUVEFDSE1FTlQxMycsXG59KTtcbmNvbnN0IENvbG9yQXR0YWNobWVudDE0OiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtID0gbmV3IFJlbmRlckJ1ZmZlclRhcmdldENsYXNzKHtcbiAgaW5kZXg6IDE0LFxuICBzdHI6ICdDT0xPUl9BVFRBQ0hNRU5UMTQnLFxufSk7XG5jb25zdCBDb2xvckF0dGFjaG1lbnQxNTogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bSA9IG5ldyBSZW5kZXJCdWZmZXJUYXJnZXRDbGFzcyh7XG4gIGluZGV4OiAxNSxcbiAgc3RyOiAnQ09MT1JfQVRUQUNITUVOVDE1Jyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtcbiAgTm9uZSxcbiAgQmFjayxcbiAgQ29sb3JBdHRhY2htZW50MCxcbiAgQ29sb3JBdHRhY2htZW50MSxcbiAgQ29sb3JBdHRhY2htZW50MixcbiAgQ29sb3JBdHRhY2htZW50MyxcbiAgQ29sb3JBdHRhY2htZW50NCxcbiAgQ29sb3JBdHRhY2htZW50NSxcbiAgQ29sb3JBdHRhY2htZW50NixcbiAgQ29sb3JBdHRhY2htZW50NyxcbiAgQ29sb3JBdHRhY2htZW50OCxcbiAgQ29sb3JBdHRhY2htZW50OSxcbiAgQ29sb3JBdHRhY2htZW50MTAsXG4gIENvbG9yQXR0YWNobWVudDExLFxuICBDb2xvckF0dGFjaG1lbnQxMixcbiAgQ29sb3JBdHRhY2htZW50MTMsXG4gIENvbG9yQXR0YWNobWVudDE0LFxuICBDb2xvckF0dGFjaG1lbnQxNSxcbl07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IFJlbmRlckJ1ZmZlclRhcmdldEVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgUmVuZGVyQnVmZmVyVGFyZ2V0RW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlbmRlckJ1ZmZlclRhcmdldCA9IE9iamVjdC5mcmVlemUoe1xuICBOb25lLFxuICBCYWNrLFxuICBDb2xvckF0dGFjaG1lbnQwLFxuICBDb2xvckF0dGFjaG1lbnQxLFxuICBDb2xvckF0dGFjaG1lbnQyLFxuICBDb2xvckF0dGFjaG1lbnQzLFxuICBDb2xvckF0dGFjaG1lbnQ0LFxuICBDb2xvckF0dGFjaG1lbnQ1LFxuICBDb2xvckF0dGFjaG1lbnQ2LFxuICBDb2xvckF0dGFjaG1lbnQ3LFxuICBDb2xvckF0dGFjaG1lbnQ4LFxuICBDb2xvckF0dGFjaG1lbnQ5LFxuICBDb2xvckF0dGFjaG1lbnQxMCxcbiAgQ29sb3JBdHRhY2htZW50MTEsXG4gIENvbG9yQXR0YWNobWVudDEyLFxuICBDb2xvckF0dGFjaG1lbnQxMyxcbiAgQ29sb3JBdHRhY2htZW50MTQsXG4gIENvbG9yQXR0YWNobWVudDE1LFxuICBmcm9tLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgdHlwZSBTaGFkZXJOb2RlRW51bSA9IEVudW1JTztcblxuY2xhc3MgU2hhZGVyTm9kZUNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgU2hhZGVyTm9kZUVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG59XG5cbmNvbnN0IENsYXNzaWNTaGFkaW5nOiBTaGFkZXJOb2RlRW51bSA9IG5ldyBTaGFkZXJOb2RlQ2xhc3Moe1xuICBpbmRleDogMCxcbiAgc3RyOiAnQ2xhc3NpY1NoYWRpbmcnLFxufSk7XG5jb25zdCBQQlJTaGFkaW5nOiBTaGFkZXJOb2RlRW51bSA9IG5ldyBTaGFkZXJOb2RlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnUEJSU2hhZGluZycsXG59KTtcbmNvbnN0IExlcnA6IFNoYWRlck5vZGVFbnVtID0gbmV3IFNoYWRlck5vZGVDbGFzcyh7IGluZGV4OiAyLCBzdHI6ICdMZXJwJyB9KTtcbmNvbnN0IEFkZDogU2hhZGVyTm9kZUVudW0gPSBuZXcgU2hhZGVyTm9kZUNsYXNzKHsgaW5kZXg6IDMsIHN0cjogJ0FkZCcgfSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW0NsYXNzaWNTaGFkaW5nLCBQQlJTaGFkaW5nXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogU2hhZGVyTm9kZUVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgU2hhZGVyTm9kZUVudW07XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBTaGFkZXJOb2RlRW51bSB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgU2hhZGVyTm9kZUVudW07XG59XG5cbmV4cG9ydCBjb25zdCBTaGFkZXJOb2RlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIENsYXNzaWNTaGFkaW5nLFxuICBQQlJTaGFkaW5nLFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxufSk7XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20sIF9mcm9tU3RyaW5nLCBfZnJvbVN0cmluZ0Nhc2VTZW5zaXRpdmVseSB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4vQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB0eXBlIHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBJbmRleCB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuL1NoYWRlclNlbWFudGljc0luZm8nO1xuXG5leHBvcnQgdHlwZSBTaGFkZXJTZW1hbnRpY3NJbmRleCA9IG51bWJlcjtcbmV4cG9ydCB0eXBlIFNoYWRlclNlbWFudGljc05hbWUgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhZGVyU2VtYW50aWNzRW51bSBleHRlbmRzIEVudW1JTyB7XG4gIHN0cjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2hhZGVyU2VtYW50aWNzQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBTaGFkZXJTZW1hbnRpY3NFbnVtIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pbmRleENvdW50ID0gLTE7XG4gIHN0YXRpYyByZWFkb25seSBfc2NhbGUgPSAxMDAwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX19jbGFzc2VzOiBTaGFkZXJTZW1hbnRpY3NDbGFzc1tdID0gW107XG4gIGNvbnN0cnVjdG9yKHsgc3RyIH06IHsgaW5kZXg/OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7XG4gICAgICBpbmRleDogKytTaGFkZXJTZW1hbnRpY3NDbGFzcy5fX2luZGV4Q291bnQgKiBTaGFkZXJTZW1hbnRpY3NDbGFzcy5fc2NhbGUsXG4gICAgICBzdHIsXG4gICAgICBub0NoZWNrU3RyVW5pcXVlOiB0cnVlLFxuICAgIH0pO1xuICAgIFNoYWRlclNlbWFudGljc0NsYXNzLl9fY2xhc3Nlc1t0aGlzLmluZGV4XSA9IHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0U2hhZGVyU2VtYW50aWNCeUluZGV4KGluZGV4OiBTaGFkZXJTZW1hbnRpY3NJbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9fY2xhc3Nlc1tNYXRoLmFicyhpbmRleCkgLSAoTWF0aC5hYnMoaW5kZXgpICUgdGhpcy5fc2NhbGUpXTtcbiAgfVxuXG4gIHN0YXRpYyBpc05vbkFycmF5U2hhZGVyU2VtYW50aWNJbmRleChpbmRleDogU2hhZGVyU2VtYW50aWNzSW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5fc2NhbGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzQXJyYXlBbmRaZXJvSW5kZXhTaGFkZXJTZW1hbnRpY0luZGV4KGluZGV4OiBTaGFkZXJTZW1hbnRpY3NJbmRleCkge1xuICAgIGlmIChpbmRleCA8IDAgJiYgTWF0aC5hYnMoaW5kZXgpICUgU2hhZGVyU2VtYW50aWNzQ2xhc3MuX3NjYWxlID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpc0FycmF5QW5kTm9uWmVyb0luZGV4U2hhZGVyU2VtYW50aWNJbmRleChpbmRleDogU2hhZGVyU2VtYW50aWNzSW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCAwICYmIE1hdGguYWJzKGluZGV4KSAlIFNoYWRlclNlbWFudGljc0NsYXNzLl9zY2FsZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldEluZGV4Q291bnQoKSB7XG4gICAgcmV0dXJuIFNoYWRlclNlbWFudGljc0NsYXNzLl9faW5kZXhDb3VudDtcbiAgfVxufVxuXG5jb25zdCBXb3JsZE1hdHJpeDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3dvcmxkTWF0cml4Jyxcbn0pO1xuY29uc3QgVmlld01hdHJpeDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3ZpZXdNYXRyaXgnLFxufSk7XG5jb25zdCBJc0JpbGxib2FyZDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2lzQmlsbGJvYXJkJyxcbn0pO1xuY29uc3QgRW5hYmxlVmlld01hdHJpeDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2VuYWJsZVZpZXdNYXRyaXgnLFxufSk7XG5jb25zdCBQcm9qZWN0aW9uTWF0cml4OiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAncHJvamVjdGlvbk1hdHJpeCcsXG59KTtcbmNvbnN0IE5vcm1hbE1hdHJpeDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ25vcm1hbE1hdHJpeCcsXG59KTtcbmNvbnN0IEJvbmVNYXRyaXg6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdib25lTWF0cml4Jyxcbn0pO1xuY29uc3QgQmFzZUNvbG9yRmFjdG9yOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYmFzZUNvbG9yRmFjdG9yJyxcbn0pO1xuY29uc3QgQmFzZUNvbG9yVGV4dHVyZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2Jhc2VDb2xvclRleHR1cmUnLFxufSk7XG5jb25zdCBOb3JtYWxUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnbm9ybWFsVGV4dHVyZScsXG59KTtcbmNvbnN0IE1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ21ldGFsbGljUm91Z2huZXNzVGV4dHVyZScsXG59KTtcbmNvbnN0IE9jY2x1c2lvblRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdvY2NsdXNpb25UZXh0dXJlJyxcbn0pO1xuY29uc3QgRW1pc3NpdmVGYWN0b3I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdlbWlzc2l2ZUZhY3RvcicsXG59KTtcbmNvbnN0IEVtaXNzaXZlVGV4dHVyZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2VtaXNzaXZlVGV4dHVyZScsXG59KTtcbmNvbnN0IExpZ2h0TnVtYmVyOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnbGlnaHROdW1iZXInLFxufSk7XG5jb25zdCBMaWdodFBvc2l0aW9uOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnbGlnaHRQb3NpdGlvbicsXG59KTtcbmNvbnN0IExpZ2h0RGlyZWN0aW9uOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnbGlnaHREaXJlY3Rpb24nLFxufSk7XG5jb25zdCBMaWdodEludGVuc2l0eTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2xpZ2h0SW50ZW5zaXR5Jyxcbn0pO1xuY29uc3QgTGlnaHRQcm9wZXJ0eTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2xpZ2h0UHJvcGVydHknLFxufSk7XG5jb25zdCBNZXRhbGxpY1JvdWdobmVzc0ZhY3RvcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ21ldGFsbGljUm91Z2huZXNzRmFjdG9yJyxcbn0pO1xuY29uc3QgQnJkZkx1dFRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdicmRmTHV0VGV4dHVyZScsXG59KTtcbmNvbnN0IERpZmZ1c2VFbnZUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnZGlmZnVzZUVudlRleHR1cmUnLFxufSk7XG5jb25zdCBTcGVjdWxhckVudlRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzcGVjdWxhckVudlRleHR1cmUnLFxufSk7XG5jb25zdCBJbnZlcnNlRW52aXJvbm1lbnQ6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdpbnZlcnNlRW52aXJvbm1lbnQnLFxufSk7XG5jb25zdCBJQkxQYXJhbWV0ZXI6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdpYmxQYXJhbWV0ZXInLFxufSk7XG5jb25zdCBWaWV3UG9zaXRpb246IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICd2aWV3UG9zaXRpb24nLFxufSk7XG5jb25zdCBXaXJlZnJhbWU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICd3aXJlZnJhbWUnLFxufSk7XG5jb25zdCBEaWZmdXNlQ29sb3JGYWN0b3I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdkaWZmdXNlQ29sb3JGYWN0b3InLFxufSk7XG5jb25zdCBEaWZmdXNlQ29sb3JUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnZGlmZnVzZUNvbG9yVGV4dHVyZScsXG59KTtcbmNvbnN0IFNoaW5pbmVzczogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3NoaW5pbmVzcycsXG59KTtcbmNvbnN0IFNoYWRpbmdNb2RlbDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3NoYWRpbmdNb2RlbCcsXG59KTtcbmNvbnN0IFNraW5uaW5nTW9kZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3NraW5uaW5nTW9kZScsXG59KTtcbmNvbnN0IEdlbmVyYWxUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnZ2VuZXJhbFRleHR1cmUnLFxufSk7XG5jb25zdCBWZXJ0ZXhBdHRyaWJ1dGVzRXhpc3RlbmNlQXJyYXk6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICd2ZXJ0ZXhBdHRyaWJ1dGVzRXhpc3RlbmNlQXJyYXknLFxufSk7XG5jb25zdCBCb25lUXVhdGVybmlvbjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2JvbmVRdWF0ZXJuaW9uJyxcbn0pO1xuY29uc3QgQm9uZVRyYW5zbGF0ZVNjYWxlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYm9uZVRyYW5zbGF0ZVNjYWxlJyxcbn0pO1xuY29uc3QgQm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQ6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdib25lVHJhbnNsYXRlUGFja2VkUXVhdCcsXG59KTtcbmNvbnN0IEJvbmVTY2FsZVBhY2tlZFF1YXQ6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdib25lU2NhbGVQYWNrZWRRdWF0Jyxcbn0pO1xuY29uc3QgQm9uZUNvbXByZXNzZWRDaHVuazogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2JvbmVDb21wcmVzc2VkQ2h1bmsnLFxufSk7XG5jb25zdCBCb25lQ29tcHJlc3NlZEluZm86IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdib25lQ29tcHJlc3NlZEluZm8nLFxufSk7XG5jb25zdCBQb2ludFNpemU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdwb2ludFNpemUnLFxufSk7XG5jb25zdCBDb2xvckVudlRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdjb2xvckVudlRleHR1cmUnLFxufSk7XG5jb25zdCBQb2ludERpc3RhbmNlQXR0ZW51YXRpb246IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdwb2ludERpc3RhbmNlQXR0ZW51YXRpb24nLFxufSk7XG5jb25zdCBIRFJJRm9ybWF0OiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnaGRyaUZvcm1hdCcsXG59KTtcbmNvbnN0IFNjcmVlbkluZm86IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzY3JlZW5JbmZvJyxcbn0pO1xuY29uc3QgRGVwdGhUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnZGVwdGhUZXh0dXJlJyxcbn0pO1xuY29uc3QgTGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2xpZ2h0Vmlld1Byb2plY3Rpb25NYXRyaXgnLFxufSk7XG5jb25zdCBBbmlzb3Ryb3B5OiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYW5pc290cm9weScsXG59KTtcbmNvbnN0IENsZWFyQ29hdFBhcmFtZXRlcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2NsZWFyY29hdFBhcmFtZXRlcicsXG59KTtcbmNvbnN0IFNoZWVuQ29sb3JGYWN0b3I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzaGVlbkNvbG9yRmFjdG9yJyxcbn0pO1xuY29uc3QgU2hlZW5Db2xvclRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzaGVlbkNvbG9yVGV4dHVyZScsXG59KTtcbmNvbnN0IFNoZWVuUm91Z2huZXNzRmFjdG9yOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnc2hlZW5Sb3VnaG5lc3NGYWN0b3InLFxufSk7XG5jb25zdCBTaGVlblJvdWdobmVzc1RleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzaGVlblJvdWdobmVzc1RleHR1cmUnLFxufSk7XG5jb25zdCBTaGVlbkx1dFRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzaGVlbkx1dFRleHR1cmUnLFxufSk7XG5jb25zdCBTcGVjdWxhckdsb3NzaW5lc3NGYWN0b3I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdzcGVjdWxhckdsb3NzaW5lc3NGYWN0b3InLFxufSk7XG5jb25zdCBTcGVjdWxhckdsb3NzaW5lc3NUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnc3BlY3VsYXJHbG9zc2luZXNzVGV4dHVyZScsXG59KTtcbmNvbnN0IEVudGl0eVVJRDogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2VudGl0eVVJRCcsXG59KTtcbmNvbnN0IE1vcnBoVGFyZ2V0TnVtYmVyOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnbW9ycGhUYXJnZXROdW1iZXInLFxufSk7XG5cbi8vIHRoZSAxNmJ5dGVvZmZzZXQgKDE2Ynl0ZSB1bml0IG9mZnNldCkgb2YgTW9ycGhEYXRhIGluIERhdGFUZXh0dXJlXG5jb25zdCBEYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb246IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdkYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb24nLFxufSk7XG5cbmNvbnN0IE1vcnBoV2VpZ2h0czogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ21vcnBoV2VpZ2h0cycsXG59KTtcbmNvbnN0IEN1cnJlbnRDb21wb25lbnRTSURzOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnY3VycmVudENvbXBvbmVudFNJRHMnLFxufSk7XG5jb25zdCBBbHBoYUN1dG9mZjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2FscGhhQ3V0b2ZmJyxcbn0pO1xuY29uc3QgQWxwaGFUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYWxwaGFUZXh0dXJlJyxcbn0pO1xuY29uc3QgTWFrZU91dHB1dFNyZ2I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdtYWtlT3V0cHV0U3JnYicsXG59KTtcbmNvbnN0IEZyYW1lYnVmZmVyU2l6ZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2ZyYW1lYnVmZmVyU2l6ZScsXG59KTtcbmNvbnN0IENsZWFyQ29hdEZhY3RvcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2NsZWFyQ29hdEZhY3RvcicsXG59KTtcbmNvbnN0IENsZWFyQ29hdFRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdjbGVhckNvYXRUZXh0dXJlJyxcbn0pO1xuY29uc3QgQ2xlYXJDb2F0Um91Z2huZXNzRmFjdG9yOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnY2xlYXJDb2F0Um91Z2huZXNzRmFjdG9yJyxcbn0pO1xuY29uc3QgQ2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2NsZWFyQ29hdFJvdWdobmVzc1RleHR1cmUnLFxufSk7XG5jb25zdCBDbGVhckNvYXROb3JtYWxUZXh0dXJlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZScsXG59KTtcbmNvbnN0IFRyYW5zbWlzc2lvbkZhY3RvcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3RyYW5zbWlzc2lvbkZhY3RvcicsXG59KTtcbmNvbnN0IFRyYW5zbWlzc2lvblRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICd0cmFuc21pc3Npb25UZXh0dXJlJyxcbn0pO1xuY29uc3QgQmFja0J1ZmZlclRleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdiYWNrQnVmZmVyVGV4dHVyZScsXG59KTtcbmNvbnN0IEJhY2tCdWZmZXJUZXh0dXJlU2l6ZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2JhY2tCdWZmZXJUZXh0dXJlU2l6ZScsXG59KTtcbmNvbnN0IFRoaWNrbmVzc0ZhY3RvcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ3RoaWNrbmVzc0ZhY3RvcicsXG59KTtcbmNvbnN0IFRoaWNrbmVzc1RleHR1cmU6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICd0aGlja25lc3NUZXh0dXJlJyxcbn0pO1xuY29uc3QgQXR0ZW51YXRpb25EaXN0YW5jZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2F0dGVudWF0aW9uRGlzdGFuY2UnLFxufSk7XG5jb25zdCBBdHRlbnVhdGlvbkNvbG9yOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYXR0ZW51YXRpb25Db2xvcicsXG59KTtcblxuY29uc3QgSXNPdXRwdXRIRFIgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdpc091dHB1dEhEUicsXG59KTtcbmNvbnN0IEJhc2VDb2xvclRleHR1cmVUcmFuc2Zvcm0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdiYXNlQ29sb3JUZXh0dXJlVHJhbnNmb3JtJyxcbn0pO1xuY29uc3QgQmFzZUNvbG9yVGV4dHVyZVJvdGF0aW9uID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYmFzZUNvbG9yVGV4dHVyZVJvdGF0aW9uJyxcbn0pO1xuY29uc3QgTm9ybWFsVGV4dHVyZVRyYW5zZm9ybSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ25vcm1hbFRleHR1cmVUcmFuc2Zvcm0nLFxufSk7XG5jb25zdCBOb3JtYWxUZXh0dXJlUm90YXRpb24gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdub3JtYWxUZXh0dXJlUm90YXRpb24nLFxufSk7XG5jb25zdCBNZXRhbGxpY1JvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdtZXRhbGxpY1JvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0nLFxufSk7XG5jb25zdCBNZXRhbGxpY1JvdWdobmVzc1RleHR1cmVSb3RhdGlvbiA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ21ldGFsbGljUm91Z2huZXNzVGV4dHVyZVJvdGF0aW9uJyxcbn0pO1xuY29uc3QgTm9ybWFsVGV4Y29vcmRJbmRleCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ25vcm1hbFRleGNvb3JkSW5kZXgnLFxufSk7XG5jb25zdCBCYXNlQ29sb3JUZXhjb29yZEluZGV4ID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnYmFzZUNvbG9yVGV4Y29vcmRJbmRleCcsXG59KTtcbmNvbnN0IE1ldGFsbGljUm91Z2huZXNzVGV4Y29vcmRJbmRleCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ21ldGFsbGljUm91Z2huZXNzVGV4Y29vcmRJbmRleCcsXG59KTtcbmNvbnN0IE9jY2x1c2lvblRleGNvb3JkSW5kZXggPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdvY2NsdXNpb25UZXhjb29yZEluZGV4Jyxcbn0pO1xuY29uc3QgT2NjbHVzaW9uVGV4dHVyZVRyYW5zZm9ybSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ29jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm0nLFxufSk7XG5jb25zdCBPY2NsdXNpb25UZXh0dXJlUm90YXRpb24gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdvY2NsdXNpb25UZXh0dXJlUm90YXRpb24nLFxufSk7XG5jb25zdCBFbWlzc2l2ZVRleGNvb3JkSW5kZXggPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdlbWlzc2l2ZVRleGNvb3JkSW5kZXgnLFxufSk7XG5jb25zdCBFbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdlbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0nLFxufSk7XG5jb25zdCBFbWlzc2l2ZVRleHR1cmVSb3RhdGlvbiA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2VtaXNzaXZlVGV4dHVyZVJvdGF0aW9uJyxcbn0pO1xuY29uc3QgTm9ybWFsU2NhbGUgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdub3JtYWxTY2FsZScgfSk7XG5jb25zdCBPY2NsdXNpb25TdHJlbmd0aCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ29jY2x1c2lvblN0cmVuZ3RoJyxcbn0pO1xuY29uc3QgZW52Um90YXRpb24gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdlbnZSb3RhdGlvbicgfSk7XG5jb25zdCBFbnZIZHJpRm9ybWF0ID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnZW52SGRyaUZvcm1hdCcgfSk7XG5jb25zdCBWclN0YXRlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAndnJTdGF0ZScgfSk7XG5jb25zdCBFbmFibGVMaW5lYXJUb1NyZ2IgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdlbmFibGVMaW5lYXJUb1NyZ2InLFxufSk7XG5jb25zdCBTcGVjdWxhckZhY3RvciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ3NwZWN1bGFyRmFjdG9yJyB9KTtcbmNvbnN0IFNwZWN1bGFyVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ3NwZWN1bGFyVGV4dHVyZScgfSk7XG5jb25zdCBTcGVjdWxhckNvbG9yRmFjdG9yID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnc3BlY3VsYXJDb2xvckZhY3RvcicsXG59KTtcbmNvbnN0IFNwZWN1bGFyQ29sb3JUZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnc3BlY3VsYXJDb2xvclRleHR1cmUnLFxufSk7XG5jb25zdCBJb3IgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdpb3InIH0pO1xuY29uc3QgRGVwdGhCaWFzUFYgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdkZXB0aEJpYXNQVicgfSk7XG5jb25zdCBDbGVhckNvYXRUZXh0dXJlVHJhbnNmb3JtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnY2xlYXJDb2F0VGV4dHVyZVRyYW5zZm9ybScsXG59KTtcbmNvbnN0IENsZWFyQ29hdFRleHR1cmVSb3RhdGlvbiA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2NsZWFyQ29hdFRleHR1cmVSb3RhdGlvbicsXG59KTtcbmNvbnN0IENsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtJyxcbn0pO1xuY29uc3QgQ2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZVJvdGF0aW9uID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZVJvdGF0aW9uJyxcbn0pO1xuY29uc3QgQ2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2NsZWFyQ29hdE5vcm1hbFRleHR1cmVUcmFuc2Zvcm0nLFxufSk7XG5jb25zdCBDbGVhckNvYXROb3JtYWxUZXh0dXJlUm90YXRpb24gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdjbGVhckNvYXROb3JtYWxUZXh0dXJlUm90YXRpb24nLFxufSk7XG5jb25zdCBDbGVhckNvYXRUZXhjb29yZEluZGV4ID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnY2xlYXJDb2F0VGV4Y29vcmRJbmRleCcsXG59KTtcbmNvbnN0IENsZWFyQ29hdFJvdWdobmVzc1RleGNvb3JkSW5kZXggPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdjbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZEluZGV4Jyxcbn0pO1xuY29uc3QgQ2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmRJbmRleCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2NsZWFyQ29hdE5vcm1hbFRleGNvb3JkSW5kZXgnLFxufSk7XG5jb25zdCBJcmlkZXNjZW5jZUZhY3RvciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2lyaWRlc2NlbmNlRmFjdG9yJyxcbn0pO1xuY29uc3QgSXJpZGVzY2VuY2VUZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAnaXJpZGVzY2VuY2VUZXh0dXJlJyxcbn0pO1xuY29uc3QgSXJpZGVzY2VuY2VJb3IgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdpcmlkZXNjZW5jZUlvcicsXG59KTtcbmNvbnN0IElyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2lyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bScsXG59KTtcbmNvbnN0IElyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2lyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bScsXG59KTtcbmNvbnN0IElyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2lyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZScsXG59KTtcbmNvbnN0IEdhdXNzaWFuS2VybmVsU2l6ZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2dhdXNzaWFuS2VybmVsU2l6ZScsXG59KTtcbmNvbnN0IEdhdXNzaWFuUmF0aW8gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdnYXVzc2lhblJhdGlvJyB9KTtcbmNvbnN0IElzSG9yaXpvbnRhbCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2lzSG9yaXpvbnRhbCcgfSk7XG5jb25zdCBBbmlzb3Ryb3B5U3RyZW5ndGggPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdhbmlzb3Ryb3B5U3RyZW5ndGgnLFxufSk7XG5jb25zdCBBbmlzb3Ryb3B5Um90YXRpb24gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdhbmlzb3Ryb3B5Um90YXRpb24nLFxufSk7XG5jb25zdCBBbmlzb3Ryb3B5VGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2FuaXNvdHJvcHlUZXh0dXJlJyxcbn0pO1xuY29uc3QgRW1pc3NpdmVTdHJlbmd0aCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2VtaXNzaXZlU3RyZW5ndGgnLFxufSk7XG5jb25zdCBUaW1lID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAndGltZScsXG59KTtcbmNvbnN0IEN1YmVNYXBGYWNlSWQgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICBzdHI6ICdjdWJlTWFwRmFjZUlkJyxcbn0pO1xuY29uc3QgUm91Z2huZXNzID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgc3RyOiAncm91Z2huZXNzJyxcbn0pO1xuY29uc3QgRGlzdHJpYnV0aW9uVHlwZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gIHN0cjogJ2Rpc3RyaWJ1dGlvblR5cGUnLFxufSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW1xuICBXb3JsZE1hdHJpeCxcbiAgVmlld01hdHJpeCxcbiAgSXNCaWxsYm9hcmQsXG4gIEVuYWJsZVZpZXdNYXRyaXgsXG4gIFByb2plY3Rpb25NYXRyaXgsXG4gIE5vcm1hbE1hdHJpeCxcbiAgQm9uZU1hdHJpeCxcbiAgQmFzZUNvbG9yRmFjdG9yLFxuICBCYXNlQ29sb3JUZXh0dXJlLFxuICBOb3JtYWxUZXh0dXJlLFxuICBNZXRhbGxpY1JvdWdobmVzc1RleHR1cmUsXG4gIE9jY2x1c2lvblRleHR1cmUsXG4gIEVtaXNzaXZlRmFjdG9yLFxuICBFbWlzc2l2ZVRleHR1cmUsXG4gIExpZ2h0TnVtYmVyLFxuICBMaWdodFBvc2l0aW9uLFxuICBMaWdodERpcmVjdGlvbixcbiAgTGlnaHRJbnRlbnNpdHksXG4gIExpZ2h0UHJvcGVydHksXG4gIE1ldGFsbGljUm91Z2huZXNzRmFjdG9yLFxuICBCcmRmTHV0VGV4dHVyZSxcbiAgRGlmZnVzZUVudlRleHR1cmUsXG4gIFNwZWN1bGFyRW52VGV4dHVyZSxcbiAgSW52ZXJzZUVudmlyb25tZW50LFxuICBJQkxQYXJhbWV0ZXIsXG4gIFZpZXdQb3NpdGlvbixcbiAgV2lyZWZyYW1lLFxuICBEaWZmdXNlQ29sb3JGYWN0b3IsXG4gIERpZmZ1c2VDb2xvclRleHR1cmUsXG4gIFNoaW5pbmVzcyxcbiAgU2hhZGluZ01vZGVsLFxuICBTa2lubmluZ01vZGUsXG4gIEdlbmVyYWxUZXh0dXJlLFxuICBWZXJ0ZXhBdHRyaWJ1dGVzRXhpc3RlbmNlQXJyYXksXG4gIEJvbmVRdWF0ZXJuaW9uLFxuICBCb25lVHJhbnNsYXRlU2NhbGUsXG4gIEJvbmVUcmFuc2xhdGVQYWNrZWRRdWF0LFxuICBCb25lU2NhbGVQYWNrZWRRdWF0LFxuICBCb25lQ29tcHJlc3NlZENodW5rLFxuICBCb25lQ29tcHJlc3NlZEluZm8sXG4gIFBvaW50U2l6ZSxcbiAgQ29sb3JFbnZUZXh0dXJlLFxuICBQb2ludERpc3RhbmNlQXR0ZW51YXRpb24sXG4gIEhEUklGb3JtYXQsXG4gIFNjcmVlbkluZm8sXG4gIERlcHRoVGV4dHVyZSxcbiAgTGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeCxcbiAgQW5pc290cm9weSxcbiAgQ2xlYXJDb2F0UGFyYW1ldGVyLFxuICBTaGVlbkNvbG9yRmFjdG9yLFxuICBTaGVlbkNvbG9yVGV4dHVyZSxcbiAgU2hlZW5Sb3VnaG5lc3NGYWN0b3IsXG4gIFNoZWVuUm91Z2huZXNzVGV4dHVyZSxcbiAgU2hlZW5MdXRUZXh0dXJlLFxuICBTcGVjdWxhckdsb3NzaW5lc3NGYWN0b3IsXG4gIFNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUsXG4gIEVudGl0eVVJRCxcbiAgTW9ycGhUYXJnZXROdW1iZXIsXG4gIERhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbixcbiAgTW9ycGhXZWlnaHRzLFxuICBDdXJyZW50Q29tcG9uZW50U0lEcyxcbiAgQWxwaGFDdXRvZmYsXG4gIEFscGhhVGV4dHVyZSxcbiAgTWFrZU91dHB1dFNyZ2IsXG4gIENsZWFyQ29hdEZhY3RvcixcbiAgQ2xlYXJDb2F0VGV4dHVyZSxcbiAgQ2xlYXJDb2F0Um91Z2huZXNzRmFjdG9yLFxuICBDbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlLFxuICBDbGVhckNvYXROb3JtYWxUZXh0dXJlLFxuICBUcmFuc21pc3Npb25GYWN0b3IsXG4gIFRyYW5zbWlzc2lvblRleHR1cmUsXG4gIEJhY2tCdWZmZXJUZXh0dXJlLFxuICBCYWNrQnVmZmVyVGV4dHVyZVNpemUsXG4gIFRoaWNrbmVzc0ZhY3RvcixcbiAgVGhpY2tuZXNzVGV4dHVyZSxcbiAgQXR0ZW51YXRpb25EaXN0YW5jZSxcbiAgQXR0ZW51YXRpb25Db2xvcixcbiAgSXNPdXRwdXRIRFIsXG4gIEJhc2VDb2xvclRleHR1cmVUcmFuc2Zvcm0sXG4gIEJhc2VDb2xvclRleHR1cmVSb3RhdGlvbixcbiAgTm9ybWFsVGV4dHVyZVRyYW5zZm9ybSxcbiAgTm9ybWFsVGV4dHVyZVJvdGF0aW9uLFxuICBNZXRhbGxpY1JvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0sXG4gIE1ldGFsbGljUm91Z2huZXNzVGV4dHVyZVJvdGF0aW9uLFxuICBOb3JtYWxUZXhjb29yZEluZGV4LFxuICBCYXNlQ29sb3JUZXhjb29yZEluZGV4LFxuICBNZXRhbGxpY1JvdWdobmVzc1RleGNvb3JkSW5kZXgsXG4gIE9jY2x1c2lvblRleGNvb3JkSW5kZXgsXG4gIE9jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm0sXG4gIE9jY2x1c2lvblRleHR1cmVSb3RhdGlvbixcbiAgRW1pc3NpdmVUZXhjb29yZEluZGV4LFxuICBFbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0sXG4gIEVtaXNzaXZlVGV4dHVyZVJvdGF0aW9uLFxuICBOb3JtYWxTY2FsZSxcbiAgT2NjbHVzaW9uU3RyZW5ndGgsXG4gIGVudlJvdGF0aW9uLFxuICBFbnZIZHJpRm9ybWF0LFxuICBWclN0YXRlLFxuICBFbmFibGVMaW5lYXJUb1NyZ2IsXG4gIFNwZWN1bGFyRmFjdG9yLFxuICBTcGVjdWxhclRleHR1cmUsXG4gIFNwZWN1bGFyQ29sb3JGYWN0b3IsXG4gIFNwZWN1bGFyQ29sb3JUZXh0dXJlLFxuICBJb3IsXG4gIERlcHRoQmlhc1BWLFxuICBDbGVhckNvYXRUZXh0dXJlVHJhbnNmb3JtLFxuICBDbGVhckNvYXRUZXh0dXJlUm90YXRpb24sXG4gIENsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0sXG4gIENsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVSb3RhdGlvbixcbiAgQ2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybSxcbiAgQ2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVJvdGF0aW9uLFxuICBDbGVhckNvYXRUZXhjb29yZEluZGV4LFxuICBDbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZEluZGV4LFxuICBDbGVhckNvYXROb3JtYWxUZXhjb29yZEluZGV4LFxuICBJcmlkZXNjZW5jZUZhY3RvcixcbiAgSXJpZGVzY2VuY2VUZXh0dXJlLFxuICBJcmlkZXNjZW5jZUlvcixcbiAgSXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtLFxuICBJcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0sXG4gIElyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZSxcbiAgR2F1c3NpYW5LZXJuZWxTaXplLFxuICBHYXVzc2lhblJhdGlvLFxuICBJc0hvcml6b250YWwsXG4gIEFuaXNvdHJvcHlTdHJlbmd0aCxcbiAgQW5pc290cm9weVJvdGF0aW9uLFxuICBBbmlzb3Ryb3B5VGV4dHVyZSxcbiAgRW1pc3NpdmVTdHJlbmd0aCxcbiAgVGltZSxcbiAgQ3ViZU1hcEZhY2VJZCxcbiAgUm91Z2huZXNzLFxuICBEaXN0cmlidXRpb25UeXBlLFxuXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogU2hhZGVyU2VtYW50aWNzSW5kZXgpOiBTaGFkZXJTZW1hbnRpY3NFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIFNoYWRlclNlbWFudGljc0VudW07XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBTaGFkZXJTZW1hbnRpY3NFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBTaGFkZXJTZW1hbnRpY3NFbnVtO1xufVxuZnVuY3Rpb24gZnJvbVN0cmluZ0Nhc2VTZW5zaXRpdmVseShzdHI6IHN0cmluZyk6IFNoYWRlclNlbWFudGljc0VudW0ge1xuICByZXR1cm4gX2Zyb21TdHJpbmdDYXNlU2Vuc2l0aXZlbHkoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIFNoYWRlclNlbWFudGljc0VudW07XG59XG5cbnR5cGUgVXBkYXRlRnVuYyA9ICh7XG4gIG1hdGVyaWFsLFxuICBzaGFkZXJQcm9ncmFtLFxuICBmaXJzdFRpbWUsXG4gIHByb3BlcnR5TmFtZSxcbiAgdmFsdWUsXG4gIGFyZ3MsXG59OiB7XG4gIG1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xuICBhcmdzPzogb2JqZWN0O1xufSkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgZ2V0U2hhZGVyUHJvcGVydHlGdW5jID0gKFxuICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gIGluZm86IFNoYWRlclNlbWFudGljc0luZm8sXG4gIGlzR2xvYmFsRGF0YTogYm9vbGVhbixcbiAgaXNXZWJHTDI6IGJvb2xlYW5cbikgPT4gc3RyaW5nO1xuXG5jb25zdCBnZXRTaGFkZXJQcm9wZXJ0eTogZ2V0U2hhZGVyUHJvcGVydHlGdW5jID0gKFxuICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gIGluZm86IFNoYWRlclNlbWFudGljc0luZm8sXG4gIGlzR2xvYmFsRGF0YTogYm9vbGVhbixcbiAgaXNXZWJHTDI6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCByZXR1cm5UeXBlID0gaW5mby5jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cihpbmZvLmNvbXBvbmVudFR5cGUpO1xuXG4gIGxldCB2YXJpYWJsZU5hbWUgPSBpbmZvLnNlbWFudGljO1xuXG4gIC8vIGRlZmluaXRpb24gb2YgdW5pZm9ybSB2YXJpYWJsZVxuICBjb25zdCB2YXJUeXBlID0gaW5mby5jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cihpbmZvLmNvbXBvbmVudFR5cGUpO1xuICBsZXQgdmFySW5kZXhTdHIgPSAnJztcbiAgaWYgKGluZm8uYXJyYXlMZW5ndGgpIHtcbiAgICB2YXJJbmRleFN0ciA9IGBbJHtpbmZvLmFycmF5TGVuZ3RofV1gO1xuICB9XG4gIGNvbnN0IHZhckRlZiA9IGAgIHVuaWZvcm0gJHt2YXJUeXBlfSB1XyR7dmFyaWFibGVOYW1lfSR7dmFySW5kZXhTdHJ9O1xcbmA7XG5cbiAgLy8gaW5uZXIgY29udGVudHMgb2YgJ2dldF8nIHNoYWRlciBmdW5jdGlvblxuICBsZXQgc3RyID0gJyc7XG4gIGlmIChDb21wb3NpdGlvblR5cGUuaXNBcnJheShpbmZvLmNvbXBvc2l0aW9uVHlwZSkpIHtcbiAgICBpZiAodmFyaWFibGVOYW1lLm1hdGNoKC9cXFsuKz9cXF0vKSkge1xuICAgICAgdmFyaWFibGVOYW1lID0gdmFyaWFibGVOYW1lLnJlcGxhY2UoL1xcWy4rP1xcXS9nLCAnW2ldJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhcmlhYmxlTmFtZSArPSAnW2ldJztcbiAgICB9XG4gICAgc3RyICs9IGBcbiAgICAgICAgJHtyZXR1cm5UeXBlfSB2YWw7XG4gICAgICAgICAgaW50IGkgPSBpbmRleDtcbiAgICAgICAgICByZXR1cm4gdV8ke3ZhcmlhYmxlTmFtZX07XG4gICAgICAgIGA7XG4gIH0gZWxzZSB7XG4gICAgLy8gaXMgTm90IEFycmF5XG4gICAgc3RyICs9IGByZXR1cm4gdV8ke3ZhcmlhYmxlTmFtZX07YDtcbiAgfVxuXG4gIGxldCBmdW5jRGVmID0gJyc7XG5cbiAgY29uc3QgaXNUZXh0dXJlID0gQ29tcG9zaXRpb25UeXBlLmlzVGV4dHVyZShpbmZvLmNvbXBvc2l0aW9uVHlwZSk7XG5cbiAgaWYgKCFpc1RleHR1cmUpIHtcbiAgICBmdW5jRGVmID0gYFxuICAke3JldHVyblR5cGV9IGdldF8ke2luZm8uc2VtYW50aWN9KGZsb2F0IGluc3RhbmNlSWQsIGludCBpbmRleCkge1xuICAgICR7c3RyfVxuICB9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke3ZhckRlZn0ke2Z1bmNEZWZ9YDtcbn07XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0UHJvcGVydHlJbmRleDIoc2hhZGVyU2VtYW50aWM6IFNoYWRlclNlbWFudGljc0VudW0pIHtcbiAgY29uc3QgcHJvcGVydHlJbmRleCA9IHNoYWRlclNlbWFudGljLmluZGV4O1xuICByZXR1cm4gcHJvcGVydHlJbmRleDtcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRlclNlbWFudGljcyA9IE9iamVjdC5mcmVlemUoe1xuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxuICBmcm9tU3RyaW5nQ2FzZVNlbnNpdGl2ZWx5LFxuICBXb3JsZE1hdHJpeCxcbiAgVmlld01hdHJpeCxcbiAgSXNCaWxsYm9hcmQsXG4gIEVuYWJsZVZpZXdNYXRyaXgsXG4gIFByb2plY3Rpb25NYXRyaXgsXG4gIE5vcm1hbE1hdHJpeCxcbiAgQm9uZU1hdHJpeCxcbiAgQmFzZUNvbG9yRmFjdG9yLFxuICBCYXNlQ29sb3JUZXh0dXJlLFxuICBOb3JtYWxUZXh0dXJlLFxuICBNZXRhbGxpY1JvdWdobmVzc1RleHR1cmUsXG4gIE9jY2x1c2lvblRleHR1cmUsXG4gIEVtaXNzaXZlRmFjdG9yLFxuICBFbWlzc2l2ZVRleHR1cmUsXG4gIExpZ2h0TnVtYmVyLFxuICBMaWdodFBvc2l0aW9uLFxuICBMaWdodERpcmVjdGlvbixcbiAgTGlnaHRJbnRlbnNpdHksXG4gIExpZ2h0UHJvcGVydHksXG4gIE1ldGFsbGljUm91Z2huZXNzRmFjdG9yLFxuICBCcmRmTHV0VGV4dHVyZSxcbiAgRGlmZnVzZUVudlRleHR1cmUsXG4gIFNwZWN1bGFyRW52VGV4dHVyZSxcbiAgSW52ZXJzZUVudmlyb25tZW50LFxuICBJQkxQYXJhbWV0ZXIsXG4gIFZpZXdQb3NpdGlvbixcbiAgV2lyZWZyYW1lLFxuICBEaWZmdXNlQ29sb3JGYWN0b3IsXG4gIERpZmZ1c2VDb2xvclRleHR1cmUsXG4gIFNoaW5pbmVzcyxcbiAgU2hhZGluZ01vZGVsLFxuICBTa2lubmluZ01vZGUsXG4gIEdlbmVyYWxUZXh0dXJlLFxuICBWZXJ0ZXhBdHRyaWJ1dGVzRXhpc3RlbmNlQXJyYXksXG4gIEJvbmVRdWF0ZXJuaW9uLFxuICBCb25lVHJhbnNsYXRlU2NhbGUsXG4gIEJvbmVUcmFuc2xhdGVQYWNrZWRRdWF0LFxuICBCb25lU2NhbGVQYWNrZWRRdWF0LFxuICBCb25lQ29tcHJlc3NlZENodW5rLFxuICBCb25lQ29tcHJlc3NlZEluZm8sXG4gIFBvaW50U2l6ZSxcbiAgQ29sb3JFbnZUZXh0dXJlLFxuICBQb2ludERpc3RhbmNlQXR0ZW51YXRpb24sXG4gIEhEUklGb3JtYXQsXG4gIFNjcmVlbkluZm8sXG4gIERlcHRoVGV4dHVyZSxcbiAgTGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeCxcbiAgQW5pc290cm9weSxcbiAgQ2xlYXJDb2F0UGFyYW1ldGVyLFxuICBTaGVlbkNvbG9yRmFjdG9yLFxuICBTaGVlbkNvbG9yVGV4dHVyZSxcbiAgU2hlZW5Sb3VnaG5lc3NGYWN0b3IsXG4gIFNoZWVuUm91Z2huZXNzVGV4dHVyZSxcbiAgU2hlZW5MdXRUZXh0dXJlLFxuICBTcGVjdWxhckdsb3NzaW5lc3NGYWN0b3IsXG4gIFNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUsXG4gIENsZWFyQ29hdEZhY3RvcixcbiAgQ2xlYXJDb2F0VGV4dHVyZSxcbiAgQ2xlYXJDb2F0Um91Z2huZXNzRmFjdG9yLFxuICBDbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlLFxuICBDbGVhckNvYXROb3JtYWxUZXh0dXJlLFxuICBUcmFuc21pc3Npb25GYWN0b3IsXG4gIFRyYW5zbWlzc2lvblRleHR1cmUsXG4gIEJhY2tCdWZmZXJUZXh0dXJlLFxuICBCYWNrQnVmZmVyVGV4dHVyZVNpemUsXG4gIFRoaWNrbmVzc0ZhY3RvcixcbiAgVGhpY2tuZXNzVGV4dHVyZSxcbiAgQXR0ZW51YXRpb25EaXN0YW5jZSxcbiAgQXR0ZW51YXRpb25Db2xvcixcbiAgZ2V0U2hhZGVyUHJvcGVydHksXG4gIEVudGl0eVVJRCxcbiAgTW9ycGhUYXJnZXROdW1iZXIsXG4gIERhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbixcbiAgTW9ycGhXZWlnaHRzLFxuICBDdXJyZW50Q29tcG9uZW50U0lEcyxcbiAgQWxwaGFDdXRvZmYsXG4gIEFscGhhVGV4dHVyZSxcbiAgTWFrZU91dHB1dFNyZ2IsXG4gIEZyYW1lYnVmZmVyU2l6ZSxcbiAgSXNPdXRwdXRIRFIsXG4gIEJhc2VDb2xvclRleHR1cmVUcmFuc2Zvcm0sXG4gIEJhc2VDb2xvclRleHR1cmVSb3RhdGlvbixcbiAgTm9ybWFsVGV4dHVyZVRyYW5zZm9ybSxcbiAgTm9ybWFsVGV4dHVyZVJvdGF0aW9uLFxuICBNZXRhbGxpY1JvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0sXG4gIE1ldGFsbGljUm91Z2huZXNzVGV4dHVyZVJvdGF0aW9uLFxuICBOb3JtYWxUZXhjb29yZEluZGV4LFxuICBCYXNlQ29sb3JUZXhjb29yZEluZGV4LFxuICBNZXRhbGxpY1JvdWdobmVzc1RleGNvb3JkSW5kZXgsXG4gIE9jY2x1c2lvblRleGNvb3JkSW5kZXgsXG4gIE9jY2x1c2lvblRleHR1cmVUcmFuc2Zvcm0sXG4gIE9jY2x1c2lvblRleHR1cmVSb3RhdGlvbixcbiAgRW1pc3NpdmVUZXhjb29yZEluZGV4LFxuICBFbWlzc2l2ZVRleHR1cmVUcmFuc2Zvcm0sXG4gIEVtaXNzaXZlVGV4dHVyZVJvdGF0aW9uLFxuICBOb3JtYWxTY2FsZSxcbiAgT2NjbHVzaW9uU3RyZW5ndGgsXG4gIGVudlJvdGF0aW9uLFxuICBFbnZIZHJpRm9ybWF0LFxuICBWclN0YXRlLFxuICBFbmFibGVMaW5lYXJUb1NyZ2IsXG4gIFNwZWN1bGFyRmFjdG9yLFxuICBTcGVjdWxhclRleHR1cmUsXG4gIFNwZWN1bGFyQ29sb3JGYWN0b3IsXG4gIFNwZWN1bGFyQ29sb3JUZXh0dXJlLFxuICBJb3IsXG4gIERlcHRoQmlhc1BWLFxuICBDbGVhckNvYXRUZXh0dXJlVHJhbnNmb3JtLFxuICBDbGVhckNvYXRUZXh0dXJlUm90YXRpb24sXG4gIENsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVUcmFuc2Zvcm0sXG4gIENsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVSb3RhdGlvbixcbiAgQ2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVRyYW5zZm9ybSxcbiAgQ2xlYXJDb2F0Tm9ybWFsVGV4dHVyZVJvdGF0aW9uLFxuICBDbGVhckNvYXRUZXhjb29yZEluZGV4LFxuICBDbGVhckNvYXRSb3VnaG5lc3NUZXhjb29yZEluZGV4LFxuICBDbGVhckNvYXROb3JtYWxUZXhjb29yZEluZGV4LFxuICBJcmlkZXNjZW5jZUZhY3RvcixcbiAgSXJpZGVzY2VuY2VUZXh0dXJlLFxuICBJcmlkZXNjZW5jZUlvcixcbiAgSXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtLFxuICBJcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0sXG4gIElyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZSxcbiAgR2F1c3NpYW5LZXJuZWxTaXplLFxuICBHYXVzc2lhblJhdGlvLFxuICBJc0hvcml6b250YWwsXG4gIEFuaXNvdHJvcHlTdHJlbmd0aCxcbiAgQW5pc290cm9weVJvdGF0aW9uLFxuICBBbmlzb3Ryb3B5VGV4dHVyZSxcbiAgRW1pc3NpdmVTdHJlbmd0aCxcbiAgVGltZSxcbiAgQ3ViZU1hcEZhY2VJZCxcbiAgUm91Z2huZXNzLFxuICBEaXN0cmlidXRpb25UeXBlLFxufSk7XG4iLCJpbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSwgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4vQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0VudW0sIFNoYWRlclNlbWFudGljc05hbWUgfSBmcm9tICcuL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBTaGFkZXJUeXBlRW51bSB9IGZyb20gJy4vU2hhZGVyVHlwZSc7XG5cbmV4cG9ydCB0eXBlIFNoYWRlclNlbWFudGljc0luZm8gPSB7XG4gIHNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lO1xuICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW07XG4gIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICBzdGFnZTogU2hhZGVyVHlwZUVudW07XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgaW5pdGlhbFZhbHVlPzogYW55OyAvLyBpbml0aWFsIHZhbHVlXG4gIGlzSW50ZXJuYWxTZXR0aW5nPzogYm9vbGVhbjtcbiAgYXJyYXlMZW5ndGg/OiBDb3VudDsgLy8gdGhlIGFycmF5IGxlbmd0aCBvZiB0aGUgYXJyYXkgdHlwZSBzaGFkZXIgdmFyaWFibGVcbiAgc29sb0RhdHVtPzogYm9vbGVhbjsgLy8gaXMgdGhlIHNoYWRlciB2YXJpYWJsZSdzIHZhbHVlIHVuaXF1ZSAob25lIHJlc291cmNlKSBpbiB0aGUgbWF0ZXJpYWxcbiAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZT86IGJvb2xlYW47XG4gIHZhbHVlU3RlcD86IG51bWJlcjtcbiAgeE5hbWU/OiBzdHJpbmc7XG4gIHlOYW1lPzogc3RyaW5nO1xuICB6TmFtZT86IHN0cmluZztcbiAgd05hbWU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsY0FsaWduZWRCeXRlTGVuZ3RoKHNlbWFudGljSW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbykge1xuICBjb25zdCBjb21wb3NpdGlvbk51bWJlciA9IHNlbWFudGljSW5mby5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCk7XG4gIGNvbnN0IGNvbXBvbmVudFNpemVJbkJ5dGUgPSBzZW1hbnRpY0luZm8uY29tcG9uZW50VHlwZS5nZXRTaXplSW5CeXRlcygpO1xuICBjb25zdCBzZW1hbnRpY0luZm9CeXRlID0gY29tcG9zaXRpb25OdW1iZXIgKiBjb21wb25lbnRTaXplSW5CeXRlO1xuICBsZXQgYWxpZ25lZEJ5dGVMZW5ndGggPSBzZW1hbnRpY0luZm9CeXRlO1xuICBpZiAoYWxpZ25lZEJ5dGVMZW5ndGggJSAxNiAhPT0gMCkge1xuICAgIGFsaWduZWRCeXRlTGVuZ3RoID0gc2VtYW50aWNJbmZvQnl0ZSArIDE2IC0gKHNlbWFudGljSW5mb0J5dGUgJSAxNik7XG4gIH1cbiAgaWYgKENvbXBvc2l0aW9uVHlwZS5pc0FycmF5KHNlbWFudGljSW5mby5jb21wb3NpdGlvblR5cGUpKSB7XG4gICAgY29uc3QgbWF4QXJyYXlMZW5ndGggPSBzZW1hbnRpY0luZm8uYXJyYXlMZW5ndGg7XG4gICAgaWYgKG1heEFycmF5TGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIGFsaWduZWRCeXRlTGVuZ3RoICo9IG1heEFycmF5TGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ3NlbWFudGljSW5mbyBoYXMgaW52YWxpZCBtYXhJbmRleCEnKTtcbiAgICAgIGFsaWduZWRCeXRlTGVuZ3RoICo9IDEwMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFsaWduZWRCeXRlTGVuZ3RoO1xufVxuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tLCBfZnJvbVN0cmluZyB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IHR5cGUgU2hhZGVyVHlwZUVudW0gPSBFbnVtSU87XG5cbmNsYXNzIFNoYWRlclR5cGVDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIFNoYWRlclR5cGVFbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxufVxuXG5jb25zdCBWZXJ0ZXhTaGFkZXI6IFNoYWRlclR5cGVFbnVtID0gbmV3IFNoYWRlclR5cGVDbGFzcyh7XG4gIGluZGV4OiAxLFxuICBzdHI6ICdWZXJ0ZXhTaGFkZXInLFxufSk7XG5jb25zdCBQaXhlbFNoYWRlcjogU2hhZGVyVHlwZUVudW0gPSBuZXcgU2hhZGVyVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDIsXG4gIHN0cjogJ1BpeGVsU2hhZGVyJyxcbn0pO1xuY29uc3QgVmVydGV4QW5kUGl4ZWxTaGFkZXI6IFNoYWRlclR5cGVFbnVtID0gbmV3IFNoYWRlclR5cGVDbGFzcyh7XG4gIGluZGV4OiAzLFxuICBzdHI6ICdWZXJ0ZXhBbmRQaXhlbFNoYWRlcicsXG59KTtcbmNvbnN0IENvbXB1dGVTaGFkZXI6IFNoYWRlclR5cGVFbnVtID0gbmV3IFNoYWRlclR5cGVDbGFzcyh7XG4gIGluZGV4OiA0LFxuICBzdHI6ICdDb21wdXRlU2hhZGVyJyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtWZXJ0ZXhTaGFkZXIsIFBpeGVsU2hhZGVyLCBWZXJ0ZXhBbmRQaXhlbFNoYWRlciwgQ29tcHV0ZVNoYWRlcl07XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IFNoYWRlclR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIFNoYWRlclR5cGVFbnVtO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogU2hhZGVyVHlwZUVudW0ge1xuICByZXR1cm4gX2Zyb21TdHJpbmcoeyB0eXBlTGlzdCwgc3RyIH0pIGFzIFNoYWRlclR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgU2hhZGVyVHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBWZXJ0ZXhTaGFkZXIsXG4gIFBpeGVsU2hhZGVyLFxuICBWZXJ0ZXhBbmRQaXhlbFNoYWRlcixcbiAgQ29tcHV0ZVNoYWRlcixcbiAgZnJvbSxcbiAgZnJvbVN0cmluZyxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tLCBfZnJvbVN0cmluZyB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IHR5cGUgU2hhZGVyVmFyaWFibGVUeXBlRW51bSA9IEVudW1JTztcblxuY2xhc3MgU2hhZGVyVmFyaWFibGVUeXBlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBTaGFkZXJWYXJpYWJsZVR5cGVFbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxufVxuXG5jb25zdCBWYXJ5aW5nOiBTaGFkZXJWYXJpYWJsZVR5cGVFbnVtID0gbmV3IFNoYWRlclZhcmlhYmxlVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDEsXG4gIHN0cjogJ1ZhcnlpbmcnLFxufSk7XG5jb25zdCBSZWFkT25seURhdGE6IFNoYWRlclZhcmlhYmxlVHlwZUVudW0gPSBuZXcgU2hhZGVyVmFyaWFibGVUeXBlQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnUmVhZE9ubHlEYXRhJyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtWYXJ5aW5nLCBSZWFkT25seURhdGFdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBTaGFkZXJWYXJpYWJsZVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIFNoYWRlclZhcmlhYmxlVHlwZUVudW07XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBTaGFkZXJWYXJpYWJsZVR5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBTaGFkZXJWYXJpYWJsZVR5cGVFbnVtO1xufVxuXG5leHBvcnQgY29uc3QgU2hhZGVyVmFyaWFibGVUeXBlID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFZhcnlpbmcsXG4gIFJlYWRPbmx5RGF0YSxcbiAgZnJvbSxcbiAgZnJvbVN0cmluZyxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgdHlwZSBTaGFkaW5nTW9kZWxFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBTaGFkaW5nTW9kZWxDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIFNoYWRpbmdNb2RlbEVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG59XG5cbmNvbnN0IFVua25vd246IFNoYWRpbmdNb2RlbEVudW0gPSBuZXcgU2hhZGluZ01vZGVsQ2xhc3Moe1xuICBpbmRleDogLTEsXG4gIHN0cjogJ1VOS05PV04nLFxufSk7XG5jb25zdCBDb25zdGFudDogU2hhZGluZ01vZGVsRW51bSA9IG5ldyBTaGFkaW5nTW9kZWxDbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICdDT05TVEFOVCcsXG59KTtcbmNvbnN0IExhbWJlcnQ6IFNoYWRpbmdNb2RlbEVudW0gPSBuZXcgU2hhZGluZ01vZGVsQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnTEFNQkVSVCcsXG59KTtcbmNvbnN0IEJsaW5uUGhvbmc6IFNoYWRpbmdNb2RlbEVudW0gPSBuZXcgU2hhZGluZ01vZGVsQ2xhc3Moe1xuICBpbmRleDogMixcbiAgc3RyOiAnQkxJTk4nLFxufSk7XG5jb25zdCBQaG9uZzogU2hhZGluZ01vZGVsRW51bSA9IG5ldyBTaGFkaW5nTW9kZWxDbGFzcyh7IGluZGV4OiAzLCBzdHI6ICdQSE9ORycgfSk7XG5cbmNvbnN0IHR5cGVMaXN0ID0gW1Vua25vd24sIENvbnN0YW50LCBMYW1iZXJ0LCBCbGlublBob25nLCBQaG9uZ107XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IFNoYWRpbmdNb2RlbEVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgU2hhZGluZ01vZGVsRW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRpbmdNb2RlbCA9IE9iamVjdC5mcmVlemUoe1xuICBVbmtub3duLFxuICBDb25zdGFudCxcbiAgTGFtYmVydCxcbiAgQmxpbm5QaG9uZyxcbiAgUGhvbmcsXG4gIGZyb20sXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5cbmV4cG9ydCB0eXBlIFNoYWRvd01hcEVudW0gPSBFbnVtSU87XG5cbmNsYXNzIFNoYWRvd01hcENsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgU2hhZG93TWFwRW51bSB7XG4gIGNvbnN0cnVjdG9yKHsgaW5kZXgsIHN0ciB9OiB7IGluZGV4OiBudW1iZXI7IHN0cjogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gIH1cbn1cblxuY29uc3QgU3RhbmRhcmQ6IFNoYWRvd01hcEVudW0gPSBuZXcgU2hhZG93TWFwQ2xhc3MoeyBpbmRleDogMCwgc3RyOiAnU3RhbmRhcmQnIH0pO1xuY29uc3QgVmFyaWFuY2U6IFNoYWRvd01hcEVudW0gPSBuZXcgU2hhZG93TWFwQ2xhc3MoeyBpbmRleDogMSwgc3RyOiAnVmFyaWFuY2UnIH0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtTdGFuZGFyZCwgVmFyaWFuY2VdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBTaGFkb3dNYXBFbnVtIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogU2hhZG93TWFwRW51bSB7XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHIgfSkgYXMgU2hhZG93TWFwRW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd01hcCA9IE9iamVjdC5mcmVlemUoeyBTdGFuZGFyZCwgVmFyaWFuY2UsIGZyb20sIGZyb21TdHJpbmcgfSk7XG4iLCJpbXBvcnQgeyBHTF9SRzE2RiwgR0xfUkczMkYgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20gfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4vQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBQaXhlbEZvcm1hdCwgUGl4ZWxGb3JtYXRFbnVtIH0gZnJvbSAnLi9QaXhlbEZvcm1hdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dHVyZUZvcm1hdEVudW0gZXh0ZW5kcyBFbnVtSU8ge1xuICB3ZWJncHU6IHN0cmluZztcbn1cblxuY2xhc3MgVGV4dHVyZUZvcm1hdENsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgVGV4dHVyZUZvcm1hdEVudW0ge1xuICByZWFkb25seSBfX3dlYmdwdT86IHN0cmluZztcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyLCB3ZWJncHUgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZzsgd2ViZ3B1Pzogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gICAgdGhpcy5fX3dlYmdwdSA9IHdlYmdwdTtcbiAgfVxuXG4gIGdldCB3ZWJncHUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fX3dlYmdwdSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRvZXMgbm90IHN1cHBvcnQgJHt0aGlzLnN0cn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX193ZWJncHU7XG4gIH1cbn1cblxuY29uc3QgUkdCODogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4ODA1MSxcbiAgc3RyOiAnUkdCOCcsXG4gIHdlYmdwdTogJ3JnYjh1bm9ybScsXG59KTtcbmNvbnN0IFJHQkE4OiBUZXh0dXJlRm9ybWF0RW51bSA9IG5ldyBUZXh0dXJlRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHg4MDU4LFxuICBzdHI6ICdSR0JBOCcsXG4gIHdlYmdwdTogJ3JnYmE4dW5vcm0nLFxufSk7XG5jb25zdCBSR0IxMF9BMjogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4ODA1OSxcbiAgc3RyOiAnUkdCMTBfQTInLFxuICB3ZWJncHU6ICdyZ2IxMGEydW5vcm0nLFxufSk7XG5jb25zdCBSRzE2RjogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IEdMX1JHMTZGLFxuICBzdHI6ICdSRzE2RicsXG4gIHdlYmdwdTogJ3JnMTZmbG9hdCcsXG59KTtcbmNvbnN0IFJHMzJGOiBUZXh0dXJlRm9ybWF0RW51bSA9IG5ldyBUZXh0dXJlRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogR0xfUkczMkYsXG4gIHN0cjogJ1JHMzJGJyxcbiAgd2ViZ3B1OiAncmczMmZsb2F0Jyxcbn0pO1xuY29uc3QgUkdCMTZGOiBUZXh0dXJlRm9ybWF0RW51bSA9IG5ldyBUZXh0dXJlRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHg4ODFiLFxuICBzdHI6ICdSR0IxNkYnLFxuICB3ZWJncHU6ICdyZ2JhMTZmbG9hdCcsXG59KTtcbmNvbnN0IFJHQjMyRjogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4ODgxNSxcbiAgc3RyOiAnUkdCMzJGJyxcbiAgd2ViZ3B1OiAncmdiYTMyZmxvYXQnLFxufSk7XG5jb25zdCBSR0JBMTZGOiBUZXh0dXJlRm9ybWF0RW51bSA9IG5ldyBUZXh0dXJlRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHg4ODFhLFxuICBzdHI6ICdSR0JBMTZGJyxcbiAgd2ViZ3B1OiAncmdiYTE2ZmxvYXQnLFxufSk7XG5jb25zdCBSR0JBMzJGOiBUZXh0dXJlRm9ybWF0RW51bSA9IG5ldyBUZXh0dXJlRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHg4ODE0LFxuICBzdHI6ICdSR0JBMzJGJyxcbiAgd2ViZ3B1OiAncmdiYTMyZmxvYXQnLFxufSk7XG5jb25zdCBSMTFGX0cxMUZfQjEwRjogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4OGMzYSxcbiAgc3RyOiAnUjExRl9HMTFGX0IxMEYnLFxuICB3ZWJncHU6ICdyZzExYjEwdWZsb2F0Jyxcbn0pO1xuY29uc3QgRGVwdGgxNjogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4ODFhNSxcbiAgc3RyOiAnREVQVEhfQ09NUE9ORU5UMTYnLFxuICB3ZWJncHU6ICdkZXB0aDE2dW5vcm0nLFxufSk7XG5jb25zdCBEZXB0aDI0OiBUZXh0dXJlRm9ybWF0RW51bSA9IG5ldyBUZXh0dXJlRm9ybWF0Q2xhc3Moe1xuICBpbmRleDogMHg4MWE2LFxuICBzdHI6ICdERVBUSF9DT01QT05FTlQyNCcsXG4gIHdlYmdwdTogJ2RlcHRoMjRwbHVzJyxcbn0pO1xuY29uc3QgRGVwdGgzMkY6IFRleHR1cmVGb3JtYXRFbnVtID0gbmV3IFRleHR1cmVGb3JtYXRDbGFzcyh7XG4gIGluZGV4OiAweDhjYWMsXG4gIHN0cjogJ0RFUFRIX0NPTVBPTkVOVDMyRicsXG4gIHdlYmdwdTogJ2RlcHRoMzJmbG9hdCcsXG59KTtcbmNvbnN0IERlcHRoMjRTdGVuY2lsODogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4ODhmMCxcbiAgc3RyOiAnREVQVEgyNF9TVEVOQ0lMOCcsXG4gIHdlYmdwdTogJ2RlcHRoMjRwbHVzLXN0ZW5jaWw4Jyxcbn0pO1xuY29uc3QgRGVwdGgzMkZTdGVuY2lsODogVGV4dHVyZUZvcm1hdEVudW0gPSBuZXcgVGV4dHVyZUZvcm1hdENsYXNzKHtcbiAgaW5kZXg6IDB4OGNhZCxcbiAgc3RyOiAnREVQVEgzMkZfU1RFTkNJTDgnLFxuICB3ZWJncHU6ICdkZXB0aDMyZmxvYXQtc3RlbmNpbDgnLFxufSk7XG5cbmZ1bmN0aW9uIGdldFBpeGVsRm9ybWF0RnJvbVRleHR1cmVGb3JtYXQodGV4dHVyZUZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW0pOiBQaXhlbEZvcm1hdEVudW0ge1xuICBzd2l0Y2ggKHRleHR1cmVGb3JtYXQpIHtcbiAgICBjYXNlIFJHQjg6XG4gICAgICByZXR1cm4gUGl4ZWxGb3JtYXQuUkdCO1xuICAgIGNhc2UgUkdCQTg6XG4gICAgICByZXR1cm4gUGl4ZWxGb3JtYXQuUkdCQTtcbiAgICBjYXNlIFJHQjEwX0EyOlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LlJHQkE7XG4gICAgY2FzZSBSRzE2RjpcbiAgICAgIHJldHVybiBQaXhlbEZvcm1hdC5SRztcbiAgICBjYXNlIFJHMzJGOlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LlJHO1xuICAgIGNhc2UgUkdCMTZGOlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LlJHQjtcbiAgICBjYXNlIFJHQjMyRjpcbiAgICAgIHJldHVybiBQaXhlbEZvcm1hdC5SR0I7XG4gICAgY2FzZSBSR0JBMTZGOlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LlJHQkE7XG4gICAgY2FzZSBSR0JBMzJGOlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LlJHQkE7XG4gICAgY2FzZSBSMTFGX0cxMUZfQjEwRjpcbiAgICAgIHJldHVybiBQaXhlbEZvcm1hdC5SR0I7XG4gICAgY2FzZSBEZXB0aDE2OlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LkRlcHRoQ29tcG9uZW50O1xuICAgIGNhc2UgRGVwdGgyNDpcbiAgICAgIHJldHVybiBQaXhlbEZvcm1hdC5EZXB0aENvbXBvbmVudDtcbiAgICBjYXNlIERlcHRoMzJGOlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LkRlcHRoQ29tcG9uZW50O1xuICAgIGNhc2UgRGVwdGgyNFN0ZW5jaWw4OlxuICAgICAgcmV0dXJuIFBpeGVsRm9ybWF0LkRlcHRoU3RlbmNpbDtcbiAgICBjYXNlIERlcHRoMzJGU3RlbmNpbDg6XG4gICAgICByZXR1cm4gUGl4ZWxGb3JtYXQuRGVwdGhTdGVuY2lsO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBpbXBsZW1lbnRlZCB5ZXQ6ICR7dGV4dHVyZUZvcm1hdH1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQaXhlbEZvcm1hdEFuZENvbXBvbmVudFR5cGVGcm9tVGV4dHVyZUZvcm1hdChpbnRlcm5hbEZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW0pIHtcbiAgbGV0IGZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQkEgYXMgUGl4ZWxGb3JtYXRFbnVtO1xuICBsZXQgdHlwZSA9IENvbXBvbmVudFR5cGUuVW5zaWduZWRCeXRlIGFzIENvbXBvbmVudFR5cGVFbnVtO1xuICBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IFRleHR1cmVGb3JtYXQuUkdCOCkge1xuICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQjtcbiAgICB0eXBlID0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGU7XG4gIH0gZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IFRleHR1cmVGb3JtYXQuUkdCQTgpIHtcbiAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JBO1xuICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZTtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gVGV4dHVyZUZvcm1hdC5SR0IxMF9BMikge1xuICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQkE7XG4gICAgdHlwZSA9IENvbXBvbmVudFR5cGUuVW5zaWduZWRCeXRlO1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBUZXh0dXJlRm9ybWF0LlJHMTZGKSB7XG4gICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkc7XG4gICAgdHlwZSA9IENvbXBvbmVudFR5cGUuSGFsZkZsb2F0O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBUZXh0dXJlRm9ybWF0LlJHMzJGKSB7XG4gICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkc7XG4gICAgdHlwZSA9IENvbXBvbmVudFR5cGUuRmxvYXQ7XG4gIH0gZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IFRleHR1cmVGb3JtYXQuUkdCMTZGKSB7XG4gICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCO1xuICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLkhhbGZGbG9hdDtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gVGV4dHVyZUZvcm1hdC5SR0IzMkYpIHtcbiAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0I7XG4gICAgdHlwZSA9IENvbXBvbmVudFR5cGUuRmxvYXQ7XG4gIH0gZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IFRleHR1cmVGb3JtYXQuUkdCQTE2Rikge1xuICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQkE7XG4gICAgdHlwZSA9IENvbXBvbmVudFR5cGUuSGFsZkZsb2F0O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBUZXh0dXJlRm9ybWF0LlJHQkEzMkYpIHtcbiAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JBO1xuICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLkZsb2F0O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBUZXh0dXJlRm9ybWF0LlIxMUZfRzExRl9CMTBGKSB7XG4gICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCO1xuICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLkZsb2F0O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBUZXh0dXJlRm9ybWF0LkRlcHRoMTYpIHtcbiAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdC5EZXB0aENvbXBvbmVudDtcbiAgICB0eXBlID0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZFNob3J0O1xuICB9IGVsc2UgaWYgKFxuICAgIGludGVybmFsRm9ybWF0ID09PSBUZXh0dXJlRm9ybWF0LkRlcHRoMjQgfHxcbiAgICBpbnRlcm5hbEZvcm1hdCA9PT0gVGV4dHVyZUZvcm1hdC5EZXB0aDI0U3RlbmNpbDhcbiAgKSB7XG4gICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuRGVwdGhDb21wb25lbnQ7XG4gICAgdHlwZSA9IENvbXBvbmVudFR5cGUuVW5zaWduZWRJbnQ7XG4gIH0gZWxzZSBpZiAoXG4gICAgaW50ZXJuYWxGb3JtYXQgPT09IFRleHR1cmVGb3JtYXQuRGVwdGgzMkYgfHxcbiAgICBpbnRlcm5hbEZvcm1hdCA9PT0gVGV4dHVyZUZvcm1hdC5EZXB0aDMyRlN0ZW5jaWw4XG4gICkge1xuICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0LkRlcHRoQ29tcG9uZW50O1xuICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLkZsb2F0O1xuICB9XG5cbiAgcmV0dXJuIHsgZm9ybWF0LCB0eXBlIH07XG59XG5cbmNvbnN0IHR5cGVMaXN0ID0gW1xuICBSR0I4LFxuICBSR0JBOCxcbiAgUkdCMTBfQTIsXG4gIFJHMTZGLFxuICBSRzMyRixcbiAgUkdCMTZGLFxuICBSR0IzMkYsXG4gIFJHQkExNkYsXG4gIFJHQkEzMkYsXG4gIFIxMUZfRzExRl9CMTBGLFxuICBEZXB0aDE2LFxuICBEZXB0aDI0LFxuICBEZXB0aDMyRixcbiAgRGVwdGgyNFN0ZW5jaWw4LFxuICBEZXB0aDMyRlN0ZW5jaWw4LFxuXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogVGV4dHVyZUZvcm1hdEVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgVGV4dHVyZUZvcm1hdEVudW07XG59XG5cbmV4cG9ydCBjb25zdCBUZXh0dXJlRm9ybWF0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFJHQjgsXG4gIFJHQkE4LFxuICBSR0IxMF9BMixcbiAgUkcxNkYsXG4gIFJHMzJGLFxuICBSR0IxNkYsXG4gIFJHQjMyRixcbiAgUkdCQTE2RixcbiAgUkdCQTMyRixcbiAgUjExRl9HMTFGX0IxMEYsXG4gIERlcHRoMTYsXG4gIERlcHRoMjQsXG4gIERlcHRoMzJGLFxuICBEZXB0aDI0U3RlbmNpbDgsXG4gIERlcHRoMzJGU3RlbmNpbDgsXG4gIGdldFBpeGVsRm9ybWF0RnJvbVRleHR1cmVGb3JtYXQsXG4gIGdldFBpeGVsRm9ybWF0QW5kQ29tcG9uZW50VHlwZUZyb21UZXh0dXJlRm9ybWF0LFxuICBmcm9tLFxufSk7XG4iLCJpbXBvcnQgeyBHTF9SRzE2RiwgR0xfUkczMkYgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20gfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5pbXBvcnQgeyBQaXhlbEZvcm1hdCwgUGl4ZWxGb3JtYXRFbnVtIH0gZnJvbSAnLi9QaXhlbEZvcm1hdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dHVyZVBhcmFtZXRlckVudW0gZXh0ZW5kcyBFbnVtSU8ge1xuICB3ZWJncHU6IHN0cmluZztcbn1cblxuY2xhc3MgVGV4dHVyZVBhcmFtZXRlckNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgVGV4dHVyZVBhcmFtZXRlckVudW0ge1xuICByZWFkb25seSBfX3dlYmdwdT86IHN0cmluZztcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyLCB3ZWJncHUgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZzsgd2ViZ3B1Pzogc3RyaW5nIH0pIHtcbiAgICBzdXBlcih7IGluZGV4LCBzdHIgfSk7XG4gICAgdGhpcy5fX3dlYmdwdSA9IHdlYmdwdTtcbiAgfVxuXG4gIGdldCB3ZWJncHUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fX3dlYmdwdSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRvZXMgbm90IHN1cHBvcnQgJHt0aGlzLnN0cn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX193ZWJncHU7XG4gIH1cbn1cblxuY29uc3QgTmVhcmVzdDogVGV4dHVyZVBhcmFtZXRlckVudW0gPSBuZXcgVGV4dHVyZVBhcmFtZXRlckNsYXNzKHtcbiAgaW5kZXg6IDB4MjYwMCxcbiAgc3RyOiAnTkVBUkVTVCcsXG4gIHdlYmdwdTogJ25lYXJlc3QnLFxufSk7XG5jb25zdCBMaW5lYXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDI2MDEsXG4gIHN0cjogJ0xJTkVBUicsXG4gIHdlYmdwdTogJ2xpbmVhcicsXG59KTtcbmNvbnN0IE5lYXJlc3RNaXBtYXBOZWFyZXN0OiBUZXh0dXJlUGFyYW1ldGVyRW51bSA9IG5ldyBUZXh0dXJlUGFyYW1ldGVyQ2xhc3Moe1xuICBpbmRleDogMHgyNzAwLFxuICBzdHI6ICdORUFSRVNUX01JUE1BUF9ORUFSRVNUJyxcbiAgd2ViZ3B1OiAnbmVhcmVzdCcsXG59KTtcbmNvbnN0IExpbmVhck1pcG1hcE5lYXJlc3Q6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDI3MDEsXG4gIHN0cjogJ0xJTkVBUl9NSVBNQVBfTkVBUkVTVCcsXG4gIHdlYmdwdTogJ2xpbmVhcicsXG59KTtcbmNvbnN0IE5lYXJlc3RNaXBtYXBMaW5lYXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDI3MDIsXG4gIHN0cjogJ05FQVJFU1RfTUlQTUFQX0xJTkVBUicsXG4gIHdlYmdwdTogJ25lYXJlc3QnLFxufSk7XG5jb25zdCBMaW5lYXJNaXBtYXBMaW5lYXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDI3MDMsXG4gIHN0cjogJ0xJTkVBUl9NSVBNQVBfTElORUFSJyxcbiAgd2ViZ3B1OiAnbGluZWFyJyxcbn0pO1xuY29uc3QgVGV4dHVyZU1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW0gPSBuZXcgVGV4dHVyZVBhcmFtZXRlckNsYXNzKHtcbiAgaW5kZXg6IDB4MjgwMCxcbiAgc3RyOiAnVEVYVFVSRV9NQUdfRklMVEVSJyxcbn0pO1xuY29uc3QgVGV4dHVyZU1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW0gPSBuZXcgVGV4dHVyZVBhcmFtZXRlckNsYXNzKHtcbiAgaW5kZXg6IDB4MjgwMSxcbiAgc3RyOiAnVEVYVFVSRV9NSU5fRklMVEVSJyxcbn0pO1xuY29uc3QgVGV4dHVyZVdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyRW51bSA9IG5ldyBUZXh0dXJlUGFyYW1ldGVyQ2xhc3Moe1xuICBpbmRleDogMHgyODAyLFxuICBzdHI6ICdURVhUVVJFX1dSQVBfUycsXG59KTtcbmNvbnN0IFRleHR1cmVXcmFwVDogVGV4dHVyZVBhcmFtZXRlckVudW0gPSBuZXcgVGV4dHVyZVBhcmFtZXRlckNsYXNzKHtcbiAgaW5kZXg6IDB4MjgwMyxcbiAgc3RyOiAnVEVYVFVSRV9XUkFQX1QnLFxufSk7XG5jb25zdCBUZXh0dXJlMkQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDBkZTEsXG4gIHN0cjogJ1RFWFRVUkVfMkQnLFxufSk7XG5jb25zdCBUZXh0dXJlOiBUZXh0dXJlUGFyYW1ldGVyRW51bSA9IG5ldyBUZXh0dXJlUGFyYW1ldGVyQ2xhc3Moe1xuICBpbmRleDogMHgxNzAyLFxuICBzdHI6ICdURVhUVVJFJyxcbn0pO1xuY29uc3QgVGV4dHVyZTA6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDg0YzAsXG4gIHN0cjogJ1RFWFRVUkUwJyxcbn0pO1xuY29uc3QgVGV4dHVyZTE6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDg0YzEsXG4gIHN0cjogJ1RFWFRVUkUxJyxcbn0pO1xuY29uc3QgQWN0aXZlVGV4dHVyZTogVGV4dHVyZVBhcmFtZXRlckVudW0gPSBuZXcgVGV4dHVyZVBhcmFtZXRlckNsYXNzKHtcbiAgaW5kZXg6IDB4ODRlMCxcbiAgc3RyOiAnQUNUSVZFX1RFWFRVUkUnLFxufSk7XG5jb25zdCBSZXBlYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtID0gbmV3IFRleHR1cmVQYXJhbWV0ZXJDbGFzcyh7XG4gIGluZGV4OiAweDI5MDEsXG4gIHN0cjogJ1JFUEVBVCcsXG4gIHdlYmdwdTogJ3JlcGVhdCcsXG59KTtcbmNvbnN0IENsYW1wVG9FZGdlOiBUZXh0dXJlUGFyYW1ldGVyRW51bSA9IG5ldyBUZXh0dXJlUGFyYW1ldGVyQ2xhc3Moe1xuICBpbmRleDogMHg4MTJmLFxuICBzdHI6ICdDTEFNUF9UT19FREdFJyxcbiAgd2ViZ3B1OiAnY2xhbXAtdG8tZWRnZScsXG59KTtcbmNvbnN0IE1pcnJvcmVkUmVwZWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bSA9IG5ldyBUZXh0dXJlUGFyYW1ldGVyQ2xhc3Moe1xuICBpbmRleDogMHg4MzcwLFxuICBzdHI6ICdNSVJST1JFRF9SRVBFQVQnLFxuICB3ZWJncHU6ICdtaXJyb3ItcmVwZWF0Jyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtcbiAgTmVhcmVzdCxcbiAgTGluZWFyLFxuICBOZWFyZXN0TWlwbWFwTmVhcmVzdCxcbiAgTGluZWFyTWlwbWFwTmVhcmVzdCxcbiAgTmVhcmVzdE1pcG1hcExpbmVhcixcbiAgTGluZWFyTWlwbWFwTGluZWFyLFxuICBUZXh0dXJlTWFnRmlsdGVyLFxuICBUZXh0dXJlTWluRmlsdGVyLFxuICBUZXh0dXJlV3JhcFMsXG4gIFRleHR1cmVXcmFwVCxcbiAgVGV4dHVyZTJELFxuICBUZXh0dXJlLFxuICBUZXh0dXJlMCxcbiAgVGV4dHVyZTEsXG4gIEFjdGl2ZVRleHR1cmUsXG4gIFJlcGVhdCxcbiAgQ2xhbXBUb0VkZ2UsXG4gIE1pcnJvcmVkUmVwZWF0LFxuXTtcblxuZnVuY3Rpb24gZnJvbShpbmRleDogbnVtYmVyKTogVGV4dHVyZVBhcmFtZXRlckVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgVGV4dHVyZVBhcmFtZXRlckVudW07XG59XG5cbmV4cG9ydCBjb25zdCBUZXh0dXJlUGFyYW1ldGVyID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5lYXJlc3QsXG4gIExpbmVhcixcbiAgTmVhcmVzdE1pcG1hcE5lYXJlc3QsXG4gIExpbmVhck1pcG1hcE5lYXJlc3QsXG4gIE5lYXJlc3RNaXBtYXBMaW5lYXIsXG4gIExpbmVhck1pcG1hcExpbmVhcixcbiAgVGV4dHVyZU1hZ0ZpbHRlcixcbiAgVGV4dHVyZU1pbkZpbHRlcixcbiAgVGV4dHVyZVdyYXBTLFxuICBUZXh0dXJlV3JhcFQsXG4gIFRleHR1cmUyRCxcbiAgVGV4dHVyZSxcbiAgVGV4dHVyZTAsXG4gIFRleHR1cmUxLFxuICBBY3RpdmVUZXh0dXJlLFxuICBSZXBlYXQsXG4gIENsYW1wVG9FZGdlLFxuICBNaXJyb3JlZFJlcGVhdCxcbiAgZnJvbSxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tIH0gZnJvbSAnLi4vbWlzYy9FbnVtSU8nO1xuXG5leHBvcnQgdHlwZSBUb25lTWFwcGluZ1R5cGVFbnVtID0gRW51bUlPO1xuXG5jbGFzcyBUb25lTWFwcGluZ1R5cGVDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIFRvbmVNYXBwaW5nVHlwZUVudW0ge1xuICBjb25zdHJ1Y3Rvcih7IGluZGV4LCBzdHIgfTogeyBpbmRleDogbnVtYmVyOyBzdHI6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoeyBpbmRleCwgc3RyIH0pO1xuICB9XG59XG5cbmNvbnN0IE5vbmU6IFRvbmVNYXBwaW5nVHlwZUVudW0gPSBuZXcgVG9uZU1hcHBpbmdUeXBlQ2xhc3Moe1xuICBpbmRleDogLTEsXG4gIHN0cjogJ05vbmUnLFxufSk7XG5jb25zdCBLaHJvbm9zUGJyTmV1dHJhbDogVG9uZU1hcHBpbmdUeXBlRW51bSA9IG5ldyBUb25lTWFwcGluZ1R5cGVDbGFzcyh7XG4gIGluZGV4OiAwLFxuICBzdHI6ICdLaHJvbm9zX1BCUl9OZXV0cmFsJyxcbn0pO1xuY29uc3QgUmVpbmhhcmQ6IFRvbmVNYXBwaW5nVHlwZUVudW0gPSBuZXcgVG9uZU1hcHBpbmdUeXBlQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnUmVpbmhhcmQnLFxufSk7XG5jb25zdCBHVF9Ub25lTWFwOiBUb25lTWFwcGluZ1R5cGVFbnVtID0gbmV3IFRvbmVNYXBwaW5nVHlwZUNsYXNzKHtcbiAgaW5kZXg6IDIsXG4gIHN0cjogJ0dUX1RvbmVNYXAnLFxufSk7XG5jb25zdCBBQ0VTX05hcmtvd2ljejogVG9uZU1hcHBpbmdUeXBlRW51bSA9IG5ldyBUb25lTWFwcGluZ1R5cGVDbGFzcyh7XG4gIGluZGV4OiAzLFxuICBzdHI6ICdBQ0VTX0ZpbG1pY19Ub25lTWFwX05hcmtvd2ljeicsXG59KTtcbmNvbnN0IEFDRVNfSGlsbDogVG9uZU1hcHBpbmdUeXBlRW51bSA9IG5ldyBUb25lTWFwcGluZ1R5cGVDbGFzcyh7XG4gIGluZGV4OiA0LFxuICBzdHI6ICdBQ0VTX0ZpbG1pY19Ub25lTWFwX0hpbGwnLFxufSk7XG5jb25zdCBBQ0VTX0hpbGxfRXhwb3N1cmVfQm9vc3Q6IFRvbmVNYXBwaW5nVHlwZUVudW0gPSBuZXcgVG9uZU1hcHBpbmdUeXBlQ2xhc3Moe1xuICBpbmRleDogNSxcbiAgc3RyOiAnQUNFU19GaWxtaWNfVG9uZU1hcF9IaWxsX0V4cG9zdXJlX0Jvb3N0Jyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtcbiAgTm9uZSxcbiAgS2hyb25vc1Bick5ldXRyYWwsXG4gIFJlaW5oYXJkLFxuICBHVF9Ub25lTWFwLFxuICBBQ0VTX05hcmtvd2ljeixcbiAgQUNFU19IaWxsLFxuICBBQ0VTX0hpbGxfRXhwb3N1cmVfQm9vc3QsXG5dO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBUb25lTWFwcGluZ1R5cGVFbnVtIHtcbiAgcmV0dXJuIF9mcm9tKHsgdHlwZUxpc3QsIGluZGV4IH0pIGFzIFRvbmVNYXBwaW5nVHlwZUVudW07XG59XG5cbmV4cG9ydCBjb25zdCBUb25lTWFwcGluZ1R5cGUgPSBPYmplY3QuZnJlZXplKHtcbiAgTm9uZSxcbiAgS2hyb25vc1Bick5ldXRyYWwsXG4gIFJlaW5oYXJkLFxuICBHVF9Ub25lTWFwLFxuICBBQ0VTX05hcmtvd2ljeixcbiAgQUNFU19IaWxsLFxuICBBQ0VTX0hpbGxfRXhwb3N1cmVfQm9vc3QsXG4gIGZyb20sXG59KTtcbiIsImltcG9ydCB7IEVudW1DbGFzcywgRW51bUlPLCBfZnJvbSwgX2Zyb21TdHJpbmcgfSBmcm9tICcuLi9taXNjL0VudW1JTyc7XG5pbXBvcnQgeyBDb3VudCwgSW5kZXggfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBSbkV4Y2VwdGlvbiB9IGZyb20gJy4uL21pc2MvUm5FeGNlcHRpb24nO1xuaW1wb3J0IHsgVmVjdG9yQ29tcG9uZW50TiB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcblxudHlwZSBDb21wb25lbnRDaGFyID0gJ1gnIHwgJ1knIHwgJ1onIHwgJ1cnO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB0eXBlIFZlcnRleEF0dHJpYnV0ZVR5cGVOYW1lID1cbiAgJ1VOS05PV04nIHxcbiAgJ1BPU0lUSU9OJ3xcbiAgJ05PUk1BTCcgfFxuICAnVEFOR0VOVCcgfFxuICAnVEVYQ09PUkRfMCcgfFxuICAnVEVYQ09PUkRfMScgfFxuICAnVEVYQ09PUkRfMicgfFxuICAnQ09MT1JfMCcgfFxuICAnSk9JTlRTXzAnIHxcbiAgJ1dFSUdIVFNfMCcgfFxuICAnSU5TVEFOQ0UnIHxcbiAgJ0ZBQ0VfTk9STUFMJyB8XG4gICdCQVJZX0NFTlRSSUNfQ09PUkQnO1xuXG5leHBvcnQgdHlwZSBWZXJ0ZXhBdHRyaWJ1dGVDb21wb25lbnQgPSBgJHtWZXJ0ZXhBdHRyaWJ1dGVUeXBlTmFtZX0uJHtDb21wb25lbnRDaGFyfWA7XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHR5cGUgVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nID1cbiAgYCR7c3RyaW5nfS4ke0NvbXBvbmVudENoYXJ9YCB8XG4gIGAke3N0cmluZ30uJHtDb21wb25lbnRDaGFyfSwke3N0cmluZ30uJHtDb21wb25lbnRDaGFyfWAgfFxuICBgJHtzdHJpbmd9LiR7Q29tcG9uZW50Q2hhcn0sJHtzdHJpbmd9LiR7Q29tcG9uZW50Q2hhcn0sJHtzdHJpbmd9LiR7Q29tcG9uZW50Q2hhcn1gIHxcbiAgYCR7c3RyaW5nfS4ke0NvbXBvbmVudENoYXJ9LCR7c3RyaW5nfS4ke0NvbXBvbmVudENoYXJ9LCR7c3RyaW5nfS4ke0NvbXBvbmVudENoYXJ9LCR7c3RyaW5nfS4ke0NvbXBvbmVudENoYXJ9YDtcblxuZXhwb3J0IGludGVyZmFjZSBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIGV4dGVuZHMgRW51bUlPIHtcbiAgZ2V0QXR0cmlidXRlU2xvdCgpOiBJbmRleDtcbiAgc2hhZGVyU3RyOiBzdHJpbmc7XG4gIFg6IFZlcnRleEF0dHJpYnV0ZUNvbXBvbmVudDtcbiAgWTogVmVydGV4QXR0cmlidXRlQ29tcG9uZW50O1xuICBaOiBWZXJ0ZXhBdHRyaWJ1dGVDb21wb25lbnQ7XG4gIFc6IFZlcnRleEF0dHJpYnV0ZUNvbXBvbmVudDtcbiAgWFk6IFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZztcbiAgWFlaOiBWZXJ0ZXhBdHRyaWJ1dGVTZW1hbnRpY3NKb2luZWRTdHJpbmc7XG4gIFhZWlc6IFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZztcbn1cblxudHlwZSBWZXJ0ZXhBdHRyaWJ1dGVEZXNjcmlwdG9yID0ge1xuICBzdHI6IFZlcnRleEF0dHJpYnV0ZVR5cGVOYW1lO1xuICBzaGFkZXJTdHI6IHN0cmluZztcbiAgYXR0cmlidXRlU2xvdDogSW5kZXg7XG4gIGdsdGZDb21wb25lbnROOiBDb3VudDtcbn07XG5leHBvcnQgY2xhc3MgVmVydGV4QXR0cmlidXRlQ2xhc3MgZXh0ZW5kcyBFbnVtQ2xhc3MgaW1wbGVtZW50cyBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pbmRleENvdW50ID0gLTE7XG4gIHByaXZhdGUgX19hdHRyaWJ1dGVTbG90OiBJbmRleDtcbiAgcHJpdmF0ZSBfX3NoYWRlclN0cjogc3RyaW5nO1xuICBwcml2YXRlIF9fZ2x0ZkNvbXBvbmVudE46IENvdW50O1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHtcbiAgICBzdHIsXG4gICAgc2hhZGVyU3RyLFxuICAgIGF0dHJpYnV0ZVNsb3QsXG4gICAgZ2x0ZkNvbXBvbmVudE4sXG4gIH06IFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0b3IpIHtcbiAgICBzdXBlcih7IGluZGV4OiBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2luZGV4Q291bnQrKywgc3RyIH0pO1xuICAgIHRoaXMuX19hdHRyaWJ1dGVTbG90ID0gYXR0cmlidXRlU2xvdDtcbiAgICB0aGlzLl9fc2hhZGVyU3RyID0gc2hhZGVyU3RyO1xuICAgIHRoaXMuX19nbHRmQ29tcG9uZW50TiA9IGdsdGZDb21wb25lbnROO1xuICB9XG5cbiAgZ2V0QXR0cmlidXRlU2xvdCgpOiBJbmRleCB7XG4gICAgcmV0dXJuIHRoaXMuX19hdHRyaWJ1dGVTbG90O1xuICB9XG5cbiAgZ2V0IHNoYWRlclN0cigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NoYWRlclN0cjtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVUeXBlTmFtZSgpOiBWZXJ0ZXhBdHRyaWJ1dGVUeXBlTmFtZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyIGFzIFZlcnRleEF0dHJpYnV0ZVR5cGVOYW1lO1xuICB9XG5cbiAgX3NldFNoYWRlclN0cihzdHI6IHN0cmluZykge1xuICAgIHRoaXMuX19zaGFkZXJTdHIgPSB0aGlzLl9fc2hhZGVyU3RyICsgc3RyO1xuICB9XG5cbiAgZ2V0IFgoKTogVmVydGV4QXR0cmlidXRlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gYCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uWGA7XG4gIH1cbiAgZ2V0IFkoKTogVmVydGV4QXR0cmlidXRlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gYCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uWWA7XG4gIH1cbiAgZ2V0IFooKTogVmVydGV4QXR0cmlidXRlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gYCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uWmA7XG4gIH1cbiAgZ2V0IFcoKTogVmVydGV4QXR0cmlidXRlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gYCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uV2A7XG4gIH1cbiAgZ2V0IFhZKCk6IFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYXR0cmlidXRlVHlwZU5hbWV9LlgsJHt0aGlzLmF0dHJpYnV0ZVR5cGVOYW1lfS5ZYDtcbiAgfVxuICBnZXQgWFlaKCk6IFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYXR0cmlidXRlVHlwZU5hbWV9LlgsJHt0aGlzLmF0dHJpYnV0ZVR5cGVOYW1lfS5ZLCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uWmA7XG4gIH1cbiAgZ2V0IFhZWlcoKTogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uWCwke3RoaXMuYXR0cmlidXRlVHlwZU5hbWV9LlksJHt0aGlzLmF0dHJpYnV0ZVR5cGVOYW1lfS5aLCR7dGhpcy5hdHRyaWJ1dGVUeXBlTmFtZX0uV2A7XG4gIH1cblxuICBnZXRWZXJ0ZXhBdHRyaWJ1dGVDb21wb25lbnRzQXNHbHRmKCk6IFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZyB7XG4gICAgaWYgKHRoaXMuX19nbHRmQ29tcG9uZW50TiA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuWDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19nbHRmQ29tcG9uZW50TiA9PT0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuWFk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9fZ2x0ZkNvbXBvbmVudE4gPT09IDMpIHtcbiAgICAgIHJldHVybiB0aGlzLlhZWjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19nbHRmQ29tcG9uZW50TiA9PT0gNCkge1xuICAgICAgcmV0dXJuIHRoaXMuWFlaVztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFJuRXhjZXB0aW9uKHtcbiAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgZ2x0ZiBjb21wb25lbnQgbnVtYmVyJyxcbiAgICAgICAgZXJyb3I6IHRoaXMuX19nbHRmQ29tcG9uZW50TixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKGRlc2M6IFZlcnRleEF0dHJpYnV0ZURlc2NyaXB0b3IpIHtcbiAgICByZXR1cm4gbmV3IFZlcnRleEF0dHJpYnV0ZUNsYXNzKGRlc2MpO1xuICB9XG59XG5cbmNvbnN0IFVua25vd246IFZlcnRleEF0dHJpYnV0ZUVudW0gPSBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKHtcbiAgc3RyOiAnVU5LTk9XTicsXG4gIHNoYWRlclN0cjogJ2FfdW5rbm93bicsXG4gIGF0dHJpYnV0ZVNsb3Q6IC0xLFxuICBnbHRmQ29tcG9uZW50TjogMCxcbn0pO1xuY29uc3QgUG9zaXRpb246IFZlcnRleEF0dHJpYnV0ZUVudW0gPSBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKHtcbiAgc3RyOiAnUE9TSVRJT04nLFxuICBzaGFkZXJTdHI6ICdhX3Bvc2l0aW9uJyxcbiAgYXR0cmlidXRlU2xvdDogMCxcbiAgZ2x0ZkNvbXBvbmVudE46IDMsXG59KTtcbmNvbnN0IE5vcm1hbDogVmVydGV4QXR0cmlidXRlRW51bSA9IFZlcnRleEF0dHJpYnV0ZUNsYXNzLl9fY3JlYXRlVmVydGV4QXR0cmlidXRlQ2xhc3Moe1xuICBzdHI6ICdOT1JNQUwnLFxuICBzaGFkZXJTdHI6ICdhX25vcm1hbCcsXG4gIGF0dHJpYnV0ZVNsb3Q6IDEsXG4gIGdsdGZDb21wb25lbnROOiAzLFxufSk7XG5jb25zdCBUYW5nZW50OiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtID0gVmVydGV4QXR0cmlidXRlQ2xhc3MuX19jcmVhdGVWZXJ0ZXhBdHRyaWJ1dGVDbGFzcyh7XG4gIHN0cjogJ1RBTkdFTlQnLFxuICBzaGFkZXJTdHI6ICdhX3RhbmdlbnQnLFxuICBhdHRyaWJ1dGVTbG90OiAyLFxuICBnbHRmQ29tcG9uZW50TjogNCxcbn0pO1xuY29uc3QgVGV4Y29vcmQwOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtID0gVmVydGV4QXR0cmlidXRlQ2xhc3MuX19jcmVhdGVWZXJ0ZXhBdHRyaWJ1dGVDbGFzcyh7XG4gIHN0cjogJ1RFWENPT1JEXzAnLFxuICBzaGFkZXJTdHI6ICdhX3RleGNvb3JkXzAnLFxuICBhdHRyaWJ1dGVTbG90OiAzLFxuICBnbHRmQ29tcG9uZW50TjogMixcbn0pO1xuY29uc3QgVGV4Y29vcmQxOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtID0gVmVydGV4QXR0cmlidXRlQ2xhc3MuX19jcmVhdGVWZXJ0ZXhBdHRyaWJ1dGVDbGFzcyh7XG4gIHN0cjogJ1RFWENPT1JEXzEnLFxuICBzaGFkZXJTdHI6ICdhX3RleGNvb3JkXzEnLFxuICBhdHRyaWJ1dGVTbG90OiA0LFxuICBnbHRmQ29tcG9uZW50TjogMixcbn0pO1xuY29uc3QgQ29sb3IwOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtID0gVmVydGV4QXR0cmlidXRlQ2xhc3MuX19jcmVhdGVWZXJ0ZXhBdHRyaWJ1dGVDbGFzcyh7XG4gIHN0cjogJ0NPTE9SXzAnLFxuICBzaGFkZXJTdHI6ICdhX2NvbG9yXzAnLFxuICBhdHRyaWJ1dGVTbG90OiA1LFxuICBnbHRmQ29tcG9uZW50TjogNCxcbn0pO1xuY29uc3QgSm9pbnRzMDogVmVydGV4QXR0cmlidXRlRW51bSA9IFZlcnRleEF0dHJpYnV0ZUNsYXNzLl9fY3JlYXRlVmVydGV4QXR0cmlidXRlQ2xhc3Moe1xuICBzdHI6ICdKT0lOVFNfMCcsXG4gIHNoYWRlclN0cjogJ2Ffam9pbnRzXzAnLFxuICBhdHRyaWJ1dGVTbG90OiA2LFxuICBnbHRmQ29tcG9uZW50TjogNCxcbn0pO1xuY29uc3QgV2VpZ2h0czA6IFZlcnRleEF0dHJpYnV0ZUVudW0gPSBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKHtcbiAgc3RyOiAnV0VJR0hUU18wJyxcbiAgc2hhZGVyU3RyOiAnYV93ZWlnaHRzXzAnLFxuICBhdHRyaWJ1dGVTbG90OiA3LFxuICBnbHRmQ29tcG9uZW50TjogNCxcbn0pO1xuY29uc3QgSW5zdGFuY2U6IFZlcnRleEF0dHJpYnV0ZUVudW0gPSBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKHtcbiAgc3RyOiAnSU5TVEFOQ0UnLFxuICBzaGFkZXJTdHI6ICdhX2luc3RhbmNlSW5mbycsXG4gIGF0dHJpYnV0ZVNsb3Q6IDgsXG4gIGdsdGZDb21wb25lbnROOiA0LFxufSk7XG5jb25zdCBGYWNlTm9ybWFsOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtID0gVmVydGV4QXR0cmlidXRlQ2xhc3MuX19jcmVhdGVWZXJ0ZXhBdHRyaWJ1dGVDbGFzcyh7XG4gIHN0cjogJ0ZBQ0VfTk9STUFMJyxcbiAgc2hhZGVyU3RyOiAnYV9mYWNlTm9ybWFsJyxcbiAgYXR0cmlidXRlU2xvdDogOSxcbiAgZ2x0ZkNvbXBvbmVudE46IDMsXG59KTtcbmNvbnN0IEJhcnlDZW50cmljQ29vcmQ6IFZlcnRleEF0dHJpYnV0ZUVudW0gPSBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKHtcbiAgc3RyOiAnQkFSWV9DRU5UUklDX0NPT1JEJyxcbiAgc2hhZGVyU3RyOiAnYV9iYXJ5Q2VudHJpY0Nvb3JkJyxcbiAgYXR0cmlidXRlU2xvdDogMTAsXG4gIGdsdGZDb21wb25lbnROOiA0LFxufSk7XG5jb25zdCBUZXhjb29yZDI6IFZlcnRleEF0dHJpYnV0ZUVudW0gPSBWZXJ0ZXhBdHRyaWJ1dGVDbGFzcy5fX2NyZWF0ZVZlcnRleEF0dHJpYnV0ZUNsYXNzKHtcbiAgc3RyOiAnVEVYQ09PUkRfMicsXG4gIHNoYWRlclN0cjogJ2FfdGV4Y29vcmRfMicsXG4gIGF0dHJpYnV0ZVNsb3Q6IDExLFxuICBnbHRmQ29tcG9uZW50TjogMixcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtcbiAgVW5rbm93biwgLy8gLTFcbiAgUG9zaXRpb24sIC8vIDBcbiAgTm9ybWFsLFxuICBUYW5nZW50LFxuICBUZXhjb29yZDAsXG4gIFRleGNvb3JkMSxcbiAgQ29sb3IwLFxuICBKb2ludHMwLFxuICBXZWlnaHRzMCxcbiAgSW5zdGFuY2UsXG4gIEZhY2VOb3JtYWwsXG4gIEJhcnlDZW50cmljQ29vcmQsXG4gIFRleGNvb3JkMixcbl07XG5cbmNvbnN0IEF0dHJpYnV0ZVR5cGVOdW1iZXIgPSB0eXBlTGlzdC5sZW5ndGggLSAxO1xuXG5mdW5jdGlvbiBpc0luc3RhbmNlT2ZWZXJ0ZXhBdHRyaWJ1dGVDbGFzcyhvYmo6IHVua25vd24pOiBvYmogaXMgVmVydGV4QXR0cmlidXRlQ2xhc3Mge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgVmVydGV4QXR0cmlidXRlQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIGZyb20oaW5kZXg6IG51bWJlcik6IFZlcnRleEF0dHJpYnV0ZUVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgVmVydGV4QXR0cmlidXRlRW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IFZlcnRleEF0dHJpYnV0ZUVudW0ge1xuICBsZXQgbmV3U3RyID0gc3RyO1xuICBpZiAoc3RyID09PSAnQ09MT1InKSB7XG4gICAgbmV3U3RyID0gJ0NPTE9SXzAnO1xuICB9IGVsc2UgaWYgKHN0ciA9PT0gJ1RFWENPT1JEJykge1xuICAgIG5ld1N0ciA9ICdURVhDT09SRF8wJztcbiAgfSBlbHNlIGlmIChzdHIgPT09ICdKT0lOVFMnKSB7XG4gICAgbmV3U3RyID0gJ0pPSU5UU18wJztcbiAgfSBlbHNlIGlmIChzdHIgPT09ICdXRUlHSFRTJykge1xuICAgIG5ld1N0ciA9ICdXRUlHSFRTXzAnO1xuICB9XG4gIHJldHVybiBfZnJvbVN0cmluZyh7IHR5cGVMaXN0LCBzdHI6IG5ld1N0ciB9KSBhcyBWZXJ0ZXhBdHRyaWJ1dGVFbnVtO1xufVxuXG50eXBlIEdsdGYyVmVydGV4QXR0cmlidXRlRW51bXMgPVxuICB8IHR5cGVvZiBQb3NpdGlvblxuICB8IHR5cGVvZiBDb2xvcjBcbiAgfCB0eXBlb2YgTm9ybWFsXG4gIHwgdHlwZW9mIFRhbmdlbnRcbiAgfCB0eXBlb2YgVGV4Y29vcmQwXG4gIHwgdHlwZW9mIFRleGNvb3JkMVxuICB8IHR5cGVvZiBKb2ludHMwXG4gIHwgdHlwZW9mIFdlaWdodHMwO1xuXG5mdW5jdGlvbiB0b1ZlcnRleEF0dHJpYnV0ZVNlbWFudGljSm9pbmVkU3RyaW5nQXNHbHRmU3R5bGUoXG4gIGF0dHJpYnV0ZTogR2x0ZjJWZXJ0ZXhBdHRyaWJ1dGVFbnVtc1xuKTogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nIHtcbiAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcbiAgICBjYXNlIFBvc2l0aW9uOlxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5YWVo7XG4gICAgY2FzZSBDb2xvcjA6XG4gICAgICByZXR1cm4gYXR0cmlidXRlLlhZWjtcbiAgICBjYXNlIE5vcm1hbDpcbiAgICAgIHJldHVybiBhdHRyaWJ1dGUuWFlaO1xuICAgIGNhc2UgVGFuZ2VudDpcbiAgICAgIHJldHVybiBhdHRyaWJ1dGUuWFlaO1xuICAgIGNhc2UgVGV4Y29vcmQwOlxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5YWTtcbiAgICBjYXNlIFRleGNvb3JkMTpcbiAgICAgIHJldHVybiBhdHRyaWJ1dGUuWFk7XG4gICAgY2FzZSBUZXhjb29yZDI6XG4gICAgICByZXR1cm4gYXR0cmlidXRlLlhZO1xuICAgIGNhc2UgSm9pbnRzMDpcbiAgICAgIHJldHVybiBhdHRyaWJ1dGUuWFlaVztcbiAgICBjYXNlIFdlaWdodHMwOlxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5YWVpXO1xuICAgIGNhc2UgSW5zdGFuY2U6XG4gICAgICByZXR1cm4gYXR0cmlidXRlLlhZWlc7XG4gICAgY2FzZSBGYWNlTm9ybWFsOlxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5YWVpXO1xuICAgIGNhc2UgQmFyeUNlbnRyaWNDb29yZDpcbiAgICAgIHJldHVybiBhdHRyaWJ1dGUuWFlaVztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGllZCBnbFRGIFZlcnRleEF0dHJpYnV0ZUVudW0nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0F0dHJpYnV0ZVNsb3RGcm9tSm9pbmVkU3RyaW5nKHN0cjogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nKTogSW5kZXgge1xuICBzd2l0Y2ggKHN0cikge1xuICAgIGNhc2UgUG9zaXRpb24uWFlaOlxuICAgICAgcmV0dXJuIFBvc2l0aW9uLmdldEF0dHJpYnV0ZVNsb3QoKTtcbiAgICBjYXNlIENvbG9yMC5YWVo6XG4gICAgICByZXR1cm4gQ29sb3IwLmdldEF0dHJpYnV0ZVNsb3QoKTtcbiAgICBjYXNlIE5vcm1hbC5YWVo6XG4gICAgICByZXR1cm4gTm9ybWFsLmdldEF0dHJpYnV0ZVNsb3QoKTtcbiAgICBjYXNlIFRhbmdlbnQuWFlaOlxuICAgICAgcmV0dXJuIFRhbmdlbnQuZ2V0QXR0cmlidXRlU2xvdCgpO1xuICAgIGNhc2UgVGV4Y29vcmQwLlhZOlxuICAgICAgcmV0dXJuIFRleGNvb3JkMC5nZXRBdHRyaWJ1dGVTbG90KCk7XG4gICAgY2FzZSBUZXhjb29yZDEuWFk6XG4gICAgICByZXR1cm4gVGV4Y29vcmQxLmdldEF0dHJpYnV0ZVNsb3QoKTtcbiAgICBjYXNlIFRleGNvb3JkMi5YWTpcbiAgICAgIHJldHVybiBUZXhjb29yZDIuZ2V0QXR0cmlidXRlU2xvdCgpO1xuICAgIGNhc2UgSm9pbnRzMC5YWVpXOlxuICAgICAgcmV0dXJuIEpvaW50czAuZ2V0QXR0cmlidXRlU2xvdCgpO1xuICAgIGNhc2UgV2VpZ2h0czAuWFlaVzpcbiAgICAgIHJldHVybiBXZWlnaHRzMC5nZXRBdHRyaWJ1dGVTbG90KCk7XG4gICAgY2FzZSBJbnN0YW5jZS5YWVpXOlxuICAgICAgcmV0dXJuIEluc3RhbmNlLmdldEF0dHJpYnV0ZVNsb3QoKTtcbiAgICBjYXNlIEZhY2VOb3JtYWwuWFlaOlxuICAgICAgcmV0dXJuIEZhY2VOb3JtYWwuZ2V0QXR0cmlidXRlU2xvdCgpO1xuICAgIGNhc2UgQmFyeUNlbnRyaWNDb29yZC5YWVo6XG4gICAgICByZXR1cm4gQmFyeUNlbnRyaWNDb29yZC5nZXRBdHRyaWJ1dGVTbG90KCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZWQgZ2xURiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9WZWN0b3JDb21wb25lbnROKGpvaW5lZFN0cmluZzogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nKTogVmVjdG9yQ29tcG9uZW50TiB7XG4gIHJldHVybiBqb2luZWRTdHJpbmcuc3BsaXQoJywnKS5sZW5ndGggYXMgVmVjdG9yQ29tcG9uZW50Tjtcbn1cblxuZXhwb3J0IGNvbnN0IFZlcnRleEF0dHJpYnV0ZSA9IE9iamVjdC5mcmVlemUoe1xuICBVbmtub3duLFxuICBQb3NpdGlvbixcbiAgTm9ybWFsLFxuICBUYW5nZW50LFxuICBUZXhjb29yZDAsXG4gIFRleGNvb3JkMSxcbiAgQ29sb3IwLFxuICBKb2ludHMwLFxuICBXZWlnaHRzMCxcbiAgSW5zdGFuY2UsXG4gIEZhY2VOb3JtYWwsXG4gIEJhcnlDZW50cmljQ29vcmQsXG4gIEF0dHJpYnV0ZVR5cGVOdW1iZXIsXG4gIGlzSW5zdGFuY2VPZlZlcnRleEF0dHJpYnV0ZUNsYXNzLFxuICB0b1ZlcnRleEF0dHJpYnV0ZVNlbWFudGljSm9pbmVkU3RyaW5nQXNHbHRmU3R5bGUsXG4gIHRvQXR0cmlidXRlU2xvdEZyb21Kb2luZWRTdHJpbmcsXG4gIHRvVmVjdG9yQ29tcG9uZW50TixcbiAgZnJvbSxcbiAgZnJvbVN0cmluZyxcbn0pO1xuIiwiaW1wb3J0IHsgRW51bUNsYXNzLCBFbnVtSU8sIF9mcm9tLCBfZnJvbVN0cmluZyB9IGZyb20gJy4uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IHR5cGUgVmlzaWJpbGl0eUVudW0gPSBFbnVtSU87XG5cbmNsYXNzIFZpc2liaWxpdHlDbGFzcyBleHRlbmRzIEVudW1DbGFzcyBpbXBsZW1lbnRzIFZpc2liaWxpdHlFbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxufVxuXG5jb25zdCBOZXV0cmFsOiBWaXNpYmlsaXR5RW51bSA9IG5ldyBWaXNpYmlsaXR5Q2xhc3MoeyBpbmRleDogMCwgc3RyOiAnTmV1dHJhbCcgfSk7XG5jb25zdCBWaXNpYmxlOiBWaXNpYmlsaXR5RW51bSA9IG5ldyBWaXNpYmlsaXR5Q2xhc3MoeyBpbmRleDogMSwgc3RyOiAnVmlzaWJsZScgfSk7XG5jb25zdCBJbnZpc2libGU6IFZpc2liaWxpdHlFbnVtID0gbmV3IFZpc2liaWxpdHlDbGFzcyh7XG4gIGluZGV4OiAtMSxcbiAgc3RyOiAnSW52aXNpYmxlJyxcbn0pO1xuXG5jb25zdCB0eXBlTGlzdCA9IFtWaXNpYmxlLCBJbnZpc2libGUsIE5ldXRyYWxdO1xuXG5mdW5jdGlvbiBmcm9tKGluZGV4OiBudW1iZXIpOiBWaXNpYmlsaXR5RW51bSB7XG4gIHJldHVybiBfZnJvbSh7IHR5cGVMaXN0LCBpbmRleCB9KSBhcyBWaXNpYmlsaXR5RW51bTtcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IFZpc2liaWxpdHlFbnVtIHtcbiAgcmV0dXJuIF9mcm9tU3RyaW5nKHsgdHlwZUxpc3QsIHN0ciB9KSBhcyBWaXNpYmlsaXR5RW51bTtcbn1cblxuZXhwb3J0IGNvbnN0IFZpc2liaWxpdHkgPSBPYmplY3QuZnJlZXplKHtcbiAgVmlzaWJsZSxcbiAgSW52aXNpYmxlLFxuICBOZXV0cmFsLFxuICBmcm9tLFxuICBmcm9tU3RyaW5nLFxufSk7XG4iLCJleHBvcnQgKiBmcm9tICcuL0FscGhhTW9kZSc7XG5leHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvbkF0dHJpYnV0ZSc7XG5leHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvbkludGVycG9sYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNpc0NvbXByZXNzaW9uVHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL0JvbmVEYXRhVHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL0J1ZmZlclVzZSc7XG5leHBvcnQgKiBmcm9tICcuL0NhbWVyYUNvbnRyb2xsZXJUeXBlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FtZXJhVHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudFR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db21wb3NpdGlvblR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db21wcmVzc2lvblRleHR1cmVUeXBlJztcbmV4cG9ydCAqIGZyb20gJy4vRmlsZVR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9IZHJpRm9ybWF0JztcbmV4cG9ydCAqIGZyb20gJy4vTGlnaHRUeXBlJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxGb3JtYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9QcmltaXRpdmVNb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvY2Vzc0FwcHJvYWNoJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvY2Vzc1N0YWdlJztcbmV4cG9ydCAqIGZyb20gJy4vUmVuZGVyQnVmZmVyVGFyZ2V0JztcbmV4cG9ydCAqIGZyb20gJy4vU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYWRlclNlbWFudGljcyc7XG5leHBvcnQgKiBmcm9tICcuL1NoYWRlclNlbWFudGljc0luZm8nO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFkZXJUeXBlJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhZGVyVmFyaWFibGVUeXBlJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhZGluZ01vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhZG93TWFwJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dHVyZUZvcm1hdCc7XG5leHBvcnQgKiBmcm9tICcuL1RleHR1cmVQYXJhbWV0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9WZXJ0ZXhBdHRyaWJ1dGUnO1xuZXhwb3J0ICogZnJvbSAnLi9WaXNpYmlsaXR5JztcbmV4cG9ydCAqIGZyb20gJy4vVG9uZU1hcHBpbmdUeXBlJztcbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUvQ29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4uL2NvcmUvRW50aXR5JztcbmV4cG9ydCBjb25zdCBHZXRDb21wb25lbnRGcm9tRW50aXRpZXMgPSBTeW1ib2woKTtcblxuY29uc3QgZ2V0Q29tcG9uZW50RnJvbUVudGl0aWVzU3RyID0gJ2dldENvbXBvbmVudEZyb21FbnRpdGllcyc7XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEZyb21FbnRpdGllczxUIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudD4oXG4gIHRoaXM6IEVuaGFuY2VkQXJyYXlNZXRob2RzLFxuICBDb21wb25lbnRDbGFzczogVFxuKTogSW5zdGFuY2VUeXBlPFQ+W10ge1xuICBjb25zdCB0aGF0ID0gdGhpcy5fX3JhdyBhcyBBcnJheTxFbnRpdHk+O1xuICBjb25zdCBjb21wb25lbnRzOiBJbnN0YW5jZVR5cGU8VD5bXSA9IFtdO1xuICB0aGF0LmZvckVhY2goKGVudGl0eTogRW50aXR5KSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZW50aXR5LmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgICAgQ29tcG9uZW50Q2xhc3MuY29tcG9uZW50VElEXG4gICAgKSBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheUFzUm48VD4ge1xuICBSbjogRW5oYW5jZWRBcnJheU1ldGhvZHMgJiBJRW5oYW5jZWRBcnJheU1ldGhvZHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVuaGFuY2VkQXJyYXlNZXRob2RzIHtcbiAgZ2V0Q29tcG9uZW50RnJvbUVudGl0aWVzOiB0eXBlb2YgZ2V0Q29tcG9uZW50RnJvbUVudGl0aWVzO1xufVxuXG5jbGFzcyBFbmhhbmNlZEFycmF5TWV0aG9kcyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBfX3JhdzogdW5rbm93bltdKSB7fVxufVxuXG5jb25zdCBlbmhhbmNlSW5uZXIgPSAoKSA9PiB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbmhhbmNlZEFycmF5TWV0aG9kcy5wcm90b3R5cGUsIGdldENvbXBvbmVudEZyb21FbnRpdGllc1N0ciwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGdldENvbXBvbmVudEZyb21FbnRpdGllcyxcbiAgfSk7XG59O1xuXG5lbmhhbmNlSW5uZXIoKTtcblxuZXhwb3J0IGNvbnN0IGVuaGFuY2VBcnJheSA9ICgpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ1JuJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgZ2V0PFQ+KCk6IEFycmF5QXNSbjxUPiB7XG4gICAgICBjb25zdCByZXQgPSBuZXcgRW5oYW5jZWRBcnJheU1ldGhvZHModGhpcyBhcyB1bmtub3duW10pO1xuICAgICAgcmV0dXJuIHJldCBhcyB1bmtub3duIGFzIEFycmF5QXNSbjxUPjtcbiAgICB9LFxuICB9KTtcbn07XG4iLCJleHBvcnQgKiBmcm9tICcuL0FycmF5JztcbiIsImltcG9ydCB7IEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IEFic3RyYWN0VGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0Fic3RyYWN0VGV4dHVyZSc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHtcbiAgR2x0ZjIsXG4gIEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcsXG4gIEdsdGYyQW5pbWF0aW9uLFxuICBHbHRmMkFuaW1hdGlvbkNoYW5uZWwsXG4gIEdsdGYyQW5pbWF0aW9uU2FtcGxlcixcbiAgR2x0ZjJNZXNoLFxuICBHbHRmMlByaW1pdGl2ZSxcbiAgR2x0ZjJBbmltYXRpb25QYXRoTmFtZSxcbiAgR2x0ZjJTa2luLFxuICBHbHRmMkltYWdlLFxuICBHbHRmMlRleHR1cmVTYW1wbGVyLFxuICBpc1NhbWVHbFRGMlRleHR1cmVTYW1wbGVyLFxuICBHbHRmMlRleHR1cmUsXG4gIEdsdGYyQXR0cmlidXRlQmxlbmRTaGFwZXMsXG4gIEdsdGYyQXR0cmlidXRlcyxcbiAgR2x0ZjJDYW1lcmEsXG59IGZyb20gJy4uLy4uL3R5cGVzL2dsVEYyJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIEdsdGYyQWNjZXNzb3JDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQge1xuICBHbHRmMkFjY2Vzc29yRXgsXG4gIEdsdGYyQnVmZmVyVmlld0V4LFxuICBHbHRmMkV4LFxuICBHbHRmMkltYWdlRXgsXG4gIEdsdGYyTWF0ZXJpYWxFeCxcbn0gZnJvbSAnLi4vLi4vdHlwZXMvZ2xURjJGb3JPdXRwdXQnO1xuaW1wb3J0IHsgQnVmZmVyVmlldyB9IGZyb20gJy4uL21lbW9yeS9CdWZmZXJWaWV3JztcbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSAnLi4vbWlzYy9EYXRhVXRpbCc7XG5pbXBvcnQgeyBBY2Nlc3NvciB9IGZyb20gJy4uL21lbW9yeS9BY2Nlc3Nvcic7XG5pbXBvcnQge1xuICBBcnJheTF0bzQsXG4gIEJ5dGUsXG4gIENvdW50LFxuICBJbmRleCxcbiAgVmVjdG9yQW5kU3F1YXJlTWF0cml4Q29tcG9uZW50Tixcbn0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnLi4vbWVtb3J5L0J1ZmZlcic7XG5pbXBvcnQgeyBHTF9BUlJBWV9CVUZGRVIsIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSIH0gZnJvbSAnLi4vLi4vdHlwZXMvV2ViR0xDb25zdGFudHMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ2hhbm5lbCwgQW5pbWF0aW9uUGF0aE5hbWUgfSBmcm9tICcuLi8uLi90eXBlcy9BbmltYXRpb25UeXBlcyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50JztcbmltcG9ydCB7XG4gIElBbmltYXRpb25FbnRpdHksXG4gIElTY2VuZUdyYXBoRW50aXR5LFxuICBJTWVzaEVudGl0eSxcbiAgSVNrZWxldGFsRW50aXR5LFxufSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBjcmVhdGVFZmZla3NlZXIgfSBmcm9tICcuL0dsdGYyRXhwb3J0ZXJFZmZla3NlZXInO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIENhbWVyYVR5cGUsXG4gIENvbXBvbmVudFR5cGVFbnVtLFxuICBDb21wb3NpdGlvblR5cGVFbnVtLFxuICBUZXh0dXJlUGFyYW1ldGVyLFxufSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWwnO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4uLy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL1RleHR1cmUnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgY3JlYXRlQW5kQWRkR2x0ZjJCdWZmZXJWaWV3IH0gZnJvbSAnLi9HbHRmMkV4cG9ydGVyT3BzJztcblxuZXhwb3J0IGNvbnN0IEdMVEYyX0VYUE9SVF9HTFRGID0gJ2dsVEYnO1xuZXhwb3J0IGNvbnN0IEdMVEYyX0VYUE9SVF9HTEIgPSAnZ2xURi1CaW5hcnknO1xuZXhwb3J0IGNvbnN0IEdMVEYyX0VYUE9SVF9EUkFDTyA9ICdnbFRGLURyYWNvJztcbmV4cG9ydCBjb25zdCBHTFRGMl9FWFBPUlRfRU1CRURERUQgPSAnZ2xURi1FbWJlZGRlZCc7XG5leHBvcnQgY29uc3QgR0xURjJfRVhQT1JUX05PX0RPV05MT0FEID0gJ05vLURvd25sb2FkJztcblxuZXhwb3J0IHR5cGUgR2x0ZjJFeHBvcnRUeXBlID1cbiAgfCB0eXBlb2YgR0xURjJfRVhQT1JUX0dMVEZcbiAgfCB0eXBlb2YgR0xURjJfRVhQT1JUX0dMQlxuICB8IHR5cGVvZiBHTFRGMl9FWFBPUlRfRFJBQ09cbiAgfCB0eXBlb2YgR0xURjJfRVhQT1JUX0VNQkVEREVEXG4gIHwgdHlwZW9mIEdMVEYyX0VYUE9SVF9OT19ET1dOTE9BRDtcbmV4cG9ydCBpbnRlcmZhY2UgR2x0ZjJFeHBvcnRlckFyZ3VtZW50cyB7XG4gIGVudGl0aWVzPzogSVNjZW5lR3JhcGhFbnRpdHlbXTsgLy8gVGhlIHRhcmdldCBlbnRpdGllcy4gVGhpcyBleHBvcnRlciBpbmNsdWRlcyB0aGVpciBkZXNjZW5kYW50cyBmb3IgdGhlIG91dHB1dC5cbiAgdHlwZTogR2x0ZjJFeHBvcnRUeXBlO1xuICBleGNsdWRlVGFncz86IFRhZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBnbFRGMiBmb3JtYXQgRXhwb3J0ZXIgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBHbHRmMkV4cG9ydGVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgc2NlbmUgZGF0YSBpbiB0aGUgcmhvZG9uaXRlIHN5c3RlbSBpbiBnbFRGMiBmb3JtYXQuXG4gICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgdGFyZ2V0IG91dHB1dCBwYXRoXG4gICAqIEBwYXJhbSBvcHRpb24gYSBvcHRpb24gY29uZmlnXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZXhwb3J0KFxuICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uOiBHbHRmMkV4cG9ydGVyQXJndW1lbnRzID0ge1xuICAgICAgZW50aXRpZXM6IHVuZGVmaW5lZCxcbiAgICAgIHR5cGU6IEdMVEYyX0VYUE9SVF9HTEIsXG4gICAgfVxuICApIHtcbiAgICBjb25zdCB7IGNvbGxlY3RlZEVudGl0aWVzLCB0b3BMZXZlbEVudGl0aWVzIH0gPSB0aGlzLl9fY29sbGVjdEVudGl0aWVzKG9wdGlvbik7XG5cbiAgICBjb25zdCB7IGpzb24sIGZpbGVOYW1lIH06IHsganNvbjogR2x0ZjJFeDsgZmlsZU5hbWU6IHN0cmluZyB9ID0gdGhpcy5fX2NyZWF0ZUpzb25CYXNlKGZpbGVuYW1lKTtcblxuICAgIHRoaXMuX19jcmVhdGVCdWZmZXJWaWV3c0FuZEFjY2Vzc29ycyhqc29uLCBjb2xsZWN0ZWRFbnRpdGllcyk7XG5cbiAgICB0aGlzLl9fY3JlYXRlTm9kZXMoanNvbiwgY29sbGVjdGVkRW50aXRpZXMsIHRvcExldmVsRW50aXRpZXMpO1xuXG4gICAgYXdhaXQgdGhpcy5fX2NyZWF0ZU1hdGVyaWFscyhqc29uLCBjb2xsZWN0ZWRFbnRpdGllcyBhcyB1bmtub3duIGFzIElNZXNoRW50aXR5W10sIG9wdGlvbik7XG5cbiAgICBjcmVhdGVFZmZla3NlZXIoanNvbiwgY29sbGVjdGVkRW50aXRpZXMpO1xuXG4gICAgY29uc3QgYXJyYXlidWZmZXIgPSB0aGlzLl9fY3JlYXRlQmluYXJ5KGpzb24pO1xuXG4gICAgdGhpcy5fX2RlbGV0ZUVtcHR5QXJyYXlzKGpzb24pO1xuXG4gICAgY29uc3QgZ2xiQXJyYXlCdWZmZXIgPSBnZW5lcmF0ZUdsYkFycmF5QnVmZmVyKGpzb24sIGFycmF5YnVmZmVyKTtcblxuICAgIGlmIChvcHRpb24udHlwZSA9PT0gR0xURjJfRVhQT1JUX0dMQikge1xuICAgICAgdGhpcy5fX2Rvd25sb2FkR2xiKGpzb24sIGZpbGVOYW1lLCBnbGJBcnJheUJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmIChvcHRpb24udHlwZSA9PT0gR0xURjJfRVhQT1JUX0dMVEYpIHtcbiAgICAgIHRoaXMuX19kb3dubG9hZEdsdGYoanNvbiwgZmlsZU5hbWUsIGFycmF5YnVmZmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2xiQXJyYXlCdWZmZXI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2RlbGV0ZUVtcHR5QXJyYXlzKGpzb246IEdsdGYyRXgpIHtcbiAgICBpZiAoanNvbi5hY2Nlc3NvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLmFjY2Vzc29ycztcbiAgICB9XG4gICAgaWYgKGpzb24uYnVmZmVyVmlld3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLmJ1ZmZlclZpZXdzO1xuICAgIH1cbiAgICBpZiAoanNvbi5tYXRlcmlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLm1hdGVyaWFscztcbiAgICB9XG4gICAgaWYgKGpzb24ubWVzaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIChqc29uIGFzIEdsdGYyKS5tZXNoZXM7XG4gICAgfVxuICAgIGlmIChqc29uLnNraW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIChqc29uIGFzIEdsdGYyKS5za2lucztcbiAgICB9XG4gICAgaWYgKGpzb24udGV4dHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLnRleHR1cmVzO1xuICAgIH1cbiAgICBpZiAoanNvbi5pbWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLmltYWdlcztcbiAgICB9XG4gICAgaWYgKGpzb24uYW5pbWF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSAoanNvbiBhcyBHbHRmMikuYW5pbWF0aW9ucztcbiAgICB9XG4gICAgaWYgKElzLmV4aXN0KGpzb24uZXh0ZW5zaW9uc1VzZWQpICYmIGpzb24uZXh0ZW5zaW9uc1VzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLmV4dGVuc2lvbnNVc2VkO1xuICAgIH1cbiAgICBpZiAoanNvbi5jYW1lcmFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIChqc29uIGFzIEdsdGYyKS5jYW1lcmFzO1xuICAgIH1cbiAgICBkZWxldGUgKGpzb24gYXMgR2x0ZjIpLmV4dHJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBjb2xsZWN0IHRhcmdldCBlbnRpdGllcy4gVGhpcyBleHBvcnRlciBpbmNsdWRlcyB0aGVpciBkZXNjZW5kYW50cyBmb3IgdGhlIG91dHB1dC5cbiAgICogQHBhcmFtIG9wdGlvbiBhbiBvcHRpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHRhcmdldCBlbnRpdGllc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19jb2xsZWN0RW50aXRpZXMob3B0aW9uOiBHbHRmMkV4cG9ydGVyQXJndW1lbnRzIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2hlY2tQYXNzT3JOb3RXaXRoVGFncyA9IChlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KSA9PiB7XG4gICAgICBpZiAoSXMuZXhpc3Qob3B0aW9uKSAmJiBJcy5leGlzdChvcHRpb24uZXhjbHVkZVRhZ3MpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIG9wdGlvbi5leGNsdWRlVGFncykge1xuICAgICAgICAgIGlmIChlbnRpdHkubWF0Y2hUYWcodGFnLnRhZywgdGFnLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBleGx1ZGVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRpdHkubWF0Y2hUYWcoJ0JlaW5nJywgJ2dpem1vJykpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBleGNsdWRlV2l0aFRhZ3MgPSAoZW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSkgPT4ge1xuICAgICAgaWYgKElzLmV4aXN0KG9wdGlvbikgJiYgSXMuZXhpc3Qob3B0aW9uLmV4Y2x1ZGVUYWdzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBvcHRpb24uZXhjbHVkZVRhZ3MpIHtcbiAgICAgICAgICBpZiAoZW50aXR5Lm1hdGNoVGFnKHRhZy50YWcsIHRhZy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZW50aXR5XTtcbiAgICB9O1xuICAgIGNvbnN0IGNvbGxlY3REZXNjZW5kYW50cyA9IChlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5LCByb290OiBib29sZWFuKTogSVNjZW5lR3JhcGhFbnRpdHlbXSA9PiB7XG4gICAgICBjb25zdCBzZyA9IGVudGl0eS5nZXRTY2VuZUdyYXBoKCkhO1xuICAgICAgaWYgKHNnLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYXJyYXk6IElTY2VuZUdyYXBoRW50aXR5W10gPSByb290ID8gW10gOiBleGNsdWRlV2l0aFRhZ3MoZW50aXR5KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gc2cuY2hpbGRyZW5baV07XG4gICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoYXJyYXksIGNvbGxlY3REZXNjZW5kYW50cyhjaGlsZC5lbnRpdHksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJvb3QgPyBbXSA6IGV4Y2x1ZGVXaXRoVGFncyhlbnRpdHkpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKElzLmV4aXN0KG9wdGlvbikgJiYgSXMuZXhpc3Qob3B0aW9uLmVudGl0aWVzKSAmJiBvcHRpb24uZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkRGVzY2VuZGFudHMgPSBvcHRpb24uZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PlxuICAgICAgICBjb2xsZWN0RGVzY2VuZGFudHMoZW50aXR5LCB0cnVlKVxuICAgICAgKTtcblxuICAgICAgbGV0IHRvcExldmVsRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10gPSBbXTtcbiAgICAgIG9wdGlvbi5lbnRpdGllcy5mb3JFYWNoKChlbnRpdHkpID0+IHtcbiAgICAgICAgLy8gaWYgKGNvbGxlY3RlZERlc2NlbmRhbnRzLmluZGV4T2YoZW50aXR5KSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKGNvbGxlY3RlZERlc2NlbmRhbnRzLmluZGV4T2YoZW50aXR5KSA9PT0gLTEgJiYgY2hlY2tQYXNzT3JOb3RXaXRoVGFncyhlbnRpdHkpKSB7XG4gICAgICAgICAgdG9wTGV2ZWxFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGV0IGNvbGxlY3RlZEVudGl0aWVzID0gb3B0aW9uLmVudGl0aWVzLmNvbmNhdCgpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoY29sbGVjdGVkRW50aXRpZXMsIGNvbGxlY3RlZERlc2NlbmRhbnRzKTtcbiAgICAgIGNvbGxlY3RlZEVudGl0aWVzID0gWy4uLm5ldyBTZXQoY29sbGVjdGVkRW50aXRpZXMpXTtcbiAgICAgIGlmICh0b3BMZXZlbEVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0b3BMZXZlbEVudGl0aWVzID0gY29sbGVjdGVkRW50aXRpZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2xsZWN0ZWRFbnRpdGllcywgdG9wTGV2ZWxFbnRpdGllcyB9O1xuICAgIH1cbiAgICBsZXQgY29sbGVjdGVkRW50aXRpZXMgPSBFbnRpdHlSZXBvc2l0b3J5Ll9nZXRFbnRpdGllcygpIGFzIHVua25vd24gYXMgSVNjZW5lR3JhcGhFbnRpdHlbXTtcbiAgICBjb2xsZWN0ZWRFbnRpdGllcyA9IGNvbGxlY3RlZEVudGl0aWVzLmZpbHRlcigoZW50aXR5KSA9PiBjaGVja1Bhc3NPck5vdFdpdGhUYWdzKGVudGl0eSkpO1xuICAgIGxldCB0b3BMZXZlbEVudGl0aWVzID0gU2NlbmVHcmFwaENvbXBvbmVudC5nZXRUb3BMZXZlbENvbXBvbmVudHMoKS5mbGF0TWFwKChjKSA9PiBjLmVudGl0eSk7XG4gICAgdG9wTGV2ZWxFbnRpdGllcyA9IHRvcExldmVsRW50aXRpZXMuZmlsdGVyKChlbnRpdHkpID0+IGNoZWNrUGFzc09yTm90V2l0aFRhZ3MoZW50aXR5KSk7XG5cbiAgICBjb2xsZWN0ZWRFbnRpdGllcyA9IGNvbGxlY3RlZEVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4gY29sbGVjdERlc2NlbmRhbnRzKGVudGl0eSwgdHJ1ZSkpO1xuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGNvbGxlY3RlZEVudGl0aWVzLCB0b3BMZXZlbEVudGl0aWVzKTtcbiAgICBjb2xsZWN0ZWRFbnRpdGllcyA9IFsuLi5uZXcgU2V0KGNvbGxlY3RlZEVudGl0aWVzKV07XG5cbiAgICByZXR1cm4geyBjb2xsZWN0ZWRFbnRpdGllcywgdG9wTGV2ZWxFbnRpdGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSB0aGUgYmFzZSBvZiBnbFRGMiBKU09OXG4gICAqIEBwYXJhbSBmaWxlbmFtZSB0YXJnZXQgb3V0cHV0IHBhdGhcbiAgICogQHJldHVybnMgdGhlIGpzb24gYW5kIGZpbGVOYW1lIGluIGEgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfX2NyZWF0ZUpzb25CYXNlKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVuYW1lID8gZmlsZW5hbWUgOiAnUmhvZG9uaXRlXycgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBqc29uOiBHbHRmMkV4ID0ge1xuICAgICAgYXNzZXQ6IHtcbiAgICAgICAgdmVyc2lvbjogJzIuMCcsXG4gICAgICAgIGdlbmVyYXRvcjogYFJob2Rvbml0ZSAoJHtWRVJTSU9OLnZlcnNpb259KWAsXG4gICAgICB9LFxuICAgICAgYnVmZmVyczogW3sgdXJpOiBmaWxlTmFtZSArICcuYmluJywgYnl0ZUxlbmd0aDogMCB9XSxcbiAgICAgIGJ1ZmZlclZpZXdzOiBbXSxcbiAgICAgIGFjY2Vzc29yczogW10sXG4gICAgICBhbmltYXRpb25zOiBbXSxcbiAgICAgIG1lc2hlczogW10sXG4gICAgICBza2luczogW10sXG4gICAgICBtYXRlcmlhbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHBick1ldGFsbGljUm91Z2huZXNzOiB7XG4gICAgICAgICAgICBiYXNlQ29sb3JGYWN0b3I6IFsxLjAsIDEuMCwgMS4wLCAxLjBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGV4dHVyZXM6IFtdLFxuICAgICAgaW1hZ2VzOiBbXSxcbiAgICAgIGV4dGVuc2lvbnNVc2VkOiBbXSxcbiAgICAgIGV4dGVuc2lvbnM6IHt9LFxuICAgICAgZXh0cmFzOiB7XG4gICAgICAgIHJuU2tpbnM6IFtdLFxuICAgICAgICBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkQXJyYXk6IFtdLFxuICAgICAgICAvLyBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkQXJyYXlbMF0gZm9yIGJ1ZmZlciAwXG4gICAgICAgIC8vIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheVsxXSBmb3IgYnVmZmVyIDFcbiAgICAgICAgLy8gLi4uXG4gICAgICB9LFxuICAgICAgY2FtZXJhczogW10sXG4gICAgICBzYW1wbGVyczogW10sXG4gICAgfTtcblxuICAgIHJldHVybiB7IGpzb24sIGZpbGVOYW1lIH07XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIEdsdGYyQnVmZmVyVmlld3MgYW5kIEdsdGYyQWNjZXNzb3JzIGZvciB0aGUgb3V0cHV0IGdsVEYyIEpTT05cbiAgICogQHBhcmFtIGpzb25cbiAgICogQHBhcmFtIGVudGl0aWVzXG4gICAqL1xuICBzdGF0aWMgX19jcmVhdGVCdWZmZXJWaWV3c0FuZEFjY2Vzc29ycyhqc29uOiBHbHRmMkV4LCBlbnRpdGllczogSVNjZW5lR3JhcGhFbnRpdHlbXSkge1xuICAgIGNvbnN0IGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJWaWV3czogQnVmZmVyVmlld1tdID0gW107XG4gICAgY29uc3QgZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29yczogQWNjZXNzb3JbXSA9IFtdO1xuXG4gICAgX19jcmVhdGVCdWZmZXJWaWV3c0FuZEFjY2Vzc29yc09mTWVzaChcbiAgICAgIGpzb24sXG4gICAgICBlbnRpdGllcyBhcyBJTWVzaEVudGl0eVtdLFxuICAgICAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlcnMsXG4gICAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3MsXG4gICAgICBleGlzdGluZ1VuaXF1ZVJuQWNjZXNzb3JzXG4gICAgKTtcblxuICAgIF9fY3JlYXRlQnVmZmVyVmlld3NBbmRBY2Nlc3NvcnNPZkFuaW1hdGlvbihqc29uLCBlbnRpdGllcyBhcyBJQW5pbWF0aW9uRW50aXR5W10pO1xuXG4gICAgX19jcmVhdGVCdWZmZXJWaWV3c0FuZEFjY2Vzc29yc09mU2tpbihcbiAgICAgIGpzb24sXG4gICAgICBlbnRpdGllcyBhcyBJU2tlbGV0YWxFbnRpdHlbXSxcbiAgICAgIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLFxuICAgICAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzLFxuICAgICAgZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29yc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIEdsdGYyTm9kZXMgZm9yIHRoZSBvdXRwdXQgZ2xURjIgSlNPTlxuICAgKiBAcGFyYW0ganNvbiBhIGdsVEYyIEpTT05cbiAgICogQHBhcmFtIGVudGl0aWVzIHRhcmdldCBlbnRpdGllc1xuICAgKiBAcGFyYW0gaW5kaWNlc09mR2x0Zk1lc2hlcyB0aGUgaW5kaWNlcyBvZiBHbHRmMk1lc2hlc1xuICAgKi9cbiAgc3RhdGljIF9fY3JlYXRlTm9kZXMoXG4gICAganNvbjogR2x0ZjJFeCxcbiAgICBlbnRpdGllczogSVNjZW5lR3JhcGhFbnRpdHlbXSxcbiAgICB0b3BMZXZlbEVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdXG4gICkge1xuICAgIGpzb24ubm9kZXMgPSBbXTtcbiAgICBqc29uLnNjZW5lcyA9IFt7IG5vZGVzOiBbXSB9XTtcbiAgICBjb25zdCBzY2VuZSA9IGpzb24uc2NlbmVzIVswXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllc1tpXTtcbiAgICAgIChlbnRpdHkgYXMgYW55KS5nbHRmTm9kZUluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBsZXQgbWVzaENvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllc1tpXTtcbiAgICAgIC8vIG5vZGUgaWRzIG9mIHRoZSBvdXRwdXQgZ2xURjIgZGF0YSB3aWxsIGJlIHRoZSBpbmRpY2VzIG9mIGVudGl0aWVzIChzcGVjaWZpZWQgdGFyZ2V0IGVudGl0aWVzKVxuICAgICAganNvbi5ub2Rlc1tpXSA9IHt9O1xuICAgICAgY29uc3Qgbm9kZSA9IGpzb24ubm9kZXNbaV07XG5cbiAgICAgIC8vIG5vZGUubmFtZVxuICAgICAgbm9kZS5uYW1lID0gZW50aXR5LnVuaXF1ZU5hbWU7XG5cbiAgICAgIC8vIG5vZGUuY2hpbGRyZW5cbiAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpITtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2NlbmVHcmFwaENvbXBvbmVudC5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bal07XG4gICAgICAgICAgaWYgKElzLmV4aXN0KChjaGlsZC5lbnRpdHkgYXMgYW55KS5nbHRmTm9kZUluZGV4KSkge1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKChjaGlsZC5lbnRpdHkgYXMgYW55KS5nbHRmTm9kZUluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjZW5lR3JhcGhDb21wb25lbnQuaXNCaWxsYm9hcmQpIHtcbiAgICAgICAgbm9kZS5leHRlbnNpb25zID0ge1xuICAgICAgICAgIFJIT0RPTklURV9iaWxsYm9hcmQ6IHtcbiAgICAgICAgICAgIGlzQmlsbGJvYXJkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGpzb24uZXh0ZW5zaW9uc1VzZWQuaW5kZXhPZignUkhPRE9OSVRFX2JpbGxib2FyZCcpID09PSAtMSkge1xuICAgICAgICAgIGpzb24uZXh0ZW5zaW9uc1VzZWQucHVzaCgnUkhPRE9OSVRFX2JpbGxib2FyZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1hdHJpeFxuICAgICAgY29uc3QgdHJhbnNmb3JtID0gZW50aXR5LmdldFRyYW5zZm9ybSgpITtcbiAgICAgIG5vZGUucm90YXRpb24gPSBbXG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uSW5uZXIueCxcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsUm90YXRpb25Jbm5lci55LFxuICAgICAgICB0cmFuc2Zvcm0ubG9jYWxSb3RhdGlvbklubmVyLnosXG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uSW5uZXIudyxcbiAgICAgIF07XG4gICAgICBub2RlLnNjYWxlID0gW1xuICAgICAgICB0cmFuc2Zvcm0ubG9jYWxTY2FsZUlubmVyLngsXG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbFNjYWxlSW5uZXIueSxcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsU2NhbGVJbm5lci56LFxuICAgICAgXTtcbiAgICAgIG5vZGUudHJhbnNsYXRpb24gPSBbXG4gICAgICAgIHRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uSW5uZXIueCxcbiAgICAgICAgdHJhbnNmb3JtLmxvY2FsUG9zaXRpb25Jbm5lci55LFxuICAgICAgICB0cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbklubmVyLnosXG4gICAgICBdO1xuXG4gICAgICAvLyBtZXNoXG4gICAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gZW50aXR5LnRyeVRvR2V0TWVzaCgpO1xuICAgICAgaWYgKElzLmV4aXN0KG1lc2hDb21wb25lbnQpICYmIElzLmV4aXN0KG1lc2hDb21wb25lbnQubWVzaCkpIHtcbiAgICAgICAgbm9kZS5tZXNoID0gbWVzaENvdW50Kys7XG4gICAgICB9XG5cbiAgICAgIC8vIEJsZW5kU2hhcGVcbiAgICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRCbGVuZFNoYXBlKCk7XG4gICAgICBpZiAoSXMuZXhpc3QoYmxlbmRTaGFwZUNvbXBvbmVudCkpIHtcbiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IGJsZW5kU2hhcGVDb21wb25lbnQud2VpZ2h0cztcbiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG5vZGUud2VpZ2h0cyA9IHdlaWdodHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2tpblxuICAgICAgY29uc3Qgc2tpbkNvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldFNrZWxldGFsKCk7XG4gICAgICBpZiAoSXMuZXhpc3Qoc2tpbkNvbXBvbmVudCkpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWR4ID0ganNvbi5leHRyYXMucm5Ta2lucy5pbmRleE9mKHNraW5Db21wb25lbnQuZW50aXR5IGFzIGFueSk7XG4gICAgICAgIGlmIChlbnRpdHlJZHggPj0gMCkge1xuICAgICAgICAgIG5vZGUuc2tpbiA9IGVudGl0eUlkeDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjYW1lcmFcbiAgICAgIGNvbnN0IGNhbWVyYUNvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldENhbWVyYSgpO1xuICAgICAgaWYgKElzLmV4aXN0KGNhbWVyYUNvbXBvbmVudCkpIHtcbiAgICAgICAgbGV0IGdsVEYyQ2FtZXJhOiBHbHRmMkNhbWVyYTtcbiAgICAgICAgaWYgKGNhbWVyYUNvbXBvbmVudC50eXBlID09PSBDYW1lcmFUeXBlLlBlcnNwZWN0aXZlKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxBc3BlY3QgPSBjYW1lcmFDb21wb25lbnQuZ2V0VGFnVmFsdWUoJ09yaWdpbmFsQXNwZWN0Jyk7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxGb3ZZID0gY2FtZXJhQ29tcG9uZW50LmdldFRhZ1ZhbHVlKCdPcmlnaW5hbEZvdlknKTtcbiAgICAgICAgICBnbFRGMkNhbWVyYSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGNhbWVyYUNvbXBvbmVudC5lbnRpdHkudW5pcXVlTmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdwZXJzcGVjdGl2ZScsXG4gICAgICAgICAgICBwZXJzcGVjdGl2ZToge1xuICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogSXMuZXhpc3Qob3JpZ2luYWxBc3BlY3QpID8gb3JpZ2luYWxBc3BlY3QgOiBjYW1lcmFDb21wb25lbnQuYXNwZWN0LFxuICAgICAgICAgICAgICB5Zm92OiBJcy5leGlzdChvcmlnaW5hbEZvdlkpXG4gICAgICAgICAgICAgICAgPyBNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbihvcmlnaW5hbEZvdlkpXG4gICAgICAgICAgICAgICAgOiBNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbihjYW1lcmFDb21wb25lbnQuZm92eSksXG4gICAgICAgICAgICAgIHpuZWFyOiBjYW1lcmFDb21wb25lbnQuek5lYXIsXG4gICAgICAgICAgICAgIHpmYXI6IGNhbWVyYUNvbXBvbmVudC56RmFyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIEdsdGYyQ2FtZXJhO1xuICAgICAgICB9IGVsc2UgaWYgKGNhbWVyYUNvbXBvbmVudC50eXBlID09PSBDYW1lcmFUeXBlLk9ydGhvZ3JhcGhpYykge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsWE1hZyA9IGNhbWVyYUNvbXBvbmVudC5nZXRUYWdWYWx1ZSgnT3JpZ2luYWxYTWFnJyk7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxZTWFnID0gY2FtZXJhQ29tcG9uZW50LmdldFRhZ1ZhbHVlKCdPcmlnaW5hbFlNYWcnKTtcbiAgICAgICAgICBnbFRGMkNhbWVyYSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGNhbWVyYUNvbXBvbmVudC5lbnRpdHkudW5pcXVlTmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdvcnRob2dyYXBoaWMnLFxuICAgICAgICAgICAgb3J0aG9ncmFwaGljOiB7XG4gICAgICAgICAgICAgIHhtYWc6IElzLmV4aXN0KG9yaWdpbmFsWE1hZykgPyBvcmlnaW5hbFhNYWcgOiBjYW1lcmFDb21wb25lbnQueE1hZyxcbiAgICAgICAgICAgICAgeW1hZzogSXMuZXhpc3Qob3JpZ2luYWxZTWFnKSA/IG9yaWdpbmFsWU1hZyA6IGNhbWVyYUNvbXBvbmVudC55TWFnLFxuICAgICAgICAgICAgICB6bmVhcjogY2FtZXJhQ29tcG9uZW50LnpOZWFyLFxuICAgICAgICAgICAgICB6ZmFyOiBjYW1lcmFDb21wb25lbnQuekZhcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBHbHRmMkNhbWVyYTtcbiAgICAgICAgfVxuICAgICAgICBqc29uLmNhbWVyYXMucHVzaChnbFRGMkNhbWVyYSEpO1xuICAgICAgICBub2RlLmNhbWVyYSA9IGpzb24uY2FtZXJhcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBlbnRpdHkgaGFzIG5vIHBhcmVudCwgaXQgbXVzdCBiZSBhIHRvcCBsZXZlbCBlbnRpdHkgaW4gdGhlIHNjZW5lIGdyYXBoLlxuICAgIHRvcExldmVsRW50aXRpZXMuZm9yRWFjaCgoZW50aXR5LCBpKSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBlbnRpdGllcy5pbmRleE9mKGVudGl0eSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgc2NlbmUubm9kZXMhLnB1c2goaWR4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgR2x0ZjJNYXRlcmlhbHMgYW5kIHNldCB0aGVtIHRvIEdsdGYyUHJpbWl0aXZlcyBmb3IgdGhlIG91dHB1dCBnbFRGMiBKU09OXG4gICAqIEBwYXJhbSBqc29uIGEgZ2xURjIgSlNPTlxuICAgKiBAcGFyYW0gZW50aXRpZXMgYWxsIHRhcmdldCBlbnRpdGllc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9fY3JlYXRlTWF0ZXJpYWxzKFxuICAgIGpzb246IEdsdGYyRXgsXG4gICAgZW50aXRpZXM6IElNZXNoRW50aXR5W10sXG4gICAgb3B0aW9uOiBHbHRmMkV4cG9ydGVyQXJndW1lbnRzXG4gICkge1xuICAgIGxldCBjb3VudE1lc2ggPSAwO1xuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgIGpzb24uZXh0cmFzLmJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheS5wdXNoKDApO1xuICAgIGNvbnN0IGJ1ZmZlcklkeCA9IGpzb24uZXh0cmFzLmJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheS5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50aXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGVudGl0aWVzW2ldO1xuICAgICAgY29uc3QgbWVzaENvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldE1lc2goKTtcbiAgICAgIGlmIChtZXNoQ29tcG9uZW50ICYmIG1lc2hDb21wb25lbnQubWVzaCkge1xuICAgICAgICBjb25zdCBnbHRmMk1lc2ggPSBqc29uLm1lc2hlcyFbY291bnRNZXNoKytdO1xuICAgICAgICBjb25zdCBwcmltaXRpdmVDb3VudCA9IG1lc2hDb21wb25lbnQubWVzaC5nZXRQcmltaXRpdmVOdW1iZXIoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwcmltaXRpdmVDb3VudDsgaisrKSB7XG4gICAgICAgICAgY29uc3Qgcm5QcmltaXRpdmUgPSBtZXNoQ29tcG9uZW50Lm1lc2guZ2V0UHJpbWl0aXZlQXQoaik7XG4gICAgICAgICAgY29uc3QgcHJpbWl0aXZlID0gZ2x0ZjJNZXNoLnByaW1pdGl2ZXNbal07XG4gICAgICAgICAgY29uc3Qgcm5NYXRlcmlhbCA9IHJuUHJpbWl0aXZlLm1hdGVyaWFsITtcblxuICAgICAgICAgIGNvbnN0IG1hdGVyaWFsOiBHbHRmMk1hdGVyaWFsRXggPSB7XG4gICAgICAgICAgICBwYnJNZXRhbGxpY1JvdWdobmVzczoge1xuICAgICAgICAgICAgICBtZXRhbGxpY0ZhY3RvcjogMS4wLFxuICAgICAgICAgICAgICByb3VnaG5lc3NGYWN0b3I6IDEuMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGxldCBjb2xvclBhcmFtO1xuICAgICAgICAgIGlmIChJcy5leGlzdChybk1hdGVyaWFsKSkge1xuICAgICAgICAgICAgaWYgKElzLmZhbHNlKHJuTWF0ZXJpYWwuaXNMaWdodGluZykpIHtcbiAgICAgICAgICAgICAgaWYgKElzLm5vdC5leGlzdChtYXRlcmlhbC5leHRlbnNpb25zKSkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmV4dGVuc2lvbnMgPSB7fTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXRlcmlhbC5leHRlbnNpb25zLktIUl9tYXRlcmlhbHNfdW5saXQgPSB7fTtcbiAgICAgICAgICAgICAgaWYgKGpzb24uZXh0ZW5zaW9uc1VzZWQuaW5kZXhPZignS0hSX21hdGVyaWFsc191bmxpdCcpIDwgMCkge1xuICAgICAgICAgICAgICAgIGpzb24uZXh0ZW5zaW9uc1VzZWQucHVzaCgnS0hSX21hdGVyaWFsc191bmxpdCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xvclBhcmFtID0gcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ2Jhc2VDb2xvckZhY3RvcicpO1xuICAgICAgICAgICAgaWYgKElzLm5vdC5leGlzdChjb2xvclBhcmFtKSkge1xuICAgICAgICAgICAgICBjb2xvclBhcmFtID0gcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ2RpZmZ1c2VDb2xvckZhY3RvcicpO1xuICAgICAgICAgICAgICBpZiAoSXMubm90LmV4aXN0KGNvbG9yUGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgY29sb3JQYXJhbSA9IFZlY3RvcjQuZnJvbUNvcHk0KDEsIDEsIDEsIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtYXRlcmlhbC5wYnJNZXRhbGxpY1JvdWdobmVzcy5tZXRhbGxpY0ZhY3RvciA9XG4gICAgICAgICAgICAgICAgcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ21ldGFsbGljUm91Z2huZXNzRmFjdG9yJykueDtcbiAgICAgICAgICAgICAgbWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3Mucm91Z2huZXNzRmFjdG9yID1cbiAgICAgICAgICAgICAgICBybk1hdGVyaWFsLmdldFBhcmFtZXRlcignbWV0YWxsaWNSb3VnaG5lc3NGYWN0b3InKS55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3MuYmFzZUNvbG9yRmFjdG9yID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoXG4gICAgICAgICAgICAgIGNvbG9yUGFyYW0uX3ZcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG1hdGVyaWFsLmFscGhhTW9kZSA9IHJuTWF0ZXJpYWwuYWxwaGFNb2RlLnRvR2x0ZlN0cmluZygpO1xuXG4gICAgICAgICAgICBjb25zdCBleGlzdGVkSW1hZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzVGV4dHVyZSA9IChyblRleHR1cmU6IEFic3RyYWN0VGV4dHVyZSwgcm5TYW1wbGVyPzogU2FtcGxlcikgPT4ge1xuICAgICAgICAgICAgICBpZiAocm5UZXh0dXJlICYmIHJuVGV4dHVyZS53aWR0aCA+IDEgJiYgcm5UZXh0dXJlLmhlaWdodCA+IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW1hZ2VJbmRleCA9IGpzb24uaW1hZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGpzb24uaW1hZ2VzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGpzb24uaW1hZ2VzIVtrXTtcbiAgICAgICAgICAgICAgICAgIGlmIChJcy5leGlzdChpbWFnZS5yblRleHR1cmVVSUQpICYmIGltYWdlLnJuVGV4dHVyZVVJRCA9PT0gcm5UZXh0dXJlLnRleHR1cmVVSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9IGs7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTYW1wbGVyXG4gICAgICAgICAgICAgICAgbGV0IHNhbXBsZXJJZHggPSAtMTtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBnbHRmMlRleHR1cmVTYW1wbGVyOiBHbHRmMlRleHR1cmVTYW1wbGVyID0ge1xuICAgICAgICAgICAgICAgICAgICBtYWdGaWx0ZXI6XG4gICAgICAgICAgICAgICAgICAgICAgcm5TYW1wbGVyICE9IG51bGwgPyByblNhbXBsZXIubWFnRmlsdGVyLmluZGV4IDogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIG1pbkZpbHRlcjpcbiAgICAgICAgICAgICAgICAgICAgICByblNhbXBsZXIgIT0gbnVsbCA/IHJuU2FtcGxlci5taW5GaWx0ZXIuaW5kZXggOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhci5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgd3JhcFM6XG4gICAgICAgICAgICAgICAgICAgICAgcm5TYW1wbGVyICE9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcm5TYW1wbGVyLndyYXBTLmluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IFRleHR1cmVQYXJhbWV0ZXIuVGV4dHVyZVdyYXBTLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICB3cmFwVDpcbiAgICAgICAgICAgICAgICAgICAgICByblNhbXBsZXIgIT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyByblNhbXBsZXIud3JhcFQuaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogVGV4dHVyZVBhcmFtZXRlci5UZXh0dXJlV3JhcFQuaW5kZXgsXG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICBzYW1wbGVySWR4ID0ganNvbi5zYW1wbGVycy5maW5kSW5kZXgoKHNhbXBsZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2FtZUdsVEYyVGV4dHVyZVNhbXBsZXIoZ2x0ZjJUZXh0dXJlU2FtcGxlciwgc2FtcGxlcik7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGVySWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBqc29uLnNhbXBsZXJzLnB1c2goZ2x0ZjJUZXh0dXJlU2FtcGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZXJJZHggPSBqc29uLnNhbXBsZXJzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgLy8gSW1hZ2VcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdsVEYySW1hZ2VFeDogR2x0ZjJJbWFnZUV4ID0ge1xuICAgICAgICAgICAgICAgICAgICB1cmk6IHJuVGV4dHVyZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGdsVEYySW1hZ2VFeC5yblRleHR1cmVVSUQgPSByblRleHR1cmUudGV4dHVyZVVJRDtcblxuICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0ZWRJbWFnZXMuaW5kZXhPZihyblRleHR1cmUubmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsVEYySW1hZ2VFeC51cmkgKz0gJ18nICsgcm5UZXh0dXJlLnRleHR1cmVVSUQ7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGV4aXN0ZWRJbWFnZXMucHVzaChnbFRGMkltYWdlRXgudXJpISk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChJcy5ub3QuZXhpc3QoZ2xURjJJbWFnZUV4LnVyaSEubWF0Y2goL1xcLihwbmcpLykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsVEYySW1hZ2VFeC51cmkgKz0gJy5wbmcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbENhbnZhc0VsZW1lbnQgPSByblRleHR1cmUuaHRtbENhbnZhc0VsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICBpZiAoaHRtbENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2PzogQXJyYXlCdWZmZXIpID0+IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZDogKHJlYXNvbj86IERPTUV4Y2VwdGlvbikgPT4gdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbENhbnZhc0VsZW1lbnQudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJcy5leGlzdChibG9iKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHR1cmVJbWFnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xURjJJbWFnZUV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignY2FudmFzIHRvIGJsb2IgZXJyb3IhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGpzb24uaW1hZ2VzLnB1c2goZ2xURjJJbWFnZUV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBnbHRmMlRleHR1cmU6IEdsdGYyVGV4dHVyZSA9IHtcbiAgICAgICAgICAgICAgICAgIHNhbXBsZXI6IHNhbXBsZXJJZHgsXG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IGltYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0dXJlSWR4ID0ganNvbi50ZXh0dXJlcy5pbmRleE9mKGdsdGYyVGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVJZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICBqc29uLnRleHR1cmVzLnB1c2goZ2x0ZjJUZXh0dXJlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ganNvbi50ZXh0dXJlcy5pbmRleE9mKGdsdGYyVGV4dHVyZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCB0ZXh0dXJlUGFyYW0gPSBybk1hdGVyaWFsLmdldFBhcmFtZXRlcignYmFzZUNvbG9yVGV4dHVyZScpO1xuICAgICAgICAgICAgbGV0IHRleHR1cmVJbmRleDtcbiAgICAgICAgICAgIGlmICh0ZXh0dXJlUGFyYW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCByblRleHR1cmUgPSB0ZXh0dXJlUGFyYW1bMV0gYXMgVGV4dHVyZTtcbiAgICAgICAgICAgICAgY29uc3Qgcm5TYW1wbGVyID0gdGV4dHVyZVBhcmFtWzJdIGFzIFNhbXBsZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRleHR1cmVJbmRleCA9IHByb2Nlc3NUZXh0dXJlKHJuVGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICAgICAgICAgICAgaWYgKHRleHR1cmVJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3MuYmFzZUNvbG9yVGV4dHVyZSA9IHtcbiAgICAgICAgICAgICAgICAgIGluZGV4OiB0ZXh0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGV4dHVyZVBhcmFtID0gcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ2RpZmZ1c2VDb2xvclRleHR1cmUnKTtcbiAgICAgICAgICAgICAgaWYgKHRleHR1cmVQYXJhbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm5UZXh0dXJlID0gdGV4dHVyZVBhcmFtWzFdIGFzIFRleHR1cmU7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm5TYW1wbGVyID0gdGV4dHVyZVBhcmFtWzJdIGFzIFNhbXBsZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dHVyZUluZGV4ID0gcHJvY2Vzc1RleHR1cmUocm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3MuZGlmZnVzZUNvbG9yVGV4dHVyZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRleHR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRleHR1cmVQYXJhbSA9IHJuTWF0ZXJpYWwuZ2V0UGFyYW1ldGVyKCdtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUnKSBhcyBBYnN0cmFjdFRleHR1cmU7XG4gICAgICAgICAgICBpZiAodGV4dHVyZVBhcmFtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJuVGV4dHVyZSA9IHRleHR1cmVQYXJhbVsxXSBhcyBUZXh0dXJlO1xuICAgICAgICAgICAgICBjb25zdCByblNhbXBsZXIgPSB0ZXh0dXJlUGFyYW1bMl0gYXMgU2FtcGxlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdGV4dHVyZUluZGV4ID0gcHJvY2Vzc1RleHR1cmUocm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgICAgICAgICAgICBpZiAodGV4dHVyZUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5wYnJNZXRhbGxpY1JvdWdobmVzcy5tZXRhbGxpY1JvdWdobmVzc1RleHR1cmUgPSB7XG4gICAgICAgICAgICAgICAgICBpbmRleDogdGV4dHVyZUluZGV4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGV4dHVyZVBhcmFtID0gcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ25vcm1hbFRleHR1cmUnKSBhcyBBYnN0cmFjdFRleHR1cmU7XG4gICAgICAgICAgICBpZiAodGV4dHVyZVBhcmFtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJuVGV4dHVyZSA9IHRleHR1cmVQYXJhbVsxXSBhcyBUZXh0dXJlO1xuICAgICAgICAgICAgICBjb25zdCByblNhbXBsZXIgPSB0ZXh0dXJlUGFyYW1bMl0gYXMgU2FtcGxlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdGV4dHVyZUluZGV4ID0gcHJvY2Vzc1RleHR1cmUocm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgICAgICAgICAgICBpZiAodGV4dHVyZUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5ub3JtYWxUZXh0dXJlID0geyBpbmRleDogdGV4dHVyZUluZGV4IH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGV4dHVyZVBhcmFtID0gcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ29jY2x1c2lvblRleHR1cmUnKSBhcyBBYnN0cmFjdFRleHR1cmU7XG4gICAgICAgICAgICBpZiAodGV4dHVyZVBhcmFtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJuVGV4dHVyZSA9IHRleHR1cmVQYXJhbVsxXSBhcyBUZXh0dXJlO1xuICAgICAgICAgICAgICBjb25zdCByblNhbXBsZXIgPSB0ZXh0dXJlUGFyYW1bMl0gYXMgU2FtcGxlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdGV4dHVyZUluZGV4ID0gcHJvY2Vzc1RleHR1cmUocm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgICAgICAgICAgICBpZiAodGV4dHVyZUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5vY2NsdXNpb25UZXh0dXJlID0geyBpbmRleDogdGV4dHVyZUluZGV4IH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGV4dHVyZVBhcmFtID0gcm5NYXRlcmlhbC5nZXRQYXJhbWV0ZXIoJ2VtaXNzaXZlVGV4dHVyZScpIGFzIEFic3RyYWN0VGV4dHVyZTtcbiAgICAgICAgICAgIGlmICh0ZXh0dXJlUGFyYW0pIHtcbiAgICAgICAgICAgICAgY29uc3Qgcm5UZXh0dXJlID0gdGV4dHVyZVBhcmFtWzFdIGFzIFRleHR1cmU7XG4gICAgICAgICAgICAgIGNvbnN0IHJuU2FtcGxlciA9IHRleHR1cmVQYXJhbVsyXSBhcyBTYW1wbGVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB0ZXh0dXJlSW5kZXggPSBwcm9jZXNzVGV4dHVyZShyblRleHR1cmUsIHJuU2FtcGxlcik7XG4gICAgICAgICAgICAgIGlmICh0ZXh0dXJlSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmVtaXNzaXZlVGV4dHVyZSA9IHsgaW5kZXg6IHRleHR1cmVJbmRleCB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW1hZ2VJZHggPSBqc29uLm1hdGVyaWFscy5pbmRleE9mKG1hdGVyaWFsKTtcbiAgICAgICAgICBpZiAoaW1hZ2VJZHggPT09IC0xKSB7XG4gICAgICAgICAgICBqc29uLm1hdGVyaWFscy5wdXNoKG1hdGVyaWFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbWl0aXZlLm1hdGVyaWFsID0ganNvbi5tYXRlcmlhbHMuaW5kZXhPZihtYXRlcmlhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgdGhlIGFycmF5YnVmZmVyIG9mIHRoZSBnbFRGMiAuYmluIGZpbGUgYW5kIHdyaXRlIGFsbCBhY2Nlc3NvcnMgZGF0YSB0byB0aGUgYXJyYXlidWZmZXJcbiAgICogQHBhcmFtIGpzb24gYSBnbFRGMiBKU09OXG4gICAqIEByZXR1cm5zIEEgYXJyYXlidWZmZXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fY3JlYXRlQmluYXJ5KGpzb246IEdsdGYyRXgpIHtcbiAgICAvLyB3cml0ZSBhbGwgZGF0YSBvZiBhY2Nlc3NvcnMgdG8gdGhlIERhdGFWaWV3ICh0b3RhbCBkYXRhIGFyZWEpXG4gICAgaWYgKElzLnVuZGVmaW5lZChqc29uLmFjY2Vzc29ycykgfHwgSXMudW5kZWZpbmVkKGpzb24uYnVmZmVyVmlld3MpKSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIH1cblxuICAgIC8vIGNhbGMgdG90YWwgc3VtIG9mIEJ1ZmZlclZpZXdzIGluIG11bHRpcGxlIEJ1ZmZlcnNcbiAgICBjb25zdCBieXRlTGVuZ3RoT2ZVbml0ZUJ1ZmZlciA9IGpzb24uZXh0cmFzLmJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheS5yZWR1Y2UoXG4gICAgICAoc3VtLCB2YWwpID0+IHN1bSArIHZhbFxuICAgICk7XG4gICAgaWYgKGJ5dGVMZW5ndGhPZlVuaXRlQnVmZmVyID4gMCkge1xuICAgICAgY29uc3QgYnVmZmVyID0ganNvbi5idWZmZXJzIVswXTtcbiAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoID1cbiAgICAgICAgYnl0ZUxlbmd0aE9mVW5pdGVCdWZmZXIgKyBEYXRhVXRpbC5jYWxjUGFkZGluZ0J5dGVzKGJ5dGVMZW5ndGhPZlVuaXRlQnVmZmVyLCA0KTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgdGhlIEFycmF5QnVmZmVyIG9mIHVuaXRlIEJ1ZmZlciAoY29uc2lzdCBvZiBtdWx0aXBsZSBCdWZmZXJzKVxuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGpzb24uYnVmZmVycyFbMF0uYnl0ZUxlbmd0aCk7XG5cbiAgICAvLyBjb3B5IEJ1ZmZlclZpZXdzIGluIG11bHRpcGxlIEJ1ZmZlciB0byB0aGUgVW5pdGUgQnVmZmVyXG4gICAgbGV0IGxhc3RDb3BpZWRCeXRlTGVuZ3RoT2ZCdWZmZXJWaWV3ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24uYnVmZmVyVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBqc29uLmJ1ZmZlclZpZXdzW2ldO1xuICAgICAgY29uc3QgdWludDhBcnJheU9mQnVmZmVyVmlldyA9IGJ1ZmZlclZpZXcuZXh0cmFzIS51aW50OEFycmF5ITtcbiAgICAgIGRlbGV0ZSAoYnVmZmVyVmlldyBhcyB1bmtub3duIGFzIEdsdGYyKS5leHRyYXM7XG5cbiAgICAgIGNvbnN0IGRpc3RCeXRlT2Zmc2V0ID0gbGFzdENvcGllZEJ5dGVMZW5ndGhPZkJ1ZmZlclZpZXc7XG4gICAgICBEYXRhVXRpbC5jb3B5QXJyYXlCdWZmZXJXaXRoUGFkZGluZyh7XG4gICAgICAgIHNyYzogdWludDhBcnJheU9mQnVmZmVyVmlldy5idWZmZXIsXG4gICAgICAgIGRpc3Q6IGFycmF5QnVmZmVyLFxuICAgICAgICBzcmNCeXRlT2Zmc2V0OiB1aW50OEFycmF5T2ZCdWZmZXJWaWV3LmJ5dGVPZmZzZXQsXG4gICAgICAgIGNvcHlCeXRlTGVuZ3RoOiB1aW50OEFycmF5T2ZCdWZmZXJWaWV3LmJ5dGVMZW5ndGgsXG4gICAgICAgIGRpc3RCeXRlT2Zmc2V0LFxuICAgICAgfSk7XG4gICAgICBsYXN0Q29waWVkQnl0ZUxlbmd0aE9mQnVmZmVyVmlldyArPSBEYXRhVXRpbC5hZGRQYWRkaW5nQnl0ZXMoXG4gICAgICAgIHVpbnQ4QXJyYXlPZkJ1ZmZlclZpZXcuYnl0ZUxlbmd0aCxcbiAgICAgICAgNFxuICAgICAgKTtcbiAgICAgIGJ1ZmZlclZpZXcuYnl0ZU9mZnNldCA9IGRpc3RCeXRlT2Zmc2V0O1xuICAgICAgYnVmZmVyVmlldy5idWZmZXIgPSAwOyAvLyByZXdyaXRlIGJ1ZmZlciBpbmRleCB0byAwIChUaGUgVW5pdGUgQnVmZmVyKVxuICAgIH1cblxuICAgIHJldHVybiBhcnJheUJ1ZmZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBkb3dubG9hZCB0aGUgZ2xURjIgZmlsZXNcbiAgICogQHBhcmFtIGpzb24gYSBnbFRGMiBKU09OXG4gICAqIEBwYXJhbSBmaWxlbmFtZSB0YXJnZXQgb3V0cHV0IHBhdGhcbiAgICogQHBhcmFtIGFycmF5YnVmZmVyIGFuIEFycmF5QnVmZmVyIG9mIHRoZSAuYmluIGZpbGVcbiAgICovXG4gIHN0YXRpYyBfX2Rvd25sb2FkR2xiKGpzb246IEdsdGYyLCBmaWxlbmFtZTogc3RyaW5nLCBhcnJheWJ1ZmZlcjogQXJyYXlCdWZmZXIpOiB2b2lkIHtcbiAgICB7XG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lICsgJy5nbGInO1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJheWJ1ZmZlcl0sIHsgdHlwZTogJ29jdGV0L3N0cmVhbScgfSk7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuXG4gICAgICBjb25zdCBlID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJyk7XG4gICAgICBhLmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0R2xiQXNBcnJheUJ1ZmZlcigpIHt9XG5cbiAgLyoqXG4gICAqIGRvd25sb2FkIHRoZSBnbFRGMiBmaWxlc1xuICAgKiBAcGFyYW0ganNvbiBhIGdsVEYyIEpTT05cbiAgICogQHBhcmFtIGZpbGVuYW1lIHRhcmdldCBvdXRwdXQgcGF0aFxuICAgKiBAcGFyYW0gYXJyYXlidWZmZXIgYW4gQXJyYXlCdWZmZXIgb2YgdGhlIC5iaW4gZmlsZVxuICAgKi9cbiAgc3RhdGljIF9fZG93bmxvYWRHbHRmKGpzb246IEdsdGYyLCBmaWxlbmFtZTogc3RyaW5nLCBhcnJheWJ1ZmZlcjogQXJyYXlCdWZmZXIpOiB2b2lkIHtcbiAgICB7XG4gICAgICAvLyAuZ2x0ZiBmaWxlXG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWUgKyAnLmdsdGYnO1xuICAgICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoanNvbiwgbnVsbCwgMik7XG4gICAgICBhLmhyZWYgPSAnZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0sJyArIGVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xuXG4gICAgICBjb25zdCBlID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJyk7XG4gICAgICBhLmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgfVxuICAgIHtcbiAgICAgIC8vIC5iaW4gZmlsZVxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZSArICcuYmluJztcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXJyYXlidWZmZXJdLCB7IHR5cGU6ICdvY3RldC9zdHJlYW0nIH0pO1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgIGNvbnN0IGUgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snKTtcbiAgICAgIGEuZGlzcGF0Y2hFdmVudChlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVHbGJBcnJheUJ1ZmZlcihqc29uOiBHbHRmMiwgYXJyYXlidWZmZXI6IEFycmF5QnVmZmVyKSB7XG4gIGNvbnN0IGhlYWRlckJ5dGVzID0gMTI7IC8vIDEyYnl0ZS1oZWFkZXJcblxuICAvLyAuZ2xiIGZpbGVcbiAgZGVsZXRlIGpzb24uYnVmZmVycyFbMF0udXJpO1xuICBsZXQganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDIpO1xuICBsZXQganNvbkFycmF5QnVmZmVyID0gRGF0YVV0aWwuc3RyaW5nVG9CdWZmZXIoanNvblN0cik7XG4gIGNvbnN0IHBhZGRpbmdCeXRlcyA9IERhdGFVdGlsLmNhbGNQYWRkaW5nQnl0ZXMoanNvbkFycmF5QnVmZmVyLmJ5dGVMZW5ndGgsIDQpO1xuICBpZiAocGFkZGluZ0J5dGVzID4gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFkZGluZ0J5dGVzOyBpKyspIHtcbiAgICAgIGpzb25TdHIgKz0gJyAnO1xuICAgIH1cbiAgICBqc29uQXJyYXlCdWZmZXIgPSBEYXRhVXRpbC5zdHJpbmdUb0J1ZmZlcihqc29uU3RyKTtcbiAgfVxuICBjb25zdCBqc29uQ2h1bmtMZW5ndGggPSBqc29uQXJyYXlCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgY29uc3QgaGVhZGVyQW5kQ2h1bmswID0gaGVhZGVyQnl0ZXMgKyA0ICsgNCArIGpzb25DaHVua0xlbmd0aDsgLy8gQ2h1bmstMFxuICBjb25zdCB0b3RhbEJ5dGVzID0gaGVhZGVyQW5kQ2h1bmswICsgNCArIDQgKyBhcnJheWJ1ZmZlci5ieXRlTGVuZ3RoOyAvLyBDaHVuay0xXG5cbiAgY29uc3QgZ2xiQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodG90YWxCeXRlcyk7XG4gIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGdsYkFycmF5QnVmZmVyKTtcbiAgZGF0YVZpZXcuc2V0VWludDMyKDAsIDB4NDY1NDZjNjcsIHRydWUpO1xuICBkYXRhVmlldy5zZXRVaW50MzIoNCwgMiwgdHJ1ZSk7XG4gIGRhdGFWaWV3LnNldFVpbnQzMig4LCB0b3RhbEJ5dGVzLCB0cnVlKTtcbiAgZGF0YVZpZXcuc2V0VWludDMyKDEyLCBqc29uQXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCwgdHJ1ZSk7XG4gIGRhdGFWaWV3LnNldFVpbnQzMigxNiwgMHg0ZTRmNTM0YSwgdHJ1ZSk7XG5cbiAgRGF0YVV0aWwuY29weUFycmF5QnVmZmVyQXM0Qnl0ZXMoe1xuICAgIHNyYzoganNvbkFycmF5QnVmZmVyLFxuICAgIGRpc3Q6IGdsYkFycmF5QnVmZmVyLFxuICAgIHNyY0J5dGVPZmZzZXQ6IDAsXG4gICAgY29weUJ5dGVMZW5ndGg6IGpzb25BcnJheUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgIGRpc3RCeXRlT2Zmc2V0OiAyMCxcbiAgfSk7XG4gIERhdGFVdGlsLmNvcHlBcnJheUJ1ZmZlckFzNEJ5dGVzKHtcbiAgICBzcmM6IGFycmF5YnVmZmVyLFxuICAgIGRpc3Q6IGdsYkFycmF5QnVmZmVyLFxuICAgIHNyY0J5dGVPZmZzZXQ6IDAsXG4gICAgY29weUJ5dGVMZW5ndGg6IGFycmF5YnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgZGlzdEJ5dGVPZmZzZXQ6IDIwICsganNvbkNodW5rTGVuZ3RoICsgOCxcbiAgfSk7XG4gIGRhdGFWaWV3LnNldFVpbnQzMihoZWFkZXJBbmRDaHVuazAsIGFycmF5YnVmZmVyLmJ5dGVMZW5ndGgsIHRydWUpO1xuICBkYXRhVmlldy5zZXRVaW50MzIoaGVhZGVyQW5kQ2h1bmswICsgNCwgMHgwMDRlNDk0MiwgdHJ1ZSk7XG4gIHJldHVybiBnbGJBcnJheUJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBjcmVhdGUgR2x0ZjJTa2luc1xuICogQHBhcmFtIGpzb24gYSBnbFRGMiBKU09OXG4gKiBAcGFyYW0gZW50aXRpZXMgYWxsIHRhcmdldCBlbnRpdGllc1xuICovXG5mdW5jdGlvbiBfX2NyZWF0ZUJ1ZmZlclZpZXdzQW5kQWNjZXNzb3JzT2ZTa2luKFxuICBqc29uOiBHbHRmMkV4LFxuICBlbnRpdGllczogSVNrZWxldGFsRW50aXR5W10sXG4gIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzOiBCdWZmZXJbXSxcbiAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzOiBCdWZmZXJWaWV3W10sXG4gIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnM6IEFjY2Vzc29yW11cbikge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbaV07XG4gICAgY29uc3Qgc2tlbGV0YWxDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgIGlmIChJcy5ub3QuZXhpc3Qoc2tlbGV0YWxDb21wb25lbnQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAganNvbi5leHRyYXMucm5Ta2lucy5wdXNoKHNrZWxldGFsQ29tcG9uZW50LmVudGl0eSBhcyBhbnkpO1xuICAgIGNvbnN0IGpvaW50U2NlbmVDb21wb25lbnRzT2ZUaGVFbnRpdHkgPSBza2VsZXRhbENvbXBvbmVudC5nZXRKb2ludHMoKTtcbiAgICBjb25zdCBqb2ludEluZGljZXNPZlRoZUVudGl0eTogSW5kZXhbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgam9pbnRTY2VuZUNvbXBvbmVudCBvZiBqb2ludFNjZW5lQ29tcG9uZW50c09mVGhlRW50aXR5KSB7XG4gICAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHlPYmosIGopID0+IHtcbiAgICAgICAgaWYgKGpvaW50U2NlbmVDb21wb25lbnQuZW50aXR5ID09PSBlbnRpdHlPYmopIHtcbiAgICAgICAgICBqb2ludEluZGljZXNPZlRoZUVudGl0eS5wdXNoKGopO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZlcnNlQmluZE1hdFJuQWNjZXNzb3IgPSBza2VsZXRhbENvbXBvbmVudC5nZXRJbnZlcnNlQmluZE1hdHJpY2VzQWNjZXNzb3IoKTtcbiAgICBpZiAoSXMuZXhpc3QoaW52ZXJzZUJpbmRNYXRSbkFjY2Vzc29yKSkge1xuICAgICAgY3JlYXRlT3JSZXVzZUdsdGYyQnVmZmVyVmlldyhcbiAgICAgICAganNvbixcbiAgICAgICAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlcnMsXG4gICAgICAgIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJWaWV3cyxcbiAgICAgICAgaW52ZXJzZUJpbmRNYXRSbkFjY2Vzc29yLmJ1ZmZlclZpZXdcbiAgICAgICk7XG5cbiAgICAgIGNyZWF0ZU9yUmV1c2VHbHRmMkFjY2Vzc29yKFxuICAgICAgICBqc29uLFxuICAgICAgICBqc29uLmJ1ZmZlclZpZXdzLmxlbmd0aCAtIDEsXG4gICAgICAgIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnMsXG4gICAgICAgIGludmVyc2VCaW5kTWF0Um5BY2Nlc3NvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b3BPZkpvaW50c1NrZWxldG9uU2NlbmVDb21wb25lbnQgPSBza2VsZXRhbENvbXBvbmVudC50b3BPZkpvaW50c0hpZXJhcmNoeTtcbiAgICBjb25zdCBiaW5kU2hhcGVNYXRyaXggPSBza2VsZXRhbENvbXBvbmVudC5fYmluZFNoYXBlTWF0cml4O1xuICAgIGxldCBza2VsZXRhbElkeCA9IC0xO1xuICAgIGlmIChJcy5leGlzdCh0b3BPZkpvaW50c1NrZWxldG9uU2NlbmVDb21wb25lbnQpKSB7XG4gICAgICBjb25zdCBza2VsZXRhbEVudGl0eSA9IHRvcE9mSm9pbnRzU2tlbGV0b25TY2VuZUNvbXBvbmVudC5lbnRpdHkgYXMgSVNrZWxldGFsRW50aXR5O1xuICAgICAgc2tlbGV0YWxJZHggPSBlbnRpdGllcy5pbmRleE9mKHNrZWxldGFsRW50aXR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2tlbGV0YWxJZHggPSBqb2ludEluZGljZXNPZlRoZUVudGl0eVswXTtcbiAgICB9XG4gICAgY29uc3Qgc2tpbkpzb246IEdsdGYyU2tpbiA9IHtcbiAgICAgIGpvaW50czogam9pbnRJbmRpY2VzT2ZUaGVFbnRpdHksXG4gICAgICBpbnZlcnNlQmluZE1hdHJpY2VzOiBqc29uLmFjY2Vzc29ycy5sZW5ndGggLSAxLFxuICAgICAgc2tlbGV0b246IHNrZWxldGFsSWR4ID49IDAgPyBza2VsZXRhbElkeCA6IHVuZGVmaW5lZCxcbiAgICAgIGJpbmRTaGFwZU1hdHJpeDogYmluZFNoYXBlTWF0cml4Py5mbGF0dGVuQXNBcnJheSgpLFxuICAgIH07XG5cbiAgICBqc29uLnNraW5zLnB1c2goc2tpbkpzb24pO1xuICB9XG59XG5cbi8qKlxuICogY3JlYXRlIEJ1ZmZlclZpZXdzIGFuZCBBY2Nlc3NvcnMgb2YgbWVzaFxuICogQHBhcmFtIGpzb25cbiAqIEBwYXJhbSBlbnRpdGllc1xuICogQHBhcmFtIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzXG4gKiBAcGFyYW0gZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzXG4gKiBAcGFyYW0gZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29yc1xuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gX19jcmVhdGVCdWZmZXJWaWV3c0FuZEFjY2Vzc29yc09mTWVzaChcbiAganNvbjogR2x0ZjJFeCxcbiAgZW50aXRpZXM6IElNZXNoRW50aXR5W10sXG4gIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzOiBCdWZmZXJbXSxcbiAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzOiBCdWZmZXJWaWV3W10sXG4gIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnM6IEFjY2Vzc29yW11cbik6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbaV07XG4gICAgY29uc3QgbWVzaENvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldE1lc2goKTtcbiAgICBpZiAoSXMuZXhpc3QobWVzaENvbXBvbmVudCkgJiYgbWVzaENvbXBvbmVudC5tZXNoKSB7XG4gICAgICBjb25zdCBtZXNoOiBHbHRmMk1lc2ggPSB7IHByaW1pdGl2ZXM6IFtdIH07XG4gICAgICBjb25zdCBwcmltaXRpdmVDb3VudCA9IG1lc2hDb21wb25lbnQubWVzaC5nZXRQcmltaXRpdmVOdW1iZXIoKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcHJpbWl0aXZlQ291bnQ7IGorKykge1xuICAgICAgICBjb25zdCByblByaW1pdGl2ZSA9IG1lc2hDb21wb25lbnQubWVzaC5nZXRQcmltaXRpdmVBdChqKTtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlOiBHbHRmMlByaW1pdGl2ZSA9IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICBtb2RlOiByblByaW1pdGl2ZS5wcmltaXRpdmVNb2RlLmluZGV4LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFZlcnRleCBJbmRpY2VzXG4gICAgICAgIC8vIEZvciBpbmRpY2VzIGFjY2Vzc29yXG4gICAgICAgIGNvbnN0IHJuSW5kaWNlc0FjY2Vzc29yID0gcm5QcmltaXRpdmUuaW5kaWNlc0FjY2Vzc29yO1xuICAgICAgICBpZiAoSXMuZXhpc3Qocm5JbmRpY2VzQWNjZXNzb3IpKSB7XG4gICAgICAgICAgY29uc3Qgcm5CdWZmZXJWaWV3ID0gcm5JbmRpY2VzQWNjZXNzb3IuYnVmZmVyVmlldztcbiAgICAgICAgICBjb25zdCBnbHRmMkJ1ZmZlclZpZXcgPSBjcmVhdGVPclJldXNlR2x0ZjJCdWZmZXJWaWV3KFxuICAgICAgICAgICAganNvbixcbiAgICAgICAgICAgIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLFxuICAgICAgICAgICAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzLFxuICAgICAgICAgICAgcm5CdWZmZXJWaWV3LFxuICAgICAgICAgICAgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgZ2x0ZjJBY2Nlc3NvciA9IGNyZWF0ZU9yUmV1c2VHbHRmMkFjY2Vzc29yKFxuICAgICAgICAgICAganNvbixcbiAgICAgICAgICAgIGpzb24uYnVmZmVyVmlld3MuaW5kZXhPZihnbHRmMkJ1ZmZlclZpZXcpLFxuICAgICAgICAgICAgZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29ycyxcbiAgICAgICAgICAgIHJuSW5kaWNlc0FjY2Vzc29yXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NvcklkeCA9IGpzb24uYWNjZXNzb3JzLmluZGV4T2YoZ2x0ZjJBY2Nlc3Nvcik7XG4gICAgICAgICAgcHJpbWl0aXZlLmluZGljZXMgPSBhY2Nlc3NvcklkeDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcnRleCBBdHRyaWJ1dGVzXG4gICAgICAgIC8vIEZvciBlYWNoIGF0dHJpYnV0ZSBhY2Nlc3NvclxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVBY2Nlc3NvcnMgPSByblByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlQWNjZXNzb3JzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlSm9pbmVkU3RyaW5nID0gcm5QcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzW2pdIGFzIHN0cmluZztcbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlSm9pbmVkU3RyaW5nLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdCQVJZX0NFTlRSSUNfQ09PUkQnKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY3JlYXRlIGEgR2x0ZjJCdWZmZXJWaWV3XG4gICAgICAgICAgY29uc3Qgcm5BdHRyaWJ1dGVBY2Nlc3NvciA9IGF0dHJpYnV0ZUFjY2Vzc29yc1tqXTtcbiAgICAgICAgICBjb25zdCBybkJ1ZmZlclZpZXcgPSBybkF0dHJpYnV0ZUFjY2Vzc29yLmJ1ZmZlclZpZXc7XG4gICAgICAgICAgY29uc3QgZ2x0ZjJCdWZmZXJWaWV3ID0gY3JlYXRlT3JSZXVzZUdsdGYyQnVmZmVyVmlld0ZvclZlcnRleEF0dHJpYnV0ZUJ1ZmZlcihcbiAgICAgICAgICAgIGpzb24sXG4gICAgICAgICAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVycyxcbiAgICAgICAgICAgIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJWaWV3cyxcbiAgICAgICAgICAgIHJuQnVmZmVyVmlldyxcbiAgICAgICAgICAgIHJuQXR0cmlidXRlQWNjZXNzb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGdsdGYyQWNjZXNzb3IgPSBjcmVhdGVPclJldXNlR2x0ZjJBY2Nlc3NvcihcbiAgICAgICAgICAgIGpzb24sXG4gICAgICAgICAgICBqc29uLmJ1ZmZlclZpZXdzLmluZGV4T2YoZ2x0ZjJCdWZmZXJWaWV3KSxcbiAgICAgICAgICAgIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnMsXG4gICAgICAgICAgICBybkF0dHJpYnV0ZUFjY2Vzc29yXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFjY2Vzc29ySWR4ID0ganNvbi5hY2Nlc3NvcnMuaW5kZXhPZihnbHRmMkFjY2Vzc29yKTtcbiAgICAgICAgICBwcmltaXRpdmUuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGFjY2Vzc29ySWR4O1xuICAgICAgICB9XG4gICAgICAgIC8vIEJsZW5kU2hhcGVcbiAgICAgICAgc2V0dXBCbGFuZFNoYXBlRGF0YShcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgcm5QcmltaXRpdmUsXG4gICAgICAgICAgcHJpbWl0aXZlLFxuICAgICAgICAgIGpzb24sXG4gICAgICAgICAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlcnMsXG4gICAgICAgICAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzLFxuICAgICAgICAgIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnNcbiAgICAgICAgKTtcbiAgICAgICAgbWVzaC5wcmltaXRpdmVzW2pdID0gcHJpbWl0aXZlO1xuICAgICAgfVxuICAgICAganNvbi5tZXNoZXMucHVzaChtZXNoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0dXBCbGFuZFNoYXBlRGF0YShcbiAgZW50aXR5OiBJTWVzaEVudGl0eSxcbiAgcm5QcmltaXRpdmU6IFByaW1pdGl2ZSxcbiAgcHJpbWl0aXZlOiBHbHRmMlByaW1pdGl2ZSxcbiAganNvbjogR2x0ZjJFeCxcbiAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlcnM6IEJ1ZmZlcltdLFxuICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3M6IEJ1ZmZlclZpZXdbXSxcbiAgZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29yczogQWNjZXNzb3JbXVxuKSB7XG4gIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRCbGVuZFNoYXBlKCk7XG4gIGlmIChJcy5leGlzdChibGVuZFNoYXBlQ29tcG9uZW50KSkge1xuICAgIGNvbnN0IHRhcmdldHMgPSByblByaW1pdGl2ZS5nZXRCbGVuZFNoYXBlVGFyZ2V0cygpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QocHJpbWl0aXZlLnRhcmdldHMpKSB7XG4gICAgICBwcmltaXRpdmUudGFyZ2V0cyA9IFtdIGFzIEdsdGYyQXR0cmlidXRlQmxlbmRTaGFwZXM7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IHRhcmdldEpzb24gPSB7fSBhcyBHbHRmMkF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBybkFjY2Vzc29yXSBvZiB0YXJnZXQuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IGdsdGYyQnVmZmVyVmlldyA9IGNyZWF0ZU9yUmV1c2VHbHRmMkJ1ZmZlclZpZXcoXG4gICAgICAgICAganNvbixcbiAgICAgICAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVycyxcbiAgICAgICAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3MsXG4gICAgICAgICAgcm5BY2Nlc3Nvci5idWZmZXJWaWV3LFxuICAgICAgICAgIEdMX0FSUkFZX0JVRkZFUlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGdsdGYyQWNjZXNzb3IgPSBjcmVhdGVPclJldXNlR2x0ZjJBY2Nlc3NvcihcbiAgICAgICAgICBqc29uLFxuICAgICAgICAgIGpzb24uYnVmZmVyVmlld3MuaW5kZXhPZihnbHRmMkJ1ZmZlclZpZXcpLFxuICAgICAgICAgIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnMsXG4gICAgICAgICAgcm5BY2Nlc3NvclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBhY2Nlc3NvcklkeCA9IGpzb24uYWNjZXNzb3JzLmluZGV4T2YoZ2x0ZjJBY2Nlc3Nvcik7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZUpvaW5lZFN0cmluZyA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUpvaW5lZFN0cmluZy5zcGxpdCgnLicpWzBdO1xuICAgICAgICB0YXJnZXRKc29uW2F0dHJpYnV0ZV0gPSBhY2Nlc3NvcklkeDtcbiAgICAgIH1cbiAgICAgIHByaW1pdGl2ZS50YXJnZXRzLnB1c2godGFyZ2V0SnNvbik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogY3JlYXRlIEJ1ZmZlclZpZXdzIGFuZCBBY2Nlc3NvcnMgb2YgYW5pbWF0aW9uXG4gKiBAcGFyYW0ganNvblxuICogQHBhcmFtIGVudGl0aWVzXG4gKi9cbmZ1bmN0aW9uIF9fY3JlYXRlQnVmZmVyVmlld3NBbmRBY2Nlc3NvcnNPZkFuaW1hdGlvbihcbiAganNvbjogR2x0ZjJFeCxcbiAgZW50aXRpZXM6IElBbmltYXRpb25FbnRpdHlbXVxuKTogdm9pZCB7XG4gIGxldCBzdW1PZkJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQgPSAwO1xuICBjb25zdCBidWZmZXJJZHggPSBqc29uLmV4dHJhcy5idWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkQXJyYXkubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXNbaV07XG4gICAgY29uc3QgYW5pbWF0aW9uQ29tcG9uZW50ID0gZW50aXR5LnRyeVRvR2V0QW5pbWF0aW9uKCk7XG4gICAgaWYgKElzLmV4aXN0KGFuaW1hdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IHRyYWNrTmFtZXMgPSBhbmltYXRpb25Db21wb25lbnQuZ2V0QW5pbWF0aW9uVHJhY2tOYW1lcygpO1xuICAgICAgZm9yIChjb25zdCB0cmFja05hbWUgb2YgdHJhY2tOYW1lcykge1xuICAgICAgICAvLyBBbmltYXRpb25UcmFjayAoR2x0ZjJBbmltYXRpb24pXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbjogR2x0ZjJBbmltYXRpb24gPSB7XG4gICAgICAgICAgY2hhbm5lbHM6IFtdLFxuICAgICAgICAgIHNhbXBsZXJzOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAganNvbi5hbmltYXRpb25zLnB1c2goYW5pbWF0aW9uKTtcbiAgICAgICAgbGV0IHNhbXBsZXJJZHggPSAwO1xuICAgICAgICAvLyBSaG9kb25pdGUgQW5pbWF0aW9uVHJhY2sgaXMgY29ycmVzcG9uZGluZyB0byBHbHRmMkFuaW1hdGlvblxuICAgICAgICBjb25zdCBybkFuaW1hdGlvblRyYWNrID0gYW5pbWF0aW9uQ29tcG9uZW50LmdldEFuaW1hdGlvbkNoYW5uZWxzT2ZUcmFjayh0cmFja05hbWUpO1xuICAgICAgICBpZiAoSXMuZXhpc3Qocm5BbmltYXRpb25UcmFjaykpIHtcbiAgICAgICAgICBjb25zdCBybkNoYW5uZWxzID0gcm5BbmltYXRpb25UcmFjay52YWx1ZXMoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJuQ2hhbm5lbCBvZiBybkNoYW5uZWxzKSB7XG4gICAgICAgICAgICBpZiAocm5DaGFubmVsLnRhcmdldC5wYXRoTmFtZSA9PT0gJ2VmZmVrc2VlcicpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgR2x0ZjJCdWZmZXJWaWV3IGFuZCBHbHRmMkFjY2Vzc29yXG4gICAgICAgICAgICAvLyAgIGFuZCBzZXQgSW5wdXQgYW5pbWF0aW9uIGRhdGEgYXMgVWludDhBcnJheSB0byB0aGUgR2x0ZjJBY2Nlc3NvclxuICAgICAgICAgICAgY29uc3QgeyBpbnB1dEFjY2Vzc29ySWR4LCBpbnB1dEJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQgfSA9XG4gICAgICAgICAgICAgIGNyZWF0ZUdsdGYyQnVmZmVyVmlld0FuZEdsdGYyQWNjZXNzb3JGb3JJbnB1dChcbiAgICAgICAgICAgICAgICBqc29uLFxuICAgICAgICAgICAgICAgIHJuQ2hhbm5lbCxcbiAgICAgICAgICAgICAgICBidWZmZXJJZHgsXG4gICAgICAgICAgICAgICAgc3VtT2ZCdWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHN1bU9mQnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZCArPSBpbnB1dEJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQ7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW5kIHJlZ2lzdGVyIEdsdGYyQnVmZmVyVmlldyBhbmQgR2x0ZjJBY2Nlc3NvclxuICAgICAgICAgICAgLy8gICBhbmQgc2V0IE91dHB1dCBhbmltYXRpb24gZGF0YSBhcyBVaW50OEFycmF5IHRvIHRoZSBHbHRmMkFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCB7IG91dHB1dEFjY2Vzc29ySWR4LCBvdXRwdXRCdWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkIH0gPVxuICAgICAgICAgICAgICBjcmVhdGVHbHRmMkJ1ZmZlclZpZXdBbmRHbHRmMkFjY2Vzc29yRm9yT3V0cHV0KFxuICAgICAgICAgICAgICAgIGpzb24sXG4gICAgICAgICAgICAgICAgcm5DaGFubmVsLFxuICAgICAgICAgICAgICAgIGJ1ZmZlcklkeCxcbiAgICAgICAgICAgICAgICBzdW1PZkJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHN1bU9mQnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZCArPSBvdXRwdXRCdWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgR2x0ZjJBbmltYXRpb25DaGFubmVsXG4gICAgICAgICAgICBzYW1wbGVySWR4ID0gY3JlYXRlR2x0ZjJBbmltYXRpb25DaGFubmVsKHJuQ2hhbm5lbCwgc2FtcGxlcklkeCwgYW5pbWF0aW9uLCBpKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIEdsdGYyQW5pbWF0aW9uU2FtcGxlclxuICAgICAgICAgICAgY3JlYXRlR2x0ZjJBbmltYXRpb25TYW1wbGVyKGlucHV0QWNjZXNzb3JJZHgsIG91dHB1dEFjY2Vzc29ySWR4LCBybkNoYW5uZWwsIGFuaW1hdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGpzb24uZXh0cmFzLmJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheS5wdXNoKHN1bU9mQnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZCk7XG59XG5cbmZ1bmN0aW9uIGNhbGNBY2Nlc3NvcklkeFRvU2V0KGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnM6IEFjY2Vzc29yW10sIHJuQWNjZXNzb3I6IEFjY2Vzc29yKSB7XG4gIC8vIGxldCBhY2Nlc3NvcklkeFRvU2V0ID0gLTE7XG4gIGNvbnN0IGFjY2Vzc29ySWR4ID0gZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29ycy5maW5kSW5kZXgoKGFjY2Vzc29yKSA9PiB7XG4gICAgcmV0dXJuIGFjY2Vzc29yLmlzU2FtZShybkFjY2Vzc29yKTtcbiAgfSk7XG4gIC8vIGlmIChhY2Nlc3NvcklkeCAhPT0gLTEpIHtcbiAgLy8gICAvLyBpZiB0aGUgUmhvZG9uaXRlIFJuQWNjZXNzb3IgaXMgaW4gZXhpc3RpbmdVbmlxdWVBY2Nlc3NvcnMgYWxyZWFkeSxcbiAgLy8gICAvLyAgIHJldXNlIHRoZSBjb3JyZXNwb25kaW5nIEdsdGYyQWNjZXNzb3JcbiAgLy8gICBhY2Nlc3NvcklkeFRvU2V0ID0gYWNjZXNzb3JJZHg7XG4gIC8vIH0gZWxzZSB7XG4gIC8vICAgLy8gaWYgbm90LCBjcmVhdGUgYSBHbHRmMkFjY2Vzc29yIGFuZCBwdXQgaXQgaW50byBleGlzdGluZ1VuaXF1ZUFjY2Vzc29yc1xuICAvLyAgIC8vIGlmIHRoZSBhY2Nlc3NvciBpcyBuZXcgb25lLi4uXG4gIC8vICAgYWNjZXNzb3JJZHhUb1NldCA9IGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnMubGVuZ3RoO1xuICAvLyB9XG4gIHJldHVybiBhY2Nlc3NvcklkeDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT3JSZXVzZUdsdGYyQnVmZmVyVmlld0ZvclZlcnRleEF0dHJpYnV0ZUJ1ZmZlcihcbiAganNvbjogR2x0ZjJFeCxcbiAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlcnM6IEJ1ZmZlcltdLFxuICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3M6IEJ1ZmZlclZpZXdbXSxcbiAgcm5CdWZmZXJWaWV3OiBCdWZmZXJWaWV3LFxuICBybkFjY2Vzc29yOiBBY2Nlc3NvclxuKSB7XG4gIGNvbnN0IGJ1ZmZlclZpZXdJZHggPSBmaW5kQnVmZmVyVmlld0lkeChleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3MsIHJuQnVmZmVyVmlldyk7XG4gIGlmIChidWZmZXJWaWV3SWR4ID09PSAtMSkge1xuICAgIGNvbnN0IGJ1ZmZlcklkeFRvU2V0ID0gY2FsY0J1ZmZlcklkeFRvU2V0KGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLCBybkJ1ZmZlclZpZXcuYnVmZmVyKTtcbiAgICBjb25zdCBnbHRmMkJ1ZmZlclZpZXc6IEdsdGYyQnVmZmVyVmlld0V4ID0ge1xuICAgICAgYnVmZmVyOiBidWZmZXJJZHhUb1NldCxcbiAgICAgIGJ5dGVMZW5ndGg6IHJuQnVmZmVyVmlldy5ieXRlTGVuZ3RoLFxuICAgICAgYnl0ZU9mZnNldDogcm5CdWZmZXJWaWV3LmJ5dGVPZmZzZXRJbkJ1ZmZlcixcbiAgICAgIGV4dHJhczoge1xuICAgICAgICB1aW50OEFycmF5OiBybkJ1ZmZlclZpZXcuZ2V0VWludDhBcnJheSgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGdsdGYyQnVmZmVyVmlldy50YXJnZXQgPSBHTF9BUlJBWV9CVUZGRVI7XG5cbiAgICBqc29uLmV4dHJhcy5idWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkQXJyYXlbYnVmZmVySWR4VG9TZXRdID1cbiAgICAgIGFjY3VtdWxhdGVCdWZmZXJWaWV3Qnl0ZUxlbmd0aChcbiAgICAgICAganNvbi5leHRyYXMuYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZEFycmF5LFxuICAgICAgICBidWZmZXJJZHhUb1NldCxcbiAgICAgICAgZ2x0ZjJCdWZmZXJWaWV3XG4gICAgICApO1xuXG4gICAgaWYgKElzLmV4aXN0KGdsdGYyQnVmZmVyVmlldy50YXJnZXQpKSB7XG4gICAgICBnbHRmMkJ1ZmZlclZpZXcuYnl0ZVN0cmlkZSA9IHJuQWNjZXNzb3IuZWxlbWVudFNpemVJbkJ5dGVzO1xuICAgIH1cbiAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3MucHVzaChybkJ1ZmZlclZpZXcpO1xuICAgIGpzb24uYnVmZmVyVmlld3MucHVzaChnbHRmMkJ1ZmZlclZpZXcpO1xuICAgIC8vIGNvbnN0IHtmaXhlZEJ1ZmZlclZpZXdCeXRlTGVuZ3RoLCBmaXhlZEJ1ZmZlclZpZXdCeXRlT2Zmc2V0fSA9XG4gICAgLy8gICBjYWxjQnVmZmVyVmlld0J5dGVMZW5ndGhBbmRCeXRlT2Zmc2V0KHtcbiAgICAvLyAgICAgYWNjZXNzb3JCeXRlT2Zmc2V0OiBybkFjY2Vzc29yLmJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXcsXG4gICAgLy8gICAgIGFjY2Vzc29yQ291bnQ6IHJuQWNjZXNzb3IuZWxlbWVudENvdW50LFxuICAgIC8vICAgICBidWZmZXJWaWV3Qnl0ZU9mZnNldDogZ2x0ZjJCdWZmZXJWaWV3LmJ5dGVPZmZzZXQsXG4gICAgLy8gICAgIGJ1ZmZlclZpZXdCeXRlU3RyaWRlOiBnbHRmMkJ1ZmZlclZpZXcuYnl0ZVN0cmlkZSEsXG4gICAgLy8gICAgIHNpemVPZkNvbXBvbmVudDogcm5BY2Nlc3Nvci5jb21wb25lbnRUeXBlLmdldFNpemVJbkJ5dGVzKCksXG4gICAgLy8gICAgIG51bWJlck9mQ29tcG9uZW50czogcm5BY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCksXG4gICAgLy8gICB9KTtcbiAgICAvLyBnbHRmMkJ1ZmZlclZpZXcuYnl0ZUxlbmd0aCA9IGZpeGVkQnVmZmVyVmlld0J5dGVMZW5ndGg7XG4gICAgcmV0dXJuIGdsdGYyQnVmZmVyVmlldztcbiAgfVxuICBjb25zdCBnbHRmMkJ1ZmZlclZpZXcgPSBqc29uLmJ1ZmZlclZpZXdzW2J1ZmZlclZpZXdJZHhdO1xuICByZXR1cm4gZ2x0ZjJCdWZmZXJWaWV3O1xufVxuXG5mdW5jdGlvbiBmaW5kQnVmZmVyVmlld0lkeChleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3M6IEJ1ZmZlclZpZXdbXSwgcm5CdWZmZXJWaWV3OiBCdWZmZXJWaWV3KSB7XG4gIGNvbnN0IGJ1ZmZlclZpZXdJZHggPSBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3MuZmluZEluZGV4KChidWZmZXJWaWV3KSA9PlxuICAgIGJ1ZmZlclZpZXcuaXNTYW1lKHJuQnVmZmVyVmlldylcbiAgKTtcbiAgcmV0dXJuIGJ1ZmZlclZpZXdJZHg7XG59XG5cbmZ1bmN0aW9uIGNhbGNCdWZmZXJJZHhUb1NldChleGlzdGluZ1VuaXF1ZVJuQnVmZmVyczogQnVmZmVyW10sIHJuQnVmZmVyOiBCdWZmZXIpIHtcbiAgaWYgKGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLnB1c2gocm5CdWZmZXIpO1xuICB9XG4gIGNvbnN0IGJ1ZmZlcklkeCA9IGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLmZpbmRJbmRleCgoYnVmZmVyKSA9PiBidWZmZXIuaXNTYW1lKHJuQnVmZmVyKSk7XG4gIGNvbnN0IGJ1ZmZlcklkeFRvU2V0ID0gYnVmZmVySWR4ID09PSAtMSA/IGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzLmxlbmd0aCA6IGJ1ZmZlcklkeDtcbiAgaWYgKGJ1ZmZlcklkeCA9PT0gLTEpIHtcbiAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVycy5wdXNoKHJuQnVmZmVyKTtcbiAgfVxuICByZXR1cm4gYnVmZmVySWR4VG9TZXQ7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVCdWZmZXJWaWV3Qnl0ZUxlbmd0aChcbiAgYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZEFycmF5OiBudW1iZXJbXSxcbiAgYnVmZmVySWR4VG9TZXQ6IG51bWJlcixcbiAgZ2x0ZjJCdWZmZXJWaWV3OiBHbHRmMkJ1ZmZlclZpZXdFeFxuKSB7XG4gIGNvbnN0IGJ1ZmZlclZpZXdMZW5ndGhBbGlnbmVkID0gSXMuZXhpc3QoYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZEFycmF5W2J1ZmZlcklkeFRvU2V0XSlcbiAgICA/IGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheVtidWZmZXJJZHhUb1NldF0gK1xuICAgICAgRGF0YVV0aWwuYWRkUGFkZGluZ0J5dGVzKGdsdGYyQnVmZmVyVmlldy5ieXRlTGVuZ3RoLCA0KVxuICAgIDogRGF0YVV0aWwuYWRkUGFkZGluZ0J5dGVzKGdsdGYyQnVmZmVyVmlldy5ieXRlTGVuZ3RoLCA0KTtcblxuICByZXR1cm4gYnVmZmVyVmlld0xlbmd0aEFsaWduZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0dsdGZBbmltYXRpb25QYXRoTmFtZShwYXRoOiBBbmltYXRpb25QYXRoTmFtZSk6IEdsdGYyQW5pbWF0aW9uUGF0aE5hbWUge1xuICBzd2l0Y2ggKHBhdGgpIHtcbiAgICBjYXNlICd0cmFuc2xhdGUnOlxuICAgICAgcmV0dXJuICd0cmFuc2xhdGlvbic7XG4gICAgY2FzZSAncXVhdGVybmlvbic6XG4gICAgICByZXR1cm4gJ3JvdGF0aW9uJztcbiAgICBjYXNlICdzY2FsZSc6XG4gICAgICByZXR1cm4gJ3NjYWxlJztcbiAgICBjYXNlICd3ZWlnaHRzJzpcbiAgICAgIHJldHVybiAnd2VpZ2h0cyc7XG4gICAgLy8gY2FzZSAnZWZmZWtzZWVyJzpcbiAgICAvLyAgIHJldHVybiAnZWZmZWtzZWVyJztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBhdGggTmFtZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdsdGYyQW5pbWF0aW9uQ2hhbm5lbChcbiAgY2hhbm5lbDogQW5pbWF0aW9uQ2hhbm5lbCxcbiAgc2FtcGxlcklkeDogSW5kZXgsXG4gIGFuaW1hdGlvbjogR2x0ZjJBbmltYXRpb24sXG4gIGVudGl0eUlkeDogSW5kZXhcbikge1xuICBjb25zdCBwYXRoTmFtZSA9IGNoYW5uZWwudGFyZ2V0LnBhdGhOYW1lIGFzIEFuaW1hdGlvblBhdGhOYW1lO1xuXG4gIGNvbnN0IGNoYW5uZWxKc29uOiBHbHRmMkFuaW1hdGlvbkNoYW5uZWwgPSB7XG4gICAgc2FtcGxlcjogc2FtcGxlcklkeCsrLFxuICAgIHRhcmdldDoge1xuICAgICAgcGF0aDogY29udmVydFRvR2x0ZkFuaW1hdGlvblBhdGhOYW1lKHBhdGhOYW1lKSxcbiAgICAgIG5vZGU6IGVudGl0eUlkeCxcbiAgICB9LFxuICB9O1xuICBhbmltYXRpb24uY2hhbm5lbHMucHVzaChjaGFubmVsSnNvbik7XG4gIHJldHVybiBzYW1wbGVySWR4O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbHRmMkFuaW1hdGlvblNhbXBsZXIoXG4gIGlucHV0QWNjZXNzb3JJZHg6IG51bWJlcixcbiAgb3V0cHV0QWNjZXNzb3JJZHg6IG51bWJlcixcbiAgY2hhbm5lbDogQW5pbWF0aW9uQ2hhbm5lbCxcbiAgYW5pbWF0aW9uOiBHbHRmMkFuaW1hdGlvblxuKSB7XG4gIGNvbnN0IHNhbXBsZXJKc29uOiBHbHRmMkFuaW1hdGlvblNhbXBsZXIgPSB7XG4gICAgaW5wdXQ6IGlucHV0QWNjZXNzb3JJZHgsXG4gICAgb3V0cHV0OiBvdXRwdXRBY2Nlc3NvcklkeCxcbiAgICBpbnRlcnBvbGF0aW9uOiBjaGFubmVsLnNhbXBsZXIuaW50ZXJwb2xhdGlvbk1ldGhvZC5HbHRmU3RyaW5nLFxuICB9O1xuICBhbmltYXRpb24uc2FtcGxlcnMucHVzaChzYW1wbGVySnNvbik7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdsdGYyQnVmZmVyVmlld0FuZEdsdGYyQWNjZXNzb3JGb3JJbnB1dChcbiAganNvbjogR2x0ZjJFeCxcbiAgcm5DaGFubmVsOiBBbmltYXRpb25DaGFubmVsLFxuICBidWZmZXJJZHg6IEluZGV4LFxuICBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkOiBCeXRlXG4pIHtcbiAgY29uc3QgY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGUuZnJvbVR5cGVkQXJyYXkoXG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3KHJuQ2hhbm5lbC5zYW1wbGVyLmlucHV0KVxuICAgICAgPyBybkNoYW5uZWwuc2FtcGxlci5pbnB1dFxuICAgICAgOiBuZXcgRmxvYXQzMkFycmF5KHJuQ2hhbm5lbC5zYW1wbGVyLmlucHV0KVxuICApO1xuICBjb25zdCBhY2Nlc3NvckNvdW50ID0gcm5DaGFubmVsLnNhbXBsZXIuaW5wdXQubGVuZ3RoO1xuICAvLyBjcmVhdGUgYSBHbHRmMkJ1ZmZlclZpZXdcbiAgY29uc3QgZ2x0ZjJCdWZmZXJWaWV3OiBHbHRmMkJ1ZmZlclZpZXdFeCA9IGNyZWF0ZUdsdGYyQnVmZmVyVmlld0ZvckFuaW1hdGlvbih7XG4gICAgYnVmZmVySWR4LFxuICAgIGJ1ZmZlclZpZXdCeXRlT2Zmc2V0OiBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkLFxuICAgIGFjY2Vzc29yQnl0ZU9mZnNldDogMCxcbiAgICBhY2Nlc3NvckNvdW50LFxuICAgIGJ1ZmZlclZpZXdCeXRlU3RyaWRlOiBDb21wb25lbnRUeXBlLkZsb2F0LmdldFNpemVJbkJ5dGVzKCksXG4gICAgY29tcG9uZW50VHlwZSxcbiAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgdWludDhBcnJheTogbmV3IFVpbnQ4QXJyYXkoXG4gICAgICBBcnJheUJ1ZmZlci5pc1ZpZXcocm5DaGFubmVsLnNhbXBsZXIuaW5wdXQpXG4gICAgICAgID8gcm5DaGFubmVsLnNhbXBsZXIuaW5wdXQuYnVmZmVyXG4gICAgICAgIDogbmV3IEZsb2F0MzJBcnJheShybkNoYW5uZWwuc2FtcGxlci5pbnB1dCkuYnVmZmVyXG4gICAgKSxcbiAgfSk7XG4gIGpzb24uYnVmZmVyVmlld3MucHVzaChnbHRmMkJ1ZmZlclZpZXcpO1xuXG4gIC8vIGNyZWF0ZSBhIEdsdGYyQWNjZXNzb3JcbiAgY29uc3QgZ2x0ZjJBY2Nlc3NvcjogR2x0ZjJBY2Nlc3NvckV4ID0gY3JlYXRlR2x0ZjJBY2Nlc3NvckZvckFuaW1hdGlvbih7XG4gICAgYnVmZmVyVmlld0lkeDoganNvbi5idWZmZXJWaWV3cy5pbmRleE9mKGdsdGYyQnVmZmVyVmlldyksXG4gICAgYWNjZXNzb3JCeXRlT2Zmc2V0OiAwLFxuICAgIGNvbXBvbmVudFR5cGUsXG4gICAgY291bnQ6IGFjY2Vzc29yQ291bnQsXG4gICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgIG1pbjogW3JuQ2hhbm5lbC5zYW1wbGVyLmlucHV0WzBdXSxcbiAgICBtYXg6IFtybkNoYW5uZWwuc2FtcGxlci5pbnB1dFtybkNoYW5uZWwuc2FtcGxlci5pbnB1dC5sZW5ndGggLSAxXV0sXG4gIH0pO1xuICBqc29uLmFjY2Vzc29ycy5wdXNoKGdsdGYyQWNjZXNzb3IpO1xuXG4gIC8vIHJlZ2lzdGVyXG4gIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQgPSBhbGlnbkJ1ZmZlclZpZXdCeXRlTGVuZ3RoKFxuICAgIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQsXG4gICAgZ2x0ZjJCdWZmZXJWaWV3XG4gICk7XG4gIGNvbnN0IGlucHV0QWNjZXNzb3JJZHggPSBqc29uLmFjY2Vzc29ycy5pbmRleE9mKGdsdGYyQWNjZXNzb3IpO1xuICByZXR1cm4ge1xuICAgIGlucHV0QWNjZXNzb3JJZHgsXG4gICAgaW5wdXRCdWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkOiBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbHRmMkJ1ZmZlclZpZXdBbmRHbHRmMkFjY2Vzc29yRm9yT3V0cHV0KFxuICBqc29uOiBHbHRmMkV4LFxuICBybkNoYW5uZWw6IEFuaW1hdGlvbkNoYW5uZWwsXG4gIGJ1ZmZlcklkeDogSW5kZXgsXG4gIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQ6IEJ5dGVcbikge1xuICBjb25zdCBjb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZS5mcm9tVHlwZWRBcnJheShcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcocm5DaGFubmVsLnNhbXBsZXIub3V0cHV0KVxuICAgICAgPyBybkNoYW5uZWwuc2FtcGxlci5vdXRwdXRcbiAgICAgIDogbmV3IEZsb2F0MzJBcnJheShybkNoYW5uZWwuc2FtcGxlci5vdXRwdXQpXG4gICk7XG5cbiAgY29uc3QgcGF0aE5hbWUgPSBybkNoYW5uZWwudGFyZ2V0LnBhdGhOYW1lO1xuICBsZXQgY29tcG9zaXRpb25UeXBlID0gQ29tcG9zaXRpb25UeXBlLnRvR2x0ZjJBbmltYXRpb25BY2Nlc3NvckNvbXBvc2l0aW9uVHlwZShcbiAgICBybkNoYW5uZWwuc2FtcGxlci5vdXRwdXRDb21wb25lbnROXG4gICk7XG4gIGxldCBhY2Nlc3NvckNvdW50ID0gcm5DaGFubmVsLnNhbXBsZXIub3V0cHV0Lmxlbmd0aCAvIHJuQ2hhbm5lbC5zYW1wbGVyLm91dHB1dENvbXBvbmVudE47XG4gIGlmIChwYXRoTmFtZSA9PT0gJ3dlaWdodHMnKSB7XG4gICAgY29tcG9zaXRpb25UeXBlID0gQ29tcG9zaXRpb25UeXBlLlNjYWxhcjtcbiAgICBhY2Nlc3NvckNvdW50ID0gcm5DaGFubmVsLnNhbXBsZXIub3V0cHV0Lmxlbmd0aDtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBhIEdsdGYyQnVmZmVyVmlld1xuICBjb25zdCBnbHRmMkJ1ZmZlclZpZXcgPSBjcmVhdGVHbHRmMkJ1ZmZlclZpZXdGb3JBbmltYXRpb24oe1xuICAgIGJ1ZmZlcklkeCxcbiAgICBidWZmZXJWaWV3Qnl0ZU9mZnNldDogYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZCxcbiAgICBhY2Nlc3NvckJ5dGVPZmZzZXQ6IDAsXG4gICAgYWNjZXNzb3JDb3VudCxcbiAgICBidWZmZXJWaWV3Qnl0ZVN0cmlkZTogY29tcG9uZW50VHlwZS5nZXRTaXplSW5CeXRlcygpICogcm5DaGFubmVsLnNhbXBsZXIub3V0cHV0Q29tcG9uZW50TixcbiAgICBjb21wb25lbnRUeXBlLFxuICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICB1aW50OEFycmF5OiBuZXcgVWludDhBcnJheShcbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhybkNoYW5uZWwuc2FtcGxlci5vdXRwdXQpXG4gICAgICAgID8gcm5DaGFubmVsLnNhbXBsZXIub3V0cHV0LmJ1ZmZlclxuICAgICAgICA6IG5ldyBGbG9hdDMyQXJyYXkocm5DaGFubmVsLnNhbXBsZXIub3V0cHV0KS5idWZmZXJcbiAgICApLFxuICB9KTtcbiAganNvbi5idWZmZXJWaWV3cy5wdXNoKGdsdGYyQnVmZmVyVmlldyk7XG5cbiAgLy8gY3JlYXRlIGEgR2x0ZjJBY2Nlc3NvclxuICBjb25zdCBnbHRmMkFjY2Vzc29yOiBHbHRmMkFjY2Vzc29yRXggPSBjcmVhdGVHbHRmMkFjY2Vzc29yRm9yQW5pbWF0aW9uKHtcbiAgICBidWZmZXJWaWV3SWR4OiBqc29uLmJ1ZmZlclZpZXdzLmluZGV4T2YoZ2x0ZjJCdWZmZXJWaWV3KSxcbiAgICBhY2Nlc3NvckJ5dGVPZmZzZXQ6IDAsXG4gICAgY29tcG9uZW50VHlwZSxcbiAgICBjb3VudDogYWNjZXNzb3JDb3VudCxcbiAgICBjb21wb3NpdGlvblR5cGUsXG4gIH0pO1xuICBqc29uLmFjY2Vzc29ycy5wdXNoKGdsdGYyQWNjZXNzb3IpO1xuXG4gIC8vIHJlZ2lzdGVyXG4gIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQgPSBhbGlnbkJ1ZmZlclZpZXdCeXRlTGVuZ3RoKFxuICAgIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQsXG4gICAgZ2x0ZjJCdWZmZXJWaWV3XG4gICk7XG4gIGNvbnN0IG91dHB1dEFjY2Vzc29ySWR4ID0ganNvbi5hY2Nlc3NvcnMuaW5kZXhPZihnbHRmMkFjY2Vzc29yKTtcbiAgcmV0dXJuIHtcbiAgICBvdXRwdXRBY2Nlc3NvcklkeCxcbiAgICBvdXRwdXRCdWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkOiBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkLFxuICB9O1xufVxuXG50eXBlIEJ1ZmZlclZpZXdCeXRlTGVuZ3RoRGVzYyA9IHtcbiAgYWNjZXNzb3JCeXRlT2Zmc2V0OiBCeXRlO1xuICBhY2Nlc3NvckNvdW50OiBDb3VudDtcbiAgYnVmZmVyVmlld0J5dGVTdHJpZGU6IEJ5dGU7XG4gIGJ1ZmZlclZpZXdCeXRlT2Zmc2V0OiBCeXRlO1xuICBzaXplT2ZDb21wb25lbnQ6IEJ5dGU7XG4gIG51bWJlck9mQ29tcG9uZW50czogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYWxpZ25CdWZmZXJWaWV3Qnl0ZUxlbmd0aChcbiAgYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZDogbnVtYmVyLFxuICBidWZmZXJWaWV3OiBHbHRmMkJ1ZmZlclZpZXdFeFxuKSB7XG4gIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQgPVxuICAgIGJ1ZmZlclZpZXcuYnl0ZUxlbmd0aCArIERhdGFVdGlsLmNhbGNQYWRkaW5nQnl0ZXMoYnVmZmVyVmlldy5ieXRlTGVuZ3RoLCA0KTtcbiAgcmV0dXJuIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQ7XG59XG5cbi8qKlxuICogY2FsYyBCdWZmZXJWaWV3IGJ5dGUgbGVuZ3RoXG4gKlxuICpcbiAqICBTZWU6IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjZGF0YS1hbGlnbm1lbnRcbiAqIEBwYXJhbSBhY2Nlc3NvckJ5dGVPZmZzZXRcbiAqIEBwYXJhbSBhY2Nlc3NvckNvdW50XG4gKiBAcGFyYW0gZWZmZWN0aXZlQnl0ZVN0cmlkZVxuICogQHBhcmFtIHNpemVPZkNvbXBvbmVudFxuICogQHBhcmFtIG51bWJlck9mQ29tcG9uZW50c1xuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gY2FsY0J1ZmZlclZpZXdCeXRlTGVuZ3RoQW5kQnl0ZU9mZnNldCh7XG4gIGFjY2Vzc29yQnl0ZU9mZnNldCxcbiAgYWNjZXNzb3JDb3VudCxcbiAgYnVmZmVyVmlld0J5dGVTdHJpZGUsXG4gIGJ1ZmZlclZpZXdCeXRlT2Zmc2V0LFxuICBzaXplT2ZDb21wb25lbnQsXG4gIG51bWJlck9mQ29tcG9uZW50cyxcbn06IEJ1ZmZlclZpZXdCeXRlTGVuZ3RoRGVzYyk6IHtcbiAgZml4ZWRCdWZmZXJWaWV3Qnl0ZUxlbmd0aDogQnl0ZTtcbiAgZml4ZWRCdWZmZXJWaWV3Qnl0ZU9mZnNldDogQnl0ZTtcbn0ge1xuICAvLyBXaGVuIGJ5dGVTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZWQgYnVmZmVyVmlldyBpcyBub3QgZGVmaW5lZCxcbiAgLy8gaXQgbWVhbnMgdGhhdCBhY2Nlc3NvciBlbGVtZW50cyBhcmUgdGlnaHRseSBwYWNrZWQsXG4gIC8vICAgaS5lLiwgZWZmZWN0aXZlIHN0cmlkZSBlcXVhbHMgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnQuXG4gIGNvbnN0IGVmZmVjdGl2ZUJ5dGVTdHJpZGUgPVxuICAgIGJ1ZmZlclZpZXdCeXRlU3RyaWRlID09PSAwID8gc2l6ZU9mQ29tcG9uZW50ICogbnVtYmVyT2ZDb21wb25lbnRzIDogYnVmZmVyVmlld0J5dGVTdHJpZGU7XG5cbiAgLy8gV2hlbiBieXRlU3RyaWRlIGlzIGRlZmluZWQsXG4gIC8vICAgaXQgTVVTVCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBhY2Nlc3NvcuKAmXMgY29tcG9uZW50IHR5cGUuXG4gIGlmIChidWZmZXJWaWV3Qnl0ZVN0cmlkZSAlIHNpemVPZkNvbXBvbmVudCAhPT0gMCkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgJ2dsVEYyOiBXaGVuIGJ5dGVTdHJpZGUgaXMgZGVmaW5lZCwgaXQgTVVTVCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBhY2Nlc3NvcuKAmXMgY29tcG9uZW50IHR5cGUuJ1xuICAgICk7XG4gIH1cblxuICAvLyBNVVNUIGJlIDQgYnl0ZXMgYWxpZ25lZFxuICBjb25zdCBlZmZlY3RpdmVCeXRlU3RyaWRlQWxpZ25lZCA9IGFsaWduQnVmZmVyVmlld0J5dGVTdHJpZGVUbzRCeXRlcyhlZmZlY3RpdmVCeXRlU3RyaWRlKTtcbiAgLy8gTVVTVCBiZSA0IGJ5dGVzIGFsaWduZWRcbiAgY29uc3QgYWxpZ25lZEFjY2Vzc29yQnl0ZU9mZnNldCA9IGFsaWduQWNjZXNzb3JCeXRlT2Zmc2V0VG80Qnl0ZXMoYWNjZXNzb3JCeXRlT2Zmc2V0KTtcblxuICAvLyBjYWxjIEJ1ZmZlclZpZXcgYnl0ZUxlbmd0aCBhcyBmb2xsb3dpbmcsXG4gIC8vXG4gIC8vICBFYWNoIGFjY2Vzc29yIE1VU1QgZml0IGl0cyBidWZmZXJWaWV3LCBpLmUuLFxuICAvLyAgYGBgXG4gIC8vICBhY2Nlc3Nvci5ieXRlT2Zmc2V0ICsgRUZGRUNUSVZFX0JZVEVfU1RSSURFICogKGFjY2Vzc29yLmNvdW50IC0gMSkgKyBTSVpFX09GX0NPTVBPTkVOVCAqIE5VTUJFUl9PRl9DT01QT05FTlRTXG4gIC8vICBgYGBcbiAgLy8gICBNVVNUIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBidWZmZXJWaWV3Lmxlbmd0aC5cbiAgY29uc3QgYnVmZmVyVmlld0J5dGVMZW5ndGggPVxuICAgIGFsaWduZWRBY2Nlc3NvckJ5dGVPZmZzZXQgK1xuICAgIGVmZmVjdGl2ZUJ5dGVTdHJpZGVBbGlnbmVkICogKGFjY2Vzc29yQ291bnQgLSAxKSArXG4gICAgc2l6ZU9mQ29tcG9uZW50ICogbnVtYmVyT2ZDb21wb25lbnRzO1xuXG4gIC8vIFRoZSBvZmZzZXQgb2YgYW4gYWNjZXNzb3IgaW50byBhIGJ1ZmZlclZpZXcgKGkuZS4sIGFjY2Vzc29yLmJ5dGVPZmZzZXQpXG4gIC8vICAgYW5kIHRoZSBvZmZzZXQgb2YgYW4gYWNjZXNzb3IgaW50byBhIGJ1ZmZlciAoaS5lLiwgYWNjZXNzb3IuYnl0ZU9mZnNldCArIGJ1ZmZlclZpZXcuYnl0ZU9mZnNldClcbiAgLy8gICAgIE1VU1QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgYWNjZXNzb3LigJlzIGNvbXBvbmVudCB0eXBlLlxuICBjb25zdCB2YWxCeXRlTGVuZ3RoID0gc2l6ZU9mQ29tcG9uZW50ICogbnVtYmVyT2ZDb21wb25lbnRzO1xuICBjb25zdCBzdW1CeXRlT2Zmc2V0ID0gYWxpZ25lZEFjY2Vzc29yQnl0ZU9mZnNldCArIGJ1ZmZlclZpZXdCeXRlT2Zmc2V0O1xuICBjb25zdCBwYWRkaW5nQnl0ZSA9IHZhbEJ5dGVMZW5ndGggLSAoc3VtQnl0ZU9mZnNldCAlIHZhbEJ5dGVMZW5ndGgpO1xuICBjb25zdCBmaXhlZEJ1ZmZlclZpZXdCeXRlT2Zmc2V0ID0gYnVmZmVyVmlld0J5dGVPZmZzZXQgKyBwYWRkaW5nQnl0ZTtcblxuICAvLyBNVVNUIGJlIDQgYnl0ZXMgYWxpZ25lZFxuICBjb25zdCBhbGlnbmVkQnVmZmVyVmlld0J5dGVPZmZzZXQgPSBhbGlnbkFjY2Vzc29yQnl0ZU9mZnNldFRvNEJ5dGVzKGZpeGVkQnVmZmVyVmlld0J5dGVPZmZzZXQpO1xuXG4gIGNvbnN0IGZpeGVkQnVmZmVyVmlld0J5dGVMZW5ndGggPSBidWZmZXJWaWV3Qnl0ZUxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICBmaXhlZEJ1ZmZlclZpZXdCeXRlTGVuZ3RoLFxuICAgIGZpeGVkQnVmZmVyVmlld0J5dGVPZmZzZXQ6IGFsaWduZWRCdWZmZXJWaWV3Qnl0ZU9mZnNldCxcbiAgfTtcbn1cblxuLyoqXG4gKiBmaXggdGhlIHBhc3NlZCBieXRlT2Zmc2V0IHRvIDQgYnl0ZXMgYWxpZ25lZFxuICogRm9yIHBlcmZvcm1hbmNlIGFuZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGVhY2ggZWxlbWVudCBvZiBhIHZlcnRleCBhdHRyaWJ1dGVcbiAqICAgTVVTVCBiZSBhbGlnbmVkIHRvIDQtYnl0ZSBib3VuZGFyaWVzIGluc2lkZSBhIGJ1ZmZlclZpZXdcbiAqICAgICAoaS5lLiwgYWNjZXNzb3IuYnl0ZU9mZnNldCBhbmQgYnVmZmVyVmlldy5ieXRlU3RyaWRlIE1VU1QgYmUgbXVsdGlwbGVzIG9mIDQpLlxuICpcbiAqICBTZWU6IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjZGF0YS1hbGlnbm1lbnRcbiAqIEBwYXJhbSBieXRlT2Zmc2V0IEJ5dGVPZmZzZXQgb2YgQWNjZXNzb3IsIHdoaWNoIGlzIG5vdCBhbGdpbmVkIHlldFxuICogQHJldHVybnMgYWxnaW5lZCBieXRlT2Zmc2V0XG4gKi9cbmZ1bmN0aW9uIGFsaWduQWNjZXNzb3JCeXRlT2Zmc2V0VG80Qnl0ZXMoYnl0ZU9mZnNldDogQnl0ZSk6IEJ5dGUge1xuICBjb25zdCBhbGlnblNpemUgPSA0O1xuICBpZiAoYnl0ZU9mZnNldCAlIDQgPT09IDApIHtcbiAgICByZXR1cm4gYnl0ZU9mZnNldDtcbiAgfVxuICByZXR1cm4gYnl0ZU9mZnNldCArIChhbGlnblNpemUgLSAoYnl0ZU9mZnNldCAlIGFsaWduU2l6ZSkpO1xufVxuXG4vKipcbiAqIGZpeCB0aGUgcGFzc2VkIGJ5dGVPZmZzZXQgdG8gNCBieXRlcyBhbGlnbmVkXG4gKiBGb3IgcGVyZm9ybWFuY2UgYW5kIGNvbXBhdGliaWxpdHkgcmVhc29ucywgZWFjaCBlbGVtZW50IG9mIGEgdmVydGV4IGF0dHJpYnV0ZVxuICogICBNVVNUIGJlIGFsaWduZWQgdG8gNC1ieXRlIGJvdW5kYXJpZXMgaW5zaWRlIGEgYnVmZmVyVmlld1xuICogICAgIChpLmUuLCBhY2Nlc3Nvci5ieXRlT2Zmc2V0IGFuZCBidWZmZXJWaWV3LmJ5dGVTdHJpZGUgTVVTVCBiZSBtdWx0aXBsZXMgb2YgNCkuXG4gKlxuICogIFNlZTogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNkYXRhLWFsaWdubWVudFxuICogQHBhcmFtIGJ5dGVPZmZzZXQgQnl0ZU9mZnNldCBvZiBBY2Nlc3Nvciwgd2hpY2ggaXMgbm90IGFsZ2luZWQgeWV0XG4gKiBAcmV0dXJucyBhbGdpbmVkIGJ5dGVPZmZzZXRcbiAqL1xuZnVuY3Rpb24gYWxpZ25CdWZmZXJWaWV3Qnl0ZVN0cmlkZVRvNEJ5dGVzKGJ5dGVTdHJpZGU6IEJ5dGUpOiBCeXRlIHtcbiAgY29uc3QgYWxpZ25TaXplID0gNDtcbiAgaWYgKGJ5dGVTdHJpZGUgJSA0ID09PSAwKSB7XG4gICAgcmV0dXJuIGJ5dGVTdHJpZGU7XG4gIH1cbiAgY29uc3QgYnl0ZVN0cmlkZUFsZ2luZWQgPSBieXRlU3RyaWRlICsgKGFsaWduU2l6ZSAtIChieXRlU3RyaWRlICUgYWxpZ25TaXplKSk7XG5cbiAgcmV0dXJuIGJ5dGVTdHJpZGVBbGdpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVUZXh0dXJlSW1hZ2UoXG4gIGpzb246IEdsdGYyRXgsXG4gIGJ1ZmZlcklkeDogSW5kZXgsXG4gIGJsb2I6IEJsb2IsXG4gIG9wdGlvbjogR2x0ZjJFeHBvcnRlckFyZ3VtZW50cyxcbiAgZ2xURjJJbWFnZUV4OiBHbHRmMkltYWdlLFxuICByZXNvbHZlOiAodj86IEFycmF5QnVmZmVyKSA9PiB2b2lkLFxuICByZWplY3RlZDogKHJlYXNvbj86IERPTUV4Y2VwdGlvbikgPT4gdm9pZFxuKSB7XG4gIGlmIChvcHRpb24udHlwZSA9PT0gR0xURjJfRVhQT1JUX0dMVEYpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBjb25zdCBlID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJyk7XG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IhKTtcbiAgICAgIGEuZG93bmxvYWQgPSBnbFRGMkltYWdlRXgudXJpITtcbiAgICAgIGEuZGlzcGF0Y2hFdmVudChlKTtcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYS5ocmVmKTtcbiAgICB9LCBNYXRoLnJhbmRvbSgpICogNTAwMCk7XG4gICAgcmVzb2x2ZSgpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XG4gICAgICBjb25zdCBnbHRmMkJ1ZmZlclZpZXcgPSBjcmVhdGVBbmRBZGRHbHRmMkJ1ZmZlclZpZXcoXG4gICAgICAgIGpzb24sXG4gICAgICAgIGJ1ZmZlcklkeCxcbiAgICAgICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGFycmF5QnVmZmVyKSBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXlcbiAgICAgICk7XG4gICAgICBnbFRGMkltYWdlRXguYnVmZmVyVmlldyA9IGpzb24uYnVmZmVyVmlld3MuaW5kZXhPZihnbHRmMkJ1ZmZlclZpZXcpO1xuICAgICAgZ2xURjJJbWFnZUV4Lm1pbWVUeXBlID0gJ2ltYWdlL3BuZyc7XG4gICAgICBkZWxldGUgZ2xURjJJbWFnZUV4LnVyaTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICByZWplY3RlZChyZWFkZXIuZXJyb3IgYXMgRE9NRXhjZXB0aW9uKTtcbiAgICB9KTtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gIH1cbn1cblxuLy8vXG4vLy8gQnVmZmVyVmlldyBhbmQgQWNjZXNzb3IgQ3JlYXRlcnNcbi8vL1xuXG5pbnRlcmZhY2UgR2x0ZjJBY2Nlc3NvckRlc2Mge1xuICBidWZmZXJWaWV3SWR4OiBJbmRleDtcbiAgYWNjZXNzb3JCeXRlT2Zmc2V0OiBCeXRlO1xuICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgY291bnQ6IENvdW50O1xuICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW07XG4gIG1pbj86IEFycmF5MXRvNDxudW1iZXI+O1xuICBtYXg/OiBBcnJheTF0bzQ8bnVtYmVyPjtcbn1cblxuaW50ZXJmYWNlIEdsdGYyQnVmZmVyVmlld0Rlc2Mge1xuICBidWZmZXJJZHg6IEluZGV4O1xuICBidWZmZXJWaWV3Qnl0ZU9mZnNldDogQnl0ZTtcbiAgYWNjZXNzb3JCeXRlT2Zmc2V0OiBCeXRlO1xuICBhY2Nlc3NvckNvdW50OiBDb3VudDtcbiAgYnVmZmVyVmlld0J5dGVTdHJpZGU6IEJ5dGU7XG4gIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW07XG4gIHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdsdGYyQnVmZmVyVmlld0ZvckFuaW1hdGlvbih7XG4gIGJ1ZmZlcklkeCxcbiAgYnVmZmVyVmlld0J5dGVPZmZzZXQsXG4gIGFjY2Vzc29yQnl0ZU9mZnNldCxcbiAgYWNjZXNzb3JDb3VudCxcbiAgYnVmZmVyVmlld0J5dGVTdHJpZGUsXG4gIGNvbXBvbmVudFR5cGUsXG4gIGNvbXBvc2l0aW9uVHlwZSxcbiAgdWludDhBcnJheSxcbn06IEdsdGYyQnVmZmVyVmlld0Rlc2MpOiBHbHRmMkJ1ZmZlclZpZXdFeCB7XG4gIGNvbnN0IGFsaWduZWRBY2Nlc3NvckJ5dGVPZmZzZXQgPSBhbGlnbkFjY2Vzc29yQnl0ZU9mZnNldFRvNEJ5dGVzKGFjY2Vzc29yQnl0ZU9mZnNldCk7XG4gIGNvbnN0IHsgZml4ZWRCdWZmZXJWaWV3Qnl0ZUxlbmd0aCwgZml4ZWRCdWZmZXJWaWV3Qnl0ZU9mZnNldCB9ID1cbiAgICBjYWxjQnVmZmVyVmlld0J5dGVMZW5ndGhBbmRCeXRlT2Zmc2V0KHtcbiAgICAgIGFjY2Vzc29yQnl0ZU9mZnNldDogYWxpZ25lZEFjY2Vzc29yQnl0ZU9mZnNldCxcbiAgICAgIGFjY2Vzc29yQ291bnQ6IGFjY2Vzc29yQ291bnQsXG4gICAgICBidWZmZXJWaWV3Qnl0ZVN0cmlkZSxcbiAgICAgIGJ1ZmZlclZpZXdCeXRlT2Zmc2V0LFxuICAgICAgc2l6ZU9mQ29tcG9uZW50OiBjb21wb25lbnRUeXBlLmdldFNpemVJbkJ5dGVzKCksXG4gICAgICBudW1iZXJPZkNvbXBvbmVudHM6IGNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSxcbiAgICB9KTtcblxuICBjb25zdCBnbHRmQnVmZmVyVmlld0V4OiBHbHRmMkJ1ZmZlclZpZXdFeCA9IHtcbiAgICBidWZmZXI6IGJ1ZmZlcklkeCxcbiAgICBieXRlTGVuZ3RoOiBmaXhlZEJ1ZmZlclZpZXdCeXRlTGVuZ3RoLFxuICAgIGJ5dGVPZmZzZXQ6IGZpeGVkQnVmZmVyVmlld0J5dGVPZmZzZXQsXG4gICAgZXh0cmFzOiB7XG4gICAgICB1aW50OEFycmF5LFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGdsdGZCdWZmZXJWaWV3RXg7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdsdGYyQWNjZXNzb3JGb3JBbmltYXRpb24oe1xuICBidWZmZXJWaWV3SWR4LFxuICBhY2Nlc3NvckJ5dGVPZmZzZXQsXG4gIGNvbXBvbmVudFR5cGUsXG4gIGNvdW50LFxuICBjb21wb3NpdGlvblR5cGUsXG4gIG1pbixcbiAgbWF4LFxufTogR2x0ZjJBY2Nlc3NvckRlc2MpOiBHbHRmMkFjY2Vzc29yRXgge1xuICBjb25zdCBhbGlnbmVkQWNjZXNzb3JCeXRlT2Zmc2V0ID0gYWxpZ25BY2Nlc3NvckJ5dGVPZmZzZXRUbzRCeXRlcyhhY2Nlc3NvckJ5dGVPZmZzZXQpO1xuXG4gIGNvbnN0IGdsdGYyQWNjZXNzb3JFeCA9IHtcbiAgICBidWZmZXJWaWV3OiBidWZmZXJWaWV3SWR4LFxuICAgIGJ5dGVPZmZzZXQ6IGFsaWduZWRBY2Nlc3NvckJ5dGVPZmZzZXQsXG4gICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS50b0dsdGYyQWNjZXNzb3JDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGUpLFxuICAgIGNvdW50LFxuICAgIHR5cGU6IGNvbXBvc2l0aW9uVHlwZS5zdHIgYXMgR2x0ZjJBY2Nlc3NvckNvbXBvc2l0aW9uVHlwZVN0cmluZyxcbiAgICBtaW4sXG4gICAgbWF4LFxuICAgIGV4dHJhczoge30sXG4gIH07XG4gIHJldHVybiBnbHRmMkFjY2Vzc29yRXg7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9yUmV1c2VHbHRmMkJ1ZmZlclZpZXcoXG4gIGpzb246IEdsdGYyRXgsXG4gIGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJzOiBCdWZmZXJbXSxcbiAgZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlclZpZXdzOiBCdWZmZXJWaWV3W10sXG4gIHJuQnVmZmVyVmlldzogQnVmZmVyVmlldyxcbiAgdGFyZ2V0PzogbnVtYmVyXG4pIHtcbiAgY29uc3QgYnVmZmVyVmlld0lkeCA9IGZpbmRCdWZmZXJWaWV3SWR4KGV4aXN0aW5nVW5pcXVlUm5CdWZmZXJWaWV3cywgcm5CdWZmZXJWaWV3KTtcbiAgaWYgKGJ1ZmZlclZpZXdJZHggPT09IC0xKSB7XG4gICAgY29uc3QgYnVmZmVySWR4VG9TZXQgPSBjYWxjQnVmZmVySWR4VG9TZXQoZXhpc3RpbmdVbmlxdWVSbkJ1ZmZlcnMsIHJuQnVmZmVyVmlldy5idWZmZXIpO1xuICAgIGNvbnN0IGdsdGYyQnVmZmVyVmlldzogR2x0ZjJCdWZmZXJWaWV3RXggPSB7XG4gICAgICBidWZmZXI6IGJ1ZmZlcklkeFRvU2V0LFxuICAgICAgYnl0ZUxlbmd0aDogcm5CdWZmZXJWaWV3LmJ5dGVMZW5ndGgsXG4gICAgICBieXRlT2Zmc2V0OiBybkJ1ZmZlclZpZXcuYnl0ZU9mZnNldEluQnVmZmVyLFxuICAgICAgZXh0cmFzOiB7XG4gICAgICAgIHVpbnQ4QXJyYXk6IHJuQnVmZmVyVmlldy5nZXRVaW50OEFycmF5KCksXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKElzLmV4aXN0KHRhcmdldCkpIHtcbiAgICAgIGdsdGYyQnVmZmVyVmlldy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgfVxuXG4gICAganNvbi5leHRyYXMuYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZEFycmF5W2J1ZmZlcklkeFRvU2V0XSA9XG4gICAgICBhY2N1bXVsYXRlQnVmZmVyVmlld0J5dGVMZW5ndGgoXG4gICAgICAgIGpzb24uZXh0cmFzLmJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheSxcbiAgICAgICAgYnVmZmVySWR4VG9TZXQsXG4gICAgICAgIGdsdGYyQnVmZmVyVmlld1xuICAgICAgKTtcbiAgICBleGlzdGluZ1VuaXF1ZVJuQnVmZmVyVmlld3MucHVzaChybkJ1ZmZlclZpZXcpO1xuICAgIGpzb24uYnVmZmVyVmlld3MucHVzaChnbHRmMkJ1ZmZlclZpZXcpO1xuICAgIHJldHVybiBnbHRmMkJ1ZmZlclZpZXc7XG4gIH1cbiAgY29uc3QgZ2x0ZjJCdWZmZXJWaWV3ID0ganNvbi5idWZmZXJWaWV3c1tidWZmZXJWaWV3SWR4XTtcbiAgcmV0dXJuIGdsdGYyQnVmZmVyVmlldztcbn1cblxuZnVuY3Rpb24gY3JlYXRlT3JSZXVzZUdsdGYyQWNjZXNzb3IoXG4gIGpzb246IEdsdGYyRXgsXG4gIGJ1ZmZlclZpZXdJZHhUb1NldDogSW5kZXgsXG4gIGV4aXN0aW5nVW5pcXVlUm5BY2Nlc3NvcnM6IEFjY2Vzc29yW10sXG4gIHJuQWNjZXNzb3I6IEFjY2Vzc29yXG4pIHtcbiAgY29uc3QgYWNjZXNzb3JJZHggPSBjYWxjQWNjZXNzb3JJZHhUb1NldChleGlzdGluZ1VuaXF1ZVJuQWNjZXNzb3JzLCBybkFjY2Vzc29yKTtcbiAgaWYgKGFjY2Vzc29ySWR4ID09PSAtMSkge1xuICAgIC8vIGNyZWF0ZSBhIEdsdGYyQWNjZXNzb3JcbiAgICBjb25zdCBnbHRmMkFjY2Vzc29yOiBHbHRmMkFjY2Vzc29yRXggPSB7XG4gICAgICBidWZmZXJWaWV3OiBidWZmZXJWaWV3SWR4VG9TZXQsXG4gICAgICBieXRlT2Zmc2V0OiBybkFjY2Vzc29yLmJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXcsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLnRvR2x0ZjJBY2Nlc3NvckNvbXBvbmVudFR5cGUoXG4gICAgICAgIHJuQWNjZXNzb3IuY29tcG9uZW50VHlwZSBhcyBHbHRmMkFjY2Vzc29yQ29tcG9uZW50VHlwZVxuICAgICAgKSxcbiAgICAgIGNvdW50OiBybkFjY2Vzc29yLmVsZW1lbnRDb3VudCxcbiAgICAgIHR5cGU6IENvbXBvc2l0aW9uVHlwZS50b0dsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcoXG4gICAgICAgIHJuQWNjZXNzb3IuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpIGFzIFZlY3RvckFuZFNxdWFyZU1hdHJpeENvbXBvbmVudE5cbiAgICAgICksXG4gICAgICBleHRyYXM6IHtcbiAgICAgICAgdWludDhBcnJheTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChybkFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA8PSA0KSB7XG4gICAgICBnbHRmMkFjY2Vzc29yLm1heCA9IHJuQWNjZXNzb3IubWF4O1xuICAgICAgZ2x0ZjJBY2Nlc3Nvci5taW4gPSBybkFjY2Vzc29yLm1pbjtcbiAgICB9XG4gICAgZXhpc3RpbmdVbmlxdWVSbkFjY2Vzc29ycy5wdXNoKHJuQWNjZXNzb3IpO1xuICAgIGpzb24uYWNjZXNzb3JzLnB1c2goZ2x0ZjJBY2Nlc3Nvcik7XG4gICAgcmV0dXJuIGdsdGYyQWNjZXNzb3I7XG4gIH1cbiAgY29uc3QgZ2x0ZjJBY2Nlc3NvciA9IGpzb24uYWNjZXNzb3JzW2FjY2Vzc29ySWR4XTtcbiAgcmV0dXJuIGdsdGYyQWNjZXNzb3I7XG59XG4iLCJpbXBvcnQgeyBFZmZla3NlZXJDb21wb25lbnQsIElFZmZla3NlZXJFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vLi4vZWZmZWtzZWVyL0VmZmVrc2VlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBHbHRmMkV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvZ2xURjJGb3JPdXRwdXQnO1xuaW1wb3J0IHtcbiAgUm5NMkV4dGVuc2lvbkVmZmVrc2VlcixcbiAgUm5NMkV4dGVuc2lvbnNFZmZla3NlZXJFZmZlY3QsXG4gIFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmUsXG4gIFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmVJdGVtLFxufSBmcm9tICcuLi8uLi90eXBlcy9Sbk0yJztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9jb21wb25lbnRzL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuaW1wb3J0IHsgY3JlYXRlQW5kQWRkR2x0ZjJCdWZmZXJWaWV3IH0gZnJvbSAnLi9HbHRmMkV4cG9ydGVyT3BzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVrc2Vlcihqc29uOiBHbHRmMkV4LCBlbnRpdGllczogSVNjZW5lR3JhcGhFbnRpdHlbXSkge1xuICBsZXQgZWZmZWtzZWVyRXhpc3RzID0gZmFsc2U7XG4gIGNvbnN0IGJ1ZmZlcklkeCA9IGpzb24uZXh0cmFzLmJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheS5sZW5ndGggLSAxO1xuICBjb25zdCBlZmZlY3RzOiBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlckVmZmVjdFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50aXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllc1tpXTtcbiAgICBjb25zdCBlZmZla3NlZXJDb21wb25lbnQgPSBlbnRpdHkuZ2V0Q29tcG9uZW50QnlDb21wb25lbnRUSUQoXG4gICAgICBXZWxsS25vd25Db21wb25lbnRUSURzLkVmZmVrc2VlckNvbXBvbmVudFRJRFxuICAgICkgYXMgRWZmZWtzZWVyQ29tcG9uZW50O1xuICAgIGlmIChJcy5leGlzdChlZmZla3NlZXJDb21wb25lbnQpKSB7XG4gICAgICBlZmZla3NlZXJFeGlzdHMgPSB0cnVlO1xuXG4gICAgICBjb25zdCBlZmZla3NlZXI6IFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyRWZmZWN0ID0ge1xuICAgICAgICBub2RlOiBpLFxuICAgICAgICBuYW1lOiBlZmZla3NlZXJDb21wb25lbnQudW5pcXVlTmFtZSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChJcy5leGlzdChlZmZla3NlZXJDb21wb25lbnQuYXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIGNvbnN0IGdsdGYyQnVmZmVyVmlldyA9IGNyZWF0ZUFuZEFkZEdsdGYyQnVmZmVyVmlldyhcbiAgICAgICAgICBqc29uLFxuICAgICAgICAgIGJ1ZmZlcklkeCxcbiAgICAgICAgICBuZXcgVWludDhBcnJheShlZmZla3NlZXJDb21wb25lbnQuYXJyYXlCdWZmZXIpXG4gICAgICAgICk7XG4gICAgICAgIGVmZmVrc2Vlci5idWZmZXJWaWV3ID0ganNvbi5idWZmZXJWaWV3cy5pbmRleE9mKGdsdGYyQnVmZmVyVmlldyk7XG4gICAgICB9IGVsc2UgaWYgKElzLmV4aXN0KGVmZmVrc2VlckNvbXBvbmVudC51cmkpKSB7XG4gICAgICAgIGVmZmVrc2Vlci51cmkgPSBlZmZla3NlZXJDb21wb25lbnQudXJpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTG9nZ2VyLmVycm9yKCdubyByZWFsIGVmZmVjdCBkYXRhLicpO1xuICAgICAgfVxuXG4gICAgICBfX2NyZWF0ZUVmZmVrc2VlclRpbWVsaW5lKGVmZmVrc2VlckNvbXBvbmVudC5lbnRpdHksIGVmZmVrc2Vlcik7XG5cbiAgICAgIGVmZmVjdHMucHVzaChlZmZla3NlZXIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlZmZla3NlZXJFeGlzdHMpIHtcbiAgICBqc29uLmV4dGVuc2lvbnMhLlJIT0RPTklURV9lZmZla3NlZXIgPSB7XG4gICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgIGVmZmVjdHM6IGVmZmVjdHMsXG4gICAgfSBhcyBSbk0yRXh0ZW5zaW9uRWZmZWtzZWVyO1xuICAgIGpzb24uZXh0ZW5zaW9uc1VzZWQhLnB1c2goJ1JIT0RPTklURV9lZmZla3NlZXInKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfX2NyZWF0ZUVmZmVrc2VlclRpbWVsaW5lKGVudGl0eTogSUVudGl0eSwgZWZmZWtzZWVyOiBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlckVmZmVjdCkge1xuICBjb25zdCBhbmltYXRpb25Db21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRBbmltYXRpb24oKTtcbiAgaWYgKElzLmV4aXN0KGFuaW1hdGlvbkNvbXBvbmVudCkpIHtcbiAgICBjb25zdCB0cmFja05hbWVzID0gYW5pbWF0aW9uQ29tcG9uZW50LmdldEFuaW1hdGlvblRyYWNrTmFtZXMoKTtcbiAgICBjb25zdCB0aW1lbGluZXM6IFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdHJhY2tOYW1lIG9mIHRyYWNrTmFtZXMpIHtcbiAgICAgIGlmIChhbmltYXRpb25Db21wb25lbnQuaGFzQW5pbWF0aW9uKHRyYWNrTmFtZSwgJ2VmZmVrc2VlcicpKSB7XG4gICAgICAgIGNvbnN0IHJuQW5pbWF0aW9uVHJhY2sgPSBhbmltYXRpb25Db21wb25lbnQuZ2V0QW5pbWF0aW9uQ2hhbm5lbHNPZlRyYWNrKHRyYWNrTmFtZSk7XG4gICAgICAgIGlmIChJcy5leGlzdChybkFuaW1hdGlvblRyYWNrKSkge1xuICAgICAgICAgIGNvbnN0IHJuQ2hhbm5lbHMgPSBybkFuaW1hdGlvblRyYWNrLnZhbHVlcygpO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm5DaGFubmVsIG9mIHJuQ2hhbm5lbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhOYW1lID0gcm5DaGFubmVsLnRhcmdldC5wYXRoTmFtZTtcbiAgICAgICAgICAgIGlmIChwYXRoTmFtZSA9PT0gJ2VmZmVrc2VlcicpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5wdXRBcnJheSA9IHJuQ2hhbm5lbC5zYW1wbGVyLmlucHV0O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXM6IFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmVJdGVtW10gPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHJuQ2hhbm5lbC5zYW1wbGVyLm91dHB1dFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lbGluZUl0ZW06IFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmVJdGVtID0ge1xuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgICAgICAgICAgICAgZXZlbnQ6IG91dHB1dCA+IDAuNSA/ICdwbGF5JyA6ICdwYXVzZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0aW1lbGluZUl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVsaW5lOiBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlclRpbWVsaW5lID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRyYWNrTmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlZmZla3NlZXIudGltZWxpbmVzID0gdGltZWxpbmVzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmRleCB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IEdsdGYyQnVmZmVyVmlld0V4LCBHbHRmMkV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvZ2xURjJGb3JPdXRwdXQnO1xuaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi9taXNjL0RhdGFVdGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFuZEFkZEdsdGYyQnVmZmVyVmlldyhcbiAganNvbjogR2x0ZjJFeCxcbiAgYnVmZmVySWR4OiBJbmRleCxcbiAgdWludDhBcnJheTogVWludDhBcnJheVxuKTogR2x0ZjJCdWZmZXJWaWV3RXgge1xuICBjb25zdCBidWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkID1cbiAgICBqc29uLmV4dHJhcy5idWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkQXJyYXlbYnVmZmVySWR4XTtcbiAgY29uc3QgZ2x0ZkJ1ZmZlclZpZXdFeDogR2x0ZjJCdWZmZXJWaWV3RXggPSB7XG4gICAgYnVmZmVyOiBidWZmZXJJZHgsXG4gICAgYnl0ZUxlbmd0aDogdWludDhBcnJheS5ieXRlTGVuZ3RoLFxuICAgIGJ5dGVPZmZzZXQ6IGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQsXG4gICAgZXh0cmFzOiB7XG4gICAgICB1aW50OEFycmF5LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgbmV4dEJ1ZmZlclZpZXdCeXRlc0xlbmd0aEFjY3VtdWxhdGVkID1cbiAgICBEYXRhVXRpbC5hZGRQYWRkaW5nQnl0ZXMoZ2x0ZkJ1ZmZlclZpZXdFeC5ieXRlTGVuZ3RoLCA0KSArIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWQ7XG5cbiAganNvbi5idWZmZXJWaWV3cy5wdXNoKGdsdGZCdWZmZXJWaWV3RXgpO1xuICBqc29uLmV4dHJhcy5idWZmZXJWaWV3Qnl0ZUxlbmd0aEFjY3VtdWxhdGVkQXJyYXlbYnVmZmVySWR4XSA9XG4gICAgbmV4dEJ1ZmZlclZpZXdCeXRlc0xlbmd0aEFjY3VtdWxhdGVkO1xuICByZXR1cm4gZ2x0ZkJ1ZmZlclZpZXdFeDtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vR2x0ZjJFeHBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL0dsdGYyRXhwb3J0ZXJFZmZla3NlZXInO1xuIiwiaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBQcmltaXRpdmVNb2RlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgQXR0cmlidXRlcyB9IGZyb20gJy4vUHJpbWl0aXZlJztcbmltcG9ydCB7IEluZGljZXNBY2Nlc3NPcHRpb24sIEFjY2Vzc29yIH0gZnJvbSAnLi4vbWVtb3J5L0FjY2Vzc29yJztcbmltcG9ydCB7IEluZGV4LCBBcnJheTF0bzQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBBcnJheTEsIEFycmF5MiwgQXJyYXkzLCBBcnJheTQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBJU2VtYW50aWNWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuL0lTZW1hbnRpY1ZlcnRleEF0dHJpYnV0ZSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wbGV4VmVydGV4QXR0cmlidXRlIGltcGxlbWVudHMgSVNlbWFudGljVmVydGV4QXR0cmlidXRlIHtcbiAgcHJpdmF0ZSBfX3NlbWFudGljOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtO1xuICBwcml2YXRlIF9fY29tcG9uZW50czogQXJyYXkxdG80PEFjY2Vzc29yPiA9IFtdIGFzIHVua25vd24gYXMgQXJyYXkxdG80PEFjY2Vzc29yPjtcbiAgcHJpdmF0ZSBfX29mZnNldHM6IEFycmF5MXRvNDxJbmRleD4gPSBbXSBhcyB1bmtub3duIGFzIEFycmF5MXRvNDxJbmRleD47XG5cbiAgY29uc3RydWN0b3Ioc2VtYW50aWNBdHRyaWJ1dGU6IFZlcnRleEF0dHJpYnV0ZUVudW0sIGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXMpIHtcbiAgICB0aGlzLl9fc2VtYW50aWMgPSBzZW1hbnRpY0F0dHJpYnV0ZTtcbiAgICB0aGlzLl9fb2Zmc2V0cyA9IFtdIGFzIHVua25vd24gYXMgQXJyYXkxdG80PEluZGV4PjtcbiAgICB0aGlzLl9fY29tcG9uZW50cyA9IFtdIGFzIHVua25vd24gYXMgQXJyYXkxdG80PEFjY2Vzc29yPjtcbiAgICBmb3IgKGNvbnN0IFtqb2luZWRTdHJpbmcsIGFjY2Vzc29yXSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IGpvaW5lZFN0cmluZy5zcGxpdCgnLCcpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVDb21wb25lbnROYW1lID0gc3BsaXRbaV07XG4gICAgICAgIGlmIChhdHRyaWJ1dGVDb21wb25lbnROYW1lID09PSBzZW1hbnRpY0F0dHJpYnV0ZS5YKSB7XG4gICAgICAgICAgdGhpcy5fX29mZnNldHNbMF0gPSBpO1xuICAgICAgICAgIHRoaXMuX19jb21wb25lbnRzWzBdID0gYWNjZXNzb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZUNvbXBvbmVudE5hbWUgPT09IHNlbWFudGljQXR0cmlidXRlLlkpIHtcbiAgICAgICAgICB0aGlzLl9fb2Zmc2V0c1sxXSA9IGk7XG4gICAgICAgICAgdGhpcy5fX2NvbXBvbmVudHNbMV0gPSBhY2Nlc3NvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0cmlidXRlQ29tcG9uZW50TmFtZSA9PT0gc2VtYW50aWNBdHRyaWJ1dGUuWikge1xuICAgICAgICAgIHRoaXMuX19vZmZzZXRzWzJdID0gaTtcbiAgICAgICAgICB0aGlzLl9fY29tcG9uZW50c1syXSA9IGFjY2Vzc29yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRyaWJ1dGVDb21wb25lbnROYW1lID09PSBzZW1hbnRpY0F0dHJpYnV0ZS5XKSB7XG4gICAgICAgICAgdGhpcy5fX29mZnNldHNbM10gPSBpO1xuICAgICAgICAgIHRoaXMuX19jb21wb25lbnRzWzNdID0gYWNjZXNzb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2VtYW50aWMoKTogVmVydGV4QXR0cmlidXRlRW51bSB7XG4gICAgcmV0dXJuIHRoaXMuX19zZW1hbnRpYztcbiAgfVxuXG4gIHB1YmxpYyBnZXRTY2FsYXJBc0FycmF5KGk6IEluZGV4LCBvcHRpb246IEluZGljZXNBY2Nlc3NPcHRpb24pOiBBcnJheTE8bnVtYmVyPiB7XG4gICAgcmV0dXJuIFt0aGlzLl9fY29tcG9uZW50c1swXS5nZXRTY2FsYXJBdChpLCB0aGlzLl9fb2Zmc2V0c1swXSwgb3B0aW9uKV07XG4gIH1cbiAgcHVibGljIGdldFZlYzJBc0FycmF5KGk6IEluZGV4LCBvcHRpb246IEluZGljZXNBY2Nlc3NPcHRpb24pOiBBcnJheTI8bnVtYmVyPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX19jb21wb25lbnRzWzBdLmdldFNjYWxhckF0KGksIHRoaXMuX19vZmZzZXRzWzBdLCBvcHRpb24pLFxuICAgICAgdGhpcy5fX2NvbXBvbmVudHNbMV0hLmdldFNjYWxhckF0KGksIHRoaXMuX19vZmZzZXRzWzFdISwgb3B0aW9uKSxcbiAgICBdO1xuICB9XG4gIHB1YmxpYyBnZXRWZWMzQXNBcnJheShpOiBJbmRleCwgb3B0aW9uOiBJbmRpY2VzQWNjZXNzT3B0aW9uKTogQXJyYXkzPG51bWJlcj4ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9fY29tcG9uZW50c1swXS5nZXRTY2FsYXJBdChpLCB0aGlzLl9fb2Zmc2V0c1swXSwgb3B0aW9uKSxcbiAgICAgIHRoaXMuX19jb21wb25lbnRzWzFdIS5nZXRTY2FsYXJBdChpLCB0aGlzLl9fb2Zmc2V0c1sxXSEsIG9wdGlvbiksXG4gICAgICB0aGlzLl9fY29tcG9uZW50c1syXSEuZ2V0U2NhbGFyQXQoaSwgdGhpcy5fX29mZnNldHNbMl0hLCBvcHRpb24pLFxuICAgIF07XG4gIH1cbiAgcHVibGljIGdldFZlYzRBc0FycmF5KGk6IEluZGV4LCBvcHRpb246IEluZGljZXNBY2Nlc3NPcHRpb24pOiBBcnJheTQ8bnVtYmVyPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX19jb21wb25lbnRzWzBdLmdldFNjYWxhckF0KGksIHRoaXMuX19vZmZzZXRzWzBdLCBvcHRpb24pLFxuICAgICAgdGhpcy5fX2NvbXBvbmVudHNbMV0hLmdldFNjYWxhckF0KGksIHRoaXMuX19vZmZzZXRzWzFdISwgb3B0aW9uKSxcbiAgICAgIHRoaXMuX19jb21wb25lbnRzWzJdIS5nZXRTY2FsYXJBdChpLCB0aGlzLl9fb2Zmc2V0c1syXSEsIG9wdGlvbiksXG4gICAgICB0aGlzLl9fY29tcG9uZW50c1szXSEuZ2V0U2NhbGFyQXQoaSwgdGhpcy5fX29mZnNldHNbM10hLCBvcHRpb24pLFxuICAgIF07XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQ0JztcbmltcG9ydCB7IE11dGFibGVNYXRyaXg0NCB9IGZyb20gJy4uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9NZXNoL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHsgSW5kZXggfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5cbi8qKlxuICogVGhlIHZpZXcgZnJ1c3R1bSBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZydXN0dW0ge1xuICBwdWJsaWMgdG9wID0gTXV0YWJsZVZlY3RvcjQuemVybygpO1xuICBwdWJsaWMgYm90dG9tID0gTXV0YWJsZVZlY3RvcjQuemVybygpO1xuICBwdWJsaWMgcmlnaHQgPSBNdXRhYmxlVmVjdG9yNC56ZXJvKCk7XG4gIHB1YmxpYyBsZWZ0ID0gTXV0YWJsZVZlY3RvcjQuemVybygpO1xuICBwdWJsaWMgek5lYXIgPSBNdXRhYmxlVmVjdG9yNC56ZXJvKCk7XG4gIHB1YmxpYyB6RmFyID0gTXV0YWJsZVZlY3RvcjQuemVybygpO1xuICBwcml2YXRlIF9fdXBkYXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9fdnAgPSBNdXRhYmxlTWF0cml4NDQuemVybygpO1xuICBwcml2YXRlIF9faW52UHJvak1hdCA9IE11dGFibGVNYXRyaXg0NC56ZXJvKCk7XG4gIHByaXZhdGUgX19pbnZWaWV3TWF0ID0gTXV0YWJsZU1hdHJpeDQ0Lnplcm8oKTtcbiAgcHVibGljIGNvcm5lcnM6IFZlY3RvcjRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGlzIHZpZXcgZnJ1c3R1bSBkYXRhIGZyb20gdGhlIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cmljZXMuXG4gICAqIEBwYXJhbSB2aWV3TWF0cml4IFRoZSB2aWV3IG1hdHJpeC5cbiAgICogQHBhcmFtIHByb2plY3Rpb25NYXRyaXggVGhlIHByb2plY3Rpb24gbWF0cml4LlxuICAgKi9cbiAgdXBkYXRlKHZpZXdNYXRyaXg6IE1hdHJpeDQ0LCBwcm9qZWN0aW9uTWF0cml4OiBNYXRyaXg0NCkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgcGxhbmVzIG9mIHRoZSB2aWV3IGZydXN0dW0uXG4gICAgTWF0cml4NDQubXVsdGlwbHlUbyhwcm9qZWN0aW9uTWF0cml4LCB2aWV3TWF0cml4LCB0aGlzLl9fdnApO1xuXG4gICAgdGhpcy56TmVhci54ID0gdGhpcy5fX3ZwLm0yMCArIHRoaXMuX192cC5tMzA7XG4gICAgdGhpcy56TmVhci55ID0gdGhpcy5fX3ZwLm0yMSArIHRoaXMuX192cC5tMzE7XG4gICAgdGhpcy56TmVhci56ID0gdGhpcy5fX3ZwLm0yMiArIHRoaXMuX192cC5tMzI7XG4gICAgdGhpcy56TmVhci53ID0gdGhpcy5fX3ZwLm0yMyArIHRoaXMuX192cC5tMzM7XG4gICAgLy8gdGhpcy56TmVhci5ub3JtYWxpemUzKCk7XG5cbiAgICB0aGlzLnpGYXIueCA9IC10aGlzLl9fdnAubTIwICsgdGhpcy5fX3ZwLm0zMDtcbiAgICB0aGlzLnpGYXIueSA9IC10aGlzLl9fdnAubTIxICsgdGhpcy5fX3ZwLm0zMTtcbiAgICB0aGlzLnpGYXIueiA9IC10aGlzLl9fdnAubTIyICsgdGhpcy5fX3ZwLm0zMjtcbiAgICB0aGlzLnpGYXIudyA9IC10aGlzLl9fdnAubTIzICsgdGhpcy5fX3ZwLm0zMztcbiAgICAvLyB0aGlzLnpGYXIubm9ybWFsaXplMygpO1xuXG4gICAgdGhpcy5ib3R0b20ueCA9IHRoaXMuX192cC5tMTAgKyB0aGlzLl9fdnAubTMwO1xuICAgIHRoaXMuYm90dG9tLnkgPSB0aGlzLl9fdnAubTExICsgdGhpcy5fX3ZwLm0zMTtcbiAgICB0aGlzLmJvdHRvbS56ID0gdGhpcy5fX3ZwLm0xMiArIHRoaXMuX192cC5tMzI7XG4gICAgdGhpcy5ib3R0b20udyA9IHRoaXMuX192cC5tMTMgKyB0aGlzLl9fdnAubTMzO1xuICAgIC8vIHRoaXMuYm90dG9tLm5vcm1hbGl6ZTMoKTtcblxuICAgIHRoaXMudG9wLnggPSAtdGhpcy5fX3ZwLm0xMCArIHRoaXMuX192cC5tMzA7XG4gICAgdGhpcy50b3AueSA9IC10aGlzLl9fdnAubTExICsgdGhpcy5fX3ZwLm0zMTtcbiAgICB0aGlzLnRvcC56ID0gLXRoaXMuX192cC5tMTIgKyB0aGlzLl9fdnAubTMyO1xuICAgIHRoaXMudG9wLncgPSAtdGhpcy5fX3ZwLm0xMyArIHRoaXMuX192cC5tMzM7XG4gICAgLy8gdGhpcy50b3Aubm9ybWFsaXplMygpO1xuXG4gICAgdGhpcy5sZWZ0LnggPSB0aGlzLl9fdnAubTAwICsgdGhpcy5fX3ZwLm0zMDtcbiAgICB0aGlzLmxlZnQueSA9IHRoaXMuX192cC5tMDEgKyB0aGlzLl9fdnAubTMxO1xuICAgIHRoaXMubGVmdC56ID0gdGhpcy5fX3ZwLm0wMiArIHRoaXMuX192cC5tMzI7XG4gICAgdGhpcy5sZWZ0LncgPSB0aGlzLl9fdnAubTAzICsgdGhpcy5fX3ZwLm0zMztcbiAgICAvLyB0aGlzLmxlZnQubm9ybWFsaXplMygpO1xuXG4gICAgdGhpcy5yaWdodC54ID0gLXRoaXMuX192cC5tMDAgKyB0aGlzLl9fdnAubTMwO1xuICAgIHRoaXMucmlnaHQueSA9IC10aGlzLl9fdnAubTAxICsgdGhpcy5fX3ZwLm0zMTtcbiAgICB0aGlzLnJpZ2h0LnogPSAtdGhpcy5fX3ZwLm0wMiArIHRoaXMuX192cC5tMzI7XG4gICAgdGhpcy5yaWdodC53ID0gLXRoaXMuX192cC5tMDMgKyB0aGlzLl9fdnAubTMzO1xuICAgIC8vIHRoaXMucmlnaHQubm9ybWFsaXplMygpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBjb3JuZXJzIG9mIHRoZSB2aWV3IGZydXN0dW0uXG4gICAgY29uc3QgaENvcm5lcnMgPSBbXG4gICAgICAvLyBuZWFyXG4gICAgICBWZWN0b3I0LmZyb21Db3B5NCgtMSwgMSwgMSwgMSksXG4gICAgICBWZWN0b3I0LmZyb21Db3B5NCgxLCAxLCAxLCAxKSxcbiAgICAgIFZlY3RvcjQuZnJvbUNvcHk0KDEsIC0xLCAxLCAxKSxcbiAgICAgIFZlY3RvcjQuZnJvbUNvcHk0KC0xLCAtMSwgMSwgMSksXG4gICAgICAvLyBmYXJcbiAgICAgIFZlY3RvcjQuZnJvbUNvcHk0KC0xLCAxLCAtMSwgMSksXG4gICAgICBWZWN0b3I0LmZyb21Db3B5NCgxLCAxLCAtMSwgMSksXG4gICAgICBWZWN0b3I0LmZyb21Db3B5NCgxLCAtMSwgLTEsIDEpLFxuICAgICAgVmVjdG9yNC5mcm9tQ29weTQoLTEsIC0xLCAtMSwgMSksXG4gICAgXTtcblxuICAgIE1hdHJpeDQ0LmludmVydFRvKHByb2plY3Rpb25NYXRyaXgsIHRoaXMuX19pbnZQcm9qTWF0KTtcbiAgICBNYXRyaXg0NC5pbnZlcnRUbyh2aWV3TWF0cml4LCB0aGlzLl9faW52Vmlld01hdCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgIGhDb3JuZXJzW2ldID0gdGhpcy5fX2ludlByb2pNYXQubXVsdGlwbHlWZWN0b3IoaENvcm5lcnNbaV0pO1xuICAgICAgaENvcm5lcnNbaV0gPSBWZWN0b3I0LmZyb21Db3B5NChcbiAgICAgICAgaENvcm5lcnNbaV0ueCAvIGhDb3JuZXJzW2ldLncsXG4gICAgICAgIGhDb3JuZXJzW2ldLnkgLyBoQ29ybmVyc1tpXS53LFxuICAgICAgICBoQ29ybmVyc1tpXS56IC8gaENvcm5lcnNbaV0udyxcbiAgICAgICAgMVxuICAgICAgKTtcblxuICAgICAgdGhpcy5jb3JuZXJzW2ldID0gdGhpcy5fX2ludlZpZXdNYXQubXVsdGlwbHlWZWN0b3IoaENvcm5lcnNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmYWxzZSBpZiBmdWxseSBvdXRzaWRlLCB0cnVlIGlmIGluc2lkZSBvciBpbnRlcnNlY3RzXG4gICAqXG4gICAqIG9yaWdpbmFsIGlkZWEgaXMgZnJvbSBodHRwczovL2lxdWlsZXpsZXMub3JnL2FydGljbGVzL2ZydXN0dW1jb3JyZWN0L1xuICAgKi9cbiAgY3VsbGluZyhtZXNoQ29tcG9uZW50OiBNZXNoQ29tcG9uZW50KSB7XG4gICAgY29uc3QgYWFiYiA9IG1lc2hDb21wb25lbnQuZW50aXR5LmdldFNjZW5lR3JhcGgoKS53b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWw7XG5cbiAgICAvLyBjaGVjayBib3ggb3V0c2lkZS9pbnNpZGUgb2YgZnJ1c3R1bVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICBsZXQgb3V0ID0gMDtcbiAgICAgIGNvbnN0IHBsYW5lID0gdGhpcy5nZXRQbGFuZShpKTtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5taW5Qb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5taW5Qb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5taW5Qb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5tYXhQb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5taW5Qb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5taW5Qb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5taW5Qb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5tYXhQb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5taW5Qb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5tYXhQb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5tYXhQb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5taW5Qb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5taW5Qb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5taW5Qb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5tYXhQb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5tYXhQb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5taW5Qb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5tYXhQb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5taW5Qb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5tYXhQb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5tYXhQb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIG91dCArPVxuICAgICAgICBwbGFuZS54ICogYWFiYi5tYXhQb2ludC54ICtcbiAgICAgICAgICBwbGFuZS55ICogYWFiYi5tYXhQb2ludC55ICtcbiAgICAgICAgICBwbGFuZS56ICogYWFiYi5tYXhQb2ludC56ICtcbiAgICAgICAgICBwbGFuZS53IDxcbiAgICAgICAgMFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIGlmIChvdXQgPT09IDgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGZydXN0dW0gb3V0c2lkZS9pbnNpZGUgYm94XG4gICAgbGV0IG91dCA9IDA7XG4gICAgb3V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgY29uc3QgcGxhbmUgPSB0aGlzLmNvcm5lcnNbaV07XG4gICAgICBvdXQgKz0gcGxhbmUueCA+IGFhYmIubWF4UG9pbnQueCA/IDEgOiAwO1xuICAgIH1cbiAgICBpZiAob3V0ID09PSA4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG91dCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgIGNvbnN0IHBsYW5lID0gdGhpcy5jb3JuZXJzW2ldO1xuICAgICAgb3V0ICs9IHBsYW5lLnggPCBhYWJiLm1pblBvaW50LnggPyAxIDogMDtcbiAgICB9XG4gICAgaWYgKG91dCA9PT0gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvdXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICBjb25zdCBwbGFuZSA9IHRoaXMuY29ybmVyc1tpXTtcbiAgICAgIG91dCArPSBwbGFuZS55ID4gYWFiYi5tYXhQb2ludC55ID8gMSA6IDA7XG4gICAgfVxuICAgIGlmIChvdXQgPT09IDgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb3V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgY29uc3QgcGxhbmUgPSB0aGlzLmNvcm5lcnNbaV07XG4gICAgICBvdXQgKz0gcGxhbmUueSA8IGFhYmIubWluUG9pbnQueSA/IDEgOiAwO1xuICAgIH1cbiAgICBpZiAob3V0ID09PSA4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG91dCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgIGNvbnN0IHBsYW5lID0gdGhpcy5jb3JuZXJzW2ldO1xuICAgICAgb3V0ICs9IHBsYW5lLnogPiBhYWJiLm1heFBvaW50LnogPyAxIDogMDtcbiAgICB9XG4gICAgaWYgKG91dCA9PT0gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvdXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICBjb25zdCBwbGFuZSA9IHRoaXMuY29ybmVyc1tpXTtcbiAgICAgIG91dCArPSBwbGFuZS56IDwgYWFiYi5taW5Qb2ludC56ID8gMSA6IDA7XG4gICAgfVxuICAgIGlmIChvdXQgPT09IDgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFBsYW5lKGk6IEluZGV4KSB7XG4gICAgc3dpdGNoIChpKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiB0aGlzLnRvcDtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gdGhpcy5yaWdodDtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIHRoaXMuek5lYXI7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJldHVybiB0aGlzLnpGYXI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGxhbmUgaW5kZXguJyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBBcnJheTEsIEFycmF5MiwgQXJyYXkzLCBBcnJheTQsIEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IEluZGljZXNBY2Nlc3NPcHRpb24gfSBmcm9tICcuLi9tZW1vcnkvQWNjZXNzb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZW1hbnRpY1ZlcnRleEF0dHJpYnV0ZSB7XG4gIHNlbWFudGljOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtO1xuICBnZXRTY2FsYXJBc0FycmF5OiAoaTogSW5kZXgsIG9wdGlvbjogSW5kaWNlc0FjY2Vzc09wdGlvbikgPT4gQXJyYXkxPG51bWJlcj47XG4gIGdldFZlYzJBc0FycmF5OiAoaTogSW5kZXgsIG9wdGlvbjogSW5kaWNlc0FjY2Vzc09wdGlvbikgPT4gQXJyYXkyPG51bWJlcj47XG4gIGdldFZlYzNBc0FycmF5OiAoaTogSW5kZXgsIG9wdGlvbjogSW5kaWNlc0FjY2Vzc09wdGlvbikgPT4gQXJyYXkzPG51bWJlcj47XG4gIGdldFZlYzRBc0FycmF5OiAoaTogSW5kZXgsIG9wdGlvbjogSW5kaWNlc0FjY2Vzc09wdGlvbikgPT4gQXJyYXk0PG51bWJlcj47XG59XG4iLCJpbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tICcuL1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gJy4uL2NvcmUvTWVtb3J5TWFuYWdlcic7XG5pbXBvcnQgeyBCdWZmZXJVc2UgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9CdWZmZXJVc2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tICcuLi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMic7XG5pbXBvcnQgeyBBQUJCIH0gZnJvbSAnLi4vbWF0aC9BQUJCJztcbmltcG9ydCB7IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSW5kZXgsIENHQVBJUmVzb3VyY2VIYW5kbGUsIE1lc2hVSUQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgVmVydGV4SGFuZGxlcyB9IGZyb20gJy4uLy4uL3dlYmdsL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBJVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBJTWVzaCwgUmF5Y2FzdFJlc3VsdEV4MSB9IGZyb20gJy4vdHlwZXMvR2VvbWV0cnlUeXBlcyc7XG5pbXBvcnQgeyBJTWVzaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2gvTWVzaENvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9jZXNzU3RhZ2UgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Qcm9jZXNzU3RhZ2UnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG4vKipcbiAqIFRoZSBNZXNoIGNsYXNzLlxuICogVGhpcyBtZXNoIG9iamVjdCBoYXMgcHJpbWl0aXZlcyAoZ2VvbWV0cmllcykgb3IgYSByZWZlcmVuY2Ugb2YgJ29yaWdpbmFsIG1lc2gnLlxuICogSWYgdGhlIGxhdHRlciwgdGhpcyBtZXNoIG9iamVjdCBpcyBhbiAnaW5zdGFuY2VkIG1lc2gnLCB3aGljaCBoYXMgbm8gcHJpbWl0aXZlcy5cbiAqIEluc3RhbmNlZCBtZXNoZXMgcmVmZXIgb3JpZ2luYWwgbWVzaCdzIHByaW1pdGl2ZXMgd2hlbiBkcmF3aW5nLlxuICovXG5leHBvcnQgY2xhc3MgTWVzaCBpbXBsZW1lbnRzIElNZXNoIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfX21lc2hVSUQ6IE1lc2hVSUQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW52YWxpZGF0ZU1lc2hVSUQgPSAtMTtcbiAgcHVibGljIHN0YXRpYyBfX21lc2hfdWlkX2NvdW50ID0gTWVzaC5pbnZhbGlkYXRlTWVzaFVJRDtcbiAgcHJpdmF0ZSBfX3ByaW1pdGl2ZXM6IFByaW1pdGl2ZVtdID0gW107XG4gIHByaXZhdGUgX19vcGFxdWVQcmltaXRpdmVzOiBBcnJheTxQcmltaXRpdmU+ID0gW107XG4gIHByaXZhdGUgX190cmFuc3BhcmVudFByaW1pdGl2ZXM6IEFycmF5PFByaW1pdGl2ZT4gPSBbXTtcbiAgcHJpdmF0ZSBfX21vcnBoUHJpbWl0aXZlczogQXJyYXk8UHJpbWl0aXZlPiA9IFtdO1xuICBwcml2YXRlIF9fbG9jYWxBQUJCID0gbmV3IEFBQkIoKTtcbiAgcHJpdmF0ZSBfX3Zhb1VpZHM6IENHQVBJUmVzb3VyY2VIYW5kbGVbXSA9IFtdO1xuICBwcml2YXRlIF9fdmFyaWF0aW9uVkJPVWlkOiBDR0FQSVJlc291cmNlSGFuZGxlID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gIHByaXZhdGUgX19sYXRlc3RQcmltaXRpdmVQb3NpdGlvbkFjY2Vzc29yVmVyc2lvbkZvckFBQkIgPSAwO1xuICBwcml2YXRlIF9fbGF0ZXN0UHJpbWl0aXZlUG9zaXRpb25BY2Nlc3NvclZlcnNpb25Gb3JTZXRVcERvbmUgPSAwO1xuICBwcml2YXRlIF9fYmVsb25nVG9FbnRpdGllczogSU1lc2hFbnRpdHlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpY2F0aW9uIG9mIHdoZW4gY2FsY3VsYXRlIHRoZSB0YW5nZW50IG9mIGEgdmVydGV4IHRvIGFwcGx5IE5vcm1hbCB0ZXh0dXJlIChmb3IgcGJyL01Ub29uIHNoYWRlcilcbiAgICogMDogTm90IGNhbGN1bGF0ZSB0YW5nZW50IChub3QgYXBwbHkgbm9ybWFsIHRleHR1cmUpXG4gICAqIDE6IChkZWZhdWx0KSBVc2Ugb3JpZ2luYWwgdGFuZ2VudCBpbiBhIHZlcnRleCwgaWYgYSB2ZXJ0ZXggaGFzIHRhbmdlbnQgYXR0cmlidXRlLiBJZiBhIHZlcnRleCBkb2VzIG5vdCBoYXZlIGl0LCBjYWxjdWxhdGUgYSB0YW5nZW50IGluIGEgc2hhZGVyLlxuICAgKiAyOiBVc2Ugb3JpZ2luYWwgdGFuZ2VudCBpbiBhIHZlcnRleCwgaWYgYSB2ZXJ0ZXggaGFzIHRhbmdlbnQgYXR0cmlidXRlLiBJZiBhIHZlcnRleCBkb2VzIG5vdCBoYXZlIGl0LCBwcmVjYWxjdWxhdGUgYSB0YW5nZW50IGluIHRoZSBqYXZhc2NyaXB0LlxuICAgKiAzOiBDYWxjdWxhdGUgYWxsIHRhbmdlbnQgaW4gYSBzaGFkZXIuXG4gICAqIDQ6IFByZWNhbGN1bGF0ZSBhbGwgdGFuZ2VudCBpbiB0aGUgamF2YXNjcmlwdFxuICAgKi9cbiAgcHVibGljIHRhbmdlbnRDYWxjdWxhdGlvbk1vZGU6IEluZGV4ID0gMTtcblxuICBwcml2YXRlIF9faGFzRmFjZU5vcm1hbCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM18wOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWMzXzE6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlYzNfMjogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM18zOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWMzXzQ6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlYzNfNTogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM182OiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWMzXzc6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlYzNfODogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM185OiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWMzXzEwOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWMzXzExOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3RtcFJldHVyblZlYzNfMDogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wUmV0dXJuVmVjM18xOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBSZXR1cm5WZWMzXzI6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuXG4gIHByaXZhdGUgX19wcmltaXRpdmVQb3NpdGlvblVwZGF0ZUNvdW50ID0gMDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX19tZXNoVUlEID0gKytNZXNoLl9fbWVzaF91aWRfY291bnQ7XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBQdWJsaWMgTWVtYmVyc1xuICAvLy9cbiAgLy8vXG5cbiAgcHVibGljIGdldFZhb1VpZHMoaW5kZXg6IEluZGV4KTogQ0dBUElSZXNvdXJjZUhhbmRsZSB7XG4gICAgcmV0dXJuIHRoaXMuX192YW9VaWRzW2luZGV4XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYW9VaWRzQnlQcmltaXRpdmVVaWQocHJpbWl0aXZlVWlkOiBJbmRleCk6IENHQVBJUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fX3ByaW1pdGl2ZXMuZmluZEluZGV4KFxuICAgICAgKHByaW1pdGl2ZSkgPT4gcHJpbWl0aXZlLnByaW1pdGl2ZVVpZCA9PT0gcHJpbWl0aXZlVWlkXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLl9fdmFvVWlkc1tpbmRleF07XG4gIH1cblxuICBnZXQgbWVzaEVudGl0aWVzSW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19iZWxvbmdUb0VudGl0aWVzO1xuICB9XG5cbiAgX2JlbG9uZ1RvTWVzaENvbXBvbmVudChtZXNoQ29tcG9uZW50OiBNZXNoQ29tcG9uZW50KSB7XG4gICAgdGhpcy5fX2JlbG9uZ1RvRW50aXRpZXMucHVzaChtZXNoQ29tcG9uZW50LmVudGl0eSk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgcHJpbWl0aXZlLlxuICAgKiBAcGFyYW0gcHJpbWl0aXZlIFRoZSBwcmltaXRpdmUgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFkZFByaW1pdGl2ZShwcmltaXRpdmU6IFByaW1pdGl2ZSk6IHZvaWQge1xuICAgIHByaW1pdGl2ZS5fYmVsb25nVG9NZXNoKHRoaXMpO1xuXG4gICAgaWYgKFxuICAgICAgcHJpbWl0aXZlLm1hdGVyaWFsID09IG51bGwgfHxcbiAgICAgICghcHJpbWl0aXZlLm1hdGVyaWFsLmlzQmxlbmQoKSAmJiAhcHJpbWl0aXZlLm1hdGVyaWFsLmlzVHJhbnNsdWNlbnQpXG4gICAgKSB7XG4gICAgICB0aGlzLl9fb3BhcXVlUHJpbWl0aXZlcy5wdXNoKHByaW1pdGl2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX190cmFuc3BhcmVudFByaW1pdGl2ZXMucHVzaChwcmltaXRpdmUpO1xuICAgIH1cbiAgICB0aGlzLl9fc2V0UHJpbWl0aXZlcyh0aGlzLl9fb3BhcXVlUHJpbWl0aXZlcy5jb25jYXQodGhpcy5fX3RyYW5zcGFyZW50UHJpbWl0aXZlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3NldFByaW1pdGl2ZXMocHJpbWl0aXZlczogUHJpbWl0aXZlW10pIHtcbiAgICB0aGlzLl9fcHJpbWl0aXZlcyA9IHByaW1pdGl2ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0cnVlIGlmIHRoZXNlIHByaW1pdGl2ZXMgYXJlIGFsbCAnQmxlbmQnIHR5cGVcbiAgICovXG4gIHB1YmxpYyBpc0FsbFRyYW5zbHVjZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9fdHJhbnNwYXJlbnRQcmltaXRpdmVzLmxlbmd0aCA+IDAgJiYgdGhpcy5fX29wYXF1ZVByaW1pdGl2ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRydWUgaWYgc29tZSBwcmltaXRpdmVzIGFyZSAnQmxlbmQnIHR5cGVcbiAgICovXG4gIHB1YmxpYyBpc1BhcnRpYWxseVRyYW5zbHVjZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9fdHJhbnNwYXJlbnRQcmltaXRpdmVzLmxlbmd0aCA+IDAgJiYgdGhpcy5fX29wYXF1ZVByaW1pdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0cnVlIGlmIHRoZXNlIHByaW1pdGl2ZXMgYXJlIGFsbCAnT3BhcXVlJyB0eXBlXG4gICAqL1xuICBwdWJsaWMgaXNBbGxPcGFxdWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX190cmFuc3BhcmVudFByaW1pdGl2ZXMubGVuZ3RoID09PSAwICYmIHRoaXMuX19vcGFxdWVQcmltaXRpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFByaW1pdGl2ZUF0KGk6IG51bWJlcik6IFByaW1pdGl2ZSB7XG4gICAgLy8gaWYgKHRoaXMud2VpZ2h0cy5sZW5ndGggPiAwKSB7XG4gICAgLy8gcmV0dXJuIHRoaXMuX19tb3JwaFByaW1pdGl2ZXNbaV07XG4gICAgLy8gfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5fX3ByaW1pdGl2ZXNbaV07XG4gICAgLy8gfVxuICB9XG5cbiAgcHVibGljIGdldFByaW1pdGl2ZU51bWJlcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9fcHJpbWl0aXZlcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEByZXR1cm5zIHRydWU6IHVwZGF0ZWQsIGZhbHNlOiBub3QgY2hhbmdlZCAobm90IGRpcnR5KVxuICAgKi9cbiAgdXBkYXRlVmFyaWF0aW9uVkJPKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcblxuICAgIGlmICh0aGlzLl9fdmFyaWF0aW9uVkJPVWlkICE9PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuZGVsZXRlVmVydGV4QnVmZmVyKHRoaXMuX192YXJpYXRpb25WQk9VaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTnVtID0gdGhpcy5fX2JlbG9uZ1RvRW50aXRpZXMubGVuZ3RoO1xuICAgIC8vIGNvbnN0IGVudGl0eUluZm8gPSBuZXcgRmxvYXQzMkFycmF5KGluc3RhbmNlTnVtKTtcbiAgICBjb25zdCBlbnRpdHlJbmZvID0gbmV3IEZsb2F0MzJBcnJheShpbnN0YW5jZU51bSAqIDQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdGFuY2VOdW07IGkrKykge1xuICAgICAgZW50aXR5SW5mb1s0ICogaSArIDBdID0gdGhpcy5fX2JlbG9uZ1RvRW50aXRpZXNbaV0uZ2V0U2NlbmVHcmFwaCgpLmNvbXBvbmVudFNJRDtcbiAgICAgIGNvbnN0IHNrZWxldGFsID0gdGhpcy5fX2JlbG9uZ1RvRW50aXRpZXNbaV0udHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgICAgaWYgKHNrZWxldGFsICE9IG51bGwpIHtcbiAgICAgICAgZW50aXR5SW5mb1s0ICogaSArIDFdID0gc2tlbGV0YWwuY29tcG9uZW50U0lEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50aXR5SW5mb1s0ICogaSArIDFdID0gLTE7XG4gICAgICB9XG4gICAgICBjb25zdCBibGVuZFNoYXBlID0gdGhpcy5fX2JlbG9uZ1RvRW50aXRpZXNbaV0udHJ5VG9HZXRCbGVuZFNoYXBlKCk7XG4gICAgICBpZiAoYmxlbmRTaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGVudGl0eUluZm9bNCAqIGkgKyAyXSA9IGJsZW5kU2hhcGUuY29tcG9uZW50U0lEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50aXR5SW5mb1s0ICogaSArIDJdID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX192YXJpYXRpb25WQk9VaWQgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tVHlwZWRBcnJheShlbnRpdHlJbmZvKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8vXG4gIC8vLyBQdWJsaWMgV2ViR0wtcmVsYXRlZCBNZXRob2RzXG4gIC8vL1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHJldHVybnMgdHJ1ZTogdXBkYXRlZCwgZmFsc2U6IG5vdCBjaGFuZ2VkIChub3QgZGlydHkpXG4gICAqL1xuICBkZWxldGVWYXJpYXRpb25WQk8oKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGlmICh0aGlzLl9fdmFyaWF0aW9uVkJPVWlkICE9PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZGVsZXRlVmVydGV4QnVmZmVyKHRoaXMuX192YXJpYXRpb25WQk9VaWQpO1xuICAgICAgdGhpcy5fX3ZhcmlhdGlvblZCT1VpZCA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZBTygpOiB2b2lkIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG5cbiAgICAvLyBjcmVhdGUgYW5kIHVwZGF0ZSBWQU9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19wcmltaXRpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcmltaXRpdmUgPSB0aGlzLl9fcHJpbWl0aXZlc1tpXTtcbiAgICAgIGNvbnN0IHZlcnRleEhhbmRsZXMgPSBwcmltaXRpdmUudmVydGV4SGFuZGxlcyBhcyBWZXJ0ZXhIYW5kbGVzO1xuICAgICAgaWYgKElzLnVuZGVmaW5lZCh2ZXJ0ZXhIYW5kbGVzKSkge1xuICAgICAgICBMb2dnZXIud2FybignTmVlZCB0byBjcmVhdGUgM0RBUElWZXJ0ZXhEYXRhIGJlZm9yZSB1cGRhdGUgVkFPJyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGlzTmFOKHRoaXMuX192YW9VaWRzW2ldKSB8fFxuICAgICAgICB0aGlzLl9fdmFvVWlkc1tpXSA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQgfHxcbiAgICAgICAgdmVydGV4SGFuZGxlcy52YW9IYW5kbGUgPT09IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fX3Zhb1VpZHNbaV0gPSB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVWZXJ0ZXhBcnJheSgpITtcbiAgICAgICAgdmVydGV4SGFuZGxlcy52YW9IYW5kbGUgPSB0aGlzLl9fdmFvVWlkc1tpXTtcbiAgICAgIH1cblxuICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VmVydGV4RGF0YVRvUGlwZWxpbmUoXG4gICAgICAgIHZlcnRleEhhbmRsZXMsXG4gICAgICAgIHByaW1pdGl2ZSxcbiAgICAgICAgdGhpcy5fX3ZhcmlhdGlvblZCT1VpZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdXNlbGVzcyBWQU9cbiAgICBmb3IgKGxldCBpID0gdGhpcy5fX3ByaW1pdGl2ZXMubGVuZ3RoOyBpIDwgdGhpcy5fX3Zhb1VpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl9fdmFvVWlkc1tpXSkge1xuICAgICAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5kZWxldGVWZXJ0ZXhBcnJheSh0aGlzLl9fdmFvVWlkc1tpXSk7XG4gICAgICAgIHRoaXMuX192YW9VaWRzW2ldID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZVZBTygpIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fdmFvVWlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZGVsZXRlVmVydGV4QXJyYXkodGhpcy5fX3Zhb1VpZHNbaV0pO1xuICAgICAgdGhpcy5fX3Zhb1VpZHNbaV0gPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FzdFJheShcbiAgICBzcmNQb2ludEluTG9jYWw6IElWZWN0b3IzLFxuICAgIGRpcmVjdGlvbkluTG9jYWw6IElWZWN0b3IzLFxuICAgIGRvdFRocmVzaG9sZCA9IDBcbiAgKTogUmF5Y2FzdFJlc3VsdEV4MSB7XG4gICAgbGV0IGZpbmFsU2hvcnRlc3RJbnRlcnNlY3RlZFBvc1ZlYzM6IElWZWN0b3IzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBmaW5hbFNob3J0ZXN0VCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgbGV0IHUgPSAwO1xuICAgIGxldCB2ID0gMDtcbiAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZSBvZiB0aGlzLl9fcHJpbWl0aXZlcykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJpbWl0aXZlLmNhc3RSYXkoXG4gICAgICAgIHNyY1BvaW50SW5Mb2NhbCxcbiAgICAgICAgZGlyZWN0aW9uSW5Mb2NhbCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZG90VGhyZXNob2xkLFxuICAgICAgICB0aGlzLl9faGFzRmFjZU5vcm1hbFxuICAgICAgKTtcbiAgICAgIGlmIChJcy5kZWZpbmVkKHJlc3VsdC5kYXRhKSAmJiByZXN1bHQuZGF0YT8udCA8IGZpbmFsU2hvcnRlc3RUKSB7XG4gICAgICAgIGZpbmFsU2hvcnRlc3RUID0gcmVzdWx0LmRhdGEudDtcbiAgICAgICAgZmluYWxTaG9ydGVzdEludGVyc2VjdGVkUG9zVmVjMyA9IHJlc3VsdC5kYXRhLnBvc2l0aW9uITtcbiAgICAgICAgdSA9IHJlc3VsdC5kYXRhLnU7XG4gICAgICAgIHYgPSByZXN1bHQuZGF0YS52O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChJcy5kZWZpbmVkKGZpbmFsU2hvcnRlc3RJbnRlcnNlY3RlZFBvc1ZlYzMpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IHRydWUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB0OiBmaW5hbFNob3J0ZXN0VCxcbiAgICAgICAgICB1LFxuICAgICAgICAgIHYsXG4gICAgICAgICAgcG9zaXRpb246IGZpbmFsU2hvcnRlc3RJbnRlcnNlY3RlZFBvc1ZlYzMsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBBY2Nlc3NvcnNcbiAgLy8vXG4gIC8vL1xuXG4gIGdldCBwcmltaXRpdmVzKCkge1xuICAgIHJldHVybiB0aGlzLl9fcHJpbWl0aXZlcztcbiAgfVxuXG4gIGdldCBtZXNoVUlEKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWVzaFVJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBfdmFyaWF0aW9uVkJPVWlkKCk6IENHQVBJUmVzb3VyY2VIYW5kbGUge1xuICAgIHJldHVybiB0aGlzLl9fdmFyaWF0aW9uVkJPVWlkO1xuICB9XG5cbiAgX29uUHJpbWl0aXZlUG9zaXRpb25VcGRhdGVkKCkge1xuICAgIHRoaXMuX19wcmltaXRpdmVQb3NpdGlvblVwZGF0ZUNvdW50Kys7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgdGhpcy5fX2JlbG9uZ1RvRW50aXRpZXMpIHtcbiAgICAgIGVudGl0eS5nZXRNZXNoUmVuZGVyZXIoKS5tb3ZlU3RhZ2VUbyhQcm9jZXNzU3RhZ2UuTG9hZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByaW1pdGl2ZVBvc2l0aW9uVXBkYXRlQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wcmltaXRpdmVQb3NpdGlvblVwZGF0ZUNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgQUFCQiBpbiBsb2NhbCBzcGFjZS5cbiAgICovXG4gIGdldCBBQUJCKCk6IEFBQkIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX19wcmltaXRpdmVQb3NpdGlvblVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGF0ZXN0UHJpbWl0aXZlUG9zaXRpb25BY2Nlc3NvclZlcnNpb25Gb3JBQUJCXG4gICAgKSB7XG4gICAgICB0aGlzLl9fbG9jYWxBQUJCLmluaXRpYWxpemUoKTtcbiAgICAgIHRoaXMuX19sYXRlc3RQcmltaXRpdmVQb3NpdGlvbkFjY2Vzc29yVmVyc2lvbkZvckFBQkIgPSB0aGlzLl9fcHJpbWl0aXZlUG9zaXRpb25VcGRhdGVDb3VudDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX2xvY2FsQUFCQi5pc1ZhbmlsbGEoKSkge1xuICAgICAgZm9yIChjb25zdCBwcmltaXRpdmUgb2YgdGhpcy5fX3ByaW1pdGl2ZXMpIHtcbiAgICAgICAgdGhpcy5fX2xvY2FsQUFCQi5tZXJnZUFBQkIocHJpbWl0aXZlLkFBQkIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fbG9jYWxBQUJCO1xuICB9XG5cbiAgLy8vXG4gIC8vL1xuICAvLyBGcmllbmQgTWVtYmVyc1xuICAvLy9cbiAgLy8vXG5cbiAgLy8vXG4gIC8vL1xuICAvLy8gUHJpdmF0ZSBNZW1iZXJzXG4gIC8vL1xuICAvLy9cblxuICBwcml2YXRlIF9fY2FsY01vcnBoUHJpbWl0aXZlcygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19wcmltaXRpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtb3JwaFByaW1pdGl2ZSA9IHRoaXMuX19tb3JwaFByaW1pdGl2ZXNbaV07XG4gICAgICBjb25zdCBwcmltaXRpdmUgPSB0aGlzLl9fcHJpbWl0aXZlc1tpXTtcbiAgICAgIGNvbnN0IHRhcmdldDBBdHRyaWJ1dGVzID0gcHJpbWl0aXZlLnRhcmdldHNbMF07XG4gICAgICB0YXJnZXQwQXR0cmlidXRlcy5mb3JFYWNoKChhY2Nlc3Nvciwgc2VtYW50aWMpID0+IHtcbiAgICAgICAgY29uc3QgbW9ycGhBY2Nlc3NvciA9IG1vcnBoUHJpbWl0aXZlLmdldEF0dHJpYnV0ZShzZW1hbnRpYykhO1xuICAgICAgICBjb25zdCBlbGVtZW50Q291bnQgPSBtb3JwaEFjY2Vzc29yLmVsZW1lbnRDb3VudDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Q291bnQ7IGorKykge1xuICAgICAgICAgIG1vcnBoQWNjZXNzb3Iuc2V0RWxlbWVudEZyb21TYW1lQ29tcG9zaXRpb25BY2Nlc3NvcihqLCBwcmltaXRpdmUuZ2V0QXR0cmlidXRlKHNlbWFudGljKSEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gcHJpbWl0aXZlLnRhcmdldHMuZm9yRWFjaCgodGFyZ2V0QXR0cmlidXRlcywgayk9PntcbiAgICAgIC8vICAgdGFyZ2V0QXR0cmlidXRlcy5mb3JFYWNoKChhY2Nlc3Nvciwgc2VtYW50aWMpID0+IHtcbiAgICAgIC8vICAgICBjb25zdCBtb3JwaEFjY2Vzc29yID0gbW9ycGhQcmltaXRpdmUuZ2V0QXR0cmlidXRlKHNlbWFudGljKSE7XG4gICAgICAvLyAgICAgY29uc3QgZWxlbWVudENvdW50ID0gbW9ycGhBY2Nlc3Nvci5lbGVtZW50Q291bnQ7XG4gICAgICAvLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Q291bnQ7IGorKykge1xuICAgICAgLy8gICAgICAgbW9ycGhBY2Nlc3Nvci5hZGRFbGVtZW50RnJvbVNhbWVDb21wb3NpdGlvbkFjY2Vzc29yKGosIGFjY2Vzc29yLCB0aGlzLndlaWdodHNba10pO1xuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfY2FsY1RhbmdlbnRzKCkge1xuICAgIGlmICghdGhpcy5fX3VzZVByZUNhbGN1bGF0ZWRUYW5nZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcmltaXRpdmUgb2YgdGhpcy5fX3ByaW1pdGl2ZXMpIHtcbiAgICAgIGNvbnN0IHRhbmdlbnRJZHggPSBwcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzLmluZGV4T2YoVmVydGV4QXR0cmlidXRlLlRhbmdlbnQuWFlaKTtcbiAgICAgIGlmICh0YW5nZW50SWR4ICE9PSAtMSAmJiB0aGlzLnRhbmdlbnRDYWxjdWxhdGlvbk1vZGUgPT09IDIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXhjb29yZElkeCA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVTZW1hbnRpY3MuaW5kZXhPZihWZXJ0ZXhBdHRyaWJ1dGUuVGV4Y29vcmQwLlhZKTtcbiAgICAgIGNvbnN0IG5vcm1hbElkeCA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVTZW1hbnRpY3MuaW5kZXhPZihWZXJ0ZXhBdHRyaWJ1dGUuTm9ybWFsLlhZWik7XG4gICAgICBpZiAodGV4Y29vcmRJZHggIT09IC0xICYmIG5vcm1hbElkeCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25JZHggPSBwcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzLmluZGV4T2YoVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWik7XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25BY2Nlc3NvciA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnNbcG9zaXRpb25JZHhdO1xuICAgICAgICBjb25zdCB0ZXhjb29yZEFjY2Vzc29yID0gcHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29yc1t0ZXhjb29yZElkeF07XG4gICAgICAgIGNvbnN0IG5vcm1hbEFjY2Vzc29yID0gcHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29yc1tub3JtYWxJZHhdO1xuICAgICAgICBjb25zdCBpbmRpY2VzQWNjZXNzb3IgPSBwcmltaXRpdmUuaW5kaWNlc0FjY2Vzc29yO1xuXG4gICAgICAgIGxldCBpbmNyZW1lbnROdW0gPSAzOyAvLyBQcmltaXRpdmVNb2RlLlRyaWFuZ2xlc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJpbWl0aXZlLnByaW1pdGl2ZU1vZGUgPT09IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVTdHJpcCB8fFxuICAgICAgICAgIHByaW1pdGl2ZS5wcmltaXRpdmVNb2RlID09PSBQcmltaXRpdmVNb2RlLlRyaWFuZ2xlRmFuXG4gICAgICAgICkge1xuICAgICAgICAgIGluY3JlbWVudE51bSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2ZXJ0ZXhOdW0gPSBwcmltaXRpdmUuZ2V0VmVydGV4Q291bnRBc0luZGljZXNCYXNlZCgpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBNZW1vcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlT3JHZXRCdWZmZXIoQnVmZmVyVXNlLkNQVUdlbmVyaWMpO1xuXG4gICAgICAgIGNvbnN0IHRhbmdlbnRBdHRyaWJ1dGVCeXRlU2l6ZSA9IChwb3NpdGlvbkFjY2Vzc29yLmJ5dGVMZW5ndGggKiA0KSAvIDM7XG4gICAgICAgIGNvbnN0IHRhbmdlbnRCdWZmZXJWaWV3ID0gYnVmZmVyXG4gICAgICAgICAgLnRha2VCdWZmZXJWaWV3KHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IHRhbmdlbnRBdHRyaWJ1dGVCeXRlU2l6ZSxcbiAgICAgICAgICAgIGJ5dGVTdHJpZGU6IDAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudW53cmFwRm9yY2UoKTtcbiAgICAgICAgY29uc3QgdGFuZ2VudEFjY2Vzc29yID0gdGFuZ2VudEJ1ZmZlclZpZXdcbiAgICAgICAgICAudGFrZUFjY2Vzc29yKHtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICAgICAgY291bnQ6IHBvc2l0aW9uQWNjZXNzb3IuZWxlbWVudENvdW50LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnVud3JhcEZvcmNlKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4TnVtIC0gMjsgaSArPSBpbmNyZW1lbnROdW0pIHtcbiAgICAgICAgICBjb25zdCBwb3MwID0gcG9zaXRpb25BY2Nlc3Nvci5nZXRWZWMzKGksIHsgaW5kaWNlc0FjY2Vzc29yIH0pO1xuICAgICAgICAgIGNvbnN0IHBvczEgPSBwb3NpdGlvbkFjY2Vzc29yLmdldFZlYzMoaSArIDEsIHsgaW5kaWNlc0FjY2Vzc29yIH0pO1xuICAgICAgICAgIGNvbnN0IHBvczIgPSBwb3NpdGlvbkFjY2Vzc29yLmdldFZlYzMoaSArIDIsIHsgaW5kaWNlc0FjY2Vzc29yIH0pO1xuICAgICAgICAgIGNvbnN0IHV2MCA9IHRleGNvb3JkQWNjZXNzb3IuZ2V0VmVjMihpLCB7IGluZGljZXNBY2Nlc3NvciB9KTtcbiAgICAgICAgICBjb25zdCB1djEgPSB0ZXhjb29yZEFjY2Vzc29yLmdldFZlYzIoaSArIDEsIHsgaW5kaWNlc0FjY2Vzc29yIH0pO1xuICAgICAgICAgIGNvbnN0IHV2MiA9IHRleGNvb3JkQWNjZXNzb3IuZ2V0VmVjMihpICsgMiwgeyBpbmRpY2VzQWNjZXNzb3IgfSk7XG4gICAgICAgICAgY29uc3Qgbm9ybTAgPSBub3JtYWxBY2Nlc3Nvci5nZXRWZWMzKGksIHsgaW5kaWNlc0FjY2Vzc29yIH0pO1xuXG4gICAgICAgICAgdGhpcy5fX2NhbGNUYW5nZW50Rm9yM1ZlcnRpY2VzKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHBvczAsXG4gICAgICAgICAgICBwb3MxLFxuICAgICAgICAgICAgcG9zMixcbiAgICAgICAgICAgIHV2MCxcbiAgICAgICAgICAgIHV2MSxcbiAgICAgICAgICAgIHV2MixcbiAgICAgICAgICAgIG5vcm0wLFxuICAgICAgICAgICAgdGFuZ2VudEFjY2Vzc29yLFxuICAgICAgICAgICAgaW5kaWNlc0FjY2Vzc29yXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwcmltaXRpdmUuc2V0VmVydGV4QXR0cmlidXRlKHRhbmdlbnRBY2Nlc3NvciwgVmVydGV4QXR0cmlidXRlLlRhbmdlbnQuWFlaKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIF9fY2FsY1RhbmdlbnRGb3IzVmVydGljZXMoXG4gICAgaTogSW5kZXgsXG4gICAgcG9zMDogVmVjdG9yMyxcbiAgICBwb3MxOiBWZWN0b3IzLFxuICAgIHBvczI6IFZlY3RvcjMsXG4gICAgdXYwOiBWZWN0b3IyLFxuICAgIHV2MTogVmVjdG9yMixcbiAgICB1djI6IFZlY3RvcjIsXG4gICAgbm9ybTA6IFZlY3RvcjMsXG4gICAgdGFuZ2VudEFjY2Vzc29yOiBBY2Nlc3NvcixcbiAgICBpbmRpY2VzQWNjZXNzb3I/OiBBY2Nlc3NvclxuICApIHtcbiAgICBjb25zdCB0YW4wVmVjMyA9IHRoaXMuX19jYWxjVGFuZ2VudFBlclZlcnRleChcbiAgICAgIHBvczAsXG4gICAgICBwb3MxLFxuICAgICAgcG9zMixcbiAgICAgIHV2MCxcbiAgICAgIHV2MSxcbiAgICAgIHV2MixcbiAgICAgIG5vcm0wLFxuICAgICAgTWVzaC5fX3RtcFJldHVyblZlYzNfMFxuICAgICk7XG4gICAgY29uc3QgdGFuMVZlYzMgPSB0aGlzLl9fY2FsY1RhbmdlbnRQZXJWZXJ0ZXgoXG4gICAgICBwb3MxLFxuICAgICAgcG9zMixcbiAgICAgIHBvczAsXG4gICAgICB1djEsXG4gICAgICB1djIsXG4gICAgICB1djAsXG4gICAgICBub3JtMCxcbiAgICAgIE1lc2guX190bXBSZXR1cm5WZWMzXzFcbiAgICApO1xuICAgIGNvbnN0IHRhbjJWZWMzID0gdGhpcy5fX2NhbGNUYW5nZW50UGVyVmVydGV4KFxuICAgICAgcG9zMixcbiAgICAgIHBvczAsXG4gICAgICBwb3MxLFxuICAgICAgdXYyLFxuICAgICAgdXYwLFxuICAgICAgdXYxLFxuICAgICAgbm9ybTAsXG4gICAgICBNZXNoLl9fdG1wUmV0dXJuVmVjM18yXG4gICAgKTtcblxuICAgIHRhbmdlbnRBY2Nlc3Nvci5zZXRWZWM0KGksIHRhbjBWZWMzLngsIHRhbjBWZWMzLnksIHRhbjBWZWMzLnosIDEsIHtcbiAgICAgIGluZGljZXNBY2Nlc3NvcixcbiAgICB9KTtcbiAgICB0YW5nZW50QWNjZXNzb3Iuc2V0VmVjNChpICsgMSwgdGFuMVZlYzMueCwgdGFuMVZlYzMueSwgdGFuMVZlYzMueiwgMSwge1xuICAgICAgaW5kaWNlc0FjY2Vzc29yLFxuICAgIH0pO1xuICAgIHRhbmdlbnRBY2Nlc3Nvci5zZXRWZWM0KGkgKyAyLCB0YW4yVmVjMy54LCB0YW4yVmVjMy55LCB0YW4yVmVjMy56LCAxLCB7XG4gICAgICBpbmRpY2VzQWNjZXNzb3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9fY2FsY1RhbmdlbnRQZXJWZXJ0ZXgoXG4gICAgcG9zMFZlYzM6IFZlY3RvcjMsXG4gICAgcG9zMVZlYzM6IFZlY3RvcjMsXG4gICAgcG9zMlZlYzM6IFZlY3RvcjMsXG4gICAgdXYwVmVjMjogVmVjdG9yMixcbiAgICB1djFWZWMyOiBWZWN0b3IyLFxuICAgIHV2MlZlYzI6IFZlY3RvcjIsXG4gICAgbm9ybTBWZWMzOiBWZWN0b3IzLFxuICAgIHJldHVyblZlYzM6IE11dGFibGVWZWN0b3IzXG4gICkge1xuICAgIGNvbnN0IGNwMCA9IFtcbiAgICAgIE1lc2guX190bXBWZWMzXzAuc2V0Q29tcG9uZW50cyhwb3MwVmVjMy54LCB1djBWZWMyLngsIHV2MFZlYzIueSksXG4gICAgICBNZXNoLl9fdG1wVmVjM18xLnNldENvbXBvbmVudHMocG9zMFZlYzMueSwgdXYwVmVjMi54LCB1djBWZWMyLnkpLFxuICAgICAgTWVzaC5fX3RtcFZlYzNfMi5zZXRDb21wb25lbnRzKHBvczBWZWMzLnosIHV2MFZlYzIueCwgdXYwVmVjMi55KSxcbiAgICBdO1xuXG4gICAgY29uc3QgY3AxID0gW1xuICAgICAgTWVzaC5fX3RtcFZlYzNfMy5zZXRDb21wb25lbnRzKHBvczFWZWMzLngsIHV2MVZlYzIueCwgdXYxVmVjMi55KSxcbiAgICAgIE1lc2guX190bXBWZWMzXzQuc2V0Q29tcG9uZW50cyhwb3MxVmVjMy55LCB1djFWZWMyLngsIHV2MVZlYzIueSksXG4gICAgICBNZXNoLl9fdG1wVmVjM181LnNldENvbXBvbmVudHMocG9zMVZlYzMueiwgdXYxVmVjMi54LCB1djFWZWMyLnkpLFxuICAgIF07XG5cbiAgICBjb25zdCBjcDIgPSBbXG4gICAgICBNZXNoLl9fdG1wVmVjM182LnNldENvbXBvbmVudHMocG9zMlZlYzMueCwgdXYyVmVjMi54LCB1djJWZWMyLnkpLFxuICAgICAgTWVzaC5fX3RtcFZlYzNfNy5zZXRDb21wb25lbnRzKHBvczJWZWMzLnksIHV2MlZlYzIueCwgdXYyVmVjMi55KSxcbiAgICAgIE1lc2guX190bXBWZWMzXzguc2V0Q29tcG9uZW50cyhwb3MyVmVjMy56LCB1djJWZWMyLngsIHV2MlZlYzIueSksXG4gICAgXTtcblxuICAgIGNvbnN0IHUgPSBbXTtcbiAgICBjb25zdCB2ID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgY29uc3QgdjEgPSBNdXRhYmxlVmVjdG9yMy5zdWJ0cmFjdFRvKGNwMVtpXSwgY3AwW2ldLCBNZXNoLl9fdG1wVmVjM185KTtcbiAgICAgIGNvbnN0IHYyID0gTXV0YWJsZVZlY3RvcjMuc3VidHJhY3RUbyhjcDJbaV0sIGNwMVtpXSwgTWVzaC5fX3RtcFZlYzNfMTApO1xuICAgICAgY29uc3QgYWJjID0gTXV0YWJsZVZlY3RvcjMuY3Jvc3NUbyh2MSwgdjIsIE1lc2guX190bXBWZWMzXzExKTtcblxuICAgICAgY29uc3QgdmFsaWRhdGUgPSBNYXRoLmFicyhhYmMueCkgPCBOdW1iZXIuRVBTSUxPTjtcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICBMb2dnZXIuYXNzZXJ0KHZhbGlkYXRlLCAnUG9seWdvbnMgb3IgcG9seWdvbnMgb24gVVYgYXJlIGRlZ2VuZXJhdGUhJyk7XG4gICAgICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIDBdKTtcbiAgICAgIH1cblxuICAgICAgdVtpXSA9IC1hYmMueSAvIGFiYy54O1xuICAgICAgdltpXSA9IC1hYmMueiAvIGFiYy54O1xuICAgIH1cblxuICAgIGlmICh1WzBdICogdVswXSArIHVbMV0gKiB1WzFdICsgdVsyXSAqIHVbMl0gPCBOdW1iZXIuRVBTSUxPTikge1xuICAgICAgTXV0YWJsZVZlY3RvcjMuY3Jvc3NUbyhub3JtMFZlYzMsIHBvczFWZWMzLCByZXR1cm5WZWMzKTtcbiAgICAgIHJldHVybiByZXR1cm5WZWMzLm5vcm1hbGl6ZSgpIGFzIFZlY3RvcjM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZlYzMuc2V0Q29tcG9uZW50cyh1WzBdLCB1WzFdLCB1WzJdKS5ub3JtYWxpemUoKSBhcyBWZWN0b3IzO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3VzZVByZUNhbGN1bGF0ZWRUYW5nZW50KCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMudGFuZ2VudENhbGN1bGF0aW9uTW9kZSA9PT0gMCB8fFxuICAgICAgdGhpcy50YW5nZW50Q2FsY3VsYXRpb25Nb2RlID09PSAxIHx8XG4gICAgICB0aGlzLnRhbmdlbnRDYWxjdWxhdGlvbk1vZGUgPT09IDNcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2NhbGNCYXJ5Q2VudHJpY0Nvb3JkKCkge1xuICAgIGZvciAoY29uc3QgcHJpbWl0aXZlIG9mIHRoaXMuX19wcmltaXRpdmVzKSB7XG4gICAgICBjb25zdCBCYXJ5Q2VudHJpY0Nvb3JkSWQgPSBwcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzLmluZGV4T2YoXG4gICAgICAgIFZlcnRleEF0dHJpYnV0ZS5CYXJ5Q2VudHJpY0Nvb3JkLlhZWlxuICAgICAgKTtcbiAgICAgIGlmIChCYXJ5Q2VudHJpY0Nvb3JkSWQgIT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZU9yR2V0QnVmZmVyKEJ1ZmZlclVzZS5DUFVHZW5lcmljKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSWR4ID0gcHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljcy5pbmRleE9mKFZlcnRleEF0dHJpYnV0ZS5Qb3NpdGlvbi5YWVopO1xuICAgICAgY29uc3QgcG9zaXRpb25BY2Nlc3NvciA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnNbcG9zaXRpb25JZHhdO1xuICAgICAgY29uc3QgdmVydGV4TnVtID0gcG9zaXRpb25BY2Nlc3Nvci5lbGVtZW50Q291bnQ7XG4gICAgICBjb25zdCBudW0gPSB2ZXJ0ZXhOdW07XG5cbiAgICAgIGNvbnN0IGJhcnlDZW50cmljQ29vcmRBdHRyaWJ1dGVCeXRlU2l6ZSA9IG51bSAqIDQgLyogdmVjNCAqLyAqIDQ7IC8qIGJ5dGVzICovXG4gICAgICBjb25zdCBiYXJ5Q2VudHJpY0Nvb3JkQnVmZmVyVmlldyA9IGJ1ZmZlclxuICAgICAgICAudGFrZUJ1ZmZlclZpZXcoe1xuICAgICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IGJhcnlDZW50cmljQ29vcmRBdHRyaWJ1dGVCeXRlU2l6ZSxcbiAgICAgICAgICBieXRlU3RyaWRlOiAwLFxuICAgICAgICB9KVxuICAgICAgICAudW53cmFwRm9yY2UoKTtcbiAgICAgIGNvbnN0IGJhcnlDZW50cmljQ29vcmRBY2Nlc3NvciA9IGJhcnlDZW50cmljQ29vcmRCdWZmZXJWaWV3XG4gICAgICAgIC50YWtlQWNjZXNzb3Ioe1xuICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICBjb3VudDogbnVtLFxuICAgICAgICB9KVxuICAgICAgICAudW53cmFwRm9yY2UoKTtcblxuICAgICAgZm9yIChsZXQgdmVyX2kgPSAwOyB2ZXJfaSA8IG51bTsgdmVyX2krKykge1xuICAgICAgICBiYXJ5Q2VudHJpY0Nvb3JkQWNjZXNzb3Iuc2V0VmVjNChcbiAgICAgICAgICB2ZXJfaSxcbiAgICAgICAgICB2ZXJfaSAlIDMgPT09IDAgPyAxIDogMCwgLy8gMSAwIDAgIDEgMCAwICAxIDAgMCxcbiAgICAgICAgICB2ZXJfaSAlIDMgPT09IDEgPyAxIDogMCwgLy8gMCAxIDAgIDAgMSAwICAwIDEgMCxcbiAgICAgICAgICB2ZXJfaSAlIDMgPT09IDIgPyAxIDogMCwgLy8gMCAwIDEgIDAgMCAxICAwIDAgMSxcbiAgICAgICAgICB2ZXJfaSxcbiAgICAgICAgICB7fVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcHJpbWl0aXZlLnNldFZlcnRleEF0dHJpYnV0ZShiYXJ5Q2VudHJpY0Nvb3JkQWNjZXNzb3IsIFZlcnRleEF0dHJpYnV0ZS5CYXJ5Q2VudHJpY0Nvb3JkLlhZWik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2NhbGNGYWNlTm9ybWFsc0lmTm9uTm9ybWFsKCkge1xuICAgIGZvciAoY29uc3QgcHJpbWl0aXZlIG9mIHRoaXMuX19wcmltaXRpdmVzKSB7XG4gICAgICBjb25zdCBub3JtYWxJZHggPSBwcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzLmluZGV4T2YoVmVydGV4QXR0cmlidXRlLk5vcm1hbC5YWVopO1xuICAgICAgaWYgKG5vcm1hbElkeCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9faGFzRmFjZU5vcm1hbCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHBvc2l0aW9uSWR4ID0gcHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljcy5pbmRleE9mKFZlcnRleEF0dHJpYnV0ZS5Qb3NpdGlvbi5YWVopO1xuICAgICAgY29uc3QgcG9zaXRpb25BY2Nlc3NvciA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnNbcG9zaXRpb25JZHhdO1xuICAgICAgY29uc3QgaW5kaWNlc0FjY2Vzc29yID0gcHJpbWl0aXZlLmluZGljZXNBY2Nlc3NvcjtcblxuICAgICAgbGV0IGluY3JlbWVudE51bSA9IDM7IC8vIFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVzXG4gICAgICBpZiAoXG4gICAgICAgIHByaW1pdGl2ZS5wcmltaXRpdmVNb2RlID09PSBQcmltaXRpdmVNb2RlLlRyaWFuZ2xlU3RyaXAgfHxcbiAgICAgICAgcHJpbWl0aXZlLnByaW1pdGl2ZU1vZGUgPT09IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVGYW5cbiAgICAgICkge1xuICAgICAgICBpbmNyZW1lbnROdW0gPSAxO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2ZXJ0ZXhOdW0gPSBwcmltaXRpdmUuZ2V0VmVydGV4Q291bnRBc0luZGljZXNCYXNlZCgpO1xuICAgICAgY29uc3QgYnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZU9yR2V0QnVmZmVyKEJ1ZmZlclVzZS5DUFVHZW5lcmljKTtcblxuICAgICAgY29uc3Qgbm9ybWFsQXR0cmlidXRlQnl0ZVNpemUgPSBwb3NpdGlvbkFjY2Vzc29yLmJ5dGVMZW5ndGg7XG4gICAgICBjb25zdCBub3JtYWxCdWZmZXJWaWV3ID0gYnVmZmVyXG4gICAgICAgIC50YWtlQnVmZmVyVmlldyh7XG4gICAgICAgICAgYnl0ZUxlbmd0aFRvTmVlZDogbm9ybWFsQXR0cmlidXRlQnl0ZVNpemUsXG4gICAgICAgICAgYnl0ZVN0cmlkZTogMCxcbiAgICAgICAgfSlcbiAgICAgICAgLnVud3JhcEZvcmNlKCk7XG4gICAgICBjb25zdCBub3JtYWxBY2Nlc3NvciA9IG5vcm1hbEJ1ZmZlclZpZXdcbiAgICAgICAgLnRha2VBY2Nlc3Nvcih7XG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICAgIGNvdW50OiBwb3NpdGlvbkFjY2Vzc29yLmVsZW1lbnRDb3VudCxcbiAgICAgICAgfSlcbiAgICAgICAgLnVud3JhcEZvcmNlKCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleE51bSAtIDI7IGkgKz0gaW5jcmVtZW50TnVtKSB7XG4gICAgICAgIGNvbnN0IHBvczAgPSBwb3NpdGlvbkFjY2Vzc29yLmdldFZlYzMoaSwgeyBpbmRpY2VzQWNjZXNzb3IgfSk7XG4gICAgICAgIGNvbnN0IHBvczEgPSBwb3NpdGlvbkFjY2Vzc29yLmdldFZlYzMoaSArIDEsIHsgaW5kaWNlc0FjY2Vzc29yIH0pO1xuICAgICAgICBjb25zdCBwb3MyID0gcG9zaXRpb25BY2Nlc3Nvci5nZXRWZWMzKGkgKyAyLCB7IGluZGljZXNBY2Nlc3NvciB9KTtcblxuICAgICAgICB0aGlzLl9fY2FsY0ZhY2VOb3JtYWxGb3IzVmVydGljZXMoaSwgcG9zMCwgcG9zMSwgcG9zMiwgbm9ybWFsQWNjZXNzb3IsIGluZGljZXNBY2Nlc3Nvcik7XG4gICAgICB9XG4gICAgICBwcmltaXRpdmUuc2V0VmVydGV4QXR0cmlidXRlKG5vcm1hbEFjY2Vzc29yLCBWZXJ0ZXhBdHRyaWJ1dGUuTm9ybWFsLlhZWik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2NhbGNGYWNlTm9ybWFsRm9yM1ZlcnRpY2VzKFxuICAgIGk6IEluZGV4LFxuICAgIHBvczA6IFZlY3RvcjMsXG4gICAgcG9zMTogVmVjdG9yMyxcbiAgICBwb3MyOiBWZWN0b3IzLFxuICAgIG5vcm1hbEFjY2Vzc29yOiBBY2Nlc3NvcixcbiAgICBpbmRpY2VzQWNjZXNzb3I/OiBBY2Nlc3NvclxuICApIHtcbiAgICAvLyBDYWxjIG5vcm1hbFxuICAgIGNvbnN0IGF4ID0gcG9zMS54IC0gcG9zMC54O1xuICAgIGNvbnN0IGF5ID0gcG9zMS55IC0gcG9zMC55O1xuICAgIGNvbnN0IGF6ID0gcG9zMS56IC0gcG9zMC56O1xuICAgIGNvbnN0IGJ4ID0gcG9zMi54IC0gcG9zMC54O1xuICAgIGNvbnN0IGJ5ID0gcG9zMi55IC0gcG9zMC55O1xuICAgIGNvbnN0IGJ6ID0gcG9zMi56IC0gcG9zMC56O1xuXG4gICAgbGV0IG54ID0gYXkgKiBieiAtIGF6ICogYnk7IC8vIGNyb3NzIHByb2R1Y3RcbiAgICBsZXQgbnkgPSBheiAqIGJ4IC0gYXggKiBiejtcbiAgICBsZXQgbnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuICAgIGxldCBkYSA9IE1hdGguaHlwb3QobngsIG55LCBueik7IC8vIG5vcm1hbGl6ZVxuICAgIGlmIChkYSA8PSAxZS02KSB7XG4gICAgICBkYSA9IDAuMDAwMTtcbiAgICB9XG4gICAgZGEgPSAxLjAgLyBkYTtcbiAgICBueCAqPSBkYTtcbiAgICBueSAqPSBkYTtcbiAgICBueiAqPSBkYTtcblxuICAgIG5vcm1hbEFjY2Vzc29yLnNldFZlYzMoaSwgbngsIG55LCBueiwgeyBpbmRpY2VzQWNjZXNzb3IgfSk7XG4gICAgbm9ybWFsQWNjZXNzb3Iuc2V0VmVjMyhpICsgMSwgbngsIG55LCBueiwgeyBpbmRpY2VzQWNjZXNzb3IgfSk7XG4gICAgbm9ybWFsQWNjZXNzb3Iuc2V0VmVjMyhpICsgMiwgbngsIG55LCBueiwgeyBpbmRpY2VzQWNjZXNzb3IgfSk7XG4gIH1cblxuICBnZXRQcmltaXRpdmVJbmRleEluTWVzaChwcmltaXRpdmU6IFByaW1pdGl2ZSkge1xuICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZXMuaW5kZXhPZihwcmltaXRpdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgbWF0ZXJpYWwgdmFyaWFudCB0byB0aGUgbWVzaFxuICAgKiBAcGFyYW0gdmFyaWFudE5hbWUgYSB2YXJpYW50IG5hbWVcbiAgICovXG4gIGFwcGx5TWF0ZXJpYWxWYXJpYW50KHZhcmlhbnROYW1lOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZSBvZiB0aGlzLnByaW1pdGl2ZXMpIHtcbiAgICAgIHByaW1pdGl2ZS5hcHBseU1hdGVyaWFsVmFyaWFudCh2YXJpYW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFZhcmlhbnROYW1lKCkge1xuICAgIGZ1bmN0aW9uIGFsbEVxdWFsKGFycjogc3RyaW5nW10pIHtcbiAgICAgIHJldHVybiBhcnIuZXZlcnkoKHZhbCkgPT4gdmFsID09PSBhcnJbMF0pO1xuICAgIH1cbiAgICBjb25zdCB2YXJpYW50TmFtZXMgPSB0aGlzLnByaW1pdGl2ZXMubWFwKChwcmltaXRpdmUpID0+IHByaW1pdGl2ZS5nZXRDdXJyZW50VmFyaWFudE5hbWUoKSk7XG4gICAgaWYgKHZhcmlhbnROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKGFsbEVxdWFsKHZhcmlhbnROYW1lcykpIHtcbiAgICAgIHJldHVybiB2YXJpYW50TmFtZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0VmFyaWFudE5hbWVzKCkge1xuICAgIGNvbnN0IHZhcmlhbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJpbWl0aXZlIG9mIHRoaXMucHJpbWl0aXZlcykge1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodmFyaWFudHMsIHByaW1pdGl2ZS5nZXRWYXJpYW50TmFtZXMoKSk7XG4gICAgfVxuICAgIHJldHVybiB2YXJpYW50cztcbiAgfVxuXG4gIGlzU2V0VXBEb25lKCkge1xuICAgIGxldCB2ZXJ0ZXhIYW5kbGVzUmVhZHkgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcHJpbWl0aXZlIG9mIHRoaXMucHJpbWl0aXZlcykge1xuICAgICAgaWYgKHByaW1pdGl2ZS52ZXJ0ZXhIYW5kbGVzID09IG51bGwpIHtcbiAgICAgICAgdmVydGV4SGFuZGxlc1JlYWR5ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXZlcnRleEhhbmRsZXNSZWFkeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuX19sYXRlc3RQcmltaXRpdmVQb3NpdGlvbkFjY2Vzc29yVmVyc2lvbkZvclNldFVwRG9uZSAhPT1cbiAgICAgIHRoaXMuX19wcmltaXRpdmVQb3NpdGlvblVwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICB0aGlzLl9fbGF0ZXN0UHJpbWl0aXZlUG9zaXRpb25BY2Nlc3NvclZlcnNpb25Gb3JTZXRVcERvbmUgPVxuICAgICAgICB0aGlzLl9fcHJpbWl0aXZlUG9zaXRpb25VcGRhdGVDb3VudDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIG1ha2VWZXJ0aWNlc1NlcGFyYXRlZCgpIHtcbiAgLy8gICBmb3IgKGxldCBwcmltaXRpdmUgb2YgdGhpcy5fX3ByaW1pdGl2ZXMpIHtcbiAgLy8gICAgIGlmIChwcmltaXRpdmUuaGFzSW5kaWNlcygpKSB7XG4gIC8vICAgICAgIGNvbnN0IGJ1ZmZlciA9IE1lbW9yeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVPckdldEJ1ZmZlcihCdWZmZXJVc2UuQ1BVR2VuZXJpYyk7XG4gIC8vICAgICAgIGNvbnN0IHZlcnRleENvdW50ID0gcHJpbWl0aXZlLmdldFZlcnRleENvdW50QXNJbmRpY2VzQmFzZWQoKTtcblxuICAvLyAgICAgICBjb25zdCBpbmRleEFjY2Vzc29yID0gcHJpbWl0aXZlLmluZGljZXNBY2Nlc3NvcjtcbiAgLy8gICAgICAgZm9yIChsZXQgaSBpbiBwcmltaXRpdmUuYXR0cmlidXRlQWNjZXNzb3JzKSB7XG4gIC8vICAgICAgICAgY29uc3QgYXR0cmlidXRlQWNjZXNzb3IgPSBwcmltaXRpdmUuYXR0cmlidXRlQWNjZXNzb3JzW2ldO1xuICAvLyAgICAgICAgIGNvbnN0IGVsZW1lbnRTaXplSW5CeXRlcyA9IGF0dHJpYnV0ZUFjY2Vzc29yLmVsZW1lbnRTaXplSW5CeXRlcztcbiAgLy8gICAgICAgICBjb25zdCBidWZmZXJWaWV3ID0gYnVmZmVyLnRha2VCdWZmZXJWaWV3KHsgYnl0ZUxlbmd0aFRvTmVlZDogZWxlbWVudFNpemVJbkJ5dGVzICogdmVydGV4Q291bnQsIGJ5dGVTdHJpZGU6IDAsIGlzQW9TOiBmYWxzZSB9KTtcbiAgLy8gICAgICAgICBjb25zdCBuZXdBY2Nlc3NvciA9IGJ1ZmZlclZpZXcudGFrZUFjY2Vzc29yKHsgY29tcG9zaXRpb25UeXBlOiBhdHRyaWJ1dGVBY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGU6IGF0dHJpYnV0ZUFjY2Vzc29yLmNvbXBvbmVudFR5cGUsIGNvdW50OiB2ZXJ0ZXhDb3VudCB9KTtcblxuICAvLyAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmVydGV4Q291bnQ7IGorKykge1xuICAvLyAgICAgICAgICAgY29uc3QgaWR4ID0gaW5kZXhBY2Nlc3NvciEuZ2V0U2NhbGFyKGosIHt9KTtcbiAgLy8gICAgICAgICAgIG5ld0FjY2Vzc29yLnNldEVsZW1lbnRGcm9tU2FtZUNvbXBvc2l0aW9uQWNjZXNzb3IoaiwgYXR0cmlidXRlQWNjZXNzb3IsIGlkeCk7XG4gIC8vICAgICAgICAgfVxuXG4gIC8vICAgICAgICAgcHJpbWl0aXZlLnNldFZlcnRleEF0dHJpYnV0ZShuZXdBY2Nlc3NvciwgcHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljc1tpXSk7XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgICBjb25zdCBpbmRpY2VzQWNjZXNzb3IgPSBwcmltaXRpdmUuaW5kaWNlc0FjY2Vzc29yITtcbiAgLy8gICAgICAgY29uc3QgZWxlbWVudFNpemVJbkJ5dGVzID0gaW5kaWNlc0FjY2Vzc29yLmVsZW1lbnRTaXplSW5CeXRlcztcbiAgLy8gICAgICAgY29uc3QgYnVmZmVyVmlldyA9IGJ1ZmZlci50YWtlQnVmZmVyVmlldyh7IGJ5dGVMZW5ndGhUb05lZWQ6IGVsZW1lbnRTaXplSW5CeXRlcyAqIHZlcnRleENvdW50LCBieXRlU3RyaWRlOiAwLCBpc0FvUzogZmFsc2UgfSk7XG4gIC8vICAgICAgIGNvbnN0IG5ld0FjY2Vzc29yID0gYnVmZmVyVmlldy50YWtlQWNjZXNzb3IoeyBjb21wb3NpdGlvblR5cGU6IGluZGljZXNBY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGU6IGluZGljZXNBY2Nlc3Nvci5jb21wb25lbnRUeXBlLCBjb3VudDogdmVydGV4Q291bnQgfSk7XG5cbiAgLy8gICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2ZXJ0ZXhDb3VudDsgaisrKSB7XG4gIC8vICAgICAgICAgLy9jb25zdCBpZHggPSBpbmRleEFjY2Vzc29yIS5nZXRTY2FsYXIoaiwge30pO1xuICAvLyAgICAgICAgIG5ld0FjY2Vzc29yLnNldFNjYWxhcihqLCBqLCB7fSk7XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgICBwcmltaXRpdmUuc2V0SW5kaWNlcyhuZXdBY2Nlc3Nvcik7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gX19pbml0TW9ycGhQcmltaXRpdmVzKCkge1xuICAvLyAgIGlmICh0aGlzLndlaWdodHMubGVuZ3RoID09PSAwKSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuXG4gIC8vICAgY29uc3QgYnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZU9yR2V0QnVmZmVyKEJ1ZmZlclVzZS5DUFVHZW5lcmljKTtcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19wcmltaXRpdmVzLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICBjb25zdCBwcmltaXRpdmUgPSB0aGlzLl9fcHJpbWl0aXZlc1tpXTtcbiAgLy8gICAgIGlmICh0aGlzLl9fbW9ycGhQcmltaXRpdmVzW2ldID09IG51bGwpIHtcbiAgLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gcHJpbWl0aXZlLnRhcmdldHNbMF07XG4gIC8vICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgLy8gICAgICAgdGFyZ2V0LmZvckVhY2goKGFjY2Vzc29yLCBzZW1hbnRpYykgPT4ge1xuICAvLyAgICAgICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBidWZmZXIudGFrZUJ1ZmZlclZpZXcoeyBieXRlTGVuZ3RoVG9OZWVkOiBhY2Nlc3Nvci5ieXRlTGVuZ3RoLCBieXRlU3RyaWRlOiAwLCBpc0FvUzogZmFsc2UgfSk7XG4gIC8vICAgICAgICAgY29uc3QgbW9ycGhBY2Nlc3NvciA9IGJ1ZmZlclZpZXcudGFrZUFjY2Vzc29yKHsgY29tcG9zaXRpb25UeXBlOiBhY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGU6IGFjY2Vzc29yLmNvbXBvbmVudFR5cGUsIGNvdW50OiBhY2Nlc3Nvci5lbGVtZW50Q291bnQgfSk7XG4gIC8vICAgICAgICAgbWFwLnNldChzZW1hbnRpYywgbW9ycGhBY2Nlc3Nvcik7XG4gIC8vICAgICAgIH0pO1xuICAvLyAgICAgICBjb25zdCBtb3JwaFByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoKTtcbiAgLy8gICAgICAgbW9ycGhQcmltaXRpdmUuc2V0RGF0YShtYXAsIHByaW1pdGl2ZS5wcmltaXRpdmVNb2RlLCBwcmltaXRpdmUubWF0ZXJpYWwsIHByaW1pdGl2ZS5pbmRpY2VzQWNjZXNzb3IpO1xuICAvLyAgICAgICBtb3JwaFByaW1pdGl2ZS5zZXRUYXJnZXRzKHByaW1pdGl2ZS50YXJnZXRzKTtcbiAgLy8gICAgICAgdGhpcy5fX21vcnBoUHJpbWl0aXZlc1tpXSA9IG1vcnBoUHJpbWl0aXZlO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxufVxuIiwiaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSwgUHJpbWl0aXZlTW9kZUVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QcmltaXRpdmVNb2RlJztcbmltcG9ydCB7XG4gIFZlcnRleEF0dHJpYnV0ZSxcbiAgVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nLFxufSBmcm9tICcuLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tICcuLi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtLCBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9NZW1vcnlNYW5hZ2VyJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSwgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBQUJCIH0gZnJvbSAnLi4vbWF0aC9BQUJCJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgTWF0ZXJpYWxIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL01hdGVyaWFsSGVscGVyJztcbmltcG9ydCB7IFZlcnRleEhhbmRsZXMgfSBmcm9tICcuLi8uLi93ZWJnbC9XZWJHTFJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFByaW1pdGl2ZVVJRCwgVHlwZWRBcnJheSwgQ291bnQsIEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IElWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9JVmVjdG9yJztcbmltcG9ydCB7XG4gIElNZXNoLFxuICBQcmltaXRpdmVTb3J0S2V5LFxuICBQcmltaXRpdmVTb3J0S2V5TGVuZ3RoLFxuICBQcmltaXRpdmVTb3J0S2V5T2Zmc2V0LFxuICBQcmltaXRpdmVTb3J0S2V5X0JpdExlbmd0aF9NYXRlcmlhbCxcbiAgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfUHJpbWl0aXZlVHlwZSxcbiAgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfVHJhbnNsdWNlbmN5VHlwZSxcbiAgUHJpbWl0aXZlU29ydEtleV9CaXRPZmZzZXRfTWF0ZXJpYWwsXG4gIFByaW1pdGl2ZVNvcnRLZXlfQml0T2Zmc2V0X1ByaW1pdGl2ZVR5cGUsXG4gIFByaW1pdGl2ZVNvcnRLZXlfQml0T2Zmc2V0X1RyYW5zbHVjZW5jeVR5cGUsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHRFeDEsXG59IGZyb20gJy4vdHlwZXMvR2VvbWV0cnlUeXBlcyc7XG5pbXBvcnQgeyBJT3B0aW9uLCBOb25lLCBTb21lLCBPcHRpb24gfSBmcm9tICcuLi9taXNjL09wdGlvbic7XG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uL21pc2MvRGF0YVV0aWwnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgaXNFcnIgfSBmcm9tICcuLi9taXNjL1Jlc3VsdCc7XG5pbXBvcnQgeyBSbkV4Y2VwdGlvbiB9IGZyb20gJy4uL21pc2MvUm5FeGNlcHRpb24nO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4vTWVzaCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZXMgPSBNYXA8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nLCBBY2Nlc3Nvcj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFueVByaW1pdGl2ZURlc2NyaXB0b3Ige1xuICAvKiogYXR0YWNoIGEgcmhvZG9uaXRlIG1hdGVyaWFsIHRvIHRoaXMgcGxhbmUodGhlIGRlZmF1bHQgbWF0ZXJpYWwgaXMgdGhlIGNsYXNzaWNVYmVyTWF0ZXJpYWwgKi9cbiAgbWF0ZXJpYWw/OiBNYXRlcmlhbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmltaXRpdmVEZXNjcmlwdG9yIGV4dGVuZHMgSUFueVByaW1pdGl2ZURlc2NyaXB0b3Ige1xuICBhdHRyaWJ1dGVzOiBUeXBlZEFycmF5W107XG4gIGF0dHJpYnV0ZVNlbWFudGljczogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nW107XG4gIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGVFbnVtO1xuICBpbmRpY2VzPzogVHlwZWRBcnJheTtcbn1cblxuZXhwb3J0IGNsYXNzIFByaW1pdGl2ZSBleHRlbmRzIFJuT2JqZWN0IHtcbiAgcHJpdmF0ZSBfX21vZGU6IFByaW1pdGl2ZU1vZGVFbnVtID0gUHJpbWl0aXZlTW9kZS5Vbmtub3duO1xuICBwcml2YXRlIHN0YXRpYyBfX2RlZmF1bHRNYXRlcmlhbD86IE1hdGVyaWFsO1xuICBwcml2YXRlIF9fbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIF9fbWF0ZXJpYWxWYXJpYW50czogTWFwPHN0cmluZywgTWF0ZXJpYWw+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9fY3VycmVudFZhcmlhbnROYW1lID0gJyc7XG4gIHB1YmxpYyBfcHJldk1hdGVyaWFsOiBXZWFrUmVmPE1hdGVyaWFsPjtcbiAgcHJpdmF0ZSBfX2F0dHJpYnV0ZXM6IEF0dHJpYnV0ZXMgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19vSW5kaWNlczogSU9wdGlvbjxBY2Nlc3Nvcj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3ByaW1pdGl2ZUNvdW50OiBDb3VudCA9IDA7XG4gIHByaXZhdGUgX19wcmltaXRpdmVVaWQ6IFByaW1pdGl2ZVVJRCA9IC0xOyAvLyBzdGFydCBJRCBmcm9tIHplcm9cbiAgcHJpdmF0ZSBfX2FhYmIgPSBuZXcgQUFCQigpO1xuICBwcml2YXRlIF9fdGFyZ2V0czogQXJyYXk8QXR0cmlidXRlcz4gPSBbXTtcbiAgcHJpdmF0ZSBfX3ZlcnRleEhhbmRsZXM/OiBWZXJ0ZXhIYW5kbGVzO1xuICBwcml2YXRlIF9fbWVzaD86IE1lc2g7XG4gIHByaXZhdGUgc3RhdGljIF9fcHJpbWl0aXZlczogV2Vha1JlZjxQcmltaXRpdmU+W10gPSBbXTtcbiAgcHVibGljIF9zb3J0a2V5OiBQcmltaXRpdmVTb3J0S2V5ID0gMDtcbiAgcHVibGljIF92aWV3RGVwdGggPSAwO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fcHJpbWl0aXZlVWlkSWR4SGFzTW9ycGg6IE1hcDxQcmltaXRpdmVVSUQsIEluZGV4PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pZHhQcmltaXRpdmVVaWRIYXNNb3JwaDogTWFwPEluZGV4LCBXZWFrUmVmPFByaW1pdGl2ZT4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3ByaW1pdGl2ZUNvdW50SGFzTW9ycGggPSAwO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjM18wOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBwcml2YXRlIF9fbGF0ZXN0UG9zaXRpb25BY2Nlc3NvclZlcnNpb24gPSAwO1xuICBwcml2YXRlIF9fcG9zaXRpb25BY2Nlc3NvclZlcnNpb24gPSAwO1xuICBwcml2YXRlIHN0YXRpYyBfX3ZhcmlhbnRVcGRhdGVDb3VudCA9IDA7XG5cbiAgcHJpdmF0ZSBfX2ZpbmdlclByaW50OiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKFByaW1pdGl2ZS5fX2RlZmF1bHRNYXRlcmlhbCA9PSBudWxsKSB7XG4gICAgICBQcmltaXRpdmUuX19kZWZhdWx0TWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKHtcbiAgICAgICAgaXNTa2lubmluZzogdHJ1ZSxcbiAgICAgICAgaXNMaWdodGluZzogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX19tYXRlcmlhbCA9IFByaW1pdGl2ZS5fX2RlZmF1bHRNYXRlcmlhbDtcbiAgICB0aGlzLl9wcmV2TWF0ZXJpYWwgPSBuZXcgV2Vha1JlZihQcmltaXRpdmUuX19kZWZhdWx0TWF0ZXJpYWwpO1xuICB9XG5cbiAgY2FsY0ZpbmdlclByaW50KCkge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBzdHIgKz0gdGhpcy5fX21vZGUuaW5kZXg7XG4gICAgaWYgKHRoaXMuX19vSW5kaWNlcy5oYXMoKSkge1xuICAgICAgc3RyICs9IHRoaXMuZ2V0SW5kZXhCaXRTaXplKCk7XG4gICAgfVxuICAgIHN0ciArPSB0aGlzLnRhcmdldHMubGVuZ3RoO1xuICAgIHN0ciArPSBQcmltaXRpdmUuZ2V0UHJpbWl0aXZlSWR4SGFzTW9ycGgodGhpcy5fX3ByaW1pdGl2ZVVpZCk7XG4gICAgZm9yIChjb25zdCBbc2VtYW50aWMsIGFjY2Vzc29yXSBvZiB0aGlzLl9fYXR0cmlidXRlcykge1xuICAgICAgc3RyICs9IHNlbWFudGljO1xuICAgICAgc3RyICs9IGFjY2Vzc29yLmNvbXBvbmVudFR5cGUud2ViZ3B1ICsgYWNjZXNzb3IuY29tcG9zaXRpb25UeXBlLndlYmdwdTtcbiAgICAgIHN0ciArPSBhY2Nlc3Nvci5hY3R1YWxCeXRlU3RyaWRlO1xuICAgIH1cblxuICAgIHRoaXMuX19maW5nZXJQcmludCA9IHN0cjtcbiAgfVxuXG4gIF9nZXRGaW5nZXJQcmludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZpbmdlclByaW50O1xuICB9XG5cbiAgc3RhdGljIGdldFByaW1pdGl2ZUlkeEhhc01vcnBoKHByaW1pdGl2ZVVpZDogUHJpbWl0aXZlVUlEKTogSW5kZXggfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fcHJpbWl0aXZlVWlkSWR4SGFzTW9ycGguZ2V0KHByaW1pdGl2ZVVpZCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJpbWl0aXZlSGFzTW9ycGgocHJpbWl0aXZlSWR4OiBJbmRleCk6IFByaW1pdGl2ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX19pZHhQcmltaXRpdmVVaWRIYXNNb3JwaC5nZXQocHJpbWl0aXZlSWR4KT8uZGVyZWYoKTtcbiAgfVxuXG4gIGdldEluZGV4Qml0U2l6ZSgpOiAndWludDE2JyB8ICd1aW50MzInIHtcbiAgICBjb25zdCBpbmRleEFjY2Vzc29yID0gdGhpcy5fX29JbmRpY2VzLnVud3JhcE9yVW5kZWZpbmVkKCk7XG4gICAgaWYgKGluZGV4QWNjZXNzb3IgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleEFjY2Vzc29yIGlzIG51bGwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGluZGV4QWNjZXNzb3IuY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZFNob3J0KSB7XG4gICAgICAgIHJldHVybiAndWludDE2JztcbiAgICAgIH0gZWxzZSBpZiAoaW5kZXhBY2Nlc3Nvci5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLlVuc2lnbmVkSW50KSB7XG4gICAgICAgIHJldHVybiAndWludDMyJztcbiAgICAgIH0gZWxzZSBpZiAoaW5kZXhBY2Nlc3Nvci5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSkge1xuICAgICAgICByZXR1cm4gJ3VpbnQxNic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gaW5kZXhBY2Nlc3Nvci5jb21wb25lbnRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IF92ZXJ0ZXhIYW5kbGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9fdmVydGV4SGFuZGxlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgdmFyaWFudFVwZGF0ZUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl9fdmFyaWFudFVwZGF0ZUNvdW50O1xuICB9XG5cbiAgc2V0TWF0ZXJpYWxWYXJpYW50KHZhcmlhbnROYW1lOiBzdHJpbmcsIG1hdGVyaWFsOiBNYXRlcmlhbCkge1xuICAgIHRoaXMuX19tYXRlcmlhbFZhcmlhbnRzLnNldCh2YXJpYW50TmFtZSwgbWF0ZXJpYWwpO1xuICAgIFByaW1pdGl2ZS5fX3ZhcmlhbnRVcGRhdGVDb3VudCsrO1xuICB9XG5cbiAgYXBwbHlNYXRlcmlhbFZhcmlhbnQodmFyaWFudE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLl9fbWF0ZXJpYWxWYXJpYW50cy5nZXQodmFyaWFudE5hbWUpO1xuICAgIGlmICh2YXJpYW50KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsID0gdmFyaWFudDtcbiAgICAgIHRoaXMuX19jdXJyZW50VmFyaWFudE5hbWUgPSB2YXJpYW50TmFtZTtcbiAgICAgIFByaW1pdGl2ZS5fX3ZhcmlhbnRVcGRhdGVDb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbnRWYXJpYW50TmFtZSgpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBtYXRlcmlhbF0gb2YgdGhpcy5fX21hdGVyaWFsVmFyaWFudHMpIHtcbiAgICAgIGlmIChtYXRlcmlhbCA9PT0gdGhpcy5fX21hdGVyaWFsKSB7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRWYXJpYW50TmFtZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fX21hdGVyaWFsVmFyaWFudHMua2V5cygpKTtcbiAgfVxuXG4gIGdldFZhcmlhbnRNYXRlcmlhbCh2YXJpYW50TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX19tYXRlcmlhbFZhcmlhbnRzLmdldCh2YXJpYW50TmFtZSk7XG4gIH1cblxuICBzZXQgbWF0ZXJpYWwobWF0OiBNYXRlcmlhbCkge1xuICAgIHRoaXMuX19tYXRlcmlhbCA9IG1hdDtcbiAgICB0aGlzLnNldFNvcnRLZXkoXG4gICAgICBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9NYXRlcmlhbCxcbiAgICAgIFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX01hdGVyaWFsLFxuICAgICAgbWF0Lm1hdGVyaWFsVUlEXG4gICAgKTtcblxuICAgIGxldCB0cmFuc2x1Y2VuY3lUeXBlID0gMDsgLy8gb3BhcXVlXG4gICAgaWYgKG1hdC5pc1RyYW5zbHVjZW50T3BhcXVlKCkpIHtcbiAgICAgIHRyYW5zbHVjZW5jeVR5cGUgPSAxOyAvLyB0cmFuc2x1Y2VudFxuICAgIH0gZWxzZSBpZiAobWF0LmlzQmxlbmQoKSkge1xuICAgICAgdHJhbnNsdWNlbmN5VHlwZSA9IDI7IC8vIGJsZW5kXG4gICAgfVxuICAgIHRoaXMuc2V0U29ydEtleShcbiAgICAgIFByaW1pdGl2ZVNvcnRLZXlfQml0T2Zmc2V0X1RyYW5zbHVjZW5jeVR5cGUsXG4gICAgICBQcmltaXRpdmVTb3J0S2V5X0JpdExlbmd0aF9UcmFuc2x1Y2VuY3lUeXBlLFxuICAgICAgdHJhbnNsdWNlbmN5VHlwZVxuICAgICk7XG4gICAgbWF0Ll9hZGRCZWxvbmdQcmltaXRpdmUodGhpcyk7XG4gIH1cblxuICBnZXQgbWF0ZXJpYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19tYXRlcmlhbDtcbiAgfVxuXG4gIHNldFNvcnRLZXkob2Zmc2V0OiBQcmltaXRpdmVTb3J0S2V5T2Zmc2V0LCBsZW5ndGg6IFByaW1pdGl2ZVNvcnRLZXlMZW5ndGgsIHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBvZmZzZXRWYWx1ZSA9IHZhbHVlIDw8IG9mZnNldDtcbiAgICB0aGlzLl9zb3J0a2V5IHw9IG9mZnNldFZhbHVlO1xuXG4gICAgLy8gQ3JlYXRlcyBhIG1hc2sgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBsZW5ndGhcbiAgICBsZXQgbWFzayA9ICgxIDw8IGxlbmd0aCkgLSAxO1xuICAgIC8vIENsZWFyIGRlc2lnbmF0ZWQgb2Zmc2V0IGJpdHNcbiAgICB0aGlzLl9zb3J0a2V5ICY9IH4obWFzayA8PCBvZmZzZXQpO1xuICAgIC8vIFdyaXRlcyBhIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0XG4gICAgdGhpcy5fc29ydGtleSB8PSAodmFsdWUgJiBtYXNrKSA8PCBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogYmVsb25nIHRvIG1lc2ggKHdlYWsgcmVmZXJlbmNlKVxuICAgKiBAcGFyYW0gbWVzaFxuICAgKi9cbiAgX2JlbG9uZ1RvTWVzaChtZXNoOiBNZXNoKSB7XG4gICAgLy8gdGhpcy5zZXRTb3J0S2V5KFByaW1pdGl2ZVNvcnRLZXlfQml0T2Zmc2V0X01lc2gsIG1lc2gubWVzaFVJRCk7XG4gICAgdGhpcy5fX21lc2ggPSBtZXNoO1xuICB9XG5cbiAgZ2V0IG1lc2goKTogSU1lc2ggfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fbWVzaDtcbiAgfVxuXG4gIF9iYWNrdXBNYXRlcmlhbCgpIHtcbiAgICB0aGlzLl9wcmV2TWF0ZXJpYWwgPSBuZXcgV2Vha1JlZih0aGlzLl9fbWF0ZXJpYWwpO1xuICB9XG5cbiAgX3Jlc3RvcmVNYXRlcmlhbCgpIHtcbiAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMuX3ByZXZNYXRlcmlhbC5kZXJlZigpO1xuICAgIGlmIChtYXRlcmlhbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fbWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJpbWl0aXZlKHByaW1pdGl2ZVVpZDogUHJpbWl0aXZlVUlEKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wcmltaXRpdmVzW3ByaW1pdGl2ZVVpZF0/LmRlcmVmKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJpbWl0aXZlQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wcmltaXRpdmVDb3VudDtcbiAgfVxuXG4gIG9uQWNjZXNzb3JVcGRhdGVkKGFjY2Vzc29yVmVyc2lvbjogbnVtYmVyKSB7XG4gICAgdGhpcy5fX3Bvc2l0aW9uQWNjZXNzb3JWZXJzaW9uID0gYWNjZXNzb3JWZXJzaW9uO1xuICAgIGlmICh0aGlzLl9fbWVzaCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fbWVzaC5fb25QcmltaXRpdmVQb3NpdGlvblVwZGF0ZWQoKTtcbiAgICB9XG4gIH1cblxuICBzZXREYXRhKFxuICAgIGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZXMsXG4gICAgbW9kZTogUHJpbWl0aXZlTW9kZUVudW0sXG4gICAgbWF0ZXJpYWw/OiBNYXRlcmlhbCxcbiAgICBpbmRpY2VzQWNjZXNzb3I/OiBBY2Nlc3NvclxuICApIHtcbiAgICB0aGlzLl9fb0luZGljZXMgPSBuZXcgT3B0aW9uKGluZGljZXNBY2Nlc3Nvcik7XG4gICAgdGhpcy5fX2F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gICAgY29uc3QgcG9zaXRpb25BY2Nlc3NvciA9IHRoaXMuX19hdHRyaWJ1dGVzLmdldChWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaKSE7XG4gICAgcG9zaXRpb25BY2Nlc3Nvci5fcHJpbWl0aXZlID0gbmV3IFdlYWtSZWYodGhpcyk7XG5cbiAgICBpZiAobWF0ZXJpYWwgIT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlQ2xhc3NpY1ViZXJNYXRlcmlhbCh7XG4gICAgICAgIGlzU2tpbm5pbmc6IHRydWUsXG4gICAgICAgIGlzTGlnaHRpbmc6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fX21vZGUgPSBtb2RlO1xuICAgIHRoaXMuc2V0U29ydEtleShcbiAgICAgIFByaW1pdGl2ZVNvcnRLZXlfQml0T2Zmc2V0X1ByaW1pdGl2ZVR5cGUsXG4gICAgICBQcmltaXRpdmVTb3J0S2V5X0JpdExlbmd0aF9QcmltaXRpdmVUeXBlLFxuICAgICAgbW9kZS5pbmRleFxuICAgICk7XG5cbiAgICB0aGlzLl9fcHJpbWl0aXZlVWlkID0gUHJpbWl0aXZlLl9fcHJpbWl0aXZlQ291bnQrKztcbiAgICBQcmltaXRpdmUuX19wcmltaXRpdmVzW3RoaXMuX19wcmltaXRpdmVVaWRdID0gbmV3IFdlYWtSZWYodGhpcyk7XG4gICAgdGhpcy5jYWxjRmluZ2VyUHJpbnQoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgbWF4UHJpbWl0aXZlQ291bnQoKSB7XG4gICAgcmV0dXJuIDUwMDtcbiAgfVxuXG4gIGNvcHlWZXJ0ZXhEYXRhKHtcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGF0dHJpYnV0ZVNlbWFudGljcyxcbiAgICBwcmltaXRpdmVNb2RlLFxuICAgIGluZGljZXMsXG4gICAgbWF0ZXJpYWwsXG4gIH06IFByaW1pdGl2ZURlc2NyaXB0b3IpIHtcbiAgICBsZXQgc3VtT2ZBdHRyaWJ1dGVzQnl0ZVNpemUgPSAwO1xuICAgIGNvbnN0IGJ5dGVBbGlnbiA9IDQ7XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgIHN1bU9mQXR0cmlidXRlc0J5dGVTaXplICs9IGF0dHJpYnV0ZS5ieXRlTGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgbGV0IGJ1ZmZlclNpemUgPSBzdW1PZkF0dHJpYnV0ZXNCeXRlU2l6ZTtcbiAgICBpZiAoaW5kaWNlcyAhPSBudWxsKSB7XG4gICAgICBidWZmZXJTaXplICs9IERhdGFVdGlsLmFkZFBhZGRpbmdCeXRlcyhpbmRpY2VzLmJ5dGVMZW5ndGgsIGJ5dGVBbGlnbik7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJ1ZmZlck9uRGVtYW5kKGJ1ZmZlclNpemUsIHRoaXMsIGJ5dGVBbGlnbik7XG5cbiAgICBsZXQgaW5kaWNlc0NvbXBvbmVudFR5cGU7XG4gICAgbGV0IGluZGljZXNBY2Nlc3NvcjtcbiAgICBpZiAoaW5kaWNlcyAhPSBudWxsKSB7XG4gICAgICBpbmRpY2VzQ29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGUuZnJvbVR5cGVkQXJyYXkoaW5kaWNlcyk7XG4gICAgICBjb25zdCBpbmRpY2VzQnVmZmVyVmlld1Jlc3VsdCA9IGJ1ZmZlci50YWtlQnVmZmVyVmlldyh7XG4gICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IGluZGljZXMuYnl0ZUxlbmd0aCxcbiAgICAgICAgYnl0ZVN0cmlkZTogMCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGlzRXJyKGluZGljZXNCdWZmZXJWaWV3UmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgUm5FeGNlcHRpb24oaW5kaWNlc0J1ZmZlclZpZXdSZXN1bHQuZ2V0Um5FcnJvcigpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGljZXNBY2Nlc3NvclJlc3VsdCA9IGluZGljZXNCdWZmZXJWaWV3UmVzdWx0LmdldCgpLnRha2VBY2Nlc3Nvcih7XG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgY29tcG9uZW50VHlwZTogaW5kaWNlc0NvbXBvbmVudFR5cGUsXG4gICAgICAgIGNvdW50OiBpbmRpY2VzLmJ5dGVMZW5ndGggLyBpbmRpY2VzQ29tcG9uZW50VHlwZS5nZXRTaXplSW5CeXRlcygpLFxuICAgICAgfSk7XG4gICAgICBpZiAoaXNFcnIoaW5kaWNlc0FjY2Vzc29yUmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgUm5FeGNlcHRpb24oaW5kaWNlc0FjY2Vzc29yUmVzdWx0LmdldFJuRXJyb3IoKSk7XG4gICAgICB9XG4gICAgICBpbmRpY2VzQWNjZXNzb3IgPSBpbmRpY2VzQWNjZXNzb3JSZXN1bHQuZ2V0KCk7XG4gICAgICAvLyBjb3B5IGluZGljZXNcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcyEuYnl0ZUxlbmd0aCAvIGluZGljZXNBY2Nlc3NvciEuY29tcG9uZW50U2l6ZUluQnl0ZXM7IGkrKykge1xuICAgICAgICBpbmRpY2VzQWNjZXNzb3IhLnNldFNjYWxhcihpLCBpbmRpY2VzIVtpXSwge30pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXNCdWZmZXJWaWV3ID0gYnVmZmVyXG4gICAgICAudGFrZUJ1ZmZlclZpZXcoe1xuICAgICAgICBieXRlTGVuZ3RoVG9OZWVkOiBzdW1PZkF0dHJpYnV0ZXNCeXRlU2l6ZSxcbiAgICAgICAgYnl0ZVN0cmlkZTogMCxcbiAgICAgIH0pXG4gICAgICAudW53cmFwRm9yY2UoKTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29yczogQXJyYXk8QWNjZXNzb3I+ID0gW107XG4gICAgY29uc3QgYXR0cmlidXRlQ29tcG9uZW50VHlwZXM6IEFycmF5PENvbXBvbmVudFR5cGVFbnVtPiA9IFtdO1xuXG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKCh0eXBlZEFycmF5LCBpKSA9PiB7XG4gICAgICBjb25zdCBjb21wb3NpdGlvblR5cGUgPSBDb21wb3NpdGlvblR5cGUudmVjdG9yRnJvbShcbiAgICAgICAgVmVydGV4QXR0cmlidXRlLnRvVmVjdG9yQ29tcG9uZW50TihhdHRyaWJ1dGVTZW1hbnRpY3NbaV0pXG4gICAgICApO1xuICAgICAgYXR0cmlidXRlQ29tcG9uZW50VHlwZXNbaV0gPSBDb21wb25lbnRUeXBlLmZyb21UeXBlZEFycmF5KGF0dHJpYnV0ZXNbaV0pO1xuICAgICAgY29uc3QgYWNjZXNzb3I6IEFjY2Vzc29yID0gYXR0cmlidXRlc0J1ZmZlclZpZXdcbiAgICAgICAgLnRha2VBY2Nlc3Nvcih7XG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuZnJvbVR5cGVkQXJyYXkoYXR0cmlidXRlc1tpXSksXG4gICAgICAgICAgY291bnQ6XG4gICAgICAgICAgICB0eXBlZEFycmF5LmJ5dGVMZW5ndGggL1xuICAgICAgICAgICAgY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpIC9cbiAgICAgICAgICAgIGF0dHJpYnV0ZUNvbXBvbmVudFR5cGVzW2ldLmdldFNpemVJbkJ5dGVzKCksXG4gICAgICAgIH0pXG4gICAgICAgIC51bndyYXBGb3JjZSgpO1xuICAgICAgYWNjZXNzb3IuY29weUZyb21UeXBlZEFycmF5KHR5cGVkQXJyYXkpO1xuICAgICAgYXR0cmlidXRlQWNjZXNzb3JzLnB1c2goYWNjZXNzb3IpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXR0cmlidXRlTWFwOiBNYXA8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nLCBBY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVTZW1hbnRpY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNlbWFudGljID0gYXR0cmlidXRlU2VtYW50aWNzW2ldO1xuICAgICAgYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGVTZW1hbnRpYywgYXR0cmlidXRlQWNjZXNzb3JzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldERhdGEoYXR0cmlidXRlTWFwLCBwcmltaXRpdmVNb2RlLCBtYXRlcmlhbCwgaW5kaWNlc0FjY2Vzc29yKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQcmltaXRpdmUoZGVzYzogUHJpbWl0aXZlRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoKTtcbiAgICBwcmltaXRpdmUuY29weVZlcnRleERhdGEoZGVzYyk7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIGdldCBpbmRpY2VzQWNjZXNzb3IoKTogQWNjZXNzb3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fb0luZGljZXMudW53cmFwT3JVbmRlZmluZWQoKTtcbiAgfVxuXG4gIGdldFZlcnRleENvdW50QXNJbmRpY2VzQmFzZWQoKSB7XG4gICAgaWYgKHRoaXMuaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmRpY2VzQWNjZXNzb3IuZWxlbWVudENvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRWZXJ0ZXhDb3VudEFzVmVydGljZXNCYXNlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFZlcnRleENvdW50QXNWZXJ0aWNlc0Jhc2VkKCk6IENvdW50IHtcbiAgICBmb3IgKGNvbnN0IGFjY2Vzc29yIG9mIHRoaXMuX19hdHRyaWJ1dGVzLnZhbHVlcygpKSB7XG4gICAgICByZXR1cm4gYWNjZXNzb3IuZWxlbWVudENvdW50O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGdldFRyaWFuZ2xlQ291bnRBc0luZGljZXNCYXNlZCgpOiBDb3VudCB7XG4gICAgaWYgKHRoaXMuaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX19tb2RlKSB7XG4gICAgICAgIGNhc2UgUHJpbWl0aXZlTW9kZS5UcmlhbmdsZXM6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlc0FjY2Vzc29yLmVsZW1lbnRDb3VudCAvIDM7XG4gICAgICAgIGNhc2UgUHJpbWl0aXZlTW9kZS5UcmlhbmdsZVN0cmlwOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluZGljZXNBY2Nlc3Nvci5lbGVtZW50Q291bnQgLSAyO1xuICAgICAgICBjYXNlIFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVGYW46XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlc0FjY2Vzc29yLmVsZW1lbnRDb3VudCAtIDI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRyaWFuZ2xlQ291bnRBc1ZlcnRpY2VzQmFzZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmlhbmdsZUNvdW50QXNWZXJ0aWNlc0Jhc2VkKCk6IENvdW50IHtcbiAgICBmb3IgKGNvbnN0IGFjY2Vzc29yIG9mIHRoaXMuX19hdHRyaWJ1dGVzLnZhbHVlcygpKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX19tb2RlKSB7XG4gICAgICAgIGNhc2UgUHJpbWl0aXZlTW9kZS5UcmlhbmdsZXM6XG4gICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVsZW1lbnRDb3VudCAvIDM7XG4gICAgICAgIGNhc2UgUHJpbWl0aXZlTW9kZS5UcmlhbmdsZVN0cmlwOlxuICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbGVtZW50Q291bnQgLSAyO1xuICAgICAgICBjYXNlIFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVGYW46XG4gICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVsZW1lbnRDb3VudCAtIDI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaGFzSW5kaWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fX29JbmRpY2VzLmhhcygpO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZUFjY2Vzc29ycygpOiBBcnJheTxBY2Nlc3Nvcj4ge1xuICAgIGNvbnN0IGFjY2Vzc29yczogQXJyYXk8QWNjZXNzb3I+ID0gW107XG4gICAgdGhpcy5fX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYWNjZXNzb3IsIHNlbWFudGljKSA9PiB7XG4gICAgICBhY2Nlc3NvcnMucHVzaChhY2Nlc3Nvcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY2Vzc29ycztcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZShzZW1hbnRpYzogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX19hdHRyaWJ1dGVzLmdldChzZW1hbnRpYyk7XG4gIH1cblxuICBnZXQgYXR0cmlidXRlU2VtYW50aWNzKCk6IEFycmF5PFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZz4ge1xuICAgIGNvbnN0IHNlbWFudGljczogQXJyYXk8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nPiA9IFtdO1xuICAgIHRoaXMuX19hdHRyaWJ1dGVzLmZvckVhY2goKGFjY2Vzc29yLCBzZW1hbnRpYykgPT4ge1xuICAgICAgc2VtYW50aWNzLnB1c2goc2VtYW50aWMpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZW1hbnRpY3M7XG4gIH1cblxuICBnZXQgYXR0cmlidXRlRW50cmllcygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2F0dHJpYnV0ZXMuZW50cmllcygpO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXMoKTogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT4ge1xuICAgIGNvbnN0IHR5cGVzOiBBcnJheTxDb21wb3NpdGlvblR5cGVFbnVtPiA9IFtdO1xuICAgIHRoaXMuX19hdHRyaWJ1dGVzLmZvckVhY2goKGFjY2Vzc29yLCBzZW1hbnRpYykgPT4ge1xuICAgICAgdHlwZXMucHVzaChhY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHR5cGVzO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZUNvbXBvbmVudFR5cGVzKCk6IEFycmF5PENvbXBvbmVudFR5cGVFbnVtPiB7XG4gICAgY29uc3QgdHlwZXM6IEFycmF5PENvbXBvbmVudFR5cGVFbnVtPiA9IFtdO1xuICAgIHRoaXMuX19hdHRyaWJ1dGVzLmZvckVhY2goKGFjY2Vzc29yLCBzZW1hbnRpYykgPT4ge1xuICAgICAgdHlwZXMucHVzaChhY2Nlc3Nvci5jb21wb25lbnRUeXBlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIGdldCBwcmltaXRpdmVNb2RlKCk6IFByaW1pdGl2ZU1vZGVFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX21vZGU7XG4gIH1cblxuICBnZXQgcHJpbWl0aXZlVWlkKCk6IFByaW1pdGl2ZVVJRCB7XG4gICAgcmV0dXJuIHRoaXMuX19wcmltaXRpdmVVaWQ7XG4gIH1cblxuICBnZXQgcG9zaXRpb25BY2Nlc3NvclZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fX3Bvc2l0aW9uQWNjZXNzb3JWZXJzaW9uO1xuICB9XG5cbiAgZ2V0IEFBQkIoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fX2FhYmIuaXNWYW5pbGxhKCkgfHxcbiAgICAgIHRoaXMucG9zaXRpb25BY2Nlc3NvclZlcnNpb24gIT09IHRoaXMuX19sYXRlc3RQb3NpdGlvbkFjY2Vzc29yVmVyc2lvblxuICAgICkge1xuICAgICAgY29uc3QgcG9zaXRpb25BY2Nlc3NvciA9IHRoaXMuX19hdHRyaWJ1dGVzLmdldChWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaKSE7XG5cbiAgICAgIGNvbnN0IG1pbiA9IHBvc2l0aW9uQWNjZXNzb3IubWluIGFzIG51bWJlcltdO1xuICAgICAgdGhpcy5fX2FhYmIubWluUG9pbnQgPSBQcmltaXRpdmUuX190bXBWZWMzXzAuc2V0Q29tcG9uZW50cyhtaW5bMF0sIG1pblsxXSwgbWluWzJdKTtcbiAgICAgIGNvbnN0IG1heCA9IHBvc2l0aW9uQWNjZXNzb3IubWF4IGFzIG51bWJlcltdO1xuICAgICAgdGhpcy5fX2FhYmIubWF4UG9pbnQgPSBQcmltaXRpdmUuX190bXBWZWMzXzAuc2V0Q29tcG9uZW50cyhtYXhbMF0sIG1heFsxXSwgbWF4WzJdKTtcbiAgICAgIHRoaXMuX19sYXRlc3RQb3NpdGlvbkFjY2Vzc29yVmVyc2lvbiA9IHBvc2l0aW9uQWNjZXNzb3IudmVyc2lvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX2FhYmI7XG4gIH1cblxuICBzZXRWZXJ0ZXhBdHRyaWJ1dGUoYWNjZXNzb3I6IEFjY2Vzc29yLCB2ZXJ0ZXhTZW1hbnRpYzogVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nKSB7XG4gICAgdGhpcy5fX2F0dHJpYnV0ZXMuc2V0KHZlcnRleFNlbWFudGljLCBhY2Nlc3Nvcik7XG4gIH1cblxuICByZW1vdmVJbmRpY2VzKCkge1xuICAgIHRoaXMuX19vSW5kaWNlcyA9IG5ldyBOb25lKCk7XG4gIH1cblxuICBzZXRJbmRpY2VzKGFjY2Vzc29yOiBBY2Nlc3Nvcikge1xuICAgIHRoaXMuX19vSW5kaWNlcyA9IG5ldyBTb21lKGFjY2Vzc29yKTtcbiAgfVxuXG4gIHNldEJsZW5kU2hhcGVUYXJnZXRzKHRhcmdldHM6IEFycmF5PEF0dHJpYnV0ZXM+KSB7XG4gICAgaWYgKFByaW1pdGl2ZS5fX3ByaW1pdGl2ZVVpZElkeEhhc01vcnBoLnNpemUgPj0gQ29uZmlnLm1heFZlcnRleFByaW1pdGl2ZU51bWJlckluU2hhZGVyKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoXG4gICAgICAgICdQcmltaXRpdmUuX19wcmltaXRpdmVVaWRzSGFzTW9ycGguc2l6ZSBleGNlZWRzIHRoZSBDb25maWcubWF4TW9ycGhQcmltaXRpdmVOdW1iZXInXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBQcmltaXRpdmUuX19pZHhQcmltaXRpdmVVaWRIYXNNb3JwaC5zZXQoXG4gICAgICAgIFByaW1pdGl2ZS5fX3ByaW1pdGl2ZUNvdW50SGFzTW9ycGgsXG4gICAgICAgIG5ldyBXZWFrUmVmKHRoaXMpXG4gICAgICApO1xuICAgICAgUHJpbWl0aXZlLl9fcHJpbWl0aXZlVWlkSWR4SGFzTW9ycGguc2V0KFxuICAgICAgICB0aGlzLl9fcHJpbWl0aXZlVWlkLFxuICAgICAgICBQcmltaXRpdmUuX19wcmltaXRpdmVDb3VudEhhc01vcnBoKytcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fX3RhcmdldHMgPSB0YXJnZXRzO1xuICAgIHRoaXMuY2FsY0ZpbmdlclByaW50KCk7XG4gIH1cblxuICBnZXRCbGVuZFNoYXBlVGFyZ2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fX3RhcmdldHMuY29uY2F0KCk7XG4gIH1cblxuICBnZXQgdGFyZ2V0cygpOiBBcnJheTxBdHRyaWJ1dGVzPiB7XG4gICAgcmV0dXJuIHRoaXMuX190YXJnZXRzO1xuICB9XG5cbiAgaXNCbGVuZCgpIHtcbiAgICBpZiAodGhpcy5tYXRlcmlhbCA9PSBudWxsIHx8ICF0aGlzLm1hdGVyaWFsLmlzQmxlbmQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaXNPcGFxdWUoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzQmxlbmQoKTtcbiAgfVxuXG4gIGNyZWF0ZTNEQVBJVmVydGV4RGF0YSgpIHtcbiAgICBpZiAodGhpcy5fX3ZlcnRleEhhbmRsZXMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgdGhpcy5fX3ZlcnRleEhhbmRsZXMgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVWZXJ0ZXhCdWZmZXJBbmRJbmRleEJ1ZmZlcih0aGlzKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdXBkYXRlM0RBUElWZXJ0ZXhEYXRhKCkge1xuICAgIGNvbnN0IHZlcnRleEhhbmRsZXMgPSB0aGlzLl9fdmVydGV4SGFuZGxlcyBhcyBWZXJ0ZXhIYW5kbGVzO1xuICAgIGlmIChJcy5ub3QuZXhpc3QodGhpcy5fX3ZlcnRleEhhbmRsZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LnVwZGF0ZVZlcnRleEJ1ZmZlckFuZEluZGV4QnVmZmVyKHRoaXMsIHZlcnRleEhhbmRsZXMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBkZWxldGUzREFQSVZlcnRleERhdGEoKSB7XG4gICAgaWYgKHRoaXMuX192ZXJ0ZXhIYW5kbGVzID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmRlbGV0ZVZlcnRleERhdGFSZXNvdXJjZXModGhpcy5fX3ZlcnRleEhhbmRsZXMpO1xuICAgIHRoaXMuX192ZXJ0ZXhIYW5kbGVzID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmVydGV4SGFuZGxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fX3ZlcnRleEhhbmRsZXM7XG4gIH1cblxuICBjYXN0UmF5KFxuICAgIG9yaWdWZWMzOiBJVmVjdG9yMyxcbiAgICBkaXJWZWMzOiBJVmVjdG9yMyxcbiAgICBpc0Zyb250RmFjZVBpY2thYmxlOiBib29sZWFuLFxuICAgIGlzQmFja0ZhY2VQaWNrYWJsZTogYm9vbGVhbixcbiAgICBkb3RUaHJlc2hvbGQ6IG51bWJlcixcbiAgICBoYXNGYWNlTm9ybWFsOiBib29sZWFuXG4gICk6IFJheWNhc3RSZXN1bHRFeDEge1xuICAgIGxldCBjdXJyZW50U2hvcnRlc3RUID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICBsZXQgaW5jcmVtZW50TnVtID0gMzsgLy8gZ2wuVFJJQU5HTEVTXG4gICAgaWYgKHRoaXMuX19tb2RlID09PSBQcmltaXRpdmVNb2RlLlRyaWFuZ2xlU3RyaXApIHtcbiAgICAgIC8vIGdsLlRSSUFOR0xFX1NUUklQXG4gICAgICBpbmNyZW1lbnROdW0gPSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fX21vZGUgPT09IFByaW1pdGl2ZU1vZGUuUG9pbnRzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgaGl0UG9zMEluZGV4QmFzZSA9IDA7XG4gICAgbGV0IGhpdFBvczFJbmRleEJhc2UgPSAwO1xuICAgIGNvbnN0IGhpdFBvczJJbmRleEJhc2UgPSAwO1xuICAgIGxldCB1ID0gMDtcbiAgICBsZXQgdiA9IDA7XG4gICAgaWYgKHRoaXMuaGFzSW5kaWNlcygpKSB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gdGhpcy5fX29JbmRpY2VzLnVud3JhcEZvcmNlKCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMuZWxlbWVudENvdW50IC0gMjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGogPSBpICogaW5jcmVtZW50TnVtO1xuICAgICAgICBpZiAoaiArIDIgPiBpbmRpY2VzLmVsZW1lbnRDb3VudCAtIDEpIHtcbiAgICAgICAgICAvLyBnbC5UUklBTkdMRVNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3MwSW5kZXhCYXNlID0gaW5kaWNlcy5nZXRTY2FsYXIoaiwge30pO1xuICAgICAgICBjb25zdCBwb3MxSW5kZXhCYXNlID0gaW5kaWNlcy5nZXRTY2FsYXIoaiArIDEsIHt9KTtcbiAgICAgICAgY29uc3QgcG9zMkluZGV4QmFzZSA9IGluZGljZXMuZ2V0U2NhbGFyKGogKyAyLCB7fSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX19jYXN0UmF5SW5uZXJUb21hc01vbGxlcihcbiAgICAgICAgICBvcmlnVmVjMyxcbiAgICAgICAgICBkaXJWZWMzLFxuICAgICAgICAgIGksXG4gICAgICAgICAgcG9zMEluZGV4QmFzZSxcbiAgICAgICAgICBwb3MxSW5kZXhCYXNlLFxuICAgICAgICAgIHBvczJJbmRleEJhc2UsXG4gICAgICAgICAgaXNGcm9udEZhY2VQaWNrYWJsZSxcbiAgICAgICAgICBpc0JhY2tGYWNlUGlja2FibGUsXG4gICAgICAgICAgZG90VGhyZXNob2xkLFxuICAgICAgICAgIGhhc0ZhY2VOb3JtYWxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKElzLmZhbHNlKHJlc3VsdCkgfHwgSXMubm90LmV4aXN0KHJlc3VsdC5kYXRhKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS50IDwgY3VycmVudFNob3J0ZXN0VCkge1xuICAgICAgICAgICAgY3VycmVudFNob3J0ZXN0VCA9IHJlc3VsdC5kYXRhLnQ7XG4gICAgICAgICAgICB1ID0gcmVzdWx0LmRhdGEudTtcbiAgICAgICAgICAgIHYgPSByZXN1bHQuZGF0YS52O1xuICAgICAgICAgICAgaGl0UG9zMEluZGV4QmFzZSA9IHBvczBJbmRleEJhc2U7XG4gICAgICAgICAgICBoaXRQb3MxSW5kZXhCYXNlID0gcG9zMUluZGV4QmFzZTtcbiAgICAgICAgICAgIGhpdFBvczBJbmRleEJhc2UgPSBwb3MySW5kZXhCYXNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZWxlbWVudENvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgYWNjZXNzb3Igb2YgdGhpcy5fX2F0dHJpYnV0ZXMudmFsdWVzKCkpIHtcbiAgICAgICAgZWxlbWVudENvdW50ID0gYWNjZXNzb3IuZWxlbWVudENvdW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkgKz0gaW5jcmVtZW50TnVtKSB7XG4gICAgICAgIGNvbnN0IHBvczBJbmRleEJhc2UgPSBpO1xuICAgICAgICBjb25zdCBwb3MxSW5kZXhCYXNlID0gaSArIDE7XG4gICAgICAgIGNvbnN0IHBvczJJbmRleEJhc2UgPSBpICsgMjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fX2Nhc3RSYXlJbm5lclRvbWFzTW9sbGVyKFxuICAgICAgICAgIG9yaWdWZWMzLFxuICAgICAgICAgIGRpclZlYzMsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBwb3MwSW5kZXhCYXNlLFxuICAgICAgICAgIHBvczFJbmRleEJhc2UsXG4gICAgICAgICAgcG9zMkluZGV4QmFzZSxcbiAgICAgICAgICBpc0Zyb250RmFjZVBpY2thYmxlLFxuICAgICAgICAgIGlzQmFja0ZhY2VQaWNrYWJsZSxcbiAgICAgICAgICBkb3RUaHJlc2hvbGQsXG4gICAgICAgICAgaGFzRmFjZU5vcm1hbFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCAmJiBJcy5kZWZpbmVkKHJlc3VsdC5kYXRhKSkge1xuICAgICAgICAgIGNvbnN0IHQgPSByZXN1bHQuZGF0YS50O1xuICAgICAgICAgIGlmICh0IDwgY3VycmVudFNob3J0ZXN0VCkge1xuICAgICAgICAgICAgY3VycmVudFNob3J0ZXN0VCA9IHQ7XG4gICAgICAgICAgICB1ID0gcmVzdWx0LmRhdGEudTtcbiAgICAgICAgICAgIHYgPSByZXN1bHQuZGF0YS52O1xuICAgICAgICAgICAgaGl0UG9zMEluZGV4QmFzZSA9IHBvczBJbmRleEJhc2U7XG4gICAgICAgICAgICBoaXRQb3MxSW5kZXhCYXNlID0gcG9zMUluZGV4QmFzZTtcbiAgICAgICAgICAgIGhpdFBvczBJbmRleEJhc2UgPSBwb3MySW5kZXhCYXNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50U2hvcnRlc3RUID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudFNob3J0ZXN0SW50ZXJzZWN0ZWRQb3NWZWMzID0gVmVjdG9yMy5mcm9tQ29weTMoXG4gICAgICAgIGRpclZlYzMueCAqIGN1cnJlbnRTaG9ydGVzdFQgKyBvcmlnVmVjMy54LFxuICAgICAgICBkaXJWZWMzLnkgKiBjdXJyZW50U2hvcnRlc3RUICsgb3JpZ1ZlYzMueSxcbiAgICAgICAgZGlyVmVjMy56ICogY3VycmVudFNob3J0ZXN0VCArIG9yaWdWZWMzLnpcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IHRydWUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB0OiBjdXJyZW50U2hvcnRlc3RULFxuICAgICAgICAgIHUsXG4gICAgICAgICAgdixcbiAgICAgICAgICBwb3NpdGlvbjogY3VycmVudFNob3J0ZXN0SW50ZXJzZWN0ZWRQb3NWZWMzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fY2FzdFJheUlubmVyVG9tYXNNb2xsZXIoXG4gICAgb3JpZ1ZlYzM6IElWZWN0b3IzLFxuICAgIGRpclZlYzM6IElWZWN0b3IzLFxuICAgIGk6IEluZGV4LFxuICAgIHBvczBJbmRleEJhc2U6IEluZGV4LFxuICAgIHBvczFJbmRleEJhc2U6IEluZGV4LFxuICAgIHBvczJJbmRleEJhc2U6IEluZGV4LFxuICAgIGlzRnJvbnRGYWNlUGlja2FibGU6IGJvb2xlYW4sXG4gICAgaXNCYWNrRmFjZVBpY2thYmxlOiBib29sZWFuLFxuICAgIGRvdFRocmVzaG9sZDogbnVtYmVyLFxuICAgIGhhc0ZhY2VOb3JtYWw6IGJvb2xlYW5cbiAgKTogUmF5Y2FzdFJlc3VsdCB7XG4gICAgaWYgKGhhc0ZhY2VOb3JtYWwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbEFjY2Vzc29yID0gdGhpcy5fX2F0dHJpYnV0ZXMuZ2V0KFZlcnRleEF0dHJpYnV0ZS5Ob3JtYWwuWFlaKTtcbiAgICAgIGlmIChub3JtYWxBY2Nlc3Nvcikge1xuICAgICAgICBjb25zdCBub3JtYWwgPSBub3JtYWxBY2Nlc3Nvci5nZXRWZWMzKGksIHt9KTtcbiAgICAgICAgaWYgKG5vcm1hbC5kb3QoZGlyVmVjMykgPCBkb3RUaHJlc2hvbGQgJiYgIWlzRnJvbnRGYWNlUGlja2FibGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3JtYWwuZG90KGRpclZlYzMpID4gLWRvdFRocmVzaG9sZCAmJiAhaXNCYWNrRmFjZVBpY2thYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uQWNjZXNzb3IgPSB0aGlzLl9fYXR0cmlidXRlcy5nZXQoVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWikhO1xuICAgIGNvbnN0IHBvczBWZWMzID0gcG9zaXRpb25BY2Nlc3Nvci5nZXRWZWMzKHBvczBJbmRleEJhc2UsIHt9KTtcbiAgICBjb25zdCBwb3MxVmVjMyA9IHBvc2l0aW9uQWNjZXNzb3IuZ2V0VmVjMyhwb3MxSW5kZXhCYXNlLCB7fSk7XG4gICAgY29uc3QgcG9zMlZlYzMgPSBwb3NpdGlvbkFjY2Vzc29yLmdldFZlYzMocG9zMkluZGV4QmFzZSwge30pO1xuXG4gICAgY29uc3QgZTEgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gICAgY29uc3QgZTIgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gICAgY29uc3QgcHZlYyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgICBjb25zdCB0dmVjID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICAgIGNvbnN0IHF2ZWMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG5cbiAgICBsZXQgdSA9IDAsXG4gICAgICB2ID0gMDtcblxuICAgIE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8ocG9zMVZlYzMsIHBvczBWZWMzLCBlMSk7XG4gICAgTXV0YWJsZVZlY3RvcjMuc3VidHJhY3RUbyhwb3MyVmVjMywgcG9zMFZlYzMsIGUyKTtcblxuICAgIE11dGFibGVWZWN0b3IzLmNyb3NzVG8oZGlyVmVjMywgZTIsIHB2ZWMpO1xuICAgIGNvbnN0IGRldCA9IFZlY3RvcjMuZG90KGUxLCBwdmVjKTtcblxuICAgIGlmIChkZXQgPiAwLjAwMDEpIHtcbiAgICAgIE11dGFibGVWZWN0b3IzLnN1YnRyYWN0VG8ob3JpZ1ZlYzMsIHBvczBWZWMzLCB0dmVjKTtcbiAgICAgIHUgPSBWZWN0b3IzLmRvdCh0dmVjLCBwdmVjKTtcbiAgICAgIGlmICh1IDwgMC4wIHx8IHUgPiBkZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgTXV0YWJsZVZlY3RvcjMuY3Jvc3NUbyh0dmVjLCBlMSwgcXZlYyk7XG4gICAgICB2ID0gVmVjdG9yMy5kb3QoZGlyVmVjMywgcXZlYyk7XG4gICAgICBpZiAodiA8IDAuMCB8fCB1ICsgdiA+IGRldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkZXQgPCAtMC4wMDAxKSB7XG4gICAgICBNdXRhYmxlVmVjdG9yMy5zdWJ0cmFjdFRvKG9yaWdWZWMzLCBwb3MwVmVjMywgdHZlYyk7XG4gICAgICB1ID0gVmVjdG9yMy5kb3QodHZlYywgcHZlYyk7XG4gICAgICBpZiAodSA+IDAuMCB8fCB1IDwgZGV0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIE11dGFibGVWZWN0b3IzLmNyb3NzVG8odHZlYywgZTEsIHF2ZWMpO1xuICAgICAgdiA9IFZlY3RvcjMuZG90KGRpclZlYzMsIHF2ZWMpO1xuICAgICAgaWYgKHYgPiAwLjAgfHwgdSArIHYgPCBkZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZfZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgbGV0IHQgPSBWZWN0b3IzLmRvdChlMiwgcXZlYyk7XG4gICAgdCAqPSBpbnZfZGV0O1xuICAgIHUgKj0gaW52X2RldDtcbiAgICB2ICo9IGludl9kZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiB0cnVlLFxuICAgICAgZGF0YToge1xuICAgICAgICB0LFxuICAgICAgICB1LFxuICAgICAgICB2LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NhbGNOb3JtYWxGcm9tVVYoXG4gICAgcG9zMEluZGV4QmFzZTogSW5kZXgsXG4gICAgcG9zMUluZGV4QmFzZTogSW5kZXgsXG4gICAgcG9zMkluZGV4QmFzZTogSW5kZXgsXG4gICAgdTogbnVtYmVyLFxuICAgIHY6IG51bWJlclxuICApOiBJVmVjdG9yMyB7XG4gICAgY29uc3QgZkRhdCA9IDEuMCAtIHUgLSB2O1xuXG4gICAgY29uc3QgcG9zaXRpb25BY2Nlc3NvciA9IHRoaXMuX19hdHRyaWJ1dGVzLmdldChWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaKSE7XG4gICAgY29uc3QgcG9zMFZlYzMgPSBwb3NpdGlvbkFjY2Vzc29yLmdldFZlYzMocG9zMEluZGV4QmFzZSwge30pO1xuICAgIGNvbnN0IHBvczFWZWMzID0gcG9zaXRpb25BY2Nlc3Nvci5nZXRWZWMzKHBvczFJbmRleEJhc2UsIHt9KTtcbiAgICBjb25zdCBwb3MyVmVjMyA9IHBvc2l0aW9uQWNjZXNzb3IuZ2V0VmVjMyhwb3MySW5kZXhCYXNlLCB7fSk7XG5cbiAgICBjb25zdCBwb3MwID0gVmVjdG9yMy5tdWx0aXBseShwb3MwVmVjMywgZkRhdCk7XG4gICAgY29uc3QgcG9zMSA9IFZlY3RvcjMubXVsdGlwbHkocG9zMVZlYzMsIHUpO1xuICAgIGNvbnN0IHBvczIgPSBWZWN0b3IzLm11bHRpcGx5KHBvczJWZWMzLCB2KTtcbiAgICBjb25zdCBpbnRlcnNlY3RlZFBvc1ZlYzMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCkuYWRkKHBvczApLmFkZChwb3MxKS5hZGQocG9zMik7XG4gICAgcmV0dXJuIGludGVyc2VjdGVkUG9zVmVjMztcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBBY2Nlc3NvciB9IGZyb20gJy4uL21lbW9yeS9BY2Nlc3Nvcic7XG5pbXBvcnQgeyBBcnJheTEsIEFycmF5MiwgQXJyYXkzLCBBcnJheTQsIEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSW5kaWNlc0FjY2Vzc09wdGlvbiB9IGZyb20gJy4uL21lbW9yeS9BY2Nlc3Nvcic7XG5pbXBvcnQgeyBJU2VtYW50aWNWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuL0lTZW1hbnRpY1ZlcnRleEF0dHJpYnV0ZSc7XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVWZXJ0ZXhBdHRyaWJ1dGUgaW1wbGVtZW50cyBJU2VtYW50aWNWZXJ0ZXhBdHRyaWJ1dGUge1xuICBwcml2YXRlIF9fc2VtYW50aWM6IFZlcnRleEF0dHJpYnV0ZUVudW07XG4gIHByaXZhdGUgX19hY2Nlc3NvcjogQWNjZXNzb3I7XG4gIGNvbnN0cnVjdG9yKHNlbWFudGljQXR0cmlidXRlOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtLCBhY2Nlc3NvcjogQWNjZXNzb3IpIHtcbiAgICB0aGlzLl9fc2VtYW50aWMgPSBzZW1hbnRpY0F0dHJpYnV0ZTtcbiAgICB0aGlzLl9fYWNjZXNzb3IgPSBhY2Nlc3NvcjtcbiAgfVxuXG4gIGdldCBzZW1hbnRpYygpOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX3NlbWFudGljO1xuICB9XG5cbiAgcHVibGljIGdldFNjYWxhckFzQXJyYXkoaTogSW5kZXgsIG9wdGlvbjogSW5kaWNlc0FjY2Vzc09wdGlvbik6IEFycmF5MTxudW1iZXI+IHtcbiAgICByZXR1cm4gW3RoaXMuX19hY2Nlc3Nvci5nZXRTY2FsYXIoaSwgb3B0aW9uKV07XG4gIH1cbiAgcHVibGljIGdldFZlYzJBc0FycmF5KGk6IEluZGV4LCBvcHRpb246IEluZGljZXNBY2Nlc3NPcHRpb24pOiBBcnJheTI8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX19hY2Nlc3Nvci5nZXRWZWMyQXNBcnJheShpLCBvcHRpb24pO1xuICB9XG4gIHB1YmxpYyBnZXRWZWMzQXNBcnJheShpOiBJbmRleCwgb3B0aW9uOiBJbmRpY2VzQWNjZXNzT3B0aW9uKTogQXJyYXkzPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9fYWNjZXNzb3IuZ2V0VmVjM0FzQXJyYXkoaSwgb3B0aW9uKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmVjNEFzQXJyYXkoaTogSW5kZXgsIG9wdGlvbjogSW5kaWNlc0FjY2Vzc09wdGlvbik6IEFycmF5NDxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fX2FjY2Vzc29yLmdldFZlYzRBc0FycmF5KGksIG9wdGlvbik7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vc2hhcGVzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvaW5kZXgnO1xuXG5leHBvcnQgKiBmcm9tICcuL0NvbXBsZXhWZXJ0ZXhBdHRyaWJ1dGUnO1xuZXhwb3J0ICogZnJvbSAnLi9GcnVzdHVtJztcbmV4cG9ydCAqIGZyb20gJy4vSVNlbWFudGljVmVydGV4QXR0cmlidXRlJztcbmV4cG9ydCAqIGZyb20gJy4vTWVzaCc7XG5leHBvcnQgKiBmcm9tICcuL1ByaW1pdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL1NpbXBsZVZlcnRleEF0dHJpYnV0ZSc7XG4iLCJpbXBvcnQgeyBJQW55UHJpbWl0aXZlRGVzY3JpcHRvciB9IGZyb20gJy4uL1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElTaGFwZSB9IGZyb20gJy4uL3NoYXBlcy9JU2hhcGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF4aXNEZXNjcmlwdG9yIGV4dGVuZHMgSUFueVByaW1pdGl2ZURlc2NyaXB0b3Ige1xuICAvKiogdGhlIGxlbmd0aCBvZiBheGlzICovXG4gIGxlbmd0aD86IFNpemU7XG59XG5cbi8qKlxuICogdGhlIEF4aXMgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEF4aXMgZXh0ZW5kcyBJU2hhcGUge1xuICAvKipcbiAgICogR2VuZXJhdGVzIGEgYXhpcyBvYmplY3RcbiAgICogQHBhcmFtIF9kZXNjIGEgZGVzY3JpcHRvciBvYmplY3Qgb2YgYSBBeGlzXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoX2Rlc2M6IEF4aXNEZXNjcmlwdG9yKTogdm9pZCB7XG4gICAgY29uc3QgZGVzYyA9IHtcbiAgICAgIGxlbmd0aDogX2Rlc2MubGVuZ3RoID8/IDEsXG4gICAgICBtYXRlcmlhbDogX2Rlc2MubWF0ZXJpYWwsXG4gICAgfTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtcbiAgICAgIC8vIFggYXhpc1xuICAgICAgMCwgMCwgMCxcbiAgICAgIGRlc2MubGVuZ3RoLCAwLCAwLFxuXG4gICAgICAvLyBZIGF4aXNcbiAgICAgIDAsIDAsIDAsXG4gICAgICAwLCBkZXNjLmxlbmd0aCwgMCxcblxuICAgICAgLy8gWiBheGlzXG4gICAgICAwLCAwLCAwLFxuICAgICAgMCwgMCwgZGVzYy5sZW5ndGgsXG4gICAgXTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGNvbG9ycyA9IFtcbiAgICAgIC8vIFggYXhpcyBhcyBSZWRcbiAgICAgIDEsIDAsIDAsXG4gICAgICAxLCAwLCAwLFxuXG4gICAgICAvLyBZIGF4aXMgYXMgR3JlZW5cbiAgICAgIDAsIDEsIDAsXG4gICAgICAwLCAxLCAwLFxuXG4gICAgICAvLyBaIGF4aXMgYXMgQmx1ZVxuICAgICAgMCwgMCwgMSxcbiAgICAgIDAsIDAsIDEsXG4gICAgXTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbbmV3IEZsb2F0MzJBcnJheShwb3NpdGlvbnMpLCBuZXcgRmxvYXQzMkFycmF5KGNvbG9ycyldO1xuXG4gICAgLy8gQ2hlY2sgU2l6ZVxuICAgIGNvbnN0IGF0dHJpYnV0ZVNlbWFudGljcyA9IFtWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaLCBWZXJ0ZXhBdHRyaWJ1dGUuQ29sb3IwLlhZWl07XG5cbiAgICB0aGlzLmNvcHlWZXJ0ZXhEYXRhKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBhdHRyaWJ1dGVTZW1hbnRpY3MsXG4gICAgICBwcmltaXRpdmVNb2RlOiBQcmltaXRpdmVNb2RlLkxpbmVzLFxuICAgICAgbWF0ZXJpYWw6IGRlc2MubWF0ZXJpYWwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByaW1pdGl2ZU1vZGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9QcmltaXRpdmVNb2RlJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBJQ29sb3JSZ2JhIH0gZnJvbSAnLi4vLi4vbWF0aC9JQ29sb3InO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgUGh5c2ljc1Byb3BlcnR5LCBQaHlzaWNzUHJvcGVydHlJbm5lciB9IGZyb20gJy4uLy4uL3BoeXNpY3MvUGh5c2ljc1Byb3BlcnR5JztcbmltcG9ydCB7IElBbnlQcmltaXRpdmVEZXNjcmlwdG9yLCBQcmltaXRpdmUgfSBmcm9tICcuLi9QcmltaXRpdmUnO1xuaW1wb3J0IHsgSVNoYXBlIH0gZnJvbSAnLi9JU2hhcGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1YmVEZXNjcmlwdG9yIGV4dGVuZHMgSUFueVByaW1pdGl2ZURlc2NyaXB0b3Ige1xuICAvKiogdGhyZWUgd2lkdGggKHdpZHRoLCBoZWlnaHQsIGRlcHRoKSBpbiAoeCwgeSwgeikgKi9cbiAgd2lkdGhWZWN0b3I/OiBJVmVjdG9yMztcbiAgLyoqIGNvbG9yICovXG4gIGNvbG9yPzogSUNvbG9yUmdiYTtcbiAgcGh5c2ljcz86IFBoeXNpY3NQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBUaGUgQ3ViZSBQcmltaXRpdmUgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEN1YmUgZXh0ZW5kcyBJU2hhcGUge1xuICAvKipcbiAgICogR2VuZXJhdGVzIGEgY3ViZSBvYmplY3RcbiAgICogQHBhcmFtIF9kZXNjIGEgZGVzY3JpcHRvciBvYmplY3Qgb2YgYSBDdWJlXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoX2Rlc2M6IEN1YmVEZXNjcmlwdG9yKTogdm9pZCB7XG4gICAgY29uc3QgZGVzYyA9IHtcbiAgICAgIHdpZHRoVmVjdG9yOiBfZGVzYy53aWR0aFZlY3RvciA/PyBWZWN0b3IzLmZyb21Db3B5MygxLCAxLCAxKSxcbiAgICAgIGNvbG9yOiBfZGVzYy5jb2xvcixcbiAgICAgIG1hdGVyaWFsOiBfZGVzYy5tYXRlcmlhbCxcbiAgICB9O1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGluZGljZXMgPSBbXG4gICAgICAzLCAxLCAwLCAyLCAxLCAzLFxuICAgICAgNCwgNSwgNywgNywgNSwgNixcbiAgICAgIDgsIDksIDExLCAxMSwgOSwgMTAsXG4gICAgICAxNSwgMTMsIDEyLCAxNCwgMTMsIDE1LFxuICAgICAgMTksIDE3LCAxNiwgMTgsIDE3LCAxOSxcbiAgICAgIDIwLCAyMSwgMjMsIDIzLCAyMSwgMjJcbiAgICBdO1xuXG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3QgcG9zaXRpb25zID0gW1xuICAgICAgLy8gdXBwZXJcbiAgICAgIC1kZXNjLndpZHRoVmVjdG9yLnggLyAyLCBkZXNjLndpZHRoVmVjdG9yLnkgLyAyLCAtZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIGRlc2Mud2lkdGhWZWN0b3IueCAvIDIsICBkZXNjLndpZHRoVmVjdG9yLnkgLyAyLCAtZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIGRlc2Mud2lkdGhWZWN0b3IueCAvIDIsICBkZXNjLndpZHRoVmVjdG9yLnkgLyAyLCBkZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgLWRlc2Mud2lkdGhWZWN0b3IueCAvIDIsIGRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIGRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICAvLyBsb3dlclxuICAgICAgLWRlc2Mud2lkdGhWZWN0b3IueCAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnkgLyAyLCAtZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIGRlc2Mud2lkdGhWZWN0b3IueCAvIDIsICAtZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgLWRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICBkZXNjLndpZHRoVmVjdG9yLnggLyAyLCAgLWRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIGRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICAtZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgLWRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIGRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICAvLyBmcm9udFxuICAgICAgLWRlc2Mud2lkdGhWZWN0b3IueCAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnkgLyAyLCBkZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgIC1kZXNjLndpZHRoVmVjdG9yLnkgLyAyLCBkZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgIGRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIGRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICAtZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIC8vIGJhY2tcbiAgICAgIC1kZXNjLndpZHRoVmVjdG9yLnggLyAyLCAtZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgLWRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICBkZXNjLndpZHRoVmVjdG9yLnggLyAyLCAgLWRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgIGRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgLWRlc2Mud2lkdGhWZWN0b3IueCAvIDIsIGRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgLy8gcmlnaHRcbiAgICAgIGRlc2Mud2lkdGhWZWN0b3IueCAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnkgLyAyLCAtZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIGRlc2Mud2lkdGhWZWN0b3IueCAvIDIsICAtZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIGRlc2Mud2lkdGhWZWN0b3IueCAvIDIsICBkZXNjLndpZHRoVmVjdG9yLnkgLyAyLCBkZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgLWRlc2Mud2lkdGhWZWN0b3IueiAvIDIsXG4gICAgICAvLyBsZWZ0XG4gICAgICAtZGVzYy53aWR0aFZlY3Rvci54IC8gMiwgLWRlc2Mud2lkdGhWZWN0b3IueSAvIDIsIC1kZXNjLndpZHRoVmVjdG9yLnogLyAyLFxuICAgICAgLWRlc2Mud2lkdGhWZWN0b3IueCAvIDIsICAtZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIC1kZXNjLndpZHRoVmVjdG9yLnggLyAyLCAgZGVzYy53aWR0aFZlY3Rvci55IC8gMiwgZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICAgIC1kZXNjLndpZHRoVmVjdG9yLnggLyAyLCBkZXNjLndpZHRoVmVjdG9yLnkgLyAyLCAtZGVzYy53aWR0aFZlY3Rvci56IC8gMixcbiAgICBdO1xuXG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3QgY29sb3JzID0gSXMubm90LmV4aXN0KGRlc2MuY29sb3IpID8gW10gOiBbXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcblxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG5cbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcblxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG5cbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgICBkZXNjLmNvbG9yLnIsIGRlc2MuY29sb3IuZywgZGVzYy5jb2xvci5iLCBkZXNjLmNvbG9yLmEsXG4gICAgICAgIGRlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYSxcbiAgICAgICAgZGVzYy5jb2xvci5yLCBkZXNjLmNvbG9yLmcsIGRlc2MuY29sb3IuYiwgZGVzYy5jb2xvci5hLFxuICAgICAgXTtcblxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IHRleGNvb3JkcyA9IFtcbiAgICAgIC8vIHVwcGVyXG4gICAgICAwLjAsIDAuMCxcbiAgICAgIDEuMCwgMC4wLFxuICAgICAgMS4wLCAxLjAsXG4gICAgICAwLjAsIDEuMCxcblxuICAgICAgLy8gbG93ZXJcbiAgICAgIDAuMCwgMC4wLFxuICAgICAgMS4wLCAwLjAsXG4gICAgICAxLjAsIDEuMCxcbiAgICAgIDAuMCwgMS4wLFxuXG4gICAgICAvLyBmcm9udFxuICAgICAgMC4wLCAwLjAsXG4gICAgICAxLjAsIDAuMCxcbiAgICAgIDEuMCwgMS4wLFxuICAgICAgMC4wLCAxLjAsXG5cbiAgICAgIC8vIGJhY2tcbiAgICAgIDAuMCwgMC4wLFxuICAgICAgMS4wLCAwLjAsXG4gICAgICAxLjAsIDEuMCxcbiAgICAgIDAuMCwgMS4wLFxuXG4gICAgICAvLyByaWdodFxuICAgICAgMC4wLCAwLjAsXG4gICAgICAxLjAsIDAuMCxcbiAgICAgIDEuMCwgMS4wLFxuICAgICAgMC4wLCAxLjAsXG5cbiAgICAgIC8vIGxlZnRcbiAgICAgIDAuMCwgMC4wLFxuICAgICAgMS4wLCAwLjAsXG4gICAgICAxLjAsIDEuMCxcbiAgICAgIDAuMCwgMS4wLFxuICAgIF07XG5cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBub3JtYWxzID0gW1xuICAgICAgLy8gdXBwZXJcbiAgICAgIDAsIDEsIDAsXG4gICAgICAwLCAxLCAwLFxuICAgICAgMCwgMSwgMCxcbiAgICAgIDAsIDEsIDAsXG4gICAgICAvLyBsb3dlclxuICAgICAgMCwgLTEsIDAsXG4gICAgICAwLCAtMSwgMCxcbiAgICAgIDAsIC0xLCAwLFxuICAgICAgMCwgLTEsIDAsXG4gICAgICAvLyBmcm9udFxuICAgICAgMCwgMCwgMSxcbiAgICAgIDAsIDAsIDEsXG4gICAgICAwLCAwLCAxLFxuICAgICAgMCwgMCwgMSxcbiAgICAgIC8vIGJhY2tcbiAgICAgIDAsIDAsIC0xLFxuICAgICAgMCwgMCwgLTEsXG4gICAgICAwLCAwLCAtMSxcbiAgICAgIDAsIDAsIC0xLFxuICAgICAgLy8gcmlnaHRcbiAgICAgIDEsIDAsIDAsXG4gICAgICAxLCAwLCAwLFxuICAgICAgMSwgMCwgMCxcbiAgICAgIDEsIDAsIDAsXG4gICAgICAvLyBsZWZ0XG4gICAgICAtMSwgMCwgMCxcbiAgICAgIC0xLCAwLCAwLFxuICAgICAgLTEsIDAsIDAsXG4gICAgICAtMSwgMCwgMCxcbiAgICBdO1xuXG4gICAgLy8vIENoZWNrIFNpemUgLy8vXG4gICAgY29uc3QgYXR0cmlidXRlU2VtYW50aWNzID0gW1xuICAgICAgVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWixcbiAgICAgIFZlcnRleEF0dHJpYnV0ZS5Ob3JtYWwuWFlaLFxuICAgICAgVmVydGV4QXR0cmlidXRlLlRleGNvb3JkMC5YWSxcbiAgICBdO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucyksXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KG5vcm1hbHMpLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheSh0ZXhjb29yZHMpLFxuICAgIF07XG4gICAgaWYgKElzLmV4aXN0KGRlc2MuY29sb3IpKSB7XG4gICAgICBhdHRyaWJ1dGVTZW1hbnRpY3MucHVzaChWZXJ0ZXhBdHRyaWJ1dGUuQ29sb3IwLlhZWik7XG4gICAgICBhdHRyaWJ1dGVzLnB1c2gobmV3IEZsb2F0MzJBcnJheShjb2xvcnMpKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbWl0aXZlTW9kZSA9IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVzO1xuXG4gICAgdGhpcy5jb3B5VmVydGV4RGF0YSh7XG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgYXR0cmlidXRlU2VtYW50aWNzLFxuICAgICAgcHJpbWl0aXZlTW9kZSxcbiAgICAgIGluZGljZXM6IG5ldyBVaW50MTZBcnJheShpbmRpY2VzKSxcbiAgICAgIG1hdGVyaWFsOiBkZXNjLm1hdGVyaWFsLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJQW55UHJpbWl0aXZlRGVzY3JpcHRvciwgUHJpbWl0aXZlIH0gZnJvbSAnLi4vUHJpbWl0aXZlJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBQcmltaXRpdmVNb2RlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJpbWl0aXZlTW9kZSc7XG5pbXBvcnQgeyBTaXplIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSVNoYXBlIH0gZnJvbSAnLi9JU2hhcGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyaWREZXNjcmlwdG9yIGV4dGVuZHMgSUFueVByaW1pdGl2ZURlc2NyaXB0b3Ige1xuICAvKiogdGhlIGRlc2MubGVuZ3RoIG9mIGF4aXMgKi9cbiAgbGVuZ3RoPzogU2l6ZTtcbiAgLyoqIHRoZSBkaXZpc2lvbiBvZiBncmlkICovXG4gIGRpdmlzaW9uPzogU2l6ZTtcbiAgLyoqIHRoZSBYWiBheGlzICovXG4gIGlzWFo/OiBib29sZWFuO1xuICAvKiogdGhlIFhZIGF4aXMgKi9cbiAgaXNYWT86IGJvb2xlYW47XG4gIC8qKiB0aGUgWVogYXhpcyAqL1xuICBpc1laPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiB0aGUgR3JpZCBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgR3JpZCBleHRlbmRzIElTaGFwZSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBncmlkIG9iamVjdFxuICAgKiBAcGFyYW0gX2Rlc2MgYSBkZXNjcmlwdG9yIG9iamVjdCBvZiBhIEdyaWRcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZShfZGVzYzogR3JpZERlc2NyaXB0b3IpOiB2b2lkIHtcbiAgICBjb25zdCBkZXNjID0ge1xuICAgICAgbGVuZ3RoOiBfZGVzYy5sZW5ndGggPz8gMSxcbiAgICAgIGRpdmlzaW9uOiBfZGVzYy5kaXZpc2lvbiA/PyAxMCxcbiAgICAgIGlzWFk6IF9kZXNjLmlzWFkgPz8gdHJ1ZSxcbiAgICAgIGlzWFo6IF9kZXNjLmlzWFogPz8gdHJ1ZSxcbiAgICAgIGlzWVo6IF9kZXNjLmlzWVogPz8gdHJ1ZSxcbiAgICAgIG1hdGVyaWFsOiBfZGVzYy5tYXRlcmlhbCxcbiAgICB9O1xuICAgIGNvbnN0IHBvc2l0aW9uczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2MuZGl2aXNpb24gKiAyICsgMzsgaSsrKSB7XG4gICAgICBjb25zdCBzdGFydCA9IC1kZXNjLmxlbmd0aDtcbiAgICAgIGNvbnN0IG9uZVVuaXRMZW5ndGggPSBkZXNjLmxlbmd0aCAvIChkZXNjLmRpdmlzaW9uICsgMSk7XG5cbiAgICAgIC8vIFhaIGdyaWRcbiAgICAgIGlmIChkZXNjLmlzWFopIHtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goLWRlc2MubGVuZ3RoLCAwLCBzdGFydCArIG9uZVVuaXRMZW5ndGggKiBpKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZGVzYy5sZW5ndGgsIDAsIHN0YXJ0ICsgb25lVW5pdExlbmd0aCAqIGkpO1xuXG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0ICsgb25lVW5pdExlbmd0aCAqIGksIDAsIC1kZXNjLmxlbmd0aCk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0ICsgb25lVW5pdExlbmd0aCAqIGksIDAsIGRlc2MubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgLy8gWFkgZ3JpZFxuICAgICAgaWYgKGRlc2MuaXNYWSkge1xuICAgICAgICBwb3NpdGlvbnMucHVzaCgtZGVzYy5sZW5ndGgsIHN0YXJ0ICsgb25lVW5pdExlbmd0aCAqIGksIDApO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChkZXNjLmxlbmd0aCwgc3RhcnQgKyBvbmVVbml0TGVuZ3RoICogaSwgMCk7XG5cbiAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgKyBvbmVVbml0TGVuZ3RoICogaSwgLWRlc2MubGVuZ3RoLCAwKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgKyBvbmVVbml0TGVuZ3RoICogaSwgZGVzYy5sZW5ndGgsIDApO1xuICAgICAgfVxuXG4gICAgICAvLyBZWiBncmlkXG4gICAgICBpZiAoZGVzYy5pc1laKSB7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKDAsIC1kZXNjLmxlbmd0aCwgc3RhcnQgKyBvbmVVbml0TGVuZ3RoICogaSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKDAsIGRlc2MubGVuZ3RoLCBzdGFydCArIG9uZVVuaXRMZW5ndGggKiBpKTtcblxuICAgICAgICBwb3NpdGlvbnMucHVzaCgwLCBzdGFydCArIG9uZVVuaXRMZW5ndGggKiBpLCAtZGVzYy5sZW5ndGgpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaCgwLCBzdGFydCArIG9uZVVuaXRMZW5ndGggKiBpLCBkZXNjLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFtuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucyldO1xuXG4gICAgLy8gSW5kZXggQnVmZmVyXG4gICAgLy8gQ2hlY2sgU2l6ZVxuICAgIGNvbnN0IGF0dHJpYnV0ZVNlbWFudGljcyA9IFtWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaXTtcblxuICAgIHRoaXMuY29weVZlcnRleERhdGEoe1xuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljcyxcbiAgICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGUuTGluZXMsXG4gICAgICBtYXRlcmlhbDogZGVzYz8ubWF0ZXJpYWwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IElBbnlQcmltaXRpdmVEZXNjcmlwdG9yLCBQcmltaXRpdmUgfSBmcm9tICcuLi9QcmltaXRpdmUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSVNoYXBlIGV4dGVuZHMgUHJpbWl0aXZlIHtcbiAgYWJzdHJhY3QgZ2VuZXJhdGUoZGVzYzogSUFueVByaW1pdGl2ZURlc2NyaXB0b3IpOiB2b2lkO1xufVxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBJQW55UHJpbWl0aXZlRGVzY3JpcHRvciwgUHJpbWl0aXZlIH0gZnJvbSAnLi4vUHJpbWl0aXZlJztcbmltcG9ydCB7IFByaW1pdGl2ZU1vZGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9QcmltaXRpdmVNb2RlJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBJU2hhcGUgfSBmcm9tICcuL0lTaGFwZSc7XG5cbmV4cG9ydCB0eXBlIEpvaW50RGVzY3JpcHRvciA9IElBbnlQcmltaXRpdmVEZXNjcmlwdG9yO1xuXG4vKipcbiAqIHRoZSBKb2ludCBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgSm9pbnQgZXh0ZW5kcyBJU2hhcGUge1xuICBwcml2YXRlIF9fd29ybGRQb3NpdGlvbk9mVGhpc0pvaW50ID0gVmVjdG9yMy5mcm9tQ29weUFycmF5MyhbMCwgMCwgMV0pO1xuICBwcml2YXRlIF9fd29ybGRQb3NpdGlvbk9mUGFyZW50Sm9pbnQgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkzKFswLCAwLCAwXSk7XG4gIHByaXZhdGUgX193aWR0aCA9IDE7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIGpvaW50IG9iamVjdFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlKGRlc2M6IEpvaW50RGVzY3JpcHRvcik6IHZvaWQge1xuICAgIGNvbnN0IGxlbmd0aCA9IFZlY3RvcjMubGVuZ3RoQnR3KFxuICAgICAgdGhpcy5fX3dvcmxkUG9zaXRpb25PZlRoaXNKb2ludCxcbiAgICAgIHRoaXMuX193b3JsZFBvc2l0aW9uT2ZQYXJlbnRKb2ludFxuICAgICk7XG4gICAgY29uc3QgYXJyb3dXaWR0aCA9IHRoaXMuX193aWR0aDtcbiAgICBjb25zdCBhcnJvd2hlYWRMZW5ndGggPSBsZW5ndGggLyA3LjU7XG4gICAgY29uc3QgYXJyb3dTdGlja0xlbmd0aCA9IGxlbmd0aCAtIGFycm93aGVhZExlbmd0aDtcblxuICAgIGNvbnN0IGRlbHRhVmVjID0gVmVjdG9yMy5zdWJ0cmFjdChcbiAgICAgIHRoaXMuX193b3JsZFBvc2l0aW9uT2ZQYXJlbnRKb2ludCxcbiAgICAgIHRoaXMuX193b3JsZFBvc2l0aW9uT2ZUaGlzSm9pbnRcbiAgICApO1xuICAgIGxldCBkaXJlY3Rpb25Ub1BhcmVudCA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoWzAsIDEsIDBdKTtcbiAgICBpZiAoIWRlbHRhVmVjLmlzRXF1YWwoVmVjdG9yMy56ZXJvKCkpKSB7XG4gICAgICBkaXJlY3Rpb25Ub1BhcmVudCA9IFZlY3RvcjMubm9ybWFsaXplKFxuICAgICAgICBWZWN0b3IzLnN1YnRyYWN0KHRoaXMuX193b3JsZFBvc2l0aW9uT2ZQYXJlbnRKb2ludCwgdGhpcy5fX3dvcmxkUG9zaXRpb25PZlRoaXNKb2ludClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFycm93U3RpY2tQb3NpdGlvbiA9IFZlY3RvcjMuYWRkKFxuICAgICAgdGhpcy5fX3dvcmxkUG9zaXRpb25PZlRoaXNKb2ludCxcbiAgICAgIFZlY3RvcjMubXVsdGlwbHkoZGlyZWN0aW9uVG9QYXJlbnQsIGFycm93U3RpY2tMZW5ndGgpXG4gICAgKTtcblxuICAgIGxldCBkdW1teVZlY3RvciA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoWzAsIDEsIDBdKTtcbiAgICBsZXQgZHVtbXlWZWN0b3IyID0gVmVjdG9yMy5mcm9tQ29weUFycmF5MyhbMCwgLTEsIDBdKTtcbiAgICBpZiAoTWF0aC5hYnMoVmVjdG9yMy5kb3QoZGlyZWN0aW9uVG9QYXJlbnQsIGR1bW15VmVjdG9yKSkgPiAwLjQpIHtcbiAgICAgIGR1bW15VmVjdG9yID0gVmVjdG9yMy5mcm9tQ29weUFycmF5MyhbMSwgMCwgMF0pO1xuICAgICAgZHVtbXlWZWN0b3IyID0gVmVjdG9yMy5mcm9tQ29weUFycmF5MyhbLTEsIDAsIDBdKTtcbiAgICB9XG4gICAgaWYgKE1hdGguYWJzKFZlY3RvcjMuZG90KGRpcmVjdGlvblRvUGFyZW50LCBkdW1teVZlY3RvcikpID4gMC40KSB7XG4gICAgICBkdW1teVZlY3RvciA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoWzAsIDAsIDFdKTtcbiAgICAgIGR1bW15VmVjdG9yMiA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoWzAsIDAsIC0xXSk7XG4gICAgfVxuICAgIGNvbnN0IGNyb3NzVmVjdG9yID0gVmVjdG9yMy5tdWx0aXBseShcbiAgICAgIFZlY3RvcjMubm9ybWFsaXplKFZlY3RvcjMuY3Jvc3MoZGlyZWN0aW9uVG9QYXJlbnQsIGR1bW15VmVjdG9yKSksXG4gICAgICBhcnJvd1dpZHRoXG4gICAgKTtcbiAgICBjb25zdCBjcm9zc1ZlY3RvcjIgPSBWZWN0b3IzLm11bHRpcGx5KFxuICAgICAgVmVjdG9yMy5ub3JtYWxpemUoVmVjdG9yMy5jcm9zcyhkaXJlY3Rpb25Ub1BhcmVudCwgY3Jvc3NWZWN0b3IpKSxcbiAgICAgIGFycm93V2lkdGhcbiAgICApO1xuICAgIGNvbnN0IGNyb3NzVmVjdG9yMyA9IFZlY3RvcjMubXVsdGlwbHkoXG4gICAgICBWZWN0b3IzLm5vcm1hbGl6ZShWZWN0b3IzLmNyb3NzKGRpcmVjdGlvblRvUGFyZW50LCBkdW1teVZlY3RvcjIpKSxcbiAgICAgIGFycm93V2lkdGhcbiAgICApO1xuICAgIGNvbnN0IGNyb3NzVmVjdG9yNCA9IFZlY3RvcjMubXVsdGlwbHkoXG4gICAgICBWZWN0b3IzLm5vcm1hbGl6ZShWZWN0b3IzLmNyb3NzKGRpcmVjdGlvblRvUGFyZW50LCBjcm9zc1ZlY3RvcjMpKSxcbiAgICAgIGFycm93V2lkdGhcbiAgICApO1xuXG4gICAgY29uc3QgY3Jvc3NQb3NpdGlvbiA9IFZlY3RvcjMuYWRkKGFycm93U3RpY2tQb3NpdGlvbiwgY3Jvc3NWZWN0b3IpO1xuICAgIGNvbnN0IGNyb3NzUG9zaXRpb24yID0gVmVjdG9yMy5hZGQoYXJyb3dTdGlja1Bvc2l0aW9uLCBjcm9zc1ZlY3RvcjIpO1xuICAgIGNvbnN0IGNyb3NzUG9zaXRpb24zID0gVmVjdG9yMy5hZGQoYXJyb3dTdGlja1Bvc2l0aW9uLCBjcm9zc1ZlY3RvcjMpO1xuICAgIGNvbnN0IGNyb3NzUG9zaXRpb240ID0gVmVjdG9yMy5hZGQoYXJyb3dTdGlja1Bvc2l0aW9uLCBjcm9zc1ZlY3RvcjQpO1xuXG4gICAgY29uc3QgcG9zOiBWZWN0b3IzW10gPSBbXTtcblxuICAgIC8vIExvbmcgUHlyYW1pZFxuICAgIHBvcy5wdXNoKHRoaXMuX193b3JsZFBvc2l0aW9uT2ZUaGlzSm9pbnQpO1xuICAgIHBvcy5wdXNoKGNyb3NzUG9zaXRpb24pO1xuXG4gICAgcG9zLnB1c2godGhpcy5fX3dvcmxkUG9zaXRpb25PZlRoaXNKb2ludCk7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbjIpO1xuXG4gICAgcG9zLnB1c2godGhpcy5fX3dvcmxkUG9zaXRpb25PZlRoaXNKb2ludCk7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbjMpO1xuXG4gICAgcG9zLnB1c2godGhpcy5fX3dvcmxkUG9zaXRpb25PZlRoaXNKb2ludCk7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbjQpO1xuXG4gICAgLy8gUGxhbmVcbiAgICBwb3MucHVzaChjcm9zc1Bvc2l0aW9uKTtcbiAgICBwb3MucHVzaChjcm9zc1Bvc2l0aW9uMik7XG5cbiAgICBwb3MucHVzaChjcm9zc1Bvc2l0aW9uMik7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbjMpO1xuICAgIHBvcy5wdXNoKGNyb3NzUG9zaXRpb24zKTtcbiAgICBwb3MucHVzaChjcm9zc1Bvc2l0aW9uNCk7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbjQpO1xuICAgIHBvcy5wdXNoKGNyb3NzUG9zaXRpb24pO1xuXG4gICAgLy8gU2hvcnQgUHlyYW1pZFxuICAgIHBvcy5wdXNoKHRoaXMuX193b3JsZFBvc2l0aW9uT2ZQYXJlbnRKb2ludCk7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbik7XG5cbiAgICBwb3MucHVzaCh0aGlzLl9fd29ybGRQb3NpdGlvbk9mUGFyZW50Sm9pbnQpO1xuICAgIHBvcy5wdXNoKGNyb3NzUG9zaXRpb24yKTtcblxuICAgIHBvcy5wdXNoKHRoaXMuX193b3JsZFBvc2l0aW9uT2ZQYXJlbnRKb2ludCk7XG4gICAgcG9zLnB1c2goY3Jvc3NQb3NpdGlvbjMpO1xuXG4gICAgcG9zLnB1c2godGhpcy5fX3dvcmxkUG9zaXRpb25PZlBhcmVudEpvaW50KTtcbiAgICBwb3MucHVzaChjcm9zc1Bvc2l0aW9uNCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbnM6IG51bWJlcltdID0gW107XG4gICAgcG9zLm1hcCgodmVjKSA9PiB7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShwb3NpdGlvbnMsIHZlYy5mbGF0dGVuQXNBcnJheSgpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbbmV3IEZsb2F0MzJBcnJheShwb3NpdGlvbnMpXTtcblxuICAgIC8vIENoZWNrIFNpemVcbiAgICBjb25zdCBhdHRyaWJ1dGVTZW1hbnRpY3MgPSBbVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWl07XG5cbiAgICB0aGlzLmNvcHlWZXJ0ZXhEYXRhKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBhdHRyaWJ1dGVTZW1hbnRpY3MsXG4gICAgICBwcmltaXRpdmVNb2RlOiBQcmltaXRpdmVNb2RlLkxpbmVzLFxuICAgICAgbWF0ZXJpYWw6IGRlc2M/Lm1hdGVyaWFsLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJQW55UHJpbWl0aXZlRGVzY3JpcHRvciwgUHJpbWl0aXZlIH0gZnJvbSAnLi4vUHJpbWl0aXZlJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBQcmltaXRpdmVNb2RlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJpbWl0aXZlTW9kZSc7XG5pbXBvcnQgeyBJVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBJU2hhcGUgfSBmcm9tICcuL0lTaGFwZSc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcblxuZXhwb3J0IGludGVyZmFjZSBMaW5lRGVzY3JpcHRvciBleHRlbmRzIElBbnlQcmltaXRpdmVEZXNjcmlwdG9yIHtcbiAgLyoqIHRoZSBzdGFydCBwb3NpdGlvbiAqL1xuICBzdGFydFBvcz86IElWZWN0b3IzO1xuICAvKiogdGhlIGVuZCBwb3NpdGlvbiAqL1xuICBlbmRQb3M/OiBJVmVjdG9yMztcbiAgLyoqIHdoZXRoZXIgaXQgaGFzIHRoZSB0ZXJtaW5hbCBtYXJrICovXG4gIGhhc1Rlcm1pbmFsTWFyaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogdGhlIExpbmUgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExpbmUgZXh0ZW5kcyBJU2hhcGUge1xuICAvKipcbiAgICogR2VuZXJhdGVzIGEgbGluZSBvYmplY3RcbiAgICogQHBhcmFtIF9kZXNjIGEgZGVzY3JpcHRvciBvYmplY3Qgb2YgYSBMaW5lXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoX2Rlc2M6IExpbmVEZXNjcmlwdG9yKTogdm9pZCB7XG4gICAgY29uc3QgZGVzYyA9IHtcbiAgICAgIHN0YXJ0UG9zOiBfZGVzYy5zdGFydFBvcyA/PyBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAwKSxcbiAgICAgIGVuZFBvczogX2Rlc2MuZW5kUG9zID8/IFZlY3RvcjMuZnJvbUNvcHkzKDEsIDAsIDApLFxuICAgICAgaGFzVGVybWluYWxNYXJrOiBfZGVzYy5oYXNUZXJtaW5hbE1hcmsgPz8gdHJ1ZSxcbiAgICAgIG1hdGVyaWFsOiBfZGVzYy5tYXRlcmlhbCxcbiAgICB9O1xuXG4gICAgY29uc3QgcG9zaXRpb25zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgcG9zaXRpb25zLnB1c2goLi4uZGVzYy5zdGFydFBvcy5mbGF0dGVuQXNBcnJheSgpKTtcbiAgICBwb3NpdGlvbnMucHVzaCguLi5kZXNjLmVuZFBvcy5mbGF0dGVuQXNBcnJheSgpKTtcblxuICAgIGlmIChkZXNjLmhhc1Rlcm1pbmFsTWFyaykge1xuICAgICAgY29uc3QgbGVuZ3RoID0gZGVzYy5zdGFydFBvcy5sZW5ndGhUbyhkZXNjLmVuZFBvcyk7XG4gICAgICBjb25zdCBtYXJrU2l6ZSA9IGxlbmd0aCAqIDAuMTtcblxuICAgICAgcG9zaXRpb25zLnB1c2goZGVzYy5zdGFydFBvcy54IC0gbWFya1NpemUsIGRlc2Muc3RhcnRQb3MueSwgZGVzYy5zdGFydFBvcy56KTtcbiAgICAgIHBvc2l0aW9ucy5wdXNoKGRlc2Muc3RhcnRQb3MueCArIG1hcmtTaXplLCBkZXNjLnN0YXJ0UG9zLnksIGRlc2Muc3RhcnRQb3Mueik7XG5cbiAgICAgIHBvc2l0aW9ucy5wdXNoKGRlc2Muc3RhcnRQb3MueCwgZGVzYy5zdGFydFBvcy55LCBkZXNjLnN0YXJ0UG9zLnogLSBtYXJrU2l6ZSk7XG4gICAgICBwb3NpdGlvbnMucHVzaChkZXNjLnN0YXJ0UG9zLngsIGRlc2Muc3RhcnRQb3MueSwgZGVzYy5zdGFydFBvcy56ICsgbWFya1NpemUpO1xuXG4gICAgICBwb3NpdGlvbnMucHVzaChkZXNjLmVuZFBvcy54IC0gbWFya1NpemUsIGRlc2MuZW5kUG9zLnksIGRlc2MuZW5kUG9zLnopO1xuICAgICAgcG9zaXRpb25zLnB1c2goZGVzYy5lbmRQb3MueCArIG1hcmtTaXplLCBkZXNjLmVuZFBvcy55LCBkZXNjLmVuZFBvcy56KTtcblxuICAgICAgcG9zaXRpb25zLnB1c2goZGVzYy5lbmRQb3MueCwgZGVzYy5lbmRQb3MueSwgZGVzYy5lbmRQb3MueiAtIG1hcmtTaXplKTtcbiAgICAgIHBvc2l0aW9ucy5wdXNoKGRlc2MuZW5kUG9zLngsIGRlc2MuZW5kUG9zLnksIGRlc2MuZW5kUG9zLnogKyBtYXJrU2l6ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFtuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucyldO1xuXG4gICAgLy8gQ2hlY2sgU2l6ZVxuICAgIGNvbnN0IGF0dHJpYnV0ZVNlbWFudGljcyA9IFtWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaXTtcblxuICAgIHRoaXMuY29weVZlcnRleERhdGEoe1xuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljcyxcbiAgICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGUuTGluZXMsXG4gICAgICBtYXRlcmlhbDogZGVzYy5tYXRlcmlhbCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSUFueVByaW1pdGl2ZURlc2NyaXB0b3IsIFByaW1pdGl2ZSB9IGZyb20gJy4uL1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElTaGFwZSB9IGZyb20gJy4vSVNoYXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBQbGFuZURlc2NyaXB0b3IgZXh0ZW5kcyBJQW55UHJpbWl0aXZlRGVzY3JpcHRvciB7XG4gIC8qKiB0aGUgbGVuZ3RoIG9mIFUoWCktYXhpcyBkaXJlY3Rpb24gKi9cbiAgd2lkdGg/OiBTaXplO1xuICAvKiogdGhlIGxlbmd0aCBvZiBWKFkpLWF4aXMgZGlyZWN0aW9uICovXG4gIGhlaWdodD86IFNpemU7XG4gIC8qKiBudW1iZXIgb2Ygc3BhbnMgaW4gVShYKS1heGlzIGRpcmVjdGlvbiAqL1xuICB1U3Bhbj86IFNpemU7XG4gIC8qKiBudW1iZXIgb2Ygc3BhbnMgaW4gVihZKS1heGlzIGRpcmVjdGlvbiAqL1xuICB2U3Bhbj86IFNpemU7XG4gIC8qKiBkcmF3IHVTcGFuIHRpbWVzIHZTcGFuIG51bWJlciBvZiB0ZXh0dXJlcyAqL1xuICBpc1VWUmVwZWF0PzogYm9vbGVhbjtcbiAgLyoqIGRyYXcgdGV4dHVyZXMgYnkgZmxpcHBpbmcgb24gdGhlIFYoWSktYXhpcyAqL1xuICBmbGlwVGV4dHVyZUNvb3JkaW5hdGVZPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQbGFuZSBjbGFzc1xuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFBsYW5lIGV4dGVuZHMgSVNoYXBlIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHBsYW5lIG9iamVjdFxuICAgKiBAcGFyYW0gX2Rlc2MgYSBkZXNjcmlwdG9yIG9iamVjdCBvZiBhIFBsYW5lXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoX2Rlc2M6IFBsYW5lRGVzY3JpcHRvcik6IHZvaWQge1xuICAgIGNvbnN0IGRlc2MgPSB7XG4gICAgICB3aWR0aDogX2Rlc2Mud2lkdGggPz8gMSxcbiAgICAgIGhlaWdodDogX2Rlc2MuaGVpZ2h0ID8/IDEsXG4gICAgICB1U3BhbjogX2Rlc2MudVNwYW4gPz8gMSxcbiAgICAgIHZTcGFuOiBfZGVzYy52U3BhbiA/PyAxLFxuICAgICAgaXNVVlJlcGVhdDogX2Rlc2MuaXNVVlJlcGVhdCA/PyBmYWxzZSxcbiAgICAgIGZsaXBUZXh0dXJlQ29vcmRpbmF0ZVk6IF9kZXNjLmZsaXBUZXh0dXJlQ29vcmRpbmF0ZVkgPz8gZmFsc2UsXG4gICAgICBtYXRlcmlhbDogX2Rlc2MubWF0ZXJpYWwsXG4gICAgfTtcblxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZGVzYy52U3BhbjsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBkZXNjLnVTcGFuOyBqKyspIHtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goKGogLyBkZXNjLnVTcGFuIC0gMSAvIDIpICogZGVzYy53aWR0aCk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKDApO1xuICAgICAgICBwb3NpdGlvbnMucHVzaCgoaSAvIGRlc2MudlNwYW4gLSAxIC8gMikgKiBkZXNjLmhlaWdodCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzYy52U3BhbjsgaSsrKSB7XG4gICAgICBsZXQgZGVnZW5lcmF0ZV9sZWZ0X2luZGV4ID0gMDtcbiAgICAgIGxldCBkZWdlbmVyYXRlX3JpZ2h0X2luZGV4ID0gMDtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGRlc2MudVNwYW47IGorKykge1xuICAgICAgICBpbmRpY2VzLnB1c2goaSAqIChkZXNjLnVTcGFuICsgMSkgKyBqKTtcbiAgICAgICAgaW5kaWNlcy5wdXNoKChpICsgMSkgKiAoZGVzYy51U3BhbiArIDEpICsgaik7XG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgZGVnZW5lcmF0ZV9sZWZ0X2luZGV4ID0gKGkgKyAxKSAqIChkZXNjLnVTcGFuICsgMSkgKyBqO1xuICAgICAgICB9IGVsc2UgaWYgKGogPT09IGRlc2MudVNwYW4pIHtcbiAgICAgICAgICBkZWdlbmVyYXRlX3JpZ2h0X2luZGV4ID0gKGkgKyAxKSAqIChkZXNjLnVTcGFuICsgMSkgKyBqO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmRpY2VzLnB1c2goZGVnZW5lcmF0ZV9yaWdodF9pbmRleCk7XG4gICAgICBpbmRpY2VzLnB1c2goZGVnZW5lcmF0ZV9sZWZ0X2luZGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZGVzYy52U3BhbjsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBkZXNjLnVTcGFuOyBqKyspIHtcbiAgICAgICAgbm9ybWFscy5wdXNoKDApO1xuICAgICAgICBub3JtYWxzLnB1c2goMSk7XG4gICAgICAgIG5vcm1hbHMucHVzaCgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0ZXhjb29yZHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkZXNjLnZTcGFuOyBpKyspIHtcbiAgICAgIGNvbnN0IGlfID0gZGVzYy5mbGlwVGV4dHVyZUNvb3JkaW5hdGVZID8gaSA6IGRlc2MudlNwYW4gLSBpO1xuXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBkZXNjLnVTcGFuOyBqKyspIHtcbiAgICAgICAgaWYgKGRlc2MuaXNVVlJlcGVhdCkge1xuICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKGopO1xuICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKGlfKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXhjb29yZHMucHVzaChqIC8gZGVzYy51U3Bhbik7XG4gICAgICAgICAgdGV4Y29vcmRzLnB1c2goaV8gLyBkZXNjLnZTcGFuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIFNpemVcbiAgICBjb25zdCBhdHRyaWJ1dGVTZW1hbnRpY3MgPSBbXG4gICAgICBWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaLFxuICAgICAgVmVydGV4QXR0cmlidXRlLk5vcm1hbC5YWVosXG4gICAgICBWZXJ0ZXhBdHRyaWJ1dGUuVGV4Y29vcmQwLlhZLFxuICAgIF07XG4gICAgY29uc3QgcHJpbWl0aXZlTW9kZSA9IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVTdHJpcDtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gW1xuICAgICAgbmV3IEZsb2F0MzJBcnJheShwb3NpdGlvbnMpLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheShub3JtYWxzKSxcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGV4Y29vcmRzKSxcbiAgICBdO1xuXG4gICAgdGhpcy5jb3B5VmVydGV4RGF0YSh7XG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgYXR0cmlidXRlU2VtYW50aWNzLFxuICAgICAgcHJpbWl0aXZlTW9kZSxcbiAgICAgIGluZGljZXM6IG5ldyBVaW50MTZBcnJheShpbmRpY2VzKSxcbiAgICAgIG1hdGVyaWFsOiBkZXNjPy5tYXRlcmlhbCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSUFueVByaW1pdGl2ZURlc2NyaXB0b3IsIFByaW1pdGl2ZSB9IGZyb20gJy4uL1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElTaGFwZSB9IGZyb20gJy4vSVNoYXBlJztcbmltcG9ydCB7IFBoeXNpY3NQcm9wZXJ0eSB9IGZyb20gJy4uLy4uL3BoeXNpY3MvUGh5c2ljc1Byb3BlcnR5JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL21pc2MvTG9nZ2VyJztcblxuLyoqXG4gKiBUaGUgYXJndW1lbnQgZGVzY3JpcHRvciBmb3IgUGxhbmUgcHJpbWl0aXZlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwaGVyZURlc2NyaXB0b3IgZXh0ZW5kcyBJQW55UHJpbWl0aXZlRGVzY3JpcHRvciB7XG4gIC8qKiByYWRpdXMgKi9cbiAgcmFkaXVzPzogbnVtYmVyO1xuICAvKiogdGhlIG51bWJlciBvZiBzZWdtZW50cyBmb3Igd2lkdGggZGlyZWN0aW9uICovXG4gIHdpZHRoU2VnbWVudHM/OiBDb3VudDtcbiAgLyoqIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgZm9yIGhlaWdodCBkaXJlY3Rpb24gKi9cbiAgaGVpZ2h0U2VnbWVudHM/OiBDb3VudDtcblxuICBwaHlzaWNzPzogUGh5c2ljc1Byb3BlcnR5O1xufVxuXG4vKipcbiAqIFNwaGVyZSBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgU3BoZXJlIGV4dGVuZHMgSVNoYXBlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdlbmVyYXRlKF9kZXNjOiBTcGhlcmVEZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgZGVzYyA9IHtcbiAgICAgIHJhZGl1czogX2Rlc2MucmFkaXVzID8/IDEsXG4gICAgICB3aWR0aFNlZ21lbnRzOiBfZGVzYy53aWR0aFNlZ21lbnRzID8/IDEwLFxuICAgICAgaGVpZ2h0U2VnbWVudHM6IF9kZXNjLmhlaWdodFNlZ21lbnRzID8/IDEwLFxuICAgICAgbWF0ZXJpYWw6IF9kZXNjLm1hdGVyaWFsLFxuICAgIH07XG4gICAgY29uc3QgcG9zaXRpb25zID0gW107XG4gICAgY29uc3QgdGV4Y29vcmRzID0gW107XG4gICAgY29uc3Qgbm9ybWFscyA9IFtdO1xuXG4gICAgaWYgKE1hdGguYWJzKGRlc2MucmFkaXVzKSA8IE51bWJlci5FUFNJTE9OKSB7XG4gICAgICBMb2dnZXIud2FybihcbiAgICAgICAgJ1RoZSBhcmd1bWVudCByYWRpdXMgaXMgemVybyAvIG5lYXJseSB6ZXJvLiBSbiB3aWxsIHRha2UgdGhlIHJhZGl1cyBhcyAwLjAwMSBmb3Igc2FmZXR5LiBDaGVjayB5b3VyIGNvZGUuJ1xuICAgICAgKTtcbiAgICAgIGRlc2MucmFkaXVzID0gMC4wMDE7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hpZnRWYWx1ZSA9IDAuMDAwMDE7IC8vIGZvciBhdm9pZCBTaW5ndWxhciBwb2ludFxuICAgIGZvciAobGV0IGxhdE51bWJlciA9IDA7IGxhdE51bWJlciA8PSBkZXNjLmhlaWdodFNlZ21lbnRzOyBsYXROdW1iZXIrKykge1xuICAgICAgY29uc3QgdGhldGEgPSAobGF0TnVtYmVyICogTWF0aC5QSSkgLyBkZXNjLmhlaWdodFNlZ21lbnRzICsgc2hpZnRWYWx1ZTtcbiAgICAgIGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4odGhldGEpO1xuICAgICAgY29uc3QgY29zVGhldGEgPSBNYXRoLmNvcyh0aGV0YSk7XG5cbiAgICAgIGZvciAobGV0IGxvbmdOdW1iZXIgPSAwOyBsb25nTnVtYmVyIDw9IGRlc2Mud2lkdGhTZWdtZW50czsgbG9uZ051bWJlcisrKSB7XG4gICAgICAgIGNvbnN0IHBoaSA9IChsb25nTnVtYmVyICogMiAqIE1hdGguUEkpIC8gZGVzYy53aWR0aFNlZ21lbnRzO1xuICAgICAgICBjb25zdCBzaW5QaGkgPSBNYXRoLnNpbihwaGkpO1xuICAgICAgICBjb25zdCBjb3NQaGkgPSBNYXRoLmNvcyhwaGkpO1xuXG4gICAgICAgIGNvbnN0IHggPSBkZXNjLnJhZGl1cyAqIGNvc1BoaSAqIHNpblRoZXRhO1xuICAgICAgICBjb25zdCB5ID0gZGVzYy5yYWRpdXMgKiBjb3NUaGV0YTtcbiAgICAgICAgY29uc3QgeiA9IGRlc2MucmFkaXVzICogc2luUGhpICogc2luVGhldGE7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFt4LCB5LCB6XSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHgpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaCh5KTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goeik7XG4gICAgICAgIGNvbnN0IHUgPSAxIC0gbG9uZ051bWJlciAvIGRlc2Mud2lkdGhTZWdtZW50cztcbiAgICAgICAgY29uc3QgdiA9IGxhdE51bWJlciAvIGRlc2MuaGVpZ2h0U2VnbWVudHM7XG4gICAgICAgIHRleGNvb3Jkcy5wdXNoKHUpO1xuICAgICAgICB0ZXhjb29yZHMucHVzaCh2KTtcbiAgICAgICAgY29uc3Qgbm9ybWFsID0gVmVjdG9yMy5ub3JtYWxpemUocG9zaXRpb24pO1xuICAgICAgICBub3JtYWxzLnB1c2gobm9ybWFsLngpO1xuICAgICAgICBub3JtYWxzLnB1c2gobm9ybWFsLnkpO1xuICAgICAgICBub3JtYWxzLnB1c2gobm9ybWFsLnopO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpcnN0ICAgIGZpcnN0KzFcbiAgICAvLyAgICArLS0tLS0tLStcbiAgICAvLyAgICB8ICAgICAvIHxcbiAgICAvLyAgICB8ICAgLyAgIHxcbiAgICAvLyAgICB8IC8gICAgIHxcbiAgICAvLyAgICArLS0tLS0tLStcbiAgICAvLyBzZWNvbmQgICBzZWNvbmQrMVxuICAgIC8vXG4gICAgY29uc3QgaW5kaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGxhdE51bWJlciA9IDA7IGxhdE51bWJlciA8IGRlc2MuaGVpZ2h0U2VnbWVudHM7IGxhdE51bWJlcisrKSB7XG4gICAgICBmb3IgKGxldCBsb25nTnVtYmVyID0gMDsgbG9uZ051bWJlciA8IGRlc2Mud2lkdGhTZWdtZW50czsgbG9uZ051bWJlcisrKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gbGF0TnVtYmVyICogKGRlc2Mud2lkdGhTZWdtZW50cyArIDEpICsgbG9uZ051bWJlcjtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gZmlyc3QgKyBkZXNjLndpZHRoU2VnbWVudHMgKyAxO1xuXG4gICAgICAgIGluZGljZXMucHVzaChmaXJzdCArIDEpO1xuICAgICAgICBpbmRpY2VzLnB1c2goc2Vjb25kKTtcbiAgICAgICAgaW5kaWNlcy5wdXNoKGZpcnN0KTtcblxuICAgICAgICBpbmRpY2VzLnB1c2goZmlyc3QgKyAxKTtcbiAgICAgICAgaW5kaWNlcy5wdXNoKHNlY29uZCArIDEpO1xuICAgICAgICBpbmRpY2VzLnB1c2goc2Vjb25kKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVTZW1hbnRpY3MgPSBbXG4gICAgICBWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaLFxuICAgICAgVmVydGV4QXR0cmlidXRlLk5vcm1hbC5YWVosXG4gICAgICBWZXJ0ZXhBdHRyaWJ1dGUuVGV4Y29vcmQwLlhZLFxuICAgIF07XG4gICAgY29uc3QgcHJpbWl0aXZlTW9kZSA9IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVzO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucyksXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KG5vcm1hbHMpLFxuICAgICAgbmV3IEZsb2F0MzJBcnJheSh0ZXhjb29yZHMpLFxuICAgIF07XG5cbiAgICB0aGlzLmNvcHlWZXJ0ZXhEYXRhKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBhdHRyaWJ1dGVTZW1hbnRpY3MsXG4gICAgICBwcmltaXRpdmVNb2RlLFxuICAgICAgaW5kaWNlczogbmV3IFVpbnQxNkFycmF5KGluZGljZXMpLFxuICAgICAgbWF0ZXJpYWw6IGRlc2MubWF0ZXJpYWwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQXhpcyc7XG5leHBvcnQgKiBmcm9tICcuL0N1YmUnO1xuZXhwb3J0ICogZnJvbSAnLi9HcmlkJztcbmV4cG9ydCAqIGZyb20gJy4vSVNoYXBlJztcbmV4cG9ydCAqIGZyb20gJy4vSm9pbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9MaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vUGxhbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9TcGhlcmUnO1xuIiwiaW1wb3J0IHsgTWVzaENvbXBvbmVudCwgUHJpbWl0aXZlIH0gZnJvbSAnLi4vLi4vLi4nO1xuaW1wb3J0IHsgTWVzaFVJRCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9JVmVjdG9yJztcblxuZXhwb3J0IGludGVyZmFjZSBSYXljYXN0UmVzdWx0IHtcbiAgcmVzdWx0OiBib29sZWFuO1xuICBkYXRhPzoge1xuICAgIHQ6IG51bWJlcjsgLy8gdCBtdXN0IGJlIHNldCB2YWxpZCB2YWx1ZSBpZiByZXN1bHQgaXMgdHJ1ZVxuICAgIHU6IG51bWJlcjsgLy8gaW50ZXJzZWN0ZWQgcG9zaXRpb24gaW4gdGhlIHRyaWFuZ2xlXG4gICAgdjogbnVtYmVyOyAvLyBpbnRlcnNlY3RlZCBwb3NpdGlvbiBpbiB0aGUgdHJpYW5nbGVcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXljYXN0UmVzdWx0RXgxIHtcbiAgcmVzdWx0OiBib29sZWFuO1xuICBkYXRhPzoge1xuICAgIHQ6IG51bWJlcjsgLy8gdCBtdXN0IGJlIHNldCB2YWxpZCB2YWx1ZSBpZiByZXN1bHQgaXMgdHJ1ZVxuICAgIHU6IG51bWJlcjsgLy8gaW50ZXJzZWN0ZWQgcG9zaXRpb24gaW4gdGhlIHRyaWFuZ2xlXG4gICAgdjogbnVtYmVyOyAvLyBpbnRlcnNlY3RlZCBwb3NpdGlvbiBpbiB0aGUgdHJpYW5nbGVcbiAgICBwb3NpdGlvbjogSVZlY3RvcjM7IC8vIHBvc2l0aW9uIG11c3QgYmUgc2V0IHZhbGlkIHZhbHVlIGlmIHJlc3VsdCBpcyB0cnVlXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF5Y2FzdFJlc3VsdEV4MiB7XG4gIHJlc3VsdDogYm9vbGVhbjtcbiAgZGF0YT86IHtcbiAgICB0OiBudW1iZXI7IC8vIHQgbXVzdCBiZSBzZXQgdmFsaWQgdmFsdWUgaWYgcmVzdWx0IGlzIHRydWVcbiAgICB1OiBudW1iZXI7IC8vIGludGVyc2VjdGVkIHBvc2l0aW9uIGluIHRoZSB0cmlhbmdsZVxuICAgIHY6IG51bWJlcjsgLy8gaW50ZXJzZWN0ZWQgcG9zaXRpb24gaW4gdGhlIHRyaWFuZ2xlXG4gICAgcG9zaXRpb246IElWZWN0b3IzOyAvLyBwb3NpdGlvbiBtdXN0IGJlIHNldCB2YWxpZCB2YWx1ZSBpZiByZXN1bHQgaXMgdHJ1ZVxuICAgIHNlbGVjdGVkTWVzaENvbXBvbmVudDogTWVzaENvbXBvbmVudDtcbiAgfTtcbn1cblxuLyoqXG4gKiBTZWU6IGh0dHA6Ly9yZWFsdGltZWNvbGxpc2lvbmRldGVjdGlvbi5uZXQvYmxvZy8/cD04NlxuICpcbiAqIEJpdCBGaWVsZFxuICogLS0tIDBcbiAqICAzIGJpdHM6IFByaW1pdGl2ZSBUeXBlICgwOiBQT0lOVFMsIDE6IExJTkVTLCAyOiBMSU5FX0xPT1AsIDM6IExJTkVfU1RSSVAsIDQ6IFRSSUFOR0xFUywgNTogVFJJQU5HTEVfU1RSSVAsIDY6IFRSSUFOR0xFX0ZBTilcbiAqIDEwIGJpdHM6IE1hdGVyaWFsIFRJRFxuICogIDIgYml0czogVHJhbnNsdWNlbmN5IHR5cGUgKDA6IE9wYXF1ZSwgMTogVHJhbnNsdWNlbnQoZHJhdyBhZnRlciBvcGFxdWUpLCAyOiBCbGVuZChkcmF3IGFmdGVyIHRyYW5zbHVjZW50KSApXG4gKiAgMyBiaXRzOiBWaWV3cG9ydCBsYXllclxuICogIDMgYml0czogVmlld3BvcnRcbiAqICAyIGJpdHM6IEZ1bGxzY3JlZW4gbGF5ZXJcbiAqIC0tLSAzMVxuICpcbiAqIERlcHRoIEZpZWxkXG4gKiAzMiBiaXRzOiBEZXB0aFxuICovXG5leHBvcnQgdHlwZSBQcmltaXRpdmVTb3J0S2V5ID0gbnVtYmVyO1xuZXhwb3J0IGNvbnN0IFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX1RyYW5zbHVjZW5jeVR5cGUgPSAyO1xuZXhwb3J0IGNvbnN0IFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX01hdGVyaWFsID0gMTA7XG5leHBvcnQgY29uc3QgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfUHJpbWl0aXZlVHlwZSA9IDM7XG5cbmV4cG9ydCBjb25zdCBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9QcmltaXRpdmVUeXBlID0gMDtcbmV4cG9ydCBjb25zdCBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9NYXRlcmlhbCA9IFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX1ByaW1pdGl2ZVR5cGU7XG5leHBvcnQgY29uc3QgUHJpbWl0aXZlU29ydEtleV9CaXRPZmZzZXRfVHJhbnNsdWNlbmN5VHlwZSA9XG4gIFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX1ByaW1pdGl2ZVR5cGUgKyBQcmltaXRpdmVTb3J0S2V5X0JpdExlbmd0aF9NYXRlcmlhbDtcbmV4cG9ydCBjb25zdCBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9WaWV3cG9ydExheWVyID1cbiAgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfUHJpbWl0aXZlVHlwZSArXG4gIFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX01hdGVyaWFsICtcbiAgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfVHJhbnNsdWNlbmN5VHlwZTtcblxuZXhwb3J0IHR5cGUgUHJpbWl0aXZlU29ydEtleUxlbmd0aCA9XG4gIHwgdHlwZW9mIFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX01hdGVyaWFsXG4gIHwgdHlwZW9mIFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX1RyYW5zbHVjZW5jeVR5cGVcbiAgfCB0eXBlb2YgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfUHJpbWl0aXZlVHlwZTtcbmV4cG9ydCB0eXBlIFByaW1pdGl2ZVNvcnRLZXlPZmZzZXQgPVxuICB8IHR5cGVvZiBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9NYXRlcmlhbFxuICB8IHR5cGVvZiBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9UcmFuc2x1Y2VuY3lUeXBlXG4gIHwgdHlwZW9mIFByaW1pdGl2ZVNvcnRLZXlfQml0T2Zmc2V0X1ZpZXdwb3J0TGF5ZXI7XG5cbmV4cG9ydCBjb25zdCBQcmltaXRpdmVTb3J0S2V5X0JpdExlbmd0aF9EZXB0aCA9IDMyO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNoIHtcbiAgbWVzaFVJRDogTWVzaFVJRDtcbn1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNsdWNlbnQocHJpbWl0aXZlOiBQcmltaXRpdmUpIHtcbi8vICAgcmV0dXJuIHByaW1pdGl2ZS5fc29ydGtleSAmIDBiMDAwMDAwMDBfMDAwMDAwMDBfMDAwMDAwMDBfMDAwMDAwMDE7XG4vLyB9XG5mdW5jdGlvbiByZWFkQml0cyhcbiAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gIG9mZnNldDogUHJpbWl0aXZlU29ydEtleU9mZnNldCxcbiAgbGVuZ3RoOiBQcmltaXRpdmVTb3J0S2V5TGVuZ3RoXG4pIHtcbiAgLy8gQ3JlYXRlcyBhIG1hc2sgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBsZW5ndGhcbiAgbGV0IG1hc2sgPSAoMSA8PCBsZW5ndGgpIC0gMTtcbiAgLy8gUmVhZCBkYXRhIGZyb20gYSBzcGVjaWZpZWQgb2Zmc2V0XG4gIHJldHVybiAocHJpbWl0aXZlLl9zb3J0a2V5ID4+IG9mZnNldCkgJiBtYXNrO1xufVxuXG4vLyBjb25zdCB0cmFuc2x1Y2VuY3lCaXRPZmZzZXQgPSBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9UcmFuc2x1Y2VuY3lUeXBlICsgMTtcbi8vIGV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zbHVjZW50KHByaW1pdGl2ZTogUHJpbWl0aXZlKSB7XG4vLyAgIHJldHVybiAocHJpbWl0aXZlLl9zb3J0a2V5ID4+IHRyYW5zbHVjZW5jeUJpdE9mZnNldCkgJiAxO1xuLy8gfVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCbGVuZChwcmltaXRpdmU6IFByaW1pdGl2ZSkge1xuICByZXR1cm4gKFxuICAgIHJlYWRCaXRzKFxuICAgICAgcHJpbWl0aXZlLFxuICAgICAgUHJpbWl0aXZlU29ydEtleV9CaXRPZmZzZXRfVHJhbnNsdWNlbmN5VHlwZSxcbiAgICAgIFByaW1pdGl2ZVNvcnRLZXlfQml0TGVuZ3RoX1RyYW5zbHVjZW5jeVR5cGVcbiAgICApID09PSAyIC8vIGJsZW5kXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zbHVjZW50KHByaW1pdGl2ZTogUHJpbWl0aXZlKSB7XG4gIHJldHVybiAoXG4gICAgcmVhZEJpdHMoXG4gICAgICBwcmltaXRpdmUsXG4gICAgICBQcmltaXRpdmVTb3J0S2V5X0JpdE9mZnNldF9UcmFuc2x1Y2VuY3lUeXBlLFxuICAgICAgUHJpbWl0aXZlU29ydEtleV9CaXRMZW5ndGhfVHJhbnNsdWNlbmN5VHlwZVxuICAgICkgPT09IDEgLy8gdHJhbnNsdWNlbnRcbiAgKTtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vR2VvbWV0cnlUeXBlcyc7XG4iLCJpbXBvcnQgeyBHaXptbyB9IGZyb20gJy4vR2l6bW8nO1xuaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2dlb21ldHJ5L1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IGNyZWF0ZU1lc2hFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9jcmVhdGVNZXNoRW50aXR5JztcblxuLyoqXG4gKiBBQUJCIEdpem1vIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBBQUJCR2l6bW8gZXh0ZW5kcyBHaXptbyB7XG4gIHByaXZhdGUgc3RhdGljIF9fbWVzaD86IE1lc2g7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB3aGljaCB0aGlzIGdpem1vIGJlbG9uZyB0b1xuICAgKi9cbiAgY29uc3RydWN0b3IodGFyZ2V0OiBJU2NlbmVHcmFwaEVudGl0eSkge1xuICAgIHN1cGVyKHRhcmdldCk7XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBBY2Nlc3NvcnNcbiAgLy8vXG4gIC8vL1xuXG4gIGdldCBpc1NldHVwKCkge1xuICAgIGlmICh0aGlzLl9fdG9wRW50aXR5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8vXG4gIC8vL1xuICAvLy8gRnJpZW5kcyBNZW1iZXJzXG4gIC8vL1xuICAvLy9cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIHNldHVwIGVudGl0aWVzIG9mIEdpem1vIGlmIG5vdCBkb25lIHlldFxuICAgKi9cbiAgX3NldHVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9fdG9Ta2lwU2V0dXAoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX190b3BFbnRpdHkgPSBjcmVhdGVNZXNoRW50aXR5KCk7XG4gICAgdGhpcy5fX3RvcEVudGl0eSEudHJ5VG9TZXRVbmlxdWVOYW1lKGBBQUJCR2l6bW9fb2ZfJHt0aGlzLl9fdGFyZ2V0LnVuaXF1ZU5hbWV9YCwgdHJ1ZSk7XG4gICAgdGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpIS50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4ID0gdHJ1ZTtcbiAgICB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKSEuX2FkZEdpem1vQ2hpbGQodGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpISk7XG5cbiAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gdGhpcy5fX3RvcEVudGl0eSEudHJ5VG9HZXRNZXNoKCkhO1xuICAgIEFBQkJHaXptby5fX21lc2ggPSBuZXcgTWVzaCgpO1xuICAgIEFBQkJHaXptby5fX21lc2guYWRkUHJpbWl0aXZlKEFBQkJHaXptby5nZW5lcmF0ZVByaW1pdGl2ZSgpKTtcbiAgICBtZXNoQ29tcG9uZW50LnNldE1lc2goQUFCQkdpem1vLl9fbWVzaCk7XG5cbiAgICB0aGlzLnNldEdpem1vVGFnKCk7XG4gIH1cblxuICAvKipcbiAgICogZ2VuZXJhdGUgdGhlIHByaW1pdGl2ZSBvZiB0aGUgZ2l6bW9cbiAgICogQHJldHVybnMgYSBwcmltaXRpdmUgb2YgdGhlIGdpem1vXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVByaW1pdGl2ZSgpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAgIC8vIFhZIFBsYW5lIG9uIC1aXG4gICAgICAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLFxuXG4gICAgICAvLyBYWSBQbGFuZSBvbiArWlxuICAgICAgNCwgNSwgNSwgNiwgNiwgNywgNywgNCxcblxuICAgICAgLy8gWVogUGxhbmUgb24gLVhcbiAgICAgIDAsIDMsIDMsIDcsIDcsIDQsIDQsIDAsXG5cbiAgICAgIC8vIFlaIFBsYW5lIG9uICtYXG4gICAgICAxLCAyLCAyLCA2LCA2LCA1LCA1LCAxLFxuXG4gICAgICAvLyBYWiBQbGFuZSBvbiAtWVxuICAgICAgMCwgMSwgMSwgNSwgNSwgNCwgNCwgMCxcblxuICAgICAgLy8gWFogUGxhbmUgb24gK1lcbiAgICAgIDMsIDIsIDIsIDYsIDYsIDcsIDcsIDMsXG4gICAgXSk7XG5cbiAgICBjb25zdCBsZW5ndGggPSAxO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgLy8vIC1aXG4gICAgICAvLyAwXG4gICAgICAtbGVuZ3RoLFxuICAgICAgLWxlbmd0aCxcbiAgICAgIC1sZW5ndGgsXG5cbiAgICAgIC8vIDFcbiAgICAgIGxlbmd0aCxcbiAgICAgIC1sZW5ndGgsXG4gICAgICAtbGVuZ3RoLFxuXG4gICAgICAvLyAyXG4gICAgICBsZW5ndGgsXG4gICAgICBsZW5ndGgsXG4gICAgICAtbGVuZ3RoLFxuXG4gICAgICAvLyAzXG4gICAgICAtbGVuZ3RoLFxuICAgICAgbGVuZ3RoLFxuICAgICAgLWxlbmd0aCxcblxuICAgICAgLy8vICtaXG4gICAgICAvLyA0XG4gICAgICAtbGVuZ3RoLFxuICAgICAgLWxlbmd0aCxcbiAgICAgIGxlbmd0aCxcblxuICAgICAgLy8gNVxuICAgICAgbGVuZ3RoLFxuICAgICAgLWxlbmd0aCxcbiAgICAgIGxlbmd0aCxcblxuICAgICAgLy8gNlxuICAgICAgbGVuZ3RoLFxuICAgICAgbGVuZ3RoLFxuICAgICAgbGVuZ3RoLFxuXG4gICAgICAvLyA3XG4gICAgICAtbGVuZ3RoLFxuICAgICAgbGVuZ3RoLFxuICAgICAgbGVuZ3RoLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcHJpbWl0aXZlID0gUHJpbWl0aXZlLmNyZWF0ZVByaW1pdGl2ZSh7XG4gICAgICBpbmRpY2VzOiBpbmRpY2VzLFxuICAgICAgYXR0cmlidXRlU2VtYW50aWNzOiBbVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWl0sXG4gICAgICBhdHRyaWJ1dGVzOiBbcG9zaXRpb25zXSxcbiAgICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGUuTGluZXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB1cGRhdGUgdGhlIHRyYW5zZm9ybSBhbmQgZXRjIG9mIHRoZSBnaXptb1xuICAgKi9cbiAgX3VwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX3RvcEVudGl0eSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNnID0gdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkhO1xuICAgIGNvbnN0IGFhYmIgPSBzZy53b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWw7XG4gICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxQb3NpdGlvbiA9IGFhYmIuY2VudGVyUG9pbnQ7XG4gICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxTY2FsZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbXG4gICAgICBhYWJiLnNpemVYIC8gMixcbiAgICAgIGFhYmIuc2l6ZVkgLyAyLFxuICAgICAgYWFiYi5zaXplWiAvIDIsXG4gICAgXSk7XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3RvcEVudGl0eSkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuX2Rlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBTY2VuZUdyYXBoQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHksIElNZXNoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgZmxhdHRlbkhpZXJhcmNoeSB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoT3BzJztcblxuLyoqXG4gKiBBYnN0cmFjdCBHaXptbyBjbGFzc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2l6bW8gZXh0ZW5kcyBSbk9iamVjdCB7XG4gIC8qKlxuICAgKiBUaGUgdG9wIGVudGl0eSBvZiB0aGlzIGdpem1vIGdyb3VwLlxuICAgKiBBIHByb2dyYW1tZXIgd2hvIGltcGxlbWVudHMgYSBnaXptbyBjbGFzcyBoYXMgdG8gbWFrZSB0aGlzIGVudGl0eVxuICAgKiBhIGNoaWxkIG9mIHRoZSB0YXJnZXQgZW50aXR5J3Mgc2NlbmUgZ3JhcGggY29tcG9uZW50XG4gICAqIHRoYXQgdGhlIGdpem1vIHdpbGwgYmVsb25nIHRvIG1hbnVhbGx5LlxuICAgKi9cbiAgcHJvdGVjdGVkIF9fdG9wRW50aXR5PzogSU1lc2hFbnRpdHkgfCBJU2NlbmVHcmFwaEVudGl0eTtcbiAgLyoqIHRoZSB0YXJnZXQgZW50aXR5IHdoaWNoIHRoaXMgZ2l6bW8gYmVsb25nIHRvICovXG4gIHByb3RlY3RlZCBfX3RhcmdldDogSVNjZW5lR3JhcGhFbnRpdHk7XG5cbiAgcHJvdGVjdGVkIF9faXNWaXNpYmxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBlbnRpdHkgdGhlIG9iamVjdCB3aGljaCB0aGlzIGdpem1vIGJlbG9uZyB0b1xuICAgKi9cbiAgY29uc3RydWN0b3IodGFyZ2V0OiBJU2NlbmVHcmFwaEVudGl0eSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX3RhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLnNldEdpem1vVGFnKCk7XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBBY2Nlc3NvcnNcbiAgLy8vXG4gIC8vL1xuXG4gIHNldCBpc1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgdGhpcy5fX3NldFZpc2libGUoZmxnKTtcbiAgfVxuXG4gIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1Zpc2libGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX19zZXRWaXNpYmxlKGZsZzogYm9vbGVhbikge1xuICAgIHRoaXMuX19pc1Zpc2libGUgPSBmbGc7XG4gICAgaWYgKHRoaXMuX190b3BFbnRpdHkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpIS5zZXRWaXNpYmlsaXR5UmVjdXJzaXZlbHkoZmxnKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBpc1NldHVwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogc2V0dXAgZW50aXRpZXMgb2YgR2l6bW8gaWYgbm90IGRvbmUgeWV0XG4gICAqL1xuICBhYnN0cmFjdCBfc2V0dXAoKTogdm9pZDtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIHVwZGF0ZSB0aGUgdHJhbnNmb3JtIGFuZCBldGMgb2YgdGhlIGdpem1vXG4gICAqL1xuICBhYnN0cmFjdCBfdXBkYXRlKCk6IHZvaWQ7XG5cbiAgYWJzdHJhY3QgX2Rlc3Ryb3koKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgX190b1NraXBTZXR1cCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1NldHVwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX190YXJnZXQubWF0Y2hUYWcoJ0JlaW5nJywgJ2dpem1vJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0R2l6bW9UYWcoKSB7XG4gICAgaWYgKHRoaXMuX190b3BFbnRpdHkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkudHJ5VG9TZXRUYWcoeyB0YWc6ICdCZWluZycsIHZhbHVlOiAnZ2l6bW8nIH0pO1xuICAgICAgdGhpcy5fX3RvcEVudGl0eS50cnlUb1NldFRhZyh7IHRhZzogJ0dpem1vJywgdmFsdWU6ICd0b3AnIH0pO1xuXG4gICAgICBjb25zdCBzY2VuZUdyYXBocyA9IGZsYXR0ZW5IaWVyYXJjaHkodGhpcy5fX3RvcEVudGl0eS5nZXRTY2VuZUdyYXBoKCkhLCBmYWxzZSk7XG4gICAgICBmb3IgKGNvbnN0IHNnIG9mIHNjZW5lR3JhcGhzKSB7XG4gICAgICAgIHNnLmVudGl0eS50cnlUb1NldFRhZyh7IHRhZzogJ0JlaW5nJywgdmFsdWU6ICdnaXptbycgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX190b3BFbnRpdHkudHJ5VG9TZXRUYWcoe1xuICAgICAgICB0YWc6ICd0eXBlJyxcbiAgICAgICAgdmFsdWU6ICdiYWNrZ3JvdW5kLWFzc2V0cycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZU1lc2hFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9jcmVhdGVNZXNoRW50aXR5JztcbmltcG9ydCB7IFByaW1pdGl2ZU1vZGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QcmltaXRpdmVNb2RlJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vZ2VvbWV0cnkvTWVzaCc7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tICcuLi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgSU1lc2hFbnRpdHksIElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgR2l6bW8gfSBmcm9tICcuL0dpem1vJztcblxuZXhwb3J0IGNsYXNzIExpZ2h0R2l6bW8gZXh0ZW5kcyBHaXptbyB7XG4gIHByaXZhdGUgc3RhdGljIF9fbWVzaDogTWVzaDtcbiAgcHJpdmF0ZSBzdGF0aWMgX19sZW5ndGggPSAxO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBnaXptbyBiZWxvbmcgdG9cbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBzdXBlcih0YXJnZXQpO1xuICB9XG5cbiAgLy8vXG4gIC8vL1xuICAvLy8gQWNjZXNzb3JzXG4gIC8vL1xuICAvLy9cblxuICBnZXQgaXNTZXR1cCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fX3RvcEVudGl0eSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIEZyaWVuZHMgTWVtYmVyc1xuICAvLy9cbiAgLy8vXG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBzZXR1cCBlbnRpdGllcyBvZiBHaXptbyBpZiBub3QgZG9uZSB5ZXRcbiAgICovXG4gIF9zZXR1cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX3RvU2tpcFNldHVwKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9fdG9wRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgIHRoaXMuX190b3BFbnRpdHkudHJ5VG9TZXRVbmlxdWVOYW1lKGBMaWdodEdpem1vX29mXyR7dGhpcy5fX3RhcmdldC51bmlxdWVOYW1lfWAsIHRydWUpO1xuICAgIHRoaXMuX190b3BFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpIS50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4ID0gdHJ1ZTtcbiAgICB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKS5fYWRkR2l6bW9DaGlsZCh0aGlzLl9fdG9wRW50aXR5IS5nZXRTY2VuZUdyYXBoKCkpO1xuXG4gICAgY29uc3QgbWVzaENvbXBvbmVudCA9IHRoaXMuX190b3BFbnRpdHkhLnRyeVRvR2V0TWVzaCgpITtcbiAgICBMaWdodEdpem1vLl9fbWVzaCA9IG5ldyBNZXNoKCk7XG4gICAgTGlnaHRHaXptby5fX21lc2guYWRkUHJpbWl0aXZlKExpZ2h0R2l6bW8uX19nZW5lcmF0ZVByaW1pdGl2ZSgpKTtcbiAgICBtZXNoQ29tcG9uZW50LnNldE1lc2goTGlnaHRHaXptby5fX21lc2gpO1xuXG4gICAgdGhpcy5zZXRHaXptb1RhZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB1cGRhdGUgdGhlIHRyYW5zZm9ybSBhbmQgZXRjIG9mIHRoZSBnaXptb1xuICAgKi9cbiAgX3VwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX3RvcEVudGl0eSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2cgPSB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKSE7XG4gICAgY29uc3QgYWFiYiA9IHNnLndvcmxkTWVyZ2VkQUFCQldpdGhTa2VsZXRhbDtcbiAgICBpZiAoYWFiYi5pc1ZhbmlsbGEoKSkge1xuICAgICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxQb3NpdGlvbiA9IHNnLnBvc2l0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdG9wRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbFBvc2l0aW9uID0gYWFiYi5jZW50ZXJQb2ludDtcbiAgICB9XG4gICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxSb3RhdGlvbiA9IHNnLnJvdGF0aW9uO1xuXG4gICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxTY2FsZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbXG4gICAgICBNYXRoLm1heCgxLCBhYWJiLmlzVmFuaWxsYSgpID8gMSA6IGFhYmIuc2l6ZVggLyAyKSxcbiAgICAgIE1hdGgubWF4KDEsIGFhYmIuaXNWYW5pbGxhKCkgPyAxIDogYWFiYi5zaXplWSAvIDIpLFxuICAgICAgTWF0aC5tYXgoMSwgYWFiYi5pc1ZhbmlsbGEoKSA/IDEgOiBhYWJiLnNpemVaIC8gMiksXG4gICAgXSk7XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3RvcEVudGl0eSkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuX2Rlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBQcml2YXRlIFN0YXRpYyBNZW1iZXJzXG4gIC8vL1xuICAvLy9cblxuICBwcml2YXRlIHN0YXRpYyBfX2dlbmVyYXRlUHJpbWl0aXZlKCk6IFByaW1pdGl2ZSB7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAvLyBaIGF4aXNcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLXRoaXMuX19sZW5ndGgsXG5cbiAgICAgIC8vIEFycm93XG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC10aGlzLl9fbGVuZ3RoLFxuICAgICAgLTAuMSxcbiAgICAgIDAsXG4gICAgICAtdGhpcy5fX2xlbmd0aCArIDAuMixcblxuICAgICAgLy8gQXJyb3cgZW5kXG4gICAgICAtMC4xLFxuICAgICAgMCxcbiAgICAgIC10aGlzLl9fbGVuZ3RoICsgMC4yLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAtdGhpcy5fX2xlbmd0aCArIDAuMixcbiAgICBdKTtcblxuICAgIGNvbnN0IHByaW1pdGl2ZSA9IFByaW1pdGl2ZS5jcmVhdGVQcmltaXRpdmUoe1xuICAgICAgYXR0cmlidXRlU2VtYW50aWNzOiBbVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWl0sXG4gICAgICBhdHRyaWJ1dGVzOiBbcG9zaXRpb25zXSxcbiAgICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGUuTGluZXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVNZXNoRW50aXR5IH0gZnJvbSAnLi4vY29tcG9uZW50cy9NZXNoUmVuZGVyZXIvY3JlYXRlTWVzaEVudGl0eSc7XG5pbXBvcnQgeyBQcmltaXRpdmVNb2RlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJpbWl0aXZlTW9kZSc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL2dlb21ldHJ5L01lc2gnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IElNZXNoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgR2l6bW8gfSBmcm9tICcuL0dpem1vJztcblxuLyoqXG4gKiBMb2NhdG9yIEdpem1vIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhdG9yR2l6bW8gZXh0ZW5kcyBHaXptbyB7XG4gIHByaXZhdGUgc3RhdGljIF9fbWVzaDogTWVzaDtcbiAgcHJpdmF0ZSBzdGF0aWMgX19sZW5ndGggPSAxO1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgZ2l6bW8gYmVsb25nIHRvXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IElNZXNoRW50aXR5KSB7XG4gICAgc3VwZXIodGFyZ2V0KTtcbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIEFjY2Vzc29yc1xuICAvLy9cbiAgLy8vXG5cbiAgZ2V0IGlzU2V0dXAoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX190b3BFbnRpdHkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZXQgbGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgTG9jYXRvckdpem1vLl9fbGVuZ3RoID0gdmFsO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiBMb2NhdG9yR2l6bW8uX19sZW5ndGg7XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBGcmllbmRzIE1lbWJlcnNcbiAgLy8vXG4gIC8vL1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogc2V0dXAgZW50aXRpZXMgb2YgR2l6bW8gaWYgbm90IGRvbmUgeWV0XG4gICAqL1xuICBfc2V0dXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX190b1NraXBTZXR1cCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fX3RvcEVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICB0aGlzLl9fdG9wRW50aXR5IS50cnlUb1NldFVuaXF1ZU5hbWUoYExvY2F0b3JHaXptb19vZl8ke3RoaXMuX190YXJnZXQudW5pcXVlTmFtZX1gLCB0cnVlKTtcbiAgICB0aGlzLl9fdG9wRW50aXR5IS5nZXRTY2VuZUdyYXBoKCkhLnRvTWFrZVdvcmxkTWF0cml4VGhlU2FtZUFzTG9jYWxNYXRyaXggPSB0cnVlO1xuICAgIHRoaXMuX190YXJnZXQuZ2V0U2NlbmVHcmFwaCgpLl9hZGRHaXptb0NoaWxkKHRoaXMuX190b3BFbnRpdHkhLmdldFNjZW5lR3JhcGgoKSk7XG5cbiAgICBjb25zdCBzY2VuZUdyYXBoQ29tcG9uZW50ID0gdGhpcy5fX3RvcEVudGl0eSEudHJ5VG9HZXRNZXNoKCkhO1xuICAgIExvY2F0b3JHaXptby5fX21lc2ggPSBuZXcgTWVzaCgpO1xuICAgIExvY2F0b3JHaXptby5fX21lc2guYWRkUHJpbWl0aXZlKExvY2F0b3JHaXptby5fX2dlbmVyYXRlUHJpbWl0aXZlKCkpO1xuICAgIHNjZW5lR3JhcGhDb21wb25lbnQuc2V0TWVzaChMb2NhdG9yR2l6bW8uX19tZXNoKTtcblxuICAgIHRoaXMuc2V0R2l6bW9UYWcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogdXBkYXRlIHRoZSB0cmFuc2Zvcm0gYW5kIGV0YyBvZiB0aGUgZ2l6bW9cbiAgICovXG4gIF91cGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX190b3BFbnRpdHkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZyA9IHRoaXMuX190YXJnZXQuZ2V0U2NlbmVHcmFwaCgpITtcbiAgICBjb25zdCBhYWJiID0gc2cud29ybGRNZXJnZWRBQUJCV2l0aFNrZWxldGFsO1xuICAgIGlmIChhYWJiLmlzVmFuaWxsYSgpKSB7XG4gICAgICB0aGlzLl9fdG9wRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbFBvc2l0aW9uID0gc2cucG9zaXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuZ2V0VHJhbnNmb3JtKCkhLmxvY2FsUG9zaXRpb24gPSBhYWJiLmNlbnRlclBvaW50O1xuICAgIH1cbiAgICB0aGlzLl9fdG9wRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbFNjYWxlID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgIE1hdGgubWF4KDEsIGFhYmIuaXNWYW5pbGxhKCkgPyAxIDogYWFiYi5zaXplWCAvIDIpLFxuICAgICAgTWF0aC5tYXgoMSwgYWFiYi5pc1ZhbmlsbGEoKSA/IDEgOiBhYWJiLnNpemVZIC8gMiksXG4gICAgICBNYXRoLm1heCgxLCBhYWJiLmlzVmFuaWxsYSgpID8gMSA6IGFhYmIuc2l6ZVogLyAyKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIFByaXZhdGUgU3RhdGljIE1lbWJlcnNcbiAgLy8vXG4gIC8vL1xuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2VuZXJhdGVQcmltaXRpdmUoKTogUHJpbWl0aXZlIHtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgIC8vIFggYXhpc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fX2xlbmd0aCxcbiAgICAgIDAsXG4gICAgICAwLFxuXG4gICAgICAvLyBZIGF4aXNcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB0aGlzLl9fbGVuZ3RoLFxuICAgICAgMCxcblxuICAgICAgLy8gWiBheGlzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHRoaXMuX19sZW5ndGgsXG4gICAgXSk7XG5cbiAgICBjb25zdCBjb2xvciA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgLy8gWCBheGlzIGFzIFJlZFxuICAgICAgMSwgMCwgMCwgMSwgMCwgMCxcblxuICAgICAgLy8gWSBheGlzIGFzIEdyZWVuXG4gICAgICAwLCAxLCAwLCAwLCAxLCAwLFxuXG4gICAgICAvLyBaIGF4aXMgYXMgQmx1ZVxuICAgICAgMCwgMCwgMSwgMCwgMCwgMSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHByaW1pdGl2ZSA9IFByaW1pdGl2ZS5jcmVhdGVQcmltaXRpdmUoe1xuICAgICAgYXR0cmlidXRlU2VtYW50aWNzOiBbVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWiwgVmVydGV4QXR0cmlidXRlLkNvbG9yMC5YWVpdLFxuICAgICAgYXR0cmlidXRlczogW3Bvc2l0aW9ucywgY29sb3JdLFxuICAgICAgcHJpbWl0aXZlTW9kZTogUHJpbWl0aXZlTW9kZS5MaW5lcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3RvcEVudGl0eSkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuX2Rlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBjcmVhdGVNZXNoRW50aXR5IH0gZnJvbSAnLi4vY29tcG9uZW50cy9NZXNoUmVuZGVyZXIvY3JlYXRlTWVzaEVudGl0eSc7XG5pbXBvcnQgeyBjcmVhdGVHcm91cEVudGl0eSB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eSc7XG5pbXBvcnQgeyBDb21wb25lbnRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IEFscGhhTW9kZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0FscGhhTW9kZSc7XG5pbXBvcnQgeyBQcmltaXRpdmVNb2RlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJpbWl0aXZlTW9kZSc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL2dlb21ldHJ5L01lc2gnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IEN1YmUgfSBmcm9tICcuLi9nZW9tZXRyeS9zaGFwZXMvQ3ViZSc7XG5pbXBvcnQgeyBQbGFuZSB9IGZyb20gJy4uL2dlb21ldHJ5L3NoYXBlcy9QbGFuZSc7XG5pbXBvcnQgeyBJTWVzaEVudGl0eSwgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBNYXRlcmlhbEhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvTWF0ZXJpYWxIZWxwZXInO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgTWF0aFV0aWwgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlsJztcbmltcG9ydCB7IE1hdHJpeDMzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzMyc7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlTWF0cml4MzMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcbmltcG9ydCB7IGFzc2VydEV4aXN0IH0gZnJvbSAnLi4vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQgeyBnZXRFdmVudCwgSW5wdXRNYW5hZ2VyLCBJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19TQ0FMRSB9IGZyb20gJy4uL3N5c3RlbS9JbnB1dE1hbmFnZXInO1xuaW1wb3J0IHsgR2l6bW8gfSBmcm9tICcuL0dpem1vJztcblxuZGVjbGFyZSBsZXQgd2luZG93OiBhbnk7XG5cbi8qKlxuICogVHJhbnNsYXRpb24gR2l6bW8gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxlR2l6bW8gZXh0ZW5kcyBHaXptbyB7XG4gIHByaXZhdGUgc3RhdGljIF9fZ3JvdXBFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlRW50aXR5OiBJTWVzaEVudGl0eTtcbiAgcHJpdmF0ZSBzdGF0aWMgX195Q3ViZUVudGl0eTogSU1lc2hFbnRpdHk7XG4gIHByaXZhdGUgc3RhdGljIF9fekN1YmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlTWVzaDogTWVzaDtcbiAgcHJpdmF0ZSBzdGF0aWMgX195Q3ViZU1lc2g6IE1lc2g7XG4gIHByaXZhdGUgc3RhdGljIF9fekN1YmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3lDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3pDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3hFZGdlQ3ViZUVudGl0eTogSU1lc2hFbnRpdHk7XG4gIHByaXZhdGUgc3RhdGljIF9feUVkZ2VDdWJlRW50aXR5OiBJTWVzaEVudGl0eTtcbiAgcHJpdmF0ZSBzdGF0aWMgX196RWRnZUN1YmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3hFZGdlQ3ViZU1lc2g6IE1lc2g7XG4gIHByaXZhdGUgc3RhdGljIF9feUVkZ2VDdWJlTWVzaDogTWVzaDtcbiAgcHJpdmF0ZSBzdGF0aWMgX196RWRnZUN1YmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3hFZGdlQ3ViZVByaW1pdGl2ZTogQ3ViZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX195RWRnZUN1YmVQcmltaXRpdmU6IEN1YmU7XG4gIHByaXZhdGUgc3RhdGljIF9fekVkZ2VDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX3lDdWJlTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX3pDdWJlTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3l6UGxhbmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3p4UGxhbmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3l6UGxhbmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3p4UGxhbmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVQcmltaXRpdmU6IFBsYW5lO1xuICBwcml2YXRlIHN0YXRpYyBfX3l6UGxhbmVQcmltaXRpdmU6IFBsYW5lO1xuICBwcml2YXRlIHN0YXRpYyBfX3p4UGxhbmVQcmltaXRpdmU6IFBsYW5lO1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVNYXRlcmlhbDogTWF0ZXJpYWw7XG4gIHByaXZhdGUgc3RhdGljIF9feXpQbGFuZU1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgcHJpdmF0ZSBzdGF0aWMgX196eFBsYW5lTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX29yaWdpbmFsWCA9IDA7XG4gIHByaXZhdGUgc3RhdGljIF9fb3JpZ2luYWxZID0gMDtcbiAgcHJpdmF0ZSBfX3BpY2tTdGF0ZWRQb2ludCA9IFZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIF9fZGVsdGFQb2ludCA9IFZlY3RvcjMub25lKCk7XG4gIHByaXZhdGUgX190YXJnZXRTY2FsZUJhY2t1cCA9IFZlY3RvcjMub25lKCk7XG4gIHByaXZhdGUgX19pc1BvaW50ZXJEb3duID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIF9fYWN0aXZlQXhpczogJ25vbmUnIHwgJ3gnIHwgJ3knIHwgJ3onID0gJ25vbmUnO1xuICBwcml2YXRlIHN0YXRpYyBfX3NwYWNlOiAnbG9jYWwnIHwgJ3dvcmxkJyA9ICd3b3JsZCc7XG4gIHByaXZhdGUgc3RhdGljIF9fbGF0ZXN0VGFyZ2V0RW50aXR5PzogSVNjZW5lR3JhcGhFbnRpdHk7XG4gIHByaXZhdGUgc3RhdGljIF9fbGVuZ3RoID0gMTtcbiAgcHJpdmF0ZSBfX29uUG9pbnRlckRvd25GdW5jID0gdGhpcy5fX29uUG9pbnRlckRvd24uYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfX29uUG9pbnRlck1vdmVGdW5jID0gdGhpcy5fX29uUG9pbnRlck1vdmUuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfX29uUG9pbnRlclVwRnVuYyA9IHRoaXMuX19vblBvaW50ZXJVcC5iaW5kKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBnaXptbyBiZWxvbmcgdG9cbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogSU1lc2hFbnRpdHkpIHtcbiAgICBzdXBlcih0YXJnZXQpO1xuICB9XG5cbiAgLy8vXG4gIC8vL1xuICAvLy8gQWNjZXNzb3JzXG4gIC8vL1xuICAvLy9cblxuICBnZXQgaXNTZXR1cCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fX3RvcEVudGl0eSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNldCBsZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICBTY2FsZUdpem1vLl9fbGVuZ3RoID0gdmFsO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiBTY2FsZUdpem1vLl9fbGVuZ3RoO1xuICB9XG5cbiAgc2V0IGlzVmlzaWJsZShmbGc6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fX2lzVmlzaWJsZSA9PT0gZmFsc2UgJiYgZmxnID09PSB0cnVlKSB7XG4gICAgICBsZXQgZXZlbnRUYXJnZXREb20gPSB3aW5kb3c7XG4gICAgICBpZiAoSXMuZXhpc3QoQ29uZmlnLmV2ZW50VGFyZ2V0RG9tKSkge1xuICAgICAgICBldmVudFRhcmdldERvbSA9IENvbmZpZy5ldmVudFRhcmdldERvbTtcbiAgICAgIH1cbiAgICAgIElucHV0TWFuYWdlci5yZWdpc3RlcihJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19TQ0FMRSwgW1xuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiBnZXRFdmVudCgnc3RhcnQnKSxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLl9fb25Qb2ludGVyRG93bkZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge30sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbTogZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6IGdldEV2ZW50KCdtb3ZlJyksXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX29uUG9pbnRlck1vdmVGdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHt9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb206IGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiBnZXRFdmVudCgnZW5kJyksXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX29uUG9pbnRlclVwRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tOiBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogJ3BvaW50ZXJsZWF2ZScsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX29uUG9pbnRlclVwRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tOiBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpLmFkZENoaWxkKFNjYWxlR2l6bW8uX19ncm91cEVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICAgICAgU2NhbGVHaXptby5fX2xhdGVzdFRhcmdldEVudGl0eSA9IHRoaXMuX190YXJnZXQ7XG4gICAgICBpZiAoU2NhbGVHaXptby5fX3NwYWNlID09PSAnbG9jYWwnKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX190YXJnZXQuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgICBsZXQgcXVhdGVybmlvbjogSVF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLmlkZW50aXR5KCk7XG4gICAgICAgIGlmIChJcy5leGlzdChwYXJlbnQpKSB7XG4gICAgICAgICAgcXVhdGVybmlvbiA9IHBhcmVudC5nZXRRdWF0ZXJuaW9uUmVjdXJzaXZlbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvbiA9IHF1YXRlcm5pb247XG4gICAgICB9IGVsc2UgaWYgKFNjYWxlR2l6bW8uX19zcGFjZSA9PT0gJ3dvcmxkJykge1xuICAgICAgICBTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxSb3RhdGlvbiA9IFF1YXRlcm5pb24uZnJvbUNvcHk0KDAsIDAsIDAsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9faXNWaXNpYmxlID09PSB0cnVlICYmIGZsZyA9PT0gZmFsc2UpIHtcbiAgICAgIElucHV0TWFuYWdlci51bnJlZ2lzdGVyKElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1NDQUxFKTtcbiAgICAgIHRoaXMuX19kZWx0YVBvaW50ID0gdGhpcy5fX3RhcmdldC5nZXRUcmFuc2Zvcm0oKS5sb2NhbFNjYWxlO1xuICAgICAgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludCA9IFZlY3RvcjMuemVybygpO1xuICAgICAgdGhpcy5fX2lzUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuX190YXJnZXRTY2FsZUJhY2t1cCA9IHRoaXMuX190YXJnZXQuZ2V0VHJhbnNmb3JtKCkubG9jYWxTY2FsZTtcbiAgICAgIFNjYWxlR2l6bW8uX19hY3RpdmVBeGlzID0gJ25vbmUnO1xuICAgIH1cblxuICAgIElucHV0TWFuYWdlci5zZXRBY3RpdmUoSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fU0NBTEUsIGZsZyk7XG5cbiAgICB0aGlzLl9fc2V0VmlzaWJsZShmbGcpO1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgc2V0U3BhY2Uoc3BhY2U6ICdsb2NhbCcgfCAnd29ybGQnKSB7XG4gICAgU2NhbGVHaXptby5fX3NwYWNlID0gc3BhY2U7XG4gICAgaWYgKHRoaXMuX19pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzVmlzaWJsZTtcbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIEZyaWVuZHMgTWVtYmVyc1xuICAvLy9cbiAgLy8vXG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBzZXR1cCBlbnRpdGllcyBvZiBHaXptbyBpZiBub3QgZG9uZSB5ZXRcbiAgICovXG4gIF9zZXR1cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX3RvU2tpcFNldHVwKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9fdG9wRW50aXR5ID0gY3JlYXRlR3JvdXBFbnRpdHkoKTtcbiAgICB0aGlzLl9fdG9wRW50aXR5IS50cnlUb1NldFVuaXF1ZU5hbWUoYFNjYWxlR2l6bW9fb2ZfJHt0aGlzLl9fdGFyZ2V0LnVuaXF1ZU5hbWV9YCwgdHJ1ZSk7XG4gICAgdGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpIS50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4ID0gdHJ1ZTtcblxuICAgIC8vIGFkZCB0aGlzIHRvcEVudGl0eSB0byB0aGUgdGFyZ2V0IGFzIGdpem1vXG4gICAgdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkuX2FkZEdpem1vQ2hpbGQodGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpKTtcblxuICAgIC8vIHNldHVwIHRoZSBtZXNoXG4gICAgLy8geFxuICAgIGlmIChJcy5ub3QuZXhpc3QoU2NhbGVHaXptby5fX3hDdWJlRW50aXR5KSkge1xuICAgICAgdGhpcy54TWVzaCgpO1xuICAgICAgdGhpcy54RWRnZU1lc2goKTtcbiAgICB9XG5cbiAgICAvLyB5XG4gICAgaWYgKElzLm5vdC5leGlzdChTY2FsZUdpem1vLl9feUN1YmVFbnRpdHkpKSB7XG4gICAgICB0aGlzLnlNZXNoKCk7XG4gICAgICB0aGlzLnlFZGdlTWVzaCgpO1xuICAgIH1cblxuICAgIC8vIHpcbiAgICBpZiAoSXMubm90LmV4aXN0KFNjYWxlR2l6bW8uX196Q3ViZUVudGl0eSkpIHtcbiAgICAgIHRoaXMuek1lc2goKTtcbiAgICAgIHRoaXMuekVkZ2VNZXNoKCk7XG4gICAgfVxuXG4gICAgLy8geHkgUGxhbmVcbiAgICBpZiAoSXMubm90LmV4aXN0KFNjYWxlR2l6bW8uX194eVBsYW5lRW50aXR5KSkge1xuICAgICAgdGhpcy54eVBsYW5lKCk7XG4gICAgfVxuXG4gICAgLy8geXogUGxhbmVcbiAgICBpZiAoSXMubm90LmV4aXN0KFNjYWxlR2l6bW8uX195elBsYW5lRW50aXR5KSkge1xuICAgICAgdGhpcy55elBsYW5lKCk7XG4gICAgfVxuXG4gICAgLy8genggUGxhbmVcbiAgICBpZiAoSXMubm90LmV4aXN0KFNjYWxlR2l6bW8uX196eFBsYW5lRW50aXR5KSkge1xuICAgICAgdGhpcy56eFBsYW5lKCk7XG4gICAgfVxuXG4gICAgaWYgKElzLm5vdC5leGlzdChTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkpKSB7XG4gICAgICBTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkgPSBjcmVhdGVHcm91cEVudGl0eSgpO1xuICAgIH1cblxuICAgIHRoaXMuX190b3BFbnRpdHkhLmdldFNjZW5lR3JhcGgoKS5hZGRDaGlsZChTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcblxuICAgIFNjYWxlR2l6bW8uX19ncm91cEVudGl0eS5nZXRTY2VuZUdyYXBoKCkuYWRkQ2hpbGQoU2NhbGVHaXptby5fX3hDdWJlRW50aXR5LmdldFNjZW5lR3JhcGgoKSk7XG4gICAgU2NhbGVHaXptby5fX2dyb3VwRW50aXR5LmdldFNjZW5lR3JhcGgoKS5hZGRDaGlsZChTY2FsZUdpem1vLl9feUN1YmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICBTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmFkZENoaWxkKFNjYWxlR2l6bW8uX196Q3ViZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICAgIC8vIFNjYWxlR2l6bW8uX19ncm91cEVudGl0eVxuICAgIC8vICAgLmdldFNjZW5lR3JhcGgoKVxuICAgIC8vICAgLmFkZENoaWxkKFNjYWxlR2l6bW8uX194RWRnZUN1YmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICAvLyBTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHlcbiAgICAvLyAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAvLyAgIC5hZGRDaGlsZChTY2FsZUdpem1vLl9feUVkZ2VDdWJlRW50aXR5LmdldFNjZW5lR3JhcGgoKSk7XG4gICAgLy8gU2NhbGVHaXptby5fX2dyb3VwRW50aXR5XG4gICAgLy8gICAuZ2V0U2NlbmVHcmFwaCgpXG4gICAgLy8gICAuYWRkQ2hpbGQoU2NhbGVHaXptby5fX3pFZGdlQ3ViZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICAgIFNjYWxlR2l6bW8uX19ncm91cEVudGl0eS5nZXRTY2VuZUdyYXBoKCkuYWRkQ2hpbGQoU2NhbGVHaXptby5fX3h5UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICBTY2FsZUdpem1vLl9fZ3JvdXBFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmFkZENoaWxkKFNjYWxlR2l6bW8uX195elBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKSk7XG4gICAgU2NhbGVHaXptby5fX2dyb3VwRW50aXR5LmdldFNjZW5lR3JhcGgoKS5hZGRDaGlsZChTY2FsZUdpem1vLl9fenhQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuXG4gICAgU2NhbGVHaXptby5fX2xhdGVzdFRhcmdldEVudGl0eSA9IHRoaXMuX190YXJnZXQ7XG5cbiAgICB0aGlzLnNldEdpem1vVGFnKCk7XG4gIH1cblxuICBwcml2YXRlIHp4UGxhbmUoKSB7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVFbnRpdHkgPSBjcmVhdGVNZXNoRW50aXR5KCk7XG4gICAgU2NhbGVHaXptby5fX3hDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnU2NhbGVHaXptb196eFBsYW5lJywgdHJ1ZSk7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIC8vIFRyYW5zbGF0aW9uR2l6bW8uX196eFBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKS50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4ID0gdHJ1ZTtcbiAgICAvLyBUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZUVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbEV1bGVyQW5nbGVzID1cbiAgICAvLyBWZWN0b3IzLmZyb21Db3B5Myg5MCwgMCwgMCk7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVNYXRlcmlhbCA9IE1hdGVyaWFsSGVscGVyLmNyZWF0ZUNsYXNzaWNVYmVyTWF0ZXJpYWwoKTtcbiAgICBTY2FsZUdpem1vLl9fenhQbGFuZU1hdGVyaWFsLnNldFBhcmFtZXRlcihcbiAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgVmVjdG9yNC5mcm9tQ29weUFycmF5NChbMCwgMC41LCAwLCAwXSlcbiAgICApO1xuICAgIFNjYWxlR2l6bW8uX196eFBsYW5lTWF0ZXJpYWwuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgIFNjYWxlR2l6bW8uX196eFBsYW5lTWVzaCA9IG5ldyBNZXNoKCk7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVQcmltaXRpdmUgPSBuZXcgUGxhbmUoKTtcbiAgICBTY2FsZUdpem1vLl9fenhQbGFuZVByaW1pdGl2ZS5nZW5lcmF0ZSh7XG4gICAgICB3aWR0aDogMTAwMDAwLFxuICAgICAgaGVpZ2h0OiAxMDAwMDAsXG4gICAgICB1U3BhbjogMSxcbiAgICAgIHZTcGFuOiAxLFxuICAgICAgaXNVVlJlcGVhdDogdHJ1ZSxcbiAgICAgIGZsaXBUZXh0dXJlQ29vcmRpbmF0ZVk6IGZhbHNlLFxuICAgICAgbWF0ZXJpYWw6IFNjYWxlR2l6bW8uX196eFBsYW5lTWF0ZXJpYWwsXG4gICAgfSk7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVNZXNoLmFkZFByaW1pdGl2ZShTY2FsZUdpem1vLl9fenhQbGFuZVByaW1pdGl2ZSk7XG4gICAgU2NhbGVHaXptby5fX3p4UGxhbmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goU2NhbGVHaXptby5fX3p4UGxhbmVNZXNoKTtcbiAgfVxuXG4gIHByaXZhdGUgeXpQbGFuZSgpIHtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZUVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICBTY2FsZUdpem1vLl9feEN1YmVFbnRpdHkudHJ5VG9TZXRVbmlxdWVOYW1lKCdTY2FsZUdpem1vX3l6UGxhbmUnLCB0cnVlKTtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgLy8gVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLnRvTWFrZVdvcmxkTWF0cml4VGhlU2FtZUFzTG9jYWxNYXRyaXggPSB0cnVlO1xuICAgIFNjYWxlR2l6bW8uX195elBsYW5lRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsRXVsZXJBbmdsZXMgPSBWZWN0b3IzLmZyb21Db3B5MyhcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4oOTApXG4gICAgKTtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZU1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlQ2xhc3NpY1ViZXJNYXRlcmlhbCgpO1xuICAgIFNjYWxlR2l6bW8uX195elBsYW5lTWF0ZXJpYWwuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgIFNjYWxlR2l6bW8uX195elBsYW5lTWF0ZXJpYWwuc2V0UGFyYW1ldGVyKFxuICAgICAgJ2RpZmZ1c2VDb2xvckZhY3RvcicsXG4gICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLjUsIDAsIDAsIDBdKVxuICAgICk7XG4gICAgU2NhbGVHaXptby5fX3l6UGxhbmVNZXNoID0gbmV3IE1lc2goKTtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZVByaW1pdGl2ZSA9IG5ldyBQbGFuZSgpO1xuICAgIFNjYWxlR2l6bW8uX195elBsYW5lUHJpbWl0aXZlLmdlbmVyYXRlKHtcbiAgICAgIHdpZHRoOiAxMDAwMDAsXG4gICAgICBoZWlnaHQ6IDEwMDAwMCxcbiAgICAgIHVTcGFuOiAxLFxuICAgICAgdlNwYW46IDEsXG4gICAgICBpc1VWUmVwZWF0OiB0cnVlLFxuICAgICAgZmxpcFRleHR1cmVDb29yZGluYXRlWTogZmFsc2UsXG4gICAgICBtYXRlcmlhbDogU2NhbGVHaXptby5fX3l6UGxhbmVNYXRlcmlhbCxcbiAgICB9KTtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZU1lc2guYWRkUHJpbWl0aXZlKFNjYWxlR2l6bW8uX195elBsYW5lUHJpbWl0aXZlKTtcbiAgICBTY2FsZUdpem1vLl9feXpQbGFuZUVudGl0eS5nZXRNZXNoKCkuc2V0TWVzaChTY2FsZUdpem1vLl9feXpQbGFuZU1lc2gpO1xuICB9XG5cbiAgcHJpdmF0ZSB4eVBsYW5lKCkge1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgIFNjYWxlR2l6bW8uX194Q3ViZUVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoJ1NjYWxlR2l6bW9feHlQbGFuZScsIHRydWUpO1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAvLyBUcmFuc2xhdGlvbkdpem1vLl9feHlQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkudG9NYWtlV29ybGRNYXRyaXhUaGVTYW1lQXNMb2NhbE1hdHJpeCA9IHRydWU7XG4gICAgU2NhbGVHaXptby5fX3h5UGxhbmVFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxFdWxlckFuZ2xlcyA9IFZlY3RvcjMuZnJvbUNvcHkzKFxuICAgICAgTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4oOTApLFxuICAgICAgMCxcbiAgICAgIDBcbiAgICApO1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lTWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKCk7XG4gICAgU2NhbGVHaXptby5fX3h5UGxhbmVNYXRlcmlhbC5hbHBoYU1vZGUgPSBBbHBoYU1vZGUuQmxlbmQ7XG4gICAgU2NhbGVHaXptby5fX3h5UGxhbmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAnZGlmZnVzZUNvbG9yRmFjdG9yJyxcbiAgICAgIFZlY3RvcjQuZnJvbUNvcHlBcnJheTQoWzAsIDAsIDAuNSwgMF0pXG4gICAgKTtcbiAgICBTY2FsZUdpem1vLl9feHlQbGFuZU1lc2ggPSBuZXcgTWVzaCgpO1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lUHJpbWl0aXZlID0gbmV3IFBsYW5lKCk7XG4gICAgU2NhbGVHaXptby5fX3h5UGxhbmVQcmltaXRpdmUuZ2VuZXJhdGUoe1xuICAgICAgd2lkdGg6IDEwMDAwMCxcbiAgICAgIGhlaWdodDogMTAwMDAwLFxuICAgICAgdVNwYW46IDEsXG4gICAgICB2U3BhbjogMSxcbiAgICAgIGlzVVZSZXBlYXQ6IHRydWUsXG4gICAgICBmbGlwVGV4dHVyZUNvb3JkaW5hdGVZOiBmYWxzZSxcbiAgICAgIG1hdGVyaWFsOiBTY2FsZUdpem1vLl9feHlQbGFuZU1hdGVyaWFsLFxuICAgIH0pO1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lTWVzaC5hZGRQcmltaXRpdmUoU2NhbGVHaXptby5fX3h5UGxhbmVQcmltaXRpdmUpO1xuICAgIFNjYWxlR2l6bW8uX194eVBsYW5lRW50aXR5LmdldE1lc2goKS5zZXRNZXNoKFNjYWxlR2l6bW8uX194eVBsYW5lTWVzaCk7XG4gIH1cblxuICBwcml2YXRlIHpNZXNoKCkge1xuICAgIFNjYWxlR2l6bW8uX196Q3ViZUVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICBTY2FsZUdpem1vLl9feEN1YmVFbnRpdHkudHJ5VG9TZXRVbmlxdWVOYW1lKCdTY2FsZUdpem1vX3pDdWJlJywgdHJ1ZSk7XG4gICAgU2NhbGVHaXptby5fX3pDdWJlRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAxKTtcbiAgICBTY2FsZUdpem1vLl9fekN1YmVNZXNoID0gbmV3IE1lc2goKTtcbiAgICBTY2FsZUdpem1vLl9fekN1YmVNYXRlcmlhbCA9IE1hdGVyaWFsSGVscGVyLmNyZWF0ZUNsYXNzaWNVYmVyTWF0ZXJpYWwoKTtcbiAgICBTY2FsZUdpem1vLl9fekN1YmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAnZGlmZnVzZUNvbG9yRmFjdG9yJyxcbiAgICAgIFZlY3RvcjQuZnJvbUNvcHlBcnJheTQoWzAsIDAsIDEsIDFdKVxuICAgICk7XG4gICAgU2NhbGVHaXptby5fX3pDdWJlUHJpbWl0aXZlID0gbmV3IEN1YmUoKTtcbiAgICBTY2FsZUdpem1vLl9fekN1YmVQcmltaXRpdmUuZ2VuZXJhdGUoe1xuICAgICAgd2lkdGhWZWN0b3I6IFZlY3RvcjMuZnJvbUNvcHkzKDAuMDUsIDAuMDUsIDEpLFxuICAgICAgbWF0ZXJpYWw6IFNjYWxlR2l6bW8uX196Q3ViZU1hdGVyaWFsLFxuICAgIH0pO1xuICAgIFNjYWxlR2l6bW8uX196Q3ViZU1lc2guYWRkUHJpbWl0aXZlKFNjYWxlR2l6bW8uX196Q3ViZVByaW1pdGl2ZSk7XG4gICAgU2NhbGVHaXptby5fX3pDdWJlRW50aXR5LmdldE1lc2goKS5zZXRNZXNoKFNjYWxlR2l6bW8uX196Q3ViZU1lc2gpO1xuICB9XG5cbiAgcHJpdmF0ZSB5TWVzaCgpIHtcbiAgICBTY2FsZUdpem1vLl9feUN1YmVFbnRpdHkgPSBjcmVhdGVNZXNoRW50aXR5KCk7XG4gICAgU2NhbGVHaXptby5fX3hDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnU2NhbGVHaXptb195Q3ViZScsIHRydWUpO1xuICAgIFNjYWxlR2l6bW8uX195Q3ViZUVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weTMoMCwgMSwgMCk7XG4gICAgU2NhbGVHaXptby5fX3lDdWJlTWVzaCA9IG5ldyBNZXNoKCk7XG4gICAgU2NhbGVHaXptby5fX3lDdWJlTWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKCk7XG4gICAgU2NhbGVHaXptby5fX3lDdWJlTWF0ZXJpYWwuc2V0UGFyYW1ldGVyKFxuICAgICAgJ2RpZmZ1c2VDb2xvckZhY3RvcicsXG4gICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLCAxLCAwLCAxXSlcbiAgICApO1xuICAgIFNjYWxlR2l6bW8uX195Q3ViZVByaW1pdGl2ZSA9IG5ldyBDdWJlKCk7XG4gICAgU2NhbGVHaXptby5fX3lDdWJlUHJpbWl0aXZlLmdlbmVyYXRlKHtcbiAgICAgIHdpZHRoVmVjdG9yOiBWZWN0b3IzLmZyb21Db3B5MygwLjA1LCAxLCAwLjA1KSxcbiAgICAgIG1hdGVyaWFsOiBTY2FsZUdpem1vLl9feUN1YmVNYXRlcmlhbCxcbiAgICB9KTtcbiAgICBTY2FsZUdpem1vLl9feUN1YmVNZXNoLmFkZFByaW1pdGl2ZShTY2FsZUdpem1vLl9feUN1YmVQcmltaXRpdmUpO1xuICAgIFNjYWxlR2l6bW8uX195Q3ViZUVudGl0eS5nZXRNZXNoKCkuc2V0TWVzaChTY2FsZUdpem1vLl9feUN1YmVNZXNoKTtcbiAgfVxuXG4gIHByaXZhdGUgeE1lc2goKSB7XG4gICAgU2NhbGVHaXptby5fX3hDdWJlRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgIFNjYWxlR2l6bW8uX194Q3ViZUVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoJ1NjYWxlR2l6bW9feEN1YmUnLCB0cnVlKTtcbiAgICBTY2FsZUdpem1vLl9feEN1YmVFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxQb3NpdGlvbiA9IFZlY3RvcjMuZnJvbUNvcHkzKDEsIDAsIDApO1xuICAgIFNjYWxlR2l6bW8uX194Q3ViZU1lc2ggPSBuZXcgTWVzaCgpO1xuICAgIFNjYWxlR2l6bW8uX194Q3ViZU1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlQ2xhc3NpY1ViZXJNYXRlcmlhbCgpO1xuICAgIFNjYWxlR2l6bW8uX194Q3ViZU1hdGVyaWFsLnNldFBhcmFtZXRlcihcbiAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgVmVjdG9yNC5mcm9tQ29weUFycmF5NChbMSwgMCwgMCwgMV0pXG4gICAgKTtcbiAgICBTY2FsZUdpem1vLl9feEN1YmVQcmltaXRpdmUgPSBuZXcgQ3ViZSgpO1xuICAgIFNjYWxlR2l6bW8uX194Q3ViZVByaW1pdGl2ZS5nZW5lcmF0ZSh7XG4gICAgICB3aWR0aFZlY3RvcjogVmVjdG9yMy5mcm9tQ29weTMoMSwgMC4wNSwgMC4wNSksXG4gICAgICBtYXRlcmlhbDogU2NhbGVHaXptby5fX3hDdWJlTWF0ZXJpYWwsXG4gICAgfSk7XG4gICAgU2NhbGVHaXptby5fX3hDdWJlTWVzaC5hZGRQcmltaXRpdmUoU2NhbGVHaXptby5fX3hDdWJlUHJpbWl0aXZlKTtcbiAgICBTY2FsZUdpem1vLl9feEN1YmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goU2NhbGVHaXptby5fX3hDdWJlTWVzaCk7XG4gIH1cblxuICBwcml2YXRlIHhFZGdlTWVzaCgpIHtcbiAgICBTY2FsZUdpem1vLl9feEVkZ2VDdWJlRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgIFNjYWxlR2l6bW8uX194RWRnZUN1YmVFbnRpdHkudHJ5VG9TZXRVbmlxdWVOYW1lKCdTY2FsZUdpem1vX3hFZGdlQ3ViZScsIHRydWUpO1xuICAgIFNjYWxlR2l6bW8uX194RWRnZUN1YmVFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxQb3NpdGlvbiA9IFZlY3RvcjMuZnJvbUNvcHkzKDEsIDAsIDApO1xuICAgIFNjYWxlR2l6bW8uX194RWRnZUN1YmVNZXNoID0gbmV3IE1lc2goKTtcbiAgICBTY2FsZUdpem1vLl9feEVkZ2VDdWJlUHJpbWl0aXZlID0gbmV3IEN1YmUoKTtcbiAgICBTY2FsZUdpem1vLl9feEVkZ2VDdWJlUHJpbWl0aXZlLmdlbmVyYXRlKHtcbiAgICAgIHdpZHRoVmVjdG9yOiBWZWN0b3IzLmZyb21Db3B5MygwLjEsIDAuMSwgMC4xKSxcbiAgICAgIG1hdGVyaWFsOiBTY2FsZUdpem1vLl9feEN1YmVNYXRlcmlhbCxcbiAgICB9KTtcbiAgICBTY2FsZUdpem1vLl9feEVkZ2VDdWJlTWVzaC5hZGRQcmltaXRpdmUoU2NhbGVHaXptby5fX3hFZGdlQ3ViZVByaW1pdGl2ZSk7XG4gICAgU2NhbGVHaXptby5fX3hFZGdlQ3ViZUVudGl0eS5nZXRNZXNoKCkuc2V0TWVzaChTY2FsZUdpem1vLl9feEVkZ2VDdWJlTWVzaCk7XG5cbiAgICBTY2FsZUdpem1vLl9feEN1YmVFbnRpdHkuYWRkQ2hpbGQoU2NhbGVHaXptby5fX3hFZGdlQ3ViZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB5RWRnZU1lc2goKSB7XG4gICAgU2NhbGVHaXptby5fX3lFZGdlQ3ViZUVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICBTY2FsZUdpem1vLl9feUVkZ2VDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnU2NhbGVHaXptb195RWRnZUN1YmUnLCB0cnVlKTtcbiAgICBTY2FsZUdpem1vLl9feUVkZ2VDdWJlRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5MygwLCAxLCAwKTtcbiAgICBTY2FsZUdpem1vLl9feUVkZ2VDdWJlTWVzaCA9IG5ldyBNZXNoKCk7XG4gICAgU2NhbGVHaXptby5fX3lFZGdlQ3ViZVByaW1pdGl2ZSA9IG5ldyBDdWJlKCk7XG4gICAgU2NhbGVHaXptby5fX3lFZGdlQ3ViZVByaW1pdGl2ZS5nZW5lcmF0ZSh7XG4gICAgICB3aWR0aFZlY3RvcjogVmVjdG9yMy5mcm9tQ29weTMoMC4xLCAwLjEsIDAuMSksXG4gICAgICBtYXRlcmlhbDogU2NhbGVHaXptby5fX3lDdWJlTWF0ZXJpYWwsXG4gICAgfSk7XG4gICAgU2NhbGVHaXptby5fX3lFZGdlQ3ViZU1lc2guYWRkUHJpbWl0aXZlKFNjYWxlR2l6bW8uX195RWRnZUN1YmVQcmltaXRpdmUpO1xuICAgIFNjYWxlR2l6bW8uX195RWRnZUN1YmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goU2NhbGVHaXptby5fX3lFZGdlQ3ViZU1lc2gpO1xuXG4gICAgU2NhbGVHaXptby5fX3lDdWJlRW50aXR5LmFkZENoaWxkKFNjYWxlR2l6bW8uX195RWRnZUN1YmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgekVkZ2VNZXNoKCkge1xuICAgIFNjYWxlR2l6bW8uX196RWRnZUN1YmVFbnRpdHkgPSBjcmVhdGVNZXNoRW50aXR5KCk7XG4gICAgU2NhbGVHaXptby5fX3pFZGdlQ3ViZUVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoJ1NjYWxlR2l6bW9fekVkZ2VDdWJlJywgdHJ1ZSk7XG4gICAgU2NhbGVHaXptby5fX3pFZGdlQ3ViZUVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weTMoMCwgMCwgMSk7XG4gICAgU2NhbGVHaXptby5fX3pFZGdlQ3ViZU1lc2ggPSBuZXcgTWVzaCgpO1xuICAgIFNjYWxlR2l6bW8uX196RWRnZUN1YmVQcmltaXRpdmUgPSBuZXcgQ3ViZSgpO1xuICAgIFNjYWxlR2l6bW8uX196RWRnZUN1YmVQcmltaXRpdmUuZ2VuZXJhdGUoe1xuICAgICAgd2lkdGhWZWN0b3I6IFZlY3RvcjMuZnJvbUNvcHkzKDAuMSwgMC4xLCAwLjEpLFxuICAgICAgbWF0ZXJpYWw6IFNjYWxlR2l6bW8uX196Q3ViZU1hdGVyaWFsLFxuICAgIH0pO1xuICAgIFNjYWxlR2l6bW8uX196RWRnZUN1YmVNZXNoLmFkZFByaW1pdGl2ZShTY2FsZUdpem1vLl9fekVkZ2VDdWJlUHJpbWl0aXZlKTtcbiAgICBTY2FsZUdpem1vLl9fekVkZ2VDdWJlRW50aXR5LmdldE1lc2goKS5zZXRNZXNoKFNjYWxlR2l6bW8uX196RWRnZUN1YmVNZXNoKTtcblxuICAgIFNjYWxlR2l6bW8uX196Q3ViZUVudGl0eS5hZGRDaGlsZChTY2FsZUdpem1vLl9fekVkZ2VDdWJlRW50aXR5LmdldFNjZW5lR3JhcGgoKSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIHVwZGF0ZSB0aGUgdHJhbnNmb3JtIGFuZCBldGMgb2YgdGhlIGdpem1vXG4gICAqL1xuICBfdXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9fdG9wRW50aXR5ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2cgPSB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKSE7XG4gICAgY29uc3QgYWFiYiA9IHNnLndvcmxkTWVyZ2VkQUFCQldpdGhTa2VsZXRhbDtcbiAgICBpZiAoYWFiYi5pc1ZhbmlsbGEoKSkge1xuICAgICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxQb3NpdGlvbiA9IHNnLnBvc2l0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdG9wRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbFBvc2l0aW9uID0gYWFiYi5jZW50ZXJQb2ludDtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChhYWJiLnNpemVYLCBhYWJiLnNpemVZLCBhYWJiLnNpemVaKTtcbiAgICB0aGlzLl9fdG9wRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbFNjYWxlID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgIE1hdGgubWluKDEsIGFhYmIuaXNWYW5pbGxhKCkgPyAxIDogbWF4IC8gMiksXG4gICAgICBNYXRoLm1pbigxLCBhYWJiLmlzVmFuaWxsYSgpID8gMSA6IG1heCAvIDIpLFxuICAgICAgTWF0aC5taW4oMSwgYWFiYi5pc1ZhbmlsbGEoKSA/IDEgOiBtYXggLyAyKSxcbiAgICBdKTtcblxuICAgIGlmICh0aGlzLl9faXNQb2ludGVyRG93bikge1xuICAgICAgaWYgKFNjYWxlR2l6bW8uX19sYXRlc3RUYXJnZXRFbnRpdHkgPT09IHRoaXMuX190YXJnZXQpIHtcbiAgICAgICAgdGhpcy5fX3RhcmdldC5nZXRUcmFuc2Zvcm0oKS5sb2NhbFNjYWxlID0gdGhpcy5fX2RlbHRhUG9pbnQuY2xvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLy9cbiAgLy8vXG4gIC8vLyBQcml2YXRlIFN0YXRpYyBNZW1iZXJzXG4gIC8vL1xuICAvLy9cblxuICBwcml2YXRlIHN0YXRpYyBfX2dlbmVyYXRlUHJpbWl0aXZlKCk6IFByaW1pdGl2ZSB7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAvLyBYIGF4aXNcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHRoaXMuX19sZW5ndGgsXG4gICAgICAwLFxuICAgICAgMCxcblxuICAgICAgLy8gWSBheGlzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fX2xlbmd0aCxcbiAgICAgIDAsXG5cbiAgICAgIC8vIFogYXhpc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB0aGlzLl9fbGVuZ3RoLFxuICAgIF0pO1xuXG4gICAgY29uc3QgY29sb3IgPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgIC8vIFggYXhpcyBhcyBSZWRcbiAgICAgIDEsIDAsIDAsIDEsIDAsIDAsXG5cbiAgICAgIC8vIFkgYXhpcyBhcyBHcmVlblxuICAgICAgMCwgMSwgMCwgMCwgMSwgMCxcblxuICAgICAgLy8gWiBheGlzIGFzIEJsdWVcbiAgICAgIDAsIDAsIDEsIDAsIDAsIDEsXG4gICAgXSk7XG5cbiAgICBjb25zdCBwcmltaXRpdmUgPSBQcmltaXRpdmUuY3JlYXRlUHJpbWl0aXZlKHtcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljczogW1ZlcnRleEF0dHJpYnV0ZS5Qb3NpdGlvbi5YWVosIFZlcnRleEF0dHJpYnV0ZS5Db2xvcjAuWFlaXSxcbiAgICAgIGF0dHJpYnV0ZXM6IFtwb3NpdGlvbnMsIGNvbG9yXSxcbiAgICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGUuTGluZXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBfX29uUG9pbnRlckRvd24oZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl9faXNQb2ludGVyRG93biA9IHRydWU7XG4gICAgU2NhbGVHaXptby5fX29yaWdpbmFsWCA9IGV2dC5jbGllbnRYO1xuICAgIFNjYWxlR2l6bW8uX19vcmlnaW5hbFkgPSBldnQuY2xpZW50WTtcblxuICAgIC8vIElucHV0TWFuYWdlci5lbmFibGVDYW1lcmFDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCB3b3JsZE1hdHJpeCA9IHRoaXMuX190YXJnZXQuZ2V0U2NlbmVHcmFwaCgpLm1hdHJpeC5nZXRSb3RhdGUoKTtcbiAgICBjb25zdCBzY2FsZVZlYyA9IFZlY3RvcjMub25lKCk7XG4gICAgbGV0IHJvdE1hdCA9IE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKFxuICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMCxcbiAgICAgIHNjYWxlVmVjLnggKiB3b3JsZE1hdHJpeC5tMDEsXG4gICAgICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAyLFxuICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMCxcbiAgICAgIHNjYWxlVmVjLnkgKiB3b3JsZE1hdHJpeC5tMTEsXG4gICAgICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTEyLFxuICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMCxcbiAgICAgIHNjYWxlVmVjLnogKiB3b3JsZE1hdHJpeC5tMjEsXG4gICAgICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIyXG4gICAgKTtcblxuICAgIGlmIChTY2FsZUdpem1vLl9fc3BhY2UgPT09ICdsb2NhbCcpIHtcbiAgICAgIHJvdE1hdCA9IE1hdHJpeDMzLnRyYW5zcG9zZShyb3RNYXQpIGFzIE1hdHJpeDMzO1xuICAgIH0gZWxzZSBpZiAoU2NhbGVHaXptby5fX3NwYWNlID09PSAnd29ybGQnKSB7XG4gICAgICByb3RNYXQgPSBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHhSZXN1bHQsIHlSZXN1bHQsIHpSZXN1bHQgfSA9IFNjYWxlR2l6bW8uY2FzdFJheShldnQpO1xuICAgIGlmICh4UmVzdWx0LnJlc3VsdCkge1xuICAgICAgYXNzZXJ0RXhpc3QoeFJlc3VsdC5kYXRhKTtcbiAgICAgIHRoaXMuX19waWNrU3RhdGVkUG9pbnQgPSByb3RNYXQubXVsdGlwbHlWZWN0b3IoeFJlc3VsdC5kYXRhLnBvc2l0aW9uLmNsb25lKCkpO1xuICAgICAgTG9nZ2VyLmRlYnVnKCdEb3duOicgKyB0aGlzLl9fcGlja1N0YXRlZFBvaW50LnRvU3RyaW5nQXBwcm94aW1hdGVseSgpKTtcbiAgICAgIFNjYWxlR2l6bW8uX19hY3RpdmVBeGlzID0gJ3gnO1xuICAgIH1cbiAgICBpZiAoeVJlc3VsdC5yZXN1bHQpIHtcbiAgICAgIGFzc2VydEV4aXN0KHlSZXN1bHQuZGF0YSk7XG4gICAgICB0aGlzLl9fcGlja1N0YXRlZFBvaW50ID0gcm90TWF0Lm11bHRpcGx5VmVjdG9yKHlSZXN1bHQuZGF0YS5wb3NpdGlvbi5jbG9uZSgpKTtcbiAgICAgIExvZ2dlci5kZWJ1ZygnRG93bjonICsgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludC50b1N0cmluZ0FwcHJveGltYXRlbHkoKSk7XG4gICAgICBTY2FsZUdpem1vLl9fYWN0aXZlQXhpcyA9ICd5JztcbiAgICB9XG4gICAgaWYgKHpSZXN1bHQucmVzdWx0KSB7XG4gICAgICBhc3NlcnRFeGlzdCh6UmVzdWx0LmRhdGEpO1xuICAgICAgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludCA9IHJvdE1hdC5tdWx0aXBseVZlY3Rvcih6UmVzdWx0LmRhdGEucG9zaXRpb24uY2xvbmUoKSk7XG4gICAgICBMb2dnZXIuZGVidWcoJ0Rvd246JyArIHRoaXMuX19waWNrU3RhdGVkUG9pbnQudG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuICAgICAgU2NhbGVHaXptby5fX2FjdGl2ZUF4aXMgPSAneic7XG4gICAgfVxuXG4gICAgaWYgKFNjYWxlR2l6bW8uX19sYXRlc3RUYXJnZXRFbnRpdHkgPT09IHRoaXMuX190YXJnZXQpIHtcbiAgICAgIHRoaXMuX190YXJnZXRTY2FsZUJhY2t1cCA9IHRoaXMuX190YXJnZXQuZ2V0VHJhbnNmb3JtKCkubG9jYWxTY2FsZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fb25Qb2ludGVyTW92ZShldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChJcy5mYWxzZSh0aGlzLl9faXNQb2ludGVyRG93bikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZHRoID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgeCA9IGV2dC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHkgPSByZWN0LmhlaWdodCAtIChldnQuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IFZlY3RvcjQuZnJvbUNvcHk0KDAsIDAsIHdpZHRoLCBoZWlnaHQpIGFzIFZlY3RvcjQ7XG4gICAgY29uc3QgYWN0aXZlQ2FtZXJhID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICBDYW1lcmFDb21wb25lbnQuY3VycmVudFxuICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgd29ybGRNYXRyaXggPSB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKS5tYXRyaXguZ2V0Um90YXRlKCk7XG4gICAgY29uc3Qgc2NhbGVWZWMgPSBWZWN0b3IzLm9uZSgpOyAvL3RoaXMuX190YXJnZXQuZ2V0U2NlbmVHcmFwaCgpLndvcmxkTWF0cml4LmdldFNjYWxlKCk7XG4gICAgbGV0IHJvdE1hdCA9IE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKFxuICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMCxcbiAgICAgIHNjYWxlVmVjLnggKiB3b3JsZE1hdHJpeC5tMDEsXG4gICAgICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAyLFxuICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMCxcbiAgICAgIHNjYWxlVmVjLnkgKiB3b3JsZE1hdHJpeC5tMTEsXG4gICAgICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTEyLFxuICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMCxcbiAgICAgIHNjYWxlVmVjLnogKiB3b3JsZE1hdHJpeC5tMjEsXG4gICAgICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIyXG4gICAgKTtcbiAgICBpZiAoU2NhbGVHaXptby5fX3NwYWNlID09PSAnbG9jYWwnKSB7XG4gICAgICByb3RNYXQgPSBNYXRyaXgzMy50cmFuc3Bvc2Uocm90TWF0KSBhcyBNYXRyaXgzMztcbiAgICB9IGVsc2UgaWYgKFNjYWxlR2l6bW8uX19zcGFjZSA9PT0gJ3dvcmxkJykge1xuICAgICAgcm90TWF0ID0gTXV0YWJsZU1hdHJpeDMzLmlkZW50aXR5KCk7XG4gICAgfVxuICAgIGxldCBwaWNrSW5Nb3ZpbmdQb2ludDogVmVjdG9yMyA9IHRoaXMuX19waWNrU3RhdGVkUG9pbnQuY2xvbmUoKTtcbiAgICBpZiAoU2NhbGVHaXptby5fX2FjdGl2ZUF4aXMgPT09ICd4Jykge1xuICAgICAgY29uc3QgeFJlc3VsdCA9IFNjYWxlR2l6bW8uX194eVBsYW5lRW50aXR5XG4gICAgICAgIC5nZXRNZXNoKClcbiAgICAgICAgLmNhc3RSYXlGcm9tU2NyZWVuSW5Xb3JsZCh4LCB5LCBhY3RpdmVDYW1lcmEhLCB2aWV3cG9ydCwgMC4wKTtcbiAgICAgIGlmICh4UmVzdWx0LnJlc3VsdCkge1xuICAgICAgICBhc3NlcnRFeGlzdCh4UmVzdWx0LmRhdGEpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJvdE1hdC5tdWx0aXBseVZlY3Rvcih4UmVzdWx0LmRhdGEucG9zaXRpb24pO1xuICAgICAgICBwaWNrSW5Nb3ZpbmdQb2ludCA9IFZlY3RvcjMuZnJvbUNvcHkzKHBvc2l0aW9uLngsIHBpY2tJbk1vdmluZ1BvaW50LnksIHBpY2tJbk1vdmluZ1BvaW50LnopO1xuICAgICAgICAvLyBwaWNrSW5Nb3ZpbmdQb2ludCA9IFZlY3RvcjMuZnJvbUNvcHkzKHhSZXN1bHQuZGF0YS5wb3NpdGlvbi54LCBwaWNrSW5Nb3ZpbmdQb2ludC55LCBwaWNrSW5Nb3ZpbmdQb2ludC56KTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdNb3ZlOicgKyB4UmVzdWx0LmRhdGEucG9zaXRpb24udG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuICAgICAgfVxuICAgICAgSW5wdXRNYW5hZ2VyLmRpc2FibGVDYW1lcmFDb250cm9sbGVyKCk7XG4gICAgfVxuICAgIGlmIChTY2FsZUdpem1vLl9fYWN0aXZlQXhpcyA9PT0gJ3knKSB7XG4gICAgICBjb25zdCB5UmVzdWx0ID0gU2NhbGVHaXptby5fX3h5UGxhbmVFbnRpdHlcbiAgICAgICAgLmdldE1lc2goKVxuICAgICAgICAuY2FzdFJheUZyb21TY3JlZW5JbldvcmxkKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjApO1xuICAgICAgaWYgKHlSZXN1bHQucmVzdWx0KSB7XG4gICAgICAgIGFzc2VydEV4aXN0KHlSZXN1bHQuZGF0YSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcm90TWF0Lm11bHRpcGx5VmVjdG9yKHlSZXN1bHQuZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIHBpY2tJbk1vdmluZ1BvaW50ID0gVmVjdG9yMy5mcm9tQ29weTMocGlja0luTW92aW5nUG9pbnQueCwgcG9zaXRpb24ueSwgcGlja0luTW92aW5nUG9pbnQueik7XG4gICAgICAgIC8vIHBpY2tJbk1vdmluZ1BvaW50ID0gVmVjdG9yMy5mcm9tQ29weTMocGlja0luTW92aW5nUG9pbnQueCwgeVJlc3VsdC5kYXRhLnBvc2l0aW9uLnksIHBpY2tJbk1vdmluZ1BvaW50LnopO1xuICAgICAgICBMb2dnZXIuZGVidWcoJ01vdmU6JyArIHlSZXN1bHQuZGF0YS5wb3NpdGlvbi50b1N0cmluZ0FwcHJveGltYXRlbHkoKSk7XG4gICAgICB9XG4gICAgICBJbnB1dE1hbmFnZXIuZGlzYWJsZUNhbWVyYUNvbnRyb2xsZXIoKTtcbiAgICB9XG4gICAgaWYgKFNjYWxlR2l6bW8uX19hY3RpdmVBeGlzID09PSAneicpIHtcbiAgICAgIGNvbnN0IHpSZXN1bHQgPSBTY2FsZUdpem1vLl9feXpQbGFuZUVudGl0eVxuICAgICAgICAuZ2V0TWVzaCgpXG4gICAgICAgIC5jYXN0UmF5RnJvbVNjcmVlbkluV29ybGQoeCwgeSwgYWN0aXZlQ2FtZXJhISwgdmlld3BvcnQsIDAuMCk7XG4gICAgICBpZiAoelJlc3VsdC5yZXN1bHQpIHtcbiAgICAgICAgYXNzZXJ0RXhpc3QoelJlc3VsdC5kYXRhKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSByb3RNYXQubXVsdGlwbHlWZWN0b3IoelJlc3VsdC5kYXRhLnBvc2l0aW9uKTtcbiAgICAgICAgcGlja0luTW92aW5nUG9pbnQgPSBWZWN0b3IzLmZyb21Db3B5MyhwaWNrSW5Nb3ZpbmdQb2ludC54LCBwaWNrSW5Nb3ZpbmdQb2ludC55LCBwb3NpdGlvbi56KTtcbiAgICAgICAgLy8gcGlja0luTW92aW5nUG9pbnQgPSBWZWN0b3IzLmZyb21Db3B5MyhwaWNrSW5Nb3ZpbmdQb2ludC54LCBwaWNrSW5Nb3ZpbmdQb2ludC55LCB6UmVzdWx0LmRhdGEucG9zaXRpb24ueik7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnTW92ZTonICsgelJlc3VsdC5kYXRhLnBvc2l0aW9uLnRvU3RyaW5nQXBwcm94aW1hdGVseSgpKTtcbiAgICAgIH1cbiAgICAgIElucHV0TWFuYWdlci5kaXNhYmxlQ2FtZXJhQ29udHJvbGxlcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHNnID0gdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkhO1xuICAgIGNvbnN0IGFhYmIgPSBzZy53b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWw7XG4gICAgY29uc3QgZGVsdGFWZWN0b3IzID0gVmVjdG9yMy5tdWx0aXBseShcbiAgICAgIFZlY3RvcjMuc3VidHJhY3QocGlja0luTW92aW5nUG9pbnQsIHRoaXMuX19waWNrU3RhdGVkUG9pbnQpLFxuICAgICAgMSAvIGFhYmIubGVuZ3RoQ2VudGVyVG9Db3JuZXJcbiAgICApO1xuXG4gICAgTG9nZ2VyLmRlYnVnKGAke3RoaXMuX190YXJnZXQudW5pcXVlTmFtZX06IGAgKyBkZWx0YVZlY3RvcjMudG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuXG4gICAgaWYgKFNjYWxlR2l6bW8uX19zcGFjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgdGhpcy5fX2RlbHRhUG9pbnQgPSBWZWN0b3IzLmFkZCh0aGlzLl9fdGFyZ2V0U2NhbGVCYWNrdXAsIGRlbHRhVmVjdG9yMyk7XG4gICAgICB0aGlzLl9fZGVsdGFQb2ludCA9IFZlY3RvcjMuZnJvbUNvcHkzKFxuICAgICAgICBNYXRoLm1heCh0aGlzLl9fZGVsdGFQb2ludC54LCAwLjAxKSxcbiAgICAgICAgTWF0aC5tYXgodGhpcy5fX2RlbHRhUG9pbnQueSwgMC4wMSksXG4gICAgICAgIE1hdGgubWF4KHRoaXMuX19kZWx0YVBvaW50LnosIDAuMDEpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoU2NhbGVHaXptby5fX3NwYWNlID09PSAnd29ybGQnKSB7XG4gICAgICBjb25zdCB3b3JsZE1hdCA9IE1hdHJpeDQ0LmZyb21Db3B5UXVhdGVybmlvbihcbiAgICAgICAgdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkuZ2V0UXVhdGVybmlvblJlY3Vyc2l2ZWx5KClcbiAgICAgICk7XG4gICAgICBjb25zdCBleGlzdGVkU2NhbGUgPSBNYXRyaXg0NC5tdWx0aXBseShcbiAgICAgICAgd29ybGRNYXQsXG4gICAgICAgIE1hdHJpeDQ0LnNjYWxlKHRoaXMuX190YXJnZXRTY2FsZUJhY2t1cClcbiAgICAgICkuZ2V0U2NhbGUoKTtcbiAgICAgIGxldCBzY2FsZSA9IFZlY3RvcjQuYWRkKGRlbHRhVmVjdG9yMywgZXhpc3RlZFNjYWxlKTtcbiAgICAgIHNjYWxlID0gVmVjdG9yNC5mcm9tQ29weTQoXG4gICAgICAgIE1hdGgubWF4KHNjYWxlLngsIDAuMDEpLFxuICAgICAgICBNYXRoLm1heChzY2FsZS55LCAwLjAxKSxcbiAgICAgICAgTWF0aC5tYXgoc2NhbGUueiwgMC4wMSksXG4gICAgICAgIE1hdGgubWF4KHNjYWxlLncsIDAuMDEpXG4gICAgICApO1xuICAgICAgdGhpcy5fX2RlbHRhUG9pbnQgPSBNYXRyaXg0NC5tdWx0aXBseShcbiAgICAgICAgTWF0cml4NDQuaW52ZXJ0KHdvcmxkTWF0KSxcbiAgICAgICAgTWF0cml4NDQuc2NhbGUoc2NhbGUpXG4gICAgICApLmdldFNjYWxlKCk7XG4gICAgICB0aGlzLl9fZGVsdGFQb2ludCA9IFZlY3RvcjMuZnJvbUNvcHkzKFxuICAgICAgICBNYXRoLm1heCh0aGlzLl9fZGVsdGFQb2ludC54LCAwLjAxKSxcbiAgICAgICAgTWF0aC5tYXgodGhpcy5fX2RlbHRhUG9pbnQueSwgMC4wMSksXG4gICAgICAgIE1hdGgubWF4KHRoaXMuX19kZWx0YVBvaW50LnosIDAuMDEpXG4gICAgICApO1xuXG4gICAgICAvLyBjb25zdCBwYXJlbnQgPSB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKTtcbiAgICAgIC8vIGxldCB3b3JsZE1hdHJpeCA9IE1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gICAgICAvLyBpZiAoSXMuZXhpc3QocGFyZW50KSkge1xuICAgICAgLy8gICB3b3JsZE1hdHJpeCA9IHBhcmVudC53b3JsZE1hdHJpeC5nZXRSb3RhdGUoKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gY29uc3Qgc2NhbGVWZWMgPSBWZWN0b3IzLm9uZSgpO1xuICAgICAgLy8gbGV0IHJvdE1hdCA9IE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKFxuICAgICAgLy8gICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAwLFxuICAgICAgLy8gICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAxLFxuICAgICAgLy8gICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAyLFxuICAgICAgLy8gICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTEwLFxuICAgICAgLy8gICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTExLFxuICAgICAgLy8gICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTEyLFxuICAgICAgLy8gICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIwLFxuICAgICAgLy8gICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIxLFxuICAgICAgLy8gICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIyXG4gICAgICAvLyApO1xuICAgICAgLy8gcm90TWF0ID0gTWF0cml4MzMudHJhbnNwb3NlKHJvdE1hdCk7XG4gICAgICAvLyBjb25zdCBkZWx0YURlbHRhVmVjdG9yMyA9IFZlY3RvcjMuYWRkKFxuICAgICAgLy8gICB0aGlzLl9fdGFyZ2V0U2NhbGVCYWNrdXAsXG4gICAgICAvLyAgIHJvdE1hdC5tdWx0aXBseVZlY3RvcihkZWx0YVZlY3RvcjMpLFxuICAgICAgLy8gKTtcbiAgICAgIC8vIHRoaXMuX19kZWx0YVBvaW50ID0gZGVsdGFEZWx0YVZlY3RvcjM7XG4gICAgICAvLyB0aGlzLl9fZGVsdGFQb2ludCA9IFZlY3RvcjMuZnJvbUNvcHkzKFxuICAgICAgLy8gICBNYXRoLm1heCh0aGlzLl9fZGVsdGFQb2ludC54LCAwLjAxKSxcbiAgICAgIC8vICAgTWF0aC5tYXgodGhpcy5fX2RlbHRhUG9pbnQueSwgMC4wMSksXG4gICAgICAvLyAgIE1hdGgubWF4KHRoaXMuX19kZWx0YVBvaW50LnosIDAuMDEpXG4gICAgICAvLyApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19vblBvaW50ZXJVcChldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX19pc1BvaW50ZXJEb3duID0gZmFsc2U7XG4gICAgU2NhbGVHaXptby5fX2FjdGl2ZUF4aXMgPSAnbm9uZSc7XG4gICAgSW5wdXRNYW5hZ2VyLmVuYWJsZUNhbWVyYUNvbnRyb2xsZXIoKTtcblxuICAgIGlmIChTY2FsZUdpem1vLl9fbGF0ZXN0VGFyZ2V0RW50aXR5ID09PSB0aGlzLl9fdGFyZ2V0KSB7XG4gICAgICB0aGlzLl9fdGFyZ2V0U2NhbGVCYWNrdXAgPSB0aGlzLl9fdGFyZ2V0LmdldFRyYW5zZm9ybSgpLmxvY2FsU2NhbGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FzdFJheTIoZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZHRoID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgeCA9IGV2dC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHkgPSByZWN0LmhlaWdodCAtIChldnQuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IFZlY3RvcjQuZnJvbUNvcHk0KDAsIDAsIHdpZHRoLCBoZWlnaHQpIGFzIFZlY3RvcjQ7XG4gICAgY29uc3QgYWN0aXZlQ2FtZXJhID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICBDYW1lcmFDb21wb25lbnQuY3VycmVudFxuICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IFNjYWxlR2l6bW8uX19ncm91cEVudGl0eVxuICAgICAgLmdldFNjZW5lR3JhcGgoKVxuICAgICAgLmNhc3RSYXlGcm9tU2NyZWVuKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjAsIFtdKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FzdFJheShldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGNvbnN0IHJlY3QgPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2lkdGggPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWVudEhlaWdodDtcbiAgICBjb25zdCB4ID0gZXZ0LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgeSA9IHJlY3QuaGVpZ2h0IC0gKGV2dC5jbGllbnRZIC0gcmVjdC50b3ApO1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gVmVjdG9yNC5mcm9tQ29weTQoMCwgMCwgd2lkdGgsIGhlaWdodCkgYXMgVmVjdG9yNDtcbiAgICBjb25zdCBhY3RpdmVDYW1lcmEgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgKSBhcyBDYW1lcmFDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgeFJlc3VsdCA9IFNjYWxlR2l6bW8uX194Q3ViZUVudGl0eVxuICAgICAgLmdldFNjZW5lR3JhcGgoKVxuICAgICAgLmNhc3RSYXlGcm9tU2NyZWVuKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjApO1xuICAgIGNvbnN0IHlSZXN1bHQgPSBTY2FsZUdpem1vLl9feUN1YmVFbnRpdHlcbiAgICAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAgIC5jYXN0UmF5RnJvbVNjcmVlbih4LCB5LCBhY3RpdmVDYW1lcmEhLCB2aWV3cG9ydCwgMC4wKTtcbiAgICBjb25zdCB6UmVzdWx0ID0gU2NhbGVHaXptby5fX3pDdWJlRW50aXR5XG4gICAgICAuZ2V0U2NlbmVHcmFwaCgpXG4gICAgICAuY2FzdFJheUZyb21TY3JlZW4oeCwgeSwgYWN0aXZlQ2FtZXJhISwgdmlld3BvcnQsIDAuMCk7XG4gICAgcmV0dXJuIHsgeFJlc3VsdCwgeVJlc3VsdCwgelJlc3VsdCB9O1xuICB9XG5cbiAgX2Rlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKElzLmV4aXN0KHRoaXMuX190b3BFbnRpdHkpKSB7XG4gICAgICB0aGlzLl9fdG9wRW50aXR5Ll9kZXN0cm95KCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9jb3JlL0NvbmZpZyc7XG5pbXBvcnQgeyBBbHBoYU1vZGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9BbHBoYU1vZGUnO1xuaW1wb3J0IHsgUHJpbWl0aXZlTW9kZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1ByaW1pdGl2ZU1vZGUnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2dlb21ldHJ5L1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBDdWJlIH0gZnJvbSAnLi4vZ2VvbWV0cnkvc2hhcGVzL0N1YmUnO1xuaW1wb3J0IHsgUGxhbmUgfSBmcm9tICcuLi9nZW9tZXRyeS9zaGFwZXMvUGxhbmUnO1xuaW1wb3J0IHsgSU1lc2hFbnRpdHksIElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuaW1wb3J0IHsgTWF0ZXJpYWxIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL01hdGVyaWFsSGVscGVyJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQ0JztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbCc7XG5pbXBvcnQgeyBNYXRyaXgzMyB9IGZyb20gJy4uL21hdGgvTWF0cml4MzMnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlTWF0cml4MzMnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IGFzc2VydEV4aXN0IH0gZnJvbSAnLi4vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQge1xuICBnZXRFdmVudCxcbiAgSW5wdXRNYW5hZ2VyLFxuICBJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19UUkFOU0xBVElPTiBhcyBJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19UUkFOU0xBVElPTixcbn0gZnJvbSAnLi4vc3lzdGVtL0lucHV0TWFuYWdlcic7XG5pbXBvcnQgeyBHaXptbyB9IGZyb20gJy4vR2l6bW8nO1xuaW1wb3J0IHsgSVF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IGNyZWF0ZUdyb3VwRW50aXR5IH0gZnJvbSAnLi4vY29tcG9uZW50cy9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcbmltcG9ydCB7IGNyZWF0ZU1lc2hFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9jcmVhdGVNZXNoRW50aXR5JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcblxuZGVjbGFyZSBsZXQgd2luZG93OiBhbnk7XG5cbi8qKlxuICogVHJhbnNsYXRpb24gR2l6bW8gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9uR2l6bW8gZXh0ZW5kcyBHaXptbyB7XG4gIHByaXZhdGUgc3RhdGljIF9fZ3JvdXBFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlRW50aXR5OiBJTWVzaEVudGl0eTtcbiAgcHJpdmF0ZSBzdGF0aWMgX195Q3ViZUVudGl0eTogSU1lc2hFbnRpdHk7XG4gIHByaXZhdGUgc3RhdGljIF9fekN1YmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlTWVzaDogTWVzaDtcbiAgcHJpdmF0ZSBzdGF0aWMgX195Q3ViZU1lc2g6IE1lc2g7XG4gIHByaXZhdGUgc3RhdGljIF9fekN1YmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3lDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3pDdWJlUHJpbWl0aXZlOiBDdWJlO1xuICBwcml2YXRlIHN0YXRpYyBfX3hDdWJlTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX3lDdWJlTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX3pDdWJlTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3l6UGxhbmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3p4UGxhbmVFbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3l6UGxhbmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3p4UGxhbmVNZXNoOiBNZXNoO1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVQcmltaXRpdmU6IFBsYW5lO1xuICBwcml2YXRlIHN0YXRpYyBfX3l6UGxhbmVQcmltaXRpdmU6IFBsYW5lO1xuICBwcml2YXRlIHN0YXRpYyBfX3p4UGxhbmVQcmltaXRpdmU6IFBsYW5lO1xuICBwcml2YXRlIHN0YXRpYyBfX3h5UGxhbmVNYXRlcmlhbDogTWF0ZXJpYWw7XG4gIHByaXZhdGUgc3RhdGljIF9feXpQbGFuZU1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgcHJpdmF0ZSBzdGF0aWMgX196eFBsYW5lTWF0ZXJpYWw6IE1hdGVyaWFsO1xuICBwcml2YXRlIHN0YXRpYyBfX29yaWdpbmFsWCA9IDA7XG4gIHByaXZhdGUgc3RhdGljIF9fb3JpZ2luYWxZID0gMDtcbiAgcHJpdmF0ZSBfX3BpY2tTdGF0ZWRQb2ludCA9IFZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIF9fZGVsdGFQb2ludCA9IFZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIF9fdGFyZ2V0UG9pbnRCYWNrdXAgPSBWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBfX2lzUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19hY3RpdmVBeGlzOiAnbm9uZScgfCAneCcgfCAneScgfCAneicgPSAnbm9uZSc7XG4gIHByaXZhdGUgc3RhdGljIF9fc3BhY2U6ICdsb2NhbCcgfCAnd29ybGQnID0gJ3dvcmxkJztcbiAgcHJpdmF0ZSBfX2xhdGVzdFRhcmdldEVudGl0eT86IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIF9fb25Qb2ludGVyRG93bkZ1bmMgPSB0aGlzLl9fb25Qb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICBwcml2YXRlIF9fb25Qb2ludGVyTW92ZUZ1bmMgPSB0aGlzLl9fb25Qb2ludGVyTW92ZS5iaW5kKHRoaXMpO1xuICBwcml2YXRlIF9fb25Qb2ludGVyVXBGdW5jID0gdGhpcy5fX29uUG9pbnRlclVwLmJpbmQodGhpcyk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19sZW5ndGggPSAxO1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgZ2l6bW8gYmVsb25nIHRvXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IElNZXNoRW50aXR5KSB7XG4gICAgc3VwZXIodGFyZ2V0KTtcbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIEFjY2Vzc29yc1xuICAvLy9cbiAgLy8vXG5cbiAgZ2V0IGlzU2V0dXAoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX190b3BFbnRpdHkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZXQgbGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgVHJhbnNsYXRpb25HaXptby5fX2xlbmd0aCA9IHZhbDtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gVHJhbnNsYXRpb25HaXptby5fX2xlbmd0aDtcbiAgfVxuXG4gIHNldCBpc1Zpc2libGUoZmxnOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX19pc1Zpc2libGUgPT09IGZhbHNlICYmIGZsZyA9PT0gdHJ1ZSkge1xuICAgICAgbGV0IGV2ZW50VGFyZ2V0RG9tID0gd2luZG93O1xuICAgICAgaWYgKElzLmV4aXN0KENvbmZpZy5ldmVudFRhcmdldERvbSkpIHtcbiAgICAgICAgZXZlbnRUYXJnZXREb20gPSBDb25maWcuZXZlbnRUYXJnZXREb207XG4gICAgICB9XG4gICAgICBJbnB1dE1hbmFnZXIucmVnaXN0ZXIoSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fVFJBTlNMQVRJT04sIFtcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogZ2V0RXZlbnQoJ3N0YXJ0JyksXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5fX29uUG9pbnRlckRvd25GdW5jLFxuICAgICAgICAgIG9wdGlvbnM6IHt9LFxuICAgICAgICAgIGNsYXNzSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgZXZlbnRUYXJnZXREb206IGV2ZW50VGFyZ2V0RG9tLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnROYW1lOiBnZXRFdmVudCgnbW92ZScpLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19vblBvaW50ZXJNb3ZlRnVuYyxcbiAgICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgICAgICBjbGFzc0luc3RhbmNlOiB0aGlzLFxuICAgICAgICAgIGV2ZW50VGFyZ2V0RG9tOiBldmVudFRhcmdldERvbSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50TmFtZTogZ2V0RXZlbnQoJ2VuZCcpLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19vblBvaW50ZXJVcEZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge30sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbTogZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudE5hbWU6ICdwb2ludGVybGVhdmUnLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuX19vblBvaW50ZXJVcEZ1bmMsXG4gICAgICAgICAgb3B0aW9uczoge30sXG4gICAgICAgICAgY2xhc3NJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICBldmVudFRhcmdldERvbTogZXZlbnRUYXJnZXREb20sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkhLmdldFNjZW5lR3JhcGgoKS5hZGRDaGlsZChUcmFuc2xhdGlvbkdpem1vLl9fZ3JvdXBFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICAgIHRoaXMuX19sYXRlc3RUYXJnZXRFbnRpdHkgPSB0aGlzLl9fdGFyZ2V0O1xuICAgICAgaWYgKFRyYW5zbGF0aW9uR2l6bW8uX19zcGFjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKS5wYXJlbnQ7XG4gICAgICAgIGxldCBxdWF0ZXJuaW9uOiBJUXVhdGVybmlvbiA9IFF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgICAgICAgaWYgKElzLmV4aXN0KHBhcmVudCkpIHtcbiAgICAgICAgICBxdWF0ZXJuaW9uID0gcGFyZW50LmdldFF1YXRlcm5pb25SZWN1cnNpdmVseSgpO1xuICAgICAgICB9XG4gICAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX19ncm91cEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uID0gcXVhdGVybmlvbjtcbiAgICAgIH0gZWxzZSBpZiAoVHJhbnNsYXRpb25HaXptby5fX3NwYWNlID09PSAnd29ybGQnKSB7XG4gICAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX19ncm91cEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFJvdGF0aW9uID0gUXVhdGVybmlvbi5mcm9tQ29weTQoXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9faXNWaXNpYmxlID09PSB0cnVlICYmIGZsZyA9PT0gZmFsc2UpIHtcbiAgICAgIElucHV0TWFuYWdlci51bnJlZ2lzdGVyKElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1RSQU5TTEFUSU9OKTtcbiAgICAgIHRoaXMuX19kZWx0YVBvaW50ID0gdGhpcy5fX3RhcmdldC5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uO1xuICAgICAgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludCA9IFZlY3RvcjMuemVybygpO1xuICAgICAgdGhpcy5fX2lzUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuX190YXJnZXRQb2ludEJhY2t1cCA9IHRoaXMuX190YXJnZXQuZ2V0VHJhbnNmb3JtKCkubG9jYWxQb3NpdGlvbjtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX19hY3RpdmVBeGlzID0gJ25vbmUnO1xuICAgIH1cblxuICAgIElucHV0TWFuYWdlci5zZXRBY3RpdmUoSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fVFJBTlNMQVRJT04sIGZsZyk7XG5cbiAgICB0aGlzLl9fc2V0VmlzaWJsZShmbGcpO1xuICAgIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgVHJhbnNsYXRpb25HaXptby5fX3p4UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgc2V0U3BhY2Uoc3BhY2U6ICdsb2NhbCcgfCAnd29ybGQnKSB7XG4gICAgVHJhbnNsYXRpb25HaXptby5fX3NwYWNlID0gc3BhY2U7XG4gICAgaWYgKHRoaXMuX19pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzVmlzaWJsZTtcbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIEZyaWVuZHMgTWVtYmVyc1xuICAvLy9cbiAgLy8vXG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBzZXR1cCBlbnRpdGllcyBvZiBHaXptbyBpZiBub3QgZG9uZSB5ZXRcbiAgICovXG4gIF9zZXR1cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX3RvU2tpcFNldHVwKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9fdG9wRW50aXR5ID0gY3JlYXRlR3JvdXBFbnRpdHkoKTtcbiAgICB0aGlzLl9fdG9wRW50aXR5IS50cnlUb1NldFVuaXF1ZU5hbWUoYFRyYW5zbGF0aW9uR2l6bW9fb2ZfJHt0aGlzLl9fdGFyZ2V0LnVuaXF1ZU5hbWV9YCwgdHJ1ZSk7XG4gICAgdGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpIS50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4ID0gdHJ1ZTtcblxuICAgIC8vIGFkZCB0aGlzIHRvcEVudGl0eSB0byB0aGUgdGFyZ2V0IGFzIGdpem1vXG4gICAgdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkuX2FkZEdpem1vQ2hpbGQodGhpcy5fX3RvcEVudGl0eSEuZ2V0U2NlbmVHcmFwaCgpKTtcblxuICAgIC8vIHNldHVwIHRoZSBtZXNoXG4gICAgLy8geFxuICAgIGlmIChJcy5ub3QuZXhpc3QoVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5KSkge1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnVHJhbnNsYXRpb25HaXptb194Q3ViZScsIHRydWUpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5MygxLCAwLCAwKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194Q3ViZU1lc2ggPSBuZXcgTWVzaCgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlTWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feEN1YmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFsxLCAwLCAwLCAxXSlcbiAgICAgICk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feEN1YmVQcmltaXRpdmUgPSBuZXcgQ3ViZSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlUHJpbWl0aXZlLmdlbmVyYXRlKHtcbiAgICAgICAgd2lkdGhWZWN0b3I6IFZlY3RvcjMuZnJvbUNvcHkzKDEsIDAuMDUsIDAuMDUpLFxuICAgICAgICBtYXRlcmlhbDogVHJhbnNsYXRpb25HaXptby5fX3hDdWJlTWF0ZXJpYWwsXG4gICAgICB9KTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194Q3ViZU1lc2guYWRkUHJpbWl0aXZlKFRyYW5zbGF0aW9uR2l6bW8uX194Q3ViZVByaW1pdGl2ZSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feEN1YmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goVHJhbnNsYXRpb25HaXptby5fX3hDdWJlTWVzaCk7XG4gICAgfVxuXG4gICAgLy8geVxuICAgIGlmIChJcy5ub3QuZXhpc3QoVHJhbnNsYXRpb25HaXptby5fX3lDdWJlRW50aXR5KSkge1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3lDdWJlRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnVHJhbnNsYXRpb25HaXptb195Q3ViZScsIHRydWUpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3lDdWJlRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5MygwLCAxLCAwKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX195Q3ViZU1lc2ggPSBuZXcgTWVzaCgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3lDdWJlTWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feUN1YmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLCAxLCAwLCAxXSlcbiAgICAgICk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feUN1YmVQcmltaXRpdmUgPSBuZXcgQ3ViZSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3lDdWJlUHJpbWl0aXZlLmdlbmVyYXRlKHtcbiAgICAgICAgd2lkdGhWZWN0b3I6IFZlY3RvcjMuZnJvbUNvcHkzKDAuMDUsIDEsIDAuMDUpLFxuICAgICAgICBtYXRlcmlhbDogVHJhbnNsYXRpb25HaXptby5fX3lDdWJlTWF0ZXJpYWwsXG4gICAgICB9KTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX195Q3ViZU1lc2guYWRkUHJpbWl0aXZlKFRyYW5zbGF0aW9uR2l6bW8uX195Q3ViZVByaW1pdGl2ZSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feUN1YmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goVHJhbnNsYXRpb25HaXptby5fX3lDdWJlTWVzaCk7XG4gICAgfVxuXG4gICAgLy8gelxuICAgIGlmIChJcy5ub3QuZXhpc3QoVHJhbnNsYXRpb25HaXptby5fX3pDdWJlRW50aXR5KSkge1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3pDdWJlRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnVHJhbnNsYXRpb25HaXptb196Q3ViZScsIHRydWUpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3pDdWJlRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAxKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX196Q3ViZU1lc2ggPSBuZXcgTWVzaCgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3pDdWJlTWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fekN1YmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLCAwLCAxLCAxXSlcbiAgICAgICk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fekN1YmVQcmltaXRpdmUgPSBuZXcgQ3ViZSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3pDdWJlUHJpbWl0aXZlLmdlbmVyYXRlKHtcbiAgICAgICAgd2lkdGhWZWN0b3I6IFZlY3RvcjMuZnJvbUNvcHkzKDAuMDUsIDAuMDUsIDEpLFxuICAgICAgICBtYXRlcmlhbDogVHJhbnNsYXRpb25HaXptby5fX3pDdWJlTWF0ZXJpYWwsXG4gICAgICB9KTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX196Q3ViZU1lc2guYWRkUHJpbWl0aXZlKFRyYW5zbGF0aW9uR2l6bW8uX196Q3ViZVByaW1pdGl2ZSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fekN1YmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goVHJhbnNsYXRpb25HaXptby5fX3pDdWJlTWVzaCk7XG4gICAgfVxuXG4gICAgLy8geHkgUGxhbmVcbiAgICBpZiAoSXMubm90LmV4aXN0KFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lRW50aXR5KSkge1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVFbnRpdHkgPSBjcmVhdGVNZXNoRW50aXR5KCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feEN1YmVFbnRpdHkudHJ5VG9TZXRVbmlxdWVOYW1lKCdUcmFuc2xhdGlvbkdpem1vX3h5UGxhbmUnLCB0cnVlKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgIC8vIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKS50b01ha2VXb3JsZE1hdHJpeFRoZVNhbWVBc0xvY2FsTWF0cml4ID0gdHJ1ZTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lRW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsRXVsZXJBbmdsZXMgPSBWZWN0b3IzLmZyb21Db3B5MyhcbiAgICAgICAgTWF0aFV0aWwuZGVncmVlVG9SYWRpYW4oOTApLFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVNYXRlcmlhbCA9IE1hdGVyaWFsSGVscGVyLmNyZWF0ZUNsYXNzaWNVYmVyTWF0ZXJpYWwoKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lTWF0ZXJpYWwuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLCAwLCAwLjUsIDBdKVxuICAgICAgKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lTWVzaCA9IG5ldyBNZXNoKCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feHlQbGFuZVByaW1pdGl2ZSA9IG5ldyBQbGFuZSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVQcmltaXRpdmUuZ2VuZXJhdGUoe1xuICAgICAgICB3aWR0aDogMTAwMDAwLFxuICAgICAgICBoZWlnaHQ6IDEwMDAwMCxcbiAgICAgICAgdVNwYW46IDEsXG4gICAgICAgIHZTcGFuOiAxLFxuICAgICAgICBpc1VWUmVwZWF0OiB0cnVlLFxuICAgICAgICBmbGlwVGV4dHVyZUNvb3JkaW5hdGVZOiBmYWxzZSxcbiAgICAgICAgbWF0ZXJpYWw6IFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lTWF0ZXJpYWwsXG4gICAgICB9KTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194eVBsYW5lTWVzaC5hZGRQcmltaXRpdmUoVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVQcmltaXRpdmUpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVFbnRpdHkuZ2V0TWVzaCgpLnNldE1lc2goVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVNZXNoKTtcbiAgICB9XG5cbiAgICAvLyB5eiBQbGFuZVxuICAgIGlmIChJcy5ub3QuZXhpc3QoVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVFbnRpdHkpKSB7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZUVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX194Q3ViZUVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoJ1RyYW5zbGF0aW9uR2l6bW9feXpQbGFuZScsIHRydWUpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgLy8gVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLnRvTWFrZVdvcmxkTWF0cml4VGhlU2FtZUFzTG9jYWxNYXRyaXggPSB0cnVlO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxFdWxlckFuZ2xlcyA9IFZlY3RvcjMuZnJvbUNvcHkzKFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICBNYXRoVXRpbC5kZWdyZWVUb1JhZGlhbig5MClcbiAgICAgICk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZU1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlQ2xhc3NpY1ViZXJNYXRlcmlhbCgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVNYXRlcmlhbC5hbHBoYU1vZGUgPSBBbHBoYU1vZGUuQmxlbmQ7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZU1hdGVyaWFsLnNldFBhcmFtZXRlcihcbiAgICAgICAgJ2RpZmZ1c2VDb2xvckZhY3RvcicsXG4gICAgICAgIFZlY3RvcjQuZnJvbUNvcHlBcnJheTQoWzAuNSwgMCwgMCwgMF0pXG4gICAgICApO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVNZXNoID0gbmV3IE1lc2goKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX195elBsYW5lUHJpbWl0aXZlID0gbmV3IFBsYW5lKCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZVByaW1pdGl2ZS5nZW5lcmF0ZSh7XG4gICAgICAgIHdpZHRoOiAxMDAwMDAsXG4gICAgICAgIGhlaWdodDogMTAwMDAwLFxuICAgICAgICB1U3BhbjogMSxcbiAgICAgICAgdlNwYW46IDEsXG4gICAgICAgIGlzVVZSZXBlYXQ6IHRydWUsXG4gICAgICAgIGZsaXBUZXh0dXJlQ29vcmRpbmF0ZVk6IGZhbHNlLFxuICAgICAgICBtYXRlcmlhbDogVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVNYXRlcmlhbCxcbiAgICAgIH0pO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVNZXNoLmFkZFByaW1pdGl2ZShUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZVByaW1pdGl2ZSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZUVudGl0eS5nZXRNZXNoKCkuc2V0TWVzaChUcmFuc2xhdGlvbkdpem1vLl9feXpQbGFuZU1lc2gpO1xuICAgIH1cblxuICAgIC8vIHp4IFBsYW5lXG4gICAgaWYgKElzLm5vdC5leGlzdChUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZUVudGl0eSkpIHtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX196eFBsYW5lRW50aXR5ID0gY3JlYXRlTWVzaEVudGl0eSgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnVHJhbnNsYXRpb25HaXptb196eFBsYW5lJywgdHJ1ZSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICAvLyBWZWN0b3IzLmZyb21Db3B5Myg5MCwgMCwgMCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZU1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlQ2xhc3NpY1ViZXJNYXRlcmlhbCgpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3p4UGxhbmVNYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgICAgICdkaWZmdXNlQ29sb3JGYWN0b3InLFxuICAgICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLCAwLjUsIDAsIDBdKVxuICAgICAgKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX196eFBsYW5lTWF0ZXJpYWwuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3p4UGxhbmVNZXNoID0gbmV3IE1lc2goKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX196eFBsYW5lUHJpbWl0aXZlID0gbmV3IFBsYW5lKCk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZVByaW1pdGl2ZS5nZW5lcmF0ZSh7XG4gICAgICAgIHdpZHRoOiAxMDAwMDAsXG4gICAgICAgIGhlaWdodDogMTAwMDAwLFxuICAgICAgICB1U3BhbjogMSxcbiAgICAgICAgdlNwYW46IDEsXG4gICAgICAgIGlzVVZSZXBlYXQ6IHRydWUsXG4gICAgICAgIGZsaXBUZXh0dXJlQ29vcmRpbmF0ZVk6IGZhbHNlLFxuICAgICAgICBtYXRlcmlhbDogVHJhbnNsYXRpb25HaXptby5fX3p4UGxhbmVNYXRlcmlhbCxcbiAgICAgIH0pO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX3p4UGxhbmVNZXNoLmFkZFByaW1pdGl2ZShUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZVByaW1pdGl2ZSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZUVudGl0eS5nZXRNZXNoKCkuc2V0TWVzaChUcmFuc2xhdGlvbkdpem1vLl9fenhQbGFuZU1lc2gpO1xuICAgIH1cblxuICAgIGlmIChJcy5ub3QuZXhpc3QoVHJhbnNsYXRpb25HaXptby5fX2dyb3VwRW50aXR5KSkge1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX2dyb3VwRW50aXR5ID0gY3JlYXRlR3JvdXBFbnRpdHkoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fdG9wRW50aXR5IS5nZXRTY2VuZUdyYXBoKCkuYWRkQ2hpbGQoVHJhbnNsYXRpb25HaXptby5fX2dyb3VwRW50aXR5LmdldFNjZW5lR3JhcGgoKSk7XG5cbiAgICBUcmFuc2xhdGlvbkdpem1vLl9fZ3JvdXBFbnRpdHlcbiAgICAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAgIC5hZGRDaGlsZChUcmFuc2xhdGlvbkdpem1vLl9feEN1YmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICBUcmFuc2xhdGlvbkdpem1vLl9fZ3JvdXBFbnRpdHlcbiAgICAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAgIC5hZGRDaGlsZChUcmFuc2xhdGlvbkdpem1vLl9feUN1YmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICBUcmFuc2xhdGlvbkdpem1vLl9fZ3JvdXBFbnRpdHlcbiAgICAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAgIC5hZGRDaGlsZChUcmFuc2xhdGlvbkdpem1vLl9fekN1YmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICBUcmFuc2xhdGlvbkdpem1vLl9fZ3JvdXBFbnRpdHlcbiAgICAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAgIC5hZGRDaGlsZChUcmFuc2xhdGlvbkdpem1vLl9feHlQbGFuZUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICAgIFRyYW5zbGF0aW9uR2l6bW8uX19ncm91cEVudGl0eVxuICAgICAgLmdldFNjZW5lR3JhcGgoKVxuICAgICAgLmFkZENoaWxkKFRyYW5zbGF0aW9uR2l6bW8uX195elBsYW5lRW50aXR5LmdldFNjZW5lR3JhcGgoKSk7XG4gICAgVHJhbnNsYXRpb25HaXptby5fX2dyb3VwRW50aXR5XG4gICAgICAuZ2V0U2NlbmVHcmFwaCgpXG4gICAgICAuYWRkQ2hpbGQoVHJhbnNsYXRpb25HaXptby5fX3p4UGxhbmVFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcblxuICAgIHRoaXMuX19sYXRlc3RUYXJnZXRFbnRpdHkgPSB0aGlzLl9fdGFyZ2V0O1xuXG4gICAgdGhpcy5zZXRHaXptb1RhZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB1cGRhdGUgdGhlIHRyYW5zZm9ybSBhbmQgZXRjIG9mIHRoZSBnaXptb1xuICAgKi9cbiAgX3VwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX3RvcEVudGl0eSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNnID0gdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkhO1xuICAgIGNvbnN0IGFhYmIgPSBzZy53b3JsZE1lcmdlZEFBQkJXaXRoU2tlbGV0YWw7XG4gICAgaWYgKGFhYmIuaXNWYW5pbGxhKCkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuZ2V0VHJhbnNmb3JtKCkhLmxvY2FsUG9zaXRpb24gPSBzZy5wb3NpdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3RvcEVudGl0eS5nZXRUcmFuc2Zvcm0oKSEubG9jYWxQb3NpdGlvbiA9IGFhYmIuY2VudGVyUG9pbnQ7XG4gICAgfVxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KGFhYmIuc2l6ZVgsIGFhYmIuc2l6ZVksIGFhYmIuc2l6ZVopO1xuICAgIHRoaXMuX190b3BFbnRpdHkuZ2V0VHJhbnNmb3JtKCkhLmxvY2FsU2NhbGUgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgTWF0aC5taW4oMSwgYWFiYi5pc1ZhbmlsbGEoKSA/IDEgOiBtYXggLyAyKSxcbiAgICAgIE1hdGgubWluKDEsIGFhYmIuaXNWYW5pbGxhKCkgPyAxIDogbWF4IC8gMiksXG4gICAgICBNYXRoLm1pbigxLCBhYWJiLmlzVmFuaWxsYSgpID8gMSA6IG1heCAvIDIpLFxuICAgIF0pO1xuXG4gICAgaWYgKHRoaXMuX19pc1BvaW50ZXJEb3duKSB7XG4gICAgICBpZiAodGhpcy5fX2xhdGVzdFRhcmdldEVudGl0eSA9PT0gdGhpcy5fX3RhcmdldCkge1xuICAgICAgICB0aGlzLl9fdGFyZ2V0LmdldFRyYW5zZm9ybSgpLmxvY2FsUG9zaXRpb24gPSB0aGlzLl9fZGVsdGFQb2ludC5jbG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vL1xuICAvLy9cbiAgLy8vIFByaXZhdGUgU3RhdGljIE1lbWJlcnNcbiAgLy8vXG4gIC8vL1xuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2VuZXJhdGVQcmltaXRpdmUoKTogUHJpbWl0aXZlIHtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgIC8vIFggYXhpc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fX2xlbmd0aCxcbiAgICAgIDAsXG4gICAgICAwLFxuXG4gICAgICAvLyBZIGF4aXNcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB0aGlzLl9fbGVuZ3RoLFxuICAgICAgMCxcblxuICAgICAgLy8gWiBheGlzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHRoaXMuX19sZW5ndGgsXG4gICAgXSk7XG5cbiAgICBjb25zdCBjb2xvciA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgLy8gWCBheGlzIGFzIFJlZFxuICAgICAgMSwgMCwgMCwgMSwgMCwgMCxcblxuICAgICAgLy8gWSBheGlzIGFzIEdyZWVuXG4gICAgICAwLCAxLCAwLCAwLCAxLCAwLFxuXG4gICAgICAvLyBaIGF4aXMgYXMgQmx1ZVxuICAgICAgMCwgMCwgMSwgMCwgMCwgMSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHByaW1pdGl2ZSA9IFByaW1pdGl2ZS5jcmVhdGVQcmltaXRpdmUoe1xuICAgICAgYXR0cmlidXRlU2VtYW50aWNzOiBbVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWiwgVmVydGV4QXR0cmlidXRlLkNvbG9yMC5YWVpdLFxuICAgICAgYXR0cmlidXRlczogW3Bvc2l0aW9ucywgY29sb3JdLFxuICAgICAgcHJpbWl0aXZlTW9kZTogUHJpbWl0aXZlTW9kZS5MaW5lcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICBwcml2YXRlIF9fb25Qb2ludGVyRG93bihldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX19pc1BvaW50ZXJEb3duID0gdHJ1ZTtcbiAgICBUcmFuc2xhdGlvbkdpem1vLl9fb3JpZ2luYWxYID0gZXZ0LmNsaWVudFg7XG4gICAgVHJhbnNsYXRpb25HaXptby5fX29yaWdpbmFsWSA9IGV2dC5jbGllbnRZO1xuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkucGFyZW50O1xuICAgIGxldCB3b3JsZE1hdHJpeCA9IE1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gICAgaWYgKElzLmV4aXN0KHBhcmVudCkpIHtcbiAgICAgIHdvcmxkTWF0cml4ID0gcGFyZW50Lm1hdHJpeElubmVyLmdldFJvdGF0ZSgpO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZVZlYyA9IFZlY3RvcjMub25lKCk7IC8vdGhpcy5fX3RhcmdldC5nZXRTY2VuZUdyYXBoKCkud29ybGRNYXRyaXguZ2V0U2NhbGUoKTtcbiAgICBsZXQgcm90TWF0ID0gTWF0cml4MzMuZnJvbUNvcHk5Um93TWFqb3IoXG4gICAgICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAwLFxuICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMSxcbiAgICAgIHNjYWxlVmVjLnggKiB3b3JsZE1hdHJpeC5tMDIsXG4gICAgICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTEwLFxuICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMSxcbiAgICAgIHNjYWxlVmVjLnkgKiB3b3JsZE1hdHJpeC5tMTIsXG4gICAgICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIwLFxuICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMSxcbiAgICAgIHNjYWxlVmVjLnogKiB3b3JsZE1hdHJpeC5tMjJcbiAgICApO1xuXG4gICAgaWYgKFRyYW5zbGF0aW9uR2l6bW8uX19zcGFjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgcm90TWF0ID0gTWF0cml4MzMudHJhbnNwb3NlKHJvdE1hdCkgYXMgTWF0cml4MzM7XG4gICAgfSBlbHNlIGlmIChUcmFuc2xhdGlvbkdpem1vLl9fc3BhY2UgPT09ICd3b3JsZCcpIHtcbiAgICAgIHJvdE1hdCA9IE11dGFibGVNYXRyaXgzMy5pZGVudGl0eSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeFJlc3VsdCwgeVJlc3VsdCwgelJlc3VsdCB9ID0gVHJhbnNsYXRpb25HaXptby5jYXN0UmF5KGV2dCk7XG4gICAgaWYgKHhSZXN1bHQucmVzdWx0KSB7XG4gICAgICBhc3NlcnRFeGlzdCh4UmVzdWx0LmRhdGEpO1xuICAgICAgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludCA9IHJvdE1hdC5tdWx0aXBseVZlY3Rvcih4UmVzdWx0LmRhdGEucG9zaXRpb24uY2xvbmUoKSk7XG4gICAgICBMb2dnZXIuZGVidWcoJ0Rvd246JyArIHRoaXMuX19waWNrU3RhdGVkUG9pbnQudG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuICAgICAgVHJhbnNsYXRpb25HaXptby5fX2FjdGl2ZUF4aXMgPSAneCc7XG4gICAgfVxuICAgIGlmICh5UmVzdWx0LnJlc3VsdCkge1xuICAgICAgYXNzZXJ0RXhpc3QoeVJlc3VsdC5kYXRhKTtcbiAgICAgIHRoaXMuX19waWNrU3RhdGVkUG9pbnQgPSByb3RNYXQubXVsdGlwbHlWZWN0b3IoeVJlc3VsdC5kYXRhLnBvc2l0aW9uLmNsb25lKCkpO1xuICAgICAgTG9nZ2VyLmRlYnVnKCdEb3duOicgKyB0aGlzLl9fcGlja1N0YXRlZFBvaW50LnRvU3RyaW5nQXBwcm94aW1hdGVseSgpKTtcbiAgICAgIFRyYW5zbGF0aW9uR2l6bW8uX19hY3RpdmVBeGlzID0gJ3knO1xuICAgIH1cbiAgICBpZiAoelJlc3VsdC5yZXN1bHQpIHtcbiAgICAgIGFzc2VydEV4aXN0KHpSZXN1bHQuZGF0YSk7XG4gICAgICB0aGlzLl9fcGlja1N0YXRlZFBvaW50ID0gcm90TWF0Lm11bHRpcGx5VmVjdG9yKHpSZXN1bHQuZGF0YS5wb3NpdGlvbi5jbG9uZSgpKTtcbiAgICAgIExvZ2dlci5kZWJ1ZygnRG93bjonICsgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludC50b1N0cmluZ0FwcHJveGltYXRlbHkoKSk7XG4gICAgICBUcmFuc2xhdGlvbkdpem1vLl9fYWN0aXZlQXhpcyA9ICd6JztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX2xhdGVzdFRhcmdldEVudGl0eSA9PT0gdGhpcy5fX3RhcmdldCkge1xuICAgICAgdGhpcy5fX3RhcmdldFBvaW50QmFja3VwID0gdGhpcy5fX3RhcmdldC5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19vblBvaW50ZXJNb3ZlKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKElzLmZhbHNlKHRoaXMuX19pc1BvaW50ZXJEb3duKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2lkdGggPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWVudEhlaWdodDtcbiAgICBjb25zdCB4ID0gZXZ0LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgeSA9IHJlY3QuaGVpZ2h0IC0gKGV2dC5jbGllbnRZIC0gcmVjdC50b3ApO1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gVmVjdG9yNC5mcm9tQ29weTQoMCwgMCwgd2lkdGgsIGhlaWdodCkgYXMgVmVjdG9yNDtcbiAgICBjb25zdCBhY3RpdmVDYW1lcmEgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgKSBhcyBDYW1lcmFDb21wb25lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9fdGFyZ2V0LmdldFNjZW5lR3JhcGgoKS5wYXJlbnQ7XG4gICAgbGV0IHdvcmxkTWF0cml4ID0gTWF0cml4NDQuaWRlbnRpdHkoKTtcbiAgICBpZiAoSXMuZXhpc3QocGFyZW50KSkge1xuICAgICAgd29ybGRNYXRyaXggPSBwYXJlbnQubWF0cml4SW5uZXIuZ2V0Um90YXRlKCk7XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlVmVjID0gVmVjdG9yMy5vbmUoKTtcbiAgICBsZXQgcm90TWF0ID0gTWF0cml4MzMuZnJvbUNvcHk5Um93TWFqb3IoXG4gICAgICBzY2FsZVZlYy54ICogd29ybGRNYXRyaXgubTAwLFxuICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMSxcbiAgICAgIHNjYWxlVmVjLnggKiB3b3JsZE1hdHJpeC5tMDIsXG4gICAgICBzY2FsZVZlYy55ICogd29ybGRNYXRyaXgubTEwLFxuICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMSxcbiAgICAgIHNjYWxlVmVjLnkgKiB3b3JsZE1hdHJpeC5tMTIsXG4gICAgICBzY2FsZVZlYy56ICogd29ybGRNYXRyaXgubTIwLFxuICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMSxcbiAgICAgIHNjYWxlVmVjLnogKiB3b3JsZE1hdHJpeC5tMjJcbiAgICApO1xuICAgIGlmIChUcmFuc2xhdGlvbkdpem1vLl9fc3BhY2UgPT09ICdsb2NhbCcpIHtcbiAgICAgIHJvdE1hdCA9IE1hdHJpeDMzLnRyYW5zcG9zZShyb3RNYXQpIGFzIE1hdHJpeDMzO1xuICAgIH0gZWxzZSBpZiAoVHJhbnNsYXRpb25HaXptby5fX3NwYWNlID09PSAnd29ybGQnKSB7XG4gICAgICByb3RNYXQgPSBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcbiAgICB9XG4gICAgbGV0IHBpY2tJbk1vdmluZ1BvaW50OiBWZWN0b3IzID0gdGhpcy5fX3BpY2tTdGF0ZWRQb2ludC5jbG9uZSgpO1xuICAgIGlmIChUcmFuc2xhdGlvbkdpem1vLl9fYWN0aXZlQXhpcyA9PT0gJ3gnKSB7XG4gICAgICBjb25zdCB4UmVzdWx0ID0gVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVFbnRpdHlcbiAgICAgICAgLmdldE1lc2goKVxuICAgICAgICAuY2FzdFJheUZyb21TY3JlZW5JbldvcmxkKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjApO1xuICAgICAgaWYgKHhSZXN1bHQucmVzdWx0KSB7XG4gICAgICAgIGFzc2VydEV4aXN0KHhSZXN1bHQuZGF0YSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcm90TWF0Lm11bHRpcGx5VmVjdG9yKHhSZXN1bHQuZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIHBpY2tJbk1vdmluZ1BvaW50ID0gVmVjdG9yMy5mcm9tQ29weTMocG9zaXRpb24ueCwgcGlja0luTW92aW5nUG9pbnQueSwgcGlja0luTW92aW5nUG9pbnQueik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNb3ZlOicgKyB4UmVzdWx0LmRhdGEucG9zaXRpb24udG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuICAgICAgfVxuICAgICAgSW5wdXRNYW5hZ2VyLmRpc2FibGVDYW1lcmFDb250cm9sbGVyKCk7XG4gICAgfVxuICAgIGlmIChUcmFuc2xhdGlvbkdpem1vLl9fYWN0aXZlQXhpcyA9PT0gJ3knKSB7XG4gICAgICBjb25zdCB5UmVzdWx0ID0gVHJhbnNsYXRpb25HaXptby5fX3h5UGxhbmVFbnRpdHlcbiAgICAgICAgLmdldE1lc2goKVxuICAgICAgICAuY2FzdFJheUZyb21TY3JlZW5JbldvcmxkKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjApO1xuICAgICAgaWYgKHlSZXN1bHQucmVzdWx0KSB7XG4gICAgICAgIGFzc2VydEV4aXN0KHlSZXN1bHQuZGF0YSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcm90TWF0Lm11bHRpcGx5VmVjdG9yKHlSZXN1bHQuZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIHBpY2tJbk1vdmluZ1BvaW50ID0gVmVjdG9yMy5mcm9tQ29weTMocGlja0luTW92aW5nUG9pbnQueCwgcG9zaXRpb24ueSwgcGlja0luTW92aW5nUG9pbnQueik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNb3ZlOicgKyB5UmVzdWx0LmRhdGEucG9zaXRpb24udG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuICAgICAgfVxuICAgICAgSW5wdXRNYW5hZ2VyLmRpc2FibGVDYW1lcmFDb250cm9sbGVyKCk7XG4gICAgfVxuICAgIGlmIChUcmFuc2xhdGlvbkdpem1vLl9fYWN0aXZlQXhpcyA9PT0gJ3onKSB7XG4gICAgICBjb25zdCB6UmVzdWx0ID0gVHJhbnNsYXRpb25HaXptby5fX3l6UGxhbmVFbnRpdHlcbiAgICAgICAgLmdldE1lc2goKVxuICAgICAgICAuY2FzdFJheUZyb21TY3JlZW5JbldvcmxkKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjApO1xuICAgICAgaWYgKHpSZXN1bHQucmVzdWx0KSB7XG4gICAgICAgIGFzc2VydEV4aXN0KHpSZXN1bHQuZGF0YSk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcm90TWF0Lm11bHRpcGx5VmVjdG9yKHpSZXN1bHQuZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIHBpY2tJbk1vdmluZ1BvaW50ID0gVmVjdG9yMy5mcm9tQ29weTMocGlja0luTW92aW5nUG9pbnQueCwgcGlja0luTW92aW5nUG9pbnQueSwgcG9zaXRpb24ueik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdNb3ZlOicgKyB6UmVzdWx0LmRhdGEucG9zaXRpb24udG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuICAgICAgfVxuICAgICAgSW5wdXRNYW5hZ2VyLmRpc2FibGVDYW1lcmFDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsdGFWZWN0b3IzID0gVmVjdG9yMy5zdWJ0cmFjdChwaWNrSW5Nb3ZpbmdQb2ludCwgdGhpcy5fX3BpY2tTdGF0ZWRQb2ludCk7XG5cbiAgICBpZiAoZGVsdGFWZWN0b3IzLmxlbmd0aCgpID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTG9nZ2VyLmRlYnVnKGAke3RoaXMuX190YXJnZXQudW5pcXVlTmFtZX06IGAgKyBkZWx0YVZlY3RvcjMudG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkpO1xuXG4gICAgaWYgKFRyYW5zbGF0aW9uR2l6bW8uX19zcGFjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgdGhpcy5fX2RlbHRhUG9pbnQgPSBWZWN0b3IzLmFkZChkZWx0YVZlY3RvcjMsIHRoaXMuX190YXJnZXRQb2ludEJhY2t1cCk7XG4gICAgfSBlbHNlIGlmIChUcmFuc2xhdGlvbkdpem1vLl9fc3BhY2UgPT09ICd3b3JsZCcpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX190YXJnZXQuZ2V0U2NlbmVHcmFwaCgpLnBhcmVudDtcbiAgICAgIGxldCB3b3JsZE1hdHJpeCA9IE1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gICAgICBpZiAoSXMuZXhpc3QocGFyZW50KSkge1xuICAgICAgICB3b3JsZE1hdHJpeCA9IHBhcmVudC5tYXRyaXguZ2V0Um90YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjYWxlVmVjID0gVmVjdG9yMy5vbmUoKTtcbiAgICAgIGxldCByb3RNYXQgPSBNYXRyaXgzMy5mcm9tQ29weTlSb3dNYWpvcihcbiAgICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMCxcbiAgICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMSxcbiAgICAgICAgc2NhbGVWZWMueCAqIHdvcmxkTWF0cml4Lm0wMixcbiAgICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMCxcbiAgICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMSxcbiAgICAgICAgc2NhbGVWZWMueSAqIHdvcmxkTWF0cml4Lm0xMixcbiAgICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMCxcbiAgICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMSxcbiAgICAgICAgc2NhbGVWZWMueiAqIHdvcmxkTWF0cml4Lm0yMlxuICAgICAgKTtcbiAgICAgIHJvdE1hdCA9IE1hdHJpeDMzLnRyYW5zcG9zZShyb3RNYXQpIGFzIE1hdHJpeDMzO1xuICAgICAgY29uc3QgZGVsdGFEZWx0YVZlY3RvcjMgPSBWZWN0b3IzLmFkZChcbiAgICAgICAgdGhpcy5fX3RhcmdldFBvaW50QmFja3VwLFxuICAgICAgICByb3RNYXQubXVsdGlwbHlWZWN0b3IoZGVsdGFWZWN0b3IzKVxuICAgICAgKTtcbiAgICAgIHRoaXMuX19kZWx0YVBvaW50ID0gZGVsdGFEZWx0YVZlY3RvcjM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX29uUG9pbnRlclVwKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fX2lzUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICBUcmFuc2xhdGlvbkdpem1vLl9fYWN0aXZlQXhpcyA9ICdub25lJztcbiAgICBJbnB1dE1hbmFnZXIuZW5hYmxlQ2FtZXJhQ29udHJvbGxlcigpO1xuXG4gICAgaWYgKHRoaXMuX19sYXRlc3RUYXJnZXRFbnRpdHkgPT09IHRoaXMuX190YXJnZXQpIHtcbiAgICAgIHRoaXMuX190YXJnZXRQb2ludEJhY2t1cCA9IHRoaXMuX190YXJnZXQuZ2V0VHJhbnNmb3JtKCkubG9jYWxQb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjYXN0UmF5MihldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGNvbnN0IHJlY3QgPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2lkdGggPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWVudEhlaWdodDtcbiAgICBjb25zdCB4ID0gZXZ0LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgeSA9IHJlY3QuaGVpZ2h0IC0gKGV2dC5jbGllbnRZIC0gcmVjdC50b3ApO1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gVmVjdG9yNC5mcm9tQ29weTQoMCwgMCwgd2lkdGgsIGhlaWdodCkgYXMgVmVjdG9yNDtcbiAgICBjb25zdCBhY3RpdmVDYW1lcmEgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgKSBhcyBDYW1lcmFDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gVHJhbnNsYXRpb25HaXptby5fX2dyb3VwRW50aXR5XG4gICAgICAuZ2V0U2NlbmVHcmFwaCgpXG4gICAgICAuY2FzdFJheUZyb21TY3JlZW4oeCwgeSwgYWN0aXZlQ2FtZXJhISwgdmlld3BvcnQsIDAuMCwgW10pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjYXN0UmF5KGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgY29uc3QgcmVjdCA9IChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3aWR0aCA9IChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHggPSBldnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCB5ID0gcmVjdC5oZWlnaHQgLSAoZXZ0LmNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBWZWN0b3I0LmZyb21Db3B5NCgwLCAwLCB3aWR0aCwgaGVpZ2h0KSBhcyBWZWN0b3I0O1xuICAgIGNvbnN0IGFjdGl2ZUNhbWVyYSA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50KFxuICAgICAgQ2FtZXJhQ29tcG9uZW50LFxuICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnRcbiAgICApIGFzIENhbWVyYUNvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB4UmVzdWx0ID0gVHJhbnNsYXRpb25HaXptby5fX3hDdWJlRW50aXR5XG4gICAgICAuZ2V0TWVzaCgpXG4gICAgICAuY2FzdFJheUZyb21TY3JlZW5JbldvcmxkKHgsIHksIGFjdGl2ZUNhbWVyYSEsIHZpZXdwb3J0LCAwLjApO1xuICAgIGNvbnN0IHlSZXN1bHQgPSBUcmFuc2xhdGlvbkdpem1vLl9feUN1YmVFbnRpdHlcbiAgICAgIC5nZXRNZXNoKClcbiAgICAgIC5jYXN0UmF5RnJvbVNjcmVlbkluV29ybGQoeCwgeSwgYWN0aXZlQ2FtZXJhISwgdmlld3BvcnQsIDAuMCk7XG4gICAgY29uc3QgelJlc3VsdCA9IFRyYW5zbGF0aW9uR2l6bW8uX196Q3ViZUVudGl0eVxuICAgICAgLmdldE1lc2goKVxuICAgICAgLmNhc3RSYXlGcm9tU2NyZWVuSW5Xb3JsZCh4LCB5LCBhY3RpdmVDYW1lcmEhLCB2aWV3cG9ydCwgMC4wKTtcbiAgICByZXR1cm4geyB4UmVzdWx0LCB5UmVzdWx0LCB6UmVzdWx0IH07XG4gIH1cblxuICBfZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy5fX3RvcEVudGl0eSkpIHtcbiAgICAgIHRoaXMuX190b3BFbnRpdHkuX2Rlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQUFCQkdpem1vJztcbmV4cG9ydCAqIGZyb20gJy4vR2l6bW8nO1xuZXhwb3J0ICogZnJvbSAnLi9Mb2NhdG9yR2l6bW8nO1xuZXhwb3J0ICogZnJvbSAnLi9MaWdodEdpem1vJztcbmV4cG9ydCAqIGZyb20gJy4vU2NhbGVHaXptbyc7XG5leHBvcnQgKiBmcm9tICcuL1RyYW5zbGF0aW9uR2l6bW8nO1xuIiwiaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgSVRyYW5zZm9ybUVudGl0eU1ldGhvZHMgfSBmcm9tICcuLi9jb21wb25lbnRzL1RyYW5zZm9ybS9JVHJhbnNmb3JtRW50aXR5JztcbmltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9JU2NlbmVHcmFwaEVudGl0eSc7XG5pbXBvcnQgeyBJTWVzaEVudGl0eU1ldGhvZHMgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2gvSU1lc2hFbnRpdHknO1xuaW1wb3J0IHsgSUNhbWVyYUVudGl0eU1ldGhvZHMgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYS9JQ2FtZXJhRW50aXR5JztcbmltcG9ydCB7IElDYW1lcmFDb250cm9sbGVyRW50aXR5TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhQ29udHJvbGxlci9JQ2FtZXJhQ29udHJvbGxlckVudGl0eSc7XG5pbXBvcnQgeyBJQW5pbWF0aW9uRW50aXR5TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvQW5pbWF0aW9uL0lBbmltYXRpb25FbnRpdHknO1xuaW1wb3J0IHsgSUxpZ2h0RW50aXR5TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvTGlnaHQvSUxpZ2h0RW50aXR5JztcbmltcG9ydCB7IElNZXNoUmVuZGVyZXJFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9NZXNoUmVuZGVyZXIvSU1lc2hSZW5kZXJlckVudGl0eSc7XG5pbXBvcnQgeyBJU2tlbGV0YWxFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9Ta2VsZXRhbC9JU2tlbGV0YWxFbnRpdHknO1xuaW1wb3J0IHsgSVBoeXNpY3NFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9QaHlzaWNzL0lQaHlzaWNzRW50aXR5JztcbmltcG9ydCB7IElCbGVuZFNoYXBlRW50aXR5TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvQmxlbmRTaGFwZS9JQmxlbmRTaGFwZUVudGl0eSc7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgTGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0xpZ2h0L0xpZ2h0Q29tcG9uZW50JztcbmltcG9ydCB7IElDb25zdHJhaW50RW50aXR5TWV0aG9kcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29uc3RyYWludC9JQ29uc3RyYWludEVudGl0eSc7XG5pbXBvcnQgeyBJQW5pbWF0aW9uU3RhdGVFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9BbmltYXRpb25TdGF0ZSc7XG5pbXBvcnQgeyBjcmVhdGVHcm91cEVudGl0eSB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9jcmVhdGVHcm91cEVudGl0eSc7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vY29tcG9uZW50cyc7XG5cbmV4cG9ydCB0eXBlIElUcmFuc2Zvcm1FbnRpdHkgPSBJRW50aXR5ICYgSVRyYW5zZm9ybUVudGl0eU1ldGhvZHM7XG5leHBvcnQgdHlwZSBJU2NlbmVHcmFwaEVudGl0eSA9IElUcmFuc2Zvcm1FbnRpdHkgJiBJU2NlbmVHcmFwaEVudGl0eU1ldGhvZHM7XG5leHBvcnQgdHlwZSBJTWVzaEVudGl0eSA9IElTY2VuZUdyYXBoRW50aXR5ICYgSU1lc2hFbnRpdHlNZXRob2RzICYgSU1lc2hSZW5kZXJlckVudGl0eU1ldGhvZHM7XG5leHBvcnQgdHlwZSBJQ2FtZXJhRW50aXR5ID0gSVNjZW5lR3JhcGhFbnRpdHkgJiBJQ2FtZXJhRW50aXR5TWV0aG9kcztcbmV4cG9ydCB0eXBlIElDYW1lcmFDb250cm9sbGVyRW50aXR5ID0gSUNhbWVyYUVudGl0eSAmIElDYW1lcmFDb250cm9sbGVyRW50aXR5TWV0aG9kcztcbmV4cG9ydCB0eXBlIElTa2VsZXRhbEVudGl0eSA9IElTY2VuZUdyYXBoRW50aXR5ICYgSVNrZWxldGFsRW50aXR5TWV0aG9kcztcbmV4cG9ydCB0eXBlIElMaWdodEVudGl0eSA9IElTY2VuZUdyYXBoRW50aXR5ICYgSUxpZ2h0RW50aXR5TWV0aG9kcztcbmV4cG9ydCB0eXBlIElQaHlzaWNzRW50aXR5ID0gSVNjZW5lR3JhcGhFbnRpdHkgJiBJUGh5c2ljc0VudGl0eU1ldGhvZHM7XG5leHBvcnQgdHlwZSBJQmxlbmRTaGFwZUVudGl0eSA9IElNZXNoRW50aXR5ICYgSUJsZW5kU2hhcGVFbnRpdHlNZXRob2RzO1xuZXhwb3J0IHR5cGUgSUNvbnN0cmFpbnRFbnRpdHkgPSBJU2NlbmVHcmFwaEVudGl0eSAmIElDb25zdHJhaW50RW50aXR5TWV0aG9kcztcbmV4cG9ydCBpbnRlcmZhY2UgSUFuaW1hdGlvbkVudGl0eSBleHRlbmRzIElTY2VuZUdyYXBoRW50aXR5LCBJQW5pbWF0aW9uRW50aXR5TWV0aG9kcyB7fVxuZXhwb3J0IGludGVyZmFjZSBJQW5pbWF0aW9uU3RhdGVFbnRpdHkgZXh0ZW5kcyBJU2NlbmVHcmFwaEVudGl0eSwgSUFuaW1hdGlvblN0YXRlRW50aXR5TWV0aG9kcyB7fVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGlnaHRXaXRoQ2FtZXJhRW50aXR5KCk6IElMaWdodEVudGl0eSAmIElDYW1lcmFFbnRpdHlNZXRob2RzIHtcbiAgY29uc3QgZW50aXR5ID0gY3JlYXRlR3JvdXBFbnRpdHkoKTtcbiAgY29uc3QgZW50aXR5QWRkZWRDb21wb25lbnQgPSBFbnRpdHlSZXBvc2l0b3J5LnRyeVRvQWRkQ29tcG9uZW50VG9FbnRpdHlCeVRJRChcbiAgICBXZWxsS25vd25Db21wb25lbnRUSURzLkxpZ2h0Q29tcG9uZW50VElELFxuICAgIGVudGl0eVxuICApIGFzIElMaWdodEVudGl0eTtcbiAgY29uc3QgZW50aXR5QWRkZWRDb21wb25lbnQyID0gRW50aXR5UmVwb3NpdG9yeS50cnlUb0FkZENvbXBvbmVudFRvRW50aXR5QnlUSUQoXG4gICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5DYW1lcmFDb21wb25lbnRUSUQsXG4gICAgZW50aXR5QWRkZWRDb21wb25lbnRcbiAgKSBhcyBJTGlnaHRFbnRpdHkgJiBJQ2FtZXJhRW50aXR5TWV0aG9kcztcblxuICBlbnRpdHlBZGRlZENvbXBvbmVudDIuZ2V0Q2FtZXJhKCkuaXNTeW5jVG9MaWdodCA9IHRydWU7XG5cbiAgcmV0dXJuIGVudGl0eUFkZGVkQ29tcG9uZW50Mjtcbn1cbiIsImltcG9ydCB7IE1hdGVyaWFsSGVscGVyIH0gZnJvbSAnLi9NYXRlcmlhbEhlbHBlcic7XG5pbXBvcnQgeyBEZXRlY3RIaWdoTHVtaW5hbmNlTWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvbnRlbnRzL0RldGVjdEhpZ2hMdW1pbmFuY2VNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgUmVuZGVyUGFzc0hlbHBlciB9IGZyb20gJy4vUmVuZGVyUGFzc0hlbHBlcic7XG5pbXBvcnQgeyBSZW5kZXJhYmxlSGVscGVyIH0gZnJvbSAnLi9SZW5kZXJhYmxlSGVscGVyJztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuLi9yZW5kZXJlci9SZW5kZXJQYXNzJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbCc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMic7XG5pbXBvcnQgeyBSZW5kZXJUYXJnZXRUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvUmVuZGVyVGFyZ2V0VGV4dHVyZSc7XG5pbXBvcnQgeyBTeW50aGVzaXplSGRyTWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvbnRlbnRzL1N5bnRoZXNpemVIZHJNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL3JlbmRlcmVyL0V4cHJlc3Npb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvQWJzdHJhY3RUZXh0dXJlJztcbmltcG9ydCB7IFZlY3Rvck4gfSBmcm9tICcuLi9tYXRoL1ZlY3Rvck4nO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVGb3JtYXQnO1xuXG5mdW5jdGlvbiBjcmVhdGVCbG9vbUV4cHJlc3Npb24oe1xuICB0ZXh0dXJlVG9CbG9vbSxcbiAgcGFyYW1ldGVyczoge1xuICAgIGx1bWluYW5jZUNyaXRlcmlvbiA9IDEuMCxcbiAgICBnYXVzc2lhbkJsdXJMZXZlbEhpZ2hMdW1pbmFuY2UgPSA0LFxuICAgIGdhdXNzaWFuS2VybmVsU2l6ZSA9IDEwLFxuICAgIGdhdXNzaWFuVmFyaWFuY2UgPSAxMCxcbiAgICBzeW50aGVzaXplQ29lZmZpY2llbnQgPSBbMS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDEuMF0sXG4gICAgLy8gc3ludGhlc2l6ZUNvZWZmaWNpZW50ID0gWzEuMCAvIDIsIDEuMCAvIDQsIDEuMCAvIDgsIDEuMCAvIDE2LCAxLjAgLyAzMiwgMS4wIC8gNjRdLFxuICB9LFxufToge1xuICB0ZXh0dXJlVG9CbG9vbTogQWJzdHJhY3RUZXh0dXJlO1xuICBwYXJhbWV0ZXJzOiB7XG4gICAgbHVtaW5hbmNlQ3JpdGVyaW9uPzogbnVtYmVyO1xuICAgIGdhdXNzaWFuQmx1ckxldmVsSGlnaEx1bWluYW5jZT86IG51bWJlcjtcbiAgICBnYXVzc2lhbktlcm5lbFNpemU/OiBudW1iZXI7XG4gICAgZ2F1c3NpYW5WYXJpYW5jZT86IG51bWJlcjtcbiAgICBzeW50aGVzaXplQ29lZmZpY2llbnQ/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIH07XG59KToge1xuICBibG9vbUV4cHJlc3Npb246IEV4cHJlc3Npb247XG4gIGJsb29tZWRSZW5kZXJUYXJnZXQ6IFJlbmRlclRhcmdldFRleHR1cmU7XG59IHtcbiAgLy8gU2V0dXAgRGV0ZWN0SGlnaEx1bWluYW5jZU1hdGVyaWFsXG4gIGNvbnN0IHJlbmRlclBhc3NEZXRlY3RIaWdoTHVtaW5hbmNlID0gY3JlYXRlUmVuZGVyUGFzc0RldGVjdEhpZ2hMdW1pbmFuY2UoXG4gICAgdGV4dHVyZVRvQmxvb20sXG4gICAgbHVtaW5hbmNlQ3JpdGVyaW9uXG4gICk7XG5cbiAgLy8gU2V0dXAgUmVuZGVyUGFzc2VzIGZvciBHYXVzc2lhbkJsdXJcbiAgY29uc3QgcmVuZGVyUGFzc2VzQmx1cnJlZEhpZ2hMdW1pbmFuY2UgPSBjcmVhdGVSZW5kZXJQYXNzZXNCbHVycmVkSGlnaEx1bWluYW5jZShcbiAgICByZW5kZXJQYXNzRGV0ZWN0SGlnaEx1bWluYW5jZSxcbiAgICBnYXVzc2lhbkJsdXJMZXZlbEhpZ2hMdW1pbmFuY2UsXG4gICAgZ2F1c3NpYW5LZXJuZWxTaXplLFxuICAgIGdhdXNzaWFuVmFyaWFuY2UsXG4gICAgdGV4dHVyZVRvQmxvb20ud2lkdGgsXG4gICAgdGV4dHVyZVRvQmxvb20uaGVpZ2h0XG4gICk7XG5cbiAgLy8gU2V0dXAgU3ludGhlc2l6ZU1hdGVyaWFsXG4gIGNvbnN0IHJlbmRlclBhc3NTeW50aGVzaXplSW1hZ2UgPSBjcmVhdGVSZW5kZXJQYXNzU3ludGhlc2l6ZUltYWdlKFxuICAgIHRleHR1cmVUb0Jsb29tLFxuICAgIHJlbmRlclBhc3Nlc0JsdXJyZWRIaWdoTHVtaW5hbmNlLFxuICAgIHN5bnRoZXNpemVDb2VmZmljaWVudFxuICApO1xuXG4gIC8vIFNldHVwIEV4cHJlc3Npb25cbiAgY29uc3QgZXhwcmVzc2lvbiA9IG5ldyBFeHByZXNzaW9uKCk7XG4gIGV4cHJlc3Npb24uYWRkUmVuZGVyUGFzc2VzKFtcbiAgICByZW5kZXJQYXNzRGV0ZWN0SGlnaEx1bWluYW5jZSxcbiAgICAuLi5yZW5kZXJQYXNzZXNCbHVycmVkSGlnaEx1bWluYW5jZSxcbiAgICByZW5kZXJQYXNzU3ludGhlc2l6ZUltYWdlLFxuICBdKTtcblxuICByZXR1cm4ge1xuICAgIGJsb29tRXhwcmVzc2lvbjogZXhwcmVzc2lvbixcbiAgICBibG9vbWVkUmVuZGVyVGFyZ2V0OiByZW5kZXJQYXNzU3ludGhlc2l6ZUltYWdlLmdldEZyYW1lYnVmZmVyKCkhXG4gICAgICAuY29sb3JBdHRhY2htZW50c1swXSBhcyBSZW5kZXJUYXJnZXRUZXh0dXJlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJQYXNzRGV0ZWN0SGlnaEx1bWluYW5jZSh0ZXh0dXJlOiBBYnN0cmFjdFRleHR1cmUsIGx1bWluYW5jZUNyaXRlcmlvbjogbnVtYmVyKSB7XG4gIGNvbnN0IG1hdGVyaWFsRGV0ZWN0SGlnaEx1bWluYW5jZSA9IE1hdGVyaWFsSGVscGVyLmNyZWF0ZURldGVjdEhpZ2hMdW1pbmFuY2VNYXRlcmlhbChcbiAgICB7IG1heEluc3RhbmNlc051bWJlcjogMSB9LFxuICAgIHRleHR1cmVcbiAgKTtcbiAgbWF0ZXJpYWxEZXRlY3RIaWdoTHVtaW5hbmNlLnNldFBhcmFtZXRlcignbHVtaW5hbmNlQ3JpdGVyaW9uJywgbHVtaW5hbmNlQ3JpdGVyaW9uKTtcbiAgLy8gbWF0ZXJpYWxEZXRlY3RIaWdoTHVtaW5hbmNlLnNldFBhcmFtZXRlcihcbiAgLy8gICBEZXRlY3RIaWdoTHVtaW5hbmNlTWF0ZXJpYWxDb250ZW50Lkx1bWluYW5jZVJlZHVjZSxcbiAgLy8gICBsdW1pbmFuY2VSZWR1Y2VcbiAgLy8gKTtcblxuICBjb25zdCByZW5kZXJQYXNzRGV0ZWN0SGlnaEx1bWluYW5jZSA9IFJlbmRlclBhc3NIZWxwZXIuY3JlYXRlU2NyZWVuRHJhd1JlbmRlclBhc3MoXG4gICAgbWF0ZXJpYWxEZXRlY3RIaWdoTHVtaW5hbmNlXG4gICk7XG4gIHJlbmRlclBhc3NEZXRlY3RIaWdoTHVtaW5hbmNlLnRyeVRvU2V0VW5pcXVlTmFtZSgncmVuZGVyUGFzc0RldGVjdEhpZ2hMdW1pbmFuY2UnLCB0cnVlKTtcblxuICBjb25zdCBmcmFtZWJ1ZmZlckRldGVjdEhpZ2hMdW1pbmFuY2UgPSBSZW5kZXJhYmxlSGVscGVyLmNyZWF0ZUZyYW1lQnVmZmVyKHtcbiAgICB3aWR0aDogdGV4dHVyZS53aWR0aCxcbiAgICBoZWlnaHQ6IHRleHR1cmUuaGVpZ2h0LFxuICAgIHRleHR1cmVOdW06IDEsXG4gICAgdGV4dHVyZUZvcm1hdHM6IFtUZXh0dXJlRm9ybWF0LlJHQkE4XSxcbiAgICBjcmVhdGVEZXB0aEJ1ZmZlcjogZmFsc2UsXG4gIH0pO1xuXG4gIHJlbmRlclBhc3NEZXRlY3RIaWdoTHVtaW5hbmNlLnNldEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyRGV0ZWN0SGlnaEx1bWluYW5jZSk7XG4gIHJldHVybiByZW5kZXJQYXNzRGV0ZWN0SGlnaEx1bWluYW5jZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVuZGVyUGFzc2VzQmx1cnJlZEhpZ2hMdW1pbmFuY2UoXG4gIHJlbmRlclBhc3NIaWdoTHVtaW5hbmNlOiBSZW5kZXJQYXNzLFxuICBnYXVzc2lhbkJsdXJMZXZlbEhpZ2hMdW1pbmFuY2U6IG51bWJlcixcbiAgZ2F1c3NpYW5LZXJuZWxTaXplOiBudW1iZXIsXG4gIGdhdXNzaWFuVmFyaWFuY2U6IG51bWJlcixcbiAgbWF4UmVzb2x1dGlvbldpZHRoOiBudW1iZXIsXG4gIG1heFJlc29sdXRpb25IZWlnaHQ6IG51bWJlclxuKSB7XG4gIGNvbnN0IHJlbmRlclBhc3NlczogUmVuZGVyUGFzc1tdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXVzc2lhbkJsdXJMZXZlbEhpZ2hMdW1pbmFuY2U7IGkrKykge1xuICAgIGNvbnN0IHJlc29sdXRpb25XaWR0aEJsdXIgPSBNYXRoLm1heChtYXhSZXNvbHV0aW9uV2lkdGggPj4gKGkgKyAxKSwgMSk7XG4gICAgY29uc3QgcmVzb2x1dGlvbkhlaWdodEJsdXIgPSBNYXRoLm1heChtYXhSZXNvbHV0aW9uSGVpZ2h0ID4+IChpICsgMSksIDEpO1xuXG4gICAgbGV0IHJlbmRlclBhc3NCbHVySDtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmVuZGVyUGFzc0JsdXJIID0gY3JlYXRlUmVuZGVyUGFzc0dhdXNzaWFuQmx1cihcbiAgICAgICAgcmVuZGVyUGFzc0hpZ2hMdW1pbmFuY2UsXG4gICAgICAgIGdhdXNzaWFuS2VybmVsU2l6ZSxcbiAgICAgICAgZ2F1c3NpYW5WYXJpYW5jZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgcmVzb2x1dGlvbldpZHRoQmx1cixcbiAgICAgICAgcmVzb2x1dGlvbkhlaWdodEJsdXJcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbmRlclBhc3NCbHVySCA9IGNyZWF0ZVJlbmRlclBhc3NHYXVzc2lhbkJsdXIoXG4gICAgICAgIHJlbmRlclBhc3Nlc1tyZW5kZXJQYXNzZXMubGVuZ3RoIC0gMV0sXG4gICAgICAgIGdhdXNzaWFuS2VybmVsU2l6ZSxcbiAgICAgICAgZ2F1c3NpYW5WYXJpYW5jZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgcmVzb2x1dGlvbldpZHRoQmx1cixcbiAgICAgICAgcmVzb2x1dGlvbkhlaWdodEJsdXJcbiAgICAgICk7XG4gICAgfVxuICAgIHJlbmRlclBhc3NCbHVySC50cnlUb1NldFVuaXF1ZU5hbWUoJ3JlbmRlclBhc3NCbHVySF8nICsgaSwgdHJ1ZSk7XG5cbiAgICBjb25zdCByZW5kZXJQYXNzQmx1ckhWID0gY3JlYXRlUmVuZGVyUGFzc0dhdXNzaWFuQmx1cihcbiAgICAgIHJlbmRlclBhc3NCbHVySCxcbiAgICAgIGdhdXNzaWFuS2VybmVsU2l6ZSxcbiAgICAgIGdhdXNzaWFuVmFyaWFuY2UsXG4gICAgICBmYWxzZSxcbiAgICAgIHJlc29sdXRpb25XaWR0aEJsdXIsXG4gICAgICByZXNvbHV0aW9uSGVpZ2h0Qmx1clxuICAgICk7XG4gICAgcmVuZGVyUGFzc0JsdXJIVi50cnlUb1NldFVuaXF1ZU5hbWUoJ3JlbmRlclBhc3NCbHVySFZfJyArIGksIHRydWUpO1xuXG4gICAgcmVuZGVyUGFzc2VzLnB1c2gocmVuZGVyUGFzc0JsdXJILCByZW5kZXJQYXNzQmx1ckhWKTtcbiAgfVxuXG4gIHJldHVybiByZW5kZXJQYXNzZXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlbmRlclBhc3NHYXVzc2lhbkJsdXIoXG4gIHJlbmRlclBhc3NCbHVyVGFyZ2V0OiBSZW5kZXJQYXNzLFxuICBnYXVzc2lhbktlcm5lbFNpemU6IG51bWJlcixcbiAgZ2F1c3NpYW5WYXJpYW5jZTogbnVtYmVyLFxuICBpc0hvcml6b250YWw6IGJvb2xlYW4sXG4gIHJlc29sdXRpb25XaWR0aEJsdXI6IG51bWJlcixcbiAgcmVzb2x1dGlvbkhlaWdodEJsdXI6IG51bWJlclxuKSB7XG4gIGNvbnN0IG1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlR2F1c3NpYW5CbHVyTWF0ZXJpYWwoKTtcblxuICBjb25zdCBnYXVzc2lhbkRpc3RyaWJ1dGlvblJhdGlvID0gTWF0aFV0aWwuY29tcHV0ZUdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lKHtcbiAgICBrZXJuZWxTaXplOiBnYXVzc2lhbktlcm5lbFNpemUsXG4gICAgdmFyaWFuY2U6IGdhdXNzaWFuVmFyaWFuY2UsXG4gIH0pO1xuICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ2dhdXNzaWFuS2VybmVsU2l6ZScsIGdhdXNzaWFuS2VybmVsU2l6ZSk7XG4gIG1hdGVyaWFsLnNldFBhcmFtZXRlcignZ2F1c3NpYW5SYXRpbycsIG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoZ2F1c3NpYW5EaXN0cmlidXRpb25SYXRpbykpKTtcbiAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKFxuICAgICdmcmFtZWJ1ZmZlclNpemUnLFxuICAgIFZlY3RvcjIuZnJvbUNvcHkyKHJlc29sdXRpb25XaWR0aEJsdXIsIHJlc29sdXRpb25IZWlnaHRCbHVyKVxuICApO1xuXG4gIGlmIChpc0hvcml6b250YWwgPT09IGZhbHNlKSB7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdpc0hvcml6b250YWwnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBmcmFtZWJ1ZmZlclRhcmdldCA9IHJlbmRlclBhc3NCbHVyVGFyZ2V0LmdldEZyYW1lYnVmZmVyKCkhO1xuICBjb25zdCBUZXh0dXJlVGFyZ2V0ID0gZnJhbWVidWZmZXJUYXJnZXQuY29sb3JBdHRhY2htZW50c1swXSBhcyBSZW5kZXJUYXJnZXRUZXh0dXJlO1xuICBjb25zdCByZW5kZXJQYXNzID0gUmVuZGVyUGFzc0hlbHBlci5jcmVhdGVTY3JlZW5EcmF3UmVuZGVyUGFzc1dpdGhCYXNlQ29sb3JUZXh0dXJlKFxuICAgIG1hdGVyaWFsLFxuICAgIFRleHR1cmVUYXJnZXRcbiAgKTtcblxuICBjb25zdCBmcmFtZWJ1ZmZlciA9IFJlbmRlcmFibGVIZWxwZXIuY3JlYXRlRnJhbWVCdWZmZXIoe1xuICAgIHdpZHRoOiByZXNvbHV0aW9uV2lkdGhCbHVyLFxuICAgIGhlaWdodDogcmVzb2x1dGlvbkhlaWdodEJsdXIsXG4gICAgdGV4dHVyZU51bTogMSxcbiAgICB0ZXh0dXJlRm9ybWF0czogW1RleHR1cmVGb3JtYXQuUkdCQThdLFxuICAgIGNyZWF0ZURlcHRoQnVmZmVyOiBmYWxzZSxcbiAgfSk7XG4gIHJlbmRlclBhc3Muc2V0RnJhbWVidWZmZXIoZnJhbWVidWZmZXIpO1xuXG4gIHJldHVybiByZW5kZXJQYXNzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJQYXNzU3ludGhlc2l6ZUltYWdlKFxuICB0ZXh0dXJlOiBBYnN0cmFjdFRleHR1cmUsXG4gIHJlbmRlclBhc3Nlc0JsdXJyZWRIaWdoTHVtaW5hbmNlOiBSZW5kZXJQYXNzW10sXG4gIHN5bnRoZXNpemVDb2VmZmljaWVudDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG4pIHtcbiAgY29uc3QgdGV4dHVyZXNTeW50aGVzaXplID0gW3RleHR1cmVdIGFzIEFic3RyYWN0VGV4dHVyZVtdOyAvLyBvcmlnaW5hbCB0ZXh0dXJlXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcmVuZGVyUGFzc2VzQmx1cnJlZEhpZ2hMdW1pbmFuY2UubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB0ZXh0dXJlc1N5bnRoZXNpemUucHVzaChcbiAgICAgIHJlbmRlclBhc3Nlc0JsdXJyZWRIaWdoTHVtaW5hbmNlW2ldLmdldEZyYW1lYnVmZmVyKCkhIC8vIGJsdXJyZWQgdGV4dHVyZXNcbiAgICAgICAgLmNvbG9yQXR0YWNobWVudHNbMF0gYXMgdW5rbm93biBhcyBBYnN0cmFjdFRleHR1cmVcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWF0ZXJpYWxTeW50aGVzaXplVGV4dHVyZXMgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVTeW50aGVzaXplSERSTWF0ZXJpYWwoXG4gICAge1xuICAgICAgbWF4SW5zdGFuY2VzTnVtYmVyOiAxLFxuICAgIH0sXG4gICAgdGV4dHVyZXNTeW50aGVzaXplXG4gICk7XG4gIG1hdGVyaWFsU3ludGhlc2l6ZVRleHR1cmVzLnNldFBhcmFtZXRlcignc3ludGhlc2l6ZUNvZWZmaWNpZW50Jywgc3ludGhlc2l6ZUNvZWZmaWNpZW50KTtcbiAgY29uc3QgcmVuZGVyUGFzc1N5bnRoZXNpemVHbGFyZSA9IFJlbmRlclBhc3NIZWxwZXIuY3JlYXRlU2NyZWVuRHJhd1JlbmRlclBhc3MoXG4gICAgbWF0ZXJpYWxTeW50aGVzaXplVGV4dHVyZXNcbiAgKTtcbiAgcmVuZGVyUGFzc1N5bnRoZXNpemVHbGFyZS50cnlUb1NldFVuaXF1ZU5hbWUoJ3JlbmRlclBhc3NTeW50aGVzaXplR2xhcmUnLCB0cnVlKTtcbiAgY29uc3QgZnJhbWVidWZmZXJTeW50aGVzaXplSW1hZ2VzID0gUmVuZGVyYWJsZUhlbHBlci5jcmVhdGVGcmFtZUJ1ZmZlcih7XG4gICAgd2lkdGg6IHRleHR1cmUud2lkdGgsXG4gICAgaGVpZ2h0OiB0ZXh0dXJlLmhlaWdodCxcbiAgICB0ZXh0dXJlTnVtOiAxLFxuICAgIHRleHR1cmVGb3JtYXRzOiBbVGV4dHVyZUZvcm1hdC5SMTFGX0cxMUZfQjEwRl0sXG4gICAgY3JlYXRlRGVwdGhCdWZmZXI6IGZhbHNlLFxuICB9KTtcbiAgcmVuZGVyUGFzc1N5bnRoZXNpemVHbGFyZS5zZXRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlclN5bnRoZXNpemVJbWFnZXMpO1xuXG4gIHJldHVybiByZW5kZXJQYXNzU3ludGhlc2l6ZUdsYXJlO1xufVxuXG5leHBvcnQgY29uc3QgRXhwcmVzc2lvbkhlbHBlciA9IE9iamVjdC5mcmVlemUoe1xuICBjcmVhdGVCbG9vbUV4cHJlc3Npb24sXG59KTtcbiIsImltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IERlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvbnRlbnRzL0RlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IFNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29udGVudHMvU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudCc7XG5pbXBvcnQgeyBFbnRpdHlVSURPdXRwdXRNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29udGVudHMvRW50aXR5VUlET3V0cHV0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IE1Ub29uTWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvbnRlbnRzL01Ub29uTWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IEN1c3RvbU1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL21hdGVyaWFscy9jb250ZW50cy9DdXN0b21NYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IFByb2Nlc3NTdGFnZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1Byb2Nlc3NTdGFnZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgRnVybmFjZVRlc3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29udGVudHMvRnVybmFjZVRlc3RNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgRGV0ZWN0SGlnaEx1bWluYW5jZU1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL21hdGVyaWFscy9jb250ZW50cy9EZXRlY3RIaWdoTHVtaW5hbmNlTWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IFN5bnRoZXNpemVIZHJNYXRlcmlhbENvbnRlbnQgYXMgU3ludGhlc2l6ZUhEUk1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL21hdGVyaWFscy9jb250ZW50cy9TeW50aGVzaXplSGRyTWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IENvbG9yR3JhZGluZ1VzaW5nTFVUc01hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL21hdGVyaWFscy9jb250ZW50cy9Db2xvckdyYWRpbmdVc2luZ0xVVHNNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgTWF0Q2FwTWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvbnRlbnRzL01hdENhcE1hdGVyaWFsQ29udGVudCc7XG5pbXBvcnQgeyBWYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29udGVudHMvVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljTWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElNZXNoUmVuZGVyZXJFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9NZXNoUmVuZGVyZXIvSU1lc2hSZW5kZXJlckVudGl0eSc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7IFZlY3Rvck4gfSBmcm9tICcuLi9tYXRoL1ZlY3Rvck4nO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IENsYXNzaWNTaW5nbGVTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvQ2xhc3NpY1NpbmdsZVNoYWRlci9DbGFzc2ljU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IENsYXNzaWNTaW5nbGVTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9DbGFzc2ljU2luZ2xlU2hhZGVyL0NsYXNzaWNTaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgQ2xhc3NpY1NpbmdsZVNoYWRlclZlcnRleFdlYkdwdSBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvQ2xhc3NpY1NpbmdsZVNoYWRlci9DbGFzc2ljU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IENsYXNzaWNTaW5nbGVTaGFkZXJGcmFnbWVudFdlYmdwdSBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvQ2xhc3NpY1NpbmdsZVNoYWRlci9DbGFzc2ljU2luZ2xlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IHBiclNpbmdsZVNoYWRlclZlcnRleCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QYnJTaW5nbGVTaGFkZXIvUGJyU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IHBiclNpbmdsZVNoYWRlckZyYWdtZW50IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1BiclNpbmdsZVNoYWRlci9QYnJTaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgcGJyU2luZ2xlU2hhZGVyVmVydGV4V2ViR3B1IGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9QYnJTaW5nbGVTaGFkZXIvUGJyU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IHBiclNpbmdsZVNoYWRlckZyYWdtZW50V2ViR3B1IGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9QYnJTaW5nbGVTaGFkZXIvUGJyU2luZ2xlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IEVudkNvbnN0YW50U2luZ2xlU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEVudkNvbnN0YW50U2luZ2xlU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRW52Q29uc3RhbnRTaW5nbGVTaGFkZXIvRW52Q29uc3RhbnRTaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgRW52Q29uc3RhbnRTaW5nbGVTaGFkZXJWZXJ0ZXhXZWJHcHUgZnJvbSAnLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEVudkNvbnN0YW50U2luZ2xlU2hhZGVyRnJhZ21lbnRXZWJHcHUgZnJvbSAnLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyL0VudkNvbnN0YW50U2luZ2xlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IEZYQUEzUXVhbGl0eVNoYWRlclZlcnRleCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9GWEFBM1F1YWxpdHlTaGFkZXIvRlhBQTNRdWFsaXR5U2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEZYQUEzUXVhbGl0eVNoYWRlckZyYWdtZW50IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0ZYQUEzUXVhbGl0eVNoYWRlci9GWEFBM1F1YWxpdHlTaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgR2FtbWFDb3JyZWN0aW9uU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlci9HYW1tYUNvcnJlY3Rpb25TaGFkZXIudmVydCc7XG5pbXBvcnQgR2FtbWFDb3JyZWN0aW9uU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvR2FtbWFDb3JyZWN0aW9uU2hhZGVyL0dhbW1hQ29ycmVjdGlvblNoYWRlci5mcmFnJztcbmltcG9ydCBHYW1tYUNvcnJlY3Rpb25TaGFkZXJWZXJ0ZXhXZWJHcHUgZnJvbSAnLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlci9HYW1tYUNvcnJlY3Rpb25TaGFkZXIudmVydCc7XG5pbXBvcnQgR2FtbWFDb3JyZWN0aW9uU2hhZGVyRnJhZ21lbnRXZWJHcHUgZnJvbSAnLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlci9HYW1tYUNvcnJlY3Rpb25TaGFkZXIuZnJhZyc7XG5pbXBvcnQgVG9uZU1hcHBpbmdTaGFkZXJWZXJ0ZXhHTFNMIGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1RvbmVNYXBwaW5nU2hhZGVyL1RvbmVNYXBwaW5nU2hhZGVyLnZlcnQnO1xuaW1wb3J0IFRvbmVNYXBwaW5nU2hhZGVyRnJhZ21lbnRHTFNMIGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1RvbmVNYXBwaW5nU2hhZGVyL1RvbmVNYXBwaW5nU2hhZGVyLmZyYWcnO1xuaW1wb3J0IFRvbmVNYXBwaW5nU2hhZGVyVmVydGV4V0dTTCBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvVG9uZU1hcHBpbmdTaGFkZXIvVG9uZU1hcHBpbmdTaGFkZXIudmVydC53Z3NsJztcbmltcG9ydCBUb25lTWFwcGluZ1NoYWRlckZyYWdtZW50V0dTTCBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvVG9uZU1hcHBpbmdTaGFkZXIvVG9uZU1hcHBpbmdTaGFkZXIuZnJhZy53Z3NsJztcbmltcG9ydCBTdW1tZWRBcmVhVGFibGVTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvU3VtbWVkQXJlYVRhYmxlU2hhZGVyL1N1bW1lZEFyZWFUYWJsZVNoYWRlci52ZXJ0JztcbmltcG9ydCBTdW1tZWRBcmVhVGFibGVTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9TdW1tZWRBcmVhVGFibGVTaGFkZXIvU3VtbWVkQXJlYVRhYmxlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IEZsYXRTaW5nbGVTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRmxhdFNpbmdsZVNoYWRlci9GbGF0U2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEZsYXRTaW5nbGVTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9GbGF0U2luZ2xlU2hhZGVyL0ZsYXRTaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgRmxhdFNpbmdsZVNoYWRlclZlcnRleFdlYkdwdSBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvRmxhdFNpbmdsZVNoYWRlci9GbGF0U2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEZsYXRTaW5nbGVTaGFkZXJGcmFnbWVudFdlYkdwdSBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvRmxhdFNpbmdsZVNoYWRlci9GbGF0U2luZ2xlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IERlcHRoTW9tZW50RW5jb2RlU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0RlcHRoTW9tZW50RW5jb2RlU2hhZGVyL0RlcHRoTW9tZW50RW5jb2RlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IERlcHRoTW9tZW50RW5jb2RlU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGVwdGhNb21lbnRFbmNvZGVTaGFkZXIvRGVwdGhNb21lbnRFbmNvZGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgeyBNYXRlcmlhbFJlcG9zaXRvcnkgfSBmcm9tICcuLi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgVnJtMHhNYXRlcmlhbFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHtcbiAgZHVtbXlBbmlzb3Ryb3B5VGV4dHVyZSxcbiAgZHVtbXlCbGFja1RleHR1cmUsXG4gIGR1bW15Qmx1ZVRleHR1cmUsXG4gIGR1bW15V2hpdGVUZXh0dXJlLFxuICBzaGVlbkx1dFRleHR1cmUsXG59IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL0R1bW15VGV4dHVyZXMnO1xuaW1wb3J0IEdhdXNzaWFuQmx1clNpbmdsZVNoYWRlclZlcnRleCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9HYXVzc2lhbkJsdXJTaGFkZXIvR2F1c3NpYW5CbHVyU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEdhdXNzaWFuQmx1clNpbmdsZVNoYWRlckZyYWdtZW50IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0dhdXNzaWFuQmx1clNoYWRlci9HYXVzc2lhbkJsdXJTaGFkZXIuZnJhZyc7XG5pbXBvcnQgR2F1c3NpYW5CbHVyU2luZ2xlU2hhZGVyVmVydGV4V2ViR3B1IGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9HYXVzc2lhbkJsdXJTaGFkZXIvR2F1c3NpYW5CbHVyU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEdhdXNzaWFuQmx1clNpbmdsZVNoYWRlckZyYWdtZW50V2ViR3B1IGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9HYXVzc2lhbkJsdXJTaGFkZXIvR2F1c3NpYW5CbHVyU2hhZGVyLmZyYWcnO1xuaW1wb3J0IEdhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aFNpbmdsZVNoYWRlclZlcnRleCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9HYXVzc2lhbkJsdXJGb3JFbmNvZGVkRGVwdGhTaGFkZXIvR2F1c3NpYW5CbHVyRm9yRW5jb2RlZERlcHRoU2hhZGVyLnZlcnQnO1xuaW1wb3J0IEdhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aFNpbmdsZVNoYWRlckZyYWdtZW50IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0dhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aFNoYWRlci9HYXVzc2lhbkJsdXJGb3JFbmNvZGVkRGVwdGhTaGFkZXIuZnJhZyc7XG5pbXBvcnQgUGFub3JhbWFUb0N1YmVTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvUGFub3JhbWFUb0N1YmVTaGFkZXIvUGFub3JhbWFUb0N1YmVTaGFkZXIudmVydCc7XG5pbXBvcnQgUGFub3JhbWFUb0N1YmVTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QYW5vcmFtYVRvQ3ViZVNoYWRlci9QYW5vcmFtYVRvQ3ViZVNoYWRlci5mcmFnJztcbmltcG9ydCBQYW5vcmFtYVRvQ3ViZVNoYWRlclZlcnRleFdlYkdwdSBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvUGFub3JhbWFUb0N1YmVTaGFkZXIvUGFub3JhbWFUb0N1YmVTaGFkZXIudmVydC53Z3NsJztcbmltcG9ydCBQYW5vcmFtYVRvQ3ViZVNoYWRlckZyYWdtZW50V2ViR3B1IGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9QYW5vcmFtYVRvQ3ViZVNoYWRlci9QYW5vcmFtYVRvQ3ViZVNoYWRlci5mcmFnLndnc2wnO1xuaW1wb3J0IFByZWZpbHRlcklCTFNoYWRlclZlcnRleCBmcm9tICcuLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9QcmVmaWx0ZXJJQkxTaGFkZXIvUHJlZmlsdGVySUJMU2hhZGVyLnZlcnQnO1xuaW1wb3J0IFByZWZpbHRlcklCTFNoYWRlckZyYWdtZW50IGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1ByZWZpbHRlcklCTFNoYWRlci9QcmVmaWx0ZXJJQkxTaGFkZXIuZnJhZyc7XG5pbXBvcnQgUHJlZmlsdGVySUJMU2hhZGVyVmVydGV4V2ViR3B1IGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9QcmVmaWx0ZXJJQkxTaGFkZXIvUHJlZmlsdGVySUJMU2hhZGVyLnZlcnQud2dzbCc7XG5pbXBvcnQgUHJlZmlsdGVySUJMU2hhZGVyRnJhZ21lbnRXZWJHcHUgZnJvbSAnLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL1ByZWZpbHRlcklCTFNoYWRlci9QcmVmaWx0ZXJJQkxTaGFkZXIuZnJhZy53Z3NsJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL21hdGgvU2NhbGFyJztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCwgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuXG5mdW5jdGlvbiBjcmVhdGVNYXRlcmlhbChcbiAgbWF0ZXJpYWxOYW1lOiBzdHJpbmcsXG4gIG1hdGVyaWFsTm9kZTogQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQsXG4gIG1heEluc3RhbmNlc051bWJlcj86IENvdW50XG4pOiBNYXRlcmlhbCB7XG4gIGxldCBncm91cCA9IDA7XG4gIGxldCBpc0Z1bGwgPSBmYWxzZTtcbiAgZG8ge1xuICAgIGNvbnN0IGFjdHVhbE1hdGVyaWFsTmFtZSA9IG1hdGVyaWFsTmFtZSArIGBfXyR7Z3JvdXB9YDtcbiAgICBpc0Z1bGwgPSBNYXRlcmlhbFJlcG9zaXRvcnkuaXNGdWxsT3JPdmVyT2ZUaGlzTWF0ZXJpYWxUeXBlKGFjdHVhbE1hdGVyaWFsTmFtZSk7XG4gICAgaWYgKCFpc0Z1bGwpIHtcbiAgICAgIE1hdGVyaWFsUmVwb3NpdG9yeS5yZWdpc3Rlck1hdGVyaWFsKGFjdHVhbE1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIhKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gTWF0ZXJpYWxSZXBvc2l0b3J5LmNyZWF0ZU1hdGVyaWFsKGFjdHVhbE1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlKTtcbiAgICAgIHJldHVybiBtYXRlcmlhbDtcbiAgICB9XG4gICAgZ3JvdXArKztcbiAgfSB3aGlsZSAoaXNGdWxsKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgbWF0ZXJpYWwnKTtcbn1cblxudHlwZSBNYXRlcmlhbFR5cGVOYW1lID0gc3RyaW5nO1xudHlwZSBDaGFuZ2VDb3VudCA9IG51bWJlcjtcbmxldCBsYXN0Q2hhbmdlQ291bnRNYXAgPSBuZXcgTWFwPE1hdGVyaWFsVHlwZU5hbWUsIENoYW5nZUNvdW50PigpO1xuZnVuY3Rpb24gcmV1c2VPclJlY3JlYXRlTWF0ZXJpYWwoXG4gIG1hdGVyaWFsTmFtZTogc3RyaW5nLFxuICBjdXJyZW50TWF0ZXJpYWw6IE1hdGVyaWFsLFxuICBtYXRlcmlhbE5vZGU6IEFic3RyYWN0TWF0ZXJpYWxDb250ZW50LFxuICBtYXhJbnN0YW5jZXNOdW1iZXI6IENvdW50XG4pOiBNYXRlcmlhbCB7XG4gIGxldCBtYXRlcmlhbCA9IGN1cnJlbnRNYXRlcmlhbDtcbiAgaWYgKE1hdGVyaWFsUmVwb3NpdG9yeS5pc01hdGVyaWFsQ29tcGF0aWJsZShtYXRlcmlhbCwgbWF0ZXJpYWxOb2RlKSkge1xuICAgIG1hdGVyaWFsLl9tYXRlcmlhbENvbnRlbnQgPSBtYXRlcmlhbE5vZGU7XG4gICAgbWF0ZXJpYWwubWFrZVNoYWRlcnNJbnZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIG1hdGVyaWFsO1xuICB9IGVsc2Uge1xuICAgIGxldCBjaGFuZ2VDb3VudCA9IDA7XG4gICAgY29uc3QgbGFzdENoYW5nZUNvdW50ID0gbGFzdENoYW5nZUNvdW50TWFwLmdldChtYXRlcmlhbE5hbWUpO1xuICAgIGlmIChsYXN0Q2hhbmdlQ291bnQgIT0gbnVsbCkge1xuICAgICAgY2hhbmdlQ291bnQgPSBsYXN0Q2hhbmdlQ291bnQ7XG4gICAgfVxuICAgIGNvbnN0IGFjdHVhbE1hdGVyaWFsTmFtZSA9IG1hdGVyaWFsTmFtZSArIGBfX18ke2NoYW5nZUNvdW50Kyt9YDtcbiAgICBsYXN0Q2hhbmdlQ291bnRNYXAuc2V0KG1hdGVyaWFsTmFtZSwgY2hhbmdlQ291bnQpO1xuICAgIE1hdGVyaWFsUmVwb3NpdG9yeS5yZWdpc3Rlck1hdGVyaWFsKGFjdHVhbE1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuICAgIG1hdGVyaWFsID0gTWF0ZXJpYWxSZXBvc2l0b3J5LmNyZWF0ZU1hdGVyaWFsKGFjdHVhbE1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlKTtcbiAgICByZXR1cm4gbWF0ZXJpYWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjcmVhdGVNYXRlcmlhbChcbiAgbWF0ZXJpYWxOYW1lOiBzdHJpbmcsXG4gIG1hdGVyaWFsTm9kZTogQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQsXG4gIG1heEluc3RhbmNlc051bWJlcj86IENvdW50XG4pOiBNYXRlcmlhbCB7XG4gIE1hdGVyaWFsUmVwb3NpdG9yeS5mb3JjZVJlZ2lzdGVyTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlciEpO1xuXG4gIGNvbnN0IG1hdGVyaWFsID0gTWF0ZXJpYWxSZXBvc2l0b3J5LmNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlKTtcbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYnJVYmVyTWF0ZXJpYWwoe1xuICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICBpc01vcnBoaW5nID0gdHJ1ZSxcbiAgaXNTa2lubmluZyA9IHRydWUsXG4gIGlzTGlnaHRpbmcgPSB0cnVlLFxuICBpc0NsZWFyQ29hdCA9IGZhbHNlLFxuICBpc1RyYW5zbWlzc2lvbiA9IGZhbHNlLFxuICBpc1ZvbHVtZSA9IGZhbHNlLFxuICBpc1NoZWVuID0gZmFsc2UsXG4gIGlzU3BlY3VsYXIgPSBmYWxzZSxcbiAgaXNJcmlkZXNjZW5jZSA9IGZhbHNlLFxuICBpc0FuaXNvdHJvcHkgPSBmYWxzZSxcbiAgaXNTaGFkb3cgPSBmYWxzZSxcbiAgdXNlVGFuZ2VudEF0dHJpYnV0ZSA9IGZhbHNlLFxuICB1c2VOb3JtYWxUZXh0dXJlID0gdHJ1ZSxcbiAgbWF4SW5zdGFuY2VzTnVtYmVyID0gQ29uZmlnLm1heE1hdGVyaWFsSW5zdGFuY2VGb3JFYWNoVHlwZSxcbn0gPSB7fSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPVxuICAgICdQYnJVYmVyJyArXG4gICAgYF8ke2FkZGl0aW9uYWxOYW1lfV9gICtcbiAgICAoaXNNb3JwaGluZyA/ICcrbW9ycGhpbmcnIDogJycpICtcbiAgICAoaXNTa2lubmluZyA/ICcrc2tpbm5pbmcnIDogJycpICtcbiAgICAoaXNMaWdodGluZyA/ICcnIDogJy1saWdodGluZycpICtcbiAgICAoaXNDbGVhckNvYXQgPyAnK2NsZWFyY29hdCcgOiAnJykgK1xuICAgIChpc1RyYW5zbWlzc2lvbiA/ICcrdHJhbnNtaXNzaW9uJyA6ICcnKSArXG4gICAgKGlzVm9sdW1lID8gJyt2b2x1bWUnIDogJycpICtcbiAgICAoaXNTaGVlbiA/ICcrc2hlZW4nIDogJycpICtcbiAgICAoaXNTcGVjdWxhciA/ICcrc3BlY3VsYXInIDogJycpICtcbiAgICAoaXNJcmlkZXNjZW5jZSA/ICcraXJpZGVzY2VuY2UnIDogJycpICtcbiAgICAoaXNBbmlzb3Ryb3B5ID8gJythbmlzb3Ryb3B5JyA6ICcnKSArXG4gICAgKHVzZVRhbmdlbnRBdHRyaWJ1dGUgPyAnK3RhbmdlbnRBdHRyaWJ1dGUnIDogJycpICtcbiAgICAodXNlTm9ybWFsVGV4dHVyZSA/ICcnIDogJy1ub3JtYWxUZXh0dXJlJyk7XG5cbiAgbGV0IGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm86IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtdO1xuICBpZiAodHJ1ZSkge1xuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8gPSBbXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgSW50MzJBcnJheShDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcikpLFxuICAgICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ21vcnBoV2VpZ2h0cycsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyKSksXG4gICAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IHNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XG4gICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhcixcbiAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgIHdyYXBUOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICB9KTtcblxuICBsZXQgdGV4dHVyZVNsb3RJZHggPSA4O1xuICBpZiAoaXNDbGVhckNvYXQpIHtcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goe1xuICAgICAgc2VtYW50aWM6ICdjbGVhckNvYXRUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBkdW1teVdoaXRlVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgfSk7XG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mby5wdXNoKHtcbiAgICAgIHNlbWFudGljOiAnY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZScsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBbdGV4dHVyZVNsb3RJZHgrKywgZHVtbXlXaGl0ZVRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH0pO1xuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8ucHVzaCh7XG4gICAgICBzZW1hbnRpYzogJ2NsZWFyQ29hdE5vcm1hbFRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogW3RleHR1cmVTbG90SWR4KyssIGR1bW15Qmx1ZVRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzVHJhbnNtaXNzaW9uKSB7XG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mby5wdXNoKHtcbiAgICAgIHNlbWFudGljOiAndHJhbnNtaXNzaW9uVGV4dHVyZScsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBbdGV4dHVyZVNsb3RJZHgrKywgZHVtbXlXaGl0ZVRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH0pO1xuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8ucHVzaCh7XG4gICAgICBzZW1hbnRpYzogJ2JhY2tCdWZmZXJUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNWb2x1bWUpIHtcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goe1xuICAgICAgc2VtYW50aWM6ICd0aGlja25lc3NUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBkdW1teVdoaXRlVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNTaGVlbikge1xuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8ucHVzaCh7XG4gICAgICBzZW1hbnRpYzogJ3NoZWVuQ29sb3JUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBkdW1teVdoaXRlVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgfSk7XG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mby5wdXNoKHtcbiAgICAgIHNlbWFudGljOiAnc2hlZW5Sb3VnaG5lc3NUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBkdW1teVdoaXRlVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgfSk7XG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mby5wdXNoKHtcbiAgICAgIHNlbWFudGljOiAnc2hlZW5MdXRUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBzaGVlbkx1dFRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzU3BlY3VsYXIpIHtcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goe1xuICAgICAgc2VtYW50aWM6ICdzcGVjdWxhclRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogW3RleHR1cmVTbG90SWR4KyssIGR1bW15V2hpdGVUZXh0dXJlLCBzYW1wbGVyXSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICB9KTtcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goe1xuICAgICAgc2VtYW50aWM6ICdzcGVjdWxhckNvbG9yVGV4dHVyZScsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBbdGV4dHVyZVNsb3RJZHgrKywgZHVtbXlXaGl0ZVRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzSXJpZGVzY2VuY2UpIHtcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goe1xuICAgICAgc2VtYW50aWM6ICdpcmlkZXNjZW5jZVRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogW3RleHR1cmVTbG90SWR4KyssIGR1bW15V2hpdGVUZXh0dXJlLCBzYW1wbGVyXSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICB9KTtcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goe1xuICAgICAgc2VtYW50aWM6ICdpcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogW3RleHR1cmVTbG90SWR4KyssIGR1bW15V2hpdGVUZXh0dXJlLCBzYW1wbGVyXSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICB9KTtcbiAgfVxuICBpZiAoaXNBbmlzb3Ryb3B5KSB7XG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mby5wdXNoKHtcbiAgICAgIHNlbWFudGljOiAnYW5pc290cm9weVRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogW3RleHR1cmVTbG90SWR4KyssIGR1bW15QW5pc290cm9weVRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzU2hhZG93KSB7XG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mby5wdXNoKHtcbiAgICAgIHNlbWFudGljOiAnZGVwdGhUZXh0dXJlJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFt0ZXh0dXJlU2xvdElkeCsrLCBkdW1teVdoaXRlVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgQ3VzdG9tTWF0ZXJpYWxDb250ZW50KHtcbiAgICBuYW1lOiBtYXRlcmlhbE5hbWUsXG4gICAgaXNTa2lubmluZyxcbiAgICBpc0xpZ2h0aW5nLFxuICAgIGlzTW9ycGhpbmcsXG4gICAgdmVydGV4U2hhZGVyOiBwYnJTaW5nbGVTaGFkZXJWZXJ0ZXgsXG4gICAgcGl4ZWxTaGFkZXI6IHBiclNpbmdsZVNoYWRlckZyYWdtZW50LFxuICAgIHZlcnRleFNoYWRlcldlYkdwdTogcGJyU2luZ2xlU2hhZGVyVmVydGV4V2ViR3B1LFxuICAgIHBpeGVsU2hhZGVyV2ViR3B1OiBwYnJTaW5nbGVTaGFkZXJGcmFnbWVudFdlYkdwdSxcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLFxuICB9KTtcblxuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIGlmIChpc0xpZ2h0aW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19MSUdIVElORycpO1xuICB9XG4gIGlmIChpc1NoYWRvdykge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX1NIQURPV19NQVBQSU5HJyk7XG4gIH1cbiAgaWYgKHVzZU5vcm1hbFRleHR1cmUpIHtcbiAgICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9OT1JNQUxfVEVYVFVSRScpO1xuICB9XG4gIGlmIChpc0NsZWFyQ29hdCkge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX0NMRUFSQ09BVCcpO1xuICB9XG4gIGlmIChpc1RyYW5zbWlzc2lvbikge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX1RSQU5TTUlTU0lPTicpO1xuICB9XG4gIGlmIChpc1ZvbHVtZSkge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX1ZPTFVNRScpO1xuICB9XG4gIGlmIChpc1NoZWVuKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9VU0VfU0hFRU4nKTtcbiAgfVxuICBpZiAoaXNTcGVjdWxhcikge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX1NQRUNVTEFSJyk7XG4gIH1cbiAgaWYgKGlzSXJpZGVzY2VuY2UpIHtcbiAgICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9JUklERVNDRU5DRScpO1xuICB9XG4gIGlmIChpc0FuaXNvdHJvcHkpIHtcbiAgICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9BTklTT1RST1BZJyk7XG4gIH1cblxuICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX0lTX1NLSU5OSU5HJyk7XG5cbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKHtcbiAgYWRkaXRpb25hbE5hbWUgPSAnJyxcbiAgaXNTa2lubmluZyA9IHRydWUsXG4gIGlzTGlnaHRpbmcgPSBmYWxzZSxcbiAgaXNNb3JwaGluZyA9IGZhbHNlLFxuICBpc1NoYWRvdyA9IGZhbHNlLFxuICBtYXhJbnN0YW5jZXNOdW1iZXIgPSBDb25maWcubWF4TWF0ZXJpYWxJbnN0YW5jZUZvckVhY2hUeXBlLFxufSA9IHt9KSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9XG4gICAgJ0NsYXNzaWNVYmVyJyArXG4gICAgYF8ke2FkZGl0aW9uYWxOYW1lfV9gICtcbiAgICAoaXNTa2lubmluZyA/ICcrc2tpbm5pbmcnIDogJycpICtcbiAgICAoaXNMaWdodGluZyA/ICcnIDogJy1saWdodGluZycpO1xuXG4gIGNvbnN0IGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8gPSBbXG4gICAge1xuICAgICAgc2VtYW50aWM6ICdkYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb24nLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheSxcbiAgICAgIGFycmF5TGVuZ3RoOiBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcixcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgSW50MzJBcnJheShDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcikpLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ21vcnBoV2VpZ2h0cycsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyQXJyYXksXG4gICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFZlY3Rvck4obmV3IEZsb2F0MzJBcnJheShDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcikpLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU6IHRydWUsXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgQ3VzdG9tTWF0ZXJpYWxDb250ZW50KHtcbiAgICBuYW1lOiAnQ2xhc3NpY1ViZXInLFxuICAgIGlzU2tpbm5pbmcsXG4gICAgaXNMaWdodGluZyxcbiAgICBpc01vcnBoaW5nLFxuICAgIHZlcnRleFNoYWRlcjogQ2xhc3NpY1NpbmdsZVNoYWRlclZlcnRleCxcbiAgICBwaXhlbFNoYWRlcjogQ2xhc3NpY1NpbmdsZVNoYWRlckZyYWdtZW50LFxuICAgIHZlcnRleFNoYWRlcldlYkdwdTogQ2xhc3NpY1NpbmdsZVNoYWRlclZlcnRleFdlYkdwdSxcbiAgICBwaXhlbFNoYWRlcldlYkdwdTogQ2xhc3NpY1NpbmdsZVNoYWRlckZyYWdtZW50V2ViZ3B1LFxuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuICBpZiAoaXNMaWdodGluZykge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfTElHSFRJTkcnKTtcbiAgfVxuICBpZiAoaXNTaGFkb3cpIHtcbiAgICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9TSEFET1dfTUFQUElORycpO1xuICB9XG4gIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX05PUk1BTF9URVhUVVJFJyk7XG4gIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfU0tJTk5JTkcnKTtcblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlcHRoTW9tZW50RW5jb2RlTWF0ZXJpYWwoe1xuICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICBpc1NraW5uaW5nID0gdHJ1ZSxcbiAgaXNNb3JwaGluZyA9IGZhbHNlLFxuICBtYXhJbnN0YW5jZXNOdW1iZXIgPSBDb25maWcubWF4TWF0ZXJpYWxJbnN0YW5jZUZvckVhY2hUeXBlLFxufSA9IHt9KSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9ICdEZXB0aE1vbWVudEVuY29kZScgKyBgXyR7YWRkaXRpb25hbE5hbWV9X2A7XG5cbiAgY29uc3QgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbyA9IFtcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbicsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgYXJyYXlMZW5ndGg6IENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKG5ldyBJbnQzMkFycmF5KENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyKSksXG4gICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlbWFudGljOiAnbW9ycGhXZWlnaHRzJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheSxcbiAgICAgIGFycmF5TGVuZ3RoOiBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcixcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyKSksXG4gICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICB9LFxuICBdO1xuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgQ3VzdG9tTWF0ZXJpYWxDb250ZW50KHtcbiAgICBuYW1lOiAnRGVwdGhNb21lbnRFbmNvZGUnLFxuICAgIGlzU2tpbm5pbmcsXG4gICAgaXNMaWdodGluZzogZmFsc2UsXG4gICAgaXNNb3JwaGluZyxcbiAgICB2ZXJ0ZXhTaGFkZXI6IERlcHRoTW9tZW50RW5jb2RlU2hhZGVyVmVydGV4LFxuICAgIHBpeGVsU2hhZGVyOiBEZXB0aE1vbWVudEVuY29kZVNoYWRlckZyYWdtZW50LFxuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX0lTX1NLSU5OSU5HJyk7XG5cbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGbGF0TWF0ZXJpYWwoe1xuICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICBpc1NraW5uaW5nID0gdHJ1ZSxcbiAgaXNNb3JwaGluZyA9IGZhbHNlLFxuICBtYXhJbnN0YW5jZXNOdW1iZXIgPSBDb25maWcubWF4TWF0ZXJpYWxJbnN0YW5jZUZvckVhY2hUeXBlLFxufSA9IHt9KSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9ICdGbGF0JyArIGBfJHthZGRpdGlvbmFsTmFtZX1fYCArIChpc1NraW5uaW5nID8gJytza2lubmluZycgOiAnJyk7XG5cbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IEN1c3RvbU1hdGVyaWFsQ29udGVudCh7XG4gICAgbmFtZTogJ0ZsYXQnLFxuICAgIGlzU2tpbm5pbmcsXG4gICAgaXNMaWdodGluZzogZmFsc2UsXG4gICAgaXNNb3JwaGluZyxcbiAgICB2ZXJ0ZXhTaGFkZXI6IEZsYXRTaW5nbGVTaGFkZXJWZXJ0ZXgsXG4gICAgcGl4ZWxTaGFkZXI6IEZsYXRTaW5nbGVTaGFkZXJGcmFnbWVudCxcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvOiBbXSxcbiAgICB2ZXJ0ZXhTaGFkZXJXZWJHcHU6IEZsYXRTaW5nbGVTaGFkZXJWZXJ0ZXhXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IEZsYXRTaW5nbGVTaGFkZXJGcmFnbWVudFdlYkdwdSxcbiAgfSk7XG4gIG1hdGVyaWFsTm9kZS5pc1NpbmdsZU9wZXJhdGlvbiA9IHRydWU7XG4gIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlcik7XG4gIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfU0tJTk5JTkcnKTtcblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVudkNvbnN0YW50TWF0ZXJpYWwoe1xuICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICBtYXhJbnN0YW5jZXNOdW1iZXIgPSA1LFxuICBtYWtlT3V0cHV0U3JnYiA9IHRydWUsXG59ID0ge30pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ0VudkNvbnN0YW50JyArIGBfJHthZGRpdGlvbmFsTmFtZX1gO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IEVudkNvbnN0YW50U2luZ2xlU2hhZGVyVmVydGV4LFxuICAgIHBpeGVsU2hhZGVyOiBFbnZDb25zdGFudFNpbmdsZVNoYWRlckZyYWdtZW50LFxuICAgIHZlcnRleFNoYWRlcldlYkdwdTogRW52Q29uc3RhbnRTaW5nbGVTaGFkZXJWZXJ0ZXhXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IEVudkNvbnN0YW50U2luZ2xlU2hhZGVyRnJhZ21lbnRXZWJHcHUsXG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbzogW10sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ21ha2VPdXRwdXRTcmdiJywgbWFrZU91dHB1dFNyZ2IgPyAxIDogMCk7XG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRlhBQTNRdWFsaXR5TWF0ZXJpYWwoeyBhZGRpdGlvbmFsTmFtZSA9ICcnLCBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxIH0gPSB7fSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPSAnRlhBQTNRdWFsaXR5JyArIGBfJHthZGRpdGlvbmFsTmFtZX1gO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IEZYQUEzUXVhbGl0eVNoYWRlclZlcnRleCxcbiAgICBwaXhlbFNoYWRlcjogRlhBQTNRdWFsaXR5U2hhZGVyRnJhZ21lbnQsXG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbzogW10sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVybmFjZVRlc3RNYXRlcmlhbCh7IGFkZGl0aW9uYWxOYW1lID0gJycsIG1heEluc3RhbmNlc051bWJlciA9IDEgfSA9IHt9KSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9ICdGdXJuYWNlVGVzdCcgKyBgXyR7YWRkaXRpb25hbE5hbWV9YDtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgRnVybmFjZVRlc3RNYXRlcmlhbENvbnRlbnQoKTtcbiAgbWF0ZXJpYWxOb2RlLmlzU2luZ2xlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgY29uc3QgbWF0ZXJpYWwgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbE5hbWUsIG1hdGVyaWFsTm9kZSwgbWF4SW5zdGFuY2VzTnVtYmVyKTtcblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlcHRoRW5jb2RlTWF0ZXJpYWwoe1xuICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICBpc1NraW5uaW5nID0gZmFsc2UsXG4gIGRlcHRoUG93ID0gMS4wLFxuICBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxMCxcbn0gPSB7fSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPSAnRGVwdGhFbmNvZGUnICsgYF8ke2FkZGl0aW9uYWxOYW1lfV9gICsgKGlzU2tpbm5pbmcgPyAnK3NraW5uaW5nJyA6ICcnKTtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgRGVwdGhFbmNvZGVNYXRlcmlhbENvbnRlbnQoZGVwdGhQb3csIHtcbiAgICBpc1NraW5uaW5nLFxuICB9KTtcbiAgbWF0ZXJpYWxOb2RlLmlzU2luZ2xlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgY29uc3QgbWF0ZXJpYWwgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbE5hbWUsIG1hdGVyaWFsTm9kZSwgbWF4SW5zdGFuY2VzTnVtYmVyKTtcbiAgaWYgKGlzU2tpbm5pbmcpIHtcbiAgICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX0lTX1NLSU5OSU5HJyk7XG4gIH1cblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNoYWRvd01hcERlY29kZUNsYXNzaWNTaW5nbGVNYXRlcmlhbChcbiAge1xuICAgIGFkZGl0aW9uYWxOYW1lID0gJycsXG4gICAgaXNNb3JwaGluZyA9IGZhbHNlLFxuICAgIGlzU2tpbm5pbmcgPSBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nID0gdHJ1ZSxcbiAgICBpc0RlYnVnZ2luZyA9IGZhbHNlLFxuICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXIgPSAwLFxuICAgIG1heEluc3RhbmNlc051bWJlciA9IDIwLFxuICB9ID0ge30sXG4gIGRlcHRoRW5jb2RlUmVuZGVyUGFzczogUmVuZGVyUGFzc1xuKSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9XG4gICAgJ1NoYWRvd01hcERlY29kZUNsYXNzaWMnICtcbiAgICBgXyR7YWRkaXRpb25hbE5hbWV9X2AgK1xuICAgIChpc1NraW5uaW5nID8gJytza2lubmluZycgOiAnJykgK1xuICAgIChpc0xpZ2h0aW5nID8gJycgOiAnLWxpZ2h0aW5nJyk7XG5cbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IFNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQoXG4gICAge1xuICAgICAgaXNNb3JwaGluZyxcbiAgICAgIGlzU2tpbm5pbmcsXG4gICAgICBpc0xpZ2h0aW5nLFxuICAgICAgaXNEZWJ1Z2dpbmcsXG4gICAgICBjb2xvckF0dGFjaG1lbnRzTnVtYmVyLFxuICAgIH0sXG4gICAgZGVwdGhFbmNvZGVSZW5kZXJQYXNzXG4gICk7XG4gIG1hdGVyaWFsTm9kZS5pc1NpbmdsZU9wZXJhdGlvbiA9IHRydWU7XG4gIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlcik7XG4gIGlmIChpc1NraW5uaW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19TS0lOTklORycpO1xuICB9XG4gIGlmIChpc01vcnBoaW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19NT1JQSElORycpO1xuICB9XG4gIGlmIChpc0xpZ2h0aW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19MSUdIVElORycpO1xuICB9XG4gIGlmIChpc0RlYnVnZ2luZykge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfREVCVUdHSU5HJyk7XG4gIH1cblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aE1hdGVyaWFsKHtcbiAgYWRkaXRpb25hbE5hbWUgPSAnJyxcbiAgbWF4SW5zdGFuY2VzTnVtYmVyID0gMTAsXG59ID0ge30pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ0dhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aCcgKyBgXyR7YWRkaXRpb25hbE5hbWV9YDtcblxuICBjb25zdCBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvW10gPSBbXTtcbiAgY29uc3QgZ2F1c3NpYW5SYXRpbyA9IG5ldyBGbG9hdDMyQXJyYXkoMzApO1xuICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goXG4gICAge1xuICAgICAgc2VtYW50aWM6ICdpc0hvcml6b250YWwnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5Cb29sLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigxKSwgLy90cnVlXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2dhdXNzaWFuUmF0aW8nLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgYXJyYXlMZW5ndGg6IDMwLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKGdhdXNzaWFuUmF0aW8pLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlbWFudGljOiAnZ2F1c3NpYW5LZXJuZWxTaXplJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigxKSxcbiAgICAgIG1pbjogMSxcbiAgICAgIG1heDogMzAsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2ZyYW1lYnVmZmVyU2l6ZScsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMixcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IyLmZyb21Db3B5MigxLCAxKSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2Jhc2VDb2xvclRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogWzAsIGR1bW15QmxhY2tUZXh0dXJlXSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IEdhdXNzaWFuQmx1ckZvckVuY29kZWREZXB0aFNpbmdsZVNoYWRlclZlcnRleCxcbiAgICBwaXhlbFNoYWRlcjogR2F1c3NpYW5CbHVyRm9yRW5jb2RlZERlcHRoU2luZ2xlU2hhZGVyRnJhZ21lbnQsXG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbyxcbiAgfSk7XG5cbiAgbWF0ZXJpYWxOb2RlLmlzU2luZ2xlT3BlcmF0aW9uID0gdHJ1ZTtcblxuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2luZ2xlTWF0ZXJpYWwoXG4gIHtcbiAgICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICAgIGlzTW9ycGhpbmcgPSBmYWxzZSxcbiAgICBpc1NraW5uaW5nID0gZmFsc2UsXG4gICAgaXNEZWJ1Z2dpbmcgPSBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nID0gdHJ1ZSxcbiAgICBjb2xvckF0dGFjaG1lbnRzTnVtYmVyRGVwdGggPSAwLFxuICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXJTcXVhcmVEZXB0aCA9IDAsXG4gICAgZGVwdGhDYW1lcmFDb21wb25lbnQgPSB1bmRlZmluZWQsXG4gICAgbWF4SW5zdGFuY2VzTnVtYmVyID0gMTAsXG4gIH06IHtcbiAgICBhZGRpdGlvbmFsTmFtZT86IHN0cmluZztcbiAgICBpc01vcnBoaW5nPzogYm9vbGVhbjtcbiAgICBpc1NraW5uaW5nPzogYm9vbGVhbjtcbiAgICBpc0RlYnVnZ2luZz86IGJvb2xlYW47XG4gICAgaXNMaWdodGluZz86IGJvb2xlYW47XG4gICAgY29sb3JBdHRhY2htZW50c051bWJlckRlcHRoPzogQ291bnQ7XG4gICAgY29sb3JBdHRhY2htZW50c051bWJlclNxdWFyZURlcHRoPzogQ291bnQ7XG4gICAgZGVwdGhDYW1lcmFDb21wb25lbnQ/OiBDYW1lcmFDb21wb25lbnQ7XG4gICAgbWF4SW5zdGFuY2VzTnVtYmVyPzogQ291bnQ7XG4gIH0sXG4gIGVuY29kZWREZXB0aFJlbmRlclBhc3NlczogUmVuZGVyUGFzc1tdXG4pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID1cbiAgICAnVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVTaGFkaW5nJyArXG4gICAgYF8ke2FkZGl0aW9uYWxOYW1lfV9gICtcbiAgICAoaXNNb3JwaGluZyA/ICcrbW9ycGhpbmcnIDogJycpICtcbiAgICAoaXNTa2lubmluZyA/ICcrc2tpbm5pbmcnIDogJycpICtcbiAgICAoaXNMaWdodGluZyA/ICcnIDogJy1saWdodGluZycpICtcbiAgICAoaXNEZWJ1Z2dpbmcgPyAnJyA6ICcrZGVidWdnaW5nJyk7XG5cbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IFZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudChcbiAgICB7XG4gICAgICBpc01vcnBoaW5nLFxuICAgICAgaXNTa2lubmluZyxcbiAgICAgIGlzTGlnaHRpbmcsXG4gICAgICBpc0RlYnVnZ2luZyxcbiAgICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXJEZXB0aCxcbiAgICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXJTcXVhcmVEZXB0aCxcbiAgICAgIGRlcHRoQ2FtZXJhQ29tcG9uZW50LFxuICAgIH0sXG4gICAgZW5jb2RlZERlcHRoUmVuZGVyUGFzc2VzXG4gICk7XG4gIG1hdGVyaWFsTm9kZS5pc1NpbmdsZU9wZXJhdGlvbiA9IHRydWU7XG4gIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlcik7XG4gIGlmIChpc1NraW5uaW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19TS0lOTklORycpO1xuICB9XG4gIGlmIChpc0xpZ2h0aW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19MSUdIVElORycpO1xuICB9XG4gIGlmIChpc01vcnBoaW5nKSB7XG4gICAgbWF0ZXJpYWwuYWRkU2hhZGVyRGVmaW5lKCdSTl9JU19NT1JQSElORycpO1xuICB9XG4gIGlmIChpc0RlYnVnZ2luZykge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfREVCVUdHSU5HJyk7XG4gIH1cbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZXRlY3RIaWdoTHVtaW5hbmNlTWF0ZXJpYWwoXG4gIHsgYWRkaXRpb25hbE5hbWUgPSAnJywgbWF4SW5zdGFuY2VzTnVtYmVyID0gNSB9ID0ge30sXG4gIHRleHR1cmVUb0RldGVjdEhpZ2hMdW1pbmFuY2U6IEFic3RyYWN0VGV4dHVyZVxuKSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9ICdEZXRlY3RIaWdoTHVtaW5hbmNlJyArIGBfJHthZGRpdGlvbmFsTmFtZX1fYDtcbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IERldGVjdEhpZ2hMdW1pbmFuY2VNYXRlcmlhbENvbnRlbnQodGV4dHVyZVRvRGV0ZWN0SGlnaEx1bWluYW5jZSk7XG4gIG1hdGVyaWFsTm9kZS5pc1NpbmdsZU9wZXJhdGlvbiA9IHRydWU7XG4gIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlcik7XG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2F1c3NpYW5CbHVyTWF0ZXJpYWwoeyBhZGRpdGlvbmFsTmFtZSA9ICcnLCBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxMCB9ID0ge30pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ0dhdXNzaWFuQmx1cicgKyBgXyR7YWRkaXRpb25hbE5hbWV9YDtcblxuICBjb25zdCBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvW10gPSBbXTtcbiAgY29uc3QgZ2F1c3NpYW5SYXRpbyA9IG5ldyBGbG9hdDMyQXJyYXkoMzApO1xuICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvLnB1c2goXG4gICAge1xuICAgICAgc2VtYW50aWM6ICdpc0hvcml6b250YWwnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5Cb29sLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigxKSwgLy90cnVlXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2dhdXNzaWFuUmF0aW8nLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgYXJyYXlMZW5ndGg6IDMwLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKGdhdXNzaWFuUmF0aW8pLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgLy8gbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlbWFudGljOiAnZ2F1c3NpYW5LZXJuZWxTaXplJyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigxKSxcbiAgICAgIG1pbjogMSxcbiAgICAgIG1heDogMzAsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2ZyYW1lYnVmZmVyU2l6ZScsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMixcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IyLmZyb21Db3B5MigxLCAxKSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ2Jhc2VDb2xvclRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogWzAsIGR1bW15QmxhY2tUZXh0dXJlXSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IEdhdXNzaWFuQmx1clNpbmdsZVNoYWRlclZlcnRleCxcbiAgICBwaXhlbFNoYWRlcjogR2F1c3NpYW5CbHVyU2luZ2xlU2hhZGVyRnJhZ21lbnQsXG4gICAgdmVydGV4U2hhZGVyV2ViR3B1OiBHYXVzc2lhbkJsdXJTaW5nbGVTaGFkZXJWZXJ0ZXhXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IEdhdXNzaWFuQmx1clNpbmdsZVNoYWRlckZyYWdtZW50V2ViR3B1LFxuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm8sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ludGhlc2l6ZUhEUk1hdGVyaWFsKFxuICB7XG4gICAgYWRkaXRpb25hbE5hbWUgPSAnJyxcbiAgICBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxLFxuICB9OiB7XG4gICAgYWRkaXRpb25hbE5hbWU/OiBzdHJpbmc7XG4gICAgbWF4SW5zdGFuY2VzTnVtYmVyPzogQ291bnQ7XG4gIH0sXG4gIHN5bnRoZXNpemVUZXh0dXJlczogQWJzdHJhY3RUZXh0dXJlW11cbikge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPSAnU3ludGhlc2l6ZUhEUicgKyBgXyR7YWRkaXRpb25hbE5hbWV9YDtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgU3ludGhlc2l6ZUhEUk1hdGVyaWFsQ29udGVudChzeW50aGVzaXplVGV4dHVyZXMpO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29sb3JHcmFkaW5nVXNpbmdMVVRzTWF0ZXJpYWwoXG4gIHtcbiAgICBhZGRpdGlvbmFsTmFtZSA9ICcnLFxuICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXIgPSAwLFxuICAgIHVyaSxcbiAgICB0ZXh0dXJlLFxuICAgIG1heEluc3RhbmNlc051bWJlciA9IDEsXG4gIH06IHtcbiAgICBhZGRpdGlvbmFsTmFtZT86IHN0cmluZztcbiAgICBjb2xvckF0dGFjaG1lbnRzTnVtYmVyPzogQ291bnQ7XG4gICAgdXJpPzogc3RyaW5nO1xuICAgIHRleHR1cmU/OiBUZXh0dXJlO1xuICAgIG1heEluc3RhbmNlc051bWJlcj86IENvdW50O1xuICB9LFxuICB0YXJnZXRSZW5kZXJQYXNzOiBSZW5kZXJQYXNzXG4pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ0NvbG9yR3JhZGluZ1VzaW5nTFVUcycgKyBgXyR7YWRkaXRpb25hbE5hbWV9YDtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgQ29sb3JHcmFkaW5nVXNpbmdMVVRzTWF0ZXJpYWxDb250ZW50KFxuICAgIHRhcmdldFJlbmRlclBhc3MsXG4gICAgY29sb3JBdHRhY2htZW50c051bWJlcixcbiAgICB1cmksXG4gICAgdGV4dHVyZVxuICApO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2FtbWFDb3JyZWN0aW9uTWF0ZXJpYWwoeyBhZGRpdGlvbmFsTmFtZSA9ICcnLCBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxIH0gPSB7fSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPSAnR2FtbWFDb3JyZWN0aW9uJyArIGBfJHthZGRpdGlvbmFsTmFtZX1gO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IEdhbW1hQ29ycmVjdGlvblNoYWRlclZlcnRleCxcbiAgICBwaXhlbFNoYWRlcjogR2FtbWFDb3JyZWN0aW9uU2hhZGVyRnJhZ21lbnQsXG4gICAgdmVydGV4U2hhZGVyV2ViR3B1OiBHYW1tYUNvcnJlY3Rpb25TaGFkZXJWZXJ0ZXhXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IEdhbW1hQ29ycmVjdGlvblNoYWRlckZyYWdtZW50V2ViR3B1LFxuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm86IFtdLFxuICB9KTtcbiAgbWF0ZXJpYWxOb2RlLmlzU2luZ2xlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgY29uc3QgbWF0ZXJpYWwgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbE5hbWUsIG1hdGVyaWFsTm9kZSwgbWF4SW5zdGFuY2VzTnVtYmVyKTtcblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRvbmVNYXBwaW5nTWF0ZXJpYWwoeyBhZGRpdGlvbmFsTmFtZSA9ICcnLCBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxIH0gPSB7fSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPSAnVG9uZU1hcHBpbmcnICsgYF8ke2FkZGl0aW9uYWxOYW1lfWA7XG5cbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IEN1c3RvbU1hdGVyaWFsQ29udGVudCh7XG4gICAgbmFtZTogbWF0ZXJpYWxOYW1lLFxuICAgIGlzU2tpbm5pbmc6IGZhbHNlLFxuICAgIGlzTGlnaHRpbmc6IGZhbHNlLFxuICAgIGlzTW9ycGhpbmc6IGZhbHNlLFxuICAgIHZlcnRleFNoYWRlcjogVG9uZU1hcHBpbmdTaGFkZXJWZXJ0ZXhHTFNMLFxuICAgIHBpeGVsU2hhZGVyOiBUb25lTWFwcGluZ1NoYWRlckZyYWdtZW50R0xTTCxcbiAgICB2ZXJ0ZXhTaGFkZXJXZWJHcHU6IFRvbmVNYXBwaW5nU2hhZGVyVmVydGV4V0dTTCxcbiAgICBwaXhlbFNoYWRlcldlYkdwdTogVG9uZU1hcHBpbmdTaGFkZXJGcmFnbWVudFdHU0wsXG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbzogW10sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9HVF9UT05FTUFQJyk7XG5cbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdW1tZWRBcmVhVGFibGVNYXRlcmlhbCh7IGFkZGl0aW9uYWxOYW1lID0gJycsIG1heEluc3RhbmNlc051bWJlciA9IDEgfSA9IHt9KSB7XG4gIGNvbnN0IG1hdGVyaWFsTmFtZSA9ICdTdW1tZWRBcmVhVGFibGUnICsgYF8ke2FkZGl0aW9uYWxOYW1lfWA7XG5cbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IEN1c3RvbU1hdGVyaWFsQ29udGVudCh7XG4gICAgbmFtZTogbWF0ZXJpYWxOYW1lLFxuICAgIGlzU2tpbm5pbmc6IGZhbHNlLFxuICAgIGlzTGlnaHRpbmc6IGZhbHNlLFxuICAgIGlzTW9ycGhpbmc6IGZhbHNlLFxuICAgIHZlcnRleFNoYWRlcjogU3VtbWVkQXJlYVRhYmxlU2hhZGVyVmVydGV4LFxuICAgIHBpeGVsU2hhZGVyOiBTdW1tZWRBcmVhVGFibGVTaGFkZXJGcmFnbWVudCxcbiAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvOiBbXSxcbiAgfSk7XG4gIG1hdGVyaWFsTm9kZS5pc1NpbmdsZU9wZXJhdGlvbiA9IHRydWU7XG4gIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlcik7XG5cbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYW5vcmFtYVRvQ3ViZU1hdGVyaWFsKHsgYWRkaXRpb25hbE5hbWUgPSAnJywgbWF4SW5zdGFuY2VzTnVtYmVyID0gMSB9ID0ge30pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ1Bhbm9yYW1hVG9DdWJlJyArIGBfJHthZGRpdGlvbmFsTmFtZX1gO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IFBhbm9yYW1hVG9DdWJlU2hhZGVyVmVydGV4LFxuICAgIHBpeGVsU2hhZGVyOiBQYW5vcmFtYVRvQ3ViZVNoYWRlckZyYWdtZW50LFxuICAgIHZlcnRleFNoYWRlcldlYkdwdTogUGFub3JhbWFUb0N1YmVTaGFkZXJWZXJ0ZXhXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IFBhbm9yYW1hVG9DdWJlU2hhZGVyRnJhZ21lbnRXZWJHcHUsXG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbzogW10sXG4gIH0pO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUHJlZmlsdGVySUJMTWF0ZXJpYWwoeyBhZGRpdGlvbmFsTmFtZSA9ICcnLCBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxIH0gPSB7fSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPSAnUHJlZmlsdGVySUJMJyArIGBfJHthZGRpdGlvbmFsTmFtZX1gO1xuXG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgIG5hbWU6IG1hdGVyaWFsTmFtZSxcbiAgICBpc1NraW5uaW5nOiBmYWxzZSxcbiAgICBpc0xpZ2h0aW5nOiBmYWxzZSxcbiAgICBpc01vcnBoaW5nOiBmYWxzZSxcbiAgICB2ZXJ0ZXhTaGFkZXI6IFByZWZpbHRlcklCTFNoYWRlclZlcnRleCxcbiAgICBwaXhlbFNoYWRlcjogUHJlZmlsdGVySUJMU2hhZGVyRnJhZ21lbnQsXG4gICAgdmVydGV4U2hhZGVyV2ViR3B1OiBQcmVmaWx0ZXJJQkxTaGFkZXJWZXJ0ZXhXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IFByZWZpbHRlcklCTFNoYWRlckZyYWdtZW50V2ViR3B1LFxuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm86IFtdLFxuICB9KTtcbiAgbWF0ZXJpYWxOb2RlLmlzU2luZ2xlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgY29uc3QgbWF0ZXJpYWwgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbE5hbWUsIG1hdGVyaWFsTm9kZSwgbWF4SW5zdGFuY2VzTnVtYmVyKTtcblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hdENhcE1hdGVyaWFsKHtcbiAgYWRkaXRpb25hbE5hbWUgPSAnJyxcbiAgaXNTa2lubmluZyA9IGZhbHNlLFxuICB1cmksXG4gIHRleHR1cmUsXG4gIHNhbXBsZXIsXG4gIG1heEluc3RhbmNlc051bWJlciA9IDEwLFxufToge1xuICBhZGRpdGlvbmFsTmFtZT86IHN0cmluZztcbiAgaXNTa2lubmluZz86IGJvb2xlYW47XG4gIHVyaT86IHN0cmluZztcbiAgdGV4dHVyZT86IFRleHR1cmU7XG4gIHNhbXBsZXI/OiBTYW1wbGVyO1xuICBtYXhJbnN0YW5jZXNOdW1iZXI/OiBDb3VudDtcbn0pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ01hdENhcCcgKyBgXyR7YWRkaXRpb25hbE5hbWV9YCArIChpc1NraW5uaW5nID8gJytza2lubmluZycgOiAnJyk7XG5cbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbmV3IE1hdENhcE1hdGVyaWFsQ29udGVudChpc1NraW5uaW5nLCB1cmksIHRleHR1cmUsIHNhbXBsZXIpO1xuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsTmFtZSwgbWF0ZXJpYWxOb2RlLCBtYXhJbnN0YW5jZXNOdW1iZXIpO1xuICBpZiAoaXNTa2lubmluZykge1xuICAgIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfU0tJTk5JTkcnKTtcbiAgfVxuXG4gIHJldHVybiBtYXRlcmlhbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRW50aXR5VUlET3V0cHV0TWF0ZXJpYWwoeyBhZGRpdGlvbmFsTmFtZSA9ICcnLCBtYXhJbnN0YW5jZXNOdW1iZXIgPSAxMCB9ID0ge30pIHtcbiAgY29uc3QgbWF0ZXJpYWxOYW1lID0gJ0VudGl0eVVJRE91dHB1dCcgKyBgXyR7YWRkaXRpb25hbE5hbWV9YDtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgRW50aXR5VUlET3V0cHV0TWF0ZXJpYWxDb250ZW50KCk7XG4gIG1hdGVyaWFsTm9kZS5pc1NpbmdsZU9wZXJhdGlvbiA9IHRydWU7XG4gIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWxOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlc051bWJlcik7XG4gIG1hdGVyaWFsLmFkZFNoYWRlckRlZmluZSgnUk5fSVNfU0tJTk5JTkcnKTtcbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNVG9vbk1hdGVyaWFsKHtcbiAgYWRkaXRpb25hbE5hbWUgPSAnJyxcbiAgaXNNb3JwaGluZyA9IGZhbHNlLFxuICBpc1NraW5uaW5nID0gZmFsc2UsXG4gIGlzTGlnaHRpbmcgPSB0cnVlLFxuICB1c2VUYW5nZW50QXR0cmlidXRlID0gZmFsc2UsXG4gIGlzT3V0bGluZSA9IGZhbHNlLFxuICBtYXRlcmlhbFByb3BlcnRpZXMsXG4gIHRleHR1cmVzLFxuICBzYW1wbGVycyxcbiAgZGVidWdNb2RlLFxuICBtYXhJbnN0YW5jZXNOdW1iZXIgPSBDb25maWcubWF4TWF0ZXJpYWxJbnN0YW5jZUZvckVhY2hUeXBlLFxuICBtYWtlT3V0cHV0U3JnYiA9IHRydWUsXG59OiB7XG4gIGFkZGl0aW9uYWxOYW1lPzogc3RyaW5nO1xuICBpc01vcnBoaW5nPzogYm9vbGVhbjtcbiAgaXNTa2lubmluZz86IGJvb2xlYW47XG4gIGlzTGlnaHRpbmc/OiBib29sZWFuO1xuICB1c2VUYW5nZW50QXR0cmlidXRlPzogYm9vbGVhbjtcbiAgaXNPdXRsaW5lPzogYm9vbGVhbjtcbiAgbWF0ZXJpYWxQcm9wZXJ0aWVzPzogVnJtMHhNYXRlcmlhbFByb3BlcnR5O1xuICB0ZXh0dXJlcz86IGFueVtdO1xuICBzYW1wbGVycz86IFNhbXBsZXJbXTtcbiAgZGVidWdNb2RlPzogYW55O1xuICBtYXhJbnN0YW5jZXNOdW1iZXI/OiBDb3VudDtcbiAgbWFrZU91dHB1dFNyZ2I/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPVxuICAgICdNVG9vbicgK1xuICAgIGBfJHthZGRpdGlvbmFsTmFtZX1fYCArXG4gICAgKGlzTW9ycGhpbmcgPyAnK21vcnBoaW5nJyA6ICcnKSArXG4gICAgKGlzU2tpbm5pbmcgPyAnK3NraW5uaW5nJyA6ICcnKSArXG4gICAgKGlzTGlnaHRpbmcgPyAnJyA6ICctbGlnaHRpbmcnKSArXG4gICAgKHVzZVRhbmdlbnRBdHRyaWJ1dGUgPyAnK3RhbmdlbnRBdHRyaWJ1dGUnIDogJycpICtcbiAgICAoaXNPdXRsaW5lID8gJy1vdXRsaW5lJyA6ICcnKTtcblxuICBjb25zdCBtYXRlcmlhbE5vZGUgPSBuZXcgTVRvb25NYXRlcmlhbENvbnRlbnQoXG4gICAgaXNPdXRsaW5lLFxuICAgIG1hdGVyaWFsUHJvcGVydGllcyxcbiAgICB0ZXh0dXJlcyxcbiAgICBzYW1wbGVycyEsXG4gICAgaXNNb3JwaGluZyxcbiAgICBpc1NraW5uaW5nLFxuICAgIGlzTGlnaHRpbmcsXG4gICAgdXNlVGFuZ2VudEF0dHJpYnV0ZSxcbiAgICBkZWJ1Z01vZGUsXG4gICAgbWFrZU91dHB1dFNyZ2IsXG4gICAgbWF0ZXJpYWxOYW1lXG4gICk7XG5cbiAgbWF0ZXJpYWxOb2RlLmlzU2luZ2xlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgY29uc3QgbWF0ZXJpYWwgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbE5hbWUsIG1hdGVyaWFsTm9kZSwgbWF4SW5zdGFuY2VzTnVtYmVyKTtcbiAgbWF0ZXJpYWxOb2RlLnNldE1hdGVyaWFsUGFyYW1ldGVycyhtYXRlcmlhbCwgaXNPdXRsaW5lKTtcblxuICByZXR1cm4gbWF0ZXJpYWw7XG59XG5cbmZ1bmN0aW9uIHJldXNlT3JSZWNyZWF0ZUN1c3RvbU1hdGVyaWFsKFxuICBjdXJyZW50TWF0ZXJpYWw6IE1hdGVyaWFsLFxuICB2ZXJ0ZXhTaGFkZXJTdHI6IHN0cmluZyxcbiAgcGl4ZWxTaGFkZXJTdHI6IHN0cmluZyxcbiAge1xuICAgIGFkZGl0aW9uYWxOYW1lID0gJycsXG4gICAgaXNTa2lubmluZyA9IHRydWUsXG4gICAgaXNMaWdodGluZyA9IGZhbHNlLFxuICAgIGlzTW9ycGhpbmcgPSBmYWxzZSxcbiAgICBtYXhJbnN0YW5jZXNOdW1iZXIgPSBDb25maWcubWF4TWF0ZXJpYWxJbnN0YW5jZUZvckVhY2hUeXBlLFxuICB9ID0ge31cbikge1xuICBjb25zdCBtYXRlcmlhbE5hbWUgPVxuICAgICdDdXN0b20nICtcbiAgICBgXyR7YWRkaXRpb25hbE5hbWV9X2AgK1xuICAgIChpc01vcnBoaW5nID8gJyttb3JwaGluZycgOiAnJykgK1xuICAgIChpc1NraW5uaW5nID8gJytza2lubmluZycgOiAnJykgK1xuICAgIChpc0xpZ2h0aW5nID8gJycgOiAnLWxpZ2h0aW5nJyk7XG5cbiAgbGV0IG1hdGVyaWFsTm9kZTogQ3VzdG9tTWF0ZXJpYWxDb250ZW50O1xuICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgIG1hdGVyaWFsTm9kZSA9IG5ldyBDdXN0b21NYXRlcmlhbENvbnRlbnQoe1xuICAgICAgbmFtZTogbWF0ZXJpYWxOYW1lLFxuICAgICAgaXNTa2lubmluZyxcbiAgICAgIGlzTGlnaHRpbmcsXG4gICAgICBpc01vcnBoaW5nLFxuICAgICAgdmVydGV4U2hhZGVyV2ViR3B1OiB7XG4gICAgICAgIGNvZGU6IHZlcnRleFNoYWRlclN0cixcbiAgICAgICAgc2hhZGVyU3RhZ2U6ICd2ZXJ0ZXgnLFxuICAgICAgICBpc0ZyYWdtZW50U2hhZGVyOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBwaXhlbFNoYWRlcldlYkdwdToge1xuICAgICAgICBjb2RlOiBwaXhlbFNoYWRlclN0cixcbiAgICAgICAgc2hhZGVyU3RhZ2U6ICdmcmFnbWVudCcsXG4gICAgICAgIGlzRnJhZ21lbnRTaGFkZXI6IHRydWUsXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbzogW10sXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbWF0ZXJpYWxOb2RlID0gbmV3IEN1c3RvbU1hdGVyaWFsQ29udGVudCh7XG4gICAgICBuYW1lOiBtYXRlcmlhbE5hbWUsXG4gICAgICBpc1NraW5uaW5nLFxuICAgICAgaXNMaWdodGluZyxcbiAgICAgIGlzTW9ycGhpbmcsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHtcbiAgICAgICAgY29kZTogdmVydGV4U2hhZGVyU3RyLFxuICAgICAgICBzaGFkZXJTdGFnZTogJ3ZlcnRleCcsXG4gICAgICAgIGlzRnJhZ21lbnRTaGFkZXI6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHBpeGVsU2hhZGVyOiB7XG4gICAgICAgIGNvZGU6IHBpeGVsU2hhZGVyU3RyLFxuICAgICAgICBzaGFkZXJTdGFnZTogJ2ZyYWdtZW50JyxcbiAgICAgICAgaXNGcmFnbWVudFNoYWRlcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvOiBbXSxcbiAgICB9KTtcbiAgfVxuICBtYXRlcmlhbE5vZGUuaXNTaW5nbGVPcGVyYXRpb24gPSB0cnVlO1xuICBjb25zdCBtYXRlcmlhbCA9IHJldXNlT3JSZWNyZWF0ZU1hdGVyaWFsKFxuICAgIG1hdGVyaWFsTmFtZSxcbiAgICBjdXJyZW50TWF0ZXJpYWwsXG4gICAgbWF0ZXJpYWxOb2RlLFxuICAgIG1heEluc3RhbmNlc051bWJlclxuICApO1xuICBtYXRlcmlhbC5hZGRTaGFkZXJEZWZpbmUoJ1JOX0lTX1NLSU5OSU5HJyk7XG5cbiAgcmV0dXJuIG1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VNYXRlcmlhbChcbiAgZW50aXR5OiBJTWVzaFJlbmRlcmVyRW50aXR5TWV0aG9kcyxcbiAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gIG1hdGVyaWFsOiBNYXRlcmlhbFxuKSB7XG4gIGNvbnN0IG1lc2hSZW5kZXJlckNvbXBvbmVudCA9IGVudGl0eS5nZXRNZXNoUmVuZGVyZXIoKSE7XG4gIHByaW1pdGl2ZS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuICBtZXNoUmVuZGVyZXJDb21wb25lbnQubW92ZVN0YWdlVG8oUHJvY2Vzc1N0YWdlLkxvYWQpO1xufVxuXG5leHBvcnQgY29uc3QgTWF0ZXJpYWxIZWxwZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgY3JlYXRlTWF0ZXJpYWwsXG4gIHJlY3JlYXRlTWF0ZXJpYWwsXG4gIHJldXNlT3JSZWNyZWF0ZUN1c3RvbU1hdGVyaWFsLFxuICBjcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsLFxuICBjcmVhdGVEZXB0aE1vbWVudEVuY29kZU1hdGVyaWFsLFxuICBjcmVhdGVGbGF0TWF0ZXJpYWwsXG4gIGNyZWF0ZVBiclViZXJNYXRlcmlhbCxcbiAgY3JlYXRlRW52Q29uc3RhbnRNYXRlcmlhbCxcbiAgY3JlYXRlRlhBQTNRdWFsaXR5TWF0ZXJpYWwsXG4gIGNyZWF0ZURlcHRoRW5jb2RlTWF0ZXJpYWwsXG4gIGNyZWF0ZVNoYWRvd01hcERlY29kZUNsYXNzaWNTaW5nbGVNYXRlcmlhbCxcbiAgY3JlYXRlR2FtbWFDb3JyZWN0aW9uTWF0ZXJpYWwsXG4gIGNyZWF0ZVRvbmVNYXBwaW5nTWF0ZXJpYWwsXG4gIGNyZWF0ZVBhbm9yYW1hVG9DdWJlTWF0ZXJpYWwsXG4gIGNyZWF0ZVByZWZpbHRlcklCTE1hdGVyaWFsLFxuICBjcmVhdGVTdW1tZWRBcmVhVGFibGVNYXRlcmlhbCxcbiAgY3JlYXRlVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2luZ2xlTWF0ZXJpYWwsXG4gIGNyZWF0ZUVudGl0eVVJRE91dHB1dE1hdGVyaWFsLFxuICBjcmVhdGVNVG9vbk1hdGVyaWFsLFxuICBjcmVhdGVGdXJuYWNlVGVzdE1hdGVyaWFsLFxuICBjcmVhdGVHYXVzc2lhbkJsdXJGb3JFbmNvZGVkRGVwdGhNYXRlcmlhbCxcbiAgY3JlYXRlRGV0ZWN0SGlnaEx1bWluYW5jZU1hdGVyaWFsLFxuICBjcmVhdGVHYXVzc2lhbkJsdXJNYXRlcmlhbCxcbiAgY3JlYXRlU3ludGhlc2l6ZUhEUk1hdGVyaWFsLFxuICBjcmVhdGVDb2xvckdyYWRpbmdVc2luZ0xVVHNNYXRlcmlhbCxcbiAgY3JlYXRlTWF0Q2FwTWF0ZXJpYWwsXG4gIGNoYW5nZU1hdGVyaWFsLFxufSk7XG4iLCJpbXBvcnQgeyBQbGFuZSwgUGxhbmVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vZ2VvbWV0cnkvc2hhcGVzL1BsYW5lJztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IEF4aXNEZXNjcmlwdG9yIH0gZnJvbSAnLi4vZ2VvbWV0cnkvc2hhcGVzL0F4aXMnO1xuaW1wb3J0IHsgQXhpcyB9IGZyb20gJy4uL2dlb21ldHJ5L3NoYXBlcy9BeGlzJztcbmltcG9ydCB7IElTaGFwZSB9IGZyb20gJy4uL2dlb21ldHJ5L3NoYXBlcy9JU2hhcGUnO1xuaW1wb3J0IHsgTGluZSwgTGluZURlc2NyaXB0b3IgfSBmcm9tICcuLi9nZW9tZXRyeS9zaGFwZXMvTGluZSc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IEdyaWQsIEdyaWREZXNjcmlwdG9yIH0gZnJvbSAnLi4vZ2VvbWV0cnkvc2hhcGVzL0dyaWQnO1xuaW1wb3J0IHsgQ3ViZSwgQ3ViZURlc2NyaXB0b3IgfSBmcm9tICcuLi9nZW9tZXRyeS9zaGFwZXMvQ3ViZSc7XG5pbXBvcnQgeyBTcGhlcmUsIFNwaGVyZURlc2NyaXB0b3IgfSBmcm9tICcuLi9nZW9tZXRyeS9zaGFwZXMvU3BoZXJlJztcbmltcG9ydCB7IEpvaW50LCBKb2ludERlc2NyaXB0b3IgfSBmcm9tICcuLi9nZW9tZXRyeS9zaGFwZXMvSm9pbnQnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjJztcbmltcG9ydCB7IFBoeXNpY3NDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL1BoeXNpY3MvUGh5c2ljc0NvbXBvbmVudCc7XG5pbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IE9pbW9QaHlzaWNzU3RyYXRlZ3kgfSBmcm9tICcuLi9waHlzaWNzL09pbW8vT2ltb1BoeXNpY3NTdHJhdGVneSc7XG5pbXBvcnQgeyBQaHlzaWNzU2hhcGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QaHlzaWNzU2hhcGVUeXBlJztcbmltcG9ydCB7IGNyZWF0ZU1lc2hFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9jcmVhdGVNZXNoRW50aXR5JztcblxuY29uc3QgY3JlYXRlUGxhbmUgPSAoXG4gIGRlc2M6IFBsYW5lRGVzY3JpcHRvciAmIHtcbiAgICBkaXJlY3Rpb24/OiAneHonIHwgJ3h5JyB8ICd5eic7XG4gIH0gPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBQbGFuZSgpO1xuICBwcmltaXRpdmUuZ2VuZXJhdGUoZGVzYyk7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZVNoYXBlKHByaW1pdGl2ZSk7XG5cbiAgaWYgKElzLm5vdC5leGlzdChkZXNjLmRpcmVjdGlvbikpIHtcbiAgICBkZXNjLmRpcmVjdGlvbiA9ICd4eic7XG4gIH1cblxuICBpZiAoZGVzYy5kaXJlY3Rpb24gPT09ICd4eScpIHtcbiAgICBlbnRpdHkubG9jYWxFdWxlckFuZ2xlcyA9IFZlY3RvcjMuZnJvbUNvcHkzKE1hdGguUEkgLyAyLCAwLCAwKTtcbiAgfSBlbHNlIGlmIChkZXNjLmRpcmVjdGlvbiA9PT0gJ3l6Jykge1xuICAgIGVudGl0eS5sb2NhbEV1bGVyQW5nbGVzID0gVmVjdG9yMy5mcm9tQ29weTMoMCwgMCwgTWF0aC5QSSAvIDIpO1xuICB9XG4gIHJldHVybiBlbnRpdHk7XG59O1xuXG5jb25zdCBjcmVhdGVMaW5lID0gKGRlc2M6IExpbmVEZXNjcmlwdG9yID0ge30pID0+IHtcbiAgY29uc3QgcHJpbWl0aXZlID0gbmV3IExpbmUoKTtcbiAgcHJpbWl0aXZlLmdlbmVyYXRlKGRlc2MpO1xuICBjb25zdCBlbnRpdHkgPSBjcmVhdGVTaGFwZShwcmltaXRpdmUpO1xuICByZXR1cm4gZW50aXR5O1xufTtcblxuY29uc3QgY3JlYXRlR3JpZCA9IChkZXNjOiBHcmlkRGVzY3JpcHRvciA9IHt9KSA9PiB7XG4gIGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBHcmlkKCk7XG4gIHByaW1pdGl2ZS5nZW5lcmF0ZShkZXNjKTtcbiAgY29uc3QgZW50aXR5ID0gY3JlYXRlU2hhcGUocHJpbWl0aXZlKTtcbiAgcmV0dXJuIGVudGl0eTtcbn07XG5cbmNvbnN0IGNyZWF0ZUN1YmUgPSAoZGVzYzogQ3ViZURlc2NyaXB0b3IgPSB7fSkgPT4ge1xuICBjb25zdCBwcmltaXRpdmUgPSBuZXcgQ3ViZSgpO1xuICBwcmltaXRpdmUuZ2VuZXJhdGUoZGVzYyk7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZVNoYXBlKHByaW1pdGl2ZSk7XG5cbiAgaWYgKElzLmV4aXN0KGRlc2MucGh5c2ljcykgJiYgZGVzYy5waHlzaWNzLnVzZSkge1xuICAgIGNvbnN0IG5ld0VudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoUGh5c2ljc0NvbXBvbmVudCwgZW50aXR5KTtcbiAgICBjb25zdCBwaHlzaWNzQ29tcG9uZW50ID0gbmV3RW50aXR5LmdldFBoeXNpY3MoKTtcbiAgICBjb25zdCBzdHJhdGVneSA9IG5ldyBPaW1vUGh5c2ljc1N0cmF0ZWd5KCk7XG4gICAgY29uc3QgcHJvcGVydHkgPSB7XG4gICAgICB0eXBlOiBQaHlzaWNzU2hhcGUuQm94LFxuICAgICAgc2l6ZTogZGVzYy53aWR0aFZlY3RvciA/PyBWZWN0b3IzLmZyb21Db3B5MygxLCAxLCAxKSxcbiAgICAgIHBvc2l0aW9uOiBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAwKSxcbiAgICAgIHJvdGF0aW9uOiBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAwKSxcbiAgICAgIG1vdmU6IGRlc2MucGh5c2ljcy5tb3ZlLFxuICAgICAgZGVuc2l0eTogZGVzYy5waHlzaWNzLmRlbnNpdHksXG4gICAgICBmcmljdGlvbjogZGVzYy5waHlzaWNzLmZyaWN0aW9uLFxuICAgICAgcmVzdGl0dXRpb246IGRlc2MucGh5c2ljcy5yZXN0aXR1dGlvbixcbiAgICB9O1xuICAgIHN0cmF0ZWd5LnNldFNoYXBlKHByb3BlcnR5LCBuZXdFbnRpdHkpO1xuICAgIHBoeXNpY3NDb21wb25lbnQuc2V0U3RyYXRlZ3koc3RyYXRlZ3kpO1xuICB9XG5cbiAgcmV0dXJuIGVudGl0eTtcbn07XG5cbmNvbnN0IGNyZWF0ZUN1YmVzID0gKG51bWJlclRvQ3JlYXRlOiBudW1iZXIsIGRlc2M6IEN1YmVEZXNjcmlwdG9yID0ge30pID0+IHtcbiAgY29uc3QgcHJpbWl0aXZlID0gbmV3IEN1YmUoKTtcbiAgcHJpbWl0aXZlLmdlbmVyYXRlKGRlc2MpO1xuICBjb25zdCBtZXNoID0gbmV3IE1lc2goKTtcbiAgbWVzaC5hZGRQcmltaXRpdmUocHJpbWl0aXZlKTtcblxuICBjb25zdCBlbnRpdGllcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyVG9DcmVhdGU7IGkrKykge1xuICAgIGNvbnN0IGVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gZW50aXR5LmdldE1lc2goKTtcbiAgICBtZXNoQ29tcG9uZW50LnNldE1lc2gobWVzaCk7XG5cbiAgICBpZiAoSXMuZXhpc3QoZGVzYy5waHlzaWNzKSAmJiBkZXNjLnBoeXNpY3MudXNlKSB7XG4gICAgICBjb25zdCBuZXdFbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KFBoeXNpY3NDb21wb25lbnQsIGVudGl0eSk7XG4gICAgICBjb25zdCBwaHlzaWNzQ29tcG9uZW50ID0gbmV3RW50aXR5LmdldFBoeXNpY3MoKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IE9pbW9QaHlzaWNzU3RyYXRlZ3koKTtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge1xuICAgICAgICB0eXBlOiBQaHlzaWNzU2hhcGUuQm94LFxuICAgICAgICBzaXplOiBkZXNjLndpZHRoVmVjdG9yID8/IFZlY3RvcjMuZnJvbUNvcHkzKDEsIDEsIDEpLFxuICAgICAgICBwb3NpdGlvbjogVmVjdG9yMy5mcm9tQ29weTMoMCwgMCwgMCksXG4gICAgICAgIHJvdGF0aW9uOiBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAwKSxcbiAgICAgICAgbW92ZTogZGVzYy5waHlzaWNzLm1vdmUsXG4gICAgICAgIGRlbnNpdHk6IGRlc2MucGh5c2ljcy5kZW5zaXR5LFxuICAgICAgICBmcmljdGlvbjogZGVzYy5waHlzaWNzLmZyaWN0aW9uLFxuICAgICAgICByZXN0aXR1dGlvbjogZGVzYy5waHlzaWNzLnJlc3RpdHV0aW9uLFxuICAgICAgfTtcbiAgICAgIHN0cmF0ZWd5LnNldFNoYXBlKHByb3BlcnR5LCBuZXdFbnRpdHkpO1xuICAgICAgcGh5c2ljc0NvbXBvbmVudC5zZXRTdHJhdGVneShzdHJhdGVneSk7XG4gICAgfVxuICAgIGVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgfVxuXG4gIHJldHVybiBlbnRpdGllcztcbn07XG5cbmNvbnN0IGNyZWF0ZVNwaGVyZSA9IChkZXNjOiBTcGhlcmVEZXNjcmlwdG9yID0ge30pID0+IHtcbiAgY29uc3QgcHJpbWl0aXZlID0gbmV3IFNwaGVyZSgpO1xuICBwcmltaXRpdmUuZ2VuZXJhdGUoZGVzYyk7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZVNoYXBlKHByaW1pdGl2ZSk7XG5cbiAgaWYgKElzLmV4aXN0KGRlc2MucGh5c2ljcykgJiYgZGVzYy5waHlzaWNzLnVzZSkge1xuICAgIGNvbnN0IG5ld0VudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoUGh5c2ljc0NvbXBvbmVudCwgZW50aXR5KTtcbiAgICBjb25zdCBwaHlzaWNzQ29tcG9uZW50ID0gbmV3RW50aXR5LmdldFBoeXNpY3MoKTtcbiAgICBjb25zdCBzdHJhdGVneSA9IG5ldyBPaW1vUGh5c2ljc1N0cmF0ZWd5KCk7XG4gICAgY29uc3QgcHJvcGVydHkgPSB7XG4gICAgICB0eXBlOiBQaHlzaWNzU2hhcGUuU3BoZXJlLFxuICAgICAgc2l6ZTogSXMuZXhpc3QoZGVzYy5yYWRpdXMpXG4gICAgICAgID8gVmVjdG9yMy5mcm9tQ29weTMoZGVzYy5yYWRpdXMsIGRlc2MucmFkaXVzLCBkZXNjLnJhZGl1cylcbiAgICAgICAgOiBWZWN0b3IzLmZyb21Db3B5MygxLCAxLCAxKSxcbiAgICAgIHBvc2l0aW9uOiBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAwKSxcbiAgICAgIHJvdGF0aW9uOiBWZWN0b3IzLmZyb21Db3B5MygwLCAwLCAwKSxcbiAgICAgIG1vdmU6IGRlc2MucGh5c2ljcy5tb3ZlLFxuICAgICAgZGVuc2l0eTogZGVzYy5waHlzaWNzLmRlbnNpdHksXG4gICAgICBmcmljdGlvbjogZGVzYy5waHlzaWNzLmZyaWN0aW9uLFxuICAgICAgcmVzdGl0dXRpb246IGRlc2MucGh5c2ljcy5yZXN0aXR1dGlvbixcbiAgICB9O1xuICAgIHN0cmF0ZWd5LnNldFNoYXBlKHByb3BlcnR5LCBuZXdFbnRpdHkpO1xuICAgIHBoeXNpY3NDb21wb25lbnQuc2V0U3RyYXRlZ3koc3RyYXRlZ3kpO1xuICB9XG5cbiAgcmV0dXJuIGVudGl0eTtcbn07XG5cbmNvbnN0IGNyZWF0ZVNwaGVyZXMgPSAobnVtYmVyVG9DcmVhdGU6IG51bWJlciwgZGVzYzogU3BoZXJlRGVzY3JpcHRvciA9IHt9KSA9PiB7XG4gIGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBTcGhlcmUoKTtcbiAgcHJpbWl0aXZlLmdlbmVyYXRlKGRlc2MpO1xuICBjb25zdCBtZXNoID0gbmV3IE1lc2goKTtcbiAgbWVzaC5hZGRQcmltaXRpdmUocHJpbWl0aXZlKTtcblxuICBjb25zdCBlbnRpdGllcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyVG9DcmVhdGU7IGkrKykge1xuICAgIGNvbnN0IGVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gZW50aXR5LmdldE1lc2goKTtcbiAgICBtZXNoQ29tcG9uZW50LnNldE1lc2gobWVzaCk7XG5cbiAgICBpZiAoSXMuZXhpc3QoZGVzYy5waHlzaWNzKSAmJiBkZXNjLnBoeXNpY3MudXNlKSB7XG4gICAgICBjb25zdCBuZXdFbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KFBoeXNpY3NDb21wb25lbnQsIGVudGl0eSk7XG4gICAgICBjb25zdCBwaHlzaWNzQ29tcG9uZW50ID0gbmV3RW50aXR5LmdldFBoeXNpY3MoKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IE9pbW9QaHlzaWNzU3RyYXRlZ3koKTtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge1xuICAgICAgICB0eXBlOiBQaHlzaWNzU2hhcGUuU3BoZXJlLFxuICAgICAgICBzaXplOiBJcy5leGlzdChkZXNjLnJhZGl1cylcbiAgICAgICAgICA/IFZlY3RvcjMuZnJvbUNvcHkzKGRlc2MucmFkaXVzLCBkZXNjLnJhZGl1cywgZGVzYy5yYWRpdXMpXG4gICAgICAgICAgOiBWZWN0b3IzLmZyb21Db3B5MygxLCAxLCAxKSxcbiAgICAgICAgcG9zaXRpb246IFZlY3RvcjMuZnJvbUNvcHkzKDAsIDAsIDApLFxuICAgICAgICByb3RhdGlvbjogVmVjdG9yMy5mcm9tQ29weTMoMCwgMCwgMCksXG4gICAgICAgIG1vdmU6IGRlc2MucGh5c2ljcy5tb3ZlLFxuICAgICAgICBkZW5zaXR5OiBkZXNjLnBoeXNpY3MuZGVuc2l0eSxcbiAgICAgICAgZnJpY3Rpb246IGRlc2MucGh5c2ljcy5mcmljdGlvbixcbiAgICAgICAgcmVzdGl0dXRpb246IGRlc2MucGh5c2ljcy5yZXN0aXR1dGlvbixcbiAgICAgIH07XG4gICAgICBzdHJhdGVneS5zZXRTaGFwZShwcm9wZXJ0eSwgbmV3RW50aXR5KTtcbiAgICAgIHBoeXNpY3NDb21wb25lbnQuc2V0U3RyYXRlZ3koc3RyYXRlZ3kpO1xuICAgIH1cbiAgICBlbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gIH1cblxuICByZXR1cm4gZW50aXRpZXM7XG59O1xuXG5jb25zdCBjcmVhdGVKb2ludCA9IChkZXNjOiBKb2ludERlc2NyaXB0b3IgPSB7fSkgPT4ge1xuICBjb25zdCBwcmltaXRpdmUgPSBuZXcgSm9pbnQoKTtcbiAgcHJpbWl0aXZlLmdlbmVyYXRlKGRlc2MpO1xuICBjb25zdCBlbnRpdHkgPSBjcmVhdGVTaGFwZShwcmltaXRpdmUpO1xuICByZXR1cm4gZW50aXR5O1xufTtcblxuY29uc3QgY3JlYXRlQXhpcyA9IChkZXNjOiBBeGlzRGVzY3JpcHRvciA9IHt9KSA9PiB7XG4gIGNvbnN0IHByaW1pdGl2ZSA9IG5ldyBBeGlzKCk7XG4gIHByaW1pdGl2ZS5nZW5lcmF0ZShkZXNjKTtcbiAgY29uc3QgZW50aXR5ID0gY3JlYXRlU2hhcGUocHJpbWl0aXZlKTtcbiAgcmV0dXJuIGVudGl0eTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVNoYXBlKHByaW1pdGl2ZTogSVNoYXBlKSB7XG4gIGNvbnN0IGVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgY29uc3QgbWVzaENvbXBvbmVudCA9IGVudGl0eS5nZXRNZXNoKCk7XG4gIGNvbnN0IG1lc2ggPSBuZXcgTWVzaCgpO1xuICBtZXNoLmFkZFByaW1pdGl2ZShwcmltaXRpdmUpO1xuICBtZXNoQ29tcG9uZW50LnNldE1lc2gobWVzaCk7XG4gIHJldHVybiBlbnRpdHk7XG59XG5cbmV4cG9ydCBjb25zdCBNZXNoSGVscGVyID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGNyZWF0ZVBsYW5lLFxuICBjcmVhdGVMaW5lLFxuICBjcmVhdGVHcmlkLFxuICBjcmVhdGVDdWJlLFxuICBjcmVhdGVDdWJlcyxcbiAgY3JlYXRlU3BoZXJlLFxuICBjcmVhdGVTcGhlcmVzLFxuICBjcmVhdGVKb2ludCxcbiAgY3JlYXRlQXhpcyxcbiAgY3JlYXRlU2hhcGUsXG59KTtcbiIsImltcG9ydCB7IFNoYWRlclNlbWFudGljcyB9IGZyb20gJy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVGV4dHVyZVBhcmFtZXRlcic7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi4vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBBYnN0cmFjdFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgTWVzaEhlbHBlciB9IGZyb20gJy4vTWVzaEhlbHBlcic7XG5cbmxldCBfc2FtcGxlcjogU2FtcGxlciB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVuZGVyUGFzcyBmb3IgU2NyZWVuIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gbWF0ZXJpYWxcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjcmVlbkRyYXdSZW5kZXJQYXNzKG1hdGVyaWFsOiBNYXRlcmlhbCkge1xuICBjb25zdCByZW5kZXJQYXNzID0gbmV3IFJlbmRlclBhc3MoKTtcbiAgcmVuZGVyUGFzcy50b0NsZWFyQ29sb3JCdWZmZXIgPSBmYWxzZTtcbiAgcmVuZGVyUGFzcy50b0NsZWFyRGVwdGhCdWZmZXIgPSBmYWxzZTtcbiAgcmVuZGVyUGFzcy5pc0RlcHRoVGVzdCA9IGZhbHNlO1xuICByZW5kZXJQYXNzLnNldEJ1ZmZlckxlc3NGdWxsU2NyZWVuUmVuZGVyaW5nKG1hdGVyaWFsKTtcblxuICByZXR1cm4gcmVuZGVyUGFzcztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVuZGVyUGFzcyBmb3IgU2NyZWVuIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gbWF0ZXJpYWxcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjcmVlbkRyYXdSZW5kZXJQYXNzV2l0aEJhc2VDb2xvclRleHR1cmUoXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgdGV4dHVyZTogQWJzdHJhY3RUZXh0dXJlLFxuICBzYW1wbGVyPzogU2FtcGxlclxuKSB7XG4gIGlmIChfc2FtcGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgX3NhbXBsZXIgPSBuZXcgU2FtcGxlcih7XG4gICAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhcixcbiAgICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgICAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgfSk7XG4gICAgX3NhbXBsZXIuY3JlYXRlKCk7XG4gIH1cbiAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcignYmFzZUNvbG9yVGV4dHVyZScsIHRleHR1cmUsIHNhbXBsZXIgPz8gX3NhbXBsZXIpO1xuXG4gIGNvbnN0IHJlbmRlclBhc3MgPSBuZXcgUmVuZGVyUGFzcygpO1xuICByZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlciA9IGZhbHNlO1xuICByZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA9IGZhbHNlO1xuICByZW5kZXJQYXNzLmlzRGVwdGhUZXN0ID0gZmFsc2U7XG4gIHJlbmRlclBhc3Muc2V0QnVmZmVyTGVzc0Z1bGxTY3JlZW5SZW5kZXJpbmcobWF0ZXJpYWwpO1xuXG4gIHJldHVybiByZW5kZXJQYXNzO1xufVxuXG5leHBvcnQgY29uc3QgUmVuZGVyUGFzc0hlbHBlciA9IE9iamVjdC5mcmVlemUoe1xuICBjcmVhdGVTY3JlZW5EcmF3UmVuZGVyUGFzcyxcbiAgY3JlYXRlU2NyZWVuRHJhd1JlbmRlclBhc3NXaXRoQmFzZUNvbG9yVGV4dHVyZSxcbn0pO1xuIiwiaW1wb3J0IHsgRnJhbWVCdWZmZXIgfSBmcm9tICcuLi9yZW5kZXJlci9GcmFtZUJ1ZmZlcic7XG5pbXBvcnQgeyBSZW5kZXJUYXJnZXRUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvUmVuZGVyVGFyZ2V0VGV4dHVyZSc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyLCBUZXh0dXJlUGFyYW1ldGVyRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IFBpeGVsRm9ybWF0LCBQaXhlbEZvcm1hdEVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QaXhlbEZvcm1hdCc7XG5pbXBvcnQgeyBSZW5kZXJCdWZmZXIgfSBmcm9tICcuLi90ZXh0dXJlcy9SZW5kZXJCdWZmZXInO1xuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCwgVGV4dHVyZUZvcm1hdEVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9UZXh0dXJlRm9ybWF0JztcbmltcG9ydCB7IFJlbmRlclRhcmdldFRleHR1cmVDdWJlIH0gZnJvbSAnLi4vdGV4dHVyZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRleHR1cmVQYXJhbWV0ZXJzIHtcbiAgbGV2ZWw6IG51bWJlcjtcbiAgZm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGcmFtZUJ1ZmZlckRlc2NyaXB0b3Ige1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgdGV4dHVyZU51bTogbnVtYmVyO1xuICB0ZXh0dXJlRm9ybWF0czogVGV4dHVyZUZvcm1hdEVudW1bXTtcbiAgbWlwTGV2ZWxDb3VudD86IG51bWJlcjtcbiAgY3JlYXRlRGVwdGhCdWZmZXI6IGJvb2xlYW47XG4gIGRlcHRoVGV4dHVyZUZvcm1hdD86IFRleHR1cmVGb3JtYXRFbnVtO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFtZUJ1ZmZlcihkZXNjOiBGcmFtZUJ1ZmZlckRlc2NyaXB0b3IpIHtcbiAgY29uc3QgZnJhbWVCdWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbiAgZnJhbWVCdWZmZXIuY3JlYXRlKGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0KTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2MudGV4dHVyZU51bTsgaSsrKSB7XG4gICAgY29uc3QgcmVuZGVyVGFyZ2V0VGV4dHVyZSA9IG5ldyBSZW5kZXJUYXJnZXRUZXh0dXJlKCk7XG5cbiAgICByZW5kZXJUYXJnZXRUZXh0dXJlLmNyZWF0ZSh7XG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICBtaXBMZXZlbENvdW50OiBkZXNjLm1pcExldmVsQ291bnQsXG4gICAgICBmb3JtYXQ6IGRlc2MudGV4dHVyZUZvcm1hdHNbaV0sXG4gICAgfSk7XG4gICAgZnJhbWVCdWZmZXIuc2V0Q29sb3JBdHRhY2htZW50QXQoaSwgcmVuZGVyVGFyZ2V0VGV4dHVyZSk7XG4gIH1cblxuICBpZiAoZGVzYy5jcmVhdGVEZXB0aEJ1ZmZlcikge1xuICAgIGNvbnN0IGRlcHRoVGV4dHVyZSA9IG5ldyBSZW5kZXJUYXJnZXRUZXh0dXJlKCk7XG4gICAgY29uc3QgZGVwdGhCdWZmZXJJbnRlcm5hbEZvcm1hdCA9IGRlc2MuZGVwdGhUZXh0dXJlRm9ybWF0ID8/IFRleHR1cmVGb3JtYXQuRGVwdGgzMkY7XG5cbiAgICBkZXB0aFRleHR1cmUuY3JlYXRlKHtcbiAgICAgIHdpZHRoOiBkZXNjLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkZXNjLmhlaWdodCxcbiAgICAgIG1pcExldmVsQ291bnQ6IDEsXG4gICAgICBmb3JtYXQ6IGRlcHRoQnVmZmVySW50ZXJuYWxGb3JtYXQsXG4gICAgfSk7XG4gICAgZnJhbWVCdWZmZXIuc2V0RGVwdGhBdHRhY2htZW50KGRlcHRoVGV4dHVyZSk7XG4gIH1cblxuICByZXR1cm4gZnJhbWVCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVCdWZmZXJNU0FBRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBjb2xvckJ1ZmZlck51bTogbnVtYmVyO1xuICBjb2xvckZvcm1hdHM6IFRleHR1cmVGb3JtYXRFbnVtW107XG4gIHNhbXBsZUNvdW50TVNBQTogbnVtYmVyO1xuICBkZXB0aEJ1ZmZlckZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYW1lQnVmZmVyTVNBQShkZXNjOiBGcmFtZUJ1ZmZlck1TQUFEZXNjcmlwdG9yKSB7XG4gIGNvbnN0IGZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKCk7XG4gIGZyYW1lQnVmZmVyLmNyZWF0ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXNjLmNvbG9yQnVmZmVyTnVtOyBpKyspIHtcbiAgICBjb25zdCByZW5kZXJCdWZmZXIgPSBuZXcgUmVuZGVyQnVmZmVyKCk7XG4gICAgcmVuZGVyQnVmZmVyLmNyZWF0ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCwgZGVzYy5jb2xvckZvcm1hdHNbaV0sIHtcbiAgICAgIGlzTVNBQTogdHJ1ZSxcbiAgICAgIHNhbXBsZUNvdW50TVNBQTogZGVzYy5zYW1wbGVDb3VudE1TQUEsXG4gICAgfSk7XG4gICAgZnJhbWVCdWZmZXIuc2V0Q29sb3JBdHRhY2htZW50QXQoaSwgcmVuZGVyQnVmZmVyKTtcbiAgfVxuXG4gIGNvbnN0IHJlbmRlckJ1ZmZlciA9IG5ldyBSZW5kZXJCdWZmZXIoKTtcbiAgcmVuZGVyQnVmZmVyLmNyZWF0ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCwgZGVzYy5kZXB0aEJ1ZmZlckZvcm1hdCwge1xuICAgIGlzTVNBQTogdHJ1ZSxcbiAgICBzYW1wbGVDb3VudE1TQUE6IGRlc2Muc2FtcGxlQ291bnRNU0FBLFxuICB9KTtcbiAgZnJhbWVCdWZmZXIuc2V0RGVwdGhBdHRhY2htZW50KHJlbmRlckJ1ZmZlcik7XG5cbiAgcmV0dXJuIGZyYW1lQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZyYW1lQnVmZmVyVGV4dHVyZUFycmF5RGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBhcnJheUxlbmd0aDogbnVtYmVyO1xuICBsZXZlbDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG4gIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhbWVCdWZmZXJUZXh0dXJlQXJyYXkoZGVzYzogRnJhbWVCdWZmZXJUZXh0dXJlQXJyYXlEZXNjcmlwdG9yKSB7XG4gIGNvbnN0IGZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKCk7XG4gIGZyYW1lQnVmZmVyLmNyZWF0ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7XG5cbiAgY29uc3QgcmVuZGVyVGFyZ2V0VGV4dHVyZSA9IG5ldyBSZW5kZXJUYXJnZXRUZXh0dXJlKCk7XG4gIHJlbmRlclRhcmdldFRleHR1cmUuY3JlYXRlVGV4dHVyZUFycmF5KHtcbiAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICBoZWlnaHQ6IGRlc2MuaGVpZ2h0LFxuICAgIGxldmVsOiBkZXNjLmxldmVsLFxuICAgIGludGVybmFsRm9ybWF0OiBkZXNjLmludGVybmFsRm9ybWF0LFxuICAgIGZvcm1hdDogZGVzYy5mb3JtYXQsXG4gICAgdHlwZTogZGVzYy50eXBlLFxuICAgIGFycmF5TGVuZ3RoOiBkZXNjLmFycmF5TGVuZ3RoLFxuICB9KTtcbiAgZnJhbWVCdWZmZXIuc2V0Q29sb3JBdHRhY2htZW50QXQoMCwgcmVuZGVyVGFyZ2V0VGV4dHVyZSk7XG5cbiAgY29uc3QgcmVuZGVyVGFyZ2V0RGVwdGhTdGVuY2lsVGV4dHVyZSA9IG5ldyBSZW5kZXJUYXJnZXRUZXh0dXJlKCk7XG4gIHJlbmRlclRhcmdldERlcHRoU3RlbmNpbFRleHR1cmUuY3JlYXRlVGV4dHVyZUFycmF5KHtcbiAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICBoZWlnaHQ6IGRlc2MuaGVpZ2h0LFxuICAgIGxldmVsOiBkZXNjLmxldmVsLFxuICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlRm9ybWF0LkRlcHRoMzJGU3RlbmNpbDgsXG4gICAgZm9ybWF0OiBQaXhlbEZvcm1hdC5EZXB0aFN0ZW5jaWwsXG4gICAgdHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICBhcnJheUxlbmd0aDogZGVzYy5hcnJheUxlbmd0aCxcbiAgfSk7XG5cbiAgZnJhbWVCdWZmZXIuc2V0RGVwdGhTdGVuY2lsQXR0YWNobWVudChyZW5kZXJUYXJnZXREZXB0aFN0ZW5jaWxUZXh0dXJlKTtcblxuICByZXR1cm4gZnJhbWVCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVCdWZmZXJDdWJlTWFwRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0ZXh0dXJlRm9ybWF0OiBUZXh0dXJlRm9ybWF0RW51bTtcbiAgbWlwTGV2ZWxDb3VudD86IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhbWVCdWZmZXJDdWJlTWFwKFxuICBkZXNjOiBGcmFtZUJ1ZmZlckN1YmVNYXBEZXNjcmlwdG9yXG4pOiBbRnJhbWVCdWZmZXIsIFJlbmRlclRhcmdldFRleHR1cmVDdWJlXSB7XG4gIGNvbnN0IGZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKCk7XG4gIGZyYW1lQnVmZmVyLmNyZWF0ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7XG5cbiAgY29uc3QgcmVuZGVyVGFyZ2V0VGV4dHVyZSA9IG5ldyBSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSgpO1xuXG4gIHJlbmRlclRhcmdldFRleHR1cmUuY3JlYXRlKHtcbiAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICBoZWlnaHQ6IGRlc2MuaGVpZ2h0LFxuICAgIG1pcExldmVsQ291bnQ6IGRlc2MubWlwTGV2ZWxDb3VudCxcbiAgICBmb3JtYXQ6IGRlc2MudGV4dHVyZUZvcm1hdCxcbiAgfSk7XG5cbiAgZnJhbWVCdWZmZXIuc2V0Q29sb3JBdHRhY2htZW50Q3ViZUF0KDAsIDAsIDAsIHJlbmRlclRhcmdldFRleHR1cmUpO1xuXG4gIHJldHVybiBbZnJhbWVCdWZmZXIsIHJlbmRlclRhcmdldFRleHR1cmVdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZXB0aEJ1ZmZlcihcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIHsgbGV2ZWwgPSAwLCBpbnRlcm5hbEZvcm1hdCA9IFRleHR1cmVGb3JtYXQuRGVwdGgzMkYgfVxuKSB7XG4gIGNvbnN0IGZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKCk7XG4gIGZyYW1lQnVmZmVyLmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZXB0aFRleHR1cmUgPSBuZXcgUmVuZGVyVGFyZ2V0VGV4dHVyZSgpO1xuICBkZXB0aFRleHR1cmUuY3JlYXRlKHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbWlwTGV2ZWxDb3VudDogMSxcbiAgICBmb3JtYXQ6IGludGVybmFsRm9ybWF0LFxuICB9KTtcblxuICBmcmFtZUJ1ZmZlci5zZXREZXB0aEF0dGFjaG1lbnQoZGVwdGhUZXh0dXJlKTtcblxuICByZXR1cm4gZnJhbWVCdWZmZXI7XG59XG5cbmV4cG9ydCBjb25zdCBSZW5kZXJhYmxlSGVscGVyID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGNyZWF0ZUZyYW1lQnVmZmVyLFxuICBjcmVhdGVGcmFtZUJ1ZmZlck1TQUEsXG4gIGNyZWF0ZUZyYW1lQnVmZmVyVGV4dHVyZUFycmF5LFxuICBjcmVhdGVGcmFtZUJ1ZmZlckN1YmVNYXAsXG4gIGNyZWF0ZURlcHRoQnVmZmVyLFxufSk7XG4iLCJleHBvcnQgKiBmcm9tICcuL0VudGl0eUhlbHBlcic7XG5leHBvcnQgKiBmcm9tICcuL0V4cHJlc3Npb25IZWxwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9NYXRlcmlhbEhlbHBlcic7XG5leHBvcnQgKiBmcm9tICcuL01lc2hIZWxwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9SZW5kZXJhYmxlSGVscGVyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVuZGVyUGFzc0hlbHBlcic7XG4iLCJpbXBvcnQgeyBSbk0yIH0gZnJvbSAnLi4vLi4vdHlwZXMvUm5NMic7XG5pbXBvcnQgeyBNb2RlbENvbnZlcnRlciB9IGZyb20gJy4vTW9kZWxDb252ZXJ0ZXInO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBBbmltYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0FuaW1hdGlvbi9BbmltYXRpb25Db21wb25lbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiB9IGZyb20gJy4uL2RlZmluaXRpb25zL0FuaW1hdGlvbkludGVycG9sYXRpb24nO1xuaW1wb3J0IHsgSW5kZXggfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBWcm0weCB9IGZyb20gJy4uLy4uL3R5cGVzL1ZSTTB4JztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IEFic29sdXRlQW5pbWF0aW9uLCBHbG9iYWxSZXRhcmdldCwgSUFuaW1hdGlvblJldGFyZ2V0IH0gZnJvbSAnLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBWcm0xIH0gZnJvbSAnLi4vLi4vdHlwZXMvVlJNMSc7XG5pbXBvcnQgeyBSbk0yVnJtYSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IEdsb2JhbFJldGFyZ2V0UmV2ZXJzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2tlbGV0YWwvQW5pbWF0aW9uUmV0YXJnZXQvR2xvYmFsUmV0YXJnZXRSZXZlcnNlJztcbmltcG9ydCB7IEFuaW1hdGlvblN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9BbmltYXRpb25TdGF0ZS9BbmltYXRpb25TdGF0ZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbnR5cGUgUmV0YXJnZXRNb2RlID0gJ25vbmUnIHwgJ2dsb2JhbCcgfCAnYWJzb2x1dGUnO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uQXNzaWduZXIge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBBbmltYXRpb25Bc3NpZ25lcjtcblxuICAvKipcbiAgICogQXNzaWduIEFuaW1hdGlvbiBGdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0gcm9vdEVudGl0eSAtIFRoZSByb290IGVudGl0eSBvZiB0aGUgbW9kZWwgd2hpY2ggeW91IHdhbnQgdG8gYXNzaWduIGFuaW1hdGlvbi5cbiAgICogQHBhcmFtIGdsdGZNb2RlbCAtIFRoZSBnbFRGIG1vZGVsIHRoYXQgaGFzIGFuaW1hdGlvbiBkYXRhLlxuICAgKiBAcGFyYW0gdnJtTW9kZWwgLSBUaGUgY29ycmVzcG9uZGluZyBWUk0gbW9kZWwgdG8gdGhlIGdsVEYgbW9kZWwuXG4gICAqIEBwYXJhbSBpc1NhbWVTa2VsZXRvblxuICAgKiBAcGFyYW0gcmV0YXJnZXRNb2RlIC0gUmV0YXJnZXQgbW9kZS4gJ25vbmUnIHwgJ2dsb2JhbCcgfCAnZ2xvYmFsMicgfCAnYWJzb2x1dGUnXG4gICAqIEBwYXJhbSBzcmNSb290RW50aXR5Rm9yUmV0YXJnZXRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzc2lnbkFuaW1hdGlvbihcbiAgICByb290RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSxcbiAgICBnbHRmTW9kZWw6IFJuTTIsXG4gICAgdnJtTW9kZWw6IFZybTB4IHwgVnJtMSxcbiAgICBpc1NhbWVTa2VsZXRvbjogYm9vbGVhbixcbiAgICByZXRhcmdldE1vZGU6IFJldGFyZ2V0TW9kZVxuICApIHtcbiAgICB0aGlzLl9fcmVzZXRBbmltYXRpb25BbmRQb3NlKHJvb3RFbnRpdHkpO1xuXG4gICAgdGhpcy5fX3NldHVwQW5pbWF0aW9uRm9yU2FtZVNrZWxldG9uKFxuICAgICAgcm9vdEVudGl0eSxcbiAgICAgIGdsdGZNb2RlbCxcbiAgICAgIHZybU1vZGVsLFxuICAgICAgaXNTYW1lU2tlbGV0b24sXG4gICAgICByZXRhcmdldE1vZGVcbiAgICApO1xuXG4gICAgcmV0dXJuIHJvb3RFbnRpdHk7XG4gIH1cblxuICBhc3NpZ25BbmltYXRpb25XaXRoVnJtYShcbiAgICByb290RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSxcbiAgICB2cm1hTW9kZWw6IFJuTTJWcm1hLFxuICAgIHBvc3RmaXhUb1RyYWNrTmFtZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLl9fcmVzZXRBbmltYXRpb25BbmRQb3NlKHJvb3RFbnRpdHksIHBvc3RmaXhUb1RyYWNrTmFtZSk7XG5cbiAgICBsZXQgdHJhY2tOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgY29uc3Qgc2V0UmV0YXJnZXQgPSAodnJtYTogUm5NMlZybWEpID0+IHtcbiAgICAgIGlmICh2cm1hLmFuaW1hdGlvbnMgPT0gbnVsbCB8fCB2cm1hLmFuaW1hdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgRW50aXR5UmVwb3NpdG9yeS5hZGRDb21wb25lbnRUb0VudGl0eShBbmltYXRpb25TdGF0ZUNvbXBvbmVudCwgcm9vdEVudGl0eSk7XG5cbiAgICAgIGZvciAoY29uc3QgYW5pbWF0aW9uIG9mIHZybWEuYW5pbWF0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IHNhbXBsZXIgb2YgYW5pbWF0aW9uLnNhbXBsZXJzKSB7XG4gICAgICAgICAgTW9kZWxDb252ZXJ0ZXIuX3JlYWRCaW5hcnlGcm9tQWNjZXNzb3JBbmRTZXRJdFRvQWNjZXNzb3JFeHRyYXMoc2FtcGxlci5pbnB1dE9iamVjdCEpO1xuICAgICAgICAgIE1vZGVsQ29udmVydGVyLl9yZWFkQmluYXJ5RnJvbUFjY2Vzc29yQW5kU2V0SXRUb0FjY2Vzc29yRXh0cmFzKHNhbXBsZXIub3V0cHV0T2JqZWN0ISk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBhbmltYXRpb24gb2YgdnJtYS5hbmltYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBhbmltYXRpb24uY2hhbm5lbHMpIHtcbiAgICAgICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGpvaW50IGVudGl0eVxuICAgICAgICAgIC8vIGNvbnN0IG5vZGUgPSBnbHRmTW9kZWwubm9kZXNbY2hhbm5lbC50YXJnZXQhLm5vZGUhXTtcbiAgICAgICAgICBjb25zdCBybkVudGl0eSA9IHRoaXMuX19nZXRDb3JyZXNwb25kaW5nRW50aXR5V2l0aFZybWEoXG4gICAgICAgICAgICByb290RW50aXR5LFxuICAgICAgICAgICAgdnJtYSxcbiAgICAgICAgICAgIGNoYW5uZWwudGFyZ2V0IS5ub2RlIVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJuRW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdSbkVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoQW5pbWF0aW9uQ29tcG9uZW50LCBybkVudGl0eSk7XG4gICAgICAgICAgICBjb25zdCBhbmltYXRpb25Db21wb25lbnQgPSBuZXdSbkVudGl0eS5nZXRBbmltYXRpb24oKTtcblxuICAgICAgICAgICAgY29uc3QgZ2x0ZkVudGl0eSA9IHZybWEuZXh0cmFzLnJuRW50aXRpZXNbY2hhbm5lbC50YXJnZXQhLm5vZGUhXTtcbiAgICAgICAgICAgIGNvbnN0IGh1bWFuQm9uZXMgPSB2cm1hLmV4dGVuc2lvbnMuVlJNQ192cm1fYW5pbWF0aW9uLmh1bWFub2lkQm9uZU5hbWVNYXAhO1xuICAgICAgICAgICAgY29uc3QgaHVtYW5vaWRCb25lTmFtZSA9IGh1bWFuQm9uZXMuZ2V0KGNoYW5uZWwudGFyZ2V0IS5ub2RlISkhO1xuICAgICAgICAgICAgZ2x0ZkVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoaHVtYW5vaWRCb25lTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGxldCByZXRhcmdldDogSUFuaW1hdGlvblJldGFyZ2V0IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHJvb3RFbnRpdHkudHJ5VG9HZXRWcm0oKSEuX3ZlcnNpb24gPT09ICcwLngnKSB7XG4gICAgICAgICAgICAgIHJldGFyZ2V0ID0gbmV3IEdsb2JhbFJldGFyZ2V0UmV2ZXJzZShnbHRmRW50aXR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdEVudGl0eS50cnlUb0dldFZybSgpIS5fdmVyc2lvbiA9PT0gJzEuMCcpIHtcbiAgICAgICAgICAgICAgcmV0YXJnZXQgPSBuZXcgR2xvYmFsUmV0YXJnZXQoZ2x0ZkVudGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IGFuaW1hdGlvbkNvbXBvbmVudC5fc2V0UmV0YXJnZXQocmV0YXJnZXQhLCBwb3N0Zml4VG9UcmFja05hbWUpO1xuICAgICAgICAgICAgbmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICB0cmFja05hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgcmV0YXJnZXRcbiAgICBzZXRSZXRhcmdldCh2cm1hTW9kZWwpO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20odHJhY2tOYW1lcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwcml2YXRlIF9fcmVzZXRBbmltYXRpb25BbmRQb3NlKHJvb3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5LCBwb3N0Zml4VG9UcmFja05hbWU/OiBzdHJpbmcpIHtcbiAgICBmdW5jdGlvbiByZXNldEFuaW1hdGlvbkFuZFBvc2UoZW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSwgcG9zdGZpeFRvVHJhY2tOYW1lPzogc3RyaW5nKSB7XG4gICAgICBjb25zdCBhbmltYXRpb25Db21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRBbmltYXRpb24oKTtcbiAgICAgIGlmIChhbmltYXRpb25Db21wb25lbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAocG9zdGZpeFRvVHJhY2tOYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBhbmltYXRpb25Db21wb25lbnQucmVzZXRBbmltYXRpb25UcmFja0J5UG9zdGZpeChwb3N0Zml4VG9UcmFja05hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFuaW1hdGlvbkNvbXBvbmVudC5yZXNldEFuaW1hdGlvblRyYWNrcygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbnRpdHkuZ2V0VHJhbnNmb3JtKCkuX3Jlc3RvcmVUcmFuc2Zvcm1Gcm9tUmVzdCgpO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbnRpdHkuY2hpbGRyZW4pIHtcbiAgICAgICAgcmVzZXRBbmltYXRpb25BbmRQb3NlKGNoaWxkLmVudGl0eSwgcG9zdGZpeFRvVHJhY2tOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzZXRBbmltYXRpb25BbmRQb3NlKHJvb3RFbnRpdHksIHBvc3RmaXhUb1RyYWNrTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0YXRpYyBtZXRob2QgdG8gZ2V0IHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgTW9kZWxDb252ZXJ0ZXIgY2xhc3NcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBBbmltYXRpb25Bc3NpZ25lciB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBBbmltYXRpb25Bc3NpZ25lcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2dldENvcnJlc3BvbmRpbmdFbnRpdHkoXG4gICAgcm9vdEVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHksXG4gICAgZ2x0Zk1vZGVsOiBSbk0yLFxuICAgIHZybU1vZGVsOiBWcm0weCB8IFZybTEsXG4gICAgbm9kZUluZGV4OiBJbmRleCxcbiAgICBub2RlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGlzU2FtZVNrZWxldG9uOiBib29sZWFuXG4gICkge1xuICAgIGlmIChpc1NhbWVTa2VsZXRvbikge1xuICAgICAgLy8gaXNTYW1lU2tlbGV0b24gaXMgdHJ1ZSwgc28gd2UgZmluZCBqb2ludHMgZnJvbSBqb2ludHMgbmFtZS5cbiAgICAgIGNvbnN0IHJuRW50aXRpZXMgPSByb290RW50aXR5LmdldFRhZ1ZhbHVlKCdybkVudGl0aWVzQnlOYW1lcycpISBhcyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgSVNjZW5lR3JhcGhFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCBub2RlID0gZ2x0Zk1vZGVsLm5vZGVzW25vZGVJbmRleF07XG4gICAgICBjb25zdCBybkVudGl0eSA9IHJuRW50aXRpZXMuZ2V0KG5vZGUubmFtZSEpO1xuICAgICAgcmV0dXJuIHJuRW50aXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpc1NhbWVTa2VsZXRvbiBpcyBmYWxzZSwgc28gd2UgZmluZCBqb2ludHMgZnJvbSBodW1hbm9pZCBib25lIG1hcHBpbmcgZGF0YVxuICAgICAgaWYgKElzLmV4aXN0KHZybU1vZGVsLmV4dGVuc2lvbnMuVlJNKSkge1xuICAgICAgICAvLyBWUk0wLnhcbiAgICAgICAgY29uc3QgaHVtYW5Cb25lcyA9IHZybU1vZGVsLmV4dGVuc2lvbnMuVlJNLmh1bWFub2lkLmh1bWFuQm9uZXM7XG4gICAgICAgIGxldCBodW1hbm9pZEJvbmVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNyY01hcE5vZGVJZE5hbWU6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHNyY01hcE5vZGVOYW1lTmFtZTogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBib25lIG9mIGh1bWFuQm9uZXMpIHtcbiAgICAgICAgICBzcmNNYXBOb2RlSWROYW1lLnNldChib25lLm5vZGUsIGJvbmUuYm9uZSk7XG4gICAgICAgICAgc3JjTWFwTm9kZU5hbWVOYW1lLnNldChib25lLm5hbWUhLCBib25lLmJvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgaHVtYW5vaWRCb25lTmFtZSA9IHNyY01hcE5vZGVOYW1lTmFtZS5nZXQobm9kZU5hbWUpO1xuICAgICAgICAgIGlmIChodW1hbm9pZEJvbmVOYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIGh1bWFub2lkQm9uZU5hbWUgPSBzcmNNYXBOb2RlSWROYW1lLmdldChub2RlSW5kZXgpITtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZHN0TWFwTmFtZU5vZGVJZCA9IHJvb3RFbnRpdHkuZ2V0VGFnVmFsdWUoJ2h1bWFub2lkX21hcF9uYW1lX25vZGVJZCcpISBhcyBNYXA8XG4gICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgIG51bWJlclxuICAgICAgICA+O1xuICAgICAgICBjb25zdCBkc3RCb25lTm9kZUlkID0gZHN0TWFwTmFtZU5vZGVJZC5nZXQoaHVtYW5vaWRCb25lTmFtZSEpO1xuICAgICAgICBpZiAoZHN0Qm9uZU5vZGVJZCAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgcm5FbnRpdGllcyA9IHJvb3RFbnRpdHkuZ2V0VGFnVmFsdWUoJ3JuRW50aXRpZXMnKSEgYXMgSVNjZW5lR3JhcGhFbnRpdHlbXTtcbiAgICAgICAgICByZXR1cm4gcm5FbnRpdGllc1tkc3RCb25lTm9kZUlkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBodW1hbm9pZEJvbmVOYW1lOiAke2h1bWFub2lkQm9uZU5hbWV9LCBub2RlSW5kZXg6ICR7bm9kZUluZGV4fSwgbm9kZU5hbWU6ICR7bm9kZU5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChJcy5leGlzdCh2cm1Nb2RlbC5leHRlbnNpb25zLlZSTUNfdnJtKSkge1xuICAgICAgICAvLyBWUk0xLjBcbiAgICAgICAgY29uc3QgaHVtYW5Cb25lcyA9IHZybU1vZGVsLmV4dGVuc2lvbnMuVlJNQ192cm0uaHVtYW5vaWQuaHVtYW5Cb25lcztcbiAgICAgICAgbGV0IGh1bWFub2lkQm9uZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3JjTWFwTm9kZUlkTmFtZTogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBib25lTmFtZSBpbiBodW1hbkJvbmVzKSB7XG4gICAgICAgICAgY29uc3QgYm9uZSA9IGh1bWFuQm9uZXNbYm9uZU5hbWVdO1xuICAgICAgICAgIHNyY01hcE5vZGVJZE5hbWUuc2V0KGJvbmUubm9kZSwgYm9uZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgaHVtYW5vaWRCb25lTmFtZSA9IHNyY01hcE5vZGVJZE5hbWUuZ2V0KG5vZGVJbmRleCkhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdE1hcE5hbWVOb2RlSWQgPSByb290RW50aXR5LmdldFRhZ1ZhbHVlKCdodW1hbm9pZF9tYXBfbmFtZV9ub2RlSWQnKSEgYXMgTWFwPFxuICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICBudW1iZXJcbiAgICAgICAgPjtcbiAgICAgICAgY29uc3QgZHN0Qm9uZU5vZGVJZCA9IGRzdE1hcE5hbWVOb2RlSWQuZ2V0KGh1bWFub2lkQm9uZU5hbWUhKTtcbiAgICAgICAgaWYgKGRzdEJvbmVOb2RlSWQgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJuRW50aXRpZXMgPSByb290RW50aXR5LmdldFRhZ1ZhbHVlKCdybkVudGl0aWVzJykhIGFzIElTY2VuZUdyYXBoRW50aXR5W107XG4gICAgICAgICAgcmV0dXJuIHJuRW50aXRpZXNbZHN0Qm9uZU5vZGVJZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgaHVtYW5vaWRCb25lTmFtZTogJHtodW1hbm9pZEJvbmVOYW1lfSwgbm9kZUluZGV4OiAke25vZGVJbmRleH0sIG5vZGVOYW1lOiAke25vZGVOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2dldENvcnJlc3BvbmRpbmdFbnRpdHlXaXRoVnJtYShcbiAgICByb290RW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSxcbiAgICBnbHRmTW9kZWw6IFJuTTJWcm1hLFxuICAgIG5vZGVJbmRleDogSW5kZXhcbiAgKSB7XG4gICAgLy8gVlJNMS4wXG4gICAgY29uc3QgaHVtYW5Cb25lcyA9IGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTUNfdnJtX2FuaW1hdGlvbi5odW1hbm9pZEJvbmVOYW1lTWFwITtcbiAgICBjb25zdCBodW1hbm9pZEJvbmVOYW1lID0gaHVtYW5Cb25lcy5nZXQobm9kZUluZGV4KSE7XG4gICAgY29uc3QgZHN0TWFwTmFtZU5vZGVJZCA9IHJvb3RFbnRpdHkuZ2V0VGFnVmFsdWUoJ2h1bWFub2lkX21hcF9uYW1lX25vZGVJZCcpISBhcyBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICBudW1iZXJcbiAgICA+O1xuICAgIGNvbnN0IGRzdEJvbmVOb2RlSWQgPSBkc3RNYXBOYW1lTm9kZUlkLmdldChodW1hbm9pZEJvbmVOYW1lISk7XG4gICAgaWYgKGRzdEJvbmVOb2RlSWQgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgcm5FbnRpdGllcyA9IHJvb3RFbnRpdHkuZ2V0VGFnVmFsdWUoJ3JuRW50aXRpZXMnKSEgYXMgSVNjZW5lR3JhcGhFbnRpdHlbXTtcbiAgICAgIGNvbnN0IHJuRW50aXR5ID0gcm5FbnRpdGllc1tkc3RCb25lTm9kZUlkXTtcbiAgICAgIC8vIGlmIChodW1hbm9pZEJvbmVOYW1lID09PSAnaGlwcycpIHtcbiAgICAgIC8vICAgcm5FbnRpdHkucGFyZW50IS5zY2FsZSA9IFZlY3RvcjMuZnJvbUNvcHkzKDEwMCwgMTAwLCAxMDApO1xuICAgICAgLy8gfVxuXG4gICAgICByZXR1cm4gcm5FbnRpdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5pbmZvKGBodW1hbm9pZEJvbmVOYW1lOiAke2h1bWFub2lkQm9uZU5hbWV9LCBub2RlSW5kZXg6ICR7bm9kZUluZGV4fWApO1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9faXNIaXBzKHJvb3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5LCB2cm1Nb2RlbDogVnJtMHggfCBWcm0xLCBub2RlSW5kZXg6IEluZGV4KSB7XG4gICAgY29uc3Qgc3JjTWFwTm9kZUlkTmFtZTogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICBpZiAoSXMuZXhpc3QodnJtTW9kZWwuZXh0ZW5zaW9ucy5WUk0pKSB7XG4gICAgICBjb25zdCBodW1hbkJvbmVzID0gdnJtTW9kZWwuZXh0ZW5zaW9ucy5WUk0uaHVtYW5vaWQuaHVtYW5Cb25lcztcbiAgICAgIGZvciAoY29uc3QgYm9uZSBvZiBodW1hbkJvbmVzKSB7XG4gICAgICAgIHNyY01hcE5vZGVJZE5hbWUuc2V0KGJvbmUubm9kZSwgYm9uZS5ib25lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKElzLmV4aXN0KHZybU1vZGVsLmV4dGVuc2lvbnMuVlJNQ192cm0pKSB7XG4gICAgICBjb25zdCBodW1hbkJvbmVzID0gdnJtTW9kZWwuZXh0ZW5zaW9ucy5WUk1DX3ZybS5odW1hbm9pZC5odW1hbkJvbmVzO1xuICAgICAgZm9yIChjb25zdCBib25lTmFtZSBpbiBodW1hbkJvbmVzKSB7XG4gICAgICAgIGNvbnN0IGJvbmUgPSBodW1hbkJvbmVzW2JvbmVOYW1lXTtcbiAgICAgICAgc3JjTWFwTm9kZUlkTmFtZS5zZXQoYm9uZS5ub2RlLCBib25lTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRzdE1hcE5hbWVOb2RlSWQgPSByb290RW50aXR5LmdldFRhZ1ZhbHVlKCdodW1hbm9pZF9tYXBfbmFtZV9ub2RlSWQnKSEgYXMgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgbnVtYmVyXG4gICAgPjtcbiAgICBjb25zdCBodW1hbm9pZEJvbmVOYW1lID0gc3JjTWFwTm9kZUlkTmFtZS5nZXQobm9kZUluZGV4KSE7XG4gICAgaWYgKGh1bWFub2lkQm9uZU5hbWUgPT09ICdoaXBzJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fc2V0dXBBbmltYXRpb25Gb3JTYW1lU2tlbGV0b24oXG4gICAgcm9vdEVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHksXG4gICAgZ2x0Zk1vZGVsOiBSbk0yLFxuICAgIHZybU1vZGVsOiBWcm0weCB8IFZybTEsXG4gICAgaXNTYW1lU2tlbGV0b246IGJvb2xlYW4sXG4gICAgcmV0YXJnZXRNb2RlOiBSZXRhcmdldE1vZGVcbiAgKSB7XG4gICAgaWYgKGdsdGZNb2RlbC5hbmltYXRpb25zID09IG51bGwgfHwgZ2x0Zk1vZGVsLmFuaW1hdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgRW50aXR5UmVwb3NpdG9yeS5hZGRDb21wb25lbnRUb0VudGl0eShBbmltYXRpb25TdGF0ZUNvbXBvbmVudCwgcm9vdEVudGl0eSk7XG5cbiAgICBmb3IgKGNvbnN0IGFuaW1hdGlvbiBvZiBnbHRmTW9kZWwuYW5pbWF0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzYW1wbGVyIG9mIGFuaW1hdGlvbi5zYW1wbGVycykge1xuICAgICAgICBNb2RlbENvbnZlcnRlci5fcmVhZEJpbmFyeUZyb21BY2Nlc3NvckFuZFNldEl0VG9BY2Nlc3NvckV4dHJhcyhzYW1wbGVyLmlucHV0T2JqZWN0ISk7XG4gICAgICAgIE1vZGVsQ29udmVydGVyLl9yZWFkQmluYXJ5RnJvbUFjY2Vzc29yQW5kU2V0SXRUb0FjY2Vzc29yRXh0cmFzKHNhbXBsZXIub3V0cHV0T2JqZWN0ISk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhbmltYXRpb24gb2YgZ2x0Zk1vZGVsLmFuaW1hdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBhbmltYXRpb24uY2hhbm5lbHMpIHtcbiAgICAgICAgLy8gZ2V0IGFuaW1hdGlvbiBkYXRhXG4gICAgICAgIGNvbnN0IGFuaW1JbnB1dEFycmF5ID0gY2hhbm5lbC5zYW1wbGVyT2JqZWN0Py5pbnB1dE9iamVjdD8uZXh0cmFzIS50eXBlZERhdGFBcnJheTtcbiAgICAgICAgY29uc3QgYW5pbU91dHB1dEFycmF5ID0gY2hhbm5lbC5zYW1wbGVyT2JqZWN0Py5vdXRwdXRPYmplY3Q/LmV4dHJhcyEudHlwZWREYXRhQXJyYXk7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPVxuICAgICAgICAgIGNoYW5uZWwuc2FtcGxlck9iamVjdCEuaW50ZXJwb2xhdGlvbiAhPSBudWxsXG4gICAgICAgICAgICA/IGNoYW5uZWwuc2FtcGxlck9iamVjdCEuaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgOiAnTElORUFSJztcblxuICAgICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGpvaW50IGVudGl0eVxuICAgICAgICBjb25zdCBub2RlID0gZ2x0Zk1vZGVsLm5vZGVzW2NoYW5uZWwudGFyZ2V0IS5ub2RlIV07XG4gICAgICAgIGNvbnN0IHJuRW50aXR5ID0gdGhpcy5fX2dldENvcnJlc3BvbmRpbmdFbnRpdHkoXG4gICAgICAgICAgcm9vdEVudGl0eSxcbiAgICAgICAgICBnbHRmTW9kZWwsXG4gICAgICAgICAgdnJtTW9kZWwsXG4gICAgICAgICAgY2hhbm5lbC50YXJnZXQhLm5vZGUhLFxuICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICBpc1NhbWVTa2VsZXRvblxuICAgICAgICApO1xuICAgICAgICBpZiAocm5FbnRpdHkpIHtcbiAgICAgICAgICBjb25zdCBuZXdSbkVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoQW5pbWF0aW9uQ29tcG9uZW50LCBybkVudGl0eSk7XG4gICAgICAgICAgY29uc3QgYW5pbWF0aW9uQ29tcG9uZW50ID0gbmV3Um5FbnRpdHkuZ2V0QW5pbWF0aW9uKCk7XG5cbiAgICAgICAgICBpZiAocmV0YXJnZXRNb2RlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIC8vIGFwcGx5IGFuaW1hdGlvbiBkYXRhIHRvIHRoZSB0YXJnZXQgam9pbnQgZW50aXR5XG4gICAgICAgICAgICBsZXQgYW5pbWF0aW9uQXR0cmlidXRlVHlwZSA9ICd0cmFuc2xhdGUnO1xuICAgICAgICAgICAgaWYgKGNoYW5uZWwudGFyZ2V0IS5wYXRoID09PSAndHJhbnNsYXRpb24nKSB7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbkF0dHJpYnV0ZVR5cGUgPSAndHJhbnNsYXRlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbC50YXJnZXQhLnBhdGghID09PSAncm90YXRpb24nKSB7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbkF0dHJpYnV0ZVR5cGUgPSAncXVhdGVybmlvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhbmltYXRpb25BdHRyaWJ1dGVUeXBlID0gY2hhbm5lbC50YXJnZXQhLnBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW5pbWF0aW9uQXR0cmlidXRlVHlwZSA9PT0gJ3F1YXRlcm5pb24nKSB7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbkNvbXBvbmVudC5zZXRBbmltYXRpb24oXG4gICAgICAgICAgICAgICAgSXMuZXhpc3QoYW5pbWF0aW9uLm5hbWUpID8gYW5pbWF0aW9uLm5hbWUhIDogJ1VudGl0bGVkJyxcbiAgICAgICAgICAgICAgICBhbmltYXRpb25BdHRyaWJ1dGVUeXBlLFxuICAgICAgICAgICAgICAgIGFuaW1JbnB1dEFycmF5ISxcbiAgICAgICAgICAgICAgICBhbmltT3V0cHV0QXJyYXkhLFxuICAgICAgICAgICAgICAgIDQsIC8vIFF1YXRlcm5pb25cbiAgICAgICAgICAgICAgICBBbmltYXRpb25JbnRlcnBvbGF0aW9uLmZyb21TdHJpbmcoaW50ZXJwb2xhdGlvbilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGFuaW1hdGlvbkF0dHJpYnV0ZVR5cGUgPT09ICd0cmFuc2xhdGUnICYmXG4gICAgICAgICAgICAgIHRoaXMuX19pc0hpcHMocm9vdEVudGl0eSwgdnJtTW9kZWwsIGNoYW5uZWwudGFyZ2V0IS5ub2RlISlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBhbmltYXRpb25Db21wb25lbnQuc2V0QW5pbWF0aW9uKFxuICAgICAgICAgICAgICAgIElzLmV4aXN0KGFuaW1hdGlvbi5uYW1lKSA/IGFuaW1hdGlvbi5uYW1lISA6ICdVbnRpdGxlZCcsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uQXR0cmlidXRlVHlwZSxcbiAgICAgICAgICAgICAgICBhbmltSW5wdXRBcnJheSEsXG4gICAgICAgICAgICAgICAgYW5pbU91dHB1dEFycmF5ISxcbiAgICAgICAgICAgICAgICAzLCAvLyB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBBbmltYXRpb25JbnRlcnBvbGF0aW9uLmZyb21TdHJpbmcoaW50ZXJwb2xhdGlvbilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZ2x0ZkVudGl0eSA9IGdsdGZNb2RlbC5leHRyYXMucm5FbnRpdGllc1tjaGFubmVsLnRhcmdldCEubm9kZSFdO1xuICAgICAgICAgICAgbGV0IHJldGFyZ2V0OiBJQW5pbWF0aW9uUmV0YXJnZXQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAocmV0YXJnZXRNb2RlID09PSAnZ2xvYmFsJykge1xuICAgICAgICAgICAgICByZXRhcmdldCA9IG5ldyBHbG9iYWxSZXRhcmdldChnbHRmRW50aXR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0YXJnZXRNb2RlID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgICAgICAgIHJldGFyZ2V0ID0gbmV3IEFic29sdXRlQW5pbWF0aW9uKGdsdGZFbnRpdHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHJldGFyZ2V0IG1vZGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuaW1hdGlvbkNvbXBvbmVudC5fc2V0UmV0YXJnZXQocmV0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi9taXNjL0RhdGFVdGlsJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2dlb21ldHJ5L1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBNYXRlcmlhbEhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvTWF0ZXJpYWxIZWxwZXInO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlLCBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IFByaW1pdGl2ZU1vZGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QcmltaXRpdmVNb2RlJztcbmltcG9ydCB7XG4gIFZlcnRleEF0dHJpYnV0ZSxcbiAgVmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nLFxufSBmcm9tICcuLi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgVHlwZWRBcnJheSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFJuTTIsIFJuTTJJbWFnZSwgUm5NMkFjY2Vzc29yIH0gZnJvbSAnLi4vLi4vdHlwZXMvUm5NMic7XG5pbXBvcnQgeyBSblByb21pc2UgfSBmcm9tICcuLi9taXNjL1JuUHJvbWlzZSc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkVGhlbiB9IGZyb20gJy4uL21pc2MvTWlzY1V0aWwnO1xuaW1wb3J0IHsgaWZVbmRlZmluZWRUaGVuIH0gZnJvbSAnLi4vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQgeyBHbHRmTG9hZE9wdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEVyciwgUmVzdWx0LCBPaywgaXNFcnIgfSBmcm9tICcuLi9taXNjL1Jlc3VsdCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmRlY2xhcmUgbGV0IERyYWNvRGVjb2Rlck1vZHVsZTogYW55O1xuZGVjbGFyZSBsZXQgUm46IGFueTtcblxuLyoqXG4gKiBUaGUgZHJhY28gSW1wb3J0ZXIgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmNQb2ludENsb3VkSW1wb3J0ZXIge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBEcmNQb2ludENsb3VkSW1wb3J0ZXI7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBkcmFjbyBmaWxlIG9mIHBvaW50IGNsb3VkIHR5cGVcbiAgICogV0VJR0hUU18wIGFuZCBKT0lOVFNfMCBhdHRyaWJ1dGUgYW5kIGFsbCB0aGUgbWVzaCB0eXBlIGFuZCBpcyBub3Qgc3VwcG9ydCB5ZXQuXG4gICAqIEBwYXJhbSB1cmkgLSB1cmkgb2YgZHJjIGZpbGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIGZvciBsb2FkaW5nIHByb2Nlc3NcbiAgICogQHJldHVybnMgYSBnbFRGMiBiYXNlZCBKU09OIHByZS1wcm9jZXNzZWRcbiAgICovXG4gIGFzeW5jIGltcG9ydFBvaW50Q2xvdWQoXG4gICAgdXJpOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEdsdGZMb2FkT3B0aW9uXG4gICk6IFByb21pc2U8UmVzdWx0PFJuTTIsIEVycjxBcnJheUJ1ZmZlciwgdW5rbm93bj4+PiB7XG4gICAgY29uc3QgYmFzZVBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKSArICcvJzsgLy8gbG9jYXRpb24gb2YgbW9kZWwgZmlsZSBhcyBiYXNlUGF0aFxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gRGF0YVV0aWwuY3JlYXRlRGVmYXVsdEdsdGZPcHRpb25zKCk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZpbGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIGluIG9wdGlvbnMuZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IERhdGFVdGlsLmdldEV4dGVuc2lvbihmaWxlTmFtZSk7XG5cbiAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gPT09ICdkcmMnKSB7XG4gICAgICAgICAgY29uc3Qgcm5tMiA9IGF3YWl0IHRoaXMuX19kZWNvZGVEcmFjbyhcbiAgICAgICAgICAgIChvcHRpb25zLmZpbGVzIGFzIGFueSlbZmlsZU5hbWVdLFxuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBPayhybm0yISk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByX2FycmF5QnVmZmVyID0gYXdhaXQgRGF0YVV0aWwuZmV0Y2hBcnJheUJ1ZmZlcih1cmkpO1xuICAgIGlmIChpc0VycihyX2FycmF5QnVmZmVyKSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICBtZXNzYWdlOiAnZmV0Y2hBcnJheUJ1ZmZlciBmYWlsZWQnLFxuICAgICAgICBlcnJvcjogcl9hcnJheUJ1ZmZlcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJubTIgPSBhd2FpdCB0aGlzLl9fZGVjb2RlRHJhY28ocl9hcnJheUJ1ZmZlci5nZXQoKSwgZGVmYXVsdE9wdGlvbnMsIGJhc2VQYXRoLCBvcHRpb25zKTtcblxuICAgIHJldHVybiBuZXcgT2socm5tMiEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCB0aGUgc3BlY2lmaWVkIGFycmF5IGJ1ZmZlciBvZiBkcmFjbyBmaWxlIHdoZXJlIHRoZSB0eXBlIG11c3QgYmUgcG9pbnQgY2xvdWQuXG4gICAqIFdFSUdIVFNfMCBhbmQgSk9JTlRTXzAgYXR0cmlidXRlIGFuZCBhbGwgdGhlIG1lc2ggdHlwZSBhbmQgaXMgbm90IHN1cHBvcnQgeWV0LlxuICAgKiBAcGFyYW0gdXJpIC0gdXJpIG9mIGRyYyBmaWxlXG4gICAqIEBwYXJhbSBhcnJheUJ1ZmZlciAtIGZldGNoZWQgYXJyYXkgYnVmZmVyIG9mIGRyYyBmaWxlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9ucyBmb3IgbG9hZGluZyBwcm9jZXNzXG4gICAqIEByZXR1cm5zIGEgZ2xURjIgYmFzZWQgSlNPTiBwcmUtcHJvY2Vzc2VkXG4gICAqL1xuICBpbXBvcnRBcnJheUJ1ZmZlcih1cmk6IHN0cmluZywgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyLCBvcHRpb25zPzogR2x0ZkxvYWRPcHRpb24pIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpICsgJy8nOyAvLyBsb2NhdGlvbiBvZiBtb2RlbCBmaWxlIGFzIGJhc2VQYXRoXG4gICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBEYXRhVXRpbC5jcmVhdGVEZWZhdWx0R2x0Zk9wdGlvbnMoKTtcbiAgICByZXR1cm4gdGhpcy5fX2RlY29kZURyYWNvKGFycmF5QnVmZmVyLCBkZWZhdWx0T3B0aW9ucywgYmFzZVBhdGgsIG9wdGlvbnMpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIExvZ2dlci5lcnJvcignX19sb2FkRnJvbUFycmF5QnVmZmVyIGVycm9yOiAnICsgZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19sb2FkRnJvbUFycmF5QnVmZmVyKFxuICAgIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcixcbiAgICBkZWZhdWx0T3B0aW9uczogR2x0ZkxvYWRPcHRpb24sXG4gICAgYmFzZVBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge31cbiAgKSB7XG4gICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIDAsIDIwKTtcbiAgICBjb25zdCBpc0xpdHRsZUVuZGlhbiA9IHRydWU7XG4gICAgLy8gTWFnaWMgZmllbGRcbiAgICBjb25zdCBtYWdpYyA9IGRhdGFWaWV3LmdldFVpbnQzMigwLCBpc0xpdHRsZUVuZGlhbik7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvLyAweDQ2NTQ2QzY3IGlzICdnbFRGJyBpbiBBU0NJSSBjb2Rlcy5cbiAgICBpZiAobWFnaWMgIT09IDB4NDY1NDZjNjcpIHtcbiAgICAgIC8vY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnN0IGdvdFRleHQgPSBEYXRhVXRpbC5hcnJheUJ1ZmZlclRvU3RyaW5nKGFycmF5QnVmZmVyKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGdvdFRleHQpO1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fbG9hZEFzVGV4dEpzb24oXG4gICAgICAgIGpzb24sXG4gICAgICAgIG9wdGlvbnMgYXMgR2x0ZkxvYWRPcHRpb24sXG4gICAgICAgIGRlZmF1bHRPcHRpb25zLFxuICAgICAgICBiYXNlUGF0aFxuICAgICAgKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIExvZ2dlci5lcnJvcigndGhpcy5fX2xvYWRBc1RleHRKc29uIGVycm9yOiAnICsgZXJyKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9sb2FkQXNCaW5hcnlKc29uKFxuICAgICAgICBkYXRhVmlldyxcbiAgICAgICAgaXNMaXR0bGVFbmRpYW4sXG4gICAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgICBvcHRpb25zIGFzIEdsdGZMb2FkT3B0aW9uLFxuICAgICAgICBkZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgYmFzZVBhdGhcbiAgICAgICkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBMb2dnZXIuZXJyb3IoJ3RoaXMuX19sb2FkQXNCaW5hcnlKc29uIGVycm9yOiAnICsgZXJyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX2dldE9wdGlvbnMoZGVmYXVsdE9wdGlvbnM6IGFueSwganNvbjogUm5NMiwgb3B0aW9uczogYW55KTogR2x0ZkxvYWRPcHRpb24ge1xuICAgIGlmIChqc29uLmFzc2V0ICYmIGpzb24uYXNzZXQuZXh0cmFzICYmIGpzb24uYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBvcHRpb25OYW1lIGluIGpzb24uYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucykge1xuICAgICAgICBkZWZhdWx0T3B0aW9uc1tvcHRpb25OYW1lXSA9IChqc29uLmFzc2V0LmV4dHJhcy5ybkxvYWRlck9wdGlvbnMgYXMgYW55KVtvcHRpb25OYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgZGVmYXVsdE9wdGlvbnNbb3B0aW9uTmFtZV0gPSBvcHRpb25zW29wdGlvbk5hbWVdO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubG9hZGVyRXh0ZW5zaW9uTmFtZSAmJiB0eXBlb2Ygb3B0aW9ucy5sb2FkZXJFeHRlbnNpb25OYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKFJuW29wdGlvbnMubG9hZGVyRXh0ZW5zaW9uTmFtZV0gIT0gbnVsbCkge1xuICAgICAgICBkZWZhdWx0T3B0aW9ucy5sb2FkZXJFeHRlbnNpb24gPSBSbltvcHRpb25zLmxvYWRlckV4dGVuc2lvbk5hbWVdLmdldEluc3RhbmNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBMb2dnZXIuZXJyb3IoYCR7b3B0aW9ucy5sb2FkZXJFeHRlbnNpb25OYW1lfSBub3QgZm91bmQhYCk7XG4gICAgICAgIGRlZmF1bHRPcHRpb25zLmxvYWRlckV4dGVuc2lvbiA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG4gIH1cblxuICBhc3luYyBfbG9hZEFzQmluYXJ5SnNvbihcbiAgICBkYXRhVmlldzogRGF0YVZpZXcsXG4gICAgaXNMaXR0bGVFbmRpYW46IGJvb2xlYW4sXG4gICAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uLFxuICAgIGRlZmF1bHRPcHRpb25zOiBHbHRmTG9hZE9wdGlvbixcbiAgICBiYXNlUGF0aDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGxlbmd0aE9mSlNvbkNodW5rRGF0YSA9IGRhdGFWaWV3LmdldFVpbnQzMigxMiwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIGNvbnN0IGNodW5rVHlwZSA9IGRhdGFWaWV3LmdldFVpbnQzMigxNiwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIC8vIDB4NEU0RjUzNEEgbWVhbnMgSlNPTiBmb3JtYXQgKDB4NEU0RjUzNEEgaXMgJ0pTT04nIGluIEFTQ0lJIGNvZGVzKVxuICAgIGlmIChjaHVua1R5cGUgIT09IDB4NGU0ZjUzNGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVua1R5cGUgb2YgY2h1bmswIGluIHRoaXMgYmluYXJ5IGdsVEYgZmlsZS4nKTtcbiAgICB9XG4gICAgY29uc3QgdWludDhBcnJheUpTb25Db250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIDIwLCBsZW5ndGhPZkpTb25DaHVua0RhdGEpO1xuICAgIGNvbnN0IGdvdFRleHQgPSBEYXRhVXRpbC51aW50OEFycmF5VG9TdHJpbmcodWludDhBcnJheUpTb25Db250ZW50KTtcbiAgICBjb25zdCBnbHRmSnNvbiA9IEpTT04ucGFyc2UoZ290VGV4dCk7XG4gICAgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMoZGVmYXVsdE9wdGlvbnMsIGdsdGZKc29uLCBvcHRpb25zKTtcbiAgICBjb25zdCB1aW50OGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIDIwICsgbGVuZ3RoT2ZKU29uQ2h1bmtEYXRhICsgOCk7XG5cbiAgICBpZiAoZ2x0Zkpzb24uYXNzZXQuZXh0cmFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyA9IHsgZmlsZVR5cGU6ICdnbFRGJywgdmVyc2lvbjogJzInIH07XG4gICAgfVxuICAgIHRoaXMuX21lcmdlRXh0ZW5kZWRKc29uKGdsdGZKc29uLCBvcHRpb25zLmV4dGVuZGVkSnNvbik7XG4gICAgZ2x0Zkpzb24uYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZElubmVyKHVpbnQ4YXJyYXksIGJhc2VQYXRoLCBnbHRmSnNvbiwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ3RoaXMuX2xvYWRJbm5lciBlcnJvciBpbiBfbG9hZEFzQmluYXJ5SnNvbjogJyArIGVycik7XG4gICAgfVxuICAgIHJldHVybiBnbHRmSnNvbjtcbiAgfVxuXG4gIGFzeW5jIF9sb2FkQXNUZXh0SnNvbihcbiAgICBnbHRmSnNvbjogUm5NMixcbiAgICBvcHRpb25zOiBHbHRmTG9hZE9wdGlvbixcbiAgICBkZWZhdWx0T3B0aW9uczogR2x0ZkxvYWRPcHRpb24sXG4gICAgYmFzZVBhdGg6IHN0cmluZ1xuICApIHtcbiAgICBpZiAoZ2x0Zkpzb24uYXNzZXQuZXh0cmFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyA9IHsgZmlsZVR5cGU6ICdnbFRGJywgdmVyc2lvbjogJzInIH07XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMoZGVmYXVsdE9wdGlvbnMsIGdsdGZKc29uLCBvcHRpb25zKTtcblxuICAgIHRoaXMuX21lcmdlRXh0ZW5kZWRKc29uKGdsdGZKc29uLCBvcHRpb25zLmV4dGVuZGVkSnNvbik7XG4gICAgZ2x0Zkpzb24uYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZElubmVyKHVuZGVmaW5lZCwgYmFzZVBhdGgsIGdsdGZKc29uLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5lcnJvcigndGhpcy5fbG9hZElubmVyIGVycm9yIGluIF9sb2FkQXNUZXh0SnNvbjogJyArIGVycik7XG4gICAgfVxuICAgIHJldHVybiBnbHRmSnNvbjtcbiAgfVxuXG4gIF9sb2FkSW5uZXIoXG4gICAgdWludDhhcnJheTogVWludDhBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBiYXNlUGF0aDogc3RyaW5nLFxuICAgIGdsdGZKc29uOiBSbk0yLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uXG4gICkge1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICBzaGFkZXJzOiBbXSxcbiAgICAgIGJ1ZmZlcnM6IFtdLFxuICAgICAgaW1hZ2VzOiBbXSxcbiAgICB9O1xuICAgIHByb21pc2VzLnB1c2godGhpcy5fbG9hZFJlc291cmNlcyh1aW50OGFycmF5ISwgYmFzZVBhdGgsIGdsdGZKc29uLCBvcHRpb25zLCByZXNvdXJjZXMpKTtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl9sb2FkSnNvbkNvbnRlbnQoZ2x0Zkpzb24sIG9wdGlvbnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KSBhcyBQcm9taXNlPHZvaWQ+XG4gICAgKTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH1cblxuICBfbG9hZEpzb25Db250ZW50KGdsdGZKc29uOiBSbk0yLCBvcHRpb25zOiBHbHRmTG9hZE9wdGlvbikge1xuICAgIC8vIFNjZW5lXG4gICAgdGhpcy5fbG9hZERlcGVuZGVuY2llc09mU2NlbmVzKGdsdGZKc29uKTtcblxuICAgIC8vIE5vZGVcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZOb2RlcyhnbHRmSnNvbik7XG5cbiAgICAvLyBNZXNoXG4gICAgdGhpcy5fbG9hZERlcGVuZGVuY2llc09mTWVzaGVzKGdsdGZKc29uKTtcblxuICAgIC8vIE1hdGVyaWFsXG4gICAgdGhpcy5fbG9hZERlcGVuZGVuY2llc09mTWF0ZXJpYWxzKGdsdGZKc29uKTtcblxuICAgIC8vIFRleHR1cmVcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZUZXh0dXJlcyhnbHRmSnNvbik7XG5cbiAgICAvLyBKb2ludFxuICAgIHRoaXMuX2xvYWREZXBlbmRlbmNpZXNPZkpvaW50cyhnbHRmSnNvbik7XG5cbiAgICAvLyBBbmltYXRpb25cbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZBbmltYXRpb25zKGdsdGZKc29uKTtcblxuICAgIC8vIEFjY2Vzc29yXG4gICAgdGhpcy5fbG9hZERlcGVuZGVuY2llc09mQWNjZXNzb3JzKGdsdGZKc29uKTtcblxuICAgIC8vIEJ1ZmZlclZpZXdcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZCdWZmZXJWaWV3cyhnbHRmSnNvbik7XG5cbiAgICBpZiAoZ2x0Zkpzb24uYXNzZXQuZXh0cmFzID09PSB2b2lkIDApIHtcbiAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIF9sb2FkRGVwZW5kZW5jaWVzT2ZTY2VuZXMoZ2x0Zkpzb246IFJuTTIpIHtcbiAgICBmb3IgKGNvbnN0IHNjZW5lIG9mIGdsdGZKc29uLnNjZW5lcykge1xuICAgICAgZm9yIChjb25zdCBpIGluIHNjZW5lLm5vZGVzISkge1xuICAgICAgICBzY2VuZS5ub2Rlc09iamVjdHMhW2ldID0gZ2x0Zkpzb24ubm9kZXNbc2NlbmUubm9kZXMhW2ldXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfbG9hZERlcGVuZGVuY2llc09mTm9kZXMoZ2x0Zkpzb246IFJuTTIpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZ2x0Zkpzb24ubm9kZXMpIHtcbiAgICAgIC8vIEhpZXJhcmNoeVxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKElzLm5vdC5leGlzdChub2RlLmNoaWxkcmVuT2JqZWN0cykpIHtcbiAgICAgICAgICBub2RlLmNoaWxkcmVuT2JqZWN0cyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgbm9kZS5jaGlsZHJlbk9iamVjdHMhW2ldID0gZ2x0Zkpzb24ubm9kZXNbbm9kZS5jaGlsZHJlbltpXV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWVzaFxuICAgICAgaWYgKG5vZGUubWVzaCAhPT0gdm9pZCAwICYmIGdsdGZKc29uLm1lc2hlcyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIG5vZGUubWVzaE9iamVjdCA9IGdsdGZKc29uLm1lc2hlc1tub2RlLm1lc2ghXTtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpblxuICAgICAgaWYgKG5vZGUuc2tpbiAhPT0gdm9pZCAwICYmIGdsdGZKc29uLnNraW5zICE9PSB2b2lkIDApIHtcbiAgICAgICAgbm9kZS5za2luT2JqZWN0ID0gZ2x0Zkpzb24uc2tpbnNbbm9kZS5za2luXTtcbiAgICAgICAgaWYgKG5vZGUubWVzaE9iamVjdCEuZXh0cmFzID09PSB2b2lkIDApIHtcbiAgICAgICAgICBub2RlLm1lc2hPYmplY3QhLmV4dHJhcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIG5vZGUubWVzaE9iamVjdCEuZXh0cmFzLl9za2luID0gbm9kZS5za2luO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW1lcmFcbiAgICAgIGlmIChub2RlLmNhbWVyYSAhPT0gdm9pZCAwICYmIGdsdGZKc29uLmNhbWVyYXMgIT09IHZvaWQgMCkge1xuICAgICAgICBub2RlLmNhbWVyYU9iamVjdCA9IGdsdGZKc29uLmNhbWVyYXNbbm9kZS5jYW1lcmFdO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWdodHNcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS5leHRlbnNpb25zICE9PSB2b2lkIDAgJiZcbiAgICAgICAgZ2x0Zkpzb24uZXh0ZW5zaW9ucyAhPT0gdm9pZCAwICYmXG4gICAgICAgIGdsdGZKc29uLmV4dGVuc2lvbnMuS0hSX2xpZ2h0c19wdW5jdHVhbCAhPT0gdm9pZCAwXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5leHRlbnNpb25zLktIUl9saWdodHNfcHVuY3R1YWwubGlnaHRJbmRleCA9IG5vZGUuZXh0ZW5zaW9ucy5LSFJfbGlnaHRzX3B1bmN0dWFsLmxpZ2h0O1xuICAgICAgICBub2RlLmV4dGVuc2lvbnMuS0hSX2xpZ2h0c19wdW5jdHVhbC5saWdodCA9XG4gICAgICAgICAgZ2x0Zkpzb24uZXh0ZW5zaW9ucy5LSFJfbGlnaHRzX3B1bmN0dWFsLmxpZ2h0c1tcbiAgICAgICAgICAgIG5vZGUuZXh0ZW5zaW9ucy5LSFJfbGlnaHRzX3B1bmN0dWFsLmxpZ2h0SW5kZXhcbiAgICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9sb2FkRGVwZW5kZW5jaWVzT2ZNZXNoZXMoZ2x0Zkpzb246IFJuTTIpIHtcbiAgICAvLyBNZXNoXG4gICAgZm9yIChjb25zdCBtZXNoIG9mIGdsdGZKc29uLm1lc2hlcykge1xuICAgICAgZm9yIChjb25zdCBwcmltaXRpdmUgb2YgbWVzaC5wcmltaXRpdmVzKSB7XG4gICAgICAgIGlmIChwcmltaXRpdmUubWF0ZXJpYWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHByaW1pdGl2ZS5tYXRlcmlhbE9iamVjdCA9IGdsdGZKc29uLm1hdGVyaWFsc1twcmltaXRpdmUubWF0ZXJpYWxdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHByaW1pdGl2ZS5hdHRyaWJ1dGVzISkge1xuICAgICAgICAgIGNvbnN0IGFjY2Vzc29ySWQgPSBwcmltaXRpdmUuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NvciA9IGdsdGZKc29uLmFjY2Vzc29yc1thY2Nlc3NvcklkXTtcbiAgICAgICAgICBhY2Nlc3Nvci5leHRyYXMgPSB7XG4gICAgICAgICAgICB0b0dldEFzVHlwZWRBcnJheTogdHJ1ZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBwcmltaXRpdmUuYXR0cmlidXRlc09iamVjdHMhW2F0dHJpYnV0ZU5hbWVdID0gYWNjZXNzb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJpbWl0aXZlLmluZGljZXMgIT0gbnVsbCkge1xuICAgICAgICAgIHByaW1pdGl2ZS5pbmRpY2VzT2JqZWN0ID0gZ2x0Zkpzb24uYWNjZXNzb3JzW3ByaW1pdGl2ZS5pbmRpY2VzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmltaXRpdmUudGFyZ2V0cyAhPSBudWxsKSB7XG4gICAgICAgICAgcHJpbWl0aXZlLnRhcmdldHNPYmplY3RzID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgcHJpbWl0aXZlLnRhcmdldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fSBhcyB1bmtub3duIGFzIHsgW3M6IHN0cmluZ106IFJuTTJBY2Nlc3NvciB9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRTaGFwZVRhcmdldEFjY2Vzc29ySWQgPSB0YXJnZXRbYXR0cmlidXRlTmFtZV07XG4gICAgICAgICAgICAgIGlmICh0YXJnZXRTaGFwZVRhcmdldEFjY2Vzc29ySWQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc29yID0gZ2x0Zkpzb24uYWNjZXNzb3JzW3RhcmdldFNoYXBlVGFyZ2V0QWNjZXNzb3JJZF07XG4gICAgICAgICAgICAgICAgYWNjZXNzb3IuZXh0cmFzID0ge1xuICAgICAgICAgICAgICAgICAgdG9HZXRBc1R5cGVkQXJyYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGFjY2Vzc29yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmltaXRpdmUudGFyZ2V0c09iamVjdHMucHVzaChhdHRyaWJ1dGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja1JuR2x0ZkxvYWRlck9wdGlvbnNFeGlzdChnbHRmTW9kZWw6IFJuTTIpIHtcbiAgICBpZiAoZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcyAmJiBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBfbG9hZERlcGVuZGVuY2llc09mTWF0ZXJpYWxzKGdsdGZKc29uOiBSbk0yKSB7XG4gICAgaWYgKCFnbHRmSnNvbi50ZXh0dXJlcykgZ2x0Zkpzb24udGV4dHVyZXMgPSBbXTtcblxuICAgIC8vIE1hdGVyaWFsXG4gICAgaWYgKGdsdGZKc29uLm1hdGVyaWFscykge1xuICAgICAgZm9yIChjb25zdCBtYXRlcmlhbCBvZiBnbHRmSnNvbi5tYXRlcmlhbHMpIHtcbiAgICAgICAgaWYgKG1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzKSB7XG4gICAgICAgICAgY29uc3QgYmFzZUNvbG9yVGV4dHVyZSA9IG1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzLmJhc2VDb2xvclRleHR1cmU7XG4gICAgICAgICAgaWYgKGJhc2VDb2xvclRleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgYmFzZUNvbG9yVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbYmFzZUNvbG9yVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZSA9IG1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzLm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTtcbiAgICAgICAgICBpZiAobWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLmluZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3JtYWxUZXh0dXJlID0gbWF0ZXJpYWwubm9ybWFsVGV4dHVyZTtcbiAgICAgICAgaWYgKG5vcm1hbFRleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgIG5vcm1hbFRleHR1cmUudGV4dHVyZSA9IGdsdGZKc29uLnRleHR1cmVzW25vcm1hbFRleHR1cmUuaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2NjbHVzaW9uVGV4dHVyZSA9IG1hdGVyaWFsLm9jY2x1c2lvblRleHR1cmU7XG4gICAgICAgIGlmIChvY2NsdXNpb25UZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBvY2NsdXNpb25UZXh0dXJlLnRleHR1cmUgPSBnbHRmSnNvbi50ZXh0dXJlc1tvY2NsdXNpb25UZXh0dXJlLmluZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVtaXNzaXZlVGV4dHVyZSA9IG1hdGVyaWFsLmVtaXNzaXZlVGV4dHVyZTtcbiAgICAgICAgaWYgKGVtaXNzaXZlVGV4dHVyZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgZW1pc3NpdmVUZXh0dXJlLnRleHR1cmUgPSBnbHRmSnNvbi50ZXh0dXJlc1tlbWlzc2l2ZVRleHR1cmUuaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX2NoZWNrUm5HbHRmTG9hZGVyT3B0aW9uc0V4aXN0KGdsdGZKc29uKSAmJlxuICAgICAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyEucm5Mb2FkZXJPcHRpb25zIS5sb2FkZXJFeHRlbnNpb24gJiZcbiAgICAgICAgICBnbHRmSnNvbi5hc3NldC5leHRyYXMhLnJuTG9hZGVyT3B0aW9ucyEubG9hZGVyRXh0ZW5zaW9uLnNldFRleHR1cmVzXG4gICAgICAgICkge1xuICAgICAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyEucm5Mb2FkZXJPcHRpb25zIS5sb2FkZXJFeHRlbnNpb24uc2V0VGV4dHVyZXMoZ2x0Zkpzb24sIG1hdGVyaWFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9sb2FkRGVwZW5kZW5jaWVzT2ZUZXh0dXJlcyhnbHRmSnNvbjogUm5NMikge1xuICAgIC8vIFRleHR1cmVcbiAgICBpZiAoZ2x0Zkpzb24udGV4dHVyZXMpIHtcbiAgICAgIGZvciAoY29uc3QgdGV4dHVyZSBvZiBnbHRmSnNvbi50ZXh0dXJlcykge1xuICAgICAgICBpZkRlZmluZWRUaGVuKCh2KSA9PiB7XG4gICAgICAgICAgdGV4dHVyZS5zYW1wbGVyT2JqZWN0ID0gZ2x0Zkpzb24uc2FtcGxlcnNbdl07XG4gICAgICAgIH0sIHRleHR1cmUuc2FtcGxlcik7XG5cbiAgICAgICAgaWYgKHRleHR1cmUuc291cmNlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB0ZXh0dXJlLmltYWdlID0gZ2x0Zkpzb24uaW1hZ2VzW3RleHR1cmUuc291cmNlXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9sb2FkRGVwZW5kZW5jaWVzT2ZKb2ludHMoZ2x0Zkpzb246IFJuTTIpIHtcbiAgICBpZiAoZ2x0Zkpzb24uc2tpbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgc2tpbiBvZiBnbHRmSnNvbi5za2lucykge1xuICAgICAgICBpZiAoSXMuZXhpc3Qoc2tpbi5za2VsZXRvbikpIHtcbiAgICAgICAgICBza2luLnNrZWxldG9uT2JqZWN0ID0gZ2x0Zkpzb24ubm9kZXNbc2tpbi5za2VsZXRvbl07XG5cbiAgICAgICAgICBpZkRlZmluZWRUaGVuKFxuICAgICAgICAgICAgKHYpID0+IChza2luLmludmVyc2VCaW5kTWF0cmljZXNPYmplY3QgPSBnbHRmSnNvbi5hY2Nlc3NvcnNbdl0pLFxuICAgICAgICAgICAgc2tpbi5pbnZlcnNlQmluZE1hdHJpY2VzXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmVW5kZWZpbmVkVGhlbihcbiAgICAgICAgICAgICgpID0+IChza2luLnNrZWxldG9uT2JqZWN0ID0gZ2x0Zkpzb24ubm9kZXNbc2tpbi5qb2ludHNbMF1dKSxcbiAgICAgICAgICAgIHNraW4uc2tlbGV0b25cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc2tpbi5qb2ludHNPYmplY3RzID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBqb2ludEluZGV4IG9mIHNraW4uam9pbnRzKSB7XG4gICAgICAgICAgICBza2luLmpvaW50c09iamVjdHMucHVzaChnbHRmSnNvbi5ub2Rlc1tqb2ludEluZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2xvYWREZXBlbmRlbmNpZXNPZkFuaW1hdGlvbnMoZ2x0Zkpzb246IFJuTTIpIHtcbiAgICBpZiAoZ2x0Zkpzb24uYW5pbWF0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBhbmltYXRpb24gb2YgZ2x0Zkpzb24uYW5pbWF0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgYW5pbWF0aW9uLmNoYW5uZWxzKSB7XG4gICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0ID0gYW5pbWF0aW9uLnNhbXBsZXJzW2NoYW5uZWwuc2FtcGxlcl07XG5cbiAgICAgICAgICBjaGFubmVsLnRhcmdldCEubm9kZU9iamVjdCA9IGdsdGZKc29uLm5vZGVzW2NoYW5uZWwudGFyZ2V0IS5ub2RlIV07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGFuaW1hdGlvbi5jaGFubmVscykge1xuICAgICAgICAgIGlmIChJcy5leGlzdChjaGFubmVsLnNhbXBsZXJPYmplY3QpKSB7XG4gICAgICAgICAgICBjaGFubmVsLnNhbXBsZXJPYmplY3QuaW5wdXRPYmplY3QgPSBnbHRmSnNvbi5hY2Nlc3NvcnNbY2hhbm5lbC5zYW1wbGVyT2JqZWN0LmlucHV0XTtcbiAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlck9iamVjdC5vdXRwdXRPYmplY3QgPSBnbHRmSnNvbi5hY2Nlc3NvcnNbY2hhbm5lbC5zYW1wbGVyT2JqZWN0Lm91dHB1dF07XG4gICAgICAgICAgICBpZiAoY2hhbm5lbC5zYW1wbGVyT2JqZWN0Lm91dHB1dE9iamVjdC5leHRyYXMgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjaGFubmVsLnNhbXBsZXJPYmplY3Qub3V0cHV0T2JqZWN0LmV4dHJhcyA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFubmVsLnRhcmdldCEucGF0aCA9PT0gJ3JvdGF0aW9uJykge1xuICAgICAgICAgICAgICBjaGFubmVsLnNhbXBsZXJPYmplY3Qub3V0cHV0T2JqZWN0LmV4dHJhcyEucXVhdGVybmlvbklmVmVjNCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbm5lbC50YXJnZXQhLnBhdGggPT09ICd3ZWlnaHRzJykge1xuICAgICAgICAgICAgICBjb25zdCB3ZWlnaHRzQXJyYXlMZW5ndGggPVxuICAgICAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlck9iamVjdC5vdXRwdXRPYmplY3QuY291bnQgLyBjaGFubmVsLnNhbXBsZXJPYmplY3QuaW5wdXRPYmplY3QuY291bnQ7XG4gICAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlck9iamVjdC5vdXRwdXRPYmplY3QuZXh0cmFzIS53ZWlnaHRzQXJyYXlMZW5ndGggPSB3ZWlnaHRzQXJyYXlMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2xvYWREZXBlbmRlbmNpZXNPZkFjY2Vzc29ycyhnbHRmSnNvbjogUm5NMikge1xuICAgIC8vIEFjY2Vzc29yXG4gICAgZm9yIChjb25zdCBhY2Nlc3NvciBvZiBnbHRmSnNvbi5hY2Nlc3NvcnMpIHtcbiAgICAgIGlmIChhY2Nlc3Nvci5idWZmZXJWaWV3ID09IG51bGwpIHtcbiAgICAgICAgYWNjZXNzb3IuYnVmZmVyVmlldyA9IDA7XG4gICAgICB9XG4gICAgICBhY2Nlc3Nvci5idWZmZXJWaWV3T2JqZWN0ID0gZ2x0Zkpzb24uYnVmZmVyVmlld3NbYWNjZXNzb3IuYnVmZmVyVmlld107XG5cbiAgICAgIGlmIChhY2Nlc3Nvci5zcGFyc2UgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzcGFyc2UgPSBhY2Nlc3Nvci5zcGFyc2U7XG4gICAgICAgIHNwYXJzZS5pbmRpY2VzIS5idWZmZXJWaWV3T2JqZWN0ID0gZ2x0Zkpzb24uYnVmZmVyVmlld3Nbc3BhcnNlLmluZGljZXMhLmJ1ZmZlclZpZXddO1xuICAgICAgICBzcGFyc2UudmFsdWVzIS5idWZmZXJWaWV3T2JqZWN0ID0gZ2x0Zkpzb24uYnVmZmVyVmlld3Nbc3BhcnNlLnZhbHVlcyEuYnVmZmVyVmlld107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2xvYWREZXBlbmRlbmNpZXNPZkJ1ZmZlclZpZXdzKGdsdGZKc29uOiBSbk0yKSB7XG4gICAgLy8gQnVmZmVyVmlld1xuICAgIGZvciAoY29uc3QgYnVmZmVyVmlldyBvZiBnbHRmSnNvbi5idWZmZXJWaWV3cykge1xuICAgICAgaWYgKGJ1ZmZlclZpZXcuYnVmZmVyICE9PSB2b2lkIDApIHtcbiAgICAgICAgYnVmZmVyVmlldy5idWZmZXJPYmplY3QgPSBnbHRmSnNvbi5idWZmZXJzW2J1ZmZlclZpZXcuYnVmZmVyIV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX21lcmdlRXh0ZW5kZWRKc29uKGdsdGZKc29uOiBSbk0yLCBleHRlbmRlZERhdGE6IGFueSkge1xuICAgIGxldCBleHRlbmRlZEpzb24gPSBudWxsO1xuICAgIGlmIChleHRlbmRlZERhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgY29uc3QgZXh0ZW5kZWRKc29uU3RyID0gRGF0YVV0aWwuYXJyYXlCdWZmZXJUb1N0cmluZyhleHRlbmRlZERhdGEpO1xuICAgICAgZXh0ZW5kZWRKc29uID0gSlNPTi5wYXJzZShleHRlbmRlZEpzb25TdHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4dGVuZGVkRGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGV4dGVuZGVkSnNvbiA9IEpTT04ucGFyc2UoZXh0ZW5kZWREYXRhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHRlbmRlZERhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICBleHRlbmRlZEpzb24gPSBleHRlbmRlZERhdGE7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihnbHRmSnNvbiwgZXh0ZW5kZWRKc29uKTtcbiAgfVxuXG4gIF9sb2FkUmVzb3VyY2VzKFxuICAgIHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG4gICAgYmFzZVBhdGg6IHN0cmluZyxcbiAgICBnbHRmSnNvbjogUm5NMixcbiAgICBvcHRpb25zOiBHbHRmTG9hZE9wdGlvbixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHNoYWRlcnM6IGFueVtdO1xuICAgICAgYnVmZmVyczogYW55W107XG4gICAgICBpbWFnZXM6IGFueVtdO1xuICAgIH1cbiAgKSB7XG4gICAgY29uc3QgcHJvbWlzZXNUb0xvYWRSZXNvdXJjZXMgPSBbXTtcblxuICAgIC8vIFNoYWRlcnMgQXN5bmMgbG9hZFxuXG4gICAgLy8gZm9yIChsZXQgX2kgaW4gZ2x0Zkpzb24uc2hhZGVycykge1xuICAgIC8vICAgY29uc3QgaSA9IF9pIGFzIGFueSBhcyBudW1iZXI7XG4gICAgLy8gICByZXNvdXJjZXMuc2hhZGVyc1tpXSA9IHt9O1xuXG4gICAgLy8gICBsZXQgc2hhZGVySnNvbiA9IGdsdGZKc29uLnNoYWRlcnNbaV07XG4gICAgLy8gICBsZXQgc2hhZGVyVHlwZSA9IHNoYWRlckpzb24udHlwZTtcbiAgICAvLyAgIGlmICh0eXBlb2Ygc2hhZGVySnNvbi5leHRlbnNpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2hhZGVySnNvbi5leHRlbnNpb25zLktIUl9iaW5hcnlfZ2xURiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyAgICAgcmVzb3VyY2VzLnNoYWRlcnNbaV0uc2hhZGVyVGV4dCA9IHRoaXMuX2FjY2Vzc0JpbmFyeUFzU2hhZGVyKHNoYWRlckpzb24uZXh0ZW5zaW9ucy5LSFJfYmluYXJ5X2dsVEYuYnVmZmVyVmlldywgZ2x0Zkpzb24sIGFycmF5QnVmZmVyQmluYXJ5KTtcbiAgICAvLyAgICAgcmVzb3VyY2VzLnNoYWRlcnNbaV0uc2hhZGVyVHlwZSA9IHNoYWRlclR5cGU7XG4gICAgLy8gICAgIGNvbnRpbnVlO1xuICAgIC8vICAgfVxuXG4gICAgLy8gICBsZXQgc2hhZGVyVXJpID0gc2hhZGVySnNvbi51cmk7XG5cbiAgICAvLyAgIGlmIChvcHRpb25zLmZpbGVzKSB7XG4gICAgLy8gICAgIGNvbnN0IHNwbGl0dGVkID0gc2hhZGVyVXJpLnNwbGl0KCcvJyk7XG4gICAgLy8gICAgIGNvbnN0IGZpbGVuYW1lID0gc3BsaXR0ZWRbc3BsaXR0ZWQubGVuZ3RoIC0gMV07XG4gICAgLy8gICAgIGlmIChvcHRpb25zLmZpbGVzW2ZpbGVuYW1lXSkge1xuICAgIC8vICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gb3B0aW9ucy5maWxlc1tmaWxlbmFtZV07XG4gICAgLy8gICAgICAgcmVzb3VyY2VzLnNoYWRlcnNbaV0uc2hhZGVyVGV4dCA9IERhdGFVdGlsLmFycmF5QnVmZmVyVG9TdHJpbmcoYXJyYXlCdWZmZXIpO1xuICAgIC8vICAgICAgIHJlc291cmNlcy5zaGFkZXJzW2ldLnNoYWRlclR5cGUgPSBzaGFkZXJUeXBlO1xuICAgIC8vICAgICAgIGNvbnRpbnVlO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIGlmIChzaGFkZXJVcmkubWF0Y2goL15kYXRhOi8pKSB7XG4gICAgLy8gICAgIHByb21pc2VzVG9Mb2FkUmVzb3VyY2VzLnB1c2goXG4gICAgLy8gICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdGVkKSA9PiB7XG4gICAgLy8gICAgICAgICBsZXQgYXJyYXlCdWZmZXIgPSBEYXRhVXRpbC5kYXRhVXJpVG9BcnJheUJ1ZmZlcihzaGFkZXJVcmkpO1xuICAgIC8vICAgICAgICAgcmVzb3VyY2VzLnNoYWRlcnNbaV0uc2hhZGVyVGV4dCA9IERhdGFVdGlsLmFycmF5QnVmZmVyVG9TdHJpbmcoYXJyYXlCdWZmZXIpO1xuICAgIC8vICAgICAgICAgcmVzb3VyY2VzLnNoYWRlcnNbaV0uc2hhZGVyVHlwZSA9IHNoYWRlclR5cGU7XG4gICAgLy8gICAgICAgICByZXNvbHZlKCk7XG4gICAgLy8gICAgICAgfSlcbiAgICAvLyAgICAgKTtcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIHNoYWRlclVyaSA9IGJhc2VQYXRoICsgc2hhZGVyVXJpO1xuICAgIC8vICAgICBwcm9taXNlc1RvTG9hZFJlc291cmNlcy5wdXNoKFxuICAgIC8vICAgICAgIERhdGFVdGlsLmxvYWRSZXNvdXJjZUFzeW5jKHNoYWRlclVyaSwgZmFsc2UsXG4gICAgLy8gICAgICAgICAocmVzb2x2ZTpGdW5jdGlvbiwgcmVzcG9uc2U6YW55KT0+e1xuICAgIC8vICAgICAgICAgICByZXNvdXJjZXMuc2hhZGVyc1tpXS5zaGFkZXJUZXh0ID0gcmVzcG9uc2U7XG4gICAgLy8gICAgICAgICAgIHJlc291cmNlcy5zaGFkZXJzW2ldLnNoYWRlclR5cGUgPSBzaGFkZXJUeXBlO1xuICAgIC8vICAgICAgICAgICByZXNvbHZlKGdsdGZKc29uKTtcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICAocmVqZWN0OkZ1bmN0aW9uLCBlcnJvcjphbnkpPT57XG5cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICApXG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgLy8gQnVmZmVycyBBc3luYyBsb2FkXG4gICAgbGV0IHJucEFycmF5QnVmZmVyOiBSblByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGZvciAoY29uc3QgaSBpbiBnbHRmSnNvbi5idWZmZXJzKSB7XG4gICAgICBjb25zdCBidWZmZXJJbmZvID0gZ2x0Zkpzb24uYnVmZmVyc1tpXTtcblxuICAgICAgbGV0IHNwbGl0dGVkOiBzdHJpbmdbXTtcbiAgICAgIGxldCBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgaWYgKGJ1ZmZlckluZm8udXJpKSB7XG4gICAgICAgIHNwbGl0dGVkID0gYnVmZmVySW5mby51cmkuc3BsaXQoJy8nKTtcbiAgICAgICAgZmlsZW5hbWUgPSBzcGxpdHRlZFtzcGxpdHRlZC5sZW5ndGggLSAxXTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYnVmZmVySW5mby51cmkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJucEFycmF5QnVmZmVyID0gbmV3IFJuUHJvbWlzZTxBcnJheUJ1ZmZlcj4oKHJlc29sdmUsIHJlamVjdGVkKSA9PiB7XG4gICAgICAgICAgcmVzb3VyY2VzLmJ1ZmZlcnNbaV0gPSB1aW50OEFycmF5O1xuICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyID0gdWludDhBcnJheTtcbiAgICAgICAgICByZXNvbHZlKHVpbnQ4QXJyYXkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVySW5mby51cmkubWF0Y2goL15kYXRhOmFwcGxpY2F0aW9uXFwvKC4qKTtiYXNlNjQsLykpIHtcbiAgICAgICAgcm5wQXJyYXlCdWZmZXIgPSBuZXcgUm5Qcm9taXNlPEFycmF5QnVmZmVyPigocmVzb2x2ZSwgcmVqZWN0ZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IERhdGFVdGlsLmRhdGFVcmlUb0FycmF5QnVmZmVyKGJ1ZmZlckluZm8udXJpISk7XG4gICAgICAgICAgcmVzb3VyY2VzLmJ1ZmZlcnNbaV0gPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgYnVmZmVySW5mby5idWZmZXIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgcmVzb2x2ZShhcnJheUJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmZpbGVzICYmIG9wdGlvbnMuZmlsZXNbZmlsZW5hbWUhXSkge1xuICAgICAgICBybnBBcnJheUJ1ZmZlciA9IG5ldyBSblByb21pc2U8QXJyYXlCdWZmZXI+KChyZXNvbHZlLCByZWplY3RlZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gb3B0aW9ucy5maWxlcyFbZmlsZW5hbWVdO1xuICAgICAgICAgIHJlc291cmNlcy5idWZmZXJzW2ldID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgIHJlc29sdmUoYXJyYXlCdWZmZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJucEFycmF5QnVmZmVyID0gbmV3IFJuUHJvbWlzZTxBcnJheUJ1ZmZlcj4oXG4gICAgICAgICAgRGF0YVV0aWwubG9hZFJlc291cmNlQXN5bmMoXG4gICAgICAgICAgICBiYXNlUGF0aCArIGJ1ZmZlckluZm8udXJpLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIChyZXNvbHZlOiBGdW5jdGlvbiwgcmVzcG9uc2U6IEFycmF5QnVmZmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJlc291cmNlcy5idWZmZXJzW2ldID0gbmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpO1xuICAgICAgICAgICAgICBidWZmZXJJbmZvLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKHJlamVjdDogRnVuY3Rpb24sIGVycm9yOiBhbnkpID0+IHt9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnVmZmVySW5mby5idWZmZXJQcm9taXNlID0gcm5wQXJyYXlCdWZmZXI7XG4gICAgICBwcm9taXNlc1RvTG9hZFJlc291cmNlcy5wdXNoKHJucEFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICAvLyBUZXh0dXJlcyBBc3luYyBsb2FkXG4gICAgZm9yIChjb25zdCBfaSBpbiBnbHRmSnNvbi5pbWFnZXMpIHtcbiAgICAgIGNvbnN0IGkgPSBfaSBhcyBhbnkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgaW1hZ2VKc29uID0gZ2x0Zkpzb24uaW1hZ2VzW2ldIGFzIFJuTTJJbWFnZTtcbiAgICAgIC8vbGV0IGltYWdlSnNvbiA9IGdsdGZKc29uLmltYWdlc1t0ZXh0dXJlSnNvbi5zb3VyY2VdO1xuICAgICAgLy9sZXQgc2FtcGxlckpzb24gPSBnbHRmSnNvbi5zYW1wbGVyc1t0ZXh0dXJlSnNvbi5zYW1wbGVyXTtcblxuICAgICAgbGV0IGltYWdlVXJpOiBzdHJpbmc7XG5cbiAgICAgIGlmICh0eXBlb2YgaW1hZ2VKc29uLnVyaSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbGV0IGFycmF5QnVmZmVyID0gdWludDhBcnJheTtcbiAgICAgICAgaWYgKHVpbnQ4QXJyYXkgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBnbHRmSnNvbi5idWZmZXJWaWV3c1tpbWFnZUpzb24uYnVmZmVyVmlldyFdO1xuICAgICAgICAgIGFycmF5QnVmZmVyID0gYnVmZmVyVmlldy5idWZmZXJPYmplY3QhLmJ1ZmZlciE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW1hZ2VVaW50OEFycmF5ID0gRGF0YVV0aWwuY3JlYXRlVWludDhBcnJheUZyb21CdWZmZXJWaWV3SW5mbyhcbiAgICAgICAgICBnbHRmSnNvbixcbiAgICAgICAgICBpbWFnZUpzb24uYnVmZmVyVmlldyEsXG4gICAgICAgICAgdWludDhBcnJheVxuICAgICAgICApO1xuICAgICAgICBpbWFnZVVyaSA9IERhdGFVdGlsLmNyZWF0ZUJsb2JJbWFnZVVyaUZyb21VaW50OEFycmF5KGltYWdlVWludDhBcnJheSwgaW1hZ2VKc29uLm1pbWVUeXBlISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbWFnZUZpbGVTdHIgPSBpbWFnZUpzb24udXJpO1xuICAgICAgICBjb25zdCBzcGxpdHRlZCA9IGltYWdlRmlsZVN0ci5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHNwbGl0dGVkW3NwbGl0dGVkLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAob3B0aW9ucy5maWxlcyAmJiBvcHRpb25zLmZpbGVzW2ZpbGVuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gb3B0aW9ucy5maWxlc1tmaWxlbmFtZV07XG4gICAgICAgICAgaW1hZ2VVcmkgPSBEYXRhVXRpbC5jcmVhdGVCbG9iSW1hZ2VVcmlGcm9tVWludDhBcnJheShcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSxcbiAgICAgICAgICAgIGltYWdlSnNvbi5taW1lVHlwZSFcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGltYWdlRmlsZVN0ci5tYXRjaCgvXmRhdGE6LykpIHtcbiAgICAgICAgICBpbWFnZVVyaSA9IGltYWdlRmlsZVN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbWFnZVVyaSA9IGJhc2VQYXRoICsgaW1hZ2VGaWxlU3RyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIChvcHRpb25zLmV4dGVuc2lvbkxvYWRlciAmJiBvcHRpb25zLmV4dGVuc2lvbkxvYWRlci5zZXRVVlRyYW5zZm9ybVRvVGV4dHVyZSkge1xuICAgICAgLy8gICBvcHRpb25zLmV4dGVuc2lvbkxvYWRlci5zZXRVVlRyYW5zZm9ybVRvVGV4dHVyZSh0ZXh0dXJlLCBzYW1wbGVySnNvbik7XG4gICAgICAvLyB9XG5cbiAgICAgIGNvbnN0IHByb21pc2UgPSBEYXRhVXRpbC5jcmVhdGVJbWFnZUZyb21VcmkoaW1hZ2VVcmksIGltYWdlSnNvbi5taW1lVHlwZSEpLnRoZW4oKGltYWdlKSA9PiB7XG4gICAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICAgIHJlc291cmNlcy5pbWFnZXNbaV0gPSBpbWFnZTtcbiAgICAgICAgaW1hZ2VKc29uLmltYWdlID0gaW1hZ2U7XG4gICAgICB9KTtcbiAgICAgIHByb21pc2VzVG9Mb2FkUmVzb3VyY2VzLnB1c2gocHJvbWlzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzVG9Mb2FkUmVzb3VyY2VzKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ1Byb21pc2UuYWxsIGVycm9yOiAnICsgZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuX19pbnN0YW5jZSkge1xuICAgICAgdGhpcy5fX2luc3RhbmNlID0gbmV3IERyY1BvaW50Q2xvdWRJbXBvcnRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2RlY29kZURyYWNvKFxuICAgIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcixcbiAgICBkZWZhdWx0T3B0aW9uczogR2x0ZkxvYWRPcHRpb24sXG4gICAgYmFzZVBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge31cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kZWNvZGVCdWZmZXIoYXJyYXlCdWZmZXIpLnRoZW4oKGpzb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgZ290VGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICAgICAgY29uc3QgZ2x0Zkpzb24gPSBKU09OLnBhcnNlKGdvdFRleHQpO1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRBc1RleHRKc29uKFxuICAgICAgICBnbHRmSnNvbixcbiAgICAgICAgb3B0aW9ucyBhcyBHbHRmTG9hZE9wdGlvbixcbiAgICAgICAgZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgIGJhc2VQYXRoXG4gICAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgTG9nZ2VyLmVycm9yKCd0aGlzLl9fbG9hZEFzVGV4dEpzb24gZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9fZGVjb2RlQnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcikge1xuICAgIGNvbnN0IGRyYWNvID0gbmV3IERyYWNvRGVjb2Rlck1vZHVsZSgpO1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgZHJhY28uRGVjb2RlcigpO1xuICAgIGNvbnN0IGRyYWNvR2VvbWV0cnkgPSB0aGlzLl9fZ2V0R2VvbWV0cnlGcm9tRHJhY29CdWZmZXIoZHJhY28sIGRlY29kZXIsIGFycmF5QnVmZmVyKTtcbiAgICBpZiAoZHJhY29HZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHJhY29HZW9tZXRyeS4nKTtcbiAgICB9XG4gICAgaWYgKGRyYWNvR2VvbWV0cnkuZ2VvbWV0cnlUeXBlICE9PSBkcmFjby5QT0lOVF9DTE9VRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGdlb21ldHJ5VHlwZSBvZiBkcmMgZmlsZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NBdHRJZCA9IGRlY29kZXIuR2V0QXR0cmlidXRlSWQoZHJhY29HZW9tZXRyeSwgZHJhY28uUE9TSVRJT04pO1xuICAgIGlmIChwb3NBdHRJZCA9PT0gLTEpIHtcbiAgICAgIGRyYWNvLmRlc3Ryb3koZGVjb2Rlcik7XG4gICAgICBkcmFjby5kZXN0cm95KGRyYWNvR2VvbWV0cnkpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFjbzogTm8gcG9zaXRpb24gYXR0cmlidXRlIGZvdW5kLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gWydQT1NJVElPTicsICdOT1JNQUwnLCAnQ09MT1InLCAnVEVYX0NPT1JEJywgJ0dFTkVSSUMnXTtcbiAgICBjb25zdCBudW1Qb2ludHMgPSBkcmFjb0dlb21ldHJ5Lm51bV9wb2ludHMoKTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGFBbGw6IGFueVtdID0gW107XG4gICAgY29uc3QgYXR0cmlidXRlQ29tcG9uZW50czogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRJZCA9IGRlY29kZXIuR2V0QXR0cmlidXRlSWQoZHJhY29HZW9tZXRyeSwgZHJhY29bYXR0cmlidXRlTmFtZXNbaV1dKTtcbiAgICAgIGlmIChhdHRJZCA9PT0gLTEpIHtcbiAgICAgICAgYXR0cmlidXRlTmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBpLS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBkZWNvZGVyLkdldEF0dHJpYnV0ZShkcmFjb0dlb21ldHJ5LCBhdHRJZCk7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvLkRyYWNvRmxvYXQzMkFycmF5KCk7XG4gICAgICBkZWNvZGVyLkdldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzKGRyYWNvR2VvbWV0cnksIGF0dHJpYnV0ZSwgYXR0cmlidXRlRGF0YSk7XG4gICAgICBhdHRyaWJ1dGVEYXRhQWxsW2ldID0gYXR0cmlidXRlRGF0YTtcblxuICAgICAgY29uc3QgbnVtQ29tcG9uZW50ID0gYXR0cmlidXRlLm51bV9jb21wb25lbnRzKCk7XG4gICAgICBhdHRyaWJ1dGVDb21wb25lbnRzW2ldID0gbnVtQ29tcG9uZW50O1xuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWVzW2ldID09PSAnQ09MT1InKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aCArPSBudW1Qb2ludHMgKiA0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoICs9IG51bVBvaW50cyAqIG51bUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlckxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGN1cnJlbnRCdWZmZXJJbmRleCA9IDA7IGkgPCBhdHRyaWJ1dGVOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWVzW2ldID09PSAnQ09MT1InICYmIGF0dHJpYnV0ZUNvbXBvbmVudHNbaV0gPT09IDMpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Qb2ludHM7IGN1cnJlbnRCdWZmZXJJbmRleCArPSA0LCBqICs9IDMpIHtcbiAgICAgICAgICBidWZmZXJbY3VycmVudEJ1ZmZlckluZGV4XSA9IGF0dHJpYnV0ZURhdGFBbGxbaV0uR2V0VmFsdWUoaik7XG4gICAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJJbmRleCArIDFdID0gYXR0cmlidXRlRGF0YUFsbFtpXS5HZXRWYWx1ZShqICsgMSk7XG4gICAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJJbmRleCArIDJdID0gYXR0cmlidXRlRGF0YUFsbFtpXS5HZXRWYWx1ZShqICsgMik7XG4gICAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJJbmRleCArIDNdID0gMS4wOyAvLyBhbHBoYSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVzW2ldID09PSAnVEVYX0NPT1JEJykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bVBvaW50czsgY3VycmVudEJ1ZmZlckluZGV4ICs9IDIsIGorKykge1xuICAgICAgICAgIGJ1ZmZlcltjdXJyZW50QnVmZmVySW5kZXhdID0gYXR0cmlidXRlRGF0YUFsbFtpXS5HZXRWYWx1ZSgyICogaik7XG4gICAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJJbmRleCArIDFdID0gMS4wIC0gYXR0cmlidXRlRGF0YUFsbFtpXS5HZXRWYWx1ZSgyICogaiArIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bVBvaW50cyAqIGF0dHJpYnV0ZUNvbXBvbmVudHNbaV07IGN1cnJlbnRCdWZmZXJJbmRleCsrLCBqKyspIHtcbiAgICAgICAgICBidWZmZXJbY3VycmVudEJ1ZmZlckluZGV4XSA9IGF0dHJpYnV0ZURhdGFBbGxbaV0uR2V0VmFsdWUoaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRyYWNvLmRlc3Ryb3koYXR0cmlidXRlRGF0YUFsbFtpXSk7XG4gICAgfVxuICAgIGRyYWNvLmRlc3Ryb3koZGVjb2Rlcik7XG4gICAgZHJhY28uZGVzdHJveShkcmFjb0dlb21ldHJ5KTtcblxuICAgIHJldHVybiB0aGlzLl9fZGVjb2RlZEJ1ZmZlclRvSlNPTihidWZmZXIsIG51bVBvaW50cywgYXR0cmlidXRlTmFtZXMsIGF0dHJpYnV0ZUNvbXBvbmVudHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX2RlY29kZWRCdWZmZXJUb0pTT04oXG4gICAgYnVmZmVyOiBGbG9hdDMyQXJyYXksXG4gICAgbnVtUG9pbnRzOiBudW1iZXIsXG4gICAgYXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgIGF0dHJpYnV0ZUNvbXBvbmVudHM6IG51bWJlcltdXG4gICkge1xuICAgIGNvbnN0IGpzb246IGFueSA9IHtcbiAgICAgIGFzc2V0OiB7XG4gICAgICAgIHZlcnNpb246ICcyLjAnLFxuICAgICAgfSxcbiAgICAgIGV4dGVuc2lvbnNVc2VkOiBbJ0tIUl9tYXRlcmlhbHNfdW5saXQnXSxcbiAgICAgIGV4dGVuc2lvbnNSZXF1aXJlZDogWydLSFJfbWF0ZXJpYWxzX3VubGl0J10sXG4gICAgICBub2RlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ05vZGUnLFxuICAgICAgICAgIG1lc2g6IDAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgc2NlbmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlczogWzBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1hdGVyaWFsczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3BvaW50LWNsb3VkX21hdGVyaWFsJyxcbiAgICAgICAgICBwYnJNZXRhbGxpY1JvdWdobmVzczoge1xuICAgICAgICAgICAgYmFzZUNvbG9yRmFjdG9yOiBbMS4wLCAxLjAsIDEuMCwgMS4wXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4dGVuc2lvbnM6IHtcbiAgICAgICAgICAgIEtIUl9tYXRlcmlhbHNfdW5saXQ6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLl9fc2V0QnVmZmVyc1RvSlNPTihidWZmZXIsIGpzb24pO1xuICAgIHRoaXMuX19zZXRBY2Nlc3NvcnNBbmRCdWZmZXJWaWV3c1RvSlNPTihudW1Qb2ludHMsIGF0dHJpYnV0ZU5hbWVzLCBhdHRyaWJ1dGVDb21wb25lbnRzLCBqc29uKTtcbiAgICB0aGlzLl9fc2V0TWVzaGVzVG9KU09OKGF0dHJpYnV0ZU5hbWVzLCBqc29uKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXNvbHZlKGpzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3NldEJ1ZmZlcnNUb0pTT04oYnVmZmVyOiBGbG9hdDMyQXJyYXksIGpzb246IGFueSkge1xuICAgIHJldHVybiB0aGlzLl9fY29udmVydEJ1ZmZlclRvVVJJKGJ1ZmZlci5idWZmZXIpXG4gICAgICAudGhlbigodXJpKSA9PiB7XG4gICAgICAgIGpzb25bJ2J1ZmZlcnMnXSA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnaW5wdXQnLFxuICAgICAgICAgICAgYnl0ZUxlbmd0aDogYnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB1cmk6IHVyaSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIExvZ2dlci5lcnJvcigndGhpcy5fX2NvbnZlcnRCdWZmZXJUb1VSSSBlcnJvcjogJyArIGVycik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX19jb252ZXJ0QnVmZmVyVG9VUkkoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXJyYXlCdWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgICAgY29uc3QgZnIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICBmci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoZnIucmVzdWx0ISk7XG4gICAgICB9O1xuICAgICAgZnIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KGZyLmVycm9yKTtcbiAgICAgIH07XG4gICAgICBmci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3NldEFjY2Vzc29yc0FuZEJ1ZmZlclZpZXdzVG9KU09OKFxuICAgIG51bVBvaW50czogbnVtYmVyLFxuICAgIGF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSxcbiAgICBhdHRyaWJ1dGVDb21wb25lbnRzOiBudW1iZXJbXSxcbiAgICBqc29uOiBhbnlcbiAgKSB7XG4gICAgY29uc3QgYWNjZXNzb3JzID0gW107XG4gICAgY29uc3QgYnVmZmVyVmlld3MgPSBbXTtcblxuICAgIGxldCBieXRlT2Zmc2V0T2ZCdWZmZXJWaWV3ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgaW5kZXhPZkJ1ZmZlclZpZXcgPSAwOyBpIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBpbmRleE9mQnVmZmVyVmlldysrKSB7XG4gICAgICBjb25zdCBudW1PZkNvbXBvbmVudHMgPSBhdHRyaWJ1dGVDb21wb25lbnRzW2ldO1xuXG4gICAgICBsZXQgdHlwZTtcbiAgICAgIGlmIChudW1PZkNvbXBvbmVudHMgPT09IDEpIHtcbiAgICAgICAgdHlwZSA9ICdTQ0FMQVInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9ICdWRUMnICsgbnVtT2ZDb21wb25lbnRzO1xuICAgICAgfVxuXG4gICAgICBsZXQgYnl0ZU9mZnNldE9mQWNjZXNzb3IgPSAwO1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWVzW2ldO1xuICAgICAgd2hpbGUgKGkgPCBhdHRyaWJ1dGVOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgYWNjZXNzb3JzLnB1c2goe1xuICAgICAgICAgIG5hbWU6ICdwb2ludC1jbG91ZF8nICsgYXR0cmlidXRlTmFtZSArICdfJyArIGksXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogNTEyNiwgLy8gZ2wuRkxPQVRcbiAgICAgICAgICBjb3VudDogbnVtUG9pbnRzLFxuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgYnVmZmVyVmlldzogaW5kZXhPZkJ1ZmZlclZpZXcsXG4gICAgICAgICAgYnl0ZU9mZnNldDogYnl0ZU9mZnNldE9mQWNjZXNzb3IsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lc1tpXSA9PT0gJ0NPTE9SJykge1xuICAgICAgICAgIGJ5dGVPZmZzZXRPZkFjY2Vzc29yICs9IG51bVBvaW50cyAqIDQgKiA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ5dGVPZmZzZXRPZkFjY2Vzc29yICs9IG51bVBvaW50cyAqIG51bU9mQ29tcG9uZW50cyAqIDQ7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lICE9IGF0dHJpYnV0ZU5hbWVzW2ldKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnVmZmVyVmlld3NbaW5kZXhPZkJ1ZmZlclZpZXddID0ge1xuICAgICAgICBuYW1lOiAnYnVmZmVyVmlld18nICsgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgYnVmZmVyOiAwLFxuICAgICAgICBieXRlTGVuZ3RoOiBieXRlT2Zmc2V0T2ZBY2Nlc3NvcixcbiAgICAgICAgYnl0ZU9mZnNldDogYnl0ZU9mZnNldE9mQnVmZmVyVmlldyxcbiAgICAgICAgYnl0ZVN0cmlkZTogbnVtT2ZDb21wb25lbnRzICogNCxcbiAgICAgICAgdGFyZ2V0OiAzNDk2MiwgLy8gZ2wuQVJSQVlfQlVGRkVSXG4gICAgICB9O1xuICAgICAgYnl0ZU9mZnNldE9mQnVmZmVyVmlldyArPSBieXRlT2Zmc2V0T2ZBY2Nlc3NvcjtcbiAgICB9XG5cbiAgICBqc29uWydhY2Nlc3NvcnMnXSA9IGFjY2Vzc29ycztcbiAgICBqc29uWydidWZmZXJWaWV3cyddID0gYnVmZmVyVmlld3M7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0TWVzaGVzVG9KU09OKGF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSwganNvbjogYW55KSB7XG4gICAgY29uc3QgYXR0cmlidXRlczogYW55ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXR0cmlidXRlTmFtZXNbaV0gPT09ICdURVhfQ09PUkQnKSB7XG4gICAgICAgIGF0dHJpYnV0ZXNbJ1RFWENPT1JEXzAnXSA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVzW2ldID09PSAnR0VORVJJQycpIHtcbiAgICAgICAgYXR0cmlidXRlc1snVEFOR0VOVCddID0gaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZXNbaV1dID0gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNoOiBhbnkgPSB7XG4gICAgICBuYW1lOiAnTm9kZS1NZXNoJyxcbiAgICAgIHByaW1pdGl2ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1vZGU6IDAsXG4gICAgICAgICAgbWF0ZXJpYWw6IDAsXG4gICAgICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGpzb25bJ21lc2hlcyddID0gW21lc2hdO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBEcmFjbyBmaWxlIG9mIHBvaW50IGNsb3VkIHR5cGUuXG4gICAqIFdFSUdIVFNfMCBhbmQgSk9JTlRTXzAgYXR0cmlidXRlIGFuZCBhbGwgdGhlIG1lc2ggdHlwZSBhbmQgaXMgbm90IHN1cHBvcnQgeWV0LlxuICAgKiBAcGFyYW0gdXJpIC0gdXJpIG9mIGdsVEYgZmlsZVxuICAgKiBAcmV0dXJucyBhIHByaW1pdGl2ZSBvZiBSaG9kb25pdGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBpbXBvcnRQb2ludENsb3VkVG9QcmltaXRpdmUodXJpOiBzdHJpbmcpOiBQcm9taXNlPFByaW1pdGl2ZT4ge1xuICAgIGNvbnN0IHJfYXJyYXlCdWZmZXIgPSBhd2FpdCBEYXRhVXRpbC5mZXRjaEFycmF5QnVmZmVyKHVyaSk7XG4gICAgcmV0dXJuIHRoaXMuX19kZWNvZGVEcmFjb1RvUHJpbWl0aXZlKHJfYXJyYXlCdWZmZXIudW53cmFwRm9yY2UoKSk7XG4gIH1cblxuICAvLyB0YW5nZW50IGlzIG5vdCBhdmFpbGFibGVcbiAgcHJpdmF0ZSBfX2RlY29kZURyYWNvVG9QcmltaXRpdmUoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKSB7XG4gICAgY29uc3QgZHJhY28gPSBuZXcgRHJhY29EZWNvZGVyTW9kdWxlKCk7XG4gICAgY29uc3QgZGVjb2RlciA9IG5ldyBkcmFjby5EZWNvZGVyKCk7XG4gICAgY29uc3QgZHJhY29HZW9tZXRyeSA9IHRoaXMuX19nZXRHZW9tZXRyeUZyb21EcmFjb0J1ZmZlcihkcmFjbywgZGVjb2RlciwgYXJyYXlCdWZmZXIpO1xuICAgIGlmIChkcmFjb0dlb21ldHJ5ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkcmFjb0dlb21ldHJ5LicpO1xuICAgIH1cbiAgICBpZiAoZHJhY29HZW9tZXRyeS5nZW9tZXRyeVR5cGUgIT09IGRyYWNvLlBPSU5UX0NMT1VEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2VvbWV0cnlUeXBlIG9mIGRyYyBmaWxlLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXM6IEFycmF5PENvbXBvc2l0aW9uVHlwZUVudW0+ID0gW107XG4gICAgY29uc3QgYXR0cmlidXRlU2VtYW50aWNzOiBBcnJheTxWZXJ0ZXhBdHRyaWJ1dGVTZW1hbnRpY3NKb2luZWRTdHJpbmc+ID0gW107XG4gICAgY29uc3QgYXR0cmlidXRlczogQXJyYXk8VHlwZWRBcnJheT4gPSBbXTtcblxuICAgIHRoaXMuX19nZXRQb3NpdGlvbnMoXG4gICAgICBkcmFjbyxcbiAgICAgIGRlY29kZXIsXG4gICAgICBkcmFjb0dlb21ldHJ5LFxuICAgICAgYXR0cmlidXRlQ29tcG9zaXRpb25UeXBlcyxcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljcyxcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICApO1xuICAgIHRoaXMuX19nZXRDb2xvcnMoXG4gICAgICBkcmFjbyxcbiAgICAgIGRlY29kZXIsXG4gICAgICBkcmFjb0dlb21ldHJ5LFxuICAgICAgYXR0cmlidXRlQ29tcG9zaXRpb25UeXBlcyxcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljcyxcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICApO1xuICAgIHRoaXMuX19nZXROb3JtYWxzKFxuICAgICAgZHJhY28sXG4gICAgICBkZWNvZGVyLFxuICAgICAgZHJhY29HZW9tZXRyeSxcbiAgICAgIGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXMsXG4gICAgICBhdHRyaWJ1dGVTZW1hbnRpY3MsXG4gICAgICBhdHRyaWJ1dGVzXG4gICAgKTtcbiAgICB0aGlzLl9fZ2V0VGV4dHVyZUNvb3JkcyhcbiAgICAgIGRyYWNvLFxuICAgICAgZGVjb2RlcixcbiAgICAgIGRyYWNvR2VvbWV0cnksXG4gICAgICBhdHRyaWJ1dGVDb21wb3NpdGlvblR5cGVzLFxuICAgICAgYXR0cmlidXRlU2VtYW50aWNzLFxuICAgICAgYXR0cmlidXRlc1xuICAgICk7XG5cbiAgICBjb25zdCBwcmltaXRpdmUgPSBQcmltaXRpdmUuY3JlYXRlUHJpbWl0aXZlKHtcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljczogYXR0cmlidXRlU2VtYW50aWNzLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgIG1hdGVyaWFsOiBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKHtcbiAgICAgICAgaXNTa2lubmluZzogZmFsc2UsXG4gICAgICAgIGlzTGlnaHRpbmc6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGUuUG9pbnRzLFxuICAgIH0pO1xuXG4gICAgZHJhY28uZGVzdHJveShkZWNvZGVyKTtcbiAgICBkcmFjby5kZXN0cm95KGRyYWNvR2VvbWV0cnkpO1xuXG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgX19nZXRHZW9tZXRyeUZyb21EcmFjb0J1ZmZlcihkcmFjbzogYW55LCBkZWNvZGVyOiBhbnksIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBkcmFjby5EZWNvZGVyQnVmZmVyKCk7XG4gICAgYnVmZmVyLkluaXQobmV3IEludDhBcnJheShhcnJheUJ1ZmZlciksIGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgIGNvbnN0IGdlb21ldHJ5VHlwZSA9IGRlY29kZXIuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZShidWZmZXIpO1xuICAgIGxldCBkcmFjb0dlb21ldHJ5O1xuICAgIGxldCBkZWNvZGluZ1N0YXR1cztcbiAgICBpZiAoZ2VvbWV0cnlUeXBlID09PSBkcmFjby5UUklBTkdVTEFSX01FU0gpIHtcbiAgICAgIGRyYWNvR2VvbWV0cnkgPSBuZXcgZHJhY28uTWVzaCgpO1xuICAgICAgZGVjb2RpbmdTdGF0dXMgPSBkZWNvZGVyLkRlY29kZUJ1ZmZlclRvTWVzaChidWZmZXIsIGRyYWNvR2VvbWV0cnkpO1xuICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnlUeXBlID09PSBkcmFjby5QT0lOVF9DTE9VRCkge1xuICAgICAgZHJhY29HZW9tZXRyeSA9IG5ldyBkcmFjby5Qb2ludENsb3VkKCk7XG4gICAgICBkZWNvZGluZ1N0YXR1cyA9IGRlY29kZXIuRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkKGJ1ZmZlciwgZHJhY29HZW9tZXRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gJ1Vua25vd24gZ2VvbWV0cnkgdHlwZS4nO1xuICAgICAgTG9nZ2VyLmVycm9yKGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICBkcmFjb0dlb21ldHJ5Lmdlb21ldHJ5VHlwZSA9IGdlb21ldHJ5VHlwZTsgLy8gc3RvcmVcblxuICAgIGlmICghZGVjb2RpbmdTdGF0dXMub2soKSB8fCBkcmFjb0dlb21ldHJ5LnB0ciA9PSAwKSB7XG4gICAgICBsZXQgZXJyb3JNc2cgPSAnRGVjb2RpbmcgZmFpbGVkOiAnO1xuICAgICAgZXJyb3JNc2cgKz0gZGVjb2RpbmdTdGF0dXMuZXJyb3JfbXNnKCk7XG4gICAgICBMb2dnZXIuZXJyb3IoZXJyb3JNc2cpO1xuICAgICAgZHJhY28uZGVzdHJveShkZWNvZGVyKTtcbiAgICAgIGRyYWNvLmRlc3Ryb3koZHJhY29HZW9tZXRyeSk7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBkcmFjby5kZXN0cm95KGJ1ZmZlcik7XG5cbiAgICByZXR1cm4gZHJhY29HZW9tZXRyeTtcbiAgfVxuXG4gIHByaXZhdGUgX19nZXRQb3NpdGlvbnMoXG4gICAgZHJhY286IGFueSxcbiAgICBkZWNvZGVyOiBhbnksXG4gICAgZHJhY29HZW9tZXRyeTogYW55LFxuICAgIGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXM6IEFycmF5PENvbXBvc2l0aW9uVHlwZUVudW0+LFxuICAgIGF0dHJpYnV0ZVNlbWFudGljczogQXJyYXk8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nPixcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxUeXBlZEFycmF5PlxuICApIHtcbiAgICBjb25zdCBwb3NBdHRJZCA9IGRlY29kZXIuR2V0QXR0cmlidXRlSWQoZHJhY29HZW9tZXRyeSwgZHJhY28uUE9TSVRJT04pO1xuICAgIGlmIChwb3NBdHRJZCA9PT0gLTEpIHtcbiAgICAgIGRyYWNvLmRlc3Ryb3koZGVjb2Rlcik7XG4gICAgICBkcmFjby5kZXN0cm95KGRyYWNvR2VvbWV0cnkpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFjbzogTm8gcG9zaXRpb24gYXR0cmlidXRlIGZvdW5kLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc0F0dHJpYnV0ZSA9IGRlY29kZXIuR2V0QXR0cmlidXRlKGRyYWNvR2VvbWV0cnksIHBvc0F0dElkKTtcbiAgICBjb25zdCBwb3NBdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvLkRyYWNvRmxvYXQzMkFycmF5KCk7XG4gICAgZGVjb2Rlci5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cyhkcmFjb0dlb21ldHJ5LCBwb3NBdHRyaWJ1dGUsIHBvc0F0dHJpYnV0ZURhdGEpO1xuXG4gICAgY29uc3QgbnVtUG9pbnRzID0gZHJhY29HZW9tZXRyeS5udW1fcG9pbnRzKCk7XG4gICAgY29uc3QgbnVtVmVydGljZXMgPSBudW1Qb2ludHMgKiAzO1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtVmVydGljZXMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSArPSAxKSB7XG4gICAgICBwb3NpdGlvbnNbaV0gPSBwb3NBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkpOyAvLyBYWVogWFlaXG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ29tcG9zaXRpb25UeXBlcy5wdXNoKENvbXBvc2l0aW9uVHlwZS5WZWMzKTtcbiAgICBhdHRyaWJ1dGVTZW1hbnRpY3MucHVzaChWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaKTtcbiAgICBhdHRyaWJ1dGVzLnB1c2gocG9zaXRpb25zKTtcblxuICAgIGRyYWNvLmRlc3Ryb3kocG9zQXR0cmlidXRlRGF0YSk7XG4gICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX19nZXRDb2xvcnMoXG4gICAgZHJhY286IGFueSxcbiAgICBkZWNvZGVyOiBhbnksXG4gICAgZHJhY29HZW9tZXRyeTogYW55LFxuICAgIGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXM6IEFycmF5PENvbXBvc2l0aW9uVHlwZUVudW0+LFxuICAgIGF0dHJpYnV0ZVNlbWFudGljczogQXJyYXk8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nPixcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxUeXBlZEFycmF5PlxuICApIHtcbiAgICAvLyBHZXQgY29sb3IgYXR0cmlidXRlcyBpZiBleGlzdHMuXG4gICAgY29uc3QgY29sb3JBdHRJZCA9IGRlY29kZXIuR2V0QXR0cmlidXRlSWQoZHJhY29HZW9tZXRyeSwgZHJhY28uQ09MT1IpO1xuICAgIGlmIChjb2xvckF0dElkID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vY29uc29sZS5sb2coJ0xvYWRlZCBjb2xvciBhdHRyaWJ1dGUuJyk7XG5cbiAgICAgIGNvbnN0IGNvbEF0dHJpYnV0ZSA9IGRlY29kZXIuR2V0QXR0cmlidXRlKGRyYWNvR2VvbWV0cnksIGNvbG9yQXR0SWQpO1xuICAgICAgY29uc3QgY29sQXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb0Zsb2F0MzJBcnJheSgpO1xuICAgICAgZGVjb2Rlci5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cyhkcmFjb0dlb21ldHJ5LCBjb2xBdHRyaWJ1dGUsIGNvbEF0dHJpYnV0ZURhdGEpO1xuXG4gICAgICBjb25zdCBudW1Qb2ludHMgPSBkcmFjb0dlb21ldHJ5Lm51bV9wb2ludHMoKTtcbiAgICAgIGNvbnN0IG51bUNvbXBvbmVudHMgPSBjb2xBdHRyaWJ1dGUubnVtX2NvbXBvbmVudHMoKTtcbiAgICAgIGNvbnN0IG51bVZlcnRpY2VzID0gbnVtUG9pbnRzICogNDtcbiAgICAgIGNvbnN0IGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtVmVydGljZXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSArPSBudW1Db21wb25lbnRzKSB7XG4gICAgICAgIGNvbG9yc1tpXSA9IGNvbEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSk7XG4gICAgICAgIGNvbG9yc1tpICsgMV0gPSBjb2xBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkgKyAxKTtcbiAgICAgICAgY29sb3JzW2kgKyAyXSA9IGNvbEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSArIDIpO1xuICAgICAgICBpZiAobnVtQ29tcG9uZW50cyA9PSA0KSB7XG4gICAgICAgICAgY29sb3JzW2kgKyAzXSA9IGNvbEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSArIDMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbG9yc1tpICsgM10gPSAxLjA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXR0cmlidXRlQ29tcG9zaXRpb25UeXBlcy5wdXNoKENvbXBvc2l0aW9uVHlwZS5WZWMzKTtcbiAgICAgIGF0dHJpYnV0ZVNlbWFudGljcy5wdXNoKFZlcnRleEF0dHJpYnV0ZS5Db2xvcjAuWFlaKTtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChjb2xvcnMpO1xuXG4gICAgICBkcmFjby5kZXN0cm95KGNvbEF0dHJpYnV0ZURhdGEpO1xuICAgICAgcmV0dXJuIGNvbG9ycztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0Tm9ybWFscyhcbiAgICBkcmFjbzogYW55LFxuICAgIGRlY29kZXI6IGFueSxcbiAgICBkcmFjb0dlb21ldHJ5OiBhbnksXG4gICAgYXR0cmlidXRlQ29tcG9zaXRpb25UeXBlczogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT4sXG4gICAgYXR0cmlidXRlU2VtYW50aWNzOiBBcnJheTxWZXJ0ZXhBdHRyaWJ1dGVTZW1hbnRpY3NKb2luZWRTdHJpbmc+LFxuICAgIGF0dHJpYnV0ZXM6IEFycmF5PFR5cGVkQXJyYXk+XG4gICkge1xuICAgIC8vIEdldCBub3JtYWwgYXR0cmlidXRlcyBpZiBleGlzdHMuXG4gICAgY29uc3Qgbm9ybWFsQXR0SWQgPSBkZWNvZGVyLkdldEF0dHJpYnV0ZUlkKGRyYWNvR2VvbWV0cnksIGRyYWNvLk5PUk1BTCk7XG4gICAgaWYgKG5vcm1hbEF0dElkID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vY29uc29sZS5sb2coJ0xvYWRlZCBub3JtYWwgYXR0cmlidXRlLicpO1xuXG4gICAgICBjb25zdCBub3JBdHRyaWJ1dGUgPSBkZWNvZGVyLkdldEF0dHJpYnV0ZShkcmFjb0dlb21ldHJ5LCBub3JtYWxBdHRJZCk7XG4gICAgICBjb25zdCBub3JBdHRyaWJ1dGVEYXRhID0gbmV3IGRyYWNvLkRyYWNvRmxvYXQzMkFycmF5KCk7XG4gICAgICBkZWNvZGVyLkdldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzKGRyYWNvR2VvbWV0cnksIG5vckF0dHJpYnV0ZSwgbm9yQXR0cmlidXRlRGF0YSk7XG5cbiAgICAgIGNvbnN0IG51bVBvaW50cyA9IGRyYWNvR2VvbWV0cnkubnVtX3BvaW50cygpO1xuICAgICAgY29uc3QgbnVtVmVydGljZXMgPSBudW1Qb2ludHMgKiAzO1xuICAgICAgY29uc3Qgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtVmVydGljZXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSArPSAxKSB7XG4gICAgICAgIG5vcm1hbHNbaV0gPSBub3JBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkpOyAvLyBYWVogWFlaXG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVDb21wb3NpdGlvblR5cGVzLnB1c2goQ29tcG9zaXRpb25UeXBlLlZlYzMpO1xuICAgICAgYXR0cmlidXRlU2VtYW50aWNzLnB1c2goVmVydGV4QXR0cmlidXRlLk5vcm1hbC5YWVopO1xuICAgICAgYXR0cmlidXRlcy5wdXNoKG5vcm1hbHMpO1xuXG4gICAgICBkcmFjby5kZXN0cm95KG5vckF0dHJpYnV0ZURhdGEpO1xuICAgICAgcmV0dXJuIG5vcm1hbHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2dldFRleHR1cmVDb29yZHMoXG4gICAgZHJhY286IGFueSxcbiAgICBkZWNvZGVyOiBhbnksXG4gICAgZHJhY29HZW9tZXRyeTogYW55LFxuICAgIGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXM6IEFycmF5PENvbXBvc2l0aW9uVHlwZUVudW0+LFxuICAgIGF0dHJpYnV0ZVNlbWFudGljczogQXJyYXk8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nPixcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxUeXBlZEFycmF5PlxuICApIHtcbiAgICAvLyBHZXQgdGV4dHVyZSBjb29yZGluYXRlIGF0dHJpYnV0ZXMgaWYgZXhpc3RzLlxuICAgIGNvbnN0IHRleENvb3JkQXR0SWQgPSBkZWNvZGVyLkdldEF0dHJpYnV0ZUlkKGRyYWNvR2VvbWV0cnksIGRyYWNvLlRFWF9DT09SRCk7XG4gICAgaWYgKHRleENvb3JkQXR0SWQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGV4Q29vcmRBdHRyaWJ1dGUgPSBkZWNvZGVyLkdldEF0dHJpYnV0ZShkcmFjb0dlb21ldHJ5LCB0ZXhDb29yZEF0dElkKTtcbiAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb0Zsb2F0MzJBcnJheSgpO1xuICAgICAgZGVjb2Rlci5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cyhcbiAgICAgICAgZHJhY29HZW9tZXRyeSxcbiAgICAgICAgdGV4Q29vcmRBdHRyaWJ1dGUsXG4gICAgICAgIHRleENvb3JkQXR0cmlidXRlRGF0YVxuICAgICAgKTtcblxuICAgICAgY29uc3QgbnVtUG9pbnRzID0gZHJhY29HZW9tZXRyeS5udW1fcG9pbnRzKCk7XG4gICAgICBjb25zdCBudW1WZXJ0aWNlcyA9IG51bVBvaW50cyAqIDI7XG4gICAgICBjb25zdCB0ZXhDb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmVydGljZXM7IGkgKz0gMSkge1xuICAgICAgICB0ZXhDb29yZHNbaV0gPSB0ZXhDb29yZEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSk7IC8vIFhZWiBYWVpcbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZUNvbXBvc2l0aW9uVHlwZXMucHVzaChDb21wb3NpdGlvblR5cGUuVmVjMik7XG4gICAgICBhdHRyaWJ1dGVTZW1hbnRpY3MucHVzaChWZXJ0ZXhBdHRyaWJ1dGUuVGV4Y29vcmQwLlhZKTtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaCh0ZXhDb29yZHMpO1xuXG4gICAgICBkcmFjby5kZXN0cm95KHRleENvb3JkQXR0cmlidXRlRGF0YSk7XG4gICAgICByZXR1cm4gdGV4Q29vcmRzO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi9taXNjL0RhdGFVdGlsJztcbmltcG9ydCB7IEZpbGVUeXBlLCBGaWxlVHlwZUVudW0gfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0ZpbGVUeXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEZvcm1hdEJ5QXJyYXlCdWZmZXJzKGZpbGVzOiB7IFtzOiBzdHJpbmddOiBBcnJheUJ1ZmZlciB9KTogRmlsZVR5cGVFbnVtIHtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBpbiBmaWxlcykge1xuICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBEYXRhVXRpbC5nZXRFeHRlbnNpb24oZmlsZU5hbWUpO1xuXG4gICAgaWYgKGZpbGVFeHRlbnNpb24gPT09ICdnbHRmJykge1xuICAgICAgcmV0dXJuIEZpbGVUeXBlLkdsdGY7XG4gICAgfSBlbHNlIGlmIChmaWxlRXh0ZW5zaW9uID09PSAnZ2xiJykge1xuICAgICAgcmV0dXJuIEZpbGVUeXBlLkdsdGZCaW5hcnk7XG4gICAgfSBlbHNlIGlmIChmaWxlRXh0ZW5zaW9uID09PSAndnJtJykge1xuICAgICAgcmV0dXJuIEZpbGVUeXBlLlZSTTtcbiAgICB9IGVsc2UgaWYgKGZpbGVFeHRlbnNpb24gPT09ICdkcmMnKSB7XG4gICAgICByZXR1cm4gRmlsZVR5cGUuRHJhY287XG4gICAgfVxuICB9XG4gIHJldHVybiBGaWxlVHlwZS5Vbmtub3duO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Rm9ybWF0QnlVcmkodXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGxpdCA9IHVyaS5zcGxpdCgnLicpO1xuICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGZpbGVFeHRlbnNpb24gPT09ICdlZmsnKSB7XG4gICAgcmV0dXJuICdFZmZla3NlZXInO1xuICB9IGVsc2UgaWYgKGZpbGVFeHRlbnNpb24gPT09ICdkcmMnKSB7XG4gICAgcmV0dXJuICdEcmFjbyc7XG4gIH0gZWxzZSBpZiAoZmlsZUV4dGVuc2lvbiA9PT0gJ3ZybScpIHtcbiAgICByZXR1cm4gJ1ZSTSc7XG4gIH0gZWxzZSBpZiAoZmlsZUV4dGVuc2lvbiA9PT0gJ2dsdGYnKSB7XG4gICAgcmV0dXJuICdnbFRGJztcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93bic7XG5cbiAgLy8gLy8gZ2xURlxuICAvLyByZXR1cm4gRGF0YVV0aWwubG9hZFJlc291cmNlQXN5bmModXJpLCB0cnVlLFxuICAvLyAgIChyZXNvbHZlOiBGdW5jdGlvbiwgcmVzcG9uc2U6IGFueSkgPT4ge1xuICAvLyAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSByZXNwb25zZTtcbiAgLy8gICAgIGNoZWNrVmVyc2lvbk9mR2x0ZihhcnJheUJ1ZmZlcik7XG4gIC8vICAgICBjb25zb2xlLndhcm4oJ2Rpc2NhcmQgZG93bmxvYWRlZCBhcnJheUJ1ZmZlcicpO1xuICAvLyAgIH0sIChyZWplY3RzOiBhbnksIHN0YXR1czogYW55KSA9PiB7XG4gIC8vICAgICBjb25zb2xlLmxvZyhzdGF0dXMpO1xuICAvLyAgIH1cbiAgLy8gKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tWZXJzaW9uT2ZHbHRmKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcikge1xuICBjb25zdCBpc0xpdHRsZUVuZGlhbiA9IHRydWU7XG5cbiAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIDAsIDIwKTtcbiAgLy8gTWFnaWMgZmllbGRcbiAgY29uc3QgbWFnaWMgPSBkYXRhVmlldy5nZXRVaW50MzIoMCwgaXNMaXR0bGVFbmRpYW4pO1xuXG4gIC8vIDB4NDY1NDZDNjcgaXMgJ2dsVEYnIGluIEFTQ0lJIGNvZGVzLlxuICBpZiAobWFnaWMgIT09IDB4NDY1NDZjNjcpIHtcbiAgICAvLyBJdCBtdXN0IGJlIG5vcm1hbCBnbFRGIChOT1QgYmluYXJ5KSBmaWxlLi4uXG4gICAgY29uc3QgZ290VGV4dCA9IERhdGFVdGlsLmFycmF5QnVmZmVyVG9TdHJpbmcoYXJyYXlCdWZmZXIpO1xuXG4gICAgY29uc3QgZ2x0Zkpzb24gPSBKU09OLnBhcnNlKGdvdFRleHQpO1xuXG4gICAgY29uc3QgZ2xURlZlciA9IGNoZWNrR0xURlZlcnNpb24oZ2x0Zkpzb24pO1xuXG4gICAgcmV0dXJuICdnbFRGJyArIGdsVEZWZXI7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ2xURlZlciA9IGRhdGFWaWV3LmdldFVpbnQzMig0LCBpc0xpdHRsZUVuZGlhbik7XG4gICAgcmV0dXJuICdnbFRGJyArIGdsVEZWZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tHTFRGVmVyc2lvbihnbHRmSnNvbjogYW55KSB7XG4gIGxldCBnbFRGVmVyID0gMS4wO1xuICBpZiAoZ2x0Zkpzb24uYXNzZXQgJiYgZ2x0Zkpzb24uYXNzZXQudmVyc2lvbikge1xuICAgIGdsVEZWZXIgPSBwYXJzZUZsb2F0KGdsdGZKc29uLmFzc2V0LnZlcnNpb24pO1xuICB9XG4gIHJldHVybiBnbFRGVmVyO1xufVxuIiwiaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi9taXNjL0RhdGFVdGlsJztcbmltcG9ydCB7IFJuTTIsIFJuTTJJbWFnZSwgUm5NMkFjY2Vzc29yIH0gZnJvbSAnLi4vLi4vdHlwZXMvUm5NMic7XG5pbXBvcnQgeyBSblByb21pc2UsIFJuUHJvbWlzZUNhbGxiYWNrIH0gZnJvbSAnLi4vbWlzYy9SblByb21pc2UnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IGlmRGVmaW5lZFRoZW4gfSBmcm9tICcuLi9taXNjL01pc2NVdGlsJztcbmltcG9ydCB7IEdsdGZGaWxlQnVmZmVycywgR2x0ZkxvYWRPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBFcnIsIFJlc3VsdCwgT2ssIGlzRXJyIH0gZnJvbSAnLi4vbWlzYy9SZXN1bHQnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG5kZWNsYXJlIGxldCBSbjogYW55O1xuXG4vKipcbiAqIFRoZSBnbFRGMiBJbXBvcnRlciBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdsdGYySW1wb3J0ZXIge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogSW1wb3J0IGdsVEYyIGZpbGVcbiAgICogQHBhcmFtIHVyaSAtIHVyaSBvZiBnbFRGIGZpbGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIGZvciBsb2FkaW5nIHByb2Nlc3NcbiAgICogQHJldHVybnMgYSBnbFRGMiBiYXNlZCBKU09OIHByZS1wcm9jZXNzZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgaW1wb3J0RnJvbVVyaShcbiAgICB1cmk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogR2x0ZkxvYWRPcHRpb25cbiAgKTogUHJvbWlzZTxSZXN1bHQ8Um5NMiwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IHJfYXJyYXlCdWZmZXIgPSBhd2FpdCBEYXRhVXRpbC5mZXRjaEFycmF5QnVmZmVyKHVyaSk7XG5cbiAgICBpZiAoaXNFcnIocl9hcnJheUJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZTogJ2ZldGNoQXJyYXlCdWZmZXIgZXJyb3InLFxuICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5faW1wb3J0R2x0Zk9yR2xiRnJvbUFycmF5QnVmZmVycyhcbiAgICAgIHJfYXJyYXlCdWZmZXIuZ2V0KCksXG4gICAgICBvcHRpb25zPy5maWxlcyA/PyB7fSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICB1cmlcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIGltcG9ydEZyb21BcnJheUJ1ZmZlcnMoXG4gICAgZmlsZXM6IEdsdGZGaWxlQnVmZmVycyxcbiAgICBvcHRpb25zPzogR2x0ZkxvYWRPcHRpb25cbiAgKTogUHJvbWlzZTxSZXN1bHQ8Um5NMiwgdW5kZWZpbmVkPj4ge1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgaW4gZmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBEYXRhVXRpbC5nZXRFeHRlbnNpb24oZmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZmlsZUV4dGVuc2lvbiA9PT0gJ2dsdGYnIHx8IGZpbGVFeHRlbnNpb24gPT09ICdnbGInKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ltcG9ydEdsdGZPckdsYkZyb21BcnJheUJ1ZmZlcnMoZmlsZXNbZmlsZU5hbWVdLCBmaWxlcywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgIG1lc3NhZ2U6ICdubyBnbHRmIG9yIGdsYiBmaWxlIGZvdW5kJyxcbiAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGdsVEYyIGFycmF5IGJ1ZmZlci5cbiAgICogQHBhcmFtIGFycmF5QnVmZmVyIC5nbHRmLy5nbGIgZmlsZSBpbiBBcnJheUJ1ZmZlclxuICAgKiBAcGFyYW0gb3RoZXJGaWxlcyBvdGhlciByZXNvdXJjZSBmaWxlcyBkYXRhIGluIEFycmF5QnVmZmVyc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciBsb2FkaW5nIHByb2Nlc3MgKE9wdGlvbmFsKVxuICAgKiBAcGFyYW0gdXJpIC5nbHRmIGZpbGUncyB1cmkgKE9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBhIGdsVEYyIGJhc2VkIEpTT04gcHJlLXByb2Nlc3NlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBfaW1wb3J0R2x0Zk9yR2xiRnJvbUFycmF5QnVmZmVycyhcbiAgICBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIsXG4gICAgb3RoZXJGaWxlczogR2x0ZkZpbGVCdWZmZXJzLFxuICAgIG9wdGlvbnM/OiBHbHRmTG9hZE9wdGlvbixcbiAgICB1cmk/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZXN1bHQ8Um5NMiwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCAwLCAyMCk7XG4gICAgLy8gTWFnaWMgZmllbGRcbiAgICBjb25zdCBtYWdpYyA9IGRhdGFWaWV3LmdldFVpbnQzMigwLCB0cnVlKTtcbiAgICAvLyAweDQ2NTQ2QzY3IGlzICdnbFRGJyBpbiBBU0NJSSBjb2Rlcy5cbiAgICBpZiAobWFnaWMgIT09IDB4NDY1NDZjNjcpIHtcbiAgICAgIC8vY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnN0IGdvdFRleHQgPSBEYXRhVXRpbC5hcnJheUJ1ZmZlclRvU3RyaW5nKGFycmF5QnVmZmVyKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGdvdFRleHQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZ2x0Zkpzb24gPSBhd2FpdCB0aGlzLl9pbXBvcnRHbHRmKGpzb24sIG90aGVyRmlsZXMsIG9wdGlvbnMhLCB1cmkpO1xuICAgICAgICByZXR1cm4gbmV3IE9rKGdsdGZKc29uKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgICAgbWVzc2FnZTogJ3RoaXMuX19pbXBvcnRHbHRmIGVycm9yJyxcbiAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZ2x0Zkpzb24gPSBhd2FpdCB0aGlzLl9pbXBvcnRHbGIoYXJyYXlCdWZmZXIsIG90aGVyRmlsZXMsIG9wdGlvbnMhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPayhnbHRmSnNvbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICAgIG1lc3NhZ2U6ICd0aGlzLmltcG9ydEdsYiBlcnJvcicsXG4gICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIF9nZXRPcHRpb25zKFxuICAgIGRlZmF1bHRPcHRpb25zOiBHbHRmTG9hZE9wdGlvbixcbiAgICBqc29uOiBSbk0yLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uXG4gICk6IEdsdGZMb2FkT3B0aW9uIHtcbiAgICBpZiAoanNvbi5hc3NldD8uZXh0cmFzPy5ybkxvYWRlck9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBvcHRpb25OYW1lIGluIGpzb24uYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucykge1xuICAgICAgICAoZGVmYXVsdE9wdGlvbnMgYXMgYW55KVtvcHRpb25OYW1lIGFzIGtleW9mIEdsdGZMb2FkT3B0aW9uXSA9IGpzb24uYXNzZXQuZXh0cmFzXG4gICAgICAgICAgLnJuTG9hZGVyT3B0aW9uc1tvcHRpb25OYW1lIGFzIGtleW9mIEdsdGZMb2FkT3B0aW9uXSBhcyBhbnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHRpb25OYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgIChkZWZhdWx0T3B0aW9ucyBhcyBhbnkpW29wdGlvbk5hbWUgYXMga2V5b2YgR2x0ZkxvYWRPcHRpb25dID0gb3B0aW9uc1tcbiAgICAgICAgb3B0aW9uTmFtZSBhcyBrZXlvZiBHbHRmTG9hZE9wdGlvblxuICAgICAgXSBhcyBhbnk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sb2FkZXJFeHRlbnNpb25OYW1lICYmIHR5cGVvZiBvcHRpb25zLmxvYWRlckV4dGVuc2lvbk5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoUm5bb3B0aW9ucy5sb2FkZXJFeHRlbnNpb25OYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIGRlZmF1bHRPcHRpb25zLmxvYWRlckV4dGVuc2lvbiA9IFJuW29wdGlvbnMubG9hZGVyRXh0ZW5zaW9uTmFtZV0uZ2V0SW5zdGFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIExvZ2dlci5lcnJvcihgJHtvcHRpb25zLmxvYWRlckV4dGVuc2lvbk5hbWV9IG5vdCBmb3VuZCFgKTtcbiAgICAgICAgZGVmYXVsdE9wdGlvbnMubG9hZGVyRXh0ZW5zaW9uID0gdm9pZCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfaW1wb3J0R2xiKFxuICAgIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcixcbiAgICBmaWxlczogR2x0ZkZpbGVCdWZmZXJzLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uXG4gICk6IFByb21pc2U8Um5NMj4ge1xuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCAwLCAyMCk7XG4gICAgY29uc3QgZ2x0ZlZlciA9IGRhdGFWaWV3LmdldFVpbnQzMig0LCB0cnVlKTtcbiAgICBpZiAoZ2x0ZlZlciAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZlcnNpb24gZmllbGQgaW4gdGhpcyBiaW5hcnkgZ2xURiBmaWxlLicpO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGhPZkpTb25DaHVua0RhdGEgPSBkYXRhVmlldy5nZXRVaW50MzIoMTIsIHRydWUpO1xuICAgIGNvbnN0IGNodW5rVHlwZSA9IGRhdGFWaWV3LmdldFVpbnQzMigxNiwgdHJ1ZSk7XG4gICAgLy8gMHg0RTRGNTM0QSBtZWFucyBKU09OIGZvcm1hdCAoMHg0RTRGNTM0QSBpcyAnSlNPTicgaW4gQVNDSUkgY29kZXMpXG4gICAgaWYgKGNodW5rVHlwZSAhPT0gMHg0ZTRmNTM0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rVHlwZSBvZiBjaHVuazAgaW4gdGhpcyBiaW5hcnkgZ2xURiBmaWxlLicpO1xuICAgIH1cbiAgICBjb25zdCB1aW50OEFycmF5SlNvbkNvbnRlbnQgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgMjAsIGxlbmd0aE9mSlNvbkNodW5rRGF0YSk7XG4gICAgY29uc3QgZ290VGV4dCA9IERhdGFVdGlsLnVpbnQ4QXJyYXlUb1N0cmluZyh1aW50OEFycmF5SlNvbkNvbnRlbnQpO1xuICAgIGNvbnN0IGdsdGZKc29uID0gSlNPTi5wYXJzZShnb3RUZXh0KTtcbiAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IERhdGFVdGlsLmNyZWF0ZURlZmF1bHRHbHRmT3B0aW9ucygpO1xuICAgIG9wdGlvbnMgPSB0aGlzLl9nZXRPcHRpb25zKGRlZmF1bHRPcHRpb25zLCBnbHRmSnNvbiwgb3B0aW9ucyk7XG4gICAgY29uc3QgdWludDhhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCAyMCArIGxlbmd0aE9mSlNvbkNodW5rRGF0YSArIDgpO1xuXG4gICAgaWYgKGdsdGZKc29uLmFzc2V0LmV4dHJhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBnbHRmSnNvbi5hc3NldC5leHRyYXMgPSB7IGZpbGVUeXBlOiAnZ2xURicsIHZlcnNpb246ICcyJyB9O1xuICAgIH1cbiAgICB0aGlzLl9tZXJnZUV4dGVuZGVkSnNvbihnbHRmSnNvbiwgb3B0aW9ucy5leHRlbmRlZEpzb24hKTtcbiAgICBnbHRmSnNvbi5hc3NldC5leHRyYXMucm5Mb2FkZXJPcHRpb25zID0gb3B0aW9ucztcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9sb2FkSW5uZXIoZ2x0Zkpzb24sIGZpbGVzLCBvcHRpb25zLCB1aW50OGFycmF5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5pbmZvKCd0aGlzLl9sb2FkSW5uZXIgZXJyb3IgaW4gX2xvYWRBc0JpbmFyeUpzb246ICcgKyBlcnIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2x0Zkpzb247XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIF9pbXBvcnRHbHRmKFxuICAgIGdsdGZKc29uOiBSbk0yLFxuICAgIGZpbGVBcnJheUJ1ZmZlcnM6IEdsdGZGaWxlQnVmZmVycyxcbiAgICBvcHRpb25zOiBHbHRmTG9hZE9wdGlvbixcbiAgICB1cmk/OiBzdHJpbmcsXG4gICAgY2FsbGJhY2s/OiBSblByb21pc2VDYWxsYmFja1xuICApOiBQcm9taXNlPFJuTTI+IHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHVyaT8uc3Vic3RyaW5nKDAsIHVyaT8ubGFzdEluZGV4T2YoJy8nKSkgKyAnLyc7IC8vIGxvY2F0aW9uIG9mIG1vZGVsIGZpbGUgYXMgYmFzZVBhdGhcbiAgICBpZiAoZ2x0Zkpzb24uYXNzZXQuZXh0cmFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyA9IHsgZmlsZVR5cGU6ICdnbFRGJywgdmVyc2lvbjogJzInIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBEYXRhVXRpbC5jcmVhdGVEZWZhdWx0R2x0Zk9wdGlvbnMoKTtcbiAgICBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucyhkZWZhdWx0T3B0aW9ucywgZ2x0Zkpzb24sIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fbWVyZ2VFeHRlbmRlZEpzb24oZ2x0Zkpzb24sIG9wdGlvbnMuZXh0ZW5kZWRKc29uISk7XG4gICAgZ2x0Zkpzb24uYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZElubmVyKGdsdGZKc29uLCBmaWxlQXJyYXlCdWZmZXJzLCBvcHRpb25zLCB1bmRlZmluZWQsIGJhc2VQYXRoLCBjYWxsYmFjayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ3RoaXMuX2xvYWRJbm5lciBlcnJvciBpbiBfbG9hZEFzVGV4dEpzb246ICcgKyBlcnIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2x0Zkpzb247XG4gIH1cblxuICBzdGF0aWMgX2xvYWRJbm5lcihcbiAgICBnbHRmSnNvbjogUm5NMixcbiAgICBmaWxlczogR2x0ZkZpbGVCdWZmZXJzLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uLFxuICAgIHVpbnQ4YXJyYXlPZkdsYj86IFVpbnQ4QXJyYXksXG4gICAgYmFzZVBhdGg/OiBzdHJpbmcsXG4gICAgY2FsbGJhY2s/OiBSblByb21pc2VDYWxsYmFja1xuICApOiBSblByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgLy8gTG9hZCByZXNvdXJjZXMgdG8gYWJvdmUgcmVzb3VyY2VzIG9iamVjdC5cbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgdGhpcy5fbG9hZFJlc291cmNlcyh1aW50OGFycmF5T2ZHbGIhLCBnbHRmSnNvbiwgZmlsZXMsIG9wdGlvbnMsIGJhc2VQYXRoLCBjYWxsYmFjaylcbiAgICApO1xuXG4gICAgLy8gUGFyc2UgZ2xURiBKU09OXG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIG5ldyBSblByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5fbG9hZEpzb25Db250ZW50KGdsdGZKc29uKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSkgYXMgUm5Qcm9taXNlPHZvaWQ+XG4gICAgKTtcblxuICAgIHJldHVybiBSblByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBfbG9hZEpzb25Db250ZW50KGdsdGZKc29uOiBSbk0yKSB7XG4gICAgLy8gU2NlbmVcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZTY2VuZXMoZ2x0Zkpzb24pO1xuXG4gICAgLy8gTm9kZVxuICAgIHRoaXMuX2xvYWREZXBlbmRlbmNpZXNPZk5vZGVzKGdsdGZKc29uKTtcblxuICAgIC8vIE1lc2hcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZNZXNoZXMoZ2x0Zkpzb24pO1xuXG4gICAgLy8gTWF0ZXJpYWxcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZNYXRlcmlhbHMoZ2x0Zkpzb24pO1xuXG4gICAgLy8gVGV4dHVyZVxuICAgIHRoaXMuX2xvYWREZXBlbmRlbmNpZXNPZlRleHR1cmVzKGdsdGZKc29uKTtcblxuICAgIC8vIEpvaW50XG4gICAgdGhpcy5fbG9hZERlcGVuZGVuY2llc09mSm9pbnRzKGdsdGZKc29uKTtcblxuICAgIC8vIEFuaW1hdGlvblxuICAgIHRoaXMuX2xvYWREZXBlbmRlbmNpZXNPZkFuaW1hdGlvbnMoZ2x0Zkpzb24pO1xuXG4gICAgLy8gQWNjZXNzb3JcbiAgICB0aGlzLl9sb2FkRGVwZW5kZW5jaWVzT2ZBY2Nlc3NvcnMoZ2x0Zkpzb24pO1xuXG4gICAgLy8gQnVmZmVyVmlld1xuICAgIHRoaXMuX2xvYWREZXBlbmRlbmNpZXNPZkJ1ZmZlclZpZXdzKGdsdGZKc29uKTtcblxuICAgIGlmIChnbHRmSnNvbi5hc3NldC5leHRyYXMgPT09IHZvaWQgMCkge1xuICAgICAgZ2x0Zkpzb24uYXNzZXQuZXh0cmFzID0ge307XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIF9sb2FkRGVwZW5kZW5jaWVzT2ZTY2VuZXMoZ2x0Zkpzb246IFJuTTIpIHtcbiAgICBmb3IgKGNvbnN0IHNjZW5lIG9mIGdsdGZKc29uLnNjZW5lcykge1xuICAgICAgaWYgKElzLnVuZGVmaW5lZChzY2VuZS5ub2Rlc09iamVjdHMpKSB7XG4gICAgICAgIHNjZW5lLm5vZGVzT2JqZWN0cyA9IFtdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBpIG9mIHNjZW5lLm5vZGVzISkge1xuICAgICAgICBzY2VuZS5ub2Rlc09iamVjdHMhW2ldID0gZ2x0Zkpzb24ubm9kZXNbc2NlbmUubm9kZXMhW2ldXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX2xvYWREZXBlbmRlbmNpZXNPZk5vZGVzKGdsdGZKc29uOiBSbk0yKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGdsdGZKc29uLm5vZGVzKSB7XG4gICAgICAvLyBIaWVyYXJjaHlcbiAgICAgIG5vZGUuY2hpbGRyZW5PYmplY3RzID0gbm9kZS5jaGlsZHJlbk9iamVjdHMgPz8gW107XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIG5vZGUuY2hpbGRyZW5PYmplY3RzIVtpXSA9IGdsdGZKc29uLm5vZGVzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lc2hcbiAgICAgIGlmIChub2RlLm1lc2ggIT09IHZvaWQgMCAmJiBnbHRmSnNvbi5tZXNoZXMgIT09IHZvaWQgMCkge1xuICAgICAgICBub2RlLm1lc2hPYmplY3QgPSBnbHRmSnNvbi5tZXNoZXNbbm9kZS5tZXNoIV07XG4gICAgICB9XG5cbiAgICAgIC8vIFNraW5cbiAgICAgIGlmIChub2RlLnNraW4gIT09IHZvaWQgMCAmJiBnbHRmSnNvbi5za2lucyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIG5vZGUuc2tpbk9iamVjdCA9IGdsdGZKc29uLnNraW5zW25vZGUuc2tpbl07XG4gICAgICAgIGlmIChJcy5leGlzdChub2RlLnNraW5PYmplY3QpKSB7XG4gICAgICAgICAgaWYgKElzLm5vdC5leGlzdChub2RlLm1lc2hPYmplY3Q/LmV4dHJhcykpIHtcbiAgICAgICAgICAgIG5vZGUubWVzaE9iamVjdCEuZXh0cmFzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9kZS5tZXNoT2JqZWN0IS5leHRyYXMuX3NraW4gPSBub2RlLnNraW47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2FtZXJhXG4gICAgICBpZiAobm9kZS5jYW1lcmEgIT09IHZvaWQgMCAmJiBnbHRmSnNvbi5jYW1lcmFzICE9PSB2b2lkIDApIHtcbiAgICAgICAgbm9kZS5jYW1lcmFPYmplY3QgPSBnbHRmSnNvbi5jYW1lcmFzW25vZGUuY2FtZXJhXTtcbiAgICAgIH1cblxuICAgICAgLy8gTGlnaHRzXG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUuZXh0ZW5zaW9ucyAhPT0gdm9pZCAwICYmXG4gICAgICAgIGdsdGZKc29uLmV4dGVuc2lvbnMgIT09IHZvaWQgMCAmJlxuICAgICAgICBnbHRmSnNvbi5leHRlbnNpb25zLktIUl9saWdodHNfcHVuY3R1YWwgIT09IHZvaWQgMFxuICAgICAgKSB7XG4gICAgICAgIG5vZGUuZXh0ZW5zaW9ucy5LSFJfbGlnaHRzX3B1bmN0dWFsLmxpZ2h0SW5kZXggPSBub2RlLmV4dGVuc2lvbnMuS0hSX2xpZ2h0c19wdW5jdHVhbC5saWdodDtcbiAgICAgICAgbm9kZS5leHRlbnNpb25zLktIUl9saWdodHNfcHVuY3R1YWwubGlnaHQgPVxuICAgICAgICAgIGdsdGZKc29uLmV4dGVuc2lvbnMuS0hSX2xpZ2h0c19wdW5jdHVhbC5saWdodHNbXG4gICAgICAgICAgICBub2RlLmV4dGVuc2lvbnMuS0hSX2xpZ2h0c19wdW5jdHVhbC5saWdodEluZGV4XG4gICAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX2xvYWREZXBlbmRlbmNpZXNPZk1lc2hlcyhnbHRmSnNvbjogUm5NMikge1xuICAgIC8vIE1lc2hcbiAgICBpZiAoSXMubm90LmV4aXN0KGdsdGZKc29uLm1lc2hlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZXNoIG9mIGdsdGZKc29uLm1lc2hlcykge1xuICAgICAgZm9yIChjb25zdCBwcmltaXRpdmUgb2YgbWVzaC5wcmltaXRpdmVzKSB7XG4gICAgICAgIGlmIChwcmltaXRpdmUubWF0ZXJpYWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHByaW1pdGl2ZS5tYXRlcmlhbE9iamVjdCA9IGdsdGZKc29uLm1hdGVyaWFsc1twcmltaXRpdmUubWF0ZXJpYWxdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaW1pdGl2ZS5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX3ZhcmlhbnRzICE9IG51bGwpIHtcbiAgICAgICAgICBwcmltaXRpdmUubWF0ZXJpYWxWYXJpYW50cyA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1hcHBpbmdzID0gcHJpbWl0aXZlLmV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc192YXJpYW50cy5tYXBwaW5ncztcbiAgICAgICAgICBjb25zdCB2YXJpYW50TmFtZXMgPSBnbHRmSnNvbi5leHRlbnNpb25zLktIUl9tYXRlcmlhbHNfdmFyaWFudHMudmFyaWFudHM7XG4gICAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIG1hcHBpbmdzKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYW50cyA9IG1hcHBpbmcudmFyaWFudHMubWFwKCh2YXJpYW50SWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnROYW1lc1t2YXJpYW50SWR4XS5uYW1lO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsVmFyaWFudCA9IHtcbiAgICAgICAgICAgICAgbWF0ZXJpYWxPYmplY3Q6IGdsdGZKc29uLm1hdGVyaWFsc1ttYXBwaW5nLm1hdGVyaWFsXSxcbiAgICAgICAgICAgICAgbWF0ZXJpYWw6IG1hcHBpbmcubWF0ZXJpYWwsXG4gICAgICAgICAgICAgIHZhcmlhbnRzOiB2YXJpYW50cyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHByaW1pdGl2ZS5tYXRlcmlhbFZhcmlhbnRzLnB1c2gobWF0ZXJpYWxWYXJpYW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcmltaXRpdmUuYXR0cmlidXRlc09iamVjdHMgPSB7fSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBbczogc3RyaW5nXTogUm5NMkFjY2Vzc29yO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gcHJpbWl0aXZlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NvcklkID0gcHJpbWl0aXZlLmF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07XG4gICAgICAgICAgY29uc3QgYWNjZXNzb3IgPSBnbHRmSnNvbi5hY2Nlc3NvcnNbYWNjZXNzb3JJZCFdO1xuICAgICAgICAgIGFjY2Vzc29yLmV4dHJhcyA9IHtcbiAgICAgICAgICAgIHRvR2V0QXNUeXBlZEFycmF5OiB0cnVlLFxuICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHByaW1pdGl2ZS5hdHRyaWJ1dGVzT2JqZWN0c1thdHRyaWJ1dGVOYW1lXSA9IGFjY2Vzc29yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaW1pdGl2ZS5pbmRpY2VzICE9IG51bGwpIHtcbiAgICAgICAgICBwcmltaXRpdmUuaW5kaWNlc09iamVjdCA9IGdsdGZKc29uLmFjY2Vzc29yc1twcmltaXRpdmUuaW5kaWNlc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJpbWl0aXZlLnRhcmdldHMgIT0gbnVsbCkge1xuICAgICAgICAgIHByaW1pdGl2ZS50YXJnZXRzT2JqZWN0cyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByaW1pdGl2ZS50YXJnZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge30gYXMgdW5rbm93biBhcyB7IFtzOiBzdHJpbmddOiBSbk0yQWNjZXNzb3IgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0U2hhcGVUYXJnZXRBY2Nlc3NvcklkID0gdGFyZ2V0W2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICAgICAgICBpZiAodGFyZ2V0U2hhcGVUYXJnZXRBY2Nlc3NvcklkID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NvciA9IGdsdGZKc29uLmFjY2Vzc29yc1t0YXJnZXRTaGFwZVRhcmdldEFjY2Vzc29ySWRdO1xuICAgICAgICAgICAgICAgIGFjY2Vzc29yLmV4dHJhcyA9IHtcbiAgICAgICAgICAgICAgICAgIHRvR2V0QXNUeXBlZEFycmF5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhY2Nlc3NvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJpbWl0aXZlLnRhcmdldHNPYmplY3RzLnB1c2goYXR0cmlidXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NoZWNrUm5HbHRmTG9hZGVyT3B0aW9uc0V4aXN0KGdsdGZNb2RlbDogUm5NMikge1xuICAgIGlmIChnbHRmTW9kZWwuYXNzZXQuZXh0cmFzICYmIGdsdGZNb2RlbC5hc3NldC5leHRyYXMucm5Mb2FkZXJPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfbG9hZERlcGVuZGVuY2llc09mTWF0ZXJpYWxzKGdsdGZKc29uOiBSbk0yKSB7XG4gICAgaWYgKCFnbHRmSnNvbi50ZXh0dXJlcykgZ2x0Zkpzb24udGV4dHVyZXMgPSBbXTtcblxuICAgIC8vIE1hdGVyaWFsXG4gICAgaWYgKGdsdGZKc29uLm1hdGVyaWFscykge1xuICAgICAgZm9yIChjb25zdCBtYXRlcmlhbCBvZiBnbHRmSnNvbi5tYXRlcmlhbHMpIHtcbiAgICAgICAgaWYgKG1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzKSB7XG4gICAgICAgICAgY29uc3QgYmFzZUNvbG9yVGV4dHVyZSA9IG1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzLmJhc2VDb2xvclRleHR1cmU7XG4gICAgICAgICAgaWYgKGJhc2VDb2xvclRleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgYmFzZUNvbG9yVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbYmFzZUNvbG9yVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZSA9IG1hdGVyaWFsLnBick1ldGFsbGljUm91Z2huZXNzLm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTtcbiAgICAgICAgICBpZiAobWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLmluZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3JtYWxUZXh0dXJlID0gbWF0ZXJpYWwubm9ybWFsVGV4dHVyZTtcbiAgICAgICAgaWYgKG5vcm1hbFRleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgIG5vcm1hbFRleHR1cmUudGV4dHVyZSA9IGdsdGZKc29uLnRleHR1cmVzW25vcm1hbFRleHR1cmUuaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2NjbHVzaW9uVGV4dHVyZSA9IG1hdGVyaWFsLm9jY2x1c2lvblRleHR1cmU7XG4gICAgICAgIGlmIChvY2NsdXNpb25UZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBvY2NsdXNpb25UZXh0dXJlLnRleHR1cmUgPSBnbHRmSnNvbi50ZXh0dXJlc1tvY2NsdXNpb25UZXh0dXJlLmluZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVtaXNzaXZlVGV4dHVyZSA9IG1hdGVyaWFsLmVtaXNzaXZlVGV4dHVyZTtcbiAgICAgICAgaWYgKGVtaXNzaXZlVGV4dHVyZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgZW1pc3NpdmVUZXh0dXJlLnRleHR1cmUgPSBnbHRmSnNvbi50ZXh0dXJlc1tlbWlzc2l2ZVRleHR1cmUuaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX2NoZWNrUm5HbHRmTG9hZGVyT3B0aW9uc0V4aXN0KGdsdGZKc29uKSAmJlxuICAgICAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyEucm5Mb2FkZXJPcHRpb25zIS5sb2FkZXJFeHRlbnNpb24gJiZcbiAgICAgICAgICBnbHRmSnNvbi5hc3NldC5leHRyYXMhLnJuTG9hZGVyT3B0aW9ucyEubG9hZGVyRXh0ZW5zaW9uLnNldFRleHR1cmVzXG4gICAgICAgICkge1xuICAgICAgICAgIGdsdGZKc29uLmFzc2V0LmV4dHJhcyEucm5Mb2FkZXJPcHRpb25zIS5sb2FkZXJFeHRlbnNpb24uc2V0VGV4dHVyZXMoZ2x0Zkpzb24sIG1hdGVyaWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChJcy5leGlzdChtYXRlcmlhbC5leHRlbnNpb25zKSkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBtYXRlcmlhbC5leHRlbnNpb25zO1xuICAgICAgICAgIGlmIChJcy5leGlzdChleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfY2xlYXJjb2F0KSkge1xuICAgICAgICAgICAgY29uc3QgY2xlYXJjb2F0VGV4dHVyZSA9IGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc19jbGVhcmNvYXQuY2xlYXJjb2F0VGV4dHVyZTtcbiAgICAgICAgICAgIGlmIChjbGVhcmNvYXRUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY2xlYXJjb2F0VGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbY2xlYXJjb2F0VGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlID1cbiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5LSFJfbWF0ZXJpYWxzX2NsZWFyY29hdC5jbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlO1xuICAgICAgICAgICAgaWYgKGNsZWFyY29hdFJvdWdobmVzc1RleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlLnRleHR1cmUgPVxuICAgICAgICAgICAgICAgIGdsdGZKc29uLnRleHR1cmVzW2NsZWFyY29hdFJvdWdobmVzc1RleHR1cmUuaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZSA9XG4gICAgICAgICAgICAgIGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc19jbGVhcmNvYXQuY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZTtcbiAgICAgICAgICAgIGlmIChjbGVhcmNvYXROb3JtYWxUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChJcy5leGlzdChleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uKSkge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNtaXNzaW9uVGV4dHVyZSA9IGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc190cmFuc21pc3Npb24udHJhbnNtaXNzaW9uVGV4dHVyZTtcbiAgICAgICAgICAgIGlmICh0cmFuc21pc3Npb25UZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgdHJhbnNtaXNzaW9uVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbdHJhbnNtaXNzaW9uVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChJcy5leGlzdChleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfdm9sdW1lKSkge1xuICAgICAgICAgICAgY29uc3QgdGhpY2tuZXNzVGV4dHVyZSA9IGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc192b2x1bWUudGhpY2tuZXNzVGV4dHVyZTtcbiAgICAgICAgICAgIGlmICh0aGlja25lc3NUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgdGhpY2tuZXNzVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbdGhpY2tuZXNzVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChJcy5leGlzdChleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfc2hlZW4pKSB7XG4gICAgICAgICAgICBjb25zdCBzaGVlbkNvbG9yVGV4dHVyZSA9IGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc19zaGVlbi5zaGVlbkNvbG9yVGV4dHVyZTtcbiAgICAgICAgICAgIGlmIChzaGVlbkNvbG9yVGV4dHVyZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHNoZWVuQ29sb3JUZXh0dXJlLnRleHR1cmUgPSBnbHRmSnNvbi50ZXh0dXJlc1tzaGVlbkNvbG9yVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaGVlblJvdWdobmVzc1RleHR1cmUgPSBleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfc2hlZW4uc2hlZW5Sb3VnaG5lc3NUZXh0dXJlO1xuICAgICAgICAgICAgaWYgKHNoZWVuUm91Z2huZXNzVGV4dHVyZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHNoZWVuUm91Z2huZXNzVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbc2hlZW5Sb3VnaG5lc3NUZXh0dXJlLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKElzLmV4aXN0KGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc19zcGVjdWxhcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwZWN1bGFyVGV4dHVyZSA9IGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc19zcGVjdWxhci5zcGVjdWxhclRleHR1cmU7XG4gICAgICAgICAgICBpZiAoc3BlY3VsYXJUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgc3BlY3VsYXJUZXh0dXJlLnRleHR1cmUgPSBnbHRmSnNvbi50ZXh0dXJlc1tzcGVjdWxhclRleHR1cmUuaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3BlY3VsYXJDb2xvclRleHR1cmUgPSBleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfc3BlY3VsYXIuc3BlY3VsYXJDb2xvclRleHR1cmU7XG4gICAgICAgICAgICBpZiAoc3BlY3VsYXJDb2xvclRleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBzcGVjdWxhckNvbG9yVGV4dHVyZS50ZXh0dXJlID0gZ2x0Zkpzb24udGV4dHVyZXNbc3BlY3VsYXJDb2xvclRleHR1cmUuaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoSXMuZXhpc3QoZXh0ZW5zaW9ucy5LSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlKSkge1xuICAgICAgICAgICAgY29uc3QgaXJpZGVzY2VuY2VUZXh0dXJlID0gZXh0ZW5zaW9ucy5LSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlLmlyaWRlc2NlbmNlVGV4dHVyZTtcbiAgICAgICAgICAgIGlmIChpcmlkZXNjZW5jZVRleHR1cmUgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBpcmlkZXNjZW5jZVRleHR1cmUudGV4dHVyZSA9IGdsdGZKc29uLnRleHR1cmVzW2lyaWRlc2NlbmNlVGV4dHVyZS5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUgPVxuICAgICAgICAgICAgICBleHRlbnNpb25zLktIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UuaXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlO1xuICAgICAgICAgICAgaWYgKGlyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZS50ZXh0dXJlID1cbiAgICAgICAgICAgICAgICBnbHRmSnNvbi50ZXh0dXJlc1tpcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUuaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoSXMuZXhpc3QoZXh0ZW5zaW9ucy5LSFJfbWF0ZXJpYWxzX2FuaXNvdHJvcHkpKSB7XG4gICAgICAgICAgICBjb25zdCBhbmlzb3Ryb3B5VGV4dHVyZSA9IGV4dGVuc2lvbnMuS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5LmFuaXNvdHJvcHlUZXh0dXJlO1xuICAgICAgICAgICAgaWYgKGFuaXNvdHJvcHlUZXh0dXJlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgYW5pc290cm9weVRleHR1cmUudGV4dHVyZSA9IGdsdGZKc29uLnRleHR1cmVzW2FuaXNvdHJvcHlUZXh0dXJlLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX2xvYWREZXBlbmRlbmNpZXNPZlRleHR1cmVzKGdsdGZKc29uOiBSbk0yKSB7XG4gICAgLy8gVGV4dHVyZVxuICAgIGlmIChnbHRmSnNvbi50ZXh0dXJlcykge1xuICAgICAgZm9yIChjb25zdCB0ZXh0dXJlIG9mIGdsdGZKc29uLnRleHR1cmVzKSB7XG4gICAgICAgIGlmRGVmaW5lZFRoZW4oKHYpID0+ICh0ZXh0dXJlLnNhbXBsZXJPYmplY3QgPSBnbHRmSnNvbi5zYW1wbGVyc1t2XSksIHRleHR1cmUuc2FtcGxlcik7XG5cbiAgICAgICAgaWYgKHRleHR1cmUuZXh0ZW5zaW9ucz8uS0hSX3RleHR1cmVfYmFzaXN1Py5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIHRleHR1cmUuZXh0ZW5zaW9ucy5LSFJfdGV4dHVyZV9iYXNpc3UuZmFsbGJhY2tTb3VyY2VJbmRleCA9IHRleHR1cmUuc291cmNlO1xuICAgICAgICAgIHRleHR1cmUuc291cmNlID0gdGV4dHVyZS5leHRlbnNpb25zLktIUl90ZXh0dXJlX2Jhc2lzdS5zb3VyY2UgYXMgbnVtYmVyO1xuICAgICAgICAgIHRleHR1cmUuaW1hZ2UgPSBnbHRmSnNvbi5pbWFnZXNbdGV4dHVyZS5zb3VyY2VdO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHR1cmUuc291cmNlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB0ZXh0dXJlLmltYWdlID0gZ2x0Zkpzb24uaW1hZ2VzW3RleHR1cmUuc291cmNlIV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX2xvYWREZXBlbmRlbmNpZXNPZkpvaW50cyhnbHRmSnNvbjogUm5NMikge1xuICAgIGlmIChnbHRmSnNvbi5za2lucykge1xuICAgICAgZm9yIChjb25zdCBza2luIG9mIGdsdGZKc29uLnNraW5zKSB7XG4gICAgICAgIHNraW4uc2tlbGV0b25PYmplY3QgPSBnbHRmSnNvbi5ub2Rlc1tza2luLnNrZWxldG9uIV07XG5cbiAgICAgICAgc2tpbi5pbnZlcnNlQmluZE1hdHJpY2VzT2JqZWN0ID0gZ2x0Zkpzb24uYWNjZXNzb3JzW3NraW4uaW52ZXJzZUJpbmRNYXRyaWNlcyFdO1xuXG4gICAgICAgIGlmIChJcy5ub3QuZXhpc3Qoc2tpbi5za2VsZXRvbikpIHtcbiAgICAgICAgICBza2luLnNrZWxldG9uID0gc2tpbi5qb2ludHNbMF07XG4gICAgICAgICAgc2tpbi5za2VsZXRvbk9iamVjdCA9IGdsdGZKc29uLm5vZGVzW3NraW4uc2tlbGV0b25dO1xuICAgICAgICB9XG5cbiAgICAgICAgc2tpbi5qb2ludHNPYmplY3RzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgam9pbnRJbmRleCBvZiBza2luLmpvaW50cykge1xuICAgICAgICAgIHNraW4uam9pbnRzT2JqZWN0cy5wdXNoKGdsdGZKc29uLm5vZGVzW2pvaW50SW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfbG9hZERlcGVuZGVuY2llc09mQW5pbWF0aW9ucyhnbHRmSnNvbjogUm5NMikge1xuICAgIGlmIChnbHRmSnNvbi5hbmltYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGFuaW1hdGlvbiBvZiBnbHRmSnNvbi5hbmltYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBhbmltYXRpb24uY2hhbm5lbHMpIHtcbiAgICAgICAgICBpZiAoSXMuZXhpc3QoY2hhbm5lbC5zYW1wbGVyKSkge1xuICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0ID0gYW5pbWF0aW9uLnNhbXBsZXJzW2NoYW5uZWwuc2FtcGxlcl07XG4gICAgICAgICAgICBjaGFubmVsLnRhcmdldC5ub2RlT2JqZWN0ID0gZ2x0Zkpzb24ubm9kZXNbY2hhbm5lbC50YXJnZXQubm9kZSFdO1xuICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0LmlucHV0T2JqZWN0ID0gZ2x0Zkpzb24uYWNjZXNzb3JzW2NoYW5uZWwuc2FtcGxlck9iamVjdC5pbnB1dCFdO1xuICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0Lm91dHB1dE9iamVjdCA9IGdsdGZKc29uLmFjY2Vzc29yc1tjaGFubmVsLnNhbXBsZXJPYmplY3Qub3V0cHV0IV07XG4gICAgICAgICAgICBpZiAoSXMudW5kZWZpbmVkKGNoYW5uZWwuc2FtcGxlck9iamVjdC5vdXRwdXRPYmplY3QuZXh0cmFzKSkge1xuICAgICAgICAgICAgICBjaGFubmVsLnNhbXBsZXJPYmplY3Qub3V0cHV0T2JqZWN0LmV4dHJhcyA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFubmVsLnRhcmdldC5wYXRoID09PSAnd2VpZ2h0cycpIHtcbiAgICAgICAgICAgICAgbGV0IHdlaWdodHNBcnJheUxlbmd0aCA9XG4gICAgICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0Lm91dHB1dE9iamVjdC5jb3VudCAvIGNoYW5uZWwuc2FtcGxlck9iamVjdC5pbnB1dE9iamVjdC5jb3VudDtcbiAgICAgICAgICAgICAgaWYgKGNoYW5uZWwuc2FtcGxlck9iamVjdC5pbnRlcnBvbGF0aW9uID09PSAnQ1VCSUNTUExJTkUnKSB7XG4gICAgICAgICAgICAgICAgLy8gZGl2aWRlZCBieSAzLCBiZWNhdXNlIGluIGdsVEYgQ1VCSUNTUExJTkUgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgICAgICAvLyAgIHRhbmdlbnRzIChhaywgYmspIGFuZCB2YWx1ZXMgKHZrKSBhcmUgZ3JvdXBlZFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHdpdGhpbiBrZXlmcmFtZXM6IGExLGEyLOKApmFuLHYxLHYyLOKApnZuLGIxLGIyLOKApmJuXG4gICAgICAgICAgICAgICAgd2VpZ2h0c0FycmF5TGVuZ3RoID1cbiAgICAgICAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlck9iamVjdC5vdXRwdXRPYmplY3QuY291bnQgL1xuICAgICAgICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0LmlucHV0T2JqZWN0LmNvdW50IC9cbiAgICAgICAgICAgICAgICAgIDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hhbm5lbC5zYW1wbGVyT2JqZWN0Lm91dHB1dE9iamVjdC5leHRyYXMhLndlaWdodHNBcnJheUxlbmd0aCA9IHdlaWdodHNBcnJheUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFubmVsLnRhcmdldC5wYXRoID09PSAncm90YXRpb24nKSB7XG4gICAgICAgICAgICAgIGNoYW5uZWwuc2FtcGxlck9iamVjdC5vdXRwdXRPYmplY3QuZXh0cmFzIS5xdWF0ZXJuaW9uSWZWZWM0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX2xvYWREZXBlbmRlbmNpZXNPZkFjY2Vzc29ycyhnbHRmSnNvbjogUm5NMikge1xuICAgIC8vIEFjY2Vzc29yXG4gICAgZm9yIChjb25zdCBhY2Nlc3NvciBvZiBnbHRmSnNvbi5hY2Nlc3NvcnMpIHtcbiAgICAgIGlmIChhY2Nlc3Nvci5idWZmZXJWaWV3ICE9IG51bGwpIHtcbiAgICAgICAgYWNjZXNzb3IuYnVmZmVyVmlld09iamVjdCA9IGdsdGZKc29uLmJ1ZmZlclZpZXdzW2FjY2Vzc29yLmJ1ZmZlclZpZXddO1xuICAgICAgfVxuXG4gICAgICBpZiAoSXMuZXhpc3QoYWNjZXNzb3Iuc3BhcnNlKSkge1xuICAgICAgICBjb25zdCBzcGFyc2UgPSBhY2Nlc3Nvci5zcGFyc2U7XG4gICAgICAgIGlmIChJcy5leGlzdChzcGFyc2UpICYmIElzLmV4aXN0KHNwYXJzZS5pbmRpY2VzKSAmJiBJcy5leGlzdChzcGFyc2UudmFsdWVzKSkge1xuICAgICAgICAgIHNwYXJzZS5pbmRpY2VzLmJ1ZmZlclZpZXdPYmplY3QgPSBnbHRmSnNvbi5idWZmZXJWaWV3c1tzcGFyc2UuaW5kaWNlcy5idWZmZXJWaWV3XTtcbiAgICAgICAgICBzcGFyc2UudmFsdWVzLmJ1ZmZlclZpZXdPYmplY3QgPSBnbHRmSnNvbi5idWZmZXJWaWV3c1tzcGFyc2UudmFsdWVzLmJ1ZmZlclZpZXddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIF9sb2FkRGVwZW5kZW5jaWVzT2ZCdWZmZXJWaWV3cyhnbHRmSnNvbjogUm5NMikge1xuICAgIC8vIEJ1ZmZlclZpZXdcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlclZpZXcgb2YgZ2x0Zkpzb24uYnVmZmVyVmlld3MpIHtcbiAgICAgIGlmIChidWZmZXJWaWV3LmJ1ZmZlciAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGJ1ZmZlclZpZXcuYnVmZmVyT2JqZWN0ID0gZ2x0Zkpzb24uYnVmZmVyc1tidWZmZXJWaWV3LmJ1ZmZlciFdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfbWVyZ2VFeHRlbmRlZEpzb24oZ2x0Zkpzb246IFJuTTIsIGV4dGVuZGVkRGF0YTogQXJyYXlCdWZmZXIgfCBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICBsZXQgZXh0ZW5kZWRKc29uID0gbnVsbDtcbiAgICBpZiAoZXh0ZW5kZWREYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGNvbnN0IGV4dGVuZGVkSnNvblN0ciA9IERhdGFVdGlsLmFycmF5QnVmZmVyVG9TdHJpbmcoZXh0ZW5kZWREYXRhKTtcbiAgICAgIGV4dGVuZGVkSnNvbiA9IEpTT04ucGFyc2UoZXh0ZW5kZWRKc29uU3RyKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHRlbmRlZERhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBleHRlbmRlZEpzb24gPSBKU09OLnBhcnNlKGV4dGVuZGVkRGF0YSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXh0ZW5kZWREYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgZXh0ZW5kZWRKc29uID0gZXh0ZW5kZWREYXRhO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oZ2x0Zkpzb24sIGV4dGVuZGVkSnNvbik7XG4gIH1cblxuICBzdGF0aWMgX2xvYWRSZXNvdXJjZXMoXG4gICAgdWludDhBcnJheU9mR2xiOiBVaW50OEFycmF5LFxuICAgIGdsdGZKc29uOiBSbk0yLFxuICAgIGZpbGVzOiBHbHRmRmlsZUJ1ZmZlcnMsXG4gICAgb3B0aW9uczogR2x0ZkxvYWRPcHRpb24sXG4gICAgYmFzZVBhdGg/OiBzdHJpbmcsXG4gICAgY2FsbGJhY2s/OiBSblByb21pc2VDYWxsYmFja1xuICApIHtcbiAgICBjb25zdCBwcm9taXNlc1RvTG9hZFJlc291cmNlczogUm5Qcm9taXNlPEFycmF5QnVmZmVyIHwgUm5NMkltYWdlPltdID0gW107XG5cbiAgICAvLyBCdWZmZXJzIEFzeW5jIGxvYWRcbiAgICBsZXQgcm5wQXJyYXlCdWZmZXI6IFJuUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAgZm9yIChjb25zdCBybm0yQnVmZmVyIG9mIGdsdGZKc29uLmJ1ZmZlcnMpIHtcbiAgICAgIGxldCBmaWxlbmFtZSA9ICcnO1xuICAgICAgaWYgKHJubTJCdWZmZXIudXJpKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0VXJpID0gcm5tMkJ1ZmZlci51cmkuc3BsaXQoJy8nKTtcbiAgICAgICAgZmlsZW5hbWUgPSBzcGxpdFVyaVtzcGxpdFVyaS5sZW5ndGggLSAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBybm0yQnVmZmVyLnVyaSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcm5wQXJyYXlCdWZmZXIgPSBuZXcgUm5Qcm9taXNlPEFycmF5QnVmZmVyPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHJubTJCdWZmZXIuYnVmZmVyID0gdWludDhBcnJheU9mR2xiO1xuICAgICAgICAgIHJlc29sdmUodWludDhBcnJheU9mR2xiKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJubTJCdWZmZXIudXJpLm1hdGNoKC9eZGF0YTphcHBsaWNhdGlvblxcLyguKik7YmFzZTY0LC8pKSB7XG4gICAgICAgIHJucEFycmF5QnVmZmVyID0gbmV3IFJuUHJvbWlzZTxBcnJheUJ1ZmZlcj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IERhdGFVdGlsLmRhdGFVcmlUb0FycmF5QnVmZmVyKHJubTJCdWZmZXIudXJpISk7XG4gICAgICAgICAgcm5tMkJ1ZmZlci5idWZmZXIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgcmVzb2x2ZShhcnJheUJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChmaWxlcyAmJiB0aGlzLl9fY29udGFpbnNGaWxlTmFtZShmaWxlcywgZmlsZW5hbWUpKSB7XG4gICAgICAgIHJucEFycmF5QnVmZmVyID0gbmV3IFJuUHJvbWlzZTxBcnJheUJ1ZmZlcj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMuX19nZXRGdWxsUGF0aE9mRmlsZU5hbWUoZmlsZXMsIGZpbGVuYW1lKTtcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGZpbGVzW2Z1bGxQYXRoIV07XG4gICAgICAgICAgcm5tMkJ1ZmZlci5idWZmZXIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgcmVzb2x2ZShhcnJheUJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm5wQXJyYXlCdWZmZXIgPSBuZXcgUm5Qcm9taXNlPEFycmF5QnVmZmVyPihcbiAgICAgICAgICBEYXRhVXRpbC5sb2FkUmVzb3VyY2VBc3luYyhcbiAgICAgICAgICAgIGJhc2VQYXRoICsgcm5tMkJ1ZmZlci51cmksXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKHJlc29sdmU6IEZ1bmN0aW9uLCByZXNwb25zZTogQXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgcm5tMkJ1ZmZlci5idWZmZXIgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChyZWplY3Q6IEZ1bmN0aW9uLCBlcnJvcjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdCgnSFRUUCBFcnJvciBTdGF0dXM6JyArIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBybm0yQnVmZmVyLmJ1ZmZlclByb21pc2UgPSBybnBBcnJheUJ1ZmZlcjtcbiAgICAgIHByb21pc2VzVG9Mb2FkUmVzb3VyY2VzLnB1c2gocm5wQXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIC8vIFRleHR1cmVzIEFzeW5jIGxvYWRcbiAgICBmb3IgKGNvbnN0IHJubTJJbWFnZSBvZiBnbHRmSnNvbi5pbWFnZXMgPz8gW10pIHtcbiAgICAgIGlmIChybm0ySW1hZ2UudXJpID09IG51bGwpIHtcbiAgICAgICAgaWYgKElzLmV4aXN0KHVpbnQ4QXJyYXlPZkdsYikpIHtcbiAgICAgICAgICAvLyBHbGJcbiAgICAgICAgICAvLyBMb2FkIFRleHR1cmUgZnJvbSBnbHRmSnNvbi5idWZmZXJcbiAgICAgICAgICBjb25zdCBpbWFnZVVpbnQ4QXJyYXkgPSBEYXRhVXRpbC5jcmVhdGVVaW50OEFycmF5RnJvbUJ1ZmZlclZpZXdJbmZvKFxuICAgICAgICAgICAgZ2x0Zkpzb24sXG4gICAgICAgICAgICBybm0ySW1hZ2UuYnVmZmVyVmlldyEsXG4gICAgICAgICAgICB1aW50OEFycmF5T2ZHbGJcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGltYWdlVXJpID0gRGF0YVV0aWwuY3JlYXRlQmxvYkltYWdlVXJpRnJvbVVpbnQ4QXJyYXkoXG4gICAgICAgICAgICBpbWFnZVVpbnQ4QXJyYXksXG4gICAgICAgICAgICBybm0ySW1hZ2UubWltZVR5cGUhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9taXNlc1RvTG9hZFJlc291cmNlcy5wdXNoKHRoaXMuX19sb2FkSW1hZ2VVcmkoaW1hZ2VVcmksIHJubTJJbWFnZSwgZmlsZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBnbFRGK2JpblxuICAgICAgICAgIC8vIExvYWQgVGV4dHVyZSBmcm9tIGdsdGZKc29uLmJ1ZmZlclxuICAgICAgICAgIGNvbnN0IHJubTJCdWZmZXJWaWV3ID0gZ2x0Zkpzb24uYnVmZmVyVmlld3Nbcm5tMkltYWdlLmJ1ZmZlclZpZXchXTtcbiAgICAgICAgICBjb25zdCBidWZmZXJJbmZvID0gcm5tMkJ1ZmZlclZpZXcuYnVmZmVyT2JqZWN0O1xuICAgICAgICAgIGlmIChJcy5ub3QuZXhpc3QoYnVmZmVySW5mbykpIHtcbiAgICAgICAgICAgIExvZ2dlci5lcnJvcignZ2x0ZjJCdWZmZXJWaWV3LmJ1ZmZlck9iamVjdCBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJ1ZmZlclByb21pc2UgPSBidWZmZXJJbmZvLmJ1ZmZlclByb21pc2UgYXMgUm5Qcm9taXNlPEFycmF5QnVmZmVyPjtcblxuICAgICAgICAgIGNvbnN0IGxvYWRJbWFnZUFmdGVyTG9hZGluZ0J1ZmZlciA9IG5ldyBSblByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGJ1ZmZlclByb21pc2UudGhlbigoYXJyYXlidWZmZXI6IEFycmF5QnVmZmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlVWludDhBcnJheSA9IERhdGFVdGlsLmNyZWF0ZVVpbnQ4QXJyYXlGcm9tQnVmZmVyVmlld0luZm8oXG4gICAgICAgICAgICAgICAgZ2x0Zkpzb24sXG4gICAgICAgICAgICAgICAgcm5tMkltYWdlLmJ1ZmZlclZpZXchLFxuICAgICAgICAgICAgICAgIGFycmF5YnVmZmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlVXJpID0gRGF0YVV0aWwuY3JlYXRlQmxvYkltYWdlVXJpRnJvbVVpbnQ4QXJyYXkoXG4gICAgICAgICAgICAgICAgaW1hZ2VVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgIHJubTJJbWFnZS5taW1lVHlwZSFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5fX2xvYWRJbWFnZVVyaShpbWFnZVVyaSwgcm5tMkltYWdlLCBmaWxlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkgYXMgUm5Qcm9taXNlPEFycmF5QnVmZmVyPjtcblxuICAgICAgICAgIGNvbnN0IGJ1ZmZlclByb21pc2VJbmRleDogbnVtYmVyID0gcHJvbWlzZXNUb0xvYWRSZXNvdXJjZXMuaW5kZXhPZihidWZmZXJQcm9taXNlKTtcbiAgICAgICAgICBwcm9taXNlc1RvTG9hZFJlc291cmNlc1tidWZmZXJQcm9taXNlSW5kZXhdID0gbG9hZEltYWdlQWZ0ZXJMb2FkaW5nQnVmZmVyO1xuICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyUHJvbWlzZSA9IGxvYWRJbWFnZUFmdGVyTG9hZGluZ0J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTG9hZCBUZXh0dXJlIGZyb20gVVJJXG4gICAgICAgIGNvbnN0IGltYWdlRmlsZVN0ciA9IHJubTJJbWFnZS51cmk7XG4gICAgICAgIGNvbnN0IHNwbGl0VXJpID0gaW1hZ2VGaWxlU3RyLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gc3BsaXRVcmlbc3BsaXRVcmkubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGV0IGltYWdlVXJpO1xuICAgICAgICBpZiAoZmlsZXMgJiYgdGhpcy5fX2NvbnRhaW5zRmlsZU5hbWUoZmlsZXMsIGZpbGVuYW1lKSkge1xuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5fX2dldEZ1bGxQYXRoT2ZGaWxlTmFtZShmaWxlcywgZmlsZW5hbWUpO1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gZmlsZXNbZnVsbFBhdGghXTtcbiAgICAgICAgICBpbWFnZVVyaSA9IERhdGFVdGlsLmNyZWF0ZUJsb2JJbWFnZVVyaUZyb21VaW50OEFycmF5KFxuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpLFxuICAgICAgICAgICAgcm5tMkltYWdlLm1pbWVUeXBlIVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VGaWxlU3RyLm1hdGNoKC9eZGF0YTovKSkge1xuICAgICAgICAgIGltYWdlVXJpID0gaW1hZ2VGaWxlU3RyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltYWdlVXJpID0gYmFzZVBhdGggKyBpbWFnZUZpbGVTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlc1RvTG9hZFJlc291cmNlcy5wdXNoKHRoaXMuX19sb2FkSW1hZ2VVcmkoaW1hZ2VVcmksIHJubTJJbWFnZSwgZmlsZXMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUm5Qcm9taXNlLmFsbChwcm9taXNlc1RvTG9hZFJlc291cmNlcywgY2FsbGJhY2spLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgTG9nZ2VyLmVycm9yKCdQcm9taXNlLmFsbCBlcnJvcjogJyArIGVycik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2NvbnRhaW5zRmlsZU5hbWUob3B0aW9uc0ZpbGVzOiB7IFtzOiBzdHJpbmddOiBBcnJheUJ1ZmZlciB9LCBmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9uc0ZpbGVzKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IGtleS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgbGFzdCA9IHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3QgPT09IGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0RnVsbFBhdGhPZkZpbGVOYW1lKFxuICAgIG9wdGlvbnNGaWxlczogeyBbczogc3RyaW5nXTogQXJyYXlCdWZmZXIgfSxcbiAgICBmaWxlbmFtZTogc3RyaW5nXG4gICkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnNGaWxlcykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBrZXkuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IGxhc3QgPSBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0ID09PSBmaWxlbmFtZSkge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2xvYWRJbWFnZVVyaShcbiAgICBpbWFnZVVyaTogc3RyaW5nLFxuICAgIGltYWdlSnNvbjogUm5NMkltYWdlLFxuICAgIGZpbGVzOiBHbHRmRmlsZUJ1ZmZlcnNcbiAgKTogUm5Qcm9taXNlPFJuTTJJbWFnZT4ge1xuICAgIGxldCBsb2FkSW1hZ2VQcm9taXNlOiBSblByb21pc2U8Um5NMkltYWdlPjtcbiAgICBpZiAoaW1hZ2VVcmkubWF0Y2goL2Jhc2lzJC8pKSB7XG4gICAgICAvLyBsb2FkIGJhc2lzIGZpbGUgZnJvbSB1cmlcbiAgICAgIGxvYWRJbWFnZVByb21pc2UgPSBuZXcgUm5Qcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGZldGNoKGltYWdlVXJpLCB7IG1vZGU6ICdjb3JzJyB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlLmFycmF5QnVmZmVyKCkudGhlbigoYnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICAgIGltYWdlSnNvbi5iYXNpcyA9IHVpbnQ4QXJyYXk7XG4gICAgICAgICAgICByZXNvbHZlKGltYWdlSnNvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbWFnZUpzb24udXJpPy5tYXRjaCgvYmFzaXMkLykpIHtcbiAgICAgIC8vIGZpbmQgYmFzaXMgZmlsZSBmcm9tIGZpbGVzIG9wdGlvblxuICAgICAgbG9hZEltYWdlUHJvbWlzZSA9IG5ldyBSblByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgaW1hZ2VKc29uLmJhc2lzID0gbmV3IFVpbnQ4QXJyYXkoZmlsZXNbaW1hZ2VKc29uLnVyaSFdKTtcbiAgICAgICAgcmVzb2x2ZShpbWFnZUpzb24pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGltYWdlVXJpLm1hdGNoKC9cXC5rdHgyJC8pIHx8XG4gICAgICBpbWFnZVVyaS5tYXRjaCgvXmRhdGE6aW1hZ2VcXC9rdHgyLykgfHxcbiAgICAgIChpbWFnZUpzb24uYnVmZmVyVmlldyAhPSBudWxsICYmIGltYWdlSnNvbi5taW1lVHlwZSA9PT0gJ2ltYWdlL2t0eDInKVxuICAgICkge1xuICAgICAgLy8gbG9hZCBrdHgyIGZpbGUgZnJvbSB1cmkoa3R4MiBmaWxlIG9yIGRhdGEgdXJpKSBvciBidWZmZXJWaWV3XG4gICAgICBsb2FkSW1hZ2VQcm9taXNlID0gbmV3IFJuUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBmZXRjaChpbWFnZVVyaSwgeyBtb2RlOiAnY29ycycgfSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICByZXNwb25zZS5hcnJheUJ1ZmZlcigpLnRoZW4oKGJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICBpbWFnZUpzb24ua3R4MiA9IHVpbnQ4QXJyYXk7XG4gICAgICAgICAgICByZXNvbHZlKGltYWdlSnNvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbWFnZUpzb24udXJpPy5tYXRjaCgva3R4MiQvKSkge1xuICAgICAgLy8gZmluZCBrdHgyIGZpbGUgZnJvbSBmaWxlcyBvcHRpb25cbiAgICAgIGxvYWRJbWFnZVByb21pc2UgPSBuZXcgUm5Qcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGltYWdlSnNvbi5rdHgyID0gbmV3IFVpbnQ4QXJyYXkoZmlsZXNbaW1hZ2VKc29uLnVyaSFdKTtcbiAgICAgICAgcmVzb2x2ZShpbWFnZUpzb24pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRJbWFnZVByb21pc2UgPSBEYXRhVXRpbC5jcmVhdGVJbWFnZUZyb21VcmkoaW1hZ2VVcmksIGltYWdlSnNvbi5taW1lVHlwZSEpLnRoZW4oXG4gICAgICAgIChpbWFnZSkgPT4ge1xuICAgICAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICAgICAgaW1hZ2VKc29uLmltYWdlID0gaW1hZ2U7XG4gICAgICAgICAgcmV0dXJuIGltYWdlSnNvbjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9hZEltYWdlUHJvbWlzZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGV0ZWN0Rm9ybWF0QnlBcnJheUJ1ZmZlcnMgfSBmcm9tICcuL0Zvcm1hdERldGVjdG9yJztcbmltcG9ydCB7IEdsdGYySW1wb3J0ZXIgfSBmcm9tICcuL0dsdGYySW1wb3J0ZXInO1xuaW1wb3J0IHsgUm5NMiB9IGZyb20gJy4uLy4uL3R5cGVzL1JuTTInO1xuaW1wb3J0IHsgTW9kZWxDb252ZXJ0ZXIgfSBmcm9tICcuL01vZGVsQ29udmVydGVyJztcbmltcG9ydCB7IERyY1BvaW50Q2xvdWRJbXBvcnRlciB9IGZyb20gJy4vRHJjUG9pbnRDbG91ZEltcG9ydGVyJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9yZW5kZXJlci9FeHByZXNzaW9uJztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuLi9yZW5kZXJlci9SZW5kZXJQYXNzJztcbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSAnLi4vbWlzYy9EYXRhVXRpbCc7XG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0ZpbGVUeXBlJztcbmltcG9ydCB7IGdsVEYxIH0gZnJvbSAnLi4vLi4vdHlwZXMvZ2xURjEnO1xuaW1wb3J0IHsgR2x0ZkZpbGVCdWZmZXJzLCBHbHRmTG9hZE9wdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFJuUHJvbWlzZUNhbGxiYWNrIH0gZnJvbSAnLi4vbWlzYy9SblByb21pc2UnO1xuaW1wb3J0IHsgVnJtMHhJbXBvcnRlciB9IGZyb20gJy4vVnJtMHhJbXBvcnRlcic7XG5pbXBvcnQgeyBhc3NlcnRJc0VyciwgYXNzZXJ0SXNPaywgRXJyLCBSZXN1bHQsIE9rLCBpc09rLCBpc0VyciB9IGZyb20gJy4uL21pc2MvUmVzdWx0JztcbmltcG9ydCB7IFZybUltcG9ydGVyIH0gZnJvbSAnLi9Wcm1JbXBvcnRlcic7XG5cbi8qKlxuICogSW1wb3J0ZXIgY2xhc3Mgd2hpY2ggY2FuIGltcG9ydCBHTFRGIGFuZCBWUk0uXG4gKi9cbmV4cG9ydCBjbGFzcyBHbHRmSW1wb3J0ZXIge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogSW1wb3J0IEdMVEYgb3IgVlJNIGZpbGUuXG4gICAqIEBwYXJhbSB1cmlzIHVyaSBvciBhcnJheSBvZiB1cmkgb2YgZ2xURiBmaWxlXG4gICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgZm9yIGxvYWRpbmcgcHJvY2VzcyB3aGVyZSB0aGUgZmlsZXMgcHJvcGVydHkgaXMgaWdub3JlZFxuICAgKiBAcmV0dXJucyBnbHRmIGV4cHJlc3Npb24gd2hlcmU6XG4gICAqICAgICAgICAgICAgcmVuZGVyUGFzc2VzWzBdOiBtb2RlbCBlbnRpdGllc1xuICAgKiAgICAgICAgICAgIHJlbmRlclBhc3Nlc1sxXTogbW9kZWwgb3V0bGluZXNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbXBvcnRGcm9tVXJpKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHbHRmTG9hZE9wdGlvbixcbiAgICBjYWxsYmFjaz86IFJuUHJvbWlzZUNhbGxiYWNrXG4gICk6IFByb21pc2U8UmVzdWx0PEV4cHJlc3Npb24sIEVycjxBcnJheUJ1ZmZlciwgdW5rbm93bj4+PiB7XG4gICAgb3B0aW9ucyA9IHRoaXMuX19pbml0T3B0aW9ucyhvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlbmRlclBhc3NlcyA9IG9wdGlvbnMuZXhwcmVzc2lvbj8ucmVuZGVyUGFzc2VzIHx8IFtdO1xuICAgIGlmIChyZW5kZXJQYXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW5kZXJQYXNzZXMucHVzaChuZXcgUmVuZGVyUGFzcygpKTtcbiAgICB9XG5cbiAgICBjb25zdCByX2FycmF5QnVmZmVyID0gYXdhaXQgRGF0YVV0aWwuZmV0Y2hBcnJheUJ1ZmZlcih1cmkpO1xuICAgIGlmIChpc0VycihyX2FycmF5QnVmZmVyKSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIGZldGNoIGFycmF5IGJ1ZmZlcicsXG4gICAgICAgIGVycm9yOiByX2FycmF5QnVmZmVyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5maWxlcyFbdXJpXSA9IHJfYXJyYXlCdWZmZXIuZ2V0KCk7XG5cbiAgICBhd2FpdCB0aGlzLl9fZGV0ZWN0VGhlTW9kZWxGaWxlVHlwZUFuZEltcG9ydCh1cmksIHJlbmRlclBhc3Nlcywgb3B0aW9ucywgdXJpLCBjYWxsYmFjayk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmNhbWVyYUNvbXBvbmVudCkge1xuICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIHJlbmRlclBhc3Nlcykge1xuICAgICAgICByZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudCA9IG9wdGlvbnMuY2FtZXJhQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLl9fc2V0UmVuZGVyUGFzc2VzVG9FeHByZXNzaW9uKHJlbmRlclBhc3Nlcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBPayhleHByZXNzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgR0xURiBvciBWUk0gZnJvbSBBcnJheUJ1ZmZlcnMuXG4gICAqIEBwYXJhbSBmaWxlcyBBcnJheUJ1ZmZlcnMgb2YgZ2xURi9WUk0gZmlsZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyBmb3IgbG9hZGluZyBwcm9jZXNzIHdoZXJlIGlmIHlvdSB1c2UgZmlsZXMgb3B0aW9uLCBrZXkgbmFtZSBvZiBmaWxlcyBtdXN0IGJlIHVyaSBvZiB0aGUgdmFsdWUgYXJyYXkgYnVmZmVyXG4gICAqIEByZXR1cm5zIGdsdGYgZXhwcmVzc2lvbiB3aGVyZTpcbiAgICogICAgICAgICAgICByZW5kZXJQYXNzZXNbMF06IG1vZGVsIGVudGl0aWVzXG4gICAqICAgICAgICAgICAgcmVuZGVyUGFzc2VzWzFdOiBtb2RlbCBvdXRsaW5lc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGltcG9ydEZyb21BcnJheUJ1ZmZlcnMoXG4gICAgZmlsZXM6IEdsdGZGaWxlQnVmZmVycyxcbiAgICBvcHRpb25zPzogR2x0ZkxvYWRPcHRpb24sXG4gICAgY2FsbGJhY2s/OiBSblByb21pc2VDYWxsYmFja1xuICApOiBQcm9taXNlPFJlc3VsdDxFeHByZXNzaW9uLCBuZXZlcj4+IHtcbiAgICBvcHRpb25zID0gdGhpcy5fX2luaXRPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcmVuZGVyUGFzc2VzID0gb3B0aW9ucy5leHByZXNzaW9uPy5yZW5kZXJQYXNzZXMgfHwgW107XG4gICAgaWYgKHJlbmRlclBhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlbmRlclBhc3Nlcy5wdXNoKG5ldyBSZW5kZXJQYXNzKCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgaW4gZmlsZXMpIHtcbiAgICAgIC8vIGZpbGVuYW1lIGlzIHVyaSB3aXRoIGZpbGUgZXh0ZW5zaW9uXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gRGF0YVV0aWwuZ2V0RXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgICAgIC8vIGlmIHRoZSBmaWxlIGlzIG1haW4gZmlsZSB0eXBlP1xuICAgICAgaWYgKHRoaXMuX19pc1ZhbGlkRXh0ZW5zaW9uKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX19kZXRlY3RUaGVNb2RlbEZpbGVUeXBlQW5kSW1wb3J0KFxuICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgIHJlbmRlclBhc3NlcyxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jYW1lcmFDb21wb25lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgcmVuZGVyUGFzcyBvZiByZW5kZXJQYXNzZXMpIHtcbiAgICAgICAgcmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQgPSBvcHRpb25zLmNhbWVyYUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fX3NldFJlbmRlclBhc3Nlc1RvRXhwcmVzc2lvbihyZW5kZXJQYXNzZXMsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIG5ldyBPayhleHByZXNzaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9faW5pdE9wdGlvbnMob3B0aW9ucz86IEdsdGZMb2FkT3B0aW9uKTogR2x0ZkxvYWRPcHRpb24ge1xuICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMgPSBEYXRhVXRpbC5jcmVhdGVEZWZhdWx0R2x0Zk9wdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZmlsZXMgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zLmZpbGVzID0ge307XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBpbiBvcHRpb25zLmZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlLm1hdGNoKC8uKlxcLnZybSQvKSA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGUuc3BsaXQoJy52cm0nKVswXTtcbiAgICAgICAgaWYgKGZpbGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlidWZmZXIgPSBvcHRpb25zLmZpbGVzW2ZpbGVdO1xuICAgICAgICAgIG9wdGlvbnMuZmlsZXNbZmlsZU5hbWUgKyAnLmdsYiddID0gYXJyYXlidWZmZXI7XG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsZXNbZmlsZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5kZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgb3B0aW9ucy5kZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5ID0gW3t9XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF2b2lkIG5lZWRsZXNzIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSFbMF0uaXNNb3JwaGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvcHRpb25zLm1heE1vcnBoVGFyZ2V0TnVtYmVyID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zITtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2V0UmVuZGVyUGFzc2VzVG9FeHByZXNzaW9uKFxuICAgIHJlbmRlclBhc3NlczogUmVuZGVyUGFzc1tdLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uXG4gICkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBvcHRpb25zLmV4cHJlc3Npb24gPz8gbmV3IEV4cHJlc3Npb24oKTtcblxuICAgIGlmIChleHByZXNzaW9uLnJlbmRlclBhc3NlcyAhPT0gcmVuZGVyUGFzc2VzKSB7XG4gICAgICBleHByZXNzaW9uLmNsZWFyUmVuZGVyUGFzc2VzKCk7XG4gICAgICBleHByZXNzaW9uLmFkZFJlbmRlclBhc3NlcyhyZW5kZXJQYXNzZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19pc1ZhbGlkRXh0ZW5zaW9uKGZpbGVFeHRlbnNpb246IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIGZpbGVFeHRlbnNpb24gPT09ICdnbHRmJyB8fFxuICAgICAgZmlsZUV4dGVuc2lvbiA9PT0gJ2dsYicgfHxcbiAgICAgIGZpbGVFeHRlbnNpb24gPT09ICd2cm0nIHx8XG4gICAgICBmaWxlRXh0ZW5zaW9uID09PSAnZHJjJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2lzR2xiKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcikge1xuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCAwLCAyMCk7XG4gICAgY29uc3QgaXNMaXR0bGVFbmRpYW4gPSB0cnVlO1xuICAgIC8vIE1hZ2ljIGZpZWxkXG4gICAgY29uc3QgbWFnaWMgPSBkYXRhVmlldy5nZXRVaW50MzIoMCwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIGxldCByZXN1bHQ7XG4gICAgLy8gVGhlIDB4NDY1NDZDNjcgbWVhbnMgJ2dsVEYnIHN0cmluZyBpbiBnbGIgZmlsZXMuXG4gICAgaWYgKG1hZ2ljID09PSAweDQ2NTQ2YzY3KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0R2xiVmVyc2lvbihnbGJBcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIpIHtcbiAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhnbGJBcnJheUJ1ZmZlciwgMCwgMjApO1xuICAgIGNvbnN0IGlzTGl0dGxlRW5kaWFuID0gdHJ1ZTtcbiAgICBjb25zdCBnbGJWZXIgPSBkYXRhVmlldy5nZXRVaW50MzIoNCwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIHJldHVybiBnbGJWZXI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2dldEdsdGZWZXJzaW9uKGdsdGZKc29uOiBnbFRGMSB8IFJuTTIpIHtcbiAgICBpZiAoKGdsdGZKc29uIGFzIFJuTTIpLmFzc2V0Py52ZXJzaW9uPy5jaGFyQXQoMCkgPT09ICcyJykge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIF9fZGV0ZWN0VGhlTW9kZWxGaWxlVHlwZUFuZEltcG9ydChcbiAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgIHJlbmRlclBhc3NlczogUmVuZGVyUGFzc1tdLFxuICAgIG9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uLFxuICAgIHVyaTogc3RyaW5nLFxuICAgIGNhbGxiYWNrPzogUm5Qcm9taXNlQ2FsbGJhY2tcbiAgKTogUHJvbWlzZTxSZXN1bHQ8dm9pZCwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IG9wdGlvbmFsRmlsZVR5cGUgPSBvcHRpb25zLmZpbGVUeXBlO1xuXG4gICAgY29uc3QgZmlsZVR5cGUgPSB0aGlzLl9fZ2V0RmlsZVR5cGVGcm9tRmlsZVByb21pc2UoZmlsZU5hbWUsIG9wdGlvbnMsIG9wdGlvbmFsRmlsZVR5cGUpO1xuXG4gICAgY29uc3QgZmlsZUFycmF5QnVmZmVyID0gb3B0aW9ucy5maWxlcyFbZmlsZU5hbWVdO1xuICAgIG9wdGlvbnMuX19pc0ltcG9ydFZSTTB4ID0gZmFsc2U7XG4gICAgbGV0IGdsVEZWZXIgPSAwOyAvLyAwOiBub3QgZ2xURiwgMTogZ2xURjEsIDI6IGdsVEYyXG4gICAgc3dpdGNoIChmaWxlVHlwZSkge1xuICAgICAgY2FzZSBGaWxlVHlwZS5HbHRmOiB7XG4gICAgICAgIGNvbnN0IGdvdFRleHQgPSBEYXRhVXRpbC5hcnJheUJ1ZmZlclRvU3RyaW5nKGZpbGVBcnJheUJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGdvdFRleHQpO1xuICAgICAgICBnbFRGVmVyID0gdGhpcy5fX2dldEdsdGZWZXJzaW9uKGpzb24pO1xuICAgICAgICBjb25zdCBpbXBvcnRlciA9IEdsdGYySW1wb3J0ZXI7XG4gICAgICAgIGNvbnN0IGdsdGZNb2RlbCA9IGF3YWl0IGltcG9ydGVyLl9pbXBvcnRHbHRmKFxuICAgICAgICAgIGpzb24sXG4gICAgICAgICAgb3B0aW9ucy5maWxlcyEsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICBjYWxsYmFja1xuICAgICAgICApO1xuICAgICAgICBjb25zdCByb290R3JvdXAgPSBNb2RlbENvbnZlcnRlci5jb252ZXJ0VG9SaG9kb25pdGVPYmplY3QoZ2x0Zk1vZGVsKTtcbiAgICAgICAgcmVuZGVyUGFzc2VzWzBdLmFkZEVudGl0aWVzKFtyb290R3JvdXBdKTtcbiAgICAgICAgb3B0aW9ucy5fX2ltcG9ydGVkVHlwZSA9ICdnbHRmMic7XG4gICAgICAgIHJldHVybiBuZXcgT2soKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmlsZVR5cGUuR2x0ZkJpbmFyeToge1xuICAgICAgICBnbFRGVmVyID0gdGhpcy5fX2dldEdsYlZlcnNpb24oZmlsZUFycmF5QnVmZmVyKTtcbiAgICAgICAgY29uc3QgaW1wb3J0ZXIgPSBHbHRmMkltcG9ydGVyO1xuICAgICAgICBjb25zdCBnbHRmTW9kZWwgPSBhd2FpdCBpbXBvcnRlci5faW1wb3J0R2xiKGZpbGVBcnJheUJ1ZmZlciwgb3B0aW9ucy5maWxlcyEsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByb290R3JvdXAgPSBNb2RlbENvbnZlcnRlci5jb252ZXJ0VG9SaG9kb25pdGVPYmplY3QoZ2x0Zk1vZGVsKTtcbiAgICAgICAgcmVuZGVyUGFzc2VzWzBdLmFkZEVudGl0aWVzKFtyb290R3JvdXBdKTtcbiAgICAgICAgb3B0aW9ucy5fX2ltcG9ydGVkVHlwZSA9ICdnbGIyJztcbiAgICAgICAgcmV0dXJuIG5ldyBPaygpO1xuICAgICAgfVxuICAgICAgY2FzZSBGaWxlVHlwZS5EcmFjbzoge1xuICAgICAgICBjb25zdCBpbXBvcnRlciA9IERyY1BvaW50Q2xvdWRJbXBvcnRlci5nZXRJbnN0YW5jZSgpIGFzIERyY1BvaW50Q2xvdWRJbXBvcnRlcjtcbiAgICAgICAgY29uc3QgZ2x0Zk1vZGVsID0gYXdhaXQgaW1wb3J0ZXIuaW1wb3J0QXJyYXlCdWZmZXIodXJpLCBmaWxlQXJyYXlCdWZmZXIsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZ2x0Zk1vZGVsID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnaW1wb3J0QXJyYXlCdWZmZXIgZXJyb3IgaXMgb2NjdXJyZWQnLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zLl9faW1wb3J0ZWRUeXBlID0gJ2RyYWNvJztcbiAgICAgICAgICBjb25zdCByb290R3JvdXAgPSBNb2RlbENvbnZlcnRlci5jb252ZXJ0VG9SaG9kb25pdGVPYmplY3QoZ2x0Zk1vZGVsKTtcbiAgICAgICAgICByZW5kZXJQYXNzZXNbMF0uYWRkRW50aXRpZXMoW3Jvb3RHcm91cF0pO1xuICAgICAgICAgIHJldHVybiBuZXcgT2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSBGaWxlVHlwZS5WUk06IHtcbiAgICAgICAgb3B0aW9ucy5fX2lzSW1wb3J0VlJNMHggPSB0cnVlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBHbHRmMkltcG9ydGVyLl9pbXBvcnRHbHRmT3JHbGJGcm9tQXJyYXlCdWZmZXJzKFxuICAgICAgICAgIGZpbGVBcnJheUJ1ZmZlcixcbiAgICAgICAgICBvcHRpb25zLmZpbGVzISxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGlzT2socmVzdWx0KSkge1xuICAgICAgICAgIGNvbnN0IGdsdGZNb2RlbCA9IHJlc3VsdC5nZXQoKTtcbiAgICAgICAgICBpZiAoZ2x0Zk1vZGVsLmV4dGVuc2lvbnNVc2VkLmluZGV4T2YoJ1ZSTUNfdnJtJykgPj0gMCkge1xuICAgICAgICAgICAgb3B0aW9ucy5fX2lzSW1wb3J0VlJNMHggPSBmYWxzZTtcbiAgICAgICAgICAgIGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuTG9hZGVyT3B0aW9ucyEuX19pc0ltcG9ydFZSTTB4ID0gZmFsc2U7XG4gICAgICAgICAgICBvcHRpb25zLl9faW1wb3J0ZWRUeXBlID0gJ3ZybTEnO1xuICAgICAgICAgICAgYXdhaXQgVnJtSW1wb3J0ZXIuX19pbXBvcnRWUk0oZ2x0Zk1vZGVsLCByZW5kZXJQYXNzZXMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZ2x0Zk1vZGVsLmV4dGVuc2lvbnNVc2VkLmluZGV4T2YoJ1ZSTScpID49IDApIHtcbiAgICAgICAgICAgIG9wdGlvbnMuX19pbXBvcnRlZFR5cGUgPSAndnJtMHgnO1xuICAgICAgICAgICAgYXdhaXQgVnJtMHhJbXBvcnRlci5fX2ltcG9ydFZSTTB4KGdsdGZNb2RlbCwgcmVuZGVyUGFzc2VzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBPaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydElzRXJyKHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LmdldFJuRXJyb3IoKS5tZXNzYWdlLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXRlY3QgaW52YWxpZCBmb3JtYXQnLFxuICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0RmlsZVR5cGVGcm9tRmlsZVByb21pc2UoXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHbHRmTG9hZE9wdGlvbixcbiAgICBvcHRpb25hbEZpbGVUeXBlPzogc3RyaW5nXG4gICkge1xuICAgIGlmIChvcHRpb25hbEZpbGVUeXBlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBGaWxlVHlwZS5mcm9tU3RyaW5nKG9wdGlvbmFsRmlsZVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZvcm1hdEJ5QXJyYXlCdWZmZXJzKHtcbiAgICAgICAgW2ZpbGVOYW1lXTogb3B0aW9ucy5maWxlcyFbZmlsZU5hbWVdLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmlsZVR5cGU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IFJuTTIsIFJuTTJNYXRlcmlhbCwgUm5NMlRleHR1cmVTYW1wbGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvUm5NMic7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi9jb3JlL0VudGl0eSc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJTG9hZGVyRXh0ZW5zaW9uIHtcbiAgZ2VuZXJhdGVNYXRlcmlhbD8obWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWwpOiBNYXRlcmlhbDtcbiAgaXNOZWVkZWRUb1VzZVRoaXNNYXRlcmlhbD8oZ2x0Zkpzb246IFJuTTIpOiBib29sZWFuO1xuICBzZXRUZXh0dXJlcz8oZ2x0Zkpzb246IFJuTTIsIG1hdGVyaWFsSnNvbjogUm5NMk1hdGVyaWFsKTogdm9pZDtcbiAgc2V0dXBNYXRlcmlhbD8oZ2x0Zkpzb246IFJuTTIsIG1hdGVyaWFsSnNvbjogUm5NMk1hdGVyaWFsLCBtYXRlcmlhbDogTWF0ZXJpYWwpOiB2b2lkO1xuICBzZXRVVlRyYW5zZm9ybVRvVGV4dHVyZT8obWF0ZXJpYWw6IE1hdGVyaWFsLCBzYW1wbGVySnNvbjogUm5NMlRleHR1cmVTYW1wbGVyKTogdm9pZDtcbiAgbG9hZEV4dGVuc2lvbkluZm9BbmRTZXRUb1Jvb3RHcm91cD8ocm9vdEdyb3VwOiBJU2NlbmVHcmFwaEVudGl0eSwganNvbjogUm5NMik6IHZvaWQ7XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29yZS9FbnRpdHlSZXBvc2l0b3J5JztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL01lc2gvTWVzaENvbXBvbmVudCc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoL1F1YXRlcm5pb24nO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQ0JztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2dlb21ldHJ5L1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuLi9tZW1vcnkvQnVmZmVyJztcbmltcG9ydCB7IFByaW1pdGl2ZU1vZGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QcmltaXRpdmVNb2RlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQge1xuICBWZXJ0ZXhBdHRyaWJ1dGUsXG4gIFZlcnRleEF0dHJpYnV0ZVNlbWFudGljc0pvaW5lZFN0cmluZyxcbn0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IENhbWVyYVR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9DYW1lcmFUeXBlJztcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9BbmltYXRpb24vQW5pbWF0aW9uQ29tcG9uZW50JztcbmltcG9ydCB7IEFuaW1hdGlvbkludGVycG9sYXRpb24gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9BbmltYXRpb25JbnRlcnBvbGF0aW9uJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbCc7XG5pbXBvcnQgeyBTa2VsZXRhbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2tlbGV0YWwvU2tlbGV0YWxDb21wb25lbnQnO1xuaW1wb3J0IHsgQWxwaGFNb2RlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQWxwaGFNb2RlJztcbmltcG9ydCB7IE1hdGVyaWFsSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9NYXRlcmlhbEhlbHBlcic7XG5pbXBvcnQge1xuICBTaGFkZXJTZW1hbnRpY3MsXG4gIFNoYWRlclNlbWFudGljc0VudW0sXG4gIFNoYWRlclNlbWFudGljc05hbWUsXG59IGZyb20gJy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgU2hhZGluZ01vZGVsIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvU2hhZGluZ01vZGVsJztcbmltcG9ydCB7IEFjY2Vzc29yIH0gZnJvbSAnLi4vbWVtb3J5L0FjY2Vzc29yJztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgeyBMaWdodFR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9MaWdodFR5cGUnO1xuaW1wb3J0IHtcbiAgQ291bnQsXG4gIEJ5dGUsXG4gIFNpemUsXG4gIEluZGV4LFxuICBUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gIEFycmF5NCxcbiAgVmVjdG9yQ29tcG9uZW50TixcbiAgQXJyYXkzLFxufSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQge1xuICBSbk0yLFxuICBSbk0yTm9kZSxcbiAgUm5NMkFjY2Vzc29yLFxuICBSbk0yQnVmZmVyVmlldyxcbiAgUm5NMlByaW1pdGl2ZSxcbiAgUm5NMk1hdGVyaWFsLFxuICBSbk0ySW1hZ2UsXG4gIFJuTTJDYW1lcmEsXG4gIFJuTTJUZXh0dXJlLFxuICBSbk0yTWVzaCxcbiAgUm5NMlRleHR1cmVJbmZvLFxuICBSbk0yU3BhcnNlSW5kaWNlcyxcbiAgUm5NMlBick1ldGFsbGljUm91Z2huZXNzLFxufSBmcm9tICcuLi8uLi90eXBlcy9Sbk0yJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IEJ1ZmZlclVzZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0J1ZmZlclVzZSc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9NZW1vcnlNYW5hZ2VyJztcbmltcG9ydCB7IElMb2FkZXJFeHRlbnNpb24gfSBmcm9tICcuL0lMb2FkZXJFeHRlbnNpb24nO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbWF0aC9TY2FsYXInO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi9taXNjL0RhdGFVdGlsJztcbmltcG9ydCB7IEFuaW1hdGlvblBhdGhOYW1lIH0gZnJvbSAnLi4vLi4vdHlwZXMvQW5pbWF0aW9uVHlwZXMnO1xuaW1wb3J0IHsgR2x0ZkxvYWRPcHRpb24sIEtIUl9saWdodHNfcHVuY3R1YWxfTGlnaHQsIFRhZ0dsdGYyTm9kZUluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvZ2xURjInO1xuaW1wb3J0IHtcbiAgSUFuaW1hdGlvbkVudGl0eSxcbiAgSUNhbWVyYUVudGl0eSxcbiAgSVNjZW5lR3JhcGhFbnRpdHksXG4gIElMaWdodEVudGl0eSxcbiAgSU1lc2hFbnRpdHksXG59IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IEJsZW5kU2hhcGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0JsZW5kU2hhcGUvQmxlbmRTaGFwZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWdodENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvTGlnaHQvTGlnaHRDb21wb25lbnQnO1xuaW1wb3J0IHsgSUJsZW5kU2hhcGVFbnRpdHlNZXRob2RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9CbGVuZFNoYXBlL0lCbGVuZFNoYXBlRW50aXR5JztcbmltcG9ydCB7IEJ1ZmZlclZpZXcgfSBmcm9tICcuLi9tZW1vcnkvQnVmZmVyVmlldyc7XG5pbXBvcnQgeyBSaG9kb25pdGVJbXBvcnRFeHRlbnNpb24gfSBmcm9tICcuL1Job2Rvbml0ZUltcG9ydEV4dGVuc2lvbic7XG5pbXBvcnQgeyBWcm0weE1hdGVyaWFsUHJvcGVydHkgfSBmcm9tICcuLi8uLi90eXBlcy9WUk0weCc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBTYW1wbGVyIH0gZnJvbSAnLi4vdGV4dHVyZXMvU2FtcGxlcic7XG5pbXBvcnQgeyBBbmltYXRpb25TdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQW5pbWF0aW9uU3RhdGUvQW5pbWF0aW9uU3RhdGVDb21wb25lbnQnO1xuaW1wb3J0IHsgY3JlYXRlR3JvdXBFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL1NjZW5lR3JhcGgvY3JlYXRlR3JvdXBFbnRpdHknO1xuaW1wb3J0IHsgY3JlYXRlTWVzaEVudGl0eSB9IGZyb20gJy4uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL2NyZWF0ZU1lc2hFbnRpdHknO1xuaW1wb3J0IHsgY3JlYXRlTGlnaHRFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL0xpZ2h0L2NyZWF0ZUxpZ2h0RW50aXR5JztcbmltcG9ydCB7IGNyZWF0ZUNhbWVyYUVudGl0eSB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL2NyZWF0ZUNhbWVyYUVudGl0eSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmRlY2xhcmUgbGV0IERyYWNvRGVjb2Rlck1vZHVsZTogYW55O1xuXG4vKipcbiAqIEEgY29udmVydGVyIGNsYXNzIGZyb20gZ2xURjIgbW9kZWwgdG8gUmhvZG9uaXRlIE5hdGl2ZSBkYXRhXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbENvbnZlcnRlciB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZW5lcmF0ZUdyb3VwRW50aXR5KGdsdGZNb2RlbDogUm5NMik6IElTY2VuZUdyYXBoRW50aXR5IHtcbiAgICBjb25zdCBlbnRpdHkgPSBjcmVhdGVHcm91cEVudGl0eSgpO1xuICAgIHRoaXMuYWRkVGFncyhlbnRpdHksIGdsdGZNb2RlbCk7XG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFkZFRhZ3MoZW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSwgZ2x0Zk1vZGVsOiBSbk0yKSB7XG4gICAgZW50aXR5LnRyeVRvU2V0VGFnKHtcbiAgICAgIHRhZzogJ1NvdXJjZVR5cGUnLFxuICAgICAgdmFsdWU6IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLmZpbGVUeXBlISxcbiAgICB9KTtcbiAgICBlbnRpdHkudHJ5VG9TZXRUYWcoe1xuICAgICAgdGFnOiAnU291cmNlVHlwZVZlcnNpb24nLFxuICAgICAgdmFsdWU6IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnZlcnNpb24hLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZW5lcmF0ZU1lc2hFbnRpdHkoZ2x0Zk1vZGVsOiBSbk0yKTogSU1lc2hFbnRpdHkge1xuICAgIGNvbnN0IGVudGl0eSA9IGNyZWF0ZU1lc2hFbnRpdHkoKTtcbiAgICB0aGlzLmFkZFRhZ3MoZW50aXR5LCBnbHRmTW9kZWwpO1xuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2dlbmVyYXRlQ2FtZXJhRW50aXR5KGdsdGZNb2RlbDogUm5NMik6IElDYW1lcmFFbnRpdHkge1xuICAgIGNvbnN0IGVudGl0eSA9IGNyZWF0ZUNhbWVyYUVudGl0eSgpO1xuICAgIHRoaXMuYWRkVGFncyhlbnRpdHksIGdsdGZNb2RlbCk7XG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2VuZXJhdGVMaWdodEVudGl0eShnbHRmTW9kZWw6IFJuTTIpOiBJTGlnaHRFbnRpdHkge1xuICAgIGNvbnN0IGVudGl0eSA9IGNyZWF0ZUxpZ2h0RW50aXR5KCk7XG4gICAgdGhpcy5hZGRUYWdzKGVudGl0eSwgZ2x0Zk1vZGVsKTtcbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19zZXR1cE1hdGVyaWFscyhnbHRmTW9kZWw6IFJuTTIpIHtcbiAgICBjb25zdCBybk1hdGVyaWFsczogTWF0ZXJpYWxbXSA9IFtdO1xuICAgIGlmIChnbHRmTW9kZWwubWF0ZXJpYWxzICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgZ2x0Zk1vZGVsLm1hdGVyaWFscykge1xuICAgICAgICBjb25zdCBybk1hdGVyaWFsID0gdGhpcy5fX3NldHVwTWF0ZXJpYWwoZ2x0Zk1vZGVsLCBtYXRlcmlhbCk7XG4gICAgICAgIHJuTWF0ZXJpYWxzLnB1c2gocm5NYXRlcmlhbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBybk1hdGVyaWFscztcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0VG9SaG9kb25pdGVPYmplY3QoZ2x0Zk1vZGVsOiBSbk0yKSB7XG4gICAgKGdsdGZNb2RlbC5hc3NldC5leHRyYXMgYXMgYW55KS5ybk1lc2hlc0F0R2x0TWVzaElkeCA9IFtdO1xuXG4gICAgY29uc3Qgcm5CdWZmZXJzID0gdGhpcy5jcmVhdGVSbkJ1ZmZlcihnbHRmTW9kZWwpO1xuICAgIGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuTWF0ZXJpYWxzID0ge307XG5cbiAgICAvLyBNYXRlcmlhbHNcbiAgICBjb25zdCBybk1hdGVyaWFscyA9IHRoaXMuX19zZXR1cE1hdGVyaWFscyhnbHRmTW9kZWwpO1xuXG4gICAgLy8gTWVzaCwgQ2FtZXJhLCBHcm91cCwgLi4uXG4gICAgY29uc3QgeyBybkVudGl0aWVzLCBybkVudGl0aWVzQnlOYW1lcyB9ID0gdGhpcy5fX3NldHVwT2JqZWN0cyhcbiAgICAgIGdsdGZNb2RlbCxcbiAgICAgIHJuQnVmZmVycyxcbiAgICAgIHJuTWF0ZXJpYWxzXG4gICAgKTtcbiAgICBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIS5ybkVudGl0aWVzID0gcm5FbnRpdGllcztcblxuICAgIC8vIFRyYW5zZm9ybVxuICAgIHRoaXMuX3NldHVwVHJhbnNmb3JtKGdsdGZNb2RlbCwgcm5FbnRpdGllcyk7XG5cbiAgICBjb25zdCByb290R3JvdXAgPSB0aGlzLl9fZ2VuZXJhdGVHcm91cEVudGl0eShnbHRmTW9kZWwpO1xuXG4gICAgLy8gQW5pbWF0aW9uXG4gICAgdGhpcy5fc2V0dXBBbmltYXRpb24oZ2x0Zk1vZGVsLCBybkVudGl0aWVzLCBybkJ1ZmZlcnMsIHJvb3RHcm91cCk7XG5cbiAgICAvLyBTa2VsZXRvblxuICAgIHRoaXMuX3NldHVwU2tlbGV0b24oZ2x0Zk1vZGVsLCBybkVudGl0aWVzLCBybkJ1ZmZlcnMpO1xuXG4gICAgLy8gSGllcmFyY2h5XG4gICAgdGhpcy5fc2V0dXBIaWVyYXJjaHkoZ2x0Zk1vZGVsLCBybkVudGl0aWVzKTtcblxuICAgIHJvb3RHcm91cC50cnlUb1NldFVuaXF1ZU5hbWUoJ0ZpbGVSb290JywgdHJ1ZSk7XG4gICAgcm9vdEdyb3VwLnRyeVRvU2V0VGFnKHsgdGFnOiAnT2JqZWN0VHlwZScsIHZhbHVlOiAndG9wJyB9KTtcbiAgICBpZiAoZ2x0Zk1vZGVsLnNjZW5lc1swXS5ub2Rlcykge1xuICAgICAgZm9yIChjb25zdCBub2Rlc0luZGV4IG9mIGdsdGZNb2RlbC5zY2VuZXNbMF0ubm9kZXMpIHtcbiAgICAgICAgY29uc3Qgc2cgPSBybkVudGl0aWVzW25vZGVzSW5kZXhdLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgcm9vdEdyb3VwLmdldFNjZW5lR3JhcGgoKS5hZGRDaGlsZChzZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdsdGZNb2RlbC5hc3NldC5leHRyYXMgJiYgZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcy5ybkxvYWRlck9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIS5ybkxvYWRlck9wdGlvbnM7XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMgJiZcbiAgICAgICAgb3B0aW9ucy5sb2FkZXJFeHRlbnNpb24gJiZcbiAgICAgICAgb3B0aW9ucz8ubG9hZGVyRXh0ZW5zaW9uPy5sb2FkRXh0ZW5zaW9uSW5mb0FuZFNldFRvUm9vdEdyb3VwXG4gICAgICApIHtcbiAgICAgICAgb3B0aW9ucy5sb2FkZXJFeHRlbnNpb24ubG9hZEV4dGVuc2lvbkluZm9BbmRTZXRUb1Jvb3RHcm91cChyb290R3JvdXAsIGdsdGZNb2RlbCk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmV4cHJlc3Npb24pIHtcbiAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uLnRyeVRvU2V0VGFnKHtcbiAgICAgICAgICB0YWc6ICdnbHRmTW9kZWwnLFxuICAgICAgICAgIHZhbHVlOiBnbHRmTW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJvb3RHcm91cC5hbGxNZXNoZXMgPSByb290R3JvdXAuc2VhcmNoRWxlbWVudHNCeVR5cGUoTV9NZXNoKTtcbiAgICByb290R3JvdXAudHJ5VG9TZXRUYWcoeyB0YWc6ICdybkVudGl0aWVzJywgdmFsdWU6IHJuRW50aXRpZXMgfSk7XG4gICAgcm9vdEdyb3VwLnRyeVRvU2V0VGFnKHsgdGFnOiAncm5FbnRpdGllc0J5TmFtZXMnLCB2YWx1ZTogcm5FbnRpdGllc0J5TmFtZXMgfSk7XG4gICAgcm9vdEdyb3VwLnRyeVRvU2V0VGFnKHsgdGFnOiAnZ2x0Zk1vZGVsJywgdmFsdWU6IGdsdGZNb2RlbCB9KTtcbiAgICBpZiAoSXMubm90LmV4aXN0KGdsdGZNb2RlbC5leHRyYXMpKSB7XG4gICAgICAoZ2x0Zk1vZGVsIGFzIGFueSkuZXh0cmFzID0ge307XG4gICAgfVxuICAgIGdsdGZNb2RlbC5leHRyYXMucm5FbnRpdGllcyA9IHJuRW50aXRpZXM7XG4gICAgZ2x0Zk1vZGVsLmV4dHJhcy5ybkVudGl0aWVzQnlOYW1lcyA9IHJuRW50aXRpZXNCeU5hbWVzO1xuXG4gICAgLy8gRWZmZWtzZWVyXG4gICAgUmhvZG9uaXRlSW1wb3J0RXh0ZW5zaW9uLmltcG9ydEVmZmVjdChnbHRmTW9kZWwsIHJvb3RHcm91cCk7XG5cbiAgICAvLyBCaWxsYm9hcmRcbiAgICBSaG9kb25pdGVJbXBvcnRFeHRlbnNpb24uaW1wb3J0QmlsbGJvYXJkKGdsdGZNb2RlbCwgcm5FbnRpdGllcyk7XG5cbiAgICBpZiAoSXMuZXhpc3QoZ2x0Zk1vZGVsLmV4dGVuc2lvbnNVc2VkKSkge1xuICAgICAgaWYgKGdsdGZNb2RlbC5leHRlbnNpb25zVXNlZC5pbmRleE9mKCdWUk1DX3ZybScpID4gMCkge1xuICAgICAgICAvLyB0aGlzLl9fZ2VuZXJhdGVWcm1Ob3JtYWxpemVkU2tlbGV0b24oZ2x0Zk1vZGVsLCBybkVudGl0aWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdEdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUm5CdWZmZXIoZ2x0Zk1vZGVsOiBSbk0yKTogQnVmZmVyW10ge1xuICAgIGNvbnN0IHJuQnVmZmVycyA9IFtdO1xuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGdsdGZNb2RlbC5idWZmZXJzKSB7XG4gICAgICBjb25zdCBybkJ1ZmZlciA9IG5ldyBCdWZmZXIoe1xuICAgICAgICBieXRlTGVuZ3RoOiBidWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgYnVmZmVyOiBidWZmZXIuYnVmZmVyISxcbiAgICAgICAgbmFtZTogYGdsdGYyQnVmZmVyXzBfKCR7YnVmZmVyLnVyaX0pYCxcbiAgICAgICAgYnl0ZUFsaWduOiA0LFxuICAgICAgfSk7XG4gICAgICBybkJ1ZmZlcnMucHVzaChybkJ1ZmZlcik7XG4gICAgfVxuICAgIHJldHVybiBybkJ1ZmZlcnM7XG4gIH1cblxuICBzdGF0aWMgX3NldHVwVHJhbnNmb3JtKGdsdGZNb2RlbDogUm5NMiwgZ3JvdXBzOiBJU2NlbmVHcmFwaEVudGl0eVtdKSB7XG4gICAgZm9yIChjb25zdCBub2RlX2kgaW4gZ2x0Zk1vZGVsLm5vZGVzKSB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1tub2RlX2ldO1xuICAgICAgY29uc3Qgbm9kZUpzb24gPSBnbHRmTW9kZWwubm9kZXNbbm9kZV9pXTtcbiAgICAgIGNvbnN0IGdyb3VwVHJhbnNmb3JtID0gZ3JvdXAuZ2V0VHJhbnNmb3JtKCkhO1xuICAgICAgaWYgKG5vZGVKc29uLnRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGdyb3VwVHJhbnNmb3JtLmxvY2FsUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICAgIG5vZGVKc29uLnRyYW5zbGF0aW9uWzBdLFxuICAgICAgICAgIG5vZGVKc29uLnRyYW5zbGF0aW9uWzFdLFxuICAgICAgICAgIG5vZGVKc29uLnRyYW5zbGF0aW9uWzJdLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlSnNvbi5zY2FsZSkge1xuICAgICAgICBncm91cFRyYW5zZm9ybS5sb2NhbFNjYWxlID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgICAgICBub2RlSnNvbi5zY2FsZVswXSxcbiAgICAgICAgICBub2RlSnNvbi5zY2FsZVsxXSxcbiAgICAgICAgICBub2RlSnNvbi5zY2FsZVsyXSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZUpzb24ucm90YXRpb24pIHtcbiAgICAgICAgZ3JvdXBUcmFuc2Zvcm0ubG9jYWxSb3RhdGlvbiA9IFF1YXRlcm5pb24uZnJvbUNvcHk0KFxuICAgICAgICAgIG5vZGVKc29uLnJvdGF0aW9uWzBdLFxuICAgICAgICAgIG5vZGVKc29uLnJvdGF0aW9uWzFdLFxuICAgICAgICAgIG5vZGVKc29uLnJvdGF0aW9uWzJdLFxuICAgICAgICAgIG5vZGVKc29uLnJvdGF0aW9uWzNdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZUpzb24ubWF0cml4KSB7XG4gICAgICAgIGdyb3VwVHJhbnNmb3JtLmxvY2FsTWF0cml4ID0gTWF0cml4NDQuZnJvbUNvcHlBcnJheUNvbHVtbk1ham9yKG5vZGVKc29uLm1hdHJpeCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIF9zZXR1cEhpZXJhcmNoeShnbHRmTW9kZWw6IFJuTTIsIHJuRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10pIHtcbiAgICBjb25zdCBncm91cFNjZW5lQ29tcG9uZW50cyA9IHJuRW50aXRpZXMubWFwKChncm91cCkgPT4ge1xuICAgICAgcmV0dXJuIGdyb3VwLmdldFNjZW5lR3JhcGgoKSE7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG5vZGVfaSBpbiBnbHRmTW9kZWwubm9kZXMpIHtcbiAgICAgIGNvbnN0IHBhcmVudE5vZGVfaSA9IHBhcnNlSW50KG5vZGVfaSk7XG4gICAgICBjb25zdCBnbFRGMlBhcmVudE5vZGUgPSBnbHRmTW9kZWwubm9kZXNbcGFyZW50Tm9kZV9pXTtcbiAgICAgIGlmIChJcy5leGlzdChnbFRGMlBhcmVudE5vZGUuY2hpbGRyZW4pKSB7XG4gICAgICAgIGNvbnN0IHJuUGFyZW50U2NlbmVHcmFwaENvbXBvbmVudCA9IGdyb3VwU2NlbmVDb21wb25lbnRzW3BhcmVudE5vZGVfaV07XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlX2kgb2YgZ2xURjJQYXJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3Qgcm5DaGlsZFNjZW5lR3JhcGhDb21wb25lbnQgPSBncm91cFNjZW5lQ29tcG9uZW50c1tjaGlsZE5vZGVfaV07XG4gICAgICAgICAgcm5QYXJlbnRTY2VuZUdyYXBoQ29tcG9uZW50LmFkZENoaWxkKHJuQ2hpbGRTY2VuZUdyYXBoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBfc2V0dXBBbmltYXRpb24oXG4gICAgZ2x0Zk1vZGVsOiBSbk0yLFxuICAgIHJuRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10sXG4gICAgcm5CdWZmZXJzOiBCdWZmZXJbXSxcbiAgICByb290R3JvdXA6IElTY2VuZUdyYXBoRW50aXR5XG4gICkge1xuICAgIGlmIChnbHRmTW9kZWwuYW5pbWF0aW9ucyA9PSBudWxsIHx8IGdsdGZNb2RlbC5hbmltYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1Jvb3RHcm91cCA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoQW5pbWF0aW9uU3RhdGVDb21wb25lbnQsIHJvb3RHcm91cCk7XG5cbiAgICBmb3IgKGNvbnN0IGFuaW1hdGlvbiBvZiBnbHRmTW9kZWwuYW5pbWF0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzYW1wbGVyIG9mIGFuaW1hdGlvbi5zYW1wbGVycykge1xuICAgICAgICB0aGlzLl9yZWFkQmluYXJ5RnJvbUFjY2Vzc29yQW5kU2V0SXRUb0FjY2Vzc29yRXh0cmFzKHNhbXBsZXIuaW5wdXRPYmplY3QhLCBybkJ1ZmZlcnMpO1xuICAgICAgICB0aGlzLl9yZWFkQmluYXJ5RnJvbUFjY2Vzc29yQW5kU2V0SXRUb0FjY2Vzc29yRXh0cmFzKHNhbXBsZXIub3V0cHV0T2JqZWN0ISwgcm5CdWZmZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFuaW1hdGlvbiBvZiBnbHRmTW9kZWwuYW5pbWF0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGFuaW1hdGlvbi5jaGFubmVscykge1xuICAgICAgICBpZiAoSXMuZXhpc3QoY2hhbm5lbC5zYW1wbGVyT2JqZWN0KSkge1xuICAgICAgICAgIGNvbnN0IGFuaW1JbnB1dEFycmF5ID0gY2hhbm5lbC5zYW1wbGVyT2JqZWN0LmlucHV0T2JqZWN0IS5leHRyYXMhLnR5cGVkRGF0YUFycmF5ITtcbiAgICAgICAgICBjb25zdCBhbmltT3V0cHV0QXJyYXkgPSBjaGFubmVsLnNhbXBsZXJPYmplY3Qub3V0cHV0T2JqZWN0IS5leHRyYXMhLnR5cGVkRGF0YUFycmF5ITtcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gY2hhbm5lbC5zYW1wbGVyT2JqZWN0LmludGVycG9sYXRpb24gPz8gJ0xJTkVBUic7XG5cbiAgICAgICAgICBsZXQgYW5pbWF0aW9uQXR0cmlidXRlVHlwZTogQW5pbWF0aW9uUGF0aE5hbWUgPSAndW5kZWZpbmVkJztcbiAgICAgICAgICBpZiAoY2hhbm5lbC50YXJnZXQhLnBhdGggPT09ICd0cmFuc2xhdGlvbicpIHtcbiAgICAgICAgICAgIGFuaW1hdGlvbkF0dHJpYnV0ZVR5cGUgPSAndHJhbnNsYXRlJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWwudGFyZ2V0IS5wYXRoID09PSAncm90YXRpb24nKSB7XG4gICAgICAgICAgICBhbmltYXRpb25BdHRyaWJ1dGVUeXBlID0gJ3F1YXRlcm5pb24nO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmltYXRpb25BdHRyaWJ1dGVUeXBlID0gY2hhbm5lbC50YXJnZXQhLnBhdGggYXMgQW5pbWF0aW9uUGF0aE5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgcm5FbnRpdHkgPSBybkVudGl0aWVzW2NoYW5uZWwudGFyZ2V0Lm5vZGUhXSBhcyBJQW5pbWF0aW9uRW50aXR5O1xuICAgICAgICAgIGlmIChJcy5leGlzdChybkVudGl0eSkpIHtcbiAgICAgICAgICAgIGxldCBhbmltYXRpb25Db21wb25lbnQgPSBybkVudGl0eS50cnlUb0dldEFuaW1hdGlvbigpO1xuICAgICAgICAgICAgaWYgKElzLm5vdC5leGlzdChhbmltYXRpb25Db21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1JuRW50aXR5ID0gRW50aXR5UmVwb3NpdG9yeS5hZGRDb21wb25lbnRUb0VudGl0eShcbiAgICAgICAgICAgICAgICBBbmltYXRpb25Db21wb25lbnQsXG4gICAgICAgICAgICAgICAgcm5FbnRpdHlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uQ29tcG9uZW50ID0gbmV3Um5FbnRpdHkuZ2V0QW5pbWF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXMuZXhpc3QoYW5pbWF0aW9uQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBjb25zdCBvdXRwdXRDb21wb25lbnROID0gY2hhbm5lbC5zYW1wbGVyT2JqZWN0Lm91dHB1dE9iamVjdCEuZXh0cmFzIS5jb21wb25lbnROITtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uQ29tcG9uZW50LnNldEFuaW1hdGlvbihcbiAgICAgICAgICAgICAgICBJcy5leGlzdChhbmltYXRpb24ubmFtZSkgPyBhbmltYXRpb24ubmFtZSA6ICdVbnRpdGxlZF9BbmltYXRpb24nLFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgICAgICAgYW5pbUlucHV0QXJyYXksXG4gICAgICAgICAgICAgICAgYW5pbU91dHB1dEFycmF5LFxuICAgICAgICAgICAgICAgIG91dHB1dENvbXBvbmVudE4gYXMgVmVjdG9yQ29tcG9uZW50TixcbiAgICAgICAgICAgICAgICBBbmltYXRpb25JbnRlcnBvbGF0aW9uLmZyb21TdHJpbmcoaW50ZXJwb2xhdGlvbilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX3NldHVwU2tlbGV0b24oZ2x0Zk1vZGVsOiBSbk0yLCBybkVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdLCBybkJ1ZmZlcnM6IEJ1ZmZlcltdKSB7XG4gICAgaWYgKGdsdGZNb2RlbC5za2lucyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBub2RlX2kgaW4gZ2x0Zk1vZGVsLm5vZGVzKSB7XG4gICAgICBjb25zdCBub2RlID0gZ2x0Zk1vZGVsLm5vZGVzW25vZGVfaV07XG4gICAgICBjb25zdCBzZyA9IHJuRW50aXRpZXNbbm9kZV9pXS5nZXRTY2VuZUdyYXBoKCkhO1xuICAgICAgbGV0IHNrZWxldGFsQ29tcG9uZW50OiBTa2VsZXRhbENvbXBvbmVudDtcbiAgICAgIGlmIChJcy5leGlzdChub2RlLnNraW5PYmplY3QpKSB7XG4gICAgICAgIGNvbnN0IHJuRW50aXR5ID0gcm5FbnRpdGllc1tub2RlX2ldO1xuICAgICAgICBjb25zdCBuZXdSbkVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoU2tlbGV0YWxDb21wb25lbnQsIHJuRW50aXR5KTtcbiAgICAgICAgc2tlbGV0YWxDb21wb25lbnQgPSBuZXdSbkVudGl0eS5nZXRTa2VsZXRhbCgpO1xuICAgICAgICBpZiAoSXMuZXhpc3Qobm9kZS5za2luT2JqZWN0LmJpbmRTaGFwZU1hdHJpeCkpIHtcbiAgICAgICAgICBza2VsZXRhbENvbXBvbmVudC5fYmluZFNoYXBlTWF0cml4ID0gTWF0cml4NDQuZnJvbUNvcHlBcnJheUNvbHVtbk1ham9yKFxuICAgICAgICAgICAgbm9kZS5za2luT2JqZWN0LmJpbmRTaGFwZU1hdHJpeFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmV4aXN0KG5vZGUuc2tpbk9iamVjdC5za2VsZXRvbikpIHtcbiAgICAgICAgICBzZy5pc1Jvb3RKb2ludCA9IHRydWU7XG4gICAgICAgICAgaWYgKElzLmV4aXN0KG5vZGUubWVzaCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGpvaW50cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIG5vZGUuc2tpbk9iamVjdC5qb2ludHMpIHtcbiAgICAgICAgICAgICAgam9pbnRzLnB1c2gocm5FbnRpdGllc1tpXS5nZXRTY2VuZUdyYXBoKCkhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNrZWxldGFsQ29tcG9uZW50IS5zZXRKb2ludHMoam9pbnRzKTtcbiAgICAgICAgICAgIGlmIChJcy5leGlzdChub2RlLnNraW5PYmplY3Quc2tlbGV0b24pKSB7XG4gICAgICAgICAgICAgIHNrZWxldGFsQ29tcG9uZW50IS50b3BPZkpvaW50c0hpZXJhcmNoeSA9XG4gICAgICAgICAgICAgICAgcm5FbnRpdGllc1tub2RlLnNraW5PYmplY3Quc2tlbGV0b25dLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNrZWxldGFsQ29tcG9uZW50IS50b3BPZkpvaW50c0hpZXJhcmNoeSA9IGpvaW50c1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBqb2ludF9pIG9mIG5vZGUuc2tpbk9iamVjdC5qb2ludHMpIHtcbiAgICAgICAgICBjb25zdCBzZyA9IHJuRW50aXRpZXNbam9pbnRfaV0uZ2V0U2NlbmVHcmFwaCgpITtcbiAgICAgICAgICBzZy5qb2ludEluZGV4ID0gam9pbnRfaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludmVyc2VCaW5kTWF0QWNjZXNzb3IgPSBub2RlLnNraW5PYmplY3QuaW52ZXJzZUJpbmRNYXRyaWNlc09iamVjdDtcbiAgICAgICAgaWYgKElzLmV4aXN0KGludmVyc2VCaW5kTWF0QWNjZXNzb3IpKSB7XG4gICAgICAgICAgY29uc3Qgcm5CdWZmZXJPZkludmVyc2VCaW5kTWF0QWNjZXNzb3IgPSB0aGlzLl9fZ2V0Um5CdWZmZXJWaWV3QW5kUm5BY2Nlc3NvcihcbiAgICAgICAgICAgIGludmVyc2VCaW5kTWF0QWNjZXNzb3IsXG4gICAgICAgICAgICBybkJ1ZmZlcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIHNrZWxldGFsQ29tcG9uZW50IS5zZXRJbnZlcnNlQmluZE1hdHJpY2VzQWNjZXNzb3Iocm5CdWZmZXJPZkludmVyc2VCaW5kTWF0QWNjZXNzb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19zZXR1cE9iamVjdHMoZ2x0Zk1vZGVsOiBSbk0yLCBybkJ1ZmZlcnM6IEJ1ZmZlcltdLCBybk1hdGVyaWFsczogTWF0ZXJpYWxbXSkge1xuICAgIGNvbnN0IHJuRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10gPSBbXTtcbiAgICBjb25zdCBybkVudGl0aWVzQnlOYW1lczogTWFwPHN0cmluZywgSVNjZW5lR3JhcGhFbnRpdHk+ID0gbmV3IE1hcCgpO1xuXG4gICAgZm9yIChjb25zdCBub2RlX2kgaW4gZ2x0Zk1vZGVsLm5vZGVzKSB7XG4gICAgICBjb25zdCBub2RlID0gZ2x0Zk1vZGVsLm5vZGVzW3BhcnNlSW50KG5vZGVfaSldIGFzIFJuTTJOb2RlO1xuICAgICAgbGV0IGVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHk7XG4gICAgICBpZiAobm9kZS5tZXNoICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbWVzaElkeCA9IG5vZGUubWVzaDtcbiAgICAgICAgY29uc3QgbWVzaEVudGl0eSA9IHRoaXMuX19zZXR1cE1lc2goXG4gICAgICAgICAgbm9kZS5tZXNoT2JqZWN0ISxcbiAgICAgICAgICBtZXNoSWR4LFxuICAgICAgICAgIHJuQnVmZmVycyxcbiAgICAgICAgICBnbHRmTW9kZWwsXG4gICAgICAgICAgcm5NYXRlcmlhbHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgIG1lc2hFbnRpdHkudHJ5VG9TZXRVbmlxdWVOYW1lKG5vZGUubmFtZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubWVzaE9iamVjdD8ubmFtZSkge1xuICAgICAgICAgIGNvbnN0IG1lc2hDb21wb25lbnQgPSBtZXNoRW50aXR5LmdldENvbXBvbmVudChNZXNoQ29tcG9uZW50KSE7XG4gICAgICAgICAgbWVzaENvbXBvbmVudC50cnlUb1NldFVuaXF1ZU5hbWUobm9kZS5tZXNoT2JqZWN0Lm5hbWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eSA9IG1lc2hFbnRpdHk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2FtZXJhT2JqZWN0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgY2FtZXJhRW50aXR5ID0gdGhpcy5fX3NldHVwQ2FtZXJhKG5vZGUuY2FtZXJhT2JqZWN0LCBnbHRmTW9kZWwpO1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgY2FtZXJhRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZShub2RlLm5hbWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eSA9IGNhbWVyYUVudGl0eTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5leHRlbnNpb25zPy5LSFJfbGlnaHRzX3B1bmN0dWFsKSB7XG4gICAgICAgIGNvbnN0IGxpZ2h0RW50aXR5ID0gdGhpcy5fX3NldHVwTGlnaHQobm9kZS5leHRlbnNpb25zLktIUl9saWdodHNfcHVuY3R1YWwubGlnaHQsIGdsdGZNb2RlbCk7XG4gICAgICAgIGVudGl0eSA9IGxpZ2h0RW50aXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9fZ2VuZXJhdGVHcm91cEVudGl0eShnbHRmTW9kZWwpO1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgZ3JvdXAudHJ5VG9TZXRVbmlxdWVOYW1lKG5vZGUubmFtZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZW50aXR5ID0gZ3JvdXA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9faXNNb3JwaGluZyhub2RlLCBnbHRmTW9kZWwpKSB7XG4gICAgICAgIGxldCB3ZWlnaHRzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBpZiAobm9kZS53ZWlnaHRzKSB7XG4gICAgICAgICAgd2VpZ2h0cyA9IG5vZGUud2VpZ2h0cztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm1lc2hPYmplY3Q/LndlaWdodHMpIHtcbiAgICAgICAgICB3ZWlnaHRzID0gbm9kZS5tZXNoT2JqZWN0LndlaWdodHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHRhcmdldE51bSA9IDA7XG4gICAgICAgICAgLy8gZ2V0IG1heGltdW0gdGFyZ2V0IG51bVxuICAgICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlIG9mIG5vZGUubWVzaE9iamVjdCEucHJpbWl0aXZlcykge1xuICAgICAgICAgICAgaWYgKElzLmV4aXN0KHByaW1pdGl2ZS50YXJnZXRzKSkge1xuICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlLnRhcmdldHMubGVuZ3RoID4gdGFyZ2V0TnVtKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0TnVtID0gcHJpbWl0aXZlLnRhcmdldHMubGVuZ3RoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHdlaWdodHMgPSBuZXcgQXJyYXkodGFyZ2V0TnVtKS5maWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoQmxlbmRTaGFwZUNvbXBvbmVudCwgZW50aXR5KTtcbiAgICAgICAgY29uc3QgYmxlbmRTaGFwZUNvbXBvbmVudCA9IChlbnRpdHkgYXMgdW5rbm93biBhcyBJQmxlbmRTaGFwZUVudGl0eU1ldGhvZHMpLmdldEJsZW5kU2hhcGUoKTtcbiAgICAgICAgYmxlbmRTaGFwZUNvbXBvbmVudC53ZWlnaHRzID0gd2VpZ2h0cztcbiAgICAgICAgaWYgKG5vZGUubWVzaE9iamVjdD8ucHJpbWl0aXZlc1swXS5leHRyYXM/LnRhcmdldE5hbWVzKSB7XG4gICAgICAgICAgYmxlbmRTaGFwZUNvbXBvbmVudC50YXJnZXROYW1lcyA9IG5vZGUubWVzaE9iamVjdC5wcmltaXRpdmVzWzBdLmV4dHJhcy50YXJnZXROYW1lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZW50aXR5LnRyeVRvU2V0VGFnKHsgdGFnOiBUYWdHbHRmMk5vZGVJbmRleCwgdmFsdWU6IG5vZGVfaSB9KTtcblxuICAgICAgcm5FbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICBybkVudGl0aWVzQnlOYW1lcy5zZXQobm9kZS5uYW1lISwgZW50aXR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBybkVudGl0aWVzLCBybkVudGl0aWVzQnlOYW1lcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19pc01vcnBoaW5nKG5vZGU6IFJuTTJOb2RlLCBnbHRmTW9kZWw6IFJuTTIpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9XG4gICAgICBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM/LmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkhWzBdO1xuICAgIGlmIChhcmd1bWVudD8uaXNNb3JwaGluZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUubWVzaE9iamVjdD8ucHJpbWl0aXZlc1swXS50YXJnZXRzICE9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19zZXR1cExpZ2h0KGxpZ2h0OiBLSFJfbGlnaHRzX3B1bmN0dWFsX0xpZ2h0LCBnbHRmTW9kZWw6IFJuTTIpOiBJTGlnaHRFbnRpdHkge1xuICAgIGNvbnN0IGxpZ2h0RW50aXR5ID0gdGhpcy5fX2dlbmVyYXRlTGlnaHRFbnRpdHkoZ2x0Zk1vZGVsKTtcbiAgICBjb25zdCBsaWdodENvbXBvbmVudCA9IGxpZ2h0RW50aXR5LmdldENvbXBvbmVudChMaWdodENvbXBvbmVudCkhIGFzIExpZ2h0Q29tcG9uZW50O1xuICAgIGlmIChsaWdodC5uYW1lICE9IG51bGwpIHtcbiAgICAgIGxpZ2h0Q29tcG9uZW50LnRyeVRvU2V0VW5pcXVlTmFtZShsaWdodC5uYW1lLCB0cnVlKTtcbiAgICAgIGxpZ2h0Q29tcG9uZW50LnR5cGUgPSBMaWdodFR5cGUuZnJvbVN0cmluZyhsaWdodC50eXBlKTtcbiAgICAgIGxldCBjb2xvciA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoWzEsIDEsIDFdKTtcbiAgICAgIGxldCBpbnRlbnNpdHkgPSAxO1xuICAgICAgaWYgKGxpZ2h0LmNvbG9yICE9IG51bGwpIHtcbiAgICAgICAgY29sb3IgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkzKGxpZ2h0LmNvbG9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChsaWdodC5pbnRlbnNpdHkgIT0gbnVsbCkge1xuICAgICAgICBpbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XG4gICAgICB9XG4gICAgICBsaWdodENvbXBvbmVudC5pbnRlbnNpdHkgPSBWZWN0b3IzLm11bHRpcGx5KGNvbG9yLCBpbnRlbnNpdHkpO1xuICAgICAgaWYgKGxpZ2h0LnJhbmdlICE9IG51bGwpIHtcbiAgICAgICAgbGlnaHRDb21wb25lbnQucmFuZ2UgPSBsaWdodC5yYW5nZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaWdodC50eXBlID09PSAnc3BvdCcpIHtcbiAgICAgICAgaWYgKGxpZ2h0LnNwb3Q/LmlubmVyQ29uZUFuZ2xlICE9IG51bGwpIHtcbiAgICAgICAgICBsaWdodENvbXBvbmVudC5pbm5lckNvbmVBbmdsZSA9IGxpZ2h0LnNwb3QuaW5uZXJDb25lQW5nbGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpZ2h0LnNwb3Q/Lm91dGVyQ29uZUFuZ2xlICE9IG51bGwpIHtcbiAgICAgICAgICBsaWdodENvbXBvbmVudC5vdXRlckNvbmVBbmdsZSA9IGxpZ2h0LnNwb3Qub3V0ZXJDb25lQW5nbGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpZ2h0RW50aXR5IGFzIElMaWdodEVudGl0eTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2V0dXBDYW1lcmEoY2FtZXJhOiBSbk0yQ2FtZXJhLCBnbHRmTW9kZWw6IFJuTTIpOiBJQ2FtZXJhRW50aXR5IHtcbiAgICBjb25zdCBjYW1lcmFFbnRpdHkgPSB0aGlzLl9fZ2VuZXJhdGVDYW1lcmFFbnRpdHkoZ2x0Zk1vZGVsKTtcbiAgICBjb25zdCBjYW1lcmFDb21wb25lbnQgPSBjYW1lcmFFbnRpdHkuZ2V0Q2FtZXJhKCk7XG4gICAgY2FtZXJhQ29tcG9uZW50LmRpcmVjdGlvbiA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMCwgMCwgLTFdKTtcbiAgICBpZiAoZ2x0Zk1vZGVsLmFzc2V0ICYmIChnbHRmTW9kZWwuYXNzZXQgYXMgYW55KS5MYXN0U2F2ZWRfQXBwbGljYXRpb25WZW5kb3IpIHtcbiAgICAgIC8vIEZvciBhbiBvbGQgZXhwb3J0ZXIgY29tcGF0aWJpbGl0eVxuICAgICAgY2FtZXJhQ29tcG9uZW50LmRpcmVjdGlvbiA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMSwgMCwgMF0pO1xuICAgICAgY2FtZXJhQ29tcG9uZW50LmRpcmVjdGlvbklubmVyID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFsxLCAwLCAwXSk7XG4gICAgfVxuICAgIGNhbWVyYUNvbXBvbmVudC51cCA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMCwgMSwgMF0pO1xuICAgIGNhbWVyYUNvbXBvbmVudC50eXBlID0gQ2FtZXJhVHlwZS5mcm9tU3RyaW5nKGNhbWVyYS50eXBlKTtcbiAgICBpZiAoY2FtZXJhQ29tcG9uZW50LnR5cGUgPT09IENhbWVyYVR5cGUuUGVyc3BlY3RpdmUpIHtcbiAgICAgIGNhbWVyYUNvbXBvbmVudC5hc3BlY3QgPSBjYW1lcmEucGVyc3BlY3RpdmUhLmFzcGVjdFJhdGlvXG4gICAgICAgID8gY2FtZXJhLnBlcnNwZWN0aXZlIS5hc3BlY3RSYXRpb1xuICAgICAgICA6IDE7XG4gICAgICBjYW1lcmFDb21wb25lbnQuc2V0Rm92eUFuZENoYW5nZUZvY2FsTGVuZ3RoKFxuICAgICAgICBNYXRoVXRpbC5yYWRpYW5Ub0RlZ3JlZShjYW1lcmEucGVyc3BlY3RpdmUhLnlmb3YpXG4gICAgICApO1xuICAgICAgY2FtZXJhQ29tcG9uZW50LnpOZWFyID0gY2FtZXJhLnBlcnNwZWN0aXZlIS56bmVhcjtcbiAgICAgIGNhbWVyYUNvbXBvbmVudC56RmFyID0gY2FtZXJhLnBlcnNwZWN0aXZlIS56ZmFyID8gY2FtZXJhLnBlcnNwZWN0aXZlIS56ZmFyIDogMTAwMDAwO1xuICAgICAgY2FtZXJhQ29tcG9uZW50LnRyeVRvU2V0VGFnKHtcbiAgICAgICAgdGFnOiAnT3JpZ2luYWxGb3ZZJyxcbiAgICAgICAgdmFsdWU6IGNhbWVyYUNvbXBvbmVudC5mb3Z5LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjYW1lcmFDb21wb25lbnQudHlwZSA9PT0gQ2FtZXJhVHlwZS5PcnRob2dyYXBoaWMpIHtcbiAgICAgIGNhbWVyYUNvbXBvbmVudC54TWFnID0gY2FtZXJhLm9ydGhvZ3JhcGhpYyEueG1hZztcbiAgICAgIGNhbWVyYUNvbXBvbmVudC55TWFnID0gY2FtZXJhLm9ydGhvZ3JhcGhpYyEueW1hZztcbiAgICAgIGNhbWVyYUNvbXBvbmVudC56TmVhciA9IGNhbWVyYS5vcnRob2dyYXBoaWMhLnpuZWFyO1xuICAgICAgY2FtZXJhQ29tcG9uZW50LnpGYXIgPSBjYW1lcmEub3J0aG9ncmFwaGljIS56ZmFyO1xuICAgICAgY2FtZXJhQ29tcG9uZW50LnRyeVRvU2V0VGFnKHtcbiAgICAgICAgdGFnOiAnT3JpZ2luYWxYTWFnJyxcbiAgICAgICAgdmFsdWU6IGNhbWVyYUNvbXBvbmVudC54TWFnLFxuICAgICAgfSk7XG4gICAgICBjYW1lcmFDb21wb25lbnQudHJ5VG9TZXRUYWcoe1xuICAgICAgICB0YWc6ICdPcmlnaW5hbFlNYWcnLFxuICAgICAgICB2YWx1ZTogY2FtZXJhQ29tcG9uZW50LnlNYWcsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FtZXJhQ29tcG9uZW50LnRyeVRvU2V0VGFnKHtcbiAgICAgIHRhZzogJ09yaWdpbmFsQXNwZWN0JyxcbiAgICAgIHZhbHVlOiBjYW1lcmFDb21wb25lbnQuYXNwZWN0LFxuICAgIH0pO1xuICAgIHJldHVybiBjYW1lcmFFbnRpdHkgYXMgSUNhbWVyYUVudGl0eTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2V0dXBNZXNoKFxuICAgIG1lc2g6IFJuTTJNZXNoLFxuICAgIG1lc2hJbmRleDogSW5kZXgsXG4gICAgcm5CdWZmZXJzOiBCdWZmZXJbXSxcbiAgICBnbHRmTW9kZWw6IFJuTTIsXG4gICAgcm5NYXRlcmlhbHM6IE1hdGVyaWFsW11cbiAgKSB7XG4gICAgY29uc3QgbWVzaEVudGl0eSA9IHRoaXMuX19nZW5lcmF0ZU1lc2hFbnRpdHkoZ2x0Zk1vZGVsKTtcbiAgICBjb25zdCBleGlzdGluZ1JuTWVzaCA9IChnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIGFzIGFueSkucm5NZXNoZXNBdEdsdE1lc2hJZHhbXG4gICAgICBtZXNoSW5kZXhcbiAgICBdPy5kZXJlZigpIGFzIE1lc2ggfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJuUHJpbWl0aXZlTW9kZSA9IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVzO1xuICAgIGNvbnN0IG1lc2hDb21wb25lbnQgPSBtZXNoRW50aXR5LmdldE1lc2goKTtcblxuICAgIGlmIChleGlzdGluZ1JuTWVzaCAhPSBudWxsKSB7XG4gICAgICBtZXNoQ29tcG9uZW50LnNldE1lc2goZXhpc3RpbmdSbk1lc2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBybk1lc2ggPSBuZXcgTWVzaCgpO1xuICAgICAgLy8gc2V0IGZsYWcgdG8gcm5NZXNoIHdpdGggb3B0aW9uc1xuICAgICAgY29uc3Qgcm5Mb2FkZXJPcHRpb25zID0gZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcyEucm5Mb2FkZXJPcHRpb25zO1xuICAgICAgaWYgKHJuTG9hZGVyT3B0aW9ucz8udGFuZ2VudENhbGN1bGF0aW9uTW9kZSAhPSBudWxsKSB7XG4gICAgICAgIHJuTWVzaC50YW5nZW50Q2FsY3VsYXRpb25Nb2RlID0gcm5Mb2FkZXJPcHRpb25zLnRhbmdlbnRDYWxjdWxhdGlvbk1vZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldHVwTWF0ZXJpYWxWYXJpYW50cyA9IChyblByaW1pdGl2ZTogUHJpbWl0aXZlLCBwcmltaXRpdmU6IFJuTTJQcmltaXRpdmUpID0+IHtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxWYXJpYW50cyA9IHByaW1pdGl2ZS5tYXRlcmlhbFZhcmlhbnRzO1xuICAgICAgICBpZiAoSXMubm90LmV4aXN0KG1hdGVyaWFsVmFyaWFudHMpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWxWYXJpYW50IG9mIG1hdGVyaWFsVmFyaWFudHMpIHtcbiAgICAgICAgICBjb25zdCBtYXRlcmlhbCA9IHJuTWF0ZXJpYWxzW21hdGVyaWFsVmFyaWFudC5tYXRlcmlhbF07XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHZhcmlhbnROYW1lIG9mIG1hdGVyaWFsVmFyaWFudC52YXJpYW50cykge1xuICAgICAgICAgICAgcm5QcmltaXRpdmUuc2V0TWF0ZXJpYWxWYXJpYW50KHZhcmlhbnROYW1lLCBtYXRlcmlhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGkgaW4gbWVzaC5wcmltaXRpdmVzKSB7XG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IG1lc2gucHJpbWl0aXZlc1tpXSBhcyBSbk0yUHJpbWl0aXZlO1xuICAgICAgICBpZiAocHJpbWl0aXZlLm1vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHJuUHJpbWl0aXZlTW9kZSA9IFByaW1pdGl2ZU1vZGUuZnJvbShwcmltaXRpdmUubW9kZSkhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm5QcmltaXRpdmUgPSBuZXcgUHJpbWl0aXZlKCk7XG5cbiAgICAgICAgY29uc3Qgcm5NYXRlcmlhbCA9XG4gICAgICAgICAgcHJpbWl0aXZlLm1hdGVyaWFsICE9IG51bGxcbiAgICAgICAgICAgID8gcm5NYXRlcmlhbHNbcHJpbWl0aXZlLm1hdGVyaWFsXVxuICAgICAgICAgICAgOiB0aGlzLl9fc2V0dXBNYXRlcmlhbChnbHRmTW9kZWwpO1xuICAgICAgICBzZXR1cE1hdGVyaWFsVmFyaWFudHMocm5QcmltaXRpdmUsIHByaW1pdGl2ZSk7XG5cbiAgICAgICAgaWYgKHJuTWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZS5pbmRleE9mKCdNVG9vbicpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IFZSTVByb3BlcnRpZXMgPSBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk07XG4gICAgICAgICAgY29uc3Qgcm5FeHRlbnNpb24gPSBWUk1Qcm9wZXJ0aWVzLnJuRXh0ZW5zaW9uO1xuICAgICAgICAgIGlmIChybkV4dGVuc2lvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJQYXNzT3V0bGluZSA9IHJuRXh0ZW5zaW9uLnJlbmRlclBhc3NPdXRsaW5lO1xuICAgICAgICAgICAgY29uc3Qgb3V0bGluZU1hdGVyaWFsID0gcHJpbWl0aXZlLm1hdGVyaWFsT2JqZWN0Py5leHRyYXM/Lm91dGxpbmVNYXRlcmlhbD8uZGVyZWYoKTtcbiAgICAgICAgICAgIGlmIChvdXRsaW5lTWF0ZXJpYWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICByZW5kZXJQYXNzT3V0bGluZS5zZXRNYXRlcmlhbEZvclByaW1pdGl2ZShvdXRsaW5lTWF0ZXJpYWwsIHJuUHJpbWl0aXZlKTtcbiAgICAgICAgICAgICAgcm5QcmltaXRpdmUuc2V0TWF0ZXJpYWxWYXJpYW50KCdvdXRsaW5lJywgb3V0bGluZU1hdGVyaWFsKTsgLy8gVG8gYXR0YWNoIGFuIG91dGxpbmVNYXRlcmlhbCByZWZlcmVuY2UgdG8gdGhlIHByaW1pdGl2ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluZGljZXNcbiAgICAgICAgbGV0IGluZGljZXNSbkFjY2Vzc29yO1xuICAgICAgICBjb25zdCBtYXA6IE1hcDxWZXJ0ZXhBdHRyaWJ1dGVTZW1hbnRpY3NKb2luZWRTdHJpbmcsIEFjY2Vzc29yPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKHByaW1pdGl2ZS5leHRlbnNpb25zPy5LSFJfZHJhY29fbWVzaF9jb21wcmVzc2lvbikge1xuICAgICAgICAgIGluZGljZXNSbkFjY2Vzc29yID0gdGhpcy5fX2RlY29kZURyYWNvKHByaW1pdGl2ZSwgcm5CdWZmZXJzLCBnbHRmTW9kZWwsIG1hcCk7XG5cbiAgICAgICAgICBpZiAoSXMubm90LmV4aXN0KGluZGljZXNSbkFjY2Vzc29yKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGluZGljZXNcbiAgICAgICAgICBpZiAoSXMuZXhpc3QocHJpbWl0aXZlLmluZGljZXMpKSB7XG4gICAgICAgICAgICBpbmRpY2VzUm5BY2Nlc3NvciA9IHRoaXMuX19nZXRSbkJ1ZmZlclZpZXdBbmRSbkFjY2Vzc29yKFxuICAgICAgICAgICAgICBwcmltaXRpdmUuaW5kaWNlc09iamVjdCEsXG4gICAgICAgICAgICAgIHJuQnVmZmVyc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhdHRyaWJ1dGVzXG4gICAgICAgICAgY29uc3Qgcm5CdWZmZXJWaWV3TWFwOiBNYXA8bnVtYmVyLCBCdWZmZXJWaWV3PiA9IG5ldyBNYXAoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gcHJpbWl0aXZlLmF0dHJpYnV0ZXNPYmplY3RzISkge1xuICAgICAgICAgICAgY29uc3Qgcm5tMmF0dHJpYnV0ZSA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVzT2JqZWN0c1thdHRyaWJ1dGVOYW1lXSE7XG4gICAgICAgICAgICBjb25zdCBybkJ1ZmZlciA9IHJuQnVmZmVyc1tybm0yYXR0cmlidXRlLmJ1ZmZlclZpZXdPYmplY3QhLmJ1ZmZlciFdO1xuICAgICAgICAgICAgbGV0IHJuQnVmZmVyVmlldzogQnVmZmVyVmlldyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChJcy5leGlzdChybm0yYXR0cmlidXRlLmJ1ZmZlclZpZXcpKSB7XG4gICAgICAgICAgICAgIHJuQnVmZmVyVmlldyA9IHJuQnVmZmVyVmlld01hcC5nZXQocm5tMmF0dHJpYnV0ZS5idWZmZXJWaWV3KTtcbiAgICAgICAgICAgICAgaWYgKElzLm5vdC5leGlzdChybkJ1ZmZlclZpZXcpKSB7XG4gICAgICAgICAgICAgICAgcm5CdWZmZXJWaWV3ID0gdGhpcy5fX2dldFJuQnVmZmVyVmlldyhybm0yYXR0cmlidXRlLmJ1ZmZlclZpZXdPYmplY3QhLCBybkJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcm5CdWZmZXJWaWV3TWFwLnNldChybm0yYXR0cmlidXRlLmJ1ZmZlclZpZXcsIHJuQnVmZmVyVmlldyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJuQnVmZmVyVmlldyA9IHJuQnVmZmVyXG4gICAgICAgICAgICAgICAgLnRha2VCdWZmZXJWaWV3KHtcbiAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IDAsXG4gICAgICAgICAgICAgICAgICBieXRlU3RyaWRlOiAwLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnVud3JhcEZvcmNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVSbkFjY2Vzc29yID0gdGhpcy5fX2dldFJuQWNjZXNzb3Iocm5tMmF0dHJpYnV0ZSwgcm5CdWZmZXJWaWV3KTtcblxuICAgICAgICAgICAgY29uc3Qgam9pbmVkU3RyaW5nID0gVmVydGV4QXR0cmlidXRlLnRvVmVydGV4QXR0cmlidXRlU2VtYW50aWNKb2luZWRTdHJpbmdBc0dsdGZTdHlsZShcbiAgICAgICAgICAgICAgVmVydGV4QXR0cmlidXRlLmZyb21TdHJpbmcocm5tMmF0dHJpYnV0ZS5leHRyYXMhLmF0dHJpYnV0ZU5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFwLnNldChqb2luZWRTdHJpbmcsIGF0dHJpYnV0ZVJuQWNjZXNzb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJuUHJpbWl0aXZlLnNldERhdGEobWFwLCByblByaW1pdGl2ZU1vZGUsIHJuTWF0ZXJpYWwsIGluZGljZXNSbkFjY2Vzc29yKTtcblxuICAgICAgICAvLyBtb3JwaCB0YXJnZXRzXG4gICAgICAgIGlmIChwcmltaXRpdmUudGFyZ2V0cyAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gc2V0IGRlZmF1bHQgbnVtYmVyXG4gICAgICAgICAgbGV0IG1heE1vcnBoVGFyZ2V0TnVtYmVyID0gQ29uZmlnLm1heE1vcnBoVGFyZ2V0TnVtYmVyO1xuICAgICAgICAgIGlmIChybkxvYWRlck9wdGlvbnM/Lm1heE1vcnBoVGFyZ2V0TnVtYmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1heE1vcnBoVGFyZ2V0TnVtYmVyID0gcm5Mb2FkZXJPcHRpb25zLm1heE1vcnBoVGFyZ2V0TnVtYmVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRhcmdldHM6IEFycmF5PE1hcDxWZXJ0ZXhBdHRyaWJ1dGVTZW1hbnRpY3NKb2luZWRTdHJpbmcsIEFjY2Vzc29yPj4gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByaW1pdGl2ZS50YXJnZXRzT2JqZWN0cyEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID49IG1heE1vcnBoVGFyZ2V0TnVtYmVyKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBwcmltaXRpdmUudGFyZ2V0c09iamVjdHMhW2ldO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0TWFwOiBNYXA8VmVydGV4QXR0cmlidXRlU2VtYW50aWNzSm9pbmVkU3RyaW5nLCBBY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29yID0gdGFyZ2V0W2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVSbkFjY2Vzc29yID0gdGhpcy5fX2dldFJuQnVmZmVyVmlld0FuZFJuQWNjZXNzb3IoXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlQWNjZXNzb3IsXG4gICAgICAgICAgICAgICAgcm5CdWZmZXJzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZVJuQWNjZXNzb3JJbkdQVVZlcnRleERhdGEgPVxuICAgICAgICAgICAgICAgIHRoaXMuX19jb3B5Um5BY2Nlc3NvckFuZEJ1ZmZlclZpZXcoYXR0cmlidXRlUm5BY2Nlc3Nvcik7XG4gICAgICAgICAgICAgIGNvbnN0IHZlcnRleEF0dHJpYnV0ZSA9IFZlcnRleEF0dHJpYnV0ZS5mcm9tU3RyaW5nKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICBjb25zdCBqb2luZWRTdHJpbmcgPVxuICAgICAgICAgICAgICAgIFZlcnRleEF0dHJpYnV0ZS50b1ZlcnRleEF0dHJpYnV0ZVNlbWFudGljSm9pbmVkU3RyaW5nQXNHbHRmU3R5bGUodmVydGV4QXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgdGFyZ2V0TWFwLnNldChqb2luZWRTdHJpbmcsIGF0dHJpYnV0ZVJuQWNjZXNzb3JJbkdQVVZlcnRleERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHRhcmdldE1hcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm5QcmltaXRpdmUuc2V0QmxlbmRTaGFwZVRhcmdldHModGFyZ2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcm5NZXNoLmFkZFByaW1pdGl2ZShyblByaW1pdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIG1lc2hDb21wb25lbnQuc2V0TWVzaChybk1lc2gpO1xuICAgICAgKGdsdGZNb2RlbC5hc3NldC5leHRyYXMgYXMgYW55KS5ybk1lc2hlc0F0R2x0TWVzaElkeFttZXNoSW5kZXhdID0gbmV3IFdlYWtSZWYocm5NZXNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVzaEVudGl0eTtcbiAgfVxuXG4gIHN0YXRpYyBzZXRTcGFyc2VBY2Nlc3NvcihhY2Nlc3NvcjogUm5NMkFjY2Vzc29yLCBybkFjY2Vzc29yOiBBY2Nlc3Nvcik6IHZvaWQge1xuICAgIGNvbnN0IGNvdW50ID0gYWNjZXNzb3Iuc3BhcnNlIS5jb3VudDtcblxuICAgIC8vIGdldCBzcGFyc2UgaW5kaWNlc1xuICAgIGNvbnN0IHNwYXJzZUluZGljZXMgPSBhY2Nlc3Nvci5zcGFyc2UhLmluZGljZXMhO1xuICAgIGNvbnN0IGluZGljZXNCdWZmZXJWaWV3ID0gc3BhcnNlSW5kaWNlcy5idWZmZXJWaWV3T2JqZWN0O1xuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXkgPSBzcGFyc2VJbmRpY2VzLmJ1ZmZlclZpZXdPYmplY3QuYnVmZmVyT2JqZWN0IS5idWZmZXIhO1xuICAgIGNvbnN0IGJ5dGVPZmZzZXRCdWZmZXJWaWV3QW5kU3BhcnNlSW5kaWNlczogbnVtYmVyID1cbiAgICAgIChpbmRpY2VzQnVmZmVyVmlldy5ieXRlT2Zmc2V0ID8/IDApICsgKHNwYXJzZUluZGljZXMuYnl0ZU9mZnNldCA/PyAwKTtcblxuICAgIGNvbnN0IGNvbXBvbmVudEJ5dGVzSW5kaWNlcyA9IHRoaXMuX2NoZWNrQnl0ZXNQZXJDb21wb25lbnQoc3BhcnNlSW5kaWNlcyk7XG4gICAgY29uc3QgYnl0ZUxlbmd0aEluZGljZXMgPSBjb21wb25lbnRCeXRlc0luZGljZXMgKiBjb3VudDsgLy8gaW5kZXggaXMgc2NhbGFyXG4gICAgY29uc3QgZGF0YVZpZXdJbmRpY2VzOiBhbnkgPSBuZXcgRGF0YVZpZXcoXG4gICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgYnl0ZU9mZnNldEJ1ZmZlclZpZXdBbmRTcGFyc2VJbmRpY2VzICsgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICBieXRlTGVuZ3RoSW5kaWNlc1xuICAgICk7XG5cbiAgICBjb25zdCBkYXRhVmlld01ldGhvZEluZGljZXMgPSB0aGlzLl9jaGVja0RhdGFWaWV3TWV0aG9kKHNwYXJzZUluZGljZXMpO1xuXG4gICAgLy8gZ2V0IHNwYXJzZSB2YWx1ZXNcbiAgICBjb25zdCBzcGFyc2VWYWx1ZXMgPSBhY2Nlc3Nvci5zcGFyc2UhLnZhbHVlcyE7XG4gICAgY29uc3QgdmFsdWVCdWZmZXJWaWV3ID0gc3BhcnNlVmFsdWVzLmJ1ZmZlclZpZXdPYmplY3Q7XG4gICAgYnVmZmVyID0gc3BhcnNlVmFsdWVzLmJ1ZmZlclZpZXdPYmplY3QuYnVmZmVyT2JqZWN0IS5idWZmZXIhO1xuICAgIGNvbnN0IGJ5dGVPZmZzZXRCdWZmZXJWaWV3QW5kQWNjZXNzb3JWYWx1ZXM6IG51bWJlciA9XG4gICAgICAodmFsdWVCdWZmZXJWaWV3LmJ5dGVPZmZzZXQgPz8gMCkgKyAoc3BhcnNlVmFsdWVzLmJ5dGVPZmZzZXQgPz8gMCk7XG5cbiAgICBjb25zdCBjb21wb25lbnRCeXRlc1ZhbHVlcyA9IHRoaXMuX2NoZWNrQnl0ZXNQZXJDb21wb25lbnQoYWNjZXNzb3IpO1xuICAgIGNvbnN0IGNvbXBvbmVudE5WYWx1ZXMgPSB0aGlzLl9jaGVja0NvbXBvbmVudE51bWJlcihhY2Nlc3Nvcik7XG4gICAgY29uc3QgYnl0ZUxlbmd0aFZhbHVlcyA9IGNvbXBvbmVudEJ5dGVzVmFsdWVzICogY29tcG9uZW50TlZhbHVlcyAqIGNvdW50O1xuICAgIGNvbnN0IGRhdGFWaWV3VmFsdWVzOiBhbnkgPSBuZXcgRGF0YVZpZXcoXG4gICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgYnl0ZU9mZnNldEJ1ZmZlclZpZXdBbmRBY2Nlc3NvclZhbHVlcyArIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgYnl0ZUxlbmd0aFZhbHVlc1xuICAgICk7XG4gICAgY29uc3QgZGF0YVZpZXdNZXRob2RWYWx1ZXMgPSB0aGlzLl9jaGVja0RhdGFWaWV3TWV0aG9kKGFjY2Vzc29yKTtcblxuICAgIC8vIHNldCBzcGFyc2UgdmFsdWVzIHRvIHJuQWNjZXNzb3JcbiAgICBjb25zdCB0eXBlZEFycmF5ID0gcm5BY2Nlc3Nvci5nZXRUeXBlZEFycmF5KCk7XG4gICAgY29uc3QgbGl0dGxlRW5kaWFuID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVZpZXdJbmRpY2VzW2RhdGFWaWV3TWV0aG9kSW5kaWNlc10oY29tcG9uZW50Qnl0ZXNJbmRpY2VzICogaSwgbGl0dGxlRW5kaWFuKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29tcG9uZW50TlZhbHVlczsgaisrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVZpZXdWYWx1ZXNbZGF0YVZpZXdNZXRob2RWYWx1ZXNdKFxuICAgICAgICAgIGNvbXBvbmVudEJ5dGVzVmFsdWVzICogY29tcG9uZW50TlZhbHVlcyAqIGkgKyBjb21wb25lbnRCeXRlc1ZhbHVlcyAqIGosXG4gICAgICAgICAgbGl0dGxlRW5kaWFuXG4gICAgICAgICk7XG4gICAgICAgIHR5cGVkQXJyYXlbaW5kZXggKiBjb21wb25lbnROVmFsdWVzICsgal0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX3NldFZSTTFNYXRlcmlhbChcbiAgICBnbHRmTW9kZWw6IFJuTTIsXG4gICAgbWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWwsXG4gICAgcm5Mb2FkZXJPcHRpb25zOiBHbHRmTG9hZE9wdGlvblxuICApOiBNYXRlcmlhbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgVlJNUHJvcGVydGllcyA9IGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTTtcblxuICAgIGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IG1hdGVyaWFsSnNvbi5leHRyYXMhLnZybTB4TWF0ZXJpYWxQcm9wZXJ0eSBhcyBWcm0weE1hdGVyaWFsUHJvcGVydHk7XG4gICAgY29uc3Qgc2hhZGVyTmFtZSA9IG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXI7XG4gICAgaWYgKHNoYWRlck5hbWUgPT09ICdWUk0vTVRvb24nKSB7XG4gICAgICAvLyBhcmd1bWVudFxuICAgICAgY29uc3QgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnQgPSBybkxvYWRlck9wdGlvbnMuZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSFbMF07XG5cbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxOYW1lID0gZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnQuYWRkaXRpb25hbE5hbWU7XG4gICAgICBjb25zdCBpc01vcnBoaW5nID0gdHJ1ZTsgLy90aGlzLl9faXNNb3JwaGluZyhub2RlLCBnbHRmTW9kZWwpO1xuICAgICAgY29uc3QgaXNTa2lubmluZyA9IHRydWU7IC8vIHRoaXMuX19pc1NraW5uaW5nKG5vZGUsIGdsdGZNb2RlbCk7XG4gICAgICBjb25zdCBpc0xpZ2h0aW5nID0gdGhpcy5fX2lzTGlnaHRpbmcoZ2x0Zk1vZGVsLCBtYXRlcmlhbEpzb24pO1xuICAgICAgY29uc3QgdXNlVGFuZ2VudEF0dHJpYnV0ZSA9IHRydWU7IC8vIHRoaXMuX191c2VUYW5nZW50QXR0cmlidXRlKGdsdGZNb2RlbCwgcHJpbWl0aXZlKTtcbiAgICAgIGNvbnN0IHRleHR1cmVzID0gZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnQudGV4dHVyZXM7XG4gICAgICBjb25zdCBzYW1wbGVycyA9IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50LnNhbXBsZXJzO1xuICAgICAgY29uc3QgZGVidWdNb2RlID0gZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnQuZGVidWdNb2RlO1xuICAgICAgY29uc3QgbWF4SW5zdGFuY2VzTnVtYmVyID0gZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnQubWF4SW5zdGFuY2VzTnVtYmVyO1xuICAgICAgY29uc3QgbWFrZU91dHB1dFNyZ2IgPSB0aGlzLl9fbWFrZU91dHB1dFNyZ2IoZ2x0Zk1vZGVsKTtcblxuICAgICAgLy8gb3V0bGluZVxuICAgICAgbGV0IHJlbmRlclBhc3NPdXRsaW5lO1xuICAgICAgY29uc3Qgcm5FeHRlbnNpb24gPSBWUk1Qcm9wZXJ0aWVzLnJuRXh0ZW5zaW9uO1xuICAgICAgaWYgKElzLmV4aXN0KHJuRXh0ZW5zaW9uKSkge1xuICAgICAgICByZW5kZXJQYXNzT3V0bGluZSA9IHJuRXh0ZW5zaW9uLnJlbmRlclBhc3NPdXRsaW5lO1xuICAgICAgICByZW5kZXJQYXNzT3V0bGluZS5pc1ZyUmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVuZGVyUGFzc091dGxpbmUudHJ5VG9TZXRVbmlxdWVOYW1lKCdWUk0gT3V0bGluZSBSZW5kZXJQYXNzJywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vZXhpc3Qgb3V0bGluZVxuICAgICAgaWYgKHJlbmRlclBhc3NPdXRsaW5lICE9IG51bGwpIHtcbiAgICAgICAgbGV0IG91dGxpbmVNYXRlcmlhbDogTWF0ZXJpYWwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChtYXRlcmlhbFByb3BlcnRpZXMuZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhNb2RlICE9PSAwKSB7XG4gICAgICAgICAgb3V0bGluZU1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlTVRvb25NYXRlcmlhbCh7XG4gICAgICAgICAgICBhZGRpdGlvbmFsTmFtZSxcbiAgICAgICAgICAgIGlzTW9ycGhpbmcsXG4gICAgICAgICAgICBpc1NraW5uaW5nLFxuICAgICAgICAgICAgaXNMaWdodGluZyxcbiAgICAgICAgICAgIHVzZVRhbmdlbnRBdHRyaWJ1dGUsXG4gICAgICAgICAgICBpc091dGxpbmU6IHRydWUsXG4gICAgICAgICAgICBtYXRlcmlhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICB0ZXh0dXJlcyxcbiAgICAgICAgICAgIHNhbXBsZXJzLFxuICAgICAgICAgICAgZGVidWdNb2RlLFxuICAgICAgICAgICAgbWF4SW5zdGFuY2VzTnVtYmVyLFxuICAgICAgICAgICAgbWFrZU91dHB1dFNyZ2IsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoSXMuZXhpc3Qob3V0bGluZU1hdGVyaWFsKSkge1xuICAgICAgICAgIG1hdGVyaWFsSnNvbi5leHRyYXMhLm91dGxpbmVNYXRlcmlhbCA9IG5ldyBXZWFrUmVmKG91dGxpbmVNYXRlcmlhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVNVG9vbk1hdGVyaWFsKHtcbiAgICAgICAgYWRkaXRpb25hbE5hbWUsXG4gICAgICAgIGlzTW9ycGhpbmcsXG4gICAgICAgIGlzU2tpbm5pbmcsXG4gICAgICAgIGlzTGlnaHRpbmcsXG4gICAgICAgIHVzZVRhbmdlbnRBdHRyaWJ1dGUsXG4gICAgICAgIGlzT3V0bGluZTogZmFsc2UsXG4gICAgICAgIG1hdGVyaWFsUHJvcGVydGllcyxcbiAgICAgICAgdGV4dHVyZXMsXG4gICAgICAgIHNhbXBsZXJzLFxuICAgICAgICBkZWJ1Z01vZGUsXG4gICAgICAgIG1heEluc3RhbmNlc051bWJlcixcbiAgICAgICAgbWFrZU91dHB1dFNyZ2IsXG4gICAgICB9KTtcblxuICAgICAgTW9kZWxDb252ZXJ0ZXIuc2V0TVRvb25UZXh0dXJlcyh0ZXh0dXJlcywgbWF0ZXJpYWxQcm9wZXJ0aWVzLCBtYXRlcmlhbCwgc2FtcGxlcnMpO1xuXG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfVxuXG4gICAgLy8gdXNlIGFub3RoZXIgbWF0ZXJpYWxcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0TVRvb25UZXh0dXJlcyhcbiAgICB0ZXh0dXJlczogYW55LFxuICAgIG1hdGVyaWFsUHJvcGVydGllczogVnJtMHhNYXRlcmlhbFByb3BlcnR5LFxuICAgIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgICBzYW1wbGVyczogYW55XG4gICkge1xuICAgIGNvbnN0IGxpdENvbG9yVGV4dHVyZSA9IHRleHR1cmVzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fTWFpblRleF07XG4gICAgaWYgKGxpdENvbG9yVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKFxuICAgICAgICAnbGl0Q29sb3JUZXh0dXJlJyxcbiAgICAgICAgbGl0Q29sb3JUZXh0dXJlLFxuICAgICAgICBzYW1wbGVyc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX01haW5UZXhdXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzaGFkZUNvbG9yVGV4dHVyZSA9IHRleHR1cmVzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fU2hhZGVUZXh0dXJlXTtcbiAgICBpZiAoc2hhZGVDb2xvclRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgJ3NoYWRlQ29sb3JUZXh0dXJlJyxcbiAgICAgICAgc2hhZGVDb2xvclRleHR1cmUsXG4gICAgICAgIHNhbXBsZXJzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fU2hhZGVUZXh0dXJlXVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZVNoYWRvd1RleHR1cmUgPVxuICAgICAgdGV4dHVyZXNbbWF0ZXJpYWxQcm9wZXJ0aWVzLnRleHR1cmVQcm9wZXJ0aWVzLl9SZWNlaXZlU2hhZG93VGV4dHVyZV07XG4gICAgaWYgKHJlY2VpdmVTaGFkb3dUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoXG4gICAgICAgICdyZWNlaXZlU2hhZG93VGV4dHVyZScsXG4gICAgICAgIHJlY2VpdmVTaGFkb3dUZXh0dXJlLFxuICAgICAgICBzYW1wbGVyc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX1JlY2VpdmVTaGFkb3dUZXh0dXJlXVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhZGluZ0dyYWRlVGV4dHVyZSA9IHRleHR1cmVzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fU2hhZGluZ0dyYWRlVGV4dHVyZV07XG4gICAgaWYgKHNoYWRpbmdHcmFkZVRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgJ3NoYWRpbmdHcmFkZVRleHR1cmUnLFxuICAgICAgICBzaGFkaW5nR3JhZGVUZXh0dXJlLFxuICAgICAgICBzYW1wbGVyc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX1NoYWRpbmdHcmFkZVRleHR1cmVdXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByaW1UZXh0dXJlID0gdGV4dHVyZXNbbWF0ZXJpYWxQcm9wZXJ0aWVzLnRleHR1cmVQcm9wZXJ0aWVzLl9SaW1UZXh0dXJlXTtcbiAgICBpZiAocmltVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKFxuICAgICAgICAncmltVGV4dHVyZScsXG4gICAgICAgIHJpbVRleHR1cmUsXG4gICAgICAgIHNhbXBsZXJzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fUmltVGV4dHVyZV1cbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1hdENhcFRleHR1cmUgPSB0ZXh0dXJlc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX1NwaGVyZUFkZF07XG4gICAgaWYgKG1hdENhcFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgJ21hdENhcFRleHR1cmUnLFxuICAgICAgICBtYXRDYXBUZXh0dXJlLFxuICAgICAgICBzYW1wbGVyc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX1NwaGVyZUFkZF1cbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGVtaXNzaW9uVGV4dHVyZSA9IHRleHR1cmVzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fRW1pc3Npb25NYXBdO1xuICAgIGlmIChlbWlzc2lvblRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgJ2VtaXNzaW9uVGV4dHVyZScsXG4gICAgICAgIGVtaXNzaW9uVGV4dHVyZSxcbiAgICAgICAgc2FtcGxlcnNbbWF0ZXJpYWxQcm9wZXJ0aWVzLnRleHR1cmVQcm9wZXJ0aWVzLl9FbWlzc2lvbk1hcF1cbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbFRleHR1cmUgPSB0ZXh0dXJlc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX0J1bXBNYXBdO1xuICAgIGlmIChub3JtYWxUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoXG4gICAgICAgICdub3JtYWxUZXh0dXJlJyxcbiAgICAgICAgbm9ybWFsVGV4dHVyZSxcbiAgICAgICAgc2FtcGxlcnNbbWF0ZXJpYWxQcm9wZXJ0aWVzLnRleHR1cmVQcm9wZXJ0aWVzLl9CdW1wTWFwXVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0bGluZVdpZHRoVGV4dHVyZSA9IHRleHR1cmVzW21hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcy5fT3V0bGluZVdpZHRoVGV4dHVyZV07XG4gICAgaWYgKG91dGxpbmVXaWR0aFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgJ291dGxpbmVXaWR0aFRleHR1cmUnLFxuICAgICAgICBvdXRsaW5lV2lkdGhUZXh0dXJlLFxuICAgICAgICBzYW1wbGVyc1ttYXRlcmlhbFByb3BlcnRpZXMudGV4dHVyZVByb3BlcnRpZXMuX091dGxpbmVXaWR0aFRleHR1cmVdXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2V0VlJNMHhNYXRlcmlhbChcbiAgICBnbHRmTW9kZWw6IFJuTTIsXG4gICAgLy8gcHJpbWl0aXZlOiBSbk0yUHJpbWl0aXZlLFxuICAgIG1hdGVyaWFsSnNvbjogUm5NMk1hdGVyaWFsLFxuICAgIHJuTG9hZGVyT3B0aW9uczogR2x0ZkxvYWRPcHRpb25cbiAgKTogTWF0ZXJpYWwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IFZSTVByb3BlcnRpZXMgPSBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk07XG5cbiAgICBjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBtYXRlcmlhbEpzb24uZXh0cmFzIS52cm0weE1hdGVyaWFsUHJvcGVydHkgYXMgVnJtMHhNYXRlcmlhbFByb3BlcnR5O1xuICAgIGNvbnN0IHNoYWRlck5hbWUgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyO1xuICAgIGlmIChzaGFkZXJOYW1lID09PSAnVlJNL01Ub29uJykge1xuICAgICAgLy8gYXJndW1lbnRcbiAgICAgIGNvbnN0IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50ID0gcm5Mb2FkZXJPcHRpb25zLmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkhWzBdO1xuXG4gICAgICBjb25zdCBhZGRpdGlvbmFsTmFtZSA9IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50LmFkZGl0aW9uYWxOYW1lO1xuICAgICAgY29uc3QgaXNNb3JwaGluZyA9IHRydWU7IC8vdGhpcy5fX2lzTW9ycGhpbmcobm9kZSwgZ2x0Zk1vZGVsKTtcbiAgICAgIGNvbnN0IGlzU2tpbm5pbmcgPSB0cnVlOyAvL3RoaXMuX19pc1NraW5uaW5nKG5vZGUsIGdsdGZNb2RlbCk7XG4gICAgICBjb25zdCBpc0xpZ2h0aW5nID0gdGhpcy5fX2lzTGlnaHRpbmcoZ2x0Zk1vZGVsLCBtYXRlcmlhbEpzb24pO1xuICAgICAgY29uc3QgdXNlVGFuZ2VudEF0dHJpYnV0ZSA9IHRydWU7XG4gICAgICBjb25zdCB0ZXh0dXJlcyA9IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50LnRleHR1cmVzO1xuICAgICAgY29uc3Qgc2FtcGxlcnMgPSBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudC5zYW1wbGVycztcbiAgICAgIGNvbnN0IGRlYnVnTW9kZSA9IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50LmRlYnVnTW9kZTtcbiAgICAgIGNvbnN0IG1heEluc3RhbmNlc051bWJlciA9IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50Lm1heEluc3RhbmNlc051bWJlcjtcbiAgICAgIGNvbnN0IG1ha2VPdXRwdXRTcmdiID0gdGhpcy5fX21ha2VPdXRwdXRTcmdiKGdsdGZNb2RlbCk7XG5cbiAgICAgIC8vIG91dGxpbmVcbiAgICAgIGxldCByZW5kZXJQYXNzT3V0bGluZTtcbiAgICAgIGNvbnN0IHJuRXh0ZW5zaW9uID0gVlJNUHJvcGVydGllcy5ybkV4dGVuc2lvbjtcbiAgICAgIGlmIChJcy5leGlzdChybkV4dGVuc2lvbikpIHtcbiAgICAgICAgcmVuZGVyUGFzc091dGxpbmUgPSBybkV4dGVuc2lvbi5yZW5kZXJQYXNzT3V0bGluZTtcbiAgICAgICAgcmVuZGVyUGFzc091dGxpbmUuaXNWclJlbmRlcmluZyA9IHRydWU7XG4gICAgICAgIHJlbmRlclBhc3NPdXRsaW5lLnRyeVRvU2V0VW5pcXVlTmFtZSgnVlJNIE91dGxpbmUgUmVuZGVyUGFzcycsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvL2V4aXN0IG91dGxpbmVcbiAgICAgIGlmIChyZW5kZXJQYXNzT3V0bGluZSAhPSBudWxsKSB7XG4gICAgICAgIGxldCBvdXRsaW5lTWF0ZXJpYWw6IE1hdGVyaWFsIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLmZsb2F0UHJvcGVydGllcy5fT3V0bGluZVdpZHRoTW9kZSAhPT0gMCkge1xuICAgICAgICAgIG91dGxpbmVNYXRlcmlhbCA9IE1hdGVyaWFsSGVscGVyLmNyZWF0ZU1Ub29uTWF0ZXJpYWwoe1xuICAgICAgICAgICAgYWRkaXRpb25hbE5hbWUsXG4gICAgICAgICAgICBpc01vcnBoaW5nLFxuICAgICAgICAgICAgaXNTa2lubmluZyxcbiAgICAgICAgICAgIGlzTGlnaHRpbmcsXG4gICAgICAgICAgICB1c2VUYW5nZW50QXR0cmlidXRlLFxuICAgICAgICAgICAgaXNPdXRsaW5lOiB0cnVlLFxuICAgICAgICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdGV4dHVyZXMsXG4gICAgICAgICAgICBzYW1wbGVycyxcbiAgICAgICAgICAgIGRlYnVnTW9kZSxcbiAgICAgICAgICAgIG1heEluc3RhbmNlc051bWJlcixcbiAgICAgICAgICAgIG1ha2VPdXRwdXRTcmdiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKElzLmV4aXN0KG91dGxpbmVNYXRlcmlhbCkpIHtcbiAgICAgICAgICBtYXRlcmlhbEpzb24uZXh0cmFzIS5vdXRsaW5lTWF0ZXJpYWwgPSBuZXcgV2Vha1JlZihvdXRsaW5lTWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlTVRvb25NYXRlcmlhbCh7XG4gICAgICAgIGFkZGl0aW9uYWxOYW1lLFxuICAgICAgICBpc01vcnBoaW5nLFxuICAgICAgICBpc1NraW5uaW5nLFxuICAgICAgICBpc0xpZ2h0aW5nLFxuICAgICAgICB1c2VUYW5nZW50QXR0cmlidXRlLFxuICAgICAgICBpc091dGxpbmU6IGZhbHNlLFxuICAgICAgICBtYXRlcmlhbFByb3BlcnRpZXMsXG4gICAgICAgIHRleHR1cmVzLFxuICAgICAgICBzYW1wbGVycyxcbiAgICAgICAgZGVidWdNb2RlLFxuICAgICAgICBtYXhJbnN0YW5jZXNOdW1iZXIsXG4gICAgICAgIG1ha2VPdXRwdXRTcmdiLFxuICAgICAgfSk7XG5cbiAgICAgIE1vZGVsQ29udmVydGVyLnNldE1Ub29uVGV4dHVyZXModGV4dHVyZXMsIG1hdGVyaWFsUHJvcGVydGllcywgbWF0ZXJpYWwsIHNhbXBsZXJzKTtcblxuICAgICAgcmV0dXJuIG1hdGVyaWFsO1xuICAgIH1cblxuICAgIC8vIHVzZSBhbm90aGVyIG1hdGVyaWFsXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2VuZXJhdGVBcHByb3ByaWF0ZU1hdGVyaWFsKFxuICAgIGdsdGZNb2RlbDogUm5NMixcbiAgICBtYXRlcmlhbEpzb24/OiBSbk0yTWF0ZXJpYWxcbiAgKTogTWF0ZXJpYWwge1xuICAgIGNvbnN0IGlzVHJhbnNsdWNlbnQgPSBJcy5leGlzdChtYXRlcmlhbEpzb24/LmV4dGVuc2lvbnM/LktIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uKTtcbiAgICAvLyBpZiBybkxvYWRlck9wdGlvbnMgaXMgc2V0IHNvbWV0aGluZywgZG8gc3BlY2lhbCBkZWFsXG4gICAgaWYgKGdsdGZNb2RlbC5hc3NldC5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBybkxvYWRlck9wdGlvbnMgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzLnJuTG9hZGVyT3B0aW9ucztcblxuICAgICAgLy8gRm9yIHNwZWNpZmllZCBsb2FkZXIgZXh0ZW5zaW9uXG4gICAgICBpZiAoXG4gICAgICAgIHJuTG9hZGVyT3B0aW9ucy5sb2FkZXJFeHRlbnNpb24/LmlzTmVlZGVkVG9Vc2VUaGlzTWF0ZXJpYWwgIT0gbnVsbCAmJlxuICAgICAgICBybkxvYWRlck9wdGlvbnMubG9hZGVyRXh0ZW5zaW9uLmlzTmVlZGVkVG9Vc2VUaGlzTWF0ZXJpYWwoZ2x0Zk1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlckV4dGVuc2lvbiA9IGdsdGZNb2RlbC5hc3NldC5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucz8ubG9hZGVyRXh0ZW5zaW9uO1xuICAgICAgICBpZiAobG9hZGVyRXh0ZW5zaW9uPy5nZW5lcmF0ZU1hdGVyaWFsICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbG9hZGVyRXh0ZW5zaW9uLmdlbmVyYXRlTWF0ZXJpYWwobWF0ZXJpYWxKc29uISk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFZSTTB4XG4gICAgICBpZiAocm5Mb2FkZXJPcHRpb25zLl9faXNJbXBvcnRWUk0weCkge1xuICAgICAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMuX19zZXRWUk0weE1hdGVyaWFsKGdsdGZNb2RlbCwgbWF0ZXJpYWxKc29uISwgcm5Mb2FkZXJPcHRpb25zKTtcbiAgICAgICAgaWYgKElzLmV4aXN0KG1hdGVyaWFsKSkge1xuICAgICAgICAgIG1hdGVyaWFsLmlzVHJhbnNsdWNlbnQgPSBpc1RyYW5zbHVjZW50O1xuICAgICAgICAgIHJldHVybiBtYXRlcmlhbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3Igc3BlY2lmaWVkIGRlZmF1bHQgbWF0ZXJpYWwgaGVscGVyXG4gICAgICBjb25zdCBtYXRlcmlhbEhlbHBlck5hbWUgPSBybkxvYWRlck9wdGlvbnMuZGVmYXVsdE1hdGVyaWFsSGVscGVyTmFtZTtcbiAgICAgIGlmIChtYXRlcmlhbEhlbHBlck5hbWUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gKE1hdGVyaWFsSGVscGVyIGFzIGFueSlbbWF0ZXJpYWxIZWxwZXJOYW1lXShcbiAgICAgICAgICAuLi5ybkxvYWRlck9wdGlvbnMuZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSFcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwcmUgZGF0YVxuICAgIGNvbnN0IGlzTW9ycGhpbmcgPSB0cnVlOyAvLyB0aGlzLl9faXNNb3JwaGluZyhub2RlLCBnbHRmTW9kZWwpO1xuICAgIGNvbnN0IGlzU2tpbm5pbmcgPSB0cnVlOyAvL3RoaXMuX19pc1NraW5uaW5nKG5vZGUsIGdsdGZNb2RlbCk7XG4gICAgY29uc3QgaXNMaWdodGluZyA9IHRoaXMuX19pc0xpZ2h0aW5nKGdsdGZNb2RlbCwgbWF0ZXJpYWxKc29uKTtcbiAgICBjb25zdCBhZGRpdGlvbmFsTmFtZSA9ICcnO1xuXG4gICAgaWYgKElzLmV4aXN0KG1hdGVyaWFsSnNvbikpIHtcbiAgICAgIGlmIChtYXRlcmlhbEpzb24uZXh0ZW5zaW9ucz8uVlJNQ19tYXRlcmlhbHNfbXRvb24gIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBybkxvYWRlck9wdGlvbnMgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIS5ybkxvYWRlck9wdGlvbnMhO1xuICAgICAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMuX19zZXRWUk0xTWF0ZXJpYWwoZ2x0Zk1vZGVsLCBtYXRlcmlhbEpzb24sIHJuTG9hZGVyT3B0aW9ucyk7XG4gICAgICAgIGlmIChJcy5leGlzdChtYXRlcmlhbCkpIHtcbiAgICAgICAgICBtYXRlcmlhbC5pc1RyYW5zbHVjZW50ID0gaXNUcmFuc2x1Y2VudDtcbiAgICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYXhNYXRlcmlhbEluc3RhbmNlTnVtYmVyOiBudW1iZXIgPSBDb25maWcubWF4TWF0ZXJpYWxJbnN0YW5jZUZvckVhY2hUeXBlO1xuICAgIGlmIChwYXJzZUZsb2F0KGdsdGZNb2RlbC5hc3NldD8udmVyc2lvbikgPj0gMikge1xuICAgICAgY29uc3Qgcm5Mb2FkZXJPcHRpb25zID0gZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcz8ucm5Mb2FkZXJPcHRpb25zID8/IHt9O1xuICAgICAgLy8gRm9yIGdsVEYgMlxuICAgICAgY29uc3QgdXNlVGFuZ2VudEF0dHJpYnV0ZSA9IHRydWU7IC8vdGhpcy5fX3VzZVRhbmdlbnRBdHRyaWJ1dGUoZ2x0Zk1vZGVsLCBwcmltaXRpdmUpO1xuICAgICAgY29uc3QgdXNlTm9ybWFsVGV4dHVyZSA9IHRoaXMuX191c2VOb3JtYWxUZXh0dXJlKGdsdGZNb2RlbCk7XG4gICAgICBjb25zdCBtYXRlcmlhbCA9IE1hdGVyaWFsSGVscGVyLmNyZWF0ZVBiclViZXJNYXRlcmlhbCh7XG4gICAgICAgIGlzTW9ycGhpbmcsXG4gICAgICAgIGlzU2tpbm5pbmcsXG4gICAgICAgIGlzTGlnaHRpbmcsXG4gICAgICAgIGlzQ2xlYXJDb2F0OiBJcy5leGlzdChtYXRlcmlhbEpzb24/LmV4dGVuc2lvbnM/LktIUl9tYXRlcmlhbHNfY2xlYXJjb2F0KSxcbiAgICAgICAgaXNUcmFuc21pc3Npb246IElzLmV4aXN0KG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc190cmFuc21pc3Npb24pLFxuICAgICAgICBpc1ZvbHVtZTogSXMuZXhpc3QobWF0ZXJpYWxKc29uPy5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX3ZvbHVtZSksXG4gICAgICAgIGlzU2hlZW46IElzLmV4aXN0KG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc19zaGVlbiksXG4gICAgICAgIGlzU3BlY3VsYXI6IElzLmV4aXN0KG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc19zcGVjdWxhciksXG4gICAgICAgIGlzSXJpZGVzY2VuY2U6IElzLmV4aXN0KG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZSksXG4gICAgICAgIGlzQW5pc290cm9weTogSXMuZXhpc3QobWF0ZXJpYWxKc29uPy5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX2FuaXNvdHJvcHkpLFxuICAgICAgICBpc1NoYWRvdzogcm5Mb2FkZXJPcHRpb25zLnNoYWRvdyA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgdXNlVGFuZ2VudEF0dHJpYnV0ZSxcbiAgICAgICAgdXNlTm9ybWFsVGV4dHVyZSxcbiAgICAgICAgYWRkaXRpb25hbE5hbWU6IGFkZGl0aW9uYWxOYW1lLFxuICAgICAgICBtYXhJbnN0YW5jZXNOdW1iZXI6IG1heE1hdGVyaWFsSW5zdGFuY2VOdW1iZXIsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1ha2VPdXRwdXRTcmdiID0gdGhpcy5fX21ha2VPdXRwdXRTcmdiKGdsdGZNb2RlbCk7XG4gICAgICBpZiAoSXMuZXhpc3QobWFrZU91dHB1dFNyZ2IpKSB7XG4gICAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignbWFrZU91dHB1dFNyZ2InLCBtYWtlT3V0cHV0U3JnYik7XG4gICAgICB9XG4gICAgICBtYXRlcmlhbC5pc1RyYW5zbHVjZW50ID0gaXNUcmFuc2x1Y2VudDtcbiAgICAgIHJldHVybiBtYXRlcmlhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGdsVEYgMVxuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBNYXRlcmlhbEhlbHBlci5jcmVhdGVDbGFzc2ljVWJlck1hdGVyaWFsKHtcbiAgICAgICAgaXNTa2lubmluZyxcbiAgICAgICAgaXNMaWdodGluZyxcbiAgICAgICAgYWRkaXRpb25hbE5hbWU6IGFkZGl0aW9uYWxOYW1lLFxuICAgICAgICBtYXhJbnN0YW5jZXNOdW1iZXI6IG1heE1hdGVyaWFsSW5zdGFuY2VOdW1iZXIsXG4gICAgICB9KTtcbiAgICAgIG1hdGVyaWFsLmlzVHJhbnNsdWNlbnQgPSBpc1RyYW5zbHVjZW50O1xuICAgICAgcmV0dXJuIG1hdGVyaWFsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9faXNMaWdodGluZyhnbHRmTW9kZWw6IFJuTTIsIG1hdGVyaWFsSnNvbj86IFJuTTJNYXRlcmlhbCkge1xuICAgIGNvbnN0IGFyZ3VtZW50ID1cbiAgICAgIGdsdGZNb2RlbD8uYXNzZXQ/LmV4dHJhcz8ucm5Mb2FkZXJPcHRpb25zPy5kZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5IVswXTtcbiAgICBpZiAoYXJndW1lbnQ/LmlzTGlnaHRpbmcgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50LmlzTGlnaHRpbmcgYXMgYm9vbGVhbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc191bmxpdCAhPSBudWxsID8gZmFsc2UgOiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByaXZhdGUgc3RhdGljIF9faXNTa2lubmluZyhub2RlOiBSbk0yTm9kZSwgZ2x0Zk1vZGVsOiBSbk0yKSB7XG4gIC8vICAgY29uc3QgYXJndW1lbnQgPVxuICAvLyAgICAgZ2x0Zk1vZGVsPy5hc3NldD8uZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM/LmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkhWzBdO1xuICAvLyAgIGlmIChhcmd1bWVudD8uaXNTa2lubmluZyA9PT0gZmFsc2UpIHtcbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgcmV0dXJuIG5vZGUuc2tpbiAhPSBudWxsO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fdXNlVGFuZ2VudEF0dHJpYnV0ZShnbHRmTW9kZWw6IFJuTTIsIHByaW1pdGl2ZTogUm5NMlByaW1pdGl2ZSkge1xuICAgIGNvbnN0IHRhbmdlbnRDYWxjdWxhdGlvbk1vZGUgPVxuICAgICAgZ2x0Zk1vZGVsPy5hc3NldD8uZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM/LnRhbmdlbnRDYWxjdWxhdGlvbk1vZGU7XG5cbiAgICBzd2l0Y2ggKHRhbmdlbnRDYWxjdWxhdGlvbk1vZGUpIHtcbiAgICAgIGNhc2UgMDogLy8gZG8gbm90IHVzZSBub3JtYWwgbWFwXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgMTogLy8gdGFuZ2VudCBhdHRyaWJ1dGUgKyBjYWxjdWxhdGVkIHRhbmdlbnQgaW4gc2hhZGVyXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOiAvLyB0YW5nZW50IGF0dHJpYnV0ZSArIHByZS1jYWxjdWxhdGVkIHRhbmdlbnRcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIDM6IC8vIGZvcmNlIGNhbGMgaW4gc2hhZGVyXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgNDogLy8gZm9yY2UgcHJlLWNhbGNcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIGluIHByaW1pdGl2ZS5hdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0cmlidXRlID09PSAnVEFOR0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fdXNlTm9ybWFsVGV4dHVyZShnbHRmTW9kZWw6IFJuTTIpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9XG4gICAgICBnbHRmTW9kZWw/LmFzc2V0Py5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucz8uZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSFbMF07XG4gICAgaWYgKGFyZ3VtZW50Py51c2VOb3JtYWxUZXh0dXJlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2x0Zk1vZGVsPy5hc3NldD8uZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM/LnRhbmdlbnRDYWxjdWxhdGlvbk1vZGUgIT09IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19tYWtlT3V0cHV0U3JnYihnbHRmTW9kZWw6IFJuTTIpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9XG4gICAgICBnbHRmTW9kZWw/LmFzc2V0Py5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucz8uZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSFbMF07XG4gICAgcmV0dXJuIGFyZ3VtZW50Py5tYWtlT3V0cHV0U3JnYiBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19zZXR1cE1hdGVyaWFsKGdsdGZNb2RlbDogUm5NMiwgbWF0ZXJpYWxKc29uPzogUm5NMk1hdGVyaWFsKTogTWF0ZXJpYWwge1xuICAgIGNvbnN0IGlzVW5saXQgPSBtYXRlcmlhbEpzb24/LmV4dGVuc2lvbnM/LktIUl9tYXRlcmlhbHNfdW5saXQgIT0gbnVsbDtcblxuICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHRoaXMuX19nZW5lcmF0ZUFwcHJvcHJpYXRlTWF0ZXJpYWwoZ2x0Zk1vZGVsLCBtYXRlcmlhbEpzb24pO1xuXG4gICAgLy8gYXZvaWQgdW5leHBlY3RlZCBpbml0aWFsaXphdGlvblxuICAgIGlmICghdGhpcy5fX25lZWRQYXJhbWV0ZXJJbml0aWFsaXphdGlvbihtYXRlcmlhbEpzb24hLCBtYXRlcmlhbC5tYXRlcmlhbFR5cGVOYW1lKSlcbiAgICAgIHJldHVybiBtYXRlcmlhbDtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIS5ybkxvYWRlck9wdGlvbnM7XG4gICAgY29uc3QgcGJyTWV0YWxsaWNSb3VnaG5lc3MgPSBtYXRlcmlhbEpzb24/LnBick1ldGFsbGljUm91Z2huZXNzO1xuICAgIGlmIChwYnJNZXRhbGxpY1JvdWdobmVzcyAhPSBudWxsKSB7XG4gICAgICAvLyBCYXNlQ29sb3IgRmFjdG9yXG4gICAgICBzZXR1cFBick1ldGFsbGljUm91Z2huZXNzKHBick1ldGFsbGljUm91Z2huZXNzLCBtYXRlcmlhbCwgZ2x0Zk1vZGVsLCBvcHRpb25zLCBtYXRlcmlhbEpzb24hKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBhcmFtOiBJbmRleCA9IFNoYWRpbmdNb2RlbC5QaG9uZy5pbmRleDtcbiAgICAgIGlmIChtYXRlcmlhbEpzb24/LmV4dHJhcz8udGVjaG5pcXVlKSB7XG4gICAgICAgIHN3aXRjaCAobWF0ZXJpYWxKc29uLmV4dHJhcy50ZWNobmlxdWUpIHtcbiAgICAgICAgICBjYXNlIFNoYWRpbmdNb2RlbC5Db25zdGFudC5zdHI6XG4gICAgICAgICAgICBwYXJhbSA9IFNoYWRpbmdNb2RlbC5Db25zdGFudC5pbmRleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2hhZGluZ01vZGVsLkxhbWJlcnQuc3RyOlxuICAgICAgICAgICAgcGFyYW0gPSBTaGFkaW5nTW9kZWwuTGFtYmVydC5pbmRleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2hhZGluZ01vZGVsLkJsaW5uUGhvbmcuc3RyOlxuICAgICAgICAgICAgcGFyYW0gPSBTaGFkaW5nTW9kZWwuQmxpbm5QaG9uZy5pbmRleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2hhZGluZ01vZGVsLlBob25nLnN0cjpcbiAgICAgICAgICAgIHBhcmFtID0gU2hhZGluZ01vZGVsLlBob25nLmluZGV4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdzaGFkaW5nTW9kZWwnLCBTY2FsYXIuZnJvbUNvcHlOdW1iZXIocGFyYW0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbWlzc2l2ZUZhY3RvciA9IGlzVW5saXQgPyAoWzAsIDAsIDBdIGFzIEFycmF5MzxudW1iZXI+KSA6IG1hdGVyaWFsSnNvbj8uZW1pc3NpdmVGYWN0b3I7XG4gICAgaWYgKGVtaXNzaXZlRmFjdG9yICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignZW1pc3NpdmVGYWN0b3InLCBWZWN0b3IzLmZyb21Db3B5QXJyYXkzKGVtaXNzaXZlRmFjdG9yKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW1pc3NpdmVUZXh0dXJlID0gbWF0ZXJpYWxKc29uPy5lbWlzc2l2ZVRleHR1cmU7XG4gICAgaWYgKGVtaXNzaXZlVGV4dHVyZSAhPSBudWxsICYmIElzLmZhbHN5KGlzVW5saXQpKSB7XG4gICAgICBjb25zdCByblRleHR1cmUgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlVGV4dHVyZShlbWlzc2l2ZVRleHR1cmUudGV4dHVyZSEsIGdsdGZNb2RlbCk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihlbWlzc2l2ZVRleHR1cmUudGV4dHVyZSEpO1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcignZW1pc3NpdmVUZXh0dXJlJywgcm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgICAgaWYgKHBhcnNlRmxvYXQoZ2x0Zk1vZGVsLmFzc2V0Py52ZXJzaW9uKSA+PSAyICYmIGVtaXNzaXZlVGV4dHVyZS50ZXhDb29yZCAhPSBudWxsKSB7XG4gICAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignZW1pc3NpdmVUZXhjb29yZEluZGV4JywgZW1pc3NpdmVUZXh0dXJlLnRleENvb3JkKTtcbiAgICAgIH1cbiAgICAgIE1vZGVsQ29udmVydGVyLl9zZXR1cFRleHR1cmVUcmFuc2Zvcm0oXG4gICAgICAgIGVtaXNzaXZlVGV4dHVyZSEsXG4gICAgICAgIG1hdGVyaWFsLFxuICAgICAgICAnZW1pc3NpdmVUZXh0dXJlVHJhbnNmb3JtJyxcbiAgICAgICAgJ2VtaXNzaXZlVGV4dHVyZVJvdGF0aW9uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYWxwaGFNb2RlID0gbWF0ZXJpYWxKc29uPy5hbHBoYU1vZGU7XG4gICAgaWYgKG9wdGlvbnM/LmFscGhhTW9kZSkge1xuICAgICAgYWxwaGFNb2RlID0gb3B0aW9ucy5hbHBoYU1vZGU7XG4gICAgfVxuICAgIGlmIChhbHBoYU1vZGUgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuYWxwaGFNb2RlID0gQWxwaGFNb2RlLmZyb21HbFRGU3RyaW5nKGFscGhhTW9kZSkhO1xuXG4gICAgICAvLyBzZXQgYWxwaGEgdGhyZXNob2xkIGV4Y2VwdCBmb3IgVlJNXG4gICAgICBpZiAoXG4gICAgICAgIG1hdGVyaWFsLmFscGhhTW9kZSA9PT0gQWxwaGFNb2RlLk1hc2sgJiZcbiAgICAgICAgIWdsdGZNb2RlbC5hc3NldC5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucz8uX19pc0ltcG9ydFZSTTB4XG4gICAgICApIHtcbiAgICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKFxuICAgICAgICAgICdhbHBoYUN1dG9mZicsXG4gICAgICAgICAgU2NhbGFyLmZyb21Db3B5TnVtYmVyKG1hdGVyaWFsSnNvbj8uYWxwaGFDdXRvZmYgPz8gMC41KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXRlcmlhbC5pc1RyYW5zbHVjZW50ID0gSXMuZXhpc3QobWF0ZXJpYWxKc29uPy5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX3RyYW5zbWlzc2lvbik7XG5cbiAgICBjb25zdCBkb3VibGVTaWRlZCA9IG1hdGVyaWFsSnNvbj8uZG91YmxlU2lkZWQ7XG4gICAgaWYgKGRvdWJsZVNpZGVkICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLmN1bGxGYWNlID0gIWRvdWJsZVNpZGVkO1xuICAgIH1cblxuICAgIC8vIEZvciBnbFRGMS4wXG4gICAgaWYgKElzLmV4aXN0KChtYXRlcmlhbEpzb24gYXMgYW55KS5kaWZmdXNlQ29sb3JUZXh0dXJlKSkge1xuICAgICAgY29uc3QgZGlmZnVzZUNvbG9yVGV4dHVyZSA9IChtYXRlcmlhbEpzb24gYXMgYW55KS5kaWZmdXNlQ29sb3JUZXh0dXJlIGFzIFJuTTJUZXh0dXJlO1xuICAgICAgY29uc3Qgcm5UZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoZGlmZnVzZUNvbG9yVGV4dHVyZSwgZ2x0Zk1vZGVsLCB7XG4gICAgICAgIGF1dG9EZXRlY3RUcmFuc3BhcmVuY3k6IG9wdGlvbnM/LmF1dG9EZXRlY3RUZXh0dXJlVHJhbnNwYXJlbmN5LFxuICAgICAgfSk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihkaWZmdXNlQ29sb3JUZXh0dXJlKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ2RpZmZ1c2VDb2xvclRleHR1cmUnLCByblRleHR1cmUsIHJuU2FtcGxlcik7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY2hlY2tSbkdsdGZMb2FkZXJPcHRpb25zRXhpc3QoZ2x0Zk1vZGVsKSAmJlxuICAgICAgICBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM/LmxvYWRlckV4dGVuc2lvblxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlckV4dGVuc2lvbiA9IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuTG9hZGVyT3B0aW9ucyFcbiAgICAgICAgICAubG9hZGVyRXh0ZW5zaW9uIGFzIElMb2FkZXJFeHRlbnNpb247XG4gICAgICAgIGlmIChsb2FkZXJFeHRlbnNpb24uc2V0VVZUcmFuc2Zvcm1Ub1RleHR1cmUpIHtcbiAgICAgICAgICBsb2FkZXJFeHRlbnNpb24uc2V0VVZUcmFuc2Zvcm1Ub1RleHR1cmUobWF0ZXJpYWwsIGRpZmZ1c2VDb2xvclRleHR1cmUuc2FtcGxlck9iamVjdCEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChJcy5leGlzdChtYXRlcmlhbEpzb24/LmRpZmZ1c2VDb2xvckZhY3RvcikpIHtcbiAgICAgIGNvbnN0IGRpZmZ1c2VDb2xvckZhY3RvciA9IG1hdGVyaWFsSnNvbj8uZGlmZnVzZUNvbG9yRmFjdG9yIGFzIEFycmF5NDxudW1iZXI+O1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdkaWZmdXNlQ29sb3JGYWN0b3InLCBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KGRpZmZ1c2VDb2xvckZhY3RvcikpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbFRleHR1cmUgPSBtYXRlcmlhbEpzb24/Lm5vcm1hbFRleHR1cmU7XG4gICAgaWYgKG5vcm1hbFRleHR1cmUgIT0gbnVsbCAmJiBJcy5mYWxzeShpc1VubGl0KSkge1xuICAgICAgY29uc3Qgcm5UZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUobm9ybWFsVGV4dHVyZS50ZXh0dXJlISwgZ2x0Zk1vZGVsKTtcbiAgICAgIGNvbnN0IHJuU2FtcGxlciA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVTYW1wbGVyKG5vcm1hbFRleHR1cmUudGV4dHVyZSEpO1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcignbm9ybWFsVGV4dHVyZScsIHJuVGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICAgIGlmIChwYXJzZUZsb2F0KGdsdGZNb2RlbC5hc3NldD8udmVyc2lvbikgPj0gMikge1xuICAgICAgICBpZiAobm9ybWFsVGV4dHVyZS50ZXhDb29yZCAhPSBudWxsKSB7XG4gICAgICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdub3JtYWxUZXhjb29yZEluZGV4Jywgbm9ybWFsVGV4dHVyZS50ZXhDb29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9ybWFsVGV4dHVyZS5zY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdub3JtYWxTY2FsZScsIG5vcm1hbFRleHR1cmUuc2NhbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIE1vZGVsQ29udmVydGVyLl9zZXR1cFRleHR1cmVUcmFuc2Zvcm0oXG4gICAgICBub3JtYWxUZXh0dXJlISxcbiAgICAgIG1hdGVyaWFsLFxuICAgICAgJ25vcm1hbFRleHR1cmVUcmFuc2Zvcm0nLFxuICAgICAgJ25vcm1hbFRleHR1cmVSb3RhdGlvbidcbiAgICApO1xuXG4gICAgLy8gTW9kZWxDb252ZXJ0ZXIuX3NldHVwVGV4dHVyZVRyYW5zZm9ybShub3JtYWxUZXh0dXJlLCBtYXRlcmlhbCwgJ25vcm1hbFRleHR1cmVUcmFuc2Zvcm0nLCAnbm9ybWFsVGV4dHVyZVJvdGF0aW9uJylcblxuICAgIC8vIEZvciBFeHRlbnNpb25cbiAgICBpZiAodGhpcy5fY2hlY2tSbkdsdGZMb2FkZXJPcHRpb25zRXhpc3QoZ2x0Zk1vZGVsKSkge1xuICAgICAgY29uc3QgbG9hZGVyRXh0ZW5zaW9uID0gZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcz8ucm5Mb2FkZXJPcHRpb25zPy5sb2FkZXJFeHRlbnNpb247XG4gICAgICBpZiAobG9hZGVyRXh0ZW5zaW9uPy5zZXR1cE1hdGVyaWFsICE9IG51bGwpIHtcbiAgICAgICAgbG9hZGVyRXh0ZW5zaW9uLnNldHVwTWF0ZXJpYWwoZ2x0Zk1vZGVsLCBtYXRlcmlhbEpzb24hLCBtYXRlcmlhbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGVyaWFsO1xuICB9XG5cbiAgc3RhdGljIF9jcmVhdGVTYW1wbGVyKHRleHR1cmU6IFJuTTJUZXh0dXJlKSB7XG4gICAgY29uc3Qgc2FtcGxlciA9IG5ldyBTYW1wbGVyKHtcbiAgICAgIG1hZ0ZpbHRlcjogSXMuZXhpc3QodGV4dHVyZS5zYW1wbGVyT2JqZWN0Py5tYWdGaWx0ZXIpXG4gICAgICAgID8gVGV4dHVyZVBhcmFtZXRlci5mcm9tKHRleHR1cmUuc2FtcGxlck9iamVjdCEubWFnRmlsdGVyKVxuICAgICAgICA6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgICAgbWluRmlsdGVyOiBJcy5leGlzdCh0ZXh0dXJlLnNhbXBsZXJPYmplY3Q/Lm1pbkZpbHRlcilcbiAgICAgICAgPyBUZXh0dXJlUGFyYW1ldGVyLmZyb20odGV4dHVyZS5zYW1wbGVyT2JqZWN0IS5taW5GaWx0ZXIpXG4gICAgICAgIDogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICB3cmFwUzogSXMuZXhpc3QodGV4dHVyZS5zYW1wbGVyT2JqZWN0Py53cmFwUylcbiAgICAgICAgPyBUZXh0dXJlUGFyYW1ldGVyLmZyb20odGV4dHVyZS5zYW1wbGVyT2JqZWN0IS53cmFwUylcbiAgICAgICAgOiBUZXh0dXJlUGFyYW1ldGVyLlJlcGVhdCxcbiAgICAgIHdyYXBUOiBJcy5leGlzdCh0ZXh0dXJlLnNhbXBsZXJPYmplY3Q/LndyYXBUKVxuICAgICAgICA/IFRleHR1cmVQYXJhbWV0ZXIuZnJvbSh0ZXh0dXJlLnNhbXBsZXJPYmplY3QhLndyYXBUKVxuICAgICAgICA6IFRleHR1cmVQYXJhbWV0ZXIuUmVwZWF0LFxuICAgIH0pO1xuICAgIHNhbXBsZXIuY3JlYXRlKCk7XG5cbiAgICByZXR1cm4gc2FtcGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBfY3JlYXRlVGV4dHVyZShcbiAgICB0ZXh0dXJlOiBSbk0yVGV4dHVyZSxcbiAgICBnbHRmTW9kZWw6IFJuTTIsXG4gICAgeyBhdXRvRGV0ZWN0VHJhbnNwYXJlbmN5ID0gZmFsc2UgfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM7XG5cbiAgICBjb25zdCByblRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuICAgIHJuVGV4dHVyZS5hdXRvRGV0ZWN0VHJhbnNwYXJlbmN5ID0gYXV0b0RldGVjdFRyYW5zcGFyZW5jeTtcbiAgICByblRleHR1cmUuYXV0b1Jlc2l6ZSA9IG9wdGlvbnM/LmF1dG9SZXNpemVUZXh0dXJlID09PSB0cnVlO1xuXG4gICAgY29uc3QgdGV4dHVyZU9wdGlvbiA9IHtcbiAgICAgIG1hZ0ZpbHRlcjogSXMuZXhpc3QodGV4dHVyZS5zYW1wbGVyT2JqZWN0Py5tYWdGaWx0ZXIpXG4gICAgICAgID8gVGV4dHVyZVBhcmFtZXRlci5mcm9tKHRleHR1cmUuc2FtcGxlck9iamVjdCEubWFnRmlsdGVyKVxuICAgICAgICA6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgICAgbWluRmlsdGVyOiBJcy5leGlzdCh0ZXh0dXJlLnNhbXBsZXJPYmplY3Q/Lm1pbkZpbHRlcilcbiAgICAgICAgPyBUZXh0dXJlUGFyYW1ldGVyLmZyb20odGV4dHVyZS5zYW1wbGVyT2JqZWN0IS5taW5GaWx0ZXIpXG4gICAgICAgIDogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICB3cmFwUzogSXMuZXhpc3QodGV4dHVyZS5zYW1wbGVyT2JqZWN0Py53cmFwUylcbiAgICAgICAgPyBUZXh0dXJlUGFyYW1ldGVyLmZyb20odGV4dHVyZS5zYW1wbGVyT2JqZWN0IS53cmFwUylcbiAgICAgICAgOiBUZXh0dXJlUGFyYW1ldGVyLlJlcGVhdCxcbiAgICAgIHdyYXBUOiBJcy5leGlzdCh0ZXh0dXJlLnNhbXBsZXJPYmplY3Q/LndyYXBUKVxuICAgICAgICA/IFRleHR1cmVQYXJhbWV0ZXIuZnJvbSh0ZXh0dXJlLnNhbXBsZXJPYmplY3QhLndyYXBUKVxuICAgICAgICA6IFRleHR1cmVQYXJhbWV0ZXIuUmVwZWF0LFxuICAgIH07XG5cbiAgICBjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2UgYXMgUm5NMkltYWdlO1xuICAgIGlmIChpbWFnZS5pbWFnZSkge1xuICAgICAgY29uc3QgaW1hZ2VFbGVtID0gaW1hZ2UuaW1hZ2UgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICAgIGNvbnN0IGlzV2ViR0wxID0gIXdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmN1cnJlbnRXZWJHTENvbnRleHRXcmFwcGVyPy5pc1dlYkdMMjtcblxuICAgICAgaWYgKFxuICAgICAgICBpc1dlYkdMMSAmJlxuICAgICAgICAhdGhpcy5fX3NpemVJc1Bvd2VyT2ZUd28oaW1hZ2VFbGVtKSAmJlxuICAgICAgICB0aGlzLl9fbmVlZFJlc2l6ZVRvUG93ZXJPZlR3b09uV2ViR2wxKHRleHR1cmVPcHRpb24pXG4gICAgICApIHtcbiAgICAgICAgcm5UZXh0dXJlLmF1dG9SZXNpemUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByblRleHR1cmUuZ2VuZXJhdGVUZXh0dXJlRnJvbUltYWdlKGltYWdlRWxlbSk7XG4gICAgICByblRleHR1cmUubG9hZEZyb21JbWdMYXp5KCk7XG4gICAgfSBlbHNlIGlmIChpbWFnZS5iYXNpcykge1xuICAgICAgcm5UZXh0dXJlLmdlbmVyYXRlVGV4dHVyZUZyb21CYXNpcyhpbWFnZS5iYXNpcywge30pO1xuICAgIH0gZWxzZSBpZiAoaW1hZ2Uua3R4Mikge1xuICAgICAgcm5UZXh0dXJlLmdlbmVyYXRlVGV4dHVyZUZyb21LVFgyKGltYWdlLmt0eDIpO1xuICAgIH1cblxuICAgIGlmIChpbWFnZS51cmkpIHtcbiAgICAgIHJuVGV4dHVyZS5uYW1lID0gaW1hZ2UudXJpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleHQgPSBpbWFnZS5taW1lVHlwZT8uc3BsaXQoJy8nKVsxXTtcbiAgICAgIHJuVGV4dHVyZS5uYW1lID0gaW1hZ2UubmFtZSA/PyB0ZXh0dXJlLm5hbWUgKyBgLiR7ZXh0fWA7XG4gICAgfVxuICAgIHJuVGV4dHVyZS50cnlUb1NldFVuaXF1ZU5hbWUocm5UZXh0dXJlLm5hbWUsIHRydWUpO1xuXG4gICAgcmV0dXJuIHJuVGV4dHVyZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fbmVlZFJlc2l6ZVRvUG93ZXJPZlR3b09uV2ViR2wxKHRleHR1cmVPcHRpb246IGFueSkge1xuICAgIGlmIChcbiAgICAgIHRleHR1cmVPcHRpb24ud3JhcFMgIT09IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UgfHxcbiAgICAgIHRleHR1cmVPcHRpb24ud3JhcFQgIT09IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UgfHxcbiAgICAgICh0ZXh0dXJlT3B0aW9uLm1pbkZpbHRlciAhPT0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIgJiZcbiAgICAgICAgdGV4dHVyZU9wdGlvbi5taW5GaWx0ZXIgIT09IFRleHR1cmVQYXJhbWV0ZXIuTmVhcmVzdClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2l6ZUlzUG93ZXJPZlR3byhpbWFnZTogSFRNTEltYWdlRWxlbWVudCkge1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuXG4gICAgaWYgKCh3aWR0aCAmICh3aWR0aCAtIDEpKSA9PT0gMCAmJiAoaGVpZ2h0ICYgKGhlaWdodCAtIDEpKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX25lZWRQYXJhbWV0ZXJJbml0aWFsaXphdGlvbihcbiAgICBtYXRlcmlhbEpzb246IFJuTTJNYXRlcmlhbCxcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG1hdGVyaWFsSnNvbiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoXG4gICAgICBtYXRlcmlhbFR5cGVOYW1lLm1hdGNoKC9QYnJVYmVyLykgIT0gbnVsbCB8fFxuICAgICAgbWF0ZXJpYWxUeXBlTmFtZS5tYXRjaCgvQ2xhc3NpY1ViZXIvKSAhPSBudWxsXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9jaGVja1JuR2x0ZkxvYWRlck9wdGlvbnNFeGlzdChnbHRmTW9kZWw6IFJuTTIpIHtcbiAgICBpZiAoZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcz8ucm5Mb2FkZXJPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fcmV3cmFwV2l0aFR5cGVkQXJyYXkoXG4gICAgdHlwZWRBcnJheUNsYXNzOiBUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gICAgdWludDhBcnJheTogVWludDhBcnJheSxcbiAgICBieXRlT2Zmc2V0OiBCeXRlLFxuICAgIGxlbmd0aDogU2l6ZVxuICApIHtcbiAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXlDbGFzcyh1aW50OEFycmF5LmJ1ZmZlciwgYnl0ZU9mZnNldCArIHVpbnQ4QXJyYXkuYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIHN0YXRpYyBfY2hlY2tCeXRlc1BlckNvbXBvbmVudChhY2Nlc3NvcjogUm5NMkFjY2Vzc29yIHwgUm5NMlNwYXJzZUluZGljZXMpIHtcbiAgICBsZXQgYnl0ZXNQZXJDb21wb25lbnQgPSAwO1xuICAgIHN3aXRjaCAoYWNjZXNzb3IuY29tcG9uZW50VHlwZSkge1xuICAgICAgY2FzZSA1MTIwOiAvLyBnbC5CWVRFXG4gICAgICAgIGJ5dGVzUGVyQ29tcG9uZW50ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDUxMjE6IC8vIGdsLlVOU0lHTkVEX0JZVEVcbiAgICAgICAgYnl0ZXNQZXJDb21wb25lbnQgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTEyMjogLy8gZ2wuU0hPUlRcbiAgICAgICAgYnl0ZXNQZXJDb21wb25lbnQgPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTEyMzogLy8gZ2wuVU5TSUdORURfU0hPUlRcbiAgICAgICAgYnl0ZXNQZXJDb21wb25lbnQgPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTEyNDogLy8gZ2wuSU5UXG4gICAgICAgIGJ5dGVzUGVyQ29tcG9uZW50ID0gNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDUxMjU6IC8vIGdsLlVOU0lHTkVEX0lOVFxuICAgICAgICBieXRlc1BlckNvbXBvbmVudCA9IDQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MTI2OiAvLyBnbC5GTE9BVFxuICAgICAgICBieXRlc1BlckNvbXBvbmVudCA9IDQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBieXRlc1BlckNvbXBvbmVudDtcbiAgfVxuXG4gIHN0YXRpYyBfY2hlY2tDb21wb25lbnROdW1iZXIoYWNjZXNzb3I6IFJuTTJBY2Nlc3Nvcikge1xuICAgIGxldCBjb21wb25lbnROID0gMDtcbiAgICBzd2l0Y2ggKGFjY2Vzc29yLnR5cGUpIHtcbiAgICAgIGNhc2UgJ1NDQUxBUic6XG4gICAgICAgIGNvbXBvbmVudE4gPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1ZFQzInOlxuICAgICAgICBjb21wb25lbnROID0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdWRUMzJzpcbiAgICAgICAgY29tcG9uZW50TiA9IDM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVkVDNCc6XG4gICAgICAgIGNvbXBvbmVudE4gPSA0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ01BVDQnOlxuICAgICAgICBjb21wb25lbnROID0gMTY7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnROO1xuICB9XG5cbiAgc3RhdGljIF9jaGVja0RhdGFWaWV3TWV0aG9kKGFjY2Vzc29yOiBSbk0yQWNjZXNzb3IgfCBSbk0yU3BhcnNlSW5kaWNlcykge1xuICAgIGxldCBkYXRhVmlld01ldGhvZCA9ICcnO1xuICAgIHN3aXRjaCAoYWNjZXNzb3IuY29tcG9uZW50VHlwZSkge1xuICAgICAgY2FzZSA1MTIwOiAvLyBnbC5CWVRFXG4gICAgICAgIGRhdGFWaWV3TWV0aG9kID0gJ2dldEludDgnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTEyMTogLy8gZ2wuVU5TSUdORURfQllURVxuICAgICAgICBkYXRhVmlld01ldGhvZCA9ICdnZXRVaW50OCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MTIyOiAvLyBnbC5TSE9SVFxuICAgICAgICBkYXRhVmlld01ldGhvZCA9ICdnZXRJbnQxNic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MTIzOiAvLyBnbC5VTlNJR05FRF9TSE9SVFxuICAgICAgICBkYXRhVmlld01ldGhvZCA9ICdnZXRVaW50MTYnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTEyNDogLy8gZ2wuSU5UXG4gICAgICAgIGRhdGFWaWV3TWV0aG9kID0gJ2dldEludDMyJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDUxMjU6IC8vIGdsLlVOU0lHTkVEX0lOVFxuICAgICAgICBkYXRhVmlld01ldGhvZCA9ICdnZXRVaW50MzInO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTEyNjogLy8gZ2wuRkxPQVRcbiAgICAgICAgZGF0YVZpZXdNZXRob2QgPSAnZ2V0RmxvYXQzMic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBkYXRhVmlld01ldGhvZDtcbiAgfVxuXG4gIHN0YXRpYyBfaXNTeXN0ZW1MaXR0bGVFbmRpYW4oKSB7XG4gICAgcmV0dXJuICEhbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQxNkFycmF5KFsweDAwZmZdKS5idWZmZXIpWzBdO1xuICB9XG5cbiAgc3RhdGljIF9yZWFkQmluYXJ5RnJvbUFjY2Vzc29yQW5kU2V0SXRUb0FjY2Vzc29yRXh0cmFzKFxuICAgIGFjY2Vzc29yOiBSbk0yQWNjZXNzb3IsXG4gICAgcm5CdWZmZXJzPzogQnVmZmVyW11cbiAgKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBidWZmZXJWaWV3ID0gYWNjZXNzb3IuYnVmZmVyVmlld09iamVjdCE7XG4gICAgbGV0IGJ5dGVPZmZzZXRGcm9tQnVmZmVyOiBudW1iZXIgPSAoYnVmZmVyVmlldy5ieXRlT2Zmc2V0ID8/IDApICsgKGFjY2Vzc29yLmJ5dGVPZmZzZXQgPz8gMCk7XG4gICAgY29uc3QgYnVmZmVyID0gYnVmZmVyVmlldy5idWZmZXJPYmplY3QhO1xuICAgIGxldCB1aW50OEFycmF5OiBVaW50OEFycmF5ID0gYnVmZmVyLmJ1ZmZlciE7XG5cbiAgICBjb25zdCBjb21wb25lbnROID0gdGhpcy5fY2hlY2tDb21wb25lbnROdW1iZXIoYWNjZXNzb3IpO1xuICAgIGNvbnN0IGNvbXBvbmVudEJ5dGVzID0gdGhpcy5fY2hlY2tCeXRlc1BlckNvbXBvbmVudChhY2Nlc3Nvcik7XG4gICAgY29uc3QgZGF0YVZpZXdNZXRob2QgPSB0aGlzLl9jaGVja0RhdGFWaWV3TWV0aG9kKGFjY2Vzc29yKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KGFjY2Vzc29yLmV4dHJhcykpIHtcbiAgICAgIGFjY2Vzc29yLmV4dHJhcyA9IHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogJycsXG4gICAgICAgIHRvR2V0QXNUeXBlZEFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlZERhdGFBcnJheTogbmV3IEZsb2F0MzJBcnJheSgpLFxuICAgICAgICBjb21wb25lbnROOiAwLFxuICAgICAgICBjb21wb25lbnRCeXRlczogNCxcbiAgICAgICAgZGF0YVZpZXdNZXRob2Q6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3Igd2VpZ2h0cyBhbmltYXRpb24gYWNjZXNzb3IsIHNldCBjb21wb25lbnROIGFzIHdlaWdodHNBcnJheUxlbmd0aFxuICAgIGFjY2Vzc29yLmV4dHJhcy5jb21wb25lbnROID0gSXMuZXhpc3QoYWNjZXNzb3IuZXh0cmFzPy53ZWlnaHRzQXJyYXlMZW5ndGgpXG4gICAgICA/IGFjY2Vzc29yLmV4dHJhcyEud2VpZ2h0c0FycmF5TGVuZ3RoXG4gICAgICA6IGNvbXBvbmVudE47XG4gICAgYWNjZXNzb3IuZXh0cmFzLmNvbXBvbmVudEJ5dGVzID0gY29tcG9uZW50Qnl0ZXM7XG4gICAgYWNjZXNzb3IuZXh0cmFzLmRhdGFWaWV3TWV0aG9kID0gZGF0YVZpZXdNZXRob2Q7XG5cbiAgICBjb25zdCBieXRlTGVuZ3RoID0gY29tcG9uZW50Qnl0ZXMgKiBjb21wb25lbnROICogYWNjZXNzb3IuY291bnQ7XG5cbiAgICBpZiAoSXMuZXhpc3Qocm5CdWZmZXJzKSkge1xuICAgICAgY29uc3Qgcm5CdWZmZXIgPSBybkJ1ZmZlcnNbYWNjZXNzb3IuYnVmZmVyVmlld09iamVjdCEuYnVmZmVyIV07XG4gICAgICBjb25zdCBybkJ1ZmZlclZpZXcgPSB0aGlzLl9fZ2V0Um5CdWZmZXJWaWV3KGJ1ZmZlclZpZXcsIHJuQnVmZmVyKTtcbiAgICAgIGNvbnN0IHJuQWNjZXNzb3IgPSB0aGlzLl9fZ2V0Um5BY2Nlc3NvcihhY2Nlc3Nvciwgcm5CdWZmZXJWaWV3KTtcbiAgICAgIHVpbnQ4QXJyYXkgPSBybkFjY2Vzc29yLmdldFVpbnQ4QXJyYXkoKTtcbiAgICAgIGJ5dGVPZmZzZXRGcm9tQnVmZmVyID0gMDtcbiAgICB9XG5cbiAgICBsZXQgZmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgpO1xuICAgIGNvbnN0IG51bWJlckFycmF5OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgaWYgKE1vZGVsQ29udmVydGVyLl9pc1N5c3RlbUxpdHRsZUVuZGlhbigpKSB7XG4gICAgICAvLyBJZiB0aGlzIHBsYXRmb3JtIGlzIExpdHRsZSBFbmRpYW4gU3lzdGVtLFxuICAgICAgLy8gICB0aGUgdWludDhhcnJheSBjYW5cbiAgICAgIGxldCB0eXBlZERhdGFBcnJheTogVHlwZWRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoKTtcbiAgICAgIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldEZsb2F0MzInKSB7XG4gICAgICAgIHR5cGVkRGF0YUFycmF5ID0gdGhpcy5fX3Jld3JhcFdpdGhUeXBlZEFycmF5KFxuICAgICAgICAgIEZsb2F0MzJBcnJheSxcbiAgICAgICAgICB1aW50OEFycmF5LFxuICAgICAgICAgIGJ5dGVPZmZzZXRGcm9tQnVmZmVyLFxuICAgICAgICAgIGJ5dGVMZW5ndGggLyBjb21wb25lbnRCeXRlc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldEludDgnKSB7XG4gICAgICAgIHR5cGVkRGF0YUFycmF5ID0gbmV3IEludDhBcnJheShcbiAgICAgICAgICB1aW50OEFycmF5LFxuICAgICAgICAgIGJ5dGVPZmZzZXRGcm9tQnVmZmVyLFxuICAgICAgICAgIGJ5dGVMZW5ndGggLyBjb21wb25lbnRCeXRlc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldFVpbnQ4Jykge1xuICAgICAgICB0eXBlZERhdGFBcnJheSA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgIHVpbnQ4QXJyYXksXG4gICAgICAgICAgYnl0ZU9mZnNldEZyb21CdWZmZXIsXG4gICAgICAgICAgYnl0ZUxlbmd0aCAvIGNvbXBvbmVudEJ5dGVzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGFWaWV3TWV0aG9kID09PSAnZ2V0SW50MTYnKSB7XG4gICAgICAgIHR5cGVkRGF0YUFycmF5ID0gdGhpcy5fX3Jld3JhcFdpdGhUeXBlZEFycmF5KFxuICAgICAgICAgIEludDE2QXJyYXksXG4gICAgICAgICAgdWludDhBcnJheSxcbiAgICAgICAgICBieXRlT2Zmc2V0RnJvbUJ1ZmZlcixcbiAgICAgICAgICBieXRlTGVuZ3RoIC8gY29tcG9uZW50Qnl0ZXNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVZpZXdNZXRob2QgPT09ICdnZXRVaW50MTYnKSB7XG4gICAgICAgIHR5cGVkRGF0YUFycmF5ID0gdGhpcy5fX3Jld3JhcFdpdGhUeXBlZEFycmF5KFxuICAgICAgICAgIFVpbnQxNkFycmF5LFxuICAgICAgICAgIHVpbnQ4QXJyYXksXG4gICAgICAgICAgYnl0ZU9mZnNldEZyb21CdWZmZXIsXG4gICAgICAgICAgYnl0ZUxlbmd0aCAvIGNvbXBvbmVudEJ5dGVzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGFWaWV3TWV0aG9kID09PSAnZ2V0SW50MzInKSB7XG4gICAgICAgIHR5cGVkRGF0YUFycmF5ID0gdGhpcy5fX3Jld3JhcFdpdGhUeXBlZEFycmF5KFxuICAgICAgICAgIEludDMyQXJyYXksXG4gICAgICAgICAgdWludDhBcnJheSxcbiAgICAgICAgICBieXRlT2Zmc2V0RnJvbUJ1ZmZlcixcbiAgICAgICAgICBieXRlTGVuZ3RoIC8gY29tcG9uZW50Qnl0ZXNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVZpZXdNZXRob2QgPT09ICdnZXRVaW50MzInKSB7XG4gICAgICAgIHR5cGVkRGF0YUFycmF5ID0gdGhpcy5fX3Jld3JhcFdpdGhUeXBlZEFycmF5KFxuICAgICAgICAgIFVpbnQzMkFycmF5LFxuICAgICAgICAgIHVpbnQ4QXJyYXksXG4gICAgICAgICAgYnl0ZU9mZnNldEZyb21CdWZmZXIsXG4gICAgICAgICAgYnl0ZUxlbmd0aCAvIGNvbXBvbmVudEJ5dGVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmbG9hdDMyQXJyYXkgPSB0aGlzLl9fbm9ybWFsaXplVHlwZWRBcnJheVRvRmxvYXQzMkFycmF5KGRhdGFWaWV3TWV0aG9kLCB0eXBlZERhdGFBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZvciBCaWdFbmRpYW4gcHJvY2Vzc1xuICAgICAgY29uc3QgZGF0YVZpZXc6IGFueSA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgdWludDhBcnJheS5idWZmZXIsXG4gICAgICAgIGJ5dGVPZmZzZXRGcm9tQnVmZmVyICsgdWludDhBcnJheS5ieXRlT2Zmc2V0LFxuICAgICAgICBieXRlTGVuZ3RoXG4gICAgICApO1xuICAgICAgY29uc3QgYnl0ZURlbHRhID0gY29tcG9uZW50Qnl0ZXMgKiBjb21wb25lbnROO1xuICAgICAgY29uc3QgbGl0dGxlRW5kaWFuID0gdHJ1ZTtcbiAgICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IGJ5dGVMZW5ndGg7IHBvcyArPSBieXRlRGVsdGEpIHtcbiAgICAgICAgc3dpdGNoIChhY2Nlc3Nvci50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnU0NBTEFSJzpcbiAgICAgICAgICAgIG51bWJlckFycmF5LnB1c2goZGF0YVZpZXdbZGF0YVZpZXdNZXRob2RdKHBvcywgbGl0dGxlRW5kaWFuKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdWRUMyJzpcbiAgICAgICAgICAgIG51bWJlckFycmF5LnB1c2goZGF0YVZpZXdbZGF0YVZpZXdNZXRob2RdKHBvcywgbGl0dGxlRW5kaWFuKSk7XG4gICAgICAgICAgICBudW1iZXJBcnJheS5wdXNoKGRhdGFWaWV3W2RhdGFWaWV3TWV0aG9kXShwb3MgKyBjb21wb25lbnRCeXRlcywgbGl0dGxlRW5kaWFuKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdWRUMzJzpcbiAgICAgICAgICAgIG51bWJlckFycmF5LnB1c2goZGF0YVZpZXdbZGF0YVZpZXdNZXRob2RdKHBvcywgbGl0dGxlRW5kaWFuKSk7XG4gICAgICAgICAgICBudW1iZXJBcnJheS5wdXNoKGRhdGFWaWV3W2RhdGFWaWV3TWV0aG9kXShwb3MgKyBjb21wb25lbnRCeXRlcywgbGl0dGxlRW5kaWFuKSk7XG4gICAgICAgICAgICBudW1iZXJBcnJheS5wdXNoKGRhdGFWaWV3W2RhdGFWaWV3TWV0aG9kXShwb3MgKyBjb21wb25lbnRCeXRlcyAqIDIsIGxpdHRsZUVuZGlhbikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnVkVDNCc6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICBudW1iZXJBcnJheS5wdXNoKGRhdGFWaWV3W2RhdGFWaWV3TWV0aG9kXShwb3MgKyBjb21wb25lbnRCeXRlcyAqIGksIGxpdHRsZUVuZGlhbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTUFUNCc6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgICAgbnVtYmVyQXJyYXkucHVzaChkYXRhVmlld1tkYXRhVmlld01ldGhvZF0ocG9zICsgY29tcG9uZW50Qnl0ZXMgKiBpLCBsaXR0bGVFbmRpYW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbG9hdDMyQXJyYXkgPSB0aGlzLl9fbm9ybWFsaXplVHlwZWRBcnJheVRvRmxvYXQzMkFycmF5KGRhdGFWaWV3TWV0aG9kLCBudW1iZXJBcnJheSk7XG4gICAgfVxuXG4gICAgYWNjZXNzb3IuZXh0cmFzIS50eXBlZERhdGFBcnJheSA9IGZsb2F0MzJBcnJheTtcblxuICAgIHJldHVybiBmbG9hdDMyQXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogbm9ybWFsaXplIHZhbHVlcyBvZiBUeXBlZEFycmF5IHRvIEZsb2F0MzJBcnJheVxuICAgKiBTZWU6IHRoZSBsYXN0IHBhcnQgb2YgMy4xMS5BbmltYXRpb24gYXQgaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNhbmltYXRpb25zXG4gICAqIEBwYXJhbSBkYXRhVmlld01ldGhvZFxuICAgKiBAcGFyYW0gbnVtYmVyQXJyYXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fbm9ybWFsaXplVHlwZWRBcnJheVRvRmxvYXQzMkFycmF5KFxuICAgIGRhdGFWaWV3TWV0aG9kOiBzdHJpbmcsXG4gICAgbnVtYmVyQXJyYXk6IG51bWJlcltdIHwgVHlwZWRBcnJheVxuICApOiBGbG9hdDMyQXJyYXkge1xuICAgIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldEludDgnKSB7XG4gICAgICByZXR1cm4gRGF0YVV0aWwubm9ybWFsaXplZEludDhBcnJheVRvRmxvYXQzMkFycmF5KG51bWJlckFycmF5IGFzIHVua25vd24gYXMgSW50OEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKGRhdGFWaWV3TWV0aG9kID09PSAnZ2V0VWludDgnKSB7XG4gICAgICByZXR1cm4gRGF0YVV0aWwubm9ybWFsaXplZFVpbnQ4QXJyYXlUb0Zsb2F0MzJBcnJheShudW1iZXJBcnJheSBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoZGF0YVZpZXdNZXRob2QgPT09ICdnZXRJbnQxNicpIHtcbiAgICAgIHJldHVybiBEYXRhVXRpbC5ub3JtYWxpemVkSW50MTZBcnJheVRvRmxvYXQzMkFycmF5KG51bWJlckFycmF5IGFzIHVua25vd24gYXMgSW50MTZBcnJheSk7XG4gICAgfSBlbHNlIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldFVpbnQxNicpIHtcbiAgICAgIHJldHVybiBEYXRhVXRpbC5ub3JtYWxpemVkVWludDE2QXJyYXlUb0Zsb2F0MzJBcnJheShudW1iZXJBcnJheSBhcyB1bmtub3duIGFzIFVpbnQxNkFycmF5KTtcbiAgICB9IGVsc2UgaWYgKGRhdGFWaWV3TWV0aG9kID09PSAnZ2V0SW50MzInKSB7XG4gICAgICAvLyB0eXBlZERhdGFBcnJheSA9IG5ldyBJbnQzMkFycmF5KG51bWJlckFycmF5KTtcbiAgICAgIExvZ2dlci5lcnJvcignTm90IGNvbnNpZGVyZWQnKTtcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgfSBlbHNlIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldFVpbnQzMicpIHtcbiAgICAgIC8vIHR5cGVkRGF0YUFycmF5ID0gbmV3IFVpbnQzMkFycmF5KG51bWJlckFycmF5KTtcbiAgICAgIExvZ2dlci5lcnJvcignTm90IGNvbnNpZGVyZWQnKTtcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgfSBlbHNlIGlmIChkYXRhVmlld01ldGhvZCA9PT0gJ2dldEZsb2F0MzInKSB7XG4gICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShudW1iZXJBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignTm90IGNvbnNpZGVyZWQnKTtcbiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19hZGRPZmZzZXRUb0luZGljZXMobWVzaENvbXBvbmVudDogTWVzaENvbXBvbmVudCkge1xuICAgIGNvbnN0IHByaW1pdGl2ZU51bWJlciA9IG1lc2hDb21wb25lbnQubWVzaCEuZ2V0UHJpbWl0aXZlTnVtYmVyKCk7XG4gICAgbGV0IG9mZnNldFN1bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmltaXRpdmVOdW1iZXI7IGkrKykge1xuICAgICAgY29uc3QgcHJpbWl0aXZlID0gbWVzaENvbXBvbmVudC5tZXNoIS5nZXRQcmltaXRpdmVBdChpKTtcbiAgICAgIGNvbnN0IGluZGljZXNBY2Nlc3NvciA9IHByaW1pdGl2ZS5pbmRpY2VzQWNjZXNzb3I7XG4gICAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnROdW1iZXIgPSBpbmRpY2VzQWNjZXNzb3IuZWxlbWVudENvdW50O1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVsZW1lbnROdW1iZXI7IGorKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihqLCB7fSk7XG4gICAgICAgICAgaW5kaWNlc0FjY2Vzc29yLnNldFNjYWxhcihqLCBpbmRleCArIG9mZnNldFN1bSwge30pO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldFN1bSArPSBlbGVtZW50TnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGEgUm4uQWNjZXNzb3IgZnJvbSB0aGUgUm4uQnVmZmVyXG4gICAqICBmcm9tIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgR2x0ZjJCdWZmZXIsIEdsdGYyQnVmZmVyVmlldywgYW5kIEdsdGYyQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBhY2Nlc3NvclxuICAgKiBAcGFyYW0gcm5CdWZmZXJcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0Um5BY2Nlc3NvcihhY2Nlc3NvcjogUm5NMkFjY2Vzc29yLCBybkJ1ZmZlclZpZXc/OiBCdWZmZXJWaWV3KSB7XG4gICAgbGV0IHJuQWNjZXNzb3I6IEFjY2Vzc29yO1xuICAgIGlmIChybkJ1ZmZlclZpZXcgIT0gbnVsbCkge1xuICAgICAgcm5BY2Nlc3NvciA9IHJuQnVmZmVyVmlld1xuICAgICAgICAudGFrZUFjY2Vzc29yV2l0aEJ5dGVPZmZzZXQoe1xuICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLmZyb21TdHJpbmcoYWNjZXNzb3IudHlwZSksXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5mcm9tKGFjY2Vzc29yLmNvbXBvbmVudFR5cGUpLFxuICAgICAgICAgIGNvdW50OiBhY2Nlc3Nvci5jb3VudCxcbiAgICAgICAgICBieXRlT2Zmc2V0SW5CdWZmZXJWaWV3OiBhY2Nlc3Nvci5ieXRlT2Zmc2V0ID8/IDAsXG4gICAgICAgICAgYnl0ZVN0cmlkZTogYWNjZXNzb3IuYnl0ZVN0cmlkZSxcbiAgICAgICAgICBtYXg6IGFjY2Vzc29yLm1heCxcbiAgICAgICAgICBtaW46IGFjY2Vzc29yLm1pbixcbiAgICAgICAgICBub3JtYWxpemVkOiBhY2Nlc3Nvci5ub3JtYWxpemVkLFxuICAgICAgICB9KVxuICAgICAgICAudW53cmFwRm9yY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgYWNjZXNzb3IuYnVmZmVyVmlldyBpcyBub3QgZGVmaW5lZCwgdGhlIGFjY2Vzc29yIE1VU1QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvcy5cbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI19hY2Nlc3Nvcl9idWZmZXJ2aWV3XG4gICAgICBjb25zdCBybkJ1ZmZlciA9IE1lbW9yeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVPckdldEJ1ZmZlcihCdWZmZXJVc2UuR1BVVmVydGV4RGF0YSk7XG5cbiAgICAgIGNvbnN0IGNvbXBvc2l0aW9uVHlwZSA9IENvbXBvc2l0aW9uVHlwZS5mcm9tU3RyaW5nKGFjY2Vzc29yLnR5cGUpO1xuICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGUuZnJvbShhY2Nlc3Nvci5jb21wb25lbnRUeXBlKTtcblxuICAgICAgY29uc3Qgcm5CdWZmZXJWaWV3ID0gcm5CdWZmZXJcbiAgICAgICAgLnRha2VCdWZmZXJWaWV3KHtcbiAgICAgICAgICBieXRlTGVuZ3RoVG9OZWVkOlxuICAgICAgICAgICAgYWNjZXNzb3IuY291bnQgKlxuICAgICAgICAgICAgY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpICpcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUuZ2V0U2l6ZUluQnl0ZXMoKSxcbiAgICAgICAgICBieXRlU3RyaWRlOiBjb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgKiBjb21wb25lbnRUeXBlLmdldFNpemVJbkJ5dGVzKCksXG4gICAgICAgIH0pXG4gICAgICAgIC51bndyYXBGb3JjZSgpO1xuXG4gICAgICBybkFjY2Vzc29yID0gcm5CdWZmZXJWaWV3XG4gICAgICAgIC50YWtlQWNjZXNzb3Ioe1xuICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogY29tcG9zaXRpb25UeXBlLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICAgICAgY291bnQ6IGFjY2Vzc29yLmNvdW50LFxuICAgICAgICAgIG1heDogYWNjZXNzb3IubWF4LFxuICAgICAgICAgIG1pbjogYWNjZXNzb3IubWluLFxuICAgICAgICAgIG5vcm1hbGl6ZWQ6IGFjY2Vzc29yLm5vcm1hbGl6ZWQsXG4gICAgICAgIH0pXG4gICAgICAgIC51bndyYXBGb3JjZSgpO1xuICAgIH1cblxuICAgIGlmIChJcy5leGlzdChhY2Nlc3Nvci5zcGFyc2UpKSB7XG4gICAgICB0aGlzLnNldFNwYXJzZUFjY2Vzc29yKGFjY2Vzc29yLCBybkFjY2Vzc29yKTtcbiAgICB9XG4gICAgcmV0dXJuIHJuQWNjZXNzb3I7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIFJuLkJ1ZmZlclZpZXcgYW5kIGEgUm4uQWNjZXNzb3IgZnJvbSB0aGUgUm4uQnVmZmVyXG4gICAqICBmcm9tIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgR2x0ZjJCdWZmZXIsIEdsdGYyQnVmZmVyVmlldywgYW5kIEdsdGYyQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBhY2Nlc3NvclxuICAgKiBAcGFyYW0gcm5CdWZmZXJcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0Um5CdWZmZXJWaWV3QW5kUm5BY2Nlc3NvcihhY2Nlc3NvcjogUm5NMkFjY2Vzc29yLCBybkJ1ZmZlcnM6IEJ1ZmZlcltdKSB7XG4gICAgY29uc3QgZ2x0ZkJ1ZmZlclZpZXcgPSBhY2Nlc3Nvci5idWZmZXJWaWV3T2JqZWN0O1xuICAgIGxldCBybkJ1ZmZlclZpZXc6IEJ1ZmZlclZpZXcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGdsdGZCdWZmZXJWaWV3ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuQnVmZmVyID0gcm5CdWZmZXJzW2dsdGZCdWZmZXJWaWV3LmJ1ZmZlciFdO1xuICAgICAgcm5CdWZmZXJWaWV3ID0gdGhpcy5fX2dldFJuQnVmZmVyVmlldyhnbHRmQnVmZmVyVmlldywgcm5CdWZmZXIpO1xuICAgIH1cbiAgICBjb25zdCBybkFjY2Vzc29yID0gdGhpcy5fX2dldFJuQWNjZXNzb3IoYWNjZXNzb3IsIHJuQnVmZmVyVmlldyk7XG4gICAgcmV0dXJuIHJuQWNjZXNzb3I7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2NvcHlSbkFjY2Vzc29yQW5kQnVmZmVyVmlldyhzcmNSbkFjY2Vzc29yOiBBY2Nlc3Nvcikge1xuICAgIGNvbnN0IGJ5dGVTaXplID0gc3JjUm5BY2Nlc3Nvci5lbGVtZW50Q291bnQgKiAzIC8qIHZlYzQgKi8gKiA0OyAvKiBieXRlcyAqL1xuICAgIGNvbnN0IGRzdFJuQnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZU9yR2V0QnVmZmVyKEJ1ZmZlclVzZS5HUFVWZXJ0ZXhEYXRhKTtcbiAgICBjb25zdCBkc3RSbkJ1ZmZlclZpZXcgPSBkc3RSbkJ1ZmZlclxuICAgICAgLnRha2VCdWZmZXJWaWV3KHtcbiAgICAgICAgYnl0ZUxlbmd0aFRvTmVlZDogYnl0ZVNpemUsXG4gICAgICAgIGJ5dGVTdHJpZGU6IDMgLyogdmVjNCAqLyAqIDQgLyogYnl0ZXMgKi8sXG4gICAgICB9KVxuICAgICAgLnVud3JhcEZvcmNlKCk7XG5cbiAgICBjb25zdCBkc3RSbkFjY2Vzc29yID0gZHN0Um5CdWZmZXJWaWV3XG4gICAgICAudGFrZUFjY2Vzc29yKHtcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY291bnQ6IHNyY1JuQWNjZXNzb3IuZWxlbWVudENvdW50LFxuICAgICAgICBtYXg6IHNyY1JuQWNjZXNzb3IubWF4LFxuICAgICAgICBtaW46IHNyY1JuQWNjZXNzb3IubWluLFxuICAgICAgICBub3JtYWxpemVkOiBzcmNSbkFjY2Vzc29yLm5vcm1hbGl6ZWQsXG4gICAgICB9KVxuICAgICAgLnVud3JhcEZvcmNlKCk7XG5cbiAgICBkc3RSbkFjY2Vzc29yLmNvcHlCdWZmZXIoc3JjUm5BY2Nlc3Nvcik7XG5cbiAgICByZXR1cm4gZHN0Um5BY2Nlc3NvcjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fdGFrZVJuQnVmZmVyVmlld0FuZFJuQWNjZXNzb3JGb3JEcmFjbyhcbiAgICBhY2Nlc3NvcjogUm5NMkFjY2Vzc29yLFxuICAgIGNvbXBvc2l0aW9uTnVtOiBDb3VudCxcbiAgICBybkJ1ZmZlcjogQnVmZmVyXG4gICkge1xuICAgIGNvbnN0IHJuQnVmZmVyVmlldyA9IHJuQnVmZmVyXG4gICAgICAudGFrZUJ1ZmZlclZpZXcoe1xuICAgICAgICBieXRlTGVuZ3RoVG9OZWVkOiBhY2Nlc3Nvci5jb3VudCAqIGNvbXBvc2l0aW9uTnVtICogNCxcbiAgICAgICAgYnl0ZVN0cmlkZTogMCxcbiAgICAgIH0pXG4gICAgICAudW53cmFwRm9yY2UoKTtcblxuICAgIGNvbnN0IHJuQWNjZXNzb3IgPSB0aGlzLl9fZ2V0Um5BY2Nlc3NvcihhY2Nlc3Nvciwgcm5CdWZmZXJWaWV3KTtcbiAgICByZXR1cm4gcm5BY2Nlc3NvcjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0Um5CdWZmZXJWaWV3KHJubTJidWZmZXJWaWV3OiBSbk0yQnVmZmVyVmlldywgcm5CdWZmZXI6IEJ1ZmZlcikge1xuICAgIGNvbnN0IHJuQnVmZmVyVmlldyA9IHJuQnVmZmVyXG4gICAgICAudGFrZUJ1ZmZlclZpZXdXaXRoQnl0ZU9mZnNldCh7XG4gICAgICAgIGJ5dGVMZW5ndGhUb05lZWQ6IHJubTJidWZmZXJWaWV3LmJ5dGVMZW5ndGgsXG4gICAgICAgIGJ5dGVTdHJpZGU6IHJubTJidWZmZXJWaWV3LmJ5dGVTdHJpZGUgPz8gMCxcbiAgICAgICAgYnl0ZU9mZnNldDogcm5tMmJ1ZmZlclZpZXcuYnl0ZU9mZnNldCA/PyAwLFxuICAgICAgfSlcbiAgICAgIC51bndyYXBGb3JjZSgpO1xuXG4gICAgcmV0dXJuIHJuQnVmZmVyVmlldztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0R2VvbWV0cnlGcm9tRHJhY29CdWZmZXIoZHJhY286IGFueSwgZGVjb2RlcjogYW55LCBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgZHJhY28uRGVjb2RlckJ1ZmZlcigpO1xuICAgIGJ1ZmZlci5Jbml0KG5ldyBJbnQ4QXJyYXkoYXJyYXlCdWZmZXIpLCBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICBjb25zdCBnZW9tZXRyeVR5cGUgPSBkZWNvZGVyLkdldEVuY29kZWRHZW9tZXRyeVR5cGUoYnVmZmVyKTtcbiAgICBsZXQgZHJhY29HZW9tZXRyeTtcbiAgICBsZXQgZGVjb2RpbmdTdGF0dXM7XG4gICAgaWYgKGdlb21ldHJ5VHlwZSA9PT0gZHJhY28uVFJJQU5HVUxBUl9NRVNIKSB7XG4gICAgICBkcmFjb0dlb21ldHJ5ID0gbmV3IGRyYWNvLk1lc2goKTtcbiAgICAgIGRlY29kaW5nU3RhdHVzID0gZGVjb2Rlci5EZWNvZGVCdWZmZXJUb01lc2goYnVmZmVyLCBkcmFjb0dlb21ldHJ5KTtcbiAgICB9IGVsc2UgaWYgKGdlb21ldHJ5VHlwZSA9PT0gZHJhY28uUE9JTlRfQ0xPVUQpIHtcbiAgICAgIGRyYWNvR2VvbWV0cnkgPSBuZXcgZHJhY28uUG9pbnRDbG91ZCgpO1xuICAgICAgZGVjb2RpbmdTdGF0dXMgPSBkZWNvZGVyLkRlY29kZUJ1ZmZlclRvUG9pbnRDbG91ZChidWZmZXIsIGRyYWNvR2VvbWV0cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvck1zZyA9ICdVbmtub3duIGdlb21ldHJ5IHR5cGUuJztcbiAgICAgIExvZ2dlci5lcnJvcihlcnJvck1zZyk7XG4gICAgfVxuXG4gICAgZHJhY29HZW9tZXRyeS5nZW9tZXRyeVR5cGUgPSBnZW9tZXRyeVR5cGU7IC8vIHN0b3JlXG5cbiAgICBpZiAoIWRlY29kaW5nU3RhdHVzLm9rKCkgfHwgZHJhY29HZW9tZXRyeS5wdHIgPT09IDApIHtcbiAgICAgIGxldCBlcnJvck1zZyA9ICdEZWNvZGluZyBmYWlsZWQ6ICc7XG4gICAgICBlcnJvck1zZyArPSBkZWNvZGluZ1N0YXR1cy5lcnJvcl9tc2coKTtcbiAgICAgIExvZ2dlci5lcnJvcihlcnJvck1zZyk7XG4gICAgICBkcmFjby5kZXN0cm95KGRlY29kZXIpO1xuICAgICAgZHJhY28uZGVzdHJveShkcmFjb0dlb21ldHJ5KTtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGRyYWNvLmRlc3Ryb3koYnVmZmVyKTtcblxuICAgIHJldHVybiBkcmFjb0dlb21ldHJ5O1xuICB9XG5cbiAgc3RhdGljIF9fZ2V0SW5kaWNlc0Zyb21EcmFjbyhcbiAgICBkcmFjbzogYW55LFxuICAgIGRlY29kZXI6IGFueSxcbiAgICBkcmFjb0dlb21ldHJ5OiBhbnksXG4gICAgdHJpYW5nbGVTdHJpcERyYXdNb2RlOiBib29sZWFuXG4gICkge1xuICAgIC8vIEZvciBtZXNoLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBmYWNlcy5cbiAgICBjb25zdCBnZW9tZXRyeVR5cGUgPSBkcmFjb0dlb21ldHJ5Lmdlb21ldHJ5VHlwZTtcbiAgICBpZiAoZ2VvbWV0cnlUeXBlICE9PSBkcmFjby5UUklBTkdVTEFSX01FU0gpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuXG4gICAgbGV0IGluZGljZXM7XG5cbiAgICBpZiAodHJpYW5nbGVTdHJpcERyYXdNb2RlKSB7XG4gICAgICBjb25zdCBzdHJpcHNBcnJheSA9IG5ldyBkcmFjby5EcmFjb0ludDMyQXJyYXkoKTtcbiAgICAgIGRlY29kZXIuR2V0VHJpYW5nbGVTdHJpcHNGcm9tTWVzaChkcmFjb0dlb21ldHJ5LCBzdHJpcHNBcnJheSk7XG4gICAgICBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KHN0cmlwc0FycmF5LnNpemUoKSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmlwc0FycmF5LnNpemUoKTsgKytpKSB7XG4gICAgICAgIGluZGljZXNbaV0gPSBzdHJpcHNBcnJheS5HZXRWYWx1ZShpKTtcbiAgICAgIH1cbiAgICAgIGRyYWNvLmRlc3Ryb3koc3RyaXBzQXJyYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUUklBTkdMRVNcbiAgICAgIGNvbnN0IG51bUZhY2VzID0gZHJhY29HZW9tZXRyeS5udW1fZmFjZXMoKTtcbiAgICAgIGNvbnN0IG51bUluZGljZXMgPSBudW1GYWNlcyAqIDM7XG4gICAgICBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG51bUluZGljZXMpO1xuICAgICAgY29uc3QgaWEgPSBuZXcgZHJhY28uRHJhY29JbnQzMkFycmF5KCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZhY2VzOyArK2kpIHtcbiAgICAgICAgZGVjb2Rlci5HZXRGYWNlRnJvbU1lc2goZHJhY29HZW9tZXRyeSwgaSwgaWEpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGkgKiAzO1xuICAgICAgICBpbmRpY2VzW2luZGV4XSA9IGlhLkdldFZhbHVlKDApO1xuICAgICAgICBpbmRpY2VzW2luZGV4ICsgMV0gPSBpYS5HZXRWYWx1ZSgxKTtcbiAgICAgICAgaW5kaWNlc1tpbmRleCArIDJdID0gaWEuR2V0VmFsdWUoMik7XG4gICAgICB9XG4gICAgICBkcmFjby5kZXN0cm95KGlhKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGljZXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2RlY29kZURyYWNvKFxuICAgIHByaW1pdGl2ZTogUm5NMlByaW1pdGl2ZSxcbiAgICBybkJ1ZmZlcnM6IEJ1ZmZlcltdLFxuICAgIGdsdGZNb2RlbDogUm5NMixcbiAgICBtYXA6IE1hcDxWZXJ0ZXhBdHRyaWJ1dGVTZW1hbnRpY3NKb2luZWRTdHJpbmcsIEFjY2Vzc29yPlxuICApIHtcbiAgICBjb25zdCBidWZmZXJWaWV3ID1cbiAgICAgIGdsdGZNb2RlbC5idWZmZXJWaWV3c1twcmltaXRpdmUuZXh0ZW5zaW9ucy5LSFJfZHJhY29fbWVzaF9jb21wcmVzc2lvbi5idWZmZXJWaWV3XTtcbiAgICBjb25zdCBybkJ1ZmZlclZpZXcgPSB0aGlzLl9fZ2V0Um5CdWZmZXJWaWV3KGJ1ZmZlclZpZXcsIHJuQnVmZmVyc1tidWZmZXJWaWV3LmJ1ZmZlciFdKTtcbiAgICBjb25zdCBhcnJheWJ1ZmZlck9mQnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KHJuQnVmZmVyVmlldy5nZXRVaW50OEFycmF5KCkpLmJ1ZmZlcjtcblxuICAgIGNvbnN0IGRyYWNvID0gbmV3IERyYWNvRGVjb2Rlck1vZHVsZSgpO1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgZHJhY28uRGVjb2RlcigpO1xuICAgIGNvbnN0IGRyYWNvR2VvbWV0cnkgPSB0aGlzLl9fZ2V0R2VvbWV0cnlGcm9tRHJhY29CdWZmZXIoXG4gICAgICBkcmFjbyxcbiAgICAgIGRlY29kZXIsXG4gICAgICBhcnJheWJ1ZmZlck9mQnVmZmVyVmlld1xuICAgICk7XG4gICAgaWYgKGRyYWNvR2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgZHJhY28uZGVzdHJveShkcmFjb0dlb21ldHJ5KTtcbiAgICAgIGRyYWNvLmRlc3Ryb3koZGVjb2Rlcik7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIGNvbnN0IG51bVBvaW50cyA9IGRyYWNvR2VvbWV0cnkubnVtX3BvaW50cygpO1xuICAgIGNvbnN0IHJuQnVmZmVyRm9yRHJhY28gPSB0aGlzLl9fY3JlYXRlQnVmZmVyRm9yRGVjb21wcmVzc2VkRGF0YShwcmltaXRpdmUsIG51bVBvaW50cyk7XG5cbiAgICAvLyBkZWNvZGUgaW5kaWNlc1xuICAgIGNvbnN0IHByaW1pdGl2ZU1vZGUgPSBQcmltaXRpdmVNb2RlLmZyb20ocHJpbWl0aXZlLm1vZGUhKTtcbiAgICBsZXQgaXNUcmlhbmdsZVN0cmlwID0gZmFsc2U7XG4gICAgaWYgKHByaW1pdGl2ZU1vZGUgPT09IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVTdHJpcCkge1xuICAgICAgaXNUcmlhbmdsZVN0cmlwID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRpY2VzID0gdGhpcy5fX2dldEluZGljZXNGcm9tRHJhY28oZHJhY28sIGRlY29kZXIsIGRyYWNvR2VvbWV0cnksIGlzVHJpYW5nbGVTdHJpcCkhO1xuICAgIGNvbnN0IGluZGljZXNSbkFjY2Vzc29yID0gdGhpcy5fX3Rha2VSbkJ1ZmZlclZpZXdBbmRSbkFjY2Vzc29yRm9yRHJhY28oXG4gICAgICBwcmltaXRpdmUuaW5kaWNlc09iamVjdCEsXG4gICAgICAxLFxuICAgICAgcm5CdWZmZXJGb3JEcmFjb1xuICAgICk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbmRpY2VzUm5BY2Nlc3Nvci5zZXRTY2FsYXIoaSwgaW5kaWNlc1tpXSwge30pO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSBhdHRyaWJ1dGVzXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHByaW1pdGl2ZS5hdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBkcmFjb0F0dHJpYnV0ZUlkID1cbiAgICAgICAgcHJpbWl0aXZlLmV4dGVuc2lvbnMuS0hSX2RyYWNvX21lc2hfY29tcHJlc3Npb24uYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTtcblxuICAgICAgY29uc3QgYXR0cmlidXRlR2x0ZjJBY2Nlc3NvciA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVzT2JqZWN0cyFbYXR0cmlidXRlTmFtZV07XG4gICAgICBsZXQgYXR0cmlidXRlUm5BY2Nlc3NvcjogQWNjZXNzb3IgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChJcy5ub3QuZXhpc3QoZHJhY29BdHRyaWJ1dGVJZCkpIHtcbiAgICAgICAgLy8gbm9uLWVuY29kZWQgZGF0YVxuXG4gICAgICAgIGF0dHJpYnV0ZVJuQWNjZXNzb3IgPSB0aGlzLl9fZ2V0Um5CdWZmZXJWaWV3QW5kUm5BY2Nlc3NvcihcbiAgICAgICAgICBhdHRyaWJ1dGVHbHRmMkFjY2Vzc29yISxcbiAgICAgICAgICBybkJ1ZmZlcnNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVuY29kZWQgZGF0YVxuXG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTnVtID0gQ29tcG9zaXRpb25UeXBlLmZyb21TdHJpbmcoXG4gICAgICAgICAgYXR0cmlidXRlR2x0ZjJBY2Nlc3NvciEudHlwZVxuICAgICAgICApLmdldE51bWJlck9mQ29tcG9uZW50cygpO1xuICAgICAgICBhdHRyaWJ1dGVSbkFjY2Vzc29yID0gdGhpcy5fX3Rha2VSbkJ1ZmZlclZpZXdBbmRSbkFjY2Vzc29yRm9yRHJhY28oXG4gICAgICAgICAgYXR0cmlidXRlR2x0ZjJBY2Nlc3NvciEsXG4gICAgICAgICAgY29tcG9zaXRpb25OdW0sXG4gICAgICAgICAgcm5CdWZmZXJGb3JEcmFjb1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRyYWNvQXR0cmlidXRlUG9pbnRlciA9IGRlY29kZXIuR2V0QXR0cmlidXRlQnlVbmlxdWVJZChcbiAgICAgICAgICBkcmFjb0dlb21ldHJ5LFxuICAgICAgICAgIGRyYWNvQXR0cmlidXRlSWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVjb21wcmVzc2VkQXR0cmlidXRlRGF0YSA9IG5ldyBkcmFjby5EcmFjb0Zsb2F0MzJBcnJheSgpO1xuICAgICAgICBkZWNvZGVyLkdldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzKFxuICAgICAgICAgIGRyYWNvR2VvbWV0cnksXG4gICAgICAgICAgZHJhY29BdHRyaWJ1dGVQb2ludGVyLFxuICAgICAgICAgIGRlY29tcHJlc3NlZEF0dHJpYnV0ZURhdGFcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKSB7XG4gICAgICAgICAgaWYgKGNvbXBvc2l0aW9uTnVtID09PSAxKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVSbkFjY2Vzc29yLnNldFNjYWxhcihcbiAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgZGVjb21wcmVzc2VkQXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpICogY29tcG9zaXRpb25OdW0pLFxuICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2l0aW9uTnVtID09PSAyKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVSbkFjY2Vzc29yLnNldFZlYzIoXG4gICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgIGRlY29tcHJlc3NlZEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSAqIGNvbXBvc2l0aW9uTnVtKSxcbiAgICAgICAgICAgICAgZGVjb21wcmVzc2VkQXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpICogY29tcG9zaXRpb25OdW0gKyAxKSxcbiAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGlvbk51bSA9PT0gMykge1xuICAgICAgICAgICAgYXR0cmlidXRlUm5BY2Nlc3Nvci5zZXRWZWMzKFxuICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICBkZWNvbXByZXNzZWRBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkgKiBjb21wb3NpdGlvbk51bSksXG4gICAgICAgICAgICAgIGRlY29tcHJlc3NlZEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSAqIGNvbXBvc2l0aW9uTnVtICsgMSksXG4gICAgICAgICAgICAgIGRlY29tcHJlc3NlZEF0dHJpYnV0ZURhdGEuR2V0VmFsdWUoaSAqIGNvbXBvc2l0aW9uTnVtICsgMiksXG4gICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRpb25OdW0gPT09IDQpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVJuQWNjZXNzb3Iuc2V0VmVjNChcbiAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgZGVjb21wcmVzc2VkQXR0cmlidXRlRGF0YS5HZXRWYWx1ZShpICogY29tcG9zaXRpb25OdW0pLFxuICAgICAgICAgICAgICBkZWNvbXByZXNzZWRBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkgKiBjb21wb3NpdGlvbk51bSArIDEpLFxuICAgICAgICAgICAgICBkZWNvbXByZXNzZWRBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkgKiBjb21wb3NpdGlvbk51bSArIDIpLFxuICAgICAgICAgICAgICBkZWNvbXByZXNzZWRBdHRyaWJ1dGVEYXRhLkdldFZhbHVlKGkgKiBjb21wb3NpdGlvbk51bSArIDMpLFxuICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkcmFjby5kZXN0cm95KGRlY29tcHJlc3NlZEF0dHJpYnV0ZURhdGEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoSXMuZXhpc3QoYXR0cmlidXRlR2x0ZjJBY2Nlc3NvciEuc3BhcnNlKSkge1xuICAgICAgICB0aGlzLnNldFNwYXJzZUFjY2Vzc29yKGF0dHJpYnV0ZUdsdGYyQWNjZXNzb3IhLCBhdHRyaWJ1dGVSbkFjY2Vzc29yISk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpvaW5lZFN0cmluZyA9IFZlcnRleEF0dHJpYnV0ZS50b1ZlcnRleEF0dHJpYnV0ZVNlbWFudGljSm9pbmVkU3RyaW5nQXNHbHRmU3R5bGUoXG4gICAgICAgIFZlcnRleEF0dHJpYnV0ZS5mcm9tU3RyaW5nKGF0dHJpYnV0ZUdsdGYyQWNjZXNzb3IhLmV4dHJhcyEuYXR0cmlidXRlTmFtZSlcbiAgICAgICk7XG4gICAgICBtYXAuc2V0KGpvaW5lZFN0cmluZywgYXR0cmlidXRlUm5BY2Nlc3NvciEpO1xuICAgIH1cblxuICAgIGRyYWNvLmRlc3Ryb3koZHJhY29HZW9tZXRyeSk7XG4gICAgZHJhY28uZGVzdHJveShkZWNvZGVyKTtcblxuICAgIHJldHVybiBpbmRpY2VzUm5BY2Nlc3NvcjtcbiAgfVxuXG4gIHN0YXRpYyBfc2V0dXBUZXh0dXJlVHJhbnNmb3JtKFxuICAgIHRleHR1cmVKc29uOiBSbk0yVGV4dHVyZUluZm8sXG4gICAgcm5NYXRlcmlhbDogTWF0ZXJpYWwsXG4gICAgdGV4dHVyZVRyYW5zZm9ybVNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lLFxuICAgIHRleHR1cmVSb3RhdGlvblNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lXG4gICkge1xuICAgIGlmICh0ZXh0dXJlSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX3RleHR1cmVfdHJhbnNmb3JtKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBNdXRhYmxlVmVjdG9yNC5mcm9tQ29weUFycmF5KFsxLjAsIDEuMCwgMC4wLCAwLjBdKTtcbiAgICAgIGxldCByb3RhdGlvbiA9IDA7XG5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybUpzb24gPSB0ZXh0dXJlSnNvbi5leHRlbnNpb25zLktIUl90ZXh0dXJlX3RyYW5zZm9ybTtcbiAgICAgIGlmICh0cmFuc2Zvcm1Kc29uLnNjYWxlICE9IG51bGwpIHtcbiAgICAgICAgdHJhbnNmb3JtLnggPSB0cmFuc2Zvcm1Kc29uLnNjYWxlWzBdO1xuICAgICAgICB0cmFuc2Zvcm0ueSA9IHRyYW5zZm9ybUpzb24uc2NhbGVbMV07XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNmb3JtSnNvbi5vZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICB0cmFuc2Zvcm0ueiA9IHRyYW5zZm9ybUpzb24ub2Zmc2V0WzBdO1xuICAgICAgICB0cmFuc2Zvcm0udyA9IHRyYW5zZm9ybUpzb24ub2Zmc2V0WzFdO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zZm9ybUpzb24ucm90YXRpb24gIT0gbnVsbCkge1xuICAgICAgICByb3RhdGlvbiA9IHRyYW5zZm9ybUpzb24ucm90YXRpb247XG4gICAgICB9XG5cbiAgICAgIHJuTWF0ZXJpYWwuc2V0UGFyYW1ldGVyKHRleHR1cmVUcmFuc2Zvcm1TaGFkZXJTZW1hbnRpYywgdHJhbnNmb3JtKTtcbiAgICAgIHJuTWF0ZXJpYWwuc2V0UGFyYW1ldGVyKHRleHR1cmVSb3RhdGlvblNoYWRlclNlbWFudGljLCByb3RhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jcmVhdGVCdWZmZXJGb3JEZWNvbXByZXNzZWREYXRhKFxuICAgIHByaW1pdGl2ZTogUm5NMlByaW1pdGl2ZSxcbiAgICBudW1Qb2ludHM6IG51bWJlclxuICApOiBCdWZmZXIge1xuICAgIGxldCBieXRlTGVuZ3RoT2ZCdWZmZXJGb3JEcmFjbyA9IDA7XG5cbiAgICBpZiAoSXMuZXhpc3QocHJpbWl0aXZlLmluZGljZXMpKSB7XG4gICAgICBjb25zdCBjb3VudCA9IHByaW1pdGl2ZS5pbmRpY2VzT2JqZWN0IS5jb3VudDtcbiAgICAgIGJ5dGVMZW5ndGhPZkJ1ZmZlckZvckRyYWNvICs9IGNvdW50ICogNDtcbiAgICB9XG5cbiAgICBjb25zdCBkcmNBdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmV4dGVuc2lvbnMuS0hSX2RyYWNvX21lc2hfY29tcHJlc3Npb24uYXR0cmlidXRlcztcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gcHJpbWl0aXZlLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChkcmNBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09IG51bGwpIHtcbiAgICAgICAgLy8gbm9uLWVuY29kZWQgZGF0YVxuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2Nlc3NvciA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVzT2JqZWN0cyFbYXR0cmlidXRlTmFtZV07XG4gICAgICBjb25zdCBjb21wb3NpdGlvbk51bSA9IENvbXBvc2l0aW9uVHlwZS5mcm9tU3RyaW5nKGFjY2Vzc29yIS50eXBlKS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUJ5dGVMZW5ndGggPSBudW1Qb2ludHMgKiBjb21wb3NpdGlvbk51bSAqIDQ7XG4gICAgICBieXRlTGVuZ3RoT2ZCdWZmZXJGb3JEcmFjbyArPSBhdHRyaWJ1dGVCeXRlTGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVmZmVyKHtcbiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGhPZkJ1ZmZlckZvckRyYWNvLFxuICAgICAgYnVmZmVyOiBuZXcgQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aE9mQnVmZmVyRm9yRHJhY28pLFxuICAgICAgbmFtZTogJ0RyYWNvJyxcbiAgICAgIGJ5dGVBbGlnbjogNCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2VuZXJhdGVWcm1Ob3JtYWxpemVkU2tlbGV0b24oZ2x0Zk1vZGVsOiBSbk0yLCBybkVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdKSB7XG4gICAgLy8gQ3JlYXRlIGEgQ29weSBvZiBTa2VsZXRvblxuICAgIGNvbnN0IGJhY2t1cFJuSm9pbnRzOiBJU2NlbmVHcmFwaEVudGl0eVtdID0gW107XG4gICAgY29uc3QgY3JlYXRlSGllcmFyY2h5UmVjdXJzaXZlbHkgPSAocm5tMk5vZGU6IFJuTTJOb2RlLCBybkVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpID0+IHtcbiAgICAgIGlmIChJcy5leGlzdChybm0yTm9kZS5jaGlsZHJlbikpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZElkeCBvZiBybm0yTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IHJuSm9pbnQgPSBiYWNrdXBSbkpvaW50c1tjaGlsZElkeF07XG4gICAgICAgICAgaWYgKElzLmV4aXN0KHJuSm9pbnQpKSB7XG4gICAgICAgICAgICBybkVudGl0eS5nZXRTY2VuZUdyYXBoKCkuYWRkQ2hpbGQocm5Kb2ludC5nZXRTY2VuZUdyYXBoKCkpO1xuICAgICAgICAgICAgY3JlYXRlSGllcmFyY2h5UmVjdXJzaXZlbHkoZ2x0Zk1vZGVsLm5vZGVzW2NoaWxkSWR4XSwgcm5Kb2ludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBnbHRmTW9kZWwubm9kZXMpIHtcbiAgICAgIGlmIChJcy5leGlzdChub2RlLnNraW5PYmplY3QpKSB7XG4gICAgICAgIGNvbnN0IGpvaW50cyA9IG5vZGUuc2tpbk9iamVjdC5qb2ludHM7XG4gICAgICAgIGZvciAoY29uc3Qgam9pbnRJZHggb2Ygam9pbnRzKSB7XG4gICAgICAgICAgY29uc3Qgcm5Kb2ludEVudGl0eSA9IHJuRW50aXRpZXNbam9pbnRJZHhdO1xuICAgICAgICAgIGNvbnN0IG5ld1JuSm9pbnRFbnRpdHkgPSBjcmVhdGVHcm91cEVudGl0eSgpO1xuICAgICAgICAgIG5ld1JuSm9pbnRFbnRpdHkuZ2V0VHJhbnNmb3JtKCkubG9jYWxNYXRyaXggPSBybkpvaW50RW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsTWF0cml4O1xuICAgICAgICAgIGJhY2t1cFJuSm9pbnRzW2pvaW50SWR4XSA9IG5ld1JuSm9pbnRFbnRpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGdsdGZNb2RlbC5ub2Rlcykge1xuICAgICAgaWYgKElzLmV4aXN0KG5vZGUuc2tpbk9iamVjdCkpIHtcbiAgICAgICAgY29uc3Qgcm5Kb2ludEVudGl0eSA9IGJhY2t1cFJuSm9pbnRzW25vZGUuc2tpbk9iamVjdC5qb2ludHNbMF1dO1xuICAgICAgICBjcmVhdGVIaWVyYXJjaHlSZWN1cnNpdmVseShub2RlLnNraW5PYmplY3Quam9pbnRzT2JqZWN0c1swXSwgcm5Kb2ludEVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIFNrZWxldG9uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbHRmTW9kZWwubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBnbHRmTW9kZWwubm9kZXNbaV07XG4gICAgICBpZiAoSXMuZXhpc3Qobm9kZS5za2luT2JqZWN0KSkge1xuICAgICAgICBjb25zdCBqb2ludHMgPSBub2RlLnNraW5PYmplY3Quam9pbnRzO1xuICAgICAgICBmb3IgKGNvbnN0IGpvaW50SWR4IG9mIGpvaW50cykge1xuICAgICAgICAgIGNvbnN0IHJuSm9pbnRFbnRpdHkgPSBybkVudGl0aWVzW2pvaW50SWR4XTtcbiAgICAgICAgICBybkpvaW50RW50aXR5LmdldFRyYW5zZm9ybSgpLmxvY2FsTWF0cml4ID0gTWF0cml4NDQuaWRlbnRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGpvaW50SWR4IG9mIGpvaW50cykge1xuICAgICAgICAgIGNvbnN0IHJuSm9pbnRFbnRpdHkgPSBybkVudGl0aWVzW2pvaW50SWR4XTtcbiAgICAgICAgICBsZXQgcGFyZW50SW52V29ybGRNYXRyaXggPSBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKTtcbiAgICAgICAgICBpZiAoYmFja3VwUm5Kb2ludHNbam9pbnRJZHhdLmdldFNjZW5lR3JhcGgoKS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudEludldvcmxkTWF0cml4ID0gYmFja3VwUm5Kb2ludHNbam9pbnRJZHhdLmdldFNjZW5lR3JhcGgoKS5wYXJlbnQhLm1hdHJpeC5pbnZlcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm5Kb2ludEVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uID0gcGFyZW50SW52V29ybGRNYXRyaXgubXVsdGlwbHlWZWN0b3IzKFxuICAgICAgICAgICAgYmFja3VwUm5Kb2ludHNbam9pbnRJZHhdLmdldFNjZW5lR3JhcGgoKS5wb3NpdGlvblxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgSW52ZXJzZSBCaW5kIE1hdHJpY2VzIGZyb20gdGhlIG5vcm1hbGl6ZWQgc2tlbGV0b25cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsdGZNb2RlbC5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IGdsdGZNb2RlbC5ub2Rlc1tpXTtcbiAgICAgIGlmIChJcy5leGlzdChub2RlLnNraW5PYmplY3QpKSB7XG4gICAgICAgIGNvbnN0IGpvaW50cyA9IG5vZGUuc2tpbk9iamVjdC5qb2ludHM7XG4gICAgICAgIGNvbnN0IHJuU2tlbGV0YWxFbnRpdHkgPSBybkVudGl0aWVzW2ldO1xuICAgICAgICBjb25zdCBza2VsZXRhbENvbXBvbmVudCA9IHJuU2tlbGV0YWxFbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgICAgICBpZiAoSXMuZXhpc3Qoc2tlbGV0YWxDb21wb25lbnQpKSB7XG4gICAgICAgICAgY29uc3QgYWNjZXNzb3IgPSBza2VsZXRhbENvbXBvbmVudC5nZXRJbnZlcnNlQmluZE1hdHJpY2VzQWNjZXNzb3IoKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGpvaW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3Qgam9pbnRJZHggPSBqb2ludHNbal07XG4gICAgICAgICAgICBjb25zdCBybkpvaW50RW50aXR5ID0gcm5FbnRpdGllc1tqb2ludElkeF07XG4gICAgICAgICAgICBhY2Nlc3NvciEuc2V0TWF0NEFzTWF0cml4NDQoaiwgcm5Kb2ludEVudGl0eS5nZXRTY2VuZUdyYXBoKCkubWF0cml4LmludmVydCgpLCB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwUGJyTWV0YWxsaWNSb3VnaG5lc3MoXG4gIHBick1ldGFsbGljUm91Z2huZXNzOiBSbk0yUGJyTWV0YWxsaWNSb3VnaG5lc3MsXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgZ2x0Zk1vZGVsOiBSbk0yLFxuICBvcHRpb25zOiBHbHRmTG9hZE9wdGlvbiB8IHVuZGVmaW5lZCxcbiAgbWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWxcbikge1xuICBjb25zdCBpc1VubGl0ID0gbWF0ZXJpYWxKc29uLmV4dGVuc2lvbnM/LktIUl9tYXRlcmlhbHNfdW5saXQgIT0gbnVsbDtcblxuICBjb25zdCBiYXNlQ29sb3JGYWN0b3IgPSBwYnJNZXRhbGxpY1JvdWdobmVzcy5iYXNlQ29sb3JGYWN0b3I7XG4gIGlmIChiYXNlQ29sb3JGYWN0b3IgIT0gbnVsbCkge1xuICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignYmFzZUNvbG9yRmFjdG9yJywgVmVjdG9yNC5mcm9tQ29weUFycmF5NChiYXNlQ29sb3JGYWN0b3IpKTtcbiAgfVxuXG4gIC8vIEJhc2VDb2xvciBUZXh0dXJlXG4gIGNvbnN0IGJhc2VDb2xvclRleHR1cmUgPSBwYnJNZXRhbGxpY1JvdWdobmVzcy5iYXNlQ29sb3JUZXh0dXJlO1xuICBpZiAoYmFzZUNvbG9yVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgY29uc3Qgcm5UZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoYmFzZUNvbG9yVGV4dHVyZS50ZXh0dXJlISwgZ2x0Zk1vZGVsLCB7XG4gICAgICBhdXRvRGV0ZWN0VHJhbnNwYXJlbmN5OiBvcHRpb25zPy5hdXRvRGV0ZWN0VGV4dHVyZVRyYW5zcGFyZW5jeSxcbiAgICB9KTtcbiAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihiYXNlQ29sb3JUZXh0dXJlLnRleHR1cmUhKTtcbiAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKCdiYXNlQ29sb3JUZXh0dXJlJywgcm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgIGlmIChiYXNlQ29sb3JUZXh0dXJlLnRleENvb3JkICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignYmFzZUNvbG9yVGV4Y29vcmRJbmRleCcsIGJhc2VDb2xvclRleHR1cmUudGV4Q29vcmQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFtYmllbnQgT2NjbHVzaW9uIFRleHR1cmVcbiAgY29uc3Qgb2NjbHVzaW9uVGV4dHVyZSA9IG1hdGVyaWFsSnNvbi5vY2NsdXNpb25UZXh0dXJlO1xuICBpZiAob2NjbHVzaW9uVGV4dHVyZSAhPSBudWxsICYmIElzLmZhbHN5KGlzVW5saXQpKSB7XG4gICAgY29uc3Qgcm5UZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUob2NjbHVzaW9uVGV4dHVyZS50ZXh0dXJlISwgZ2x0Zk1vZGVsKTtcbiAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihvY2NsdXNpb25UZXh0dXJlLnRleHR1cmUhKTtcbiAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKCdvY2NsdXNpb25UZXh0dXJlJywgcm5UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgIGlmIChvY2NsdXNpb25UZXh0dXJlLnRleENvb3JkICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignb2NjbHVzaW9uVGV4Y29vcmRJbmRleCcsIG9jY2x1c2lvblRleHR1cmUudGV4Q29vcmQpO1xuICAgIH1cbiAgICBpZiAob2NjbHVzaW9uVGV4dHVyZS5zdHJlbmd0aCAhPSBudWxsKSB7XG4gICAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ29jY2x1c2lvblN0cmVuZ3RoJywgb2NjbHVzaW9uVGV4dHVyZS5zdHJlbmd0aCk7XG4gICAgfVxuICAgIE1vZGVsQ29udmVydGVyLl9zZXR1cFRleHR1cmVUcmFuc2Zvcm0oXG4gICAgICBvY2NsdXNpb25UZXh0dXJlLFxuICAgICAgbWF0ZXJpYWwsXG4gICAgICAnb2NjbHVzaW9uVGV4dHVyZVRyYW5zZm9ybScsXG4gICAgICAnb2NjbHVzaW9uVGV4dHVyZVJvdGF0aW9uJ1xuICAgICk7XG4gIH1cblxuICAvLyBNZXRhbGxpYyBGYWN0b3JcbiAgbGV0IG1ldGFsbGljRmFjdG9yID0gcGJyTWV0YWxsaWNSb3VnaG5lc3MubWV0YWxsaWNGYWN0b3I7XG4gIG1ldGFsbGljRmFjdG9yID0gaXNVbmxpdCA/IDAgOiBtZXRhbGxpY0ZhY3RvciA/PyAxO1xuICBsZXQgcm91Z2huZXNzRmFjdG9yID0gcGJyTWV0YWxsaWNSb3VnaG5lc3Mucm91Z2huZXNzRmFjdG9yO1xuICByb3VnaG5lc3NGYWN0b3IgPSBpc1VubGl0ID8gMSA6IHJvdWdobmVzc0ZhY3RvciA/PyAxO1xuICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoXG4gICAgJ21ldGFsbGljUm91Z2huZXNzRmFjdG9yJyxcbiAgICBWZWN0b3IyLmZyb21Db3B5QXJyYXkyKFttZXRhbGxpY0ZhY3Rvciwgcm91Z2huZXNzRmFjdG9yXSlcbiAgKTtcblxuICAvLyBNZXRhbGxpYyByb3VnaG5lc3MgdGV4dHVyZVxuICBjb25zdCBtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUgPSBwYnJNZXRhbGxpY1JvdWdobmVzcy5tZXRhbGxpY1JvdWdobmVzc1RleHR1cmU7XG4gIGlmIChtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUgIT0gbnVsbCAmJiBJcy5mYWxzeShpc1VubGl0KSkge1xuICAgIGNvbnN0IHJuVGV4dHVyZSA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVUZXh0dXJlKG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZS50ZXh0dXJlISwgZ2x0Zk1vZGVsKTtcbiAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUudGV4dHVyZSEpO1xuICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ21ldGFsbGljUm91Z2huZXNzVGV4dHVyZScsIHJuVGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICBpZiAobWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLnRleENvb3JkICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignbWV0YWxsaWNSb3VnaG5lc3NUZXhjb29yZEluZGV4JywgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlLnRleENvb3JkKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiAoSXMuZXhpc3QobWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlPy50ZXh0dXJlPy5pbWFnZT8uaW1hZ2UpKSB7XG4gIC8vICAgY29uc3QgaW1hZ2UgPSBtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUhLnRleHR1cmUhLmltYWdlIS5pbWFnZTtcbiAgLy8gICBjb25zdCB3aWR0aCA9IGltYWdlLndpZHRoO1xuICAvLyAgIGNvbnN0IGhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuICAvLyAgIGNvbnN0IG1ldGFsbGljUm91Z2huZXNzQ2FudmFzID0gY29udmVydEhUTUxJbWFnZUVsZW1lbnRUb0NhbnZhcyhpbWFnZSwgd2lkdGgsIGhlaWdodCk7XG4gIC8vIH1cblxuICAvLyBDbGVhckNvYXRcbiAgc2V0dXBfS0hSX21hdGVyaWFsc19jbGVhcmNvYXQobWF0ZXJpYWxKc29uLCBtYXRlcmlhbCwgZ2x0Zk1vZGVsKTtcblxuICAvLyBUcmFuc21pc3Npb25cbiAgY29uc3QgdHJhbnNtaXNzaW9uID0gc2V0dXBfS0hSX21hdGVyaWFsc190cmFuc21pc3Npb24obWF0ZXJpYWxKc29uLCBtYXRlcmlhbCwgZ2x0Zk1vZGVsKTtcbiAgaWYgKCFvcHRpb25zIS50cmFuc21pc3Npb24pIHtcbiAgICBvcHRpb25zIS50cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb247XG4gIH1cblxuICBzZXR1cF9LSFJfbWF0ZXJpYWxzX3ZvbHVtZShtYXRlcmlhbEpzb24sIG1hdGVyaWFsLCBnbHRmTW9kZWwpO1xuXG4gIHNldHVwX0tIUl9tYXRlcmlhbHNfc2hlZW4obWF0ZXJpYWxKc29uLCBtYXRlcmlhbCwgZ2x0Zk1vZGVsKTtcblxuICBzZXR1cF9LSFJfbWF0ZXJpYWxzX3NwZWN1bGFyKG1hdGVyaWFsSnNvbiwgbWF0ZXJpYWwsIGdsdGZNb2RlbCk7XG5cbiAgc2V0dXBfS0hSX21hdGVyaWFsc19pb3IobWF0ZXJpYWxKc29uLCBtYXRlcmlhbCwgZ2x0Zk1vZGVsKTtcblxuICBzZXR1cF9LSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlKG1hdGVyaWFsSnNvbiwgbWF0ZXJpYWwsIGdsdGZNb2RlbCk7XG5cbiAgc2V0dXBfS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5KG1hdGVyaWFsSnNvbiwgbWF0ZXJpYWwsIGdsdGZNb2RlbCk7XG5cbiAgc2V0dXBfS0hSX21hdGVyaWFsc19lbWlzc2l2ZV9zdHJlbmd0aChtYXRlcmlhbEpzb24sIG1hdGVyaWFsLCBnbHRmTW9kZWwpO1xuXG4gIC8vIEJhc2VDb2xvciBUZXhDb29yZCBUcmFuc2Zvcm1cbiAgc2V0dXBfS0hSX3RleHR1cmVfdHJhbnNmb3JtKGJhc2VDb2xvclRleHR1cmUsIG1hdGVyaWFsLCBtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUpO1xufVxuXG5mdW5jdGlvbiBzZXR1cF9LSFJfbWF0ZXJpYWxzX3RyYW5zbWlzc2lvbihcbiAgbWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWwsXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgZ2x0Zk1vZGVsOiBSbk0yXG4pIHtcbiAgY29uc3QgS0hSX21hdGVyaWFsc190cmFuc21pc3Npb24gPSBtYXRlcmlhbEpzb24uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc190cmFuc21pc3Npb247XG4gIGlmIChJcy5leGlzdChLSFJfbWF0ZXJpYWxzX3RyYW5zbWlzc2lvbikpIHtcbiAgICBjb25zdCB0cmFuc21pc3Npb25GYWN0b3IgPSBJcy5leGlzdChLSFJfbWF0ZXJpYWxzX3RyYW5zbWlzc2lvbi50cmFuc21pc3Npb25GYWN0b3IpXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uLnRyYW5zbWlzc2lvbkZhY3RvclxuICAgICAgOiAwLjA7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCd0cmFuc21pc3Npb25GYWN0b3InLCB0cmFuc21pc3Npb25GYWN0b3IpO1xuXG4gICAgY29uc3QgdHJhbnNtaXNzaW9uVGV4dHVyZSA9IEtIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uLnRyYW5zbWlzc2lvblRleHR1cmU7XG4gICAgaWYgKElzLmV4aXN0KHRyYW5zbWlzc2lvblRleHR1cmUpKSB7XG4gICAgICBjb25zdCByblRyYW5zbWlzc2lvblRleHR1cmUgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlVGV4dHVyZShcbiAgICAgICAgdHJhbnNtaXNzaW9uVGV4dHVyZS50ZXh0dXJlISxcbiAgICAgICAgZ2x0Zk1vZGVsXG4gICAgICApO1xuICAgICAgY29uc3Qgcm5TYW1wbGVyID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVNhbXBsZXIodHJhbnNtaXNzaW9uVGV4dHVyZS50ZXh0dXJlISk7XG4gICAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKCd0cmFuc21pc3Npb25UZXh0dXJlJywgcm5UcmFuc21pc3Npb25UZXh0dXJlLCByblNhbXBsZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNldHVwX0tIUl9tYXRlcmlhbHNfY2xlYXJjb2F0KFxuICBtYXRlcmlhbEpzb246IFJuTTJNYXRlcmlhbCxcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICBnbHRmTW9kZWw6IFJuTTJcbikge1xuICBjb25zdCBLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdCA9IG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc19jbGVhcmNvYXQ7XG4gIGlmIChJcy5leGlzdChLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdCkpIHtcbiAgICAvLyBDbGVhckNvYXQgRmFjdG9yXG4gICAgY29uc3QgY2xlYXJDb2F0RmFjdG9yID0gSXMuZXhpc3QoS0hSX21hdGVyaWFsc19jbGVhcmNvYXQuY2xlYXJjb2F0RmFjdG9yKVxuICAgICAgPyBLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdC5jbGVhcmNvYXRGYWN0b3JcbiAgICAgIDogMC4wO1xuICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignY2xlYXJDb2F0RmFjdG9yJywgY2xlYXJDb2F0RmFjdG9yKTtcbiAgICAvLyBDbGVhckNvYXQgVGV4dHVyZVxuICAgIGNvbnN0IGNsZWFyQ29hdFRleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdC5jbGVhcmNvYXRUZXh0dXJlO1xuICAgIGlmIChjbGVhckNvYXRUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuQ2xlYXJDb2F0VGV4dHVyZSA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVUZXh0dXJlKFxuICAgICAgICBjbGVhckNvYXRUZXh0dXJlLnRleHR1cmUhLFxuICAgICAgICBnbHRmTW9kZWxcbiAgICAgICk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihjbGVhckNvYXRUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ2NsZWFyQ29hdFRleHR1cmUnLCBybkNsZWFyQ29hdFRleHR1cmUsIHJuU2FtcGxlcik7XG4gICAgICBpZiAoY2xlYXJDb2F0VGV4dHVyZS50ZXhDb29yZCAhPSBudWxsKSB7XG4gICAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignY2xlYXJDb2F0VGV4Y29vcmRJbmRleCcsIGNsZWFyQ29hdFRleHR1cmUudGV4Q29vcmQpO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYXJDb2F0IFRleHR1cmUgVHJhbnNmb3JtXG4gICAgICBNb2RlbENvbnZlcnRlci5fc2V0dXBUZXh0dXJlVHJhbnNmb3JtKFxuICAgICAgICBjbGVhckNvYXRUZXh0dXJlLFxuICAgICAgICBtYXRlcmlhbCxcbiAgICAgICAgJ2NsZWFyQ29hdFRleHR1cmVUcmFuc2Zvcm0nLFxuICAgICAgICAnY2xlYXJDb2F0VGV4dHVyZVJvdGF0aW9uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2xlYXJDb2F0IFJvdWdobmVzcyBGYWN0b3JcbiAgICBjb25zdCBjbGVhckNvYXRSb3VnaG5lc3NGYWN0b3IgPSBJcy5leGlzdChLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdC5jbGVhcmNvYXRSb3VnaG5lc3NGYWN0b3IpXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfY2xlYXJjb2F0LmNsZWFyY29hdFJvdWdobmVzc0ZhY3RvclxuICAgICAgOiAwLjA7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdjbGVhckNvYXRSb3VnaG5lc3NGYWN0b3InLCBjbGVhckNvYXRSb3VnaG5lc3NGYWN0b3IpO1xuICAgIC8vIENsZWFyQ29hdCBSb3VnaG5lc3MgVGV4dHVyZVxuICAgIGNvbnN0IGNsZWFyQ29hdFJvdWdobmVzc1RleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdC5jbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlO1xuICAgIGlmIChjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuQ2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZSA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVUZXh0dXJlKFxuICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlLnRleHR1cmUhLFxuICAgICAgICBnbHRmTW9kZWxcbiAgICAgICk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoXG4gICAgICAgICdjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlJyxcbiAgICAgICAgcm5DbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlLFxuICAgICAgICByblNhbXBsZXJcbiAgICAgICk7XG4gICAgICBpZiAoY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZS50ZXhDb29yZCAhPSBudWxsKSB7XG4gICAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcihcbiAgICAgICAgICAnY2xlYXJDb2F0Um91Z2huZXNzVGV4Y29vcmRJbmRleCcsXG4gICAgICAgICAgY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZS50ZXhDb29yZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYXJDb2F0IFJvdWdobmVzcyBUZXh0dXJlIFRyYW5zZm9ybVxuICAgICAgTW9kZWxDb252ZXJ0ZXIuX3NldHVwVGV4dHVyZVRyYW5zZm9ybShcbiAgICAgICAgY2xlYXJDb2F0Um91Z2huZXNzVGV4dHVyZSxcbiAgICAgICAgbWF0ZXJpYWwsXG4gICAgICAgICdjbGVhckNvYXRSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtJyxcbiAgICAgICAgJ2NsZWFyQ29hdFJvdWdobmVzc1RleHR1cmVSb3RhdGlvbidcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIENsZWFyQ29hdCBOb3JtYWwgVGV4dHVyZVxuICAgIGNvbnN0IGNsZWFyQ29hdE5vcm1hbFRleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdC5jbGVhcmNvYXROb3JtYWxUZXh0dXJlO1xuICAgIGlmIChjbGVhckNvYXROb3JtYWxUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuQ2xlYXJDb2F0Tm9ybWFsVGV4dHVyZSA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVUZXh0dXJlKFxuICAgICAgICBjbGVhckNvYXROb3JtYWxUZXh0dXJlLnRleHR1cmUhLFxuICAgICAgICBnbHRmTW9kZWxcbiAgICAgICk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihjbGVhckNvYXROb3JtYWxUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ2NsZWFyQ29hdE5vcm1hbFRleHR1cmUnLCBybkNsZWFyQ29hdE5vcm1hbFRleHR1cmUsIHJuU2FtcGxlcik7XG4gICAgICBpZiAoY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZS50ZXhDb29yZCAhPSBudWxsKSB7XG4gICAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignY2xlYXJDb2F0Tm9ybWFsVGV4Y29vcmRJbmRleCcsIGNsZWFyQ29hdE5vcm1hbFRleHR1cmUudGV4Q29vcmQpO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYXJDb2F0IE5vcm1hbCBUZXh0dXJlIFRyYW5zZm9ybVxuICAgICAgTW9kZWxDb252ZXJ0ZXIuX3NldHVwVGV4dHVyZVRyYW5zZm9ybShcbiAgICAgICAgY2xlYXJDb2F0Tm9ybWFsVGV4dHVyZSxcbiAgICAgICAgbWF0ZXJpYWwsXG4gICAgICAgICdjbGVhckNvYXROb3JtYWxUZXh0dXJlVHJhbnNmb3JtJyxcbiAgICAgICAgJ2NsZWFyQ29hdE5vcm1hbFRleHR1cmVSb3RhdGlvbidcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwX0tIUl9tYXRlcmlhbHNfdm9sdW1lKFxuICBtYXRlcmlhbEpzb246IFJuTTJNYXRlcmlhbCxcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICBnbHRmTW9kZWw6IFJuTTJcbik6IHZvaWQge1xuICBjb25zdCBLSFJfbWF0ZXJpYWxzX3ZvbHVtZSA9IG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc192b2x1bWU7XG4gIGlmIChJcy5leGlzdChLSFJfbWF0ZXJpYWxzX3ZvbHVtZSkpIHtcbiAgICBjb25zdCB0aGlja25lc3NGYWN0b3IgPSBLSFJfbWF0ZXJpYWxzX3ZvbHVtZS50aGlja25lc3NGYWN0b3JcbiAgICAgID8gS0hSX21hdGVyaWFsc192b2x1bWUudGhpY2tuZXNzRmFjdG9yXG4gICAgICA6IDAuMDtcbiAgICBpZiAodGhpY2tuZXNzRmFjdG9yICE9IG51bGwpIHtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcigndGhpY2tuZXNzRmFjdG9yJywgdGhpY2tuZXNzRmFjdG9yKTtcbiAgICB9XG4gICAgY29uc3QgdGhpY2tuZXNzVGV4dHVyZSA9IEtIUl9tYXRlcmlhbHNfdm9sdW1lLnRoaWNrbmVzc1RleHR1cmU7XG4gICAgaWYgKHRoaWNrbmVzc1RleHR1cmUgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgcm5UaGlja25lc3NUZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoXG4gICAgICAgIHRoaWNrbmVzc1RleHR1cmUudGV4dHVyZSEsXG4gICAgICAgIGdsdGZNb2RlbFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJuU2FtcGxlciA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVTYW1wbGVyKHRoaWNrbmVzc1RleHR1cmUudGV4dHVyZSEpO1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcigndGhpY2tuZXNzVGV4dHVyZScsIHJuVGhpY2tuZXNzVGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICB9XG4gICAgY29uc3QgYXR0ZW51YXRpb25EaXN0YW5jZSA9IEtIUl9tYXRlcmlhbHNfdm9sdW1lLmF0dGVudWF0aW9uRGlzdGFuY2VcbiAgICAgID8gS0hSX21hdGVyaWFsc192b2x1bWUuYXR0ZW51YXRpb25EaXN0YW5jZVxuICAgICAgOiAwLjA7XG4gICAgaWYgKGF0dGVudWF0aW9uRGlzdGFuY2UgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdhdHRlbnVhdGlvbkRpc3RhbmNlJywgYXR0ZW51YXRpb25EaXN0YW5jZSk7XG4gICAgfVxuICAgIGNvbnN0IGF0dGVudWF0aW9uQ29sb3IgPSBLSFJfbWF0ZXJpYWxzX3ZvbHVtZS5hdHRlbnVhdGlvbkNvbG9yXG4gICAgICA/IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoS0hSX21hdGVyaWFsc192b2x1bWUuYXR0ZW51YXRpb25Db2xvcilcbiAgICAgIDogVmVjdG9yMy5mcm9tQ29weTMoMS4wLCAxLjAsIDEuMCk7XG4gICAgaWYgKGF0dGVudWF0aW9uQ29sb3IgIT0gbnVsbCkge1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdhdHRlbnVhdGlvbkNvbG9yJywgYXR0ZW51YXRpb25Db2xvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwX0tIUl90ZXh0dXJlX3RyYW5zZm9ybShcbiAgYmFzZUNvbG9yVGV4dHVyZTogUm5NMlRleHR1cmVJbmZvIHwgdW5kZWZpbmVkLFxuICBtYXRlcmlhbDogTWF0ZXJpYWwsXG4gIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZTogUm5NMlRleHR1cmVJbmZvIHwgdW5kZWZpbmVkXG4pIHtcbiAgTW9kZWxDb252ZXJ0ZXIuX3NldHVwVGV4dHVyZVRyYW5zZm9ybShcbiAgICBiYXNlQ29sb3JUZXh0dXJlISxcbiAgICBtYXRlcmlhbCxcbiAgICAnYmFzZUNvbG9yVGV4dHVyZVRyYW5zZm9ybScsXG4gICAgJ2Jhc2VDb2xvclRleHR1cmVSb3RhdGlvbidcbiAgKTtcblxuICAvLyBNZXRhbGxpYyBSb3VnaG5lc3MgVGV4Y29vcmQgVHJhbnNmb3JtXG4gIE1vZGVsQ29udmVydGVyLl9zZXR1cFRleHR1cmVUcmFuc2Zvcm0oXG4gICAgbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlISxcbiAgICBtYXRlcmlhbCxcbiAgICAnbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlVHJhbnNmb3JtJyxcbiAgICAnbWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlUm90YXRpb24nXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNldHVwX0tIUl9tYXRlcmlhbHNfc2hlZW4oXG4gIG1hdGVyaWFsSnNvbjogUm5NMk1hdGVyaWFsLFxuICBtYXRlcmlhbDogTWF0ZXJpYWwsXG4gIGdsdGZNb2RlbDogUm5NMlxuKSB7XG4gIGNvbnN0IEtIUl9tYXRlcmlhbHNfc2hlZW4gPSBtYXRlcmlhbEpzb24/LmV4dGVuc2lvbnM/LktIUl9tYXRlcmlhbHNfc2hlZW47XG4gIGlmIChJcy5leGlzdChLSFJfbWF0ZXJpYWxzX3NoZWVuKSkge1xuICAgIGNvbnN0IHNoZWVuQ29sb3JGYWN0b3IgPSBJcy5leGlzdChLSFJfbWF0ZXJpYWxzX3NoZWVuLnNoZWVuQ29sb3JGYWN0b3IpXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfc2hlZW4uc2hlZW5Db2xvckZhY3RvclxuICAgICAgOiBbMC4wLCAwLjAsIDAuMF07XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdzaGVlbkNvbG9yRmFjdG9yJywgVmVjdG9yMy5mcm9tQ29weUFycmF5MyhzaGVlbkNvbG9yRmFjdG9yKSk7XG4gICAgY29uc3Qgc2hlZW5Db2xvclRleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX3NoZWVuLnNoZWVuQ29sb3JUZXh0dXJlO1xuICAgIGlmIChzaGVlbkNvbG9yVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCByblNoZWVuQ29sb3JUZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoXG4gICAgICAgIHNoZWVuQ29sb3JUZXh0dXJlLnRleHR1cmUhLFxuICAgICAgICBnbHRmTW9kZWxcbiAgICAgICk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihzaGVlbkNvbG9yVGV4dHVyZS50ZXh0dXJlISk7XG4gICAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKCdzaGVlbkNvbG9yVGV4dHVyZScsIHJuU2hlZW5Db2xvclRleHR1cmUsIHJuU2FtcGxlcik7XG4gICAgfVxuICAgIGNvbnN0IHNoZWVuUm91Z2huZXNzRmFjdG9yID0gSXMuZXhpc3QoS0hSX21hdGVyaWFsc19zaGVlbi5zaGVlblJvdWdobmVzc0ZhY3RvcilcbiAgICAgID8gS0hSX21hdGVyaWFsc19zaGVlbi5zaGVlblJvdWdobmVzc0ZhY3RvclxuICAgICAgOiAwLjA7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdzaGVlblJvdWdobmVzc0ZhY3RvcicsIHNoZWVuUm91Z2huZXNzRmFjdG9yKTtcbiAgICBjb25zdCBzaGVlblJvdWdobmVzc1RleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX3NoZWVuLnNoZWVuUm91Z2huZXNzVGV4dHVyZTtcbiAgICBpZiAoc2hlZW5Sb3VnaG5lc3NUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuU2hlZW5Sb3VnaG5lc3NUZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoXG4gICAgICAgIHNoZWVuUm91Z2huZXNzVGV4dHVyZS50ZXh0dXJlISxcbiAgICAgICAgZ2x0Zk1vZGVsXG4gICAgICApO1xuICAgICAgY29uc3Qgcm5TYW1wbGVyID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVNhbXBsZXIoc2hlZW5Sb3VnaG5lc3NUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ3NoZWVuUm91Z2huZXNzVGV4dHVyZScsIHJuU2hlZW5Sb3VnaG5lc3NUZXh0dXJlLCByblNhbXBsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cF9LSFJfbWF0ZXJpYWxzX3NwZWN1bGFyKFxuICBtYXRlcmlhbEpzb246IFJuTTJNYXRlcmlhbCxcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICBnbHRmTW9kZWw6IFJuTTJcbikge1xuICBjb25zdCBLSFJfbWF0ZXJpYWxzX3NwZWN1bGFyID0gbWF0ZXJpYWxKc29uPy5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX3NwZWN1bGFyO1xuICBpZiAoSXMuZXhpc3QoS0hSX21hdGVyaWFsc19zcGVjdWxhcikpIHtcbiAgICBjb25zdCBzcGVjdWxhckZhY3RvciA9IElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfc3BlY3VsYXIuc3BlY3VsYXJGYWN0b3IpXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfc3BlY3VsYXIuc3BlY3VsYXJGYWN0b3JcbiAgICAgIDogMS4wO1xuICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignc3BlY3VsYXJGYWN0b3InLCBzcGVjdWxhckZhY3Rvcik7XG4gICAgY29uc3Qgc3BlY3VsYXJUZXh0dXJlID0gS0hSX21hdGVyaWFsc19zcGVjdWxhci5zcGVjdWxhclRleHR1cmU7XG4gICAgaWYgKHNwZWN1bGFyVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCByblNwZWN1bGFyVGV4dHVyZSA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVUZXh0dXJlKHNwZWN1bGFyVGV4dHVyZS50ZXh0dXJlISwgZ2x0Zk1vZGVsKTtcbiAgICAgIGNvbnN0IHJuU2FtcGxlciA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVTYW1wbGVyKHNwZWN1bGFyVGV4dHVyZS50ZXh0dXJlISk7XG4gICAgICBtYXRlcmlhbC5zZXRUZXh0dXJlUGFyYW1ldGVyKCdzcGVjdWxhclRleHR1cmUnLCByblNwZWN1bGFyVGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICB9XG4gICAgY29uc3QgU3BlY3VsYXJDb2xvckZhY3RvciA9IElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfc3BlY3VsYXIuc3BlY3VsYXJDb2xvckZhY3RvcilcbiAgICAgID8gS0hSX21hdGVyaWFsc19zcGVjdWxhci5zcGVjdWxhckNvbG9yRmFjdG9yXG4gICAgICA6IFsxLjAsIDEuMCwgMS4wXTtcbiAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ3NwZWN1bGFyQ29sb3JGYWN0b3InLCBWZWN0b3IzLmZyb21Db3B5QXJyYXkzKFNwZWN1bGFyQ29sb3JGYWN0b3IpKTtcbiAgICBjb25zdCBTcGVjdWxhckNvbG9yVGV4dHVyZSA9IEtIUl9tYXRlcmlhbHNfc3BlY3VsYXIuc3BlY3VsYXJDb2xvclRleHR1cmU7XG4gICAgaWYgKFNwZWN1bGFyQ29sb3JUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuU3BlY3VsYXJDb2xvclRleHR1cmUgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlVGV4dHVyZShcbiAgICAgICAgU3BlY3VsYXJDb2xvclRleHR1cmUudGV4dHVyZSEsXG4gICAgICAgIGdsdGZNb2RlbFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJuU2FtcGxlciA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVTYW1wbGVyKFNwZWN1bGFyQ29sb3JUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ3NwZWN1bGFyQ29sb3JUZXh0dXJlJywgcm5TcGVjdWxhckNvbG9yVGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0dXBfS0hSX21hdGVyaWFsc19pb3IobWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWwsIG1hdGVyaWFsOiBNYXRlcmlhbCwgZ2x0Zk1vZGVsOiBSbk0yKSB7XG4gIGNvbnN0IEtIUl9tYXRlcmlhbHNfaW9yID0gbWF0ZXJpYWxKc29uPy5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX2lvcjtcbiAgaWYgKElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfaW9yKSkge1xuICAgIGNvbnN0IGlvciA9IElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfaW9yLmlvcikgPyBLSFJfbWF0ZXJpYWxzX2lvci5pb3IgOiAxLjU7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdpb3InLCBpb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwX0tIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UoXG4gIG1hdGVyaWFsSnNvbjogUm5NMk1hdGVyaWFsLFxuICBtYXRlcmlhbDogTWF0ZXJpYWwsXG4gIGdsdGZNb2RlbDogUm5NMlxuKSB7XG4gIGNvbnN0IEtIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UgPSBtYXRlcmlhbEpzb24/LmV4dGVuc2lvbnM/LktIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2U7XG4gIGlmIChJcy5leGlzdChLSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlKSkge1xuICAgIGNvbnN0IGlyaWRlc2NlbmNlRmFjdG9yID0gSXMuZXhpc3QoS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZS5pcmlkZXNjZW5jZUZhY3RvcilcbiAgICAgID8gS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZS5pcmlkZXNjZW5jZUZhY3RvclxuICAgICAgOiAwLjA7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdpcmlkZXNjZW5jZUZhY3RvcicsIGlyaWRlc2NlbmNlRmFjdG9yKTtcbiAgICBjb25zdCBpcmlkZXNjZW5jZVRleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlLmlyaWRlc2NlbmNlVGV4dHVyZTtcbiAgICBpZiAoaXJpZGVzY2VuY2VUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuSXJpZGVzY2VuY2VUZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoXG4gICAgICAgIGlyaWRlc2NlbmNlVGV4dHVyZS50ZXh0dXJlISxcbiAgICAgICAgZ2x0Zk1vZGVsXG4gICAgICApO1xuICAgICAgY29uc3Qgcm5TYW1wbGVyID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVNhbXBsZXIoaXJpZGVzY2VuY2VUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ2lyaWRlc2NlbmNlVGV4dHVyZScsIHJuSXJpZGVzY2VuY2VUZXh0dXJlLCByblNhbXBsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGlyaWRlc2NlbmNlSW9yID0gSXMuZXhpc3QoS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZS5pcmlkZXNjZW5jZUlvcilcbiAgICAgID8gS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZS5pcmlkZXNjZW5jZUlvclxuICAgICAgOiAxLjM7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdpcmlkZXNjZW5jZUlvcicsIGlyaWRlc2NlbmNlSW9yKTtcblxuICAgIGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSA9IElzLmV4aXN0KFxuICAgICAgS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW1cbiAgICApXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UuaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtXG4gICAgICA6IDEwMC4wO1xuICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtJywgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtKTtcblxuICAgIGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSA9IElzLmV4aXN0KFxuICAgICAgS0hSX21hdGVyaWFsc19pcmlkZXNjZW5jZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW1cbiAgICApXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UuaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtXG4gICAgICA6IDQwMC4wO1xuICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtJywgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtKTtcblxuICAgIGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZSA9IEtIUl9tYXRlcmlhbHNfaXJpZGVzY2VuY2UuaXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlO1xuICAgIGlmIChpcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgcm5JcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlVGV4dHVyZShcbiAgICAgICAgaXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlLnRleHR1cmUhLFxuICAgICAgICBnbHRmTW9kZWxcbiAgICAgICk7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihpcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUudGV4dHVyZSEpO1xuICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgJ2lyaWRlc2NlbmNlVGhpY2tuZXNzVGV4dHVyZScsXG4gICAgICAgIHJuSXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlLFxuICAgICAgICByblNhbXBsZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldHVwX0tIUl9tYXRlcmlhbHNfYW5pc290cm9weShcbiAgbWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWwsXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgZ2x0Zk1vZGVsOiBSbk0yXG4pIHtcbiAgY29uc3QgS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5ID0gbWF0ZXJpYWxKc29uPy5leHRlbnNpb25zPy5LSFJfbWF0ZXJpYWxzX2FuaXNvdHJvcHk7XG4gIGlmIChJcy5leGlzdChLSFJfbWF0ZXJpYWxzX2FuaXNvdHJvcHkpKSB7XG4gICAgY29uc3QgYW5pc290cm9weVN0cmVuZ3RoID0gSXMuZXhpc3QoS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5LmFuaXNvdHJvcHlTdHJlbmd0aClcbiAgICAgID8gS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5LmFuaXNvdHJvcHlTdHJlbmd0aFxuICAgICAgOiAwLjA7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdhbmlzb3Ryb3B5U3RyZW5ndGgnLCBhbmlzb3Ryb3B5U3RyZW5ndGgpO1xuICAgIGNvbnN0IGFuaXNvdHJvcHlSb3RhdGlvbiA9IElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfYW5pc290cm9weS5hbmlzb3Ryb3B5Um90YXRpb24pXG4gICAgICA/IEtIUl9tYXRlcmlhbHNfYW5pc290cm9weS5hbmlzb3Ryb3B5Um90YXRpb25cbiAgICAgIDogMC4wO1xuICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcihcbiAgICAgICdhbmlzb3Ryb3B5Um90YXRpb24nLFxuICAgICAgVmVjdG9yMi5mcm9tQ29weTIoTWF0aC5jb3MoYW5pc290cm9weVJvdGF0aW9uKSwgTWF0aC5zaW4oYW5pc290cm9weVJvdGF0aW9uKSlcbiAgICApO1xuXG4gICAgY29uc3QgYW5pc290cm9weVRleHR1cmUgPSBLSFJfbWF0ZXJpYWxzX2FuaXNvdHJvcHkuYW5pc290cm9weVRleHR1cmU7XG4gICAgaWYgKGFuaXNvdHJvcHlUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJuQW5pc290cm9weVRleHR1cmUgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlVGV4dHVyZShcbiAgICAgICAgYW5pc290cm9weVRleHR1cmUudGV4dHVyZSEsXG4gICAgICAgIGdsdGZNb2RlbFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJuU2FtcGxlciA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVTYW1wbGVyKGFuaXNvdHJvcHlUZXh0dXJlLnRleHR1cmUhKTtcbiAgICAgIG1hdGVyaWFsLnNldFRleHR1cmVQYXJhbWV0ZXIoJ2FuaXNvdHJvcHlUZXh0dXJlJywgcm5Bbmlzb3Ryb3B5VGV4dHVyZSwgcm5TYW1wbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0dXBfS0hSX21hdGVyaWFsc19lbWlzc2l2ZV9zdHJlbmd0aChcbiAgbWF0ZXJpYWxKc29uOiBSbk0yTWF0ZXJpYWwsXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgZ2x0Zk1vZGVsOiBSbk0yXG4pIHtcbiAgY29uc3QgS0hSX21hdGVyaWFsc19lbWlzc2l2ZV9zdHJlbmd0aCA9IG1hdGVyaWFsSnNvbj8uZXh0ZW5zaW9ucz8uS0hSX21hdGVyaWFsc19lbWlzc2l2ZV9zdHJlbmd0aDtcbiAgaWYgKElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfZW1pc3NpdmVfc3RyZW5ndGgpKSB7XG4gICAgY29uc3QgZW1pc3NpdmVTdHJlbmd0aCA9IElzLmV4aXN0KEtIUl9tYXRlcmlhbHNfZW1pc3NpdmVfc3RyZW5ndGguZW1pc3NpdmVTdHJlbmd0aClcbiAgICAgID8gS0hSX21hdGVyaWFsc19lbWlzc2l2ZV9zdHJlbmd0aC5lbWlzc2l2ZVN0cmVuZ3RoXG4gICAgICA6IDEuMDtcbiAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ2VtaXNzaXZlU3RyZW5ndGgnLCBlbWlzc2l2ZVN0cmVuZ3RoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRWZmZWtzZWVyQ29tcG9uZW50LCBJRWZmZWtzZWVyRW50aXR5TWV0aG9kcyB9IGZyb20gJy4uLy4uL2VmZmVrc2Vlci9FZmZla3NlZXJDb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgUm5NMixcbiAgUm5NMkV4dGVuc2lvbnNFZmZla3NlZXJFZmZlY3QsXG4gIFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmUsXG4gIFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmVJdGVtLFxufSBmcm9tICcuLi8uLi90eXBlcy9Sbk0yJztcbmltcG9ydCB7XG4gIEFuaW1hdGlvbkNvbXBvbmVudCxcbiAgSUFuaW1hdGlvbkVudGl0eU1ldGhvZHMsXG4gIElTY2VuZUdyYXBoRW50aXR5TWV0aG9kcyxcbiAgSVRyYW5zZm9ybUVudGl0eU1ldGhvZHMsXG4gIFdlbGxLbm93bkNvbXBvbmVudFRJRHMsXG59IGZyb20gJy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBBbmltYXRpb25JbnRlcnBvbGF0aW9uIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uL21pc2MvRGF0YVV0aWwnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIFJob2Rvbml0ZUltcG9ydEV4dGVuc2lvbiB7XG4gIHByaXZhdGUgc3RhdGljIF9faW5zdGFuY2U6IFJob2Rvbml0ZUltcG9ydEV4dGVuc2lvbjtcblxuICBzdGF0aWMgaW1wb3J0QmlsbGJvYXJkKGdsdGZKc29uOiBSbk0yLCBncm91cHM6IElTY2VuZUdyYXBoRW50aXR5W10pIHtcbiAgICBjb25zdCBSSE9ET05JVEVfYmlsbGJvYXJkID0gJ1JIT0RPTklURV9iaWxsYm9hcmQnO1xuICAgIGlmIChcbiAgICAgIElzLm5vdC5leGlzdChnbHRmSnNvbi5leHRlbnNpb25zVXNlZCkgfHxcbiAgICAgIGdsdGZKc29uLmV4dGVuc2lvbnNVc2VkLmZpbmRJbmRleCgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBSSE9ET05JVEVfYmlsbGJvYXJkID09PSBleHRlbnNpb247XG4gICAgICB9KSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5vZGVfaSBpbiBnbHRmSnNvbi5ub2Rlcykge1xuICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbbm9kZV9pXTtcbiAgICAgIGNvbnN0IG5vZGVKc29uID0gZ2x0Zkpzb24ubm9kZXNbbm9kZV9pXTtcbiAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSBncm91cC5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICBpZiAobm9kZUpzb24uZXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChub2RlSnNvbi5leHRlbnNpb25zLlJIT0RPTklURV9iaWxsYm9hcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChub2RlSnNvbi5leHRlbnNpb25zLlJIT0RPTklURV9iaWxsYm9hcmQuaXNCaWxsYm9hcmQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHNjZW5lR3JhcGhDb21wb25lbnQuaXNCaWxsYm9hcmQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpbXBvcnRFZmZlY3QoZ2x0Zkpzb246IFJuTTIsIHJvb3RHcm91cDogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBjb25zdCBSSE9ET05JVEVfZWZmZWtzZWVyID0gJ1JIT0RPTklURV9lZmZla3NlZXInO1xuICAgIGlmIChcbiAgICAgIElzLm5vdC5leGlzdChnbHRmSnNvbi5leHRlbnNpb25zKSB8fFxuICAgICAgSXMubm90LmV4aXN0KGdsdGZKc29uLmV4dGVuc2lvbnMuUkhPRE9OSVRFX2VmZmVrc2VlcikgfHxcbiAgICAgIGdsdGZKc29uLmV4dGVuc2lvbnNVc2VkLmZpbmRJbmRleCgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBSSE9ET05JVEVfZWZmZWtzZWVyID09PSBleHRlbnNpb247XG4gICAgICB9KSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW50aXRpZXMgPSByb290R3JvdXAuZ2V0VGFnVmFsdWUoJ3JuRW50aXRpZXMnKSBhcyBJU2NlbmVHcmFwaEVudGl0eVtdO1xuICAgIGNvbnN0IGVmZmVjdHMgPSBnbHRmSnNvbi5leHRlbnNpb25zLlJIT0RPTklURV9lZmZla3NlZXJcbiAgICAgIC5lZmZlY3RzIGFzIFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyRWZmZWN0W107XG5cbiAgICBmb3IgKGNvbnN0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllc1tlZmZlY3Qubm9kZV07XG4gICAgICBjb25zdCBlZmZla3NlZXJFbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KEVmZmVrc2VlckNvbXBvbmVudCwgZW50aXR5KTtcbiAgICAgIGNvbnN0IGVmZmVrc2VlckNvbXBvbmVudCA9IGVmZmVrc2VlckVudGl0eS5nZXRFZmZla3NlZXIoKTtcbiAgICAgIGVmZmVrc2VlckNvbXBvbmVudC5wbGF5SnVzdEFmdGVyTG9hZGVkID0gdHJ1ZTtcbiAgICAgIC8vIGVmZmVrc2VlckNvbXBvbmVudC5yYW5kb21TZWVkID0gMTtcbiAgICAgIGVmZmVrc2VlckNvbXBvbmVudC5pc0xvb3AgPSB0cnVlO1xuICAgICAgaWYgKElzLmV4aXN0KGVmZmVjdC5idWZmZXJWaWV3KSkge1xuICAgICAgICBjb25zdCBybm0yQnVmZmVyID0gZ2x0Zkpzb24uYnVmZmVyc1swXTtcbiAgICAgICAgcm5tMkJ1ZmZlci5idWZmZXJQcm9taXNlIS50aGVuKChhcnJheUJ1ZmZlck9mQnVmZmVyOiBBcnJheUJ1ZmZlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGltYWdlVWludDhBcnJheSA9IERhdGFVdGlsLmNyZWF0ZVVpbnQ4QXJyYXlGcm9tQnVmZmVyVmlld0luZm8oXG4gICAgICAgICAgICBnbHRmSnNvbixcbiAgICAgICAgICAgIGVmZmVjdC5idWZmZXJWaWV3ISxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyT2ZCdWZmZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGVmZmVrc2VlckNvbXBvbmVudC5hcnJheUJ1ZmZlciA9IGltYWdlVWludDhBcnJheS5idWZmZXIuc2xpY2UoXG4gICAgICAgICAgICBpbWFnZVVpbnQ4QXJyYXkuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIGltYWdlVWludDhBcnJheS5ieXRlT2Zmc2V0ICsgaW1hZ2VVaW50OEFycmF5LmJ5dGVMZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGVmZmVrc2VlckNvbXBvbmVudC50eXBlID0gJ2Vma3BrZyc7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChJcy5leGlzdChlZmZlY3QudXJpKSkge1xuICAgICAgICBlZmZla3NlZXJDb21wb25lbnQudXJpID0gZWZmZWN0LnVyaTtcbiAgICAgICAgZWZmZWtzZWVyQ29tcG9uZW50LnR5cGUgPSAnZWZrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIExvZ2dlci5lcnJvcignTm8gcmVhbCBlZmZlY3QgZGF0YS4nKTtcbiAgICAgIH1cblxuICAgICAgY3JlYXRlRWZmZWtzZWVyQW5pbWF0aW9uKGVmZmVrc2VlckVudGl0eSwgZWZmZWN0KTtcblxuICAgICAgY29uc3QgVW56aXAgPSByZXF1aXJlKCd6bGlianMvYmluL3VuemlwLm1pbicpLlpsaWIuVW56aXA7XG4gICAgICBFZmZla3NlZXJDb21wb25lbnQuVW56aXAgPSBVbnppcDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWZmZWtzZWVyQW5pbWF0aW9uKFxuICBlbnRpdHk6IElFbnRpdHkgJiBJVHJhbnNmb3JtRW50aXR5TWV0aG9kcyAmIElTY2VuZUdyYXBoRW50aXR5TWV0aG9kcyAmIElFZmZla3NlZXJFbnRpdHlNZXRob2RzLFxuICBlZmZlY3Q6IFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyRWZmZWN0XG4pIHtcbiAgY29uc3QgZWZmZWtzZWVyQ29tcG9uZW50ID0gZW50aXR5LmdldENvbXBvbmVudEJ5Q29tcG9uZW50VElEKFxuICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuRWZmZWtzZWVyQ29tcG9uZW50VElEXG4gICkgYXMgRWZmZWtzZWVyQ29tcG9uZW50O1xuICBpZiAoSXMuZXhpc3QoZWZmZWtzZWVyQ29tcG9uZW50KSkge1xuICAgIGVmZmVrc2VlckNvbXBvbmVudC5wbGF5SnVzdEFmdGVyTG9hZGVkID0gdHJ1ZTtcbiAgICBlZmZla3NlZXJDb21wb25lbnQuaXNMb29wID0gdHJ1ZTtcblxuICAgIGlmIChJcy5leGlzdChlZmZlY3QudGltZWxpbmVzKSkge1xuICAgICAgY29uc3QgdGltZWxpbmVzID0gZWZmZWN0LnRpbWVsaW5lcyBhcyBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlclRpbWVsaW5lW107XG4gICAgICBmb3IgKGNvbnN0IHRpbWVsaW5lIG9mIHRpbWVsaW5lcykge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aW1lbGluZS52YWx1ZXMgYXMgUm5NMkV4dGVuc2lvbnNFZmZla3NlZXJUaW1lbGluZUl0ZW1bXTtcbiAgICAgICAgY29uc3QgdGltZWxpbmVOYW1lID0gdGltZWxpbmUubmFtZTtcbiAgICAgICAgY29uc3QgdGltZWxpbmVWYWx1ZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdmFsdWUuaW5wdXQsXG4gICAgICAgICAgICBldmVudDogdmFsdWUuZXZlbnQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBhbmltYXRpb25Db21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRBbmltYXRpb24oKTtcbiAgICAgICAgbGV0IGFuaW1hdGlvbkVudGl0eTpcbiAgICAgICAgICB8IChJRW50aXR5ICZcbiAgICAgICAgICAgICAgSVRyYW5zZm9ybUVudGl0eU1ldGhvZHMgJlxuICAgICAgICAgICAgICBJU2NlbmVHcmFwaEVudGl0eU1ldGhvZHMgJlxuICAgICAgICAgICAgICBJRWZmZWtzZWVyRW50aXR5TWV0aG9kcyAmXG4gICAgICAgICAgICAgIElBbmltYXRpb25FbnRpdHlNZXRob2RzKVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoSXMubm90LmV4aXN0KGFuaW1hdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICBhbmltYXRpb25FbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KEFuaW1hdGlvbkNvbXBvbmVudCwgZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBhbmltYXRpb25Db21wb25lbnQgPSBhbmltYXRpb25FbnRpdHkhLmdldEFuaW1hdGlvbigpO1xuICAgICAgICBhbmltYXRpb25Db21wb25lbnQuc2V0QW5pbWF0aW9uKFxuICAgICAgICAgIElzLmV4aXN0KHRpbWVsaW5lTmFtZSkgPyB0aW1lbGluZU5hbWUgOiAnRGVmYXVsdCcsXG4gICAgICAgICAgJ2VmZmVrc2VlcicsXG4gICAgICAgICAgbmV3IEZsb2F0MzJBcnJheSh0aW1lbGluZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiB2YWx1ZS5pbnB1dCkpLFxuICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICAgICAgICB0aW1lbGluZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS5ldmVudCA9PT0gJ3BsYXknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXZlbnQgPT09ICdwYXVzZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIDEsXG4gICAgICAgICAgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbi5TdGVwLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEdsdGYySW1wb3J0ZXIgfSBmcm9tICcuL0dsdGYySW1wb3J0ZXInO1xuaW1wb3J0IHsgTW9kZWxDb252ZXJ0ZXIgfSBmcm9tICcuL01vZGVsQ29udmVydGVyJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBWcm0weCwgVnJtMHhCb25lR3JvdXAgfSBmcm9tICcuLi8uLi90eXBlcy9WUk0weCc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IEdsdGZMb2FkT3B0aW9uLCBSbk0yIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL1RleHR1cmUnO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5IH0gZnJvbSAnLi4vcGh5c2ljcy9WUk1TcHJpbmcvVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneSc7XG5pbXBvcnQgeyBQaHlzaWNzQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9QaHlzaWNzL1BoeXNpY3NDb21wb25lbnQnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50JztcbmltcG9ydCB7IFNwaGVyZUNvbGxpZGVyIH0gZnJvbSAnLi4vcGh5c2ljcy9WUk1TcHJpbmcvU3BoZXJlQ29sbGlkZXInO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBWUk1Db2xsaWRlckdyb3VwIH0gZnJvbSAnLi4vcGh5c2ljcy9WUk1TcHJpbmcvVlJNQ29sbGlkZXJHcm91cCc7XG5pbXBvcnQgeyBWUk1TcHJpbmcgfSBmcm9tICcuLi9waHlzaWNzL1ZSTVNwcmluZy9WUk1TcHJpbmcnO1xuaW1wb3J0IHsgYXNzZXJ0SXNPaywgRXJyLCBSZXN1bHQsIE9rIH0gZnJvbSAnLi4vbWlzYy9SZXN1bHQnO1xuaW1wb3J0IHsgVnJtQ29tcG9uZW50LCBWcm1FeHByZXNzaW9uIH0gZnJvbSAnLi4vY29tcG9uZW50cy9Wcm0vVnJtQ29tcG9uZW50JztcbmltcG9ydCB7IFNhbXBsZXIgfSBmcm9tICcuLi90ZXh0dXJlcy9TYW1wbGVyJztcbmltcG9ydCB7IFZSTVNwcmluZ0JvbmUgfSBmcm9tICcuLi9waHlzaWNzL1ZSTVNwcmluZy9WUk1TcHJpbmdCb25lJztcbmltcG9ydCB7IFRleHR1cmVQYXJhbWV0ZXIgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5cbi8qKlxuICogVGhlIFZSTSBJbXBvcnRlciBjbGFzcy5cbiAqIFRoaXMgY2xhc3Mgd2lsbCBiZSBpbnRlZ3JhdGVkIGludG8gR2x0ZkltcG9ydGVyLlxuICovXG5leHBvcnQgY2xhc3MgVnJtMHhJbXBvcnRlciB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgVlJNIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGltcG9ydEZyb21VcmkoXG4gICAgdXJpOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEdsdGZMb2FkT3B0aW9uXG4gICk6IFByb21pc2U8UmVzdWx0PElTY2VuZUdyYXBoRW50aXR5W10sIEVycjxSbk0yLCB1bmRlZmluZWQ+Pj4ge1xuICAgIG9wdGlvbnMgPSB0aGlzLl9nZXRPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgR2x0ZjJJbXBvcnRlci5pbXBvcnRGcm9tVXJpKHVyaSwgb3B0aW9ucyk7XG4gICAgaWYgKHJlc3VsdC5faXNFcnIoKSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIGltcG9ydCBWUk0gZmlsZS4nLFxuICAgICAgICBlcnJvcjogcmVzdWx0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXNzZXJ0SXNPayhyZXN1bHQpO1xuICAgIGNvbnN0IGdsdGZNb2RlbCA9IHJlc3VsdC5nZXQoKTtcbiAgICBjb25zdCB0ZXh0dXJlcyA9IFZybTB4SW1wb3J0ZXIuX2NyZWF0ZVRleHR1cmVzKGdsdGZNb2RlbCk7XG4gICAgY29uc3Qgc2FtcGxlcnMgPSBWcm0weEltcG9ydGVyLl9jcmVhdGVTYW1wbGVycyhnbHRmTW9kZWwpO1xuICAgIGNvbnN0IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPVxuICAgICAgZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcz8ucm5Mb2FkZXJPcHRpb25zPy5kZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5O1xuICAgIGlmIChJcy5leGlzdChkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5KSkge1xuICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS50ZXh0dXJlcyA9IHRleHR1cmVzO1xuICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5zYW1wbGVycyA9IHNhbXBsZXJzO1xuICAgIH1cblxuICAgIFZybTB4SW1wb3J0ZXIuX2luaXRpYWxpemVNYXRlcmlhbFByb3BlcnRpZXMoZ2x0Zk1vZGVsLCB0ZXh0dXJlcy5sZW5ndGgpO1xuXG4gICAgLy8gc2V0dXAgcm9vdEdyb3VwXG4gICAgbGV0IHJvb3RHcm91cHM7XG4gICAgY29uc3Qgcm9vdEdyb3VwTWFpbiA9IE1vZGVsQ29udmVydGVyLmNvbnZlcnRUb1Job2Rvbml0ZU9iamVjdChnbHRmTW9kZWwhKTtcblxuICAgIGNvbnN0IGV4aXN0T3V0bGluZSA9IFZybTB4SW1wb3J0ZXIuX2V4aXN0T3V0bGluZU1hdGVyaWFsKGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTSk7XG4gICAgaWYgKGV4aXN0T3V0bGluZSkge1xuICAgICAgaWYgKElzLmV4aXN0KGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkpKSB7XG4gICAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0uaXNPdXRsaW5lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvb3RHcm91cE91dGxpbmUgPSBNb2RlbENvbnZlcnRlci5jb252ZXJ0VG9SaG9kb25pdGVPYmplY3QoZ2x0Zk1vZGVsKTtcblxuICAgICAgcm9vdEdyb3VwcyA9IFtyb290R3JvdXBNYWluLCByb290R3JvdXBPdXRsaW5lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEdyb3VwcyA9IFtyb290R3JvdXBNYWluXTtcbiAgICB9XG4gICAgVnJtMHhJbXBvcnRlci5fcmVhZFNwcmluZ0JvbmUoZ2x0Zk1vZGVsIGFzIFZybTB4KTtcbiAgICBWcm0weEltcG9ydGVyLl9yZWFkVlJNSHVtYW5vaWRJbmZvKGdsdGZNb2RlbCBhcyBWcm0weCwgcm9vdEdyb3VwTWFpbik7XG5cbiAgICByZXR1cm4gbmV3IE9rKHJvb3RHcm91cHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBWUk0gZmlsZSBvbmx5XG4gICAqIEdlbmVyYXRlIEpTT04uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0SnNvbk9mVlJNKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHbHRmTG9hZE9wdGlvblxuICApOiBQcm9taXNlPFJlc3VsdDxWcm0weCwgRXJyPFJuTTIsIHVuZGVmaW5lZD4+PiB7XG4gICAgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBHbHRmMkltcG9ydGVyLmltcG9ydEZyb21VcmkodXJpLCBvcHRpb25zKTtcbiAgICBpZiAocmVzdWx0Ll9pc0VycigpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgIG1lc3NhZ2U6ICdGYWlsZWQgdG8gaW1wb3J0IFZSTSBmaWxlLicsXG4gICAgICAgIGVycm9yOiByZXN1bHQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3NlcnRJc09rKHJlc3VsdCk7XG4gICAgY29uc3QgZ2x0Zkpzb24gPSByZXN1bHQuZ2V0KCk7XG4gICAgVnJtMHhJbXBvcnRlci5fcmVhZFZSTUh1bWFub2lkSW5mbyhnbHRmSnNvbiBhcyBWcm0weCk7XG5cbiAgICByZXR1cm4gbmV3IE9rKGdsdGZKc29uIGFzIFZybTB4KTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfX2ltcG9ydFZSTTB4KGdsdGZNb2RlbDogUm5NMiwgcmVuZGVyUGFzc2VzOiBSZW5kZXJQYXNzW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBwcm9jZXNzIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlcbiAgICBjb25zdCBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5ID1cbiAgICAgIGdsdGZNb2RlbC5hc3NldC5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucz8uZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheTtcbiAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMuX2NyZWF0ZVRleHR1cmVzKGdsdGZNb2RlbCk7XG4gICAgY29uc3Qgc2FtcGxlcnMgPSB0aGlzLl9jcmVhdGVTYW1wbGVycyhnbHRmTW9kZWwpO1xuICAgIGlmIChJcy5leGlzdChkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5KSkge1xuICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS50ZXh0dXJlcyA9XG4gICAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0udGV4dHVyZXMgPz8gdGV4dHVyZXM7XG4gICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5WzBdLnNhbXBsZXJzID1cbiAgICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5zYW1wbGVycyA/PyBzYW1wbGVycztcbiAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0uaXNMaWdodGluZyA9XG4gICAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0uaXNMaWdodGluZyA/PyB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsaXplTWF0ZXJpYWxQcm9wZXJ0aWVzKGdsdGZNb2RlbCwgdGV4dHVyZXMubGVuZ3RoKTtcblxuICAgIC8vIGdldCByb290R3JvdXBcbiAgICBsZXQgcm9vdEdyb3VwO1xuICAgIGNvbnN0IGV4aXN0T3V0bGluZSA9IHRoaXMuX2V4aXN0T3V0bGluZU1hdGVyaWFsKGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTSk7XG4gICAgaWYgKGV4aXN0T3V0bGluZSkge1xuICAgICAgcmVuZGVyUGFzc2VzWzFdID0gcmVuZGVyUGFzc2VzWzFdID8/IG5ldyBSZW5kZXJQYXNzKCk7XG4gICAgICBjb25zdCByZW5kZXJQYXNzT3V0bGluZSA9IHJlbmRlclBhc3Nlc1sxXTtcbiAgICAgIHJlbmRlclBhc3NPdXRsaW5lLnRvQ2xlYXJDb2xvckJ1ZmZlciA9IGZhbHNlO1xuICAgICAgcmVuZGVyUGFzc091dGxpbmUudG9DbGVhckRlcHRoQnVmZmVyID0gZmFsc2U7XG4gICAgICBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk0ucm5FeHRlbnNpb24gPSB7XG4gICAgICAgIHJlbmRlclBhc3NPdXRsaW5lOiByZW5kZXJQYXNzT3V0bGluZSxcbiAgICAgIH07XG5cbiAgICAgIHJvb3RHcm91cCA9IE1vZGVsQ29udmVydGVyLmNvbnZlcnRUb1Job2Rvbml0ZU9iamVjdChnbHRmTW9kZWwpO1xuICAgICAgcmVuZGVyUGFzc091dGxpbmUuYWRkRW50aXRpZXMoW3Jvb3RHcm91cF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290R3JvdXAgPSBNb2RlbENvbnZlcnRlci5jb252ZXJ0VG9SaG9kb25pdGVPYmplY3QoZ2x0Zk1vZGVsKTtcbiAgICB9XG5cbiAgICBjb25zdCByZW5kZXJQYXNzTWFpbiA9IHJlbmRlclBhc3Nlc1swXTtcbiAgICByZW5kZXJQYXNzTWFpbi50cnlUb1NldFVuaXF1ZU5hbWUoJ1ZSTSBNYWluIFJlbmRlclBhc3MnLCB0cnVlKTtcbiAgICByZW5kZXJQYXNzTWFpbi5hZGRFbnRpdGllcyhbcm9vdEdyb3VwXSk7XG5cbiAgICB0aGlzLl9yZWFkU3ByaW5nQm9uZShnbHRmTW9kZWwgYXMgVnJtMHgpO1xuICAgIHRoaXMuX3JlYWRWUk1IdW1hbm9pZEluZm8oZ2x0Zk1vZGVsIGFzIFZybTB4LCByb290R3JvdXApO1xuICAgIHRoaXMuX3JlYWRCbGVuZFNoYXBlR3JvdXAoZ2x0Zk1vZGVsIGFzIFZybTB4LCByb290R3JvdXApO1xuICB9XG5cbiAgc3RhdGljIF9yZWFkQmxlbmRTaGFwZUdyb3VwKGdsdGZNb2RlbDogVnJtMHgsIHJvb3RFbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5KTogdm9pZCB7XG4gICAgY29uc3QgdnJtRXhwcmVzc2lvbnM6IFZybUV4cHJlc3Npb25bXSA9IFtdO1xuXG4gICAgY29uc3QgYmxlbmRTaGFwZUdyb3VwcyA9IGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTS5ibGVuZFNoYXBlTWFzdGVyLmJsZW5kU2hhcGVHcm91cHM7XG4gICAgZm9yIChjb25zdCBibGVuZFNoYXBlR3JvdXAgb2YgYmxlbmRTaGFwZUdyb3Vwcykge1xuICAgICAgY29uc3QgdnJtRXhwcmVzc2lvbjogVnJtRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgbmFtZTogYmxlbmRTaGFwZUdyb3VwLnByZXNldE5hbWUsXG4gICAgICAgIGlzQmluYXJ5OiBibGVuZFNoYXBlR3JvdXAuaXNCaW5hcnksXG4gICAgICAgIGJpbmRzOiBibGVuZFNoYXBlR3JvdXAuYmluZHMubWFwKChiaW5kKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbHRmTW9kZWwubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBnbHRmTW9kZWwubm9kZXNbaV07XG4gICAgICAgICAgICBpZiAobm9kZS5tZXNoID09PSBiaW5kLm1lc2gpIHtcbiAgICAgICAgICAgICAgY29uc3Qgcm5FbnRpdHkgPSBnbHRmTW9kZWwuZXh0cmFzLnJuRW50aXRpZXNbaV07XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW50aXR5SWR4OiBybkVudGl0eS5lbnRpdHlVSUQsXG4gICAgICAgICAgICAgICAgYmxlbmRTaGFwZUlkeDogYmluZC5pbmRleCxcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IGJpbmQud2VpZ2h0IC8gMTAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBGb3VuZCBub2RlIGluIGJsZW5kU2hhcGVHcm91cCBQcm9jZXNzJyk7XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICAgIHZybUV4cHJlc3Npb25zLnB1c2godnJtRXhwcmVzc2lvbik7XG4gICAgfVxuICAgIGNvbnN0IHZybUVudGl0eSA9IEVudGl0eVJlcG9zaXRvcnkuYWRkQ29tcG9uZW50VG9FbnRpdHkoVnJtQ29tcG9uZW50LCByb290RW50aXR5KTtcbiAgICB2cm1FbnRpdHkuZ2V0VnJtKCkuc2V0VnJtRXhwcmVzc2lvbnModnJtRXhwcmVzc2lvbnMpO1xuICAgIHZybUVudGl0eS5nZXRWcm0oKS5fdmVyc2lvbiA9ICcwLngnO1xuICB9XG5cbiAgc3RhdGljIF9yZWFkVlJNSHVtYW5vaWRJbmZvKGdsdGZNb2RlbDogVnJtMHgsIHJvb3RFbnRpdHk/OiBJU2NlbmVHcmFwaEVudGl0eSk6IHZvaWQge1xuICAgIGNvbnN0IGh1bWFuQm9uZXMgPSBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk0uaHVtYW5vaWQuaHVtYW5Cb25lcztcbiAgICBjb25zdCBtYXBOYW1lTm9kZUlkOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgIC8vIGNvbnN0IG1hcE5hbWVOb2RlTmFtZTogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGJvbmUgb2YgaHVtYW5Cb25lcykge1xuICAgICAgbWFwTmFtZU5vZGVJZC5zZXQoYm9uZS5ib25lLCBib25lLm5vZGUpO1xuICAgICAgY29uc3QgYm9uZU5vZGUgPSBnbHRmTW9kZWwubm9kZXNbYm9uZS5ub2RlXTtcbiAgICAgIGJvbmUubmFtZSA9IGJvbmVOb2RlLm5hbWU7XG4gICAgfVxuICAgIGlmIChyb290RW50aXR5ICE9IG51bGwpIHtcbiAgICAgIHJvb3RFbnRpdHkudHJ5VG9TZXRUYWcoe1xuICAgICAgICB0YWc6ICdodW1hbm9pZF9tYXBfbmFtZV9ub2RlSWQnLFxuICAgICAgICB2YWx1ZTogbWFwTmFtZU5vZGVJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfcmVhZFNwcmluZ0JvbmUoZ2x0Zk1vZGVsOiBWcm0weCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbGxpZGVyR3JvdXBzOiBWUk1Db2xsaWRlckdyb3VwW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbGxpZGVyR3JvdXBJZHggaW4gZ2x0Zk1vZGVsLmV4dGVuc2lvbnMuVlJNLnNlY29uZGFyeUFuaW1hdGlvbi5jb2xsaWRlckdyb3Vwcykge1xuICAgICAgY29uc3QgY29sbGlkZXJHcm91cCA9XG4gICAgICAgIGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTS5zZWNvbmRhcnlBbmltYXRpb24uY29sbGlkZXJHcm91cHNbY29sbGlkZXJHcm91cElkeF07XG4gICAgICBjb25zdCB2cm1Db2xsaWRlckdyb3VwID0gbmV3IFZSTUNvbGxpZGVyR3JvdXAoKTtcbiAgICAgIGNvbGxpZGVyR3JvdXBzLnB1c2godnJtQ29sbGlkZXJHcm91cCk7XG4gICAgICBjb25zdCBjb2xsaWRlcnM6IFNwaGVyZUNvbGxpZGVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGJhc2VTZyA9IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuRW50aXRpZXMhW2NvbGxpZGVyR3JvdXAubm9kZV0uZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgZm9yIChjb25zdCBjb2xsaWRlciBvZiBjb2xsaWRlckdyb3VwLmNvbGxpZGVycykge1xuICAgICAgICBjb25zdCBzcGhlcmVDb2xsaWRlciA9IG5ldyBTcGhlcmVDb2xsaWRlcigpO1xuICAgICAgICBzcGhlcmVDb2xsaWRlci5iYXNlU2NlbmVHcmFwaCA9IGJhc2VTZztcbiAgICAgICAgc3BoZXJlQ29sbGlkZXIucG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICAgIGNvbGxpZGVyLm9mZnNldC54LFxuICAgICAgICAgIGNvbGxpZGVyLm9mZnNldC55LFxuICAgICAgICAgIGNvbGxpZGVyLm9mZnNldC56LFxuICAgICAgICBdKTtcbiAgICAgICAgc3BoZXJlQ29sbGlkZXIucmFkaXVzID0gY29sbGlkZXIucmFkaXVzO1xuICAgICAgICBjb2xsaWRlcnMucHVzaChzcGhlcmVDb2xsaWRlcik7XG4gICAgICB9XG4gICAgICB2cm1Db2xsaWRlckdyb3VwLnNwaGVyZUNvbGxpZGVycyA9IGNvbGxpZGVycztcbiAgICB9XG5cbiAgICBjb25zdCBib25lR3JvdXBzOiBWUk1TcHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYm9uZUdyb3VwIG9mIGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTS5zZWNvbmRhcnlBbmltYXRpb24uYm9uZUdyb3Vwcykge1xuICAgICAgY29uc3Qgam9pbnRSb290SW5kZXggPSBib25lR3JvdXAuYm9uZXNbMF07XG4gICAgICBjb25zdCBqb2ludFJvb3RFbnRpdHkgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIS5ybkVudGl0aWVzIVtqb2ludFJvb3RJbmRleF07XG4gICAgICBjb25zdCB2cm1TcHJpbmdCb25lR3JvdXAgPSBuZXcgVlJNU3ByaW5nKGpvaW50Um9vdEVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuXG4gICAgICB2cm1TcHJpbmdCb25lR3JvdXAudHJ5VG9TZXRVbmlxdWVOYW1lKGJvbmVHcm91cC5jb21tZW50LCB0cnVlKTtcbiAgICAgIHZybVNwcmluZ0JvbmVHcm91cC5jb2xsaWRlckdyb3VwcyA9IGJvbmVHcm91cC5jb2xsaWRlckdyb3Vwcy5tYXAoKGNvbGxpZGVyR3JvdXBJbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gY29sbGlkZXJHcm91cHNbY29sbGlkZXJHcm91cEluZGV4XTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhZGRlZEVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGlkeE9mQXJyYXkgaW4gYm9uZUdyb3VwLmJvbmVzKSB7XG4gICAgICAgIGNvbnN0IGJvbmVOb2RlSW5kZXggPSBib25lR3JvdXAuYm9uZXNbaWR4T2ZBcnJheV07XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuRW50aXRpZXMhW2JvbmVOb2RlSW5kZXhdO1xuXG4gICAgICAgIC8vIEZpbmQgYW5kIGFkZCB0aGUgbWlzc2luZyBqb2ludHMgZnJvbSBzcHJpbmcuam9pbnRzLlxuICAgICAgICB0aGlzLl9fYWRkU3ByaW5nQm9uZVJlY3Vyc2l2ZWx5KHZybVNwcmluZ0JvbmVHcm91cCwgZW50aXR5LCBib25lR3JvdXAsIGFkZGVkRW50aXRpZXMpO1xuICAgICAgfVxuXG4gICAgICBib25lR3JvdXBzLnB1c2godnJtU3ByaW5nQm9uZUdyb3VwKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJvbmVHcm91cCBvZiBib25lR3JvdXBzKSB7XG4gICAgICB0aGlzLl9fYWRkUGh5c2ljc0NvbXBvbmVudChib25lR3JvdXAsIGJvbmVHcm91cC5yb290Qm9uZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19hZGRTcHJpbmdCb25lUmVjdXJzaXZlbHkoXG4gICAgdnJtU3ByaW5nOiBWUk1TcHJpbmcsXG4gICAgZW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eSxcbiAgICBib25lR3JvdXA6IFZybTB4Qm9uZUdyb3VwLFxuICAgIGFkZGVkRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2cgPSBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gc2cuY2hpbGRyZW47XG5cbiAgICBpZiAoIWFkZGVkRW50aXRpZXMuaW5jbHVkZXMoZW50aXR5KSkge1xuICAgICAgY29uc3Qgc3ByaW5nQm9uZSA9IG5ldyBWUk1TcHJpbmdCb25lKGVudGl0eSk7XG4gICAgICBzcHJpbmdCb25lLmRyYWdGb3JjZSA9IGJvbmVHcm91cC5kcmFnRm9yY2U7XG4gICAgICBzcHJpbmdCb25lLnN0aWZmbmVzc0ZvcmNlID0gYm9uZUdyb3VwLnN0aWZmaW5lc3M7XG4gICAgICBzcHJpbmdCb25lLmdyYXZpdHlQb3dlciA9IGJvbmVHcm91cC5ncmF2aXR5UG93ZXI7XG4gICAgICBzcHJpbmdCb25lLmdyYXZpdHlEaXIgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICBib25lR3JvdXAuZ3Jhdml0eURpci54LFxuICAgICAgICBib25lR3JvdXAuZ3Jhdml0eURpci55LFxuICAgICAgICBib25lR3JvdXAuZ3Jhdml0eURpci56LFxuICAgICAgXSk7XG4gICAgICBzcHJpbmdCb25lLmhpdFJhZGl1cyA9IGJvbmVHcm91cC5oaXRSYWRpdXM7XG4gICAgICB2cm1TcHJpbmcuYm9uZXMucHVzaChzcHJpbmdCb25lKTtcbiAgICAgIGFkZGVkRW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuX19hZGRTcHJpbmdCb25lUmVjdXJzaXZlbHkodnJtU3ByaW5nLCBjaGlsZC5lbnRpdHksIGJvbmVHcm91cCwgYWRkZWRFbnRpdGllcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19hZGRQaHlzaWNzQ29tcG9uZW50KGJvbmVHcm91cDogVlJNU3ByaW5nLCBzZzogU2NlbmVHcmFwaENvbXBvbmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVudGl0eSA9IHNnLmVudGl0eTtcbiAgICBjb25zdCBuZXdFbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KFBoeXNpY3NDb21wb25lbnQsIGVudGl0eSk7XG4gICAgY29uc3QgcGh5c2ljc0NvbXBvbmVudCA9IG5ld0VudGl0eS5nZXRQaHlzaWNzKCk7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBuZXcgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneSgpO1xuICAgIHN0cmF0ZWd5LnNldFNwcmluZyhib25lR3JvdXApO1xuICAgIHBoeXNpY3NDb21wb25lbnQuc2V0U3RyYXRlZ3koc3RyYXRlZ3kpO1xuICB9XG5cbiAgc3RhdGljIF9jcmVhdGVUZXh0dXJlcyhnbHRmTW9kZWw6IFJuTTIpOiBUZXh0dXJlW10ge1xuICAgIGlmICghZ2x0Zk1vZGVsLnRleHR1cmVzKSBnbHRmTW9kZWwudGV4dHVyZXMgPSBbXTtcblxuICAgIGNvbnN0IGdsdGZUZXh0dXJlcyA9IGdsdGZNb2RlbC50ZXh0dXJlcztcbiAgICBjb25zdCByblRleHR1cmVzOiBUZXh0dXJlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsdGZUZXh0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm5UZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVRleHR1cmUoZ2x0ZlRleHR1cmVzW2ldLCBnbHRmTW9kZWwpO1xuICAgICAgcm5UZXh0dXJlc1tpXSA9IHJuVGV4dHVyZTtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1teVdoaXRlVGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG4gICAgZHVtbXlXaGl0ZVRleHR1cmUuZ2VuZXJhdGUxeDFUZXh0dXJlRnJvbSgpO1xuICAgIHJuVGV4dHVyZXMucHVzaChkdW1teVdoaXRlVGV4dHVyZSk7XG4gICAgY29uc3QgZHVtbXlCbGFja1RleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuICAgIGR1bW15QmxhY2tUZXh0dXJlLmdlbmVyYXRlMXgxVGV4dHVyZUZyb20oJ3JnYmEoMCwgMCwgMCwgMSknKTtcbiAgICByblRleHR1cmVzLnB1c2goZHVtbXlCbGFja1RleHR1cmUpO1xuXG4gICAgcmV0dXJuIHJuVGV4dHVyZXM7XG4gIH1cblxuICBzdGF0aWMgX2NyZWF0ZVNhbXBsZXJzKGdsdGZNb2RlbDogUm5NMik6IFNhbXBsZXJbXSB7XG4gICAgaWYgKCFnbHRmTW9kZWwudGV4dHVyZXMpIGdsdGZNb2RlbC50ZXh0dXJlcyA9IFtdO1xuXG4gICAgY29uc3QgZ2x0ZlRleHR1cmVzID0gZ2x0Zk1vZGVsLnRleHR1cmVzO1xuICAgIGNvbnN0IHJuU2FtcGxlcnM6IFNhbXBsZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2x0ZlRleHR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByblNhbXBsZXIgPSBNb2RlbENvbnZlcnRlci5fY3JlYXRlU2FtcGxlcihnbHRmVGV4dHVyZXNbaV0pO1xuICAgICAgcm5TYW1wbGVyc1tpXSA9IHJuU2FtcGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1teVNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XG4gICAgICB3cmFwUzogVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZSxcbiAgICAgIHdyYXBUOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhcixcbiAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgfSk7XG4gICAgZHVtbXlTYW1wbGVyLmNyZWF0ZSgpO1xuICAgIHJuU2FtcGxlcnMucHVzaChkdW1teVNhbXBsZXIpO1xuICAgIHJuU2FtcGxlcnMucHVzaChkdW1teVNhbXBsZXIpO1xuXG4gICAgcmV0dXJuIHJuU2FtcGxlcnM7XG4gIH1cblxuICBzdGF0aWMgX2V4aXN0T3V0bGluZU1hdGVyaWFsKGV4dGVuc2lvbnNWUk06IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IGV4dGVuc2lvbnNWUk0ubWF0ZXJpYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChtYXRlcmlhbFByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBtYXRlcmlhbFByb3BlcnR5IG9mIG1hdGVyaWFsUHJvcGVydGllcykge1xuICAgICAgICBpZiAobWF0ZXJpYWxQcm9wZXJ0eS5mbG9hdFByb3BlcnRpZXMuX091dGxpbmVXaWR0aE1vZGUgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBfaW5pdGlhbGl6ZU1hdGVyaWFsUHJvcGVydGllcyhnbHRmTW9kZWw6IFJuTTIsIHRleHR1cmVzTGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk0ubWF0ZXJpYWxQcm9wZXJ0aWVzO1xuXG4gICAgZm9yIChjb25zdCBtYXRlcmlhbFByb3BlcnR5IG9mIG1hdGVyaWFsUHJvcGVydGllcykge1xuICAgICAgaWYgKG1hdGVyaWFsUHJvcGVydHkuc2hhZGVyID09PSAnVlJNL01Ub29uJykge1xuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZU1Ub29uTWF0ZXJpYWxQcm9wZXJ0aWVzKGdsdGZNb2RlbCwgdGV4dHVyZXNMZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2luaXRpYWxpemVNVG9vbk1hdGVyaWFsUHJvcGVydGllcyhcbiAgICBnbHRmTW9kZWw6IFJuTTIsXG4gICAgdGV4dHVyZXNMZW5ndGg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk0ubWF0ZXJpYWxQcm9wZXJ0aWVzO1xuXG4gICAgY29uc3QgZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXIgPSB0ZXh0dXJlc0xlbmd0aCAtIDI7XG4gICAgY29uc3QgZHVtbXlCbGFja1RleHR1cmVOdW1iZXIgPSB0ZXh0dXJlc0xlbmd0aCAtIDE7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGVyaWFsUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmxvYXRQcm9wZXJ0aWVzID0gbWF0ZXJpYWxQcm9wZXJ0aWVzW2ldLmZsb2F0UHJvcGVydGllcztcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX0JsZW5kTW9kZScsIDAuMCk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19CdW1wU2NhbGUnLCAxLjApO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eShmbG9hdFByb3BlcnRpZXMsICdfQ3VsbE1vZGUnLCAyLjApO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eShmbG9hdFByb3BlcnRpZXMsICdfQ3V0b2ZmJywgMC41KTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX0RlYnVnTW9kZScsIDAuMCk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19Ec3RCbGVuZCcsIDAuMCk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19JbmRpcmVjdExpZ2h0SW50ZW5zaXR5JywgMC4xKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX0xpZ2h0Q29sb3JBdHRlbnVhdGlvbicsIDAuMCk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19PdXRsaW5lQ29sb3JNb2RlJywgMC4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX091dGxpbmVDdWxsTW9kZScsIDEuMCk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19PdXRsaW5lTGlnaHRpbmdNaXgnLCAxLjApO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eShmbG9hdFByb3BlcnRpZXMsICdfT3V0bGluZVNjYWxlZE1heERpc3RhbmNlJywgMS4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX091dGxpbmVXaWR0aCcsIDAuNSk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19PdXRsaW5lV2lkdGhNb2RlJywgMC4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX1JlY2VpdmVTaGFkb3dSYXRlJywgMS4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX1JpbUZyZXNuZWxQb3dlcicsIDEuMCk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19SaW1MaWZ0JywgMC4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX1JpbUxpZ2h0aW5nTWl4JywgMC4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX1NoYWRlU2hpZnQnLCAwLjApO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eShmbG9hdFByb3BlcnRpZXMsICdfU2hhZGVUb29ueScsIDAuOSk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcywgJ19TaGFkaW5nR3JhZGVSYXRlJywgMS4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX1NyY0JsZW5kJywgMS4wKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoZmxvYXRQcm9wZXJ0aWVzLCAnX1pXcml0ZScsIDEuMCk7XG4gICAgICAvLyB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcyxcIl9VdkFuaW1TY3JvbGxYXCIsIDAuMCk7XG4gICAgICAvLyB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcyxcIl9VdkFuaW1TY3JvbGxZXCIsIDAuMCk7XG4gICAgICAvLyB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KGZsb2F0UHJvcGVydGllcyxcIl9VdkFuaW1Sb3RhdGlvblwiLCAwLjApO1xuXG4gICAgICBjb25zdCB2ZWN0b3JQcm9wZXJ0aWVzID0gbWF0ZXJpYWxQcm9wZXJ0aWVzW2ldLnZlY3RvclByb3BlcnRpZXM7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KHZlY3RvclByb3BlcnRpZXMsICdfQ29sb3InLCBbMSwgMSwgMSwgMV0pO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eSh2ZWN0b3JQcm9wZXJ0aWVzLCAnX0VtaXNzaW9uQ29sb3InLCBbMCwgMCwgMF0pO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eSh2ZWN0b3JQcm9wZXJ0aWVzLCAnX091dGxpbmVDb2xvcicsIFswLCAwLCAwLCAxXSk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KHZlY3RvclByb3BlcnRpZXMsICdfU2hhZGVDb2xvcicsIFswLjk3LCAwLjgxLCAwLjg2LCAxXSk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KHZlY3RvclByb3BlcnRpZXMsICdfUmltQ29sb3InLCBbMCwgMCwgMF0pO1xuICAgICAgLy8gdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eSh2ZWN0b3JQcm9wZXJ0aWVzLCBcIl9CdW1wTWFwXCIsIFswLCAwLCAxLCAxXSk7XG4gICAgICAvLyB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KHZlY3RvclByb3BlcnRpZXMsIFwiX0VtaXNzaW9uTWFwXCIsIFswLCAwLCAxLCAxXSk7XG4gICAgICAvLyB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KHZlY3RvclByb3BlcnRpZXMsIFwiX01haW5UZXhcIiwgWzAsIDAsIDEsIDFdKTtcbiAgICAgIC8vIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkodmVjdG9yUHJvcGVydGllcywgXCJfT3V0bGluZVdpZHRoVGV4dHVyZVwiLCBbMCwgMCwgMSwgMV0pO1xuICAgICAgLy8gdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eSh2ZWN0b3JQcm9wZXJ0aWVzLCBcIl9SZWNlaXZlU2hhZG93VGV4dHVyZVwiLCBbMCwgMCwgMSwgMV0pO1xuICAgICAgLy8gdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eSh2ZWN0b3JQcm9wZXJ0aWVzLCBcIl9TaGFkZVRleHR1cmVcIiwgWzAsIDAsIDEsIDFdKTtcbiAgICAgIC8vIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkodmVjdG9yUHJvcGVydGllcywgXCJfU2hhZGluZ0dyYWRlVGV4dHVyZVwiLCBbMCwgMCwgMSwgMV0pO1xuICAgICAgLy8gdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eSh2ZWN0b3JQcm9wZXJ0aWVzLCBcIl9TcGhlcmVBZGRcIiwgWzAsIDAsIDEsIDFdKTtcblxuICAgICAgLy8gc2V0IG51bSBvZiB0ZXh0dXJlIGFycmF5XG4gICAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IG1hdGVyaWFsUHJvcGVydGllc1tpXS50ZXh0dXJlUHJvcGVydGllcztcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkodGV4dHVyZVByb3BlcnRpZXMsICdfQnVtcE1hcCcsIGR1bW15V2hpdGVUZXh0dXJlTnVtYmVyKTtcbiAgICAgIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoXG4gICAgICAgIHRleHR1cmVQcm9wZXJ0aWVzLFxuICAgICAgICAnX0VtaXNzaW9uTWFwJyxcbiAgICAgICAgZHVtbXlCbGFja1RleHR1cmVOdW1iZXJcbiAgICAgICk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KHRleHR1cmVQcm9wZXJ0aWVzLCAnX01haW5UZXgnLCBkdW1teVdoaXRlVGV4dHVyZU51bWJlcik7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KFxuICAgICAgICB0ZXh0dXJlUHJvcGVydGllcyxcbiAgICAgICAgJ19PdXRsaW5lV2lkdGhUZXh0dXJlJyxcbiAgICAgICAgZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXJcbiAgICAgICk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KFxuICAgICAgICB0ZXh0dXJlUHJvcGVydGllcyxcbiAgICAgICAgJ19SZWNlaXZlU2hhZG93VGV4dHVyZScsXG4gICAgICAgIGR1bW15V2hpdGVUZXh0dXJlTnVtYmVyXG4gICAgICApO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eShcbiAgICAgICAgdGV4dHVyZVByb3BlcnRpZXMsXG4gICAgICAgICdfUmltVGV4dHVyZScsXG4gICAgICAgIGR1bW15QmxhY2tUZXh0dXJlTnVtYmVyXG4gICAgICApO1xuICAgICAgdGhpcy5fX2luaXRpYWxpemVGb3JVbmRlZmluZWRQcm9wZXJ0eShcbiAgICAgICAgdGV4dHVyZVByb3BlcnRpZXMsXG4gICAgICAgICdfU2hhZGVUZXh0dXJlJyxcbiAgICAgICAgZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXJcbiAgICAgICk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KFxuICAgICAgICB0ZXh0dXJlUHJvcGVydGllcyxcbiAgICAgICAgJ19TaGFkaW5nR3JhZGVUZXh0dXJlJyxcbiAgICAgICAgZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXJcbiAgICAgICk7XG4gICAgICB0aGlzLl9faW5pdGlhbGl6ZUZvclVuZGVmaW5lZFByb3BlcnR5KFxuICAgICAgICB0ZXh0dXJlUHJvcGVydGllcyxcbiAgICAgICAgJ19TcGhlcmVBZGQnLFxuICAgICAgICBkdW1teUJsYWNrVGV4dHVyZU51bWJlclxuICAgICAgKTtcbiAgICAgIC8vIHRoaXMuX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkodGV4dHVyZVByb3BlcnRpZXMsIFwiX1V2QW5pbU1hc2tUZXh0dXJlXCIsIGR1bW15V2hpdGVUZXh0dXJlTnVtYmVyKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsdGZNb2RlbC5tYXRlcmlhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gZ2x0Zk1vZGVsLm1hdGVyaWFsc1tpXTtcbiAgICAgIGlmIChtYXRlcmlhbC5leHRyYXMgPT0gbnVsbCkge1xuICAgICAgICBtYXRlcmlhbC5leHRyYXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIG1hdGVyaWFsLmV4dHJhcy52cm0weE1hdGVyaWFsUHJvcGVydHkgPSBtYXRlcmlhbFByb3BlcnRpZXNbaV07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19pbml0aWFsaXplRm9yVW5kZWZpbmVkUHJvcGVydHkoXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgaW5pdGlhbFZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgaWYgKG9iamVjdFtwcm9wZXJ0eU5hbWVdID09IG51bGwpIG9iamVjdFtwcm9wZXJ0eU5hbWVdID0gaW5pdGlhbFZhbHVlO1xuICB9XG5cbiAgc3RhdGljIF9nZXRPcHRpb25zKG9wdGlvbnM/OiBHbHRmTG9hZE9wdGlvbik6IEdsdGZMb2FkT3B0aW9uIHtcbiAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgaW4gb3B0aW9ucy5maWxlcykge1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGUuc3BsaXQoJy52cm0nKVswXTtcbiAgICAgICAgaWYgKGZpbGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlidWZmZXIgPSBvcHRpb25zLmZpbGVzW2ZpbGVdO1xuICAgICAgICAgIG9wdGlvbnMuZmlsZXNbZmlsZU5hbWUgKyAnLmdsYiddID0gYXJyYXlidWZmZXI7XG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsZXNbZmlsZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy9zZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIG9wdGlvbnMuX19pc0ltcG9ydFZSTTB4ID0gdHJ1ZTtcbiAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zLmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPSBbe31dO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMuZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5pc01vcnBoaW5nKSB7XG4gICAgICAgIG9wdGlvbnMubWF4TW9ycGhUYXJnZXROdW1iZXIgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBmaWxlczoge30sXG4gICAgICAgIGxvYWRlckV4dGVuc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXk6IFtcbiAgICAgICAgICB7IGlzTGlnaHRpbmc6IHRydWUsIGlzTW9ycGhpbmc6IHRydWUsIGlzU2tpbm5pbmc6IHRydWUgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGVzT2ZFbGVtZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldHM6IFtdLFxuICAgICAgICAgICAgc3RhdGVzOiB7XG4gICAgICAgICAgICAgIGVuYWJsZTogW10sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uczoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNUcmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMCxcbiAgICAgICAgICAgIGlzVGV4dHVyZUltYWdlVG9Mb2FkUHJlTXVsdGlwbGllZEFscGhhOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBfX2lzSW1wb3J0VlJNMHg6IHRydWUsXG4gICAgICAgIF9faW1wb3J0ZWRUeXBlOiAndnJtMHgnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cbmltcG9ydCB7IE1vZGVsQ29udmVydGVyIH0gZnJvbSAnLi9Nb2RlbENvbnZlcnRlcic7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBHbHRmTG9hZE9wdGlvbiwgUm5NMiwgVnJtMHgsIFZybTB4TWF0ZXJpYWxQcm9wZXJ0eSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuLi9yZW5kZXJlci9SZW5kZXJQYXNzJztcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlJztcbmltcG9ydCB7IEVudGl0eVJlcG9zaXRvcnkgfSBmcm9tICcuLi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneSB9IGZyb20gJy4uL3BoeXNpY3MvVlJNU3ByaW5nL1ZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3knO1xuaW1wb3J0IHsgUGh5c2ljc0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvUGh5c2ljcy9QaHlzaWNzQ29tcG9uZW50JztcbmltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL1NjZW5lR3JhcGgvU2NlbmVHcmFwaENvbXBvbmVudCc7XG5pbXBvcnQgeyBTcGhlcmVDb2xsaWRlciB9IGZyb20gJy4uL3BoeXNpY3MvVlJNU3ByaW5nL1NwaGVyZUNvbGxpZGVyJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgVlJNQ29sbGlkZXJHcm91cCB9IGZyb20gJy4uL3BoeXNpY3MvVlJNU3ByaW5nL1ZSTUNvbGxpZGVyR3JvdXAnO1xuaW1wb3J0IHsgVlJNU3ByaW5nIH0gZnJvbSAnLi4vcGh5c2ljcy9WUk1TcHJpbmcvVlJNU3ByaW5nJztcbmltcG9ydCB7IFZybTEsIFZybTFfTWF0ZXJpYWxzX01Ub29uIH0gZnJvbSAnLi4vLi4vdHlwZXMvVlJNMSc7XG5pbXBvcnQgeyBhc3NlcnRJc09rLCBFcnIsIFJlc3VsdCwgT2sgfSBmcm9tICcuLi9taXNjL1Jlc3VsdCc7XG5pbXBvcnQgeyBHbHRmMkltcG9ydGVyIH0gZnJvbSAnLi9HbHRmMkltcG9ydGVyJztcbmltcG9ydCB7IFNhbXBsZXIgfSBmcm9tICcuLi90ZXh0dXJlcy9TYW1wbGVyJztcbmltcG9ydCB7IFZybUNvbXBvbmVudCwgVnJtRXhwcmVzc2lvbiwgVnJtRXhwcmVzc2lvbk1vcnBoQmluZCB9IGZyb20gJy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVlJNU3ByaW5nQm9uZSB9IGZyb20gJy4uL3BoeXNpY3MvVlJNU3ByaW5nL1ZSTVNwcmluZ0JvbmUnO1xuaW1wb3J0IHsgQ2Fwc3VsZUNvbGxpZGVyIH0gZnJvbSAnLi4vcGh5c2ljcy9WUk1TcHJpbmcvQ2Fwc3VsZUNvbGxpZGVyJztcbmltcG9ydCB7IENvbnN0cmFpbnRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnN0cmFpbnQnO1xuaW1wb3J0IHsgVnJtUm9sbENvbnN0cmFpbnQgfSBmcm9tICcuLi9jb25zdHJhaW50cy9Wcm1Sb2xsQ29uc3RyYWludCc7XG5pbXBvcnQgeyBWcm1BaW1Db25zdHJhaW50IH0gZnJvbSAnLi4vY29uc3RyYWludHMvVnJtQWltQ29uc3RyYWludCc7XG5pbXBvcnQgeyBWcm1Sb3RhdGlvbkNvbnN0cmFpbnQgfSBmcm9tICcuLi9jb25zdHJhaW50cy9Wcm1Sb3RhdGlvbkNvbnN0cmFpbnQnO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuXG5leHBvcnQgY2xhc3MgVnJtSW1wb3J0ZXIge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgYXN5bmMgX19pbXBvcnRWUk0oZ2x0Zk1vZGVsOiBSbk0yLCByZW5kZXJQYXNzZXM6IFJlbmRlclBhc3NbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHByb2Nlc3MgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVxuICAgIGNvbnN0IGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPVxuICAgICAgZ2x0Zk1vZGVsLmFzc2V0LmV4dHJhcz8ucm5Mb2FkZXJPcHRpb25zPy5kZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5O1xuICAgIGNvbnN0IHRleHR1cmVzID0gdGhpcy5fY3JlYXRlVGV4dHVyZXMoZ2x0Zk1vZGVsKTtcbiAgICBjb25zdCBzYW1wbGVycyA9IHRoaXMuX2NyZWF0ZVNhbXBsZXJzKGdsdGZNb2RlbCk7XG4gICAgaWYgKElzLmV4aXN0KGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkpKSB7XG4gICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5WzBdLnRleHR1cmVzID1cbiAgICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS50ZXh0dXJlcyA/PyB0ZXh0dXJlcztcbiAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0uc2FtcGxlcnMgPVxuICAgICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5WzBdLnNhbXBsZXJzID8/IHNhbXBsZXJzO1xuICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5pc0xpZ2h0aW5nID1cbiAgICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5pc0xpZ2h0aW5nID8/IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0T3V0bGluZSA9IHRoaXMuX19pbml0aWFsaXplTVRvb25NYXRlcmlhbFByb3BlcnRpZXMoZ2x0Zk1vZGVsLCB0ZXh0dXJlcy5sZW5ndGgpO1xuXG4gICAgLy8gZ2V0IHJvb3RHcm91cFxuICAgIGxldCByb290R3JvdXA7XG4gICAgaWYgKGV4aXN0T3V0bGluZSkge1xuICAgICAgcmVuZGVyUGFzc2VzWzFdID0gcmVuZGVyUGFzc2VzWzFdID8/IG5ldyBSZW5kZXJQYXNzKCk7XG4gICAgICBjb25zdCByZW5kZXJQYXNzT3V0bGluZSA9IHJlbmRlclBhc3Nlc1sxXTtcbiAgICAgIHJlbmRlclBhc3NPdXRsaW5lLnRvQ2xlYXJDb2xvckJ1ZmZlciA9IGZhbHNlO1xuICAgICAgcmVuZGVyUGFzc091dGxpbmUudG9DbGVhckRlcHRoQnVmZmVyID0gZmFsc2U7XG4gICAgICBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk0gPSB7fTtcbiAgICAgIGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTS5ybkV4dGVuc2lvbiA9IHtcbiAgICAgICAgcmVuZGVyUGFzc091dGxpbmU6IHJlbmRlclBhc3NPdXRsaW5lLFxuICAgICAgfTtcblxuICAgICAgcm9vdEdyb3VwID0gTW9kZWxDb252ZXJ0ZXIuY29udmVydFRvUmhvZG9uaXRlT2JqZWN0KGdsdGZNb2RlbCk7XG4gICAgICByZW5kZXJQYXNzT3V0bGluZS5hZGRFbnRpdGllcyhbcm9vdEdyb3VwXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RHcm91cCA9IE1vZGVsQ29udmVydGVyLmNvbnZlcnRUb1Job2Rvbml0ZU9iamVjdChnbHRmTW9kZWwpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlclBhc3NNYWluID0gcmVuZGVyUGFzc2VzWzBdO1xuICAgIHJlbmRlclBhc3NNYWluLnRyeVRvU2V0VW5pcXVlTmFtZSgnVlJNIE1haW4gUmVuZGVyUGFzcycsIHRydWUpO1xuICAgIHJlbmRlclBhc3NNYWluLmFkZEVudGl0aWVzKFtyb290R3JvdXBdKTtcblxuICAgIHRoaXMuX3JlYWRTcHJpbmdCb25lKGdsdGZNb2RlbCBhcyBWcm0xKTtcbiAgICB0aGlzLl9yZWFkVlJNSHVtYW5vaWRJbmZvKGdsdGZNb2RlbCBhcyBWcm0xLCByb290R3JvdXApO1xuICAgIHRoaXMuX3JlYWRFeHByZXNzaW9ucyhnbHRmTW9kZWwgYXMgVnJtMSwgcm9vdEdyb3VwKTtcbiAgICB0aGlzLl9yZWFkQ29uc3RyYWludHMoZ2x0Zk1vZGVsIGFzIFZybTEpO1xuXG4gICAgaWYgKGdsdGZNb2RlbC5hc3NldC5leHRyYXM/LnJuTG9hZGVyT3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlcbiAgICAgIGdsdGZNb2RlbC5hc3NldC5leHRyYXMucm5Mb2FkZXJPcHRpb25zLmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPSBbXTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX3JlYWRDb25zdHJhaW50cyhnbHRmTW9kZWw6IFZybTEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsdGZNb2RlbC5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IGdsdGZNb2RlbC5ub2Rlc1tpXTtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSBub2RlLmV4dGVuc2lvbnM/LlZSTUNfbm9kZV9jb25zdHJhaW50Py5jb25zdHJhaW50O1xuICAgICAgaWYgKElzLmV4aXN0KGNvbnN0cmFpbnQpKSB7XG4gICAgICAgIGlmIChJcy5leGlzdChjb25zdHJhaW50LnJvbGwpKSB7XG4gICAgICAgICAgY29uc3Qgcm9sbCA9IGNvbnN0cmFpbnQucm9sbDtcbiAgICAgICAgICBjb25zdCBkc3RFbnRpdHlfID0gZ2x0Zk1vZGVsLmV4dHJhcy5ybkVudGl0aWVzW2ldO1xuICAgICAgICAgIGNvbnN0IHNyY0VudGl0eSA9IGdsdGZNb2RlbC5leHRyYXMucm5FbnRpdGllc1tyb2xsLnNvdXJjZV07XG4gICAgICAgICAgY29uc3QgZHN0RW50aXR5ID0gRW50aXR5UmVwb3NpdG9yeS5hZGRDb21wb25lbnRUb0VudGl0eShDb25zdHJhaW50Q29tcG9uZW50LCBkc3RFbnRpdHlfKTtcbiAgICAgICAgICBjb25zdCByb2xsQ29uc3RyYWludCA9IG5ldyBWcm1Sb2xsQ29uc3RyYWludChcbiAgICAgICAgICAgIHNyY0VudGl0eSxcbiAgICAgICAgICAgIHJvbGwucm9sbEF4aXMsXG4gICAgICAgICAgICBJcy5leGlzdChyb2xsLndlaWdodCkgPyByb2xsLndlaWdodCA6IDEuMCxcbiAgICAgICAgICAgIGRzdEVudGl0eVxuICAgICAgICAgICk7XG4gICAgICAgICAgZHN0RW50aXR5LmdldENvbnN0cmFpbnQoKS5zZXRDb25zdHJhaW50KHJvbGxDb25zdHJhaW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChJcy5leGlzdChjb25zdHJhaW50LmFpbSkpIHtcbiAgICAgICAgICBjb25zdCBhaW0gPSBjb25zdHJhaW50LmFpbTtcbiAgICAgICAgICBjb25zdCBkc3RFbnRpdHlfID0gZ2x0Zk1vZGVsLmV4dHJhcy5ybkVudGl0aWVzW2ldO1xuICAgICAgICAgIGNvbnN0IHNyY0VudGl0eSA9IGdsdGZNb2RlbC5leHRyYXMucm5FbnRpdGllc1thaW0uc291cmNlXTtcbiAgICAgICAgICBjb25zdCBkc3RFbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KENvbnN0cmFpbnRDb21wb25lbnQsIGRzdEVudGl0eV8pO1xuICAgICAgICAgIGNvbnN0IGFpbUNvbnN0cmFpbnQgPSBuZXcgVnJtQWltQ29uc3RyYWludChcbiAgICAgICAgICAgIHNyY0VudGl0eSxcbiAgICAgICAgICAgIGFpbS5haW1BeGlzLFxuICAgICAgICAgICAgSXMuZXhpc3QoYWltLndlaWdodCkgPyBhaW0ud2VpZ2h0IDogMS4wLFxuICAgICAgICAgICAgZHN0RW50aXR5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBkc3RFbnRpdHkuZ2V0Q29uc3RyYWludCgpLnNldENvbnN0cmFpbnQoYWltQ29uc3RyYWludCk7XG4gICAgICAgIH0gZWxzZSBpZiAoSXMuZXhpc3QoY29uc3RyYWludC5yb3RhdGlvbikpIHtcbiAgICAgICAgICBjb25zdCByb3RhdGlvbiA9IGNvbnN0cmFpbnQucm90YXRpb247XG4gICAgICAgICAgY29uc3QgZHN0RW50aXR5XyA9IGdsdGZNb2RlbC5leHRyYXMucm5FbnRpdGllc1tpXTtcbiAgICAgICAgICBjb25zdCBzcmNFbnRpdHkgPSBnbHRmTW9kZWwuZXh0cmFzLnJuRW50aXRpZXNbcm90YXRpb24uc291cmNlXTtcbiAgICAgICAgICBjb25zdCBkc3RFbnRpdHkgPSBFbnRpdHlSZXBvc2l0b3J5LmFkZENvbXBvbmVudFRvRW50aXR5KENvbnN0cmFpbnRDb21wb25lbnQsIGRzdEVudGl0eV8pO1xuICAgICAgICAgIGNvbnN0IHJvdGF0aW9uQ29uc3RyYWludCA9IG5ldyBWcm1Sb3RhdGlvbkNvbnN0cmFpbnQoXG4gICAgICAgICAgICBzcmNFbnRpdHksXG4gICAgICAgICAgICBJcy5leGlzdChyb3RhdGlvbi53ZWlnaHQpID8gcm90YXRpb24ud2VpZ2h0IDogMS4wLFxuICAgICAgICAgICAgZHN0RW50aXR5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBkc3RFbnRpdHkuZ2V0Q29uc3RyYWludCgpLnNldENvbnN0cmFpbnQocm90YXRpb25Db25zdHJhaW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfcmVhZEV4cHJlc3Npb25zKGdsdGZNb2RlbDogVnJtMSwgcm9vdEVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBjb25zdCB2cm1FeHByZXNzaW9uczogVnJtRXhwcmVzc2lvbltdID0gW107XG5cbiAgICBpZiAoSXMubm90LmV4aXN0KGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTUNfdnJtPy5leHByZXNzaW9ucz8ucHJlc2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25zID0gZ2x0Zk1vZGVsLmV4dGVuc2lvbnMuVlJNQ192cm0uZXhwcmVzc2lvbnMucHJlc2V0O1xuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbk5hbWUgaW4gZXhwcmVzc2lvbnMpIHtcbiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBleHByZXNzaW9uc1tleHByZXNzaW9uTmFtZV07XG4gICAgICBsZXQgYmluZHM6IFZybUV4cHJlc3Npb25Nb3JwaEJpbmRbXSA9IFtdO1xuICAgICAgaWYgKElzLmV4aXN0KGV4cHJlc3Npb24ubW9ycGhUYXJnZXRCaW5kcykpIHtcbiAgICAgICAgYmluZHMgPSBleHByZXNzaW9uLm1vcnBoVGFyZ2V0QmluZHMubWFwKChiaW5kKSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm5FbnRpdHkgPSBnbHRmTW9kZWwuZXh0cmFzLnJuRW50aXRpZXNbYmluZC5ub2RlXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW50aXR5SWR4OiBybkVudGl0eS5lbnRpdHlVSUQsXG4gICAgICAgICAgICBibGVuZFNoYXBlSWR4OiBiaW5kLmluZGV4LFxuICAgICAgICAgICAgd2VpZ2h0OiBiaW5kLndlaWdodCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdnJtRXhwcmVzc2lvbjogVnJtRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgbmFtZTogZXhwcmVzc2lvbk5hbWUsXG4gICAgICAgIGlzQmluYXJ5OiBleHByZXNzaW9uLmlzQmluYXJ5LFxuICAgICAgICBiaW5kczogYmluZHMsXG4gICAgICB9O1xuICAgICAgdnJtRXhwcmVzc2lvbnMucHVzaCh2cm1FeHByZXNzaW9uKTtcbiAgICB9XG4gICAgY29uc3QgdnJtRW50aXR5ID0gRW50aXR5UmVwb3NpdG9yeS5hZGRDb21wb25lbnRUb0VudGl0eShWcm1Db21wb25lbnQsIHJvb3RFbnRpdHkpO1xuICAgIHZybUVudGl0eS5nZXRWcm0oKS5zZXRWcm1FeHByZXNzaW9ucyh2cm1FeHByZXNzaW9ucyk7XG4gICAgdnJtRW50aXR5LmdldFZybSgpLl92ZXJzaW9uID0gJzEuMCc7XG4gIH1cblxuICBzdGF0aWMgX3JlYWRWUk1IdW1hbm9pZEluZm8oZ2x0Zk1vZGVsOiBWcm0xLCByb290RW50aXR5PzogSVNjZW5lR3JhcGhFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCBodW1hbkJvbmVzID0gZ2x0Zk1vZGVsLmV4dGVuc2lvbnMuVlJNQ192cm0uaHVtYW5vaWQuaHVtYW5Cb25lcztcbiAgICBjb25zdCBtYXBOYW1lTm9kZUlkOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgYm9uZU5hbWUgaW4gaHVtYW5Cb25lcykge1xuICAgICAgY29uc3QgYm9uZSA9IGh1bWFuQm9uZXNbYm9uZU5hbWVdO1xuICAgICAgbWFwTmFtZU5vZGVJZC5zZXQoYm9uZU5hbWUsIGJvbmUubm9kZSk7XG4gICAgfVxuICAgIGlmIChyb290RW50aXR5ICE9IG51bGwpIHtcbiAgICAgIHJvb3RFbnRpdHkudHJ5VG9TZXRUYWcoe1xuICAgICAgICB0YWc6ICdodW1hbm9pZF9tYXBfbmFtZV9ub2RlSWQnLFxuICAgICAgICB2YWx1ZTogbWFwTmFtZU5vZGVJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBfcmVhZFNwcmluZ0JvbmUoZ2x0Zk1vZGVsOiBWcm0xKTogdm9pZCB7XG4gICAgY29uc3QgY29sbGlkZXJHcm91cHM6IFZSTUNvbGxpZGVyR3JvdXBbXSA9IFtdO1xuICAgIGlmIChJcy5leGlzdChnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk1DX3NwcmluZ0JvbmU/LmNvbGxpZGVyR3JvdXBzKSkge1xuICAgICAgZm9yIChjb25zdCBjb2xsaWRlckdyb3VwSWR4IGluIGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTUNfc3ByaW5nQm9uZS5jb2xsaWRlckdyb3Vwcykge1xuICAgICAgICBjb25zdCBjb2xsaWRlckdyb3VwID0gZ2x0Zk1vZGVsLmV4dGVuc2lvbnMuVlJNQ19zcHJpbmdCb25lLmNvbGxpZGVyR3JvdXBzW2NvbGxpZGVyR3JvdXBJZHhdO1xuXG4gICAgICAgIGNvbnN0IHZybUNvbGxpZGVyR3JvdXAgPSBuZXcgVlJNQ29sbGlkZXJHcm91cCgpO1xuICAgICAgICBjb2xsaWRlckdyb3Vwcy5wdXNoKHZybUNvbGxpZGVyR3JvdXApO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbGxpZGVySWR4IG9mIGNvbGxpZGVyR3JvdXAuY29sbGlkZXJzKSB7XG4gICAgICAgICAgY29uc3QgY29sbGlkZXIgPSBnbHRmTW9kZWwuZXh0ZW5zaW9ucy5WUk1DX3NwcmluZ0JvbmUuY29sbGlkZXJzW2NvbGxpZGVySWR4XTtcblxuICAgICAgICAgIGNvbnN0IGJhc2VTZyA9IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuRW50aXRpZXMhW2NvbGxpZGVyLm5vZGVdLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgICAgICBpZiAoSXMuZXhpc3QoY29sbGlkZXIuc2hhcGUuc3BoZXJlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3BoZXJlQ29sbGlkZXIgPSBuZXcgU3BoZXJlQ29sbGlkZXIoKTtcbiAgICAgICAgICAgIHNwaGVyZUNvbGxpZGVyLmJhc2VTY2VuZUdyYXBoID0gYmFzZVNnO1xuICAgICAgICAgICAgc3BoZXJlQ29sbGlkZXIucG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICAgICAgICBjb2xsaWRlci5zaGFwZS5zcGhlcmUub2Zmc2V0WzBdLFxuICAgICAgICAgICAgICBjb2xsaWRlci5zaGFwZS5zcGhlcmUub2Zmc2V0WzFdLFxuICAgICAgICAgICAgICBjb2xsaWRlci5zaGFwZS5zcGhlcmUub2Zmc2V0WzJdLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBzcGhlcmVDb2xsaWRlci5yYWRpdXMgPSBjb2xsaWRlci5zaGFwZS5zcGhlcmUucmFkaXVzO1xuICAgICAgICAgICAgdnJtQ29sbGlkZXJHcm91cC5zcGhlcmVDb2xsaWRlcnMucHVzaChzcGhlcmVDb2xsaWRlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChJcy5leGlzdChjb2xsaWRlci5zaGFwZS5jYXBzdWxlKSkge1xuICAgICAgICAgICAgY29uc3QgY2Fwc3VsZUNvbGxpZGVyID0gbmV3IENhcHN1bGVDb2xsaWRlcigpO1xuICAgICAgICAgICAgY2Fwc3VsZUNvbGxpZGVyLmJhc2VTY2VuZUdyYXBoID0gYmFzZVNnO1xuICAgICAgICAgICAgY2Fwc3VsZUNvbGxpZGVyLnBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgICAgICAgICAgY29sbGlkZXIuc2hhcGUuY2Fwc3VsZS5vZmZzZXRbMF0sXG4gICAgICAgICAgICAgIGNvbGxpZGVyLnNoYXBlLmNhcHN1bGUub2Zmc2V0WzFdLFxuICAgICAgICAgICAgICBjb2xsaWRlci5zaGFwZS5jYXBzdWxlLm9mZnNldFsyXSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgY2Fwc3VsZUNvbGxpZGVyLnJhZGl1cyA9IGNvbGxpZGVyLnNoYXBlLmNhcHN1bGUucmFkaXVzO1xuICAgICAgICAgICAgY2Fwc3VsZUNvbGxpZGVyLnRhaWwgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICAgICAgICBjb2xsaWRlci5zaGFwZS5jYXBzdWxlLnRhaWxbMF0sXG4gICAgICAgICAgICAgIGNvbGxpZGVyLnNoYXBlLmNhcHN1bGUudGFpbFsxXSxcbiAgICAgICAgICAgICAgY29sbGlkZXIuc2hhcGUuY2Fwc3VsZS50YWlsWzJdLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB2cm1Db2xsaWRlckdyb3VwLmNhcHN1bGVDb2xsaWRlcnMucHVzaChjYXBzdWxlQ29sbGlkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNwcmluZ3M6IFZSTVNwcmluZ1tdID0gW107XG4gICAgaWYgKElzLmV4aXN0KGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTUNfc3ByaW5nQm9uZT8uc3ByaW5ncykpIHtcbiAgICAgIGZvciAoY29uc3Qgc3ByaW5nIG9mIGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTUNfc3ByaW5nQm9uZS5zcHJpbmdzKSB7XG4gICAgICAgIGNvbnN0IGpvaW50Um9vdCA9IHNwcmluZy5qb2ludHNbMF07XG4gICAgICAgIGNvbnN0IGpvaW50Um9vdEVudGl0eSA9IGdsdGZNb2RlbC5hc3NldC5leHRyYXMhLnJuRW50aXRpZXMhW2pvaW50Um9vdC5ub2RlXTtcbiAgICAgICAgY29uc3QgdnJtU3ByaW5nID0gbmV3IFZSTVNwcmluZyhqb2ludFJvb3RFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpKTtcbiAgICAgICAgdnJtU3ByaW5nLnRyeVRvU2V0VW5pcXVlTmFtZShzcHJpbmcubmFtZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNvbGxpZGVyR3JvdXBJbmRpY2VzID0gSXMuZXhpc3Qoc3ByaW5nLmNvbGxpZGVyR3JvdXBzKSA/IHNwcmluZy5jb2xsaWRlckdyb3VwcyA6IFtdO1xuICAgICAgICB2cm1TcHJpbmcuY29sbGlkZXJHcm91cHMgPSBjb2xsaWRlckdyb3VwSW5kaWNlcy5tYXAoKGNvbGxpZGVyR3JvdXBJZHgpID0+IHtcbiAgICAgICAgICByZXR1cm4gY29sbGlkZXJHcm91cHNbY29sbGlkZXJHcm91cElkeF07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFkZGVkRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBqb2ludElkeCBpbiBzcHJpbmcuam9pbnRzKSB7XG4gICAgICAgICAgY29uc3Qgam9pbnQgPSBzcHJpbmcuam9pbnRzW2pvaW50SWR4XTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzIS5ybkVudGl0aWVzIVtqb2ludC5ub2RlXTtcbiAgICAgICAgICBjb25zdCBzcHJpbmdCb25lID0gbmV3IFZSTVNwcmluZ0JvbmUoZW50aXR5KTtcbiAgICAgICAgICBzcHJpbmdCb25lLmRyYWdGb3JjZSA9IGpvaW50LmRyYWdGb3JjZTtcbiAgICAgICAgICBzcHJpbmdCb25lLnN0aWZmbmVzc0ZvcmNlID0gam9pbnQuc3RpZmZuZXNzO1xuICAgICAgICAgIHNwcmluZ0JvbmUuZ3Jhdml0eVBvd2VyID0gSXMuZXhpc3Qoam9pbnQuZ3Jhdml0eVBvd2VyKSA/IGpvaW50LmdyYXZpdHlQb3dlciA6IDE7XG4gICAgICAgICAgc3ByaW5nQm9uZS5ncmF2aXR5RGlyID0gSXMuZXhpc3Qoam9pbnQuZ3Jhdml0eURpcilcbiAgICAgICAgICAgID8gVmVjdG9yMy5mcm9tQ29weUFycmF5MyhbXG4gICAgICAgICAgICAgICAgam9pbnQuZ3Jhdml0eURpclswXSxcbiAgICAgICAgICAgICAgICBqb2ludC5ncmF2aXR5RGlyWzFdLFxuICAgICAgICAgICAgICAgIGpvaW50LmdyYXZpdHlEaXJbMl0sXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICA6IFZlY3RvcjMuZnJvbUNvcHlBcnJheTMoWzAsIC0xLCAwXSk7XG4gICAgICAgICAgc3ByaW5nQm9uZS5oaXRSYWRpdXMgPSBqb2ludC5oaXRSYWRpdXM7XG4gICAgICAgICAgdnJtU3ByaW5nLmJvbmVzLnB1c2goc3ByaW5nQm9uZSk7XG4gICAgICAgICAgYWRkZWRFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIGFuZCBhZGQgdGhlIG1pc3Npbmcgam9pbnRzIGZyb20gc3ByaW5nLmpvaW50cy5cbiAgICAgICAgdGhpcy5fX2FkZFNwcmluZ0JvbmVSZWN1cnNpdmVseSh2cm1TcHJpbmcsIGpvaW50Um9vdEVudGl0eSwgYWRkZWRFbnRpdGllcyk7XG4gICAgICAgIHNwcmluZ3MucHVzaCh2cm1TcHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3ByaW5nIG9mIHNwcmluZ3MpIHtcbiAgICAgIHRoaXMuX19hZGRQaHlzaWNzQ29tcG9uZW50KHNwcmluZywgc3ByaW5nLnJvb3RCb25lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2FkZFNwcmluZ0JvbmVSZWN1cnNpdmVseShcbiAgICB2cm1TcHJpbmc6IFZSTVNwcmluZyxcbiAgICBlbnRpdHk6IElTY2VuZUdyYXBoRW50aXR5LFxuICAgIGFkZGVkRW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2cgPSBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gc2cuY2hpbGRyZW47XG5cbiAgICBpZiAoIWFkZGVkRW50aXRpZXMuaW5jbHVkZXMoZW50aXR5KSkge1xuICAgICAgY29uc3Qgc3ByaW5nQm9uZSA9IG5ldyBWUk1TcHJpbmdCb25lKGVudGl0eSk7XG4gICAgICB2cm1TcHJpbmcuYm9uZXMucHVzaChzcHJpbmdCb25lKTtcbiAgICAgIGFkZGVkRW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuX19hZGRTcHJpbmdCb25lUmVjdXJzaXZlbHkodnJtU3ByaW5nLCBjaGlsZC5lbnRpdHksIGFkZGVkRW50aXRpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fYWRkUGh5c2ljc0NvbXBvbmVudChzcHJpbmc6IFZSTVNwcmluZywgc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRpdHkgPSBzZy5lbnRpdHk7XG4gICAgY29uc3QgbmV3RW50aXR5ID0gRW50aXR5UmVwb3NpdG9yeS5hZGRDb21wb25lbnRUb0VudGl0eShQaHlzaWNzQ29tcG9uZW50LCBlbnRpdHkpO1xuICAgIGNvbnN0IHBoeXNpY3NDb21wb25lbnQgPSBuZXdFbnRpdHkuZ2V0UGh5c2ljcygpO1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3koKTtcbiAgICBzdHJhdGVneS5zZXRTcHJpbmcoc3ByaW5nKTtcbiAgICBwaHlzaWNzQ29tcG9uZW50LnNldFN0cmF0ZWd5KHN0cmF0ZWd5KTtcbiAgfVxuXG4gIHN0YXRpYyBfY3JlYXRlVGV4dHVyZXMoZ2x0Zk1vZGVsOiBSbk0yKTogVGV4dHVyZVtdIHtcbiAgICBpZiAoIWdsdGZNb2RlbC50ZXh0dXJlcykgZ2x0Zk1vZGVsLnRleHR1cmVzID0gW107XG5cbiAgICBjb25zdCBnbHRmVGV4dHVyZXMgPSBnbHRmTW9kZWwudGV4dHVyZXM7XG4gICAgY29uc3Qgcm5UZXh0dXJlczogVGV4dHVyZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbHRmVGV4dHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJuVGV4dHVyZSA9IE1vZGVsQ29udmVydGVyLl9jcmVhdGVUZXh0dXJlKGdsdGZUZXh0dXJlc1tpXSwgZ2x0Zk1vZGVsKTtcbiAgICAgIHJuVGV4dHVyZXNbaV0gPSByblRleHR1cmU7XG4gICAgfVxuXG4gICAgY29uc3QgZHVtbXlXaGl0ZVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuICAgIGR1bW15V2hpdGVUZXh0dXJlLmdlbmVyYXRlMXgxVGV4dHVyZUZyb20oKTtcbiAgICByblRleHR1cmVzLnB1c2goZHVtbXlXaGl0ZVRleHR1cmUpO1xuICAgIGNvbnN0IGR1bW15QmxhY2tUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcbiAgICBkdW1teUJsYWNrVGV4dHVyZS5nZW5lcmF0ZTF4MVRleHR1cmVGcm9tKCdyZ2JhKDAsIDAsIDAsIDEpJyk7XG4gICAgcm5UZXh0dXJlcy5wdXNoKGR1bW15QmxhY2tUZXh0dXJlKTtcblxuICAgIHJldHVybiByblRleHR1cmVzO1xuICB9XG5cbiAgc3RhdGljIF9jcmVhdGVTYW1wbGVycyhnbHRmTW9kZWw6IFJuTTIpOiBTYW1wbGVyW10ge1xuICAgIGlmICghZ2x0Zk1vZGVsLnRleHR1cmVzKSBnbHRmTW9kZWwudGV4dHVyZXMgPSBbXTtcblxuICAgIGNvbnN0IGdsdGZUZXh0dXJlcyA9IGdsdGZNb2RlbC50ZXh0dXJlcztcbiAgICBjb25zdCByblNhbXBsZXJzOiBTYW1wbGVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsdGZUZXh0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm5UZXh0dXJlID0gTW9kZWxDb252ZXJ0ZXIuX2NyZWF0ZVNhbXBsZXIoZ2x0ZlRleHR1cmVzW2ldKTtcbiAgICAgIHJuU2FtcGxlcnNbaV0gPSByblRleHR1cmU7XG4gICAgfVxuXG4gICAgY29uc3QgZHVtbXlTYW1wbGVyID0gbmV3IFNhbXBsZXIoe1xuICAgICAgd3JhcFM6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgICB3cmFwVDogVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZSxcbiAgICAgIG1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgIH0pO1xuICAgIGR1bW15U2FtcGxlci5jcmVhdGUoKTtcbiAgICByblNhbXBsZXJzLnB1c2goZHVtbXlTYW1wbGVyKTtcbiAgICByblNhbXBsZXJzLnB1c2goZHVtbXlTYW1wbGVyKTtcblxuICAgIHJldHVybiByblNhbXBsZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19pbml0aWFsaXplTVRvb25NYXRlcmlhbFByb3BlcnRpZXMoXG4gICAgZ2x0Zk1vZGVsOiBSbk0yLFxuICAgIHRleHR1cmVzTGVuZ3RoOiBudW1iZXJcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGlzT3V0bGluZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgZ2x0Zk1vZGVsLm1hdGVyaWFscykge1xuICAgICAgY29uc3QgbXRvb25NYXRlcmlhbDogVnJtMV9NYXRlcmlhbHNfTVRvb24gPSBtYXRlcmlhbC5leHRlbnNpb25zPy5WUk1DX21hdGVyaWFsc19tdG9vbjtcbiAgICAgIGlmIChtdG9vbk1hdGVyaWFsID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkdW1teVdoaXRlVGV4dHVyZU51bWJlciA9IC0xO1xuICAgICAgY29uc3QgZHVtbXlCbGFja1RleHR1cmVOdW1iZXIgPSAtMTtcblxuICAgICAgY29uc3QgdnJtMHhNYXRlcmlhbFByb3BlcnR5OiBWcm0weE1hdGVyaWFsUHJvcGVydHkgPSB7XG4gICAgICAgIG5hbWU6ICd2cm0weE1hdGVyaWFsUHJvcGVydHknLFxuICAgICAgICByZW5kZXJRdWV1ZTogMCwgLy8gZHVtbXkgdmFsdWVcbiAgICAgICAgc2hhZGVyOiAnVlJNL01Ub29uJyxcbiAgICAgICAgZmxvYXRQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgX0JsZW5kTW9kZTogSXMubm90LmV4aXN0KG1hdGVyaWFsLmFscGhhTW9kZSlcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBtYXRlcmlhbC5hbHBoYU1vZGUgPT09ICdPUEFRVUUnXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogbWF0ZXJpYWwuYWxwaGFNb2RlID09PSAnTUFTSydcbiAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgOiBtYXRlcmlhbC5hbHBoYU1vZGUgPT09ICdCTEVORCdcbiAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgOiAzLFxuICAgICAgICAgIF9DdWxsTW9kZTogSXMubm90LmV4aXN0KG1hdGVyaWFsLmRvdWJsZVNpZGVkKSA/IDIgOiBtYXRlcmlhbC5kb3VibGVTaWRlZCA/IDAgOiAyLFxuICAgICAgICAgIF9CdW1wU2NhbGU6IDEuMCxcbiAgICAgICAgICBfQ3V0b2ZmOiBJcy5ub3QuZXhpc3QobWF0ZXJpYWwuYWxwaGFDdXRvZmYpID8gMC41IDogbWF0ZXJpYWwuYWxwaGFDdXRvZmYsXG4gICAgICAgICAgX0RlYnVnTW9kZTogMCxcbiAgICAgICAgICBfU3JjQmxlbmQ6IDUsXG4gICAgICAgICAgX0RzdEJsZW5kOiAxMCxcbiAgICAgICAgICBfSW5kaXJlY3RMaWdodEludGVuc2l0eTogMC4xLFxuICAgICAgICAgIF9MaWdodENvbG9yQXR0ZW51YXRpb246IDAuMCxcbiAgICAgICAgICBfT3V0bGluZUNvbG9yTW9kZTogMSxcbiAgICAgICAgICBfT3V0bGluZUN1bGxNb2RlOiAxLFxuICAgICAgICAgIF9PdXRsaW5lTGlnaHRpbmdNaXg6IG10b29uTWF0ZXJpYWwub3V0bGluZUxpZ2h0aW5nTWl4RmFjdG9yLFxuICAgICAgICAgIF9PdXRsaW5lU2NhbGVkTWF4RGlzdGFuY2U6IDEuMCxcbiAgICAgICAgICBfT3V0bGluZVdpZHRoOiBtdG9vbk1hdGVyaWFsLm91dGxpbmVXaWR0aEZhY3RvciAqIDEwMCxcbiAgICAgICAgICBfT3V0bGluZVdpZHRoTW9kZTpcbiAgICAgICAgICAgIG10b29uTWF0ZXJpYWwub3V0bGluZVdpZHRoTW9kZSA9PT0gJ3dvcmxkQ29vcmRpbmF0ZXMnXG4gICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICA6IG10b29uTWF0ZXJpYWwub3V0bGluZVdpZHRoTW9kZSA9PT0gJ3NjcmVlbkNvb3JkaW5hdGVzJ1xuICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgIF9SZWNlaXZlU2hhZG93UmF0ZTogMS4wLFxuICAgICAgICAgIF9SaW1GcmVzbmVsUG93ZXI6IG10b29uTWF0ZXJpYWwucGFyYW1ldHJpY1JpbUZyZXNuZWxQb3dlckZhY3RvcixcbiAgICAgICAgICBfUmltTGlmdDogbXRvb25NYXRlcmlhbC5wYXJhbWV0cmljUmltTGlmdEZhY3RvcixcbiAgICAgICAgICBfUmltTGlnaHRpbmdNaXg6IG10b29uTWF0ZXJpYWwucGFyYW1ldHJpY1JpbUxpZnRGYWN0b3IsXG4gICAgICAgICAgX1NoYWRlU2hpZnQ6IG10b29uTWF0ZXJpYWwuc2hhZGluZ1NoaWZ0RmFjdG9yLFxuICAgICAgICAgIF9TaGFkZVRvb255OiBtdG9vbk1hdGVyaWFsLnNoYWRpbmdUb29ueUZhY3RvcixcbiAgICAgICAgICBfU2hhZGluZ0dyYWRlUmF0ZTogMS4wLFxuICAgICAgICAgIF9aV3JpdGU6IG10b29uTWF0ZXJpYWwudHJhbnNwYXJlbnRXaXRoWldyaXRlID8gMSA6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHZlY3RvclByb3BlcnRpZXM6IHtcbiAgICAgICAgICBfQ29sb3I6IElzLm5vdC5leGlzdChtYXRlcmlhbC5wYnJNZXRhbGxpY1JvdWdobmVzcz8uYmFzZUNvbG9yRmFjdG9yKVxuICAgICAgICAgICAgPyBbMSwgMSwgMSwgMV1cbiAgICAgICAgICAgIDogbWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3MhLmJhc2VDb2xvckZhY3RvcixcbiAgICAgICAgICBfRW1pc3Npb25Db2xvcjogSXMubm90LmV4aXN0KG1hdGVyaWFsLmVtaXNzaXZlRmFjdG9yKVxuICAgICAgICAgICAgPyBbMCwgMCwgMF1cbiAgICAgICAgICAgIDogbWF0ZXJpYWwuZW1pc3NpdmVGYWN0b3IsXG4gICAgICAgICAgX091dGxpbmVDb2xvcjogbXRvb25NYXRlcmlhbC5vdXRsaW5lQ29sb3JGYWN0b3IsXG4gICAgICAgICAgX1NoYWRlQ29sb3I6IG10b29uTWF0ZXJpYWwuc2hhZGVDb2xvckZhY3RvcixcbiAgICAgICAgICBfUmltQ29sb3I6IG10b29uTWF0ZXJpYWwucGFyYW1ldHJpY1JpbUNvbG9yRmFjdG9yLFxuICAgICAgICAgIF9CdW1wTWFwOiBbMCwgMCwgMSwgMV0sXG4gICAgICAgICAgX0VtaXNzaW9uTWFwOiBbMCwgMCwgMSwgMV0sXG4gICAgICAgICAgX01haW5UZXg6IFswLCAwLCAxLCAxXSxcbiAgICAgICAgICBfT3V0bGluZVdpZHRoVGV4dHVyZTogWzAsIDAsIDEsIDFdLFxuICAgICAgICAgIF9SZWNlaXZlU2hhZG93VGV4dHVyZTogWzAsIDAsIDEsIDFdLFxuICAgICAgICAgIF9TaGFkZVRleHR1cmU6IFswLCAwLCAxLCAxXSxcbiAgICAgICAgICBfU2hhZGluZ0dyYWRlVGV4dHVyZTogWzAsIDAsIDEsIDFdLFxuICAgICAgICAgIF9TcGhlcmVBZGQ6IFswLCAwLCAxLCAxXSxcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dHVyZVByb3BlcnRpZXM6IHtcbiAgICAgICAgICBfQnVtcE1hcDogSXMubm90LmV4aXN0KG1hdGVyaWFsLm5vcm1hbFRleHR1cmUpXG4gICAgICAgICAgICA/IGR1bW15V2hpdGVUZXh0dXJlTnVtYmVyXG4gICAgICAgICAgICA6IG1hdGVyaWFsLm5vcm1hbFRleHR1cmUuaW5kZXgsXG4gICAgICAgICAgX0VtaXNzaW9uTWFwOiBJcy5ub3QuZXhpc3QobWF0ZXJpYWwuZW1pc3NpdmVUZXh0dXJlKVxuICAgICAgICAgICAgPyBkdW1teUJsYWNrVGV4dHVyZU51bWJlclxuICAgICAgICAgICAgOiBtYXRlcmlhbC5lbWlzc2l2ZVRleHR1cmUuaW5kZXgsXG4gICAgICAgICAgX01haW5UZXg6IElzLm5vdC5leGlzdChtYXRlcmlhbC5wYnJNZXRhbGxpY1JvdWdobmVzcz8uYmFzZUNvbG9yVGV4dHVyZSlcbiAgICAgICAgICAgID8gZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXJcbiAgICAgICAgICAgIDogbWF0ZXJpYWwucGJyTWV0YWxsaWNSb3VnaG5lc3MhLmJhc2VDb2xvclRleHR1cmUuaW5kZXgsXG4gICAgICAgICAgX091dGxpbmVXaWR0aFRleHR1cmU6IElzLm5vdC5leGlzdChtdG9vbk1hdGVyaWFsLm91dGxpbmVXaWR0aE11bHRpcGx5VGV4dHVyZSlcbiAgICAgICAgICAgID8gZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXJcbiAgICAgICAgICAgIDogbXRvb25NYXRlcmlhbC5vdXRsaW5lV2lkdGhNdWx0aXBseVRleHR1cmUuaW5kZXgsXG4gICAgICAgICAgX1JlY2VpdmVTaGFkb3dUZXh0dXJlOiBkdW1teVdoaXRlVGV4dHVyZU51bWJlcixcbiAgICAgICAgICBfU2hhZGVUZXh0dXJlOiBJcy5ub3QuZXhpc3QobXRvb25NYXRlcmlhbC5zaGFkZU11bHRpcGx5VGV4dHVyZSlcbiAgICAgICAgICAgID8gZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXJcbiAgICAgICAgICAgIDogbXRvb25NYXRlcmlhbC5zaGFkZU11bHRpcGx5VGV4dHVyZS5pbmRleCxcbiAgICAgICAgICBfUmltVGV4dHVyZTogSXMubm90LmV4aXN0KG10b29uTWF0ZXJpYWwucmltTXVsdGlwbHlUZXh0dXJlKVxuICAgICAgICAgICAgPyBkdW1teUJsYWNrVGV4dHVyZU51bWJlclxuICAgICAgICAgICAgOiBtdG9vbk1hdGVyaWFsLnJpbU11bHRpcGx5VGV4dHVyZS5pbmRleCxcbiAgICAgICAgICBfU2hhZGluZ0dyYWRlVGV4dHVyZTogZHVtbXlXaGl0ZVRleHR1cmVOdW1iZXIsXG4gICAgICAgICAgX1NwaGVyZUFkZDogZHVtbXlCbGFja1RleHR1cmVOdW1iZXIsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBpZiAoSXMubm90LmV4aXN0KG1hdGVyaWFsLmV4dHJhcykpIHtcbiAgICAgICAgbWF0ZXJpYWwuZXh0cmFzID0ge307XG4gICAgICB9XG4gICAgICBtYXRlcmlhbC5leHRyYXMudnJtMHhNYXRlcmlhbFByb3BlcnR5ID0gdnJtMHhNYXRlcmlhbFByb3BlcnR5O1xuXG4gICAgICBpZiAobXRvb25NYXRlcmlhbC5vdXRsaW5lV2lkdGhNb2RlICE9PSAnbm9uZScpIHtcbiAgICAgICAgaXNPdXRsaW5lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaXNPdXRsaW5lO1xuICB9XG5cbiAgc3RhdGljIF9nZXRPcHRpb25zKG9wdGlvbnM/OiBHbHRmTG9hZE9wdGlvbik6IEdsdGZMb2FkT3B0aW9uIHtcbiAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgaW4gb3B0aW9ucy5maWxlcykge1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGUuc3BsaXQoJy52cm0nKVswXTtcbiAgICAgICAgaWYgKGZpbGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlidWZmZXIgPSBvcHRpb25zLmZpbGVzW2ZpbGVdO1xuICAgICAgICAgIG9wdGlvbnMuZmlsZXNbZmlsZU5hbWUgKyAnLmdsYiddID0gYXJyYXlidWZmZXI7XG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZmlsZXNbZmlsZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy9zZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIG9wdGlvbnMuX19pc0ltcG9ydFZSTTB4ID0gdHJ1ZTtcbiAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zLmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXkgPSBbe31dO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMuZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5pc01vcnBoaW5nKSB7XG4gICAgICAgIG9wdGlvbnMubWF4TW9ycGhUYXJnZXROdW1iZXIgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBmaWxlczoge30sXG4gICAgICAgIGxvYWRlckV4dGVuc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXk6IFtcbiAgICAgICAgICB7IGlzTGlnaHRpbmc6IHRydWUsIGlzTW9ycGhpbmc6IHRydWUsIGlzU2tpbm5pbmc6IHRydWUgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGVzT2ZFbGVtZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldHM6IFtdLFxuICAgICAgICAgICAgc3RhdGVzOiB7XG4gICAgICAgICAgICAgIGVuYWJsZTogW10sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uczoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNUcmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMCxcbiAgICAgICAgICAgIGlzVGV4dHVyZUltYWdlVG9Mb2FkUHJlTXVsdGlwbGllZEFscGhhOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBfX2lzSW1wb3J0VlJNMHg6IHRydWUsXG4gICAgICAgIF9faW1wb3J0ZWRUeXBlOiAndnJtMScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBWUk0gZmlsZSBvbmx5XG4gICAqIEdlbmVyYXRlIEpTT04uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW1wb3J0SnNvbk9mVlJNKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHbHRmTG9hZE9wdGlvblxuICApOiBQcm9taXNlPFJlc3VsdDxWcm0xLCBFcnI8Um5NMiwgdW5kZWZpbmVkPj4+IHtcbiAgICBvcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9ucyhvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEdsdGYySW1wb3J0ZXIuaW1wb3J0RnJvbVVyaSh1cmksIG9wdGlvbnMpO1xuICAgIGlmIChyZXN1bHQuX2lzRXJyKCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBpbXBvcnQgVlJNIGZpbGUuJyxcbiAgICAgICAgZXJyb3I6IHJlc3VsdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzc2VydElzT2socmVzdWx0KTtcbiAgICBjb25zdCBnbHRmSnNvbiA9IHJlc3VsdC5nZXQoKTtcbiAgICBWcm1JbXBvcnRlci5fcmVhZFZSTUh1bWFub2lkSW5mbyhnbHRmSnNvbiBhcyBWcm0xKTtcblxuICAgIHJldHVybiBuZXcgT2soZ2x0Zkpzb24gYXMgVnJtMSk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgX19pbXBvcnRWUk0weChnbHRmTW9kZWw6IFJuTTIsIHJlbmRlclBhc3NlczogUmVuZGVyUGFzc1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gcHJvY2VzcyBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5XG4gICAgY29uc3QgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSA9XG4gICAgICBnbHRmTW9kZWwuYXNzZXQuZXh0cmFzPy5ybkxvYWRlck9wdGlvbnM/LmRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXk7XG4gICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLl9jcmVhdGVUZXh0dXJlcyhnbHRmTW9kZWwpO1xuICAgIGNvbnN0IHNhbXBsZXJzID0gdGhpcy5fY3JlYXRlU2FtcGxlcnMoZ2x0Zk1vZGVsKTtcbiAgICBpZiAoSXMuZXhpc3QoZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheSkpIHtcbiAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0udGV4dHVyZXMgPVxuICAgICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5WzBdLnRleHR1cmVzID8/IHRleHR1cmVzO1xuICAgICAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheVswXS5zYW1wbGVycyA9XG4gICAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXlbMF0uc2FtcGxlcnMgPz8gc2FtcGxlcnM7XG4gICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5WzBdLmlzTGlnaHRpbmcgPVxuICAgICAgICBkZWZhdWx0TWF0ZXJpYWxIZWxwZXJBcmd1bWVudEFycmF5WzBdLmlzTGlnaHRpbmcgPz8gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RPdXRsaW5lID0gdGhpcy5fX2luaXRpYWxpemVNVG9vbk1hdGVyaWFsUHJvcGVydGllcyhnbHRmTW9kZWwsIHRleHR1cmVzLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgcm9vdEdyb3VwXG4gICAgbGV0IHJvb3RHcm91cDtcbiAgICBpZiAoZXhpc3RPdXRsaW5lKSB7XG4gICAgICByZW5kZXJQYXNzZXNbMV0gPSByZW5kZXJQYXNzZXNbMV0gPz8gbmV3IFJlbmRlclBhc3MoKTtcbiAgICAgIGNvbnN0IHJlbmRlclBhc3NPdXRsaW5lID0gcmVuZGVyUGFzc2VzWzFdO1xuICAgICAgcmVuZGVyUGFzc091dGxpbmUudG9DbGVhckNvbG9yQnVmZmVyID0gZmFsc2U7XG4gICAgICByZW5kZXJQYXNzT3V0bGluZS50b0NsZWFyRGVwdGhCdWZmZXIgPSBmYWxzZTtcbiAgICAgIGdsdGZNb2RlbC5leHRlbnNpb25zLlZSTS5ybkV4dGVuc2lvbiA9IHtcbiAgICAgICAgcmVuZGVyUGFzc091dGxpbmU6IHJlbmRlclBhc3NPdXRsaW5lLFxuICAgICAgfTtcblxuICAgICAgcm9vdEdyb3VwID0gTW9kZWxDb252ZXJ0ZXIuY29udmVydFRvUmhvZG9uaXRlT2JqZWN0KGdsdGZNb2RlbCk7XG4gICAgICByZW5kZXJQYXNzT3V0bGluZS5hZGRFbnRpdGllcyhbcm9vdEdyb3VwXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RHcm91cCA9IE1vZGVsQ29udmVydGVyLmNvbnZlcnRUb1Job2Rvbml0ZU9iamVjdChnbHRmTW9kZWwpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbmRlclBhc3NNYWluID0gcmVuZGVyUGFzc2VzWzBdO1xuICAgIHJlbmRlclBhc3NNYWluLmFkZEVudGl0aWVzKFtyb290R3JvdXBdKTtcblxuICAgIHRoaXMuX3JlYWRTcHJpbmdCb25lKGdsdGZNb2RlbCBhcyBWcm0xKTtcbiAgICB0aGlzLl9yZWFkVlJNSHVtYW5vaWRJbmZvKGdsdGZNb2RlbCBhcyBWcm0xLCByb290R3JvdXApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHbHRmTG9hZE9wdGlvbiwgUm5NMiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEh1bWFuQm9uZU5hbWVzLCBOb2RlSWQsIFJuTTJWcm1hIH0gZnJvbSAnLi4vLi4vdHlwZXMvUm5NMlZybWEnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IEVyciwgUmVzdWx0LCBPaywgYXNzZXJ0SXNPayB9IGZyb20gJy4uL21pc2MvUmVzdWx0JztcbmltcG9ydCB7IEdsdGYySW1wb3J0ZXIgfSBmcm9tICcuL0dsdGYySW1wb3J0ZXInO1xuXG5leHBvcnQgY2xhc3MgVnJtYUltcG9ydGVyIHtcbiAgc3RhdGljIGFzeW5jIGltcG9ydEZyb21VcmkodXJpOiBzdHJpbmcpOiBQcm9taXNlPFJlc3VsdDxSbk0yVnJtYSwgRXJyPFJuTTIsIHVuZGVmaW5lZD4+PiB7XG4gICAgY29uc3Qgb3B0aW9uczogR2x0ZkxvYWRPcHRpb24gPSB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEdsdGYySW1wb3J0ZXIuaW1wb3J0RnJvbVVyaSh1cmksIG9wdGlvbnMpO1xuICAgIGlmIChyZXN1bHQuX2lzRXJyKCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBpbXBvcnQgVlJNIGZpbGUuJyxcbiAgICAgICAgZXJyb3I6IHJlc3VsdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzc2VydElzT2socmVzdWx0KTtcbiAgICBjb25zdCBnbHRmSnNvbjogUm5NMlZybWEgPSByZXN1bHQuZ2V0KCkgYXMgUm5NMlZybWE7XG4gICAgdGhpcy5yZWFkSHVtYW5vaWQoZ2x0Zkpzb24pO1xuXG4gICAgcmV0dXJuIG5ldyBPayhnbHRmSnNvbiBhcyBSbk0yVnJtYSk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgaW1wb3J0RnJvbUFycmF5QnVmZmVyKFxuICAgIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxuICApOiBQcm9taXNlPFJlc3VsdDxSbk0yVnJtYSwgRXJyPFJuTTIsIHVuZGVmaW5lZD4+PiB7XG4gICAgY29uc3Qgb3B0aW9uczogR2x0ZkxvYWRPcHRpb24gPSB7fTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEdsdGYySW1wb3J0ZXIuaW1wb3J0RnJvbUFycmF5QnVmZmVycyh7ICdkYXRhLmdsYic6IGFycmF5QnVmZmVyIH0sIG9wdGlvbnMpO1xuICAgIGlmIChyZXN1bHQuX2lzRXJyKCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBpbXBvcnQgVlJNIGZpbGUuJyxcbiAgICAgICAgZXJyb3I6IHJlc3VsdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzc2VydElzT2socmVzdWx0KTtcbiAgICBjb25zdCBnbHRmSnNvbjogUm5NMlZybWEgPSByZXN1bHQuZ2V0KCkgYXMgUm5NMlZybWE7XG4gICAgdGhpcy5yZWFkSHVtYW5vaWQoZ2x0Zkpzb24pO1xuXG4gICAgcmV0dXJuIG5ldyBPayhnbHRmSnNvbiBhcyBSbk0yVnJtYSk7XG4gIH1cblxuICBzdGF0aWMgcmVhZEh1bWFub2lkKHJubTogUm5NMlZybWEpIHtcbiAgICBjb25zdCBodW1hbkJvbmVzID0gcm5tLmV4dGVuc2lvbnMuVlJNQ192cm1fYW5pbWF0aW9uLmh1bWFub2lkPy5odW1hbkJvbmVzO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoaHVtYW5Cb25lcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBodW1hbm9pZEJvbmVOYW1lTWFwID0gbmV3IE1hcDxOb2RlSWQsIEh1bWFuQm9uZU5hbWVzPigpO1xuICAgIHJubS5leHRlbnNpb25zLlZSTUNfdnJtX2FuaW1hdGlvbi5odW1hbm9pZEJvbmVOYW1lTWFwID0gaHVtYW5vaWRCb25lTmFtZU1hcDtcblxuICAgIGZvciAoY29uc3QgYm9uZU5hbWUgaW4gaHVtYW5Cb25lcykge1xuICAgICAgY29uc3Qgbm9kZSA9IGh1bWFuQm9uZXNbYm9uZU5hbWUgYXMgSHVtYW5Cb25lTmFtZXNdO1xuICAgICAgaHVtYW5vaWRCb25lTmFtZU1hcC5zZXQobm9kZS5ub2RlLCBib25lTmFtZSBhcyBIdW1hbkJvbmVOYW1lcyk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvbkFzc2lnbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vRHJjUG9pbnRDbG91ZEltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybWF0RGV0ZWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9HbHRmMkltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vR2x0ZkltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vSUxvYWRlckV4dGVuc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL01vZGVsQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vUmhvZG9uaXRlSW1wb3J0RXh0ZW5zaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vVnJtMHhJbXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL1ZybUltcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vVnJtYUltcG9ydGVyJztcbiIsImV4cG9ydCAqIGZyb20gJy4vY2FtZXJhcy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vZGVmaW5pdGlvbnMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9lbmhhbmNlZF9qc19vYmplY3RzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0ZXIvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9nZW9tZXRyeS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2dpem1vcy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2hlbHBlcnMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9pbXBvcnRlci9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21hdGVyaWFscy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21hdGgvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9tZW1vcnkvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9taXNjL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vcGh5c2ljcy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3JlbmRlcmVyL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vc3lzdGVtL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vdGV4dHVyZXMvaW5kZXgnO1xuIiwiaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQWJzdHJhY3RUZXh0dXJlJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcywgU2hhZGVyU2VtYW50aWNzQ2xhc3MgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUnO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uLy4uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgQ29sb3JHcmFkaW5nVXNpbmdMVVRzU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0NvbG9yR3JhZGluZ1VzaW5nTFVUc1NoYWRlci9Db2xvckdyYWRpbmdVc2luZ0xVVHNTaGFkZXIudmVydCc7XG5pbXBvcnQgQ29sb3JHcmFkaW5nVXNpbmdMVVRzU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvQ29sb3JHcmFkaW5nVXNpbmdMVVRzU2hhZGVyL0NvbG9yR3JhZGluZ1VzaW5nTFVUc1NoYWRlci5mcmFnJztcbmltcG9ydCB7IFJlbmRlcmluZ0FyZ1dlYkdMIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgZHVtbXlCbGFja1RleHR1cmUgfSBmcm9tICcuLi9jb3JlL0R1bW15VGV4dHVyZXMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vLi4vbWlzYy9Mb2dnZXInO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JHcmFkaW5nVXNpbmdMVVRzTWF0ZXJpYWxDb250ZW50IGV4dGVuZHMgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQge1xuICBzdGF0aWMgbG9va3VwVGFibGVUZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdsb29rdXBUYWJsZVRleHR1cmUnLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0YXJnZXRSZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXI6IENvdW50LFxuICAgIHVyaT86IHN0cmluZyxcbiAgICB0ZXh0dXJlPzogQWJzdHJhY3RUZXh0dXJlXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgbnVsbCxcbiAgICAgICdjb2xvckdyYWRpbmdVc2luZ0xVVHNTaGFkaW5nJyxcbiAgICAgIHt9LFxuICAgICAgQ29sb3JHcmFkaW5nVXNpbmdMVVRzU2hhZGVyVmVydGV4LFxuICAgICAgQ29sb3JHcmFkaW5nVXNpbmdMVVRzU2hhZGVyRnJhZ21lbnRcbiAgICApO1xuXG4gICAgbGV0IHRhcmdldFRleHR1cmU7XG4gICAgY29uc3QgZnJhbWVidWZmZXIgPSB0YXJnZXRSZW5kZXJQYXNzLmdldEZyYW1lYnVmZmVyKCk7XG4gICAgaWYgKGZyYW1lYnVmZmVyICE9IG51bGwgJiYgZnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50c1tjb2xvckF0dGFjaG1lbnRzTnVtYmVyXSAhPSBudWxsKSB7XG4gICAgICB0YXJnZXRUZXh0dXJlID0gZnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50c1tjb2xvckF0dGFjaG1lbnRzTnVtYmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0VGV4dHVyZSA9IGR1bW15QmxhY2tUZXh0dXJlO1xuICAgICAgaWYgKGZyYW1lYnVmZmVyICE9IG51bGwpIHtcbiAgICAgICAgTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ3JlbmRlclBhc3MgZG9lcyBub3QgaGF2ZSBmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzWycgKyBjb2xvckF0dGFjaG1lbnRzTnVtYmVyICsgJ10nXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBMb2dnZXIud2FybigncmVuZGVyUGFzcyBkb2VzIG5vdCBoYXZlIGZyYW1lYnVmZmVyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxvb2t1cFRhYmxlVGV4dHVyZTtcbiAgICBpZiAodHlwZW9mIHVyaSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxvb2t1cFRhYmxlVGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG4gICAgICAoYXN5bmMgZnVuY3Rpb24gKHVyaTogc3RyaW5nKSB7XG4gICAgICAgIGxvb2t1cFRhYmxlVGV4dHVyZS5nZW5lcmF0ZVRleHR1cmVGcm9tVXJpKHVyaSwge1xuICAgICAgICAgIHR5cGU6IENvbXBvbmVudFR5cGUuVW5zaWduZWRCeXRlLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgbG9va3VwVGFibGVUZXh0dXJlLmxvYWRGcm9tVXJsTGF6eSgpO1xuICAgICAgfSkodXJpKTtcbiAgICB9IGVsc2UgaWYgKHRleHR1cmUgaW5zdGFuY2VvZiBBYnN0cmFjdFRleHR1cmUpIHtcbiAgICAgIGxvb2t1cFRhYmxlVGV4dHVyZSA9IHRleHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci53YXJuKCdubyBMVVQgdGV4dHVyZSBpcyBzcGVjaWZpZWQnKTtcbiAgICAgIGxvb2t1cFRhYmxlVGV4dHVyZSA9IGR1bW15QmxhY2tUZXh0dXJlO1xuICAgIH1cblxuICAgIGNvbnN0IHNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XG4gICAgICBtaW5GaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTmVhcmVzdCxcbiAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5OZWFyZXN0LFxuICAgICAgd3JhcFM6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgICB3cmFwVDogVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZSxcbiAgICAgIGFuaXNvdHJvcHk6IGZhbHNlLFxuICAgIH0pO1xuICAgIHNhbXBsZXIuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdiYXNlQ29sb3JUZXh0dXJlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzAsIHRhcmdldFRleHR1cmVdLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2xvb2t1cFRhYmxlVGV4dHVyZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFsxLCBsb29rdXBUYWJsZVRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB0aGlzLnNldFNoYWRlclNlbWFudGljc0luZm9BcnJheShzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkpO1xuICB9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICBtYXRlcmlhbCxcbiAgICBzaGFkZXJQcm9ncmFtLFxuICAgIGZpcnN0VGltZSxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0w7XG4gIH0pIHtcbiAgICBpZiAoYXJncy5zZXRVbmlmb3JtKSB7XG4gICAgICB0aGlzLnNldFdvcmxkTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mud29ybGRNYXRyaXgpO1xuICAgIH1cblxuICAgIC8vLyBNYXRyaWNlc1xuICAgIGxldCBjYW1lcmFDb21wb25lbnQgPSBhcmdzLnJlbmRlclBhc3MuY2FtZXJhQ29tcG9uZW50O1xuICAgIGlmIChjYW1lcmFDb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnRcbiAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoY2FtZXJhQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLnNldFZpZXdJbmZvKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgICAgdGhpcy5zZXRQcm9qZWN0aW9uKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IEFic3RyYWN0TWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdE1hdGVyaWFsQ29udGVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgSGRyaUZvcm1hdCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0hkcmlGb3JtYXQnO1xuaW1wb3J0IHsgU2hhZGVyaXR5T2JqZWN0IH0gZnJvbSAnc2hhZGVyaXR5JztcbmltcG9ydCB7IFJlbmRlcmluZ0FyZ1dlYkdMLCBSZW5kZXJpbmdBcmdXZWJHcHUgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBHbG9iYWxEYXRhUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvR2xvYmFsRGF0YVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgZHVtbXlCbGFja0N1YmVUZXh0dXJlIH0gZnJvbSAnLi4vY29yZS9EdW1teVRleHR1cmVzJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVZlY3RvcjInO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBTYW1wbGVyIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvU2FtcGxlcic7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvVGV4dHVyZVBhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21NYXRlcmlhbENvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB7XG4gIHByaXZhdGUgc3RhdGljIF9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX2RpZmZ1c2VJYmxDdWJlTWFwU2FtcGxlciA9IG5ldyBTYW1wbGVyKHtcbiAgICBtaW5GaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgd3JhcFM6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgd3JhcFI6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gIH0pO1xuICBwcml2YXRlIHN0YXRpYyBfX3NwZWN1bGFySWJsQ3ViZU1hcFNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XG4gICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhck1pcG1hcExpbmVhcixcbiAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgIHdyYXBUOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgIHdyYXBSOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICB9KTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgbmFtZSxcbiAgICBpc01vcnBoaW5nLFxuICAgIGlzU2tpbm5pbmcsXG4gICAgaXNMaWdodGluZyxcbiAgICB2ZXJ0ZXhTaGFkZXIsXG4gICAgcGl4ZWxTaGFkZXIsXG4gICAgYWRkaXRpb25hbFNoYWRlclNlbWFudGljSW5mbyxcbiAgICB2ZXJ0ZXhTaGFkZXJXZWJHcHUsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHUsXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaXNNb3JwaGluZzogYm9vbGVhbjtcbiAgICBpc1NraW5uaW5nOiBib29sZWFuO1xuICAgIGlzTGlnaHRpbmc6IGJvb2xlYW47XG4gICAgdmVydGV4U2hhZGVyPzogU2hhZGVyaXR5T2JqZWN0O1xuICAgIHBpeGVsU2hhZGVyPzogU2hhZGVyaXR5T2JqZWN0O1xuICAgIGFkZGl0aW9uYWxTaGFkZXJTZW1hbnRpY0luZm86IFNoYWRlclNlbWFudGljc0luZm9bXTtcbiAgICB2ZXJ0ZXhTaGFkZXJXZWJHcHU/OiBTaGFkZXJpdHlPYmplY3Q7XG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU/OiBTaGFkZXJpdHlPYmplY3Q7XG4gIH0pIHtcbiAgICBzdXBlcihudWxsLCBuYW1lLCB7IGlzTW9ycGhpbmcsIGlzU2tpbm5pbmcsIGlzTGlnaHRpbmcgfSk7XG5cbiAgICAvLyBTaGFkZXIgUmVmbGVjdGlvblxuICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gdGhpcy5kb1NoYWRlclJlZmxlY3Rpb24oXG4gICAgICB2ZXJ0ZXhTaGFkZXIhLFxuICAgICAgcGl4ZWxTaGFkZXIhLFxuICAgICAgdmVydGV4U2hhZGVyV2ViR3B1ISxcbiAgICAgIHBpeGVsU2hhZGVyV2ViR3B1IVxuICAgICk7XG5cbiAgICBpZiAoIUN1c3RvbU1hdGVyaWFsQ29udGVudC5fX2RpZmZ1c2VJYmxDdWJlTWFwU2FtcGxlci5jcmVhdGVkKSB7XG4gICAgICBDdXN0b21NYXRlcmlhbENvbnRlbnQuX19kaWZmdXNlSWJsQ3ViZU1hcFNhbXBsZXIuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFDdXN0b21NYXRlcmlhbENvbnRlbnQuX19zcGVjdWxhcklibEN1YmVNYXBTYW1wbGVyLmNyZWF0ZWQpIHtcbiAgICAgIEN1c3RvbU1hdGVyaWFsQ29udGVudC5fX3NwZWN1bGFySWJsQ3ViZU1hcFNhbXBsZXIuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkoc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LmNvbmNhdChhZGRpdGlvbmFsU2hhZGVyU2VtYW50aWNJbmZvKSk7XG4gIH1cblxuICBfc2V0SW50ZXJuYWxTZXR0aW5nUGFyYW1ldGVyc1RvR3B1V2ViR3B1KHtcbiAgICBtYXRlcmlhbCxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIGFyZ3M6IFJlbmRlcmluZ0FyZ1dlYkdwdTtcbiAgfSkge1xuICAgIGNvbnN0IHsgbWlwbWFwTGV2ZWxOdW1iZXIsIG1lc2hSZW5kZXJDb21wb25lbnQsIGRpZmZ1c2VIZHJpVHlwZSwgc3BlY3VsYXJIZHJpVHlwZSB9ID1cbiAgICAgIEN1c3RvbU1hdGVyaWFsQ29udGVudC5fX3NldHVwSGRyaVBhcmFtZXRlcnMoYXJncyk7XG4gICAgY29uc3QgdG1wX3ZlY3RvcjQgPSBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX3RtcF92ZWN0b3I0O1xuICAgIHRtcF92ZWN0b3I0LnggPSBtaXBtYXBMZXZlbE51bWJlcjtcbiAgICB0bXBfdmVjdG9yNC55ID0gbWVzaFJlbmRlckNvbXBvbmVudCEuZGlmZnVzZUN1YmVNYXBDb250cmlidXRpb247XG4gICAgdG1wX3ZlY3RvcjQueiA9IG1lc2hSZW5kZXJDb21wb25lbnQhLnNwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbjtcbiAgICB0bXBfdmVjdG9yNC53ID0gbWVzaFJlbmRlckNvbXBvbmVudCEucm90YXRpb25PZkN1YmVNYXA7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdpYmxQYXJhbWV0ZXInLCB0bXBfdmVjdG9yNCk7XG4gICAgY29uc3QgdG1wX3ZlY3RvcjIgPSBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX3RtcF92ZWN0b3IyO1xuICAgIHRtcF92ZWN0b3IyLnggPSBkaWZmdXNlSGRyaVR5cGU7XG4gICAgdG1wX3ZlY3RvcjIueSA9IHNwZWN1bGFySGRyaVR5cGU7XG4gICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdoZHJpRm9ybWF0JywgdG1wX3ZlY3RvcjIpO1xuXG4gICAgY29uc3QgbWVzaFJlbmRlcmVyQ29tcG9uZW50ID0gYXJncy5lbnRpdHkudHJ5VG9HZXRNZXNoUmVuZGVyZXIoKTtcbiAgICBpZiAoXG4gICAgICBtZXNoUmVuZGVyZXJDb21wb25lbnQgIT0gbnVsbCAmJlxuICAgICAgbWVzaFJlbmRlcmVyQ29tcG9uZW50LmRpZmZ1c2VDdWJlTWFwICE9IG51bGwgJiZcbiAgICAgIG1lc2hSZW5kZXJlckNvbXBvbmVudC5zcGVjdWxhckN1YmVNYXAgIT0gbnVsbFxuICAgICkge1xuICAgICAgY29uc3QgaWJsUGFyYW1ldGVyVmVjNCA9IE11dGFibGVWZWN0b3I0Lnplcm8oKTtcbiAgICAgIGNvbnN0IGhkcmlGb3JtYXRWZWMyID0gTXV0YWJsZVZlY3RvcjIuemVybygpO1xuXG4gICAgICBpYmxQYXJhbWV0ZXJWZWM0LnggPSBtZXNoUmVuZGVyZXJDb21wb25lbnQuc3BlY3VsYXJDdWJlTWFwLm1pcG1hcExldmVsTnVtYmVyO1xuICAgICAgaWJsUGFyYW1ldGVyVmVjNC55ID0gbWVzaFJlbmRlcmVyQ29tcG9uZW50LmRpZmZ1c2VDdWJlTWFwQ29udHJpYnV0aW9uO1xuICAgICAgaWJsUGFyYW1ldGVyVmVjNC56ID0gbWVzaFJlbmRlcmVyQ29tcG9uZW50LnNwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbjtcbiAgICAgIGlibFBhcmFtZXRlclZlYzQudyA9IG1lc2hSZW5kZXJlckNvbXBvbmVudC5yb3RhdGlvbk9mQ3ViZU1hcDtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignaWJsUGFyYW1ldGVyJywgaWJsUGFyYW1ldGVyVmVjNCk7XG5cbiAgICAgIGhkcmlGb3JtYXRWZWMyLnggPSBtZXNoUmVuZGVyZXJDb21wb25lbnQuZGlmZnVzZUN1YmVNYXAuaGRyaUZvcm1hdC5pbmRleDtcbiAgICAgIGhkcmlGb3JtYXRWZWMyLnkgPSBtZXNoUmVuZGVyZXJDb21wb25lbnQuc3BlY3VsYXJDdWJlTWFwLmhkcmlGb3JtYXQuaW5kZXg7XG4gICAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ2hkcmlGb3JtYXQnLCBoZHJpRm9ybWF0VmVjMik7XG4gICAgfVxuICB9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICBtYXRlcmlhbCxcbiAgICBzaGFkZXJQcm9ncmFtLFxuICAgIGZpcnN0VGltZSxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0w7XG4gIH0pIHtcbiAgICBpZiAoYXJncy5zZXRVbmlmb3JtKSB7XG4gICAgICB0aGlzLnNldFdvcmxkTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mud29ybGRNYXRyaXgpO1xuICAgICAgdGhpcy5zZXROb3JtYWxNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy5ub3JtYWxNYXRyaXgpO1xuICAgICAgdGhpcy5zZXRJc0JpbGxib2FyZChzaGFkZXJQcm9ncmFtLCBhcmdzLmlzQmlsbGJvYXJkKTtcbiAgICAgIGlmIChmaXJzdFRpbWUgfHwgYXJncy5pc1ZyKSB7XG4gICAgICAgIGxldCBjYW1lcmFDb21wb25lbnQgPSBhcmdzLnJlbmRlclBhc3MuY2FtZXJhQ29tcG9uZW50O1xuICAgICAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgICAgICBjYW1lcmFDb21wb25lbnQgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgICAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICAgICAgKSBhcyBDYW1lcmFDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWaWV3SW5mbyhzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcbiAgICAgICAgdGhpcy5zZXRQcm9qZWN0aW9uKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgIC8vIExpZ2h0c1xuICAgICAgICB0aGlzLnNldExpZ2h0c0luZm8oc2hhZGVyUHJvZ3JhbSwgYXJncy5saWdodENvbXBvbmVudHMsIG1hdGVyaWFsLCBhcmdzLnNldFVuaWZvcm0pO1xuICAgICAgfVxuXG4gICAgICAvLy8gU2tpbm5pbmdcbiAgICAgIGNvbnN0IHNrZWxldGFsQ29tcG9uZW50ID0gYXJncy5lbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgICAgdGhpcy5zZXRTa2lubmluZyhzaGFkZXJQcm9ncmFtLCBhcmdzLnNldFVuaWZvcm0sIHNrZWxldGFsQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgLy8gSUJMIEVudiBtYXBcbiAgICBpZiAoYXJncy5kaWZmdXNlQ3ViZSAmJiBhcmdzLmRpZmZ1c2VDdWJlLmlzVGV4dHVyZVJlYWR5KSB7XG4gICAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5zZXRVbmlmb3JtMWlGb3JUZXh0dXJlKFxuICAgICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgICBTaGFkZXJTZW1hbnRpY3MuRGlmZnVzZUVudlRleHR1cmUuc3RyLFxuICAgICAgICBbNSwgYXJncy5kaWZmdXNlQ3ViZSwgQ3VzdG9tTWF0ZXJpYWxDb250ZW50Ll9fZGlmZnVzZUlibEN1YmVNYXBTYW1wbGVyXVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VW5pZm9ybTFpRm9yVGV4dHVyZShcbiAgICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgU2hhZGVyU2VtYW50aWNzLkRpZmZ1c2VFbnZUZXh0dXJlLnN0cixcbiAgICAgICAgWzUsIGR1bW15QmxhY2tDdWJlVGV4dHVyZV1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmdzLnNwZWN1bGFyQ3ViZSAmJiBhcmdzLnNwZWN1bGFyQ3ViZS5pc1RleHR1cmVSZWFkeSkge1xuICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VW5pZm9ybTFpRm9yVGV4dHVyZShcbiAgICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgU2hhZGVyU2VtYW50aWNzLlNwZWN1bGFyRW52VGV4dHVyZS5zdHIsXG4gICAgICAgIFs2LCBhcmdzLnNwZWN1bGFyQ3ViZSwgQ3VzdG9tTWF0ZXJpYWxDb250ZW50Ll9fc3BlY3VsYXJJYmxDdWJlTWFwU2FtcGxlcl1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldFVuaWZvcm0xaUZvclRleHR1cmUoXG4gICAgICAgIHNoYWRlclByb2dyYW0sXG4gICAgICAgIFNoYWRlclNlbWFudGljcy5TcGVjdWxhckVudlRleHR1cmUuc3RyLFxuICAgICAgICBbNiwgZHVtbXlCbGFja0N1YmVUZXh0dXJlXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJQkwgUGFyYW1ldGVyc1xuICAgIGlmIChhcmdzLnNldFVuaWZvcm0pIHtcbiAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgY29uc3QgeyBtaXBtYXBMZXZlbE51bWJlciwgbWVzaFJlbmRlckNvbXBvbmVudCwgZGlmZnVzZUhkcmlUeXBlLCBzcGVjdWxhckhkcmlUeXBlIH0gPVxuICAgICAgICAgIEN1c3RvbU1hdGVyaWFsQ29udGVudC5fX3NldHVwSGRyaVBhcmFtZXRlcnMoYXJncyk7XG4gICAgICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldFVuaWZvcm1WYWx1ZShcbiAgICAgICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgICAgIFNoYWRlclNlbWFudGljcy5JQkxQYXJhbWV0ZXIuc3RyLFxuICAgICAgICAgIGZpcnN0VGltZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4OiBtaXBtYXBMZXZlbE51bWJlcixcbiAgICAgICAgICAgIHk6IG1lc2hSZW5kZXJDb21wb25lbnQhLmRpZmZ1c2VDdWJlTWFwQ29udHJpYnV0aW9uLFxuICAgICAgICAgICAgejogbWVzaFJlbmRlckNvbXBvbmVudCEuc3BlY3VsYXJDdWJlTWFwQ29udHJpYnV0aW9uLFxuICAgICAgICAgICAgdzogbWVzaFJlbmRlckNvbXBvbmVudCEucm90YXRpb25PZkN1YmVNYXAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5zZXRVbmlmb3JtVmFsdWUoXG4gICAgICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgICBTaGFkZXJTZW1hbnRpY3MuSERSSUZvcm1hdC5zdHIsXG4gICAgICAgICAgZmlyc3RUaW1lLFxuICAgICAgICAgIHsgeDogZGlmZnVzZUhkcmlUeXBlLCB5OiBzcGVjdWxhckhkcmlUeXBlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBtaXBtYXBMZXZlbE51bWJlciwgbWVzaFJlbmRlckNvbXBvbmVudCwgZGlmZnVzZUhkcmlUeXBlLCBzcGVjdWxhckhkcmlUeXBlIH0gPVxuICAgICAgICBDdXN0b21NYXRlcmlhbENvbnRlbnQuX19zZXR1cEhkcmlQYXJhbWV0ZXJzKGFyZ3MpO1xuICAgICAgY29uc3QgdG1wX3ZlY3RvcjQgPSBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX3RtcF92ZWN0b3I0O1xuICAgICAgdG1wX3ZlY3RvcjQueCA9IG1pcG1hcExldmVsTnVtYmVyO1xuICAgICAgdG1wX3ZlY3RvcjQueSA9IG1lc2hSZW5kZXJDb21wb25lbnQhLmRpZmZ1c2VDdWJlTWFwQ29udHJpYnV0aW9uO1xuICAgICAgdG1wX3ZlY3RvcjQueiA9IG1lc2hSZW5kZXJDb21wb25lbnQhLnNwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbjtcbiAgICAgIHRtcF92ZWN0b3I0LncgPSBtZXNoUmVuZGVyQ29tcG9uZW50IS5yb3RhdGlvbk9mQ3ViZU1hcDtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignaWJsUGFyYW1ldGVyJywgdG1wX3ZlY3RvcjQpO1xuICAgICAgY29uc3QgdG1wX3ZlY3RvcjIgPSBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX3RtcF92ZWN0b3IyO1xuICAgICAgdG1wX3ZlY3RvcjIueCA9IGRpZmZ1c2VIZHJpVHlwZTtcbiAgICAgIHRtcF92ZWN0b3IyLnkgPSBzcGVjdWxhckhkcmlUeXBlO1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdoZHJpRm9ybWF0JywgdG1wX3ZlY3RvcjIpO1xuICAgIH1cblxuICAgIC8vIE1vcnBoXG4gICAgY29uc3QgYmxlbmRTaGFwZUNvbXBvbmVudCA9IGFyZ3MuZW50aXR5LnRyeVRvR2V0QmxlbmRTaGFwZSgpO1xuICAgIHRoaXMuc2V0TW9ycGhJbmZvKHNoYWRlclByb2dyYW0sIGFyZ3MuZW50aXR5LmdldE1lc2goKSwgYXJncy5wcmltaXRpdmUsIGJsZW5kU2hhcGVDb21wb25lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19zZXR1cEhkcmlQYXJhbWV0ZXJzKGFyZ3M6IFJlbmRlcmluZ0FyZ1dlYkdMIHwgUmVuZGVyaW5nQXJnV2ViR3B1KSB7XG4gICAgbGV0IG1pcG1hcExldmVsTnVtYmVyID0gMTtcbiAgICBpZiAoYXJncy5zcGVjdWxhckN1YmUpIHtcbiAgICAgIG1pcG1hcExldmVsTnVtYmVyID0gYXJncy5zcGVjdWxhckN1YmUubWlwbWFwTGV2ZWxOdW1iZXI7XG4gICAgfVxuICAgIGNvbnN0IG1lc2hSZW5kZXJDb21wb25lbnQgPSBhcmdzLmVudGl0eS5nZXRNZXNoUmVuZGVyZXIoKTtcbiAgICBsZXQgZGlmZnVzZUhkcmlUeXBlID0gSGRyaUZvcm1hdC5MRFJfU1JHQi5pbmRleDtcbiAgICBsZXQgc3BlY3VsYXJIZHJpVHlwZSA9IEhkcmlGb3JtYXQuTERSX1NSR0IuaW5kZXg7XG4gICAgaWYgKG1lc2hSZW5kZXJDb21wb25lbnQuZGlmZnVzZUN1YmVNYXApIHtcbiAgICAgIGRpZmZ1c2VIZHJpVHlwZSA9IG1lc2hSZW5kZXJDb21wb25lbnQuZGlmZnVzZUN1YmVNYXAhLmhkcmlGb3JtYXQuaW5kZXg7XG4gICAgfVxuICAgIGlmIChtZXNoUmVuZGVyQ29tcG9uZW50LnNwZWN1bGFyQ3ViZU1hcCkge1xuICAgICAgc3BlY3VsYXJIZHJpVHlwZSA9IG1lc2hSZW5kZXJDb21wb25lbnQuc3BlY3VsYXJDdWJlTWFwIS5oZHJpRm9ybWF0LmluZGV4O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbWlwbWFwTGV2ZWxOdW1iZXIsXG4gICAgICBtZXNoUmVuZGVyQ29tcG9uZW50LFxuICAgICAgZGlmZnVzZUhkcmlUeXBlLFxuICAgICAgc3BlY3VsYXJIZHJpVHlwZSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MsIFNoYWRlclNlbWFudGljc0NsYXNzIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IERlcHRoRW5jb2RlU2luZ2xlU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0RlcHRoRW5jb2RlU2luZ2xlU2hhZGVyL0RlcHRoRW5jb2RlU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IERlcHRoRW5jb2RlU2luZ2xlU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXIvRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgeyBSZW5kZXJpbmdBcmdXZWJHTCB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvJztcblxuZXhwb3J0IGNsYXNzIERlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50IGV4dGVuZHMgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQge1xuICBzdGF0aWMgek5lYXJJbm5lciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ3pOZWFySW5uZXInIH0pO1xuICBzdGF0aWMgekZhcklubmVyID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnekZhcklubmVyJyB9KTtcbiAgc3RhdGljIGlzUG9pbnRMaWdodCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2lzUG9pbnRMaWdodCcgfSk7XG4gIHN0YXRpYyBkZXB0aFBvdyA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2RlcHRoUG93JyB9KTtcblxuICBwcml2YXRlIF9fbGFzdFpOZWFyID0gMC4wO1xuICBwcml2YXRlIF9fbGFzdFpGYXIgPSAwLjA7XG5cbiAgY29uc3RydWN0b3IoZGVwdGhQb3c6IG51bWJlciwgeyBpc1NraW5uaW5nIH06IHsgaXNTa2lubmluZzogYm9vbGVhbiB9KSB7XG4gICAgc3VwZXIoXG4gICAgICBudWxsLFxuICAgICAgJ2RlcHRoRW5jb2RlU2hhZGluZycgKyAoaXNTa2lubmluZyA/ICcrc2tpbm5pbmcnIDogJycpLFxuICAgICAgeyBpc01vcnBoaW5nOiBmYWxzZSwgaXNTa2lubmluZywgaXNMaWdodGluZzogZmFsc2UgfSxcbiAgICAgIERlcHRoRW5jb2RlU2luZ2xlU2hhZGVyVmVydGV4LFxuICAgICAgRGVwdGhFbmNvZGVTaW5nbGVTaGFkZXJGcmFnbWVudFxuICAgICk7XG5cbiAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICd6TmVhcklubmVyJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDAuMSksXG4gICAgICAgIG1pbjogMC4wMDAxLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICd6RmFySW5uZXInLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMTAwMDAuMCksXG4gICAgICAgIG1pbjogMC4wMDAxLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdpc1BvaW50TGlnaHQnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkJvb2wsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDEpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGVwdGhQb3cnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcihkZXB0aFBvdyksXG4gICAgICAgIG1pbjogMSxcbiAgICAgICAgbWF4OiAyLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdwb2ludFNpemUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigzMC4wKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEwMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAncG9pbnREaXN0YW5jZUF0dGVudWF0aW9uJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLjAsIDAuMSwgMC4wMV0pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KHNoYWRlclNlbWFudGljc0luZm9BcnJheSk7XG4gIH1cblxuICBfc2V0SW50ZXJuYWxTZXR0aW5nUGFyYW1ldGVyc1RvR3B1V2ViR0woe1xuICAgIG1hdGVyaWFsLFxuICAgIHNoYWRlclByb2dyYW0sXG4gICAgZmlyc3RUaW1lLFxuICAgIGFyZ3MsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICAgIGZpcnN0VGltZTogYm9vbGVhbjtcbiAgICBhcmdzOiBSZW5kZXJpbmdBcmdXZWJHTDtcbiAgfSkge1xuICAgIGxldCBjYW1lcmFDb21wb25lbnQgPSBhcmdzLnJlbmRlclBhc3MuY2FtZXJhQ29tcG9uZW50IGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgIGNhbWVyYUNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50KFxuICAgICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5zZXRVbmlmb3JtKSB7XG4gICAgICB0aGlzLnNldFdvcmxkTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mud29ybGRNYXRyaXgpO1xuICAgICAgdGhpcy5zZXROb3JtYWxNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy5ub3JtYWxNYXRyaXgpO1xuICAgICAgdGhpcy5zZXRWaWV3SW5mbyhzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcbiAgICAgIHRoaXMuc2V0UHJvamVjdGlvbihzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcblxuICAgICAgaWYgKGZpcnN0VGltZSB8fCB0aGlzLl9fbGFzdFpOZWFyICE9PSBjYW1lcmFDb21wb25lbnQuek5lYXJJbm5lcikge1xuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMWYoXG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS56TmVhcklubmVyLFxuICAgICAgICAgIGNhbWVyYUNvbXBvbmVudC56TmVhcklubmVyXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX19sYXN0Wk5lYXIgPSBjYW1lcmFDb21wb25lbnQuek5lYXJJbm5lcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX19sYXN0WkZhciAhPT0gY2FtZXJhQ29tcG9uZW50LnpGYXJJbm5lcikge1xuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMWYoXG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS56RmFySW5uZXIsXG4gICAgICAgICAgY2FtZXJhQ29tcG9uZW50LnpGYXJJbm5lclxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9fbGFzdFpGYXIgPSBjYW1lcmFDb21wb25lbnQuekZhcklubmVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ3pOZWFySW5uZXInLCBjYW1lcmFDb21wb25lbnQuek5lYXJJbm5lcik7XG4gICAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ3pGYXJJbm5lcicsIGNhbWVyYUNvbXBvbmVudC56RmFySW5uZXIpO1xuICAgIH1cblxuICAgIC8vLyBTa2lubmluZ1xuICAgIGNvbnN0IHNrZWxldGFsQ29tcG9uZW50ID0gYXJncy5lbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgIHRoaXMuc2V0U2tpbm5pbmcoc2hhZGVyUHJvZ3JhbSwgYXJncy5zZXRVbmlmb3JtLCBza2VsZXRhbENvbXBvbmVudCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFNoYWRlclNlbWFudGljcyxcbiAgU2hhZGVyU2VtYW50aWNzRW51bSxcbiAgU2hhZGVyU2VtYW50aWNzQ2xhc3MsXG59IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbWF0aC9TY2FsYXInO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIudmVydCc7XG5pbXBvcnQgRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9EZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlci9EZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlci5mcmFnJztcbmltcG9ydCBEZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlclZlcnRleFdlYkdwdSBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIudmVydCc7XG5pbXBvcnQgRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXJGcmFnbWVudFdlYkdwdSBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIvRGV0ZWN0SGlnaEx1bWluYW5jZUFuZENvcnJlY3RTaGFkZXIuZnJhZyc7XG5pbXBvcnQgeyBSZW5kZXJpbmdBcmdXZWJHTCB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvJztcbmltcG9ydCB7IEFic3RyYWN0VGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0Fic3RyYWN0VGV4dHVyZSc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zJztcblxuZXhwb3J0IGNsYXNzIERldGVjdEhpZ2hMdW1pbmFuY2VNYXRlcmlhbENvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB7XG4gIHN0YXRpYyBMdW1pbmFuY2VDcml0ZXJpb246IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ2x1bWluYW5jZUNyaXRlcmlvbicsXG4gIH0pO1xuICAvLyBzdGF0aWMgTHVtaW5hbmNlUmVkdWNlOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgLy8gICBzdHI6ICdsdW1pbmFuY2VSZWR1Y2UnLFxuICAvLyB9KTtcblxuICBjb25zdHJ1Y3Rvcih0ZXh0dXJlVG9EZXRlY3RIaWdoTHVtaW5hbmNlOiBBYnN0cmFjdFRleHR1cmUpIHtcbiAgICBzdXBlcihudWxsLCAnSGlnaEx1bWluYW5jZURldGVjdFNoYWRpbmcnLCB7fSk7XG5cbiAgICBjb25zdCBzYW1wbGVyID0gbmV3IFNhbXBsZXIoe1xuICAgICAgd3JhcFM6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgICB3cmFwVDogVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZSxcbiAgICAgIG1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgIH0pO1xuICAgIHNhbXBsZXIuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdsdW1pbmFuY2VDcml0ZXJpb24nLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigyKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICB9LFxuICAgICAgLy8ge1xuICAgICAgLy8gICBzZW1hbnRpYzogRGV0ZWN0SGlnaEx1bWluYW5jZU1hdGVyaWFsQ29udGVudC5MdW1pbmFuY2VSZWR1Y2UsXG4gICAgICAvLyAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAvLyAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIC8vICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAvLyAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDAuMjUpLFxuICAgICAgLy8gICBtaW46IDAsXG4gICAgICAvLyAgIG1heDogMSxcbiAgICAgIC8vIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnYmFzZUNvbG9yVGV4dHVyZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFswLCB0ZXh0dXJlVG9EZXRlY3RIaWdoTHVtaW5hbmNlLCBzYW1wbGVyXSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHRoaXMuX192ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSBEZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlclZlcnRleFdlYkdwdTtcbiAgICAgIHRoaXMuX19waXhlbFNoYWRlcml0eU9iamVjdCA9IERldGVjdEhpZ2hMdW1pbmFuY2VBbmRDb3JyZWN0U2hhZGVyRnJhZ21lbnRXZWJHcHU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX192ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSBEZXRlY3RIaWdoTHVtaW5hbmNlQW5kQ29ycmVjdFNoYWRlclZlcnRleDtcbiAgICAgIHRoaXMuX19waXhlbFNoYWRlcml0eU9iamVjdCA9IERldGVjdEhpZ2hMdW1pbmFuY2VBbmRDb3JyZWN0U2hhZGVyRnJhZ21lbnQ7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkoc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KTtcbiAgfVxuXG4gIF9zZXRJbnRlcm5hbFNldHRpbmdQYXJhbWV0ZXJzVG9HcHVXZWJHTCh7XG4gICAgbWF0ZXJpYWwsXG4gICAgc2hhZGVyUHJvZ3JhbSxcbiAgICBmaXJzdFRpbWUsXG4gICAgYXJncyxcbiAgfToge1xuICAgIG1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgZmlyc3RUaW1lOiBib29sZWFuO1xuICAgIGFyZ3M6IFJlbmRlcmluZ0FyZ1dlYkdMO1xuICB9KSB7XG4gICAgaWYgKGFyZ3Muc2V0VW5pZm9ybSkge1xuICAgICAgdGhpcy5zZXRXb3JsZE1hdHJpeChzaGFkZXJQcm9ncmFtLCBhcmdzLndvcmxkTWF0cml4KTtcbiAgICAgIC8vLyBNYXRyaWNlc1xuICAgICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IGFyZ3MucmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQ7XG4gICAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgICAgQ2FtZXJhQ29tcG9uZW50LFxuICAgICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgICAgfVxuICAgICAgaWYgKGNhbWVyYUNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnNldFZpZXdJbmZvKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgICAgICB0aGlzLnNldFByb2plY3Rpb24oc2hhZGVyUHJvZ3JhbSwgY2FtZXJhQ29tcG9uZW50LCBhcmdzLmlzVnIsIGFyZ3MuZGlzcGxheUlkeCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL21hdGgvU2NhbGFyJztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgZW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL0VudGl0eVVJRE91dHB1dFNpbmdsZVNoYWRlci9FbnRpdHlVSURPdXRwdXRTaW5nbGVTaGFkZXIudmVydCc7XG5pbXBvcnQgZW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyL0VudGl0eVVJRE91dHB1dFNpbmdsZVNoYWRlci5mcmFnJztcbmltcG9ydCB7IFJlbmRlcmluZ0FyZ1dlYkdMIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuXG5leHBvcnQgY2xhc3MgRW50aXR5VUlET3V0cHV0TWF0ZXJpYWxDb250ZW50IGV4dGVuZHMgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIG51bGwsXG4gICAgICAnZW50aXR5VWlkT3V0cHV0U2hhZGluZycgKyAodHJ1ZSA/ICcrc2tpbm5pbmcnIDogJycpICsgKGZhbHNlID8gJycgOiAnLWxpZ2h0aW5nJyksXG4gICAgICB7IGlzTW9ycGhpbmc6IGZhbHNlLCBpc1NraW5uaW5nOiB0cnVlLCBpc0xpZ2h0aW5nOiBmYWxzZSB9LFxuICAgICAgZW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyVmVydGV4LFxuICAgICAgZW50aXR5VUlET3V0cHV0U2luZ2xlU2hhZGVyRnJhZ21lbnRcbiAgICApO1xuXG4gICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5OiBTaGFkZXJTZW1hbnRpY3NJbmZvW10gPSBbXG4gICAgICAvLyB7c2VtYW50aWM6IFNoYWRlclNlbWFudGljcy5WaWV3TWF0cml4LCBpc0NvbXBvbmVudERhdGE6IHRydWUsIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLk1hdDQsIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAvLyAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlciwgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSwgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLCBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSwgdXBkYXRlSW50ZXJ2YWw6IFNoYWRlclZhcmlhYmxlVXBkYXRlSW50ZXJ2YWwuRmlyc3RUaW1lT25seSwgaW5pdGlhbFZhbHVlOiBNdXRhYmxlTWF0cml4NDQuemVybygpIH0sXG4gICAgICAvLyB7c2VtYW50aWM6IFNoYWRlclNlbWFudGljcy5Qcm9qZWN0aW9uTWF0cml4LCBpc0NvbXBvbmVudERhdGE6IHRydWUsIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLk1hdDQsIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAvLyAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlciwgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSwgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLCBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSwgdXBkYXRlSW50ZXJ2YWw6IFNoYWRlclZhcmlhYmxlVXBkYXRlSW50ZXJ2YWwuRmlyc3RUaW1lT25seSwgaW5pdGlhbFZhbHVlOiBNdXRhYmxlTWF0cml4NDQuemVybygpIH0sXG4gICAgICAvLyB7XG4gICAgICAvLyAgIHNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3MuVmlld1Bvc2l0aW9uLFxuICAgICAgLy8gICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgLy8gICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgLy8gICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAvLyAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAvLyAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIC8vICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAvLyAgIHVwZGF0ZUludGVydmFsOiBTaGFkZXJWYXJpYWJsZVVwZGF0ZUludGVydmFsLkZpcnN0VGltZU9ubHksXG4gICAgICAvLyAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAwXSksXG4gICAgICAvLyAgIHNvbG9EYXR1bTogdHJ1ZVxuICAgICAgLy8gfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdwb2ludFNpemUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigzMC4wKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEwMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAncG9pbnREaXN0YW5jZUF0dGVudWF0aW9uJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLjAsIDAuMSwgMC4wMV0pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KHNoYWRlclNlbWFudGljc0luZm9BcnJheSk7XG4gIH1cblxuICBfc2V0SW50ZXJuYWxTZXR0aW5nUGFyYW1ldGVyc1RvR3B1V2ViR0woe1xuICAgIG1hdGVyaWFsLFxuICAgIHNoYWRlclByb2dyYW0sXG4gICAgZmlyc3RUaW1lLFxuICAgIGFyZ3MsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICAgIGZpcnN0VGltZTogYm9vbGVhbjtcbiAgICBhcmdzOiBSZW5kZXJpbmdBcmdXZWJHTDtcbiAgfSkge1xuICAgIGlmIChhcmdzLnNldFVuaWZvcm0pIHtcbiAgICAgIHRoaXMuc2V0V29ybGRNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy53b3JsZE1hdHJpeCk7XG4gICAgICB0aGlzLnNldE5vcm1hbE1hdHJpeChzaGFkZXJQcm9ncmFtLCBhcmdzLm5vcm1hbE1hdHJpeCk7XG5cbiAgICAgIC8vLyBNYXRyaWNlc1xuICAgICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IGFyZ3MucmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQ7XG4gICAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgICAgQ2FtZXJhQ29tcG9uZW50LFxuICAgICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRWaWV3SW5mbyhzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcbiAgICAgIHRoaXMuc2V0UHJvamVjdGlvbihzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcblxuICAgICAgLy8vIFNraW5uaW5nXG4gICAgICBjb25zdCBza2VsZXRhbENvbXBvbmVudCA9IGFyZ3MuZW50aXR5LnRyeVRvR2V0U2tlbGV0YWwoKTtcbiAgICAgIHRoaXMuc2V0U2tpbm5pbmcoc2hhZGVyUHJvZ3JhbSwgYXJncy5zZXRVbmlmb3JtLCBza2VsZXRhbENvbXBvbmVudCk7XG5cbiAgICAgIC8vIExpZ2h0c1xuICAgICAgdGhpcy5zZXRMaWdodHNJbmZvKHNoYWRlclByb2dyYW0sIGFyZ3MubGlnaHRDb21wb25lbnRzLCBtYXRlcmlhbCwgYXJncy5zZXRVbmlmb3JtKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MsIFNoYWRlclNlbWFudGljc0NsYXNzIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgRnVybmFjZVRlc3RTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvRnVybmFjZVRlc3RTaGFkZXIvRnVybmFjZVRlc3RTaGFkZXIudmVydCc7XG5pbXBvcnQgRnVybmFjZVRlc3RTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9GdXJuYWNlVGVzdFNoYWRlci9GdXJuYWNlVGVzdFNoYWRlci5mcmFnJztcbmltcG9ydCB7IFJlbmRlcmluZ0FyZ1dlYkdMIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgZHVtbXlXaGl0ZVRleHR1cmUgfSBmcm9tICcuLi9jb3JlL0R1bW15VGV4dHVyZXMnO1xuXG5leHBvcnQgY2xhc3MgRnVybmFjZVRlc3RNYXRlcmlhbENvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB7XG4gIHN0YXRpYyBtb2RlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnbW9kZScgfSk7XG4gIHN0YXRpYyBkZWJ1Z1ZpZXcgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdkZWJ1Z1ZpZXcnIH0pO1xuICBzdGF0aWMgZ190eXBlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnZ190eXBlJyB9KTtcbiAgc3RhdGljIGRpc2FibGVfZnJlc25lbCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2Rpc2FibGVfZnJlc25lbCcgfSk7XG4gIHN0YXRpYyBmMCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2YwJyB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihudWxsLCAnRnVybmFjZVRlc3RTaGFkaW5nJywge30sIEZ1cm5hY2VUZXN0U2hhZGVyVmVydGV4LCBGdXJuYWNlVGVzdFNoYWRlckZyYWdtZW50KTtcblxuICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gW1xuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2RlYnVnVmlldycsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigwKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2Rpc2FibGVfZnJlc25lbCcsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigwKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2YwJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdnX3R5cGUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMCksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAzLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdtb2RlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDApLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc2NyZWVuSW5mbycsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjIuZnJvbUNvcHlBcnJheTIoWzAsIDBdKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdtZXRhbGxpY1JvdWdobmVzc0ZhY3RvcicsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjIuZnJvbUNvcHlBcnJheTIoWzEsIDFdKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ21ldGFsbGljUm91Z2huZXNzVGV4dHVyZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFsxLCBkdW1teVdoaXRlVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLnNldFNoYWRlclNlbWFudGljc0luZm9BcnJheShzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkpO1xuICB9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICBtYXRlcmlhbCxcbiAgICBzaGFkZXJQcm9ncmFtLFxuICAgIGZpcnN0VGltZSxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0w7XG4gIH0pIHtcbiAgICBpZiAoYXJncy5zZXRVbmlmb3JtKSB7XG4gICAgICB0aGlzLnNldFdvcmxkTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mud29ybGRNYXRyaXgpO1xuICAgICAgdGhpcy5zZXROb3JtYWxNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy5ub3JtYWxNYXRyaXgpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgIC8vLyBNYXRyaWNlc1xuICAgICAgICBsZXQgY2FtZXJhQ29tcG9uZW50ID0gYXJncy5yZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudDtcbiAgICAgICAgaWYgKGNhbWVyYUNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICAgICAgICBDYW1lcmFDb21wb25lbnQuY3VycmVudFxuICAgICAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0Vmlld0luZm8oc2hhZGVyUHJvZ3JhbSwgY2FtZXJhQ29tcG9uZW50LCBhcmdzLmlzVnIsIGFyZ3MuZGlzcGxheUlkeCk7XG4gICAgICAgIHRoaXMuc2V0UHJvamVjdGlvbihzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcblxuICAgICAgICAvLyBMaWdodHNcbiAgICAgICAgdGhpcy5zZXRMaWdodHNJbmZvKHNoYWRlclByb2dyYW0sIGFyZ3MubGlnaHRDb21wb25lbnRzLCBtYXRlcmlhbCwgYXJncy5zZXRVbmlmb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0TWF0ZXJpYWxDb250ZW50IH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdE1hdGVyaWFsQ29udGVudCc7XG5pbXBvcnQgeyBBbHBoYU1vZGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9BbHBoYU1vZGUnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL21hdGgvU2NhbGFyJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcywgU2hhZGVyU2VtYW50aWNzQ2xhc3MgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IFZlY3Rvck4gfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3Rvck4nO1xuaW1wb3J0IHsgQXJyYXkzLCBBcnJheTQsIENvdW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUnO1xuaW1wb3J0IG1Ub29uU2luZ2xlU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL01Ub29uU2luZ2xlU2hhZGVyL01Ub29uU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IG1Ub29uU2luZ2xlU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvTVRvb25TaW5nbGVTaGFkZXIvTVRvb25TaW5nbGVTaGFkZXIuZnJhZyc7XG5pbXBvcnQgbVRvb25TaW5nbGVTaGFkZXJWZXJ0ZXhXZWJHcHUgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL01Ub29uU2luZ2xlU2hhZGVyL01Ub29uU2luZ2xlU2hhZGVyLnZlcnQnO1xuaW1wb3J0IG1Ub29uU2luZ2xlU2hhZGVyRnJhZ21lbnRXZWJHcHUgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL01Ub29uU2luZ2xlU2hhZGVyL01Ub29uU2luZ2xlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IHsgUmVuZGVyaW5nQXJnV2ViR0wsIFJlbmRlcmluZ0FyZ1dlYkdwdSB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvJztcbmltcG9ydCB7XG4gIEdMX0RTVF9BTFBIQSxcbiAgR0xfRFNUX0NPTE9SLFxuICBHTF9PTkUsXG4gIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsXG4gIEdMX09ORV9NSU5VU19EU1RfQ09MT1IsXG4gIEdMX09ORV9NSU5VU19TUkNfQUxQSEEsXG4gIEdMX09ORV9NSU5VU19TUkNfQ09MT1IsXG4gIEdMX1NSQ19BTFBIQSxcbiAgR0xfU1JDX0FMUEhBX1NBVFVSQVRFLFxuICBHTF9TUkNfQ09MT1IsXG4gIEdMX1pFUk8sXG4gIFZybTB4TWF0ZXJpYWxQcm9wZXJ0eSxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgQmxlbmQgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9CbGVuZCc7XG5pbXBvcnQgeyBkdW1teUJsYWNrVGV4dHVyZSwgZHVtbXlXaGl0ZVRleHR1cmUgfSBmcm9tICcuLi9jb3JlL0R1bW15VGV4dHVyZXMnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoLCBQcm9jZXNzQXBwcm9hY2hDbGFzcyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuXG5leHBvcnQgY2xhc3MgTVRvb25NYXRlcmlhbENvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB7XG4gIHN0YXRpYyByZWFkb25seSBfQ3V0b2ZmID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnY3V0b2ZmJyB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9Db2xvciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2xpdENvbG9yJyB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9TaGFkZUNvbG9yID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnc2hhZGVDb2xvcicgfSk7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgX2xpdENvbG9yVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2xpdENvbG9yVGV4dHVyZScgfSk7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgX3NoYWRlQ29sb3JUZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdzaGFkZUNvbG9yVGV4dHVyZScsXG4gIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX0J1bXBTY2FsZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ25vcm1hbFNjYWxlJyB9KTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBfbm9ybWFsVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ25vcm1hbFRleHR1cmUnIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX1JlY2VpdmVTaGFkb3dSYXRlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdyZWNlaXZlU2hhZG93UmF0ZScsXG4gIH0pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IF9yZWNlaXZlU2hhZG93VGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAncmVjZWl2ZVNoYWRvd1RleHR1cmUnLFxuICB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9TaGFkaW5nR3JhZGVSYXRlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdzaGFkaW5nR3JhZGVSYXRlJyxcbiAgfSk7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgX3NoYWRpbmdHcmFkZVRleHR1cmUgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ3NoYWRpbmdHcmFkZVRleHR1cmUnLFxuICB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9TaGFkZVNoaWZ0ID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnc2hhZGVTaGlmdCcgfSk7XG4gIHN0YXRpYyByZWFkb25seSBfU2hhZGVUb29ueSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ3NoYWRlVG9vbnknIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX0xpZ2h0Q29sb3JBdHRlbnVhdGlvbiA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnbGlnaHRDb2xvckF0dGVudWF0aW9uJyxcbiAgfSk7XG4gIHN0YXRpYyByZWFkb25seSBfQW1iaWVudENvbG9yID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdhbWJpZW50Q29sb3InLFxuICB9KTtcbiAgLy8gc3RhdGljIHJlYWRvbmx5IF9JbmRpcmVjdExpZ2h0SW50ZW5zaXR5ID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnaW5kaXJlY3RMaWdodEludGVuc2l0eScgfSk7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgX3JpbVRleHR1cmUgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdyaW1UZXh0dXJlJyB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9SaW1Db2xvciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ3JpbUNvbG9yJyB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9SaW1MaWdodGluZ01peCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAncmltTGlnaHRpbmdNaXgnLFxuICB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9SaW1GcmVzbmVsUG93ZXIgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ3JpbUZyZXNuZWxQb3dlcicsXG4gIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX1JpbUxpZnQgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdyaW1MaWZ0JyB9KTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBfbWF0Q2FwVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ21hdENhcFRleHR1cmUnIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX0VtaXNzaW9uQ29sb3IgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ2VtaXNzaW9uQ29sb3InLFxuICB9KTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBfZW1pc3Npb25UZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdlbWlzc2lvblRleHR1cmUnLFxuICB9KTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBfT3V0bGluZVdpZHRoVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnb3V0bGluZVdpZHRoVGV4dHVyZScsXG4gIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX091dGxpbmVXaWR0aCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnb3V0bGluZVdpZHRoJyxcbiAgfSk7XG4gIHN0YXRpYyByZWFkb25seSBfT3V0bGluZVNjYWxlZE1heERpc3RhbmNlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdvdXRsaW5lU2NhbGVkTWF4RGlzdGFuY2UnLFxuICB9KTtcbiAgc3RhdGljIHJlYWRvbmx5IF9PdXRsaW5lQ29sb3IgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ291dGxpbmVDb2xvcicsXG4gIH0pO1xuICBzdGF0aWMgcmVhZG9ubHkgX091dGxpbmVMaWdodGluZ01peCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnb3V0bGluZUxpZ2h0aW5nTWl4JyxcbiAgfSk7XG5cbiAgc3RhdGljIHJlYWRvbmx5IEFzcGVjdCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2FzcGVjdCcgfSk7XG4gIHN0YXRpYyByZWFkb25seSBDYW1lcmFVcCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2NhbWVyYVVwJyB9KTtcblxuICBzdGF0aWMgdXNhYmxlQmxlbmRFcXVhdGlvbk1vZGVBbHBoYT86IG51bWJlcjtcbiAgcHJpdmF0ZSBfX091dGxpbmVXaWR0aE1vZGVJc1NjcmVlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX19mbG9hdFByb3BlcnRpZXM6IHtcbiAgICBbczogc3RyaW5nXTogbnVtYmVyO1xuICB9ID0ge307XG4gIHByaXZhdGUgX192ZWN0b3JQcm9wZXJ0aWVzOiB7XG4gICAgW3M6IHN0cmluZ106IEFycmF5MzxudW1iZXI+IHwgQXJyYXk0PG51bWJlcj47XG4gIH0gPSB7fTtcbiAgcHJpdmF0ZSBfX3RleHR1cmVQcm9wZXJ0aWVzOiBhbnkgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpc091dGxpbmU6IGJvb2xlYW4sXG4gICAgbWF0ZXJpYWxQcm9wZXJ0aWVzOiBWcm0weE1hdGVyaWFsUHJvcGVydHkgfCB1bmRlZmluZWQsXG4gICAgdGV4dHVyZXM6IGFueSxcbiAgICBzYW1wbGVyczogU2FtcGxlcltdLFxuICAgIGlzTW9ycGhpbmc6IGJvb2xlYW4sXG4gICAgaXNTa2lubmluZzogYm9vbGVhbixcbiAgICBpc0xpZ2h0aW5nOiBib29sZWFuLFxuICAgIHVzZVRhbmdlbnRBdHRyaWJ1dGU6IGJvb2xlYW4sXG4gICAgZGVidWdNb2RlOiBDb3VudCB8IHVuZGVmaW5lZCxcbiAgICBtYWtlT3V0cHV0U3JnYjogYm9vbGVhbixcbiAgICBtYXRlcmlhbE5hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihudWxsLCBtYXRlcmlhbE5hbWUsIHtcbiAgICAgIGlzTW9ycGhpbmc6IGlzTW9ycGhpbmcsXG4gICAgICBpc1NraW5uaW5nOiBpc1NraW5uaW5nLFxuICAgICAgaXNMaWdodGluZzogaXNMaWdodGluZyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gdGhpcy5kb1NoYWRlclJlZmxlY3Rpb24oXG4gICAgICBtVG9vblNpbmdsZVNoYWRlclZlcnRleCxcbiAgICAgIG1Ub29uU2luZ2xlU2hhZGVyRnJhZ21lbnQsXG4gICAgICBtVG9vblNpbmdsZVNoYWRlclZlcnRleFdlYkdwdSxcbiAgICAgIG1Ub29uU2luZ2xlU2hhZGVyRnJhZ21lbnRXZWJHcHVcbiAgICApO1xuXG4gICAgaWYgKG1hdGVyaWFsUHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmZsb2F0UHJvcGVydGllcztcbiAgICAgIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnZlY3RvclByb3BlcnRpZXM7XG4gICAgICB0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1hdGVyaWFsUHJvcGVydGllcy50ZXh0dXJlUHJvcGVydGllcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9CbGVuZE1vZGUgPSAwLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9CdW1wU2NhbGUgPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9DdWxsTW9kZSA9IDIuMDtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX0N1dG9mZiA9IDAuNTtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX0RlYnVnTW9kZSA9IDAuMDtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX0RzdEJsZW5kID0gMC4wO1xuICAgICAgdGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fSW5kaXJlY3RMaWdodEludGVuc2l0eSA9IDAuMTtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX0xpZ2h0Q29sb3JBdHRlbnVhdGlvbiA9IDAuMDtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX091dGxpbmVDb2xvck1vZGUgPSAwLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lQ3VsbE1vZGUgPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lTGlnaHRpbmdNaXggPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lU2NhbGVkTWF4RGlzdGFuY2UgPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGggPSAwLjU7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhNb2RlID0gMC4wO1xuICAgICAgdGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fUmVjZWl2ZVNoYWRvd1JhdGUgPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9SaW1GcmVzbmVsUG93ZXIgPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9SaW1MaWZ0ID0gMC4wO1xuICAgICAgdGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fUmltTGlnaHRpbmdNaXggPSAwLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9TaGFkZVNoaWZ0ID0gMC4wO1xuICAgICAgdGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fU2hhZGVUb29ueSA9IDAuOTtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1NoYWRpbmdHcmFkZVJhdGUgPSAxLjA7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9TcmNCbGVuZCA9IDEuMDtcbiAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1pXcml0ZSA9IDEuMDtcbiAgICAgIC8vIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1V2QW5pbVNjcm9sbFggPSAwLjA7XG4gICAgICAvLyB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9VdkFuaW1TY3JvbGxZID0gMC4wO1xuICAgICAgLy8gdGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fVXZBbmltUm90YXRpb24gPSAwLjA7XG5cbiAgICAgIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzLl9Db2xvciA9IFsxLCAxLCAxLCAxXTtcbiAgICAgIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzLl9FbWlzc2lvbkNvbG9yID0gWzAsIDAsIDBdO1xuICAgICAgdGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX091dGxpbmVDb2xvciA9IFswLCAwLCAwLCAxXTtcbiAgICAgIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzLl9TaGFkZUNvbG9yID0gWzAuOTcsIDAuODEsIDAuODYsIDFdO1xuICAgICAgdGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX1JpbUNvbG9yID0gWzAsIDAsIDBdO1xuICAgICAgLy8gdGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX0J1bXBNYXAgPSBbMCwgMCwgMSwgMV07XG4gICAgICAvLyB0aGlzLl9fdmVjdG9yUHJvcGVydGllcy5fRW1pc3Npb25NYXAgPSBbMCwgMCwgMSwgMV07XG4gICAgICAvLyB0aGlzLl9fdmVjdG9yUHJvcGVydGllcy5fTWFpblRleCA9IFswLCAwLCAxLCAxXTtcbiAgICAgIC8vIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhUZXh0dXJlID0gWzAsIDAsIDEsIDFdO1xuICAgICAgLy8gdGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX1JlY2VpdmVTaGFkb3dUZXh0dXJlID0gWzAsIDAsIDEsIDFdO1xuICAgICAgLy8gdGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX1NoYWRlVGV4dHVyZSA9IFswLCAwLCAxLCAxXTtcbiAgICAgIC8vIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzLl9TaGFkaW5nR3JhZGVUZXh0dXJlID0gWzAsIDAsIDEsIDFdO1xuICAgICAgLy8gdGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX1NwaGVyZUFkZCA9IFswLCAwLCAxLCAxXTtcbiAgICB9XG5cbiAgICBpZiAoZGVidWdNb2RlKSB7XG4gICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9EZWJ1Z01vZGUgPSBkZWJ1Z01vZGU7XG4gICAgfVxuXG4gICAgLy8gbm9uLVRleHR1cmVcbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkucHVzaChcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdjdXRvZmYnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcih0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9DdXRvZmYpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnbGl0Q29sb3InLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWM0LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3I0LmZyb21Db3B5QXJyYXkodGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX0NvbG9yIGFzIEFycmF5NDxudW1iZXI+KSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3NoYWRlQ29sb3InLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IzLmZyb21Db3B5QXJyYXkodGhpcy5fX3ZlY3RvclByb3BlcnRpZXMuX1NoYWRlQ29sb3IpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnYnVtcFNjYWxlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fQnVtcFNjYWxlKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3JlY2VpdmVTaGFkb3dSYXRlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fUmVjZWl2ZVNoYWRvd1JhdGUpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc2hhZGluZ0dyYWRlUmF0ZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1NoYWRpbmdHcmFkZVJhdGUpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc2hhZGVTaGlmdCcsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1NoYWRlU2hpZnQpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc2hhZGVUb29ueScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1NoYWRlVG9vbnkpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnbGlnaHRDb2xvckF0dGVudWF0aW9uJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fTGlnaHRDb2xvckF0dGVudWF0aW9uKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2FtYmllbnRDb2xvcicsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzMsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMC41Nzg1LCAwLjU3ODUsIDAuNTc4NV0pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICAvLyB7XG4gICAgICAvLyAgIHNlbWFudGljOiBNVG9vbk1hdGVyaWFsQ29udGVudC5fSW5kaXJlY3RMaWdodEludGVuc2l0eSwgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCwgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgLy8gICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlciwgaXNJbnRlcm5hbFNldHRpbmc6IGZhbHNlLCB1cGRhdGVJbnRlcnZhbDogU2hhZGVyVmFyaWFibGVVcGRhdGVJbnRlcnZhbC5FdmVyeVRpbWUsIHNvbG9EYXR1bTogZmFsc2UsXG4gICAgICAvLyAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuZmxvYXRQcm9wZXJ0aWVzQXJyYXkuX0luZGlyZWN0TGlnaHRJbnRlbnNpdHkpLCBtaW46IDAsIG1heDogMVxuICAgICAgLy8gfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdyaW1Db2xvcicsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzMsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjMuZnJvbUNvcHlBcnJheSh0aGlzLl9fdmVjdG9yUHJvcGVydGllcy5fUmltQ29sb3IgYXMgQXJyYXkzPG51bWJlcj4pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAncmltTGlnaHRpbmdNaXgnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcih0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9SaW1MaWdodGluZ01peCksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdyaW1GcmVzbmVsUG93ZXInLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcih0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9SaW1GcmVzbmVsUG93ZXIpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAncmltTGlmdCcsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX1JpbUxpZnQpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnY2FtZXJhVXAnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMCwgMSwgMF0pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZW1pc3Npb25Db2xvcicsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzMsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjMuZnJvbUNvcHlBcnJheShcbiAgICAgICAgICB0aGlzLl9fdmVjdG9yUHJvcGVydGllcy5fRW1pc3Npb25Db2xvciBhcyBBcnJheTM8bnVtYmVyPlxuICAgICAgICApLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICAvLyB7XG4gICAgICAvLyAgIHNlbWFudGljOiBNVG9vbk1hdGVyaWFsQ29udGVudC5fVXZBbmltU2Nyb2xsWCwgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCwgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgLy8gICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlciwgaXNJbnRlcm5hbFNldHRpbmc6IGZhbHNlLCB1cGRhdGVJbnRlcnZhbDogU2hhZGVyVmFyaWFibGVVcGRhdGVJbnRlcnZhbC5FdmVyeVRpbWUsIHNvbG9EYXR1bTogZmFsc2UsXG4gICAgICAvLyAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuZmxvYXRQcm9wZXJ0aWVzQXJyYXkuX1V2QW5pbVNjcm9sbFgpLCBtaW46IDAsIG1heDogMVxuICAgICAgLy8gfSxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgc2VtYW50aWM6IE1Ub29uTWF0ZXJpYWxDb250ZW50Ll9VdkFuaW1TY3JvbGxZLCBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LCBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAvLyAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLCBpc0ludGVybmFsU2V0dGluZzogZmFsc2UsIHVwZGF0ZUludGVydmFsOiBTaGFkZXJWYXJpYWJsZVVwZGF0ZUludGVydmFsLkV2ZXJ5VGltZSwgc29sb0RhdHVtOiBmYWxzZSxcbiAgICAgIC8vICAgaW5pdGlhbFZhbHVlOiAgU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuZmxvYXRQcm9wZXJ0aWVzQXJyYXkuX1V2QW5pbVNjcm9sbFkpLCBtaW46IDAsIG1heDogMVxuICAgICAgLy8gfSxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgc2VtYW50aWM6IE1Ub29uTWF0ZXJpYWxDb250ZW50Ll9VdkFuaW1Sb3RhdGlvbiwgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCwgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgLy8gICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlciwgaXNJbnRlcm5hbFNldHRpbmc6IGZhbHNlLCB1cGRhdGVJbnRlcnZhbDogU2hhZGVyVmFyaWFibGVVcGRhdGVJbnRlcnZhbC5FdmVyeVRpbWUsIHNvbG9EYXR1bTogZmFsc2UsXG4gICAgICAvLyAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuZmxvYXRQcm9wZXJ0aWVzQXJyYXkuX1V2QW5pbVJvdGF0aW9uKSwgbWluOiAwLCBtYXg6IDFcbiAgICAgIC8vIH0sXG5cbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICd3aXJlZnJhbWUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIDFdKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEwLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdtYWtlT3V0cHV0U3JnYicsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5Cb29sLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKG1ha2VPdXRwdXRTcmdiID8gMSA6IDApLFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBfRGVidWdNb2RlXG4gICAgc3dpdGNoICh0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9EZWJ1Z01vZGUpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5fX2RlZmluaXRpb25zICs9ICcjZGVmaW5lIFJOX01UT09OX0RFQlVHX05PUk1BTFxcbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fTVRPT05fREVCVUdfTElUU0hBREVSQVRFXFxuJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0bGluZSkge1xuICAgICAgdGhpcy5fX2RlZmluaXRpb25zICs9ICcjZGVmaW5lIFJOX01UT09OX0lTX09VVExJTkVcXG4nO1xuXG4gICAgICAvLyBfT3V0bGluZVdpZHRoTW9kZVxuICAgICAgc3dpdGNoICh0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhNb2RlKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fTVRPT05fT1VUTElORV9OT05FXFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMuX19kZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9NVE9PTl9PVVRMSU5FX1dJRFRIX1dPUkxEXFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRoaXMuX19kZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9NVE9PTl9PVVRMSU5FX1dJRFRIX1NDUkVFTlxcbic7XG4gICAgICAgICAgdGhpcy5fX091dGxpbmVXaWR0aE1vZGVJc1NjcmVlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIF9PdXRsaW5lQ29sb3JNb2RlXG4gICAgICBzd2l0Y2ggKHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX091dGxpbmVDb2xvck1vZGUpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHRoaXMuX19kZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9NVE9PTl9PVVRMSU5FX0NPTE9SX0ZJWEVEXFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMuX19kZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9NVE9PTl9PVVRMSU5FX0NPTE9SX01JWEVEXFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBzZW1hbnRpYzogJ291dGxpbmVXaWR0aCcsXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX091dGxpbmVXaWR0aCksXG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIG1heDogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNlbWFudGljOiAnb3V0bGluZVNjYWxlZE1heERpc3RhbmNlJyxcbiAgICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fT3V0bGluZVNjYWxlZE1heERpc3RhbmNlKSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VtYW50aWM6ICdvdXRsaW5lQ29sb3InLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjMuZnJvbUNvcHlBcnJheShcbiAgICAgICAgICAgIHRoaXMuX192ZWN0b3JQcm9wZXJ0aWVzLl9PdXRsaW5lQ29sb3IgYXMgQXJyYXkzPG51bWJlcj5cbiAgICAgICAgICApLFxuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZW1hbnRpYzogJ291dGxpbmVMaWdodGluZ01peCcsXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fT3V0bGluZUxpZ2h0aW5nTWl4KSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VtYW50aWM6ICdhc3BlY3QnLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMS4wKSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0xpZ2h0aW5nKSB7XG4gICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fSVNfTElHSFRJTkdcXG4nO1xuICAgIH1cblxuICAgIGlmIChpc1NraW5uaW5nKSB7XG4gICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fSVNfU0tJTk5JTkdcXG4nO1xuICAgIH1cblxuICAgIGlmIChpc01vcnBoaW5nKSB7XG4gICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fSVNfTU9SUEhJTkdcXG4nO1xuXG4gICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIHNlbWFudGljOiAnZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uJyxcbiAgICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheSxcbiAgICAgICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIsXG4gICAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFZlY3Rvck4obmV3IEludDMyQXJyYXkoQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpKSxcbiAgICAgICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VtYW50aWM6ICdtb3JwaFdlaWdodHMnLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyQXJyYXksXG4gICAgICAgICAgYXJyYXlMZW5ndGg6IENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyLFxuICAgICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpKSxcbiAgICAgICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh1c2VUYW5nZW50QXR0cmlidXRlKSB7XG4gICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fVVNFX1RBTkdFTlRfQVRUUklCVVRFXFxuJztcbiAgICB9XG5cbiAgICAvLyBUZXh0dXJlXG4gICAgaWYgKHRoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fQnVtcE1hcCA+PSAwKSB7XG4gICAgICAvL3RleHR1cmVzLmxlbmd0aCAtIDIgaXMgZHVtbXlUZXh0dXJlXG4gICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fTVRPT05fSEFTX0JVTVBNQVBcXG4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhUZXh0dXJlID49IDApIHtcbiAgICAgIC8vdGV4dHVyZXMubGVuZ3RoIC0gMiBpcyBkdW1teVRleHR1cmVcbiAgICAgIHRoaXMuX19kZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9NVE9PTl9IQVNfT1VUTElORV9XSURUSF9URVhUVVJFXFxuJztcbiAgICB9XG4gICAgdGV4dHVyZXMgPSBbZHVtbXlXaGl0ZVRleHR1cmUsIGR1bW15QmxhY2tUZXh0dXJlXTtcbiAgICB0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX0J1bXBNYXAgPSAwO1xuICAgIHRoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fRW1pc3Npb25NYXAgPSAxO1xuICAgIHRoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fTWFpblRleCA9IDA7XG4gICAgdGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhUZXh0dXJlID0gMDtcbiAgICB0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1JlY2VpdmVTaGFkb3dUZXh0dXJlID0gMDtcbiAgICB0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1JpbVRleHR1cmUgPSAxO1xuICAgIHRoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fU2hhZGVUZXh0dXJlID0gMDtcbiAgICB0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1NoYWRpbmdHcmFkZVRleHR1cmUgPSAwO1xuICAgIHRoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fU3BoZXJlQWRkID0gMTtcbiAgICAvLyB0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1V2QW5pbU1hc2tUZXh0dXJlID0gMDtcbiAgICB0aGlzLl9fc2V0RHVtbXlUZXh0dXJlcyh0ZXh0dXJlcywgc2FtcGxlcnMsIHNoYWRlclNlbWFudGljc0luZm9BcnJheSwgaXNPdXRsaW5lKTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KHNoYWRlclNlbWFudGljc0luZm9BcnJheSk7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0RHVtbXlUZXh0dXJlcyhcbiAgICB0ZXh0dXJlczogVGV4dHVyZVtdLFxuICAgIHNhbXBsZXJzOiBTYW1wbGVyW10sXG4gICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5OiBTaGFkZXJTZW1hbnRpY3NJbmZvW10sXG4gICAgaXNPdXRsaW5lOiBib29sZWFuXG4gICkge1xuICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2xpdENvbG9yVGV4dHVyZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFtcbiAgICAgICAgICAwLFxuICAgICAgICAgIHRleHR1cmVzW3RoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fTWFpblRleF0sXG4gICAgICAgICAgc2FtcGxlcnNbdGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9NYWluVGV4XSxcbiAgICAgICAgXSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzaGFkZUNvbG9yVGV4dHVyZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFtcbiAgICAgICAgICAxLFxuICAgICAgICAgIHRleHR1cmVzW3RoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fU2hhZGVUZXh0dXJlXSxcbiAgICAgICAgICBzYW1wbGVyc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1NoYWRlVGV4dHVyZV0sXG4gICAgICAgIF0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAncmVjZWl2ZVNoYWRvd1RleHR1cmUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBbXG4gICAgICAgICAgMixcbiAgICAgICAgICB0ZXh0dXJlc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1JlY2VpdmVTaGFkb3dUZXh0dXJlXSxcbiAgICAgICAgICBzYW1wbGVyc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1JlY2VpdmVTaGFkb3dUZXh0dXJlXSxcbiAgICAgICAgXSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzaGFkaW5nR3JhZGVUZXh0dXJlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogW1xuICAgICAgICAgIDMsXG4gICAgICAgICAgdGV4dHVyZXNbdGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9TaGFkaW5nR3JhZGVUZXh0dXJlXSxcbiAgICAgICAgICBzYW1wbGVyc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1NoYWRpbmdHcmFkZVRleHR1cmVdLFxuICAgICAgICBdLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3JpbVRleHR1cmUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBbXG4gICAgICAgICAgNCxcbiAgICAgICAgICB0ZXh0dXJlc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1JpbVRleHR1cmVdLFxuICAgICAgICAgIHNhbXBsZXJzW3RoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fUmltVGV4dHVyZV0sXG4gICAgICAgIF0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnbWF0Q2FwVGV4dHVyZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFtcbiAgICAgICAgICA1LFxuICAgICAgICAgIHRleHR1cmVzW3RoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fU3BoZXJlQWRkXSxcbiAgICAgICAgICBzYW1wbGVyc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX1NwaGVyZUFkZF0sXG4gICAgICAgIF0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZW1pc3Npb25UZXh0dXJlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogW1xuICAgICAgICAgIDYsXG4gICAgICAgICAgdGV4dHVyZXNbdGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9FbWlzc2lvbk1hcF0sXG4gICAgICAgICAgc2FtcGxlcnNbdGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9FbWlzc2lvbk1hcF0sXG4gICAgICAgIF0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH1cbiAgICApO1xuXG4gICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2goXG4gICAgICB7XG4gICAgICAgIC8vIG51bWJlciA3IG9mIHRleHR1cmUgaXMgdGhlIGRhdGEgVGV4dHVyZVxuICAgICAgICBzZW1hbnRpYzogJ25vcm1hbFRleHR1cmUnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJELFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBbXG4gICAgICAgICAgOCxcbiAgICAgICAgICB0ZXh0dXJlc1t0aGlzLl9fdGV4dHVyZVByb3BlcnRpZXMuX0J1bXBNYXBdLFxuICAgICAgICAgIHNhbXBsZXJzW3RoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fQnVtcE1hcF0sXG4gICAgICAgIF0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH1cbiAgICAgIC8vIHtcbiAgICAgIC8vICAgc2VtYW50aWM6IE1Ub29uTWF0ZXJpYWxDb250ZW50Ll9VdkFuaW1NYXNrVGV4dHVyZSwgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgIC8vICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsIGlzSW50ZXJuYWxTZXR0aW5nOiBmYWxzZSwgdXBkYXRlSW50ZXJ2YWw6IFNoYWRlclZhcmlhYmxlVXBkYXRlSW50ZXJ2YWwuRXZlcnlUaW1lLFxuICAgICAgLy8gICBpbml0aWFsVmFsdWU6IFsxMCwgdGV4dHVyZVByb3BlcnRpZXNBcnJheS5fVXZBbmltTWFza1RleHR1cmVdLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAvLyB9XG4gICAgKTtcblxuICAgIGlmIChpc091dGxpbmUpIHtcbiAgICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKHtcbiAgICAgICAgc2VtYW50aWM6ICdvdXRsaW5lV2lkdGhUZXh0dXJlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFtcbiAgICAgICAgICA5LFxuICAgICAgICAgIHRleHR1cmVzW3RoaXMuX190ZXh0dXJlUHJvcGVydGllcy5fT3V0bGluZVdpZHRoVGV4dHVyZV0sXG4gICAgICAgICAgc2FtcGxlcnNbdGhpcy5fX3RleHR1cmVQcm9wZXJ0aWVzLl9PdXRsaW5lV2lkdGhUZXh0dXJlXSxcbiAgICAgICAgXSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0TWF0ZXJpYWxQYXJhbWV0ZXJzKG1hdGVyaWFsOiBNYXRlcmlhbCwgaXNPdXRsaW5lOiBib29sZWFuKSB7XG4gICAgaWYgKE1Ub29uTWF0ZXJpYWxDb250ZW50LnVzYWJsZUJsZW5kRXF1YXRpb25Nb2RlQWxwaGEgPT0gbnVsbCkge1xuICAgICAgTVRvb25NYXRlcmlhbENvbnRlbnQuX19pbml0aWFsaXplVXNhYmxlQmxlbmRFcXVhdGlvbk1vZGVBbHBoYSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9CbGVuZE1vZGUgIT09IDApIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fQmxlbmRNb2RlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fQUxQSEFURVNUX09OXFxuJztcbiAgICAgICAgICBtYXRlcmlhbC5hbHBoYU1vZGUgPSBBbHBoYU1vZGUuTWFzaztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRoaXMuX19kZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9BTFBIQUJMRU5EX09OXFxuJztcbiAgICAgICAgICBtYXRlcmlhbC5hbHBoYU1vZGUgPSBBbHBoYU1vZGUuQmxlbmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fQUxQSEFCTEVORF9PTlxcbic7XG4gICAgICAgICAgbWF0ZXJpYWwuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBibGVuZEVxdWF0aW9uTW9kZSA9IDMyNzc0OyAvLyBnbC5GVU5DX0FERFxuICAgICAgY29uc3QgYmxlbmRFcXVhdGlvbk1vZGVBbHBoYSA9IE1Ub29uTWF0ZXJpYWxDb250ZW50LnVzYWJsZUJsZW5kRXF1YXRpb25Nb2RlQWxwaGE7XG4gICAgICBjb25zdCBibGVuZEZ1bmNTcmNGYWN0b3IgPSBNVG9vbk1hdGVyaWFsQ29udGVudC51bml0eUJsZW5kRW51bUNvcnJlc3BvbmRlbmNlKFxuICAgICAgICB0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9TcmNCbGVuZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJsZW5kRnVuY0RzdEZhY3RvciA9IE1Ub29uTWF0ZXJpYWxDb250ZW50LnVuaXR5QmxlbmRFbnVtQ29ycmVzcG9uZGVuY2UoXG4gICAgICAgIHRoaXMuX19mbG9hdFByb3BlcnRpZXMuX0RzdEJsZW5kXG4gICAgICApO1xuXG4gICAgICBtYXRlcmlhbC5zZXRCbGVuZEVxdWF0aW9uTW9kZShcbiAgICAgICAgQmxlbmQuZnJvbShibGVuZEVxdWF0aW9uTW9kZSksXG4gICAgICAgIGJsZW5kRXF1YXRpb25Nb2RlQWxwaGEgIT0gbnVsbCA/IEJsZW5kLmZyb20oYmxlbmRFcXVhdGlvbk1vZGVBbHBoYSkgOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBtYXRlcmlhbC5zZXRCbGVuZEZ1bmNGYWN0b3IoQmxlbmQuZnJvbShibGVuZEZ1bmNTcmNGYWN0b3IpLCBCbGVuZC5mcm9tKGJsZW5kRnVuY0RzdEZhY3RvcikpO1xuICAgIH1cblxuICAgIGlmIChpc091dGxpbmUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fX2Zsb2F0UHJvcGVydGllcy5fT3V0bGluZUN1bGxNb2RlKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXRlcmlhbC5jdWxsRmFjZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgbWF0ZXJpYWwuY3VsbEZhY2UgPSB0cnVlO1xuICAgICAgICAgIG1hdGVyaWFsLmN1bGxGcm9udEZhY2VDQ1cgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIG1hdGVyaWFsLmN1bGxGYWNlID0gdHJ1ZTtcbiAgICAgICAgICBtYXRlcmlhbC5jdWxsRnJvbnRGYWNlQ0NXID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoICh0aGlzLl9fZmxvYXRQcm9wZXJ0aWVzLl9DdWxsTW9kZSkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF0ZXJpYWwuY3VsbEZhY2UgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIG1hdGVyaWFsLmN1bGxGYWNlID0gdHJ1ZTtcbiAgICAgICAgICBtYXRlcmlhbC5jdWxsRnJvbnRGYWNlQ0NXID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBtYXRlcmlhbC5jdWxsRmFjZSA9IHRydWU7XG4gICAgICAgICAgbWF0ZXJpYWwuY3VsbEZyb250RmFjZUNDVyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19pbml0aWFsaXplVXNhYmxlQmxlbmRFcXVhdGlvbk1vZGVBbHBoYSgpIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgTVRvb25NYXRlcmlhbENvbnRlbnQudXNhYmxlQmxlbmRFcXVhdGlvbk1vZGVBbHBoYSA9IDMyNzc2OyAvLyBnbC5NQVhcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgICAgY29uc3QgZ2x3ID0gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXI7XG4gICAgICBjb25zdCBnbCA9IGdsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgICBpZiAoZ2x3IS5pc1dlYkdMMikge1xuICAgICAgICBNVG9vbk1hdGVyaWFsQ29udGVudC51c2FibGVCbGVuZEVxdWF0aW9uTW9kZUFscGhhID0gZ2wuTUFYO1xuICAgICAgfSBlbHNlIGlmIChnbHchLndlYmdsMUV4dEJNKSB7XG4gICAgICAgIE1Ub29uTWF0ZXJpYWxDb250ZW50LnVzYWJsZUJsZW5kRXF1YXRpb25Nb2RlQWxwaGEgPSBnbHchLndlYmdsMUV4dEJNLk1BWF9FWFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBNVG9vbk1hdGVyaWFsQ29udGVudC51c2FibGVCbGVuZEVxdWF0aW9uTW9kZUFscGhhID0gZ2wuRlVOQ19BREQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9zZXRJbnRlcm5hbFNldHRpbmdQYXJhbWV0ZXJzVG9HcHVXZWJHcHUoe1xuICAgIG1hdGVyaWFsLFxuICAgIGFyZ3MsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR3B1O1xuICB9KSB7XG4gICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50RnJvbUNvbXBvbmVudFRJRChcbiAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElELFxuICAgICAgYXJncy5jYW1lcmFDb21wb25lbnRTaWRcbiAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ2NhbWVyYVVwJywgY2FtZXJhQ29tcG9uZW50LnVwSW5uZXIpO1xuXG4gICAgaWYgKHRoaXMuX19PdXRsaW5lV2lkdGhNb2RlSXNTY3JlZW4pIHtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignYXNwZWN0JywgY2FtZXJhQ29tcG9uZW50LmFzcGVjdCk7XG4gICAgfVxuICB9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICBtYXRlcmlhbCxcbiAgICBzaGFkZXJQcm9ncmFtLFxuICAgIGZpcnN0VGltZSxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0w7XG4gIH0pIHtcbiAgICBsZXQgY2FtZXJhQ29tcG9uZW50ID0gYXJncy5yZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudDtcbiAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgIGNhbWVyYUNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50KFxuICAgICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5zZXRVbmlmb3JtKSB7XG4gICAgICAvLy8gTWF0cmljZXNcbiAgICAgIHRoaXMuc2V0V29ybGRNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy53b3JsZE1hdHJpeCk7XG4gICAgICB0aGlzLnNldE5vcm1hbE1hdHJpeChzaGFkZXJQcm9ncmFtLCBhcmdzLm5vcm1hbE1hdHJpeCk7XG4gICAgICB0aGlzLnNldFZpZXdJbmZvKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgICAgdGhpcy5zZXRQcm9qZWN0aW9uKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuXG4gICAgICAvLy8gU2tpbm5pbmdcbiAgICAgIGNvbnN0IHNrZWxldGFsQ29tcG9uZW50ID0gYXJncy5lbnRpdHkudHJ5VG9HZXRTa2VsZXRhbCgpO1xuICAgICAgdGhpcy5zZXRTa2lubmluZyhzaGFkZXJQcm9ncmFtLCBhcmdzLnNldFVuaWZvcm0sIHNrZWxldGFsQ29tcG9uZW50KTtcblxuICAgICAgLy8gTGlnaHRzXG4gICAgICB0aGlzLnNldExpZ2h0c0luZm8oc2hhZGVyUHJvZ3JhbSwgYXJncy5saWdodENvbXBvbmVudHMsIG1hdGVyaWFsLCBhcmdzLnNldFVuaWZvcm0pO1xuXG4gICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtM2Z2KFxuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmNhbWVyYVVwLFxuICAgICAgICBjYW1lcmFDb21wb25lbnQudXBJbm5lci5fdlxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX19PdXRsaW5lV2lkdGhNb2RlSXNTY3JlZW4pIHtcbiAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTFmKChzaGFkZXJQcm9ncmFtIGFzIGFueSkuYXNwZWN0LCBjYW1lcmFDb21wb25lbnQuYXNwZWN0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdjYW1lcmFVcCcsIGNhbWVyYUNvbXBvbmVudC51cElubmVyKTtcblxuICAgICAgaWYgKHRoaXMuX19PdXRsaW5lV2lkdGhNb2RlSXNTY3JlZW4pIHtcbiAgICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCdhc3BlY3QnLCBjYW1lcmFDb21wb25lbnQuYXNwZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNb3JwaFxuICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBhcmdzLmVudGl0eS50cnlUb0dldEJsZW5kU2hhcGUoKTtcbiAgICB0aGlzLnNldE1vcnBoSW5mbyhzaGFkZXJQcm9ncmFtLCBhcmdzLmVudGl0eS5nZXRNZXNoKCksIGFyZ3MucHJpbWl0aXZlLCBibGVuZFNoYXBlQ29tcG9uZW50KTtcbiAgfVxuXG4gIHN0YXRpYyB1bml0eUJsZW5kRW51bUNvcnJlc3BvbmRlbmNlKGVudW1OdW1iZXI6IG51bWJlcikge1xuICAgIGxldCByZXN1bHQgPSBHTF9aRVJPIGFzIG51bWJlcjsgLy8gZ2wuWkVST1xuICAgIHN3aXRjaCAoZW51bU51bWJlcikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXN1bHQgPSBHTF9aRVJPO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmVzdWx0ID0gR0xfT05FO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmVzdWx0ID0gR0xfRFNUX0NPTE9SO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmVzdWx0ID0gR0xfU1JDX0NPTE9SO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmVzdWx0ID0gR0xfT05FX01JTlVTX0RTVF9DT0xPUjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJlc3VsdCA9IEdMX1NSQ19BTFBIQTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIHJlc3VsdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXN1bHQgPSBHTF9EU1RfQUxQSEE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICByZXN1bHQgPSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTpcbiAgICAgICAgcmVzdWx0ID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIHJlc3VsdCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBBYnN0cmFjdFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL21hdGgvU2NhbGFyJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0NsYXNzLCBTaGFkZXJTZW1hbnRpY3MgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9jb3JlL01hdGVyaWFsJztcbmltcG9ydCBNYXRDYXBTaGFkZXJWZXJ0ZXggZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvTWF0Q2FwU2hhZGVyL01hdENhcFNoYWRlci52ZXJ0JztcbmltcG9ydCBNYXRDYXBTaGFkZXJGcmFnbWVudCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9NYXRDYXBTaGFkZXIvTWF0Q2FwU2hhZGVyLmZyYWcnO1xuaW1wb3J0IHsgUmVuZGVyaW5nQXJnV2ViR0wgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBTYW1wbGVyIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvU2FtcGxlcic7XG5pbXBvcnQgeyBkdW1teUJsYWNrVGV4dHVyZSB9IGZyb20gJy4uL2NvcmUvRHVtbXlUZXh0dXJlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyBNYXRDYXBNYXRlcmlhbENvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB7XG4gIHN0YXRpYyBNYXRDYXBUZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnbWF0Q2FwVGV4dHVyZScgfSk7XG5cbiAgY29uc3RydWN0b3IoaXNTa2lubmluZzogYm9vbGVhbiwgdXJpPzogc3RyaW5nLCB0ZXh0dXJlPzogQWJzdHJhY3RUZXh0dXJlLCBzYW1wbGVyPzogU2FtcGxlcikge1xuICAgIHN1cGVyKFxuICAgICAgbnVsbCxcbiAgICAgICdNYXRDYXBTaGFkaW5nJyArIChpc1NraW5uaW5nID8gJytza2lubmluZycgOiAnJyksXG4gICAgICB7IGlzU2tpbm5pbmc6IGlzU2tpbm5pbmcgfSxcbiAgICAgIE1hdENhcFNoYWRlclZlcnRleCxcbiAgICAgIE1hdENhcFNoYWRlckZyYWdtZW50XG4gICAgKTtcblxuICAgIGxldCBtYXRDYXBUZXh0dXJlO1xuICAgIGlmICh0eXBlb2YgdXJpID09PSAnc3RyaW5nJykge1xuICAgICAgbWF0Q2FwVGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG4gICAgICAoYXN5bmMgZnVuY3Rpb24gKHVyaTogc3RyaW5nKSB7XG4gICAgICAgIG1hdENhcFRleHR1cmUuZ2VuZXJhdGVUZXh0dXJlRnJvbVVyaSh1cmksIHtcbiAgICAgICAgICB0eXBlOiBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IG1hdENhcFRleHR1cmUubG9hZEZyb21VcmxMYXp5KCk7XG4gICAgICB9KSh1cmkpO1xuICAgIH0gZWxzZSBpZiAodGV4dHVyZSBpbnN0YW5jZW9mIEFic3RyYWN0VGV4dHVyZSkge1xuICAgICAgbWF0Q2FwVGV4dHVyZSA9IHRleHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci53YXJuKCdubyBtYXRjYXAgdGV4dHVyZScpO1xuICAgICAgbWF0Q2FwVGV4dHVyZSA9IGR1bW15QmxhY2tUZXh0dXJlO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gW107XG5cbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkucHVzaCh7XG4gICAgICBzZW1hbnRpYzogJ3dpcmVmcmFtZScsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIDFdKSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMTAsXG4gICAgfSk7XG5cbiAgICAvLyBwb2ludCBjbG91ZFxuICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3BvaW50U2l6ZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDMwLjApLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMTAwLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdwb2ludERpc3RhbmNlQXR0ZW51YXRpb24nLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAuMCwgMC4xLCAwLjAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkucHVzaCh7XG4gICAgICBzZW1hbnRpYzogJ21hdENhcFRleHR1cmUnLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogWzAsIG1hdENhcFRleHR1cmUsIHNhbXBsZXJdLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KHNoYWRlclNlbWFudGljc0luZm9BcnJheSk7XG4gIH1cblxuICBfc2V0SW50ZXJuYWxTZXR0aW5nUGFyYW1ldGVyc1RvR3B1V2ViR0woe1xuICAgIG1hdGVyaWFsLFxuICAgIHNoYWRlclByb2dyYW0sXG4gICAgZmlyc3RUaW1lLFxuICAgIGFyZ3MsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICAgIGZpcnN0VGltZTogYm9vbGVhbjtcbiAgICBhcmdzOiBSZW5kZXJpbmdBcmdXZWJHTDtcbiAgfSkge1xuICAgIGlmIChhcmdzLnNldFVuaWZvcm0pIHtcbiAgICAgIHRoaXMuc2V0V29ybGRNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy53b3JsZE1hdHJpeCk7XG4gICAgICB0aGlzLnNldE5vcm1hbE1hdHJpeChzaGFkZXJQcm9ncmFtLCBhcmdzLm5vcm1hbE1hdHJpeCk7XG5cbiAgICAgIC8vLyBNYXRyaWNlc1xuICAgICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IGFyZ3MucmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQ7XG4gICAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgICAgQ2FtZXJhQ29tcG9uZW50LFxuICAgICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRWaWV3SW5mbyhzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcbiAgICAgIHRoaXMuc2V0UHJvamVjdGlvbihzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcblxuICAgICAgLy8vIFNraW5uaW5nXG4gICAgICBjb25zdCBza2VsZXRhbENvbXBvbmVudCA9IGFyZ3MuZW50aXR5LnRyeVRvR2V0U2tlbGV0YWwoKTtcbiAgICAgIHRoaXMuc2V0U2tpbm5pbmcoc2hhZGVyUHJvZ3JhbSwgYXJncy5zZXRVbmlmb3JtLCBza2VsZXRhbENvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBTaGFkZXJTZW1hbnRpY3MsXG4gIFNoYWRlclNlbWFudGljc0VudW0sXG4gIFNoYWRlclNlbWFudGljc0NsYXNzLFxufSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgU2hhZGluZ01vZGVsIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGluZ01vZGVsJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IFZlY3Rvck4gfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3Rvck4nO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbWF0aC9TY2FsYXInO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uLy4uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgQ291bnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVZlY3RvcjQnO1xuaW1wb3J0IFNoYWRvd01hcERlY29kZVNpbmdsZVNoYWRlclZlcnRleCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9TaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2luZ2xlU2hhZGVyL1NoYWRvd01hcERlY29kZUNsYXNzaWNTaW5nbGVTaGFkZXIudmVydCc7XG5pbXBvcnQgU2hhZG93TWFwRGVjb2RlU2luZ2xlU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NpbmdsZVNoYWRlci9TaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2luZ2xlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IHsgUmVuZGVyaW5nQXJnV2ViR0wgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBkdW1teUJsdWVUZXh0dXJlLCBkdW1teVdoaXRlVGV4dHVyZSB9IGZyb20gJy4uL2NvcmUvRHVtbXlUZXh0dXJlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dNYXBEZWNvZGVDbGFzc2ljTWF0ZXJpYWxDb250ZW50IGV4dGVuZHMgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQge1xuICBzdGF0aWMgU2hhZG93Q29sb3JGYWN0b3I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ3NoYWRvd0NvbG9yRmFjdG9yJyxcbiAgfSk7XG4gIHN0YXRpYyBTaGFkb3dBbHBoYTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnc2hhZG93QWxwaGEnLFxuICB9KTtcbiAgc3RhdGljIE5vblNoYWRvd0FscGhhOiBTaGFkZXJTZW1hbnRpY3NFbnVtID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdub25TaGFkb3dBbHBoYScsXG4gIH0pO1xuICBzdGF0aWMgQWxsb3dhYmxlRGVwdGhFcnJvcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnYWxsb3dhYmxlRGVwdGhFcnJvcicsXG4gIH0pO1xuICBzdGF0aWMgek5lYXJJbm5lciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ3pOZWFySW5uZXInIH0pO1xuICBzdGF0aWMgekZhcklubmVyID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnekZhcklubmVyJyB9KTtcbiAgc3RhdGljIERlYnVnQ29sb3JGYWN0b3I6IFNoYWRlclNlbWFudGljc0VudW0gPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ2RlYnVnQ29sb3JGYWN0b3InLFxuICB9KTtcbiAgc3RhdGljIERlcHRoVGV4dHVyZTogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnZGVwdGhUZXh0dXJlJyxcbiAgfSk7XG4gIHN0YXRpYyBJc1BvaW50TGlnaHQgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdpc1BvaW50TGlnaHQnIH0pO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fbGFzdFpOZWFyID0gMC4wO1xuICBwcml2YXRlIHN0YXRpYyBfX2xhc3RaRmFyID0gMC4wO1xuXG4gIHByaXZhdGUgX19lbmNvZGVkRGVwdGhSZW5kZXJQYXNzOiBSZW5kZXJQYXNzO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIFNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnRcbiAgICogQHBhcmFtIGlzTW9ycGhpbmcgVHJ1ZSBpZiB0aGUgbW9ycGhpbmcgaXMgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0gaXNTa2lubmluZyBUcnVlIGlmIHRoZSBza2VsZXRvbiBpcyB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSBpc0xpZ2h0aW5nIFRydWUgaWYgdGhlIGxpZ2h0aW5nIGlzIHRvIGJlIGFwcGxpZWQuIFdoZW4gaXNMaWdodGluZyBpcyBmYWxzZSwgdGhlIFNoYWRlciBkcmF3cyB0aGUgb3JpZ2luYWwgY29sb3Igb2YgdGhlIG1hdGVyaWFsLCBleGNlcHQgZm9yIHRoZSBzaGFkb3cgYXJlYS5cbiAgICogQHBhcmFtIGlzRGVidWdnaW5nIFRydWUgaWYgdGhlIHNoYWRlciBkaXNwbGF5cyB0aGUgRGVidWdDb2xvckZhY3RvciBjb2xvciBpbiBhcmVhcyBvdXRzaWRlIG9mIHRoZSBkZXB0aCBtYXAuXG4gICAqIEBwYXJhbSBjb2xvckF0dGFjaG1lbnRzTnVtYmVyIFRoZSBpbmRleCBvZiBjb2xvckF0dGFjaG1lbnQgaW4gYSBmcmFtZWJ1ZmZlci4gVGhlIGNvbG9yQXR0YWNobWVudCBtdXN0IGhhdmUgZGVwdGggaW5mb3JtYXRpb24gZHJhd24gYnkgdGhlIERlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50LlxuICAgKiBAcGFyYW0gZW5jb2RlZERlcHRoUmVuZGVyUGFzcyBUaGUgcmVuZGVyIHBhc3Mgd2hlcmUgdGhlIGRlcHRoIGluZm9ybWF0aW9uIGZyb20gdGhlIERlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50IGlzIGRyYXduIHRvIHRoZSBmcmFtZSBidWZmZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHtcbiAgICAgIGlzTW9ycGhpbmcsXG4gICAgICBpc1NraW5uaW5nLFxuICAgICAgaXNMaWdodGluZyxcbiAgICAgIGlzRGVidWdnaW5nLFxuICAgICAgY29sb3JBdHRhY2htZW50c051bWJlcixcbiAgICB9OiB7XG4gICAgICBpc01vcnBoaW5nOiBib29sZWFuO1xuICAgICAgaXNTa2lubmluZzogYm9vbGVhbjtcbiAgICAgIGlzTGlnaHRpbmc6IGJvb2xlYW47XG4gICAgICBpc0RlYnVnZ2luZzogYm9vbGVhbjtcbiAgICAgIGNvbG9yQXR0YWNobWVudHNOdW1iZXI6IENvdW50O1xuICAgIH0sXG4gICAgZW5jb2RlZERlcHRoUmVuZGVyUGFzczogUmVuZGVyUGFzc1xuICApIHtcbiAgICBzdXBlcihcbiAgICAgIG51bGwsXG4gICAgICAnU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRpbmcnICtcbiAgICAgICAgKGlzU2tpbm5pbmcgPyAnK3NraW5uaW5nJyA6ICcnKSArXG4gICAgICAgIChpc0xpZ2h0aW5nID8gJycgOiAnLWxpZ2h0aW5nJyksXG4gICAgICB7IGlzTW9ycGhpbmcsIGlzU2tpbm5pbmcsIGlzTGlnaHRpbmcgfSxcbiAgICAgIFNoYWRvd01hcERlY29kZVNpbmdsZVNoYWRlclZlcnRleCxcbiAgICAgIFNoYWRvd01hcERlY29kZVNpbmdsZVNoYWRlckZyYWdtZW50XG4gICAgKTtcblxuICAgIHRoaXMuX19lbmNvZGVkRGVwdGhSZW5kZXJQYXNzID0gZW5jb2RlZERlcHRoUmVuZGVyUGFzcztcblxuICAgIGNvbnN0IGVuY29kZWREZXB0aEZyYW1lYnVmZmVyID0gZW5jb2RlZERlcHRoUmVuZGVyUGFzcy5nZXRGcmFtZWJ1ZmZlcigpO1xuICAgIGlmIChlbmNvZGVkRGVwdGhGcmFtZWJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ2VuY29kZWREZXB0aFJlbmRlclBhc3MgZG9lcyBub3QgaGF2ZSBmcmFtZWJ1ZmZlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkRGVwdGhUZXh0dXJlID0gZW5jb2RlZERlcHRoRnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50c1tjb2xvckF0dGFjaG1lbnRzTnVtYmVyXTtcblxuICAgIGNvbnN0IHZpZXdwb3J0ID0gZW5jb2RlZERlcHRoUmVuZGVyUGFzcy5nZXRWaWV3cG9ydCgpIGFzIE11dGFibGVWZWN0b3I0O1xuICAgIHZpZXdwb3J0LnNldENvbXBvbmVudHMoMSwgMSwgdmlld3BvcnQueiAtIDEsIHZpZXdwb3J0LncgLSAxKTtcbiAgICBlbmNvZGVkRGVwdGhSZW5kZXJQYXNzLnNldFZpZXdwb3J0KHZpZXdwb3J0KTtcblxuICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gW1xuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2xpZ2h0Vmlld1Byb2plY3Rpb25NYXRyaXgnLFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5NYXQ0LFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogTXV0YWJsZU1hdHJpeDQ0Lnplcm8oKSxcbiAgICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzaGFkaW5nTW9kZWwnLFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoU2hhZGluZ01vZGVsLkNvbnN0YW50LmluZGV4KSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDMsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3NoaW5pbmVzcycsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDUpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnYWxsb3dhYmxlRGVwdGhFcnJvcicsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDAuMDAwMSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzaGFkb3dDb2xvckZhY3RvcicsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjQuZnJvbUNvcHlBcnJheShbMC41LCAwLjUsIDAuNSwgMV0pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGlmZnVzZUNvbG9yRmFjdG9yJyxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjNCxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yNC5mcm9tQ29weUFycmF5KFsxLCAxLCAxLCAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAyLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdpc1BvaW50TGlnaHQnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkJvb2wsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDEpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnd2lyZWZyYW1lJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnbm9ybWFsVGV4dHVyZScsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFswLCBkdW1teUJsdWVUZXh0dXJlXSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdkZXB0aFRleHR1cmUnLFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBbMCwgZW5jb2RlZERlcHRoVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGlmZnVzZUNvbG9yVGV4dHVyZScsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFsxLCBkdW1teVdoaXRlVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnek5lYXJJbm5lcicsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigwLjEpLFxuICAgICAgICBtaW46IDAuMDAwMSxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnekZhcklubmVyJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDEwMDAwLjApLFxuICAgICAgICBtaW46IDAuMDAwMSxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3BvaW50U2l6ZScsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDMwLjApLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMTAwLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdwb2ludERpc3RhbmNlQXR0ZW51YXRpb24nLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAuMCwgMC4xLCAwLjAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoaXNNb3JwaGluZykge1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBzZW1hbnRpYzogJ21vcnBoVGFyZ2V0TnVtYmVyJyxcbiAgICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkludCxcbiAgICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigwKSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcixcbiAgICAgICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VtYW50aWM6ICdkYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb24nLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgICAgIGFycmF5TGVuZ3RoOiBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcixcbiAgICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFZlY3Rvck4obmV3IEludDMyQXJyYXkoQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpKSxcbiAgICAgICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VtYW50aWM6ICdtb3JwaFdlaWdodHMnLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyQXJyYXksXG4gICAgICAgICAgYXJyYXlMZW5ndGg6IENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyLFxuICAgICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgRmxvYXQzMkFycmF5KENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyKSksXG4gICAgICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEZWJ1Z2dpbmcpIHtcbiAgICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKHtcbiAgICAgICAgc2VtYW50aWM6ICdkZWJ1Z0NvbG9yRmFjdG9yJyxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjNCxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yNC5mcm9tQ29weUFycmF5KFsxLCAwLCAwLCAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkoc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KTtcbiAgfVxuXG4gIF9zZXRJbnRlcm5hbFNldHRpbmdQYXJhbWV0ZXJzVG9HcHVXZWJHTCh7XG4gICAgbWF0ZXJpYWwsXG4gICAgc2hhZGVyUHJvZ3JhbSxcbiAgICBmaXJzdFRpbWUsXG4gICAgYXJncyxcbiAgfToge1xuICAgIG1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgZmlyc3RUaW1lOiBib29sZWFuO1xuICAgIGFyZ3M6IFJlbmRlcmluZ0FyZ1dlYkdMO1xuICB9KSB7XG4gICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IGFyZ3MucmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQ7XG4gICAgaWYgKGNhbWVyYUNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICBjYW1lcmFDb21wb25lbnQgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgICAgQ2FtZXJhQ29tcG9uZW50LFxuICAgICAgICBDYW1lcmFDb21wb25lbnQuY3VycmVudFxuICAgICAgKSBhcyBDYW1lcmFDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jb2RlZERlcHRoQ2FtZXJhQ29tcG9uZW50ID0gdGhpcy5fX2VuY29kZWREZXB0aFJlbmRlclBhc3NcbiAgICAgIC5jYW1lcmFDb21wb25lbnQgYXMgQ2FtZXJhQ29tcG9uZW50O1xuXG4gICAgaWYgKGFyZ3Muc2V0VW5pZm9ybSkge1xuICAgICAgdGhpcy5zZXRXb3JsZE1hdHJpeChzaGFkZXJQcm9ncmFtLCBhcmdzLndvcmxkTWF0cml4KTtcbiAgICAgIHRoaXMuc2V0Tm9ybWFsTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mubm9ybWFsTWF0cml4KTtcbiAgICAgIHRoaXMuc2V0Vmlld0luZm8oc2hhZGVyUHJvZ3JhbSwgY2FtZXJhQ29tcG9uZW50LCBhcmdzLmlzVnIsIGFyZ3MuZGlzcGxheUlkeCk7XG4gICAgICB0aGlzLnNldFByb2plY3Rpb24oc2hhZGVyUHJvZ3JhbSwgY2FtZXJhQ29tcG9uZW50LCBhcmdzLmlzVnIsIGFyZ3MuZGlzcGxheUlkeCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudC5fX2xhc3RaTmVhciAhPT0gZW5jb2RlZERlcHRoQ2FtZXJhQ29tcG9uZW50LnpOZWFySW5uZXJcbiAgICAgICkge1xuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMWYoXG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS56TmVhcklubmVyLFxuICAgICAgICAgIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56TmVhcklubmVyXG4gICAgICAgICk7XG4gICAgICAgIFNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQuX19sYXN0Wk5lYXIgPSBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQuek5lYXJJbm5lcjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBTaGFkb3dNYXBEZWNvZGVDbGFzc2ljTWF0ZXJpYWxDb250ZW50Ll9fbGFzdFpGYXIgIT09IGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56RmFySW5uZXJcbiAgICAgICkge1xuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMWYoXG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS56RmFySW5uZXIsXG4gICAgICAgICAgZW5jb2RlZERlcHRoQ2FtZXJhQ29tcG9uZW50LnpGYXJJbm5lclxuICAgICAgICApO1xuICAgICAgICBTaGFkb3dNYXBEZWNvZGVDbGFzc2ljTWF0ZXJpYWxDb250ZW50Ll9fbGFzdFpGYXIgPSBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQuekZhcklubmVyO1xuICAgICAgfVxuICAgICAgY29uc3QgX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgICBfX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldFVuaWZvcm1WYWx1ZShcbiAgICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgU2hhZGVyU2VtYW50aWNzLkxpZ2h0Vmlld1Byb2plY3Rpb25NYXRyaXguc3RyLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0aGlzLl9fZW5jb2RlZERlcHRoUmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQhLnZpZXdQcm9qZWN0aW9uTWF0cml4XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ3pOZWFySW5uZXInLCBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQuek5lYXJJbm5lcik7XG4gICAgICBtYXRlcmlhbC5zZXRQYXJhbWV0ZXIoJ3pGYXJJbm5lcicsIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56RmFySW5uZXIpO1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKFxuICAgICAgICAnbGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeCcsXG4gICAgICAgIHRoaXMuX19lbmNvZGVkRGVwdGhSZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudCEudmlld1Byb2plY3Rpb25NYXRyaXhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8vIFNraW5uaW5nXG4gICAgY29uc3Qgc2tlbGV0YWxDb21wb25lbnQgPSBhcmdzLmVudGl0eS50cnlUb0dldFNrZWxldGFsKCk7XG4gICAgdGhpcy5zZXRTa2lubmluZyhzaGFkZXJQcm9ncmFtLCBhcmdzLnNldFVuaWZvcm0sIHNrZWxldGFsQ29tcG9uZW50KTtcblxuICAgIC8vIExpZ2h0c1xuICAgIHRoaXMuc2V0TGlnaHRzSW5mbyhzaGFkZXJQcm9ncmFtLCBhcmdzLmxpZ2h0Q29tcG9uZW50cywgbWF0ZXJpYWwsIGFyZ3Muc2V0VW5pZm9ybSk7XG5cbiAgICAvLyBNb3JwaFxuICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBhcmdzLmVudGl0eS50cnlUb0dldEJsZW5kU2hhcGUoKTtcbiAgICB0aGlzLnNldE1vcnBoSW5mbyhzaGFkZXJQcm9ncmFtLCBhcmdzLmVudGl0eS5nZXRNZXNoKCksIGFyZ3MucHJpbWl0aXZlLCBibGVuZFNoYXBlQ29tcG9uZW50KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQWJzdHJhY3RUZXh0dXJlJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcywgU2hhZGVyU2VtYW50aWNzQ2xhc3MgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBWZWN0b3JOIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3JOJztcbmltcG9ydCBTeW50aGVzaXplSERSVGV4dHVyZVNoYWRlclZlcnRleCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci52ZXJ0JztcbmltcG9ydCBTeW50aGVzaXplSERSVGV4dHVyZVNoYWRlckZyYWdtZW50IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyL1N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyLmZyYWcnO1xuaW1wb3J0IFN5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGVyVmVydGV4V2ViR3B1IGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci52ZXJ0JztcbmltcG9ydCBTeW50aGVzaXplSERSVGV4dHVyZVNoYWRlckZyYWdtZW50V2ViR3B1IGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci9TeW50aGVzaXplSERSVGV4dHVyZVNoYWRlci5mcmFnJztcbmltcG9ydCB7IFJlbmRlcmluZ0FyZ1dlYkdMIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgZHVtbXlCbGFja1RleHR1cmUgfSBmcm9tICcuLi9jb3JlL0R1bW15VGV4dHVyZXMnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcblxuZXhwb3J0IGNsYXNzIFN5bnRoZXNpemVIZHJNYXRlcmlhbENvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB7XG4gIHN0YXRpYyBTeW50aGVzaXplQ29lZmZpY2llbnQgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ3N5bnRoZXNpemVDb2VmZmljaWVudCcsXG4gIH0pO1xuICBzdGF0aWMgVGFyZ2V0UmVnaW9uVGV4dHVyZSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAndGFyZ2V0UmVnaW9uVGV4dHVyZScsXG4gIH0pO1xuICBzdGF0aWMgU3ludGhlc2l6ZVRleHR1cmUwID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdzeW50aGVzaXplVGV4dHVyZTAnLFxuICB9KTtcbiAgc3RhdGljIFN5bnRoZXNpemVUZXh0dXJlMSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnc3ludGhlc2l6ZVRleHR1cmUxJyxcbiAgfSk7XG4gIHN0YXRpYyBTeW50aGVzaXplVGV4dHVyZTIgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ3N5bnRoZXNpemVUZXh0dXJlMicsXG4gIH0pO1xuICBzdGF0aWMgU3ludGhlc2l6ZVRleHR1cmUzID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdzeW50aGVzaXplVGV4dHVyZTMnLFxuICB9KTtcbiAgc3RhdGljIFN5bnRoZXNpemVUZXh0dXJlNCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnc3ludGhlc2l6ZVRleHR1cmU0JyxcbiAgfSk7XG4gIHN0YXRpYyBTeW50aGVzaXplVGV4dHVyZTUgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3Moe1xuICAgIHN0cjogJ3N5bnRoZXNpemVUZXh0dXJlNScsXG4gIH0pO1xuXG4gIHByaXZhdGUgdGV4dHVyZU51bWJlcjogQ291bnQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgbWF0ZXJpYWwgbm9kZSB1c2VzIGZvciB0aGUgZ2xhcmUgZWZmZWN0IGFuZCBzbyBvbi5cbiAgICpcbiAgICogSWYgdGhlIHRhcmdldFJlZ2lvblRleHR1cmUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHNoYWRlciBzeW50aGVzaXplcyBhbGwgdGhlXG4gICAqIHN5bnRoZXNpemVUZXh0dXJlcyB3aXRoIGFsbCB0aGUgcGl4ZWxzIHdlaWdodGVkIGJ5IHRoZSBzeW50aGVzaXplQ29lZmZpY2llbnQuXG4gICAqXG4gICAqIElmIHRoZSB0YXJnZXRSZWdpb25UZXh0dXJlIGlzIHNwZWNpZmllZCwgdGhlIHNoYWRlciBzeW50aGVzaXplcyBhbGwgdGhlXG4gICAqIHN5bnRoZXNpemVUZXh0dXJlcyB3aXRoIHdlaWdodHMgb25seSBmb3IgdGhlIG5vbi13aGl0ZSBwaXhlbHMgb2ZcbiAgICogdGFyZ2V0UmVnaW9uVGV4dHVyZSAod2hlcmUgdGhlIGNvbG9yIGlzIG5vdCAoMS4wLCAxLjAsIDEuMCwgMS4wKSkuIE9uIHRoZSBvdGhlclxuICAgKiBoYW5kLCBpbiB0aGUgd2hpdGUgYXJlYSwgdGhlIG91dHB1dCB2YWx1ZSBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWUgb2YgZWFjaFxuICAgKiBwaXhlbCBpbiBzeW50aGVzaXplVGV4dHVyZXNbMF0gYW5kIHN5bnRoZXNpemVDb2VmZmljaWVudFswXS5cbiAgICpcbiAgICogQHN5bnRoZXNpemVUZXh0dXJlcyBUZXh0dXJlcyB0byBiZSBzeW50aGVzaXplZC4gVGhlIHNoYWRlciBzdXBwb3J0cyB1cCB0byBzaXggdGV4dHVyZSBzeW50aGVzZXMuXG4gICAqIEB0YXJnZXRSZWdpb25UZXh0dXJlIFRleHR1cmUgdG8gc3BlY2lmeSB0aGUgYXJlYSB3aGVyZSB0aGUgdGV4dHVyZSB3aWxsIGJlIHN5bnRoZXNpemVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzeW50aGVzaXplVGV4dHVyZXM6IEFic3RyYWN0VGV4dHVyZVtdKSB7XG4gICAgc3VwZXIobnVsbCwgJ3N5bnRoZXNpemVIRFJUZXh0dXJlU2hhZGluZycsIHt9KTtcblxuICAgIHRoaXMudGV4dHVyZU51bWJlciA9IHN5bnRoZXNpemVUZXh0dXJlcy5sZW5ndGg7XG5cbiAgICBjb25zdCBzYW1wbGVyID0gbmV3IFNhbXBsZXIoe1xuICAgICAgd3JhcFM6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgICB3cmFwVDogVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZSxcbiAgICAgIG1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgIH0pO1xuICAgIHNhbXBsZXIuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzeW50aGVzaXplQ29lZmZpY2llbnQnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheSxcbiAgICAgICAgYXJyYXlMZW5ndGg6IDYsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoNikpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgICAgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3ludGhlc2l6ZVRleHR1cmUwJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzAsIHN5bnRoZXNpemVUZXh0dXJlc1swXSA/PyBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3ludGhlc2l6ZVRleHR1cmUxJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzEsIHN5bnRoZXNpemVUZXh0dXJlc1sxXSA/PyBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3ludGhlc2l6ZVRleHR1cmUyJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzIsIHN5bnRoZXNpemVUZXh0dXJlc1syXSA/PyBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3ludGhlc2l6ZVRleHR1cmUzJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzMsIHN5bnRoZXNpemVUZXh0dXJlc1szXSA/PyBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3ludGhlc2l6ZVRleHR1cmU0JyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzQsIHN5bnRoZXNpemVUZXh0dXJlc1s0XSA/PyBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3ludGhlc2l6ZVRleHR1cmU1JyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzUsIHN5bnRoZXNpemVUZXh0dXJlc1s1XSA/PyBkdW1teUJsYWNrVGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICB0aGlzLl9fdmVydGV4U2hhZGVyaXR5T2JqZWN0ID0gU3ludGhlc2l6ZUhEUlRleHR1cmVTaGFkZXJWZXJ0ZXhXZWJHcHU7XG4gICAgICB0aGlzLl9fcGl4ZWxTaGFkZXJpdHlPYmplY3QgPSBTeW50aGVzaXplSERSVGV4dHVyZVNoYWRlckZyYWdtZW50V2ViR3B1O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmVydGV4U2hhZGVyaXR5T2JqZWN0ID0gU3ludGhlc2l6ZUhEUlRleHR1cmVTaGFkZXJWZXJ0ZXg7XG4gICAgICB0aGlzLl9fcGl4ZWxTaGFkZXJpdHlPYmplY3QgPSBTeW50aGVzaXplSERSVGV4dHVyZVNoYWRlckZyYWdtZW50O1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KHNoYWRlclNlbWFudGljc0luZm9BcnJheSk7XG4gIH1cblxuICBfc2V0SW50ZXJuYWxTZXR0aW5nUGFyYW1ldGVyc1RvR3B1V2ViR0woe1xuICAgIG1hdGVyaWFsLFxuICAgIHNoYWRlclByb2dyYW0sXG4gICAgZmlyc3RUaW1lLFxuICAgIGFyZ3MsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICAgIGZpcnN0VGltZTogYm9vbGVhbjtcbiAgICBhcmdzOiBSZW5kZXJpbmdBcmdXZWJHTDtcbiAgfSkge1xuICAgIGlmIChhcmdzLnNldFVuaWZvcm0pIHtcbiAgICAgIHRoaXMuc2V0V29ybGRNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy53b3JsZE1hdHJpeCk7XG5cbiAgICAgIC8vLyBNYXRyaWNlc1xuICAgICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IGFyZ3MucmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQ7XG4gICAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgICAgQ2FtZXJhQ29tcG9uZW50LFxuICAgICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICAgICkgYXMgQ2FtZXJhQ29tcG9uZW50O1xuICAgICAgfVxuICAgICAgaWYgKGNhbWVyYUNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnNldFZpZXdJbmZvKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgICAgICB0aGlzLnNldFByb2plY3Rpb24oc2hhZGVyUHJvZ3JhbSwgY2FtZXJhQ29tcG9uZW50LCBhcmdzLmlzVnIsIGFyZ3MuZGlzcGxheUlkeCk7XG4gICAgICB9XG4gICAgfVxuICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0xZnYoXG4gICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnN5bnRoZXNpemVDb2VmZmljaWVudCxcbiAgICAgIG1hdGVyaWFsLmdldFBhcmFtZXRlcignc3ludGhlc2l6ZUNvZWZmaWNpZW50JykuX3ZcbiAgICApO1xuICB9XG5cbiAgZ2V0IHN5bnRoZXNpemVUZXh0dXJlTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRleHR1cmVOdW1iZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFNoYWRlclNlbWFudGljcyxcbiAgU2hhZGVyU2VtYW50aWNzRW51bSxcbiAgU2hhZGVyU2VtYW50aWNzQ2xhc3MsXG59IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBTaGFkaW5nTW9kZWwgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkaW5nTW9kZWwnO1xuaW1wb3J0IHsgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgVmVjdG9yTiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yTic7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL0NvbmZpZyc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi4vLi4vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IE11dGFibGVNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2hhZGVyVmVydGV4IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL1ZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRlci9WYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNTaGFkZXIudmVydCc7XG5pbXBvcnQgVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2hhZGVyRnJhZ21lbnQgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljU2hhZGVyL1ZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRlci5mcmFnJztcbmltcG9ydCB7IFJlbmRlcmluZ0FyZ1dlYkdMIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgZHVtbXlCbGFja1RleHR1cmUsIGR1bW15Qmx1ZVRleHR1cmUsIGR1bW15V2hpdGVUZXh0dXJlIH0gZnJvbSAnLi4vY29yZS9EdW1teVRleHR1cmVzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL21pc2MvTG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIFZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudCBleHRlbmRzIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50IHtcbiAgc3RhdGljIElzUG9pbnRMaWdodCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2lzUG9pbnRMaWdodCcgfSk7XG4gIHN0YXRpYyBEZXB0aFRleHR1cmUgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdkZXB0aFRleHR1cmUnIH0pO1xuICBzdGF0aWMgU3F1YXJlRGVwdGhUZXh0dXJlID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdzcXVhcmVEZXB0aFRleHR1cmUnLFxuICB9KTtcbiAgc3RhdGljIERlcHRoQWRqdXN0bWVudCA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7IHN0cjogJ2RlcHRoQWRqdXN0bWVudCcgfSk7XG4gIHN0YXRpYyBUZXh0dXJlRGVwdGhBZGp1c3RtZW50ID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICd0ZXh0dXJlRGVwdGhBZGp1c3RtZW50JyxcbiAgfSk7XG4gIHN0YXRpYyBNaW5pbXVtVmFyaWFuY2UgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdtaW5pbXVtVmFyaWFuY2UnIH0pO1xuICBzdGF0aWMgTGlnaHRCbGVlZGluZ1BhcmFtZXRlciA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnbGlnaHRCbGVlZGluZ1BhcmFtZXRlcicsXG4gIH0pO1xuICBzdGF0aWMgU2hhZG93Q29sb3IgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICdzaGFkb3dDb2xvcicgfSk7XG4gIHN0YXRpYyBBbGxvd2FibGVEZXB0aEVycm9yID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHtcbiAgICBzdHI6ICdhbGxvd2FibGVEZXB0aEVycm9yJyxcbiAgfSk7XG4gIHN0YXRpYyB6TmVhcklubmVyID0gbmV3IFNoYWRlclNlbWFudGljc0NsYXNzKHsgc3RyOiAnek5lYXJJbm5lcicgfSk7XG4gIHN0YXRpYyB6RmFySW5uZXIgPSBuZXcgU2hhZGVyU2VtYW50aWNzQ2xhc3MoeyBzdHI6ICd6RmFySW5uZXInIH0pO1xuICBzdGF0aWMgRGVidWdDb2xvckZhY3RvcjogU2hhZGVyU2VtYW50aWNzRW51bSA9IG5ldyBTaGFkZXJTZW1hbnRpY3NDbGFzcyh7XG4gICAgc3RyOiAnZGVidWdDb2xvckZhY3RvcicsXG4gIH0pO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fbGFzdFpOZWFyID0gMC4wO1xuICBwcml2YXRlIHN0YXRpYyBfX2xhc3RaRmFyID0gMC4wO1xuXG4gIHByaXZhdGUgX19kZXB0aENhbWVyYUNvbXBvbmVudD86IENhbWVyYUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBWYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnRcbiAgICogQHBhcmFtIGlzTW9ycGhpbmcgVHJ1ZSBpZiB0aGUgbW9ycGhpbmcgaXMgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0gaXNTa2lubmluZyBUcnVlIGlmIHRoZSBza2VsZXRvbiBpcyB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSBpc0xpZ2h0aW5nIFRydWUgaWYgdGhlIGxpZ2h0aW5nIGlzIHRvIGJlIGFwcGxpZWQuIFdoZW4gaXNMaWdodGluZyBpcyBmYWxzZSwgdGhlIFNoYWRlciBkcmF3cyB0aGUgb3JpZ2luYWwgY29sb3Igb2YgdGhlIG1hdGVyaWFsLCBleGNlcHQgZm9yIHRoZSBzaGFkb3cgYXJlYS5cbiAgICogQHBhcmFtIGlzRGVidWdnaW5nIFRydWUgaWYgdGhlIHNoYWRlciBkaXNwbGF5cyB0aGUgRGVidWdDb2xvckZhY3RvciBjb2xvciBpbiBhcmVhcyBvdXRzaWRlIG9mIHRoZSBkZXB0aCBtYXAuXG4gICAqXG4gICAqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSBjb2xvckF0dGFjaG1lbnRzTnVtYmVyIFRoZSBpbmRleCBvZiBjb2xvckF0dGFjaG1lbnQgaW4gYSBmcmFtZWJ1ZmZlci4gVGhlIGNvbG9yQXR0YWNobWVudCBtdXN0IGhhdmUgZGVwdGggaW5mb3JtYXRpb24gZHJhd24gYnkgdGhlIERlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50LlxuICAgKiBAcGFyYW0gZW5jb2RlZERlcHRoUmVuZGVyUGFzcyBUaGUgcmVuZGVyIHBhc3Mgd2hlcmUgdGhlIGRlcHRoIGluZm9ybWF0aW9uIGZyb20gdGhlIERlcHRoRW5jb2RlTWF0ZXJpYWxDb250ZW50IGlzIGRyYXduIHRvIHRoZSBmcmFtZSBidWZmZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHtcbiAgICAgIGlzTW9ycGhpbmcsXG4gICAgICBpc1NraW5uaW5nLFxuICAgICAgaXNMaWdodGluZyxcbiAgICAgIGlzRGVidWdnaW5nLFxuICAgICAgY29sb3JBdHRhY2htZW50c051bWJlckRlcHRoLFxuICAgICAgY29sb3JBdHRhY2htZW50c051bWJlclNxdWFyZURlcHRoLFxuICAgICAgZGVwdGhDYW1lcmFDb21wb25lbnQsXG4gICAgfToge1xuICAgICAgaXNNb3JwaGluZzogYm9vbGVhbjtcbiAgICAgIGlzU2tpbm5pbmc6IGJvb2xlYW47XG4gICAgICBpc0xpZ2h0aW5nOiBib29sZWFuO1xuICAgICAgaXNEZWJ1Z2dpbmc6IGJvb2xlYW47XG4gICAgICBjb2xvckF0dGFjaG1lbnRzTnVtYmVyRGVwdGg6IENvdW50O1xuICAgICAgY29sb3JBdHRhY2htZW50c051bWJlclNxdWFyZURlcHRoOiBDb3VudDtcbiAgICAgIGRlcHRoQ2FtZXJhQ29tcG9uZW50PzogQ2FtZXJhQ29tcG9uZW50O1xuICAgIH0sXG4gICAgZW5jb2RlZERlcHRoUmVuZGVyUGFzc2VzOiBSZW5kZXJQYXNzW11cbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBudWxsLFxuICAgICAgJ3ZhcmlhbmNlU2hhZG93TWFwRGVjb2RlU2hhZGluZycgK1xuICAgICAgICAoaXNNb3JwaGluZyA/ICcrbW9ycGhpbmcnIDogJycpICtcbiAgICAgICAgKGlzU2tpbm5pbmcgPyAnK3NraW5uaW5nJyA6ICcnKSArXG4gICAgICAgIChpc0xpZ2h0aW5nID8gJycgOiAnLWxpZ2h0aW5nJykgK1xuICAgICAgICAoaXNEZWJ1Z2dpbmcgPyAnJyA6ICcrZGVidWdnaW5nJyksXG4gICAgICB7IGlzTW9ycGhpbmcsIGlzU2tpbm5pbmcsIGlzTGlnaHRpbmcgfSxcbiAgICAgIFZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRlclZlcnRleCxcbiAgICAgIFZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY1NoYWRlckZyYWdtZW50XG4gICAgKTtcblxuICAgIGlmIChlbmNvZGVkRGVwdGhSZW5kZXJQYXNzZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ2ludmFsaWQgbGVuZ3RoIG9mIHJlbmRlclBhc3NlcycpO1xuICAgIH1cblxuICAgIGlmIChkZXB0aENhbWVyYUNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICBMb2dnZXIud2FybignbmVlZCB0byBzZXQgZGVwdGggY2FtZXJhIGNvbXBvbmVudCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fZGVwdGhDYW1lcmFDb21wb25lbnQgPSBkZXB0aENhbWVyYUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVuY29kZWREZXB0aFJlbmRlclBhc3Mgb2YgZW5jb2RlZERlcHRoUmVuZGVyUGFzc2VzKSB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IGVuY29kZWREZXB0aFJlbmRlclBhc3MuZ2V0Vmlld3BvcnQoKSBhcyBNdXRhYmxlVmVjdG9yNDtcbiAgICAgIHZpZXdwb3J0LnNldENvbXBvbmVudHMoMSwgMSwgdmlld3BvcnQueiAtIDEsIHZpZXdwb3J0LncgLSAxKTtcbiAgICAgIGVuY29kZWREZXB0aFJlbmRlclBhc3Muc2V0Vmlld3BvcnQodmlld3BvcnQpO1xuICAgIH1cblxuICAgIGxldCBkZXB0aFRleHR1cmU7XG4gICAgY29uc3QgZGVwdGhGcmFtZWJ1ZmZlciA9IGVuY29kZWREZXB0aFJlbmRlclBhc3Nlc1swXS5nZXRGcmFtZWJ1ZmZlcigpO1xuICAgIGlmIChkZXB0aEZyYW1lYnVmZmVyKSB7XG4gICAgICBkZXB0aFRleHR1cmUgPSBkZXB0aEZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHNbY29sb3JBdHRhY2htZW50c051bWJlckRlcHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLndhcm4oJ3JlbmRlclBhc3Mgb2YgZGVwdGggZG9lcyBub3QgaGF2ZSBmcmFtZWJ1ZmZlcicpO1xuICAgICAgZGVwdGhUZXh0dXJlID0gZHVtbXlCbGFja1RleHR1cmU7XG4gICAgfVxuXG4gICAgbGV0IHNxdWFyZURlcHRoVGV4dHVyZTtcbiAgICBjb25zdCBzcXVhcmVEZXB0aEZyYW1lYnVmZmVyID0gZW5jb2RlZERlcHRoUmVuZGVyUGFzc2VzWzFdLmdldEZyYW1lYnVmZmVyKCk7XG4gICAgaWYgKHNxdWFyZURlcHRoRnJhbWVidWZmZXIpIHtcbiAgICAgIHNxdWFyZURlcHRoVGV4dHVyZSA9XG4gICAgICAgIHNxdWFyZURlcHRoRnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50c1tjb2xvckF0dGFjaG1lbnRzTnVtYmVyU3F1YXJlRGVwdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIud2FybigncmVuZGVyUGFzcyBvZiBzcXVhcmUgZGVwdGggZG9lcyBub3QgaGF2ZSBmcmFtZWJ1ZmZlcicpO1xuICAgICAgc3F1YXJlRGVwdGhUZXh0dXJlID0gZHVtbXlCbGFja1RleHR1cmU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5OiBTaGFkZXJTZW1hbnRpY3NJbmZvW10gPSBbXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnbGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeCcsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLk1hdDQsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogTXV0YWJsZU1hdHJpeDQ0Lnplcm8oKSxcbiAgICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzaGFkaW5nTW9kZWwnLFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoU2hhZGluZ01vZGVsLkNvbnN0YW50LmluZGV4KSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDMsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3NoaW5pbmVzcycsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDUpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnYWxsb3dhYmxlRGVwdGhFcnJvcicsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDAuMDAwMSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdzaGFkb3dDb2xvcicsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjQuZnJvbUNvcHlBcnJheShbMC41LCAwLjUsIDAuNSwgMV0pLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGlmZnVzZUNvbG9yRmFjdG9yJyxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjNCxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yNC5mcm9tQ29weUFycmF5KFsxLCAxLCAxLCAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAyLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICd6TmVhcklubmVyJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDAuMSksXG4gICAgICAgIG1pbjogMC4wMDAxLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICd6RmFySW5uZXInLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMTAwMDAuMCksXG4gICAgICAgIG1pbjogMC4wMDAxLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICdpc1BvaW50TGlnaHQnLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkJvb2wsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDEpLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnd2lyZWZyYW1lJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAxXSksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGVwdGhBZGp1c3RtZW50JyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMC4wKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ2xpZ2h0QmxlZWRpbmdQYXJhbWV0ZXInLFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFNjYWxhci5mcm9tQ29weU51bWJlcigwLjApLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIG1heDogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnbWluaW11bVZhcmlhbmNlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMC4wMDAwMDAxKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VtYW50aWM6ICd0ZXh0dXJlRGVwdGhBZGp1c3RtZW50JyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMC4wKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ25vcm1hbFRleHR1cmUnLFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBbMCwgZHVtbXlCbHVlVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGlmZnVzZUNvbG9yVGV4dHVyZScsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFsxLCBkdW1teVdoaXRlVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnZGVwdGhUZXh0dXJlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzIsIGRlcHRoVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAnc3F1YXJlRGVwdGhUZXh0dXJlJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCxcbiAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogWzMsIHNxdWFyZURlcHRoVGV4dHVyZV0sXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIHBvaW50IGNsb3VkXG4gICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2goXG4gICAgICB7XG4gICAgICAgIHNlbWFudGljOiAncG9pbnRTaXplJyxcbiAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMzAuMCksXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiAxMDAsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZW1hbnRpYzogJ3BvaW50RGlzdGFuY2VBdHRlbnVhdGlvbicsXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzMsXG4gICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMC4wLCAwLjEsIDAuMDFdKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDEsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmIChpc01vcnBoaW5nKSB7XG4gICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIHNlbWFudGljOiAnbW9ycGhUYXJnZXROdW1iZXInLFxuICAgICAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuSW50LFxuICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgICAgICAgc29sb0RhdHVtOiB0cnVlLFxuICAgICAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDApLFxuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBtYXg6IENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyLFxuICAgICAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZW1hbnRpYzogJ2RhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbicsXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyQXJyYXksXG4gICAgICAgICAgYXJyYXlMZW5ndGg6IENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyLFxuICAgICAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICAgICAgICBzb2xvRGF0dW06IHRydWUsXG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBuZXcgVmVjdG9yTihuZXcgSW50MzJBcnJheShDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcikpLFxuICAgICAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZW1hbnRpYzogJ21vcnBoV2VpZ2h0cycsXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheSxcbiAgICAgICAgICBhcnJheUxlbmd0aDogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIsXG4gICAgICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgICAgICAgIHNvbG9EYXR1bTogdHJ1ZSxcbiAgICAgICAgICBpbml0aWFsVmFsdWU6IG5ldyBWZWN0b3JOKG5ldyBGbG9hdDMyQXJyYXkoQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpKSxcbiAgICAgICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlOiB0cnVlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0RlYnVnZ2luZykge1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2goe1xuICAgICAgICBzZW1hbnRpYzogJ2RlYnVnQ29sb3JGYWN0b3InLFxuICAgICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWM0LFxuICAgICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBWZWN0b3I0LmZyb21Db3B5QXJyYXkoWzEsIDAsIDAsIDFdKSxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBtYXg6IDIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNoYWRlclNlbWFudGljc0luZm9BcnJheShzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkpO1xuICB9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICBtYXRlcmlhbCxcbiAgICBzaGFkZXJQcm9ncmFtLFxuICAgIGZpcnN0VGltZSxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0w7XG4gIH0pIHtcbiAgICBsZXQgY2FtZXJhQ29tcG9uZW50ID0gYXJncy5yZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudDtcbiAgICBpZiAoY2FtZXJhQ29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgIGNhbWVyYUNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50KFxuICAgICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICAgIENhbWVyYUNvbXBvbmVudC5jdXJyZW50XG4gICAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQgPVxuICAgICAgdGhpcy5fX2RlcHRoQ2FtZXJhQ29tcG9uZW50ID8/IChhcmdzLnJlbmRlclBhc3MuY2FtZXJhQ29tcG9uZW50IGFzIENhbWVyYUNvbXBvbmVudCk7XG5cbiAgICBpZiAoYXJncy5zZXRVbmlmb3JtKSB7XG4gICAgICB0aGlzLnNldFdvcmxkTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mud29ybGRNYXRyaXgpO1xuICAgICAgdGhpcy5zZXROb3JtYWxNYXRyaXgoc2hhZGVyUHJvZ3JhbSwgYXJncy5ub3JtYWxNYXRyaXgpO1xuICAgICAgdGhpcy5zZXRWaWV3SW5mbyhzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcbiAgICAgIHRoaXMuc2V0UHJvamVjdGlvbihzaGFkZXJQcm9ncmFtLCBjYW1lcmFDb21wb25lbnQsIGFyZ3MuaXNWciwgYXJncy5kaXNwbGF5SWR4KTtcblxuICAgICAgaWYgKFxuICAgICAgICBWYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQuX19sYXN0Wk5lYXIgIT09XG4gICAgICAgIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56TmVhcklubmVyXG4gICAgICApIHtcbiAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTFmKFxuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuek5lYXJJbm5lcixcbiAgICAgICAgICBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQuek5lYXJJbm5lclxuICAgICAgICApO1xuICAgICAgICBWYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQuX19sYXN0Wk5lYXIgPVxuICAgICAgICAgIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56TmVhcklubmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIFZhcmlhbmNlU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudC5fX2xhc3RaRmFyICE9PVxuICAgICAgICBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQuekZhcklubmVyXG4gICAgICApIHtcbiAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTFmKFxuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuekZhcklubmVyLFxuICAgICAgICAgIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56RmFySW5uZXJcbiAgICAgICAgKTtcbiAgICAgICAgVmFyaWFuY2VTaGFkb3dNYXBEZWNvZGVDbGFzc2ljTWF0ZXJpYWxDb250ZW50Ll9fbGFzdFpGYXIgPVxuICAgICAgICAgIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC56RmFySW5uZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBfX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICAgIF9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VW5pZm9ybVZhbHVlKFxuICAgICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgICBTaGFkZXJTZW1hbnRpY3MuTGlnaHRWaWV3UHJvamVjdGlvbk1hdHJpeC5zdHIsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGVuY29kZWREZXB0aENhbWVyYUNvbXBvbmVudC52aWV3UHJvamVjdGlvbk1hdHJpeFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCd6TmVhcklubmVyJywgZW5jb2RlZERlcHRoQ2FtZXJhQ29tcG9uZW50LnpOZWFySW5uZXIpO1xuICAgICAgbWF0ZXJpYWwuc2V0UGFyYW1ldGVyKCd6RmFySW5uZXInLCBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQuekZhcklubmVyKTtcbiAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcihcbiAgICAgICAgJ2xpZ2h0Vmlld1Byb2plY3Rpb25NYXRyaXgnLFxuICAgICAgICBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQudmlld1Byb2plY3Rpb25NYXRyaXhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8vIFNraW5uaW5nXG4gICAgY29uc3Qgc2tlbGV0YWxDb21wb25lbnQgPSBhcmdzLmVudGl0eS50cnlUb0dldFNrZWxldGFsKCk7XG4gICAgdGhpcy5zZXRTa2lubmluZyhzaGFkZXJQcm9ncmFtLCBhcmdzLnNldFVuaWZvcm0sIHNrZWxldGFsQ29tcG9uZW50KTtcblxuICAgIC8vIExpZ2h0c1xuICAgIHRoaXMuc2V0TGlnaHRzSW5mbyhzaGFkZXJQcm9ncmFtLCBhcmdzLmxpZ2h0Q29tcG9uZW50cywgbWF0ZXJpYWwsIGFyZ3Muc2V0VW5pZm9ybSk7XG5cbiAgICAvLyBNb3JwaFxuICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBhcmdzLmVudGl0eS50cnlUb0dldEJsZW5kU2hhcGUoKTtcbiAgICB0aGlzLnNldE1vcnBoSW5mbyhzaGFkZXJQcm9ncmFtLCBhcmdzLmVudGl0eS5nZXRNZXNoKCksIGFyZ3MucHJpbWl0aXZlLCBibGVuZFNoYXBlQ29tcG9uZW50KTtcblxuICAgIGNvbnN0IF9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIF9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VW5pZm9ybVZhbHVlKFxuICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgIFNoYWRlclNlbWFudGljcy5MaWdodFZpZXdQcm9qZWN0aW9uTWF0cml4LnN0cixcbiAgICAgIHRydWUsXG4gICAgICBlbmNvZGVkRGVwdGhDYW1lcmFDb21wb25lbnQudmlld1Byb2plY3Rpb25NYXRyaXhcbiAgICApO1xuICB9XG5cbiAgc2V0IGRlcHRoQ2FtZXJhQ29tcG9uZW50KGRlcHRoQ2FtZXJhQ29tcG9uZW50OiBDYW1lcmFDb21wb25lbnQpIHtcbiAgICB0aGlzLl9fZGVwdGhDYW1lcmFDb21wb25lbnQgPSBkZXB0aENhbWVyYUNvbXBvbmVudDtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9Db2xvckdyYWRpbmdVc2luZ0xVVHNNYXRlcmlhbENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21NYXRlcmlhbENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXB0aEVuY29kZU1hdGVyaWFsQ29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdEhpZ2hMdW1pbmFuY2VNYXRlcmlhbENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnRpdHlVSURPdXRwdXRNYXRlcmlhbENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9GdXJuYWNlVGVzdE1hdGVyaWFsQ29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL01Ub29uTWF0ZXJpYWxDb250ZW50JztcbmV4cG9ydCAqIGZyb20gJy4vTWF0Q2FwTWF0ZXJpYWxDb250ZW50JztcbmV4cG9ydCAqIGZyb20gJy4vU2hhZG93TWFwRGVjb2RlQ2xhc3NpY01hdGVyaWFsQ29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL1N5bnRoZXNpemVIZHJNYXRlcmlhbENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9WYXJpYW5jZVNoYWRvd01hcERlY29kZUNsYXNzaWNNYXRlcmlhbENvbnRlbnQnO1xuIiwiaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuLi8uLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0VudW0sIFNoYWRlclNlbWFudGljc05hbWUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tbW9uU2hhZGVyUGFydCB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcnMvQ29tbW9uU2hhZGVyUGFydCc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IE1hdHJpeDQ0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0NCc7XG5pbXBvcnQgeyBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IFNrZWxldGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Ta2VsZXRhbC9Ta2VsZXRhbENvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3IyJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IE11dGFibGVNYXRyaXg0NCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL01lc2gvTWVzaENvbXBvbmVudCc7XG5pbXBvcnQgeyBQcmltaXRpdmUsIEF0dHJpYnV0ZXMgfSBmcm9tICcuLi8uLi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tICcuLi8uLi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlLCBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IEJsZW5kU2hhcGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0JsZW5kU2hhcGUvQmxlbmRTaGFwZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU2hhZGVyaXR5T2JqZWN0IH0gZnJvbSAnc2hhZGVyaXR5JztcbmltcG9ydCB7IEJvbmVEYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0JvbmVEYXRhVHlwZSc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBTaGFkZXJUeXBlRW51bSwgU2hhZGVyVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgTW9kdWxlTWFuYWdlciB9IGZyb20gJy4uLy4uL3N5c3RlbS9Nb2R1bGVNYW5hZ2VyJztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi8uLi8uLi94ci9tYWluJztcbmltcG9ydCB7IExpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9MaWdodC9MaWdodENvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWF0cml4MzMgfSBmcm9tICcuLi8uLi9tYXRoL0lNYXRyaXgnO1xuaW1wb3J0IHsgUmVuZGVyaW5nQXJnV2ViR0wsIFJlbmRlcmluZ0FyZ1dlYkdwdSB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvJztcbmltcG9ydCB7IFNoYWRlcml0eVV0aWxpdHlXZWJHUFUgfSBmcm9tICcuL1NoYWRlcml0eVV0aWxpdHlXZWJHUFUnO1xuaW1wb3J0IHsgU2hhZGVyaXR5VXRpbGl0eVdlYkdMIH0gZnJvbSAnLi9TaGFkZXJpdHlVdGlsaXR5V2ViR0wnO1xuXG50eXBlIE1hdGVyaWFsTm9kZVR5cGVOYW1lID0gc3RyaW5nO1xudHlwZSBNYXRlcmlhbE5vZGVVSUQgPSBudW1iZXI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCBleHRlbmRzIFJuT2JqZWN0IHtcbiAgcHJvdGVjdGVkIF9fc2VtYW50aWNzOiBTaGFkZXJTZW1hbnRpY3NJbmZvW10gPSBbXTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfX3NlbWFudGljc01hcDogTWFwPFxuICAgIE1hdGVyaWFsTm9kZVR5cGVOYW1lLFxuICAgIE1hcDxTaGFkZXJTZW1hbnRpY3NOYW1lLCBTaGFkZXJTZW1hbnRpY3NJbmZvPlxuICA+ID0gbmV3IE1hcCgpO1xuICBzdGF0aWMgbWF0ZXJpYWxOb2RlczogQWJzdHJhY3RNYXRlcmlhbENvbnRlbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX19zaGFkZXJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGlzU2luZ2xlT3BlcmF0aW9uID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBfX2dsPzogV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICBwcm90ZWN0ZWQgX19kZWZpbml0aW9ucyA9ICcnO1xuICBwcm90ZWN0ZWQgc3RhdGljIF9fdG1wX3ZlY3RvcjQgPSBNdXRhYmxlVmVjdG9yNC56ZXJvKCk7XG4gIHByb3RlY3RlZCBzdGF0aWMgX190bXBfdmVjdG9yMiA9IE11dGFibGVWZWN0b3IyLnplcm8oKTtcbiAgcHJpdmF0ZSBfX2lzTW9ycGhpbmc6IGJvb2xlYW47XG4gIHByaXZhdGUgX19pc1NraW5uaW5nOiBib29sZWFuO1xuICBwcml2YXRlIF9faXNMaWdodGluZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX19saWdodFBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoMCk7XG4gIHByaXZhdGUgc3RhdGljIF9fbGlnaHREaXJlY3Rpb25zID0gbmV3IEZsb2F0MzJBcnJheSgwKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19saWdodEludGVuc2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheSgwKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19saWdodFByb3BlcnRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KDApO1xuXG4gIHByb3RlY3RlZCBfX3ZlcnRleFNoYWRlcml0eU9iamVjdD86IFNoYWRlcml0eU9iamVjdDtcbiAgcHJvdGVjdGVkIF9fcGl4ZWxTaGFkZXJpdHlPYmplY3Q/OiBTaGFkZXJpdHlPYmplY3Q7XG4gIHB1YmxpYyBzaGFkZXJUeXBlOiBTaGFkZXJUeXBlRW51bSA9IFNoYWRlclR5cGUuVmVydGV4QW5kUGl4ZWxTaGFkZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2hhZGVyOiBDb21tb25TaGFkZXJQYXJ0IHwgbnVsbCxcbiAgICBzaGFkZXJGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICB7IGlzTW9ycGhpbmcgPSBmYWxzZSwgaXNTa2lubmluZyA9IGZhbHNlLCBpc0xpZ2h0aW5nID0gZmFsc2UgfSA9IHt9LFxuICAgIHZlcnRleFNoYWRlcml0eU9iamVjdD86IFNoYWRlcml0eU9iamVjdCxcbiAgICBwaXhlbFNoYWRlcml0eU9iamVjdD86IFNoYWRlcml0eU9iamVjdFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgPSBzaGFkZXJGdW5jdGlvbk5hbWU7XG5cbiAgICB0aGlzLl9faXNNb3JwaGluZyA9IGlzTW9ycGhpbmc7XG4gICAgdGhpcy5fX2lzU2tpbm5pbmcgPSBpc1NraW5uaW5nO1xuICAgIHRoaXMuX19pc0xpZ2h0aW5nID0gaXNMaWdodGluZztcblxuICAgIHRoaXMuX192ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSB2ZXJ0ZXhTaGFkZXJpdHlPYmplY3Q7XG4gICAgdGhpcy5fX3BpeGVsU2hhZGVyaXR5T2JqZWN0ID0gcGl4ZWxTaGFkZXJpdHlPYmplY3Q7XG5cbiAgICB0aGlzLl9fZGVmaW5pdGlvbnMgKz0gYCNkZWZpbmUgUk5fTUFURVJJQUxfTk9ERV9OQU1FICR7c2hhZGVyRnVuY3Rpb25OYW1lfVxcbmA7XG4gIH1cblxuICBnZXQgc2hhZGVyRnVuY3Rpb25OYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lO1xuICB9XG5cbiAgZ2V0IHZlcnRleFNoYWRlcml0eU9iamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3ZlcnRleFNoYWRlcml0eU9iamVjdDtcbiAgfVxuXG4gIGdldCBwaXhlbFNoYWRlcml0eU9iamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3BpeGVsU2hhZGVyaXR5T2JqZWN0O1xuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kZWZpbml0aW9ucztcbiAgfVxuXG4gIHN0YXRpYyBnZXRNYXRlcmlhbE5vZGUobWF0ZXJpYWxOb2RlVWlkOiBNYXRlcmlhbE5vZGVVSUQpIHtcbiAgICByZXR1cm4gQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQubWF0ZXJpYWxOb2Rlc1ttYXRlcmlhbE5vZGVVaWRdO1xuICB9XG5cbiAgZ2V0IF9zZW1hbnRpY3NJbmZvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zZW1hbnRpY3M7XG4gIH1cblxuICBnZXQgaXNTa2lubmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzU2tpbm5pbmc7XG4gIH1cbiAgZ2V0IGlzTW9ycGhpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc01vcnBoaW5nO1xuICB9XG4gIGdldCBpc0xpZ2h0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9faXNMaWdodGluZztcbiAgfVxuXG4gIHNldFNoYWRlclNlbWFudGljc0luZm9BcnJheShzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXSkge1xuICAgIGNvbnN0IGluZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gW107XG4gICAgZm9yIChjb25zdCBpbmZvIG9mIHNoYWRlclNlbWFudGljc0luZm9BcnJheSkge1xuICAgICAgaW5mb0FycmF5LnB1c2goaW5mbyk7XG4gICAgfVxuICAgIHRoaXMuX19zZW1hbnRpY3MgPSBpbmZvQXJyYXk7XG5cbiAgICBpZiAoIUFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fc2VtYW50aWNzTWFwLmhhcyh0aGlzLnNoYWRlckZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fc2VtYW50aWNzTWFwLnNldCh0aGlzLnNoYWRlckZ1bmN0aW9uTmFtZSwgbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgY29uc3QgbWFwID0gQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19zZW1hbnRpY3NNYXAuZ2V0KHRoaXMuc2hhZGVyRnVuY3Rpb25OYW1lKSE7XG4gICAgZm9yIChjb25zdCBzZW1hbnRpYyBvZiB0aGlzLl9fc2VtYW50aWNzKSB7XG4gICAgICBtYXAuc2V0KHNlbWFudGljLnNlbWFudGljLCBzZW1hbnRpYyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2hhZGVyU2VtYW50aWNJbmZvRnJvbU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFwID0gQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19zZW1hbnRpY3NNYXAuZ2V0KHRoaXMuc2hhZGVyRnVuY3Rpb25OYW1lKSE7XG4gICAgcmV0dXJuIG1hcC5nZXQobmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBCYXNpY0luZm8oXG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0wsXG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIGZpcnN0VGltZTogYm9vbGVhbixcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWwsXG4gICAgQ2FtZXJhQ29tcG9uZW50Q2xhc3M6IHR5cGVvZiBDYW1lcmFDb21wb25lbnRcbiAgKSB7XG4gICAgaWYgKGFyZ3Muc2V0VW5pZm9ybSkge1xuICAgICAgdGhpcy5zZXRXb3JsZE1hdHJpeChzaGFkZXJQcm9ncmFtLCBhcmdzLndvcmxkTWF0cml4KTtcbiAgICAgIHRoaXMuc2V0Tm9ybWFsTWF0cml4KHNoYWRlclByb2dyYW0sIGFyZ3Mubm9ybWFsTWF0cml4KTtcbiAgICAgIHRoaXMuc2V0SXNCaWxsYm9hcmQoc2hhZGVyUHJvZ3JhbSwgYXJncy5pc0JpbGxib2FyZCk7XG4gICAgICBpZiAoZmlyc3RUaW1lIHx8IGFyZ3MuaXNWcikge1xuICAgICAgICBsZXQgY2FtZXJhQ29tcG9uZW50ID0gYXJncy5yZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudDtcbiAgICAgICAgaWYgKGNhbWVyYUNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgY2FtZXJhQ29tcG9uZW50ID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnQoXG4gICAgICAgICAgICBDYW1lcmFDb21wb25lbnRDbGFzcyxcbiAgICAgICAgICAgIENhbWVyYUNvbXBvbmVudENsYXNzLmN1cnJlbnRcbiAgICAgICAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZpZXdJbmZvKHNoYWRlclByb2dyYW0sIGNhbWVyYUNvbXBvbmVudCwgYXJncy5pc1ZyLCBhcmdzLmRpc3BsYXlJZHgpO1xuICAgICAgICB0aGlzLnNldFByb2plY3Rpb24oc2hhZGVyUHJvZ3JhbSwgY2FtZXJhQ29tcG9uZW50LCBhcmdzLmlzVnIsIGFyZ3MuZGlzcGxheUlkeCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgIC8vIExpZ2h0c1xuICAgICAgICB0aGlzLnNldExpZ2h0c0luZm8oc2hhZGVyUHJvZ3JhbSwgYXJncy5saWdodENvbXBvbmVudHMsIG1hdGVyaWFsLCBhcmdzLnNldFVuaWZvcm0pO1xuICAgICAgICAvLy8gU2tpbm5pbmdcbiAgICAgICAgY29uc3Qgc2tlbGV0YWxDb21wb25lbnQgPSBhcmdzLmVudGl0eS50cnlUb0dldFNrZWxldGFsKCk7XG4gICAgICAgIHRoaXMuc2V0U2tpbm5pbmcoc2hhZGVyUHJvZ3JhbSwgYXJncy5zZXRVbmlmb3JtLCBza2VsZXRhbENvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9ycGhcbiAgICBjb25zdCBibGVuZFNoYXBlQ29tcG9uZW50ID0gYXJncy5lbnRpdHkudHJ5VG9HZXRCbGVuZFNoYXBlKCk7XG4gICAgdGhpcy5zZXRNb3JwaEluZm8oc2hhZGVyUHJvZ3JhbSwgYXJncy5lbnRpdHkuZ2V0TWVzaCgpLCBhcmdzLnByaW1pdGl2ZSwgYmxlbmRTaGFwZUNvbXBvbmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0V29ybGRNYXRyaXgoc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtLCB3b3JsZE1hdHJpeDogTWF0cml4NDQpIHtcbiAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtTWF0cml4NGZ2KFxuICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS53b3JsZE1hdHJpeCxcbiAgICAgIGZhbHNlLFxuICAgICAgd29ybGRNYXRyaXguX3ZcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldE5vcm1hbE1hdHJpeChzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW0sIG5vcm1hbE1hdHJpeDogSU1hdHJpeDMzKSB7XG4gICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybU1hdHJpeDNmdihcbiAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkubm9ybWFsTWF0cml4LFxuICAgICAgZmFsc2UsXG4gICAgICBub3JtYWxNYXRyaXguX3ZcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldElzQmlsbGJvYXJkKHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbSwgaXNCaWxsYm9hcmQ6IGJvb2xlYW4pIHtcbiAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMWkoKHNoYWRlclByb2dyYW0gYXMgYW55KS5pc0JpbGxib2FyZCwgaXNCaWxsYm9hcmQgPyAxIDogMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0Vmlld0luZm8oXG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIGNhbWVyYUNvbXBvbmVudDogQ2FtZXJhQ29tcG9uZW50LFxuICAgIGlzVnI6IGJvb2xlYW4sXG4gICAgZGlzcGxheUlkeDogbnVtYmVyXG4gICkge1xuICAgIGxldCB2aWV3TWF0cml4OiBNYXRyaXg0NDtcbiAgICBsZXQgY2FtZXJhUG9zaXRpb246IElWZWN0b3IzO1xuICAgIGlmIChpc1ZyKSB7XG4gICAgICBjb25zdCByblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSO1xuICAgICAgY29uc3Qgd2VieHJTeXN0ZW0gPSByblhSTW9kdWxlLldlYlhSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgICBpZiAod2VieHJTeXN0ZW0uaXNXZWJYUk1vZGUpIHtcbiAgICAgICAgdmlld01hdHJpeCA9IHdlYnhyU3lzdGVtLl9nZXRWaWV3TWF0cml4QXQoZGlzcGxheUlkeCk7XG4gICAgICAgIGNhbWVyYVBvc2l0aW9uID0gd2VieHJTeXN0ZW0uX2dldENhbWVyYVdvcmxkUG9zaXRpb25BdChkaXNwbGF5SWR4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNhbWVyYUNvbXBvbmVudCkge1xuICAgICAgY2FtZXJhUG9zaXRpb24gPSBjYW1lcmFDb21wb25lbnQud29ybGRQb3NpdGlvbjtcbiAgICAgIHZpZXdNYXRyaXggPSBjYW1lcmFDb21wb25lbnQudmlld01hdHJpeDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlld01hdHJpeCA9IE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpO1xuICAgICAgY2FtZXJhUG9zaXRpb24gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIDAsIDEwXSk7XG4gICAgfVxuXG4gICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybU1hdHJpeDRmdihcbiAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkudmlld01hdHJpeCxcbiAgICAgIGZhbHNlLFxuICAgICAgdmlld01hdHJpeCEuX3ZcbiAgICApO1xuICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0zZnYoKHNoYWRlclByb2dyYW0gYXMgYW55KS52aWV3UG9zaXRpb24sIGNhbWVyYVBvc2l0aW9uIS5fdik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0UHJvamVjdGlvbihcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW0sXG4gICAgY2FtZXJhQ29tcG9uZW50OiBDYW1lcmFDb21wb25lbnQsXG4gICAgaXNWcjogYm9vbGVhbixcbiAgICBkaXNwbGF5SWR4OiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IHByb2plY3Rpb25NYXRyaXg6IE1hdHJpeDQ0O1xuICAgIGlmIChpc1ZyKSB7XG4gICAgICBjb25zdCByblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSO1xuICAgICAgY29uc3Qgd2VieHJTeXN0ZW0gPSByblhSTW9kdWxlLldlYlhSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgICBpZiAod2VieHJTeXN0ZW0uaXNXZWJYUk1vZGUpIHtcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeCA9IHdlYnhyU3lzdGVtLl9nZXRQcm9qZWN0TWF0cml4QXQoZGlzcGxheUlkeCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYW1lcmFDb21wb25lbnQpIHtcbiAgICAgIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmFDb21wb25lbnQucHJvamVjdGlvbk1hdHJpeDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvamVjdGlvbk1hdHJpeCA9IE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpO1xuICAgIH1cbiAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtTWF0cml4NGZ2KFxuICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5wcm9qZWN0aW9uTWF0cml4LFxuICAgICAgZmFsc2UsXG4gICAgICBwcm9qZWN0aW9uTWF0cml4IS5fdlxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0U2tpbm5pbmcoXG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIHNldFVuaWZvcm06IGJvb2xlYW4sXG4gICAgc2tlbGV0YWxDb21wb25lbnQ/OiBTa2VsZXRhbENvbXBvbmVudFxuICApIHtcbiAgICBpZiAoIXRoaXMuX19pc1NraW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChza2VsZXRhbENvbXBvbmVudCkge1xuICAgICAgaWYgKHNldFVuaWZvcm0pIHtcbiAgICAgICAgaWYgKENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5NYXQ0M3gxKSB7XG4gICAgICAgICAgY29uc3Qgam9pbnRNYXRyaWNlc0FycmF5ID0gc2tlbGV0YWxDb21wb25lbnQuam9pbnRNYXRyaWNlc0FycmF5O1xuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm1NYXRyaXg0eDNmdihcbiAgICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuYm9uZU1hdHJpeCxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgam9pbnRNYXRyaWNlc0FycmF5XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyKSB7XG4gICAgICAgICAgY29uc3Qgam9pbnRUcmFuc2xhdGVQYWNrZWRRdWF0ID0gc2tlbGV0YWxDb21wb25lbnQuam9pbnRUcmFuc2xhdGVQYWNrZWRRdWF0O1xuICAgICAgICAgIGNvbnN0IGpvaW50U2NhbGVQYWNrZWRRdWF0ID0gc2tlbGV0YWxDb21wb25lbnQuam9pbnRTY2FsZVBhY2tlZFF1YXQ7XG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTRmdihcbiAgICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuYm9uZVRyYW5zbGF0ZVBhY2tlZFF1YXQsXG4gICAgICAgICAgICBqb2ludFRyYW5zbGF0ZVBhY2tlZFF1YXRcbiAgICAgICAgICApO1xuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm00ZnYoXG4gICAgICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmJvbmVTY2FsZVBhY2tlZFF1YXQsXG4gICAgICAgICAgICBqb2ludFNjYWxlUGFja2VkUXVhdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mk9sZCkge1xuICAgICAgICAgIGNvbnN0IGpvaW50UXVhdGVybmlvbkFycmF5ID0gc2tlbGV0YWxDb21wb25lbnQuam9pbnRRdWF0ZXJuaW9uQXJyYXk7XG4gICAgICAgICAgY29uc3Qgam9pbnRUcmFuc2xhdGVTY2FsZUFycmF5ID0gc2tlbGV0YWxDb21wb25lbnQuam9pbnRUcmFuc2xhdGVTY2FsZUFycmF5O1xuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm00ZnYoXG4gICAgICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmJvbmVRdWF0ZXJuaW9uLFxuICAgICAgICAgICAgam9pbnRRdWF0ZXJuaW9uQXJyYXlcbiAgICAgICAgICApO1xuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm00ZnYoXG4gICAgICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmJvbmVUcmFuc2xhdGVTY2FsZSxcbiAgICAgICAgICAgIGpvaW50VHJhbnNsYXRlU2NhbGVBcnJheVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4MSkge1xuICAgICAgICAgIGNvbnN0IGpvaW50Q29tcHJlc3NlZENodW5rID0gc2tlbGV0YWxDb21wb25lbnQuam9pbnRDb21wcmVzc2VkQ2h1bms7XG4gICAgICAgICAgY29uc3Qgam9pbnRDb21wcmVzc2VkSW5mbyA9IHNrZWxldGFsQ29tcG9uZW50LmpvaW50Q29tcHJlc3NlZEluZm87XG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTRmdihcbiAgICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuYm9uZUNvbXByZXNzZWRDaHVuayxcbiAgICAgICAgICAgIGpvaW50Q29tcHJlc3NlZENodW5rXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtNGZ2KFxuICAgICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5ib25lQ29tcHJlc3NlZEluZm8sXG4gICAgICAgICAgICBqb2ludENvbXByZXNzZWRJbmZvLl92XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0xaShcbiAgICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnNraW5uaW5nTW9kZSxcbiAgICAgICAgICBza2VsZXRhbENvbXBvbmVudC5jb21wb25lbnRTSURcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNldFVuaWZvcm0pIHtcbiAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTFpKChzaGFkZXJQcm9ncmFtIGFzIGFueSkuc2tpbm5pbmdNb2RlLCAtMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldExpZ2h0c0luZm8oXG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIGxpZ2h0Q29tcG9uZW50czogTGlnaHRDb21wb25lbnRbXSxcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWwsXG4gICAgc2V0VW5pZm9ybTogYm9vbGVhblxuICApIHtcbiAgICBpZiAoIXRoaXMuX19pc0xpZ2h0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXRVbmlmb3JtKSB7XG4gICAgICBjb25zdCBsaWdodENvbXBvbmVudHNFbmFibGVkID0gbGlnaHRDb21wb25lbnRzLmZpbHRlcihcbiAgICAgICAgKGxpZ2h0Q29tcG9uZW50KSA9PiBsaWdodENvbXBvbmVudC5lbmFibGVcbiAgICAgICk7XG5cbiAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0xaShcbiAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5saWdodE51bWJlcixcbiAgICAgICAgbGlnaHRDb21wb25lbnRzRW5hYmxlZCEubGVuZ3RoXG4gICAgICApO1xuXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihsaWdodENvbXBvbmVudHNFbmFibGVkIS5sZW5ndGgsIENvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyKTtcbiAgICAgIGlmIChBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0UG9zaXRpb25zLmxlbmd0aCAhPT0gMyAqIGxlbmd0aCkge1xuICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0UG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSgzICogbGVuZ3RoKTtcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodERpcmVjdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KDMgKiBsZW5ndGgpO1xuICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0SW50ZW5zaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KDMgKiBsZW5ndGgpO1xuICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0UHJvcGVydGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCAqIGxlbmd0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpZ2h0Q29tcG9uZW50c0VuYWJsZWQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID49IENvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzaGFkZXJQcm9ncmFtIGFzIGFueSkubGlnaHRQb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaWdodENvbXBvbmVudCA9IGxpZ2h0Q29tcG9uZW50c0VuYWJsZWQhW2ldO1xuICAgICAgICBjb25zdCBzY2VuZUdyYXBoQ29tcG9uZW50ID0gbGlnaHRDb21wb25lbnQuZW50aXR5LmdldFNjZW5lR3JhcGgoKSE7XG4gICAgICAgIGNvbnN0IHdvcmxkTGlnaHRQb3NpdGlvbiA9IHNjZW5lR3JhcGhDb21wb25lbnQud29ybGRQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgd29ybGRMaWdodERpcmVjdGlvbiA9IGxpZ2h0Q29tcG9uZW50LmRpcmVjdGlvbjtcbiAgICAgICAgY29uc3Qgd29ybGRMaWdodEludGVuc2l0eSA9IGxpZ2h0Q29tcG9uZW50LmludGVuc2l0eTtcblxuICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0UG9zaXRpb25zW2kgKiAzICsgMF0gPSB3b3JsZExpZ2h0UG9zaXRpb24ueDtcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodFBvc2l0aW9uc1tpICogMyArIDFdID0gd29ybGRMaWdodFBvc2l0aW9uLnk7XG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fbGlnaHRQb3NpdGlvbnNbaSAqIDMgKyAyXSA9IHdvcmxkTGlnaHRQb3NpdGlvbi56O1xuXG4gICAgICAgIGNvbnN0IGxpZ2h0QW5nbGVTY2FsZSA9XG4gICAgICAgICAgMS4wIC9cbiAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgIDAuMDAxLFxuICAgICAgICAgICAgTWF0aC5jb3MobGlnaHRDb21wb25lbnQuaW5uZXJDb25lQW5nbGUpIC0gTWF0aC5jb3MobGlnaHRDb21wb25lbnQub3V0ZXJDb25lQW5nbGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbGlnaHRBbmdsZU9mZnNldCA9IC1NYXRoLmNvcyhsaWdodENvbXBvbmVudC5vdXRlckNvbmVBbmdsZSkgKiBsaWdodEFuZ2xlU2NhbGU7XG5cbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodERpcmVjdGlvbnNbaSAqIDMgKyAwXSA9IHdvcmxkTGlnaHREaXJlY3Rpb24ueDtcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodERpcmVjdGlvbnNbaSAqIDMgKyAxXSA9IHdvcmxkTGlnaHREaXJlY3Rpb24ueTtcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodERpcmVjdGlvbnNbaSAqIDMgKyAyXSA9IHdvcmxkTGlnaHREaXJlY3Rpb24uejtcblxuICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0SW50ZW5zaXRpZXNbaSAqIDMgKyAwXSA9IHdvcmxkTGlnaHRJbnRlbnNpdHkueDtcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodEludGVuc2l0aWVzW2kgKiAzICsgMV0gPSB3b3JsZExpZ2h0SW50ZW5zaXR5Lnk7XG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fbGlnaHRJbnRlbnNpdGllc1tpICogMyArIDJdID0gd29ybGRMaWdodEludGVuc2l0eS56O1xuXG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fbGlnaHRQcm9wZXJ0aWVzW2kgKiA0ICsgMF0gPSAvLyBMaWdodFR5cGVcbiAgICAgICAgICBsaWdodENvbXBvbmVudC5lbmFibGUgPyBsaWdodENvbXBvbmVudC50eXBlLmluZGV4IDogLTE7XG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fbGlnaHRQcm9wZXJ0aWVzW2kgKiA0ICsgMV0gPSBsaWdodENvbXBvbmVudC5yYW5nZTsgLy8gTGlnaHQgUmFuZ2VcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodFByb3BlcnRpZXNbaSAqIDQgKyAyXSA9IGxpZ2h0QW5nbGVTY2FsZTtcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodFByb3BlcnRpZXNbaSAqIDQgKyAzXSA9IGxpZ2h0QW5nbGVPZmZzZXQ7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtM2Z2KFxuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkubGlnaHRQb3NpdGlvbixcbiAgICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0UG9zaXRpb25zXG4gICAgICAgICk7XG4gICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0zZnYoXG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5saWdodERpcmVjdGlvbixcbiAgICAgICAgICBBYnN0cmFjdE1hdGVyaWFsQ29udGVudC5fX2xpZ2h0RGlyZWN0aW9uc1xuICAgICAgICApO1xuICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtM2Z2KFxuICAgICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkubGlnaHRJbnRlbnNpdHksXG4gICAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19saWdodEludGVuc2l0aWVzXG4gICAgICAgICk7XG4gICAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm00ZnYoXG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5saWdodFByb3BlcnR5LFxuICAgICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fbGlnaHRQcm9wZXJ0aWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0TW9ycGhJbmZvKFxuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbSxcbiAgICBtZXNoQ29tcG9uZW50OiBNZXNoQ29tcG9uZW50LFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIGJsZW5kU2hhcGVDb21wb25lbnQ/OiBCbGVuZFNoYXBlQ29tcG9uZW50XG4gICkge1xuICAgIGlmICghdGhpcy5fX2lzTW9ycGhpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHByaW1pdGl2ZS50YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTFpKChzaGFkZXJQcm9ncmFtIGFzIGFueSkubW9ycGhUYXJnZXROdW1iZXIsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0xaShcbiAgICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkubW9ycGhUYXJnZXROdW1iZXIsXG4gICAgICBwcmltaXRpdmUudGFyZ2V0cy5sZW5ndGhcbiAgICApO1xuICAgIGNvbnN0IGRhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbk9mVGFyZ2V0czogbnVtYmVyW10gPSBwcmltaXRpdmUudGFyZ2V0cy5tYXAoXG4gICAgICAodGFyZ2V0OiBBdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc29yID0gdGFyZ2V0LmdldChWZXJ0ZXhBdHRyaWJ1dGUuUG9zaXRpb24uWFlaKSBhcyBBY2Nlc3NvcjtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG5cbiAgICAgICAgaWYgKFByb2Nlc3NBcHByb2FjaC5pc0RhdGFUZXh0dXJlQXBwcm9hY2goU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCkpIHtcbiAgICAgICAgICBvZmZzZXQgPSBDb25maWcudG90YWxTaXplT2ZHUFVTaGFkZXJEYXRhU3RvcmFnZUV4Y2VwdE1vcnBoRGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG9mZnNldCArIGFjY2Vzc29yLmJ5dGVPZmZzZXRJbkJ1ZmZlcikgLyA0IC8gNDtcbiAgICAgIH1cbiAgICApO1xuICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0xaXYoXG4gICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmRhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbixcbiAgICAgIGRhdGFUZXh0dXJlTW9ycGhPZmZzZXRQb3NpdGlvbk9mVGFyZ2V0c1xuICAgICk7XG4gICAgbGV0IHdlaWdodHM7XG4gICAgaWYgKGJsZW5kU2hhcGVDb21wb25lbnQhLndlaWdodHMubGVuZ3RoID4gMCkge1xuICAgICAgd2VpZ2h0cyA9IGJsZW5kU2hhcGVDb21wb25lbnQhLndlaWdodHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlaWdodHMgPSBuZXcgRmxvYXQzMkFycmF5KHByaW1pdGl2ZS50YXJnZXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuX2dsLnVuaWZvcm0xZnYoKHNoYWRlclByb2dyYW0gYXMgYW55KS5tb3JwaFdlaWdodHMsIHdlaWdodHMpO1xuICB9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICBtYXRlcmlhbCxcbiAgICBzaGFkZXJQcm9ncmFtLFxuICAgIGZpcnN0VGltZSxcbiAgICBhcmdzLFxuICB9OiB7XG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsO1xuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW47XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR0w7XG4gIH0pIHt9XG5cbiAgX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdwdSh7XG4gICAgbWF0ZXJpYWwsXG4gICAgYXJncyxcbiAgfToge1xuICAgIG1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgICBhcmdzOiBSZW5kZXJpbmdBcmdXZWJHcHU7XG4gIH0pIHt9XG5cbiAgZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9TaGFkZXJSZWZsZWN0aW9uKFxuICAgIHZlcnRleFNoYWRlcjogU2hhZGVyaXR5T2JqZWN0LFxuICAgIHBpeGVsU2hhZGVyOiBTaGFkZXJpdHlPYmplY3QsXG4gICAgdmVydGV4U2hhZGVyV2ViR3B1OiBTaGFkZXJpdHlPYmplY3QsXG4gICAgcGl4ZWxTaGFkZXJXZWJHcHU6IFNoYWRlcml0eU9iamVjdFxuICApIHtcbiAgICBsZXQgdmVydGV4U2hhZGVyRGF0YToge1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5OiBTaGFkZXJTZW1hbnRpY3NJbmZvW107XG4gICAgICBzaGFkZXJpdHlPYmplY3Q6IFNoYWRlcml0eU9iamVjdDtcbiAgICB9O1xuICAgIGxldCBwaXhlbFNoYWRlckRhdGE6IHtcbiAgICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdO1xuICAgICAgc2hhZGVyaXR5T2JqZWN0OiBTaGFkZXJpdHlPYmplY3Q7XG4gICAgfTtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgdmVydGV4U2hhZGVyRGF0YSA9IFNoYWRlcml0eVV0aWxpdHlXZWJHUFUuZ2V0U2hhZGVyRGF0YVJlZmxlY3Rpb24oXG4gICAgICAgIHZlcnRleFNoYWRlcldlYkdwdSEsXG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fc2VtYW50aWNzTWFwLmdldCh0aGlzLnNoYWRlckZ1bmN0aW9uTmFtZSlcbiAgICAgICk7XG4gICAgICBwaXhlbFNoYWRlckRhdGEgPSBTaGFkZXJpdHlVdGlsaXR5V2ViR1BVLmdldFNoYWRlckRhdGFSZWZsZWN0aW9uKFxuICAgICAgICBwaXhlbFNoYWRlcldlYkdwdSEsXG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fc2VtYW50aWNzTWFwLmdldCh0aGlzLnNoYWRlckZ1bmN0aW9uTmFtZSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX192ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSB2ZXJ0ZXhTaGFkZXJEYXRhLnNoYWRlcml0eU9iamVjdDtcbiAgICAgIHRoaXMuX19waXhlbFNoYWRlcml0eU9iamVjdCA9IHBpeGVsU2hhZGVyRGF0YS5zaGFkZXJpdHlPYmplY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnRleFNoYWRlckRhdGEgPSBTaGFkZXJpdHlVdGlsaXR5V2ViR0wuZ2V0U2hhZGVyRGF0YVJlZmxlY3Rpb24oXG4gICAgICAgIHZlcnRleFNoYWRlcixcbiAgICAgICAgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQuX19zZW1hbnRpY3NNYXAuZ2V0KHRoaXMuc2hhZGVyRnVuY3Rpb25OYW1lKVxuICAgICAgKTtcbiAgICAgIHBpeGVsU2hhZGVyRGF0YSA9IFNoYWRlcml0eVV0aWxpdHlXZWJHTC5nZXRTaGFkZXJEYXRhUmVmbGVjdGlvbihcbiAgICAgICAgcGl4ZWxTaGFkZXIsXG4gICAgICAgIEFic3RyYWN0TWF0ZXJpYWxDb250ZW50Ll9fc2VtYW50aWNzTWFwLmdldCh0aGlzLnNoYWRlckZ1bmN0aW9uTmFtZSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX192ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSB2ZXJ0ZXhTaGFkZXJEYXRhLnNoYWRlcml0eU9iamVjdDtcbiAgICAgIHRoaXMuX19waXhlbFNoYWRlcml0eU9iamVjdCA9IHBpeGVsU2hhZGVyRGF0YS5zaGFkZXJpdHlPYmplY3Q7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5OiBTaGFkZXJTZW1hbnRpY3NJbmZvW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgdmVydGV4U2hhZGVyU2VtYW50aWNzSW5mbyBvZiB2ZXJ0ZXhTaGFkZXJEYXRhLnNoYWRlclNlbWFudGljc0luZm9BcnJheSkge1xuICAgICAgdmVydGV4U2hhZGVyU2VtYW50aWNzSW5mby5zdGFnZSA9IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyO1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2godmVydGV4U2hhZGVyU2VtYW50aWNzSW5mbyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGl4ZWxTaGFkZXJTZW1hbnRpY3NJbmZvIG9mIHBpeGVsU2hhZGVyRGF0YS5zaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkpIHtcbiAgICAgIGNvbnN0IGZvdW5kU2hhZGVyU2VtYW50aWNzSW5mbyA9IHNoYWRlclNlbWFudGljc0luZm9BcnJheS5maW5kKFxuICAgICAgICAodmVydGV4SW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbykgPT4ge1xuICAgICAgICAgIGlmICh2ZXJ0ZXhJbmZvLnNlbWFudGljID09PSBwaXhlbFNoYWRlclNlbWFudGljc0luZm8uc2VtYW50aWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kU2hhZGVyU2VtYW50aWNzSW5mbykge1xuICAgICAgICBmb3VuZFNoYWRlclNlbWFudGljc0luZm8uc3RhZ2UgPSBTaGFkZXJUeXBlLlZlcnRleEFuZFBpeGVsU2hhZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGl4ZWxTaGFkZXJTZW1hbnRpY3NJbmZvLnN0YWdlID0gU2hhZGVyVHlwZS5QaXhlbFNoYWRlcjtcbiAgICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5LnB1c2gocGl4ZWxTaGFkZXJTZW1hbnRpY3NJbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRlclNlbWFudGljc0luZm9BcnJheTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuLi8uLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IENvbW1vblNoYWRlclBhcnQgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJzL0NvbW1vblNoYWRlclBhcnQnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4vU29ja2V0JztcbmltcG9ydCB7IFNoYWRlclR5cGUsIFNoYWRlclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyVHlwZSc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIFNoYWRlckF0dHJpYnV0ZU9yU2VtYW50aWNzT3JTdHJpbmcgPSBzdHJpbmcgfCBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIHwgU2hhZGVyU2VtYW50aWNzRW51bTtcblxuZXhwb3J0IHR5cGUgU2hhZGVyU29ja2V0ID0ge1xuICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW07XG4gIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICBuYW1lOiBTaGFkZXJBdHRyaWJ1dGVPclNlbWFudGljc09yU3RyaW5nO1xuICBpc0Nsb3NlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTaGFkZXJOb2RlVUlEID0gbnVtYmVyO1xudHlwZSBTaGFkZXJOb2RlSW5wdXRDb25uZWN0aW9uVHlwZSA9IHtcbiAgc2hhZGVyTm9kZVVpZDogbnVtYmVyO1xuICBvdXRwdXROYW1lT2ZQcmV2OiBzdHJpbmc7XG4gIGlucHV0TmFtZU9mVGhpczogc3RyaW5nO1xufTtcblxudHlwZSBTaGFkZXJTdGFnZSA9ICdOZXV0cmFsJyB8ICdWZXJ0ZXgnIHwgJ0ZyYWdtZW50JztcblxuLyoqXG4gKiBBYnN0cmFjdFNoYWRlck5vZGUgaXMgYSBhYnN0cmFjdCBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzaGFkZXIgbm9kZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2hhZGVyTm9kZSBleHRlbmRzIFJuT2JqZWN0IHtcbiAgc3RhdGljIF9zaGFkZXJOb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9fc2hhZGVyRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfX2lucHV0czogU29ja2V0PHN0cmluZywgQ29tcG9zaXRpb25UeXBlRW51bSwgQ29tcG9uZW50VHlwZUVudW0+W10gPSBbXTtcbiAgcHJvdGVjdGVkIF9fb3V0cHV0czogU29ja2V0PHN0cmluZywgQ29tcG9zaXRpb25UeXBlRW51bSwgQ29tcG9uZW50VHlwZUVudW0+W10gPSBbXTtcbiAgcHJvdGVjdGVkIF9faW5wdXRDb25uZWN0aW9uczogU2hhZGVyTm9kZUlucHV0Q29ubmVjdGlvblR5cGVbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyBfX2ludmFsaWRTaGFkZXJOb2RlQ291bnQgPSAtMTtcbiAgcHJvdGVjdGVkIF9fc2hhZGVyTm9kZVVpZDogU2hhZGVyTm9kZVVJRDtcbiAgcHJpdmF0ZSBfX2NvZGVHTFNMPzogc3RyaW5nO1xuICBwcml2YXRlIF9fY29kZVdHU0w/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfX2NvbW1vblBhcnQ/OiBDb21tb25TaGFkZXJQYXJ0O1xuICBwcml2YXRlIF9zaGFkZXJTdGFnZTogU2hhZGVyU3RhZ2UgPSAnTmV1dHJhbCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2hhZGVyTm9kZU5hbWU6IHN0cmluZyxcbiAgICBzaGFkZXI6IHtcbiAgICAgIGNvZGVHTFNMPzogc3RyaW5nO1xuICAgICAgY29kZVdHU0w/OiBzdHJpbmc7XG4gICAgICBjb21tb25QYXJ0PzogQ29tbW9uU2hhZGVyUGFydDtcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSA9IHNoYWRlck5vZGVOYW1lO1xuICAgIHRoaXMuX19jb2RlR0xTTCA9IHNoYWRlci5jb2RlR0xTTDtcbiAgICB0aGlzLl9fY29kZVdHU0wgPSBzaGFkZXIuY29kZVdHU0w7XG4gICAgdGhpcy5fX3NoYWRlck5vZGVVaWQgPSArK0Fic3RyYWN0U2hhZGVyTm9kZS5fX2ludmFsaWRTaGFkZXJOb2RlQ291bnQ7XG4gICAgQWJzdHJhY3RTaGFkZXJOb2RlLl9zaGFkZXJOb2Rlc1tBYnN0cmFjdFNoYWRlck5vZGUuX19pbnZhbGlkU2hhZGVyTm9kZUNvdW50XSA9IHRoaXM7XG4gICAgdGhpcy5fX2NvbW1vblBhcnQgPSBzaGFkZXIuY29tbW9uUGFydDtcbiAgfVxuXG4gIHNldFNoYWRlclN0YWdlKHN0YWdlOiBTaGFkZXJTdGFnZSkge1xuICAgIHRoaXMuX3NoYWRlclN0YWdlID0gc3RhZ2U7XG4gIH1cblxuICBnZXRTaGFkZXJTdGFnZSgpOiBTaGFkZXJTdGFnZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoYWRlclN0YWdlO1xuICB9XG5cbiAgc3RhdGljIGdldFNoYWRlck5vZGVCeVVpZCh1aWQ6IFNoYWRlck5vZGVVSUQpOiBBYnN0cmFjdFNoYWRlck5vZGUge1xuICAgIHJldHVybiBBYnN0cmFjdFNoYWRlck5vZGUuX3NoYWRlck5vZGVzW3VpZF07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbm9kZSBjb25uZWN0aW9uIHRvIHRoaXMgbm9kZSBhcyBhbiBpbnB1dC5cbiAgICogQHBhcmFtIGlucHV0U2hhZGVyTm9kZSAtIGEgc2hhZGVyIG5vZGUgdG8gY29ubmVjdCB0byB0aGlzIG5vZGUuXG4gICAqIEBwYXJhbSBvdXRwdXRTb2NrZXRPZklucHV0LSB0aGUgb3V0cHV0IHNvY2tldCBvZiB0aGUgaW5wdXRTaGFkZXJOb2RlLlxuICAgKiBAcGFyYW0gaW5wdXRTb2NrZXRPZlRoaXMgLSB0aGUgaW5wdXQgc29ja2V0IG9mIHRoaXMgbm9kZS5cbiAgICovXG4gIGFkZElucHV0Q29ubmVjdGlvbjxOIGV4dGVuZHMgQ29tcG9zaXRpb25UeXBlRW51bSwgVCBleHRlbmRzIENvbXBvbmVudFR5cGVFbnVtPihcbiAgICBpbnB1dFNoYWRlck5vZGU6IEFic3RyYWN0U2hhZGVyTm9kZSxcbiAgICBvdXRwdXRTb2NrZXRPZklucHV0OiBTb2NrZXQ8c3RyaW5nLCBOLCBUPixcbiAgICBpbnB1dFNvY2tldE9mVGhpczogU29ja2V0PHN0cmluZywgTiwgVD5cbiAgKTogdm9pZCB7XG4gICAgbGV0IGlkeCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX2lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX19pbnB1dHNbaV0ubmFtZSA9PT0gaW5wdXRTb2NrZXRPZlRoaXMubmFtZSkge1xuICAgICAgICBpZHggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9faW5wdXRDb25uZWN0aW9uc1tpZHhdID0ge1xuICAgICAgc2hhZGVyTm9kZVVpZDogaW5wdXRTaGFkZXJOb2RlLnNoYWRlck5vZGVVaWQsXG4gICAgICBvdXRwdXROYW1lT2ZQcmV2OiBvdXRwdXRTb2NrZXRPZklucHV0Lm5hbWUsXG4gICAgICBpbnB1dE5hbWVPZlRoaXM6IGlucHV0U29ja2V0T2ZUaGlzLm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIGdldCBzaGFkZXJGdW5jdGlvbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgfVxuXG4gIGdldFNoYWRlckZ1bmN0aW9uTmFtZURlcml2YXRpdmUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgfVxuXG4gIGdldFNoYWRlckNvZGUoc2hhZGVyU3RhZ2U6IFNoYWRlclR5cGVFbnVtKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fX2NvbW1vblBhcnQgIT0gbnVsbCkge1xuICAgICAgaWYgKHNoYWRlclN0YWdlID09PSBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2NvbW1vblBhcnQudmVydGV4U2hhZGVyRGVmaW5pdGlvbnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2NvbW1vblBhcnQucGl4ZWxTaGFkZXJEZWZpbml0aW9ucztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jb2RlV0dTTCE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2NvZGVHTFNMITtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2hhZGVyTm9kZVVpZCgpOiBTaGFkZXJOb2RlVUlEIHtcbiAgICByZXR1cm4gdGhpcy5fX3NoYWRlck5vZGVVaWQ7XG4gIH1cblxuICBnZXRJbnB1dChuYW1lOiBzdHJpbmcpOiBTb2NrZXQ8c3RyaW5nLCBDb21wb3NpdGlvblR5cGVFbnVtLCBDb21wb25lbnRUeXBlRW51bT4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdGhpcy5fX2lucHV0cykge1xuICAgICAgaWYgKGlucHV0Lm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgZ2V0SW5wdXRzKCk6IFNvY2tldDxzdHJpbmcsIENvbXBvc2l0aW9uVHlwZUVudW0sIENvbXBvbmVudFR5cGVFbnVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5fX2lucHV0cztcbiAgfVxuXG4gIGdldE91dHB1dChuYW1lOiBzdHJpbmcpOiBTb2NrZXQ8c3RyaW5nLCBDb21wb3NpdGlvblR5cGVFbnVtLCBDb21wb25lbnRUeXBlRW51bT4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIHRoaXMuX19vdXRwdXRzKSB7XG4gICAgICBpZiAob3V0cHV0Lm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGdldE91dHB1dHMoKTogU29ja2V0PHN0cmluZywgQ29tcG9zaXRpb25UeXBlRW51bSwgQ29tcG9uZW50VHlwZUVudW0+W10ge1xuICAgIHJldHVybiB0aGlzLl9fb3V0cHV0cztcbiAgfVxuXG4gIGdldCBpbnB1dENvbm5lY3Rpb25zKCk6IFNoYWRlck5vZGVJbnB1dENvbm5lY3Rpb25UeXBlW10ge1xuICAgIHJldHVybiB0aGlzLl9faW5wdXRDb25uZWN0aW9ucztcbiAgfVxuXG4gIG1ha2VDYWxsU3RhdGVtZW50KGk6IG51bWJlciwgc2hhZGVyTm9kZTogQWJzdHJhY3RTaGFkZXJOb2RlLFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLCB2YXJJbnB1dE5hbWVzOiBzdHJpbmdbXVtdLCB2YXJPdXRwdXROYW1lczogc3RyaW5nW11bXSk6IHN0cmluZyB7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGNvbnN0IHZhck5hbWVzID0gdmFySW5wdXROYW1lc1tpXS5jb25jYXQodmFyT3V0cHV0TmFtZXNbaV0pO1xuICAgIGlmIChcbiAgICAgIHNoYWRlck5vZGUuZ2V0SW5wdXRzKCkubGVuZ3RoID09PSB2YXJJbnB1dE5hbWVzW2ldLmxlbmd0aCAmJlxuICAgICAgc2hhZGVyTm9kZS5nZXRPdXRwdXRzKCkubGVuZ3RoID09PSB2YXJPdXRwdXROYW1lc1tpXS5sZW5ndGhcbiAgICApIHtcbiAgICAgIGxldCByb3dTdHIgPSAnJztcbiAgICAgIGlmICh2YXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIENhbGwgbm9kZSBmdW5jdGlvbnNcbiAgICAgICAgcm93U3RyICs9IGAke2Z1bmN0aW9uTmFtZX0oYDtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB2YXJOYW1lcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGNvbnN0IHZhck5hbWUgPSB2YXJOYW1lc1trXTtcbiAgICAgICAgICBpZiAodmFyTmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGsgIT09IDApIHtcbiAgICAgICAgICAgIHJvd1N0ciArPSAnLCAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVICYmXG4gICAgICAgICAgICBrID49IHZhcklucHV0TmFtZXNbaV0ubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByb3dTdHIgKz0gJyYnO1xuICAgICAgICAgIH1cbiAgICAgICAgICByb3dTdHIgKz0gdmFyTmFtZXNba107XG4gICAgICAgIH1cbiAgICAgICAgcm93U3RyICs9ICcpO1xcbic7XG4gICAgICB9XG5cbiAgICAgIHN0ciArPSByb3dTdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUnO1xuXG5leHBvcnQgY29uc3QgZHVtbXlXaGl0ZVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuZXhwb3J0IGNvbnN0IGR1bW15Qmx1ZVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuZXhwb3J0IGNvbnN0IGR1bW15QmxhY2tUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcbmV4cG9ydCBjb25zdCBkdW1teUJsYWNrQ3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcbmV4cG9ydCBjb25zdCBzaGVlbkx1dFRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuZXhwb3J0IGNvbnN0IGR1bW15U1JHQkdyYXlUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcbmV4cG9ydCBjb25zdCBkdW1teUFuaXNvdHJvcHlUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXREZWZhdWx0VGV4dHVyZXMoKSB7XG4gIGlmIChkdW1teVdoaXRlVGV4dHVyZS5pc1RleHR1cmVSZWFkeSkge1xuICAgIHJldHVybjtcbiAgfVxuICBkdW1teVdoaXRlVGV4dHVyZS50cnlUb1NldFVuaXF1ZU5hbWUoJ2R1bW15V2hpdGVUZXh0dXJlJywgdHJ1ZSk7XG4gIGR1bW15Qmx1ZVRleHR1cmUudHJ5VG9TZXRVbmlxdWVOYW1lKCdkdW1teUJsdWVUZXh0dXJlJywgdHJ1ZSk7XG4gIGR1bW15QmxhY2tUZXh0dXJlLnRyeVRvU2V0VW5pcXVlTmFtZSgnZHVtbXlCbGFja1RleHR1cmUnLCB0cnVlKTtcbiAgZHVtbXlCbGFja0N1YmVUZXh0dXJlLnRyeVRvU2V0VW5pcXVlTmFtZSgnZHVtbXlCbGFja0N1YmVUZXh0dXJlJywgdHJ1ZSk7XG4gIHNoZWVuTHV0VGV4dHVyZS50cnlUb1NldFVuaXF1ZU5hbWUoJ3NoZWVuTHV0VGV4dHVyZScsIHRydWUpO1xuICBkdW1teVNSR0JHcmF5VGV4dHVyZS50cnlUb1NldFVuaXF1ZU5hbWUoJ2R1bW15U1JHQkdyYXlUZXh0dXJlJywgdHJ1ZSk7XG4gIGR1bW15QW5pc290cm9weVRleHR1cmUudHJ5VG9TZXRVbmlxdWVOYW1lKCdkdW1teUFuaXNvdHJvcHlUZXh0dXJlJywgdHJ1ZSk7XG5cbiAgZHVtbXlXaGl0ZVRleHR1cmUuZ2VuZXJhdGUxeDFUZXh0dXJlRnJvbSgpO1xuICBkdW1teUJsdWVUZXh0dXJlLmdlbmVyYXRlMXgxVGV4dHVyZUZyb20oJ3JnYmEoMTI3LjUsIDEyNy41LCAyNTUsIDEpJyk7XG4gIGR1bW15QmxhY2tUZXh0dXJlLmdlbmVyYXRlMXgxVGV4dHVyZUZyb20oJ3JnYmEoMCwgMCwgMCwgMSknKTtcbiAgZHVtbXlCbGFja0N1YmVUZXh0dXJlLmxvYWQxeDFUZXh0dXJlKCdyZ2JhKDAsIDAsIDAsIDEpJyk7XG4gIGF3YWl0IHNoZWVuTHV0VGV4dHVyZS5nZW5lcmF0ZVNoZWVuTHV0VGV4dHVyZUZyb21EYXRhVXJpKCk7XG4gIGR1bW15U1JHQkdyYXlUZXh0dXJlLmdlbmVyYXRlMXgxVGV4dHVyZUZyb20oJ3JnYmEoMTg2LCAxODYsIDE4NiwgMSknKTtcbiAgZHVtbXlBbmlzb3Ryb3B5VGV4dHVyZS5nZW5lcmF0ZTF4MVRleHR1cmVGcm9tKCdyZ2JhKDI1NSwgMTI3LjUsIDI1NSwgMSknKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRUZXh0dXJlcyA9IHtcbiAgZHVtbXlXaGl0ZVRleHR1cmUsXG4gIGR1bW15Qmx1ZVRleHR1cmUsXG4gIGR1bW15QmxhY2tUZXh0dXJlLFxuICBkdW1teUJsYWNrQ3ViZVRleHR1cmUsXG4gIHNoZWVuTHV0VGV4dHVyZSxcbiAgZHVtbXlTUkdCR3JheVRleHR1cmUsXG4gIGR1bW15QW5pc290cm9weVRleHR1cmUsXG59O1xuIiwiaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuLi8uLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IEFscGhhTW9kZSwgQWxwaGFNb2RlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0FscGhhTW9kZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4vQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHtcbiAgU2hhZGVyU2VtYW50aWNzRW51bSxcbiAgU2hhZGVyU2VtYW50aWNzLFxuICBTaGFkZXJTZW1hbnRpY3NJbmRleCxcbiAgZ2V0U2hhZGVyUHJvcGVydHlGdW5jLFxuICBfZ2V0UHJvcGVydHlJbmRleDIsXG4gIFNoYWRlclNlbWFudGljc05hbWUsXG59IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgTWF0aENsYXNzVXRpbCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aENsYXNzVXRpbCc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQWJzdHJhY3RUZXh0dXJlJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7XG4gIEluZGV4LFxuICBDR0FQSVJlc291cmNlSGFuZGxlLFxuICBQcmltaXRpdmVVSUQsXG4gIE1hdGVyaWFsU0lELFxuICBNYXRlcmlhbFRJRCxcbiAgTWF0ZXJpYWxVSUQsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IEdsb2JhbERhdGFSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vY29yZS9HbG9iYWxEYXRhUmVwb3NpdG9yeSc7XG5pbXBvcnQgdHlwZSB7IFNoYWRlclNvdXJjZXMgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9XZWJHTFN0cmF0ZWd5JztcbmltcG9ydCB0eXBlIHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB0eXBlIHsgUmVuZGVyaW5nQXJnV2ViR0wsIFJlbmRlcmluZ0FyZ1dlYkdwdSB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8sIFRleHR1cmVQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBNYXRlcmlhbFR5cGVOYW1lLCBTaGFkZXJWYXJpYWJsZSB9IGZyb20gJy4vTWF0ZXJpYWxUeXBlcyc7XG5pbXBvcnQgeyBTYW1wbGVyIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvU2FtcGxlcic7XG5pbXBvcnQgeyBCbGVuZCwgQmxlbmRFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQmxlbmQnO1xuaW1wb3J0IHtcbiAgX2NyZWF0ZVByb2dyYW1Bc1NpbmdsZU9wZXJhdGlvbldlYkdMLFxuICBfY3JlYXRlUHJvZ3JhbUFzU2luZ2xlT3BlcmF0aW9uQnlVcGRhdGVkU291cmNlcyxcbiAgX2dldEF0dHJpYnV0ZUluZm8sXG4gIF9vdXRwdXRWZXJ0ZXhBdHRyaWJ1dGVCaW5kaW5nSW5mbyxcbiAgX3NldHVwR2xvYmFsU2hhZGVyRGVmaW5pdGlvbldlYkdMLFxuICBfY3JlYXRlUHJvZ3JhbUFzU2luZ2xlT3BlcmF0aW9uV2ViR3B1LFxufSBmcm9tICcuL1NoYWRlckhhbmRsZXInO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzJztcbmltcG9ydCB0eXBlIHsgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9XZWJHTFJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9taXNjL0xvZ2dlcic7XG5cbnR5cGUgUHJpbWl0aXZlRmluZ2VyUHJpbnQgPSBzdHJpbmc7XG5cbi8qKlxuICogVGhlIG1hdGVyaWFsIGNsYXNzLlxuICogVGhpcyBjbGFzcyBoYXMgb25lIG9yIG1vcmUgbWF0ZXJpYWwgbm9kZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRlcmlhbCBleHRlbmRzIFJuT2JqZWN0IHtcbiAgLy8gSW50ZXJuYWwgUmVzb3VyY2VzXG4gIF9fbWF0ZXJpYWxUeXBlTmFtZTogTWF0ZXJpYWxUeXBlTmFtZTtcbiAgX21hdGVyaWFsQ29udGVudDogQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQ7XG4gIF9hbGxGaWVsZFZhcmlhYmxlczogTWFwPFNoYWRlclNlbWFudGljc05hbWUsIFNoYWRlclZhcmlhYmxlPiA9IG5ldyBNYXAoKTtcbiAgX2F1dG9GaWVsZFZhcmlhYmxlc09ubHk6IE1hcDxTaGFkZXJTZW1hbnRpY3NOYW1lLCBTaGFkZXJWYXJpYWJsZT4gPSBuZXcgTWFwKCk7XG4gIF9hbGxGaWVsZHNJbmZvOiBNYXA8U2hhZGVyU2VtYW50aWNzTmFtZSwgU2hhZGVyU2VtYW50aWNzSW5mbz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19iZWxvbmdQcmltaXRpdmVzOiBNYXA8UHJpbWl0aXZlVUlELCBQcmltaXRpdmU+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIElkc1xuICBwcml2YXRlIF9zaGFkZXJQcm9ncmFtVWlkTWFwOiBNYXA8UHJpbWl0aXZlRmluZ2VyUHJpbnQsIENHQVBJUmVzb3VyY2VIYW5kbGU+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9wcmltaXRpdmVGaW5nZXJQcmludEJhY2tVcDogUHJpbWl0aXZlRmluZ2VyUHJpbnQgPSAnJztcbiAgX19tYXRlcmlhbFVpZDogTWF0ZXJpYWxVSUQgPSAtMTtcbiAgcHJpdmF0ZSBfX21hdGVyaWFsVGlkOiBNYXRlcmlhbFRJRDtcbiAgX19tYXRlcmlhbFNpZDogTWF0ZXJpYWxTSUQgPSAtMTsgLy8gbWF0ZXJpYWwgc2VyaWFsIElkIGluIHRoZSBtYXRlcmlhbCB0eXBlXG5cbiAgLy8gQ29tbW9uIFJlbmRlcmluZyBTdGF0ZXNcbiAgcHJpdmF0ZSBfX2FscGhhTW9kZSA9IEFscGhhTW9kZS5PcGFxdWU7XG4gIHB1YmxpYyBpc1RyYW5zbHVjZW50ID0gZmFsc2U7XG4gIHB1YmxpYyBjdWxsRmFjZSA9IHRydWU7IC8vIElmIHRydWUsIGVuYWJsZSBnbC5DVUxMX0ZBQ0VcbiAgcHVibGljIGN1bGxGcm9udEZhY2VDQ1cgPSB0cnVlO1xuICBwcml2YXRlIF9fYWxwaGFUb0NvdmVyYWdlID0gZmFsc2U7XG4gIHByaXZhdGUgX19ibGVuZEVxdWF0aW9uTW9kZSA9IEJsZW5kLkVxdWF0aW9uRnVuY0FkZDsgLy8gZ2wuRlVOQ19BRERcbiAgcHJpdmF0ZSBfX2JsZW5kRXF1YXRpb25Nb2RlQWxwaGEgPSBCbGVuZC5FcXVhdGlvbkZ1bmNBZGQ7IC8vIGdsLkZVTkNfQUREXG4gIHByaXZhdGUgX19ibGVuZEZ1bmNTcmNGYWN0b3IgPSBCbGVuZC5PbmU7IC8vIE5vdCBTcmNBbHBoYS4gQmVjYXVzZSBJbiBSaG9kb25pdGUsIHByZW11bHRpcGxpZWQgYWxwaGEgaXMgdXNlZFxuICBwcml2YXRlIF9fYmxlbmRGdW5jRHN0RmFjdG9yID0gQmxlbmQuT25lTWludXNTcmNBbHBoYTsgLy8gZ2wuT05FX01JTlVTX1NSQ19BTFBIQVxuICBwcml2YXRlIF9fYmxlbmRGdW5jQWxwaGFTcmNGYWN0b3IgPSBCbGVuZC5PbmU7IC8vIGdsLk9ORVxuICBwcml2YXRlIF9fYmxlbmRGdW5jQWxwaGFEc3RGYWN0b3IgPSBCbGVuZC5PbmVNaW51c1NyY0FscGhhOyAvLyBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG5cbiAgcHJpdmF0ZSBfX3N0YXRlVmVyc2lvbiA9IDA7XG4gIHByaXZhdGUgc3RhdGljIF9fc3RhdGVWZXJzaW9uID0gMDtcbiAgcHJpdmF0ZSBfX2ZpbmdlclByaW50ID0gJyc7XG5cbiAgcHJpdmF0ZSBfX3NoYWRlckRlZmluZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIHByaXZhdGUgc3RhdGljIF9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnk/OiBXZWJHTFJlc291cmNlUmVwb3NpdG9yeTtcblxuICAvLyBzdGF0aWMgZmllbGRzXG4gIHN0YXRpYyBfc29sb0RhdHVtRmllbGRzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgTWFwPFNoYWRlclNlbWFudGljc05hbWUsIFNoYWRlclZhcmlhYmxlPj4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtYXRlcmlhbFRpZDogSW5kZXgsXG4gICAgbWF0ZXJpYWxVaWQ6IE1hdGVyaWFsVUlELFxuICAgIG1hdGVyaWFsU2lkOiBNYXRlcmlhbFNJRCxcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX21hdGVyaWFsQ29udGVudCA9IG1hdGVyaWFsTm9kZTtcbiAgICB0aGlzLl9fbWF0ZXJpYWxUaWQgPSBtYXRlcmlhbFRpZDtcbiAgICB0aGlzLl9fbWF0ZXJpYWxVaWQgPSBtYXRlcmlhbFVpZDtcbiAgICB0aGlzLl9fbWF0ZXJpYWxTaWQgPSBtYXRlcmlhbFNpZDtcbiAgICB0aGlzLl9fbWF0ZXJpYWxUeXBlTmFtZSA9IG1hdGVyaWFsVHlwZU5hbWU7XG4gIH1cblxuICBhZGRTaGFkZXJEZWZpbmUoZGVmaW5lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9fc2hhZGVyRGVmaW5lcy5hZGQoZGVmaW5lKTtcbiAgICB0aGlzLm1ha2VTaGFkZXJzSW52YWxpZGF0ZSgpO1xuICB9XG5cbiAgcmVtb3ZlU2hhZGVyRGVmaW5lKGRlZmluZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fX3NoYWRlckRlZmluZXMuZGVsZXRlKGRlZmluZSk7XG4gICAgdGhpcy5tYWtlU2hhZGVyc0ludmFsaWRhdGUoKTtcbiAgfVxuXG4gIGdldFNoYWRlckRlZmluZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zaGFkZXJEZWZpbmVzO1xuICB9XG5cbiAgY2FsY0ZpbmdlclByaW50KCkge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBzdHIgKz0gdGhpcy5hbHBoYU1vZGUuaW5kZXg7XG4gICAgc3RyICs9IHRoaXMuYmxlbmRGdW5jU3JjRmFjdG9yLndlYmdwdTtcbiAgICBzdHIgKz0gdGhpcy5ibGVuZEZ1bmNEc3RGYWN0b3Iud2ViZ3B1O1xuICAgIHN0ciArPSB0aGlzLmJsZW5kRnVuY0FscGhhU3JjRmFjdG9yLndlYmdwdTtcbiAgICBzdHIgKz0gdGhpcy5ibGVuZEZ1bmNBbHBoYURzdEZhY3Rvci53ZWJncHU7XG4gICAgc3RyICs9IHRoaXMuYmxlbmRFcXVhdGlvbk1vZGUud2ViZ3B1O1xuICAgIHN0ciArPSB0aGlzLmJsZW5kRXF1YXRpb25Nb2RlQWxwaGEud2ViZ3B1O1xuICAgIHN0ciArPSB0aGlzLmN1bGxGYWNlID8gJzEnIDogJzAnO1xuICAgIHN0ciArPSB0aGlzLmN1bGxGcm9udEZhY2VDQ1cgPyAnMScgOiAnMCc7XG5cbiAgICAvLyBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9hdXRvRmllbGRWYXJpYWJsZXNPbmx5KSB7XG4gICAgLy8gICBpZiAoQ29tcG9zaXRpb25UeXBlLmlzVGV4dHVyZSh2YWx1ZS5pbmZvLmNvbXBvc2l0aW9uVHlwZSkpIHtcbiAgICAvLyAgICAgc3RyICs9IHZhbHVlLmluZm8uc2VtYW50aWMuc3RyO1xuICAgIC8vICAgICBzdHIgKz0gdmFsdWUudmFsdWVbMF07XG4gICAgLy8gICAgIHN0ciArPSB2YWx1ZS52YWx1ZVsxXTtcbiAgICAvLyAgICAgc3RyICs9IHZhbHVlLnZhbHVlWzJdO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIHRoaXMuX19maW5nZXJQcmludCA9IHN0cjtcbiAgfVxuXG4gIF9nZXRGaW5nZXJQcmludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZpbmdlclByaW50O1xuICB9XG5cbiAgc3RhdGljIGdldCBzdGF0ZVZlcnNpb24oKSB7XG4gICAgcmV0dXJuIE1hdGVyaWFsLl9fc3RhdGVWZXJzaW9uO1xuICB9XG5cbiAgLy8vXG4gIC8vLyBQYXJhbWV0ZXIgU2V0dGVyc1xuICAvLy9cblxuICBwdWJsaWMgc2V0UGFyYW1ldGVyKHNoYWRlclNlbWFudGljTmFtZTogU2hhZGVyU2VtYW50aWNzTmFtZSwgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLl9hbGxGaWVsZHNJbmZvLmdldChzaGFkZXJTZW1hbnRpY05hbWUpO1xuICAgIGlmIChpbmZvICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZU9iajogU2hhZGVyVmFyaWFibGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoaW5mby5zb2xvRGF0dW0pIHtcbiAgICAgICAgdmFsdWVPYmogPSBNYXRlcmlhbC5fc29sb0RhdHVtRmllbGRzLmdldCh0aGlzLl9fbWF0ZXJpYWxUeXBlTmFtZSkhLmdldChzaGFkZXJTZW1hbnRpY05hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVPYmogPSB0aGlzLl9hbGxGaWVsZFZhcmlhYmxlcy5nZXQoc2hhZGVyU2VtYW50aWNOYW1lKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBNYXRoQ2xhc3NVdGlsLl9zZXRGb3JjZSh2YWx1ZU9iaiEudmFsdWUsIHZhbHVlKTtcblxuICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgdGhpcy5fX3N0YXRlVmVyc2lvbisrO1xuICAgICAgICBNYXRlcmlhbC5fX3N0YXRlVmVyc2lvbisrO1xuICAgICAgICB0aGlzLmNhbGNGaW5nZXJQcmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRUZXh0dXJlUGFyYW1ldGVyKFxuICAgIHNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lLFxuICAgIHRleHR1cmU6IEFic3RyYWN0VGV4dHVyZSxcbiAgICBzYW1wbGVyOiBTYW1wbGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghc2FtcGxlci5jcmVhdGVkKSB7XG4gICAgICBzYW1wbGVyLmNyZWF0ZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hbGxGaWVsZHNJbmZvLmhhcyhzaGFkZXJTZW1hbnRpYykpIHtcbiAgICAgIGNvbnN0IHNldHRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGV4dHVyZSBhcyBUZXh0dXJlKS5sb2FkRnJvbVVybExhenkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgYXdhaXQgKHRleHR1cmUgYXMgVGV4dHVyZSkubG9hZEZyb21VcmxMYXp5KCk7XG4gICAgICAgICAgYXdhaXQgKHRleHR1cmUgYXMgVGV4dHVyZSkubG9hZEZyb21JbWdMYXp5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLl9hbGxGaWVsZFZhcmlhYmxlcy5nZXQoc2hhZGVyU2VtYW50aWMpITtcbiAgICAgICAgY29uc3Qgc2hhZGVyVmFyaWFibGUgPSB7XG4gICAgICAgICAgdmFsdWU6IFthcnJheS52YWx1ZVswXSwgdGV4dHVyZSwgc2FtcGxlcl0sXG4gICAgICAgICAgaW5mbzogYXJyYXkuaW5mbyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYWxsRmllbGRWYXJpYWJsZXMuc2V0KHNoYWRlclNlbWFudGljLCBzaGFkZXJWYXJpYWJsZSk7XG4gICAgICAgIGlmICghYXJyYXkuaW5mby5pc0ludGVybmFsU2V0dGluZykge1xuICAgICAgICAgIHRoaXMuX2F1dG9GaWVsZFZhcmlhYmxlc09ubHkuc2V0KHNoYWRlclNlbWFudGljLCBzaGFkZXJWYXJpYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRlclNlbWFudGljID09PSAnZGlmZnVzZUNvbG9yVGV4dHVyZScgfHwgc2hhZGVyU2VtYW50aWMgPT09ICdiYXNlQ29sb3JUZXh0dXJlJykge1xuICAgICAgICAgIGlmICh0ZXh0dXJlLmlzVHJhbnNwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fc3RhdGVWZXJzaW9uKys7XG4gICAgICAgIE1hdGVyaWFsLl9fc3RhdGVWZXJzaW9uKys7XG4gICAgICAgIHRoaXMuY2FsY0ZpbmdlclByaW50KCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mICh0ZXh0dXJlIGFzIFRleHR1cmUpLmhhc0RhdGFUb0xvYWRMYXp5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoKHRleHR1cmUgYXMgVGV4dHVyZSkuaGFzRGF0YVRvTG9hZExhenkpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHNldHRlciwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldHRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRUZXh0dXJlUGFyYW1ldGVyKHNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lKSB7XG4gICAgaWYgKHRoaXMuX2FsbEZpZWxkc0luZm8uaGFzKHNoYWRlclNlbWFudGljKSkge1xuICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLl9hbGxGaWVsZFZhcmlhYmxlcy5nZXQoc2hhZGVyU2VtYW50aWMpITtcbiAgICAgIHJldHVybiBhcnJheS52YWx1ZVsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUZXh0dXJlUGFyYW1ldGVyQXNQcm9taXNlKFxuICAgIHNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lLFxuICAgIHByb21pc2U6IFByb21pc2U8QWJzdHJhY3RUZXh0dXJlPlxuICApOiB2b2lkIHtcbiAgICBwcm9taXNlLnRoZW4oKHRleHR1cmUpID0+IHtcbiAgICAgIGlmICh0aGlzLl9hbGxGaWVsZHNJbmZvLmhhcyhzaGFkZXJTZW1hbnRpYykpIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLl9hbGxGaWVsZFZhcmlhYmxlcy5nZXQoc2hhZGVyU2VtYW50aWMpITtcbiAgICAgICAgY29uc3Qgc2hhZGVyVmFyaWFibGUgPSB7XG4gICAgICAgICAgdmFsdWU6IFthcnJheS52YWx1ZVswXSwgdGV4dHVyZV0sXG4gICAgICAgICAgaW5mbzogYXJyYXkuaW5mbyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYWxsRmllbGRWYXJpYWJsZXMuc2V0KHNoYWRlclNlbWFudGljLCBzaGFkZXJWYXJpYWJsZSk7XG4gICAgICAgIGlmICghYXJyYXkuaW5mby5pc0ludGVybmFsU2V0dGluZykge1xuICAgICAgICAgIHRoaXMuX2F1dG9GaWVsZFZhcmlhYmxlc09ubHkuc2V0KHNoYWRlclNlbWFudGljLCBzaGFkZXJWYXJpYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRlclNlbWFudGljID09PSAnZGlmZnVzZUNvbG9yVGV4dHVyZScgfHwgc2hhZGVyU2VtYW50aWMgPT09ICdiYXNlQ29sb3JUZXh0dXJlJykge1xuICAgICAgICAgIGlmICh0ZXh0dXJlLmlzVHJhbnNwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGFNb2RlID0gQWxwaGFNb2RlLkJsZW5kO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fX3N0YXRlVmVyc2lvbisrO1xuICAgICAgTWF0ZXJpYWwuX19zdGF0ZVZlcnNpb24rKztcbiAgICAgIHRoaXMuY2FsY0ZpbmdlclByaW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyKHNoYWRlclNlbWFudGljOiBTaGFkZXJTZW1hbnRpY3NOYW1lKTogYW55IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5fYWxsRmllbGRzSW5mby5nZXQoc2hhZGVyU2VtYW50aWMpO1xuICAgIGlmIChpbmZvICE9IG51bGwpIHtcbiAgICAgIGlmIChpbmZvLnNvbG9EYXR1bSkge1xuICAgICAgICByZXR1cm4gTWF0ZXJpYWwuX3NvbG9EYXR1bUZpZWxkcy5nZXQodGhpcy5fX21hdGVyaWFsVHlwZU5hbWUpIS5nZXQoc2hhZGVyU2VtYW50aWMpPy52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxGaWVsZFZhcmlhYmxlcy5nZXQoc2hhZGVyU2VtYW50aWMpPy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiB3aGV0aGVyIHRoZSBzaGFkZXIgcHJvZ3JhbSByZWFkeSBvciBub3RcbiAgICogQHJldHVybnMgaXMgc2hhZGVyIHByb2dyYW0gcmVhZHkgb3Igbm90XG4gICAqL1xuICBwdWJsaWMgaXNTaGFkZXJQcm9ncmFtUmVhZHkocHJpbWl0aXZlOiBQcmltaXRpdmUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hhZGVyUHJvZ3JhbVVpZE1hcC5oYXMocHJpbWl0aXZlLl9nZXRGaW5nZXJQcmludCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogY2FsbGVkIGZyb20gV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlIGFuZCBXZWJHTFN0cmF0ZWd5VW5pZm9ybSBvbmx5XG4gICAqIEBwYXJhbSBpc1VuaWZvcm1Pbmx5TW9kZVxuICAgKi9cbiAgX3NldFVuaWZvcm1Mb2NhdGlvbnNPZk1hdGVyaWFsTm9kZXMoaXNVbmlmb3JtT25seU1vZGU6IGJvb2xlYW4sIHByaW1pdGl2ZT86IFByaW1pdGl2ZSkge1xuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcblxuICAgIGxldCBhcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gW107XG4gICAgaWYgKHRoaXMuX21hdGVyaWFsQ29udGVudCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBzZW1hbnRpY3NJbmZvQXJyYXkgPSB0aGlzLl9tYXRlcmlhbENvbnRlbnQuX3NlbWFudGljc0luZm9BcnJheTtcbiAgICAgIGFycmF5ID0gYXJyYXkuY29uY2F0KHNlbWFudGljc0luZm9BcnJheSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhZGVyUHJvZ3JhbVVpZCA9IHRoaXMuX3NoYWRlclByb2dyYW1VaWRNYXAuZ2V0KFxuICAgICAgcHJpbWl0aXZlICE9IG51bGwgPyBwcmltaXRpdmUuX2dldEZpbmdlclByaW50KCkgOiB0aGlzLl9wcmltaXRpdmVGaW5nZXJQcmludEJhY2tVcFxuICAgICk7XG4gICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0dXBVbmlmb3JtTG9jYXRpb25zKHNoYWRlclByb2dyYW1VaWQhLCBhcnJheSwgaXNVbmlmb3JtT25seU1vZGUpO1xuICB9XG5cbiAgZ2V0U2hhZGVyUHJvZ3JhbVVpZChwcmltaXRpdmU/OiBQcmltaXRpdmUpOiBDR0FQSVJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBwcmltaXRpdmVGaW5nZXJQcmludCA9XG4gICAgICBwcmltaXRpdmUgIT09IHVuZGVmaW5lZCA/IHByaW1pdGl2ZS5fZ2V0RmluZ2VyUHJpbnQoKSA6IHRoaXMuX3ByaW1pdGl2ZUZpbmdlclByaW50QmFja1VwO1xuICAgIHJldHVybiB0aGlzLl9zaGFkZXJQcm9ncmFtVWlkTWFwLmdldChwcmltaXRpdmVGaW5nZXJQcmludCkgPz8gLTE7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIGNhbGxlZCBmcm9tIFByaW1pdGl2ZSBjbGFzcyBvbmx5XG4gICAqIEBwYXJhbSBwcmltaXRpdmVcbiAgICovXG4gIF9hZGRCZWxvbmdQcmltaXRpdmUocHJpbWl0aXZlOiBQcmltaXRpdmUpIHtcbiAgICB0aGlzLl9fYmVsb25nUHJpbWl0aXZlcy5zZXQocHJpbWl0aXZlLnByaW1pdGl2ZVVpZCwgcHJpbWl0aXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogY2FsbGVkIGZyb20gV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlIGFuZCBXZWJHTFN0cmF0ZWd5VW5pZm9ybVxuICAgKiBAcGFyYW0gdmVydGV4U2hhZGVyTWV0aG9kRGVmaW5pdGlvbnNfdW5pZm9ybVxuICAgKiBAcGFyYW0gcHJvcGVydHlTZXR0ZXJcbiAgICogQHBhcmFtIGlzV2ViR0wyXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBfY3JlYXRlUHJvZ3JhbVdlYkdMKFxuICAgIHZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zX3VuaWZvcm06IHN0cmluZyxcbiAgICBwcm9wZXJ0eVNldHRlcjogZ2V0U2hhZGVyUHJvcGVydHlGdW5jLFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIGlzV2ViR0wyOiBib29sZWFuXG4gICk6IFtDR0FQSVJlc291cmNlSGFuZGxlLCBib29sZWFuXSB7XG4gICAgY29uc3QgeyB2ZXJ0ZXhQcm9wZXJ0aWVzU3RyLCBwaXhlbFByb3BlcnRpZXNTdHIgfSA9IHRoaXMuX2dldFByb3BlcnRpZXMoXG4gICAgICBwcm9wZXJ0eVNldHRlcixcbiAgICAgIGlzV2ViR0wyXG4gICAgKTtcblxuICAgIGNvbnN0IFtwcm9ncmFtVWlkLCBuZXdPbmVdID0gX2NyZWF0ZVByb2dyYW1Bc1NpbmdsZU9wZXJhdGlvbldlYkdMKFxuICAgICAgdGhpcyxcbiAgICAgIHByaW1pdGl2ZSxcbiAgICAgIHZlcnRleFByb3BlcnRpZXNTdHIsXG4gICAgICBwaXhlbFByb3BlcnRpZXNTdHIsXG4gICAgICB2ZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9uc191bmlmb3JtLFxuICAgICAgaXNXZWJHTDJcbiAgICApO1xuICAgIHRoaXMuX3NoYWRlclByb2dyYW1VaWRNYXAuc2V0KHByaW1pdGl2ZS5fZ2V0RmluZ2VyUHJpbnQoKSwgcHJvZ3JhbVVpZCk7XG4gICAgdGhpcy5fcHJpbWl0aXZlRmluZ2VyUHJpbnRCYWNrVXAgPSBwcmltaXRpdmUuX2dldEZpbmdlclByaW50KCk7XG5cbiAgICBNYXRlcmlhbC5fX3N0YXRlVmVyc2lvbisrO1xuXG4gICAgcmV0dXJuIFtwcm9ncmFtVWlkLCBuZXdPbmVdO1xuICB9XG5cbiAgX2NyZWF0ZVByb2dyYW1XZWJHcHUoXG4gICAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gICAgdmVydGV4U2hhZGVyTWV0aG9kRGVmaW5pdGlvbnM6IHN0cmluZyxcbiAgICBwcm9wZXJ0eVNldHRlcjogZ2V0U2hhZGVyUHJvcGVydHlGdW5jXG4gICkge1xuICAgIGNvbnN0IHsgdmVydGV4UHJvcGVydGllc1N0ciwgcGl4ZWxQcm9wZXJ0aWVzU3RyIH0gPSB0aGlzLl9nZXRQcm9wZXJ0aWVzKHByb3BlcnR5U2V0dGVyLCB0cnVlKTtcbiAgICBjb25zdCBwcm9ncmFtVWlkID0gX2NyZWF0ZVByb2dyYW1Bc1NpbmdsZU9wZXJhdGlvbldlYkdwdShcbiAgICAgIHRoaXMsXG4gICAgICBwcmltaXRpdmUsXG4gICAgICB2ZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9ucyxcbiAgICAgIHZlcnRleFByb3BlcnRpZXNTdHIsXG4gICAgICBwaXhlbFByb3BlcnRpZXNTdHJcbiAgICApO1xuXG4gICAgdGhpcy5fc2hhZGVyUHJvZ3JhbVVpZE1hcC5zZXQocHJpbWl0aXZlLl9nZXRGaW5nZXJQcmludCgpLCBwcm9ncmFtVWlkKTtcbiAgICB0aGlzLl9wcmltaXRpdmVGaW5nZXJQcmludEJhY2tVcCA9IHByaW1pdGl2ZS5fZ2V0RmluZ2VyUHJpbnQoKTtcbiAgICBNYXRlcmlhbC5fX3N0YXRlVmVyc2lvbisrO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBwcm9ncmFtIGJ5IHVwZGF0ZWQgc2hhZGVyIHNvdXJjZSBjb2RlXG4gICAqIEBpbnRlcm5hbFxuICAgKiBjYWxsZWQgZnJvbSBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUgYW5kIFdlYkdMU3RyYXRlZ3lVbmlmb3JtXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVkU2hhZGVyU291cmNlcyAtIHVwZGF0ZWQgc2hhZGVyIHNvdXJjZSBjb2RlXG4gICAqIEBwYXJhbSBvbkVycm9yXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBfY3JlYXRlUHJvZ3JhbUJ5VXBkYXRlZFNvdXJjZXMoXG4gICAgdXBkYXRlZFNoYWRlclNvdXJjZXM6IFNoYWRlclNvdXJjZXMsXG4gICAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogW0NHQVBJUmVzb3VyY2VIYW5kbGUsIGJvb2xlYW5dIHtcbiAgICBjb25zdCBbcHJvZ3JhbVVpZCwgbmV3T25lXSA9IF9jcmVhdGVQcm9ncmFtQXNTaW5nbGVPcGVyYXRpb25CeVVwZGF0ZWRTb3VyY2VzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuX21hdGVyaWFsQ29udGVudCxcbiAgICAgIHVwZGF0ZWRTaGFkZXJTb3VyY2VzLFxuICAgICAgb25FcnJvclxuICAgICk7XG4gICAgdGhpcy5fc2hhZGVyUHJvZ3JhbVVpZE1hcC5zZXQodGhpcy5fcHJpbWl0aXZlRmluZ2VyUHJpbnRCYWNrVXAsIHByb2dyYW1VaWQpO1xuXG4gICAgaWYgKHByb2dyYW1VaWQgPiAwKSB7XG4gICAgICAvLyB0aGlzLl9fdXBkYXRlZFNoYWRlclNvdXJjZXMgPSB1cGRhdGVkU2hhZGVyU291cmNlcztcbiAgICB9XG5cbiAgICBNYXRlcmlhbC5fX3N0YXRlVmVyc2lvbisrO1xuICAgIHJldHVybiBbcHJvZ3JhbVVpZCwgbmV3T25lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogY2FsbGVkIFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZSBhbmQgV2ViR0xTdHJhdGVneVVuaWZvcm0gb25seVxuICAgKi9cbiAgX3NldHVwQmFzaWNVbmlmb3Jtc0xvY2F0aW9ucyhwcmltaXRpdmU/OiBQcmltaXRpdmUpIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG5cbiAgICBjb25zdCBwcmltaXRpdmVGaW5nZXJQcmludCA9XG4gICAgICBwcmltaXRpdmUgIT0gbnVsbCA/IHByaW1pdGl2ZS5fZ2V0RmluZ2VyUHJpbnQoKSA6IHRoaXMuX3ByaW1pdGl2ZUZpbmdlclByaW50QmFja1VwO1xuICAgIGNvbnN0IHNoYWRlclByb2dyYW1VaWQgPSB0aGlzLl9zaGFkZXJQcm9ncmFtVWlkTWFwLmdldChwcmltaXRpdmVGaW5nZXJQcmludCk7XG4gICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0dXBCYXNpY1VuaWZvcm1Mb2NhdGlvbnMoc2hhZGVyUHJvZ3JhbVVpZCEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBjYWxsZWQgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlIGFuZCBXZWJHTFN0cmF0ZWd5VW5pZm9ybSBvbmx5XG4gICAqL1xuICBfc2V0dXBBZGRpdGlvbmFsVW5pZm9ybUxvY2F0aW9ucyhcbiAgICBzaGFkZXJTZW1hbnRpY3M6IFNoYWRlclNlbWFudGljc0luZm9bXSxcbiAgICBpc1VuaWZvcm1Pbmx5TW9kZTogYm9vbGVhbixcbiAgICBwcmltaXRpdmU/OiBQcmltaXRpdmVcbiAgKSB7XG4gICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNvbnN0IHByaW1pdGl2ZUZpbmdlclByaW50ID1cbiAgICAgIHByaW1pdGl2ZSAhPSBudWxsID8gcHJpbWl0aXZlLl9nZXRGaW5nZXJQcmludCgpIDogdGhpcy5fcHJpbWl0aXZlRmluZ2VyUHJpbnRCYWNrVXA7XG4gICAgY29uc3Qgc2hhZGVyUHJvZ3JhbVVpZCA9IHRoaXMuX3NoYWRlclByb2dyYW1VaWRNYXAuZ2V0KHByaW1pdGl2ZUZpbmdlclByaW50KTtcbiAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5zZXR1cFVuaWZvcm1Mb2NhdGlvbnMoXG4gICAgICBzaGFkZXJQcm9ncmFtVWlkISxcbiAgICAgIHNoYWRlclNlbWFudGljcyxcbiAgICAgIGlzVW5pZm9ybU9ubHlNb2RlXG4gICAgKTtcbiAgfVxuXG4gIF9zZXRJbnRlcm5hbFNldHRpbmdQYXJhbWV0ZXJzVG9HcHVXZWJHcHUoe1xuICAgIG1hdGVyaWFsLFxuICAgIGFyZ3MsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgYXJnczogUmVuZGVyaW5nQXJnV2ViR3B1O1xuICB9KSB7XG4gICAgdGhpcy5fbWF0ZXJpYWxDb250ZW50Ll9zZXRJbnRlcm5hbFNldHRpbmdQYXJhbWV0ZXJzVG9HcHVXZWJHcHUoe1xuICAgICAgbWF0ZXJpYWwsXG4gICAgICBhcmdzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBjYWxsZWQgZnJvbSBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUgYW5kIFdlYkdMU3RyYXRlZ3lVbmlmb3JtIG9ubHlcbiAgICovXG4gIF9zZXRQYXJhbWV0ZXJzVG9HcHVXZWJHTCh7XG4gICAgbWF0ZXJpYWwsXG4gICAgc2hhZGVyUHJvZ3JhbSxcbiAgICBmaXJzdFRpbWUsXG4gICAgYXJncyxcbiAgfToge1xuICAgIG1hdGVyaWFsOiBNYXRlcmlhbDtcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgZmlyc3RUaW1lOiBib29sZWFuO1xuICAgIGFyZ3M6IFJlbmRlcmluZ0FyZ1dlYkdMO1xuICB9KSB7XG4gICAgLy8gRm9yIEF1dG8gUGFyYW1ldGVyc1xuICAgIHRoaXMuX19zZXRBdXRvUGFyYW1ldGVyc1RvR3B1V2ViR0woYXJncy5zZXRVbmlmb3JtLCBmaXJzdFRpbWUsIHNoYWRlclByb2dyYW0pO1xuXG4gICAgLy8gRm9yIEN1c3RvbSBTZXR0aW5nIFBhcmFtZXRlcnNcbiAgICB0aGlzLl9tYXRlcmlhbENvbnRlbnQuX3NldEludGVybmFsU2V0dGluZ1BhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICAgIG1hdGVyaWFsLFxuICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgIGZpcnN0VGltZSxcbiAgICAgIGFyZ3MsXG4gICAgfSk7XG5cbiAgICAvLyBGb3IgU29sb0RhdHVtIFBhcmFtZXRlcnNcbiAgICB0aGlzLl9fc2V0U29sb0RhdHVtUGFyYW1ldGVyc1RvR3B1V2ViR0woe1xuICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgIGZpcnN0VGltZSxcbiAgICAgIGlzVW5pZm9ybU1vZGU6IGFyZ3Muc2V0VW5pZm9ybSxcbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRQYXJhbWV0ZXJzVG9HcHVXZWJHTFdpdGhPdXRJbnRlcm5hbFNldHRpbmcoe1xuICAgIHNoYWRlclByb2dyYW0sXG4gICAgZmlyc3RUaW1lLFxuICAgIGlzVW5pZm9ybU1vZGUsXG4gIH06IHtcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgZmlyc3RUaW1lOiBib29sZWFuO1xuICAgIGlzVW5pZm9ybU1vZGU6IGJvb2xlYW47XG4gIH0pIHtcbiAgICAvLyBGb3IgQXV0byBQYXJhbWV0ZXJzXG4gICAgdGhpcy5fX3NldEF1dG9QYXJhbWV0ZXJzVG9HcHVXZWJHTChpc1VuaWZvcm1Nb2RlLCBmaXJzdFRpbWUsIHNoYWRlclByb2dyYW0pO1xuXG4gICAgLy8gRm9yIFNvbG9EYXR1bSBQYXJhbWV0ZXJzXG4gICAgdGhpcy5fX3NldFNvbG9EYXR1bVBhcmFtZXRlcnNUb0dwdVdlYkdMKHtcbiAgICAgIHNoYWRlclByb2dyYW0sXG4gICAgICBmaXJzdFRpbWUsXG4gICAgICBpc1VuaWZvcm1Nb2RlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHByb3BlcnR5U2V0dGVyXG4gICAqL1xuICBfZ2V0UHJvcGVydGllcyhwcm9wZXJ0eVNldHRlcjogZ2V0U2hhZGVyUHJvcGVydHlGdW5jLCBpc1dlYkdMMjogYm9vbGVhbikge1xuICAgIGxldCB2ZXJ0ZXhQcm9wZXJ0aWVzU3RyID0gJyc7XG4gICAgbGV0IHBpeGVsUHJvcGVydGllc1N0ciA9ICcnO1xuICAgIHRoaXMuX2FsbEZpZWxkc0luZm8uZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpbmZvIS5zdGFnZSA9PT0gU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIgfHxcbiAgICAgICAgaW5mbyEuc3RhZ2UgPT09IFNoYWRlclR5cGUuVmVydGV4QW5kUGl4ZWxTaGFkZXJcbiAgICAgICkge1xuICAgICAgICB2ZXJ0ZXhQcm9wZXJ0aWVzU3RyICs9IHByb3BlcnR5U2V0dGVyKHRoaXMuX19tYXRlcmlhbFR5cGVOYW1lLCBpbmZvISwgZmFsc2UsIGlzV2ViR0wyKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgaW5mbyEuc3RhZ2UgPT09IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIgfHxcbiAgICAgICAgaW5mbyEuc3RhZ2UgPT09IFNoYWRlclR5cGUuVmVydGV4QW5kUGl4ZWxTaGFkZXJcbiAgICAgICkge1xuICAgICAgICBwaXhlbFByb3BlcnRpZXNTdHIgKz0gcHJvcGVydHlTZXR0ZXIodGhpcy5fX21hdGVyaWFsVHlwZU5hbWUsIGluZm8hLCBmYWxzZSwgaXNXZWJHTDIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGdsb2JhbERhdGFSZXBvc2l0b3J5ID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICBbdmVydGV4UHJvcGVydGllc1N0ciwgcGl4ZWxQcm9wZXJ0aWVzU3RyXSA9IGdsb2JhbERhdGFSZXBvc2l0b3J5Ll9hZGRQcm9wZXJ0aWVzU3RyKFxuICAgICAgdmVydGV4UHJvcGVydGllc1N0cixcbiAgICAgIHBpeGVsUHJvcGVydGllc1N0cixcbiAgICAgIHByb3BlcnR5U2V0dGVyLFxuICAgICAgaXNXZWJHTDJcbiAgICApO1xuICAgIHJldHVybiB7IHZlcnRleFByb3BlcnRpZXNTdHIsIHBpeGVsUHJvcGVydGllc1N0ciB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3NldEF1dG9QYXJhbWV0ZXJzVG9HcHVXZWJHTChcbiAgICBpc1VuaWZvcm1Nb2RlOiBib29sZWFuLFxuICAgIGZpcnN0VGltZTogYm9vbGVhbixcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW1cbiAgKSB7XG4gICAgaWYgKE1hdGVyaWFsLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPT0gbnVsbCkge1xuICAgICAgTWF0ZXJpYWwuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgfVxuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gTWF0ZXJpYWwuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeSE7XG4gICAgaWYgKGlzVW5pZm9ybU1vZGUpIHtcbiAgICAgIHRoaXMuX2F1dG9GaWVsZFZhcmlhYmxlc09ubHkuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IHZhbHVlLmluZm87XG4gICAgICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldFVuaWZvcm1WYWx1ZShcbiAgICAgICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgICAgIGluZm8uc2VtYW50aWMsXG4gICAgICAgICAgZmlyc3RUaW1lLFxuICAgICAgICAgIHZhbHVlLnZhbHVlXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fYXV0b0ZpZWxkVmFyaWFibGVzT25seSkge1xuICAgICAgICBjb25zdCBpbmZvID0gdmFsdWUuaW5mbztcbiAgICAgICAgaWYgKENvbXBvc2l0aW9uVHlwZS5pc1RleHR1cmUoaW5mby5jb21wb3NpdGlvblR5cGUpKSB7XG4gICAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VW5pZm9ybTFpRm9yVGV4dHVyZShcbiAgICAgICAgICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgICAgICAgaW5mby5zZW1hbnRpYyxcbiAgICAgICAgICAgICAgdmFsdWUudmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmJpbmRUZXh0dXJlKGluZm8sIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5mby5uZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlKSB7XG4gICAgICAgICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VW5pZm9ybVZhbHVlKFxuICAgICAgICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgICAgIGluZm8uc2VtYW50aWMsXG4gICAgICAgICAgICBmaXJzdFRpbWUsXG4gICAgICAgICAgICB2YWx1ZS52YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fc2V0U29sb0RhdHVtUGFyYW1ldGVyc1RvR3B1V2ViR0woe1xuICAgIHNoYWRlclByb2dyYW0sXG4gICAgZmlyc3RUaW1lLFxuICAgIGlzVW5pZm9ybU1vZGUsXG4gIH06IHtcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgZmlyc3RUaW1lOiBib29sZWFuO1xuICAgIGlzVW5pZm9ybU1vZGU6IGJvb2xlYW47XG4gIH0pIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgbWF0ZXJpYWxUeXBlTmFtZSA9IHRoaXMuX19tYXRlcmlhbFR5cGVOYW1lO1xuICAgIGNvbnN0IG1hcCA9IE1hdGVyaWFsLl9zb2xvRGF0dW1GaWVsZHMuZ2V0KG1hdGVyaWFsVHlwZU5hbWUpO1xuICAgIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHZhbHVlcyA9IG1hcC52YWx1ZXMoKTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgaW5mbyA9IHZhbHVlLmluZm87XG4gICAgICBpZiAoaXNVbmlmb3JtTW9kZSB8fCBDb21wb3NpdGlvblR5cGUuaXNUZXh0dXJlKGluZm8uY29tcG9zaXRpb25UeXBlKSkge1xuICAgICAgICBpZiAoIWluZm8uaXNJbnRlcm5hbFNldHRpbmcpIHtcbiAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5zZXRVbmlmb3JtVmFsdWUoXG4gICAgICAgICAgICAgIHNoYWRlclByb2dyYW0sXG4gICAgICAgICAgICAgIGluZm8uc2VtYW50aWMsXG4gICAgICAgICAgICAgIGZpcnN0VGltZSxcbiAgICAgICAgICAgICAgdmFsdWUudmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmJpbmRUZXh0dXJlKGluZm8sIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBibGVuZEVxdWF0aW9uc1xuICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBvbmx5IGlmIHRoaXMgYWxwaGFNb2RlIGlzIHRoZSBibGVuZFxuICAgKiBAcGFyYW0gYmxlbmRFcXVhdGlvbk1vZGUgdGhlIGFyZ3VtZW50IG9mIGdsLmJsZW5kRXF1YXRpb24gb2YgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSBzdWNoIGFzIGdsLkZVTkNfQUREXG4gICAqIEBwYXJhbSBibGVuZEVxdWF0aW9uTW9kZUFscGhhIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlXG4gICAqL1xuICBwdWJsaWMgc2V0QmxlbmRFcXVhdGlvbk1vZGUoYmxlbmRFcXVhdGlvbk1vZGU6IEJsZW5kRW51bSwgYmxlbmRFcXVhdGlvbk1vZGVBbHBoYT86IEJsZW5kRW51bSkge1xuICAgIHRoaXMuX19ibGVuZEVxdWF0aW9uTW9kZSA9IGJsZW5kRXF1YXRpb25Nb2RlO1xuICAgIHRoaXMuX19ibGVuZEVxdWF0aW9uTW9kZUFscGhhID0gYmxlbmRFcXVhdGlvbk1vZGVBbHBoYSA/PyBibGVuZEVxdWF0aW9uTW9kZTtcblxuICAgIHRoaXMuX190cmVhdEZvck1pbk1heCgpO1xuXG4gICAgdGhpcy5fX3N0YXRlVmVyc2lvbisrO1xuICAgIE1hdGVyaWFsLl9fc3RhdGVWZXJzaW9uKys7XG4gICAgdGhpcy5jYWxjRmluZ2VyUHJpbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX190cmVhdEZvck1pbk1heCgpIHtcbiAgICAvLyBkdWUgdG8gdGhlIGxpbWl0YXRpb24gb2YgV2ViR1BVLCBTZWUgdGhlIGxhc3QgcGFydCBvZiBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZ3B1LyNmcmFnbWVudC1zdGF0ZVxuICAgIGlmICh0aGlzLl9fYmxlbmRFcXVhdGlvbk1vZGUgPT09IEJsZW5kLk1pbiB8fCB0aGlzLl9fYmxlbmRFcXVhdGlvbk1vZGUgPT09IEJsZW5kLk1heCkge1xuICAgICAgdGhpcy5fX2JsZW5kRnVuY0RzdEZhY3RvciA9IEJsZW5kLk9uZTtcbiAgICAgIHRoaXMuX19ibGVuZEZ1bmNTcmNGYWN0b3IgPSBCbGVuZC5PbmU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuX19ibGVuZEVxdWF0aW9uTW9kZUFscGhhID09PSBCbGVuZC5NaW4gfHxcbiAgICAgIHRoaXMuX19ibGVuZEVxdWF0aW9uTW9kZUFscGhhID09PSBCbGVuZC5NYXhcbiAgICApIHtcbiAgICAgIHRoaXMuX19ibGVuZEZ1bmNBbHBoYURzdEZhY3RvciA9IEJsZW5kLk9uZTtcbiAgICAgIHRoaXMuX19ibGVuZEZ1bmNBbHBoYVNyY0ZhY3RvciA9IEJsZW5kLk9uZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBibGVuZEZ1bmNTZXBhcmF0ZUZhY3RvcnNcbiAgICogVGhpcyBtZXRob2Qgd29ya3Mgb25seSBpZiB0aGlzIGFscGhhTW9kZSBpcyB0aGUgYmxlbmRcbiAgICovXG4gIHB1YmxpYyBzZXRCbGVuZEZ1bmNTZXBhcmF0ZUZhY3RvcihcbiAgICBibGVuZEZ1bmNTcmNGYWN0b3I6IEJsZW5kRW51bSxcbiAgICBibGVuZEZ1bmNEc3RGYWN0b3I6IEJsZW5kRW51bSxcbiAgICBibGVuZEZ1bmNBbHBoYVNyY0ZhY3RvcjogQmxlbmRFbnVtLFxuICAgIGJsZW5kRnVuY0FscGhhRHN0RmFjdG9yOiBCbGVuZEVudW1cbiAgKSB7XG4gICAgdGhpcy5fX2JsZW5kRnVuY1NyY0ZhY3RvciA9IGJsZW5kRnVuY1NyY0ZhY3RvcjtcbiAgICB0aGlzLl9fYmxlbmRGdW5jRHN0RmFjdG9yID0gYmxlbmRGdW5jRHN0RmFjdG9yO1xuICAgIHRoaXMuX19ibGVuZEZ1bmNBbHBoYVNyY0ZhY3RvciA9IGJsZW5kRnVuY0FscGhhU3JjRmFjdG9yO1xuICAgIHRoaXMuX19ibGVuZEZ1bmNBbHBoYURzdEZhY3RvciA9IGJsZW5kRnVuY0FscGhhRHN0RmFjdG9yO1xuXG4gICAgdGhpcy5fX3RyZWF0Rm9yTWluTWF4KCk7XG5cbiAgICB0aGlzLl9fc3RhdGVWZXJzaW9uKys7XG4gICAgTWF0ZXJpYWwuX19zdGF0ZVZlcnNpb24rKztcbiAgICB0aGlzLmNhbGNGaW5nZXJQcmludCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgYmxlbmRGdW5jRmFjdG9yc1xuICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBvbmx5IGlmIHRoaXMgYWxwaGFNb2RlIGlzIHRoZSBibGVuZFxuICAgKi9cbiAgcHVibGljIHNldEJsZW5kRnVuY0ZhY3RvcihibGVuZEZ1bmNTcmNGYWN0b3I6IEJsZW5kRW51bSwgYmxlbmRGdW5jRHN0RmFjdG9yOiBCbGVuZEVudW0pIHtcbiAgICB0aGlzLl9fYmxlbmRGdW5jU3JjRmFjdG9yID0gYmxlbmRGdW5jU3JjRmFjdG9yO1xuICAgIHRoaXMuX19ibGVuZEZ1bmNEc3RGYWN0b3IgPSBibGVuZEZ1bmNEc3RGYWN0b3I7XG4gICAgdGhpcy5fX2JsZW5kRnVuY0FscGhhU3JjRmFjdG9yID0gYmxlbmRGdW5jU3JjRmFjdG9yO1xuICAgIHRoaXMuX19ibGVuZEZ1bmNBbHBoYURzdEZhY3RvciA9IGJsZW5kRnVuY0RzdEZhY3RvcjtcblxuICAgIHRoaXMuX190cmVhdEZvck1pbk1heCgpO1xuXG4gICAgdGhpcy5fX3N0YXRlVmVyc2lvbisrO1xuICAgIE1hdGVyaWFsLl9fc3RhdGVWZXJzaW9uKys7XG4gICAgdGhpcy5jYWxjRmluZ2VyUHJpbnQoKTtcbiAgfVxuXG4gIC8vIHNldE1hdGVyaWFsTm9kZShtYXRlcmlhbE5vZGU6IEFic3RyYWN0TWF0ZXJpYWxOb2RlKSB7XG4gIC8vICAgdGhpcy5fX21hdGVyaWFsTm9kZSA9IG1hdGVyaWFsTm9kZTtcbiAgLy8gfVxuXG4gIC8vL1xuICAvLy8gR2V0dGVyc1xuICAvLy9cblxuICBpc0JsZW5kKCkge1xuICAgIGlmICh0aGlzLmFscGhhTW9kZSA9PT0gQWxwaGFNb2RlLkJsZW5kKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyByZXR1cm4gdHJ1ZSBpZiAoYWxwaGFNb2RlIGlzIE9wYXF1ZSBvciBNYXNrKSBhbmQgdHJhbnNsdWNlbnRcbiAgICovXG4gIGlzVHJhbnNsdWNlbnRPcGFxdWUoKSB7XG4gICAgaWYgKHRoaXMuYWxwaGFNb2RlICE9PSBBbHBoYU1vZGUuQmxlbmQgJiYgdGhpcy5pc1RyYW5zbHVjZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzQmxlbmRPclRyYW5zbHVjZW50KCkge1xuICAgIGlmICh0aGlzLmFscGhhTW9kZSA9PT0gQWxwaGFNb2RlLkJsZW5kIHx8IHRoaXMuaXNUcmFuc2x1Y2VudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc09wYXF1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hbHBoYU1vZGUgPT09IEFscGhhTW9kZS5PcGFxdWU7XG4gIH1cblxuICBpc01hc2soKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxwaGFNb2RlID09PSBBbHBoYU1vZGUuTWFzaztcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFOiBUbyBhcHBseSB0aGUgYWxwaGFUb0NvdmVyYWdlLCB0aGUgb3V0cHV0IGFscGhhIHZhbHVlIG11c3Qgbm90IGJlIGZpeGVkIHRvIGNvbnN0YW50IHZhbHVlLlxuICAgKiBIb3dldmVyLCBzb21lIHNoYWRlcnMgaW4gdGhlIFJob2Rvbml0ZSBmaXhlcyB0aGUgb3V0cHV0IGFscGhhIHZhbHVlIHRvIDEgYnkgc2V0QWxwaGFJZk5vdEluQWxwaGFCbGVuZE1vZGUuXG4gICAqIFNvIHdlIG5lZWQgdG8gaW1wcm92ZSB0aGUgc2hhZGVyIHRvIHVzZSB0aGUgYWxwaGFUb0NvdmVyYWdlLlxuICAgKiBAcGFyYW0gYWxwaGFUb0NvdmVyYWdlIGFwcGx5IGFscGhhVG9Db3ZlcmFnZSB0byB0aGlzIG1hdGVyaWFsIG9yIG5vdFxuICAgKi9cbiAgc2V0IGFscGhhVG9Db3ZlcmFnZShhbHBoYVRvQ292ZXJhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAoYWxwaGFUb0NvdmVyYWdlICYmIHRoaXMuYWxwaGFNb2RlID09PSBBbHBoYU1vZGUuQmxlbmQpIHtcbiAgICAgIExvZ2dlci53YXJuKFxuICAgICAgICAnSWYgeW91IHNldCBhbHBoYVRvQ292ZXJhZ2UgPSB0cnVlIG9uIGEgbWF0ZXJpYWwgd2hvc2UgQWxwaGFNb2RlIGlzIFRyYW5zbHVjZW50LCB5b3UgbWF5IGdldCBkcmF3aW5nIHByb2JsZW1zLidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX19hbHBoYVRvQ292ZXJhZ2UgPSBhbHBoYVRvQ292ZXJhZ2U7XG4gICAgdGhpcy5tYWtlU2hhZGVyc0ludmFsaWRhdGUoKTtcbiAgICB0aGlzLmNhbGNGaW5nZXJQcmludCgpO1xuICB9XG4gIGdldCBhbHBoYVRvQ292ZXJhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX19hbHBoYVRvQ292ZXJhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBtYXRlcmlhbFRJRC5cbiAgICovXG4gIGdldCBtYXRlcmlhbFRJRCgpOiBNYXRlcmlhbFRJRCB7XG4gICAgcmV0dXJuIHRoaXMuX19tYXRlcmlhbFRpZDtcbiAgfVxuXG4gIGdldCBmaWVsZHNJbmZvQXJyYXkoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fYWxsRmllbGRzSW5mby52YWx1ZXMoKSk7XG4gIH1cblxuICBnZXQgYmxlbmRFcXVhdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ibGVuZEVxdWF0aW9uTW9kZTtcbiAgfVxuXG4gIGdldCBibGVuZEVxdWF0aW9uTW9kZUFscGhhKCkge1xuICAgIHJldHVybiB0aGlzLl9fYmxlbmRFcXVhdGlvbk1vZGVBbHBoYTtcbiAgfVxuXG4gIGdldCBibGVuZEZ1bmNTcmNGYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ibGVuZEZ1bmNTcmNGYWN0b3I7XG4gIH1cblxuICBnZXQgYmxlbmRGdW5jRHN0RmFjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9fYmxlbmRGdW5jRHN0RmFjdG9yO1xuICB9XG5cbiAgZ2V0IGJsZW5kRnVuY0FscGhhU3JjRmFjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9fYmxlbmRGdW5jQWxwaGFTcmNGYWN0b3I7XG4gIH1cblxuICBnZXQgYmxlbmRGdW5jQWxwaGFEc3RGYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ibGVuZEZ1bmNBbHBoYURzdEZhY3RvcjtcbiAgfVxuXG4gIGdldCBhbHBoYU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19hbHBoYU1vZGU7XG4gIH1cblxuICBzZXQgYWxwaGFNb2RlKG1vZGU6IEFscGhhTW9kZUVudW0pIHtcbiAgICB0aGlzLl9fYWxwaGFNb2RlID0gbW9kZTtcbiAgICB0aGlzLm1ha2VTaGFkZXJzSW52YWxpZGF0ZSgpO1xuICB9XG5cbiAgZ2V0IG1hdGVyaWFsVUlEKCk6IE1hdGVyaWFsVUlEIHtcbiAgICByZXR1cm4gdGhpcy5fX21hdGVyaWFsVWlkO1xuICB9XG5cbiAgZ2V0IG1hdGVyaWFsU0lEKCk6IE1hdGVyaWFsU0lEIHtcbiAgICByZXR1cm4gdGhpcy5fX21hdGVyaWFsU2lkO1xuICB9XG5cbiAgZ2V0IGlzU2tpbm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21hdGVyaWFsQ29udGVudC5pc1NraW5uaW5nO1xuICB9XG5cbiAgZ2V0IGlzTW9ycGhpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21hdGVyaWFsQ29udGVudC5pc01vcnBoaW5nO1xuICB9XG5cbiAgZ2V0IGlzTGlnaHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21hdGVyaWFsQ29udGVudC5pc0xpZ2h0aW5nO1xuICB9XG5cbiAgZ2V0IG1hdGVyaWFsVHlwZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fX21hdGVyaWFsVHlwZU5hbWU7XG4gIH1cblxuICBnZXQgc3RhdGVWZXJzaW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX19zdGF0ZVZlcnNpb247XG4gIH1cblxuICBtYWtlU2hhZGVyc0ludmFsaWRhdGUoKSB7XG4gICAgdGhpcy5fc2hhZGVyUHJvZ3JhbVVpZE1hcC5jbGVhcigpO1xuICAgIHRoaXMuX19zdGF0ZVZlcnNpb24rKztcbiAgICBNYXRlcmlhbC5fX3N0YXRlVmVyc2lvbisrO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb3VudCxcbiAgSW5kZXgsXG4gIEluZGV4T2YxNkJ5dGVzLFxuICBNYXRlcmlhbFNJRCxcbiAgTWF0ZXJpYWxUSUQsXG4gIE1hdGVyaWFsVUlELFxufSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL0NvbmZpZyc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vY29yZS9NZW1vcnlNYW5hZ2VyJztcbmltcG9ydCB7IEJ1ZmZlclVzZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0J1ZmZlclVzZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5kZXgsIFNoYWRlclNlbWFudGljc05hbWUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgY2FsY0FsaWduZWRCeXRlTGVuZ3RoLCBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBNYXRoQ2xhc3NVdGlsIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoQ2xhc3NVdGlsJztcbmltcG9ydCB0eXBlIHsgQWNjZXNzb3IgfSBmcm9tICcuLi8uLi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHR5cGUgeyBCdWZmZXJWaWV3IH0gZnJvbSAnLi4vLi4vbWVtb3J5L0J1ZmZlclZpZXcnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi8uLi9taXNjL0lzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL21pc2MvTG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfSBmcm9tICcuL0Fic3RyYWN0TWF0ZXJpYWxDb250ZW50JztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IE1hdGVyaWFsVHlwZU5hbWUgfSBmcm9tICcuL01hdGVyaWFsVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTWF0ZXJpYWxSZXBvc2l0b3J5IHtcbiAgLy8vXG4gIC8vLyBzdGF0aWMgbWVtYmVyc1xuICAvLy9cbiAgcHJpdmF0ZSBzdGF0aWMgX19tYXRlcmlhbE1hcDogTWFwPE1hdGVyaWFsVUlELCBXZWFrUmVmPE1hdGVyaWFsPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9faW5zdGFuY2VzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgTWFwPE1hdGVyaWFsU0lELCBXZWFrUmVmPE1hdGVyaWFsPj4+ID1cbiAgICBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fbWF0ZXJpYWxUaWRzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgTWF0ZXJpYWxUSUQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyBfX21hdGVyaWFsSW5zdGFuY2VDb3VudE9mVHlwZTogTWFwPE1hdGVyaWFsVHlwZU5hbWUsIENvdW50PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19tYXRlcmlhbE5vZGVzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQgfCB1bmRlZmluZWQ+ID1cbiAgICBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fbWF4SW5zdGFuY2VzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgQ291bnQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyBfX2J1ZmZlclZpZXdzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgQnVmZmVyVmlldz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fYWNjZXNzb3JzOiBNYXA8TWF0ZXJpYWxUeXBlTmFtZSwgTWFwPFNoYWRlclNlbWFudGljc05hbWUsIEFjY2Vzc29yPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fbWF0ZXJpYWxUaWRDb3VudCA9IC0xO1xuICBwcml2YXRlIHN0YXRpYyBfX21hdGVyaWFsVWlkQ291bnQgPSAtMTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBtYXRlcmlhbCB0eXBlLlxuICAgKiBAcGFyYW0gbWF0ZXJpYWxUeXBlTmFtZSBUaGUgdHlwZSBuYW1lIG9mIHRoZSBtYXRlcmlhbC5cbiAgICogQHBhcmFtIG1hdGVyaWFsTm9kZXMgVGhlIG1hdGVyaWFsIG5vZGVzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0gbWF4SW5zdGFuY2VzTnVtYmVyIFRoZSBtYXhpbXVtIG51bWJlciB0byBjcmVhdGUgdGhlIG1hdGVyaWFsIGluc3RhbmNlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJNYXRlcmlhbChcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCxcbiAgICBtYXhJbnN0YW5jZU51bWJlcjogbnVtYmVyID0gQ29uZmlnLm1heE1hdGVyaWFsSW5zdGFuY2VGb3JFYWNoVHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIU1hdGVyaWFsUmVwb3NpdG9yeS5fX21hdGVyaWFsTm9kZXMuaGFzKG1hdGVyaWFsVHlwZU5hbWUpKSB7XG4gICAgICBNYXRlcmlhbFJlcG9zaXRvcnkuX19yZWdpc3RlcklubmVyKG1hdGVyaWFsVHlwZU5hbWUsIG1hdGVyaWFsTm9kZSwgbWF4SW5zdGFuY2VOdW1iZXIpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc29sZS5pbmZvKGAke21hdGVyaWFsVHlwZU5hbWV9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcmNlUmVnaXN0ZXJNYXRlcmlhbChcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCxcbiAgICBtYXhJbnN0YW5jZU51bWJlcjogbnVtYmVyID0gQ29uZmlnLm1heE1hdGVyaWFsSW5zdGFuY2VGb3JFYWNoVHlwZVxuICApOiBib29sZWFuIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJJbm5lcihtYXRlcmlhbFR5cGVOYW1lLCBtYXRlcmlhbE5vZGUsIG1heEluc3RhbmNlTnVtYmVyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNSZWdpc3RlcmVkTWF0ZXJpYWxUeXBlKG1hdGVyaWFsVHlwZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXRlcmlhbE5vZGVzLmhhcyhtYXRlcmlhbFR5cGVOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWF0ZXJpYWxCeU1hdGVyaWFsVWlkKG1hdGVyaWFsVWlkOiBNYXRlcmlhbFNJRCk6IE1hdGVyaWFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fX21hdGVyaWFsTWFwLmdldChtYXRlcmlhbFVpZCk/LmRlcmVmKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEFsbE1hdGVyaWFscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXRlcmlhbE1hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIE1hdGVyaWFsIGNsYXNzLlxuICAgKiBAcGFyYW0gbWF0ZXJpYWxUeXBlTmFtZSBUaGUgbWF0ZXJpYWwgdHlwZSB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSBtYXRlcmlhbE5vZGVzXyBUaGUgbWF0ZXJpYWwgbm9kZXMgdG8gYWRkIHRvIHRoZSBjcmVhdGVkIG1hdGVyaWFsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVNYXRlcmlhbChcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudFxuICApOiBNYXRlcmlhbCB7XG4gICAgLy8gZ2V0IHRoZSBjb3VudCBvZiBpbnN0YW5jZSBmb3IgdGhlIG1hdGVyaWFsIHR5cGVcbiAgICBsZXQgY291bnRPZlRoaXNUeXBlID0gTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF0ZXJpYWxJbnN0YW5jZUNvdW50T2ZUeXBlLmdldChcbiAgICAgIG1hdGVyaWFsVHlwZU5hbWVcbiAgICApIGFzIG51bWJlcjtcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbChcbiAgICAgIE1hdGVyaWFsUmVwb3NpdG9yeS5fX21hdGVyaWFsVGlkcy5nZXQobWF0ZXJpYWxUeXBlTmFtZSkhLFxuICAgICAgKytNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXRlcmlhbFVpZENvdW50LFxuICAgICAgY291bnRPZlRoaXNUeXBlKyssXG4gICAgICBtYXRlcmlhbFR5cGVOYW1lLFxuICAgICAgbWF0ZXJpYWxOb2RlXG4gICAgKTtcblxuICAgIHRoaXMuX19pbml0aWFsaXplTWF0ZXJpYWwobWF0ZXJpYWwsIGNvdW50T2ZUaGlzVHlwZSk7XG5cbiAgICByZXR1cm4gbWF0ZXJpYWw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRnVsbE9yT3Zlck9mVGhpc01hdGVyaWFsVHlwZShtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb3VudE9mVGhpc1R5cGUgPSBNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXRlcmlhbEluc3RhbmNlQ291bnRPZlR5cGUuZ2V0KG1hdGVyaWFsVHlwZU5hbWUpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoY291bnRPZlRoaXNUeXBlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb3VudE9mVGhpc1R5cGUgPSBNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXhJbnN0YW5jZXMuZ2V0KG1hdGVyaWFsVHlwZU5hbWUpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QobWF4Q291bnRPZlRoaXNUeXBlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudE9mVGhpc1R5cGUgPj0gbWF4Q291bnRPZlRoaXNUeXBlO1xuICB9XG5cbiAgc3RhdGljIGlzTWF0ZXJpYWxDb21wYXRpYmxlKFxuICAgIGN1cnJlbnRNYXRlcmlhbDogTWF0ZXJpYWwsXG4gICAgbmV3TWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBleGlzdGluZ01hdGVyaWFsID0gTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF0ZXJpYWxNYXBcbiAgICAgIC5nZXQoY3VycmVudE1hdGVyaWFsLm1hdGVyaWFsVUlEKVxuICAgICAgPy5kZXJlZigpO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoZXhpc3RpbmdNYXRlcmlhbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1NoYWRlclNlbWFudGljc0luZm9MaXN0ID0gQXJyYXkuZnJvbShleGlzdGluZ01hdGVyaWFsLl9hbGxGaWVsZHNJbmZvLnZhbHVlcygpKTtcbiAgICBjb25zdCBuZXdTaGFkZXJTZW1hbnRpY3NJbmZvTGlzdCA9IG5ld01hdGVyaWFsTm9kZS5fc2VtYW50aWNzSW5mb0FycmF5O1xuICAgIGlmIChcbiAgICAgIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nU2hhZGVyU2VtYW50aWNzSW5mb0xpc3QpICE9PSBKU09OLnN0cmluZ2lmeShuZXdTaGFkZXJTZW1hbnRpY3NJbmZvTGlzdClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIE1hdGVyaWFsIE1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19pbml0aWFsaXplTWF0ZXJpYWwobWF0ZXJpYWw6IE1hdGVyaWFsLCBjb3VudE9mVGhpc1R5cGU6IENvdW50KSB7XG4gICAgLy8gU2V0IG5hbWVcbiAgICBtYXRlcmlhbC50cnlUb1NldFVuaXF1ZU5hbWUobWF0ZXJpYWwuX19tYXRlcmlhbFR5cGVOYW1lLCB0cnVlKTtcblxuICAgIC8vIFNldCBtZXRhIGRhdGEgdG8gTWF0ZXJpYWxSZXBvc2l0b3J5XG4gICAge1xuICAgICAgTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF0ZXJpYWxNYXAuc2V0KG1hdGVyaWFsLm1hdGVyaWFsVUlELCBuZXcgV2Vha1JlZihtYXRlcmlhbCkpO1xuXG4gICAgICAvLyBzZXQgdGhpcyBtYXRlcmlhbCBpbnN0YW5jZSBmb3IgdGhlIG1hdGVyaWFsIHR5cGVcbiAgICAgIGxldCBtYXAgPSBNYXRlcmlhbFJlcG9zaXRvcnkuX19pbnN0YW5jZXMuZ2V0KG1hdGVyaWFsLl9fbWF0ZXJpYWxUeXBlTmFtZSk7XG4gICAgICBpZiAoSXMubm90LmV4aXN0KG1hcCkpIHtcbiAgICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBNYXRlcmlhbFJlcG9zaXRvcnkuX19pbnN0YW5jZXMuc2V0KG1hdGVyaWFsLm1hdGVyaWFsVHlwZU5hbWUsIG1hcCk7XG4gICAgICB9XG4gICAgICBtYXAuc2V0KG1hdGVyaWFsLm1hdGVyaWFsU0lELCBuZXcgV2Vha1JlZihtYXRlcmlhbCkpO1xuXG4gICAgICAvLyBzZXQgdGhlIGNvdW50IG9mIGluc3RhbmNlIGZvciB0aGUgbWF0ZXJpYWwgdHlwZVxuICAgICAgTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF0ZXJpYWxJbnN0YW5jZUNvdW50T2ZUeXBlLnNldChcbiAgICAgICAgbWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZSxcbiAgICAgICAgY291bnRPZlRoaXNUeXBlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNldCBzZW1hbnRpY3NJbmZvIGFuZCBzaGFkZXJWYXJpYWJsZXMgdG8gdGhlIG1hdGVyaWFsIGluc3RhbmNlXG4gICAgaWYgKElzLmV4aXN0KG1hdGVyaWFsLl9tYXRlcmlhbENvbnRlbnQpKSB7XG4gICAgICBjb25zdCBzZW1hbnRpY3NJbmZvQXJyYXkgPSBtYXRlcmlhbC5fbWF0ZXJpYWxDb250ZW50Ll9zZW1hbnRpY3NJbmZvQXJyYXk7XG4gICAgICBjb25zdCBhY2Nlc3Nvck1hcCA9IE1hdGVyaWFsUmVwb3NpdG9yeS5fX2FjY2Vzc29ycy5nZXQobWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZSk7XG4gICAgICBzZW1hbnRpY3NJbmZvQXJyYXkuZm9yRWFjaCgoc2VtYW50aWNzSW5mbykgPT4ge1xuICAgICAgICBtYXRlcmlhbC5fYWxsRmllbGRzSW5mby5zZXQoc2VtYW50aWNzSW5mby5zZW1hbnRpYywgc2VtYW50aWNzSW5mbyk7XG4gICAgICAgIGlmICghc2VtYW50aWNzSW5mby5zb2xvRGF0dW0pIHtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NvciA9IGFjY2Vzc29yTWFwIS5nZXQoc2VtYW50aWNzSW5mby5zZW1hbnRpYykgYXMgQWNjZXNzb3I7XG4gICAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IGFjY2Vzc29yLnRha2VPbmUoKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICAgICAgY29uc3Qgc2hhZGVyVmFyaWFibGUgPSB7XG4gICAgICAgICAgICBpbmZvOiBzZW1hbnRpY3NJbmZvLFxuICAgICAgICAgICAgdmFsdWU6IE1hdGhDbGFzc1V0aWwuaW5pdFdpdGhGbG9hdDMyQXJyYXkoXG4gICAgICAgICAgICAgIHNlbWFudGljc0luZm8uaW5pdGlhbFZhbHVlLFxuICAgICAgICAgICAgICBzZW1hbnRpY3NJbmZvLmluaXRpYWxWYWx1ZSxcbiAgICAgICAgICAgICAgdHlwZWRBcnJheSxcbiAgICAgICAgICAgICAgc2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBtYXRlcmlhbC5fYWxsRmllbGRWYXJpYWJsZXMuc2V0KHNlbWFudGljc0luZm8uc2VtYW50aWMsIHNoYWRlclZhcmlhYmxlKTtcbiAgICAgICAgICBpZiAoIXNlbWFudGljc0luZm8uaXNJbnRlcm5hbFNldHRpbmcpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLl9hdXRvRmllbGRWYXJpYWJsZXNPbmx5LnNldChzZW1hbnRpY3NJbmZvLnNlbWFudGljLCBzaGFkZXJWYXJpYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mTWF0ZXJpYWwoXG4gICAgbWF0ZXJpYWxUeXBlTmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZTogU2hhZGVyU2VtYW50aWNzTmFtZVxuICApOiBJbmRleE9mMTZCeXRlcyB7XG4gICAgY29uc3QgbWFwID0gTWF0ZXJpYWxSZXBvc2l0b3J5Ll9faW5zdGFuY2VzLmdldChtYXRlcmlhbFR5cGVOYW1lKSE7XG4gICAgY29uc3QgbWF0ZXJpYWxSZWYgPSBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSkuZmluZCgobSkgPT4gbS5kZXJlZigpICE9PSB1bmRlZmluZWQpOyAvLyBmaW5kIGFuIGFjdHVhbCBleGlzdCBtYXRlcmlhbFxuICAgIGlmIChJcy5ub3QuZXhpc3QobWF0ZXJpYWxSZWY/LmRlcmVmKCkpKSB7XG4gICAgICBMb2dnZXIud2FybihcbiAgICAgICAgYE1hdGVyaWFsIGlzIG5vdCBmb3VuZC4gZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mTWF0ZXJpYWwgcmV0dXJucyBpbnZhbGlkIDAgdmFsdWUuIG1hdGVyaWFsVHlwZU5hbWU6ICR7bWF0ZXJpYWxUeXBlTmFtZX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IG1hdGVyaWFsID0gbWF0ZXJpYWxSZWYuZGVyZWYoKSE7XG4gICAgY29uc3QgaW5mbyA9IG1hdGVyaWFsLl9hbGxGaWVsZHNJbmZvLmdldChwcm9wZXJ0eU5hbWUpITtcbiAgICBpZiAoaW5mby5zb2xvRGF0dW0pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWF0ZXJpYWwuX3NvbG9EYXR1bUZpZWxkcy5nZXQobWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZSkhLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgICAgcmV0dXJuICh2YWx1ZSEudmFsdWUuX3YgYXMgRmxvYXQzMkFycmF5KS5ieXRlT2Zmc2V0IC8gNCAvIDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLl9fYWNjZXNzb3JzLmdldChtYXRlcmlhbFR5cGVOYW1lKTtcbiAgICAgIGNvbnN0IGFjY2Vzc29yID0gcHJvcGVydGllcyEuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgICByZXR1cm4gYWNjZXNzb3IhLmJ5dGVPZmZzZXRJbkJ1ZmZlciAvIDQgLyA0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fcmVnaXN0ZXJJbm5lcihcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgbWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCxcbiAgICBtYXhJbnN0YW5jZU51bWJlcjogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IG1hdGVyaWFsVGlkID0gKytNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXRlcmlhbFRpZENvdW50O1xuICAgIE1hdGVyaWFsUmVwb3NpdG9yeS5fX21hdGVyaWFsTm9kZXMuc2V0KG1hdGVyaWFsVHlwZU5hbWUsIG1hdGVyaWFsTm9kZSk7XG4gICAgTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF0ZXJpYWxUaWRzLnNldChtYXRlcmlhbFR5cGVOYW1lLCBtYXRlcmlhbFRpZCk7XG4gICAgTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF4SW5zdGFuY2VzLnNldChtYXRlcmlhbFR5cGVOYW1lLCBtYXhJbnN0YW5jZU51bWJlcik7XG5cbiAgICBNYXRlcmlhbFJlcG9zaXRvcnkuX19hbGxvY2F0ZUJ1ZmZlclZpZXcobWF0ZXJpYWxUeXBlTmFtZSwgbWF0ZXJpYWxOb2RlKTtcbiAgICBNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXRlcmlhbEluc3RhbmNlQ291bnRPZlR5cGUuc2V0KG1hdGVyaWFsVHlwZU5hbWUsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19hbGxvY2F0ZUJ1ZmZlclZpZXcoXG4gICAgbWF0ZXJpYWxUeXBlTmFtZTogc3RyaW5nLFxuICAgIG1hdGVyaWFsTm9kZTogQWJzdHJhY3RNYXRlcmlhbENvbnRlbnRcbiAgKSB7XG4gICAgLy8gQ2FsY3VsYXRlIGEgQnVmZmVyVmlldyBzaXplIHRvIHRha2VcbiAgICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcbiAgICBjb25zdCBhbGlnbmVkQnl0ZUxlbmd0aEFuZFNlbWFudGljSW5mb0FycmF5OiB7XG4gICAgICBhbGlnbmVkQnl0ZTogbnVtYmVyO1xuICAgICAgc2VtYW50aWNJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2VtYW50aWNJbmZvIG9mIG1hdGVyaWFsTm9kZS5fc2VtYW50aWNzSW5mb0FycmF5KSB7XG4gICAgICBjb25zdCBhbGlnbmVkQnl0ZUxlbmd0aCA9IGNhbGNBbGlnbmVkQnl0ZUxlbmd0aChzZW1hbnRpY0luZm8pO1xuICAgICAgbGV0IGRhdGFDb3VudCA9IDE7XG4gICAgICBpZiAoIXNlbWFudGljSW5mby5zb2xvRGF0dW0pIHtcbiAgICAgICAgZGF0YUNvdW50ID0gTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF4SW5zdGFuY2VzLmdldChtYXRlcmlhbFR5cGVOYW1lKSE7XG4gICAgICB9XG5cbiAgICAgIHRvdGFsQnl0ZUxlbmd0aCArPSBhbGlnbmVkQnl0ZUxlbmd0aCAqIGRhdGFDb3VudDtcbiAgICAgIGFsaWduZWRCeXRlTGVuZ3RoQW5kU2VtYW50aWNJbmZvQXJyYXkucHVzaCh7XG4gICAgICAgIGFsaWduZWRCeXRlOiBhbGlnbmVkQnl0ZUxlbmd0aCxcbiAgICAgICAgc2VtYW50aWNJbmZvOiBzZW1hbnRpY0luZm8sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX19hY2Nlc3NvcnMuaGFzKG1hdGVyaWFsVHlwZU5hbWUpKSB7XG4gICAgICB0aGlzLl9fYWNjZXNzb3JzLnNldChtYXRlcmlhbFR5cGVOYW1lLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIHRha2UgQSBCdWZmZXIgVmlldyBmcm9tIEdQVUluc3RhbmNlRGF0YSBidWZmZXIsIG9yIHJldXNlIGl0IGlmIGl0IGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgYnVmZmVyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZU9yR2V0QnVmZmVyKEJ1ZmZlclVzZS5HUFVJbnN0YW5jZURhdGEpO1xuICAgIGxldCBidWZmZXJWaWV3O1xuICAgIGlmICh0aGlzLl9fYnVmZmVyVmlld3MuaGFzKG1hdGVyaWFsVHlwZU5hbWUpKSB7XG4gICAgICBidWZmZXJWaWV3ID0gdGhpcy5fX2J1ZmZlclZpZXdzLmdldChtYXRlcmlhbFR5cGVOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVmZmVyLnRha2VCdWZmZXJWaWV3KHtcbiAgICAgICAgYnl0ZUxlbmd0aFRvTmVlZDogdG90YWxCeXRlTGVuZ3RoLFxuICAgICAgICBieXRlU3RyaWRlOiAwLFxuICAgICAgfSk7XG4gICAgICBidWZmZXJWaWV3ID0gcmVzdWx0LnVud3JhcEZvcmNlKCk7XG4gICAgICB0aGlzLl9fYnVmZmVyVmlld3Muc2V0KG1hdGVyaWFsVHlwZU5hbWUsIGJ1ZmZlclZpZXcpO1xuICAgIH1cblxuICAgIC8vIFRha2UgQWNjZXNzb3JzIGFuZCByZWdpc3RlciBpdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxpZ25lZEJ5dGVMZW5ndGhBbmRTZW1hbnRpY0luZm9BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYWxpZ25lZEJ5dGUgPSBhbGlnbmVkQnl0ZUxlbmd0aEFuZFNlbWFudGljSW5mb0FycmF5W2ldLmFsaWduZWRCeXRlO1xuICAgICAgY29uc3Qgc2VtYW50aWNJbmZvID0gYWxpZ25lZEJ5dGVMZW5ndGhBbmRTZW1hbnRpY0luZm9BcnJheVtpXS5zZW1hbnRpY0luZm87XG5cbiAgICAgIGxldCBjb3VudCA9IDE7XG4gICAgICBpZiAoIXNlbWFudGljSW5mby5zb2xvRGF0dW0pIHtcbiAgICAgICAgY291bnQgPSBNYXRlcmlhbFJlcG9zaXRvcnkuX19tYXhJbnN0YW5jZXMuZ2V0KG1hdGVyaWFsVHlwZU5hbWUpITtcbiAgICAgIH1cbiAgICAgIGxldCBtYXhBcnJheUxlbmd0aCA9IHNlbWFudGljSW5mby5hcnJheUxlbmd0aDtcbiAgICAgIGlmIChDb21wb3NpdGlvblR5cGUuaXNBcnJheShzZW1hbnRpY0luZm8uY29tcG9zaXRpb25UeXBlKSAmJiBtYXhBcnJheUxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgIG1heEFycmF5TGVuZ3RoID0gMTAwO1xuICAgICAgfVxuICAgICAgLy8gdGFrZSBhbiBBY2Nlc3NvclxuICAgICAgY29uc3QgYWNjZXNzb3IgPSBidWZmZXJWaWV3IVxuICAgICAgICAudGFrZUFjY2Vzc29yKHtcbiAgICAgICAgICBjb21wb3NpdGlvblR5cGU6IHNlbWFudGljSW5mby5jb21wb3NpdGlvblR5cGUsXG4gICAgICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICBjb3VudDogY291bnQsXG4gICAgICAgICAgYnl0ZVN0cmlkZTogYWxpZ25lZEJ5dGUsXG4gICAgICAgICAgYXJyYXlMZW5ndGg6IG1heEFycmF5TGVuZ3RoLFxuICAgICAgICB9KVxuICAgICAgICAudW53cmFwRm9yY2UoKTtcblxuICAgICAgaWYgKHNlbWFudGljSW5mby5zb2xvRGF0dW0pIHtcbiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IGFjY2Vzc29yLnRha2VPbmUoKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICAgIGxldCBtYXAgPSBNYXRlcmlhbC5fc29sb0RhdHVtRmllbGRzLmdldChtYXRlcmlhbFR5cGVOYW1lKTtcbiAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7XG4gICAgICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgIE1hdGVyaWFsLl9zb2xvRGF0dW1GaWVsZHMuc2V0KG1hdGVyaWFsVHlwZU5hbWUsIG1hcCk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuc2V0KHNlbWFudGljSW5mby5zZW1hbnRpYywge1xuICAgICAgICAgIGluZm86IHNlbWFudGljSW5mbyxcbiAgICAgICAgICB2YWx1ZTogTWF0aENsYXNzVXRpbC5pbml0V2l0aEZsb2F0MzJBcnJheShcbiAgICAgICAgICAgIHNlbWFudGljSW5mby5pbml0aWFsVmFsdWUsXG4gICAgICAgICAgICBzZW1hbnRpY0luZm8uaW5pdGlhbFZhbHVlLFxuICAgICAgICAgICAgdHlwZWRBcnJheSxcbiAgICAgICAgICAgIHNlbWFudGljSW5mby5jb21wb3NpdGlvblR5cGVcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNldCBhbiBhY2Nlc3NvciB0byB0aGlzLl9fYWNjZXNzb3JzXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLl9fYWNjZXNzb3JzLmdldChtYXRlcmlhbFR5cGVOYW1lKSE7XG4gICAgICAgIHByb3BlcnRpZXMuc2V0KHNlbWFudGljSW5mby5zZW1hbnRpYywgYWNjZXNzb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBidWZmZXJWaWV3O1xuICB9XG5cbiAgc3RhdGljIF9tYWtlU2hhZGVySW52YWxpZGF0ZVRvQWxsTWF0ZXJpYWxzKCkge1xuICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgTWF0ZXJpYWxSZXBvc2l0b3J5Ll9fbWF0ZXJpYWxNYXAudmFsdWVzKCkpIHtcbiAgICAgIG1hdGVyaWFsLmRlcmVmKCk/Lm1ha2VTaGFkZXJzSW52YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuXG5leHBvcnQgdHlwZSBNYXRlcmlhbFR5cGVOYW1lID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgU2hhZGVyVmFyaWFibGUgPSB7XG4gIHZhbHVlOiBhbnk7XG4gIGluZm86IFNoYWRlclNlbWFudGljc0luZm87XG59O1xuIiwiaW1wb3J0IHsgU2hhZGVyTm9kZVVJRCwgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi9BYnN0cmFjdFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgSW5kZXggfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJUeXBlLCBTaGFkZXJUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbW1vblNoYWRlclBhcnQgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJzL0NvbW1vblNoYWRlclBhcnQnO1xuaW1wb3J0IHsgQ29uc3RhbnRTY2FsYXJWYXJpYWJsZVNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9Db25zdGFudFNjYWxhclZhcmlhYmxlU2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBDb25zdGFudFZlY3RvcjJWYXJpYWJsZVNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9Db25zdGFudFZlY3RvcjJWYXJpYWJsZVNoYWRlck5vZGUnO1xuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMic7XG5pbXBvcnQgeyBDb25zdGFudFZlY3RvcjNWYXJpYWJsZVNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9Db25zdGFudFZlY3RvcjNWYXJpYWJsZVNoYWRlck5vZGUnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IENvbnN0YW50VmVjdG9yNFZhcmlhYmxlU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL0NvbnN0YW50VmVjdG9yNFZhcmlhYmxlU2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBVbmlmb3JtRGF0YVNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9Vbmlmb3JtRGF0YVNoYWRlck5vZGUnO1xuaW1wb3J0IHsgQWRkU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL0FkZFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgTm9ybWFsaXplU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL05vcm1hbGl6ZVNoYWRlck5vZGUnO1xuaW1wb3J0IHsgRG90UHJvZHVjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9Eb3RQcm9kdWN0U2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBNdWx0aXBseVNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9NdWx0aXBseVNoYWRlck5vZGUnO1xuaW1wb3J0IHsgQXR0cmlidXRlQ29sb3JTaGFkZXJOb2RlIH0gZnJvbSAnLi4vbm9kZXMvQXR0cmlidXRlQ29sb3JTaGFkZXJOb2RlJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5vcm1hbFNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9BdHRyaWJ1dGVOb3JtYWxTaGFkZXJOb2RlJztcbmltcG9ydCB7IEF0dHJpYnV0ZVBvc2l0aW9uU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL0F0dHJpYnV0ZVBvc2l0aW9uU2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUZXhjb29yZFNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9BdHRyaWJ1dGVUZXhjb29yZFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgV29ybGRNYXRyaXhTaGFkZXJOb2RlIH0gZnJvbSAnLi4vbm9kZXMvV29ybGRNYXRyaXhTaGFkZXJOb2RlJztcbmltcG9ydCB7IFZpZXdNYXRyaXhTaGFkZXJOb2RlIH0gZnJvbSAnLi4vbm9kZXMvVmlld01hdHJpeFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgUHJvamVjdGlvbk1hdHJpeFNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9Qcm9qZWN0aW9uTWF0cml4U2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBOb3JtYWxNYXRyaXhTaGFkZXJOb2RlIH0gZnJvbSAnLi4vbm9kZXMvTm9ybWFsTWF0cml4U2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBHcmVhdGVyU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL0dyZWF0ZXJTaGFkZXJOb2RlJztcbmltcG9ydCB7IE91dFBvc2l0aW9uU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL091dFBvc2l0aW9uU2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBPdXRDb2xvclNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9PdXRDb2xvclNoYWRlck5vZGUnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi9zeXN0ZW0nO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFRyYW5zZm9ybVNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9UcmFuc2Zvcm1TaGFkZXJOb2RlJztcbmltcG9ydCB7IE1lcmdlVmVjdG9yU2hhZGVyTm9kZSwgU3BsaXRWZWN0b3JTaGFkZXJOb2RlIH0gZnJvbSAnLi4vbm9kZXMnO1xuaW1wb3J0IHsgU2luU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL1NpblNoYWRlck5vZGUnO1xuaW1wb3J0IHsgU3RlcFNoYWRlck5vZGUgfSBmcm9tICcuLi9ub2Rlcy9TdGVwU2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBUaW1lU2hhZGVyTm9kZSB9IGZyb20gJy4uL25vZGVzL1RpbWVTaGFkZXJOb2RlJztcbmltcG9ydCB7IFNtb290aFN0ZXBTaGFkZXJOb2RlIH0gZnJvbSAnLi4vbm9kZXMvU21vb3RoU3RlcFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgU2hhZGVyTm9kZUpzb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9TaGFkZXJOb2RlSnNvbic7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9taXNjL0xvZ2dlcic7XG5cbi8qKlxuICogU2hhZGVyR3JhcGhSZXNvbHZlciBpcyBhIGNsYXNzIHRoYXQgcmVzb2x2ZXMgdGhlIHNoYWRlciBub2RlIGdyYXBoIGFuZCBnZW5lcmF0ZXMgc2hhZGVyIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFkZXJHcmFwaFJlc29sdmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlcnRleCBzaGFkZXIgY29kZSBmcm9tIHRoZSBnaXZlbiB2ZXJ0ZXggbm9kZXMuXG4gICAqIEBwYXJhbSB2ZXJ0ZXhOb2RlcyAtIFZlcnRleCBub2Rlc1xuICAgKiBAcGFyYW0gdmFyeWluZ05vZGVzIC0gVmFyeWluZyBub2Rlc1xuICAgKiBAcGFyYW0gaXNGdWxsVmVyc2lvbiAtIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYSBmdWxsIHZlcnNpb24gb2YgdGhlIHNoYWRlciBjb2RlXG4gICAqIEByZXR1cm5zIFZlcnRleCBzaGFkZXIgY29kZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVZlcnRleFNoYWRlckNvZGUoXG4gICAgdmVydGV4Tm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdLFxuICAgIHZhcnlpbmdOb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10sXG4gICAgaXNGdWxsVmVyc2lvbjogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgY29uc3Qgc2hhZGVyTm9kZXMgPSB2ZXJ0ZXhOb2Rlcy5jb25jYXQoKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsaWQgPSB0aGlzLl9fdmFsaWRhdGVTaGFkZXJOb2RlcyhzaGFkZXJOb2Rlcyk7XG4gICAgLy8gaWYgKCFpc1ZhbGlkKSB7XG4gICAgLy8gICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIH1cblxuICAgIC8vIFRvcG9sb2dpY2FsIFNvcnRpbmdcbiAgICBjb25zdCBzb3J0ZWRTaGFkZXJOb2RlcyA9IHRoaXMuX19zb3J0VG9wb2xvZ2ljYWxseShzaGFkZXJOb2Rlcyk7XG4gICAgLy8gY29uc3Qgc29ydGVkVmFyeWluZ05vZGVzID0gdGhpcy5fX3NvcnRUb3BvbG9naWNhbGx5KHZhcnlpbmdOb2Rlcyk7XG5cbiAgICAvLyBBZGQgYWRkaXRpb25hbCBmdW5jdGlvbnMgYnkgc3lzdGVtXG4gICAgbGV0IHZlcnRleFNoYWRlclByZXJlcXVpc2l0ZXMgPSAnJztcblxuICAgIGNvbnN0IG5vZGVzID0gc29ydGVkU2hhZGVyTm9kZXMuY29uY2F0KHZhcnlpbmdOb2Rlcyk7XG5cbiAgICBpZiAoaXNGdWxsVmVyc2lvbikge1xuICAgICAgdmVydGV4U2hhZGVyUHJlcmVxdWlzaXRlcyArPSBDb21tb25TaGFkZXJQYXJ0LmdldFZlcnRleFByZXJlcXVpc2l0ZXMobm9kZXMpO1xuICAgIH1cblxuICAgIGxldCBzaGFkZXJCb2R5ID0gJyc7XG5cbiAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uc1xuICAgIHNoYWRlckJvZHkgKz0gU2hhZGVyR3JhcGhSZXNvbHZlci5fX2dldEZ1bmN0aW9uRGVmaW5pdGlvbihcbiAgICAgIC8vIHNvcnRlZFNoYWRlck5vZGVzLFxuICAgICAgc29ydGVkU2hhZGVyTm9kZXMuY29uY2F0KHZhcnlpbmdOb2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSAhPT0gJ0ZyYWdtZW50JykpLFxuICAgICAgU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXJcbiAgICApO1xuXG4gICAgLy8gbWFpbiBwcm9jZXNzXG4gICAgdHJ5IHtcbiAgICAgIHNoYWRlckJvZHkgKz0gU2hhZGVyR3JhcGhSZXNvbHZlci5fX2NvbnN0cnVjdFNoYWRlcldpdGhOb2Rlcyhub2RlcywgdHJ1ZSwgaXNGdWxsVmVyc2lvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgTG9nZ2VyLmVycm9yKGUgYXMgc3RyaW5nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhZGVyID0gdmVydGV4U2hhZGVyUHJlcmVxdWlzaXRlcyArIHNoYWRlckJvZHk7XG5cbiAgICByZXR1cm4gc2hhZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBpeGVsIHNoYWRlciBjb2RlIGZyb20gdGhlIGdpdmVuIHBpeGVsIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcGl4ZWxOb2RlcyAtIFBpeGVsIG5vZGVzXG4gICAqIEBwYXJhbSBpc0Z1bGxWZXJzaW9uIC0gV2hldGhlciB0byBnZW5lcmF0ZSBhIGZ1bGwgdmVyc2lvbiBvZiB0aGUgc2hhZGVyIGNvZGVcbiAgICogQHJldHVybnMgUGl4ZWwgc2hhZGVyIGNvZGVcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVQaXhlbFNoYWRlckNvZGUocGl4ZWxOb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10sIGlzRnVsbFZlcnNpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3Qgc2hhZGVyTm9kZXMgPSBwaXhlbE5vZGVzLmNvbmNhdCgpO1xuXG4gICAgLy8gY29uc3QgaXNWYWxpZCA9IHRoaXMuX192YWxpZGF0ZVNoYWRlck5vZGVzKHNoYWRlck5vZGVzKTtcbiAgICAvLyBpZiAoIWlzVmFsaWQpIHtcbiAgICAvLyAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gfVxuXG4gICAgLy8gVG9wb2xvZ2ljYWwgU29ydGluZ1xuICAgIGNvbnN0IHNvcnRlZFNoYWRlck5vZGVzID0gdGhpcy5fX3NvcnRUb3BvbG9naWNhbGx5KHNoYWRlck5vZGVzKTtcblxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBieSBzeXN0ZW1cbiAgICBsZXQgcGl4ZWxTaGFkZXJQcmVyZXF1aXNpdGVzID0gJyc7XG4gICAgaWYgKGlzRnVsbFZlcnNpb24pIHtcbiAgICAgIHBpeGVsU2hhZGVyUHJlcmVxdWlzaXRlcyArPSBDb21tb25TaGFkZXJQYXJ0LmdldFBpeGVsUHJlcmVxdWlzaXRlcyhzb3J0ZWRTaGFkZXJOb2Rlcyk7XG4gICAgfVxuICAgIGxldCBzaGFkZXJCb2R5ID0gJyc7XG5cbiAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uc1xuICAgIHNoYWRlckJvZHkgKz0gU2hhZGVyR3JhcGhSZXNvbHZlci5fX2dldEZ1bmN0aW9uRGVmaW5pdGlvbihcbiAgICAgIHNvcnRlZFNoYWRlck5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZS5nZXRTaGFkZXJTdGFnZSgpICE9PSAnVmVydGV4JyksXG4gICAgICBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyXG4gICAgKTtcblxuICAgIC8vIG1haW4gcHJvY2Vzc1xuICAgIHRyeSB7XG4gICAgICBzaGFkZXJCb2R5ICs9IFNoYWRlckdyYXBoUmVzb2x2ZXIuX19jb25zdHJ1Y3RTaGFkZXJXaXRoTm9kZXMoXG4gICAgICAgIHNvcnRlZFNoYWRlck5vZGVzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgaXNGdWxsVmVyc2lvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoZSBhcyBzdHJpbmcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFkZXIgPSBwaXhlbFNoYWRlclByZXJlcXVpc2l0ZXMgKyBzaGFkZXJCb2R5O1xuXG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fdmFsaWRhdGVTaGFkZXJOb2RlcyhzaGFkZXJOb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10pIHtcbiAgICBjb25zdCBzaGFkZXJOb2RlVWlkczogU2hhZGVyTm9kZVVJRFtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkZXJOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2hhZGVyTm9kZSA9IHNoYWRlck5vZGVzW2ldO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzaGFkZXJOb2RlLmlucHV0Q29ubmVjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgaW5wdXRDb25uZWN0aW9uID0gc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zW2pdO1xuICAgICAgICBpZiAoaW5wdXRDb25uZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU29ydCBzaGFkZXIgbm9kZXMgdG9wb2xvZ2ljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIHNoYWRlck5vZGVzIC0gU2hhZGVyIG5vZGVzIHRvIHNvcnRcbiAgICogQHJldHVybnMgU29ydGVkIHNoYWRlciBub2Rlc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19zb3J0VG9wb2xvZ2ljYWxseShzaGFkZXJOb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10pIHtcbiAgICBjb25zdCBzb3J0ZWROb2RlQXJyYXk6IEFic3RyYWN0U2hhZGVyTm9kZVtdID0gW107XG4gICAgY29uc3QgaW5wdXROdW1BcnJheTogSW5kZXhbXSA9IFtdO1xuXG4gICAgLy8gY2FsY3VsYXRlIGlucHV0TnVtQXJyYXlcbiAgICBjb25zdCBxdWV1ZTogQWJzdHJhY3RTaGFkZXJOb2RlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYWRlck5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzaGFkZXJOb2RlID0gc2hhZGVyTm9kZXNbaV07XG4gICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBpbnB1dENvbm5lY3Rpb24gb2Ygc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zKSB7XG4gICAgICAgIGlmIChpbnB1dENvbm5lY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlucHV0TnVtQXJyYXlbaV0gPSBjb3VudDtcbiAgICB9XG5cbiAgICAvLyBjb2xsZWN0IG91dHB1dCBub2Rlc1xuICAgIGNvbnN0IG91dHB1dE5vZGVzOiBBYnN0cmFjdFNoYWRlck5vZGVbXVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkZXJOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2hhZGVyTm9kZSA9IHNoYWRlck5vZGVzW2ldO1xuICAgICAgZm9yIChjb25zdCBpbnB1dENvbm5lY3Rpb24gb2Ygc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zKSB7XG4gICAgICAgIGlmIChpbnB1dENvbm5lY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0Tm9kZSA9IEFic3RyYWN0U2hhZGVyTm9kZS5nZXRTaGFkZXJOb2RlQnlVaWQoaW5wdXRDb25uZWN0aW9uLnNoYWRlck5vZGVVaWQpO1xuICAgICAgICBjb25zdCBpbnB1dE5vZGVJZHggPSBzaGFkZXJOb2Rlcy5pbmRleE9mKGlucHV0Tm9kZSk7XG4gICAgICAgIGlmIChvdXRwdXROb2Rlc1tpbnB1dE5vZGVJZHhdID09IG51bGwpIHtcbiAgICAgICAgICBvdXRwdXROb2Rlc1tpbnB1dE5vZGVJZHhdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0Tm9kZXNbaW5wdXROb2RlSWR4XS5wdXNoKHNoYWRlck5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYWRlck5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3V0cHV0Tm9kZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXROb2Rlc1tpXSA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbGxlY3Qgbm9kZXMgd2hpY2ggaGF2ZSBubyBpbnB1dFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhZGVyTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpbnB1dE51bUFycmF5W2ldID09PSAwKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goc2hhZGVyTm9kZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRvcG9sb2dpY2FsIHNvcnQgKEJGUylcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm93ID0gcXVldWUuc2hpZnQoKSE7XG4gICAgICBzb3J0ZWROb2RlQXJyYXkucHVzaChub3cpO1xuICAgICAgY29uc3Qgbm93SWR4ID0gc2hhZGVyTm9kZXMuaW5kZXhPZihub3cpO1xuICAgICAgZm9yIChjb25zdCBvdXRwdXROb2RlIG9mIG91dHB1dE5vZGVzW25vd0lkeF0pIHtcbiAgICAgICAgaW5wdXROdW1BcnJheVtzaGFkZXJOb2Rlcy5pbmRleE9mKG91dHB1dE5vZGUpXS0tO1xuICAgICAgICBpZiAoaW5wdXROdW1BcnJheVtzaGFkZXJOb2Rlcy5pbmRleE9mKG91dHB1dE5vZGUpXSA9PT0gMCkge1xuICAgICAgICAgIHF1ZXVlLnB1c2gob3V0cHV0Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ydGVkTm9kZUFycmF5Lmxlbmd0aCAhPSBzaGFkZXJOb2Rlcy5sZW5ndGgpIHtcbiAgICAgIExvZ2dlci5lcnJvcignZ3JhcGggaXMgY3ljbGljJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRlZE5vZGVBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZnVuY3Rpb24gZGVmaW5pdGlvbiBmcm9tIHNoYWRlciBub2Rlcy5cbiAgICpcbiAgICogQHBhcmFtIHNoYWRlck5vZGVzIC0gU2hhZGVyIG5vZGVzXG4gICAqIEBwYXJhbSBzaGFkZXJUeXBlIC0gU2hhZGVyIHR5cGVcbiAgICogQHJldHVybnMgRnVuY3Rpb24gZGVmaW5pdGlvbiBhcyBhIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZXRGdW5jdGlvbkRlZmluaXRpb24oXG4gICAgc2hhZGVyTm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdLFxuICAgIHNoYWRlclR5cGU6IFNoYWRlclR5cGVFbnVtXG4gICkge1xuICAgIGxldCBzaGFkZXJUZXh0ID0gJyc7XG4gICAgY29uc3QgZXhpc3RWZXJ0ZXhGdW5jdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkZXJOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbWF0ZXJpYWxOb2RlID0gc2hhZGVyTm9kZXNbaV07XG4gICAgICBpZiAoZXhpc3RWZXJ0ZXhGdW5jdGlvbnMuaW5kZXhPZihtYXRlcmlhbE5vZGUuc2hhZGVyRnVuY3Rpb25OYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzaGFkZXJUZXh0ICs9IG1hdGVyaWFsTm9kZS5nZXRTaGFkZXJDb2RlKHNoYWRlclR5cGUpO1xuICAgICAgZXhpc3RWZXJ0ZXhGdW5jdGlvbnMucHVzaChtYXRlcmlhbE5vZGUuc2hhZGVyRnVuY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhZGVyVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Qgc2hhZGVyIGNvZGUgd2l0aCBzaGFkZXIgbm9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzaGFkZXJOb2RlcyAtIFNoYWRlciBub2Rlc1xuICAgKiBAcGFyYW0gaXNWZXJ0ZXhTdGFnZSAtIFdoZXRoZXIgdGhlIHNoYWRlciBpcyBhIHZlcnRleCBzaGFkZXJcbiAgICogQHBhcmFtIGlzRnVsbFZlcnNpb24gLSBXaGV0aGVyIHRvIGdlbmVyYXRlIGEgZnVsbCB2ZXJzaW9uIG9mIHRoZSBzaGFkZXIgY29kZVxuICAgKiBAcmV0dXJucyBTaGFkZXIgY29kZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19jb25zdHJ1Y3RTaGFkZXJXaXRoTm9kZXMoXG4gICAgc2hhZGVyTm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdLFxuICAgIGlzVmVydGV4U3RhZ2U6IGJvb2xlYW4sXG4gICAgaXNGdWxsVmVyc2lvbjogYm9vbGVhblxuICApIHtcbiAgICBsZXQgc2hhZGVyQm9keSA9ICcnO1xuXG4gICAgLy8gRGVmaW5lIHZhcnlpbmcob3V0KSB2YXJpYWJsZXNcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCAhPT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkZXJOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzaGFkZXJOb2RlID0gc2hhZGVyTm9kZXNbaV07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgaW5wdXRDb25uZWN0aW9uID0gc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zW2pdO1xuICAgICAgICAgIGlmIChpbnB1dENvbm5lY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGlucHV0ID0gc2hhZGVyTm9kZS5nZXRJbnB1dHMoKVtqXTtcbiAgICAgICAgICBjb25zdCBpbnB1dE5vZGUgPSBBYnN0cmFjdFNoYWRlck5vZGUuZ2V0U2hhZGVyTm9kZUJ5VWlkKGlucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbnB1dE5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ1ZlcnRleCcgJiZcbiAgICAgICAgICAgIHNoYWRlck5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ0ZyYWdtZW50J1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGlucHV0LmNvbXBvc2l0aW9uVHlwZS5nZXRHbHNsU3RyKGlucHV0LmNvbXBvbmVudFR5cGUpO1xuICAgICAgICAgICAgc2hhZGVyQm9keSArPSBgJHtpc1ZlcnRleFN0YWdlID8gJ291dCcgOiAnaW4nfSAke3R5cGV9IHZfJHtcbiAgICAgICAgICAgICAgaW5wdXROb2RlLnNoYWRlckZ1bmN0aW9uTmFtZVxuICAgICAgICAgICAgfV8ke2lucHV0Tm9kZS5zaGFkZXJOb2RlVWlkfTtcXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNoYWRlckJvZHkgKz0gQ29tbW9uU2hhZGVyUGFydC5nZXRNYWluQmVnaW4oaXNWZXJ0ZXhTdGFnZSk7XG5cbiAgICBpZiAoaXNGdWxsVmVyc2lvbikge1xuICAgICAgc2hhZGVyQm9keSArPSBDb21tb25TaGFkZXJQYXJ0LmdldE1haW5QcmVyZXF1aXNpdGVzKCk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdHMgdmFySW5wdXROYW1lcyBhbmQgdmFyT3V0cHV0TmFtZXNcbiAgICBjb25zdCB2YXJJbnB1dE5hbWVzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdOyAvLyBpbnB1dCBuYW1lcyBvZiB0b3BvbG9naWNhbCBzb3J0ZWQgTm9kZXNcbiAgICBjb25zdCB2YXJPdXRwdXROYW1lczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTsgLy8gb3V0cHV0IG5hbWVzIG9mIHRvcG9sb2dpY2FsIHNvcnRlZCBOb2Rlc1xuICAgIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5wdXRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nT3V0cHV0czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ091dHB1dHNWYXJOYW1lOiBNYXA8U2hhZGVyTm9kZVVJRCwgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2hhZGVyTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2hhZGVyTm9kZSA9IHNoYWRlck5vZGVzW2ldO1xuICAgICAgICBpZiAodmFySW5wdXROYW1lc1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgdmFySW5wdXROYW1lc1tpXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpIC0gMSA+PSAwKSB7XG4gICAgICAgICAgaWYgKHZhck91dHB1dE5hbWVzW2kgLSAxXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXJPdXRwdXROYW1lc1tpIC0gMV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dENvbm5lY3Rpb25zID0gc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zO1xuXG4gICAgICAgIC8vIENvbGxlY3RzIEV4aXN0aW5nSW5wdXRzXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRDb25uZWN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGlucHV0Q29ubmVjdGlvbiA9IGlucHV0Q29ubmVjdGlvbnNbal07XG4gICAgICAgICAgaWYgKGlucHV0Q29ubmVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5wdXROb2RlID0gQWJzdHJhY3RTaGFkZXJOb2RlLl9zaGFkZXJOb2Rlc1tpbnB1dENvbm5lY3Rpb24uc2hhZGVyTm9kZVVpZF07XG5cbiAgICAgICAgICBjb25zdCBvdXRwdXRTb2NrZXRPZlByZXYgPSBpbnB1dE5vZGUuZ2V0T3V0cHV0KGlucHV0Q29ubmVjdGlvbi5vdXRwdXROYW1lT2ZQcmV2KTtcbiAgICAgICAgICBjb25zdCBpbnB1dFNvY2tldE9mVGhpcyA9IHNoYWRlck5vZGUuZ2V0SW5wdXQoaW5wdXRDb25uZWN0aW9uLmlucHV0TmFtZU9mVGhpcyk7XG4gICAgICAgICAgY29uc3QgdmFyTmFtZSA9IGAke291dHB1dFNvY2tldE9mUHJldiEubmFtZX1fJHtpbnB1dENvbm5lY3Rpb24uc2hhZGVyTm9kZVVpZH1fdG9fJHtcbiAgICAgICAgICAgIHNoYWRlck5vZGUuc2hhZGVyTm9kZVVpZFxuICAgICAgICAgIH1gO1xuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhZXhpc3RpbmdJbnB1dHMuaGFzKGAke2lucHV0Tm9kZS5zaGFkZXJOb2RlVWlkfV8ke2lucHV0Q29ubmVjdGlvbi5vdXRwdXROYW1lT2ZQcmV2fWApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgcm93U3RyID0gQ29tbW9uU2hhZGVyUGFydC5nZXRBc3NpZ25tZW50U3RhdGVtZW50KHZhck5hbWUsIGlucHV0U29ja2V0T2ZUaGlzISk7XG4gICAgICAgICAgICBpZiAoIWlzVmVydGV4U3RhZ2UpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlucHV0Tm9kZS5nZXRTaGFkZXJTdGFnZSgpID09PSAnVmVydGV4JyAmJlxuICAgICAgICAgICAgICAgIHNoYWRlck5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ0ZyYWdtZW50J1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByb3dTdHIgPSBDb21tb25TaGFkZXJQYXJ0LmdldEFzc2lnbm1lbnRWYXJ5aW5nU3RhdGVtZW50SW5QaXhlbFNoYWRlcihcbiAgICAgICAgICAgICAgICAgIHZhck5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dFNvY2tldE9mVGhpcyEsXG4gICAgICAgICAgICAgICAgICBpbnB1dE5vZGVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkZXJCb2R5ICs9IHJvd1N0cjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhpc3RWYXJOYW1lID0gZXhpc3RpbmdPdXRwdXRzVmFyTmFtZS5nZXQoaW5wdXROb2RlLnNoYWRlck5vZGVVaWQpO1xuICAgICAgICAgIHZhcklucHV0TmFtZXNbaV0ucHVzaChleGlzdFZhck5hbWUgPyBleGlzdFZhck5hbWUgOiB2YXJOYW1lKTtcbiAgICAgICAgICBleGlzdGluZ0lucHV0cy5hZGQoXG4gICAgICAgICAgICBgJHtpbnB1dENvbm5lY3Rpb24uc2hhZGVyTm9kZVVpZH1fJHtpbnB1dENvbm5lY3Rpb24ub3V0cHV0TmFtZU9mUHJldn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbGxlY3RzIEV4aXN0aW5nT3V0cHV0c1xuICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IHNoYWRlck5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U2hhZGVyTm9kZSA9IHNoYWRlck5vZGVzW2pdO1xuICAgICAgICAgIGNvbnN0IHByZXZTaGFkZXJOb2RlSW5uZXIgPSBzaGFkZXJOb2Rlc1tpIC0gMV07XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZUlucHV0Q29ubmVjdGlvbnMgPSB0YXJnZXRTaGFkZXJOb2RlLmlucHV0Q29ubmVjdGlvbnM7XG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0YXJnZXROb2RlSW5wdXRDb25uZWN0aW9ucy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRDb25uZWN0aW9uID0gdGFyZ2V0Tm9kZUlucHV0Q29ubmVjdGlvbnNba107XG4gICAgICAgICAgICBpZiAoaW5wdXRDb25uZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldlNoYWRlck5vZGVJbm5lcj8uc2hhZGVyTm9kZVVpZCAhPT0gaW5wdXRDb25uZWN0aW9uLnNoYWRlck5vZGVVaWQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbnB1dE5vZGUgPSBBYnN0cmFjdFNoYWRlck5vZGUuX3NoYWRlck5vZGVzW2lucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIWV4aXN0aW5nT3V0cHV0cy5oYXMoYCR7aW5wdXROb2RlLnNoYWRlck5vZGVVaWR9XyR7aW5wdXRDb25uZWN0aW9uLm91dHB1dE5hbWVPZlByZXZ9YClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBvdXRwdXRTb2NrZXRPZlByZXYgPSBpbnB1dE5vZGUuZ2V0T3V0cHV0KGlucHV0Q29ubmVjdGlvbi5vdXRwdXROYW1lT2ZQcmV2KTtcblxuICAgICAgICAgICAgICBjb25zdCB2YXJOYW1lID0gYCR7b3V0cHV0U29ja2V0T2ZQcmV2IS5uYW1lfV8ke2lucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkfV90b18ke1xuICAgICAgICAgICAgICAgIHRhcmdldFNoYWRlck5vZGUuc2hhZGVyTm9kZVVpZFxuICAgICAgICAgICAgICB9YDtcblxuICAgICAgICAgICAgICBpZiAoaSAtIDEgPj0gMCkge1xuICAgICAgICAgICAgICAgIHZhck91dHB1dE5hbWVzW2kgLSAxXS5wdXNoKHZhck5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGV4aXN0aW5nT3V0cHV0c1Zhck5hbWUuc2V0KGlucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkLCB2YXJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4aXN0aW5nT3V0cHV0cy5hZGQoXG4gICAgICAgICAgICAgIGAke2lucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkfV8ke2lucHV0Q29ubmVjdGlvbi5vdXRwdXROYW1lT2ZQcmV2fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2VuZXJhdGUgc2hhZGVyIGNvZGUgYnkgdG9wb2xvZ2ljYWwgc29ydGVkIG5vZGVzLCB2YXJJbnB1dE5hbWVzIGFuZCB2YXJPdXRwdXROYW1lc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhZGVyTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNoYWRlck5vZGUgPSBzaGFkZXJOb2Rlc1tpXTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHNoYWRlck5vZGUuZ2V0U2hhZGVyRnVuY3Rpb25OYW1lRGVyaXZhdGl2ZSgpO1xuICAgICAgaWYgKHZhcklucHV0TmFtZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICB2YXJJbnB1dE5hbWVzW2ldID0gW107XG4gICAgICB9XG4gICAgICBpZiAodmFyT3V0cHV0TmFtZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICB2YXJPdXRwdXROYW1lc1tpXSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNWZXJ0ZXhTdGFnZSAmJiBzaGFkZXJOb2RlLmdldFNoYWRlclN0YWdlKCkgPT09ICdGcmFnbWVudCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKCFpc1ZlcnRleFN0YWdlICYmIHNoYWRlck5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ1ZlcnRleCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHNoYWRlckJvZHkgKz0gc2hhZGVyTm9kZS5tYWtlQ2FsbFN0YXRlbWVudChcbiAgICAgICAgaSxcbiAgICAgICAgc2hhZGVyTm9kZSxcbiAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICB2YXJJbnB1dE5hbWVzLFxuICAgICAgICB2YXJPdXRwdXROYW1lc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNWZXJ0ZXhTdGFnZSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFkZXJOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzaGFkZXJOb2RlID0gc2hhZGVyTm9kZXNbaV07XG4gICAgICAgIGNvbnN0IHZhck5hbWVzID0gdmFySW5wdXROYW1lc1tpXS5jb25jYXQodmFyT3V0cHV0TmFtZXNbaV0pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNoYWRlck5vZGUuaW5wdXRDb25uZWN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGlucHV0Q29ubmVjdGlvbiA9IHNoYWRlck5vZGUuaW5wdXRDb25uZWN0aW9uc1tqXTtcbiAgICAgICAgICBpZiAoaW5wdXRDb25uZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpbnB1dE5vZGUgPSBBYnN0cmFjdFNoYWRlck5vZGUuZ2V0U2hhZGVyTm9kZUJ5VWlkKGlucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbnB1dE5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ1ZlcnRleCcgJiZcbiAgICAgICAgICAgIHNoYWRlck5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ0ZyYWdtZW50J1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgc2hhZGVyQm9keSArPSBDb21tb25TaGFkZXJQYXJ0LmdldEFzc2lnbm1lbnRWYXJ5aW5nU3RhdGVtZW50SW5WZXJ0ZXhTaGFkZXIoXG4gICAgICAgICAgICAgIGlucHV0Tm9kZSxcbiAgICAgICAgICAgICAgdmFyTmFtZXMsXG4gICAgICAgICAgICAgIGpcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2hhZGVyQm9keSArPSBDb21tb25TaGFkZXJQYXJ0LmdldE1haW5FbmQoaXNWZXJ0ZXhTdGFnZSk7XG5cbiAgICByZXR1cm4gc2hhZGVyQm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzaGFkZXIgY29kZSBmcm9tIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uIC0gSlNPTiBkYXRhIG9mIGEgc2hhZGVyIG5vZGUgZ3JhcGhcbiAgICogQHJldHVybnMgU2hhZGVyIGNvZGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVTaGFkZXJDb2RlRnJvbUpzb24oXG4gICAganNvbjogU2hhZGVyTm9kZUpzb25cbiAgKTogeyB2ZXJ0ZXhTaGFkZXI6IHN0cmluZzsgcGl4ZWxTaGFkZXI6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RlZE5vZGVzID0gT2JqZWN0LnZhbHVlcyhjb25zdHJ1Y3ROb2Rlcyhqc29uKSk7XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9fc29ydFRvcG9sb2dpY2FsbHkoY29uc3RydWN0ZWROb2Rlcyk7XG4gICAgcmVzb2x2ZVNoYWRlclN0YWdlKG5vZGVzKTtcbiAgICBjb25zdCB2YXJ5aW5nTm9kZXMgPSBmaWx0ZXJOb2Rlc0ZvclZhcnlpbmcobm9kZXMsICdvdXRDb2xvcicpO1xuXG4gICAgY29uc3QgdmVydGV4Tm9kZXMgPSBmaWx0ZXJOb2Rlcyhub2RlcywgWydvdXRQb3NpdGlvbiddKTtcbiAgICBjb25zdCBwaXhlbE5vZGVzID0gZmlsdGVyTm9kZXMobm9kZXMsIFsnb3V0Q29sb3InXSk7XG5cbiAgICBpZiAodmVydGV4Tm9kZXMubGVuZ3RoID09PSAwIHx8IHBpeGVsTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmVydGV4UmV0ID0gU2hhZGVyR3JhcGhSZXNvbHZlci5jcmVhdGVWZXJ0ZXhTaGFkZXJDb2RlKHZlcnRleE5vZGVzLCB2YXJ5aW5nTm9kZXMpO1xuICAgIGNvbnN0IHBpeGVsUmV0ID0gU2hhZGVyR3JhcGhSZXNvbHZlci5jcmVhdGVQaXhlbFNoYWRlckNvZGUocGl4ZWxOb2Rlcyk7XG4gICAgaWYgKHZlcnRleFJldCA9PSBudWxsIHx8IHBpeGVsUmV0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2ZXJ0ZXhTaGFkZXI6IHZlcnRleFJldCwgcGl4ZWxTaGFkZXI6IHBpeGVsUmV0IH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsdGVyTm9kZXNJbm5lcihub2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10sIGVuZE5vZGVOYW1lOiBzdHJpbmcpIHtcbiAgbGV0IGVuZE5vZGU6IEFic3RyYWN0U2hhZGVyTm9kZSB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS5zaGFkZXJGdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhlbmROb2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgZW5kTm9kZSA9IG5vZGU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZW5kTm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWROb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10gPSBbZW5kTm9kZV07XG5cbiAgZnVuY3Rpb24gdHJhdmVyc2VOb2Rlcyhub2RlOiBBYnN0cmFjdFNoYWRlck5vZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaW5wdXRDb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXRDb25uZWN0aW9uID0gbm9kZS5pbnB1dENvbm5lY3Rpb25zW2ldO1xuICAgICAgaWYgKGlucHV0Q29ubmVjdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGlucHV0Tm9kZSA9IEFic3RyYWN0U2hhZGVyTm9kZS5nZXRTaGFkZXJOb2RlQnlVaWQoaW5wdXRDb25uZWN0aW9uLnNoYWRlck5vZGVVaWQpO1xuICAgICAgICBpZiAoaW5wdXROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2goaW5wdXROb2RlKTtcbiAgICAgICAgICB0cmF2ZXJzZU5vZGVzKGlucHV0Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZU5vZGVzKGVuZE5vZGUpO1xuXG4gIHJldHVybiBmaWx0ZXJlZE5vZGVzO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJOb2Rlcyhub2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10sIGVuZE5vZGVzTmFtZTogc3RyaW5nW10pIHtcbiAgbGV0IGZpbmFsRmlsdGVyTm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW5kTm9kZXNOYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW5kTm9kZU5hbWUgPSBlbmROb2Rlc05hbWVbaV07XG4gICAgY29uc3QgZmlsdGVyZWROb2RlcyA9IGZpbHRlck5vZGVzSW5uZXIobm9kZXMsIGVuZE5vZGVOYW1lKTtcbiAgICBmaW5hbEZpbHRlck5vZGVzID0gZmluYWxGaWx0ZXJOb2Rlcy5jb25jYXQoZmlsdGVyZWROb2Rlcyk7XG4gIH1cblxuICAvLyBSZW1vdmUgZHVwbGljYXRlc1xuICBmaW5hbEZpbHRlck5vZGVzID0gWy4uLm5ldyBTZXQoZmluYWxGaWx0ZXJOb2RlcyldO1xuXG4gIHJldHVybiBmaW5hbEZpbHRlck5vZGVzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU2hhZGVyU3RhZ2Uoc2hhZGVyTm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhZGVyTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzaGFkZXJOb2RlID0gc2hhZGVyTm9kZXNbaV07XG4gICAgZm9yIChjb25zdCBpbnB1dENvbm5lY3Rpb24gb2Ygc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoaW5wdXRDb25uZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dE5vZGUgPSBBYnN0cmFjdFNoYWRlck5vZGUuZ2V0U2hhZGVyTm9kZUJ5VWlkKGlucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkKTtcbiAgICAgIGlmIChpbnB1dE5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ1ZlcnRleCcgJiYgc2hhZGVyTm9kZS5nZXRTaGFkZXJTdGFnZSgpID09PSAnTmV1dHJhbCcpIHtcbiAgICAgICAgc2hhZGVyTm9kZS5zZXRTaGFkZXJTdGFnZSgnVmVydGV4Jyk7XG4gICAgICB9IGVsc2UgaWYgKGlucHV0Tm9kZS5nZXRTaGFkZXJTdGFnZSgpID09PSAnRnJhZ21lbnQnKSB7XG4gICAgICAgIHNoYWRlck5vZGUuc2V0U2hhZGVyU3RhZ2UoJ0ZyYWdtZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbHRlck5vZGVzRm9yVmFyeWluZyhub2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10sIGVuZE5vZGVOYW1lOiBzdHJpbmcpIHtcbiAgLy8gRmluZCB0aGUgZW5kIG5vZGVcbiAgbGV0IGVuZE5vZGU6IEFic3RyYWN0U2hhZGVyTm9kZSB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS5zaGFkZXJGdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhlbmROb2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgZW5kTm9kZSA9IG5vZGU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGVuZE5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxldCB2YXJ5aW5nTm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdID0gW107XG4gIGZ1bmN0aW9uIHRyYXZlcnNlTm9kZXNBbGwobm9kZTogQWJzdHJhY3RTaGFkZXJOb2RlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmlucHV0Q29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGlucHV0Q29ubmVjdGlvbiA9IG5vZGUuaW5wdXRDb25uZWN0aW9uc1tpXTtcbiAgICAgIGlmIChpbnB1dENvbm5lY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlucHV0Tm9kZSA9IEFic3RyYWN0U2hhZGVyTm9kZS5nZXRTaGFkZXJOb2RlQnlVaWQoaW5wdXRDb25uZWN0aW9uLnNoYWRlck5vZGVVaWQpO1xuICAgICAgdmFyeWluZ05vZGVzLnB1c2goaW5wdXROb2RlKTtcbiAgICAgIHRyYXZlcnNlTm9kZXNBbGwoaW5wdXROb2RlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cmF2ZXJzZU5vZGVzKG5vZGU6IEFic3RyYWN0U2hhZGVyTm9kZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5pbnB1dENvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dENvbm5lY3Rpb24gPSBub2RlLmlucHV0Q29ubmVjdGlvbnNbaV07XG4gICAgICBpZiAoaW5wdXRDb25uZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dE5vZGUgPSBBYnN0cmFjdFNoYWRlck5vZGUuZ2V0U2hhZGVyTm9kZUJ5VWlkKGlucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXROb2RlICE9IG51bGwgJiZcbiAgICAgICAgaW5wdXROb2RlLmdldFNoYWRlclN0YWdlKCkgPT09ICdWZXJ0ZXgnICYmXG4gICAgICAgIG5vZGUuZ2V0U2hhZGVyU3RhZ2UoKSA9PT0gJ0ZyYWdtZW50J1xuICAgICAgKSB7XG4gICAgICAgIHZhcnlpbmdOb2Rlcy5wdXNoKGlucHV0Tm9kZSk7XG4gICAgICAgIGlmIChub2RlLmdldFNoYWRlclN0YWdlKCkgPT09ICdGcmFnbWVudCcpIHtcbiAgICAgICAgICB2YXJ5aW5nTm9kZXMudW5zaGlmdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0cmF2ZXJzZU5vZGVzQWxsKGlucHV0Tm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdHJhdmVyc2VOb2RlcyhpbnB1dE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHRyYXZlcnNlTm9kZXMoZW5kTm9kZSk7XG5cbiAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXNcbiAgdmFyeWluZ05vZGVzID0gWy4uLm5ldyBTZXQodmFyeWluZ05vZGVzKV07XG5cbiAgcmV0dXJuIHZhcnlpbmdOb2Rlcy5yZXZlcnNlKCk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IHNoYWRlciBub2RlcyBmcm9tIEpTT04uXG4gKlxuICogQHBhcmFtIGpzb24gLSBKU09OIGRhdGEgb2YgYSBzaGFkZXIgbm9kZSBncmFwaFxuICogQHJldHVybnMgQ29uc3RydWN0ZWQgc2hhZGVyIG5vZGVzXG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdE5vZGVzKGpzb246IFNoYWRlck5vZGVKc29uKSB7XG4gIC8vIENyZWF0ZSBOb2RlIEluc3RhbmNlc1xuICBjb25zdCBub2RlSW5zdGFuY2VzOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdFNoYWRlck5vZGU+ID0ge307XG4gIGNvbnN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBqc29uLm5vZGVzKSB7XG4gICAgbm9kZXNbbm9kZS5pZF0gPSBub2RlO1xuICAgIHN3aXRjaCAobm9kZS5uYW1lKSB7XG4gICAgICAvLyBjYXNlICdDb25zdGFudEJvb2wnOiB7XG4gICAgICAvLyAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBDb25zdGFudFNjYWxhclZhcmlhYmxlU2hhZGVyTm9kZShDb21wb25lbnRUeXBlLkJvb2wpO1xuICAgICAgLy8gICBub2RlSW5zdGFuY2Uuc2V0RGVmYXVsdElucHV0VmFsdWUoU2NhbGFyLmZyb21Db3B5TnVtYmVyKG5vZGUuZGF0YS5ib29sID8gMSA6IDApKTtcbiAgICAgIC8vICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgIC8vICAgYnJlYWs7XG4gICAgICAvLyB9XG4gICAgICBjYXNlICdDb25zdGFudFNjYWxhcic6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IENvbnN0YW50U2NhbGFyVmFyaWFibGVTaGFkZXJOb2RlKENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICBub2RlSW5zdGFuY2Uuc2V0RGVmYXVsdElucHV0VmFsdWUoU2NhbGFyLmZyb21Db3B5TnVtYmVyKG5vZGUuY29udHJvbHNbJ2luMSddLnZhbHVlKSk7XG4gICAgICAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29uc3RhbnRWZWN0b3IyJzoge1xuICAgICAgICBjb25zdCBub2RlSW5zdGFuY2UgPSBuZXcgQ29uc3RhbnRWZWN0b3IyVmFyaWFibGVTaGFkZXJOb2RlKENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICBub2RlSW5zdGFuY2Uuc2V0RGVmYXVsdElucHV0VmFsdWUoXG4gICAgICAgICAgVmVjdG9yMi5mcm9tQ29weTIobm9kZS5jb250cm9sc1snaW4xJ10udmFsdWUsIG5vZGUuY29udHJvbHNbJ2luMiddLnZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NvbnN0YW50VmVjdG9yMyc6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IENvbnN0YW50VmVjdG9yM1ZhcmlhYmxlU2hhZGVyTm9kZShDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgbm9kZUluc3RhbmNlLnNldERlZmF1bHRJbnB1dFZhbHVlKFxuICAgICAgICAgIFZlY3RvcjMuZnJvbUNvcHkzKFxuICAgICAgICAgICAgbm9kZS5jb250cm9sc1snaW4xJ10udmFsdWUsXG4gICAgICAgICAgICBub2RlLmNvbnRyb2xzWydpbjInXS52YWx1ZSxcbiAgICAgICAgICAgIG5vZGUuY29udHJvbHNbJ2luMyddLnZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NvbnN0YW50VmVjdG9yNCc6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IENvbnN0YW50VmVjdG9yNFZhcmlhYmxlU2hhZGVyTm9kZShDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgbm9kZUluc3RhbmNlLnNldERlZmF1bHRJbnB1dFZhbHVlKFxuICAgICAgICAgIFZlY3RvcjQuZnJvbUNvcHk0KFxuICAgICAgICAgICAgbm9kZS5jb250cm9sc1snaW4xJ10udmFsdWUsXG4gICAgICAgICAgICBub2RlLmNvbnRyb2xzWydpbjInXS52YWx1ZSxcbiAgICAgICAgICAgIG5vZGUuY29udHJvbHNbJ2luMyddLnZhbHVlLFxuICAgICAgICAgICAgbm9kZS5jb250cm9sc1snaW40J10udmFsdWVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVW5pZm9ybVZlY3RvcjQnOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBVbmlmb3JtRGF0YVNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzQsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICBub2RlSW5zdGFuY2Uuc2V0RGVmYXVsdElucHV0VmFsdWUoXG4gICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFtcbiAgICAgICAgICAgIG5vZGUuY29udHJvbHNbJ2luaXRpYWxYJ10udmFsdWUsXG4gICAgICAgICAgICBub2RlLmNvbnRyb2xzWydpbml0aWFsWSddLnZhbHVlLFxuICAgICAgICAgICAgbm9kZS5jb250cm9sc1snaW5pdGlhbFonXS52YWx1ZSxcbiAgICAgICAgICAgIG5vZGUuY29udHJvbHNbJ2luaXRpYWxXJ10udmFsdWUsXG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFVuaWZvcm1EYXRhTmFtZShub2RlLmNvbnRyb2xzWyduYW1lJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RpbWUnOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBUaW1lU2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0FkZCc6IHtcbiAgICAgICAgY29uc3Qgc29ja2V0TmFtZSA9IG5vZGUub3V0cHV0cy5vdXQxLnNvY2tldC5uYW1lO1xuICAgICAgICBsZXQgbm9kZUluc3RhbmNlOiBBZGRTaGFkZXJOb2RlO1xuICAgICAgICBpZiAoc29ja2V0TmFtZSA9PT0gJ1NjYWxhcicpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgQWRkU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yMicpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgQWRkU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjMiwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjMnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IEFkZFNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzMsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3I0Jykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBBZGRTaGFkZXJOb2RlKENvbXBvc2l0aW9uVHlwZS5WZWM0LCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIuZXJyb3IoJ0FkZCBub2RlOiBVbmtub3duIHNvY2tldCBuYW1lOiAnICsgc29ja2V0TmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFNoYWRlclN0YWdlKG5vZGUuY29udHJvbHNbJ3NoYWRlclN0YWdlJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1Npbic6IHtcbiAgICAgICAgY29uc3Qgc29ja2V0TmFtZSA9IG5vZGUub3V0cHV0cy5vdXQxLnNvY2tldC5uYW1lO1xuICAgICAgICBsZXQgbm9kZUluc3RhbmNlOiBTaW5TaGFkZXJOb2RlO1xuICAgICAgICBpZiAoc29ja2V0TmFtZSA9PT0gJ1NjYWxhcicpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgU2luU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yMicpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgU2luU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjMiwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjMnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IFNpblNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzMsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3I0Jykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBTaW5TaGFkZXJOb2RlKENvbXBvc2l0aW9uVHlwZS5WZWM0LCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIuZXJyb3IoJ1NpbiBub2RlOiBVbmtub3duIHNvY2tldCBuYW1lOiAnICsgc29ja2V0TmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFNoYWRlclN0YWdlKG5vZGUuY29udHJvbHNbJ3NoYWRlclN0YWdlJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1N0ZXAnOiB7XG4gICAgICAgIGNvbnN0IHNvY2tldE5hbWUgPSBub2RlLm91dHB1dHMub3V0MS5zb2NrZXQubmFtZTtcbiAgICAgICAgbGV0IG5vZGVJbnN0YW5jZTogU3RlcFNoYWRlck5vZGU7XG4gICAgICAgIGlmIChzb2NrZXROYW1lID09PSAnU2NhbGFyJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBTdGVwU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yMicpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgU3RlcFNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzIsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3IzJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBTdGVwU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjMywgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjQnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IFN0ZXBTaGFkZXJOb2RlKENvbXBvc2l0aW9uVHlwZS5WZWM0LCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIuZXJyb3IoJ0FkZCBub2RlOiBVbmtub3duIHNvY2tldCBuYW1lOiAnICsgc29ja2V0TmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFNoYWRlclN0YWdlKG5vZGUuY29udHJvbHNbJ3NoYWRlclN0YWdlJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1Ntb290aFN0ZXAnOiB7XG4gICAgICAgIGNvbnN0IHNvY2tldE5hbWUgPSBub2RlLm91dHB1dHMub3V0MS5zb2NrZXQubmFtZTtcbiAgICAgICAgbGV0IG5vZGVJbnN0YW5jZTogU3RlcFNoYWRlck5vZGU7XG4gICAgICAgIGlmIChzb2NrZXROYW1lID09PSAnU2NhbGFyJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBTbW9vdGhTdGVwU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yMicpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgU21vb3RoU3RlcFNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzIsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3IzJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBTbW9vdGhTdGVwU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjMywgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjQnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IFNtb290aFN0ZXBTaGFkZXJOb2RlKENvbXBvc2l0aW9uVHlwZS5WZWM0LCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIuZXJyb3IoJ0FkZCBub2RlOiBVbmtub3duIHNvY2tldCBuYW1lOiAnICsgc29ja2V0TmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFNoYWRlclN0YWdlKG5vZGUuY29udHJvbHNbJ3NoYWRlclN0YWdlJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ05vcm1hbGl6ZSc6IHtcbiAgICAgICAgY29uc3Qgc29ja2V0TmFtZSA9IG5vZGUub3V0cHV0cy5vdXQxLnNvY2tldC5uYW1lO1xuICAgICAgICBsZXQgbm9kZUluc3RhbmNlOiBOb3JtYWxpemVTaGFkZXJOb2RlO1xuICAgICAgICBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjInKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE5vcm1hbGl6ZVNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzIsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3IzJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBOb3JtYWxpemVTaGFkZXJOb2RlKENvbXBvc2l0aW9uVHlwZS5WZWMzLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yNCcpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgTm9ybWFsaXplU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjNCwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmVycm9yKCdOb3JtYWxpemUgbm9kZTogVW5rbm93biBzb2NrZXQgbmFtZTogJyArIHNvY2tldE5hbWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVJbnN0YW5jZS5zZXRTaGFkZXJTdGFnZShub2RlLmNvbnRyb2xzWydzaGFkZXJTdGFnZSddLnZhbHVlKTtcbiAgICAgICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEb3QnOiB7XG4gICAgICAgIGNvbnN0IHNvY2tldE5hbWUgPSBub2RlLmlucHV0cy5pbjEuc29ja2V0Lm5hbWU7XG4gICAgICAgIGxldCBub2RlSW5zdGFuY2U6IERvdFByb2R1Y3RTaGFkZXJOb2RlO1xuICAgICAgICBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjInKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IERvdFByb2R1Y3RTaGFkZXJOb2RlKENvbXBvc2l0aW9uVHlwZS5WZWMyLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yMycpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgRG90UHJvZHVjdFNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlZlYzMsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3I0Jykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBEb3RQcm9kdWN0U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjNCwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmVycm9yKCdEb3Qgbm9kZTogVW5rbm93biBzb2NrZXQgbmFtZTogJyArIHNvY2tldE5hbWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVJbnN0YW5jZS5zZXRTaGFkZXJTdGFnZShub2RlLmNvbnRyb2xzWydzaGFkZXJTdGFnZSddLnZhbHVlKTtcbiAgICAgICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdNdWx0aXBseSc6IHtcbiAgICAgICAgY29uc3Qgc29ja2V0TmFtZSA9IG5vZGUub3V0cHV0cy5vdXQxLnNvY2tldC5uYW1lO1xuICAgICAgICBsZXQgbm9kZUluc3RhbmNlOiBNdWx0aXBseVNoYWRlck5vZGU7XG4gICAgICAgIGlmIChzb2NrZXROYW1lID09PSAnU2NhbGFyJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBNdWx0aXBseVNoYWRlck5vZGUoQ29tcG9zaXRpb25UeXBlLlNjYWxhciwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjInKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE11bHRpcGx5U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjMiwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjMnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE11bHRpcGx5U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjMywgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjQnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE11bHRpcGx5U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuVmVjNCwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ01hdHJpeDInKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE11bHRpcGx5U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuTWF0MiwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ01hdHJpeDMnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE11bHRpcGx5U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuTWF0MywgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0TmFtZSA9PT0gJ01hdHJpeDQnKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IE11bHRpcGx5U2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuTWF0NCwgQ29tcG9uZW50VHlwZS5GbG9hdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmVycm9yKCdNdWx0aXBseSBub2RlOiBVbmtub3duIHNvY2tldCBuYW1lOiAnICsgc29ja2V0TmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFNoYWRlclN0YWdlKG5vZGUuY29udHJvbHNbJ3NoYWRlclN0YWdlJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RyYW5zZm9ybSc6IHtcbiAgICAgICAgY29uc3Qgc29ja2V0TmFtZSA9IG5vZGUub3V0cHV0cy5vdXQxLnNvY2tldC5uYW1lO1xuICAgICAgICBsZXQgbm9kZUluc3RhbmNlOiBUcmFuc2Zvcm1TaGFkZXJOb2RlO1xuICAgICAgICBpZiAoc29ja2V0TmFtZSA9PT0gJ1ZlY3RvcjInKSB7XG4gICAgICAgICAgbm9kZUluc3RhbmNlID0gbmV3IFRyYW5zZm9ybVNoYWRlck5vZGUoXG4gICAgICAgICAgICBDb21wb3NpdGlvblR5cGUuTWF0MixcbiAgICAgICAgICAgIENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICAgICAgICBDb21wb3NpdGlvblR5cGUuVmVjMixcbiAgICAgICAgICAgIENvbXBvbmVudFR5cGUuRmxvYXRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNvY2tldE5hbWUgPT09ICdWZWN0b3IzJykge1xuICAgICAgICAgIG5vZGVJbnN0YW5jZSA9IG5ldyBUcmFuc2Zvcm1TaGFkZXJOb2RlKFxuICAgICAgICAgICAgQ29tcG9zaXRpb25UeXBlLk1hdDMsXG4gICAgICAgICAgICBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICAgICAgQ29tcG9zaXRpb25UeXBlLlZlYzMsXG4gICAgICAgICAgICBDb21wb25lbnRUeXBlLkZsb2F0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXROYW1lID09PSAnVmVjdG9yNCcpIHtcbiAgICAgICAgICBub2RlSW5zdGFuY2UgPSBuZXcgVHJhbnNmb3JtU2hhZGVyTm9kZShcbiAgICAgICAgICAgIENvbXBvc2l0aW9uVHlwZS5NYXQ0LFxuICAgICAgICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICAgIENvbXBvc2l0aW9uVHlwZS5WZWM0LFxuICAgICAgICAgICAgQ29tcG9uZW50VHlwZS5GbG9hdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmVycm9yKCdUcmFuc2Zvcm0gbm9kZTogVW5rbm93biBzb2NrZXQgbmFtZTogJyArIHNvY2tldE5hbWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVJbnN0YW5jZS5zZXRTaGFkZXJTdGFnZShub2RlLmNvbnRyb2xzWydzaGFkZXJTdGFnZSddLnZhbHVlKTtcbiAgICAgICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdTcGxpdFZlY3Rvcic6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IFNwbGl0VmVjdG9yU2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2Uuc2V0U2hhZGVyU3RhZ2Uobm9kZS5jb250cm9sc1snc2hhZGVyU3RhZ2UnXS52YWx1ZSk7XG4gICAgICAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTWVyZ2VWZWN0b3InOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBNZXJnZVZlY3RvclNoYWRlck5vZGUoKTtcbiAgICAgICAgbm9kZUluc3RhbmNlLnNldFNoYWRlclN0YWdlKG5vZGUuY29udHJvbHNbJ3NoYWRlclN0YWdlJ10udmFsdWUpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0F0dHJpYnV0ZUNvbG9yJzoge1xuICAgICAgICBjb25zdCBub2RlSW5zdGFuY2UgPSBuZXcgQXR0cmlidXRlQ29sb3JTaGFkZXJOb2RlKCk7XG4gICAgICAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXR0cmlidXRlTm9ybWFsJzoge1xuICAgICAgICBjb25zdCBub2RlSW5zdGFuY2UgPSBuZXcgQXR0cmlidXRlTm9ybWFsU2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0F0dHJpYnV0ZVBvc2l0aW9uJzoge1xuICAgICAgICBjb25zdCBub2RlSW5zdGFuY2UgPSBuZXcgQXR0cmlidXRlUG9zaXRpb25TaGFkZXJOb2RlKCk7XG4gICAgICAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXR0cmlidXRlVGV4Y29vcmQnOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBBdHRyaWJ1dGVUZXhjb29yZFNoYWRlck5vZGUoKTtcbiAgICAgICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdXb3JsZE1hdHJpeCc6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IFdvcmxkTWF0cml4U2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1ZpZXdNYXRyaXgnOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBWaWV3TWF0cml4U2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1Byb2plY3Rpb25NYXRyaXgnOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBQcm9qZWN0aW9uTWF0cml4U2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ05vcm1hbE1hdHJpeCc6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IE5vcm1hbE1hdHJpeFNoYWRlck5vZGUoKTtcbiAgICAgICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBjYXNlICdJZic6IHtcbiAgICAgIC8vICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IElmU3RhdGVtZW50U2hhZGVyTm9kZSgpO1xuICAgICAgLy8gICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIC8vIH1cbiAgICAgIC8vIGNhc2UgJ0Jsb2NrQmVnaW4nOiB7XG4gICAgICAvLyAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBCbG9ja0JlZ2luU2hhZGVyTm9kZSgpO1xuICAgICAgLy8gICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgaW4gbm9kZS5vdXRwdXRzKSB7XG4gICAgICAvLyAgICAgY29uc3QgY29tcG9zaXRpb25UeXBlID0gZ2V0Q29tcG9zaXRpb25UeXBlKG91dHB1dE5hbWUpO1xuICAgICAgLy8gICAgIG5vZGVJbnN0YW5jZS5hZGRJbnB1dEFuZE91dHB1dChjb21wb3NpdGlvblR5cGUsIENvbXBvbmVudFR5cGUuRmxvYXQpO1xuICAgICAgLy8gICB9XG4gICAgICAvLyAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAvLyAgIGJyZWFrO1xuICAgICAgLy8gfVxuICAgICAgLy8gY2FzZSAnQmxvY2tFbmQnOiB7XG4gICAgICAvLyAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBCbG9ja0VuZFNoYWRlck5vZGUoKTtcbiAgICAgIC8vICAgZm9yIChjb25zdCBvdXRwdXROYW1lIGluIG5vZGUub3V0cHV0cykge1xuICAgICAgLy8gICAgIGNvbnN0IGNvbXBvc2l0aW9uVHlwZSA9IGdldENvbXBvc2l0aW9uVHlwZShvdXRwdXROYW1lKTtcbiAgICAgIC8vICAgICBub2RlSW5zdGFuY2UuYWRkSW5wdXRBbmRPdXRwdXQoY29tcG9zaXRpb25UeXBlLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIC8vIH1cbiAgICAgIGNhc2UgJ0dyZWF0ZXInOiB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnN0YW5jZSA9IG5ldyBHcmVhdGVyU2hhZGVyTm9kZShDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBDb21wb25lbnRUeXBlLkZsb2F0KTtcbiAgICAgICAgbm9kZUluc3RhbmNlc1tub2RlLmlkXSA9IG5vZGVJbnN0YW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdPdXRQb3NpdGlvbic6IHtcbiAgICAgICAgY29uc3Qgbm9kZUluc3RhbmNlID0gbmV3IE91dFBvc2l0aW9uU2hhZGVyTm9kZSgpO1xuICAgICAgICBub2RlSW5zdGFuY2VzW25vZGUuaWRdID0gbm9kZUluc3RhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ091dENvbG9yJzoge1xuICAgICAgICBjb25zdCBub2RlSW5zdGFuY2UgPSBuZXcgT3V0Q29sb3JTaGFkZXJOb2RlKCk7XG4gICAgICAgIG5vZGVJbnN0YW5jZXNbbm9kZS5pZF0gPSBub2RlSW5zdGFuY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBqc29uLmNvbm5lY3Rpb25zKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwganNvbi5jb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBqc29uLmNvbm5lY3Rpb25zW2ldO1xuICAgIGNvbnN0IGlucHV0Tm9kZUluc3RhbmNlID0gbm9kZUluc3RhbmNlc1tjb25uZWN0aW9uLmZyb20uaWRdIGFzIEFic3RyYWN0U2hhZGVyTm9kZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdXRwdXROb2RlSW5zdGFuY2UgPSBub2RlSW5zdGFuY2VzW2Nvbm5lY3Rpb24udG8uaWRdIGFzIEFic3RyYWN0U2hhZGVyTm9kZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaW5wdXROb2RlSW5zdGFuY2UgPT0gbnVsbCB8fCBvdXRwdXROb2RlSW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCdpbnB1dE5vZGVJbnN0YW5jZSBvciBvdXRwdXROb2RlSW5zdGFuY2UgaXMgbnVsbCcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBpZHggPSAwO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5vZGVzW2Nvbm5lY3Rpb24udG8uaWRdLmlucHV0cykge1xuICAgICAgaWYgKGtleSA9PT0gY29ubmVjdGlvbi50by5wb3J0TmFtZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlkeCsrO1xuICAgIH1cbiAgICBsZXQgaWR4MiA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZXNbY29ubmVjdGlvbi5mcm9tLmlkXS5vdXRwdXRzKSB7XG4gICAgICBpZiAoa2V5ID09PSBjb25uZWN0aW9uLmZyb20ucG9ydE5hbWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZHgyKys7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dE9mSW5wdXROb2RlID0gaW5wdXROb2RlSW5zdGFuY2UuZ2V0T3V0cHV0cygpW2lkeDJdO1xuICAgIGNvbnN0IGlucHV0T2ZPdXRwdXROb2RlID0gb3V0cHV0Tm9kZUluc3RhbmNlLmdldElucHV0cygpW2lkeF07XG4gICAgb3V0cHV0Tm9kZUluc3RhbmNlLmFkZElucHV0Q29ubmVjdGlvbihpbnB1dE5vZGVJbnN0YW5jZSwgb3V0cHV0T2ZJbnB1dE5vZGUsIGlucHV0T2ZPdXRwdXROb2RlKTtcbiAgfVxuICByZXR1cm4gbm9kZUluc3RhbmNlcztcbn1cbiIsImltcG9ydCBTaGFkZXJpdHkgZnJvbSAnc2hhZGVyaXR5JztcbmltcG9ydCB7IENHQVBJUmVzb3VyY2VIYW5kbGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVOYW1lcyB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9XZWJHTENvbnRleHRXcmFwcGVyJztcbmltcG9ydCB7IFNoYWRlclNvdXJjZXMgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9XZWJHTFN0cmF0ZWd5JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IEJvbmVEYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0JvbmVEYXRhVHlwZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uLy4uL21pc2MvRGF0YVV0aWwnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCB9IGZyb20gJy4vQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsJztcbmltcG9ydCB7IFNoYWRlcml0eVV0aWxpdHlXZWJHTCB9IGZyb20gJy4vU2hhZGVyaXR5VXRpbGl0eVdlYkdMJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uLy4uL2dlb21ldHJ5L1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi8uLi9taXNjL0lzJztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi8uLi8uLi94ci9tYWluJztcblxuZXhwb3J0IGNsYXNzIFNoYWRlckhhbmRsZXIge1xuICBwcml2YXRlIHN0YXRpYyBfX3NoYWRlclN0cmluZ01hcDogTWFwPHN0cmluZywgQ0dBUElSZXNvdXJjZUhhbmRsZT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNoYWRlciBwcm9ncmFtIE9yIEdldCBhIHNoYWRlciBwcm9ncmFtIGZyb20gY2FjaGVcbiAgICogQHBhcmFtIG1hdGVyaWFsXG4gICAqIEBwYXJhbSB2ZXJ0ZXhTaGFkZXJcbiAgICogQHBhcmFtIHBpeGVsU2hhZGVyXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lc1xuICAgKiBAcGFyYW0gYXR0cmlidXRlU2VtYW50aWNzXG4gICAqIEBwYXJhbSBvbkVycm9yXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgX2NyZWF0ZVNoYWRlclByb2dyYW1XaXRoQ2FjaGUoXG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICAgIHZlcnRleFNoYWRlcjogc3RyaW5nLFxuICAgIHBpeGVsU2hhZGVyOiBzdHJpbmcsXG4gICAgYXR0cmlidXRlTmFtZXM6IEF0dHJpYnV0ZU5hbWVzLFxuICAgIGF0dHJpYnV0ZVNlbWFudGljczogVmVydGV4QXR0cmlidXRlRW51bVtdLFxuICAgIG9uRXJyb3I/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFtDR0FQSVJlc291cmNlSGFuZGxlLCBib29sZWFuXSB7XG4gICAgLy8gQ2FjaGVcbiAgICBjb25zdCB3aG9sZVNoYWRlclRleHQgPSB2ZXJ0ZXhTaGFkZXIgKyBwaXhlbFNoYWRlcjtcbiAgICBsZXQgc2hhZGVyUHJvZ3JhbVVpZCA9IHRoaXMuX19zaGFkZXJTdHJpbmdNYXAuZ2V0KHdob2xlU2hhZGVyVGV4dCk7XG4gICAgaWYgKHNoYWRlclByb2dyYW1VaWQpIHtcbiAgICAgIHJldHVybiBbc2hhZGVyUHJvZ3JhbVVpZCwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBzaGFkZXJQcm9ncmFtVWlkID0gY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlU2hhZGVyUHJvZ3JhbSh7XG4gICAgICBtYXRlcmlhbCxcbiAgICAgIHZlcnRleFNoYWRlclN0cjogdmVydGV4U2hhZGVyLFxuICAgICAgZnJhZ21lbnRTaGFkZXJTdHI6IHBpeGVsU2hhZGVyLFxuICAgICAgYXR0cmlidXRlTmFtZXM6IGF0dHJpYnV0ZU5hbWVzLFxuICAgICAgYXR0cmlidXRlU2VtYW50aWNzOiBhdHRyaWJ1dGVTZW1hbnRpY3MsXG4gICAgICBvbkVycm9yLFxuICAgIH0pO1xuICAgIHRoaXMuX19zaGFkZXJTdHJpbmdNYXAuc2V0KHdob2xlU2hhZGVyVGV4dCwgc2hhZGVyUHJvZ3JhbVVpZCk7XG4gICAgcmV0dXJuIFtzaGFkZXJQcm9ncmFtVWlkLCB0cnVlXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZVByb2dyYW1Bc1NpbmdsZU9wZXJhdGlvbkJ5VXBkYXRlZFNvdXJjZXMoXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgbWF0ZXJpYWxOb2RlOiBBYnN0cmFjdE1hdGVyaWFsQ29udGVudCxcbiAgdXBkYXRlZFNoYWRlclNvdXJjZXM6IFNoYWRlclNvdXJjZXMsXG4gIG9uRXJyb3I/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4pOiBbQ0dBUElSZXNvdXJjZUhhbmRsZSwgYm9vbGVhbl0ge1xuICBjb25zdCB7IGF0dHJpYnV0ZU5hbWVzLCBhdHRyaWJ1dGVTZW1hbnRpY3MgfSA9IF9nZXRBdHRyaWJ1dGVJbmZvKG1hdGVyaWFsTm9kZSk7XG5cbiAgY29uc3QgW3NoYWRlclByb2dyYW1VaWQsIG5ld09uZV0gPSBTaGFkZXJIYW5kbGVyLl9jcmVhdGVTaGFkZXJQcm9ncmFtV2l0aENhY2hlKFxuICAgIG1hdGVyaWFsLFxuICAgIHVwZGF0ZWRTaGFkZXJTb3VyY2VzLnZlcnRleCxcbiAgICB1cGRhdGVkU2hhZGVyU291cmNlcy5waXhlbCxcbiAgICBhdHRyaWJ1dGVOYW1lcyxcbiAgICBhdHRyaWJ1dGVTZW1hbnRpY3MsXG4gICAgb25FcnJvclxuICApO1xuXG4gIHJldHVybiBbc2hhZGVyUHJvZ3JhbVVpZCwgbmV3T25lXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBdHRyaWJ1dGVJbmZvKG1hdGVyaWFsTm9kZTogQWJzdHJhY3RNYXRlcmlhbENvbnRlbnQpIHtcbiAgY29uc3QgcmVmbGVjdGlvbiA9IFNoYWRlcml0eVV0aWxpdHlXZWJHTC5nZXRBdHRyaWJ1dGVSZWZsZWN0aW9uKFxuICAgIG1hdGVyaWFsTm9kZS52ZXJ0ZXhTaGFkZXJpdHlPYmplY3QhXG4gICk7XG4gIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gcmVmbGVjdGlvbi5uYW1lcztcbiAgY29uc3QgYXR0cmlidXRlU2VtYW50aWNzID0gcmVmbGVjdGlvbi5zZW1hbnRpY3M7XG4gIHJldHVybiB7IGF0dHJpYnV0ZU5hbWVzLCBhdHRyaWJ1dGVTZW1hbnRpY3MgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9vdXRwdXRWZXJ0ZXhBdHRyaWJ1dGVCaW5kaW5nSW5mbyhcbiAgYXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICBhdHRyaWJ1dGVTZW1hbnRpY3M6IFZlcnRleEF0dHJpYnV0ZUVudW1bXVxuKSB7XG4gIGxldCB2ZXJ0ZXhBdHRyaWJ1dGVzQmluZGluZyA9ICdcXG4vLyBWZXJ0ZXggQXR0cmlidXRlcyBCaW5kaW5nIEluZm9cXG4nO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmVydGV4QXR0cmlidXRlc0JpbmRpbmcgKz0gYC8vICR7YXR0cmlidXRlTmFtZXNbaV19OiAke2F0dHJpYnV0ZVNlbWFudGljc1tpXS5zdHJ9IFxcbmA7XG4gIH1cbiAgcmV0dXJuIHZlcnRleEF0dHJpYnV0ZXNCaW5kaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHNoYWRlciBwcm9ncmFtXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGZpbmFsIHNoYWRlciBzb3VyY2UgY29kZVxuICogYnkgZW1iZWRkaW5nIHZhcmlhYmxlcyBhbmQgYWRkaW5nIGRlZmluaXRpb25zXG4gKiB0byB0aGUgcHJvdG90eXBlIHNoYWRlciBzb3VyY2UgY29kZSBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqXG4gKiBAcGFyYW0gbWF0ZXJpYWwgLSBBIG1hdGVyaWFsXG4gKiBAcGFyYW0gdmVydGV4UHJvcGVydGllc1N0ciAtIEEgc3RyaW5nIG9mIHZlcnRleCBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gcGl4ZWxQcm9wZXJ0aWVzU3RyIC0gQSBzdHJpbmcgb2YgcGl4ZWwgcHJvcGVydGllc1xuICogQHBhcmFtIHZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zX3VuaWZvcm0gLSBBIHN0cmluZyBvZiB2ZXJ0ZXggc2hhZGVyIG1ldGhvZCBkZWZpbml0aW9ucyBpbiBVbmlmb3JtIFN0cmF0ZWd5XG4gKiBAcGFyYW0gaXNXZWJHTDIgLSBBIGZsYWcgd2hldGhlciB0aGUgY3VycmVudCBXZWJHTCBjb250ZXh0IGlzIFdlYkdMMiBvciBub3RcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlUHJvZ3JhbUFzU2luZ2xlT3BlcmF0aW9uV2ViR0woXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gIHZlcnRleFByb3BlcnRpZXNTdHI6IHN0cmluZyxcbiAgcGl4ZWxQcm9wZXJ0aWVzU3RyOiBzdHJpbmcsXG4gIHZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zX3VuaWZvcm06IHN0cmluZyxcbiAgaXNXZWJHTDI6IGJvb2xlYW5cbik6IFtDR0FQSVJlc291cmNlSGFuZGxlLCBib29sZWFuXSB7XG4gIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgY29uc3QgbWF0ZXJpYWxOb2RlID0gbWF0ZXJpYWwuX21hdGVyaWFsQ29udGVudDtcblxuICBsZXQgZGVmaW5pdGlvbnMgPSBtYXRlcmlhbE5vZGUuZ2V0RGVmaW5pdGlvbnMoKTtcbiAgY29uc3Qgc2hhZGVyRGVmaW5lcyA9IG1hdGVyaWFsLmdldFNoYWRlckRlZmluZXMoKTtcbiAgZm9yIChjb25zdCBzaGFkZXJEZWZpbmUgb2Ygc2hhZGVyRGVmaW5lcykge1xuICAgIGRlZmluaXRpb25zICs9IGAjZGVmaW5lICR7c2hhZGVyRGVmaW5lfVxcbmA7XG4gIH1cbiAgY29uc3QgdmVydGV4QXR0cmlidXRlRGVmaW5lcyA9IGRlZmluZUF0dHJpYnV0ZXMocHJpbWl0aXZlKTtcbiAgZGVmaW5pdGlvbnMgKz0gdmVydGV4QXR0cmlidXRlRGVmaW5lcztcblxuICAvLyBTaGFkZXIgQ29kZSBDb25zdHJ1Y3Rpb25cbiAgbGV0IHZlcnRleFNoYWRlciA9IF9zZXR1cEdsb2JhbFNoYWRlckRlZmluaXRpb25XZWJHTChtYXRlcmlhbC5fX21hdGVyaWFsVHlwZU5hbWUsIHByaW1pdGl2ZSk7XG4gIHZlcnRleFNoYWRlciArPSAnI2RlZmluZSBSTl9JU19WRVJURVhfU0hBREVSXFxuJztcbiAgbGV0IHBpeGVsU2hhZGVyID0gX3NldHVwR2xvYmFsU2hhZGVyRGVmaW5pdGlvbldlYkdMKG1hdGVyaWFsLl9fbWF0ZXJpYWxUeXBlTmFtZSwgcHJpbWl0aXZlKTtcbiAgcGl4ZWxTaGFkZXIgKz0gJyNkZWZpbmUgUk5fSVNfUElYRUxfU0hBREVSXFxuJztcbiAgaWYgKG1hdGVyaWFsLmlzQmxlbmQoKSkge1xuICAgIHBpeGVsU2hhZGVyICs9ICcjZGVmaW5lIFJOX0lTX0FMUEhBX01PREVfQkxFTkRcXG4nO1xuICB9XG4gIGlmIChtYXRlcmlhbC5pc01hc2soKSkge1xuICAgIHBpeGVsU2hhZGVyICs9ICcjZGVmaW5lIFJOX0lTX0FMUEhBX01PREVfTUFTS1xcbic7XG4gIH1cblxuICBjb25zdCB2ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSBTaGFkZXJpdHlVdGlsaXR5V2ViR0wuZmlsbFRlbXBsYXRlKFxuICAgIG1hdGVyaWFsTm9kZS52ZXJ0ZXhTaGFkZXJpdHlPYmplY3QhLFxuICAgIHtcbiAgICAgIGdldHRlcnM6IHZlcnRleFByb3BlcnRpZXNTdHIsXG4gICAgICBkZWZpbml0aW9uczogZGVmaW5pdGlvbnMsXG4gICAgICBkYXRhVUJPRGVmaW5pdGlvbjogd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0R2xzbERhdGFVQk9EZWZpbml0aW9uU3RyaW5nKCksXG4gICAgICBkYXRhVUJPVmVjNFNpemU6IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmdldEdsc2xEYXRhVUJPVmVjNFNpemVTdHJpbmcoKSxcbiAgICAgIG1hdHJpY2VzR2V0dGVyczogdmVydGV4U2hhZGVyTWV0aG9kRGVmaW5pdGlvbnNfdW5pZm9ybSxcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgcGl4ZWxTaGFkZXJpdHlPYmplY3QgPSBTaGFkZXJpdHlVdGlsaXR5V2ViR0wuZmlsbFRlbXBsYXRlKFxuICAgIG1hdGVyaWFsTm9kZS5waXhlbFNoYWRlcml0eU9iamVjdCEsXG4gICAge1xuICAgICAgcmVuZGVyVGFyZ2V0QmVnaW46IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmdldEdsc2xSZW5kZXJUYXJnZXRCZWdpblN0cmluZyg0KSxcbiAgICAgIGdldHRlcnM6IHBpeGVsUHJvcGVydGllc1N0cixcbiAgICAgIGRlZmluaXRpb25zOiBkZWZpbml0aW9ucyxcbiAgICAgIGRhdGFVQk9EZWZpbml0aW9uOiB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRHbHNsRGF0YVVCT0RlZmluaXRpb25TdHJpbmcoKSxcbiAgICAgIGRhdGFVQk9WZWM0U2l6ZTogd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0R2xzbERhdGFVQk9WZWM0U2l6ZVN0cmluZygpLFxuICAgICAgbWF0cmljZXNHZXR0ZXJzOiB2ZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9uc191bmlmb3JtLFxuICAgICAgcmVuZGVyVGFyZ2V0RW5kOiB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRHbHNsUmVuZGVyVGFyZ2V0RW5kU3RyaW5nKDQpLFxuICAgIH1cbiAgKTtcblxuICB2ZXJ0ZXhTaGFkZXIgKz0gdmVydGV4U2hhZGVyaXR5T2JqZWN0LmNvZGUucmVwbGFjZSgvI3ZlcnNpb25cXHMrKDEwMHwzMDBcXHMrZXMpLywgJycpO1xuICBwaXhlbFNoYWRlciArPSBwaXhlbFNoYWRlcml0eU9iamVjdC5jb2RlLnJlcGxhY2UoLyN2ZXJzaW9uXFxzKygxMDB8MzAwXFxzK2VzKS8sICcnKTtcblxuICBjb25zdCB7IGF0dHJpYnV0ZU5hbWVzLCBhdHRyaWJ1dGVTZW1hbnRpY3MgfSA9IF9nZXRBdHRyaWJ1dGVJbmZvKG1hdGVyaWFsTm9kZSk7XG4gIGNvbnN0IHZlcnRleEF0dHJpYnV0ZXNCaW5kaW5nID0gX291dHB1dFZlcnRleEF0dHJpYnV0ZUJpbmRpbmdJbmZvKFxuICAgIGF0dHJpYnV0ZU5hbWVzLFxuICAgIGF0dHJpYnV0ZVNlbWFudGljc1xuICApO1xuICB2ZXJ0ZXhTaGFkZXIgKz0gdmVydGV4QXR0cmlidXRlc0JpbmRpbmc7XG5cbiAgY29uc3QgW3NoYWRlclByb2dyYW1VaWQsIG5ld09uZV0gPSBTaGFkZXJIYW5kbGVyLl9jcmVhdGVTaGFkZXJQcm9ncmFtV2l0aENhY2hlKFxuICAgIG1hdGVyaWFsLFxuICAgIHZlcnRleFNoYWRlcixcbiAgICBwaXhlbFNoYWRlcixcbiAgICBhdHRyaWJ1dGVOYW1lcyxcbiAgICBhdHRyaWJ1dGVTZW1hbnRpY3NcbiAgKTtcblxuICByZXR1cm4gW3NoYWRlclByb2dyYW1VaWQsIG5ld09uZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2V0dXBHbG9iYWxTaGFkZXJEZWZpbml0aW9uV2ViR0wobWF0ZXJpYWxUeXBlTmFtZTogc3RyaW5nLCBwcmltaXRpdmU6IFByaW1pdGl2ZSkge1xuICBsZXQgZGVmaW5pdGlvbnMgPSAnJztcbiAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICBjb25zdCBnbHcgPSB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jdXJyZW50V2ViR0xDb250ZXh0V3JhcHBlciBhcyBXZWJHTENvbnRleHRXcmFwcGVyO1xuICBpZiAoZ2x3LmlzV2ViR0wyKSB7XG4gICAgZGVmaW5pdGlvbnMgKz0gJyN2ZXJzaW9uIDMwMCBlc1xcbiNkZWZpbmUgR0xTTF9FUzNcXG4nO1xuICAgIGlmIChDb25maWcuaXNVYm9FbmFibGVkKSB7XG4gICAgICBkZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9JU19VQk9fRU5BQkxFRFxcbic7XG4gICAgfVxuICB9XG4gIGRlZmluaXRpb25zICs9IGAjZGVmaW5lIFJOX01BVEVSSUFMX1RZUEVfTkFNRSAke21hdGVyaWFsVHlwZU5hbWV9XFxuYDtcbiAgaWYgKFByb2Nlc3NBcHByb2FjaC5pc0RhdGFUZXh0dXJlQXBwcm9hY2goU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCkpIHtcbiAgICBkZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXFxuJztcbiAgfSBlbHNlIHtcbiAgICBkZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9JU19VTklGT1JNX01PREVcXG4nO1xuICB9XG5cbiAgY29uc3Qgcm5YUk1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGUoJ3hyJykgYXMgUm5YUiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgd2ViWFJTeXN0ZW0gPSByblhSTW9kdWxlPy5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpO1xuICBpZiAoXG4gICAgSXMuZXhpc3Qod2ViWFJTeXN0ZW0pICYmXG4gICAgd2ViWFJTeXN0ZW0uaXNXZWJYUk1vZGUgJiZcbiAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5pc1N1cHBvcnRNdWx0aVZpZXdWUlJlbmRlcmluZygpXG4gICkge1xuICAgIGRlZmluaXRpb25zICs9ICcjZGVmaW5lIFdFQkdMMl9NVUxUSV9WSUVXXFxuJztcbiAgfVxuXG4gIC8vIGlmIChnbHcuX2lzV2ViWFJNb2RlICYmIGdsdy5pc19tdWx0aXZpZXcpIHtcbiAgLy8gICBkZWZpbml0aW9ucyArPSAnI2RlZmluZSBXRUJYUl9NVUxUSV9WSUVXX1ZJRVdfTlVNXzJcXG4nO1xuICAvLyB9XG5cbiAgaWYgKGdsdy5pc1dlYkdMMiB8fCBnbHcud2ViZ2wxRXh0RFJWKSB7XG4gICAgZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fSVNfU1VQUE9SVElOR19TVEFOREFSRF9ERVJJVkFUSVZFU1xcbic7XG4gIH1cbiAgaWYgKENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5NYXQ0M3gxKSB7XG4gICAgZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fQk9ORV9EQVRBX1RZUEVfTWF0NDN4MVxcbic7XG4gIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mikge1xuICAgIGRlZmluaXRpb25zICs9ICcjZGVmaW5lIFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMlxcbic7XG4gIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4Mk9sZCkge1xuICAgIGRlZmluaXRpb25zICs9ICcjZGVmaW5lIFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMl9PTERcXG4nO1xuICB9IGVsc2UgaWYgKENvbmZpZy5ib25lRGF0YVR5cGUgPT09IEJvbmVEYXRhVHlwZS5WZWM0eDEpIHtcbiAgICBkZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9CT05FX0RBVEFfVFlQRV9WRUM0WDFcXG4nO1xuICB9XG5cbiAgcmV0dXJuIGRlZmluaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZVByb2dyYW1Bc1NpbmdsZU9wZXJhdGlvbldlYkdwdShcbiAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICBwcmltaXRpdmU6IFByaW1pdGl2ZSxcbiAgdmVydGV4U2hhZGVyTWV0aG9kRGVmaW5pdGlvbnM6IHN0cmluZyxcbiAgdmVydGV4UHJvcGVydGllc1N0cjogc3RyaW5nLFxuICBwaXhlbFByb3BlcnRpZXNTdHI6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IG1hdGVyaWFsTm9kZSA9IG1hdGVyaWFsLl9tYXRlcmlhbENvbnRlbnQ7XG5cbiAgbGV0IGRlZmluaXRpb25zID0gYC8vIE1hdGVyaWFsIFR5cGU6ICR7bWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZX1cXG5gO1xuICBkZWZpbml0aW9ucyArPSBtYXRlcmlhbE5vZGUuZ2V0RGVmaW5pdGlvbnMoKTtcbiAgY29uc3Qgc2hhZGVyRGVmaW5lcyA9IG1hdGVyaWFsLmdldFNoYWRlckRlZmluZXMoKTtcbiAgZm9yIChjb25zdCBzaGFkZXJEZWZpbmUgb2Ygc2hhZGVyRGVmaW5lcykge1xuICAgIGRlZmluaXRpb25zICs9IGAjZGVmaW5lICR7c2hhZGVyRGVmaW5lfVxcbmA7XG4gIH1cbiAgY29uc3QgdmVydGV4QXR0cmlidXRlRGVmaW5lcyA9IGRlZmluZUF0dHJpYnV0ZXMocHJpbWl0aXZlKTtcbiAgZGVmaW5pdGlvbnMgKz0gdmVydGV4QXR0cmlidXRlRGVmaW5lcztcblxuICBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLk1hdDQzeDEpIHtcbiAgICBkZWZpbml0aW9ucyArPSAnI2RlZmluZSBSTl9CT05FX0RBVEFfVFlQRV9NYXQ0M3gxXFxuJztcbiAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyKSB7XG4gICAgZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyXFxuJztcbiAgfSBlbHNlIGlmIChDb25maWcuYm9uZURhdGFUeXBlID09PSBCb25lRGF0YVR5cGUuVmVjNHgyT2xkKSB7XG4gICAgZGVmaW5pdGlvbnMgKz0gJyNkZWZpbmUgUk5fQk9ORV9EQVRBX1RZUEVfVkVDNFgyX09MRFxcbic7XG4gIH0gZWxzZSBpZiAoQ29uZmlnLmJvbmVEYXRhVHlwZSA9PT0gQm9uZURhdGFUeXBlLlZlYzR4MSkge1xuICAgIGRlZmluaXRpb25zICs9ICcjZGVmaW5lIFJOX0JPTkVfREFUQV9UWVBFX1ZFQzRYMVxcbic7XG4gIH1cblxuICBjb25zdCB2ZXJ0ZXhTaGFkZXJpdHlPYmplY3QgPSBTaGFkZXJpdHlVdGlsaXR5V2ViR0wuZmlsbFRlbXBsYXRlKFxuICAgIG1hdGVyaWFsTm9kZS52ZXJ0ZXhTaGFkZXJpdHlPYmplY3QhLFxuICAgIHtcbiAgICAgIGdldHRlcnM6IHZlcnRleFByb3BlcnRpZXNTdHIsXG4gICAgICBkZWZpbml0aW9uczogJy8vIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4jZGVmaW5lIFJOX0lTX1ZFUlRFWF9TSEFERVJcXG4nICsgZGVmaW5pdGlvbnMsXG4gICAgICBtYXRyaWNlc0dldHRlcnM6IHZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zLFxuICAgICAgbWF4TW9ycGhEYXRhTnVtYmVyOlxuICAgICAgICAnJyArXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICAoQ29uZmlnLm1heFZlcnRleFByaW1pdGl2ZU51bWJlckluU2hhZGVyICogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpIC8gNFxuICAgICAgICApLFxuICAgIH1cbiAgKTtcblxuICBsZXQgYWxwaGFNb2RlID0gJyc7XG4gIGlmIChtYXRlcmlhbC5pc0JsZW5kKCkpIHtcbiAgICBhbHBoYU1vZGUgKz0gJyNkZWZpbmUgUk5fSVNfQUxQSEFfTU9ERV9CTEVORFxcbic7XG4gIH1cbiAgaWYgKG1hdGVyaWFsLmlzTWFzaygpKSB7XG4gICAgYWxwaGFNb2RlICs9ICcjZGVmaW5lIFJOX0lTX0FMUEhBX01PREVfTUFTS1xcbic7XG4gIH1cblxuICBjb25zdCBwaXhlbFNoYWRlcml0eU9iamVjdCA9IFNoYWRlcml0eVV0aWxpdHlXZWJHTC5maWxsVGVtcGxhdGUoXG4gICAgbWF0ZXJpYWxOb2RlLnBpeGVsU2hhZGVyaXR5T2JqZWN0ISxcbiAgICB7XG4gICAgICBnZXR0ZXJzOiBwaXhlbFByb3BlcnRpZXNTdHIsXG4gICAgICBkZWZpbml0aW9uczogJy8vIFJOX0lTX1BJWEVMX1NIQURFUlxcbiNkZWZpbmUgUk5fSVNfUElYRUxfU0hBREVSXFxuJyArIGRlZmluaXRpb25zICsgYWxwaGFNb2RlLFxuICAgICAgbWF0cmljZXNHZXR0ZXJzOiB2ZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9ucyxcbiAgICAgIG1heE1vcnBoRGF0YU51bWJlcjpcbiAgICAgICAgJycgK1xuICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgKENvbmZpZy5tYXhWZXJ0ZXhQcmltaXRpdmVOdW1iZXJJblNoYWRlciAqIENvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyKSAvIDRcbiAgICAgICAgKSxcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgcHJlcHJvY2Vzc2VkVmVydGV4ID0gU2hhZGVyaXR5LnByb2Nlc3NQcmFnbWEodmVydGV4U2hhZGVyaXR5T2JqZWN0KTtcbiAgY29uc3QgcHJlcHJvY2Vzc2VkUGl4ZWwgPSBTaGFkZXJpdHkucHJvY2Vzc1ByYWdtYShwaXhlbFNoYWRlcml0eU9iamVjdCk7XG5cbiAgY29uc3QgW3Byb2dyYW1VaWQsIG5ld09uZV0gPSBTaGFkZXJIYW5kbGVyLl9jcmVhdGVTaGFkZXJQcm9ncmFtV2l0aENhY2hlKFxuICAgIG1hdGVyaWFsLFxuICAgIHByZXByb2Nlc3NlZFZlcnRleC5jb2RlLFxuICAgIHByZXByb2Nlc3NlZFBpeGVsLmNvZGUsXG4gICAgW10sXG4gICAgW11cbiAgKTtcbiAgcmV0dXJuIHByb2dyYW1VaWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUF0dHJpYnV0ZXMocHJpbWl0aXZlOiBQcmltaXRpdmUpIHtcbiAgbGV0IHZlcnRleEF0dHJpYnV0ZURlZmluZXMgPSAnJztcbiAgY29uc3QgYXR0cmlidXRlU2VtYW50aWNzID0gcHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljcztcbiAgZm9yIChjb25zdCBhdHRyaWJ1dGVTZW1hbnRpYyBvZiBhdHRyaWJ1dGVTZW1hbnRpY3MpIHtcbiAgICBpZiAoYXR0cmlidXRlU2VtYW50aWMuaW5kZXhPZignUE9TSVRJT04nKSAhPT0gLTEpIHtcbiAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX1BPU0lUSU9OXFxuYDtcbiAgICAgIGNvbnN0IGFjY2Vzc29yID0gcHJpbWl0aXZlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVTZW1hbnRpYyk7XG4gICAgICBpZiAoYWNjZXNzb3IhLmNvbXBvbmVudFR5cGUuaXNGbG9hdGluZ1BvaW50KCkpIHtcbiAgICAgICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSBgI2RlZmluZSBSTl9VU0VfUE9TSVRJT05fRkxPQVRcXG5gO1xuICAgICAgfSBlbHNlIGlmIChhY2Nlc3NvciEuY29tcG9uZW50VHlwZS5pc0ludGVnZXIoKSkge1xuICAgICAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZWZpbmVzICs9IGAjZGVmaW5lIFJOX1VTRV9QT1NJVElPTl9JTlRcXG5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSBgI2RlZmluZSBSTl9VU0VfUE9TSVRJT05fVUlOVFxcbmA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVTZW1hbnRpYy5pbmRleE9mKCdOT1JNQUwnKSAhPT0gLTEpIHtcbiAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX05PUk1BTFxcbmA7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVTZW1hbnRpYy5pbmRleE9mKCdUQU5HRU5UJykgIT09IC0xKSB7XG4gICAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZWZpbmVzICs9IGAjZGVmaW5lIFJOX1VTRV9UQU5HRU5UXFxuYDtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZVNlbWFudGljLmluZGV4T2YoJ1RFWENPT1JEXzAnKSAhPT0gLTEpIHtcbiAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX1RFWENPT1JEXzBcXG5gO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlU2VtYW50aWMuaW5kZXhPZignVEVYQ09PUkRfMScpICE9PSAtMSkge1xuICAgICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSBgI2RlZmluZSBSTl9VU0VfVEVYQ09PUkRfMVxcbmA7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVTZW1hbnRpYy5pbmRleE9mKCdDT0xPUl8wJykgIT09IC0xKSB7XG4gICAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZWZpbmVzICs9IGAjZGVmaW5lIFJOX1VTRV9DT0xPUl8wXFxuYDtcbiAgICAgIGNvbnN0IGFjY2Vzc29yID0gcHJpbWl0aXZlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVTZW1hbnRpYyk7XG4gICAgICBpZiAoYWNjZXNzb3IhLmNvbXBvbmVudFR5cGUuaXNGbG9hdGluZ1BvaW50KCkpIHtcbiAgICAgICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSBgI2RlZmluZSBSTl9VU0VfQ09MT1JfMF9GTE9BVFxcbmA7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yIS5jb21wb25lbnRUeXBlLmlzSW50ZWdlcigpKSB7XG4gICAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX0NPTE9SXzBfSU5UXFxuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX0NPTE9SXzBfVUlOVFxcbmA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVTZW1hbnRpYy5pbmRleE9mKCdKT0lOVFNfMCcpICE9PSAtMSkge1xuICAgICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSBgI2RlZmluZSBSTl9VU0VfSk9JTlRTXzBcXG5gO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlU2VtYW50aWMuaW5kZXhPZignV0VJR0hUU18wJykgIT09IC0xKSB7XG4gICAgICB2ZXJ0ZXhBdHRyaWJ1dGVEZWZpbmVzICs9IGAjZGVmaW5lIFJOX1VTRV9XRUlHSFRTXzBcXG5gO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlU2VtYW50aWMuaW5kZXhPZignRkFDRV9OT1JNQUwnKSAhPT0gLTEpIHtcbiAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX0ZBQ0VfTk9STUFMXFxuYDtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZVNlbWFudGljLmluZGV4T2YoJ0JBUllfQ0VOVFJJQ19DT09SRCcpICE9PSAtMSkge1xuICAgICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSBgI2RlZmluZSBSTl9VU0VfQkFSWV9DRU5UUklDX0NPT1JEXFxuYDtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZVNlbWFudGljLmluZGV4T2YoJ1RFWENPT1JEXzInKSAhPT0gLTEpIHtcbiAgICAgIHZlcnRleEF0dHJpYnV0ZURlZmluZXMgKz0gYCNkZWZpbmUgUk5fVVNFX1RFWENPT1JEXzJcXG5gO1xuICAgIH1cbiAgfVxuICBpZiAocHJpbWl0aXZlLnRhcmdldHMgIT0gbnVsbCAmJiBwcmltaXRpdmUudGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgdmVydGV4QXR0cmlidXRlRGVmaW5lcyArPSAnI2RlZmluZSBSTl9JU19NT1JQSElOR1xcbic7XG4gIH1cblxuICB2ZXJ0ZXhBdHRyaWJ1dGVEZWZpbmVzICs9IGAjZGVmaW5lIFJOX1VTRV9JTlNUQU5DRVxcbmA7XG4gIHJldHVybiB2ZXJ0ZXhBdHRyaWJ1dGVEZWZpbmVzO1xufVxuIiwiaW1wb3J0IFNoYWRlcml0eSwgeyBSZWZsZWN0aW9uLCBTaGFkZXJpdHlPYmplY3QsIFRlbXBsYXRlT2JqZWN0IH0gZnJvbSAnc2hhZGVyaXR5JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUsIENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlLCBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi8uLi9jb3JlL01lbW9yeU1hbmFnZXInO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL0NvbmZpZyc7XG5pbXBvcnQge1xuICBTaGFkZXJTZW1hbnRpY3MsXG4gIFNoYWRlclNlbWFudGljc0NsYXNzLFxuICBTaGFkZXJTZW1hbnRpY3NOYW1lLFxufSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3IyJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVZlY3RvcjQnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlTWF0cml4MzMnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDQ0IH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZVNjYWxhciB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVNjYWxhcic7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MjIgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXgyMic7XG5pbXBvcnQgeyBTaGFkZXJUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyVHlwZSc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBEZWZhdWx0VGV4dHVyZXMsIGR1bW15QmxhY2tUZXh0dXJlLCBkdW1teVdoaXRlVGV4dHVyZSB9IGZyb20gJy4vRHVtbXlUZXh0dXJlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCB0eXBlIEZpbGxBcmdzT2JqZWN0ID0ge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBWZXJ0ZXhBdHRyaWJ1dGVzTGF5b3V0ID0ge1xuICBuYW1lczogc3RyaW5nW107XG4gIHNlbWFudGljczogVmVydGV4QXR0cmlidXRlRW51bVtdO1xuICBjb21wb3NpdGlvbnM6IENvbXBvc2l0aW9uVHlwZUVudW1bXTtcbiAgY29tcG9uZW50czogQ29tcG9uZW50VHlwZUVudW1bXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTaGFkZXJpdHlVdGlsaXR5V2ViR0wge1xuICBwdWJsaWMgc3RhdGljIGZpbGxUZW1wbGF0ZShcbiAgICBzaGFkZXJpdHlPYmplY3Q6IFNoYWRlcml0eU9iamVjdCxcbiAgICBhcmdzOiBGaWxsQXJnc09iamVjdFxuICApOiBTaGFkZXJpdHlPYmplY3Qge1xuICAgIGNvbnN0IHRlbXBsYXRlT2JqZWN0ID0gT2JqZWN0LmFzc2lnbihhcmdzLCB7XG4gICAgICBXZWxsS25vd25Db21wb25lbnRUSURzLFxuICAgICAgd2lkdGhPZkRhdGFUZXh0dXJlOiBgY29uc3QgaW50IHdpZHRoT2ZEYXRhVGV4dHVyZSA9ICR7TWVtb3J5TWFuYWdlci5idWZmZXJXaWR0aExlbmd0aH07YCxcbiAgICAgIGhlaWdodE9mRGF0YVRleHR1cmU6IGBjb25zdCBpbnQgaGVpZ2h0T2ZEYXRhVGV4dHVyZSA9ICR7TWVtb3J5TWFuYWdlci5idWZmZXJIZWlnaHRMZW5ndGh9O2AsXG4gICAgICBDb25maWcsXG4gICAgfSkgYXMgVGVtcGxhdGVPYmplY3Q7XG5cbiAgICByZXR1cm4gU2hhZGVyaXR5LmZpbGxUZW1wbGF0ZShzaGFkZXJpdHlPYmplY3QsIHRlbXBsYXRlT2JqZWN0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtV2ViR0xWZXJzaW9uKFxuICAgIHNoYWRlcml0eU9iamVjdDogU2hhZGVyaXR5T2JqZWN0LFxuICAgIGlzV2ViR0wyOiBib29sZWFuXG4gICk6IFNoYWRlcml0eU9iamVjdCB7XG4gICAgaWYgKGlzV2ViR0wyKSB7XG4gICAgICByZXR1cm4gU2hhZGVyaXR5LnRyYW5zZm9ybVRvR0xTTEVTMyhzaGFkZXJpdHlPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU2hhZGVyaXR5LnRyYW5zZm9ybVRvR0xTTEVTMShzaGFkZXJpdHlPYmplY3QsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QXR0cmlidXRlUmVmbGVjdGlvbihzaGFkZXJpdHlPYmplY3Q6IFNoYWRlcml0eU9iamVjdCk6IFZlcnRleEF0dHJpYnV0ZXNMYXlvdXQge1xuICAgIGNvbnN0IHJlZmxlY3Rpb24gPSBTaGFkZXJpdHkuY3JlYXRlUmVmbGVjdGlvbk9iamVjdChzaGFkZXJpdHlPYmplY3QpO1xuICAgIHRoaXMuX19zZXREZWZhdWx0QXR0cmlidXRlU2VtYW50aWNNYXAocmVmbGVjdGlvbik7XG5cbiAgICByZWZsZWN0aW9uLnJlZmxlY3QoKTtcblxuICAgIGNvbnN0IG5hbWVzID0gcmVmbGVjdGlvbi5hdHRyaWJ1dGVzTmFtZXM7XG4gICAgY29uc3Qgc2VtYW50aWNzID0gcmVmbGVjdGlvbi5hdHRyaWJ1dGVzU2VtYW50aWNzLm1hcCgoc2VtYW50aWMpID0+IHtcbiAgICAgIHJldHVybiBWZXJ0ZXhBdHRyaWJ1dGUuZnJvbVN0cmluZyhzZW1hbnRpYyk7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcG9zaXRpb25zID0gcmVmbGVjdGlvbi5hdHRyaWJ1dGVzVHlwZXMubWFwKCh0eXBlKSA9PiB7XG4gICAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLmZyb21HbHNsU3RyaW5nKHR5cGUpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSByZWZsZWN0aW9uLmF0dHJpYnV0ZXNUeXBlcy5tYXAoKHR5cGUpID0+IHtcbiAgICAgIHJldHVybiBDb21wb25lbnRUeXBlLmZyb21HbHNsU3RyaW5nKHR5cGUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzLFxuICAgICAgc2VtYW50aWNzLFxuICAgICAgY29tcG9zaXRpb25zLFxuICAgICAgY29tcG9uZW50cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19zZXREZWZhdWx0QXR0cmlidXRlU2VtYW50aWNNYXAocmVmbGVjdGlvbjogUmVmbGVjdGlvbikge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVNlbWFudGljc01hcCA9IG5ldyBNYXAoKTtcbiAgICBhdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdpbnN0YW5jZWluZm8nLCAnSU5TVEFOQ0UnKTtcbiAgICBhdHRyaWJ1dGVTZW1hbnRpY3NNYXAuc2V0KCdiYXJ5Y2VudHJpY2Nvb3JkJywgJ0JBUllfQ0VOVFJJQ19DT09SRCcpO1xuXG4gICAgcmVmbGVjdGlvbi5hZGRBdHRyaWJ1dGVTZW1hbnRpY3NNYXAoYXR0cmlidXRlU2VtYW50aWNzTWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2hhZGVyRGF0YVJlZmxlY3Rpb24oXG4gICAgc2hhZGVyaXR5T2JqZWN0OiBTaGFkZXJpdHlPYmplY3QsXG4gICAgZXhpc3RpbmdTaGFkZXJJbmZvTWFwPzogTWFwPFNoYWRlclNlbWFudGljc05hbWUsIFNoYWRlclNlbWFudGljc0luZm8+XG4gICk6IHtcbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IFNoYWRlclNlbWFudGljc0luZm9bXTtcbiAgICBzaGFkZXJpdHlPYmplY3Q6IFNoYWRlcml0eU9iamVjdDtcbiAgfSB7XG4gICAgY29uc3QgY29waWVkU2hhZGVyaXR5T2JqZWN0ID0gdGhpcy5fX2NvcHlTaGFkZXJpdHlPYmplY3Qoc2hhZGVyaXR5T2JqZWN0KTtcblxuICAgIGNvbnN0IHNwbGl0Q29kZSA9IHNoYWRlcml0eU9iamVjdC5jb2RlLnNwbGl0KC9cXHJcXG58XFxuLyk7XG4gICAgY29uc3QgdW5pZm9ybU9taXR0ZWRTaGFkZXJSb3dzID0gW107XG5cbiAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBzcGxpdENvZGUpIHtcbiAgICAgIGNvbnN0IHJlZyA9IC9eKD8hWy9dKVtcXHQgXSp1bmlmb3JtW1xcdCBdKyhcXHcrKVtcXHQgXSsoXFx3Kyk7W1xcdCBdKihcXC9cXC8pKltcXHQgXSooLiopLztcbiAgICAgIGNvbnN0IG1hdGNoVW5pZm9ybURlY2xhcmF0aW9uID0gcm93Lm1hdGNoKHJlZyk7XG5cbiAgICAgIGlmIChtYXRjaFVuaWZvcm1EZWNsYXJhdGlvbikge1xuICAgICAgICBjb25zdCB0eXBlID0gbWF0Y2hVbmlmb3JtRGVjbGFyYXRpb25bMV07XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IG1hdGNoVW5pZm9ybURlY2xhcmF0aW9uWzJdO1xuICAgICAgICBjb25zdCBpbmZvID0gbWF0Y2hVbmlmb3JtRGVjbGFyYXRpb25bNF07XG5cbiAgICAgICAgaWYgKHRoaXMuX19pZ25vcmVUaGlzVW5pZm9ybURlY2xhcmF0aW9uKGluZm8pKSB7XG4gICAgICAgICAgdW5pZm9ybU9taXR0ZWRTaGFkZXJSb3dzLnB1c2gocm93KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm8gPSB0aGlzLl9fY3JlYXRlU2hhZGVyU2VtYW50aWNzSW5mbyhcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICAgICAgICBpbmZvLFxuICAgICAgICAgIHNoYWRlcml0eU9iamVjdC5pc0ZyYWdtZW50U2hhZGVyLFxuICAgICAgICAgIGV4aXN0aW5nU2hhZGVySW5mb01hcFxuICAgICAgICApO1xuXG4gICAgICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKHNoYWRlclNlbWFudGljc0luZm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5pZm9ybU9taXR0ZWRTaGFkZXJSb3dzLnB1c2gocm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb3BpZWRTaGFkZXJpdHlPYmplY3QuY29kZSA9IHVuaWZvcm1PbWl0dGVkU2hhZGVyUm93cy5qb2luKCdcXG4nKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXk6IHNoYWRlclNlbWFudGljc0luZm9BcnJheSxcbiAgICAgIHNoYWRlcml0eU9iamVjdDogY29waWVkU2hhZGVyaXR5T2JqZWN0LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2NvcHlTaGFkZXJpdHlPYmplY3Qob2JqOiBTaGFkZXJpdHlPYmplY3QpIHtcbiAgICBjb25zdCBjb3BpZWRPYmo6IFNoYWRlcml0eU9iamVjdCA9IHtcbiAgICAgIGNvZGU6IG9iai5jb2RlLFxuICAgICAgc2hhZGVyU3RhZ2U6IG9iai5zaGFkZXJTdGFnZSxcbiAgICAgIGlzRnJhZ21lbnRTaGFkZXI6IG9iai5zaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvcGllZE9iajtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9faWdub3JlVGhpc1VuaWZvcm1EZWNsYXJhdGlvbihpbmZvOiBzdHJpbmcpIHtcbiAgICBjb25zdCBza2lwUHJvY2VzcyA9IGluZm8ubWF0Y2goL3NraXBQcm9jZXNzW1xcdCBdKj1bXFx0IF0qKFxcdyspWyxcXHQgXSovKTtcbiAgICBpZiAoc2tpcFByb2Nlc3M/LlsxXSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jcmVhdGVTaGFkZXJTZW1hbnRpY3NJbmZvKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB2YXJpYWJsZU5hbWU6IHN0cmluZyxcbiAgICBpbmZvOiBzdHJpbmcsXG4gICAgaXNGcmFnbWVudFNoYWRlcjogYm9vbGVhbixcbiAgICBleGlzdGluZ1NoYWRlckluZm9NYXA/OiBNYXA8U2hhZGVyU2VtYW50aWNzTmFtZSwgU2hhZGVyU2VtYW50aWNzSW5mbz5cbiAgKTogU2hhZGVyU2VtYW50aWNzSW5mbyB7XG4gICAgY29uc3QgY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGUuZnJvbUdsc2xTdHJpbmcodHlwZSk7XG4gICAgY29uc3QgY29tcG9zaXRpb25UeXBlID0gQ29tcG9zaXRpb25UeXBlLmZyb21HbHNsU3RyaW5nKHR5cGUpO1xuICAgIGNvbnN0IHN0YWdlID0gaXNGcmFnbWVudFNoYWRlciA/IFNoYWRlclR5cGUuUGl4ZWxTaGFkZXIgOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcjtcblxuICAgIGNvbnN0IHVfcHJlZml4ZWROYW1lID0gdmFyaWFibGVOYW1lLm1hdGNoKC91XyhcXHcrKS8pO1xuICAgIHZhcmlhYmxlTmFtZSA9IHVfcHJlZml4ZWROYW1lIVsxXTtcblxuICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm86IFNoYWRlclNlbWFudGljc0luZm8gPSB7XG4gICAgICBzZW1hbnRpYzogdmFyaWFibGVOYW1lLFxuICAgICAgY29tcG9zaXRpb25UeXBlLFxuICAgICAgY29tcG9uZW50VHlwZSxcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogZmFsc2UsXG4gICAgICBzdGFnZSxcbiAgICB9O1xuXG4gICAgdGhpcy5fX3NldFJob2Rvbml0ZU9yaWdpbmFsUGFyYW1ldGVyc1RvKHNoYWRlclNlbWFudGljc0luZm8sIGluZm8pO1xuXG4gICAgcmV0dXJuIHNoYWRlclNlbWFudGljc0luZm87XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX3NldFJob2Rvbml0ZU9yaWdpbmFsUGFyYW1ldGVyc1RvKFxuICAgIHNoYWRlclNlbWFudGljc0luZm86IFNoYWRlclNlbWFudGljc0luZm8sXG4gICAgaW5mbzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IHNvbG9EYXR1bSA9IGluZm8ubWF0Y2goL3NvbG9EYXR1bVtcXHQgXSo9W1xcdCBdKihcXHcrKVssXFx0IF0qLyk7XG4gICAgbGV0IGlzU29sb0RhdHVtRmxnID0gZmFsc2U7XG4gICAgaWYgKHNvbG9EYXR1bT8uWzFdID09PSAndHJ1ZScpIHtcbiAgICAgIGlzU29sb0RhdHVtRmxnID0gdHJ1ZTtcbiAgICB9XG4gICAgc2hhZGVyU2VtYW50aWNzSW5mby5zb2xvRGF0dW0gPSBpc1NvbG9EYXR1bUZsZztcblxuICAgIGNvbnN0IGlzSW50ZXJuYWxTZXR0aW5nID0gaW5mby5tYXRjaCgvaXNJbnRlcm5hbFNldHRpbmdbXFx0IF0qPVtcXHQgXSooXFx3KylbLFxcdCBdKi8pO1xuICAgIGxldCBpc0ludGVybmFsU2V0dGluZ0ZsZyA9IGZhbHNlO1xuICAgIGlmIChpc0ludGVybmFsU2V0dGluZz8uWzFdID09PSAndHJ1ZScpIHtcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nRmxnID0gdHJ1ZTtcbiAgICB9XG4gICAgc2hhZGVyU2VtYW50aWNzSW5mby5pc0ludGVybmFsU2V0dGluZyA9IGlzSW50ZXJuYWxTZXR0aW5nRmxnO1xuXG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gaW5mby5tYXRjaCgvaW5pdGlhbFZhbHVlW1xcdCBdKj1bXFx0IF0qKC4rKVssXFx0IF0qLyk7XG4gICAgaWYgKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY29uc3QgaW5pdGlhbFZhbHVlVGV4dCA9IGluaXRpYWxWYWx1ZVsxXTtcbiAgICAgIHNoYWRlclNlbWFudGljc0luZm8uaW5pdGlhbFZhbHVlID0gdGhpcy5fX2dldEluaXRpYWxWYWx1ZUZyb21UZXh0KFxuICAgICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLFxuICAgICAgICBpbml0aWFsVmFsdWVUZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLmluaXRpYWxWYWx1ZSA9IHRoaXMuX19nZXREZWZhdWx0SW5pdGlhbFZhbHVlKHNoYWRlclNlbWFudGljc0luZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGUgPSBpbmZvLm1hdGNoKFxuICAgICAgL25lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGVbXFx0IF0qPVtcXHQgXSooLispWyxcXHQgXSovXG4gICAgKTtcbiAgICBpZiAobmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZSkge1xuICAgICAgbGV0IG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGVGbGcgPSBmYWxzZTtcbiAgICAgIGlmIChuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlPy5bMV0gPT09ICd0cnVlJykge1xuICAgICAgICBuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlRmxnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNoYWRlclNlbWFudGljc0luZm8ubmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZSA9IG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGVGbGc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZXRJbml0aWFsVmFsdWVGcm9tVGV4dChcbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvLFxuICAgIGluaXRpYWxWYWx1ZVRleHQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCB0dXBsZSA9IGluaXRpYWxWYWx1ZVRleHQubWF0Y2goL1xcKChbXFxkXFx3LiwgXSspXFwpLyk7XG4gICAgY29uc3QgY2hlY2tDb21wb3NpdGlvbk51bWJlciA9IChleHBlY3RlZDogQ29tcG9zaXRpb25UeXBlRW51bSkgPT4ge1xuICAgICAgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlICE9PSBleHBlY3RlZCkge1xuICAgICAgICBMb2dnZXIuZXJyb3IoJ2NvbXBvbmVudCBudW1iZXIgb2YgaW5pdGlhbFZhbHVlIGlzIGludmFsaWQ6JyArIHNoYWRlclNlbWFudGljc0luZm8uc2VtYW50aWMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgaW5pdGlhbFZhbHVlO1xuICAgIGlmICh0dXBsZSkge1xuICAgICAgY29uc3QgdGV4dCA9IHR1cGxlWzFdO1xuICAgICAgY29uc3Qgc3BsaXQgPSB0ZXh0LnNwbGl0KCcsJyk7XG4gICAgICBzd2l0Y2ggKHNwbGl0Lmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2hlY2tDb21wb3NpdGlvbk51bWJlcihDb21wb3NpdGlvblR5cGUuU2NhbGFyKTtcbiAgICAgICAgICBpZiAoc3BsaXRbMF0gPT09ICd0cnVlJykge1xuICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gbmV3IE11dGFibGVTY2FsYXIobmV3IEZsb2F0MzJBcnJheShbMV0pKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwbGl0WzBdID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFswXSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFtwYXJzZUZsb2F0KHNwbGl0WzBdKV0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCB8fFxuICAgICAgICAgICAgc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkRTaGFkb3dcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3BsaXRbMV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzcGxpdFsxXS5zbGljZSgxKTtcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IFtwYXJzZUludChzcGxpdFswXSksIChEZWZhdWx0VGV4dHVyZXMgYXMgYW55KVtgZHVtbXkke2NvbG9yfVRleHR1cmVgXV07XG4gICAgICAgICAgfSBlbHNlIGlmIChzaGFkZXJTZW1hbnRpY3NJbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlRleHR1cmVDdWJlKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHNwbGl0WzFdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3BsaXRbMV0uc2xpY2UoMSk7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBbXG4gICAgICAgICAgICAgIHBhcnNlSW50KHNwbGl0WzBdKSxcbiAgICAgICAgICAgICAgKERlZmF1bHRUZXh0dXJlcyBhcyBhbnkpW2BkdW1teSR7Y29sb3J9Q3ViZVRleHR1cmVgXSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrQ29tcG9zaXRpb25OdW1iZXIoQ29tcG9zaXRpb25UeXBlLlZlYzIpO1xuICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gTXV0YWJsZVZlY3RvcjIuZnJvbUNvcHlBcnJheShbXG4gICAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMF0pLFxuICAgICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzFdKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNoZWNrQ29tcG9zaXRpb25OdW1iZXIoQ29tcG9zaXRpb25UeXBlLlZlYzMpO1xuICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFswXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzFdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMl0pLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2hlY2tDb21wb3NpdGlvbk51bWJlcihDb21wb3NpdGlvblR5cGUuVmVjNCk7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlID0gTXV0YWJsZVZlY3RvcjQuZnJvbUNvcHlBcnJheShbXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzBdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMV0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsyXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzNdKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNoZWNrQ29tcG9zaXRpb25OdW1iZXIoQ29tcG9zaXRpb25UeXBlLk1hdDMpO1xuICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IE11dGFibGVNYXRyaXgzMy5mcm9tQ29weTlSb3dNYWpvcihcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMF0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzJdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbM10pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs0XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzVdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbNl0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs3XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzhdKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgY2hlY2tDb21wb3NpdGlvbk51bWJlcihDb21wb3NpdGlvblR5cGUuTWF0NCk7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlID0gTXV0YWJsZU1hdHJpeDQ0LmZyb21Db3B5MTZSb3dNYWpvcihcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMF0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzJdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbM10pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs0XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzVdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbNl0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs3XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzhdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbOV0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxMF0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxMV0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxMl0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxM10pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxNF0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxNV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBMb2dnZXIuZXJyb3IoJ0ludmFsaWQgZm9ybWF0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrQ29tcG9zaXRpb25OdW1iZXIoQ29tcG9zaXRpb25UeXBlLlNjYWxhcik7XG4gICAgICBpZiAoaW5pdGlhbFZhbHVlVGV4dCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBNdXRhYmxlU2NhbGFyKG5ldyBGbG9hdDMyQXJyYXkoWzFdKSk7XG4gICAgICB9IGVsc2UgaWYgKGluaXRpYWxWYWx1ZVRleHQgPT09ICdmYWxzZScpIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlID0gbmV3IE11dGFibGVTY2FsYXIobmV3IEZsb2F0MzJBcnJheShbMF0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBNdXRhYmxlU2NhbGFyKG5ldyBGbG9hdDMyQXJyYXkoW3BhcnNlRmxvYXQoaW5pdGlhbFZhbHVlVGV4dCldKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluaXRpYWxWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZShzaGFkZXJTZW1hbnRpY3NJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvKSB7XG4gICAgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyKSB7XG4gICAgICByZXR1cm4gbmV3IE11dGFibGVTY2FsYXIobmV3IEZsb2F0MzJBcnJheShbMF0pKTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMikge1xuICAgICAgcmV0dXJuIE11dGFibGVWZWN0b3IyLnplcm8oKTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMykge1xuICAgICAgcmV0dXJuIE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjNCkge1xuICAgICAgcmV0dXJuIE11dGFibGVWZWN0b3I0Lnplcm8oKTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0Mikge1xuICAgICAgcmV0dXJuIE11dGFibGVNYXRyaXgyMi5pZGVudGl0eSgpO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5NYXQzKSB7XG4gICAgICByZXR1cm4gTXV0YWJsZU1hdHJpeDMzLmlkZW50aXR5KCk7XG4gICAgfSBlbHNlIGlmIChzaGFkZXJTZW1hbnRpY3NJbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDQpIHtcbiAgICAgIHJldHVybiBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJEKSB7XG4gICAgICByZXR1cm4gWzAsIGR1bW15V2hpdGVUZXh0dXJlXTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJEU2hhZG93KSB7XG4gICAgICByZXR1cm4gWzAsIGR1bW15V2hpdGVUZXh0dXJlXTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZUN1YmUpIHtcbiAgICAgIHJldHVybiBbMCwgZHVtbXlCbGFja1RleHR1cmVdO1xuICAgIH1cblxuICAgIExvZ2dlci53YXJuKCdpbml0aWFsIHZhbHVlIGlzIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiaW1wb3J0IFNoYWRlcml0eSwgeyBSZWZsZWN0aW9uLCBTaGFkZXJpdHlPYmplY3QsIFRlbXBsYXRlT2JqZWN0IH0gZnJvbSAnc2hhZGVyaXR5JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUsIENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlLCBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi8uLi9jb3JlL01lbW9yeU1hbmFnZXInO1xuaW1wb3J0IHsgV2VsbEtub3duQ29tcG9uZW50VElEcyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvV2VsbEtub3duQ29tcG9uZW50VElEcyc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL0NvbmZpZyc7XG5pbXBvcnQge1xuICBTaGFkZXJTZW1hbnRpY3MsXG4gIFNoYWRlclNlbWFudGljc0NsYXNzLFxuICBTaGFkZXJTZW1hbnRpY3NOYW1lLFxufSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVWZWN0b3IyJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVZlY3RvcjQnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlTWF0cml4MzMnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDQ0IH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZVNjYWxhciB9IGZyb20gJy4uLy4uL21hdGgvTXV0YWJsZVNjYWxhcic7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MjIgfSBmcm9tICcuLi8uLi9tYXRoL011dGFibGVNYXRyaXgyMic7XG5pbXBvcnQgeyBTaGFkZXJUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyVHlwZSc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBEZWZhdWx0VGV4dHVyZXMsIGR1bW15QmxhY2tUZXh0dXJlLCBkdW1teVdoaXRlVGV4dHVyZSB9IGZyb20gJy4vRHVtbXlUZXh0dXJlcyc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vLi4vbWlzYy9Mb2dnZXInO1xuXG5leHBvcnQgdHlwZSBGaWxsQXJnc09iamVjdCA9IHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVmVydGV4QXR0cmlidXRlc0xheW91dCA9IHtcbiAgbmFtZXM6IHN0cmluZ1tdO1xuICBzZW1hbnRpY3M6IFZlcnRleEF0dHJpYnV0ZUVudW1bXTtcbiAgY29tcG9zaXRpb25zOiBDb21wb3NpdGlvblR5cGVFbnVtW107XG4gIGNvbXBvbmVudHM6IENvbXBvbmVudFR5cGVFbnVtW107XG59O1xuXG50eXBlIEJpbmRpbmcgPSBudW1iZXI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkZXJpdHlVdGlsaXR5V2ViR1BVIHtcbiAgcHVibGljIHN0YXRpYyBmaWxsVGVtcGxhdGUoXG4gICAgc2hhZGVyaXR5T2JqZWN0OiBTaGFkZXJpdHlPYmplY3QsXG4gICAgYXJnczogRmlsbEFyZ3NPYmplY3RcbiAgKTogU2hhZGVyaXR5T2JqZWN0IHtcbiAgICBjb25zdCB0ZW1wbGF0ZU9iamVjdCA9IE9iamVjdC5hc3NpZ24oYXJncywge1xuICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcyxcbiAgICAgIENvbmZpZyxcbiAgICB9KSBhcyBUZW1wbGF0ZU9iamVjdDtcblxuICAgIHJldHVybiBTaGFkZXJpdHkuZmlsbFRlbXBsYXRlKHNoYWRlcml0eU9iamVjdCwgdGVtcGxhdGVPYmplY3QpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRTaGFkZXJEYXRhUmVmbGVjdGlvbihcbiAgICBzaGFkZXJpdHlPYmplY3Q6IFNoYWRlcml0eU9iamVjdCxcbiAgICBleGlzdGluZ1NoYWRlckluZm9NYXA/OiBNYXA8U2hhZGVyU2VtYW50aWNzTmFtZSwgU2hhZGVyU2VtYW50aWNzSW5mbz5cbiAgKToge1xuICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdO1xuICAgIHNoYWRlcml0eU9iamVjdDogU2hhZGVyaXR5T2JqZWN0O1xuICB9IHtcbiAgICBjb25zdCBjb3BpZWRTaGFkZXJpdHlPYmplY3QgPSB0aGlzLl9fY29weVNoYWRlcml0eU9iamVjdChzaGFkZXJpdHlPYmplY3QpO1xuICAgIGNvbnN0IHRleHR1cmVNYXAgPSBuZXcgTWFwPEJpbmRpbmcsIFNoYWRlclNlbWFudGljc0luZm8+KCk7XG5cbiAgICBjb25zdCBzcGxpdENvZGUgPSBzaGFkZXJpdHlPYmplY3QuY29kZS5zcGxpdCgvXFxyXFxufFxcbi8pO1xuICAgIGNvbnN0IHVuaWZvcm1PbWl0dGVkU2hhZGVyUm93cyA9IFtdO1xuXG4gICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5ID0gW107XG4gICAgZm9yIChjb25zdCByb3cgb2Ygc3BsaXRDb2RlKSB7XG4gICAgICBjb25zdCByZWcgPVxuICAgICAgICAvXltcXHQgXSpcXC9cXC9bXFx0IF0qI3BhcmFtW1xcdCBdKyhcXHcrKVsgXFx0XSo6W1xcdCBdKihbXFx3PjxdKyk7W1xcdCBdKihcXC9cXC8pKltcXHQgXSooLiopLztcbiAgICAgIGNvbnN0IG1hdGNoVW5pZm9ybURlY2xhcmF0aW9uID0gcm93Lm1hdGNoKHJlZyk7XG5cbiAgICAgIGNvbnN0IHRleCA9XG4gICAgICAgIC9eW1xcdCBdKkBncm91cFxcKDFcXCkgQGJpbmRpbmdcXCgoXFxkKylcXClbIFxcdF0qdmFyWyBcXHRdKihcXHcrKVsgXFx0XSo6WyBcXHRdKihbXFx3PjxdKyk7W1xcdCBdKlxcL1xcLypbXFx0IF0qKC4qKS87XG4gICAgICBjb25zdCBtYXRjaFRleHR1cmVEZWNsYXJhdGlvbiA9IHJvdy5tYXRjaCh0ZXgpO1xuICAgICAgY29uc3Qgc2FtcGxlciA9XG4gICAgICAgIC9eW1xcdCBdKkBncm91cFxcKDJcXCkgQGJpbmRpbmdcXCgoXFxkKylcXClbIFxcdF0qdmFyWyBcXHRdKihcXHcrKVsgXFx0XSo6WyBcXHRdKnNhbXBsZXI7LztcbiAgICAgIGNvbnN0IG1hdGNoU2FtcGxlckRlY2xhcmF0aW9uID0gcm93Lm1hdGNoKHNhbXBsZXIpO1xuXG4gICAgICBpZiAobWF0Y2hVbmlmb3JtRGVjbGFyYXRpb24pIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IG1hdGNoVW5pZm9ybURlY2xhcmF0aW9uWzJdO1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBtYXRjaFVuaWZvcm1EZWNsYXJhdGlvblsxXTtcbiAgICAgICAgY29uc3QgaW5mbyA9IG1hdGNoVW5pZm9ybURlY2xhcmF0aW9uWzRdO1xuXG4gICAgICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm8gPSB0aGlzLl9fY3JlYXRlU2hhZGVyU2VtYW50aWNzSW5mbyhcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICAgICAgICBpbmZvLFxuICAgICAgICAgIHNoYWRlcml0eU9iamVjdC5pc0ZyYWdtZW50U2hhZGVyLFxuICAgICAgICAgIGV4aXN0aW5nU2hhZGVySW5mb01hcFxuICAgICAgICApO1xuXG4gICAgICAgIHNoYWRlclNlbWFudGljc0luZm9BcnJheS5wdXNoKHNoYWRlclNlbWFudGljc0luZm8pO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaFRleHR1cmVEZWNsYXJhdGlvbikge1xuICAgICAgICBjb25zdCBiaW5kaW5nID0gcGFyc2VJbnQobWF0Y2hUZXh0dXJlRGVjbGFyYXRpb25bMV0pO1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBtYXRjaFRleHR1cmVEZWNsYXJhdGlvblsyXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IG1hdGNoVGV4dHVyZURlY2xhcmF0aW9uWzNdO1xuICAgICAgICBjb25zdCBpbmZvID0gbWF0Y2hUZXh0dXJlRGVjbGFyYXRpb25bNF07XG5cbiAgICAgICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mbyA9IHRoaXMuX19jcmVhdGVTaGFkZXJTZW1hbnRpY0luZm9Gb3JUZXh0dXJlKFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdmFyaWFibGVOYW1lLFxuICAgICAgICAgIGJpbmRpbmcsXG4gICAgICAgICAgaW5mbyxcbiAgICAgICAgICBzaGFkZXJpdHlPYmplY3QuaXNGcmFnbWVudFNoYWRlcixcbiAgICAgICAgICBleGlzdGluZ1NoYWRlckluZm9NYXBcbiAgICAgICAgKTtcblxuICAgICAgICB0ZXh0dXJlTWFwLnNldChiaW5kaW5nLCBzaGFkZXJTZW1hbnRpY3NJbmZvKTtcblxuICAgICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkucHVzaChzaGFkZXJTZW1hbnRpY3NJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hTYW1wbGVyRGVjbGFyYXRpb24pIHtcbiAgICAgICAgY29uc3QgYmluZGluZyA9IHBhcnNlSW50KG1hdGNoU2FtcGxlckRlY2xhcmF0aW9uWzFdKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVOYW1lID0gbWF0Y2hTYW1wbGVyRGVjbGFyYXRpb25bMl07XG5cbiAgICAgICAgaWYgKHRleHR1cmVNYXAuaGFzKGJpbmRpbmcpKSB7XG4gICAgICAgICAgY29uc3QgdGV4dHVyZVNoYWRlclNlbWFudGljc0luZm8gPSB0ZXh0dXJlTWFwLmdldChiaW5kaW5nKTtcbiAgICAgICAgICBpZiAodGV4dHVyZVNoYWRlclNlbWFudGljc0luZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IHNhbXBsZXIgPSBuZXcgU2FtcGxlcih7XG4gICAgICAgICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICAgICAgICAgIG1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICAgICAgICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyLlJlcGVhdCxcbiAgICAgICAgICAgICAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXIuUmVwZWF0LFxuICAgICAgICAgICAgICB3cmFwUjogVGV4dHVyZVBhcmFtZXRlci5SZXBlYXQsXG4gICAgICAgICAgICAgIGFuaXNvdHJvcHk6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXh0dXJlU2hhZGVyU2VtYW50aWNzSW5mby5pbml0aWFsVmFsdWVbMl0gPSBzYW1wbGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90IG1hdGNoXG4gICAgICAgIHVuaWZvcm1PbWl0dGVkU2hhZGVyUm93cy5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29waWVkU2hhZGVyaXR5T2JqZWN0LmNvZGUgPSB1bmlmb3JtT21pdHRlZFNoYWRlclJvd3Muam9pbignXFxuJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb0FycmF5OiBzaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXksXG4gICAgICBzaGFkZXJpdHlPYmplY3Q6IGNvcGllZFNoYWRlcml0eU9iamVjdCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jcmVhdGVTaGFkZXJTZW1hbnRpY0luZm9Gb3JUZXh0dXJlKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB2YXJpYWJsZU5hbWU6IHN0cmluZyxcbiAgICBiaW5kaW5nOiBudW1iZXIsXG4gICAgaW5mbzogc3RyaW5nLFxuICAgIGlzRnJhZ21lbnRTaGFkZXI6IGJvb2xlYW4sXG4gICAgZXhpc3RpbmdTaGFkZXJJbmZvTWFwPzogTWFwPFNoYWRlclNlbWFudGljc05hbWUsIFNoYWRlclNlbWFudGljc0luZm8+XG4gICk6IFNoYWRlclNlbWFudGljc0luZm8ge1xuICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlLkludDtcbiAgICBsZXQgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtID0gQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRDtcbiAgICBpZiAodHlwZS5pbmRleE9mKCd0ZXh0dXJlXzJkJykgIT09IC0xKSB7XG4gICAgICBjb21wb3NpdGlvblR5cGUgPSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJEO1xuICAgIH0gZWxzZSBpZiAodHlwZS5pbmRleE9mKCd0ZXh0dXJlX2N1YmUnKSAhPT0gLTEpIHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZSA9IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlQ3ViZTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFnZSA9IGlzRnJhZ21lbnRTaGFkZXIgPyBTaGFkZXJUeXBlLlBpeGVsU2hhZGVyIDogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXI7XG5cbiAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvID0ge1xuICAgICAgc2VtYW50aWM6IHZhcmlhYmxlTmFtZSxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGUsXG4gICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IGZhbHNlLFxuICAgICAgc3RhZ2UsXG4gICAgfTtcblxuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGluZm8ubWF0Y2goL2luaXRpYWxWYWx1ZVtcXHQgXSo9W1xcdCBdKiguKylbLFxcdCBdKi8pO1xuICAgIGlmIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZVRleHQgPSBpbml0aWFsVmFsdWVbMV07XG4gICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLmluaXRpYWxWYWx1ZSA9IHRoaXMuX19nZXRJbml0aWFsVmFsdWVGcm9tVGV4dEZvclRleHR1cmUoXG4gICAgICAgIHNoYWRlclNlbWFudGljc0luZm8sXG4gICAgICAgIGJpbmRpbmcsXG4gICAgICAgIGluaXRpYWxWYWx1ZVRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYWRlclNlbWFudGljc0luZm8uaW5pdGlhbFZhbHVlID0gdGhpcy5fX2dldERlZmF1bHRJbml0aWFsVmFsdWUoc2hhZGVyU2VtYW50aWNzSW5mbyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRlclNlbWFudGljc0luZm87XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2NyZWF0ZVNoYWRlclNlbWFudGljc0luZm8oXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHZhcmlhYmxlTmFtZTogc3RyaW5nLFxuICAgIGluZm86IHN0cmluZyxcbiAgICBpc0ZyYWdtZW50U2hhZGVyOiBib29sZWFuLFxuICAgIGV4aXN0aW5nU2hhZGVySW5mb01hcD86IE1hcDxTaGFkZXJTZW1hbnRpY3NOYW1lLCBTaGFkZXJTZW1hbnRpY3NJbmZvPlxuICApOiBTaGFkZXJTZW1hbnRpY3NJbmZvIHtcbiAgICBjb25zdCBjb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZS5mcm9tV2dzbFN0cmluZyh0eXBlKTtcbiAgICBjb25zdCBjb21wb3NpdGlvblR5cGUgPSBDb21wb3NpdGlvblR5cGUuZnJvbVdnc2xTdHJpbmcodHlwZSk7XG4gICAgY29uc3Qgc3RhZ2UgPSBpc0ZyYWdtZW50U2hhZGVyID8gU2hhZGVyVHlwZS5QaXhlbFNoYWRlciA6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyO1xuXG4gICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbyA9IHtcbiAgICAgIHNlbWFudGljOiB2YXJpYWJsZU5hbWUsXG4gICAgICBjb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiBmYWxzZSxcbiAgICAgIHN0YWdlLFxuICAgIH07XG5cbiAgICB0aGlzLl9fc2V0UmhvZG9uaXRlT3JpZ2luYWxQYXJhbWV0ZXJzVG8oc2hhZGVyU2VtYW50aWNzSW5mbywgaW5mbyk7XG5cbiAgICByZXR1cm4gc2hhZGVyU2VtYW50aWNzSW5mbztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fc2V0UmhvZG9uaXRlT3JpZ2luYWxQYXJhbWV0ZXJzVG8oXG4gICAgc2hhZGVyU2VtYW50aWNzSW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbyxcbiAgICBpbmZvOiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3Qgc29sb0RhdHVtID0gaW5mby5tYXRjaCgvc29sb0RhdHVtW1xcdCBdKj1bXFx0IF0qKFxcdyspWyxcXHQgXSovKTtcbiAgICBsZXQgaXNTb2xvRGF0dW1GbGcgPSBmYWxzZTtcbiAgICBpZiAoc29sb0RhdHVtPy5bMV0gPT09ICd0cnVlJykge1xuICAgICAgaXNTb2xvRGF0dW1GbGcgPSB0cnVlO1xuICAgIH1cbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLnNvbG9EYXR1bSA9IGlzU29sb0RhdHVtRmxnO1xuXG4gICAgY29uc3QgaXNJbnRlcm5hbFNldHRpbmcgPSBpbmZvLm1hdGNoKC9pc0ludGVybmFsU2V0dGluZ1tcXHQgXSo9W1xcdCBdKihcXHcrKVssXFx0IF0qLyk7XG4gICAgbGV0IGlzSW50ZXJuYWxTZXR0aW5nRmxnID0gZmFsc2U7XG4gICAgaWYgKGlzSW50ZXJuYWxTZXR0aW5nPy5bMV0gPT09ICd0cnVlJykge1xuICAgICAgaXNJbnRlcm5hbFNldHRpbmdGbGcgPSB0cnVlO1xuICAgIH1cbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLmlzSW50ZXJuYWxTZXR0aW5nID0gaXNJbnRlcm5hbFNldHRpbmdGbGc7XG5cbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBpbmZvLm1hdGNoKC9pbml0aWFsVmFsdWVbXFx0IF0qPVtcXHQgXSooLispWyxcXHQgXSovKTtcbiAgICBpZiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjb25zdCBpbml0aWFsVmFsdWVUZXh0ID0gaW5pdGlhbFZhbHVlWzFdO1xuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mby5pbml0aWFsVmFsdWUgPSB0aGlzLl9fZ2V0SW5pdGlhbFZhbHVlRnJvbVRleHQoXG4gICAgICAgIHNoYWRlclNlbWFudGljc0luZm8sXG4gICAgICAgIGluaXRpYWxWYWx1ZVRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYWRlclNlbWFudGljc0luZm8uaW5pdGlhbFZhbHVlID0gdGhpcy5fX2dldERlZmF1bHRJbml0aWFsVmFsdWUoc2hhZGVyU2VtYW50aWNzSW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZSA9IGluZm8ubWF0Y2goXG4gICAgICAvbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZVtcXHQgXSo9W1xcdCBdKiguKylbLFxcdCBdKi9cbiAgICApO1xuICAgIGlmIChuZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlKSB7XG4gICAgICBsZXQgbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZUZsZyA9IGZhbHNlO1xuICAgICAgaWYgKG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGU/LlsxXSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIG5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGVGbGcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mby5uZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlID0gbmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZUZsZztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2dldEluaXRpYWxWYWx1ZUZyb21UZXh0Rm9yVGV4dHVyZShcbiAgICBzaGFkZXJTZW1hbnRpY3NJbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvLFxuICAgIGJpbmRpbmc6IG51bWJlcixcbiAgICBpbml0aWFsVmFsdWVUZXh0OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGluaXRpYWxWYWx1ZTtcbiAgICBjb25zdCBzYW1wbGVyID0gbmV3IFNhbXBsZXIoe1xuICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhcixcbiAgICAgIG1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICB3cmFwUzogVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZSxcbiAgICAgIHdyYXBUOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgICAgd3JhcFI6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgICBhbmlzb3Ryb3B5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlRleHR1cmUyRCB8fFxuICAgICAgc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkRTaGFkb3dcbiAgICApIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gaW5pdGlhbFZhbHVlVGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGluaXRpYWxWYWx1ZVRleHQuc2xpY2UoMSk7XG4gICAgICBpbml0aWFsVmFsdWUgPSBbYmluZGluZywgKERlZmF1bHRUZXh0dXJlcyBhcyBhbnkpW2BkdW1teSR7Y29sb3J9VGV4dHVyZWBdLCBzYW1wbGVyXTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZUN1YmUpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gaW5pdGlhbFZhbHVlVGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGluaXRpYWxWYWx1ZVRleHQuc2xpY2UoMSk7XG4gICAgICBpbml0aWFsVmFsdWUgPSBbYmluZGluZywgKERlZmF1bHRUZXh0dXJlcyBhcyBhbnkpW2BkdW1teSR7Y29sb3J9Q3ViZVRleHR1cmVgXSwgc2FtcGxlcl07XG4gICAgfVxuICAgIHJldHVybiBpbml0aWFsVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2dldEluaXRpYWxWYWx1ZUZyb21UZXh0KFxuICAgIHNoYWRlclNlbWFudGljc0luZm86IFNoYWRlclNlbWFudGljc0luZm8sXG4gICAgaW5pdGlhbFZhbHVlVGV4dDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IHR1cGxlID0gaW5pdGlhbFZhbHVlVGV4dC5tYXRjaCgvXFwoKFtcXGRcXHcuLCBdKylcXCkvKTtcbiAgICBjb25zdCBjaGVja0NvbXBvc2l0aW9uTnVtYmVyID0gKGV4cGVjdGVkOiBDb21wb3NpdGlvblR5cGVFbnVtKSA9PiB7XG4gICAgICBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgIExvZ2dlci5lcnJvcignY29tcG9uZW50IG51bWJlciBvZiBpbml0aWFsVmFsdWUgaXMgaW52YWxpZDonICsgc2hhZGVyU2VtYW50aWNzSW5mby5zZW1hbnRpYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBpbml0aWFsVmFsdWU7XG4gICAgaWYgKHR1cGxlKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdHVwbGVbMV07XG4gICAgICBjb25zdCBzcGxpdCA9IHRleHQuc3BsaXQoJywnKTtcbiAgICAgIHN3aXRjaCAoc3BsaXQubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjaGVja0NvbXBvc2l0aW9uTnVtYmVyKENvbXBvc2l0aW9uVHlwZS5TY2FsYXIpO1xuICAgICAgICAgIGlmIChzcGxpdFswXSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFsxXSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3BsaXRbMF0gPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBNdXRhYmxlU2NhbGFyKG5ldyBGbG9hdDMyQXJyYXkoWzBdKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBNdXRhYmxlU2NhbGFyKG5ldyBGbG9hdDMyQXJyYXkoW3BhcnNlRmxvYXQoc3BsaXRbMF0pXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNoZWNrQ29tcG9zaXRpb25OdW1iZXIoQ29tcG9zaXRpb25UeXBlLlZlYzIpO1xuICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IE11dGFibGVWZWN0b3IyLmZyb21Db3B5QXJyYXkoW3BhcnNlRmxvYXQoc3BsaXRbMF0pLCBwYXJzZUZsb2F0KHNwbGl0WzFdKV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2hlY2tDb21wb3NpdGlvbk51bWJlcihDb21wb3NpdGlvblR5cGUuVmVjMyk7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlID0gTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlBcnJheShbXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzBdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMV0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsyXSksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjaGVja0NvbXBvc2l0aW9uTnVtYmVyKENvbXBvc2l0aW9uVHlwZS5WZWM0KTtcbiAgICAgICAgICBpbml0aWFsVmFsdWUgPSBNdXRhYmxlVmVjdG9yNC5mcm9tQ29weUFycmF5KFtcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMF0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFsxXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzJdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbM10pLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgY2hlY2tDb21wb3NpdGlvbk51bWJlcihDb21wb3NpdGlvblR5cGUuTWF0Myk7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlID0gTXV0YWJsZU1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFswXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzFdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMl0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFszXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzRdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbNV0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs2XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzddKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbOF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICBjaGVja0NvbXBvc2l0aW9uTnVtYmVyKENvbXBvc2l0aW9uVHlwZS5NYXQ0KTtcbiAgICAgICAgICBpbml0aWFsVmFsdWUgPSBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHkxNlJvd01ham9yKFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFswXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzFdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbMl0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFszXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzRdKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbNV0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs2XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzddKSxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoc3BsaXRbOF0pLFxuICAgICAgICAgICAgcGFyc2VGbG9hdChzcGxpdFs5XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzEwXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzExXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzEyXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzEzXSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzE0XSksXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHNwbGl0WzE1XSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIExvZ2dlci5lcnJvcignSW52YWxpZCBmb3JtYXQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tDb21wb3NpdGlvbk51bWJlcihDb21wb3NpdGlvblR5cGUuU2NhbGFyKTtcbiAgICAgIGlmIChpbml0aWFsVmFsdWVUZXh0ID09PSAndHJ1ZScpIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlID0gbmV3IE11dGFibGVTY2FsYXIobmV3IEZsb2F0MzJBcnJheShbMV0pKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbFZhbHVlVGV4dCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFswXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlID0gbmV3IE11dGFibGVTY2FsYXIobmV3IEZsb2F0MzJBcnJheShbcGFyc2VGbG9hdChpbml0aWFsVmFsdWVUZXh0KV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5pdGlhbFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZXREZWZhdWx0SW5pdGlhbFZhbHVlKHNoYWRlclNlbWFudGljc0luZm86IFNoYWRlclNlbWFudGljc0luZm8pIHtcbiAgICBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIpIHtcbiAgICAgIHJldHVybiBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFswXSkpO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMyKSB7XG4gICAgICByZXR1cm4gTXV0YWJsZVZlY3RvcjIuemVybygpO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMzKSB7XG4gICAgICByZXR1cm4gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWM0KSB7XG4gICAgICByZXR1cm4gTXV0YWJsZVZlY3RvcjQuemVybygpO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5NYXQyKSB7XG4gICAgICByZXR1cm4gTXV0YWJsZU1hdHJpeDIyLmlkZW50aXR5KCk7XG4gICAgfSBlbHNlIGlmIChzaGFkZXJTZW1hbnRpY3NJbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDMpIHtcbiAgICAgIHJldHVybiBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcbiAgICB9IGVsc2UgaWYgKHNoYWRlclNlbWFudGljc0luZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0NCkge1xuICAgICAgcmV0dXJuIE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQpIHtcbiAgICAgIHJldHVybiBbMCwgZHVtbXlXaGl0ZVRleHR1cmVdO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkRTaGFkb3cpIHtcbiAgICAgIHJldHVybiBbMCwgZHVtbXlXaGl0ZVRleHR1cmVdO1xuICAgIH0gZWxzZSBpZiAoc2hhZGVyU2VtYW50aWNzSW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlQ3ViZSkge1xuICAgICAgcmV0dXJuIFswLCBkdW1teUJsYWNrVGV4dHVyZV07XG4gICAgfVxuXG4gICAgTG9nZ2VyLndhcm4oJ2luaXRpYWwgdmFsdWUgaXMgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jb3B5U2hhZGVyaXR5T2JqZWN0KG9iajogU2hhZGVyaXR5T2JqZWN0KSB7XG4gICAgY29uc3QgY29waWVkT2JqOiBTaGFkZXJpdHlPYmplY3QgPSB7XG4gICAgICBjb2RlOiBvYmouY29kZSxcbiAgICAgIHNoYWRlclN0YWdlOiBvYmouc2hhZGVyU3RhZ2UsXG4gICAgICBpc0ZyYWdtZW50U2hhZGVyOiBvYmouc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb3BpZWRPYmo7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcblxuZXhwb3J0IGNsYXNzIFNvY2tldDxcbiAgTmFtZSBleHRlbmRzIHN0cmluZyxcbiAgTiBleHRlbmRzIENvbXBvc2l0aW9uVHlwZUVudW0sXG4gIFQgZXh0ZW5kcyBDb21wb25lbnRUeXBlRW51bVxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBOYW1lLFxuICAgIHB1YmxpYyByZWFkb25seSBjb21wb3NpdGlvblR5cGU6IE4sXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudFR5cGU6IFRcbiAgKSB7fVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BYnN0cmFjdE1hdGVyaWFsQ29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL01hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vTWF0ZXJpYWxSZXBvc2l0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vTWF0ZXJpYWxUeXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL1NoYWRlckdyYXBoUmVzb2x2ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFkZXJpdHlVdGlsaXR5V2ViR0wnO1xuZXhwb3J0ICogZnJvbSAnLi9EdW1teVRleHR1cmVzJztcbiIsImV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL25vZGVzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29udGVudHMvaW5kZXgnO1xuIiwiaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlLCBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgQWRkU2hhZGVyaXR5T2JqZWN0R0xTTCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BZGQuZ2xzbCc7XG5pbXBvcnQgQWRkU2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvQWRkLndnc2wnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi4vY29yZS9Tb2NrZXQnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcblxuZXhwb3J0IGNsYXNzIEFkZFNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3Rvcihjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgc3VwZXIoJ2FkZCcsIHtcbiAgICAgIGNvZGVHTFNMOiBBZGRTaGFkZXJpdHlPYmplY3RHTFNMLmNvZGUsXG4gICAgICBjb2RlV0dTTDogQWRkU2hhZGVyaXR5T2JqZWN0V0dTTC5jb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKG5ldyBTb2NrZXQoJ2xocycsIGNvbXBvc2l0aW9uVHlwZSwgY29tcG9uZW50VHlwZSkpO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaChuZXcgU29ja2V0KCdyaHMnLCBjb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGUpKTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKG5ldyBTb2NrZXQoJ291dFZhbHVlJywgY29tcG9zaXRpb25UeXBlLCBjb21wb25lbnRUeXBlKSk7XG4gIH1cblxuICBnZXRTb2NrZXRJbnB1dExocygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lucHV0c1swXTtcbiAgfVxuXG4gIGdldFNvY2tldElucHV0UmhzKCkge1xuICAgIHJldHVybiB0aGlzLl9faW5wdXRzWzFdO1xuICB9XG5cbiAgZ2V0U29ja2V0T3V0cHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9fb3V0cHV0c1swXTtcbiAgfVxuXG4gIGdldFNoYWRlckZ1bmN0aW9uTmFtZURlcml2YXRpdmUoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIgJiZcbiAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJcbiAgICAgICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkZsb2F0ICYmXG4gICAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkZsb2F0XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ0YzMkYzMic7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkludCAmJlxuICAgICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnSTMySTMyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzIgJiZcbiAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMyXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjMmZWZWMyZic7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzMgJiZcbiAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMzXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjM2ZWZWMzZic7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzQgJiZcbiAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWM0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjNGZWZWM0Zic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgQXR0cmlidXRlTm9ybWFsU2hhZGVyaXR5T2JqZWN0R0xTTCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVDb2xvci52ZXJ0JztcbmltcG9ydCBBdHRyaWJ1dGVOb3JtYWxTaGFkZXJpdHlPYmplY3RXR1NMIGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVDb2xvci52ZXJ0Lndnc2wnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlQ29sb3JTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2F0dHJpYnV0ZUNvbG9yJywge1xuICAgICAgY29kZUdMU0w6IEF0dHJpYnV0ZU5vcm1hbFNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBBdHRyaWJ1dGVOb3JtYWxTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFNoYWRlclN0YWdlKCdWZXJ0ZXgnKTtcblxuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjNCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IEF0dHJpYnV0ZU5vcm1hbFNoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvQXR0cmlidXRlTm9ybWFsLnZlcnQnO1xuaW1wb3J0IEF0dHJpYnV0ZU5vcm1hbFNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZU5vcm1hbC52ZXJ0Lndnc2wnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlTm9ybWFsU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdhdHRyaWJ1dGVOb3JtYWwnLCB7XG4gICAgICBjb2RlR0xTTDogQXR0cmlidXRlTm9ybWFsU2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlLFxuICAgICAgY29kZVdHU0w6IEF0dHJpYnV0ZU5vcm1hbFNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU3RhZ2UoJ1ZlcnRleCcpO1xuXG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICdvdXRWYWx1ZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgQXR0cmlidXRlUG9zaXRpb25TaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZVBvc2l0aW9uLnZlcnQnO1xuaW1wb3J0IEF0dHJpYnV0ZVBvc2l0aW9uU2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvQXR0cmlidXRlUG9zaXRpb24udmVydC53Z3NsJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4uL2NvcmUvU29ja2V0JztcblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZVBvc2l0aW9uU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdhdHRyaWJ1dGVQb3NpdGlvbicsIHtcbiAgICAgIGNvZGVHTFNMOiBBdHRyaWJ1dGVQb3NpdGlvblNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBBdHRyaWJ1dGVQb3NpdGlvblNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU3RhZ2UoJ1ZlcnRleCcpO1xuXG4gICAgdGhpcy5fX291dHB1dHMucHVzaChuZXcgU29ja2V0KCdvdXRWYWx1ZScsIENvbXBvc2l0aW9uVHlwZS5WZWM0LCBDb21wb25lbnRUeXBlLkZsb2F0KSk7XG4gIH1cblxuICBnZXRTb2NrZXRPdXRwdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19vdXRwdXRzWzBdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IEF0dHJpYnV0ZVRleGNvb3JkU2hhZGVyaXR5T2JqZWN0R0xTTCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9BdHRyaWJ1dGVUZXhjb29yZC52ZXJ0JztcbmltcG9ydCBBdHRyaWJ1dGVUZXhjb29yZFNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL0F0dHJpYnV0ZVRleGNvb3JkLnZlcnQud2dzbCc7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVUZXhjb29yZFNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignYXR0cmlidXRlVGV4Y29vcmQnLCB7XG4gICAgICBjb2RlR0xTTDogQXR0cmlidXRlVGV4Y29vcmRTaGFkZXJpdHlPYmplY3RHTFNMLmNvZGUsXG4gICAgICBjb2RlV0dTTDogQXR0cmlidXRlVGV4Y29vcmRTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFNoYWRlclN0YWdlKCdWZXJ0ZXgnKTtcblxuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUsIENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IEJsb2NrQmVnaW5TaGFkZXIgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJzL25vZGVzL0Jsb2NrQmVnaW5TaGFkZXInO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlLCBTaGFkZXJTb2NrZXQgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0JlZ2luU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIHByaXZhdGUgX192YWx1ZUlucHV0czogU2hhZGVyU29ja2V0W10gPSBbXTtcbiAgcHJpdmF0ZSBfX3ZhbHVlT3V0cHV0czogU2hhZGVyU29ja2V0W10gPSBbXTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2Jsb2NrQmVnaW4nLCB7fSk7XG5cbiAgICB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICs9ICdfJyArIHRoaXMuX19zaGFkZXJOb2RlVWlkO1xuXG4gICAgdGhpcy5fX2NvbW1vblBhcnQgPSBuZXcgQmxvY2tCZWdpblNoYWRlcihcbiAgICAgIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUsXG4gICAgICB0aGlzLl9fdmFsdWVJbnB1dHMsXG4gICAgICB0aGlzLl9fdmFsdWVPdXRwdXRzXG4gICAgKTtcblxuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkJvb2wsXG4gICAgICBuYW1lOiAnYmxvY2tTdGFydCcsXG4gICAgfSk7XG4gIH1cblxuICBhZGRJbnB1dEFuZE91dHB1dChjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiBgdmFsdWVfJHt0aGlzLl9fdmFsdWVJbnB1dHMubGVuZ3RofWAsXG4gICAgfTtcbiAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiBgb3V0VmFsdWVfJHt0aGlzLl9fdmFsdWVPdXRwdXRzLmxlbmd0aH1gLFxuICAgIH07XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKGlucHV0KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKG91dHB1dCk7XG4gICAgdGhpcy5fX3ZhbHVlSW5wdXRzLnB1c2goaW5wdXQpO1xuICAgIHRoaXMuX192YWx1ZU91dHB1dHMucHVzaChvdXRwdXQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBCbG9ja0VuZFNoYWRlciB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcnMvbm9kZXMvQmxvY2tFbmRTaGFkZXInO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tFbmRTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2Jsb2NrRW5kJywge30pO1xuXG4gICAgdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArPSAnXycgKyB0aGlzLl9fc2hhZGVyTm9kZVVpZDtcblxuICAgIHRoaXMuX19jb21tb25QYXJ0ID0gbmV3IEJsb2NrRW5kU2hhZGVyKFxuICAgICAgdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSxcbiAgICAgIHRoaXMuX19pbnB1dHMsXG4gICAgICB0aGlzLl9fb3V0cHV0c1xuICAgICk7XG4gIH1cblxuICBhZGRJbnB1dEFuZE91dHB1dChjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiBgdmFsdWVfJHt0aGlzLl9faW5wdXRzLmxlbmd0aH1gLFxuICAgIH07XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBjb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlOiBjb21wb25lbnRUeXBlLFxuICAgICAgbmFtZTogYG91dFZhbHVlXyR7dGhpcy5fX291dHB1dHMubGVuZ3RofWAsXG4gICAgfTtcbiAgICB0aGlzLl9faW5wdXRzLnB1c2goaW5wdXQpO1xuICAgIHRoaXMuX19vdXRwdXRzLnB1c2gob3V0cHV0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RhbnRWYXJpYWJsZVNoYWRlciB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcnMvbm9kZXMvQ29uc3RhbnRWYXJpYWJsZVNoYWRlcic7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgSVNjYWxhciB9IGZyb20gJy4uLy4uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBDb25zdGFudFZhcmlhYmxlU2hhZGVyTm9kZSB9IGZyb20gJy4vQ29uc3RhbnRWYXJpYWJsZVNoYWRlck5vZGUnO1xuXG5leHBvcnQgY2xhc3MgQ29uc3RhbnRTY2FsYXJWYXJpYWJsZVNoYWRlck5vZGU8XG4gIFQgZXh0ZW5kcyBDb21wb25lbnRUeXBlRW51bVxuPiBleHRlbmRzIENvbnN0YW50VmFyaWFibGVTaGFkZXJOb2RlPHR5cGVvZiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBUPiB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudFR5cGU6IFQpIHtcbiAgICBzdXBlcignQ29uc3RhbnRTY2FsYXInLCBDb21wb3NpdGlvblR5cGUuU2NhbGFyLCBjb21wb25lbnRUeXBlKTtcbiAgfVxuXG4gIHNldERlZmF1bHRJbnB1dFZhbHVlKHZhbHVlOiBJU2NhbGFyKSB7XG4gICAgKHRoaXMuX19jb21tb25QYXJ0IGFzIENvbnN0YW50VmFyaWFibGVTaGFkZXIpLnNldENvbnN0YW50VmFsdWUodmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb25zdGFudFZhcmlhYmxlU2hhZGVyIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVycy9ub2Rlcy9Db25zdGFudFZhcmlhYmxlU2hhZGVyJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IElWZWN0b3IgfSBmcm9tICcuLi8uLi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi4vY29yZS9Tb2NrZXQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRWYXJpYWJsZVNoYWRlck5vZGU8XG4gIE4gZXh0ZW5kcyBDb21wb3NpdGlvblR5cGVFbnVtLFxuICBUIGV4dGVuZHMgQ29tcG9uZW50VHlwZUVudW1cbj4gZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3Rvcihub2RlTmFtZTogc3RyaW5nLCBjb21wb3NpdGlvblR5cGU6IE4sIGNvbXBvbmVudFR5cGU6IFQpIHtcbiAgICBzdXBlcihub2RlTmFtZSwge30pO1xuXG4gICAgdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArPSAnXycgKyB0aGlzLl9fc2hhZGVyTm9kZVVpZDtcblxuICAgIHRoaXMuX19jb21tb25QYXJ0ID0gbmV3IENvbnN0YW50VmFyaWFibGVTaGFkZXIoXG4gICAgICB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lLFxuICAgICAgY29tcG9zaXRpb25UeXBlLFxuICAgICAgY29tcG9uZW50VHlwZVxuICAgICk7XG5cbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKG5ldyBTb2NrZXQoJ291dFZhbHVlJywgY29tcG9zaXRpb25UeXBlLCBjb21wb25lbnRUeXBlKSk7XG4gIH1cblxuICBzZXREZWZhdWx0SW5wdXRWYWx1ZSh2YWx1ZTogSVZlY3Rvcikge1xuICAgICh0aGlzLl9fY29tbW9uUGFydCBhcyBDb25zdGFudFZhcmlhYmxlU2hhZGVyKS5zZXRDb25zdGFudFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGdldFNvY2tldE91dHB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX291dHB1dHNbMF07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0YW50VmFyaWFibGVTaGFkZXIgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJzL25vZGVzL0NvbnN0YW50VmFyaWFibGVTaGFkZXInO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IElWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9JVmVjdG9yJztcbmltcG9ydCB7IENvbnN0YW50VmFyaWFibGVTaGFkZXJOb2RlIH0gZnJvbSAnLi9Db25zdGFudFZhcmlhYmxlU2hhZGVyTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBDb25zdGFudFZlY3RvcjJWYXJpYWJsZVNoYWRlck5vZGU8XG4gIFQgZXh0ZW5kcyBDb21wb25lbnRUeXBlRW51bVxuPiBleHRlbmRzIENvbnN0YW50VmFyaWFibGVTaGFkZXJOb2RlPHR5cGVvZiBDb21wb3NpdGlvblR5cGUuVmVjMiwgVD4ge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnRUeXBlOiBUKSB7XG4gICAgc3VwZXIoJ0NvbnN0YW50VmVjdG9yMicsIENvbXBvc2l0aW9uVHlwZS5WZWMyLCBjb21wb25lbnRUeXBlKTtcbiAgfVxuXG4gIHNldERlZmF1bHRJbnB1dFZhbHVlKHZhbHVlOiBJVmVjdG9yMikge1xuICAgICh0aGlzLl9fY29tbW9uUGFydCBhcyBDb25zdGFudFZhcmlhYmxlU2hhZGVyKS5zZXRDb25zdGFudFZhbHVlKHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RhbnRWYXJpYWJsZVNoYWRlciB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcnMvbm9kZXMvQ29uc3RhbnRWYXJpYWJsZVNoYWRlcic7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgQ29uc3RhbnRWYXJpYWJsZVNoYWRlck5vZGUgfSBmcm9tICcuL0NvbnN0YW50VmFyaWFibGVTaGFkZXJOb2RlJztcblxuZXhwb3J0IGNsYXNzIENvbnN0YW50VmVjdG9yM1ZhcmlhYmxlU2hhZGVyTm9kZTxcbiAgVCBleHRlbmRzIENvbXBvbmVudFR5cGVFbnVtXG4+IGV4dGVuZHMgQ29uc3RhbnRWYXJpYWJsZVNoYWRlck5vZGU8dHlwZW9mIENvbXBvc2l0aW9uVHlwZS5WZWMzLCBUPiB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudFR5cGU6IFQpIHtcbiAgICBzdXBlcignQ29uc3RhbnRWZWN0b3IzJywgQ29tcG9zaXRpb25UeXBlLlZlYzMsIGNvbXBvbmVudFR5cGUpO1xuICB9XG5cbiAgc2V0RGVmYXVsdElucHV0VmFsdWUodmFsdWU6IElWZWN0b3IzKSB7XG4gICAgKHRoaXMuX19jb21tb25QYXJ0IGFzIENvbnN0YW50VmFyaWFibGVTaGFkZXIpLnNldENvbnN0YW50VmFsdWUodmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdGFudFZhcmlhYmxlU2hhZGVyIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVycy9ub2Rlcy9Db25zdGFudFZhcmlhYmxlU2hhZGVyJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBJVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBDb25zdGFudFZhcmlhYmxlU2hhZGVyTm9kZSB9IGZyb20gJy4vQ29uc3RhbnRWYXJpYWJsZVNoYWRlck5vZGUnO1xuXG5leHBvcnQgY2xhc3MgQ29uc3RhbnRWZWN0b3I0VmFyaWFibGVTaGFkZXJOb2RlPFxuICBUIGV4dGVuZHMgQ29tcG9uZW50VHlwZUVudW1cbj4gZXh0ZW5kcyBDb25zdGFudFZhcmlhYmxlU2hhZGVyTm9kZTx0eXBlb2YgQ29tcG9zaXRpb25UeXBlLlZlYzQsIFQ+IHtcbiAgY29uc3RydWN0b3IoY29tcG9uZW50VHlwZTogVCkge1xuICAgIHN1cGVyKCdDb25zdGFudFZlY3RvcjQnLCBDb21wb3NpdGlvblR5cGUuVmVjNCwgY29tcG9uZW50VHlwZSk7XG4gIH1cblxuICBzZXREZWZhdWx0SW5wdXRWYWx1ZSh2YWx1ZTogSVZlY3RvcjQpIHtcbiAgICAodGhpcy5fX2NvbW1vblBhcnQgYXMgQ29uc3RhbnRWYXJpYWJsZVNoYWRlcikuc2V0Q29uc3RhbnRWYWx1ZSh2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCBEb3RQcm9kdWN0U2hhZGVyaXR5T2JqZWN0R0xTTCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Eb3RQcm9kdWN0Lmdsc2wnO1xuaW1wb3J0IERvdFByb2R1Y3RTaGFkZXJpdHlPYmplY3RXR1NMIGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Eb3RQcm9kdWN0Lndnc2wnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuXG5leHBvcnQgY2xhc3MgRG90UHJvZHVjdFNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3Rvcihjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgc3VwZXIoJ2RvdFByb2R1Y3QnLCB7XG4gICAgICBjb2RlR0xTTDogRG90UHJvZHVjdFNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBEb3RQcm9kdWN0U2hhZGVyaXR5T2JqZWN0V0dTTC5jb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogY29tcG9zaXRpb25UeXBlLFxuICAgICAgY29tcG9uZW50VHlwZTogY29tcG9uZW50VHlwZSxcbiAgICAgIG5hbWU6ICdsaHMnLFxuICAgIH0pO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAncmhzJyxcbiAgICB9KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2hhZGVyRnVuY3Rpb25OYW1lRGVyaXZhdGl2ZSgpOiBzdHJpbmcge1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICBpZiAodGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1ZlYzJmJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1ZlYzNmJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWM0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1ZlYzRmJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBjb21wb3NpdGlvbiB0eXBlLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSwgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IEdyZWF0ZXJTaGFkZXJpdHlPYmplY3QgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvR3JlYXRlci5nbHNsJztcblxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtLCBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSkge1xuICAgIHN1cGVyKCdncmVhdGVyJywge1xuICAgICAgY29kZUdMU0w6IEdyZWF0ZXJTaGFkZXJpdHlPYmplY3QuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiAnbGhzJyxcbiAgICB9KTtcbiAgICB0aGlzLl9faW5wdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBjb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3JocycsXG4gICAgfSk7XG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkJvb2wsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgSWZTdGF0ZW1lbnRTaGFkZXIgfSBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJzL25vZGVzL0lmU3RhdGVtZW50U2hhZGVyJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcblxuZXhwb3J0IGNsYXNzIElmU3RhdGVtZW50U2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdpZlN0YXRlbWVudCcsIHtcbiAgICAgIGNvbW1vblBhcnQ6IG5ldyBJZlN0YXRlbWVudFNoYWRlcigpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuQm9vbCxcbiAgICAgIG5hbWU6ICdjb25kaXRpb24nLFxuICAgIH0pO1xuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVW5rbm93bixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuVW5rbm93bixcbiAgICAgIG5hbWU6ICdpZlN0YXJ0JyxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCBNZXJnZVZlY3RvclNoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTWVyZ2VWZWN0b3IuZ2xzbCc7XG5pbXBvcnQgTWVyZ2VWZWN0b3JTaGFkZXJpdHlPYmplY3RXR1NMIGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9NZXJnZVZlY3Rvci53Z3NsJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5cbmV4cG9ydCBjbGFzcyBNZXJnZVZlY3RvclNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignbWVyZ2VWZWN0b3InLCB7XG4gICAgICBjb2RlR0xTTDogTWVyZ2VWZWN0b3JTaGFkZXJpdHlPYmplY3RHTFNMLmNvZGUsXG4gICAgICBjb2RlV0dTTDogTWVyZ2VWZWN0b3JTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9faW5wdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneHl6JyxcbiAgICB9KTtcbiAgICB0aGlzLl9faW5wdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneHknLFxuICAgIH0pO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICd6dycsXG4gICAgfSk7XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneCcsXG4gICAgfSk7XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneScsXG4gICAgfSk7XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneicsXG4gICAgfSk7XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAndycsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3h5encnLFxuICAgIH0pO1xuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneHl6JyxcbiAgICB9KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3h5JyxcbiAgICB9KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3p3JyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNoYWRlckZ1bmN0aW9uTmFtZURlcml2YXRpdmUoKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRDb25uZWN0aW9uc1swXSAhPSBudWxsICYmIHRoaXMuaW5wdXRDb25uZWN0aW9uc1s2XSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdYWVpfVyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0Q29ubmVjdGlvbnNbMV0gIT0gbnVsbCAmJiB0aGlzLmlucHV0Q29ubmVjdGlvbnNbMl0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnWFlfWlcnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlucHV0Q29ubmVjdGlvbnNbMV0gIT0gbnVsbCAmJlxuICAgICAgdGhpcy5pbnB1dENvbm5lY3Rpb25zWzVdICE9IG51bGwgJiZcbiAgICAgIHRoaXMuaW5wdXRDb25uZWN0aW9uc1s2XSAhPSBudWxsXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdYWV9aX1cnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlucHV0Q29ubmVjdGlvbnNbMl0gIT0gbnVsbCAmJlxuICAgICAgdGhpcy5pbnB1dENvbm5lY3Rpb25zWzNdICE9IG51bGwgJiZcbiAgICAgIHRoaXMuaW5wdXRDb25uZWN0aW9uc1s0XSAhPSBudWxsXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdaV19YX1knO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlucHV0Q29ubmVjdGlvbnNbM10gIT0gbnVsbCAmJlxuICAgICAgdGhpcy5pbnB1dENvbm5lY3Rpb25zWzRdICE9IG51bGwgJiZcbiAgICAgIHRoaXMuaW5wdXRDb25uZWN0aW9uc1s1XSAhPSBudWxsICYmXG4gICAgICB0aGlzLmlucHV0Q29ubmVjdGlvbnNbNl0gIT0gbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnWF9ZX1pfVyc7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBtYWtlQ2FsbFN0YXRlbWVudChcbiAgICBpOiBudW1iZXIsXG4gICAgc2hhZGVyTm9kZTogQWJzdHJhY3RTaGFkZXJOb2RlLFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIHZhcklucHV0TmFtZXM6IHN0cmluZ1tdW10sXG4gICAgdmFyT3V0cHV0TmFtZXM6IHN0cmluZ1tdW11cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgbGV0IHJvd1N0ciA9ICcnO1xuICAgIGlmICh2YXJJbnB1dE5hbWVzW2ldLmxlbmd0aCA+IDAgJiYgdmFyT3V0cHV0TmFtZXNbaV0ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZHVtbXlPdXRwdXRWYXJEZWZpbmVzID1cbiAgICAgICAgU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVVxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBgdmFyIGR1bW15WFlaV18ke2l9OiB2ZWM0PGYzMj47YCxcbiAgICAgICAgICAgICAgYHZhciBkdW1teVhZWl8ke2l9OiB2ZWMzPGYzMj47YCxcbiAgICAgICAgICAgICAgYHZhciBkdW1teVhZXyR7aX06IHZlYzI8ZjMyPjtgLFxuICAgICAgICAgICAgICBgdmFyIGR1bW15WldfJHtpfTogdmVjMjxmMzI+O2AsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIGB2ZWM0IGR1bW15WFlaV18ke2l9O2AsXG4gICAgICAgICAgICAgIGB2ZWMzIGR1bW15WFlaXyR7aX07YCxcbiAgICAgICAgICAgICAgYHZlYzIgZHVtbXlYWV8ke2l9O2AsXG4gICAgICAgICAgICAgIGB2ZWMyIGR1bW15WldfJHtpfTtgLFxuICAgICAgICAgICAgXTtcblxuICAgICAgY29uc3QgZHVtbXlPdXRwdXRBcmd1bWVudHMgPSBbXG4gICAgICAgIGBkdW1teVhZWldfJHtpfWAsXG4gICAgICAgIGBkdW1teVhZWl8ke2l9YCxcbiAgICAgICAgYGR1bW15WFlfJHtpfWAsXG4gICAgICAgIGBkdW1teVpXXyR7aX1gLFxuICAgICAgXTtcblxuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB2YXJPdXRwdXROYW1lc1tpXS5sZW5ndGg7IGsrKykge1xuICAgICAgICBjb25zdCBvdXRwdXROYW1lID0gdmFyT3V0cHV0TmFtZXNbaV1ba107XG4gICAgICAgIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3h5encnKSA+PSAwKSB7XG4gICAgICAgICAgZHVtbXlPdXRwdXRWYXJEZWZpbmVzWzBdID0gJyc7XG4gICAgICAgICAgZHVtbXlPdXRwdXRBcmd1bWVudHNbMF0gPSBvdXRwdXROYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKG91dHB1dE5hbWUuaW5kZXhPZigneHl6JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1sxXSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzFdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3h5JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1syXSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzJdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3p3JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1szXSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzNdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR1bW15T3V0cHV0QXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZHVtbXlPdXRwdXRBcmd1bWVudHNbaV0gPSAnJicgKyBkdW1teU91dHB1dEFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIG5vZGUgZnVuY3Rpb25zXG4gICAgICByb3dTdHIgKz0gZHVtbXlPdXRwdXRWYXJEZWZpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgcm93U3RyICs9IGAke2Z1bmN0aW9uTmFtZX0oYDtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdmFySW5wdXROYW1lc1tpXS5sZW5ndGg7IGsrKykge1xuICAgICAgICBpZiAoayAhPT0gMCkge1xuICAgICAgICAgIHJvd1N0ciArPSAnLCAnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0TmFtZSA9IHZhcklucHV0TmFtZXNbaV1ba107XG4gICAgICAgIHJvd1N0ciArPSBpbnB1dE5hbWU7XG4gICAgICB9XG4gICAgICByb3dTdHIgKz0gJywgJyArIGR1bW15T3V0cHV0QXJndW1lbnRzLmpvaW4oJywgJyk7XG4gICAgICByb3dTdHIgKz0gJyk7XFxuJztcbiAgICB9XG5cbiAgICBzdHIgKz0gcm93U3RyO1xuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCBNdWx0aXBseVNoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTXVsdGlwbHkuZ2xzbCc7XG5pbXBvcnQgTXVsdGlwbHlTaGFkZXJpdHlPYmplY3RXR1NMIGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9NdWx0aXBseS53Z3NsJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlwbHlTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtLCBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSkge1xuICAgIHN1cGVyKCdtdWx0aXBseScsIHtcbiAgICAgIGNvZGVHTFNMOiBNdWx0aXBseVNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBNdWx0aXBseVNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiAnbGhzJyxcbiAgICB9KTtcbiAgICB0aGlzLl9faW5wdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBjb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlOiBjb21wb25lbnRUeXBlLFxuICAgICAgbmFtZTogJ3JocycsXG4gICAgfSk7XG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IGNvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2hhZGVyRnVuY3Rpb25OYW1lRGVyaXZhdGl2ZSgpOiBzdHJpbmcge1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyICYmXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX19pbnB1dHNbMF0uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5GbG9hdCAmJlxuICAgICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5GbG9hdFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdGMzJGMzInO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuX19pbnB1dHNbMF0uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnQgJiZcbiAgICAgICAgICB0aGlzLl9faW5wdXRzWzFdLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuSW50XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ0kzMkkzMic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMyICYmXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMlxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1ZlYzJmVmVjMmYnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMzICYmXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjM1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1ZlYzNmVmVjM2YnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWM0ICYmXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjNFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1ZlYzRmVmVjNGYnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5NYXQyICYmXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0MlxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ01hdDJ4MmZNYXQyeDJmJztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0MyAmJlxuICAgICAgICB0aGlzLl9faW5wdXRzWzFdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDNcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdNYXQzeDNmTWF0M3gzZic7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDQgJiZcbiAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5NYXQ0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnTWF0NHg0Zk1hdDR4NGYnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IE5vcm1hbE1hdHJpeFNoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvTm9ybWFsTWF0cml4LnZlcnQnO1xuaW1wb3J0IE5vcm1hbE1hdHJpeFNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL05vcm1hbE1hdHJpeC52ZXJ0Lndnc2wnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuXG5leHBvcnQgY2xhc3MgTm9ybWFsTWF0cml4U2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdub3JtYWxNYXRyaXgnLCB7XG4gICAgICBjb2RlR0xTTDogTm9ybWFsTWF0cml4U2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlLFxuICAgICAgY29kZVdHU0w6IE5vcm1hbE1hdHJpeFNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U2hhZGVyU3RhZ2UoJ1ZlcnRleCcpO1xuXG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5NYXQzLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICdvdXRWYWx1ZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBOb3JtYWxpemVTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL05vcm1hbGl6ZS5nbHNsJztcbmltcG9ydCBOb3JtYWxpemVTaGFkZXJpdHlPYmplY3RXR1NMIGZyb20gJy4uLy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Ob3JtYWxpemUud2dzbCc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQge1xuICBDb21wb3NpdGlvblR5cGUsXG4gIENvbXBvc2l0aW9uVHlwZUVudW0sXG59IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtLCBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSkge1xuICAgIHN1cGVyKCdfbm9ybWFsaXplJywge1xuICAgICAgY29kZUdMU0w6IE5vcm1hbGl6ZVNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBOb3JtYWxpemVTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9faW5wdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBjb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlOiBjb21wb25lbnRUeXBlLFxuICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICB9KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogY29tcG9zaXRpb25UeXBlLFxuICAgICAgY29tcG9uZW50VHlwZTogY29tcG9uZW50VHlwZSxcbiAgICAgIG5hbWU6ICdvdXRWYWx1ZScsXG4gICAgfSk7XG4gIH1cblxuICBnZXRTaGFkZXJGdW5jdGlvbk5hbWVEZXJpdmF0aXZlKCk6IHN0cmluZyB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjMmYnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjM2YnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjNGYnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIGNvbXBvc2l0aW9uIHR5cGUuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IEVuZFNoYWRlciB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcnMvbm9kZXMvRW5kU2hhZGVyJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4uL2NvcmUvU29ja2V0JztcblxuZXhwb3J0IGNsYXNzIE91dENvbG9yU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdvdXRDb2xvcicsIHtcbiAgICAgIGNvbW1vblBhcnQ6IEVuZFNoYWRlci5nZXRJbnN0YW5jZSgpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTaGFkZXJTdGFnZSgnRnJhZ21lbnQnKTtcblxuICAgIHRoaXMuX19pbnB1dHMucHVzaChuZXcgU29ja2V0KCd2YWx1ZScsIENvbXBvc2l0aW9uVHlwZS5WZWM0LCBDb21wb25lbnRUeXBlLkZsb2F0KSk7XG4gIH1cblxuICBnZXRTb2NrZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lucHV0c1swXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IEVuZFNoYWRlciB9IGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcnMvbm9kZXMvRW5kU2hhZGVyJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4uL2NvcmUvU29ja2V0JztcblxuZXhwb3J0IGNsYXNzIE91dFBvc2l0aW9uU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdvdXRQb3NpdGlvbicsIHtcbiAgICAgIGNvbW1vblBhcnQ6IEVuZFNoYWRlci5nZXRJbnN0YW5jZSgpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKG5ldyBTb2NrZXQoJ3ZhbHVlJywgQ29tcG9zaXRpb25UeXBlLlZlYzQsIENvbXBvbmVudFR5cGUuRmxvYXQpKTtcbiAgfVxuXG4gIGdldFNvY2tldElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9faW5wdXRzWzBdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IFByb2plY3Rpb25NYXRyaXhTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1Byb2plY3Rpb25NYXRyaXgudmVydCc7XG5pbXBvcnQgUHJvamVjdGlvbk1hdHJpeFNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1Byb2plY3Rpb25NYXRyaXgudmVydC53Z3NsJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Rpb25NYXRyaXhTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3Byb2plY3Rpb25NYXRyaXgnLCB7XG4gICAgICBjb2RlR0xTTDogUHJvamVjdGlvbk1hdHJpeFNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBQcm9qZWN0aW9uTWF0cml4U2hhZGVyaXR5T2JqZWN0V0dTTC5jb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTaGFkZXJTdGFnZSgnVmVydGV4Jyk7XG5cbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLk1hdDQsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ291dFZhbHVlJyxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlLCBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgU2luU2hhZGVyaXR5T2JqZWN0R0xTTCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9TaW4uZ2xzbCc7XG5pbXBvcnQgU2luU2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvU2luLndnc2wnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi4vY29yZS9Tb2NrZXQnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcblxuZXhwb3J0IGNsYXNzIFNpblNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3Rvcihjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgc3VwZXIoJ19zaW4nLCB7XG4gICAgICBjb2RlR0xTTDogU2luU2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlLFxuICAgICAgY29kZVdHU0w6IFNpblNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX19pbnB1dHMucHVzaChuZXcgU29ja2V0KCd2YWx1ZScsIGNvbXBvc2l0aW9uVHlwZSwgY29tcG9uZW50VHlwZSkpO1xuICAgIHRoaXMuX19vdXRwdXRzLnB1c2gobmV3IFNvY2tldCgnb3V0VmFsdWUnLCBjb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGUpKTtcbiAgfVxuXG4gIGdldFNvY2tldElucHV0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pbnB1dHNbMF07XG4gIH1cblxuICBnZXRTb2NrZXRPdXRwdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19vdXRwdXRzWzBdO1xuICB9XG5cbiAgZ2V0U2hhZGVyRnVuY3Rpb25OYW1lRGVyaXZhdGl2ZSgpIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ0YzMic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMikge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdWZWMyZic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMykge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdWZWMzZic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjNCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdWZWM0Zic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSwgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IFN0ZXBTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1Ntb290aFN0ZXAuZ2xzbCc7XG5pbXBvcnQgU3RlcFNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1Ntb290aFN0ZXAud2dzbCc7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICcuLi9jb3JlL1NvY2tldCc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgU21vb3RoU3RlcFNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3Rvcihjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgc3VwZXIoJ19zbW9vdGhzdGVwJywge1xuICAgICAgY29kZUdMU0w6IFN0ZXBTaGFkZXJpdHlPYmplY3RHTFNMLmNvZGUsXG4gICAgICBjb2RlV0dTTDogU3RlcFNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX19pbnB1dHMucHVzaChuZXcgU29ja2V0KCd2YWx1ZScsIGNvbXBvc2l0aW9uVHlwZSwgY29tcG9uZW50VHlwZSkpO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaChuZXcgU29ja2V0KCdlZGdlMCcsIGNvbXBvc2l0aW9uVHlwZSwgY29tcG9uZW50VHlwZSkpO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaChuZXcgU29ja2V0KCdlZGdlMScsIGNvbXBvc2l0aW9uVHlwZSwgY29tcG9uZW50VHlwZSkpO1xuICAgIHRoaXMuX19vdXRwdXRzLnB1c2gobmV3IFNvY2tldCgnb3V0VmFsdWUnLCBjb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGUpKTtcbiAgfVxuXG4gIGdldFNvY2tldElucHV0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pbnB1dHNbMF07XG4gIH1cblxuICBnZXRTb2NrZXRPdXRwdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19vdXRwdXRzWzBdO1xuICB9XG5cbiAgZ2V0U2hhZGVyRnVuY3Rpb25OYW1lRGVyaXZhdGl2ZSgpIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ0YzMic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMikge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdWZWMyZic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMykge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdWZWMzZic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjNCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdWZWM0Zic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5pbXBvcnQgU3BsaXRWZWN0b3JTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1NwbGl0VmVjdG9yLmdsc2wnO1xuaW1wb3J0IFNwbGl0VmVjdG9yU2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvU3BsaXRWZWN0b3Iud2dzbCc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuXG5leHBvcnQgY2xhc3MgU3BsaXRWZWN0b3JTaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ3NwbGl0VmVjdG9yJywge1xuICAgICAgY29kZUdMU0w6IFNwbGl0VmVjdG9yU2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlLFxuICAgICAgY29kZVdHU0w6IFNwbGl0VmVjdG9yU2hhZGVyaXR5T2JqZWN0V0dTTC5jb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3h5encnLFxuICAgIH0pO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMzLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICd4eXonLFxuICAgIH0pO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICd4eScsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzMsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3h5eicsXG4gICAgfSk7XG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICd4eScsXG4gICAgfSk7XG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5WZWMyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICd6dycsXG4gICAgfSk7XG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3gnLFxuICAgIH0pO1xuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICd5JyxcbiAgICB9KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAneicsXG4gICAgfSk7XG4gICAgdGhpcy5fX291dHB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5TY2FsYXIsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3cnLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2hhZGVyRnVuY3Rpb25OYW1lRGVyaXZhdGl2ZSgpIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgZm9yIChjb25zdCBpbnB1dENvbm5lY3Rpb24gb2YgdGhpcy5pbnB1dENvbm5lY3Rpb25zKSB7XG4gICAgICAgIGlmIChpbnB1dENvbm5lY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChpbnB1dENvbm5lY3Rpb24uaW5wdXROYW1lT2ZUaGlzID09PSAneHl6dycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1hZWlcnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRDb25uZWN0aW9uLmlucHV0TmFtZU9mVGhpcyA9PT0gJ3h5eicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ1hZWic7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dENvbm5lY3Rpb24uaW5wdXROYW1lT2ZUaGlzID09PSAneHknKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdYWSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgICB9XG4gIH1cbiAgbWFrZUNhbGxTdGF0ZW1lbnQoXG4gICAgaTogbnVtYmVyLFxuICAgIHNoYWRlck5vZGU6IEFic3RyYWN0U2hhZGVyTm9kZSxcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICB2YXJJbnB1dE5hbWVzOiBzdHJpbmdbXVtdLFxuICAgIHZhck91dHB1dE5hbWVzOiBzdHJpbmdbXVtdXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGxldCByb3dTdHIgPSAnJztcbiAgICBpZiAodmFySW5wdXROYW1lc1tpXS5sZW5ndGggPiAwICYmIHZhck91dHB1dE5hbWVzW2ldLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGR1bW15T3V0cHV0VmFyRGVmaW5lcyA9XG4gICAgICAgIFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFVcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgYHZhciBkdW1teVhZWl8ke2l9OiB2ZWMzPGYzMj47YCxcbiAgICAgICAgICAgICAgYHZhciBkdW1teVhZXyR7aX06IHZlYzI8ZjMyPjtgLFxuICAgICAgICAgICAgICBgdmFyIGR1bW15WldfJHtpfTogdmVjMjxmMzI+O2AsXG4gICAgICAgICAgICAgIGB2YXIgZHVtbXlYXyR7aX06IGYzMjtgLFxuICAgICAgICAgICAgICBgdmFyIGR1bW15WV8ke2l9OiBmMzI7YCxcbiAgICAgICAgICAgICAgYHZhciBkdW1teVpfJHtpfTogZjMyO2AsXG4gICAgICAgICAgICAgIGB2YXIgZHVtbXlXXyR7aX06IGYzMjtgLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICBgdmVjMyBkdW1teVhZWl8ke2l9O2AsXG4gICAgICAgICAgICAgIGB2ZWMyIGR1bW15WFlfJHtpfTtgLFxuICAgICAgICAgICAgICBgdmVjMiBkdW1teVpXXyR7aX07YCxcbiAgICAgICAgICAgICAgYGZsb2F0IGR1bW15WF8ke2l9O2AsXG4gICAgICAgICAgICAgIGBmbG9hdCBkdW1teVlfJHtpfTtgLFxuICAgICAgICAgICAgICBgZmxvYXQgZHVtbXlaXyR7aX07YCxcbiAgICAgICAgICAgICAgYGZsb2F0IGR1bW15V18ke2l9O2AsXG4gICAgICAgICAgICBdO1xuXG4gICAgICBjb25zdCBkdW1teU91dHB1dEFyZ3VtZW50cyA9IFtcbiAgICAgICAgYGR1bW15WFlaXyR7aX1gLFxuICAgICAgICBgZHVtbXlYWV8ke2l9YCxcbiAgICAgICAgYGR1bW15WldfJHtpfWAsXG4gICAgICAgIGBkdW1teVhfJHtpfWAsXG4gICAgICAgIGBkdW1teVlfJHtpfWAsXG4gICAgICAgIGBkdW1teVpfJHtpfWAsXG4gICAgICAgIGBkdW1teVdfJHtpfWAsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHZhck91dHB1dE5hbWVzW2ldLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dE5hbWUgPSB2YXJPdXRwdXROYW1lc1tpXVtrXTtcbiAgICAgICAgaWYgKG91dHB1dE5hbWUuaW5kZXhPZigneHl6JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1swXSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzBdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3h5JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1sxXSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzFdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3p3JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1syXSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzJdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3gnKSA+PSAwKSB7XG4gICAgICAgICAgZHVtbXlPdXRwdXRWYXJEZWZpbmVzWzNdID0gJyc7XG4gICAgICAgICAgZHVtbXlPdXRwdXRBcmd1bWVudHNbM10gPSBvdXRwdXROYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKG91dHB1dE5hbWUuaW5kZXhPZigneScpID49IDApIHtcbiAgICAgICAgICBkdW1teU91dHB1dFZhckRlZmluZXNbNF0gPSAnJztcbiAgICAgICAgICBkdW1teU91dHB1dEFyZ3VtZW50c1s0XSA9IG91dHB1dE5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0TmFtZS5pbmRleE9mKCd6JykgPj0gMCkge1xuICAgICAgICAgIGR1bW15T3V0cHV0VmFyRGVmaW5lc1s1XSA9ICcnO1xuICAgICAgICAgIGR1bW15T3V0cHV0QXJndW1lbnRzWzVdID0gb3V0cHV0TmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRwdXROYW1lLmluZGV4T2YoJ3cnKSA+PSAwKSB7XG4gICAgICAgICAgZHVtbXlPdXRwdXRWYXJEZWZpbmVzWzZdID0gJyc7XG4gICAgICAgICAgZHVtbXlPdXRwdXRBcmd1bWVudHNbNl0gPSBvdXRwdXROYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHVtbXlPdXRwdXRBcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkdW1teU91dHB1dEFyZ3VtZW50c1tpXSA9ICcmJyArIGR1bW15T3V0cHV0QXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgbm9kZSBmdW5jdGlvbnNcbiAgICAgIHJvd1N0ciArPSBkdW1teU91dHB1dFZhckRlZmluZXMuam9pbignXFxuJyk7XG4gICAgICByb3dTdHIgKz0gYCR7ZnVuY3Rpb25OYW1lfShgO1xuICAgICAgY29uc3QgaW5wdXROYW1lID0gdmFySW5wdXROYW1lc1tpXVswXTtcbiAgICAgIHJvd1N0ciArPSBpbnB1dE5hbWU7XG4gICAgICByb3dTdHIgKz0gJywgJyArIGR1bW15T3V0cHV0QXJndW1lbnRzLmpvaW4oJywgJyk7XG4gICAgICByb3dTdHIgKz0gJyk7XFxuJztcbiAgICB9XG5cbiAgICBzdHIgKz0gcm93U3RyO1xuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlLCBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgU3RlcFNoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvU3RlcC5nbHNsJztcbmltcG9ydCBTdGVwU2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvU3RlcC53Z3NsJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4uL2NvcmUvU29ja2V0JztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBTdGVwU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bSwgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW0pIHtcbiAgICBzdXBlcignX3N0ZXAnLCB7XG4gICAgICBjb2RlR0xTTDogU3RlcFNoYWRlcml0eU9iamVjdEdMU0wuY29kZSxcbiAgICAgIGNvZGVXR1NMOiBTdGVwU2hhZGVyaXR5T2JqZWN0V0dTTC5jb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKG5ldyBTb2NrZXQoJ3ZhbHVlJywgY29tcG9zaXRpb25UeXBlLCBjb21wb25lbnRUeXBlKSk7XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKG5ldyBTb2NrZXQoJ2VkZ2UnLCBjb21wb3NpdGlvblR5cGUsIGNvbXBvbmVudFR5cGUpKTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKG5ldyBTb2NrZXQoJ291dFZhbHVlJywgY29tcG9zaXRpb25UeXBlLCBjb21wb25lbnRUeXBlKSk7XG4gIH1cblxuICBnZXRTb2NrZXRJbnB1dFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9faW5wdXRzWzBdO1xuICB9XG5cbiAgZ2V0U29ja2V0T3V0cHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9fb3V0cHV0c1swXTtcbiAgfVxuXG4gIGdldFNoYWRlckZ1bmN0aW9uTmFtZURlcml2YXRpdmUoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlNjYWxhcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdGMzInO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjMmYnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjM2YnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnVmVjNGYnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IFRpbWVTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1RpbWUuZ2xzbCc7XG5pbXBvcnQgVGltZVNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1RpbWUud2dzbCc7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2hhZGVyTm9kZSBleHRlbmRzIEFic3RyYWN0U2hhZGVyTm9kZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCd0aW1lJywge1xuICAgICAgY29kZUdMU0w6IFRpbWVTaGFkZXJpdHlPYmplY3RHTFNMLmNvZGUsXG4gICAgICBjb2RlV0dTTDogVGltZVNoYWRlcml0eU9iamVjdFdHU0wuY29kZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIG5hbWU6ICdvdXRWYWx1ZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgTXVsdGlwbHlTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1RyYW5zZm9ybS5nbHNsJztcbmltcG9ydCBNdWx0aXBseVNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1RyYW5zZm9ybS53Z3NsJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEFic3RyYWN0U2hhZGVyTm9kZSB9IGZyb20gJy4uL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1TaGFkZXJOb2RlIGV4dGVuZHMgQWJzdHJhY3RTaGFkZXJOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbGhzQ29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtLFxuICAgIGxoc0NvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtLFxuICAgIHJoc0NvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bSxcbiAgICByaHNDb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bVxuICApIHtcbiAgICBzdXBlcigndHJhbnNmb3JtJywge1xuICAgICAgY29kZUdMU0w6IE11bHRpcGx5U2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlLFxuICAgICAgY29kZVdHU0w6IE11bHRpcGx5U2hhZGVyaXR5T2JqZWN0V0dTTC5jb2RlLFxuICAgIH0pO1xuXG4gICAgbGV0IG91dFZhbHVlQ29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtID0gQ29tcG9zaXRpb25UeXBlLlVua25vd247XG4gICAgaWYgKFxuICAgICAgbGhzQ29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0NCAmJlxuICAgICAgcmhzQ29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjNFxuICAgICkge1xuICAgICAgb3V0VmFsdWVDb21wb3NpdGlvblR5cGUgPSBDb21wb3NpdGlvblR5cGUuVmVjNDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbGhzQ29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0MyAmJlxuICAgICAgcmhzQ29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjM1xuICAgICkge1xuICAgICAgb3V0VmFsdWVDb21wb3NpdGlvblR5cGUgPSBDb21wb3NpdGlvblR5cGUuVmVjMztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbGhzQ29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0MiAmJlxuICAgICAgcmhzQ29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMlxuICAgICkge1xuICAgICAgb3V0VmFsdWVDb21wb3NpdGlvblR5cGUgPSBDb21wb3NpdGlvblR5cGUuVmVjMjtcbiAgICB9XG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogbGhzQ29tcG9zaXRpb25UeXBlLFxuICAgICAgY29tcG9uZW50VHlwZTogbGhzQ29tcG9uZW50VHlwZSxcbiAgICAgIG5hbWU6ICdsaHMnLFxuICAgIH0pO1xuICAgIHRoaXMuX19pbnB1dHMucHVzaCh7XG4gICAgICBjb21wb3NpdGlvblR5cGU6IHJoc0NvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGU6IHJoc0NvbXBvbmVudFR5cGUsXG4gICAgICBuYW1lOiAncmhzJyxcbiAgICB9KTtcbiAgICB0aGlzLl9fb3V0cHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogb3V0VmFsdWVDb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlOiBsaHNDb21wb25lbnRUeXBlLFxuICAgICAgbmFtZTogJ291dFZhbHVlJyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNoYWRlckZ1bmN0aW9uTmFtZURlcml2YXRpdmUoKTogc3RyaW5nIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9faW5wdXRzWzBdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDIgJiZcbiAgICAgICAgdGhpcy5fX2lucHV0c1sxXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWMyXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zaGFkZXJGdW5jdGlvbk5hbWUgKyAnTWF0MngyZlZlYzJmJztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMF0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0MyAmJlxuICAgICAgICB0aGlzLl9faW5wdXRzWzFdLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzNcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArICdNYXQzeDNmVmVjM2YnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5fX2lucHV0c1swXS5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5NYXQ0ICYmXG4gICAgICAgIHRoaXMuX19pbnB1dHNbMV0uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjNFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc2hhZGVyRnVuY3Rpb25OYW1lICsgJ01hdDR4NGZWZWM0Zic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IFVuaWZvcm1EYXRhU2hhZGVyIH0gZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVycy9ub2Rlcy9Vbmlmb3JtRGF0YVNoYWRlcic7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICcuLi9jb3JlL1NvY2tldCc7XG5cbmV4cG9ydCBjbGFzcyBVbmlmb3JtRGF0YVNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3Rvcihjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKSB7XG4gICAgc3VwZXIoJ3VuaWZvcm1EYXRhJywge30pO1xuXG4gICAgdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSArPSAnXycgKyB0aGlzLl9fc2hhZGVyTm9kZVVpZDtcblxuICAgIHRoaXMuX19jb21tb25QYXJ0ID0gbmV3IFVuaWZvcm1EYXRhU2hhZGVyKFxuICAgICAgdGhpcy5fX3NoYWRlckZ1bmN0aW9uTmFtZSxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGVcbiAgICApO1xuXG4gICAgdGhpcy5fX291dHB1dHMucHVzaChuZXcgU29ja2V0KCdvdXRWYWx1ZScsIGNvbXBvc2l0aW9uVHlwZSwgY29tcG9uZW50VHlwZSkpO1xuICB9XG5cbiAgc2V0RGVmYXVsdElucHV0VmFsdWUoaW5wdXROYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoaW5wdXROYW1lID09PSAndmFsdWUnKSB7XG4gICAgICAodGhpcy5fX2NvbW1vblBhcnQgYXMgVW5pZm9ybURhdGFTaGFkZXIpLnNldERlZmF1bHRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0VW5pZm9ybURhdGFOYW1lKHZhbHVlOiBhbnkpIHtcbiAgICAodGhpcy5fX2NvbW1vblBhcnQgYXMgVW5pZm9ybURhdGFTaGFkZXIpLnNldFZhcmlhYmxlTmFtZSh2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgVmlld01hdHJpeFNoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvVmlld01hdHJpeC52ZXJ0JztcbmltcG9ydCBWaWV3TWF0cml4U2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvbm9kZXMvVmlld01hdHJpeC52ZXJ0Lndnc2wnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuXG5leHBvcnQgY2xhc3MgVmlld01hdHJpeFNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigndmlld01hdHJpeCcsIHtcbiAgICAgIGNvZGVHTFNMOiBWaWV3TWF0cml4U2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlLFxuICAgICAgY29kZVdHU0w6IFZpZXdNYXRyaXhTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFNoYWRlclN0YWdlKCdWZXJ0ZXgnKTtcblxuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuTWF0NCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuaW1wb3J0IFdpcmVmcmFtZVNoYWRlcml0eU9iamVjdCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9XaXJlZnJhbWUuZ2xzbCc7XG5cbmV4cG9ydCBjbGFzcyBXaXJlZnJhbWVNYXRlcmlhbE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignd2lyZWZyYW1lJywge1xuICAgICAgY29kZUdMU0w6IFdpcmVmcmFtZVNoYWRlcml0eU9iamVjdC5jb2RlLFxuICAgIH0pO1xuXG4gICAgLy8gSW5wdXRcbiAgICB0aGlzLl9faW5wdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjNCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAnZXhpc3RpbmdGcmFnQ29sb3InLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2lucHV0cy5wdXNoKHtcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlZlYzQsXG4gICAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgbmFtZTogJ3dpcmVmcmFtZUNvbG9yJyxcbiAgICB9KTtcblxuICAgIC8vIE91dHB1dFxuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjNCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAnb3V0Q29sb3InLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IFdvcmxkTWF0cml4U2hhZGVyaXR5T2JqZWN0R0xTTCBmcm9tICcuLi8uLi8uLi93ZWJnbC9zaGFkZXJpdHlfc2hhZGVycy9ub2Rlcy9Xb3JsZE1hdHJpeC52ZXJ0JztcbmltcG9ydCBXb3JsZE1hdHJpeFNoYWRlcml0eU9iamVjdFdHU0wgZnJvbSAnLi4vLi4vLi4vd2ViZ3B1L3NoYWRlcml0eV9zaGFkZXJzL25vZGVzL1dvcmxkTWF0cml4LnZlcnQud2dzbCc7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYWRlck5vZGUgfSBmcm9tICcuLi9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBXb3JsZE1hdHJpeFNoYWRlck5vZGUgZXh0ZW5kcyBBYnN0cmFjdFNoYWRlck5vZGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignd29ybGRNYXRyaXgnLCB7XG4gICAgICBjb2RlR0xTTDogV29ybGRNYXRyaXhTaGFkZXJpdHlPYmplY3RHTFNMLmNvZGUsXG4gICAgICBjb2RlV0dTTDogV29ybGRNYXRyaXhTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFNoYWRlclN0YWdlKCdWZXJ0ZXgnKTtcblxuICAgIHRoaXMuX19vdXRwdXRzLnB1c2goe1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuTWF0NCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBuYW1lOiAnb3V0VmFsdWUnLFxuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0FkZFNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9BdHRyaWJ1dGVDb2xvclNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9BdHRyaWJ1dGVOb3JtYWxTaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vQXR0cmlidXRlUG9zaXRpb25TaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vQXR0cmlidXRlVGV4Y29vcmRTaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vQmxvY2tCZWdpblNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9CbG9ja0VuZFNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zdGFudFNjYWxhclZhcmlhYmxlU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbnN0YW50VmVjdG9yMlZhcmlhYmxlU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbnN0YW50VmVjdG9yM1ZhcmlhYmxlU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbnN0YW50VmVjdG9yNFZhcmlhYmxlU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL0RvdFByb2R1Y3RTaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vR3JlYXRlclNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9JZlN0YXRlbWVudFNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9NdWx0aXBseVNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Ob3JtYWxNYXRyaXhTaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vTm9ybWFsaXplU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL091dENvbG9yU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL091dFBvc2l0aW9uU2hhZGVyTm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL1Byb2plY3Rpb25NYXRyaXhTaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vVW5pZm9ybURhdGFTaGFkZXJOb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vVmlld01hdHJpeFNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9XaXJlZnJhbWVNYXRlcmlhbE5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Xb3JsZE1hdHJpeFNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9TcGxpdFZlY3RvclNoYWRlck5vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9NZXJnZVZlY3RvclNoYWRlck5vZGUnO1xuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4vTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWF0aFV0aWwgfSBmcm9tICcuL01hdGhVdGlsJztcblxuLyoqXG4gKiBBIDNEIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3guXG4gKi9cbmV4cG9ydCBjbGFzcyBBQUJCIHtcbiAgcHJpdmF0ZSBfX21pbjogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIE51bWJlci5NQVhfVkFMVUUsXG4gICAgTnVtYmVyLk1BWF9WQUxVRSxcbiAgXSk7XG4gIHByaXZhdGUgX19tYXg6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlBcnJheShbXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gIF0pO1xuICBwcml2YXRlIF9fY2VudGVyUG9pbnQgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgX19sZW5ndGhDZW50ZXJUb0Nvcm5lciA9IDA7XG4gIHByaXZhdGUgX19pc0NlbnRlclBvaW50RGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgX19pc1ZhbmlsbGEgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQ2xvbmUgdGhpcyBBQUJCLlxuICAgKiBAcmV0dXJucyBhIGNsb25lZCBBQUJCLlxuICAgKi9cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQUFCQigpO1xuICAgIGluc3RhbmNlLl9fbWF4ID0gdGhpcy5fX21heC5jbG9uZSgpO1xuICAgIGluc3RhbmNlLl9fbWluID0gdGhpcy5fX21pbi5jbG9uZSgpO1xuICAgIGluc3RhbmNlLl9fY2VudGVyUG9pbnQgPSB0aGlzLl9fY2VudGVyUG9pbnQuY2xvbmUoKTtcbiAgICBpbnN0YW5jZS5fX2xlbmd0aENlbnRlclRvQ29ybmVyID0gdGhpcy5fX2xlbmd0aENlbnRlclRvQ29ybmVyO1xuICAgIGluc3RhbmNlLl9faXNDZW50ZXJQb2ludERpcnR5ID0gdGhpcy5fX2lzQ2VudGVyUG9pbnREaXJ0eTtcbiAgICBpbnN0YW5jZS5fX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IHRoaXMuX19pc0xlbmd0aENlbnRlclRvQ29ybmVyRGlydHk7XG4gICAgaW5zdGFuY2UuX19pc1ZhbmlsbGEgPSB0aGlzLl9faXNWYW5pbGxhO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgaW5uZXIgY29tcG9uZW50cyBmcm9tIGFub3RoZXIgQUFCQi5cbiAgICogQHBhcmFtIGFhYmJcbiAgICogQHJldHVybnMgdGhpc1xuICAgKi9cbiAgY29weUNvbXBvbmVudHMoYWFiYjogQUFCQikge1xuICAgIHRoaXMuX19tYXguY29weUNvbXBvbmVudHMoYWFiYi5fX21heCk7XG4gICAgdGhpcy5fX21pbi5jb3B5Q29tcG9uZW50cyhhYWJiLl9fbWluKTtcbiAgICB0aGlzLl9fY2VudGVyUG9pbnQuY29weUNvbXBvbmVudHMoYWFiYi5fX2NlbnRlclBvaW50KTtcbiAgICB0aGlzLl9fbGVuZ3RoQ2VudGVyVG9Db3JuZXIgPSBhYWJiLl9fbGVuZ3RoQ2VudGVyVG9Db3JuZXI7XG4gICAgdGhpcy5fX2lzQ2VudGVyUG9pbnREaXJ0eSA9IGFhYmIuX19pc0NlbnRlclBvaW50RGlydHk7XG4gICAgdGhpcy5fX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IGFhYmIuX19pc0xlbmd0aENlbnRlclRvQ29ybmVyRGlydHk7XG5cbiAgICB0aGlzLl9faXNWYW5pbGxhID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogaW5pdGlhbGl6ZSB0aGlzIEFBQkIuXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuX19taW4uc2V0Q29tcG9uZW50cyhOdW1iZXIuTUFYX1ZBTFVFLCBOdW1iZXIuTUFYX1ZBTFVFLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICB0aGlzLl9fbWF4LnNldENvbXBvbmVudHMoLU51bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFLCAtTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgdGhpcy5fX2NlbnRlclBvaW50Lnplcm8oKTtcbiAgICB0aGlzLl9fbGVuZ3RoQ2VudGVyVG9Db3JuZXIgPSAwO1xuICAgIHRoaXMuX19pc0NlbnRlclBvaW50RGlydHkgPSBmYWxzZTtcbiAgICB0aGlzLl9faXNMZW5ndGhDZW50ZXJUb0Nvcm5lckRpcnR5ID0gZmFsc2U7XG5cbiAgICB0aGlzLl9faXNWYW5pbGxhID0gdHJ1ZTtcbiAgfVxuXG4gIHNldCBtaW5Qb2ludCh2YWw6IFZlY3RvcjMpIHtcbiAgICB0aGlzLl9fbWluLmNvcHlDb21wb25lbnRzKHZhbCk7XG4gICAgdGhpcy5fX2lzQ2VudGVyUG9pbnREaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IHRydWU7XG5cbiAgICB0aGlzLl9faXNWYW5pbGxhID0gZmFsc2U7XG4gIH1cblxuICBnZXQgbWluUG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19taW4gYXMgVmVjdG9yMztcbiAgfVxuXG4gIHNldCBtYXhQb2ludCh2YWw6IFZlY3RvcjMpIHtcbiAgICB0aGlzLl9fbWF4LmNvcHlDb21wb25lbnRzKHZhbCk7XG4gICAgdGhpcy5fX2lzQ2VudGVyUG9pbnREaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IHRydWU7XG5cbiAgICB0aGlzLl9faXNWYW5pbGxhID0gZmFsc2U7XG4gIH1cblxuICBnZXQgbWF4UG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19tYXggYXMgVmVjdG9yMztcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gd2hldGhlciB0aGlzIEFBQkIgaXMgdmFuaWxsYSAobm90IGluaXRpYWxpemVkKSBvciBub3QuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBBQUJCIGlzIHZhbmlsbGEuXG4gICAqL1xuICBpc1ZhbmlsbGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1ZhbmlsbGE7XG4gIH1cblxuICAvKipcbiAgICogYWRkIGEgcG9zaXRpb24gZm9yIHVwZGF0aW5nIEFBQkIuXG4gICAqIEBwYXJhbSBwb3NpdGlvblZlY3RvclxuICAgKiBAcmV0dXJucyBnaXZlbiBwb3NpdGlvblZlY3Rvci5cbiAgICovXG4gIGFkZFBvc2l0aW9uKHBvc2l0aW9uVmVjdG9yOiBWZWN0b3IzKSB7XG4gICAgdGhpcy5fX21pbi54ID0gcG9zaXRpb25WZWN0b3IueCA8IHRoaXMuX19taW4ueCA/IHBvc2l0aW9uVmVjdG9yLnggOiB0aGlzLl9fbWluLng7XG4gICAgdGhpcy5fX21pbi55ID0gcG9zaXRpb25WZWN0b3IueSA8IHRoaXMuX19taW4ueSA/IHBvc2l0aW9uVmVjdG9yLnkgOiB0aGlzLl9fbWluLnk7XG4gICAgdGhpcy5fX21pbi56ID0gcG9zaXRpb25WZWN0b3IueiA8IHRoaXMuX19taW4ueiA/IHBvc2l0aW9uVmVjdG9yLnogOiB0aGlzLl9fbWluLno7XG5cbiAgICB0aGlzLl9fbWF4LnggPSB0aGlzLl9fbWF4LnggPCBwb3NpdGlvblZlY3Rvci54ID8gcG9zaXRpb25WZWN0b3IueCA6IHRoaXMuX19tYXgueDtcbiAgICB0aGlzLl9fbWF4LnkgPSB0aGlzLl9fbWF4LnkgPCBwb3NpdGlvblZlY3Rvci55ID8gcG9zaXRpb25WZWN0b3IueSA6IHRoaXMuX19tYXgueTtcbiAgICB0aGlzLl9fbWF4LnogPSB0aGlzLl9fbWF4LnogPCBwb3NpdGlvblZlY3Rvci56ID8gcG9zaXRpb25WZWN0b3IueiA6IHRoaXMuX19tYXguejtcblxuICAgIHRoaXMuX19pc0NlbnRlclBvaW50RGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX19pc0xlbmd0aENlbnRlclRvQ29ybmVyRGlydHkgPSB0cnVlO1xuXG4gICAgdGhpcy5fX2lzVmFuaWxsYSA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHBvc2l0aW9uVmVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBhIHBvc2l0aW9uIGZvciB1cGRhdGluZyBBQUJCLlxuICAgKiBAcGFyYW0gYXJyYXkgYSBwb3NpdGlvbiBhcnJheS5cbiAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBwb3NpdGlvbiBhcnJheSB0byBhZGRpbmcuXG4gICAqIEByZXR1cm5zIGdpdmVuIGFycmF5LlxuICAgKi9cbiAgYWRkUG9zaXRpb25XaXRoQXJyYXkoYXJyYXk6IG51bWJlcltdLCBpbmRleDogSW5kZXgpIHtcbiAgICB0aGlzLl9fbWluLnggPSBhcnJheVtpbmRleCArIDBdIDwgdGhpcy5fX21pbi54ID8gYXJyYXlbaW5kZXggKyAwXSA6IHRoaXMuX19taW4ueDtcbiAgICB0aGlzLl9fbWluLnkgPSBhcnJheVtpbmRleCArIDFdIDwgdGhpcy5fX21pbi55ID8gYXJyYXlbaW5kZXggKyAxXSA6IHRoaXMuX19taW4ueTtcbiAgICB0aGlzLl9fbWluLnogPSBhcnJheVtpbmRleCArIDJdIDwgdGhpcy5fX21pbi56ID8gYXJyYXlbaW5kZXggKyAyXSA6IHRoaXMuX19taW4uejtcbiAgICB0aGlzLl9fbWF4LnggPSB0aGlzLl9fbWF4LnggPCBhcnJheVtpbmRleCArIDBdID8gYXJyYXlbaW5kZXggKyAwXSA6IHRoaXMuX19tYXgueDtcbiAgICB0aGlzLl9fbWF4LnkgPSB0aGlzLl9fbWF4LnkgPCBhcnJheVtpbmRleCArIDFdID8gYXJyYXlbaW5kZXggKyAxXSA6IHRoaXMuX19tYXgueTtcbiAgICB0aGlzLl9fbWF4LnogPSB0aGlzLl9fbWF4LnogPCBhcnJheVtpbmRleCArIDJdID8gYXJyYXlbaW5kZXggKyAyXSA6IHRoaXMuX19tYXguejtcblxuICAgIHRoaXMuX19pc0NlbnRlclBvaW50RGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX19pc0xlbmd0aENlbnRlclRvQ29ybmVyRGlydHkgPSB0cnVlO1xuXG4gICAgdGhpcy5fX2lzVmFuaWxsYSA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlIHdpdGggYW5vdGhlciBBQUJCLlxuICAgKiBAcGFyYW0gYWFiYiBhbm90aGVyIEFBQkIgdG8gbWVyZ2VcbiAgICogQHJldHVybnMgbWVyZ2Ugc3VjY2VlZGVkIG9yIG5vdC5cbiAgICovXG4gIG1lcmdlQUFCQihhYWJiOiBBQUJCKSB7XG4gICAgaWYgKGFhYmIuaXNWYW5pbGxhKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuJ3QgbWVyZ2Ugd2l0aCB2YW5pbGxhIEFBQkIuXG4gICAgfVxuXG4gICAgdGhpcy5fX2lzQ2VudGVyUG9pbnREaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5pc1ZhbmlsbGEoKSkge1xuICAgICAgdGhpcy5fX21pbi5jb3B5Q29tcG9uZW50cyhhYWJiLm1pblBvaW50KTtcbiAgICAgIHRoaXMuX19tYXguY29weUNvbXBvbmVudHMoYWFiYi5tYXhQb2ludCk7XG4gICAgICB0aGlzLl9faXNWYW5pbGxhID0gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYWFiYi5taW5Qb2ludC54IDwgdGhpcy5fX21pbi54KSB7XG4gICAgICB0aGlzLl9fbWluLnggPSBhYWJiLm1pblBvaW50Lng7XG4gICAgfVxuICAgIGlmIChhYWJiLm1pblBvaW50LnkgPCB0aGlzLl9fbWluLnkpIHtcbiAgICAgIHRoaXMuX19taW4ueSA9IGFhYmIubWluUG9pbnQueTtcbiAgICB9XG4gICAgaWYgKGFhYmIubWluUG9pbnQueiA8IHRoaXMuX19taW4ueikge1xuICAgICAgdGhpcy5fX21pbi56ID0gYWFiYi5taW5Qb2ludC56O1xuICAgIH1cbiAgICBpZiAodGhpcy5fX21heC54IDwgYWFiYi5tYXhQb2ludC54KSB7XG4gICAgICB0aGlzLl9fbWF4LnggPSBhYWJiLm1heFBvaW50Lng7XG4gICAgfVxuICAgIGlmICh0aGlzLl9fbWF4LnkgPCBhYWJiLm1heFBvaW50LnkpIHtcbiAgICAgIHRoaXMuX19tYXgueSA9IGFhYmIubWF4UG9pbnQueTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19tYXgueiA8IGFhYmIubWF4UG9pbnQueikge1xuICAgICAgdGhpcy5fX21heC56ID0gYWFiYi5tYXhQb2ludC56O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBjZW50ZXIgb2YgdGhpcyBBQUJCLlxuICAgKi9cbiAgZ2V0IGNlbnRlclBvaW50KCkge1xuICAgIGlmICh0aGlzLl9faXNDZW50ZXJQb2ludERpcnR5KSB7XG4gICAgICBNdXRhYmxlVmVjdG9yMy5hZGRUbyh0aGlzLl9fbWluLCB0aGlzLl9fbWF4LCB0aGlzLl9fY2VudGVyUG9pbnQpLmRpdmlkZSgyKTtcbiAgICAgIHRoaXMuX19pc0NlbnRlclBvaW50RGlydHkgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19jZW50ZXJQb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGUgbGVuZ3RoIGZyb20gY2VudGVyIHRvIGNvcm5lciBvZiB0aGlzIEFBQkIuXG4gICAqL1xuICBnZXQgbGVuZ3RoQ2VudGVyVG9Db3JuZXIoKSB7XG4gICAgaWYgKHRoaXMuX19pc0xlbmd0aENlbnRlclRvQ29ybmVyRGlydHkpIHtcbiAgICAgIHRoaXMuX19sZW5ndGhDZW50ZXJUb0Nvcm5lciA9IFZlY3RvcjMubGVuZ3RoQnR3KHRoaXMuY2VudGVyUG9pbnQsIHRoaXMubWF4UG9pbnQpO1xuICAgICAgdGhpcy5fX2lzTGVuZ3RoQ2VudGVyVG9Db3JuZXJEaXJ0eSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2xlbmd0aENlbnRlclRvQ29ybmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBsZW5ndGggZnJvbSBtaW4geCB0byBtYXggeCBvZiB0aGlzIEFBQkIuXG4gICAqL1xuICBnZXQgc2l6ZVgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19tYXgueCAtIHRoaXMuX19taW4ueDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGUgbGVuZ3RoIGZyb20gbWluIHkgdG8gbWF4IHkgb2YgdGhpcyBBQUJCLlxuICAgKi9cbiAgZ2V0IHNpemVZKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWF4LnkgLSB0aGlzLl9fbWluLnk7XG4gIH1cblxuICAvKipcbiAgICogdGhlIGxlbmd0aCBmcm9tIG1pbiB6IHRvIG1heCB6IG9mIHRoaXMgQUFCQi5cbiAgICovXG4gIGdldCBzaXplWigpIHtcbiAgICByZXR1cm4gdGhpcy5fX21heC56IC0gdGhpcy5fX21pbi56O1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5IHRoaXMgQUFCQiB3aXRoIGEgZ2l2ZW4gbWF0cml4LlxuICAgKiBAcGFyYW0gbWF0cml4IGEgbWF0cml4IHRvIGNvbnZlcnQgYWFiYi5cbiAgICogQHBhcmFtIGFhYmIgZ2l2ZW4gQUFCQiB0byBjb252ZXJ0LlxuICAgKiBAcGFyYW0gb3V0QWFiYiBjb252ZXJ0ZWQgQUFCQiBieSBnaXZlbiBtYXRyaXguXG4gICAqIEByZXR1cm5zIGNvbnZlcnRlZCBBQUJCLlxuICAgKi9cbiAgc3RhdGljIG11bHRpcGx5TWF0cml4VG8obWF0cml4OiBNYXRyaXg0NCwgYWFiYjogQUFCQiwgb3V0QWFiYjogQUFCQikge1xuICAgIGlmIChhYWJiLmlzVmFuaWxsYSgpKSB7XG4gICAgICByZXR1cm4gb3V0QWFiYi5jb3B5Q29tcG9uZW50cyhhYWJiKTtcbiAgICB9XG4gICAgb3V0QWFiYi5pbml0aWFsaXplKCk7XG5cbiAgICBBQUJCLl9fdG1wVmVjdG9yMy54ID0gYWFiYi5fX21pbi54O1xuICAgIEFBQkIuX190bXBWZWN0b3IzLnkgPSBhYWJiLl9fbWluLnk7XG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueiA9IGFhYmIuX19taW4uejtcbiAgICBtYXRyaXgubXVsdGlwbHlWZWN0b3IzVG8oQUFCQi5fX3RtcFZlY3RvcjMsIEFBQkIuX190bXBWZWN0b3IzKTtcbiAgICBvdXRBYWJiLmFkZFBvc2l0aW9uKEFBQkIuX190bXBWZWN0b3IzKTtcblxuICAgIEFBQkIuX190bXBWZWN0b3IzLnggPSBhYWJiLl9fbWF4Lng7XG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueSA9IGFhYmIuX19taW4ueTtcbiAgICBBQUJCLl9fdG1wVmVjdG9yMy56ID0gYWFiYi5fX21pbi56O1xuICAgIG1hdHJpeC5tdWx0aXBseVZlY3RvcjNUbyhBQUJCLl9fdG1wVmVjdG9yMywgQUFCQi5fX3RtcFZlY3RvcjMpO1xuICAgIG91dEFhYmIuYWRkUG9zaXRpb24oQUFCQi5fX3RtcFZlY3RvcjMpO1xuXG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueCA9IGFhYmIuX19taW4ueDtcbiAgICBBQUJCLl9fdG1wVmVjdG9yMy55ID0gYWFiYi5fX21heC55O1xuICAgIEFBQkIuX190bXBWZWN0b3IzLnogPSBhYWJiLl9fbWluLno7XG4gICAgbWF0cml4Lm11bHRpcGx5VmVjdG9yM1RvKEFBQkIuX190bXBWZWN0b3IzLCBBQUJCLl9fdG1wVmVjdG9yMyk7XG4gICAgb3V0QWFiYi5hZGRQb3NpdGlvbihBQUJCLl9fdG1wVmVjdG9yMyk7XG5cbiAgICBBQUJCLl9fdG1wVmVjdG9yMy54ID0gYWFiYi5fX21pbi54O1xuICAgIEFBQkIuX190bXBWZWN0b3IzLnkgPSBhYWJiLl9fbWluLnk7XG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueiA9IGFhYmIuX19tYXguejtcbiAgICBtYXRyaXgubXVsdGlwbHlWZWN0b3IzVG8oQUFCQi5fX3RtcFZlY3RvcjMsIEFBQkIuX190bXBWZWN0b3IzKTtcbiAgICBvdXRBYWJiLmFkZFBvc2l0aW9uKEFBQkIuX190bXBWZWN0b3IzKTtcblxuICAgIEFBQkIuX190bXBWZWN0b3IzLnggPSBhYWJiLl9fbWluLng7XG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueSA9IGFhYmIuX19tYXgueTtcbiAgICBBQUJCLl9fdG1wVmVjdG9yMy56ID0gYWFiYi5fX21heC56O1xuICAgIG1hdHJpeC5tdWx0aXBseVZlY3RvcjNUbyhBQUJCLl9fdG1wVmVjdG9yMywgQUFCQi5fX3RtcFZlY3RvcjMpO1xuICAgIG91dEFhYmIuYWRkUG9zaXRpb24oQUFCQi5fX3RtcFZlY3RvcjMpO1xuXG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueCA9IGFhYmIuX19tYXgueDtcbiAgICBBQUJCLl9fdG1wVmVjdG9yMy55ID0gYWFiYi5fX21pbi55O1xuICAgIEFBQkIuX190bXBWZWN0b3IzLnogPSBhYWJiLl9fbWF4Lno7XG4gICAgbWF0cml4Lm11bHRpcGx5VmVjdG9yM1RvKEFBQkIuX190bXBWZWN0b3IzLCBBQUJCLl9fdG1wVmVjdG9yMyk7XG4gICAgb3V0QWFiYi5hZGRQb3NpdGlvbihBQUJCLl9fdG1wVmVjdG9yMyk7XG5cbiAgICBBQUJCLl9fdG1wVmVjdG9yMy54ID0gYWFiYi5fX21heC54O1xuICAgIEFBQkIuX190bXBWZWN0b3IzLnkgPSBhYWJiLl9fbWF4Lnk7XG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueiA9IGFhYmIuX19taW4uejtcbiAgICBtYXRyaXgubXVsdGlwbHlWZWN0b3IzVG8oQUFCQi5fX3RtcFZlY3RvcjMsIEFBQkIuX190bXBWZWN0b3IzKTtcbiAgICBvdXRBYWJiLmFkZFBvc2l0aW9uKEFBQkIuX190bXBWZWN0b3IzKTtcblxuICAgIEFBQkIuX190bXBWZWN0b3IzLnggPSBhYWJiLl9fbWF4Lng7XG4gICAgQUFCQi5fX3RtcFZlY3RvcjMueSA9IGFhYmIuX19tYXgueTtcbiAgICBBQUJCLl9fdG1wVmVjdG9yMy56ID0gYWFiYi5fX21heC56O1xuICAgIG1hdHJpeC5tdWx0aXBseVZlY3RvcjNUbyhBQUJCLl9fdG1wVmVjdG9yMywgQUFCQi5fX3RtcFZlY3RvcjMpO1xuICAgIG91dEFhYmIuYWRkUG9zaXRpb24oQUFCQi5fX3RtcFZlY3RvcjMpO1xuXG4gICAgcmV0dXJuIG91dEFhYmI7XG4gIH1cblxuICAvKipcbiAgICogdG9TdHJpbmcgbWV0aG9kLlxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICdBQUJCX21pbjogJyArXG4gICAgICB0aGlzLl9fbWluICtcbiAgICAgICdcXG4nICtcbiAgICAgICdBQUJCX21heDogJyArXG4gICAgICB0aGlzLl9fbWF4ICtcbiAgICAgICdcXG4nICtcbiAgICAgICdjZW50ZXJQb2ludDogJyArXG4gICAgICB0aGlzLl9fY2VudGVyUG9pbnQgK1xuICAgICAgJ1xcbicgK1xuICAgICAgJ2xlbmd0aENlbnRlclRvQ29ybmVyOiAnICtcbiAgICAgIHRoaXMuX19sZW5ndGhDZW50ZXJUb0Nvcm5lclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdG9TdHJpbmcgbWV0aG9kICh0aGUgbnVtYmVycyBhcmUgQXBwcm94aW1hdGUpXG4gICAqL1xuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICdBQUJCX21heDogJyArXG4gICAgICB0aGlzLl9fbWF4LnRvU3RyaW5nQXBwcm94aW1hdGVseSgpICtcbiAgICAgICdcXG4nICtcbiAgICAgICdBQUJCX21pbjogJyArXG4gICAgICB0aGlzLl9fbWluLnRvU3RyaW5nQXBwcm94aW1hdGVseSgpICtcbiAgICAgICdcXG4nICtcbiAgICAgICdjZW50ZXJQb2ludDogJyArXG4gICAgICB0aGlzLmNlbnRlclBvaW50LnRvU3RyaW5nQXBwcm94aW1hdGVseSgpICtcbiAgICAgICdcXG4nICtcbiAgICAgICdsZW5ndGhDZW50ZXJUb0Nvcm5lcjogJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5sZW5ndGhDZW50ZXJUb0Nvcm5lcilcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSUFycmF5QnVmZmVyQmFzZWRNYXRoTnVtYmVyIH0gZnJvbSAnLi9JTWF0aE51bWJlcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFycmF5QnVmZmVyQmFzZU1hdGhOdW1iZXIgaW1wbGVtZW50cyBJQXJyYXlCdWZmZXJCYXNlZE1hdGhOdW1iZXIge1xuICBfdjogVHlwZWRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoKTtcblxuICBpc1RoZVNvdXJjZVNhbWUoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3YuYnVmZmVyID09PSBhcnJheUJ1ZmZlcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSU1hdHJpeCB9IGZyb20gJy4vSU1hdHJpeCc7XG5cbi8qKlxuICogdGhlIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgTWF0cml4IGNsYXNzZXNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWF0cml4IGltcGxlbWVudHMgSU1hdHJpeCB7XG4gIF92OiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCk7XG4gIGF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgZmxhdHRlbkFzQXJyYXkoKTogbnVtYmVyW10ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICBpc0R1bW15KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl92Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdihpOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92W2ldO1xuICB9XG4gIGRldGVybWluYW50KCk6IG51bWJlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIGdldCBjbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgZ2V0IGlzSWRlbnRpdHlNYXRyaXhDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc1RoZVNvdXJjZVNhbWUoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3YuYnVmZmVyID09PSBhcnJheUJ1ZmZlcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVHlwZWRBcnJheSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElRdWF0ZXJuaW9uIH0gZnJvbSAnLi9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJTXV0YWJsZVZlY3RvcjMsIElWZWN0b3IzIH0gZnJvbSAnLi9JVmVjdG9yJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVhdGVybmlvbiBpbXBsZW1lbnRzIElRdWF0ZXJuaW9uIHtcbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgZ2V0IHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBnZXQgeigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92WzJdO1xuICB9XG5cbiAgZ2V0IHcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuICBhdChpOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdltpXTtcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5oeXBvdCh0aGlzLl92WzBdLCB0aGlzLl92WzFdLCB0aGlzLl92WzJdLCB0aGlzLl92WzNdKTtcbiAgfVxuXG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXSAqKiAyICsgdGhpcy5fdlsxXSAqKiAyICsgdGhpcy5fdlsyXSAqKiAyICsgdGhpcy5fdlszXSAqKiAyO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IG51bWJlcltdIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgaXNEdW1teSgpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgaXNFcXVhbCh2ZWM6IElRdWF0ZXJuaW9uLCBkZWx0YT86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICBpc1N0cmljdEVxdWFsKHZlYzogSVF1YXRlcm5pb24pOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdG9FdWxlckFuZ2xlc1RvKG91dDogSU11dGFibGVWZWN0b3IzKTogSU11dGFibGVWZWN0b3IzIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdG9FdWxlckFuZ2xlcygpOiBJVmVjdG9yMyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHRyYW5zZm9ybVZlY3RvcjModmVjOiBJVmVjdG9yMyk6IElWZWN0b3IzIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdHJhbnNmb3JtVmVjdG9yM1RvKHZlYzogSVZlY3RvcjMsIG91dDogSU11dGFibGVWZWN0b3IzKTogSVZlY3RvcjMge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB0cmFuc2Zvcm1WZWN0b3IzSW52ZXJzZSh2ZWM6IElWZWN0b3IzKTogSVZlY3RvcjMge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkb3QgcHJvZHVjdFxuICAgKi9cbiAgZG90KHF1YXQ6IElRdWF0ZXJuaW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3ZbMF0gKiBxdWF0Ll92WzBdICtcbiAgICAgIHRoaXMuX3ZbMV0gKiBxdWF0Ll92WzFdICtcbiAgICAgIHRoaXMuX3ZbMl0gKiBxdWF0Ll92WzJdICtcbiAgICAgIHRoaXMuX3ZbM10gKiBxdWF0Ll92WzNdXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lKCk6IElRdWF0ZXJuaW9uIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgX3YgPSBuZXcgRmxvYXQzMkFycmF5KCk7XG59XG4iLCJpbXBvcnQgeyBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSVZlY3RvciB9IGZyb20gJy4vSVZlY3Rvcic7XG5cbi8qKlxuICogdGhlIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgVmVjdG9yIGNsYXNzZXNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVjdG9yIGltcGxlbWVudHMgSVZlY3RvciB7XG4gIF92OiBUeXBlZEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgpO1xuXG4gIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBnZXQgZ2xzbFN0ckFzRmxvYXQoKTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgZ2V0IGdsc2xTdHJBc0ludCgpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICBpc0VxdWFsKHZlYzogSVZlY3RvciwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgaXNTdHJpY3RFcXVhbCh2ZWM6IElWZWN0b3IpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgbGVuZ3RoVG8odmVjOiBJVmVjdG9yKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgZG90KHZlYzogSVZlY3Rvcik6IG51bWJlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIGF0KGk6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbaV07XG4gIH1cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IG51bWJlcltdIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgaXNEdW1teSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fdi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHYoaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdltpXTtcbiAgfVxuXG4gIGlzVGhlU291cmNlU2FtZShhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdi5idWZmZXIgPT09IGFycmF5QnVmZmVyO1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBnZXQgYnl0ZXNQZXJDb21wb25lbnQoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgSUNvbG9yUmdiIH0gZnJvbSAnLi9JQ29sb3InO1xuXG4vKipcbiAqIEEgUkdCIGNvbG9yLlxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JSZ2IgZXh0ZW5kcyBWZWN0b3IzIGltcGxlbWVudHMgSVZlY3RvcjMsIElDb2xvclJnYiB7XG4gIGNvbnN0cnVjdG9yKHI6IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKHIpO1xuICB9XG5cbiAgZ2V0IHgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIGdldCB6KCkge1xuICAgIHJldHVybiB0aGlzLl92WzJdO1xuICB9XG5cbiAgZ2V0IHcoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBnZXQgcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIGdldCBnKCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgZ2V0IGIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBnZXQgYSgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHN0YXRpYyB6ZXJvKCkge1xuICAgIHJldHVybiBzdXBlci5femVybyhGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fbm9ybWFsaXplKHZlYywgRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2I7XG4gIH1cblxuICBzdGF0aWMgc3VidHJhY3QobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuX3N1YnRyYWN0KGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseSh2ZWMsIHZhbHVlLCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2I7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlKHZlYzogSVZlY3RvcjMsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZSh2ZWMsIHZhbHVlLCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlVmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBjcm9zcyhsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fY3Jvc3MobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiO1xuICB9XG5cbiAgY2xvbmUoKTogQ29sb3JSZ2Ige1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIENvbG9yUmdiO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi9WZWN0b3I0JztcbmltcG9ydCB7IElWZWN0b3I0IH0gZnJvbSAnLi9JVmVjdG9yJztcbmltcG9ydCB7IElDb2xvclJnYmEgfSBmcm9tICcuL0lDb2xvcic7XG5pbXBvcnQgeyBBcnJheTQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5cbi8qKlxuICogQSBSR0JBIGNvbG9yLlxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JSZ2JhIGV4dGVuZHMgVmVjdG9yNCBpbXBsZW1lbnRzIElWZWN0b3I0LCBJQ29sb3JSZ2JhIHtcbiAgY29uc3RydWN0b3IocjogRmxvYXQzMkFycmF5KSB7XG4gICAgc3VwZXIocik7XG4gIH1cblxuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIGdldCB5KCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgZ2V0IHooKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBnZXQgdygpIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuXG4gIGdldCByKCkge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgZ2V0IGcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBnZXQgYigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIGdldCBhKCkge1xuICAgIHJldHVybiB0aGlzLl92WzNdO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIHN1cGVyLl96ZXJvKEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX2R1bW15KEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZSh2ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9ub3JtYWxpemUodmVjLCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIHN1YnRyYWN0KGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9zdWJ0cmFjdChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KHZlYzogSVZlY3RvcjQsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5KHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZSh2ZWM6IElWZWN0b3I0LCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGUodmVjLCB2YWx1ZSwgRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYmE7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlVmVjdG9yKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGVWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiYTtcbiAgfVxuXG4gIGNsb25lKCk6IENvbG9yUmdiYSB7XG4gICAgcmV0dXJuIHN1cGVyLmNsb25lKCkgYXMgQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkoYXJyYXk6IEFycmF5PG51bWJlcj4pOiBDb2xvclJnYmEge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5KGFycmF5LCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5NChhcnJheTogQXJyYXk0PG51bWJlcj4pOiBDb2xvclJnYmEge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5NChhcnJheSwgRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYmE7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHk0KHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlcik6IENvbG9yUmdiYSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5NCh4LCB5LCB6LCB3LCBGbG9hdDMyQXJyYXkpIGFzIENvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVZlY3RvcjQodmVjNDogSVZlY3RvcjQpOiBDb2xvclJnYmEge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weVZlY3RvcjQodmVjNCwgRmxvYXQzMkFycmF5KSBhcyBDb2xvclJnYmE7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IENvbnN0UmdiYVdoaXRlID0gbmV3IENvbG9yUmdiYShuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxLCAxXSkpO1xuZXhwb3J0IGNvbnN0IENvbnN0UmdiYUJsYWNrID0gbmV3IENvbG9yUmdiYShuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAwLCAxXSkpO1xuIiwiaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgVHlwZWRBcnJheSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29sb3JSZ2Ige1xuICByZWFkb25seSByOiBudW1iZXI7XG4gIHJlYWRvbmx5IGc6IG51bWJlcjtcbiAgcmVhZG9ubHkgYjogbnVtYmVyO1xuICByZWFkb25seSBhOiBudW1iZXI7XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nO1xuICBmbGF0dGVuQXNBcnJheSgpOiBBcnJheTxudW1iZXI+O1xuICBpc0R1bW15KCk6IGJvb2xlYW47XG4gIGlzRXF1YWwodmVjOiBJVmVjdG9yMywgZGVsdGE6IG51bWJlcik6IGJvb2xlYW47XG4gIGlzU3RyaWN0RXF1YWwodmVjOiBJVmVjdG9yMyk6IGJvb2xlYW47XG4gIGF0KGk6IG51bWJlcik6IG51bWJlcjtcbiAgbGVuZ3RoKCk6IG51bWJlcjtcbiAgbGVuZ3RoU3F1YXJlZCgpOiBudW1iZXI7XG4gIGxlbmd0aFRvKHZlYzogSVZlY3RvcjMpOiBudW1iZXI7XG4gIGRvdCh2ZWM6IElWZWN0b3IzKTogbnVtYmVyO1xuICBjbG9uZSgpOiBJQ29sb3JSZ2I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11dGFibGVDb2xvclJnYiB7XG4gIHI6IG51bWJlcjtcbiAgZzogbnVtYmVyO1xuICBiOiBudW1iZXI7XG4gIHJlYWRvbmx5IGE6IG51bWJlcjtcblxuICAvLyBjb21tb24gd2l0aCBpbW11dGFibGUgY29sb3JSZ2JcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nO1xuICBmbGF0dGVuQXNBcnJheSgpOiBBcnJheTxudW1iZXI+O1xuICBpc0R1bW15KCk6IGJvb2xlYW47XG4gIGlzRXF1YWwodmVjOiBJVmVjdG9yMywgZGVsdGE6IG51bWJlcik6IGJvb2xlYW47XG4gIGlzU3RyaWN0RXF1YWwodmVjOiBJVmVjdG9yMyk6IGJvb2xlYW47XG4gIGF0KGk6IG51bWJlcik6IG51bWJlcjtcbiAgbGVuZ3RoKCk6IG51bWJlcjtcbiAgbGVuZ3RoU3F1YXJlZCgpOiBudW1iZXI7XG4gIGxlbmd0aFRvKHZlYzogSVZlY3RvcjMpOiBudW1iZXI7XG4gIGRvdCh2ZWM6IElWZWN0b3IzKTogbnVtYmVyO1xuICBjbG9uZSgpOiBJTXV0YWJsZUNvbG9yUmdiO1xuXG4gIC8vIG9ubHkgZm9yIG11dGFibGUgY29sb3JSZ2JcbiAgcmF3KCk6IFR5cGVkQXJyYXk7XG4gIHNldEF0KGk6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IElNdXRhYmxlQ29sb3JSZ2I7XG4gIHNldENvbXBvbmVudHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IElNdXRhYmxlQ29sb3JSZ2I7XG4gIGNvcHlDb21wb25lbnRzKHZlYzogSVZlY3RvcjMpOiBJTXV0YWJsZUNvbG9yUmdiO1xuICB6ZXJvKCk6IElNdXRhYmxlQ29sb3JSZ2I7XG4gIG9uZSgpOiBJTXV0YWJsZUNvbG9yUmdiO1xuICBub3JtYWxpemUoKTogSU11dGFibGVDb2xvclJnYjtcbiAgYWRkKHZlYzogSVZlY3RvcjMpOiBJTXV0YWJsZUNvbG9yUmdiO1xuICBzdWJ0cmFjdCh2ZWM6IElWZWN0b3IzKTogSU11dGFibGVDb2xvclJnYjtcbiAgbXVsdGlwbHkodmFsdWU6IG51bWJlcik6IElNdXRhYmxlQ29sb3JSZ2I7XG4gIG11bHRpcGx5VmVjdG9yKHZlYzogSVZlY3RvcjMpOiBJTXV0YWJsZUNvbG9yUmdiO1xuICBkaXZpZGUodmFsdWU6IG51bWJlcik6IElNdXRhYmxlQ29sb3JSZ2I7XG4gIGRpdmlkZVZlY3Rvcih2ZWM6IElWZWN0b3IzKTogSU11dGFibGVDb2xvclJnYjtcbiAgY3Jvc3ModmVjOiBJVmVjdG9yMyk6IElNdXRhYmxlQ29sb3JSZ2I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbG9yUmdiYSB7XG4gIHJlYWRvbmx5IHI6IG51bWJlcjtcbiAgcmVhZG9ubHkgZzogbnVtYmVyO1xuICByZWFkb25seSBiOiBudW1iZXI7XG4gIHJlYWRvbmx5IGE6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXV0YWJsZUNvbG9yUmdiYSB7XG4gIHI6IG51bWJlcjtcbiAgZzogbnVtYmVyO1xuICBiOiBudW1iZXI7XG4gIGE6IG51bWJlcjtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgSUFycmF5QnVmZmVyQmFzZWRNYXRoTnVtYmVyIHtcbiAgaXNUaGVTb3VyY2VTYW1lKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcik6IGJvb2xlYW47XG59XG4iLCJpbXBvcnQge1xuICBJVmVjdG9yLFxuICBJVmVjdG9yMixcbiAgSU11dGFibGVWZWN0b3IyLFxuICBJVmVjdG9yMyxcbiAgSU11dGFibGVWZWN0b3IzLFxuICBJVmVjdG9yNCxcbiAgSU11dGFibGVWZWN0b3I0LFxufSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgVHlwZWRBcnJheSwgSW5kZXggfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4vSVF1YXRlcm5pb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXgge1xuICBfdjogRmxvYXQzMkFycmF5O1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nO1xuICBmbGF0dGVuQXNBcnJheSgpOiBBcnJheTxudW1iZXI+O1xuICBpc0R1bW15KCk6IGJvb2xlYW47XG4gIGF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIpOiBudW1iZXI7XG4gIHYoaTogbnVtYmVyKTogbnVtYmVyO1xuICBkZXRlcm1pbmFudCgpOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlzSWRlbnRpdHlNYXRyaXhDbGFzczogYm9vbGVhbjtcbiAgaXNUaGVTb3VyY2VTYW1lKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcik6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11dGFibGVNYXRyaXggZXh0ZW5kcyBJTWF0cml4IHtcbiAgY2xvbmUoKTogSU11dGFibGVNYXRyaXg7XG4gIHJhdygpOiBUeXBlZEFycmF5O1xuICBzZXRBdChyb3dfaTogbnVtYmVyLCBjb2x1bW5faTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbiAgc2V0Q29tcG9uZW50cyguLi5udW06IG51bWJlcltdKTogSU11dGFibGVNYXRyaXg7XG4gIGNvcHlDb21wb25lbnRzKG1hdDogSU1hdHJpeCk6IElNdXRhYmxlTWF0cml4O1xuICB6ZXJvKCk6IElNdXRhYmxlTWF0cml4O1xuICBpZGVudGl0eSgpOiBJTXV0YWJsZU1hdHJpeDtcbiAgX3N3YXAobDogSW5kZXgsIHI6IEluZGV4KTogdm9pZDtcbiAgdHJhbnNwb3NlKCk6IElNdXRhYmxlTWF0cml4O1xuICBpbnZlcnQoKTogSU11dGFibGVNYXRyaXg7XG4gIHJvdGF0ZShhbnk6IGFueSk6IElNdXRhYmxlTWF0cml4O1xuICBzY2FsZSh2ZWM6IElWZWN0b3IpOiBJTXV0YWJsZU1hdHJpeDtcbiAgbXVsdGlwbHlTY2FsZSh2ZWM6IElWZWN0b3IpOiBJTXV0YWJsZU1hdHJpeDtcbiAgbXVsdGlwbHkobWF0OiBJTWF0cml4KTogSU11dGFibGVNYXRyaXg7XG4gIG11bHRpcGx5QnlMZWZ0KG1hdDogSU1hdHJpeCk6IElNdXRhYmxlTWF0cml4O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXgyMiBleHRlbmRzIElNYXRyaXgge1xuICByZWFkb25seSBtMDA6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTAxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0xMDogbnVtYmVyO1xuICByZWFkb25seSBtMTE6IG51bWJlcjtcbiAgaXNFcXVhbChtYXQ6IElNYXRyaXgyMiwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuO1xuICBpc1N0cmljdEVxdWFsKG1hdDogSU1hdHJpeDIyKTogYm9vbGVhbjtcbiAgZGV0ZXJtaW5hbnQoKTogbnVtYmVyO1xuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3IyKTogSVZlY3RvcjI7XG4gIG11bHRpcGx5VmVjdG9yVG8odmVjOiBJVmVjdG9yMiwgb3V0VmVjOiBJTXV0YWJsZVZlY3RvcjIpOiBJTXV0YWJsZVZlY3RvcjI7XG4gIGdldFNjYWxlKCk6IElWZWN0b3IyO1xuICBnZXRTY2FsZVRvKG91dFZlYzogSU11dGFibGVWZWN0b3IyKTogSU11dGFibGVWZWN0b3IyO1xuICBjbG9uZSgpOiBJTWF0cml4MjI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11dGFibGVNYXRyaXgyMiB7XG4gIG0wMDogbnVtYmVyO1xuICBtMDE6IG51bWJlcjtcbiAgbTEwOiBudW1iZXI7XG4gIG0xMTogbnVtYmVyO1xuXG4gIC8vIGNvbW1vbiB3aXRoIGltbXV0YWJsZSBtYXRyaXgyMlxuICB0b1N0cmluZygpOiBzdHJpbmc7XG4gIHRvU3RyaW5nQXBwcm94aW1hdGVseSgpOiBzdHJpbmc7XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IEFycmF5PG51bWJlcj47XG4gIGlzRHVtbXkoKTogYm9vbGVhbjtcbiAgaXNFcXVhbChtYXQ6IElNYXRyaXgyMiwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuO1xuICBpc1N0cmljdEVxdWFsKG1hdDogSU1hdHJpeDIyKTogYm9vbGVhbjtcbiAgYXQocm93X2k6IG51bWJlciwgY29sdW1uX2k6IG51bWJlcik6IG51bWJlcjtcbiAgZGV0ZXJtaW5hbnQoKTogbnVtYmVyO1xuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3IyKTogSVZlY3RvcjI7XG4gIG11bHRpcGx5VmVjdG9yVG8odmVjOiBJVmVjdG9yMiwgb3V0VmVjOiBJTXV0YWJsZVZlY3RvcjIpOiBJTXV0YWJsZVZlY3RvcjI7XG4gIGdldFNjYWxlKCk6IElWZWN0b3IyO1xuICBnZXRTY2FsZVRvKG91dFZlYzogSU11dGFibGVWZWN0b3IyKTogSU11dGFibGVWZWN0b3IyO1xuXG4gIC8vIG9ubHkgZm9yIG11dGFibGUgbWF0cml4MjJcbiAgY2xvbmUoKTogSU11dGFibGVNYXRyaXgyMjsgLy8gb3ZlcnJpZGVcbiAgcmF3KCk6IFR5cGVkQXJyYXk7XG4gIHNldEF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBJTXV0YWJsZU1hdHJpeDIyO1xuICBzZXRDb21wb25lbnRzKG0wMDogbnVtYmVyLCBtMDE6IG51bWJlciwgbTEwOiBudW1iZXIsIG0xMTogbnVtYmVyKTogSU11dGFibGVNYXRyaXgyMjtcbiAgY29weUNvbXBvbmVudHMobWF0OiBJTWF0cml4MjIgfCBJTWF0cml4MzMgfCBJTWF0cml4NDQpOiBJTXV0YWJsZU1hdHJpeDIyO1xuICB6ZXJvKCk6IElNdXRhYmxlTWF0cml4MjI7XG4gIGlkZW50aXR5KCk6IElNdXRhYmxlTWF0cml4MjI7XG4gIF9zd2FwKGw6IEluZGV4LCByOiBJbmRleCk6IHZvaWQ7XG4gIHRyYW5zcG9zZSgpOiBJTXV0YWJsZU1hdHJpeDIyO1xuICBpbnZlcnQoKTogSU11dGFibGVNYXRyaXgyMjtcbiAgcm90YXRlKHJhZGlhbjogbnVtYmVyKTogSU11dGFibGVNYXRyaXgyMjtcbiAgc2NhbGUodmVjOiBJVmVjdG9yMik6IElNdXRhYmxlTWF0cml4MjI7XG4gIG11bHRpcGx5U2NhbGUodmVjOiBJVmVjdG9yMik6IElNdXRhYmxlTWF0cml4MjI7XG4gIG11bHRpcGx5KG1hdDogSU1hdHJpeDIyKTogSU11dGFibGVNYXRyaXgyMjtcbiAgbXVsdGlwbHlCeUxlZnQobWF0OiBJTWF0cml4MjIpOiBJTXV0YWJsZU1hdHJpeDIyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXgzMyBleHRlbmRzIElNYXRyaXgge1xuICByZWFkb25seSBtMDA6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTAxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0wMjogbnVtYmVyO1xuICByZWFkb25seSBtMTA6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTExOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0xMjogbnVtYmVyO1xuICByZWFkb25seSBtMjA6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTIxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0yMjogbnVtYmVyO1xuICBpc0VxdWFsKG1hdDogSU1hdHJpeDMzLCBkZWx0YT86IG51bWJlcik6IGJvb2xlYW47XG4gIGlzU3RyaWN0RXF1YWwobWF0OiBJTWF0cml4MzMpOiBib29sZWFuO1xuICBjbG9uZSgpOiBJTWF0cml4MzM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11dGFibGVNYXRyaXgzMyB7XG4gIG0wMDogbnVtYmVyO1xuICBtMDE6IG51bWJlcjtcbiAgbTAyOiBudW1iZXI7XG4gIG0xMDogbnVtYmVyO1xuICBtMTE6IG51bWJlcjtcbiAgbTEyOiBudW1iZXI7XG4gIG0yMDogbnVtYmVyO1xuICBtMjE6IG51bWJlcjtcbiAgbTIyOiBudW1iZXI7XG5cbiAgLy8gY29tbW9uIHdpdGggaW1tdXRhYmxlIG1hdHJpeDMzXG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZztcbiAgZmxhdHRlbkFzQXJyYXkoKTogQXJyYXk8bnVtYmVyPjtcbiAgaXNEdW1teSgpOiBib29sZWFuO1xuICBpc0VxdWFsKG1hdDogSU1hdHJpeDMzLCBkZWx0YT86IG51bWJlcik6IGJvb2xlYW47XG4gIGlzU3RyaWN0RXF1YWwobWF0OiBJTWF0cml4MzMpOiBib29sZWFuO1xuICBhdChyb3dfaTogbnVtYmVyLCBjb2x1bW5faTogbnVtYmVyKTogbnVtYmVyO1xuICBkZXRlcm1pbmFudCgpOiBudW1iZXI7XG4gIG11bHRpcGx5VmVjdG9yKHZlYzogSVZlY3RvcjMpOiBJVmVjdG9yMztcbiAgbXVsdGlwbHlWZWN0b3JUbyh2ZWM6IElWZWN0b3IzLCBvdXRWZWM6IElNdXRhYmxlVmVjdG9yMyk6IElNdXRhYmxlVmVjdG9yMztcbiAgZ2V0U2NhbGUoKTogSVZlY3RvcjM7XG4gIGdldFNjYWxlVG8ob3V0VmVjOiBJTXV0YWJsZVZlY3RvcjMpOiBJTXV0YWJsZVZlY3RvcjM7XG5cbiAgLy8gb25seSBmb3IgbXV0YWJsZSBtYXRyaXgzM1xuICBjbG9uZSgpOiBJTXV0YWJsZU1hdHJpeDMzOyAvLyBvdmVycmlkZVxuICByYXcoKTogVHlwZWRBcnJheTtcbiAgc2V0QXQocm93X2k6IG51bWJlciwgY29sdW1uX2k6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IElNdXRhYmxlTWF0cml4MzM7XG4gIHNldENvbXBvbmVudHMoXG4gICAgbTAwOiBudW1iZXIsXG4gICAgbTAxOiBudW1iZXIsXG4gICAgbTAyOiBudW1iZXIsXG4gICAgbTEwOiBudW1iZXIsXG4gICAgbTExOiBudW1iZXIsXG4gICAgbTEyOiBudW1iZXIsXG4gICAgbTIwOiBudW1iZXIsXG4gICAgbTIxOiBudW1iZXIsXG4gICAgbTIyOiBudW1iZXJcbiAgKTogSU11dGFibGVNYXRyaXgzMztcbiAgY29weUNvbXBvbmVudHMobWF0OiBJTWF0cml4MzMgfCBJTWF0cml4NDQpOiBJTXV0YWJsZU1hdHJpeDMzO1xuICB6ZXJvKCk6IElNdXRhYmxlTWF0cml4MzM7XG4gIGlkZW50aXR5KCk6IElNdXRhYmxlTWF0cml4MzM7XG4gIF9zd2FwKGw6IEluZGV4LCByOiBJbmRleCk6IHZvaWQ7XG4gIHRyYW5zcG9zZSgpOiBJTXV0YWJsZU1hdHJpeDMzO1xuICBpbnZlcnQoKTogSU11dGFibGVNYXRyaXgzMztcbiAgcm90YXRlWChyYWRpYW46IG51bWJlcik6IElNdXRhYmxlTWF0cml4MzM7XG4gIHJvdGF0ZVkocmFkaWFuOiBudW1iZXIpOiBJTXV0YWJsZU1hdHJpeDMzO1xuICByb3RhdGVaKHJhZGlhbjogbnVtYmVyKTogSU11dGFibGVNYXRyaXgzMztcbiAgcm90YXRlWFlaKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpOiBJTXV0YWJsZU1hdHJpeDMzO1xuICByb3RhdGUodmVjMzogSVZlY3RvcjMpOiBJTXV0YWJsZU1hdHJpeDMzO1xuICBzY2FsZSh2ZWM6IElWZWN0b3IzKTogSU11dGFibGVNYXRyaXgzMztcbiAgbXVsdGlwbHlTY2FsZSh2ZWM6IElWZWN0b3IzKTogSU11dGFibGVNYXRyaXgzMztcbiAgbXVsdGlwbHkobWF0OiBJTWF0cml4MzMpOiBJTXV0YWJsZU1hdHJpeDMzO1xuICBtdWx0aXBseUJ5TGVmdChtYXQ6IElNYXRyaXgzMyk6IElNdXRhYmxlTWF0cml4MzM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeDQ0IGV4dGVuZHMgSU1hdHJpeCB7XG4gIHJlYWRvbmx5IG0wMDogbnVtYmVyO1xuICByZWFkb25seSBtMDE6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTAyOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0wMzogbnVtYmVyO1xuICByZWFkb25seSBtMTA6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTExOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0xMjogbnVtYmVyO1xuICByZWFkb25seSBtMTM6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTIwOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0yMTogbnVtYmVyO1xuICByZWFkb25seSBtMjI6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTIzOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0zMDogbnVtYmVyO1xuICByZWFkb25seSBtMzE6IG51bWJlcjtcbiAgcmVhZG9ubHkgbTMyOiBudW1iZXI7XG4gIHJlYWRvbmx5IG0zMzogbnVtYmVyO1xuICByZWFkb25seSB0cmFuc2xhdGVYOiBudW1iZXI7XG4gIHJlYWRvbmx5IHRyYW5zbGF0ZVk6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJhbnNsYXRlWjogbnVtYmVyO1xuICBhdChyb3dfaTogbnVtYmVyLCBjb2x1bW5faTogbnVtYmVyKTogbnVtYmVyO1xuICBjbG9uZSgpOiBJTWF0cml4NDQ7XG4gIGdldFJvdGF0ZSgpOiBJTWF0cml4NDQ7XG4gIGdldFRyYW5zbGF0ZSgpOiBJVmVjdG9yMztcbiAgZ2V0U2NhbGUoKTogSVZlY3RvcjM7XG4gIG11bHRpcGx5VmVjdG9yMyh2ZWM6IElWZWN0b3IzKTogSVZlY3RvcjM7XG4gIG11bHRpcGx5VmVjdG9yKHZlYzogSVZlY3RvcjQpOiBJVmVjdG9yNDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXV0YWJsZU1hdHJpeDQ0IGV4dGVuZHMgSU1hdHJpeCB7XG4gIG0wMDogbnVtYmVyO1xuICBtMDE6IG51bWJlcjtcbiAgbTAyOiBudW1iZXI7XG4gIG0wMzogbnVtYmVyO1xuICBtMTA6IG51bWJlcjtcbiAgbTExOiBudW1iZXI7XG4gIG0xMjogbnVtYmVyO1xuICBtMTM6IG51bWJlcjtcbiAgbTIwOiBudW1iZXI7XG4gIG0yMTogbnVtYmVyO1xuICBtMjI6IG51bWJlcjtcbiAgbTIzOiBudW1iZXI7XG4gIG0zMDogbnVtYmVyO1xuICBtMzE6IG51bWJlcjtcbiAgbTMyOiBudW1iZXI7XG4gIG0zMzogbnVtYmVyO1xuICB0cmFuc2xhdGVYOiBudW1iZXI7XG4gIHRyYW5zbGF0ZVk6IG51bWJlcjtcbiAgdHJhbnNsYXRlWjogbnVtYmVyO1xuXG4gIC8vIGNvbW1vbiB3aXRoIGltbXV0YWJsZSBtYXRyaXgzM1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG4gIHRvU3RyaW5nQXBwcm94aW1hdGVseSgpOiBzdHJpbmc7XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IEFycmF5PG51bWJlcj47XG4gIGlzRHVtbXkoKTogYm9vbGVhbjtcbiAgaXNFcXVhbChtYXQ6IElNYXRyaXg0NCwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuO1xuICBpc1N0cmljdEVxdWFsKG1hdDogSU1hdHJpeDQ0KTogYm9vbGVhbjtcbiAgYXQocm93X2k6IG51bWJlciwgY29sdW1uX2k6IG51bWJlcik6IG51bWJlcjtcbiAgZGV0ZXJtaW5hbnQoKTogbnVtYmVyO1xuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3I0KTogSVZlY3RvcjQ7XG4gIG11bHRpcGx5VmVjdG9yVG8odmVjOiBJVmVjdG9yNCwgb3V0VmVjOiBJTXV0YWJsZVZlY3RvcjQpOiBJTXV0YWJsZVZlY3RvcjQ7XG4gIG11bHRpcGx5VmVjdG9yVG9WZWMzKHZlYzogSVZlY3RvcjQsIG91dFZlYzogSU11dGFibGVWZWN0b3IzKTogSU11dGFibGVWZWN0b3IzO1xuICBtdWx0aXBseVZlY3RvcjModmVjOiBJVmVjdG9yMyk6IElWZWN0b3IzO1xuICBtdWx0aXBseVZlY3RvcjNUbyh2ZWM6IElWZWN0b3IzLCBvdXRWZWM6IElNdXRhYmxlVmVjdG9yMyk6IElNdXRhYmxlVmVjdG9yMztcbiAgZ2V0VHJhbnNsYXRlKCk6IElWZWN0b3IzO1xuICBnZXRUcmFuc2xhdGVUbyhvdXRWZWM6IElNdXRhYmxlVmVjdG9yMyk6IElNdXRhYmxlVmVjdG9yMztcbiAgZ2V0U2NhbGUoKTogSVZlY3RvcjQ7XG4gIGdldFNjYWxlVG8ob3V0VmVjOiBJTXV0YWJsZVZlY3RvcjMpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIHRvRXVsZXJBbmdsZXMoKTogSVZlY3RvcjM7XG4gIHRvRXVsZXJBbmdsZXNUbyhvdXRWZWMzOiBJTXV0YWJsZVZlY3RvcjMpOiBJTXV0YWJsZVZlY3RvcjM7XG5cbiAgLy8gb25seSBmb3IgbXV0YWJsZSBtYXRyaXg0NFxuICBjbG9uZSgpOiBJTXV0YWJsZU1hdHJpeDQ0OyAvLyBvdmVycmlkZVxuICBnZXRSb3RhdGUoKTogSU11dGFibGVNYXRyaXg0NDsgLy8gb3ZlcnJpZGVcbiAgcmF3KCk6IFR5cGVkQXJyYXk7XG4gIHNldEF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBJTXV0YWJsZU1hdHJpeDQ0O1xuICBzZXRDb21wb25lbnRzKFxuICAgIG0wMDogbnVtYmVyLFxuICAgIG0wMTogbnVtYmVyLFxuICAgIG0wMjogbnVtYmVyLFxuICAgIG0wMzogbnVtYmVyLFxuICAgIG0xMDogbnVtYmVyLFxuICAgIG0xMTogbnVtYmVyLFxuICAgIG0xMjogbnVtYmVyLFxuICAgIG0xMzogbnVtYmVyLFxuICAgIG0yMDogbnVtYmVyLFxuICAgIG0yMTogbnVtYmVyLFxuICAgIG0yMjogbnVtYmVyLFxuICAgIG0yMzogbnVtYmVyLFxuICAgIG0zMDogbnVtYmVyLFxuICAgIG0zMTogbnVtYmVyLFxuICAgIG0zMjogbnVtYmVyLFxuICAgIG0zMzogbnVtYmVyXG4gICk6IElNdXRhYmxlTWF0cml4NDQ7XG4gIGNvcHlDb21wb25lbnRzKG1hdDogSU1hdHJpeDQ0KTogSU11dGFibGVNYXRyaXg0NDtcbiAgemVybygpOiBJTXV0YWJsZU1hdHJpeDQ0O1xuICBpZGVudGl0eSgpOiBJTXV0YWJsZU1hdHJpeDQ0O1xuICBfc3dhcChsOiBJbmRleCwgcjogSW5kZXgpOiB2b2lkO1xuICB0cmFuc3Bvc2UoKTogSU11dGFibGVNYXRyaXg0NDtcbiAgaW52ZXJ0KCk6IElNdXRhYmxlTWF0cml4NDQ7XG4gIHRyYW5zbGF0ZSh2ZWM6IElWZWN0b3IzKTogSU11dGFibGVNYXRyaXg0NDtcbiAgcHV0VHJhbnNsYXRlKHZlYzogSVZlY3RvcjMpOiBJTXV0YWJsZU1hdHJpeDQ0O1xuICBhZGRUcmFuc2xhdGUodmVjOiBJVmVjdG9yMyk6IElNdXRhYmxlTWF0cml4NDQ7XG4gIHJvdGF0ZVgocmFkaWFuOiBudW1iZXIpOiBJTXV0YWJsZU1hdHJpeDQ0O1xuICByb3RhdGVZKHJhZGlhbjogbnVtYmVyKTogSU11dGFibGVNYXRyaXg0NDtcbiAgcm90YXRlWihyYWRpYW46IG51bWJlcik6IElNdXRhYmxlTWF0cml4NDQ7XG4gIHJvdGF0ZVhZWih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogSU11dGFibGVNYXRyaXg0NDtcbiAgcm90YXRlKHZlYzM6IElWZWN0b3IzKTogSU11dGFibGVNYXRyaXg0NDtcbiAgc2NhbGUodmVjOiBJVmVjdG9yMyk6IElNdXRhYmxlTWF0cml4NDQ7XG4gIG11bHRpcGx5U2NhbGUodmVjOiBJVmVjdG9yMyk6IElNdXRhYmxlTWF0cml4NDQ7XG4gIG11bHRpcGx5KG1hdDogSU1hdHJpeDQ0KTogSU11dGFibGVNYXRyaXg0NDtcbiAgbXVsdGlwbHlCeUxlZnQobWF0OiBJTWF0cml4NDQpOiBJTXV0YWJsZU1hdHJpeDQ0O1xuICBmcm9tUXVhdGVybmlvbihxdWF0OiBJUXVhdGVybmlvbik6IElNdXRhYmxlTWF0cml4NDQ7XG59XG4iLCJpbXBvcnQgeyBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSVZlY3RvcjMsIElNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQgeyBJTWF0cml4NDQgfSBmcm9tICcuL0lNYXRyaXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElRdWF0ZXJuaW9uIHtcbiAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIF92OiBGbG9hdDMyQXJyYXk7XG5cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICByZWFkb25seSB5OiBudW1iZXI7XG4gIHJlYWRvbmx5IHo6IG51bWJlcjtcbiAgcmVhZG9ubHkgdzogbnVtYmVyO1xuXG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZztcbiAgZmxhdHRlbkFzQXJyYXkoKTogQXJyYXk8bnVtYmVyPjtcbiAgaXNEdW1teSgpOiBib29sZWFuO1xuICBpc0VxdWFsKHZlYzogSVF1YXRlcm5pb24sIGRlbHRhPzogbnVtYmVyKTogYm9vbGVhbjtcbiAgaXNTdHJpY3RFcXVhbCh2ZWM6IElRdWF0ZXJuaW9uKTogYm9vbGVhbjtcbiAgYXQoaTogbnVtYmVyKTogbnVtYmVyO1xuICBsZW5ndGgoKTogbnVtYmVyO1xuICBsZW5ndGhTcXVhcmVkKCk6IG51bWJlcjtcbiAgZG90KHZlYzogSVF1YXRlcm5pb24pOiBudW1iZXI7XG4gIHRvRXVsZXJBbmdsZXNUbyhvdXQ6IElNdXRhYmxlVmVjdG9yMyk6IElNdXRhYmxlVmVjdG9yMztcbiAgdG9FdWxlckFuZ2xlcygpOiBJVmVjdG9yMztcbiAgY2xvbmUoKTogSVF1YXRlcm5pb247XG4gIHRyYW5zZm9ybVZlY3RvcjModmVjOiBJVmVjdG9yMyk6IElWZWN0b3IzO1xuICB0cmFuc2Zvcm1WZWN0b3IzVG8odmVjOiBJVmVjdG9yMywgb3V0OiBJTXV0YWJsZVZlY3RvcjMpOiBJVmVjdG9yMztcbiAgdHJhbnNmb3JtVmVjdG9yM0ludmVyc2UodmVjOiBJVmVjdG9yMyk6IElWZWN0b3IzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNdXRhYmxlUXVhdGVybmlvbiBleHRlbmRzIElRdWF0ZXJuaW9uIHtcbiAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XG5cbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgdzogbnVtYmVyO1xuXG4gIC8vIGNvbW1vbiB3aXRoIGltbXV0YWJsZSBxdWF0ZXJuaW9uXG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZztcbiAgZmxhdHRlbkFzQXJyYXkoKTogQXJyYXk8bnVtYmVyPjtcbiAgaXNEdW1teSgpOiBib29sZWFuO1xuICBpc0VxdWFsKHZlYzogSVF1YXRlcm5pb24sIGRlbHRhPzogbnVtYmVyKTogYm9vbGVhbjtcbiAgaXNTdHJpY3RFcXVhbCh2ZWM6IElRdWF0ZXJuaW9uKTogYm9vbGVhbjtcbiAgYXQoaTogbnVtYmVyKTogbnVtYmVyO1xuICBsZW5ndGgoKTogbnVtYmVyO1xuICBsZW5ndGhTcXVhcmVkKCk6IG51bWJlcjtcbiAgZG90KHZlYzogSVF1YXRlcm5pb24pOiBudW1iZXI7XG4gIHRvRXVsZXJBbmdsZXNUbyhvdXQ6IElNdXRhYmxlVmVjdG9yMyk6IElNdXRhYmxlVmVjdG9yMztcbiAgY2xvbmUoKTogSU11dGFibGVRdWF0ZXJuaW9uO1xuXG4gIC8vIG9ubHkgZm9yIG11dGFibGUgcXVhdGVybmlvblxuICByYXcoKTogVHlwZWRBcnJheTtcbiAgc2V0QXQoaTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogSU11dGFibGVRdWF0ZXJuaW9uO1xuICBzZXRDb21wb25lbnRzKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlcik6IElNdXRhYmxlUXVhdGVybmlvbjtcbiAgY29weUNvbXBvbmVudHMocXVhdDogSVF1YXRlcm5pb24pOiBJTXV0YWJsZVF1YXRlcm5pb247XG4gIGlkZW50aXR5KCk6IElNdXRhYmxlUXVhdGVybmlvbjtcbiAgbm9ybWFsaXplKCk6IElNdXRhYmxlUXVhdGVybmlvbjtcbiAgYXhpc0FuZ2xlKHZlYzogSVZlY3RvcjMsIHJhZGlhbjogbnVtYmVyKTogSU11dGFibGVRdWF0ZXJuaW9uO1xuICBmcm9tTWF0cml4KG1hdDogSU1hdHJpeDQ0KTogSU11dGFibGVRdWF0ZXJuaW9uO1xuICBhZGQocXVhdDogSVF1YXRlcm5pb24pOiBJTXV0YWJsZVF1YXRlcm5pb247XG4gIHN1YnRyYWN0KHF1YXQ6IElRdWF0ZXJuaW9uKTogSU11dGFibGVRdWF0ZXJuaW9uO1xuICBtdWx0aXBseShxdWF0OiBJUXVhdGVybmlvbik6IElNdXRhYmxlUXVhdGVybmlvbjtcbiAgbXVsdGlwbHlOdW1iZXIodmFsdWU6IG51bWJlcik6IElNdXRhYmxlUXVhdGVybmlvbjtcbiAgZGl2aWRlTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBJTXV0YWJsZVF1YXRlcm5pb247XG4gIGNsb25lKCk6IElNdXRhYmxlUXVhdGVybmlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9nUXVhdGVybmlvbiB7XG4gIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBfdjogRmxvYXQzMkFycmF5O1xuXG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xuICByZWFkb25seSB6OiBudW1iZXI7XG4gIHJlYWRvbmx5IHc6IG51bWJlcjtcbn1cbiIsImltcG9ydCB7IFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4vSVF1YXRlcm5pb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIElWZWN0b3Ige1xuICByZWFkb25seSB4OiBudW1iZXI7XG4gIHJlYWRvbmx5IF92OiBUeXBlZEFycmF5O1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzRmxvYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzSW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ5dGVzUGVyQ29tcG9uZW50OiBudW1iZXI7XG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZztcbiAgZmxhdHRlbkFzQXJyYXkoKTogQXJyYXk8bnVtYmVyPjtcbiAgaXNEdW1teSgpOiBib29sZWFuO1xuICBpc0VxdWFsKHZlYzogSVZlY3RvciwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuO1xuICBpc1N0cmljdEVxdWFsKHZlYzogSVZlY3Rvcik6IGJvb2xlYW47XG4gIGF0KGk6IG51bWJlcik6IG51bWJlcjtcbiAgdihpOiBudW1iZXIpOiBudW1iZXI7XG4gIGxlbmd0aCgpOiBudW1iZXI7XG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyO1xuICBsZW5ndGhUbyh2ZWM6IElWZWN0b3IpOiBudW1iZXI7XG4gIGRvdCh2ZWM6IElWZWN0b3IpOiBudW1iZXI7XG4gIGlzVGhlU291cmNlU2FtZShhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNdXRhYmxlVmVjdG9yIGV4dGVuZHMgSVZlY3RvciB7XG4gIF92OiBUeXBlZEFycmF5O1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzRmxvYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzSW50OiBzdHJpbmc7XG5cbiAgcmF3KCk6IFR5cGVkQXJyYXk7XG4gIHNldEF0KGk6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IElNdXRhYmxlVmVjdG9yO1xuICBzZXRDb21wb25lbnRzKC4uLm51bTogbnVtYmVyW10pOiBJTXV0YWJsZVZlY3RvcjtcbiAgY29weUNvbXBvbmVudHModmVjOiBhbnkpOiBJTXV0YWJsZVZlY3RvcjtcbiAgemVybygpOiBJTXV0YWJsZVZlY3RvcjtcbiAgb25lKCk6IElNdXRhYmxlVmVjdG9yO1xuICBub3JtYWxpemUoKTogSU11dGFibGVWZWN0b3I7XG4gIGFkZCh2ZWM6IGFueSk6IElNdXRhYmxlVmVjdG9yO1xuICBzdWJ0cmFjdCh2ZWM6IGFueSk6IElNdXRhYmxlVmVjdG9yO1xuICBtdWx0aXBseSh2YWx1ZTogbnVtYmVyKTogSU11dGFibGVWZWN0b3I7XG4gIG11bHRpcGx5VmVjdG9yKHZlYzogYW55KTogSU11dGFibGVWZWN0b3I7XG4gIGRpdmlkZSh2YWx1ZTogbnVtYmVyKTogSU11dGFibGVWZWN0b3I7XG4gIGRpdmlkZVZlY3Rvcih2ZWM6IGFueSk6IElNdXRhYmxlVmVjdG9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTY2FsYXIgZXh0ZW5kcyBJVmVjdG9yIHtcbiAgX3Y6IFR5cGVkQXJyYXk7XG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSU11dGFibGVTY2FsYXIgZXh0ZW5kcyBJTXV0YWJsZVZlY3RvciB7XG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmVjdG9yMiBleHRlbmRzIElWZWN0b3Ige1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzRmxvYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzSW50OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICByZWFkb25seSB5OiBudW1iZXI7XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nO1xuICBmbGF0dGVuQXNBcnJheSgpOiBBcnJheTxudW1iZXI+O1xuICBpc0R1bW15KCk6IGJvb2xlYW47XG4gIGlzRXF1YWwodmVjOiBJVmVjdG9yMiwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuO1xuICBpc1N0cmljdEVxdWFsKHZlYzogSVZlY3RvcjIpOiBib29sZWFuO1xuICBhdChpOiBudW1iZXIpOiBudW1iZXI7XG4gIGxlbmd0aCgpOiBudW1iZXI7XG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyO1xuICBsZW5ndGhUbyh2ZWM6IElWZWN0b3IyKTogbnVtYmVyO1xuICBkb3QodmVjOiBJVmVjdG9yMik6IG51bWJlcjtcbiAgY2xvbmUoKTogSVZlY3RvcjI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11dGFibGVWZWN0b3IyIGV4dGVuZHMgSU11dGFibGVWZWN0b3Ige1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzRmxvYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzSW50OiBzdHJpbmc7XG5cbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG5cbiAgLy8gY29tbW9uIHdpdGggaW1tdXRhYmxlIHZlY3RvcjJcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nO1xuICBmbGF0dGVuQXNBcnJheSgpOiBBcnJheTxudW1iZXI+O1xuICBpc0R1bW15KCk6IGJvb2xlYW47XG4gIGlzRXF1YWwodmVjOiBJVmVjdG9yMiwgZGVsdGE/OiBudW1iZXIpOiBib29sZWFuO1xuICBpc1N0cmljdEVxdWFsKHZlYzogSVZlY3RvcjIpOiBib29sZWFuO1xuICBhdChpOiBudW1iZXIpOiBudW1iZXI7XG4gIGxlbmd0aCgpOiBudW1iZXI7XG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyO1xuICBsZW5ndGhUbyh2ZWM6IElWZWN0b3IyKTogbnVtYmVyO1xuICBkb3QodmVjOiBJVmVjdG9yMik6IG51bWJlcjtcbiAgY2xvbmUoKTogSU11dGFibGVWZWN0b3IyO1xuXG4gIC8vIG9ubHkgZm9yIG11dGFibGUgdmVjdG9yMlxuICByYXcoKTogVHlwZWRBcnJheTtcbiAgc2V0QXQoaTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogSU11dGFibGVWZWN0b3IyO1xuICBzZXRDb21wb25lbnRzKHg6IG51bWJlciwgeTogbnVtYmVyKTogSU11dGFibGVWZWN0b3IyO1xuICBjb3B5Q29tcG9uZW50cyh2ZWM6IElWZWN0b3IyKTogSU11dGFibGVWZWN0b3IyO1xuICB6ZXJvKCk6IElNdXRhYmxlVmVjdG9yMjtcbiAgb25lKCk6IElNdXRhYmxlVmVjdG9yMjtcbiAgbm9ybWFsaXplKCk6IElNdXRhYmxlVmVjdG9yMjtcbiAgYWRkKHZlYzogSVZlY3RvcjIpOiBJTXV0YWJsZVZlY3RvcjI7XG4gIHN1YnRyYWN0KHZlYzogSVZlY3RvcjIpOiBJTXV0YWJsZVZlY3RvcjI7XG4gIG11bHRpcGx5KHZhbHVlOiBudW1iZXIpOiBJTXV0YWJsZVZlY3RvcjI7XG4gIG11bHRpcGx5VmVjdG9yKHZlYzogSVZlY3RvcjIpOiBJTXV0YWJsZVZlY3RvcjI7XG4gIGRpdmlkZSh2YWx1ZTogbnVtYmVyKTogSU11dGFibGVWZWN0b3IyO1xuICBkaXZpZGVWZWN0b3IodmVjOiBJVmVjdG9yMik6IElNdXRhYmxlVmVjdG9yMjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmVjdG9yMyBleHRlbmRzIElWZWN0b3Ige1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzRmxvYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzSW50OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICByZWFkb25seSB5OiBudW1iZXI7XG4gIHJlYWRvbmx5IHo6IG51bWJlcjtcbiAgcmVhZG9ubHkgdzogbnVtYmVyO1xuXG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZztcbiAgZmxhdHRlbkFzQXJyYXkoKTogQXJyYXk8bnVtYmVyPjtcbiAgaXNEdW1teSgpOiBib29sZWFuO1xuICBpc0VxdWFsKHZlYzogSVZlY3RvcjMsIGRlbHRhPzogbnVtYmVyKTogYm9vbGVhbjtcbiAgaXNTdHJpY3RFcXVhbCh2ZWM6IElWZWN0b3IzKTogYm9vbGVhbjtcbiAgYXQoaTogbnVtYmVyKTogbnVtYmVyO1xuICBsZW5ndGgoKTogbnVtYmVyO1xuICBsZW5ndGhTcXVhcmVkKCk6IG51bWJlcjtcbiAgbGVuZ3RoVG8odmVjOiBJVmVjdG9yMyk6IG51bWJlcjtcbiAgZG90KHZlYzogSVZlY3RvcjMpOiBudW1iZXI7XG4gIGNsb25lKCk6IElWZWN0b3IzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNdXRhYmxlVmVjdG9yMyBleHRlbmRzIElNdXRhYmxlVmVjdG9yIHtcbiAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsc2xTdHJBc0Zsb2F0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsc2xTdHJBc0ludDogc3RyaW5nO1xuXG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIHJlYWRvbmx5IHc6IG51bWJlcjtcblxuICAvLyBjb21tb24gd2l0aCBpbW11dGFibGUgdmVjdG9yM1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG4gIHRvU3RyaW5nQXBwcm94aW1hdGVseSgpOiBzdHJpbmc7XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IEFycmF5PG51bWJlcj47XG4gIGlzRHVtbXkoKTogYm9vbGVhbjtcbiAgaXNFcXVhbCh2ZWM6IElWZWN0b3IzLCBkZWx0YT86IG51bWJlcik6IGJvb2xlYW47XG4gIGlzU3RyaWN0RXF1YWwodmVjOiBJVmVjdG9yMyk6IGJvb2xlYW47XG4gIGF0KGk6IG51bWJlcik6IG51bWJlcjtcbiAgbGVuZ3RoKCk6IG51bWJlcjtcbiAgbGVuZ3RoU3F1YXJlZCgpOiBudW1iZXI7XG4gIGxlbmd0aFRvKHZlYzogSVZlY3RvcjMpOiBudW1iZXI7XG4gIGRvdCh2ZWM6IElWZWN0b3IzKTogbnVtYmVyO1xuICBjbG9uZSgpOiBJTXV0YWJsZVZlY3RvcjM7XG5cbiAgLy8gb25seSBmb3IgbXV0YWJsZSB2ZWN0b3IzXG4gIHJhdygpOiBUeXBlZEFycmF5O1xuICBzZXRBdChpOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIHNldENvbXBvbmVudHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IElNdXRhYmxlVmVjdG9yMztcbiAgY29weUNvbXBvbmVudHModmVjOiBJVmVjdG9yMyk6IElNdXRhYmxlVmVjdG9yMztcbiAgemVybygpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIG9uZSgpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIG5vcm1hbGl6ZSgpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIGFkZCh2ZWM6IElWZWN0b3IzKTogSU11dGFibGVWZWN0b3IzO1xuICBzdWJ0cmFjdCh2ZWM6IElWZWN0b3IzKTogSU11dGFibGVWZWN0b3IzO1xuICBtdWx0aXBseSh2YWx1ZTogbnVtYmVyKTogSU11dGFibGVWZWN0b3IzO1xuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3IzKTogSU11dGFibGVWZWN0b3IzO1xuICBkaXZpZGUodmFsdWU6IG51bWJlcik6IElNdXRhYmxlVmVjdG9yMztcbiAgZGl2aWRlVmVjdG9yKHZlYzogSVZlY3RvcjMpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIGNyb3NzKHZlYzogSVZlY3RvcjMpOiBJTXV0YWJsZVZlY3RvcjM7XG4gIG11bHRpcGx5UXVhdGVybmlvbihxdWF0OiBJUXVhdGVybmlvbik6IElNdXRhYmxlVmVjdG9yMztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmVjdG9yNCBleHRlbmRzIElWZWN0b3Ige1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzRmxvYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xzbFN0ckFzSW50OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICByZWFkb25seSB5OiBudW1iZXI7XG4gIHJlYWRvbmx5IHo6IG51bWJlcjtcbiAgcmVhZG9ubHkgdzogbnVtYmVyO1xuXG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZztcbiAgZmxhdHRlbkFzQXJyYXkoKTogQXJyYXk8bnVtYmVyPjtcbiAgaXNEdW1teSgpOiBib29sZWFuO1xuICBpc0VxdWFsKHZlYzogSVZlY3RvcjQsIGRlbHRhPzogbnVtYmVyKTogYm9vbGVhbjtcbiAgaXNTdHJpY3RFcXVhbCh2ZWM6IElWZWN0b3I0KTogYm9vbGVhbjtcbiAgYXQoaTogbnVtYmVyKTogbnVtYmVyO1xuICBsZW5ndGgoKTogbnVtYmVyO1xuICBsZW5ndGhTcXVhcmVkKCk6IG51bWJlcjtcbiAgbGVuZ3RoVG8odmVjOiBJVmVjdG9yNCk6IG51bWJlcjtcbiAgZG90KHZlYzogSVZlY3RvcjQpOiBudW1iZXI7XG4gIGNsb25lKCk6IElWZWN0b3I0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNdXRhYmxlVmVjdG9yNCBleHRlbmRzIElNdXRhYmxlVmVjdG9yIHtcbiAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsc2xTdHJBc0Zsb2F0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsc2xTdHJBc0ludDogc3RyaW5nO1xuXG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcblxuICAvLyBjb21tb24gd2l0aCBpbW11dGFibGUgdmVjdG9yM1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG4gIHRvU3RyaW5nQXBwcm94aW1hdGVseSgpOiBzdHJpbmc7XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IEFycmF5PG51bWJlcj47XG4gIGlzRHVtbXkoKTogYm9vbGVhbjtcbiAgaXNFcXVhbCh2ZWM6IElWZWN0b3I0LCBkZWx0YT86IG51bWJlcik6IGJvb2xlYW47XG4gIGlzU3RyaWN0RXF1YWwodmVjOiBJVmVjdG9yNCk6IGJvb2xlYW47XG4gIGF0KGk6IG51bWJlcik6IG51bWJlcjtcbiAgbGVuZ3RoKCk6IG51bWJlcjtcbiAgbGVuZ3RoU3F1YXJlZCgpOiBudW1iZXI7XG4gIGxlbmd0aFRvKHZlYzogSVZlY3RvcjQpOiBudW1iZXI7XG4gIGRvdCh2ZWM6IElWZWN0b3I0KTogbnVtYmVyO1xuICBjbG9uZSgpOiBJTXV0YWJsZVZlY3RvcjQ7XG5cbiAgLy8gb25seSBmb3IgbXV0YWJsZSB2ZWN0b3IzXG4gIHJhdygpOiBUeXBlZEFycmF5O1xuICBzZXRBdChpOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBJTXV0YWJsZVZlY3RvcjQ7XG4gIHNldENvbXBvbmVudHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdzogbnVtYmVyKTogSU11dGFibGVWZWN0b3I0O1xuICBjb3B5Q29tcG9uZW50cyh2ZWM6IElWZWN0b3I0KTogSU11dGFibGVWZWN0b3I0O1xuICB6ZXJvKCk6IElNdXRhYmxlVmVjdG9yNDtcbiAgb25lKCk6IElNdXRhYmxlVmVjdG9yNDtcbiAgbm9ybWFsaXplKCk6IElNdXRhYmxlVmVjdG9yNDtcbiAgbm9ybWFsaXplMygpOiBJTXV0YWJsZVZlY3RvcjQ7XG4gIGFkZCh2ZWM6IElWZWN0b3I0KTogSU11dGFibGVWZWN0b3I0O1xuICBzdWJ0cmFjdCh2ZWM6IElWZWN0b3I0KTogSU11dGFibGVWZWN0b3I0O1xuICBtdWx0aXBseSh2YWx1ZTogbnVtYmVyKTogSU11dGFibGVWZWN0b3I0O1xuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3I0KTogSU11dGFibGVWZWN0b3I0O1xuICBkaXZpZGUodmFsdWU6IG51bWJlcik6IElNdXRhYmxlVmVjdG9yNDtcbiAgZGl2aWRlVmVjdG9yKHZlYzogSVZlY3RvcjQpOiBJTXV0YWJsZVZlY3RvcjQ7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBwcmV0dGllci9wcmV0dGllciAqL1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEFic3RyYWN0TWF0cml4IH0gZnJvbSAnLi9BYnN0cmFjdE1hdHJpeCc7XG5pbXBvcnQgeyBJTWF0cml4LCBJTWF0cml4MzMgfSBmcm9tICcuL0lNYXRyaXgnO1xuaW1wb3J0IHsgSVZlY3RvciwgSU11dGFibGVWZWN0b3IgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgTWF0cml4MzMgfSBmcm9tICcuL01hdHJpeDMzJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzJztcblxuZXhwb3J0IGNsYXNzIElkZW50aXR5TWF0cml4MzMgZXh0ZW5kcyBBYnN0cmFjdE1hdHJpeCBpbXBsZW1lbnRzIElNYXRyaXgsIElNYXRyaXgzMyB7XG4gIHN0YXRpYyByZWFkb25seSBfX3YgPSBuZXcgRmxvYXQzMkFycmF5KFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdiA9IElkZW50aXR5TWF0cml4MzMuX192O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYDEgMCAwXG4wIDEgMFxuMCAwIDFcbmA7XG4gIH1cbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfVxuICBmbGF0dGVuQXNBcnJheSgpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgfVxuICBpc0R1bW15KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzRXF1YWwobWF0OiBJTWF0cml4MzMsIGRlbHRhOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTik6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIE1hdGguYWJzKG1hdC5tMDAgLSAxKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTEwKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTIwKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTAxKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTExIC0gMSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0yMSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0wMikgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0xMikgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0yMiAtIDEpIDwgZGVsdGFcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpY3RFcXVhbChtYXQ6IElNYXRyaXgzMyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHYgPSAobWF0IGFzIE1hdHJpeDMzKS5fdjtcbiAgICBpZiAoXG4gICAgICB2WzBdID09PSAxICYmXG4gICAgICB2WzFdID09PSAwICYmXG4gICAgICB2WzJdID09PSAwICYmXG4gICAgICB2WzNdID09PSAwICYmXG4gICAgICB2WzRdID09PSAwICYmXG4gICAgICB2WzVdID09PSAwICYmXG4gICAgICB2WzZdID09PSAwICYmXG4gICAgICB2WzddID09PSAwICYmXG4gICAgICB2WzhdID09PSAwICYmXG4gICAgICB2WzldID09PSAwICYmXG4gICAgICB2WzEwXSA9PT0gMCAmJlxuICAgICAgdlsxMV0gPT09IDAgJiZcbiAgICAgIHZbMTJdID09PSAwICYmXG4gICAgICB2WzEzXSA9PT0gMCAmJlxuICAgICAgdlsxNF0gPT09IDAgJiZcbiAgICAgIHZbMTVdID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByb3dfaSA9PT0gY29sdW1uX2kgPyAxIDogMDtcbiAgfVxuXG4gIGRldGVybWluYW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3IpOiBJVmVjdG9yIHtcbiAgICByZXR1cm4gdmVjO1xuICB9XG5cbiAgbXVsdGlwbHlWZWN0b3JUbyh2ZWM6IElWZWN0b3IsIG91dFZlYzogSU11dGFibGVWZWN0b3IpOiBJTXV0YWJsZVZlY3RvciB7XG4gICAgY29uc3QgdiA9ICh2ZWMgYXMgVmVjdG9yMykuX3Y7XG4gICAgb3V0VmVjLl92WzBdID0gdlswXTtcbiAgICBvdXRWZWMuX3ZbMV0gPSB2WzFdO1xuICAgIG91dFZlYy5fdlsyXSA9IHZbMl07XG4gICAgb3V0VmVjLl92WzNdID0gdlszXTtcblxuICAgIHJldHVybiBvdXRWZWM7XG4gIH1cblxuICBnZXRTY2FsZSgpOiBJVmVjdG9yIHtcbiAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weUFycmF5KFsxLCAxLCAxXSk7XG4gIH1cblxuICBnZXRTY2FsZVRvKG91dFZlYzogSU11dGFibGVWZWN0b3IpOiBJTXV0YWJsZVZlY3RvciB7XG4gICAgY29uc3QgdiA9IChvdXRWZWMgYXMgTXV0YWJsZVZlY3RvcjMpLl92O1xuXG4gICAgdlswXSA9IDE7XG4gICAgdlsxXSA9IDE7XG4gICAgdlsyXSA9IDE7XG5cbiAgICByZXR1cm4gb3V0VmVjO1xuICB9XG5cbiAgY2xvbmUoKTogSU1hdHJpeDMzIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5TWF0cml4MzMoKTtcbiAgfVxuXG4gIGdldFJvdGF0ZSgpOiBJTWF0cml4MzMge1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHlNYXRyaXgzMygpO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDAoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMCgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIwKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzAoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMSgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTExKCkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjEoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0zMSgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAyKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMTIoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0yMigpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTMyKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDMoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMygpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIzKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzMoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnSWRlbnRpdHlNYXRyaXgzMyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvc2l0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLk1hdDM7XG4gIH1cblxuICBnZXQgaXNJZGVudGl0eU1hdHJpeENsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBwcmV0dGllci9wcmV0dGllciAqL1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEFic3RyYWN0TWF0cml4IH0gZnJvbSAnLi9BYnN0cmFjdE1hdHJpeCc7XG5pbXBvcnQgeyBJTWF0cml4LCBJTWF0cml4NDQgfSBmcm9tICcuL0lNYXRyaXgnO1xuaW1wb3J0IHsgSVZlY3RvciwgSVZlY3RvcjQsIElNdXRhYmxlVmVjdG9yLCBJVmVjdG9yMyB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4vTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuL011dGFibGVWZWN0b3I0JztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4vVmVjdG9yNCc7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eU1hdHJpeDQ0IGV4dGVuZHMgQWJzdHJhY3RNYXRyaXggaW1wbGVtZW50cyBJTWF0cml4LCBJTWF0cml4NDQge1xuICBzdGF0aWMgcmVhZG9ubHkgX192ID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMV0pO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3YgPSBJZGVudGl0eU1hdHJpeDQ0Ll9fdjtcbiAgfVxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgMSAwIDAgMFxuMCAxIDAgMFxuMCAwIDEgMFxuMCAwIDAgMVxuYDtcbiAgfVxuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICB9XG4gIGZsYXR0ZW5Bc0FycmF5KCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gWzEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDFdO1xuICB9XG4gIGlzRHVtbXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNFcXVhbChtYXQ6IElNYXRyaXg0NCwgZGVsdGE6IG51bWJlciA9IE51bWJlci5FUFNJTE9OKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgTWF0aC5hYnMobWF0Lm0wMCAtIDEpIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5tMTApIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5tMjApIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5tMzApIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5tMDEpIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5tMTEgLSAxKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTIxKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTMxKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTAyKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTEyKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQubTIyIC0gMSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0zMikgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0wMykgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0xMykgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0yMykgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMobWF0Lm0zMyAtIDEpIDwgZGVsdGFcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpY3RFcXVhbChtYXQ6IElNYXRyaXgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2ID0gKG1hdCBhcyBNYXRyaXg0NCkuX3Y7XG4gICAgaWYgKFxuICAgICAgdlswXSA9PT0gMSAmJlxuICAgICAgdlsxXSA9PT0gMCAmJlxuICAgICAgdlsyXSA9PT0gMCAmJlxuICAgICAgdlszXSA9PT0gMCAmJlxuICAgICAgdls0XSA9PT0gMCAmJlxuICAgICAgdls1XSA9PT0gMSAmJlxuICAgICAgdls2XSA9PT0gMCAmJlxuICAgICAgdls3XSA9PT0gMCAmJlxuICAgICAgdls4XSA9PT0gMCAmJlxuICAgICAgdls5XSA9PT0gMCAmJlxuICAgICAgdlsxMF0gPT09IDEgJiZcbiAgICAgIHZbMTFdID09PSAwICYmXG4gICAgICB2WzEyXSA9PT0gMCAmJlxuICAgICAgdlsxM10gPT09IDAgJiZcbiAgICAgIHZbMTRdID09PSAwICYmXG4gICAgICB2WzE1XSA9PT0gMVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhdChyb3dfaTogbnVtYmVyLCBjb2x1bW5faTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93X2kgPT09IGNvbHVtbl9pID8gMSA6IDA7XG4gIH1cblxuICB2KGk6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGkgJSA1ID09PSAwID8gMSA6IDA7XG4gIH1cblxuICBkZXRlcm1pbmFudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbXVsdGlwbHlWZWN0b3IodmVjOiBJVmVjdG9yNCk6IElWZWN0b3I0IHtcbiAgICByZXR1cm4gdmVjO1xuICB9XG5cbiAgbXVsdGlwbHlWZWN0b3IzKHZlYzogSVZlY3RvcjMpOiBJVmVjdG9yMyB7XG4gICAgcmV0dXJuIHZlYztcbiAgfVxuXG4gIG11bHRpcGx5VmVjdG9yVG8odmVjOiBJVmVjdG9yLCBvdXRWZWM6IElNdXRhYmxlVmVjdG9yKTogSU11dGFibGVWZWN0b3Ige1xuICAgIGNvbnN0IHYgPSAodmVjIGFzIFZlY3RvcjQpLl92O1xuICAgIG91dFZlYy5fdlswXSA9IHZbMF07XG4gICAgb3V0VmVjLl92WzFdID0gdlsxXTtcbiAgICBvdXRWZWMuX3ZbMl0gPSB2WzJdO1xuICAgIG91dFZlYy5fdlszXSA9IHZbM107XG5cbiAgICByZXR1cm4gb3V0VmVjO1xuICB9XG5cbiAgZ2V0U2NhbGUoKTogSVZlY3RvcjMge1xuICAgIHJldHVybiBWZWN0b3IzLm9uZSgpO1xuICB9XG5cbiAgZ2V0U2NhbGVUbyhvdXRWZWM6IElNdXRhYmxlVmVjdG9yKTogSU11dGFibGVWZWN0b3Ige1xuICAgIGNvbnN0IHYgPSAob3V0VmVjIGFzIE11dGFibGVWZWN0b3I0KS5fdjtcblxuICAgIHZbMF0gPSAxO1xuICAgIHZbMV0gPSAxO1xuICAgIHZbMl0gPSAxO1xuXG4gICAgcmV0dXJuIG91dFZlYztcbiAgfVxuXG4gIGNsb25lKCk6IElNYXRyaXg0NCB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eU1hdHJpeDQ0KCk7XG4gIH1cblxuICBnZXRSb3RhdGUoKTogSU1hdHJpeDQ0IHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5TWF0cml4NDQoKTtcbiAgfVxuXG4gIGdldFRyYW5zbGF0ZSgpOiBJVmVjdG9yMyB7XG4gICAgcmV0dXJuIFZlY3RvcjMuemVybygpO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDAoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMCgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIwKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzAoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMSgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTExKCkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjEoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0zMSgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAyKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMTIoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0yMigpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTMyKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDMoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMygpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIzKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzMoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRyYW5zbGF0ZVgoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcHVibGljIGdldCB0cmFuc2xhdGVZKCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRlWigpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGdldCBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdJZGVudGl0eU1hdHJpeDQ0JztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcG9zaXRpb25UeXBlKCkge1xuICAgIHJldHVybiBDb21wb3NpdGlvblR5cGUuTWF0NDtcbiAgfVxuXG4gIGdldCBpc0lkZW50aXR5TWF0cml4Q2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsImltcG9ydCB7IElWZWN0b3IzLCBJVmVjdG9yNCB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi9RdWF0ZXJuaW9uJztcbmltcG9ydCB7IEFycmF5MywgVHlwZWRBcnJheSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElMb2dRdWF0ZXJuaW9uLCBJUXVhdGVybmlvbiB9IGZyb20gJy4vSVF1YXRlcm5pb24nO1xuXG5leHBvcnQgY2xhc3MgTG9nUXVhdGVybmlvbiBpbXBsZW1lbnRzIElMb2dRdWF0ZXJuaW9uIHtcbiAgX3Y6IEZsb2F0MzJBcnJheTtcbiAgY29uc3RydWN0b3IoeDogRmxvYXQzMkFycmF5KSB7XG4gICAgdGhpcy5fdiA9IHg7XG4gIH1cblxuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIGdldCB5KCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgZ2V0IHooKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBnZXQgdygpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICByZXR1cm4gbmV3IExvZ1F1YXRlcm5pb24oYXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkzKGFycmF5OiBBcnJheTM8bnVtYmVyPikge1xuICAgIHJldHVybiBuZXcgUXVhdGVybmlvbihuZXcgRmxvYXQzMkFycmF5KGFycmF5KSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXk8bnVtYmVyPikge1xuICAgIHJldHVybiBuZXcgUXVhdGVybmlvbihuZXcgRmxvYXQzMkFycmF5KGFycmF5LnNsaWNlKDAsIDMpKSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHkzKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24obmV3IEZsb2F0MzJBcnJheShbeCwgeSwgel0pKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUxvZ1F1YXRlcm5pb24ocXVhdDogSUxvZ1F1YXRlcm5pb24pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICB2WzBdID0gcXVhdC5fdlswXTtcbiAgICB2WzFdID0gcXVhdC5fdlsxXTtcbiAgICB2WzJdID0gcXVhdC5fdlsyXTtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24odik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlWZWN0b3I0KHZlYzogSVZlY3RvcjMpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICB2WzBdID0gdmVjLl92WzBdO1xuICAgIHZbMV0gPSB2ZWMuX3ZbMV07XG4gICAgdlsyXSA9IHZlYy5fdlsyXTtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24odik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlRdWF0ZXJuaW9uKHg6IElRdWF0ZXJuaW9uKSB7XG4gICAgY29uc3QgdGhldGEgPSBNYXRoLmFjb3MoeC53KTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgzKTtcbiAgICB2WzBdID0geC54ICogKHRoZXRhIC8gc2luKTtcbiAgICB2WzFdID0geC55ICogKHRoZXRhIC8gc2luKTtcbiAgICB2WzJdID0geC56ICogKHRoZXRhIC8gc2luKTtcbiAgICByZXR1cm4gbmV3IExvZ1F1YXRlcm5pb24odik7XG4gIH1cblxuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnTG9nUXVhdGVybmlvbic7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuL1ZlY3RvcjInO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi9WZWN0b3I0JztcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuL1F1YXRlcm5pb24nO1xuaW1wb3J0IHsgTWF0cml4MzMgfSBmcm9tICcuL01hdHJpeDMzJztcbmltcG9ydCB7IE1hdHJpeDQ0IH0gZnJvbSAnLi9NYXRyaXg0NCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MzMgfSBmcm9tICcuL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yNCB9IGZyb20gJy4vTXV0YWJsZVZlY3RvcjQnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IyIH0gZnJvbSAnLi9NdXRhYmxlVmVjdG9yMic7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuL1NjYWxhcic7XG5pbXBvcnQgeyBNdXRhYmxlUXVhdGVybmlvbiB9IGZyb20gJy4vTXV0YWJsZVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgTXV0YWJsZVNjYWxhciB9IGZyb20gJy4vTXV0YWJsZVNjYWxhcic7XG5pbXBvcnQgeyBWZWN0b3JOIH0gZnJvbSAnLi9WZWN0b3JOJztcbmltcG9ydCB7IFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyBNYXRoQ2xhc3NVdGlsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWN0b3I0XzA6IE11dGFibGVWZWN0b3I0ID0gTXV0YWJsZVZlY3RvcjQuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlY3RvcjRfMTogTXV0YWJsZVZlY3RvcjQgPSBNdXRhYmxlVmVjdG9yNC56ZXJvKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBhcnJheVRvVmVjdG9yKGVsZW1lbnQ6IEFycmF5PG51bWJlcj4pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50WzNdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFtlbGVtZW50WzBdLCBlbGVtZW50WzFdLCBlbGVtZW50WzJdLCBlbGVtZW50WzNdXSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50WzJdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtlbGVtZW50WzBdLCBlbGVtZW50WzFdLCBlbGVtZW50WzJdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVmVjdG9yMi5mcm9tQ29weUFycmF5MihbZWxlbWVudFswXSwgZWxlbWVudFsxXV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXJyYXlUb1ZlY3Rvck9yTWF0cml4KGVsZW1lbnQ6IEFycmF5PG51bWJlcj4pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50WzE1XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIE1hdHJpeDQ0LmZyb21Db3B5QXJyYXlSb3dNYWpvcihlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnRbOF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBNYXRyaXgzMy5mcm9tQ29weUFycmF5Um93TWFqb3IoZWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50WzNdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFtlbGVtZW50WzBdLCBlbGVtZW50WzFdLCBlbGVtZW50WzJdLCBlbGVtZW50WzNdXSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50WzJdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtlbGVtZW50WzBdLCBlbGVtZW50WzFdLCBlbGVtZW50WzJdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVmVjdG9yMi5mcm9tQ29weUFycmF5MihbZWxlbWVudFswXSwgZWxlbWVudFsxXV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0SW1tdXRhYmxlVmFsdWVDbGFzcyhjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0pOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzIpIHtcbiAgICAgIHJldHVybiBWZWN0b3IyO1xuICAgIH0gZWxzZSBpZiAoY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjMykge1xuICAgICAgcmV0dXJuIFZlY3RvcjM7XG4gICAgfSBlbHNlIGlmIChjb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWM0KSB7XG4gICAgICByZXR1cm4gVmVjdG9yNDtcbiAgICB9IGVsc2UgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDMpIHtcbiAgICAgIHJldHVybiBNYXRyaXgzMztcbiAgICB9IGVsc2UgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDQpIHtcbiAgICAgIHJldHVybiBNYXRyaXg0NDtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNdXRhYmxlVmFsdWVDbGFzcyhjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0pOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzIpIHtcbiAgICAgIHJldHVybiBNdXRhYmxlVmVjdG9yMjtcbiAgICB9IGVsc2UgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzMpIHtcbiAgICAgIHJldHVybiBNdXRhYmxlVmVjdG9yMztcbiAgICB9IGVsc2UgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzQpIHtcbiAgICAgIHJldHVybiBNdXRhYmxlVmVjdG9yNDtcbiAgICB9IGVsc2UgaWYgKGNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLk1hdDMpIHtcbiAgICAgIHJldHVybiBNdXRhYmxlTWF0cml4MzM7XG4gICAgfSBlbHNlIGlmIChjb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5NYXQ0KSB7XG4gICAgICByZXR1cm4gTXV0YWJsZU1hdHJpeDQ0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjbG9uZU9mTWF0aE9iamVjdHMoZWxlbWVudDogYW55KSB7XG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXRyaXg0NCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXRyaXgzMykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3I0KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmNsb25lKCk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmVjdG9yMikge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY2xvbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzQWNjZXB0YWJsZUFycmF5Rm9yUXVhdGVybmlvbihlbGVtZW50OiBBcnJheTxudW1iZXI+KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudFszXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBhcnJheVRvUXVhdGVybmlvbihlbGVtZW50OiBBcnJheTxudW1iZXI+KSB7XG4gICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KGVsZW1lbnRbMF0sIGVsZW1lbnRbMV0sIGVsZW1lbnRbMl0sIGVsZW1lbnRbM10pO1xuICB9XG5cbiAgc3RhdGljIG1ha2VTdWJBcnJheShhcnJheTogQXJyYXk8YW55PiwgY29tcG9uZW50TjogbnVtYmVyKSB7XG4gICAgaWYgKGNvbXBvbmVudE4gPT09IDQpIHtcbiAgICAgIHJldHVybiBbYXJyYXlbMF0sIGFycmF5WzFdLCBhcnJheVsyXSwgYXJyYXlbM11dO1xuICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TiA9PT0gMykge1xuICAgICAgcmV0dXJuIFthcnJheVswXSwgYXJyYXlbMV0sIGFycmF5WzJdXTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudE4gPT09IDIpIHtcbiAgICAgIHJldHVybiBbYXJyYXlbMF0sIGFycmF5WzFdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFycmF5WzBdO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2ZWN0b3JUb0FycmF5KGVsZW1lbnQ6IFZlY3RvcjIgfCBWZWN0b3IzIHwgVmVjdG9yNCB8IFF1YXRlcm5pb24pIHtcbiAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcjIpIHtcbiAgICAgIHJldHVybiBbZWxlbWVudC54LCBlbGVtZW50LnldO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgIHJldHVybiBbZWxlbWVudC54LCBlbGVtZW50LnksIGVsZW1lbnQuel07XG4gICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmVjdG9yNCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUXVhdGVybmlvbikge1xuICAgICAgcmV0dXJuIFtlbGVtZW50LngsIGVsZW1lbnQueSwgZWxlbWVudC56LCBlbGVtZW50LnddO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGlzY3JpbWluYXRlIHdoaWNoIFZlY3RvciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZWxlbWVudCBhbnkgVmVjdG9yIGluc3RhbmNlXG4gICAqIEByZXR1cm4gbnVtYmVyIG9mIFZlY3RvciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGNvbXBvbmVudE51bWJlck9mVmVjdG9yKFxuICAgIGVsZW1lbnQ6IFZlY3RvcjIgfCBWZWN0b3IzIHwgVmVjdG9yNCB8IFF1YXRlcm5pb24gfCBBcnJheTxhbnk+XG4gICk6IG51bWJlciB7XG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3IyKSB7XG4gICAgICByZXR1cm4gMjtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3IzKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3I0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBRdWF0ZXJuaW9uKSB7XG4gICAgICByZXR1cm4gNDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50Lmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gdmFsdWVzIHJhbmdlIG11c3QgYmUgWy0xLCAxXVxuICBzdGF0aWMgcGFja05vcm1hbGl6ZWRWZWM0VG9WZWMyKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlciwgY3JpdGVyaWE6IG51bWJlcikge1xuICAgIGxldCB2MCA9IDAuMDtcbiAgICBsZXQgdjEgPSAwLjA7XG5cbiAgICB4ID0gKHggKyAxKSAvIDIuMDtcbiAgICB5ID0gKHkgKyAxKSAvIDIuMDtcbiAgICB6ID0gKHogKyAxKSAvIDIuMDtcbiAgICB3ID0gKHcgKyAxKSAvIDIuMDtcblxuICAgIGNvbnN0IGlyID0gTWF0aC5mbG9vcih4ICogKGNyaXRlcmlhIC0gMS4wKSk7XG4gICAgY29uc3QgaWcgPSBNYXRoLmZsb29yKHkgKiAoY3JpdGVyaWEgLSAxLjApKTtcbiAgICBjb25zdCBpcmcgPSBpciAqIGNyaXRlcmlhICsgaWc7XG4gICAgdjAgPSBpcmcgLyBjcml0ZXJpYTtcblxuICAgIGNvbnN0IGliID0gTWF0aC5mbG9vcih6ICogKGNyaXRlcmlhIC0gMS4wKSk7XG4gICAgY29uc3QgaWEgPSBNYXRoLmZsb29yKHcgKiAoY3JpdGVyaWEgLSAxLjApKTtcbiAgICBjb25zdCBpYmEgPSBpYiAqIGNyaXRlcmlhICsgaWE7XG4gICAgdjEgPSBpYmEgLyBjcml0ZXJpYTtcblxuICAgIHJldHVybiBbdjAsIHYxXTtcbiAgfVxuXG4gIHN0YXRpYyB1blByb2plY3RUbyhcbiAgICB3aW5kb3dQb3NYOiBudW1iZXIsXG4gICAgd2luZG93UG9zWTogbnVtYmVyLFxuICAgIHdpbmRvd1Bvc1o6IG51bWJlcixcbiAgICBpbnZlcnNlUFZNYXQ0NDogTWF0cml4NDQsXG4gICAgdmlld3BvcnRWZWM0OiBWZWN0b3I0LFxuICAgIG91dDogTXV0YWJsZVZlY3RvcjNcbiAgKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9fdG1wVmVjdG9yNF8wLnNldENvbXBvbmVudHMoXG4gICAgICAoKHdpbmRvd1Bvc1ggLSB2aWV3cG9ydFZlYzQueCkgLyB2aWV3cG9ydFZlYzQueikgKiAyIC0gMS4wLFxuICAgICAgKCh3aW5kb3dQb3NZIC0gdmlld3BvcnRWZWM0LnkpIC8gdmlld3BvcnRWZWM0LncpICogMiAtIDEuMCxcbiAgICAgIDIgKiB3aW5kb3dQb3NaIC0gMS4wLFxuICAgICAgMS4wXG4gICAgKTtcblxuICAgIGNvbnN0IG91dE5vbk5vcm1hbGl6ZWQgPSBpbnZlcnNlUFZNYXQ0NC5tdWx0aXBseVZlY3RvclRvKGlucHV0LCB0aGlzLl9fdG1wVmVjdG9yNF8xKTtcbiAgICBpZiAob3V0Tm9uTm9ybWFsaXplZC53ID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE11dGFibGVWZWN0b3IzLm11bHRpcGx5VG8ob3V0Tm9uTm9ybWFsaXplZCwgMS4wIC8gb3V0Tm9uTm9ybWFsaXplZC53LCBvdXQpO1xuICB9XG5cbiAgc3RhdGljIGFkZChsaHM6IGFueSwgcmhzOiBhbnkpIHtcbiAgICBpZiAoaXNGaW5pdGUobGhzKSkge1xuICAgICAgLy8gbnVtYmVyP1xuICAgICAgcmV0dXJuIGxocyArIHJocztcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFZlY3RvcjIpIHtcbiAgICAgIHJldHVybiBWZWN0b3IyLmFkZChsaHMsIHJocyk7XG4gICAgfSBlbHNlIGlmIChsaHMgaW5zdGFuY2VvZiBWZWN0b3IzKSB7XG4gICAgICByZXR1cm4gVmVjdG9yMy5hZGQobGhzLCByaHMpO1xuICAgIH0gZWxzZSBpZiAobGhzIGluc3RhbmNlb2YgVmVjdG9yNCkge1xuICAgICAgcmV0dXJuIFZlY3RvcjQuYWRkKGxocywgcmhzKTtcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFF1YXRlcm5pb24pIHtcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmFkZChsaHMsIHJocyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxocykpIHtcbiAgICAgIGNvbnN0IGFycjogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGxoc1tpXSArIHJoc1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignTm9uIHN1cHBvcnRlZCB0eXBlIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsaHM6IGFueSwgcmhzOiBhbnkpIHtcbiAgICBpZiAoaXNGaW5pdGUobGhzKSkge1xuICAgICAgLy8gbnVtYmVyP1xuICAgICAgcmV0dXJuIGxocyAtIHJocztcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFZlY3RvcjIpIHtcbiAgICAgIHJldHVybiBWZWN0b3IyLnN1YnRyYWN0KGxocywgcmhzKTtcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgIHJldHVybiBWZWN0b3IzLnN1YnRyYWN0KGxocywgcmhzKTtcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFZlY3RvcjQpIHtcbiAgICAgIHJldHVybiBWZWN0b3I0LnN1YnRyYWN0KGxocywgcmhzKTtcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFF1YXRlcm5pb24pIHtcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLnN1YnRyYWN0KGxocywgcmhzKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobGhzKSkge1xuICAgICAgY29uc3QgYXJyOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gbGhzW2ldIC0gcmhzW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCdOb24gc3VwcG9ydGVkIHR5cGUhJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5TnVtYmVyKGxoczogYW55LCByaHM6IG51bWJlcikge1xuICAgIGlmIChpc0Zpbml0ZShsaHMpKSB7XG4gICAgICAvLyBudW1iZXI/XG4gICAgICByZXR1cm4gbGhzICogcmhzO1xuICAgIH0gZWxzZSBpZiAobGhzIGluc3RhbmNlb2YgVmVjdG9yMikge1xuICAgICAgcmV0dXJuIFZlY3RvcjIubXVsdGlwbHkobGhzLCByaHMpO1xuICAgIH0gZWxzZSBpZiAobGhzIGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgcmV0dXJuIFZlY3RvcjMubXVsdGlwbHkobGhzLCByaHMpO1xuICAgIH0gZWxzZSBpZiAobGhzIGluc3RhbmNlb2YgVmVjdG9yNCkge1xuICAgICAgcmV0dXJuIFZlY3RvcjQubXVsdGlwbHkobGhzLCByaHMpO1xuICAgIH0gZWxzZSBpZiAobGhzIGluc3RhbmNlb2YgUXVhdGVybmlvbikge1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24ubXVsdGlwbHlOdW1iZXIobGhzLCByaHMpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShsaHMpKSB7XG4gICAgICBjb25zdCBhcnI6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxocy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJbaV0gPSBsaHNbaV0gKiByaHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ05vbiBzdXBwb3J0ZWQgdHlwZSEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGRpdmlkZU51bWJlcihsaHM6IGFueSwgcmhzOiBudW1iZXIpIHtcbiAgICBpZiAoaXNGaW5pdGUobGhzKSkge1xuICAgICAgLy8gbnVtYmVyP1xuICAgICAgcmV0dXJuIGxocyAvIHJocztcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFZlY3RvcjIpIHtcbiAgICAgIHJldHVybiBWZWN0b3IyLm11bHRpcGx5KGxocywgMSAvIHJocyk7XG4gICAgfSBlbHNlIGlmIChsaHMgaW5zdGFuY2VvZiBWZWN0b3IzKSB7XG4gICAgICByZXR1cm4gVmVjdG9yMy5tdWx0aXBseShsaHMsIDEgLyByaHMpO1xuICAgIH0gZWxzZSBpZiAobGhzIGluc3RhbmNlb2YgVmVjdG9yNCkge1xuICAgICAgcmV0dXJuIFZlY3RvcjQubXVsdGlwbHkobGhzLCAxIC8gcmhzKTtcbiAgICB9IGVsc2UgaWYgKGxocyBpbnN0YW5jZW9mIFF1YXRlcm5pb24pIHtcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLm11bHRpcGx5TnVtYmVyKGxocywgMSAvIHJocyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxocykpIHtcbiAgICAgIGNvbnN0IGFycjogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGxoc1tpXSAvIHJocztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignTm9uIHN1cHBvcnRlZCB0eXBlIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpbml0V2l0aFNjYWxhcihvYmpGb3JEZXRlY3RUeXBlOiBhbnksIHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKGlzRmluaXRlKG9iakZvckRldGVjdFR5cGUpKSB7XG4gICAgICAvLyBudW1iZXI/XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0gZWxzZSBpZiAob2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIFZlY3RvcjIpIHtcbiAgICAgIHJldHVybiBWZWN0b3IyLmZyb21Db3B5QXJyYXkyKFt2YWwsIHZhbF0pO1xuICAgIH0gZWxzZSBpZiAob2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW3ZhbCwgdmFsLCB2YWxdKTtcbiAgICB9IGVsc2UgaWYgKG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBWZWN0b3I0KSB7XG4gICAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFt2YWwsIHZhbCwgdmFsLCB2YWxdKTtcbiAgICB9IGVsc2UgaWYgKG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBRdWF0ZXJuaW9uKSB7XG4gICAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoMCwgMCwgMCwgMSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iakZvckRldGVjdFR5cGUpKSB7XG4gICAgICBjb25zdCBhcnI6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iakZvckRldGVjdFR5cGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gdmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCdOb24gc3VwcG9ydGVkIHR5cGUhJyk7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpbml0V2l0aEZsb2F0MzJBcnJheShcbiAgICBvYmpGb3JEZXRlY3RUeXBlOiBhbnksXG4gICAgdmFsOiBhbnksXG4gICAgZmxvYXRBcnJheTogRmxvYXQzMkFycmF5LFxuICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bVxuICApIHtcbiAgICBsZXQgb2JqO1xuICAgIGlmIChpc0Zpbml0ZShvYmpGb3JEZXRlY3RUeXBlKSkge1xuICAgICAgLy8gbnVtYmVyP1xuICAgICAgY29uc3QgYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZsb2F0QXJyYXkpO1xuICAgICAgKGZsb2F0QXJyYXkgYXMgYW55KS5fdiA9IHZvaWQgMDtcbiAgICAgIGFycmF5WzBdID0gdmFsO1xuICAgICAgcmV0dXJuIG5ldyBTY2FsYXIoYXJyYXkpO1xuICAgIH0gZWxzZSBpZiAob2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIFNjYWxhciB8fCBvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgTXV0YWJsZVNjYWxhcikge1xuICAgICAgZmxvYXRBcnJheVswXSA9IHZhbC54O1xuICAgICAgb2JqID0gbmV3IE11dGFibGVTY2FsYXIoZmxvYXRBcnJheSk7XG4gICAgfSBlbHNlIGlmIChvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgVmVjdG9yMiB8fCBvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgTXV0YWJsZVZlY3RvcjIpIHtcbiAgICAgIGZsb2F0QXJyYXlbMF0gPSB2YWwueDtcbiAgICAgIGZsb2F0QXJyYXlbMV0gPSB2YWwueTtcbiAgICAgIG9iaiA9IG5ldyBNdXRhYmxlVmVjdG9yMihmbG9hdEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBWZWN0b3IzIHx8IG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNdXRhYmxlVmVjdG9yMykge1xuICAgICAgZmxvYXRBcnJheVswXSA9IHZhbC54O1xuICAgICAgZmxvYXRBcnJheVsxXSA9IHZhbC55O1xuICAgICAgZmxvYXRBcnJheVsyXSA9IHZhbC56O1xuICAgICAgb2JqID0gTXV0YWJsZVZlY3RvcjMuZnJvbUZsb2F0MzJBcnJheShmbG9hdEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBWZWN0b3I0IHx8IG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNdXRhYmxlVmVjdG9yNCkge1xuICAgICAgZmxvYXRBcnJheVswXSA9IHZhbC54O1xuICAgICAgZmxvYXRBcnJheVsxXSA9IHZhbC55O1xuICAgICAgZmxvYXRBcnJheVsyXSA9IHZhbC56O1xuICAgICAgZmxvYXRBcnJheVszXSA9IHZhbC53O1xuICAgICAgb2JqID0gbmV3IE11dGFibGVWZWN0b3I0KGZsb2F0QXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgUXVhdGVybmlvbiB8fFxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVRdWF0ZXJuaW9uXG4gICAgKSB7XG4gICAgICBmbG9hdEFycmF5WzBdID0gdmFsLng7XG4gICAgICBmbG9hdEFycmF5WzFdID0gdmFsLnk7XG4gICAgICBmbG9hdEFycmF5WzJdID0gdmFsLno7XG4gICAgICBmbG9hdEFycmF5WzNdID0gdmFsLnc7XG4gICAgICBvYmogPSBuZXcgTXV0YWJsZVF1YXRlcm5pb24oZmxvYXRBcnJheSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNYXRyaXgzMyB8fFxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVNYXRyaXgzM1xuICAgICkge1xuICAgICAgb2JqID0gb2JqID09IG51bGwgPyBuZXcgTXV0YWJsZU1hdHJpeDMzKGZsb2F0QXJyYXkpIDogb2JqO1xuICAgICAgb2JqLm0wMCA9IHZhbC5tMDA7XG4gICAgICBvYmoubTAxID0gdmFsLm0wMTtcbiAgICAgIG9iai5tMDIgPSB2YWwubTAyO1xuICAgICAgb2JqLm0xMCA9IHZhbC5tMTA7XG4gICAgICBvYmoubTExID0gdmFsLm0xMTtcbiAgICAgIG9iai5tMTIgPSB2YWwubTEyO1xuICAgICAgb2JqLm0yMCA9IHZhbC5tMjA7XG4gICAgICBvYmoubTIxID0gdmFsLm0yMTtcbiAgICAgIG9iai5tMjIgPSB2YWwubTIyO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgTWF0cml4NDQgfHxcbiAgICAgIG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNdXRhYmxlTWF0cml4NDRcbiAgICApIHtcbiAgICAgIG9iaiA9IG5ldyBNdXRhYmxlTWF0cml4NDQoZmxvYXRBcnJheSk7XG4gICAgICBvYmoubTAwID0gdmFsLm0wMDtcbiAgICAgIG9iai5tMDEgPSB2YWwubTAxO1xuICAgICAgb2JqLm0wMiA9IHZhbC5tMDI7XG4gICAgICBvYmoubTAzID0gdmFsLm0wMztcbiAgICAgIG9iai5tMTAgPSB2YWwubTEwO1xuICAgICAgb2JqLm0xMSA9IHZhbC5tMTE7XG4gICAgICBvYmoubTEyID0gdmFsLm0xMjtcbiAgICAgIG9iai5tMTMgPSB2YWwubTEzO1xuICAgICAgb2JqLm0yMCA9IHZhbC5tMjA7XG4gICAgICBvYmoubTIxID0gdmFsLm0yMTtcbiAgICAgIG9iai5tMjIgPSB2YWwubTIyO1xuICAgICAgb2JqLm0yMyA9IHZhbC5tMjM7XG4gICAgICBvYmoubTMwID0gdmFsLm0zMDtcbiAgICAgIG9iai5tMzEgPSB2YWwubTMxO1xuICAgICAgb2JqLm0zMiA9IHZhbC5tMzI7XG4gICAgICBvYmoubTMzID0gdmFsLm0zMztcbiAgICB9IGVsc2UgaWYgKG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBWZWN0b3JOKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5fdi5sZW5ndGg7IGkrKykge1xuICAgICAgICBmbG9hdEFycmF5W2ldID0gdmFsLl92W2ldO1xuICAgICAgfVxuICAgICAgb2JqID0gbmV3IFZlY3Rvck4oZmxvYXRBcnJheSk7XG4gICAgfSBlbHNlIGlmIChvYmpGb3JEZXRlY3RUeXBlID09IG51bGwpIHtcbiAgICAgIGxldCB2ZWM7XG4gICAgICBzd2l0Y2ggKGZsb2F0QXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICB2ZWMgPSBWZWN0b3I0LmZyb21Db3B5RmxvYXQzMkFycmF5KGZsb2F0QXJyYXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgdmVjID0gVmVjdG9yMy5mcm9tQ29weUZsb2F0MzJBcnJheShmbG9hdEFycmF5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHZlYyA9IG5ldyBWZWN0b3IyKGZsb2F0QXJyYXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdmVjID0gbmV3IFNjYWxhcihmbG9hdEFycmF5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIChmbG9hdEFycmF5IGFzIGFueSkuX3YgPSB2b2lkIDA7XG4gICAgICByZXR1cm4gdmVjO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBBcnJheS5pc0FycmF5KG9iakZvckRldGVjdFR5cGUpIHx8XG4gICAgICBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqRm9yRGV0ZWN0VHlwZSkgfHxcbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhvYmpGb3JEZXRlY3RUeXBlLl92KVxuICAgICkge1xuICAgICAgcmV0dXJuIG9iakZvckRldGVjdFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignTm9uIHN1cHBvcnRlZCB0eXBlIScpO1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgKGZsb2F0QXJyYXkgYXMgYW55KS5fdiA9IHZvaWQgMDtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBzdGF0aWMgX3NldEZvcmNlKG9iakZvckRldGVjdFR5cGU6IGFueSwgdmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVWZWN0b3I0IHx8IG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBWZWN0b3I0KSB7XG4gICAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZS5pc0VxdWFsKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlswXSA9IHZhbC5fdlswXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMV0gPSB2YWwuX3ZbMV07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzJdID0gdmFsLl92WzJdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlszXSA9IHZhbC5fdlszXTtcbiAgICB9IGVsc2UgaWYgKG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNdXRhYmxlVmVjdG9yMiB8fCBvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgVmVjdG9yMikge1xuICAgICAgaWYgKG9iakZvckRldGVjdFR5cGUuaXNFcXVhbCh2YWwpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMF0gPSB2YWwuX3ZbMF07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzFdID0gdmFsLl92WzFdO1xuICAgIH0gZWxzZSBpZiAob2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVWZWN0b3IzIHx8IG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBWZWN0b3IzKSB7XG4gICAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZS5pc0VxdWFsKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlswXSA9IHZhbC5fdlswXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMV0gPSB2YWwuX3ZbMV07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzJdID0gdmFsLl92WzJdO1xuICAgIH0gZWxzZSBpZiAob2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVTY2FsYXIgfHwgb2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIFNjYWxhcikge1xuICAgICAgaWYgKHR5cGVvZiB2YWwuX3YgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChvYmpGb3JEZXRlY3RUeXBlLl92WzBdID09IHZhbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzBdID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9iakZvckRldGVjdFR5cGUuX3ZbMF0gPT0gdmFsLl92WzBdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMF0gPSB2YWwuX3ZbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNdXRhYmxlTWF0cml4MzMgfHxcbiAgICAgIG9iakZvckRldGVjdFR5cGUgaW5zdGFuY2VvZiBNYXRyaXgzM1xuICAgICkge1xuICAgICAgaWYgKG9iakZvckRldGVjdFR5cGUuaXNFcXVhbCh2YWwpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMF0gPSB2YWwuX3ZbMF07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzFdID0gdmFsLl92WzFdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlsyXSA9IHZhbC5fdlsyXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbM10gPSB2YWwuX3ZbM107XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzRdID0gdmFsLl92WzRdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdls1XSA9IHZhbC5fdls1XTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbNl0gPSB2YWwuX3ZbNl07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzddID0gdmFsLl92WzddO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdls4XSA9IHZhbC5fdls4XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVNYXRyaXg0NCB8fFxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE1hdHJpeDQ0XG4gICAgKSB7XG4gICAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZS5pc0VxdWFsKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlswXSA9IHZhbC5fdlswXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMV0gPSB2YWwuX3ZbMV07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzJdID0gdmFsLl92WzJdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlszXSA9IHZhbC5fdlszXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbNF0gPSB2YWwuX3ZbNF07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzVdID0gdmFsLl92WzVdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdls2XSA9IHZhbC5fdls2XTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbN10gPSB2YWwuX3ZbN107XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzhdID0gdmFsLl92WzhdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdls5XSA9IHZhbC5fdls5XTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMTBdID0gdmFsLl92WzEwXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMTFdID0gdmFsLl92WzExXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMTJdID0gdmFsLl92WzEyXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMTNdID0gdmFsLl92WzEzXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMTRdID0gdmFsLl92WzE0XTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMTVdID0gdmFsLl92WzE1XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgb2JqRm9yRGV0ZWN0VHlwZSBpbnN0YW5jZW9mIE11dGFibGVRdWF0ZXJuaW9uIHx8XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgUXVhdGVybmlvblxuICAgICkge1xuICAgICAgaWYgKG9iakZvckRldGVjdFR5cGUuaXNFcXVhbCh2YWwpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbMF0gPSB2YWwuX3ZbMF07XG4gICAgICBvYmpGb3JEZXRlY3RUeXBlLl92WzFdID0gdmFsLl92WzFdO1xuICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdlsyXSA9IHZhbC5fdlsyXTtcbiAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbM10gPSB2YWwuX3ZbM107XG4gICAgfSBlbHNlIGlmIChvYmpGb3JEZXRlY3RUeXBlIGluc3RhbmNlb2YgVmVjdG9yTikge1xuICAgICAgbGV0IHZhbEFycmF5OiBUeXBlZEFycmF5O1xuICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFZlY3Rvck4pIHtcbiAgICAgICAgdmFsQXJyYXkgPSB2YWwuX3Y7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxBcnJheSA9IHZhbDtcbiAgICAgIH1cbiAgICAgIGxldCBpc1NhbWUgPSB0cnVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZS5fdltpXSAhPT0gdmFsQXJyYXlbaV0pIHtcbiAgICAgICAgICBpc1NhbWUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbaV0gPSB2YWxBcnJheVtpXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqRm9yRGV0ZWN0VHlwZSkpIHtcbiAgICAgIGxldCBpc1NhbWUgPSB0cnVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpGb3JEZXRlY3RUeXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChvYmpGb3JEZXRlY3RUeXBlW2ldICE9PSB2YWwuX3ZbaV0pIHtcbiAgICAgICAgICBpc1NhbWUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iakZvckRldGVjdFR5cGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb2JqRm9yRGV0ZWN0VHlwZVtpXSA9IHZhbC5fdltpXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc05hTihvYmpGb3JEZXRlY3RUeXBlLl92Lmxlbmd0aCkpIHtcbiAgICAgIGxldCBpc1NhbWUgPSB0cnVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpGb3JEZXRlY3RUeXBlLl92Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZS5fdltpXSAhPT0gdmFsW2ldKSB7XG4gICAgICAgICAgICBpc1NhbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAob2JqRm9yRGV0ZWN0VHlwZS5fdltpXSAhPT0gdmFsLl92W2ldKSB7XG4gICAgICAgICAgICBpc1NhbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iakZvckRldGVjdFR5cGUuX3YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgIG9iakZvckRldGVjdFR5cGUuX3ZbaV0gPSB2YWxbaV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqRm9yRGV0ZWN0VHlwZS5fdltpXSA9IHZhbC5fdltpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIud2FybignVW5rbm93biB0eXBlIF9zZXRGb3JjZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNdXRhYmxlTWF0cml4MzMgfSBmcm9tICcuL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4vTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgQ291bnQsIFNpemUgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5cbmZ1bmN0aW9uIHJhZGlhblRvRGVncmVlKHJhZDogbnVtYmVyKSB7XG4gIHJldHVybiAocmFkICogMTgwKSAvIE1hdGguUEk7XG59XG5cbmZ1bmN0aW9uIGRlZ3JlZVRvUmFkaWFuKGRlZzogbnVtYmVyKSB7XG4gIHJldHVybiAoZGVnICogTWF0aC5QSSkgLyAxODA7XG59XG5cbi8vIGh0dHBzOi8vZ2FtZWRldi5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTczMjYvY29udmVyc2lvbi1vZi1hLW51bWJlci1mcm9tLXNpbmdsZS1wcmVjaXNpb24tZmxvYXRpbmctcG9pbnQtcmVwcmVzZW50YXRpb24tdG8tYS8xNzQxMCMxNzQxMFxuY29uc3QgdG9IYWxmRmxvYXQgPSAoKSA9PiB7XG4gIC8qIFRoaXMgbWV0aG9kIGlzIGZhc3RlciB0aGFuIHRoZSBPcGVuRVhSIGltcGxlbWVudGF0aW9uICh2ZXJ5IG9mdGVuXG4gICAqIHVzZWQsIGVnLiBpbiBPZ3JlKSwgd2l0aCB0aGUgYWRkaXRpb25hbCBiZW5lZml0IG9mIHJvdW5kaW5nLCBpbnNwaXJlZFxuICAgKiBieSBKYW1lcyBUdXJzYT9zIGhhbGYtcHJlY2lzaW9uIGNvZGUuICovXG4gIHJldHVybiBmdW5jdGlvbiB0b0hhbGYodmFsOiBudW1iZXIpIHtcbiAgICBjb25zdCBmbG9hdFZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KDEpO1xuICAgIGNvbnN0IGludDMyVmlldyA9IG5ldyBJbnQzMkFycmF5KGZsb2F0Vmlldy5idWZmZXIpO1xuICAgIGZsb2F0Vmlld1swXSA9IHZhbDtcbiAgICBjb25zdCB4ID0gaW50MzJWaWV3WzBdO1xuXG4gICAgbGV0IGJpdHMgPSAoeCA+PiAxNikgJiAweDgwMDA7IC8qIEdldCB0aGUgc2lnbiAqL1xuICAgIGxldCBtID0gKHggPj4gMTIpICYgMHgwN2ZmOyAvKiBLZWVwIG9uZSBleHRyYSBiaXQgZm9yIHJvdW5kaW5nICovXG4gICAgY29uc3QgZSA9ICh4ID4+IDIzKSAmIDB4ZmY7IC8qIFVzaW5nIGludCBpcyBmYXN0ZXIgaGVyZSAqL1xuXG4gICAgLyogSWYgemVybywgb3IgZGVub3JtYWwsIG9yIGV4cG9uZW50IHVuZGVyZmxvd3MgdG9vIG11Y2ggZm9yIGEgZGVub3JtYWxcbiAgICAgKiBoYWxmLCByZXR1cm4gc2lnbmVkIHplcm8uICovXG4gICAgaWYgKGUgPCAxMDMpIHtcbiAgICAgIHJldHVybiBiaXRzO1xuICAgIH1cblxuICAgIC8qIElmIE5hTiwgcmV0dXJuIE5hTi4gSWYgSW5mIG9yIGV4cG9uZW50IG92ZXJmbG93LCByZXR1cm4gSW5mLiAqL1xuICAgIGlmIChlID4gMTQyKSB7XG4gICAgICBiaXRzIHw9IDB4N2MwMDtcbiAgICAgIC8qIElmIGV4cG9uZW50IHdhcyAweGZmIGFuZCBvbmUgbWFudGlzc2EgYml0IHdhcyBzZXQsIGl0IG1lYW5zIE5hTixcbiAgICAgICAqIG5vdCBJbmYsIHNvIG1ha2Ugc3VyZSB3ZSBzZXQgb25lIG1hbnRpc3NhIGJpdCB0b28uICovXG4gICAgICBiaXRzIHw9IChlID09IDI1NSA/IDAgOiAxKSAmJiB4ICYgMHgwMDdmZmZmZjtcbiAgICAgIHJldHVybiBiaXRzO1xuICAgIH1cblxuICAgIC8qIElmIGV4cG9uZW50IHVuZGVyZmxvd3MgYnV0IG5vdCB0b28gbXVjaCwgcmV0dXJuIGEgZGVub3JtYWwgKi9cbiAgICBpZiAoZSA8IDExMykge1xuICAgICAgbSB8PSAweDA4MDA7XG4gICAgICAvKiBFeHRyYSByb3VuZGluZyBtYXkgb3ZlcmZsb3cgYW5kIHNldCBtYW50aXNzYSB0byAwIGFuZCBleHBvbmVudFxuICAgICAgICogdG8gMSwgd2hpY2ggaXMgT0suICovXG4gICAgICBiaXRzIHw9IChtID4+ICgxMTQgLSBlKSkgKyAoKG0gPj4gKDExMyAtIGUpKSAmIDEpO1xuICAgICAgcmV0dXJuIGJpdHM7XG4gICAgfVxuXG4gICAgYml0cyB8PSAoKGUgLSAxMTIpIDw8IDEwKSB8IChtID4+IDEpO1xuICAgIC8qIEV4dHJhIHJvdW5kaW5nLiBBbiBvdmVyZmxvdyB3aWxsIHNldCBtYW50aXNzYSB0byAwIGFuZCBpbmNyZW1lbnRcbiAgICAgKiB0aGUgZXhwb25lbnQsIHdoaWNoIGlzIE9LLiAqL1xuICAgIGJpdHMgKz0gbSAmIDE7XG4gICAgcmV0dXJuIGJpdHM7XG4gIH07XG59O1xuXG4vKipcbiAqIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoaXMgdGV4dHVyZSBzaXplIGlzIHBvd2VyIG9mIHR3by5cbiAqXG4gKiBAcGFyYW0geCB0ZXh0dXJlIHNpemUuXG4gKiBAcmV0dXJucyBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc2l6ZSB4IGlzIHBvd2VyIG9mIHR3by5cbiAqL1xuZnVuY3Rpb24gaXNQb3dlck9mVHdvKHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKHggJiAoeCAtIDEpKSA9PSAwO1xufVxuXG5mdW5jdGlvbiBpc1Bvd2VyT2ZUd29UZXh0dXJlKHdpZHRoOiBTaXplLCBoZWlnaHQ6IFNpemUpIHtcbiAgcmV0dXJuIGlzUG93ZXJPZlR3byh3aWR0aCkgJiYgaXNQb3dlck9mVHdvKGhlaWdodCk7XG59XG5cbi8vIHZhbHVlcyByYW5nZSBtdXN0IGJlIFstMSwgMV1cbmZ1bmN0aW9uIHBhY2tOb3JtYWxpemVkVmVjNFRvVmVjMih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIsIGNyaXRlcmlhOiBudW1iZXIpIHtcbiAgLy8gcmFuZ2UgdG8gWzAsIHMxXVxuICB4ID0gKHggKyAxKSAvIDIuMDtcbiAgeSA9ICh5ICsgMSkgLyAyLjA7XG4gIHogPSAoeiArIDEpIC8gMi4wO1xuICB3ID0gKHcgKyAxKSAvIDIuMDtcblxuICBjb25zdCBpciA9IE1hdGguZmxvb3IoeCAqIChjcml0ZXJpYSAtIDEuMCkpO1xuICBjb25zdCBpZyA9IE1hdGguZmxvb3IoeSAqIChjcml0ZXJpYSAtIDEuMCkpO1xuICBjb25zdCBpcmcgPSBpciAqIGNyaXRlcmlhICsgaWc7XG4gIGNvbnN0IHYwID0gaXJnIC8gY3JpdGVyaWE7XG5cbiAgY29uc3QgaWIgPSBNYXRoLmZsb29yKHogKiAoY3JpdGVyaWEgLSAxLjApKTtcbiAgY29uc3QgaWEgPSBNYXRoLmZsb29yKHcgKiAoY3JpdGVyaWEgLSAxLjApKTtcbiAgY29uc3QgaWJhID0gaWIgKiBjcml0ZXJpYSArIGlhO1xuICBjb25zdCB2MSA9IGliYSAvIGNyaXRlcmlhO1xuICByZXR1cm4gW3YwLCB2MV07XG59XG5cbmZ1bmN0aW9uIGVyZih4OiBudW1iZXIpIHtcbiAgLy8gU2F2ZSB0aGUgc2lnbiBvZiB4XG4gIGxldCBzaWduID0gMTtcbiAgaWYgKHggPCAwKSBzaWduID0gLTE7XG4gIHggPSBNYXRoLmFicyh4KTtcblxuICAvLyBBJlMgZm9ybXVsYSA3LjEuMjZcbiAgY29uc3QgdDogbnVtYmVyID0gMSAvICgxICsgMC4zMjc1OTExICogeCk7XG4gIGNvbnN0IHk6IG51bWJlciA9XG4gICAgMSAtXG4gICAgKCgoKDEuMDYxNDA1NDI5ICogdCArIC0xLjQ1MzE1MjAyNykgKiB0ICsgMS40MjE0MTM3NDEpICogdCArIC0wLjI4NDQ5NjczNikgKiB0ICsgMC4yNTQ4Mjk1OTIpICpcbiAgICAgIHQgKlxuICAgICAgTWF0aC5leHAoLXggKiB4KTtcblxuICByZXR1cm4gc2lnbiAqIHk7XG59XG5cbmZ1bmN0aW9uIGludkVyZih4OiBudW1iZXIpIHtcbiAgbGV0IHc6IG51bWJlcixcbiAgICBwID0gMDtcbiAgdyA9IC1NYXRoLmxvZygoMS4wIC0geCkgKiAoMS4wICsgeCkpO1xuICBpZiAodyA8IDUuMCkge1xuICAgIHcgPSB3IC0gMi41O1xuICAgIHAgPSAyLjgxMDIyNjM2ZS04O1xuICAgIHAgPSAzLjQzMjczOTM5ZS03ICsgcCAqIHc7XG4gICAgcCA9IC0zLjUyMzM4NzdlLTYgKyBwICogdztcbiAgICBwID0gLTQuMzkxNTA2NTRlLTYgKyBwICogdztcbiAgICBwID0gMC4wMDAyMTg1ODA4NyArIHAgKiB3O1xuICAgIHAgPSAtMC4wMDEyNTM3MjUwMyArIHAgKiB3O1xuICAgIHAgPSAtMC4wMDQxNzc2ODE2NCArIHAgKiB3O1xuICAgIHAgPSAwLjI0NjY0MDcyNyArIHAgKiB3O1xuICAgIHAgPSAxLjUwMTQwOTQxICsgcCAqIHc7XG4gIH0gZWxzZSB7XG4gICAgdyA9IE1hdGguc3FydCh3KSAtIDM7XG4gICAgcCA9IC0wLjAwMDIwMDIxNDI1NztcbiAgICBwID0gMC4wMDAxMDA5NTA1NTggKyBwICogdztcbiAgICBwID0gMC4wMDEzNDkzNDMyMiArIHAgKiB3O1xuICAgIHAgPSAtMC4wMDM2NzM0Mjg0NCArIHAgKiB3O1xuICAgIHAgPSAwLjAwNTczOTUwNzczICsgcCAqIHc7XG4gICAgcCA9IC0wLjAwNzYyMjQ2MTMgKyBwICogdztcbiAgICBwID0gMC4wMDk0Mzg4NzA0NyArIHAgKiB3O1xuICAgIHAgPSAxLjAwMTY3NDA2ICsgcCAqIHc7XG4gICAgcCA9IDIuODMyOTc2ODIgKyBwICogdztcbiAgfVxuICByZXR1cm4gcCAqIHg7XG59XG5cbmZ1bmN0aW9uIGdhdXNzaWFuQ2RmKHg6IG51bWJlciwgbXU6IG51bWJlciwgc2lnbWE6IG51bWJlcikge1xuICBjb25zdCBVOiBudW1iZXIgPSAwLjUgKiAoMSArIGVyZigoeCAtIG11KSAvIChzaWdtYSAqIE1hdGguc3FydCgyLjApKSkpO1xuICByZXR1cm4gVTtcbn1cblxuZnVuY3Rpb24gaW52R2F1c3NpYW5DZGYoVTogbnVtYmVyLCBtdTogbnVtYmVyLCBzaWdtYTogbnVtYmVyKSB7XG4gIGNvbnN0IHg6IG51bWJlciA9IHNpZ21hICogTWF0aC5zcXJ0KDIuMCkgKiBpbnZFcmYoMi4wICogVSAtIDEpICsgbXU7XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRWlnZW5WYWx1ZXNBbmRWZWN0b3JzKEE6IE11dGFibGVNYXRyaXgzMywgUTogTXV0YWJsZU1hdHJpeDMzLCB3OiBNdXRhYmxlVmVjdG9yMykge1xuICBjb25zdCBuID0gMztcbiAgbGV0IHNkID0gMDtcbiAgbGV0IHNvID0gMDsgLy8gU3VtcyBvZiBkaWFnb25hbCByZXNwLiBvZmYtZGlhZ29uYWwgZWxlbWVudHNcbiAgbGV0IHMgPSAwO1xuICBsZXQgYyA9IDA7XG4gIGxldCB0ID0gMDsgLy8gc2luKHBoaSksIGNvcyhwaGkpLCB0YW4ocGhpKSBhbmQgdGVtcG9yYXJ5IHN0b3JhZ2VcbiAgbGV0IGcgPSAwO1xuICBsZXQgaCA9IDA7XG4gIGxldCB6ID0gMDtcbiAgbGV0IHRoZXRhID0gMDsgLy8gTW9yZSB0ZW1wb3Jhcnkgc3RvcmFnZVxuICBsZXQgdGhyZXNoID0gMDtcblxuICAvLyBJbml0aWFsaXplIFEgdG8gdGhlIGlkZW50aXRpdHkgbWF0cml4XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgUS5zZXRBdChpLCBpLCAxLjApO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKSB7XG4gICAgICBRLnNldEF0KGksIGosIDAuMCk7XG4gICAgICBRLnNldEF0KGosIGksIDAuMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB3IHRvIGRpYWcoQSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHcuc2V0QXQoaSwgQS5hdChpLCBpKSk7XG5cbiAgLy8gQ2FsY3VsYXRlIFNRUih0cihBKSlcbiAgc2QgPSAwLjA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBzZCArPSBNYXRoLmFicyh3LmF0KGkpKTtcbiAgc2QgPSBzZCAqIHNkO1xuXG4gIC8vIE1haW4gaXRlcmF0aW9uIGxvb3BcbiAgZm9yIChsZXQgbkl0ZXIgPSAwOyBuSXRlciA8IDUwOyBuSXRlcisrKSB7XG4gICAgLy8gVGVzdCBmb3IgY29udmVyZ2VuY2VcbiAgICBzbyA9IDAuMDtcbiAgICBmb3IgKGxldCBwID0gMDsgcCA8IG47IHArKykge1xuICAgICAgZm9yIChsZXQgcSA9IHAgKyAxOyBxIDwgbjsgcSsrKSBzbyArPSBNYXRoLmFicyhBLmF0KHAsIHEpKTtcbiAgICB9XG4gICAgaWYgKHNvID09IDAuMCkgcmV0dXJuIDA7XG5cbiAgICBpZiAobkl0ZXIgPCA0KSB0aHJlc2ggPSAoMC4yICogc28pIC8gKG4gKiBuKTtcbiAgICBlbHNlIHRocmVzaCA9IDAuMDtcblxuICAgIC8vIERvIHN3ZWVwXG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCBuOyBwKyspIHtcbiAgICAgIGZvciAobGV0IHEgPSBwICsgMTsgcSA8IG47IHErKykge1xuICAgICAgICBnID0gMTAwLjAgKiBNYXRoLmFicyhBLmF0KHAsIHEpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5JdGVyID4gNCAmJlxuICAgICAgICAgIE1hdGguYWJzKHcuYXQocCkpICsgZyA9PSBNYXRoLmFicyh3LmF0KHApKSAmJlxuICAgICAgICAgIE1hdGguYWJzKHcuYXQocSkpICsgZyA9PSBNYXRoLmFicyh3LmF0KHEpKVxuICAgICAgICApIHtcbiAgICAgICAgICBBLnNldEF0KHAsIHEsIDAuMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoQS5hdChwLCBxKSkgPiB0aHJlc2gpIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgSmFjb2JpIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgICAgaCA9IHcuYXQocSkgLSB3LmF0KHApO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhoKSArIGcgPT0gTWF0aC5hYnMoaCkpIHtcbiAgICAgICAgICAgIHQgPSBBLmF0KHAsIHEpIC8gaDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhldGEgPSAoMC41ICogaCkgLyBBLmF0KHAsIHEpO1xuICAgICAgICAgICAgaWYgKHRoZXRhIDwgMC4wKSB0ID0gLTEuMCAvIChNYXRoLnNxcnQoMS4wICsgdGhldGEgKiB0aGV0YSkgLSB0aGV0YSk7XG4gICAgICAgICAgICBlbHNlIHQgPSAxLjAgLyAoTWF0aC5zcXJ0KDEuMCArIHRoZXRhICogdGhldGEpICsgdGhldGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjID0gMS4wIC8gTWF0aC5zcXJ0KDEuMCArIHQgKiB0KTtcbiAgICAgICAgICBzID0gdCAqIGM7XG4gICAgICAgICAgeiA9IHQgKiBBLmF0KHAsIHEpO1xuXG4gICAgICAgICAgLy8gQXBwbHkgSmFjb2JpIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgICAgQS5zZXRBdChwLCBxLCAwLjApO1xuICAgICAgICAgIHcuc2V0QXQocCwgdy5hdChwKSAtIHopO1xuICAgICAgICAgIHcuc2V0QXQocSwgdy5hdChxKSArIHopO1xuICAgICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgcDsgcisrKSB7XG4gICAgICAgICAgICB0ID0gQS5hdChyLCBwKTtcbiAgICAgICAgICAgIEEuc2V0QXQociwgcCwgYyAqIHQgLSBzICogQS5hdChyLCBxKSk7XG4gICAgICAgICAgICBBLnNldEF0KHIsIHEsIHMgKiB0ICsgYyAqIEEuYXQociwgcSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCByID0gcCArIDE7IHIgPCBxOyByKyspIHtcbiAgICAgICAgICAgIHQgPSBBLmF0KHAsIHIpO1xuICAgICAgICAgICAgQS5zZXRBdChwLCByLCBjICogdCAtIHMgKiBBLmF0KHIsIHEpKTtcbiAgICAgICAgICAgIEEuc2V0QXQociwgcSwgcyAqIHQgKyBjICogQS5hdChyLCBxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IHIgPSBxICsgMTsgciA8IG47IHIrKykge1xuICAgICAgICAgICAgdCA9IEEuYXQocCwgcik7XG4gICAgICAgICAgICBBLnNldEF0KHAsIHIsIGMgKiB0IC0gcyAqIEEuYXQocSwgcikpO1xuICAgICAgICAgICAgQS5zZXRBdChxLCByLCBzICogdCArIGMgKiBBLmF0KHEsIHIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZWlnZW52ZWN0b3JzXG4gICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBuOyByKyspIHtcbiAgICAgICAgICAgIHQgPSBRLmF0KHIsIHApO1xuICAgICAgICAgICAgUS5zZXRBdChyLCBwLCBjICogdCAtIHMgKiBRLmF0KHIsIHEpKTtcbiAgICAgICAgICAgIFEuc2V0QXQociwgcSwgcyAqIHQgKyBjICogUS5hdChyLCBxKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRvU3RyaW5nQXNHTFNMRmxvYXQodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHJldHVybiBgJHt2YWx1ZX0uMGA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnICsgdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbmVhclplcm9Ub1plcm8odmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChNYXRoLmFicyh2YWx1ZSkgPCAwLjAwMDAxKSB7XG4gICAgdmFsdWUgPSAwO1xuICB9IGVsc2UgaWYgKDAuOTk5OTkgPCB2YWx1ZSAmJiB2YWx1ZSA8IDEuMDAwMDEpIHtcbiAgICB2YWx1ZSA9IDE7XG4gIH0gZWxzZSBpZiAoLTEuMDAwMDEgPCB2YWx1ZSAmJiB2YWx1ZSA8IC0wLjk5OTk5KSB7XG4gICAgdmFsdWUgPSAtMTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGZpbmFuY2lhbCh2YWw6IG51bWJlciB8IHN0cmluZykge1xuICBjb25zdCBmaXhlZFN0ciA9IE51bWJlci5wYXJzZUZsb2F0KHZhbCBhcyBzdHJpbmcpLnRvRml4ZWQoNyk7XG4gIGlmICh2YWwgYXMgbnVtYmVyID49IDApIHtcbiAgICByZXR1cm4gJyAnICsgZml4ZWRTdHI7XG4gIH1cbiAgcmV0dXJuIGZpeGVkU3RyO1xufVxuXG5mdW5jdGlvbiByb3VuZEFzRmxvYXQodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogMTAwMDAwMDApIC8gMTAwMDAwMDA7XG59XG5cbmZ1bmN0aW9uIGxlcnAoYTogbnVtYmVyLCBiOiBudW1iZXIsIHQ6IG51bWJlcikge1xuICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHJhdGlvIG9mIGEgZGlzY3JldGUgR2F1c3NpYW4gZGlzdHJpYnV0aW9uLlxuICogVGhlIHNhbXBsaW5nIHBvaW50cyBhcmUgb25lIGF3YXkgZnJvbSBlYWNoIG90aGVyLiBUaGUgc3VtIG9mIHRoZSByYXRpb3MgaXMgMS5cbiAqIEBrZXJuZWxTaXplIG51bWJlciBvZiBzYW1wbGluZyBwb2ludHNcbiAqIEB2YXJpYW5jZSB2YXJpYW5jZSBvZiB0aGUgR2F1c3NpYW4gZGlzdHJpYnV0aW9uXG4gKiBAbWVhbiBtZWFuIG9mIHRoZSBHYXVzc2lhbiBkaXN0cmlidXRpb25cbiAqIGUuZy4ga2VybmVsU2l6ZSA9IDIgKG1lYW49MCkgPT4gdGhlIHNhbXBsaW5nIHBvaW50cyBhcmUgLTAuNSBhbmQgMC41XG4gKiBlLmcuIGtlcm5lbFNpemUgPSAzIChtZWFuPTEpID0+IHRoZSBzYW1wbGluZyBwb2ludHMgYXJlIDAuMCwgMS4wIGFuZCAyLjBcbiAqIEBlZmZlY3RpdmVEaWdpdCBlZmZlY3RpdmVEaWdpdCBvZiB2YWx1ZXMgaW4gcmV0dXJuIGFycmF5XG4gKiBAcmV0dXJucyBhcnJheSBvZiB0aGUgR2F1c3NpYW4gZGlzdHJpYnV0aW9uIHdoZXJlIHRoZSBzdW0gb2YgdGhlIGVsZW1lbnRzIGlzIDFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lKHtcbiAga2VybmVsU2l6ZSxcbiAgdmFyaWFuY2UsXG4gIG1lYW4gPSAwLFxuICBlZmZlY3RpdmVEaWdpdCA9IDQsXG59OiB7XG4gIGtlcm5lbFNpemU6IENvdW50O1xuICB2YXJpYW5jZTogbnVtYmVyO1xuICBtZWFuPzogbnVtYmVyO1xuICBlZmZlY3RpdmVEaWdpdD86IENvdW50O1xufSk6IG51bWJlcltdIHtcbiAgY29uc3QgY2VpbGVkSGFsZktlcm5lbFNpemUgPSBNYXRoLmNlaWwoa2VybmVsU2l6ZSAvIDIuMCk7XG4gIGNvbnN0IGdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW86IG51bWJlcltdID0gbmV3IEFycmF5KGNlaWxlZEhhbGZLZXJuZWxTaXplKTtcbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgLy8gYWJvdmUgbWVhbiBzaWRlIGFuZCBjZW50ZXJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWlsZWRIYWxmS2VybmVsU2l6ZTsgaSsrKSB7XG4gICAgZ2F1c3NpYW5EaXN0cmlidXRpb25SYXRpb1tpXSA9IE1hdGguZXhwKC0oKGkgLSBtZWFuKSAqKiAyKSAvICgyLjAgKiB2YXJpYW5jZSkpO1xuXG4gICAgdG90YWxTaXplICs9IGdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9baV07XG4gIH1cblxuICAvLyBiZWxvdyBtZWFuIHNpZGVcbiAgdG90YWxTaXplICo9IDI7XG5cbiAgLy8gaWYgYSBjZW50ZXIgZXhpc3RzXG4gIGlmICgoa2VybmVsU2l6ZSAvIDIuMCkgJSAyICE9PSAwLjApIHtcbiAgICB0b3RhbFNpemUgLT0gZ2F1c3NpYW5EaXN0cmlidXRpb25SYXRpb1swXTtcbiAgfVxuXG4gIGNvbnN0IGdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lID0gbmV3IEFycmF5KGtlcm5lbFNpemUpO1xuICBsZXQgdG90YWxSYXRpbyA9IDA7XG4gIGNvbnN0IGNoYW5nZURpZ2l0UGFyYW0gPSBNYXRoLnBvdygxMCwgZWZmZWN0aXZlRGlnaXQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VpbGVkSGFsZktlcm5lbFNpemUgLSAxOyBpKyspIHtcbiAgICBsZXQgcmF0aW8gPSBnYXVzc2lhbkRpc3RyaWJ1dGlvblJhdGlvW2NlaWxlZEhhbGZLZXJuZWxTaXplIC0gMSAtIGldIC8gdG90YWxTaXplO1xuXG4gICAgcmF0aW8gKj0gY2hhbmdlRGlnaXRQYXJhbTtcbiAgICByYXRpbyA9IE1hdGgucm91bmQocmF0aW8pO1xuICAgIHJhdGlvIC89IGNoYW5nZURpZ2l0UGFyYW07XG5cbiAgICBnYXVzc2lhbkRpc3RyaWJ1dGlvblJhdGlvV2hvc2VTdW1Jc09uZVtpXSA9IHJhdGlvO1xuICAgIGdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lW2tlcm5lbFNpemUgLSAxIC0gaV0gPSByYXRpbztcblxuICAgIHRvdGFsUmF0aW8gKz0gMiAqIHJhdGlvO1xuICB9XG5cbiAgaWYgKGtlcm5lbFNpemUgJSAyID09PSAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSAoMSAtIHRvdGFsUmF0aW8pIC8gMi4wO1xuICAgIGdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lW2NlaWxlZEhhbGZLZXJuZWxTaXplIC0gMV0gPSB2YWx1ZTtcbiAgICBnYXVzc2lhbkRpc3RyaWJ1dGlvblJhdGlvV2hvc2VTdW1Jc09uZVtjZWlsZWRIYWxmS2VybmVsU2l6ZV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB2YWx1ZSA9IDEgLSB0b3RhbFJhdGlvO1xuICAgIGdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lW2NlaWxlZEhhbGZLZXJuZWxTaXplIC0gMV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBnYXVzc2lhbkRpc3RyaWJ1dGlvblJhdGlvV2hvc2VTdW1Jc09uZTtcbn1cblxuZXhwb3J0IGNvbnN0IE1hdGhVdGlsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIHJhZGlhblRvRGVncmVlLFxuICBkZWdyZWVUb1JhZGlhbixcbiAgdG9IYWxmRmxvYXQsXG4gIGlzUG93ZXJPZlR3byxcbiAgaXNQb3dlck9mVHdvVGV4dHVyZSxcbiAgcGFja05vcm1hbGl6ZWRWZWM0VG9WZWMyLFxuICBjb252ZXJ0VG9TdHJpbmdBc0dMU0xGbG9hdCxcbiAgbmVhclplcm9Ub1plcm8sXG4gIGdhdXNzaWFuQ2RmLFxuICBpbnZHYXVzc2lhbkNkZixcbiAgY29tcHV0ZUVpZ2VuVmFsdWVzQW5kVmVjdG9ycyxcbiAgY29tcHV0ZUdhdXNzaWFuRGlzdHJpYnV0aW9uUmF0aW9XaG9zZVN1bUlzT25lLFxuICByb3VuZEFzRmxvYXQsXG4gIGZpbmFuY2lhbCxcbiAgbGVycCxcbn0pO1xuIiwiLyogZXNsaW50LWRpc2FibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cbmltcG9ydCB7IE1hdHJpeDMzIH0gZnJvbSAnLi9NYXRyaXgzMyc7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4vTWF0cml4NDQnO1xuaW1wb3J0IHsgSU1hdHJpeCwgSU1hdHJpeDIyIH0gZnJvbSAnLi9JTWF0cml4JztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi9WZWN0b3IyJztcbmltcG9ydCB7IE11dGFibGVNYXRyaXgyMiB9IGZyb20gJy4vTXV0YWJsZU1hdHJpeDIyJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi9NYXRoVXRpbCc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMiB9IGZyb20gJy4vTXV0YWJsZVZlY3RvcjInO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRyaXggfSBmcm9tICcuL0Fic3RyYWN0TWF0cml4JztcbmltcG9ydCB7IEFycmF5NCB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIE1hdHJpeDIyIGV4dGVuZHMgQWJzdHJhY3RNYXRyaXggaW1wbGVtZW50cyBJTWF0cml4MjIge1xuICBjb25zdHJ1Y3RvcihtOiBGbG9hdDMyQXJyYXkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3YgPSBtO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAxKCkge1xuICAgIHJldHVybiB0aGlzLl92WzJdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMTEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbM107XG4gIH1cblxuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnTWF0cml4MjInO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb3NpdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5NYXQyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB6ZXJvIG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIE1hdHJpeDIyLmZyb21Db3B5NFJvd01ham9yKDAsIDAsIDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpZGVudGl0eSBtYXRyaXhcbiAgICovXG4gIHN0YXRpYyBpZGVudGl0eSgpIHtcbiAgICByZXR1cm4gTWF0cml4MjIuZnJvbUNvcHk0Um93TWFqb3IoMSwgMCwgMCwgMSk7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyBGbG9hdDMyQXJyYXkoMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0cmFuc3Bvc2UgbWF0cml4XG4gICAqL1xuICBzdGF0aWMgdHJhbnNwb3NlKG1hdDogTWF0cml4MjIpIHtcbiAgICByZXR1cm4gTWF0cml4MjIuZnJvbUNvcHk0Um93TWFqb3IobWF0Ll92WzBdLCBtYXQuX3ZbMV0sIG1hdC5fdlsyXSwgbWF0Ll92WzNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW52ZXJ0IG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIGludmVydChtYXQ6IE1hdHJpeDIyKSB7XG4gICAgY29uc3QgZGV0ID0gbWF0LmRldGVybWluYW50KCk7XG4gICAgaWYgKGRldCA9PT0gMCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCd0aGUgZGV0ZXJtaW5hbnQgaXMgMCEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSBtYXQuX3ZbM10gLyBkZXQ7XG4gICAgY29uc3QgbTAxID0gKG1hdC5fdlsyXSAvIGRldCkgKiAtMS4wO1xuICAgIGNvbnN0IG0xMCA9IChtYXQuX3ZbMV0gLyBkZXQpICogLTEuMDtcbiAgICBjb25zdCBtMTEgPSBtYXQuX3ZbMF0gLyBkZXQ7XG5cbiAgICByZXR1cm4gTWF0cml4MjIuZnJvbUNvcHk0Um93TWFqb3IobTAwLCBtMDEsIG0xMCwgbTExKTtcbiAgfVxuXG4gIHN0YXRpYyBpbnZlcnRUbyhtYXQ6IE1hdHJpeDIyLCBvdXRNYXQ6IE11dGFibGVNYXRyaXgyMikge1xuICAgIGNvbnN0IGRldCA9IG1hdC5kZXRlcm1pbmFudCgpO1xuICAgIGlmIChkZXQgPT09IDApIHtcbiAgICAgIExvZ2dlci5lcnJvcigndGhlIGRldGVybWluYW50IGlzIDAhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbTAwID0gbWF0Ll92WzNdIC8gZGV0O1xuICAgIGNvbnN0IG0wMSA9IChtYXQuX3ZbMl0gLyBkZXQpICogLTEuMDtcbiAgICBjb25zdCBtMTAgPSAobWF0Ll92WzFdIC8gZGV0KSAqIC0xLjA7XG4gICAgY29uc3QgbTExID0gbWF0Ll92WzBdIC8gZGV0O1xuXG4gICAgcmV0dXJuIG91dE1hdC5zZXRDb21wb25lbnRzKG0wMCwgbTAxLCBtMTAsIG0xMSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZShyYWRpYW46IG51bWJlcikge1xuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKHJhZGlhbik7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4ocmFkaWFuKTtcbiAgICByZXR1cm4gTWF0cml4MjIuZnJvbUNvcHk0Um93TWFqb3IoY29zLCAtc2luLCBzaW4sIGNvcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFNjYWxlIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHNjYWxlKHZlYzogVmVjdG9yMikge1xuICAgIHJldHVybiBNYXRyaXgyMi5mcm9tQ29weTRSb3dNYWpvcih2ZWMuX3ZbMF0sIDAsIDAsIHZlYy5fdlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgbWF0cml4ZXNcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseShsX21hdDogTWF0cml4MjIsIHJfbWF0OiBNYXRyaXgyMikge1xuICAgIGNvbnN0IG0wMCA9IGxfbWF0Ll92WzBdICogcl9tYXQuX3ZbMF0gKyBsX21hdC5fdlsyXSAqIHJfbWF0Ll92WzFdO1xuICAgIGNvbnN0IG0xMCA9IGxfbWF0Ll92WzFdICogcl9tYXQuX3ZbMF0gKyBsX21hdC5fdlszXSAqIHJfbWF0Ll92WzFdO1xuXG4gICAgY29uc3QgbTAxID0gbF9tYXQuX3ZbMF0gKiByX21hdC5fdlsyXSArIGxfbWF0Ll92WzJdICogcl9tYXQuX3ZbM107XG4gICAgY29uc3QgbTExID0gbF9tYXQuX3ZbMV0gKiByX21hdC5fdlsyXSArIGxfbWF0Ll92WzNdICogcl9tYXQuX3ZbM107XG5cbiAgICByZXR1cm4gTWF0cml4MjIuZnJvbUNvcHk0Um93TWFqb3IobTAwLCBtMDEsIG0xMCwgbTExKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSBtYXRyaXhlc1xuICAgKi9cbiAgc3RhdGljIG11bHRpcGx5VG8obF9tYXQ6IE1hdHJpeDMzLCByX21hdDogTWF0cml4MzMsIG91dE1hdDogTXV0YWJsZU1hdHJpeDIyKSB7XG4gICAgY29uc3QgbTAwID0gbF9tYXQuX3ZbMF0gKiByX21hdC5fdlswXSArIGxfbWF0Ll92WzJdICogcl9tYXQuX3ZbMV07XG4gICAgY29uc3QgbTEwID0gbF9tYXQuX3ZbMV0gKiByX21hdC5fdlswXSArIGxfbWF0Ll92WzNdICogcl9tYXQuX3ZbMV07XG5cbiAgICBjb25zdCBtMDEgPSBsX21hdC5fdlswXSAqIHJfbWF0Ll92WzJdICsgbF9tYXQuX3ZbMl0gKiByX21hdC5fdlszXTtcbiAgICBjb25zdCBtMTEgPSBsX21hdC5fdlsxXSAqIHJfbWF0Ll92WzJdICsgbF9tYXQuX3ZbM10gKiByX21hdC5fdlszXTtcblxuICAgIHJldHVybiBvdXRNYXQuc2V0Q29tcG9uZW50cyhtMDAsIG0wMSwgbTEwLCBtMTEpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF0gKyAnICcgKyB0aGlzLl92WzJdICsgJ1xcbicgKyB0aGlzLl92WzFdICsgJyAnICsgdGhpcy5fdlszXSArICcgXFxuJztcbiAgfVxuXG4gIHRvU3RyaW5nQXBwcm94aW1hdGVseSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMF0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlsyXSkgK1xuICAgICAgJ1xcbicgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMV0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlszXSkgK1xuICAgICAgJyBcXG4nXG4gICAgKTtcbiAgfVxuXG4gIGZsYXR0ZW5Bc0FycmF5KCkge1xuICAgIHJldHVybiBbdGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSwgdGhpcy5fdlszXV07XG4gIH1cblxuICBpc0R1bW15KCkge1xuICAgIGlmICh0aGlzLl92Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc0VxdWFsKG1hdDogTWF0cml4MjIsIGRlbHRhOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTikge1xuICAgIGlmIChcbiAgICAgIE1hdGguYWJzKG1hdC5fdlswXSAtIHRoaXMuX3ZbMF0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5fdlsxXSAtIHRoaXMuX3ZbMV0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5fdlsyXSAtIHRoaXMuX3ZbMl0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKG1hdC5fdlszXSAtIHRoaXMuX3ZbM10pIDwgZGVsdGFcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpY3RFcXVhbChtYXQ6IE1hdHJpeDIyKSB7XG4gICAgaWYgKFxuICAgICAgbWF0Ll92WzBdID09PSB0aGlzLl92WzBdICYmXG4gICAgICBtYXQuX3ZbMV0gPT09IHRoaXMuX3ZbMV0gJiZcbiAgICAgIG1hdC5fdlsyXSA9PT0gdGhpcy5fdlsyXSAmJlxuICAgICAgbWF0Ll92WzNdID09PSB0aGlzLl92WzNdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdltyb3dfaSArIGNvbHVtbl9pICogMl07XG4gIH1cblxuICBkZXRlcm1pbmFudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXSAqIHRoaXMuX3ZbM10gLSB0aGlzLl92WzFdICogdGhpcy5fdlsyXTtcbiAgfVxuXG4gIG11bHRpcGx5VmVjdG9yKHZlYzogVmVjdG9yMikge1xuICAgIGNvbnN0IHggPSB0aGlzLl92WzBdICogdmVjLl92WzBdICsgdGhpcy5fdlsyXSAqIHZlYy5fdlsxXTtcbiAgICBjb25zdCB5ID0gdGhpcy5fdlsxXSAqIHZlYy5fdlswXSArIHRoaXMuX3ZbM10gKiB2ZWMuX3ZbMV07XG4gICAgcmV0dXJuIFZlY3RvcjIuZnJvbUNvcHlBcnJheTIoW3gsIHldKTtcbiAgfVxuXG4gIG11bHRpcGx5VmVjdG9yVG8odmVjOiBWZWN0b3IyLCBvdXRWZWM6IE11dGFibGVWZWN0b3IyKSB7XG4gICAgY29uc3QgeCA9IHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzJdICogdmVjLl92WzFdO1xuICAgIGNvbnN0IHkgPSB0aGlzLl92WzFdICogdmVjLl92WzBdICsgdGhpcy5fdlszXSAqIHZlYy5fdlsxXTtcbiAgICBvdXRWZWMuX3ZbMF0gPSB4O1xuICAgIG91dFZlYy5fdlsxXSA9IHk7XG4gICAgcmV0dXJuIG91dFZlYztcbiAgfVxuXG4gIGdldFNjYWxlKCkge1xuICAgIHJldHVybiBWZWN0b3IyLmZyb21Db3B5QXJyYXkyKFtNYXRoLmh5cG90KHRoaXMubTAwLCB0aGlzLm0wMSksIE1hdGguaHlwb3QodGhpcy5tMTAsIHRoaXMubTExKV0pO1xuICB9XG5cbiAgZ2V0U2NhbGVUbyhvdXRWZWM6IE11dGFibGVWZWN0b3IyKSB7XG4gICAgb3V0VmVjLl92WzBdID0gTWF0aC5oeXBvdCh0aGlzLl92WzBdLCB0aGlzLl92WzJdKTtcbiAgICBvdXRWZWMuX3ZbMV0gPSBNYXRoLmh5cG90KHRoaXMuX3ZbMV0sIHRoaXMuX3ZbM10pO1xuICAgIHJldHVybiBvdXRWZWM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5mcm9tQ29weTRSb3dNYWpvcihcbiAgICAgIHRoaXMuX3ZbMF0sXG4gICAgICB0aGlzLl92WzJdLFxuICAgICAgdGhpcy5fdlsxXSxcbiAgICAgIHRoaXMuX3ZbM11cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgUm93IE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIElmIHlvdSB3cml0ZSA0IHZhbHVlcyBpbiAyeDIgc3R5bGUgKDIgdmFsdWVzIGluIGVhY2ggcm93KSxcbiAgICogICBJdCB3aWxsIGJlY29tZXMgYW4gaW50dWl0aXZlIGhhbmRsaW5nLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21Db3B5NFJvd01ham9yKG0wMDogbnVtYmVyLCBtMDE6IG51bWJlciwgbTEwOiBudW1iZXIsIG0xMTogbnVtYmVyKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IG0wMDtcbiAgICB2WzJdID0gbTAxO1xuICAgIHZbMV0gPSBtMTA7XG4gICAgdlszXSA9IG0xMTtcbiAgICByZXR1cm4gbmV3IE1hdHJpeDIyKHYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgQ29sdW1uIE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvcHk0Q29sdW1uTWFqb3IobTAwOiBudW1iZXIsIG0xMDogbnVtYmVyLCBtMDE6IG51bWJlciwgbTExOiBudW1iZXIpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gbTAwO1xuICAgIHZbMl0gPSBtMDE7XG4gICAgdlsxXSA9IG0xMDtcbiAgICB2WzNdID0gbTExO1xuICAgIHJldHVybiBuZXcgTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUZsb2F0MzJBcnJheUNvbHVtbk1ham9yKGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgyMihmbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoZmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2LnNldChmbG9hdDMyQXJyYXkpO1xuICAgIHJldHVybiBuZXcgTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlGbG9hdDMyQXJyYXlSb3dNYWpvcihhcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IGFycmF5WzBdO1xuICAgIHZbM10gPSBhcnJheVsxXTtcbiAgICB2WzFdID0gYXJyYXlbMl07XG4gICAgdls0XSA9IGFycmF5WzNdO1xuXG4gICAgcmV0dXJuIG5ldyBNYXRyaXgyMih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weU1hdHJpeDIyKG1hdDogSU1hdHJpeDIyKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IG1hdC5fdlswXTtcbiAgICB2WzNdID0gbWF0Ll92WzFdO1xuICAgIHZbMV0gPSBtYXQuX3ZbMl07XG4gICAgdls0XSA9IG1hdC5fdlszXTtcbiAgICByZXR1cm4gbmV3IE1hdHJpeDIyKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXk5Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5NDxudW1iZXI+KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdi5zZXQoYXJyYXkpO1xuICAgIHJldHVybiBuZXcgTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheUNvbHVtbk1ham9yKGFycmF5OiBBcnJheTxudW1iZXI+KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdi5zZXQoYXJyYXkpO1xuICAgIHJldHVybiBuZXcgTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTlSb3dNYWpvcihhcnJheTogQXJyYXk0PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdlszXSA9IGFycmF5WzFdO1xuICAgIHZbMV0gPSBhcnJheVsyXTtcbiAgICB2WzRdID0gYXJyYXlbM107XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgyMih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5Um93TWFqb3IoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdlszXSA9IGFycmF5WzFdO1xuICAgIHZbMV0gPSBhcnJheVsyXTtcbiAgICB2WzRdID0gYXJyYXlbM107XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgyMih2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4vTWF0cml4NDQnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJTWF0cml4LCBJTWF0cml4MzMgfSBmcm9tICcuL0lNYXRyaXgnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi9NdXRhYmxlTWF0cml4MzMnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi9NYXRoVXRpbCc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4vTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNYXRyaXggfSBmcm9tICcuL0Fic3RyYWN0TWF0cml4JztcbmltcG9ydCB7IElkZW50aXR5TWF0cml4MzMgfSBmcm9tICcuL0lkZW50aXR5TWF0cml4MzMnO1xuaW1wb3J0IHsgSU11dGFibGVWZWN0b3IzLCBJVmVjdG9yMyB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQgeyBBcnJheTkgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG4vKiBlc2xpbnQtZGlzYWJsZSBwcmV0dGllci9wcmV0dGllciAqL1xuXG5leHBvcnQgY2xhc3MgTWF0cml4MzMgZXh0ZW5kcyBBYnN0cmFjdE1hdHJpeCBpbXBsZW1lbnRzIElNYXRyaXgsIElNYXRyaXgzMyB7XG4gIGNvbnN0cnVjdG9yKG06IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdiA9IG07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTEwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTExKCkge1xuICAgIHJldHVybiB0aGlzLl92WzRdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbNV07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMigpIHtcbiAgICByZXR1cm4gdGhpcy5fdls2XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTEyKCkge1xuICAgIHJldHVybiB0aGlzLl92WzddO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbOF07XG4gIH1cblxuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnTWF0cml4MzMnO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb3NpdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5NYXQzO1xuICB9XG5cbiAgLyoqXG4gICAqIHplcm8gbWF0cml4KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpZGVudGl0eSBtYXRyaXhcbiAgICovXG4gIHN0YXRpYyBpZGVudGl0eSgpOiBJTWF0cml4MzMge1xuICAgIC8vIHJldHVybiBuZXcgdGhpcyhcbiAgICAvLyAgIDEsIDAsIDAsXG4gICAgLy8gICAwLCAxLCAwLFxuICAgIC8vICAgMCwgMCwgMVxuICAgIC8vICk7XG5cbiAgICByZXR1cm4gbmV3IElkZW50aXR5TWF0cml4MzMoKTtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IEZsb2F0MzJBcnJheSgwKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRyYW5zcG9zZSBtYXRyaXhcbiAgICovXG4gIHN0YXRpYyB0cmFuc3Bvc2UobWF0OiBJTWF0cml4MzMpOiBJTWF0cml4MzMge1xuICAgIGlmIChtYXQuaXNJZGVudGl0eU1hdHJpeENsYXNzKSB7XG4gICAgICByZXR1cm4gbWF0O1xuICAgIH1cblxuICAgIHJldHVybiBNYXRyaXgzMy5mcm9tQ29weTlSb3dNYWpvcihcbiAgICAgIG1hdC5fdlswXSxcbiAgICAgIG1hdC5fdlsxXSxcbiAgICAgIG1hdC5fdlsyXSxcbiAgICAgIG1hdC5fdlszXSxcbiAgICAgIG1hdC5fdls0XSxcbiAgICAgIG1hdC5fdls1XSxcbiAgICAgIG1hdC5fdls2XSxcbiAgICAgIG1hdC5fdls3XSxcbiAgICAgIG1hdC5fdls4XVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGludmVydCBtYXRyaXhcbiAgICovXG4gIHN0YXRpYyBpbnZlcnQobWF0OiBJTWF0cml4MzMpIHtcbiAgICBpZiAobWF0LmlzSWRlbnRpdHlNYXRyaXhDbGFzcykge1xuICAgICAgcmV0dXJuIG1hdDtcbiAgICB9XG4gICAgY29uc3QgZGV0ID0gbWF0LmRldGVybWluYW50KCk7XG4gICAgaWYgKGRldCA9PT0gMCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCd0aGUgZGV0ZXJtaW5hbnQgaXMgMCEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSAobWF0Ll92WzRdICogbWF0Ll92WzhdIC0gbWF0Ll92WzddICogbWF0Ll92WzVdKSAvIGRldDtcbiAgICBjb25zdCBtMDEgPSAobWF0Ll92WzZdICogbWF0Ll92WzVdIC0gbWF0Ll92WzNdICogbWF0Ll92WzhdKSAvIGRldDtcbiAgICBjb25zdCBtMDIgPSAobWF0Ll92WzNdICogbWF0Ll92WzddIC0gbWF0Ll92WzZdICogbWF0Ll92WzRdKSAvIGRldDtcbiAgICBjb25zdCBtMTAgPSAobWF0Ll92WzddICogbWF0Ll92WzJdIC0gbWF0Ll92WzFdICogbWF0Ll92WzhdKSAvIGRldDtcbiAgICBjb25zdCBtMTEgPSAobWF0Ll92WzBdICogbWF0Ll92WzhdIC0gbWF0Ll92WzZdICogbWF0Ll92WzJdKSAvIGRldDtcbiAgICBjb25zdCBtMTIgPSAobWF0Ll92WzZdICogbWF0Ll92WzFdIC0gbWF0Ll92WzBdICogbWF0Ll92WzddKSAvIGRldDtcbiAgICBjb25zdCBtMjAgPSAobWF0Ll92WzFdICogbWF0Ll92WzVdIC0gbWF0Ll92WzRdICogbWF0Ll92WzJdKSAvIGRldDtcbiAgICBjb25zdCBtMjEgPSAobWF0Ll92WzNdICogbWF0Ll92WzJdIC0gbWF0Ll92WzBdICogbWF0Ll92WzVdKSAvIGRldDtcbiAgICBjb25zdCBtMjIgPSAobWF0Ll92WzBdICogbWF0Ll92WzRdIC0gbWF0Ll92WzNdICogbWF0Ll92WzFdKSAvIGRldDtcblxuICAgIHJldHVybiBNYXRyaXgzMy5mcm9tQ29weTlSb3dNYWpvcihtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKTtcbiAgfVxuXG4gIHN0YXRpYyBpbnZlcnRUbyhtYXQ6IElNYXRyaXgzMywgb3V0TWF0OiBNdXRhYmxlTWF0cml4MzMpIHtcbiAgICBpZiAobWF0LmlzSWRlbnRpdHlNYXRyaXhDbGFzcykge1xuICAgICAgcmV0dXJuIG91dE1hdC5jb3B5Q29tcG9uZW50cyhtYXQpO1xuICAgIH1cbiAgICBjb25zdCBkZXQgPSBtYXQuZGV0ZXJtaW5hbnQoKTtcbiAgICBpZiAoZGV0ID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ3RoZSBkZXRlcm1pbmFudCBpcyAwIScpO1xuICAgIH1cblxuICAgIGNvbnN0IG0wMCA9IChtYXQuX3ZbNF0gKiBtYXQuX3ZbOF0gLSBtYXQuX3ZbN10gKiBtYXQuX3ZbNV0pIC8gZGV0O1xuICAgIGNvbnN0IG0wMSA9IChtYXQuX3ZbNl0gKiBtYXQuX3ZbNV0gLSBtYXQuX3ZbM10gKiBtYXQuX3ZbOF0pIC8gZGV0O1xuICAgIGNvbnN0IG0wMiA9IChtYXQuX3ZbM10gKiBtYXQuX3ZbN10gLSBtYXQuX3ZbNl0gKiBtYXQuX3ZbNF0pIC8gZGV0O1xuICAgIGNvbnN0IG0xMCA9IChtYXQuX3ZbN10gKiBtYXQuX3ZbMl0gLSBtYXQuX3ZbMV0gKiBtYXQuX3ZbOF0pIC8gZGV0O1xuICAgIGNvbnN0IG0xMSA9IChtYXQuX3ZbMF0gKiBtYXQuX3ZbOF0gLSBtYXQuX3ZbNl0gKiBtYXQuX3ZbMl0pIC8gZGV0O1xuICAgIGNvbnN0IG0xMiA9IChtYXQuX3ZbNl0gKiBtYXQuX3ZbMV0gLSBtYXQuX3ZbMF0gKiBtYXQuX3ZbN10pIC8gZGV0O1xuICAgIGNvbnN0IG0yMCA9IChtYXQuX3ZbMV0gKiBtYXQuX3ZbNV0gLSBtYXQuX3ZbNF0gKiBtYXQuX3ZbMl0pIC8gZGV0O1xuICAgIGNvbnN0IG0yMSA9IChtYXQuX3ZbM10gKiBtYXQuX3ZbMl0gLSBtYXQuX3ZbMF0gKiBtYXQuX3ZbNV0pIC8gZGV0O1xuICAgIGNvbnN0IG0yMiA9IChtYXQuX3ZbMF0gKiBtYXQuX3ZbNF0gLSBtYXQuX3ZbM10gKiBtYXQuX3ZbMV0pIC8gZGV0O1xuXG4gICAgcmV0dXJuIG91dE1hdC5zZXRDb21wb25lbnRzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBYIG9yaWVudGVkIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZVgocmFkaWFuOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgcmV0dXJuIE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKDEsIDAsIDAsIDAsIGNvcywgLXNpbiwgMCwgc2luLCBjb3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBZIG9yaWVudGVkIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZVkocmFkaWFuOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgcmV0dXJuIE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKGNvcywgMCwgc2luLCAwLCAxLCAwLCAtc2luLCAwLCBjb3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBaIG9yaWVudGVkIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZVoocmFkaWFuOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgcmV0dXJuIE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKGNvcywgLXNpbiwgMCwgc2luLCBjb3MsIDAsIDAsIDAsIDEpO1xuICB9XG5cbiAgc3RhdGljIHJvdGF0ZVhZWih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zWCA9IE1hdGguY29zKHgpO1xuICAgIGNvbnN0IHNpblggPSBNYXRoLnNpbih4KTtcbiAgICBjb25zdCBjb3NZID0gTWF0aC5jb3MoeSk7XG4gICAgY29uc3Qgc2luWSA9IE1hdGguc2luKHkpO1xuICAgIGNvbnN0IGNvc1ogPSBNYXRoLmNvcyh6KTtcbiAgICBjb25zdCBzaW5aID0gTWF0aC5zaW4oeik7XG5cbiAgICAvLyBjb25zdCB4MDAgPSAxO1xuICAgIC8vIGNvbnN0IHgwMSA9IDA7XG4gICAgLy8gY29uc3QgeDAyID0gMDtcbiAgICAvLyBjb25zdCB4MTAgPSAwO1xuICAgIGNvbnN0IHgxMSA9IGNvc1g7XG4gICAgY29uc3QgeDEyID0gLXNpblg7XG4gICAgLy8gY29uc3QgeDIwID0gMDtcbiAgICBjb25zdCB4MjEgPSBzaW5YO1xuICAgIGNvbnN0IHgyMiA9IGNvc1g7XG5cbiAgICBjb25zdCB5MDAgPSBjb3NZO1xuICAgIC8vIGNvbnN0IHkwMSA9IDA7XG4gICAgY29uc3QgeTAyID0gc2luWTtcbiAgICAvLyBjb25zdCB5MTAgPSAwO1xuICAgIC8vIGNvbnN0IHkxMSA9IDE7XG4gICAgLy8gY29uc3QgeTEyID0gMDtcbiAgICBjb25zdCB5MjAgPSAtc2luWTtcbiAgICAvLyBjb25zdCB5MjEgPSAwO1xuICAgIGNvbnN0IHkyMiA9IGNvc1k7XG5cbiAgICBjb25zdCB6MDAgPSBjb3NaO1xuICAgIGNvbnN0IHowMSA9IC1zaW5aO1xuICAgIC8vIGNvbnN0IHowMiA9IDA7XG4gICAgY29uc3QgejEwID0gc2luWjtcbiAgICBjb25zdCB6MTEgPSBjb3NaO1xuICAgIC8vIGNvbnN0IHoxMiA9IDA7XG4gICAgLy8gY29uc3QgejIwID0gMDtcbiAgICAvLyBjb25zdCB6MjEgPSAwO1xuICAgIC8vIGNvbnN0IHoyMiA9IDE7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhpcy5tdWx0aXBseSh0aGlzLnJvdGF0ZVkoeSksIHRoaXMucm90YXRlWCh4KSlcbiAgICBjb25zdCB5eDAwID0geTAwO1xuICAgIGNvbnN0IHl4MDEgPSB5MDIgKiB4MjE7XG4gICAgY29uc3QgeXgwMiA9IHkwMiAqIHgyMjtcbiAgICAvL2NvbnN0IHl4MTAgPSAwO1xuICAgIGNvbnN0IHl4MTEgPSB4MTE7XG4gICAgY29uc3QgeXgxMiA9IHgxMjtcbiAgICBjb25zdCB5eDIwID0geTIwO1xuICAgIGNvbnN0IHl4MjEgPSB5MjIgKiB4MjE7XG4gICAgY29uc3QgeXgyMiA9IHkyMiAqIHgyMjtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGlzLm11bHRpcGx5KHRoaXMucm90YXRlWih6KSwgdGhpcy5tdWx0aXBseSh0aGlzLnJvdGF0ZVkoeSksIHRoaXMucm90YXRlWCh4KSkpXG4gICAgY29uc3QgbTAwID0gejAwICogeXgwMDtcbiAgICBjb25zdCBtMDEgPSB6MDAgKiB5eDAxICsgejAxICogeXgxMTtcbiAgICBjb25zdCBtMDIgPSB6MDAgKiB5eDAyICsgejAxICogeXgxMjtcbiAgICBjb25zdCBtMTAgPSB6MTAgKiB5eDAwO1xuICAgIGNvbnN0IG0xMSA9IHoxMCAqIHl4MDEgKyB6MTEgKiB5eDExO1xuICAgIGNvbnN0IG0xMiA9IHoxMCAqIHl4MDIgKyB6MTEgKiB5eDEyO1xuICAgIGNvbnN0IG0yMCA9IHl4MjA7XG4gICAgY29uc3QgbTIxID0geXgyMTtcbiAgICBjb25zdCBtMjIgPSB5eDIyO1xuXG4gICAgcmV0dXJuIE1hdHJpeDMzLmZyb21Db3B5OVJvd01ham9yKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpO1xuICB9XG5cbiAgc3RhdGljIHJvdGF0ZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5yb3RhdGVYWVoodmVjLl92WzBdLCB2ZWMuX3ZbMV0sIHZlYy5fdlsyXSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFNjYWxlIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHNjYWxlKHZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gTWF0cml4MzMuZnJvbUNvcHk5Um93TWFqb3IodmVjLl92WzBdLCAwLCAwLCAwLCB2ZWMuX3ZbMV0sIDAsIDAsIDAsIHZlYy5fdlsyXSk7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgbWF0cml4ZXNcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseShsX21hdDogSU1hdHJpeDMzLCByX21hdDogSU1hdHJpeDMzKTogSU1hdHJpeDMzIHtcbiAgICBpZiAobF9tYXQuaXNJZGVudGl0eU1hdHJpeENsYXNzKSB7XG4gICAgICByZXR1cm4gcl9tYXQ7XG4gICAgfSBlbHNlIGlmIChyX21hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiBsX21hdDtcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSBsX21hdC5fdlswXSAqIHJfbWF0Ll92WzBdICsgbF9tYXQuX3ZbM10gKiByX21hdC5fdlsxXSArIGxfbWF0Ll92WzZdICogcl9tYXQuX3ZbMl07XG4gICAgY29uc3QgbTEwID0gbF9tYXQuX3ZbMV0gKiByX21hdC5fdlswXSArIGxfbWF0Ll92WzRdICogcl9tYXQuX3ZbMV0gKyBsX21hdC5fdls3XSAqIHJfbWF0Ll92WzJdO1xuICAgIGNvbnN0IG0yMCA9IGxfbWF0Ll92WzJdICogcl9tYXQuX3ZbMF0gKyBsX21hdC5fdls1XSAqIHJfbWF0Ll92WzFdICsgbF9tYXQuX3ZbOF0gKiByX21hdC5fdlsyXTtcblxuICAgIGNvbnN0IG0wMSA9IGxfbWF0Ll92WzBdICogcl9tYXQuX3ZbM10gKyBsX21hdC5fdlszXSAqIHJfbWF0Ll92WzRdICsgbF9tYXQuX3ZbNl0gKiByX21hdC5fdls1XTtcbiAgICBjb25zdCBtMTEgPSBsX21hdC5fdlsxXSAqIHJfbWF0Ll92WzNdICsgbF9tYXQuX3ZbNF0gKiByX21hdC5fdls0XSArIGxfbWF0Ll92WzddICogcl9tYXQuX3ZbNV07XG4gICAgY29uc3QgbTIxID0gbF9tYXQuX3ZbMl0gKiByX21hdC5fdlszXSArIGxfbWF0Ll92WzVdICogcl9tYXQuX3ZbNF0gKyBsX21hdC5fdls4XSAqIHJfbWF0Ll92WzVdO1xuXG4gICAgY29uc3QgbTAyID0gbF9tYXQuX3ZbMF0gKiByX21hdC5fdls2XSArIGxfbWF0Ll92WzNdICogcl9tYXQuX3ZbN10gKyBsX21hdC5fdls2XSAqIHJfbWF0Ll92WzhdO1xuICAgIGNvbnN0IG0xMiA9IGxfbWF0Ll92WzFdICogcl9tYXQuX3ZbNl0gKyBsX21hdC5fdls0XSAqIHJfbWF0Ll92WzddICsgbF9tYXQuX3ZbN10gKiByX21hdC5fdls4XTtcbiAgICBjb25zdCBtMjIgPSBsX21hdC5fdlsyXSAqIHJfbWF0Ll92WzZdICsgbF9tYXQuX3ZbNV0gKiByX21hdC5fdls3XSArIGxfbWF0Ll92WzhdICogcl9tYXQuX3ZbOF07XG5cbiAgICByZXR1cm4gTWF0cml4MzMuZnJvbUNvcHk5Um93TWFqb3IobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMik7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgbWF0cml4ZXNcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseVRvKGxfbWF0OiBJTWF0cml4MzMsIHJfbWF0OiBJTWF0cml4MzMsIG91dE1hdDogTXV0YWJsZU1hdHJpeDMzKSB7XG4gICAgaWYgKGxfbWF0LmlzSWRlbnRpdHlNYXRyaXhDbGFzcykge1xuICAgICAgcmV0dXJuIG91dE1hdC5jb3B5Q29tcG9uZW50cyhyX21hdCk7XG4gICAgfSBlbHNlIGlmIChyX21hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiBvdXRNYXQuY29weUNvbXBvbmVudHMobF9tYXQpO1xuICAgIH1cblxuICAgIGNvbnN0IG0wMCA9IGxfbWF0Ll92WzBdICogcl9tYXQuX3ZbMF0gKyBsX21hdC5fdlszXSAqIHJfbWF0Ll92WzFdICsgbF9tYXQuX3ZbNl0gKiByX21hdC5fdlsyXTtcbiAgICBjb25zdCBtMTAgPSBsX21hdC5fdlsxXSAqIHJfbWF0Ll92WzBdICsgbF9tYXQuX3ZbNF0gKiByX21hdC5fdlsxXSArIGxfbWF0Ll92WzddICogcl9tYXQuX3ZbMl07XG4gICAgY29uc3QgbTIwID0gbF9tYXQuX3ZbMl0gKiByX21hdC5fdlswXSArIGxfbWF0Ll92WzVdICogcl9tYXQuX3ZbMV0gKyBsX21hdC5fdls4XSAqIHJfbWF0Ll92WzJdO1xuXG4gICAgY29uc3QgbTAxID0gbF9tYXQuX3ZbMF0gKiByX21hdC5fdlszXSArIGxfbWF0Ll92WzNdICogcl9tYXQuX3ZbNF0gKyBsX21hdC5fdls2XSAqIHJfbWF0Ll92WzVdO1xuICAgIGNvbnN0IG0xMSA9IGxfbWF0Ll92WzFdICogcl9tYXQuX3ZbM10gKyBsX21hdC5fdls0XSAqIHJfbWF0Ll92WzRdICsgbF9tYXQuX3ZbN10gKiByX21hdC5fdls1XTtcbiAgICBjb25zdCBtMjEgPSBsX21hdC5fdlsyXSAqIHJfbWF0Ll92WzNdICsgbF9tYXQuX3ZbNV0gKiByX21hdC5fdls0XSArIGxfbWF0Ll92WzhdICogcl9tYXQuX3ZbNV07XG5cbiAgICBjb25zdCBtMDIgPSBsX21hdC5fdlswXSAqIHJfbWF0Ll92WzZdICsgbF9tYXQuX3ZbM10gKiByX21hdC5fdls3XSArIGxfbWF0Ll92WzZdICogcl9tYXQuX3ZbOF07XG4gICAgY29uc3QgbTEyID0gbF9tYXQuX3ZbMV0gKiByX21hdC5fdls2XSArIGxfbWF0Ll92WzRdICogcl9tYXQuX3ZbN10gKyBsX21hdC5fdls3XSAqIHJfbWF0Ll92WzhdO1xuICAgIGNvbnN0IG0yMiA9IGxfbWF0Ll92WzJdICogcl9tYXQuX3ZbNl0gKyBsX21hdC5fdls1XSAqIHJfbWF0Ll92WzddICsgbF9tYXQuX3ZbOF0gKiByX21hdC5fdls4XTtcblxuICAgIHJldHVybiBvdXRNYXQuc2V0Q29tcG9uZW50cyhtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl92WzBdICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLl92WzNdICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLl92WzZdICtcbiAgICAgICdcXG4nICtcbiAgICAgIHRoaXMuX3ZbMV0gK1xuICAgICAgJyAnICtcbiAgICAgIHRoaXMuX3ZbNF0gK1xuICAgICAgJyAnICtcbiAgICAgIHRoaXMuX3ZbN10gK1xuICAgICAgJ1xcbicgK1xuICAgICAgdGhpcy5fdlsyXSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdls1XSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdls4XSArXG4gICAgICAnXFxuJ1xuICAgICk7XG4gIH1cblxuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzBdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbM10pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdls2XSkgK1xuICAgICAgJ1xcbicgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMV0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdls0XSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzddKSArXG4gICAgICAnIFxcbicgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMl0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdls1XSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzhdKSArXG4gICAgICAnXFxuJ1xuICAgICk7XG4gIH1cblxuICBmbGF0dGVuQXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fdlswXSxcbiAgICAgIHRoaXMuX3ZbMV0sXG4gICAgICB0aGlzLl92WzJdLFxuICAgICAgdGhpcy5fdlszXSxcbiAgICAgIHRoaXMuX3ZbNF0sXG4gICAgICB0aGlzLl92WzVdLFxuICAgICAgdGhpcy5fdls2XSxcbiAgICAgIHRoaXMuX3ZbN10sXG4gICAgICB0aGlzLl92WzhdLFxuICAgIF07XG4gIH1cblxuICBpc0R1bW15KCkge1xuICAgIGlmICh0aGlzLl92Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc0VxdWFsKG1hdDogSU1hdHJpeDMzLCBkZWx0YTogbnVtYmVyID0gTnVtYmVyLkVQU0lMT04pIHtcbiAgICBpZiAoXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbMF0gLSB0aGlzLl92WzBdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbMV0gLSB0aGlzLl92WzFdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbMl0gLSB0aGlzLl92WzJdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbM10gLSB0aGlzLl92WzNdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbNF0gLSB0aGlzLl92WzRdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbNV0gLSB0aGlzLl92WzVdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbNl0gLSB0aGlzLl92WzZdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbN10gLSB0aGlzLl92WzddKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhtYXQuX3ZbOF0gLSB0aGlzLl92WzhdKSA8IGRlbHRhXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzU3RyaWN0RXF1YWwobWF0OiBNYXRyaXgzMykge1xuICAgIGlmIChcbiAgICAgIG1hdC5fdlswXSA9PT0gdGhpcy5fdlswXSAmJlxuICAgICAgbWF0Ll92WzFdID09PSB0aGlzLl92WzFdICYmXG4gICAgICBtYXQuX3ZbMl0gPT09IHRoaXMuX3ZbMl0gJiZcbiAgICAgIG1hdC5fdlszXSA9PT0gdGhpcy5fdlszXSAmJlxuICAgICAgbWF0Ll92WzRdID09PSB0aGlzLl92WzRdICYmXG4gICAgICBtYXQuX3ZbNV0gPT09IHRoaXMuX3ZbNV0gJiZcbiAgICAgIG1hdC5fdls2XSA9PT0gdGhpcy5fdls2XSAmJlxuICAgICAgbWF0Ll92WzddID09PSB0aGlzLl92WzddICYmXG4gICAgICBtYXQuX3ZbOF0gPT09IHRoaXMuX3ZbOF1cbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXQocm93X2k6IG51bWJlciwgY29sdW1uX2k6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLl92W3Jvd19pICsgY29sdW1uX2kgKiAzXTtcbiAgfVxuXG4gIHYoaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdltpXTtcbiAgfVxuXG4gIGRldGVybWluYW50KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl92WzBdICogdGhpcy5fdls0XSAqIHRoaXMuX3ZbOF0gK1xuICAgICAgdGhpcy5fdlsxXSAqIHRoaXMuX3ZbNV0gKiB0aGlzLl92WzZdICtcbiAgICAgIHRoaXMuX3ZbMl0gKiB0aGlzLl92WzNdICogdGhpcy5fdls3XSAtXG4gICAgICB0aGlzLl92WzBdICogdGhpcy5fdls1XSAqIHRoaXMuX3ZbN10gLVxuICAgICAgdGhpcy5fdlsyXSAqIHRoaXMuX3ZbNF0gKiB0aGlzLl92WzZdIC1cbiAgICAgIHRoaXMuX3ZbMV0gKiB0aGlzLl92WzNdICogdGhpcy5fdls4XVxuICAgICk7XG4gIH1cblxuICBtdWx0aXBseVZlY3Rvcih2ZWM6IElWZWN0b3IzKSB7XG4gICAgY29uc3QgeCA9IHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzNdICogdmVjLl92WzFdICsgdGhpcy5fdls2XSAqIHZlYy5fdlsyXTtcbiAgICBjb25zdCB5ID0gdGhpcy5fdlsxXSAqIHZlYy5fdlswXSArIHRoaXMuX3ZbNF0gKiB2ZWMuX3ZbMV0gKyB0aGlzLl92WzddICogdmVjLl92WzJdO1xuICAgIGNvbnN0IHogPSB0aGlzLl92WzJdICogdmVjLl92WzBdICsgdGhpcy5fdls1XSAqIHZlYy5fdlsxXSArIHRoaXMuX3ZbOF0gKiB2ZWMuX3ZbMl07XG4gICAgcmV0dXJuIG5ldyAodmVjLmNvbnN0cnVjdG9yIGFzIGFueSkobmV3IEZsb2F0MzJBcnJheShbeCwgeSwgel0pKTtcbiAgfVxuXG4gIG11bHRpcGx5VmVjdG9yVG8odmVjOiBJVmVjdG9yMywgb3V0VmVjOiBJTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBjb25zdCB4ID0gdGhpcy5fdlswXSAqIHZlYy5fdlswXSArIHRoaXMuX3ZbM10gKiB2ZWMuX3ZbMV0gKyB0aGlzLl92WzZdICogdmVjLl92WzJdO1xuICAgIGNvbnN0IHkgPSB0aGlzLl92WzFdICogdmVjLl92WzBdICsgdGhpcy5fdls0XSAqIHZlYy5fdlsxXSArIHRoaXMuX3ZbN10gKiB2ZWMuX3ZbMl07XG4gICAgY29uc3QgeiA9IHRoaXMuX3ZbMl0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzVdICogdmVjLl92WzFdICsgdGhpcy5fdls4XSAqIHZlYy5fdlsyXTtcbiAgICBvdXRWZWMuX3ZbMF0gPSB4O1xuICAgIG91dFZlYy5fdlsxXSA9IHk7XG4gICAgb3V0VmVjLl92WzJdID0gejtcbiAgICByZXR1cm4gb3V0VmVjO1xuICB9XG5cbiAgZ2V0U2NhbGUoKSB7XG4gICAgcmV0dXJuIFZlY3RvcjMuZnJvbUNvcHlBcnJheShbXG4gICAgICBNYXRoLmh5cG90KHRoaXMuX3ZbMF0sIHRoaXMuX3ZbMV0sIHRoaXMuX3ZbMl0pLFxuICAgICAgTWF0aC5oeXBvdCh0aGlzLl92WzNdLCB0aGlzLl92WzRdLCB0aGlzLl92WzVdKSxcbiAgICAgIE1hdGguaHlwb3QodGhpcy5fdls2XSwgdGhpcy5fdls3XSwgdGhpcy5fdls4XSksXG4gICAgXSk7XG4gIH1cblxuICBnZXRTY2FsZVRvKG91dFZlYzogTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBvdXRWZWMuX3ZbMF0gPSBNYXRoLmh5cG90KHRoaXMuX3ZbMF0sIHRoaXMuX3ZbMV0sIHRoaXMuX3ZbMl0pO1xuICAgIG91dFZlYy5fdlsxXSA9IE1hdGguaHlwb3QodGhpcy5fdlszXSwgdGhpcy5fdls0XSwgdGhpcy5fdls1XSk7XG4gICAgb3V0VmVjLl92WzJdID0gTWF0aC5oeXBvdCh0aGlzLl92WzZdLCB0aGlzLl92WzddLCB0aGlzLl92WzhdKTtcbiAgICByZXR1cm4gb3V0VmVjO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuZnJvbUNvcHk5Um93TWFqb3IoXG4gICAgICB0aGlzLl92WzBdLFxuICAgICAgdGhpcy5fdlszXSxcbiAgICAgIHRoaXMuX3ZbNl0sXG4gICAgICB0aGlzLl92WzFdLFxuICAgICAgdGhpcy5fdls0XSxcbiAgICAgIHRoaXMuX3ZbN10sXG4gICAgICB0aGlzLl92WzJdLFxuICAgICAgdGhpcy5fdls1XSxcbiAgICAgIHRoaXMuX3ZbOF1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgUm93IE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIElmIHlvdSB3cml0ZSA5IHZhbHVlcyBpbiAzeDMgc3R5bGUgKDMgdmFsdWVzIGluIGVhY2ggcm93KSxcbiAgICogICBJdCB3aWxsIGJlY29tZXMgYW4gaW50dWl0aXZlIGhhbmRsaW5nLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21Db3B5OVJvd01ham9yKFxuICAgIG0wMDogbnVtYmVyLFxuICAgIG0wMTogbnVtYmVyLFxuICAgIG0wMjogbnVtYmVyLFxuICAgIG0xMDogbnVtYmVyLFxuICAgIG0xMTogbnVtYmVyLFxuICAgIG0xMjogbnVtYmVyLFxuICAgIG0yMDogbnVtYmVyLFxuICAgIG0yMTogbnVtYmVyLFxuICAgIG0yMjogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdlszXSA9IG0wMTtcbiAgICB2WzZdID0gbTAyO1xuICAgIHZbMV0gPSBtMTA7XG4gICAgdls0XSA9IG0xMTtcbiAgICB2WzddID0gbTEyO1xuICAgIHZbMl0gPSBtMjA7XG4gICAgdls1XSA9IG0yMTtcbiAgICB2WzhdID0gbTIyO1xuICAgIHJldHVybiBuZXcgTWF0cml4MzModik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlcyBhcyBDb2x1bW4gTWFqb3JcbiAgICogTm90ZSB0aGF0IFdlYkdMIG1hdHJpeCBrZWVwcyB0aGUgdmFsdWVzIGluIGNvbHVtbiBtYWpvci5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tQ29weTlDb2x1bW5NYWpvcihcbiAgICBtMDA6IG51bWJlcixcbiAgICBtMTA6IG51bWJlcixcbiAgICBtMjA6IG51bWJlcixcbiAgICBtMDE6IG51bWJlcixcbiAgICBtMTE6IG51bWJlcixcbiAgICBtMjE6IG51bWJlcixcbiAgICBtMDI6IG51bWJlcixcbiAgICBtMTI6IG51bWJlcixcbiAgICBtMjI6IG51bWJlclxuICApIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB2WzBdID0gbTAwO1xuICAgIHZbM10gPSBtMDE7XG4gICAgdls2XSA9IG0wMjtcbiAgICB2WzFdID0gbTEwO1xuICAgIHZbNF0gPSBtMTE7XG4gICAgdls3XSA9IG0xMjtcbiAgICB2WzJdID0gbTIwO1xuICAgIHZbNV0gPSBtMjE7XG4gICAgdls4XSA9IG0yMjtcbiAgICByZXR1cm4gbmV3IE1hdHJpeDMzKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5TWF0cml4NDQobWF0OiBNYXRyaXg0NCkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBtYXQuX3ZbMF07XG4gICAgdlsxXSA9IG1hdC5fdlsxXTtcbiAgICB2WzJdID0gbWF0Ll92WzJdO1xuICAgIHZbM10gPSBtYXQuX3ZbNV07XG4gICAgdls0XSA9IG1hdC5fdls2XTtcbiAgICB2WzVdID0gbWF0Ll92WzddO1xuICAgIHZbNl0gPSBtYXQuX3ZbOV07XG4gICAgdls3XSA9IG1hdC5fdlsxMF07XG4gICAgdls4XSA9IG1hdC5fdlsxMV07XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoZmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeDMzKGZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlGbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihmbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHYuc2V0KGZsb2F0MzJBcnJheSk7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUZsb2F0MzJBcnJheVJvd01ham9yKGFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdlszXSA9IGFycmF5WzFdO1xuICAgIHZbNl0gPSBhcnJheVsyXTtcbiAgICB2WzFdID0gYXJyYXlbM107XG4gICAgdls0XSA9IGFycmF5WzRdO1xuICAgIHZbN10gPSBhcnJheVs1XTtcbiAgICB2WzJdID0gYXJyYXlbNl07XG4gICAgdls1XSA9IGFycmF5WzddO1xuICAgIHZbOF0gPSBhcnJheVs4XTtcblxuICAgIHJldHVybiBuZXcgTWF0cml4MzModik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlNYXRyaXgzMyhtYXQ6IElNYXRyaXgzMykge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBtYXQuX3ZbMF07XG4gICAgdlszXSA9IG1hdC5fdlszXTtcbiAgICB2WzZdID0gbWF0Ll92WzZdO1xuICAgIHZbMV0gPSBtYXQuX3ZbMV07XG4gICAgdls0XSA9IG1hdC5fdls0XTtcbiAgICB2WzddID0gbWF0Ll92WzddO1xuICAgIHZbMl0gPSBtYXQuX3ZbMl07XG4gICAgdls1XSA9IG1hdC5fdls1XTtcbiAgICB2WzhdID0gbWF0Ll92WzhdO1xuICAgIHJldHVybiBuZXcgTWF0cml4MzModik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTlDb2x1bW5NYWpvcihhcnJheTogQXJyYXk5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB2LnNldChhcnJheSk7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB2LnNldChhcnJheSk7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5OVJvd01ham9yKGFycmF5OiBBcnJheTk8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBhcnJheVswXTtcbiAgICB2WzNdID0gYXJyYXlbMV07XG4gICAgdls2XSA9IGFycmF5WzJdO1xuICAgIHZbMV0gPSBhcnJheVszXTtcbiAgICB2WzRdID0gYXJyYXlbNF07XG4gICAgdls3XSA9IGFycmF5WzVdO1xuICAgIHZbMl0gPSBhcnJheVs2XTtcbiAgICB2WzVdID0gYXJyYXlbN107XG4gICAgdls4XSA9IGFycmF5WzhdO1xuICAgIHJldHVybiBuZXcgTWF0cml4MzModik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheVJvd01ham9yKGFycmF5OiBBcnJheTxudW1iZXI+KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgdlswXSA9IGFycmF5WzBdO1xuICAgIHZbM10gPSBhcnJheVsxXTtcbiAgICB2WzZdID0gYXJyYXlbMl07XG4gICAgdlsxXSA9IGFycmF5WzNdO1xuICAgIHZbNF0gPSBhcnJheVs0XTtcbiAgICB2WzddID0gYXJyYXlbNV07XG4gICAgdlsyXSA9IGFycmF5WzZdO1xuICAgIHZbNV0gPSBhcnJheVs3XTtcbiAgICB2WzhdID0gYXJyYXlbOF07XG4gICAgcmV0dXJuIG5ldyBNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVF1YXRlcm5pb24ocTogUXVhdGVybmlvbikge1xuICAgIGNvbnN0IHN4ID0gcS5fdlswXSAqIHEuX3ZbMF07XG4gICAgY29uc3Qgc3kgPSBxLl92WzFdICogcS5fdlsxXTtcbiAgICBjb25zdCBzeiA9IHEuX3ZbMl0gKiBxLl92WzJdO1xuICAgIGNvbnN0IGN4ID0gcS5fdlsxXSAqIHEuX3ZbMl07XG4gICAgY29uc3QgY3kgPSBxLl92WzBdICogcS5fdlsyXTtcbiAgICBjb25zdCBjeiA9IHEuX3ZbMF0gKiBxLl92WzFdO1xuICAgIGNvbnN0IHd4ID0gcS5fdlszXSAqIHEuX3ZbMF07XG4gICAgY29uc3Qgd3kgPSBxLl92WzNdICogcS5fdlsxXTtcbiAgICBjb25zdCB3eiA9IHEuX3ZbM10gKiBxLl92WzJdO1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSAxLjAgLSAyLjAgKiAoc3kgKyBzeik7XG4gICAgdlszXSA9IDIuMCAqIChjeiAtIHd6KTtcbiAgICB2WzZdID0gMi4wICogKGN5ICsgd3kpO1xuICAgIHZbMV0gPSAyLjAgKiAoY3ogKyB3eik7XG4gICAgdls0XSA9IDEuMCAtIDIuMCAqIChzeCArIHN6KTtcbiAgICB2WzddID0gMi4wICogKGN4IC0gd3gpO1xuICAgIHZbMl0gPSAyLjAgKiAoY3kgLSB3eSk7XG4gICAgdls1XSA9IDIuMCAqIChjeCArIHd4KTtcbiAgICB2WzhdID0gMS4wIC0gMi4wICogKHN4ICsgc3kpO1xuXG4gICAgcmV0dXJuIG5ldyBNYXRyaXgzMyh2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi9WZWN0b3I0JztcbmltcG9ydCB7IElNYXRyaXgsIElNYXRyaXgzMywgSU1hdHJpeDQ0IH0gZnJvbSAnLi9JTWF0cml4JztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4vTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDQ0IH0gZnJvbSAnLi9NdXRhYmxlTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuL011dGFibGVWZWN0b3I0JztcbmltcG9ydCB7IElWZWN0b3IzIH0gZnJvbSAnLi9JVmVjdG9yJztcbmltcG9ydCB7IElWZWN0b3I0IH0gZnJvbSAnLi9JVmVjdG9yJztcbmltcG9ydCB7IE1hdGhVdGlsIH0gZnJvbSAnLi9NYXRoVXRpbCc7XG5pbXBvcnQgeyBJZGVudGl0eU1hdHJpeDQ0IH0gZnJvbSAnLi9JZGVudGl0eU1hdHJpeDQ0JztcbmltcG9ydCB7IEFic3RyYWN0TWF0cml4IH0gZnJvbSAnLi9BYnN0cmFjdE1hdHJpeCc7XG5pbXBvcnQgeyBBcnJheTE2LCBBcnJheVR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBtdWxUaGF0QW5kVGhpc1RvT3V0QXNNYXQ0NF9vZmZzZXRBc0NvbXBvc2l0aW9uIH0gZnJvbSAnLi9yYXcvcmF3X2V4dGVuc2lvbic7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4vSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmV0dGllci9wcmV0dGllciAqL1xuY29uc3QgRmxvYXRBcnJheSA9IEZsb2F0MzJBcnJheTtcbnR5cGUgRmxvYXRBcnJheSA9IEZsb2F0MzJBcnJheTtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeDQ0IGV4dGVuZHMgQWJzdHJhY3RNYXRyaXggaW1wbGVtZW50cyBJTWF0cml4LCBJTWF0cml4NDQge1xuICBjb25zdHJ1Y3RvcihtOiBGbG9hdEFycmF5KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl92ID0gbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMTAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0yMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTMwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzNdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbNF07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdls1XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIxKCkge1xuICAgIHJldHVybiB0aGlzLl92WzZdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbN107XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMigpIHtcbiAgICByZXR1cm4gdGhpcy5fdls4XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTEyKCkge1xuICAgIHJldHVybiB0aGlzLl92WzldO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTBdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTFdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMDMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTJdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMTMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTNdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTRdO1xuICB9XG5cbiAgcHVibGljIGdldCBtMzMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTVdO1xuICB9XG5cbiAgcHVibGljIGdldCB0cmFuc2xhdGVYKCkge1xuICAgIHJldHVybiB0aGlzLl92WzEyXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRlWSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxM107XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRyYW5zbGF0ZVooKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTRdO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb3NpdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5NYXQ0O1xuICB9XG5cbiAgLyoqXG4gICAqIHplcm8gbWF0cml4KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIE1hdHJpeDQ0LmZyb21Db3B5MTZSb3dNYWpvcigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaWRlbnRpdHkgbWF0cml4XG4gICAqL1xuICBzdGF0aWMgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eU1hdHJpeDQ0KCk7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyBGbG9hdDMyQXJyYXkoMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0cmFuc3Bvc2UgbWF0cml4XG4gICAqL1xuICBzdGF0aWMgdHJhbnNwb3NlKG1hdDogSU1hdHJpeDQ0KSB7XG4gICAgaWYgKG1hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiBtYXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdHJpeDQ0LmZyb21Db3B5RmxvYXQzMkFycmF5Um93TWFqb3IobWF0Ll92KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW52ZXJ0IG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIGludmVydChtYXQ6IElNYXRyaXg0NCk6IElNYXRyaXg0NCB7XG4gICAgaWYgKG1hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiBtYXQ7XG4gICAgfVxuICAgIGNvbnN0IG4wMCA9IG1hdC5fdlswXSAqIG1hdC5fdls1XSAtIG1hdC5fdls0XSAqIG1hdC5fdlsxXTtcbiAgICBjb25zdCBuMDEgPSBtYXQuX3ZbMF0gKiBtYXQuX3ZbOV0gLSBtYXQuX3ZbOF0gKiBtYXQuX3ZbMV07XG4gICAgY29uc3QgbjAyID0gbWF0Ll92WzBdICogbWF0Ll92WzEzXSAtIG1hdC5fdlsxMl0gKiBtYXQuX3ZbMV07XG4gICAgY29uc3QgbjAzID0gbWF0Ll92WzRdICogbWF0Ll92WzldIC0gbWF0Ll92WzhdICogbWF0Ll92WzVdO1xuICAgIGNvbnN0IG4wNCA9IG1hdC5fdls0XSAqIG1hdC5fdlsxM10gLSBtYXQuX3ZbMTJdICogbWF0Ll92WzVdO1xuICAgIGNvbnN0IG4wNSA9IG1hdC5fdls4XSAqIG1hdC5fdlsxM10gLSBtYXQuX3ZbMTJdICogbWF0Ll92WzldO1xuICAgIGNvbnN0IG4wNiA9IG1hdC5fdlsyXSAqIG1hdC5fdls3XSAtIG1hdC5fdls2XSAqIG1hdC5fdlszXTtcbiAgICBjb25zdCBuMDcgPSBtYXQuX3ZbMl0gKiBtYXQuX3ZbMTFdIC0gbWF0Ll92WzEwXSAqIG1hdC5fdlszXTtcbiAgICBjb25zdCBuMDggPSBtYXQuX3ZbMl0gKiBtYXQuX3ZbMTVdIC0gbWF0Ll92WzE0XSAqIG1hdC5fdlszXTtcbiAgICBjb25zdCBuMDkgPSBtYXQuX3ZbNl0gKiBtYXQuX3ZbMTFdIC0gbWF0Ll92WzEwXSAqIG1hdC5fdls3XTtcbiAgICBjb25zdCBuMTAgPSBtYXQuX3ZbNl0gKiBtYXQuX3ZbMTVdIC0gbWF0Ll92WzE0XSAqIG1hdC5fdls3XTtcbiAgICBjb25zdCBuMTEgPSBtYXQuX3ZbMTBdICogbWF0Ll92WzE1XSAtIG1hdC5fdlsxNF0gKiBtYXQuX3ZbMTFdO1xuXG4gICAgY29uc3QgZGV0ID0gbjAwICogbjExIC0gbjAxICogbjEwICsgbjAyICogbjA5ICsgbjAzICogbjA4IC0gbjA0ICogbjA3ICsgbjA1ICogbjA2O1xuICAgIGlmIChkZXQgPT09IDApIHtcbiAgICAgIExvZ2dlci5lcnJvcigndGhlIGRldGVybWluYW50IGlzIDAhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbTAwID0gKG1hdC5fdls1XSAqIG4xMSAtIG1hdC5fdls5XSAqIG4xMCArIG1hdC5fdlsxM10gKiBuMDkpIC8gZGV0O1xuICAgIGNvbnN0IG0wMSA9IChtYXQuX3ZbOF0gKiBuMTAgLSBtYXQuX3ZbNF0gKiBuMTEgLSBtYXQuX3ZbMTJdICogbjA5KSAvIGRldDtcbiAgICBjb25zdCBtMDIgPSAobWF0Ll92WzddICogbjA1IC0gbWF0Ll92WzExXSAqIG4wNCArIG1hdC5fdlsxNV0gKiBuMDMpIC8gZGV0O1xuICAgIGNvbnN0IG0wMyA9IChtYXQuX3ZbMTBdICogbjA0IC0gbWF0Ll92WzZdICogbjA1IC0gbWF0Ll92WzE0XSAqIG4wMykgLyBkZXQ7XG4gICAgY29uc3QgbTEwID0gKG1hdC5fdls5XSAqIG4wOCAtIG1hdC5fdlsxXSAqIG4xMSAtIG1hdC5fdlsxM10gKiBuMDcpIC8gZGV0O1xuICAgIGNvbnN0IG0xMSA9IChtYXQuX3ZbMF0gKiBuMTEgLSBtYXQuX3ZbOF0gKiBuMDggKyBtYXQuX3ZbMTJdICogbjA3KSAvIGRldDtcbiAgICBjb25zdCBtMTIgPSAobWF0Ll92WzExXSAqIG4wMiAtIG1hdC5fdlszXSAqIG4wNSAtIG1hdC5fdlsxNV0gKiBuMDEpIC8gZGV0O1xuICAgIGNvbnN0IG0xMyA9IChtYXQuX3ZbMl0gKiBuMDUgLSBtYXQuX3ZbMTBdICogbjAyICsgbWF0Ll92WzE0XSAqIG4wMSkgLyBkZXQ7XG4gICAgY29uc3QgbTIwID0gKG1hdC5fdlsxXSAqIG4xMCAtIG1hdC5fdls1XSAqIG4wOCArIG1hdC5fdlsxM10gKiBuMDYpIC8gZGV0O1xuICAgIGNvbnN0IG0yMSA9IChtYXQuX3ZbNF0gKiBuMDggLSBtYXQuX3ZbMF0gKiBuMTAgLSBtYXQuX3ZbMTJdICogbjA2KSAvIGRldDtcbiAgICBjb25zdCBtMjIgPSAobWF0Ll92WzNdICogbjA0IC0gbWF0Ll92WzddICogbjAyICsgbWF0Ll92WzE1XSAqIG4wMCkgLyBkZXQ7XG4gICAgY29uc3QgbTIzID0gKG1hdC5fdls2XSAqIG4wMiAtIG1hdC5fdlsyXSAqIG4wNCAtIG1hdC5fdlsxNF0gKiBuMDApIC8gZGV0O1xuICAgIGNvbnN0IG0zMCA9IChtYXQuX3ZbNV0gKiBuMDcgLSBtYXQuX3ZbMV0gKiBuMDkgLSBtYXQuX3ZbOV0gKiBuMDYpIC8gZGV0O1xuICAgIGNvbnN0IG0zMSA9IChtYXQuX3ZbMF0gKiBuMDkgLSBtYXQuX3ZbNF0gKiBuMDcgKyBtYXQuX3ZbOF0gKiBuMDYpIC8gZGV0O1xuICAgIGNvbnN0IG0zMiA9IChtYXQuX3ZbN10gKiBuMDEgLSBtYXQuX3ZbM10gKiBuMDMgLSBtYXQuX3ZbMTFdICogbjAwKSAvIGRldDtcbiAgICBjb25zdCBtMzMgPSAobWF0Ll92WzJdICogbjAzIC0gbWF0Ll92WzZdICogbjAxICsgbWF0Ll92WzEwXSAqIG4wMCkgLyBkZXQ7XG5cbiAgICByZXR1cm4gTWF0cml4NDQuZnJvbUNvcHkxNlJvd01ham9yKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBpbnZlcnRUbyhtYXQ6IElNYXRyaXg0NCwgb3V0TWF0OiBNdXRhYmxlTWF0cml4NDQpIHtcbiAgICBpZiAobWF0LmlzSWRlbnRpdHlNYXRyaXhDbGFzcykge1xuICAgICAgcmV0dXJuIG91dE1hdC5jb3B5Q29tcG9uZW50cyhtYXQpO1xuICAgIH1cbiAgICBjb25zdCBuMDAgPSBtYXQuX3ZbMF0gKiBtYXQuX3ZbNV0gLSBtYXQuX3ZbNF0gKiBtYXQuX3ZbMV07XG4gICAgY29uc3QgbjAxID0gbWF0Ll92WzBdICogbWF0Ll92WzldIC0gbWF0Ll92WzhdICogbWF0Ll92WzFdO1xuICAgIGNvbnN0IG4wMiA9IG1hdC5fdlswXSAqIG1hdC5fdlsxM10gLSBtYXQuX3ZbMTJdICogbWF0Ll92WzFdO1xuICAgIGNvbnN0IG4wMyA9IG1hdC5fdls0XSAqIG1hdC5fdls5XSAtIG1hdC5fdls4XSAqIG1hdC5fdls1XTtcbiAgICBjb25zdCBuMDQgPSBtYXQuX3ZbNF0gKiBtYXQuX3ZbMTNdIC0gbWF0Ll92WzEyXSAqIG1hdC5fdls1XTtcbiAgICBjb25zdCBuMDUgPSBtYXQuX3ZbOF0gKiBtYXQuX3ZbMTNdIC0gbWF0Ll92WzEyXSAqIG1hdC5fdls5XTtcbiAgICBjb25zdCBuMDYgPSBtYXQuX3ZbMl0gKiBtYXQuX3ZbN10gLSBtYXQuX3ZbNl0gKiBtYXQuX3ZbM107XG4gICAgY29uc3QgbjA3ID0gbWF0Ll92WzJdICogbWF0Ll92WzExXSAtIG1hdC5fdlsxMF0gKiBtYXQuX3ZbM107XG4gICAgY29uc3QgbjA4ID0gbWF0Ll92WzJdICogbWF0Ll92WzE1XSAtIG1hdC5fdlsxNF0gKiBtYXQuX3ZbM107XG4gICAgY29uc3QgbjA5ID0gbWF0Ll92WzZdICogbWF0Ll92WzExXSAtIG1hdC5fdlsxMF0gKiBtYXQuX3ZbN107XG4gICAgY29uc3QgbjEwID0gbWF0Ll92WzZdICogbWF0Ll92WzE1XSAtIG1hdC5fdlsxNF0gKiBtYXQuX3ZbN107XG4gICAgY29uc3QgbjExID0gbWF0Ll92WzEwXSAqIG1hdC5fdlsxNV0gLSBtYXQuX3ZbMTRdICogbWF0Ll92WzExXTtcblxuICAgIGNvbnN0IGRldCA9IG4wMCAqIG4xMSAtIG4wMSAqIG4xMCArIG4wMiAqIG4wOSArIG4wMyAqIG4wOCAtIG4wNCAqIG4wNyArIG4wNSAqIG4wNjtcbiAgICBpZiAoZGV0ID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ3RoZSBkZXRlcm1pbmFudCBpcyAwIScpO1xuICAgIH1cblxuICAgIGNvbnN0IG0wMCA9IChtYXQuX3ZbNV0gKiBuMTEgLSBtYXQuX3ZbOV0gKiBuMTAgKyBtYXQuX3ZbMTNdICogbjA5KSAvIGRldDtcbiAgICBjb25zdCBtMDEgPSAobWF0Ll92WzhdICogbjEwIC0gbWF0Ll92WzRdICogbjExIC0gbWF0Ll92WzEyXSAqIG4wOSkgLyBkZXQ7XG4gICAgY29uc3QgbTAyID0gKG1hdC5fdls3XSAqIG4wNSAtIG1hdC5fdlsxMV0gKiBuMDQgKyBtYXQuX3ZbMTVdICogbjAzKSAvIGRldDtcbiAgICBjb25zdCBtMDMgPSAobWF0Ll92WzEwXSAqIG4wNCAtIG1hdC5fdls2XSAqIG4wNSAtIG1hdC5fdlsxNF0gKiBuMDMpIC8gZGV0O1xuICAgIGNvbnN0IG0xMCA9IChtYXQuX3ZbOV0gKiBuMDggLSBtYXQuX3ZbMV0gKiBuMTEgLSBtYXQuX3ZbMTNdICogbjA3KSAvIGRldDtcbiAgICBjb25zdCBtMTEgPSAobWF0Ll92WzBdICogbjExIC0gbWF0Ll92WzhdICogbjA4ICsgbWF0Ll92WzEyXSAqIG4wNykgLyBkZXQ7XG4gICAgY29uc3QgbTEyID0gKG1hdC5fdlsxMV0gKiBuMDIgLSBtYXQuX3ZbM10gKiBuMDUgLSBtYXQuX3ZbMTVdICogbjAxKSAvIGRldDtcbiAgICBjb25zdCBtMTMgPSAobWF0Ll92WzJdICogbjA1IC0gbWF0Ll92WzEwXSAqIG4wMiArIG1hdC5fdlsxNF0gKiBuMDEpIC8gZGV0O1xuICAgIGNvbnN0IG0yMCA9IChtYXQuX3ZbMV0gKiBuMTAgLSBtYXQuX3ZbNV0gKiBuMDggKyBtYXQuX3ZbMTNdICogbjA2KSAvIGRldDtcbiAgICBjb25zdCBtMjEgPSAobWF0Ll92WzRdICogbjA4IC0gbWF0Ll92WzBdICogbjEwIC0gbWF0Ll92WzEyXSAqIG4wNikgLyBkZXQ7XG4gICAgY29uc3QgbTIyID0gKG1hdC5fdlszXSAqIG4wNCAtIG1hdC5fdls3XSAqIG4wMiArIG1hdC5fdlsxNV0gKiBuMDApIC8gZGV0O1xuICAgIGNvbnN0IG0yMyA9IChtYXQuX3ZbNl0gKiBuMDIgLSBtYXQuX3ZbMl0gKiBuMDQgLSBtYXQuX3ZbMTRdICogbjAwKSAvIGRldDtcbiAgICBjb25zdCBtMzAgPSAobWF0Ll92WzVdICogbjA3IC0gbWF0Ll92WzFdICogbjA5IC0gbWF0Ll92WzldICogbjA2KSAvIGRldDtcbiAgICBjb25zdCBtMzEgPSAobWF0Ll92WzBdICogbjA5IC0gbWF0Ll92WzRdICogbjA3ICsgbWF0Ll92WzhdICogbjA2KSAvIGRldDtcbiAgICBjb25zdCBtMzIgPSAobWF0Ll92WzddICogbjAxIC0gbWF0Ll92WzNdICogbjAzIC0gbWF0Ll92WzExXSAqIG4wMCkgLyBkZXQ7XG4gICAgY29uc3QgbTMzID0gKG1hdC5fdlsyXSAqIG4wMyAtIG1hdC5fdls2XSAqIG4wMSArIG1hdC5fdlsxMF0gKiBuMDApIC8gZGV0O1xuXG4gICAgcmV0dXJuIG91dE1hdC5zZXRDb21wb25lbnRzKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdHJhbnNsYXRpb24gTWF0cml4XG4gICAqL1xuICBzdGF0aWMgdHJhbnNsYXRlKHZlYzogVmVjdG9yMykge1xuICAgIHJldHVybiBNYXRyaXg0NC5mcm9tQ29weTE2Um93TWFqb3IoXG4gICAgICAxLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB2ZWMuX3ZbMF0sXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIDAsXG4gICAgICB2ZWMuX3ZbMV0sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICB2ZWMuX3ZbMl0sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgWCBvcmllbnRlZCBSb3RhdGlvbiBNYXRyaXhcbiAgICovXG4gIHN0YXRpYyByb3RhdGVYKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIHJldHVybiBNYXRyaXg0NC5mcm9tQ29weTE2Um93TWFqb3IoMSwgMCwgMCwgMCwgMCwgY29zLCAtc2luLCAwLCAwLCBzaW4sIGNvcywgMCwgMCwgMCwgMCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFkgb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICBzdGF0aWMgcm90YXRlWShyYWRpYW46IG51bWJlcikge1xuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKHJhZGlhbik7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4ocmFkaWFuKTtcbiAgICByZXR1cm4gTWF0cml4NDQuZnJvbUNvcHkxNlJvd01ham9yKGNvcywgMCwgc2luLCAwLCAwLCAxLCAwLCAwLCAtc2luLCAwLCBjb3MsIDAsIDAsIDAsIDAsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBaIG9yaWVudGVkIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZVoocmFkaWFuOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgcmV0dXJuIE1hdHJpeDQ0LmZyb21Db3B5MTZSb3dNYWpvcihjb3MsIC1zaW4sIDAsIDAsIHNpbiwgY29zLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxKTtcbiAgfVxuXG4gIHN0YXRpYyByb3RhdGVYWVooeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikge1xuICAgIGNvbnN0IGNvc1ggPSBNYXRoLmNvcyh4KTtcbiAgICBjb25zdCBzaW5YID0gTWF0aC5zaW4oeCk7XG4gICAgY29uc3QgY29zWSA9IE1hdGguY29zKHkpO1xuICAgIGNvbnN0IHNpblkgPSBNYXRoLnNpbih5KTtcbiAgICBjb25zdCBjb3NaID0gTWF0aC5jb3Moeik7XG4gICAgY29uc3Qgc2luWiA9IE1hdGguc2luKHopO1xuXG4gICAgLy8gY29uc3QgeDAwID0gMTtcbiAgICAvLyBjb25zdCB4MDEgPSAwO1xuICAgIC8vIGNvbnN0IHgwMiA9IDA7XG4gICAgLy8gY29uc3QgeDEwID0gMDtcbiAgICBjb25zdCB4MTEgPSBjb3NYO1xuICAgIGNvbnN0IHgxMiA9IC1zaW5YO1xuICAgIC8vIGNvbnN0IHgyMCA9IDA7XG4gICAgY29uc3QgeDIxID0gc2luWDtcbiAgICBjb25zdCB4MjIgPSBjb3NYO1xuXG4gICAgY29uc3QgeTAwID0gY29zWTtcbiAgICAvLyBjb25zdCB5MDEgPSAwO1xuICAgIGNvbnN0IHkwMiA9IHNpblk7XG4gICAgLy8gY29uc3QgeTEwID0gMDtcbiAgICAvLyBjb25zdCB5MTEgPSAxO1xuICAgIC8vIGNvbnN0IHkxMiA9IDA7XG4gICAgY29uc3QgeTIwID0gLXNpblk7XG4gICAgLy8gY29uc3QgeTIxID0gMDtcbiAgICBjb25zdCB5MjIgPSBjb3NZO1xuXG4gICAgY29uc3QgejAwID0gY29zWjtcbiAgICBjb25zdCB6MDEgPSAtc2luWjtcbiAgICAvLyBjb25zdCB6MDIgPSAwO1xuICAgIGNvbnN0IHoxMCA9IHNpblo7XG4gICAgY29uc3QgejExID0gY29zWjtcbiAgICAvLyBjb25zdCB6MTIgPSAwO1xuICAgIC8vIGNvbnN0IHoyMCA9IDA7XG4gICAgLy8gY29uc3QgejIxID0gMDtcbiAgICAvLyBjb25zdCB6MjIgPSAxO1xuXG4gICAgLy8gWSAqIFhcbiAgICBjb25zdCB5eDAwID0geTAwO1xuICAgIGNvbnN0IHl4MDEgPSB5MDIgKiB4MjE7XG4gICAgY29uc3QgeXgwMiA9IHkwMiAqIHgyMjtcbiAgICAvL2NvbnN0IHl4MTAgPSAwO1xuICAgIGNvbnN0IHl4MTEgPSB4MTE7XG4gICAgY29uc3QgeXgxMiA9IHgxMjtcbiAgICBjb25zdCB5eDIwID0geTIwO1xuICAgIGNvbnN0IHl4MjEgPSB5MjIgKiB4MjE7XG4gICAgY29uc3QgeXgyMiA9IHkyMiAqIHgyMjtcblxuICAgIC8vIFogKiBZICogWFxuICAgIGNvbnN0IG0wMCA9IHowMCAqIHl4MDA7XG4gICAgY29uc3QgbTAxID0gejAwICogeXgwMSArIHowMSAqIHl4MTE7XG4gICAgY29uc3QgbTAyID0gejAwICogeXgwMiArIHowMSAqIHl4MTI7XG4gICAgY29uc3QgbTEwID0gejEwICogeXgwMDtcbiAgICBjb25zdCBtMTEgPSB6MTAgKiB5eDAxICsgejExICogeXgxMTtcbiAgICBjb25zdCBtMTIgPSB6MTAgKiB5eDAyICsgejExICogeXgxMjtcbiAgICBjb25zdCBtMjAgPSB5eDIwO1xuICAgIGNvbnN0IG0yMSA9IHl4MjE7XG4gICAgY29uc3QgbTIyID0geXgyMjtcblxuICAgIGNvbnN0IG0wMyA9IDA7XG4gICAgY29uc3QgbTEzID0gMDtcbiAgICBjb25zdCBtMjMgPSAwO1xuICAgIGNvbnN0IG0zMCA9IDA7XG4gICAgY29uc3QgbTMxID0gMDtcbiAgICBjb25zdCBtMzIgPSAwO1xuICAgIGNvbnN0IG0zMyA9IDE7XG5cbiAgICByZXR1cm4gTWF0cml4NDQuZnJvbUNvcHkxNlJvd01ham9yKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyByb3RhdGUodmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiB0aGlzLnJvdGF0ZVhZWih2ZWMuX3ZbMF0sIHZlYy5fdlsxXSwgdmVjLl92WzJdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU2NhbGUgTWF0cml4XG4gICAqL1xuICBzdGF0aWMgc2NhbGUodmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBNYXRyaXg0NC5mcm9tQ29weTE2Um93TWFqb3IoXG4gICAgICB2ZWMuX3ZbMF0sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdmVjLl92WzFdLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHZlYy5fdlsyXSxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSBtYXRyaXhlc1xuICAgKi9cbiAgc3RhdGljIG11bHRpcGx5KGxfbWF0OiBJTWF0cml4NDQsIHJfbWF0OiBJTWF0cml4NDQpOiBJTWF0cml4NDQge1xuICAgIGlmIChsX21hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiByX21hdDtcbiAgICB9IGVsc2UgaWYgKHJfbWF0LmlzSWRlbnRpdHlNYXRyaXhDbGFzcykge1xuICAgICAgcmV0dXJuIGxfbWF0O1xuICAgIH1cblxuICAgIGNvbnN0IGx2ID0gKGxfbWF0IGFzIE1hdHJpeDQ0KS5fdjtcbiAgICBjb25zdCBydiA9IChyX21hdCBhcyBNYXRyaXg0NCkuX3Y7XG4gICAgY29uc3QgbTAwID0gbHZbMF0gKiBydlswXSArIGx2WzRdICogcnZbMV0gKyBsdls4XSAqIHJ2WzJdICsgbHZbMTJdICogcnZbM107XG4gICAgY29uc3QgbTEwID0gbHZbMV0gKiBydlswXSArIGx2WzVdICogcnZbMV0gKyBsdls5XSAqIHJ2WzJdICsgbHZbMTNdICogcnZbM107XG4gICAgY29uc3QgbTIwID0gbHZbMl0gKiBydlswXSArIGx2WzZdICogcnZbMV0gKyBsdlsxMF0gKiBydlsyXSArIGx2WzE0XSAqIHJ2WzNdO1xuICAgIGNvbnN0IG0zMCA9IGx2WzNdICogcnZbMF0gKyBsdls3XSAqIHJ2WzFdICsgbHZbMTFdICogcnZbMl0gKyBsdlsxNV0gKiBydlszXTtcblxuICAgIGNvbnN0IG0wMSA9IGx2WzBdICogcnZbNF0gKyBsdls0XSAqIHJ2WzVdICsgbHZbOF0gKiBydls2XSArIGx2WzEyXSAqIHJ2WzddO1xuICAgIGNvbnN0IG0xMSA9IGx2WzFdICogcnZbNF0gKyBsdls1XSAqIHJ2WzVdICsgbHZbOV0gKiBydls2XSArIGx2WzEzXSAqIHJ2WzddO1xuICAgIGNvbnN0IG0yMSA9IGx2WzJdICogcnZbNF0gKyBsdls2XSAqIHJ2WzVdICsgbHZbMTBdICogcnZbNl0gKyBsdlsxNF0gKiBydls3XTtcbiAgICBjb25zdCBtMzEgPSBsdlszXSAqIHJ2WzRdICsgbHZbN10gKiBydls1XSArIGx2WzExXSAqIHJ2WzZdICsgbHZbMTVdICogcnZbN107XG5cbiAgICBjb25zdCBtMDIgPSBsdlswXSAqIHJ2WzhdICsgbHZbNF0gKiBydls5XSArIGx2WzhdICogcnZbMTBdICsgbHZbMTJdICogcnZbMTFdO1xuICAgIGNvbnN0IG0xMiA9IGx2WzFdICogcnZbOF0gKyBsdls1XSAqIHJ2WzldICsgbHZbOV0gKiBydlsxMF0gKyBsdlsxM10gKiBydlsxMV07XG4gICAgY29uc3QgbTIyID0gbHZbMl0gKiBydls4XSArIGx2WzZdICogcnZbOV0gKyBsdlsxMF0gKiBydlsxMF0gKyBsdlsxNF0gKiBydlsxMV07XG4gICAgY29uc3QgbTMyID0gbHZbM10gKiBydls4XSArIGx2WzddICogcnZbOV0gKyBsdlsxMV0gKiBydlsxMF0gKyBsdlsxNV0gKiBydlsxMV07XG5cbiAgICBjb25zdCBtMDMgPSBsdlswXSAqIHJ2WzEyXSArIGx2WzRdICogcnZbMTNdICsgbHZbOF0gKiBydlsxNF0gKyBsdlsxMl0gKiBydlsxNV07XG4gICAgY29uc3QgbTEzID0gbHZbMV0gKiBydlsxMl0gKyBsdls1XSAqIHJ2WzEzXSArIGx2WzldICogcnZbMTRdICsgbHZbMTNdICogcnZbMTVdO1xuICAgIGNvbnN0IG0yMyA9IGx2WzJdICogcnZbMTJdICsgbHZbNl0gKiBydlsxM10gKyBsdlsxMF0gKiBydlsxNF0gKyBsdlsxNF0gKiBydlsxNV07XG4gICAgY29uc3QgbTMzID0gbHZbM10gKiBydlsxMl0gKyBsdls3XSAqIHJ2WzEzXSArIGx2WzExXSAqIHJ2WzE0XSArIGx2WzE1XSAqIHJ2WzE1XTtcblxuICAgIHJldHVybiBNYXRyaXg0NC5mcm9tQ29weTE2Um93TWFqb3IoXG4gICAgICBtMDAsXG4gICAgICBtMDEsXG4gICAgICBtMDIsXG4gICAgICBtMDMsXG4gICAgICBtMTAsXG4gICAgICBtMTEsXG4gICAgICBtMTIsXG4gICAgICBtMTMsXG4gICAgICBtMjAsXG4gICAgICBtMjEsXG4gICAgICBtMjIsXG4gICAgICBtMjMsXG4gICAgICBtMzAsXG4gICAgICBtMzEsXG4gICAgICBtMzIsXG4gICAgICBtMzNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5IG1hdHJpeGVzXG4gICAqL1xuICBzdGF0aWMgbXVsdGlwbHlUbyhsX21hdDogSU1hdHJpeDQ0LCByX21hdDogSU1hdHJpeDQ0LCBvdXRNYXQ6IE11dGFibGVNYXRyaXg0NCkge1xuICAgIGlmIChsX21hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiBvdXRNYXQuY29weUNvbXBvbmVudHMocl9tYXQpO1xuICAgIH0gZWxzZSBpZiAocl9tYXQuaXNJZGVudGl0eU1hdHJpeENsYXNzKSB7XG4gICAgICByZXR1cm4gb3V0TWF0LmNvcHlDb21wb25lbnRzKGxfbWF0KTtcbiAgICB9XG5cbiAgICBjb25zdCBsdiA9IChsX21hdCBhcyBNYXRyaXg0NCkuX3Y7XG4gICAgY29uc3QgcnYgPSAocl9tYXQgYXMgTWF0cml4NDQpLl92O1xuICAgIGNvbnN0IG0wMCA9IGx2WzBdICogcnZbMF0gKyBsdls0XSAqIHJ2WzFdICsgbHZbOF0gKiBydlsyXSArIGx2WzEyXSAqIHJ2WzNdO1xuICAgIGNvbnN0IG0xMCA9IGx2WzFdICogcnZbMF0gKyBsdls1XSAqIHJ2WzFdICsgbHZbOV0gKiBydlsyXSArIGx2WzEzXSAqIHJ2WzNdO1xuICAgIGNvbnN0IG0yMCA9IGx2WzJdICogcnZbMF0gKyBsdls2XSAqIHJ2WzFdICsgbHZbMTBdICogcnZbMl0gKyBsdlsxNF0gKiBydlszXTtcbiAgICBjb25zdCBtMzAgPSBsdlszXSAqIHJ2WzBdICsgbHZbN10gKiBydlsxXSArIGx2WzExXSAqIHJ2WzJdICsgbHZbMTVdICogcnZbM107XG5cbiAgICBjb25zdCBtMDEgPSBsdlswXSAqIHJ2WzRdICsgbHZbNF0gKiBydls1XSArIGx2WzhdICogcnZbNl0gKyBsdlsxMl0gKiBydls3XTtcbiAgICBjb25zdCBtMTEgPSBsdlsxXSAqIHJ2WzRdICsgbHZbNV0gKiBydls1XSArIGx2WzldICogcnZbNl0gKyBsdlsxM10gKiBydls3XTtcbiAgICBjb25zdCBtMjEgPSBsdlsyXSAqIHJ2WzRdICsgbHZbNl0gKiBydls1XSArIGx2WzEwXSAqIHJ2WzZdICsgbHZbMTRdICogcnZbN107XG4gICAgY29uc3QgbTMxID0gbHZbM10gKiBydls0XSArIGx2WzddICogcnZbNV0gKyBsdlsxMV0gKiBydls2XSArIGx2WzE1XSAqIHJ2WzddO1xuXG4gICAgY29uc3QgbTAyID0gbHZbMF0gKiBydls4XSArIGx2WzRdICogcnZbOV0gKyBsdls4XSAqIHJ2WzEwXSArIGx2WzEyXSAqIHJ2WzExXTtcbiAgICBjb25zdCBtMTIgPSBsdlsxXSAqIHJ2WzhdICsgbHZbNV0gKiBydls5XSArIGx2WzldICogcnZbMTBdICsgbHZbMTNdICogcnZbMTFdO1xuICAgIGNvbnN0IG0yMiA9IGx2WzJdICogcnZbOF0gKyBsdls2XSAqIHJ2WzldICsgbHZbMTBdICogcnZbMTBdICsgbHZbMTRdICogcnZbMTFdO1xuICAgIGNvbnN0IG0zMiA9IGx2WzNdICogcnZbOF0gKyBsdls3XSAqIHJ2WzldICsgbHZbMTFdICogcnZbMTBdICsgbHZbMTVdICogcnZbMTFdO1xuXG4gICAgY29uc3QgbTAzID0gbHZbMF0gKiBydlsxMl0gKyBsdls0XSAqIHJ2WzEzXSArIGx2WzhdICogcnZbMTRdICsgbHZbMTJdICogcnZbMTVdO1xuICAgIGNvbnN0IG0xMyA9IGx2WzFdICogcnZbMTJdICsgbHZbNV0gKiBydlsxM10gKyBsdls5XSAqIHJ2WzE0XSArIGx2WzEzXSAqIHJ2WzE1XTtcbiAgICBjb25zdCBtMjMgPSBsdlsyXSAqIHJ2WzEyXSArIGx2WzZdICogcnZbMTNdICsgbHZbMTBdICogcnZbMTRdICsgbHZbMTRdICogcnZbMTVdO1xuICAgIGNvbnN0IG0zMyA9IGx2WzNdICogcnZbMTJdICsgbHZbN10gKiBydlsxM10gKyBsdlsxMV0gKiBydlsxNF0gKyBsdlsxNV0gKiBydlsxNV07XG5cbiAgICByZXR1cm4gb3V0TWF0LnNldENvbXBvbmVudHMoXG4gICAgICBtMDAsXG4gICAgICBtMDEsXG4gICAgICBtMDIsXG4gICAgICBtMDMsXG4gICAgICBtMTAsXG4gICAgICBtMTEsXG4gICAgICBtMTIsXG4gICAgICBtMTMsXG4gICAgICBtMjAsXG4gICAgICBtMjEsXG4gICAgICBtMjIsXG4gICAgICBtMjMsXG4gICAgICBtMzAsXG4gICAgICBtMzEsXG4gICAgICBtMzIsXG4gICAgICBtMzNcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VHlwZWRBcnJheVRvKFxuICAgIGxfbWF0OiBJTWF0cml4NDQsXG4gICAgcl9hcnJheTogQXJyYXlUeXBlLFxuICAgIG91dE1hdDogTXV0YWJsZU1hdHJpeDQ0LFxuICAgIG9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlclxuICApIHtcbiAgICAocl9hcnJheSBhcyBhbnkpW211bFRoYXRBbmRUaGlzVG9PdXRBc01hdDQ0X29mZnNldEFzQ29tcG9zaXRpb25dKFxuICAgICAgb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgICAgIGxfbWF0Ll92LFxuICAgICAgMCxcbiAgICAgIG91dE1hdC5fdlxuICAgICk7XG5cbiAgICByZXR1cm4gb3V0TWF0O1xuICB9XG5cbiAgc3RhdGljIGZyb21RdWF0ZXJuaW9uVG8ocXVhdDogSVF1YXRlcm5pb24sIG91dE1hdDogTXV0YWJsZU1hdHJpeDQ0KSB7XG4gICAgY29uc3Qgc3ggPSBxdWF0Ll92WzBdICogcXVhdC5fdlswXTtcbiAgICBjb25zdCBzeSA9IHF1YXQuX3ZbMV0gKiBxdWF0Ll92WzFdO1xuICAgIGNvbnN0IHN6ID0gcXVhdC5fdlsyXSAqIHF1YXQuX3ZbMl07XG4gICAgY29uc3QgY3ggPSBxdWF0Ll92WzFdICogcXVhdC5fdlsyXTtcbiAgICBjb25zdCBjeSA9IHF1YXQuX3ZbMF0gKiBxdWF0Ll92WzJdO1xuICAgIGNvbnN0IGN6ID0gcXVhdC5fdlswXSAqIHF1YXQuX3ZbMV07XG4gICAgY29uc3Qgd3ggPSBxdWF0Ll92WzNdICogcXVhdC5fdlswXTtcbiAgICBjb25zdCB3eSA9IHF1YXQuX3ZbM10gKiBxdWF0Ll92WzFdO1xuICAgIGNvbnN0IHd6ID0gcXVhdC5fdlszXSAqIHF1YXQuX3ZbMl07XG5cbiAgICBjb25zdCBtMDAgPSAxLjAgLSAyLjAgKiAoc3kgKyBzeik7XG4gICAgY29uc3QgbTAxID0gMi4wICogKGN6IC0gd3opO1xuICAgIGNvbnN0IG0wMiA9IDIuMCAqIChjeSArIHd5KTtcbiAgICBjb25zdCBtMDMgPSAwO1xuICAgIGNvbnN0IG0xMCA9IDIuMCAqIChjeiArIHd6KTtcbiAgICBjb25zdCBtMTEgPSAxLjAgLSAyLjAgKiAoc3ggKyBzeik7XG4gICAgY29uc3QgbTEyID0gMi4wICogKGN4IC0gd3gpO1xuICAgIGNvbnN0IG0xMyA9IDA7XG4gICAgY29uc3QgbTIwID0gMi4wICogKGN5IC0gd3kpO1xuICAgIGNvbnN0IG0yMSA9IDIuMCAqIChjeCArIHd4KTtcbiAgICBjb25zdCBtMjIgPSAxLjAgLSAyLjAgKiAoc3ggKyBzeSk7XG4gICAgY29uc3QgbTIzID0gMDtcbiAgICBjb25zdCBtMzAgPSAwO1xuICAgIGNvbnN0IG0zMSA9IDA7XG4gICAgY29uc3QgbTMyID0gMDtcbiAgICBjb25zdCBtMzMgPSAxO1xuXG4gICAgcmV0dXJuIG91dE1hdC5zZXRDb21wb25lbnRzKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl92WzBdICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLl92WzRdICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLl92WzhdICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLl92WzEyXSArXG4gICAgICAnIFxcbicgK1xuICAgICAgdGhpcy5fdlsxXSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdls1XSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdls5XSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdlsxM10gK1xuICAgICAgJyBcXG4nICtcbiAgICAgIHRoaXMuX3ZbMl0gK1xuICAgICAgJyAnICtcbiAgICAgIHRoaXMuX3ZbNl0gK1xuICAgICAgJyAnICtcbiAgICAgIHRoaXMuX3ZbMTBdICtcbiAgICAgICcgJyArXG4gICAgICB0aGlzLl92WzE0XSArXG4gICAgICAnIFxcbicgK1xuICAgICAgdGhpcy5fdlszXSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdls3XSArXG4gICAgICAnICcgK1xuICAgICAgdGhpcy5fdlsxMV0gK1xuICAgICAgJyAnICtcbiAgICAgIHRoaXMuX3ZbMTVdICtcbiAgICAgICcgXFxuJ1xuICAgICk7XG4gIH1cblxuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzBdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbNF0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdls4XSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzEyXSkgK1xuICAgICAgJyBcXG4nICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzFdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbNV0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdls5XSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzEzXSkgK1xuICAgICAgJyBcXG4nICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzJdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbNl0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlsxMF0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlsxNF0pICtcbiAgICAgICcgXFxuJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlszXSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzddKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMTFdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMTVdKSArXG4gICAgICAnIFxcbidcbiAgICApO1xuICB9XG5cbiAgZmxhdHRlbkFzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX3ZbMF0sXG4gICAgICB0aGlzLl92WzFdLFxuICAgICAgdGhpcy5fdlsyXSxcbiAgICAgIHRoaXMuX3ZbM10sXG4gICAgICB0aGlzLl92WzRdLFxuICAgICAgdGhpcy5fdls1XSxcbiAgICAgIHRoaXMuX3ZbNl0sXG4gICAgICB0aGlzLl92WzddLFxuICAgICAgdGhpcy5fdls4XSxcbiAgICAgIHRoaXMuX3ZbOV0sXG4gICAgICB0aGlzLl92WzEwXSxcbiAgICAgIHRoaXMuX3ZbMTFdLFxuICAgICAgdGhpcy5fdlsxMl0sXG4gICAgICB0aGlzLl92WzEzXSxcbiAgICAgIHRoaXMuX3ZbMTRdLFxuICAgICAgdGhpcy5fdlsxNV0sXG4gICAgXTtcbiAgfVxuXG4gIGlzRHVtbXkoKSB7XG4gICAgaWYgKHRoaXMuX3YubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzRXF1YWwobWF0OiBJTWF0cml4NDQsIGRlbHRhOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTikge1xuICAgIGNvbnN0IHYgPSAobWF0IGFzIE1hdHJpeDQ0KS5fdjtcbiAgICBpZiAoXG4gICAgICBNYXRoLmFicyh2WzBdIC0gdGhpcy5fdlswXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxXSAtIHRoaXMuX3ZbMV0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKHZbMl0gLSB0aGlzLl92WzJdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyh2WzNdIC0gdGhpcy5fdlszXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModls0XSAtIHRoaXMuX3ZbNF0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKHZbNV0gLSB0aGlzLl92WzVdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyh2WzZdIC0gdGhpcy5fdls2XSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModls3XSAtIHRoaXMuX3ZbN10pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKHZbOF0gLSB0aGlzLl92WzhdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyh2WzldIC0gdGhpcy5fdls5XSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxMF0gLSB0aGlzLl92WzEwXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxMV0gLSB0aGlzLl92WzExXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxMl0gLSB0aGlzLl92WzEyXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxM10gLSB0aGlzLl92WzEzXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxNF0gLSB0aGlzLl92WzE0XSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnModlsxNV0gLSB0aGlzLl92WzE1XSkgPCBkZWx0YVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1N0cmljdEVxdWFsKG1hdDogSU1hdHJpeDQ0KSB7XG4gICAgaWYgKFxuICAgICAgbWF0Ll92WzBdID09PSB0aGlzLl92WzBdICYmXG4gICAgICBtYXQuX3ZbMV0gPT09IHRoaXMuX3ZbMV0gJiZcbiAgICAgIG1hdC5fdlsyXSA9PT0gdGhpcy5fdlsyXSAmJlxuICAgICAgbWF0Ll92WzNdID09PSB0aGlzLl92WzNdICYmXG4gICAgICBtYXQuX3ZbNF0gPT09IHRoaXMuX3ZbNF0gJiZcbiAgICAgIG1hdC5fdls1XSA9PT0gdGhpcy5fdls1XSAmJlxuICAgICAgbWF0Ll92WzZdID09PSB0aGlzLl92WzZdICYmXG4gICAgICBtYXQuX3ZbN10gPT09IHRoaXMuX3ZbN10gJiZcbiAgICAgIG1hdC5fdls4XSA9PT0gdGhpcy5fdls4XSAmJlxuICAgICAgbWF0Ll92WzldID09PSB0aGlzLl92WzldICYmXG4gICAgICBtYXQuX3ZbMTBdID09PSB0aGlzLl92WzEwXSAmJlxuICAgICAgbWF0Ll92WzExXSA9PT0gdGhpcy5fdlsxMV0gJiZcbiAgICAgIG1hdC5fdlsxMl0gPT09IHRoaXMuX3ZbMTJdICYmXG4gICAgICBtYXQuX3ZbMTNdID09PSB0aGlzLl92WzEzXSAmJlxuICAgICAgbWF0Ll92WzE0XSA9PT0gdGhpcy5fdlsxNF0gJiZcbiAgICAgIG1hdC5fdlsxNV0gPT09IHRoaXMuX3ZbMTVdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdltyb3dfaSArIGNvbHVtbl9pICogNF07XG4gIH1cblxuICBkZXRlcm1pbmFudCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fdlswXSAqIHRoaXMuX3ZbNV0gKiB0aGlzLl92WzEwXSAqIHRoaXMuX3ZbMTVdICtcbiAgICAgIHRoaXMuX3ZbMF0gKiB0aGlzLl92WzldICogdGhpcy5fdlsxNF0gKiB0aGlzLl92WzddICtcbiAgICAgIHRoaXMuX3ZbMF0gKiB0aGlzLl92WzEzXSAqIHRoaXMuX3ZbNl0gKiB0aGlzLl92WzExXSArXG4gICAgICB0aGlzLl92WzRdICogdGhpcy5fdlsxXSAqIHRoaXMuX3ZbMTRdICogdGhpcy5fdlsxMV0gK1xuICAgICAgdGhpcy5fdls0XSAqIHRoaXMuX3ZbOV0gKiB0aGlzLl92WzJdICogdGhpcy5fdlsxNV0gK1xuICAgICAgdGhpcy5fdls0XSAqIHRoaXMuX3ZbMTNdICogdGhpcy5fdlsxMF0gKiB0aGlzLl92WzNdICtcbiAgICAgIHRoaXMuX3ZbOF0gKiB0aGlzLl92WzFdICogdGhpcy5fdls2XSAqIHRoaXMuX3ZbMTVdICtcbiAgICAgIHRoaXMuX3ZbOF0gKiB0aGlzLl92WzVdICogdGhpcy5fdlsxNF0gKiB0aGlzLl92WzNdICtcbiAgICAgIHRoaXMuX3ZbOF0gKiB0aGlzLl92WzEzXSAqIHRoaXMuX3ZbMl0gKiB0aGlzLl92WzddICtcbiAgICAgIHRoaXMuX3ZbMTJdICogdGhpcy5fdlsxXSAqIHRoaXMuX3ZbMTBdICogdGhpcy5fdls3XSArXG4gICAgICB0aGlzLl92WzEyXSAqIHRoaXMuX3ZbNV0gKiB0aGlzLl92WzJdICogdGhpcy5fdlsxMV0gK1xuICAgICAgdGhpcy5fdlsxMl0gKiB0aGlzLl92WzldICogdGhpcy5fdls2XSAqIHRoaXMuX3ZbM10gLVxuICAgICAgdGhpcy5fdlswXSAqIHRoaXMuX3ZbNV0gKiB0aGlzLl92WzE0XSAqIHRoaXMuX3ZbMTFdIC1cbiAgICAgIHRoaXMuX3ZbMF0gKiB0aGlzLl92WzldICogdGhpcy5fdls2XSAqIHRoaXMuX3ZbMTVdIC1cbiAgICAgIHRoaXMuX3ZbMF0gKiB0aGlzLl92WzEzXSAqIHRoaXMuX3ZbMTBdICogdGhpcy5fdls3XSAtXG4gICAgICB0aGlzLl92WzRdICogdGhpcy5fdlsxXSAqIHRoaXMuX3ZbMTBdICogdGhpcy5fdlsxNV0gLVxuICAgICAgdGhpcy5fdls0XSAqIHRoaXMuX3ZbOV0gKiB0aGlzLl92WzE0XSAqIHRoaXMuX3ZbM10gLVxuICAgICAgdGhpcy5fdls0XSAqIHRoaXMuX3ZbMTNdICogdGhpcy5fdlsyXSAqIHRoaXMuX3ZbMTFdIC1cbiAgICAgIHRoaXMuX3ZbOF0gKiB0aGlzLl92WzFdICogdGhpcy5fdlsxNF0gKiB0aGlzLl92WzddIC1cbiAgICAgIHRoaXMuX3ZbOF0gKiB0aGlzLl92WzVdICogdGhpcy5fdlsyXSAqIHRoaXMuX3ZbMTVdIC1cbiAgICAgIHRoaXMuX3ZbOF0gKiB0aGlzLl92WzEzXSAqIHRoaXMuX3ZbNl0gKiB0aGlzLl92WzNdIC1cbiAgICAgIHRoaXMuX3ZbMTJdICogdGhpcy5fdlsxXSAqIHRoaXMuX3ZbNl0gKiB0aGlzLl92WzExXSAtXG4gICAgICB0aGlzLl92WzEyXSAqIHRoaXMuX3ZbNV0gKiB0aGlzLl92WzEwXSAqIHRoaXMuX3ZbM10gLVxuICAgICAgdGhpcy5fdlsxMl0gKiB0aGlzLl92WzldICogdGhpcy5fdlsyXSAqIHRoaXMuX3ZbN11cbiAgICApO1xuICB9XG5cbiAgbXVsdGlwbHlWZWN0b3IodmVjOiBJVmVjdG9yNCk6IElWZWN0b3I0IHtcbiAgICBjb25zdCB4ID1cbiAgICAgIHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gK1xuICAgICAgdGhpcy5fdls0XSAqIHZlYy5fdlsxXSArXG4gICAgICB0aGlzLl92WzhdICogdmVjLl92WzJdICtcbiAgICAgIHRoaXMuX3ZbMTJdICogdmVjLl92WzNdO1xuICAgIGNvbnN0IHkgPVxuICAgICAgdGhpcy5fdlsxXSAqIHZlYy5fdlswXSArXG4gICAgICB0aGlzLl92WzVdICogdmVjLl92WzFdICtcbiAgICAgIHRoaXMuX3ZbOV0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxM10gKiB2ZWMuX3ZbM107XG4gICAgY29uc3QgeiA9XG4gICAgICB0aGlzLl92WzJdICogdmVjLl92WzBdICtcbiAgICAgIHRoaXMuX3ZbNl0gKiB2ZWMuX3ZbMV0gK1xuICAgICAgdGhpcy5fdlsxMF0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxNF0gKiB2ZWMuX3ZbM107XG4gICAgY29uc3QgdyA9XG4gICAgICB0aGlzLl92WzNdICogdmVjLl92WzBdICtcbiAgICAgIHRoaXMuX3ZbN10gKiB2ZWMuX3ZbMV0gK1xuICAgICAgdGhpcy5fdlsxMV0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxNV0gKiB2ZWMuX3ZbM107XG5cbiAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFt4LCB5LCB6LCB3XSk7XG4gIH1cblxuICBtdWx0aXBseVZlY3RvclRvKHZlYzogSVZlY3RvcjQsIG91dFZlYzogTXV0YWJsZVZlY3RvcjQpIHtcbiAgICBjb25zdCB4ID1cbiAgICAgIHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gK1xuICAgICAgdGhpcy5fdls0XSAqIHZlYy5fdlsxXSArXG4gICAgICB0aGlzLl92WzhdICogdmVjLl92WzJdICtcbiAgICAgIHRoaXMuX3ZbMTJdICogdmVjLl92WzNdO1xuICAgIGNvbnN0IHkgPVxuICAgICAgdGhpcy5fdlsxXSAqIHZlYy5fdlswXSArXG4gICAgICB0aGlzLl92WzVdICogdmVjLl92WzFdICtcbiAgICAgIHRoaXMuX3ZbOV0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxM10gKiB2ZWMuX3ZbM107XG4gICAgY29uc3QgeiA9XG4gICAgICB0aGlzLl92WzJdICogdmVjLl92WzBdICtcbiAgICAgIHRoaXMuX3ZbNl0gKiB2ZWMuX3ZbMV0gK1xuICAgICAgdGhpcy5fdlsxMF0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxNF0gKiB2ZWMuX3ZbM107XG4gICAgY29uc3QgdyA9XG4gICAgICB0aGlzLl92WzNdICogdmVjLl92WzBdICtcbiAgICAgIHRoaXMuX3ZbN10gKiB2ZWMuX3ZbMV0gK1xuICAgICAgdGhpcy5fdlsxMV0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxNV0gKiB2ZWMuX3ZbM107XG4gICAgb3V0VmVjLl92WzBdID0geDtcbiAgICBvdXRWZWMuX3ZbMV0gPSB5O1xuICAgIG91dFZlYy5fdlsyXSA9IHo7XG4gICAgb3V0VmVjLl92WzNdID0gdztcblxuICAgIHJldHVybiBvdXRWZWM7XG4gIH1cblxuICBtdWx0aXBseVZlY3RvclRvVmVjMyh2ZWM6IElWZWN0b3I0LCBvdXRWZWM6IE11dGFibGVWZWN0b3IzKSB7XG4gICAgY29uc3QgeCA9XG4gICAgICB0aGlzLl92WzBdICogdmVjLl92WzBdICtcbiAgICAgIHRoaXMuX3ZbNF0gKiB2ZWMuX3ZbMV0gK1xuICAgICAgdGhpcy5fdls4XSAqIHZlYy5fdlsyXSArXG4gICAgICB0aGlzLl92WzEyXSAqIHZlYy5fdlszXTtcbiAgICBjb25zdCB5ID1cbiAgICAgIHRoaXMuX3ZbMV0gKiB2ZWMuX3ZbMF0gK1xuICAgICAgdGhpcy5fdls1XSAqIHZlYy5fdlsxXSArXG4gICAgICB0aGlzLl92WzldICogdmVjLl92WzJdICtcbiAgICAgIHRoaXMuX3ZbMTNdICogdmVjLl92WzNdO1xuICAgIGNvbnN0IHogPVxuICAgICAgdGhpcy5fdlsyXSAqIHZlYy5fdlswXSArXG4gICAgICB0aGlzLl92WzZdICogdmVjLl92WzFdICtcbiAgICAgIHRoaXMuX3ZbMTBdICogdmVjLl92WzJdICtcbiAgICAgIHRoaXMuX3ZbMTRdICogdmVjLl92WzNdO1xuICAgIG91dFZlYy5fdlswXSA9IHg7XG4gICAgb3V0VmVjLl92WzFdID0geTtcbiAgICBvdXRWZWMuX3ZbMl0gPSB6O1xuXG4gICAgcmV0dXJuIG91dFZlYztcbiAgfVxuXG4gIG11bHRpcGx5VmVjdG9yMyh2ZWM6IElWZWN0b3IzKTogSVZlY3RvcjMge1xuICAgIGNvbnN0IHggPVxuICAgICAgdGhpcy5fdlswXSAqIHZlYy5fdlswXSArIHRoaXMuX3ZbNF0gKiB2ZWMuX3ZbMV0gKyB0aGlzLl92WzhdICogdmVjLl92WzJdICsgdGhpcy5fdlsxMl07IC8vIHJlZ2FyZHMgdmVjLncodmVjLl92WzNdKSBhcyAxXG4gICAgY29uc3QgeSA9XG4gICAgICB0aGlzLl92WzFdICogdmVjLl92WzBdICsgdGhpcy5fdls1XSAqIHZlYy5fdlsxXSArIHRoaXMuX3ZbOV0gKiB2ZWMuX3ZbMl0gKyB0aGlzLl92WzEzXTtcbiAgICBjb25zdCB6ID1cbiAgICAgIHRoaXMuX3ZbMl0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzZdICogdmVjLl92WzFdICsgdGhpcy5fdlsxMF0gKiB2ZWMuX3ZbMl0gKyB0aGlzLl92WzE0XTtcblxuICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW3gsIHksIHpdKTtcbiAgfVxuXG4gIG11bHRpcGx5VmVjdG9yM1RvKHZlYzogSVZlY3RvcjMsIG91dFZlYzogTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBjb25zdCB4ID1cbiAgICAgIHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzRdICogdmVjLl92WzFdICsgdGhpcy5fdls4XSAqIHZlYy5fdlsyXSArIHRoaXMuX3ZbMTJdOyAvLyByZWdhcmRzIHZlYy53KHZlYy5fdlszXSkgYXMgMVxuICAgIGNvbnN0IHkgPVxuICAgICAgdGhpcy5fdlsxXSAqIHZlYy5fdlswXSArIHRoaXMuX3ZbNV0gKiB2ZWMuX3ZbMV0gKyB0aGlzLl92WzldICogdmVjLl92WzJdICsgdGhpcy5fdlsxM107XG4gICAgY29uc3QgeiA9XG4gICAgICB0aGlzLl92WzJdICogdmVjLl92WzBdICsgdGhpcy5fdls2XSAqIHZlYy5fdlsxXSArIHRoaXMuX3ZbMTBdICogdmVjLl92WzJdICsgdGhpcy5fdlsxNF07XG4gICAgb3V0VmVjLl92WzBdID0geDtcbiAgICBvdXRWZWMuX3ZbMV0gPSB5O1xuICAgIG91dFZlYy5fdlsyXSA9IHo7XG5cbiAgICByZXR1cm4gb3V0VmVjO1xuICB9XG5cbiAgZ2V0VHJhbnNsYXRlKCkge1xuICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW3RoaXMuX3ZbMTJdLCB0aGlzLl92WzEzXSwgdGhpcy5fdlsxNF1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdHJhbnNsYXRlIHZlY3RvciBmcm9tIHRoaXMgbWF0cml4XG4gICAqL1xuICBnZXRUcmFuc2xhdGVUbyhvdXRWZWM6IE11dGFibGVWZWN0b3IzKSB7XG4gICAgb3V0VmVjLl92WzBdID0gdGhpcy5fdlsxMl07XG4gICAgb3V0VmVjLl92WzFdID0gdGhpcy5fdlsxM107XG4gICAgb3V0VmVjLl92WzJdID0gdGhpcy5fdlsxNF07XG4gICAgcmV0dXJuIG91dFZlYztcbiAgfVxuXG4gIGdldFNjYWxlKCkge1xuICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgTWF0aC5oeXBvdCh0aGlzLl92WzBdLCB0aGlzLl92WzFdLCB0aGlzLl92WzJdKSxcbiAgICAgIE1hdGguaHlwb3QodGhpcy5fdls0XSwgdGhpcy5fdls1XSwgdGhpcy5fdls2XSksXG4gICAgICBNYXRoLmh5cG90KHRoaXMuX3ZbOF0sIHRoaXMuX3ZbOV0sIHRoaXMuX3ZbMTBdKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgc2NhbGUgdmVjdG9yIGZyb20gdGhpcyBtYXRyaXhcbiAgICovXG4gIGdldFNjYWxlVG8ob3V0VmVjOiBNdXRhYmxlVmVjdG9yMykge1xuICAgIG91dFZlYy5fdlswXSA9IE1hdGguaHlwb3QodGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSk7XG4gICAgb3V0VmVjLl92WzFdID0gTWF0aC5oeXBvdCh0aGlzLl92WzRdLCB0aGlzLl92WzVdLCB0aGlzLl92WzZdKTtcbiAgICBvdXRWZWMuX3ZbMl0gPSBNYXRoLmh5cG90KHRoaXMuX3ZbOF0sIHRoaXMuX3ZbOV0sIHRoaXMuX3ZbMTBdKTtcbiAgICByZXR1cm4gb3V0VmVjO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gRXVsZXIgQW5nbGVzIFJvdGF0aW9uICh4LCB5LCB6KVxuICAgKi9cbiAgdG9FdWxlckFuZ2xlcygpOiBWZWN0b3IzIHtcbiAgICBsZXQgcm90YXRlOiBWZWN0b3IzO1xuICAgIGlmIChNYXRoLmFicyh0aGlzLl92WzJdKSAhPT0gMS4wKSB7XG4gICAgICBjb25zdCB5ID0gLU1hdGguYXNpbih0aGlzLl92WzJdKTtcbiAgICAgIGNvbnN0IHggPSBNYXRoLmF0YW4yKHRoaXMuX3ZbNl0gLyBNYXRoLmNvcyh5KSwgdGhpcy5fdlsxMF0gLyBNYXRoLmNvcyh5KSk7XG4gICAgICBjb25zdCB6ID0gTWF0aC5hdGFuMih0aGlzLl92WzFdIC8gTWF0aC5jb3MoeSksIHRoaXMuX3ZbMF0gLyBNYXRoLmNvcyh5KSk7XG4gICAgICByb3RhdGUgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW3gsIHksIHpdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3ZbMl0gPT09IC0xLjApIHtcbiAgICAgIHJvdGF0ZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbTWF0aC5hdGFuMih0aGlzLl92WzRdLCB0aGlzLl92WzhdKSwgTWF0aC5QSSAvIDIuMCwgMC4wXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvdGF0ZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbTWF0aC5hdGFuMigtdGhpcy5fdls0XSwgLXRoaXMuX3ZbOF0pLCAtTWF0aC5QSSAvIDIuMCwgMC4wXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdGF0ZTtcbiAgfVxuXG4gIHRvRXVsZXJBbmdsZXNUbyhvdXRWZWMzOiBNdXRhYmxlVmVjdG9yMykge1xuICAgIGlmIChNYXRoLmFicyh0aGlzLl92WzJdKSAhPT0gMS4wKSB7XG4gICAgICBjb25zdCB5ID0gLU1hdGguYXNpbih0aGlzLl92WzJdKTtcbiAgICAgIGNvbnN0IHggPSBNYXRoLmF0YW4yKHRoaXMuX3ZbNl0gLyBNYXRoLmNvcyh5KSwgdGhpcy5fdlsxMF0gLyBNYXRoLmNvcyh5KSk7XG4gICAgICBjb25zdCB6ID0gTWF0aC5hdGFuMih0aGlzLl92WzFdIC8gTWF0aC5jb3MoeSksIHRoaXMuX3ZbMF0gLyBNYXRoLmNvcyh5KSk7XG4gICAgICBvdXRWZWMzLl92WzBdID0geDtcbiAgICAgIG91dFZlYzMuX3ZbMV0gPSB5O1xuICAgICAgb3V0VmVjMy5fdlsyXSA9IHo7XG4gICAgfSBlbHNlIGlmICh0aGlzLl92WzJdID09PSAtMS4wKSB7XG4gICAgICBvdXRWZWMzLl92WzBdID0gTWF0aC5hdGFuMih0aGlzLl92WzRdLCB0aGlzLl92WzhdKTtcbiAgICAgIG91dFZlYzMuX3ZbMV0gPSBNYXRoLlBJIC8gMi4wO1xuICAgICAgb3V0VmVjMy5fdlsyXSA9IDAuMDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0VmVjMy5fdlswXSA9IE1hdGguYXRhbjIoLXRoaXMuX3ZbNF0sIC10aGlzLl92WzhdKTtcbiAgICAgIG91dFZlYzMuX3ZbMV0gPSAtTWF0aC5QSSAvIDIuMDtcbiAgICAgIG91dFZlYzMuX3ZbMl0gPSAwLjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dFZlYzM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5mcm9tQ29weTE2Um93TWFqb3IoXG4gICAgICB0aGlzLl92WzBdLFxuICAgICAgdGhpcy5fdls0XSxcbiAgICAgIHRoaXMuX3ZbOF0sXG4gICAgICB0aGlzLl92WzEyXSxcbiAgICAgIHRoaXMuX3ZbMV0sXG4gICAgICB0aGlzLl92WzVdLFxuICAgICAgdGhpcy5fdls5XSxcbiAgICAgIHRoaXMuX3ZbMTNdLFxuICAgICAgdGhpcy5fdlsyXSxcbiAgICAgIHRoaXMuX3ZbNl0sXG4gICAgICB0aGlzLl92WzEwXSxcbiAgICAgIHRoaXMuX3ZbMTRdLFxuICAgICAgdGhpcy5fdlszXSxcbiAgICAgIHRoaXMuX3ZbN10sXG4gICAgICB0aGlzLl92WzExXSxcbiAgICAgIHRoaXMuX3ZbMTVdXG4gICAgKSBhcyBNYXRyaXg0NDtcbiAgfVxuXG4gIGdldFJvdGF0ZSgpIHtcbiAgICAvLyBjb25zdCBxdWF0ID0gUXVhdGVybmlvbi5mcm9tTWF0cml4KHRoaXMpO1xuICAgIC8vIGNvbnN0IHJvdGF0ZU1hdCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuZnJvbUNvcHlRdWF0ZXJuaW9uKHF1YXQpIGFzIE1hdHJpeDQ0O1xuICAgIGNvbnN0IHNjYWxlWCA9IE1hdGguaHlwb3QodGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSk7XG4gICAgY29uc3Qgc2NhbGVZID0gTWF0aC5oeXBvdCh0aGlzLl92WzRdLCB0aGlzLl92WzVdLCB0aGlzLl92WzZdKTtcbiAgICBjb25zdCBzY2FsZVogPSBNYXRoLmh5cG90KHRoaXMuX3ZbOF0sIHRoaXMuX3ZbOV0sIHRoaXMuX3ZbMTBdKTtcblxuICAgIGNvbnN0IG1hdCA9IE1hdHJpeDQ0LmZyb21Db3B5MTZSb3dNYWpvcihcbiAgICAgIHRoaXMuX3ZbMF0gLyBzY2FsZVgsXG4gICAgICB0aGlzLl92WzRdLFxuICAgICAgdGhpcy5fdls4XSxcbiAgICAgIDAsXG4gICAgICB0aGlzLl92WzFdLFxuICAgICAgdGhpcy5fdls1XSAvIHNjYWxlWSxcbiAgICAgIHRoaXMuX3ZbOV0sXG4gICAgICAwLFxuICAgICAgdGhpcy5fdlsyXSxcbiAgICAgIHRoaXMuX3ZbNl0sXG4gICAgICB0aGlzLl92WzEwXSAvIHNjYWxlWixcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgKTtcbiAgICByZXR1cm4gbWF0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgUm93IE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIElmIHlvdSB3cml0ZSAxNiB2YWx1ZXMgaW4gNHg0IHN0eWxlICg0IHZhbHVlcyBpbiBlYWNoIHJvdyksXG4gICAqICAgSXQgd2lsbCBiZWNvbWVzIGFuIGludHVpdGl2ZSBoYW5kbGluZy5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tQ29weTE2Um93TWFqb3IoXG4gICAgbTAwOiBudW1iZXIsXG4gICAgbTAxOiBudW1iZXIsXG4gICAgbTAyOiBudW1iZXIsXG4gICAgbTAzOiBudW1iZXIsXG4gICAgbTEwOiBudW1iZXIsXG4gICAgbTExOiBudW1iZXIsXG4gICAgbTEyOiBudW1iZXIsXG4gICAgbTEzOiBudW1iZXIsXG4gICAgbTIwOiBudW1iZXIsXG4gICAgbTIxOiBudW1iZXIsXG4gICAgbTIyOiBudW1iZXIsXG4gICAgbTIzOiBudW1iZXIsXG4gICAgbTMwOiBudW1iZXIsXG4gICAgbTMxOiBudW1iZXIsXG4gICAgbTMyOiBudW1iZXIsXG4gICAgbTMzOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdls0XSA9IG0wMTtcbiAgICB2WzhdID0gbTAyO1xuICAgIHZbMTJdID0gbTAzO1xuICAgIHZbMV0gPSBtMTA7XG4gICAgdls1XSA9IG0xMTtcbiAgICB2WzldID0gbTEyO1xuICAgIHZbMTNdID0gbTEzO1xuICAgIHZbMl0gPSBtMjA7XG4gICAgdls2XSA9IG0yMTtcbiAgICB2WzEwXSA9IG0yMjtcbiAgICB2WzE0XSA9IG0yMztcbiAgICB2WzNdID0gbTMwO1xuICAgIHZbN10gPSBtMzE7XG4gICAgdlsxMV0gPSBtMzI7XG4gICAgdlsxNV0gPSBtMzM7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXg0NCh2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsdWVzIGFzIENvbHVtbiBNYWpvclxuICAgKiBOb3RlIHRoYXQgV2ViR0wgbWF0cml4IGtlZXBzIHRoZSB2YWx1ZXMgaW4gY29sdW1uIG1ham9yLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21Db3B5MTZDb2x1bW5NYWpvcihcbiAgICBtMDA6IG51bWJlcixcbiAgICBtMTA6IG51bWJlcixcbiAgICBtMjA6IG51bWJlcixcbiAgICBtMzA6IG51bWJlcixcbiAgICBtMDE6IG51bWJlcixcbiAgICBtMTE6IG51bWJlcixcbiAgICBtMjE6IG51bWJlcixcbiAgICBtMzE6IG51bWJlcixcbiAgICBtMDI6IG51bWJlcixcbiAgICBtMTI6IG51bWJlcixcbiAgICBtMjI6IG51bWJlcixcbiAgICBtMzI6IG51bWJlcixcbiAgICBtMDM6IG51bWJlcixcbiAgICBtMTM6IG51bWJlcixcbiAgICBtMjM6IG51bWJlcixcbiAgICBtMzM6IG51bWJlclxuICApIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdlswXSA9IG0wMDtcbiAgICB2WzRdID0gbTAxO1xuICAgIHZbOF0gPSBtMDI7XG4gICAgdlsxMl0gPSBtMDM7XG4gICAgdlsxXSA9IG0xMDtcbiAgICB2WzVdID0gbTExO1xuICAgIHZbOV0gPSBtMTI7XG4gICAgdlsxM10gPSBtMTM7XG4gICAgdlsyXSA9IG0yMDtcbiAgICB2WzZdID0gbTIxO1xuICAgIHZbMTBdID0gbTIyO1xuICAgIHZbMTRdID0gbTIzO1xuICAgIHZbM10gPSBtMzA7XG4gICAgdls3XSA9IG0zMTtcbiAgICB2WzExXSA9IG0zMjtcbiAgICB2WzE1XSA9IG0zMztcbiAgICByZXR1cm4gbmV3IE1hdHJpeDQ0KHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5TWF0cml4NDQobWF0OiBNYXRyaXg0NCkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2LnNldChtYXQuX3YpO1xuICAgIHJldHVybiBuZXcgTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUZsb2F0MzJBcnJheUNvbHVtbk1ham9yKGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXg0NChmbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoZmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdi5zZXQoZmxvYXQzMkFycmF5KTtcbiAgICByZXR1cm4gbmV3IE1hdHJpeDQ0KHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5Um93TWFqb3IoYXJyYXk6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdls0XSA9IGFycmF5WzFdO1xuICAgIHZbOF0gPSBhcnJheVsyXTtcbiAgICB2WzEyXSA9IGFycmF5WzNdO1xuICAgIHZbMV0gPSBhcnJheVs0XTtcbiAgICB2WzVdID0gYXJyYXlbNV07XG4gICAgdls5XSA9IGFycmF5WzZdO1xuICAgIHZbMTNdID0gYXJyYXlbN107XG4gICAgdlsyXSA9IGFycmF5WzhdO1xuICAgIHZbNl0gPSBhcnJheVs5XTtcbiAgICB2WzEwXSA9IGFycmF5WzEwXTtcbiAgICB2WzE0XSA9IGFycmF5WzExXTtcbiAgICB2WzNdID0gYXJyYXlbMTJdO1xuICAgIHZbN10gPSBhcnJheVsxM107XG4gICAgdlsxMV0gPSBhcnJheVsxNF07XG4gICAgdlsxNV0gPSBhcnJheVsxNV07XG4gICAgcmV0dXJuIG5ldyBNYXRyaXg0NCh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weU1hdHJpeDMzKG1hdDogSU1hdHJpeDMzKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIHZbMF0gPSBtYXQuX3ZbMF07XG4gICAgdls0XSA9IG1hdC5fdlszXTtcbiAgICB2WzhdID0gbWF0Ll92WzZdO1xuICAgIHZbMTJdID0gMDtcbiAgICB2WzFdID0gbWF0Ll92WzFdO1xuICAgIHZbNV0gPSBtYXQuX3ZbNF07XG4gICAgdls5XSA9IG1hdC5fdls3XTtcbiAgICB2WzEzXSA9IDA7XG4gICAgdlsyXSA9IG1hdC5fdlsyXTtcbiAgICB2WzZdID0gbWF0Ll92WzVdO1xuICAgIHZbMTBdID0gbWF0Ll92WzhdO1xuICAgIHZbMTRdID0gMDtcbiAgICB2WzNdID0gMDtcbiAgICB2WzddID0gMDtcbiAgICB2WzExXSA9IDA7XG4gICAgdlsxNV0gPSAxO1xuICAgIHJldHVybiBuZXcgTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTE2Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5MTY8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2LnNldChhcnJheSk7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXg0NCh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdi5zZXQoYXJyYXkpO1xuICAgIHJldHVybiBuZXcgTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTE2Um93TWFqb3IoYXJyYXk6IEFycmF5MTY8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdls0XSA9IGFycmF5WzFdO1xuICAgIHZbOF0gPSBhcnJheVsyXTtcbiAgICB2WzEyXSA9IGFycmF5WzNdO1xuICAgIHZbMV0gPSBhcnJheVs0XTtcbiAgICB2WzVdID0gYXJyYXlbNV07XG4gICAgdls5XSA9IGFycmF5WzZdO1xuICAgIHZbMTNdID0gYXJyYXlbN107XG4gICAgdlsyXSA9IGFycmF5WzhdO1xuICAgIHZbNl0gPSBhcnJheVs5XTtcbiAgICB2WzEwXSA9IGFycmF5WzEwXTtcbiAgICB2WzE0XSA9IGFycmF5WzExXTtcbiAgICB2WzNdID0gYXJyYXlbMTJdO1xuICAgIHZbN10gPSBhcnJheVsxM107XG4gICAgdlsxMV0gPSBhcnJheVsxNF07XG4gICAgdlsxNV0gPSBhcnJheVsxNV07XG4gICAgcmV0dXJuIG5ldyBNYXRyaXg0NCh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5Um93TWFqb3IoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdlswXSA9IGFycmF5WzBdO1xuICAgIHZbNF0gPSBhcnJheVsxXTtcbiAgICB2WzhdID0gYXJyYXlbMl07XG4gICAgdlsxMl0gPSBhcnJheVszXTtcbiAgICB2WzFdID0gYXJyYXlbNF07XG4gICAgdls1XSA9IGFycmF5WzVdO1xuICAgIHZbOV0gPSBhcnJheVs2XTtcbiAgICB2WzEzXSA9IGFycmF5WzddO1xuICAgIHZbMl0gPSBhcnJheVs4XTtcbiAgICB2WzZdID0gYXJyYXlbOV07XG4gICAgdlsxMF0gPSBhcnJheVsxMF07XG4gICAgdlsxNF0gPSBhcnJheVsxMV07XG4gICAgdlszXSA9IGFycmF5WzEyXTtcbiAgICB2WzddID0gYXJyYXlbMTNdO1xuICAgIHZbMTFdID0gYXJyYXlbMTRdO1xuICAgIHZbMTVdID0gYXJyYXlbMTVdO1xuICAgIHJldHVybiBuZXcgTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlRdWF0ZXJuaW9uKHE6IElRdWF0ZXJuaW9uKSB7XG4gICAgY29uc3Qgc3ggPSBxLl92WzBdICogcS5fdlswXTtcbiAgICBjb25zdCBzeSA9IHEuX3ZbMV0gKiBxLl92WzFdO1xuICAgIGNvbnN0IHN6ID0gcS5fdlsyXSAqIHEuX3ZbMl07XG4gICAgY29uc3QgY3ggPSBxLl92WzFdICogcS5fdlsyXTtcbiAgICBjb25zdCBjeSA9IHEuX3ZbMF0gKiBxLl92WzJdO1xuICAgIGNvbnN0IGN6ID0gcS5fdlswXSAqIHEuX3ZbMV07XG4gICAgY29uc3Qgd3ggPSBxLl92WzNdICogcS5fdlswXTtcbiAgICBjb25zdCB3eSA9IHEuX3ZbM10gKiBxLl92WzFdO1xuICAgIGNvbnN0IHd6ID0gcS5fdlszXSAqIHEuX3ZbMl07XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIHZbMF0gPSAxLjAgLSAyLjAgKiAoc3kgKyBzeik7XG4gICAgdls0XSA9IDIuMCAqIChjeiAtIHd6KTtcbiAgICB2WzhdID0gMi4wICogKGN5ICsgd3kpO1xuICAgIHZbMTJdID0gMDtcbiAgICB2WzFdID0gMi4wICogKGN6ICsgd3opO1xuICAgIHZbNV0gPSAxLjAgLSAyLjAgKiAoc3ggKyBzeik7XG4gICAgdls5XSA9IDIuMCAqIChjeCAtIHd4KTtcbiAgICB2WzEzXSA9IDA7XG4gICAgdlsyXSA9IDIuMCAqIChjeSAtIHd5KTtcbiAgICB2WzZdID0gMi4wICogKGN4ICsgd3gpO1xuICAgIHZbMTBdID0gMS4wIC0gMi4wICogKHN4ICsgc3kpO1xuICAgIHZbMTRdID0gMDtcbiAgICB2WzNdID0gMDtcbiAgICB2WzddID0gMDtcbiAgICB2WzExXSA9IDA7XG4gICAgdlsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG5ldyBNYXRyaXg0NCh2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IElWZWN0b3IzLCBJVmVjdG9yNCwgSU11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi9JVmVjdG9yJztcbmltcG9ydCB7IElNdXRhYmxlQ29sb3JSZ2IgfSBmcm9tICcuL0lDb2xvcic7XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlQ29sb3JSZ2IgZXh0ZW5kcyBNdXRhYmxlVmVjdG9yMyBpbXBsZW1lbnRzIElNdXRhYmxlVmVjdG9yMywgSU11dGFibGVDb2xvclJnYiB7XG4gIGNvbnN0cnVjdG9yKHI6IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKHIpO1xuICB9XG5cbiAgZ2V0IHgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBzZXQgeCh2YWwpIHtcbiAgICB0aGlzLl92WzBdID0gdmFsO1xuICB9XG5cbiAgZ2V0IHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBzZXQgeSh2YWwpIHtcbiAgICB0aGlzLl92WzFdID0gdmFsO1xuICB9XG5cbiAgZ2V0IHooKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBzZXQgeih2YWwpIHtcbiAgICB0aGlzLl92WzJdID0gdmFsO1xuICB9XG5cbiAgZ2V0IHcoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBnZXQgcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHNldCByKHZhbCkge1xuICAgIHRoaXMuX3ZbMF0gPSB2YWw7XG4gIH1cblxuICBnZXQgZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIHNldCBnKHZhbCkge1xuICAgIHRoaXMuX3ZbMV0gPSB2YWw7XG4gIH1cblxuICBnZXQgYigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIHNldCBiKHZhbCkge1xuICAgIHRoaXMuX3ZbMl0gPSB2YWw7XG4gIH1cblxuICBnZXQgYSgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHN0YXRpYyB6ZXJvKCkge1xuICAgIHJldHVybiBzdXBlci5femVybyhGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBvbmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9vbmUoRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlQ29sb3JSZ2I7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fbm9ybWFsaXplKHZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlQ29sb3JSZ2I7XG4gIH1cblxuICBzdGF0aWMgYWRkKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9hZGQobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseSh2ZWMsIHZhbHVlLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseVZlY3RvcihsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHlWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMywgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZUNvbG9yUmdiO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlVmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlQ29sb3JSZ2I7XG4gIH1cblxuICBzdGF0aWMgY3Jvc3MobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuX2Nyb3NzKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlQ29sb3JSZ2I7XG4gIH1cblxuICBjbG9uZSgpOiBNdXRhYmxlQ29sb3JSZ2Ige1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE11dGFibGVDb2xvclJnYjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuL011dGFibGVWZWN0b3I0JztcbmltcG9ydCB7IElWZWN0b3I0LCBJTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgSU11dGFibGVDb2xvclJnYmEgfSBmcm9tICcuL0lDb2xvcic7XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlQ29sb3JSZ2JhIGV4dGVuZHMgTXV0YWJsZVZlY3RvcjQgaW1wbGVtZW50cyBJTXV0YWJsZVZlY3RvcjQsIElNdXRhYmxlQ29sb3JSZ2JhIHtcbiAgY29uc3RydWN0b3IocjogRmxvYXQzMkFycmF5KSB7XG4gICAgc3VwZXIocik7XG4gIH1cblxuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHNldCB4KHZhbCkge1xuICAgIHRoaXMuX3ZbMF0gPSB2YWw7XG4gIH1cblxuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIHNldCB5KHZhbCkge1xuICAgIHRoaXMuX3ZbMV0gPSB2YWw7XG4gIH1cblxuICBnZXQgeigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIHNldCB6KHZhbCkge1xuICAgIHRoaXMuX3ZbMl0gPSB2YWw7XG4gIH1cblxuICBnZXQgdygpIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuXG4gIHNldCB3KHZhbCkge1xuICAgIHRoaXMuX3ZbM10gPSB2YWw7XG4gIH1cblxuICBnZXQgcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHNldCByKHZhbCkge1xuICAgIHRoaXMuX3ZbMF0gPSB2YWw7XG4gIH1cblxuICBnZXQgZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIHNldCBnKHZhbCkge1xuICAgIHRoaXMuX3ZbMV0gPSB2YWw7XG4gIH1cblxuICBnZXQgYigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIHNldCBiKHZhbCkge1xuICAgIHRoaXMuX3ZbMl0gPSB2YWw7XG4gIH1cblxuICBnZXQgYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuXG4gIHNldCBhKHZhbCkge1xuICAgIHRoaXMuX3ZbM10gPSB2YWw7XG4gIH1cblxuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gc3VwZXIuX3plcm8oRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYmE7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYmE7XG4gIH1cblxuICBzdGF0aWMgbm9ybWFsaXplKHZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX25vcm1hbGl6ZSh2ZWMsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZUNvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZUNvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVDb2xvclJnYmE7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHkodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHkodmVjLCB2YWx1ZSwgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlQ29sb3JSZ2JhO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZUNvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZUNvbG9yUmdiYTtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGVWZWN0b3IobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZUNvbG9yUmdiYTtcbiAgfVxuXG4gIGNsb25lKCk6IE11dGFibGVDb2xvclJnYmEge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE11dGFibGVDb2xvclJnYmE7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1hdHJpeDQ0IH0gZnJvbSAnLi9NYXRyaXg0NCc7XG5pbXBvcnQgeyBJTXV0YWJsZU1hdHJpeDIyLCBJTXV0YWJsZU1hdHJpeCwgSU1hdHJpeDIyIH0gZnJvbSAnLi9JTWF0cml4JztcbmltcG9ydCB7IE1hdHJpeDIyIH0gZnJvbSAnLi9NYXRyaXgyMic7XG5pbXBvcnQgeyBBcnJheTQsIEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWF0cml4MzMgfSBmcm9tICcuL01hdHJpeDMzJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuL1ZlY3RvcjInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG5leHBvcnQgY2xhc3MgTXV0YWJsZU1hdHJpeDIyIGV4dGVuZHMgTWF0cml4MjIgaW1wbGVtZW50cyBJTXV0YWJsZU1hdHJpeCwgSU11dGFibGVNYXRyaXgyMiB7XG4gIGNvbnN0cnVjdG9yKG06IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKG0pO1xuICB9XG5cbiAgcHVibGljIHNldCBtMDAodmFsKSB7XG4gICAgdGhpcy5fdlswXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMTAodmFsKSB7XG4gICAgdGhpcy5fdlsxXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTEwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMDEodmFsKSB7XG4gICAgdGhpcy5fdlsyXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAxKCkge1xuICAgIHJldHVybiB0aGlzLl92WzJdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMTEodmFsKSB7XG4gICAgdGhpcy5fdlszXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTExKCkge1xuICAgIHJldHVybiB0aGlzLl92WzNdO1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ011dGFibGVNYXRyaXgyMic7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHplcm8gbWF0cml4XG4gICAqL1xuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gc3VwZXIuemVybygpIGFzIE11dGFibGVNYXRyaXgyMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaWRlbnRpdHkgbWF0cml4XG4gICAqL1xuICBzdGF0aWMgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmlkZW50aXR5KCkgYXMgTXV0YWJsZU1hdHJpeDIyO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBzdXBlci5kdW1teSgpIGFzIE11dGFibGVNYXRyaXgyMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdHJhbnNwb3NlIG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHRyYW5zcG9zZShtYXQ6IE1hdHJpeDIyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnRyYW5zcG9zZShtYXQpIGFzIE11dGFibGVNYXRyaXgyMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW52ZXJ0IG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIGludmVydChtYXQ6IE1hdHJpeDIyKSB7XG4gICAgcmV0dXJuIHN1cGVyLmludmVydChtYXQpIGFzIE11dGFibGVNYXRyaXgyMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICBzdGF0aWMgcm90YXRlKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnJvdGF0ZShyYWRpYW4pIGFzIE11dGFibGVNYXRyaXgyMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU2NhbGUgTWF0cml4XG4gICAqL1xuICBzdGF0aWMgc2NhbGUodmVjOiBWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnNjYWxlKHZlYykgYXMgdW5rbm93biBhcyBNdXRhYmxlTWF0cml4MjI7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgbWF0cml4ZXNcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseShsX21hdDogTWF0cml4MjIsIHJfbWF0OiBNYXRyaXgyMikge1xuICAgIHJldHVybiBzdXBlci5tdWx0aXBseShsX21hdCwgcl9tYXQpIGFzIE11dGFibGVNYXRyaXgyMjtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmNsb25lKCkgYXMgTXV0YWJsZU1hdHJpeDIyO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByYXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Y7XG4gIH1cblxuICBzZXRBdChyb3dfaTogbnVtYmVyLCBjb2x1bW5faTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdltyb3dfaSArIGNvbHVtbl9pICogMl0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENvbXBvbmVudHMobTAwOiBudW1iZXIsIG0wMTogbnVtYmVyLCBtMTA6IG51bWJlciwgbTExOiBudW1iZXIpOiBNdXRhYmxlTWF0cml4MjIge1xuICAgIHRoaXMuX3ZbMF0gPSBtMDA7XG4gICAgdGhpcy5fdlsyXSA9IG0wMTtcbiAgICB0aGlzLl92WzFdID0gbTEwO1xuICAgIHRoaXMuX3ZbM10gPSBtMTE7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvcHlDb21wb25lbnRzKG1hdDogTWF0cml4MjIgfCBNYXRyaXgzMyB8IE1hdHJpeDQ0KSB7XG4gICAgdGhpcy5fdlswXSA9IG1hdC5tMDA7XG4gICAgdGhpcy5fdlsyXSA9IG1hdC5tMDE7IC8vIG1hdC5tMDEgaXMgbWF0Ll92WzIgb3IgMyBvciA0XVxuICAgIHRoaXMuX3ZbMV0gPSBtYXQubTEwO1xuICAgIHRoaXMuX3ZbM10gPSBtYXQubTExO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogemVybyBtYXRyaXhcbiAgICovXG4gIHplcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cygwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIGlkZW50aXR5KCkge1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoMSwgMCwgMCwgMSk7XG4gIH1cblxuICBfc3dhcChsOiBJbmRleCwgcjogSW5kZXgpIHtcbiAgICB0aGlzLl92W3JdID0gW3RoaXMuX3ZbbF0sICh0aGlzLl92W2xdID0gdGhpcy5fdltyXSldWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYW5zcG9zZVxuICAgKi9cbiAgdHJhbnNwb3NlKCkge1xuICAgIHRoaXMuX3N3YXAoMSwgMik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGludmVydCgpIHtcbiAgICBjb25zdCBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG4gICAgaWYgKGRldCA9PT0gMCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCd0aGUgZGV0ZXJtaW5hbnQgaXMgMCEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSB0aGlzLl92WzNdIC8gZGV0O1xuICAgIGNvbnN0IG0wMSA9ICh0aGlzLl92WzJdIC8gZGV0KSAqIC0xLjA7XG4gICAgY29uc3QgbTEwID0gKHRoaXMuX3ZbMV0gLyBkZXQpICogLTEuMDtcbiAgICBjb25zdCBtMTEgPSB0aGlzLl92WzBdIC8gZGV0O1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyhtMDAsIG0wMSwgbTEwLCBtMTEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBSb3RhdGlvbiBNYXRyaXhcbiAgICovXG4gIHJvdGF0ZShyYWRpYW46IG51bWJlcikge1xuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKHJhZGlhbik7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4ocmFkaWFuKTtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKGNvcywgLXNpbiwgc2luLCBjb3MpO1xuICB9XG5cbiAgc2NhbGUodmVjOiBWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyh2ZWMuX3ZbMF0sIDAsIDAsIHZlYy5fdlsxXSk7XG4gIH1cblxuICBtdWx0aXBseVNjYWxlKHZlYzogVmVjdG9yMikge1xuICAgIHRoaXMuX3ZbMF0gKj0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMl0gKj0gdmVjLl92WzBdO1xuXG4gICAgdGhpcy5fdlsxXSAqPSB2ZWMuX3ZbMV07XG4gICAgdGhpcy5fdlszXSAqPSB2ZWMuX3ZbMV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB0aGUgaW5wdXQgbWF0cml4IGZyb20gcmlnaHQgc2lkZVxuICAgKi9cbiAgbXVsdGlwbHkobWF0OiBNYXRyaXgyMikge1xuICAgIGNvbnN0IG0wMCA9IHRoaXMuX3ZbMF0gKiBtYXQuX3ZbMF0gKyB0aGlzLl92WzJdICogbWF0Ll92WzFdO1xuICAgIGNvbnN0IG0wMSA9IHRoaXMuX3ZbMF0gKiBtYXQuX3ZbMl0gKyB0aGlzLl92WzJdICogbWF0Ll92WzNdO1xuXG4gICAgY29uc3QgbTEwID0gdGhpcy5fdlsxXSAqIG1hdC5fdlswXSArIHRoaXMuX3ZbM10gKiBtYXQuX3ZbMV07XG4gICAgY29uc3QgbTExID0gdGhpcy5fdlsxXSAqIG1hdC5fdlsyXSArIHRoaXMuX3ZbM10gKiBtYXQuX3ZbM107XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKG0wMCwgbTAxLCBtMTAsIG0xMSk7XG4gIH1cblxuICBtdWx0aXBseUJ5TGVmdChtYXQ6IE1hdHJpeDIyKSB7XG4gICAgY29uc3QgbTAwID0gbWF0Ll92WzBdICogdGhpcy5fdlswXSArIG1hdC5fdlsyXSAqIHRoaXMuX3ZbMV07XG4gICAgY29uc3QgbTAxID0gbWF0Ll92WzBdICogdGhpcy5fdlsyXSArIG1hdC5fdlsyXSAqIHRoaXMuX3ZbM107XG5cbiAgICBjb25zdCBtMTAgPSBtYXQuX3ZbMV0gKiB0aGlzLl92WzBdICsgbWF0Ll92WzNdICogdGhpcy5fdlsxXTtcbiAgICBjb25zdCBtMTEgPSBtYXQuX3ZbMV0gKiB0aGlzLl92WzJdICsgbWF0Ll92WzNdICogdGhpcy5fdlszXTtcblxuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMobTAwLCBtMDEsIG0xMCwgbTExKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsdWVzIGFzIFJvdyBNYWpvclxuICAgKiBOb3RlIHRoYXQgV2ViR0wgbWF0cml4IGtlZXBzIHRoZSB2YWx1ZXMgaW4gY29sdW1uIG1ham9yLlxuICAgKiBJZiB5b3Ugd3JpdGUgNCB2YWx1ZXMgaW4gMngyIHN0eWxlICgyIHZhbHVlcyBpbiBlYWNoIHJvdyksXG4gICAqICAgSXQgd2lsbCBiZWNvbWVzIGFuIGludHVpdGl2ZSBoYW5kbGluZy5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tQ29weTRSb3dNYWpvcihtMDA6IG51bWJlciwgbTAxOiBudW1iZXIsIG0xMDogbnVtYmVyLCBtMTE6IG51bWJlcikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdlsyXSA9IG0wMTtcbiAgICB2WzFdID0gbTEwO1xuICAgIHZbM10gPSBtMTE7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MjIodik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlcyBhcyBDb2x1bW4gTWFqb3JcbiAgICogTm90ZSB0aGF0IFdlYkdMIG1hdHJpeCBrZWVwcyB0aGUgdmFsdWVzIGluIGNvbHVtbiBtYWpvci5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tQ29weTRDb2x1bW5NYWpvcihtMDA6IG51bWJlciwgbTEwOiBudW1iZXIsIG0wMTogbnVtYmVyLCBtMTE6IG51bWJlcikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdlsyXSA9IG0wMTtcbiAgICB2WzFdID0gbTEwO1xuICAgIHZbM10gPSBtMTE7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUZsb2F0MzJBcnJheUNvbHVtbk1ham9yKGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MjIoZmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUZsb2F0MzJBcnJheUNvbHVtbk1ham9yKGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdi5zZXQoZmxvYXQzMkFycmF5KTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgyMih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUZsb2F0MzJBcnJheVJvd01ham9yKGFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdlszXSA9IGFycmF5WzFdO1xuICAgIHZbMV0gPSBhcnJheVsyXTtcbiAgICB2WzRdID0gYXJyYXlbM107XG5cbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgyMih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weU1hdHJpeDIyKG1hdDogSU1hdHJpeDIyKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IG1hdC5fdlswXTtcbiAgICB2WzNdID0gbWF0Ll92WzFdO1xuICAgIHZbMV0gPSBtYXQuX3ZbMl07XG4gICAgdls0XSA9IG1hdC5fdlszXTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgyMih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5OUNvbHVtbk1ham9yKGFycmF5OiBBcnJheTQ8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuICAgIHYuc2V0KGFycmF5KTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgyMih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2LnNldChhcnJheSk7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTlSb3dNYWpvcihhcnJheTogQXJyYXk0PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdlszXSA9IGFycmF5WzFdO1xuICAgIHZbMV0gPSBhcnJheVsyXTtcbiAgICB2WzRdID0gYXJyYXlbM107XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MjIodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheVJvd01ham9yKGFycmF5OiBBcnJheTxudW1iZXI+KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IGFycmF5WzBdO1xuICAgIHZbM10gPSBhcnJheVsxXTtcbiAgICB2WzFdID0gYXJyYXlbMl07XG4gICAgdls0XSA9IGFycmF5WzNdO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDIyKHYpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4vTWF0cml4NDQnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJTXV0YWJsZU1hdHJpeDMzLCBJTXV0YWJsZU1hdHJpeCwgSU1hdHJpeDMzLCBJTWF0cml4NDQgfSBmcm9tICcuL0lNYXRyaXgnO1xuaW1wb3J0IHsgTWF0cml4MzMgfSBmcm9tICcuL01hdHJpeDMzJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgQXJyYXk5LCBJbmRleCB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IElRdWF0ZXJuaW9uIH0gZnJvbSAnLi9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbi8qIGVzbGludC1kaXNhYmxlIHByZXR0aWVyL3ByZXR0aWVyICovXG5leHBvcnQgY2xhc3MgTXV0YWJsZU1hdHJpeDMzIGV4dGVuZHMgTWF0cml4MzMgaW1wbGVtZW50cyBJTXV0YWJsZU1hdHJpeCwgSU11dGFibGVNYXRyaXgzMyB7XG4gIGNvbnN0cnVjdG9yKG06IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKG0pO1xuICB9XG5cbiAgcHVibGljIHNldCBtMDAodmFsKSB7XG4gICAgdGhpcy5fdlswXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMTAodmFsKSB7XG4gICAgdGhpcy5fdlsxXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTEwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMjAodmFsKSB7XG4gICAgdGhpcy5fdlsyXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIwKCkge1xuICAgIHJldHVybiB0aGlzLl92WzJdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMDEodmFsKSB7XG4gICAgdGhpcy5fdlszXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAxKCkge1xuICAgIHJldHVybiB0aGlzLl92WzNdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMTEodmFsKSB7XG4gICAgdGhpcy5fdls0XSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTExKCkge1xuICAgIHJldHVybiB0aGlzLl92WzRdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMjEodmFsKSB7XG4gICAgdGhpcy5fdls1XSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIxKCkge1xuICAgIHJldHVybiB0aGlzLl92WzVdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMDIodmFsKSB7XG4gICAgdGhpcy5fdls2XSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAyKCkge1xuICAgIHJldHVybiB0aGlzLl92WzZdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMTIodmFsKSB7XG4gICAgdGhpcy5fdls3XSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTEyKCkge1xuICAgIHJldHVybiB0aGlzLl92WzddO1xuICB9XG5cbiAgcHVibGljIHNldCBtMjIodmFsKSB7XG4gICAgdGhpcy5fdls4XSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTIyKCkge1xuICAgIHJldHVybiB0aGlzLl92WzhdO1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ011dGFibGVNYXRyaXgzMyc7XG4gIH1cblxuICAvKipcbiAgICogemVybyBtYXRyaXgoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gc3VwZXIuemVybygpIGFzIE11dGFibGVNYXRyaXgzMztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaWRlbnRpdHkgbWF0cml4XG4gICAqL1xuICBzdGF0aWMgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIE11dGFibGVNYXRyaXgzMy5mcm9tQ29weTlSb3dNYWpvcigxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxKTtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpIHtcbiAgICByZXR1cm4gc3VwZXIuZHVtbXkoKSBhcyBNdXRhYmxlTWF0cml4MzM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRyYW5zcG9zZSBtYXRyaXhcbiAgICovXG4gIHN0YXRpYyB0cmFuc3Bvc2UobWF0OiBJTWF0cml4MzMpIHtcbiAgICByZXR1cm4gc3VwZXIudHJhbnNwb3NlKG1hdCkgYXMgTXV0YWJsZU1hdHJpeDMzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnZlcnQgbWF0cml4XG4gICAqL1xuICBzdGF0aWMgaW52ZXJ0KG1hdDogSU1hdHJpeDMzKSB7XG4gICAgcmV0dXJuIHN1cGVyLmludmVydChtYXQpIGFzIE11dGFibGVNYXRyaXgzMztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgWCBvcmllbnRlZCBSb3RhdGlvbiBNYXRyaXhcbiAgICovXG4gIHN0YXRpYyByb3RhdGVYKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnJvdGF0ZVgocmFkaWFuKSBhcyBNdXRhYmxlTWF0cml4MzM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFkgb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICBzdGF0aWMgcm90YXRlWShyYWRpYW46IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5yb3RhdGVZKHJhZGlhbikgYXMgTXV0YWJsZU1hdHJpeDMzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBaIG9yaWVudGVkIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZVoocmFkaWFuOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIucm90YXRlWihyYWRpYW4pIGFzIE11dGFibGVNYXRyaXgzMztcbiAgfVxuXG4gIHN0YXRpYyByb3RhdGVYWVooeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5yb3RhdGVYWVooeCwgeSwgeikgYXMgTXV0YWJsZU1hdHJpeDMzO1xuICB9XG5cbiAgc3RhdGljIHJvdGF0ZSh2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnJvdGF0ZVhZWih2ZWMuX3ZbMF0sIHZlYy5fdlsxXSwgdmVjLl92WzJdKSBhcyBNdXRhYmxlTWF0cml4MzM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFNjYWxlIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHNjYWxlKHZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuc2NhbGUodmVjKSBhcyBNdXRhYmxlTWF0cml4MzM7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgbWF0cml4ZXNcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseShsX21hdDogSU1hdHJpeDMzLCByX21hdDogSU1hdHJpeDMzKSB7XG4gICAgcmV0dXJuIHN1cGVyLm11bHRpcGx5KGxfbWF0LCByX21hdCkgYXMgTXV0YWJsZU1hdHJpeDMzO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuY2xvbmUoKSBhcyBNdXRhYmxlTWF0cml4MzM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy5fdjtcbiAgfVxuXG4gIHNldEF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92W3Jvd19pICsgY29sdW1uX2kgKiAzXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29tcG9uZW50cyhcbiAgICBtMDA6IG51bWJlcixcbiAgICBtMDE6IG51bWJlcixcbiAgICBtMDI6IG51bWJlcixcbiAgICBtMTA6IG51bWJlcixcbiAgICBtMTE6IG51bWJlcixcbiAgICBtMTI6IG51bWJlcixcbiAgICBtMjA6IG51bWJlcixcbiAgICBtMjE6IG51bWJlcixcbiAgICBtMjI6IG51bWJlclxuICApOiBNdXRhYmxlTWF0cml4MzMge1xuICAgIHRoaXMuX3ZbMF0gPSBtMDA7XG4gICAgdGhpcy5fdlszXSA9IG0wMTtcbiAgICB0aGlzLl92WzZdID0gbTAyO1xuICAgIHRoaXMuX3ZbMV0gPSBtMTA7XG4gICAgdGhpcy5fdls0XSA9IG0xMTtcbiAgICB0aGlzLl92WzddID0gbTEyO1xuICAgIHRoaXMuX3ZbMl0gPSBtMjA7XG4gICAgdGhpcy5fdls1XSA9IG0yMTtcbiAgICB0aGlzLl92WzhdID0gbTIyO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb3B5Q29tcG9uZW50cyhtYXQ6IElNYXRyaXgzMyB8IElNYXRyaXg0NCkge1xuICAgIHRoaXMuX3ZbMF0gPSBtYXQubTAwO1xuICAgIHRoaXMuX3ZbM10gPSBtYXQubTAxO1xuICAgIHRoaXMuX3ZbNl0gPSBtYXQubTAyOyAvLyBtYXQubTAxIGlzIG1hdC5fdlszIG9yIDRdXG4gICAgdGhpcy5fdlsxXSA9IG1hdC5tMTA7XG4gICAgdGhpcy5fdls0XSA9IG1hdC5tMTE7XG4gICAgdGhpcy5fdls3XSA9IG1hdC5tMTI7XG4gICAgdGhpcy5fdlsyXSA9IG1hdC5tMjA7XG4gICAgdGhpcy5fdls1XSA9IG1hdC5tMjE7XG4gICAgdGhpcy5fdls4XSA9IG1hdC5tMjI7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiB6ZXJvIG1hdHJpeFxuICAgKi9cbiAgemVybygpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICB9XG5cbiAgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cygxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxKTtcbiAgfVxuXG4gIF9zd2FwKGw6IEluZGV4LCByOiBJbmRleCkge1xuICAgIHRoaXMuX3Zbcl0gPSBbdGhpcy5fdltsXSwgKHRoaXMuX3ZbbF0gPSB0aGlzLl92W3JdKV1bMF07XG4gIH1cblxuICAvKipcbiAgICogdHJhbnNwb3NlXG4gICAqL1xuICB0cmFuc3Bvc2UoKSB7XG4gICAgdGhpcy5fc3dhcCgxLCAzKTtcbiAgICB0aGlzLl9zd2FwKDIsIDYpO1xuICAgIHRoaXMuX3N3YXAoNSwgOCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGludmVydCgpIHtcbiAgICBjb25zdCBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG4gICAgaWYgKGRldCA9PT0gMCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCd0aGUgZGV0ZXJtaW5hbnQgaXMgMCEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSAodGhpcy5fdls0XSAqIHRoaXMuX3ZbOF0gLSB0aGlzLl92WzddICogdGhpcy5fdls1XSkgLyBkZXQ7XG4gICAgY29uc3QgbTAxID0gKHRoaXMuX3ZbNl0gKiB0aGlzLl92WzVdIC0gdGhpcy5fdlszXSAqIHRoaXMuX3ZbOF0pIC8gZGV0O1xuICAgIGNvbnN0IG0wMiA9ICh0aGlzLl92WzNdICogdGhpcy5fdls3XSAtIHRoaXMuX3ZbNl0gKiB0aGlzLl92WzRdKSAvIGRldDtcbiAgICBjb25zdCBtMTAgPSAodGhpcy5fdls3XSAqIHRoaXMuX3ZbMl0gLSB0aGlzLl92WzFdICogdGhpcy5fdls4XSkgLyBkZXQ7XG4gICAgY29uc3QgbTExID0gKHRoaXMuX3ZbMF0gKiB0aGlzLl92WzhdIC0gdGhpcy5fdls2XSAqIHRoaXMuX3ZbMl0pIC8gZGV0O1xuICAgIGNvbnN0IG0xMiA9ICh0aGlzLl92WzZdICogdGhpcy5fdlsxXSAtIHRoaXMuX3ZbMF0gKiB0aGlzLl92WzddKSAvIGRldDtcbiAgICBjb25zdCBtMjAgPSAodGhpcy5fdlsxXSAqIHRoaXMuX3ZbNV0gLSB0aGlzLl92WzRdICogdGhpcy5fdlsyXSkgLyBkZXQ7XG4gICAgY29uc3QgbTIxID0gKHRoaXMuX3ZbM10gKiB0aGlzLl92WzJdIC0gdGhpcy5fdlswXSAqIHRoaXMuX3ZbNV0pIC8gZGV0O1xuICAgIGNvbnN0IG0yMiA9ICh0aGlzLl92WzBdICogdGhpcy5fdls0XSAtIHRoaXMuX3ZbM10gKiB0aGlzLl92WzFdKSAvIGRldDtcblxuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFggb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICByb3RhdGVYKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoMSwgMCwgMCwgMCwgY29zLCAtc2luLCAwLCBzaW4sIGNvcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFkgb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICByb3RhdGVZKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoY29zLCAwLCBzaW4sIDAsIDEsIDAsIC1zaW4sIDAsIGNvcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFogb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICByb3RhdGVaKHJhZGlhbjogbnVtYmVyKTogTXV0YWJsZU1hdHJpeDMzIHtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyhjb3MsIC1zaW4sIDAsIHNpbiwgY29zLCAwLCAwLCAwLCAxKTtcbiAgfVxuXG4gIHJvdGF0ZVhZWih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zWCA9IE1hdGguY29zKHgpO1xuICAgIGNvbnN0IHNpblggPSBNYXRoLnNpbih4KTtcbiAgICBjb25zdCBjb3NZID0gTWF0aC5jb3MoeSk7XG4gICAgY29uc3Qgc2luWSA9IE1hdGguc2luKHkpO1xuICAgIGNvbnN0IGNvc1ogPSBNYXRoLmNvcyh6KTtcbiAgICBjb25zdCBzaW5aID0gTWF0aC5zaW4oeik7XG5cbiAgICAvLyBjb25zdCB4MDAgPSAxO1xuICAgIC8vIGNvbnN0IHgwMSA9IDA7XG4gICAgLy8gY29uc3QgeDAyID0gMDtcbiAgICAvLyBjb25zdCB4MTAgPSAwO1xuICAgIGNvbnN0IHgxMSA9IGNvc1g7XG4gICAgY29uc3QgeDEyID0gLXNpblg7XG4gICAgLy8gY29uc3QgeDIwID0gMDtcbiAgICBjb25zdCB4MjEgPSBzaW5YO1xuICAgIGNvbnN0IHgyMiA9IGNvc1g7XG5cbiAgICBjb25zdCB5MDAgPSBjb3NZO1xuICAgIC8vIGNvbnN0IHkwMSA9IDA7XG4gICAgY29uc3QgeTAyID0gc2luWTtcbiAgICAvLyBjb25zdCB5MTAgPSAwO1xuICAgIC8vIGNvbnN0IHkxMSA9IDE7XG4gICAgLy8gY29uc3QgeTEyID0gMDtcbiAgICBjb25zdCB5MjAgPSAtc2luWTtcbiAgICAvLyBjb25zdCB5MjEgPSAwO1xuICAgIGNvbnN0IHkyMiA9IGNvc1k7XG5cbiAgICBjb25zdCB6MDAgPSBjb3NaO1xuICAgIGNvbnN0IHowMSA9IC1zaW5aO1xuICAgIC8vIGNvbnN0IHowMiA9IDA7XG4gICAgY29uc3QgejEwID0gc2luWjtcbiAgICBjb25zdCB6MTEgPSBjb3NaO1xuICAgIC8vIGNvbnN0IHoxMiA9IDA7XG4gICAgLy8gY29uc3QgejIwID0gMDtcbiAgICAvLyBjb25zdCB6MjEgPSAwO1xuICAgIC8vIGNvbnN0IHoyMiA9IDE7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhpcy5tdWx0aXBseSh0aGlzLnJvdGF0ZVkoeSksIHRoaXMucm90YXRlWCh4KSlcbiAgICBjb25zdCB5eDAwID0geTAwO1xuICAgIGNvbnN0IHl4MDEgPSB5MDIgKiB4MjE7XG4gICAgY29uc3QgeXgwMiA9IHkwMiAqIHgyMjtcbiAgICAvL2NvbnN0IHl4MTAgPSAwO1xuICAgIGNvbnN0IHl4MTEgPSB4MTE7XG4gICAgY29uc3QgeXgxMiA9IHgxMjtcbiAgICBjb25zdCB5eDIwID0geTIwO1xuICAgIGNvbnN0IHl4MjEgPSB5MjIgKiB4MjE7XG4gICAgY29uc3QgeXgyMiA9IHkyMiAqIHgyMjtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGlzLm11bHRpcGx5KHRoaXMucm90YXRlWih6KSwgdGhpcy5tdWx0aXBseSh0aGlzLnJvdGF0ZVkoeSksIHRoaXMucm90YXRlWCh4KSkpXG4gICAgY29uc3QgbTAwID0gejAwICogeXgwMDtcbiAgICBjb25zdCBtMDEgPSB6MDAgKiB5eDAxICsgejAxICogeXgxMTtcbiAgICBjb25zdCBtMDIgPSB6MDAgKiB5eDAyICsgejAxICogeXgxMjtcbiAgICBjb25zdCBtMTAgPSB6MTAgKiB5eDAwO1xuICAgIGNvbnN0IG0xMSA9IHoxMCAqIHl4MDEgKyB6MTEgKiB5eDExO1xuICAgIGNvbnN0IG0xMiA9IHoxMCAqIHl4MDIgKyB6MTEgKiB5eDEyO1xuICAgIGNvbnN0IG0yMCA9IHl4MjA7XG4gICAgY29uc3QgbTIxID0geXgyMTtcbiAgICBjb25zdCBtMjIgPSB5eDIyO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyhtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKTtcbiAgfVxuXG4gIHJvdGF0ZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5yb3RhdGVYWVoodmVjLl92WzBdLCB2ZWMuX3ZbMV0sIHZlYy5fdlsyXSk7XG4gIH1cblxuICBzY2FsZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKHZlYy5fdlswXSwgMCwgMCwgMCwgdmVjLl92WzFdLCAwLCAwLCAwLCB2ZWMuX3ZbMl0pO1xuICB9XG5cbiAgbXVsdGlwbHlTY2FsZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICB0aGlzLl92WzBdICo9IHZlYy5fdlswXTtcbiAgICB0aGlzLl92WzNdICo9IHZlYy5fdlswXTtcbiAgICB0aGlzLl92WzZdICo9IHZlYy5fdlswXTtcblxuICAgIHRoaXMuX3ZbMV0gKj0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbNF0gKj0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbN10gKj0gdmVjLl92WzFdO1xuXG4gICAgdGhpcy5fdlsyXSAqPSB2ZWMuX3ZbMl07XG4gICAgdGhpcy5fdls1XSAqPSB2ZWMuX3ZbMl07XG4gICAgdGhpcy5fdls4XSAqPSB2ZWMuX3ZbMl07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB0aGUgaW5wdXQgbWF0cml4IGZyb20gcmlnaHQgc2lkZVxuICAgKi9cbiAgbXVsdGlwbHkobWF0OiBNYXRyaXgzMykge1xuICAgIGlmIChtYXQuaXNJZGVudGl0eU1hdHJpeENsYXNzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSB0aGlzLl92WzBdICogbWF0Ll92WzBdICsgdGhpcy5fdlszXSAqIG1hdC5fdlsxXSArIHRoaXMuX3ZbNl0gKiBtYXQuX3ZbMl07XG4gICAgY29uc3QgbTAxID0gdGhpcy5fdlswXSAqIG1hdC5fdlszXSArIHRoaXMuX3ZbM10gKiBtYXQuX3ZbNF0gKyB0aGlzLl92WzZdICogbWF0Ll92WzVdO1xuICAgIGNvbnN0IG0wMiA9IHRoaXMuX3ZbMF0gKiBtYXQuX3ZbNl0gKyB0aGlzLl92WzNdICogbWF0Ll92WzddICsgdGhpcy5fdls2XSAqIG1hdC5fdls4XTtcblxuICAgIGNvbnN0IG0xMCA9IHRoaXMuX3ZbMV0gKiBtYXQuX3ZbMF0gKyB0aGlzLl92WzRdICogbWF0Ll92WzFdICsgdGhpcy5fdls3XSAqIG1hdC5fdlsyXTtcbiAgICBjb25zdCBtMTEgPSB0aGlzLl92WzFdICogbWF0Ll92WzNdICsgdGhpcy5fdls0XSAqIG1hdC5fdls0XSArIHRoaXMuX3ZbN10gKiBtYXQuX3ZbNV07XG4gICAgY29uc3QgbTEyID0gdGhpcy5fdlsxXSAqIG1hdC5fdls2XSArIHRoaXMuX3ZbNF0gKiBtYXQuX3ZbN10gKyB0aGlzLl92WzddICogbWF0Ll92WzhdO1xuXG4gICAgY29uc3QgbTIwID0gdGhpcy5fdlsyXSAqIG1hdC5fdlswXSArIHRoaXMuX3ZbNV0gKiBtYXQuX3ZbMV0gKyB0aGlzLl92WzhdICogbWF0Ll92WzJdO1xuICAgIGNvbnN0IG0yMSA9IHRoaXMuX3ZbMl0gKiBtYXQuX3ZbM10gKyB0aGlzLl92WzVdICogbWF0Ll92WzRdICsgdGhpcy5fdls4XSAqIG1hdC5fdls1XTtcbiAgICBjb25zdCBtMjIgPSB0aGlzLl92WzJdICogbWF0Ll92WzZdICsgdGhpcy5fdls1XSAqIG1hdC5fdls3XSArIHRoaXMuX3ZbOF0gKiBtYXQuX3ZbOF07XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpO1xuICB9XG5cbiAgbXVsdGlwbHlCeUxlZnQobWF0OiBNYXRyaXgzMykge1xuICAgIGlmIChtYXQuaXNJZGVudGl0eU1hdHJpeENsYXNzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBtMDAgPSBtYXQuX3ZbMF0gKiB0aGlzLl92WzBdICsgbWF0Ll92WzNdICogdGhpcy5fdlsxXSArIG1hdC5fdls2XSAqIHRoaXMuX3ZbMl07XG4gICAgY29uc3QgbTAxID0gbWF0Ll92WzBdICogdGhpcy5fdlszXSArIG1hdC5fdlszXSAqIHRoaXMuX3ZbNF0gKyBtYXQuX3ZbNl0gKiB0aGlzLl92WzVdO1xuICAgIGNvbnN0IG0wMiA9IG1hdC5fdlswXSAqIHRoaXMuX3ZbNl0gKyBtYXQuX3ZbM10gKiB0aGlzLl92WzddICsgbWF0Ll92WzZdICogdGhpcy5fdls4XTtcblxuICAgIGNvbnN0IG0xMCA9IG1hdC5fdlsxXSAqIHRoaXMuX3ZbMF0gKyBtYXQuX3ZbNF0gKiB0aGlzLl92WzFdICsgbWF0Ll92WzddICogdGhpcy5fdlsyXTtcbiAgICBjb25zdCBtMTEgPSBtYXQuX3ZbMV0gKiB0aGlzLl92WzNdICsgbWF0Ll92WzRdICogdGhpcy5fdls0XSArIG1hdC5fdls3XSAqIHRoaXMuX3ZbNV07XG4gICAgY29uc3QgbTEyID0gbWF0Ll92WzFdICogdGhpcy5fdls2XSArIG1hdC5fdls0XSAqIHRoaXMuX3ZbN10gKyBtYXQuX3ZbN10gKiB0aGlzLl92WzhdO1xuXG4gICAgY29uc3QgbTIwID0gbWF0Ll92WzJdICogdGhpcy5fdlswXSArIG1hdC5fdls1XSAqIHRoaXMuX3ZbMV0gKyBtYXQuX3ZbOF0gKiB0aGlzLl92WzJdO1xuICAgIGNvbnN0IG0yMSA9IG1hdC5fdlsyXSAqIHRoaXMuX3ZbM10gKyBtYXQuX3ZbNV0gKiB0aGlzLl92WzRdICsgbWF0Ll92WzhdICogdGhpcy5fdls1XTtcbiAgICBjb25zdCBtMjIgPSBtYXQuX3ZbMl0gKiB0aGlzLl92WzZdICsgbWF0Ll92WzVdICogdGhpcy5fdls3XSArIG1hdC5fdls4XSAqIHRoaXMuX3ZbOF07XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgUm93IE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIElmIHlvdSB3cml0ZSA5IHZhbHVlcyBpbiAzeDMgc3R5bGUgKDMgdmFsdWVzIGluIGVhY2ggcm93KSxcbiAgICogICBJdCB3aWxsIGJlY29tZXMgYW4gaW50dWl0aXZlIGhhbmRsaW5nLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21Db3B5OVJvd01ham9yKFxuICAgIG0wMDogbnVtYmVyLFxuICAgIG0wMTogbnVtYmVyLFxuICAgIG0wMjogbnVtYmVyLFxuICAgIG0xMDogbnVtYmVyLFxuICAgIG0xMTogbnVtYmVyLFxuICAgIG0xMjogbnVtYmVyLFxuICAgIG0yMDogbnVtYmVyLFxuICAgIG0yMTogbnVtYmVyLFxuICAgIG0yMjogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdlszXSA9IG0wMTtcbiAgICB2WzZdID0gbTAyO1xuICAgIHZbMV0gPSBtMTA7XG4gICAgdls0XSA9IG0xMTtcbiAgICB2WzddID0gbTEyO1xuICAgIHZbMl0gPSBtMjA7XG4gICAgdls1XSA9IG0yMTtcbiAgICB2WzhdID0gbTIyO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDMzKHYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgQ29sdW1uIE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvcHk5Q29sdW1uTWFqb3IoXG4gICAgbTAwOiBudW1iZXIsXG4gICAgbTEwOiBudW1iZXIsXG4gICAgbTIwOiBudW1iZXIsXG4gICAgbTAxOiBudW1iZXIsXG4gICAgbTExOiBudW1iZXIsXG4gICAgbTIxOiBudW1iZXIsXG4gICAgbTAyOiBudW1iZXIsXG4gICAgbTEyOiBudW1iZXIsXG4gICAgbTIyOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgdlswXSA9IG0wMDtcbiAgICB2WzNdID0gbTAxO1xuICAgIHZbNl0gPSBtMDI7XG4gICAgdlsxXSA9IG0xMDtcbiAgICB2WzRdID0gbTExO1xuICAgIHZbN10gPSBtMTI7XG4gICAgdlsyXSA9IG0yMDtcbiAgICB2WzVdID0gbTIxO1xuICAgIHZbOF0gPSBtMjI7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MzModik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlNYXRyaXg0NChtYXQ6IE1hdHJpeDQ0KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgdi5zZXQobWF0Ll92KTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoZmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgzMyhmbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoZmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB2LnNldChmbG9hdDMyQXJyYXkpO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDMzKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5Um93TWFqb3IoYXJyYXk6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBhcnJheVswXTtcbiAgICB2WzNdID0gYXJyYXlbMV07XG4gICAgdls2XSA9IGFycmF5WzJdO1xuICAgIHZbMV0gPSBhcnJheVszXTtcbiAgICB2WzRdID0gYXJyYXlbNF07XG4gICAgdls3XSA9IGFycmF5WzVdO1xuICAgIHZbMl0gPSBhcnJheVs2XTtcbiAgICB2WzVdID0gYXJyYXlbN107XG4gICAgdls4XSA9IGFycmF5WzhdO1xuXG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MzModik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlNYXRyaXgzMyhtYXQ6IElNYXRyaXgzMykge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBtYXQuX3ZbMF07XG4gICAgdlszXSA9IG1hdC5fdlszXTtcbiAgICB2WzZdID0gbWF0Ll92WzZdO1xuICAgIHZbMV0gPSBtYXQuX3ZbMV07XG4gICAgdls0XSA9IG1hdC5fdls0XTtcbiAgICB2WzddID0gbWF0Ll92WzddO1xuICAgIHZbMl0gPSBtYXQuX3ZbMl07XG4gICAgdls1XSA9IG1hdC5fdls1XTtcbiAgICB2WzhdID0gbWF0Ll92WzhdO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDMzKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXk5Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5OTxudW1iZXI+KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgdi5zZXQoYXJyYXkpO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDMzKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXlDb2x1bW5NYWpvcihhcnJheTogQXJyYXk8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHYuc2V0KGFycmF5KTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXgzMyh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5OVJvd01ham9yKGFycmF5OiBBcnJheTk8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBhcnJheVswXTtcbiAgICB2WzNdID0gYXJyYXlbMV07XG4gICAgdls2XSA9IGFycmF5WzJdO1xuICAgIHZbMV0gPSBhcnJheVszXTtcbiAgICB2WzRdID0gYXJyYXlbNF07XG4gICAgdls3XSA9IGFycmF5WzVdO1xuICAgIHZbMl0gPSBhcnJheVs2XTtcbiAgICB2WzVdID0gYXJyYXlbN107XG4gICAgdls4XSA9IGFycmF5WzhdO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDMzKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXlSb3dNYWpvcihhcnJheTogQXJyYXk8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSBhcnJheVswXTtcbiAgICB2WzNdID0gYXJyYXlbMV07XG4gICAgdls2XSA9IGFycmF5WzJdO1xuICAgIHZbMV0gPSBhcnJheVszXTtcbiAgICB2WzRdID0gYXJyYXlbNF07XG4gICAgdls3XSA9IGFycmF5WzVdO1xuICAgIHZbMl0gPSBhcnJheVs2XTtcbiAgICB2WzVdID0gYXJyYXlbN107XG4gICAgdls4XSA9IGFycmF5WzhdO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDMzKHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5UXVhdGVybmlvbihxOiBJUXVhdGVybmlvbikge1xuICAgIGNvbnN0IHN4ID0gcS5fdlswXSAqIHEuX3ZbMF07XG4gICAgY29uc3Qgc3kgPSBxLl92WzFdICogcS5fdlsxXTtcbiAgICBjb25zdCBzeiA9IHEuX3ZbMl0gKiBxLl92WzJdO1xuICAgIGNvbnN0IGN4ID0gcS5fdlsxXSAqIHEuX3ZbMl07XG4gICAgY29uc3QgY3kgPSBxLl92WzBdICogcS5fdlsyXTtcbiAgICBjb25zdCBjeiA9IHEuX3ZbMF0gKiBxLl92WzFdO1xuICAgIGNvbnN0IHd4ID0gcS5fdlszXSAqIHEuX3ZbMF07XG4gICAgY29uc3Qgd3kgPSBxLl92WzNdICogcS5fdlsxXTtcbiAgICBjb25zdCB3eiA9IHEuX3ZbM10gKiBxLl92WzJdO1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIHZbMF0gPSAxLjAgLSAyLjAgKiAoc3kgKyBzeik7XG4gICAgdlszXSA9IDIuMCAqIChjeiAtIHd6KTtcbiAgICB2WzZdID0gMi4wICogKGN5ICsgd3kpO1xuICAgIHZbMV0gPSAyLjAgKiAoY3ogKyB3eik7XG4gICAgdls0XSA9IDEuMCAtIDIuMCAqIChzeCArIHN6KTtcbiAgICB2WzddID0gMi4wICogKGN4IC0gd3gpO1xuICAgIHZbMl0gPSAyLjAgKiAoY3kgLSB3eSk7XG4gICAgdls1XSA9IDIuMCAqIChjeCArIHd4KTtcbiAgICB2WzhdID0gMS4wIC0gMi4wICogKHN4ICsgc3kpO1xuXG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4MzModik7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1hdHJpeDQ0IH0gZnJvbSAnLi9NYXRyaXg0NCc7XG5pbXBvcnQgeyBJTXV0YWJsZU1hdHJpeDQ0LCBJTXV0YWJsZU1hdHJpeCwgSU1hdHJpeDQ0LCBJTWF0cml4MzMgfSBmcm9tICcuL0lNYXRyaXgnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzJztcbmltcG9ydCB7IEFycmF5MTYsIEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSVF1YXRlcm5pb24gfSBmcm9tICcuL0lRdWF0ZXJuaW9uJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbi8qIGVzbGludC1kaXNhYmxlIHByZXR0aWVyL3ByZXR0aWVyICovXG5jb25zdCBGbG9hdEFycmF5ID0gRmxvYXQzMkFycmF5O1xudHlwZSBGbG9hdEFycmF5ID0gRmxvYXQzMkFycmF5O1xuXG5leHBvcnQgY2xhc3MgTXV0YWJsZU1hdHJpeDQ0IGV4dGVuZHMgTWF0cml4NDQgaW1wbGVtZW50cyBJTXV0YWJsZU1hdHJpeCwgSU11dGFibGVNYXRyaXg0NCB7XG4gIGNvbnN0cnVjdG9yKG06IEZsb2F0QXJyYXkpIHtcbiAgICBzdXBlcihtKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTAwKHZhbCkge1xuICAgIHRoaXMuX3ZbMF0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTEwKHZhbCkge1xuICAgIHRoaXMuX3ZbMV0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTIwKHZhbCkge1xuICAgIHRoaXMuX3ZbMl0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0yMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTMwKHZhbCkge1xuICAgIHRoaXMuX3ZbM10gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0zMCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTAxKHZhbCkge1xuICAgIHRoaXMuX3ZbNF0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdls0XTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTExKHZhbCkge1xuICAgIHRoaXMuX3ZbNV0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdls1XTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTIxKHZhbCkge1xuICAgIHRoaXMuX3ZbNl0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0yMSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdls2XTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTMxKHZhbCkge1xuICAgIHRoaXMuX3ZbN10gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0zMSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdls3XTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTAyKHZhbCkge1xuICAgIHRoaXMuX3ZbOF0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0wMigpIHtcbiAgICByZXR1cm4gdGhpcy5fdls4XTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTEyKHZhbCkge1xuICAgIHRoaXMuX3ZbOV0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0xMigpIHtcbiAgICByZXR1cm4gdGhpcy5fdls5XTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTIyKHZhbCkge1xuICAgIHRoaXMuX3ZbMTBdID0gdmFsO1xuICB9XG5cbiAgcHVibGljIGdldCBtMjIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTBdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMzIodmFsKSB7XG4gICAgdGhpcy5fdlsxMV0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0zMigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxMV07XG4gIH1cblxuICBwdWJsaWMgc2V0IG0wMyh2YWwpIHtcbiAgICB0aGlzLl92WzEyXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTAzKCkge1xuICAgIHJldHVybiB0aGlzLl92WzEyXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbTEzKHZhbCkge1xuICAgIHRoaXMuX3ZbMTNdID0gdmFsO1xuICB9XG5cbiAgcHVibGljIGdldCBtMTMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMTNdO1xuICB9XG5cbiAgcHVibGljIHNldCBtMjModmFsKSB7XG4gICAgdGhpcy5fdlsxNF0gPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG0yMygpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxNF07XG4gIH1cblxuICBwdWJsaWMgc2V0IG0zMyh2YWwpIHtcbiAgICB0aGlzLl92WzE1XSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbTMzKCkge1xuICAgIHJldHVybiB0aGlzLl92WzE1XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRlWCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxMl07XG4gIH1cblxuICBwdWJsaWMgc2V0IHRyYW5zbGF0ZVgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzEyXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRlWSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxM107XG4gIH1cblxuICBwdWJsaWMgc2V0IHRyYW5zbGF0ZVkodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzEzXSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRlWigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxNF07XG4gIH1cblxuICBwdWJsaWMgc2V0IHRyYW5zbGF0ZVoodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzE0XSA9IHZhbDtcbiAgfVxuXG4gIGdldCBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdNdXRhYmxlTWF0cml4NDQnO1xuICB9XG5cbiAgLyoqXG4gICAqIHplcm8gbWF0cml4KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIE11dGFibGVNYXRyaXg0NC5mcm9tQ29weTE2Um93TWFqb3IoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlkZW50aXR5IG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIGlkZW50aXR5KCkge1xuICAgIHJldHVybiBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHkxNlJvd01ham9yKDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBzdXBlci5kdW1teSgpIGFzIE11dGFibGVNYXRyaXg0NDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdHJhbnNwb3NlIG1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHRyYW5zcG9zZShtYXQ6IE1hdHJpeDQ0KSB7XG4gICAgaWYgKG1hdC5pc0lkZW50aXR5TWF0cml4Q2xhc3MpIHtcbiAgICAgIHJldHVybiBtYXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE11dGFibGVNYXRyaXg0NC5mcm9tQ29weUZsb2F0MzJBcnJheVJvd01ham9yKG1hdC5fdik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGludmVydCBtYXRyaXhcbiAgICovXG4gIHN0YXRpYyBpbnZlcnQobWF0OiBNYXRyaXg0NCkge1xuICAgIHJldHVybiBzdXBlci5pbnZlcnQobWF0KSBhcyBNdXRhYmxlTWF0cml4NDQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRyYW5zbGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHRyYW5zbGF0ZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIudHJhbnNsYXRlKHZlYykgYXMgTXV0YWJsZU1hdHJpeDQ0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBYIG9yaWVudGVkIFJvdGF0aW9uIE1hdHJpeFxuICAgKi9cbiAgc3RhdGljIHJvdGF0ZVgocmFkaWFuOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIucm90YXRlWChyYWRpYW4pIGFzIE11dGFibGVNYXRyaXg0NDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgWSBvcmllbnRlZCBSb3RhdGlvbiBNYXRyaXhcbiAgICovXG4gIHN0YXRpYyByb3RhdGVZKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnJvdGF0ZVkocmFkaWFuKSBhcyBNdXRhYmxlTWF0cml4NDQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFogb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICBzdGF0aWMgcm90YXRlWihyYWRpYW46IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5yb3RhdGVaKHJhZGlhbikgYXMgTXV0YWJsZU1hdHJpeDQ0O1xuICB9XG5cbiAgc3RhdGljIHJvdGF0ZVhZWih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnJvdGF0ZVhZWih4LCB5LCB6KSBhcyBNdXRhYmxlTWF0cml4NDQ7XG4gIH1cblxuICBzdGF0aWMgcm90YXRlKHZlYzogVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5yb3RhdGVYWVoodmVjLl92WzBdLCB2ZWMuX3ZbMV0sIHZlYy5fdlsyXSkgYXMgTXV0YWJsZU1hdHJpeDQ0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTY2FsZSBNYXRyaXhcbiAgICovXG4gIHN0YXRpYyBzY2FsZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuc2NhbGUodmVjKSBhcyBNdXRhYmxlTWF0cml4NDQ7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgbWF0cml4ZXNcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseShsX21hdDogTWF0cml4NDQsIHJfbWF0OiBNYXRyaXg0NCkge1xuICAgIHJldHVybiBzdXBlci5tdWx0aXBseShsX21hdCwgcl9tYXQpIGFzIE11dGFibGVNYXRyaXg0NDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmNsb25lKCkgYXMgTXV0YWJsZU1hdHJpeDQ0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRSb3RhdGUoKSB7XG4gICAgY29uc3Qgcm90YXRlTWF0ID0gc3VwZXIuZ2V0Um90YXRlKCkgYXMgTXV0YWJsZU1hdHJpeDQ0O1xuICAgIHJldHVybiByb3RhdGVNYXQ7XG4gIH1cblxuICBnZXRUcmFuc2xhdGUoKSB7XG4gICAgY29uc3Qgcm90YXRlTWF0ID0gc3VwZXIuZ2V0VHJhbnNsYXRlKCkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gICAgcmV0dXJuIHJvdGF0ZU1hdDtcbiAgfVxuXG4gIGdldFNjYWxlKCkge1xuICAgIGNvbnN0IHJvdGF0ZU1hdCA9IHN1cGVyLmdldFNjYWxlKCkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gICAgcmV0dXJuIHJvdGF0ZU1hdDtcbiAgfVxuXG4gIHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy5fdjtcbiAgfVxuXG4gIHNldEF0KHJvd19pOiBudW1iZXIsIGNvbHVtbl9pOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92W3Jvd19pICsgY29sdW1uX2kgKiA0XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29tcG9uZW50cyhcbiAgICBtMDA6IG51bWJlcixcbiAgICBtMDE6IG51bWJlcixcbiAgICBtMDI6IG51bWJlcixcbiAgICBtMDM6IG51bWJlcixcbiAgICBtMTA6IG51bWJlcixcbiAgICBtMTE6IG51bWJlcixcbiAgICBtMTI6IG51bWJlcixcbiAgICBtMTM6IG51bWJlcixcbiAgICBtMjA6IG51bWJlcixcbiAgICBtMjE6IG51bWJlcixcbiAgICBtMjI6IG51bWJlcixcbiAgICBtMjM6IG51bWJlcixcbiAgICBtMzA6IG51bWJlcixcbiAgICBtMzE6IG51bWJlcixcbiAgICBtMzI6IG51bWJlcixcbiAgICBtMzM6IG51bWJlclxuICApIHtcbiAgICB0aGlzLl92WzBdID0gbTAwO1xuICAgIHRoaXMuX3ZbNF0gPSBtMDE7XG4gICAgdGhpcy5fdls4XSA9IG0wMjtcbiAgICB0aGlzLl92WzEyXSA9IG0wMztcbiAgICB0aGlzLl92WzFdID0gbTEwO1xuICAgIHRoaXMuX3ZbNV0gPSBtMTE7XG4gICAgdGhpcy5fdls5XSA9IG0xMjtcbiAgICB0aGlzLl92WzEzXSA9IG0xMztcbiAgICB0aGlzLl92WzJdID0gbTIwO1xuICAgIHRoaXMuX3ZbNl0gPSBtMjE7XG4gICAgdGhpcy5fdlsxMF0gPSBtMjI7XG4gICAgdGhpcy5fdlsxNF0gPSBtMjM7XG4gICAgdGhpcy5fdlszXSA9IG0zMDtcbiAgICB0aGlzLl92WzddID0gbTMxO1xuICAgIHRoaXMuX3ZbMTFdID0gbTMyO1xuICAgIHRoaXMuX3ZbMTVdID0gbTMzO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb3B5Q29tcG9uZW50cyhtYXQ6IElNYXRyaXg0NCkge1xuICAgIHRoaXMuX3ZbMF0gPSBtYXQuX3ZbMF07XG4gICAgdGhpcy5fdls0XSA9IG1hdC5fdls0XTtcbiAgICB0aGlzLl92WzhdID0gbWF0Ll92WzhdO1xuICAgIHRoaXMuX3ZbMTJdID0gbWF0Ll92WzEyXTtcbiAgICB0aGlzLl92WzFdID0gbWF0Ll92WzFdO1xuICAgIHRoaXMuX3ZbNV0gPSBtYXQuX3ZbNV07XG4gICAgdGhpcy5fdls5XSA9IG1hdC5fdls5XTtcbiAgICB0aGlzLl92WzEzXSA9IG1hdC5fdlsxM107XG4gICAgdGhpcy5fdlsyXSA9IG1hdC5fdlsyXTtcbiAgICB0aGlzLl92WzZdID0gbWF0Ll92WzZdO1xuICAgIHRoaXMuX3ZbMTBdID0gbWF0Ll92WzEwXTtcbiAgICB0aGlzLl92WzE0XSA9IG1hdC5fdlsxNF07XG4gICAgdGhpcy5fdlszXSA9IG1hdC5fdlszXTtcbiAgICB0aGlzLl92WzddID0gbWF0Ll92WzddO1xuICAgIHRoaXMuX3ZbMTFdID0gbWF0Ll92WzExXTtcbiAgICB0aGlzLl92WzE1XSA9IG1hdC5fdlsxNV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiB6ZXJvIG1hdHJpeFxuICAgKi9cbiAgemVybygpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAgICovXG4gIGlkZW50aXR5KCkge1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSk7XG4gIH1cblxuICBfc3dhcChsOiBJbmRleCwgcjogSW5kZXgpIHtcbiAgICB0aGlzLl92W3JdID0gW3RoaXMuX3ZbbF0sICh0aGlzLl92W2xdID0gdGhpcy5fdltyXSldWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYW5zcG9zZVxuICAgKi9cbiAgdHJhbnNwb3NlKCkge1xuICAgIHRoaXMuX3N3YXAoMSwgNCk7XG4gICAgdGhpcy5fc3dhcCgyLCA4KTtcbiAgICB0aGlzLl9zd2FwKDMsIDEyKTtcbiAgICB0aGlzLl9zd2FwKDYsIDkpO1xuICAgIHRoaXMuX3N3YXAoNywgMTMpO1xuICAgIHRoaXMuX3N3YXAoMTEsIDE0KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaW52ZXJ0KCkge1xuICAgIGNvbnN0IG4wMCA9IHRoaXMuX3ZbMF0gKiB0aGlzLl92WzVdIC0gdGhpcy5fdls0XSAqIHRoaXMuX3ZbMV07XG4gICAgY29uc3QgbjAxID0gdGhpcy5fdlswXSAqIHRoaXMuX3ZbOV0gLSB0aGlzLl92WzhdICogdGhpcy5fdlsxXTtcbiAgICBjb25zdCBuMDIgPSB0aGlzLl92WzBdICogdGhpcy5fdlsxM10gLSB0aGlzLl92WzEyXSAqIHRoaXMuX3ZbMV07XG4gICAgY29uc3QgbjAzID0gdGhpcy5fdls0XSAqIHRoaXMuX3ZbOV0gLSB0aGlzLl92WzhdICogdGhpcy5fdls1XTtcbiAgICBjb25zdCBuMDQgPSB0aGlzLl92WzRdICogdGhpcy5fdlsxM10gLSB0aGlzLl92WzEyXSAqIHRoaXMuX3ZbNV07XG4gICAgY29uc3QgbjA1ID0gdGhpcy5fdls4XSAqIHRoaXMuX3ZbMTNdIC0gdGhpcy5fdlsxMl0gKiB0aGlzLl92WzldO1xuICAgIGNvbnN0IG4wNiA9IHRoaXMuX3ZbMl0gKiB0aGlzLl92WzddIC0gdGhpcy5fdls2XSAqIHRoaXMuX3ZbM107XG4gICAgY29uc3QgbjA3ID0gdGhpcy5fdlsyXSAqIHRoaXMuX3ZbMTFdIC0gdGhpcy5fdlsxMF0gKiB0aGlzLl92WzNdO1xuICAgIGNvbnN0IG4wOCA9IHRoaXMuX3ZbMl0gKiB0aGlzLl92WzE1XSAtIHRoaXMuX3ZbMTRdICogdGhpcy5fdlszXTtcbiAgICBjb25zdCBuMDkgPSB0aGlzLl92WzZdICogdGhpcy5fdlsxMV0gLSB0aGlzLl92WzEwXSAqIHRoaXMuX3ZbN107XG4gICAgY29uc3QgbjEwID0gdGhpcy5fdls2XSAqIHRoaXMuX3ZbMTVdIC0gdGhpcy5fdlsxNF0gKiB0aGlzLl92WzddO1xuICAgIGNvbnN0IG4xMSA9IHRoaXMuX3ZbMTBdICogdGhpcy5fdlsxNV0gLSB0aGlzLl92WzE0XSAqIHRoaXMuX3ZbMTFdO1xuXG4gICAgY29uc3QgZGV0ID0gbjAwICogbjExIC0gbjAxICogbjEwICsgbjAyICogbjA5ICsgbjAzICogbjA4IC0gbjA0ICogbjA3ICsgbjA1ICogbjA2O1xuICAgIGlmIChkZXQgPT09IDApIHtcbiAgICAgIExvZ2dlci5lcnJvcigndGhlIGRldGVybWluYW50IGlzIDAhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbTAwID0gKHRoaXMuX3ZbNV0gKiBuMTEgLSB0aGlzLl92WzldICogbjEwICsgdGhpcy5fdlsxM10gKiBuMDkpIC8gZGV0O1xuICAgIGNvbnN0IG0wMSA9ICh0aGlzLl92WzhdICogbjEwIC0gdGhpcy5fdls0XSAqIG4xMSAtIHRoaXMuX3ZbMTJdICogbjA5KSAvIGRldDtcbiAgICBjb25zdCBtMDIgPSAodGhpcy5fdls3XSAqIG4wNSAtIHRoaXMuX3ZbMTFdICogbjA0ICsgdGhpcy5fdlsxNV0gKiBuMDMpIC8gZGV0O1xuICAgIGNvbnN0IG0wMyA9ICh0aGlzLl92WzEwXSAqIG4wNCAtIHRoaXMuX3ZbNl0gKiBuMDUgLSB0aGlzLl92WzE0XSAqIG4wMykgLyBkZXQ7XG4gICAgY29uc3QgbTEwID0gKHRoaXMuX3ZbOV0gKiBuMDggLSB0aGlzLl92WzFdICogbjExIC0gdGhpcy5fdlsxM10gKiBuMDcpIC8gZGV0O1xuICAgIGNvbnN0IG0xMSA9ICh0aGlzLl92WzBdICogbjExIC0gdGhpcy5fdls4XSAqIG4wOCArIHRoaXMuX3ZbMTJdICogbjA3KSAvIGRldDtcbiAgICBjb25zdCBtMTIgPSAodGhpcy5fdlsxMV0gKiBuMDIgLSB0aGlzLl92WzNdICogbjA1IC0gdGhpcy5fdlsxNV0gKiBuMDEpIC8gZGV0O1xuICAgIGNvbnN0IG0xMyA9ICh0aGlzLl92WzJdICogbjA1IC0gdGhpcy5fdlsxMF0gKiBuMDIgKyB0aGlzLl92WzE0XSAqIG4wMSkgLyBkZXQ7XG4gICAgY29uc3QgbTIwID0gKHRoaXMuX3ZbMV0gKiBuMTAgLSB0aGlzLl92WzVdICogbjA4ICsgdGhpcy5fdlsxM10gKiBuMDYpIC8gZGV0O1xuICAgIGNvbnN0IG0yMSA9ICh0aGlzLl92WzRdICogbjA4IC0gdGhpcy5fdlswXSAqIG4xMCAtIHRoaXMuX3ZbMTJdICogbjA2KSAvIGRldDtcbiAgICBjb25zdCBtMjIgPSAodGhpcy5fdlszXSAqIG4wNCAtIHRoaXMuX3ZbN10gKiBuMDIgKyB0aGlzLl92WzE1XSAqIG4wMCkgLyBkZXQ7XG4gICAgY29uc3QgbTIzID0gKHRoaXMuX3ZbNl0gKiBuMDIgLSB0aGlzLl92WzJdICogbjA0IC0gdGhpcy5fdlsxNF0gKiBuMDApIC8gZGV0O1xuICAgIGNvbnN0IG0zMCA9ICh0aGlzLl92WzVdICogbjA3IC0gdGhpcy5fdlsxXSAqIG4wOSAtIHRoaXMuX3ZbOV0gKiBuMDYpIC8gZGV0O1xuICAgIGNvbnN0IG0zMSA9ICh0aGlzLl92WzBdICogbjA5IC0gdGhpcy5fdls0XSAqIG4wNyArIHRoaXMuX3ZbOF0gKiBuMDYpIC8gZGV0O1xuICAgIGNvbnN0IG0zMiA9ICh0aGlzLl92WzddICogbjAxIC0gdGhpcy5fdlszXSAqIG4wMyAtIHRoaXMuX3ZbMTFdICogbjAwKSAvIGRldDtcbiAgICBjb25zdCBtMzMgPSAodGhpcy5fdlsyXSAqIG4wMyAtIHRoaXMuX3ZbNl0gKiBuMDEgKyB0aGlzLl92WzEwXSAqIG4wMCkgLyBkZXQ7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIHRyYW5zbGF0ZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKFxuICAgICAgMSxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdmVjLl92WzBdLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgdmVjLl92WzFdLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgdmVjLl92WzJdLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMVxuICAgICk7XG4gIH1cblxuICBwdXRUcmFuc2xhdGUodmVjOiBWZWN0b3IzKSB7XG4gICAgdGhpcy5fdlsxMl0gPSB2ZWMuX3ZbMF07XG4gICAgdGhpcy5fdlsxM10gPSB2ZWMuX3ZbMV07XG4gICAgdGhpcy5fdlsxNF0gPSB2ZWMuX3ZbMl07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRUcmFuc2xhdGUodmVjOiBWZWN0b3IzKSB7XG4gICAgdGhpcy5fdlsxMl0gKz0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMTNdICs9IHZlYy5fdlsxXTtcbiAgICB0aGlzLl92WzE0XSArPSB2ZWMuX3ZbMl07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFggb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICByb3RhdGVYKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoMSwgMCwgMCwgMCwgMCwgY29zLCAtc2luLCAwLCAwLCBzaW4sIGNvcywgMCwgMCwgMCwgMCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFkgb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICByb3RhdGVZKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoY29zLCAwLCBzaW4sIDAsIDAsIDEsIDAsIDAsIC1zaW4sIDAsIGNvcywgMCwgMCwgMCwgMCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFogb3JpZW50ZWQgUm90YXRpb24gTWF0cml4XG4gICAqL1xuICByb3RhdGVaKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoY29zLCAtc2luLCAwLCAwLCBzaW4sIGNvcywgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSk7XG4gIH1cblxuICByb3RhdGVYWVooeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikge1xuICAgIGNvbnN0IGNvc1ggPSBNYXRoLmNvcyh4KTtcbiAgICBjb25zdCBzaW5YID0gTWF0aC5zaW4oeCk7XG4gICAgY29uc3QgY29zWSA9IE1hdGguY29zKHkpO1xuICAgIGNvbnN0IHNpblkgPSBNYXRoLnNpbih5KTtcbiAgICBjb25zdCBjb3NaID0gTWF0aC5jb3Moeik7XG4gICAgY29uc3Qgc2luWiA9IE1hdGguc2luKHopO1xuXG4gICAgLy8gY29uc3QgeDAwID0gMTtcbiAgICAvLyBjb25zdCB4MDEgPSAwO1xuICAgIC8vIGNvbnN0IHgwMiA9IDA7XG4gICAgLy8gY29uc3QgeDEwID0gMDtcbiAgICBjb25zdCB4MTEgPSBjb3NYO1xuICAgIGNvbnN0IHgxMiA9IC1zaW5YO1xuICAgIC8vIGNvbnN0IHgyMCA9IDA7XG4gICAgY29uc3QgeDIxID0gc2luWDtcbiAgICBjb25zdCB4MjIgPSBjb3NYO1xuXG4gICAgY29uc3QgeTAwID0gY29zWTtcbiAgICAvLyBjb25zdCB5MDEgPSAwO1xuICAgIGNvbnN0IHkwMiA9IHNpblk7XG4gICAgLy8gY29uc3QgeTEwID0gMDtcbiAgICAvLyBjb25zdCB5MTEgPSAxO1xuICAgIC8vIGNvbnN0IHkxMiA9IDA7XG4gICAgY29uc3QgeTIwID0gLXNpblk7XG4gICAgLy8gY29uc3QgeTIxID0gMDtcbiAgICBjb25zdCB5MjIgPSBjb3NZO1xuXG4gICAgY29uc3QgejAwID0gY29zWjtcbiAgICBjb25zdCB6MDEgPSAtc2luWjtcbiAgICAvLyBjb25zdCB6MDIgPSAwO1xuICAgIGNvbnN0IHoxMCA9IHNpblo7XG4gICAgY29uc3QgejExID0gY29zWjtcbiAgICAvLyBjb25zdCB6MTIgPSAwO1xuICAgIC8vIGNvbnN0IHoyMCA9IDA7XG4gICAgLy8gY29uc3QgejIxID0gMDtcbiAgICAvLyBjb25zdCB6MjIgPSAxO1xuXG4gICAgLy8gWSAqIFhcbiAgICBjb25zdCB5eDAwID0geTAwO1xuICAgIGNvbnN0IHl4MDEgPSB5MDIgKiB4MjE7XG4gICAgY29uc3QgeXgwMiA9IHkwMiAqIHgyMjtcbiAgICAvL2NvbnN0IHl4MTAgPSAwO1xuICAgIGNvbnN0IHl4MTEgPSB4MTE7XG4gICAgY29uc3QgeXgxMiA9IHgxMjtcbiAgICBjb25zdCB5eDIwID0geTIwO1xuICAgIGNvbnN0IHl4MjEgPSB5MjIgKiB4MjE7XG4gICAgY29uc3QgeXgyMiA9IHkyMiAqIHgyMjtcblxuICAgIC8vIFogKiBZICogWFxuICAgIGNvbnN0IG0wMCA9IHowMCAqIHl4MDA7XG4gICAgY29uc3QgbTAxID0gejAwICogeXgwMSArIHowMSAqIHl4MTE7XG4gICAgY29uc3QgbTAyID0gejAwICogeXgwMiArIHowMSAqIHl4MTI7XG4gICAgY29uc3QgbTEwID0gejEwICogeXgwMDtcbiAgICBjb25zdCBtMTEgPSB6MTAgKiB5eDAxICsgejExICogeXgxMTtcbiAgICBjb25zdCBtMTIgPSB6MTAgKiB5eDAyICsgejExICogeXgxMjtcbiAgICBjb25zdCBtMjAgPSB5eDIwO1xuICAgIGNvbnN0IG0yMSA9IHl4MjE7XG4gICAgY29uc3QgbTIyID0geXgyMjtcblxuICAgIGNvbnN0IG0wMyA9IDA7XG4gICAgY29uc3QgbTEzID0gMDtcbiAgICBjb25zdCBtMjMgPSAwO1xuICAgIGNvbnN0IG0zMCA9IDA7XG4gICAgY29uc3QgbTMxID0gMDtcbiAgICBjb25zdCBtMzIgPSAwO1xuICAgIGNvbnN0IG0zMyA9IDE7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIHJvdGF0ZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5yb3RhdGVYWVoodmVjLl92WzBdLCB2ZWMuX3ZbMV0sIHZlYy5fdlsyXSk7XG4gIH1cblxuICBzY2FsZSh2ZWM6IFZlY3RvcjMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKFxuICAgICAgdmVjLl92WzBdLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHZlYy5fdlsxXSxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB2ZWMuX3ZbMl0sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMVxuICAgICk7XG4gIH1cblxuICBtdWx0aXBseVNjYWxlKHZlYzogVmVjdG9yMykge1xuICAgIHRoaXMuX3ZbMF0gKj0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbNF0gKj0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbOF0gKj0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMTJdICo9IHZlYy5fdlswXTtcblxuICAgIHRoaXMuX3ZbMV0gKj0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbNV0gKj0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbOV0gKj0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbMTNdICo9IHZlYy5fdlsxXTtcblxuICAgIHRoaXMuX3ZbMl0gKj0gdmVjLl92WzJdO1xuICAgIHRoaXMuX3ZbNl0gKj0gdmVjLl92WzJdO1xuICAgIHRoaXMuX3ZbMTBdICo9IHZlYy5fdlsyXTtcbiAgICB0aGlzLl92WzE0XSAqPSB2ZWMuX3ZbMl07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB0aGUgaW5wdXQgbWF0cml4IGZyb20gcmlnaHQgc2lkZVxuICAgKi9cbiAgbXVsdGlwbHkobWF0OiBNYXRyaXg0NCkge1xuICAgIGlmIChtYXQuaXNJZGVudGl0eU1hdHJpeENsYXNzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY29uc3QgbTAwID1cbiAgICAgIHRoaXMuX3ZbMF0gKiBtYXQuX3ZbMF0gK1xuICAgICAgdGhpcy5fdls0XSAqIG1hdC5fdlsxXSArXG4gICAgICB0aGlzLl92WzhdICogbWF0Ll92WzJdICtcbiAgICAgIHRoaXMuX3ZbMTJdICogbWF0Ll92WzNdO1xuICAgIGNvbnN0IG0wMSA9XG4gICAgICB0aGlzLl92WzBdICogbWF0Ll92WzRdICtcbiAgICAgIHRoaXMuX3ZbNF0gKiBtYXQuX3ZbNV0gK1xuICAgICAgdGhpcy5fdls4XSAqIG1hdC5fdls2XSArXG4gICAgICB0aGlzLl92WzEyXSAqIG1hdC5fdls3XTtcbiAgICBjb25zdCBtMDIgPVxuICAgICAgdGhpcy5fdlswXSAqIG1hdC5fdls4XSArXG4gICAgICB0aGlzLl92WzRdICogbWF0Ll92WzldICtcbiAgICAgIHRoaXMuX3ZbOF0gKiBtYXQuX3ZbMTBdICtcbiAgICAgIHRoaXMuX3ZbMTJdICogbWF0Ll92WzExXTtcbiAgICBjb25zdCBtMDMgPVxuICAgICAgdGhpcy5fdlswXSAqIG1hdC5fdlsxMl0gK1xuICAgICAgdGhpcy5fdls0XSAqIG1hdC5fdlsxM10gK1xuICAgICAgdGhpcy5fdls4XSAqIG1hdC5fdlsxNF0gK1xuICAgICAgdGhpcy5fdlsxMl0gKiBtYXQuX3ZbMTVdO1xuXG4gICAgY29uc3QgbTEwID1cbiAgICAgIHRoaXMuX3ZbMV0gKiBtYXQuX3ZbMF0gK1xuICAgICAgdGhpcy5fdls1XSAqIG1hdC5fdlsxXSArXG4gICAgICB0aGlzLl92WzldICogbWF0Ll92WzJdICtcbiAgICAgIHRoaXMuX3ZbMTNdICogbWF0Ll92WzNdO1xuICAgIGNvbnN0IG0xMSA9XG4gICAgICB0aGlzLl92WzFdICogbWF0Ll92WzRdICtcbiAgICAgIHRoaXMuX3ZbNV0gKiBtYXQuX3ZbNV0gK1xuICAgICAgdGhpcy5fdls5XSAqIG1hdC5fdls2XSArXG4gICAgICB0aGlzLl92WzEzXSAqIG1hdC5fdls3XTtcbiAgICBjb25zdCBtMTIgPVxuICAgICAgdGhpcy5fdlsxXSAqIG1hdC5fdls4XSArXG4gICAgICB0aGlzLl92WzVdICogbWF0Ll92WzldICtcbiAgICAgIHRoaXMuX3ZbOV0gKiBtYXQuX3ZbMTBdICtcbiAgICAgIHRoaXMuX3ZbMTNdICogbWF0Ll92WzExXTtcbiAgICBjb25zdCBtMTMgPVxuICAgICAgdGhpcy5fdlsxXSAqIG1hdC5fdlsxMl0gK1xuICAgICAgdGhpcy5fdls1XSAqIG1hdC5fdlsxM10gK1xuICAgICAgdGhpcy5fdls5XSAqIG1hdC5fdlsxNF0gK1xuICAgICAgdGhpcy5fdlsxM10gKiBtYXQuX3ZbMTVdO1xuXG4gICAgY29uc3QgbTIwID1cbiAgICAgIHRoaXMuX3ZbMl0gKiBtYXQuX3ZbMF0gK1xuICAgICAgdGhpcy5fdls2XSAqIG1hdC5fdlsxXSArXG4gICAgICB0aGlzLl92WzEwXSAqIG1hdC5fdlsyXSArXG4gICAgICB0aGlzLl92WzE0XSAqIG1hdC5fdlszXTtcbiAgICBjb25zdCBtMjEgPVxuICAgICAgdGhpcy5fdlsyXSAqIG1hdC5fdls0XSArXG4gICAgICB0aGlzLl92WzZdICogbWF0Ll92WzVdICtcbiAgICAgIHRoaXMuX3ZbMTBdICogbWF0Ll92WzZdICtcbiAgICAgIHRoaXMuX3ZbMTRdICogbWF0Ll92WzddO1xuICAgIGNvbnN0IG0yMiA9XG4gICAgICB0aGlzLl92WzJdICogbWF0Ll92WzhdICtcbiAgICAgIHRoaXMuX3ZbNl0gKiBtYXQuX3ZbOV0gK1xuICAgICAgdGhpcy5fdlsxMF0gKiBtYXQuX3ZbMTBdICtcbiAgICAgIHRoaXMuX3ZbMTRdICogbWF0Ll92WzExXTtcbiAgICBjb25zdCBtMjMgPVxuICAgICAgdGhpcy5fdlsyXSAqIG1hdC5fdlsxMl0gK1xuICAgICAgdGhpcy5fdls2XSAqIG1hdC5fdlsxM10gK1xuICAgICAgdGhpcy5fdlsxMF0gKiBtYXQuX3ZbMTRdICtcbiAgICAgIHRoaXMuX3ZbMTRdICogbWF0Ll92WzE1XTtcblxuICAgIGNvbnN0IG0zMCA9XG4gICAgICB0aGlzLl92WzNdICogbWF0Ll92WzBdICtcbiAgICAgIHRoaXMuX3ZbN10gKiBtYXQuX3ZbMV0gK1xuICAgICAgdGhpcy5fdlsxMV0gKiBtYXQuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlsxNV0gKiBtYXQuX3ZbM107XG4gICAgY29uc3QgbTMxID1cbiAgICAgIHRoaXMuX3ZbM10gKiBtYXQuX3ZbNF0gK1xuICAgICAgdGhpcy5fdls3XSAqIG1hdC5fdls1XSArXG4gICAgICB0aGlzLl92WzExXSAqIG1hdC5fdls2XSArXG4gICAgICB0aGlzLl92WzE1XSAqIG1hdC5fdls3XTtcbiAgICBjb25zdCBtMzIgPVxuICAgICAgdGhpcy5fdlszXSAqIG1hdC5fdls4XSArXG4gICAgICB0aGlzLl92WzddICogbWF0Ll92WzldICtcbiAgICAgIHRoaXMuX3ZbMTFdICogbWF0Ll92WzEwXSArXG4gICAgICB0aGlzLl92WzE1XSAqIG1hdC5fdlsxMV07XG4gICAgY29uc3QgbTMzID1cbiAgICAgIHRoaXMuX3ZbM10gKiBtYXQuX3ZbMTJdICtcbiAgICAgIHRoaXMuX3ZbN10gKiBtYXQuX3ZbMTNdICtcbiAgICAgIHRoaXMuX3ZbMTFdICogbWF0Ll92WzE0XSArXG4gICAgICB0aGlzLl92WzE1XSAqIG1hdC5fdlsxNV07XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKFxuICAgICAgbTAwLFxuICAgICAgbTAxLFxuICAgICAgbTAyLFxuICAgICAgbTAzLFxuICAgICAgbTEwLFxuICAgICAgbTExLFxuICAgICAgbTEyLFxuICAgICAgbTEzLFxuICAgICAgbTIwLFxuICAgICAgbTIxLFxuICAgICAgbTIyLFxuICAgICAgbTIzLFxuICAgICAgbTMwLFxuICAgICAgbTMxLFxuICAgICAgbTMyLFxuICAgICAgbTMzXG4gICAgKTtcbiAgfVxuXG4gIG11bHRpcGx5QnlMZWZ0KG1hdDogTWF0cml4NDQpIHtcbiAgICBpZiAobWF0LmlzSWRlbnRpdHlNYXRyaXhDbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbnN0IG0wMCA9XG4gICAgICBtYXQuX3ZbMF0gKiB0aGlzLl92WzBdICtcbiAgICAgIG1hdC5fdls0XSAqIHRoaXMuX3ZbMV0gK1xuICAgICAgbWF0Ll92WzhdICogdGhpcy5fdlsyXSArXG4gICAgICBtYXQuX3ZbMTJdICogdGhpcy5fdlszXTtcbiAgICBjb25zdCBtMDEgPVxuICAgICAgbWF0Ll92WzBdICogdGhpcy5fdls0XSArXG4gICAgICBtYXQuX3ZbNF0gKiB0aGlzLl92WzVdICtcbiAgICAgIG1hdC5fdls4XSAqIHRoaXMuX3ZbNl0gK1xuICAgICAgbWF0Ll92WzEyXSAqIHRoaXMuX3ZbN107XG4gICAgY29uc3QgbTAyID1cbiAgICAgIG1hdC5fdlswXSAqIHRoaXMuX3ZbOF0gK1xuICAgICAgbWF0Ll92WzRdICogdGhpcy5fdls5XSArXG4gICAgICBtYXQuX3ZbOF0gKiB0aGlzLl92WzEwXSArXG4gICAgICBtYXQuX3ZbMTJdICogdGhpcy5fdlsxMV07XG4gICAgY29uc3QgbTAzID1cbiAgICAgIG1hdC5fdlswXSAqIHRoaXMuX3ZbMTJdICtcbiAgICAgIG1hdC5fdls0XSAqIHRoaXMuX3ZbMTNdICtcbiAgICAgIG1hdC5fdls4XSAqIHRoaXMuX3ZbMTRdICtcbiAgICAgIG1hdC5fdlsxMl0gKiB0aGlzLl92WzE1XTtcblxuICAgIGNvbnN0IG0xMCA9XG4gICAgICBtYXQuX3ZbMV0gKiB0aGlzLl92WzBdICtcbiAgICAgIG1hdC5fdls1XSAqIHRoaXMuX3ZbMV0gK1xuICAgICAgbWF0Ll92WzldICogdGhpcy5fdlsyXSArXG4gICAgICBtYXQuX3ZbMTNdICogdGhpcy5fdlszXTtcbiAgICBjb25zdCBtMTEgPVxuICAgICAgbWF0Ll92WzFdICogdGhpcy5fdls0XSArXG4gICAgICBtYXQuX3ZbNV0gKiB0aGlzLl92WzVdICtcbiAgICAgIG1hdC5fdls5XSAqIHRoaXMuX3ZbNl0gK1xuICAgICAgbWF0Ll92WzEzXSAqIHRoaXMuX3ZbN107XG4gICAgY29uc3QgbTEyID1cbiAgICAgIG1hdC5fdlsxXSAqIHRoaXMuX3ZbOF0gK1xuICAgICAgbWF0Ll92WzVdICogdGhpcy5fdls5XSArXG4gICAgICBtYXQuX3ZbOV0gKiB0aGlzLl92WzEwXSArXG4gICAgICBtYXQuX3ZbMTNdICogdGhpcy5fdlsxMV07XG4gICAgY29uc3QgbTEzID1cbiAgICAgIG1hdC5fdlsxXSAqIHRoaXMuX3ZbMTJdICtcbiAgICAgIG1hdC5fdls1XSAqIHRoaXMuX3ZbMTNdICtcbiAgICAgIG1hdC5fdls5XSAqIHRoaXMuX3ZbMTRdICtcbiAgICAgIG1hdC5fdlsxM10gKiB0aGlzLl92WzE1XTtcblxuICAgIGNvbnN0IG0yMCA9XG4gICAgICBtYXQuX3ZbMl0gKiB0aGlzLl92WzBdICtcbiAgICAgIG1hdC5fdls2XSAqIHRoaXMuX3ZbMV0gK1xuICAgICAgbWF0Ll92WzEwXSAqIHRoaXMuX3ZbMl0gK1xuICAgICAgbWF0Ll92WzE0XSAqIHRoaXMuX3ZbM107XG4gICAgY29uc3QgbTIxID1cbiAgICAgIG1hdC5fdlsyXSAqIHRoaXMuX3ZbNF0gK1xuICAgICAgbWF0Ll92WzZdICogdGhpcy5fdls1XSArXG4gICAgICBtYXQuX3ZbMTBdICogdGhpcy5fdls2XSArXG4gICAgICBtYXQuX3ZbMTRdICogdGhpcy5fdls3XTtcbiAgICBjb25zdCBtMjIgPVxuICAgICAgbWF0Ll92WzJdICogdGhpcy5fdls4XSArXG4gICAgICBtYXQuX3ZbNl0gKiB0aGlzLl92WzldICtcbiAgICAgIG1hdC5fdlsxMF0gKiB0aGlzLl92WzEwXSArXG4gICAgICBtYXQuX3ZbMTRdICogdGhpcy5fdlsxMV07XG4gICAgY29uc3QgbTIzID1cbiAgICAgIG1hdC5fdlsyXSAqIHRoaXMuX3ZbMTJdICtcbiAgICAgIG1hdC5fdls2XSAqIHRoaXMuX3ZbMTNdICtcbiAgICAgIG1hdC5fdlsxMF0gKiB0aGlzLl92WzE0XSArXG4gICAgICBtYXQuX3ZbMTRdICogdGhpcy5fdlsxNV07XG5cbiAgICBjb25zdCBtMzAgPVxuICAgICAgbWF0Ll92WzNdICogdGhpcy5fdlswXSArXG4gICAgICBtYXQuX3ZbN10gKiB0aGlzLl92WzFdICtcbiAgICAgIG1hdC5fdlsxMV0gKiB0aGlzLl92WzJdICtcbiAgICAgIG1hdC5fdlsxNV0gKiB0aGlzLl92WzNdO1xuICAgIGNvbnN0IG0zMSA9XG4gICAgICBtYXQuX3ZbM10gKiB0aGlzLl92WzRdICtcbiAgICAgIG1hdC5fdls3XSAqIHRoaXMuX3ZbNV0gK1xuICAgICAgbWF0Ll92WzExXSAqIHRoaXMuX3ZbNl0gK1xuICAgICAgbWF0Ll92WzE1XSAqIHRoaXMuX3ZbN107XG4gICAgY29uc3QgbTMyID1cbiAgICAgIG1hdC5fdlszXSAqIHRoaXMuX3ZbOF0gK1xuICAgICAgbWF0Ll92WzddICogdGhpcy5fdls5XSArXG4gICAgICBtYXQuX3ZbMTFdICogdGhpcy5fdlsxMF0gK1xuICAgICAgbWF0Ll92WzE1XSAqIHRoaXMuX3ZbMTFdO1xuICAgIGNvbnN0IG0zMyA9XG4gICAgICBtYXQuX3ZbM10gKiB0aGlzLl92WzEyXSArXG4gICAgICBtYXQuX3ZbN10gKiB0aGlzLl92WzEzXSArXG4gICAgICBtYXQuX3ZbMTFdICogdGhpcy5fdlsxNF0gK1xuICAgICAgbWF0Ll92WzE1XSAqIHRoaXMuX3ZbMTVdO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyhcbiAgICAgIG0wMCxcbiAgICAgIG0wMSxcbiAgICAgIG0wMixcbiAgICAgIG0wMyxcbiAgICAgIG0xMCxcbiAgICAgIG0xMSxcbiAgICAgIG0xMixcbiAgICAgIG0xMyxcbiAgICAgIG0yMCxcbiAgICAgIG0yMSxcbiAgICAgIG0yMixcbiAgICAgIG0yMyxcbiAgICAgIG0zMCxcbiAgICAgIG0zMSxcbiAgICAgIG0zMixcbiAgICAgIG0zM1xuICAgICk7XG4gIH1cblxuICBmcm9tUXVhdGVybmlvbihxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIGNvbnN0IHN4ID0gcXVhdC5fdlswXSAqIHF1YXQuX3ZbMF07XG4gICAgY29uc3Qgc3kgPSBxdWF0Ll92WzFdICogcXVhdC5fdlsxXTtcbiAgICBjb25zdCBzeiA9IHF1YXQuX3ZbMl0gKiBxdWF0Ll92WzJdO1xuICAgIGNvbnN0IGN4ID0gcXVhdC5fdlsxXSAqIHF1YXQuX3ZbMl07XG4gICAgY29uc3QgY3kgPSBxdWF0Ll92WzBdICogcXVhdC5fdlsyXTtcbiAgICBjb25zdCBjeiA9IHF1YXQuX3ZbMF0gKiBxdWF0Ll92WzFdO1xuICAgIGNvbnN0IHd4ID0gcXVhdC5fdlszXSAqIHF1YXQuX3ZbMF07XG4gICAgY29uc3Qgd3kgPSBxdWF0Ll92WzNdICogcXVhdC5fdlsxXTtcbiAgICBjb25zdCB3eiA9IHF1YXQuX3ZbM10gKiBxdWF0Ll92WzJdO1xuXG4gICAgY29uc3QgbTAwID0gMS4wIC0gMi4wICogKHN5ICsgc3opO1xuICAgIGNvbnN0IG0wMSA9IDIuMCAqIChjeiAtIHd6KTtcbiAgICBjb25zdCBtMDIgPSAyLjAgKiAoY3kgKyB3eSk7XG4gICAgY29uc3QgbTAzID0gMDtcbiAgICBjb25zdCBtMTAgPSAyLjAgKiAoY3ogKyB3eik7XG4gICAgY29uc3QgbTExID0gMS4wIC0gMi4wICogKHN4ICsgc3opO1xuICAgIGNvbnN0IG0xMiA9IDIuMCAqIChjeCAtIHd4KTtcbiAgICBjb25zdCBtMTMgPSAwO1xuICAgIGNvbnN0IG0yMCA9IDIuMCAqIChjeSAtIHd5KTtcbiAgICBjb25zdCBtMjEgPSAyLjAgKiAoY3ggKyB3eCk7XG4gICAgY29uc3QgbTIyID0gMS4wIC0gMi4wICogKHN4ICsgc3kpO1xuICAgIGNvbnN0IG0yMyA9IDA7XG4gICAgY29uc3QgbTMwID0gMDtcbiAgICBjb25zdCBtMzEgPSAwO1xuICAgIGNvbnN0IG0zMiA9IDA7XG4gICAgY29uc3QgbTMzID0gMTtcblxuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoXG4gICAgICBtMDAsXG4gICAgICBtMDEsXG4gICAgICBtMDIsXG4gICAgICBtMDMsXG4gICAgICBtMTAsXG4gICAgICBtMTEsXG4gICAgICBtMTIsXG4gICAgICBtMTMsXG4gICAgICBtMjAsXG4gICAgICBtMjEsXG4gICAgICBtMjIsXG4gICAgICBtMjMsXG4gICAgICBtMzAsXG4gICAgICBtMzEsXG4gICAgICBtMzIsXG4gICAgICBtMzNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZXMgYXMgUm93IE1ham9yXG4gICAqIE5vdGUgdGhhdCBXZWJHTCBtYXRyaXgga2VlcHMgdGhlIHZhbHVlcyBpbiBjb2x1bW4gbWFqb3IuXG4gICAqIElmIHlvdSB3cml0ZSAxNiB2YWx1ZXMgaW4gNHg0IHN0eWxlICg0IHZhbHVlcyBpbiBlYWNoIHJvdyksXG4gICAqICAgSXQgd2lsbCBiZWNvbWVzIGFuIGludHVpdGl2ZSBoYW5kbGluZy5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tQ29weTE2Um93TWFqb3IoXG4gICAgbTAwOiBudW1iZXIsXG4gICAgbTAxOiBudW1iZXIsXG4gICAgbTAyOiBudW1iZXIsXG4gICAgbTAzOiBudW1iZXIsXG4gICAgbTEwOiBudW1iZXIsXG4gICAgbTExOiBudW1iZXIsXG4gICAgbTEyOiBudW1iZXIsXG4gICAgbTEzOiBudW1iZXIsXG4gICAgbTIwOiBudW1iZXIsXG4gICAgbTIxOiBudW1iZXIsXG4gICAgbTIyOiBudW1iZXIsXG4gICAgbTIzOiBudW1iZXIsXG4gICAgbTMwOiBudW1iZXIsXG4gICAgbTMxOiBudW1iZXIsXG4gICAgbTMyOiBudW1iZXIsXG4gICAgbTMzOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdls0XSA9IG0wMTtcbiAgICB2WzhdID0gbTAyO1xuICAgIHZbMTJdID0gbTAzO1xuICAgIHZbMV0gPSBtMTA7XG4gICAgdls1XSA9IG0xMTtcbiAgICB2WzldID0gbTEyO1xuICAgIHZbMTNdID0gbTEzO1xuICAgIHZbMl0gPSBtMjA7XG4gICAgdls2XSA9IG0yMTtcbiAgICB2WzEwXSA9IG0yMjtcbiAgICB2WzE0XSA9IG0yMztcbiAgICB2WzNdID0gbTMwO1xuICAgIHZbN10gPSBtMzE7XG4gICAgdlsxMV0gPSBtMzI7XG4gICAgdlsxNV0gPSBtMzM7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4NDQodik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlcyBhcyBDb2x1bW4gTWFqb3JcbiAgICogTm90ZSB0aGF0IFdlYkdMIG1hdHJpeCBrZWVwcyB0aGUgdmFsdWVzIGluIGNvbHVtbiBtYWpvci5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tQ29weTE2Q29sdW1uTWFqb3IoXG4gICAgbTAwOiBudW1iZXIsXG4gICAgbTEwOiBudW1iZXIsXG4gICAgbTIwOiBudW1iZXIsXG4gICAgbTMwOiBudW1iZXIsXG4gICAgbTAxOiBudW1iZXIsXG4gICAgbTExOiBudW1iZXIsXG4gICAgbTIxOiBudW1iZXIsXG4gICAgbTMxOiBudW1iZXIsXG4gICAgbTAyOiBudW1iZXIsXG4gICAgbTEyOiBudW1iZXIsXG4gICAgbTIyOiBudW1iZXIsXG4gICAgbTMyOiBudW1iZXIsXG4gICAgbTAzOiBudW1iZXIsXG4gICAgbTEzOiBudW1iZXIsXG4gICAgbTIzOiBudW1iZXIsXG4gICAgbTMzOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIHZbMF0gPSBtMDA7XG4gICAgdls0XSA9IG0wMTtcbiAgICB2WzhdID0gbTAyO1xuICAgIHZbMTJdID0gbTAzO1xuICAgIHZbMV0gPSBtMTA7XG4gICAgdls1XSA9IG0xMTtcbiAgICB2WzldID0gbTEyO1xuICAgIHZbMTNdID0gbTEzO1xuICAgIHZbMl0gPSBtMjA7XG4gICAgdls2XSA9IG0yMTtcbiAgICB2WzEwXSA9IG0yMjtcbiAgICB2WzE0XSA9IG0yMztcbiAgICB2WzNdID0gbTMwO1xuICAgIHZbN10gPSBtMzE7XG4gICAgdlsxMV0gPSBtMzI7XG4gICAgdlsxNV0gPSBtMzM7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlNYXRyaXg0NChtYXQ6IElNYXRyaXg0NCkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2LnNldChtYXQuX3YpO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDQ0KHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21GbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihmbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSkge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDQ0KGZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlGbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihmbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2LnNldChmbG9hdDMyQXJyYXkpO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDQ0KHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5Um93TWFqb3IoYXJyYXk6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdls0XSA9IGFycmF5WzFdO1xuICAgIHZbOF0gPSBhcnJheVsyXTtcbiAgICB2WzEyXSA9IGFycmF5WzNdO1xuICAgIHZbMV0gPSBhcnJheVs0XTtcbiAgICB2WzVdID0gYXJyYXlbNV07XG4gICAgdls5XSA9IGFycmF5WzZdO1xuICAgIHZbMTNdID0gYXJyYXlbN107XG4gICAgdlsyXSA9IGFycmF5WzhdO1xuICAgIHZbNl0gPSBhcnJheVs5XTtcbiAgICB2WzEwXSA9IGFycmF5WzEwXTtcbiAgICB2WzE0XSA9IGFycmF5WzExXTtcbiAgICB2WzNdID0gYXJyYXlbMTJdO1xuICAgIHZbN10gPSBhcnJheVsxM107XG4gICAgdlsxMV0gPSBhcnJheVsxNF07XG4gICAgdlsxNV0gPSBhcnJheVsxNV07XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlNYXRyaXgzMyhtYXQ6IElNYXRyaXgzMykge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2WzBdID0gbWF0Ll92WzBdO1xuICAgIHZbNF0gPSBtYXQuX3ZbM107XG4gICAgdls4XSA9IG1hdC5fdls2XTtcbiAgICB2WzEyXSA9IDA7XG4gICAgdlsxXSA9IG1hdC5fdlsxXTtcbiAgICB2WzVdID0gbWF0Ll92WzRdO1xuICAgIHZbOV0gPSBtYXQuX3ZbN107XG4gICAgdlsxM10gPSAwO1xuICAgIHZbMl0gPSBtYXQuX3ZbMl07XG4gICAgdls2XSA9IG1hdC5fdls1XTtcbiAgICB2WzEwXSA9IG1hdC5fdls4XTtcbiAgICB2WzE0XSA9IDA7XG4gICAgdlszXSA9IDA7XG4gICAgdls3XSA9IDA7XG4gICAgdlsxMV0gPSAwO1xuICAgIHZbMTVdID0gMTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXg0NCh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5MTZDb2x1bW5NYWpvcihhcnJheTogQXJyYXkxNjxudW1iZXI+KSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIHYuc2V0KGFycmF5KTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXg0NCh2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5Q29sdW1uTWFqb3IoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdi5zZXQoYXJyYXkpO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDQ0KHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkxNlJvd01ham9yKGFycmF5OiBBcnJheTE2PG51bWJlcj4pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdlswXSA9IGFycmF5WzBdO1xuICAgIHZbNF0gPSBhcnJheVsxXTtcbiAgICB2WzhdID0gYXJyYXlbMl07XG4gICAgdlsxMl0gPSBhcnJheVszXTtcbiAgICB2WzFdID0gYXJyYXlbNF07XG4gICAgdls1XSA9IGFycmF5WzVdO1xuICAgIHZbOV0gPSBhcnJheVs2XTtcbiAgICB2WzEzXSA9IGFycmF5WzddO1xuICAgIHZbMl0gPSBhcnJheVs4XTtcbiAgICB2WzZdID0gYXJyYXlbOV07XG4gICAgdlsxMF0gPSBhcnJheVsxMF07XG4gICAgdlsxNF0gPSBhcnJheVsxMV07XG4gICAgdlszXSA9IGFycmF5WzEyXTtcbiAgICB2WzddID0gYXJyYXlbMTNdO1xuICAgIHZbMTFdID0gYXJyYXlbMTRdO1xuICAgIHZbMTVdID0gYXJyYXlbMTVdO1xuICAgIHJldHVybiBuZXcgTXV0YWJsZU1hdHJpeDQ0KHYpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXlSb3dNYWpvcihhcnJheTogQXJyYXk8bnVtYmVyPikge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICB2WzBdID0gYXJyYXlbMF07XG4gICAgdls0XSA9IGFycmF5WzFdO1xuICAgIHZbOF0gPSBhcnJheVsyXTtcbiAgICB2WzEyXSA9IGFycmF5WzNdO1xuICAgIHZbMV0gPSBhcnJheVs0XTtcbiAgICB2WzVdID0gYXJyYXlbNV07XG4gICAgdls5XSA9IGFycmF5WzZdO1xuICAgIHZbMTNdID0gYXJyYXlbN107XG4gICAgdlsyXSA9IGFycmF5WzhdO1xuICAgIHZbNl0gPSBhcnJheVs5XTtcbiAgICB2WzEwXSA9IGFycmF5WzEwXTtcbiAgICB2WzE0XSA9IGFycmF5WzExXTtcbiAgICB2WzNdID0gYXJyYXlbMTJdO1xuICAgIHZbN10gPSBhcnJheVsxM107XG4gICAgdlsxMV0gPSBhcnJheVsxNF07XG4gICAgdlsxNV0gPSBhcnJheVsxNV07XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlTWF0cml4NDQodik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlRdWF0ZXJuaW9uKHE6IFF1YXRlcm5pb24pIHtcbiAgICBjb25zdCBzeCA9IHEuX3ZbMF0gKiBxLl92WzBdO1xuICAgIGNvbnN0IHN5ID0gcS5fdlsxXSAqIHEuX3ZbMV07XG4gICAgY29uc3Qgc3ogPSBxLl92WzJdICogcS5fdlsyXTtcbiAgICBjb25zdCBjeCA9IHEuX3ZbMV0gKiBxLl92WzJdO1xuICAgIGNvbnN0IGN5ID0gcS5fdlswXSAqIHEuX3ZbMl07XG4gICAgY29uc3QgY3ogPSBxLl92WzBdICogcS5fdlsxXTtcbiAgICBjb25zdCB3eCA9IHEuX3ZbM10gKiBxLl92WzBdO1xuICAgIGNvbnN0IHd5ID0gcS5fdlszXSAqIHEuX3ZbMV07XG4gICAgY29uc3Qgd3ogPSBxLl92WzNdICogcS5fdlsyXTtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgdlswXSA9IDEuMCAtIDIuMCAqIChzeSArIHN6KTtcbiAgICB2WzRdID0gMi4wICogKGN6IC0gd3opO1xuICAgIHZbOF0gPSAyLjAgKiAoY3kgKyB3eSk7XG4gICAgdlsxMl0gPSAwO1xuICAgIHZbMV0gPSAyLjAgKiAoY3ogKyB3eik7XG4gICAgdls1XSA9IDEuMCAtIDIuMCAqIChzeCArIHN6KTtcbiAgICB2WzldID0gMi4wICogKGN4IC0gd3gpO1xuICAgIHZbMTNdID0gMDtcbiAgICB2WzJdID0gMi4wICogKGN5IC0gd3kpO1xuICAgIHZbNl0gPSAyLjAgKiAoY3ggKyB3eCk7XG4gICAgdlsxMF0gPSAxLjAgLSAyLjAgKiAoc3ggKyBzeSk7XG4gICAgdlsxNF0gPSAwO1xuICAgIHZbM10gPSAwO1xuICAgIHZbN10gPSAwO1xuICAgIHZbMTFdID0gMDtcbiAgICB2WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gbmV3IE11dGFibGVNYXRyaXg0NCh2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJVmVjdG9yMywgSVZlY3RvcjQgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgQXJyYXk0LCBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSU11dGFibGVRdWF0ZXJuaW9uLCBJTG9nUXVhdGVybmlvbiwgSVF1YXRlcm5pb24gfSBmcm9tICcuL0lRdWF0ZXJuaW9uJztcbmltcG9ydCB7IElNYXRyaXg0NCB9IGZyb20gJy4vSU1hdHJpeCc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlUXVhdGVybmlvbiBleHRlbmRzIFF1YXRlcm5pb24gaW1wbGVtZW50cyBJTXV0YWJsZVF1YXRlcm5pb24ge1xuICBjb25zdHJ1Y3Rvcih4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBzdXBlcih4KTtcbiAgfVxuXG4gIHNldCB4KHg6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gPSB4O1xuICB9XG5cbiAgZ2V0IHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHNldCB5KHk6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMV0gPSB5O1xuICB9XG5cbiAgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIHNldCB6KHo6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMl0gPSB6O1xuICB9XG5cbiAgZ2V0IHooKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIHNldCB3KHc6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbM10gPSB3O1xuICB9XG5cbiAgZ2V0IHcoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlszXTtcbiAgfVxuXG4gIGdldCBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdNdXRhYmxlUXVhdGVybmlvbic7XG4gIH1cblxuICBzdGF0aWMgaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIE11dGFibGVRdWF0ZXJuaW9uLmZyb21Db3B5NCgwLCAwLCAwLCAxKTtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IEZsb2F0MzJBcnJheSgwKSk7XG4gIH1cblxuICBzdGF0aWMgaW52ZXJ0KHF1YXQ6IElRdWF0ZXJuaW9uKSB7XG4gICAgcmV0dXJuIHN1cGVyLmludmVydChxdWF0KSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHN0YXRpYyBxbGVycChsX3F1YXQ6IElRdWF0ZXJuaW9uLCByX3F1YXQ6IElRdWF0ZXJuaW9uLCByYXRpbzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLnFsZXJwKGxfcXVhdCwgcl9xdWF0LCByYXRpbykgYXMgTXV0YWJsZVF1YXRlcm5pb247XG4gIH1cblxuICBzdGF0aWMgbGVycChsX3F1YXQ6IElRdWF0ZXJuaW9uLCByX3F1YXQ6IElRdWF0ZXJuaW9uLCByYXRpbzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLmxlcnAobF9xdWF0LCByX3F1YXQsIHJhdGlvKSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHN0YXRpYyBheGlzQW5nbGUodmVjOiBJVmVjdG9yMywgcmFkaWFuOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuYXhpc0FuZ2xlKHZlYywgcmFkaWFuKSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTWF0cml4KG1hdDogSU1hdHJpeDQ0KSB7XG4gICAgcmV0dXJuIHN1cGVyLmZyb21NYXRyaXgobWF0KSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUG9zaXRpb24odmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5mcm9tUG9zaXRpb24odmVjKSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF9xdWF0OiBJUXVhdGVybmlvbiwgcl9xdWF0OiBJUXVhdGVybmlvbikge1xuICAgIHJldHVybiBzdXBlci5hZGQobF9xdWF0LCByX3F1YXQpIGFzIE11dGFibGVRdWF0ZXJuaW9uO1xuICB9XG5cbiAgc3RhdGljIHN1YnRyYWN0KGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICByZXR1cm4gc3VwZXIuc3VidHJhY3QobF9xdWF0LCByX3F1YXQpIGFzIE11dGFibGVRdWF0ZXJuaW9uO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICByZXR1cm4gc3VwZXIubXVsdGlwbHkobF9xdWF0LCByX3F1YXQpIGFzIE11dGFibGVRdWF0ZXJuaW9uO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5TnVtYmVyKHF1YXQ6IElRdWF0ZXJuaW9uLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLm11bHRpcGx5TnVtYmVyKHF1YXQsIHZhbHVlKSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGVOdW1iZXIocXVhdDogSVF1YXRlcm5pb24sIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuZGl2aWRlTnVtYmVyKHF1YXQsIHZhbHVlKSBhcyBNdXRhYmxlUXVhdGVybmlvbjtcbiAgfVxuXG4gIHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy5fdjtcbiAgfVxuXG4gIHNldEF0KGk6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbaV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENvbXBvbmVudHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdzogbnVtYmVyKSB7XG4gICAgdGhpcy5fdlswXSA9IHg7XG4gICAgdGhpcy5fdlsxXSA9IHk7XG4gICAgdGhpcy5fdlsyXSA9IHo7XG4gICAgdGhpcy5fdlszXSA9IHc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb3B5Q29tcG9uZW50cyhxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMocXVhdC5fdlswXSwgcXVhdC5fdlsxXSwgcXVhdC5fdlsyXSwgcXVhdC5fdlszXSk7XG4gIH1cblxuICBpZGVudGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKDAsIDAsIDAsIDEpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIGNvbnN0IG5vcm0gPSB0aGlzLmxlbmd0aCgpO1xuICAgIHJldHVybiB0aGlzLmRpdmlkZU51bWJlcihub3JtKTtcbiAgfVxuXG4gIGludmVydCgpIHtcbiAgICBjb25zdCBub3JtID0gdGhpcy5sZW5ndGgoKTtcbiAgICBpZiAobm9ybSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gdGhpczsgLy8gWzAsIDAsIDAsIDBdXG4gICAgfVxuXG4gICAgdGhpcy5fdlswXSA9IC10aGlzLl92WzBdIC8gbm9ybTtcbiAgICB0aGlzLl92WzFdID0gLXRoaXMuX3ZbMV0gLyBub3JtO1xuICAgIHRoaXMuX3ZbMl0gPSAtdGhpcy5fdlsyXSAvIG5vcm07XG4gICAgdGhpcy5fdlszXSA9IHRoaXMuX3ZbM10gLyBub3JtO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcWxlcnAobF9xdWF0OiBJUXVhdGVybmlvbiwgcl9xdWF0OiBJUXVhdGVybmlvbiwgcmF0aW86IG51bWJlcikge1xuICAgIGxldCBxciA9XG4gICAgICBsX3F1YXQuX3ZbM10gKiByX3F1YXQuX3ZbM10gK1xuICAgICAgbF9xdWF0Ll92WzBdICogcl9xdWF0Ll92WzBdICtcbiAgICAgIGxfcXVhdC5fdlsxXSAqIHJfcXVhdC5fdlsxXSArXG4gICAgICBsX3F1YXQuX3ZbMl0gKiByX3F1YXQuX3ZbMl07XG4gICAgY29uc3Qgc3MgPSAxLjAgLSBxciAqIHFyO1xuXG4gICAgaWYgKHNzID09PSAwLjApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHlDb21wb25lbnRzKGxfcXVhdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChxciA+IDEpIHtcbiAgICAgICAgcXIgPSAwLjk5OTtcbiAgICAgIH0gZWxzZSBpZiAocXIgPCAtMSkge1xuICAgICAgICBxciA9IC0wLjk5OTtcbiAgICAgIH1cblxuICAgICAgbGV0IHBoID0gTWF0aC5hY29zKHFyKTtcbiAgICAgIGxldCBzMjtcbiAgICAgIGlmIChxciA8IDAuMCAmJiBwaCA+IE1hdGguUEkgLyAyLjApIHtcbiAgICAgICAgcXIgPVxuICAgICAgICAgIC1sX3F1YXQuX3ZbM10gKiByX3F1YXQuX3ZbM10gLVxuICAgICAgICAgIGxfcXVhdC5fdlswXSAqIHJfcXVhdC5fdlswXSAtXG4gICAgICAgICAgbF9xdWF0Ll92WzFdICogcl9xdWF0Ll92WzFdIC1cbiAgICAgICAgICBsX3F1YXQuX3ZbMl0gKiByX3F1YXQuX3ZbMl07XG4gICAgICAgIHBoID0gTWF0aC5hY29zKHFyKTtcbiAgICAgICAgczIgPSAoLTEgKiBNYXRoLnNpbihwaCAqIHJhdGlvKSkgLyBNYXRoLnNpbihwaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IE1hdGguc2luKHBoICogcmF0aW8pIC8gTWF0aC5zaW4ocGgpO1xuICAgICAgfVxuICAgICAgY29uc3QgczEgPSBNYXRoLnNpbihwaCAqICgxLjAgLSByYXRpbykpIC8gTWF0aC5zaW4ocGgpO1xuXG4gICAgICB0aGlzLl92WzBdID0gbF9xdWF0Ll92WzBdICogczEgKyByX3F1YXQuX3ZbMF0gKiBzMjtcbiAgICAgIHRoaXMuX3ZbMV0gPSBsX3F1YXQuX3ZbMV0gKiBzMSArIHJfcXVhdC5fdlsxXSAqIHMyO1xuICAgICAgdGhpcy5fdlsyXSA9IGxfcXVhdC5fdlsyXSAqIHMxICsgcl9xdWF0Ll92WzJdICogczI7XG4gICAgICB0aGlzLl92WzNdID0gbF9xdWF0Ll92WzNdICogczEgKyByX3F1YXQuX3ZbM10gKiBzMjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxlcnAobF9xdWF0OiBJUXVhdGVybmlvbiwgcl9xdWF0OiBJUXVhdGVybmlvbiwgcmF0aW86IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gPSBsX3F1YXQuX3ZbMF0gKiAoMSAtIHJhdGlvKSArIHJfcXVhdC5fdlswXSAqIHJhdGlvO1xuICAgIHRoaXMuX3ZbMV0gPSBsX3F1YXQuX3ZbMV0gKiAoMSAtIHJhdGlvKSArIHJfcXVhdC5fdlsxXSAqIHJhdGlvO1xuICAgIHRoaXMuX3ZbMl0gPSBsX3F1YXQuX3ZbMl0gKiAoMSAtIHJhdGlvKSArIHJfcXVhdC5fdlsyXSAqIHJhdGlvO1xuICAgIHRoaXMuX3ZbM10gPSBsX3F1YXQuX3ZbM10gKiAoMSAtIHJhdGlvKSArIHJfcXVhdC5fdlszXSAqIHJhdGlvO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBheGlzQW5nbGUodmVjOiBJVmVjdG9yMywgcmFkaWFuOiBudW1iZXIpIHtcbiAgICBjb25zdCBoYWxmQW5nbGUgPSAwLjUgKiByYWRpYW47XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oaGFsZkFuZ2xlKTtcblxuICAgIGNvbnN0IGxlbmd0aCA9IHZlYy5sZW5ndGgoKTtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdlszXSA9IE1hdGguY29zKGhhbGZBbmdsZSk7XG4gICAgdGhpcy5fdlswXSA9IChzaW4gKiB2ZWMuX3ZbMF0pIC8gbGVuZ3RoO1xuICAgIHRoaXMuX3ZbMV0gPSAoc2luICogdmVjLl92WzFdKSAvIGxlbmd0aDtcbiAgICB0aGlzLl92WzJdID0gKHNpbiAqIHZlYy5fdlsyXSkgLyBsZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZyb21NYXRyaXgobWF0OiBJTWF0cml4NDQpIHtcbiAgICBsZXQgc3ggPSBNYXRoLmh5cG90KG1hdC5tMDAsIG1hdC5tMTAsIG1hdC5tMjApO1xuICAgIGNvbnN0IHN5ID0gTWF0aC5oeXBvdChtYXQubTAxLCBtYXQubTExLCBtYXQubTIxKTtcbiAgICBjb25zdCBzeiA9IE1hdGguaHlwb3QobWF0Lm0wMiwgbWF0Lm0xMiwgbWF0Lm0yMik7XG5cbiAgICBjb25zdCBkZXQgPSBtYXQuZGV0ZXJtaW5hbnQoKTtcbiAgICBpZiAoZGV0IDwgMCkge1xuICAgICAgc3ggPSAtc3g7XG4gICAgfVxuXG4gICAgY29uc3QgbSA9IE11dGFibGVNYXRyaXg0NC5mcm9tQ29weU1hdHJpeDQ0KG1hdCk7XG5cbiAgICBjb25zdCBpbnZTeCA9IDEgLyBzeDtcbiAgICBjb25zdCBpbnZTeSA9IDEgLyBzeTtcbiAgICBjb25zdCBpbnZTeiA9IDEgLyBzejtcblxuICAgIG0ubTAwICo9IGludlN4O1xuICAgIG0ubTEwICo9IGludlN4O1xuICAgIG0ubTIwICo9IGludlN4O1xuXG4gICAgbS5tMDEgKj0gaW52U3k7XG4gICAgbS5tMTEgKj0gaW52U3k7XG4gICAgbS5tMjEgKj0gaW52U3k7XG5cbiAgICBtLm0wMiAqPSBpbnZTejtcbiAgICBtLm0xMiAqPSBpbnZTejtcbiAgICBtLm0yMiAqPSBpbnZTejtcblxuICAgIGNvbnN0IHRyYWNlID0gbS5tMDAgKyBtLm0xMSArIG0ubTIyO1xuXG4gICAgaWYgKHRyYWNlID4gMCkge1xuICAgICAgY29uc3QgUyA9IDAuNSAvIE1hdGguc3FydCh0cmFjZSArIDEuMCk7XG4gICAgICB0aGlzLl92WzBdID0gKG0ubTIxIC0gbS5tMTIpICogUztcbiAgICAgIHRoaXMuX3ZbMV0gPSAobS5tMDIgLSBtLm0yMCkgKiBTO1xuICAgICAgdGhpcy5fdlsyXSA9IChtLm0xMCAtIG0ubTAxKSAqIFM7XG4gICAgICB0aGlzLl92WzNdID0gMC4yNSAvIFM7XG4gICAgfSBlbHNlIGlmIChtLm0wMCA+IG0ubTExICYmIG0ubTAwID4gbS5tMjIpIHtcbiAgICAgIGNvbnN0IFMgPSBNYXRoLnNxcnQoMS4wICsgbS5tMDAgLSBtLm0xMSAtIG0ubTIyKSAqIDI7XG4gICAgICB0aGlzLl92WzBdID0gMC4yNSAqIFM7XG4gICAgICB0aGlzLl92WzFdID0gKG0ubTAxICsgbS5tMTApIC8gUztcbiAgICAgIHRoaXMuX3ZbMl0gPSAobS5tMDIgKyBtLm0yMCkgLyBTO1xuICAgICAgdGhpcy5fdlszXSA9IChtLm0yMSAtIG0ubTEyKSAvIFM7XG4gICAgfSBlbHNlIGlmIChtLm0xMSA+IG0ubTIyKSB7XG4gICAgICBjb25zdCBTID0gTWF0aC5zcXJ0KDEuMCArIG0ubTExIC0gbS5tMDAgLSBtLm0yMikgKiAyO1xuICAgICAgdGhpcy5fdlswXSA9IChtLm0wMSArIG0ubTEwKSAvIFM7XG4gICAgICB0aGlzLl92WzFdID0gMC4yNSAqIFM7XG4gICAgICB0aGlzLl92WzJdID0gKG0ubTEyICsgbS5tMjEpIC8gUztcbiAgICAgIHRoaXMuX3ZbM10gPSAobS5tMDIgLSBtLm0yMCkgLyBTO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBTID0gTWF0aC5zcXJ0KDEuMCArIG0ubTIyIC0gbS5tMDAgLSBtLm0xMSkgKiAyO1xuICAgICAgdGhpcy5fdlswXSA9IChtLm0wMiArIG0ubTIwKSAvIFM7XG4gICAgICB0aGlzLl92WzFdID0gKG0ubTEyICsgbS5tMjEpIC8gUztcbiAgICAgIHRoaXMuX3ZbMl0gPSAwLjI1ICogUztcbiAgICAgIHRoaXMuX3ZbM10gPSAobS5tMTAgLSBtLm0wMSkgLyBTO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZyb21Qb3NpdGlvbih2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyh2ZWMuX3ZbMF0sIHZlYy5fdlsxXSwgdmVjLl92WzJdLCAwKTtcbiAgfVxuXG4gIGFkZChxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIHRoaXMuX3ZbMF0gKz0gcXVhdC5fdlswXTtcbiAgICB0aGlzLl92WzFdICs9IHF1YXQuX3ZbMV07XG4gICAgdGhpcy5fdlsyXSArPSBxdWF0Ll92WzJdO1xuICAgIHRoaXMuX3ZbM10gKz0gcXVhdC5fdlszXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN1YnRyYWN0KHF1YXQ6IElRdWF0ZXJuaW9uKSB7XG4gICAgdGhpcy5fdlswXSAtPSBxdWF0Ll92WzBdO1xuICAgIHRoaXMuX3ZbMV0gLT0gcXVhdC5fdlsxXTtcbiAgICB0aGlzLl92WzJdIC09IHF1YXQuX3ZbMl07XG4gICAgdGhpcy5fdlszXSAtPSBxdWF0Ll92WzNdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbXVsdGlwbHkocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICBjb25zdCB4ID1cbiAgICAgIHF1YXQuX3ZbM10gKiB0aGlzLl92WzBdICtcbiAgICAgIHF1YXQuX3ZbMl0gKiB0aGlzLl92WzFdICtcbiAgICAgIHF1YXQuX3ZbMV0gKiB0aGlzLl92WzJdIC1cbiAgICAgIHF1YXQuX3ZbMF0gKiB0aGlzLl92WzNdO1xuICAgIGNvbnN0IHkgPVxuICAgICAgLXF1YXQuX3ZbMl0gKiB0aGlzLl92WzBdICtcbiAgICAgIHF1YXQuX3ZbM10gKiB0aGlzLl92WzFdICtcbiAgICAgIHF1YXQuX3ZbMF0gKiB0aGlzLl92WzJdIC1cbiAgICAgIHF1YXQuX3ZbMV0gKiB0aGlzLl92WzNdO1xuICAgIGNvbnN0IHogPVxuICAgICAgcXVhdC5fdlsxXSAqIHRoaXMuX3ZbMF0gK1xuICAgICAgcXVhdC5fdlswXSAqIHRoaXMuX3ZbMV0gK1xuICAgICAgcXVhdC5fdlszXSAqIHRoaXMuX3ZbMl0gLVxuICAgICAgcXVhdC5fdlsyXSAqIHRoaXMuX3ZbM107XG4gICAgY29uc3QgdyA9XG4gICAgICAtcXVhdC5fdlswXSAqIHRoaXMuX3ZbMF0gLVxuICAgICAgcXVhdC5fdlsxXSAqIHRoaXMuX3ZbMV0gLVxuICAgICAgcXVhdC5fdlsyXSAqIHRoaXMuX3ZbMl0gLVxuICAgICAgcXVhdC5fdlszXSAqIHRoaXMuX3ZbM107XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyh4LCB5LCB6LCB3KTtcbiAgfVxuXG4gIG11bHRpcGx5TnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzBdICo9IHZhbHVlO1xuICAgIHRoaXMuX3ZbMV0gKj0gdmFsdWU7XG4gICAgdGhpcy5fdlsyXSAqPSB2YWx1ZTtcbiAgICB0aGlzLl92WzNdICo9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGl2aWRlTnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgIHRoaXMuX3ZbMF0gLz0gdmFsdWU7XG4gICAgICB0aGlzLl92WzFdIC89IHZhbHVlO1xuICAgICAgdGhpcy5fdlsyXSAvPSB2YWx1ZTtcbiAgICAgIHRoaXMuX3ZbM10gLz0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHRoaXMuX3ZbMF0gPSBJbmZpbml0eTtcbiAgICAgIHRoaXMuX3ZbMV0gPSBJbmZpbml0eTtcbiAgICAgIHRoaXMuX3ZbMl0gPSBJbmZpbml0eTtcbiAgICAgIHRoaXMuX3ZbM10gPSBJbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpOiBJTXV0YWJsZVF1YXRlcm5pb24ge1xuICAgIHJldHVybiBNdXRhYmxlUXVhdGVybmlvbi5mcm9tQ29weTQoXG4gICAgICB0aGlzLl92WzBdLFxuICAgICAgdGhpcy5fdlsxXSxcbiAgICAgIHRoaXMuX3ZbMl0sXG4gICAgICB0aGlzLl92WzNdXG4gICAgKSBhcyBJTXV0YWJsZVF1YXRlcm5pb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUZsb2F0MzJBcnJheShhcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlUXVhdGVybmlvbihhcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTQoYXJyYXk6IEFycmF5NDxudW1iZXI+KSB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlUXVhdGVybmlvbihuZXcgRmxvYXQzMkFycmF5KGFycmF5KSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXk8bnVtYmVyPikge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVF1YXRlcm5pb24obmV3IEZsb2F0MzJBcnJheShhcnJheS5zbGljZSgwLCA0KSkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5NCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVRdWF0ZXJuaW9uKG5ldyBGbG9hdDMyQXJyYXkoW3gsIHksIHosIHddKSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlRdWF0ZXJuaW9uKHF1YXQ6IElRdWF0ZXJuaW9uKSB7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IHF1YXQuX3ZbMF07XG4gICAgdlsxXSA9IHF1YXQuX3ZbMV07XG4gICAgdlsyXSA9IHF1YXQuX3ZbMl07XG4gICAgdlszXSA9IHF1YXQuX3ZbM107XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlUXVhdGVybmlvbih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVZlY3RvcjQodmVjOiBJVmVjdG9yNCkge1xuICAgIGNvbnN0IHYgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuICAgIHZbMF0gPSB2ZWMuX3ZbMF07XG4gICAgdlsxXSA9IHZlYy5fdlsxXTtcbiAgICB2WzJdID0gdmVjLl92WzJdO1xuICAgIHZbM10gPSB2ZWMuX3ZbM107XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlUXVhdGVybmlvbih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUxvZ1F1YXRlcm5pb24oeDogSUxvZ1F1YXRlcm5pb24pIHtcbiAgICBjb25zdCB0aGV0YSA9IHguX3ZbMF0gKiB4Ll92WzBdICsgeC5fdlsxXSAqIHguX3ZbMV0gKyB4Ll92WzJdICogeC5fdlsyXTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IHguX3ZbMF0gKiAoc2luIC8gdGhldGEpO1xuICAgIHZbMV0gPSB4Ll92WzFdICogKHNpbiAvIHRoZXRhKTtcbiAgICB2WzJdID0geC5fdlsyXSAqIChzaW4gLyB0aGV0YSk7XG4gICAgdlszXSA9IE1hdGguY29zKHRoZXRhKTtcbiAgICByZXR1cm4gbmV3IE11dGFibGVRdWF0ZXJuaW9uKHYpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTY2FsYXJfIH0gZnJvbSAnLi9TY2FsYXInO1xuaW1wb3J0IHsgVHlwZWRBcnJheSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE11dGFibGVTY2FsYXJfPFQgZXh0ZW5kcyBUeXBlZEFycmF5Q29uc3RydWN0b3I+IGV4dGVuZHMgU2NhbGFyXzxUPiB7XG4gIGNvbnN0cnVjdG9yKHg6IFR5cGVkQXJyYXksIHsgdHlwZSB9OiB7IHR5cGU6IFQgfSkge1xuICAgIHN1cGVyKHgsIHsgdHlwZSB9KTtcbiAgfVxuXG4gIGNvcHlDb21wb25lbnRzKHZlYzogU2NhbGFyXzxUPikge1xuICAgIHRoaXMuX3ZbMF0gPSB2ZWMuX3ZbMF07XG4gIH1cblxuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHNldCB4KHg6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gPSB4O1xuICB9XG5cbiAgZ2V0IHkoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZ2V0IHooKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZ2V0IHcoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKipcbiAgICogY2hhbmdlIHRvIHN0cmluZ1xuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICcoJyArIHRoaXMuX3ZbMF0gKyAnKSc7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy54ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvc2l0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLlNjYWxhcjtcbiAgfVxuXG4gIGdldCBieXRlc1BlckNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdi5CWVRFU19QRVJfRUxFTUVOVDtcbiAgfVxufVxuXG4vKipcbiAqIE11dGFibGUgU2NhbGFyIGNsYXNzIHdpdGggMzJiaXQgZmxvYXQgY29tcG9uZW50c1xuICovXG5leHBvcnQgY2xhc3MgTXV0YWJsZVNjYWxhciBleHRlbmRzIE11dGFibGVTY2FsYXJfPEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHg6IFR5cGVkQXJyYXkpIHtcbiAgICBzdXBlcih4LCB7IHR5cGU6IEZsb2F0MzJBcnJheSB9KTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFt0aGlzLnhdKSk7XG4gIH1cblxuICBzdGF0aWMgb25lKCkge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFsxXSkpO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVNjYWxhcihuZXcgRmxvYXQzMkFycmF5KFtdKSk7XG4gIH1cblxuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVTY2FsYXIobmV3IEZsb2F0MzJBcnJheShbMF0pKTtcbiAgfVxuXG4gIGdldCBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdNdXRhYmxlU2NhbGFyJztcbiAgfVxufVxuXG4vKipcbiAqIE11dGFibGUgU2NhbGFyIGNsYXNzIHdpdGggNjRiaXQgZmxvYXQgY29tcG9uZW50c1xuICovXG5leHBvcnQgY2xhc3MgTXV0YWJsZVNjYWxhcmQgZXh0ZW5kcyBNdXRhYmxlU2NhbGFyXzxGbG9hdDY0QXJyYXlDb25zdHJ1Y3Rvcj4ge1xuICBjb25zdHJ1Y3Rvcih4OiBUeXBlZEFycmF5KSB7XG4gICAgc3VwZXIoeCwgeyB0eXBlOiBGbG9hdDY0QXJyYXkgfSk7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVTY2FsYXJkKG5ldyBGbG9hdDY0QXJyYXkoW3RoaXMueF0pKTtcbiAgfVxuXG4gIHN0YXRpYyBvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlU2NhbGFyZChuZXcgRmxvYXQ2NEFycmF5KFsxXSkpO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVNjYWxhcmQobmV3IEZsb2F0NjRBcnJheShbXSkpO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlU2NhbGFyZChuZXcgRmxvYXQ2NEFycmF5KFswXSkpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE11dGFibGVTY2FsYXJmID0gTXV0YWJsZVNjYWxhcjtcbiIsImltcG9ydCB7IFZlY3RvcjJfIH0gZnJvbSAnLi9WZWN0b3IyJztcbmltcG9ydCB7IElWZWN0b3IyLCBJTXV0YWJsZVZlY3RvciwgSU11dGFibGVWZWN0b3IyIH0gZnJvbSAnLi9JVmVjdG9yJztcbmltcG9ydCB7IFR5cGVkQXJyYXksIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yLCBBcnJheTIgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXRhYmxlVmVjdG9yMl88VCBleHRlbmRzIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yPiBleHRlbmRzIFZlY3RvcjJfPFQ+IHtcbiAgY29uc3RydWN0b3IoeDogVHlwZWRBcnJheSwgeyB0eXBlIH06IHsgdHlwZTogVCB9KSB7XG4gICAgc3VwZXIoeCwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc2V0IHgoeDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdlswXSA9IHg7XG4gIH1cblxuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXTtcbiAgfVxuXG4gIHNldCB5KHk6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMV0gPSB5O1xuICB9XG5cbiAgZ2V0IHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBnZXQgeigpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGdldCB3KCkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmF3KCkge1xuICAgIHJldHVybiB0aGlzLl92O1xuICB9XG5cbiAgc2V0QXQoaTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdltpXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29tcG9uZW50cyh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gPSB4O1xuICAgIHRoaXMuX3ZbMV0gPSB5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29weUNvbXBvbmVudHModmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHModmVjLl92WzBdLCB2ZWMuX3ZbMV0pO1xuICB9XG5cbiAgemVybygpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKDAsIDApO1xuICB9XG5cbiAgb25lKCkge1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoMSwgMSk7XG4gIH1cblxuICBub3JtYWxpemUoKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcbiAgICB0aGlzLmRpdmlkZShsZW5ndGgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB2YWx1ZVxuICAgKi9cbiAgYWRkKHZlYzogSVZlY3RvcjIpIHtcbiAgICB0aGlzLl92WzBdICs9IHZlYy5fdlswXTtcbiAgICB0aGlzLl92WzFdICs9IHZlYy5fdlsxXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBzdWJ0cmFjdFxuICAgKi9cbiAgc3VidHJhY3QodmVjOiBJVmVjdG9yMikge1xuICAgIHRoaXMuX3ZbMF0gLT0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMV0gLT0gdmVjLl92WzFdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5XG4gICAqL1xuICBtdWx0aXBseSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdlswXSAqPSB2YWx1ZTtcbiAgICB0aGlzLl92WzFdICo9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5IHZlY3RvclxuICAgKi9cbiAgbXVsdGlwbHlWZWN0b3IodmVjOiBJVmVjdG9yMikge1xuICAgIHRoaXMuX3ZbMF0gKj0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMV0gKj0gdmVjLl92WzFdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZVxuICAgKi9cbiAgZGl2aWRlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgIHRoaXMuX3ZbMF0gLz0gdmFsdWU7XG4gICAgICB0aGlzLl92WzFdIC89IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICB0aGlzLl92WzBdID0gSW5maW5pdHk7XG4gICAgICB0aGlzLl92WzFdID0gSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSB2ZWN0b3JcbiAgICovXG4gIGRpdmlkZVZlY3Rvcih2ZWM6IElWZWN0b3IyKSB7XG4gICAgaWYgKHZlYy5fdlswXSAhPT0gMCAmJiB2ZWMuX3ZbMV0gIT09IDApIHtcbiAgICAgIHRoaXMuX3ZbMF0gLz0gdmVjLl92WzBdO1xuICAgICAgdGhpcy5fdlsxXSAvPSB2ZWMuX3ZbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHRoaXMuX3ZbMF0gPSB2ZWMuX3ZbMF0gPT09IDAgPyBJbmZpbml0eSA6IHRoaXMuX3ZbMF0gLyB2ZWMuX3ZbMF07XG4gICAgICB0aGlzLl92WzFdID0gdmVjLl92WzFdID09PSAwID8gSW5maW5pdHkgOiB0aGlzLl92WzFdIC8gdmVjLl92WzFdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldCBieXRlc1BlckNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdi5CWVRFU19QRVJfRUxFTUVOVDtcbiAgfVxufVxuXG4vKipcbiAqIE11dGFibGUgMkQoeCx5KSBWZWN0b3IgY2xhc3Mgd2l0aCAzMmJpdCBmbG9hdCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXRhYmxlVmVjdG9yMlxuICBleHRlbmRzIE11dGFibGVWZWN0b3IyXzxGbG9hdDMyQXJyYXlDb25zdHJ1Y3Rvcj5cbiAgaW1wbGVtZW50cyBJTXV0YWJsZVZlY3RvciwgSU11dGFibGVWZWN0b3IyXG57XG4gIGNvbnN0cnVjdG9yKHg6IFR5cGVkQXJyYXkpIHtcbiAgICBzdXBlcih4LCB7IHR5cGU6IEZsb2F0MzJBcnJheSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5MihhcnJheTogQXJyYXkyPG51bWJlcj4pOiBNdXRhYmxlVmVjdG9yMiB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlVmVjdG9yMihuZXcgRmxvYXQzMkFycmF5KGFycmF5KSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXk8bnVtYmVyPik6IE11dGFibGVWZWN0b3IyIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3IyKG5ldyBGbG9hdDMyQXJyYXkoYXJyYXkuc2xpY2UoMCwgMikpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KTogTXV0YWJsZVZlY3RvcjIge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVZlY3RvcjIoZmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUZsb2F0MzJBcnJheShmbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSk6IE11dGFibGVWZWN0b3IyIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3IyKG5ldyBGbG9hdDMyQXJyYXkoZmxvYXQzMkFycmF5LmJ1ZmZlci5zbGljZSgwKSkpO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIHN1cGVyLl96ZXJvKEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgb25lKCkge1xuICAgIHJldHVybiBzdXBlci5fb25lKEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IyO1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZSh2ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9ub3JtYWxpemUodmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IyO1xuICB9XG5cbiAgc3RhdGljIGFkZChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fYWRkKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMjtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IyO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KHZlYzogSVZlY3RvcjIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5KHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlWZWN0b3IobF92ZWM6IElWZWN0b3IyLCByX3ZlYzogSVZlY3RvcjIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5VmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMjtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMiwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlVmVjdG9yKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGVWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IyO1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ011dGFibGVWZWN0b3IyJztcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE11dGFibGVWZWN0b3IyO1xuICB9XG59XG5cbi8qKlxuICogTXV0YWJsZSAyRCh4LHkpIFZlY3RvciBjbGFzcyB3aXRoIDY0Yml0IGZsb2F0IGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIE11dGFibGVWZWN0b3IyZCBleHRlbmRzIE11dGFibGVWZWN0b3IyXzxGbG9hdDY0QXJyYXlDb25zdHJ1Y3Rvcj4ge1xuICBjb25zdHJ1Y3Rvcih4OiBUeXBlZEFycmF5KSB7XG4gICAgc3VwZXIoeCwgeyB0eXBlOiBGbG9hdDY0QXJyYXkgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXkyPG51bWJlcj4pOiBNdXRhYmxlVmVjdG9yMmQge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVZlY3RvcjJkKG5ldyBGbG9hdDY0QXJyYXkoYXJyYXkpKTtcbiAgfVxuXG4gIHN0YXRpYyB6ZXJvKCkge1xuICAgIHJldHVybiBzdXBlci5femVybyhGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBvbmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9vbmUoRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMmQ7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fbm9ybWFsaXplKHZlYywgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMmQ7XG4gIH1cblxuICBzdGF0aWMgYWRkKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9hZGQobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseSh2ZWM6IElWZWN0b3IyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseSh2ZWMsIHZhbHVlLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseVZlY3RvcihsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHlWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMiwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjJkO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlVmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMmQ7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyBNdXRhYmxlVmVjdG9yMmQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTXV0YWJsZVZlY3RvcjJmID0gTXV0YWJsZVZlY3RvcjI7XG4iLCJpbXBvcnQgeyBJVmVjdG9yMiwgSVZlY3RvcjMsIElWZWN0b3I0LCBJTXV0YWJsZVZlY3RvciwgSU11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi9JVmVjdG9yJztcbmltcG9ydCB7IFR5cGVkQXJyYXksIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yLCBBcnJheTMgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBWZWN0b3IzZCwgVmVjdG9yM18gfSBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSVF1YXRlcm5pb24gfSBmcm9tICcuL0lRdWF0ZXJuaW9uJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE11dGFibGVWZWN0b3IzXzxUIGV4dGVuZHMgRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3I+XG4gIGV4dGVuZHMgVmVjdG9yM188VD5cbiAgaW1wbGVtZW50cyBJTXV0YWJsZVZlY3RvciwgSU11dGFibGVWZWN0b3IzXG57XG4gIGNvbnN0cnVjdG9yKHY6IFR5cGVkQXJyYXksIHsgdHlwZSB9OiB7IHR5cGU6IFQgfSkge1xuICAgIHN1cGVyKHYsIHsgdHlwZSB9KTtcbiAgfVxuXG4gIHNldCB4KHg6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gPSB4O1xuICB9XG5cbiAgZ2V0IHgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBzZXQgeSh5OiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzFdID0geTtcbiAgfVxuXG4gIGdldCB5KCkge1xuICAgIHJldHVybiB0aGlzLl92WzFdO1xuICB9XG5cbiAgc2V0IHooejogbnVtYmVyKSB7XG4gICAgdGhpcy5fdlsyXSA9IHo7XG4gIH1cblxuICBnZXQgeigpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsyXTtcbiAgfVxuXG4gIGdldCB3KCkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmF3KCkge1xuICAgIHJldHVybiB0aGlzLl92O1xuICB9XG5cbiAgc2V0QXQoaTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdltpXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29tcG9uZW50cyh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgdGhpcy5fdlswXSA9IHg7XG4gICAgdGhpcy5fdlsxXSA9IHk7XG4gICAgdGhpcy5fdlsyXSA9IHo7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb3B5Q29tcG9uZW50cyh2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cyh2ZWMuX3ZbMF0sIHZlYy5fdlsxXSwgdmVjLl92WzJdKTtcbiAgfVxuXG4gIHplcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cygwLCAwLCAwKTtcbiAgfVxuXG4gIG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKDEsIDEsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5vcm1hbGl6ZVxuICAgKi9cbiAgbm9ybWFsaXplKCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG4gICAgdGhpcy5kaXZpZGUobGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdmFsdWVcbiAgICovXG4gIGFkZCh2ZWM6IElWZWN0b3IzKSB7XG4gICAgdGhpcy5fdlswXSArPSB2ZWMuX3ZbMF07XG4gICAgdGhpcy5fdlsxXSArPSB2ZWMuX3ZbMV07XG4gICAgdGhpcy5fdlsyXSArPSB2ZWMuX3ZbMl07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogc3VidHJhY3RcbiAgICovXG4gIHN1YnRyYWN0KHZlYzogSVZlY3RvcjMpIHtcbiAgICB0aGlzLl92WzBdIC09IHZlYy5fdlswXTtcbiAgICB0aGlzLl92WzFdIC09IHZlYy5fdlsxXTtcbiAgICB0aGlzLl92WzJdIC09IHZlYy5fdlsyXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseVxuICAgKi9cbiAgbXVsdGlwbHkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gKj0gdmFsdWU7XG4gICAgdGhpcy5fdlsxXSAqPSB2YWx1ZTtcbiAgICB0aGlzLl92WzJdICo9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5IHZlY3RvclxuICAgKi9cbiAgbXVsdGlwbHlWZWN0b3IodmVjOiBJVmVjdG9yMykge1xuICAgIHRoaXMuX3ZbMF0gKj0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMV0gKj0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbMl0gKj0gdmVjLl92WzJdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZVxuICAgKi9cbiAgZGl2aWRlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgIHRoaXMuX3ZbMF0gLz0gdmFsdWU7XG4gICAgICB0aGlzLl92WzFdIC89IHZhbHVlO1xuICAgICAgdGhpcy5fdlsyXSAvPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCcwIGRpdmlzaW9uIG9jY3VycmVkIScpO1xuICAgICAgdGhpcy5fdlswXSA9IEluZmluaXR5O1xuICAgICAgdGhpcy5fdlsxXSA9IEluZmluaXR5O1xuICAgICAgdGhpcy5fdlsyXSA9IEluZmluaXR5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSB2ZWN0b3JcbiAgICovXG4gIGRpdmlkZVZlY3Rvcih2ZWM6IElWZWN0b3IzKSB7XG4gICAgaWYgKHZlYy5fdlswXSAhPT0gMCAmJiB2ZWMuX3ZbMV0gIT09IDAgJiYgdmVjLl92WzJdICE9PSAwKSB7XG4gICAgICB0aGlzLl92WzBdIC89IHZlYy5fdlswXTtcbiAgICAgIHRoaXMuX3ZbMV0gLz0gdmVjLl92WzFdO1xuICAgICAgdGhpcy5fdlsyXSAvPSB2ZWMuX3ZbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHRoaXMuX3ZbMF0gPSB2ZWMuX3ZbMF0gPT09IDAgPyBJbmZpbml0eSA6IHRoaXMuX3ZbMF0gLyB2ZWMuX3ZbMF07XG4gICAgICB0aGlzLl92WzFdID0gdmVjLl92WzFdID09PSAwID8gSW5maW5pdHkgOiB0aGlzLl92WzFdIC8gdmVjLl92WzFdO1xuICAgICAgdGhpcy5fdlsyXSA9IHZlYy5fdlsyXSA9PT0gMCA/IEluZmluaXR5IDogdGhpcy5fdlsyXSAvIHZlYy5fdlsyXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIGNyb3NzIHByb2R1Y3RcbiAgICovXG4gIGNyb3NzKHZlYzogSVZlY3RvcjMpIHtcbiAgICBjb25zdCB4ID0gdGhpcy5fdlsxXSAqIHZlYy5fdlsyXSAtIHRoaXMuX3ZbMl0gKiB2ZWMuX3ZbMV07XG4gICAgY29uc3QgeSA9IHRoaXMuX3ZbMl0gKiB2ZWMuX3ZbMF0gLSB0aGlzLl92WzBdICogdmVjLl92WzJdO1xuICAgIGNvbnN0IHogPSB0aGlzLl92WzBdICogdmVjLl92WzFdIC0gdGhpcy5fdlsxXSAqIHZlYy5fdlswXTtcblxuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHMoeCwgeSwgeik7XG4gIH1cblxuICAvKipcbiAgICogcXVhdGVybmlvbiAqIHZlY3RvcjNcbiAgICovXG4gIG11bHRpcGx5UXVhdGVybmlvbihxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIGNvbnN0IG51bSA9IHF1YXQuX3ZbMF0gKiAyO1xuICAgIGNvbnN0IG51bTIgPSBxdWF0Ll92WzFdICogMjtcbiAgICBjb25zdCBudW0zID0gcXVhdC5fdlsyXSAqIDI7XG4gICAgY29uc3QgbnVtNCA9IHF1YXQuX3ZbMF0gKiBudW07XG4gICAgY29uc3QgbnVtNSA9IHF1YXQuX3ZbMV0gKiBudW0yO1xuICAgIGNvbnN0IG51bTYgPSBxdWF0Ll92WzJdICogbnVtMztcbiAgICBjb25zdCBudW03ID0gcXVhdC5fdlswXSAqIG51bTI7XG4gICAgY29uc3QgbnVtOCA9IHF1YXQuX3ZbMF0gKiBudW0zO1xuICAgIGNvbnN0IG51bTkgPSBxdWF0Ll92WzFdICogbnVtMztcbiAgICBjb25zdCBudW0xMCA9IHF1YXQuX3ZbM10gKiBudW07XG4gICAgY29uc3QgbnVtMTEgPSBxdWF0Ll92WzNdICogbnVtMjtcbiAgICBjb25zdCBudW0xMiA9IHF1YXQuX3ZbM10gKiBudW0zO1xuXG4gICAgY29uc3QgeCA9XG4gICAgICAoMSAtIChudW01ICsgbnVtNikpICogdGhpcy5fdlswXSArIChudW03IC0gbnVtMTIpICogdGhpcy5fdlsxXSArIChudW04ICsgbnVtMTEpICogdGhpcy5fdlsyXTtcbiAgICBjb25zdCB5ID1cbiAgICAgIChudW03ICsgbnVtMTIpICogdGhpcy5fdlswXSArICgxIC0gKG51bTQgKyBudW02KSkgKiB0aGlzLl92WzFdICsgKG51bTkgLSBudW0xMCkgKiB0aGlzLl92WzJdO1xuICAgIGNvbnN0IHogPVxuICAgICAgKG51bTggLSBudW0xMSkgKiB0aGlzLl92WzBdICsgKG51bTkgKyBudW0xMCkgKiB0aGlzLl92WzFdICsgKDEgLSAobnVtNCArIG51bTUpKSAqIHRoaXMuX3ZbMl07XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKHgsIHksIHopO1xuICB9XG5cbiAgZ2V0IGJ5dGVzUGVyQ29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLl92LkJZVEVTX1BFUl9FTEVNRU5UO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weTMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoW3gsIHksIHpdKSwgeyB0eXBlIH0pO1xuICB9XG59XG5cbi8qKlxuICogTXV0YWJsZSAzRCh4LHkseikgVmVjdG9yIGNsYXNzIHdpdGggMzJiaXQgZmxvYXQgY29tcG9uZW50c1xuICovXG5leHBvcnQgY2xhc3MgTXV0YWJsZVZlY3RvcjMgZXh0ZW5kcyBNdXRhYmxlVmVjdG9yM188RmxvYXQzMkFycmF5Q29uc3RydWN0b3I+IHtcbiAgY29uc3RydWN0b3IodjogVHlwZWRBcnJheSkge1xuICAgIHN1cGVyKHYsIHsgdHlwZTogRmxvYXQzMkFycmF5IH0pO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIHN1cGVyLl96ZXJvKEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gIH1cblxuICBzdGF0aWMgb25lKCkge1xuICAgIHJldHVybiBzdXBlci5fb25lKEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IzO1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZSh2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9ub3JtYWxpemUodmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IzO1xuICB9XG5cbiAgc3RhdGljIGFkZChsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fYWRkKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMztcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IzO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KHZlYzogSVZlY3RvcjMsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5KHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlWZWN0b3IobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5VmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMztcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMywgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlVmVjdG9yKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGVWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IzO1xuICB9XG5cbiAgc3RhdGljIGNyb3NzKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9jcm9zcyhsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uKHF1YXQ6IElRdWF0ZXJuaW9uLCB2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVF1YXRlcm5pb24ocXVhdCwgdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3IzO1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ011dGFibGVWZWN0b3IzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weTMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IE11dGFibGVWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5Myh4LCB5LCB6LCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5MSh2YWw6IG51bWJlcik6IE11dGFibGVWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5Myh2YWwsIHZhbCwgdmFsLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkzKGFycmF5OiBBcnJheTM8bnVtYmVyPik6IE11dGFibGVWZWN0b3IzIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3IzKG5ldyBGbG9hdDMyQXJyYXkoYXJyYXkpKTtcbiAgfVxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXk8bnVtYmVyPik6IE11dGFibGVWZWN0b3IzIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3IzKG5ldyBGbG9hdDMyQXJyYXkoYXJyYXkuc2xpY2UoMCwgMykpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KTogTXV0YWJsZVZlY3RvcjMge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVZlY3RvcjMoZmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUZsb2F0MzJBcnJheShmbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSk6IE11dGFibGVWZWN0b3IzIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3IzKG5ldyBGbG9hdDMyQXJyYXkoZmxvYXQzMkFycmF5LmJ1ZmZlci5zbGljZSgwKSkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5VmVjdG9yMyh2ZWM6IElWZWN0b3IzKTogTXV0YWJsZVZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHlWZWN0b3IzKHZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yMztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVZlY3RvcjQodmVjOiBJVmVjdG9yNCk6IE11dGFibGVWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5VmVjdG9yNCh2ZWMsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyBNdXRhYmxlVmVjdG9yMztcbiAgfVxuXG4gIHN0YXRpYyByb3RhdGVYKHZlYzM6IElWZWN0b3IzLCByYWRpYW46IG51bWJlciwgb3V0VmVjOiBNdXRhYmxlVmVjdG9yMykge1xuICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIG91dFZlYy55ID0gdmVjMy55ICogYyAtIHZlYzMueiAqIHM7XG4gICAgb3V0VmVjLnogPSB2ZWMzLnkgKiBzICsgdmVjMy56ICogYztcbiAgfVxuXG4gIHN0YXRpYyByb3RhdGVZKHZlYzM6IElWZWN0b3IzLCByYWRpYW46IG51bWJlciwgb3V0VmVjOiBNdXRhYmxlVmVjdG9yMykge1xuICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIG91dFZlYy54ID0gdmVjMy54ICogYyArIHZlYzMueiAqIHM7XG4gICAgb3V0VmVjLnogPSAtdmVjMy54ICogcyArIHZlYzMueiAqIGM7XG4gIH1cblxuICBzdGF0aWMgcm90YXRlWih2ZWMzOiBJVmVjdG9yMywgcmFkaWFuOiBudW1iZXIsIG91dFZlYzogTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBjb25zdCBjID0gTWF0aC5jb3MocmFkaWFuKTtcbiAgICBjb25zdCBzID0gTWF0aC5zaW4ocmFkaWFuKTtcbiAgICBvdXRWZWMueCA9IHZlYzMueCAqIGMgLSB2ZWMzLnkgKiBzO1xuICAgIG91dFZlYy55ID0gdmVjMy54ICogcyArIHZlYzMueSAqIGM7XG4gIH1cbn1cblxuLyoqXG4gKiBNdXRhYmxlIDNEKHgseSx6KSBWZWN0b3IgY2xhc3Mgd2l0aCA2NGJpdCBmbG9hdCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXRhYmxlVmVjdG9yM2QgZXh0ZW5kcyBNdXRhYmxlVmVjdG9yM188RmxvYXQ2NEFycmF5Q29uc3RydWN0b3I+IHtcbiAgY29uc3RydWN0b3IoeDogVHlwZWRBcnJheSkge1xuICAgIHN1cGVyKHgsIHsgdHlwZTogRmxvYXQ2NEFycmF5IH0pO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIHN1cGVyLl96ZXJvKEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IzZDtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX2R1bW15KEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZSh2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9ub3JtYWxpemUodmVjLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IzZDtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIHN1YnRyYWN0KGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9zdWJ0cmFjdChsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KHZlYzogSVZlY3RvcjMsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5KHZlYywgdmFsdWUsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGUodmVjLCB2YWx1ZSwgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yM2Q7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlVmVjdG9yKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGVWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IzZDtcbiAgfVxuXG4gIHN0YXRpYyBjcm9zcyhsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIHJldHVybiBzdXBlci5fY3Jvc3MobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3IzZDtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb24ocXVhdDogSVF1YXRlcm5pb24sIHZlYzogSVZlY3RvcjMpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5UXVhdGVybmlvbihxdWF0LCB2ZWMsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5Myh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogTXV0YWJsZVZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5Myh4LCB5LCB6LCBGbG9hdDY0QXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5MSh2YWw6IG51bWJlcik6IE11dGFibGVWZWN0b3IzZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weTModmFsLCB2YWwsIHZhbCwgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5MyhhcnJheTogQXJyYXkzPG51bWJlcj4pOiBNdXRhYmxlVmVjdG9yM2Qge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVZlY3RvcjNkKG5ldyBGbG9hdDY0QXJyYXkoYXJyYXkpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+KTogTXV0YWJsZVZlY3RvcjNkIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3IzZChuZXcgRmxvYXQ2NEFycmF5KGFycmF5LnNsaWNlKDAsIDMpKSk7XG4gIH1cblxuICBzdGF0aWMgcm90YXRlWCh2ZWMzOiBJVmVjdG9yMywgcmFkaWFuOiBudW1iZXIsIG91dFZlYzogTXV0YWJsZVZlY3RvcjNkKSB7XG4gICAgY29uc3QgYyA9IE1hdGguY29zKHJhZGlhbik7XG4gICAgY29uc3QgcyA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgb3V0VmVjLnkgPSB2ZWMzLnkgKiBjIC0gdmVjMy56ICogcztcbiAgICBvdXRWZWMueiA9IHZlYzMueSAqIHMgKyB2ZWMzLnogKiBjO1xuICB9XG5cbiAgc3RhdGljIHJvdGF0ZVkodmVjMzogSVZlY3RvcjMsIHJhZGlhbjogbnVtYmVyLCBvdXRWZWM6IE11dGFibGVWZWN0b3IzZCkge1xuICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhyYWRpYW4pO1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihyYWRpYW4pO1xuICAgIG91dFZlYy54ID0gdmVjMy54ICogYyArIHZlYzMueiAqIHM7XG4gICAgb3V0VmVjLnogPSAtdmVjMy54ICogcyArIHZlYzMueiAqIGM7XG4gIH1cblxuICBzdGF0aWMgcm90YXRlWih2ZWMzOiBJVmVjdG9yMywgcmFkaWFuOiBudW1iZXIsIG91dFZlYzogTXV0YWJsZVZlY3RvcjNkKSB7XG4gICAgY29uc3QgYyA9IE1hdGguY29zKHJhZGlhbik7XG4gICAgY29uc3QgcyA9IE1hdGguc2luKHJhZGlhbik7XG4gICAgb3V0VmVjLnggPSB2ZWMzLnggKiBjIC0gdmVjMy55ICogcztcbiAgICBvdXRWZWMueSA9IHZlYzMueCAqIHMgKyB2ZWMzLnkgKiBjO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNsb25lKCkgYXMgTXV0YWJsZVZlY3RvcjNkO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE11dGFibGVWZWN0b3IzZiA9IE11dGFibGVWZWN0b3IzO1xuIiwiaW1wb3J0IHsgSVZlY3RvcjQsIElNdXRhYmxlVmVjdG9yLCBJTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgQXJyYXk0LCBGbG9hdFR5cGVkQXJyYXksIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVmVjdG9yNF8gfSBmcm9tICcuL1ZlY3RvcjQnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTXV0YWJsZVZlY3RvcjRfPFQgZXh0ZW5kcyBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcj5cbiAgZXh0ZW5kcyBWZWN0b3I0XzxUPlxuICBpbXBsZW1lbnRzIElNdXRhYmxlVmVjdG9yLCBJTXV0YWJsZVZlY3RvcjRcbntcbiAgY29uc3RydWN0b3IoeDogRmxvYXRUeXBlZEFycmF5LCB7IHR5cGUgfTogeyB0eXBlOiBUIH0pIHtcbiAgICBzdXBlcih4LCB7IHR5cGUgfSk7XG4gIH1cblxuICBzZXQgeCh4OiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzBdID0geDtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBzZXQgeSh5OiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzFdID0geTtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBzZXQgeih6OiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzJdID0gejtcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB6KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBzZXQgdyh3OiBudW1iZXIpIHtcbiAgICB0aGlzLl92WzNdID0gdztcbiAgICB0aGlzLl9fdXBkYXRlQ291bnQrKztcbiAgfVxuXG4gIGdldCB3KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbM107XG4gIH1cblxuICByYXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Y7XG4gIH1cblxuICBzZXRBdChpOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92W2ldID0gdmFsdWU7XG4gICAgdGhpcy5fX3VwZGF0ZUNvdW50Kys7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb21wb25lbnRzKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlcikge1xuICAgIHRoaXMuX3ZbMF0gPSB4O1xuICAgIHRoaXMuX3ZbMV0gPSB5O1xuICAgIHRoaXMuX3ZbMl0gPSB6O1xuICAgIHRoaXMuX3ZbM10gPSB3O1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29weUNvbXBvbmVudHModmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiB0aGlzLnNldENvbXBvbmVudHModmVjLl92WzBdLCB2ZWMuX3ZbMV0sIHZlYy5fdlsyXSwgdmVjLl92WzNdKTtcbiAgfVxuXG4gIHplcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Q29tcG9uZW50cygwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRDb21wb25lbnRzKDEsIDEsIDEsIDEpO1xuICB9XG5cbiAgZ2V0IGJ5dGVzUGVyQ29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLl92LkJZVEVTX1BFUl9FTEVNRU5UO1xuICB9XG5cbiAgLyoqXG4gICAqIG5vcm1hbGl6ZVxuICAgKi9cbiAgbm9ybWFsaXplKCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG4gICAgdGhpcy5kaXZpZGUobGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG5vcm1hbGl6ZTMoKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gTWF0aC5oeXBvdCh0aGlzLl92WzBdLCB0aGlzLl92WzFdLCB0aGlzLl92WzJdKTtcbiAgICB0aGlzLmRpdmlkZShsZW5ndGgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB2YWx1ZVxuICAgKi9cbiAgYWRkKHZlYzogSVZlY3RvcjQpIHtcbiAgICB0aGlzLl92WzBdICs9IHZlYy5fdlswXTtcbiAgICB0aGlzLl92WzFdICs9IHZlYy5fdlsxXTtcbiAgICB0aGlzLl92WzJdICs9IHZlYy5fdlsyXTtcbiAgICB0aGlzLl92WzNdICs9IHZlYy5fdlszXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBzdWJ0cmFjdFxuICAgKi9cbiAgc3VidHJhY3QodmVjOiBJVmVjdG9yNCkge1xuICAgIHRoaXMuX3ZbMF0gLT0gdmVjLl92WzBdO1xuICAgIHRoaXMuX3ZbMV0gLT0gdmVjLl92WzFdO1xuICAgIHRoaXMuX3ZbMl0gLT0gdmVjLl92WzJdO1xuICAgIHRoaXMuX3ZbM10gLT0gdmVjLl92WzNdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5XG4gICAqL1xuICBtdWx0aXBseSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdlswXSAqPSB2YWx1ZTtcbiAgICB0aGlzLl92WzFdICo9IHZhbHVlO1xuICAgIHRoaXMuX3ZbMl0gKj0gdmFsdWU7XG4gICAgdGhpcy5fdlszXSAqPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB2ZWN0b3JcbiAgICovXG4gIG11bHRpcGx5VmVjdG9yKHZlYzogSVZlY3RvcjQpIHtcbiAgICB0aGlzLl92WzBdICo9IHZlYy5fdlswXTtcbiAgICB0aGlzLl92WzFdICo9IHZlYy5fdlsxXTtcbiAgICB0aGlzLl92WzJdICo9IHZlYy5fdlsyXTtcbiAgICB0aGlzLl92WzNdICo9IHZlYy5fdlszXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBkaXZpZGVcbiAgICovXG4gIGRpdmlkZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlICE9PSAwKSB7XG4gICAgICB0aGlzLl92WzBdIC89IHZhbHVlO1xuICAgICAgdGhpcy5fdlsxXSAvPSB2YWx1ZTtcbiAgICAgIHRoaXMuX3ZbMl0gLz0gdmFsdWU7XG4gICAgICB0aGlzLl92WzNdIC89IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICB0aGlzLl92WzBdID0gSW5maW5pdHk7XG4gICAgICB0aGlzLl92WzFdID0gSW5maW5pdHk7XG4gICAgICB0aGlzLl92WzJdID0gSW5maW5pdHk7XG4gICAgICB0aGlzLl92WzNdID0gSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSB2ZWN0b3JcbiAgICovXG4gIGRpdmlkZVZlY3Rvcih2ZWM6IElWZWN0b3I0KSB7XG4gICAgaWYgKHZlYy5fdlswXSAhPT0gMCAmJiB2ZWMuX3ZbMV0gIT09IDAgJiYgdmVjLl92WzJdICE9PSAwICYmIHZlYy5fdlszXSAhPT0gMCkge1xuICAgICAgdGhpcy5fdlswXSAvPSB2ZWMuX3ZbMF07XG4gICAgICB0aGlzLl92WzFdIC89IHZlYy5fdlsxXTtcbiAgICAgIHRoaXMuX3ZbMl0gLz0gdmVjLl92WzJdO1xuICAgICAgdGhpcy5fdlszXSAvPSB2ZWMuX3ZbM107XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHRoaXMuX3ZbMF0gPSB2ZWMuX3ZbMF0gPT09IDAgPyBJbmZpbml0eSA6IHRoaXMuX3ZbMF0gLyB2ZWMuX3ZbMF07XG4gICAgICB0aGlzLl92WzFdID0gdmVjLl92WzFdID09PSAwID8gSW5maW5pdHkgOiB0aGlzLl92WzFdIC8gdmVjLl92WzFdO1xuICAgICAgdGhpcy5fdlsyXSA9IHZlYy5fdlsyXSA9PT0gMCA/IEluZmluaXR5IDogdGhpcy5fdlsyXSAvIHZlYy5fdlsyXTtcbiAgICAgIHRoaXMuX3ZbM10gPSB2ZWMuX3ZbM10gPT09IDAgPyBJbmZpbml0eSA6IHRoaXMuX3ZbM10gLyB2ZWMuX3ZbM107XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0IF91cGRhdGVDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZUNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3VwZGF0ZUNvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBNdXRhYmxlIDREKHgseSx6LHcpIFZlY3RvciBjbGFzcyB3aXRoIDMyYml0IGZsb2F0IGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIE11dGFibGVWZWN0b3I0IGV4dGVuZHMgTXV0YWJsZVZlY3RvcjRfPEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHg6IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKHgsIHsgdHlwZTogRmxvYXQzMkFycmF5IH0pO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkoYXJyYXk6IEFycmF5PG51bWJlcj4pOiBNdXRhYmxlVmVjdG9yNCB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlVmVjdG9yNChuZXcgRmxvYXQzMkFycmF5KGFycmF5KS5zbGljZSgwLCA0KSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTQoYXJyYXk6IEFycmF5NDxudW1iZXI+KTogTXV0YWJsZVZlY3RvcjQge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVZlY3RvcjQobmV3IEZsb2F0MzJBcnJheShhcnJheSkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5NCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIpOiBNdXRhYmxlVmVjdG9yNCB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlVmVjdG9yNChuZXcgRmxvYXQzMkFycmF5KFt4LCB5LCB6LCB3XSkpO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIHN1cGVyLl96ZXJvKEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgb25lKCkge1xuICAgIHJldHVybiBzdXBlci5fb25lKEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3I0O1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZSh2ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9ub3JtYWxpemUodmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3I0O1xuICB9XG5cbiAgc3RhdGljIGFkZChsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fYWRkKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNDtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3I0O1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KHZlYzogSVZlY3RvcjQsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5KHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlWZWN0b3IobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5VmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNDtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlVmVjdG9yKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGVWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIE11dGFibGVWZWN0b3I0O1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ011dGFibGVWZWN0b3I0JztcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KShcbiAgICAgIG5ldyAodGhpcy5fdi5jb25zdHJ1Y3RvciBhcyBhbnkpKFt0aGlzLl92WzBdLCB0aGlzLl92WzFdLCB0aGlzLl92WzJdLCB0aGlzLl92WzNdXSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTXV0YWJsZSA0RCh4LHkseix3KSBWZWN0b3IgY2xhc3Mgd2l0aCA2NGJpdCBmbG9hdCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXRhYmxlVmVjdG9yNGQgZXh0ZW5kcyBNdXRhYmxlVmVjdG9yNF88RmxvYXQ2NEFycmF5Q29uc3RydWN0b3I+IHtcbiAgY29uc3RydWN0b3IoeDogRmxvYXQ2NEFycmF5KSB7XG4gICAgc3VwZXIoeCwgeyB0eXBlOiBGbG9hdDY0QXJyYXkgfSk7XG4gIH1cblxuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gc3VwZXIuX3plcm8oRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgb25lKCkge1xuICAgIHJldHVybiBzdXBlci5fb25lKEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgbm9ybWFsaXplKHZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX25vcm1hbGl6ZSh2ZWMsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIGFkZChsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fYWRkKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgc3VidHJhY3QobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX3N1YnRyYWN0KGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHkodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHkodmVjLCB2YWx1ZSwgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlWZWN0b3IobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5VmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBNdXRhYmxlVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlKHZlYzogSVZlY3RvcjQsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZSh2ZWMsIHZhbHVlLCBGbG9hdDY0QXJyYXkpIGFzIE11dGFibGVWZWN0b3I0ZDtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGVWZWN0b3IobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSkgYXMgTXV0YWJsZVZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXk0KGFycmF5OiBBcnJheTQ8bnVtYmVyPik6IE11dGFibGVWZWN0b3I0ZCB7XG4gICAgcmV0dXJuIG5ldyBNdXRhYmxlVmVjdG9yNGQobmV3IEZsb2F0NjRBcnJheShhcnJheSkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkoYXJyYXk6IEFycmF5PG51bWJlcj4pOiBNdXRhYmxlVmVjdG9yNGQge1xuICAgIHJldHVybiBuZXcgTXV0YWJsZVZlY3RvcjRkKG5ldyBGbG9hdDY0QXJyYXkoYXJyYXkuc2xpY2UoMCwgNCkpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weTQoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdzogbnVtYmVyKTogTXV0YWJsZVZlY3RvcjRkIHtcbiAgICByZXR1cm4gbmV3IE11dGFibGVWZWN0b3I0ZChuZXcgRmxvYXQ2NEFycmF5KFt4LCB5LCB6LCB3XSkpO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNsb25lKCkgYXMgTXV0YWJsZVZlY3RvcjRkO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE11dGFibGVWZWN0b3I0ZiA9IE11dGFibGVWZWN0b3I0O1xuIiwiaW1wb3J0IHsgSVZlY3RvcjIsIElWZWN0b3IzLCBJVmVjdG9yNCB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQgeyBBcnJheTQsIFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gJy4vTWF0aFV0aWwnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IElRdWF0ZXJuaW9uLCBJTG9nUXVhdGVybmlvbiwgSU11dGFibGVRdWF0ZXJuaW9uIH0gZnJvbSAnLi9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgSU1hdHJpeDQ0IH0gZnJvbSAnLi9JTWF0cml4JztcbmltcG9ydCB7IExvZ1F1YXRlcm5pb24gfSBmcm9tICcuL0xvZ1F1YXRlcm5pb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RRdWF0ZXJuaW9uIH0gZnJvbSAnLi9BYnN0cmFjdFF1YXRlcm5pb24nO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4vTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDQ0IH0gZnJvbSAnLi9NdXRhYmxlTWF0cml4NDQnO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuL01hdHJpeDQ0JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL21pc2MvTG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIFF1YXRlcm5pb24gZXh0ZW5kcyBBYnN0cmFjdFF1YXRlcm5pb24gaW1wbGVtZW50cyBJUXVhdGVybmlvbiB7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3VwVmVjOiBhbnkgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3ZlYzNfMDogYW55ID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF92ZWMzXzE6IGFueSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfdmVjM18yOiBhbnkgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3ZlYzNfMzogYW55ID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF92ZWMzXzQ6IGFueSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBjb25zdHJ1Y3Rvcih4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3YgPSB4O1xuICB9XG5cbiAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ1F1YXRlcm5pb24nO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb3NpdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5WZWM0O1xuICB9XG5cbiAgc3RhdGljIGlkZW50aXR5KCkge1xuICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCgwLCAwLCAwLCAxKTtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IEZsb2F0MzJBcnJheSgwKSk7XG4gIH1cblxuICBzdGF0aWMgaW52ZXJ0KHF1YXQ6IElRdWF0ZXJuaW9uKTogSVF1YXRlcm5pb24ge1xuICAgIGNvbnN0IG5vcm0gPSBxdWF0Lmxlbmd0aCgpO1xuICAgIGlmIChub3JtID09PSAwLjApIHtcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCgwLCAwLCAwLCAwKSBhcyBJUXVhdGVybmlvbjtcbiAgICB9XG5cbiAgICBjb25zdCB4ID0gLXF1YXQuX3ZbMF0gLyBub3JtO1xuICAgIGNvbnN0IHkgPSAtcXVhdC5fdlsxXSAvIG5vcm07XG4gICAgY29uc3QgeiA9IC1xdWF0Ll92WzJdIC8gbm9ybTtcbiAgICBjb25zdCB3ID0gcXVhdC5fdlszXSAvIG5vcm07XG4gICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KHgsIHksIHosIHcpIGFzIElRdWF0ZXJuaW9uO1xuICB9XG5cbiAgc3RhdGljIGludmVydFRvKHF1YXQ6IElRdWF0ZXJuaW9uLCBvdXQ6IElNdXRhYmxlUXVhdGVybmlvbik6IElRdWF0ZXJuaW9uIHtcbiAgICBjb25zdCBub3JtID0gcXVhdC5sZW5ndGgoKTtcbiAgICBpZiAobm9ybSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoMCwgMCwgMCwgMCk7XG4gICAgfVxuXG4gICAgb3V0Ll92WzBdID0gLXF1YXQuX3ZbMF0gLyBub3JtO1xuICAgIG91dC5fdlsxXSA9IC1xdWF0Ll92WzFdIC8gbm9ybTtcbiAgICBvdXQuX3ZbMl0gPSAtcXVhdC5fdlsyXSAvIG5vcm07XG4gICAgb3V0Ll92WzNdID0gcXVhdC5fdlszXSAvIG5vcm07XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgKi9cbiAgc3RhdGljIHFsZXJwKGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24sIHJhdGlvOiBudW1iZXIpOiBJUXVhdGVybmlvbiB7XG4gICAgbGV0IGRvdFByb2R1Y3QgPVxuICAgICAgbF9xdWF0Ll92WzBdICogcl9xdWF0Ll92WzBdICtcbiAgICAgIGxfcXVhdC5fdlsxXSAqIHJfcXVhdC5fdlsxXSArXG4gICAgICBsX3F1YXQuX3ZbMl0gKiByX3F1YXQuX3ZbMl0gK1xuICAgICAgbF9xdWF0Ll92WzNdICogcl9xdWF0Ll92WzNdO1xuICAgIGNvbnN0IHNzID0gMS4wIC0gZG90UHJvZHVjdCAqIGRvdFByb2R1Y3Q7XG5cbiAgICBpZiAoc3MgPT09IDAuMCkge1xuICAgICAgcmV0dXJuIGxfcXVhdC5jbG9uZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZG90UHJvZHVjdCA+IDEpIHtcbiAgICAgICAgZG90UHJvZHVjdCA9IDAuOTk5O1xuICAgICAgfSBlbHNlIGlmIChkb3RQcm9kdWN0IDwgLTEpIHtcbiAgICAgICAgZG90UHJvZHVjdCA9IC0wLjk5OTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRoZXRhID0gTWF0aC5hY29zKGRvdFByb2R1Y3QpO1xuICAgICAgY29uc3Qgc2luVGhldGEgPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICAgIGxldCBzMjtcbiAgICAgIGlmIChkb3RQcm9kdWN0IDwgMC4wKSB7XG4gICAgICAgIGRvdFByb2R1Y3QgKj0gLTE7XG4gICAgICAgIHRoZXRhID0gTWF0aC5hY29zKGRvdFByb2R1Y3QpO1xuICAgICAgICBzMiA9ICgtMSAqIE1hdGguc2luKHRoZXRhICogcmF0aW8pKSAvIHNpblRoZXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBNYXRoLnNpbih0aGV0YSAqIHJhdGlvKSAvIHNpblRoZXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgczEgPSBNYXRoLnNpbih0aGV0YSAqICgxLjAgLSByYXRpbykpIC8gc2luVGhldGE7XG5cbiAgICAgIGxldCB4ID0gbF9xdWF0Ll92WzBdICogczEgKyByX3F1YXQuX3ZbMF0gKiBzMjtcbiAgICAgIGxldCB5ID0gbF9xdWF0Ll92WzFdICogczEgKyByX3F1YXQuX3ZbMV0gKiBzMjtcbiAgICAgIGxldCB6ID0gbF9xdWF0Ll92WzJdICogczEgKyByX3F1YXQuX3ZbMl0gKiBzMjtcbiAgICAgIGxldCB3ID0gbF9xdWF0Ll92WzNdICogczEgKyByX3F1YXQuX3ZbM10gKiBzMjtcblxuICAgICAgLy8gbm9ybWFsaXplXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xuICAgICAgeCA9IHggLyBsZW5ndGg7XG4gICAgICB5ID0geSAvIGxlbmd0aDtcbiAgICAgIHogPSB6IC8gbGVuZ3RoO1xuICAgICAgdyA9IHcgLyBsZW5ndGg7XG5cbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCh4LCB5LCB6LCB3KSBhcyBJUXVhdGVybmlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIENvbXB1dGUgdGhlIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBhbmQgb3V0cHV0IGl0IGFzIHRoZSBmb3VydGggYXJndW1lbnRcbiAgICovXG4gIHN0YXRpYyBxbGVycFRvKGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24sIHJhdGlvOiBudW1iZXIsIG91dDogSU11dGFibGVRdWF0ZXJuaW9uKSB7XG4gICAgbGV0IGRvdFByb2R1Y3QgPVxuICAgICAgbF9xdWF0Ll92WzBdICogcl9xdWF0Ll92WzBdICtcbiAgICAgIGxfcXVhdC5fdlsxXSAqIHJfcXVhdC5fdlsxXSArXG4gICAgICBsX3F1YXQuX3ZbMl0gKiByX3F1YXQuX3ZbMl0gK1xuICAgICAgbF9xdWF0Ll92WzNdICogcl9xdWF0Ll92WzNdO1xuICAgIGNvbnN0IHNzID0gMS4wIC0gZG90UHJvZHVjdCAqIGRvdFByb2R1Y3Q7XG5cbiAgICBpZiAoc3MgPT09IDAuMCkge1xuICAgICAgcmV0dXJuIG91dC5jb3B5Q29tcG9uZW50cyhsX3F1YXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZG90UHJvZHVjdCA+IDEpIHtcbiAgICAgICAgZG90UHJvZHVjdCA9IDAuOTk5O1xuICAgICAgfSBlbHNlIGlmIChkb3RQcm9kdWN0IDwgLTEpIHtcbiAgICAgICAgZG90UHJvZHVjdCA9IC0wLjk5OTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRoZXRhID0gTWF0aC5hY29zKGRvdFByb2R1Y3QpO1xuICAgICAgY29uc3Qgc2luVGhldGEgPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICAgIGxldCBzMjtcbiAgICAgIGlmIChkb3RQcm9kdWN0IDwgMC4wKSB7XG4gICAgICAgIGRvdFByb2R1Y3QgKj0gLTE7XG4gICAgICAgIHRoZXRhID0gTWF0aC5hY29zKGRvdFByb2R1Y3QpO1xuICAgICAgICBzMiA9ICgtMSAqIE1hdGguc2luKHRoZXRhICogcmF0aW8pKSAvIHNpblRoZXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBNYXRoLnNpbih0aGV0YSAqIHJhdGlvKSAvIHNpblRoZXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgczEgPSBNYXRoLnNpbih0aGV0YSAqICgxLjAgLSByYXRpbykpIC8gc2luVGhldGE7XG5cbiAgICAgIG91dC5fdlswXSA9IGxfcXVhdC5fdlswXSAqIHMxICsgcl9xdWF0Ll92WzBdICogczI7XG4gICAgICBvdXQuX3ZbMV0gPSBsX3F1YXQuX3ZbMV0gKiBzMSArIHJfcXVhdC5fdlsxXSAqIHMyO1xuICAgICAgb3V0Ll92WzJdID0gbF9xdWF0Ll92WzJdICogczEgKyByX3F1YXQuX3ZbMl0gKiBzMjtcbiAgICAgIG91dC5fdlszXSA9IGxfcXVhdC5fdlszXSAqIHMxICsgcl9xdWF0Ll92WzNdICogczI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5ub3JtYWxpemUoKTtcbiAgfVxuXG4gIHN0YXRpYyBsZXJwKGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24sIHJhdGlvOiBudW1iZXIpIHtcbiAgICBjb25zdCB4ID0gbF9xdWF0Ll92WzBdICogKDEgLSByYXRpbykgKyByX3F1YXQuX3ZbMF0gKiByYXRpbztcbiAgICBjb25zdCB5ID0gbF9xdWF0Ll92WzFdICogKDEgLSByYXRpbykgKyByX3F1YXQuX3ZbMV0gKiByYXRpbztcbiAgICBjb25zdCB6ID0gbF9xdWF0Ll92WzJdICogKDEgLSByYXRpbykgKyByX3F1YXQuX3ZbMl0gKiByYXRpbztcbiAgICBjb25zdCB3ID0gbF9xdWF0Ll92WzNdICogKDEgLSByYXRpbykgKyByX3F1YXQuX3ZbM10gKiByYXRpbztcbiAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoeCwgeSwgeiwgdyk7XG4gIH1cblxuICBzdGF0aWMgbGVycFRvKGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24sIHJhdGlvOiBudW1iZXIsIG91dDogSU11dGFibGVRdWF0ZXJuaW9uKSB7XG4gICAgb3V0Ll92WzBdID0gbF9xdWF0Ll92WzBdICogKDEgLSByYXRpbykgKyByX3F1YXQuX3ZbMF0gKiByYXRpbztcbiAgICBvdXQuX3ZbMV0gPSBsX3F1YXQuX3ZbMV0gKiAoMSAtIHJhdGlvKSArIHJfcXVhdC5fdlsxXSAqIHJhdGlvO1xuICAgIG91dC5fdlsyXSA9IGxfcXVhdC5fdlsyXSAqICgxIC0gcmF0aW8pICsgcl9xdWF0Ll92WzJdICogcmF0aW87XG4gICAgb3V0Ll92WzNdID0gbF9xdWF0Ll92WzNdICogKDEgLSByYXRpbykgKyByX3F1YXQuX3ZbM10gKiByYXRpbztcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgc3RhdGljIGF4aXNBbmdsZSh2ZWM6IElWZWN0b3IzLCByYWRpYW46IG51bWJlcikge1xuICAgIGNvbnN0IGhhbGZBbmdsZSA9IDAuNSAqIHJhZGlhbjtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihoYWxmQW5nbGUpO1xuXG4gICAgY29uc3QgbGVuZ3RoID0gdmVjLmxlbmd0aCgpO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoXG4gICAgICAoc2luICogdmVjLl92WzBdKSAvIGxlbmd0aCxcbiAgICAgIChzaW4gKiB2ZWMuX3ZbMV0pIC8gbGVuZ3RoLFxuICAgICAgKHNpbiAqIHZlYy5fdlsyXSkgLyBsZW5ndGgsXG4gICAgICBNYXRoLmNvcyhoYWxmQW5nbGUpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTWF0cml4KG1hdDogSU1hdHJpeDQ0KSB7XG4gICAgbGV0IHN4ID0gTWF0aC5oeXBvdChtYXQubTAwLCBtYXQubTEwLCBtYXQubTIwKTtcbiAgICBjb25zdCBzeSA9IE1hdGguaHlwb3QobWF0Lm0wMSwgbWF0Lm0xMSwgbWF0Lm0yMSk7XG4gICAgY29uc3Qgc3ogPSBNYXRoLmh5cG90KG1hdC5tMDIsIG1hdC5tMTIsIG1hdC5tMjIpO1xuXG4gICAgY29uc3QgZGV0ID0gbWF0LmRldGVybWluYW50KCk7XG4gICAgaWYgKGRldCA8IDApIHtcbiAgICAgIHN4ID0gLXN4O1xuICAgIH1cblxuICAgIGNvbnN0IG0gPSBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHlNYXRyaXg0NChtYXQpO1xuXG4gICAgY29uc3QgaW52U3ggPSAxIC8gc3g7XG4gICAgY29uc3QgaW52U3kgPSAxIC8gc3k7XG4gICAgY29uc3QgaW52U3ogPSAxIC8gc3o7XG5cbiAgICBtLm0wMCAqPSBpbnZTeDtcbiAgICBtLm0xMCAqPSBpbnZTeDtcbiAgICBtLm0yMCAqPSBpbnZTeDtcblxuICAgIG0ubTAxICo9IGludlN5O1xuICAgIG0ubTExICo9IGludlN5O1xuICAgIG0ubTIxICo9IGludlN5O1xuXG4gICAgbS5tMDIgKj0gaW52U3o7XG4gICAgbS5tMTIgKj0gaW52U3o7XG4gICAgbS5tMjIgKj0gaW52U3o7XG5cbiAgICBjb25zdCB0cmFjZSA9IG0ubTAwICsgbS5tMTEgKyBtLm0yMjtcblxuICAgIGlmICh0cmFjZSA+IDApIHtcbiAgICAgIGNvbnN0IFMgPSAwLjUgLyBNYXRoLnNxcnQodHJhY2UgKyAxLjApO1xuICAgICAgY29uc3QgeCA9IChtLm0yMSAtIG0ubTEyKSAqIFM7XG4gICAgICBjb25zdCB5ID0gKG0ubTAyIC0gbS5tMjApICogUztcbiAgICAgIGNvbnN0IHogPSAobS5tMTAgLSBtLm0wMSkgKiBTO1xuICAgICAgY29uc3QgdyA9IDAuMjUgLyBTO1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KHgsIHksIHosIHcpO1xuICAgIH0gZWxzZSBpZiAobS5tMDAgPiBtLm0xMSAmJiBtLm0wMCA+IG0ubTIyKSB7XG4gICAgICBjb25zdCBTID0gTWF0aC5zcXJ0KDEuMCArIG0ubTAwIC0gbS5tMTEgLSBtLm0yMikgKiAyO1xuICAgICAgY29uc3QgeCA9IDAuMjUgKiBTO1xuICAgICAgY29uc3QgeSA9IChtLm0wMSArIG0ubTEwKSAvIFM7XG4gICAgICBjb25zdCB6ID0gKG0ubTAyICsgbS5tMjApIC8gUztcbiAgICAgIGNvbnN0IHcgPSAobS5tMjEgLSBtLm0xMikgLyBTO1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KHgsIHksIHosIHcpO1xuICAgIH0gZWxzZSBpZiAobS5tMTEgPiBtLm0yMikge1xuICAgICAgY29uc3QgUyA9IE1hdGguc3FydCgxLjAgKyBtLm0xMSAtIG0ubTAwIC0gbS5tMjIpICogMjtcbiAgICAgIGNvbnN0IHggPSAobS5tMDEgKyBtLm0xMCkgLyBTO1xuICAgICAgY29uc3QgeSA9IDAuMjUgKiBTO1xuICAgICAgY29uc3QgeiA9IChtLm0xMiArIG0ubTIxKSAvIFM7XG4gICAgICBjb25zdCB3ID0gKG0ubTAyIC0gbS5tMjApIC8gUztcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCh4LCB5LCB6LCB3KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgUyA9IE1hdGguc3FydCgxLjAgKyBtLm0yMiAtIG0ubTAwIC0gbS5tMTEpICogMjtcbiAgICAgIGNvbnN0IHggPSAobS5tMDIgKyBtLm0yMCkgLyBTO1xuICAgICAgY29uc3QgeSA9IChtLm0xMiArIG0ubTIxKSAvIFM7XG4gICAgICBjb25zdCB6ID0gMC4yNSAqIFM7XG4gICAgICBjb25zdCB3ID0gKG0ubTEwIC0gbS5tMDEpIC8gUztcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCh4LCB5LCB6LCB3KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZnJvbU1hdHJpeFRvKG1hdDogSU1hdHJpeDQ0LCBvdXQ6IElNdXRhYmxlUXVhdGVybmlvbikge1xuICAgIGxldCBzeCA9IE1hdGguaHlwb3QobWF0Lm0wMCwgbWF0Lm0xMCwgbWF0Lm0yMCk7XG4gICAgY29uc3Qgc3kgPSBNYXRoLmh5cG90KG1hdC5tMDEsIG1hdC5tMTEsIG1hdC5tMjEpO1xuICAgIGNvbnN0IHN6ID0gTWF0aC5oeXBvdChtYXQubTAyLCBtYXQubTEyLCBtYXQubTIyKTtcblxuICAgIGNvbnN0IGRldCA9IG1hdC5kZXRlcm1pbmFudCgpO1xuICAgIGlmIChkZXQgPCAwKSB7XG4gICAgICBzeCA9IC1zeDtcbiAgICB9XG5cbiAgICBjb25zdCBtID0gTXV0YWJsZU1hdHJpeDQ0LmZyb21Db3B5TWF0cml4NDQobWF0KTtcblxuICAgIGNvbnN0IGludlN4ID0gMSAvIHN4O1xuICAgIGNvbnN0IGludlN5ID0gMSAvIHN5O1xuICAgIGNvbnN0IGludlN6ID0gMSAvIHN6O1xuXG4gICAgbS5tMDAgKj0gaW52U3g7XG4gICAgbS5tMTAgKj0gaW52U3g7XG4gICAgbS5tMjAgKj0gaW52U3g7XG5cbiAgICBtLm0wMSAqPSBpbnZTeTtcbiAgICBtLm0xMSAqPSBpbnZTeTtcbiAgICBtLm0yMSAqPSBpbnZTeTtcblxuICAgIG0ubTAyICo9IGludlN6O1xuICAgIG0ubTEyICo9IGludlN6O1xuICAgIG0ubTIyICo9IGludlN6O1xuXG4gICAgY29uc3QgdHJhY2UgPSBtLm0wMCArIG0ubTExICsgbS5tMjI7XG5cbiAgICBpZiAodHJhY2UgPiAwKSB7XG4gICAgICBjb25zdCBTID0gMC41IC8gTWF0aC5zcXJ0KHRyYWNlICsgMS4wKTtcbiAgICAgIG91dC5fdlswXSA9IChtLm0yMSAtIG0ubTEyKSAqIFM7XG4gICAgICBvdXQuX3ZbMV0gPSAobS5tMDIgLSBtLm0yMCkgKiBTO1xuICAgICAgb3V0Ll92WzJdID0gKG0ubTEwIC0gbS5tMDEpICogUztcbiAgICAgIG91dC5fdlszXSA9IDAuMjUgLyBTO1xuICAgIH0gZWxzZSBpZiAobS5tMDAgPiBtLm0xMSAmJiBtLm0wMCA+IG0ubTIyKSB7XG4gICAgICBjb25zdCBTID0gTWF0aC5zcXJ0KDEuMCArIG0ubTAwIC0gbS5tMTEgLSBtLm0yMikgKiAyO1xuICAgICAgb3V0Ll92WzBdID0gMC4yNSAqIFM7XG4gICAgICBvdXQuX3ZbMV0gPSAobS5tMDEgKyBtLm0xMCkgLyBTO1xuICAgICAgb3V0Ll92WzJdID0gKG0ubTAyICsgbS5tMjApIC8gUztcbiAgICAgIG91dC5fdlszXSA9IChtLm0yMSAtIG0ubTEyKSAvIFM7XG4gICAgfSBlbHNlIGlmIChtLm0xMSA+IG0ubTIyKSB7XG4gICAgICBjb25zdCBTID0gTWF0aC5zcXJ0KDEuMCArIG0ubTExIC0gbS5tMDAgLSBtLm0yMikgKiAyO1xuICAgICAgb3V0Ll92WzBdID0gKG0ubTAxICsgbS5tMTApIC8gUztcbiAgICAgIG91dC5fdlsxXSA9IDAuMjUgKiBTO1xuICAgICAgb3V0Ll92WzJdID0gKG0ubTEyICsgbS5tMjEpIC8gUztcbiAgICAgIG91dC5fdlszXSA9IChtLm0wMiAtIG0ubTIwKSAvIFM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFMgPSBNYXRoLnNxcnQoMS4wICsgbS5tMjIgLSBtLm0wMCAtIG0ubTExKSAqIDI7XG4gICAgICBvdXQuX3ZbMF0gPSAobS5tMDIgKyBtLm0yMCkgLyBTO1xuICAgICAgb3V0Ll92WzFdID0gKG0ubTEyICsgbS5tMjEpIC8gUztcbiAgICAgIG91dC5fdlsyXSA9IDAuMjUgKiBTO1xuICAgICAgb3V0Ll92WzNdID0gKG0ubTEwIC0gbS5tMDEpIC8gUztcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgc3RhdGljIGxvb2tGcm9tVG8oZnJvbURpcmVjdGlvbjogSVZlY3RvcjMsIHRvRGlyZWN0aW9uOiBJVmVjdG9yMyk6IElRdWF0ZXJuaW9uIHtcbiAgICBpZiAoZnJvbURpcmVjdGlvbi5pc0VxdWFsKHRvRGlyZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KDAsIDAsIDAsIDEpIGFzIElRdWF0ZXJuaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5xbGVycCh0aGlzLmxvb2tGb3J3YXJkKGZyb21EaXJlY3Rpb24pLCB0aGlzLmxvb2tGb3J3YXJkKHRvRGlyZWN0aW9uKSwgMSk7XG4gIH1cblxuICBzdGF0aWMgbG9va0ZvcndhcmQoZm9yd2FyZDogSVZlY3RvcjMpIHtcbiAgICBpZiAoUXVhdGVybmlvbi5fX3RtcF91cFZlYyA9PSBudWxsKSB7XG4gICAgICBRdWF0ZXJuaW9uLl9fdG1wX3VwVmVjID0gbmV3IChmb3J3YXJkLmNvbnN0cnVjdG9yIGFzIGFueSkoMCwgMSwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9va0ZvcndhcmRBY2NvcmRpbmdUb1RoaXNVcChmb3J3YXJkLCBRdWF0ZXJuaW9uLl9fdG1wX3VwVmVjKTtcbiAgfVxuXG4gIHN0YXRpYyBsb29rRm9yd2FyZEFjY29yZGluZ1RvVGhpc1VwKGZvcndhcmQ6IElWZWN0b3IzLCB1cDogSVZlY3RvcjMpOiBJUXVhdGVybmlvbiB7XG4gICAgY29uc3QgZm9yd2FyZExlbmd0aCA9IGZvcndhcmQubGVuZ3RoKCk7XG4gICAgaWYgKGZvcndhcmRMZW5ndGggPT09IDApIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3J3YXJkWCA9IGZvcndhcmQuX3ZbMF0gLyBmb3J3YXJkTGVuZ3RoO1xuICAgIGNvbnN0IGZvcndhcmRZID0gZm9yd2FyZC5fdlsxXSAvIGZvcndhcmRMZW5ndGg7XG4gICAgY29uc3QgZm9yd2FyZFogPSBmb3J3YXJkLl92WzJdIC8gZm9yd2FyZExlbmd0aDtcblxuICAgIGNvbnN0IHVwTGVuZ3RoID0gdXAubGVuZ3RoKCk7XG4gICAgaWYgKHVwTGVuZ3RoID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXBYID0gdXAuX3ZbMF0gLyB1cExlbmd0aDtcbiAgICBjb25zdCB1cFkgPSB1cC5fdlsxXSAvIHVwTGVuZ3RoO1xuICAgIGNvbnN0IHVwWiA9IHVwLl92WzJdIC8gdXBMZW5ndGg7XG5cbiAgICAvLyBWZWN0b3IzLmNyb3NzKHVwLCBmb3J3YXJkKVxuICAgIGxldCByaWdodFggPSB1cC5fdlsxXSAqIGZvcndhcmQuX3ZbMl0gLSB1cC5fdlsyXSAqIGZvcndhcmQuX3ZbMV07XG4gICAgbGV0IHJpZ2h0WSA9IHVwLl92WzJdICogZm9yd2FyZC5fdlswXSAtIHVwLl92WzBdICogZm9yd2FyZC5fdlsyXTtcbiAgICBsZXQgcmlnaHRaID0gdXAuX3ZbMF0gKiBmb3J3YXJkLl92WzFdIC0gdXAuX3ZbMV0gKiBmb3J3YXJkLl92WzBdO1xuXG4gICAgY29uc3QgcmlnaHRMZW5ndGggPSBNYXRoLmh5cG90KHJpZ2h0WCwgcmlnaHRZLCByaWdodFopO1xuICAgIGlmIChyaWdodExlbmd0aCA9PT0gMCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCcwIGRpdmlzaW9uIG9jY3VycmVkIScpO1xuICAgIH1cbiAgICByaWdodFggLz0gcmlnaHRMZW5ndGg7XG4gICAgcmlnaHRZIC89IHJpZ2h0TGVuZ3RoO1xuICAgIHJpZ2h0WiAvPSByaWdodExlbmd0aDtcblxuICAgIGNvbnN0IG0wMCA9IHJpZ2h0WDtcbiAgICBjb25zdCBtMDEgPSByaWdodFk7XG4gICAgY29uc3QgbTAyID0gcmlnaHRaO1xuICAgIGNvbnN0IG0xMCA9IHVwWDtcbiAgICBjb25zdCBtMTEgPSB1cFk7XG4gICAgY29uc3QgbTEyID0gdXBaO1xuICAgIGNvbnN0IG0yMCA9IGZvcndhcmRYO1xuICAgIGNvbnN0IG0yMSA9IGZvcndhcmRZO1xuICAgIGNvbnN0IG0yMiA9IGZvcndhcmRaO1xuXG4gICAgY29uc3QgbnVtOCA9IG0wMCArIG0xMSArIG0yMjtcbiAgICBpZiAobnVtOCA+IDApIHtcbiAgICAgIGNvbnN0IG51bSA9IE1hdGguc3FydChudW04ICsgMSk7XG4gICAgICBjb25zdCBudW0yID0gMC41IC8gbnVtO1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KFxuICAgICAgICAobTEyIC0gbTIxKSAqIG51bTIsXG4gICAgICAgIChtMjAgLSBtMDIpICogbnVtMixcbiAgICAgICAgKG0wMSAtIG0xMCkgKiBudW0yLFxuICAgICAgICBudW0gKiAwLjVcbiAgICAgICkgYXMgSVF1YXRlcm5pb247XG4gICAgfSBlbHNlIGlmIChtMDAgPj0gbTExICYmIG0wMCA+PSBtMjIpIHtcbiAgICAgIGNvbnN0IG51bTcgPSBNYXRoLnNxcnQoMSArIG0wMCAtIG0xMSAtIG0yMik7XG4gICAgICBjb25zdCBudW00ID0gMC41IC8gbnVtNztcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NChcbiAgICAgICAgMC41ICogbnVtNyxcbiAgICAgICAgKG0wMSArIG0xMCkgKiBudW00LFxuICAgICAgICAobTAyICsgbTIwKSAqIG51bTQsXG4gICAgICAgIChtMTIgLSBtMjEpICogbnVtNFxuICAgICAgKSBhcyBJUXVhdGVybmlvbjtcbiAgICB9IGVsc2UgaWYgKG0xMSA+IG0yMikge1xuICAgICAgY29uc3QgbnVtNiA9IE1hdGguc3FydCgxICsgbTExIC0gbTAwIC0gbTIyKTtcbiAgICAgIGNvbnN0IG51bTMgPSAwLjUgLyBudW02O1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KFxuICAgICAgICAobTEwICsgbTAxKSAqIG51bTMsXG4gICAgICAgIDAuNSAqIG51bTYsXG4gICAgICAgIChtMjEgKyBtMTIpICogbnVtMyxcbiAgICAgICAgKG0yMCAtIG0wMikgKiBudW0zXG4gICAgICApIGFzIElRdWF0ZXJuaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBudW01ID0gTWF0aC5zcXJ0KDEgKyBtMjIgLSBtMDAgLSBtMTEpO1xuICAgICAgY29uc3QgbnVtMiA9IDAuNSAvIG51bTU7XG4gICAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoXG4gICAgICAgIChtMjAgKyBtMDIpICogbnVtMixcbiAgICAgICAgKG0yMSArIG0xMikgKiBudW0yLFxuICAgICAgICAwLjUgKiBudW01LFxuICAgICAgICAobTAxIC0gbTEwKSAqIG51bTJcbiAgICAgICkgYXMgSVF1YXRlcm5pb247XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb21Qb3NpdGlvbih2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KHZlYy5fdlswXSwgdmVjLl92WzFdLCB2ZWMuX3ZbMl0sIDApO1xuICB9XG5cbiAgc3RhdGljIGFkZChsX3F1YXQ6IElRdWF0ZXJuaW9uLCByX3F1YXQ6IElRdWF0ZXJuaW9uKSB7XG4gICAgY29uc3QgeCA9IGxfcXVhdC5fdlswXSArIHJfcXVhdC5fdlswXTtcbiAgICBjb25zdCB5ID0gbF9xdWF0Ll92WzFdICsgcl9xdWF0Ll92WzFdO1xuICAgIGNvbnN0IHogPSBsX3F1YXQuX3ZbMl0gKyByX3F1YXQuX3ZbMl07XG4gICAgY29uc3QgdyA9IGxfcXVhdC5fdlszXSArIHJfcXVhdC5fdlszXTtcbiAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoeCwgeSwgeiwgdyk7XG4gIH1cblxuICBzdGF0aWMgYWRkVG8obF9xdWF0OiBJUXVhdGVybmlvbiwgcl9xdWF0OiBJUXVhdGVybmlvbiwgb3V0OiBJTXV0YWJsZVF1YXRlcm5pb24pIHtcbiAgICBvdXQuX3ZbMF0gPSBsX3F1YXQuX3ZbMF0gKyByX3F1YXQuX3ZbMF07XG4gICAgb3V0Ll92WzFdID0gbF9xdWF0Ll92WzFdICsgcl9xdWF0Ll92WzFdO1xuICAgIG91dC5fdlsyXSA9IGxfcXVhdC5fdlsyXSArIHJfcXVhdC5fdlsyXTtcbiAgICBvdXQuX3ZbM10gPSBsX3F1YXQuX3ZbM10gKyByX3F1YXQuX3ZbM107XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3F1YXQ6IElRdWF0ZXJuaW9uLCByX3F1YXQ6IElRdWF0ZXJuaW9uKSB7XG4gICAgY29uc3QgeCA9IGxfcXVhdC5fdlswXSAtIHJfcXVhdC5fdlswXTtcbiAgICBjb25zdCB5ID0gbF9xdWF0Ll92WzFdIC0gcl9xdWF0Ll92WzFdO1xuICAgIGNvbnN0IHogPSBsX3F1YXQuX3ZbMl0gLSByX3F1YXQuX3ZbMl07XG4gICAgY29uc3QgdyA9IGxfcXVhdC5fdlszXSAtIHJfcXVhdC5fdlszXTtcbiAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoeCwgeSwgeiwgdyk7XG4gIH1cblxuICBzdGF0aWMgc3VidHJhY3RUbyhsX3F1YXQ6IElRdWF0ZXJuaW9uLCByX3F1YXQ6IElRdWF0ZXJuaW9uLCBvdXQ6IElNdXRhYmxlUXVhdGVybmlvbikge1xuICAgIG91dC5fdlswXSA9IGxfcXVhdC5fdlswXSAtIHJfcXVhdC5fdlswXTtcbiAgICBvdXQuX3ZbMV0gPSBsX3F1YXQuX3ZbMV0gLSByX3F1YXQuX3ZbMV07XG4gICAgb3V0Ll92WzJdID0gbF9xdWF0Ll92WzJdIC0gcl9xdWF0Ll92WzJdO1xuICAgIG91dC5fdlszXSA9IGxfcXVhdC5fdlszXSAtIHJfcXVhdC5fdlszXTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICBjb25zdCB4ID1cbiAgICAgIHJfcXVhdC5fdlszXSAqIGxfcXVhdC5fdlswXSArXG4gICAgICByX3F1YXQuX3ZbMl0gKiBsX3F1YXQuX3ZbMV0gLVxuICAgICAgcl9xdWF0Ll92WzFdICogbF9xdWF0Ll92WzJdICtcbiAgICAgIHJfcXVhdC5fdlswXSAqIGxfcXVhdC5fdlszXTtcbiAgICBjb25zdCB5ID1cbiAgICAgIC1yX3F1YXQuX3ZbMl0gKiBsX3F1YXQuX3ZbMF0gK1xuICAgICAgcl9xdWF0Ll92WzNdICogbF9xdWF0Ll92WzFdICtcbiAgICAgIHJfcXVhdC5fdlswXSAqIGxfcXVhdC5fdlsyXSArXG4gICAgICByX3F1YXQuX3ZbMV0gKiBsX3F1YXQuX3ZbM107XG4gICAgY29uc3QgeiA9XG4gICAgICByX3F1YXQuX3ZbMV0gKiBsX3F1YXQuX3ZbMF0gLVxuICAgICAgcl9xdWF0Ll92WzBdICogbF9xdWF0Ll92WzFdICtcbiAgICAgIHJfcXVhdC5fdlszXSAqIGxfcXVhdC5fdlsyXSArXG4gICAgICByX3F1YXQuX3ZbMl0gKiBsX3F1YXQuX3ZbM107XG4gICAgY29uc3QgdyA9XG4gICAgICAtcl9xdWF0Ll92WzBdICogbF9xdWF0Ll92WzBdIC1cbiAgICAgIHJfcXVhdC5fdlsxXSAqIGxfcXVhdC5fdlsxXSAtXG4gICAgICByX3F1YXQuX3ZbMl0gKiBsX3F1YXQuX3ZbMl0gK1xuICAgICAgcl9xdWF0Ll92WzNdICogbF9xdWF0Ll92WzNdO1xuICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCh4LCB5LCB6LCB3KTtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseVRvKGxfcXVhdDogSVF1YXRlcm5pb24sIHJfcXVhdDogSVF1YXRlcm5pb24sIG91dDogSU11dGFibGVRdWF0ZXJuaW9uKSB7XG4gICAgY29uc3QgeCA9XG4gICAgICByX3F1YXQuX3ZbM10gKiBsX3F1YXQuX3ZbMF0gK1xuICAgICAgcl9xdWF0Ll92WzJdICogbF9xdWF0Ll92WzFdIC1cbiAgICAgIHJfcXVhdC5fdlsxXSAqIGxfcXVhdC5fdlsyXSArXG4gICAgICByX3F1YXQuX3ZbMF0gKiBsX3F1YXQuX3ZbM107XG4gICAgY29uc3QgeSA9XG4gICAgICAtcl9xdWF0Ll92WzJdICogbF9xdWF0Ll92WzBdICtcbiAgICAgIHJfcXVhdC5fdlszXSAqIGxfcXVhdC5fdlsxXSArXG4gICAgICByX3F1YXQuX3ZbMF0gKiBsX3F1YXQuX3ZbMl0gK1xuICAgICAgcl9xdWF0Ll92WzFdICogbF9xdWF0Ll92WzNdO1xuICAgIGNvbnN0IHogPVxuICAgICAgcl9xdWF0Ll92WzFdICogbF9xdWF0Ll92WzBdIC1cbiAgICAgIHJfcXVhdC5fdlswXSAqIGxfcXVhdC5fdlsxXSArXG4gICAgICByX3F1YXQuX3ZbM10gKiBsX3F1YXQuX3ZbMl0gK1xuICAgICAgcl9xdWF0Ll92WzJdICogbF9xdWF0Ll92WzNdO1xuICAgIGNvbnN0IHcgPVxuICAgICAgLXJfcXVhdC5fdlswXSAqIGxfcXVhdC5fdlswXSAtXG4gICAgICByX3F1YXQuX3ZbMV0gKiBsX3F1YXQuX3ZbMV0gLVxuICAgICAgcl9xdWF0Ll92WzJdICogbF9xdWF0Ll92WzJdICtcbiAgICAgIHJfcXVhdC5fdlszXSAqIGxfcXVhdC5fdlszXTtcbiAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoeCwgeSwgeiwgdyk7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlOdW1iZXIocXVhdDogSVF1YXRlcm5pb24sIHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCB4ID0gcXVhdC5fdlswXSAqIHZhbHVlO1xuICAgIGNvbnN0IHkgPSBxdWF0Ll92WzFdICogdmFsdWU7XG4gICAgY29uc3QgeiA9IHF1YXQuX3ZbMl0gKiB2YWx1ZTtcbiAgICBjb25zdCB3ID0gcXVhdC5fdlszXSAqIHZhbHVlO1xuICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCh4LCB5LCB6LCB3KTtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseU51bWJlclRvKHF1YXQ6IElRdWF0ZXJuaW9uLCB2YWx1ZTogbnVtYmVyLCBvdXQ6IElNdXRhYmxlUXVhdGVybmlvbikge1xuICAgIG91dC5fdlswXSA9IHF1YXQuX3ZbMF0gKiB2YWx1ZTtcbiAgICBvdXQuX3ZbMV0gPSBxdWF0Ll92WzFdICogdmFsdWU7XG4gICAgb3V0Ll92WzJdID0gcXVhdC5fdlsyXSAqIHZhbHVlO1xuICAgIG91dC5fdlszXSA9IHF1YXQuX3ZbM10gKiB2YWx1ZTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZU51bWJlcihxdWF0OiBJUXVhdGVybmlvbiwgdmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCcwIGRpdmlzaW9uIG9jY3VycmVkIScpO1xuICAgIH1cbiAgICBjb25zdCB4ID0gcXVhdC5fdlswXSAvIHZhbHVlO1xuICAgIGNvbnN0IHkgPSBxdWF0Ll92WzFdIC8gdmFsdWU7XG4gICAgY29uc3QgeiA9IHF1YXQuX3ZbMl0gLyB2YWx1ZTtcbiAgICBjb25zdCB3ID0gcXVhdC5fdlszXSAvIHZhbHVlO1xuICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NCh4LCB5LCB6LCB3KTtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGVOdW1iZXJUbyhxdWF0OiBJUXVhdGVybmlvbiwgdmFsdWU6IG51bWJlciwgb3V0OiBJTXV0YWJsZVF1YXRlcm5pb24pIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICB9XG4gICAgb3V0Ll92WzBdID0gcXVhdC5fdlswXSAvIHZhbHVlO1xuICAgIG91dC5fdlsxXSA9IHF1YXQuX3ZbMV0gLyB2YWx1ZTtcbiAgICBvdXQuX3ZbMl0gPSBxdWF0Ll92WzJdIC8gdmFsdWU7XG4gICAgb3V0Ll92WzNdID0gcXVhdC5fdlszXSAvIHZhbHVlO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJygnICsgdGhpcy5fdlswXSArICcsICcgKyB0aGlzLl92WzFdICsgJywgJyArIHRoaXMuX3ZbMl0gKyAnLCAnICsgdGhpcy5fdlszXSArICcpJztcbiAgfVxuXG4gIHRvU3RyaW5nQXBwcm94aW1hdGVseSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMF0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlsxXSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzJdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbM10pICtcbiAgICAgICdcXG4nXG4gICAgKTtcbiAgfVxuXG4gIGZsYXR0ZW5Bc0FycmF5KCkge1xuICAgIHJldHVybiBbdGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSwgdGhpcy5fdlszXV07XG4gIH1cblxuICBpc0R1bW15KCkge1xuICAgIGlmICh0aGlzLl92Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc0VxdWFsKHF1YXQ6IElRdWF0ZXJuaW9uLCBkZWx0YTogbnVtYmVyID0gTnVtYmVyLkVQU0lMT04pIHtcbiAgICBpZiAoXG4gICAgICBNYXRoLmFicyhxdWF0Ll92WzBdIC0gdGhpcy5fdlswXSkgPCBkZWx0YSAmJlxuICAgICAgTWF0aC5hYnMocXVhdC5fdlsxXSAtIHRoaXMuX3ZbMV0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKHF1YXQuX3ZbMl0gLSB0aGlzLl92WzJdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyhxdWF0Ll92WzNdIC0gdGhpcy5fdlszXSkgPCBkZWx0YVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1N0cmljdEVxdWFsKHF1YXQ6IElRdWF0ZXJuaW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fdlswXSA9PT0gcXVhdC5fdlswXSAmJlxuICAgICAgdGhpcy5fdlsxXSA9PT0gcXVhdC5fdlsxXSAmJlxuICAgICAgdGhpcy5fdlsyXSA9PT0gcXVhdC5fdlsyXSAmJlxuICAgICAgdGhpcy5fdlszXSA9PT0gcXVhdC5fdlszXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0b0V1bGVyQW5nbGVzVG8ob3V0OiBJTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBjb25zdCB0MCA9IDIgKiAodGhpcy5fdlszXSAqIHRoaXMuX3ZbMF0gKyB0aGlzLl92WzFdICogdGhpcy5fdlsyXSk7XG4gICAgY29uc3QgdDEgPSAxIC0gMiAqICh0aGlzLl92WzBdICogdGhpcy5fdlswXSArIHRoaXMuX3ZbMV0gKiB0aGlzLl92WzFdKTtcbiAgICBvdXQuX3ZbMF0gPSBNYXRoLmF0YW4yKHQwLCB0MSk7XG5cbiAgICBsZXQgdDIgPSAyICogKHRoaXMuX3ZbM10gKiB0aGlzLl92WzFdIC0gdGhpcy5fdlsyXSAqIHRoaXMuX3ZbMF0pO1xuICAgIHQyID0gdDIgPiAxID8gMSA6IHQyO1xuICAgIHQyID0gdDIgPCAtMSA/IC0xIDogdDI7XG4gICAgb3V0Ll92WzFdID0gTWF0aC5hc2luKHQyKTtcblxuICAgIGNvbnN0IHQzID0gMiAqICh0aGlzLl92WzNdICogdGhpcy5fdlsyXSArIHRoaXMuX3ZbMF0gKiB0aGlzLl92WzFdKTtcbiAgICBjb25zdCB0NCA9IDEgLSAyICogKHRoaXMuX3ZbMV0gKiB0aGlzLl92WzFdICsgdGhpcy5fdlsyXSAqIHRoaXMuX3ZbMl0pO1xuICAgIG91dC5fdlsyXSA9IE1hdGguYXRhbjIodDMsIHQ0KTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICB0b0V1bGVyQW5nbGVzKCkge1xuICAgIGNvbnN0IG91dCA9IG5ldyBWZWN0b3IzKG5ldyBGbG9hdDMyQXJyYXkoMykpO1xuICAgIGNvbnN0IHQwID0gMiAqICh0aGlzLl92WzNdICogdGhpcy5fdlswXSArIHRoaXMuX3ZbMV0gKiB0aGlzLl92WzJdKTtcbiAgICBjb25zdCB0MSA9IDEgLSAyICogKHRoaXMuX3ZbMF0gKiB0aGlzLl92WzBdICsgdGhpcy5fdlsxXSAqIHRoaXMuX3ZbMV0pO1xuICAgIG91dC5fdlswXSA9IE1hdGguYXRhbjIodDAsIHQxKTtcblxuICAgIGxldCB0MiA9IDIgKiAodGhpcy5fdlszXSAqIHRoaXMuX3ZbMV0gLSB0aGlzLl92WzJdICogdGhpcy5fdlswXSk7XG4gICAgdDIgPSB0MiA+IDEgPyAxIDogdDI7XG4gICAgdDIgPSB0MiA8IC0xID8gLTEgOiB0MjtcbiAgICBvdXQuX3ZbMV0gPSBNYXRoLmFzaW4odDIpO1xuXG4gICAgY29uc3QgdDMgPSAyICogKHRoaXMuX3ZbM10gKiB0aGlzLl92WzJdICsgdGhpcy5fdlswXSAqIHRoaXMuX3ZbMV0pO1xuICAgIGNvbnN0IHQ0ID0gMSAtIDIgKiAodGhpcy5fdlsxXSAqIHRoaXMuX3ZbMV0gKyB0aGlzLl92WzJdICogdGhpcy5fdlsyXSk7XG4gICAgb3V0Ll92WzJdID0gTWF0aC5hdGFuMih0MywgdDQpO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaXZpZGUoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZGl2aWRlKHZlYzogSVF1YXRlcm5pb24sIHZhbHVlOiBudW1iZXIpIHtcbiAgICBsZXQgeDtcbiAgICBsZXQgeTtcbiAgICBsZXQgejtcbiAgICBsZXQgdztcbiAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgIHggPSB2ZWMuX3ZbMF0gLyB2YWx1ZTtcbiAgICAgIHkgPSB2ZWMuX3ZbMV0gLyB2YWx1ZTtcbiAgICAgIHogPSB2ZWMuX3ZbMl0gLyB2YWx1ZTtcbiAgICAgIHcgPSB2ZWMuX3ZbM10gLyB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCcwIGRpdmlzaW9uIG9jY3VycmVkIScpO1xuICAgICAgeCA9IEluZmluaXR5O1xuICAgICAgeSA9IEluZmluaXR5O1xuICAgICAgeiA9IEluZmluaXR5O1xuICAgICAgdyA9IEluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQoeCwgeSwgeiwgdyk7XG4gIH1cblxuICAvKipcbiAgICogZGl2aWRlKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2RpdmlkZVRvKHZlYzogSVF1YXRlcm5pb24sIHZhbHVlOiBudW1iZXIsIG91dDogSU11dGFibGVRdWF0ZXJuaW9uKSB7XG4gICAgbGV0IHg7XG4gICAgbGV0IHk7XG4gICAgbGV0IHo7XG4gICAgbGV0IHc7XG4gICAgaWYgKHZhbHVlICE9PSAwKSB7XG4gICAgICB4ID0gdmVjLl92WzBdIC8gdmFsdWU7XG4gICAgICB5ID0gdmVjLl92WzFdIC8gdmFsdWU7XG4gICAgICB6ID0gdmVjLl92WzJdIC8gdmFsdWU7XG4gICAgICB3ID0gdmVjLl92WzNdIC8gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHggPSBJbmZpbml0eTtcbiAgICAgIHkgPSBJbmZpbml0eTtcbiAgICAgIHogPSBJbmZpbml0eTtcbiAgICAgIHcgPSBJbmZpbml0eTtcbiAgICB9XG4gICAgb3V0Ll92WzBdID0geDtcbiAgICBvdXQuX3ZbMV0gPSB5O1xuICAgIG91dC5fdlsyXSA9IHo7XG4gICAgb3V0Ll92WzNdID0gdztcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIG5vcm1hbGl6ZShzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJUXVhdGVybmlvbikge1xuICAgIGNvbnN0IGxlbmd0aCA9IHZlYy5sZW5ndGgoKTtcbiAgICByZXR1cm4gdGhpcy5fZGl2aWRlKHZlYywgbGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBub3JtYWxpemUoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplVG8odmVjOiBJUXVhdGVybmlvbiwgb3V0OiBJTXV0YWJsZVF1YXRlcm5pb24pIHtcbiAgICBjb25zdCBsZW5ndGggPSB2ZWMubGVuZ3RoKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RpdmlkZVRvKHZlYywgbGVuZ3RoLCBvdXQpO1xuICB9XG5cbiAgZnJvbVRvUm90YXRpb24oZnJvbTogSVZlY3RvcjMsIHRvOiBJVmVjdG9yMykge1xuICAgIGNvbnN0IHYwID0gTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlWZWN0b3IzKGZyb20pO1xuICAgIGNvbnN0IHYxID0gTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlWZWN0b3IzKHRvKTtcbiAgICB2MC5ub3JtYWxpemUoKTtcbiAgICB2MS5ub3JtYWxpemUoKTtcbiAgICBjb25zdCBkID0gdjAuZG90KHYxKTtcbiAgICBpZiAoZCA+IC0xLjAgKyBOdW1iZXIuRVBTSUxPTikge1xuICAgICAgY29uc3QgcyA9IE1hdGguc3FydCgoMS4wICsgZCkgKiAyLjApO1xuICAgICAgY29uc3QgaW52cyA9IDEuMCAvIHM7XG4gICAgICBjb25zdCBjID0gVmVjdG9yMy5tdWx0aXBseSh2MC5jcm9zcyh2MSksIGludnMpO1xuICAgICAgdGhpcy5fdlswXSA9IGMueDtcbiAgICAgIHRoaXMuX3ZbMV0gPSBjLnk7XG4gICAgICB0aGlzLl92WzJdID0gYy56O1xuICAgICAgdGhpcy5fdlszXSA9IHMgKiAwLjU7XG4gICAgICByZXR1cm4gUXVhdGVybmlvbi5ub3JtYWxpemUodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBheGlzID0gVmVjdG9yMy5mcm9tQ29weTMoMCwgMSwgMCk7XG4gICAgICBsZXQgYXhpczIgPSB2MC5jcm9zcyhheGlzKTtcbiAgICAgIGlmIChheGlzMi5sZW5ndGgoKSA8IE51bWJlci5FUFNJTE9OKSB7XG4gICAgICAgIGF4aXMgPSBWZWN0b3IzLmZyb21Db3B5MygxLCAwLCAwKTtcbiAgICAgICAgYXhpczIgPSB2MC5jcm9zcyhheGlzKTtcbiAgICAgIH1cbiAgICAgIGF4aXMyLm5vcm1hbGl6ZSgpO1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUF4aXNBbmdsZShheGlzMiwgTWF0aC5QSSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb21Ub1JvdGF0aW9uKGZyb206IElWZWN0b3IzLCB0bzogSVZlY3RvcjMpIHtcbiAgICBjb25zdCB2MCA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5VmVjdG9yMyhmcm9tKTtcbiAgICBjb25zdCB2MSA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5VmVjdG9yMyh0byk7XG4gICAgdjAubm9ybWFsaXplKCk7XG4gICAgdjEubm9ybWFsaXplKCk7XG4gICAgY29uc3QgZCA9IHYwLmRvdCh2MSk7XG4gICAgaWYgKGQgPiAtMS4wICsgTnVtYmVyLkVQU0lMT04pIHtcbiAgICAgIGNvbnN0IHMgPSBNYXRoLnNxcnQoKDEuMCArIGQpICogMi4wKTtcbiAgICAgIGNvbnN0IGludnMgPSAxLjAgLyBzO1xuICAgICAgY29uc3QgYyA9IFZlY3RvcjMubXVsdGlwbHkodjAuY3Jvc3ModjEpLCBpbnZzKTtcbiAgICAgIHJldHVybiBRdWF0ZXJuaW9uLmZyb21Db3B5NChjLngsIGMueSwgYy56LCBzICogMC41KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGF4aXMgPSBWZWN0b3IzLmZyb21Db3B5MygwLCAxLCAwKTtcbiAgICAgIGxldCBheGlzMiA9IHYwLmNyb3NzKGF4aXMpO1xuICAgICAgaWYgKGF4aXMyLmxlbmd0aCgpIDwgTnVtYmVyLkVQU0lMT04pIHtcbiAgICAgICAgYXhpcyA9IFZlY3RvcjMuZnJvbUNvcHkzKDEsIDAsIDApO1xuICAgICAgICBheGlzMiA9IHYwLmNyb3NzKGF4aXMpO1xuICAgICAgfVxuICAgICAgYXhpczIubm9ybWFsaXplKCk7XG4gICAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQXhpc0FuZ2xlKGF4aXMyLCBNYXRoLlBJKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZnJvbVRvUm90YXRpb25Ubyhmcm9tOiBJVmVjdG9yMywgdG86IElWZWN0b3IzLCBvdXQ6IElNdXRhYmxlUXVhdGVybmlvbikge1xuICAgIGNvbnN0IHYwID0gTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlWZWN0b3IzKGZyb20pO1xuICAgIGNvbnN0IHYxID0gTXV0YWJsZVZlY3RvcjMuZnJvbUNvcHlWZWN0b3IzKHRvKTtcbiAgICB2MC5ub3JtYWxpemUoKTtcbiAgICB2MS5ub3JtYWxpemUoKTtcbiAgICBjb25zdCBkID0gdjAuZG90KHYxKTtcbiAgICBpZiAoZCA+IC0xLjAgKyBOdW1iZXIuRVBTSUxPTikge1xuICAgICAgY29uc3QgcyA9IE1hdGguc3FydCgoMS4wICsgZCkgKiAyLjApO1xuICAgICAgY29uc3QgaW52cyA9IDEuMCAvIHM7XG4gICAgICBjb25zdCBjID0gVmVjdG9yMy5tdWx0aXBseVRvKHYwLmNyb3NzKHYxKSwgaW52cywgUXVhdGVybmlvbi5fX3RtcF92ZWMzXzApO1xuICAgICAgb3V0Ll92WzBdID0gYy54O1xuICAgICAgb3V0Ll92WzFdID0gYy55O1xuICAgICAgb3V0Ll92WzJdID0gYy56O1xuICAgICAgb3V0Ll92WzNdID0gcyAqIDAuNTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBheGlzID0gVmVjdG9yMy5mcm9tQ29weTMoMCwgMSwgMCk7XG4gICAgICBsZXQgYXhpczIgPSB2MC5jcm9zcyhheGlzKTtcbiAgICAgIGlmIChheGlzMi5sZW5ndGgoKSA8IE51bWJlci5FUFNJTE9OKSB7XG4gICAgICAgIGF4aXMgPSBWZWN0b3IzLmZyb21Db3B5MygxLCAwLCAwKTtcbiAgICAgICAgYXhpczIgPSB2MC5jcm9zcyhheGlzKTtcbiAgICAgIH1cbiAgICAgIGF4aXMyLm5vcm1hbGl6ZSgpO1xuICAgICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUF4aXNBbmdsZVRvKGF4aXMyLCBNYXRoLlBJLCBvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zZm9ybVZlY3RvcjModjogSVZlY3RvcjMpIHtcbiAgICBjb25zdCB1ID0gVmVjdG9yMy5mcm9tQ29weTModGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSk7XG4gICAgY29uc3QgdXYgPSBWZWN0b3IzLmNyb3NzKHUsIHYpO1xuICAgIGNvbnN0IHV1diA9IFZlY3RvcjMuY3Jvc3ModSwgdXYpO1xuICAgIGNvbnN0IHV2dyA9IFZlY3RvcjMubXVsdGlwbHkodXYsIHRoaXMuX3ZbM10pO1xuICAgIGNvbnN0IHV1dl91dncgPSBWZWN0b3IzLmFkZCh1dXYsIHV2dyk7XG4gICAgY29uc3QgdXV2X3V2d18yID0gVmVjdG9yMy5tdWx0aXBseSh1dXZfdXZ3LCAyKTtcbiAgICByZXR1cm4gVmVjdG9yMy5hZGQodiwgdXV2X3V2d18yKTtcbiAgfVxuXG4gIHRyYW5zZm9ybVZlY3RvcjNUbyh2OiBJVmVjdG9yMywgb3V0OiBJTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBjb25zdCB1ID0gVmVjdG9yMy5mcm9tQ29weTModGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSk7XG4gICAgY29uc3QgdXYgPSBWZWN0b3IzLmNyb3NzVG8odSwgdiwgUXVhdGVybmlvbi5fX3RtcF92ZWMzXzApO1xuICAgIGNvbnN0IHV1diA9IFZlY3RvcjMuY3Jvc3NUbyh1LCB1diwgUXVhdGVybmlvbi5fX3RtcF92ZWMzXzEpO1xuICAgIGNvbnN0IHV2dyA9IFZlY3RvcjMubXVsdGlwbHlUbyh1diwgdGhpcy5fdlszXSwgUXVhdGVybmlvbi5fX3RtcF92ZWMzXzIpO1xuICAgIGNvbnN0IHV1dl91dncgPSBWZWN0b3IzLmFkZFRvKHV1diwgdXZ3LCBRdWF0ZXJuaW9uLl9fdG1wX3ZlYzNfMyk7XG4gICAgY29uc3QgdXV2X3V2d18yID0gVmVjdG9yMy5tdWx0aXBseVRvKHV1dl91dncsIDIsIFF1YXRlcm5pb24uX190bXBfdmVjM180KTtcbiAgICByZXR1cm4gVmVjdG9yMy5hZGRUbyh2LCB1dXZfdXZ3XzIsIG91dCk7XG4gIH1cblxuICB0cmFuc2Zvcm1WZWN0b3IzSW52ZXJzZSh2OiBJVmVjdG9yMykge1xuICAgIGNvbnN0IGludiA9IFF1YXRlcm5pb24uaW52ZXJ0KHRoaXMpO1xuICAgIHJldHVybiBpbnYudHJhbnNmb3JtVmVjdG9yMyh2KTtcbiAgfVxuXG4gIGNsb25lKCk6IElRdWF0ZXJuaW9uIHtcbiAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tQ29weTQodGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSwgdGhpcy5fdlszXSkgYXMgSVF1YXRlcm5pb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUZsb2F0MzJBcnJheShhcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBRdWF0ZXJuaW9uKGFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5NChhcnJheTogQXJyYXk0PG51bWJlcj4pIHtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24obmV3IEZsb2F0MzJBcnJheShhcnJheSkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkoYXJyYXk6IEFycmF5PG51bWJlcj4pIHtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24obmV3IEZsb2F0MzJBcnJheShhcnJheS5zbGljZSgwLCA0KSkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5NCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24obmV3IEZsb2F0MzJBcnJheShbeCwgeSwgeiwgd10pKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVF1YXRlcm5pb24ocXVhdDogSVF1YXRlcm5pb24pIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gcXVhdC5fdlswXTtcbiAgICB2WzFdID0gcXVhdC5fdlsxXTtcbiAgICB2WzJdID0gcXVhdC5fdlsyXTtcbiAgICB2WzNdID0gcXVhdC5fdlszXTtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24odik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlWZWN0b3I0KHZlYzogSVZlY3RvcjQpIHtcbiAgICBjb25zdCB2ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICB2WzBdID0gdmVjLl92WzBdO1xuICAgIHZbMV0gPSB2ZWMuX3ZbMV07XG4gICAgdlsyXSA9IHZlYy5fdlsyXTtcbiAgICB2WzNdID0gdmVjLl92WzNdO1xuICAgIHJldHVybiBuZXcgUXVhdGVybmlvbih2KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUxvZ1F1YXRlcm5pb24oeDogSUxvZ1F1YXRlcm5pb24pIHtcbiAgICBjb25zdCB0aGV0YSA9IHguX3ZbMF0gKiB4Ll92WzBdICsgeC5fdlsxXSAqIHguX3ZbMV0gKyB4Ll92WzJdICogeC5fdlsyXTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgY29uc3QgdiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgdlswXSA9IHguX3ZbMF0gKiAoc2luIC8gdGhldGEpO1xuICAgIHZbMV0gPSB4Ll92WzFdICogKHNpbiAvIHRoZXRhKTtcbiAgICB2WzJdID0geC5fdlsyXSAqIChzaW4gLyB0aGV0YSk7XG4gICAgdlszXSA9IE1hdGguY29zKHRoZXRhKTtcbiAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24odik7XG4gIH1cblxuICBzdGF0aWMgZnJvbUF4aXNBbmdsZShheGlzOiBJVmVjdG9yMywgcmFkOiBudW1iZXIpIHtcbiAgICByYWQgPSByYWQgKiAwLjU7XG4gICAgY29uc3QgcyA9IE1hdGguc2luKHJhZCk7XG4gICAgcmV0dXJuIFF1YXRlcm5pb24uZnJvbUNvcHk0KHMgKiBheGlzLngsIHMgKiBheGlzLnksIHMgKiBheGlzLnosIE1hdGguY29zKHJhZCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21BeGlzQW5nbGVUbyhheGlzOiBJVmVjdG9yMywgcmFkOiBudW1iZXIsIG91dDogSU11dGFibGVRdWF0ZXJuaW9uKSB7XG4gICAgcmFkID0gcmFkICogMC41O1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIG91dC5fdlswXSA9IHMgKiBheGlzLng7XG4gICAgb3V0Ll92WzFdID0gcyAqIGF4aXMueTtcbiAgICBvdXQuX3ZbMl0gPSBzICogYXhpcy56O1xuICAgIG91dC5fdlszXSA9IE1hdGguY29zKHJhZCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVNjYWxhciB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQge1xuICBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgVHlwZWRBcnJheSxcbiAgVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxufSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gJy4vTWF0aFV0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RWZWN0b3IgfSBmcm9tICcuL0Fic3RyYWN0VmVjdG9yJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsYXJfPFQgZXh0ZW5kcyBUeXBlZEFycmF5Q29uc3RydWN0b3I+IGV4dGVuZHMgQWJzdHJhY3RWZWN0b3Ige1xuICBjb25zdHJ1Y3Rvcih2OiBUeXBlZEFycmF5LCB7IHR5cGUgfTogeyB0eXBlOiBUIH0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3YgPSB2O1xuICB9XG5cbiAgZ2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBnZXRWYWx1ZUluQXJyYXkoKSB7XG4gICAgcmV0dXJuIFt0aGlzLl92WzBdXTtcbiAgfVxuXG4gIGdldCB4KCkge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgZ2V0IHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy5fdjtcbiAgfVxuXG4gIGlzU3RyaWN0RXF1YWwoc2NhbGFyOiBTY2FsYXJfPFQ+KSB7XG4gICAgaWYgKHRoaXMueCA9PT0gc2NhbGFyLngpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNFcXVhbChzY2FsYXI6IFNjYWxhcl88VD4sIGRlbHRhOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTikge1xuICAgIGlmIChNYXRoLmFicyhzY2FsYXIueCAtIHRoaXMueCkgPCBkZWx0YSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXQgZ2xzbFN0ckFzRmxvYXQoKSB7XG4gICAgcmV0dXJuIGAke01hdGhVdGlsLmNvbnZlcnRUb1N0cmluZ0FzR0xTTEZsb2F0KHRoaXMueCl9YDtcbiAgfVxuXG4gIGdldCBnbHNsU3RyQXNJbnQoKSB7XG4gICAgcmV0dXJuIGAke01hdGguZmxvb3IodGhpcy54KX1gO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weU51bWJlcih2YWx1ZTogbnVtYmVyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShbdmFsdWVdKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc3RhdGljIF9kdW1teSh0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZSgpLCB7IHR5cGUgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvc2l0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLlNjYWxhcjtcbiAgfVxuXG4gIGdldCBieXRlc1BlckNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdi5CWVRFU19QRVJfRUxFTUVOVDtcbiAgfVxufVxuXG4vKipcbiAqIEltbXV0YWJsZSBTY2FsYXIgY2xhc3Mgd2l0aCAzMmJpdCBmbG9hdCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsYXIgZXh0ZW5kcyBTY2FsYXJfPEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yPiBpbXBsZW1lbnRzIElTY2FsYXIge1xuICBjb25zdHJ1Y3Rvcih4OiBUeXBlZEFycmF5KSB7XG4gICAgc3VwZXIoeCwgeyB0eXBlOiBGbG9hdDMyQXJyYXkgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlOdW1iZXIodmFsdWU6IG51bWJlcik6IFNjYWxhciB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weU51bWJlcih2YWx1ZSwgRmxvYXQzMkFycmF5KSBhcyBTY2FsYXI7XG4gIH1cblxuICBzdGF0aWMgemVybygpOiBTY2FsYXIge1xuICAgIHJldHVybiBTY2FsYXIuZnJvbUNvcHlOdW1iZXIoMCk7XG4gIH1cblxuICBzdGF0aWMgb25lKCk6IFNjYWxhciB7XG4gICAgcmV0dXJuIFNjYWxhci5mcm9tQ29weU51bWJlcigxKTtcbiAgfVxuXG4gIHN0YXRpYyBkdW1teSgpOiBTY2FsYXIge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQzMkFycmF5KSBhcyBTY2FsYXI7XG4gIH1cblxuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnU2NhbGFyJztcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGFuZ2UgdG8gc3RyaW5nXG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJygnICsgdGhpcy5fdlswXSArICcpJztcbiAgfVxuXG4gIGNsb25lKCk6IFNjYWxhciB7XG4gICAgcmV0dXJuIG5ldyBTY2FsYXIodGhpcy5fdikgYXMgU2NhbGFyO1xuICB9XG59XG5cbi8qKlxuICogSW1tdXRhYmxlIFNjYWxhciBjbGFzcyB3aXRoIDY0Yml0IGZsb2F0IGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxhcmQgZXh0ZW5kcyBTY2FsYXJfPEZsb2F0NjRBcnJheUNvbnN0cnVjdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHg6IFR5cGVkQXJyYXkpIHtcbiAgICBzdXBlcih4LCB7IHR5cGU6IEZsb2F0NjRBcnJheSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weU51bWJlcih2YWx1ZTogbnVtYmVyKTogU2NhbGFyZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weU51bWJlcih2YWx1ZSwgRmxvYXQ2NEFycmF5KSBhcyBTY2FsYXJkO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKTogU2NhbGFyZCB7XG4gICAgcmV0dXJuIFNjYWxhcmQuZnJvbUNvcHlOdW1iZXIoMCk7XG4gIH1cblxuICBzdGF0aWMgb25lKCk6IFNjYWxhcmQge1xuICAgIHJldHVybiBTY2FsYXJkLmZyb21Db3B5TnVtYmVyKDEpO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCk6IFNjYWxhcmQge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQ2NEFycmF5KSBhcyBTY2FsYXJkO1xuICB9XG5cbiAgY2xvbmUoKTogU2NhbGFyZCB7XG4gICAgcmV0dXJuIG5ldyBTY2FsYXJkKHRoaXMuX3YpIGFzIFNjYWxhcmQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgU2NhbGFyZiA9IFNjYWxhcjtcbiIsImltcG9ydCB7IEFycmF5MTYsIEFycmF5MywgQXJyYXk0IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgSU1hdHJpeDQ0IH0gZnJvbSAnLi9JTWF0cml4JztcbmltcG9ydCB7IElRdWF0ZXJuaW9uIH0gZnJvbSAnLi9JUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJVmVjdG9yMyB9IGZyb20gJy4vSVZlY3Rvcic7XG5pbXBvcnQgeyBNYXRyaXg0NCB9IGZyb20gJy4vTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDQ0IH0gZnJvbSAnLi9NdXRhYmxlTWF0cml4NDQnO1xuaW1wb3J0IHsgTXV0YWJsZVF1YXRlcm5pb24gfSBmcm9tICcuL011dGFibGVRdWF0ZXJuaW9uJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi9RdWF0ZXJuaW9uJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtM0Qge1xuICBwcml2YXRlIF9fcG9zaXRpb246IE11dGFibGVWZWN0b3IzO1xuICBwcml2YXRlIF9fc2NhbGU6IE11dGFibGVWZWN0b3IzO1xuICBwcml2YXRlIF9fcm90YXRpb246IE11dGFibGVRdWF0ZXJuaW9uO1xuICBwcml2YXRlIF9fbWF0cml4OiBNdXRhYmxlTWF0cml4NDQ7XG4gIC8vIHByaXZhdGUgX2ludk1hdHJpeDogTXV0YWJsZU1hdHJpeDQ0O1xuICAvLyBwcml2YXRlIF9ub3JtYWxNYXRyaXg6IE11dGFibGVNYXRyaXgzMztcblxuICBwcml2YXRlIF9faXNfcG9zaXRpb25fdXBkYXRlZCA9IHRydWU7XG4gIHByaXZhdGUgX19pc19zY2FsZV91cGRhdGVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfX2lzX3JvdGF0aW9uX3VwZGF0ZWQgPSB0cnVlO1xuICBwcml2YXRlIF9faXNfdHJzX21hdHJpeF91cGRhdGVkID0gdHJ1ZTtcbiAgLy8gcHJpdmF0ZSBfX2lzX2ludmVyc2VfdHJzX21hdHJpeF91cGRhdGVkID0gdHJ1ZTtcbiAgLy8gcHJpdmF0ZSBfX2lzX25vcm1hbF90cnNfbWF0cml4X3VwZGF0ZWQgPSB0cnVlO1xuXG4gIHByaXZhdGUgX191cGRhdGVDb3VudCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBNYXRyaXg0NF8wOiBNdXRhYmxlTWF0cml4NDQgPSBNdXRhYmxlTWF0cml4NDQuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlY3RvcjNfMDogTXV0YWJsZVZlY3RvcjMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjdG9yM18xOiBNdXRhYmxlVmVjdG9yMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWN0b3IzXzI6IE11dGFibGVWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFF1YXRlcm5pb25fMDogTXV0YWJsZVF1YXRlcm5pb24gPSBNdXRhYmxlUXVhdGVybmlvbi5pZGVudGl0eSgpO1xuXG4gIGNvbnN0cnVjdG9yKCk7XG4gIGNvbnN0cnVjdG9yKFRyYW5zZm9ybTNEOiBUcmFuc2Zvcm0zRCk7XG4gIGNvbnN0cnVjdG9yKHg/OiBUcmFuc2Zvcm0zRCkge1xuICAgIHRoaXMuX19wb3NpdGlvbiA9IE11dGFibGVWZWN0b3IzLmR1bW15KCk7XG4gICAgdGhpcy5fX3NjYWxlID0gTXV0YWJsZVZlY3RvcjMuZHVtbXkoKTtcbiAgICB0aGlzLl9fcm90YXRpb24gPSBNdXRhYmxlUXVhdGVybmlvbi5kdW1teSgpO1xuICAgIHRoaXMuX19tYXRyaXggPSBNdXRhYmxlTWF0cml4NDQuZHVtbXkoKTtcbiAgICAvLyB0aGlzLl9pbnZNYXRyaXggPSBNdXRhYmxlTWF0cml4NDQuZHVtbXkoKTtcbiAgICAvLyB0aGlzLl9ub3JtYWxNYXRyaXggPSBNdXRhYmxlTWF0cml4MzMuZHVtbXkoKTtcbiAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldFRyYW5zZm9ybShcbiAgICAgICAgeC5wb3NpdGlvbklubmVyLFxuICAgICAgICBNdXRhYmxlVmVjdG9yMy5mcm9tQ29weVZlY3RvcjMoeC5ldWxlckFuZ2xlc0lubmVyKSxcbiAgICAgICAgeC5zY2FsZUlubmVyLFxuICAgICAgICBNdXRhYmxlUXVhdGVybmlvbi5mcm9tQ29weVF1YXRlcm5pb24oeC5yb3RhdGlvbklubmVyKSxcbiAgICAgICAgeC5tYXRyaXhJbm5lclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3Bvc2l0aW9uID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICAgICAgdGhpcy5fX3NjYWxlID0gTXV0YWJsZVZlY3RvcjMub25lKCk7XG4gICAgICB0aGlzLl9fcm90YXRpb24gPSBNdXRhYmxlUXVhdGVybmlvbi5pZGVudGl0eSgpO1xuICAgICAgdGhpcy5fX21hdHJpeCA9IE11dGFibGVNYXRyaXg0NC5pZGVudGl0eSgpO1xuICAgICAgLy8gdGhpcy5faW52TWF0cml4ID0gTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCk7XG4gICAgICAvLyB0aGlzLl9ub3JtYWxNYXRyaXggPSBNdXRhYmxlTWF0cml4MzMuaWRlbnRpdHkoKTtcbiAgICB9XG4gIH1cblxuICBpc0VxdWFsKHJoczogVHJhbnNmb3JtM0QsIGRlbHRhID0gTnVtYmVyLkVQU0lMT04pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wb3NpdGlvbklubmVyLmlzRXF1YWwocmhzLnBvc2l0aW9uSW5uZXIsIGRlbHRhKSAmJlxuICAgICAgdGhpcy5yb3RhdGlvbklubmVyLmlzRXF1YWwocmhzLnJvdGF0aW9uSW5uZXIsIGRlbHRhKSAmJlxuICAgICAgdGhpcy5zY2FsZUlubmVyLmlzRXF1YWwocmhzLnNjYWxlSW5uZXIsIGRlbHRhKSAmJlxuICAgICAgdGhpcy5tYXRyaXhJbm5lci5pc0VxdWFsKHJocy5tYXRyaXhJbm5lciwgZGVsdGEpXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IFRyYW5zZm9ybTNEKHRoaXMpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIHNldCBwb3NpdGlvbih2ZWM6IElWZWN0b3IzKSB7XG4gICAgdGhpcy5fX3Bvc2l0aW9uLmNvcHlDb21wb25lbnRzKHZlYyk7XG4gICAgdGhpcy5fX2lzX3Bvc2l0aW9uX3VwZGF0ZWQgPSB0cnVlO1xuICAgIHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQgPSBmYWxzZTtcbiAgICAvLyB0aGlzLl9faXNfaW52ZXJzZV90cnNfbWF0cml4X3VwZGF0ZWQgPSBmYWxzZTtcbiAgICAvLyB0aGlzLl9faXNfbm9ybWFsX3Ryc19tYXRyaXhfdXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fX3VwZGF0ZVRyYW5zZm9ybSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGNvcHkgb2YgYSBsb2NhbCBwb3NpdGlvbiB2ZWN0b3JcbiAgICovXG4gIGdldCBwb3NpdGlvbigpOiBNdXRhYmxlVmVjdG9yMyB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25Jbm5lci5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHBvc2l0aW9uIHZlY3RvclxuICAgKi9cbiAgZ2V0IHBvc2l0aW9uSW5uZXIoKTogTXV0YWJsZVZlY3RvcjMge1xuICAgIGlmICh0aGlzLl9faXNfcG9zaXRpb25fdXBkYXRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19wb3NpdGlvbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX19tYXRyaXguZ2V0VHJhbnNsYXRlVG8odGhpcy5fX3Bvc2l0aW9uKTtcbiAgICAgIHRoaXMuX19pc19wb3NpdGlvbl91cGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19wb3NpdGlvbjtcbiAgfVxuXG4gIHNldCBldWxlckFuZ2xlcyh2ZWM6IElWZWN0b3IzKSB7XG4gICAgLy8gY29uc3Qgcm90YXRpb25NYXQgPSBUcmFuc2Zvcm0zRC5fX3RtcE1hdHJpeDQ0XzAucm90YXRlKHZlYyk7XG4gICAgLy8gdGhpcy5yb3RhdGlvbiA9IFF1YXRlcm5pb24uZnJvbU1hdHJpeChyb3RhdGlvbk1hdCk7XG4gICAgY29uc3Qgc3ggPSBNYXRoLnNpbih2ZWMuX3ZbMF0gKiAwLjUpO1xuICAgIGNvbnN0IGN4ID0gTWF0aC5jb3ModmVjLl92WzBdICogMC41KTtcbiAgICBjb25zdCBzeSA9IE1hdGguc2luKHZlYy5fdlsxXSAqIDAuNSk7XG4gICAgY29uc3QgY3kgPSBNYXRoLmNvcyh2ZWMuX3ZbMV0gKiAwLjUpO1xuICAgIGNvbnN0IHN6ID0gTWF0aC5zaW4odmVjLl92WzJdICogMC41KTtcbiAgICBjb25zdCBjeiA9IE1hdGguY29zKHZlYy5fdlsyXSAqIDAuNSk7XG5cbiAgICB0aGlzLnJvdGF0aW9uID0gTXV0YWJsZVF1YXRlcm5pb24uZnJvbUNvcHk0KFxuICAgICAgc3ggKiBjeSAqIGN6IC0gY3ggKiBzeSAqIHN6LFxuICAgICAgY3ggKiBzeSAqIGN6ICsgc3ggKiBjeSAqIHN6LFxuICAgICAgY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6LFxuICAgICAgY3ggKiBjeSAqIGN6ICsgc3ggKiBzeSAqIHN6XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGEgbG9jYWwgcm90YXRpb24gKFhZWiBldWxlcikgdmVjdG9yXG4gICAqL1xuICBnZXQgZXVsZXJBbmdsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXVsZXJBbmdsZXNJbm5lci5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHJvdGF0aW9uIChYWVogZXVsZXIpIHZlY3RvclxuICAgKi9cbiAgZ2V0IGV1bGVyQW5nbGVzSW5uZXIoKTogVmVjdG9yMyB7XG4gICAgLy8gdGhpcy5faXNfcXVhdGVybmlvbl91cGRhdGVkXG4gICAgcmV0dXJuIHRoaXMuX19yb3RhdGlvbi50b0V1bGVyQW5nbGVzKCk7XG4gIH1cblxuICBzZXQgc2NhbGUodmVjOiBJVmVjdG9yMykge1xuICAgIHRoaXMuX19zY2FsZS5jb3B5Q29tcG9uZW50cyh2ZWMpO1xuICAgIHRoaXMuX19pc19zY2FsZV91cGRhdGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9faXNfdHJzX21hdHJpeF91cGRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5fX2lzX2ludmVyc2VfdHJzX21hdHJpeF91cGRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5fX2lzX25vcm1hbF90cnNfbWF0cml4X3VwZGF0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX191cGRhdGVUcmFuc2Zvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGEgbG9jYWwgc2NhbGUgdmVjdG9yXG4gICAqL1xuICBnZXQgc2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NhbGVJbm5lci5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHNjYWxlIHZlY3RvclxuICAgKi9cbiAgZ2V0IHNjYWxlSW5uZXIoKSB7XG4gICAgaWYgKHRoaXMuX19pc19zY2FsZV91cGRhdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3NjYWxlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fX2lzX3Ryc19tYXRyaXhfdXBkYXRlZCkge1xuICAgICAgdGhpcy5fX21hdHJpeC5nZXRTY2FsZVRvKHRoaXMuX19zY2FsZSk7XG4gICAgICB0aGlzLl9faXNfc2NhbGVfdXBkYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19zY2FsZTtcbiAgfVxuXG4gIHNldCByb3RhdGlvbihxdWF0OiBJUXVhdGVybmlvbikge1xuICAgIHRoaXMuX19yb3RhdGlvbi5jb3B5Q29tcG9uZW50cyhxdWF0KTtcbiAgICB0aGlzLl9faXNfcm90YXRpb25fdXBkYXRlZCA9IHRydWU7XG4gICAgdGhpcy5fX2lzX3Ryc19tYXRyaXhfdXBkYXRlZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMuX19pc19pbnZlcnNlX3Ryc19tYXRyaXhfdXBkYXRlZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMuX19pc19ub3JtYWxfdHJzX21hdHJpeF91cGRhdGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9fdXBkYXRlVHJhbnNmb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGEgY29weSBvZiBhIGxvY2FsIHF1YXRlcm5pb24gdmVjdG9yXG4gICAqL1xuICBnZXQgcm90YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucm90YXRpb25Jbm5lci5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIGxvY2FsIHF1YXRlcm5pb24gdmVjdG9yXG4gICAqL1xuICBnZXQgcm90YXRpb25Jbm5lcigpOiBRdWF0ZXJuaW9uIHtcbiAgICBpZiAodGhpcy5fX2lzX3JvdGF0aW9uX3VwZGF0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fcm90YXRpb247XG4gICAgfSBlbHNlIGlmICghdGhpcy5fX2lzX3JvdGF0aW9uX3VwZGF0ZWQpIHtcbiAgICAgIGlmICh0aGlzLl9faXNfdHJzX21hdHJpeF91cGRhdGVkKSB7XG4gICAgICAgIHRoaXMuX19pc19yb3RhdGlvbl91cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fX3JvdGF0aW9uLmZyb21NYXRyaXgodGhpcy5fX21hdHJpeCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fcm90YXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fcm90YXRpb247XG4gIH1cblxuICBfX3VwZGF0ZVRyYW5zZm9ybSgpIHtcbiAgICB0aGlzLl9fdXBkYXRlRXVsZXJBbmdsZXMoKTtcbiAgICB0aGlzLl9fdXBkYXRlUG9zaXRpb24oKTtcbiAgICB0aGlzLl9fdXBkYXRlU2NhbGUoKTtcblxuICAgIC8vdGhpcy5fX3VwZGF0ZU1hdHJpeCgpO1xuICAgIHRoaXMuX19uZWVkVXBkYXRlKCk7XG4gIH1cblxuICBfX3VwZGF0ZUV1bGVyQW5nbGVzKCkge1xuICAgIGlmICghdGhpcy5fX2lzX3JvdGF0aW9uX3VwZGF0ZWQgJiYgdGhpcy5fX2lzX3Ryc19tYXRyaXhfdXBkYXRlZCkge1xuICAgICAgdGhpcy5fX3JvdGF0aW9uLmZyb21NYXRyaXgodGhpcy5fX21hdHJpeCk7XG4gICAgICB0aGlzLl9faXNfcm90YXRpb25fdXBkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgX191cGRhdGVQb3NpdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX19pc19wb3NpdGlvbl91cGRhdGVkICYmIHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX19tYXRyaXguZ2V0VHJhbnNsYXRlVG8odGhpcy5fX3Bvc2l0aW9uKTtcbiAgICAgIHRoaXMuX19pc19wb3NpdGlvbl91cGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBfX3VwZGF0ZVNjYWxlKCkge1xuICAgIGlmICghdGhpcy5fX2lzX3NjYWxlX3VwZGF0ZWQgJiYgdGhpcy5fX2lzX3Ryc19tYXRyaXhfdXBkYXRlZCkge1xuICAgICAgdGhpcy5fX21hdHJpeC5nZXRTY2FsZVRvKHRoaXMuX19zY2FsZSk7XG4gICAgICB0aGlzLl9faXNfc2NhbGVfdXBkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgX191cGRhdGVNYXRyaXgoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQgJiZcbiAgICAgIHRoaXMuX19pc19wb3NpdGlvbl91cGRhdGVkICYmXG4gICAgICB0aGlzLl9faXNfcm90YXRpb25fdXBkYXRlZCAmJlxuICAgICAgdGhpcy5fX2lzX3NjYWxlX3VwZGF0ZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gdGhpcy5fX21hdHJpeC5mcm9tUXVhdGVybmlvbih0aGlzLl9fcm90YXRpb24pO1xuICAgICAgY29uc3Qgc2NhbGVNYXQgPSBUcmFuc2Zvcm0zRC5fX3RtcE1hdHJpeDQ0XzAuc2NhbGUodGhpcy5fX3NjYWxlKTtcbiAgICAgIGNvbnN0IHJzTWF0cml4ID0gcm90YXRpb25NYXRyaXgubXVsdGlwbHkoc2NhbGVNYXQpOyAvLyByc01hdHJpeCByZWZlcmVuY2VzIHRvIHRoaXMuX21hdHJpeFxuICAgICAgcnNNYXRyaXgucHV0VHJhbnNsYXRlKHRoaXMuX19wb3NpdGlvbik7XG5cbiAgICAgIHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldCBtYXRyaXgobWF0OiBJTWF0cml4NDQpIHtcbiAgICB0aGlzLl9fbWF0cml4LmNvcHlDb21wb25lbnRzKG1hdCk7XG4gICAgdGhpcy5fX2lzX3Ryc19tYXRyaXhfdXBkYXRlZCA9IHRydWU7XG4gICAgdGhpcy5fX2lzX3Bvc2l0aW9uX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9faXNfcm90YXRpb25fdXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX19pc19zY2FsZV91cGRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5fX2lzX2ludmVyc2VfdHJzX21hdHJpeF91cGRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5fX2lzX25vcm1hbF90cnNfbWF0cml4X3VwZGF0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX191cGRhdGVUcmFuc2Zvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBjb3B5IG9mIGxvY2FsIHRyYW5zZm9ybSBtYXRyaXhcbiAgICovXG4gIGdldCBtYXRyaXgoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0cml4SW5uZXIuY2xvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBsb2NhbCB0cmFuc2Zvcm0gbWF0cml4XG4gICAqL1xuICBnZXQgbWF0cml4SW5uZXIoKSB7XG4gICAgaWYgKHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fbWF0cml4O1xuICAgIH1cblxuICAgIC8vIENsZWFyIGFuZCBzZXQgU2NhbGVcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGVJbm5lcjtcbiAgICBjb25zdCBuMDAgPSBzY2FsZS5fdlswXTtcbiAgICAvLyBjb25zdCBuMDEgPSAwO1xuICAgIC8vIGNvbnN0IG4wMiA9IDA7XG4gICAgLy8gY29uc3QgbjAzID0gMDtcbiAgICAvLyBjb25zdCBuMTAgPSAwO1xuICAgIGNvbnN0IG4xMSA9IHNjYWxlLl92WzFdO1xuICAgIC8vIGNvbnN0IG4xMiA9IDA7XG4gICAgLy8gY29uc3QgbjEzID0gMDtcbiAgICAvLyBjb25zdCBuMjAgPSAwO1xuICAgIC8vIGNvbnN0IG4yMSA9IDA7XG4gICAgY29uc3QgbjIyID0gc2NhbGUuX3ZbMl07XG4gICAgLy8gY29uc3QgbjIzID0gMDtcbiAgICAvLyBjb25zdCBuMzAgPSAwO1xuICAgIC8vIGNvbnN0IG4zMSA9IDA7XG4gICAgLy8gY29uc3QgbjMyID0gMDtcbiAgICAvLyBjb25zdCBuMzMgPSAxO1xuXG4gICAgY29uc3QgcSA9IHRoaXMucm90YXRpb25Jbm5lcjtcbiAgICBjb25zdCBzeCA9IHEuX3ZbMF0gKiBxLl92WzBdO1xuICAgIGNvbnN0IHN5ID0gcS5fdlsxXSAqIHEuX3ZbMV07XG4gICAgY29uc3Qgc3ogPSBxLl92WzJdICogcS5fdlsyXTtcbiAgICBjb25zdCBjeCA9IHEuX3ZbMV0gKiBxLl92WzJdO1xuICAgIGNvbnN0IGN5ID0gcS5fdlswXSAqIHEuX3ZbMl07XG4gICAgY29uc3QgY3ogPSBxLl92WzBdICogcS5fdlsxXTtcbiAgICBjb25zdCB3eCA9IHEuX3ZbM10gKiBxLl92WzBdO1xuICAgIGNvbnN0IHd5ID0gcS5fdlszXSAqIHEuX3ZbMV07XG4gICAgY29uc3Qgd3ogPSBxLl92WzNdICogcS5fdlsyXTtcblxuICAgIGNvbnN0IG0wMCA9IDEuMCAtIDIuMCAqIChzeSArIHN6KTtcbiAgICBjb25zdCBtMDEgPSAyLjAgKiAoY3ogLSB3eik7XG4gICAgY29uc3QgbTAyID0gMi4wICogKGN5ICsgd3kpO1xuICAgIC8vIGNvbnN0IG0wMyA9IDAuMDtcbiAgICBjb25zdCBtMTAgPSAyLjAgKiAoY3ogKyB3eik7XG4gICAgY29uc3QgbTExID0gMS4wIC0gMi4wICogKHN4ICsgc3opO1xuICAgIGNvbnN0IG0xMiA9IDIuMCAqIChjeCAtIHd4KTtcbiAgICAvLyBjb25zdCBtMTMgPSAwLjA7XG4gICAgY29uc3QgbTIwID0gMi4wICogKGN5IC0gd3kpO1xuICAgIGNvbnN0IG0yMSA9IDIuMCAqIChjeCArIHd4KTtcbiAgICBjb25zdCBtMjIgPSAxLjAgLSAyLjAgKiAoc3ggKyBzeSk7XG5cbiAgICAvLyBjb25zdCBtMjMgPSAwLjA7XG4gICAgLy8gY29uc3QgbTMwID0gMC4wO1xuICAgIC8vIGNvbnN0IG0zMSA9IDAuMDtcbiAgICAvLyBjb25zdCBtMzIgPSAwLjA7XG4gICAgLy8gY29uc3QgbTMzID0gMS4wO1xuXG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5wb3NpdGlvbklubmVyO1xuXG4gICAgLy8gVHJhbnNsYXRlTWF0cml4ICogUm90YXRlTWF0cml4ICogU2NhbGVNYXRyaXhcbiAgICB0aGlzLl9fbWF0cml4Lm0wMCA9IG0wMCAqIG4wMDtcbiAgICB0aGlzLl9fbWF0cml4Lm0wMSA9IG0wMSAqIG4xMTtcbiAgICB0aGlzLl9fbWF0cml4Lm0wMiA9IG0wMiAqIG4yMjtcbiAgICB0aGlzLl9fbWF0cml4Lm0wMyA9IHRyYW5zbGF0ZS54O1xuXG4gICAgdGhpcy5fX21hdHJpeC5tMTAgPSBtMTAgKiBuMDA7XG4gICAgdGhpcy5fX21hdHJpeC5tMTEgPSBtMTEgKiBuMTE7XG4gICAgdGhpcy5fX21hdHJpeC5tMTIgPSBtMTIgKiBuMjI7XG4gICAgdGhpcy5fX21hdHJpeC5tMTMgPSB0cmFuc2xhdGUueTtcblxuICAgIHRoaXMuX19tYXRyaXgubTIwID0gbTIwICogbjAwO1xuICAgIHRoaXMuX19tYXRyaXgubTIxID0gbTIxICogbjExO1xuICAgIHRoaXMuX19tYXRyaXgubTIyID0gbTIyICogbjIyO1xuICAgIHRoaXMuX19tYXRyaXgubTIzID0gdHJhbnNsYXRlLno7XG5cbiAgICB0aGlzLl9fbWF0cml4Lm0zMCA9IDA7XG4gICAgdGhpcy5fX21hdHJpeC5tMzEgPSAwO1xuICAgIHRoaXMuX19tYXRyaXgubTMyID0gMDtcbiAgICB0aGlzLl9fbWF0cml4Lm0zMyA9IDE7XG5cbiAgICAvLyBjb25zdCByb3RhdGVNYXRyaXggPSBuZXcgTWF0cml4NDQodGhpcy5xdWF0ZXJuaW9uKTtcbiAgICAvLyBjb25zdCBtYXRyaXggPSBNdXRhYmxlTWF0cml4NDQubXVsdGlwbHkocm90YXRlTWF0cml4LCBNYXRyaXg0NC5zY2FsZSh0aGlzLnNjYWxlKSk7XG4gICAgLy8gbWF0cml4Lm0wMyA9IHRoaXMudHJhbnNsYXRlLng7XG4gICAgLy8gbWF0cml4Lm0xMyA9IHRoaXMudHJhbnNsYXRlLnk7XG4gICAgLy8gbWF0cml4Lm0yMyA9IHRoaXMudHJhbnNsYXRlLno7XG5cbiAgICAvL3RoaXMuX19tYXRyaXguY29weUNvbXBvbmVudHMobWF0cml4KTtcblxuICAgIHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXMuX19tYXRyaXg7XG4gIH1cblxuICAvLyAvKipcbiAgLy8gICogcmV0dXJuIGEgY29weSBvZiBhbiBpbnZlcnNlIGxvY2FsIHRyYW5zZm9ybSBtYXRyaXhcbiAgLy8gICovXG4gIC8vIGdldCBpbnZlcnNlTWF0cml4KCk6IE1hdHJpeDQ0IHtcbiAgLy8gICByZXR1cm4gdGhpcy5pbnZlcnNlTWF0cml4SW5uZXIuY2xvbmUoKTtcbiAgLy8gfVxuXG4gIC8vIC8qKlxuICAvLyAgKiByZXR1cm4gYW4gaW52ZXJzZSBsb2NhbCB0cmFuc2Zvcm0gbWF0cml4XG4gIC8vICAqL1xuICAvLyBnZXQgaW52ZXJzZU1hdHJpeElubmVyKCkge1xuICAvLyAgIGlmICghdGhpcy5fX2lzX2ludmVyc2VfdHJzX21hdHJpeF91cGRhdGVkKSB7XG4gIC8vICAgICBNdXRhYmxlTWF0cml4NDQuaW52ZXJ0VG8odGhpcy5tYXRyaXhJbm5lciwgdGhpcy5faW52TWF0cml4KTtcbiAgLy8gICAgIHRoaXMuX19pc19pbnZlcnNlX3Ryc19tYXRyaXhfdXBkYXRlZCA9IHRydWU7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiB0aGlzLl9pbnZNYXRyaXg7XG4gIC8vIH1cblxuICAvLyBnZXQgbm9ybWFsTWF0cml4KCkge1xuICAvLyAgIHJldHVybiB0aGlzLm5vcm1hbE1hdHJpeElubmVyLmNsb25lKCk7XG4gIC8vIH1cblxuICAvLyBnZXQgbm9ybWFsTWF0cml4SW5uZXIoKSB7XG4gIC8vICAgaWYgKCF0aGlzLl9faXNfbm9ybWFsX3Ryc19tYXRyaXhfdXBkYXRlZCkge1xuICAvLyAgICAgY29uc3QgaW52ZXJ0ZWRNYXRyaXg0NCA9IE11dGFibGVNYXRyaXg0NC5pbnZlcnRUbyhcbiAgLy8gICAgICAgdGhpcy5tYXRyaXhJbm5lcixcbiAgLy8gICAgICAgVHJhbnNmb3JtM0QuX190bXBNYXRyaXg0NF8wXG4gIC8vICAgICApO1xuICAvLyAgICAgY29uc3QgbmV3Tm9ybWFsTWF0cml4ID0gaW52ZXJ0ZWRNYXRyaXg0NC50cmFuc3Bvc2UoKTtcbiAgLy8gICAgIHRoaXMuX25vcm1hbE1hdHJpeC5jb3B5Q29tcG9uZW50cyhuZXdOb3JtYWxNYXRyaXgpO1xuICAvLyAgICAgdGhpcy5fX2lzX25vcm1hbF90cnNfbWF0cml4X3VwZGF0ZWQgPSB0cnVlO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gdGhpcy5fbm9ybWFsTWF0cml4O1xuICAvLyB9XG5cbiAgX19uZWVkVXBkYXRlKCkge1xuICAgIHRoaXMuX191cGRhdGVDb3VudCsrO1xuICB9XG5cbiAgZ2V0IHVwZGF0ZUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlQ291bnQ7XG4gIH1cblxuICBzZXQgcm90YXRlTWF0cml4NDQocm90YXRlTWF0cml4OiBJTWF0cml4NDQpIHtcbiAgICB0aGlzLnJvdGF0aW9uID0gVHJhbnNmb3JtM0QuX190bXBRdWF0ZXJuaW9uXzAuZnJvbU1hdHJpeChyb3RhdGVNYXRyaXgpO1xuICB9XG5cbiAgZ2V0IHJvdGF0ZU1hdHJpeDQ0KCkge1xuICAgIHJldHVybiBNYXRyaXg0NC5mcm9tQ29weVF1YXRlcm5pb24odGhpcy5yb3RhdGlvbik7XG4gIH1cblxuICBzZXRQcm9wZXJ0aWVzRnJvbUpzb24oYXJnOiBKU09OKSB7XG4gICAgbGV0IGpzb24gPSBhcmc7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqc29uID0gSlNPTi5wYXJzZShhcmcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoanNvbi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGtleSBpbiB0aGlzKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdxdWF0ZXJuaW9uJykge1xuICAgICAgICAgIHRoaXNbJ3JvdGF0aW9uJ10gPSBRdWF0ZXJuaW9uLmZyb21Db3B5QXJyYXk0KChqc29uIGFzIGFueSlba2V5XSBhcyBBcnJheTQ8bnVtYmVyPik7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbWF0cml4Jykge1xuICAgICAgICAgIHRoaXNba2V5XSA9IE1hdHJpeDQ0LmZyb21Db3B5QXJyYXkxNlJvd01ham9yKChqc29uIGFzIGFueSlba2V5XSBhcyBBcnJheTE2PG51bWJlcj4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheSgoanNvbiBhcyBhbnkpW2tleV0gYXMgQXJyYXkzPG51bWJlcj4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0Um90YXRpb25Gcm9tTmV3VXBBbmRGcm9udChVcFZlYzogSVZlY3RvcjMsIEZyb250VmVjOiBJVmVjdG9yMykge1xuICAgIGNvbnN0IHlEaXIgPSBVcFZlYztcbiAgICBjb25zdCB4RGlyID0gTXV0YWJsZVZlY3RvcjMuY3Jvc3NUbyh5RGlyLCBGcm9udFZlYywgVHJhbnNmb3JtM0QuX190bXBWZWN0b3IzXzApO1xuICAgIGNvbnN0IHpEaXIgPSBNdXRhYmxlVmVjdG9yMy5jcm9zc1RvKHhEaXIsIHlEaXIsIFRyYW5zZm9ybTNELl9fdG1wVmVjdG9yM18xKTtcblxuICAgIGNvbnN0IHJvdGF0ZU1hdHJpeCA9IFRyYW5zZm9ybTNELl9fdG1wTWF0cml4NDRfMC5zZXRDb21wb25lbnRzKFxuICAgICAgeERpci54LFxuICAgICAgeURpci54LFxuICAgICAgekRpci54LFxuICAgICAgMCxcbiAgICAgIHhEaXIueSxcbiAgICAgIHlEaXIueSxcbiAgICAgIHpEaXIueSxcbiAgICAgIDAsXG4gICAgICB4RGlyLnosXG4gICAgICB5RGlyLnosXG4gICAgICB6RGlyLnosXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMVxuICAgICk7XG5cbiAgICB0aGlzLnJvdGF0ZU1hdHJpeDQ0ID0gcm90YXRlTWF0cml4O1xuICB9XG5cbiAgaGVhZFRvRGlyZWN0aW9uKGZyb21WZWM6IFZlY3RvcjMsIHRvVmVjOiBWZWN0b3IzKSB7XG4gICAgY29uc3QgZnJvbURpciA9IFRyYW5zZm9ybTNELl9fdG1wVmVjdG9yM18wLmNvcHlDb21wb25lbnRzKGZyb21WZWMpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHRvRGlyID0gVHJhbnNmb3JtM0QuX190bXBWZWN0b3IzXzEuY29weUNvbXBvbmVudHModG9WZWMpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHJvdGF0aW9uRGlyID0gTXV0YWJsZVZlY3RvcjMuY3Jvc3NUbyhmcm9tRGlyLCB0b0RpciwgVHJhbnNmb3JtM0QuX190bXBWZWN0b3IzXzIpO1xuICAgIGNvbnN0IGNvc1RoZXRhID0gVmVjdG9yMy5kb3QoZnJvbURpciwgdG9EaXIpO1xuICAgIGNvbnN0IHRoZXRhID0gTWF0aC5hY29zKGNvc1RoZXRhKTtcblxuICAgIHRoaXMucm90YXRpb24gPSBUcmFuc2Zvcm0zRC5fX3RtcFF1YXRlcm5pb25fMC5heGlzQW5nbGUocm90YXRpb25EaXIsIHRoZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbXVsdGlwbGUgdHJhbnNmb3JtIGluZm9ybWF0aW9uIGF0IG9uY2UuIEJ5IHVzaW5nIHRoaXMgbWV0aG9kLFxuICAgKiB3ZSByZWR1Y2UgdGhlIGNvc3Qgb2YgYXV0b21hdGljYWxseSB1cGRhdGluZyBvdGhlciB0cmFuc2Zvcm0gY29tcG9uZW50cyBpbnNpZGUgdGhpcyBjbGFzcy5cbiAgICogVGhpcyBtZXRob2QgbWF5IGJlIHVzZWZ1bCBmb3IgYW5pbWF0aW9uIHByb2Nlc3NpbmcgYW5kIHNvIG9uLlxuICAgKlxuICAgKiBUaGUgdHJhbnNmb3JtIGNvbXBvbmVudHMgb2YgdGhlc2UgYXJndW1lbnRzIG11c3Qgbm90IGJlIG11dHVhbGx5IGRpc2NyZXBhbnQuXG4gICAqIGZvciBleGFtcGxlLiBUaGUgdHJhbnNmb3JtIGNvbXBvbmVudHMgb2YgbWF0cml4IGFyZ3VtZW50ICh0cmFuc2xhdGUsIHJvdGF0ZS9xdWF0ZXJuaW9uLCBzY2FsZSlcbiAgICogbXVzdCBiZSBlcXVhbCB0byB0cmFuc2xhdGUsIHJvdGF0ZSwgc2NhbGUsIHF1YXRlcm5pb24gYXJndW1lbnRzLlxuICAgKiBBbmQgYm90aCByb3RhdGUgYW5kIHF1YXRlcm5pb24gYXJndW1lbnRzIG11c3QgYmUgc2FtZSByb3RhdGlvbi5cbiAgICogSWYgdGhlcmUgaXMgYW4gYXJndW1lbnQgcGFzc2VkIHdpdGggbnVsbCBvciB1bmRlZmluZWQsIGl0IGlzIGludGVycHJldGVkIGFzIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB0cmFuc2xhdGVcbiAgICogQHBhcmFtIHsqfSByb3RhdGVcbiAgICogQHBhcmFtIHsqfSBzY2FsZVxuICAgKiBAcGFyYW0geyp9IHF1YXRlcm5pb25cbiAgICogQHBhcmFtIHsqfSBtYXRyaXhcbiAgICovXG5cbiAgc2V0VHJhbnNmb3JtKFxuICAgIHRyYW5zbGF0ZTogTXV0YWJsZVZlY3RvcjMsXG4gICAgcm90YXRlOiBNdXRhYmxlVmVjdG9yMyxcbiAgICBzY2FsZTogTXV0YWJsZVZlY3RvcjMsXG4gICAgcXVhdGVybmlvbjogTXV0YWJsZVF1YXRlcm5pb24sXG4gICAgbWF0cml4OiBNdXRhYmxlTWF0cml4NDRcbiAgKSB7XG4gICAgdGhpcy5fX2lzX3Ryc19tYXRyaXhfdXBkYXRlZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMuX19pc19pbnZlcnNlX3Ryc19tYXRyaXhfdXBkYXRlZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMuX19pc19ub3JtYWxfdHJzX21hdHJpeF91cGRhdGVkID0gZmFsc2U7XG5cbiAgICAvLyBNYXRyaXhcbiAgICBpZiAobWF0cml4ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX19tYXRyaXggPSBtYXRyaXguY2xvbmUoKTtcbiAgICAgIHRoaXMuX19pc190cnNfbWF0cml4X3VwZGF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fX2lzX3Bvc2l0aW9uX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pc19yb3RhdGlvbl91cGRhdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXNfc2NhbGVfdXBkYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyYW5zbGF0ZVxuICAgIGlmICh0cmFuc2xhdGUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fX3Bvc2l0aW9uID0gdHJhbnNsYXRlLmNsb25lKCk7XG4gICAgICB0aGlzLl9faXNfcG9zaXRpb25fdXBkYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUm90YXRpb25cbiAgICBpZiAocm90YXRlICE9IG51bGwgJiYgcXVhdGVybmlvbiAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fcm90YXRpb24gPSBxdWF0ZXJuaW9uLmNsb25lKCkgYXMgTXV0YWJsZVF1YXRlcm5pb247XG4gICAgICB0aGlzLl9faXNfcm90YXRpb25fdXBkYXRlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyb3RhdGUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fX2lzX3JvdGF0aW9uX3VwZGF0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHF1YXRlcm5pb24gIT0gbnVsbCkge1xuICAgICAgdGhpcy5fX3JvdGF0aW9uID0gcXVhdGVybmlvbi5jbG9uZSgpIGFzIE11dGFibGVRdWF0ZXJuaW9uO1xuICAgICAgdGhpcy5fX2lzX3JvdGF0aW9uX3VwZGF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNjYWxlXG4gICAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX19zY2FsZSA9IHNjYWxlLmNsb25lKCk7XG4gICAgICB0aGlzLl9faXNfc2NhbGVfdXBkYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5fX3VwZGF0ZVRyYW5zZm9ybSgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJVmVjdG9yMiwgSVZlY3RvcjMsIElWZWN0b3I0LCBJVmVjdG9yLCBJTXV0YWJsZVZlY3RvcjIgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHR5cGUgeyBBcnJheTIsIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yLCBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWF0aFV0aWwgfSBmcm9tICcuL01hdGhVdGlsJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFZlY3RvciB9IGZyb20gJy4vQWJzdHJhY3RWZWN0b3InO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yMl88VCBleHRlbmRzIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yPiBleHRlbmRzIEFic3RyYWN0VmVjdG9yIHtcbiAgY29uc3RydWN0b3IodjogVHlwZWRBcnJheSwgeyB0eXBlIH06IHsgdHlwZTogVCB9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl92ID0gdjtcbiAgfVxuXG4gIGdldCB4KCkge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgZ2V0IHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMV07XG4gIH1cblxuICBnZXQgZ2xzbFN0ckFzRmxvYXQoKSB7XG4gICAgcmV0dXJuIGB2ZWMyKCR7TWF0aFV0aWwuY29udmVydFRvU3RyaW5nQXNHTFNMRmxvYXQoXG4gICAgICB0aGlzLl92WzBdXG4gICAgKX0sICR7TWF0aFV0aWwuY29udmVydFRvU3RyaW5nQXNHTFNMRmxvYXQodGhpcy5fdlsxXSl9KWA7XG4gIH1cblxuICBnZXQgZ2xzbFN0ckFzSW50KCkge1xuICAgIHJldHVybiBgaXZlYzIoJHtNYXRoLmZsb29yKHRoaXMuX3ZbMF0pfSwgJHtNYXRoLmZsb29yKHRoaXMuX3ZbMV0pfSlgO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb3NpdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5WZWMyO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvIHNxdWFyZSBsZW5ndGgoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgbGVuZ3RoU3F1YXJlZCh2ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHZlYy5sZW5ndGhTcXVhcmVkKCk7XG4gIH1cblxuICBzdGF0aWMgbGVuZ3RoQnR3KGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIGxfdmVjLmxlbmd0aFRvKHJfdmVjKTtcbiAgfVxuXG4gIHN0YXRpYyBhbmdsZU9mVmVjdG9ycyhsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIGNvbnN0IG11bHRpcGxpZWRMZW5ndGggPSBsX3ZlYy5sZW5ndGgoKSAqIHJfdmVjLmxlbmd0aCgpO1xuICAgIGlmIChtdWx0aXBsaWVkTGVuZ3RoID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ2xlbmd0aCBvZiBhIHZlY3RvciBpcyAwIScpO1xuICAgIH1cbiAgICBjb25zdCBjb3Nfc2l0YSA9IGxfdmVjLmRvdChyX3ZlYykgLyBtdWx0aXBsaWVkTGVuZ3RoO1xuICAgIGNvbnN0IHNpdGEgPSBNYXRoLmFjb3MoY29zX3NpdGEpO1xuICAgIHJldHVybiBzaXRhO1xuICB9XG5cbiAgc3RhdGljIF96ZXJvKHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkyKFswLCAwXSwgdHlwZSk7XG4gIH1cblxuICBzdGF0aWMgX29uZSh0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5MihbMSwgMV0sIHR5cGUpO1xuICB9XG5cbiAgc3RhdGljIF9kdW1teSh0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZSgpLCB7IHR5cGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogbm9ybWFsaXplKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIF9ub3JtYWxpemUodmVjOiBJVmVjdG9yMiwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCBsZW5ndGggPSB2ZWMubGVuZ3RoKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RpdmlkZSh2ZWMsIGxlbmd0aCwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHZhbHVl77yIc3RhdGljIHZlcnNpb27vvIlcbiAgICovXG4gIHN0YXRpYyBfYWRkKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHggPSBsX3ZlYy5fdlswXSArIHJfdmVjLl92WzBdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsxXSArIHJfdmVjLl92WzFdO1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5MihbeCwgeV0sIHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCB2YWx1Ze+8iHN0YXRpYyB2ZXJzaW9u77yJXG4gICAqL1xuICBzdGF0aWMgYWRkVG8obF92ZWM6IElWZWN0b3IyLCByX3ZlYzogSVZlY3RvcjIsIG91dDogSU11dGFibGVWZWN0b3IyKSB7XG4gICAgb3V0Ll92WzBdID0gbF92ZWMuX3ZbMF0gKyByX3ZlYy5fdlswXTtcbiAgICBvdXQuX3ZbMV0gPSBsX3ZlYy5fdlsxXSArIHJfdmVjLl92WzFdO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogc3VidHJhY3QgdmFsdWUoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX3N1YnRyYWN0KGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHggPSBsX3ZlYy5fdlswXSAtIHJfdmVjLl92WzBdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsxXSAtIHJfdmVjLl92WzFdO1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5MihbeCwgeV0sIHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN1YnRyYWN0IHZhbHVlKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIHN1YnRyYWN0VG8obF92ZWM6IElWZWN0b3IyLCByX3ZlYzogSVZlY3RvcjIsIG91dDogSU11dGFibGVWZWN0b3IyKSB7XG4gICAgb3V0Ll92WzBdID0gbF92ZWMuX3ZbMF0gLSByX3ZlYy5fdlswXTtcbiAgICBvdXQuX3ZbMV0gPSBsX3ZlYy5fdlsxXSAtIHJfdmVjLl92WzFdO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgdmFsdWUoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX211bHRpcGx5KHZlYzogSVZlY3RvcjIsIHZhbHVlOiBudW1iZXIsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeCA9IHZlYy5fdlswXSAqIHZhbHVlO1xuICAgIGNvbnN0IHkgPSB2ZWMuX3ZbMV0gKiB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUNvcHlBcnJheTIoW3gsIHldLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB2YWx1ZShzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseVRvKHZlYzogSVZlY3RvcjIsIHZhbHVlOiBudW1iZXIsIG91dDogSU11dGFibGVWZWN0b3IyKSB7XG4gICAgb3V0Ll92WzBdID0gdmVjLl92WzBdICogdmFsdWU7XG4gICAgb3V0Ll92WzFdID0gdmVjLl92WzFdICogdmFsdWU7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB2ZWN0b3Ioc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX211bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHggPSBsX3ZlYy5fdlswXSAqIHJfdmVjLl92WzBdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsxXSAqIHJfdmVjLl92WzFdO1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5MihbeCwgeV0sIHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5IHZlY3RvcihzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseVZlY3RvclRvKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyLCBvdXQ6IElNdXRhYmxlVmVjdG9yMikge1xuICAgIG91dC5fdlswXSA9IGxfdmVjLl92WzBdICogcl92ZWMuX3ZbMF07XG4gICAgb3V0Ll92WzFdID0gbF92ZWMuX3ZbMV0gKiByX3ZlYy5fdlsxXTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSBieSB2YWx1ZShzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBfZGl2aWRlKHZlYzogSVZlY3RvcjIsIHZhbHVlOiBudW1iZXIsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgbGV0IHg7XG4gICAgbGV0IHk7XG4gICAgaWYgKHZhbHVlICE9PSAwKSB7XG4gICAgICB4ID0gdmVjLl92WzBdIC8gdmFsdWU7XG4gICAgICB5ID0gdmVjLl92WzFdIC8gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHggPSBJbmZpbml0eTtcbiAgICAgIHkgPSBJbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkyKFt4LCB5XSwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogZGl2aWRlIGJ5IHZhbHVlKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIGRpdmlkZVRvKHZlYzogSVZlY3RvcjIsIHZhbHVlOiBudW1iZXIsIG91dDogSU11dGFibGVWZWN0b3IyKSB7XG4gICAgaWYgKHZhbHVlICE9PSAwKSB7XG4gICAgICBvdXQuX3ZbMF0gPSB2ZWMuX3ZbMF0gLyB2YWx1ZTtcbiAgICAgIG91dC5fdlsxXSA9IHZlYy5fdlsxXSAvIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICBvdXQuX3ZbMF0gPSBJbmZpbml0eTtcbiAgICAgIG91dC5fdlsxXSA9IEluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSBieSB2ZWN0b3Ioc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX2RpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMiwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBsZXQgeDtcbiAgICBsZXQgeTtcbiAgICBpZiAocl92ZWMuX3ZbMF0gIT09IDAgJiYgcl92ZWMuX3ZbMV0gIT09IDApIHtcbiAgICAgIHggPSBsX3ZlYy5fdlswXSAvIHJfdmVjLl92WzBdO1xuICAgICAgeSA9IGxfdmVjLl92WzFdIC8gcl92ZWMuX3ZbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHggPSByX3ZlYy5fdlswXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMF0gLyByX3ZlYy5fdlswXTtcbiAgICAgIHkgPSByX3ZlYy5fdlsxXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMV0gLyByX3ZlYy5fdlsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkyKFt4LCB5XSwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogZGl2aWRlIGJ5IHZlY3RvcihzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBkaXZpZGVWZWN0b3JUbyhsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMiwgb3V0OiBJTXV0YWJsZVZlY3RvcjIpIHtcbiAgICBpZiAocl92ZWMuX3ZbMF0gIT09IDAgJiYgcl92ZWMuX3ZbMV0gIT09IDApIHtcbiAgICAgIG91dC5fdlswXSA9IGxfdmVjLl92WzBdIC8gcl92ZWMuX3ZbMF07XG4gICAgICBvdXQuX3ZbMV0gPSBsX3ZlYy5fdlsxXSAvIHJfdmVjLl92WzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICBvdXQuX3ZbMF0gPSByX3ZlYy5fdlswXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMF0gLyByX3ZlYy5fdlswXTtcbiAgICAgIG91dC5fdlsxXSA9IHJfdmVjLl92WzFdID09PSAwID8gSW5maW5pdHkgOiBsX3ZlYy5fdlsxXSAvIHJfdmVjLl92WzFdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIGRvdCBwcm9kdWN0KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIGRvdChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBsX3ZlYy5kb3Qocl92ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoYW5nZSB0byBzdHJpbmdcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnKCcgKyB0aGlzLl92WzBdICsgJywgJyArIHRoaXMuX3ZbMV0gKyAnKSc7XG4gIH1cblxuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKSB7XG4gICAgcmV0dXJuIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzBdKSArICcgJyArIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzFdKSArICdcXG4nO1xuICB9XG5cbiAgZmxhdHRlbkFzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFt0aGlzLl92WzBdLCB0aGlzLl92WzFdXTtcbiAgfVxuXG4gIGlzRHVtbXkoKSB7XG4gICAgaWYgKHRoaXMuX3YubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzRXF1YWwodmVjOiBJVmVjdG9yMiwgZGVsdGE6IG51bWJlciA9IE51bWJlci5FUFNJTE9OKSB7XG4gICAgaWYgKE1hdGguYWJzKHZlYy5fdlswXSAtIHRoaXMuX3ZbMF0pIDwgZGVsdGEgJiYgTWF0aC5hYnModmVjLl92WzFdIC0gdGhpcy5fdlsxXSkgPCBkZWx0YSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1N0cmljdEVxdWFsKHZlYzogSVZlY3RvcjIpIHtcbiAgICBpZiAodGhpcy5fdlswXSA9PT0gdmVjLl92WzBdICYmIHRoaXMuX3ZbMV0gPT09IHZlYy5fdlsxXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhdChpOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdltpXTtcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5oeXBvdCh0aGlzLl92WzBdLCB0aGlzLl92WzFdKTtcbiAgfVxuXG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXSAqKiAyICsgdGhpcy5fdlsxXSAqKiAyO1xuICB9XG5cbiAgbGVuZ3RoVG8odmVjOiBJVmVjdG9yMikge1xuICAgIGNvbnN0IGRlbHRhWCA9IHRoaXMuX3ZbMF0gLSB2ZWMuX3ZbMF07XG4gICAgY29uc3QgZGVsdGFZID0gdGhpcy5fdlsxXSAtIHZlYy5fdlsxXTtcbiAgICByZXR1cm4gTWF0aC5oeXBvdChkZWx0YVgsIGRlbHRhWSk7XG4gIH1cblxuICAvKipcbiAgICogZG90IHByb2R1Y3RcbiAgICovXG4gIGRvdCh2ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzFdICogdmVjLl92WzFdO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpKFxuICAgICAgbmV3ICh0aGlzLl92LmNvbnN0cnVjdG9yIGFzIGFueSkoW3RoaXMuX3ZbMF0sIHRoaXMuX3ZbMV1dKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21Db3B5QXJyYXkyKGFycmF5OiBBcnJheTI8bnVtYmVyPiwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoYXJyYXkpLCB7IHR5cGUgfSk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21Db3B5Mih4OiBudW1iZXIsIHk6IG51bWJlciwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoW3gsIHldKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weUFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+LCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShhcnJheS5zbGljZSgwLCAyKSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbVZlY3RvcjIodmVjMjogSVZlY3RvcjIsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgdmVjID0gbmV3IHRoaXMobmV3IHR5cGUodmVjMi5fdiksIHtcbiAgICAgIHR5cGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHZlYztcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUNvcHlWZWN0b3IyKHZlYzI6IElWZWN0b3IyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHZlYyA9IG5ldyB0aGlzKG5ldyB0eXBlKFt2ZWMyLl92WzBdLCB2ZWMyLl92WzFdXSksIHtcbiAgICAgIHR5cGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHZlYztcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUNvcHlWZWN0b3IzKHZlYzM6IElWZWN0b3IzLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHZlYyA9IG5ldyB0aGlzKG5ldyB0eXBlKFt2ZWMzLl92WzBdLCB2ZWMzLl92WzFdLCB2ZWMzLl92WzJdXSksIHtcbiAgICAgIHR5cGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHZlYztcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUNvcHlWZWN0b3I0KHZlYzQ6IElWZWN0b3I0LCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHZlYyA9IG5ldyB0aGlzKG5ldyB0eXBlKFt2ZWM0Ll92WzBdLCB2ZWM0Ll92WzFdLCB2ZWM0Ll92WzJdXSksIHtcbiAgICAgIHR5cGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHZlYztcbiAgfVxuXG4gIGdldCBieXRlc1BlckNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdi5CWVRFU19QRVJfRUxFTUVOVDtcbiAgfVxufVxuXG4vKipcbiAqIEltbXV0YWJsZSAyRCh4LHkpIFZlY3RvciBjbGFzcyB3aXRoIDMyYml0IGZsb2F0IGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjIgZXh0ZW5kcyBWZWN0b3IyXzxGbG9hdDMyQXJyYXlDb25zdHJ1Y3Rvcj4gaW1wbGVtZW50cyBJVmVjdG9yLCBJVmVjdG9yMiB7XG4gIGNvbnN0cnVjdG9yKHg6IFR5cGVkQXJyYXkpIHtcbiAgICBzdXBlcih4LCB7IHR5cGU6IEZsb2F0MzJBcnJheSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5MihhcnJheTogQXJyYXkyPG51bWJlcj4pOiBWZWN0b3IyIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5QXJyYXkyKGFycmF5LCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5Mih4OiBudW1iZXIsIHk6IG51bWJlcik6IFZlY3RvcjIge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHkyKHgsIHksIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXk8bnVtYmVyPik6IFZlY3RvcjIge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHlBcnJheShhcnJheSwgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVZlY3RvcjIodmVjMjogSVZlY3RvcjIpOiBWZWN0b3IyIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5VmVjdG9yMih2ZWMyLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5VmVjdG9yNCh2ZWM0OiBJVmVjdG9yNCk6IFZlY3RvcjIge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHlWZWN0b3I0KHZlYzQsIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gc3VwZXIuX3plcm8oRmxvYXQzMkFycmF5KSBhcyBWZWN0b3IyO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDMyQXJyYXkpIGFzIFZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIFZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgbm9ybWFsaXplKHZlYzogSVZlY3RvcjIpIHtcbiAgICByZXR1cm4gc3VwZXIuX25vcm1hbGl6ZSh2ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yMjtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3IyLCByX3ZlYzogSVZlY3RvcjIpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yMjtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIFZlY3RvcjI7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHkodmVjOiBJVmVjdG9yMiwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHkodmVjLCB2YWx1ZSwgRmxvYXQzMkFycmF5KSBhcyBWZWN0b3IyO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yMjtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMiwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yMjtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGVWZWN0b3IobF92ZWM6IElWZWN0b3IyLCByX3ZlYzogSVZlY3RvcjIpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yMjtcbiAgfVxuXG4gIGdldCBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdWZWN0b3IyJztcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIFZlY3RvcjI7XG4gIH1cbn1cblxuLyoqXG4gKiBJbW11dGFibGUgMkQoeCx5KSBWZWN0b3IgY2xhc3Mgd2l0aCA2NGJpdCBmbG9hdCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3IyZCBleHRlbmRzIFZlY3RvcjJfPEZsb2F0NjRBcnJheUNvbnN0cnVjdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHg6IFR5cGVkQXJyYXkpIHtcbiAgICBzdXBlcih4LCB7IHR5cGU6IEZsb2F0NjRBcnJheSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5MihhcnJheTogQXJyYXkyPG51bWJlcj4pOiBWZWN0b3IyZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weUFycmF5MihhcnJheSwgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weTIoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBWZWN0b3IyZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weTIoeCwgeSwgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+KTogVmVjdG9yMmQge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHlBcnJheShhcnJheSwgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKTogVmVjdG9yMmQge1xuICAgIHJldHVybiBuZXcgVmVjdG9yMmQobmV3IEZsb2F0NjRBcnJheShhcnJheUJ1ZmZlcikpO1xuICB9XG5cbiAgc3RhdGljIGZyb21GbG9hdDY0QXJyYXkoZmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXkpOiBWZWN0b3IyZCB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyZChmbG9hdDY0QXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIHplcm8oKSB7XG4gICAgcmV0dXJuIHN1cGVyLl96ZXJvKEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yMmQ7XG4gIH1cblxuICBzdGF0aWMgb25lKCkge1xuICAgIHJldHVybiBzdXBlci5fb25lKEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yMmQ7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjJkO1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZSh2ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9ub3JtYWxpemUodmVjLCBGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjJkO1xuICB9XG5cbiAgc3RhdGljIGFkZChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fYWRkKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjIsIHJfdmVjOiBJVmVjdG9yMikge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjJkO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5KHZlYzogSVZlY3RvcjIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5KHZlYywgdmFsdWUsIEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yMmQ7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlWZWN0b3IobF92ZWM6IElWZWN0b3IyLCByX3ZlYzogSVZlY3RvcjIpIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5VmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBWZWN0b3IyZDtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMiwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yMmQ7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlVmVjdG9yKGxfdmVjOiBJVmVjdG9yMiwgcl92ZWM6IElWZWN0b3IyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kaXZpZGVWZWN0b3IobF92ZWMsIHJfdmVjLCBGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjJkO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNsb25lKCkgYXMgVmVjdG9yMmQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVmVjdG9yMmYgPSBWZWN0b3IyO1xuZXhwb3J0IGNvbnN0IENvbnN0VmVjdG9yMl8xXzEgPSBWZWN0b3IyLmZyb21Db3B5MigxLCAxKTtcbmV4cG9ydCBjb25zdCBDb25zdFZlY3RvcjJfMF8wID0gVmVjdG9yMi5mcm9tQ29weTIoMCwgMCk7XG4iLCJpbXBvcnQgeyBJVmVjdG9yMiwgSVZlY3RvcjMsIElWZWN0b3I0LCBJVmVjdG9yLCBJTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgTWF0aFV0aWwgfSBmcm9tICcuL01hdGhVdGlsJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiB9IGZyb20gJy4vSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RWZWN0b3IgfSBmcm9tICcuL0Fic3RyYWN0VmVjdG9yJztcbmltcG9ydCB7IEFycmF5MywgRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IsIFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3IzXzxUIGV4dGVuZHMgRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3I+XG4gIGV4dGVuZHMgQWJzdHJhY3RWZWN0b3JcbiAgaW1wbGVtZW50cyBJVmVjdG9yLCBJVmVjdG9yM1xue1xuICBjb25zdHJ1Y3Rvcih2OiBUeXBlZEFycmF5LCB7IHR5cGUgfTogeyB0eXBlOiBUIH0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3YgPSB2O1xuICB9XG5cbiAgZ2V0IHgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF07XG4gIH1cblxuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIGdldCB6KCkge1xuICAgIHJldHVybiB0aGlzLl92WzJdO1xuICB9XG5cbiAgZ2V0IHcoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBnZXQgZ2xzbFN0ckFzRmxvYXQoKSB7XG4gICAgcmV0dXJuIGB2ZWMzKCR7TWF0aFV0aWwuY29udmVydFRvU3RyaW5nQXNHTFNMRmxvYXQoXG4gICAgICB0aGlzLl92WzBdXG4gICAgKX0sICR7TWF0aFV0aWwuY29udmVydFRvU3RyaW5nQXNHTFNMRmxvYXQodGhpcy5fdlsxXSl9LCAke01hdGhVdGlsLmNvbnZlcnRUb1N0cmluZ0FzR0xTTEZsb2F0KFxuICAgICAgdGhpcy5fdlsyXVxuICAgICl9KWA7XG4gIH1cblxuICBnZXQgZ2xzbFN0ckFzSW50KCkge1xuICAgIHJldHVybiBgaXZlYzMoJHtNYXRoLmZsb29yKHRoaXMuX3ZbMF0pfSwgJHtNYXRoLmZsb29yKHRoaXMuX3ZbMV0pfSwgJHtNYXRoLmZsb29yKHRoaXMuX3ZbMl0pfSlgO1xuICB9XG5cbiAgc3RhdGljIGdldCBjb21wb3NpdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5WZWMzO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvIHNxdWFyZSBsZW5ndGgoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgbGVuZ3RoU3F1YXJlZCh2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHZlYy5sZW5ndGhTcXVhcmVkKCk7XG4gIH1cblxuICBzdGF0aWMgbGVuZ3RoQnR3KGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIGxfdmVjLmxlbmd0aFRvKHJfdmVjKTtcbiAgfVxuXG4gIHN0YXRpYyBhbmdsZU9mVmVjdG9ycyhsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMykge1xuICAgIGNvbnN0IG11bHRpcGxpZWRMZW5ndGggPSBsX3ZlYy5sZW5ndGgoKSAqIHJfdmVjLmxlbmd0aCgpO1xuICAgIGlmIChtdWx0aXBsaWVkTGVuZ3RoID09PSAwKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ2xlbmd0aCBvZiBhIHZlY3RvciBpcyAwIScpO1xuICAgIH1cbiAgICBjb25zdCBjb3Nfc2l0YSA9IGxfdmVjLmRvdChyX3ZlYykgLyBtdWx0aXBsaWVkTGVuZ3RoO1xuICAgIGNvbnN0IHNpdGEgPSBNYXRoLmFjb3MoY29zX3NpdGEpO1xuICAgIHJldHVybiBzaXRhO1xuICB9XG5cbiAgc3RhdGljIF96ZXJvKHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkoWzAsIDAsIDBdLCB0eXBlKTtcbiAgfVxuXG4gIHN0YXRpYyBfb25lKHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkoWzEsIDEsIDFdLCB0eXBlKTtcbiAgfVxuXG4gIHN0YXRpYyBfZHVtbXkodHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoW10pLCB7IHR5cGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogbm9ybWFsaXplKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIF9ub3JtYWxpemUodmVjOiBJVmVjdG9yMywgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCBsZW5ndGggPSB2ZWMubGVuZ3RoKCk7XG4gICAgcmV0dXJuIHRoaXMuX2RpdmlkZSh2ZWMsIGxlbmd0aCwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogbm9ybWFsaXplKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVRvKHZlYzogSVZlY3RvcjMsIG91dDogSU11dGFibGVWZWN0b3IzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gdmVjLmxlbmd0aCgpO1xuICAgIHRoaXMuZGl2aWRlVG8odmVjLCBsZW5ndGgsIG91dCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdmFsdWXvvIhzdGF0aWMgdmVyc2lvbu+8iVxuICAgKi9cbiAgc3RhdGljIF9hZGQobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeCA9IGxfdmVjLl92WzBdICsgcl92ZWMuX3ZbMF07XG4gICAgY29uc3QgeSA9IGxfdmVjLl92WzFdICsgcl92ZWMuX3ZbMV07XG4gICAgY29uc3QgeiA9IGxfdmVjLl92WzJdICsgcl92ZWMuX3ZbMl07XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkoW3gsIHksIHpdLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdmFsdWXvvIhzdGF0aWMgdmVyc2lvbu+8iVxuICAgKi9cbiAgc3RhdGljIGFkZFRvKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzLCBvdXQ6IElNdXRhYmxlVmVjdG9yMykge1xuICAgIG91dC5fdlswXSA9IGxfdmVjLl92WzBdICsgcl92ZWMuX3ZbMF07XG4gICAgb3V0Ll92WzFdID0gbF92ZWMuX3ZbMV0gKyByX3ZlYy5fdlsxXTtcbiAgICBvdXQuX3ZbMl0gPSBsX3ZlYy5fdlsyXSArIHJfdmVjLl92WzJdO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogc3VidHJhY3Qoc3VidHJhY3QpXG4gICAqL1xuICBzdGF0aWMgX3N1YnRyYWN0KGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHggPSBsX3ZlYy5fdlswXSAtIHJfdmVjLl92WzBdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsxXSAtIHJfdmVjLl92WzFdO1xuICAgIGNvbnN0IHogPSBsX3ZlYy5fdlsyXSAtIHJfdmVjLl92WzJdO1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5KFt4LCB5LCB6XSwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogc3VidHJhY3Qoc3VidHJhY3QpXG4gICAqL1xuICBzdGF0aWMgc3VidHJhY3RUbyhsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMywgb3V0OiBJTXV0YWJsZVZlY3RvcjMpIHtcbiAgICBvdXQuX3ZbMF0gPSBsX3ZlYy5fdlswXSAtIHJfdmVjLl92WzBdO1xuICAgIG91dC5fdlsxXSA9IGxfdmVjLl92WzFdIC0gcl92ZWMuX3ZbMV07XG4gICAgb3V0Ll92WzJdID0gbF92ZWMuX3ZbMl0gLSByX3ZlYy5fdlsyXTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIF9tdWx0aXBseSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHggPSB2ZWMuX3ZbMF0gKiB2YWx1ZTtcbiAgICBjb25zdCB5ID0gdmVjLl92WzFdICogdmFsdWU7XG4gICAgY29uc3QgeiA9IHZlYy5fdlsyXSAqIHZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5KFt4LCB5LCB6XSwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHlUbyhzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBtdWx0aXBseVRvKHZlYzogSVZlY3RvcjMsIHZhbHVlOiBudW1iZXIsIG91dDogSU11dGFibGVWZWN0b3IzKSB7XG4gICAgb3V0Ll92WzBdID0gdmVjLl92WzBdICogdmFsdWU7XG4gICAgb3V0Ll92WzFdID0gdmVjLl92WzFdICogdmFsdWU7XG4gICAgb3V0Ll92WzJdID0gdmVjLl92WzJdICogdmFsdWU7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB2ZWN0b3Ioc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX211bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHggPSBsX3ZlYy5fdlswXSAqIHJfdmVjLl92WzBdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsxXSAqIHJfdmVjLl92WzFdO1xuICAgIGNvbnN0IHogPSBsX3ZlYy5fdlsyXSAqIHJfdmVjLl92WzJdO1xuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5KFt4LCB5LCB6XSwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogbXVsdGlwbHkgdmVjdG9yKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yVG8obF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMsIG91dDogSU11dGFibGVWZWN0b3IzKSB7XG4gICAgb3V0Ll92WzBdID0gbF92ZWMuX3ZbMF0gKiByX3ZlYy5fdlswXTtcbiAgICBvdXQuX3ZbMV0gPSBsX3ZlYy5fdlsxXSAqIHJfdmVjLl92WzFdO1xuICAgIG91dC5fdlsyXSA9IGxfdmVjLl92WzJdICogcl92ZWMuX3ZbMl07XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaXZpZGUoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX2RpdmlkZSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGxldCB4O1xuICAgIGxldCB5O1xuICAgIGxldCB6O1xuICAgIGlmICh2YWx1ZSAhPT0gMCkge1xuICAgICAgeCA9IHZlYy5fdlswXSAvIHZhbHVlO1xuICAgICAgeSA9IHZlYy5fdlsxXSAvIHZhbHVlO1xuICAgICAgeiA9IHZlYy5fdlsyXSAvIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICB4ID0gSW5maW5pdHk7XG4gICAgICB5ID0gSW5maW5pdHk7XG4gICAgICB6ID0gSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mcm9tQ29weUFycmF5KFt4LCB5LCB6XSwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogZGl2aWRlIGJ5IHZhbHVlKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIGRpdmlkZVRvKHZlYzogSVZlY3RvcjMsIHZhbHVlOiBudW1iZXIsIG91dDogSU11dGFibGVWZWN0b3IzKSB7XG4gICAgaWYgKHZhbHVlICE9PSAwKSB7XG4gICAgICBvdXQuX3ZbMF0gPSB2ZWMuX3ZbMF0gLyB2YWx1ZTtcbiAgICAgIG91dC5fdlsxXSA9IHZlYy5fdlsxXSAvIHZhbHVlO1xuICAgICAgb3V0Ll92WzJdID0gdmVjLl92WzJdIC8gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIG91dC5fdlswXSA9IEluZmluaXR5O1xuICAgICAgb3V0Ll92WzFdID0gSW5maW5pdHk7XG4gICAgICBvdXQuX3ZbMl0gPSBJbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaXZpZGUgdmVjdG9yKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIF9kaXZpZGVWZWN0b3IobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgbGV0IHg7XG4gICAgbGV0IHk7XG4gICAgbGV0IHo7XG4gICAgaWYgKHJfdmVjLl92WzBdICE9PSAwICYmIHJfdmVjLl92WzFdICE9PSAwICYmIHJfdmVjLl92WzJdICE9PSAwKSB7XG4gICAgICB4ID0gbF92ZWMuX3ZbMF0gLyByX3ZlYy5fdlswXTtcbiAgICAgIHkgPSBsX3ZlYy5fdlsxXSAvIHJfdmVjLl92WzFdO1xuICAgICAgeiA9IGxfdmVjLl92WzJdIC8gcl92ZWMuX3ZbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIHggPSByX3ZlYy5fdlswXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMF0gLyByX3ZlYy5fdlswXTtcbiAgICAgIHkgPSByX3ZlYy5fdlsxXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMV0gLyByX3ZlYy5fdlsxXTtcbiAgICAgIHogPSByX3ZlYy5fdlsyXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMl0gLyByX3ZlYy5fdlsyXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkoW3gsIHksIHpdLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaXZpZGUgYnkgdmVjdG9yKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIGRpdmlkZVZlY3RvclRvKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzLCBvdXQ6IElNdXRhYmxlVmVjdG9yMykge1xuICAgIGlmIChyX3ZlYy5fdlswXSAhPT0gMCAmJiByX3ZlYy5fdlsxXSAhPT0gMCAmJiByX3ZlYy5fdlsyXSAhPT0gMCkge1xuICAgICAgb3V0Ll92WzBdID0gbF92ZWMuX3ZbMF0gLyByX3ZlYy5fdlswXTtcbiAgICAgIG91dC5fdlsxXSA9IGxfdmVjLl92WzFdIC8gcl92ZWMuX3ZbMV07XG4gICAgICBvdXQuX3ZbMl0gPSBsX3ZlYy5fdlsyXSAvIHJfdmVjLl92WzJdO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICBvdXQuX3ZbMF0gPSByX3ZlYy5fdlswXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMF0gLyByX3ZlYy5fdlswXTtcbiAgICAgIG91dC5fdlsxXSA9IHJfdmVjLl92WzFdID09PSAwID8gSW5maW5pdHkgOiBsX3ZlYy5fdlsxXSAvIHJfdmVjLl92WzFdO1xuICAgICAgb3V0Ll92WzJdID0gcl92ZWMuX3ZbMl0gPT09IDAgPyBJbmZpbml0eSA6IGxfdmVjLl92WzJdIC8gcl92ZWMuX3ZbMl07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogZG90IHByb2R1Y3Qoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgZG90KGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIGxfdmVjLmRvdChyX3ZlYyk7XG4gIH1cblxuICAvKipcbiAgICogY3Jvc3MgcHJvZHVjdChzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBfY3Jvc3MobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeCA9IGxfdmVjLl92WzFdICogcl92ZWMuX3ZbMl0gLSBsX3ZlYy5fdlsyXSAqIHJfdmVjLl92WzFdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsyXSAqIHJfdmVjLl92WzBdIC0gbF92ZWMuX3ZbMF0gKiByX3ZlYy5fdlsyXTtcbiAgICBjb25zdCB6ID0gbF92ZWMuX3ZbMF0gKiByX3ZlYy5fdlsxXSAtIGxfdmVjLl92WzFdICogcl92ZWMuX3ZbMF07XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkoW3gsIHksIHpdLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcm9zcyBwcm9kdWN0KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIGNyb3NzVG8obF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMsIG91dDogSU11dGFibGVWZWN0b3IzKSB7XG4gICAgY29uc3QgeCA9IGxfdmVjLl92WzFdICogcl92ZWMuX3ZbMl0gLSBsX3ZlYy5fdlsyXSAqIHJfdmVjLl92WzFdO1xuICAgIGNvbnN0IHkgPSBsX3ZlYy5fdlsyXSAqIHJfdmVjLl92WzBdIC0gbF92ZWMuX3ZbMF0gKiByX3ZlYy5fdlsyXTtcbiAgICBjb25zdCB6ID0gbF92ZWMuX3ZbMF0gKiByX3ZlYy5fdlsxXSAtIGxfdmVjLl92WzFdICogcl92ZWMuX3ZbMF07XG4gICAgcmV0dXJuIG91dC5zZXRDb21wb25lbnRzKHgsIHksIHopO1xuICB9XG5cbiAgLyoqXG4gICAqIHF1YXRlcm5pb24gKiB2ZWN0b3IzXG4gICAqL1xuICBzdGF0aWMgX211bHRpcGx5UXVhdGVybmlvbihxdWF0OiBJUXVhdGVybmlvbiwgdmVjOiBJVmVjdG9yMywgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCBudW0gPSBxdWF0Ll92WzBdICogMjtcbiAgICBjb25zdCBudW0yID0gcXVhdC5fdlsxXSAqIDI7XG4gICAgY29uc3QgbnVtMyA9IHF1YXQuX3ZbMl0gKiAyO1xuICAgIGNvbnN0IG51bTQgPSBxdWF0Ll92WzBdICogbnVtO1xuICAgIGNvbnN0IG51bTUgPSBxdWF0Ll92WzFdICogbnVtMjtcbiAgICBjb25zdCBudW02ID0gcXVhdC5fdlsyXSAqIG51bTM7XG4gICAgY29uc3QgbnVtNyA9IHF1YXQuX3ZbMF0gKiBudW0yO1xuICAgIGNvbnN0IG51bTggPSBxdWF0Ll92WzBdICogbnVtMztcbiAgICBjb25zdCBudW05ID0gcXVhdC5fdlsxXSAqIG51bTM7XG4gICAgY29uc3QgbnVtMTAgPSBxdWF0Ll92WzNdICogbnVtO1xuICAgIGNvbnN0IG51bTExID0gcXVhdC5fdlszXSAqIG51bTI7XG4gICAgY29uc3QgbnVtMTIgPSBxdWF0Ll92WzNdICogbnVtMztcblxuICAgIGNvbnN0IHggPVxuICAgICAgKDEgLSAobnVtNSArIG51bTYpKSAqIHZlYy5fdlswXSArIChudW03IC0gbnVtMTIpICogdmVjLl92WzFdICsgKG51bTggKyBudW0xMSkgKiB2ZWMuX3ZbMl07XG4gICAgY29uc3QgeSA9XG4gICAgICAobnVtNyArIG51bTEyKSAqIHZlYy5fdlswXSArICgxIC0gKG51bTQgKyBudW02KSkgKiB2ZWMuX3ZbMV0gKyAobnVtOSAtIG51bTEwKSAqIHZlYy5fdlsyXTtcbiAgICBjb25zdCB6ID1cbiAgICAgIChudW04IC0gbnVtMTEpICogdmVjLl92WzBdICsgKG51bTkgKyBudW0xMCkgKiB2ZWMuX3ZbMV0gKyAoMSAtIChudW00ICsgbnVtNSkpICogdmVjLl92WzJdO1xuXG4gICAgcmV0dXJuIHRoaXMuX2Zyb21Db3B5QXJyYXkoW3gsIHksIHpdLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBxdWF0ZXJuaW9uICogdmVjdG9yM1xuICAgKi9cbiAgc3RhdGljIG11bHRpcGx5UXVhdGVybmlvblRvKHF1YXQ6IElRdWF0ZXJuaW9uLCB2ZWM6IElWZWN0b3IzLCBvdXQ6IElNdXRhYmxlVmVjdG9yMykge1xuICAgIGNvbnN0IG51bSA9IHF1YXQuX3ZbMF0gKiAyO1xuICAgIGNvbnN0IG51bTIgPSBxdWF0Ll92WzFdICogMjtcbiAgICBjb25zdCBudW0zID0gcXVhdC5fdlsyXSAqIDI7XG4gICAgY29uc3QgbnVtNCA9IHF1YXQuX3ZbMF0gKiBudW07XG4gICAgY29uc3QgbnVtNSA9IHF1YXQuX3ZbMV0gKiBudW0yO1xuICAgIGNvbnN0IG51bTYgPSBxdWF0Ll92WzJdICogbnVtMztcbiAgICBjb25zdCBudW03ID0gcXVhdC5fdlswXSAqIG51bTI7XG4gICAgY29uc3QgbnVtOCA9IHF1YXQuX3ZbMF0gKiBudW0zO1xuICAgIGNvbnN0IG51bTkgPSBxdWF0Ll92WzFdICogbnVtMztcbiAgICBjb25zdCBudW0xMCA9IHF1YXQuX3ZbM10gKiBudW07XG4gICAgY29uc3QgbnVtMTEgPSBxdWF0Ll92WzNdICogbnVtMjtcbiAgICBjb25zdCBudW0xMiA9IHF1YXQuX3ZbM10gKiBudW0zO1xuXG4gICAgY29uc3QgeCA9XG4gICAgICAoMSAtIChudW01ICsgbnVtNikpICogdmVjLl92WzBdICsgKG51bTcgLSBudW0xMikgKiB2ZWMuX3ZbMV0gKyAobnVtOCArIG51bTExKSAqIHZlYy5fdlsyXTtcbiAgICBjb25zdCB5ID1cbiAgICAgIChudW03ICsgbnVtMTIpICogdmVjLl92WzBdICsgKDEgLSAobnVtNCArIG51bTYpKSAqIHZlYy5fdlsxXSArIChudW05IC0gbnVtMTApICogdmVjLl92WzJdO1xuICAgIGNvbnN0IHogPVxuICAgICAgKG51bTggLSBudW0xMSkgKiB2ZWMuX3ZbMF0gKyAobnVtOSArIG51bTEwKSAqIHZlYy5fdlsxXSArICgxIC0gKG51bTQgKyBudW01KSkgKiB2ZWMuX3ZbMl07XG5cbiAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoeCwgeSwgeik7XG4gIH1cblxuICAvKipcbiAgICogY2hhbmdlIHRvIHN0cmluZ1xuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICcoJyArIHRoaXMuX3ZbMF0gKyAnLCAnICsgdGhpcy5fdlsxXSArICcsICcgKyB0aGlzLl92WzJdICsgJyknO1xuICB9XG5cbiAgdG9TdHJpbmdBcHByb3hpbWF0ZWx5KCkge1xuICAgIHJldHVybiAoXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlswXSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzFdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMl0pICtcbiAgICAgICdcXG4nXG4gICAgKTtcbiAgfVxuXG4gIGZsYXR0ZW5Bc0FycmF5KCkge1xuICAgIHJldHVybiBbdGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXV07XG4gIH1cblxuICBpc0R1bW15KCkge1xuICAgIGlmICh0aGlzLl92Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc0VxdWFsKHZlYzogSVZlY3RvcjMsIGRlbHRhOiBudW1iZXIgPSBOdW1iZXIuRVBTSUxPTikge1xuICAgIGlmIChcbiAgICAgIE1hdGguYWJzKHZlYy5fdlswXSAtIHRoaXMuX3ZbMF0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKHZlYy5fdlsxXSAtIHRoaXMuX3ZbMV0pIDwgZGVsdGEgJiZcbiAgICAgIE1hdGguYWJzKHZlYy5fdlsyXSAtIHRoaXMuX3ZbMl0pIDwgZGVsdGFcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpY3RFcXVhbCh2ZWM6IElWZWN0b3IzKSB7XG4gICAgaWYgKHRoaXMuX3ZbMF0gPT09IHZlYy5fdlswXSAmJiB0aGlzLl92WzFdID09PSB2ZWMuX3ZbMV0gJiYgdGhpcy5fdlsyXSA9PT0gdmVjLl92WzJdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGF0KGk6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLl92W2ldO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiBNYXRoLmh5cG90KHRoaXMuX3ZbMF0sIHRoaXMuX3ZbMV0sIHRoaXMuX3ZbMl0pO1xuICB9XG5cbiAgbGVuZ3RoU3F1YXJlZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92WzBdICoqIDIgKyB0aGlzLl92WzFdICoqIDIgKyB0aGlzLl92WzJdICoqIDI7XG4gIH1cblxuICBsZW5ndGhUbyh2ZWM6IElWZWN0b3IzKSB7XG4gICAgY29uc3QgZGVsdGFYID0gdGhpcy5fdlswXSAtIHZlYy5fdlswXTtcbiAgICBjb25zdCBkZWx0YVkgPSB0aGlzLl92WzFdIC0gdmVjLl92WzFdO1xuICAgIGNvbnN0IGRlbHRhWiA9IHRoaXMuX3ZbMl0gLSB2ZWMuX3ZbMl07XG4gICAgcmV0dXJuIE1hdGguaHlwb3QoZGVsdGFYLCBkZWx0YVksIGRlbHRhWik7XG4gIH1cblxuICAvKipcbiAgICogZG90IHByb2R1Y3RcbiAgICovXG4gIGRvdCh2ZWM6IElWZWN0b3IzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMF0gKiB2ZWMuX3ZbMF0gKyB0aGlzLl92WzFdICogdmVjLl92WzFdICsgdGhpcy5fdlsyXSAqIHZlYy5fdlsyXTtcbiAgfVxuXG4gIGdldCBjbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdWZWN0b3IzJztcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KShcbiAgICAgIG5ldyAodGhpcy5fdi5jb25zdHJ1Y3RvciBhcyBhbnkpKFt0aGlzLl92WzBdLCB0aGlzLl92WzFdLCB0aGlzLl92WzJdXSwgMCwgMClcbiAgICApO1xuICB9XG5cbiAgZ2V0IGJ5dGVzUGVyQ29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLl92LkJZVEVTX1BFUl9FTEVNRU5UO1xuICB9XG5cbiAgc3RhdGljIF9sZXJwKGxoczogSVZlY3RvcjMsIHJoczogSVZlY3RvcjMsIHJhdGlvOiBudW1iZXIsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKFxuICAgICAgbmV3IHR5cGUoW1xuICAgICAgICBsaHMuX3ZbMF0gKiAoMSAtIHJhdGlvKSArIHJocy5fdlswXSAqIHJhdGlvLFxuICAgICAgICBsaHMuX3ZbMV0gKiAoMSAtIHJhdGlvKSArIHJocy5fdlsxXSAqIHJhdGlvLFxuICAgICAgICBsaHMuX3ZbMl0gKiAoMSAtIHJhdGlvKSArIHJocy5fdlsyXSAqIHJhdGlvLFxuICAgICAgXSksXG4gICAgICB7IHR5cGUgfVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21Db3B5QXJyYXkzKGFycmF5OiBBcnJheTM8bnVtYmVyPiwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoYXJyYXkpLCB7IHR5cGUgfSk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21Db3B5Myh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShbeCwgeSwgel0pLCB7IHR5cGUgfSk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21Db3B5QXJyYXkoYXJyYXk6IEFycmF5PG51bWJlcj4sIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyB0eXBlKGFycmF5LnNsaWNlKDAsIDMpKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weVZlY3RvcjModmVjMzogSVZlY3RvcjMsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgdmVjID0gbmV3IHRoaXMobmV3IHR5cGUoW3ZlYzMuX3ZbMF0sIHZlYzMuX3ZbMV0sIHZlYzMuX3ZbMl1dKSwge1xuICAgICAgdHlwZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdmVjO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weVZlY3RvcjQodmVjNDogSVZlY3RvcjQsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgdmVjID0gbmV3IHRoaXMobmV3IHR5cGUoW3ZlYzQuX3ZbMF0sIHZlYzQuX3ZbMV0sIHZlYzQuX3ZbMl1dKSwge1xuICAgICAgdHlwZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdmVjO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tVmVjdG9yMih2ZWMyOiBJVmVjdG9yMiwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCB2ZWMgPSBuZXcgdGhpcyhuZXcgdHlwZShbdmVjMi5fdlswXSwgdmVjMi5fdlsxXSwgMF0pLCB7XG4gICAgICB0eXBlLFxuICAgIH0pO1xuICAgIHJldHVybiB2ZWM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbW11dGFibGUgM0QoeCx5LHopIFZlY3RvciBjbGFzcyB3aXRoIDMyYml0IGZsb2F0IGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjMgZXh0ZW5kcyBWZWN0b3IzXzxGbG9hdDMyQXJyYXlDb25zdHJ1Y3Rvcj4ge1xuICBjb25zdHJ1Y3Rvcih2OiBUeXBlZEFycmF5KSB7XG4gICAgc3VwZXIodiwgeyB0eXBlOiBGbG9hdDMyQXJyYXkgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTMoYXJyYXk6IEFycmF5MzxudW1iZXI+KTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weUFycmF5MyhhcnJheSwgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weTMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHkzKHgsIHksIHosIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHkxKHZhbDogbnVtYmVyKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weTModmFsLCB2YWwsIHZhbCwgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+KTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weUFycmF5KGFycmF5LCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5VmVjdG9yMyh2ZWMzOiBJVmVjdG9yMyk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHlWZWN0b3IzKHZlYzMsIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlWZWN0b3I0KHZlYzQ6IElWZWN0b3I0KTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weVZlY3RvcjQodmVjNCwgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IzKG5ldyBGbG9hdDMyQXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IzKGZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlGbG9hdDMyQXJyYXkoZmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXkpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjMoZmxvYXQzMkFycmF5LnNsaWNlKDApKTtcbiAgfVxuXG4gIHN0YXRpYyB6ZXJvKCk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5femVybyhGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJVmVjdG9yMyk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fbm9ybWFsaXplKHZlYywgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgc3VidHJhY3QobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX3N1YnRyYWN0KGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseSh2ZWMsIHZhbHVlLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKTogVmVjdG9yMyB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlKHZlYzogSVZlY3RvcjMsIHZhbHVlOiBudW1iZXIpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZSh2ZWMsIHZhbHVlLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMyk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlVmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBjcm9zcyhsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMyk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fY3Jvc3MobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5UXVhdGVybmlvbihxdWF0OiBJUXVhdGVybmlvbiwgdmVjOiBJVmVjdG9yMyk6IFZlY3RvcjMge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHlRdWF0ZXJuaW9uKHF1YXQsIHZlYywgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBsZXJwKGxoczogSVZlY3RvcjMsIHJoczogSVZlY3RvcjMsIHJhdGlvOiBudW1iZXIpOiBWZWN0b3IzIHtcbiAgICByZXR1cm4gc3VwZXIuX2xlcnAobGhzLCByaHMsIHJhdGlvLCBGbG9hdDMyQXJyYXkpO1xuICB9XG59XG5cbi8qKlxuICogSW1tdXRhYmxlIDNEKHgseSx6KSBWZWN0b3IgY2xhc3Mgd2l0aCA2NGJpdCBmbG9hdCBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3IzZCBleHRlbmRzIFZlY3RvcjNfPEZsb2F0NjRBcnJheUNvbnN0cnVjdG9yPiB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IodjogVHlwZWRBcnJheSkge1xuICAgIHN1cGVyKHYsIHsgdHlwZTogRmxvYXQ2NEFycmF5IH0pO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkzKGFycmF5OiBBcnJheTM8bnVtYmVyPik6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5QXJyYXkzKGFycmF5LCBGbG9hdDY0QXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5Myh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHkzKHgsIHksIHosIEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHkxKHZhbDogbnVtYmVyKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHkzKHZhbCwgdmFsLCB2YWwsIEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheShhcnJheTogQXJyYXk8bnVtYmVyPik6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5QXJyYXkoYXJyYXksIEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcik6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjNkKG5ldyBGbG9hdDY0QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQ2NEFycmF5KGZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5KTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBuZXcgVmVjdG9yM2QoZmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyB6ZXJvKCk6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX3plcm8oRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBvbmUoKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fb25lKEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJVmVjdG9yMyk6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX25vcm1hbGl6ZSh2ZWMsIEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgYWRkKGxfdmVjOiBJVmVjdG9yMywgcl92ZWM6IElWZWN0b3IzKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fYWRkKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMyk6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX3N1YnRyYWN0KGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseSh2ZWM6IElWZWN0b3IzLCB2YWx1ZTogbnVtYmVyKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHkodmVjLCB2YWx1ZSwgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseVZlY3RvcihsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMyk6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX211bHRpcGx5VmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yMywgdmFsdWU6IG51bWJlcik6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZSh2ZWMsIHZhbHVlLCBGbG9hdDY0QXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjMsIHJfdmVjOiBJVmVjdG9yMyk6IFZlY3RvcjNkIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgY3Jvc3MobF92ZWM6IElWZWN0b3IzLCByX3ZlYzogSVZlY3RvcjMpOiBWZWN0b3IzZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9jcm9zcyhsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uKHF1YXQ6IElRdWF0ZXJuaW9uLCB2ZWM6IElWZWN0b3IzKTogVmVjdG9yM2Qge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHlRdWF0ZXJuaW9uKHF1YXQsIHZlYywgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBsZXJwKGxoczogSVZlY3RvcjMsIHJoczogSVZlY3RvcjMsIHJhdGlvOiBudW1iZXIpOiBWZWN0b3IzZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9sZXJwKGxocywgcmhzLCByYXRpbywgRmxvYXQ2NEFycmF5KTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBWZWN0b3IzZiA9IFZlY3RvcjM7XG5leHBvcnQgY29uc3QgQ29uc3RWZWN0b3IzXzFfMV8xID0gVmVjdG9yMy5mcm9tQ29weTMoMSwgMSwgMSk7XG5leHBvcnQgY29uc3QgQ29uc3RWZWN0b3IzXzBfMF8wID0gVmVjdG9yMy5mcm9tQ29weTMoMCwgMCwgMCk7XG4iLCJpbXBvcnQgeyBJVmVjdG9yMiwgSVZlY3RvcjMsIElWZWN0b3I0LCBJTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuL0lWZWN0b3InO1xuaW1wb3J0IHsgQXJyYXk0LCBGbG9hdFR5cGVkQXJyYXksIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWF0aFV0aWwgfSBmcm9tICcuL01hdGhVdGlsJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFZlY3RvciB9IGZyb20gJy4vQWJzdHJhY3RWZWN0b3InO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG4vKipcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjRfPFQgZXh0ZW5kcyBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcj5cbiAgZXh0ZW5kcyBBYnN0cmFjdFZlY3RvclxuICBpbXBsZW1lbnRzIElWZWN0b3I0XG57XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih2OiBGbG9hdFR5cGVkQXJyYXksIHsgdHlwZSB9OiB7IHR5cGU6IFQgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdiA9IHY7XG4gIH1cblxuICBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92WzBdO1xuICB9XG5cbiAgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlsxXTtcbiAgfVxuXG4gIGdldCB6KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZbMl07XG4gIH1cblxuICBnZXQgdygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92WzNdO1xuICB9XG5cbiAgZ2V0IGdsc2xTdHJBc0Zsb2F0KCkge1xuICAgIHJldHVybiBgdmVjNCgke01hdGhVdGlsLmNvbnZlcnRUb1N0cmluZ0FzR0xTTEZsb2F0KFxuICAgICAgdGhpcy5fdlswXVxuICAgICl9LCAke01hdGhVdGlsLmNvbnZlcnRUb1N0cmluZ0FzR0xTTEZsb2F0KHRoaXMuX3ZbMV0pfSwgJHtNYXRoVXRpbC5jb252ZXJ0VG9TdHJpbmdBc0dMU0xGbG9hdChcbiAgICAgIHRoaXMuX3ZbMl1cbiAgICApfSwgJHtNYXRoVXRpbC5jb252ZXJ0VG9TdHJpbmdBc0dMU0xGbG9hdCh0aGlzLl92WzNdKX0pYDtcbiAgfVxuXG4gIGdldCBnbHNsU3RyQXNJbnQoKSB7XG4gICAgcmV0dXJuIGBpdmVjNCgke01hdGguZmxvb3IodGhpcy5fdlswXSl9LCAke01hdGguZmxvb3IodGhpcy5fdlsxXSl9LCAke01hdGguZmxvb3IoXG4gICAgICB0aGlzLl92WzJdXG4gICAgKX0sICR7TWF0aC5mbG9vcih0aGlzLl92WzNdKX0pYDtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUNvcHlBcnJheTQoYXJyYXk6IEFycmF5NDxudW1iZXI+LCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShhcnJheSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUNvcHk0KHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlciwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoW3gsIHksIHosIHddKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weUFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+LCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShhcnJheS5zbGljZSgwLCA0KSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUNvcHlWZWN0b3I0KHZlYzQ6IElWZWN0b3I0LCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IHZlYyA9IG5ldyB0aGlzKG5ldyB0eXBlKFt2ZWM0Ll92WzBdLCB2ZWM0Ll92WzFdLCB2ZWM0Ll92WzJdLCB2ZWM0Ll92WzNdXSksIHsgdHlwZSB9KTtcbiAgICByZXR1cm4gdmVjO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQ29weVZlY3RvcjModmVjMzogSVZlY3RvcjMsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgdmVjID0gbmV3IHRoaXMobmV3IHR5cGUoW3ZlYzMuX3ZbMF0sIHZlYzMuX3ZbMV0sIHZlYzMuX3ZbMl0sIDFdKSwge1xuICAgICAgdHlwZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdmVjO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tVmVjdG9yMih2ZWMyOiBJVmVjdG9yMiwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCB2ZWMgPSBuZXcgdGhpcyhuZXcgdHlwZShbdmVjMi5fdlswXSwgdmVjMi5fdlsxXSwgMCwgMV0pLCB7XG4gICAgICB0eXBlLFxuICAgIH0pO1xuICAgIHJldHVybiB2ZWM7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBvc2l0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLlZlYzQ7XG4gIH1cblxuICAvKipcbiAgICogdG8gc3F1YXJlIGxlbmd0aChzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBsZW5ndGhTcXVhcmVkKHZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gdmVjLmxlbmd0aFNxdWFyZWQoKTtcbiAgfVxuXG4gIHN0YXRpYyBsZW5ndGhCdHcobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gbF92ZWMubGVuZ3RoVG8ocl92ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFplcm8gVmVjdG9yXG4gICAqL1xuICBzdGF0aWMgX3plcm8odHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoWzAsIDAsIDAsIDBdKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc3RhdGljIF9vbmUodHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoWzEsIDEsIDEsIDFdKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgc3RhdGljIF9kdW1teSh0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShbXSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBub3JtYWxpemUoc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX25vcm1hbGl6ZSh2ZWM6IElWZWN0b3I0LCB0eXBlOiBGbG9hdFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IHZlYy5sZW5ndGgoKTtcbiAgICByZXR1cm4gdGhpcy5fZGl2aWRlKHZlYywgbGVuZ3RoLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdmFsdWXvvIhzdGF0aWMgdmVyc2lvbu+8iVxuICAgKi9cbiAgc3RhdGljIF9hZGQobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeCA9IGxfdmVjLl92WzBdICsgcl92ZWMuX3ZbMF07XG4gICAgY29uc3QgeSA9IGxfdmVjLl92WzFdICsgcl92ZWMuX3ZbMV07XG4gICAgY29uc3QgeiA9IGxfdmVjLl92WzJdICsgcl92ZWMuX3ZbMl07XG4gICAgY29uc3QgdyA9IGxfdmVjLl92WzNdICsgcl92ZWMuX3ZbM107XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyB0eXBlKFt4LCB5LCB6LCB3XSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdmFsdWXvvIhzdGF0aWMgdmVyc2lvbu+8iVxuICAgKi9cbiAgc3RhdGljIGFkZFRvKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0LCBvdXQ6IElNdXRhYmxlVmVjdG9yNCkge1xuICAgIG91dC5fdlswXSA9IGxfdmVjLl92WzBdICsgcl92ZWMuX3ZbMF07XG4gICAgb3V0Ll92WzFdID0gbF92ZWMuX3ZbMV0gKyByX3ZlYy5fdlsxXTtcbiAgICBvdXQuX3ZbMl0gPSBsX3ZlYy5fdlsyXSArIHJfdmVjLl92WzJdO1xuICAgIG91dC5fdlszXSA9IGxfdmVjLl92WzNdICsgcl92ZWMuX3ZbM107XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdWJ0cmFjdChzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBfc3VidHJhY3QobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeCA9IGxfdmVjLl92WzBdIC0gcl92ZWMuX3ZbMF07XG4gICAgY29uc3QgeSA9IGxfdmVjLl92WzFdIC0gcl92ZWMuX3ZbMV07XG4gICAgY29uc3QgeiA9IGxfdmVjLl92WzJdIC0gcl92ZWMuX3ZbMl07XG4gICAgY29uc3QgdyA9IGxfdmVjLl92WzNdIC0gcl92ZWMuX3ZbM107XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyB0eXBlKFt4LCB5LCB6LCB3XSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdWJ0cmFjdChzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBzdWJ0cmFjdFRvKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0LCBvdXQ6IElNdXRhYmxlVmVjdG9yNCkge1xuICAgIG91dC5fdlswXSA9IGxfdmVjLl92WzBdIC0gcl92ZWMuX3ZbMF07XG4gICAgb3V0Ll92WzFdID0gbF92ZWMuX3ZbMV0gLSByX3ZlYy5fdlsxXTtcbiAgICBvdXQuX3ZbMl0gPSBsX3ZlYy5fdlsyXSAtIHJfdmVjLl92WzJdO1xuICAgIG91dC5fdlszXSA9IGxfdmVjLl92WzNdIC0gcl92ZWMuX3ZbM107XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseShzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBfbXVsdGlwbHkodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlciwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBjb25zdCB4ID0gdmVjLl92WzBdICogdmFsdWU7XG4gICAgY29uc3QgeSA9IHZlYy5fdlsxXSAqIHZhbHVlO1xuICAgIGNvbnN0IHogPSB2ZWMuX3ZbMl0gKiB2YWx1ZTtcbiAgICBjb25zdCB3ID0gdmVjLl92WzNdICogdmFsdWU7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyB0eXBlKFt4LCB5LCB6LCB3XSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseVRvKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIG11bHRpcGx5VG8odmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlciwgb3V0OiBJTXV0YWJsZVZlY3RvcjQpIHtcbiAgICBvdXQuX3ZbMF0gPSB2ZWMuX3ZbMF0gKiB2YWx1ZTtcbiAgICBvdXQuX3ZbMV0gPSB2ZWMuX3ZbMV0gKiB2YWx1ZTtcbiAgICBvdXQuX3ZbMl0gPSB2ZWMuX3ZbMl0gKiB2YWx1ZTtcbiAgICBvdXQuX3ZbM10gPSB2ZWMuX3ZbM10gKiB2YWx1ZTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpcGx5IHZlY3RvcihzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBfbXVsdGlwbHlWZWN0b3IobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQsIHR5cGU6IEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgY29uc3QgeCA9IGxfdmVjLl92WzBdICogcl92ZWMuX3ZbMF07XG4gICAgY29uc3QgeSA9IGxfdmVjLl92WzFdICogcl92ZWMuX3ZbMV07XG4gICAgY29uc3QgeiA9IGxfdmVjLl92WzJdICogcl92ZWMuX3ZbMl07XG4gICAgY29uc3QgdyA9IGxfdmVjLl92WzNdICogcl92ZWMuX3ZbM107XG4gICAgcmV0dXJuIG5ldyB0aGlzKG5ldyB0eXBlKFt4LCB5LCB6LCB3XSksIHsgdHlwZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXBseSB2ZWN0b3Ioc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgbXVsdGlwbHlWZWN0b3JUbyhsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCwgb3V0OiBJTXV0YWJsZVZlY3RvcjQpIHtcbiAgICBvdXQuX3ZbMF0gPSBsX3ZlYy5fdlswXSAqIHJfdmVjLl92WzBdO1xuICAgIG91dC5fdlsxXSA9IGxfdmVjLl92WzFdICogcl92ZWMuX3ZbMV07XG4gICAgb3V0Ll92WzJdID0gbF92ZWMuX3ZbMl0gKiByX3ZlYy5fdlsyXTtcbiAgICBvdXQuX3ZbM10gPSBsX3ZlYy5fdlszXSAqIHJfdmVjLl92WzNdO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogZGl2aWRlKHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIF9kaXZpZGUodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlciwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBsZXQgeDtcbiAgICBsZXQgeTtcbiAgICBsZXQgejtcbiAgICBsZXQgdztcbiAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgIHggPSB2ZWMuX3ZbMF0gLyB2YWx1ZTtcbiAgICAgIHkgPSB2ZWMuX3ZbMV0gLyB2YWx1ZTtcbiAgICAgIHogPSB2ZWMuX3ZbMl0gLyB2YWx1ZTtcbiAgICAgIHcgPSB2ZWMuX3ZbM10gLyB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCcwIGRpdmlzaW9uIG9jY3VycmVkIScpO1xuICAgICAgeCA9IEluZmluaXR5O1xuICAgICAgeSA9IEluZmluaXR5O1xuICAgICAgeiA9IEluZmluaXR5O1xuICAgICAgdyA9IEluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMobmV3IHR5cGUoW3gsIHksIHosIHddKSwgeyB0eXBlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSBieSB2YWx1ZShzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBkaXZpZGVUbyh2ZWM6IElWZWN0b3I0LCB2YWx1ZTogbnVtYmVyLCBvdXQ6IElNdXRhYmxlVmVjdG9yNCkge1xuICAgIGlmICh2YWx1ZSAhPT0gMCkge1xuICAgICAgb3V0Ll92WzBdID0gdmVjLl92WzBdIC8gdmFsdWU7XG4gICAgICBvdXQuX3ZbMV0gPSB2ZWMuX3ZbMV0gLyB2YWx1ZTtcbiAgICAgIG91dC5fdlsyXSA9IHZlYy5fdlsyXSAvIHZhbHVlO1xuICAgICAgb3V0Ll92WzNdID0gdmVjLl92WzNdIC8gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIG91dC5fdlswXSA9IEluZmluaXR5O1xuICAgICAgb3V0Ll92WzFdID0gSW5maW5pdHk7XG4gICAgICBvdXQuX3ZbMl0gPSBJbmZpbml0eTtcbiAgICAgIG91dC5fdlszXSA9IEluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIGRpdmlkZSB2ZWN0b3Ioc3RhdGljIHZlcnNpb24pXG4gICAqL1xuICBzdGF0aWMgX2RpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCwgdHlwZTogRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IpIHtcbiAgICBsZXQgeDtcbiAgICBsZXQgeTtcbiAgICBsZXQgejtcbiAgICBsZXQgdztcbiAgICBpZiAocl92ZWMuX3ZbMF0gIT09IDAgJiYgcl92ZWMuX3ZbMV0gIT09IDAgJiYgcl92ZWMuX3ZbMl0gIT09IDAgJiYgcl92ZWMuX3ZbM10gIT09IDApIHtcbiAgICAgIHggPSBsX3ZlYy5fdlswXSAvIHJfdmVjLl92WzBdO1xuICAgICAgeSA9IGxfdmVjLl92WzFdIC8gcl92ZWMuX3ZbMV07XG4gICAgICB6ID0gbF92ZWMuX3ZbMl0gLyByX3ZlYy5fdlsyXTtcbiAgICAgIHcgPSBsX3ZlYy5fdlszXSAvIHJfdmVjLl92WzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJzAgZGl2aXNpb24gb2NjdXJyZWQhJyk7XG4gICAgICB4ID0gcl92ZWMuX3ZbMF0gPT09IDAgPyBJbmZpbml0eSA6IGxfdmVjLl92WzBdIC8gcl92ZWMuX3ZbMF07XG4gICAgICB5ID0gcl92ZWMuX3ZbMV0gPT09IDAgPyBJbmZpbml0eSA6IGxfdmVjLl92WzFdIC8gcl92ZWMuX3ZbMV07XG4gICAgICB6ID0gcl92ZWMuX3ZbMl0gPT09IDAgPyBJbmZpbml0eSA6IGxfdmVjLl92WzJdIC8gcl92ZWMuX3ZbMl07XG4gICAgICB3ID0gcl92ZWMuX3ZbM10gPT09IDAgPyBJbmZpbml0eSA6IGxfdmVjLl92WzNdIC8gcl92ZWMuX3ZbM107XG4gICAgfVxuICAgIHJldHVybiBuZXcgdGhpcyhuZXcgdHlwZShbeCwgeSwgeiwgd10pLCB7IHR5cGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGl2aWRlIGJ5IHZlY3RvcihzdGF0aWMgdmVyc2lvbilcbiAgICovXG4gIHN0YXRpYyBkaXZpZGVWZWN0b3JUbyhsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCwgb3V0OiBJTXV0YWJsZVZlY3RvcjQpIHtcbiAgICBpZiAocl92ZWMuX3ZbMF0gIT09IDAgJiYgcl92ZWMuX3ZbMV0gIT09IDAgJiYgcl92ZWMuX3ZbMl0gIT09IDAgJiYgcl92ZWMuX3ZbM10gIT09IDApIHtcbiAgICAgIG91dC5fdlswXSA9IGxfdmVjLl92WzBdIC8gcl92ZWMuX3ZbMF07XG4gICAgICBvdXQuX3ZbMV0gPSBsX3ZlYy5fdlsxXSAvIHJfdmVjLl92WzFdO1xuICAgICAgb3V0Ll92WzJdID0gbF92ZWMuX3ZbMl0gLyByX3ZlYy5fdlsyXTtcbiAgICAgIG91dC5fdlszXSA9IGxfdmVjLl92WzNdIC8gcl92ZWMuX3ZbM107XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignMCBkaXZpc2lvbiBvY2N1cnJlZCEnKTtcbiAgICAgIG91dC5fdlswXSA9IHJfdmVjLl92WzBdID09PSAwID8gSW5maW5pdHkgOiBsX3ZlYy5fdlswXSAvIHJfdmVjLl92WzBdO1xuICAgICAgb3V0Ll92WzFdID0gcl92ZWMuX3ZbMV0gPT09IDAgPyBJbmZpbml0eSA6IGxfdmVjLl92WzFdIC8gcl92ZWMuX3ZbMV07XG4gICAgICBvdXQuX3ZbMl0gPSByX3ZlYy5fdlsyXSA9PT0gMCA/IEluZmluaXR5IDogbF92ZWMuX3ZbMl0gLyByX3ZlYy5fdlsyXTtcbiAgICAgIG91dC5fdlszXSA9IHJfdmVjLl92WzNdID09PSAwID8gSW5maW5pdHkgOiBsX3ZlYy5fdlszXSAvIHJfdmVjLl92WzNdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIGRvdCBwcm9kdWN0KHN0YXRpYyB2ZXJzaW9uKVxuICAgKi9cbiAgc3RhdGljIGRvdChsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBsX3ZlYy5kb3Qocl92ZWMpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICcoJyArIHRoaXMuX3ZbMF0gKyAnLCAnICsgdGhpcy5fdlsxXSArICcsICcgKyB0aGlzLl92WzJdICsgJywgJyArIHRoaXMuX3ZbM10gKyAnKSc7XG4gIH1cblxuICB0b1N0cmluZ0FwcHJveGltYXRlbHkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzBdKSArXG4gICAgICAnICcgK1xuICAgICAgTWF0aFV0aWwuZmluYW5jaWFsKHRoaXMuX3ZbMV0pICtcbiAgICAgICcgJyArXG4gICAgICBNYXRoVXRpbC5maW5hbmNpYWwodGhpcy5fdlsyXSkgK1xuICAgICAgJyAnICtcbiAgICAgIE1hdGhVdGlsLmZpbmFuY2lhbCh0aGlzLl92WzNdKSArXG4gICAgICAnXFxuJ1xuICAgICk7XG4gIH1cblxuICBmbGF0dGVuQXNBcnJheSgpIHtcbiAgICByZXR1cm4gW3RoaXMuX3ZbMF0sIHRoaXMuX3ZbMV0sIHRoaXMuX3ZbMl0sIHRoaXMuX3ZbM11dO1xuICB9XG5cbiAgaXNEdW1teSgpIHtcbiAgICBpZiAodGhpcy5fdi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNFcXVhbCh2ZWM6IElWZWN0b3I0LCBkZWx0YTogbnVtYmVyID0gTnVtYmVyLkVQU0lMT04pIHtcbiAgICBpZiAoXG4gICAgICBNYXRoLmFicyh2ZWMuX3ZbMF0gLSB0aGlzLl92WzBdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyh2ZWMuX3ZbMV0gLSB0aGlzLl92WzFdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyh2ZWMuX3ZbMl0gLSB0aGlzLl92WzJdKSA8IGRlbHRhICYmXG4gICAgICBNYXRoLmFicyh2ZWMuX3ZbM10gLSB0aGlzLl92WzNdKSA8IGRlbHRhXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzU3RyaWN0RXF1YWwodmVjOiBJVmVjdG9yNCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX3ZbMF0gPT09IHZlYy5fdlswXSAmJlxuICAgICAgdGhpcy5fdlsxXSA9PT0gdmVjLl92WzFdICYmXG4gICAgICB0aGlzLl92WzJdID09PSB2ZWMuX3ZbMl0gJiZcbiAgICAgIHRoaXMuX3ZbM10gPT09IHZlYy5fdlszXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhdChpOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdltpXTtcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5oeXBvdCh0aGlzLl92WzBdLCB0aGlzLl92WzFdLCB0aGlzLl92WzJdLCB0aGlzLl92WzNdKTtcbiAgfVxuXG4gIGxlbmd0aFNxdWFyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdlswXSAqKiAyICsgdGhpcy5fdlsxXSAqKiAyICsgdGhpcy5fdlsyXSAqKiAyICsgdGhpcy5fdlszXSAqKiAyO1xuICB9XG5cbiAgbGVuZ3RoVG8odmVjOiBJVmVjdG9yNCkge1xuICAgIGNvbnN0IGRlbHRhWCA9IHRoaXMuX3ZbMF0gLSB2ZWMuX3ZbMF07XG4gICAgY29uc3QgZGVsdGFZID0gdGhpcy5fdlsxXSAtIHZlYy5fdlsxXTtcbiAgICBjb25zdCBkZWx0YVogPSB0aGlzLl92WzJdIC0gdmVjLl92WzJdO1xuICAgIGNvbnN0IGRlbHRhVyA9IHRoaXMuX3ZbM10gLSB2ZWMuX3ZbM107XG4gICAgcmV0dXJuIE1hdGguaHlwb3QoZGVsdGFYLCBkZWx0YVksIGRlbHRhWiwgZGVsdGFXKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkb3QgcHJvZHVjdFxuICAgKi9cbiAgZG90KHZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fdlswXSAqIHZlYy5fdlswXSArXG4gICAgICB0aGlzLl92WzFdICogdmVjLl92WzFdICtcbiAgICAgIHRoaXMuX3ZbMl0gKiB2ZWMuX3ZbMl0gK1xuICAgICAgdGhpcy5fdlszXSAqIHZlYy5fdlszXVxuICAgICk7XG4gIH1cblxuICBnZXQgY2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnVmVjdG9yNCc7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3ICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkoXG4gICAgICBuZXcgKHRoaXMuX3YuY29uc3RydWN0b3IgYXMgYW55KShbdGhpcy5fdlswXSwgdGhpcy5fdlsxXSwgdGhpcy5fdlsyXSwgdGhpcy5fdlszXV0pXG4gICAgKTtcbiAgfVxuXG4gIGdldCBieXRlc1BlckNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdi5CWVRFU19QRVJfRUxFTUVOVDtcbiAgfVxufVxuXG4vKipcbiAqIEltbXV0YWJsZSA0RCh4LHkseix3KSBWZWN0b3IgY2xhc3Mgd2l0aCAzMmJpdCBmbG9hdCBjb21wb25lbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogY29uc3QgdmVjMSA9IFJuLlZlY3RvcjQuZnJvbUNvcHk0KDEsIDIsIDMsIDEpO1xuICogY29uc3QgdmVjMiA9IFJuLlZlY3RvcjQuZnJvbUNvcHlBcnJheTQoWzIsIDMsIDMsIDFdKTtcbiAqIGNvbnN0IGRvdFByb2R1Y3QgPSB2ZWMxLmRvdCh2ZWMyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yNCBleHRlbmRzIFZlY3RvcjRfPEZsb2F0MzJBcnJheUNvbnN0cnVjdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHg6IEZsb2F0MzJBcnJheSkge1xuICAgIHN1cGVyKHgsIHsgdHlwZTogRmxvYXQzMkFycmF5IH0pO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXkoYXJyYXk6IEFycmF5PG51bWJlcj4pOiBWZWN0b3I0IHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5QXJyYXkoYXJyYXksIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvcHlBcnJheTQoYXJyYXk6IEFycmF5NDxudW1iZXI+KTogVmVjdG9yNCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weUFycmF5NChhcnJheSwgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weTQoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdzogbnVtYmVyKTogVmVjdG9yNCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weTQoeCwgeSwgeiwgdywgRmxvYXQzMkFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weVZlY3RvcjModmVjMzogSVZlY3RvcjMpOiBWZWN0b3I0IHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5VmVjdG9yMyh2ZWMzLCBGbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5VmVjdG9yNCh2ZWM0OiBJVmVjdG9yNCk6IFZlY3RvcjQge1xuICAgIHJldHVybiBzdXBlci5fZnJvbUNvcHlWZWN0b3I0KHZlYzQsIEZsb2F0MzJBcnJheSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcik6IFZlY3RvcjQge1xuICAgIHJldHVybiBuZXcgVmVjdG9yNChuZXcgRmxvYXQzMkFycmF5KGFycmF5QnVmZmVyKSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUZsb2F0MzJBcnJheShmbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSk6IFZlY3RvcjQge1xuICAgIHJldHVybiBuZXcgVmVjdG9yNChmbG9hdDMyQXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5RmxvYXQzMkFycmF5KGZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5KTogVmVjdG9yNCB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3I0KGZsb2F0MzJBcnJheS5zbGljZSgwKSk7XG4gIH1cblxuICBzdGF0aWMgemVybygpIHtcbiAgICByZXR1cm4gc3VwZXIuX3plcm8oRmxvYXQzMkFycmF5KSBhcyBWZWN0b3I0O1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDMyQXJyYXkpIGFzIFZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgZHVtbXkoKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9kdW1teShGbG9hdDMyQXJyYXkpIGFzIFZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgbm9ybWFsaXplKHZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX25vcm1hbGl6ZSh2ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yNDtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yNDtcbiAgfVxuXG4gIHN0YXRpYyBzdWJ0cmFjdChsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fc3VidHJhY3QobF92ZWMsIHJfdmVjLCBGbG9hdDMyQXJyYXkpIGFzIFZlY3RvcjQ7XG4gIH1cblxuICBzdGF0aWMgbXVsdGlwbHkodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fbXVsdGlwbHkodmVjLCB2YWx1ZSwgRmxvYXQzMkFycmF5KSBhcyBWZWN0b3I0O1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yNDtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGUodmVjOiBJVmVjdG9yNCwgdmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlKHZlYywgdmFsdWUsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yNDtcbiAgfVxuXG4gIHN0YXRpYyBkaXZpZGVWZWN0b3IobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0MzJBcnJheSkgYXMgVmVjdG9yNDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIFZlY3RvcjQ7XG4gIH1cbn1cblxuLyoqXG4gKiBJbW11dGFibGUgNEQoeCx5LHosdykgVmVjdG9yIGNsYXNzIHdpdGggNjRiaXQgZmxvYXQgY29tcG9uZW50c1xuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yNGQgZXh0ZW5kcyBWZWN0b3I0XzxGbG9hdDY0QXJyYXlDb25zdHJ1Y3Rvcj4ge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHg6IEZsb2F0NjRBcnJheSkge1xuICAgIHN1cGVyKHgsIHsgdHlwZTogRmxvYXQ2NEFycmF5IH0pO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5QXJyYXk0KGFycmF5OiBBcnJheTQ8bnVtYmVyPik6IFZlY3RvcjRkIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5QXJyYXk0KGFycmF5LCBGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db3B5NCh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIpOiBWZWN0b3I0ZCB7XG4gICAgcmV0dXJuIHN1cGVyLl9mcm9tQ29weTQoeCwgeSwgeiwgdywgRmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQ29weUFycmF5KGFycmF5OiBBcnJheTQ8bnVtYmVyPik6IFZlY3RvcjRkIHtcbiAgICByZXR1cm4gc3VwZXIuX2Zyb21Db3B5QXJyYXkoYXJyYXksIEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcik6IFZlY3RvcjRkIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjRkKG5ldyBGbG9hdDY0QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmxvYXQ2NEFycmF5KGZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5KTogVmVjdG9yNGQge1xuICAgIHJldHVybiBuZXcgVmVjdG9yNGQoZmxvYXQ2NEFycmF5KTtcbiAgfVxuXG4gIHN0YXRpYyB6ZXJvKCkge1xuICAgIHJldHVybiBzdXBlci5femVybyhGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIG9uZSgpIHtcbiAgICByZXR1cm4gc3VwZXIuX29uZShGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIGR1bW15KCkge1xuICAgIHJldHVybiBzdXBlci5fZHVtbXkoRmxvYXQ2NEFycmF5KSBhcyBWZWN0b3I0ZDtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemUodmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fbm9ybWFsaXplKHZlYywgRmxvYXQ2NEFycmF5KSBhcyBWZWN0b3I0ZDtcbiAgfVxuXG4gIHN0YXRpYyBhZGQobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX2FkZChsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgc3VidHJhY3QobF92ZWM6IElWZWN0b3I0LCByX3ZlYzogSVZlY3RvcjQpIHtcbiAgICByZXR1cm4gc3VwZXIuX3N1YnRyYWN0KGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBWZWN0b3I0ZDtcbiAgfVxuXG4gIHN0YXRpYyBtdWx0aXBseSh2ZWM6IElWZWN0b3I0LCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseSh2ZWMsIHZhbHVlLCBGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIG11bHRpcGx5VmVjdG9yKGxfdmVjOiBJVmVjdG9yNCwgcl92ZWM6IElWZWN0b3I0KSB7XG4gICAgcmV0dXJuIHN1cGVyLl9tdWx0aXBseVZlY3RvcihsX3ZlYywgcl92ZWMsIEZsb2F0NjRBcnJheSkgYXMgVmVjdG9yNGQ7XG4gIH1cblxuICBzdGF0aWMgZGl2aWRlKHZlYzogSVZlY3RvcjQsIHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc3VwZXIuX2RpdmlkZSh2ZWMsIHZhbHVlLCBGbG9hdDY0QXJyYXkpIGFzIFZlY3RvcjRkO1xuICB9XG5cbiAgc3RhdGljIGRpdmlkZVZlY3RvcihsX3ZlYzogSVZlY3RvcjQsIHJfdmVjOiBJVmVjdG9yNCkge1xuICAgIHJldHVybiBzdXBlci5fZGl2aWRlVmVjdG9yKGxfdmVjLCByX3ZlYywgRmxvYXQ2NEFycmF5KSBhcyBWZWN0b3I0ZDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIFZlY3RvcjRkO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFZlY3RvcjRmID0gVmVjdG9yNDtcblxuZXhwb3J0IGNvbnN0IENvbnN0VmVjdG9yNF8xXzFfMV8xID0gVmVjdG9yNC5mcm9tQ29weTQoMSwgMSwgMSwgMSk7XG5leHBvcnQgY29uc3QgQ29uc3RWZWN0b3I0XzBfMF8wXzEgPSBWZWN0b3I0LmZyb21Db3B5NCgwLCAwLCAwLCAxKTtcbmV4cG9ydCBjb25zdCBDb25zdFZlY3RvcjRfMF8wXzBfMCA9IFZlY3RvcjQuZnJvbUNvcHk0KDAsIDAsIDAsIDApO1xuIiwiaW1wb3J0IHsgVHlwZWRBcnJheSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcblxuZXhwb3J0IGNsYXNzIFZlY3Rvck4ge1xuICBwdWJsaWMgX3Y6IFR5cGVkQXJyYXk7XG4gIGNvbnN0cnVjdG9yKHR5cGVkQXJyYXk6IFR5cGVkQXJyYXkpIHtcbiAgICB0aGlzLl92ID0gdHlwZWRBcnJheTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9yYXcvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9BQUJCJztcbmV4cG9ydCAqIGZyb20gJy4vQWJzdHJhY3RNYXRoTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQWJzdHJhY3RNYXRyaXgnO1xuZXhwb3J0ICogZnJvbSAnLi9BYnN0cmFjdFF1YXRlcm5pb24nO1xuZXhwb3J0ICogZnJvbSAnLi9BYnN0cmFjdFZlY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL0NvbG9yUmdiJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sb3JSZ2JhJztcbmV4cG9ydCAqIGZyb20gJy4vSUNvbG9yJztcbmV4cG9ydCAqIGZyb20gJy4vSWRlbnRpdHlNYXRyaXgzMyc7XG5leHBvcnQgKiBmcm9tICcuL0lkZW50aXR5TWF0cml4NDQnO1xuZXhwb3J0ICogZnJvbSAnLi9JTWF0aE51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL0lNYXRyaXgnO1xuZXhwb3J0ICogZnJvbSAnLi9JUXVhdGVybmlvbic7XG5leHBvcnQgKiBmcm9tICcuL0lWZWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9Mb2dRdWF0ZXJuaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vTWF0aENsYXNzVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL01hdGhVdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vTWF0cml4MjInO1xuZXhwb3J0ICogZnJvbSAnLi9NYXRyaXgzMyc7XG5leHBvcnQgKiBmcm9tICcuL01hdHJpeDQ0JztcbmV4cG9ydCAqIGZyb20gJy4vTXV0YWJsZUNvbG9yUmdiJztcbmV4cG9ydCAqIGZyb20gJy4vTXV0YWJsZUNvbG9yUmdiYSc7XG5leHBvcnQgKiBmcm9tICcuL011dGFibGVNYXRyaXgyMic7XG5leHBvcnQgKiBmcm9tICcuL011dGFibGVNYXRyaXgzMyc7XG5leHBvcnQgKiBmcm9tICcuL011dGFibGVNYXRyaXg0NCc7XG5leHBvcnQgKiBmcm9tICcuL011dGFibGVRdWF0ZXJuaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vTXV0YWJsZVNjYWxhcic7XG5leHBvcnQgKiBmcm9tICcuL011dGFibGVWZWN0b3IyJztcbmV4cG9ydCAqIGZyb20gJy4vTXV0YWJsZVZlY3RvcjMnO1xuZXhwb3J0ICogZnJvbSAnLi9NdXRhYmxlVmVjdG9yNCc7XG5leHBvcnQgKiBmcm9tICcuL1F1YXRlcm5pb24nO1xuZXhwb3J0ICogZnJvbSAnLi9TY2FsYXInO1xuZXhwb3J0ICogZnJvbSAnLi9UcmFuc2Zvcm0zRCc7XG5leHBvcnQgKiBmcm9tICcuL1ZlY3RvcjInO1xuZXhwb3J0ICogZnJvbSAnLi9WZWN0b3IzJztcbmV4cG9ydCAqIGZyb20gJy4vVmVjdG9yNCc7XG5leHBvcnQgKiBmcm9tICcuL1ZlY3Rvck4nO1xuIiwiZXhwb3J0ICogZnJvbSAnLi9yYXdfZXh0ZW5zaW9uJztcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuaW1wb3J0IHR5cGUgeyBBcnJheTEsIEFycmF5MiwgQXJyYXkzLCBBcnJheTQsIEFycmF5VHlwZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmV4cG9ydCBjb25zdCBnZXQxID0gU3ltYm9sKCdnZXQxJyk7XG5leHBvcnQgY29uc3QgZ2V0MV9vZmZzZXQgPSBTeW1ib2woJ2dldDFfb2Zmc2V0Jyk7XG5leHBvcnQgY29uc3QgZ2V0MV9vZmZzZXRBc0NvbXBvc2l0aW9uID0gU3ltYm9sKCdnZXQxX29mZnNldEFzQ29tcG9zaXRpb24nKTtcbmV4cG9ydCBjb25zdCBnZXQyID0gU3ltYm9sKCdnZXQyJyk7XG5leHBvcnQgY29uc3QgZ2V0Ml9vZmZzZXQgPSBTeW1ib2woJ2dldDJfb2Zmc2V0Jyk7XG5leHBvcnQgY29uc3QgZ2V0Ml9vZmZzZXRBc0NvbXBvc2l0aW9uID0gU3ltYm9sKCdnZXQyX29mZnNldEFzQ29tcG9zaXRpb24nKTtcbmV4cG9ydCBjb25zdCBnZXQzID0gU3ltYm9sKCdnZXQzJyk7XG5leHBvcnQgY29uc3QgZ2V0M19vZmZzZXQgPSBTeW1ib2woJ2dldDNfb2Zmc2V0Jyk7XG5leHBvcnQgY29uc3QgZ2V0M19vZmZzZXRBc0NvbXBvc2l0aW9uID0gU3ltYm9sKCdnZXQzX29mZnNldEFzQ29tcG9zaXRpb24nKTtcbmV4cG9ydCBjb25zdCBnZXQ0ID0gU3ltYm9sKCdnZXQ0Jyk7XG5leHBvcnQgY29uc3QgZ2V0NF9vZmZzZXQgPSBTeW1ib2woJ2dldDRfb2Zmc2V0Jyk7XG5leHBvcnQgY29uc3QgZ2V0NF9vZmZzZXRBc0NvbXBvc2l0aW9uID0gU3ltYm9sKCdnZXQ0X29mZnNldEFzQ29tcG9zaXRpb24nKTtcbmV4cG9ydCBjb25zdCBnZXROX29mZnNldCA9IFN5bWJvbCgnZ2V0Tl9vZmZzZXQnKTtcbmV4cG9ydCBjb25zdCBnZXROX29mZnNldEFzQ29tcG9zaXRpb24gPSBTeW1ib2woJ2dldE5fb2Zmc2V0QXNDb21wb3NpdGlvbicpO1xuZXhwb3J0IGNvbnN0IGFkZDIgPSBTeW1ib2woJ2FkZDInKTtcbmV4cG9ydCBjb25zdCBhZGQyX29mZnNldCA9IFN5bWJvbCgnYWRkMl9vZmZzZXQnKTtcbmV4cG9ydCBjb25zdCBhZGQzID0gU3ltYm9sKCdhZGQzJyk7XG5leHBvcnQgY29uc3QgYWRkM19vZmZzZXQgPSBTeW1ib2woJ2FkZDNfb2Zmc2V0Jyk7XG5leHBvcnQgY29uc3QgYWRkNCA9IFN5bWJvbCgnYWRkNCcpO1xuZXhwb3J0IGNvbnN0IG11bEFycmF5M1dpdGhTY2FsYXJfb2Zmc2V0ID0gU3ltYm9sKCdtdWxBcnJheTNXaXRoU2NhbGFyX29mZnNldCcpO1xuZXhwb3J0IGNvbnN0IG11bEFycmF5NFdpdGhTY2FsYXJfb2Zmc2V0ID0gU3ltYm9sKCdtdWxBcnJheTRXaXRoU2NhbGFyX29mZnNldCcpO1xuZXhwb3J0IGNvbnN0IG11bEFycmF5TldpdGhTY2FsYXJfb2Zmc2V0ID0gU3ltYm9sKCdtdWxBcnJheU5XaXRoU2NhbGFyX29mZnNldCcpO1xuZXhwb3J0IGNvbnN0IG11bFRoYXRBbmRUaGlzVG9PdXRBc01hdDQ0X29mZnNldEFzQ29tcG9zaXRpb24gPSBTeW1ib2woXG4gICdtdWxUaGF0QW5kVGhpc1RvT3V0QXNNYXQ0NF9vZmZzZXRBc0NvbXBvc2l0aW9uJ1xuKTtcbmV4cG9ydCBjb25zdCBhZGQ0X29mZnNldCA9IFN5bWJvbCgnYWRkNF9vZmZzZXQnKTtcbmV4cG9ydCBjb25zdCBxbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uID0gU3ltYm9sKCdxbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uJyk7XG5leHBvcnQgY29uc3Qgc2NhbGFyX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbiA9IFN5bWJvbCgnc2NhbGFyX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbicpO1xuZXhwb3J0IGNvbnN0IGFycmF5M19sZXJwX29mZnNldEFzQ29tcG9zaXRpb24gPSBTeW1ib2woJ2FycmF5M19sZXJwX29mZnNldEFzQ29tcG9zaXRpb24nKTtcbmV4cG9ydCBjb25zdCBhcnJheU5fbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uID0gU3ltYm9sKCdhcnJheU5fbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uJyk7XG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQXJyYXk0ID0gU3ltYm9sKCdub3JtYWxpemVBcnJheTQnKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgRXh0ZW5zaW9uIHtcbiAgICBbZ2V0MV0odGhpczogQXJyYXlUeXBlKTogQXJyYXkxPG51bWJlcj47XG4gICAgW2dldDFfb2Zmc2V0XSh0aGlzOiBBcnJheVR5cGUsIG9mZnNldDogbnVtYmVyKTogQXJyYXkxPG51bWJlcj47XG4gICAgW2dldDFfb2Zmc2V0QXNDb21wb3NpdGlvbl0odGhpczogQXJyYXlUeXBlLCBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIpOiBBcnJheTE8bnVtYmVyPjtcbiAgICBbZ2V0Ml0odGhpczogQXJyYXlUeXBlKTogQXJyYXkyPG51bWJlcj47XG4gICAgW2dldDJfb2Zmc2V0XSh0aGlzOiBBcnJheVR5cGUsIG9mZnNldDogbnVtYmVyKTogQXJyYXkyPG51bWJlcj47XG4gICAgW2dldDJfb2Zmc2V0QXNDb21wb3NpdGlvbl0odGhpczogQXJyYXlUeXBlLCBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIpOiBBcnJheTI8bnVtYmVyPjtcbiAgICBbZ2V0M10odGhpczogQXJyYXlUeXBlKTogQXJyYXkzPG51bWJlcj47XG4gICAgW2dldDNfb2Zmc2V0XSh0aGlzOiBBcnJheVR5cGUsIG9mZnNldDogbnVtYmVyKTogQXJyYXkzPG51bWJlcj47XG4gICAgW2dldDNfb2Zmc2V0QXNDb21wb3NpdGlvbl0odGhpczogQXJyYXlUeXBlLCBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIpOiBBcnJheTM8bnVtYmVyPjtcbiAgICBbZ2V0NF0odGhpczogQXJyYXlUeXBlKTogQXJyYXk0PG51bWJlcj47XG4gICAgW2dldDRfb2Zmc2V0XSh0aGlzOiBBcnJheVR5cGUsIG9mZnNldDogbnVtYmVyKTogQXJyYXk0PG51bWJlcj47XG4gICAgW2dldDRfb2Zmc2V0QXNDb21wb3NpdGlvbl0odGhpczogQXJyYXlUeXBlLCBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIpOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBbZ2V0Tl9vZmZzZXRdKHRoaXM6IEFycmF5VHlwZSwgb2Zmc2V0OiBudW1iZXIsIGNvbXBvbmVudE46IG51bWJlcik6IEFycmF5PG51bWJlcj47XG4gICAgW2dldE5fb2Zmc2V0QXNDb21wb3NpdGlvbl0oXG4gICAgICB0aGlzOiBBcnJheVR5cGUsXG4gICAgICBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIsXG4gICAgICBjb21wb25lbnROOiBudW1iZXJcbiAgICApOiBBcnJheTxudW1iZXI+O1xuICAgIFthZGQyXSh0aGlzOiBBcnJheVR5cGUsIGFycmF5OiBBcnJheVR5cGUpOiBBcnJheVR5cGU7XG4gICAgW2FkZDJfb2Zmc2V0XShcbiAgICAgIHRoaXM6IEFycmF5VHlwZSxcbiAgICAgIGFycmF5OiBBcnJheVR5cGUsXG4gICAgICBzZWxmT2Zmc2V0OiBudW1iZXIsXG4gICAgICBhcmdPZmZzZXQ6IG51bWJlclxuICAgICk6IEFycmF5VHlwZTtcbiAgICBbYWRkM10odGhpczogQXJyYXlUeXBlLCBhcnJheTogQXJyYXlUeXBlKTogQXJyYXlUeXBlO1xuICAgIFthZGQzX29mZnNldF0oXG4gICAgICB0aGlzOiBBcnJheVR5cGUsXG4gICAgICBhcnJheTogQXJyYXlUeXBlLFxuICAgICAgc2VsZk9mZnNldDogbnVtYmVyLFxuICAgICAgYXJnT2Zmc2V0OiBudW1iZXJcbiAgICApOiBBcnJheVR5cGU7XG4gICAgW2FkZDRdKHRoaXM6IEFycmF5VHlwZSwgYXJyYXk6IEFycmF5VHlwZSk6IEFycmF5VHlwZTtcbiAgICBbYWRkNF9vZmZzZXRdKFxuICAgICAgdGhpczogQXJyYXlUeXBlLFxuICAgICAgYXJyYXk6IEFycmF5VHlwZSxcbiAgICAgIHNlbGZPZmZzZXQ6IG51bWJlcixcbiAgICAgIGFyZ09mZnNldDogbnVtYmVyXG4gICAgKTogQXJyYXlUeXBlO1xuICAgIFttdWxBcnJheTNXaXRoU2NhbGFyX29mZnNldF0odGhpczogQXJyYXlUeXBlLCBvZmZzZXQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IEFycmF5NDxudW1iZXI+O1xuICAgIFttdWxBcnJheTRXaXRoU2NhbGFyX29mZnNldF0odGhpczogQXJyYXlUeXBlLCBvZmZzZXQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IEFycmF5NDxudW1iZXI+O1xuICAgIFttdWxBcnJheU5XaXRoU2NhbGFyX29mZnNldF0oXG4gICAgICB0aGlzOiBBcnJheVR5cGUsXG4gICAgICBvZmZzZXQ6IG51bWJlcixcbiAgICAgIGNvbXBvbmVudE46IG51bWJlcixcbiAgICAgIHZhbHVlOiBudW1iZXJcbiAgICApOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBbbXVsVGhhdEFuZFRoaXNUb091dEFzTWF0NDRfb2Zmc2V0QXNDb21wb3NpdGlvbl0oXG4gICAgICB0aGlzOiBBcnJheVR5cGUsXG4gICAgICB0aGlzT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyLFxuICAgICAgdGhhdDogQXJyYXlUeXBlLFxuICAgICAgdGhhdE9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlcixcbiAgICAgIG91dDogQXJyYXlUeXBlXG4gICAgKTogQXJyYXlUeXBlO1xuICAgIFtxbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uXShcbiAgICAgIHRoaXM6IEFycmF5VHlwZSxcbiAgICAgIGFycmF5OiBBcnJheVR5cGUsXG4gICAgICByYXRpbzogbnVtYmVyLFxuICAgICAgc2VsZk9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlcixcbiAgICAgIGFyZ09mZnNldEFzQ29tcG9zaXRpb246IG51bWJlclxuICAgICk6IEFycmF5NDxudW1iZXI+O1xuICAgIFtzY2FsYXJfbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uXShcbiAgICAgIHRoaXM6IEFycmF5VHlwZSxcbiAgICAgIGFycmF5OiBBcnJheVR5cGUsXG4gICAgICByYXRpbzogbnVtYmVyLFxuICAgICAgc2VsZk9mZnNldDogbnVtYmVyLFxuICAgICAgYXJnT2Zmc2V0OiBudW1iZXJcbiAgICApOiBudW1iZXI7XG4gICAgW2FycmF5M19sZXJwX29mZnNldEFzQ29tcG9zaXRpb25dKFxuICAgICAgdGhpczogQXJyYXlUeXBlLFxuICAgICAgYXJyYXk6IEFycmF5VHlwZSxcbiAgICAgIHJhdGlvOiBudW1iZXIsXG4gICAgICBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyLFxuICAgICAgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyXG4gICAgKTogQXJyYXkzPG51bWJlcj47XG4gICAgW2FycmF5Tl9sZXJwX29mZnNldEFzQ29tcG9zaXRpb25dKFxuICAgICAgdGhpczogQXJyYXlUeXBlLFxuICAgICAgYXJyYXk6IEFycmF5VHlwZSxcbiAgICAgIGNvbXBvbmVudE46IG51bWJlcixcbiAgICAgIHJhdGlvOiBudW1iZXIsXG4gICAgICBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyLFxuICAgICAgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyXG4gICAgKTogQXJyYXk8bnVtYmVyPjtcbiAgICBbbm9ybWFsaXplQXJyYXk0XSh0aGlzOiBBcnJheTQ8bnVtYmVyPik6IEFycmF5NDxudW1iZXI+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEFycmF5PFQ+IGV4dGVuZHMgRXh0ZW5zaW9uIHt9XG4gIC8vIGludGVyZmFjZSBBcnJheTI8VD4gZXh0ZW5kcyBFeHRlbnNpb24ge31cbiAgLy8gaW50ZXJmYWNlIEFycmF5MzxUPiBleHRlbmRzIEV4dGVuc2lvbiB7fVxuICAvLyBpbnRlcmZhY2UgQXJyYXk0PFQ+IGV4dGVuZHMgRXh0ZW5zaW9uIHt9XG4gIGludGVyZmFjZSBSZWFkb25seUFycmF5PFQ+IGV4dGVuZHMgRXh0ZW5zaW9uIHt9XG4gIGludGVyZmFjZSBGbG9hdDMyQXJyYXkgZXh0ZW5kcyBFeHRlbnNpb24ge31cbn1cblxuY29uc3QgZ2V0MV9mbiA9IGZ1bmN0aW9uICh0aGlzOiBBcnJheVR5cGUpOiBBcnJheTE8bnVtYmVyPiB7XG4gIHJldHVybiBbdGhpc1swXV07XG59O1xuXG5jb25zdCBnZXQxX29mZnNldF9mbiA9IGZ1bmN0aW9uICh0aGlzOiBBcnJheVR5cGUsIG9mZnNldDogbnVtYmVyKTogQXJyYXkxPG51bWJlcj4ge1xuICByZXR1cm4gW3RoaXNbb2Zmc2V0XV07XG59O1xuXG5jb25zdCBnZXQxX29mZnNldEFzQ29tcG9zaXRpb25fZm4gPSBmdW5jdGlvbiAoXG4gIHRoaXM6IEFycmF5VHlwZSxcbiAgb2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyXG4pOiBBcnJheTE8bnVtYmVyPiB7XG4gIHJldHVybiBbdGhpc1tvZmZzZXRBc0NvbXBvc2l0aW9uXV07XG59O1xuXG5jb25zdCBnZXQyX2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSk6IEFycmF5MjxudW1iZXI+IHtcbiAgcmV0dXJuIFt0aGlzWzBdLCB0aGlzWzFdXTtcbn07XG5cbmNvbnN0IGdldDJfb2Zmc2V0X2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSwgb2Zmc2V0OiBudW1iZXIpOiBBcnJheTI8bnVtYmVyPiB7XG4gIHJldHVybiBbdGhpc1tvZmZzZXRdLCB0aGlzW29mZnNldCArIDFdXTtcbn07XG5cbmNvbnN0IGdldDJfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbiA9IGZ1bmN0aW9uIChcbiAgdGhpczogQXJyYXlUeXBlLFxuICBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXJcbik6IEFycmF5MjxudW1iZXI+IHtcbiAgcmV0dXJuIFt0aGlzW29mZnNldEFzQ29tcG9zaXRpb24gKiAyXSwgdGhpc1tvZmZzZXRBc0NvbXBvc2l0aW9uICogMiArIDFdXTtcbn07XG5cbmNvbnN0IGdldDNfZm4gPSBmdW5jdGlvbiAodGhpczogQXJyYXlUeXBlKTogQXJyYXkzPG51bWJlcj4ge1xuICByZXR1cm4gW3RoaXNbMF0sIHRoaXNbMV0sIHRoaXNbMl1dO1xufTtcblxuY29uc3QgZ2V0M19vZmZzZXRfZm4gPSBmdW5jdGlvbiAodGhpczogQXJyYXlUeXBlLCBvZmZzZXQ6IG51bWJlcik6IEFycmF5MzxudW1iZXI+IHtcbiAgcmV0dXJuIFt0aGlzW29mZnNldF0sIHRoaXNbb2Zmc2V0ICsgMV0sIHRoaXNbb2Zmc2V0ICsgMl1dO1xufTtcblxuY29uc3QgZ2V0M19vZmZzZXRBc0NvbXBvc2l0aW9uX2ZuID0gZnVuY3Rpb24gKFxuICB0aGlzOiBBcnJheVR5cGUsXG4gIG9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlclxuKTogQXJyYXkzPG51bWJlcj4ge1xuICByZXR1cm4gW1xuICAgIHRoaXNbb2Zmc2V0QXNDb21wb3NpdGlvbiAqIDNdLFxuICAgIHRoaXNbb2Zmc2V0QXNDb21wb3NpdGlvbiAqIDMgKyAxXSxcbiAgICB0aGlzW29mZnNldEFzQ29tcG9zaXRpb24gKiAzICsgMl0sXG4gIF07XG59O1xuXG5jb25zdCBnZXQ0X2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSk6IEFycmF5NDxudW1iZXI+IHtcbiAgcmV0dXJuIFt0aGlzWzBdLCB0aGlzWzFdLCB0aGlzWzJdLCB0aGlzWzNdXTtcbn07XG5cbmNvbnN0IGdldDRfb2Zmc2V0X2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSwgb2Zmc2V0OiBudW1iZXIpOiBBcnJheTQ8bnVtYmVyPiB7XG4gIHJldHVybiBbdGhpc1tvZmZzZXRdLCB0aGlzW29mZnNldCArIDFdLCB0aGlzW29mZnNldCArIDJdLCB0aGlzW29mZnNldCArIDNdXTtcbn07XG5cbmNvbnN0IGdldDRfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbiA9IGZ1bmN0aW9uIChcbiAgdGhpczogQXJyYXlUeXBlLFxuICBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXJcbik6IEFycmF5NDxudW1iZXI+IHtcbiAgcmV0dXJuIFtcbiAgICB0aGlzW29mZnNldEFzQ29tcG9zaXRpb24gKiA0XSxcbiAgICB0aGlzW29mZnNldEFzQ29tcG9zaXRpb24gKiA0ICsgMV0sXG4gICAgdGhpc1tvZmZzZXRBc0NvbXBvc2l0aW9uICogNCArIDJdLFxuICAgIHRoaXNbb2Zmc2V0QXNDb21wb3NpdGlvbiAqIDQgKyAzXSxcbiAgXTtcbn07XG5cbmNvbnN0IGdldE5fb2Zmc2V0X2ZuID0gZnVuY3Rpb24gKFxuICB0aGlzOiBBcnJheVR5cGUsXG4gIG9mZnNldDogbnVtYmVyLFxuICBjb21wb25lbnROOiBudW1iZXJcbik6IEFycmF5PG51bWJlcj4ge1xuICBjb25zdCBhcnJheSA9IG5ldyBBcnJheShjb21wb25lbnROKSBhcyB1bmtub3duIGFzIEFycmF5PG51bWJlcj47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9uZW50TjsgaSsrKSB7XG4gICAgYXJyYXlbaV0gPSB0aGlzW29mZnNldCArIGldO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn07XG5cbmNvbnN0IGdldE5fb2Zmc2V0QXNDb21wb3NpdGlvbl9mbiA9IGZ1bmN0aW9uIChcbiAgdGhpczogQXJyYXlUeXBlLFxuICBvZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIsXG4gIGNvbXBvbmVudE46IG51bWJlclxuKTogQXJyYXk8bnVtYmVyPiB7XG4gIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KGNvbXBvbmVudE4pIGFzIHVua25vd24gYXMgQXJyYXk8bnVtYmVyPjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnROOyBpKyspIHtcbiAgICBhcnJheVtpXSA9IHRoaXNbb2Zmc2V0QXNDb21wb3NpdGlvbiAqIGNvbXBvbmVudE4gKyBpXTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5jb25zdCBhZGQyX2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSwgYXJyYXk6IEFycmF5VHlwZSkge1xuICB0aGlzWzBdICs9IGFycmF5WzBdO1xuICB0aGlzWzFdICs9IGFycmF5WzFdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuY29uc3QgYWRkMl9vZmZzZXRfZm4gPSBmdW5jdGlvbiAoXG4gIHRoaXM6IEFycmF5VHlwZSxcbiAgYXJyYXk6IEFycmF5VHlwZSxcbiAgc2VsZk9mZnNldDogbnVtYmVyLFxuICBhcmdPZmZzZXQ6IG51bWJlclxuKSB7XG4gIHRoaXNbc2VsZk9mZnNldF0gKz0gYXJyYXlbYXJnT2Zmc2V0XTtcbiAgdGhpc1tzZWxmT2Zmc2V0ICsgMV0gKz0gYXJyYXlbYXJnT2Zmc2V0ICsgMV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5jb25zdCBhZGQzX2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSwgYXJyYXk6IEFycmF5VHlwZSkge1xuICB0aGlzWzBdICs9IGFycmF5WzBdO1xuICB0aGlzWzFdICs9IGFycmF5WzFdO1xuICB0aGlzWzJdICs9IGFycmF5WzJdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuY29uc3QgYWRkM19vZmZzZXRfZm4gPSBmdW5jdGlvbiAoXG4gIHRoaXM6IEFycmF5VHlwZSxcbiAgYXJyYXk6IEFycmF5VHlwZSxcbiAgc2VsZk9mZnNldDogbnVtYmVyLFxuICBhcmdPZmZzZXQ6IG51bWJlclxuKSB7XG4gIHRoaXNbc2VsZk9mZnNldF0gKz0gYXJyYXlbYXJnT2Zmc2V0XTtcbiAgdGhpc1tzZWxmT2Zmc2V0ICsgMV0gKz0gYXJyYXlbYXJnT2Zmc2V0ICsgMV07XG4gIHRoaXNbc2VsZk9mZnNldCArIDJdICs9IGFycmF5W2FyZ09mZnNldCArIDJdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuY29uc3QgYWRkNF9mbiA9IGZ1bmN0aW9uICh0aGlzOiBBcnJheVR5cGUsIGFycmF5OiBBcnJheVR5cGUpIHtcbiAgdGhpc1swXSArPSBhcnJheVswXTtcbiAgdGhpc1sxXSArPSBhcnJheVsxXTtcbiAgdGhpc1syXSArPSBhcnJheVsyXTtcbiAgdGhpc1szXSArPSBhcnJheVszXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbmNvbnN0IGFkZDRfb2Zmc2V0X2ZuID0gZnVuY3Rpb24gKFxuICB0aGlzOiBBcnJheVR5cGUsXG4gIGFycmF5OiBBcnJheVR5cGUsXG4gIHNlbGZPZmZzZXQ6IG51bWJlcixcbiAgYXJnT2Zmc2V0OiBudW1iZXJcbikge1xuICB0aGlzW3NlbGZPZmZzZXRdICs9IGFycmF5W2FyZ09mZnNldF07XG4gIHRoaXNbc2VsZk9mZnNldCArIDFdICs9IGFycmF5W2FyZ09mZnNldCArIDFdO1xuICB0aGlzW3NlbGZPZmZzZXQgKyAyXSArPSBhcnJheVthcmdPZmZzZXQgKyAyXTtcbiAgdGhpc1tzZWxmT2Zmc2V0ICsgM10gKz0gYXJyYXlbYXJnT2Zmc2V0ICsgM107XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5jb25zdCBtdWxBcnJheTNXaXRoU2NhbGFyX29mZnNldF9mbiA9IGZ1bmN0aW9uICh0aGlzOiBBcnJheVR5cGUsIG9mZnNldDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gIHRoaXNbb2Zmc2V0XSAqPSB2YWx1ZTtcbiAgdGhpc1tvZmZzZXQgKyAxXSAqPSB2YWx1ZTtcbiAgdGhpc1tvZmZzZXQgKyAyXSAqPSB2YWx1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbmNvbnN0IG11bEFycmF5NFdpdGhTY2FsYXJfb2Zmc2V0X2ZuID0gZnVuY3Rpb24gKHRoaXM6IEFycmF5VHlwZSwgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgdGhpc1tvZmZzZXRdICo9IHZhbHVlO1xuICB0aGlzW29mZnNldCArIDFdICo9IHZhbHVlO1xuICB0aGlzW29mZnNldCArIDJdICo9IHZhbHVlO1xuICB0aGlzW29mZnNldCArIDNdICo9IHZhbHVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuY29uc3QgbXVsQXJyYXlOV2l0aFNjYWxhcl9vZmZzZXRfZm4gPSBmdW5jdGlvbiAoXG4gIHRoaXM6IEFycmF5VHlwZSxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIGNvbXBvbmVudE46IG51bWJlcixcbiAgdmFsdWU6IG51bWJlclxuKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9uZW50TjsgaSsrKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSAqPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBtdWxUaGF0QW5kVGhpc1RvT3V0QXNNYXQ0NF9vZmZzZXRBc0NvbXBvc2l0aW9uX2ZuID0gZnVuY3Rpb24gKFxuICB0aGlzOiBBcnJheVR5cGUsXG4gIHRoaXNPZmZzZXRBc0NvbXBvc2l0aW9uOiBudW1iZXIsXG4gIHRoYXQ6IEFycmF5VHlwZSxcbiAgdGhhdE9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlcixcbiAgb3V0OiBBcnJheVR5cGVcbikge1xuICBjb25zdCBsdiA9IHRoYXQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICBjb25zdCBydiA9IHRoaXM7XG4gIGNvbnN0IGwgPSB0aGF0T2Zmc2V0QXNDb21wb3NpdGlvbiAqIDE2O1xuICBjb25zdCByID0gdGhpc09mZnNldEFzQ29tcG9zaXRpb24gKiAxNjtcblxuICBvdXRbMF0gID0gbHZbbCAgXSAqIHJ2W3IgICBdICsgbHZbbCs0XSAqIHJ2W3IrMSBdICsgbHZbbCs4IF0gKiBydltyKzIgXSArIGx2W2wrMTJdICogcnZbciszXTsgLy8gbTAwXG4gIG91dFsxXSAgPSBsdltsKzFdICogcnZbciAgIF0gKyBsdltsKzVdICogcnZbcisxIF0gKyBsdltsKzkgXSAqIHJ2W3IrMiBdICsgbHZbbCsxM10gKiBydltyKzNdOyAvLyBtMTBcbiAgb3V0WzJdICA9IGx2W2wrMl0gKiBydltyICAgXSArIGx2W2wrNl0gKiBydltyKzEgXSArIGx2W2wrMTBdICogcnZbcisyIF0gKyBsdltsKzE0XSAqIHJ2W3IrM107IC8vIG0yMFxuICBvdXRbM10gID0gbHZbbCszXSAqIHJ2W3IgICBdICsgbHZbbCs3XSAqIHJ2W3IrMSBdICsgbHZbbCsxMV0gKiBydltyKzIgXSArIGx2W2wrMTVdICogcnZbciszXTsgLy8gbTMwXG5cbiAgb3V0WzRdICA9IGx2W2wgIF0gKiBydltyKzQgXSArIGx2W2wrNF0gKiBydltyKzUgXSArIGx2W2wrOCBdICogcnZbcis2IF0gKyBsdltsKzEyXSAqIHJ2W3IrN107IC8vIG0wMVxuICBvdXRbNV0gID0gbHZbbCsxXSAqIHJ2W3IrNCBdICsgbHZbbCs1XSAqIHJ2W3IrNSBdICsgbHZbbCs5IF0gKiBydltyKzYgXSArIGx2W2wrMTNdICogcnZbcis3XTsgLy8gbTExXG4gIG91dFs2XSAgPSBsdltsKzJdICogcnZbcis0IF0gKyBsdltsKzZdICogcnZbcis1IF0gKyBsdltsKzEwXSAqIHJ2W3IrNiBdICsgbHZbbCsxNF0gKiBydltyKzddOyAvLyBtMjFcbiAgb3V0WzddICA9IGx2W2wrM10gKiBydltyKzQgXSArIGx2W2wrN10gKiBydltyKzUgXSArIGx2W2wrMTFdICogcnZbcis2IF0gKyBsdltsKzE1XSAqIHJ2W3IrN107IC8vIG0zMVxuXG4gIG91dFs4IF0gPSBsdltsICBdICogcnZbcis4IF0gKyBsdltsKzRdICogcnZbcis5IF0gKyBsdltsKzggXSAqIHJ2W3IrMTBdICsgbHZbbCsxMl0gKiBydltyKzExXTsgLy8gbTAyXG4gIG91dFs5IF0gPSBsdltsKzFdICogcnZbcis4IF0gKyBsdltsKzVdICogcnZbcis5IF0gKyBsdltsKzkgXSAqIHJ2W3IrMTBdICsgbHZbbCsxM10gKiBydltyKzExXTsgLy8gbTEyXG4gIG91dFsxMF0gPSBsdltsKzJdICogcnZbcis4IF0gKyBsdltsKzZdICogcnZbcis5IF0gKyBsdltsKzEwXSAqIHJ2W3IrMTBdICsgbHZbbCsxNF0gKiBydltyKzExXTsgLy8gbTIyXG4gIG91dFsxMV0gPSBsdltsKzNdICogcnZbcis4IF0gKyBsdltsKzddICogcnZbcis5IF0gKyBsdltsKzExXSAqIHJ2W3IrMTBdICsgbHZbbCsxNV0gKiBydltyKzExXTsgLy8gbTMyXG5cbiAgb3V0WzEyXSA9IGx2W2wgIF0gKiBydltyKzEyXSArIGx2W2wrNF0gKiBydltyKzEzXSArIGx2W2wrOCBdICogcnZbcisxNF0gKyBsdltsKzEyXSAqIHJ2W3IrMTVdOyAvLyBtMDNcbiAgb3V0WzEzXSA9IGx2W2wrMV0gKiBydltyKzEyXSArIGx2W2wrNV0gKiBydltyKzEzXSArIGx2W2wrOSBdICogcnZbcisxNF0gKyBsdltsKzEzXSAqIHJ2W3IrMTVdOyAvLyBtMTNcbiAgb3V0WzE0XSA9IGx2W2wrMl0gKiBydltyKzEyXSArIGx2W2wrNl0gKiBydltyKzEzXSArIGx2W2wrMTBdICogcnZbcisxNF0gKyBsdltsKzE0XSAqIHJ2W3IrMTVdOyAvLyBtMjNcbiAgb3V0WzE1XSA9IGx2W2wrM10gKiBydltyKzEyXSArIGx2W2wrN10gKiBydltyKzEzXSArIGx2W2wrMTFdICogcnZbcisxNF0gKyBsdltsKzE1XSAqIHJ2W3IrMTVdOyAvLyBtMzNcbn07XG5cbmNvbnN0IHFsZXJwX29mZnNldEFzQ29tcG9zaXRpb25fZm4gPSBmdW5jdGlvbiAoXG4gIHRoaXM6IEFycmF5VHlwZSxcbiAgYXJyYXk6IEFycmF5VHlwZSxcbiAgcmF0aW86IG51bWJlcixcbiAgc2VsZk9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlcixcbiAgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyXG4pIHtcbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5KDQpO1xuICBsZXQgZG90UHJvZHVjdCA9XG4gICAgdGhpc1swICsgc2VsZk9mZnNldEFzQ29tcG9zaXRpb24gKiA0XSAqIGFycmF5WzAgKyBhcmdPZmZzZXRBc0NvbXBvc2l0aW9uICogNF0gK1xuICAgIHRoaXNbMSArIHNlbGZPZmZzZXRBc0NvbXBvc2l0aW9uICogNF0gKiBhcnJheVsxICsgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdICtcbiAgICB0aGlzWzIgKyBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdICogYXJyYXlbMiArIGFyZ09mZnNldEFzQ29tcG9zaXRpb24gKiA0XSArXG4gICAgdGhpc1szICsgc2VsZk9mZnNldEFzQ29tcG9zaXRpb24gKiA0XSAqIGFycmF5WzMgKyBhcmdPZmZzZXRBc0NvbXBvc2l0aW9uICogNF07XG4gIGNvbnN0IHNzID0gMS4wIC0gZG90UHJvZHVjdCAqIGRvdFByb2R1Y3Q7XG5cbiAgaWYgKHNzID09PSAwLjApIHtcbiAgICBvdXRbMF0gPSB0aGlzWzAgKyBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdO1xuICAgIG91dFsxXSA9IHRoaXNbMSArIHNlbGZPZmZzZXRBc0NvbXBvc2l0aW9uICogNF07XG4gICAgb3V0WzJdID0gdGhpc1syICsgc2VsZk9mZnNldEFzQ29tcG9zaXRpb24gKiA0XTtcbiAgICBvdXRbM10gPSB0aGlzWzMgKyBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdO1xuICB9IGVsc2Uge1xuICAgIGlmIChkb3RQcm9kdWN0ID4gMSkge1xuICAgICAgZG90UHJvZHVjdCA9IDAuOTk5O1xuICAgIH0gZWxzZSBpZiAoZG90UHJvZHVjdCA8IC0xKSB7XG4gICAgICBkb3RQcm9kdWN0ID0gLTAuOTk5O1xuICAgIH1cblxuICAgIGxldCB0aGV0YSA9IE1hdGguYWNvcyhkb3RQcm9kdWN0KTtcbiAgICBjb25zdCBzaW5UaGV0YSA9IE1hdGguc2luKHRoZXRhKTtcblxuICAgIGxldCBzMjtcbiAgICBpZiAoZG90UHJvZHVjdCA8IDAuMCkge1xuICAgICAgZG90UHJvZHVjdCAqPSAtMTtcbiAgICAgIHRoZXRhID0gTWF0aC5hY29zKGRvdFByb2R1Y3QpO1xuICAgICAgczIgPSAoLTEgKiBNYXRoLnNpbih0aGV0YSAqIHJhdGlvKSkgLyBzaW5UaGV0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgczIgPSBNYXRoLnNpbih0aGV0YSAqIHJhdGlvKSAvIHNpblRoZXRhO1xuICAgIH1cbiAgICBjb25zdCBzMSA9IE1hdGguc2luKHRoZXRhICogKDEuMCAtIHJhdGlvKSkgLyBzaW5UaGV0YTtcblxuICAgIG91dFswXSA9XG4gICAgICB0aGlzWzAgKyBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdICogczEgKyBhcnJheVswICsgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdICogczI7XG4gICAgb3V0WzFdID1cbiAgICAgIHRoaXNbMSArIHNlbGZPZmZzZXRBc0NvbXBvc2l0aW9uICogNF0gKiBzMSArIGFycmF5WzEgKyBhcmdPZmZzZXRBc0NvbXBvc2l0aW9uICogNF0gKiBzMjtcbiAgICBvdXRbMl0gPVxuICAgICAgdGhpc1syICsgc2VsZk9mZnNldEFzQ29tcG9zaXRpb24gKiA0XSAqIHMxICsgYXJyYXlbMiArIGFyZ09mZnNldEFzQ29tcG9zaXRpb24gKiA0XSAqIHMyO1xuICAgIG91dFszXSA9XG4gICAgICB0aGlzWzMgKyBzZWxmT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdICogczEgKyBhcnJheVszICsgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDRdICogczI7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcblxuY29uc3Qgc2NhbGFyX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbiA9IGZ1bmN0aW9uIChcbiAgdGhpczogQXJyYXlUeXBlLFxuICBhcnJheTogQXJyYXlUeXBlLFxuICByYXRpbzogbnVtYmVyLFxuICBzZWxmT2Zmc2V0OiBudW1iZXIsXG4gIGFyZ09mZnNldDogbnVtYmVyXG4pIHtcbiAgcmV0dXJuIHRoaXNbc2VsZk9mZnNldF0gKiAoMSAtIHJhdGlvKSArIGFycmF5W2FyZ09mZnNldF0gKiByYXRpbztcbn07XG5cbmNvbnN0IGFycmF5M19sZXJwX29mZnNldEFzQ29tcG9zaXRpb25fZm4gPSBmdW5jdGlvbiAoXG4gIHRoaXM6IEFycmF5VHlwZSxcbiAgYXJyYXk6IEFycmF5VHlwZSxcbiAgcmF0aW86IG51bWJlcixcbiAgc2VsZk9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlcixcbiAgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyXG4pIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KDMpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIHJldFtpXSA9XG4gICAgICB0aGlzW3NlbGZPZmZzZXRBc0NvbXBvc2l0aW9uICogMyArIGldICogKDEgLSByYXRpbykgK1xuICAgICAgYXJyYXlbYXJnT2Zmc2V0QXNDb21wb3NpdGlvbiAqIDMgKyBpXSAqIHJhdGlvO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG5jb25zdCBhcnJheU5fbGVycF9vZmZzZXRBc0NvbXBvc2l0aW9uX2ZuID0gZnVuY3Rpb24gKFxuICB0aGlzOiBBcnJheVR5cGUsXG4gIGFycmF5OiBBcnJheVR5cGUsXG4gIGNvbXBvbmVudE46IG51bWJlcixcbiAgcmF0aW86IG51bWJlcixcbiAgc2VsZk9mZnNldEFzQ29tcG9zaXRpb246IG51bWJlcixcbiAgYXJnT2Zmc2V0QXNDb21wb3NpdGlvbjogbnVtYmVyXG4pIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KGNvbXBvbmVudE4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudE47IGkrKykge1xuICAgIHJldFtpXSA9XG4gICAgICB0aGlzW3NlbGZPZmZzZXRBc0NvbXBvc2l0aW9uICogY29tcG9uZW50TiArIGldICogKDEgLSByYXRpbykgK1xuICAgICAgYXJyYXlbYXJnT2Zmc2V0QXNDb21wb3NpdGlvbiAqIGNvbXBvbmVudE4gKyBpXSAqIHJhdGlvO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG5jb25zdCBub3JtYWxpemVBcnJheTRfZm4gPSBmdW5jdGlvbiAodGhpczogQXJyYXk0PG51bWJlcj4pIHtcbiAgY29uc3QgbGVuZ3RoID0gTWF0aC5oeXBvdCh0aGlzWzBdLCB0aGlzWzFdLCB0aGlzWzJdLCB0aGlzWzNdKTtcbiAgdGhpc1swXSAvPSBsZW5ndGg7XG4gIHRoaXNbMV0gLz0gbGVuZ3RoO1xuICB0aGlzWzJdIC89IGxlbmd0aDtcbiAgdGhpc1szXSAvPSBsZW5ndGg7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5jb25zdCBhcnJheVR5cGVzID0gW1xuICBBcnJheSxcbiAgRmxvYXQzMkFycmF5LFxuICBGbG9hdDY0QXJyYXksXG4gIEludDhBcnJheSxcbiAgSW50MTZBcnJheSxcbiAgSW50MzJBcnJheSxcbiAgVWludDhBcnJheSxcbiAgVWludDE2QXJyYXksXG4gIFVpbnQzMkFycmF5LFxuXTtcbmNvbnN0IG9wZXJhdG9ycyA9IFtcbiAgZ2V0MV9vZmZzZXRBc0NvbXBvc2l0aW9uLFxuICBnZXQyX29mZnNldEFzQ29tcG9zaXRpb24sXG4gIGdldDEsXG4gIGdldDFfb2Zmc2V0LFxuICBnZXQyLFxuICBnZXQyX29mZnNldCxcbiAgZ2V0MyxcbiAgZ2V0M19vZmZzZXQsXG4gIGdldDNfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgZ2V0NCxcbiAgZ2V0NF9vZmZzZXQsXG4gIGdldDRfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgZ2V0Tl9vZmZzZXQsXG4gIGdldE5fb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgYWRkMixcbiAgYWRkMl9vZmZzZXQsXG4gIGFkZDMsXG4gIGFkZDNfb2Zmc2V0LFxuICBhZGQ0LFxuICBhZGQ0X29mZnNldCxcbiAgbXVsQXJyYXkzV2l0aFNjYWxhcl9vZmZzZXQsXG4gIG11bEFycmF5NFdpdGhTY2FsYXJfb2Zmc2V0LFxuICBtdWxBcnJheU5XaXRoU2NhbGFyX29mZnNldCxcbiAgbXVsVGhhdEFuZFRoaXNUb091dEFzTWF0NDRfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgcWxlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgc2NhbGFyX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgYXJyYXkzX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgYXJyYXlOX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbixcbiAgbm9ybWFsaXplQXJyYXk0LFxuXTtcbmNvbnN0IGZ1bmN0aW9ucyA9IFtcbiAgZ2V0MV9vZmZzZXRBc0NvbXBvc2l0aW9uX2ZuLFxuICBnZXQyX29mZnNldEFzQ29tcG9zaXRpb25fZm4sXG4gIGdldDFfZm4sXG4gIGdldDFfb2Zmc2V0X2ZuLFxuICBnZXQyX2ZuLFxuICBnZXQyX29mZnNldF9mbixcbiAgZ2V0M19mbixcbiAgZ2V0M19vZmZzZXRfZm4sXG4gIGdldDNfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgZ2V0NF9mbixcbiAgZ2V0NF9vZmZzZXRfZm4sXG4gIGdldDRfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgZ2V0Tl9vZmZzZXRfZm4sXG4gIGdldE5fb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgYWRkMl9mbixcbiAgYWRkMl9vZmZzZXRfZm4sXG4gIGFkZDNfZm4sXG4gIGFkZDNfb2Zmc2V0X2ZuLFxuICBhZGQ0X2ZuLFxuICBhZGQ0X29mZnNldF9mbixcbiAgbXVsQXJyYXkzV2l0aFNjYWxhcl9vZmZzZXRfZm4sXG4gIG11bEFycmF5NFdpdGhTY2FsYXJfb2Zmc2V0X2ZuLFxuICBtdWxBcnJheU5XaXRoU2NhbGFyX29mZnNldF9mbixcbiAgbXVsVGhhdEFuZFRoaXNUb091dEFzTWF0NDRfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgcWxlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgc2NhbGFyX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgYXJyYXkzX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgYXJyYXlOX2xlcnBfb2Zmc2V0QXNDb21wb3NpdGlvbl9mbixcbiAgbm9ybWFsaXplQXJyYXk0X2ZuLFxuXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheVR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gIGZvciAobGV0IGogPSAwOyBqIDwgb3BlcmF0b3JzLmxlbmd0aDsgaisrKSB7XG4gICAgYXJyYXlUeXBlc1tpXS5wcm90b3R5cGVbb3BlcmF0b3JzW2pdIGFzIHVua25vd24gYXMgbnVtYmVyXSA9IGZ1bmN0aW9uc1tqXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSwgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBCdWZmZXJWaWV3IH0gZnJvbSAnLi9CdWZmZXJWaWV3JztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlVmVjdG9yMic7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL011dGFibGVWZWN0b3I0JztcbmltcG9ydCB7IE1hdHJpeDMzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzMyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MzMgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXg0NCc7XG5pbXBvcnQge1xuICBCeXRlLFxuICBJbmRleCxcbiAgQ291bnQsXG4gIFR5cGVkQXJyYXksXG4gIFNpemUsXG4gIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgQXJyYXkyLFxuICBBcnJheTMsXG4gIEFycmF5NCxcbn0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQ0JztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tICcuLi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG50eXBlIERhdGFWaWV3R2V0dGVyID0gKGJ5dGVPZmZzZXQ6IEJ5dGUsIGxpdHRsZUVuZGlhbj86IGJvb2xlYW4pID0+IG51bWJlcjtcbnR5cGUgRGF0YVZpZXdTZXR0ZXIgPSAoYnl0ZU9mZnNldDogQnl0ZSwgdmFsdWU6IG51bWJlciwgbGl0dGxlRW5kaWFuPzogYm9vbGVhbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgSW5kaWNlc0FjY2Vzc09wdGlvbiA9IHtcbiAgaW5kaWNlc0FjY2Vzc29yPzogQWNjZXNzb3I7XG4gIGVuZGlhbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgQWNjZXNzb3Ige1xuICBwcml2YXRlIF9fYnVmZmVyVmlldzogQnVmZmVyVmlldztcbiAgcHJpdmF0ZSBfX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXI6IEJ5dGU7XG4gIHByaXZhdGUgX19jb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0gPSBDb21wb3NpdGlvblR5cGUuVW5rbm93bjtcbiAgcHJpdmF0ZSBfX2NvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZS5Vbmtub3duO1xuICBwcml2YXRlIF9fY291bnQ6IENvdW50ID0gMDtcbiAgcHJpdmF0ZSBfX3JhdzogQXJyYXlCdWZmZXI7XG4gIHByaXZhdGUgX19kYXRhVmlldz86IERhdGFWaWV3O1xuICBwcml2YXRlIF9fdHlwZWRBcnJheTogVHlwZWRBcnJheTtcbiAgcHJpdmF0ZSBfX3Rha2VuQ291bnQ6IENvdW50ID0gMDtcbiAgcHJpdmF0ZSBfX2J5dGVTdHJpZGU6IEJ5dGUgPSAwOyAvLyBBY2Nlc3NvciBoYXMgdGhlIGJ5dGVTdHJpZGUuIEJ1ZmZlclZpZXcgZG9lc24ndC4gRm9yIHN1cHBvcnRpbmcgZ2xURjEsIG5vdCBvbmx5IGdsVEYyXG4gIHByaXZhdGUgX190eXBlZEFycmF5Q2xhc3M/OiBUeXBlZEFycmF5Q29uc3RydWN0b3I7XG4gIHByaXZhdGUgX19kYXRhVmlld0dldHRlcjogRGF0YVZpZXdHZXR0ZXI7XG4gIHByaXZhdGUgX19kYXRhVmlld1NldHRlcjogRGF0YVZpZXdTZXR0ZXI7XG4gIHByaXZhdGUgX19tYXg6IE11dGFibGVWZWN0b3I0ID0gTXV0YWJsZVZlY3RvcjQuZnJvbUNvcHlBcnJheShbXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgLU51bWJlci5NQVhfVkFMVUUsXG4gIF0pO1xuICBwcml2YXRlIF9fbWluOiBNdXRhYmxlVmVjdG9yNCA9IE11dGFibGVWZWN0b3I0LmZyb21Db3B5QXJyYXkoW1xuICAgIE51bWJlci5NQVhfVkFMVUUsXG4gICAgTnVtYmVyLk1BWF9WQUxVRSxcbiAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIE51bWJlci5NQVhfVkFMVUUsXG4gIF0pO1xuICBwcml2YXRlIF9fYXJyYXlMZW5ndGggPSAxO1xuICBwcml2YXRlIF9fbm9ybWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF9faXNNaW5NaXhEaXJ0eSA9IHRydWU7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBWZWN0b3I0XzAgPSBNdXRhYmxlVmVjdG9yNC56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wVmVjdG9yM18wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcFZlY3RvcjJfMCA9IE11dGFibGVWZWN0b3IyLnplcm8oKTtcbiAgcHJpdmF0ZSBfX3ZlcnNpb24gPSAwO1xuXG4gIHB1YmxpYyBfcHJpbWl0aXZlPzogV2Vha1JlZjxQcmltaXRpdmU+O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBidWZmZXJWaWV3LFxuICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXcsXG4gICAgY29tcG9zaXRpb25UeXBlLFxuICAgIGNvbXBvbmVudFR5cGUsXG4gICAgYnl0ZVN0cmlkZSxcbiAgICBjb3VudCxcbiAgICByYXcsXG4gICAgbWF4LFxuICAgIG1pbixcbiAgICBhcnJheUxlbmd0aCxcbiAgICBub3JtYWxpemVkLFxuICB9OiB7XG4gICAgYnVmZmVyVmlldzogQnVmZmVyVmlldztcbiAgICBieXRlT2Zmc2V0SW5CdWZmZXJWaWV3OiBCeXRlO1xuICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bTtcbiAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICBieXRlU3RyaWRlOiBCeXRlO1xuICAgIGNvdW50OiBDb3VudDtcbiAgICByYXc6IEFycmF5QnVmZmVyO1xuICAgIG1heD86IG51bWJlcltdO1xuICAgIG1pbj86IG51bWJlcltdO1xuICAgIGFycmF5TGVuZ3RoOiBTaXplO1xuICAgIG5vcm1hbGl6ZWQ6IGJvb2xlYW47XG4gIH0pIHtcbiAgICB0aGlzLl9fYnVmZmVyVmlldyA9IGJ1ZmZlclZpZXc7XG4gICAgdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIgPVxuICAgICAgYnVmZmVyVmlldy5ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyICsgYnl0ZU9mZnNldEluQnVmZmVyVmlldztcbiAgICB0aGlzLl9fY29tcG9zaXRpb25UeXBlID0gY29tcG9zaXRpb25UeXBlO1xuICAgIHRoaXMuX19jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTtcbiAgICB0aGlzLl9fY291bnQgPSBjb3VudDtcbiAgICB0aGlzLl9fYXJyYXlMZW5ndGggPSBhcnJheUxlbmd0aDtcblxuICAgIGlmIChJcy5leGlzdChtYXgpKSB7XG4gICAgICB0aGlzLl9fbWF4LnNldENvbXBvbmVudHMoXG4gICAgICAgIG1heFswXSA/PyAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbWF4WzFdID8/IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBtYXhbMl0gPz8gLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIG1heFszXSA/PyAtTnVtYmVyLk1BWF9WQUxVRVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoSXMuZXhpc3QobWluKSkge1xuICAgICAgdGhpcy5fX21pbi5zZXRDb21wb25lbnRzKFxuICAgICAgICBtaW5bMF0gPz8gTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgbWluWzFdID8/IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIG1pblsyXSA/PyBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBtaW5bM10gPz8gTnVtYmVyLk1BWF9WQUxVRVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoSXMuZXhpc3QobWF4KSAmJiBJcy5leGlzdChtaW4pKSB7XG4gICAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX19yYXcgPSByYXc7XG4gICAgdGhpcy5fX25vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xuXG4gICAgdGhpcy5fX2J5dGVTdHJpZGUgPSBieXRlU3RyaWRlO1xuXG4gICAgaWYgKHRoaXMuX19ieXRlU3RyaWRlID09PSAwKSB7XG4gICAgICB0aGlzLl9fYnl0ZVN0cmlkZSA9XG4gICAgICAgIHRoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgKlxuICAgICAgICB0aGlzLl9fY29tcG9uZW50VHlwZS5nZXRTaXplSW5CeXRlcygpICpcbiAgICAgICAgdGhpcy5fX2FycmF5TGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVkQXJyYXlDbGFzcyA9IHRoaXMuZ2V0VHlwZWRBcnJheUNsYXNzKHRoaXMuX19jb21wb25lbnRUeXBlKTtcbiAgICB0aGlzLl9fdHlwZWRBcnJheUNsYXNzID0gdHlwZWRBcnJheUNsYXNzO1xuXG4gICAgLy8vIENoZWNrXG4gICAgY29uc3QgbWF4RXhjZWVkZWRTaXplT25Bb1MgPVxuICAgICAgdGhpcy5fX2J5dGVTdHJpZGUgLVxuICAgICAgdGhpcy5fX2NvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSAqIHRoaXMuX19jb21wb25lbnRUeXBlLmdldFNpemVJbkJ5dGVzKCk7XG4gICAgY29uc3Qgc2l6ZUZyb21BY2Nlc3NvckJlZ2luVG9BcnJheUJ1ZmZlckVuZCA9XG4gICAgICB0aGlzLl9fcmF3LmJ5dGVMZW5ndGggLSB0aGlzLl9fYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlcjtcbiAgICBjb25zdCBtYXhMaW1pdFNpemVUb0FjY2VzcyA9IHRoaXMuYnl0ZVN0cmlkZSAqIHRoaXMuX19jb3VudCAtIG1heEV4Y2VlZGVkU2l6ZU9uQW9TO1xuICAgIGlmIChzaXplRnJvbUFjY2Vzc29yQmVnaW5Ub0FycmF5QnVmZmVyRW5kIDwgbWF4TGltaXRTaXplVG9BY2Nlc3MpIHtcbiAgICAgIExvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlcXVlc3RpbmcgYSBkYXRhIHNpemUgdGhhdCBleGNlZWRzIHRoZSByZW1haW5pbmcgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlcjogJHtcbiAgICAgICAgICB0aGlzLmJ1ZmZlclZpZXcuYnVmZmVyLm5hbWVcbiAgICAgICAgfS5cbiAgICAgICAgRXhjZWVkZWQgU2l6ZTogJHttYXhMaW1pdFNpemVUb0FjY2VzcyAtIHNpemVGcm9tQWNjZXNzb3JCZWdpblRvQXJyYXlCdWZmZXJFbmR9XG4gICAgICAgIHRoaXMuX19yYXcuYnl0ZUxlbmd0aDogJHt0aGlzLl9fcmF3LmJ5dGVMZW5ndGh9XG4gICAgICAgIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyOiAke3RoaXMuYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlcn1cbiAgICAgICAgdGhpcy5ieXRlU3RyaWRlOiAke3RoaXMuYnl0ZVN0cmlkZX1cbiAgICAgICAgdGhpcy5fX2NvdW50OiAke3RoaXMuX19jb3VudH1cbiAgICAgICAgdGhpcy5fX3Jhdy5ieXRlTGVuZ3RoIC0gdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXI6ICR7XG4gICAgICAgICAgdGhpcy5fX3Jhdy5ieXRlTGVuZ3RoIC0gdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXJcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVTdHJpZGUgKiB0aGlzLl9fY291bnQ6ICR7dGhpcy5ieXRlU3RyaWRlICogdGhpcy5fX2NvdW50fVxuICAgICAgICBtYXhFeGNlZWRlZFNpemVPbkFvUzogJHttYXhFeGNlZWRlZFNpemVPbkFvU31cbiAgICAgICAgYFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fX2RhdGFWaWV3ID0gbmV3IERhdGFWaWV3KFxuICAgICAgdGhpcy5fX3JhdyxcbiAgICAgIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyLFxuICAgICAgTWF0aC5taW4oXG4gICAgICAgIHRoaXMuX19ieXRlU3RyaWRlICogdGhpcy5fX2NvdW50LFxuICAgICAgICB0aGlzLl9fcmF3LmJ5dGVMZW5ndGggLSB0aGlzLl9fYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlclxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLl9fdHlwZWRBcnJheSA9IG5ldyB0eXBlZEFycmF5Q2xhc3MhKFxuICAgICAgdGhpcy5fX3JhdyxcbiAgICAgIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyLFxuICAgICAgdGhpcy5fX2NvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSAqIHRoaXMuX19jb3VudFxuICAgICk7XG4gICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyID0gKHRoaXMuX19kYXRhVmlldyBhcyBhbnkpW1xuICAgICAgdGhpcy5nZXREYXRhVmlld0dldHRlcih0aGlzLl9fY29tcG9uZW50VHlwZSkhXG4gICAgXS5iaW5kKHRoaXMuX19kYXRhVmlldyk7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyID0gKHRoaXMuX19kYXRhVmlldyBhcyBhbnkpW1xuICAgICAgdGhpcy5nZXREYXRhVmlld1NldHRlcih0aGlzLl9fY29tcG9uZW50VHlwZSkhXG4gICAgXS5iaW5kKHRoaXMuX19kYXRhVmlldyk7XG4gIH1cblxuICBwcml2YXRlIF9fb25VcGRhdGVkKCkge1xuICAgIHRoaXMuX192ZXJzaW9uKys7XG4gICAgaWYgKHRoaXMuX3ByaW1pdGl2ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9wcmltaXRpdmUuZGVyZWYoKT8ub25BY2Nlc3NvclVwZGF0ZWQodGhpcy5fX3ZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldFR5cGVkQXJyYXlDbGFzcyhjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bSk6IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChjb21wb25lbnRUeXBlKSB7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuQnl0ZTpcbiAgICAgICAgcmV0dXJuIEludDhBcnJheTtcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGU6XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5O1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLlNob3J0OlxuICAgICAgICByZXR1cm4gSW50MTZBcnJheTtcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5VbnNpZ25lZFNob3J0OlxuICAgICAgICByZXR1cm4gVWludDE2QXJyYXk7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW50OlxuICAgICAgICByZXR1cm4gSW50MzJBcnJheTtcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5VbnNpZ25lZEludDpcbiAgICAgICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLkZsb2F0OlxuICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5O1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLkRvdWJsZTpcbiAgICAgICAgcmV0dXJuIEZsb2F0NjRBcnJheTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIExvZ2dlci5lcnJvcignVW5leHBlY3RlZCBDb21wb25lbnRUeXBlIScpO1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGFWaWV3R2V0dGVyKGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHtcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5CeXRlOlxuICAgICAgICByZXR1cm4gJ2dldEludDgnO1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZTpcbiAgICAgICAgcmV0dXJuICdnZXRVaW50OCc7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuU2hvcnQ6XG4gICAgICAgIHJldHVybiAnZ2V0SW50MTYnO1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLlVuc2lnbmVkU2hvcnQ6XG4gICAgICAgIHJldHVybiAnZ2V0VWludDE2JztcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnQ6XG4gICAgICAgIHJldHVybiAnZ2V0SW50MzInO1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLlVuc2lnbmVkSW50OlxuICAgICAgICByZXR1cm4gJ2dldFVpbnQzMic7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiAnZ2V0RmxvYXQzMic7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuRG91YmxlOlxuICAgICAgICByZXR1cm4gJ2dldEZsb2F0NjQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgTG9nZ2VyLmVycm9yKCdVbmV4cGVjdGVkIENvbXBvbmVudFR5cGUhJyk7XG4gICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGF0YVZpZXdTZXR0ZXIoY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAoY29tcG9uZW50VHlwZSkge1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLkJ5dGU6XG4gICAgICAgIHJldHVybiAnc2V0SW50OCc7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuVW5zaWduZWRCeXRlOlxuICAgICAgICByZXR1cm4gJ3NldFVpbnQ4JztcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5TaG9ydDpcbiAgICAgICAgcmV0dXJuICdzZXRJbnQxNic7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuVW5zaWduZWRTaG9ydDpcbiAgICAgICAgcmV0dXJuICdzZXRVaW50MTYnO1xuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLkludDpcbiAgICAgICAgcmV0dXJuICdzZXRJbnQzMic7XG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuVW5zaWduZWRJbnQ6XG4gICAgICAgIHJldHVybiAnc2V0VWludDMyJztcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuICdzZXRGbG9hdDMyJztcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5Eb3VibGU6XG4gICAgICAgIHJldHVybiAnc2V0RmxvYXQ2NCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBMb2dnZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgQ29tcG9uZW50VHlwZSEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRha2VPbmUoKTogVHlwZWRBcnJheSB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXJPZkJ1ZmZlclZpZXcgPSB0aGlzLl9fcmF3O1xuICAgIC8vIGxldCBzdHJpZGUgPSB0aGlzLl9fY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpICogdGhpcy5fX2NvbXBvbmVudFR5cGUuZ2V0U2l6ZUluQnl0ZXMoKTtcbiAgICAvLyBpZiAodGhpcy5fX2J1ZmZlclZpZXcuaXNBb1MpIHtcbiAgICAvLyAgIHN0cmlkZSA9IHRoaXMuX19idWZmZXJWaWV3LmJ5dGVTdHJpZGU7XG4gICAgLy8gfVxuXG4gICAgaWYgKHRoaXMuX190YWtlbkNvdW50ID49IHRoaXMuX19jb3VudCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCdZb3UgYXJlIHRyeWluZyB0byBhbGxvY2F0ZSBtb3JlIHRoYW4geW91IGhhdmUgc2VjdXJlZC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc3ViVHlwZWRBcnJheSA9IG5ldyB0aGlzLl9fdHlwZWRBcnJheUNsYXNzIShcbiAgICAgIGFycmF5QnVmZmVyT2ZCdWZmZXJWaWV3LFxuICAgICAgdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIgKyB0aGlzLl9fYnl0ZVN0cmlkZSAqIHRoaXMuX190YWtlbkNvdW50LFxuICAgICAgdGhpcy5fX2NvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSAqIHRoaXMuX19hcnJheUxlbmd0aFxuICAgICk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIsIHRoaXMuX19ieXRlU3RyaWRlLCB0aGlzLl9fdGFrZW5Db3VudCwgdGhpcy5fX2FycmF5TGVuZ3RoKTtcblxuICAgIChzdWJUeXBlZEFycmF5IGFzIGFueSkuX2FjY2Vzc29yID0gdGhpcztcbiAgICAoc3ViVHlwZWRBcnJheSBhcyBhbnkpLl9pZHhfb2ZfYWNjZXNzb3IgPSB0aGlzLl9fdGFrZW5Db3VudDtcblxuICAgIHRoaXMuX190YWtlbkNvdW50ICs9IDE7XG5cbiAgICByZXR1cm4gc3ViVHlwZWRBcnJheTtcbiAgfVxuXG4gIF90YWtlRXhpc3RlZE9uZShpZHg6IG51bWJlcik6IFR5cGVkQXJyYXkge1xuICAgIGNvbnN0IGFycmF5QnVmZmVyT2ZCdWZmZXJWaWV3ID0gdGhpcy5fX3JhdztcblxuICAgIGlmIChpZHggPj0gdGhpcy5fX2NvdW50KSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ1lvdSBhcmUgdHJ5aW5nIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB5b3UgaGF2ZSBzZWN1cmVkLicpO1xuICAgIH1cbiAgICBjb25zdCBzdWJUeXBlZEFycmF5ID0gbmV3IHRoaXMuX190eXBlZEFycmF5Q2xhc3MhKFxuICAgICAgYXJyYXlCdWZmZXJPZkJ1ZmZlclZpZXcsXG4gICAgICB0aGlzLl9fYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlciArIHRoaXMuX19ieXRlU3RyaWRlICogaWR4LFxuICAgICAgdGhpcy5fX2NvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSAqIHRoaXMuX19hcnJheUxlbmd0aFxuICAgICk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIsIHRoaXMuX19ieXRlU3RyaWRlLCB0aGlzLl9fdGFrZW5Db3VudCwgdGhpcy5fX2FycmF5TGVuZ3RoKTtcblxuICAgIChzdWJUeXBlZEFycmF5IGFzIGFueSkuX2FjY2Vzc29yID0gdGhpcztcbiAgICAoc3ViVHlwZWRBcnJheSBhcyBhbnkpLl9pZHhfb2ZfYWNjZXNzb3IgPSBpZHg7XG5cbiAgICByZXR1cm4gc3ViVHlwZWRBcnJheTtcbiAgfVxuXG4gIGdldCB0YWtlbkNvdW50KCk6IENvdW50IHtcbiAgICByZXR1cm4gdGhpcy50YWtlbkNvdW50O1xuICB9XG5cbiAgZ2V0IG51bWJlck9mQ29tcG9uZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKTtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRTaXplSW5CeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbXBvbmVudFR5cGUuZ2V0U2l6ZUluQnl0ZXMoKTtcbiAgfVxuXG4gIGdldCBlbGVtZW50U2l6ZUluQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubnVtYmVyT2ZDb21wb25lbnRzICogdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgZWxlbWVudCBjb3VudFxuICAgKiBlbGVtZW50IG1heSBiZSBzY2FsYXIsIHZlYzIsIHZlYzMsIHZlYzQsIC4uLlxuICAgKi9cbiAgZ2V0IGVsZW1lbnRDb3VudCgpOiBDb3VudCB7XG4gICAgcmV0dXJuIHRoaXMuX19jb3VudDtcbiAgfVxuXG4gIGdldCBieXRlTGVuZ3RoKCk6IEJ5dGUge1xuICAgIHJldHVybiB0aGlzLl9fYnl0ZVN0cmlkZSAqIHRoaXMuX19jb3VudDtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRUeXBlKCk6IENvbXBvbmVudFR5cGVFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbXBvbmVudFR5cGU7XG4gIH1cblxuICBnZXQgY29tcG9zaXRpb25UeXBlKCk6IENvbXBvc2l0aW9uVHlwZUVudW0ge1xuICAgIHJldHVybiB0aGlzLl9fY29tcG9zaXRpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRUeXBlZEFycmF5KCk6IFR5cGVkQXJyYXkge1xuICAgIC8vIGlmICh0aGlzLl9fYnVmZmVyVmlldy5pc0FvUykge1xuICAgIC8vICAgY29uc29sZS53YXJuKFxuICAgIC8vICAgICAnQmUgY2FyZWZ1bC4gdGhpcyByZWZlcmVuY2UgYnVmZmVyVmlldyBpcyBBb1MoQXJyYXkgb24gU3RydWN0dXJlKSwgaXQgbWVhbnMgSW50ZXJsZWF2ZWQgRGF0YS4gU28geW91IGNhbiBub3QgYWNjZXNzIHlvdXIgZGF0YSBwcm9wZXJseSBieSB0aGlzIFR5cGVkQXJyYXkuJ1xuICAgIC8vICAgKTtcbiAgICAvLyB9XG4gICAgcmV0dXJuIHRoaXMuX190eXBlZEFycmF5O1xuICB9XG5cbiAgZ2V0VWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAvLyBpZiAodGhpcy5fX2J1ZmZlclZpZXcuaXNBb1MpIHtcbiAgICAvLyAgIGNvbnNvbGUud2FybihcbiAgICAvLyAgICAgJ0JlIGNhcmVmdWwuIHRoaXMgcmVmZXJlbmNlIGJ1ZmZlclZpZXcgaXMgQW9TKEFycmF5IG9uIFN0cnVjdHVyZSksIGl0IG1lYW5zIEludGVybGVhdmVkIERhdGEuIFNvIHlvdSBjYW4gbm90IGFjY2VzcyB5b3VyIGRhdGEgcHJvcGVybHkgYnkgdGhpcyBUeXBlZEFycmF5LidcbiAgICAvLyAgICk7XG4gICAgLy8gfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShcbiAgICAgIHRoaXMuYnVmZmVyVmlldy5idWZmZXIuZ2V0QXJyYXlCdWZmZXIoKSxcbiAgICAgIHRoaXMuYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlcixcbiAgICAgIHRoaXMuYnl0ZUxlbmd0aFxuICAgICk7XG4gIH1cblxuICBnZXQgaXNBb1MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzU29BO1xuICB9XG5cbiAgZ2V0IGlzU29BKCkge1xuICAgIGNvbnN0IGlzU29BID1cbiAgICAgIHRoaXMuYnl0ZVN0cmlkZSA9PT1cbiAgICAgIHRoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgKiB0aGlzLl9fY29tcG9uZW50VHlwZS5nZXRTaXplSW5CeXRlcygpO1xuICAgIHJldHVybiBpc1NvQTtcbiAgfVxuXG4gIGdldCBieXRlU3RyaWRlKCkge1xuICAgIHJldHVybiB0aGlzLl9fYnl0ZVN0cmlkZTtcbiAgfVxuXG4gIGdldFNjYWxhcihpOiBJbmRleCwgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvbik6IG51bWJlciB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXgsIGVuZGlhbik7XG4gIH1cblxuICBnZXRTY2FsYXJBdChcbiAgICBpOiBJbmRleCxcbiAgICBjb21wb3NpdGlvbk9mZnNldDogSW5kZXgsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApOiBudW1iZXIge1xuICAgIGxldCBpbmRleCA9IGk7XG4gICAgaWYgKGluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgaW5kZXggPSBpbmRpY2VzQWNjZXNzb3IuZ2V0U2NhbGFyKGksIHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgY29tcG9zaXRpb25PZmZzZXQsIGVuZGlhbik7XG4gIH1cblxuICBnZXRWZWMyQXNBcnJheShcbiAgICBpOiBJbmRleCxcbiAgICB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uXG4gICk6IEFycmF5MjxudW1iZXI+IHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXgsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDEgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0VmVjM0FzQXJyYXkoXG4gICAgaTogSW5kZXgsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApOiBBcnJheTM8bnVtYmVyPiB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICBjb25zdCBieXRlU2l6ZSA9IHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0VmVjNEFzQXJyYXkoXG4gICAgaTogSW5kZXgsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApOiBBcnJheTQ8bnVtYmVyPiB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICBjb25zdCBieXRlU2l6ZSA9IHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgIF07XG4gIH1cblxuICBnZXRNYXQzQXNBcnJheShpOiBJbmRleCwgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvbik6IEFycmF5PG51bWJlcj4ge1xuICAgIGxldCBpbmRleCA9IGk7XG4gICAgaWYgKGluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgaW5kZXggPSBpbmRpY2VzQWNjZXNzb3IuZ2V0U2NhbGFyKGksIHt9KTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZVNpemUgPSB0aGlzLmNvbXBvbmVudFNpemVJbkJ5dGVzO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA1ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA4ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgXTtcbiAgfVxuXG4gIGdldE1hdDRBc0FycmF5KGk6IEluZGV4LCB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICBjb25zdCBieXRlU2l6ZSA9IHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA0ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDUgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNiAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA3ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDggKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgOSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMiAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxNCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxNSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgIF07XG4gIH1cblxuICBnZXRWZWMyKGk6IEluZGV4LCB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uKTogVmVjdG9yMiB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICBjb25zdCBieXRlU2l6ZSA9IHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7XG4gICAgcmV0dXJuIFZlY3RvcjIuZnJvbUNvcHlBcnJheTIoW1xuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXgsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDEgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICBdKTtcbiAgfVxuXG4gIGdldFZlYzMoaTogSW5kZXgsIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb24pOiBWZWN0b3IzIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICBdKTtcbiAgfVxuXG4gIGdldFZlYzQoaTogSW5kZXgsIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb24pOiBWZWN0b3I0IHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFtcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgIF0pO1xuICB9XG5cbiAgZ2V0TWF0MyhpOiBJbmRleCwgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvbik6IE1hdHJpeDMzIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gTWF0cml4MzMuZnJvbUNvcHk5Um93TWFqb3IoXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA1ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA4ICogYnl0ZVNpemUsIGVuZGlhbilcbiAgICApO1xuICB9XG5cbiAgZ2V0TWF0NChpOiBJbmRleCwgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvbik6IE11dGFibGVNYXRyaXg0NCB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICBjb25zdCBieXRlU2l6ZSA9IHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7XG4gICAgcmV0dXJuIE11dGFibGVNYXRyaXg0NC5mcm9tQ29weTE2Um93TWFqb3IoXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA1ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA4ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDkgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTAgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTEgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTQgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTUgKiBieXRlU2l6ZSwgZW5kaWFuKVxuICAgICk7XG4gIH1cblxuICBnZXRWZWMyVG8oXG4gICAgaTogSW5kZXgsXG4gICAgb3V0OiBNdXRhYmxlVmVjdG9yMixcbiAgICB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uXG4gICk6IFZlY3RvcjIge1xuICAgIGxldCBpbmRleCA9IGk7XG4gICAgaWYgKGluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgaW5kZXggPSBpbmRpY2VzQWNjZXNzb3IuZ2V0U2NhbGFyKGksIHt9KTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZVNpemUgPSB0aGlzLmNvbXBvbmVudFNpemVJbkJ5dGVzO1xuICAgIHJldHVybiBvdXQuc2V0Q29tcG9uZW50cyhcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogYnl0ZVNpemUsIGVuZGlhbilcbiAgICApO1xuICB9XG5cbiAgZ2V0VmVjM1RvKFxuICAgIGk6IEluZGV4LFxuICAgIG91dDogTXV0YWJsZVZlY3RvcjMsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApOiBWZWN0b3IzIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbilcbiAgICApO1xuICB9XG5cbiAgZ2V0VmVjNFRvKFxuICAgIGk6IEluZGV4LFxuICAgIG91dDogTXV0YWJsZVZlY3RvcjQsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApOiBWZWN0b3I0IHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBieXRlU2l6ZSwgZW5kaWFuKVxuICAgICk7XG4gIH1cblxuICBnZXRNYXQzVG8oXG4gICAgaTogSW5kZXgsXG4gICAgb3V0OiBNdXRhYmxlTWF0cml4MzMsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogeyBpbmRpY2VzQWNjZXNzb3I/OiBBY2Nlc3NvciB8IHVuZGVmaW5lZDsgZW5kaWFuPzogYm9vbGVhbiB9XG4gICk6IE1hdHJpeDMzIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA1ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA4ICogYnl0ZVNpemUsIGVuZGlhbilcbiAgICApO1xuICB9XG5cbiAgZ2V0TWF0NFRvKFxuICAgIGk6IEluZGV4LFxuICAgIG91dDogTXV0YWJsZU1hdHJpeDQ0LFxuICAgIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb25cbiAgKTogTXV0YWJsZU1hdHJpeDQ0IHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVTaXplID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICByZXR1cm4gb3V0LnNldENvbXBvbmVudHMoXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNCAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA1ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNyAqIGJ5dGVTaXplLCBlbmRpYW4pLFxuICAgICAgdGhpcy5fX2RhdGFWaWV3R2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA4ICogYnl0ZVNpemUsIGVuZGlhbiksXG4gICAgICB0aGlzLl9fZGF0YVZpZXdHZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDkgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTAgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTEgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTIgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTMgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTQgKiBieXRlU2l6ZSwgZW5kaWFuKSxcbiAgICAgIHRoaXMuX19kYXRhVmlld0dldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTUgKiBieXRlU2l6ZSwgZW5kaWFuKVxuICAgICk7XG4gIH1cblxuICBzZXRTY2FsYXIoaTogSW5kZXgsIHZhbHVlOiBudW1iZXIsIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb24pIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCB2YWx1ZSwgZW5kaWFuKTtcbiAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX29uVXBkYXRlZCgpO1xuICB9XG5cbiAgc2V0VmVjMihpOiBJbmRleCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb24pIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgeCwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDEgKiBzaXplSW5CeXRlcywgeSwgZW5kaWFuKTtcbiAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX29uVXBkYXRlZCgpO1xuICB9XG5cbiAgc2V0VmVjMyhcbiAgICBpOiBJbmRleCxcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHo6IG51bWJlcixcbiAgICB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uXG4gICkge1xuICAgIGxldCBpbmRleCA9IGk7XG4gICAgaWYgKGluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgaW5kZXggPSBpbmRpY2VzQWNjZXNzb3IuZ2V0U2NhbGFyKGksIHt9KTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZUluQnl0ZXMgPSB0aGlzLmNvbXBvbmVudFNpemVJbkJ5dGVzO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCB4LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIHNpemVJbkJ5dGVzLCB5LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMiAqIHNpemVJbkJ5dGVzLCB6LCBlbmRpYW4pO1xuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBzZXRWZWM0KFxuICAgIGk6IEluZGV4LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIHc6IG51bWJlcixcbiAgICB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uXG4gICkge1xuICAgIGxldCBpbmRleCA9IGk7XG4gICAgaWYgKGluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgaW5kZXggPSBpbmRpY2VzQWNjZXNzb3IuZ2V0U2NhbGFyKGksIHt9KTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZUluQnl0ZXMgPSB0aGlzLmNvbXBvbmVudFNpemVJbkJ5dGVzO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4LCB4LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIHNpemVJbkJ5dGVzLCB5LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMiAqIHNpemVJbkJ5dGVzLCB6LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMyAqIHNpemVJbkJ5dGVzLCB3LCBlbmRpYW4pO1xuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBzZXRNYXQ0KFxuICAgIGk6IEluZGV4LFxuICAgIHYwOiBudW1iZXIsXG4gICAgdjE6IG51bWJlcixcbiAgICB2MjogbnVtYmVyLFxuICAgIHYzOiBudW1iZXIsXG4gICAgdjQ6IG51bWJlcixcbiAgICB2NTogbnVtYmVyLFxuICAgIHY2OiBudW1iZXIsXG4gICAgdjc6IG51bWJlcixcbiAgICB2ODogbnVtYmVyLFxuICAgIHY5OiBudW1iZXIsXG4gICAgdjEwOiBudW1iZXIsXG4gICAgdjExOiBudW1iZXIsXG4gICAgdjEyOiBudW1iZXIsXG4gICAgdjEzOiBudW1iZXIsXG4gICAgdjE0OiBudW1iZXIsXG4gICAgdjE1OiBudW1iZXIsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgdjAsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogc2l6ZUluQnl0ZXMsIHYxLCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMiAqIHNpemVJbkJ5dGVzLCB2MiwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBzaXplSW5CeXRlcywgdjMsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA0ICogc2l6ZUluQnl0ZXMsIHY0LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNSAqIHNpemVJbkJ5dGVzLCB2NSwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBzaXplSW5CeXRlcywgdjYsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA3ICogc2l6ZUluQnl0ZXMsIHY3LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgOCAqIHNpemVJbkJ5dGVzLCB2OCwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDkgKiBzaXplSW5CeXRlcywgdjksIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMCAqIHNpemVJbkJ5dGVzLCB2MTAsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMSAqIHNpemVJbkJ5dGVzLCB2MTEsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMiAqIHNpemVJbkJ5dGVzLCB2MTIsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMyAqIHNpemVJbkJ5dGVzLCB2MTMsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxNCAqIHNpemVJbkJ5dGVzLCB2MTQsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxNSAqIHNpemVJbkJ5dGVzLCB2MTUsIGVuZGlhbik7XG4gICAgdGhpcy5fX2lzTWluTWl4RGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX19vblVwZGF0ZWQoKTtcbiAgfVxuXG4gIHNldFZlYzJBc1ZlY3RvcihpOiBJbmRleCwgdmVjOiBWZWN0b3IyLCB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uKSB7XG4gICAgbGV0IGluZGV4ID0gaTtcbiAgICBpZiAoaW5kaWNlc0FjY2Vzc29yKSB7XG4gICAgICBpbmRleCA9IGluZGljZXNBY2Nlc3Nvci5nZXRTY2FsYXIoaSwge30pO1xuICAgIH1cbiAgICBjb25zdCBzaXplSW5CeXRlcyA9IHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXgsIHZlYy54LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIHNpemVJbkJ5dGVzLCB2ZWMueSwgZW5kaWFuKTtcbiAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX29uVXBkYXRlZCgpO1xuICB9XG5cbiAgc2V0VmVjM0FzVmVjdG9yKGk6IEluZGV4LCB2ZWM6IFZlY3RvcjMsIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb24pIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgdmVjLngsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogc2l6ZUluQnl0ZXMsIHZlYy55LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMiAqIHNpemVJbkJ5dGVzLCB2ZWMueiwgZW5kaWFuKTtcbiAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX29uVXBkYXRlZCgpO1xuICB9XG5cbiAgc2V0VmVjNEFzVmVjdG9yKGk6IEluZGV4LCB2ZWM6IFZlY3RvcjQsIHsgaW5kaWNlc0FjY2Vzc29yLCBlbmRpYW4gPSB0cnVlIH06IEluZGljZXNBY2Nlc3NPcHRpb24pIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgdmVjLngsIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxICogc2l6ZUluQnl0ZXMsIHZlYy55LCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMiAqIHNpemVJbkJ5dGVzLCB2ZWMueiwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBzaXplSW5CeXRlcywgdmVjLncsIGVuZGlhbik7XG4gICAgdGhpcy5fX2lzTWluTWl4RGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX19vblVwZGF0ZWQoKTtcbiAgfVxuXG4gIHNldE1hdDRBc01hdHJpeDQ0KFxuICAgIGk6IEluZGV4LFxuICAgIG1hdDogTWF0cml4NDQsXG4gICAgeyBpbmRpY2VzQWNjZXNzb3IsIGVuZGlhbiA9IHRydWUgfTogSW5kaWNlc0FjY2Vzc09wdGlvblxuICApIHtcbiAgICBsZXQgaW5kZXggPSBpO1xuICAgIGlmIChpbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgIGluZGV4ID0gaW5kaWNlc0FjY2Vzc29yLmdldFNjYWxhcihpLCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gdGhpcy5jb21wb25lbnRTaXplSW5CeXRlcztcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCwgbWF0Ll92WzBdLCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMSAqIHNpemVJbkJ5dGVzLCBtYXQuX3ZbMV0sIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAyICogc2l6ZUluQnl0ZXMsIG1hdC5fdlsyXSwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDMgKiBzaXplSW5CeXRlcywgbWF0Ll92WzNdLCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNCAqIHNpemVJbkJ5dGVzLCBtYXQuX3ZbNF0sIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA1ICogc2l6ZUluQnl0ZXMsIG1hdC5fdls1XSwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDYgKiBzaXplSW5CeXRlcywgbWF0Ll92WzZdLCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgNyAqIHNpemVJbkJ5dGVzLCBtYXQuX3ZbN10sIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyA4ICogc2l6ZUluQnl0ZXMsIG1hdC5fdls4XSwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDkgKiBzaXplSW5CeXRlcywgbWF0Ll92WzldLCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTAgKiBzaXplSW5CeXRlcywgbWF0Ll92WzEwXSwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDExICogc2l6ZUluQnl0ZXMsIG1hdC5fdlsxMV0sIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxMiAqIHNpemVJbkJ5dGVzLCBtYXQuX3ZbMTJdLCBlbmRpYW4pO1xuICAgIHRoaXMuX19kYXRhVmlld1NldHRlcih0aGlzLl9fYnl0ZVN0cmlkZSAqIGluZGV4ICsgMTMgKiBzaXplSW5CeXRlcywgbWF0Ll92WzEzXSwgZW5kaWFuKTtcbiAgICB0aGlzLl9fZGF0YVZpZXdTZXR0ZXIodGhpcy5fX2J5dGVTdHJpZGUgKiBpbmRleCArIDE0ICogc2l6ZUluQnl0ZXMsIG1hdC5fdlsxNF0sIGVuZGlhbik7XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyAxNSAqIHNpemVJbkJ5dGVzLCBtYXQuX3ZbMTVdLCBlbmRpYW4pO1xuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBjb3B5RnJvbVR5cGVkQXJyYXkodHlwZWRBcnJheTogVHlwZWRBcnJheSkge1xuICAgIGNvbnN0IGNvbXBvbmVudE4gPSB0aGlzLm51bWJlck9mQ29tcG9uZW50cztcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHR5cGVkQXJyYXkuYnl0ZUxlbmd0aCAvIHRoaXMuY29tcG9uZW50U2l6ZUluQnl0ZXM7IGorKykge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihqIC8gY29tcG9uZW50Tik7XG4gICAgICBjb25zdCBpZHhOID0gaWR4ICogY29tcG9uZW50TjtcbiAgICAgIHN3aXRjaCAoY29tcG9uZW50Tikge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdGhpcy5zZXRTY2FsYXIoaWR4LCB0eXBlZEFycmF5W2lkeE4gKyAwXSwge30pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgdGhpcy5zZXRWZWMyKGlkeCwgdHlwZWRBcnJheVtpZHhOICsgMF0sIHR5cGVkQXJyYXlbaWR4TiArIDFdLCB7fSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICB0aGlzLnNldFZlYzMoaWR4LCB0eXBlZEFycmF5W2lkeE4gKyAwXSwgdHlwZWRBcnJheVtpZHhOICsgMV0sIHR5cGVkQXJyYXlbaWR4TiArIDJdLCB7fSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICB0aGlzLnNldFZlYzQoXG4gICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICB0eXBlZEFycmF5W2lkeE4gKyAwXSxcbiAgICAgICAgICAgIHR5cGVkQXJyYXlbaWR4TiArIDFdLFxuICAgICAgICAgICAgdHlwZWRBcnJheVtpZHhOICsgMl0sXG4gICAgICAgICAgICB0eXBlZEFycmF5W2lkeE4gKyAzXSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ090aGVyIHRoYW4gdmVjdG9ycyBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBzZXRTY2FsYXJBdChcbiAgICBpOiBJbmRleCxcbiAgICBjb21wb3NpdGlvbk9mZnNldDogSW5kZXgsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICB7IGluZGljZXNBY2Nlc3NvciwgZW5kaWFuID0gdHJ1ZSB9OiBJbmRpY2VzQWNjZXNzT3B0aW9uXG4gICkge1xuICAgIGxldCBpbmRleCA9IGk7XG4gICAgaWYgKGluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgaW5kZXggPSBpbmRpY2VzQWNjZXNzb3IuZ2V0U2NhbGFyKGksIHt9KTtcbiAgICB9XG4gICAgdGhpcy5fX2RhdGFWaWV3U2V0dGVyKHRoaXMuX19ieXRlU3RyaWRlICogaW5kZXggKyBjb21wb3NpdGlvbk9mZnNldCwgdmFsdWUsIGVuZGlhbik7XG4gICAgdGhpcy5fX2lzTWluTWl4RGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX19vblVwZGF0ZWQoKTtcbiAgfVxuXG4gIHNldEVsZW1lbnRGcm9tU2FtZUNvbXBvc2l0aW9uQWNjZXNzb3IoaTogSW5kZXgsIGFjY2Vzc29yOiBBY2Nlc3Nvciwgc2Vjb25kSWR4PzogSW5kZXgpIHtcbiAgICBjb25zdCBqID0gc2Vjb25kSWR4ID8/IGk7XG4gICAgaWYgKHRoaXMuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpID09PSAxKSB7XG4gICAgICB0aGlzLnNldFNjYWxhcihpLCBhY2Nlc3Nvci5nZXRTY2FsYXIoaiwge30pLCB7fSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRWZWMyQXNWZWN0b3IoaSwgYWNjZXNzb3IuZ2V0VmVjMihqLCB7fSksIHt9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpID09PSAzKSB7XG4gICAgICB0aGlzLnNldFZlYzNBc1ZlY3RvcihpLCBhY2Nlc3Nvci5nZXRWZWMzKGosIHt9KSwge30pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDQpIHtcbiAgICAgIHRoaXMuc2V0VmVjNEFzVmVjdG9yKGksIGFjY2Vzc29yLmdldFZlYzQoaiwge30pLCB7fSk7XG4gICAgfVxuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBjb3B5QnVmZmVyKGFjY2Vzc29yOiBBY2Nlc3Nvcikge1xuICAgIG5ldyBVaW50OEFycmF5KHRoaXMuX19yYXcpLnNldChcbiAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICBhY2Nlc3Nvci5fX3JhdyxcbiAgICAgICAgYWNjZXNzb3IuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyLFxuICAgICAgICBhY2Nlc3Nvci5ieXRlTGVuZ3RoXG4gICAgICApLFxuICAgICAgdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXJcbiAgICApO1xuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBzZXRFbGVtZW50RnJvbUFjY2Vzc29yKGk6IEluZGV4LCBhY2Nlc3NvcjogQWNjZXNzb3IsIHNlY29uZElkeD86IEluZGV4KSB7XG4gICAgY29uc3QgaiA9IHNlY29uZElkeCA/PyBpO1xuICAgIGlmICh0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMSkge1xuICAgICAgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMSkge1xuICAgICAgICB0aGlzLnNldFNjYWxhcihpLCBhY2Nlc3Nvci5nZXRTY2FsYXIoaiwge30pLCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMikge1xuICAgICAgICB0aGlzLnNldFNjYWxhcihpLCBhY2Nlc3Nvci5nZXRWZWMyKGosIHt9KS54LCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMykge1xuICAgICAgICB0aGlzLnNldFNjYWxhcihpLCBhY2Nlc3Nvci5nZXRWZWMzKGosIHt9KS54LCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gNCkge1xuICAgICAgICB0aGlzLnNldFNjYWxhcihpLCBhY2Nlc3Nvci5nZXRWZWM0KGosIHt9KS54LCB7fSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMikge1xuICAgICAgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMSkge1xuICAgICAgICBjb25zdCBzY2FsYXIgPSBhY2Nlc3Nvci5nZXRTY2FsYXIoaiwge30pO1xuICAgICAgICB0aGlzLnNldFZlYzIoaSwgc2NhbGFyLCAwLCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMikge1xuICAgICAgICB0aGlzLnNldFZlYzJBc1ZlY3RvcihpLCBhY2Nlc3Nvci5nZXRWZWMyKGosIHt9KSwge30pO1xuICAgICAgfSBlbHNlIGlmIChhY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDMpIHtcbiAgICAgICAgY29uc3QgdmVjID0gYWNjZXNzb3IuZ2V0VmVjMyhqLCB7fSk7XG4gICAgICAgIHRoaXMuc2V0VmVjMihpLCB2ZWMueCwgdmVjLnksIHt9KTtcbiAgICAgIH0gZWxzZSBpZiAoYWNjZXNzb3IuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpID09PSA0KSB7XG4gICAgICAgIGNvbnN0IHZlYyA9IGFjY2Vzc29yLmdldFZlYzQoaiwge30pO1xuICAgICAgICB0aGlzLnNldFZlYzIoaSwgdmVjLngsIHZlYy55LCB7fSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMykge1xuICAgICAgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMSkge1xuICAgICAgICBjb25zdCBzY2FsYXIgPSBhY2Nlc3Nvci5nZXRTY2FsYXIoaiwge30pO1xuICAgICAgICB0aGlzLnNldFZlYzMoaSwgc2NhbGFyLCAwLCAwLCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMikge1xuICAgICAgICBjb25zdCB2ZWMgPSBhY2Nlc3Nvci5nZXRWZWMyKGosIHt9KTtcbiAgICAgICAgdGhpcy5zZXRWZWMzKGksIHZlYy54LCB2ZWMueSwgMCwge30pO1xuICAgICAgfSBlbHNlIGlmIChhY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDMpIHtcbiAgICAgICAgY29uc3QgdmVjID0gYWNjZXNzb3IuZ2V0VmVjMyhqLCB7fSk7XG4gICAgICAgIHRoaXMuc2V0VmVjM0FzVmVjdG9yKGksIHZlYywge30pO1xuICAgICAgfSBlbHNlIGlmIChhY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDQpIHtcbiAgICAgICAgY29uc3QgdmVjID0gYWNjZXNzb3IuZ2V0VmVjNChqLCB7fSk7XG4gICAgICAgIHRoaXMuc2V0VmVjMyhpLCB2ZWMueCwgdmVjLnksIHZlYy56LCB7fSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gNCkge1xuICAgICAgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMSkge1xuICAgICAgICBjb25zdCBzY2FsYXIgPSBhY2Nlc3Nvci5nZXRTY2FsYXIoaiwge30pO1xuICAgICAgICB0aGlzLnNldFZlYzQoaSwgc2NhbGFyLCAwLCAwLCAwLCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gMikge1xuICAgICAgICBjb25zdCB2ZWMgPSBhY2Nlc3Nvci5nZXRWZWMyKGosIHt9KTtcbiAgICAgICAgdGhpcy5zZXRWZWM0KGksIHZlYy54LCB2ZWMueSwgMCwgMCwge30pO1xuICAgICAgfSBlbHNlIGlmIChhY2Nlc3Nvci5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDMpIHtcbiAgICAgICAgY29uc3QgdmVjID0gYWNjZXNzb3IuZ2V0VmVjMyhqLCB7fSk7XG4gICAgICAgIHRoaXMuc2V0VmVjNChpLCB2ZWMueCwgdmVjLnksIHZlYy56LCAwLCB7fSk7XG4gICAgICB9IGVsc2UgaWYgKGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gNCkge1xuICAgICAgICBjb25zdCB2ZWMgPSBhY2Nlc3Nvci5nZXRWZWM0KGosIHt9KTtcbiAgICAgICAgdGhpcy5zZXRWZWM0QXNWZWN0b3IoaSwgdmVjLCB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fb25VcGRhdGVkKCk7XG4gIH1cblxuICBhZGRFbGVtZW50RnJvbVNhbWVDb21wb3NpdGlvbkFjY2Vzc29yKFxuICAgIGk6IEluZGV4LFxuICAgIGFjY2Vzc29yOiBBY2Nlc3NvcixcbiAgICBjb2VmZjogbnVtYmVyLFxuICAgIHNlY29uZElkeD86IEluZGV4XG4gICkge1xuICAgIGNvbnN0IGogPSBzZWNvbmRJZHggPz8gaTtcbiAgICBpZiAodGhpcy5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDEpIHtcbiAgICAgIHRoaXMuc2V0U2NhbGFyKGksIHRoaXMuZ2V0U2NhbGFyKGksIHt9KSArIGNvZWZmICogYWNjZXNzb3IuZ2V0U2NhbGFyKGosIHt9KSwge30pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgPT09IDIpIHtcbiAgICAgIHRoaXMuc2V0VmVjMkFzVmVjdG9yKFxuICAgICAgICBpLFxuICAgICAgICBWZWN0b3IyLmFkZCh0aGlzLmdldFZlYzIoaSwge30pLCBWZWN0b3IyLm11bHRpcGx5KGFjY2Vzc29yLmdldFZlYzIoaiwge30pLCBjb2VmZikpLFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpID09PSAzKSB7XG4gICAgICB0aGlzLnNldFZlYzNBc1ZlY3RvcihcbiAgICAgICAgaSxcbiAgICAgICAgVmVjdG9yMy5hZGQodGhpcy5nZXRWZWMzKGksIHt9KSwgVmVjdG9yMy5tdWx0aXBseShhY2Nlc3Nvci5nZXRWZWMzKGosIHt9KSwgY29lZmYpKSxcbiAgICAgICAge31cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA9PT0gNCkge1xuICAgICAgdGhpcy5zZXRWZWM0QXNWZWN0b3IoXG4gICAgICAgIGksXG4gICAgICAgIFZlY3RvcjQuYWRkKHRoaXMuZ2V0VmVjNChpLCB7fSksIFZlY3RvcjQubXVsdGlwbHkoYWNjZXNzb3IuZ2V0VmVjNChqLCB7fSksIGNvZWZmKSksXG4gICAgICAgIHt9XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX29uVXBkYXRlZCgpO1xuICB9XG5cbiAgZ2V0IGFycmF5QnVmZmVyT2ZCdWZmZXJWaWV3KCk6IEFycmF5QnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5fX3JhdztcbiAgfVxuXG4gIGdldCBkYXRhVmlld09mQnVmZmVyVmlldygpOiBEYXRhVmlldyB7XG4gICAgcmV0dXJuIHRoaXMuX19kYXRhVmlldyE7XG4gIH1cblxuICBnZXQgYnl0ZU9mZnNldEluQnVmZmVyVmlldygpOiBCeXRlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIgLVxuICAgICAgdGhpcy5fX2J1ZmZlclZpZXcuYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlclxuICAgICk7XG4gIH1cblxuICBnZXQgYnl0ZU9mZnNldEluQnVmZmVyKCk6IEJ5dGUge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9fYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlciAtXG4gICAgICB0aGlzLl9fYnVmZmVyVmlldy5idWZmZXIuYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJcbiAgICApO1xuICB9XG5cbiAgZ2V0IGJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlclZpZXcoKTogQnVmZmVyVmlldyB7XG4gICAgcmV0dXJuIHRoaXMuX19idWZmZXJWaWV3O1xuICB9XG5cbiAgc2V0TWluTWF4KG1pbjogbnVtYmVyW10sIG1heDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBjb21wb25lbnROID0gdGhpcy5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCk7XG4gICAgaWYgKGNvbXBvbmVudE4gPT09IDEpIHtcbiAgICAgIHRoaXMuX19taW4uX3ZbMF0gPSBtaW5bMF07XG4gICAgICB0aGlzLl9fbWF4Ll92WzBdID0gbWF4WzBdO1xuICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TiA9PT0gMikge1xuICAgICAgdGhpcy5fX21pbi5fdlswXSA9IG1pblswXTtcbiAgICAgIHRoaXMuX19taW4uX3ZbMV0gPSBtaW5bMV07XG4gICAgICB0aGlzLl9fbWF4Ll92WzBdID0gbWF4WzBdO1xuICAgICAgdGhpcy5fX21heC5fdlsxXSA9IG1heFsxXTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudE4gPT09IDMpIHtcbiAgICAgIHRoaXMuX19taW4uX3ZbMF0gPSBtaW5bMF07XG4gICAgICB0aGlzLl9fbWluLl92WzFdID0gbWluWzFdO1xuICAgICAgdGhpcy5fX21pbi5fdlsyXSA9IG1pblsyXTtcbiAgICAgIHRoaXMuX19tYXguX3ZbMF0gPSBtYXhbMF07XG4gICAgICB0aGlzLl9fbWF4Ll92WzFdID0gbWF4WzFdO1xuICAgICAgdGhpcy5fX21heC5fdlsyXSA9IG1heFsyXTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudE4gPT09IDQpIHtcbiAgICAgIHRoaXMuX19taW4uX3ZbMF0gPSBtaW5bMF07XG4gICAgICB0aGlzLl9fbWluLl92WzFdID0gbWluWzFdO1xuICAgICAgdGhpcy5fX21pbi5fdlsyXSA9IG1pblsyXTtcbiAgICAgIHRoaXMuX19taW4uX3ZbM10gPSBtaW5bM107XG4gICAgICB0aGlzLl9fbWF4Ll92WzBdID0gbWF4WzBdO1xuICAgICAgdGhpcy5fX21heC5fdlsxXSA9IG1heFsxXTtcbiAgICAgIHRoaXMuX19tYXguX3ZbMl0gPSBtYXhbMl07XG4gICAgICB0aGlzLl9fbWF4Ll92WzNdID0gbWF4WzNdO1xuICAgIH1cbiAgICB0aGlzLl9faXNNaW5NaXhEaXJ0eSA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG1pbigpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuX19pc01pbk1peERpcnR5KSB7XG4gICAgICB0aGlzLl9fY2FsY01pbk1heCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudE4gPSB0aGlzLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKTtcbiAgICBpZiAoY29tcG9uZW50TiA9PT0gNCkge1xuICAgICAgcmV0dXJuIFt0aGlzLl9fbWluLl92WzBdLCB0aGlzLl9fbWluLl92WzFdLCB0aGlzLl9fbWluLl92WzJdLCB0aGlzLl9fbWluLl92WzNdXTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudE4gPT09IDMpIHtcbiAgICAgIHJldHVybiBbdGhpcy5fX21pbi5fdlswXSwgdGhpcy5fX21pbi5fdlsxXSwgdGhpcy5fX21pbi5fdlsyXV07XG4gICAgfSBlbHNlIGlmIChjb21wb25lbnROID09PSAyKSB7XG4gICAgICByZXR1cm4gW3RoaXMuX19taW4uX3ZbMF0sIHRoaXMuX19taW4uX3ZbMV1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RoaXMuX19taW4uX3ZbMF1dO1xuICAgIH1cbiAgfVxuXG4gIGdldCBtYXgoKTogbnVtYmVyW10ge1xuICAgIGlmICh0aGlzLl9faXNNaW5NaXhEaXJ0eSkge1xuICAgICAgdGhpcy5fX2NhbGNNaW5NYXgoKTtcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50TiA9IHRoaXMuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpO1xuICAgIGlmIChjb21wb25lbnROID09PSA0KSB7XG4gICAgICByZXR1cm4gW3RoaXMuX19tYXguX3ZbMF0sIHRoaXMuX19tYXguX3ZbMV0sIHRoaXMuX19tYXguX3ZbMl0sIHRoaXMuX19tYXguX3ZbM11dO1xuICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TiA9PT0gMykge1xuICAgICAgcmV0dXJuIFt0aGlzLl9fbWF4Ll92WzBdLCB0aGlzLl9fbWF4Ll92WzFdLCB0aGlzLl9fbWF4Ll92WzJdXTtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudE4gPT09IDIpIHtcbiAgICAgIHJldHVybiBbdGhpcy5fX21heC5fdlswXSwgdGhpcy5fX21heC5fdlsxXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbdGhpcy5fX21heC5fdlswXV07XG4gICAgfVxuICB9XG5cbiAgZ2V0IG5vcm1hbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NhbGNNaW5NYXgoKSB7XG4gICAgY29uc3QgY29tcG9uZW50TiA9IHRoaXMuY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpO1xuICAgIGlmIChjb21wb25lbnROID09PSA0KSB7XG4gICAgICB0aGlzLl9fbWF4LnNldENvbXBvbmVudHMoXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuICAgICAgdGhpcy5fX21pbi5zZXRDb21wb25lbnRzKFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuXG4gICAgICBjb25zdCB2ZWM0ID0gQWNjZXNzb3IuX190bXBWZWN0b3I0XzA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZWxlbWVudENvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5nZXRWZWM0VG8oaSwgdmVjNCwge30pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLl9fbWF4Ll92W2pdIDwgdmVjNC5fdltqXSkge1xuICAgICAgICAgICAgdGhpcy5fX21heC5fdltqXSA9IHZlYzQuX3Zbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2ZWM0Ll92W2pdIDwgdGhpcy5fX21pbi5fdltqXSkge1xuICAgICAgICAgICAgdGhpcy5fX21pbi5fdltqXSA9IHZlYzQuX3Zbal07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21wb25lbnROID09PSAzKSB7XG4gICAgICB0aGlzLl9fbWF4LnNldENvbXBvbmVudHMoXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuICAgICAgdGhpcy5fX21pbi5zZXRDb21wb25lbnRzKFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuXG4gICAgICBjb25zdCB2ZWMzID0gQWNjZXNzb3IuX190bXBWZWN0b3IzXzA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZWxlbWVudENvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5nZXRWZWMzVG8oaSwgdmVjMywge30pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLl9fbWF4Ll92W2pdIDwgdmVjMy5fdltqXSkge1xuICAgICAgICAgICAgdGhpcy5fX21heC5fdltqXSA9IHZlYzMuX3Zbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2ZWMzLl92W2pdIDwgdGhpcy5fX21pbi5fdltqXSkge1xuICAgICAgICAgICAgdGhpcy5fX21pbi5fdltqXSA9IHZlYzMuX3Zbal07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21wb25lbnROID09PSAyKSB7XG4gICAgICB0aGlzLl9fbWF4LnNldENvbXBvbmVudHMoXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuICAgICAgdGhpcy5fX21pbi5zZXRDb21wb25lbnRzKFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuXG4gICAgICBjb25zdCB2ZWMyID0gQWNjZXNzb3IuX190bXBWZWN0b3IyXzA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZWxlbWVudENvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5nZXRWZWMyVG8oaSwgdmVjMiwge30pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDI7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLl9fbWF4Ll92W2pdIDwgdmVjMi5fdltqXSkge1xuICAgICAgICAgICAgdGhpcy5fX21heC5fdltqXSA9IHZlYzIuX3Zbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2ZWMyLl92W2pdIDwgdGhpcy5fX21pbi5fdltqXSkge1xuICAgICAgICAgICAgdGhpcy5fX21pbi5fdltqXSA9IHZlYzIuX3Zbal07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21wb25lbnROID09PSAxKSB7XG4gICAgICB0aGlzLl9fbWF4LnNldENvbXBvbmVudHMoXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIC1OdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuICAgICAgdGhpcy5fX21pbi5zZXRDb21wb25lbnRzKFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICApO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZWxlbWVudENvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2NhbGFyID0gdGhpcy5nZXRTY2FsYXIoaSwge30pO1xuICAgICAgICBpZiAodGhpcy5fX21heC5fdlswXSA8IHNjYWxhcikge1xuICAgICAgICAgIHRoaXMuX19tYXguX3ZbMF0gPSBzY2FsYXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYWxhciA8IHRoaXMuX19taW4uX3ZbMF0pIHtcbiAgICAgICAgICB0aGlzLl9fbWluLl92WzBdID0gc2NhbGFyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX19pc01pbk1peERpcnR5ID0gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNNaW5NYXhEaXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzTWluTWl4RGlydHk7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3ZlcnNpb247XG4gIH1cblxuICBnZXQgYWN0dWFsQnl0ZVN0cmlkZSgpIHtcbiAgICBpZiAodGhpcy5fX2J5dGVTdHJpZGUgPT09IDApIHtcbiAgICAgIGNvbnN0IGFjdHVhbEJ5dGVTdHJpZGUgPVxuICAgICAgICB0aGlzLl9fY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpICpcbiAgICAgICAgdGhpcy5fX2NvbXBvbmVudFR5cGUuZ2V0U2l6ZUluQnl0ZXMoKSAqXG4gICAgICAgIHRoaXMuX19hcnJheUxlbmd0aDtcbiAgICAgIHJldHVybiBhY3R1YWxCeXRlU3RyaWRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2J5dGVTdHJpZGU7XG4gICAgfVxuICB9XG5cbiAgaXNTYW1lKHJuQWNjZXNzb3I6IEFjY2Vzc29yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9PT0gcm5BY2Nlc3Nvci5ieXRlTGVuZ3RoICYmXG4gICAgICB0aGlzLmJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIgPT09IHJuQWNjZXNzb3IuYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlciAmJlxuICAgICAgdGhpcy5idWZmZXJWaWV3LmJ1ZmZlci5nZXRBcnJheUJ1ZmZlcigpID09PSBybkFjY2Vzc29yLmJ1ZmZlclZpZXcuYnVmZmVyLmdldEFycmF5QnVmZmVyKClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWZmZXJWaWV3IH0gZnJvbSAnLi9CdWZmZXJWaWV3JztcbmltcG9ydCB7IEJ5dGUsIFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUsIENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5cbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSAnLi4vbWlzYy9EYXRhVXRpbCc7XG5pbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi9taXNjL1Jlc3VsdCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9taXNjL0xvZ2dlcic7XG5cbmV4cG9ydCBjbGFzcyBCdWZmZXIge1xuICBwcml2YXRlIF9fYnl0ZUxlbmd0aDogQnl0ZSA9IDA7XG4gIHByaXZhdGUgX19ieXRlT2Zmc2V0OiBCeXRlID0gMDtcbiAgcHJpdmF0ZSBfX3Rha2VuQnl0ZXNJbmRleDogQnl0ZSA9IDA7XG4gIHByaXZhdGUgX19ieXRlQWxpZ246IEJ5dGU7XG4gIHByaXZhdGUgX19yYXc6IEFycmF5QnVmZmVyO1xuICBwcml2YXRlIF9fbmFtZSA9ICcnO1xuICBwcml2YXRlIF9fYnVmZmVyVmlld3M6IEFycmF5PEJ1ZmZlclZpZXc+ID0gW107XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJ5dGVMZW5ndGgsXG4gICAgYnVmZmVyLFxuICAgIG5hbWUsXG4gICAgYnl0ZUFsaWduLFxuICB9OiB7XG4gICAgYnl0ZUxlbmd0aDogQnl0ZTtcbiAgICBidWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBieXRlQWxpZ246IEJ5dGU7XG4gIH0pIHtcbiAgICB0aGlzLl9fbmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fX2J5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuICAgIHRoaXMuX19ieXRlQWxpZ24gPSBieXRlQWxpZ247XG5cbiAgICBpZiAoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgdGhpcy5fX3JhdyA9IGJ1ZmZlci5idWZmZXI7XG4gICAgICB0aGlzLl9fYnl0ZU9mZnNldCA9IGJ1ZmZlci5ieXRlT2Zmc2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fcmF3ID0gYnVmZmVyO1xuICAgIH1cbiAgfVxuXG4gIHNldCBuYW1lKHN0cikge1xuICAgIHRoaXMuX19uYW1lID0gc3RyO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19uYW1lO1xuICB9XG5cbiAgZ2V0QXJyYXlCdWZmZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19yYXc7XG4gIH1cblxuICBwcml2YXRlIF9fcGFkZGluZyhieXRlTGVuZ3RoVG9OZWVkOiBCeXRlLCBieXRlQWxpZ246IEJ5dGUpIHtcbiAgICBjb25zdCBwYWRkaW5nU2l6ZSA9IERhdGFVdGlsLmNhbGNQYWRkaW5nQnl0ZXMoYnl0ZUxlbmd0aFRvTmVlZCwgYnl0ZUFsaWduKTtcbiAgICBpZiAocGFkZGluZ1NpemUgPiAwKSB7XG4gICAgICBMb2dnZXIuaW5mbygnUGFkZGluZyBieXRlcyBhZGRlZCB0byB0YWtlbkJ5dGVzSW5kZXguJyk7XG4gICAgfVxuICAgIHJldHVybiBwYWRkaW5nU2l6ZTtcbiAgfVxuXG4gIHRha2VCdWZmZXJWaWV3KHtcbiAgICBieXRlTGVuZ3RoVG9OZWVkLFxuICAgIGJ5dGVTdHJpZGUsXG4gIH06IHtcbiAgICBieXRlTGVuZ3RoVG9OZWVkOiBCeXRlO1xuICAgIGJ5dGVTdHJpZGU6IEJ5dGU7XG4gIH0pOiBSZXN1bHQ8XG4gICAgQnVmZmVyVmlldyxcbiAgICB7XG4gICAgICAnQnVmZmVyLmJ5dGVMZW5ndGgnOiBCeXRlO1xuICAgICAgJ0J1ZmZlci50YWtlblNpemVJbkJ5dGUnOiBCeXRlO1xuICAgIH1cbiAgPiB7XG4gICAgLy8gY29uc3QgYnl0ZUFsaWduID0gdGhpcy5fX2J5dGVBbGlnbjtcbiAgICAvLyBjb25zdCBwYWRkaW5nQnl0ZXMgPSB0aGlzLl9fcGFkZGluZyhieXRlTGVuZ3RoVG9OZWVkLCBieXRlQWxpZ24pO1xuXG4gICAgLy8gY29uc3QgYnl0ZVNpemVUb1Rha2UgPSBieXRlTGVuZ3RoVG9OZWVkICsgcGFkZGluZ0J5dGVzO1xuICAgIGNvbnN0IGJ5dGVTaXplVG9UYWtlID0gYnl0ZUxlbmd0aFRvTmVlZDsgLy8gKyBwYWRkaW5nQnl0ZXM7XG4gICAgLy8gYnl0ZVNpemVUb1Rha2UgPSBEYXRhVXRpbC5hZGRQYWRkaW5nQnl0ZXMoYnl0ZVNpemVUb1Rha2UsIHRoaXMuX19ieXRlQWxpZ24pO1xuXG4gICAgaWYgKGJ5dGVTaXplVG9UYWtlICsgdGhpcy5fX3Rha2VuQnl0ZXNJbmRleCA+IHRoaXMuYnl0ZUxlbmd0aCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBUaGUgc2l6ZSBvZiB0aGUgQnVmZmVyVmlldyB5b3UgYXJlIHRyeWluZyB0byB0YWtlIGV4Y2VlZHMgdGhlIGJ5dGUgbGVuZ3RoIGxlZnQgaW4gdGhlIEJ1ZmZlci5cbkJ1ZmZlci5ieXRlTGVuZ3RoOiAke3RoaXMuYnl0ZUxlbmd0aH0sIEJ1ZmZlci50YWtlblNpemVJbkJ5dGU6ICR7dGhpcy50YWtlblNpemVJbkJ5dGV9LFxuYnl0ZVNpemVUb1Rha2U6ICR7Ynl0ZVNpemVUb1Rha2V9LCB0aGUgYnl0ZSBsZW5ndGggbGVmdCBpbiB0aGUgQnVmZmVyOiAke1xuICAgICAgICB0aGlzLl9fYnl0ZUxlbmd0aCAtIHRoaXMuX190YWtlbkJ5dGVzSW5kZXhcbiAgICAgIH1gO1xuICAgICAgLy8gY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAnQnVmZmVyLmJ5dGVMZW5ndGgnOiB0aGlzLnRha2VuU2l6ZUluQnl0ZSxcbiAgICAgICAgICAnQnVmZmVyLnRha2VuU2l6ZUluQnl0ZSc6IHRoaXMudGFrZW5TaXplSW5CeXRlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBCdWZmZXJWaWV3KHtcbiAgICAgIGJ1ZmZlcjogdGhpcyxcbiAgICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlcjogdGhpcy5fX3Rha2VuQnl0ZXNJbmRleCxcbiAgICAgIGRlZmF1bHRCeXRlU3RyaWRlOiBieXRlU3RyaWRlLFxuICAgICAgYnl0ZUxlbmd0aDogYnl0ZVNpemVUb1Rha2UsXG4gICAgICByYXc6IHRoaXMuX19yYXcsXG4gICAgfSk7XG4gICAgdGhpcy5fX3Rha2VuQnl0ZXNJbmRleCArPSBieXRlU2l6ZVRvVGFrZTtcbiAgICB0aGlzLl9fdGFrZW5CeXRlc0luZGV4ID0gRGF0YVV0aWwuYWRkUGFkZGluZ0J5dGVzKHRoaXMuX190YWtlbkJ5dGVzSW5kZXgsIHRoaXMuX19ieXRlQWxpZ24pO1xuICAgIHRoaXMuX19idWZmZXJWaWV3cy5wdXNoKGJ1ZmZlclZpZXcpO1xuXG4gICAgcmV0dXJuIG5ldyBPayhidWZmZXJWaWV3KTtcbiAgfVxuXG4gIHRha2VCdWZmZXJWaWV3V2l0aEJ5dGVPZmZzZXQoe1xuICAgIGJ5dGVMZW5ndGhUb05lZWQsXG4gICAgYnl0ZVN0cmlkZSxcbiAgICBieXRlT2Zmc2V0LFxuICB9OiB7XG4gICAgYnl0ZUxlbmd0aFRvTmVlZDogQnl0ZTtcbiAgICBieXRlU3RyaWRlOiBCeXRlO1xuICAgIGJ5dGVPZmZzZXQ6IEJ5dGU7XG4gIH0pOiBSZXN1bHQ8QnVmZmVyVmlldywgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYnl0ZVNpemVUb1Rha2UgPSBieXRlTGVuZ3RoVG9OZWVkO1xuICAgIGlmIChieXRlU2l6ZVRvVGFrZSArIGJ5dGVPZmZzZXQgPiB0aGlzLmJ5dGVMZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIHNpemUgb2YgdGhlIEJ1ZmZlclZpZXcgeW91IGFyZSB0cnlpbmcgdG8gdGFrZSBleGNlZWRzIHRoZSBieXRlIGxlbmd0aCBsZWZ0IGluIHRoZSBCdWZmZXIuXG5CdWZmZXIuYnl0ZUxlbmd0aDogJHt0aGlzLmJ5dGVMZW5ndGh9LCBCdWZmZXIudGFrZW5TaXplSW5CeXRlOiAke3RoaXMudGFrZW5TaXplSW5CeXRlfSxcbmJ5dGVTaXplVG9UYWtlOiAke2J5dGVMZW5ndGhUb05lZWR9LCB0aGUgYnl0ZSBsZW5ndGggbGVmdCBpbiB0aGUgQnVmZmVyOiAke1xuICAgICAgICB0aGlzLl9fYnl0ZUxlbmd0aCAtIHRoaXMuX190YWtlbkJ5dGVzSW5kZXhcbiAgICAgIH1gO1xuICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBCdWZmZXJWaWV3KHtcbiAgICAgIGJ1ZmZlcjogdGhpcyxcbiAgICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlcjogYnl0ZU9mZnNldCxcbiAgICAgIGRlZmF1bHRCeXRlU3RyaWRlOiBieXRlU3RyaWRlLFxuICAgICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aFRvTmVlZCxcbiAgICAgIHJhdzogdGhpcy5fX3JhdyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRha2VuQnl0ZXNJbmRleCA9IFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBieXRlTGVuZ3RoVG9OZWVkICsgYnl0ZU9mZnNldDtcbiAgICBpZiAodGhpcy5fX3Rha2VuQnl0ZXNJbmRleCA8IHRha2VuQnl0ZXNJbmRleCkge1xuICAgICAgdGhpcy5fX3Rha2VuQnl0ZXNJbmRleCA9IHRha2VuQnl0ZXNJbmRleDtcbiAgICB9XG5cbiAgICB0aGlzLl9fYnVmZmVyVmlld3MucHVzaChidWZmZXJWaWV3KTtcblxuICAgIHJldHVybiBuZXcgT2soYnVmZmVyVmlldyk7XG4gIH1cblxuICBfYWRkVGFrZW5CeXRlSW5kZXgodmFsdWU6IEJ5dGUpIHtcbiAgICB0aGlzLl9fdGFrZW5CeXRlc0luZGV4ICs9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ieXRlTGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHRha2VuU2l6ZUluQnl0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Rha2VuQnl0ZXNJbmRleDtcbiAgfVxuXG4gIGdldCBieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX2J5dGVPZmZzZXQ7XG4gIH1cblxuICBnZXRUeXBlZEFycmF5KFxuICAgIG9mZnNldDRieXRlc1VuaXQ6IG51bWJlcixcbiAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW0sXG4gICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW0sXG4gICAgbGVuZ3RoID0gMTAwXG4gICkge1xuICAgIGxldCByZXQ6IFR5cGVkQXJyYXk7XG4gICAgY29uc3QgdHlwZWRBcnJheSA9IENvbXBvbmVudFR5cGUudG9UeXBlZEFycmF5KGNvbXBvbmVudFR5cGUpITtcbiAgICBpZiAodHlwZWRBcnJheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBMb2dnZXIud2FybignY29tcG9uZW50VHlwZSBpcyBJbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmIChDb21wb3NpdGlvblR5cGUuaXNBcnJheShjb21wb3NpdGlvblR5cGUpKSB7XG4gICAgICByZXQgPSBuZXcgdHlwZWRBcnJheSh0aGlzLl9fcmF3LCB0aGlzLl9fYnl0ZU9mZnNldCArIG9mZnNldDRieXRlc1VuaXQgKiA0LCBsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQgPSBuZXcgdHlwZWRBcnJheSh0aGlzLl9fcmF3LCB0aGlzLl9fYnl0ZU9mZnNldCArIG9mZnNldDRieXRlc1VuaXQgKiA0LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgaXNTYW1lKGJ1ZmZlcjogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX19yYXcgPT09IGJ1ZmZlci5fX3JhdztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnLi4vbWVtb3J5L0J1ZmZlcic7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBBY2Nlc3NvciB9IGZyb20gJy4vQWNjZXNzb3InO1xuaW1wb3J0IHsgQnl0ZSwgQ291bnQsIFNpemUgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBFcnIsIFJlc3VsdCwgT2sgfSBmcm9tICcuLi9taXNjJztcblxuZXhwb3J0IGNsYXNzIEJ1ZmZlclZpZXcge1xuICBwcml2YXRlIF9fYnVmZmVyOiBCdWZmZXI7XG4gIHByaXZhdGUgX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyOiBCeXRlO1xuICBwcml2YXRlIF9fYnl0ZU9mZnNldEluQnVmZmVyOiBCeXRlO1xuICBwcml2YXRlIF9fYnl0ZUxlbmd0aDogQnl0ZTtcbiAgcHJpdmF0ZSBfX2RlZmF1bHRCeXRlU3RyaWRlOiBCeXRlID0gMDtcbiAgcHJpdmF0ZSBfX3Rha2VuQnl0ZTogQnl0ZSA9IDA7XG4gIHByaXZhdGUgX190YWtlbkFjY2Vzc29yQ291bnQgPSAwO1xuICBwcml2YXRlIF9fcmF3OiBBcnJheUJ1ZmZlcjtcbiAgcHJpdmF0ZSBfX2FjY2Vzc29yczogQXJyYXk8QWNjZXNzb3I+ID0gW107XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJ1ZmZlcixcbiAgICBieXRlT2Zmc2V0SW5CdWZmZXIsXG4gICAgZGVmYXVsdEJ5dGVTdHJpZGUsXG4gICAgYnl0ZUxlbmd0aCxcbiAgICByYXcsXG4gIH06IHtcbiAgICBidWZmZXI6IEJ1ZmZlcjtcbiAgICBieXRlT2Zmc2V0SW5CdWZmZXI6IEJ5dGU7XG4gICAgZGVmYXVsdEJ5dGVTdHJpZGU6IEJ5dGU7XG4gICAgYnl0ZUxlbmd0aDogQnl0ZTtcbiAgICByYXc6IEFycmF5QnVmZmVyO1xuICB9KSB7XG4gICAgdGhpcy5fX2J1ZmZlciA9IGJ1ZmZlcjtcbiAgICB0aGlzLl9fYnl0ZU9mZnNldEluQnVmZmVyID0gYnl0ZU9mZnNldEluQnVmZmVyO1xuICAgIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyID1cbiAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlciArIGJ5dGVPZmZzZXRJbkJ1ZmZlcjtcbiAgICB0aGlzLl9fYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG4gICAgdGhpcy5fX2RlZmF1bHRCeXRlU3RyaWRlID0gZGVmYXVsdEJ5dGVTdHJpZGU7XG4gICAgdGhpcy5fX3JhdyA9IHJhdztcbiAgfVxuXG4gIGdldCBkZWZhdWx0Qnl0ZVN0cmlkZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2RlZmF1bHRCeXRlU3RyaWRlO1xuICB9XG5cbiAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ieXRlTGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIGJ5dGVPZmZzZXQgaW4gQnVmZmVyIChpbmNsdWRlcyBieXRlT2Zmc2V0IG9mIEJ1ZmZlciBpbiBpdCdzIGlubmVyIGFycmF5YnVmZmVyKVxuICAgKi9cbiAgZ2V0IGJ5dGVPZmZzZXRJbkJ1ZmZlcigpOiBCeXRlIHtcbiAgICByZXR1cm4gdGhpcy5fX2J5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIgLSB0aGlzLl9fYnVmZmVyLmJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIGJ5dGVPZmZzZXQgaW4gQnVmZmVyIChpbmNsdWRlcyBieXRlT2Zmc2V0IG9mIEJ1ZmZlciBpbiBpdCdzIGlubmVyIGFycmF5YnVmZmVyKVxuICAgKi9cbiAgZ2V0IGJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9fYnVmZmVyO1xuICB9XG5cbiAgZ2V0IGlzU29BKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0FvUztcbiAgfVxuXG4gIGdldCBpc0FvUygpIHtcbiAgICBmb3IgKGNvbnN0IGFjY2Vzc29yIG9mIHRoaXMuX19hY2Nlc3NvcnMpIHtcbiAgICAgIGlmIChhY2Nlc3Nvci5pc0FvUykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBtZW1vcnkgYnVmZmVyIGFzIFVpbnQ4QXJyYXkgb2YgdGhpcyBCdWZmZXJWaWV3IG1lbW9yeSBhcmVhIGRhdGFcbiAgICovXG4gIGdldFVpbnQ4QXJyYXkoKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuX19yYXcsIHRoaXMuX19ieXRlT2Zmc2V0SW5SYXdBcnJheUJ1ZmZlck9mQnVmZmVyLCB0aGlzLl9fYnl0ZUxlbmd0aCk7XG4gIH1cblxuICB0YWtlQWNjZXNzb3Ioe1xuICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICBjb21wb25lbnRUeXBlLFxuICAgIGNvdW50LFxuICAgIGJ5dGVTdHJpZGUgPSB0aGlzLmRlZmF1bHRCeXRlU3RyaWRlLFxuICAgIG1heCxcbiAgICBtaW4sXG4gICAgYXJyYXlMZW5ndGggPSAxLFxuICAgIG5vcm1hbGl6ZWQgPSBmYWxzZSxcbiAgfToge1xuICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bTtcbiAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICBjb3VudDogQ291bnQ7XG4gICAgYnl0ZVN0cmlkZT86IEJ5dGU7XG4gICAgbWF4PzogbnVtYmVyW107XG4gICAgbWluPzogbnVtYmVyW107XG4gICAgYXJyYXlMZW5ndGg/OiBTaXplO1xuICAgIG5vcm1hbGl6ZWQ/OiBib29sZWFuO1xuICB9KTogUmVzdWx0PEFjY2Vzc29yLCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuX190YWtlQWNjZXNzb3JJbm5lcih7XG4gICAgICBjb21wb3NpdGlvblR5cGUsXG4gICAgICBjb21wb25lbnRUeXBlLFxuICAgICAgY291bnQsXG4gICAgICBieXRlU3RyaWRlLFxuICAgICAgbWF4LFxuICAgICAgbWluLFxuICAgICAgbm9ybWFsaXplZCxcbiAgICAgIGFycmF5TGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjY2Vzc29yO1xuICB9XG5cbiAgdGFrZUFjY2Vzc29yV2l0aEJ5dGVPZmZzZXQoe1xuICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICBjb21wb25lbnRUeXBlLFxuICAgIGNvdW50LFxuICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXcsXG4gICAgYnl0ZVN0cmlkZSA9IHRoaXMuZGVmYXVsdEJ5dGVTdHJpZGUsXG4gICAgbWF4LFxuICAgIG1pbixcbiAgICBub3JtYWxpemVkID0gZmFsc2UsXG4gIH06IHtcbiAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZUVudW07XG4gICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgY291bnQ6IENvdW50O1xuICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXc6IEJ5dGU7XG4gICAgYnl0ZVN0cmlkZT86IEJ5dGU7XG4gICAgbWF4PzogbnVtYmVyW107XG4gICAgbWluPzogbnVtYmVyW107XG4gICAgbm9ybWFsaXplZD86IGJvb2xlYW47XG4gIH0pOiBSZXN1bHQ8QWNjZXNzb3IsIHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5fX3Rha2VBY2Nlc3NvcklubmVyV2l0aEJ5dGVPZmZzZXQoe1xuICAgICAgY29tcG9zaXRpb25UeXBlLFxuICAgICAgY29tcG9uZW50VHlwZSxcbiAgICAgIGNvdW50LFxuICAgICAgYnl0ZVN0cmlkZSxcbiAgICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXcsXG4gICAgICBtYXgsXG4gICAgICBtaW4sXG4gICAgICBub3JtYWxpemVkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjY2Vzc29yO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3Rha2VBY2Nlc3NvcklubmVyKHtcbiAgICBjb21wb3NpdGlvblR5cGUsXG4gICAgY29tcG9uZW50VHlwZSxcbiAgICBjb3VudCxcbiAgICBieXRlU3RyaWRlLFxuICAgIG1heCxcbiAgICBtaW4sXG4gICAgYXJyYXlMZW5ndGgsXG4gICAgbm9ybWFsaXplZCxcbiAgfToge1xuICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bTtcbiAgICBjb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICBjb3VudDogQ291bnQ7XG4gICAgYnl0ZVN0cmlkZTogQnl0ZTtcbiAgICBtYXg/OiBudW1iZXJbXTtcbiAgICBtaW4/OiBudW1iZXJbXTtcbiAgICBhcnJheUxlbmd0aDogU2l6ZTtcbiAgICBub3JtYWxpemVkOiBib29sZWFuO1xuICB9KTogUmVzdWx0PEFjY2Vzc29yLCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBieXRlT2Zmc2V0SW5CdWZmZXJWaWV3ID0gdGhpcy5fX3Rha2VuQnl0ZTtcbiAgICBsZXQgYWN0dWFsQnl0ZVN0cmlkZSA9IGJ5dGVTdHJpZGU7XG4gICAgaWYgKGFjdHVhbEJ5dGVTdHJpZGUgPT09IDApIHtcbiAgICAgIGFjdHVhbEJ5dGVTdHJpZGUgPVxuICAgICAgICBjb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCkgKiBjb21wb25lbnRUeXBlLmdldFNpemVJbkJ5dGVzKCkgKiBhcnJheUxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBFYWNoIGFjY2Vzc29yIE1VU1QgZml0IGl0cyBidWZmZXJWaWV3LCBpLmUuLFxuICAgIC8vIGFjY2Vzc29yLmJ5dGVPZmZzZXQgKyBFRkZFQ1RJVkVfQllURV9TVFJJREUgKiAoYWNjZXNzb3IuY291bnQgLSAxKSArIFNJWkVfT0ZfQ09NUE9ORU5UICogTlVNQkVSX09GX0NPTVBPTkVOVFNcbiAgICAvLyBTZWU6IGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjZGF0YS1hbGlnbm1lbnRcbiAgICBpZiAoXG4gICAgICB0aGlzLl9fdGFrZW5CeXRlICtcbiAgICAgICAgYWN0dWFsQnl0ZVN0cmlkZSAqIChjb3VudCAtIDEpICtcbiAgICAgICAgY29tcG9uZW50VHlwZS5nZXRTaXplSW5CeXRlcygpICogY29tcG9zaXRpb25UeXBlLmdldE51bWJlck9mQ29tcG9uZW50cygpID5cbiAgICAgIHRoaXMuYnl0ZUxlbmd0aFxuICAgICkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBUaGUgc2l6ZSBvZiB0aGUgQWNjZXNzb3IgeW91IGFyZSB0cnlpbmcgdG8gdGFrZSBleGNlZWRzIHRoZSBieXRlIGxlbmd0aCBsZWZ0IGluIHRoZSBCdWZmZXJWaWV3LlxuQnVmZmVyVmlldy5ieXRlTGVuZ3RoOiAke3RoaXMuYnl0ZUxlbmd0aH0sIEJ1ZmZlclZpZXcudGFrZW5TaXplSW5CeXRlOiAke1xuICAgICAgICB0aGlzLl9fdGFrZW5CeXRlXG4gICAgICB9LCBBY2Nlc3Nvci5ieXRlU3RyaWRlOiAke2J5dGVTdHJpZGV9LCBBY2Nlc3Nvci5jb3VudDogJHtjb3VudH07XG5ieXRlU2l6ZVRvVGFrZTogJHthY3R1YWxCeXRlU3RyaWRlICogY291bnR9LCB0aGUgYnl0ZSBsZW5ndGggbGVmdCBpbiB0aGUgQnVmZmVyOiAke1xuICAgICAgICB0aGlzLmJ5dGVMZW5ndGggLSB0aGlzLl9fdGFrZW5CeXRlXG4gICAgICB9YDtcbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3NvciA9IG5ldyBBY2Nlc3Nvcih7XG4gICAgICBidWZmZXJWaWV3OiB0aGlzLFxuICAgICAgYnl0ZU9mZnNldEluQnVmZmVyVmlldzogYnl0ZU9mZnNldEluQnVmZmVyVmlldyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGUsXG4gICAgICBieXRlU3RyaWRlLFxuICAgICAgY291bnQsXG4gICAgICByYXc6IHRoaXMuX19yYXcsXG4gICAgICBtYXgsXG4gICAgICBtaW4sXG4gICAgICBhcnJheUxlbmd0aCxcbiAgICAgIG5vcm1hbGl6ZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9fYWNjZXNzb3JzLnB1c2goYWNjZXNzb3IpO1xuXG4gICAgdGhpcy5fX3Rha2VuQnl0ZSArPSBhY3R1YWxCeXRlU3RyaWRlICogY291bnQ7XG5cbiAgICByZXR1cm4gbmV3IE9rKGFjY2Vzc29yKTtcbiAgfVxuXG4gIHByaXZhdGUgX190YWtlQWNjZXNzb3JJbm5lcldpdGhCeXRlT2Zmc2V0KHtcbiAgICBjb21wb3NpdGlvblR5cGUsXG4gICAgY29tcG9uZW50VHlwZSxcbiAgICBjb3VudCxcbiAgICBieXRlU3RyaWRlLFxuICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXcsXG4gICAgbWF4LFxuICAgIG1pbixcbiAgICBub3JtYWxpemVkLFxuICB9OiB7XG4gICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtO1xuICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICAgIGNvdW50OiBDb3VudDtcbiAgICBieXRlU3RyaWRlOiBCeXRlO1xuICAgIGJ5dGVPZmZzZXRJbkJ1ZmZlclZpZXc6IEJ5dGU7XG4gICAgbWF4PzogbnVtYmVyW107XG4gICAgbWluPzogbnVtYmVyW107XG4gICAgbm9ybWFsaXplZDogYm9vbGVhbjtcbiAgfSk6IFJlc3VsdDxBY2Nlc3NvciwgdW5kZWZpbmVkPiB7XG4gICAgLy8gRWFjaCBhY2Nlc3NvciBNVVNUIGZpdCBpdHMgYnVmZmVyVmlldywgaS5lLixcbiAgICAvLyBhY2Nlc3Nvci5ieXRlT2Zmc2V0ICsgRUZGRUNUSVZFX0JZVEVfU1RSSURFICogKGFjY2Vzc29yLmNvdW50IC0gMSkgKyBTSVpFX09GX0NPTVBPTkVOVCAqIE5VTUJFUl9PRl9DT01QT05FTlRTXG4gICAgLy8gU2VlOiBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI2RhdGEtYWxpZ25tZW50XG4gICAgaWYgKFxuICAgICAgdGhpcy5fX3Rha2VuQnl0ZSArXG4gICAgICAgIGJ5dGVTdHJpZGUgKiAoY291bnQgLSAxKSArXG4gICAgICAgIGNvbXBvbmVudFR5cGUuZ2V0U2l6ZUluQnl0ZXMoKSAqIGNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKSA+XG4gICAgICB0aGlzLmJ5dGVMZW5ndGhcbiAgICApIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIHNpemUgb2YgdGhlIEFjY2Vzc29yIHlvdSBhcmUgdHJ5aW5nIHRvIHRha2UgZXhjZWVkcyB0aGUgYnl0ZSBsZW5ndGggbGVmdCBpbiB0aGUgQnVmZmVyVmlldy5cbkJ1ZmZlclZpZXcuYnl0ZUxlbmd0aDogJHt0aGlzLmJ5dGVMZW5ndGh9LCBCdWZmZXJWaWV3LnRha2VuU2l6ZUluQnl0ZTogJHtcbiAgICAgICAgdGhpcy5fX3Rha2VuQnl0ZVxuICAgICAgfSwgQWNjZXNzb3IuYnl0ZVN0cmlkZTogJHtieXRlU3RyaWRlfSwgQWNjZXNzb3IuY291bnQ6ICR7Y291bnR9O1xuYnl0ZVNpemVUb1Rha2U6ICR7Ynl0ZVN0cmlkZSAqIGNvdW50fSwgdGhlIGJ5dGUgbGVuZ3RoIGxlZnQgaW4gdGhlIEJ1ZmZlcjogJHtcbiAgICAgICAgdGhpcy5ieXRlTGVuZ3RoIC0gdGhpcy5fX3Rha2VuQnl0ZVxuICAgICAgfWA7XG4gICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3NvciA9IG5ldyBBY2Nlc3Nvcih7XG4gICAgICBidWZmZXJWaWV3OiB0aGlzLFxuICAgICAgYnl0ZU9mZnNldEluQnVmZmVyVmlldyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZSxcbiAgICAgIGNvbXBvbmVudFR5cGUsXG4gICAgICBieXRlU3RyaWRlLFxuICAgICAgY291bnQsXG4gICAgICByYXc6IHRoaXMuX19yYXcsXG4gICAgICBtYXgsXG4gICAgICBtaW4sXG4gICAgICBhcnJheUxlbmd0aDogMSxcbiAgICAgIG5vcm1hbGl6ZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9fYWNjZXNzb3JzLnB1c2goYWNjZXNzb3IpO1xuXG4gICAgcmV0dXJuIG5ldyBPayhhY2Nlc3Nvcik7XG4gIH1cblxuICBpc1NhbWUocm5CdWZmZXJWaWV3OiBCdWZmZXJWaWV3KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9PT0gcm5CdWZmZXJWaWV3LmJ5dGVMZW5ndGggJiZcbiAgICAgIHRoaXMuYnl0ZU9mZnNldEluUmF3QXJyYXlCdWZmZXJPZkJ1ZmZlciA9PT0gcm5CdWZmZXJWaWV3LmJ5dGVPZmZzZXRJblJhd0FycmF5QnVmZmVyT2ZCdWZmZXIgJiZcbiAgICAgIHRoaXMuZGVmYXVsdEJ5dGVTdHJpZGUgPT09IHJuQnVmZmVyVmlldy5kZWZhdWx0Qnl0ZVN0cmlkZSAmJlxuICAgICAgdGhpcy5idWZmZXIuZ2V0QXJyYXlCdWZmZXIoKSA9PT0gcm5CdWZmZXJWaWV3LmJ1ZmZlci5nZXRBcnJheUJ1ZmZlcigpXG4gICAgKTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BY2Nlc3Nvcic7XG5leHBvcnQgKiBmcm9tICcuL0J1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL0J1ZmZlclZpZXcnO1xuIiwiaW1wb3J0IHsgR2x0ZkxvYWRPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBCeXRlLCBTaXplIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgZ2xURjEgfSBmcm9tICcuLi8uLi90eXBlcy9nbFRGMSc7XG5pbXBvcnQgeyBSbk0yIH0gZnJvbSAnLi4vLi4vdHlwZXMvUm5NMic7XG5pbXBvcnQgeyBFcnIsIFJlc3VsdCwgT2sgfSBmcm9tICcuL1Jlc3VsdCc7XG5pbXBvcnQgeyBSblByb21pc2UgfSBmcm9tICcuL1JuUHJvbWlzZSc7XG5cbmRlY2xhcmUgY29uc3QgVVJMOiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVXRpbCB7XG4gIHN0YXRpYyBjcmMzMnRhYmxlID1cbiAgICAnMDAwMDAwMDAgNzcwNzMwOTYgRUUwRTYxMkMgOTkwOTUxQkEgMDc2REM0MTkgNzA2QUY0OEYgRTk2M0E1MzUgOUU2NDk1QTMgMEVEQjg4MzIgNzlEQ0I4QTQgRTBENUU5MUUgOTdEMkQ5ODggMDlCNjRDMkIgN0VCMTdDQkQgRTdCODJEMDcgOTBCRjFEOTEgMURCNzEwNjQgNkFCMDIwRjIgRjNCOTcxNDggODRCRTQxREUgMUFEQUQ0N0QgNkREREU0RUIgRjRENEI1NTEgODNEMzg1QzcgMTM2Qzk4NTYgNjQ2QkE4QzAgRkQ2MkY5N0EgOEE2NUM5RUMgMTQwMTVDNEYgNjMwNjZDRDkgRkEwRjNENjMgOEQwODBERjUgM0I2RTIwQzggNEM2OTEwNUUgRDU2MDQxRTQgQTI2NzcxNzIgM0MwM0U0RDEgNEIwNEQ0NDcgRDIwRDg1RkQgQTUwQUI1NkIgMzVCNUE4RkEgNDJCMjk4NkMgREJCQkM5RDYgQUNCQ0Y5NDAgMzJEODZDRTMgNDVERjVDNzUgRENENjBEQ0YgQUJEMTNENTkgMjZEOTMwQUMgNTFERTAwM0EgQzhENzUxODAgQkZEMDYxMTYgMjFCNEY0QjUgNTZCM0M0MjMgQ0ZCQTk1OTkgQjhCREE1MEYgMjgwMkI4OUUgNUYwNTg4MDggQzYwQ0Q5QjIgQjEwQkU5MjQgMkY2RjdDODcgNTg2ODRDMTEgQzE2MTFEQUIgQjY2NjJEM0QgNzZEQzQxOTAgMDFEQjcxMDYgOThEMjIwQkMgRUZENTEwMkEgNzFCMTg1ODkgMDZCNkI1MUYgOUZCRkU0QTUgRThCOEQ0MzMgNzgwN0M5QTIgMEYwMEY5MzQgOTYwOUE4OEUgRTEwRTk4MTggN0Y2QTBEQkIgMDg2RDNEMkQgOTE2NDZDOTcgRTY2MzVDMDEgNkI2QjUxRjQgMUM2QzYxNjIgODU2NTMwRDggRjI2MjAwNEUgNkMwNjk1RUQgMUIwMUE1N0IgODIwOEY0QzEgRjUwRkM0NTcgNjVCMEQ5QzYgMTJCN0U5NTAgOEJCRUI4RUEgRkNCOTg4N0MgNjJERDFEREYgMTVEQTJENDkgOENEMzdDRjMgRkJENDRDNjUgNERCMjYxNTggM0FCNTUxQ0UgQTNCQzAwNzQgRDRCQjMwRTIgNEFERkE1NDEgM0REODk1RDcgQTREMUM0NkQgRDNENkY0RkIgNDM2OUU5NkEgMzQ2RUQ5RkMgQUQ2Nzg4NDYgREE2MEI4RDAgNDQwNDJENzMgMzMwMzFERTUgQUEwQTRDNUYgREQwRDdDQzkgNTAwNTcxM0MgMjcwMjQxQUEgQkUwQjEwMTAgQzkwQzIwODYgNTc2OEI1MjUgMjA2Rjg1QjMgQjk2NkQ0MDkgQ0U2MUU0OUYgNUVERUY5MEUgMjlEOUM5OTggQjBEMDk4MjIgQzdEN0E4QjQgNTlCMzNEMTcgMkVCNDBEODEgQjdCRDVDM0IgQzBCQTZDQUQgRURCODgzMjAgOUFCRkIzQjYgMDNCNkUyMEMgNzRCMUQyOUEgRUFENTQ3MzkgOUREMjc3QUYgMDREQjI2MTUgNzNEQzE2ODMgRTM2MzBCMTIgOTQ2NDNCODQgMEQ2RDZBM0UgN0E2QTVBQTggRTQwRUNGMEIgOTMwOUZGOUQgMEEwMEFFMjcgN0QwNzlFQjEgRjAwRjkzNDQgODcwOEEzRDIgMUUwMUYyNjggNjkwNkMyRkUgRjc2MjU3NUQgODA2NTY3Q0IgMTk2QzM2NzEgNkU2QjA2RTcgRkVENDFCNzYgODlEMzJCRTAgMTBEQTdBNUEgNjdERDRBQ0MgRjlCOURGNkYgOEVCRUVGRjkgMTdCN0JFNDMgNjBCMDhFRDUgRDZENkEzRTggQTFEMTkzN0UgMzhEOEMyQzQgNEZERkYyNTIgRDFCQjY3RjEgQTZCQzU3NjcgM0ZCNTA2REQgNDhCMjM2NEIgRDgwRDJCREEgQUYwQTFCNEMgMzYwMzRBRjYgNDEwNDdBNjAgREY2MEVGQzMgQTg2N0RGNTUgMzE2RThFRUYgNDY2OUJFNzkgQ0I2MUIzOEMgQkM2NjgzMUEgMjU2RkQyQTAgNTI2OEUyMzYgQ0MwQzc3OTUgQkIwQjQ3MDMgMjIwMjE2QjkgNTUwNTI2MkYgQzVCQTNCQkUgQjJCRDBCMjggMkJCNDVBOTIgNUNCMzZBMDQgQzJEN0ZGQTcgQjVEMENGMzEgMkNEOTlFOEIgNUJERUFFMUQgOUI2NEMyQjAgRUM2M0YyMjYgNzU2QUEzOUMgMDI2RDkzMEEgOUMwOTA2QTkgRUIwRTM2M0YgNzIwNzY3ODUgMDUwMDU3MTMgOTVCRjRBODIgRTJCODdBMTQgN0JCMTJCQUUgMENCNjFCMzggOTJEMjhFOUIgRTVENUJFMEQgN0NEQ0VGQjcgMEJEQkRGMjEgODZEM0QyRDQgRjFENEUyNDIgNjhEREIzRjggMUZEQTgzNkUgODFCRTE2Q0QgRjZCOTI2NUIgNkZCMDc3RTEgMThCNzQ3NzcgODgwODVBRTYgRkYwRjZBNzAgNjYwNjNCQ0EgMTEwMTBCNUMgOEY2NTlFRkYgRjg2MkFFNjkgNjE2QkZGRDMgMTY2Q0NGNDUgQTAwQUUyNzggRDcwREQyRUUgNEUwNDgzNTQgMzkwM0IzQzIgQTc2NzI2NjEgRDA2MDE2RjcgNDk2OTQ3NEQgM0U2RTc3REIgQUVEMTZBNEEgRDlENjVBREMgNDBERjBCNjYgMzdEODNCRjAgQTlCQ0FFNTMgREVCQjlFQzUgNDdCMkNGN0YgMzBCNUZGRTkgQkRCREYyMUMgQ0FCQUMyOEEgNTNCMzkzMzAgMjRCNEEzQTYgQkFEMDM2MDUgQ0RENzA2OTMgNTRERTU3MjkgMjNEOTY3QkYgQjM2NjdBMkUgQzQ2MTRBQjggNUQ2ODFCMDIgMkE2RjJCOTQgQjQwQkJFMzcgQzMwQzhFQTEgNUEwNURGMUIgMkQwMkVGOEQnLnNwbGl0KFxuICAgICAgJyAnXG4gICAgKTtcblxuICBzdGF0aWMgaXNOb2RlKCkge1xuICAgIGNvbnN0IGlzTm9kZSA9XG4gICAgICB3aW5kb3cgPT09IHZvaWQgMCAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiBpc05vZGU7XG4gIH1cblxuICBzdGF0aWMgYnRvYShzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGlzTm9kZSA9IERhdGFVdGlsLmlzTm9kZSgpO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIGxldCBidWZmZXI7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cikpIHtcbiAgICAgICAgYnVmZmVyID0gc3RyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oc3RyLnRvU3RyaW5nKCksICdiaW5hcnknKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnRvYShzdHIpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhdG9iKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgaXNOb2RlID0gRGF0YVV0aWwuaXNOb2RlKCk7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF0b2Ioc3RyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGF0YVVyaVRvQXJyYXlCdWZmZXIoZGF0YVVyaTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3BsaXREYXRhVXJpID0gZGF0YVVyaS5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IGJ5dGVTdHJpbmcgPSBEYXRhVXRpbC5hdG9iKHNwbGl0RGF0YVVyaVsxXSk7XG4gICAgY29uc3QgYnl0ZVN0cmluZ0xlbmd0aCA9IGJ5dGVTdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmdMZW5ndGgpO1xuICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlU3RyaW5nTGVuZ3RoOyBpKyspIHtcbiAgICAgIHVpbnQ4QXJyYXlbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheUJ1ZmZlcjtcbiAgfVxuXG4gIHN0YXRpYyBhcnJheUJ1ZmZlclRvU3RyaW5nKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcikge1xuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShhcnJheUJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy51aW50OEFycmF5VG9TdHJpbmdJbm5lcihieXRlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1aW50OEFycmF5VG9TdHJpbmcodWludDhBcnJheTogVWludDhBcnJheSkge1xuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZSh1aW50OEFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy51aW50OEFycmF5VG9TdHJpbmdJbm5lcih1aW50OEFycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQmFzZTY0KHN0cjogc3RyaW5nKSB7XG4gICAgbGV0IGI2NCA9IG51bGw7XG4gICAgYjY0ID0gRGF0YVV0aWwuYnRvYShzdHIpO1xuICAgIHJldHVybiBiNjQ7XG4gIH1cblxuICBzdGF0aWMgYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQ6IHN0cmluZykge1xuICAgIGNvbnN0IGJpbmFyeV9zdHJpbmcgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGxlbiA9IGJpbmFyeV9zdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBieXRlc1tpXSA9IGJpbmFyeV9zdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzLmJ1ZmZlcjtcbiAgfVxuXG4gIHN0YXRpYyBVSW50OEFycmF5VG9EYXRhVVJMKHVpbnQ4YXJyYXk6IFVpbnQ4QXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaW1hZ2VEYXRhLmRhdGFbaSArIDBdID1cbiAgICAgICAgdWludDhhcnJheVsoaGVpZ2h0IC0gTWF0aC5mbG9vcihpIC8gKDQgKiB3aWR0aCkpKSAqICg0ICogd2lkdGgpICsgKGkgJSAoNCAqIHdpZHRoKSkgKyAwXTtcbiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAxXSA9XG4gICAgICAgIHVpbnQ4YXJyYXlbKGhlaWdodCAtIE1hdGguZmxvb3IoaSAvICg0ICogd2lkdGgpKSkgKiAoNCAqIHdpZHRoKSArIChpICUgKDQgKiB3aWR0aCkpICsgMV07XG4gICAgICBpbWFnZURhdGEuZGF0YVtpICsgMl0gPVxuICAgICAgICB1aW50OGFycmF5WyhoZWlnaHQgLSBNYXRoLmZsb29yKGkgLyAoNCAqIHdpZHRoKSkpICogKDQgKiB3aWR0aCkgKyAoaSAlICg0ICogd2lkdGgpKSArIDJdO1xuICAgICAgaW1hZ2VEYXRhLmRhdGFbaSArIDNdID1cbiAgICAgICAgdWludDhhcnJheVsoaGVpZ2h0IC0gTWF0aC5mbG9vcihpIC8gKDQgKiB3aWR0aCkpKSAqICg0ICogd2lkdGgpICsgKGkgJSAoNCAqIHdpZHRoKSkgKyAzXTtcbiAgICB9XG5cbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgY2FudmFzLnJlbW92ZSgpO1xuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIHN0YXRpYyBsb2FkUmVzb3VyY2VBc3luYyhcbiAgICByZXNvdXJjZVVyaTogc3RyaW5nLFxuICAgIGlzQmluYXJ5OiBib29sZWFuLFxuICAgIHJlc29sdmVDYWxsYmFjazogRnVuY3Rpb24sXG4gICAgcmVqZWN0Q2FsbGJhY2s6IEZ1bmN0aW9uXG4gICkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGlzTm9kZSA9IERhdGFVdGlsLmlzTm9kZSgpO1xuXG4gICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgIC8vIGNvbnN0IGFyZ3M6IGFueVtdID0gW3Jlc291cmNlVXJpXTtcbiAgICAgICAgLy8gY29uc3QgZnVuYzogRnVuY3Rpb24gPSAoZXJyOmFueSwgcmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAvLyAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gICAgIGlmIChyZWplY3RDYWxsYmFjaykge1xuICAgICAgICAvLyAgICAgICByZWplY3RDYWxsYmFjayhyZWplY3QsIGVycik7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyAgIGlmIChpc0JpbmFyeSkge1xuICAgICAgICAvLyAgICAgY29uc3QgYnVmZmVyID0gbmV3IEJ1ZmZlcihyZXNwb25zZSwgJ2JpbmFyeScpO1xuICAgICAgICAvLyAgICAgY29uc3QgdWludDhCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICAvLyAgICAgcmVzcG9uc2UgPSB1aW50OEJ1ZmZlci5idWZmZXI7XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyAgIHJlc29sdmVDYWxsYmFjayhyZXNvbHZlLCByZXNwb25zZSk7XG4gICAgICAgIC8vIH07XG4gICAgICAgIC8vIGlmIChpc0JpbmFyeSkge1xuICAgICAgICAvLyAgIGFyZ3MucHVzaChmdW5jKTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICBhcmdzLnB1c2goJ3V0ZjgnKTtcbiAgICAgICAgLy8gICBhcmdzLnB1c2goZnVuYyk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gZnMucmVhZEZpbGUoLi4uYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB4bWxIdHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGlmIChpc0JpbmFyeSkge1xuICAgICAgICAgIHhtbEh0dHAub25sb2FkID0gKG9FdmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc0JpbmFyeSkge1xuICAgICAgICAgICAgICByZXNwb25zZSA9IHhtbEh0dHAucmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNwb25zZSA9IHhtbEh0dHAucmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZUNhbGxiYWNrKHJlc29sdmUsIHJlc3BvbnNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHhtbEh0dHAub3BlbignR0VUJywgcmVzb3VyY2VVcmksIHRydWUpO1xuICAgICAgICAgIHhtbEh0dHAucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4bWxIdHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgeG1sSHR0cC5yZWFkeVN0YXRlID09PSA0ICYmXG4gICAgICAgICAgICAgIChNYXRoLmZsb29yKHhtbEh0dHAuc3RhdHVzIC8gMTAwKSA9PT0gMiB8fCB4bWxIdHRwLnN0YXR1cyA9PT0gMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICAgICAgICBpZiAoaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHhtbEh0dHAucmVzcG9uc2U7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB4bWxIdHRwLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlQ2FsbGJhY2socmVzb2x2ZSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHJlamVjdENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0Q2FsbGJhY2socmVqZWN0LCB4bWxIdHRwLnN0YXR1cyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHhtbEh0dHAub3BlbignR0VUJywgcmVzb3VyY2VVcmksIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgeG1sSHR0cC5zZW5kKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHRvQ1JDMzIoc3RyOiBzdHJpbmcpIHtcbiAgICBsZXQgY3JjID0gMCxcbiAgICAgIHg6IGFueSA9IDAsXG4gICAgICB5ID0gMDtcbiAgICBjb25zdCB0YWJsZSA9IERhdGFVdGlsLmNyYzMydGFibGU7XG5cbiAgICBjcmMgPSBjcmMgXiAtMTtcbiAgICBmb3IgKGxldCBpID0gMCwgaVRvcCA9IHN0ci5sZW5ndGg7IGkgPCBpVG9wOyArK2kpIHtcbiAgICAgIHkgPSAoY3JjIF4gc3RyLmNoYXJDb2RlQXQoaSkpICYgMHhmZjtcbiAgICAgIHggPSAnMHgnICsgdGFibGVbeV07XG4gICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHg7XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAtMSkgPj4+IDA7XG4gIH1cblxuICBzdGF0aWMgYWNjZXNzQmluYXJ5QXNJbWFnZShcbiAgICBidWZmZXJWaWV3SW5kZXg6IG51bWJlcixcbiAgICBqc29uOiBhbnksXG4gICAgYnVmZmVyOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXksXG4gICAgbWltZVR5cGU6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHVpbnQ4QnVmZmVyVmlldyA9IHRoaXMudGFrZUJ1ZmZlclZpZXdBc1VpbnQ4QXJyYXkoanNvbiwgYnVmZmVyVmlld0luZGV4LCBidWZmZXIpO1xuICAgIHJldHVybiB0aGlzLmFjY2Vzc0FycmF5QnVmZmVyQXNJbWFnZSh1aW50OEJ1ZmZlclZpZXcsIG1pbWVUeXBlKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVCbG9iSW1hZ2VVcmlGcm9tVWludDhBcnJheSh1aW50OEFycmF5OiBVaW50OEFycmF5LCBtaW1lVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3VpbnQ4QXJyYXldLCB7IHR5cGU6IG1pbWVUeXBlIH0pO1xuICAgIGNvbnN0IGltYWdlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICByZXR1cm4gaW1hZ2VVcmw7XG4gIH1cblxuICBzdGF0aWMgdGFrZUJ1ZmZlclZpZXdBc1VpbnQ4QXJyYXkoXG4gICAganNvbjogUm5NMixcbiAgICBidWZmZXJWaWV3SW5kZXg6IG51bWJlcixcbiAgICBidWZmZXI6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheVxuICApOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCBidWZmZXJWaWV3SnNvbiA9IGpzb24uYnVmZmVyVmlld3NbYnVmZmVyVmlld0luZGV4XTtcbiAgICBsZXQgYnl0ZU9mZnNldCA9IGJ1ZmZlclZpZXdKc29uLmJ5dGVPZmZzZXQgPz8gMDtcbiAgICBjb25zdCBieXRlTGVuZ3RoID0gYnVmZmVyVmlld0pzb24uYnl0ZUxlbmd0aDtcbiAgICBsZXQgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyID0gYnVmZmVyO1xuICAgIGlmIChidWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICBhcnJheUJ1ZmZlciA9IGJ1ZmZlci5idWZmZXI7XG4gICAgICBieXRlT2Zmc2V0ICs9IGJ1ZmZlci5ieXRlT2Zmc2V0O1xuICAgIH1cbiAgICBjb25zdCB1aW50OEJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gICAgcmV0dXJuIHVpbnQ4QnVmZmVyVmlldztcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NBcnJheUJ1ZmZlckFzSW1hZ2UoXG4gICAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSxcbiAgICBpbWFnZVR5cGU6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGJpbmFyeURhdGEgPSB0aGlzLnVpbnQ4QXJyYXlUb1N0cmluZ0lubmVyKG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgY29uc3QgaW1nU3JjID0gdGhpcy5nZXRJbWFnZVR5cGUoaW1hZ2VUeXBlKTtcbiAgICBjb25zdCBkYXRhVXJsID0gaW1nU3JjICsgRGF0YVV0aWwuYnRvYShiaW5hcnlEYXRhKTtcbiAgICByZXR1cm4gZGF0YVVybDtcbiAgfVxuXG4gIHN0YXRpYyB1aW50OEFycmF5VG9TdHJpbmdJbm5lcih1aW50ODogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhckNvZGVBcnJheTogbnVtYmVyW10gPSBuZXcgQXJyYXkodWludDguYnl0ZUxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1aW50OC5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXJDb2RlQXJyYXlbaV0gPSB1aW50OFtpXTtcbiAgICB9XG5cbiAgICAvLyB0aGUgYXJndW1lbnQgb2YgU3RyaW5nLmZyb21DaGFyQ29kZSBoYXMgdGhlIGxpbWl0IG9mIGFycmF5IGxlbmd0aFxuICAgIGNvbnN0IGNvbnN0YW50ID0gMTAyNDtcbiAgICBjb25zdCBkaXZpc2lvbk51bWJlciA9IE1hdGguY2VpbChjaGFyQ29kZUFycmF5Lmxlbmd0aCAvIGNvbnN0YW50KTtcblxuICAgIGxldCBiaW5hcnlEYXRhID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXZpc2lvbk51bWJlcjsgaSsrKSB7XG4gICAgICBiaW5hcnlEYXRhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGNoYXJDb2RlQXJyYXkuc2xpY2UoaSAqIGNvbnN0YW50LCAoaSArIDEpICogY29uc3RhbnQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYmluYXJ5RGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbWFnZVR5cGUoaW1hZ2VUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBpbWdTcmMgPSBudWxsO1xuICAgIGlmIChcbiAgICAgIGltYWdlVHlwZSA9PT0gJ2ltYWdlL2pwZWcnIHx8XG4gICAgICBpbWFnZVR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2pwZycgfHxcbiAgICAgIGltYWdlVHlwZS50b0xvd2VyQ2FzZSgpID09PSAnanBlZydcbiAgICApIHtcbiAgICAgIGltZ1NyYyA9ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCc7XG4gICAgfSBlbHNlIGlmIChpbWFnZVR5cGUgPT09ICdpbWFnZS9wbmcnIHx8IGltYWdlVHlwZS50b0xvd2VyQ2FzZSgpID09PSAncG5nJykge1xuICAgICAgaW1nU3JjID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnO1xuICAgIH0gZWxzZSBpZiAoaW1hZ2VUeXBlID09PSAnaW1hZ2UvZ2lmJyB8fCBpbWFnZVR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpZicpIHtcbiAgICAgIGltZ1NyYyA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsJztcbiAgICB9IGVsc2UgaWYgKGltYWdlVHlwZSA9PT0gJ2ltYWdlL2JtcCcgfHwgaW1hZ2VUeXBlLnRvTG93ZXJDYXNlKCkgPT09ICdibXAnKSB7XG4gICAgICBpbWdTcmMgPSAnZGF0YTppbWFnZS9ibXA7YmFzZTY0LCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZ1NyYyA9ICdkYXRhOmltYWdlL3Vua25vd247YmFzZTY0LCc7XG4gICAgfVxuICAgIHJldHVybiBpbWdTcmM7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgaW1nU3JjID0gbnVsbDtcbiAgICBpZiAoZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkgPT09ICdqcGcnIHx8IGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpID09PSAnanBlZycpIHtcbiAgICAgIGltZ1NyYyA9ICdpbWFnZS9qcGVnJztcbiAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpID09PSAncG5nJykge1xuICAgICAgaW1nU3JjID0gJ2ltYWdlL3BuZyc7XG4gICAgfSBlbHNlIGlmIChleHRlbnNpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2dpZicpIHtcbiAgICAgIGltZ1NyYyA9ICdpbWFnZS9naWYnO1xuICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkgPT09ICdibXAnKSB7XG4gICAgICBpbWdTcmMgPSAnaW1hZ2UvYm1wJztcbiAgICB9IGVsc2Uge1xuICAgICAgaW1nU3JjID0gJ2ltYWdlL3Vua25vd24nO1xuICAgIH1cbiAgICByZXR1cm4gaW1nU3JjO1xuICB9XG5cbiAgc3RhdGljIGdldEV4dGVuc2lvbihmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGxpdHRlZCA9IGZpbGVOYW1lLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHNwbGl0dGVkW3NwbGl0dGVkLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBmaWxlRXh0ZW5zaW9uO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVVpbnQ4QXJyYXlGcm9tQnVmZmVyVmlld0luZm8oXG4gICAganNvbjogUm5NMiB8IGdsVEYxLFxuICAgIGJ1ZmZlclZpZXdJbmRleDogbnVtYmVyLFxuICAgIGJ1ZmZlcjogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5XG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IGJ1ZmZlclZpZXdKc29uID0ganNvbi5idWZmZXJWaWV3c1tidWZmZXJWaWV3SW5kZXhdO1xuICAgIGxldCBieXRlT2Zmc2V0ID0gYnVmZmVyVmlld0pzb24uYnl0ZU9mZnNldCA/PyAwO1xuICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBidWZmZXJWaWV3SnNvbi5ieXRlTGVuZ3RoO1xuICAgIGxldCBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIgPSBidWZmZXI7XG4gICAgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIGFycmF5QnVmZmVyID0gYnVmZmVyLmJ1ZmZlcjtcbiAgICAgIGJ5dGVPZmZzZXQgKz0gYnVmZmVyLmJ5dGVPZmZzZXQ7XG4gICAgfVxuICAgIGNvbnN0IHVpbnQ4QnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gdWludDhCdWZmZXJWaWV3O1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUltYWdlRnJvbVVyaSh1cmk6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZyk6IFJuUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBSblByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG5cbiAgICAgIGlmICh1cmkubWF0Y2goL15ibG9iOi8pIHx8IHVyaS5tYXRjaCgvXmRhdGE6LykpIHtcbiAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGltZyk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5zcmMgPSB1cmk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsb2FkID0gKGltZzogSFRNTEltYWdlRWxlbWVudCwgcmVzcG9uc2U6IEFycmF5QnVmZmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XG4gICAgICAgICAgY29uc3QgaW1hZ2VVcmkgPSBEYXRhVXRpbC5jcmVhdGVCbG9iSW1hZ2VVcmlGcm9tVWludDhBcnJheShieXRlcywgbWltZVR5cGUpO1xuICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGltZyk7XG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltYWdlVXJpKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGltZy5zcmMgPSBpbWFnZVVyaTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBsb2FkQmluYXJ5SW1hZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IChmdW5jdGlvbiAoX2ltZykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0ICYmIHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGxvYWQoX2ltZywgeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KShpbWcpO1xuICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmkpO1xuICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgIH07XG4gICAgICAgIGxvYWRCaW5hcnlJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURlZmF1bHRHbHRmT3B0aW9ucygpOiBHbHRmTG9hZE9wdGlvbiB7XG4gICAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IEdsdGZMb2FkT3B0aW9uID0ge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgLy8gICAgICAgIFwiZm9vLmdsdGZcIjogY29udGVudCBvZiBmaWxlIGFzIEFycmF5QnVmZmVyLFxuICAgICAgICAvLyAgICAgICAgXCJmb28uYmluXCI6IGNvbnRlbnQgb2YgZmlsZSBhcyBBcnJheUJ1ZmZlcixcbiAgICAgICAgLy8gICAgICAgIFwiYm9vLnBuZ1wiOiBjb250ZW50IG9mIGZpbGUgYXMgQXJyYXlCdWZmZXJcbiAgICAgIH0sXG4gICAgICBsb2FkZXJFeHRlbnNpb246IHVuZGVmaW5lZCxcbiAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlck5hbWU6IHVuZGVmaW5lZCxcbiAgICAgIGRlZmF1bHRNYXRlcmlhbEhlbHBlckFyZ3VtZW50QXJyYXk6IFtdLFxuICAgICAgc3RhdGVzT2ZFbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0czogW10sIC8vW1wibmFtZV9mb29cIiwgXCJuYW1lX2Jvb1wiXSxcbiAgICAgICAgICBzdGF0ZXM6IHtcbiAgICAgICAgICAgIGVuYWJsZTogW1xuICAgICAgICAgICAgICAvLyAzMDQyLCAgLy8gQkxFTkRcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBmdW5jdGlvbnM6IHtcbiAgICAgICAgICAgICAgLy9cImJsZW5kRnVuY1NlcGFyYXRlXCI6IFsxLCAwLCAxLCAwXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc1RyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgIG9wYWNpdHk6IDEuMCxcbiAgICAgICAgICBpc1RleHR1cmVJbWFnZVRvTG9hZFByZU11bHRpcGxpZWRBbHBoYTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGFuZ2VudENhbGN1bGF0aW9uTW9kZTogMSxcbiAgICAgIGV4dGVuZGVkSnNvbjogdm9pZCAwLCAvLyAgIFVSSSBzdHJpbmcgLyBKU09OIE9iamVjdCAvIEFycmF5QnVmZmVyXG4gICAgICBfX2ltcG9ydGVkVHlwZTogJ3VuZGVmaW5lZCcsXG4gICAgfTtcblxuICAgIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmZXRjaEFycmF5QnVmZmVyKHVyaTogc3RyaW5nKTogUHJvbWlzZTxSZXN1bHQ8QXJyYXlCdWZmZXIsIHVua25vd24+PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIHsgbW9kZTogJ2NvcnMnIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiBuZXcgRXJyKHtcbiAgICAgICAgbWVzc2FnZTogYGZldGNoQXJyYXlCdWZmZXIgZmFpbGVkLiB1cmk6ICR7dXJpfWAsXG4gICAgICAgIGVycm9yOiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gbmV3IE9rKGFycmF5YnVmZmVyKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRSZXNpemVkQ2FudmFzKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBtYXhTaXplOiBTaXplKTogW0hUTUxDYW52YXNFbGVtZW50LCBTaXplLCBTaXplXSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY29uc3QgcG90V2lkdGggPSB0aGlzLmdldE5lYXJlc3RQb3dlck9mVHdvKGltYWdlLndpZHRoKTtcbiAgICBjb25zdCBwb3RIZWlnaHQgPSB0aGlzLmdldE5lYXJlc3RQb3dlck9mVHdvKGltYWdlLmhlaWdodCk7XG5cbiAgICBjb25zdCBhc3BlY3QgPSBwb3RIZWlnaHQgLyBwb3RXaWR0aDtcbiAgICBsZXQgZHN0V2lkdGggPSAwO1xuICAgIGxldCBkc3RIZWlnaHQgPSAwO1xuICAgIGlmIChwb3RXaWR0aCA+IHBvdEhlaWdodCkge1xuICAgICAgZHN0V2lkdGggPSBNYXRoLm1pbihwb3RXaWR0aCwgbWF4U2l6ZSk7XG4gICAgICBkc3RIZWlnaHQgPSBkc3RXaWR0aCAqIGFzcGVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHN0SGVpZ2h0ID0gTWF0aC5taW4ocG90SGVpZ2h0LCBtYXhTaXplKTtcbiAgICAgIGRzdFdpZHRoID0gZHN0SGVpZ2h0IC8gYXNwZWN0O1xuICAgIH1cbiAgICBjYW52YXMud2lkdGggPSBkc3RXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gZHN0SGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIDAsIGRzdFdpZHRoLCBkc3RIZWlnaHQpO1xuXG4gICAgcmV0dXJuIFtjYW52YXMsIGRzdFdpZHRoLCBkc3RIZWlnaHRdO1xuICB9XG5cbiAgc3RhdGljIGRldGVjdFRyYW5zcGFyZW50UGl4ZWxFeGlzdGVuY2UoXG4gICAgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBIVE1MQ2FudmFzRWxlbWVudCB8IEltYWdlRGF0YSxcbiAgICB0aHJlc2hvbGQgPSAxLjBcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHN0V2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICBjb25zdCBkc3RIZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG4gICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIGxldCBpbWFnZURhdGE6IEltYWdlRGF0YTtcbiAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgIGltYWdlRGF0YSA9IGltYWdlO1xuICAgIH0gZWxzZSBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApITtcbiAgICAgIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgZHN0V2lkdGgsIGRzdEhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG11c3QgYmUgSFRNTENhbnZhc0hUTUxcbiAgICAgIGN0eCA9IGltYWdlLmdldENvbnRleHQoJzJkJykhO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCkhO1xuICAgICAgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBkc3RXaWR0aCwgZHN0SGVpZ2h0KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzdEhlaWdodDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRzdFdpZHRoOyB4KyspIHtcbiAgICAgICAgY29uc3QgYWxwaGEgPSBpbWFnZURhdGEuZGF0YVsoeCArIHkgKiBkc3RXaWR0aCkgKiA0ICsgM107XG4gICAgICAgIGlmIChhbHBoYSA8IHRocmVzaG9sZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYSB2YWx1ZSBuZWFyZXN0IHBvd2VyIG9mIHR3by5cbiAgICpcbiAgICogQHBhcmFtIHggdGV4dHVyZSBzaXplLlxuICAgKiBAcmV0dXJucyBhIHZhbHVlIG5lYXJlc3QgcG93ZXIgb2YgdHdvLlxuICAgKi9cbiAgc3RhdGljIGdldE5lYXJlc3RQb3dlck9mVHdvKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgucm91bmQoTWF0aC5sb2coeCkgLyBNYXRoLkxOMikpO1xuICB9XG5cbiAgc3RhdGljIGNhbGNQYWRkaW5nQnl0ZXMob3JpZ2luYWxCeXRlTGVuZ3RoOiBCeXRlLCBieXRlQWxpZ246IEJ5dGUpIHtcbiAgICBpZiAob3JpZ2luYWxCeXRlTGVuZ3RoICUgYnl0ZUFsaWduICE9PSAwKSB7XG4gICAgICBjb25zdCBzaXplVG9QYWRkaW5nID0gYnl0ZUFsaWduIC0gKG9yaWdpbmFsQnl0ZUxlbmd0aCAlIGJ5dGVBbGlnbik7XG4gICAgICByZXR1cm4gc2l6ZVRvUGFkZGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHN0YXRpYyBhZGRQYWRkaW5nQnl0ZXMob3JpZ2luYWxCeXRlTGVuZ3RoOiBCeXRlLCBieXRlQWxpZ246IEJ5dGUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxCeXRlTGVuZ3RoICsgdGhpcy5jYWxjUGFkZGluZ0J5dGVzKG9yaWdpbmFsQnl0ZUxlbmd0aCwgYnl0ZUFsaWduKTtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVkSW50OEFycmF5VG9GbG9hdDMyQXJyYXkoZnJvbTogSW50OEFycmF5IHwgbnVtYmVyW10pIHtcbiAgICBjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZyb20ubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZsb2F0MzJBcnJheVtpXSA9IE1hdGgubWF4KGZyb21baV0gLyAxMjcuMCwgLTEuMCk7XG4gICAgfVxuICAgIHJldHVybiBmbG9hdDMyQXJyYXk7XG4gIH1cblxuICBzdGF0aWMgbm9ybWFsaXplZFVpbnQ4QXJyYXlUb0Zsb2F0MzJBcnJheShmcm9tOiBVaW50OEFycmF5IHwgbnVtYmVyW10pIHtcbiAgICBjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZyb20ubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZsb2F0MzJBcnJheVtpXSA9IGZyb21baV0gLyAyNTUuMDtcbiAgICB9XG4gICAgcmV0dXJuIGZsb2F0MzJBcnJheTtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVkSW50MTZBcnJheVRvRmxvYXQzMkFycmF5KGZyb206IEludDE2QXJyYXkgfCBudW1iZXJbXSkge1xuICAgIGNvbnN0IGZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZnJvbS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgZmxvYXQzMkFycmF5W2ldID0gTWF0aC5tYXgoZnJvbVtpXSAvIDMyNzY3LjAsIC0xLjApO1xuICAgIH1cbiAgICByZXR1cm4gZmxvYXQzMkFycmF5O1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZWRVaW50MTZBcnJheVRvRmxvYXQzMkFycmF5KGZyb206IFVpbnQxNkFycmF5IHwgbnVtYmVyW10pIHtcbiAgICBjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGZyb20ubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZsb2F0MzJBcnJheVtpXSA9IGZyb21baV0gLyA2NTUzNS4wO1xuICAgIH1cbiAgICByZXR1cm4gZmxvYXQzMkFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBhIGNvcHkgb2YgdGhlIHNyYyBhcnJheWJ1ZmZlclxuICAgKiBAcGFyYW0gcGFyYW0wIGNvcHkgZGVzY3JpcHRpb25cbiAgICogQHJldHVybnMgY29waWVkIG1lbW9yeSBhcyBBcnJheUJ1ZmZlclxuICAgKi9cbiAgc3RhdGljIGdldENvcHkoe1xuICAgIHNyYyxcbiAgICBzcmNCeXRlT2Zmc2V0LFxuICAgIGNvcHlCeXRlTGVuZ3RoLFxuICAgIGRpc3RCeXRlT2Zmc2V0LFxuICB9OiB7XG4gICAgc3JjOiBBcnJheUJ1ZmZlcjtcbiAgICBzcmNCeXRlT2Zmc2V0OiBCeXRlO1xuICAgIGNvcHlCeXRlTGVuZ3RoOiBCeXRlO1xuICAgIGRpc3RCeXRlT2Zmc2V0OiBCeXRlO1xuICB9KTogQXJyYXlCdWZmZXIge1xuICAgIGNvbnN0IGRzdCA9IG5ldyBBcnJheUJ1ZmZlcihzcmMuYnl0ZUxlbmd0aCk7XG4gICAgY29uc3QgZGlzdCA9IG5ldyBVaW50OEFycmF5KGRzdCwgZGlzdEJ5dGVPZmZzZXQsIGNvcHlCeXRlTGVuZ3RoKTtcbiAgICBkaXN0LnNldChuZXcgVWludDhBcnJheShzcmMsIHNyY0J5dGVPZmZzZXQsIGNvcHlCeXRlTGVuZ3RoKSk7XG5cbiAgICByZXR1cm4gZGlzdC5idWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGEgY29weSBvZiB0aGUgc3JjIGFycmF5YnVmZmVyXG4gICAqIEBwYXJhbSBwYXJhbTAgY29weSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJucyBjb3BpZWQgbWVtb3J5IGFzIEFycmF5QnVmZmVyXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29weUFzNEJ5dGVzKHtcbiAgICBzcmMsXG4gICAgc3JjQnl0ZU9mZnNldCxcbiAgICBjb3B5Qnl0ZUxlbmd0aCxcbiAgICBkaXN0Qnl0ZU9mZnNldCxcbiAgfToge1xuICAgIHNyYzogQXJyYXlCdWZmZXI7XG4gICAgc3JjQnl0ZU9mZnNldDogQnl0ZTtcbiAgICBjb3B5Qnl0ZUxlbmd0aDogQnl0ZTtcbiAgICBkaXN0Qnl0ZU9mZnNldDogQnl0ZTtcbiAgfSk6IEFycmF5QnVmZmVyIHtcbiAgICBpZiAoc3JjQnl0ZU9mZnNldCAlIDQgIT09IDAgfHwgY29weUJ5dGVMZW5ndGggJSA0ICE9PSAwIHx8IGRpc3RCeXRlT2Zmc2V0ICUgNCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ5dGUgYWxpZ24gZm9yIDRieXRlcyB1bml0IGNvcHkgb3BlcmF0aW9uLicpO1xuICAgIH1cbiAgICBjb25zdCBkc3QgPSBuZXcgQXJyYXlCdWZmZXIoc3JjLmJ5dGVMZW5ndGgpO1xuICAgIGNvbnN0IGRpc3QgPSBuZXcgSW50MzJBcnJheShkc3QsIGRpc3RCeXRlT2Zmc2V0LCBjb3B5Qnl0ZUxlbmd0aCAvIDQpO1xuICAgIGRpc3Quc2V0KG5ldyBJbnQzMkFycmF5KHNyYywgc3JjQnl0ZU9mZnNldCwgY29weUJ5dGVMZW5ndGggLyA0KSk7XG5cbiAgICByZXR1cm4gZGlzdC5idWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGEgY29weSBvZiB0aGUgc3JjIGFycmF5YnVmZmVyXG4gICAqIEBwYXJhbSBwYXJhbTAgY29weSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJucyBjb3BpZWQgbWVtb3J5IGFzIEFycmF5QnVmZmVyXG4gICAqL1xuICBzdGF0aWMgY29weUFycmF5QnVmZmVyKHtcbiAgICBzcmMsXG4gICAgZGlzdCxcbiAgICBzcmNCeXRlT2Zmc2V0LFxuICAgIGNvcHlCeXRlTGVuZ3RoLFxuICAgIGRpc3RCeXRlT2Zmc2V0ID0gMCxcbiAgfToge1xuICAgIHNyYzogQXJyYXlCdWZmZXI7XG4gICAgZGlzdDogQXJyYXlCdWZmZXI7XG4gICAgc3JjQnl0ZU9mZnNldDogQnl0ZTtcbiAgICBjb3B5Qnl0ZUxlbmd0aDogQnl0ZTtcbiAgICBkaXN0Qnl0ZU9mZnNldDogQnl0ZTtcbiAgfSk6IEFycmF5QnVmZmVyIHtcbiAgICBjb25zdCBkc3QgPSBuZXcgVWludDhBcnJheShkaXN0LCBkaXN0Qnl0ZU9mZnNldCwgY29weUJ5dGVMZW5ndGgpO1xuICAgIGRzdC5zZXQobmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNCeXRlT2Zmc2V0LCBjb3B5Qnl0ZUxlbmd0aCkpO1xuXG4gICAgcmV0dXJuIGRzdC5idWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGEgY29weSBvZiB0aGUgc3JjIGFycmF5YnVmZmVyXG4gICAqIEBwYXJhbSBwYXJhbTAgY29weSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJucyBjb3BpZWQgbWVtb3J5IGFzIEFycmF5QnVmZmVyXG4gICAqL1xuICBzdGF0aWMgY29weUFycmF5QnVmZmVyV2l0aFBhZGRpbmcoe1xuICAgIHNyYyxcbiAgICBkaXN0LFxuICAgIHNyY0J5dGVPZmZzZXQsXG4gICAgY29weUJ5dGVMZW5ndGgsXG4gICAgZGlzdEJ5dGVPZmZzZXQsXG4gIH06IHtcbiAgICBzcmM6IEFycmF5QnVmZmVyO1xuICAgIGRpc3Q6IEFycmF5QnVmZmVyO1xuICAgIHNyY0J5dGVPZmZzZXQ6IEJ5dGU7XG4gICAgY29weUJ5dGVMZW5ndGg6IEJ5dGU7XG4gICAgZGlzdEJ5dGVPZmZzZXQ6IEJ5dGU7XG4gIH0pOiBBcnJheUJ1ZmZlciB7XG4gICAgY29uc3QgZHN0ID0gbmV3IFVpbnQ4QXJyYXkoZGlzdCwgZGlzdEJ5dGVPZmZzZXQsIGNvcHlCeXRlTGVuZ3RoKTtcbiAgICBjb25zdCBieXRlRGlmZiA9IHNyYy5ieXRlTGVuZ3RoIC0gc3JjQnl0ZU9mZnNldCAtIGNvcHlCeXRlTGVuZ3RoO1xuICAgIGlmIChieXRlRGlmZiA8IDApIHtcbiAgICAgIGRzdC5zZXQobmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNCeXRlT2Zmc2V0LCBzcmMuYnl0ZUxlbmd0aCAtIHNyY0J5dGVPZmZzZXQpKTtcbiAgICAgIGNvbnN0IGJ5dGVDb3VudCA9IC1ieXRlRGlmZjtcbiAgICAgIGNvbnN0IHBhZGRpbmdBcnJheUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ5dGVDb3VudCk7XG4gICAgICBkc3Quc2V0KHBhZGRpbmdBcnJheUJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRzdC5zZXQobmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNCeXRlT2Zmc2V0LCBjb3B5Qnl0ZUxlbmd0aCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkc3QuYnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBhIGNvcHkgb2YgdGhlIHNyYyBhcnJheWJ1ZmZlclxuICAgKiBAcGFyYW0gcGFyYW0wIGNvcHkgZGVzY3JpcHRpb25cbiAgICogQHJldHVybnMgY29waWVkIG1lbW9yeSBhcyBBcnJheUJ1ZmZlclxuICAgKi9cbiAgc3RhdGljIGNvcHlBcnJheUJ1ZmZlckFzNEJ5dGVzKHtcbiAgICBzcmMsXG4gICAgZGlzdCxcbiAgICBzcmNCeXRlT2Zmc2V0LFxuICAgIGNvcHlCeXRlTGVuZ3RoLFxuICAgIGRpc3RCeXRlT2Zmc2V0LFxuICB9OiB7XG4gICAgc3JjOiBBcnJheUJ1ZmZlcjtcbiAgICBkaXN0OiBBcnJheUJ1ZmZlcjtcbiAgICBzcmNCeXRlT2Zmc2V0OiBCeXRlO1xuICAgIGNvcHlCeXRlTGVuZ3RoOiBCeXRlO1xuICAgIGRpc3RCeXRlT2Zmc2V0OiBCeXRlO1xuICB9KTogQXJyYXlCdWZmZXIge1xuICAgIGlmIChzcmNCeXRlT2Zmc2V0ICUgNCAhPT0gMCB8fCBjb3B5Qnl0ZUxlbmd0aCAlIDQgIT09IDAgfHwgZGlzdEJ5dGVPZmZzZXQgJSA0ICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnl0ZSBhbGlnbiBmb3IgNGJ5dGVzIHVuaXQgY29weSBvcGVyYXRpb24uJyk7XG4gICAgfVxuICAgIGNvbnN0IGRzdCA9IG5ldyBJbnQzMkFycmF5KGRpc3QsIGRpc3RCeXRlT2Zmc2V0LCBjb3B5Qnl0ZUxlbmd0aCAvIDQpO1xuICAgIGRzdC5zZXQobmV3IEludDMyQXJyYXkoc3JjLCBzcmNCeXRlT2Zmc2V0LCBjb3B5Qnl0ZUxlbmd0aCAvIDQpKTtcblxuICAgIHJldHVybiBkc3QuYnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBhIGNvcHkgb2YgdGhlIHNyYyBhcnJheWJ1ZmZlciB3aXRoIHBhZGRpbmcgdG8gYmUgNGJ5dGVzIGFsaWdpbmVkXG4gICAqIEBwYXJhbSBwYXJhbTAgY29weSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJucyBjb3BpZWQgbWVtb3J5IGFzIEFycmF5QnVmZmVyXG4gICAqL1xuICBzdGF0aWMgY29weUFycmF5QnVmZmVyQXM0Qnl0ZXNXaXRoUGFkZGluZyh7XG4gICAgc3JjLFxuICAgIGRpc3QsXG4gICAgc3JjQnl0ZU9mZnNldCxcbiAgICBjb3B5Qnl0ZUxlbmd0aCxcbiAgICBkaXN0Qnl0ZU9mZnNldCxcbiAgfToge1xuICAgIHNyYzogQXJyYXlCdWZmZXI7XG4gICAgZGlzdDogQXJyYXlCdWZmZXI7XG4gICAgc3JjQnl0ZU9mZnNldDogQnl0ZTtcbiAgICBjb3B5Qnl0ZUxlbmd0aDogQnl0ZTtcbiAgICBkaXN0Qnl0ZU9mZnNldDogQnl0ZTtcbiAgfSk6IEFycmF5QnVmZmVyIHtcbiAgICBjb25zdCBkc3QgPSBuZXcgSW50MzJBcnJheShkaXN0LCBkaXN0Qnl0ZU9mZnNldCwgY29weUJ5dGVMZW5ndGggLyA0KTtcbiAgICBjb25zdCBieXRlRGlmZiA9IHNyYy5ieXRlTGVuZ3RoIC0gc3JjQnl0ZU9mZnNldCAtIGNvcHlCeXRlTGVuZ3RoO1xuXG4gICAgaWYgKGJ5dGVEaWZmIDwgMCkge1xuICAgICAgZHN0LnNldChuZXcgSW50MzJBcnJheShzcmMsIHNyY0J5dGVPZmZzZXQsIChzcmMuYnl0ZUxlbmd0aCAtIHNyY0J5dGVPZmZzZXQpIC8gNCkpO1xuICAgICAgY29uc3QgYnl0ZUNvdW50ID0gLWJ5dGVEaWZmO1xuICAgICAgY29uc3QgcGFkZGluZ0FycmF5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZUNvdW50KTtcbiAgICAgIGRzdC5zZXQocGFkZGluZ0FycmF5QnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZHN0LnNldChuZXcgSW50MzJBcnJheShzcmMsIHNyY0J5dGVPZmZzZXQsIGNvcHlCeXRlTGVuZ3RoIC8gNCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkc3QuYnVmZmVyO1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQnVmZmVyKHNyYzogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIGNvbnN0IGVuYyA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIHJldHVybiBlbmMuZW5jb2RlKHNyYykuYnVmZmVyO1xuICB9XG59XG4iLCIvLyBUaGlzIGNvZGUgaWRlYSBpcyBmcm9tIGh0dHBzOi8vcWlpdGEuY29tL2p1bmtqdW5jdGlvbnMvaXRlbXMvNWE2ZDhiZWQ4ZGY4ZWIzYWNjZWJcblxuZXhwb3J0IGludGVyZmFjZSBFbnVtSU8ge1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICByZWFkb25seSBzdHI6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ltYm9sOiBzeW1ib2w7XG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgdG9KU09OKCk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEVudW1DbGFzcyBpbXBsZW1lbnRzIEVudW1JTyB7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IHN5bWJvbDogc3ltYm9sO1xuICByZWFkb25seSBzdHI6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGF0aWMgX19pbmRpY2VzOiBNYXA8RnVuY3Rpb24sIG51bWJlcltdPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19zdHJpbmdzOiBNYXA8RnVuY3Rpb24sIHN0cmluZ1tdPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW5kZXgsXG4gICAgc3RyLFxuICAgIG5vQ2hlY2tTdHJVbmlxdWUsXG4gIH06IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHN0cjogc3RyaW5nO1xuICAgIG5vQ2hlY2tTdHJVbmlxdWU/OiBib29sZWFuO1xuICB9KSB7XG4gICAgaWYgKEVudW1DbGFzcy5fX2luZGljZXMuZ2V0KHRoaXMuY29uc3RydWN0b3IpID09IG51bGwpIHtcbiAgICAgIEVudW1DbGFzcy5fX2luZGljZXMuc2V0KHRoaXMuY29uc3RydWN0b3IsIFtdKTtcbiAgICB9XG4gICAgaWYgKEVudW1DbGFzcy5fX3N0cmluZ3MuZ2V0KHRoaXMuY29uc3RydWN0b3IpID09IG51bGwpIHtcbiAgICAgIEVudW1DbGFzcy5fX3N0cmluZ3Muc2V0KHRoaXMuY29uc3RydWN0b3IsIFtdKTtcbiAgICB9XG4gICAgaWYgKEVudW1DbGFzcy5fX2luZGljZXMuZ2V0KHRoaXMuY29uc3RydWN0b3IpIS5pbmRleE9mKGluZGV4KSAhPT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9udCB1c2UgZHVwbGljYXRlIGluZGV4LicpO1xuICAgIH1cbiAgICBpZiAobm9DaGVja1N0clVuaXF1ZSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKEVudW1DbGFzcy5fX3N0cmluZ3MuZ2V0KHRoaXMuY29uc3RydWN0b3IpIS5pbmRleE9mKHN0cikgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG9udCB1c2UgZHVwbGljYXRlIHN0ci4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5zeW1ib2wgPSBTeW1ib2woc3RyKTtcblxuICAgIEVudW1DbGFzcy5fX2luZGljZXMuZ2V0KHRoaXMuY29uc3RydWN0b3IpIS5wdXNoKGluZGV4KTtcbiAgICBFbnVtQ2xhc3MuX19zdHJpbmdzLmdldCh0aGlzLmNvbnN0cnVjdG9yKSEucHVzaChzdHIpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdHI7XG4gIH1cblxuICB0b0pTT04oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2Zyb20oe1xuICB0eXBlTGlzdCxcbiAgaW5kZXgsXG59OiB7XG4gIHR5cGVMaXN0OiBBcnJheTxFbnVtSU8+O1xuICBpbmRleDogbnVtYmVyO1xufSk6IEVudW1JTyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gdHlwZUxpc3QuZmluZCgodHlwZSkgPT4gdHlwZS5pbmRleCA9PT0gaW5kZXgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBtYXRjaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9mcm9tU3RyaW5nKHtcbiAgdHlwZUxpc3QsXG4gIHN0cixcbn06IHtcbiAgdHlwZUxpc3Q6IEFycmF5PEVudW1JTz47XG4gIHN0cjogc3RyaW5nO1xufSk6IEVudW1JTyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gdHlwZUxpc3QuZmluZCgodHlwZSkgPT4gdHlwZS5zdHIudG9Mb3dlckNhc2UoKSA9PT0gc3RyLnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBtYXRjaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9mcm9tU3RyaW5nQ2FzZVNlbnNpdGl2ZWx5KHtcbiAgdHlwZUxpc3QsXG4gIHN0cixcbn06IHtcbiAgdHlwZUxpc3Q6IEFycmF5PEVudW1JTz47XG4gIHN0cjogc3RyaW5nO1xufSk6IEVudW1JTyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gdHlwZUxpc3QuZmluZCgodHlwZSkgPT4gdHlwZS5zdHIgPT09IHN0cik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoO1xufVxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4MzMgfSBmcm9tICcuLi9tYXRoL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBNYXRoVXRpbCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWwnO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL011dGFibGVWZWN0b3IzJztcbmltcG9ydCB7IENvbG9yUmdiIH0gZnJvbSAnLi4vbWF0aC9Db2xvclJnYic7XG5pbXBvcnQgeyBDb2xvckNvbXBvbmVudExldHRlciwgSW5kZXgsIFNpemUgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvTXV0YWJsZVZlY3RvcjInO1xuaW1wb3J0IHsgVGV4dHVyZURhdGFGbG9hdCB9IGZyb20gJy4uL3RleHR1cmVzL1RleHR1cmVEYXRhRmxvYXQnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuL0lzJztcblxudHlwZSBQaXhlbFNvcnRUeXBlID0ge1xuICB4OiBJbmRleDtcbiAgeTogSW5kZXg7XG4gIHZhbHVlOiBudW1iZXI7XG59O1xuXG4vLyBUaGVzZSBjb2RlcyBhcmUgZnJvbSBodHRwczovL2VoZWl0enJlc2VhcmNoLndvcmRwcmVzcy5jb20vNzM4LTIvXG4vLyBcIlByb2NlZHVyYWwgU3RvY2hhc3RpYyBUZXh0dXJlcyBieSBUaWxpbmcgYW5kIEJsZW5kaW5nXCJcbi8vIFRoYW5rcyB0byB0aGUgYXV0aG9ycyBmb3IgcGVybWlzc2lvbiB0byB1c2UuXG4vL1xuLy8gQ29tcHV0ZSB0aGUgZWlnZW4gdmVjdG9ycyBvZiB0aGUgaGlzdG9ncmFtIG9mIHRoZSBpbnB1dCBpbWFnZVxuZnVuY3Rpb24gY29tcHV0ZUVpZ2VuVmVjdG9ycyhpbnB1dDogVGV4dHVyZURhdGFGbG9hdCwgZWlnZW5WZWN0b3JzOiBWZWN0b3IzW10pIHtcbiAgLy8gRmlyc3QgYW5kIHNlY29uZCBvcmRlciBtb21lbnRzXG4gIGxldCBSID0gMCxcbiAgICBHID0gMCxcbiAgICBCID0gMCxcbiAgICBSUiA9IDAsXG4gICAgR0cgPSAwLFxuICAgIEJCID0gMCxcbiAgICBSRyA9IDAsXG4gICAgUkIgPSAwLFxuICAgIEdCID0gMDtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBpbnB1dC5oZWlnaHQ7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgaW5wdXQud2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgY29sID0gaW5wdXQuZ2V0UGl4ZWxBcyh4LCB5LCAzLCBDb2xvclJnYik7XG4gICAgICBSICs9IGNvbC54O1xuICAgICAgRyArPSBjb2wueTtcbiAgICAgIEIgKz0gY29sLno7XG4gICAgICBSUiArPSBjb2wueCAqIGNvbC54O1xuICAgICAgR0cgKz0gY29sLnkgKiBjb2wueTtcbiAgICAgIEJCICs9IGNvbC56ICogY29sLno7XG4gICAgICBSRyArPSBjb2wueCAqIGNvbC55O1xuICAgICAgUkIgKz0gY29sLnggKiBjb2wuejtcbiAgICAgIEdCICs9IGNvbC55ICogY29sLno7XG4gICAgfVxuICB9XG4gIGNvbnN0IGlucHV0SW1hZ2VQaXhlbHNOdW1iZXIgPSBpbnB1dC53aWR0aCAqIGlucHV0LmhlaWdodDtcbiAgUiAvPSBpbnB1dEltYWdlUGl4ZWxzTnVtYmVyO1xuICBHIC89IGlucHV0SW1hZ2VQaXhlbHNOdW1iZXI7XG4gIEIgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcbiAgUlIgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcbiAgR0cgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcbiAgQkIgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcbiAgUkcgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcbiAgUkIgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcbiAgR0IgLz0gaW5wdXRJbWFnZVBpeGVsc051bWJlcjtcblxuICAvLyBDb3ZhcmlhbmNlIG1hdHJpeFxuICBjb25zdCBjb3Zhck1hdCA9IE11dGFibGVNYXRyaXgzMy56ZXJvKCk7XG4gIGNvdmFyTWF0Lm0wMCA9IFJSIC0gUiAqIFI7XG4gIGNvdmFyTWF0Lm0wMSA9IFJHIC0gUiAqIEc7XG4gIGNvdmFyTWF0Lm0wMiA9IFJCIC0gUiAqIEI7XG4gIGNvdmFyTWF0Lm0xMCA9IFJHIC0gUiAqIEc7XG4gIGNvdmFyTWF0Lm0xMSA9IEdHIC0gRyAqIEc7XG4gIGNvdmFyTWF0Lm0xMiA9IEdCIC0gRyAqIEI7XG4gIGNvdmFyTWF0Lm0yMCA9IFJCIC0gUiAqIEI7XG4gIGNvdmFyTWF0Lm0yMSA9IEdCIC0gRyAqIEI7XG4gIGNvdmFyTWF0Lm0yMiA9IEJCIC0gQiAqIEI7XG5cbiAgLy8gRmluZCBlaWdlbiB2YWx1ZXMgYW5kIHZlY3RvcnMgdXNpbmcgSmFjb2JpIGFsZ29yaXRobVxuICBjb25zdCBlaWdlblZlY3RvcnNUZW1wID0gTXV0YWJsZU1hdHJpeDMzLnplcm8oKTtcbiAgY29uc3QgZWlnZW5WYWx1ZXNUZW1wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBNYXRoVXRpbC5jb21wdXRlRWlnZW5WYWx1ZXNBbmRWZWN0b3JzKGNvdmFyTWF0LCBlaWdlblZlY3RvcnNUZW1wLCBlaWdlblZhbHVlc1RlbXApO1xuXG4gIC8vIFNldCByZXR1cm4gdmFsdWVzXG4gIGVpZ2VuVmVjdG9yc1swXSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbXG4gICAgZWlnZW5WZWN0b3JzVGVtcC5tMDAsXG4gICAgZWlnZW5WZWN0b3JzVGVtcC5tMTAsXG4gICAgZWlnZW5WZWN0b3JzVGVtcC5tMjAsXG4gIF0pO1xuICBlaWdlblZlY3RvcnNbMV0gPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgIGVpZ2VuVmVjdG9yc1RlbXAubTAxLFxuICAgIGVpZ2VuVmVjdG9yc1RlbXAubTExLFxuICAgIGVpZ2VuVmVjdG9yc1RlbXAubTIxLFxuICBdKTtcbiAgZWlnZW5WZWN0b3JzWzJdID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICBlaWdlblZlY3RvcnNUZW1wLm0wMixcbiAgICBlaWdlblZlY3RvcnNUZW1wLm0xMixcbiAgICBlaWdlblZlY3RvcnNUZW1wLm0yMixcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGRlY29ycmVsYXRlQ29sb3JTcGFjZShcbiAgaW5wdXQ6IFRleHR1cmVEYXRhRmxvYXQsIC8vIGlucHV0OiBleGFtcGxlIGltYWdlXG4gIGlucHV0X2RlY29ycmVsYXRlZDogVGV4dHVyZURhdGFGbG9hdCwgLy8gb3V0cHV0OiBkZWNvcnJlbGF0ZWQgaW5wdXRcbiAgY29sb3JTcGFjZVZlY3RvcjE6IE11dGFibGVWZWN0b3IzLCAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIHZlY3RvcjFcbiAgY29sb3JTcGFjZVZlY3RvcjI6IE11dGFibGVWZWN0b3IzLCAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIHZlY3RvcjJcbiAgY29sb3JTcGFjZVZlY3RvcjM6IE11dGFibGVWZWN0b3IzLCAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIHZlY3RvcjNcbiAgY29sb3JTcGFjZU9yaWdpbjogTXV0YWJsZVZlY3RvcjNcbikge1xuICAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIG9yaWdpblxuICAvLyBDb21wdXRlIHRoZSBlaWdlbnZlY3RvcnMgb2YgdGhlIGhpc3RvZ3JhbVxuICBjb25zdCBlaWdlbnZlY3RvcnMgPSBbTXV0YWJsZVZlY3RvcjMuemVybygpLCBNdXRhYmxlVmVjdG9yMy56ZXJvKCksIE11dGFibGVWZWN0b3IzLnplcm8oKV07XG4gIGNvbXB1dGVFaWdlblZlY3RvcnMoaW5wdXQsIGVpZ2VudmVjdG9ycyk7XG5cbiAgLy8gUm90YXRlIHRvIGVpZ2VudmVjdG9yIHNwYWNlIGFuZFxuICBmb3IgKGxldCB5ID0gMDsgeSA8IGlucHV0LmhlaWdodDsgeSsrKVxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgaW5wdXQud2lkdGg7IHgrKylcbiAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgMzsgKytjaGFubmVsKSB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IGNvbG9yXG4gICAgICAgIGNvbnN0IGNvbG9yOiBDb2xvclJnYiA9IGlucHV0LmdldFBpeGVsQXMoeCwgeSwgMywgQ29sb3JSZ2IpO1xuICAgICAgICAvLyBQcm9qZWN0IG9uIGVpZ2VudmVjdG9yXG4gICAgICAgIGNvbnN0IG5ld19jaGFubmVsX3ZhbHVlOiBudW1iZXIgPSBWZWN0b3IzLmRvdChjb2xvciwgZWlnZW52ZWN0b3JzW2NoYW5uZWxdKTtcbiAgICAgICAgLy8gU3RvcmVcbiAgICAgICAgaW5wdXRfZGVjb3JyZWxhdGVkLnNldFBpeGVsQXRDaGFubmVsKHgsIHksIGNoYW5uZWwsIG5ld19jaGFubmVsX3ZhbHVlKTtcbiAgICAgIH1cblxuICAvLyBDb21wdXRlIHJhbmdlcyBvZiB0aGUgbmV3IGNvbG9yIHNwYWNlXG4gIGNvbnN0IGNvbG9yU3BhY2VSYW5nZXM6IE11dGFibGVWZWN0b3IyW10gPSBbXG4gICAgTXV0YWJsZVZlY3RvcjIuZnJvbUNvcHlBcnJheTIoW051bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFXSksXG4gICAgTXV0YWJsZVZlY3RvcjIuZnJvbUNvcHlBcnJheTIoW051bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFXSksXG4gICAgTXV0YWJsZVZlY3RvcjIuZnJvbUNvcHlBcnJheTIoW051bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFXSksXG4gIF07XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaW5wdXQuaGVpZ2h0OyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGlucHV0LndpZHRoOyB4KyspIHtcbiAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgMzsgKytjaGFubmVsKSB7XG4gICAgICAgIGNvbG9yU3BhY2VSYW5nZXNbY2hhbm5lbF0ueCA9IE1hdGgubWluKFxuICAgICAgICAgIGNvbG9yU3BhY2VSYW5nZXNbY2hhbm5lbF0ueCxcbiAgICAgICAgICBpbnB1dF9kZWNvcnJlbGF0ZWQuZ2V0UGl4ZWxBc0FycmF5KHgsIHkpW2NoYW5uZWxdXG4gICAgICAgICk7XG4gICAgICAgIGNvbG9yU3BhY2VSYW5nZXNbY2hhbm5lbF0ueSA9IE1hdGgubWF4KFxuICAgICAgICAgIGNvbG9yU3BhY2VSYW5nZXNbY2hhbm5lbF0ueSxcbiAgICAgICAgICBpbnB1dF9kZWNvcnJlbGF0ZWQuZ2V0UGl4ZWxBc0FycmF5KHgsIHkpW2NoYW5uZWxdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtYXAgcmFuZ2UgdG8gWzAsIDFdXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaW5wdXQuaGVpZ2h0OyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGlucHV0LndpZHRoOyB4KyspIHtcbiAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgMzsgKytjaGFubmVsKSB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgPSBpbnB1dF9kZWNvcnJlbGF0ZWQuZ2V0UGl4ZWxBc0FycmF5KHgsIHkpW2NoYW5uZWxdO1xuICAgICAgICAvLyBSZW1hcCBpbiBbMCwgMV1cbiAgICAgICAgY29uc3QgcmVtYXBwZWRfdmFsdWUgPVxuICAgICAgICAgICh2YWx1ZSAtIGNvbG9yU3BhY2VSYW5nZXNbY2hhbm5lbF0ueCkgL1xuICAgICAgICAgIChjb2xvclNwYWNlUmFuZ2VzW2NoYW5uZWxdLnkgLSBjb2xvclNwYWNlUmFuZ2VzW2NoYW5uZWxdLngpO1xuICAgICAgICAvLyBTdG9yZVxuICAgICAgICBpbnB1dF9kZWNvcnJlbGF0ZWQuc2V0UGl4ZWxBdENoYW5uZWwoeCwgeSwgY2hhbm5lbCwgcmVtYXBwZWRfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgY29sb3Igc3BhY2Ugb3JpZ2luIGFuZCB2ZWN0b3JzIHNjYWxlZCBmb3IgdGhlIG5vcm1hbGl6ZWQgcmFuZ2VcbiAgY29sb3JTcGFjZU9yaWdpbi54ID1cbiAgICBjb2xvclNwYWNlUmFuZ2VzWzBdLnggKiBlaWdlbnZlY3RvcnNbMF0ueCArXG4gICAgY29sb3JTcGFjZVJhbmdlc1sxXS54ICogZWlnZW52ZWN0b3JzWzFdLnggK1xuICAgIGNvbG9yU3BhY2VSYW5nZXNbMl0ueCAqIGVpZ2VudmVjdG9yc1syXS54O1xuICBjb2xvclNwYWNlT3JpZ2luLnkgPVxuICAgIGNvbG9yU3BhY2VSYW5nZXNbMF0ueCAqIGVpZ2VudmVjdG9yc1swXS55ICtcbiAgICBjb2xvclNwYWNlUmFuZ2VzWzFdLnggKiBlaWdlbnZlY3RvcnNbMV0ueSArXG4gICAgY29sb3JTcGFjZVJhbmdlc1syXS54ICogZWlnZW52ZWN0b3JzWzJdLnk7XG4gIGNvbG9yU3BhY2VPcmlnaW4ueiA9XG4gICAgY29sb3JTcGFjZVJhbmdlc1swXS54ICogZWlnZW52ZWN0b3JzWzBdLnogK1xuICAgIGNvbG9yU3BhY2VSYW5nZXNbMV0ueCAqIGVpZ2VudmVjdG9yc1sxXS56ICtcbiAgICBjb2xvclNwYWNlUmFuZ2VzWzJdLnggKiBlaWdlbnZlY3RvcnNbMl0uejtcbiAgY29sb3JTcGFjZVZlY3RvcjEueCA9IGVpZ2VudmVjdG9yc1swXS54ICogKGNvbG9yU3BhY2VSYW5nZXNbMF0ueSAtIGNvbG9yU3BhY2VSYW5nZXNbMF0ueCk7XG4gIGNvbG9yU3BhY2VWZWN0b3IxLnkgPSBlaWdlbnZlY3RvcnNbMF0ueSAqIChjb2xvclNwYWNlUmFuZ2VzWzBdLnkgLSBjb2xvclNwYWNlUmFuZ2VzWzBdLngpO1xuICBjb2xvclNwYWNlVmVjdG9yMS56ID0gZWlnZW52ZWN0b3JzWzBdLnogKiAoY29sb3JTcGFjZVJhbmdlc1swXS55IC0gY29sb3JTcGFjZVJhbmdlc1swXS54KTtcbiAgY29sb3JTcGFjZVZlY3RvcjIueCA9IGVpZ2VudmVjdG9yc1sxXS54ICogKGNvbG9yU3BhY2VSYW5nZXNbMV0ueSAtIGNvbG9yU3BhY2VSYW5nZXNbMV0ueCk7XG4gIGNvbG9yU3BhY2VWZWN0b3IyLnkgPSBlaWdlbnZlY3RvcnNbMV0ueSAqIChjb2xvclNwYWNlUmFuZ2VzWzFdLnkgLSBjb2xvclNwYWNlUmFuZ2VzWzFdLngpO1xuICBjb2xvclNwYWNlVmVjdG9yMi56ID0gZWlnZW52ZWN0b3JzWzFdLnogKiAoY29sb3JTcGFjZVJhbmdlc1sxXS55IC0gY29sb3JTcGFjZVJhbmdlc1sxXS54KTtcbiAgY29sb3JTcGFjZVZlY3RvcjMueCA9IGVpZ2VudmVjdG9yc1syXS54ICogKGNvbG9yU3BhY2VSYW5nZXNbMl0ueSAtIGNvbG9yU3BhY2VSYW5nZXNbMl0ueCk7XG4gIGNvbG9yU3BhY2VWZWN0b3IzLnkgPSBlaWdlbnZlY3RvcnNbMl0ueSAqIChjb2xvclNwYWNlUmFuZ2VzWzJdLnkgLSBjb2xvclNwYWNlUmFuZ2VzWzJdLngpO1xuICBjb2xvclNwYWNlVmVjdG9yMy56ID0gZWlnZW52ZWN0b3JzWzJdLnogKiAoY29sb3JTcGFjZVJhbmdlc1syXS55IC0gY29sb3JTcGFjZVJhbmdlc1syXS54KTtcbn1cblxuLy8gQ29tcHV0ZSBhdmVyYWdlIHN1YnBpeGVsIHZhcmlhbmNlIGF0IGEgZ2l2ZW4gTE9EXG5mdW5jdGlvbiBjb21wdXRlTE9EQXZlcmFnZVN1YnBpeGVsVmFyaWFuY2UoXG4gIGltYWdlOiBUZXh0dXJlRGF0YUZsb2F0LFxuICBMT0Q6IEluZGV4LFxuICBjaGFubmVsOiBJbmRleFxuKTogbnVtYmVyIHtcbiAgLy8gV2luZG93IHdpZHRoIGFzc29jaWF0ZWQgd2l0aFxuICBjb25zdCB3aW5kb3dXaWR0aCA9IDEgPDwgTE9EO1xuXG4gIC8vIENvbXB1dGUgYXZlcmFnZSB2YXJpYW5jZSBpbiBhbGwgdGhlIHdpbmRvd3NcbiAgbGV0IGF2ZXJhZ2Vfd2luZG93X3ZhcmlhbmNlID0gMC4wO1xuXG4gIC8vIExvb3Agb3ZlciBhbCB0aGUgd2luZG93c1xuICBmb3IgKGxldCB3aW5kb3dfeSA9IDA7IHdpbmRvd195IDwgaW1hZ2UuaGVpZ2h0OyB3aW5kb3dfeSArPSB3aW5kb3dXaWR0aCkge1xuICAgIGZvciAobGV0IHdpbmRvd194ID0gMDsgd2luZG93X3ggPCBpbWFnZS53aWR0aDsgd2luZG93X3ggKz0gd2luZG93V2lkdGgpIHtcbiAgICAgIC8vIEVzdGltYXRlIHZhcmlhbmNlIG9mIGN1cnJlbnQgd2luZG93XG4gICAgICBsZXQgdiA9IDAuMDtcbiAgICAgIGxldCB2MiA9IDAuMDtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgd2luZG93V2lkdGg7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpbmRvd1dpZHRoOyB4KyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGltYWdlLmdldFBpeGVsKHdpbmRvd194ICsgeCwgd2luZG93X3kgKyB5LCBjaGFubmVsKTtcbiAgICAgICAgICB2ICs9IHZhbHVlO1xuICAgICAgICAgIHYyICs9IHZhbHVlICogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHYgLz0gd2luZG93V2lkdGggKiB3aW5kb3dXaWR0aDtcbiAgICAgIHYyIC89IHdpbmRvd1dpZHRoICogd2luZG93V2lkdGg7XG4gICAgICBjb25zdCB3aW5kb3dfdmFyaWFuY2UgPSBNYXRoLm1heCgwLjAsIHYyIC0gdiAqIHYpO1xuXG4gICAgICAvLyBVcGRhdGUgYXZlcmFnZVxuICAgICAgYXZlcmFnZV93aW5kb3dfdmFyaWFuY2UgKz1cbiAgICAgICAgd2luZG93X3ZhcmlhbmNlIC8gKChpbWFnZS53aWR0aCAqIGltYWdlLmhlaWdodCkgLyB3aW5kb3dXaWR0aCAvIHdpbmRvd1dpZHRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXZlcmFnZV93aW5kb3dfdmFyaWFuY2U7XG59XG5cbi8vIEZpbHRlciBMVVQgYnkgc2FtcGxpbmcgYSBHYXVzc2lhbiBOKG11LCBzdGTvv70pXG5mdW5jdGlvbiBmaWx0ZXJMVVRWYWx1ZUF0eChcbiAgTFVUOiBUZXh0dXJlRGF0YUZsb2F0LFxuICB4OiBudW1iZXIsXG4gIHN0ZDogbnVtYmVyLFxuICBjaGFubmVsOiBJbmRleCxcbiAgTFVUX1dJRFRIOiBTaXplID0gMTI4XG4pOiBudW1iZXIge1xuICAvLyBOdW1iZXIgb2Ygc2FtcGxlcyBmb3IgZmlsdGVyaW5nIChoZXVyaXN0aWM6IHR3aWNlIHRoZSBMVVQgcmVzb2x1dGlvbilcbiAgY29uc3QgbnVtYmVyT2ZTYW1wbGVzID0gMiAqIExVVF9XSURUSDtcblxuICAvLyBGaWx0ZXJcbiAgbGV0IGZpbHRlcmVkX3ZhbHVlID0gMC4wO1xuICBmb3IgKGxldCBzYW1wbGUgPSAwOyBzYW1wbGUgPCBudW1iZXJPZlNhbXBsZXM7IHNhbXBsZSsrKSB7XG4gICAgLy8gUXVhbnRpbGUgdXNlZCB0byBzYW1wbGUgdGhlIEdhdXNzaWFuXG4gICAgY29uc3QgVSA9IChzYW1wbGUgKyAwLjUpIC8gbnVtYmVyT2ZTYW1wbGVzO1xuICAgIC8vIFNhbXBsZSB0aGUgR2F1c3NpYW5cbiAgICBjb25zdCBzYW1wbGVfeCA9IE1hdGhVdGlsLmludkdhdXNzaWFuQ2RmKFUsIHgsIHN0ZCk7XG4gICAgLy8gRmluZCBzYW1wbGUgdGV4ZWwgaW4gTFVUICh0aGUgTFVUIGNvdmVycyB0aGUgZG9tYWluIFswLCAxXSlcbiAgICBjb25zdCBzYW1wbGVfdGV4ZWwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihMVVRfV0lEVEggLSAxLCBNYXRoLmZsb29yKHNhbXBsZV94ICogTFVUX1dJRFRIKSkpO1xuICAgIC8vIEZldGNoIExVVCBhdCBsZXZlbCAwXG4gICAgY29uc3Qgc2FtcGxlX3ZhbHVlID0gTFVULmdldFBpeGVsQXNBcnJheShzYW1wbGVfdGV4ZWwsIDApW2NoYW5uZWxdO1xuICAgIC8vIEFjY3VtdWxhdGVcbiAgICBmaWx0ZXJlZF92YWx1ZSArPSBzYW1wbGVfdmFsdWU7XG4gIH1cbiAgLy8gTm9ybWFsaXplIGFuZCByZXR1cm5cbiAgZmlsdGVyZWRfdmFsdWUgLz0gbnVtYmVyT2ZTYW1wbGVzO1xuICByZXR1cm4gZmlsdGVyZWRfdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHByZWZpbHRlckxVVChcbiAgaW1hZ2VfVF9JbnB1dDogVGV4dHVyZURhdGFGbG9hdCxcbiAgTFVUX1RpbnY6IFRleHR1cmVEYXRhRmxvYXQsXG4gIGNoYW5uZWw6IEluZGV4XG4pOiB2b2lkIHtcbiAgLy8gUHJlZmlsdGVyXG4gIGZvciAobGV0IExPRCA9IDE7IExPRCA8IExVVF9UaW52LmhlaWdodDsgTE9EKyspIHtcbiAgICAvLyBDb21wdXRlIHN1YnBpeGVsIHZhcmlhbmNlIGF0IExPRFxuICAgIGNvbnN0IHdpbmRvd192YXJpYW5jZSA9IGNvbXB1dGVMT0RBdmVyYWdlU3VicGl4ZWxWYXJpYW5jZShpbWFnZV9UX0lucHV0LCBMT0QsIGNoYW5uZWwpO1xuICAgIGNvbnN0IHdpbmRvd19zdGQgPSBNYXRoLnNxcnQod2luZG93X3ZhcmlhbmNlKTtcblxuICAgIC8vIFByZWZpbHRlciBMVVQgd2l0aCBHYXVzc2lhbiBrZXJuZWwgb2YgdGhpcyB2YXJpYW5jZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTFVUX1RpbnYud2lkdGg7IGkrKykge1xuICAgICAgLy8gVGV4ZWwgcG9zaXRpb24gaW4gWzAsIDFdXG4gICAgICBjb25zdCB4X3RleGVsOiBudW1iZXIgPSAoaSArIDAuNSkgLyBMVVRfVGludi53aWR0aDtcbiAgICAgIC8vIEZpbHRlciBsb29rLXVwIHRhYmxlIGFyb3VuZCB0aGlzIHBvc2l0aW9uIHdpdGggR2F1c3NpYW4ga2VybmVsXG4gICAgICBjb25zdCBmaWx0ZXJlZFZhbHVlID0gZmlsdGVyTFVUVmFsdWVBdHgoTFVUX1RpbnYsIHhfdGV4ZWwsIHdpbmRvd19zdGQsIGNoYW5uZWwpO1xuICAgICAgLy8gU3RvcmUgZmlsdGVyZWQgdmFsdWVcbiAgICAgIExVVF9UaW52LnNldFBpeGVsQXRDaGFubmVsKGksIExPRCwgY2hhbm5lbCwgZmlsdGVyZWRWYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUGl4ZWxTb3J0VHlwZUFycmF5KGFycmF5TGVuZ3RoOiBTaXplKSB7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykge1xuICAgIGFycmF5LnB1c2goe30pO1xuICB9XG4gIHJldHVybiBhcnJheSBhcyBQaXhlbFNvcnRUeXBlW107XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVUaW5wdXQoXG4gIGlucHV0OiBUZXh0dXJlRGF0YUZsb2F0LFxuICBUX2lucHV0OiBUZXh0dXJlRGF0YUZsb2F0LFxuICBjaGFubmVsOiBJbmRleCxcbiAgR0FVU1NJQU5fQVZFUkFHRSA9IDAuNSxcbiAgR0FVU1NJQU5fU1REID0gMC4xNjY2NlxuKSB7XG4gIC8vIFNvcnQgcGl4ZWxzIG9mIGV4YW1wbGUgaW1hZ2VcbiAgY29uc3Qgc29ydGVkSW5wdXRWYWx1ZXMgPSBnZW5lcmF0ZVBpeGVsU29ydFR5cGVBcnJheShpbnB1dC5oZWlnaHQgKiBpbnB1dC53aWR0aCk7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaW5wdXQuaGVpZ2h0OyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGlucHV0LndpZHRoOyB4KyspIHtcbiAgICAgIHNvcnRlZElucHV0VmFsdWVzW3kgKiBpbnB1dC53aWR0aCArIHhdLnggPSB4O1xuICAgICAgc29ydGVkSW5wdXRWYWx1ZXNbeSAqIGlucHV0LndpZHRoICsgeF0ueSA9IHk7XG4gICAgICBzb3J0ZWRJbnB1dFZhbHVlc1t5ICogaW5wdXQud2lkdGggKyB4XS52YWx1ZSA9IGlucHV0LmdldFBpeGVsKHgsIHksIGNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIHNvcnRlZElucHV0VmFsdWVzLnNvcnQoKGE6IFBpeGVsU29ydFR5cGUsIGI6IFBpeGVsU29ydFR5cGUpID0+IHtcbiAgICBpZiAoYS52YWx1ZSA8IGIudmFsdWUpIHJldHVybiAtMTtcbiAgICBpZiAoYS52YWx1ZSA+IGIudmFsdWUpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9KTtcblxuICAvLyBBc3NpZ24gR2F1c3NpYW4gdmFsdWUgdG8gZWFjaCBwaXhlbFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZElucHV0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gUGl4ZWwgY29vcmRpbmF0ZXNcbiAgICBjb25zdCB4ID0gc29ydGVkSW5wdXRWYWx1ZXNbaV0ueDtcbiAgICBjb25zdCB5ID0gc29ydGVkSW5wdXRWYWx1ZXNbaV0ueTtcbiAgICAvLyBJbnB1dCBxdWFudGlsZSAoZ2l2ZW4gYnkgaXRzIG9yZGVyIGluIHRoZSBzb3J0aW5nKVxuICAgIGNvbnN0IFUgPSAoaSArIDAuNSkgLyBzb3J0ZWRJbnB1dFZhbHVlcy5sZW5ndGg7XG4gICAgLy8gR2F1c3NpYW4gcXVhbnRpbGVcbiAgICBjb25zdCBHID0gTWF0aFV0aWwuaW52R2F1c3NpYW5DZGYoVSwgR0FVU1NJQU5fQVZFUkFHRSwgR0FVU1NJQU5fU1REKTtcbiAgICAvLyBTdG9yZVxuICAgIFRfaW5wdXQuc2V0UGl4ZWxBdENoYW5uZWwoeCwgeSwgY2hhbm5lbCwgRyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUludlQoXG4gIGlucHV0OiBUZXh0dXJlRGF0YUZsb2F0LFxuICBUaW52OiBUZXh0dXJlRGF0YUZsb2F0LFxuICBjaGFubmVsOiBudW1iZXIsXG4gIEdBVVNTSUFOX0FWRVJBR0UgPSAwLjUsXG4gIEdBVVNTSUFOX1NURCA9IDAuMTY2NjZcbikge1xuICAvLyBTb3J0IHBpeGVscyBvZiBleGFtcGxlIGltYWdlXG4gIGNvbnN0IHNvcnRlZElucHV0VmFsdWVzOiBBcnJheTxudW1iZXI+ID0gW107XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaW5wdXQuaGVpZ2h0OyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGlucHV0LndpZHRoOyB4KyspIHtcbiAgICAgIHNvcnRlZElucHV0VmFsdWVzW3kgKiBpbnB1dC53aWR0aCArIHhdID0gaW5wdXQuZ2V0UGl4ZWwoeCwgeSwgY2hhbm5lbCk7XG4gICAgfVxuICB9XG5cbiAgc29ydGVkSW5wdXRWYWx1ZXMuc29ydCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IHtcbiAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9KTtcblxuICAvLyBHZW5lcmF0ZSBUaW52IGxvb2stdXAgdGFibGVcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBUaW52LndpZHRoOyBpKyspIHtcbiAgICAvLyBHYXVzc2lhbiB2YWx1ZSBpbiBbMCwgMV1cbiAgICBjb25zdCBHID0gKGkgKyAwLjUpIC8gVGludi53aWR0aDtcbiAgICAvLyBRdWFudGlsZSB2YWx1ZVxuICAgIGNvbnN0IFUgPSBNYXRoVXRpbC5nYXVzc2lhbkNkZihHLCBHQVVTU0lBTl9BVkVSQUdFLCBHQVVTU0lBTl9TVEQpO1xuICAgIC8vIEZpbmQgcXVhbnRpbGUgaW4gc29ydGVkIHBpeGVsIHZhbHVlc1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihVICogc29ydGVkSW5wdXRWYWx1ZXMubGVuZ3RoKTtcbiAgICAvLyBHZXQgaW5wdXQgdmFsdWVcbiAgICBjb25zdCBJID0gc29ydGVkSW5wdXRWYWx1ZXNbaW5kZXhdO1xuICAgIC8vIFN0b3JlIGluIExVVFxuICAgIFRpbnYuc2V0UGl4ZWxBdENoYW5uZWwoaSwgMCwgY2hhbm5lbCwgSSk7XG4gIH1cbn1cblxudHlwZSBTZWFtbGVzc1RleHR1cmVEYXRhID0ge1xuICBpbnB1dDogVGV4dHVyZURhdGFGbG9hdDsgLy8gaW5wdXQ6IGV4YW1wbGUgaW1hZ2VcbiAgVGlucHV0OiBUZXh0dXJlRGF0YUZsb2F0OyAvLyBvdXRwdXQ6IFQoaW5wdXQpIGltYWdlXG4gIFRpbnY6IFRleHR1cmVEYXRhRmxvYXQ7IC8vIG91dHB1dDogVF57LTF9IGxvb2stdXAgdGFibGVcbiAgY29sb3JTcGFjZVZlY3RvcjE6IE11dGFibGVWZWN0b3IzOyAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIHZlY3RvcjFcbiAgY29sb3JTcGFjZVZlY3RvcjI6IE11dGFibGVWZWN0b3IzOyAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIHZlY3RvcjJcbiAgY29sb3JTcGFjZVZlY3RvcjM6IE11dGFibGVWZWN0b3IzOyAvLyBvdXRwdXQ6IGNvbG9yIHNwYWNlIHZlY3RvcjNcbiAgY29sb3JTcGFjZU9yaWdpbjogTXV0YWJsZVZlY3RvcjM7IC8vIG91dHB1dDogY29sb3Igc3BhY2Ugb3JpZ2luXG4gIGx1dFdpZHRoOiBTaXplO1xufTtcblxuZnVuY3Rpb24gcHJlY29tcHV0YXRpb25zKFxuICBpbnB1dDogVGV4dHVyZURhdGFGbG9hdCwgLy8gaW5wdXQ6IGV4YW1wbGUgaW1hZ2VcbiAgTFVUX1dJRFRIOiBTaXplID0gMTI4XG4pIHtcbiAgY29uc3QgcmV0VmFsOiBhbnkgPSB7fTtcbiAgcmV0VmFsLmx1dFdpZHRoID0gTFVUX1dJRFRIO1xuICByZXRWYWwuY29sb3JTcGFjZVZlY3RvcjEgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHJldFZhbC5jb2xvclNwYWNlVmVjdG9yMiA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcmV0VmFsLmNvbG9yU3BhY2VWZWN0b3IzID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICByZXRWYWwuY29sb3JTcGFjZU9yaWdpbiA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICAvLyBTZWN0aW9uIDEuNCBJbXByb3ZlbWVudDogdXNpbmcgYSBkZWNvcnJlbGF0ZWQgY29sb3Igc3BhY2VcbiAgLy9cdGNvbnN0IGlucHV0X2RlY29ycmVsYXRlZDpBYnN0cmFjdFRleHR1cmUgPSBUZXh0dXJlRGF0YUZsb2F0KGlucHV0LndpZHRoLCBpbnB1dC5oZWlnaHQsIDMpO1xuICBjb25zdCBpbnB1dF9kZWNvcnJlbGF0ZWQgPSBuZXcgVGV4dHVyZURhdGFGbG9hdChpbnB1dC53aWR0aCwgaW5wdXQuaGVpZ2h0LCAzKTtcblxuICBkZWNvcnJlbGF0ZUNvbG9yU3BhY2UoXG4gICAgaW5wdXQsXG4gICAgaW5wdXRfZGVjb3JyZWxhdGVkLFxuICAgIHJldFZhbC5jb2xvclNwYWNlVmVjdG9yMSxcbiAgICByZXRWYWwuY29sb3JTcGFjZVZlY3RvcjIsXG4gICAgcmV0VmFsLmNvbG9yU3BhY2VWZWN0b3IzLFxuICAgIHJldFZhbC5jb2xvclNwYWNlT3JpZ2luXG4gICk7XG5cbiAgLy8gU2VjdGlvbiAxLjMuMiBBcHBseWluZyB0aGUgaGlzdG9ncmFtIHRyYW5zZm9ybWF0aW9uIFQgb24gdGhlIGlucHV0XG4gIC8vVGlucHV0ID0gVGV4dHVyZURhdGFGbG9hdChpbnB1dC53aWR0aCwgaW5wdXQuaGVpZ2h0LCAzKTtcbiAgY29uc3QgVGlucHV0ID0gbmV3IFRleHR1cmVEYXRhRmxvYXQoaW5wdXQud2lkdGgsIGlucHV0LmhlaWdodCwgMyk7XG4gIHJldFZhbC5UaW5wdXQgPSBUaW5wdXQ7XG5cbiAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCAzOyBjaGFubmVsKyspIHtcbiAgICBjb21wdXRlVGlucHV0KGlucHV0X2RlY29ycmVsYXRlZCwgVGlucHV0LCBjaGFubmVsKTtcbiAgfVxuXG4gIC8vIFNlY3Rpb24gMS4zLjMgUHJlY29tcHV0aW5nIHRoZSBpbnZlcnNlIGhpc3RvZ3JhbSB0cmFuc2Zvcm1hdGlvbiBUXnstMX1cbiAgY29uc3QgVGludiA9IG5ldyBUZXh0dXJlRGF0YUZsb2F0KExVVF9XSURUSCwgMSwgMyk7XG4gIHJldFZhbC5UaW52ID0gVGludjtcbiAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCAzOyBjaGFubmVsKyspIHtcbiAgICBjb21wdXRlSW52VChpbnB1dF9kZWNvcnJlbGF0ZWQsIFRpbnYsIGNoYW5uZWwpO1xuICB9XG5cbiAgLy8gU2VjdGlvbiAxLjUgSW1wcm92ZW1lbnQ6IHByZWZpbHRlcmluZyB0aGUgbG9vay11cCB0YWJsZVxuICAvLyBDb21wdXRlIG51bWJlciBvZiBwcmVmaWx0ZXJlZCBsZXZlbHMgYW5kIHJlc2l6ZSBMVVRcbiAgVGludi5yZXNpemUoVGludi53aWR0aCwgTWF0aC5mbG9vcihNYXRoLmxvZyhUaW5wdXQud2lkdGgpIC8gTWF0aC5sb2coMi4wKSksIDMpO1xuICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IDM7IGNoYW5uZWwrKykge1xuICAgIHByZWZpbHRlckxVVChUaW5wdXQsIFRpbnYsIGNoYW5uZWwpO1xuICB9XG5cbiAgcmV0dXJuIHJldFZhbCBhcyBTZWFtbGVzc1RleHR1cmVEYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEhUTUxJbWFnZUVsZW1lbnRUb0NhbnZhcyhcbiAgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyXG4pIHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG4gIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gIHJldHVybiBjYW52YXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lSW1hZ2VzKGRhdGE6IHtcbiAgcl9pbWFnZT86IEhUTUxDYW52YXNFbGVtZW50O1xuICBnX2ltYWdlPzogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIGJfaW1hZ2U/OiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgYV9pbWFnZT86IEhUTUxDYW52YXNFbGVtZW50O1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn0pIHtcbiAgY29uc3Qgd2lkdGggPSBkYXRhLndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBkYXRhLmhlaWdodDtcblxuICBjb25zdCBvdXRwdXRDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgb3V0cHV0Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gIG91dHB1dENhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIGNvbnN0IG91dHB1dEN0eCA9IG91dHB1dENhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcbiAgY29uc3Qgb3V0cHV0SW1hZ2VEYXRhID0gb3V0cHV0Q3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICBpZiAoSXMuZXhpc3QoZGF0YS5yX2ltYWdlKSkge1xuICAgIGNvbnN0IGlucHV0Ul9jdHggPSBkYXRhLnJfaW1hZ2UuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY29uc3Qgcl9pbWFnZURhdGEgPSBpbnB1dFJfY3R4LmdldEltYWdlRGF0YSgwLCAwLCBkYXRhLnJfaW1hZ2Uud2lkdGgsIGRhdGEucl9pbWFnZS5oZWlnaHQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykge1xuICAgICAgb3V0cHV0SW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAwXSA9IHJfaW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAwXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgaSsrKSB7XG4gICAgICBvdXRwdXRJbWFnZURhdGEuZGF0YVtpICogNCArIDBdID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoSXMuZXhpc3QoZGF0YS5nX2ltYWdlKSkge1xuICAgIGNvbnN0IGlucHV0R19jdHggPSBkYXRhLmdfaW1hZ2UuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY29uc3QgZ19pbWFnZURhdGEgPSBpbnB1dEdfY3R4LmdldEltYWdlRGF0YSgwLCAwLCBkYXRhLmdfaW1hZ2Uud2lkdGgsIGRhdGEuZ19pbWFnZS5oZWlnaHQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykge1xuICAgICAgb3V0cHV0SW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAxXSA9IGdfaW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAxXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgaSsrKSB7XG4gICAgICBvdXRwdXRJbWFnZURhdGEuZGF0YVtpICogNCArIDFdID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoSXMuZXhpc3QoZGF0YS5iX2ltYWdlKSkge1xuICAgIGNvbnN0IGlucHV0Ql9jdHggPSBkYXRhLmJfaW1hZ2UuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY29uc3QgYl9pbWFnZURhdGEgPSBpbnB1dEJfY3R4LmdldEltYWdlRGF0YSgwLCAwLCBkYXRhLmJfaW1hZ2Uud2lkdGgsIGRhdGEuYl9pbWFnZS5oZWlnaHQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykge1xuICAgICAgb3V0cHV0SW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAyXSA9IGJfaW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAyXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgaSsrKSB7XG4gICAgICBvdXRwdXRJbWFnZURhdGEuZGF0YVtpICogNCArIDJdID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoSXMuZXhpc3QoZGF0YS5hX2ltYWdlKSkge1xuICAgIGNvbnN0IGlucHV0QV9jdHggPSBkYXRhLmFfaW1hZ2UuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY29uc3QgYV9pbWFnZURhdGEgPSBpbnB1dEFfY3R4LmdldEltYWdlRGF0YSgwLCAwLCBkYXRhLmFfaW1hZ2Uud2lkdGgsIGRhdGEuYV9pbWFnZS5oZWlnaHQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykge1xuICAgICAgb3V0cHV0SW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAzXSA9IGFfaW1hZ2VEYXRhLmRhdGFbaSAqIDQgKyAzXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgaSsrKSB7XG4gICAgICBvdXRwdXRJbWFnZURhdGEuZGF0YVtpICogNCArIDNdID0gMDtcbiAgICB9XG4gIH1cblxuICBvdXRwdXRDdHgucHV0SW1hZ2VEYXRhKG91dHB1dEltYWdlRGF0YSwgMCwgMCk7XG5cbiAgcmV0dXJuIG91dHB1dENhbnZhcztcbn1cblxuZXhwb3J0IGNvbnN0IEltYWdlVXRpbCA9IE9iamVjdC5mcmVlemUoeyBwcmVjb21wdXRhdGlvbnMgfSk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItc3ByZWFkICovXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2Vucmljb21hcmluby9pc1xuXG50eXBlIEZuVHlwZSA9ICh2YWw6IHVua25vd24pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBJc09iaiA9IHtcbiAgZGVmaW5lZCh2YWw6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IHZhbCBpcyBFeGNsdWRlPE9iamVjdCwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHZhbCAhPT0gdm9pZCAwO1xuICB9LFxuXG4gIHVuZGVmaW5lZCh2YWw6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IHZhbCBpcyB1bmRlZmluZWQge1xuICAgIHJldHVybiB2YWwgPT09IHZvaWQgMDtcbiAgfSxcblxuICBudWxsKHZhbDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKTogdmFsIGlzIG51bGwge1xuICAgIHJldHVybiB2YWwgPT09IG51bGw7XG4gIH0sXG5cbiAgLy8gaXMgTk9UIG51bGwgb3IgdW5kZWZpbmVkXG4gIGV4aXN0KHZhbD86IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IHZhbCBpcyBPYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgZnVuY3Rpb24odmFsOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pOiB2YWwgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nO1xuICB9LFxuXG4gIHRydWUodmFsOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsID09PSB0cnVlO1xuICB9LFxuXG4gIHRydWx5KHZhbDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICBmYWxzZSh2YWw6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgPT09IGZhbHNlO1xuICB9LFxuXG4gIGZhbHN5KHZhbDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF2YWwgPyB0cnVlIDogZmFsc2U7XG4gIH0sXG5cbiAgc3RyaW5nQ29udGFpbmluZyh0aGlzU3RyOiBzdHJpbmcsIHF1ZXJ5U3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpc1N0ci5pbmRleE9mKHF1ZXJ5U3RyKSAhPT0gLTE7XG4gIH0sXG59O1xuXG5jb25zdCBEZXJpdmF0aXZlcyA9IHtcbiAgbm90KGZuOiBGblR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFsuLi5hcmd1bWVudHNdIGFzIGFueSk7XG4gICAgfTtcbiAgfSxcblxuICBhbGwoZm46IEZuVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF0uZXZlcnkoZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5hcmd1bWVudHNdLmV2ZXJ5KGZuKTtcbiAgICB9O1xuICB9LFxuXG4gIGFueShmbjogRm5UeXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXS5zb21lKGZuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbLi4uYXJndW1lbnRzXS5zb21lKGZuKTtcbiAgICB9O1xuICB9LFxufTtcblxuY29uc3QgTm90T2JqID0ge1xuICBkZWZpbmVkKHZhbDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKTogdmFsIGlzIHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHZhbCA9PT0gdm9pZCAwO1xuICB9LFxuXG4gIHVuZGVmaW5lZCh2YWw6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IHZhbCBpcyBPYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IHZvaWQgMDtcbiAgfSxcblxuICBudWxsKHZhbDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKTogdmFsIGlzIE9iamVjdCB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbDtcbiAgfSxcblxuICBleGlzdCh2YWw/OiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pOiB2YWwgaXMgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZDtcbiAgfSxcblxuICBmdW5jdGlvbih2YWw6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IHZhbCBpcyBFeGNsdWRlPHVua25vd24sIEZ1bmN0aW9uPiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbic7XG4gIH0sXG5cbiAgdHJ1ZSh2YWw6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgIT09IHRydWU7XG4gIH0sXG5cbiAgdHJ1bHkodmFsOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsID8gZmFsc2UgOiB0cnVlO1xuICB9LFxuXG4gIGZhbHNlKHZhbDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCAhPT0gZmFsc2U7XG4gIH0sXG5cbiAgZmFsc3kodmFsOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXZhbCA/IGZhbHNlIDogdHJ1ZTtcbiAgfSxcbn07XG5cbnR5cGUgSXNJbXBsVHlwZSA9IHR5cGVvZiBJc09iajtcbi8vIGludGVyZmFjZSBJc0ltcGxUeXBlIHtcbi8vICAgW3M6IHN0cmluZ106IHtbczogc3RyaW5nXTogRm5UeXBlfTtcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJc1R5cGUgZXh0ZW5kcyBJc0ltcGxUeXBlIHtcbiAgbm90OiB0eXBlb2YgTm90T2JqO1xuICBhbGw6IHR5cGVvZiBJc09iajtcbiAgYW55OiB0eXBlb2YgSXNPYmo7XG59XG5cbi8vIEFkZCBkZXJpdmF0aXZlcyB0byB0aGUgSXNPYmpcbmZvciAoY29uc3Qgc3ViRm4gaW4gRGVyaXZhdGl2ZXMpIHtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChEZXJpdmF0aXZlcywgc3ViRm4pKSB7XG4gICAgKElzT2JqIGFzIGFueSlbc3ViRm5dID0ge30gYXMgdHlwZW9mIElzT2JqO1xuICAgIGZvciAoY29uc3QgZm4gaW4gSXNPYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoSXNPYmosIGZuKSkge1xuICAgICAgICBpZiAoc3ViRm4gPT09ICdub3QnKSB7XG4gICAgICAgICAgKElzT2JqIGFzIGFueSlbc3ViRm5dW2ZuXSA9IChEZXJpdmF0aXZlcyBhcyBhbnkpW3N1YkZuXSgoTm90T2JqIGFzIG5ldmVyKVtmbl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChJc09iaiBhcyBhbnkpW3N1YkZuXVtmbl0gPSAoRGVyaXZhdGl2ZXMgYXMgYW55KVtzdWJGbl0oKElzT2JqIGFzIG5ldmVyKVtmbl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBJcyA9IElzT2JqIGFzIElzVHlwZTtcbiIsImV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgRGVidWcgPSAwLFxuICBJbmZvLFxuICBXYXJuLFxuICBFcnJvcixcbiAgQXNzZXJ0LFxufVxuXG5jbGFzcyBMb2cge1xuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgdGltZXN0YW1wOiBudW1iZXIgPSAwO1xuICBsb2dMZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5JbmZvO1xufVxuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19tZXNzYWdlczogTG9nW10gPSBbXTtcbiAgc3RhdGljIGxvZ0xldmVsID0gTG9nTGV2ZWwuV2FybjtcbiAgc3RhdGljIGlzUmljaExvZyA9IGZhbHNlO1xuICBzdGF0aWMgaXNBY2N1bXVsYXRlTG9nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jb21tb24obWVzc2FnZTogc3RyaW5nLCBsb2dMZXZlbDogTG9nTGV2ZWwpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5pc0FjY3VtdWxhdGVMb2cgJiYgIXRoaXMuaXNSaWNoTG9nKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBzdG9yZSBsb2dcbiAgICBjb25zdCBsb2cgPSBuZXcgTG9nKCk7XG4gICAgbG9nLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGxvZy50aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGxvZy5sb2dMZXZlbCA9IGxvZ0xldmVsO1xuXG4gICAgaWYgKHRoaXMuaXNBY2N1bXVsYXRlTG9nKSB7XG4gICAgICB0aGlzLl9fbWVzc2FnZXMucHVzaChsb2cpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZm9ybWF0TG9ncyhsb2cpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jbGVhckFjY3VtdWxhdGVkTG9nKCk6IHZvaWQge1xuICAgIHRoaXMuX19tZXNzYWdlcyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19mb3JtYXRMb2dzKGxvZzogTG9nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNSaWNoTG9nKSB7XG4gICAgICByZXR1cm4gbG9nLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IGxvZyB0ZXh0XG4gICAgY29uc3QgeXl5eW1tZGQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh1bmRlZmluZWQsIHtcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgc2Vjb25kOiAnMi1kaWdpdCcsXG4gICAgfSk7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSB5eXl5bW1kZC5mb3JtYXQobG9nLnRpbWVzdGFtcCk7XG4gICAgY29uc3QgZmluYWxNZXNzYWdlID0gYFJuWyR7dGhpcy5fX2dldExvZ0xldmVsVGV4dChsb2cubG9nTGV2ZWwpfV1bJHtkYXRlVGltZX1dOiAke2xvZy5tZXNzYWdlfWA7XG5cbiAgICByZXR1cm4gZmluYWxNZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZXRMb2dMZXZlbFRleHQobG9nTGV2ZWw6IExvZ0xldmVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTG9nTGV2ZWxbbG9nTGV2ZWxdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmxvZ0xldmVsIDw9IExvZ0xldmVsLkVycm9yKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gdGhpcy5fX2NvbW1vbihtZXNzYWdlLCBMb2dMZXZlbC5FcnJvcik7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5sb2dMZXZlbCA8PSBMb2dMZXZlbC5XYXJuKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gdGhpcy5fX2NvbW1vbihtZXNzYWdlLCBMb2dMZXZlbC5XYXJuKTtcbiAgICAgIGNvbnNvbGUud2Fybihmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWRNZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMubG9nTGV2ZWwgPD0gTG9nTGV2ZWwuSW5mbykge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IHRoaXMuX19jb21tb24obWVzc2FnZSwgTG9nTGV2ZWwuSW5mbyk7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5sb2dMZXZlbCA8PSBMb2dMZXZlbC5EZWJ1Zykge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IHRoaXMuX19jb21tb24obWVzc2FnZSwgTG9nTGV2ZWwuRGVidWcpO1xuICAgICAgY29uc29sZS5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWRNZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuLCBtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmxvZ0xldmVsIDw9IExvZ0xldmVsLkFzc2VydCkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IHRoaXMuX19jb21tb24obWVzc2FnZSwgTG9nTGV2ZWwuQXNzZXJ0KTtcbiAgICAgIGNvbnNvbGUuYXNzZXJ0KGNvbmRpdGlvbiwgZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWNjdW11bGF0ZWRMb2coKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9fbWVzc2FnZXMubWFwKChsb2cpID0+IHRoaXMuX19mb3JtYXRMb2dzKGxvZykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCeXRlLCBTaXplLCBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuL0lzJztcblxuY29uc3QgaXNNb2JpbGVWciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIC8oUGFjaWZpYyBCdWlsZC4rT2N1bHVzQnJvd3Nlci4rU2Ftc3VuZ0Jyb3dzZXIuKyl8KFNhbXN1bmdCcm93c2VyKXwoTW9iaWxlIFZSKS9pLnRlc3QoXG4gICAgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnRcbiAgKTtcbn07XG5cbmNvbnN0IGlzTW9iaWxlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCB1YSA9IFtcbiAgICAnaVBvZCcsXG4gICAgJ2lQYWQnLCAvLyBmb3Igb2xkIHZlcnNpb25cbiAgICAnaVBob25lJyxcbiAgICAnQW5kcm9pZCcsXG4gIF07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YodWFbaV0pID4gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzSVBhZCgpO1xufTtcblxuY29uc3QgaXNTYWZhcmkgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHRvQmUgPSAnU2FmYXJpJztcbiAgY29uc3Qgbm9Ub0JlID0gJ0Nocm9tZSc7XG5cbiAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZih0b0JlKSA+IDAgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKG5vVG9CZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBpc0lPUyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgdWEgPSBbXG4gICAgJ2lQb2QnLFxuICAgICdpUGFkJywgLy8gZm9yIG9sZCB2ZXJzaW9uXG4gICAgJ2lQaG9uZScsXG4gIF07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YodWFbaV0pID4gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzSVBhZCgpO1xufTtcblxuY29uc3QgaXNJUGFkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSA+IC0xICYmICdvbnRvdWNoZW5kJyBpbiBkb2N1bWVudDtcbn07XG5cbmNvbnN0IHByZXZlbnREZWZhdWx0Rm9yRGVza3RvcE9ubHkgPSBmdW5jdGlvbiAoZTogRXZlbnQpIHtcbiAgaWYgKCFpc01vYmlsZSgpKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xuXG5jb25zdCBpc09iamVjdCA9IGZ1bmN0aW9uIChvOiBhbnkpIHtcbiAgcmV0dXJuIG8gaW5zdGFuY2VvZiBPYmplY3QgJiYgIShvIGluc3RhbmNlb2YgQXJyYXkpID8gdHJ1ZSA6IGZhbHNlO1xufTtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzAwMDMzNTMvY2FuLWVzNi10ZW1wbGF0ZS1saXRlcmFscy1iZS1zdWJzdGl0dXRlZC1hdC1ydW50aW1lLW9yLXJldXNlZFxuY29uc3QgZmlsbFRlbXBsYXRlID0gZnVuY3Rpb24gKHRlbXBsYXRlU3RyaW5nOiBzdHJpbmcsIHRlbXBsYXRlVmFyczogc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oJ3JldHVybiBgJyArIHRlbXBsYXRlU3RyaW5nICsgJ2A7JykuY2FsbCh0ZW1wbGF0ZVZhcnMpO1xufTtcblxuY29uc3QgaXNOb2RlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJztcbn07XG5cbmNvbnN0IGNvbmNhdEFycmF5QnVmZmVycyA9IGZ1bmN0aW9uIChcbiAgc2VnbWVudHM6IEFycmF5QnVmZmVyW10sXG4gIHNpemVzOiBCeXRlW10sXG4gIG9mZnNldHM6IEJ5dGVbXSxcbiAgZmluYWxTaXplPzogQnl0ZVxuKSB7XG4gIGxldCBzdW1MZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemVzLmxlbmd0aDsgKytpKSB7XG4gICAgc3VtTGVuZ3RoICs9IHNpemVzW2ldO1xuICB9XG4gIGxldCB3aG9sZTogVWludDhBcnJheTtcbiAgaWYgKGZpbmFsU2l6ZSAhPSBudWxsKSB7XG4gICAgd2hvbGUgPSBuZXcgVWludDhBcnJheShmaW5hbFNpemUpO1xuICB9IGVsc2Uge1xuICAgIHdob2xlID0gbmV3IFVpbnQ4QXJyYXkoc3VtTGVuZ3RoKTtcbiAgfVxuXG4gIGNvbnN0IGdldEV4Y2VlZGVkU2l6ZSA9IChzaXplVG9BZGQ6IFNpemUpID0+IHtcbiAgICBpZiAoZmluYWxTaXplICE9IG51bGwgJiYgb2Zmc2V0T2ZCYXNlICsgc2l6ZVRvQWRkID4gZmluYWxTaXplKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0T2ZCYXNlICsgc2l6ZVRvQWRkIC0gZmluYWxTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH07XG4gIGxldCBvZmZzZXRPZkJhc2UgPSAwO1xuICBjb25zdCBhZGREYXRhID0gKHNpemVUb0FkZDogU2l6ZSwgaTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZXhjZWVkZWRTaXplID0gZ2V0RXhjZWVkZWRTaXplKHNpemVUb0FkZCk7XG4gICAgaWYgKGV4Y2VlZGVkU2l6ZSkge1xuICAgICAgd2hvbGUuc2V0KG5ldyBVaW50OEFycmF5KHNlZ21lbnRzW2ldLCBvZmZzZXRzW2ldLCBleGNlZWRlZFNpemUpLCBvZmZzZXRPZkJhc2UpO1xuICAgICAgb2Zmc2V0T2ZCYXNlICs9IGV4Y2VlZGVkU2l6ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aG9sZS5zZXQobmV3IFVpbnQ4QXJyYXkoc2VnbWVudHNbaV0sIG9mZnNldHNbaV0sIHNpemVUb0FkZCksIG9mZnNldE9mQmFzZSk7XG4gICAgICBvZmZzZXRPZkJhc2UgKz0gc2l6ZVRvQWRkO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWRkT3ZlclNpemVEYXRhID0gKG92ZXJTaXplOiBTaXplKSA9PiB7XG4gICAgY29uc3QgZXhjZWVkZWRTaXplID0gZ2V0RXhjZWVkZWRTaXplKG92ZXJTaXplKTtcbiAgICBpZiAoZXhjZWVkZWRTaXplKSB7XG4gICAgICB3aG9sZS5zZXQobmV3IFVpbnQ4QXJyYXkoZXhjZWVkZWRTaXplKSwgb2Zmc2V0T2ZCYXNlKTtcbiAgICAgIG9mZnNldE9mQmFzZSArPSBleGNlZWRlZFNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hvbGUuc2V0KG5ldyBVaW50OEFycmF5KG92ZXJTaXplKSwgb2Zmc2V0T2ZCYXNlKTtcbiAgICAgIG9mZnNldE9mQmFzZSArPSBvdmVyU2l6ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGRlbHRhID0gc2l6ZXNbaV0gKyBvZmZzZXRzW2ldIC0gc2VnbWVudHNbaV0uYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBvdmVyU2l6ZSA9IGRlbHRhID4gMCA/IGRlbHRhIDogMDtcbiAgICBjb25zdCBzaXplVG9BZGQgPSBzaXplc1tpXSAtIG92ZXJTaXplO1xuICAgIGlmIChhZGREYXRhKHNpemVUb0FkZCwgaSkpIHtcbiAgICAgIHJldHVybiB3aG9sZS5idWZmZXI7XG4gICAgfVxuICAgIGlmIChvdmVyU2l6ZSA+IDApIHtcbiAgICAgIGlmIChhZGRPdmVyU2l6ZURhdGEob3ZlclNpemUpKSB7XG4gICAgICAgIHJldHVybiB3aG9sZS5idWZmZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmaW5hbFNpemUgIT0gbnVsbCAmJiBvZmZzZXRPZkJhc2UgPCBmaW5hbFNpemUpIHtcbiAgICB3aG9sZS5zZXQobmV3IFVpbnQ4QXJyYXkoZmluYWxTaXplIC0gb2Zmc2V0T2ZCYXNlKSwgb2Zmc2V0T2ZCYXNlKTtcbiAgfVxuICByZXR1cm4gd2hvbGUuYnVmZmVyO1xufTtcblxuY29uc3QgY29uY2F0QXJyYXlCdWZmZXJzMiA9ICh7XG4gIGZpbmFsU2l6ZSxcbiAgc3JjcyxcbiAgc3Jjc09mZnNldCxcbiAgc3Jjc0NvcHlTaXplLFxufToge1xuICBmaW5hbFNpemU6IEJ5dGU7XG4gIHNyY3M6IEFycmF5QnVmZmVyW107XG4gIHNyY3NPZmZzZXQ6IEJ5dGVbXTtcbiAgc3Jjc0NvcHlTaXplOiBCeXRlW107XG59KSA9PiB7XG4gIGNvbnN0IGRzdEJ1ZiA9IG5ldyBVaW50OEFycmF5KG5ldyBBcnJheUJ1ZmZlcihmaW5hbFNpemUpKTtcbiAgbGV0IGNvcGllZFNpemUgPSAwO1xuICBmb3IgKGNvbnN0IGkgaW4gc3Jjcykge1xuICAgIGNvbnN0IHNyYyA9IHNyY3NbaV07XG4gICAgY29uc3Qgc3JjQnVmID0gbmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNzT2Zmc2V0W2ldLCBzcmNzQ29weVNpemVbaV0pO1xuICAgIGRzdEJ1Zi5zZXQoc3JjQnVmLCBjb3BpZWRTaXplKTtcbiAgICBjb3BpZWRTaXplICs9IHNyY3NDb3B5U2l6ZVtpXTtcbiAgfVxuICByZXR1cm4gZHN0QnVmLmJ1ZmZlcjtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWx1ZVdpdGhEZWZhdWx0ID0gPFQ+KHsgdmFsdWUsIGRlZmF1bHRWYWx1ZSB9OiB7IHZhbHVlPzogVDsgZGVmYXVsdFZhbHVlOiBUIH0pOiBUID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlmRXhpc3RzVGhlbiA9IDxUPihjYWxsYmFjazogKHZhbHVlOiBUKSA9PiB2b2lkLCB2YWx1ZT86IFQpOiB2YWx1ZSBpcyBUID0+IHtcbiAgaWYgKElzLmV4aXN0KHZhbHVlKSkge1xuICAgIGNhbGxiYWNrKHZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgaWZFeGlzdHNUaGVuV2l0aFJldHVybiA9IDxUPihjYWxsYmFjazogKHZhbHVlOiBUKSA9PiBULCB2YWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKElzLmV4aXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBjYWxsYmFjayh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlmRGVmaW5lZFRoZW4gPSA8VD4oY2FsbGJhY2s6ICh2YWx1ZTogVCkgPT4gdm9pZCwgdmFsdWU/OiBUKTogdmFsdWUgaXMgVCA9PiB7XG4gIGlmIChJcy5leGlzdCh2YWx1ZSkpIHtcbiAgICBjYWxsYmFjayh2YWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlmRGVmaW5lZFRoZW5XaXRoUmV0dXJuID0gPFQ+KGNhbGxiYWNrOiAodmFsdWU6IFQpID0+IFQsIHZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoSXMuZXhpc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgaWZVbmRlZmluZWRUaGVuID0gPFQ+KGNhbGxiYWNrOiAoKSA9PiB2b2lkLCB2YWx1ZT86IFQpOiB2YWx1ZSBpcyBUID0+IHtcbiAgaWYgKElzLnVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICBjYWxsYmFjaygpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpZlVuZGVmaW5lZFRoZW5XaXRoUmV0dXJuID0gPFQ+KGNhbGxiYWNrOiAoKSA9PiBULCB2YWx1ZT86IFQpOiBUID0+IHtcbiAgaWYgKElzLnVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgaWZOb3RFeGlzdHNUaGVuID0gPFQ+KGNhbGxiYWNrOiAoKSA9PiB2b2lkLCB2YWx1ZT86IFQpOiB2b2lkID0+IHtcbiAgaWYgKElzLnVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaWZOb3RFeGlzdHNUaGVuV2l0aFJldHVybiA9IDxUPihjYWxsYmFjazogKCkgPT4gVCwgdmFsdWU/OiBUKTogVCA9PiB7XG4gIGlmIChJcy51bmRlZmluZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRWYWx1ZSA9IDxUPihkZWZhdWx0VmFsdWU6IFQsIHZhbHVlPzogVCk6IFQgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsdWVXaXRoQ29tcGVuc2F0aW9uID0gPFQ+KHtcbiAgdmFsdWUsXG4gIGNvbXBlbnNhdGlvbixcbn06IHtcbiAgdmFsdWU/OiBUO1xuICBjb21wZW5zYXRpb246ICgpID0+IFQ7XG59KSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gY29tcGVuc2F0aW9uKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG51bGxpc2hUb0VtcHR5QXJyYXkgPSA8VD4odmFsdWU/OiBUW10gfCBudWxsKTogVFtdID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgbnVsbGlzaFRvRW1wdHlNYXAgPSA8TSwgTj4odmFsdWU/OiBNYXA8TSwgTj4gfCBudWxsKTogTWFwPE0sIE4+ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBuZXcgTWFwKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuaW50ZXJmYWNlIENvbXBhcmVSZXN1bHQge1xuICByZXN1bHQ6IGJvb2xlYW47XG4gIGdyZWF0ZXI6IG51bWJlcjtcbiAgbGVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgZ3JlYXRlclRoYW4gPSAoaXQ6IG51bWJlciwgdGhhbjogbnVtYmVyKTogQ29tcGFyZVJlc3VsdCA9PiB7XG4gIGlmIChpdCA+IHRoYW4pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUsIGdyZWF0ZXI6IGl0LCBsZXNzOiB0aGFuIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgZ3JlYXRlcjogdGhhbiwgbGVzczogaXQgfTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGxlc3NUaGFuID0gKGl0OiBudW1iZXIsIHRoYW46IG51bWJlcik6IENvbXBhcmVSZXN1bHQgPT4ge1xuICBpZiAoaXQgPCB0aGFuKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlLCBncmVhdGVyOiB0aGFuLCBsZXNzOiBpdCB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIGdyZWF0ZXI6IGl0LCBsZXNzOiB0aGFuIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZGRMaW5lTnVtYmVyVG9Db2RlID0gKHNoYWRlclN0cmluZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHNoYWRlclRleHRMaW5lcyA9IHNoYWRlclN0cmluZy5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgbGV0IHNoYWRlclRleHRXaXRoTGluZU51bWJlciA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYWRlclRleHRMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGxpbmVJbmRleCA9IGkgKyAxO1xuICAgIGxldCBzcGxpdHRlciA9ICcgOiAnO1xuICAgIGlmIChsaW5lSW5kZXggPCAxMCkge1xuICAgICAgc3BsaXR0ZXIgPSAnICA6ICc7XG4gICAgfSBlbHNlIGlmIChsaW5lSW5kZXggPj0gMTAwKSB7XG4gICAgICBzcGxpdHRlciA9ICc6ICc7XG4gICAgfVxuICAgIHNoYWRlclRleHRXaXRoTGluZU51bWJlciArPSBsaW5lSW5kZXggKyBzcGxpdHRlciArIHNoYWRlclRleHRMaW5lc1tpXSArICdcXG4nO1xuICB9XG5cbiAgcmV0dXJuIHNoYWRlclRleHRXaXRoTGluZU51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeGlzdDxUPih2YWw6IFQpOiBhc3NlcnRzIHZhbCBpcyBOb25OdWxsYWJsZTxUPiB7XG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICd2YWwnIHRvIGJlIGV4aXN0ZWQsIGJ1dCByZWNlaXZlZCAke3ZhbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcENvcHlVc2luZ0pzb25TdHJpbmdpZnkob2JqOiB7IFtrOiBzdHJpbmddOiBhbnkgfSkge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQXJyYXlCdWZmZXIoZmlsZU5hbWVUb0Rvd25sb2FkOiBzdHJpbmcsIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcikge1xuICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICBhLmRvd25sb2FkID0gZmlsZU5hbWVUb0Rvd25sb2FkO1xuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2FycmF5QnVmZmVyXSwgeyB0eXBlOiAnb2N0ZXQvc3RyZWFtJyB9KTtcbiAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgYS5ocmVmID0gdXJsO1xuICBjb25zdCBlID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJyk7XG4gIGEuZGlzcGF0Y2hFdmVudChlKTtcbiAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRUeXBlZEFycmF5KGZpbGVOYW1lVG9Eb3dubG9hZDogc3RyaW5nLCB0eXBlZEFycmF5OiBUeXBlZEFycmF5KSB7XG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGEuZG93bmxvYWQgPSBmaWxlTmFtZVRvRG93bmxvYWQ7XG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdHlwZWRBcnJheV0sIHsgdHlwZTogJ29jdGV0L3N0cmVhbScgfSk7XG4gIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gIGEuaHJlZiA9IHVybDtcbiAgY29uc3QgZSA9IG5ldyBNb3VzZUV2ZW50KCdjbGljaycpO1xuICBhLmRpc3BhdGNoRXZlbnQoZSk7XG4gIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1pc2NVdGlsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGlzTW9iaWxlVnIsXG4gIGlzTW9iaWxlLFxuICBpc0lPUyxcbiAgaXNTYWZhcmksXG4gIHByZXZlbnREZWZhdWx0Rm9yRGVza3RvcE9ubHksXG4gIGlzT2JqZWN0LFxuICBmaWxsVGVtcGxhdGUsXG4gIGlzTm9kZSxcbiAgY29uY2F0QXJyYXlCdWZmZXJzLFxuICBjb25jYXRBcnJheUJ1ZmZlcnMyLFxuICBhZGRMaW5lTnVtYmVyVG9Db2RlLFxuICBkb3dubG9hZEFycmF5QnVmZmVyLFxuICBkb3dubG9hZFR5cGVkQXJyYXksXG59KTtcbiIsImltcG9ydCB7IElzIH0gZnJvbSAnLi9Jcyc7XG4vLyBJbnNwaXJlZCBmcm9tIGh0dHBzOi8vc2NsZWFwdC5jb20vdHlwZXNjcmlwdF9vcHRpb24vXG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBoYW5kbGluZyB2YWx1ZXMgd2hvc2UgZXhpc3RlbmNlIGlzIHVuY2VydGFpbi5cbiAqL1xuXG5jb25zdCBlcnJvclN0ciA9ICdUaGUgdmFsdWUgZG9lcyBub3QgZXhpc3QhJztcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbjxUPiB7XG4gIC8vIGRvIHRoZSBcImZcIiBmdW5jdGlvbiBmb3JcbiAgdGhlbjxVPihmOiAodmFsdWU6IFQpID0+IElPcHRpb248VT4pOiBJT3B0aW9uPFU+O1xuICB0aGVuKGY6ICh2YWx1ZTogVCkgPT4gTm9uZSk6IE5vbmU7XG5cbiAgdW53cmFwT3JEZWZhdWx0KGFsdFZhbHVlOiBUKTogVDtcbiAgdW53cmFwT3JFbHNlKGY6ICguLi52YWxzOiBhbnkpID0+IFQpOiBUO1xuICB1bndyYXBPclVuZGVmaW5lZCgpOiBUIHwgdW5kZWZpbmVkO1xuICB1bndyYXBGb3JjZSgpOiBUO1xuICBoYXMoKTogdGhpcyBpcyBTb21lPFQ+O1xuICBkb2VzTm90SGF2ZSgpOiB0aGlzIGlzIE5vbmU7XG59XG5cbmV4cG9ydCBjbGFzcyBPcHRpb248VD4gaW1wbGVtZW50cyBJT3B0aW9uPFQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YWx1ZT86IFQpIHt9XG5cbiAgc2V0KHZhbDogVCkge1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cblxuICAvKipcbiAgICogaWYgaW5uZXJcbiAgICogQHBhcmFtIGZcbiAgICovXG4gIHRoZW4oZjogKHZhbHVlOiBUKSA9PiBOb25lKTogTm9uZTtcbiAgdGhlbjxVPihmOiAodmFsdWU6IFQpID0+IFNvbWU8VT4pOiBTb21lPFU+O1xuICB0aGVuPFU+KGY6ICh2YWx1ZTogVCkgPT4gSU9wdGlvbjxVPik6IElPcHRpb248VT4ge1xuICAgIHJldHVybiBJcy5leGlzdCh0aGlzLnZhbHVlKSA/IGYodGhpcy52YWx1ZSkgOiBuZXcgTm9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhbHRWYWx1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdW53cmFwT3JEZWZhdWx0KGFsdFZhbHVlOiBUKTogVCB7XG4gICAgcmV0dXJuIElzLmV4aXN0KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IGFsdFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhbHRWYWx1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdW53cmFwT3JFbHNlKGY6ICguLi52YWxzOiBhbnkpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gSXMuZXhpc3QodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1bndyYXBGb3JjZSgpOiBUIHtcbiAgICBpZiAoSXMuZXhpc3QodGhpcy52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3JTdHIpO1xuICAgIH1cbiAgfVxuXG4gIHVud3JhcE9yVW5kZWZpbmVkKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmIChJcy5leGlzdCh0aGlzLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgaGFzKCk6IHRoaXMgaXMgU29tZTxUPiB7XG4gICAgcmV0dXJuIElzLmV4aXN0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgZG9lc05vdEhhdmUoKTogdGhpcyBpcyBOb25lIHtcbiAgICByZXR1cm4gIUlzLmV4aXN0KHRoaXMudmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogYSBjbGFzcyBpbmRpY2F0aW5nIHRoYXQgdGhlIGluY2x1ZGVkIHZhbHVlIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvbWU8VD4gaW1wbGVtZW50cyBJT3B0aW9uPFQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YWx1ZTogVCkge31cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgZXNzZW50aWFsbHkgc2FtZSB0byB0aGUgU29tZTo6YW5kX3RoZW4oKSBpbiBSdXN0IGxhbmd1YWdlXG4gICAqIEBwYXJhbSBmXG4gICAqL1xuICB0aGVuKGY6ICh2YWx1ZTogVCkgPT4gTm9uZSk6IE5vbmU7XG4gIHRoZW48VT4oZjogKHZhbHVlOiBUKSA9PiBTb21lPFU+KTogU29tZTxVPjtcbiAgdGhlbjxVPihmOiAodmFsdWU6IFQpID0+IElPcHRpb248VT4pOiBJT3B0aW9uPFU+IHtcbiAgICByZXR1cm4gZih0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWx0VmFsdWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHVud3JhcE9yRGVmYXVsdChhbHRWYWx1ZTogVCk6IFQge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhbHRWYWx1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdW53cmFwT3JFbHNlKGY6ICh2YWx1ZTogVCkgPT4gVCk6IFQge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhbHRWYWx1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdW53cmFwRm9yY2UoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICB1bndyYXBPclVuZGVmaW5lZCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIGdldCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIGhhcygpOiB0aGlzIGlzIFNvbWU8VD4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZG9lc05vdEhhdmUoKTogdGhpcyBpcyBOb25lIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBhIGNsYXNzIGluZGljYXRpbmcgbm8gZXhpc3RlbmNlLlxuICovXG5leHBvcnQgY2xhc3MgTm9uZSBpbXBsZW1lbnRzIElPcHRpb248bmV2ZXI+IHtcbiAgdGhlbigpOiBOb25lIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVud3JhcE9yRGVmYXVsdDxUPih2YWx1ZTogVCk6IFQge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHVud3JhcE9yRWxzZShmOiAoLi4udmFsczogYW55KSA9PiBuZXZlcik6IG5ldmVyIHtcbiAgICByZXR1cm4gZih1bmRlZmluZWQgYXMgbmV2ZXIpO1xuICB9XG5cbiAgdW53cmFwRm9yY2UoKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihlcnJvclN0cik7XG4gIH1cblxuICB1bndyYXBPclVuZGVmaW5lZCgpOiBuZXZlciB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBuZXZlcjtcbiAgfVxuXG4gIGhhcygpOiB0aGlzIGlzIFNvbWU8bmV2ZXI+IHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkb2VzTm90SGF2ZSgpOiB0aGlzIGlzIE5vbmUge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRIYXModmFsdWU6IElPcHRpb248YW55Pik6IGFzc2VydHMgdmFsdWUgaXMgU29tZTxhbnk+IHtcbiAgaWYgKCF2YWx1ZS5oYXMoKSkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihlcnJvclN0cik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERvZXNOb3RIYXZlKHZhbHVlOiBJT3B0aW9uPGFueT4pOiBhc3NlcnRzIHZhbHVlIGlzIE5vbmUge1xuICBpZiAodmFsdWUuaGFzKCkpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3JTdHIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSbkV4Y2VwdGlvbiB9IGZyb20gJy4vUm5FeGNlcHRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJuRXJyb3I8RXJyT2JqPiB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZXJyb3I6IEVyck9iajtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdG8gaGFuZGxlIHJlc3VsdHMgaW4gYSB1bmlmaWVkIG1hbm5lcixcbiAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBzdWNjZXNzZnVsIG9yIG5vdC5cbiAqL1xuaW50ZXJmYWNlIElSZXN1bHQ8VCwgRXJyT2JqPiB7XG4gIC8qKlxuICAgKiBwYXR0ZXJuIG1hdGNoaW5nXG4gICAqIEBwYXJhbSBvYmogYW4gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIHBhdHRlcm4gbWF0Y2hpbmcgZnVuY3Rpb25zLCBPayBhbmQgRXJyLlxuICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGZ1bmN0aW9uIGFzIGEgUmVzdWx0IG9iamVjdC5cbiAgICovXG4gIG1hdGNoPFIsIEVyck9iajI+KHtcbiAgICBPayxcbiAgICBFcnIsXG4gIH06IHtcbiAgICBPazogKHZhbHVlOiBUKSA9PiBSO1xuICAgIEVycjogKHZhbHVlOiBSbkVycm9yPEVyck9iaj4pID0+IFJuRXJyb3I8RXJyT2JqMj47XG4gIH0pOiBSZXN1bHQ8UiwgRXJyT2JqMj47XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgaW5uZXIgdmFsdWUuXG4gICAqIElmIHRoZSByZXN1bHQgaXMgRXJyLCBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY29tcGVuc2F0ZXMgdGhlIGVycm9yIHdpdGggYW4gYWx0ZXJuYXRpdmUgdmFsaWQgdmFsdWUuXG4gICAqIFNvIHlvdSBjYW4gZ2V0IHRoZSBpbm5lciB2YWx1ZSB3aGV0aGVyIHRoZSByZXN1bHQgaXMgT2sgb3IgRXJyLlxuICAgKiBAcGFyYW0gY2F0Y2hGblxuICAgKiBAcmV0dXJucyB0aGUgaW5uZXIgdmFsdWVcbiAgICovXG4gIHVud3JhcFdpdGhDb21wZW5zYXRpb24oY2F0Y2hGbjogKGVycjogUm5FcnJvcjxFcnJPYmo+KSA9PiBUKTogVDtcblxuICAvKipcbiAgICogZ2V0IHRoZSBpbm5lciB2YWx1ZSBhbnl3YXkuXG4gICAqIElmIHRoZSByZXN1bHQgaXMgRXJyLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgKiBAcmV0dXJucyB0aGUgaW5uZXIgdmFsdWVcbiAgICovXG4gIHVud3JhcEZvcmNlKCk6IFQ7XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgYm9vbGVhbiB2YWx1ZSB3aGV0aGVyIHRoZSByZXN1bHQgaXMgT2sgb3Igbm90LlxuICAgKiBEbyBub3QgdXNlIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBVc2UgaXNPaygpIGZ1bmN0aW9uIGJlbGxvdyBpbnN0ZWFkLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgT2sgb3Igbm90XG4gICAqL1xuICBfaXNPaygpOiB0aGlzIGlzIE9rPFQsIEVyck9iaj47XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgYm9vbGVhbiB2YWx1ZSB3aGV0aGVyIHRoZSByZXN1bHQgaXMgRXJyIG9yIG5vdC5cbiAgICogRG8gbm90IHVzZSB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVXNlIGlzRXJyKCkgZnVuY3Rpb24gYmVsbG93IGluc3RlYWQuXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBFcnIgb3Igbm90XG4gICAqL1xuICBfaXNFcnIoKTogdGhpcyBpcyBFcnI8VCwgRXJyT2JqPjtcblxuICAvKipcbiAgICogZ2V0IHRoZSBuYW1lIG9mIGNsYXNzLiBpLmUuICdPaycgb3IgJ0VycidcbiAgICovXG4gIG5hbWUoKTogc3RyaW5nO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBDUmVzdWx0PFQsIEVyck9iaj4ge1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdmFsPzogVCB8IFJuRXJyb3I8RXJyT2JqPikge31cbiAgbWF0Y2g8UiwgRXJyT2JqMj4ob2JqOiB7XG4gICAgT2s6ICh2YWx1ZTogVCkgPT4gUjtcbiAgICBFcnI6ICh2YWx1ZTogUm5FcnJvcjxFcnJPYmo+KSA9PiBSbkVycm9yPEVyck9iajI+O1xuICB9KTogUmVzdWx0PFIsIEVyck9iajI+IHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE9rKSB7XG4gICAgICByZXR1cm4gbmV3IE9rKG9iai5Payh0aGlzLnZhbCBhcyBUKSk7XG4gICAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgRXJyKSB7XG4gICAgICByZXR1cm4gbmV3IEVycihvYmouRXJyKHRoaXMudmFsIGFzIFJuRXJyb3I8RXJyT2JqPikpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBuZWl0aGVyIE9rIG5vciBFcnIuJyk7XG4gIH1cbiAgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBhIGNsYXNzIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzdWx0IGlzIE9rIChTdWNjZWVkZWQpLlxuICovXG5leHBvcnQgY2xhc3MgT2s8VCwgRXJyT2JqPiBleHRlbmRzIENSZXN1bHQ8VCwgRXJyT2JqPiBpbXBsZW1lbnRzIElSZXN1bHQ8VCwgRXJyT2JqPiB7XG4gIGNvbnN0cnVjdG9yKHZhbD86IFQpIHtcbiAgICBzdXBlcih2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBlc3NlbnRpYWxseSBzYW1lIHRvIHRoZSBPazo6YW5kX3RoZW4oKSBpbiBSdXN0IGxhbmd1YWdlXG4gICAqIEBwYXJhbSBmXG4gICAqL1xuICAvLyB0aGVuKGY6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IEZpbmFsaXplciB7XG4gIC8vICAgZih0aGlzLnZhbCBhcyBUKTtcbiAgLy8gICByZXR1cm4gbmV3IEZpbmFsaXplcigpO1xuICAvLyB9XG5cbiAgdW53cmFwV2l0aENvbXBlbnNhdGlvbihjYXRjaEZuOiAoZXJyOiBSbkVycm9yPEVyck9iaj4pID0+IFQpOiBUIHtcbiAgICByZXR1cm4gdGhpcy52YWwgYXMgVDtcbiAgfVxuXG4gIHVud3JhcEZvcmNlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLnZhbCBhcyBUO1xuICB9XG5cbiAgLy8gY2F0Y2goZjogKHZhbHVlOiBSbkVycm9yPEVyck9iaj4pID0+IHZvaWQpOiB2b2lkIHt9XG5cbiAgdHJ1ZSgpOiB0aGlzIGlzIE9rPFQsIEVyck9iaj4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgX2lzT2soKTogdGhpcyBpcyBPazxULCBFcnJPYmo+IHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIF9pc0VycigpOiB0aGlzIGlzIEVycjxULCBFcnJPYmo+IHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBpbm5lciB2YWx1ZSBzYWZlbHkuXG4gICAqIEByZXR1cm5zIHRoZSBpbm5lciB2YWx1ZVxuICAgKi9cbiAgZ2V0KCk6IFQge1xuICAgIHJldHVybiB0aGlzLnZhbCBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogYSBjbGFzcyBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc3VsdCBpcyBFcnJvciAoRmFpbGVkKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycjxULCBFcnJPYmo+IGV4dGVuZHMgQ1Jlc3VsdDxULCBFcnJPYmo+IGltcGxlbWVudHMgSVJlc3VsdDxULCBFcnJPYmo+IHtcbiAgcHVibGljIF9ybkV4Y2VwdGlvbjogUm5FeGNlcHRpb248RXJyT2JqPjtcblxuICBjb25zdHJ1Y3Rvcih2YWw6IFJuRXJyb3I8RXJyT2JqPikge1xuICAgIHN1cGVyKHZhbCk7XG4gICAgdGhpcy5fcm5FeGNlcHRpb24gPSBuZXcgUm5FeGNlcHRpb24odGhpcy52YWwgYXMgUm5FcnJvcjxFcnJPYmo+KTtcbiAgfVxuXG4gIHVud3JhcFdpdGhDb21wZW5zYXRpb24oY2F0Y2hGbjogKGVycjogUm5FcnJvcjxFcnJPYmo+KSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIGNhdGNoRm4odGhpcy52YWwgYXMgUm5FcnJvcjxFcnJPYmo+KTtcbiAgfVxuXG4gIHVud3JhcEZvcmNlKCk6IG5ldmVyIHtcbiAgICB0aHJvdyB0aGlzLl9ybkV4Y2VwdGlvbjtcbiAgfVxuXG4gIGZhbHNlKCk6IGZhbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfaXNPaygpOiB0aGlzIGlzIE9rPFQsIEVyck9iaj4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9pc0VycigpOiB0aGlzIGlzIEVycjxULCBFcnJPYmo+IHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIFJuRXJyb3Igb2JqZWN0LlxuICAgKiBAcmV0dXJucyB0aGUgUm5FcnJvciBvYmplY3RcbiAgICovXG4gIGdldFJuRXJyb3IoKTogUm5FcnJvcjxFcnJPYmo+IHtcbiAgICByZXR1cm4gdGhpcy52YWwgYXMgUm5FcnJvcjxFcnJPYmo+O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcm5FeGNlcHRpb24uc3RhY2shO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdDxULCBFcnJPYmo+ID0gT2s8VCwgRXJyT2JqPiB8IEVycjxULCBFcnJPYmo+O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNPazxULCBFcnJPYmo+KHJlc3VsdDogT2s8VCwgRXJyT2JqPiB8IEVycjxULCBFcnJPYmo+KTogcmVzdWx0IGlzIE9rPFQsIEVyck9iaj4ge1xuICByZXR1cm4gcmVzdWx0Ll9pc09rKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VycjxULCBFcnJPYmo+KHJlc3VsdDogT2s8VCwgRXJyT2JqPiB8IEVycjxULCBFcnJPYmo+KTogcmVzdWx0IGlzIEVycjxULCBFcnJPYmo+IHtcbiAgcmV0dXJuIHJlc3VsdC5faXNFcnIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElzT2socmVzdWx0OiBJUmVzdWx0PGFueSwgYW55Pik6IGFzc2VydHMgcmVzdWx0IGlzIE9rPGFueSwgYW55PiB7XG4gIGlmIChyZXN1bHQuX2lzRXJyKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgRXJyLiBObyBPay4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SXNFcnIocmVzdWx0OiBJUmVzdWx0PGFueSwgYW55Pik6IGFzc2VydHMgcmVzdWx0IGlzIEVycjxhbnksIGFueT4ge1xuICBpZiAocmVzdWx0Ll9pc09rKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgT2suIE5vIEVyci4nKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBFcnIsIFJuRXJyb3IgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCBjbGFzcyBSbkV4Y2VwdGlvbjxFcnJPYmo+IGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0aWMgcmVhZG9ubHkgX3ByZWZpeCA9ICdcXG5SaG9kb25pdGUgRXhjZXB0aW9uJztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlcnI6IFJuRXJyb3I8RXJyT2JqPikge1xuICAgIHN1cGVyKGBcbiAgbWVzc2FnZTogJHtlcnIubWVzc2FnZX1cbiAgZXJyb3I6ICR7XG4gICAgdHlwZW9mIChlcnIuZXJyb3IgYXMgRXJyPHVua25vd24sIEVyck9iaj4pLl9ybkV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgID8gJ3NlZSBiZWxvdyBFeGNlcHRpb24g4oaTJyArIChlcnIuZXJyb3IgYXMgRXJyPHVua25vd24sIEVyck9iaj4pLnRvU3RyaW5nKClcbiAgICAgIDogZXJyLmVycm9yXG4gIH1cbmApO1xuICAgIHRoaXMubmFtZSA9IFJuRXhjZXB0aW9uLl9wcmVmaXg7XG4gIH1cblxuICBnZXRSbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmVycjtcbiAgfVxufVxuIiwidHlwZSBQcm9taXNlRm48VD4gPSAoXG4gIHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZCxcbiAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG4pID0+IHZvaWQ7XG50eXBlIE9uRmluYWxseUZuID0gKCgpID0+IHZvaWQpIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgUm5Qcm9taXNlQ2FsbGJhY2tPYmogPSB7XG4gIHByb21pc2VBbGxOdW06IG51bWJlcjtcbiAgcmVzb2x2ZWROdW06IG51bWJlcjtcbiAgcmVqZWN0ZWROdW06IG51bWJlcjtcbiAgcGVuZGluZ051bTogbnVtYmVyO1xuICBwcm9jZXNzZWRQcm9taXNlczogYW55W107XG59O1xuZXhwb3J0IHR5cGUgUm5Qcm9taXNlQ2FsbGJhY2sgPSAob2JqOiBSblByb21pc2VDYWxsYmFja09iaikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIFJuUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICBwcml2YXRlIF9fcHJvbWlzZTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJpdmF0ZSBfX2NhbGxiYWNrPzogRnVuY3Rpb247XG4gIHB1YmxpYyBuYW1lID0gJyc7XG4gIHByaXZhdGUgX19jYWxsYmFja09iajogUm5Qcm9taXNlQ2FsbGJhY2tPYmogPSB7XG4gICAgcHJvbWlzZUFsbE51bTogMCxcbiAgICByZXNvbHZlZE51bTogMCxcbiAgICByZWplY3RlZE51bTogMCxcbiAgICBwZW5kaW5nTnVtOiAwLFxuICAgIHByb2Nlc3NlZFByb21pc2VzOiBbXSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9taXNlOiBQcm9taXNlPFQ+KTtcbiAgY29uc3RydWN0b3IoZm46IFByb21pc2VGbjxUPik7XG4gIGNvbnN0cnVjdG9yKGFyZzogUHJvbWlzZTxUPiB8IFByb21pc2VGbjxUPikge1xuICAgIHN1cGVyKChyZXNvbHZlLCByZWplY3QpID0+IHt9KTtcbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgdGhpcy5fX3Byb21pc2UgPSBhcmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19wcm9taXNlID0gbmV3IFByb21pc2UoYXJnKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcmVzb2x2ZTxUPigpOiBQcm9taXNlPFQ+O1xuICBzdGF0aWMgcmVzb2x2ZTxUPihhcmc6IFQgfCBQcm9taXNlTGlrZTxUPik6IFByb21pc2U8VD47XG4gIHN0YXRpYyByZXNvbHZlPFQ+KGFyZz86IFQgfCBQcm9taXNlTGlrZTxUPikge1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gbmV3IFJuUHJvbWlzZShhcmcpIGFzIHVua25vd24gYXMgUHJvbWlzZTxUPjtcbiAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJuUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGFyZyBhcyB1bmtub3duIGFzIFByb21pc2U8VD47XG4gICAgfSBlbHNlIGlmICgoYXJnIGFzIGFueSkudGhlbiAhPSBudWxsKSB7XG4gICAgICBjb25zdCByblByb21pc2UgPSBuZXcgUm5Qcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVzb2x2ZShhcmcpO1xuICAgICAgfSk7XG4gICAgICByblByb21pc2UudGhlbiA9IChhcmcgYXMgYW55KS50aGVuO1xuICAgICAgcmV0dXJuIHJuUHJvbWlzZSBhcyB1bmtub3duIGFzIFByb21pc2U8VD47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUm5Qcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVzb2x2ZShhcmcpO1xuICAgICAgfSkgYXMgdW5rbm93biBhcyBQcm9taXNlPFQ+O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhbGwocHJvbWlzZXM6IGFueVtdLCBjYWxsYmFjaz86IFJuUHJvbWlzZUNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCByblByb21pc2VzID0gW107XG4gICAgICBjb25zdCBjYWxsYmFja09iajogUm5Qcm9taXNlQ2FsbGJhY2tPYmogPSB7XG4gICAgICAgIHByb21pc2VBbGxOdW06IHByb21pc2VzLmxlbmd0aCxcbiAgICAgICAgcmVzb2x2ZWROdW06IDAsXG4gICAgICAgIHJlamVjdGVkTnVtOiAwLFxuICAgICAgICBwZW5kaW5nTnVtOiBwcm9taXNlcy5sZW5ndGgsXG4gICAgICAgIHByb2Nlc3NlZFByb21pc2VzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiBwcm9taXNlcykge1xuICAgICAgICBjb25zdCByblByb21pc2UgPSBSblByb21pc2UucmVzb2x2ZShwcm9taXNlKSBhcyB1bmtub3duIGFzIFJuUHJvbWlzZTxhbnk+O1xuICAgICAgICByblByb21pc2UuX19jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByblByb21pc2UuX19jYWxsYmFja09iaiA9IGNhbGxiYWNrT2JqO1xuICAgICAgICByblByb21pc2VzLnB1c2gocm5Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUm5Qcm9taXNlKFByb21pc2UuYWxsKHJuUHJvbWlzZXMgYXMgYW55KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUm5Qcm9taXNlKFByb21pc2UuYWxsKHByb21pc2VzKSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHJhY2UoYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gbmV3IFJuUHJvbWlzZShQcm9taXNlLnJhY2UoYXJncykpO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApOiBSblByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIGxldCBvbkZ1bGZpbGxlZFdyYXBwZXI7XG4gICAgaWYgKG9uZnVsZmlsbGVkKSB7XG4gICAgICBvbkZ1bGZpbGxlZFdyYXBwZXIgPSAodmFsdWU6IFQgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX19jYWxsYmFja09iai5wcm9taXNlQWxsTnVtICE9PSAwICYmXG4gICAgICAgICAgdGhpcy5fX2NhbGxiYWNrT2JqLnByb2Nlc3NlZFByb21pc2VzLmluZGV4T2YodGhpcykgPT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX19jYWxsYmFja09iai5wZW5kaW5nTnVtLS07XG4gICAgICAgICAgdGhpcy5fX2NhbGxiYWNrT2JqLnJlc29sdmVkTnVtKys7XG4gICAgICAgICAgdGhpcy5fX2NhbGxiYWNrT2JqLnByb2Nlc3NlZFByb21pc2VzLnB1c2godGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX19jYWxsYmFjaykge1xuICAgICAgICAgIHRoaXMuX19jYWxsYmFjayh0aGlzLl9fY2FsbGJhY2tPYmopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZCh2YWx1ZSEpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19wcm9taXNlLnRoZW4ob25GdWxmaWxsZWRXcmFwcGVyLCBvbnJlamVjdGVkKSBhcyBSblByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj47XG4gIH1cblxuICBjYXRjaChvblJlamVjdGVkPzogYW55KTogUm5Qcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IFJuUHJvbWlzZSh0aGlzLl9fcHJvbWlzZS5jYXRjaChvblJlamVjdGVkKSkgYXMgUm5Qcm9taXNlPFQ+O1xuICB9XG5cbiAgZmluYWxseShvbkZpbmFsbHk/OiBPbkZpbmFsbHlGbikge1xuICAgIHJldHVybiB0aGlzLl9fcHJvbWlzZS5maW5hbGx5KG9uRmluYWxseSkgYXMgdW5rbm93biBhcyBQcm9taXNlPFQ+O1xuICB9XG5cbiAgc3RhdGljIHJlamVjdChlOiBFcnJvcikge1xuICAgIHJldHVybiBuZXcgUm5Qcm9taXNlKFByb21pc2UucmVqZWN0KGUpKTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFRpbWUge1xuICBwcml2YXRlIHN0YXRpYyBfX2N1cnJlbnRQcm9jZXNzQmVnaW5UaW1lID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX19sYXN0UHJvY2Vzc0VuZFRpbWUgPSAwO1xuICBwcml2YXRlIHN0YXRpYyBfX2xhc3RUaWNrVGltZUludGVydmFsID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX19zeXN0ZW1TdGFydFRpbWUgPSAwO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBfcHJvY2Vzc0JlZ2luKCkge1xuICAgIFRpbWUuX19jdXJyZW50UHJvY2Vzc0JlZ2luVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGlmIChUaW1lLl9fc3lzdGVtU3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBUaW1lLl9fc3lzdGVtU3RhcnRUaW1lID0gVGltZS5fX2N1cnJlbnRQcm9jZXNzQmVnaW5UaW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBfcHJvY2Vzc0VuZCgpIHtcbiAgICBUaW1lLl9fbGFzdFByb2Nlc3NFbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgVGltZS5fX2xhc3RUaWNrVGltZUludGVydmFsID0gVGltZS5fX2xhc3RQcm9jZXNzRW5kVGltZSAtIFRpbWUuX19jdXJyZW50UHJvY2Vzc0JlZ2luVGltZTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgdGltZUF0UHJvY2Vzc0JlZ2luTWlsbGlzZWNvbmRzKCkge1xuICAgIHJldHVybiBUaW1lLl9fY3VycmVudFByb2Nlc3NCZWdpblRpbWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHRpbWVBdFByb2Nlc3NFbmRNaWxsaXNlY29uZHMoKSB7XG4gICAgcmV0dXJuIFRpbWUuX19sYXN0UHJvY2Vzc0VuZFRpbWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHRpbWVGcm9tU3lzdGVtU3RhcnQoKSB7XG4gICAgcmV0dXJuIChwZXJmb3JtYW5jZS5ub3coKSAtIFRpbWUuX19zeXN0ZW1TdGFydFRpbWUpIC8gMTAwMDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgbGFzdFRpY2tUaW1lSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIFRpbWUuX19sYXN0VGlja1RpbWVJbnRlcnZhbCAvIDEwMDA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGxhc3RUaW1lVGltZUludGVydmFsSW5NaWxsaXNlY29uZHMoKSB7XG4gICAgcmV0dXJuIFRpbWUuX19sYXN0VGlja1RpbWVJbnRlcnZhbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSXMgfSBmcm9tICcuL0lzJztcbi8vIEluc3BpcmVkIGZyb20gaHR0cHM6Ly9zY2xlYXB0LmNvbS90eXBlc2NyaXB0X29wdGlvbi9cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIHZhbHVlcyB3aG9zZSBleGlzdGVuY2UgaXMgdW5jZXJ0YWluLlxuICovXG5cbmNvbnN0IGVycm9yU3RyID0gJ1RoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCEnO1xuZXhwb3J0IGludGVyZmFjZSBJV2Vha09wdGlvbjxCIGV4dGVuZHMgb2JqZWN0LCBUPiB7XG4gIHVud3JhcE9yRGVmYXVsdChiYXNlOiBCLCBhbHRWYWx1ZTogVCk6IFQ7XG4gIHVud3JhcE9yRWxzZShiYXNlOiBCLCBmOiAoLi4udmFsczogYW55KSA9PiBUKTogVDtcbiAgdW53cmFwRm9yY2UoYmFzZTogQik6IFQ7XG4gIHVud3JhcE9yVW5kZWZpbmVkKGJhc2U6IEIpOiBUIHwgdW5kZWZpbmVkO1xuICBoYXMoYmFzZTogQik6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBXZWFrT3B0aW9uPEIgZXh0ZW5kcyBvYmplY3QsIFQ+IGltcGxlbWVudHMgSVdlYWtPcHRpb248QiwgVD4ge1xuICBwcml2YXRlIF9fd2Vha01hcDogV2Vha01hcDxCLCBUPiA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgc2V0KGJhc2U6IEIsIHZhbDogVCkge1xuICAgIHRoaXMuX193ZWFrTWFwLnNldChiYXNlLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhbHRWYWx1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdW53cmFwT3JEZWZhdWx0KGJhc2U6IEIsIGFsdFZhbHVlOiBUKTogVCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9fd2Vha01hcC5nZXQoYmFzZSk7XG4gICAgcmV0dXJuIElzLmV4aXN0KHZhbHVlKSA/IHZhbHVlIDogYWx0VmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGFsdFZhbHVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1bndyYXBPckVsc2UoYmFzZTogQiwgZjogKC4uLnZhbHM6IGFueSkgPT4gVCk6IFQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fX3dlYWtNYXAuZ2V0KGJhc2UpO1xuICAgIHJldHVybiBJcy5leGlzdCh2YWx1ZSkgPyB2YWx1ZSA6IGYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdW53cmFwRm9yY2UoYmFzZTogQik6IFQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fX3dlYWtNYXAuZ2V0KGJhc2UpO1xuICAgIGlmIChJcy5leGlzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yU3RyKTtcbiAgICB9XG4gIH1cblxuICB1bndyYXBPclVuZGVmaW5lZChiYXNlOiBCKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWFrTWFwLmdldChiYXNlKTtcbiAgfVxuXG4gIGhhcyhiYXNlOiBCKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWFrTWFwLmhhcyhiYXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIGEgY2xhc3MgaW5kaWNhdGluZyB0aGF0IHRoZSBpbmNsdWRlZCB2YWx1ZSBleGlzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWFrU29tZTxCIGV4dGVuZHMgb2JqZWN0LCBUPiBpbXBsZW1lbnRzIElXZWFrT3B0aW9uPEIsIFQ+IHtcbiAgcHJpdmF0ZSBfX3dlYWtNYXA6IFdlYWtNYXA8QiwgVD4gPSBuZXcgV2Vha01hcCgpO1xuICBjb25zdHJ1Y3RvcihiYXNlOiBCLCB2YWx1ZTogVCkge1xuICAgIHRoaXMuX193ZWFrTWFwLnNldChiYXNlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGFsdFZhbHVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1bndyYXBPckRlZmF1bHQoYmFzZTogQiwgYWx0VmFsdWU6IFQpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fX3dlYWtNYXAuZ2V0KGJhc2UpITtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWx0VmFsdWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHVud3JhcE9yRWxzZShiYXNlOiBCLCBmOiAodmFsdWU6IFQpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fX3dlYWtNYXAuZ2V0KGJhc2UpITtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWx0VmFsdWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHVud3JhcEZvcmNlKGJhc2U6IEIpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fX3dlYWtNYXAuZ2V0KGJhc2UpITtcbiAgfVxuXG4gIGdldChiYXNlOiBCKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWFrTWFwLmdldChiYXNlKSE7XG4gIH1cblxuICB1bndyYXBPclVuZGVmaW5lZChiYXNlOiBCKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWFrTWFwLmdldChiYXNlKTtcbiAgfVxuXG4gIGhhcyhiYXNlOiBCKTogdHJ1ZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBhIGNsYXNzIGluZGljYXRpbmcgbm8gZXhpc3RlbmNlLlxuICovXG5leHBvcnQgY2xhc3MgV2Vha05vbmU8QiBleHRlbmRzIG9iamVjdD4gaW1wbGVtZW50cyBJV2Vha09wdGlvbjxCLCBuZXZlcj4ge1xuICB0aGVuKCk6IFdlYWtOb25lPEI+IHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVud3JhcE9yRGVmYXVsdDxUPihiYXNlOiBCLCB2YWx1ZTogVCk6IFQge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHVud3JhcE9yRWxzZShiYXNlOiBCLCBmOiAoLi4udmFsczogYW55KSA9PiBuZXZlcik6IG5ldmVyIHtcbiAgICByZXR1cm4gZih1bmRlZmluZWQgYXMgbmV2ZXIpO1xuICB9XG5cbiAgdW53cmFwRm9yY2UoYmFzZTogQik6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3JTdHIpO1xuICB9XG5cbiAgdW53cmFwT3JVbmRlZmluZWQoYmFzZTogQik6IG5ldmVyIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIG5ldmVyO1xuICB9XG5cbiAgaGFzKCk6IGZhbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN5bWJvbFdlYWtNYXAgfSBmcm9tICcuL1N5bWJvbFdlYWtNYXAnO1xuXG5leHBvcnQgY2xhc3MgQ2FjaGU8VD4ge1xuICBwcml2YXRlIF9fc3ltYm9sV2Vha01hcCA9IG5ldyBTeW1ib2xXZWFrTWFwKCk7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIHJlZ2lzdGVyKHZhbHVlOiBUKSB7XG4gICAgdGhpcy5fX3N5bWJvbFdlYWtNYXAuc2V0KFN5bWJvbCgpLCB2YWx1ZSk7XG4gIH1cblxuICAvLyBwdWJsaWMgcmVhZCgpOiBUIHt9XG59XG4iLCJpbXBvcnQgeyBJcyB9IGZyb20gJy4uL0lzJztcblxuZXhwb3J0IGNsYXNzIFN5bWJvbFdlYWtNYXA8Vj4ge1xuICBwcml2YXRlIF9fd2Vha01hcDogV2Vha01hcDxTeW1ib2wsIFY+ID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBzZXQga2V5IGFuZCB2YWx1ZVxuICAgKiBAcGFyYW0gc3ltYm9sIHRoZSBrZXkgZm9yIGFjY2Vzc1xuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGEgY2FjaGUgaXRlbVxuICAgKiBAcmV0dXJucyB0cnVlOiBzdWNjZWVkIHRvIHNldCB2YWx1ZSwgZmFsc2U6IG5vdCBzZXQgKGFscmVhZHkgZXhpc3RzKVxuICAgKi9cbiAgcHVibGljIHNldChzeW1ib2w6IFN5bWJvbCwgdmFsdWU6IFYpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0V4aXN0ID0gdGhpcy5fX3dlYWtNYXAuaGFzKHN5bWJvbCk7XG4gICAgaWYgKGlzRXhpc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3dlYWtNYXAuc2V0KHN5bWJvbCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGV0aGVyIGl0IGhhdmUgdGhlIGtleSBvciBub3RcbiAgICogQHBhcmFtIHN5bWJvbCB0aGUga2V5IGZvciBhY2Nlc3NcbiAgICogQHJldHVybnMgV2hldGhlciBpdCBoYXZlIHRoZSBrZXkgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGhhcyhzeW1ib2w6IFN5bWJvbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzRXhpc3QgPSB0aGlzLl9fd2Vha01hcC5oYXMoc3ltYm9sKTtcbiAgICBpZiAoaXNFeGlzdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhpcyBjYWNoZSBpdGVtc1xuICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoaXMgY2FjaGUgaXRlbXNcbiAgICovXG4gIC8vIHB1YmxpYyBzaXplKCk6IG51bWJlciB7XG4gIC8vICAgcmV0dXJuIHRoaXMuX193ZWFrTWFwLnNpemU7XG4gIC8vIH1cblxuICAvKipcbiAgICogcmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgY2FjaGUgYnkgdGhlIGtleVxuICAgKiBAcGFyYW0gc3ltYm9sIHRoZSBrZXkgZm9yIGFjY2Vzc1xuICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGNhY2hlIGJ5IHRoZSBrZXlcbiAgICovXG4gIHB1YmxpYyBnZXQoc3ltYm9sOiBTeW1ib2wpOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXlPYmogPSB0aGlzLl9fd2Vha01hcC5nZXQoc3ltYm9sKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KGtleU9iaikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHRoaXMuX193ZWFrTWFwLmdldChzeW1ib2wpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogZGVsZXRlIHRoZSB2YWx1ZVxuICAgKiBAcGFyYW0gc3ltYm9sIHRoZSBrZXkgZm9yIGFjY2Vzc1xuICAgKiBAcmV0dXJucyB0aGUgZmxhZyBvZiB0aGUgZGVsZXRpb24gd2FzIHN1Y2NlZWQgb3Igbm90XG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKHN5bWJvbDogU3ltYm9sKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNFeGlzdCA9IHRoaXMuX193ZWFrTWFwLmhhcyhzeW1ib2wpO1xuICAgIGlmICghaXNFeGlzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9fd2Vha01hcC5kZWxldGUoc3ltYm9sKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiLyoqXG4gKiBUaGlzIGlzIGZyb20gOiBodHRwczovL2dpdGh1Yi5jb20vdGhyZWVwb2ludG9uZS9nbGFtb3IvYmxvYi82NjdiNDgwZDMxYjM3MjFhOTA1MDIxYjI2ZTEyOTBjZTkyY2EyODc5L2RvY3Mvd2Vha21hcHMubWQjc28td2hhdC1kb2VzLWEtY2FjaGUtYnVpbHQtd2l0aC1hLXdlYWttYXAtbG9vay1saWtlXG4gKiBUaGFuayB5b3UhXG4gKi9cblxuaW1wb3J0IHsgcHJpbWl0aXZlcyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcblxudHlwZSBPYmplY3RGblR5cGUgPSAoYXJnOiBvYmplY3QpID0+IHVua25vd247XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjYWNoaW5nIHdyYXBwZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBmbiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGZvciBjYWNoaW5nIHJlc3VsdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IG9iamVjdENhY2hpZnkgPSAoZm46IE9iamVjdEZuVHlwZSk6IE9iamVjdEZuVHlwZSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIChhcmc6IG9iamVjdCk6IHVua25vd24gPT4ge1xuICAgIGlmIChjYWNoZS5oYXMoYXJnKSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChhcmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gZm4oYXJnKTtcbiAgICBjYWNoZS5zZXQoYXJnLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGNhY2hpbmcgd3JhcHBlciBmdW5jdGlvblxuICogQHBhcmFtIGZuIHRoZSB0YXJnZXQgZnVuY3Rpb24gZm9yIGNhY2hpbmcgcmVzdWx0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgcHJpbWl0aXZlQ2FjaGlmeTEgPSA8UCBleHRlbmRzIHByaW1pdGl2ZXM+KFxuICBmbjogKGFyZzogUCkgPT4gdW5rbm93blxuKTogKChhcmc6IFApID0+IHVua25vd24pID0+IHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIHJldHVybiAoYXJnOiBQKTogdW5rbm93biA9PiB7XG4gICAgaWYgKGNhY2hlLmhhcyhhcmcpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGFyZyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBmbihhcmcpO1xuICAgIGNhY2hlLnNldChhcmcsIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hpZnknO1xuZXhwb3J0ICogZnJvbSAnLi9TeW1ib2xXZWFrTWFwJztcbiIsImV4cG9ydCAqIGZyb20gJy4vY2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9EYXRhVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL0VudW1JTyc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL0lzJztcbmV4cG9ydCAqIGZyb20gJy4vTWlzY1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9PcHRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9SZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9SblByb21pc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9SbkV4Y2VwdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1RpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi9XZWFrT3B0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vTG9nZ2VyJztcbiIsImltcG9ydCB7IElTY2VuZUdyYXBoRW50aXR5IH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBJUXVhdGVybmlvbiwgSVZlY3RvcjMsIE1hdGhVdGlsLCBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vbWF0aCc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBQaHlzaWNzUHJvcGVydHlJbm5lciB9IGZyb20gJy4uL1BoeXNpY3NQcm9wZXJ0eSc7XG5pbXBvcnQgeyBQaHlzaWNzU3RyYXRlZ3kgfSBmcm9tICcuLi9QaHlzaWNzU3RyYXRlZ3knO1xuaW1wb3J0IHsgUGh5c2ljc1dvcmxkUHJvcGVydHkgfSBmcm9tICcuLi9QaHlzaWNzV29ybGRQcm9wZXJ0eSc7XG5cbmRlY2xhcmUgY29uc3QgT0lNTzogYW55O1xuXG5leHBvcnQgY2xhc3MgT2ltb1BoeXNpY3NTdHJhdGVneSBpbXBsZW1lbnRzIFBoeXNpY3NTdHJhdGVneSB7XG4gIHN0YXRpYyBfX3dvcmxkUHJvcGVydHk6IFBoeXNpY3NXb3JsZFByb3BlcnR5ID0ge1xuICAgIGdyYXZpdHk6IFZlY3RvcjMuZnJvbUNvcHkzKDAsIC05LjgsIDApLFxuICAgIHJhbmRvbTogdHJ1ZSxcbiAgfTtcbiAgc3RhdGljIF9fd29ybGQ6IGFueTtcbiAgcHJpdmF0ZSBfX2JvZHk6IGFueTtcbiAgcHJpdmF0ZSBfX2VudGl0eT86IElTY2VuZUdyYXBoRW50aXR5O1xuICBwcml2YXRlIF9fcHJvcGVydHk6IGFueTtcbiAgcHJpdmF0ZSBfX2xvY2FsU2NhbGU6IElWZWN0b3IzID0gVmVjdG9yMy5vbmUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoSXMubm90LmV4aXN0KE9pbW9QaHlzaWNzU3RyYXRlZ3kuX193b3JsZCkpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gbmV3IE9JTU8uV29ybGQoe1xuICAgICAgICB0aW1lc3RlcDogMSAvIDYwLFxuICAgICAgICBpdGVyYXRpb25zOiA4LFxuICAgICAgICBicm9hZHBoYXNlOiAyLFxuICAgICAgICB3b3JsZHNjYWxlOiAxLFxuICAgICAgICByYW5kb206IE9pbW9QaHlzaWNzU3RyYXRlZ3kuX193b3JsZFByb3BlcnR5LnJhbmRvbSxcbiAgICAgICAgaW5mbzogZmFsc2UsXG4gICAgICAgIGdyYXZpdHk6IFtcbiAgICAgICAgICBPaW1vUGh5c2ljc1N0cmF0ZWd5Ll9fd29ybGRQcm9wZXJ0eS5ncmF2aXR5LngsXG4gICAgICAgICAgT2ltb1BoeXNpY3NTdHJhdGVneS5fX3dvcmxkUHJvcGVydHkuZ3Jhdml0eS55LFxuICAgICAgICAgIE9pbW9QaHlzaWNzU3RyYXRlZ3kuX193b3JsZFByb3BlcnR5LmdyYXZpdHkueixcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgT2ltb1BoeXNpY3NTdHJhdGVneS5fX3dvcmxkID0gd29ybGQ7XG4gICAgfVxuICB9XG5cbiAgc2V0U2hhcGUocHJvcDogUGh5c2ljc1Byb3BlcnR5SW5uZXIsIGVudGl0eTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBjb25zdCB3b3JsZCA9IE9pbW9QaHlzaWNzU3RyYXRlZ3kuX193b3JsZDtcbiAgICB0aGlzLl9fbG9jYWxTY2FsZSA9IHByb3Auc2l6ZTtcbiAgICB0aGlzLl9fcHJvcGVydHkgPSB7XG4gICAgICB0eXBlOiBwcm9wLnR5cGUuc3RyLnRvTG93ZXJDYXNlKCksXG4gICAgICBzaXplOiBbcHJvcC5zaXplLngsIHByb3Auc2l6ZS55LCBwcm9wLnNpemUuel0sXG4gICAgICBwb3M6IFtwcm9wLnBvc2l0aW9uLngsIHByb3AucG9zaXRpb24ueSwgcHJvcC5wb3NpdGlvbi56XSxcbiAgICAgIHJvdDogW3Byb3Aucm90YXRpb24ueCwgcHJvcC5yb3RhdGlvbi55LCBwcm9wLnJvdGF0aW9uLnpdLFxuICAgICAgbW92ZTogcHJvcC5tb3ZlLFxuICAgICAgZGVuc2l0eTogcHJvcC5kZW5zaXR5LFxuICAgICAgZnJpY3Rpb246IHByb3AuZnJpY3Rpb24sXG4gICAgICByZXN0aXR1dGlvbjogcHJvcC5yZXN0aXR1dGlvbixcbiAgICB9O1xuICAgIHRoaXMuX19ib2R5ID0gd29ybGQuYWRkKHRoaXMuX19wcm9wZXJ0eSk7XG4gICAgdGhpcy5fX2VudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fX2VudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBvcyA9IHRoaXMuX19ib2R5LmdldFBvc2l0aW9uKCk7XG4gICAgY29uc3Qgcm90ID0gdGhpcy5fX2JvZHkuZ2V0UXVhdGVybmlvbigpO1xuICAgIHRoaXMuX19lbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLnNldFBvc2l0aW9uV2l0aG91dFBoeXNpY3MoVmVjdG9yMy5mcm9tQ29weTMocG9zLngsIHBvcy55LCBwb3MueikpO1xuICAgIHRoaXMuX19lbnRpdHlcbiAgICAgIC5nZXRTY2VuZUdyYXBoKClcbiAgICAgIC5zZXRSb3RhdGlvbldpdGhvdXRQaHlzaWNzKFF1YXRlcm5pb24uZnJvbUNvcHk0KHJvdC54LCByb3QueSwgcm90LnosIHJvdC53KSk7XG4gIH1cblxuICBzZXRQb3NpdGlvbih3b3JsZFBvc2l0aW9uOiBJVmVjdG9yMyk6IHZvaWQge1xuICAgIGNvbnN0IHdvcmxkID0gT2ltb1BoeXNpY3NTdHJhdGVneS5fX3dvcmxkO1xuICAgIGlmICh0aGlzLl9fZW50aXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fX2JvZHkucmVtb3ZlKCk7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuX19wcm9wZXJ0eTtcbiAgICB0aGlzLl9fcHJvcGVydHkgPSB7XG4gICAgICB0eXBlOiBwcm9wLnR5cGUsXG4gICAgICBzaXplOiBbcHJvcC5zaXplWzBdLCBwcm9wLnNpemVbMV0sIHByb3Auc2l6ZVsyXV0sXG4gICAgICBwb3M6IFt3b3JsZFBvc2l0aW9uLngsIHdvcmxkUG9zaXRpb24ueSwgd29ybGRQb3NpdGlvbi56XSxcbiAgICAgIHJvdDogW3RoaXMuX19lbnRpdHkuZXVsZXJBbmdsZXMueCwgdGhpcy5fX2VudGl0eS5ldWxlckFuZ2xlcy55LCB0aGlzLl9fZW50aXR5LmV1bGVyQW5nbGVzLnpdLFxuICAgICAgbW92ZTogcHJvcC5tb3ZlLFxuICAgICAgZGVuc2l0eTogcHJvcC5kZW5zaXR5LFxuICAgICAgZnJpY3Rpb246IHByb3AuZnJpY3Rpb24sXG4gICAgICByZXN0aXR1dGlvbjogcHJvcC5yZXN0aXR1dGlvbixcbiAgICB9O1xuICAgIHRoaXMuX19ib2R5ID0gd29ybGQuYWRkKHRoaXMuX19wcm9wZXJ0eSk7XG4gIH1cblxuICBzZXRFdWxlckFuZ2xlKGV1bGVyQW5nbGVzOiBJVmVjdG9yMyk6IHZvaWQge1xuICAgIGNvbnN0IHdvcmxkID0gT2ltb1BoeXNpY3NTdHJhdGVneS5fX3dvcmxkO1xuICAgIGlmICh0aGlzLl9fZW50aXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcG9zID0gdGhpcy5fX2JvZHkuZ2V0UG9zaXRpb24oKTtcbiAgICB0aGlzLl9fYm9keS5yZW1vdmUoKTtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5fX3Byb3BlcnR5O1xuICAgIHRoaXMuX19wcm9wZXJ0eSA9IHtcbiAgICAgIHR5cGU6IHByb3AudHlwZSxcbiAgICAgIHNpemU6IFtwcm9wLnNpemVbMF0sIHByb3Auc2l6ZVsxXSwgcHJvcC5zaXplWzJdXSxcbiAgICAgIHBvczogW3Bvcy54LCBwb3MueSwgcG9zLnpdLFxuICAgICAgcm90OiBbXG4gICAgICAgIE1hdGhVdGlsLnJhZGlhblRvRGVncmVlKGV1bGVyQW5nbGVzLngpLFxuICAgICAgICBNYXRoVXRpbC5yYWRpYW5Ub0RlZ3JlZShldWxlckFuZ2xlcy55KSxcbiAgICAgICAgTWF0aFV0aWwucmFkaWFuVG9EZWdyZWUoZXVsZXJBbmdsZXMueiksXG4gICAgICBdLFxuICAgICAgbW92ZTogcHJvcC5tb3ZlLFxuICAgICAgZGVuc2l0eTogcHJvcC5kZW5zaXR5LFxuICAgICAgZnJpY3Rpb246IHByb3AuZnJpY3Rpb24sXG4gICAgICByZXN0aXR1dGlvbjogcHJvcC5yZXN0aXR1dGlvbixcbiAgICB9O1xuICAgIHRoaXMuX19ib2R5ID0gd29ybGQuYWRkKHRoaXMuX19wcm9wZXJ0eSk7XG4gIH1cblxuICBzZXRTY2FsZShzY2FsZTogSVZlY3RvcjMpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JsZCA9IE9pbW9QaHlzaWNzU3RyYXRlZ3kuX193b3JsZDtcbiAgICBpZiAodGhpcy5fX2VudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBvcyA9IHRoaXMuX19ib2R5LmdldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5fX2JvZHkucmVtb3ZlKCk7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuX19wcm9wZXJ0eTtcbiAgICB0aGlzLl9fcHJvcGVydHkgPSB7XG4gICAgICB0eXBlOiBwcm9wLnR5cGUsXG4gICAgICBzaXplOiBbXG4gICAgICAgIHRoaXMuX19sb2NhbFNjYWxlLnggKiBzY2FsZS54LFxuICAgICAgICB0aGlzLl9fbG9jYWxTY2FsZS55ICogc2NhbGUueSxcbiAgICAgICAgdGhpcy5fX2xvY2FsU2NhbGUueiAqIHNjYWxlLnosXG4gICAgICBdLFxuICAgICAgcG9zOiBbcG9zLngsIHBvcy55LCBwb3Muel0sXG4gICAgICByb3Q6IFt0aGlzLl9fZW50aXR5LmV1bGVyQW5nbGVzLngsIHRoaXMuX19lbnRpdHkuZXVsZXJBbmdsZXMueSwgdGhpcy5fX2VudGl0eS5ldWxlckFuZ2xlcy56XSxcbiAgICAgIG1vdmU6IHByb3AubW92ZSxcbiAgICAgIGRlbnNpdHk6IHByb3AuZGVuc2l0eSxcbiAgICAgIGZyaWN0aW9uOiBwcm9wLmZyaWN0aW9uLFxuICAgICAgcmVzdGl0dXRpb246IHByb3AucmVzdGl0dXRpb24sXG4gICAgfTtcbiAgICB0aGlzLl9fYm9keSA9IHdvcmxkLmFkZCh0aGlzLl9fcHJvcGVydHkpO1xuICB9XG5cbiAgc3RhdGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoSXMuZXhpc3QoT2ltb1BoeXNpY3NTdHJhdGVneS5fX3dvcmxkKSkge1xuICAgICAgT2ltb1BoeXNpY3NTdHJhdGVneS5fX3dvcmxkLnN0ZXAoKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vT2ltb1BoeXNpY3NTdHJhdGVneSc7XG4iLCJpbXBvcnQgeyBQaHlzaWNzU2hhcGVUeXBlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1BoeXNpY3NTaGFwZVR5cGUnO1xuaW1wb3J0IHsgSVZlY3RvcjMgfSBmcm9tICcuLi9tYXRoJztcblxuZXhwb3J0IHR5cGUgUGh5c2ljc1Byb3BlcnR5SW5uZXIgPSB7XG4gIHR5cGU6IFBoeXNpY3NTaGFwZVR5cGVFbnVtO1xuICBzaXplOiBJVmVjdG9yMztcbiAgcG9zaXRpb246IElWZWN0b3IzO1xuICByb3RhdGlvbjogSVZlY3RvcjM7XG4gIG1vdmU6IGJvb2xlYW47XG4gIGRlbnNpdHk6IG51bWJlcjtcbiAgZnJpY3Rpb246IG51bWJlcjtcbiAgcmVzdGl0dXRpb246IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFBoeXNpY3NQcm9wZXJ0eSA9IHtcbiAgdXNlOiBib29sZWFuO1xuICBtb3ZlOiBib29sZWFuO1xuICBkZW5zaXR5OiBudW1iZXI7XG4gIGZyaWN0aW9uOiBudW1iZXI7XG4gIHJlc3RpdHV0aW9uOiBudW1iZXI7XG59O1xuIiwiZXhwb3J0IGludGVyZmFjZSBQaHlzaWNzU3RyYXRlZ3kge1xuICB1cGRhdGUoKTogdm9pZDtcbn1cbiIsImltcG9ydCB7IElWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aCc7XG5cbmV4cG9ydCB0eXBlIFBoeXNpY3NXb3JsZFByb3BlcnR5ID0ge1xuICBncmF2aXR5OiBJVmVjdG9yMztcbiAgcmFuZG9tOiBib29sZWFuO1xufTtcbiIsImltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1NjZW5lR3JhcGgvU2NlbmVHcmFwaENvbXBvbmVudCc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcblxuZXhwb3J0IGNsYXNzIENhcHN1bGVDb2xsaWRlciB7XG4gIHB1YmxpYyBwb3NpdGlvbiA9IFZlY3RvcjMuemVybygpO1xuICBwdWJsaWMgcmFkaXVzID0gMDtcbiAgcHVibGljIHRhaWwgPSBWZWN0b3IzLnplcm8oKTtcbiAgYmFzZVNjZW5lR3JhcGg/OiBTY2VuZUdyYXBoQ29tcG9uZW50O1xuXG4gIGNvbGxpc2lvbihib25lUG9zaXRpb246IFZlY3RvcjMsIGJvbmVSYWRpdXM6IG51bWJlcikge1xuICAgIGNvbnN0IHNwaGVyZVBvc1dvcmxkID0gdGhpcy5iYXNlU2NlbmVHcmFwaCEuZ2V0V29ybGRQb3NpdGlvbk9mKHRoaXMucG9zaXRpb24pO1xuICAgIGxldCB0YWlsUG9zV29ybGQgPSB0aGlzLmJhc2VTY2VuZUdyYXBoIS5nZXRXb3JsZFBvc2l0aW9uT2YodGhpcy50YWlsKTtcbiAgICB0YWlsUG9zV29ybGQgPSBWZWN0b3IzLnN1YnRyYWN0KHRhaWxQb3NXb3JsZCwgc3BoZXJlUG9zV29ybGQpO1xuICAgIGNvbnN0IGxlbmd0aFNxQ2Fwc3VsZSA9IHRhaWxQb3NXb3JsZC5sZW5ndGhTcXVhcmVkKCk7XG4gICAgbGV0IGRpcmVjdGlvbiA9IFZlY3RvcjMuc3VidHJhY3QoYm9uZVBvc2l0aW9uLCBzcGhlcmVQb3NXb3JsZCk7XG4gICAgY29uc3QgZG90ID0gdGFpbFBvc1dvcmxkLmRvdChkaXJlY3Rpb24pO1xuXG4gICAgaWYgKGRvdCA8PSAwLjApIHtcbiAgICAgIC8vIGlmIGJvbmUgaXMgbmVhciBmcm9tIHRoZSBoZWFkXG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChsZW5ndGhTcUNhcHN1bGUgPD0gZG90KSB7XG4gICAgICAvLyBpZiBib25lIGlzIG5lYXIgZnJvbSB0aGUgdGFpbFxuICAgICAgZGlyZWN0aW9uID0gVmVjdG9yMy5zdWJ0cmFjdChkaXJlY3Rpb24sIHRhaWxQb3NXb3JsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIGJvbmUgaXMgYmV0d2VlbiB0d28gZW5kc1xuICAgICAgdGFpbFBvc1dvcmxkID0gVmVjdG9yMy5tdWx0aXBseSh0YWlsUG9zV29ybGQsIGRvdCAvIGxlbmd0aFNxQ2Fwc3VsZSk7XG4gICAgICBkaXJlY3Rpb24gPSBWZWN0b3IzLnN1YnRyYWN0KGRpcmVjdGlvbiwgdGFpbFBvc1dvcmxkKTtcbiAgICB9XG5cbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLnJhZGl1cyArIGJvbmVSYWRpdXM7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXJlY3Rpb24ubGVuZ3RoKCkgLSByYWRpdXM7XG4gICAgZGlyZWN0aW9uID0gVmVjdG9yMy5ub3JtYWxpemUoZGlyZWN0aW9uKTtcblxuICAgIHJldHVybiB7IGRpcmVjdGlvbiwgZGlzdGFuY2UgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50JztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcblxuZXhwb3J0IGNsYXNzIFNwaGVyZUNvbGxpZGVyIHtcbiAgcHVibGljIHBvc2l0aW9uID0gVmVjdG9yMy56ZXJvKCk7XG4gIHB1YmxpYyByYWRpdXMgPSAwO1xuICBiYXNlU2NlbmVHcmFwaD86IFNjZW5lR3JhcGhDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfdmVjM18wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF92ZWMzXzEgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3ZlYzNfMiA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBjb2xsaXNpb24oYm9uZVBvc2l0aW9uOiBWZWN0b3IzLCBib25lUmFkaXVzOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGhlcmVQb3NXb3JsZCA9IHRoaXMuYmFzZVNjZW5lR3JhcGghLmdldFdvcmxkUG9zaXRpb25PZlRvKFxuICAgICAgdGhpcy5wb3NpdGlvbixcbiAgICAgIFNwaGVyZUNvbGxpZGVyLl9fdG1wX3ZlYzNfMFxuICAgICk7XG4gICAgY29uc3QgZGVsdGEgPSBWZWN0b3IzLnN1YnRyYWN0VG8oYm9uZVBvc2l0aW9uLCBzcGhlcmVQb3NXb3JsZCwgU3BoZXJlQ29sbGlkZXIuX190bXBfdmVjM18xKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBWZWN0b3IzLm5vcm1hbGl6ZVRvKGRlbHRhLCBTcGhlcmVDb2xsaWRlci5fX3RtcF92ZWMzXzIpO1xuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMucmFkaXVzICsgYm9uZVJhZGl1cztcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRlbHRhLmxlbmd0aCgpIC0gcmFkaXVzO1xuXG4gICAgcmV0dXJuIHsgZGlyZWN0aW9uLCBkaXN0YW5jZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBTcGhlcmVDb2xsaWRlciB9IGZyb20gJy4vU3BoZXJlQ29sbGlkZXInO1xuaW1wb3J0IHsgQ2Fwc3VsZUNvbGxpZGVyIH0gZnJvbSAnLi9DYXBzdWxlQ29sbGlkZXInO1xuXG5leHBvcnQgY2xhc3MgVlJNQ29sbGlkZXJHcm91cCB7XG4gIHNwaGVyZUNvbGxpZGVyczogU3BoZXJlQ29sbGlkZXJbXSA9IFtdO1xuICBjYXBzdWxlQ29sbGlkZXJzOiBDYXBzdWxlQ29sbGlkZXJbXSA9IFtdO1xufVxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBTY2VuZUdyYXBoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuLi8uLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IEluZGV4IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVlJNU3ByaW5nQm9uZSB9IGZyb20gJy4vVlJNU3ByaW5nQm9uZSc7XG5pbXBvcnQgeyBWUk1Db2xsaWRlckdyb3VwIH0gZnJvbSAnLi9WUk1Db2xsaWRlckdyb3VwJztcblxuZXhwb3J0IGNsYXNzIFZSTVNwcmluZyBleHRlbmRzIFJuT2JqZWN0IHtcbiAgcm9vdEJvbmU6IFNjZW5lR3JhcGhDb21wb25lbnQ7XG4gIGJvbmVzOiBWUk1TcHJpbmdCb25lW10gPSBbXTtcbiAgY29sbGlkZXJHcm91cHM6IFZSTUNvbGxpZGVyR3JvdXBbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RCb25lOiBTY2VuZUdyYXBoQ29tcG9uZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJvb3RCb25lID0gcm9vdEJvbmU7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzJztcbmltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IElWZWN0b3IzLCBNYXRyaXg0NCwgTXV0YWJsZVZlY3RvcjMsIFF1YXRlcm5pb24gfSBmcm9tICcuLi8uLi9tYXRoJztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMnO1xuXG5leHBvcnQgY2xhc3MgVlJNU3ByaW5nQm9uZSBleHRlbmRzIFJuT2JqZWN0IHtcbiAgc3RpZmZuZXNzRm9yY2UgPSAwLjU7XG4gIGdyYXZpdHlQb3dlciA9IDA7XG4gIGdyYXZpdHlEaXIgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAsIC0xLjAsIDBdKTtcbiAgZHJhZ0ZvcmNlID0gMC4wNTtcbiAgaGl0UmFkaXVzID0gMC4wMjtcbiAgbm9kZTogSVNjZW5lR3JhcGhFbnRpdHk7XG5cbiAgY3VycmVudFRhaWw6IFZlY3RvcjMgPSBWZWN0b3IzLnplcm8oKTsgLy8gSW4gV29ybGQgU3BhY2VcbiAgcHJldlRhaWw6IFZlY3RvcjMgPSBWZWN0b3IzLnplcm8oKTsgLy8gSW4gV29ybGQgU3BhY2VcbiAgYm9uZUF4aXM6IFZlY3RvcjMgPSBWZWN0b3IzLnplcm8oKTsgLy8gSW4gTG9jYWwgU3BhY2VcbiAgYm9uZUxlbmd0aCA9IDA7XG5cbiAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3RtcF92ZWMzXzAgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG5cbiAgY29uc3RydWN0b3Iobm9kZTogSVNjZW5lR3JhcGhFbnRpdHkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gIH1cblxuICBzZXR1cChsb2NhbENoaWxkUG9zaXRpb246IElWZWN0b3IzLCBjZW50ZXI/OiBTY2VuZUdyYXBoQ29tcG9uZW50KSB7XG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBzY2VuZWdyYXBoID0gdGhpcy5ub2RlLmdldFNjZW5lR3JhcGgoKTtcbiAgICAgIHRoaXMubm9kZS5nZXRUcmFuc2Zvcm0oKS5fYmFja3VwVHJhbnNmb3JtQXNSZXN0KCk7XG4gICAgICBjb25zdCB3b3JsZENoaWxkUG9zaXRpb24gPSBzY2VuZWdyYXBoLmdldFdvcmxkUG9zaXRpb25PZlRvKFxuICAgICAgICBsb2NhbENoaWxkUG9zaXRpb24sXG4gICAgICAgIFZSTVNwcmluZ0JvbmUuX190bXBfdmVjM18wXG4gICAgICApO1xuICAgICAgdGhpcy5jdXJyZW50VGFpbCA9XG4gICAgICAgIGNlbnRlciAhPSBudWxsID8gY2VudGVyLmdldExvY2FsUG9zaXRpb25PZih3b3JsZENoaWxkUG9zaXRpb24pIDogd29ybGRDaGlsZFBvc2l0aW9uO1xuICAgICAgdGhpcy5wcmV2VGFpbCA9IHRoaXMuY3VycmVudFRhaWwuY2xvbmUoKTtcbiAgICAgIHRoaXMuYm9uZUF4aXMgPSBWZWN0b3IzLm5vcm1hbGl6ZShsb2NhbENoaWxkUG9zaXRpb24pO1xuICAgICAgdGhpcy5ib25lTGVuZ3RoID0gbG9jYWxDaGlsZFBvc2l0aW9uLmxlbmd0aCgpO1xuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBTY2VuZUdyYXBoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uLy4uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBUaW1lIH0gZnJvbSAnLi4vLi4vbWlzYy9UaW1lJztcbmltcG9ydCB7IFZSTVNwcmluZyB9IGZyb20gJy4vVlJNU3ByaW5nJztcbmltcG9ydCB7IFZSTUNvbGxpZGVyR3JvdXAgfSBmcm9tICcuL1ZSTUNvbGxpZGVyR3JvdXAnO1xuaW1wb3J0IHsgUGh5c2ljc1N0cmF0ZWd5IH0gZnJvbSAnLi4vUGh5c2ljc1N0cmF0ZWd5JztcbmltcG9ydCB7IE11dGFibGVRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vbWF0aC9NdXRhYmxlUXVhdGVybmlvbic7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uLy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgVlJNU3ByaW5nQm9uZSB9IGZyb20gJy4vVlJNU3ByaW5nQm9uZSc7XG5cbmV4cG9ydCBjbGFzcyBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5IGltcGxlbWVudHMgUGh5c2ljc1N0cmF0ZWd5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfdXBkYXRlSW5uZXJfdmVjM18wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF91cGRhdGVJbm5lcl92ZWMzXzEgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3VwZGF0ZUlubmVyX3ZlYzNfMiA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfcHJvY2Vzc192ZWMzXzAgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3Byb2Nlc3NfdmVjM18xID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9wcm9jZXNzX3ZlYzNfMiA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfcHJvY2Vzc192ZWMzXzMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3Byb2Nlc3NfdmVjM180ID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9wcm9jZXNzX3ZlYzNfNSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfcHJvY2Vzc192ZWMzXzYgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3Byb2Nlc3NfdmVjM183ID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9wcm9jZXNzX3ZlYzNfOCA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfcHJvY2Vzc192ZWMzXzkgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX3Byb2Nlc3NfdmVjM18xMCA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfcHJvY2Vzc192ZWMzXzExID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9wcm9jZXNzX3F1YXRfMCA9IE11dGFibGVRdWF0ZXJuaW9uLmlkZW50aXR5KCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX25vcm1hbGl6ZUJvbmVMZW5ndGhfdmVjM18wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9ub3JtYWxpemVCb25lTGVuZ3RoX3ZlYzNfMSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfbm9ybWFsaXplQm9uZUxlbmd0aF92ZWMzXzIgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX2FwcGx5Um90YXRpb25fdmVjM18wID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9hcHBseVJvdGF0aW9uX3ZlYzNfMSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfYXBwbHlSb3RhdGlvbl92ZWMzXzMgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX2FwcGx5Um90YXRpb25fdmVjM180ID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9hcHBseVJvdGF0aW9uX3F1YXRfMCA9IE11dGFibGVRdWF0ZXJuaW9uLmlkZW50aXR5KCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX2FwcGx5Um90YXRpb25fcXVhdF8xID0gTXV0YWJsZVF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfYXBwbHlSb3RhdGlvbl9xdWF0XzIgPSBNdXRhYmxlUXVhdGVybmlvbi5pZGVudGl0eSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9hcHBseVJvdGF0aW9uX3F1YXRfMyA9IE11dGFibGVRdWF0ZXJuaW9uLmlkZW50aXR5KCk7XG4gIHByaXZhdGUgc3RhdGljIF9fdG1wX2FwcGx5Um90YXRpb25fcXVhdF80ID0gTXV0YWJsZVF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfY29sbGlzaW9uX3ZlYzNfMCA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfY29sbGlzaW9uX3ZlYzNfMSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfY29sbGlzaW9uX3ZlYzNfMiA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgX190bXBfY29sbGlzaW9uX3ZlYzNfMyA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcblxuICBwcml2YXRlIF9fc3ByaW5nOiBWUk1TcHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGdldFBhcmVudFJvdGF0aW9uKGhlYWQ6IFNjZW5lR3JhcGhDb21wb25lbnQpIHtcbiAgICByZXR1cm4gaGVhZC5wYXJlbnQgIT0gbnVsbCA/IGhlYWQucGFyZW50LnJvdGF0aW9uIDogUXVhdGVybmlvbi5pZGVudGl0eSgpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIGNvbnN0IHNwcmluZyA9IHRoaXMuX19zcHJpbmc7XG4gICAgaWYgKElzLmV4aXN0KHNwcmluZykpIHtcbiAgICAgIHRoaXMudXBkYXRlSW5uZXIoc3ByaW5nLmJvbmVzLCBzcHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUlubmVyKGJvbmVzOiBWUk1TcHJpbmdCb25lW10sIHNwcmluZzogVlJNU3ByaW5nKSB7XG4gICAgY29uc3QgY2VudGVyOiBTY2VuZUdyYXBoQ29tcG9uZW50IHwgdW5kZWZpbmVkID0gdm9pZCAwO1xuXG4gICAgY29uc3QgY29sbGlzaW9uR3JvdXBzID0gc3ByaW5nLmNvbGxpZGVyR3JvdXBzO1xuXG4gICAgZm9yIChjb25zdCBib25lIG9mIGJvbmVzKSB7XG4gICAgICAvLyBzZXR1cCBWUk1TcHJpbmdCb25lXG4gICAgICBjb25zdCBzZyA9IGJvbmUubm9kZS5nZXRTY2VuZUdyYXBoKCk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNnLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY2hpbGRyZW5bMF0uZW50aXR5LmdldFRyYW5zZm9ybSgpO1xuICAgICAgICAvLyBjb25zdCBjaGlsZFBvc2l0aW9uSW5Mb2NhbCA9IE11dGFibGVWZWN0b3IzLmZyb21Db3B5MyhcbiAgICAgICAgLy8gICB0cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbi54ICogdHJhbnNmb3JtLmxvY2FsU2NhbGUueCxcbiAgICAgICAgLy8gICB0cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbi55ICogdHJhbnNmb3JtLmxvY2FsU2NhbGUueSxcbiAgICAgICAgLy8gICB0cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbi56ICogdHJhbnNmb3JtLmxvY2FsU2NhbGUuelxuICAgICAgICAvLyApO1xuICAgICAgICBjb25zdCBjaGlsZFBvc2l0aW9uSW5Mb2NhbCA9IHRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uO1xuICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbkluTG9jYWwubGVuZ3RoU3F1YXJlZCgpIDwgTnVtYmVyLkVQU0lMT04pIHtcbiAgICAgICAgICBjaGlsZFBvc2l0aW9uSW5Mb2NhbC5fdlsxXSA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGJvbmUuc2V0dXAoY2hpbGRQb3NpdGlvbkluTG9jYWwsIHZvaWQgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZFBvc2l0aW9uID0gVmVjdG9yMy5tdWx0aXBseVRvKFxuICAgICAgICAgIFZlY3RvcjMubm9ybWFsaXplVG8oc2cucG9zaXRpb24sIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfdXBkYXRlSW5uZXJfdmVjM18wKSxcbiAgICAgICAgICAwLjA3LFxuICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfdXBkYXRlSW5uZXJfdmVjM18xXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNoaWxkUG9zaXRpb25JbkxvY2FsID0gc2cuZ2V0TG9jYWxQb3NpdGlvbk9mVG8oXG4gICAgICAgICAgY2hpbGRQb3NpdGlvbixcbiAgICAgICAgICBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX3VwZGF0ZUlubmVyX3ZlYzNfMlxuICAgICAgICApO1xuICAgICAgICBib25lLnNldHVwKGNoaWxkUG9zaXRpb25JbkxvY2FsLCB2b2lkIDApO1xuICAgICAgfVxuXG4gICAgICAvLyB1cGRhdGUgVlJNU3ByaW5nQm9uZVxuICAgICAgdGhpcy5wcm9jZXNzKGNvbGxpc2lvbkdyb3VwcywgYm9uZSwgY2VudGVyKTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzKGNvbGxpc2lvbkdyb3VwczogVlJNQ29sbGlkZXJHcm91cFtdLCBib25lOiBWUk1TcHJpbmdCb25lLCBjZW50ZXI/OiBTY2VuZUdyYXBoQ29tcG9uZW50KSB7XG4gICAgY29uc3QgZHJhZ0ZvcmNlID0gYm9uZS5kcmFnRm9yY2U7XG4gICAgY29uc3Qgc3RpZmZuZXNzRm9yY2UgPSBib25lLnN0aWZmbmVzc0ZvcmNlICogVGltZS5sYXN0VGlja1RpbWVJbnRlcnZhbCAqIDE7XG5cbiAgICBjb25zdCBjdXJyZW50VGFpbCA9XG4gICAgICBjZW50ZXIgIT0gbnVsbFxuICAgICAgICA/IGNlbnRlci5nZXRXb3JsZFBvc2l0aW9uT2ZUbyhcbiAgICAgICAgICAgIGJvbmUuY3VycmVudFRhaWwsXG4gICAgICAgICAgICBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX3Byb2Nlc3NfdmVjM18wXG4gICAgICAgICAgKVxuICAgICAgICA6IGJvbmUuY3VycmVudFRhaWw7XG4gICAgY29uc3QgcHJldlRhaWwgPVxuICAgICAgY2VudGVyICE9IG51bGxcbiAgICAgICAgPyBjZW50ZXIuZ2V0V29ybGRQb3NpdGlvbk9mVG8oXG4gICAgICAgICAgICBib25lLnByZXZUYWlsLFxuICAgICAgICAgICAgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9wcm9jZXNzX3ZlYzNfMVxuICAgICAgICAgIClcbiAgICAgICAgOiBib25lLnByZXZUYWlsO1xuXG4gICAgLy8gQ29udGludWVzIHRoZSBwcmV2aW91cyBmcmFtZSdzIG1vdmVtZW50ICh0aGVyZSBpcyBhbHNvIGF0dGVudWF0aW9uKVxuICAgIGNvbnN0IGluZXJ0aWEgPSBNdXRhYmxlVmVjdG9yMy5tdWx0aXBseVRvKFxuICAgICAgVmVjdG9yMy5zdWJ0cmFjdFRvKGN1cnJlbnRUYWlsLCBwcmV2VGFpbCwgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9wcm9jZXNzX3ZlYzNfMiksXG4gICAgICAxLjAgLSBkcmFnRm9yY2UsXG4gICAgICBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX3Byb2Nlc3NfdmVjM18zXG4gICAgKTtcblxuICAgIC8vIE1vdmVtZW50IHRhcmdldCBvZiBjaGlsZCBib25lcyBkdWUgdG8gcGFyZW50J3Mgcm90YXRpb25cbiAgICBjb25zdCByb3RhdGlvbiA9IFF1YXRlcm5pb24ubXVsdGlwbHlUbyhcbiAgICAgIHRoaXMuZ2V0UGFyZW50Um90YXRpb24oYm9uZS5ub2RlLmdldFNjZW5lR3JhcGgoKSksXG4gICAgICBib25lLm5vZGUubG9jYWxSb3RhdGlvblJlc3RJbm5lcixcbiAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfcHJvY2Vzc19xdWF0XzBcbiAgICApO1xuICAgIGNvbnN0IHN0aWZmbmVzcyA9IFZlY3RvcjMubXVsdGlwbHlUbyhcbiAgICAgIHJvdGF0aW9uLnRyYW5zZm9ybVZlY3RvcjNUbyhib25lLmJvbmVBeGlzLCBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX3Byb2Nlc3NfdmVjM180KSxcbiAgICAgIHN0aWZmbmVzc0ZvcmNlLFxuICAgICAgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9wcm9jZXNzX3ZlYzNfNVxuICAgICk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5leHRUYWlsXG4gICAgY29uc3QgZXh0ZXJuYWwgPSBWZWN0b3IzLm11bHRpcGx5VG8oXG4gICAgICBib25lLmdyYXZpdHlEaXIsXG4gICAgICBib25lLmdyYXZpdHlQb3dlciAqIFRpbWUubGFzdFRpY2tUaW1lSW50ZXJ2YWwgKiAxLFxuICAgICAgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9wcm9jZXNzX3ZlYzNfNlxuICAgICk7XG4gICAgbGV0IG5leHRUYWlsID0gVmVjdG9yMy5hZGRUbyhcbiAgICAgIFZlY3RvcjMuYWRkVG8oXG4gICAgICAgIFZlY3RvcjMuYWRkVG8oY3VycmVudFRhaWwsIGluZXJ0aWEsIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfcHJvY2Vzc192ZWMzXzcpLFxuICAgICAgICBzdGlmZm5lc3MsXG4gICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfcHJvY2Vzc192ZWMzXzhcbiAgICAgICksXG4gICAgICBleHRlcm5hbCxcbiAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfcHJvY2Vzc192ZWMzXzlcbiAgICApIGFzIFZlY3RvcjM7XG5cbiAgICAvLyBOb3JtYWxpemUgdG8gYm9uZSBsZW5ndGhcbiAgICBuZXh0VGFpbCA9IHRoaXMubm9ybWFsaXplQm9uZUxlbmd0aChuZXh0VGFpbCwgYm9uZSk7XG5cbiAgICAvLyBNb3ZlbWVudCBieSBDb2xsaXNpb25cbiAgICBuZXh0VGFpbCA9IHRoaXMuY29sbGlzaW9uKGNvbGxpc2lvbkdyb3VwcywgbmV4dFRhaWwsIGJvbmUuaGl0UmFkaXVzLCBib25lKTtcblxuICAgIC8vIHByZXZUYWlsID0gY3VycmVudFRhaWw7XG4gICAgLy8gY3VycmVudFRhaWwgPSBuZXh0VGFpbDtcbiAgICBib25lLnByZXZUYWlsID1cbiAgICAgIGNlbnRlciAhPSBudWxsXG4gICAgICAgID8gY2VudGVyLmdldExvY2FsUG9zaXRpb25PZlRvKFxuICAgICAgICAgICAgY3VycmVudFRhaWwsXG4gICAgICAgICAgICBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX3Byb2Nlc3NfdmVjM18xMFxuICAgICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50VGFpbDtcbiAgICBib25lLmN1cnJlbnRUYWlsID1cbiAgICAgIGNlbnRlciAhPSBudWxsXG4gICAgICAgID8gY2VudGVyLmdldExvY2FsUG9zaXRpb25PZlRvKG5leHRUYWlsLCBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX3Byb2Nlc3NfdmVjM18xMSlcbiAgICAgICAgOiBuZXh0VGFpbDtcblxuICAgIGNvbnN0IHJlc3VsdFJvdGF0aW9uID0gdGhpcy5hcHBseVJvdGF0aW9uKG5leHRUYWlsLCBib25lKTtcblxuICAgIGJvbmUubm9kZS5sb2NhbFJvdGF0aW9uID0gcmVzdWx0Um90YXRpb247XG4gICAgLy8gYm9uZS5ub2RlLnJvdGF0aW9uID0gcmVzdWx0Um90YXRpb247XG4gIH1cblxuICBub3JtYWxpemVCb25lTGVuZ3RoKG5leHRUYWlsOiBWZWN0b3IzLCBib25lOiBWUk1TcHJpbmdCb25lKSB7XG4gICAgY29uc3Qgc3ViID0gVmVjdG9yMy5ub3JtYWxpemVUbyhcbiAgICAgIFZlY3RvcjMuc3VidHJhY3RUbyhcbiAgICAgICAgbmV4dFRhaWwsXG4gICAgICAgIGJvbmUubm9kZS5wb3NpdGlvbixcbiAgICAgICAgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9ub3JtYWxpemVCb25lTGVuZ3RoX3ZlYzNfMFxuICAgICAgKSxcbiAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfbm9ybWFsaXplQm9uZUxlbmd0aF92ZWMzXzFcbiAgICApO1xuICAgIHJldHVybiBWZWN0b3IzLmFkZChcbiAgICAgIGJvbmUubm9kZS5wb3NpdGlvbixcbiAgICAgIFZlY3RvcjMubXVsdGlwbHlUbyhcbiAgICAgICAgc3ViLFxuICAgICAgICBib25lLmJvbmVMZW5ndGgsXG4gICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfbm9ybWFsaXplQm9uZUxlbmd0aF92ZWMzXzJcbiAgICAgIClcbiAgICAgIC8vIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfbm9ybWFsaXplQm9uZUxlbmd0aF92ZWMzXzNcbiAgICApO1xuICB9XG5cbiAgYXBwbHlSb3RhdGlvbihuZXh0VGFpbDogVmVjdG9yMywgYm9uZTogVlJNU3ByaW5nQm9uZSkge1xuICAgIC8vIGNhbGMgaW4gbG9jYWwgc3BhY2VcbiAgICBjb25zdCBzdWIgPSBWZWN0b3IzLm5vcm1hbGl6ZVRvKFxuICAgICAgVmVjdG9yMy5zdWJ0cmFjdFRvKFxuICAgICAgICBuZXh0VGFpbCxcbiAgICAgICAgYm9uZS5ub2RlLnBvc2l0aW9uLFxuICAgICAgICBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX2FwcGx5Um90YXRpb25fdmVjM18wXG4gICAgICApLFxuICAgICAgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9hcHBseVJvdGF0aW9uX3ZlYzNfMVxuICAgICk7XG4gICAgY29uc3QgdG8gPSBRdWF0ZXJuaW9uLmludmVydFRvKFxuICAgICAgUXVhdGVybmlvbi5tdWx0aXBseVRvKFxuICAgICAgICBib25lLm5vZGUucGFyZW50IS5yb3RhdGlvbixcbiAgICAgICAgYm9uZS5ub2RlLmxvY2FsUm90YXRpb25SZXN0SW5uZXIsXG4gICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfYXBwbHlSb3RhdGlvbl9xdWF0XzBcbiAgICAgICksXG4gICAgICBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX2FwcGx5Um90YXRpb25fcXVhdF8xXG4gICAgKS50cmFuc2Zvcm1WZWN0b3IzKHN1Yik7IC8vLCBWUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5Ll9fdG1wX2FwcGx5Um90YXRpb25fdmVjM18yKTtcbiAgICBjb25zdCByZXN1bHQgPSBRdWF0ZXJuaW9uLm11bHRpcGx5VG8oXG4gICAgICBib25lLm5vZGUubG9jYWxSb3RhdGlvblJlc3RJbm5lcixcbiAgICAgIFF1YXRlcm5pb24ubm9ybWFsaXplVG8oXG4gICAgICAgIFF1YXRlcm5pb24uZnJvbVRvUm90YXRpb25UbyhcbiAgICAgICAgICBWZWN0b3IzLm5vcm1hbGl6ZVRvKFxuICAgICAgICAgICAgYm9uZS5ib25lQXhpcyxcbiAgICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfYXBwbHlSb3RhdGlvbl92ZWMzXzNcbiAgICAgICAgICApLFxuICAgICAgICAgIFZlY3RvcjMubm9ybWFsaXplVG8odG8sIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfYXBwbHlSb3RhdGlvbl92ZWMzXzQpLFxuICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfYXBwbHlSb3RhdGlvbl9xdWF0XzJcbiAgICAgICAgKSxcbiAgICAgICAgVlJNU3ByaW5nQm9uZVBoeXNpY3NTdHJhdGVneS5fX3RtcF9hcHBseVJvdGF0aW9uX3F1YXRfM1xuICAgICAgKSxcbiAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfYXBwbHlSb3RhdGlvbl9xdWF0XzRcbiAgICApO1xuXG4gICAgLy8gY2FsYyBpbiB3b3JsZCBzcGFjZVxuICAgIC8vIGNvbnN0IHJvdGF0aW9uID0gUXVhdGVybmlvbi5tdWx0aXBseShcbiAgICAvLyAgIHRoaXMuZ2V0UGFyZW50Um90YXRpb24oYm9uZS5ub2RlLmdldFNjZW5lR3JhcGgoKSksXG4gICAgLy8gICBib25lLm5vZGUubG9jYWxSb3RhdGlvblJlc3RJbm5lclxuICAgIC8vICk7XG4gICAgLy8gY29uc3Qgc3ViID0gVmVjdG9yMy5zdWJ0cmFjdChuZXh0VGFpbCwgYm9uZS5ub2RlLnBvc2l0aW9uKTtcbiAgICAvLyBsZXQgcmVzdWx0ID0gUXVhdGVybmlvbi5mcm9tVG9Sb3RhdGlvbihyb3RhdGlvbi50cmFuc2Zvcm1WZWN0b3IzKGJvbmUuYm9uZUF4aXMpLCBzdWIpO1xuICAgIC8vIHJlc3VsdCA9IFF1YXRlcm5pb24ubXVsdGlwbHkocmVzdWx0LCByb3RhdGlvbik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29sbGlzaW9uKFxuICAgIGNvbGxpc2lvbkdyb3VwczogVlJNQ29sbGlkZXJHcm91cFtdLFxuICAgIG5leHRUYWlsOiBWZWN0b3IzLFxuICAgIGJvbmVIaXRSYWRpdXM6IG51bWJlcixcbiAgICBib25lOiBWUk1TcHJpbmdCb25lXG4gICkge1xuICAgIGZvciAoY29uc3QgY29sbGlzaW9uR3JvdXAgb2YgY29sbGlzaW9uR3JvdXBzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbGxpZGVyIG9mIGNvbGxpc2lvbkdyb3VwLnNwaGVyZUNvbGxpZGVycykge1xuICAgICAgICBjb25zdCB7IGRpcmVjdGlvbiwgZGlzdGFuY2UgfSA9IGNvbGxpZGVyLmNvbGxpc2lvbihuZXh0VGFpbCwgYm9uZUhpdFJhZGl1cyk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDApIHtcbiAgICAgICAgICAvLyBIaXRcbiAgICAgICAgICBuZXh0VGFpbCA9IFZlY3RvcjMuYWRkVG8oXG4gICAgICAgICAgICBuZXh0VGFpbCxcbiAgICAgICAgICAgIFZlY3RvcjMubXVsdGlwbHlUbyhcbiAgICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAtZGlzdGFuY2UsXG4gICAgICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfY29sbGlzaW9uX3ZlYzNfMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfY29sbGlzaW9uX3ZlYzNfMVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBub3JtYWxpemUgYm9uZSBsZW5ndGhcbiAgICAgICAgICBuZXh0VGFpbCA9IHRoaXMubm9ybWFsaXplQm9uZUxlbmd0aChuZXh0VGFpbCwgYm9uZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY29sbGlkZXIgb2YgY29sbGlzaW9uR3JvdXAuY2Fwc3VsZUNvbGxpZGVycykge1xuICAgICAgICBjb25zdCB7IGRpcmVjdGlvbiwgZGlzdGFuY2UgfSA9IGNvbGxpZGVyLmNvbGxpc2lvbihuZXh0VGFpbCwgYm9uZUhpdFJhZGl1cyk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDApIHtcbiAgICAgICAgICAvLyBIaXRcbiAgICAgICAgICBuZXh0VGFpbCA9IFZlY3RvcjMuYWRkVG8oXG4gICAgICAgICAgICBuZXh0VGFpbCxcbiAgICAgICAgICAgIFZlY3RvcjMubXVsdGlwbHlUbyhcbiAgICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAtZGlzdGFuY2UsXG4gICAgICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfY29sbGlzaW9uX3ZlYzNfMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFZSTVNwcmluZ0JvbmVQaHlzaWNzU3RyYXRlZ3kuX190bXBfY29sbGlzaW9uX3ZlYzNfM1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBub3JtYWxpemUgYm9uZSBsZW5ndGhcbiAgICAgICAgICBuZXh0VGFpbCA9IHRoaXMubm9ybWFsaXplQm9uZUxlbmd0aChuZXh0VGFpbCwgYm9uZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dFRhaWw7XG4gIH1cblxuICBzZXRTcHJpbmcoc2dzOiBWUk1TcHJpbmcpIHtcbiAgICB0aGlzLl9fc3ByaW5nID0gc2dzO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0NhcHN1bGVDb2xsaWRlcic7XG5leHBvcnQgKiBmcm9tICcuL1NwaGVyZUNvbGxpZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vVlJNQ29sbGlkZXJHcm91cCc7XG5leHBvcnQgKiBmcm9tICcuL1ZSTVNwcmluZyc7XG5leHBvcnQgKiBmcm9tICcuL1ZSTVNwcmluZ0JvbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9WUk1TcHJpbmdCb25lUGh5c2ljc1N0cmF0ZWd5JztcbiIsImV4cG9ydCAqIGZyb20gJy4vT2ltbyc7XG5leHBvcnQgKiBmcm9tICcuL1ZSTVNwcmluZyc7XG5leHBvcnQgKiBmcm9tICcuL1BoeXNpY3NTdHJhdGVneSc7XG5leHBvcnQgKiBmcm9tICcuL1BoeXNpY3NQcm9wZXJ0eSc7XG5leHBvcnQgKiBmcm9tICcuL1BoeXNpY3NXb3JsZFByb3BlcnR5JztcbiIsImltcG9ydCB7IE1vZHVsZU1hbmFnZXIgfSBmcm9tICcuLi9zeXN0ZW0vTW9kdWxlTWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7XG4gIFRleHR1cmVEYXRhLFxuICBWZXJ0ZXhIYW5kbGVzLFxuICBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSxcbn0gZnJvbSAnLi4vLi4vd2ViZ2wvV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHR5cGUgeyBDR0FQSVJlc291cmNlSGFuZGxlLCBDb3VudCwgSW5kZXgsIFNpemUsIFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBpeGVsRm9ybWF0RW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1BpeGVsRm9ybWF0JztcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB0eXBlIHsgVGV4dHVyZVBhcmFtZXRlckVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9UZXh0dXJlUGFyYW1ldGVyJztcbmltcG9ydCB0eXBlIHsgQWNjZXNzb3IgfSBmcm9tICcuLi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHR5cGUgeyBQcmltaXRpdmUgfSBmcm9tICcuLi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHtcbiAgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0sXG4gIEhkcmlGb3JtYXRFbnVtLFxuICBQcm9jZXNzQXBwcm9hY2gsXG4gIFRleHR1cmVGb3JtYXRFbnVtLFxuICBWZXJ0ZXhBdHRyaWJ1dGVFbnVtLFxufSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5hbWVzIH0gZnJvbSAnLi4vLi4vd2ViZ2wvdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU2FtcGxlciB9IGZyb20gJy4uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4vUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBJUmVuZGVyYWJsZSB9IGZyb20gJy4uL3RleHR1cmVzL0lSZW5kZXJhYmxlJztcbmltcG9ydCB7IEZyYW1lQnVmZmVyIH0gZnJvbSAnLi4vcmVuZGVyZXIvRnJhbWVCdWZmZXInO1xuaW1wb3J0IHsgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vd2ViZ3B1L1dlYkdwdVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBCYXNpc0ZpbGUgfSBmcm9tICcuLi8uLi90eXBlcy9CYXNpc1RleHR1cmUnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNCc7XG5cbmV4cG9ydCB0eXBlIERpcmVjdFRleHR1cmVEYXRhID1cbiAgfCBUeXBlZEFycmF5XG4gIHwgSFRNTEltYWdlRWxlbWVudFxuICB8IEhUTUxWaWRlb0VsZW1lbnRcbiAgfCBIVE1MQ2FudmFzRWxlbWVudFxuICB8IEltYWdlQml0bWFwO1xuXG5leHBvcnQgdHlwZSBJbWFnZUJpdG1hcERhdGEgPSBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTFZpZGVvRWxlbWVudCB8IEhUTUxDYW52YXNFbGVtZW50IHwgSW1hZ2VCaXRtYXA7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB7XG4gIHN0YXRpYyByZWFkb25seSBJbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCA9IC0xO1xuXG4gIHN0YXRpYyBnZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpOiBJQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkge1xuICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBQcm9jZXNzQXBwcm9hY2guaXNXZWJHTDJBcHByb2FjaChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoKVxuICAgICAgPyAnd2ViZ2wnXG4gICAgICA6ICd3ZWJncHUnO1xuICAgIC8vIGNvbnN0IG1vZHVsZU5hbWUgPSAnd2ViZ2wnO1xuICAgIGNvbnN0IG1vZHVsZU1hbmFnZXIgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgY2dBcGlNb2R1bGUgPSBtb2R1bGVNYW5hZ2VyLmdldE1vZHVsZShtb2R1bGVOYW1lKSEgYXMgYW55O1xuXG4gICAgaWYgKG1vZHVsZU5hbWUgPT09ICd3ZWJnbCcpIHtcbiAgICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5OiBJQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgPVxuICAgICAgICBjZ0FwaU1vZHVsZS5XZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICAgICAgcmV0dXJuIHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZWJHUFVcbiAgICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5OiBJQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgPVxuICAgICAgICBjZ0FwaU1vZHVsZT8uV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgICByZXR1cm4gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk6IFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5IHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gJ3dlYmdsJztcbiAgICBjb25zdCBtb2R1bGVNYW5hZ2VyID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHdlYmdsTW9kdWxlID0gbW9kdWxlTWFuYWdlci5nZXRNb2R1bGUobW9kdWxlTmFtZSkhIGFzIGFueTtcbiAgICBjb25zdCB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeTogV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgPVxuICAgICAgd2ViZ2xNb2R1bGUuV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnk7XG4gIH1cblxuICBzdGF0aWMgZ2V0V2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5KCk6IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9ICd3ZWJncHUnO1xuICAgIGNvbnN0IG1vZHVsZU1hbmFnZXIgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3Qgd2ViZ3B1TW9kdWxlID0gbW9kdWxlTWFuYWdlci5nZXRNb2R1bGUobW9kdWxlTmFtZSkhIGFzIGFueTtcbiAgICBjb25zdCB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnk6IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSA9XG4gICAgICB3ZWJncHVNb2R1bGUuV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgcmV0dXJuIHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB7XG4gIC8qKlxuICAgKiBHZXQgYSBDYW52YXMgU2l6ZVxuICAgKi9cbiAgZ2V0Q2FudmFzU2l6ZSgpOiBbU2l6ZSwgU2l6ZV07XG5cbiAgcmVzaXplQ2FudmFzKHdpZHRoOiBTaXplLCBoZWlnaHQ6IFNpemUpOiB2b2lkO1xuXG4gIGNsZWFyRnJhbWVCdWZmZXIocmVuZGVyUGFzczogUmVuZGVyUGFzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFRleHR1cmVcbiAgICogQHBhcmFtIGltYWdlRGF0YVxuICAgKiBAcGFyYW0gcGFyYW0xXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVUZXh0dXJlRnJvbUltYWdlQml0bWFwRGF0YShcbiAgICBpbWFnZURhdGE6IEltYWdlQml0bWFwRGF0YSxcbiAgICB7XG4gICAgICBsZXZlbCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBib3JkZXIsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgICAgZ2VuZXJhdGVNaXBtYXAsXG4gICAgfToge1xuICAgICAgbGV2ZWw6IEluZGV4O1xuICAgICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgICAgd2lkdGg6IFNpemU7XG4gICAgICBoZWlnaHQ6IFNpemU7XG4gICAgICBib3JkZXI6IFNpemU7XG4gICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0RW51bTtcbiAgICAgIHR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICAgICAgZ2VuZXJhdGVNaXBtYXA6IGJvb2xlYW47XG4gICAgfVxuICApOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuXG4gIC8qKlxuICAgKiBjcmVhdGUgQ29tcHJlc3NlZFRleHR1cmVGcm9tQmFzaXNcbiAgICogQHBhcmFtIGJhc2lzRmlsZVxuICAgKiBAcGFyYW0gcGFyYW0xXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVDb21wcmVzc2VkVGV4dHVyZUZyb21CYXNpcyhcbiAgICBiYXNpc0ZpbGU6IEJhc2lzRmlsZSxcbiAgICB7XG4gICAgICBib3JkZXIsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgIH06IHtcbiAgICAgIGJvcmRlcjogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgfVxuICApOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGJpbmQgY29tcHJlc3NlZCB0ZXh0dXJlIG9iamVjdFxuICAgKiBAcGFyYW0gdGV4dHVyZURhdGFBcnJheSB0cmFuc2NvZGVkIHRleHR1cmUgZGF0YSBmb3IgZWFjaCBtaXBtYXBzKGxldmVscylcbiAgICogQHBhcmFtIGNvbXByZXNzaW9uVGV4dHVyZVR5cGVcbiAgICovXG4gIGNyZWF0ZUNvbXByZXNzZWRUZXh0dXJlKFxuICAgIHRleHR1cmVEYXRhQXJyYXk6IFRleHR1cmVEYXRhW10sXG4gICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZTogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW1cbiAgKTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgVmVydGV4IEJ1ZmZlclxuICAgKiBAcGFyYW0gYWNjZXNzb3JcbiAgICogQHJldHVybnMgYSBDR0FQSVJlc291cmNlSGFuZGxlXG4gICAqL1xuICBjcmVhdGVWZXJ0ZXhCdWZmZXIoYWNjZXNzb3I6IEFjY2Vzc29yKTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgVmVydGV4IEJ1ZmZlclxuICAgKiBAcGFyYW0gdHlwZWRBcnJheSAtIGEgdHlwZWQgYXJyYXlcbiAgICogQHJldHVybnMgYSBDR0FQSVJlc291cmNlSGFuZGxlXG4gICAqL1xuICBjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tVHlwZWRBcnJheSh0eXBlZEFycmF5OiBUeXBlZEFycmF5KTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgSW5kZXggQnVmZmVyXG4gICAqIEBwYXJhbSBhY2Nlc3NvciAtIGFuIGFjY2Vzc29yXG4gICAqIEByZXR1cm5zIGEgQ0dBUElSZXNvdXJjZUhhbmRsZVxuICAgKi9cbiAgY3JlYXRlSW5kZXhCdWZmZXIoYWNjZXNzb3I6IEFjY2Vzc29yKTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgVmVydGV4IEJ1ZmZlciBhbmQgSW5kZXggQnVmZmVyXG4gICAqIEBwYXJhbSBwcmltaXRpdmVcbiAgICovXG4gIGNyZWF0ZVZlcnRleEJ1ZmZlckFuZEluZGV4QnVmZmVyKHByaW1pdGl2ZTogUHJpbWl0aXZlKTogVmVydGV4SGFuZGxlcztcblxuICAvKipcbiAgICogdXBkYXRlIGEgVmVydGV4IEJ1ZmZlclxuICAgKi9cbiAgdXBkYXRlVmVydGV4QnVmZmVyKGFjY2Vzc29yOiBBY2Nlc3NvciwgcmVzb3VyY2VIYW5kbGU6IENHQVBJUmVzb3VyY2VIYW5kbGUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiB1cGRhdGUgYSBJbmRleCBCdWZmZXJcbiAgICovXG4gIHVwZGF0ZUluZGV4QnVmZmVyKGFjY2Vzc29yOiBBY2Nlc3NvciwgcmVzb3VyY2VIYW5kbGU6IENHQVBJUmVzb3VyY2VIYW5kbGUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiB1cGRhdGUgdGhlIFZlcnRleEJ1ZmZlciBhbmQgSW5kZXhCdWZmZXJcbiAgICogQHBhcmFtIHByaW1pdGl2ZVxuICAgKiBAcGFyYW0gdmVydGV4SGFuZGxlc1xuICAgKi9cbiAgdXBkYXRlVmVydGV4QnVmZmVyQW5kSW5kZXhCdWZmZXIocHJpbWl0aXZlOiBQcmltaXRpdmUsIHZlcnRleEhhbmRsZXM6IFZlcnRleEhhbmRsZXMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBkZWxldGUgdGhlIFZlcnRleCBEYXRhIHJlc291cmNlc1xuICAgKiBAcGFyYW0gdmVydGV4SGFuZGxlc1xuICAgKi9cbiAgZGVsZXRlVmVydGV4RGF0YVJlc291cmNlcyh2ZXJ0ZXhIYW5kbGVzOiBWZXJ0ZXhIYW5kbGVzKTogdm9pZDtcblxuICAvKipcbiAgICogZGVsZXRlIGEgVmVydGV4IEJ1ZmZlclxuICAgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGUgLSBhIENHQVBJUmVzb3VyY2VIYW5kbGVcbiAgICovXG4gIGRlbGV0ZVZlcnRleEJ1ZmZlcihyZXNvdXJjZUhhbmRsZTogQ0dBUElSZXNvdXJjZUhhbmRsZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgVmVydGV4RGF0YSB0byB0aGUgUGlwZWxpbmVcbiAgICovXG4gIHNldFZlcnRleERhdGFUb1BpcGVsaW5lKFxuICAgIHtcbiAgICAgIHZhb0hhbmRsZSxcbiAgICAgIGlib0hhbmRsZSxcbiAgICAgIHZib0hhbmRsZXMsXG4gICAgfToge1xuICAgICAgdmFvSGFuZGxlOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuICAgICAgaWJvSGFuZGxlPzogQ0dBUElSZXNvdXJjZUhhbmRsZTtcbiAgICAgIHZib0hhbmRsZXM6IEFycmF5PENHQVBJUmVzb3VyY2VIYW5kbGU+O1xuICAgIH0sXG4gICAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gICAgaW5zdGFuY2VJREJ1ZmZlclVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzaGFkZXIgcHJvZ3JhbVxuICAgKiBAcmV0dXJuIGEgc2hhZGVyIHByb2dyYW0gaGFuZGxlXG4gICAqL1xuICBjcmVhdGVTaGFkZXJQcm9ncmFtKHtcbiAgICBtYXRlcmlhbCxcbiAgICB2ZXJ0ZXhTaGFkZXJTdHIsXG4gICAgZnJhZ21lbnRTaGFkZXJTdHIsXG4gICAgYXR0cmlidXRlTmFtZXMsXG4gICAgYXR0cmlidXRlU2VtYW50aWNzLFxuICAgIG9uRXJyb3IsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgdmVydGV4U2hhZGVyU3RyOiBzdHJpbmc7XG4gICAgZnJhZ21lbnRTaGFkZXJTdHI6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVOYW1lczogQXR0cmlidXRlTmFtZXM7XG4gICAgYXR0cmlidXRlU2VtYW50aWNzOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtW107XG4gICAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIH0pOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuXG4gIGNyZWF0ZUN1YmVUZXh0dXJlRnJvbUZpbGVzKFxuICAgIGJhc2VVcmk6IHN0cmluZyxcbiAgICBtaXBMZXZlbENvdW50OiBDb3VudCxcbiAgICBpc05hbWVQb3NOZWc6IGJvb2xlYW4sXG4gICAgaGRyaUZvcm1hdDogSGRyaUZvcm1hdEVudW1cbiAgKTogUHJvbWlzZTxbbnVtYmVyLCBTYW1wbGVyXT47XG5cbiAgLyoqXG4gICAqIGFsbG9jYXRlIGEgVGV4dHVyZVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gdGhlIGZvcm1hdCBvZiB0aGUgdGV4dHVyZVxuICAgKiBAcGFyYW0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIHRleHR1cmVcbiAgICogQHBhcmFtIGhlaWdodCAtIHRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmVcbiAgICogQHBhcmFtIG1pcG1hcENvdW50IC0gdGhlIG51bWJlciBvZiBtaXBtYXAgbGV2ZWxzXG4gICAqIEByZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIHRleHR1cmVcbiAgICovXG4gIGFsbG9jYXRlVGV4dHVyZSh7XG4gICAgZm9ybWF0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBtaXBMZXZlbENvdW50LFxuICB9OiB7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0RW51bTtcbiAgICB3aWR0aDogU2l6ZTtcbiAgICBoZWlnaHQ6IFNpemU7XG4gICAgbWlwTGV2ZWxDb3VudDogQ291bnQ7XG4gIH0pOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGltYWdlIHRvIGEgc3BlY2lmaWMgbWlwIGxldmVsIG9mIGEgdGV4dHVyZVxuICAgKiBAcGFyYW0gbWlwTGV2ZWwgLSB0aGUgbWlwIGxldmVsIHRvIGxvYWQgdGhlIGltYWdlIHRvXG4gICAqIEBwYXJhbSB0ZXh0dXJlVWlkIC0gdGhlIGhhbmRsZSBvZiB0aGUgdGV4dHVyZVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gdGhlIGZvcm1hdCBvZiB0aGUgaW1hZ2VcbiAgICogQHBhcmFtIHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgZGF0YVxuICAgKiBAcGFyYW0geE9mZnNldCAtIHRoZSB4IG9mZnNldCBvZiBjb3B5IHJlZ2lvblxuICAgKiBAcGFyYW0geU9mZnNldCAtIHRoZSB5IG9mZnNldCBvZiBjb3B5IHJlZ2lvblxuICAgKiBAcGFyYW0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIGltYWdlXG4gICAqIEBwYXJhbSBoZWlnaHQgLSB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZVxuICAgKiBAcGFyYW0gZGF0YSAtIHRoZSB0eXBlZGFycmF5IGRhdGEgb2YgdGhlIGltYWdlXG4gICAqL1xuICBsb2FkSW1hZ2VUb01pcExldmVsT2ZUZXh0dXJlMkQoe1xuICAgIG1pcExldmVsLFxuICAgIHRleHR1cmVVaWQsXG4gICAgZm9ybWF0LFxuICAgIHR5cGUsXG4gICAgeE9mZnNldCxcbiAgICB5T2Zmc2V0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICByb3dTaXplQnlQaXhlbCxcbiAgICBkYXRhLFxuICB9OiB7XG4gICAgbWlwTGV2ZWw6IEluZGV4O1xuICAgIHRleHR1cmVVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGU7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0RW51bTtcbiAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICB4T2Zmc2V0OiBudW1iZXI7XG4gICAgeU9mZnNldDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgcm93U2l6ZUJ5UGl4ZWw6IG51bWJlcjtcbiAgICBkYXRhOiBUeXBlZEFycmF5O1xuICB9KTogdm9pZDtcblxuICAvKipcbiAgICogY3JlYXRlIGEgQ3ViZSBUZXh0dXJlXG4gICAqL1xuICBjcmVhdGVDdWJlVGV4dHVyZShcbiAgICBtaXBMZXZlbENvdW50OiBDb3VudCxcbiAgICBpbWFnZXM6IEFycmF5PHtcbiAgICAgIHBvc1g6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgbmVnWDogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBwb3NZOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgIG5lZ1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgcG9zWjogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBuZWdaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICB9PixcbiAgICB3aWR0aDogU2l6ZSxcbiAgICBoZWlnaHQ6IFNpemVcbiAgKTogW251bWJlciwgU2FtcGxlcl07XG5cbiAgY3JlYXRlVGV4dHVyZVNhbXBsZXIoe1xuICAgIG1hZ0ZpbHRlcixcbiAgICBtaW5GaWx0ZXIsXG4gICAgd3JhcFMsXG4gICAgd3JhcFQsXG4gICAgd3JhcFIsXG4gICAgYW5pc290cm9weSxcbiAgICBpc1ByZW11bHRpcGxpZWRBbHBoYSxcbiAgICBzaGFkb3dDb21wYXJlTW9kZSxcbiAgfToge1xuICAgIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICB3cmFwUzogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgIHdyYXBSOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICBhbmlzb3Ryb3B5OiBib29sZWFuO1xuICAgIGlzUHJlbXVsdGlwbGllZEFscGhhPzogYm9vbGVhbjtcbiAgICBzaGFkb3dDb21wYXJlTW9kZTogYm9vbGVhbjtcbiAgfSk6IENHQVBJUmVzb3VyY2VIYW5kbGU7XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFRleHR1cmVcbiAgICogQHBhcmFtIGltYWdlRGF0YVxuICAgKiBAcGFyYW0gcGFyYW0xXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVUZXh0dXJlRnJvbUhUTUxJbWFnZUVsZW1lbnQoXG4gICAgaW1hZ2VEYXRhOiBIVE1MSW1hZ2VFbGVtZW50LFxuICAgIHtcbiAgICAgIGxldmVsLFxuICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGJvcmRlcixcbiAgICAgIGZvcm1hdCxcbiAgICAgIHR5cGUsXG4gICAgICBnZW5lcmF0ZU1pcG1hcCxcbiAgICB9OiB7XG4gICAgICBsZXZlbDogSW5kZXg7XG4gICAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgICB3aWR0aDogU2l6ZTtcbiAgICAgIGhlaWdodDogU2l6ZTtcbiAgICAgIGJvcmRlcjogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgICBnZW5lcmF0ZU1pcG1hcDogYm9vbGVhbjtcbiAgICB9XG4gICk6IFByb21pc2U8Q0dBUElSZXNvdXJjZUhhbmRsZT47XG5cbiAgY3JlYXRlVGV4dHVyZUZyb21EYXRhVXJpKFxuICAgIGRhdGFVcmk6IHN0cmluZyxcbiAgICB7XG4gICAgICBsZXZlbCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgYm9yZGVyLFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgIH06IHtcbiAgICAgIGxldmVsOiBJbmRleDtcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICAgIGJvcmRlcjogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgICBnZW5lcmF0ZU1pcG1hcDogYm9vbGVhbjtcbiAgICB9XG4gICk6IFByb21pc2U8Q0dBUElSZXNvdXJjZUhhbmRsZT47XG4gIC8qKlxuICAgKiBjcmVhdGUgYSBSZW5kZXJUYXJnZXRUZXh0dXJlXG4gICAqIEBwYXJhbSBwYXJhbTBcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZVJlbmRlclRhcmdldFRleHR1cmUoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBtaXBMZXZlbENvdW50LFxuICAgIGZvcm1hdCxcbiAgfToge1xuICAgIHdpZHRoOiBTaXplO1xuICAgIGhlaWdodDogU2l6ZTtcbiAgICBtaXBMZXZlbENvdW50OiBDb3VudDtcbiAgICBmb3JtYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICB9KTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgUmVuZGVyVGFyZ2V0VGV4dHVyZUFycmF5XG4gICAqIEBwYXJhbSBwYXJhbTBcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZVJlbmRlclRhcmdldFRleHR1cmVBcnJheSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGxldmVsLFxuICAgIGludGVybmFsRm9ybWF0LFxuICAgIGZvcm1hdCxcbiAgICB0eXBlLFxuICAgIGFycmF5TGVuZ3RoLFxuICB9OiB7XG4gICAgd2lkdGg6IFNpemU7XG4gICAgaGVpZ2h0OiBTaXplO1xuICAgIGxldmVsOiBJbmRleDtcbiAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgYXJyYXlMZW5ndGg6IENvdW50O1xuICB9KTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmVcbiAgICogQHBhcmFtIHBhcmFtMFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmUoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBtaXBMZXZlbENvdW50LFxuICAgIGZvcm1hdCxcbiAgfToge1xuICAgIHdpZHRoOiBTaXplO1xuICAgIGhlaWdodDogU2l6ZTtcbiAgICBtaXBMZXZlbENvdW50OiBTaXplO1xuICAgIGZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gIH0pOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuXG4gIC8qKlxuICAgKiBkZWxldGUgYSBUZXh0dXJlXG4gICAqIEBwYXJhbSB0ZXh0dXJlSGFuZGxlXG4gICAqL1xuICBkZWxldGVUZXh0dXJlKHRleHR1cmVIYW5kbGU6IENHQVBJUmVzb3VyY2VIYW5kbGUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZSBNaXBtYXBzXG4gICAqL1xuICBnZW5lcmF0ZU1pcG1hcHMyZCh0ZXh0dXJlSGFuZGxlOiBDR0FQSVJlc291cmNlSGFuZGxlLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlIE1pcG1hcHNcbiAgICovXG4gIGdlbmVyYXRlTWlwbWFwc0N1YmUodGV4dHVyZUhhbmRsZTogQ0dBUElSZXNvdXJjZUhhbmRsZSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkO1xuXG4gIGdldFRleHR1cmVQaXhlbERhdGEoXG4gICAgdGV4dHVyZUhhbmRsZTogQ0dBUElSZXNvdXJjZUhhbmRsZSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGZyYW1lQnVmZmVyVWlkOiBDR0FQSVJlc291cmNlSGFuZGxlLFxuICAgIGNvbG9yQXR0YWNobWVudEluZGV4OiBudW1iZXJcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PjtcblxuICAvKipcbiAgICogY3JlYXRlIGEgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZUZyYW1lQnVmZmVyT2JqZWN0KCk6IENHQVBJUmVzb3VyY2VIYW5kbGU7XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgQ29sb3JCdWZmZXIgdG8gdGhlIEZyYW1lQnVmZmVyT2JqZWN0XG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlciBhIEZyYW1lYnVmZmVyXG4gICAqIEBwYXJhbSByZW5kZXJhYmxlIGEgQ29sb3JCdWZmZXJcbiAgICovXG4gIGF0dGFjaENvbG9yQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdChcbiAgICBmcmFtZWJ1ZmZlcjogRnJhbWVCdWZmZXIsXG4gICAgaW5kZXg6IEluZGV4LFxuICAgIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgQ29sb3JCdWZmZXIgdG8gdGhlIEZyYW1lQnVmZmVyT2JqZWN0XG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlciBhIEZyYW1lYnVmZmVyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50SW5kZXggYSBhdHRhY2htZW50IGluZGV4XG4gICAqIEBwYXJhbSBmYWNlSW5kZXggYSBmYWNlIGluZGV4XG4gICAqIEBwYXJhbSBtaXBMZXZlbCBhIG1pcCBsZXZlbFxuICAgKiBAcGFyYW0gcmVuZGVyYWJsZSBhIENvbG9yQnVmZmVyXG4gICAqL1xuICBhdHRhY2hDb2xvckJ1ZmZlckN1YmVUb0ZyYW1lQnVmZmVyT2JqZWN0KFxuICAgIGZyYW1lYnVmZmVyOiBGcmFtZUJ1ZmZlcixcbiAgICBhdHRhY2htZW50SW5kZXg6IEluZGV4LFxuICAgIGZhY2VJbmRleDogSW5kZXgsXG4gICAgbWlwTGV2ZWw6IEluZGV4LFxuICAgIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFJlbmRlcmJ1ZmZlclxuICAgKi9cbiAgY3JlYXRlUmVuZGVyQnVmZmVyKFxuICAgIHdpZHRoOiBTaXplLFxuICAgIGhlaWdodDogU2l6ZSxcbiAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW0sXG4gICAgaXNNU0FBOiBib29sZWFuLFxuICAgIHNhbXBsZUNvdW50TVNBQTogQ291bnRcbiAgKTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcblxuICAvKipcbiAgICogZGVsZXRlIGEgUmVuZGVyQnVmZmVyXG4gICAqIEBwYXJhbSByZW5kZXJCdWZmZXJVaWRcbiAgICovXG4gIGRlbGV0ZVJlbmRlckJ1ZmZlcihyZW5kZXJCdWZmZXJVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBhdHRhY2ggdGhlIERlcHRoQnVmZmVyIHRvIHRoZSBGcmFtZUJ1ZmZlck9iamVjdFxuICAgKiBAcGFyYW0gZnJhbWVidWZmZXIgYSBGcmFtZWJ1ZmZlclxuICAgKiBAcGFyYW0gcmVuZGVyYWJsZSBhIERlcHRoQnVmZmVyXG4gICAqL1xuICBhdHRhY2hEZXB0aEJ1ZmZlclRvRnJhbWVCdWZmZXJPYmplY3QoZnJhbWVidWZmZXI6IEZyYW1lQnVmZmVyLCByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgU3RlbmNpbEJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBTdGVuY2lsQnVmZmVyXG4gICAqL1xuICBhdHRhY2hTdGVuY2lsQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdChmcmFtZWJ1ZmZlcjogRnJhbWVCdWZmZXIsIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlKTogdm9pZDtcblxuICAvKipcbiAgICogYXR0YWNoIHRoZSBkZXB0aFN0ZW5jaWxCdWZmZXIgdG8gdGhlIEZyYW1lQnVmZmVyT2JqZWN0XG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlciBhIEZyYW1lYnVmZmVyXG4gICAqIEBwYXJhbSByZW5kZXJhYmxlIGEgZGVwdGhTdGVuY2lsQnVmZmVyXG4gICAqL1xuICBhdHRhY2hEZXB0aFN0ZW5jaWxCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KFxuICAgIGZyYW1lYnVmZmVyOiBGcmFtZUJ1ZmZlcixcbiAgICByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBkZWxldGUgYSBGcmFtZUJ1ZmZlck9iamVjdFxuICAgKiBAcGFyYW0gZnJhbWVCdWZmZXJPYmplY3RIYW5kbGVcbiAgICovXG4gIGRlbGV0ZUZyYW1lQnVmZmVyT2JqZWN0KGZyYW1lQnVmZmVyT2JqZWN0SGFuZGxlOiBDR0FQSVJlc291cmNlSGFuZGxlKTogdm9pZDtcblxuICBpc1N1cHBvcnRNdWx0aVZpZXdWUlJlbmRlcmluZygpOiBib29sZWFuO1xuXG4gIHNldFZpZXdwb3J0KHZpZXdwb3J0PzogVmVjdG9yNCk6IHZvaWQ7XG59XG4iLCJpbXBvcnQgeyBSbk9iamVjdCB9IGZyb20gJy4uL2NvcmUvUm5PYmplY3QnO1xuaW1wb3J0IHsgSVZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4vUmVuZGVyUGFzcyc7XG5cbi8qKlxuICogRXhwcmVzc2lvbiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHJlbmRlciBwYXNzZXMgb24gcmVuZGVyaW5nIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgUm5PYmplY3Qge1xuICBwcml2YXRlIF9fcmVuZGVyUGFzc2VzOiBSZW5kZXJQYXNzW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgZXhwID0gbmV3IEV4cHJlc3Npb24oKTtcbiAgICBjb25zdCByZW5kZXJQYXNzZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgdGhpcy5fX3JlbmRlclBhc3Nlcykge1xuICAgICAgcmVuZGVyUGFzc2VzLnB1c2gocmVuZGVyUGFzcy5jbG9uZSgpKTtcbiAgICB9XG4gICAgZXhwLmFkZFJlbmRlclBhc3NlcyhyZW5kZXJQYXNzZXMpO1xuICAgIHJldHVybiBleHA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHJlbmRlciBwYXNzZXMgdG8gdGhlIGVuZCBvZiB0aGlzIGV4cHJlc3Npb24uXG4gICAqL1xuICBhZGRSZW5kZXJQYXNzZXMocmVuZGVyUGFzc2VzOiBSZW5kZXJQYXNzW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgcmVuZGVyUGFzc2VzKSB7XG4gICAgICB0aGlzLl9fcmVuZGVyUGFzc2VzLnB1c2gocmVuZGVyUGFzcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHJlbmRlciBwYXNzZXMgb2YgdGhpcyBleHByZXNzaW9uLlxuICAgKi9cbiAgY2xlYXJSZW5kZXJQYXNzZXMoKSB7XG4gICAgdGhpcy5fX3JlbmRlclBhc3Nlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcmVuZGVyIHBhc3NlcyBvZiB0aGlzIGV4cHJlc3Npb24uXG4gICAqL1xuICBnZXQgcmVuZGVyUGFzc2VzKCk6IFJlbmRlclBhc3NbXSB7XG4gICAgcmV0dXJuIHRoaXMuX19yZW5kZXJQYXNzZXM7XG4gIH1cblxuICBzZXRWaWV3cG9ydCh2aWV3cG9ydDogSVZlY3RvcjQpIHtcbiAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgdGhpcy5fX3JlbmRlclBhc3Nlcykge1xuICAgICAgcmVuZGVyUGFzcy5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBSZXF1aXJlT25lIH0gZnJvbSAnLi4vLi4vdHlwZXMvVHlwZUdlbmVyYXRvcnMnO1xuaW1wb3J0IHsgUm5PYmplY3QgfSBmcm9tICcuLi9jb3JlL1JuT2JqZWN0JztcbmltcG9ydCB7IElWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9JVmVjdG9yJztcbmltcG9ydCB7IGFzc2VydEV4aXN0IH0gZnJvbSAnLi4vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgUmVuZGVyVGFyZ2V0VGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL1JlbmRlclRhcmdldFRleHR1cmUnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbiB9IGZyb20gJy4vRXhwcmVzc2lvbic7XG5pbXBvcnQgeyBGcmFtZUJ1ZmZlciB9IGZyb20gJy4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4vUmVuZGVyUGFzcyc7XG5cbnR5cGUgQ29sb3JBdHRhY2htZW50SW5kZXggPSBudW1iZXI7XG50eXBlIElucHV0UmVuZGVyUGFzc0luZGV4ID0gbnVtYmVyO1xudHlwZSBSZW5kZXJQYXNzSW5kZXggPSBudW1iZXI7XG5cbnR5cGUgRXhwcmVzc2lvbklucHV0cyA9IHtcbiAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcbiAgaW5wdXRSZW5kZXJQYXNzZXM6IFJlbmRlclBhc3NbXTtcbn07XG5cbnR5cGUgR2VuZXJhdG9yT2ZSZW5kZXJUYXJnZXRUZXh0dXJlUHJvbWlzZSA9IEl0ZXJhYmxlSXRlcmF0b3I8UmVuZGVyVGFyZ2V0VGV4dHVyZT47XG5cbi8qKlxuICogRnJhbWUgbWFuYWdlcyBleHByZXNzaW9ucyBhbmQgaW5wdXQvb3V0cHV0IGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW1cbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lIGV4dGVuZHMgUm5PYmplY3Qge1xuICBwcml2YXRlIF9fZXhwcmVzc2lvbnM6IEV4cHJlc3Npb25JbnB1dHNbXSA9IFtdO1xuICBwcml2YXRlIF9fZXhwcmVzc2lvbnNDYWNoZTogRXhwcmVzc2lvbltdID0gW107XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRnJhbWVCdWZmZXIgPSAnRnJhbWVCdWZmZXInO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJlc29sdmVGcmFtZUJ1ZmZlciA9ICdSZXNvbHZlRnJhbWVCdWZmZXInO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJlc29sdmVGcmFtZUJ1ZmZlcjIgPSAnUmVzb2x2ZUZyYW1lQnVmZmVyMic7XG5cbiAgcHJpdmF0ZSBfX2V4cHJlc3Npb25RdWVyaWVzOiBbXG4gICAgRXhwcmVzc2lvbixcbiAgICBSZXF1aXJlT25lPHtcbiAgICAgIGluZGV4PzogSW5wdXRSZW5kZXJQYXNzSW5kZXg7XG4gICAgICB1bmlxdWVOYW1lPzogc3RyaW5nO1xuICAgICAgaW5zdGFuY2U/OiBSZW5kZXJQYXNzO1xuICAgIH0+LFxuICAgIENvbG9yQXR0YWNobWVudEluZGV4LFxuICAgIEdlbmVyYXRvck9mUmVuZGVyVGFyZ2V0VGV4dHVyZVByb21pc2UsXG4gICAgJ0ZyYW1lQnVmZmVyJyB8ICdSZXNvbHZlRnJhbWVCdWZmZXInIHwgJ1Jlc29sdmVGcmFtZUJ1ZmZlcjInXG4gIF1bXSA9IFtdO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCByZW5kZXIgcGFzc2VzIHRvIHRoZSBlbmQgb2YgdGhpcyBleHByZXNzaW9uLlxuICAgKi9cbiAgYWRkRXhwcmVzc2lvbihcbiAgICBleHByZXNzaW9uOiBFeHByZXNzaW9uLFxuICAgIHtcbiAgICAgIGlucHV0UmVuZGVyUGFzc2VzLFxuICAgICAgb3V0cHV0cyxcbiAgICB9OiB7XG4gICAgICBpbnB1dFJlbmRlclBhc3Nlcz86IFJlbmRlclBhc3NbXTtcbiAgICAgIG91dHB1dHM/OiB7XG4gICAgICAgIHJlbmRlclBhc3M6IFJlcXVpcmVPbmU8e1xuICAgICAgICAgIGluZGV4PzogUmVuZGVyUGFzc0luZGV4O1xuICAgICAgICAgIHVuaXF1ZU5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgaW5zdGFuY2U/OiBSZW5kZXJQYXNzO1xuICAgICAgICB9PjtcbiAgICAgICAgZnJhbWVCdWZmZXI6IEZyYW1lQnVmZmVyO1xuICAgICAgfVtdO1xuICAgIH0gPSB7XG4gICAgICBpbnB1dFJlbmRlclBhc3NlczogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9XG4gICkge1xuICAgIGlmIChJcy5leGlzdChvdXRwdXRzKSkge1xuICAgICAgZm9yIChjb25zdCBvdXRwdXQgb2Ygb3V0cHV0cykge1xuICAgICAgICBsZXQgcmVuZGVyUGFzcyA9IG91dHB1dC5yZW5kZXJQYXNzLmluc3RhbmNlO1xuICAgICAgICBpZiAoSXMuZXhpc3Qob3V0cHV0LnJlbmRlclBhc3MuaW5zdGFuY2UpKSB7XG4gICAgICAgICAgcmVuZGVyUGFzcyA9IG91dHB1dC5yZW5kZXJQYXNzLmluc3RhbmNlO1xuICAgICAgICB9IGVsc2UgaWYgKElzLmV4aXN0KG91dHB1dC5yZW5kZXJQYXNzLmluZGV4KSkge1xuICAgICAgICAgIHJlbmRlclBhc3MgPSBleHByZXNzaW9uLnJlbmRlclBhc3Nlc1tvdXRwdXQucmVuZGVyUGFzcy5pbmRleF07XG4gICAgICAgIH0gZWxzZSBpZiAoSXMuZXhpc3Qob3V0cHV0LnJlbmRlclBhc3MudW5pcXVlTmFtZSkpIHtcbiAgICAgICAgICByZW5kZXJQYXNzID0gUm5PYmplY3QuZ2V0Um5PYmplY3RCeU5hbWUob3V0cHV0LnJlbmRlclBhc3MudW5pcXVlTmFtZSkgYXMgUmVuZGVyUGFzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZXhpc3QocmVuZGVyUGFzcykpIHtcbiAgICAgICAgICByZW5kZXJQYXNzLnNldEZyYW1lYnVmZmVyKG91dHB1dC5mcmFtZUJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fX2V4cHJlc3Npb25zLnB1c2goe1xuICAgICAgZXhwcmVzc2lvbixcbiAgICAgIGlucHV0UmVuZGVyUGFzc2VzOiBJcy5leGlzdChpbnB1dFJlbmRlclBhc3NlcykgPyBpbnB1dFJlbmRlclBhc3NlcyA6IFtdLFxuICAgIH0pO1xuICAgIHRoaXMuX19leHByZXNzaW9uc0NhY2hlLnB1c2goZXhwcmVzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IENvbG9yQXR0YWNobWVudCBSZW5kZXJCdWZmZXIgZnJvbSBpbnB1dCByZW5kZXIgcGFzcyBvZiB0aGUgZXhwcmVzc2lvblxuICAgKiBAcGFyYW0gaW5wdXRGcm9tIGlucHV0IEV4cHJlc3Npb25cbiAgICogQHBhcmFtIHtpbnB1dEluZGV4OiBudW1iZXIsIGNvbG9yQXR0YWNobWVudEluZGV4OiBudW1iZXJ9IGlucHV0IFJlbmRlclBhc3MgSW5kZXggYW5kIENvbG9yQXR0YWNobWVuIHRJbmRleFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZW5kZXJUYXJnZXRUZXh0dXJlPn1cbiAgICovXG4gIGdldENvbG9yQXR0YWNobWVudEZyb21JbnB1dE9mKFxuICAgIGlucHV0RnJvbTogRXhwcmVzc2lvbixcbiAgICByZW5kZXJQYXNzQXJnOiB7XG4gICAgICByZW5kZXJQYXNzOiBSZXF1aXJlT25lPHtcbiAgICAgICAgaW5kZXg/OiBJbnB1dFJlbmRlclBhc3NJbmRleDtcbiAgICAgICAgdW5pcXVlTmFtZT86IHN0cmluZztcbiAgICAgICAgaW5zdGFuY2U/OiBSZW5kZXJQYXNzO1xuICAgICAgfT47XG4gICAgICBjb2xvckF0dGFjaG1lbnRJbmRleDogQ29sb3JBdHRhY2htZW50SW5kZXg7XG4gICAgICBmcmFtZWJ1ZmZlclR5cGU6ICdGcmFtZUJ1ZmZlcicgfCAnUmVzb2x2ZUZyYW1lQnVmZmVyJyB8ICdSZXNvbHZlRnJhbWVCdWZmZXIyJztcbiAgICB9ID0ge1xuICAgICAgcmVuZGVyUGFzczoge1xuICAgICAgICBpbmRleDogMCxcbiAgICAgIH0sXG4gICAgICBjb2xvckF0dGFjaG1lbnRJbmRleDogMCxcbiAgICAgIGZyYW1lYnVmZmVyVHlwZTogRnJhbWUuRnJhbWVCdWZmZXIsXG4gICAgfVxuICApOiBQcm9taXNlPFJlbmRlclRhcmdldFRleHR1cmU+IHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8UmVuZGVyVGFyZ2V0VGV4dHVyZT4oXG4gICAgICAocmVzb2x2ZTogKHZhbHVlOiBSZW5kZXJUYXJnZXRUZXh0dXJlIHwgUHJvbWlzZUxpa2U8UmVuZGVyVGFyZ2V0VGV4dHVyZT4pID0+IHZvaWQpID0+IHtcbiAgICAgICAgZnVuY3Rpb24qIGdlbmVyYXRvckZ1bmMoKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0VGV4dHVyZSA9ICh5aWVsZCkgYXMgdW5rbm93biBhcyBSZW5kZXJUYXJnZXRUZXh0dXJlO1xuICAgICAgICAgIHJlc29sdmUocmVuZGVyVGFyZ2V0VGV4dHVyZSk7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlclRhcmdldFRleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gZ2VuZXJhdG9yRnVuYygpO1xuXG4gICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBnZW5lcmF0b3JcbiAgICAgICAgdGhpcy5fX2V4cHJlc3Npb25RdWVyaWVzLnB1c2goW1xuICAgICAgICAgIGlucHV0RnJvbSxcbiAgICAgICAgICByZW5kZXJQYXNzQXJnLnJlbmRlclBhc3MsXG4gICAgICAgICAgcmVuZGVyUGFzc0FyZy5jb2xvckF0dGFjaG1lbnRJbmRleCxcbiAgICAgICAgICBnZW5lcmF0b3IgYXMgR2VuZXJhdG9yT2ZSZW5kZXJUYXJnZXRUZXh0dXJlUHJvbWlzZSxcbiAgICAgICAgICByZW5kZXJQYXNzQXJnLmZyYW1lYnVmZmVyVHlwZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcmVzb2x2ZSgpIHtcbiAgICBmb3IgKGNvbnN0IFtleHAsIHJlbmRlclBhc3NBcmcsIGNvbG9yQXR0YWNobWVudEluZGV4LCBnZW5lcmF0b3IsIGZyYW1lQnVmZmVyVHlwZV0gb2YgdGhpc1xuICAgICAgLl9fZXhwcmVzc2lvblF1ZXJpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZXhwRGF0YSBvZiB0aGlzLl9fZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgaWYgKGV4cCA9PT0gZXhwRGF0YS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgbGV0IHJlbmRlclBhc3NPYmogPSByZW5kZXJQYXNzQXJnLmluc3RhbmNlO1xuICAgICAgICAgIGlmIChJcy5leGlzdChyZW5kZXJQYXNzQXJnLmluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmVuZGVyUGFzc09iaiA9IHJlbmRlclBhc3NBcmcuaW5zdGFuY2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChJcy5leGlzdChyZW5kZXJQYXNzQXJnLmluZGV4KSkge1xuICAgICAgICAgICAgcmVuZGVyUGFzc09iaiA9IGV4cERhdGEuaW5wdXRSZW5kZXJQYXNzZXNbcmVuZGVyUGFzc0FyZy5pbmRleF07XG4gICAgICAgICAgfSBlbHNlIGlmIChJcy5leGlzdChyZW5kZXJQYXNzQXJnLnVuaXF1ZU5hbWUpKSB7XG4gICAgICAgICAgICByZW5kZXJQYXNzT2JqID0gUm5PYmplY3QuZ2V0Um5PYmplY3RCeU5hbWUocmVuZGVyUGFzc0FyZy51bmlxdWVOYW1lKSBhcyBSZW5kZXJQYXNzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBmcmFtZWJ1ZmZlcjogRnJhbWVCdWZmZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGZyYW1lQnVmZmVyVHlwZSA9PT0gJ1Jlc29sdmVGcmFtZUJ1ZmZlcjInKSB7XG4gICAgICAgICAgICBmcmFtZWJ1ZmZlciA9IHJlbmRlclBhc3NPYmohLmdldFJlc29sdmVGcmFtZWJ1ZmZlcjIoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lQnVmZmVyVHlwZSA9PT0gJ1Jlc29sdmVGcmFtZUJ1ZmZlcicpIHtcbiAgICAgICAgICAgIGZyYW1lYnVmZmVyID0gcmVuZGVyUGFzc09iaiEuZ2V0UmVzb2x2ZUZyYW1lYnVmZmVyKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUJ1ZmZlclR5cGUgPT09ICdGcmFtZUJ1ZmZlcicpIHtcbiAgICAgICAgICAgIGZyYW1lYnVmZmVyID0gcmVuZGVyUGFzc09iaiEuZ2V0RnJhbWVidWZmZXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoSXMuZXhpc3QoZnJhbWVidWZmZXIpKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJUYXJnZXRUZXh0dXJlID1cbiAgICAgICAgICAgICAgZnJhbWVidWZmZXIuZ2V0Q29sb3JBdHRhY2hlZFJlbmRlclRhcmdldFRleHR1cmUoY29sb3JBdHRhY2htZW50SW5kZXgpO1xuICAgICAgICAgICAgaWYgKElzLmV4aXN0KHJlbmRlclRhcmdldFRleHR1cmUpKSB7XG4gICAgICAgICAgICAgIGdlbmVyYXRvci5uZXh0KHJlbmRlclRhcmdldFRleHR1cmUgYXMgYW55KTtcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yLm5leHQocmVuZGVyVGFyZ2V0VGV4dHVyZSBhcyBhbnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciByZW5kZXIgcGFzc2VzIG9mIHRoaXMgZXhwcmVzc2lvbi5cbiAgICovXG4gIGNsZWFyRXhwcmVzc2lvbnMoKSB7XG4gICAgdGhpcy5fX2V4cHJlc3Npb25zLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fX2V4cHJlc3Npb25zQ2FjaGUubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhwcmVzc2lvbnNcbiAgICovXG4gIGdldCBleHByZXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fX2V4cHJlc3Npb25zQ2FjaGU7XG4gIH1cblxuICBzZXRWaWV3cG9ydCh2aWV3cG9ydDogSVZlY3RvcjQpIHtcbiAgICBmb3IgKGNvbnN0IGV4cCBvZiB0aGlzLl9fZXhwcmVzc2lvbnMpIHtcbiAgICAgIGV4cC5leHByZXNzaW9uLnNldFZpZXdwb3J0KHZpZXdwb3J0KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4vQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVJlbmRlcmFibGUgfSBmcm9tICcuLi90ZXh0dXJlcy9JUmVuZGVyYWJsZSc7XG5pbXBvcnQgeyBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtLCBSZW5kZXJCdWZmZXJUYXJnZXQgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9SZW5kZXJCdWZmZXJUYXJnZXQnO1xuaW1wb3J0IHsgSW5kZXgsIFNpemUsIENHQVBJUmVzb3VyY2VIYW5kbGUgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBSZW5kZXJUYXJnZXRUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvUmVuZGVyVGFyZ2V0VGV4dHVyZSc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGcmFtZUJ1ZmZlciBleHRlbmRzIFJuT2JqZWN0IHtcbiAgcHJpdmF0ZSBfX2NvbG9yQXR0YWNobWVudHM6IEFycmF5PElSZW5kZXJhYmxlPiA9IFtdO1xuICBwcml2YXRlIF9fZGVwdGhBdHRhY2htZW50PzogSVJlbmRlcmFibGU7XG4gIHByaXZhdGUgX19zdGVuY2lsQXR0YWNobWVudD86IElSZW5kZXJhYmxlO1xuICBwcml2YXRlIF9fZGVwdGhTdGVuY2lsQXR0YWNobWVudD86IElSZW5kZXJhYmxlO1xuICBwdWJsaWMgY2dBcGlSZXNvdXJjZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuICBwdWJsaWMgd2lkdGg6IFNpemUgPSAwO1xuICBwdWJsaWMgaGVpZ2h0OiBTaXplID0gMDtcbiAgcHJpdmF0ZSBfX2NvbG9yQXR0YWNobWVudE1hcDogTWFwPFJlbmRlckJ1ZmZlclRhcmdldEVudW0sIElSZW5kZXJhYmxlPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0IGNvbG9yQXR0YWNobWVudHNSZW5kZXJCdWZmZXJUYXJnZXRzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX19jb2xvckF0dGFjaG1lbnRNYXAua2V5cygpKTtcbiAgfVxuXG4gIGdldCBjb2xvckF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9fY29sb3JBdHRhY2htZW50cztcbiAgfVxuXG4gIGdldCBkZXB0aEF0dGFjaG1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kZXB0aEF0dGFjaG1lbnQ7XG4gIH1cblxuICBnZXQgc3RlbmNpbEF0dGFjaG1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zdGVuY2lsQXR0YWNobWVudDtcbiAgfVxuXG4gIGdldCBkZXB0aFN0ZW5jaWxBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9fZGVwdGhTdGVuY2lsQXR0YWNobWVudDtcbiAgfVxuXG4gIGdldENvbG9yQXR0YWNoZWRSZW5kZXJUYXJnZXRUZXh0dXJlKGluZGV4OiBJbmRleCk6IFJlbmRlclRhcmdldFRleHR1cmUgfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX19jb2xvckF0dGFjaG1lbnRzW2luZGV4XSA9PSBudWxsIHx8XG4gICAgICAhKHRoaXMuX19jb2xvckF0dGFjaG1lbnRzW2luZGV4XSBpbnN0YW5jZW9mIFJlbmRlclRhcmdldFRleHR1cmUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2NvbG9yQXR0YWNobWVudHNbaW5kZXhdIGFzIFJlbmRlclRhcmdldFRleHR1cmU7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVwdGhBdHRhY2hlZFJlbmRlclRhcmdldFRleHR1cmUoKTogUmVuZGVyVGFyZ2V0VGV4dHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX19kZXB0aEF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZW5kZXJUYXJnZXRUZXh0dXJlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RlcHRoQXR0YWNobWVudCBhcyBSZW5kZXJUYXJnZXRUZXh0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZSh3aWR0aDogU2l6ZSwgaGVpZ2h0OiBTaXplKSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICB0aGlzLmNnQXBpUmVzb3VyY2VVaWQgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVGcmFtZUJ1ZmZlck9iamVjdCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2dBcGlSZXNvdXJjZVVpZDtcbiAgfVxuXG4gIGdldCBmcmFtZWJ1ZmZlclVJRCgpIHtcbiAgICByZXR1cm4gdGhpcy5jZ0FwaVJlc291cmNlVWlkO1xuICB9XG5cbiAgc2V0Q29sb3JBdHRhY2htZW50QXQoaW5kZXg6IEluZGV4LCByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZSkge1xuICAgIGlmIChyZW5kZXJhYmxlLndpZHRoICE9PSB0aGlzLndpZHRoIHx8IHJlbmRlcmFibGUuaGVpZ2h0ICE9PSB0aGlzLmhlaWdodCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9fY29sb3JBdHRhY2htZW50c1tpbmRleF0gPSByZW5kZXJhYmxlO1xuXG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmF0dGFjaENvbG9yQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdCh0aGlzLCBpbmRleCwgcmVuZGVyYWJsZSk7XG5cbiAgICB0aGlzLl9fY29sb3JBdHRhY2htZW50TWFwLnNldChSZW5kZXJCdWZmZXJUYXJnZXQuZnJvbShpbmRleCksIHJlbmRlcmFibGUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRDb2xvckF0dGFjaG1lbnRDdWJlQXQoXG4gICAgYXR0YWNobWVudEluZGV4OiBJbmRleCxcbiAgICBmYWNlSW5kZXg6IEluZGV4LFxuICAgIG1pcExldmVsOiBJbmRleCxcbiAgICByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZVxuICApIHtcbiAgICBpZiAocmVuZGVyYWJsZS53aWR0aCAhPT0gdGhpcy53aWR0aCB8fCByZW5kZXJhYmxlLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fX2NvbG9yQXR0YWNobWVudHNbYXR0YWNobWVudEluZGV4XSA9IHJlbmRlcmFibGU7XG5cbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuYXR0YWNoQ29sb3JCdWZmZXJDdWJlVG9GcmFtZUJ1ZmZlck9iamVjdChcbiAgICAgIHRoaXMsXG4gICAgICBhdHRhY2htZW50SW5kZXgsXG4gICAgICBmYWNlSW5kZXgsXG4gICAgICBtaXBMZXZlbCxcbiAgICAgIHJlbmRlcmFibGVcbiAgICApO1xuXG4gICAgcmVuZGVyYWJsZS5jcmVhdGVDdWJlVGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldChmYWNlSW5kZXgsIG1pcExldmVsKTtcblxuICAgIHRoaXMuX19jb2xvckF0dGFjaG1lbnRNYXAuc2V0KFJlbmRlckJ1ZmZlclRhcmdldC5mcm9tKGF0dGFjaG1lbnRJbmRleCksIHJlbmRlcmFibGUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXREZXB0aEF0dGFjaG1lbnQocmVuZGVyYWJsZTogSVJlbmRlcmFibGUpIHtcbiAgICBpZiAocmVuZGVyYWJsZS53aWR0aCAhPT0gdGhpcy53aWR0aCB8fCByZW5kZXJhYmxlLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fX2RlcHRoQXR0YWNobWVudCA9IHJlbmRlcmFibGU7XG5cbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuYXR0YWNoRGVwdGhCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KHRoaXMsIHJlbmRlcmFibGUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRTdGVuY2lsQXR0YWNobWVudChyZW5kZXJhYmxlOiBJUmVuZGVyYWJsZSkge1xuICAgIGlmIChyZW5kZXJhYmxlLndpZHRoICE9PSB0aGlzLndpZHRoIHx8IHJlbmRlcmFibGUuaGVpZ2h0ICE9PSB0aGlzLmhlaWdodCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9fc3RlbmNpbEF0dGFjaG1lbnQgPSByZW5kZXJhYmxlO1xuXG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmF0dGFjaFN0ZW5jaWxCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KHRoaXMsIHJlbmRlcmFibGUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXREZXB0aFN0ZW5jaWxBdHRhY2htZW50KHJlbmRlcmFibGU6IElSZW5kZXJhYmxlKSB7XG4gICAgaWYgKHJlbmRlcmFibGUud2lkdGggIT09IHRoaXMud2lkdGggfHwgcmVuZGVyYWJsZS5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX19kZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gcmVuZGVyYWJsZTtcblxuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5hdHRhY2hEZXB0aFN0ZW5jaWxCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KHRoaXMsIHJlbmRlcmFibGUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXNpemUod2lkdGg6IFNpemUsIGhlaWdodDogU2l6ZSkge1xuICAgIC8vIHRoaXMuZGVzdHJveTNEQVBJUmVzb3VyY2VzKCk7XG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmRlbGV0ZUZyYW1lQnVmZmVyT2JqZWN0KHRoaXMuY2dBcGlSZXNvdXJjZVVpZCk7XG4gICAgdGhpcy5jZ0FwaVJlc291cmNlVWlkID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gICAgdGhpcy53aWR0aCA9IDA7XG4gICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuY3JlYXRlKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmICh0aGlzLmRlcHRoQXR0YWNobWVudCkge1xuICAgICAgdGhpcy5kZXB0aEF0dGFjaG1lbnQucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5zZXREZXB0aEF0dGFjaG1lbnQodGhpcy5kZXB0aEF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQpIHtcbiAgICAgIHRoaXMuZGVwdGhTdGVuY2lsQXR0YWNobWVudC5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnNldERlcHRoU3RlbmNpbEF0dGFjaG1lbnQodGhpcy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGVuY2lsQXR0YWNobWVudCkge1xuICAgICAgdGhpcy5zdGVuY2lsQXR0YWNobWVudC5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnNldFN0ZW5jaWxBdHRhY2htZW50KHRoaXMuc3RlbmNpbEF0dGFjaG1lbnQpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xvckF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNvbG9yQXR0YWNobWVudHNbaV0ucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5zZXRDb2xvckF0dGFjaG1lbnRBdChpLCB0aGlzLmNvbG9yQXR0YWNobWVudHNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kzREFQSVJlc291cmNlcygpIHtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuZGVsZXRlRnJhbWVCdWZmZXJPYmplY3QodGhpcy5jZ0FwaVJlc291cmNlVWlkKTtcbiAgICB0aGlzLmNnQXBpUmVzb3VyY2VVaWQgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgICB0aGlzLndpZHRoID0gMDtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgICBpZiAodGhpcy5kZXB0aEF0dGFjaG1lbnQpIHtcbiAgICAgIHRoaXMuZGVwdGhBdHRhY2htZW50LmRlc3Ryb3kzREFQSVJlc291cmNlcygpO1xuICAgICAgdGhpcy5fX2RlcHRoQXR0YWNobWVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXB0aFN0ZW5jaWxBdHRhY2htZW50KSB7XG4gICAgICB0aGlzLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuZGVzdHJveTNEQVBJUmVzb3VyY2VzKCk7XG4gICAgICB0aGlzLl9fZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGVuY2lsQXR0YWNobWVudCkge1xuICAgICAgdGhpcy5zdGVuY2lsQXR0YWNobWVudC5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICAgIHRoaXMuX19zdGVuY2lsQXR0YWNobWVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yQXR0YWNobWVudCBvZiB0aGlzLmNvbG9yQXR0YWNobWVudHMpIHtcbiAgICAgIGNvbG9yQXR0YWNobWVudC5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICB9XG4gICAgdGhpcy5fX2NvbG9yQXR0YWNobWVudE1hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHdoaWNoQ29sb3JBdHRhY2htZW50KHJlbmRlcmFibGU6IElSZW5kZXJhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb2xvckF0dGFjaG1lbnRzLmluZGV4T2YocmVuZGVyYWJsZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgRnJhbWVCdWZmZXIgfSBmcm9tICcuL0ZyYW1lQnVmZmVyJztcbmltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL1NjZW5lR3JhcGgvU2NlbmVHcmFwaENvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9NZXNoL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBFbnRpdHlVSUQsIFJlbmRlclBhc3NVSUQgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vd2ViZ2wvV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlVmVjdG9yNCc7XG5pbXBvcnQgeyBJVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvSVZlY3Rvcic7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSwgSU1lc2hFbnRpdHkgfSBmcm9tICcuLi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9XZWxsS25vd25Db21wb25lbnRUSURzJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUmVuZGVyQnVmZmVyVGFyZ2V0JztcbmltcG9ydCB7IFByaW1pdGl2ZU1vZGUsIFByaW1pdGl2ZU1vZGVFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJpbWl0aXZlTW9kZSc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4vQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgZmxhdHRlbkhpZXJhcmNoeSB9IGZyb20gJy4uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoT3BzJztcblxudHlwZSBQcmltaXRpdmVSbk9iamVjdFVJRCA9IG51bWJlcjtcblxuLyoqXG4gKiBBIHJlbmRlciBwYXNzIGlzIGEgY29sbGVjdGlvbiBvZiB0aGUgcmVzb3VyY2VzIHdoaWNoIGlzIHVzZWQgaW4gcmVuZGVyaW5nIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJQYXNzIGV4dGVuZHMgUm5PYmplY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IF9fcmVuZGVyUGFzc1VJRDogUmVuZGVyUGFzc1VJRDtcbiAgcHJpdmF0ZSBfX2VudGl0aWVzOiAoSU1lc2hFbnRpdHkgfCBJU2NlbmVHcmFwaEVudGl0eSlbXSA9IFtdO1xuICBwcml2YXRlIF9fc2NlbmVHcmFwaERpcmVjdGx5QWRkZWQ6IFNjZW5lR3JhcGhDb21wb25lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9fdG9wTGV2ZWxTY2VuZUdyYXBoQ29tcG9uZW50czogU2NlbmVHcmFwaENvbXBvbmVudFtdID0gW107XG4gIHByaXZhdGUgX19tZXNoQ29tcG9uZW50czogTWVzaENvbXBvbmVudFtdID0gW107XG4gIHByaXZhdGUgX19vcHRpbWl6ZWRNZXNoQ29tcG9uZW50czogTWVzaENvbXBvbmVudFtdID0gW107XG4gIHByaXZhdGUgX19mcmFtZUJ1ZmZlcj86IEZyYW1lQnVmZmVyO1xuICBwcml2YXRlIF9fcmVzb2x2ZUZyYW1lQnVmZmVyPzogRnJhbWVCdWZmZXI7XG4gIHByaXZhdGUgX19yZXNvbHZlRnJhbWVCdWZmZXIyPzogRnJhbWVCdWZmZXI7XG4gIHByaXZhdGUgX192aWV3cG9ydD86IE11dGFibGVWZWN0b3I0O1xuICBwcml2YXRlIF9fbWF0ZXJpYWw/OiBNYXRlcmlhbDtcbiAgcHJpdmF0ZSBfX3ByaW1pdGl2ZU1hdGVyaWFsOiBNYXA8UHJpbWl0aXZlUm5PYmplY3RVSUQsIFdlYWtSZWY8TWF0ZXJpYWw+PiA9IG5ldyBNYXAoKTtcblxuICAvLyBQdWJsaWMgUmVuZGVyUGFzcyBTZXR0aW5nc1xuICBwdWJsaWMgdG9DbGVhckNvbG9yQnVmZmVyID0gZmFsc2U7XG4gIHB1YmxpYyB0b0NsZWFyRGVwdGhCdWZmZXIgPSB0cnVlO1xuICBwdWJsaWMgdG9DbGVhclN0ZW5jaWxCdWZmZXIgPSBmYWxzZTtcbiAgcHVibGljIGlzRGVwdGhUZXN0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogZGVwdGggd3JpdGUgbWFzayBmb3IgcHJpbWl0aXZlcyBkcmF3aW5nXG4gICAqIGZhbHNlIGRvZXMgbm90IHByZXZlbnQgZGVwdGggY2xlYXIuXG4gICAqL1xuICBwdWJsaWMgZGVwdGhXcml0ZU1hc2sgPSB0cnVlO1xuXG4gIHB1YmxpYyBjbGVhckNvbG9yID0gVmVjdG9yNC5mcm9tQ29weUFycmF5KFsxLCAxLCAxLCAxXSk7XG4gIHB1YmxpYyBjbGVhckRlcHRoID0gMTtcbiAgcHVibGljIGNsZWFyU3RlbmNpbCA9IDA7XG4gIHB1YmxpYyBjYW1lcmFDb21wb25lbnQ/OiBDYW1lcmFDb21wb25lbnQ7XG5cbiAgLyrvvIpcbiAgICogSWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMSwgYnVmZmVyLWxlc3MgcmVuZGVyaW5nIGlzIHBlcmZvcm1lZCB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZlcnRpY2VzLlxuICAgKiBJbiB0aGlzIGNhc2UsIHJlZ2lzdGVyZWQgRW50aXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZXkgYXJlIG5vdCByZW5kZXJlZC5cbiAgICovXG4gIHB1YmxpYyBfZHJhd1ZlcnRleE51bWJlckZvckJ1ZmZlckxlc3NSZW5kZXJpbmcgPSAwO1xuICBwdWJsaWMgX3ByaW1pdGl2ZU1vZGVGb3JCdWZmZXJMZXNzUmVuZGVyaW5nID0gUHJpbWl0aXZlTW9kZS5UcmlhbmdsZXM7XG4gIHB1YmxpYyBfZHVtbXlQcmltaXRpdmVGb3JCdWZmZXJMZXNzUmVuZGVyaW5nOiBQcmltaXRpdmUgPSBuZXcgUHJpbWl0aXZlKCk7XG5cbiAgLy8gVlJcbiAgcHVibGljIGlzVnJSZW5kZXJpbmcgPSB0cnVlO1xuICBwdWJsaWMgaXNPdXRwdXRGb3JWciA9IGZhbHNlO1xuXG4gIC8vIEludGVybmFsIHVzZVxuICBwdWJsaWMgX2xhc3RPcGFxdWVJbmRleCA9IC0xO1xuICBwdWJsaWMgX2xhc3RUcmFuc2x1Y2VudEluZGV4ID0gLTE7XG4gIHB1YmxpYyBfbGFzdEJsZW5kSW5kZXggPSAtMTtcbiAgcHVibGljIF9sYXN0UHJpbWl0aXZlVWlkczogbnVtYmVyW10gPSBbXTtcbiAgcHVibGljIF9sYXN0VHJhbnNmb3JtQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gLTE7XG4gIHB1YmxpYyBfbGFzdENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnRzVXBkYXRlQ291bnQgPSAtMTtcbiAgcHVibGljIF9sYXN0U2NlbmVHcmFwaENvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuICBwdWJsaWMgX3JlbmRlcmVkU29tZXRoaW5nQmVmb3JlID0gdHJ1ZTtcbiAgcHVibGljIF9pc0NoYW5nZWRTb3J0UmVuZGVyUmVzdWx0ID0gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRvIGRyYXcgb3BhcXVlIHByaW1pdGl2ZXMgY29udGFpbmVkIGluIHRoaXMgcmVuZGVyIHBhc3MuICovXG4gIHB1YmxpYyBfdG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzID0gdHJ1ZTtcblxuICAvKiogV2hldGhlciBvciBub3QgdG8gZHJhdyB0cmFuc3BhcmVudCBwcmltaXRpdmVzIGNvbnRhaW5lZCBpbiB0aGlzIHJlbmRlciBwYXNzLiAqL1xuICBwdWJsaWMgX3RvUmVuZGVyVHJhbnNwYXJlbnRQcmltaXRpdmVzID0gdHJ1ZTtcblxuICBwdWJsaWMgdG9SZW5kZXJFZmZla3NlZXJFZmZlY3RzID0gZmFsc2U7XG4gIHB1YmxpYyBfX3JlbmRlclRhcmdldENvbG9yQXR0YWNobWVudHM/OiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtW107XG4gIHByaXZhdGUgX19wb3N0RWFjaFJlbmRlckZ1bmM/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHN0YXRpYyBfX3RtcF9WZWN0b3I0XzAgPSBNdXRhYmxlVmVjdG9yNC56ZXJvKCk7XG5cbiAgcHVibGljIHN0YXRpYyBfX21lc2hfdWlkX2NvdW50ID0gLTE7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9fcmVuZGVyUGFzc1VJRCA9ICsrUmVuZGVyUGFzcy5fX21lc2hfdWlkX2NvdW50O1xuICB9XG5cbiAgc2V0VG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzKHRvUmVuZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzID0gdG9SZW5kZXI7XG4gICAgdGhpcy5fX2NhbGNNZXNoQ29tcG9uZW50cygpO1xuICB9XG5cbiAgc2V0VG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXModG9SZW5kZXI6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl90b1JlbmRlclRyYW5zcGFyZW50UHJpbWl0aXZlcyA9IHRvUmVuZGVyO1xuICAgIHRoaXMuX19jYWxjTWVzaENvbXBvbmVudHMoKTtcbiAgfVxuXG4gIGlzQnVmZmVyTGVzc1JlbmRlcmluZ01vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RyYXdWZXJ0ZXhOdW1iZXJGb3JCdWZmZXJMZXNzUmVuZGVyaW5nID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYgU2V0IHRoaXMgcmVuZGVyIHBhc3MgdG8gYnVmZmVyLWxlc3MgcmVuZGVyaW5nIG1vZGUuXG4gICAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGJ1ZmZlci1sZXNzIHJlbmRlcmluZyBpcyBwZXJmb3JtZWQgb25seSBvbmNlIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdmVydGljZXMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBlLmcuIGZ1bGwtc2NyZWVuIGRyYXdpbmcuXG4gICAqIEluIHRoaXMgY2FzZSwgZXZlbiBpZiBFbnRpdGllcyBhcmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgYWRkRW50aXRpZXMgbWV0aG9kLCB0aGV5IHdpbGwgYmUgaWdub3JlZCBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSBwcmltaXRpdmVNb2RlIFRoZSBwcmltaXRpdmUgbW9kZSB0byBiZSB1c2VkIGluIGJ1ZmZlci1sZXNzIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIGRyYXdWZXJ0ZXhOdW1iZXJXaXRob3V0RW50aXRpZXMgVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyB0byBiZSByZW5kZXJlZCBpbiBidWZmZXItbGVzcyByZW5kZXJpbmcuXG4gICAqIEBwYXJhbSBtYXRlcmlhbCBUaGUgbWF0ZXJpYWwgdG8gYmUgdXNlZCBpbiBidWZmZXItbGVzcyByZW5kZXJpbmcuXG4gICAqL1xuICBzZXRCdWZmZXJMZXNzUmVuZGVyaW5nKFxuICAgIHByaW1pdGl2ZU1vZGU6IFByaW1pdGl2ZU1vZGVFbnVtLFxuICAgIGRyYXdWZXJ0ZXhOdW1iZXJXaXRob3V0RW50aXRpZXM6IG51bWJlcixcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWxcbiAgKSB7XG4gICAgdGhpcy5fcHJpbWl0aXZlTW9kZUZvckJ1ZmZlckxlc3NSZW5kZXJpbmcgPSBwcmltaXRpdmVNb2RlO1xuICAgIHRoaXMuX2RyYXdWZXJ0ZXhOdW1iZXJGb3JCdWZmZXJMZXNzUmVuZGVyaW5nID0gZHJhd1ZlcnRleE51bWJlcldpdGhvdXRFbnRpdGllcztcbiAgICB0aGlzLl9fbWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYgU2V0IHRoaXMgcmVuZGVyIHBhc3MgdG8gYnVmZmVyLWxlc3MgcmVuZGVyaW5nIG1vZGUuXG4gICAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGJ1ZmZlci1sZXNzIHJlbmRlcmluZyBpcyBwZXJmb3JtZWQgb25seSBvbmNlIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdmVydGljZXMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBlLmcuIGZ1bGwtc2NyZWVuIGRyYXdpbmcuXG4gICAqIEluIHRoaXMgY2FzZSwgZXZlbiBpZiBFbnRpdGllcyBhcmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgYWRkRW50aXRpZXMgbWV0aG9kLCB0aGV5IHdpbGwgYmUgaWdub3JlZCBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSBtYXRlcmlhbCBUaGUgbWF0ZXJpYWwgdG8gYmUgdXNlZCBpbiBidWZmZXItbGVzcyByZW5kZXJpbmcuXG4gICAqL1xuICBzZXRCdWZmZXJMZXNzRnVsbFNjcmVlblJlbmRlcmluZyhtYXRlcmlhbDogTWF0ZXJpYWwpIHtcbiAgICB0aGlzLl9wcmltaXRpdmVNb2RlRm9yQnVmZmVyTGVzc1JlbmRlcmluZyA9IFByaW1pdGl2ZU1vZGUuVHJpYW5nbGVzO1xuICAgIHRoaXMuX2RyYXdWZXJ0ZXhOdW1iZXJGb3JCdWZmZXJMZXNzUmVuZGVyaW5nID0gMztcbiAgICB0aGlzLl9fbWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IHJlbmRlclBhc3MgPSBuZXcgUmVuZGVyUGFzcygpO1xuICAgIHJlbmRlclBhc3MuX19lbnRpdGllcyA9IHRoaXMuX19lbnRpdGllcy5jb25jYXQoKTtcbiAgICByZW5kZXJQYXNzLl9fc2NlbmVHcmFwaERpcmVjdGx5QWRkZWQgPSB0aGlzLl9fc2NlbmVHcmFwaERpcmVjdGx5QWRkZWQuY29uY2F0KCk7XG4gICAgcmVuZGVyUGFzcy5fX3RvcExldmVsU2NlbmVHcmFwaENvbXBvbmVudHMgPSB0aGlzLl9fdG9wTGV2ZWxTY2VuZUdyYXBoQ29tcG9uZW50cy5jb25jYXQoKTtcbiAgICByZW5kZXJQYXNzLl9fbWVzaENvbXBvbmVudHMgPSB0aGlzLl9fbWVzaENvbXBvbmVudHMuY29uY2F0KCk7XG4gICAgcmVuZGVyUGFzcy5fX29wdGltaXplZE1lc2hDb21wb25lbnRzID0gdGhpcy5fX29wdGltaXplZE1lc2hDb21wb25lbnRzLmNvbmNhdCgpO1xuICAgIHJlbmRlclBhc3MuX19mcmFtZUJ1ZmZlciA9IHRoaXMuX19mcmFtZUJ1ZmZlcjtcbiAgICByZW5kZXJQYXNzLl9fcmVzb2x2ZUZyYW1lQnVmZmVyID0gdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjtcbiAgICByZW5kZXJQYXNzLl9fcmVzb2x2ZUZyYW1lQnVmZmVyMiA9IHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIyO1xuICAgIHJlbmRlclBhc3MuX192aWV3cG9ydCA9IHRoaXMuX192aWV3cG9ydD8uY2xvbmUoKTtcbiAgICByZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlciA9IHRoaXMudG9DbGVhckNvbG9yQnVmZmVyO1xuICAgIHJlbmRlclBhc3MudG9DbGVhckRlcHRoQnVmZmVyID0gdGhpcy50b0NsZWFyRGVwdGhCdWZmZXI7XG4gICAgcmVuZGVyUGFzcy50b0NsZWFyU3RlbmNpbEJ1ZmZlciA9IHRoaXMudG9DbGVhclN0ZW5jaWxCdWZmZXI7XG4gICAgcmVuZGVyUGFzcy5pc0RlcHRoVGVzdCA9IHRoaXMuaXNEZXB0aFRlc3Q7XG4gICAgcmVuZGVyUGFzcy5jbGVhckNvbG9yID0gdGhpcy5jbGVhckNvbG9yLmNsb25lKCk7XG4gICAgcmVuZGVyUGFzcy5jbGVhckRlcHRoID0gdGhpcy5jbGVhckRlcHRoO1xuICAgIHJlbmRlclBhc3MuY2xlYXJTdGVuY2lsID0gdGhpcy5jbGVhclN0ZW5jaWw7XG4gICAgcmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQgPSB0aGlzLmNhbWVyYUNvbXBvbmVudDtcbiAgICByZW5kZXJQYXNzLl9fbWF0ZXJpYWwgPSB0aGlzLl9fbWF0ZXJpYWw7XG4gICAgcmVuZGVyUGFzcy5fX3ByaW1pdGl2ZU1hdGVyaWFsID0gbmV3IE1hcCh0aGlzLl9fcHJpbWl0aXZlTWF0ZXJpYWwpO1xuICAgIHJlbmRlclBhc3MuaXNWclJlbmRlcmluZyA9IHRoaXMuaXNWclJlbmRlcmluZztcbiAgICByZW5kZXJQYXNzLmlzT3V0cHV0Rm9yVnIgPSB0aGlzLmlzT3V0cHV0Rm9yVnI7XG4gICAgcmVuZGVyUGFzcy5fdG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzID0gdGhpcy5fdG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzO1xuICAgIHJlbmRlclBhc3MuX3RvUmVuZGVyVHJhbnNwYXJlbnRQcmltaXRpdmVzID0gdGhpcy5fdG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXM7XG4gICAgcmVuZGVyUGFzcy5fX3Bvc3RFYWNoUmVuZGVyRnVuYyA9IHRoaXMuX19wb3N0RWFjaFJlbmRlckZ1bmM7XG4gICAgcmVuZGVyUGFzcy5fX3JlbmRlclRhcmdldENvbG9yQXR0YWNobWVudHMgPSB0aGlzLl9fcmVuZGVyVGFyZ2V0Q29sb3JBdHRhY2htZW50cz8uY29uY2F0KCk7XG5cbiAgICByZXR1cm4gcmVuZGVyUGFzcztcbiAgfVxuXG4gIHNldFBvc3RSZW5kZXJGdW5jdGlvbihmdW5jOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fX3Bvc3RFYWNoUmVuZGVyRnVuYyA9IGZ1bmM7XG4gIH1cblxuICBkb1Bvc3RSZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX19wb3N0RWFjaFJlbmRlckZ1bmMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fX3Bvc3RFYWNoUmVuZGVyRnVuYygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZW50aXRpZXMgdG8gZHJhdy5cbiAgICogQHBhcmFtIGVudGl0aWVzIEFuIGFycmF5IG9mIGVudGl0aWVzLlxuICAgKi9cbiAgYWRkRW50aXRpZXMoZW50aXRpZXM6IChJTWVzaEVudGl0eSB8IElTY2VuZUdyYXBoRW50aXR5KVtdKSB7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IHNjZW5lR3JhcGhDb21wb25lbnQgPSBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpO1xuICAgICAgdGhpcy5fX3NjZW5lR3JhcGhEaXJlY3RseUFkZGVkLnB1c2goc2NlbmVHcmFwaENvbXBvbmVudCk7XG4gICAgICBjb25zdCBjb2xsZWN0ZWRTZ0NvbXBvbmVudHMgPSBmbGF0dGVuSGllcmFyY2h5KHNjZW5lR3JhcGhDb21wb25lbnQsIGZhbHNlKTtcbiAgICAgIGNvbnN0IGNvbGxlY3RlZEVudGl0aWVzID0gY29sbGVjdGVkU2dDb21wb25lbnRzLm1hcCgoc2c6IFNjZW5lR3JhcGhDb21wb25lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHNnLmVudGl0eTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbGltaW5hdGUgZHVwbGljYXRlc1xuICAgICAgY29uc3QgbWFwOiBNYXA8RW50aXR5VUlELCBJTWVzaEVudGl0eSB8IElTY2VuZUdyYXBoRW50aXR5PiA9IHRoaXMuX19lbnRpdGllc1xuICAgICAgICAuY29uY2F0KGNvbGxlY3RlZEVudGl0aWVzKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChcbiAgICAgICAgICAgIG1hcDogTWFwPEVudGl0eVVJRCwgSU1lc2hFbnRpdHkgfCBJU2NlbmVHcmFwaEVudGl0eT4sXG4gICAgICAgICAgICBlbnRpdHk6IElNZXNoRW50aXR5IHwgSVNjZW5lR3JhcGhFbnRpdHlcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIG1hcC5zZXQoZW50aXR5LmVudGl0eVVJRCwgZW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgTWFwKClcbiAgICAgICAgKTtcblxuICAgICAgdGhpcy5fX2VudGl0aWVzID0gQXJyYXkuZnJvbShtYXAudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIHRoaXMuX19jYWxjTWVzaENvbXBvbmVudHMoKTtcbiAgICB0aGlzLl9fdG9wTGV2ZWxTY2VuZUdyYXBoQ29tcG9uZW50cyA9IFtdO1xuICAgIHRoaXMuX19jb2xsZWN0VG9wTGV2ZWxTY2VuZUdyYXBoQ29tcG9uZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NhbGNNZXNoQ29tcG9uZW50cygpIHtcbiAgICB0aGlzLl9fbWVzaENvbXBvbmVudHMgPSBbXTtcbiAgICB0aGlzLl9fb3B0aW1pemVkTWVzaENvbXBvbmVudHMgPSBbXTtcbiAgICB0aGlzLl9fY29sbGVjdE1lc2hDb21wb25lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBlbnRpdGllcyBvbiB0aGlzIHJlbmRlciBwYXNzLlxuICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGVudGl0aWVzXG4gICAqL1xuICBnZXQgZW50aXRpZXMoKTogSUVudGl0eVtdIHtcbiAgICByZXR1cm4gdGhpcy5fX2VudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGVudGl0aWVzIG9uIHRoaXMgcmVuZGVyIHBhc3MuXG4gICAqL1xuICBjbGVhckVudGl0aWVzKCkge1xuICAgIHRoaXMuX19tZXNoQ29tcG9uZW50cyA9IFtdO1xuICAgIHRoaXMuX19vcHRpbWl6ZWRNZXNoQ29tcG9uZW50cyA9IFtdO1xuICAgIHRoaXMuX190b3BMZXZlbFNjZW5lR3JhcGhDb21wb25lbnRzID0gW107XG4gICAgdGhpcy5fX2VudGl0aWVzID0gW107XG4gIH1cblxuICBwcml2YXRlIF9fY29sbGVjdFRvcExldmVsU2NlbmVHcmFwaENvbXBvbmVudHMoKSB7XG4gICAgY29uc3QgZ29Ub1RvcExldmVsID0gKHNnOiBTY2VuZUdyYXBoQ29tcG9uZW50KSA9PiB7XG4gICAgICBpZiAoc2cucGFyZW50KSB7XG4gICAgICAgIGdvVG9Ub3BMZXZlbChzZy5wYXJlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNnO1xuICAgIH07XG4gICAgdGhpcy5fX3RvcExldmVsU2NlbmVHcmFwaENvbXBvbmVudHMgPSB0aGlzLl9fc2NlbmVHcmFwaERpcmVjdGx5QWRkZWQubWFwKFxuICAgICAgKHNnOiBTY2VuZUdyYXBoQ29tcG9uZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBnb1RvVG9wTGV2ZWwoc2cpO1xuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLl9fdG9wTGV2ZWxTY2VuZUdyYXBoQ29tcG9uZW50cyk7XG4gICAgdGhpcy5fX3RvcExldmVsU2NlbmVHcmFwaENvbXBvbmVudHMgPSBBcnJheS5mcm9tKHNldCk7XG4gIH1cblxuICBwcml2YXRlIF9fY29sbGVjdE1lc2hDb21wb25lbnRzKCkge1xuICAgIHRoaXMuX19tZXNoQ29tcG9uZW50cyA9IFtdO1xuICAgIHRoaXMuX19vcHRpbWl6ZWRNZXNoQ29tcG9uZW50cyA9IFtdO1xuICAgIHRoaXMuX19lbnRpdGllcy5maWx0ZXIoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgbWVzaENvbXBvbmVudCA9IGVudGl0eS5nZXRDb21wb25lbnRCeUNvbXBvbmVudFRJRChcbiAgICAgICAgV2VsbEtub3duQ29tcG9uZW50VElEcy5NZXNoQ29tcG9uZW50VElEXG4gICAgICApIGFzIE1lc2hDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobWVzaENvbXBvbmVudCAhPSBudWxsICYmIG1lc2hDb21wb25lbnQubWVzaCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXNoQ29tcG9uZW50cyEucHVzaChtZXNoQ29tcG9uZW50KTtcbiAgICAgICAgaWYgKCF0aGlzLl90b1JlbmRlck9wYXF1ZVByaW1pdGl2ZXMgJiYgbWVzaENvbXBvbmVudC5tZXNoLmlzQWxsT3BhcXVlKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl90b1JlbmRlclRyYW5zcGFyZW50UHJpbWl0aXZlcyAmJiBtZXNoQ29tcG9uZW50Lm1lc2guaXNBbGxUcmFuc2x1Y2VudCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19vcHRpbWl6ZWRNZXNoQ29tcG9uZW50cyEucHVzaChtZXNoQ29tcG9uZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBNZXNoQ29tcG9uZW50cyBsaXN0IG9mIHRoZSBlbnRpdGllcyBvbiB0aGlzIHJlbmRlciBwYXNzLlxuICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIE1lc2hDb21wb25lbnRzXG4gICAqL1xuICBnZXQgbWVzaENvbXBvbmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19tZXNoQ29tcG9uZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTWVzaENvbXBvbmVudHMgbGlzdCB0byByZW5kZXJcbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBNZXNoQ29tcG9uZW50c1xuICAgKi9cbiAgZ2V0IF9vcHRpbWl6ZWRNZXNoQ29tcG9uZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fX29wdGltaXplZE1lc2hDb21wb25lbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIGhpZ2hlc3QgbGV2ZWwgU2NlbmVHcmFwaENvbXBvbmVudHMgbGlzdCBvZiB0aGUgZW50aXRpZXMgb24gdGhpcyByZW5kZXIgcGFzcy5cbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBTY2VuZUdyYXBoQ29tcG9uZW50c1xuICAgKi9cbiAgZ2V0IHNjZW5lVG9wTGV2ZWxHcmFwaENvbXBvbmVudHMoKTogU2NlbmVHcmFwaENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fX3RvcExldmVsU2NlbmVHcmFwaENvbXBvbmVudHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGFyZ2V0IGZyYW1lYnVmZmVyIG9mIHRoaXMgcmVuZGVyIHBhc3MuXG4gICAqIElmIHR3byBvciBtb3JlIHJlbmRlciBwYXNzIHNoYXJlIGEgZnJhbWVidWZmZXIsIFJob2Rvbml0ZSByZW5kZXJzIGVudGl0aWVzIHRvIHRoZSBzYW1lIGZyYW1lYnVmZmVyIGluIHRob3NlIHJlbmRlciBwYXNzZXMuXG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlciBBIGZyYW1lYnVmZmVyXG4gICAqL1xuICBzZXRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcj86IEZyYW1lQnVmZmVyKSB7XG4gICAgdGhpcy5fX2ZyYW1lQnVmZmVyID0gZnJhbWVidWZmZXI7XG4gICAgaWYgKGZyYW1lYnVmZmVyICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0Vmlld3BvcnQoVmVjdG9yNC5mcm9tQ29weUFycmF5KFswLCAwLCBmcmFtZWJ1ZmZlci53aWR0aCwgZnJhbWVidWZmZXIuaGVpZ2h0XSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlld3BvcnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0UmVuZGVyVGFyZ2V0Q29sb3JBdHRhY2htZW50cyhpbmRlY2VzPzogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bVtdKSB7XG4gICAgdGhpcy5fX3JlbmRlclRhcmdldENvbG9yQXR0YWNobWVudHMgPSBpbmRlY2VzO1xuICB9XG5cbiAgZ2V0UmVuZGVyVGFyZ2V0Q29sb3JBdHRhY2htZW50cygpOiBSZW5kZXJCdWZmZXJUYXJnZXRFbnVtW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fcmVuZGVyVGFyZ2V0Q29sb3JBdHRhY2htZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmcmFtZWJ1ZmZlciBpZiB0aGlzIHJlbmRlciBwYXNzIGhhcyB0aGUgdGFyZ2V0IGZyYW1lYnVmZmVyLlxuICAgKiBAcmV0dXJuIEEgZnJhbWVidWZmZXJcbiAgICovXG4gIGdldEZyYW1lYnVmZmVyKCk6IEZyYW1lQnVmZmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZyYW1lQnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZXhpc3RpbmcgZnJhbWVidWZmZXJcbiAgICovXG4gIHJlbW92ZUZyYW1lYnVmZmVyKCkge1xuICAgIHRoaXMuX19mcmFtZUJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2aWV3cG9ydCBvZiB0aGlzIHJlbmRlciBwYXNzLlxuICAgKiBAcGFyYW0gdmVjIEEgVmVjdG9yNCAoT3JpZ2luIG9mIGNvb3JkaW5hdGVzWCwgb3JpZ2luIG9mIGNvb3JkaW5hdGVzWSwgd2lkdGgsIGhlaWdodCkuXG4gICAqL1xuICBzZXRWaWV3cG9ydCh2ZWM6IElWZWN0b3I0KSB7XG4gICAgaWYgKHRoaXMuX192aWV3cG9ydCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fdmlld3BvcnQuY29weUNvbXBvbmVudHModmVjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3ZpZXdwb3J0ID0gTXV0YWJsZVZlY3RvcjQuZnJvbUNvcHlBcnJheShbdmVjLngsIHZlYy55LCB2ZWMueiwgdmVjLnddKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmlld3BvcnQgaWYgdGhpcyByZW5kZXIgcGFzcyBoYXMgdGhlIHZpZXdwb3J0LlxuICAgKiBAcmV0dXJuIEEgVmVjdG9yNCAoT3JpZ2luIG9mIGNvb3JkaW5hdGVzWCwgb3JpZ2luIG9mIGNvb3JkaW5hdGVzWSwgd2lkdGgsIGhlaWdodCkuXG4gICAqL1xuICBnZXRWaWV3cG9ydCgpIHtcbiAgICBsZXQgdmlld3BvcnQgPSB0aGlzLl9fdmlld3BvcnQ7XG4gICAgaWYgKHZpZXdwb3J0ICE9IG51bGwpIHtcbiAgICAgIHZpZXdwb3J0ID0gUmVuZGVyUGFzcy5fX3RtcF9WZWN0b3I0XzAuY29weUNvbXBvbmVudHModmlld3BvcnQpO1xuICAgIH1cblxuICAgIHJldHVybiB2aWV3cG9ydDtcbiAgfVxuXG4gIHNldFJlc29sdmVGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcj86IEZyYW1lQnVmZmVyKSB7XG4gICAgdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlciA9IGZyYW1lYnVmZmVyO1xuICB9XG5cbiAgZ2V0UmVzb2x2ZUZyYW1lYnVmZmVyKCk6IEZyYW1lQnVmZmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjtcbiAgfVxuXG4gIHNldFJlc29sdmVGcmFtZWJ1ZmZlcjIoZnJhbWVidWZmZXI/OiBGcmFtZUJ1ZmZlcikge1xuICAgIHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIyID0gZnJhbWVidWZmZXI7XG4gIH1cblxuICBnZXRSZXNvbHZlRnJhbWVidWZmZXIyKCk6IEZyYW1lQnVmZmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjI7XG4gIH1cblxuICBfY29weUZyYW1lYnVmZmVyVG9SZXNvbHZlRnJhbWVidWZmZXJzV2ViR0woKSB7XG4gICAgdGhpcy5fX2NvcHlGcmFtZWJ1ZmZlclRvUmVzb2x2ZUZyYW1lYnVmZmVySW5uZXIodGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcik7XG4gICAgdGhpcy5fX2NvcHlGcmFtZWJ1ZmZlclRvUmVzb2x2ZUZyYW1lYnVmZmVySW5uZXIodGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NvcHlGcmFtZWJ1ZmZlclRvUmVzb2x2ZUZyYW1lYnVmZmVySW5uZXIocmVzb2x2ZUZyYW1lQnVmZmVyPzogRnJhbWVCdWZmZXIpIHtcbiAgICBpZiAocmVzb2x2ZUZyYW1lQnVmZmVyID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVwbyA9IFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgY29uc3Qgd2ViR0xSZXNvdXJjZUZyYW1lQnVmZmVyID0gcmVwby5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgdGhpcy5fX2ZyYW1lQnVmZmVyIS5jZ0FwaVJlc291cmNlVWlkXG4gICAgKSBhcyBXZWJHTEZyYW1lYnVmZmVyO1xuICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXNvbHZlRnJhbWVidWZmZXIgPSByZXBvLmdldFdlYkdMUmVzb3VyY2UoXG4gICAgICByZXNvbHZlRnJhbWVCdWZmZXIhLmNnQXBpUmVzb3VyY2VVaWRcbiAgICApIGFzIFdlYkdMRnJhbWVidWZmZXI7XG5cbiAgICBpZiAod2ViR0xSZXNvdXJjZUZyYW1lQnVmZmVyID09IG51bGwgfHwgd2ViR0xSZXNvdXJjZVJlc29sdmVGcmFtZWJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ2x3ID0gcmVwby5jdXJyZW50V2ViR0xDb250ZXh0V3JhcHBlciE7XG4gICAgY29uc3QgZ2wgPSBnbHcuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLlJFQURfRlJBTUVCVUZGRVIsIHdlYkdMUmVzb3VyY2VGcmFtZUJ1ZmZlcik7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkRSQVdfRlJBTUVCVUZGRVIsIHdlYkdMUmVzb3VyY2VSZXNvbHZlRnJhbWVidWZmZXIpO1xuICAgIGdsLmJsaXRGcmFtZWJ1ZmZlcihcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgdGhpcy5fX2ZyYW1lQnVmZmVyIS53aWR0aCxcbiAgICAgIHRoaXMuX19mcmFtZUJ1ZmZlciEuaGVpZ2h0LFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICByZXNvbHZlRnJhbWVCdWZmZXIhLndpZHRoLFxuICAgICAgcmVzb2x2ZUZyYW1lQnVmZmVyIS5oZWlnaHQsXG4gICAgICBnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCxcbiAgICAgIGdsLk5FQVJFU1RcbiAgICApO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cblxuICBfY29weVJlc29sdmUxVG9SZXNvbHZlMldlYkdwdSgpIHtcbiAgICBpZiAodGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlciA9PSBudWxsIHx8IHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIyID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fcmVzb2x2ZUZyYW1lQnVmZmVyLmNvbG9yQXR0YWNobWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzW2ldID09IG51bGwgfHxcbiAgICAgICAgdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjIuY29sb3JBdHRhY2htZW50c1tpXSA9PSBudWxsIHx8XG4gICAgICAgIHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIuY29sb3JBdHRhY2htZW50c1tpXS5fdGV4dHVyZVJlc291cmNlVWlkID09PSAtMSB8fFxuICAgICAgICB0aGlzLl9fcmVzb2x2ZUZyYW1lQnVmZmVyMi5jb2xvckF0dGFjaG1lbnRzW2ldLl90ZXh0dXJlUmVzb3VyY2VVaWQgPT09IC0xXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIChcbiAgICAgIC8vICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmlzTWlwcG1hcHBlZFRleHR1cmUoXG4gICAgICAvLyAgICAgdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjIuY29sb3JBdHRhY2htZW50c1tpXS5fdGV4dHVyZVJlc291cmNlVWlkXG4gICAgICAvLyAgIClcbiAgICAgIC8vICkge1xuICAgICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmNvcHlUZXh0dXJlRGF0YShcbiAgICAgICAgdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzW2ldLl90ZXh0dXJlUmVzb3VyY2VVaWQsXG4gICAgICAgIHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIyLmNvbG9yQXR0YWNobWVudHNbaV0uX3RleHR1cmVSZXNvdXJjZVVpZFxuICAgICAgKTtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeS5kZWxldGVUZXh0dXJlKFxuICAgICAgLy8gICAgIHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIyLmNvbG9yQXR0YWNobWVudHNbaV0uX3RleHR1cmVSZXNvdXJjZVVpZFxuICAgICAgLy8gICApO1xuICAgICAgLy8gICBbXG4gICAgICAvLyAgICAgdGhpcy5fX3Jlc29sdmVGcmFtZUJ1ZmZlcjIuY29sb3JBdHRhY2htZW50c1tpXS5fdGV4dHVyZVJlc291cmNlVWlkLFxuICAgICAgLy8gICAgIHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIyLmNvbG9yQXR0YWNobWVudHNbaV0uX3RleHR1cmVWaWV3UmVzb3VyY2VVaWQsXG4gICAgICAvLyAgIF0gPSB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuZHVwbGljYXRlVGV4dHVyZUFzTWlwbWFwcGVkKFxuICAgICAgLy8gICAgIHRoaXMuX19yZXNvbHZlRnJhbWVCdWZmZXIuY29sb3JBdHRhY2htZW50c1tpXS5fdGV4dHVyZVJlc291cmNlVWlkXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBtYXRlcmlhbCBmb3IgdGhlIHByaW1pdGl2ZSBvbiB0aGlzIHJlbmRlciBwYXNzLlxuICAgKiBJZiBSaG9kb25pdGUgZHJhdyB0aGUgcHJpbWl0aXZlIHVzaW5nIHRoaXMgcmVuZGVyIHBhc3MsIFJob2Rvbml0ZSB1c2VzIHRoaXMgbWF0ZXJpYWwgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwgb24gdGhlIHByaW1pdGl2ZS5cbiAgICogQHBhcmFtIG1hdGVyaWFsIEEgbWF0ZXJpYWwgYXR0YWNoaW5nIHRvIHRoZSBwcmltaXRpdmVcbiAgICogQHBhcmFtIHByaW1pdGl2ZSBBIHRhcmdldCBwcmltaXRpdmVcbiAgICovXG4gIHNldE1hdGVyaWFsRm9yUHJpbWl0aXZlKG1hdGVyaWFsOiBNYXRlcmlhbCwgcHJpbWl0aXZlOiBQcmltaXRpdmUpIHtcbiAgICB0aGlzLl9fcHJpbWl0aXZlTWF0ZXJpYWwuc2V0KHByaW1pdGl2ZS5vYmplY3RVSUQsIG5ldyBXZWFrUmVmKG1hdGVyaWFsKSk7XG5cbiAgICAvLyB0aGlzLl9fc2V0dXBNYXRlcmlhbChtYXRlcmlhbCwgcHJpbWl0aXZlKTtzXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG1hdGVyaWFsIGZvciBhbGwgdGhlIHByaW1pdGl2ZSBvbiB0aGlzIHJlbmRlciBwYXNzLlxuICAgKiBGb3IgYWxsIHRoZSBwcmltaXRpdmUsIFJob2Rvbml0ZSB1c2VzIHRoaXMgbWF0ZXJpYWwgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwgb24gdGhlIHByaW1pdGl2ZS5cbiAgICogV2hlcmUgaWYgdGhpcyByZW5kZXIgcGFzcyBoYXMgYSBtYXAgYmV0d2VlbiBwcmltaXRpdmUgYW5kIG1hdGVyaWFsIGJ5IHNldE1hdGVyaWFsRm9yUHJpbWl0aXZlLCBSaG9kb25pdGUgdXNlcyB0aGUgbWF0ZXJpYWwgbWFwcGVkIGJ5IHByaW1pdGl2ZS5cbiAgICogQHBhcmFtIG1hdGVyaWFsIEEgbWF0ZXJpYWwgYXR0YWNoaW5nIHRvIHRoZSBwcmltaXRpdmVcbiAgICovXG4gIHNldE1hdGVyaWFsKG1hdGVyaWFsOiBNYXRlcmlhbCkge1xuICAgIHRoaXMuX19tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG4gICAgLy8gdGhpcy5fX3NldHVwTWF0ZXJpYWwobWF0ZXJpYWwpO1xuICB9XG5cbiAgZ2V0IG1hdGVyaWFsKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWF0ZXJpYWw7XG4gIH1cblxuICBfZ2V0TWF0ZXJpYWxPZihwcmltaXRpdmU6IFByaW1pdGl2ZSkge1xuICAgIHJldHVybiB0aGlzLl9fcHJpbWl0aXZlTWF0ZXJpYWwuZ2V0KHByaW1pdGl2ZS5vYmplY3RVSUQpPy5kZXJlZigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2hhc01hdGVyaWFsT2YocHJpbWl0aXZlOiBQcmltaXRpdmUpIHtcbiAgICByZXR1cm4gdGhpcy5fX3ByaW1pdGl2ZU1hdGVyaWFsLmhhcyhwcmltaXRpdmUub2JqZWN0VUlEKTtcbiAgfVxuXG4gIGdldEFwcHJvcHJpYXRlTWF0ZXJpYWwocHJpbWl0aXZlOiBQcmltaXRpdmUpOiBNYXRlcmlhbCB7XG4gICAgbGV0IG1hdGVyaWFsID0gdGhpcy5fZ2V0TWF0ZXJpYWxPZihwcmltaXRpdmUpO1xuXG4gICAgaWYgKG1hdGVyaWFsICE9IG51bGwpIHtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19tYXRlcmlhbCAhPSBudWxsKSB7XG4gICAgICBtYXRlcmlhbCA9IHRoaXMuX19tYXRlcmlhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0ZXJpYWwgPSBwcmltaXRpdmUubWF0ZXJpYWw7XG4gICAgfVxuICAgIHJldHVybiBtYXRlcmlhbDtcbiAgfVxuXG4gIGdldCByZW5kZXJQYXNzVUlEKCkge1xuICAgIHJldHVybiB0aGlzLl9fcmVuZGVyUGFzc1VJRDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2dlb21ldHJ5JztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9taXNjL0lzJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2tpcERyYXdpbmcobWF0ZXJpYWw6IE1hdGVyaWFsLCBwcmltaXRpdmU6IFByaW1pdGl2ZSkge1xuICBpZiAobWF0ZXJpYWwuZ2V0U2hhZGVyUHJvZ3JhbVVpZChwcmltaXRpdmUpID09PSAtMSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVkJPQW5kVkFPKG1lc2g6IE1lc2gpIHtcbiAgY29uc3QgcHJpbWl0aXZlTnVtID0gbWVzaC5nZXRQcmltaXRpdmVOdW1iZXIoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmltaXRpdmVOdW07IGkrKykge1xuICAgIGNvbnN0IHByaW1pdGl2ZSA9IG1lc2guZ2V0UHJpbWl0aXZlQXQoaSk7XG4gICAgaWYgKElzLmV4aXN0KHByaW1pdGl2ZS52ZXJ0ZXhIYW5kbGVzKSkge1xuICAgICAgcHJpbWl0aXZlLnVwZGF0ZTNEQVBJVmVydGV4RGF0YSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmltaXRpdmUuY3JlYXRlM0RBUElWZXJ0ZXhEYXRhKCk7XG4gICAgfVxuICB9XG4gIG1lc2gudXBkYXRlVmFyaWF0aW9uVkJPKCk7XG5cbiAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggIT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICBtZXNoLnVwZGF0ZVZBTygpO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lcyc7XG5leHBvcnQgKiBmcm9tICcuL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vRXhwcmVzc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lJztcbmV4cG9ydCAqIGZyb20gJy4vRnJhbWVCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9SZW5kZXJQYXNzJztcbmV4cG9ydCAqIGZyb20gJy4vUmVuZGVyaW5nQ29tbW9uTWV0aG9kcyc7XG4iLCJpbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgUmVuZGVyYWJsZUhlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvUmVuZGVyYWJsZUhlbHBlcic7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IGFzc2VydEhhcywgSU9wdGlvbiwgTm9uZSwgU29tZSB9IGZyb20gJy4uLy4uL21pc2MvT3B0aW9uJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0N1YmVUZXh0dXJlJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9FeHByZXNzaW9uJztcbmltcG9ydCB7IEZyYW1lIH0gZnJvbSAnLi4vRnJhbWUnO1xuaW1wb3J0IHsgRnJhbWVCdWZmZXIgfSBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi4vUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBNYXRlcmlhbEhlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvTWF0ZXJpYWxIZWxwZXInO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEVyciwgT2sgfSBmcm9tICcuLi8uLi9taXNjL1Jlc3VsdCc7XG5pbXBvcnQgeyBTeXN0ZW0gfSBmcm9tICcuLi8uLi9zeXN0ZW0vU3lzdGVtJztcbmltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50VHlwZSxcbiAgSGRyaUZvcm1hdEVudW0sXG4gIFBpeGVsRm9ybWF0LFxuICBQcm9jZXNzQXBwcm9hY2gsXG4gIFRvbmVNYXBwaW5nVHlwZSxcbiAgVG9uZU1hcHBpbmdUeXBlRW51bSxcbn0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkhlbHBlciwgUmVuZGVyUGFzc0hlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IFNhbXBsZXIgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9TYW1wbGVyJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vc3lzdGVtJztcbmltcG9ydCB7IFJlbmRlclRhcmdldFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcyc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi8uLi8uLi94ci9tYWluJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCB9IGZyb20gJy4uLy4uL2RlZmluaXRpb25zL1RleHR1cmVGb3JtYXQnO1xuXG50eXBlIERyYXdGdW5jID0gKGZyYW1lOiBGcmFtZSkgPT4gdm9pZDtcbnR5cGUgSUJMQ3ViZVRleHR1cmVQYXJhbWV0ZXIgPSB7XG4gIGJhc2VVcmk6IHN0cmluZztcbiAgaXNOYW1lUG9zTmVnOiBib29sZWFuO1xuICBoZHJpRm9ybWF0OiBIZHJpRm9ybWF0RW51bTtcbiAgbWlwbWFwTGV2ZWxOdW1iZXI6IG51bWJlcjtcbn07XG5cbi8qKlxuICogRm9yd2FyZFJlbmRlclBpcGVsaW5lIGlzIGEgb25lIG9mIHJlbmRlciBwaXBlbGluZXNcbiAqXG4gKiBAcmVtYXJrc1xuICogQSByZW5kZXIgcGlwZWxpbmUgaXMgYSBjbGFzcyBvZiBjb21wbGV4IG11bHRpLXBhc3Mgc2V0dXBzIGFscmVhZHkgYnVpbHQgaW4sXG4gKiB3aGljaCBhbGxvd3MgdXNlcnMgdG8gZWFzaWx5IGJlbmVmaXQgZnJvbSBhZHZhbmNlZCBleHByZXNzaW9ucyBzdWNoIGFzIHJlZnJhY3Rpb24gYW5kIE1TQUEuXG4gKiAobGlrZSB0aGUgVVJQIChVbml2ZXJzYWwgUmVuZGVyIFBpcGVsaW5lKSBpbiB0aGUgVW5pdHkgZW5naW5lKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiBjb25zdCBleHByZXNzaW9ucyA9IC4uLjtcbiAqIGNvbnN0IG1hdHJpeCA9IC4uLjtcbiAqIC8vIENyZWF0ZSBhIHJlbmRlciBwaXBlbGluZVxuICogY29uc3QgZm9yd2FyZFJlbmRlclBpcGVsaW5lID0gbmV3IFJuLkZvcndhcmRSZW5kZXJQaXBlbGluZSgpO1xuICogLy8gU2V0IHVwIHRoZSByZW5kZXIgcGlwZWxpbmVcbiAqIGZvcndhcmRSZW5kZXJQaXBlbGluZS5zZXR1cCgxMDI0LCAxMDI0LCB7aXNTaGFkb3c6IHRydWV9KTtcbiAqIC8vIFNldCBleHByZXNzaW9ucyBiZWZvcmUgY2FsbGluZyBvdGhlciBzZXR0ZXIgbWV0aG9kc1xuICogZm9yd2FyZFJlbmRlclBpcGVsaW5lLnNldEV4cHJlc3Npb25zKGV4cHJlc3Npb25zKTtcbiAqIC8vIFNldCBJQkxzXG4gKiBjb25zdCBkaWZmdXNlQ3ViZVRleHR1cmUgPSBuZXcgUm4uQ3ViZVRleHR1cmUoKTtcbiAqIGRpZmZ1c2VDdWJlVGV4dHVyZS5iYXNlVXJpVG9Mb2FkID0gJy4vLi4vLi4vLi4vYXNzZXRzL2libC9wYXBlcm1pbGwvZGlmZnVzZS9kaWZmdXNlJztcbiAqIGRpZmZ1c2VDdWJlVGV4dHVyZS5pc05hbWVQb3NOZWcgPSB0cnVlO1xuICogZGlmZnVzZUN1YmVUZXh0dXJlLmhkcmlGb3JtYXQgPSBSbi5IZHJpRm9ybWF0LlJHQkVfUE5HO1xuICogZGlmZnVzZUN1YmVUZXh0dXJlLm1pcG1hcExldmVsTnVtYmVyID0gMTtcbiAqIGNvbnN0IHNwZWN1bGFyQ3ViZVRleHR1cmUgPSBuZXcgUm4uQ3ViZVRleHR1cmUoKTtcbiAqIHNwZWN1bGFyQ3ViZVRleHR1cmUuYmFzZVVyaVRvTG9hZCA9ICcuLy4uLy4uLy4uL2Fzc2V0cy9pYmwvcGFwZXJtaWxsL3NwZWN1bGFyL3NwZWN1bGFyJztcbiAqIHNwZWN1bGFyQ3ViZVRleHR1cmUuaXNOYW1lUG9zTmVnID0gdHJ1ZTtcbiAqIHNwZWN1bGFyQ3ViZVRleHR1cmUuaGRyaUZvcm1hdCA9IFJuLkhkcmlGb3JtYXQuUkdCRV9QTkc7XG4gKiBzcGVjdWxhckN1YmVUZXh0dXJlLm1pcG1hcExldmVsTnVtYmVyID0gMTA7XG4gKiBmb3J3YXJkUmVuZGVyUGlwZWxpbmUuc2V0SUJMVGV4dHVyZXMoZGlmZnVzZUN1YmVUZXh0dXJlLCBzcGVjdWxhckN1YmVUZXh0dXJlKTtcbiAqIC8vIFNldCBCaWFzVmlld1Byb2plY3Rpb25NYXRyaXggZm9yIFNoYWRvd1xuICogZm9yd2FyZFJlbmRlclBpcGVsaW5lLnNldEJpYXNWaWV3UHJvamVjdGlvbk1hdHJpeEZvclNoYWRvdyhtYXRyaXgpO1xuICogLy8gU3RhcnQgUmVuZGVyIExvb3BcbiAqIGZvcndhcmRSZW5kZXJQaXBlbGluZS5zdGFydFJlbmRlckxvb3AoKGZyYW1lKSA9PiB7XG4gKiAgIFJuLlN5c3RlbS5wcm9jZXNzKGZyYW1lKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J3YXJkUmVuZGVyUGlwZWxpbmUgZXh0ZW5kcyBSbk9iamVjdCB7XG4gIHByaXZhdGUgX193aWR0aCA9IDA7XG4gIHByaXZhdGUgX19oZWlnaHQgPSAwO1xuICBwcml2YXRlIF9faXNTaGFkb3cgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2lzQmxvb20gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2lzU2ltcGxlID0gZmFsc2U7XG4gIHByaXZhdGUgX19zaGFkb3dNYXBTaXplID0gMTAyNDtcbiAgcHJpdmF0ZSBfX29GcmFtZTogSU9wdGlvbjxGcmFtZT4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb0ZyYW1lRGVwdGhNb21lbnQ6IElPcHRpb248RnJhbWVCdWZmZXI+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29GcmFtZUJ1ZmZlck11bHRpVmlldzogSU9wdGlvbjxGcmFtZUJ1ZmZlcj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdDogSU9wdGlvbjxGcmFtZUJ1ZmZlcj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXI6IElPcHRpb248RnJhbWVCdWZmZXI+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29GcmFtZUJ1ZmZlck1zYWE6IElPcHRpb248RnJhbWVCdWZmZXI+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29GcmFtZUJ1ZmZlclJlc29sdmU6IElPcHRpb248RnJhbWVCdWZmZXI+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29GcmFtZUJ1ZmZlclJlc29sdmVGb3JSZWZlcmVuY2U6IElPcHRpb248RnJhbWVCdWZmZXI+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29Jbml0aWFsRXhwcmVzc2lvbjogSU9wdGlvbjxFeHByZXNzaW9uPiA9IG5ldyBOb25lKCk7XG5cbiAgLyoqIG1haW4gZXhwcmVzc2lvbnMgKi9cbiAgcHJpdmF0ZSBfX2V4cHJlc3Npb25zOiBFeHByZXNzaW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9fb0dlbmVyYXRlTWlwbWFwc0V4cHJlc3Npb246IElPcHRpb248RXhwcmVzc2lvbj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb011bHRpVmlld0JsaXRCYWNrQnVmZmVyRXhwcmVzc2lvbjogSU9wdGlvbjxFeHByZXNzaW9uPiA9IG5ldyBOb25lKCk7XG4gIHByaXZhdGUgX19vTXVsdGlWaWV3QmxpdEV4cHJlc3Npb246IElPcHRpb248RXhwcmVzc2lvbj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fZGVwdGhNb21lbnRFeHByZXNzaW9uczogRXhwcmVzc2lvbltdID0gW107XG4gIHByaXZhdGUgX19vQmxvb21FeHByZXNzaW9uOiBJT3B0aW9uPEV4cHJlc3Npb24+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29Ub25lTWFwcGluZ0V4cHJlc3Npb246IElPcHRpb248RXhwcmVzc2lvbj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb1RvbmVNYXBwaW5nTWF0ZXJpYWw6IElPcHRpb248TWF0ZXJpYWw+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX3RyYW5zcGFyZW50T25seUV4cHJlc3Npb25zOiBFeHByZXNzaW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfX29XZWJYUlN5c3RlbTogSU9wdGlvbjxhbnk+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29EcmF3RnVuYzogSU9wdGlvbjxEcmF3RnVuYz4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb0RpZmZ1c2VDdWJlVGV4dHVyZTogSU9wdGlvbjxDdWJlVGV4dHVyZT4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb1NwZWN1bGFyQ3ViZVRleHR1cmU6IElPcHRpb248Q3ViZVRleHR1cmU+ID0gbmV3IE5vbmUoKTtcbiAgcHJpdmF0ZSBfX29TYW1wbGVyRm9yQmFja0J1ZmZlcjogSU9wdGlvbjxTYW1wbGVyPiA9IG5ldyBOb25lKCk7XG4gIHByaXZhdGUgX190b25lTWFwcGluZ1R5cGUgPSBUb25lTWFwcGluZ1R5cGUuR1RfVG9uZU1hcDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2Rlc3Ryb3lSZXNvdXJjZXMoKSB7XG4gICAgaWYgKHRoaXMuX19vRnJhbWVEZXB0aE1vbWVudC5oYXMoKSkge1xuICAgICAgdGhpcy5fX29GcmFtZURlcHRoTW9tZW50LmdldCgpLmRlc3Ryb3kzREFQSVJlc291cmNlcygpO1xuICAgICAgdGhpcy5fX29GcmFtZURlcHRoTW9tZW50ID0gbmV3IE5vbmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXcuaGFzKCkpIHtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXcuZ2V0KCkuZGVzdHJveTNEQVBJUmVzb3VyY2VzKCk7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3ID0gbmV3IE5vbmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXdCbGl0LmhhcygpKSB7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdC5nZXQoKS5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXdCbGl0ID0gbmV3IE5vbmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNc2FhLmhhcygpKSB7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXNhYS5nZXQoKS5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNc2FhID0gbmV3IE5vbmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlLmhhcygpKSB7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZS5nZXQoKS5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlID0gbmV3IE5vbmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlRm9yUmVmZXJlbmNlLmhhcygpKSB7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZS5nZXQoKS5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlRm9yUmVmZXJlbmNlID0gbmV3IE5vbmUoKTtcbiAgICB9XG4gICAgdGhpcy5fX29GcmFtZSA9IG5ldyBOb25lKCk7XG4gICAgdGhpcy5fX29HZW5lcmF0ZU1pcG1hcHNFeHByZXNzaW9uID0gbmV3IE5vbmUoKTtcbiAgICB0aGlzLl9fb011bHRpVmlld0JsaXRFeHByZXNzaW9uID0gbmV3IE5vbmUoKTtcbiAgICB0aGlzLl9fb0Jsb29tRXhwcmVzc2lvbiA9IG5ldyBOb25lKCk7XG4gICAgdGhpcy5fX29Ub25lTWFwcGluZ0V4cHJlc3Npb24gPSBuZXcgTm9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNhbnZhc1dpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjYW52YXMuXG4gICAqIEBwYXJhbSBjYW52YXNIZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBjYW52YXMuXG4gICAqL1xuICBhc3luYyBzZXR1cChcbiAgICBjYW52YXNXaWR0aDogbnVtYmVyLFxuICAgIGNhbnZhc0hlaWdodDogbnVtYmVyLFxuICAgIHsgaXNTaGFkb3cgPSBmYWxzZSwgaXNCbG9vbSA9IGZhbHNlLCBzaGFkb3dNYXBTaXplID0gMTAyNCwgaXNTaW1wbGUgPSBmYWxzZSB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fX3dpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgdGhpcy5fX2hlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICB0aGlzLl9faXNCbG9vbSA9IGlzQmxvb207XG4gICAgdGhpcy5fX2lzU2hhZG93ID0gaXNTaGFkb3c7XG4gICAgdGhpcy5fX2lzU2ltcGxlID0gaXNTaW1wbGU7XG4gICAgdGhpcy5fX3NoYWRvd01hcFNpemUgPSBzaGFkb3dNYXBTaXplO1xuICAgIGlmICh0aGlzLl9fb0ZyYW1lLmhhcygpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgIG1lc3NhZ2U6ICdBbHJlYWR5IHNldHVwJyxcbiAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNGcmFtZSA9IG5ldyBTb21lKG5ldyBGcmFtZSgpKTtcbiAgICB0aGlzLl9fb0ZyYW1lID0gc0ZyYW1lO1xuXG4gICAgaWYgKCF0aGlzLl9faXNTaW1wbGUpIHtcbiAgICAgIHRoaXMuX19vU2FtcGxlckZvckJhY2tCdWZmZXIgPSBuZXcgU29tZShcbiAgICAgICAgbmV3IFNhbXBsZXIoe1xuICAgICAgICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyLlJlcGVhdCxcbiAgICAgICAgICB3cmFwVDogVGV4dHVyZVBhcmFtZXRlci5SZXBlYXQsXG4gICAgICAgICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhck1pcG1hcExpbmVhcixcbiAgICAgICAgICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX19vU2FtcGxlckZvckJhY2tCdWZmZXIudW53cmFwRm9yY2UoKS5jcmVhdGUoKTtcblxuICAgICAgLy8gY3JlYXRlIEZyYW1lIEJ1ZmZlcnNcbiAgICAgIHRoaXMuX19jcmVhdGVSZW5kZXJUYXJnZXRzKGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQpO1xuXG4gICAgICAvLyBkZXB0aCBtb21lbnQgRnJhbWVCdWZmZXJcbiAgICAgIGlmIChpc1NoYWRvdyAmJiAhdGhpcy5fX2lzU2ltcGxlKSB7XG4gICAgICAgIHRoaXMuX19vRnJhbWVEZXB0aE1vbWVudCA9IHRoaXMuX19zZXR1cERlcHRoTW9tZW50RnJhbWVidWZmZXIoc2hhZG93TWFwU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZS5oYXMoKSkge1xuICAgICAgICAvLyBnZW5lcmF0ZSBtaXBtYXBzIGZvciBwcm9jZXNzIEtIUl9tYXRlcmlhbHNfdHJhbnNtaXR0YW5jZVxuICAgICAgICB0aGlzLl9fb0dlbmVyYXRlTWlwbWFwc0V4cHJlc3Npb24gPSB0aGlzLl9fc2V0dXBHZW5lcmF0ZU1pcG1hcHNFeHByZXNzaW9uKFxuICAgICAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlRm9yUmVmZXJlbmNlLnVud3JhcEZvcmNlKClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXcuaGFzKCkpIHtcbiAgICAgICAgLy8gTWFrZSBCbGl0IEV4cHJlc3Npb24gaWYgVlIgTXVsdGlWaWV3IGlzIGVuYWJsZWRcbiAgICAgICAgdGhpcy5fX29NdWx0aVZpZXdCbGl0QmFja0J1ZmZlckV4cHJlc3Npb24gPSB0aGlzLl9fc2V0dXBNdWx0aVZpZXdCbGl0QmFja0J1ZmZlckV4cHJlc3Npb24oXG4gICAgICAgICAgdGhpcy5fX29GcmFtZUJ1ZmZlck11bHRpVmlldy51bndyYXBGb3JjZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX19vTXVsdGlWaWV3QmxpdEV4cHJlc3Npb24gPSB0aGlzLl9fc2V0dXBNdWx0aVZpZXdCbGl0RXhwcmVzc2lvbihcbiAgICAgICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3LnVud3JhcEZvcmNlKClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRvbmVNYXBwaW5nVGFyZ2V0UmVuZGVyVGFyZ2V0VGV4dHVyZTogUmVuZGVyVGFyZ2V0VGV4dHVyZSA9XG4gICAgICAgIHRoaXMuX19nZXRNYWluRnJhbWVCdWZmZXJSZXNvbHZlKCkudW53cmFwRm9yY2UoKS5nZXRDb2xvckF0dGFjaGVkUmVuZGVyVGFyZ2V0VGV4dHVyZSgwKSE7XG5cbiAgICAgIC8vIEJsb29tIEV4cHJlc3Npb25cbiAgICAgIGlmIChpc0Jsb29tICYmICF0aGlzLl9faXNTaW1wbGUpIHtcbiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXJUb0Jsb29tID0gdGhpcy5fX2dldE1haW5GcmFtZUJ1ZmZlclJlc29sdmUoKTtcbiAgICAgICAgY29uc3QgdGV4dHVyZVRvQmxvb20gPSBmcmFtZUJ1ZmZlclRvQmxvb21cbiAgICAgICAgICAudW53cmFwRm9yY2UoKVxuICAgICAgICAgIC5nZXRDb2xvckF0dGFjaGVkUmVuZGVyVGFyZ2V0VGV4dHVyZSgwKSBhcyB1bmtub3duIGFzIFJlbmRlclRhcmdldFRleHR1cmU7XG4gICAgICAgIGNvbnN0IHsgYmxvb21FeHByZXNzaW9uLCBibG9vbWVkUmVuZGVyVGFyZ2V0IH0gPSBFeHByZXNzaW9uSGVscGVyLmNyZWF0ZUJsb29tRXhwcmVzc2lvbih7XG4gICAgICAgICAgdGV4dHVyZVRvQmxvb20sXG4gICAgICAgICAgcGFyYW1ldGVyczoge30sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9fb0Jsb29tRXhwcmVzc2lvbiA9IG5ldyBTb21lKGJsb29tRXhwcmVzc2lvbik7XG4gICAgICAgIHRvbmVNYXBwaW5nVGFyZ2V0UmVuZGVyVGFyZ2V0VGV4dHVyZSA9IGJsb29tZWRSZW5kZXJUYXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvbmVNYXBwaW5nIEV4cHJlc3Npb25cbiAgICAgIGNvbnN0IHRvbmVNYXBwaW5nRXhwcmVzc2lvbiA9IHRoaXMuX19zZXR1cFRvbmVNYXBwaW5nRXhwcmVzc2lvbihcbiAgICAgICAgdG9uZU1hcHBpbmdUYXJnZXRSZW5kZXJUYXJnZXRUZXh0dXJlXG4gICAgICApO1xuICAgICAgdGhpcy5fX29Ub25lTWFwcGluZ0V4cHJlc3Npb24gPSBuZXcgU29tZSh0b25lTWFwcGluZ0V4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWwgRXhwcmVzc2lvblxuICAgIGNvbnN0IGluaXRpYWxFeHByZXNzaW9uID0gdGhpcy5fX3NldHVwSW5pdGlhbEV4cHJlc3Npb24odGhpcy5fX29GcmFtZURlcHRoTW9tZW50KTtcbiAgICB0aGlzLl9fb0luaXRpYWxFeHByZXNzaW9uID0gbmV3IFNvbWUoaW5pdGlhbEV4cHJlc3Npb24pO1xuXG4gICAgY29uc3Qgcm5YUk1vZHVsZSA9IGF3YWl0IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGUoJ3hyJyk7XG4gICAgaWYgKElzLmV4aXN0KHJuWFJNb2R1bGUpKSB7XG4gICAgICB0aGlzLl9fb1dlYlhSU3lzdGVtID0gbmV3IFNvbWUocm5YUk1vZHVsZS5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX2V4cHJlc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2V0RXhwcmVzc2lvbnModGhpcy5fX2V4cHJlc3Npb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE9rKCk7XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0TWFpbkZyYW1lQnVmZmVyQmFja0J1ZmZlcigpOiBJT3B0aW9uPEZyYW1lQnVmZmVyPiB7XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXcuaGFzKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0TWFpbkZyYW1lQnVmZmVyUmVzb2x2ZSgpOiBJT3B0aW9uPEZyYW1lQnVmZmVyPiB7XG4gICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXcuaGFzKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19nZXRNYWluRnJhbWVCdWZmZXIoKTogSU9wdGlvbjxGcmFtZUJ1ZmZlcj4ge1xuICAgIGlmICh0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3LmhhcygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX29GcmFtZUJ1ZmZlck11bHRpVmlldztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX19vRnJhbWVCdWZmZXJNc2FhO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogc2V0IEV4cHJlc3Npb25zIGZvciBkcmF3aW5nXG4gICAqIEBwYXJhbSBleHByZXNzaW9ucyAtIGV4cHJlc3Npb25zIHRvIGRyYXdcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHVibGljIHNldEV4cHJlc3Npb25zKFxuICAgIGV4cHJlc3Npb25zOiBFeHByZXNzaW9uW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgaXNUcmFuc21pc3Npb246IGJvb2xlYW47XG4gICAgfSA9IHtcbiAgICAgIGlzVHJhbnNtaXNzaW9uOiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgLy8gY29uc3QgZXhwcmVzc2lvbnNPcGFxdWUgPSBleHByZXNzaW9ucy5tYXAoKGV4cHJlc3Npb24pID0+IGV4cHJlc3Npb24uY2xvbmUoKSk7XG4gICAgY29uc3QgZXhwcmVzc2lvbnNUcmFuc2x1Y2VudCA9IGV4cHJlc3Npb25zLm1hcCgoZXhwcmVzc2lvbikgPT4gZXhwcmVzc2lvbi5jbG9uZSgpKTtcbiAgICB0aGlzLl9fc2V0RXhwcmVzc2lvbnNJbm5lcihleHByZXNzaW9ucywge1xuICAgICAgaXNUcmFuc21pc3Npb246IG9wdGlvbnMuaXNUcmFuc21pc3Npb24sXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNUcmFuc21pc3Npb24pIHtcbiAgICAgIHRoaXMuX19zZXRUcmFuc3BhcmVudEV4cHJlc3Npb25zRm9yVHJhbnNtaXNzaW9uKGV4cHJlc3Npb25zVHJhbnNsdWNlbnQpO1xuICAgIH1cblxuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoICE9PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICBpZiAodGhpcy5fX29GcmFtZURlcHRoTW9tZW50LmhhcygpKSB7XG4gICAgICAgIHRoaXMuX19zZXREZXB0aFRleHR1cmVUb0VudGl0eU1hdGVyaWFscygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19zZXREZXB0aFRleHR1cmVUb0VudGl0eU1hdGVyaWFscygpIHtcbiAgICBpZiAoSXMuZmFsc2UodGhpcy5fX2lzU2hhZG93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvcHkgZXhwcmVzc2lvbnMgYXMgZGVwdGggbW9tZW50IGV4cHJlc3Npb25zXG4gICAgdGhpcy5fX2RlcHRoTW9tZW50RXhwcmVzc2lvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5fX2V4cHJlc3Npb25zKSB7XG4gICAgICB0aGlzLl9fZGVwdGhNb21lbnRFeHByZXNzaW9ucy5wdXNoKGV4cHJlc3Npb24uY2xvbmUoKSk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGRlcHRoIG1vbWVudCBlbmNvZGUgbWF0ZXJpYWxcbiAgICBjb25zdCBkZXB0aE1vbWVudE1hdGVyaWFsID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlRGVwdGhNb21lbnRFbmNvZGVNYXRlcmlhbCgpO1xuXG4gICAgLy8gc2V0dXAgZGVwdGggbW9tZW50IGV4cHJlc3Npb25cbiAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5fX2RlcHRoTW9tZW50RXhwcmVzc2lvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVuZGVyUGFzcyBvZiBleHByZXNzaW9uLnJlbmRlclBhc3Nlcykge1xuICAgICAgICAvLyBEcmF3IG9wYXF1ZSBwcmltaXRpdmVzIHRvIGRlcHRoIG1vbWVudCBGcmFtZUJ1ZmZlclxuICAgICAgICByZW5kZXJQYXNzLnNldEZyYW1lYnVmZmVyKHRoaXMuX19vRnJhbWVEZXB0aE1vbWVudC51bndyYXBGb3JjZSgpKTtcbiAgICAgICAgcmVuZGVyUGFzcy5zZXRSZXNvbHZlRnJhbWVidWZmZXIodW5kZWZpbmVkKTtcbiAgICAgICAgcmVuZGVyUGFzcy5zZXRSZXNvbHZlRnJhbWVidWZmZXIyKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbmRlclBhc3MudG9DbGVhckNvbG9yQnVmZmVyID0gdHJ1ZTtcbiAgICAgICAgcmVuZGVyUGFzcy50b0NsZWFyRGVwdGhCdWZmZXIgPSB0cnVlO1xuICAgICAgICAvLyBObyBuZWVkIHRvIHJlbmRlciB0cmFuc3BhcmVudCBwcmltaXRpdmVzIHRvIGRlcHRoIGJ1ZmZlci5cbiAgICAgICAgcmVuZGVyUGFzcy5zZXRUb1JlbmRlclRyYW5zcGFyZW50UHJpbWl0aXZlcyhmYWxzZSk7XG5cbiAgICAgICAgcmVuZGVyUGFzcy5zZXRNYXRlcmlhbChkZXB0aE1vbWVudE1hdGVyaWFsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgZGVwdGggbW9tZW50IHRleHR1cmUgdG8gZW50aXR5IG1hdGVyaWFscyBpbiBtYWluIGV4cHJlc3Npb25zXG4gICAgY29uc3Qgc2FtcGxlciA9IG5ldyBTYW1wbGVyKHtcbiAgICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlLFxuICAgICAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXIuQ2xhbXBUb0VkZ2UsXG4gICAgICBtaW5GaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhcixcbiAgICAgIGFuaXNvdHJvcHk6IGZhbHNlLFxuICAgIH0pO1xuICAgIHNhbXBsZXIuY3JlYXRlKCk7XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuX19leHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0aWVzID0gcmVuZGVyUGFzcy5lbnRpdGllcztcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gZW50aXR5LnRyeVRvR2V0TWVzaCgpO1xuICAgICAgICAgIGlmIChJcy5leGlzdChtZXNoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbWVzaCA9IG1lc2hDb21wb25lbnQubWVzaDtcbiAgICAgICAgICAgIGlmIChJcy5leGlzdChtZXNoKSkge1xuICAgICAgICAgICAgICBjb25zdCBwcmltaXRpdmVzID0gbWVzaC5wcmltaXRpdmVzO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZSBvZiBwcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBwcmltaXRpdmUubWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgICAgICAgICAgICdkZXB0aFRleHR1cmUnLFxuICAgICAgICAgICAgICAgICAgdGhpcy5fX29GcmFtZURlcHRoTW9tZW50LnVud3JhcEZvcmNlKCkuZ2V0Q29sb3JBdHRhY2hlZFJlbmRlclRhcmdldFRleHR1cmUoMCkhLFxuICAgICAgICAgICAgICAgICAgc2FtcGxlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhpcy5fX3NldERlcHRoTW9tZW50UmVuZGVyUGFzc2VzQW5kRGVwdGhUZXh0dXJlVG9FbnRpdHlNYXRlcmlhbHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCByZW5kZXJpbmcgbG9vcFxuICAgKiBAcGFyYW0gZnVuYyAtIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmcmFtZSBpcyByZW5kZXJlZFxuICAgKiBAcmV0dXJucyBSblJlc3VsdFxuICAgKi9cbiAgc3RhcnRSZW5kZXJMb29wKGZ1bmM6IChmcmFtZTogRnJhbWUpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy5fX29GcmFtZS5kb2VzTm90SGF2ZSgpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycih7XG4gICAgICAgIG1lc3NhZ2U6ICdub3QgaW5pdGlhbGl6ZWQuJyxcbiAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX19vRHJhd0Z1bmMgPSBuZXcgU29tZShmdW5jKTtcblxuICAgIFN5c3RlbS5zdGFydFJlbmRlckxvb3AoKCkgPT4ge1xuICAgICAgdGhpcy5fX3NldEV4cHJlc3Npb25zKCk7XG4gICAgICBmdW5jKHRoaXMuX19vRnJhbWUudW53cmFwRm9yY2UoKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IE9rKCk7XG4gIH1cblxuICAvKipcbiAgICogZHJhdyB3aXRoIHRoZSBnaXZlbiBmdW5jdGlvbiBpbiBzdGFydFJlbmRlckxvb3AgbWV0aG9kXG4gICAqL1xuICBkcmF3KCkge1xuICAgIHRoaXMuX19vRHJhd0Z1bmMudW53cmFwRm9yY2UoKSh0aGlzLl9fb0ZyYW1lLnVud3JhcEZvcmNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZSBzY3JlZW5cbiAgICogQHBhcmFtIHdpZHRoIC0gd2lkdGggb2YgdGhlIHNjcmVlblxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gaGVpZ2h0IG9mIHRoZSBzY3JlZW5cbiAgICogQHJldHVybnMgUm5SZXN1bHRcbiAgICovXG4gIHJlc2l6ZSh3aWR0aDogU2l6ZSwgaGVpZ2h0OiBTaXplKSB7XG4gICAgaWYgKHRoaXMuX19vRnJhbWUuZG9lc05vdEhhdmUoKSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnIoe1xuICAgICAgICBtZXNzYWdlOiAnbm90IGluaXRpYWxpemVkLicsXG4gICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgd2ViWFJTeXN0ZW0gPSB0aGlzLl9fb1dlYlhSU3lzdGVtLnVud3JhcE9yVW5kZWZpbmVkKCk7XG4gICAgaWYgKElzLmV4aXN0KHdlYlhSU3lzdGVtKSAmJiB3ZWJYUlN5c3RlbS5pc1dlYlhSTW9kZSkge1xuICAgICAgd2lkdGggPSB3ZWJYUlN5c3RlbS5nZXRDYW52YXNXaWR0aEZvclZyKCk7XG4gICAgICBoZWlnaHQgPSB3ZWJYUlN5c3RlbS5nZXRDYW52YXNIZWlnaHRGb3JWcigpO1xuICAgIH1cbiAgICBTeXN0ZW0ucmVzaXplQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgdGhpcy5fX2Rlc3Ryb3lSZXNvdXJjZXMoKTtcbiAgICB0aGlzLnNldHVwKHdpZHRoLCBoZWlnaHQsIHtcbiAgICAgIGlzU2hhZG93OiB0aGlzLl9faXNTaGFkb3csXG4gICAgICBpc0Jsb29tOiB0aGlzLl9faXNCbG9vbSxcbiAgICAgIHNoYWRvd01hcFNpemU6IHRoaXMuX19zaGFkb3dNYXBTaXplLFxuICAgICAgaXNTaW1wbGU6IHRoaXMuX19pc1NpbXBsZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgT2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgSUJMIGN1YmUgdGV4dHVyZXNcbiAgICogQHBhcmFtIGRpZmZ1c2UgLSBkaWZmdXNlIElCTCBDdWJlIFRleHR1cmVcbiAgICogQHBhcmFtIHNwZWN1bGFyIC0gc3BlY3VsYXIgSUJMIEN1YmUgVGV4dHVyZVxuICAgKi9cbiAgYXN5bmMgc2V0SUJMVGV4dHVyZXMoZGlmZnVzZTogQ3ViZVRleHR1cmUsIHNwZWN1bGFyOiBDdWJlVGV4dHVyZSkge1xuICAgIHRoaXMuX19vRGlmZnVzZUN1YmVUZXh0dXJlID0gbmV3IFNvbWUoZGlmZnVzZSk7XG4gICAgdGhpcy5fX29TcGVjdWxhckN1YmVUZXh0dXJlID0gbmV3IFNvbWUoc3BlY3VsYXIpO1xuICAgIGF3YWl0IHRoaXMuX19zZXRJYmxJbm5lcigpO1xuICAgIGF3YWl0IHRoaXMuX19zZXRJYmxJbm5lckZvclRyYW5zcGFyZW50T25seSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldHRlciBvZiBpbml0aWFsIGV4cHJlc3Npb25cbiAgICovXG4gIGdldEluaXRpYWxFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9fb0luaXRpYWxFeHByZXNzaW9uLnVud3JhcE9yVW5kZWZpbmVkKCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0dGVyIG9mIFRvbmVNYXBwaW5nIGV4cHJlc3Npb25cbiAgICovXG4gIGdldFRvbmVNYXBwaW5nRXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fX29Ub25lTWFwcGluZ0V4cHJlc3Npb24udW53cmFwT3JVbmRlZmluZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgZGlmZnVzZSBJQkwgY29udHJpYnV0aW9uXG4gICAqIEBwYXJhbSB2YWx1ZSAtIDAuMCB+IDEuMCBvciBncmVhdGVyXG4gICAqL1xuICBzZXREaWZmdXNlSUJMQ29udHJpYnV0aW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5fX2V4cHJlc3Npb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgZXhwcmVzc2lvbi5yZW5kZXJQYXNzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgcmVuZGVyUGFzcy5lbnRpdGllcykge1xuICAgICAgICAgIGNvbnN0IG1lc2hSZW5kZXJlckNvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldE1lc2hSZW5kZXJlcigpO1xuICAgICAgICAgIGlmIChJcy5leGlzdChtZXNoUmVuZGVyZXJDb21wb25lbnQpKSB7XG4gICAgICAgICAgICBtZXNoUmVuZGVyZXJDb21wb25lbnQuZGlmZnVzZUN1YmVNYXBDb250cmlidXRpb24gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuX190cmFuc3BhcmVudE9ubHlFeHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHJlbmRlclBhc3MuZW50aXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtZXNoUmVuZGVyZXJDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRNZXNoUmVuZGVyZXIoKTtcbiAgICAgICAgICBpZiAoSXMuZXhpc3QobWVzaFJlbmRlcmVyQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgbWVzaFJlbmRlcmVyQ29tcG9uZW50LmRpZmZ1c2VDdWJlTWFwQ29udHJpYnV0aW9uID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCBzcGVjdWxhciBJQkwgY29udHJpYnV0aW9uXG4gICAqIEBwYXJhbSB2YWx1ZSAtIDAuMCB+IDEuMCBvciBncmVhdGVyXG4gICAqL1xuICBzZXRTcGVjdWxhcklCTENvbnRyaWJ1dGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuX19leHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHJlbmRlclBhc3MuZW50aXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtZXNoUmVuZGVyZXJDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRNZXNoUmVuZGVyZXIoKTtcbiAgICAgICAgICBpZiAoSXMuZXhpc3QobWVzaFJlbmRlcmVyQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgbWVzaFJlbmRlcmVyQ29tcG9uZW50LnNwZWN1bGFyQ3ViZU1hcENvbnRyaWJ1dGlvbiA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5fX3RyYW5zcGFyZW50T25seUV4cHJlc3Npb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgZXhwcmVzc2lvbi5yZW5kZXJQYXNzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgcmVuZGVyUGFzcy5lbnRpdGllcykge1xuICAgICAgICAgIGNvbnN0IG1lc2hSZW5kZXJlckNvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldE1lc2hSZW5kZXJlcigpO1xuICAgICAgICAgIGlmIChJcy5leGlzdChtZXNoUmVuZGVyZXJDb21wb25lbnQpKSB7XG4gICAgICAgICAgICBtZXNoUmVuZGVyZXJDb21wb25lbnQuc3BlY3VsYXJDdWJlTWFwQ29udHJpYnV0aW9uID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgcm90YXRpb24gb2YgSUJMXG4gICAqIEBwYXJhbSByYWRpYW4gLSByb3RhdGlvbiBpbiByYWRpYW5cbiAgICovXG4gIHNldElCTFJvdGF0aW9uKHJhZGlhbjogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuX19leHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHJlbmRlclBhc3MuZW50aXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtZXNoUmVuZGVyZXJDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRNZXNoUmVuZGVyZXIoKTtcbiAgICAgICAgICBpZiAoSXMuZXhpc3QobWVzaFJlbmRlcmVyQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgbWVzaFJlbmRlcmVyQ29tcG9uZW50LnJvdGF0aW9uT2ZDdWJlTWFwID0gcmFkaWFuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldENhbWVyYUNvbXBvbmVudE9mTGlnaHQoY2FtZXJhQ29tcG9uZW50OiBDYW1lcmFDb21wb25lbnQpIHtcbiAgICBpZiAodGhpcy5fX2lzU2hhZG93KSB7XG4gICAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5fX2RlcHRoTW9tZW50RXhwcmVzc2lvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgICAgcmVuZGVyUGFzcy5jYW1lcmFDb21wb25lbnQgPSBjYW1lcmFDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiB0aGlzLl9fZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1hcnJvdy1jYWxsYmFja1xuICAgICAgICAgIHJlbmRlclBhc3Muc2V0UG9zdFJlbmRlckZ1bmN0aW9uKGZ1bmN0aW9uICh0aGlzOiBSZW5kZXJQYXNzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdGllcyA9IHJlbmRlclBhc3MuZW50aXRpZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICAgICAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gZW50aXR5LnRyeVRvR2V0TWVzaCgpO1xuICAgICAgICAgICAgICBpZiAoSXMuZXhpc3QobWVzaENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNoID0gbWVzaENvbXBvbmVudC5tZXNoO1xuICAgICAgICAgICAgICAgIGlmIChJcy5leGlzdChtZXNoKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJpbWl0aXZlcyA9IG1lc2gucHJpbWl0aXZlcztcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlIG9mIHByaW1pdGl2ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBwcmltaXRpdmUubWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFBhcmFtZXRlcignZGVwdGhCaWFzUFYnLCBjYW1lcmFDb21wb25lbnQuYmlhc1ZpZXdQcm9qZWN0aW9uTWF0cml4KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19zZXRFeHByZXNzaW9uc0lubmVyKFxuICAgIGV4cHJlc3Npb25zOiBFeHByZXNzaW9uW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgaXNUcmFuc21pc3Npb246IGJvb2xlYW47XG4gICAgfSA9IHtcbiAgICAgIGlzVHJhbnNtaXNzaW9uOiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIGV4cHJlc3Npb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHJwIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgIHJwLnNldFRvUmVuZGVyT3BhcXVlUHJpbWl0aXZlcyh0cnVlKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNUcmFuc21pc3Npb24pIHtcbiAgICAgICAgICAvLyBpZiBvcHRpb25zLmlzVHJhbnNtaXNzaW9uIGlzIHRydWUsIHNldCB0b1JlbmRlclRyYW5zcGFyZW50UHJpbWl0aXZlcyB0byBmYWxzZSxcbiAgICAgICAgICAvLyBiZWNhdXNlIHRyYW5zcGFyZW50IHByaW1pdGl2ZXMgYXJlIHJlbmRlcmVkIGluIGxhdGVyIGV4cHJlc3Npb24uXG4gICAgICAgICAgcnAuc2V0VG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXMoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIG9wdGlvbnMuaXNUcmFuc21pc3Npb24gaXMgZmFsc2UsIHNldCB0b1JlbmRlclRyYW5zcGFyZW50UHJpbWl0aXZlcyB0byB0cnVlLlxuICAgICAgICAgIC8vIGJlY2F1c2UgdHJhbnNwYXJlbnQgcHJpbWl0aXZlcyBhcmUgcmVuZGVyZWQgaW4gdGhpcyBleHByZXNzaW9uIGFzIHdlbGwgYXMgb3BhcXVlIHByaW1pdGl2ZXMuXG4gICAgICAgICAgcnAuc2V0VG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXModHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhcmluZyBkZXB0aCBpcyBkb25lIGluIGluaXRpYWwgZXhwcmVzc2lvbi4gc28gbm8gbmVlZCB0byBjbGVhciBkZXB0aCBpbiB0aGlzIHJlbmRlciBwYXNzLlxuICAgICAgICBycC50b0NsZWFyRGVwdGhCdWZmZXIgPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLl9faXNTaW1wbGUpIHtcbiAgICAgICAgICBjb25zdCBtYWluRnJhbWVCdWZmZXIgPSB0aGlzLl9fZ2V0TWFpbkZyYW1lQnVmZmVyKCk7XG4gICAgICAgICAgaWYgKG1haW5GcmFtZUJ1ZmZlci5oYXMoKSkge1xuICAgICAgICAgICAgcnAuc2V0RnJhbWVidWZmZXIobWFpbkZyYW1lQnVmZmVyLmdldCgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9fb0ZyYW1lQnVmZmVyTXNhYS5oYXMoKSkge1xuICAgICAgICAgICAgICBycC5zZXRSZXNvbHZlRnJhbWVidWZmZXIodGhpcy5fX29GcmFtZUJ1ZmZlclJlc29sdmUudW53cmFwRm9yY2UoKSk7XG4gICAgICAgICAgICAgIHJwLnNldFJlc29sdmVGcmFtZWJ1ZmZlcjIodGhpcy5fX29GcmFtZUJ1ZmZlclJlc29sdmVGb3JSZWZlcmVuY2UudW53cmFwRm9yY2UoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX19leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuICAgIGF3YWl0IHRoaXMuX19zZXRJYmxJbm5lcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3NldFRyYW5zcGFyZW50RXhwcmVzc2lvbnNGb3JUcmFuc21pc3Npb24oZXhwcmVzc2lvbnM6IEV4cHJlc3Npb25bXSkge1xuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBleHByZXNzaW9ucykge1xuICAgICAgZXhwcmVzc2lvbi50cnlUb1NldFVuaXF1ZU5hbWUoJ21vZGVsVHJhbnNwYXJlbnRGb3JUcmFuc21pc3Npb24nLCB0cnVlKTtcbiAgICAgIGZvciAoY29uc3QgcnAgb2YgZXhwcmVzc2lvbi5yZW5kZXJQYXNzZXMpIHtcbiAgICAgICAgcnAuc2V0VG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzKGZhbHNlKTsgLy8gbm90IHRvIHJlbmRlciBvcGFxdWUgcHJpbWl0aXZlcyBpbiB0cmFuc21pc3Npb24gZXhwcmVzc2lvbi5cbiAgICAgICAgcnAuc2V0VG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXModHJ1ZSk7XG4gICAgICAgIHJwLnRvQ2xlYXJEZXB0aEJ1ZmZlciA9IGZhbHNlO1xuICAgICAgICAvLyBycC5pc0RlcHRoVGVzdCA9IGZhbHNlO1xuICAgICAgICAvLyBycC5kZXB0aFdyaXRlTWFzayA9IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuX19pc1NpbXBsZSkge1xuICAgICAgICAgIHJwLnNldEZyYW1lYnVmZmVyKHRoaXMuX19nZXRNYWluRnJhbWVCdWZmZXIoKS51bndyYXBGb3JjZSgpKTtcbiAgICAgICAgICBpZiAodGhpcy5fX29GcmFtZUJ1ZmZlclJlc29sdmUuaGFzKCkpIHtcbiAgICAgICAgICAgIHJwLnNldFJlc29sdmVGcmFtZWJ1ZmZlcih0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZS51bndyYXBGb3JjZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgcnAuZW50aXRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc2hDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRNZXNoKCk7XG4gICAgICAgICAgICBpZiAoSXMuZXhpc3QobWVzaENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWVzaCA9IG1lc2hDb21wb25lbnQubWVzaDtcbiAgICAgICAgICAgICAgaWYgKElzLmV4aXN0KG1lc2gpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNoLmdldFByaW1pdGl2ZU51bWJlcigpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IG1lc2guZ2V0UHJpbWl0aXZlQXQoaSk7XG4gICAgICAgICAgICAgICAgICBwcmltaXRpdmUubWF0ZXJpYWwuc2V0VGV4dHVyZVBhcmFtZXRlcihcbiAgICAgICAgICAgICAgICAgICAgJ2JhY2tCdWZmZXJUZXh0dXJlJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2dldE1haW5GcmFtZUJ1ZmZlckJhY2tCdWZmZXIoKVxuICAgICAgICAgICAgICAgICAgICAgIC51bndyYXBGb3JjZSgpXG4gICAgICAgICAgICAgICAgICAgICAgLmdldENvbG9yQXR0YWNoZWRSZW5kZXJUYXJnZXRUZXh0dXJlKDApISxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX29TYW1wbGVyRm9yQmFja0J1ZmZlci51bndyYXBGb3JjZSgpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9fdHJhbnNwYXJlbnRPbmx5RXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcbiAgICB0aGlzLl9fc2V0SWJsSW5uZXJGb3JUcmFuc3BhcmVudE9ubHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgX19zZXR1cEluaXRpYWxFeHByZXNzaW9uKG9GcmFtZURlcHRoTW9tZW50OiBJT3B0aW9uPEZyYW1lQnVmZmVyPikge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvbigpO1xuICAgIGV4cHJlc3Npb24udHJ5VG9TZXRVbmlxdWVOYW1lKCdJbml0aWFsJywgdHJ1ZSk7XG5cbiAgICAvLyByZW5kZXIgcGFzcyB0byBjbGVhciBidWZmZXJzIG9mIHJlbmRlciB0ZXh0dXJlXG4gICAgY29uc3QgaW5pdGlhbFJlbmRlclBhc3MgPSBuZXcgUmVuZGVyUGFzcygpO1xuICAgIGluaXRpYWxSZW5kZXJQYXNzLmNsZWFyQ29sb3IgPSBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLjAsIDAuMCwgMC4wLCAwLjBdKTtcbiAgICBpbml0aWFsUmVuZGVyUGFzcy50b0NsZWFyQ29sb3JCdWZmZXIgPSB0cnVlO1xuICAgIGluaXRpYWxSZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA9IHRydWU7XG4gICAgaW5pdGlhbFJlbmRlclBhc3MudHJ5VG9TZXRVbmlxdWVOYW1lKCdJbml0aWFsUmVuZGVyUGFzcycsIHRydWUpO1xuICAgIGV4cHJlc3Npb24uYWRkUmVuZGVyUGFzc2VzKFtpbml0aWFsUmVuZGVyUGFzc10pO1xuXG4gICAgLy8gcmVuZGVyIHBhc3MgdG8gY2xlYXIgYnVmZmVycyBvZiBmcmFtZWJ1ZmZlclxuICAgIGlmICghdGhpcy5fX2lzU2ltcGxlKSB7XG4gICAgICBjb25zdCBpbml0aWFsUmVuZGVyUGFzc0ZvckZyYW1lQnVmZmVyID0gbmV3IFJlbmRlclBhc3MoKTtcbiAgICAgIGluaXRpYWxSZW5kZXJQYXNzRm9yRnJhbWVCdWZmZXIuY2xlYXJDb2xvciA9IFZlY3RvcjQuZnJvbUNvcHlBcnJheTQoWzAuMCwgMC4wLCAwLjAsIDAuMF0pO1xuICAgICAgaW5pdGlhbFJlbmRlclBhc3NGb3JGcmFtZUJ1ZmZlci50b0NsZWFyQ29sb3JCdWZmZXIgPSB0cnVlO1xuICAgICAgaW5pdGlhbFJlbmRlclBhc3NGb3JGcmFtZUJ1ZmZlci50b0NsZWFyRGVwdGhCdWZmZXIgPSB0cnVlO1xuICAgICAgaW5pdGlhbFJlbmRlclBhc3NGb3JGcmFtZUJ1ZmZlci5zZXRGcmFtZWJ1ZmZlcih0aGlzLl9fZ2V0TWFpbkZyYW1lQnVmZmVyKCkudW53cmFwRm9yY2UoKSk7XG4gICAgICBpbml0aWFsUmVuZGVyUGFzc0ZvckZyYW1lQnVmZmVyLnRyeVRvU2V0VW5pcXVlTmFtZSgnSW5pdGlhbFJlbmRlclBhc3NGb3JGcmFtZUJ1ZmZlcicsIHRydWUpO1xuICAgICAgZXhwcmVzc2lvbi5hZGRSZW5kZXJQYXNzZXMoW2luaXRpYWxSZW5kZXJQYXNzRm9yRnJhbWVCdWZmZXJdKTtcbiAgICB9XG5cbiAgICBpZiAob0ZyYW1lRGVwdGhNb21lbnQuaGFzKCkpIHtcbiAgICAgIGNvbnN0IGZyYW1lRGVwdGhNb21lbnQgPSBvRnJhbWVEZXB0aE1vbWVudC5nZXQoKTtcbiAgICAgIGNvbnN0IGluaXRpYWxSZW5kZXJQYXNzRm9yRGVwdGhNb21lbnQgPSBuZXcgUmVuZGVyUGFzcygpO1xuICAgICAgaW5pdGlhbFJlbmRlclBhc3NGb3JEZXB0aE1vbWVudC5jbGVhckNvbG9yID0gVmVjdG9yNC5mcm9tQ29weUFycmF5NChbMS4wLCAxLjAsIDEuMCwgMS4wXSk7XG4gICAgICBpbml0aWFsUmVuZGVyUGFzc0ZvckRlcHRoTW9tZW50LnRvQ2xlYXJDb2xvckJ1ZmZlciA9IHRydWU7XG4gICAgICBpbml0aWFsUmVuZGVyUGFzc0ZvckRlcHRoTW9tZW50LnRvQ2xlYXJEZXB0aEJ1ZmZlciA9IHRydWU7XG4gICAgICBpbml0aWFsUmVuZGVyUGFzc0ZvckRlcHRoTW9tZW50LnNldEZyYW1lYnVmZmVyKGZyYW1lRGVwdGhNb21lbnQpO1xuICAgICAgaW5pdGlhbFJlbmRlclBhc3NGb3JEZXB0aE1vbWVudC50cnlUb1NldFVuaXF1ZU5hbWUoJ0luaXRpYWxSZW5kZXJQYXNzRm9yRGVwdGhNb21lbnQnLCB0cnVlKTtcblxuICAgICAgZXhwcmVzc2lvbi5hZGRSZW5kZXJQYXNzZXMoW2luaXRpYWxSZW5kZXJQYXNzRm9yRGVwdGhNb21lbnRdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVSZW5kZXJUYXJnZXRzKGNhbnZhc1dpZHRoOiBudW1iZXIsIGNhbnZhc0hlaWdodDogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm5YUk1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGUoJ3hyJykgYXMgUm5YUiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3ZWJYUlN5c3RlbSA9IHJuWFJNb2R1bGU/LldlYlhSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGlmIChcbiAgICAgIElzLmV4aXN0KHdlYlhSU3lzdGVtKSAmJlxuICAgICAgd2ViWFJTeXN0ZW0uaXNXZWJYUk1vZGUgJiZcbiAgICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmlzU3VwcG9ydE11bHRpVmlld1ZSUmVuZGVyaW5nKClcbiAgICApIHtcbiAgICAgIGNvbnN0IGZyYW1lYnVmZmVyTXVsdGlWaWV3ID0gUmVuZGVyYWJsZUhlbHBlci5jcmVhdGVGcmFtZUJ1ZmZlclRleHR1cmVBcnJheSh7XG4gICAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCAvIDIsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICBhcnJheUxlbmd0aDogMixcbiAgICAgICAgbGV2ZWw6IDAsXG4gICAgICAgIGludGVybmFsRm9ybWF0OiB0aGlzLl9faXNCbG9vbSA/IFRleHR1cmVGb3JtYXQuUjExRl9HMTFGX0IxMEYgOiBUZXh0dXJlRm9ybWF0LlJHQkE4LFxuICAgICAgICBmb3JtYXQ6IHRoaXMuX19pc0Jsb29tID8gUGl4ZWxGb3JtYXQuUkdCIDogUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICAgICAgdHlwZTogdGhpcy5fX2lzQmxvb20gPyBDb21wb25lbnRUeXBlLkZsb2F0IDogQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGUsXG4gICAgICB9KTtcbiAgICAgIGZyYW1lYnVmZmVyTXVsdGlWaWV3LnRyeVRvU2V0VW5pcXVlTmFtZSgnRnJhbWVidWZmZXJUYXJnZXRPZlRvbmVNYXBwaW5nTXVsdGlWaWV3JywgdHJ1ZSk7XG4gICAgICBjb25zdCBmcmFtZWJ1ZmZlck11bHRpVmlld0JsaXQgPSBSZW5kZXJhYmxlSGVscGVyLmNyZWF0ZUZyYW1lQnVmZmVyKHtcbiAgICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhc0hlaWdodCxcbiAgICAgICAgdGV4dHVyZU51bTogMSxcbiAgICAgICAgdGV4dHVyZUZvcm1hdHM6IFt0aGlzLl9faXNCbG9vbSA/IFRleHR1cmVGb3JtYXQuUjExRl9HMTFGX0IxMEYgOiBUZXh0dXJlRm9ybWF0LlJHQkE4XSxcbiAgICAgICAgY3JlYXRlRGVwdGhCdWZmZXI6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGZyYW1lYnVmZmVyTXVsdGlWaWV3QmxpdC50cnlUb1NldFVuaXF1ZU5hbWUoXG4gICAgICAgICdGcmFtZWJ1ZmZlclRhcmdldE9mVG9uZU1hcHBpbmdNdWx0aVZpZXdCbGl0JyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZnJhbWVidWZmZXJNdWx0aVZpZXdCbGl0QmFja0J1ZmZlciA9IFJlbmRlcmFibGVIZWxwZXIuY3JlYXRlRnJhbWVCdWZmZXIoe1xuICAgICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICB0ZXh0dXJlTnVtOiAxLFxuICAgICAgICB0ZXh0dXJlRm9ybWF0czogW3RoaXMuX19pc0Jsb29tID8gVGV4dHVyZUZvcm1hdC5SMTFGX0cxMUZfQjEwRiA6IFRleHR1cmVGb3JtYXQuUkdCQThdLFxuICAgICAgICBjcmVhdGVEZXB0aEJ1ZmZlcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGZyYW1lYnVmZmVyTXVsdGlWaWV3QmxpdC50cnlUb1NldFVuaXF1ZU5hbWUoXG4gICAgICAgICdGcmFtZWJ1ZmZlclRhcmdldE9mVG9uZU1hcHBpbmdNdWx0aVZpZXdCbGl0QmFja0J1ZmZlcicsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXcgPSBuZXcgU29tZShmcmFtZWJ1ZmZlck11bHRpVmlldyk7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdCA9IG5ldyBTb21lKGZyYW1lYnVmZmVyTXVsdGlWaWV3QmxpdCk7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXIgPSBuZXcgU29tZShmcmFtZWJ1ZmZlck11bHRpVmlld0JsaXRCYWNrQnVmZmVyKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNc2FhID0gbmV3IE5vbmUoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlID0gbmV3IE5vbmUoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJSZXNvbHZlRm9yUmVmZXJlbmNlID0gbmV3IE5vbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTVNBQSBkZXB0aFxuICAgICAgY29uc3QgZnJhbWVidWZmZXJNc2FhID0gUmVuZGVyYWJsZUhlbHBlci5jcmVhdGVGcmFtZUJ1ZmZlck1TQUEoe1xuICAgICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICBjb2xvckJ1ZmZlck51bTogMSxcbiAgICAgICAgY29sb3JGb3JtYXRzOiBbdGhpcy5fX2lzQmxvb20gPyBUZXh0dXJlRm9ybWF0LlIxMUZfRzExRl9CMTBGIDogVGV4dHVyZUZvcm1hdC5SR0JBOF0sXG4gICAgICAgIHNhbXBsZUNvdW50TVNBQTogNCxcbiAgICAgICAgZGVwdGhCdWZmZXJGb3JtYXQ6IFRleHR1cmVGb3JtYXQuRGVwdGgzMkYsXG4gICAgICB9KTtcbiAgICAgIGZyYW1lYnVmZmVyTXNhYS50cnlUb1NldFVuaXF1ZU5hbWUoJ0ZyYW1lYnVmZmVyVGFyZ2V0T2ZUb25lTWFwcGluZ01zYWEnLCB0cnVlKTtcblxuICAgICAgLy8gUmVzb2x2ZSBDb2xvciAxXG4gICAgICBjb25zdCBmcmFtZWJ1ZmZlclJlc29sdmUgPSBSZW5kZXJhYmxlSGVscGVyLmNyZWF0ZUZyYW1lQnVmZmVyKHtcbiAgICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhc0hlaWdodCxcbiAgICAgICAgdGV4dHVyZU51bTogMSxcbiAgICAgICAgdGV4dHVyZUZvcm1hdHM6IFt0aGlzLl9faXNCbG9vbSA/IFRleHR1cmVGb3JtYXQuUjExRl9HMTFGX0IxMEYgOiBUZXh0dXJlRm9ybWF0LlJHQkE4XSxcbiAgICAgICAgY3JlYXRlRGVwdGhCdWZmZXI6IHRydWUsXG4gICAgICAgIGRlcHRoVGV4dHVyZUZvcm1hdDogVGV4dHVyZUZvcm1hdC5EZXB0aDMyRixcbiAgICAgIH0pO1xuICAgICAgZnJhbWVidWZmZXJSZXNvbHZlLnRyeVRvU2V0VW5pcXVlTmFtZSgnRnJhbWVidWZmZXJUYXJnZXRPZlRvbmVNYXBwaW5nUmVzb2x2ZScsIHRydWUpO1xuXG4gICAgICAvLyBSZXNvbHZlIENvbG9yIDJcbiAgICAgIGNvbnN0IGZyYW1lYnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZSA9IFJlbmRlcmFibGVIZWxwZXIuY3JlYXRlRnJhbWVCdWZmZXIoe1xuICAgICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICB0ZXh0dXJlTnVtOiAxLFxuICAgICAgICB0ZXh0dXJlRm9ybWF0czogW3RoaXMuX19pc0Jsb29tID8gVGV4dHVyZUZvcm1hdC5SMTFGX0cxMUZfQjEwRiA6IFRleHR1cmVGb3JtYXQuUkdCQThdLFxuICAgICAgICBjcmVhdGVEZXB0aEJ1ZmZlcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGZyYW1lYnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZS50cnlUb1NldFVuaXF1ZU5hbWUoXG4gICAgICAgICdGcmFtZWJ1ZmZlclRhcmdldE9mVG9uZU1hcHBpbmdSZXNvbHZlRm9yUmVmZXJlbmNlJyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgLy8gRnJhbWVCdWZmZXJzXG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3ID0gbmV3IE5vbmUoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXdCbGl0ID0gbmV3IE5vbmUoKTtcbiAgICAgIHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXdCbGl0QmFja0J1ZmZlciA9IG5ldyBOb25lKCk7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyTXNhYSA9IG5ldyBTb21lKGZyYW1lYnVmZmVyTXNhYSk7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZSA9IG5ldyBTb21lKGZyYW1lYnVmZmVyUmVzb2x2ZSk7XG4gICAgICB0aGlzLl9fb0ZyYW1lQnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZSA9IG5ldyBTb21lKGZyYW1lYnVmZmVyUmVzb2x2ZUZvclJlZmVyZW5jZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX3NldHVwR2VuZXJhdGVNaXBtYXBzRXhwcmVzc2lvbihyZXNvbHZlRnJhbWVidWZmZXIyOiBGcmFtZUJ1ZmZlcikge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvbigpO1xuICAgIGV4cHJlc3Npb24udHJ5VG9TZXRVbmlxdWVOYW1lKCdHZW5lcmF0ZU1pcG1hcHMnLCB0cnVlKTtcbiAgICBjb25zdCByZW5kZXJQYXNzID0gbmV3IFJlbmRlclBhc3MoKTtcbiAgICBleHByZXNzaW9uLmFkZFJlbmRlclBhc3NlcyhbcmVuZGVyUGFzc10pO1xuICAgIHJlbmRlclBhc3MudHJ5VG9TZXRVbmlxdWVOYW1lKCdHZW5lcmF0ZU1pcG1hcHMnLCB0cnVlKTtcblxuICAgIHJlbmRlclBhc3MudG9DbGVhckRlcHRoQnVmZmVyID0gZmFsc2U7XG5cbiAgICAvLyBHZW5lcmF0ZSBNaXBtYXAgb2YgcmVzb2x2ZSBGcmFtZWJ1ZmZlciAyXG4gICAgcmVuZGVyUGFzcy5zZXRQb3N0UmVuZGVyRnVuY3Rpb24oZnVuY3Rpb24gKHRoaXM6IFJlbmRlclBhc3MpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlbmRlclRhcmdldFRleHR1cmUgPSByZXNvbHZlRnJhbWVidWZmZXIyLmdldENvbG9yQXR0YWNoZWRSZW5kZXJUYXJnZXRUZXh0dXJlKDApITtcbiAgICAgIHJlbmRlclRhcmdldFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFNvbWUoZXhwcmVzc2lvbik7XG4gIH1cbiAgcHJpdmF0ZSBfX3NldHVwTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXJFeHByZXNzaW9uKG11bHRpVmlld0ZyYW1lQnVmZmVyOiBGcmFtZUJ1ZmZlcikge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvbigpO1xuICAgIGV4cHJlc3Npb24udHJ5VG9TZXRVbmlxdWVOYW1lKCdNdWx0aVZpZXdCbGl0QmFja0J1ZmZlcicsIHRydWUpO1xuICAgIGNvbnN0IHJlbmRlclBhc3MgPSBuZXcgUmVuZGVyUGFzcygpO1xuICAgIGV4cHJlc3Npb24uYWRkUmVuZGVyUGFzc2VzKFtyZW5kZXJQYXNzXSk7XG4gICAgcmVuZGVyUGFzcy50cnlUb1NldFVuaXF1ZU5hbWUoJ011bHRpVmlld0JsaXRCYWNrQnVmZmVyJywgdHJ1ZSk7XG5cbiAgICByZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA9IGZhbHNlO1xuXG4gICAgLy8gR2VuZXJhdGUgTWlwbWFwIG9mIHJlc29sdmUgRnJhbWVidWZmZXIgMlxuICAgIHJlbmRlclBhc3Muc2V0UG9zdFJlbmRlckZ1bmN0aW9uKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXIuaGFzKCkpIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXdCbGl0QmFja0J1ZmZlci51bndyYXBGb3JjZSgpXG4gICAgICAgICAgLmNvbG9yQXR0YWNobWVudHNbMF0gYXMgUmVuZGVyVGFyZ2V0VGV4dHVyZTtcbiAgICAgICAgKFxuICAgICAgICAgIG11bHRpVmlld0ZyYW1lQnVmZmVyLmNvbG9yQXR0YWNobWVudHNbMF0gYXMgUmVuZGVyVGFyZ2V0VGV4dHVyZVxuICAgICAgICApLmJsaXRUb1RleHR1cmUyZEZyb21UZXh0dXJlMmRBcnJheUZha2UodGV4dHVyZSk7XG4gICAgICAgIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFNvbWUoZXhwcmVzc2lvbik7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0dXBNdWx0aVZpZXdCbGl0RXhwcmVzc2lvbihtdWx0aVZpZXdGcmFtZUJ1ZmZlcjogRnJhbWVCdWZmZXIpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb24oKTtcbiAgICBleHByZXNzaW9uLnRyeVRvU2V0VW5pcXVlTmFtZSgnTXVsdGlWaWV3QmxpdCcsIHRydWUpO1xuICAgIGNvbnN0IHJlbmRlclBhc3MgPSBuZXcgUmVuZGVyUGFzcygpO1xuICAgIGV4cHJlc3Npb24uYWRkUmVuZGVyUGFzc2VzKFtyZW5kZXJQYXNzXSk7XG4gICAgcmVuZGVyUGFzcy50cnlUb1NldFVuaXF1ZU5hbWUoJ011bHRpVmlld0JsaXQnLCB0cnVlKTtcblxuICAgIHJlbmRlclBhc3MudG9DbGVhckRlcHRoQnVmZmVyID0gZmFsc2U7XG5cbiAgICAvLyBHZW5lcmF0ZSBNaXBtYXAgb2YgcmVzb2x2ZSBGcmFtZWJ1ZmZlciAyXG4gICAgcmVuZGVyUGFzcy5zZXRQb3N0UmVuZGVyRnVuY3Rpb24oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX19vRnJhbWVCdWZmZXJNdWx0aVZpZXdCbGl0LmhhcygpKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLl9fb0ZyYW1lQnVmZmVyTXVsdGlWaWV3QmxpdC51bndyYXBGb3JjZSgpXG4gICAgICAgICAgLmNvbG9yQXR0YWNobWVudHNbMF0gYXMgUmVuZGVyVGFyZ2V0VGV4dHVyZTtcbiAgICAgICAgKFxuICAgICAgICAgIG11bHRpVmlld0ZyYW1lQnVmZmVyLmNvbG9yQXR0YWNobWVudHNbMF0gYXMgUmVuZGVyVGFyZ2V0VGV4dHVyZVxuICAgICAgICApLmJsaXRUb1RleHR1cmUyZEZyb21UZXh0dXJlMmRBcnJheUZha2UodGV4dHVyZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFNvbWUoZXhwcmVzc2lvbik7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0dXBUb25lTWFwcGluZ0V4cHJlc3Npb24odG9uZU1hcHBpbmdUYXJnZXRSZW5kZXJUYXJnZXRUZXh0dXJlOiBSZW5kZXJUYXJnZXRUZXh0dXJlKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvblRvbmVNYXBwaW5nRWZmZWN0ID0gbmV3IEV4cHJlc3Npb24oKTtcbiAgICBjb25zdCBtYXRlcmlhbFRvbmVNYXBwaW5nID0gTWF0ZXJpYWxIZWxwZXIuY3JlYXRlVG9uZU1hcHBpbmdNYXRlcmlhbCgpO1xuICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbCA9IG5ldyBTb21lKG1hdGVyaWFsVG9uZU1hcHBpbmcpO1xuICAgIHRoaXMuc2V0VG9uZU1hcHBpbmdUeXBlKHRoaXMuX190b25lTWFwcGluZ1R5cGUpO1xuXG4gICAgLy8gUmVuZGVyaW5nIGZvciBDYW52YXMgRnJhbWUgQnVmZmVyXG4gICAgY29uc3QgcmVuZGVyUGFzc1RvbmVNYXBwaW5nID0gUmVuZGVyUGFzc0hlbHBlci5jcmVhdGVTY3JlZW5EcmF3UmVuZGVyUGFzc1dpdGhCYXNlQ29sb3JUZXh0dXJlKFxuICAgICAgbWF0ZXJpYWxUb25lTWFwcGluZyxcbiAgICAgIHRvbmVNYXBwaW5nVGFyZ2V0UmVuZGVyVGFyZ2V0VGV4dHVyZVxuICAgICk7XG4gICAgcmVuZGVyUGFzc1RvbmVNYXBwaW5nLnRyeVRvU2V0VW5pcXVlTmFtZSgncmVuZGVyUGFzc1RvbmVNYXBwaW5nJywgdHJ1ZSk7XG4gICAgcmVuZGVyUGFzc1RvbmVNYXBwaW5nLnRvQ2xlYXJDb2xvckJ1ZmZlciA9IGZhbHNlO1xuICAgIHJlbmRlclBhc3NUb25lTWFwcGluZy50b0NsZWFyRGVwdGhCdWZmZXIgPSBmYWxzZTtcbiAgICByZW5kZXJQYXNzVG9uZU1hcHBpbmcuaXNEZXB0aFRlc3QgPSBmYWxzZTtcbiAgICByZW5kZXJQYXNzVG9uZU1hcHBpbmcuY2xlYXJDb2xvciA9IFZlY3RvcjQuZnJvbUNvcHlBcnJheTQoWzAuMCwgMC4wLCAwLjAsIDAuMF0pO1xuICAgIHJlbmRlclBhc3NUb25lTWFwcGluZy5pc1ZyUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgcmVuZGVyUGFzc1RvbmVNYXBwaW5nLmlzT3V0cHV0Rm9yVnIgPSBmYWxzZTtcblxuICAgIC8vIFJlbmRlcmluZyBmb3IgVlIgSGVhZFNldCBGcmFtZSBCdWZmZXJcbiAgICBjb25zdCByZW5kZXJQYXNzVG9uZU1hcHBpbmdWciA9IFJlbmRlclBhc3NIZWxwZXIuY3JlYXRlU2NyZWVuRHJhd1JlbmRlclBhc3NXaXRoQmFzZUNvbG9yVGV4dHVyZShcbiAgICAgIG1hdGVyaWFsVG9uZU1hcHBpbmcsXG4gICAgICB0b25lTWFwcGluZ1RhcmdldFJlbmRlclRhcmdldFRleHR1cmVcbiAgICApO1xuICAgIHJlbmRlclBhc3NUb25lTWFwcGluZ1ZyLnRyeVRvU2V0VW5pcXVlTmFtZSgncmVuZGVyUGFzc1RvbmVNYXBwaW5nVnInLCB0cnVlKTtcbiAgICByZW5kZXJQYXNzVG9uZU1hcHBpbmdWci50b0NsZWFyQ29sb3JCdWZmZXIgPSBmYWxzZTtcbiAgICByZW5kZXJQYXNzVG9uZU1hcHBpbmdWci50b0NsZWFyRGVwdGhCdWZmZXIgPSBmYWxzZTtcbiAgICByZW5kZXJQYXNzVG9uZU1hcHBpbmdWci5pc0RlcHRoVGVzdCA9IGZhbHNlO1xuICAgIHJlbmRlclBhc3NUb25lTWFwcGluZ1ZyLmNsZWFyQ29sb3IgPSBWZWN0b3I0LmZyb21Db3B5QXJyYXk0KFswLjAsIDAuMCwgMC4wLCAwLjBdKTtcbiAgICByZW5kZXJQYXNzVG9uZU1hcHBpbmdWci5pc1ZyUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgcmVuZGVyUGFzc1RvbmVNYXBwaW5nVnIuaXNPdXRwdXRGb3JWciA9IHRydWU7XG5cbiAgICBleHByZXNzaW9uVG9uZU1hcHBpbmdFZmZlY3QuYWRkUmVuZGVyUGFzc2VzKFtyZW5kZXJQYXNzVG9uZU1hcHBpbmcsIHJlbmRlclBhc3NUb25lTWFwcGluZ1ZyXSk7XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvblRvbmVNYXBwaW5nRWZmZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3NldHVwRGVwdGhNb21lbnRGcmFtZWJ1ZmZlcihzaGFkb3dNYXBTaXplOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFNvbWUoXG4gICAgICBSZW5kZXJhYmxlSGVscGVyLmNyZWF0ZUZyYW1lQnVmZmVyKHtcbiAgICAgICAgd2lkdGg6IHNoYWRvd01hcFNpemUsXG4gICAgICAgIGhlaWdodDogc2hhZG93TWFwU2l6ZSxcbiAgICAgICAgdGV4dHVyZU51bTogMSxcbiAgICAgICAgdGV4dHVyZUZvcm1hdHM6IFtUZXh0dXJlRm9ybWF0LlJHMzJGXSxcbiAgICAgICAgY3JlYXRlRGVwdGhCdWZmZXI6IHRydWUsXG4gICAgICAgIGRlcHRoVGV4dHVyZUZvcm1hdDogVGV4dHVyZUZvcm1hdC5EZXB0aDMyRixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19zZXRJYmxJbm5lcigpIHtcbiAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5fX2V4cHJlc3Npb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgZXhwcmVzc2lvbi5yZW5kZXJQYXNzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgcmVuZGVyUGFzcy5lbnRpdGllcykge1xuICAgICAgICAgIGNvbnN0IG1lc2hSZW5kZXJlckNvbXBvbmVudCA9IGVudGl0eS50cnlUb0dldE1lc2hSZW5kZXJlcigpO1xuICAgICAgICAgIGlmIChJcy5leGlzdChtZXNoUmVuZGVyZXJDb21wb25lbnQpKSB7XG4gICAgICAgICAgICBhd2FpdCBtZXNoUmVuZGVyZXJDb21wb25lbnQuc2V0SUJMQ3ViZU1hcChcbiAgICAgICAgICAgICAgdGhpcy5fX29EaWZmdXNlQ3ViZVRleHR1cmUudW53cmFwT3JVbmRlZmluZWQoKSEsXG4gICAgICAgICAgICAgIHRoaXMuX19vU3BlY3VsYXJDdWJlVGV4dHVyZS51bndyYXBPclVuZGVmaW5lZCgpIVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9fc2V0SWJsSW5uZXJGb3JUcmFuc3BhcmVudE9ubHkoKSB7XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuX190cmFuc3BhcmVudE9ubHlFeHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCByZW5kZXJQYXNzIG9mIGV4cHJlc3Npb24ucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHJlbmRlclBhc3MuZW50aXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtZXNoUmVuZGVyZXJDb21wb25lbnQgPSBlbnRpdHkudHJ5VG9HZXRNZXNoUmVuZGVyZXIoKTtcbiAgICAgICAgICBpZiAoSXMuZXhpc3QobWVzaFJlbmRlcmVyQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgYXdhaXQgbWVzaFJlbmRlcmVyQ29tcG9uZW50LnNldElCTEN1YmVNYXAoXG4gICAgICAgICAgICAgIHRoaXMuX19vRGlmZnVzZUN1YmVUZXh0dXJlLnVud3JhcE9yVW5kZWZpbmVkKCkhLFxuICAgICAgICAgICAgICB0aGlzLl9fb1NwZWN1bGFyQ3ViZVRleHR1cmUudW53cmFwT3JVbmRlZmluZWQoKSFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFRvbmVNYXBwaW5nVHlwZSh0eXBlOiBUb25lTWFwcGluZ1R5cGVFbnVtKSB7XG4gICAgaWYgKCF0aGlzLl9fb1RvbmVNYXBwaW5nTWF0ZXJpYWwuaGFzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fX3RvbmVNYXBwaW5nVHlwZSA9IHR5cGU7XG5cbiAgICB0aGlzLl9fb1RvbmVNYXBwaW5nTWF0ZXJpYWwuZ2V0KCkucmVtb3ZlU2hhZGVyRGVmaW5lKCdSTl9VU0VfS0hST05PU19QQlJfTkVVVFJBTCcpO1xuICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5yZW1vdmVTaGFkZXJEZWZpbmUoJ1JOX1VTRV9SRUlOSEFSRCcpO1xuICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5yZW1vdmVTaGFkZXJEZWZpbmUoJ1JOX1VTRV9HVF9UT05FTUFQJyk7XG4gICAgdGhpcy5fX29Ub25lTWFwcGluZ01hdGVyaWFsLmdldCgpLnJlbW92ZVNoYWRlckRlZmluZSgnUk5fVVNFX0FDRVNfTkFSS09XSUNaJyk7XG4gICAgdGhpcy5fX29Ub25lTWFwcGluZ01hdGVyaWFsLmdldCgpLnJlbW92ZVNoYWRlckRlZmluZSgnUk5fVVNFX0FDRVNfSElMTCcpO1xuICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5yZW1vdmVTaGFkZXJEZWZpbmUoJ1JOX1VTRV9BQ0VTX0hJTExfRVhQT1NVUkVfQk9PU1QnKTtcblxuICAgIGlmICh0eXBlID09PSBUb25lTWFwcGluZ1R5cGUuS2hyb25vc1Bick5ldXRyYWwpIHtcbiAgICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9LSFJPTk9TX1BCUl9ORVVUUkFMJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUb25lTWFwcGluZ1R5cGUuUmVpbmhhcmQpIHtcbiAgICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9SRUlOSEFSRCcpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9uZU1hcHBpbmdUeXBlLkdUX1RvbmVNYXApIHtcbiAgICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9HVF9UT05FTUFQJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUb25lTWFwcGluZ1R5cGUuQUNFU19OYXJrb3dpY3opIHtcbiAgICAgIHRoaXMuX19vVG9uZU1hcHBpbmdNYXRlcmlhbC5nZXQoKS5hZGRTaGFkZXJEZWZpbmUoJ1JOX1VTRV9BQ0VTX05BUktPV0lDWicpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9uZU1hcHBpbmdUeXBlLkFDRVNfSGlsbCkge1xuICAgICAgdGhpcy5fX29Ub25lTWFwcGluZ01hdGVyaWFsLmdldCgpLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX0FDRVNfSElMTCcpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9uZU1hcHBpbmdUeXBlLkFDRVNfSGlsbF9FeHBvc3VyZV9Cb29zdCkge1xuICAgICAgdGhpcy5fX29Ub25lTWFwcGluZ01hdGVyaWFsLmdldCgpLmFkZFNoYWRlckRlZmluZSgnUk5fVVNFX0FDRVNfSElMTF9FWFBPU1VSRV9CT09TVCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRVcCBGcmFtZVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGV4cHJlc3Npb25zIHRvIHRoZSBmcmFtZS5cbiAgICovXG4gIHByaXZhdGUgX19zZXRFeHByZXNzaW9ucygpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuX19vRnJhbWUudW53cmFwRm9yY2UoKTtcbiAgICBmcmFtZS5jbGVhckV4cHJlc3Npb25zKCk7XG4gICAgZnJhbWUuYWRkRXhwcmVzc2lvbih0aGlzLmdldEluaXRpYWxFeHByZXNzaW9uKCkhKTtcblxuICAgIGlmICghdGhpcy5fX2lzU2ltcGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IGV4cCBvZiB0aGlzLl9fZGVwdGhNb21lbnRFeHByZXNzaW9ucykge1xuICAgICAgICBmcmFtZS5hZGRFeHByZXNzaW9uKGV4cCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhwIG9mIHRoaXMuX19leHByZXNzaW9ucykge1xuICAgICAgZnJhbWUuYWRkRXhwcmVzc2lvbihleHApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fX2lzU2ltcGxlICYmIHRoaXMuX19vR2VuZXJhdGVNaXBtYXBzRXhwcmVzc2lvbi5oYXMoKSkge1xuICAgICAgZnJhbWUuYWRkRXhwcmVzc2lvbih0aGlzLl9fb0dlbmVyYXRlTWlwbWFwc0V4cHJlc3Npb24udW53cmFwRm9yY2UoKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fX2lzU2ltcGxlICYmIHRoaXMuX19vTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXJFeHByZXNzaW9uLmhhcygpKSB7XG4gICAgICBmcmFtZS5hZGRFeHByZXNzaW9uKHRoaXMuX19vTXVsdGlWaWV3QmxpdEJhY2tCdWZmZXJFeHByZXNzaW9uLnVud3JhcEZvcmNlKCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXhwIG9mIHRoaXMuX190cmFuc3BhcmVudE9ubHlFeHByZXNzaW9ucykge1xuICAgICAgZnJhbWUuYWRkRXhwcmVzc2lvbihleHApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fX2lzU2ltcGxlICYmIHRoaXMuX19vTXVsdGlWaWV3QmxpdEV4cHJlc3Npb24uaGFzKCkpIHtcbiAgICAgIGZyYW1lLmFkZEV4cHJlc3Npb24odGhpcy5fX29NdWx0aVZpZXdCbGl0RXhwcmVzc2lvbi51bndyYXBGb3JjZSgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX19pc1NpbXBsZSAmJiB0aGlzLl9faXNCbG9vbSkge1xuICAgICAgZnJhbWUuYWRkRXhwcmVzc2lvbih0aGlzLl9fb0Jsb29tRXhwcmVzc2lvbi51bndyYXBGb3JjZSgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX19pc1NpbXBsZSAmJiB0aGlzLl9fb1RvbmVNYXBwaW5nRXhwcmVzc2lvbi5oYXMoKSkge1xuICAgICAgZnJhbWUuYWRkRXhwcmVzc2lvbih0aGlzLmdldFRvbmVNYXBwaW5nRXhwcmVzc2lvbigpISk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0ZvcndhcmRSZW5kZXJQaXBlbGluZSc7XG4iLCJpbXBvcnQgeyBJcyB9IGZyb20gJy4uL21pc2MvSXMnO1xuaW1wb3J0IHsgbnVsbGlzaFRvRW1wdHlBcnJheSB9IGZyb20gJy4uL21pc2MvTWlzY1V0aWwnO1xuXG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSBzdHJpbmcgfCBzeW1ib2w7XG5leHBvcnQgdHlwZSBFdmVudFN1YnNjcmliZXJJbmRleCA9IG51bWJlcjtcbmV4cG9ydCB0eXBlIENhbGxlZFN1YnNjcmliZXJOdW1iZXIgPSBudW1iZXI7XG5leHBvcnQgdHlwZSBFdmVudEhhbmRsZXIgPSAoZXZlbnQ6IHVua25vd24pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50UHViU3ViIHtcbiAgc3Vic2NyaWJlKHR5cGU6IEV2ZW50VHlwZSwgaGFuZGxlcjogRXZlbnRIYW5kbGVyKTogRXZlbnRTdWJzY3JpYmVySW5kZXg7XG4gIHVuc3Vic2NyaWJlKHR5cGU6IEV2ZW50VHlwZSwgaW5kZXg6IEV2ZW50U3Vic2NyaWJlckluZGV4KTogdm9pZDtcbiAgdW5zdWJzY3JpYmVBbGwodHlwZTogRXZlbnRUeXBlLCBoYW5kbGVyOiBFdmVudEhhbmRsZXIpOiB2b2lkO1xuICBwdWJsaXNoQXN5bmModHlwZTogRXZlbnRUeXBlLCBldmVudD86IGFueSk6IENhbGxlZFN1YnNjcmliZXJOdW1iZXI7XG4gIHB1Ymxpc2hTeW5jKHR5cGU6IEV2ZW50VHlwZSwgZXZlbnQ/OiBhbnkpOiBDYWxsZWRTdWJzY3JpYmVyTnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRQdWJTdWIgaW1wbGVtZW50cyBJRXZlbnRQdWJTdWIge1xuICBwcml2YXRlIF9fc3Vic2NyaWJlck1hcDogTWFwPEV2ZW50VHlwZSwgRXZlbnRIYW5kbGVyW10+ID0gbmV3IE1hcCgpO1xuXG4gIHN1YnNjcmliZSh0eXBlOiBFdmVudFR5cGUsIGhhbmRsZXI6IEV2ZW50SGFuZGxlcik6IEV2ZW50U3Vic2NyaWJlckluZGV4IHtcbiAgICBsZXQgc3Vic2NyaWJlcnMgPSB0aGlzLl9fc3Vic2NyaWJlck1hcC5nZXQodHlwZSk7XG4gICAgaWYgKElzLm5vdC5leGlzdChzdWJzY3JpYmVycykpIHtcbiAgICAgIHRoaXMuX19zdWJzY3JpYmVyTWFwLnNldCh0eXBlLCBbXSk7XG4gICAgICBzdWJzY3JpYmVycyA9IHRoaXMuX19zdWJzY3JpYmVyTWFwLmdldCh0eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic2NyaWJlcnMhLnB1c2goaGFuZGxlcikgLSAxO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUodHlwZTogRXZlbnRUeXBlLCBpbmRleDogRXZlbnRTdWJzY3JpYmVySW5kZXgpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IHRoaXMuX19zdWJzY3JpYmVyTWFwLmdldCh0eXBlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgaWYgKHN1YnNjcmliZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHVuc3Vic2NyaWJlQWxsKHR5cGU6IEV2ZW50VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX19zdWJzY3JpYmVyTWFwLmRlbGV0ZSh0eXBlKTtcbiAgfVxuXG4gIHB1Ymxpc2hBc3luYyh0eXBlOiBFdmVudFR5cGUsIGV2ZW50PzogYW55KTogQ2FsbGVkU3Vic2NyaWJlck51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IG51bGxpc2hUb0VtcHR5QXJyYXkodGhpcy5fX3N1YnNjcmliZXJNYXAuZ2V0KHR5cGUpKTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBzdWJzY3JpYmVycykge1xuICAgICAgc2V0VGltZW91dChzdWIuYmluZCh0aGlzLCBldmVudCksIDApO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHVibGlzaFN5bmModHlwZTogRXZlbnRUeXBlLCBldmVudD86IGFueSk6IENhbGxlZFN1YnNjcmliZXJOdW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3Qgc3Vic2NyaWJlcnMgPSBudWxsaXNoVG9FbXB0eUFycmF5KHRoaXMuX19zdWJzY3JpYmVyTWFwLmdldCh0eXBlKSk7XG4gICAgZm9yIChjb25zdCBzdWIgb2Ygc3Vic2NyaWJlcnMpIHtcbiAgICAgIC8vIExvZ2dlci5sb2coc3ViKTtcbiAgICAgIHN1YihldmVudCk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5cbmV4cG9ydCBjb25zdCBFVkVOVF9NT1VTRV9ET1dOID0gJ21vdXNlZG93bic7XG5leHBvcnQgY29uc3QgRVZFTlRfTU9VU0VfTU9WRSA9ICdtb3VzZW1vdmUnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX01PVVNFX1VQID0gJ21vdXNldXAnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX01PVVNFX1dIRUVMID0gJ3doZWVsJztcbmV4cG9ydCBjb25zdCBFVkVOVF9NT1VTRV9FTlRFUiA9ICdtb3VzZWVudGVyJztcbmV4cG9ydCBjb25zdCBFVkVOVF9NT1VTRV9MRUFWRSA9ICdtb3VzZWxlYXZlJztcbmV4cG9ydCBjb25zdCBFVkVOVF9NT1VTRV9PVkVSID0gJ21vdXNlb3Zlcic7XG5leHBvcnQgY29uc3QgRVZFTlRfQ0xJQ0sgPSAnY2xpY2snO1xuZXhwb3J0IGNvbnN0IEVWRU5UX0tFWV9ET1dOID0gJ2tleWRvd24nO1xuZXhwb3J0IGNvbnN0IEVWRU5UX0tFWV9VUCA9ICdrZXl1cCc7XG5leHBvcnQgY29uc3QgRVZFTlRfS0VZX1BSRVNTID0gJ2tleXByZXNzJztcbmV4cG9ydCBjb25zdCBFVkVOVF9QT0lOVEVSX0RPV04gPSAncG9pbnRlcmRvd24nO1xuZXhwb3J0IGNvbnN0IEVWRU5UX01TUE9JTlRFUl9ET1dOID0gJ01TUG9pbnRlckRvd24nO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1BPSU5URVJfTU9WRSA9ICdwb2ludGVybW92ZSc7XG5leHBvcnQgY29uc3QgRVZFTlRfTVNQT0lOVEVSX01PVkUgPSAnTVNQb2ludGVyTW92ZSc7XG5leHBvcnQgY29uc3QgRVZFTlRfUE9JTlRFUl9VUCA9ICdwb2ludGVydXAnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX01TUE9JTlRFUl9VUCA9ICdNU1BvaW50ZXJVcCc7XG5leHBvcnQgY29uc3QgRVZFTlRfUE9JTlRFUl9DQU5DRUwgPSAncG9pbnRlcmNhbmNlbCc7XG5leHBvcnQgY29uc3QgRVZFTlRfUE9JTlRFUl9FTlRFUiA9ICdwb2ludGVyZW50ZXInO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1BPSU5URVJfTEVBVkUgPSAncG9pbnRlcmxlYXZlJztcbmV4cG9ydCBjb25zdCBFVkVOVF9QT0lOVEVSX09WRVIgPSAncG9pbnRlcm92ZXInO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1BPSU5URVJfT1VUID0gJ3BvaW50ZXJvdXQnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1JFU0laRSA9ICdyZXNpemUnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX09SSUVOVEFUSU9OX0NIQU5HRSA9ICdvcmllbnRhdGlvbmNoYW5nZSc7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfVEFQID0gJ3RhcCc7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfRE9VQkxFX1RBUCA9ICdkb3VibGV0YXAnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RPVUNIX0xPTkdfVEFQID0gJ2xvbmd0YXAnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RPVUNIX0hPTEQgPSAnaG9sZCc7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfRFJBRyA9ICdkcmFnJztcbmV4cG9ydCBjb25zdCBFVkVOVF9UT1VDSF9TV0lQRSA9ICdzd2lwZSc7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfUElOQ0ggPSAncGluY2gnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RPVUNIX1NUQVJUID0gJ3RvdWNoc3RhcnQnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RPVUNIX01PVkUgPSAndG91Y2htb3ZlJztcbmV4cG9ydCBjb25zdCBFVkVOVF9UT1VDSF9FTkQgPSAndG91Y2hlbmQnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RPVUNIX0NBTkNFTCA9ICd0b3VjaGNhbmNlbCc7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfRU5URVIgPSAndG91Y2hlbnRlcic7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfTEVBVkUgPSAndG91Y2hsZWF2ZSc7XG5leHBvcnQgY29uc3QgRVZFTlRfVE9VQ0hfT1ZFUiA9ICd0b3VjaG92ZXInO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1RPVUNIX09VVCA9ICd0b3VjaG91dCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIE5hdmlnYXRvciB7XG4gICAgcmVhZG9ubHkgcG9pbnRlckVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgbXNQb2ludGVyRW5hYmxlZDogYm9vbGVhbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnQodHlwZTogJ3N0YXJ0JyB8ICdtb3ZlJyB8ICdlbmQnIHwgJ2NsaWNrJyk6IHN0cmluZyB7XG4gIGNvbnN0IGRldmljZUV2ZW50cyA9IHtcbiAgICBUb3VjaDogdHlwZW9mIGRvY3VtZW50Lm9udG91Y2hzdGFydCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgUG9pbnRlcjogd2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCxcbiAgICBNU1BvaW50ZXI6IHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCxcbiAgfTtcblxuICBjb25zdCBFdmVudE5hbWVzID0ge1xuICAgIHN0YXJ0OiBkZXZpY2VFdmVudHMuUG9pbnRlclxuICAgICAgPyBFVkVOVF9QT0lOVEVSX0RPV05cbiAgICAgIDogZGV2aWNlRXZlbnRzLk1TUG9pbnRlclxuICAgICAgPyBFVkVOVF9NU1BPSU5URVJfRE9XTlxuICAgICAgOiBkZXZpY2VFdmVudHMuVG91Y2hcbiAgICAgID8gRVZFTlRfVE9VQ0hfU1RBUlRcbiAgICAgIDogRVZFTlRfTU9VU0VfRE9XTixcbiAgICBtb3ZlOiBkZXZpY2VFdmVudHMuUG9pbnRlclxuICAgICAgPyBFVkVOVF9QT0lOVEVSX01PVkVcbiAgICAgIDogZGV2aWNlRXZlbnRzLk1TUG9pbnRlclxuICAgICAgPyBFVkVOVF9NU1BPSU5URVJfTU9WRVxuICAgICAgOiBkZXZpY2VFdmVudHMuVG91Y2hcbiAgICAgID8gRVZFTlRfVE9VQ0hfTU9WRVxuICAgICAgOiBFVkVOVF9NT1VTRV9NT1ZFLFxuICAgIGVuZDogZGV2aWNlRXZlbnRzLlBvaW50ZXJcbiAgICAgID8gRVZFTlRfUE9JTlRFUl9VUFxuICAgICAgOiBkZXZpY2VFdmVudHMuTVNQb2ludGVyXG4gICAgICA/IEVWRU5UX01TUE9JTlRFUl9VUFxuICAgICAgOiBkZXZpY2VFdmVudHMuVG91Y2hcbiAgICAgID8gRVZFTlRfVE9VQ0hfRU5EXG4gICAgICA6IEVWRU5UX01PVVNFX1VQLFxuICAgIGNsaWNrOiBFVkVOVF9DTElDSyxcbiAgfTtcblxuICByZXR1cm4gRXZlbnROYW1lc1t0eXBlXTtcbn1cblxudHlwZSBFdmVudE5hbWUgPSBzdHJpbmc7XG50eXBlIENsYXNzSW5zdGFuY2UgPSBhbnk7XG50eXBlIElucHV0SGFuZGxpbmdTdGF0ZU1hcCA9IE1hcDxJbnB1dEhhbmRsaW5nU3RhdGUsIElucHV0SGFuZGxlckluZm9bXT47XG50eXBlIEFjdGl2ZU1hcCA9IE1hcDxJbnB1dEhhbmRsaW5nU3RhdGUsIGJvb2xlYW4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElucHV0SGFuZGxlckluZm8ge1xuICBldmVudE5hbWU6IHN0cmluZztcbiAgaGFuZGxlcjogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIG9wdGlvbnM6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zO1xuICBjbGFzc0luc3RhbmNlOiBDbGFzc0luc3RhbmNlO1xuICBldmVudFRhcmdldERvbTogRXZlbnRUYXJnZXQ7XG59XG5cbmV4cG9ydCBjb25zdCBJTlBVVF9IQU5ETElOR19TVEFURV9OT05FID0gJ05vbmUnO1xuZXhwb3J0IGNvbnN0IElOUFVUX0hBTkRMSU5HX1NUQVRFX0NBTUVSQV9DT05UUk9MTEVSID0gJ0NhbWVyYUNvbnRyb2xsZXInO1xuZXhwb3J0IGNvbnN0IElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1RSQU5TTEFUSU9OID0gJ0dpem1vVHJhbnNsYXRpb24nO1xuZXhwb3J0IGNvbnN0IElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1NDQUxFID0gJ0dpem1vU2NhbGUnO1xuXG5leHBvcnQgdHlwZSBJbnB1dEhhbmRsaW5nU3RhdGUgPVxuICB8IHR5cGVvZiBJTlBVVF9IQU5ETElOR19TVEFURV9OT05FXG4gIHwgdHlwZW9mIElOUFVUX0hBTkRMSU5HX1NUQVRFX0NBTUVSQV9DT05UUk9MTEVSXG4gIHwgdHlwZW9mIElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1RSQU5TTEFUSU9OXG4gIHwgdHlwZW9mIElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1NDQUxFO1xuXG5leHBvcnQgY2xhc3MgSW5wdXRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pbnB1dEhhbmRsaW5nU3RhdGVNYXA6IElucHV0SGFuZGxpbmdTdGF0ZU1hcCA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogVGhpcyBhY3RpdmUgaW5mb3JtYXRpb24gaXMgc2V0IGV4dGVybmFsbHkgYW5kIGRvZXMgbm90IGNoYW5nZSBzdGF0ZSBpbnRlcm5hbGx5LlxuICAgKiBVc2luZyB0aGlzIGV4dGVybmFsbHkgc2V0IGFjdGl2ZSBpbmZvcm1hdGlvbiwgdGhpcyBjbGFzcyB3aWxsIGFkZCBhbmQgcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBhcyBhcHByb3ByaWF0ZS5cbiAgICogQXMgYSByZXN1bHQsIGV2ZW50IGhhbmRsaW5nIGZvciB0aGUgZW50aXJlIFJob2Rvbml0ZSB3b3JrcyBwcm9wZXJseS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fYWN0aXZlTWFwOiBBY3RpdmVNYXAgPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19jdXJyZW50U3RhdGUgPSBJTlBVVF9IQU5ETElOR19TVEFURV9OT05FO1xuXG4gIHN0YXRpYyByZWdpc3RlcihpbnB1dEhhbmRsaW5nU3RhdGU6IElucHV0SGFuZGxpbmdTdGF0ZSwgZXZlbnRzOiBJbnB1dEhhbmRsZXJJbmZvW10pIHtcbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5fX2lucHV0SGFuZGxpbmdTdGF0ZU1hcC5zZXQoaW5wdXRIYW5kbGluZ1N0YXRlLCBldmVudHMpO1xuICAgIHRoaXMuX19hY3RpdmVNYXAuc2V0KGlucHV0SGFuZGxpbmdTdGF0ZSwgdHJ1ZSk7XG4gICAgdGhpcy5fX3Byb2Nlc3NFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgc3RhdGljIHVucmVnaXN0ZXIoaW5wdXRIYW5kbGluZ1N0YXRlOiBJbnB1dEhhbmRsaW5nU3RhdGUpIHtcbiAgICB0aGlzLl9fYWN0aXZlTWFwLnNldChpbnB1dEhhbmRsaW5nU3RhdGUsIGZhbHNlKTtcbiAgICB0aGlzLl9faW5wdXRIYW5kbGluZ1N0YXRlTWFwLmRlbGV0ZShpbnB1dEhhbmRsaW5nU3RhdGUpO1xuICAgIHRoaXMuX19wcm9jZXNzRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXRBY3RpdmUoaW5wdXRIYW5kbGluZ1N0YXRlOiBJbnB1dEhhbmRsaW5nU3RhdGUsIGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX19hY3RpdmVNYXAuc2V0KGlucHV0SGFuZGxpbmdTdGF0ZSwgYWN0aXZlKTtcblxuICAgIGlmIChpbnB1dEhhbmRsaW5nU3RhdGUgPT09IElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1RSQU5TTEFUSU9OICYmIGFjdGl2ZSkge1xuICAgICAgdGhpcy5fX2FjdGl2ZU1hcC5zZXQoSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fU0NBTEUsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0SGFuZGxpbmdTdGF0ZSA9PT0gSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fU0NBTEUgJiYgYWN0aXZlKSB7XG4gICAgICB0aGlzLl9fYWN0aXZlTWFwLnNldChJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19UUkFOU0xBVElPTiwgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuX19wcm9jZXNzRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHN0YXRpYyBfX2FkZEV2ZW50TGlzdGVuZXJzKGlucHV0SGFuZGxpbmdTdGF0ZTogSW5wdXRIYW5kbGluZ1N0YXRlKSB7XG4gICAgY29uc3QgaW5mb3MgPSBJbnB1dE1hbmFnZXIuX19pbnB1dEhhbmRsaW5nU3RhdGVNYXAuZ2V0KGlucHV0SGFuZGxpbmdTdGF0ZSk7XG4gICAgaWYgKElzLmV4aXN0KGluZm9zKSkge1xuICAgICAgZm9yIChjb25zdCBpbnB1dEhhbmRsZXJJbmZvIG9mIGluZm9zKSB7XG4gICAgICAgIGlucHV0SGFuZGxlckluZm8uZXZlbnRUYXJnZXREb20uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBpbnB1dEhhbmRsZXJJbmZvLmV2ZW50TmFtZSxcbiAgICAgICAgICBpbnB1dEhhbmRsZXJJbmZvLmhhbmRsZXIsXG4gICAgICAgICAgaW5wdXRIYW5kbGVySW5mby5vcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIF9fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoaW5wdXRIYW5kbGluZ1N0YXRlOiBJbnB1dEhhbmRsaW5nU3RhdGUpIHtcbiAgICBjb25zdCBpbmZvcyA9IElucHV0TWFuYWdlci5fX2lucHV0SGFuZGxpbmdTdGF0ZU1hcC5nZXQoaW5wdXRIYW5kbGluZ1N0YXRlKTtcbiAgICBpZiAoSXMuZXhpc3QoaW5mb3MpKSB7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0SGFuZGxlckluZm8gb2YgaW5mb3MpIHtcbiAgICAgICAgaW5wdXRIYW5kbGVySW5mby5ldmVudFRhcmdldERvbS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgIGlucHV0SGFuZGxlckluZm8uZXZlbnROYW1lLFxuICAgICAgICAgIGlucHV0SGFuZGxlckluZm8uaGFuZGxlcixcbiAgICAgICAgICBpbnB1dEhhbmRsZXJJbmZvLm9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgX19wcm9jZXNzRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25HaXptb0FjdGl2ZSA9IElucHV0TWFuYWdlci5fX2lucHV0SGFuZGxpbmdTdGF0ZU1hcC5nZXQoXG4gICAgICBJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19UUkFOU0xBVElPTlxuICAgICk7XG4gICAgY29uc3Qgc2NhbGVHaXptb0FjdGl2ZSA9IElucHV0TWFuYWdlci5fX2lucHV0SGFuZGxpbmdTdGF0ZU1hcC5nZXQoXG4gICAgICBJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19TQ0FMRVxuICAgICk7XG4gICAgY29uc3QgY2FtZXJhQ29udHJvbGxlckFjdGl2ZSA9IElucHV0TWFuYWdlci5fX2lucHV0SGFuZGxpbmdTdGF0ZU1hcC5nZXQoXG4gICAgICBJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUlxuICAgICk7XG5cbiAgICBpZiAoY2FtZXJhQ29udHJvbGxlckFjdGl2ZSkge1xuICAgICAgdGhpcy5fX2FkZEV2ZW50TGlzdGVuZXJzKElOUFVUX0hBTkRMSU5HX1NUQVRFX0NBTUVSQV9DT05UUk9MTEVSKTtcbiAgICAgIHRoaXMuX19jdXJyZW50U3RhdGUgPSBJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUjtcbiAgICB9XG5cbiAgICAvLyBJZiB0cmFuc2xhdGlvbkdpem1vIGVuYWJsZWRcbiAgICBpZiAodHJhbnNsYXRpb25HaXptb0FjdGl2ZSkge1xuICAgICAgdGhpcy5fX2FkZEV2ZW50TGlzdGVuZXJzKElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1RSQU5TTEFUSU9OKTtcbiAgICAgIC8vIHRoaXMuX19yZW1vdmVFdmVudExpc3RlbmVycyhJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFDT05UUk9MTEVSKTtcbiAgICAgIHRoaXMuX19yZW1vdmVFdmVudExpc3RlbmVycyhJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19TQ0FMRSk7XG4gICAgICB0aGlzLl9fY3VycmVudFN0YXRlID0gSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fVFJBTlNMQVRJT047XG4gICAgfVxuXG4gICAgaWYgKHNjYWxlR2l6bW9BY3RpdmUpIHtcbiAgICAgIHRoaXMuX19hZGRFdmVudExpc3RlbmVycyhJTlBVVF9IQU5ETElOR19TVEFURV9HSVpNT19TQ0FMRSk7XG4gICAgICAvLyB0aGlzLl9fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoSU5QVVRfSEFORExJTkdfU1RBVEVfQ0FNRVJBQ09OVFJPTExFUik7XG4gICAgICB0aGlzLl9fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoSU5QVVRfSEFORExJTkdfU1RBVEVfR0laTU9fVFJBTlNMQVRJT04pO1xuICAgICAgdGhpcy5fX2N1cnJlbnRTdGF0ZSA9IElOUFVUX0hBTkRMSU5HX1NUQVRFX0dJWk1PX1NDQUxFO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBlbmFibGVDYW1lcmFDb250cm9sbGVyKCkge1xuICAgIHRoaXMuX19hZGRFdmVudExpc3RlbmVycyhJTlBVVF9IQU5ETElOR19TVEFURV9DQU1FUkFfQ09OVFJPTExFUik7XG4gICAgdGhpcy5fX2FjdGl2ZU1hcC5zZXQoSU5QVVRfSEFORExJTkdfU1RBVEVfQ0FNRVJBX0NPTlRST0xMRVIsIHRydWUpO1xuICAgIHRoaXMuX19wcm9jZXNzRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHN0YXRpYyBkaXNhYmxlQ2FtZXJhQ29udHJvbGxlcigpIHtcbiAgICB0aGlzLl9fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoSU5QVVRfSEFORExJTkdfU1RBVEVfQ0FNRVJBX0NPTlRST0xMRVIpO1xuICAgIHRoaXMuX19hY3RpdmVNYXAuc2V0KElOUFVUX0hBTkRMSU5HX1NUQVRFX0NBTUVSQV9DT05UUk9MTEVSLCBmYWxzZSk7XG4gICAgdGhpcy5fX3Byb2Nlc3NFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgc3RhdGljIGdldEN1cnJlbnRTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2N1cnJlbnRTdGF0ZTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIE1vZHVsZU1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBNb2R1bGVNYW5hZ2VyO1xuICBwcml2YXRlIF9fbW9kdWxlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cbiAgYXN5bmMgbG9hZE1vZHVsZShcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdhc20/OiBzdHJpbmc7XG4gICAgfVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCBtb2R1bGU6IGFueTtcbiAgICBpZiAobW9kdWxlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2ViZ2wnKSB7XG4gICAgICBtb2R1bGUgPSBhd2FpdCAoYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tDaHVua05hbWU6IFwid2ViZ2xcIiAqLyAnLi4vLi4vd2ViZ2wvbWFpbicpKS5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAobW9kdWxlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2ViZ3B1Jykge1xuICAgICAgbW9kdWxlID0gYXdhaXQgKGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcIndlYmdwdVwiICovICcuLi8uLi93ZWJncHUvbWFpbicpKS5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAobW9kdWxlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZWZmZWtzZWVyJykge1xuICAgICAgbW9kdWxlID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJlZmZla3NlZXJcIiAqLyAnLi4vLi4vZWZmZWtzZWVyL21haW4nKVxuICAgICAgKS5FZmZla3NlZXI7XG4gICAgICBtb2R1bGUuRWZmZWtzZWVyQ29tcG9uZW50Lndhc21Nb2R1bGVVcmkgPSBvcHRpb25zPy53YXNtO1xuICAgIH0gZWxzZSBpZiAobW9kdWxlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAncGJyJykge1xuICAgICAgbW9kdWxlID0gYXdhaXQgKGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcInBiclwiICovICcuLi8uLi9wYnIvbWFpbicpKS5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAobW9kdWxlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAneHInKSB7XG4gICAgICBtb2R1bGUgPSBhd2FpdCAoYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tDaHVua05hbWU6IFwieHJcIiAqLyAnLi4vLi4veHIvbWFpbicpKS5kZWZhdWx0O1xuICAgIH1cbiAgICB0aGlzLl9fbW9kdWxlcy5zZXQobW9kdWxlTmFtZSwgbW9kdWxlKTtcbiAgICAvLyBMb2dnZXIubG9nKCdNb2R1bGUgTG9hZGVkOicsIG1vZHVsZSk7XG5cbiAgICByZXR1cm4gbW9kdWxlO1xuICB9XG5cbiAgZ2V0TW9kdWxlKG1vZHVsZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9fbW9kdWxlcy5nZXQobW9kdWxlTmFtZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBNb2R1bGVNYW5hZ2VyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19pbnN0YW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvY2Vzc1N0YWdlLCBQcm9jZXNzU3RhZ2VFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc1N0YWdlJztcbmltcG9ydCB7IENvbXBvbmVudFJlcG9zaXRvcnkgfSBmcm9tICcuLi9jb3JlL0NvbXBvbmVudFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoRW51bSwgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IE1vZHVsZU1hbmFnZXIgfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHtcbiAgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnksXG4gIElDR0FQSVJlc291cmNlUmVwb3NpdG9yeSxcbn0gZnJvbSAnLi4vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL3JlbmRlcmVyL0V4cHJlc3Npb24nO1xuaW1wb3J0IHsgRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvcmUvRW50aXR5UmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9NZW1vcnlNYW5hZ2VyJztcbmltcG9ydCB7IEdsb2JhbERhdGFSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29yZS9HbG9iYWxEYXRhUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCB7IENhbWVyYVR5cGUgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9DYW1lcmFUeXBlJztcbmltcG9ydCB7IFRpbWUgfSBmcm9tICcuLi9taXNjL1RpbWUnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IE1pc2NVdGlsIH0gZnJvbSAnLi4vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQgdHlwZSB7IFJuWFIgfSBmcm9tICcuLi8uLi94ci9tYWluJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IEZyYW1lIH0gZnJvbSAnLi4vcmVuZGVyZXIvRnJhbWUnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi4vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL3dlYmdsL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFdlbGxLbm93bkNvbXBvbmVudFRJRHMgfSBmcm9tICcuLi9jb21wb25lbnRzL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgaW5pdERlZmF1bHRUZXh0dXJlcyB9IGZyb20gJy4uL21hdGVyaWFscy9jb3JlL0R1bW15VGV4dHVyZXMnO1xuaW1wb3J0IHsgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vd2ViZ3B1L1dlYkdwdVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBXZWJHcHVEZXZpY2VXcmFwcGVyIH0gZnJvbSAnLi4vLi4vd2ViZ3B1L1dlYkdwdURldmljZVdyYXBwZXInO1xuaW1wb3J0IHsgV2ViR3B1U3RyYXRlZ3lCYXNpYyB9IGZyb20gJy4uLy4uL3dlYmdwdS9XZWJHcHVTdHJhdGVneUJhc2ljJztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmltYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0FuaW1hdGlvbi9BbmltYXRpb25Db21wb25lbnQnO1xuaW1wb3J0IHsgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ2FtZXJhQ29udHJvbGxlci9DYW1lcmFDb250cm9sbGVyQ29tcG9uZW50JztcbmltcG9ydCB7IE1lc2hSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL01lc2hSZW5kZXJlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL1RyYW5zZm9ybS9UcmFuc2Zvcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi8uLi92ZXJzaW9uJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcyB9IGZyb20gJy4uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBjcmVhdGVDYW1lcmFFbnRpdHkgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhbWVyYS9jcmVhdGVDYW1lcmFFbnRpdHknO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuZGVjbGFyZSBjb25zdCBzcGVjdG9yOiBhbnk7XG5cbi8qKlxuICogVGhlIGFyZ3VtZW50IHR5cGUgZm9yIFN5c3RlbS5pbml0KCkgbWV0aG9kLlxuICovXG5pbnRlcmZhY2UgU3lzdGVtSW5pdERlc2NyaXB0aW9uIHtcbiAgYXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW07XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIG1lbW9yeVVzYWdlT3JkZXI/OiB7XG4gICAgY3B1R2VuZXJpYzogbnVtYmVyO1xuICAgIGdwdUluc3RhbmNlRGF0YTogbnVtYmVyO1xuICAgIGdwdVZlcnRleERhdGE6IG51bWJlcjtcbiAgfTtcbiAgd2ViZ2xPcHRpb24/OiBXZWJHTENvbnRleHRBdHRyaWJ1dGVzO1xuICBub3RUb0Rpc3BsYXlSbkluZm9BdEluaXQ/OiBib29sZWFuO1xufVxuXG50eXBlIENvbXBvbmVudE1ldGhvZE5hbWUgPSBzdHJpbmc7XG5cbi8qKlxuICogVGhlIHN5c3RlbSBjbGFzcyBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIFJob2Rvbml0ZSBsaWJyYXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGF3YWl0IFJuLlN5c3RlbS5pbml0KHtcbiAqICAgYXBwcm9hY2g6IFJuLlByb2Nlc3NBcHByb2FjaC5EYXRhVGV4dHVyZSxcbiAqICAgY2FudmFzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd29ybGQnKSBhcyBIVE1MQ2FudmFzRWxlbWVudCxcbiAqIH0pO1xuICpcbiAqIC4uLiAoY3JlYXRlIHNvbWV0aGluZykgLi4uXG4gKlxuICogUm4uU3lzdGVtLnN0YXJ0UmVuZGVyTG9vcCgodGltZSwgX215QXJnMSwgX215QXJnMikgPT4ge1xuICogICBSbi5TeXN0ZW0ucHJvY2VzcyhbZXhwcmVzc2lvbl0pO1xuICogfSwgbXlBcmcxLCBteUFyZzIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTeXN0ZW0ge1xuICBwcml2YXRlIHN0YXRpYyBfX2V4cHJlc3Npb25Gb3JQcm9jZXNzQXV0bz86IEV4cHJlc3Npb247XG4gIHByaXZhdGUgc3RhdGljIF9fcmVuZGVyUGFzc0ZvclByb2Nlc3NBdXRvPzogUmVuZGVyUGFzcztcbiAgcHJpdmF0ZSBzdGF0aWMgX19wcm9jZXNzQXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW0gPSBQcm9jZXNzQXBwcm9hY2guTm9uZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19jZ0FwaVJlc291cmNlUmVwb3NpdG9yeTogSUNHQVBJUmVzb3VyY2VSZXBvc2l0b3J5O1xuICBwcml2YXRlIHN0YXRpYyBfX3JlbmRlclBhc3NUaWNrQ291bnQgPSAwO1xuICBwcml2YXRlIHN0YXRpYyBfX2FuaW1hdGlvbkZyYW1lSWQgPSAtMTtcblxuICBwcml2YXRlIHN0YXRpYyBfX3JlbmRlckxvb3BGdW5jPzogKHRpbWU6IG51bWJlciwgLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gIHByaXZhdGUgc3RhdGljIF9fYXJnczogdW5rbm93bltdID0gW107XG4gIHByaXZhdGUgc3RhdGljIF9fcm5YUk1vZHVsZT86IFJuWFI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19sYXN0Q2FtZXJhQ29udHJvbGxlckNvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuICBwcml2YXRlIHN0YXRpYyBfX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19sYXN0UHJpbWl0aXZlQ291bnQgPSAtMTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogU3RhcnRzIGEgcmVuZGVyIGxvb3AuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBSbi5TeXN0ZW0uc3RhcnRSZW5kZXJMb29wKCh0aW1lLCBfbXlBcmcxLCBfbXlBcmcyKSA9PiB7XG4gICAqICAgUm4uU3lzdGVtLnByb2Nlc3MoW2V4cHJlc3Npb25dKTtcbiAgICogfSwgbXlBcmcxLCBteUFyZzIpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHJlbmRlckxvb3BGdW5jIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIGVhY2ggZnJhbWVcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgeW91IHdhbnQgdG8gYmUgcGFzc2VkIHRvIHJlbmRlckxvb3BGdW5jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHN0YXJ0UmVuZGVyTG9vcChcbiAgICByZW5kZXJMb29wRnVuYzogKHRpbWU6IG51bWJlciwgLi4uYXJnczogYW55W10pID0+IHZvaWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgdGhpcy5fX3JlbmRlckxvb3BGdW5jID0gcmVuZGVyTG9vcEZ1bmM7XG4gICAgdGhpcy5fX2FyZ3MgPSBhcmdzO1xuICAgIGNvbnN0IGFuaW1hdGlvbkZyYW1lT2JqZWN0ID0gdGhpcy5fX2dldEFuaW1hdGlvbkZyYW1lT2JqZWN0KCk7XG4gICAgaWYgKHRoaXMuX19yblhSTW9kdWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX19yblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSO1xuICAgIH1cblxuICAgIHRoaXMuX19hbmltYXRpb25GcmFtZUlkID0gYW5pbWF0aW9uRnJhbWVPYmplY3QucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoXG4gICAgICBfdGltZTogbnVtYmVyLFxuICAgICAgeHJGcmFtZTogWFJGcmFtZVxuICAgICkgPT4ge1xuICAgICAgaWYgKHRoaXMuX19yblhSTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgd2ViWFJTeXN0ZW0gPSB0aGlzLl9fcm5YUk1vZHVsZS5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCB3ZWJBUlN5c3RlbSA9IHRoaXMuX19yblhSTW9kdWxlLldlYkFSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGlmICh3ZWJYUlN5c3RlbS5pc1JlYWR5Rm9yV2ViWFIpIHtcbiAgICAgICAgICB3ZWJYUlN5c3RlbS5fcHJlUmVuZGVyKF90aW1lLCB4ckZyYW1lKTtcbiAgICAgICAgICByZW5kZXJMb29wRnVuYy5hcHBseShyZW5kZXJMb29wRnVuYywgW190aW1lLCAuLi5hcmdzXSk7XG4gICAgICAgICAgd2ViWFJTeXN0ZW0uX3Bvc3RSZW5kZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWJBUlN5c3RlbS5pc1JlYWR5Rm9yV2ViQVIpIHtcbiAgICAgICAgICB3ZWJBUlN5c3RlbS5fcHJlUmVuZGVyKF90aW1lLCB4ckZyYW1lKTtcbiAgICAgICAgICByZW5kZXJMb29wRnVuYy5hcHBseShyZW5kZXJMb29wRnVuYywgW190aW1lLCAuLi5hcmdzXSk7XG4gICAgICAgICAgd2ViQVJTeXN0ZW0uX3ByZVJlbmRlcihfdGltZSwgeHJGcmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyTG9vcEZ1bmMuYXBwbHkocmVuZGVyTG9vcEZ1bmMsIFtfdGltZSwgLi4uYXJnc10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW5kZXJMb29wRnVuYy5hcHBseShyZW5kZXJMb29wRnVuYywgW190aW1lLCAuLi5hcmdzXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhcnRSZW5kZXJMb29wKHJlbmRlckxvb3BGdW5jLCAuLi5hcmdzKTtcbiAgICB9KSBhcyBGcmFtZVJlcXVlc3RDYWxsYmFjayk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2dldEFuaW1hdGlvbkZyYW1lT2JqZWN0KCk6IFdpbmRvdyB8IFhSU2Vzc2lvbiB7XG4gICAgbGV0IGFuaW1hdGlvbkZyYW1lT2JqZWN0OiBXaW5kb3cgfCBYUlNlc3Npb24gfCB1bmRlZmluZWQgPSB3aW5kb3c7XG4gICAgY29uc3Qgcm5YUk1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGUoJ3hyJykgYXMgUm5YUiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoSXMuZXhpc3Qocm5YUk1vZHVsZSkpIHtcbiAgICAgIGNvbnN0IHdlYlhSU3lzdGVtID0gcm5YUk1vZHVsZS5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpO1xuICAgICAgY29uc3Qgd2ViQVJTeXN0ZW0gPSByblhSTW9kdWxlLldlYkFSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgICBpZiAod2ViWFJTeXN0ZW0ucmVxdWVzdGVkVG9FbnRlcldlYlhSKSB7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lT2JqZWN0ID0gd2ViWFJTeXN0ZW0ueHJTZXNzaW9uO1xuICAgICAgfSBlbHNlIGlmICh3ZWJBUlN5c3RlbS5yZXF1ZXN0ZWRUb0VudGVyV2ViQVIpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVPYmplY3QgPSB3ZWJBUlN5c3RlbS5hclNlc3Npb247XG4gICAgICB9XG4gICAgICBpZiAoSXMubm90LmV4aXN0KGFuaW1hdGlvbkZyYW1lT2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYW5pbWF0aW9uRnJhbWVPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgYSBleGlzdGluZyByZW5kZXIgbG9vcC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3RvcFJlbmRlckxvb3AoKSB7XG4gICAgY29uc3QgYW5pbWF0aW9uRnJhbWVPYmplY3QgPSB0aGlzLl9fZ2V0QW5pbWF0aW9uRnJhbWVPYmplY3QoKTtcbiAgICBhbmltYXRpb25GcmFtZU9iamVjdC5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgdGhpcy5fX2FuaW1hdGlvbkZyYW1lSWQgPSAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0YXJ0IGEgcmVuZGVyIGxvb3AuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc3RhcnRSZW5kZXJMb29wKCkge1xuICAgIGlmICh0aGlzLl9fcmVuZGVyTG9vcEZ1bmMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGFydFJlbmRlckxvb3AodGhpcy5fX3JlbmRlckxvb3BGdW5jLCAwLCB0aGlzLl9fYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgU2ltcGxlIHZlcnNpb24gb2YgcHJvY2VzcyBtZXRob2RcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogTm8gbmVlZCB0byBjcmVhdGUgZXhwcmVzc2lvbnMgYW5kIHJlbmRlclBhc3NlcyBhbmQgdG8gcmVnaXN0ZXIgZW50aXRpZXMsIGV0Yy4uLlxuICAgKiBJdCdzIHN1aXRhYmxlIGZvciBzaW1wbGUgdXNlIGNhc2VzIGxpa2Ugc2FtcGxlIGFwcHMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGVhckNvbG9yIC0gY29sb3IgdG8gY2xlYXIgdGhlIGNhbnZhc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwcm9jZXNzQXV0byhjbGVhckNvbG9yID0gVmVjdG9yNC5mcm9tQ29weTQoMCwgMCwgMCwgMSkpIHtcbiAgICBpZiAoSXMubm90LmV4aXN0KFN5c3RlbS5fX2V4cHJlc3Npb25Gb3JQcm9jZXNzQXV0bykpIHtcbiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvbigpO1xuICAgICAgY29uc3QgcmVuZGVyUGFzc0luaXQgPSBuZXcgUmVuZGVyUGFzcygpO1xuICAgICAgcmVuZGVyUGFzc0luaXQudG9DbGVhckNvbG9yQnVmZmVyID0gdHJ1ZTtcbiAgICAgIHJlbmRlclBhc3NJbml0LnRvQ2xlYXJEZXB0aEJ1ZmZlciA9IHRydWU7XG4gICAgICByZW5kZXJQYXNzSW5pdC5jbGVhckNvbG9yID0gY2xlYXJDb2xvcjtcbiAgICAgIGNvbnN0IHJlbmRlclBhc3NNYWluID0gbmV3IFJlbmRlclBhc3MoKTtcbiAgICAgIGV4cHJlc3Npb24uYWRkUmVuZGVyUGFzc2VzKFtyZW5kZXJQYXNzSW5pdCwgcmVuZGVyUGFzc01haW5dKTtcbiAgICAgIFN5c3RlbS5fX2V4cHJlc3Npb25Gb3JQcm9jZXNzQXV0byA9IGV4cHJlc3Npb247XG4gICAgICBTeXN0ZW0uX19yZW5kZXJQYXNzRm9yUHJvY2Vzc0F1dG8gPSByZW5kZXJQYXNzTWFpbjtcbiAgICB9XG4gICAgU3lzdGVtLl9fcmVuZGVyUGFzc0ZvclByb2Nlc3NBdXRvIS5jbGVhckVudGl0aWVzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBFbnRpdHlSZXBvc2l0b3J5Ll9nZXRFbnRpdGllcygpO1xuICAgIFN5c3RlbS5fX3JlbmRlclBhc3NGb3JQcm9jZXNzQXV0byEuYWRkRW50aXRpZXMoZW50aXRpZXMgYXMgdW5rbm93biBhcyBJU2NlbmVHcmFwaEVudGl0eVtdKTtcbiAgICB0aGlzLnByb2Nlc3MoW1N5c3RlbS5fX2V4cHJlc3Npb25Gb3JQcm9jZXNzQXV0b10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcHJvY2VzcyBtZXRob2QgdG8gcmVuZGVyIGEgc2NlbmVcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogWW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBmb3IgcmVuZGVyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZnJhbWUvZXhwcmVzc2lvbiAtIGEgZnJhbWUvZXhwcmVzc2lvbiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcHJvY2VzcyhmcmFtZTogRnJhbWUpOiB2b2lkO1xuICBwdWJsaWMgc3RhdGljIHByb2Nlc3MoZXhwcmVzc2lvbnM6IEV4cHJlc3Npb25bXSk6IHZvaWQ7XG4gIHB1YmxpYyBzdGF0aWMgcHJvY2Vzcyh2YWx1ZTogYW55KSB7XG4gICAgVGltZS5fcHJvY2Vzc0JlZ2luKCk7XG4gICAgbGV0IGV4cHJlc3Npb25zOiBFeHByZXNzaW9uW10gPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGcmFtZSkge1xuICAgICAgZXhwcmVzc2lvbnMgPSB2YWx1ZS5leHByZXNzaW9ucztcbiAgICB9XG5cbiAgICBpZiAoQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnQgPT09IENvbXBvbmVudC5JbnZhbGlkT2JqZWN0VUlEKSB7XG4gICAgICBTeXN0ZW0uY3JlYXRlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZSA9IEdsb2JhbERhdGFSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuZ2V0VmFsdWUoJ3RpbWUnLCAwKSBhcyBTY2FsYXI7XG4gICAgdGltZS5fdlswXSA9IFRpbWUudGltZUZyb21TeXN0ZW1TdGFydDtcblxuICAgIGlmICh0aGlzLnByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgY29uc3QgY29tcG9uZW50VGlkcyA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50VElEcygpO1xuICAgICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID0gV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIENvbXBvbmVudC5fcHJvY2Vzc1N0YWdlcykge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gc3RhZ2UubWV0aG9kTmFtZTtcbiAgICAgICAgY29uc3QgY29tbW9uTWV0aG9kTmFtZSA9ICdjb21tb25fJyArIG1ldGhvZE5hbWU7XG4gICAgICAgIGlmIChzdGFnZSA9PT0gUHJvY2Vzc1N0YWdlLlJlbmRlcikge1xuICAgICAgICAgIGNvbnN0IHdlYkdwdVN0cmF0ZWd5QmFzaWMgPSBXZWJHcHVTdHJhdGVneUJhc2ljLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgTWVzaFJlbmRlcmVyQ29tcG9uZW50LmNvbW1vbl8kcHJlcmVuZGVyKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBleHAgb2YgZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVuZGVyUGFzcyBvZiBleHAucmVuZGVyUGFzc2VzKSB7XG4gICAgICAgICAgICAgIC8vIGNsZWFyIEZyYW1lYnVmZmVyXG4gICAgICAgICAgICAgIHRoaXMuX19jZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jbGVhckZyYW1lQnVmZmVyKHJlbmRlclBhc3MpO1xuXG4gICAgICAgICAgICAgIHJlbmRlclBhc3MuX2lzQ2hhbmdlZFNvcnRSZW5kZXJSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgcHJpbWl0aXZlVWlkcyA9IE1lc2hSZW5kZXJlckNvbXBvbmVudC5zb3J0XyRyZW5kZXIocmVuZGVyUGFzcyk7XG4gICAgICAgICAgICAgIGxldCBkb1JlbmRlciA9IHJlbmRlclBhc3MuX3JlbmRlcmVkU29tZXRoaW5nQmVmb3JlO1xuICAgICAgICAgICAgICBpZiAoZG9SZW5kZXIpIHtcbiAgICAgICAgICAgICAgICBkb1JlbmRlciA9ICF3ZWJHcHVTdHJhdGVneUJhc2ljLnJlbmRlcldpdGhSZW5kZXJCdW5kbGUocmVuZGVyUGFzcyk7XG4gICAgICAgICAgICAgICAgU3lzdGVtU3RhdGUud2ViZ3B1UmVuZGVyQnVuZGxlTW9kZSB8fD0gZG9SZW5kZXI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZG9SZW5kZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZFNvbWV0aGluZyA9IE1lc2hSZW5kZXJlckNvbXBvbmVudC5jb21tb25fJHJlbmRlcih7XG4gICAgICAgICAgICAgICAgICByZW5kZXJQYXNzOiByZW5kZXJQYXNzLFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzc1N0YWdlOiBzdGFnZSxcbiAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3NUaWNrQ291bnQ6IHRoaXMuX19yZW5kZXJQYXNzVGlja0NvdW50LFxuICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlVWlkcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZW5kZXJQYXNzLl9yZW5kZXJlZFNvbWV0aGluZ0JlZm9yZSA9IHJlbmRlcmVkU29tZXRoaW5nO1xuICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZFNvbWV0aGluZykge1xuICAgICAgICAgICAgICAgICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmZpbmlzaFJlbmRlckJ1bmRsZUVuY29kZXIocmVuZGVyUGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlbmRlclBhc3MuX2NvcHlSZXNvbHZlMVRvUmVzb2x2ZTJXZWJHcHUoKTtcbiAgICAgICAgICAgICAgcmVuZGVyUGFzcy5kb1Bvc3RSZW5kZXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlclBhc3NUaWNrQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmZsdXNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIVN5c3RlbVN0YXRlLndlYmdwdVJlbmRlckJ1bmRsZU1vZGUgfHxcbiAgICAgICAgICAgIEFuaW1hdGlvbkNvbXBvbmVudC5pc0FuaW1hdGluZyB8fFxuICAgICAgICAgICAgVHJhbnNmb3JtQ29tcG9uZW50LnVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCB8fFxuICAgICAgICAgICAgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC51cGRhdGVDb3VudCAhPT1cbiAgICAgICAgICAgICAgdGhpcy5fX2xhc3RDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50c1VwZGF0ZUNvdW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudFRpZCBvZiBjb21wb25lbnRUaWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50ID1cbiAgICAgICAgICAgICAgICBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudENsYXNzKGNvbXBvbmVudFRpZCkhO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENsYXNzX2NvbW1vbk1ldGhvZCA9IChjb21wb25lbnRDbGFzcyBhcyBhbnkpW2NvbW1vbk1ldGhvZE5hbWVdO1xuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Q2xhc3NfY29tbW9uTWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3NfY29tbW9uTWV0aG9kKHtcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3NBcHByb2FjaDogdGhpcy5fX3Byb2Nlc3NBcHByb2FjaCxcbiAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3M6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3NTdGFnZTogc3RhZ2UsXG4gICAgICAgICAgICAgICAgICByZW5kZXJQYXNzVGlja0NvdW50OiB0aGlzLl9fcmVuZGVyUGFzc1RpY2tDb3VudCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzLnByb2Nlc3MoY29tcG9uZW50Q2xhc3MsIHN0YWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX19sYXN0Q2FtZXJhQ29udHJvbGxlckNvbXBvbmVudHNVcGRhdGVDb3VudCA9IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgICB0aGlzLl9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCA9IFRyYW5zZm9ybUNvbXBvbmVudC51cGRhdGVDb3VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVwbyA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgICBjb25zdCByblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSIHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb21wb25lbnRUaWRzID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnRUSURzKCk7XG4gICAgICBjb25zdCByZW5kZXJpbmdDb21wb25lbnRUaWRzID0gQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRSZW5kZXJpbmdDb21wb25lbnRUSURzKCk7XG4gICAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIENvbXBvbmVudC5fcHJvY2Vzc1N0YWdlcykge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gc3RhZ2UubWV0aG9kTmFtZTtcbiAgICAgICAgY29uc3QgY29tbW9uTWV0aG9kTmFtZSA9ICdjb21tb25fJyArIG1ldGhvZE5hbWU7XG4gICAgICAgIGlmIChzdGFnZSA9PT0gUHJvY2Vzc1N0YWdlLlJlbmRlcikge1xuICAgICAgICAgIE1lc2hSZW5kZXJlckNvbXBvbmVudC5jb21tb25fJHByZXJlbmRlcigpO1xuICAgICAgICAgIGZvciAoY29uc3QgZXhwIG9mIGV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudFRpZCBvZiByZW5kZXJpbmdDb21wb25lbnRUaWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50ID1cbiAgICAgICAgICAgICAgICBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudENsYXNzKGNvbXBvbmVudFRpZCkhO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbmRlclBhc3Mgb2YgZXhwLnJlbmRlclBhc3Nlcykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BlY3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIHNwZWN0b3Iuc2V0TWFya2VyKGB8ICR7ZXhwLnVuaXF1ZU5hbWV9OiAke3JlbmRlclBhc3MudW5pcXVlTmFtZX0jYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcG8uc3dpdGNoRGVwdGhUZXN0KHJlbmRlclBhc3MuaXNEZXB0aFRlc3QpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRpZCA9PT0gV2VsbEtub3duQ29tcG9uZW50VElEcy5NZXNoUmVuZGVyZXJDb21wb25lbnRUSUQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGJpbmQgRnJhbWVidWZmZXJcbiAgICAgICAgICAgICAgICAgIFN5c3RlbS5iaW5kRnJhbWVidWZmZXJXZWJHTChyZW5kZXJQYXNzLCByblhSTW9kdWxlKTtcblxuICAgICAgICAgICAgICAgICAgLy8gc2V0IFZpZXdwb3J0IGZvciBOb3JtYWwgKE5vdCBXZWJYUilcbiAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRWaWV3cG9ydEZvck5vcm1hbFJlbmRlcmluZyhyZW5kZXJQYXNzLCByblhSTW9kdWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRpZCA9PT0gV2VsbEtub3duQ29tcG9uZW50VElEcy5NZXNoUmVuZGVyZXJDb21wb25lbnRUSUQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIEZyYW1lYnVmZmVyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9fY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY2xlYXJGcmFtZUJ1ZmZlcihyZW5kZXJQYXNzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZW5kZXJQYXNzLl9pc0NoYW5nZWRTb3J0UmVuZGVyUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWl0aXZlVWlkcyA9IE1lc2hSZW5kZXJlckNvbXBvbmVudC5zb3J0XyRyZW5kZXIocmVuZGVyUGFzcyk7XG4gICAgICAgICAgICAgICAgbGV0IGRvUmVuZGVyID0gcmVuZGVyUGFzcy5fcmVuZGVyZWRTb21ldGhpbmdCZWZvcmU7XG4gICAgICAgICAgICAgICAgaWYgKGRvUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDbGFzc19jb21tb25NZXRob2QgPSAoY29tcG9uZW50Q2xhc3MgYXMgYW55KVtjb21tb25NZXRob2ROYW1lXTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRDbGFzc19jb21tb25NZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTb21ldGhpbmcgPSBjb21wb25lbnRDbGFzc19jb21tb25NZXRob2Qoe1xuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBcHByb2FjaDogdGhpcy5fX3Byb2Nlc3NBcHByb2FjaCxcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQYXNzOiByZW5kZXJQYXNzLFxuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTdGFnZTogc3RhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzc1RpY2tDb3VudDogdGhpcy5fX3JlbmRlclBhc3NUaWNrQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlVWlkcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MuX3JlbmRlcmVkU29tZXRoaW5nQmVmb3JlID0gcmVuZGVyZWRTb21ldGhpbmc7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUaWQgIT09IFdlbGxLbm93bkNvbXBvbmVudFRJRHMuTWVzaFJlbmRlcmVyQ29tcG9uZW50VElEKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzLnByb2Nlc3MoY29tcG9uZW50Q2xhc3MsIHN0YWdlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlclBhc3NUaWNrQ291bnQrKztcblxuICAgICAgICAgICAgICAgIHJlbmRlclBhc3MuX2NvcHlGcmFtZWJ1ZmZlclRvUmVzb2x2ZUZyYW1lYnVmZmVyc1dlYkdMKCk7XG5cbiAgICAgICAgICAgICAgICByZW5kZXJQYXNzLmRvUG9zdFJlbmRlcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIEFuaW1hdGlvbkNvbXBvbmVudC5pc0FuaW1hdGluZyB8fFxuICAgICAgICAgICAgVHJhbnNmb3JtQ29tcG9uZW50LnVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCB8fFxuICAgICAgICAgICAgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC51cGRhdGVDb3VudCAhPT1cbiAgICAgICAgICAgICAgdGhpcy5fX2xhc3RDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50c1VwZGF0ZUNvdW50IHx8XG4gICAgICAgICAgICBQcmltaXRpdmUuZ2V0UHJpbWl0aXZlQ291bnQoKSAhPT0gdGhpcy5fX2xhc3RQcmltaXRpdmVDb3VudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnRUaWQgb2YgY29tcG9uZW50VGlkcykge1xuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDbGFzczogdHlwZW9mIENvbXBvbmVudCA9XG4gICAgICAgICAgICAgICAgQ29tcG9uZW50UmVwb3NpdG9yeS5nZXRDb21wb25lbnRDbGFzcyhjb21wb25lbnRUaWQpITtcblxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDbGFzc19jb21tb25NZXRob2QgPSAoY29tcG9uZW50Q2xhc3MgYXMgYW55KVtjb21tb25NZXRob2ROYW1lXTtcbiAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudENsYXNzX2NvbW1vbk1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzX2NvbW1vbk1ldGhvZCh7XG4gICAgICAgICAgICAgICAgICBwcm9jZXNzQXBwcm9hY2g6IHRoaXMuX19wcm9jZXNzQXBwcm9hY2gsXG4gICAgICAgICAgICAgICAgICByZW5kZXJQYXNzOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICBwcm9jZXNzU3RhZ2U6IHN0YWdlLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyUGFzc1RpY2tDb3VudDogdGhpcy5fX3JlbmRlclBhc3NUaWNrQ291bnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcy5wcm9jZXNzKGNvbXBvbmVudENsYXNzLCBzdGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9fbGFzdENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnRzVXBkYXRlQ291bnQgPSBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICAgICAgdGhpcy5fX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPSBUcmFuc2Zvcm1Db21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgICB0aGlzLl9fbGFzdFByaW1pdGl2ZUNvdW50ID0gUHJpbWl0aXZlLmdldFByaW1pdGl2ZUNvdW50KCk7XG4gICAgfVxuXG4gICAgVGltZS5fcHJvY2Vzc0VuZCgpO1xuICB9XG5cbiAgc3RhdGljIGdldCBwcm9jZXNzVGltZSgpIHtcbiAgICByZXR1cm4gVGltZS5sYXN0VGltZVRpbWVJbnRlcnZhbEluTWlsbGlzZWNvbmRzO1xuICB9XG5cbiAgc3RhdGljIGdldCB0aW1lQXRQcm9jZXNzQmVnaW4oKSB7XG4gICAgcmV0dXJuIFRpbWUudGltZUF0UHJvY2Vzc0JlZ2luTWlsbGlzZWNvbmRzO1xuICB9XG5cbiAgc3RhdGljIGdldCB0aW1lQXRQcm9jZXNzRW5kKCkge1xuICAgIHJldHVybiBUaW1lLnRpbWVBdFByb2Nlc3NFbmRNaWxsaXNlY29uZHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDYW1lcmEoKSB7XG4gICAgY29uc3QgY2FtZXJhRW50aXR5ID0gY3JlYXRlQ2FtZXJhRW50aXR5KCk7XG4gICAgY2FtZXJhRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCAwLCAxXSk7XG4gICAgY2FtZXJhRW50aXR5LmdldENhbWVyYSgpLnR5cGUgPSBDYW1lcmFUeXBlLk9ydGhvZ3JhcGhpYztcbiAgICBjYW1lcmFFbnRpdHkuZ2V0Q2FtZXJhKCkuek5lYXIgPSAwLjE7XG4gICAgY2FtZXJhRW50aXR5LmdldENhbWVyYSgpLnpGYXIgPSAxMDAwMDtcbiAgICBjb25zdCB3ZWJDR0FwaVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHdlYkNHQXBpUmVwb3NpdG9yeS5nZXRDYW52YXNTaXplKCk7XG4gICAgY2FtZXJhRW50aXR5LmdldENhbWVyYSgpLnhNYWcgPSB3aWR0aCAvIGhlaWdodDtcbiAgICBjYW1lcmFFbnRpdHkuZ2V0Q2FtZXJhKCkueU1hZyA9IDE7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzZXRWaWV3cG9ydEZvck5vcm1hbFJlbmRlcmluZyhyZW5kZXJQYXNzOiBSZW5kZXJQYXNzLCByblhSTW9kdWxlPzogUm5YUikge1xuICAgIGNvbnN0IHdlYlhSU3lzdGVtID0gcm5YUk1vZHVsZT8uV2ViWFJTeXN0ZW0uZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCB3ZWJBUlN5c3RlbSA9IHJuWFJNb2R1bGU/LldlYkFSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgaWYgKCghd2ViWFJTeXN0ZW0/LmlzV2ViWFJNb2RlIHx8ICFyZW5kZXJQYXNzLmlzVnJSZW5kZXJpbmcpICYmICF3ZWJBUlN5c3RlbT8uaXNXZWJBUk1vZGUpIHtcbiAgICAgICh0aGlzLl9fY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkpLnNldFZpZXdwb3J0KFxuICAgICAgICByZW5kZXJQYXNzLmdldFZpZXdwb3J0KClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYmluZEZyYW1lYnVmZmVyV2ViR0wocmVuZGVyUGFzczogUmVuZGVyUGFzcywgcm5YUk1vZHVsZT86IFJuWFIpIHtcbiAgICBjb25zdCB3ZWJYUlN5c3RlbSA9IHJuWFJNb2R1bGU/LldlYlhSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3Qgd2ViQVJTeXN0ZW0gPSByblhSTW9kdWxlPy5XZWJBUlN5c3RlbS5nZXRJbnN0YW5jZSgpO1xuICAgIGlmICh3ZWJYUlN5c3RlbT8uaXNXZWJYUk1vZGUgJiYgcmVuZGVyUGFzcy5pc091dHB1dEZvclZyKSB7XG4gICAgICBjb25zdCBnbHcgPSAodGhpcy5fX2NnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KVxuICAgICAgICAuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXIhO1xuICAgICAgY29uc3QgZ2wgPSBnbHcuZ2V0UmF3Q29udGV4dCgpO1xuICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB3ZWJYUlN5c3RlbS5mcmFtZWJ1ZmZlciEpO1xuICAgIH0gZWxzZSBpZiAod2ViQVJTeXN0ZW0/LmlzV2ViQVJNb2RlKSB7XG4gICAgICBjb25zdCBnbHcgPSAodGhpcy5fX2NnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KVxuICAgICAgICAuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXIhO1xuICAgICAgY29uc3QgZ2wgPSBnbHcuZ2V0UmF3Q29udGV4dCgpO1xuICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB3ZWJBUlN5c3RlbS5mcmFtZWJ1ZmZlciEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fX2NnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KS5iaW5kRnJhbWVidWZmZXIoXG4gICAgICAgIHJlbmRlclBhc3MuZ2V0RnJhbWVidWZmZXIoKVxuICAgICAgKTtcbiAgICAgICh0aGlzLl9fY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkpLnNldERyYXdUYXJnZXRzKHJlbmRlclBhc3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZGlzcGxheVJuSW5mbygpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAlY1Job2Rvbml0ZSVjV2ViM0QgTGlicmFyeSVjICVjdmVyc2lvbiVjJHtWRVJTSU9OLnZlcnNpb259JWMgJWNicmFuY2glYyR7VkVSU0lPTi5icmFuY2h9JWMgJWNtb2RlJWMke3RoaXMuX19wcm9jZXNzQXBwcm9hY2guc3RyfWAsXG4gICAgICBgZm9udC13ZWlnaHQ6IGJvbGQ7IHBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweCAwcHggMHB4IDZweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjZmYwMDg0IDAlLCNmZjAwMjIgMTAwJSk7YCxcbiAgICAgIGBwYWRkaW5nOiA0cHg7IGJvcmRlci1yYWRpdXM6IDBweCA2cHggNnB4IDBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjODQwMGZmIDAlLCM0NDAwZmYgMTAwJSk7YCxcbiAgICAgIGBgLFxuICAgICAgYGJhY2tncm91bmQ6ICM2NjY7IHBhZGRpbmc6IDRweDsgYm9yZGVyLXJhZGl1czogNnB4IDBweCAwcHggNnB4YCxcbiAgICAgIGBiYWNrZ3JvdW5kOiBmaXJlYnJpY2s7IHBhZGRpbmc6IDRweDsgYm9yZGVyLXJhZGl1czogMHB4IDZweCA2cHggMHB4YCxcbiAgICAgIGBgLFxuICAgICAgYGJhY2tncm91bmQ6ICM2NjY7IHBhZGRpbmc6IDRweDsgYm9yZGVyLXJhZGl1czogNnB4IDBweCAwcHggNnB4YCxcbiAgICAgIGBiYWNrZ3JvdW5kOiBncmVlbjsgcGFkZGluZzogNHB4OyBib3JkZXItcmFkaXVzOiAwcHggNnB4IDZweCAwcHhgLFxuICAgICAgYGAsXG4gICAgICBgYmFja2dyb3VuZDogIzY2NjsgcGFkZGluZzogNHB4OyBib3JkZXItcmFkaXVzOiA2cHggMHB4IDBweCA2cHhgLFxuICAgICAgYGJhY2tncm91bmQ6IGJsdWU7IHBhZGRpbmc6IDRweDsgYm9yZGVyLXJhZGl1czogMHB4IDZweCA2cHggMHB4YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgUmhvZG9uaXRlIHN5c3RlbS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRG9uJ3QgZm9yZ2V0IGBhd2FpdGAgdG8gdXNlIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogYXdhaXQgUm4uU3lzdGVtLmluaXQoe1xuICAgKiAgIGFwcHJvYWNoOiBSbi5Qcm9jZXNzQXBwcm9hY2guRGF0YVRleHR1cmUsXG4gICAqICAgY2FudmFzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd29ybGQnKSBhcyBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZGVzY1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBpbml0KGRlc2M6IFN5c3RlbUluaXREZXNjcmlwdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX19wcm9jZXNzQXBwcm9hY2ggPSBkZXNjLmFwcHJvYWNoO1xuICAgIFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPSBkZXNjLmFwcHJvYWNoO1xuICAgIGlmIChkZXNjLm5vdFRvRGlzcGxheVJuSW5mb0F0SW5pdCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5fX2Rpc3BsYXlSbkluZm8oKTtcbiAgICB9XG4gICAgYXdhaXQgTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRNb2R1bGUoJ3dlYmdsJyk7XG4gICAgYXdhaXQgTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRNb2R1bGUoJ3dlYmdwdScpO1xuICAgIGF3YWl0IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkTW9kdWxlKCdwYnInKTtcbiAgICBhd2FpdCBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZE1vZHVsZSgneHInKTtcbiAgICBDb25maWcuZXZlbnRUYXJnZXREb20gPSBkZXNjLmNhbnZhcztcblxuICAgIC8vIE1lbW9yeSBTZXR0aW5nc1xuICAgIE1lbW9yeU1hbmFnZXIuY3JlYXRlSW5zdGFuY2VJZk5vdENyZWF0ZWQoe1xuICAgICAgY3B1R2VuZXJpYzogSXMuZXhpc3QoZGVzYy5tZW1vcnlVc2FnZU9yZGVyKSA/IGRlc2MubWVtb3J5VXNhZ2VPcmRlci5jcHVHZW5lcmljIDogMC4xLFxuICAgICAgZ3B1SW5zdGFuY2VEYXRhOiBJcy5leGlzdChkZXNjLm1lbW9yeVVzYWdlT3JkZXIpXG4gICAgICAgID8gZGVzYy5tZW1vcnlVc2FnZU9yZGVyLmdwdUluc3RhbmNlRGF0YVxuICAgICAgICA6IDAuNSxcbiAgICAgIGdwdVZlcnRleERhdGE6IElzLmV4aXN0KGRlc2MubWVtb3J5VXNhZ2VPcmRlcikgPyBkZXNjLm1lbW9yeVVzYWdlT3JkZXIuZ3B1VmVydGV4RGF0YSA6IDAuNSxcbiAgICB9KTtcblxuICAgIFN5c3RlbS5fX2NnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBpZiAoZGVzYy5hcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgLy8gV2ViR1BVXG5cbiAgICAgIGNvbnN0IG1lbW9yeU1hbmFnZXIgPSBNZW1vcnlNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCByZXF1aXJlZEJ1ZmZlclNpemUgPSBtZW1vcnlNYW5hZ2VyLmdldE1lbW9yeVNpemUoKTtcblxuICAgICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID1cbiAgICAgICAgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnk7XG4gICAgICBjb25zdCBtb2R1bGUgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kdWxlKCd3ZWJncHUnKTtcbiAgICAgIGNvbnN0IFdlYkdwdURldmljZVdyYXBwZXJDbGFzcyA9IG1vZHVsZS5XZWJHcHVEZXZpY2VXcmFwcGVyIGFzIHR5cGVvZiBXZWJHcHVEZXZpY2VXcmFwcGVyO1xuICAgICAgY29uc3QgYWRhcHRlciA9IGF3YWl0IG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoKTtcbiAgICAgIGNvbnN0IHsgbWF4QnVmZmVyU2l6ZSwgbWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplIH0gPSBhZGFwdGVyIS5saW1pdHM7XG4gICAgICBpZiAobWF4QnVmZmVyU2l6ZSA8IHJlcXVpcmVkQnVmZmVyU2l6ZSB8fCBtYXhTdG9yYWdlQnVmZmVyQmluZGluZ1NpemUgPCByZXF1aXJlZEJ1ZmZlclNpemUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgaXMgdG9vIGxhcmdlIGZvciB0aGlzIGRldmljZS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZlYXR1cmVzOiBHUFVGZWF0dXJlTmFtZVtdID0gW107XG4gICAgICBmdW5jdGlvbiBhZGRGZWF0dXJlKGZlYXR1cmU6IEdQVUZlYXR1cmVOYW1lKSB7XG4gICAgICAgIGlmIChhZGFwdGVyIS5mZWF0dXJlcy5oYXMoZmVhdHVyZSkpIHtcbiAgICAgICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhZGRGZWF0dXJlKCdmbG9hdDMyLWZpbHRlcmFibGUnKTtcbiAgICAgIGFkZEZlYXR1cmUoJ3JnMTFiMTB1ZmxvYXQtcmVuZGVyYWJsZScpO1xuICAgICAgYWRkRmVhdHVyZSgndGV4dHVyZS1jb21wcmVzc2lvbi1iYycpO1xuICAgICAgYWRkRmVhdHVyZSgndGV4dHVyZS1jb21wcmVzc2lvbi1ldGMyJyk7XG4gICAgICBhZGRGZWF0dXJlKCd0ZXh0dXJlLWNvbXByZXNzaW9uLWFzdGMnKTtcblxuICAgICAgY29uc3QgZGV2aWNlID0gYXdhaXQgYWRhcHRlciEucmVxdWVzdERldmljZSh7XG4gICAgICAgIHJlcXVpcmVkRmVhdHVyZXM6IGZlYXR1cmVzLFxuICAgICAgICByZXF1aXJlZExpbWl0czoge1xuICAgICAgICAgIG1heFN0b3JhZ2VCdWZmZXJCaW5kaW5nU2l6ZSxcbiAgICAgICAgICBtYXhCdWZmZXJTaXplLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCB3ZWJHcHVEZXZpY2VXcmFwcGVyID0gbmV3IFdlYkdwdURldmljZVdyYXBwZXJDbGFzcyhkZXNjLmNhbnZhcywgYWRhcHRlciEsIGRldmljZSk7XG4gICAgICB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuYWRkV2ViR3B1RGV2aWNlV3JhcHBlcih3ZWJHcHVEZXZpY2VXcmFwcGVyKTtcbiAgICAgIHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeS5yZWNyZWF0ZVN5c3RlbURlcHRoVGV4dHVyZSgpO1xuICAgICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZVVuaWZvcm1Nb3JwaE9mZnNldHNCdWZmZXIoKTtcbiAgICAgIHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVVbmlmb3JtTW9ycGhXZWlnaHRzQnVmZmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlYkdMXG4gICAgICBjb25zdCByZXBvID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICAgIHJlcG8uZ2VuZXJhdGVXZWJHTENvbnRleHQoZGVzYy5jYW52YXMsIHRydWUsIGRlc2Mud2ViZ2xPcHRpb24pO1xuICAgICAgcmVwby5zd2l0Y2hEZXB0aFRlc3QodHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2xvYmFsRGF0YVJlcG9zaXRvcnkgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICAgIGdsb2JhbERhdGFSZXBvc2l0b3J5LmluaXRpYWxpemUoZGVzYy5hcHByb2FjaCk7XG5cbiAgICBpZiAoTWlzY1V0aWwuaXNNb2JpbGUoKSAmJiBQcm9jZXNzQXBwcm9hY2guaXNVbmlmb3JtQXBwcm9hY2goZGVzYy5hcHByb2FjaCkpIHtcbiAgICAgIExvZ2dlci53YXJuKFxuICAgICAgICAnVGhlIG51bWJlciBvZiBVbmlmb3JtIHZhcmlhYmxlcyBhdmFpbGFibGUgb24gbW9iaWxlIGRldmljZXMgaXMgbGltaXRlZCBhbmQgbWF5IGludGVyZmVyZSB3aXRoIHJlbmRlcmluZy4gVXNlIHRoZSBEYXRhVGV4dHVyZSBQcm9jZXNzQXBwcm9hY2ggZm9yIHRoaXMgZGV2aWNlLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGVhbCB3aXRoIFdlYkdMIGNvbnRleHQgbG9zdCBhbmQgcmVzdG9yZVxuICAgIGRlc2MuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnd2ViZ2xjb250ZXh0bG9zdCcsXG4gICAgICAoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAvLyBDYWxsaW5nIHByZXZlbnREZWZhdWx0IHNpZ25hbHMgdG8gdGhlIHBhZ2UgdGhhdCB5b3UgaW50ZW50IHRvIGhhbmRsZSBjb250ZXh0IHJlc3RvcmF0aW9uLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0b3BSZW5kZXJMb29wKCk7XG4gICAgICAgIExvZ2dlci5lcnJvcignV2ViR0wgY29udGV4dCBsb3N0IG9jY3VycmVkLicpO1xuICAgICAgfSkuYmluZCh0aGlzKVxuICAgICk7XG5cbiAgICBkZXNjLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsICgpID0+IHtcbiAgICAgIC8vIE9uY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhlIGdsIGNvbnRleHQgd2lsbCBiZSByZXN0b3JlZCBidXQgYW55IGdyYXBoaWNzIHJlc291cmNlc1xuICAgICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgbG9hZGVkIHdpbGwgYmUgbG9zdCwgc28gdGhlIHNjZW5lIHNob3VsZCBiZSByZWxvYWRlZC5cbiAgICAgIExvZ2dlci5lcnJvcignV2ViR0wgY29udGV4dCByZXN0b3JlZC4nKTtcbiAgICAgIC8vIFRPRE86IEltcGxlbWVudCByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGdyYXBoaWNzIHJlc291cmNlc1xuICAgICAgLy8gbG9hZFNjZW5lR3JhcGhpY3MoZ2wpO1xuICAgICAgdGhpcy5yZXN0YXJ0UmVuZGVyTG9vcCgpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgaW5pdERlZmF1bHRUZXh0dXJlcygpO1xuXG4gICAgU3lzdGVtU3RhdGUudmlld3BvcnRBc3BlY3RSYXRpbyA9IGRlc2MuY2FudmFzLndpZHRoIC8gZGVzYy5jYW52YXMuaGVpZ2h0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgcHJvY2Vzc0FwcHJvYWNoKCkge1xuICAgIHJldHVybiB0aGlzLl9fcHJvY2Vzc0FwcHJvYWNoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyByZXNpemVDYW52YXMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCByZXBvID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICByZXBvLnJlc2l6ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBTeXN0ZW1TdGF0ZS52aWV3cG9ydEFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldENhbnZhc1NpemUoKSB7XG4gICAgY29uc3QgcmVwbyA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgcmV0dXJuIHJlcG8uZ2V0Q2FudmFzU2l6ZSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRDdXJyZW50V2ViR0xDb250ZXh0V3JhcHBlcigpIHtcbiAgICByZXR1cm4gKHRoaXMuX19jZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb2Nlc3NBcHByb2FjaEVudW0sIFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5cbmNvbnN0IGN1cnJlbnRQcm9jZXNzQXBwcm9hY2g6IFByb2Nlc3NBcHByb2FjaEVudW0gPSBQcm9jZXNzQXBwcm9hY2guTm9uZTtcblxuZXhwb3J0IGNvbnN0IFN5c3RlbVN0YXRlID0ge1xuICBjdXJyZW50UHJvY2Vzc0FwcHJvYWNoLFxuICB2aWV3cG9ydEFzcGVjdFJhdGlvOiAwLFxuICB3ZWJncHVSZW5kZXJCdW5kbGVNb2RlOiBmYWxzZSxcbn07XG4iLCJleHBvcnQgKiBmcm9tICcuL0V2ZW50UHViU3ViJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXRNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vTW9kdWxlTWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL1N5c3RlbSc7XG5leHBvcnQgKiBmcm9tICcuL1N5c3RlbVN0YXRlJztcbiIsImltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBQaXhlbEZvcm1hdCwgUGl4ZWxGb3JtYXRFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUGl4ZWxGb3JtYXQnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENHQVBJUmVzb3VyY2VIYW5kbGUsIFRleHR1cmVVSUQsIFNpemUsIEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVGV4dHVyZURhdGFGbG9hdCB9IGZyb20gJy4vVGV4dHVyZURhdGFGbG9hdCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUsIENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29sb3JSZ2IgfSBmcm9tICcuLi9tYXRoL0NvbG9yUmdiJztcbmltcG9ydCB7IENvbG9yUmdiYSB9IGZyb20gJy4uL21hdGgvQ29sb3JSZ2JhJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvTXV0YWJsZVZlY3RvcjQnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vbWlzYy9Jcyc7XG5pbXBvcnQgeyBTYW1wbGVyIH0gZnJvbSAnLi9TYW1wbGVyJztcbmltcG9ydCB7IFRleHR1cmVGb3JtYXQsIFRleHR1cmVGb3JtYXRFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRleHR1cmUgZXh0ZW5kcyBSbk9iamVjdCB7XG4gIHByb3RlY3RlZCBfX3dpZHRoOiBTaXplID0gMDtcbiAgcHJvdGVjdGVkIF9faGVpZ2h0OiBTaXplID0gMDtcbiAgcHJvdGVjdGVkIF9fbGV2ZWw6IEluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIF9fbWlwTGV2ZWxDb3VudDogSW5kZXggPSAxO1xuICBwcm90ZWN0ZWQgX19pbnRlcm5hbEZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW0gPSBUZXh0dXJlRm9ybWF0LlJHQkE4O1xuICBwcm90ZWN0ZWQgX19mb3JtYXQ6IFBpeGVsRm9ybWF0RW51bSA9IFBpeGVsRm9ybWF0LlJHQkE7XG4gIHByb3RlY3RlZCBfX3R5cGU6IENvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGU7XG5cbiAgcHJvdGVjdGVkIF9faGFzVHJhbnNwYXJlbnRQaXhlbHMgPSBmYWxzZTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJbnZhbGlkVGV4dHVyZVVpZDogVGV4dHVyZVVJRCA9IC0xO1xuICBwcml2YXRlIHN0YXRpYyBfX3RleHR1cmVVaWRDb3VudDogVGV4dHVyZVVJRCA9IEFic3RyYWN0VGV4dHVyZS5JbnZhbGlkVGV4dHVyZVVpZDtcbiAgcHJpdmF0ZSBfX3RleHR1cmVVaWQ6IFRleHR1cmVVSUQ7XG4gIHByb3RlY3RlZCBfX2ltZz86IEhUTUxJbWFnZUVsZW1lbnQ7XG4gIHByb3RlY3RlZCBfX2lzVGV4dHVyZVJlYWR5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfX3N0YXJ0ZWRUb0xvYWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9faHRtbEltYWdlRWxlbWVudD86IEhUTUxJbWFnZUVsZW1lbnQ7XG4gIHByb3RlY3RlZCBfX2h0bWxDYW52YXNFbGVtZW50PzogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByb3RlY3RlZCBfX2NhbnZhc0NvbnRleHQ/OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByb3RlY3RlZCBfX3VyaT86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9fbmFtZSA9ICd1bnRpdGxlZCc7XG4gIHB1YmxpYyBfdGV4dHVyZVJlc291cmNlVWlkOiBDR0FQSVJlc291cmNlSGFuZGxlID0gLTE7XG4gIHB1YmxpYyBfc2FtcGxlclJlc291cmNlVWlkOiBDR0FQSVJlc291cmNlSGFuZGxlID0gLTE7XG4gIHB1YmxpYyBfdGV4dHVyZVZpZXdSZXNvdXJjZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSA9IC0xO1xuICBwdWJsaWMgX3RleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXRSZXNvdXJjZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSA9IC0xO1xuICBwdWJsaWMgX3JlY29tbWVuZGVkVGV4dHVyZVNhbXBsZXI/OiBTYW1wbGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fX3RleHR1cmVVaWQgPSArK0Fic3RyYWN0VGV4dHVyZS5fX3RleHR1cmVVaWRDb3VudDtcbiAgfVxuXG4gIGdldCB0ZXh0dXJlVUlEKCkge1xuICAgIHJldHVybiB0aGlzLl9fdGV4dHVyZVVpZDtcbiAgfVxuXG4gIGdldCB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3dpZHRoO1xuICB9XG5cbiAgZ2V0V2lkdGhBdE1pcExldmVsKG1pcExldmVsOiBJbmRleCkge1xuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHRoaXMuX193aWR0aCAvIE1hdGgucG93KDIsIG1pcExldmVsKSkpO1xuICB9XG5cbiAgZ2V0SGVpZ2h0QXRNaXBMZXZlbChtaXBMZXZlbDogSW5kZXgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLl9faGVpZ2h0IC8gTWF0aC5wb3coMiwgbWlwTGV2ZWwpKSk7XG4gIH1cblxuICBzZXQgd2lkdGgodmFsOiBTaXplKSB7XG4gICAgdGhpcy5fX3dpZHRoID0gdmFsO1xuICB9XG5cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2hlaWdodDtcbiAgfVxuXG4gIHNldCBoZWlnaHQodmFsOiBTaXplKSB7XG4gICAgdGhpcy5fX2hlaWdodCA9IHZhbDtcbiAgfVxuXG4gIGdldCBpc1RleHR1cmVSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzVGV4dHVyZVJlYWR5O1xuICB9XG5cbiAgZ2V0IHN0YXJ0ZWRUb0xvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zdGFydGVkVG9Mb2FkO1xuICB9XG5cbiAgZ2V0IGh0bWxJbWFnZUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19odG1sSW1hZ2VFbGVtZW50O1xuICB9XG5cbiAgZ2V0IGh0bWxDYW52YXNFbGVtZW50KCkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcz8uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB0aGlzLl9faHRtbENhbnZhc0VsZW1lbnQgPSBjYW52YXM7XG4gICAgaWYgKElzLmV4aXN0KGN0eCkgJiYgSXMuZXhpc3QodGhpcy5fX2h0bWxJbWFnZUVsZW1lbnQpKSB7XG4gICAgICBjYW52YXMud2lkdGggPSB0aGlzLl9faHRtbEltYWdlRWxlbWVudC53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLl9faHRtbEltYWdlRWxlbWVudC5oZWlnaHQ7XG4gICAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgICB0aGlzLl9faHRtbEltYWdlRWxlbWVudCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgdGhpcy5fX2h0bWxJbWFnZUVsZW1lbnQud2lkdGgsXG4gICAgICAgIHRoaXMuX19odG1sSW1hZ2VFbGVtZW50LmhlaWdodFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19odG1sQ2FudmFzRWxlbWVudDtcbiAgfVxuXG4gIGdldCB1cmkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX191cmk7XG4gIH1cblxuICBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9fbmFtZSA9IG5hbWU7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9fbmFtZTtcbiAgfVxuXG4gIGdldEltYWdlRGF0YSh4OiBJbmRleCwgeTogSW5kZXgsIHdpZHRoOiBTaXplLCBoZWlnaHQ6IFNpemUpIHtcbiAgICBpZiAodGhpcy5fX2NhbnZhc0NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jcmVhdGVJbnRlcm5hbENhbnZhc0NvbnRleHQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMuX19jYW52YXNDb250ZXh0IGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkuZ2V0SW1hZ2VEYXRhKHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgZ2V0UGl4ZWxBcyhcbiAgICB4OiBJbmRleCxcbiAgICB5OiBJbmRleCxcbiAgICB0eXBlQ2xhc3M6XG4gICAgICB8IHR5cGVvZiBDb2xvclJnYlxuICAgICAgfCB0eXBlb2YgQ29sb3JSZ2JhXG4gICAgICB8IHR5cGVvZiBWZWN0b3IzXG4gICAgICB8IHR5cGVvZiBNdXRhYmxlVmVjdG9yM1xuICAgICAgfCB0eXBlb2YgVmVjdG9yNFxuICAgICAgfCB0eXBlb2YgTXV0YWJsZVZlY3RvcjRcbiAgKSB7XG4gICAgY29uc3QgcGl4ZWwgPSB0aGlzLmdldEltYWdlRGF0YSh4LCB5LCAxLCAxKTtcbiAgICBjb25zdCBkYXRhID0gcGl4ZWwuZGF0YTtcbiAgICBpZiAodHlwZUNsYXNzLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzQpIHtcbiAgICAgIHJldHVybiBuZXcgKHR5cGVDbGFzcyBhcyBhbnkpKG5ldyBGbG9hdDMyQXJyYXkoW2RhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM11dKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgKHR5cGVDbGFzcyBhcyBhbnkpKG5ldyBGbG9hdDMyQXJyYXkoW2RhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl1dKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgcGl4ZWwgZGF0YSBhdCAoeCx5KSBpbiB0aGUgVGV4dHVyZSBhcyBVaW50OENsYW1wZWQgQXJyYXlcbiAgICogQHBhcmFtIHggeCBwb3NpdGlvbiBpbiB0aGUgdGV4dHVyZVxuICAgKiBAcGFyYW0geSB5IHBvc2l0aW9uIGluIHRoZSB0ZXh0dXJlXG4gICAqIEByZXR1cm5zIGEgcGl4ZWwgZGF0YSBhcyBVaW50OENsYW1wZWQgQXJyYXlcbiAgICovXG4gIGdldFBpeGVsQXNBcnJheSh4OiBJbmRleCwgeTogSW5kZXgpOiBVaW50OENsYW1wZWRBcnJheSB7XG4gICAgY29uc3QgcGl4ZWwgPSB0aGlzLmdldEltYWdlRGF0YSh4LCB5LCAxLCAxKTtcbiAgICByZXR1cm4gcGl4ZWwuZGF0YTtcbiAgfVxuXG4gIHNldFBpeGVsKFxuICAgIHg6IEluZGV4LFxuICAgIHk6IEluZGV4LFxuICAgIHZhbHVlOiBDb2xvclJnYiB8IENvbG9yUmdiYSB8IFZlY3RvcjMgfCBNdXRhYmxlVmVjdG9yMyB8IFZlY3RvcjQgfCBNdXRhYmxlVmVjdG9yNFxuICApIHtcbiAgICBjb25zdCBwaXhlbCA9IHRoaXMuZ2V0SW1hZ2VEYXRhKHgsIHksIDEsIDEpO1xuICAgIGNvbnN0IGRhdGEgPSBwaXhlbC5kYXRhO1xuICAgIGNvbnN0IGNsYXNzT2ZWYWx1ZSA9IHZhbHVlLmNvbnN0cnVjdG9yIGFzIHVua25vd24gYXMge1xuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtOyAvLyB2YWx1ZS5jb25zdHJ1Y3RvciBuZWVkcyB0byBoYXZlIGNvbXBvc2l0aW9uVHlwZSBvbmx5XG4gICAgfTtcblxuICAgIGNvbnN0IG51bWJlck9mQ29tcG9uZW50cyA9IGNsYXNzT2ZWYWx1ZS5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZkNvbXBvbmVudHM7IGkrKykge1xuICAgICAgZGF0YVtpXSA9IHZhbHVlLmF0KGkpO1xuICAgIH1cbiAgICB0aGlzLl9fY2FudmFzQ29udGV4dCEucHV0SW1hZ2VEYXRhKHBpeGVsLCB4LCB5KTtcbiAgfVxuXG4gIHNldFBpeGVsQXRDaGFubmVsKHg6IEluZGV4LCB5OiBJbmRleCwgY2hhbm5lbElkeDogSW5kZXgsIHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBwaXhlbCA9IHRoaXMuZ2V0SW1hZ2VEYXRhKHgsIHksIDEsIDEpO1xuICAgIGNvbnN0IGRhdGEgPSBwaXhlbC5kYXRhO1xuICAgIGRhdGFbY2hhbm5lbElkeF0gPSB2YWx1ZTtcbiAgICB0aGlzLl9fY2FudmFzQ29udGV4dCEucHV0SW1hZ2VEYXRhKHBpeGVsLCB4LCB5KTtcbiAgfVxuXG4gIGdldCBpc1RyYW5zcGFyZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9faGFzVHJhbnNwYXJlbnRQaXhlbHM7XG4gIH1cblxuICBjcmVhdGVJbnRlcm5hbENhbnZhc0NvbnRleHQoKSB7XG4gICAgbGV0IGNhbnZhcztcbiAgICBpZiAodGhpcy5fX2h0bWxDYW52YXNFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIGNhbnZhcyA9IHRoaXMuX19odG1sQ2FudmFzRWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLl9faHRtbENhbnZhc0VsZW1lbnQgPSBjYW52YXM7XG4gICAgdGhpcy5fX2NhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG4gIH1cblxuICBnZXRUZXh0dXJlRGF0YUZsb2F0KGNoYW5uZWxzOiBTaXplKTogVGV4dHVyZURhdGFGbG9hdCB7XG4gICAgY29uc3QgcGl4ZWwgPSB0aGlzLmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgY29uc3QgdGV4dHVyZURhdGFGbG9hdCA9IG5ldyBUZXh0dXJlRGF0YUZsb2F0KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBjaGFubmVscyk7XG4gICAgY29uc3QgZGF0YSA9IHBpeGVsLmRhdGE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmhlaWdodDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMud2lkdGg7IGorKykge1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNoYW5uZWxzOyBrKyspIHtcbiAgICAgICAgICB0ZXh0dXJlRGF0YUZsb2F0LnNldFBpeGVsQXRDaGFubmVsKGosIGksIGssIGRhdGFbaSAqIHRoaXMud2lkdGggKiA0ICsgaiAqIDQgKyBrXSAvIDI1NSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHR1cmVEYXRhRmxvYXQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0VGV4dHVyZSB9IGZyb20gJy4vQWJzdHJhY3RUZXh0dXJlJztcbmltcG9ydCB7IEhkcmlGb3JtYXQgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9IZHJpRm9ybWF0JztcbmltcG9ydCB7IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQmFzaXNUcmFuc2NvZGVyLCBCQVNJUyB9IGZyb20gJy4uLy4uL3R5cGVzL0Jhc2lzVGV4dHVyZSc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVGV4dHVyZVBhcmFtZXRlcic7XG5pbXBvcnQgeyBTaXplLCBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL3dlYmdwdS9XZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG5kZWNsYXJlIGNvbnN0IEJBU0lTOiBCQVNJUztcblxuZXhwb3J0IGNsYXNzIEN1YmVUZXh0dXJlIGV4dGVuZHMgQWJzdHJhY3RUZXh0dXJlIHtcbiAgcHVibGljIGJhc2VVcmlUb0xvYWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBtaXBtYXBMZXZlbE51bWJlciA9IDE7XG4gIHB1YmxpYyBoZHJpRm9ybWF0ID0gSGRyaUZvcm1hdC5MRFJfU1JHQjtcbiAgcHVibGljIGlzTmFtZVBvc05lZyA9IGZhbHNlO1xuICBwcml2YXRlIF9fb25UZXh0dXJlTG9hZGVkQXJyYXk6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25UZXh0dXJlTG9hZGVkKGZ1bmM6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLl9fb25UZXh0dXJlTG9hZGVkQXJyYXkucHVzaChmdW5jKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRUZXh0dXJlSW1hZ2VzKCkge1xuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgW3Jlc291cmNlVWlkLCBzYW1wbGVyXSA9IGF3YWl0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZUN1YmVUZXh0dXJlRnJvbUZpbGVzKFxuICAgICAgdGhpcy5iYXNlVXJpVG9Mb2FkISxcbiAgICAgIHRoaXMubWlwbWFwTGV2ZWxOdW1iZXIhLFxuICAgICAgdGhpcy5pc05hbWVQb3NOZWcsXG4gICAgICB0aGlzLmhkcmlGb3JtYXRcbiAgICApO1xuICAgIHRoaXMuX3JlY29tbWVuZGVkVGV4dHVyZVNhbXBsZXIgPSBzYW1wbGVyO1xuICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCA9IHJlc291cmNlVWlkO1xuICAgIHRoaXMuX3NhbXBsZXJSZXNvdXJjZVVpZCA9IHNhbXBsZXIuX3NhbXBsZXJSZXNvdXJjZVVpZDtcblxuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICB0aGlzLl90ZXh0dXJlVmlld1Jlc291cmNlVWlkID0gKFxuICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICkuY3JlYXRlVGV4dHVyZVZpZXdDdWJlKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGxvYWRUZXh0dXJlSW1hZ2VzQXN5bmMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLl9fc3RhcnRlZFRvTG9hZCA9IHRydWU7XG4gICAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeVxuICAgICAgICAuY3JlYXRlQ3ViZVRleHR1cmVGcm9tRmlsZXMoXG4gICAgICAgICAgdGhpcy5iYXNlVXJpVG9Mb2FkISxcbiAgICAgICAgICB0aGlzLm1pcG1hcExldmVsTnVtYmVyISxcbiAgICAgICAgICB0aGlzLmlzTmFtZVBvc05lZyxcbiAgICAgICAgICB0aGlzLmhkcmlGb3JtYXRcbiAgICAgICAgKVxuICAgICAgICAudGhlbigoW2N1YmVUZXh0dXJlVWlkLCBzYW1wbGVyXSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCA9IGN1YmVUZXh0dXJlVWlkO1xuICAgICAgICAgIHRoaXMuX3JlY29tbWVuZGVkVGV4dHVyZVNhbXBsZXIgPSBzYW1wbGVyO1xuICAgICAgICAgIHRoaXMuX3NhbXBsZXJSZXNvdXJjZVVpZCA9IHNhbXBsZXIuX3NhbXBsZXJSZXNvdXJjZVVpZDtcblxuICAgICAgICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0dXJlVmlld1Jlc291cmNlVWlkID0gKFxuICAgICAgICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICAgICAgICkuY3JlYXRlVGV4dHVyZVZpZXdDdWJlKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9fb25UZXh0dXJlTG9hZGVkQXJyYXkuZm9yRWFjaCgoZnVuYykgPT4ge1xuICAgICAgICAgICAgZnVuYygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX19vblRleHR1cmVMb2FkZWRBcnJheSA9IFtdO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBsb2FkVGV4dHVyZUltYWdlc0Zyb21CYXNpcyhcbiAgICB1aW50OEFycmF5OiBVaW50OEFycmF5LFxuICAgIHtcbiAgICAgIG1hZ0ZpbHRlciA9IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyLFxuICAgICAgbWluRmlsdGVyID0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXJNaXBtYXBMaW5lYXIsXG4gICAgICB3cmFwUyA9IFRleHR1cmVQYXJhbWV0ZXIuUmVwZWF0LFxuICAgICAgd3JhcFQgPSBUZXh0dXJlUGFyYW1ldGVyLlJlcGVhdCxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fX3N0YXJ0ZWRUb0xvYWQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBCQVNJUyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIExvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNhbGwgQkFTSVMoKSBmdW5jdGlvbi4gUGxlYXNlIGNoZWNrIHRvIGltcG9ydCBiYXNpc190cmFuc2NvZGVyLmpzLicpO1xuICAgIH1cblxuICAgIEJBU0lTKCkudGhlbigoYmFzaXNUcmFuc0NvZGVyOiBCYXNpc1RyYW5zY29kZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5pdGlhbGl6ZUJhc2lzIH0gPSBiYXNpc1RyYW5zQ29kZXI7XG4gICAgICBpbml0aWFsaXplQmFzaXMoKTtcblxuICAgICAgY29uc3QgQmFzaXNGaWxlID0gYmFzaXNUcmFuc0NvZGVyLkJhc2lzRmlsZTtcbiAgICAgIGNvbnN0IGJhc2lzRmlsZSA9IG5ldyBCYXNpc0ZpbGUodWludDhBcnJheSk7XG5cbiAgICAgIGlmICghYmFzaXNGaWxlLnN0YXJ0VHJhbnNjb2RpbmcoKSkge1xuICAgICAgICBMb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byBzdGFydCB0cmFuc2NvZGluZy4nKTtcbiAgICAgICAgYmFzaXNGaWxlLmNsb3NlKCk7XG4gICAgICAgIGJhc2lzRmlsZS5kZWxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgICBjb25zdCB0ZXh0dXJlID0gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlQ3ViZVRleHR1cmVGcm9tQmFzaXMoYmFzaXNGaWxlLCB7XG4gICAgICAgIG1hZ0ZpbHRlcjogbWFnRmlsdGVyLFxuICAgICAgICBtaW5GaWx0ZXI6IG1pbkZpbHRlcixcbiAgICAgICAgd3JhcFM6IHdyYXBTLFxuICAgICAgICB3cmFwVDogd3JhcFQsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkID0gdGV4dHVyZTtcbiAgICAgIHRoaXMuX19pc1RleHR1cmVSZWFkeSA9IHRydWU7XG5cbiAgICAgIGJhc2lzRmlsZS5jbG9zZSgpO1xuICAgICAgYmFzaXNGaWxlLmRlbGV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZDF4MVRleHR1cmUocmdiYVN0ciA9ICdyZ2JhKDAsMCwwLDEpJykge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuICAgIGN0eC5maWxsU3R5bGUgPSByZ2JhU3RyO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG5cbiAgICBjb25zdCBbcmVzb3VyY2VVaWQsIHNhbXBsZXJdID0gY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlQ3ViZVRleHR1cmUoXG4gICAgICAxLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcG9zWDogY2FudmFzLFxuICAgICAgICAgIG5lZ1g6IGNhbnZhcyxcbiAgICAgICAgICBwb3NZOiBjYW52YXMsXG4gICAgICAgICAgbmVnWTogY2FudmFzLFxuICAgICAgICAgIHBvc1o6IGNhbnZhcyxcbiAgICAgICAgICBuZWdaOiBjYW52YXMsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMSxcbiAgICAgIDFcbiAgICApO1xuICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCA9IHJlc291cmNlVWlkO1xuICAgIHRoaXMuX3JlY29tbWVuZGVkVGV4dHVyZVNhbXBsZXIgPSBzYW1wbGVyO1xuICAgIHRoaXMuX3NhbXBsZXJSZXNvdXJjZVVpZCA9IHNhbXBsZXIuX3NhbXBsZXJSZXNvdXJjZVVpZDtcblxuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICB0aGlzLl90ZXh0dXJlVmlld1Jlc291cmNlVWlkID0gKFxuICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICkuY3JlYXRlVGV4dHVyZVZpZXdDdWJlKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBjdWJlbWFwIHRleHR1cmUgb2JqZWN0IGZyb20gdHlwZWQgYXJyYXkgb2YgY3ViZW1hcCBpbWFnZXNcbiAgICogQHBhcmFtIHR5cGVkQXJyYXlzIEFycmF5IG9mIHR5cGVkIGFycmF5IG9iamVjdCBmb3IgY3ViZW1hcCB0ZXh0dXJlcy4gVGhlIG50aCBlbGVtZW50IGlzIHRoZSBudGggbWlwbWFwIHJlZHVjdGlvbiBsZXZlbChsZXZlbCAwIGlzIHRoZSBiYXNlIGltYWdlIGxldmVsKS5cbiAgICogQHBhcmFtIHdpZHRoIFRleHR1cmUgd2lkdGggb2YgdGhlIGJhc2UgaW1hZ2UgbGV2ZWwgdGV4dHVyZVxuICAgKiBAcGFyYW0gaGVpZ2h0IFRleHR1cmUgaGVpZ2h0IG9mIHRoZSBiYXNlIGltYWdlIGxldmVsIHRleHR1cmVcbiAgICovXG4gIGdlbmVyYXRlVGV4dHVyZUZyb21UeXBlZEFycmF5cyhcbiAgICB0eXBlZEFycmF5SW1hZ2VzOiBBcnJheTx7XG4gICAgICBwb3NYOiBUeXBlZEFycmF5O1xuICAgICAgbmVnWDogVHlwZWRBcnJheTtcbiAgICAgIHBvc1k6IFR5cGVkQXJyYXk7XG4gICAgICBuZWdZOiBUeXBlZEFycmF5O1xuICAgICAgcG9zWjogVHlwZWRBcnJheTtcbiAgICAgIG5lZ1o6IFR5cGVkQXJyYXk7XG4gICAgfT4sXG4gICAgYmFzZUxldmVsV2lkdGg6IFNpemUsXG4gICAgYmFzZUxldmVsSGVpZ2h0OiBTaXplXG4gICkge1xuICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcblxuICAgIGNvbnN0IFtyZXNvdXJjZUlkLCBzYW1wbGVyXSA9IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZUN1YmVUZXh0dXJlKFxuICAgICAgdHlwZWRBcnJheUltYWdlcy5sZW5ndGgsXG4gICAgICB0eXBlZEFycmF5SW1hZ2VzLFxuICAgICAgYmFzZUxldmVsV2lkdGgsXG4gICAgICBiYXNlTGV2ZWxIZWlnaHRcbiAgICApO1xuICAgIHRoaXMuX3JlY29tbWVuZGVkVGV4dHVyZVNhbXBsZXIgPSBzYW1wbGVyO1xuICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCA9IHJlc291cmNlSWQ7XG5cbiAgICB0aGlzLl9faXNUZXh0dXJlUmVhZHkgPSB0cnVlO1xuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgfVxuXG4gIGltcG9ydFdlYkdMVGV4dHVyZURpcmVjdGx5KHdlYkdMVGV4dHVyZTogV2ViR0xUZXh0dXJlLCB3aWR0aCA9IDAsIGhlaWdodCA9IDApIHtcbiAgICB0aGlzLl9fd2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9faGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCB0ZXh0dXJlID0gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0V2ViR0xUZXh0dXJlRGlyZWN0bHkod2ViR0xUZXh0dXJlKTtcbiAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQgPSB0ZXh0dXJlO1xuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgICB0aGlzLl9faXNUZXh0dXJlUmVhZHkgPSB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDR0FQSVJlc291cmNlSGFuZGxlLCBJbmRleCwgU2l6ZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IEZyYW1lQnVmZmVyIH0gZnJvbSAnLi4vcmVuZGVyZXIvRnJhbWVCdWZmZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZW5kZXJhYmxlIHtcbiAgd2lkdGg6IFNpemU7XG4gIGhlaWdodDogU2l6ZTtcbiAgX3RleHR1cmVSZXNvdXJjZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZTtcbiAgX3RleHR1cmVWaWV3UmVzb3VyY2VVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGU7XG4gIF90ZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0UmVzb3VyY2VVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGU7XG4gIHJlc2l6ZSh3aWR0aDogU2l6ZSwgaGVpZ2h0OiBTaXplKTogdm9pZDtcbiAgZGVzdHJveTNEQVBJUmVzb3VyY2VzKCk6IGJvb2xlYW47XG4gIGNyZWF0ZUN1YmVUZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0KGZhY2VJZHg6IEluZGV4LCBtaXBMZXZlbDogSW5kZXgpOiB2b2lkO1xuICBmYm8/OiBGcmFtZUJ1ZmZlcjtcbn1cbiIsImltcG9ydCB7IFJuT2JqZWN0IH0gZnJvbSAnLi4vY29yZS9Sbk9iamVjdCc7XG5pbXBvcnQgeyBJUmVuZGVyYWJsZSB9IGZyb20gJy4vSVJlbmRlcmFibGUnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyLCBUZXh0dXJlUGFyYW1ldGVyRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgU2l6ZSwgQ0dBUElSZXNvdXJjZUhhbmRsZSwgSW5kZXggfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBGcmFtZUJ1ZmZlciB9IGZyb20gJy4uL3JlbmRlcmVyL0ZyYW1lQnVmZmVyJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IFByb2Nlc3NBcHByb2FjaCB9IGZyb20gJy4uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi93ZWJncHUvV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFRleHR1cmVGb3JtYXQsIFRleHR1cmVGb3JtYXRFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdCc7XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJCdWZmZXIgZXh0ZW5kcyBSbk9iamVjdCBpbXBsZW1lbnRzIElSZW5kZXJhYmxlIHtcbiAgd2lkdGggPSAwO1xuICBoZWlnaHQgPSAwO1xuICBwcml2YXRlIF9faW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVGb3JtYXRFbnVtID0gVGV4dHVyZUZvcm1hdC5EZXB0aDI0O1xuICBwdWJsaWMgX3RleHR1cmVSZXNvdXJjZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSA9IC0xO1xuICBwdWJsaWMgX3RleHR1cmVWaWV3UmVzb3VyY2VVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSAtMTtcbiAgcHVibGljIF90ZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0UmVzb3VyY2VVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSAtMTtcbiAgcHJpdmF0ZSBfX2Zibz86IEZyYW1lQnVmZmVyO1xuICBwcml2YXRlIF9faXNNU0FBID0gZmFsc2U7XG4gIHByaXZhdGUgX19zYW1wbGVDb3VudE1TQUEgPSA0O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBzZXQgX2ZibyhmYm86IEZyYW1lQnVmZmVyKSB7XG4gICAgdGhpcy5fX2ZibyA9IGZibztcbiAgfVxuXG4gIGdldCBmYm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19mYm87XG4gIH1cblxuICBnZXQgc2FtcGxlQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zYW1wbGVDb3VudE1TQUE7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgd2lkdGg6IFNpemUsXG4gICAgaGVpZ2h0OiBTaXplLFxuICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bSxcbiAgICB7IGlzTVNBQSA9IGZhbHNlLCBzYW1wbGVDb3VudE1TQUEgPSB0aGlzLl9fc2FtcGxlQ291bnRNU0FBIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fX2lzTVNBQSA9IGlzTVNBQTtcbiAgICB0aGlzLl9fc2FtcGxlQ291bnRNU0FBID0gc2FtcGxlQ291bnRNU0FBO1xuICAgIHRoaXMuX19pbnRlcm5hbEZvcm1hdCA9IGludGVybmFsRm9ybWF0O1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVSZW5kZXJCdWZmZXIoXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgaXNNU0FBLFxuICAgICAgc2FtcGxlQ291bnRNU0FBXG4gICAgKTtcblxuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICB0aGlzLl90ZXh0dXJlVmlld1Jlc291cmNlVWlkID0gKFxuICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICkuY3JlYXRlVGV4dHVyZVZpZXcyZCh0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICAgICAgdGhpcy5fdGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldFJlc291cmNlVWlkID0gKFxuICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICkuY3JlYXRlVGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldCh0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUN1YmVUZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0KGZhY2VJZHg6IEluZGV4LCBtaXBMZXZlbDogSW5kZXgpOiB2b2lkIHt9XG5cbiAgcmVzaXplKHdpZHRoOiBTaXplLCBoZWlnaHQ6IFNpemUpIHtcbiAgICB0aGlzLmRlc3Ryb3kzREFQSVJlc291cmNlcygpO1xuICAgIHRoaXMuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRoaXMuX19pbnRlcm5hbEZvcm1hdCwgeyBpc01TQUE6IHRoaXMuX19pc01TQUEgfSk7XG4gIH1cblxuICBkZXN0cm95M0RBUElSZXNvdXJjZXMoKSB7XG4gICAgdGhpcy53aWR0aCA9IDA7XG4gICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5kZWxldGVSZW5kZXJCdWZmZXIodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgUGl4ZWxGb3JtYXQsIFBpeGVsRm9ybWF0RW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1BpeGVsRm9ybWF0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtLCBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBJUmVuZGVyYWJsZSB9IGZyb20gJy4vSVJlbmRlcmFibGUnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBTaXplLCBJbmRleCB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IEZyYW1lQnVmZmVyIH0gZnJvbSAnLi4vcmVuZGVyZXIvRnJhbWVCdWZmZXInO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi93ZWJncHUvV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFRleHR1cmVGb3JtYXQsIFRleHR1cmVGb3JtYXRFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdCc7XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJUYXJnZXRUZXh0dXJlIGV4dGVuZHMgQWJzdHJhY3RUZXh0dXJlIGltcGxlbWVudHMgSVJlbmRlcmFibGUge1xuICBwcml2YXRlIF9fZmJvPzogRnJhbWVCdWZmZXI7XG4gIHByaXZhdGUgX19hcnJheUxlbmd0aDogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGNyZWF0ZSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIG1pcExldmVsQ291bnQsXG4gICAgZm9ybWF0OiBpbnRlcm5hbEZvcm1hdCxcbiAgfToge1xuICAgIHdpZHRoOiBTaXplO1xuICAgIGhlaWdodDogU2l6ZTtcbiAgICBtaXBMZXZlbENvdW50PzogbnVtYmVyO1xuICAgIGZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG4gIH0pIHtcbiAgICB0aGlzLl9fd2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9faGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuX19taXBMZXZlbENvdW50ID0gbWlwTGV2ZWxDb3VudCA/PyBNYXRoLmZsb29yKE1hdGgubG9nMihNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkpICsgMTtcblxuICAgIGNvbnN0IHsgZm9ybWF0LCB0eXBlIH0gPVxuICAgICAgVGV4dHVyZUZvcm1hdC5nZXRQaXhlbEZvcm1hdEFuZENvbXBvbmVudFR5cGVGcm9tVGV4dHVyZUZvcm1hdChpbnRlcm5hbEZvcm1hdCk7XG5cbiAgICB0aGlzLl9faW50ZXJuYWxGb3JtYXQgPSBpbnRlcm5hbEZvcm1hdDtcbiAgICB0aGlzLl9fZm9ybWF0ID0gZm9ybWF0O1xuICAgIHRoaXMuX190eXBlID0gdHlwZTtcblxuICAgIHRoaXMuX19jcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlKCk7XG4gIH1cblxuICBjcmVhdGVUZXh0dXJlQXJyYXkoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBsZXZlbCA9IDAsXG4gICAgaW50ZXJuYWxGb3JtYXQgPSBUZXh0dXJlRm9ybWF0LlJHQjgsXG4gICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICB0eXBlID0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGUsXG4gICAgYXJyYXlMZW5ndGgsXG4gIH06IHtcbiAgICB3aWR0aDogU2l6ZTtcbiAgICBoZWlnaHQ6IFNpemU7XG4gICAgbGV2ZWw6IG51bWJlcjtcbiAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG4gICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgYXJyYXlMZW5ndGg6IG51bWJlcjtcbiAgfSkge1xuICAgIHRoaXMuX193aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuX19oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fX2xldmVsID0gbGV2ZWw7XG4gICAgdGhpcy5fX2ludGVybmFsRm9ybWF0ID0gaW50ZXJuYWxGb3JtYXQ7XG4gICAgdGhpcy5fX2Zvcm1hdCA9IGZvcm1hdDtcbiAgICB0aGlzLl9fdHlwZSA9IHR5cGU7XG4gICAgdGhpcy5fX2FycmF5TGVuZ3RoID0gYXJyYXlMZW5ndGg7XG5cbiAgICB0aGlzLl9fY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZUFycmF5KCk7XG4gIH1cblxuICBzZXQgX2ZibyhmYm86IEZyYW1lQnVmZmVyKSB7XG4gICAgdGhpcy5fX2ZibyA9IGZibztcbiAgfVxuXG4gIGdldCBmYm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19mYm87XG4gIH1cblxuICBnZXQgYXJyYXlMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19hcnJheUxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlKCkge1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCB0ZXh0dXJlID0gY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZSh7XG4gICAgICB3aWR0aDogdGhpcy5fX3dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLl9faGVpZ2h0LFxuICAgICAgbWlwTGV2ZWxDb3VudDogdGhpcy5fX21pcExldmVsQ291bnQsXG4gICAgICBmb3JtYXQ6IHRoaXMuX19pbnRlcm5hbEZvcm1hdCxcbiAgICB9KTtcbiAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQgPSB0ZXh0dXJlO1xuXG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHRoaXMuX3RleHR1cmVWaWV3UmVzb3VyY2VVaWQgPSAoXG4gICAgICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeVxuICAgICAgKS5jcmVhdGVUZXh0dXJlVmlldzJkKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgICB0aGlzLl90ZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0UmVzb3VyY2VVaWQgPSAoXG4gICAgICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeVxuICAgICAgKS5jcmVhdGVUZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0KHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2NyZWF0ZVJlbmRlclRhcmdldFRleHR1cmVBcnJheSgpIHtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgdGV4dHVyZSA9IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZVJlbmRlclRhcmdldFRleHR1cmVBcnJheSh7XG4gICAgICB3aWR0aDogdGhpcy5fX3dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLl9faGVpZ2h0LFxuICAgICAgbGV2ZWw6IHRoaXMuX19sZXZlbCxcbiAgICAgIGludGVybmFsRm9ybWF0OiB0aGlzLl9faW50ZXJuYWxGb3JtYXQsXG4gICAgICBmb3JtYXQ6IHRoaXMuX19mb3JtYXQsXG4gICAgICB0eXBlOiB0aGlzLl9fdHlwZSxcbiAgICAgIGFycmF5TGVuZ3RoOiB0aGlzLl9fYXJyYXlMZW5ndGgsXG4gICAgfSk7XG4gICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkID0gdGV4dHVyZTtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aDogU2l6ZSwgaGVpZ2h0OiBTaXplKSB7XG4gICAgdGhpcy5kZXN0cm95M0RBUElSZXNvdXJjZXMoKTtcbiAgICB0aGlzLl9fd2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9faGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGlmICh0aGlzLl9fYXJyYXlMZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9fY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZUFycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19jcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveTNEQVBJUmVzb3VyY2VzKCkge1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5kZWxldGVUZXh0dXJlKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGdldFRleHR1cmVQaXhlbERhdGEoKSB7XG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNvbnN0IGRhdGEgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5nZXRUZXh0dXJlUGl4ZWxEYXRhKFxuICAgICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLFxuICAgICAgdGhpcy5fX3dpZHRoLFxuICAgICAgdGhpcy5fX2hlaWdodCxcbiAgICAgIHRoaXMuX19mYm8hLmZyYW1lYnVmZmVyVUlELFxuICAgICAgdGhpcy5fX2ZibyEud2hpY2hDb2xvckF0dGFjaG1lbnQodGhpcylcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZFRleHR1cmVQaXhlbERhdGEoKSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0VGV4dHVyZVBpeGVsRGF0YSgpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMuX193aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5fX2hlaWdodDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShcbiAgICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmJ1ZmZlciksXG4gICAgICB0aGlzLl9fd2lkdGgsXG4gICAgICB0aGlzLl9faGVpZ2h0XG4gICAgKTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgdGhpcy5fX3dpZHRoLCB0aGlzLl9faGVpZ2h0KTtcbiAgICBjb25zdCBkYXRhVXJpID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG5cbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIGEuaHJlZiA9IGRhdGFVcmk7XG4gICAgYS5kb3dubG9hZCA9ICd0ZXh0dXJlLnBuZyc7XG4gICAgZS5pbml0RXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSk7IC8vLCB3aW5kb3csIDEsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIGEuZGlzcGF0Y2hFdmVudChlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmlnaW4gaXMgbGVmdCBib3R0b21cbiAgICpcbiAgICogQHBhcmFtIHggaG9yaXpvbnRhbCBwaXhlbCBwb3NpdGlvbiAoMCBpcyBsZWZ0KVxuICAgKiBAcGFyYW0geSB2ZXJ0aWNhbCBwaXhlbCBwb3NpdGlvbiAoMCBpcyBib3R0b20pXG4gICAqIEBwYXJhbSBhcmdCeXRlQXJyYXkgUGl4ZWwgRGF0YSBhcyBVaW50OEFycmF5XG4gICAqIEByZXR1cm5zIFBpeGVsIFZhbHVlIGluIFZlY3RvcjRcbiAgICovXG4gIGFzeW5jIGdldFBpeGVsVmFsdWVBdCh4OiBJbmRleCwgeTogSW5kZXgsIGFyZ0J5dGVBcnJheT86IFVpbnQ4QXJyYXkpOiBQcm9taXNlPFZlY3RvcjQ+IHtcbiAgICBsZXQgYnl0ZUFycmF5ID0gYXJnQnl0ZUFycmF5O1xuICAgIGlmICghYnl0ZUFycmF5KSB7XG4gICAgICBieXRlQXJyYXkgPSBhd2FpdCB0aGlzLmdldFRleHR1cmVQaXhlbERhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvciA9IFZlY3RvcjQuZnJvbUNvcHlBcnJheShbXG4gICAgICBieXRlQXJyYXlbKHkgKiB0aGlzLndpZHRoICsgeCkgKiA0ICsgMF0sXG4gICAgICBieXRlQXJyYXlbKHkgKiB0aGlzLndpZHRoICsgeCkgKiA0ICsgMV0sXG4gICAgICBieXRlQXJyYXlbKHkgKiB0aGlzLndpZHRoICsgeCkgKiA0ICsgMl0sXG4gICAgICBieXRlQXJyYXlbKHkgKiB0aGlzLndpZHRoICsgeCkgKiA0ICsgM10sXG4gICAgXSk7XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG5cbiAgZ2VuZXJhdGVNaXBtYXBzKCkge1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5nZW5lcmF0ZU1pcG1hcHMyZCh0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgfVxuXG4gIGJsaXRUb1RleHR1cmUyZEZyb21UZXh0dXJlMmRBcnJheSh0YXJnZXRUZXh0dXJlMkQ6IFJlbmRlclRhcmdldFRleHR1cmUpIHtcbiAgICBpZiAodGhpcy5fX2FycmF5TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5ibGl0VG9UZXh0dXJlMmRGcm9tVGV4dHVyZTJkQXJyYXkoXG4gICAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQuX19mYm8hLmNnQXBpUmVzb3VyY2VVaWQsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQud2lkdGgsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuICBibGl0VG9UZXh0dXJlMmRGcm9tVGV4dHVyZTJkQXJyYXlGYWtlKHRhcmdldFRleHR1cmUyRDogUmVuZGVyVGFyZ2V0VGV4dHVyZSkge1xuICAgIGlmICh0aGlzLl9fYXJyYXlMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmJsaXRUb1RleHR1cmUyZEZyb21UZXh0dXJlMmRBcnJheUZha2UoXG4gICAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQuX19mYm8hLmNnQXBpUmVzb3VyY2VVaWQsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQud2lkdGgsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuICBibGl0VG9UZXh0dXJlMmRGcm9tVGV4dHVyZTJkQXJyYXkyKHRhcmdldFRleHR1cmUyRDogUmVuZGVyVGFyZ2V0VGV4dHVyZSkge1xuICAgIGlmICh0aGlzLl9fYXJyYXlMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmJsaXRUb1RleHR1cmUyZEZyb21UZXh0dXJlMmRBcnJheTIoXG4gICAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQuX3RleHR1cmVSZXNvdXJjZVVpZCxcbiAgICAgIHRhcmdldFRleHR1cmUyRC53aWR0aCAvIDIsXG4gICAgICB0YXJnZXRUZXh0dXJlMkQuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZUN1YmVUZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0KGZhY2VJZHg6IEluZGV4LCBtaXBMZXZlbDogSW5kZXgpOiB2b2lkIHt9XG59XG4iLCJpbXBvcnQgeyBJbmRleCwgU2l6ZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL3dlYmdwdS9XZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgSGRyaUZvcm1hdCB9IGZyb20gJy4uL2RlZmluaXRpb25zL0hkcmlGb3JtYXQnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvUHJvY2Vzc0FwcHJvYWNoJztcbmltcG9ydCB7IFRleHR1cmVGb3JtYXQsIFRleHR1cmVGb3JtYXRFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdCc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IEZyYW1lQnVmZmVyIH0gZnJvbSAnLi4vcmVuZGVyZXIvRnJhbWVCdWZmZXInO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgSVJlbmRlcmFibGUgfSBmcm9tICcuL0lSZW5kZXJhYmxlJztcblxuZXhwb3J0IGNsYXNzIFJlbmRlclRhcmdldFRleHR1cmVDdWJlIGV4dGVuZHMgQWJzdHJhY3RUZXh0dXJlIGltcGxlbWVudHMgSVJlbmRlcmFibGUge1xuICBwcml2YXRlIF9fZmJvPzogRnJhbWVCdWZmZXI7XG4gIHB1YmxpYyBoZHJpRm9ybWF0ID0gSGRyaUZvcm1hdC5IRFJfTElORUFSO1xuICBwdWJsaWMgX3RleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXRSZXNvdXJjZVVpZDogbnVtYmVyID0gLTE7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGNyZWF0ZSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIG1pcExldmVsQ291bnQsXG4gICAgZm9ybWF0OiBpbnRlcm5hbEZvcm1hdCxcbiAgfToge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgbWlwTGV2ZWxDb3VudD86IG51bWJlcjtcbiAgICBmb3JtYXQ6IFRleHR1cmVGb3JtYXRFbnVtO1xuICB9KSB7XG4gICAgdGhpcy5fX3dpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5fX2hlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLl9fbWlwTGV2ZWxDb3VudCA9IG1pcExldmVsQ291bnQgPz8gTWF0aC5mbG9vcihNYXRoLmxvZzIoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpKSArIDE7XG5cbiAgICBjb25zdCB7IGZvcm1hdCwgdHlwZSB9ID1cbiAgICAgIFRleHR1cmVGb3JtYXQuZ2V0UGl4ZWxGb3JtYXRBbmRDb21wb25lbnRUeXBlRnJvbVRleHR1cmVGb3JtYXQoaW50ZXJuYWxGb3JtYXQpO1xuXG4gICAgdGhpcy5fX2ludGVybmFsRm9ybWF0ID0gaW50ZXJuYWxGb3JtYXQ7XG4gICAgdGhpcy5fX2Zvcm1hdCA9IGZvcm1hdDtcbiAgICB0aGlzLl9fdHlwZSA9IHR5cGU7XG5cbiAgICB0aGlzLl9fY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NyZWF0ZVJlbmRlclRhcmdldFRleHR1cmUoKSB7XG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNvbnN0IHRleHR1cmUgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSh7XG4gICAgICB3aWR0aDogdGhpcy5fX3dpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLl9faGVpZ2h0LFxuICAgICAgbWlwTGV2ZWxDb3VudDogdGhpcy5fX21pcExldmVsQ291bnQsXG4gICAgICBmb3JtYXQ6IHRoaXMuX19pbnRlcm5hbEZvcm1hdCxcbiAgICB9KTtcbiAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQgPSB0ZXh0dXJlO1xuXG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHRoaXMuX3RleHR1cmVWaWV3UmVzb3VyY2VVaWQgPSAoXG4gICAgICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeVxuICAgICAgKS5jcmVhdGVUZXh0dXJlVmlld0N1YmUodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcblxuICAgICAgdGhpcy5fdGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldFJlc291cmNlVWlkID0gKFxuICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICkuY3JlYXRlQ3ViZVRleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXQodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLCAwLCAwKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZU1pcG1hcHMoKSB7XG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmdlbmVyYXRlTWlwbWFwc0N1YmUodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIH1cblxuICByZXNpemUod2lkdGg6IFNpemUsIGhlaWdodDogU2l6ZSkge1xuICAgIHRoaXMuZGVzdHJveTNEQVBJUmVzb3VyY2VzKCk7XG4gICAgdGhpcy5fX3dpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5fX2hlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLl9fY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZSgpO1xuICB9XG5cbiAgZGVzdHJveTNEQVBJUmVzb3VyY2VzKCkge1xuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5kZWxldGVUZXh0dXJlKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNyZWF0ZUN1YmVUZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0KGZhY2VJZHg6IEluZGV4LCBtaXBMZXZlbDogSW5kZXgpOiB2b2lkIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgICB0aGlzLl90ZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0UmVzb3VyY2VVaWQgPVxuICAgICAgICB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlQ3ViZVRleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXQoXG4gICAgICAgICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLFxuICAgICAgICAgIGZhY2VJZHgsXG4gICAgICAgICAgbWlwTGV2ZWxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQgX2ZibyhmYm86IEZyYW1lQnVmZmVyKSB7XG4gICAgdGhpcy5fX2ZibyA9IGZibztcbiAgfVxuXG4gIGdldCBmYm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19mYm87XG4gIH1cblxuICBnZXQgbWlwbWFwTGV2ZWxOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19taXBMZXZlbENvdW50O1xuICB9XG5cbiAgc2V0SXNUZXh0dXJlUmVhZHkoKSB7XG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ0dBUElSZXNvdXJjZUhhbmRsZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFRleHR1cmVQYXJhbWV0ZXIsIFRleHR1cmVQYXJhbWV0ZXJFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5cbmV4cG9ydCB0eXBlIFNhbXBsZXJEZXNjcmlwdG9yID0ge1xuICBtaW5GaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICBtYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICB3cmFwUzogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gIHdyYXBUOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgd3JhcFI/OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgYW5pc290cm9weT86IGJvb2xlYW47XG4gIHNoYWRvd0NvbXBhcmVNb2RlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBTYW1wbGVyIHtcbiAgcHJpdmF0ZSBfX21pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gIHByaXZhdGUgX19tYWdGaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICBwcml2YXRlIF9fd3JhcFM6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICBwcml2YXRlIF9fd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICBwcml2YXRlIF9fd3JhcFI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICBwcml2YXRlIF9fYW5pc290cm9weTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfX3NoYWRvd0NvbXBhcmVNb2RlOiBib29sZWFuO1xuICBwcml2YXRlIF9fc2FtcGxlclJlc291cmNlVWlkOiBDR0FQSVJlc291cmNlSGFuZGxlID0gLTE7XG5cbiAgY29uc3RydWN0b3IoZGVzYzogU2FtcGxlckRlc2NyaXB0b3IpIHtcbiAgICB0aGlzLl9fbWluRmlsdGVyID0gZGVzYy5taW5GaWx0ZXI7XG4gICAgdGhpcy5fX21hZ0ZpbHRlciA9IGRlc2MubWFnRmlsdGVyO1xuICAgIHRoaXMuX193cmFwUyA9IGRlc2Mud3JhcFM7XG4gICAgdGhpcy5fX3dyYXBUID0gZGVzYy53cmFwVDtcbiAgICB0aGlzLl9fd3JhcFIgPSBkZXNjLndyYXBSID8/IFRleHR1cmVQYXJhbWV0ZXIuUmVwZWF0O1xuICAgIHRoaXMuX19hbmlzb3Ryb3B5ID0gZGVzYy5hbmlzb3Ryb3B5ID8/IHRydWU7XG4gICAgdGhpcy5fX3NoYWRvd0NvbXBhcmVNb2RlID0gZGVzYy5zaGFkb3dDb21wYXJlTW9kZSA/PyBmYWxzZTtcbiAgfVxuXG4gIGNyZWF0ZSgpIHtcbiAgICBjb25zdCB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgdGhpcy5fX3NhbXBsZXJSZXNvdXJjZVVpZCA9IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5Py5jcmVhdGVUZXh0dXJlU2FtcGxlcih7XG4gICAgICBtaW5GaWx0ZXI6IHRoaXMuX19taW5GaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IHRoaXMuX19tYWdGaWx0ZXIsXG4gICAgICB3cmFwUzogdGhpcy5fX3dyYXBTLFxuICAgICAgd3JhcFQ6IHRoaXMuX193cmFwVCxcbiAgICAgIHdyYXBSOiB0aGlzLl9fd3JhcFIsXG4gICAgICBhbmlzb3Ryb3B5OiB0aGlzLl9fYW5pc290cm9weSxcbiAgICAgIHNoYWRvd0NvbXBhcmVNb2RlOiB0aGlzLl9fc2hhZG93Q29tcGFyZU1vZGUsXG4gICAgfSk7XG4gIH1cblxuICBnZXQgY3JlYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX3NhbXBsZXJSZXNvdXJjZVVpZCAhPT0gLTE7XG4gIH1cblxuICBnZXQgbWluRmlsdGVyKCk6IFRleHR1cmVQYXJhbWV0ZXJFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX21pbkZpbHRlcjtcbiAgfVxuXG4gIGdldCBtYWdGaWx0ZXIoKTogVGV4dHVyZVBhcmFtZXRlckVudW0ge1xuICAgIHJldHVybiB0aGlzLl9fbWFnRmlsdGVyO1xuICB9XG5cbiAgZ2V0IHdyYXBTKCk6IFRleHR1cmVQYXJhbWV0ZXJFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX3dyYXBTO1xuICB9XG5cbiAgZ2V0IHdyYXBUKCk6IFRleHR1cmVQYXJhbWV0ZXJFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX3dyYXBUO1xuICB9XG5cbiAgZ2V0IHdyYXBSKCk6IFRleHR1cmVQYXJhbWV0ZXJFbnVtIHtcbiAgICByZXR1cm4gdGhpcy5fX3dyYXBSO1xuICB9XG5cbiAgZ2V0IF9zYW1wbGVyUmVzb3VyY2VVaWQoKTogQ0dBUElSZXNvdXJjZUhhbmRsZSB7XG4gICAgcmV0dXJuIHRoaXMuX19zYW1wbGVyUmVzb3VyY2VVaWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBpeGVsRm9ybWF0LCBQaXhlbEZvcm1hdEVudW0gfSBmcm9tICcuLi9kZWZpbml0aW9ucy9QaXhlbEZvcm1hdCc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyLCBUZXh0dXJlUGFyYW1ldGVyRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQge1xuICBUeXBlZEFycmF5LFxuICBDb3VudCxcbiAgQ0dBUElSZXNvdXJjZUhhbmRsZSxcbiAgSW5kZXgsXG4gIFNpemUsXG4gIE9mZnNldCxcbn0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgQmFzaXNGaWxlLCBCYXNpc1RyYW5zY29kZXIsIEJBU0lTIH0gZnJvbSAnLi4vLi4vdHlwZXMvQmFzaXNUZXh0dXJlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSAnLi4vbWlzYy9EYXRhVXRpbCc7XG5pbXBvcnQgeyBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL0NvbXByZXNzaW9uVGV4dHVyZVR5cGUnO1xuaW1wb3J0IHsgS1RYMlRleHR1cmVMb2FkZXIgfSBmcm9tICcuLi8uLi93ZWJnbC90ZXh0dXJlTG9hZGVyL0tUWDJUZXh0dXJlTG9hZGVyJztcbmltcG9ydCB7IFRleHR1cmVEYXRhLCBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uLy4uL3dlYmdsL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IE1vZHVsZU1hbmFnZXIgfSBmcm9tICcuLi9zeXN0ZW0vTW9kdWxlTWFuYWdlcic7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHsgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLi4vd2ViZ3B1L1dlYkdwdVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBUZXh0dXJlRm9ybWF0LCBUZXh0dXJlRm9ybWF0RW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVGb3JtYXQnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbWlzYy9Mb2dnZXInO1xuXG5kZWNsYXJlIGNvbnN0IEJBU0lTOiBCQVNJUztcblxuZXhwb3J0IGludGVyZmFjZSBMb2FkSW1hZ2VUb01pcExldmVsRGVzY3JpcHRvciB7XG4gIG1pcExldmVsOiBJbmRleDsgLy8gbWlwIGxldmVsIHRvIGxvYWRcbiAgeE9mZnNldDogT2Zmc2V0OyAvLyB4IG9mZnNldCBpbiB0aGUgdGV4dHVyZSB0byBjb3B5IGRhdGFcbiAgeU9mZnNldDogT2Zmc2V0OyAvLyB5IG9mZnNldCBpbiB0aGUgdGV4dHVyZSB0byBjb3B5IGRhdGFcbiAgd2lkdGg6IFNpemU7IC8vIHdpZHRoIGluIHRoZSB0ZXh0dXJlIHRvIGNvcHlcbiAgaGVpZ2h0OiBTaXplOyAvLyBoZWlnaHQgaW4gdGhlIHRleHR1cmUgdG8gY29weVxuICBkYXRhOiBUeXBlZEFycmF5OyAvLyBpbWFnZSBkYXRhIGluIFR5cGVkQXJyYXlcbiAgcm93U2l6ZUJ5UGl4ZWw6IFNpemU7IC8vIHJvdyBzaXplIGJ5IHBpeGVsIG9mIHRoZSBpbWFnZSBkYXRhXG4gIHR5cGU6IENvbXBvbmVudFR5cGVFbnVtOyAvLyBjb21wb25lbnQgdHlwZSBvZiB0aGUgaW1hZ2UgZGF0YVxufVxuXG50eXBlIEZpbmFsaXphdGlvblJlZ2lzdHJ5T2JqZWN0ID0ge1xuICB0ZXh0dXJlUmVzb3VyY2VVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGU7XG4gIHVuaXF1ZU5hbWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlIGV4dGVuZHMgQWJzdHJhY3RUZXh0dXJlIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHB1YmxpYyBhdXRvUmVzaXplID0gdHJ1ZTtcbiAgcHVibGljIGF1dG9EZXRlY3RUcmFuc3BhcmVuY3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19sb2FkZWRCYXNpc0Z1bmMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19iYXNpc0xvYWRQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBzdGF0aWMgX19CYXNpc0ZpbGU/OiBuZXcgKHg6IFVpbnQ4QXJyYXkpID0+IEJhc2lzRmlsZTtcbiAgcHJpdmF0ZSBfX3VyaVRvTG9hZExhenk/OiBzdHJpbmc7XG4gIHByaXZhdGUgX19pbWdUb0xvYWRMYXp5PzogSFRNTEltYWdlRWxlbWVudDtcbiAgcHJpdmF0ZSBfX29wdGlvbnNUb0xvYWRMYXp5Pzoge1xuICAgIGxldmVsOiBudW1iZXI7XG4gICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgIHR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICAgIGdlbmVyYXRlTWlwbWFwOiBib29sZWFuO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIG1hbmFnZWRSZWdpc3RyeTogRmluYWxpemF0aW9uUmVnaXN0cnk8RmluYWxpemF0aW9uUmVnaXN0cnlPYmplY3Q+ID1cbiAgICBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnk8RmluYWxpemF0aW9uUmVnaXN0cnlPYmplY3Q+KCh0ZXhPYmopID0+IHtcbiAgICAgIExvZ2dlci5pbmZvKFxuICAgICAgICBgV2ViR0wvV2ViR1BVIHRleHR1cmUgXCIke3RleE9iai51bmlxdWVOYW1lfVwiIHdhcyBhdXRvbWF0aWNhbGx5IHJlbGVhc2VkIGFsb25nIHdpdGggR0MuIEJ1dCBleHBsaWNpdCByZWxlYXNlIGlzIHJlY29tbWVuZGVkLmBcbiAgICAgICk7XG4gICAgICBUZXh0dXJlLl9fZGVsZXRlSW50ZXJuYWxUZXh0dXJlKHRleE9iai50ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICAgIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0VGV4dHVyZVJlc291cmNlVWlkKHRleHR1cmVSZXNvdXJjZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSwgdW5pcXVlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkID0gdGV4dHVyZVJlc291cmNlVWlkO1xuICAgIFRleHR1cmUubWFuYWdlZFJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMsIHsgdGV4dHVyZVJlc291cmNlVWlkLCB1bmlxdWVOYW1lIH0sIHRoaXMpO1xuICB9XG5cbiAgZ2V0IGhhc0RhdGFUb0xvYWRMYXp5KCkge1xuICAgIHJldHVybiB0aGlzLl9fdXJpVG9Mb2FkTGF6eSAhPSBudWxsIHx8IHRoaXMuX19pbWdUb0xvYWRMYXp5ICE9IG51bGw7XG4gIH1cblxuICBnZW5lcmF0ZVRleHR1cmVGcm9tQmFzaXMoXG4gICAgdWludDhBcnJheTogVWludDhBcnJheSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBsZXZlbD86IENvdW50O1xuICAgICAgaW50ZXJuYWxGb3JtYXQ/OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICAgIGZvcm1hdD86IFBpeGVsRm9ybWF0RW51bTtcbiAgICAgIHR5cGU/OiBDb21wb25lbnRUeXBlRW51bTtcbiAgICAgIGdlbmVyYXRlTWlwbWFwPzogYm9vbGVhbjtcbiAgICB9XG4gICkge1xuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIEJBU0lTID09PSAndW5kZWZpbmVkJykge1xuICAgICAgTG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2FsbCBCQVNJUygpIGZ1bmN0aW9uLiBQbGVhc2UgY2hlY2sgdG8gaW1wb3J0IGJhc2lzX3RyYW5zY29kZXIuanMuJyk7XG4gICAgfVxuXG4gICAgLy8gZG93bmxvYWQgYmFzaXNfdHJhbnNjb2Rlci53YXNtIG9uY2VcbiAgICBpZiAoIVRleHR1cmUuX19sb2FkZWRCYXNpc0Z1bmMpIHtcbiAgICAgIFRleHR1cmUuX19sb2FkZWRCYXNpc0Z1bmMgPSB0cnVlO1xuXG4gICAgICBUZXh0dXJlLl9fYmFzaXNMb2FkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIEJBU0lTKCkudGhlbigoYmFzaXNUcmFuc0NvZGVyOiBCYXNpc1RyYW5zY29kZXIpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGluaXRpYWxpemVCYXNpcyB9ID0gYmFzaXNUcmFuc0NvZGVyO1xuICAgICAgICAgIGluaXRpYWxpemVCYXNpcygpO1xuICAgICAgICAgIFRleHR1cmUuX19CYXNpc0ZpbGUgPSBiYXNpc1RyYW5zQ29kZXIuQmFzaXNGaWxlO1xuXG4gICAgICAgICAgdGhpcy5fX3NldEJhc2lzVGV4dHVyZSh1aW50OEFycmF5LCBvcHRpb25zKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFscmVhZHkgZG93bmxvYWQgYmFzaXNfdHJhbnNjb2Rlci53YXNtIG9yIG5vdFxuICAgICAgaWYgKFRleHR1cmUuX19CYXNpc0ZpbGUpIHtcbiAgICAgICAgdGhpcy5fX3NldEJhc2lzVGV4dHVyZSh1aW50OEFycmF5LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFRleHR1cmUuX19iYXNpc0xvYWRQcm9taXNlPy50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9fc2V0QmFzaXNUZXh0dXJlKHVpbnQ4QXJyYXksIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fc2V0QmFzaXNUZXh0dXJlKFxuICAgIHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG4gICAge1xuICAgICAgbGV2ZWwgPSAwLFxuICAgICAgaW50ZXJuYWxGb3JtYXQgPSBUZXh0dXJlRm9ybWF0LlJHQkE4LFxuICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSBhcyBDb21wb25lbnRUeXBlRW51bSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwID0gdHJ1ZSxcbiAgICB9ID0ge31cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fX3N0YXJ0ZWRUb0xvYWQgPSB0cnVlO1xuXG4gICAgY29uc3QgYmFzaXNGaWxlID0gbmV3IFRleHR1cmUuX19CYXNpc0ZpbGUhKHVpbnQ4QXJyYXkpO1xuXG4gICAgaWYgKCFiYXNpc0ZpbGUuc3RhcnRUcmFuc2NvZGluZygpKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byBzdGFydCB0cmFuc2NvZGluZy4nKTtcbiAgICAgIGJhc2lzRmlsZS5jbG9zZSgpO1xuICAgICAgYmFzaXNGaWxlLmRlbGV0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCB0ZXh0dXJlID0gY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlQ29tcHJlc3NlZFRleHR1cmVGcm9tQmFzaXMoYmFzaXNGaWxlLCB7XG4gICAgICBib3JkZXI6IDAsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX3NldFRleHR1cmVSZXNvdXJjZVVpZCh0ZXh0dXJlLCB0aGlzLnVuaXF1ZU5hbWUpO1xuXG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcblxuICAgIGJhc2lzRmlsZS5jbG9zZSgpO1xuICAgIGJhc2lzRmlsZS5kZWxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlVGV4dHVyZUZyb21LVFgyKHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXkpIHtcbiAgICB0aGlzLl9fc3RhcnRlZFRvTG9hZCA9IHRydWU7XG5cbiAgICBjb25zdCB0cmFuc2NvZGVkRGF0YSA9IGF3YWl0IEtUWDJUZXh0dXJlTG9hZGVyLmdldEluc3RhbmNlKCkudHJhbnNjb2RlKHVpbnQ4QXJyYXkpO1xuICAgIHRoaXMuX193aWR0aCA9IHRyYW5zY29kZWREYXRhLndpZHRoO1xuICAgIHRoaXMuX19oZWlnaHQgPSB0cmFuc2NvZGVkRGF0YS5oZWlnaHQ7XG4gICAgdGhpcy5nZW5lcmF0ZUNvbXByZXNzZWRUZXh0dXJlV2l0aE1pcG1hcEZyb21UeXBlZEFycmF5KFxuICAgICAgdHJhbnNjb2RlZERhdGEubWlwbWFwRGF0YSxcbiAgICAgIHRyYW5zY29kZWREYXRhLmNvbXByZXNzaW9uVGV4dHVyZVR5cGVcbiAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVUZXh0dXJlRnJvbUltYWdlKFxuICAgIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LFxuICAgIHtcbiAgICAgIGxldmVsID0gMCxcbiAgICAgIGludGVybmFsRm9ybWF0ID0gVGV4dHVyZUZvcm1hdC5SR0JBOCxcbiAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQkEsXG4gICAgICB0eXBlID0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGUsXG4gICAgICBnZW5lcmF0ZU1pcG1hcCA9IHRydWUsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuX19pbWdUb0xvYWRMYXp5ID0gaW1hZ2U7XG4gICAgdGhpcy5fX29wdGlvbnNUb0xvYWRMYXp5ID0ge1xuICAgICAgbGV2ZWwsXG4gICAgICBpbnRlcm5hbEZvcm1hdCxcbiAgICAgIGZvcm1hdCxcbiAgICAgIHR5cGUsXG4gICAgICBnZW5lcmF0ZU1pcG1hcCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbG9hZEZyb21JbWdMYXp5KCkge1xuICAgIGlmICh0aGlzLl9faW1nVG9Mb2FkTGF6eSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGltYWdlID0gdGhpcy5fX2ltZ1RvTG9hZExhenkhO1xuICAgIGNvbnN0IGxldmVsID0gdGhpcy5fX29wdGlvbnNUb0xvYWRMYXp5Py5sZXZlbCA/PyAwO1xuICAgIGNvbnN0IGludGVybmFsRm9ybWF0ID0gdGhpcy5fX29wdGlvbnNUb0xvYWRMYXp5Py5pbnRlcm5hbEZvcm1hdCA/PyBUZXh0dXJlRm9ybWF0LlJHQkE4O1xuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuX19vcHRpb25zVG9Mb2FkTGF6eT8uZm9ybWF0ID8/IFBpeGVsRm9ybWF0LlJHQkE7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuX19vcHRpb25zVG9Mb2FkTGF6eT8udHlwZSA/PyBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZTtcbiAgICBjb25zdCBnZW5lcmF0ZU1pcG1hcCA9IHRoaXMuX19vcHRpb25zVG9Mb2FkTGF6eT8uZ2VuZXJhdGVNaXBtYXAgPz8gdHJ1ZTtcblxuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgICB0aGlzLl9faHRtbEltYWdlRWxlbWVudCA9IGltYWdlO1xuICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgfCBIVE1MQ2FudmFzRWxlbWVudCB8IEltYWdlRGF0YSA9IGltYWdlO1xuXG4gICAgaWYgKHRoaXMuYXV0b1Jlc2l6ZSkge1xuICAgICAgY29uc3QgW3Jlc2l6ZWRDYW52YXMsIHJlc2l6ZWRXaWR0aCwgcmVzaXplZEhlaWdodF0gPSBEYXRhVXRpbC5nZXRSZXNpemVkQ2FudmFzKFxuICAgICAgICBpbWcsXG4gICAgICAgIENvbmZpZy5tYXhTaXplTGltaXRPZk5vbkNvbXByZXNzZWRUZXh0dXJlXG4gICAgICApO1xuICAgICAgaW1nID0gcmVzaXplZENhbnZhcztcbiAgICAgIHRoaXMuX193aWR0aCA9IHJlc2l6ZWRXaWR0aDtcbiAgICAgIHRoaXMuX19oZWlnaHQgPSByZXNpemVkSGVpZ2h0O1xuICAgICAgdGhpcy5fX2h0bWxDYW52YXNFbGVtZW50ID0gcmVzaXplZENhbnZhcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdXRvRGV0ZWN0VHJhbnNwYXJlbmN5KSB7XG4gICAgICB0aGlzLl9faGFzVHJhbnNwYXJlbnRQaXhlbHMgPSBEYXRhVXRpbC5kZXRlY3RUcmFuc3BhcmVudFBpeGVsRXhpc3RlbmNlKGltZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fX3dpZHRoID0gaW1nLndpZHRoO1xuICAgIHRoaXMuX19oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGxldCB0ZXh0dXJlOiBDR0FQSVJlc291cmNlSGFuZGxlO1xuICAgIGlmIChpbWcgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICB0ZXh0dXJlID0gYXdhaXQgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlVGV4dHVyZUZyb21IVE1MSW1hZ2VFbGVtZW50KGltZywge1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgIHdpZHRoOiB0aGlzLl9fd2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5fX2hlaWdodCxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbWcgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZVRleHR1cmVGcm9tSW1hZ2VCaXRtYXBEYXRhKGltZywge1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgIHdpZHRoOiB0aGlzLl9fd2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5fX2hlaWdodCxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgICAgfSk7XG4gICAgICB0ZXh0dXJlID0gdGV4dHVyZUhhbmRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLicpO1xuICAgIH1cblxuICAgIHRoaXMuX19zZXRUZXh0dXJlUmVzb3VyY2VVaWQodGV4dHVyZSwgdGhpcy51bmlxdWVOYW1lKTtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgdGhpcy5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZCA9IChcbiAgICAgICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5XG4gICAgICApLmNyZWF0ZVRleHR1cmVWaWV3MmQodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICB9XG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fdXJpID0gaW1hZ2Uuc3JjO1xuXG4gICAgdGhpcy5fX2ltZ1RvTG9hZExhenkgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZW5lcmF0ZVRleHR1cmVGcm9tVXJpKFxuICAgIGltYWdlVXJpOiBzdHJpbmcsXG4gICAge1xuICAgICAgbGV2ZWwgPSAwLFxuICAgICAgaW50ZXJuYWxGb3JtYXQgPSBUZXh0dXJlRm9ybWF0LlJHQkE4LFxuICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwID0gdHJ1ZSxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fX3VyaVRvTG9hZExhenkgPSBpbWFnZVVyaTtcbiAgICB0aGlzLl9fb3B0aW9uc1RvTG9hZExhenkgPSB7XG4gICAgICBsZXZlbCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBsb2FkRnJvbVVybExhenkoKSB7XG4gICAgaWYgKHRoaXMuX191cmlUb0xvYWRMYXp5ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VVcmkgPSB0aGlzLl9fdXJpVG9Mb2FkTGF6eTtcbiAgICBjb25zdCBsZXZlbCA9IHRoaXMuX19vcHRpb25zVG9Mb2FkTGF6eT8ubGV2ZWwgPz8gMDtcbiAgICBjb25zdCBpbnRlcm5hbEZvcm1hdCA9IHRoaXMuX19vcHRpb25zVG9Mb2FkTGF6eT8uaW50ZXJuYWxGb3JtYXQgPz8gVGV4dHVyZUZvcm1hdC5SR0JBODtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLl9fb3B0aW9uc1RvTG9hZExhenk/LmZvcm1hdCA/PyBQaXhlbEZvcm1hdC5SR0JBO1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLl9fb3B0aW9uc1RvTG9hZExhenk/LnR5cGUgPz8gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGU7XG4gICAgY29uc3QgZ2VuZXJhdGVNaXBtYXAgPSB0aGlzLl9fb3B0aW9uc1RvTG9hZExhenk/LmdlbmVyYXRlTWlwbWFwID8/IHRydWU7XG5cbiAgICB0aGlzLl9fdXJpID0gaW1hZ2VVcmk7XG4gICAgdGhpcy5fX3N0YXJ0ZWRUb0xvYWQgPSB0cnVlO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9faW1nID0gbmV3IEltYWdlKCk7XG4gICAgICBpZiAoIWltYWdlVXJpLm1hdGNoKC9eZGF0YTovKSkge1xuICAgICAgICB0aGlzLl9faW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICB9XG4gICAgICB0aGlzLl9faW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fX2h0bWxJbWFnZUVsZW1lbnQgPSB0aGlzLl9faW1nO1xuXG4gICAgICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgfCBIVE1MQ2FudmFzRWxlbWVudCA9IHRoaXMuX19pbWchO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9SZXNpemUpIHtcbiAgICAgICAgICBjb25zdCBbcmVzaXplZENhbnZhcywgcmVzaXplZFdpZHRoLCByZXNpemVkSGVpZ2h0XSA9IERhdGFVdGlsLmdldFJlc2l6ZWRDYW52YXMoXG4gICAgICAgICAgICBpbWcsXG4gICAgICAgICAgICBDb25maWcubWF4U2l6ZUxpbWl0T2ZOb25Db21wcmVzc2VkVGV4dHVyZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaW1nID0gcmVzaXplZENhbnZhcztcbiAgICAgICAgICB0aGlzLl9fd2lkdGggPSByZXNpemVkV2lkdGg7XG4gICAgICAgICAgdGhpcy5fX2hlaWdodCA9IHJlc2l6ZWRIZWlnaHQ7XG4gICAgICAgICAgdGhpcy5fX2h0bWxDYW52YXNFbGVtZW50ID0gcmVzaXplZENhbnZhcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmF1dG9EZXRlY3RUcmFuc3BhcmVuY3kpIHtcbiAgICAgICAgICB0aGlzLl9faGFzVHJhbnNwYXJlbnRQaXhlbHMgPSBEYXRhVXRpbC5kZXRlY3RUcmFuc3BhcmVudFBpeGVsRXhpc3RlbmNlKGltZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9fd2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgIHRoaXMuX19oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcblxuICAgICAgICBsZXQgdGV4dHVyZTogQ0dBUElSZXNvdXJjZUhhbmRsZSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChpbWcgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICB0ZXh0dXJlID0gYXdhaXQgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlVGV4dHVyZUZyb21IVE1MSW1hZ2VFbGVtZW50KGltZywge1xuICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9fd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fX2hlaWdodCxcbiAgICAgICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbWcgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZVRleHR1cmVGcm9tSW1hZ2VCaXRtYXBEYXRhKGltZywge1xuICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9fd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fX2hlaWdodCxcbiAgICAgICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXh0dXJlID0gdGV4dHVyZUhhbmRsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBpbWFnZSB0eXBlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX19zZXRUZXh0dXJlUmVzb3VyY2VVaWQodGV4dHVyZSwgdGhpcy51bmlxdWVOYW1lKTtcbiAgICAgICAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZCA9IChcbiAgICAgICAgICAgICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5XG4gICAgICAgICAgICApLmNyZWF0ZVRleHR1cmVWaWV3MmQodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9fdXJpVG9Mb2FkTGF6eSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pKCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9faW1nLnNyYyA9IGltYWdlVXJpO1xuICAgIH0pIGFzIFByb21pc2U8dm9pZD47XG4gIH1cblxuICBnZW5lcmF0ZTF4MVRleHR1cmVGcm9tKHJnYmFTdHIgPSAncmdiYSgyNTUsMjU1LDI1NSwxKScpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIHRoaXMuX193aWR0aCA9IDE7XG4gICAgdGhpcy5fX2hlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuICAgIGN0eC5maWxsU3R5bGUgPSByZ2JhU3RyO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcblxuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCB0ZXh0dXJlSGFuZGxlID0gY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlVGV4dHVyZUZyb21JbWFnZUJpdG1hcERhdGEoY2FudmFzLCB7XG4gICAgICBsZXZlbDogMCxcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlRm9ybWF0LlJHQkE4LFxuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICBib3JkZXI6IDAsXG4gICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0LlJHQkEsXG4gICAgICB0eXBlOiBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX19zZXRUZXh0dXJlUmVzb3VyY2VVaWQodGV4dHVyZUhhbmRsZSwgdGhpcy51bmlxdWVOYW1lKTtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgdGhpcy5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZCA9IChcbiAgICAgICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5XG4gICAgICApLmNyZWF0ZVRleHR1cmVWaWV3MmQodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICB9XG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU2hlZW5MdXRUZXh0dXJlRnJvbURhdGFVcmkoKSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9ICdwYnInO1xuICAgIGNvbnN0IG1vZHVsZU1hbmFnZXIgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgcGJyTW9kdWxlID0gbW9kdWxlTWFuYWdlci5nZXRNb2R1bGUobW9kdWxlTmFtZSkhIGFzIGFueTtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IGF3YWl0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IS5jcmVhdGVUZXh0dXJlRnJvbURhdGFVcmkoXG4gICAgICBwYnJNb2R1bGUuc2hlZW5fRV9hbmRfREdUZXJtLFxuICAgICAge1xuICAgICAgICBsZXZlbDogMCxcbiAgICAgICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVGb3JtYXQuUkdCQTgsXG4gICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgZm9ybWF0OiBQaXhlbEZvcm1hdC5SR0JBLFxuICAgICAgICB0eXBlOiBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSxcbiAgICAgICAgZ2VuZXJhdGVNaXBtYXA6IGZhbHNlLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5fX3NldFRleHR1cmVSZXNvdXJjZVVpZCh0ZXh0dXJlSGFuZGxlLCB0aGlzLnVuaXF1ZU5hbWUpO1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICB0aGlzLl90ZXh0dXJlVmlld1Jlc291cmNlVWlkID0gKFxuICAgICAgICBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSBhcyBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnlcbiAgICAgICkuY3JlYXRlVGV4dHVyZVZpZXcyZCh0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICAgIH1cbiAgICB0aGlzLl9faXNUZXh0dXJlUmVhZHkgPSB0cnVlO1xuICB9XG5cbiAgYWxsb2NhdGUoZGVzYzoge1xuICAgIG1pcExldmVsQ291bnQ/OiBDb3VudDtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG4gIH0pIHtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG5cbiAgICBkZXNjLm1pcExldmVsQ291bnQgPVxuICAgICAgZGVzYy5taXBMZXZlbENvdW50ID8/IE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGgubWF4KGRlc2Mud2lkdGgsIGRlc2MuaGVpZ2h0KSkpICsgMTtcblxuICAgIGNvbnN0IHRleHR1cmUgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5hbGxvY2F0ZVRleHR1cmUoe1xuICAgICAgbWlwTGV2ZWxDb3VudDogZGVzYy5taXBMZXZlbENvdW50LFxuICAgICAgd2lkdGg6IGRlc2Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IGRlc2MuaGVpZ2h0LFxuICAgICAgZm9ybWF0OiBkZXNjLmZvcm1hdCxcbiAgICB9KTtcblxuICAgIHRoaXMuX19zZXRUZXh0dXJlUmVzb3VyY2VVaWQodGV4dHVyZSwgdGhpcy51bmlxdWVOYW1lKTtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgdGhpcy5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZCA9IChcbiAgICAgICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5XG4gICAgICApLmNyZWF0ZVRleHR1cmVWaWV3MmQodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICB9XG4gICAgdGhpcy5fX3dpZHRoID0gZGVzYy53aWR0aDtcbiAgICB0aGlzLl9faGVpZ2h0ID0gZGVzYy5oZWlnaHQ7XG4gICAgdGhpcy5fX21pcExldmVsQ291bnQgPSBkZXNjLm1pcExldmVsQ291bnQ7XG4gICAgdGhpcy5fX2ludGVybmFsRm9ybWF0ID0gZGVzYy5mb3JtYXQ7XG4gIH1cblxuICBhc3luYyBsb2FkSW1hZ2VUb01pcExldmVsKGRlc2M6IExvYWRJbWFnZVRvTWlwTGV2ZWxEZXNjcmlwdG9yKSB7XG4gICAgY29uc3Qgd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuXG4gICAgYXdhaXQgd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkubG9hZEltYWdlVG9NaXBMZXZlbE9mVGV4dHVyZTJEKHtcbiAgICAgIG1pcExldmVsOiBkZXNjLm1pcExldmVsLFxuICAgICAgdGV4dHVyZVVpZDogdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLFxuICAgICAgZm9ybWF0OiB0aGlzLl9faW50ZXJuYWxGb3JtYXQsXG4gICAgICB0eXBlOiBkZXNjLnR5cGUsXG4gICAgICB4T2Zmc2V0OiBkZXNjLnhPZmZzZXQsXG4gICAgICB5T2Zmc2V0OiBkZXNjLnlPZmZzZXQsXG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICByb3dTaXplQnlQaXhlbDogZGVzYy5yb3dTaXplQnlQaXhlbCxcbiAgICAgIGRhdGE6IGRlc2MuZGF0YSxcbiAgICB9KTtcblxuICAgIGlmIChkZXNjLm1pcExldmVsID09PSAwKSB7XG4gICAgICB0aGlzLl9faXNUZXh0dXJlUmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlQ29tcHJlc3NlZFRleHR1cmVGcm9tVHlwZWRBcnJheShcbiAgICB0eXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZTogQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW1cbiAgKSB7XG4gICAgdGhpcy5fX3dpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5fX2hlaWdodCA9IGhlaWdodDtcblxuICAgIGNvbnN0IHRleHR1cmVEYXRhID0ge1xuICAgICAgbGV2ZWw6IDAsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGJ1ZmZlcjogdHlwZWRBcnJheSxcbiAgICB9IGFzIFRleHR1cmVEYXRhO1xuXG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNvbnN0IHRleHR1cmUgPSBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVDb21wcmVzc2VkVGV4dHVyZShcbiAgICAgIFt0ZXh0dXJlRGF0YV0sXG4gICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlXG4gICAgKTtcblxuICAgIHRoaXMuX19zZXRUZXh0dXJlUmVzb3VyY2VVaWQodGV4dHVyZSwgdGhpcy51bmlxdWVOYW1lKTtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgdGhpcy5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZCA9IChcbiAgICAgICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgYXMgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5XG4gICAgICApLmNyZWF0ZVRleHR1cmVWaWV3MmQodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICB9XG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGdlbmVyYXRlQ29tcHJlc3NlZFRleHR1cmVXaXRoTWlwbWFwRnJvbVR5cGVkQXJyYXkoXG4gICAgdGV4dHVyZURhdGFBcnJheTogVGV4dHVyZURhdGFbXSxcbiAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bVxuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbFRleHR1cmVEYXRhID0gdGV4dHVyZURhdGFBcnJheS5maW5kKCh0ZXh0dXJlRGF0YSkgPT4gdGV4dHVyZURhdGEubGV2ZWwgPT09IDApO1xuICAgIGlmIChvcmlnaW5hbFRleHR1cmVEYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGV4dHVyZSBkYXRhIHdpdGggbGV2ZWwgMCBpcyBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fd2lkdGggPSBvcmlnaW5hbFRleHR1cmVEYXRhLndpZHRoO1xuICAgIHRoaXMuX19oZWlnaHQgPSBvcmlnaW5hbFRleHR1cmVEYXRhLmhlaWdodDtcblxuICAgIGNvbnN0IGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCB0ZXh0dXJlID0gY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlQ29tcHJlc3NlZFRleHR1cmUoXG4gICAgICB0ZXh0dXJlRGF0YUFycmF5LFxuICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZVxuICAgICk7XG5cbiAgICB0aGlzLl9fc2V0VGV4dHVyZVJlc291cmNlVWlkKHRleHR1cmUsIHRoaXMudW5pcXVlTmFtZSk7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHRoaXMuX3RleHR1cmVWaWV3UmVzb3VyY2VVaWQgPSAoXG4gICAgICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5IGFzIFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeVxuICAgICAgKS5jcmVhdGVUZXh0dXJlVmlldzJkKHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCk7XG4gICAgfVxuICAgIHRoaXMuX19pc1RleHR1cmVSZWFkeSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWlwbWFwcyBmb3IgdGhlIHRleHR1cmUuXG4gICAqL1xuICBnZW5lcmF0ZU1pcG1hcHMoKSB7XG4gICAgY29uc3QgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRDZ0FwaVJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgIGNnQXBpUmVzb3VyY2VSZXBvc2l0b3J5LmdlbmVyYXRlTWlwbWFwczJkKFxuICAgICAgdGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLFxuICAgICAgdGhpcy5fX3dpZHRoLFxuICAgICAgdGhpcy5fX2hlaWdodFxuICAgICk7XG4gIH1cblxuICBpbXBvcnRXZWJHTFRleHR1cmVEaXJlY3RseSh3ZWJHTFRleHR1cmU6IFdlYkdMVGV4dHVyZSwgd2lkdGggPSAwLCBoZWlnaHQgPSAwKSB7XG4gICAgdGhpcy5fX3dpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5fX2hlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgdGV4dHVyZSA9IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LnNldFdlYkdMVGV4dHVyZURpcmVjdGx5KHdlYkdMVGV4dHVyZSk7XG4gICAgdGhpcy5fX3NldFRleHR1cmVSZXNvdXJjZVVpZCh0ZXh0dXJlLCB0aGlzLnVuaXF1ZU5hbWUpO1xuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgICB0aGlzLl9faXNUZXh0dXJlUmVhZHkgPSB0cnVlO1xuICB9XG5cbiAgZGVzdHJveTNEQVBJUmVzb3VyY2VzKCkge1xuICAgIFRleHR1cmUuX19kZWxldGVJbnRlcm5hbFRleHR1cmUodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkKTtcbiAgICB0aGlzLl90ZXh0dXJlUmVzb3VyY2VVaWQgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgICB0aGlzLl9faXNUZXh0dXJlUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLl9fc3RhcnRlZFRvTG9hZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX2RlbGV0ZUludGVybmFsVGV4dHVyZSh0ZXh0dXJlUmVzb3VyY2VVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUpIHtcbiAgICBjb25zdCBjZ0FwaVJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICB9XG5cbiAgW1N5bWJvbC5kaXNwb3NlXSgpIHtcbiAgICBMb2dnZXIuZGVidWcoJ1tTeW1ib2wuZGlzcG9zZV0gaXMgY2FsbGVkJyk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveTNEQVBJUmVzb3VyY2VzKCk7XG4gICAgdGhpcy51bnJlZ2lzdGVyKCk7XG4gICAgVGV4dHVyZS5tYW5hZ2VkUmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgU2l6ZSxcbiAgSW5kZXgsXG4gIEZsb2F0VHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuICBUeXBlZEFycmF5Q29uc3RydWN0b3IsXG59IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IENvbG9yUmdiIH0gZnJvbSAnLi4vbWF0aC9Db2xvclJnYic7XG5pbXBvcnQgeyBDb2xvclJnYmEgfSBmcm9tICcuLi9tYXRoL0NvbG9yUmdiYSc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0dXJlRGF0YUZsb2F0IHtcbiAgcHJpdmF0ZSBfX2RhdGE6IEZsb2F0MzJBcnJheTtcbiAgcHJpdmF0ZSBfX2NoYW5uZWxzOiBudW1iZXI7XG4gIHByaXZhdGUgX193aWR0aDogbnVtYmVyO1xuICBwcml2YXRlIF9faGVpZ2h0OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNoYW5uZWxzOiBudW1iZXIpIHtcbiAgICB0aGlzLl9fY2hhbm5lbHMgPSBjaGFubmVscztcbiAgICB0aGlzLl9fd2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9faGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuX19kYXRhID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNoYW5uZWxzKTtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgY2hhbm5lbHM6IG51bWJlcikge1xuICAgIHRoaXMuX193aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuX19oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fX2NoYW5uZWxzID0gY2hhbm5lbHM7XG4gICAgdGhpcy5fX2RhdGEgPSBuZXcgRmxvYXQzMkFycmF5KFxuICAgICAgVGV4dHVyZURhdGFGbG9hdC50cmFuc2Zlcih0aGlzLl9fZGF0YS5idWZmZXIsIHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMgKiA0KVxuICAgICk7XG4gIH1cblxuICBzZXRQaXhlbEF0Q2hhbm5lbCh4OiBJbmRleCwgeTogSW5kZXgsIGNoYW5uZWxJZHg6IEluZGV4LCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fX2RhdGFbeSAqIHRoaXMuX193aWR0aCAqIHRoaXMuX19jaGFubmVscyArIHggKiB0aGlzLl9fY2hhbm5lbHMgKyBjaGFubmVsSWR4XSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLl9fd2lkdGg7XG4gIH1cblxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl9faGVpZ2h0O1xuICB9XG5cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kYXRhO1xuICB9XG5cbiAgZ2V0UGl4ZWwoeDogSW5kZXgsIHk6IEluZGV4LCBjaGFubmVsSWR4OiBJbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9fZGF0YVt5ICogdGhpcy5fX3dpZHRoICogdGhpcy5fX2NoYW5uZWxzICsgeCAqIHRoaXMuX19jaGFubmVscyArIGNoYW5uZWxJZHhdO1xuICB9XG5cbiAgZ2V0UGl4ZWxBcyh4OiBJbmRleCwgeTogSW5kZXgsIGNoYW5uZWxzOiBTaXplLCB0eXBlQ2xhc3M6IHR5cGVvZiBDb2xvclJnYiB8IHR5cGVvZiBDb2xvclJnYmEpIHtcbiAgICBpZiAoY2hhbm5lbHMgPT09IDMpIHtcbiAgICAgIHJldHVybiBuZXcgKHR5cGVDbGFzcyBhcyBhbnkpKFxuICAgICAgICBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgICB0aGlzLl9fZGF0YVt5ICogdGhpcy5fX3dpZHRoICogdGhpcy5fX2NoYW5uZWxzICsgeCAqIHRoaXMuX19jaGFubmVscyArIDBdLFxuICAgICAgICAgIHRoaXMuX19kYXRhW3kgKiB0aGlzLl9fd2lkdGggKiB0aGlzLl9fY2hhbm5lbHMgKyB4ICogdGhpcy5fX2NoYW5uZWxzICsgMV0sXG4gICAgICAgICAgdGhpcy5fX2RhdGFbeSAqIHRoaXMuX193aWR0aCAqIHRoaXMuX19jaGFubmVscyArIHggKiB0aGlzLl9fY2hhbm5lbHMgKyAyXSxcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVscyA9PT0gNCkge1xuICAgICAgcmV0dXJuIG5ldyAodHlwZUNsYXNzIGFzIGFueSkoXG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAgIHRoaXMuX19kYXRhW3kgKiB0aGlzLl9fd2lkdGggKiB0aGlzLl9fY2hhbm5lbHMgKyB4ICogdGhpcy5fX2NoYW5uZWxzICsgMF0sXG4gICAgICAgICAgdGhpcy5fX2RhdGFbeSAqIHRoaXMuX193aWR0aCAqIHRoaXMuX19jaGFubmVscyArIHggKiB0aGlzLl9fY2hhbm5lbHMgKyAxXSxcbiAgICAgICAgICB0aGlzLl9fZGF0YVt5ICogdGhpcy5fX3dpZHRoICogdGhpcy5fX2NoYW5uZWxzICsgeCAqIHRoaXMuX19jaGFubmVscyArIDJdLFxuICAgICAgICAgIHRoaXMuX19kYXRhW3kgKiB0aGlzLl9fd2lkdGggKiB0aGlzLl9fY2hhbm5lbHMgKyB4ICogdGhpcy5fX2NoYW5uZWxzICsgM10sXG4gICAgICAgIF0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGdldFBpeGVsQXNBcnJheSh4OiBJbmRleCwgeTogSW5kZXgpIHtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX2NoYW5uZWxzOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpcy5fX2RhdGFbeSAqIHRoaXMuX193aWR0aCAqIHRoaXMuX19jaGFubmVscyArIHggKiB0aGlzLl9fY2hhbm5lbHMgKyBpXSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIGluaXRpYWxpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNoYW5uZWxzOiBudW1iZXIpIHtcbiAgICB0aGlzLl9fd2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9faGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuX19jaGFubmVscyA9IGNoYW5uZWxzO1xuICAgIHRoaXMuX19kYXRhID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNoYW5uZWxzKTtcbiAgfVxuXG4gIHN0YXRpYyB0cmFuc2Zlcihzb3VyY2U6IGFueSwgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICBzb3VyY2UgPSBPYmplY3Qoc291cmNlKTtcbiAgICBjb25zdCBkZXN0ID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICEoZGVzdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IGJlIEFycmF5QnVmZmVyIGluc3RhbmNlcycpO1xuICAgIH1cbiAgICBpZiAoZGVzdC5ieXRlTGVuZ3RoID49IHNvdXJjZS5ieXRlTGVuZ3RoKSB7XG4gICAgICBsZXQgbmV4dE9mZnNldCA9IDA7XG4gICAgICBsZXQgbGVmdEJ5dGVzID0gc291cmNlLmJ5dGVMZW5ndGg7XG4gICAgICBjb25zdCB3b3JkU2l6ZXMgPSBbOCwgNCwgMiwgMV07XG4gICAgICB3b3JkU2l6ZXMuZm9yRWFjaCgoX3dvcmRTaXplXykgPT4ge1xuICAgICAgICBpZiAobGVmdEJ5dGVzID49IF93b3JkU2l6ZV8pIHtcbiAgICAgICAgICBjb25zdCBkb25lID0gdHJhbnNmZXJXaXRoKF93b3JkU2l6ZV8sIHNvdXJjZSwgZGVzdCwgbmV4dE9mZnNldCwgbGVmdEJ5dGVzKTtcbiAgICAgICAgICBuZXh0T2Zmc2V0ID0gZG9uZS5uZXh0T2Zmc2V0O1xuICAgICAgICAgIGxlZnRCeXRlcyA9IGRvbmUubGVmdEJ5dGVzO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gICAgZnVuY3Rpb24gdHJhbnNmZXJXaXRoKFxuICAgICAgd29yZFNpemU6IG51bWJlcixcbiAgICAgIHNvdXJjZTogYW55LFxuICAgICAgZGVzdDogYW55LFxuICAgICAgbmV4dE9mZnNldDogbnVtYmVyLFxuICAgICAgbGVmdEJ5dGVzOiBudW1iZXJcbiAgICApIHtcbiAgICAgIGxldCBWaWV3Q2xhc3M6IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IFVpbnQ4QXJyYXk7XG4gICAgICBzd2l0Y2ggKHdvcmRTaXplKSB7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBWaWV3Q2xhc3MgPSBGbG9hdDY0QXJyYXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBWaWV3Q2xhc3MgPSBGbG9hdDMyQXJyYXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBWaWV3Q2xhc3MgPSBVaW50MTZBcnJheTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFZpZXdDbGFzcyA9IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgVmlld0NsYXNzID0gVWludDhBcnJheTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpZXdfc291cmNlID0gbmV3IFZpZXdDbGFzcyhzb3VyY2UsIG5leHRPZmZzZXQsIE1hdGgudHJ1bmMobGVmdEJ5dGVzIC8gd29yZFNpemUpKTtcbiAgICAgIGNvbnN0IHZpZXdfZGVzdCA9IG5ldyBWaWV3Q2xhc3MoZGVzdCwgbmV4dE9mZnNldCwgTWF0aC50cnVuYyhsZWZ0Qnl0ZXMgLyB3b3JkU2l6ZSkpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3X2Rlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmlld19kZXN0W2ldID0gdmlld19zb3VyY2VbaV07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0T2Zmc2V0OiB2aWV3X3NvdXJjZS5ieXRlT2Zmc2V0ICsgdmlld19zb3VyY2UuYnl0ZUxlbmd0aCxcbiAgICAgICAgbGVmdEJ5dGVzOiBzb3VyY2UuYnl0ZUxlbmd0aCAtICh2aWV3X3NvdXJjZS5ieXRlT2Zmc2V0ICsgdmlld19zb3VyY2UuYnl0ZUxlbmd0aCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUGl4ZWxGb3JtYXQsIFBpeGVsRm9ybWF0RW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1BpeGVsRm9ybWF0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyLCBUZXh0dXJlUGFyYW1ldGVyRW51bSB9IGZyb20gJy4uL2RlZmluaXRpb25zL1RleHR1cmVQYXJhbWV0ZXInO1xuaW1wb3J0IHsgQWJzdHJhY3RUZXh0dXJlIH0gZnJvbSAnLi9BYnN0cmFjdFRleHR1cmUnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9yZW5kZXJlci9DR0FQSVJlc291cmNlUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBTaXplIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tICcuLi9taXNjL0RhdGFVdGlsJztcbmltcG9ydCB7IFRleHR1cmVGb3JtYXQgfSBmcm9tICcuLi9kZWZpbml0aW9ucy9UZXh0dXJlRm9ybWF0JztcblxuZXhwb3J0IHR5cGUgVmlkZW9UZXh0dXJlQXJndW1lbnRzID0ge1xuICBsZXZlbDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICBmb3JtYXQ6IFBpeGVsRm9ybWF0RW51bTtcbiAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gIG1pbkZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICBnZW5lcmF0ZU1pcG1hcDogYm9vbGVhbjtcbiAgYW5pc290cm9weTogYm9vbGVhbjtcbiAgaXNQcmVtdWx0aXBsaWVkQWxwaGE/OiBib29sZWFuO1xuICBtdXRlZEF1dG9QbGF5OiBib29sZWFuO1xuICBwbGF5QnV0dG9uRG9tRWxlbWVudD86IEhUTUxFbGVtZW50O1xufTtcblxuZXhwb3J0IGNsYXNzIFZpZGVvVGV4dHVyZSBleHRlbmRzIEFic3RyYWN0VGV4dHVyZSB7XG4gIHByaXZhdGUgX19pbWFnZURhdGE/OiBJbWFnZURhdGE7XG4gIHB1YmxpYyBhdXRvUmVzaXplID0gdHJ1ZTtcbiAgcHVibGljIGF1dG9EZXRlY3RUcmFuc3BhcmVuY3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19sb2FkZWRCYXNpc0Z1bmMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX19iYXNpc0xvYWRQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgI2h0bWxWaWRlb0VsZW1lbnQ/OiBIVE1MVmlkZW9FbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0UmVzaXplZENhbnZhcyhpbWFnZTogSFRNTEltYWdlRWxlbWVudCwgbWF4U2l6ZTogU2l6ZSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNvbnN0IHBvdFdpZHRoID0gRGF0YVV0aWwuZ2V0TmVhcmVzdFBvd2VyT2ZUd28oaW1hZ2Uud2lkdGgpO1xuICAgIGNvbnN0IHBvdEhlaWdodCA9IERhdGFVdGlsLmdldE5lYXJlc3RQb3dlck9mVHdvKGltYWdlLmhlaWdodCk7XG5cbiAgICBjb25zdCBhc3BlY3QgPSBwb3RIZWlnaHQgLyBwb3RXaWR0aDtcbiAgICBsZXQgZHN0V2lkdGggPSAwO1xuICAgIGxldCBkc3RIZWlnaHQgPSAwO1xuICAgIGlmIChwb3RXaWR0aCA+IHBvdEhlaWdodCkge1xuICAgICAgZHN0V2lkdGggPSBNYXRoLm1pbihwb3RXaWR0aCwgbWF4U2l6ZSk7XG4gICAgICBkc3RIZWlnaHQgPSBkc3RXaWR0aCAqIGFzcGVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHN0SGVpZ2h0ID0gTWF0aC5taW4ocG90SGVpZ2h0LCBtYXhTaXplKTtcbiAgICAgIGRzdFdpZHRoID0gZHN0SGVpZ2h0IC8gYXNwZWN0O1xuICAgIH1cbiAgICBjYW52YXMud2lkdGggPSBkc3RXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gZHN0SGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIDAsIGRzdFdpZHRoLCBkc3RIZWlnaHQpO1xuXG4gICAgaWYgKHRoaXMuYXV0b0RldGVjdFRyYW5zcGFyZW5jeSkge1xuICAgICAgdGhpcy5fX2ltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgZHN0V2lkdGgsIGRzdEhlaWdodCk7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzdEhlaWdodDsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZHN0V2lkdGg7IHgrKykge1xuICAgICAgICAgIGNvbnN0IGFscGhhID0gdGhpcy5fX2ltYWdlRGF0YS5kYXRhWyh4ICsgeSAqIGRzdFdpZHRoKSAqIDQgKyAzXTtcbiAgICAgICAgICBpZiAoYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICB0aGlzLl9faGFzVHJhbnNwYXJlbnRQaXhlbHMgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX19oYXNUcmFuc3BhcmVudFBpeGVscyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjYW52YXM7XG4gIH1cblxuICBnZW5lcmF0ZVRleHR1cmVGcm9tVmlkZW8oXG4gICAgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQsXG4gICAge1xuICAgICAgbGV2ZWwgPSAwLFxuICAgICAgaW50ZXJuYWxGb3JtYXQgPSBUZXh0dXJlRm9ybWF0LlJHQkE4LFxuICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICAgIHR5cGUgPSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwID0gZmFsc2UsXG4gICAgICBtdXRlZEF1dG9QbGF5ID0gdHJ1ZSxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fX3N0YXJ0ZWRUb0xvYWQgPSB0cnVlO1xuICAgIHRoaXMuI2h0bWxWaWRlb0VsZW1lbnQgPSB2aWRlbztcbiAgICBpZiAobXV0ZWRBdXRvUGxheSkge1xuICAgICAgdmlkZW8uYXV0b3BsYXkgPSB0cnVlO1xuICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpbWcgPSB2aWRlbztcblxuICAgIHRoaXMuX193aWR0aCA9IGltZy52aWRlb1dpZHRoO1xuICAgIHRoaXMuX19oZWlnaHQgPSBpbWcudmlkZW9IZWlnaHQ7XG5cbiAgICBjb25zdCB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldENnQXBpUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZVRleHR1cmVGcm9tSW1hZ2VCaXRtYXBEYXRhKGltZywge1xuICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgaW50ZXJuYWxGb3JtYXQ6IGludGVybmFsRm9ybWF0LFxuICAgICAgd2lkdGg6IHRoaXMuX193aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5fX2hlaWdodCxcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBnZW5lcmF0ZU1pcG1hcCxcbiAgICB9KTtcblxuICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCA9IHRleHR1cmVIYW5kbGU7XG4gICAgdGhpcy5fX2lzVGV4dHVyZVJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9fdXJpID0gdmlkZW8uc3JjO1xuICB9XG5cbiAgZ2VuZXJhdGVUZXh0dXJlRnJvbVVyaShcbiAgICB2aWRlb1VyaTogc3RyaW5nLFxuICAgIHtcbiAgICAgIGxldmVsID0gMCxcbiAgICAgIGludGVybmFsRm9ybWF0ID0gVGV4dHVyZUZvcm1hdC5SR0JBOCxcbiAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQkEsXG4gICAgICB0eXBlID0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGUsXG4gICAgICBnZW5lcmF0ZU1pcG1hcCA9IGZhbHNlLFxuICAgICAgbXV0ZWRBdXRvUGxheSA9IHRydWUsXG4gICAgICBwbGF5QnV0dG9uRG9tRWxlbWVudCA9IHVuZGVmaW5lZCxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fX3VyaSA9IHZpZGVvVXJpO1xuICAgIHRoaXMuX19zdGFydGVkVG9Mb2FkID0gdHJ1ZTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYnV0dG9uID0gcGxheUJ1dHRvbkRvbUVsZW1lbnQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNldHVwVGV4dHVyZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fX3dpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICAgICAgdGhpcy5fX2hlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0Q2dBcGlSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICAgICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZVRleHR1cmVGcm9tSW1hZ2VCaXRtYXBEYXRhKHZpZGVvLCB7XG4gICAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICAgIGludGVybmFsRm9ybWF0OiBpbnRlcm5hbEZvcm1hdCxcbiAgICAgICAgICB3aWR0aDogdGhpcy5fX3dpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGhpcy5fX2hlaWdodCxcbiAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICBnZW5lcmF0ZU1pcG1hcDogZ2VuZXJhdGVNaXBtYXAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCA9IHRleHR1cmVIYW5kbGU7XG4gICAgICAgIHRoaXMuX19pc1RleHR1cmVSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgYnV0dG9uPy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnY2xpY2snLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgc2V0dXBUZXh0dXJlKCk7XG4gICAgICAgICAgdmlkZW8ucGxheSgpO1xuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJykgYXMgSFRNTFZpZGVvRWxlbWVudDtcbiAgICAgIHZpZGVvLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJ3BsYXlzaW5saW5lJyk7XG4gICAgICBpZiAobXV0ZWRBdXRvUGxheSkge1xuICAgICAgICB2aWRlby5hdXRvcGxheSA9IHRydWU7XG4gICAgICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgICB0aGlzLiNodG1sVmlkZW9FbGVtZW50ID0gdmlkZW87XG5cbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdjYW5wbGF5dGhyb3VnaCcsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBzZXR1cFRleHR1cmUoKTtcbiAgICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdlbmRlZCcsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIHZpZGVvLnNyYyA9IHZpZGVvVXJpO1xuICAgIH0pIGFzIFByb21pc2U8dm9pZD47XG4gIH1cblxuICB1cGRhdGVUZXh0dXJlKCkge1xuICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBpZiAodGhpcy5fX2lzVGV4dHVyZVJlYWR5ICYmIHRoaXMuI2h0bWxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LnVwZGF0ZVRleHR1cmUodGhpcy5fdGV4dHVyZVJlc291cmNlVWlkLCB0aGlzLiNodG1sVmlkZW9FbGVtZW50LCB7XG4gICAgICAgIGxldmVsOiAwLFxuICAgICAgICB4b2Zmc2V0OiAwLFxuICAgICAgICB5b2Zmc2V0OiAwLFxuICAgICAgICB3aWR0aDogdGhpcy5fX3dpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuX19oZWlnaHQsXG4gICAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICAgICAgdHlwZTogQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDdXJyZW50RnJhbWVQaXhlbERhdGEoKSB7XG4gICAgbGV0IHBpeGVsOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBpZiAodGhpcy5fX2lzVGV4dHVyZVJlYWR5ICYmIHRoaXMuI2h0bWxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHBpeGVsID0gd2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0UGl4ZWxEYXRhRnJvbVRleHR1cmUoXG4gICAgICAgIHRoaXMuX3RleHR1cmVSZXNvdXJjZVVpZCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgdGhpcy5oZWlnaHRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBbcGl4ZWwsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XTtcbiAgfVxuXG4gIHNldCBwbGF5YmFja1JhdGUodmFsdWUpIHtcbiAgICBpZiAodGhpcy4jaHRtbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy4jaHRtbFZpZGVvRWxlbWVudC5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGxheWJhY2tSYXRlKCkge1xuICAgIGNvbnN0IHBsYXliYWNrUmF0ZSA9IHRoaXMuI2h0bWxWaWRlb0VsZW1lbnQ/LnBsYXliYWNrUmF0ZTtcbiAgICByZXR1cm4gcGxheWJhY2tSYXRlID8/IDE7XG4gIH1cblxuICBwbGF5KCkge1xuICAgIHRoaXMuI2h0bWxWaWRlb0VsZW1lbnQ/LnBsYXkoKTtcbiAgfVxuXG4gIHBhdXNlKCkge1xuICAgIHRoaXMuI2h0bWxWaWRlb0VsZW1lbnQhLnBhdXNlKCk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQWJzdHJhY3RUZXh0dXJlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3ViZVRleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9JUmVuZGVyYWJsZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlbmRlckJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL1JlbmRlclRhcmdldFRleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9SZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSc7XG5leHBvcnQgKiBmcm9tICcuL1RleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9UZXh0dXJlRGF0YUZsb2F0JztcbmV4cG9ydCAqIGZyb20gJy4vVmlkZW9UZXh0dXJlJztcbmV4cG9ydCAqIGZyb20gJy4vU2FtcGxlcic7XG4iLCJleHBvcnQgKiBmcm9tICcuL2ZvdW5kYXRpb24vaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWJnbC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3dlYmdwdS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vZWZmZWtzZWVyL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4veHIvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uJztcbiIsIi8vIHI6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtVmlld2VyL2Jsb2IvbWFzdGVyL2Fzc2V0cy9pbWFnZXMvbHV0X3NoZWVuX0UucG5nXG4vLyBnOiBodHRwczovL2dvb2dsZS5naXRodWIuaW8vZmlsYW1lbnQvRmlsYW1lbnQuaHRtbCNsaWdodGluZy9pbWFnZWJhc2VkbGlnaHRzL2Nsb3RoXG4vLyBiOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYtU2FtcGxlLVZpZXdlci9ibG9iL21hc3Rlci9hc3NldHMvaW1hZ2VzL2x1dF9jaGFybGllLnBuZ1xuXG5jb25zdCBzaGVlbl9FX2FuZF9ER1Rlcm0gPVxuICAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFRQUFBQUVBQ0FJQUFBRFRFRDh4QUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUdrbWxVV0hSWVRVdzZZMjl0TG1Ga2IySmxMbmh0Y0FBQUFBQUFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ055NHlMV013TURBZ056a3VOVFkyWldKak5XSTBMQ0F5TURJeUx6QTFMekE1TFRBNE9qSTFPalUxSUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T21SalBTSm9kSFJ3T2k4dmNIVnliQzV2Y21jdlpHTXZaV3hsYldWdWRITXZNUzR4THlJZ2VHMXNibk02Y0dodmRHOXphRzl3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzQm9iM1J2YzJodmNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSRmRuUTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpVVjJaVzUwSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnTWpNdU5DQW9UV0ZqYVc1MGIzTm9LU0lnZUcxd09rTnlaV0YwWlVSaGRHVTlJakl3TWpJdE1EY3RNVEZVTURBNk1EZzZOREFyTURrNk1EQWlJSGh0Y0RwTmIyUnBabmxFWVhSbFBTSXlNREl5TFRBM0xURXhWREV5T2pVNE9qRTBLekE1T2pBd0lpQjRiWEE2VFdWMFlXUmhkR0ZFWVhSbFBTSXlNREl5TFRBM0xURXhWREV5T2pVNE9qRTBLekE1T2pBd0lpQmtZenBtYjNKdFlYUTlJbWx0WVdkbEwzQnVaeUlnY0dodmRHOXphRzl3T2tOdmJHOXlUVzlrWlQwaU15SWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcGtaakJrTkRVeVlTMDBaVE5qTFRSbE1EUXRPR1V3T0MwelpUQTRZekJoWm1ZNU5XWWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZZak16TldZek5HWXRPV1psTnkwME1XVTNMV0V5WldFdE5XWmxZelZtWm1ZM05EbG1JaUI0YlhCTlRUcFBjbWxuYVc1aGJFUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZZak16TldZek5HWXRPV1psTnkwME1XVTNMV0V5WldFdE5XWmxZelZtWm1ZM05EbG1JajRnUEhodGNFMU5Pa2hwYzNSdmNuaytJRHh5WkdZNlUyVnhQaUE4Y21SbU9teHBJSE4wUlhaME9tRmpkR2x2YmowaVkzSmxZWFJsWkNJZ2MzUkZkblE2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwaU16TTFaak0wWmkwNVptVTNMVFF4WlRjdFlUSmxZUzAxWm1Wak5XWm1aamMwT1dZaUlITjBSWFowT25kb1pXNDlJakl3TWpJdE1EY3RNVEZVTURBNk1EZzZOREFyTURrNk1EQWlJSE4wUlhaME9uTnZablIzWVhKbFFXZGxiblE5SWtGa2IySmxJRkJvYjNSdmMyaHZjQ0F5TXk0MElDaE5ZV05wYm5SdmMyZ3BJaTgrSUR4eVpHWTZiR2tnYzNSRmRuUTZZV04wYVc5dVBTSnpZWFpsWkNJZ2MzUkZkblE2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwall6UXlNbUUwTkMxbU0yUXhMVFJoWlRFdFlXTXlOUzAyTkdFM05HWmtaR0kwTVRjaUlITjBSWFowT25kb1pXNDlJakl3TWpJdE1EY3RNVEZVTVRBNk5UWTZNakFyTURrNk1EQWlJSE4wUlhaME9uTnZablIzWVhKbFFXZGxiblE5SWtGa2IySmxJRkJvYjNSdmMyaHZjQ0F5TXk0MElDaE5ZV05wYm5SdmMyZ3BJaUJ6ZEVWMmREcGphR0Z1WjJWa1BTSXZJaTgrSUR4eVpHWTZiR2tnYzNSRmRuUTZZV04wYVc5dVBTSnpZWFpsWkNJZ2MzUkZkblE2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwa1pqQmtORFV5WVMwMFpUTmpMVFJsTURRdE9HVXdPQzB6WlRBNFl6QmhabVk1TldZaUlITjBSWFowT25kb1pXNDlJakl3TWpJdE1EY3RNVEZVTVRJNk5UZzZNVFFyTURrNk1EQWlJSE4wUlhaME9uTnZablIzWVhKbFFXZGxiblE5SWtGa2IySmxJRkJvYjNSdmMyaHZjQ0F5TXk0MElDaE5ZV05wYm5SdmMyZ3BJaUJ6ZEVWMmREcGphR0Z1WjJWa1BTSXZJaTgrSUR3dmNtUm1PbE5sY1Q0Z1BDOTRiWEJOVFRwSWFYTjBiM0o1UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGk2RTY2SUFBS2JuU1VSQlZIaWNsZjFMcjNYTHRpVUd0UjV6N1gzT3pYdXZNbTJ3eFNOQmNnSEpZRmRBcGtxSlgrQ0tLMWlVK1dkSTFLaTRCQVlrcEVRcEpKQmxPUzJuTFR0Sm5IblQxM2xmNTU2enovNitPVHFGNkszMTFtT010ZlpoN3JYbk4rWVk4WTdXbjlFalJ2eFgvL04vaU4vL1IvajVIMXkvLzcvbnovOHhmby9yWitUdmtXOWN3QnRJNEcwWEYvQWRlQVBmZ1F1VjVqMHZkcHEwKzVmOVRLWTVyakZUSnAvcU8rZjFtN211MnlOUERDczhuOHBSc3VUM1kybTRGUTdMaTFsT3N0Nlk2VDJ4V241VTdSZTR0ZTM0UGhMbjUybjBOSDZwRURVN1BxazN2aXpxWGk5dWlYRkxuTGViY2N1K2Y4WnN5UmUxeEszd3VCVVYvK1Qva1BnWHlEOUQvaG53TC81Ui90bC9tSC8ySDF4LzluL0ozL3pOWllDK0RNcnZwNzlIU25qUHZDQUsvYWJRZklBYmt3d0U1Y3N3NFFrd3FjWGhpMXNDekFRT1hLY1p4L2MxaThyYm44K2wzN3pmZVV5UEw0dkNqWlp3dTliMzlYVHpNZVVqVW5VUnQvYmd5L1NlNit0a3V6c1g4WHA5UWg0SFVYMUdFc2Zua2NhT3hLcHU1ZXR2OEFKZXdBZXUxNytaci84ZFh2OUhmUHdYK1BqZjQvVy94Zm9meGRxVU1vcTdiSlFmS3c2NzJIL3IxaURNbS9mbUhsTitRTUUvZDY0UTlvZFoxR04yV09GSCszL3hFOVpnejNYUEczTXM3N01TbjZmUDJjSkhTc2luWnVDVHFjRlRTbi82ZGRzd0crQTN2eDYwdUNXTDJSMHY4eGVMK29KbU1JdjFTZEhOai9ncjVHOFFQeUcvSVJKWXVINEVmdjNmemZlL2grdmZ3L1dYdVA3UGVQOEhtZjgzNEI4anI1MTdpZnZtd090alY5VU9iOHI3cWJsSHl1czJCQzY4N2hSNGpNaEJOaXJxbW5OdzNlYnZuc3Q1MVJjZno3WFl4eU9CNnIwemU5d0c1RDV1OTU4Z09qOWpTWGRGNWRBRTdsbjhjMWNrN2czd3hKOFY4dmpKVzRJdk92dFlrV2QwWnZkWTdMM0JIL2c5MVhsZ3ZUYjZnVDlHQlBJNzhQM3Y0ZjN2NHZ1L3UvS2Z2cS8vRVBsL3l2eUh5SCtHL08zQ3R5dXZDRVRPMGN5dXorZFBMUDg3ZjE1UERkMnk0ckwrZkNIbTdxUGdDUTVpK0l4bEhyVTg2cHJLOGhsbzdyejVzOFNmZmU3MTNoL2Q2ejB1dmtoOENOV2p1aSt5Zk1aaTd5emM3LzhocEhWdjdkZkQ5WFYvNzRTS3lSY09rT3hrSDNnakVobkFCL0lINEZmQUh3RS9Jd1A0Qm53RHZnUGZrZSsvait2ZngvVy93ZlgvalB5L1h2a1BNdjh4OGw5bS9nM3k5NGx2bWUrdzRRb0EyWU4rcUNoaTdaSWtSM09QUWZrTUU1OUpnNlBHT3k5L3BLNkRjM3hXNHhjSU8zNGVmYm1McjVnRDh2ajVtaDRlQ3p6YThNaDkwNTcrSXFFZWNnTjI0YVU5eXJRditxVzJmVUg4Unh1VUYxL094VDFYUE1FQXdNY0ZyQ2diQUQ4Z2Y0WDROZkliQU9BYjhIT1JRWlp0RzNIOU81bi96cnIrYVY3L0QrUS9pT3NmSWY4TStaZkFiNUMvUS82TStJNHNIMDhpZHlNeXUySnZuTStmNEhWb0RvK3plMlQ4ck5zaXYrdUcva01tNFA4ZkVCd2ZaL3llL3RBMDdsalAyYXA3K1oveDZUdisvTUovcnNrQ0QwQjhqYno4NU9rWDR1Z1BGM3BPbVhmV2ZuVHczbjRsY01hRXo3V0dvK05MRWlBQ1dJZ1g4Z1A0QWZFanJsOEIzNEFFWHNCQ3ZvQVgxaHZ2Ti9CR3ZoRVhjUDE5WEg4L3J2OTFYdi92ekgrSS9FZklmNGI4YytSZkkzK0QvQW41YzhTM3lPK0pLeklSbWFTSDdrK2V6ZnJzODdVcy9nTnZQbktwT3lidTdOYnpmbEVML2dDZ1BONDVhT0N4blhoSzhGalVGN0IrdkQ2a3hOY1UrTmlGNC9OWWV6NGg5UTdpejRwNnJPWCs4MUhXSFRONDlPSWpBcm1BRitLRi9BSDVBK0pYeU8rSXhMVVFDL0VDWGtnNS8rWGFmQ091djR2cmZ4WFgveEw1bitENmZ5SC9VK1IvbmZubnlML0E5WnZFMzBiK2hQd1o4UTM1UFhBRkx1QktaR1FtZ01ocVhQN0NzRDRPemFQbThBalRBMkc0amNMamxIOWQrNTNaWTdibk04VGMyZDV4ODlCTUhQVDNOdVNYYy8rTFBBV2ZOTkliY3dBb1BtblMwWjZqbGk4a0p6NVA4N1ZBZUd6MkkrM0JSdWxnSHgvVnhZWDhBRDRRUCtENnNYU2VDRnhSWTVBdjREdXdFRy9nUXI0cFhOL0E5VWZJLzBWYy96YnlQNHZyUDBMK1kxei9EUEhueUwrNFNpRDhMdUtueE0vYnJBNjhyMTRIUzJSR1VVSjZreDlCZWUvVmZmNE93ZTM2enhlWXkwK1kwTmNmVjM1VWl4ZDdQVTNlb1pmZmVmd2pzejlreFRHdmp6TGtzemJmeFNCdUkvbUZmbklmOWtjQjhrZ01kNzNsTG9SeEc3RmY3TTVSNDMyaTc0MEJjQUVmR2NEaTN3ZndBL0FEOE9QVUhCZldkN3dYWWlHM0ZyU0FGN0F2THVCQ1hqL2krcmR5L1UvaStzK3gvaE5jL3lYeW42L3J6Ni84aThSZlpmNEcrQzN5SitEM3RCTytBKyswUmVFcnkyaGNVV1pBYk52aEpoL3VIWTdiWlBnY1B6S1lpeVI4d1BRZ2cwY2hmbjk2cEZGTDd2UHhpOHpzQzlyR3pKczN4Qng1N3d6dmdOb2ZydGg0TG0vSkYrVHgrUFN4elk4MDhJdWZ6MFRLVWRUWFl2QURnTFFndkpDMGh1TnRPVWtrdVVvT2xDaFk1Y2VKYXhzR2lQd1IxLzhVMTcrQitDK1EveG5pLzVQNUw1Qi9EdndGOHE4emZ3UDhMZkozeU44amZzNzhXWEVWbWRlSzYxMmNOSkVaeUhJanhkbmZiVHpvOXpYSE4yOW9PQmp6TVlKM3RuSE1RZHltN1RCa2NadEZid3llSnZqcldma2k0MmRkZUd6NVp5UjBkQnl6ZDErMExXZXV4NVQzb2NNTjlKNzRzMzQ5c29sZmJONWR0TVluUGQyZmp3d0VKVUM4Z0EvRVJ4bkVBQ0p4QVFna2RhRllpTzlGRFBuR3RxRno2MFZiRkFRUXYwYjh6eUwveHhuL0pmSS9qL3pua2Y5TjVuOGIrRXZrWHlQL0J2bGI0SGVSUDJYK0h2RXo4aHZpZTJiRlZTUk5oY0k1aVNIWnFZejZ5amtZOTdrWFdNTVVqNjlaK05jRlBnNWlQTUg2b0pQUHFyaVhLWkE5TG13NVZ1N2RPV281VkNQY3J1OTl1ZlBzKzgvUHVwQTNsZVlYTzN0WFJESHY0L003OXdZLzhxRDRrZ1krVmd3R1grNmdEK1JteEZmaExrZ0R1Uzgyd1N4Y2k0clFHM0VoS1FyeXduWDl5UlgvTnZKL2dQeXZrUDhrODE5ay9ubmtYMlQrSmZLdkE3OUIvaGI1VytSUEdUOUgvajdqRy9JYjhNNHl0eE40WjE0Wm14SktRU3I3ZVhjcGNOa2dIRzRsM09EeUdWKy9zK2VjUCsvWmo4OTlJZUl1Slk0RW40RXluNzRmQy9sQ2JZamJCVzRBdlYvY2hlZGp5KytOOFl4ZkszaVBlVlhzTHpMNG95WEhoTjQvbi9FSXpleEgvU0ttV3d1NnBtNGhqWGFubEVEWVZISFY5LzdER3hHSXdGcTRybjgxODEvSi9POUYvcE1vVitsL2kvekx6TDlDL2pYeWI1Ry9qZnpkRlQ5Ri9yU2xRZUFiNHR2Szl4dmZnY3ZzaEd0YnpCY1MySVNRTWJzVlcyVFlnTVVuVVFsS3NrdjRiQ25xRjZVOG5vRDRDT2hqNkIrejNObllaeXJFUGYyZCtBL3VlR2h4ZDNBYy9QaG80V1AzajlyVjN6L1FLUDhpd1dlMGg2ZlI4MlkvVm5RSWdZc28vdGhNdE13QTBvREM0MWJpellGTUlLT1F2Wm53RlpRTUZ4QTBBOTUxdlFVQ0FzaEEvdmN6LzFYa3YzNWQveFQ1M3lEL0pmSmZadjVWNUY4aGY0UDhEZkE3NU8rUVAyWDhGUG56aFo5enIwTEg5OGgzNGgxNFIxNFpGM0FGdHUvb0l0WWQ4OWJOMkQ5eDhRRStHYSs4elJaSS9tdUdMZVVubzN5QTZRdGRLMi8zL3hCMis1a1FlNVFrZHdJN21QM1hVSHNjRFR5TjFXZHlUQzIvMC85OTlBNWhsVS9YbnYyenB1S1hzanpLMVk5RWNmRVdBdlQ5NDhKRk9lQXNKSU9pSUlvazhFWUc4R2FpQzllNzlhVklJQkg1cTd6K0RjUy9ndnovSXY4NTh1OGkvK0s2L2hMNVY4aS9DZnptdmFVQmZzcjhLZkwzR2IvUC9BYVV5eWp4SFhFaDM0azM4cnJpeW0wblpKVU83TFcyUUtiSmdVZ0pMcVNZRS9KaDdJNkovSUkyN3JudUUzT250M3VXUXcyN2ExeC9TRVdmUGZLYnp2anhCRFZZR3g1TENQditRenAxTk9rTEVEOW12L2ZyczZHNDAxTGViajdLbWFUajAvU1pWWElnOTdxWU8rdXRzbURCRWdVUStxOG1nelFuYVd5VE5vRDhlNWwvZ3V2dklmL3J5RCtOK05QTVA5MDBnUHdiNU44Q2Yzdmw3NUEvQlg2Sy9IM216NG1mSTc0aHYxMzREcndENzJTMFJlUWJrV3BsWkFLWmtRQVNHVWphMFMwWmRyZXZTb05OTjU5Tnp4ZU0vQmpmTHlTdlZyV09PZmhNNkg5Qmx2ZnNYL0RnZytrZVBYcUUybDFjUEpaenIvU3pUdDFKMmkrKzRENDVCdzNXQldjY254WHl4ZjJqelIvRkZRSll0RzRWQWJIVm1BUjIvUE5tdGRpcVJYMFdrRyt5V0VtQU44bkRsalQzZFNUaStrRDhENUYva3RjL1EvNEo4bytSZjR6ODY4Zy96dndiNUc4UXY4MzhiZWJ2RUQ5cDZTRGpteFlRRXQrai9FWHZLQ01oa1c5RTdvQzhDeG1aNzJydXNkNWNrb0ZqbmJTa09UclRrcjRINmp5aVZ0OWZqUHQ5TmZvUEFib1NlelB1WVhaSHdNL0J5RDhqRE53cThvWTlOaUFuRnYvd3owRnlYNGlhTDhCOTUrSjNjcnIzNkpGTjdMd2ZrQ0VyRlVqMndLdDhRYmlBVjFHQ0QwR3prME1MUXVzL0pWdXlFSmRjZVlyOHV4Ri9sUG5IdVA0SStYY3kvdzd5aitvUGY0djgyOGpmSW4rYjhWUGtUMWY4SG5TWUpuNnVDRlc4czV5blcrNnNSR2E1WXhPUmEwdWRMTlZvU3dhTlhBTHlybkppRWhobU5TMk1oeG42eGJGKzVObWU1aTZ2dlZoTVdQdGszem51Z2EyalFKOXZQQlY0L3p6MjZ3Lzh4Rk9OZDFHUXR5YmRCUTdtOVowcWp1ejNQcW9aanoyS3JRS2wzNGp5YiticWkzZ2hnVWhFV2dWYWpRcmdqZGhNRllCWkNHMWRKSzR3ck8wMTN1dEg1TjlIL0JyWHJ5Ti9uZmxyNUsrQlh5Ti9EZjVjK2R0My9DN3lwNHpmSTM4Q2ZvNzRjY2NYWlJZWkJMNG5HSzJLelBxdUJiV01KSkZtWmkrdTlZZ2sySTh3SnAxQTZYZ1NJSTlzNlZBcXJ0djBIeEMvYzY5SGxlTnh5ajM3Wi9ySkhkYU95RWYwSEVnOWlzVzhmcVNFeC9TUFdVVGIzdjNIdko4QjJndVBwNm8vbTZDRE12ZjlXZ21HYS9Pci8vSlZwbVVtOEJMakJCSjQzU1pNdko5RmFlbmdTa1Rnc3FEa3ZMWjlITGorTmNTUHlCOHpmNFg4MVpXL1F2NHE4bGRYL29qOWgxOWwvaTd6ZDRnZmtiL1AvSDNFRDFkK2kvaVcrUTN4RGZrQmZNL2VoMXlXeHhZSXU2cVNYM0V0NENLdkw0UUhyajA0eVg5UW8yTHJ4NG13bnZJZjUycS9LTHN4bnpvVTdpbDlZQitKNUVEOFVla3ZpcVo3UzQ3YS9mb2cxT1ArWTVyajh4bFlEM3JBNTBOM0o0YURnRjNJM0t2MmlwWU40RWNsa2tOenRSRFFhbGNaQm9sOGxVdkgwYi81ZmJCRlc0V0lLUUZXclJBanJuYWI0cEpmNXU5bWZpQi9RSDZzL09FdDZPZVB5QjhqZjd6aXg4Z2ZNMytIK0FINUEvTG5pTjlmK1hQaUEvaklyUkhGOSswajJwU3duVVVaWlNHRWJkN01FZ3ZONjBPR2tPRTdTY2dYKzhmK2NpbE9NOEdGdXJ0RS91d25udmp4c1QzbGthTWZnSHRrZTUraEVMZWlQa3YyS0djK2crWVhKVHkyL0o3eWdQS2RXMy9kZ0VOODRXazA0dlp6cC9uUTNjdHBZRWM2S1A1bjFYYmhUUU9xSTIyL1JRK1p5Q0RZSmxzclNGckdjVkVtNVA3NXg1RXJjMlcra0Irbzc0L01IekkvZ0kvSUQrUUg4b2VJSHpOL1FuNEVmbUFZUmNXWjV0YUk0bnZtTy9FQ1RlUW9Ta2dnTWhGMTNTN1UzUVJmWTViN05JRmFjeHREMnVPOGdIZU11eHFMTzBEdm9NODV1OWNORGNmMEh6OXpUckJIcEQ0S2xnUDluekgxT3pzL3FqZ2FjOGZyMTZMZ2Z2UHhleGR5OEFYL0hEZS9ZUCtQSkEwUmdIUHIvUmRyNmtKWlFnRFVKcENVQnQ0ZzU0c28zZ3RqLzFYUlJRMGpFQmV1elZldlAwTCthOGhBcml1Myt2VkNGdlN2SGFLMHFTSmVtUis1ZjhiUHlBL0VOK1MzaUcvSTk0Vlg0aDM0am5odEU1bHJ5Vy9rMmlTdzBSL2NwaE9aRjNMTVRKSVFPR1piV015dEM2UVFRRW9WTEgyZ281VWNLM2VQellHL3g4K2FOakVtbURUVFI3R1B5QVpHWC8zcDNiOTBJT3lMRnVMV0YrWDY0dk9vK2R5YitobTRQNnY5S1B5UkxLUFhBWHp5K0plQkZiZ2tBU2dFYUZWYXFNUkdSOHlCYzZLNktzRytrRDJ3THJ5RGJwdWlnZjhPRWl2am5ZRmNrZXZLRmZsS2JMSHd5cXhvall5aWpZeWZrYStJVitZTDhUMXlJZDdJVjVaWi9BYmVGNjdBeWlLR2lOS0NhcEV2NDlxS1RUWnhnL3JTWk5MUnZabWtNSlVxUzkrOC8wWU1qam5jRUJNbUVPN0lQbUR4R2RvK1k1eDNXanBLdThQbEN5bzk4UHBGRzc3ZzJaOEIvWGo2R1EwZnpQNlJGSTlhY3E4RTl4TTVMcmttY0MzRVpWYURMbFJyam5uMWVVb1g2SHRKMk1sZ1N3YVVaK21TU0w3K1R1UzFYWmVac1hmTFpMNlEyeWYxZ1h4RmZhK01WZlN3MFkrUHhEZGdiOTc1ZnVHTitKNzV5bmp2Z05YQVc3dlNnQ3V4a0ZmRWJzVjJFVzJnWnVQYlpSclJYYUhheFRnNkx0V3BCdzErNHRWUERaaHk1S0NFWTdhVTQ0RHA0NlRlUHpIejNrWEJaN2pQVDFJcS9XT05uK0ZiZC80UWVuQ3lQNnBUcTQ3eVA1TVllU3ZOUi9WRGtyNTROcWl1TFByc0Y1QjA0R3d6Z0EyNXEwQUo0NHlCRlhoSCsxUEtLWFFaTzR4ZUdVajJMSzgvUVY3RTRXYktxOE5RZDl4U3JzeFg1aXZ3eWxqSUZYaGwvQnk1TWw3SWJ4a3Y1UGZFM2wyekVpdnh2a29JN0lqcklFMVhtRjFHMmNwNzZZQUtUa1pHbXVHYmhmbnFjZEYxYktyQVhHdzRBRnkvWlhBSDR6STBNWTZ3Ky9kbjZzY2pTZnlCVUR0dTNwV0VJMlhNNjgrbzZLamlhN2FkVDRYN0kyZXNudXdMYWZOWnk0OEdmRFNWOC9uZUNTbFJzUFgxV0hRa3NyRlNGbllOd1hxT0FlMitVUUtVY2tGbnFQS0VmSldCOS9XbnlPK1JlV1hHZHQ4WFBVU3laUkhiYUY3SWxiRnRocjFtOGExK3hpdnlWWXRscFJwZGtlL2ticzRvVjJuMXN4aDBaa1o3ODZNSW85U2g2bGYwOUNrTUx3VnFzWWhKREJ5cVBORVpTdE9EZVdmWXVLMkxmY1pyRDB3Y2dMNS9IREdmMFpJbnVCUFBuWG9mUzdqWCs0VjRlWVE3NXJWZkhIVHlTSkFIUTRxaEFxRVVGZW51dVJBWGFrRTF1L2NWM0xacUhUVXd0bWdkNG1hUjRWMlh6YmZoZm10RVFVc2d4V3p6VDVIZkZXTWRSUVhreGxwbmp2SllaYnl3L1VoUlB5TlhjdE5hWUdXZFdicUNFVXRYbVFRTHVNb3lMcnM5c2lSZHJhTlZ6YkVySHNRUU96YTE5SjNKNXNKSVFPbE5TSWdZQml5VUcrT1pMYUtNaWJmWmV4WVVqL2k3OCt4SGpIWkxaajgrcStLQVpuNXlmWlQyK0xtTHBxTTlNVk1lNUhFbnpvTm05dmZIYXg5TkZRQzN3R3Z2Qyt4Q1QzTUhTaVRSVFdrUW5MRDBSb2xwR1ZkcmFzbisyZVcwVlBraDg0OGozNW5mazFaQjVLV0Z1VXpSSzdhdERLellDdEttQVN6RXlseUk3OGlWZUM5OHYyb1RaMlN1d0R1UlJoVVhpUElPQXpSdjZWN0dxT2JTNkcyTWgwMVRsbXVWSTU0WlBQRk9Zb1RFa0Rja2RKRWVkbVY2RzI2UVBRQ3RCQTRkQjNyZXNueUJSZjhjR3NzajE3L3o4dnZUTzBidjVldm5YWDk3WUJ3M2t2QVNqcDlLK2ZHRzlsWE51ajNjbitwUXNmdzBkOUFxU3RoOFVxZmR5bDJZTUJzQUpRb0FzbncydHBhcEpHcXd5LytqekorUjM1RHZMUWV5YklNcjhncVhTeUxjakEzNktQUkhZQ1hXaGU4Ukt6T2FOc2o3VWNLaGRiN1M4dVh0b2pzM0ZkQzNCNGpyQjFTSW9qdE5mM0J0MituWU84Uk5MRVR4QjVZeXA3REJkT09jajFqOFRBRlF2Z01CeDBkQ3htdkhMT1N6akk5YzlrNE1kMW14NWsvTWE5enlmdGFBejlwNWY2UmFQakR2T3UrUDdRT2xGMmhsMlFaYkFwUnFoSjZNdmtCUGFaRG5wZDNmbHQvbFQvVnRCSERsUXY0ZDVMZklOL0tkK1QzeXlrdHVIRkpNSWpOV3hoWFlOQkJZR2RXSExTaFdySGQrU3l4Z1c4WWI5Q3ZpTzNLaE5qL3Z2K2o5K0hXcVZ3QjU1Wlh4MmxGR3RlT2cyWDBBZVEwTTEvcUhVd0w1c1ZRZ0MwbnF3dnJwblZNZVU1ck1JRTUvMEVQYzd1TjJjZGQvbkpZT2VPQjI1NEI0a3BIY2FVd1YzVnYxaU5vdnhNaEJYZDZZUjRseE5NUEwvL0FIUVMrUUIzSW15VE9KL2tqZTFBb3hrSWxZTnAycks4dXJIdTJZNmpScVNjMno1SUR0WkZtSkszK0YvS080dmwvNEh0dXp1ZDZSVndXMjVhWFdYeVlLTG9vQ3RDajRIZ2pFZDk2UGlKWDVKdlNEUVVSdkcwTnAzVWxKdHNPS0lrS3UwZ1Fpb2x4WnFQQUp1WHgzNmJzL3RVU2Uwdm80REdlZ1VkNW5mTmpOQjBEN1RLWGJuTjloL1JrdlZJSkhxdmlDS3o4eTZUc0U3MFIxa1BkbkJQT0x1dG1kRFBBSGRGQ2ZKZ0I1Z2R4SkIvUmkxa1pPSk42YjkxTU9GRnRiN0VhYUlxVENwUnhjaUlVM2dBdXhiTm9TQUZlcUxxNDk1eFlXdjdyVzd5Ty9YZms5OHp2eXV6UWlVc3kxZlVNWHV4akFGWUdNcEdxVUNMTUhBb2lzclk3YkVrQTd2R29mVUhNVExoRmN5WmlpUm4rWnlEdllXcHBPbUkyOFdUNTM2YURzNkVKczBVR1lGRFFqdUpmYTJvTjA1M2s5dTV3MXVWYnhPUkJ4QTk4WEtQY2E3MlVlbjlHa1dWcll5T0xXc01kNlhWWThxbTJIaVBpaWJZOGQveGlGQmk2VTV4eTBlblU0WElHUzEwRUprTTc0dDhTNDEzMGhWdXM4Y2VQOXNCa3V2U2lSNVlQNkFmbXJ6RytSMzFlUndYc2YwQlcwQ21naTAzK2ZpTktJVUxjaXRoQW9MVDVXNUZhVHJqSWVZcDkzRjhDYkpuMDFkbnRMdDNTODh0SnlBZWNsb3c1QVRZb0FNMTQ1Nmp2ODdpb3NsOCtVSHFRanZNNkpwNzBJdkNIWitaV09BUVp5OXpqZjBIQkhxais5cDc5Zk85bjhJdXZGN2Z0ZXI5KzVYOXcvajFyUVo4bnVqK0owZzlJYkVoN0ZnSzFXMU4rMTdRR1p5QXVSZEJDdFQ2c0pxdTBKd2hyRnFuRU5mNnRNRHJSWkhNZ2ZrVDljK2NPVlArTGF1bEFmTEJlOTU1TGN1V2dBQU1vWXlJMzdpSXdydmtuZW1mbjdUalkyb0xXQ0ZnVXBVM2l5ZjE1Z2JVRVhSYitIeUkrc1FGaTdrNzB1VWdGNWV4cFBNMEJnNzJKdjFITEhZbysvdVpLdUhEazl5Nk5Bd0swMC85d2ZIUklHVDFVNEhCOFZtSHRSajlYZHdYYkgzajNOVVVodmlkd1A5aVJmdGhvUTB5UUFWOHJLS1JUQUt1K2V5T2F5bEZ0Y1ZOR0xOR1hRQjNqOFZsSXZTa1RpYmRmSUQxdy8xSmwxNndma2o1bnZ6SGZrbXhmY0dLbjFnbzJXZ0x6M20xbEhSR1Frdm1kRW5lekZ5TldvaG1oM3MvVzU5dlBzZlEyWmJSalUzMEplTzNSamozbTFXK3NKMjFrVUFCMmtLUHVZdHdoK3VEbDgrSnV3ZTlUNGFERkFJK1NYbVBjaG1wVGxrWVYvaHViajBXZTVjcFovVk9UMzhmVDAvbmtraVh0MW4rVjlMTVNNWUJPYS9RYWtDWDNCdXBHZEZUT1hxOTBvSHJlWUtKMGU0RE1Vdjk5aVFmZmxDTnB5WUMzYXRSZUFGOVlQa1Q5RWZzdjhBZms5OG51V1NmQ0RtUVJYNXViMmUvMTRLK003bktqd245S1VNNEMxNDdLM3N5aHBIdFRCUnJsZmY3TzNjOFpWdzNPMWJDcjJmMlVqUGdONTVYYnZCTkcrc1JwSVF5d2llWG9GUFVWcGVrMVJMd2N4S0hubTlQYzJoZDdpckdFL3B2L0VkNHpVWHlEN0VaUi9pRmh3b2VSMy9QdFJCSGs1ZDFrVTA1QTQrdmlaVERqSzEvWEhtWndzdjlnL0FKckZ5YWRsQkVleC83MytNN1FtMnd0V3JpR0ZFdTBJaU5XYXo3VUlwNHNtdFY5QUdoSERvYSs5Q2VZajhNUGVFbm5oaDlvT0ZsZmtkYVhpaWxJK3dnMUlLa1ZYZ1R2cTBWVU9zRWg4TDg4cHRvT29CcVUydEdWRTdQVmpVa0pUUlhGMTVCVkJ1eG5nVm1oU25LMFpSNVNueUNNc0tzeW9ZeTNLcGJySCtLb0czYlQ2azFRcWplUHZyb0gwc3BwNEFodnp5RlB2b0k5YkZWOFR6UDBiTTcyWDgxaFhITjM5WkJqdXRkOXIyWitQdkFXYWQvdElDVHVtRGJ3ak9ybTBnVVpqdDI3OXYrZzhSZXM4cFE2NTluK1ZpK21pNWxOcEZDQjB2Ukl2NENOWGI1ZEIva0JGNkFma1BqWG9BbmJVd3Y0QUNxM1ludmpZblBpaURoSHBPakp3SG03Qm53UjkrWXFkQmlLSjNieXVrRmM0R2MxbjdIWXVJQ0Nsb3dHSVNFZGtOUTRpQTBycFRVSUM2a0IydTFOYjEwbjI1OERCd3NCRUdqb0NKNUU5SWp0dkY1L2RmQ3dubnBJZEZZbW9QcXZvVVc0OE5oSVQrdnZuUjl6NkNjNUJLTWZrNjhDcEYybUpvQmk4MlErYjhTY05BSmc2bEx3dnJHL041NTJ0RkNVamlISlZ1RnZrNjhxUGRiM2Vmb1RkM2drWmU0bmdqZnk0ekNTSVdyc3E4Q2QrUUh6YmU5c3l2bk1nSXpPbytieHo5UHhkNGY0UlYxN05JbXUxZUx0Mk5nOVpkQkQxZ0c2QkFPeVl1aTN0OW4vVXlCa1F4STJhQWkyNHdoQmt6Q3c1K0k4aC9meFltanUxZUNvSFdaT0VhQ2s3R1NZMGo5cmNEamtLakNlOEhoTEd4cXliLzFtYUkvRlI0Qi9Td2YzcFV5RmE3a1NmNzFEY0tPeStxVW13bnpCUFVVYjdoUURnd212aGZYRU42cXJRaVRKNU4rK1h0bE5BMmx6ZkZnUXljTDJBVjJJRlhybGVteEtRSDVIZnRYMHM4YTZUVGVNRGVVVitaUGxtS29vb2NHVkJNblRoYTcvQW52dzN0WllkeVZHTFlwcy9adis4Z0ZYbVFaMGszQTRpYnJzcE1hUWdoMFNwUmlWS2d2U1VKU2E1YWxiU0lpRTNVUWVmRmtSaXQwZndmdnFRRXVpQnBkSm1nSGpVVzNvd1JEa2Uwelh4ZFBEcEEraEhjN3lFTDVyOFdVYi8rWXNTd0IrSnErMWsxK0VHbFF4MTNrLytTQW1BSmdOQlh4ci92cWg5WkNCUDROYUNXTGl1RWhUaHhEQjlvS0VWM20xa2E2N1dpbHpJVitiS1MreS9WS1BBTytNZCtaSDV6dHpIVzcrU2hnRURFVGFJdnN2ZVZEQUh3eEtrL0tBdUNucUI0djNxMVhaY2JTY3dVYzcxQWNxQlM0R2xVYlFSR2RSbkRBV2xwVEhhTkpNTmEvdTRkS0ZhajBEc05lWUdVNTF0Z1VOT09FUzJGNVk0UGtNdFBxT0JjWFBxSXArbFAzRG1hTDV6ZEJjZDkwL2NNb3FqUHpUdlM3SzhkekJLQW5EaDU0cSs2TUlVSlVyQ2tEWHNaT0ErMEwyUExLbi9ySXR1VTZyKzhDaWppeWNvb242V0tFaHVHZE11bkZ4NXJjQUMxdGFJb2piUnY2SzNTcjRTSDRIcndndnhFWm5JSFlpZGdldUtqT1NPK09CSjYrR1llYnNnMEhmUUY1UnRERURyVkx2QUhlOVh3VUtvbFRqcU9zQjIrNWhqMDV3OFd4VHQ2NzN5d1lralNyZWRJSk5nMTBTTktwdERnKzBDdkZmNldNK3FmR1U4d09xQzRrQlZNUW9yTWViVFB3VFFzQnBuWVgxOVI3KzM3WjdsL2pOdWpUK3VQKzZ0OTZadlROY0p5WlBydzNpL3MzOUJYR1ZsNEpJUVFDbEM2Mm9heU1zUXYycnZGdERTb0RuYVdybXRqVXV4L242ZU5UZkI1Q3Z5STNNZm9Qc0JaTWExTWI4M3YzUHhDaGVONDJqZml0aXh2RUJna0VQWWNPMWxnVzF4MnhwWktpRGlDaTZPOFh1UFB2V3RQUjdKS0xyU2Nmcitia2J1TDFKQWpRTVZuZ0F5NkFNOTE1TkpMK2lvQ2tkRDdJQVJkdnBSQWh6WVNNc3VUYUhGM3cxQ1g1ZjVHWkZnVnFRczhaVG1LUG4rNkxyZFRJTW5GOEtzeXZTUU9CYjhDUHJqNTlaODloRkFKU1dXY1lOb2V6Y1AzcjhZTzdhYTZ5ZVZuOUQyZzJ1TG1aVllzVlprMUg3NWZDVTNTVklJdkJKWDRoV2g5WUhyd2hWNHJjaDM1ZzVyMjg2aWpjbkx0S0xRbWZER1ZDOGdRVC9rWUk0WFY5QlEwWElsRmhicElURzBJSG1CdG9WZUY4VXNRSmRQeGM3NTNKclVvSWhvTnhkY1gzS0V4WVZTL3cvSUNGS1Vnek96OGRwSGxlT2dEYWk5ZWFhRWxYTTA0SGg2ME1abjZiK2duSHN1ZlZUbWVURFdJVnhnalNqbGZnNEJCQTRQd285U25LNm9QK0YrK3pxRDBxRFlMYThIVmFBTWcyb0FyMnRjRml2Ykd0WFdoYURyVitCVllpRmVrVy9rSzNQSFRsL0FGWEhSTTdyamd4aUdFNzM4eWxDZTJWdnprMUlPaE5oZlZyZEFlK0RLZmFocWI2eDVubzRRbnNzT0xoR3lCK29DcEJxbE1CNnNpMHRqTzJOUlIxTXJHeWI5YTdkMk9JVE9YcktHa2h2UmVVZmlRNGJBQ3BGTW9FUWFIWGE1OGNqUjlmUmcvMnJBVWNqUmhjY0NjYXZyNlBXSERZalZRMnF1cVo0U29IdXc2WWtMQW95dklWQ24yaU9XSDFSK3BQckhEa0F5WDlCaEIwY0RLWURJdFUrTDRQRmQrejJydFQ5NG13UlhZaCtMc29CWHhCdjV1bExyMUMvRUZibnA1d1dSZHlUUC9Ucm8zYVZCT0thenFONlhqOEpYdzVQbkNGUUV0ZDV3VTVyU0Jlbi9jeUc0QmcyZys0ZmdxR1IwVGhKb1pQOHlDUVQ3bk8yTDdFS2Z1V1VBRng0TWlWOWs0WGUrd2VxZmllMng2dnVqSWFucytxenVsNHFOcDU4ZjUxUUQ0QzdhQ0h4bkpySDg0NjhjaUFSOXhjclFrY280dEtZTi8wNzBrdkM2OEFZOVFqREpBR0QvVzBaQzBTT04wZjIzZ0ZmaU82L2JOc2pZNGFLdnhCVjRBVmRHcnN3clg0b1RSV2JnaGNocm8zLzZSNXp6TlJrRXRPYTZiV0lqQVBzVzdxa3ZjVUhnSXJnM3NybGFzUmx3U1liY09BMjlCMjB2WXhCV1VZUUZVb053V3JjbzVVc0ZVcElva2JQRkRiTVpDQ2EyR01FRUdpQ1c5dURLeDZjeFp6ckduWFA3ejhlYldyRGpnSCtxQWgwU3lWdHlOb25wUHg3enlDcDRBZDhueSs4dWVkQkVDNHQ2V293eGdHMEpha2tCeUcxVkMvU0JBTjdtQ0tyN1lERGNSU3RjZzhHRmhrQWtGcVhVdXJEM2RpM0VpdHcrVTluS0cvMnZXZ2FtcHJUUm41RnB2SC9FR2lpT3lDYWdCaW1XUFBCWGMrUGtFQzZaQk5IMndCNmVSY3Q0b2NSSVFWNldNRGVkNWZaNGJyWjlvVmEreE8rTis3Y28ydVJadjAwVzNDQWNuaWZJclRYRC9tdWgzaW9DMHJHWDVHd0NHTU0xSytUUFNXL3o0Ymh6TUdqZGVTU0R6MmpqYUltbitYaEl6YkdRc0RmdGc5WXQzZDNDZmZrRncrN2JuWm92MzRnN25hMHQ4VUV2cWhwRUJ4RTdFRUNFN0FINzI2ZUxSaDJkc3ZjOWxwNFRGWEd4Nzd3MjI0M01VbEh3S2lqc2srQkJiV05FMUhDVFY3T3J2Yy9tZmVYYW1oMUh1RnBhQ2xLdWRIdWdmUHA3NFN4NmFRRFlhd0FCWExWbVhHU3h2YUtsMkZ1SUEvWDFSdTVVcHlEK3pZSGpZb1FwVkRlb2Qrc2JFaFFtMVhFdVpTaFRqbUVabzNRVWN0UnlaOWM1citOMjV5amc4WE5IL0owYTk1VFFEY3ExemNwdi9CdkI2SDhiMVdiOHRIcFg0bnUwQTZPOGlrRlZwNHRHR1BRRGMvV1hBZks1SFBFQU9rQm92NVdZMG1pM1lsSDVDYk9KNnk5aUllUEt0VjFEZ1lWNHZmUGF4SkJZdFVpTUJGNDVCcWVGVmhtZVdCTVZ0ZVVtdU02YkFNVkxqVitxcUx3aWxuNjJLelFSc2VBaFE3MDJ2QmNUU0lpZ01CQ3JBUDFISS9BSDdRQjF4dHVPSUhNSkRZY3FyTmtLMDdpanEwdEk4Y29idFdCaXp2RTZubjZtdFh5Qy9qdGRQZFo0Q0kzblBtd1ZDQ1A0b0xpK2dodjFiMVZBVWdvVnNNVjU0SHQwV0dneTVVNG0rZHpOMlRPeTZvUUl5T0phNHBMREJtaXhSYVdJblF3UDJnbVN3VzVIVWlic1hmQ2JIcTVZbVZmNVVrdjVjYS9vSzRHc3pab0EzZkhRYktXbTRlSUlpYnRyTDF4V1ZnQmNFblpCVnF3M2xuTUdrNEptTVJSMFp3eEV5d0tGY2NDcG9xcWQ3RjlrUU9ZdG9YT3Nhc1c0ZWpJU21NTEFHMFVHT1dIcWlIUUk1Q2pQb2kxdXRmam5VYXA0MHo0VFByQldIY1YrWk5hQk0wcm5WTnMveWQzcmdjZ2p1dURORDBMODBMRCtTQUQ3SXNCbE1rc1FwSUc0anZIS29vMGNtaG1sODZhL2hkekgvaXdheXVVd1RiNzZKc2o3VjhtQjNEclNuc0dGMTFVSVZxZVQzSmw4dStHT0xRcXVjdW1zTEdaZm9JOTlDT2sybEZQbkRKZFlRR24xRnNld3c0UjRvVW1qSmFDcDNnTEJReXE2dlNzaXNVTUFLeXhwNXdweEQrSS9tMVlQTVZEOUhWSUV3K0VGUW1BWEFzWFJQQW1FWjFseTRESzZpdnNuYno4UHJBc3FCd1htRFhlNlk2OUlzbEw4WmpuNGhZS09xdSsyWHdaOUdPOEhwZzFnTndGTFkwMnI4RGcxMU9SQTlKSnhicjlRSnJiMlg4dkRHU3ZqRFNSV3REb1VJZ3llRmZkS1hCSHJ5b3NXUWpsQUwyaDk0TXJnSnAyeUZnU0Z6SHdGTGgrM1JBWVdveUdRMi9vTUdkeUZnUjBvZ2RaaVpCd3ZCNzJXdVlxcG9KWVlXTmsyZ2lNelYrbVRDcFhnWUZlVVI4MmNmUHNGRHJIL2FBWnVXcHhBNEo3TU9ZTjU0bzlxZ1VrWGcvSk1lWDVPbm0wNDlVZERVSDJXZDM2Y0RPN29oNjhFSzN6QkcxbzYvUzdGb0o5VWVIWUc1L283WlA0U1l3bG1BVmIydmdLd1RFSGpvZi83bzhoUWF0czd5UXhUVWJrUmJRd1VEUVNQeXVvVGdmck8xbi9LdTdSd1pZWDl2RUNTRXlTeU5ZS0w5NlYzd2RjRXN0YkV1ZU9odXJIMW4xb3JSdzJTRkllYndwY2J1YkdkeTV1dXpHSm1NQ3NaYi9hY3kxdHE0Z1BBV0Q2clFTL3B5OGdpeFVTRVREVnpzeDVrb0tIUGN5TElLNllob1pTZk1lL3o1OEdNNTYrbmh3OUM0RWpzSU05SEw1RHl5OHhOY1hmV0VOYWI0bmpiSlJuSTVJblFLQisyMUZIeE1BK3lVQU83eFJRQzNvMHNKU0s5LzJtVUFDS2V2TDhZZjJ5TnFPbWh0QlJheVpseFJhNWFmdEFod0J0OVJSZzdwR2NGY1BVd3lJa0pHYjVaSEdCRjMyUklkOGdtbGhtdzM5WkJ3TkZaMUd5NE1OODdka0lpSVZ2L01hQ1FvQkJjSWVBUEdoTTEra3l4YTdGVFhDaWRMVWlPOTRKbXh3MXhhb1pOSm9HRGdNVGRzMEI0L0R3SWhMemQvN3lvdU4yNWYzYWFjVENXazg2ZWh3VjhCeEJqMmpzMTJmOG1sU3VhcDVGZkFianBQd2w0Z0IyR0NxU1VEdlJxMGtwY0pRUVNQVU85U3RBRFZZc1VRZWlMS25MclFsakFkWUViMGdxWFFyd1VJZkJpUld5VmV0VkV4SnBpNjZMd2dSbkVpb2U3TnVJanJxczN6VWlLR0JrM3k1N3ZkVVdyUTlBbW03cVg0SktaU0NJYU5Ba0VGOEpNb0lOTENrQ3BTbHBEMEIwR1JGUUdobDFrbm15bzVEeEhuL2VEN1c1K2Q1QUJtdHFQK1c4bURhT2l2bVcvdmhZbVIwcXZPcllSZk0rcGk4dmtRTkIxMTdwK3M2OCtUUWhxYXhUWDlZaVhybHhqZ3lyOEdBQWZBcll4WTJWZXFScXV3U3hCdWJXOUp1TDZLRVdJZjN2ZnBkaHo2R2Z3WktIeHR3aWNCTjJnSElCdFFyZ09zTzFkb0dWQ2hubVlFNHZMV1RCYlByTHRudGdyVHFYTjF4QWw1WU1JSWJsb1FQMmtHSDVlM043RHhkdU5XT005RmM4dHBWMTRwTkhkQ3VWd3A3cVUyRkpJYUdsNFBUaFBteGJqdlBFQVh3ZUlmaDdsZlMxTUhzczhVcW9KdlNFbXlXdmxBM1VTUElVQTU5eVovY2JDOSt3MGFlaFhuV0prTFFjZU8yMHRYc0NiaUt6OU5BQ010Y2l0WHRFQ1pVWUdsV2NlK0IvWTZ0Qit0R0pkZVczRkRiWFZQVWhGeXh6OEM4Z0xpMnh1NjNvbnMrQm53MzFicHl1cTJNV1Z3NnU4Ym1UOGZGUWRpc2hVWXNOdEN1dWxBa1U3ZGt6N3A0S0V5cWFaYUY0TWJTNHJQWWRyWjczT2EraXVsR1VrVHlSUnltU2VzOWZUNTdSa2FLbzVxL3lEaEI2SjRRYWlRVVhITEh3Mk5VY2grODRIS0RSeEMxdzBpVWdtRmpYaXdqMU03VW1qamJnMVhMSnlYMXdTMlNDMTNQdE5QSExzS3VTWVovWUR0Q1pTVWpMUElwb01JcERiclJwOFgxaWdZdkFpWFB1dnhRRVpOWmxZM0paVFpEQ3BaZFBZbGpON3JNb0EyQUpCSnErSm5VeWtIRjVCYWJCZGlSMFEyak5XTkw0VmVxTUhXZ013bDJhNWtrSURYazRwT251aS9HZU5kQThDeFo3QUxXVTQ5RW0ydnpWRkcrSVJQZXB6RHREQjN4VGlSTmtUNVdYQ3NqL2V1WlBCM1NYMVNBUGVQTjJoRy9TSkNoZFBSTmdndWg2b0dBbXN3TGZiaStCM3MwUUd3Vm9nTHVxSUQzMFZnOVZUUlJmUW5NNG9JZERRRjZFZXBoamNHYnBQL2lGa2svUVFkZWoxc0pMSnduZUpGY29rTlFrWk1ubTlCd3ZZUkxWS1U5b09KYUFXV2hZOXA2R1J1SG9EeE83bTZrNXA5R3B5eU9VWkFKRk1VYXhuRDJydE9xTlRZaytkeW5JcnVYN2UxSm1TRmV3V2djbEZiRlpwL1JjWmJKbHl4KzR3VGxpSUVvckFnMXp0K09UZ2cwOUFmOHI3dVlnZWFXb2xXT0RMZWVIWDRxaVl6SDczVUJLZ29oZHBIZ1RhTzVoRXYxTUN5UDY3dVVhazFnM3ROY25vczhoZFNqVWhpS0hRcHducFFzNzFNWEdmMUh6WWFhSWFhN1BUQzZrd0IyQ3RjZ1NWMHFKdjA0STJ0NnNYVklyOWF3VWNQWGc4U24zd1JyS0tXaUlBNUNFVGViVGFFNENyVEx4bzBHWnE5NzhKbXVQOG9ocnNXbGJnRnhtazFDUzRzR2krNlUzaGxOeW50ZW9Kd1VRcHRlN2dUSDFaT2NkSGNBMU0wV1BnZVNCSXUvbUI3QXFjYUlDOVhiQm41RUtidkdHelJlMGJXNXYraG1LcUxRcms4U2I3aGZYek12WWZSaWZlVnNLb0xkU0txdmNac0N5b1RaYzg0YWVjN1NIMzdMNldPaFNSbVpjMU1LVC9vTkpJdzltdFhscmY5UkMvR0dyUHhaSFliSDVyTFF0eFphNkl2S3Jyc2dHQ2RrakhTNWNzTkVBamVzaDVYL3krQlVLNVBodTFoWDZqRTI2ckwzZHFDcjRBdENCWGVKQjJKVjRHRFdxRFVlallwUXZITmkrUThJOHVCTDZHSVQ2N3dhQzVGVDNFL0drZ1llRTNVWUFCa05Ha1hnbldzYW0rd0JTeitFYW1VUUxFT3pnem9wTWVncWpwYllGbDZQZDJuZTZnTGo2RE5MQVBQZVJFSUpBMHBuTm1iQThXcGh3QWdpZHh5VkJlVldBZEhxcllxT0x4cURVdHgydjdXTkdpWUVNL0xvbUNCQ0xrRDVVdXRJbUJGdFFtQ1htY1ZyQ2JTYml2eEZ0T1NHa21acm5WYUljTlBlUk8zYzcrNktmRnI0TW5Bd1NGUVFCWWRKc1c3WllxVHl6MURKb3lOSUdXSmhMdW5zWVdDQlF0N2ozNmhGU0dkRHhnRW43VFduSVF5ZjN6NFkwVzlLOUhnOWg3WUQ5ZDRDcXdQY25jM3ZMNTlIS21MU2FvWXk0V0FKemUvYjI5UFROejBRZ1c2TE9jSk5YbDJicWtMaDk4Skprd1RRSTZUSFV6NEdRUUZpNjRTSlBMZy9kUW02TEw2bGgxbEdJcFA5cFBQRGxKbjRDcVFUaTVXcTVWTzVlTGhrQTJITU5WaWgyRWhCWUNaVEFYc3c4QWJUckxmenFnWDJrMjFoazF6UVhqSkJtMEZWdFEyNWZicDhTMjFZVERGcDRIb2l6cmZoVEo2QlpQdTBubG9DSVFwUTdHT2U4SGdmV1FIcC96ZUhRVmRNTjVkWEhQaEZ5bHBaSW5kNzB3TS8wU05Sd0xlSnZiUzlEdmpzMko3K3NhdWFzTzZkY3gvTmcwa085ZDdlWnVtM3ZOb0FLbk5hSVRodnVDOWxWYVV3YmlUUnB3TWlqUEtkWlZsazY5dEs0UzdJT21FUklDMTF3UDN1S0lZa0dPVnlnV3NYblZ6azkrY2QwR2pUMHJWaEppT2MxOXNzVXh1T2NBUVVIZHEyZVVBUEt0TnVjR3VQUmJrMGhRcWN3U3YyNkVFRDVraUM0YXBOODdzSndNSXNjTjUvb2lMWk13Zyt1blIxdzVnTW1yanNUNmZPQjI2MDVWNHE1Vk5DZFdwWVBRRjYzNzByczdxdmRQY1hjTi9pSGRRaXBaRGUzRnBWT3RmZTNaVDdwUllBWDAxVVZpelBuTlNsVGIwaXBmR2lXZ3o4MWRYQWk3UkJqUjVSUVJjZXQvVVA4TzZFNUJQODBkdE1EWExkUlJRblArZko3RGhxdTdLWW1SVytlV0QxVGUwZEI3anVrTEttR1psWW8yUU5rTTlGeTRwWnpZNlVNa0FRcFJhSTJ0eWFEdFduTXB1UWV4UFZMSHA4bW0rSzJQUVJwZlYxa0hzbjMyZXp6ZHRMbWwvSWc2VHJhWmNjNkMvSTZFQUQwWDFiTkFIWTkyaWcvcVB6WGh3VlBYV2FJN1EwOHAyWSt1ck9PMjhsM1NJSUhrdVdoY2R5Nk4rZkpTRnF2clpmemQ5dFFVbGh3Z3I2cS8xU2F5Yk9JZ3FPUDZ4RzI2eGNKQ3ZHdkh2d1JGclRjSFZySTFDRVN1akNzVGlGV0diNTVqSXY0dTNyZVAzSEtKa1lYVUN3cVExdElWVlp4bzkyZ1ZIZE1DSmdrQjRHRVRMUUVxbG9MRFNOY1JpaDFtTnc2dFhKRUhSOHZpNk1rL0JZWngyeVlEWCtzY09HUVgrbk1RMU1uc285T3JxUFJZSUhuYzlTZTNUNWlyMUxsK1VWVjdKZnFGVzZKeUNZMDBpRXNJdUdSUXE1T1lLczZFSytwOVlNTVJ0T2xCYklDTU1KaWd4eVVvSWhXYWJNWnJlWGhXblVTNmNRODdNSDJScjI0ODFIbndYTHBhTmdiYU9kY0tVblUzTjlZcU12U3FGL0U0SHBGZ2FETXBGbVR3SWdPUWc5dlBZcGNyTXl1bU9oR01uZDBDcnh4QVJWMU5Ea1RxWHZXcUNGS3BUelVkNVBqUi9ENTdUUTMrVStiWHBoTW1KbW9LRXVMTHhVa2JGYmZFdTBnZUpEdFl1NEowRG43dFpKREgvUnZKQmZEaERQTXdmTDBVb2R5cFIrUVJXcVlTaUkwTUFKZC8xZm9LRWM2S0lISXFuMFIvQmQ3aStuY2F5SXJRSk5sbVYzb3ZVNjVQamw0dGQ2Mk1IV0VQSURLdUlOeGxzMjRtWFl4c3hUNG9OQmJqZkVydjMxd1ZlNDlqMlFPMUhFYlFSckRTcUFHNGpMK0V0M25ndnFjcC9DWVpVbXAyNVRuQlhDMVdsYllzSmlPaEd0anJ4R1lhYnhseXRlOVVSd1pGU3M2VVFNVk5PTkROQkcrOU9aUUczQnVhbm5qamJOMG10Rk1UWGZGRUJ1ZlBJVXJvQlhKYU9VUUI3SjFCYVVVUUwwT2Z1YlM1ekN6M1pBOU5GRnByQU5pcTgwQi81dmFkWmx6WkJvQ0lZZjlkMGR0bXNrNk1qZlNxTm1JeXV2d2dqMjlEbzMvRzFtRU9GVC9ya0hRdEVieExmY3FJSWg1cFJQMVM5OGpZMnBDV0R2Ulc4Z0o5Um9aV1RuZ2NnT1JDRHdWMWpiRHhLNVFEOVBXdjJPL2hNOVZkWjBMTDZVbmZESWt5M2FhZGlsQXpNOFdmbHFGQTlyOEpnVFhnZ2lKUGlVWHBZSVlyUjdiM2t3VlBsQmJPY0FNMkI4ZVpoMzJjWm5BVXlCOGZ1ajVlbjNiV2dVZkJXSS9GZ0lUN1FCOTVvanZoNUQ2Wm5PU2FOeS9pQXQ2QkMza3R2bVZ2aXdXSWpZOVRhWXNmMGcvWThaWTFlcVk2TDFucVRRYkI1cFFHdjluNXBvMTFHZ1BiczdWM3V3UVEwWlNBUUZ5RWZxTzNWbW0ydWhDckdsbmc1NnBCMFhJcU5jVWppVHhXWG4wc0NpaE55Qlc3WDF1WGtjNVU3TDNHU1paeE5EMGNEbER6YkdBY3pxc0ZCbUtGc3FGUTJCbm9ENFVpVGVmOG9zVVR2TENtbnlFcDJLUUQwRTFOdkh1WEE2WUZWT0xkL0k5M2RpbHBQUHU2NVM4Nk1Ua3dlTC9YYmVzWG9uZ0pGblh2SlYrUXM3dFI0N1Z3dmFsZU1kaENwV2JrQmE0SzUyd1hmWDg5SEVGTmcvQm85LytlK0pMeFZOeDV5RytBeUR2K2d2NU5zTUJvSHlqSnM4VEZWU2lvVFRCWEF4MEk4NFNLV3NiTWNmWkMva3NtNU5wTGh0OEVYS1VYQlpRYmgxUXgwTlpxVW1wcVdRTEZCNlZFcnlXQWpGYzJxOGtNRXBJaFJ0enVnUXljb3o1ei9HRHFzWFZCb3dTMXJubnJaOTlpZUI4SDdydFp2RWlTYnJEMGhoUVRaVGZ3UnBnYmVUbjZzdldBdytTSVdmdTJGSGo2L2tVcll4L0NraGNMS0VFUE1sWWZOTks3cTBSWGRNdW9tNWNFNEg3MW9Ka0pXOVhLcERTUVdOaDNmRUdnS3Rudm90eGJJc3NaeWZjVHEwVmszS1UwUjFCTXJJek1qaEs5Q2ZIY3pxWXllZE5XeHp4TjQ0U1ZGSlVUWFBPMDZhQ0UzRTJSNjVEYWowRi9qN2ZXeGZpR2NGQjZ3TWlBZFRkVklDZzZwRTBRUE5Wa2VKZlpKY2Z1QmRmSEhqNkhSblRnVWQvN2ZvVkNLTkUxYllETE1vdGJ5OWVZSkEreTFZZnExUk01WWQ3V3JwZ3IrZlB6RHJ6cC90L0lMSGNReXZ5ZE1vR3ViYllrSzdhQmFBOVdzOG1Qbzl3ckE1bWNPck1IbXZUaGowQWZFWUJZR1ZmSUFHaUswZ1hxaU90bVFKSElXRHdGMGZhN2R4aXFzRzdxbmJOc2NLMGl4UytUN2h4UVZFUWlsNXlnWlR3VmZTeEtpYVFqTmx2VGtYWUV4bEN3UVRCeFVSanMzN3NWVENlcTJIUkU0b1FLNlZtM1JPbWowWlBFTytLcmNzY2VFRzkyZlBPVE5sdG5rby95eGdHWVdIUTVjS2hEWXZ5VjJPamJFckdReWZ1dm1VdFZOTDZxQVZ2cHYyaFhYOXNTb0FWOEpmYWtYQ0xEblk5QTZUb2pPZVRZUHJYaXRRSEVmdTlpNkJUM3ZXOG1hdHFNR0p4eFpOa0RteVh1bHhrRVliMkJ0eE1BOVZiSlRQbER0UTR3aGtFNmpuaDFhL1Vhbk8xVjVZUFVBbk4yTjZ2WTFkR0gya1JQZFo3akUxS01oaG1Bb0tzemluajJPd1NLejdkcERTMk5KVmwxNzd0Y01IVGJ5Z0IvZ3V6Ym5GYzlJZzk0YXRkV0pXZGNpcGtXTjgxaldBV3dLVlFodVJmQ091U0dZSFZhdVl4UHQ2eGd2VjNGN0VtSzJkOGRHa3gyWS9uK3VSQzEraHU0cVBBazcreDVTbzJZN0dPVUk3ejZVMHBSbmNrOCtxOU9OYitxdUdjWGFjUk96V0swUzZPMG9HS2lpNnRqMFZyUUxqdjBpaHhrWEswNFMzYnVxQ0dCdmQ0L0xpTllSQkRlWmdKM2sxTkhBWkFLMkF4a3gvNXNiQmVOYWt1TnNKVkV2eGJIdGwwc2s2RUlCN2tDRitIZUZnZXhxNE9ybDdsQXFYb1JLWVVTM3IydkJoeE9maFl5R0w1dVcrU3A4L2d3ek4zQnRwOStpQ1VydE1qckdKWXJ4czB0bUU2ZnFkbnp2bkxoVmJManZMYW52SDRIM3NobS80dk8wQjBUa1R5UHZTQ2VHY0M3QWlmM2hHVXJwaFFKSzRvVFp3R2wxQkp6UGNsWHN5ZDFLNzlCYmNkZFFIMFJpS3R3cys4N1k2YStsSUZRdUJFWDBKdWRNejYwMVptV3NqMHM1YW9wd3RBU1dpQXZNdkYyWW5iUHVadWhWU04za281TVNMbEJKUlpRbmsvaVArYXl3b2I0NHRzT3hKVXBJbU9oZDhrRUQ0bWZVMDVIRjFrL3UxekU1YXkyZ0llRGh4WXpHUVlxTVJuTWNpb3BBTFFTN0lxUTdxUllEbWxJRWtBMDRJVUs3bnNDdFRGa1NBQ2o4akJaVnNkQjEveGNzb0RsQlFMcWtNdzkrL3V0Ukdsa3NISjdoYXhGWkp5UTJBbHJKNWtmajBaQkpTbTd1OUt1WGp1ajdJN3lpbDVHRXVUcmNSRlZvQ2dBWDQ5SzdXdFhvWFZmOHpWeWtCejluSTRDL0hoVXhCQ3JqbGNKZFhNckJlWTAybUtxalNMcFFudTJtR3IvMkZHbGlYNTNRWHQrYUh2YUNuRXZGR0FmT0ZQY2tRc0ZBOGNsSkdRdjF6OWk3aHBLZ3EwWEhteFcyOTBSUHM5bVhpZXgxeHpXL1BnYXd6S0NuWmY3dC8vQnBxUmxjZGZiSCtNK0p6bUtLL3RuUUJaWDRDM0cvOGJtMmdxR3krMEYyc05GWDBRWnhDamVoVUNXd3VCeHZqYjlCVEx5V3dBcjR4MWNHTjRFaDNMNDdKUXI1RG10QWVZNlVjRDBvcUFRb0djOWFybTNkZTMySlNWSkR0UjJ0bUVxNFpCUk51dktzanN5T2c5bmNWTmFNZnJLblZUVUJkWWFHb0tKVGhkNVJhV1haY1RxL1RFa1pOYVppRVVuYVRtVHF2c2JsOEhWNFlOL1M0ajA4SE1nRVcxUkZ4bVFwOWRrY1dvYlVjS2VrZ25iNFF0VGt3YnVVdUlqYjZMQlhaWk9DU2RZM1kvcFRKNjBlOTF5aVRCaTNnZFhsVGErZ1F0NFE4cFA3bmVyWG5WdTRlR0l5aXVRSy9yRkd0Uk5oZlkwM0tkVWs1MTZHM21pQWRxRkFjYjZNSGxzaTNZaGtyRVN3bzhJb3dSQ1prVHRJTnZRTDh6dkJpRDZYOW9LSEVXZk9LV3JWUUx6eUVWRnpyZVJrSXU5RUVwcE5nOG5LWm9MVUl1cXBtZFRyQnhBQ3BMTGhtaGIyelNEVVFJQTdWeHRIK3U0eHA2ZTdINlFsNm5EZ1ZhbFJBMThaZ3hlbXpQa2d4a2l3V2hDd0ZNTlljdStIenZ4SGx4M3pPZHh6WWprbkUvemxsaGpIVWZGTTVsclFWUVhBTHd2dkZHbjVlWVY2Ulp3SUpFMGhVTU8wRDJYZStTeTJ5Z1pCRVI1TTZ3bG05M3VwYTRFUW4yWHFoUGNYRko4M1FlbkxOSU1SR3lPdUpjWHJncEdLR0tnVFJvUy91S2pOa2dhb2lFanJoSUNheDljbDNGdERzOGxnaW93ZWdwb3FLWjBteGhWN2lFdU82Q01weXF6cmY4ZXQrQ2V5aU55VHQ3SHhmQlNFbzJ6ZVRPSFNUeUVYYi9EQUNWSCt5ZXo5bUlaQlZ3TmZKNkxhNXprYUJwb1dTYnlOQVNLdXZhRGVrVlNLT0RISEVGcGVmenppT09ZOUNPZHg2djNZajBaeTN3anl1ZFRycys4T3ZvdDJoR1ViZy9FeFZIYWxKL2JRNzVRYjhjdUw0ZlJRTFZFMmpBZ3RXZVB6Y1llengraUNDK0ZQbEFLQnVobURHei9KbCtpd0pTUXRVYU1TR3hYZUZERVFsN2F0T2dqdkhyZ3hSOFMrL1ZtQlBmMlFjbWRQOWljYndHRFpKWHBXMFhwc2hPS0didWhUQm1YUlE3azBLYkFCR0t2dDVpMTBCaWxOVVJTNEpFeUlXOS9teFFXTk5jMHFnRnBiYWNaZmR5RXgwNURnU2Nhb3BRN1FCdEE0aU9IWjIwQVY0K1NwckRNQzUrcVlJSlRhRXoxYThUNW1FUm1tZ1F1NUp1dS9RdDRSK2o2aXN5VVV5Z3l1U0pHZDRhUlcyNGFRRFc1amNMU29uZmRPckpRbkZHRFFNNFRtNTFIYjR2WldCL0dRSzBXUzgraHNacFRDSENzSW9EdHRBbU9YOGZDb2RnLzlrSnZYczFVMjJWRVVqTUtLWFhGb3Z1ejNycFJjaUc5dWpvOXJySVF2TVV0QXJBN3d5bVV2WFltSjVUaW84cytkbTArSGRoTXNKdmJwUlJKQURkUklOUENJWjRzQUpBV0NmKzQvSWpDV2tQM0NJK0wwSlpJYmxrOVlOMFMxUXB5V0x1VXVCT1pxcHFOVkJPdGIxdnBEems5cnd0NTVSWUkyeXpjVVovNVJuazVGL0lxRlhmN1A5TWtaVDNkN0s1TWZGdEhTY0ZoQjJNV0tMV28xSU1iazBMRVhoUkJ6WVd0Q0Jxb213Y3RCeDRpdHgrMnFxTVBocTZYclVIWHNZbWo4aUdCeFo0Ni9JSDZPVTF5elFVQm5WVUp0bUVnNDVadVhka0RoSlV0M2ZaeUJiMmNFYXE0K0hFVkRnd1BLZFFFTUR5VXRGSFhBTkExMWI4aUNVbDBpN0dENUhrdklHRDRkc0JTcTAvOXNLNEVhWDArOW9pS0xDNDhHSy83VzY3UEE5QUh1RFZKL2xqa0VSYjVUTU1Yd0h2aGZlR2RlU1hOMzhDMVRkdUY2NUxxVC9aZnJ2Q3RDSW45Tis0MWZ0bjlNeWd0c1REQ283aE5RYmwxR3pwNTJoaEFHY0ZKTllHOHU3SzBOVm1XZzZMcjI3VkR6MDJHQXVWMnV4YXVwRXNHWlB5U1lycnZ5OGxOeTBTbVpEekQ4b3BPcE1jc2tvMmRNRmNNdlZWRzY0aHJRdUFlWXpONHBkTzBtdVRRbDlHOE9GdkNiSFJpMUNDN3FpandVOTFSbjEwVWNEZ24vdzFaM21TTE5CNUVLdENtK0FIeENldUI1azgrRHZxME8vZW53RmdGVzdrUC9leDRoNGpNMml0MmNTMHNJNjQrRlN1dklvQmErVW9mUWZRU0RGa2JPTHRvR3JpUXNOaDgzdCs3Q3Fzd0xZRnZCWDFuQWJmQVpDbEZXVjJLUU1HaXlZcjRsanJVZG1jM2lub0d6UHVpY2pucEpicE5JS3pnKzEreWRhUW1FWmEzSW5na0VVWEExV3IrN3JMcDlOb2dqSlFFRTdISmV5OWxDME84WUVDZkJXYnoxNm9sN0hxblpUWlFhMExqUGZsRjRpQjFseWpnREVzc3RjSWk3VXlLa2cvdXZ1d1haTnpSckwvN1V3YzZiaGRwNnBOQXJ6QzQ3U2QvazJrSDN0djhwYTVmV04rdW5wSkp1VjlkSWU1K3hZN3hLazhSZ0IwWnNVZDNXOEFRcnNqcTlyOU5nWHRtWmY0bXJjUzBtWFZpZ0JRSHNoYzZnalpVTlA3bHV3bTk3Wkp1UlRERW1veXVXcndQSHBWcXRJOE5hcWVzWHNBc3NHMk9HOHJVWXA5cWtmcmd4eE1CV2hGUGdNc09BaXNWcEJZT2xGczFXTHVIcTFjWlFMVy9TV2hmMEg5YTFBQzZpY1NvVlp4a0FRM2o3VXlnWEMzSmNGQ0R1THJKRUJiVEZOZmpNaFFmLzlWYklvY1EyRmdpQlFTeGU5ZU8vRE8yK2U0N2NjWitlbDBJeU9XL2NxLzRYc0I3eFhYdE1EaHFQaG5iQWk1ZG44NGZzZjlML200d0NBSkt6Q0VSMndnN3NWYnNMYms5a2E3dW9ncWUxc2xJaDlhaEs5QXRNbFpyT08wa2lUWS94WGRpRWJ1MHVja2tBM1RzQU1IekQyM0U3b3lHVDdlMDArWjZoYnN4WXh2SDFiZzlTaUVOSDNUOWtLYzdHYkFGc29jRFpod3o3Q3BrUVRPQ0tJTjV5TFladUdRckE5a3BRZjJwWmk4MEVTNzdTUGk3ZXgwQkZaYlNSODFVcGxhdWVLZVJNTVkzVys2S2tZKzNZZG1VS0NoNmZ6cmFMSUJvdjhwc1VqMk4yTnJFbTNiSEZYRlZSSm51NElxNEZoMmdSWlNSMFlzQUdhVjBaTlQxOXJYbGltUXR5UnJKYTFwUFVmc2lLakVXYjI3MVBvQ0kyZzVjNVNCMnZIOGxpbTMveHFvc0VieS9LdUdtRU1TdWVPZEhGd1hkRE95VWlGZ29rOE55UEh3ckRTSWkxZ29XeEtheGdPN1BiazgxeUtvQUd4OVJDZFJLUkxFTVZEYjdZb1AxcnhBUWRoR2RrU1d5MzV3VWRIOGFTTEZGZEZqdDRNRG5UTWx5T1MzT0t0Z1FHQTUzWVdzenluMUUwd0gwbUxCMktPK0VpL2NWT01TdTFTTVhMOEYrR29mYVRzOHI0MHFxUUJVSVZMR1ZXeG5KdFY5d0Y5Y3lTbGhSQmxVSTdpVm9VaUp6UllyWEN1SWFjWXliRGV3bFlEYjA5ckhvOGVyNXNVU0lSWVQ1SjVscWovNGkxUGFHbWRXNElCeXdOZzJzU2xDd0xvTzY0RnFGWmxpVERjTnFCdFQrYXFUbXdCcmZEVVlVRFVkUEZUWVprMjZzcHc1dzdJeGRTWU03RExYUlh5eXpHUWpIU2tUVThHMWtoMlpwRHhZeDJpd3JsSWRUWk5EMUZMcS9YUE9KR2ZaOEdBQkh5cnR0SUZ3TDlNdWFrdGE0UkFMdmpQZm0rZ0g3S3lHUSsyZkdsUVhvMG9YQ2ZtNnNVNkhZYUU3UVNVWWJBQ3U0TkJOQWNXRlJvemlQMnFscFJ1eXlPTHA3SFdjVmE5OHZINjZMMUt3VENFNUFnWHF6ZmRqamZoNDJxd2N2M2R6RU1Md29hcGF4ZXFPQVdHekRhdG13RmttVFFrbnRRbGVQdm11RTFsUXR6QzhocVVtU2VHNGVMeTR2aG9JdW80R05NNHNSakNVMUV2YTh6RTVjaWNNMXdUVDhTUU4rWXgzNEZyZ1BBc2c4YldYUHRhcE5zOFNkSUdDdFlzdmlqWGd2WEJkVm9NUzF0MVZGbllGMVJmM01Db29tWVpRdmlJclExbndRN1F3bFU4K3lTNlBwSVVnYkpTNktGV215d2RsQ09hUWR5bFN6QW5UdlIxK1FUUm8zTjRBU0hEVlJWRlNJZmhSSEZERUlMeS9qNGZlTG1Ea2t1S2poRUZEUkxad05zNloxVzdxMWVqcjcxaEpnVTM1RUxXNVl3MkZWQkpFZ2VhQ0dJR2l6aEtVMHBpK3gwQ1h0QjJtMEZJUFpoNVJZSlVZL0xSb1lCQkFHZXBqSEE1NW5Ya3RRaUNMeHVIbWdTZE0xdVhlMGxwOXJSMENVVWZzR0V0c1lLS0s3SW5KRktVSlM5TkhRbDFLRVdwOUZNaFloalVNa3FOK1R5eHRZbTUrQUpLU0o1TkFIQW5oeFlXQW5XSnBDcHV0L203WHFidVhhUHJGdWhGQk0waExmdGU4R29XNHRkTVZpbnB2b1Zka2FDVFplaWJhUnExbXhvTXlmSVBMVmxxYUtSY2E5UnpEVkpBY2FhU2w1UWFxRDlVMGQzOVFDNHlTd2duVGRSTlcycjVKQjE3QmJncVR4TzJSdHZBM0RydTlsY2IrTmZxcnd2TlYwb0Ird3dtT1gvYzdhNUg0aHJpVFhCOTRSR1hGMThIUElFNW9rREhtbXRpc3YyWm1XQmxIUVQ2RTJLUmFjcis5UlBvWURsYXhIYzlOTUZqeENvOHZDSXd0a1lsQ2lBVU5iY2VVaUMra2g0cldKVmwxeU1IWllNcWp0ek43NFdWMTgzMTQwa3RCVmx6RmpoRnF0M09TME1LcFpaYkdJUVhUdkY2bGlHWnM0R1g5Sm5tNS9qNU5CZnhWeDFrMUNreTAzTHE1NWFJNXNSQ1hjY3d5YUJiTkt3TDZTeDNnUVZ6ZDg3K3ZEVmVyd2JoMkp5byt4VXNETWdJMStMZlFtdFg4NWdxTDlQeGxiOWVmT3J5MEVvdDArcFJxVithdEZnK3FVZEpzbUNRMTV0V1g3aTZ3MGtFWHUrVjQ5aThIU2FCalFHQWlLZnBTSlhaU1FoR3Bqb1NadEM0MEFsNVUxZFVvcHpWNWxJT0xWMHNScG8wc1dxVzlhVWdrQVBWRmlxT1Q2VHB4UnZSRGhsSllmUkhDeXNhSzlwdUNtQ21BMHA5TTRoRldqa0FxTmdVaWsySWRZVW5Odll4c041Q1kzVGpJZG1VYkw5bFEwc0dRRUM4VVdMM05pL1JIMy9lWkVmUDZwMFcvMEk5N1JJUStsODRTaFA1QUwxMEpHTzBhMzU0ZHgwVWh5YStvNU5BQUt4OFQwenVnaVlvWGtSalV2eVZzMjlPMkNacFdMQ0pRNUcwWUR3Wm5NWXFYTm5BdzBsYTQxZnFKakdUR3NrdXlOdE4xY21wNHN4YktqNzdmT0l3SmpYWUtqS0dpVG9pZGlOd1R5UnJDYVg5UkpFbXBaSk9ONGtIWnNxTEZzZEJHaXdOU0FveVdHVVVRVFZSTk4wOVM4UzVTTFZEQkFyNXlrZ1pqdW5WcE9TRnNFRUk1dEJVNXdkNjlSM2JtUnhCWXRQT0g1dlQyZW00VXJBRzVidDFzRkNnanh2UkZNdXY1ZVIwS2J2T1V0TGJ5NlBWQlBpeEFvcWNWSUd0WXJVRXMyaEt4VXFFZnV0Y1RDeVlxcUVLcE1xOWo1NXFCRkdEMXh6WWdMUWxtR3dXRHpqY2dtSVBGY0VoaWg1T21ieDdidkZlanVSTlRTaENGY01EYWtpMnlhRnVjNEVLdkJqcy9DT0hRbWYvckNzdGNGL1lUaUVRUGdUZzhpTEFycXVzZFZSeU1EM3BBekppZEpyTHpCT2tVR04xL240UlVWeXFlZU16K2JXZUFkS0tmbndydDBvYmdpOXNHM214TEs2cTJWM2JnWW5XRG9KeStuOXNKelFrVVNneDU2SU1UajFjSVY2VzNleVJaSEo5cGkxb3hTdDlHOGNEcWRLWXRCdXU4dlRIM2FSYlZ0U21hOFZhblZMaWFiUWlaZXhLUXgrS1lPdDRuWi9jSExRNHl4eEU3M1R2aG1lYjBrSjY2K2YvSytjTnhkSmtwWlEzTmh0Z1VTaitPUmxWTlB0U3hBaTN6UVN2MEo3RDNYL1k4MEtFMjc4WkFHdzRKdGdoRWVEdHpmZ2Uxa3BKL3RFbVY5bTdDeG8zMm9BcldCYTN0OG8xWURkaWc3OVhzMHhNdTN3d1hnbE5WQ3hJZmgwM3JaTGlNd2pIUVA2RjZWRjg1Y0M2bzdObVRnWUdtcWxyNkoycUoxTW41amVyb1VnNlFLM3JDRC8yak83MHg3UUs0cHp1blBpRE1pbk9wWUFCQjBXNG1yT3hkdG1vZVhmc3FMWlkxVEo0UElpdG5XUnF0ZFpOZGNLQWtPZzlQTXZrNkhPQ2VYYlRFYUNQVytPM1NqRlRHeFpuT2wraXZnWjRNNGpURGMvM01ad0FaNThKYkZWMlFITzNCM1M4Q2pHK2pqNTZPZzdTdTFKNHp4VXlDWUw2amtZTytKTVVVb1JldUM5VVlwb1IvU2taYUVKZmt5RndTS3VVWVlidzRBVFRQMFhWWXVoVVUwNGdhREpDTU9QUytRV2ZoRHA3RmxZTFpONGlWZ04rc2pxemVWeEtyZS85QzE1UW1ZMzNETzNqSzdrWm9JMm9nQzNUWGlrSFRoZE5MWW5vU3ZxUkl1UlZCWUt0V3VoZWVtZ1NZUnE1OGxoOEJKRVFFZWJGODZqeWlqTlNLVEJVRktPRWdDbm41SWcrVFIvdThWVjFBT0lPcThrNzBDZ05yc2NnRjE4ay9GdWxIdFNkUCtiUVVBVGhKR0d6Q0M2V2I1a0pHSmJQcUoxWTlLaHRqcUwwemk0NzRDQ29KZXlZQmVrQkpKSEZrRy93MkNXa3hPNlJFUjhVS1FUQWV6Sjh1dmtwcldoNGhBVXdKSlJaZ1pFVUZzczdkMmRTRlJBR24wMHdQZFhSUHpCZFRFcXVnUUtTVTUyY3M3bDBDUGt5YlJyMWtUWDJTcnZHUnp6ZnA1MDBzRFVPNWdMSEgwaHUzazdnUHUrZkJJRllnTUVtQlkveFY0YjhSWEdETlBQRS80Q3NCV2ltZ1pHK0oxTTh3cTJEcVNhL3dnd3dwcm9wYk10R2l3UkJoQk1palIwVUtUNUZGejdNVFFGMFFSbzBxZGtTSklrV0VEcjJDRWxzNU5KSWpHUytNbStRM0VtdktCaks0aDQvNVR3MlFnSk1vcXV4YXRteEN0VTlVeEVwVWpXVUZCaTAwU25abFVBQ1FBV1VVYXRiUkVVdDhidnZPQ0JOVWdkcGxRTkZrNFZoYitHSWxaVWROYmdUMndMb0xlYlY5ZkRCYkU3NGFCYU1OeHczdnZPdUROUXp0N3cxbERuNEVQZTZIWEE0RUsvYTdWU0pVdmZGZG9ROElVL1JZUmJOaTIwU3VpRTVDVmpCNVpZVnB3ck1GZEhHNmZETEpKSUtTZUZ1UEhkcEp5OXBtRlNGTXA0dUFObStaZXBBVjlnNWl2TmpjV1dRR1hyL1VCc1ZoWGpGeHE1VS9ZOWFxc0VVWEpTNVJxK0FsYi8zNDVGU2lkVU9rUTF5aVFoTVVqL0k2TlZOMjJ1V3MyM3Bla2NJMVBqN1J1alBzZHg3a0U0UTVjTTN0Z1AwMEprZm54TzdaWWxoSHZ3RHQyTEVPOGVjYnRXMHRkUVVYSU43N2tSSDlFQzQxdCtDNnVYaTBDSFkxNDBKY3MxMmU1aG9wbXlpc0tybUZWUDZYNk84SFVHSEZKT0VoOFJVNFJTZjBocXRJaUdKSEs0Z0xaNGtSbEE1czBScndJODhiZ2k0L0tuRWdTa1JGUDQzYXpaeG9lNkFlUXFBaFZ2NXJ0VzIrRlhQYXJtNHMyY2d5MkxZbmtBQkNWN05aU3h6QTVBa3BMV0FNYTdiQzJFb214UVdVeW9lbExiU2dHQjBqNHlBdWsvUkZOVGw0dEJjanhkc1dwNnNUY0NtT3BXcHFRZmk3Z3UvdDhRSDkveEpWNFM4bmh2cXQ5WDU1KzN3RlRDN1Jhd09MaVJLczlDQ3l1QU5BZnVtL0xhSWJtZWs5bHpqdDA5VFF4T0JjeFRvOUZUMzlLOWVRRVo0a0xqaXdya0E2OXFJY1lIQnN6Qm1VSDBuQW83WWRacGJFWWE0T1FrMTI0S0FwRitjM2FSU1NXcUluVDJuVXJTc1NoTURMOXQ0aitLSm9QanJCSXhnSXhXSmhZaHVRRjdORXFwbk1BbDR6RGZOT2tsaERjZXphWW9IR2pvV3VOL3hQOTNqL3g5Tk51MXBrT1c2ZGZ1T0J1L3FLRTJ2MFlsQU43MFZmbjNlNjk4QVM5VkNDTVBURkdCa21YNkdiNWtnK3U3Y2d3Q0xyL28xdzN5UXR5V2FVTVo1QTlpR0Uwc0ovbU5PazBsNmlTUTRnQnFYbENWcUNIa1lOb29wanpxbStWMDlEMWdCL3BPZnM1V3hLQnlETTd4WTloVVhLamhVUmpGWVphallXRXhCUWNxTWFJL0VTdlhaRng4bjFCYXJkYjQ0THpNQWdjMFZGSkNHOGtvYm1uY0VudGlXNUFEWkV6ZmwvM2JTZVBxR1lpdmkwSGdCci94dmZiMVAyTEJtNEZlTlkrZDZKL0oxc2QxS21GQXI0S0lESjNXTVJROFhOTmVvaEF2VFhEaE1CQ0Iva29LQ2dqTlVBYTNOVkRZOThNQ2xKRUpNcFBVa05vZmhLZ3hJS0RhYS92bG9qWjZGd210bzBUOTlRMnBkR1VDWnJVeFZrRkh5RXdBdHhBQTAwd1NTNktZVGU5N2VzVW94ZUowMVoyUVNUUTUvelpjb0hBWktOSzdSR25WNlVOOFJqbE5HdGhDVkJLVXFQWFltMHN6aVZLZytXTjdoYjVuejVGT1ZoSkkvajR2bjhPUnhBbkVZdnV6b3ZNUHZtM2FBR2I2cCtGZmd5VlJ1aUhmRDU4dXZnK21MRVVVQjRBNlRuVnVqQXpnUDFNRGROdS9iWjdDRzd0ajJHL1k5Q0dhQUNtNjc5b2NtVlJWRTFBUlVaSmdtc2Z6QWFRWmo5Q2xOQ015dldDbnJjQTQ5czRyL0V5QkVwOEtYWlN3WFpzZk9XbHBoN0J0UVgzY2pidjVDT2pMUW1MU3BsTklWMm1Fd3hZdUVBclBQWlBlUDVpQ0UwNHFxN3BnaGcybVNBYVlBWDF0YnlXSm9mZS9xRzdaUVRMZ3puZy80bEhhTzRhdTdUUXUreFVaM284M2ZuVGp4WkRnT2owbElKRWlQTWl1UG5MOXdCSVUrSzBGdVhXWG1GS0FIQkgyR1oydEJHVHJMRE92dHgzeXQ0ZGlBUWxCamtOZVR4b01DeUdESkFoT2wrbm5MRHB0RW1yV1UzYkd5bFVoUlVZN1l4cUtlRWNWdC83ZDVMQWRyV2tCRGJEaEVQelVzRlkyRFB1YnRRM2lNSFlmdU15dk4wbVIwalQ3ZHZ0TWczVVl0YTY3TUtNQmxSYWp3aEhMR3J1bWNFWUdXUlZNK1lGc21TV3lZSHdheUEyNHNsUzAvWjhOYkpybmV2eVRlNzYwMzVmSHZ4V0J1NHlvSnRwT3k0RStqd2ZGZGttZFNHNi9FSEtLWERYOGkzbGhtU0NDd2RCeXZHbllUV0hhYzE5MW5jVmJUWnhCRTNuSU1rNkp4TnpWZlhtbFNKSU9YWENNY3EwRmNyRkxwdGloVjFqbFE3OFRqQmg2VVJxWXlIMGVZcEdQNm5KYUVmTkdKVE1Bck9aaEJmQ01RN0V1YTlBUFJRNWlzaElmbVQycTJkTFk5bFlOYkxSMERkVFg3Q3pUUFpObVFHYjk4YVVBRkdKTTNaOFd6bDhhcWtyNW42WGZyMlhHY2NXQWRvWFhOdTY1Qkk5UUwvTTZ0M2dXV1lKaElHYkpxL0lRRnNGZklib0lES21DL04xT20zZ1ppRm9PVjFzWGpRZzNNc2VLUHFMQUhVUGdXRVpsTlZDTnhMUWlSa2dhVzB3SUhVaFlSOWgzVFlRa3l5TW9ObWpJV0ZvcHBlSlNXSnF2RVlSdjlOT3JSdDBYTFRvdFFtSkEyeFlGNmcxTXZhTHFlZWo2TnZWREtGOFY4S05rYzBPbUlKSTNxTUtIWTB5bFo4WWlZOVBDdHliNjVlanMwS2RhNUZMYnppZDZFOS9BUXloa3ZiaXlZdkM0VHI4L2VMOTlIalNBbWZzdnJFZk9VRGwyeUl4R05jc2VnNXNkV2paZlk3MFlMSE45QTFBT21KSXZIdzVoVEJ1ak1ZMGRSNldyQUtsdExRNEVCT05pTGxUYkRXVEpCa1hkVFVmNzV5TnVNQUlkcEFNa2ZNMGxFMGxGS04xY0JsSkdObU1qQ08zeVN4eCtxWUN5WVl1Q0FxVkV3UG51RGg1S0JkVjArWktvaUNFUmJ0WXI0eVg2WE5OYnc4b0RjS29JMUZSUFdFMDRQeGVBVDljL09xUUh1N2gwb25uZGQ1YlZMeERQU0xja2NpbGtBY3pBSlFBZ0l3RW81UGQ4NllXeXNGaytvM0ZmU0hUR1RwUmEvS2ZHc1FtS1NjSnVqVUZKbEtZOC80ZWROSnF1MEZ6VW9JWGJxelRXYVNtY1VQS3FjV3gyT3k4OTRZU3BBZ2pnMmJHeGJrVkNHMm9KdXFVMnVBKzAzbSt4bmdYd0J3OUlEYXFLdTZsdFBvM09IazlOR3lQeGxCRHAvSnRKbjBZUkE4TDlISkNRYURvZjhJdTlsa21pbTdJRWVud2pyWjNxY01jYWsvL2JkL09SVFl2T2JCZkZDZXV2ODFvZ0taQ0liaklBTElOQXVKZjAzZ2d5ODlJK1lBVHdKQVZ0cW1OUC9jSUxoS0Q4UnViREY3S2w5Sk1pL1BxUHhsNktWRFdmUFJlWVFSc1Y4REJUd2s1ZmRVOVNoNngxNG4xaG5VbFlSLzNMbVNqQ1ZZaEE4YmdXdjlTWWZQOW9udElKK1hOZkMzRE9HNW9CaCtCMWhYVnZLaDlkcncvTHdxc3ZPaHVOekh5aVJIRGZxTEZjcHUrSWdLQ3dJemRMTndYSjE3NTN2cDk1cnZQdEpyKy91MmZrVDZUVklmTTJGWG9HelVpd3IwRElnekVNRVUvZlRFWUhSUkV0cDBjNFJaWHdaV3Z0aHlNTWJpRjFJdStoZlRzUWVKSTFaQ0o5OWNrMXpUWVB0b3FSbWY0b0w5M2VNYmViQTVCTTVYTHVDYTlxOEc3MkdoV1U2UHNiN0ZLcFJHQXhTY1AzbDNBSGF2WHpVSWJSdEdhVWtjOWtaYU45eVBDd2tzYmZheXlSOU00dlVEUGtlbXhFM216SzJJREtybUpZVXFWN2pTam5qaWxUVHdEQThYeTAyWmZud1FJOUhjZjRId3U3bDQ1OVo4MTNFR2Jmek1ndE1MOWJac0xjdkhuTW1jL2xRc1MwcDV2c245bWhEYkxiMHhtQzRlR1hVdURnQlFoSTVWeWc1TDkrSDZHdmdrdjBDSWpkRmRMdkdPZm50a0FiU1J3aHJYMzE5QWlIQ05HRzV5MnhPa2JENUloQkhSakY1WWdhcyt4MlBPQWVGajVZWXNZc0FRU1RHR1hPMGRhU25RVjNTNDlsUUlHUTNKWXdPbXU5VGhSd2g1MkZrMVFldHNIeVlqckQranYvNWRyOS9VdnVXcGtRaUhOSGR2ekpwTytJaStadjdhMlZiNU8xQTZ2OHZhc1V1ajFxckdMaTdVWExRUXErbVQvRmNCTTBhRWxNTlI5d096ZzZmRkVuWUJ5czNvZHhNM3lnRVVHQktwRDk1UzZHYmZCN1drQWN0SUFhUHRxL2dSeFluRXZuZXE0bEFpcUtKSUE0cXFUdHpiL0ZaVm1PRFIxSGRhZEFqZTRDa2h3QzhrZHZHM3JEOGI5MFlZKytsaklxaklkbEUwUWVMRVIweWp5RTd1Z1VEbnRLQW9IUG15b0oxVWtPazFUR3VBNWxYaEpGOW96SlpJUVQwYkZMTHpySFhVNWxyVGsvczlUQlhxN0diQ1Fpb0NRODZmSUlLUU83UmRmdCs3ZXUrQ1J5enlocE5Ha3RzUHIxcEZBbHlpMjRldFdieDBlWWFMQXpRTmp0RzBUTy9wN0JEM3ppQmlOMEUzWm5hSW9ZcjE1VmtUd1BsaFJ0U0dPa2djMXR1SkExczBzQVZOK1NCeUZlMmt2MFNpTVVKQlpWMUNOMHpBRmc5dW83ekU3ZHd2c1RIWWVSUFdEZXdhc1hGUktQMFNqeWE2OVE1dWQxL2lnazdDYkpIVXh0VUM4VGxseDBvQW5UbVlQclFTN0ozUmh2NW5pelhDR3Q4Q2QwNDhwWlNaYnE1RVJuREJpRVAvTzFvZ0VZdEZEVVVMdWNBYlp2bWJ5UmdHNnFJSkxmdEpxMnZCRkp3YnE5V3lPL3NMYzhPaUxFMUNmTWRHWlBnM1JqNHBmaWdhTzJSS25OL3BwVHJ5NHdtVjhtc1ZRSUxqM2swL0c5RGQ2aXFKVWdqK052dHVBVjBHRUpubDJzRXdRL1ZXQ2s2QVZKdm1nSjhPcDRLeWtTV3ZnRWh5dUNnNWxrMjd5aTdUa2xmYWdOMTJSSjlTd2FNUTBOQ1Y3ZDFsMGQxNThTWFdoSCttcS9CWFpFa0JyWHNCN2NSVXNKbm5BakdEMFNobU40Mmd5Mk03UVJaTkErRmJVTkl6cmJ5Vkhmc3dVUUlGQS9RUy9neThuTkl5YkVBam1jbGdiU1J3M1ViRkdnZzNIbCtCejhpQmN4Q2c3bWtoTmN0ckFySXZhMGJqUGE3SjlnamdKdmFDOWNhT0U1bnZSQm1zVkpha1ZiS3p3RW4xQ1JQUDV5Vm5sek5WcXJzbUtjeFRFQ0VJRnNoczJDc0M4WUpta29oczE4TXZ3cmRsVkxLUFBtc0ljQVdDL25PdkNsWGx4STI4N01TZW16ZGxQME1NQ2djalJkYVJQdTRDbXE3UnVMaUZlTE44dUZPNkdFZmNQb0hHL0lEL1BEdmN2aVNHZ3AxUWRqc2x3dC9ObmhRd0Zxc2FobnppdjB1RFhrOTVuYlRQZ2VEWDhuYk9jTnhyUXRaVHNWbnQ2OGJqSnpFLzRVVjNjdnl0UXRIUXhsaG9OQzBLYy9GNm90VlpadTVYWEtDVG1GeDg1K28xcUxjU2ZUeHpjb2RxN2tDWllrbFlQajBpYWlaWVZpZTRjRHNwWnlBdDR2M2hxVmJ2MjYzMTFqUEJKMTNrb0VDemUwODNmNkhPdnBNSDNvaTlrK0ZMRFNjWUZiZUpwazZCS0FLSUNRbVVEVkVSbmwxOW1jZEFZb0tUZFBjKzl6c1V4M2RtRjU5UnFyamdkekVJOW1IcllVQkxFUWFhclFROU16MC9UbStreCs1cDcyQXFhKzV2ckJqcTlwMXRzWExBZ1pHdlk0dG1GQ1oycmczNVBCMFNLeGNXcmtDQTB0d2t1bkVSd2RjeFBRVzJDNDgrRm1XZTJWUVp4RG5vemNXRkVLeW8zMm1nNGs0WDNXUHRlZmpFUlpkWDBOVldqekl5MVVYdFIyN0Z6bTkvVDZuMzdoZWdoR2NVZzFKcTRFTzc3emxEOU84RjJYeGFDTFFJQ2xCdFNiTVQrRmYrekY3bkswa1VBRlJESzFTNjZnOWp6SkF2b2lRQTlBMmdXQW02bjFCU2ZURnFQSkNqU2RsMkE4UVZPUDFMVVZPWXlPdEY5c3hOcUZJUXdrd1pxaGlEa25MZVNaQkFFZzMyclNaWkZHS28yUk9mcFlsVVRNSThRQlFPQk5PSnFwZEMvQzFyZVBvT3E3WFNUc2lTT1hhNWJseG94RWdqWndhRTJZdWo1Z3hZSGRqRUwySytudHRDRzBvS0k1bXhEVnF0VWM0azNrZGVhZTk1aGNvQytRZTFydVJUYzc0cVF1WGNBMDM4MnBsa21iS0dnV1RzQ0ZpUzMweU9wcjlNS3FqUzFEWUJydlVJdnA3bnRYWERjUkJpT2Z0SERucHZzcVd6RWh3NGVJcGtWOStLM3A1OVloNlNCdnIxUy9nNG54Y0dlQzRJdFJpaGtoc0VReEU2WXJyOGVUbk1SOEZxbTVMaTVPd3VKRWNObGYvZUJjM3pXc1ZMVkVTZHJnS2NOSENxTlgwUU16cUxIM1VIME9CbWxJNEExQXBoVHpzM1VUMGJ3cDlKa3EvdHBxMXBYZ2ljN0RILy9KcGh0SjZUZWQxMFIwVFJ0VGUycHRlSGEza1UwTCtQMHU0K04reklrMml5TzRxeVNJWHRvY3BrOUlGaUhqWjBBclNkQk9ONldzZHBUdEV0Ym5MT2NwU2xVWVhFTnVBcTI3eXlZTnRhMXE0WUU1b1FuSGFrWk9Ub3ZmUExsZmtYYkt1Y2JOSnlXYkQ5TmlMMDN4TlZySUNKZUxoQW9pZUE4ZnJiY09janFlcHVkV0hlc1VCOU5iMVFUeVlobWRjbW1mY2xDZk5QeUp2VWcxbDNoaVhiKzFNc2I4d3p2YWZjT1l6OVRmbElGK2xQdFVXU291SDQ1Zk16cjN3c0NxODdHZ2x2RzlTcXpLTEtoRU5nL0ljOFBKUU5rUEJEY3RUYjhLb3NaYVRjeDlGSXRsS1JETU8xNno0eFRFZWRJL1BST0E4QW5kb1d2QnJqN0h5T2wwNHpMZ1ljNysrWVI3dFlVelVwSk5MQ2JRWkxlM0hwVEM1WTFJTHFYamJtbVN6NHBJblIxeUZvalVFSzJRUXNGbEZpd254cUUzWTlsOXgzUWZHNUNNbFJwZHhPV2NwazIzMElBeU8zaVhMYit0VEtiUXZBMjVUNkovdVJOb1o4ckFNSzZ4Zk53SXp5Z3NINVp2ZEtPNGxyZzJWVjd1SmhndTJzMGpQdnBsc3c1SWgwb0JJb2pnRVBSSnJMeHB2S0hwaTBNNHk0QlR0dzMva0J1dXViOUk1b2ZJLzBoaFdyVzNETDJXZ2lGdmkrQVRrRS9yRjRkdnJBejhrVVlEc3FXQUNoOXBvRW0zY2JSTDBoSHBSL2N0ZG1FYU1CQXJRNjBsVC83NEtBWFI5Ky91eUwvaHhmVXBrUU5zQUpGODV6V1EvOHhOMzh1b1p5UFpML0tvMitMeExrNlRlUGVUM3hvODFmaHpTWVdWanZ2ZFVJRVludHZpaGpLSDVwMGpHNmNkTlFEWWI0TkF6RnlZaXRiR21MN1Q0ME1PQTNIcXBia1p2cFd1SUJOWlRIVUE2TXRVSUN3aGFFbitkQ0JEem1pRDRZMDRPeUxyWW1pK2c0YVNXR2lKbVppMmdEMjRzckJTb2QyRWFIMEJTT0g2UjVXSjRZbUNXZmk2TnhOY3NESTZOM0UvRmVDWWhJRHhZeGQyREI1c2FMS3BzNWdQT0sxOGpMRnZRQ2QrNDN0MmFCWGdscXZKY3JkMysrR3NsWnE2ZUljUHY1SkV1UCtKZ09xUFNNbFhaa2RMQ1FpMlNpTlFybjgvWlZBNUJTS0R3MlFjc1FTbXV0SEI0bEROOUdRRXFudzRCcERPWm9lYXI1ZzUvR2o1SVBmSHp3SlZyNVp5WDR1ZWVOK0dkQ1Rna0hKMHBBMnFhS09pMHJlSkd5ZzBxVWoyYU9RbzNPMnR2cld3Y2JHem8xNDJHaDF3RlFtUmhCVmEvMWNDZFNzcWZNaTZXNm5hQ0E2Q1ZzK2lNcjRVbzBxcnN0d3YyNmlZS294NXZ2UGd2N0w3TjB3QThEaUpsTExBcGJnV053RnRTWTBuZFJiakNEQ1lGNlEvWU1ScHVqei90c2dUa3BEcWZqYkdWVlRESTBGS1FRa2tnUHJNRW50TnE3d3VyOS9jWDBYODl1cEJXMnd0dGxxTk5NeUJBNlZwcjNHaWdTRkFMMHNtRmxJVmJ5TmI1aWtra0F1am9hcGVMaFNOcEVjWDhiOFcvRnBCTlBqYVlVdkdxeGhIWUdWYnhUVVl3NUtxbXFNRVlrRnVVaVlCNmVTU05rU2dFcE9JZ3ZLRnNjL0xZVE43ODBZMkhmV3BCT3UrRGJ6dnJuL3k3MHo0ejAzdElZWjBJbnBFbzFTaXJESzZRVGEwN3VUeGQyYjFua2tCSXVscTU0WE1CdjBFQVZPQXlwV0tOK05JNE50NGduV2tyendCR3NtOXB2VVNRSTlaKzA1SFRncU9na3dtcWhOMVJBbW1zbXgyU0dTaTA0MlJBVFJMd0FPOUVKUmNmelAwamRzL1pnM3cyU3pBN2JCK2NMVWpsaUNYSGd1T1ZTS3Q1WVV4WWZkaTY3RlloeHJoTmYyL3l6R1BOODJzQmNFdDVyMGFtVXBUZWt2ejQvclFycjI0R2ZjL3ZwZ0NJYjBFTEpORWtrdkoycmNaT25Dc29ES0dDaC9rUGFHZ3h6ZS9SVDczN3cxM1F2RUlWc1F4QUdpMlNFYlBacWdJakFJU1UrWmh0TVFSOTZDdnVyaStVS2l1b0RlU2NHTXk3UXZreGpHR2ljWEYxRTF1MitZRkl3TWJSM1g1Q2UvODZlakc2cWdHYmJnZWRBS0UyYkVDelVUM1FZalNGSGVzcUFKazBKYUo0RUs0Q21malh5bjI3QXVoS1JJWUIzcnVLWGxaeWs1MjBKWXpiWUwyVG5BM1VManJ0RHY0eDVXQ1FwM1h6WkpaTXNjMmdCUXNGcEJuM1dCaFVPR01xMEwyTWtvZlFRaURRYk5WMmtjbEFNcFFJT0N3cGhPd1V1UkRtazRWaHBLWVBHdkVQNU1nTU1tVWVpc2J6ZDIyYnpnaThhTWJaTnpDVEtMeE5OZUpzTzk4SzVyRURRdUFRUVVlKytMYXloMjExU1J6dHRDVXJsZ0hSL0ZqVUpIT2FLTkl2dEI3bUl2SkFFNW85TVl2SlFjOWgvcXIrUkpva2Q3VCtzT2dLdnZzQVdCTlpTZnZpa2NDK2hULzlHZDV2MTFaTldESExqazgvRVFhT0licFVGRlI4SlYwRVE4RTRPMGZ4RGZLYjkrU3c4aGVCc1BhUEpvVEIvOFc1WkQwY1BCeTAxdXQ5S0NabFNuWnJKTFZwbTZQeGxuTjJBVmtZbTdpdDMySFVLeDIrK1VzSytyNVFQOVRsY3N6QjZKbTR1UWluYzJ6SWIyTXNoTld3SzYwdnBPSzh2NDg0WnBGVHcyS0UrSjVDMVBiNjBHTHV6aW9IbDdzY01pNSs0b3QyWHdqVkluVHRWRk5xNDJlY1VraG1Yb1Q1VkFtOVVLM0NoTzg3cWMxZmtpTVNDQmdPQlNRQTUwSm8zRjFKSndtZ29rd2hDUnBGUndXaGY2Yk9iQkZXVkFaZ01mNVV3TVdGS2pvclFkTmprcHhOQWZ3UVhnWVV5enRwaUpiYWFodUozYUZRQkpvU1lNcjRXOE01UjNFSXpBMjlCdDJ2VHRMT0NDTHJxb3BzU0Q3NXZEWUlqSWxJdVQ5NWM5RmNvMW80UXp6REVLcTkyQzBnOWVwcDh0VHJFc2VHRW84YXYxSFBjRjlZWG9KTW9BS0ovUEY3NU9xVDJMMkEwZGVuVXpETVRkVjFNRnZHU1VYc1N1R3FZbk1uY1ZCbFBUK0UzUHhyRTdUTitjdGdjVktHYjZadHRHRW5DUHhEUzR4WWM4dTZyV1FwZzJIMjhrWld2R0JVMnp5eVA2WkFjY0lnSjkzZUxJQk4wR21RR29zYTJ5cXMvMFhBM1Rxb3N5S2RGalpXUVQwYlV2ZlVzOW5kWEN1cTlpVjdHMmxpQVNOU1lRSXF3d0wyMzFSVjdrbTFla0RJRE12QUlabVlGY21VQm0raUt1K0gxYStJT1dCYVRlRU81R0xmSUxOVzE0Z0VNZ3l3R0tpaFFxUnE2bk5WTTIrT05rT0RPTE1WejdPenBvMnJ0a3hsV2pHSU1qNDQ3K0dNSFBaMHliOFdrRHRCRUd5VlRUVkRObnRGRmNMNHNTS3IxeDFVbzJJRVVFay9sN1l2RjlqSWV0a0tnWndXWS9NSE0xZFNkNHNRL0gyOFM2WTBXZkVjRDBjblpEanBwNjhJMjB3Q2c2UTdOR3hGdXJmb3JxZ2hOOXZMbFFMVyt1MzVvTWoyazQ5NjhzNU1yeWhKckNrOG9iRS8zdUE5MU0rckNicGZGbnNYT25xMWFLcENDWnVLZ3MydFhQQmlpdzJTMkIvbmxna2FTSUtMWHEvbEZkL1RRa25uYWJKczA0K29YTzdQdXhRRDBFbXdteGlaUHZrc2tOZWpDdi96aDdWT3BCYld0c0VNUkVweFNTSmozUXhtaVljd0ZMb09jNG1qNitsWFVCbERlbEZNWG9lMUNtOVgrT2ZuU3BwZFBiN2ZwL0xCb2E0U1E2dFdSTEN5U25ITkVBZnkxQjMzYng5bXJ1UmZKWVBPM1FEejIvOHBKOGlDYWUrbmE0cDMyTGNnNGRpUmhvMjlmdkgybFl4UWExM0VFRkpGZU5Oa1FGV2VNZ1cvbVVIdks0ZVVXdUpGYzVpRTdDMXdramVOVURIa0oxWkFNR01NT0FlVXNkTnp2N1hDcmVDY3RueGRWb1hadVBzZ01reGRIWmZnRmJFcUNTN21RTTFXNjRMS29ONHRWTnFDU2JKUG9OZGNZU25CM1hNUmtUL1FaYnB4Q2FCQndpYjZzTjdra3h6a3Fja3ZzNXAyRGgyZ3RiSzY4Z2EwZHFuM3V2NXJyU1l2R2VlZTBMVTVDV0NSTTNCc0lPKzVkZmYyci91aU5zNlNkanA1dlgxdjRCQXRkOFhJMi8wbzVTc3RMY1JDU1k0cXc1RjYxZzZ5YnVLWW80YWRHcVF6TVhaL09HZUtFL21KMUlGQjNWb3hiWC9SMTJEUnE3bzRSb0tJUXZFYkRTeG9xbmRHUWJzQ2FValhnTWljMXVHODhUbmNLb2JUT1FCREMyTWtneEVIUUhSV3lDekxDYW0vQTJUc2JJeEd3MjdINTNmNE5ocmw2MXZidVYvbzFzODJBT2pjandMUmYrV0I4STgvMkxiTXhsZEtGVkY1RUJjYldkUlFTeDBPRXBPZFF0QVNCb201S1NwQ1d0R1JzVklZakxtM2txdmF0eDJZUnh3NzBoTlFoem0xckNHcVk3TGVob1JNREliT2NUamZwSmljVU1FR0RZb3hocWRvLzYxWHBDUnBQZFFIWDRPS0FZdVRoSDA4cnVVbllIalpJbitzUGVCT01LazROUEk4TG1WZmZVR0kyMWFJQlYzZEhjSjEwZVJJa1NYS010eXdjaGFpVzR0UFpsNkh3WjFsRjZqanhGeVcwb3ZuUzFseEdHbG4rNGdKSndGenExeEZ0NlAzZjNvb25rVUlFSWJ5dEh0eXFOQlUyZ2dMVUxONGdNZmwwWER2YzA1VWRRZG1idnNLWVdWS3dIUUpqWEZjM21ENjFKaVl0NDB1Z2haR2MzYnBwZ2ZLbVlqM1dvaWRBcERiM1l2ZWpUNENFR1hwM1VRZ0U2ZHRyQUpZQjFnVTA5d1hGUGlwVWtOYkt2emM1WE44RXgzcTJSTXRhdUlTYW1NSUpIczhab1NJOXFVNDhSb3M2YzI2ZmZkU3pRTFdhaEdQKzFYZjZVQmlZS1JxUzArelJ2cXdlYlNHQlF0bVNCYU11aEVxMU8xa2dGSXlPeWgyVXZHR3ZYcjBPOHJXUTl1dk52QTdjOHM2TW82ZHpFMXZDSHBqRVlsSXJsYkdpRU5vQXdEVlloVWVXY2RZT0o2M1pNMlFlZzFzRW5Pd3NObU1Gd1dlWUFPcnFLZXFEbnJsdW9BV3lNQ0RhaXVmS2dzMzNMbHIwUXdLczc3a2h2UGRYc0NnRjN5QTZZaTBtOGZGS3Y5MUhROTRyZ3ZmWloyMldPL1NzTHRjRTN6YzhUcHRadnF6ZW1SWHNZdXl1VGtXb0hNU0J3aFFWSVE5aWxuZXI2VXRZZHhFZ3MxYm5KQTYzNTFLOVFtVDFHMGtDNlNXSDJqTVNMNkNGdHNPNVVCSnNTMysrU1BkeE5RdUNXU1BGdnlmcXd0SU52amUzMkljYTJNL3Zxd1NJNWQ0UU14WVhpcFdjajJ3QndzWEJBand5NElrbTU1N08zVmpxa2RwbGFuTnFhUmhMQlNWR2kwbmVtN0VFdTlqUElnU3NKTFFRSDV4cXVLdlZJODlUOU91dmQwMUdqdEYzK1k3TkxVaU1pQ0ZzZzNIVWJHTmMvN2d0aDBVK1I5UjRDYUZ2TWxCVjcrTFE5c2lONVpCUFRtQVlUTjBYRlhDNVlyVzhBYlpBUXpjWUpUSUJ1NFNQYTQ5OU5ZcUFvSmhnMlI0TnpnbnN6eFRVckRiT2tIYkxZMHBEekpaMjdsOUtJajlWOURDdXpmYVBpNkVzOHU0cXlMYjhHRGtHdjJiRGdIUkhNNVhnMVJuem9KL1dQdkt1ck0wSkt5OEFvK2JHZ3pzNXFKSXVLMUxVSXZHWnIvWjhZamZKSk1VcFNvRUNpMXJ4Z1p6VjNGQkRKd0MxbXBiOURQMjh5d2MzY0JYQkpHRkx4WTVKS3NzVlpnQnpNSHRKL2FDNkRia29TUDZRamRRTjY5RG5LVEF3cldnbkVmZmYzV0V1Mk1CWE9XWXJaN00veTFKVDVhNVlRampSVjFBVGEyS1VFaXlDOTlWUjJJeGtVeldkMEpSa2llR0ZvT05FUDZqbXdvTXZzVUxrdVVkUmlCQWV2cGs5REtXYmtHVU9jbUlBMnNhSmY4RVBzdXR2VndZbHlkVEtZbElQejBPQ3FQUm0zd3kyT01uQ2J1OXVtbGhZRlIreW5lUG1oL0lSdDdPcVVnV2p0L0RMY2tCcnQwQlNDYWNvV3ZnSmpZTmNMMldkcHVWZlVQaTBXT0Y2SFMxNFhkdWJVU1R5S1NnSjZSVWhsU3ZGSXd4NUdDWVUrVlpFOVVadUdRMHRhU1J4a0tFdllqTmJzSnJrMWFkanJaUjZDeFRVaVo5N09OUldicEM1TXJkMzRhaldzSDNhMG5GTGUvbE1WT1JCY3hPUE5VWUNRV3M2ZkhTRGtOUVIvRnFzNitFV3ZHMlptKzM4WTFKQzJzOUZFaEx2L2k3UG1TTFp1dG9GWU96b200cEFTR0FvU2p6TlJNcGJKa2V3NXJWMDF2dWdtVGk5ZUsrcXFHVDNRUE9uSFpxb1RoTFAvRzQ2WEJXaGhoa2hFUkt1MW8vMWlmMDVzeHlGdzBhVUJUaGpHS3BWU2VUbmJEYVZTZTBxY3NqSE56TmtScDFJbFBIQVQ1THRoMWFVT3lCajc0dHRuMnQrMURiZHFOWldtaVcxamQ4bWU1cGZpZUplRDNzaXFlTTJnNmg3MzdWRFh2a28yR0RRcEdmUS8xckR5aXRiRkw1aW01S3FMOC91aHlxZFFlS291dG1UV0lrSktQOVdlMHVDVEplajlpMnBBSy9RMmMya3NmRDZpaFRDMXFSaXdjNzVlK1dSRzZ3NHA1K0J3blRFbVpFeG9hNEtvNEJXaW0waU9wT1pQRmZwYkRpeUtFUW5Fd2NoWlZIb3RCbzRnRzdYa0VWSlJqRm02YXo4R1RRN1BLUXp1UFdyOFRrQkdlVWdoTk9tME9ZTXpLWld0TERLc2c0ekVHSllKcDM1cVpHd1RvR09vRGJYYzVpdVFwUmtBdHB0Uk1LcVZMR1N6ZGpMWjRSNTFFU0Z3dDlkbG83bW1KYTEyU29aZ0drT0pDUVdBamt0WDFYU1ErdkR3OUdTMUEwcUNnYU9rMVdVazlhVmpWcklWK2dncmRwZmdPM1FIcENjdEdRSzY4T0J6SXc4ckZxUlNNa0lVUFl5M0p4MUFuM0Y3cHk1azlIYll1QTMzZ2V3WS9URlpNYWhkNHNveG1tWlhTQXlKM2xyQ2VlazlDTFh4dHdIdGhMZ3QydG5Pb3lUMFdrb043OXFjWHNnR1VvdFpqYVFuWGQrQy9nYzdENENiWmhyY3JrcWhQWS93T0RucVJRUVRRRlluZGp6cVdqRXFUZE4vT1BOd0VoL2Ntb0tpc1UrQ2ljcWRtTGw4WlFEdHJ4aUhoN3FtbE9oajJRUEZxaWM2QzJiSnhnUXgzU2kzMkFGWVhQVDJGRmxLMDRjSUJaUXVZUUtoOEVaT1dIMXZCaGt4RnI4YVBoTlZhNnoxYXJpTkdHS1VLdzYvQVprSEtvOHNwS1ZkaGErWDZjcUs3VnIzdHlLN3BLMFJDdDM1N0pMcEJTS3FiQnVYclFPWWo2ajN4Wk9SZDNhR29PMDB5R2xKRjEvWEcrOW1URFZ1eEpZMEFOaWpvYlFZbG9qSUdwUCtBeUV1K0NwTGR2VFlTQmxFVnlCNHpMcVZJelI3eFpPMHlNSlRqcjlnQjJBdDVKU0kwZll0ZWRsYmp3QmlyQjVRNDYrSnBGSWIzcDVXK3F2TFZLak02d0llYytJaXEzVzM2TnlOT1hWSm1GUTNEckRpaUVBMkdoanlaQTVDa0czTG1UdnltbUxqVUhBVEtQcWhTNWd4eUV5SDFTZDc1a2tEcnBjVHh6aFVtcHpSUHFRUXhFMXVXSmFPQ0ZoVWNkUDJMbnFYVE9uYTB6VGNTaVdMWXBBTkdLc3RwL0xod1NSejdaczNqMmR5em5NaXV6Nk83TEJ5akVpbzZmYU5tb1BKSy9zbU9WWTMwbVpmVXdkTW1SQ043Rlo1amd6c1ZPeWVwcU9PdXBET1VkekozVFkxelVUWTZveWpuR2hpQ0I4K1psem9JaEF0WUhzOFRQdHA0Rm9vYmlXMHhPRnRyYWVOY3JGOVg2THV5UU9XVm56bEJ2WGR2U3NiMXZ0cFdFU25MNU1GY3RYTEtPQnVJb0hlUkVSeituMC9lSktQSTF2cUNXcUJVenkwMmJtRHpLSHNSRnNWbGR0VUNoaExhSHcwQ1NUQTFUZEh0VE1qL1ExazEyR2FKUnNGWXFLcWtUMHNCT09JVmY3aXdobVJEVEtEc0RaN0liMnVhWGpRRzlMRHp2VWZYTm1LRVo2TURneTdJaHJQd0JaV3ZTeW1ueTYxa2ZMSHN6cVJHZFVOR2xBellXOHJteGdlRGR0bWtnV0dWQ1VwQWpaQ0NzU3F2VnBwREpWQXQvZmI0YzdPYlQwcjZaR3NZNjFpU0FaUUJTckQxNHQ2bEJJbEFTZldoWElZbXhRUXg2b1QwNlRkVkRuVS9CS1FFVndmRjZwUlRkMXdIRXBYZ01xRGdSaWpFTWJoV0hxam5JN2lkS3loVXpZemM2dlhWUEJpYVZUaFFpUG0zSjFvYSs0dTlnTTdWWUc0TkxDd0REWEdWU25YTHV6OEg2UDFDV1Z5NkU0WmJEL29GWTF1WG5qK1FZUk5vdUhOY3lrQkZjdEJkWldwR1llMWVsMEgrTWFXWENpMjU2NmpreE9KMlY4R1BQZTZqQUE0WHlRMjUweTFUWjRjdUp5WmJ3Y3J2MDNrWjdRay81S1VGdjl1dk9zT2VMU29FUW5ub3ZRTERQV0dMVFluck1Hb1NCMDJsY0hzeGhCaFNTQzJCUEw0b09BVzZRbjlTU2RHR3JFSkplQk40NmJ3S0xyQ3JvUEFpWTRaczBIV3dtR1UydlFaUGRwaDFYQ0Fvck1ZdFJpQzkrZlZIZWtMcHRVcytvcllwQlBqS1RmUUF3QmZjaU8vZGlTd0ZvUGJnSXlwMHVDRyt5QTl1TTRkS1ZBTjJuRGxSK2lQanZIMDZZWlVKaVpqNFNPWXA1WXQvTE9sZ1hTaG9wOWlXMDFqcnVwSXRvQ1FrbkQyNHhnYW96dmp0QnhzMkF2Zk0wU3NzeWV6RzhKN091Zk5BbzNhMW9JN0tQZk10Z2xFQWk4aGtEZEJ6QVVhb1d1S2tad3NmK0M2dUh1VG52Tk5seFg3bXhMU2p5Y1poVk10bVhSaStJNGlhV2ZxeERLcldjZENvY0ZkeHhsWmE2djhYcGsyMEl2cUltSzVLNloydldUNnhvQW1DWXNJMnN2RzVpMjFJT3JhY1BJZ0t3cWRoYjhxYWxuMGhCaEdwNXVpU1JaQ1d5bm1KUlV1bzZyUVNQVlNkRHBUR1NpWEl0ZTFTZ2dFd1JlYVFtYmNQMTlXR2ppZ0RlL29mNXFqbVhLdjJaWm5zd2lTc0NCMElpWjNYNlI0eHNiVnpaMUVpRnpXRHVlN1FocHA3NWw0SEkwdUswREtGT21yY0Nra2xHUGozWHNPN1ZBNGtEMDFyYXcxRnBHVHNYeDF3NGQwSzVtamEwNVQvbk5wMCtPNkJiZHR6TTFJT0QzZHBiaW1MZnNZNHdTNEZERUlHSWVnYUFRZlFVUXJsQXZrNjQxdkI5djBwWkpaZ3Z4U0h5cTBYbWx6bEJ2SzQ1WUdyWi9jYndwenZXZ2dzMitYeisyMm8waWIrUEtET1M2WGFVU2Nib0RiSFlNYUVkQStUWlV1VFN5bEZXZ2NuVmRhQ0VOM25MN1JhSlk1VU9rS2t0cWNHa0FEYTlnVUpna0RhR1I3RUFRbVV4OGtZLzhWbldDbVlYOUZBNmFZblVsM1o1ZjgvV2ZZNWhrSTNRZWZBQ203ZVUyMS9vbFV4UGc5UVgwVVhKUmpsN0IxeENJakR2cmg0WEJUTndCMlUrdTlBY3dwdGkyNkRmQ2tkVlVYc0diMEdFbUJxaUdieENPYVlZOEV3UWh5Q2tGU3FpRklDYlhhTlNjdlorRnFVbmJobFR3dE9qOW40SkFmRDJFaDB4R1dobElGeTlEUEJwQzdrMDZtWFRINEs2eFlwMjRWQ0dERk50eDdwdzdUbUdRRWxoMFUyV003ZnphZFJDL0pPVmxXQXkxL1JPZml6d2dxMVFiTncrOVowTlNCVm51amJHdjI0THF2ZmhyNmQ2SU9lZ1BoSllYRTBTOFgvaUVIbXRTRkF3YjZtMm8wY0Nrc0V1dmpJMDVNaHRXVFVRc2RtMzFHcDIva1dRbWNrVEVsbnNaNXFoUjNJVUowTEFicDJPM09taVpqR0lZRGpYd1Jvd0xxUlM1UElFNEtpRU1QSGtET0c5Vk5LODNBNnVCWHNWc0U2YldFV2pBV2dZSDZXRlBON01BdVlYa1BxVlpCUXN4bEE4blNCa2NGOXdBWkx4RHhVbG1TK1h0NDMyTkVnQUpGR1NTRFlTUUFWSFhTQUdlaG9BVXNmbGVhWkVxaG4wOFB0SlhwYkFSWlB6U3RYcldqTUF1cDJjellxRUdjQmlaR3dpbk5tZENBWXpWYjJNV2tCRy8vbnBDVWM4bldkTmZrYXVHTkt5YTFpdzJsNlRXUThSYXdLcWZqNHlkSWhkTXdXU0VFaW1lT240YWgvZyt3SCtIOXplSFRoSGFFR1lmbXJBMmRaU2cyR2EyUExaSmZLLzJuMzZtajZ3NHk5d1pIRzBzaGtrNDZGZFo5NTRyMEgrUHJleitBbGdXdVFCT0dGRHpDRkRCYU9rNkNNUDNIVmFQNkdmMW9ISUFWMG1URXBDZTdELzVqM3FvOURTd1JvT2UwR1Y0aGVNdXhTWEk4a2FyTFQrUGxhYnhIc0I3b0ZWcHNWbFJnOEU5R3AyVURRUy9ZcWhXREVvVFpZT0hnNGdEQ2N0ZFZMd3NjSGxMcUoreW11WjRjOHEyNkdFdjJueUt0Nk81dkphcktEOFNydDRZMU5KdWNCb0xsck9TQThKdXQzc1c2VjZlWnZ2c1NOTTRhNkdYVXRSenUyYUhPSFJZNklDU2RoQlpDREdTWFJrVG9NMXRiQWhzNlIvUUVHRGZXaFRpYlhoUFQxUWN5SFJFVjBheFU1ZFhKSmh2MW53aHJXRm1sMFlXUW1SWHJWUnFuRnNGYUNRNUZxRjByUFZXbWRQSG5RaWZEeU9JenF3dFNRa00yMlAwS2kyZllzTXB2dGNFMEdTdVUyQlhvMWZqa09JQXNtWXBIODE2MU02WXVIc1huK3F3T1NZazd0V01VMk4yZUxxSXVPVWtoSU5IdXRUa1hPeXBtcVpPYXNxMENlY2lhbVBjcXpwaDhVVUFHOW11UjJwRlA1Nm5zWVBRN2poSm1NY1BVcDBhNThPYXhDUzhnTEJLdWpyVXFFRHZKMVUwaU1pbUMwQXlBWUo1S1VVdWh5b3Z4SWV6T0Z5anBTblRTNUZFbE4xWFZIUktHSnRlbEdRalpyWTJJYVJrSllPS3p2V2w2eW5GczBJcVArb2F2VFNGcEhsTEhtSEo1bktaQVk1RHR0NEQ1T2hxYjRKUmRsU3pEN2R5ZVZsMkdWZzhBUlRLcmRkcDlsampxRzJMSGFxKzIzSXRxR2tPcFVoc2NDNG1yMVI1UUkwaUJPemFISmc2aTRkdmNlaUZmWlEzcnZqUWNTS1V4ZVFLWEVqRHlHTnkzNEZJVU1wV2VsaXFHNEp0cVJLVUl4SVIxcEl6cHJFS3lSZkJzQTI0eXdkUEF4TWRrWHhaREVZWDdUUU1NR1NKM0pCZVVMMmppQkZaTWEwUmlqM1pxU0ppaVZVL2x5a3phZ282RDVwUW9GR3F4aVdmN0NMaUJtdFFCdTdTZjBzYzQrSDFxQTRXVzBvUVJYdjNuL2h5UWtYRVN2WHlUZ013YlJteWFwZ0NQRG1qWlVVTXQrbG1tbnpUN2w5dmUzVFZDcy83dXNkRDBqVUx1RjllcE9OMVNuK0JGR1ZNYmJKNndVQlpIWjIrWUZOT05TV2tjanVFTGlvQ2NwTkVPbjRPZjF1WUVLOFNmTitqTHRYVWpqR0NobXFtd2RxYVhZZGwyWWx2dWRTcVNnbnZNNWRBbG11ZTFIdEs5RjFhQVVpSlhlS2JDaXFDajRST05xWFExZDJveUVYYUdpbTUyTzBRWWplL0NpbmRIV2NBQjZXa2U3TWI1UzBzUzcwaFlVelhJMUlLYS9VdmJ1UUtaZWRYMmxLUW82TWdJZ295ZW4weFFGNXBJTXU0YlpQT1lNVCtHcTZFYUpYbi9jTk1OeTZFNzN3N05HK0lOOTE0T2MzSHNnSWZVYXpKeUI3ZW56ZDdIM0RPcWoweU9SN0lCVHpqY2k3NjIwOERrOTRDUFdTTzduMVY0bnhCSXNSdnNab0RzZjlGeUN1NjdIWGxOUFlMZzI0M29EZjRiM0dzbUJvc0s1emNrVjRlZE9qSUo5TkQwUlQrOVZCeDIxQXJzUkFrK0ZlK1laakhwdW9NcG1HbHhCbVh2dHVwaW04M3JmbG9VdE9Cb3gvN2dFQlE1K0wxOGtaSUd3TWl5aDZzUkx6UGE4dTZaQTA3Q2dEdDV5TG5MN3BLMXdMZzNEL1VoUVlacUgxYXZtaWhyMGl0bGFUNnFYYVlZcFdrT0dHQmhXYjFrVy9SekFLZ1RLK2ZHWW5DK3lRNk90OHA1TlpDQzVBdTNpeTVhc2s5VjFMbkRGZ1RJdEJ5NFE5dXhGWTlLcEpCVjVRbVNZZytHcmQxMmZudXNzWmlXZEhoRkdpa05iSEE4eDNvWnV2Z1ZLQTd1L2h6aFZhcjUxalJldHkzd0N2R1A5bDBDaCt0RzZrMU5jZEdTYVY4UUxWRXh5QlVLT2hJS0o2bkVlYWZLSVhoc1liaDVRM0FaUVlRQnRwTExxQzYvMmhSMmtuMFVBbUFoV3kybS9oQmsvd1dic0Z6QmpYbENzejdMWjQ1bGFsYkowUnduRGZxY2NqL0lINFZqVGN3V09NZWFjZG81Vmxhdmk2VEJ5N2w2cFVtNVExTllyRFhtN0pLREdHMThDTGcrMUpNRnRPRTB1THlhWnpxZzV1bEdUc1VMcnNiNnRJT2wveGhnQkhkTVBhY3Y2TU5SUE16UTlTVWZmTk93cy9PRHRTOE5seWxPTVNnSzA2ZTBmNlFneXl4NkJLMHJ1MEVjUGFiVXlveWRvK1JoMTlvNDNoaXFORWhHN3hqbjdYa3JvUE5wa3Q2SWpJNGhrLzY5aTZMODZWZXAyancyRkZpRm5oYmNlN0JFS2c3TVZyM0dqbVFGVUN6RC9yTEVNZTBOSzhyNXVJYXNFT2l0NWZoMkpLbU1CelNSdDlDWXBzVVJzdzNNa21NbTFsT2p6Rmhnc0JyblhuQk1jbVZJN2RsMGtVekowNkVoWkV0aXhGRG9WZHI0U0hGYW5XeVlCNW80MVNqdGFraVB3S0U0Q2ZRTkVGcTBUUVlhaXlKYTZ3YUhVbXFQd0tyaEJZV0RXcmlidUp3NWxlN1RTSWlhTmVxcDZBSlpTOXpyTXBEMWlYUUd3cDUyVjVEOG1NN21lS1RBTUZQWUtjYktaSnVmZ01zOUNhZG1kdXAyeG84UGFDNkdQSEJCeWxXOVVxZ2F2bWpsUjdCR2QyR0wzTHZpeE5rWkNwc2RwTVZsVFpobWY3Qjh6dUxVamdDOW1uR1lCQzROeE5wbHRLVTVpR0Irb1diTjR4cEtvL0ZjSnhYUk1LaGhZRjd5OGdJTithTFVtMmJ6TlVEd2N0ektERFRUN2I0WU91a3ByL3N1am56U05ZNkdqMDRWRHo4UDd0c0FIZk5zNmxPeHRDaHdOelFBaHlDbDAxRklYV2szSmhzYzdGZDVuOURRYkR0ZWlPejIzNXlWTUFvSlEzbWVWR3dEUWk1QzN0RTNNUlA3WGdMWHdhUU1MVG5XV2dCR0JwYnA0a1AvRWJMUmxnQkVBSnpraHZoT0gzdGxJWWxhV3pDK0UwbHdPaEpZYlQrTU5HYnZKdFMrMi9zeW1rZ0lNMms3aEFqYXdJVzRwT2lCMUY2aldXK3VEeFZvOVZsZHduVHZaRmlHcEppdS9lYW1HS1hkRHJqc0ZERWxVZ3c0Z1JUQy9qWVpkeHM0UnNTQm92TXJWMUFIRTBSM3lhNVNZNGYwbU9MVTV3dGhIcEhpL1hCWU43VlJSMUl2anBXSDZjNmYvM25KWFVpZ1RuT2gwaHVqUmhqY1ljc3Z0UnJEN2UyTnM4TiszZk83aW4rWC9jb0YzVXB4Qk1scE9VeTZqU0tYdDhmVXRnc0ROK2dUWVZLck9PaVRLalQzQmRsR2pzaTFaajhvQXk4cVFucmFia2NUQXZJUjlSaHl2UloyZndHdnp0cU9hdG0xeTM0MmFqa25RVVZJQW1jSkRkUlNUSE50L3NncWpXTXkxNmhqWkdDNm1vOXkrK3kyclVtWDRmc25RYXVHSTd2TWtBMk9EMG1vRytXSHVBaTVTdXh3bHVyU0FiYlVXTkk3eWxrVWJVUlRjc2ZQdVRKMjQxelVvNXFRc0lCOElmdkZSOWwrVDloMnJZb2dtS0Z2WnIrNkN0MHJVOU1NRU1JNnZSTGtoSDd4aGtLMlNnUGt3d0Y4Q1N5aUh0bVV0NUtqendLQ2RqMnFKWTE3WjZ2WnlPZWppU3IxZHY5VXlFRFh4VGNzMWR2amNHWVB1YUZvUFllbDkyVFdQUGVsT2xpWUN3RGQvRTQ0YzBObTZ6elNhdERKTExzOUxVYmJUNDNGR3JlV01Ha25qM1ZrbGptZjB5OGs5V0JQYXhpWitkbzVHMUJKS1hoZEdUdmxFTHFvRHNqVE9rRE5hUUxselV5cE9ySjZiZXBwTUJ3NlBYcXFHdVdNMTVldXhVS0c1VjM0NWl5V0dVMk9OZ3dEMTE0VUpYR0Nmck1NakErekFPUzFHd211MGJHMGhHbjJLdGFwUmREc3Vuc3UwUVppQzRjeE15cFQwNWswbytPd2txZEpCeW4wVmp1OTc0V3Zab0Z0T3B6N2JKUURJeG1zcEZQRFRxNGhQR2szQ01rSGUzL1orTWYwbVoxNVdTT0lkVkxhVGUySlZoY2ZYS2lxS3J6UFRPenVJNXU0N2JLenpWOStObTJRNjJ0QjROZ0RrUFhWQnpGb2xXQ1p6U0QwRXlDbWk3ZFdJOGRvOXBGc0JlSitnWkxtcUgyWERhRXF4N0ZsYytNdlVDcVVKNkVzTmxES1RHWHVuV3NET3ByNnV0d1RJNDl0RjZnK25rNXJrWk10WURHallqbDdSYW1iV2tMRFpsdnpiRjN1b0F3RDZxTGkzdFZKdHZTclNBc2xySzRvU0N1K3ltc0hSSThtR0Eyd2xUZXU3TGx5cXZqa3lrMEQxcTVxeVVrWDloUnNtRzNtRkkxeWhDUzFZbE5zSmxVTG93U3FDVFNPTTRCSU1XeG9zNHZ4VHF4NlpTb3B4ekF0eFVtczJzU0YrOWNkY2g0cVI2eWJueWNuUGFBL2FibUdVRkpGV3ZPQzZXbSs5THZtVXU1QkVpeXcvbGt3VzRMTXZxNk52VEY1ejBxMklPS243NU5oMjdFTG41UWo5aG1sMUNJMElrSlk3bUd6N0RpZENYUW1PcWwwelUwU3gzbm81TTA5RFNJWVVwU0QzaUFJU0pWWFIzd05aRFhORTk5RDZyb2NxTXRqT1ptaWhrTVVOWnNhSmNZQ05VYkJnODJrMk1BOExWb3oxdnlTVk5KM05ybytJempXZm5uWHVEaTJvamNSMk5DSVBGNTYrdnZUU0lMU2h0TzlidW05Um1Fb0FJVDhtNjQxaFYyTFdRN202elRUUXc1b0l2ZVliNVpKcW10bFk3WUJNZFYzRUIrU0J0NnF3M1hvcmQ0RkxubnVyVjVETGNJVXJiU1hiMGZ6VVRWUzdzVFd2WndQZDcrbjh6Nzhybml6M2RDVUdGTm9PNGV2NTJoTjZ0Q2d4aVExVjdEeEZPWFJkdGN6U2VtQ2RaWXkzTGpmWUY2TjQ1WVAwNjBKY1hRNWxOZ29lWVFHb0kxNUQ5Vkk4bUcxc1N1M1pocWJMK0dqOUk2a1ZNbHphR3c2eis4UUdhazBNaDZSays2b2xscGUwSDJ4U2F2V0FacURLOXZjbWJoWTBxWWFpOTBaWjM3TXAvc3RTcHhwKy8wVWcwZUJvOWJkZGtXRzZXVVZTSDFKQW5SejJUUkJHZ1VwZ3pWWnRRN3Mzcytrbmtrc25EUXlVUjRWSGh6aTJiQXRCTlBPTlI4cGIybU8wQnloYVNCNHVNYll1TGhWZS9Qd0FPWEhiQ2tYaG42cDQxd240bXBBQWFWK21sKzFqMDdKYW1XWDRQSWhUclo5aWdKandDNU1oTUloYWpqeHdyZXNDK2dDelNLMmwwbmtaTitHNCtOampLcG1WNFR1Sk5xbFRYa1NJdW5xU1UyV0g2MnVrdUVsdDRIYktiMHZKaFoyeXlOTWMxdlVuVUNTay9LdGs4SUV1T1d0ZFZWajZpY2lzTVVCNlc1T2tnZ3IzRnJ0ZE43dkNEUzA5NDB1NWVuK3JKT3pNRFJHSUxYNW5ZNmFSSzVXUnRLd251VDNFZ1dkeTlXZVpZWUVaN2NkbmVMVGh0R0IxN1Jrb3BZMGUxclZ5ZTlPaEZWMld3cm9tMmszQlNRV3V4L29vam14WmFrTE4zUFhtSnN1TjVrZ21PV0F3cHlhQUZkbjdzSktzNnBsdVdhMlBxTm9GcGRkMGRDV3JNQWVnNFNrUVJoZnI1dEJ0WVJNa1NkZWVUdUh5VURIeTJpOUtQSG85RTJOWVFLcWtVMVZZOENKNWdsci85a21pbXEyS0ZTb2lzS3ViWU5zSER2MG81U2labU5VYkk2VXdMQ1BVNHpmRlI0MnRabjZvVHZwcVlvUzBCZFRpMCsvMEE3TjRBTHdmT05KZFhoV0xlSWNHak51dFhzaG1yQ2tnaFFrd3VnQ1hIRXZFdVRSQ1ZXR0hpWUdDTXJWQ0hhbVdqNjRlN2N6NW05ZTlLNFhGVFNoS3ZkcmRJaWIxcnhPZnAvc3RuWTJrdm1adjdKeTliQUs3Q1NoUnA3RUNHNlVvM3pKYnhpTHo5dDVXRkorY0pSKy85VU9vbnF3OFNCYnRqbTZuNDY0MGpGTjlvOUVMYUsxM3E4dGxPZ0NPY3AxSDlTMTNEZjZvUGtZc0VRVmtLNlNmV0Z3dDdnank5SjVYU2FnNUxVR3d4YWdXcTYxK2NXaTNPVktaR2p3cmI0WW5DYm1PSnhaakRnN1pYWUhtY3YyNWxQdFZnbWpCYWI3MnF1VERLT2lCWkZsZGpkcEFlODNlQnB1VjF2a0JUOER0d21OTTE1L2RGa0ZHcnMyaFg1V1oyWEljYWtRRHc1dCtJOVJHc2p5TllOcWFnMVVUdFVscE16UTZSazF6YTdNdEE2Y3h1OVhvNy94Z1hhTXdpcUNpd2lURmJ1VmJUUTNWZlQrM1U0V1QxaGZ3RFdldW9RUms5YW5wVXJhWFJtak1WVXBZNk5NUUJWQ29YanVHbUtUaW9IR1JMd1lGMitNZjhSOXE3NGlIdHNHQmVSeFhyNEV5OVF4TE55SWhHTEx1aHlvOElxYXVScHVZTkhPZnJoRGtsblk2YUk5dnVMUU9WRXVUTS9LSzN2Q2dHc3N5WkhrNmRHTkpHVU9aMVE3ZVVNckZXR1duakZ5dXdQNHorelZLSVVQZ1R3N0wyQXhIbTVyTzBVU1hHb3dYV3RBMDJJODAxRWV0d3RYcWRtMlBRU25hOVhSYk9RM3lOSzU5ZU9pNzMybndUSVNXaHdheDFxUWMyTXVTUEZpRnpLVVhpY0oyRkxYRnYwSE9ibVlVcHVqOGQ3L1M0RU9tcnpEQlFsSUdkdi85ZFpOZWRCQzNSR1FBTzNQbUNxUU91NGhQVUdWNlZDQlJtZW5jNlo1ODRUdnNSbGcwUzhVdEpxS0UzRVJ1dWVqeDIwa0RnNXZJeDV5ODVNcTVOYXMzZkUwZm9QZHQ4QWh1V2gyNWlLbXVFa0Fvcm5IME1wVUFwRmYzekZ3Tzd4UDNXay83ZFVBeDFwTm1Tc1MzWUZ3djFPYkUrTDBUR3dGQ3I1U09WaENVMUZYM3I4YThRN29VejhoT1MzNlV1UzFaSWV0UU1jT3RidTV5aFpyMXFXaGFINWhxdk9hYWJWWURpT3FiU1NZWDZnMWRUVkpMTXE2MXRnOC9KaFdvWHNDeXFFa3pwS2tEUGx6ajQweXFzWE5nMUR4SE45U0RndVJwdk5rNGE5Z1RjanU3dzU4SUxOdTRsRnd0ZHJKb3RxREdRM3hScnhWQWZoQnVkd0JERXZqRkNWZUFvb1kzVFRlM09SMFU0RmEvZ2dIdXdTS3FTS3FDV1hNTGhTUnFBOVRzamQzeEJBTG8vSDZjTkFHb0owYUd6YlZBQWVjdnVCZndmRUpxa3hjYzloY29RMXAwU0dLMGFxUjBZOUg1MVJGd3c0R2ZXdE42VWo2NFNPWm93R0RWTndySmJWTGZucmNzdmNJa2FJa2ZGcXZpeTY4MXdGTXBTa0VlMmlROGV3S0VLSTdIOUZSZEVLeDVNUFFwdlEwNm1mVG1PTjdycFNOQzlHVnl3b2lkU1ErMWhDOENwR2xKbDRLZzVpY3ovUDlBa3djalFGNGdXTFBZVTNYTk9YdzNyYWVEYzBTdXlva29EVHYwWjFvMm9oWlJ5SGJaMTVlM1N4dlQ4RkFTOVFnT0xMTENDOWpXV2Z2Tm10MkUvWnBLME9IMlUva0dkdm1rK3daZi9FMTZQL1JpcHNhQUhxM0ZDOFVRWCtYdGY4K1didm9aZ1pzL3NKbS9pbHdKT1YvTHVEeStPZENEZzV3VS9kby9YNHJTNlFRVHcrM1RUWExVTlZQZ2lKbnlqQjlLVHR5WVJnUEVMNXZTc3RRRVBzMldDbVVLK2FqejFMaXpLSnpTaHJpTVJZQkRuYXJnc0pMRER0UDE2c1dsYVJKQTZPZllRd2NCTVZ6RHJYbmVHY2NMSDJTVTljVjdkVU4wV29UWFdHNnRZNDF1ME15cWN0NDhtYjJEeGFZQnlPWGI5ZVkxUDVmYndHTUZtZ3VNZ1pOZUxNWDlabWtLcExHcmNjUlYwcmdzK0tIcHBEQnQ4cVVrK1d2THRsdk5xQmRzd3BMb0ErSjErRnJRRGRvMmpCMWhBVnZwMGNjbklYZmJ4RnR5elFabjRPY01BclZPNkJaNWNneTBaYUR4MlpBUm5hQjcxblBpWmtwR3FJSERjQ0JCVUJubCtmSVlxK3VLQlpUUDVNTzB3WnhTNWdEVm8xMWtCaUVjcGN6WkVhTmFVMThsenRWeHp5ZTNYUW5XTUIyRElxYU5NWWlGbGwrUVovWTNLOENnRURQVFg4RjYxNzNkYkhRcG1OVGhlc3dtWmpoMXYzVVNHV25IcjhPa2dnZ1c3d2MvbGJFaUhFY0Z3ZkVzN1dnNUZqM3hWR2orMzlHUzJjelZyY3dSSlkyTzEyL3BwOGFQNU1OdGFwVmFMbGMwWGVjQ2FvU2xkYXdTNWo5WUNVRVNSSE9Wb2lVSkpKVUMwZTR0Zm1EdkQwY1NBcTNkQmozYjhTcEpRNFZTTjBKQTZzTGlnUGNubDdsUjR6bXNmMzlIeFFMSk0zWXo4ZmRvTHhNUlNsQVVGOEs4M2d5RGR3N0pIK1JIQ05abEtaa1VvMDBQbktTQWwweUZoVGMxdW1UeEtENWN3dEVJRjR1QkVqSGZwS2hmNlRBMktENWZUdENkQ1l5N25WalM4QjlUVnBTUlpYZDdZZGowVjNrMUFZM1p4RjJkSXBJU1RYVzBUMEUrbkNIQ3lnQzNFYXRPZEFVUnVaZFpvUHRCQWNkQVMyK1FDekM1RmhvY2NwYU96U2hXeTlzUHVxK0x5OFlvNkRhWXcxTEt5MW5lMEpIK3RYNjF6aDJCT2lvekZhS1FPMWZFSFNzU3d0YUJQb1dIVGtaL3hBUjZmZkhVeTBYQ0JqTzdOWFdJK001WWpXRjQvNnhiK2IrS0c4ckExUHZPbXNCa1NveUpjMEhydytxaVJqS1QzZ2h5MjRienl0SXhia3ZzWFN3N0ZsWGlUR2F5dEprQS9nV21UR2VsdktvVG5yMnNvWVp4RTliY3hrcXBTdmUvRTQyMUhyU0pUdDFuQjJiOFVLYUtWTnk5QVkwaS9oUWZkb1BBTEw4NXZkazdiN21CZDAvMW9hRjFPWGdObWtRejhwUGEvOTJrK20ydXF4ZlRHK2Y0V21GMmRDb3lXZzVNMG1sdUs5cFFTcGRrRlgveDJkQXZ5ZURucWdCUjJ4dUxrYmIvYS9zcmY4TWhvZm1adDIzQ0RqQ2pJK3FMVFM3aVQ2SDBqUWIxbUM5NEN5NHBoYWc3bFJsYW9GczEySUFWWHU1MWJpL1o2VTk4cGdablVoT2RrNTF5MVdnWmVtNUhORitZL1ZBZEc3ejFZSXVvdzlqOVNnM0lYdmpyMDl4V3gwaWlnVXduRGtCdVBUbzdlRDJqZWt6N2ZhY0FLdW9pbDRLNE1XYXVjSWdqaFpCSUx0NkRtWldnY0dXUmV0K3ZZYVZMVnVTeWxKdk1HQVVzUmZiSDRMSkdYKzNZZVBNOVNqbm9JQlBveUdSclRvS3hNeVNvN1Rveko3dnZBUEJPR25vdzFpcEdxa0x2ZFFScHNuc0xIMmNjQytRVlVDL2FtOW5rU0J0blNiR3V5UG9IcW41NTN0VWlZT21KZFQ3RURZWmR4VHRvSEgyMTVpOUlYanpZTk9xblowRG4yci8vVEdOcXVrcTdWc0pKeVcwTnlsR2pWV09RMW5zNU1WYmF6SjdXM2RMSDFPMFR6MkhnYXVRbmpoOVVONk1sZ3dhVmZVaFNJMU1IV1Rlbzg5R0QxNnlpblJ0aWRJY1htSWFiNU15NDN4WFNXT3kvLzN2Y1FwZFdrQ282eUhaT1RxWE9odDJ3UUNLUXZ6T21HZnQzT2s3aVFxQy9rQjZNLzRZLzFYYnBLWW1aYS9LNlJHY2kxOU5MVnR1bEthUnJvck1CU1pEdFRrOUI0L2YxK1NhRG51NVZuMkNoOVpFVlFTd254cGhaK0ZvSHQvN1Y3WWFvMFVBRmNYdWNDd3dXaEJOaEZodG4zWmRnWkVob05sdHdNVVVBakgvanBiRHhMRzNSNXhEVXhzVEUrRTlmellHQ3NkNTYyMVlsOVYyb1lzWG8xK2FXaFd3cEtleFNjbzNBaEQ4WUI4ejdxTXZ3dXROeStqczNCcDErbm1jTm9xR3llQVJ5R0d4OUs2R1k5WnEwbG0ySk40R1JBYkFONldleXdLd3RiRGszQ2tab2RBa2NWQkNvaFZ4c1Y2MDFwNGNPTStyRVQ4cU5XQlpVUnJ4QXNUT1pWZ09UM3lqQ2lPd1ViUjhMRTVSZWZ2dUtldXBGWmNhMVpCMEF5VCtnNUJ5cG8yejZqaUsycGRsbFZwUHAxWlZEendrVGl4Y0RGS05GNTJ3a2MyU3VVakhlQVJyaDF2QUMzNVFicG5PTFk1cXRyamUxOWp0OW5kL2xQeUdhU2xMSllKdXRMRk02WUtXMHBpeGprZEhheWJqVExWbS9mV1AzRHRuTkNpZXpOL2orOFZyWHo0SUVzWjR4d1FyZFpWQjNOMWpIRnpqTWpUMHBKQ01yUnMyZkdxTXdVWGMvY3lWTTYrWWNhc0JSeTNVTVJoQk1QUUtOakhFRVVGc0hiVzQxc0VNbXRBR3NUL0toMGNGYVllVUF1dVYySUlkQmt4ZDJUZ2F2TmlZQkpjT1dnVWkvS3U2bnBpSjdBMVpxR2Y1SkJhMEtpZTlQM29jdXNXWWdqUk42VkxkdWk5SlJVNVBxSzkyY2NyZi83Q2xLNW1yblVLMzViRDl2VXM3a0wxTUpoeFpITDZZZWxHUDIvNUo2eTFZa2NHbEtUaUF1S24xNG5BOTF5ekVQK1o3Y2JydGt0MXhhZjdUQkVIRHZwQVBHWk9yS2g1d3lSdUJhLzg3WFg3b1ZyVm4wemhsQ0FlWUYyTC9qcFZTQlVlakxOU0VuRnR2SnRWck9HREFCWkVrbG15MW1DRmhxOEozbXpnb0tBelpsZEpzMmFZc3pKUzZYd2VmZEdPOHYxVlI3d2ZnbEV1WmJDWlZiTnRTUmZrZld6TEE4TjBvNW9nR2ZLc3Q1RDV5VlVwUGhYS1hDZGxNUnpwREVZYm1TRmhNUTZRN05LMm92bWU3cFZxTGxsa2M1RnZLTlp4UjVLZGNOeGhlMmxLUkxkZmpHdldlVDJzVmNpWUs2MmF2L2xJekNUWFBURzNoVzgyOGkwb2U1RmpmenRvSlFaaEJYT1NYbEpEaVVncFVyaGdFbEZnZzVndnhiR1NuVE9NT3Jha2F1ZDZGbTNNaXdYNmQ5NnU5dXcwdU45aVA2Z1dNOTZWQnZ3NlJYWFVtaWxvb2xsOXN2aW9lYk51R3BTRjFYeE1Za3hFMytlQmdUUzFPOVhBY0RIcUVKKzB5R1djcXVoOVNSY09YNkI2T0FveEU5bE5mWWJEblV5QU9WcWhoYmEzRGdpWk1XVGRWM2ZpeEVna2FvL1didjY2bVBUV0Qydlp0VEpyeGVkRWNoekF0MmJTWEJobHM5VUE4RzFLQmVIOFRVaEplaXdBOW1EUVIzMWJCazB1MG05cDQ1d09KaUR6dlUvbTVIZVM0Sm0zQXVCc0hENG5wZzVlS3MrODR1OVVkaFlKZXZMa2F0ZldkbmYya2lwNVd5MDZPTGh2OWFBQThPeWdpdHVnVDMwM0wyNEN6Y3FTS0RQV1VqekRoK0hnOGhJd3dvNHJ3UW9MdFZoWGU1N1NpT0JNMFQ4RWZ6a3VOS1hacm04blZFNTB5YlVobHBwbUxwVmNqcllxR29CdVhjZE8xUkMwRVh3M0dzZWJxeU5hSlY5YTF1dThMekJCVEdBWk1mV1duSExRQkc3QWpKcVhaTTBlbkZZVGorRTdHeFdXMGEzSXlPNlpYQUYwOENRUlhkb04vUHVzVDJRMW95MUx5WVdvMVIwb3RHcGp5RTROSU9NZWxLUTJTaTFiNmFlV1BacWkzbld1UzdObG1kVVlLTVhWQUV3TE45Q2FVNjhtWE5WZ2h4ZHYyVldjVG12c2ZwNVg1NkdERE1UbU45TGRzMlhJWUZFSmJvNU1TZTlCWUg0ekZ3alU5TVMvNlpWUG8rcVNsaVBVb3kvbnorSThObmRTQzFialBEYUQwaUh6d21lMWM4WTBCUUhOb3VWQnhNR1l3cnowNnJ6VW94d2EwZzBGNnEyTGllOVpZZlVIbjZuS1VMT3lDNnB5eEFYY0FxOHdXOXQxbXNJVEduSDNjUGo1Nkh2WWdyQ1c2VFM1WTVSd2NPaTJOU3RDOVRYSnVzVmpib3BOTkl0VEREWkFzWEJSNStFWjRtRnU5ZS9SSkMybVBOc0drTVhYWHBycGRUQ3JWQ09MWm55aEYwcG5BRVhPcTcyWlpwUXNiS0xYeFJYcE5SaXN0R1ZrS0JzZm5XSXROUEptemZ0T3huZzhRNzVSVW91cERmam5NYTNEOVM4bDI4OVJJMjFCR1lPMHh0OFpSS3kzQklrU0dRV3BaeXBnRndwbVo5YWMvOWc1YVpReWF4VTA1WFVnOUdvTnJxWkl0bVNvSFgxUUJjVGl4UU1oT2NPVVlSNzI4MFEzWG5oNGFyREFiVVFqak1ib05LUzRwc3MwSGpqSC9aN0ZocFhrb2g3ZFRLZDJHQ1lPeXVoQ0RCcndKbzJTT2tpMkU4ZE5MQVE3MEtRMEFnbEpCRTI1bDF2U2xiZzRsUkhQcE9QTTFCRmVmNXY3M3lwSTNzSGxzODhFUlJUbUhYOGpOY1dLRmRmZHdqcDlDM3VGWmtwQVozSEcydVpMeE5LcER2Mm55TXhhN01EdkR4cTVKYkdPaGpjbXVhY2dDSFp2aERGVndFR1pyZGo1bm1YbEhzMVd4bUgybnNaTXB1cEU3enpaUER5YXlScXNDVytQeVZsdHJIVmd4VmI1Z2U4SW9VRFNqM3BYL3dJOUEzSFdLcVFmMkNZY2dMaCtQamhzWEFhVHhkUVBsVUg2U3llWnhuemFQL1duYUNBeEh2a0RyR2tYR2pndHlVN3RMV2NBK0MzcFdVWS95NWxCeWxYMW51ZXphMVpXY1picCtFdktOTU1ubWxIcHEwT2dyVjk0RWtUMTNGdGsvTW83MEt1ZXJCUUZVTTdzTmZzTDRuV1VPMkxmeU5LSFdteExicHlRUzh4THJqdllucURSdHJKR3JkOS8zWmV6Qi9wK1VKVkZGTkJxYXFFb0Z5dnZxNzlDQjVkUS9GR05JZEt5MmRGM0RrWU9sc1c1Ykgrc2pkNU9wV0wzY0podGFNMnFjN3dqN3lmczFqRG41WjdEdG1TQW1jRWVYRFdSZFR2RXQ0YnVCd29vMEovdytDMitTOEFtYjhMenJWL1ZQUjBRVENPNVFuMVhYQXBaM0ptRDlpVnNQQ1JlM2JnVTNhVU5WT050NXArYzRPbTdRTDZnbzVXbklNcGVKRkl5SmErSU54ZjNEN3VtTDFZWEdzOFFzOTBodGEvaXkzZkc3OTlKLzlqUkpxZENkdnVEaUFIcUp0OGxueWRVNEg2VzBXNE1SYnFYYnJ3TGV3WEhsT2ZWQlZqSnAvRFl2bzY3TmhvdytXUXRUdHdEaElObzQ5REd4TVJhdE9zR2tDcmJ3TnZGTzFVb1lZejVQamlCZlVJWmx1Slh2MmdLTGNxcjBoNE55MXZ5Wlk0MmlvTStuWlAvR3RqY284NmJlN0RUN1RvcXlMSTBIdW9YZGp4SDVQTWdqckFZZnhMTndqbVU1bXNpZWQyOXpHcGVsOFd5U1VPeG8zV3dIYUVNejUwOXJTZnYxRlFjQjN2SHROUUo2enBTM2p4ZFNIMmtzTmdpRGJEQnhFNjdHUEgzR1lKcjNKbThwaE1qTDlGSDYwVHZCbUtGdWM0ZzhaRkpUTGU2OGp1MWptdjBYVzFKYWdUSk9ubTNsTzUrRS9oR2tJVHMxK0N6dGU2RnpCVzF1NlZIN3FSc0RJcVNZRENuR205OW40KzArcHVYTkpwNFFqM0ZmOVVwYVlMTXRyUVNqVmZmNlVBaHczck5nbXV5ellzVjZZeVIwUDA5UGtiajdqY05wZG50WlN0ZXQvaGRxOTViY1EvV0YvUnhHQ0c1U2hianNSOGJsbVFlYXdyNXpwckhqNWJyc0lVUDZzNGd4RmRWNVIyZGFYNHI1dEFOc3V0SW1KUzI3Q2lMdXJ2VytDNWZ5NFFoejFvbFJ4MkU1T0dTNXc2c3B5NTBZeEhldldLSGFObDVrSktEdktnNDFNdXpGQldPNDcvUi9HQVpHRzBhZlZqaER5QklHYXhSUGJmMm5JVUVOWGk4SnZwcElaR3U2OUtqN3g3bFhmc0FFekZ5R29UYU1xT1FnY2pXSmZlNkc5YnVTak0zb0U0WTBiMTVUZVE5cDI4M1ZaZE5Qd3I0YldHWTVCVEhYR3ZVZ0VRUmNWWjJOSEhqaURscnJsRWJIdWg4QVBJNk5wSEwzR0E1ZDFwMi9MSmFkTmdZTTViZWluSVQwTE16bHVxd2MwWUJVbVdVMGNPd1lWbmthb29RclBHUERaSmhOYklPaFRnemE4THZlN3RVRGtYa1ozQzBPRk5pN0l2VmtUM0NPMFFNRFFuVm5EZHRhY3llNVVkT3c3UHI0SERqVHphd21BVzJqZDhYNks5VGU4QTNDOUs0dlFXY213NDRIdGU4UkoyajhOYnI5RzVIZEFLOTlLMFRxVkpyeDhKU3lMc0wwNllPMER6dFNoRHE3UEh5Z1ZaUWg3K2pqK0V5T0hyTmgyVTN0VVA1UlVGUjdqb1Azd0FJVHA5QUlpcStEemFYOXVGT21sdFhTZW1NMGJPYlRKR1pmNVdpSUNPNFhjTTAzRVlrMUpoVWhlWEtVUm5PZjQ3N3p5Rk5SdWIyZXRhNnZ1V3BtMXljNmZjeDkrQ1NJdkllWTFiQ0paeFIwM0s3Q1JaQmhMcXlKVG42WTdkN01US0xLaFpKYStJQkM4WWpKMG82VWhxMFF0cVE0NWIyS0FkTlRXNWowTnI5SmsydXk5Z0R5RXhFaHNIb3RJa0tkZHRqdUptSjAxMmZhUDVuTHphejNFQWwxNGJFQlRxaTFFTGJzYkN3WUlNU3VNZzBueUt3OXVKVjRtYXdBQ1FQQ1dDS3BDeW43TWY2T1BGZHlqdFVyY0Rydmp2em9RVGdENzRSSTE5cWRTSmJPZEtqdWpMck9XZ3ozSE16MklERlphSHh4aUpyd0JuZ1FjbmlUWU10SmJrNU52dGljRE53UkpxdHVFYU1nUnBWR3JXaWpheEJEZFN6c3d0UGNoMFVmTGF5bWxTQTYxTkNGRWFISU1yMEdveGFOcjJ1UE1QVXBlU3FFNkxDbTQyekpvSW85L29zS1F6ci9DNzc4Njc0a1hLMWwrSVFBSjh3RldqRVJJVVZWMFZqWG1Wbm9qSVBOK3hBZkZJSkJTRFY2bnNBVjNEUnFPUWd2aWZqTE1CSFJ0SDdFOW5nenhINlVjVEJ6dzdmZjFIQUVPYlNvNlQ3M0krenNma0M1bDNyamdqNVN6dkR5dktEbTdkK0drcHgzWEVSb0MveitiWHI0TEczanJOdEZRQnNyaU1abTNkTXF1S2pGTThDMHIzaUtEZ3AyelNNalJHa3NKTEIxTXd0bmdOUWhGd0pUNllDR21nU0c2S2dIZUhhUkIreW5zbVBjSDFwMWpxTFNucWVuY2EvUldWU2M3QzFuUlhpd0FhcndlQ3cyOW90bnhxUEJDT2xWV0Raa3FqNXZXYnh0SHZYZ0NXeVliQUhyZU9YdDBhTkJFNkdPK1FvR0puZjBpZ2RkbVFXRm14em9Zd0dNaUErMVJOck1JUVM4djkxeGE3bk9GeXBHSU1xNDJjcGhqTk83SGtwa2F3N0xpdDJrdFd5dWFrR2dGTlYrR1F6MUdPZ1h0ODEzZ3BNemlnekNmS1pLUnN5bDdUSno2NmlOeUFPSXNEUitMWDZnT3dmV2xjeU14U3gvTFpxZHFlbnhkQzJLU3FNdTFlNUdQRjNhN1ZDaWdCNFFPVWJ0YmtRNk5ib3pxcC9XWk52Ykkwa1NBbmR3d1hoQi9ZeHFValdXVlU1SGtCcVZGaFlxMGtxY3B1ZkJjWE8rRStrNGhlNDRXSGYzSWhxN2JLVWQ2TTB1eDlIbDFucXNRUGlIdnp3NmFEOVlGTVhITzNkZDVVK2lCUFR4OTZ3ZHRHRlpkcjNEYkwwbEE4elBrN1FsS2tHYzdGK2hGcHYyNUFXNnZHM21VWFV2S29PSXh2b0FpTytjOEIzNDA1VFk2TGp6Mk5Xa0ZVY1pvWTR3YjR0NzRiVWp6NXl3T1hDdTFZUXhjalVHUmlIS0t5YXlab0diOWNvYU9Rb0JuM3BUa3FXMTBQQWliOFhLaCtQbk9aOTlJZDJDaUl4eCt2U0dLR25QSEZiT0tRNDFDVVpVUVRiZlFHOWxhUTZJOXdkSWMyN0NkajhlZ1FhNXZGK01uampRdnd4bklIelJMUE5FTmdncGpiTFA3dU42YlpSYklEM3ZZZW5tVTY3UHZzVmlEeUdRbm5PVDNKTi81S2pHMWFDNjRoRkVpMklrUjNTZG1YRTNaOGdHMEhYZnV2NVFkM081TkMzL3pzTEZucVBydFNtNzJZNHduZVEraERvVlF1bVBMWlJTMXNXck4zYlRxdXVxV0Izc3pGMC8wZEVqdmZjL2g1a0Vtc0pITDBiVUhiRmI5RW1la2U2d1R4NFpGRjMrbnNWZURDYWJiTFdvZW1VR2NmQ25zREdXazlBcDEvRGtEQloxV0xUaXhFNGhhV2tPZURqVzcrVjRzdXRrRm4wZFI4bXpqcGhORlg4eVdOZlA3cGN6SWJ1NVJodktoV2RDb09GMUFwb3RETlA2eGpad05aVlBxWU1PL1VkTnMrQ09qbTVRaW1SUjZudXpqL0NDZWd5Y1RpSUc1VVJqdE11VVBJbmh0bSt5SE94RElYRXRWZFM1eXJFVExKTlJPMjM2Umlyd1ZVZ2NVTGZ1QnNzWFU5OWtjQ3dPa0tOYlhmMjBRMFQzMzJ1T0lHNW5NTzU0NXFZeHI0bDNKQTBPNXMzeFA2L0RybmNyMSsxK001WFBsN29hRFFUTnFmL05QQWRjemdUcWpxWFVucUVEY0dxQW5oNVVmYkY1NnFDZW5xTVVEOTJaZlN6a2xYZ1JOWks1dWswaUV0Q0l4V3lrWDVndHl6b0RNZGVHZDAzTDFLM0RmQ3FVRU9qaUVjRTJDNGpMWnNqdkQxY0d3WjFIeW4wdGl6YUk4b3RaaEtnNXAzbmNkSTBvK1VZQ2g5ZGxuRjUzU0RDK2Q5NVhGWE1BMXl1K1VjdUJ3Z08xZHlVS3hvcU9PdUpXbld2dDhWU2RXaHlXM29zOTVKdkprK2NHV01yaDJaUVJYS3lSdTFMMEZHNmlFSCt1VFZrenE2Nkh4WXFiQzZqcHBuK1FONnNDVjhQTVN4UEdkOVE5R1U1YkJVcXkrWERRejJid0lvQit4U29DZlBFcDBSNE5SNytUYXJJemRWaDhoS05IZjA0R01kQ3B6MkE5NHVqNWxEN013VDkxSjJXNVk3M2xoc1B1RGtITUV0U2VaemJQR3RlOHFiSElXeVBIcDduVVFMTTZpSGx6LzBveFFvZXl6WFVMQ1hFN0krYXBpcHlhNU9qWXZQUXNubXhTM05Edmp6Z0wvUnMzcXZBWjU4LzJPT25Reng0cEZsVk16c2hqbU5URzdFSFM4bWJUajNlYXhhbDRUMnVoODI5SFV0NXZjbE04Y0laL1NqdmFQdzdPMVJyL0l6U1BOVEtNOGZKa3cyZVNCcW1ZMlczVllrNjV6NnBZR2xyelB0SWZLMld1a3Fud081UFdyN0N6Qk1NbTJ6V2pmbytRU1h4T3VYWG1LSDhpMVdWSU1FdDJod3RoSlFST1orSWtVbEdYRFpaUHg2SFN1QTNxeFlZdDVjNDdSU2V0TDIyMVI3QytEZEd5bnZ1Y3hrbUI5c1VDVm14M3pYayszTWJ5U1FsNjV0ZkdJOXNVVHJ0am45YmFwZFlyT3g4TmJEdGpVcTNLK3hCTE02TW5EbTJuK1UzMERaY2t4NFdhbXBaWE9kZFJxWjhoMTlob0REbWZkamZLMmVmWmlKalgzY2pvTy9lYmtsMTNkenNNVEdtV3NmbzRaSFIweVQ0SVBqMWhQcG1JTTlwQy95Njc1Y1VTOFNQcVUyT2sxdWZNVlZNVHdJaXViU2FpWStLbkNtVERnTmhUTms1MDJGaTNrMUgySndQSTZlNU15S1d6Znpib2llbmpPQzNwVGlPdWFJcm9BVWRHVzN6SzRQamR1eTdSelRpVklnRTB1czBBUFU1eHR1cXM4Ymp2MFArYzgvYlZReCtlaWxXQ3c1bXJTcTFjNFhWUDVFaTdKbzAxSzUzdGMyQ0YzUVRaNnVHcldid3puNDZXdXcyUVhWV2w4RGVmOHVUUUU2bHVUamhWN0RZWUtRZHpkd1BVckdqaDJlWkJ0a1NveElkZ1p6QWNOU0VQanhPSTFUempXOGs1TzNsLzNvUkFHQXMzb2JIYjhMaHdCdFhqS3dhT3FvTVJRbzZqT0lzUWQ3UmU5OGRqQVFmelFQYy92QjIzYSt5b3hrLzZjRlNHMjhJV3pNN3BHVzJROUhkMm9CdlR6NklPVE1Da2xveGc2RnFGTndjZDlYbWJnVGthM1VBMmx1RFdXZVJwcldwNk5tYS82OTdHZzd6N0pEWWw5amJVNGtETzdENVVkaEdYMVpWc0pPeHczSFBLb2crSUprMDhlNEhRK3JReFg2YVlweXlhZ3VYVGRteEZzK0U5MTc5RWgvZjdkOEFSNndjK3hlRzZBWWRqOUZHeml0bVltSS91Vlh1WkRSTk1mbWhGZFY5OG5rMUh6elBCTFB2d3pyQjNUVVJqVVltOFFFUjRBK2paeE5OY1A1anhtZjFRUExRaE9EdkhRemZFWElMSkJPdnNRbHVuT3VLUi9EMEE3UjVnNHBzdXhPUFJqN2JFVFJjWUpxUFlidkhLb2Rnb3NUNFhFRHd6bEJGQlRWU0RIMHlObk5sYmQzRGNYSTNzYmx2Y0NNYXlqSzB6bXZ1WXliNWcyK3FxcTFpZmZiNGdHeS9RQnN0MFg5QUpPQk8zOThPUnlRZzhsZ0VoTlZXb1pVbENRZHBnb3RYM29FTDE0RkF5Z0hydDFUeG15V2xtakdieDBpNUs0SXpFS0NidE5vT3hmNGQxMVdoMzFKak5nMGJpYkdMdG9LTmovYlRZZkJ3M0U0dFFUZzVpd2svWE9aejYwR1R0Q3BZOVhTZS9UL3NmTjVqeDVtQ0M5NlpYc04yZFVpZHRqTzBCWnlNbWNFRTY2Y2FiaWh4MjNVekwyS0ZBQTZidkRneVdTV1BVbjRRMXd5cVNEcE1UbytNSUJwV0w4eE5salJnWHArTUZISlA0UExzL094UW50WE1JazJrRGFKUCsxa0FPVXlHdDBzR2E1b0Z6WVlNRGt4VXFFOXh5aWNubXJMcEIyeDdXVmNOQUVPd2RraURIVGNrQkdjNVhJY2JCYXZ3eGIzZjRXZXlGVTlwZG5mQVFQU2M4VC9ZVUl6U0VodkU1Z1NudnpONFRINU9mM2VhSExIZ2lwNGZXV0M3bW5aeDFDcVZtSVY2ZEhUTDFwRVlZcDJSbmxSek4zYXV1dzJkbDJCVVRMd3E1MStaTHNOYkl4cGdmbktqR3VNSXBqVCtBK3pIUnJsWTFaVEtaV2NDaFpxQXZ1djBPZEErdlVFdTYxNnB4aEZwZ0c4UTVrNlhpWkM3eGZ2SndUZHljd1NiYThOOU9WUFp6S21GMU0wWjhUcWZFcytZenVPMEJsTFNXUElDUExHQTAzYXFEWmNGa01HZGx3aFpuWkNQNHNtNGM1Y2VZQzhDVVlNMjB0K3JRNEswakp6OTFjbFdiZ3d0UGg4cmtZK1VORXJqa1k1RXRTNmZOQXc3a096cko5a3hXU1F2ZEpGb1JzUkdEOGpUUW95dXJlNmJpbjRsVGh3YzNGb2VscTdZZHFvNkwyWlAzTzI3UVdEL0p3Q21LMHNaSEpkZFpPR0FyYXlwcnZuTnBNT2xVKzFtUUU4azZKbWswcG4rQ21BdUdZN2dtYytocWh4eEltN0NyNzRRYTBCWEZ1SmFzYTJOdFVvWHVqUFpIUUdyR0tIRjBSM2dLc2xMeGlSN2JHT1ZQSG5LV25kYnMzWXhkOGdpc21DaTNCaFhFWTFySnJyZVlDNmhreGVZZ2g4WUlWcFRUWERZRGVvejJmcXYyZWxDQkJtK3VVR2VPUGpVSGJpQk80OXdjbm5zNWJHVUhYYWpNWVcvRWRPSGZoeXVjbGg2VTFHRmFPS25BZlB3SFZUM2NHSTJHb2FMTERHSlVmZkUzRngxdDlsbHlpK0tROHJvdEpRYzk4bU5rcDFvQldSSGQ4Y2xoaXc2Tm5FWnBncko1bklBK3kwM0UwTk9oQnBnL0o4N0l5bE5ZcmVHSk4yTnByZ011aXBmTkx4UlUxNnhCL1pESGxtNER6QmhWa01oVkpvd2c5NC9WbEdSYnczeldzMFNENjgyZG9Md3hlZkIrMk42eWdXcnhBb1A0MERSeWN2cmpJT2cxUzdCa1oya3E4NkNUbUwvak5ORHZkTlVwMGR3SXdWMEJ6eVViWERROWQ5ZHR0MEdzQzJOWHpkaHRZdzBKUHdWcE5pQ3RxYUtSNE9qZlRLYU9oSE4yNDBXWnhIZWliaXIwbGhpNDYxS0VKR2JCVHBXcEVKMmhvZWxrN0JvL0tNVFM1a0loY1pOOW1IOVd2cktiRTRrS1pPN1I3cmgvSTRuR3V2Y1hNMkowNHZpTzlXVEhORnl0OXVRT3gzQnVOSjNkZGtLajQ4YTB0VE9hWUpRV3MycDBDWjErcXpmWEk4M01icXVpWllYa0dLS1pkOExvS1J3Nmp2UzZEbjloZ2p3YndPVUVGcU9uUXA1S084eWJHQTdCdXBWR0ljZnFVck5USjNKcmNqUnlCeE5JeXpLT2RWQnBHT2NGT2NYdXF6QUtscTZsWkVHUlVtcUZpS2NiN0tQaUIzQUlvTEV1QzRCeitVNzREZ1VBMFB1UU5vTGJrVzk5Ymtyd1Z1elAxY2tlWERwNUZqallYTnc4UmJ0SkRqTFMvcWp4QUg3YUhWR08wSHkwMlMvdWFvTjMwNlN6VFNLcWlmZncxWlBNZk1TTm5tMDYrNzZvamt6Nnh2TXNNWHBtbTNjbSs2NUhHeWJIQXZDRW5abzVhTXhIaHJqeExXYXRSMG1uMTJMZlJZS2tEWUIwaWcwcmxNblVRcFdHb1ZhMVQ5YjZlS3BxZWhIdEFpb2tlcEpNK3B1L09CU09UbC9WZFRvNTVRQ21sRmlXekhCNU8yWE9admMydkEyQ21GbGlGQUpwVTFNM0dEU1dSaUhlaHJSYzk4OVkyT2UxUTl4RmdVUGthQ0U5TVAxb2RiOENWSWp2UzJtQjJod29odGhkT0FnTGpRcjlGdGtZbW8zNEo5Z2Q3cU1QZGgzRzNZK1dHQWVwbHFSbzRrWmRNQmVRN3NDWWkvTE8wc3plRU4zbzNRSjJsaGJUOUpsZmExRW1VUS9KQTNEcENNN3hqNFgwalBzQVZoOEEyS0ZONmF0cDdaNFo0K21rZUV5bEdoSFd5bk82cDRQbDRFOTNvR1BBSzhNWFZvK0dUZFo0TC9DYTZURjFqNE0zNy8vM3JEVGxNUGJMbVg3NkNHSXpyU0tiNTNBZFFvMytjcThRTUNWRXVJbFJpeDB6T2tzd0d1cHVnYWNxQ2NmOWdzcnU5bkJaTE4xcS8ra29PemxpUmlweFFUWjNmeEx3TU5ManFFa1BobHVmRU13QzByV2dLcmQvcHdCMzlaTjZNRlVVb3dvdWs0MldxajRiemNsa0p6MllqQkhuTnQ3ZlV1S29KbjJxbUhIQUw4NmJhb3dEK3FDV2czbGJsYld1WGgwY1lCaFpIdEI0cG1sL2pvY3FlZHU5ZzA3Ykt3WTd4NXliL2FWbUxDby90T01ISFFWc24xZDFabG9GM3NQaEhScHc5d1NzWkErOXVhMWFEclFPTnM5cnFYdzFJS09LVU1uSjlFbUtDbmFraHRjY3RTcWgzTFdQcmcvRmdRcXlyeG5CVU9wN3JSejNvNHRJWFRSdFJTcHVOTHRkRytPN1IyWUxuM2pBZ1RkeXVIR1NFZ2FXNjFGV0dDMk5PMVo0ajdzVmZuTDA0TlA5Nk5oS24zWm5iQ3c2SWRKenVUL1gwZUlJUElXT05xb3NmYzQyTk5uY1hKbHhVQlFwNTJvTWpRUUlMM3hvM25Qd1doV1JmWkxOMUVmQW42SmNaTTFmdlNoUmkzUmkzdDZsMEhvelIyRldVWVZMby9LVjRLbzNzTzVNZEI4RHFubEZRZW9NNEZtOVZYZG9RY1pIei9DNEE0Z2lET2xGNmdhNHNkam10Qmovbk5yUmdPTlIyRVhPTlFlcmFDZ1NubUQwYWtzTXN4cVBRblN4Z0F4MzNiU0dFeE82dHlycVcreGprdGhJeVdUaDVBYzJBQk5oQnorR2JVUERMWlY3UlYwRXA2NmlNeHd5V3ZreGhJV292ZTVWN1VaR1huZ3ltT2ZnQ05tbGgzb0JSYlpHVXdJN1dBbXoySC9nRkNBQXVDaytrV0w1Y2RwenlkcDBzNFozR2NxUFR3eEswS2UxMllkMVdRRDlydm1LRjlMVU9qdFhpT2k5Nm1qVnE5TzRHcE5qYWg4YTM5NjBlVDl2TngzNmg1OW4zVEtDUk56UmdVOEFBZ2t5eWFMNitianVHOUhwbXluNkhIdm52RDBndnhkM0hEM3FHazh6MnF2ZS82WVZqc2VFckt1cHdtaEpJVDB0aTRDMHdIMjlpbWFPMklqd0VURmdiZzl5UjZyQ1JzYlJFbjZRLzBhRU1IU1BSM0FIenBValdBMWMvZEpHQXZXYWVUdU0yVG0zMnhYbmlzeE5iblJUNW4xNVZJVklQRXgySHFOOFVKZCtIZEI4d0pKQll2L3JIbDdQSGJiSWxUUFp3WnF6dVUvNEJIcHgzRFRjZ2l1N3REaHFmMmlydVZQb0llbTJHY051amZ6b3pteFd3Yy9qa1NSR0JIZWJrUll6UHZpN3d1d2xzeDdaNkRaSDE5ZE1vSk5wWjF4ZzZBblJOTkFPS01VSUxZMmdRMWEwbEl3V2NnSEE0ZGI3OEhZZC9kU2NnQzA5dXJSanVHK0M1Vmo5ZFM5cXF4bXNzZEhzL0t5TnlLYUtVYVp4emU0WVJnbXpEWjN4aURqeTlERy8vS01wSDVvSHI0MWlXN0k3cmFyNEVVU2toam1rSnNIMGI2dExPQm9qNENkRnN3SERJZlprQkhOa1BBSm5WTmlubm5pYng4b1p5Y3FDTkk4eVVoVHBMYkFidm5Sd3ZKZkFRL1JvMHJUd0tkSXQvajJENFhxOFREdmk5N0dSekhNbGJqcUFzZFZLdU14Q21CRjVNOTk5UWkxV3dnbVBlUjRpZ25JVWU4ZDM5aW1XckRodjljWk1jTnpQWXhWc2ZtUThlRVpZbVNMYVNVdktmbEFCTXg2enFPZHhMNk9meDNISEZudmR5R0cvWXBSb1JiWjFHNEM0a3NETXRqVnVNTFl4WERQcVdCSXA3ZGhkRFozY1VHbHdINzJhWXNmN0doYlJmVGltd3cvSGJWb2UzMzE0T3JzdHpIZkxtdzN6M1hodjRIcmFJK1pDeE9mSGtIRjZMVzlKeHExNGNzRGZoZFh4OUNDSkhFOWJtQnlGUHJSbXN2dThQUklJSmlSYlYzSG5aWDVtRmR6cXZab0ZqeEZJMlgraXBibk01TTFyam1qM0ZjWHB4N0VZMVEwajJHc1pYVG03WUwzWEdpMS83N3JXYkhZQXZrTnRGdEUwSzZxd2tXLzI3OVFsRHlub0hkcjNWK0pYdUNHQXJMcUJFblYvVEs3dm1PR1Exczl0Vjdnek80RmxSckFpaThodWIwVENYOGYwTjhSanQ2SE01WGhLSm04RzI2K21qdjRlVC8zUnZVbjVsQ0JtYk53OS9SQXBONURjWlE3dnhKRmxUMkVQYk12M1o0c1pNTFlNdCtyaVdKT3BLQ0JhOC9mOU1VN2VZU1U3UXZPV3k5dGZ0Q29JMnZLei9ETm1nWXk0YUcvR3FSdVlkeWlJdXN2TUdMZURWV3dpTXRaSDRLK0JYMFdxWXc4cVJBQWVwU01Sc0V6ZDUxbms1ZE9FcVNnaUNmUTBWMmtYQ3lIeFZJajFaWURXaWpLb09NWFlLOXlIYWlVVEdHV21xalkySjVtV2NtUUZreTByK1pwWjlzMWRwVHF5eTdtQVYrdG11L3lFZVhnamtybjgrSmJNTWVZWmdiMVZPb0dNWkcyanpmWTlOdVdsSGFLNjZIS2dKNjBTdktvekNTQWpYOG1mZ1N2enhVZXY2cEZHc3JMWHlBZVFHcWloa2U3YXI4ak1La1M2cnJxam9oSkFaTTZpWHV5ejRMb0x1VGpMaUoycGg4SnhsY3o3c21SZ3IzdlNJeU1SZVAvL0FNYmNmd21OUFpRNEFBQUFBRWxGVGtTdVFtQ0MnO1xuXG5jb25zdCBQQlIgPSBPYmplY3QuZnJlZXplKHtcbiAgc2hlZW5fRV9hbmRfREdUZXJtLFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFBCUjtcbiIsImltcG9ydCB7IElFbnRpdHksIEVudGl0eSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgQW5pbWF0aW9uSW50ZXJwb2xhdGlvbkVudW0gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0FuaW1hdGlvbkludGVycG9sYXRpb24nO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IFNlY29uZCwgVmVjdG9yQ29tcG9uZW50TiB9IGZyb20gJy4vQ29tbW9uVHlwZXMnO1xuXG4vKipcbiAqIGFuaW1hdGlvbiBwYXRoIG5hbWVcbiAqIHR5cGUgb2YgYW5pbWF0aW9uLmNoYW5uZWwudGFyZ2V0LnBhdGggaW4gZ2xURjJcbiAqIFNlZTogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNfYW5pbWF0aW9uX2NoYW5uZWxzXG4gKi9cbmV4cG9ydCB0eXBlIEFuaW1hdGlvblBhdGhOYW1lID1cbiAgfCAndW5kZWZpbmVkJ1xuICB8ICd0cmFuc2xhdGUnXG4gIHwgJ3F1YXRlcm5pb24nXG4gIHwgJ3NjYWxlJ1xuICB8ICd3ZWlnaHRzJ1xuICB8ICdlZmZla3NlZXInO1xuXG5leHBvcnQgdHlwZSBBbmltYXRpb25UcmFja05hbWUgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uSW5mbyB7XG4gIG5hbWU6IEFuaW1hdGlvblRyYWNrTmFtZTtcbiAgbWluU3RhcnRJbnB1dFRpbWU6IFNlY29uZDsgLy8gbWluIHN0YXJ0IHRpbWUgaW4gYWxsIGFuaW1hdGlvbiBwYXRocyBvZiB0aGUgdHJhY2tcbiAgbWF4RW5kSW5wdXRUaW1lOiBTZWNvbmQ7IC8vIG1heCBlbmQgdGltZSBpbiBhbGwgYW5pbWF0aW9uIHBhdGhzIG9mIHRoZSB0cmFja1xufVxuXG5leHBvcnQgdHlwZSBBbmltYXRpb25UcmFja3MgPSBNYXA8QW5pbWF0aW9uVHJhY2tOYW1lLCBBbmltYXRpb25UcmFjaz47XG5cbi8qKlxuICogU2ltaWxhciB0byBbQW5pbWF0aW9uXShodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI3JlZmVyZW5jZS1hbmltYXRpb24pXG4gKi9cbmV4cG9ydCB0eXBlIEFuaW1hdGlvblRyYWNrID0gTWFwPEFuaW1hdGlvblBhdGhOYW1lLCBBbmltYXRpb25DaGFubmVsPjtcblxuLyoqXG4gKiBTaW1pbGFyIHRvIFtBbmltYXRpb24uQ2hhbm5lbF0oaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNyZWZlcmVuY2UtYW5pbWF0aW9uLWNoYW5uZWwpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uQ2hhbm5lbCB7XG4gIHNhbXBsZXI6IEFuaW1hdGlvblNhbXBsZXI7XG4gIHRhcmdldDogQW5pbWF0aW9uQ2hhbm5lbFRhcmdldDtcbiAgYmVsb25nVHJhY2tOYW1lOiBBbmltYXRpb25UcmFja05hbWU7XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBbQW5pbWF0aW9uLkNoYW5uZWwuVGFyZ2V0XShodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI3JlZmVyZW5jZS1hbmltYXRpb24tY2hhbm5lbC10YXJnZXQpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uQ2hhbm5lbFRhcmdldCB7XG4gIHBhdGhOYW1lOiBBbmltYXRpb25QYXRoTmFtZTtcbiAgZW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eTtcbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIFtBbmltYXRpb24uU2FtcGxlcl0oaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNyZWZlcmVuY2UtYW5pbWF0aW9uLXNhbXBsZXIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5pbWF0aW9uU2FtcGxlciB7XG4gIGlucHV0OiBGbG9hdDMyQXJyYXk7XG4gIG91dHB1dDogRmxvYXQzMkFycmF5O1xuICBvdXRwdXRDb21wb25lbnROOiBWZWN0b3JDb21wb25lbnROO1xuICBpbnRlcnBvbGF0aW9uTWV0aG9kOiBBbmltYXRpb25JbnRlcnBvbGF0aW9uRW51bTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VBbmltYXRpb25JbmZvRXZlbnQge1xuICBpbmZvTWFwOiBNYXA8QW5pbWF0aW9uVHJhY2tOYW1lLCBBbmltYXRpb25JbmZvPjtcbn1cblxuZXhwb3J0IHR5cGUgQW5pbWF0aW9uQ29tcG9uZW50RXZlbnRUeXBlID0gc3ltYm9sO1xuIiwiZGVjbGFyZSBjbGFzcyBfQmFzaXNGaWxlIHtcbiAgY29uc3RydWN0b3IoeDogVWludDhBcnJheSk7XG4gIGNsb3NlKCk6IHZvaWQ7XG4gIGdldEhhc0FscGhhKCk6IG51bWJlcjtcbiAgZ2V0TnVtSW1hZ2VzKCk6IG51bWJlcjtcbiAgZ2V0TnVtTGV2ZWxzKGltYWdlSW5kZXg6IG51bWJlcik6IG51bWJlcjtcbiAgZ2V0SW1hZ2VXaWR0aChpbWFnZUluZGV4OiBudW1iZXIsIGxldmVsSW5kZXg6IG51bWJlcik6IG51bWJlcjtcbiAgZ2V0SW1hZ2VIZWlnaHQoaW1hZ2VJbmRleDogbnVtYmVyLCBsZXZlbEluZGV4OiBudW1iZXIpOiBudW1iZXI7XG4gIGdldEltYWdlVHJhbnNjb2RlZFNpemVJbkJ5dGVzKGltYWdlSW5kZXg6IG51bWJlciwgbGV2ZWxJbWRleDogbnVtYmVyLCBmb3JtYXQ6IG51bWJlcik6IG51bWJlcjtcbiAgc3RhcnRUcmFuc2NvZGluZygpOiBudW1iZXI7XG4gIHRyYW5zY29kZUltYWdlKFxuICAgIGRzdDogVWludDhBcnJheSxcbiAgICBpbWFnZUluZGV4OiBudW1iZXIsXG4gICAgbGV2ZWxJbmRleDogbnVtYmVyLFxuICAgIGZvcm1hdDogbnVtYmVyLFxuICAgIHVudXNlZDogbnVtYmVyLFxuICAgIGdldEFscGhhRm9yT3BhcXVlRm9ybWF0czogbnVtYmVyXG4gICk6IG51bWJlcjtcbiAgZGVsZXRlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2lzRmlsZSA9IF9CYXNpc0ZpbGU7XG5cbmV4cG9ydCB0eXBlIEJhc2lzVHJhbnNjb2RlciA9IHtcbiAgQmFzaXNGaWxlOiBuZXcgKHg6IFVpbnQ4QXJyYXkpID0+IEJhc2lzRmlsZTtcbiAgaW5pdGlhbGl6ZUJhc2lzOiAoKSA9PiB2b2lkO1xufTtcblxuZGVjbGFyZSBmdW5jdGlvbiBfQkFTSVMoKToge1xuICB0aGVuOiAoY2FsbGJhY2s6IChiYXNpc1RyYW5zY29kZXI6IEJhc2lzVHJhbnNjb2RlcikgPT4gdm9pZCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIEJBU0lTID0gdHlwZW9mIF9CQVNJUztcbiIsImV4cG9ydCB0eXBlIFR5cGVkQXJyYXkgPVxuICB8IEludDhBcnJheVxuICB8IFVpbnQ4QXJyYXlcbiAgfCBVaW50OENsYW1wZWRBcnJheVxuICB8IEludDE2QXJyYXlcbiAgfCBVaW50MTZBcnJheVxuICB8IEludDMyQXJyYXlcbiAgfCBVaW50MzJBcnJheVxuICB8IEZsb2F0MzJBcnJheVxuICB8IEZsb2F0NjRBcnJheTtcbmV4cG9ydCB0eXBlIEZsb2F0VHlwZWRBcnJheSA9IEZsb2F0MzJBcnJheSB8IEZsb2F0NjRBcnJheTtcbmV4cG9ydCB0eXBlIEludGVnZXJUeXBlZEFycmF5ID0gSW50OEFycmF5IHwgVWludDhBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MTZBcnJheTtcbmV4cG9ydCB0eXBlIEFycmF5VHlwZSA9IFR5cGVkQXJyYXkgfCBBcnJheTxudW1iZXI+O1xuXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5Q29uc3RydWN0b3IgPVxuICB8IEludDhBcnJheUNvbnN0cnVjdG9yXG4gIHwgVWludDhBcnJheUNvbnN0cnVjdG9yXG4gIHwgVWludDhDbGFtcGVkQXJyYXlDb25zdHJ1Y3RvclxuICB8IEludDE2QXJyYXlDb25zdHJ1Y3RvclxuICB8IFVpbnQxNkFycmF5Q29uc3RydWN0b3JcbiAgfCBJbnQzMkFycmF5Q29uc3RydWN0b3JcbiAgfCBVaW50MzJBcnJheUNvbnN0cnVjdG9yXG4gIHwgRmxvYXQzMkFycmF5Q29uc3RydWN0b3JcbiAgfCBGbG9hdDY0QXJyYXlDb25zdHJ1Y3RvcjtcblxuZXhwb3J0IHR5cGUgRmxvYXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvciB8IEZsb2F0NjRBcnJheUNvbnN0cnVjdG9yO1xuXG5leHBvcnQgdHlwZSBBcnJheTE2PFQ+ID0gW1QsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFRdO1xuZXhwb3J0IHR5cGUgQXJyYXk5PFQ+ID0gW1QsIFQsIFQsIFQsIFQsIFQsIFQsIFQsIFRdO1xuZXhwb3J0IHR5cGUgcHJpbWl0aXZlcyA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBBcnJheTQ8VD4gPSBbVCwgVCwgVCwgVF07XG5leHBvcnQgdHlwZSBBcnJheTM8VD4gPSBbVCwgVCwgVF07XG5leHBvcnQgdHlwZSBBcnJheTI8VD4gPSBbVCwgVF07XG5leHBvcnQgdHlwZSBBcnJheTE8VD4gPSBbVF07XG5leHBvcnQgdHlwZSBBcnJheTF0bzQ8VD4gPSBBcnJheTE8VD4gfCBBcnJheTI8VD4gfCBBcnJheTM8VD4gfCBBcnJheTQ8VD47XG5leHBvcnQgdHlwZSBWZWN0b3JDb21wb25lbnROID0gMSB8IDIgfCAzIHwgNDtcbmV4cG9ydCB0eXBlIFZlY3RvckFuZFNxdWFyZU1hdHJpeENvbXBvbmVudE4gPSAxIHwgMiB8IDMgfCA0IHwgOSB8IDE2O1xuZXhwb3J0IHR5cGUgU3F1YXJlTWF0cml4Q29tcG9uZW50TiA9IDQgfCA5IHwgMTY7XG5leHBvcnQgdHlwZSBJbmRleCA9IG51bWJlcjtcbmV4cG9ydCB0eXBlIEluZGV4T2YxNkJ5dGVzID0gbnVtYmVyO1xuZXhwb3J0IHR5cGUgSW5kZXhPZjRCeXRlcyA9IG51bWJlcjtcbmV4cG9ydCB0eXBlIE9mZnNldCA9IG51bWJlcjtcbmV4cG9ydCB0eXBlIFNpemUgPSBudW1iZXI7XG5leHBvcnQgdHlwZSBDb3VudCA9IG51bWJlcjtcbmV4cG9ydCB0eXBlIEJ5dGUgPSBudW1iZXI7XG5leHBvcnQgdHlwZSBTZWNvbmQgPSBudW1iZXI7XG5leHBvcnQgdHlwZSBNaWxsaVNlY29uZCA9IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VUlEID0gSW5kZXg7XG5leHBvcnQgdHlwZSBQcmltaXRpdmVVSUQgPSBJbmRleDtcbmV4cG9ydCB0eXBlIEVudGl0eVVJRCA9IEluZGV4O1xuZXhwb3J0IHR5cGUgQ29tcG9uZW50VElEID0gSW5kZXg7XG5leHBvcnQgdHlwZSBDb21wb25lbnRTSUQgPSBJbmRleDtcblxuZXhwb3J0IHR5cGUgTWF0ZXJpYWxOb2RlVUlEID0gSW5kZXg7XG5leHBvcnQgdHlwZSBNYXRlcmlhbFVJRCA9IEluZGV4OyAvLyBhIHVuaXF1ZSBudW1iZXIgb2YgYW55IE1hdGVyaWFsXG5leHBvcnQgdHlwZSBNYXRlcmlhbFNJRCA9IEluZGV4OyAvLyBhIHNlcmlhbCBudW1iZXIgaW4gdGhlIE1hdGVyaWFsIFR5cGVcbmV4cG9ydCB0eXBlIE1hdGVyaWFsVElEID0gSW5kZXg7IC8vIGEgdHlwZSBudW1iZXIgb2YgdGhlIE1hdGVyaWFsIFR5cGVcbmV4cG9ydCB0eXBlIFRleHR1cmVVSUQgPSBJbmRleDtcbmV4cG9ydCB0eXBlIE1lc2hVSUQgPSBJbmRleDtcbmV4cG9ydCB0eXBlIENhbWVyYVNJRCA9IEluZGV4O1xuZXhwb3J0IHR5cGUgUmVuZGVyUGFzc1VJRCA9IEluZGV4O1xuXG5leHBvcnQgdHlwZSBXZWJHTFJlc291cmNlSGFuZGxlID0gbnVtYmVyO1xuZXhwb3J0IHR5cGUgV2ViR1BVUmVzb3VyY2VIYW5kbGUgPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIENHQVBJUmVzb3VyY2VIYW5kbGUgPSBXZWJHTFJlc291cmNlSGFuZGxlO1xuXG5leHBvcnQgdHlwZSBSblRhZ3MgPSB7IFtzOiBzdHJpbmddOiBhbnkgfTtcblxuZXhwb3J0IHR5cGUgQ29sb3JDb21wb25lbnRMZXR0ZXIgPSAncicgfCAnZycgfCAnYicgfCAnYSc7XG4iLCJ0eXBlIFRleHR1cmVGb3JtYXQgPSB7IHZhbHVlOiBudW1iZXIgfTtcbnR5cGUgX1RleHR1cmVGb3JtYXQgPSB7XG4gIEVUQzFTOiBUZXh0dXJlRm9ybWF0O1xuICBVQVNUQzR4NDogVGV4dHVyZUZvcm1hdDtcbn07XG5cbmV4cG9ydCB0eXBlIFRyYW5zY29kZVRhcmdldCA9IHsgdmFsdWU6IG51bWJlciB9O1xudHlwZSBfVHJhbnNjb2RlVGFyZ2V0ID0ge1xuICBFVEMxX1JHQjogVHJhbnNjb2RlVGFyZ2V0O1xuICBCQzFfUkdCOiBUcmFuc2NvZGVUYXJnZXQ7XG4gIEJDNF9SOiBUcmFuc2NvZGVUYXJnZXQ7XG4gIEJDNV9SRzogVHJhbnNjb2RlVGFyZ2V0O1xuICBCQzNfUkdCQTogVHJhbnNjb2RlVGFyZ2V0O1xuICBQVlJUQzFfNF9SR0I6IFRyYW5zY29kZVRhcmdldDtcbiAgUFZSVEMxXzRfUkdCQTogVHJhbnNjb2RlVGFyZ2V0O1xuICBCQzdfUkdCQTogVHJhbnNjb2RlVGFyZ2V0O1xuICBCQzdfTTZfUkdCOiBUcmFuc2NvZGVUYXJnZXQ7XG4gIEJDN19NNV9SR0JBOiBUcmFuc2NvZGVUYXJnZXQ7XG4gIEVUQzJfUkdCQTogVHJhbnNjb2RlVGFyZ2V0O1xuICBBU1RDXzR4NF9SR0JBOiBUcmFuc2NvZGVUYXJnZXQ7XG4gIFJHQkEzMjogVHJhbnNjb2RlVGFyZ2V0O1xuICBSR0I1NjU6IFRyYW5zY29kZVRhcmdldDtcbiAgQkdSNTY1OiBUcmFuc2NvZGVUYXJnZXQ7XG4gIFJHQkE0NDQ0OiBUcmFuc2NvZGVUYXJnZXQ7XG4gIFBWUlRDMl80X1JHQjogVHJhbnNjb2RlVGFyZ2V0O1xuICBQVlJUQzJfNF9SR0JBOiBUcmFuc2NvZGVUYXJnZXQ7XG4gIEVBQ19SMTE6IFRyYW5zY29kZVRhcmdldDtcbiAgRUFDX1JHMTE6IFRyYW5zY29kZVRhcmdldDtcbn07XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEltYWdlSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHRleHR1cmVGb3JtYXQ6IFRleHR1cmVGb3JtYXQsIGxldmVsV2lkdGg6IG51bWJlciwgbGV2ZWxIZWlnaHQ6IG51bWJlciwgbGV2ZWw6IG51bWJlcik7XG4gIG51bUJsb2Nrc1g6IG51bWJlcjtcbiAgbnVtQmxvY2tzWTogbnVtYmVyO1xuICBmbGFnczogbnVtYmVyO1xuICByZ2JCeXRlT2Zmc2V0OiBudW1iZXI7XG4gIHJnYkJ5dGVMZW5ndGg6IG51bWJlcjtcbiAgYWxwaGFCeXRlT2Zmc2V0OiBudW1iZXI7XG4gIGFscGhhQnl0ZUxlbmd0aDogbnVtYmVyO1xufVxuXG50eXBlIF9JbWFnZUluZm8gPSBuZXcgKFxuICB0ZXh0dXJlRm9ybWF0OiBUZXh0dXJlRm9ybWF0LFxuICBsZXZlbFdpZHRoOiBudW1iZXIsXG4gIGxldmVsSGVpZ2h0OiBudW1iZXIsXG4gIGxldmVsOiBudW1iZXJcbikgPT4gSW1hZ2VJbmZvO1xuXG5leHBvcnQgdHlwZSBUcmFuc2NvZGVkSW1hZ2UgPSB7XG4gIHRyYW5zY29kZWRJbWFnZToge1xuICAgIGdldF90eXBlZF9tZW1vcnlfdmlldzogKCkgPT4gVWludDhBcnJheTtcbiAgICBkZWxldGU6ICgpID0+IHZvaWQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBVYXN0Y0ltYWdlVHJhbnNjb2RlciB7XG4gIHRyYW5zY29kZUltYWdlOiAoXG4gICAgdHJhbnNjb2RlVGFyZ2V0OiBUcmFuc2NvZGVUYXJnZXQsXG4gICAgZmFjZUJ1ZmZlcjogVWludDhBcnJheSxcbiAgICBpbWFnZUluZm86IEltYWdlSW5mbyxcbiAgICBkZWNvZGVGbGFnczogMCxcbiAgICBoYXNBbHBoYTogYm9vbGVhbixcbiAgICBpc1ZpZGVvOiBib29sZWFuXG4gICkgPT4gVHJhbnNjb2RlZEltYWdlIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBCYXNpc0x6RXRjMXNJbWFnZVRyYW5zY29kZXIge1xuICB0cmFuc2NvZGVJbWFnZTogKFxuICAgIHRyYW5zY29kZVRhcmdldDogVHJhbnNjb2RlVGFyZ2V0LFxuICAgIGZhY2VCdWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgaW1hZ2VJbmZvOiBJbWFnZUluZm8sXG4gICAgZGVjb2RlRmxhZ3M6IDAsXG4gICAgaXNWaWRlbzogYm9vbGVhblxuICApID0+IFRyYW5zY29kZWRJbWFnZSB8IHVuZGVmaW5lZDtcbiAgZGVjb2RlUGFsZXR0ZXM6IChcbiAgICBudW1FbmRwb2ludHM6IG51bWJlcixcbiAgICBlbmRwb2ludHM6IFVpbnQ4QXJyYXksXG4gICAgbnVtU2VsZWN0b3JzOiBudW1iZXIsXG4gICAgc2VsZWN0b3JzOiBVaW50OEFycmF5XG4gICkgPT4gdm9pZDtcbiAgZGVjb2RlVGFibGVzOiAodGFibGVzOiBVaW50OEFycmF5KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBNc2NUcmFuc2NvZGVyTW9kdWxlID0ge1xuICBpbml0VHJhbnNjb2RlcnM6ICgpID0+IHZvaWQ7XG4gIFRleHR1cmVGb3JtYXQ6IF9UZXh0dXJlRm9ybWF0O1xuICBUcmFuc2NvZGVUYXJnZXQ6IF9UcmFuc2NvZGVUYXJnZXQ7XG4gIEltYWdlSW5mbzogX0ltYWdlSW5mbztcbiAgVWFzdGNJbWFnZVRyYW5zY29kZXI6IG5ldyAoKSA9PiBVYXN0Y0ltYWdlVHJhbnNjb2RlcjtcbiAgQmFzaXNMekV0YzFzSW1hZ2VUcmFuc2NvZGVyOiBuZXcgKCkgPT4gQmFzaXNMekV0YzFzSW1hZ2VUcmFuc2NvZGVyO1xufTtcblxuZXhwb3J0IHR5cGUgTVNDX1RSQU5TQ09ERVIgPSAoKSA9PiBQcm9taXNlPE1zY1RyYW5zY29kZXJNb2R1bGU+O1xuIiwiaW1wb3J0IHsgUm5Qcm9taXNlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL1JuUHJvbWlzZSc7XG5pbXBvcnQgeyBBcnJheTMsIEFycmF5NCB9IGZyb20gJy4vQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IEFjY2Vzc29yIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tZW1vcnkvQWNjZXNzb3InO1xuaW1wb3J0IHsgR2x0ZjJBbmltYXRpb25TYW1wbGVySW50ZXJwb2xhdGlvbiwgR2x0ZjJBbnlPYmplY3QsIEdsdGZMb2FkT3B0aW9uIH0gZnJvbSAnLi9nbFRGMic7XG5pbXBvcnQgeyBJU2NlbmVHcmFwaEVudGl0eSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vaGVscGVycy9FbnRpdHlIZWxwZXInO1xuXG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI3JlZmVyZW5jZS1nbHRmXG5leHBvcnQgdHlwZSBSbk0yID0ge1xuICBleHRlbnNpb25zVXNlZDogc3RyaW5nW107XG4gIGV4dGVuc2lvbnNSZXF1aXJlZDogc3RyaW5nW107XG4gIGFjY2Vzc29yczogUm5NMkFjY2Vzc29yW107XG4gIGFuaW1hdGlvbnM6IFJuTTJBbmltYXRpb25bXTtcbiAgYXNzZXQ6IFJuTTJBc3NldDtcbiAgYnVmZmVyczogUm5NMkJ1ZmZlcltdO1xuICBidWZmZXJWaWV3czogUm5NMkJ1ZmZlclZpZXdbXTtcbiAgY2FtZXJhczogUm5NMkNhbWVyYVtdO1xuICBpbWFnZXM6IFJuTTJJbWFnZVtdO1xuICBtYXRlcmlhbHM6IFJuTTJNYXRlcmlhbFtdO1xuICBtZXNoZXM6IFJuTTJNZXNoW107XG4gIG5vZGVzOiBSbk0yTm9kZVtdO1xuICBzYW1wbGVyczogUm5NMlRleHR1cmVTYW1wbGVyW107XG4gIHNjZW5lOiBudW1iZXI7XG4gIHNjZW5lczogUm5NMlNjZW5lW107XG4gIHNraW5zOiBSbk0yU2tpbltdO1xuICB0ZXh0dXJlcz86IFJuTTJUZXh0dXJlW107XG4gIGV4dGVuc2lvbnM6IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM6IHtcbiAgICBybkVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdO1xuICAgIHJuRW50aXRpZXNCeU5hbWVzOiBNYXA8c3RyaW5nLCBJU2NlbmVHcmFwaEVudGl0eT47XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufTtcblxuLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNyZWZlcmVuY2Utc2NlbmVcbmV4cG9ydCB0eXBlIFJuTTJTY2VuZSA9IHtcbiAgbm9kZXNPYmplY3RzPzogUm5NMk5vZGVbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgc2NlbmU/OiBudW1iZXI7XG4gIHNjZW5lT2JqZWN0PzogUm5NMk5vZGU7XG4gIG5vZGVzPzogbnVtYmVyW107XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yQXR0cmlidXRlc09iamVjdCA9IHtcbiAgW3M6IHN0cmluZ106IFJuTTJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJBdHRyaWJ1dGVzID0geyBbczogc3RyaW5nXTogbnVtYmVyIH07XG5leHBvcnQgdHlwZSBSbk0yQXR0cmlidXRlQWNjZXNzb3JzID0geyBbczogc3RyaW5nXTogUm5NMkFjY2Vzc29yIH07XG5leHBvcnQgdHlwZSBSbk0yQXR0cmlidXRlQmxlbmRTaGFwZXMgPSBSbk0yQXR0cmlidXRlc1tdO1xuZXhwb3J0IHR5cGUgUm5NMkF0dHJpYnV0ZUJsZW5kU2hhcGVzQWNjZXNzb3JzID0gUm5NMkF0dHJpYnV0ZUFjY2Vzc29yc1tdO1xuXG5leHBvcnQgdHlwZSBSbk0yTWF0ZXJpYWxWYXJpYW50ID0ge1xuICBtYXRlcmlhbE9iamVjdDogUm5NMk1hdGVyaWFsO1xuICBtYXRlcmlhbDogbnVtYmVyO1xuICB2YXJpYW50czogc3RyaW5nW107XG59O1xuXG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbFRGL3NwZWNzLzIuMC9nbFRGLTIuMC5odG1sI3JlZmVyZW5jZS1tZXNoLXByaW1pdGl2ZVxuZXhwb3J0IHR5cGUgUm5NMlByaW1pdGl2ZSA9IHtcbiAgYXR0cmlidXRlc09iamVjdHM/OiBSbk0yQXR0cmlidXRlQWNjZXNzb3JzO1xuICBhdHRyaWJ1dGVzTmFtZXM/OiB7IFtzOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgYXR0cmlidXRlcz86IHsgW3M6IHN0cmluZ106IG51bWJlciB9O1xuICBpbmRpY2VzT2JqZWN0PzogUm5NMkFjY2Vzc29yO1xuICBpbmRpY2VzPzogbnVtYmVyO1xuICBtYXRlcmlhbE9iamVjdD86IFJuTTJNYXRlcmlhbDtcbiAgbWF0ZXJpYWxWYXJpYW50cz86IFJuTTJNYXRlcmlhbFZhcmlhbnRbXTtcbiAgbWF0ZXJpYWw/OiBudW1iZXI7XG4gIG1hdGVyaWFsTmFtZT86IHN0cmluZztcbiAgbW9kZT86IG51bWJlcjtcbiAgdGFyZ2V0c09iamVjdHM/OiBSbk0yQXR0cmlidXRlQmxlbmRTaGFwZXNBY2Nlc3NvcnM7XG4gIHRhcmdldHM/OiBSbk0yQXR0cmlidXRlQmxlbmRTaGFwZXM7XG4gIGV4dGVuc2lvbnM6IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbi8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsVEYvc3BlY3MvMi4wL2dsVEYtMi4wLmh0bWwjcmVmZXJlbmNlLW1lc2hcbmV4cG9ydCB0eXBlIFJuTTJNZXNoID0ge1xuICBwcmltaXRpdmVzOiBSbk0yUHJpbWl0aXZlW107XG4gIHdlaWdodHM/OiBudW1iZXJbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9uczogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xURi9zcGVjcy8yLjAvZ2xURi0yLjAuaHRtbCNyZWZlcmVuY2Utbm9kZVxuZXhwb3J0IHR5cGUgUm5NMk5vZGUgPSB7XG4gIGNhbWVyYU9iamVjdD86IFJuTTJDYW1lcmE7XG4gIGNhbWVyYT86IG51bWJlcjtcbiAgY2hpbGRyZW5PYmplY3RzPzogUm5NMk5vZGVbXTtcbiAgY2hpbGRyZW4/OiBudW1iZXJbXTtcbiAgc2tpbk9iamVjdD86IFJuTTJTa2luO1xuICBza2luPzogbnVtYmVyO1xuICBza2luTmFtZT86IHN0cmluZztcbiAgbWF0cml4PzogbnVtYmVyW107XG4gIG1lc2hPYmplY3Q/OiBSbk0yTWVzaDtcbiAgbWVzaD86IG51bWJlcjtcbiAgbWVzaE5hbWVzPzogc3RyaW5nW107XG4gIHJvdGF0aW9uPzogbnVtYmVyW107XG4gIHNjYWxlPzogbnVtYmVyW107XG4gIHRyYW5zbGF0aW9uPzogbnVtYmVyW107XG4gIHdlaWdodHM/OiBudW1iZXJbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJTa2luID0ge1xuICBpbnZlcnNlQmluZE1hdHJpY2VzPzogbnVtYmVyO1xuICBpbnZlcnNlQmluZE1hdHJpY2VzT2JqZWN0PzogUm5NMkFjY2Vzc29yO1xuICBiaW5kU2hhcGVNYXRyaXg/OiBudW1iZXJbXTtcbiAgc2tlbGV0b24/OiBudW1iZXI7XG4gIHNrZWxldG9uT2JqZWN0PzogUm5NMk5vZGU7XG4gIGpvaW50czogbnVtYmVyW107XG4gIGpvaW50c09iamVjdHM6IFJuTTJOb2RlW107XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yVGV4dHVyZUluZm8gPSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIHRleENvb3JkPzogbnVtYmVyO1xuICB0ZXh0dXJlPzogUm5NMlRleHR1cmU7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yT2NjbHVzaW9uVGV4dHVyZUluZm8gPSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIHRleENvb3JkPzogbnVtYmVyO1xuICB0ZXh0dXJlPzogUm5NMlRleHR1cmU7XG4gIHN0cmVuZ3RoPzogbnVtYmVyO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMk5vcm1hbFRleHR1cmVJbmZvID0ge1xuICBpbmRleDogbnVtYmVyO1xuICB0ZXhDb29yZD86IG51bWJlcjtcbiAgdGV4dHVyZT86IFJuTTJUZXh0dXJlO1xuICBzY2FsZT86IG51bWJlcjtcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJQYnJNZXRhbGxpY1JvdWdobmVzcyA9IHtcbiAgYmFzZUNvbG9yRmFjdG9yPzogQXJyYXk0PG51bWJlcj47XG4gIGJhc2VDb2xvclRleHR1cmU/OiBSbk0yVGV4dHVyZUluZm87XG4gIG1ldGFsbGljRmFjdG9yPzogbnVtYmVyO1xuICByb3VnaG5lc3NGYWN0b3I/OiBudW1iZXI7XG4gIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZT86IFJuTTJUZXh0dXJlSW5mbztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJNYXRlcmlhbCA9IHtcbiAgcGJyTWV0YWxsaWNSb3VnaG5lc3M/OiBSbk0yUGJyTWV0YWxsaWNSb3VnaG5lc3M7XG4gIG5vcm1hbFRleHR1cmU/OiBSbk0yTm9ybWFsVGV4dHVyZUluZm87XG4gIG9jY2x1c2lvblRleHR1cmU/OiBSbk0yT2NjbHVzaW9uVGV4dHVyZUluZm87XG4gIGVtaXNzaXZlVGV4dHVyZT86IFJuTTJUZXh0dXJlSW5mbztcbiAgZW1pc3NpdmVGYWN0b3I/OiBBcnJheTM8bnVtYmVyPjtcbiAgZGlmZnVzZVRleHR1cmU/OiBSbk0yVGV4dHVyZUluZm87XG4gIGRpZmZ1c2VDb2xvckZhY3Rvcj86IG51bWJlcltdO1xuICBhbHBoYU1vZGU/OiBzdHJpbmc7XG4gIGFscGhhQ3V0b2ZmPzogbnVtYmVyO1xuICBkb3VibGVTaWRlZD86IGJvb2xlYW47XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yQ2FtZXJhT3J0aG9ncmFwaGljID0ge1xuICB4bWFnOiBudW1iZXI7XG4gIHltYWc6IG51bWJlcjtcbiAgemZhcjogbnVtYmVyO1xuICB6bmVhcjogbnVtYmVyO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkNhbWVyYVBlcnNwZWN0aXZlID0ge1xuICBhc3BlY3RSYXRpbz86IG51bWJlcjtcbiAgeWZvdjogbnVtYmVyO1xuICB6ZmFyPzogbnVtYmVyO1xuICB6bmVhcjogbnVtYmVyO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkNhbWVyYSA9IHtcbiAgb3J0aG9ncmFwaGljPzogUm5NMkNhbWVyYU9ydGhvZ3JhcGhpYztcbiAgcGVyc3BlY3RpdmU/OiBSbk0yQ2FtZXJhUGVyc3BlY3RpdmU7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJJbWFnZSA9IHtcbiAgdXJpPzogc3RyaW5nO1xuICBtaW1lVHlwZT86IHN0cmluZztcbiAgYnVmZmVyVmlldz86IG51bWJlcjtcbiAgaW1hZ2U/OiBIVE1MSW1hZ2VFbGVtZW50O1xuICBiYXNpcz86IFVpbnQ4QXJyYXk7XG4gIGt0eDI/OiBVaW50OEFycmF5O1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUGF0aFR5cGUgPSAndHJhbnNsYXRpb24nIHwgJ3JvdGF0aW9uJyB8ICdzY2FsZScgfCAnd2VpZ2h0cyc7XG5cbmV4cG9ydCB0eXBlIFJuTTJBbmltYXRpb25DaGFubmVsVGFyZ2V0ID0ge1xuICBub2RlT2JqZWN0PzogUm5NMk5vZGU7XG4gIG5vZGU/OiBudW1iZXI7XG4gIHBhdGg6IFBhdGhUeXBlO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkFuaW1hdGlvbkNoYW5uZWwgPSB7XG4gIHNhbXBsZXI6IG51bWJlcjtcbiAgdGFyZ2V0OiBSbk0yQW5pbWF0aW9uQ2hhbm5lbFRhcmdldDtcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcblxuICAvLyBSbk0yIFByb3BlcnRpZXNcbiAgc2FtcGxlck9iamVjdD86IFJuTTJBbmltYXRpb25TYW1wbGVyO1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkFuaW1hdGlvblNhbXBsZXIgPSB7XG4gIGlucHV0OiBudW1iZXI7XG4gIG91dHB1dDogbnVtYmVyO1xuICBpbnRlcnBvbGF0aW9uPzogR2x0ZjJBbmltYXRpb25TYW1wbGVySW50ZXJwb2xhdGlvbjtcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcblxuICAvLyBSbk0yIFByb3BlcnRpZXNcbiAgaW5wdXRPYmplY3Q/OiBSbk0yQWNjZXNzb3I7XG4gIG91dHB1dE9iamVjdD86IFJuTTJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJBbmltYXRpb24gPSB7XG4gIGNoYW5uZWxzOiBSbk0yQW5pbWF0aW9uQ2hhbm5lbFtdO1xuICBzYW1wbGVyczogUm5NMkFuaW1hdGlvblNhbXBsZXJbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcblxuICAvLyBSbk0yIFByb3BlcnRpZXNcbiAgcGFyYW1ldGVyczogeyBbczogc3RyaW5nXTogYW55IH07XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yVGV4dHVyZSA9IHtcbiAgc2FtcGxlck9iamVjdD86IFJuTTJUZXh0dXJlU2FtcGxlcjtcbiAgc2FtcGxlcj86IG51bWJlcjtcbiAgc291cmNlT2JqZWN0PzogUm5NMkltYWdlO1xuICBzb3VyY2U/OiBudW1iZXI7XG4gIGltYWdlPzogUm5NMkltYWdlO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMlRleHR1cmVTYW1wbGVyID0ge1xuICBtYWdGaWx0ZXI/OiBudW1iZXI7XG4gIG1pbkZpbHRlcj86IG51bWJlcjtcbiAgd3JhcFM/OiBudW1iZXI7XG4gIHdyYXBUPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMlNwYXJzZVZhbHVlcyA9IHtcbiAgYnVmZmVyVmlldzogbnVtYmVyO1xuICBidWZmZXJWaWV3T2JqZWN0OiBSbk0yQnVmZmVyVmlldztcbiAgYnl0ZU9mZnNldD86IG51bWJlcjtcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFJuTTJTcGFyc2VJbmRpY2VzID0ge1xuICBidWZmZXJWaWV3OiBudW1iZXI7XG4gIGJ1ZmZlclZpZXdPYmplY3Q6IFJuTTJCdWZmZXJWaWV3O1xuICBieXRlT2Zmc2V0PzogbnVtYmVyO1xuICBjb21wb25lbnRUeXBlOiBudW1iZXI7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yU3BhcnNlID0ge1xuICBjb3VudDogbnVtYmVyO1xuICBpbmRpY2VzPzogUm5NMlNwYXJzZUluZGljZXM7XG4gIHZhbHVlcz86IFJuTTJTcGFyc2VWYWx1ZXM7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yQWNjZXNzb3IgPSB7XG4gIGJ1ZmZlclZpZXdPYmplY3Q/OiBSbk0yQnVmZmVyVmlldztcbiAgYnVmZmVyVmlldz86IG51bWJlcjtcbiAgYnVmZmVyVmlld05hbWU/OiBzdHJpbmc7XG4gIGJ5dGVPZmZzZXQ/OiBudW1iZXI7XG4gIGJ5dGVTdHJpZGU/OiBudW1iZXI7IC8vIGZvciBnbFRGMSBvbmx5XG4gIGNvbXBvbmVudFR5cGU6IG51bWJlcjtcbiAgbm9ybWFsaXplZD86IGJvb2xlYW47XG4gIGNvdW50OiBudW1iZXI7XG4gIHR5cGU6IHN0cmluZztcbiAgbWF4PzogbnVtYmVyW107XG4gIG1pbj86IG51bWJlcltdO1xuICBzcGFyc2U/OiBSbk0yU3BhcnNlO1xuICBuYW1lPzogc3RyaW5nO1xuICBhY2Nlc3Nvcj86IEFjY2Vzc29yO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBzdHJpbmc7XG4gICAgdG9HZXRBc1R5cGVkQXJyYXk6IGJvb2xlYW47XG4gICAgdHlwZWREYXRhQXJyYXk/OiBGbG9hdDMyQXJyYXk7XG4gICAgY29tcG9uZW50Tj86IG51bWJlcjtcbiAgICBjb21wb25lbnRCeXRlcz86IG51bWJlcjtcbiAgICBkYXRhVmlld01ldGhvZD86IHN0cmluZztcbiAgICB3ZWlnaHRzQXJyYXlMZW5ndGg/OiBudW1iZXI7XG4gICAgcXVhdGVybmlvbklmVmVjND86IGJvb2xlYW47XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yQnVmZmVyID0ge1xuICB1cmk/OiBzdHJpbmc7XG4gIGJ5dGVMZW5ndGg6IG51bWJlcjtcbiAgYnVmZmVyPzogVWludDhBcnJheTsgLy8gVWludDhBcnJheSBpcyBuZWVkZWQgaW5zdGVhZCBvZiBBcnJheUJ1ZmZlciwgYmVjYXVzZSBpdCBtYXkgaGF2ZSBub24temVybyBieXRlb2Zmc2V0IGZvciAuZ2xiIGZpbGUgaGVhZGVyXG4gIGRhdGFVcmk/OiBzdHJpbmc7XG4gIGJ1ZmZlclByb21pc2U/OiBSblByb21pc2U8QXJyYXlCdWZmZXI+O1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkJ1ZmZlclZpZXcgPSB7XG4gIGJ1ZmZlck9iamVjdD86IFJuTTJCdWZmZXI7XG4gIGJ1ZmZlcj86IG51bWJlcjtcbiAgYnVmZmVyTmFtZT86IHN0cmluZztcbiAgYnl0ZU9mZnNldD86IG51bWJlcjtcbiAgYnl0ZUxlbmd0aDogbnVtYmVyO1xuICBieXRlU3RyaWRlPzogbnVtYmVyO1xuICB0YXJnZXQ6IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgcm5BY2Nlc3Nvcj86IEFjY2Vzc29yO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkFzc2V0ID0ge1xuICBjb3B5cmlnaHQ/OiBzdHJpbmc7XG4gIGdlbmVyYXRvcj86IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBtaW5WZXJzaW9uPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogb2JqZWN0O1xuICBleHRyYXM/OiB7XG4gICAgcm5Mb2FkZXJPcHRpb25zPzogR2x0ZkxvYWRPcHRpb247XG4gICAgcm5FbnRpdGllcz86IElTY2VuZUdyYXBoRW50aXR5W107XG4gICAgcm5NYXRlcmlhbHM/OiB7IFtzOiBzdHJpbmddOiBNYXRlcmlhbCB9O1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgZmlsZVR5cGU/OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yRXh0ZW5zaW9uRWZmZWtzZWVyID0ge1xuICBlZmZlY3RzOiBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlckVmZmVjdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm5NMkV4dGVuc2lvbnNFZmZla3NlZXJFZmZlY3QgPSB7XG4gIG5vZGU6IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgdXJpPzogc3RyaW5nO1xuICBidWZmZXJWaWV3PzogbnVtYmVyO1xuICB0aW1lbGluZXM/OiBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlclRpbWVsaW5lW107XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlclRpbWVsaW5lID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICB2YWx1ZXM6IFJuTTJFeHRlbnNpb25zRWZmZWtzZWVyVGltZWxpbmVJdGVtW107XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yRXh0ZW5zaW9uc0VmZmVrc2VlclRpbWVsaW5lSXRlbSA9IHtcbiAgaW5wdXQ6IG51bWJlcjtcbiAgZXZlbnQ6ICdwbGF5JyB8ICdzdG9wJyB8ICdwYXVzZSc7XG59O1xuXG5leHBvcnQgdHlwZSBSbk0yU2FtcGxlciA9IHtcbiAgbWFnRmlsdGVyPzogbnVtYmVyO1xuICBtaW5GaWx0ZXI/OiBudW1iZXI7XG4gIHdyYXBTPzogbnVtYmVyO1xuICB3cmFwVD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG4iLCJpbXBvcnQgeyBSbk0yIH0gZnJvbSAnLi9Sbk0yJztcblxuZXhwb3J0IHR5cGUgSHVtYW5Cb25lTmFtZXMgPVxuICB8ICdoaXBzJ1xuICB8ICdzcGluZSdcbiAgfCAnY2hlc3QnXG4gIHwgJ25lY2snXG4gIHwgJ2hlYWQnXG4gIHwgJ2xlZnRVcHBlckxlZydcbiAgfCAnbGVmdExvd2VyTGVnJ1xuICB8ICdsZWZ0Rm9vdCdcbiAgfCAnbGVmdFRvZXMnXG4gIHwgJ3JpZ2h0VXBwZXJMZWcnXG4gIHwgJ3JpZ2h0TG93ZXJMZWcnXG4gIHwgJ3JpZ2h0Rm9vdCdcbiAgfCAncmlnaHRUb2VzJ1xuICB8ICdsZWZ0U2hvdWxkZXInXG4gIHwgJ2xlZnRVcHBlckFybSdcbiAgfCAnbGVmdExvd2VyQXJtJ1xuICB8ICdsZWZ0SGFuZCdcbiAgfCAncmlnaHRTaG91bGRlcidcbiAgfCAncmlnaHRVcHBlckFybSdcbiAgfCAncmlnaHRMb3dlckFybSdcbiAgfCAncmlnaHRIYW5kJztcblxuZXhwb3J0IHR5cGUgTm9kZUlkID0gbnVtYmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJuTTJWcm1hIGV4dGVuZHMgUm5NMiB7XG4gIGV4dGVuc2lvbnM6IHtcbiAgICBWUk1DX3ZybV9hbmltYXRpb246IHtcbiAgICAgIHNwZWNWZXJzaW9uOiBzdHJpbmc7XG4gICAgICBodW1hbm9pZD86IHtcbiAgICAgICAgaHVtYW5Cb25lczogUmVjb3JkPEh1bWFuQm9uZU5hbWVzLCB7IG5vZGU6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICBodW1hbm9pZEJvbmVOYW1lTWFwPzogTWFwPE5vZGVJZCwgSHVtYW5Cb25lTmFtZXM+O1xuICAgIH07XG4gIH07XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIFNoYWRlck5vZGVKc29uIHtcbiAgbm9kZXM6IFNoYWRlck5vZGVKc29uTm9kZVtdO1xuICBjb25uZWN0aW9uczogU2hhZGVyTm9kZUpzb25Db25uZWN0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhZGVyTm9kZUpzb25Ob2RlIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpbnB1dHM6IFJlY29yZDxzdHJpbmcsIFNoYWRlck5vZGVKc29uTm9kZUlucHV0PjtcbiAgb3V0cHV0czogUmVjb3JkPHN0cmluZywgU2hhZGVyTm9kZUpzb25Ob2RlT3V0cHV0PjtcbiAgcG9zaXRpb246IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBjb250cm9sczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFkZXJOb2RlSnNvbk5vZGVPdXRwdXQge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBzb2NrZXQ6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhZGVyTm9kZUpzb25Ob2RlSW5wdXQge1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIHNvY2tldDoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFkZXJOb2RlSnNvbkNvbm5lY3Rpb24ge1xuICBpZDogc3RyaW5nO1xuICBmcm9tOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwb3J0TmFtZTogc3RyaW5nO1xuICB9O1xuICB0bzoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcG9ydE5hbWU6IHN0cmluZztcbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRlbnNvclRvQ29tcG9zaXRpb25UeXBlKHZlYzogYW55KSB7XG4gIHN3aXRjaCAodmVjLmNsYXNzTmFtZSkge1xuICAgIGNhc2UgJ1NjYWxhcicgfHwgJ011dGFibGVTY2FsYXInOlxuICAgICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5TY2FsYXI7XG4gICAgY2FzZSAnVmVjdG9yMicgfHwgJ011dGFibGVWZWN0b3IyJzpcbiAgICAgIHJldHVybiBDb21wb3NpdGlvblR5cGUuVmVjMjtcbiAgICBjYXNlICdWZWN0b3IzJyB8fCAnTXV0YWJsZVZlY3RvcjMnOlxuICAgICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5WZWMzO1xuICAgIGNhc2UgJ1ZlY3RvcjQnIHx8ICdNdXRhYmxlVmVjdG9yNCcgfHwgJ1F1YXRlcm5pb24nIHx8ICdNdXRhYmxlUXVhdGVybmlvbic6XG4gICAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLlZlYzQ7XG4gICAgY2FzZSAnTWF0cml4MjInIHx8ICdNdXRhYmxlTWF0cml4MjInOlxuICAgICAgcmV0dXJuIENvbXBvc2l0aW9uVHlwZS5NYXQyO1xuICAgIGNhc2UgJ01hdHJpeDMzJyB8fCAnTXV0YWJsZU1hdHJpeDMzJzpcbiAgICAgIHJldHVybiBDb21wb3NpdGlvblR5cGUuTWF0MztcbiAgICBjYXNlICdNYXRyaXg0NCcgfHwgJ011dGFibGVNYXRyaXg0NCc6XG4gICAgICByZXR1cm4gQ29tcG9zaXRpb25UeXBlLk1hdDQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIExvZ2dlci5lcnJvcignQ29tcG9zaXRpb25UeXBlLlVua25vd24nKTtcbiAgICAgIHJldHVybiBDb21wb3NpdGlvblR5cGUuVW5rbm93bjtcbiAgfVxufVxuIiwiLy8gaHR0cHM6Ly9xaWl0YS5jb20vdWh5by9pdGVtcy81ODNkZGY3YWYzYjQ4OWQ1ZThlOSN0eXBlc2NyaXB0JUU3JTlBJTg0JUU4JUE3JUEzJUU2JUIxJUJBJUU3JUFEJTk2XG5leHBvcnQgdHlwZSBSZXF1aXJlT25lPFQsIEsgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICA/IFBhcnRpYWxSZXF1aXJlPFQsIEs+XG4gIDogbmV2ZXI7XG5leHBvcnQgdHlwZSBQYXJ0aWFsUmVxdWlyZTxPLCBLIGV4dGVuZHMga2V5b2YgTz4gPSB7XG4gIFtQIGluIEtdLT86IE9bUF07XG59ICYgTztcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjQzOTY2Njgvd2h5LWRvLXR5cGVzY3JpcHQtbWl4aW5zLXJlcXVpcmUtYS1jb25zdHJ1Y3Rvci13aXRoLWEtc2luZ2xlLXJlc3QtcGFyYW1ldGVyLWFueVxuZXhwb3J0IHR5cGUgTWl4aW5CYXNlID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuZXhwb3J0IHR5cGUgR2V0UHJvcHM8VEJhc2U+ID0gVEJhc2UgZXh0ZW5kcyBuZXcgKHByb3BzOiBpbmZlciBQKSA9PiBhbnkgPyBQIDogbmV2ZXI7XG5leHBvcnQgdHlwZSBHZXRJbnN0YW5jZTxUQmFzZT4gPSBUQmFzZSBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIEkgPyBJIDogbmV2ZXI7XG5leHBvcnQgdHlwZSBNZXJnZUN0b3I8QSwgQj4gPSBuZXcgKHByb3BzOiBHZXRQcm9wczxBPiAmIEdldFByb3BzPEI+KSA9PiBHZXRJbnN0YW5jZTxBPiAmXG4gIEdldEluc3RhbmNlPEI+O1xuIiwiaW1wb3J0IHsgQXJyYXkzLCBBcnJheTQgfSBmcm9tICcuL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFJuTTIgfSBmcm9tICcuL1JuTTInO1xuXG5leHBvcnQgdHlwZSBWcm0weEh1bWFuQm9uZSA9IHtcbiAgYm9uZTogc3RyaW5nO1xuICBub2RlOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHVzZURlZmF1bHRWYWx1ZXM6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBWcm0weExvb2tBdCA9IHtcbiAgY3VydmU6IG51bWJlcltdO1xuICB4UmFuZ2U6IG51bWJlcjtcbiAgeVJhbmdlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBWcm0weEJsZW5kU2hhcGVCaW5kID0ge1xuICBtZXNoOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIHdlaWdodDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVnJtMHhCbGVuZFNoYXBlR3JvdXAgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJlc2V0TmFtZTogc3RyaW5nO1xuICBpc0JpbmFyeTogYm9vbGVhbjtcbiAgYmluZHM6IFZybTB4QmxlbmRTaGFwZUJpbmRbXTtcbiAgbWF0ZXJpYWxWYWx1ZXM6IFtdO1xufTtcblxuZXhwb3J0IHR5cGUgVnJtMHhCb25lR3JvdXAgPSB7XG4gIGNvbW1lbnQ6IHN0cmluZztcbiAgc3RpZmZpbmVzczogbnVtYmVyOyAvLyBkb24ndCBmaXggdHlwbyBodHRwczovL2dpdGh1Yi5jb20vdnJtLWMvVW5pVlJNL2lzc3Vlcy8xOFxuICBncmF2aXR5UG93ZXI6IG51bWJlcjtcbiAgZ3Jhdml0eURpcjoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgejogbnVtYmVyO1xuICB9O1xuICBkcmFnRm9yY2U6IG51bWJlcjtcbiAgY2VudGVyOiBudW1iZXI7XG4gIGhpdFJhZGl1czogbnVtYmVyO1xuICBib25lczogbnVtYmVyW107XG4gIGNvbGxpZGVyR3JvdXBzOiBudW1iZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFZybTB4Q29sbGlkZXIgPSB7XG4gIG9mZnNldDoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgejogbnVtYmVyO1xuICB9O1xuICByYWRpdXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFZybTB4Q29sbGlkZXJHcm91cCA9IHtcbiAgbm9kZTogbnVtYmVyO1xuICBjb2xsaWRlcnM6IFZybTB4Q29sbGlkZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFZybTB4TWF0ZXJpYWxQcm9wZXJ0eSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICByZW5kZXJRdWV1ZTogbnVtYmVyO1xuICBzaGFkZXI6IHN0cmluZztcbiAgZmxvYXRQcm9wZXJ0aWVzOiB7XG4gICAgX0N1dG9mZjogbnVtYmVyO1xuICAgIF9CdW1wU2NhbGU6IG51bWJlcjtcbiAgICBfUmVjZWl2ZVNoYWRvd1JhdGU6IG51bWJlcjtcbiAgICBfU2hhZGluZ0dyYWRlUmF0ZTogbnVtYmVyO1xuICAgIF9TaGFkZVNoaWZ0OiBudW1iZXI7XG4gICAgX1NoYWRlVG9vbnk6IG51bWJlcjtcbiAgICBfTGlnaHRDb2xvckF0dGVudWF0aW9uOiBudW1iZXI7XG4gICAgX0luZGlyZWN0TGlnaHRJbnRlbnNpdHk6IG51bWJlcjtcbiAgICBfUmltTGlnaHRpbmdNaXg6IG51bWJlcjtcbiAgICBfUmltRnJlc25lbFBvd2VyOiBudW1iZXI7XG4gICAgX1JpbUxpZnQ6IG51bWJlcjtcbiAgICBfT3V0bGluZVdpZHRoOiBudW1iZXI7XG4gICAgX091dGxpbmVTY2FsZWRNYXhEaXN0YW5jZTogbnVtYmVyO1xuICAgIF9PdXRsaW5lTGlnaHRpbmdNaXg6IG51bWJlcjtcbiAgICBfRGVidWdNb2RlOiBudW1iZXI7XG4gICAgX0JsZW5kTW9kZTogbnVtYmVyO1xuICAgIF9PdXRsaW5lV2lkdGhNb2RlOiBudW1iZXI7XG4gICAgX091dGxpbmVDb2xvck1vZGU6IG51bWJlcjtcbiAgICBfQ3VsbE1vZGU6IG51bWJlcjtcbiAgICBfT3V0bGluZUN1bGxNb2RlOiBudW1iZXI7XG4gICAgX1NyY0JsZW5kOiBudW1iZXI7XG4gICAgX0RzdEJsZW5kOiBudW1iZXI7XG4gICAgX1pXcml0ZTogbnVtYmVyO1xuICB9O1xuICB2ZWN0b3JQcm9wZXJ0aWVzOiB7XG4gICAgX0NvbG9yOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBfU2hhZGVDb2xvcjogQXJyYXkzPG51bWJlcj47XG4gICAgX01haW5UZXg6IEFycmF5NDxudW1iZXI+O1xuICAgIF9TaGFkZVRleHR1cmU6IEFycmF5NDxudW1iZXI+O1xuICAgIF9CdW1wTWFwOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBfUmVjZWl2ZVNoYWRvd1RleHR1cmU6IEFycmF5NDxudW1iZXI+O1xuICAgIF9TaGFkaW5nR3JhZGVUZXh0dXJlOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBfU3BoZXJlQWRkOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBfRW1pc3Npb25Db2xvcjogQXJyYXkzPG51bWJlcj47XG4gICAgX0VtaXNzaW9uTWFwOiBBcnJheTQ8bnVtYmVyPjtcbiAgICBfT3V0bGluZVdpZHRoVGV4dHVyZTogQXJyYXk0PG51bWJlcj47XG4gICAgX091dGxpbmVDb2xvcjogQXJyYXkzPG51bWJlcj47XG4gICAgX1JpbUNvbG9yOiBBcnJheTM8bnVtYmVyPjtcbiAgfTtcbiAgdGV4dHVyZVByb3BlcnRpZXM6IHtcbiAgICBfTWFpblRleDogbnVtYmVyO1xuICAgIF9TaGFkZVRleHR1cmU6IG51bWJlcjtcbiAgICBfQnVtcE1hcDogbnVtYmVyO1xuICAgIF9TcGhlcmVBZGQ6IG51bWJlcjtcbiAgICBfRW1pc3Npb25NYXA6IG51bWJlcjtcbiAgICBfT3V0bGluZVdpZHRoVGV4dHVyZTogbnVtYmVyO1xuICAgIF9SZWNlaXZlU2hhZG93VGV4dHVyZTogbnVtYmVyO1xuICAgIF9SaW1UZXh0dXJlOiBudW1iZXI7XG4gICAgX1NoYWRpbmdHcmFkZVRleHR1cmU6IG51bWJlcjtcbiAgfTtcbiAgLy8ga2V5d29yZE1hcDoge1xuICAvLyAgIF9OT1JNQUxNQVA6IGJvb2xlYW47XG4gIC8vIH07XG4gIC8vIHRhZ01hcDoge1xuICAvLyAgIFJlbmRlclR5cGU6IHN0cmluZztcbiAgLy8gfTtcbn07XG5cbmV4cG9ydCB0eXBlIFZybTB4X0V4dGVuc2lvbiA9IHtcbiAgZXh0ZW5zaW9uczoge1xuICAgIFZSTToge1xuICAgICAgZXhwb3J0ZXJWZXJzaW9uOiBzdHJpbmc7XG4gICAgICBtZXRhOiB7XG4gICAgICAgIHZlcnNpb246IHN0cmluZztcbiAgICAgICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RJbmZvcm1hdGlvbjogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAgICAgdGl0bGU6IHN0cmluZztcbiAgICAgICAgdGV4dHVyZTogMzA7XG4gICAgICAgIGFsbG93ZWRVc2VyTmFtZTogc3RyaW5nO1xuICAgICAgICB2aW9sZW50VXNhZ2VOYW1lOiBzdHJpbmc7XG4gICAgICAgIHNleHVhbFVzYWdlTmFtZTogc3RyaW5nO1xuICAgICAgICBjb21tZXJjaWFsVXNhZ2VOYW1lOiBzdHJpbmc7XG4gICAgICAgIG90aGVyUGVybWlzc2lvblVybDogc3RyaW5nO1xuICAgICAgICBsaWNlbnNlTmFtZTogc3RyaW5nO1xuICAgICAgICBvdGhlckxpY2Vuc2VVcmw6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBodW1hbm9pZDoge1xuICAgICAgICBodW1hbkJvbmVzOiBWcm0weEh1bWFuQm9uZVtdO1xuICAgICAgICBhcm1TdHJldGNoOiBudW1iZXI7XG4gICAgICAgIGxlZ1N0cmV0Y2g6IG51bWJlcjtcbiAgICAgICAgdXBwZXJBcm1Ud2lzdDogbnVtYmVyO1xuICAgICAgICBsb3dlckFybVR3aXN0OiBudW1iZXI7XG4gICAgICAgIHVwcGVyTGVnVHdpc3Q6IG51bWJlcjtcbiAgICAgICAgbG93ZXJMZWdUd2lzdDogbnVtYmVyO1xuICAgICAgICBmZWV0U3BhY2luZzogbnVtYmVyO1xuICAgICAgICBoYXNUcmFuc2xhdGlvbkRvRjogZmFsc2U7XG4gICAgICB9O1xuICAgICAgZmlyc3RQZXJzb246IHtcbiAgICAgICAgZmlyc3RQZXJzb25Cb25lOiBudW1iZXI7XG4gICAgICAgIGZpcnN0UGVyc29uQm9uZU9mZnNldDoge1xuICAgICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgICAgejogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBtZXNoQW5ub3RhdGlvbnM6IFtdO1xuICAgICAgICBsb29rQXRUeXBlTmFtZTogc3RyaW5nO1xuICAgICAgICBsb29rQXRIb3Jpem9udGFsSW5uZXI6IFZybTB4TG9va0F0O1xuICAgICAgICBsb29rQXRIb3Jpem9udGFsT3V0ZXI6IFZybTB4TG9va0F0O1xuICAgICAgICBsb29rQXRWZXJ0aWNhbERvd246IFZybTB4TG9va0F0O1xuICAgICAgICBsb29rQXRWZXJ0aWNhbFVQOiBWcm0weExvb2tBdDtcbiAgICAgIH07XG4gICAgICBibGVuZFNoYXBlTWFzdGVyOiB7XG4gICAgICAgIGJsZW5kU2hhcGVHcm91cHM6IFZybTB4QmxlbmRTaGFwZUdyb3VwW107XG4gICAgICB9O1xuICAgICAgc2Vjb25kYXJ5QW5pbWF0aW9uOiB7XG4gICAgICAgIGJvbmVHcm91cHM6IFZybTB4Qm9uZUdyb3VwW107XG4gICAgICAgIGNvbGxpZGVyR3JvdXBzOiBWcm0weENvbGxpZGVyR3JvdXBbXTtcbiAgICAgIH07XG4gICAgICBtYXRlcmlhbFByb3BlcnRpZXM6IFZybTB4TWF0ZXJpYWxQcm9wZXJ0eVtdO1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBWcm0weCA9IFZybTB4X0V4dGVuc2lvbiAmIFJuTTI7XG4iLCIvLyBUaGlzIGlzIGZyb20gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vVGltdmFuU2NoZXJwZW56ZWVsLzFmNDIxOGE1NjM3ODlkYjE3OTU1YTE5MjZjOGE4ZWUwI2ZpbGUtd2ViZ2wtY29uc3RhbnRzLXRzLlxuLy8gVGhhbmsgeW91IFRpbXZhblNjaGVycGVuemVlbCBhbmQgYWxsIGNvbnRyaWJ1dGVycyFcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vXG5cbi8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lZCBjb25zdGFudHMgYW5kIGRlc2NyaXB0aW9ucyBhcmUgZGlyZWN0bHkgcG9ydGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYkdMX0FQSS9Db25zdGFudHMuXG5cbi8vIEFueSBjb3B5cmlnaHQgaXMgZGVkaWNhdGVkIHRvIHRoZSBQdWJsaWMgRG9tYWluLiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvLlxuXG4vLyBDb250cmlidXRvcnNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL3Byb2ZpbGVzL1NoZXBweVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvcHJvZmlsZXMvZnNjaG9selxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvcHJvZmlsZXMvQXRpWFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvcHJvZmlsZXMvU2ViYXN0aWFuelxuXG4vLyBUaGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgb24gdGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCBpbnRlcmZhY2UuXG5cbi8vIENsZWFyaW5nIGJ1ZmZlcnNcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNsZWFyKCkgdG8gY2xlYXIgYnVmZmVyIG1hc2tzLlxuXG4vKipcbiAqIFBhc3NlZCB0byBjbGVhciB0byBjbGVhciB0aGUgY3VycmVudCBkZXB0aCBidWZmZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIX0JVRkZFUl9CSVQgPSAweDAwMDAwMTAwO1xuXG4vKipcbiAqIFBhc3NlZCB0byBjbGVhciB0byBjbGVhciB0aGUgY3VycmVudCBzdGVuY2lsIGJ1ZmZlci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9CVUZGRVJfQklUID0gMHgwMDAwMDQwMDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gY2xlYXIgdG8gY2xlYXIgdGhlIGN1cnJlbnQgY29sb3IgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9CVUZGRVJfQklUID0gMHgwMDAwNDAwMDtcblxuLy8gUmVuZGVyaW5nIHByaW1pdGl2ZXNcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LmRyYXdFbGVtZW50cygpIG9yIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5kcmF3QXJyYXlzKCkgdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgcHJpbWl0aXZlIHRvIHJlbmRlci5cblxuLyoqXG4gKiBQYXNzZWQgdG8gZHJhd0VsZW1lbnRzIG9yIGRyYXdBcnJheXMgdG8gZHJhdyBzaW5nbGUgcG9pbnRzLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9QT0lOVFMgPSAweDAwMDA7XG5cbi8qKlxuICogUGFzc2VkIHRvIGRyYXdFbGVtZW50cyBvciBkcmF3QXJyYXlzIHRvIGRyYXcgbGluZXMuIEVhY2ggdmVydGV4IGNvbm5lY3RzIHRvIHRoZSBvbmUgYWZ0ZXIgaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0xJTkVTID0gMHgwMDAxO1xuXG4vKipcbiAqIFBhc3NlZCB0byBkcmF3RWxlbWVudHMgb3IgZHJhd0FycmF5cyB0byBkcmF3IGxpbmVzLiBFYWNoIHNldCBvZiB0d28gdmVydGljZXMgaXMgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGxpbmUgc2VnbWVudC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTElORV9MT09QID0gMHgwMDAyO1xuXG4vKipcbiAqIFBhc3NlZCB0byBkcmF3RWxlbWVudHMgb3IgZHJhd0FycmF5cyB0byBkcmF3IGEgY29ubmVjdGVkIGdyb3VwIG9mIGxpbmUgc2VnbWVudHMgZnJvbSB0aGUgZmlyc3QgdmVydGV4IHRvIHRoZSBsYXN0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9MSU5FX1NUUklQID0gMHgwMDAzO1xuXG4vKipcbiAqIFBhc3NlZCB0byBkcmF3RWxlbWVudHMgb3IgZHJhd0FycmF5cyB0byBkcmF3IHRyaWFuZ2xlcy4gRWFjaCBzZXQgb2YgdGhyZWUgdmVydGljZXMgY3JlYXRlcyBhIHNlcGFyYXRlIHRyaWFuZ2xlLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUklBTkdMRVMgPSAweDAwMDQ7XG5cbi8qKlxuICogUGFzc2VkIHRvIGRyYXdFbGVtZW50cyBvciBkcmF3QXJyYXlzIHRvIGRyYXcgYSBjb25uZWN0ZWQgZ3JvdXAgb2YgdHJpYW5nbGVzLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUklBTkdMRV9TVFJJUCA9IDB4MDAwNTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZHJhd0VsZW1lbnRzIG9yIGRyYXdBcnJheXMgdG8gZHJhdyBhIGNvbm5lY3RlZCBncm91cCBvZiB0cmlhbmdsZXMuIEVhY2ggdmVydGV4IGNvbm5lY3RzIHRvIHRoZSBwcmV2aW91cyBhbmQgdGhlIGZpcnN0IHZlcnRleCBpbiB0aGUgZmFuLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUklBTkdMRV9GQU4gPSAweDAwMDY7XG5cbi8vIEJsZW5kaW5nIG1vZGVzXG4vLyBDb25zdGFudHMgcGFzc2VkIHRvIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5ibGVuZEZ1bmMoKSBvciBXZWJHTFJlbmRlcmluZ0NvbnRleHQuYmxlbmRGdW5jU2VwYXJhdGUoKSB0byBzcGVjaWZ5IHRoZSBibGVuZGluZyBtb2RlIChmb3IgYm90aCwgUkJHIGFuZCBhbHBoYSwgb3Igc2VwYXJhdGVseSkuXG5cbi8qKlxuICogUGFzc2VkIHRvIGJsZW5kRnVuYyBvciBibGVuZEZ1bmNTZXBhcmF0ZSB0byB0dXJuIG9mZiBhIGNvbXBvbmVudC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfWkVSTyA9IDA7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJsZW5kRnVuYyBvciBibGVuZEZ1bmNTZXBhcmF0ZSB0byB0dXJuIG9uIGEgY29tcG9uZW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9PTkUgPSAxO1xuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEZ1bmMgb3IgYmxlbmRGdW5jU2VwYXJhdGUgdG8gbXVsdGlwbHkgYSBjb21wb25lbnQgYnkgdGhlIHNvdXJjZSBlbGVtZW50cyBjb2xvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1JDX0NPTE9SID0gMHgwMzAwO1xuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEZ1bmMgb3IgYmxlbmRGdW5jU2VwYXJhdGUgdG8gbXVsdGlwbHkgYSBjb21wb25lbnQgYnkgb25lIG1pbnVzIHRoZSBzb3VyY2UgZWxlbWVudHMgY29sb3IuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX09ORV9NSU5VU19TUkNfQ09MT1IgPSAweDAzMDE7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJsZW5kRnVuYyBvciBibGVuZEZ1bmNTZXBhcmF0ZSB0byBtdWx0aXBseSBhIGNvbXBvbmVudCBieSB0aGUgc291cmNlJ3MgYWxwaGEuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NSQ19BTFBIQSA9IDB4MDMwMjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gYmxlbmRGdW5jIG9yIGJsZW5kRnVuY1NlcGFyYXRlIHRvIG11bHRpcGx5IGEgY29tcG9uZW50IGJ5IG9uZSBtaW51cyB0aGUgc291cmNlJ3MgYWxwaGEuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgPSAweDAzMDM7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJsZW5kRnVuYyBvciBibGVuZEZ1bmNTZXBhcmF0ZSB0byBtdWx0aXBseSBhIGNvbXBvbmVudCBieSB0aGUgZGVzdGluYXRpb24ncyBhbHBoYS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFNUX0FMUEhBID0gMHgwMzA0O1xuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEZ1bmMgb3IgYmxlbmRGdW5jU2VwYXJhdGUgdG8gbXVsdGlwbHkgYSBjb21wb25lbnQgYnkgb25lIG1pbnVzIHRoZSBkZXN0aW5hdGlvbidzIGFscGhhLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBID0gMHgwMzA1O1xuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEZ1bmMgb3IgYmxlbmRGdW5jU2VwYXJhdGUgdG8gbXVsdGlwbHkgYSBjb21wb25lbnQgYnkgdGhlIGRlc3RpbmF0aW9uJ3MgY29sb3IuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RTVF9DT0xPUiA9IDB4MDMwNjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gYmxlbmRGdW5jIG9yIGJsZW5kRnVuY1NlcGFyYXRlIHRvIG11bHRpcGx5IGEgY29tcG9uZW50IGJ5IG9uZSBtaW51cyB0aGUgZGVzdGluYXRpb24ncyBjb2xvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfT05FX01JTlVTX0RTVF9DT0xPUiA9IDB4MDMwNztcblxuLyoqXG4gKiBQYXNzZWQgdG8gYmxlbmRGdW5jIG9yIGJsZW5kRnVuY1NlcGFyYXRlIHRvIG11bHRpcGx5IGEgY29tcG9uZW50IGJ5IHRoZSBtaW5pbXVtIG9mIHNvdXJjZSdzIGFscGhhIG9yIG9uZSBtaW51cyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1JDX0FMUEhBX1NBVFVSQVRFID0gMHgwMzA4O1xuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEZ1bmMgb3IgYmxlbmRGdW5jU2VwYXJhdGUgdG8gc3BlY2lmeSBhIGNvbnN0YW50IGNvbG9yIGJsZW5kIGZ1bmN0aW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT05TVEFOVF9DT0xPUiA9IDB4ODAwMTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gYmxlbmRGdW5jIG9yIGJsZW5kRnVuY1NlcGFyYXRlIHRvIHNwZWNpZnkgb25lIG1pbnVzIGEgY29uc3RhbnQgY29sb3IgYmxlbmQgZnVuY3Rpb24uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiA9IDB4ODAwMjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gYmxlbmRGdW5jIG9yIGJsZW5kRnVuY1NlcGFyYXRlIHRvIHNwZWNpZnkgYSBjb25zdGFudCBhbHBoYSBibGVuZCBmdW5jdGlvbi5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09OU1RBTlRfQUxQSEEgPSAweDgwMDM7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJsZW5kRnVuYyBvciBibGVuZEZ1bmNTZXBhcmF0ZSB0byBzcGVjaWZ5IG9uZSBtaW51cyBhIGNvbnN0YW50IGFscGhhIGJsZW5kIGZ1bmN0aW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgPSAweDgwMDQ7XG5cbi8vIEJsZW5kaW5nIGVxdWF0aW9uc1xuLy8gQ29uc3RhbnRzIHBhc3NlZCB0byBXZWJHTFJlbmRlcmluZ0NvbnRleHQuYmxlbmRFcXVhdGlvbigpIG9yIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoKSB0byBjb250cm9sIGhvdyB0aGUgYmxlbmRpbmcgaXMgY2FsY3VsYXRlZCAoZm9yIGJvdGgsIFJCRyBhbmQgYWxwaGEsIG9yIHNlcGFyYXRlbHkpLlxuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEVxdWF0aW9uIG9yIGJsZW5kRXF1YXRpb25TZXBhcmF0ZSB0byBzZXQgYW4gYWRkaXRpb24gYmxlbmQgZnVuY3Rpb24uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZVTkNfQUREID0gMHg4MDA2O1xuXG4vKipcbiAqIFBhc3NlZCB0byBibGVuZEVxdWF0aW9uIG9yIGJsZW5kRXF1YXRpb25TZXBhcmF0ZSB0byBzcGVjaWZ5IGEgc3VidHJhY3Rpb24gYmxlbmQgZnVuY3Rpb24gKHNvdXJjZSAtIGRlc3RpbmF0aW9uKS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlVOQ19TVUJTVFJBQ1QgPSAweDgwMGE7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJsZW5kRXF1YXRpb24gb3IgYmxlbmRFcXVhdGlvblNlcGFyYXRlIHRvIHNwZWNpZnkgYSByZXZlcnNlIHN1YnRyYWN0aW9uIGJsZW5kIGZ1bmN0aW9uIChkZXN0aW5hdGlvbiAtIHNvdXJjZSkuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCA9IDB4ODAwYjtcblxuLy8gR2V0dGluZyBHTCBwYXJhbWV0ZXIgaW5mb3JtYXRpb25cbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LmdldFBhcmFtZXRlcigpIHRvIHNwZWNpZnkgd2hhdCBpbmZvcm1hdGlvbiB0byByZXR1cm4uXG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byBnZXQgdGhlIGN1cnJlbnQgUkdCIGJsZW5kIGZ1bmN0aW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CTEVORF9FUVVBVElPTiA9IDB4ODAwOTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCBSR0IgYmxlbmQgZnVuY3Rpb24uIFNhbWUgYXMgQkxFTkRfRVFVQVRJT04uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiA9IDB4ODAwOTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCBhbHBoYSBibGVuZCBmdW5jdGlvbi4gU2FtZSBhcyBCTEVORF9FUVVBVElPTi5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgPSAweDg4M2Q7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byBnZXQgdGhlIGN1cnJlbnQgZGVzdGluYXRpb24gUkdCIGJsZW5kIGZ1bmN0aW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CTEVORF9EU1RfUkdCID0gMHg4MGM4O1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHNvdXJjZSBSR0IgYmxlbmQgZnVuY3Rpb24uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0JMRU5EX1NSQ19SR0IgPSAweDgwYzk7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byBnZXQgdGhlIGN1cnJlbnQgZGVzdGluYXRpb24gYWxwaGEgYmxlbmQgZnVuY3Rpb24uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0JMRU5EX0RTVF9BTFBIQSA9IDB4ODBjYTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCBzb3VyY2UgYWxwaGEgYmxlbmQgZnVuY3Rpb24uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0JMRU5EX1NSQ19BTFBIQSA9IDB4ODBjYjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIHJldHVybiBhIHRoZSBjdXJyZW50IGJsZW5kIGNvbG9yLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CTEVORF9DT0xPUiA9IDB4ODAwNTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgYXJyYXkgYnVmZmVyIGJpbmRpbmcuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HID0gMHg4ODk0O1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgYXJyYXkgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HID0gMHg4ODk1O1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IGxpbmVXaWR0aCAoc2V0IGJ5IHRoZSBsaW5lV2lkdGggbWV0aG9kKS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTElORV9XSURUSCA9IDB4MGIyMTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCBzaXplIG9mIGEgcG9pbnQgZHJhd24gd2l0aCBnbC5QT0lOVFMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSA9IDB4ODQ2ZDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgcmFuZ2Ugb2YgYXZhaWxhYmxlIHdpZHRocyBmb3IgYSBsaW5lLiBSZXR1cm5zIGEgbGVuZ3RoLTIgYXJyYXkgd2l0aCB0aGUgbG8gdmFsdWUgYXQgMCwgYW5kIGhpZ2h0IGF0IDEuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSA9IDB4ODQ2ZTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiBjdWxsRmFjZS4gU2hvdWxkIHJldHVybiBGUk9OVCwgQkFDSywgb3IgRlJPTlRfQU5EX0JBQ0suXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NVTExfRkFDRV9NT0RFID0gMHgwYjQ1O1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHZhbHVlIG9mIGZyb250RmFjZS4gU2hvdWxkIHJldHVybiBDVyBvciBDQ1cuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZST05UX0ZBQ0UgPSAweDBiNDY7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byByZXR1cm4gYSBsZW5ndGgtMiBhcnJheSBvZiBmbG9hdHMgZ2l2aW5nIHRoZSBjdXJyZW50IGRlcHRoIHJhbmdlLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSF9SQU5HRSA9IDB4MGI3MDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGRldGVybWluZSBpZiB0aGUgZGVwdGggd3JpdGUgbWFzayBpcyBlbmFibGVkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSF9XUklURU1BU0sgPSAweDBiNzI7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgZGVwdGggY2xlYXIgdmFsdWUuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIX0NMRUFSX1ZBTFVFID0gMHgwYjczO1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IGRlcHRoIGZ1bmN0aW9uLiBSZXR1cm5zIE5FVkVSLCBBTFdBWVMsIExFU1MsIEVRVUFMLCBMRVFVQUwsIEdSRUFURVIsIEdFUVVBTCwgb3IgTk9URVFVQUwuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIX0ZVTkMgPSAweDBiNzQ7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byBnZXQgdGhlIHZhbHVlIHRoZSBzdGVuY2lsIHdpbGwgYmUgY2xlYXJlZCB0by5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSA9IDB4MGI5MTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCBzdGVuY2lsIGZ1bmN0aW9uLiBSZXR1cm5zIE5FVkVSLCBBTFdBWVMsIExFU1MsIEVRVUFMLCBMRVFVQUwsIEdSRUFURVIsIEdFUVVBTCwgb3IgTk9URVFVQUwuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NURU5DSUxfRlVOQyA9IDB4MGI5MjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgY3VycmVudCBzdGVuY2lsIGZhaWwgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gS0VFUCwgUkVQTEFDRSwgSU5DUiwgREVDUiwgSU5WRVJULCBJTkNSX1dSQVAsIG9yIERFQ1JfV1JBUC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9GQUlMID0gMHgwYjk0O1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHN0ZW5jaWwgZmFpbCBmdW5jdGlvbiBzaG91bGQgdGhlIGRlcHRoIGJ1ZmZlciB0ZXN0IGZhaWwuIFNob3VsZCByZXR1cm4gS0VFUCwgUkVQTEFDRSwgSU5DUiwgREVDUiwgSU5WRVJULCBJTkNSX1dSQVAsIG9yIERFQ1JfV1JBUC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgPSAweDBiOTU7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFBhcmFtZXRlciB0byBnZXQgdGhlIGN1cnJlbnQgc3RlbmNpbCBmYWlsIGZ1bmN0aW9uIHNob3VsZCB0aGUgZGVwdGggYnVmZmVyIHRlc3QgcGFzcy4gU2hvdWxkIHJldHVybiBLRUVQLCBSRVBMQUNFLCBJTkNSLCBERUNSLCBJTlZFUlQsIElOQ1JfV1JBUCwgb3IgREVDUl9XUkFQLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyA9IDB4MGI5NjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgcmVmZXJlbmNlIHZhbHVlIHVzZWQgZm9yIHN0ZW5jaWwgdGVzdHMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NURU5DSUxfUkVGID0gMHgwYjk3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9WQUxVRV9NQVNLID0gMHgwYjkzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9XUklURU1BU0sgPSAweDBiOTg7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyA9IDB4ODgwMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NURU5DSUxfQkFDS19GQUlMID0gMHg4ODAxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCA9IDB4ODgwMjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgPSAweDg4MDM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX0JBQ0tfUkVGID0gMHg4Y2EzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgPSAweDhjYTQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLID0gMHg4Y2E1O1xuXG4vKipcbiAqIFJldHVybnMgYW4gSW50MzJBcnJheSB3aXRoIGZvdXIgZWxlbWVudHMgZm9yIHRoZSBjdXJyZW50IHZpZXdwb3J0IGRpbWVuc2lvbnMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZJRVdQT1JUID0gMHgwYmEyO1xuXG4vKipcbiAqIFJldHVybnMgYW4gSW50MzJBcnJheSB3aXRoIGZvdXIgZWxlbWVudHMgZm9yIHRoZSBjdXJyZW50IHNjaXNzb3IgYm94IGRpbWVuc2lvbnMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NDSVNTT1JfQk9YID0gMHgwYzEwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgPSAweDBjMjI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9XUklURU1BU0sgPSAweDBjMjM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlBBQ0tfQUxJR05NRU5UID0gMHgwY2Y1O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUEFDS19BTElHTk1FTlQgPSAweDBkMDU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVEVYVFVSRV9TSVpFID0gMHgwZDMzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAweDBkM2E7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVUJQSVhFTF9CSVRTID0gMHgwZDUwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkVEX0JJVFMgPSAweDBkNTI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9HUkVFTl9CSVRTID0gMHgwZDUzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQkxVRV9CSVRTID0gMHgwZDU0O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQUxQSEFfQklUUyA9IDB4MGQ1NTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIX0JJVFMgPSAweDBkNTY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX0JJVFMgPSAweDBkNTc7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9QT0xZR09OX09GRlNFVF9VTklUUyA9IDB4MmEwMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiA9IDB4ODAzODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQklORElOR18yRCA9IDB4ODA2OTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRV9CVUZGRVJTID0gMHg4MGE4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0FNUExFUyA9IDB4ODBhOTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSA9IDB4ODBhYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgPSAweDgwYWI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyA9IDB4ODZhMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZFTkRPUiA9IDB4MWYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFTkRFUkVSID0gMHgxZjAxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVkVSU0lPTiA9IDB4MWYwMjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSA9IDB4OGI5YTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUID0gMHg4YjliO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQlJPV1NFUl9ERUZBVUxUX1dFQkdMID0gMHg5MjQ0O1xuXG4vLyBCdWZmZXJzXG4vLyBDb25zdGFudHMgcGFzc2VkIHRvIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5idWZmZXJEYXRhKCksIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5idWZmZXJTdWJEYXRhKCksIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5iaW5kQnVmZmVyKCksIG9yIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5nZXRCdWZmZXJQYXJhbWV0ZXIoKS5cblxuLyoqXG4gKiBQYXNzZWQgdG8gYnVmZmVyRGF0YSBhcyBhIGhpbnQgYWJvdXQgd2hldGhlciB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgb2Z0ZW4gYW5kIG5vdCBjaGFuZ2Ugb2Z0ZW4uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NUQVRJQ19EUkFXID0gMHg4OGU0O1xuXG4vKipcbiAqIFBhc3NlZCB0byBidWZmZXJEYXRhIGFzIGEgaGludCBhYm91dCB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFyZSBsaWtlbHkgdG8gbm90IGJlIHVzZWQgb2Z0ZW4uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NUUkVBTV9EUkFXID0gMHg4OGUwO1xuXG4vKipcbiAqIFBhc3NlZCB0byBidWZmZXJEYXRhIGFzIGEgaGludCBhYm91dCB3aGV0aGVyIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFyZSBsaWtlbHkgdG8gYmUgdXNlZCBvZnRlbiBhbmQgY2hhbmdlIG9mdGVuLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EWU5BTUlDX0RSQVcgPSAweDg4ZTg7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJpbmRCdWZmZXIgb3IgYnVmZmVyRGF0YSB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGJ1ZmZlciBiZWluZyB1c2VkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9BUlJBWV9CVUZGRVIgPSAweDg4OTI7XG5cbi8qKlxuICogUGFzc2VkIHRvIGJpbmRCdWZmZXIgb3IgYnVmZmVyRGF0YSB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGJ1ZmZlciBiZWluZyB1c2VkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiA9IDB4ODg5MztcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0QnVmZmVyUGFyYW1ldGVyIHRvIGdldCBhIGJ1ZmZlcidzIHNpemUuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0JVRkZFUl9TSVpFID0gMHg4NzY0O1xuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRCdWZmZXJQYXJhbWV0ZXIgdG8gZ2V0IHRoZSBoaW50IGZvciB0aGUgYnVmZmVyIHBhc3NlZCBpbiB3aGVuIGl0IHdhcyBjcmVhdGVkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CVUZGRVJfVVNBR0UgPSAweDg3NjU7XG5cbi8vIFZlcnRleCBhdHRyaWJ1dGVzXG4vLyBDb25zdGFudHMgcGFzc2VkIHRvIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5nZXRWZXJ0ZXhBdHRyaWIoKS5cblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0VmVydGV4QXR0cmliIHRvIHJlYWQgYmFjayB0aGUgY3VycmVudCB2ZXJ0ZXggYXR0cmlidXRlLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUIgPSAweDg2MjY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgPSAweDg2MjI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUgPSAweDg2MjM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSA9IDB4ODYyNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSA9IDB4ODYyNTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCA9IDB4ODg2YTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiA9IDB4ODY0NTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgPSAweDg4OWY7XG5cbi8vIEN1bGxpbmdcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LmN1bGxGYWNlKCkuXG5cbi8qKlxuICogUGFzc2VkIHRvIGVuYWJsZS9kaXNhYmxlIHRvIHR1cm4gb24vb2ZmIGN1bGxpbmcuIENhbiBhbHNvIGJlIHVzZWQgd2l0aCBnZXRQYXJhbWV0ZXIgdG8gZmluZCB0aGUgY3VycmVudCBjdWxsaW5nIG1ldGhvZC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ1VMTF9GQUNFID0gMHgwYjQ0O1xuXG4vKipcbiAqIFBhc3NlZCB0byBjdWxsRmFjZSB0byBzcGVjaWZ5IHRoYXQgb25seSBmcm9udCBmYWNlcyBzaG91bGQgYmUgY3VsbGVkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUk9OVCA9IDB4MDQwNDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gY3VsbEZhY2UgdG8gc3BlY2lmeSB0aGF0IG9ubHkgYmFjayBmYWNlcyBzaG91bGQgYmUgY3VsbGVkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CQUNLID0gMHgwNDA1O1xuXG4vKipcbiAqIFBhc3NlZCB0byBjdWxsRmFjZSB0byBzcGVjaWZ5IHRoYXQgZnJvbnQgYW5kIGJhY2sgZmFjZXMgc2hvdWxkIGJlIGN1bGxlZC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJPTlRfQU5EX0JBQ0sgPSAweDA0MDg7XG5cbi8vIEVuYWJsaW5nIGFuZCBkaXNhYmxpbmdcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LmVuYWJsZSgpIG9yIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5kaXNhYmxlKCkuXG5cbi8qKlxuICogUGFzc2VkIHRvIGVuYWJsZS9kaXNhYmxlIHRvIHR1cm4gb24vb2ZmIGJsZW5kaW5nLiBDYW4gYWxzbyBiZSB1c2VkIHdpdGggZ2V0UGFyYW1ldGVyIHRvIGZpbmQgdGhlIGN1cnJlbnQgYmxlbmRpbmcgbWV0aG9kLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CTEVORCA9IDB4MGJlMjtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZW5hYmxlL2Rpc2FibGUgdG8gdHVybiBvbi9vZmYgdGhlIGRlcHRoIHRlc3QuIENhbiBhbHNvIGJlIHVzZWQgd2l0aCBnZXRQYXJhbWV0ZXIgdG8gcXVlcnkgdGhlIGRlcHRoIHRlc3QuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIX1RFU1QgPSAweDBiNzE7XG5cbi8qKlxuICogUGFzc2VkIHRvIGVuYWJsZS9kaXNhYmxlIHRvIHR1cm4gb24vb2ZmIGRpdGhlcmluZy4gQ2FuIGFsc28gYmUgdXNlZCB3aXRoIGdldFBhcmFtZXRlciB0byBmaW5kIHRoZSBjdXJyZW50IGRpdGhlcmluZyBtZXRob2QuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RJVEhFUiA9IDB4MGJkMDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZW5hYmxlL2Rpc2FibGUgdG8gdHVybiBvbi9vZmYgdGhlIHBvbHlnb24gb2Zmc2V0LiBVc2VmdWwgZm9yIHJlbmRlcmluZyBoaWRkZW4tbGluZSBpbWFnZXMsIGRlY2FscywgYW5kIG9yIHNvbGlkcyB3aXRoIGhpZ2hsaWdodGVkIGVkZ2VzLiBDYW4gYWxzbyBiZSB1c2VkIHdpdGggZ2V0UGFyYW1ldGVyIHRvIHF1ZXJ5IHRoZSBzY2lzc29yIHRlc3QuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgPSAweDgwMzc7XG5cbi8qKlxuICogUGFzc2VkIHRvIGVuYWJsZS9kaXNhYmxlIHRvIHR1cm4gb24vb2ZmIHRoZSBhbHBoYSB0byBjb3ZlcmFnZS4gVXNlZCBpbiBtdWx0aS1zYW1wbGluZyBhbHBoYSBjaGFubmVscy5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFID0gMHg4MDllO1xuXG4vKipcbiAqIFBhc3NlZCB0byBlbmFibGUvZGlzYWJsZSB0byB0dXJuIG9uL29mZiB0aGUgc2FtcGxlIGNvdmVyYWdlLiBVc2VkIGluIG11bHRpLXNhbXBsaW5nLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TQU1QTEVfQ09WRVJBR0UgPSAweDgwYTA7XG5cbi8qKlxuICogUGFzc2VkIHRvIGVuYWJsZS9kaXNhYmxlIHRvIHR1cm4gb24vb2ZmIHRoZSBzY2lzc29yIHRlc3QuIENhbiBhbHNvIGJlIHVzZWQgd2l0aCBnZXRQYXJhbWV0ZXIgdG8gcXVlcnkgdGhlIHNjaXNzb3IgdGVzdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0NJU1NPUl9URVNUID0gMHgwYzExO1xuXG4vKipcbiAqIFBhc3NlZCB0byBlbmFibGUvZGlzYWJsZSB0byB0dXJuIG9uL29mZiB0aGUgc3RlbmNpbCB0ZXN0LiBDYW4gYWxzbyBiZSB1c2VkIHdpdGggZ2V0UGFyYW1ldGVyIHRvIHF1ZXJ5IHRoZSBzdGVuY2lsIHRlc3QuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NURU5DSUxfVEVTVCA9IDB4MGI5MDtcblxuLy8gRXJyb3JzXG4vLyBDb25zdGFudHMgcmV0dXJuZWQgZnJvbSBXZWJHTFJlbmRlcmluZ0NvbnRleHQuZ2V0RXJyb3IoKS5cblxuLyoqXG4gKiBSZXR1cm5lZCBmcm9tIGdldEVycm9yLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9OT19FUlJPUiA9IDA7XG5cbi8qKlxuICogUmV0dXJuZWQgZnJvbSBnZXRFcnJvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSU5WQUxJRF9FTlVNID0gMHgwNTAwO1xuXG4vKipcbiAqIFJldHVybmVkIGZyb20gZ2V0RXJyb3IuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOVkFMSURfVkFMVUUgPSAweDA1MDE7XG5cbi8qKlxuICogUmV0dXJuZWQgZnJvbSBnZXRFcnJvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSU5WQUxJRF9PUEVSQVRJT04gPSAweDA1MDI7XG5cbi8qKlxuICogUmV0dXJuZWQgZnJvbSBnZXRFcnJvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfT1VUX09GX01FTU9SWSA9IDB4MDUwNTtcblxuLyoqXG4gKiBSZXR1cm5lZCBmcm9tIGdldEVycm9yLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT05URVhUX0xPU1RfV0VCR0wgPSAweDkyNDI7XG5cbi8vIEZyb250IGZhY2UgZGlyZWN0aW9uc1xuLy8gQ29uc3RhbnRzIHBhc3NlZCB0byBXZWJHTFJlbmRlcmluZ0NvbnRleHQuZnJvbnRGYWNlKCkuXG5cbi8qKlxuICogUGFzc2VkIHRvIGZyb250RmFjZSB0byBzcGVjaWZ5IHRoZSBmcm9udCBmYWNlIG9mIGEgcG9seWdvbiBpcyBkcmF3biBpbiB0aGUgY2xvY2t3aXNlIGRpcmVjdGlvbixcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ1cgPSAweDA5MDA7XG5cbi8qKlxuICogUGFzc2VkIHRvIGZyb250RmFjZSB0byBzcGVjaWZ5IHRoZSBmcm9udCBmYWNlIG9mIGEgcG9seWdvbiBpcyBkcmF3biBpbiB0aGUgY291bnRlciBjbG9ja3dpc2UgZGlyZWN0aW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DQ1cgPSAweDA5MDE7XG5cbi8vIEhpbnRzXG4vLyBDb25zdGFudHMgcGFzc2VkIHRvIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5oaW50KCkuXG5cbi8qKlxuICogVGhlcmUgaXMgbm8gcHJlZmVyZW5jZSBmb3IgdGhpcyBiZWhhdmlvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRE9OVF9DQVJFID0gMHgxMTAwO1xuXG4vKipcbiAqIFRoZSBtb3N0IGVmZmljaWVudCBiZWhhdmlvciBzaG91bGQgYmUgdXNlZC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkFTVEVTVCA9IDB4MTEwMTtcblxuLyoqXG4gKiBUaGUgbW9zdCBjb3JyZWN0IG9yIHRoZSBoaWdoZXN0IHF1YWxpdHkgb3B0aW9uIHNob3VsZCBiZSB1c2VkLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9OSUNFU1QgPSAweDExMDI7XG5cbi8qKlxuICogSGludCBmb3IgdGhlIHF1YWxpdHkgb2YgZmlsdGVyaW5nIHdoZW4gZ2VuZXJhdGluZyBtaXBtYXAgaW1hZ2VzIHdpdGggV2ViR0xSZW5kZXJpbmdDb250ZXh0LmdlbmVyYXRlTWlwbWFwKCkuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UID0gMHg4MTkyO1xuXG4vLyBEYXRhIHR5cGVzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EQVRBX0JZVEUgPSAweDE0MDA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EQVRBX1VOU0lHTkVEX0JZVEUgPSAweDE0MDE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EQVRBX1NIT1JUID0gMHgxNDAyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREFUQV9VTlNJR05FRF9TSE9SVCA9IDB4MTQwMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RBVEFfSU5UID0gMHgxNDA0O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREFUQV9VTlNJR05FRF9JTlQgPSAweDE0MDU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EQVRBX0ZMT0FUID0gMHgxNDA2O1xuXG4vLyBQaXhlbCBmb3JtYXRzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSF9DT01QT05FTlQgPSAweDE5MDI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9BTFBIQSA9IDB4MTkwNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQiA9IDB4MTkwNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkEgPSAweDE5MDg7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9MVU1JTkFOQ0UgPSAweDE5MDk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9MVU1JTkFOQ0VfQUxQSEEgPSAweDE5MGE7XG5cbi8vIFBpeGVsIHR5cGVzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9QSVhFTF9VTlNJR05FRF9CWVRFID0gMHgxNDAxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUElYRUxfVU5TSUdORURfU0hPUlRfNF80XzRfNCA9IDB4ODAzMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1BJWEVMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgPSAweDgwMzQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9QSVhFTF9VTlNJR05FRF9TSE9SVF81XzZfNSA9IDB4ODM2MztcblxuLy8gU2hhZGVyc1xuLy8gQ29uc3RhbnRzIHBhc3NlZCB0byBXZWJHTFJlbmRlcmluZ0NvbnRleHQuZ2V0U2hhZGVyUGFyYW1ldGVyKCkuXG5cbi8qKlxuICogUGFzc2VkIHRvIGNyZWF0ZVNoYWRlciB0byBkZWZpbmUgYSBmcmFnbWVudCBzaGFkZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQUdNRU5UX1NIQURFUiA9IDB4OGIzMDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gY3JlYXRlU2hhZGVyIHRvIGRlZmluZSBhIHZlcnRleCBzaGFkZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1ZFUlRFWF9TSEFERVIgPSAweDhiMzE7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFNoYWRlclBhcmFtdGVyIHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBjb21waWxhdGlvbi4gUmV0dXJucyBmYWxzZSBpZiB0aGUgc2hhZGVyIHdhcyBub3QgY29tcGlsZWQuIFlvdSBjYW4gdGhlbiBxdWVyeSBnZXRTaGFkZXJJbmZvTG9nIHRvIGZpbmQgdGhlIGV4YWN0IGVycm9yLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QSUxFX1NUQVRVUyA9IDB4OGI4MTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0U2hhZGVyUGFyYW10ZXIgdG8gZGV0ZXJtaW5lIGlmIGEgc2hhZGVyIHdhcyBkZWxldGVkIHZpYSBkZWxldGVTaGFkZXIuIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREVMRVRFX1NUQVRVUyA9IDB4OGI4MDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UHJvZ3JhbVBhcmFtZXRlciBhZnRlciBjYWxsaW5nIGxpbmtQcm9ncmFtIHRvIGRldGVybWluZSBpZiBhIHByb2dyYW0gd2FzIGxpbmtlZCBjb3JyZWN0bHkuIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2VyZSBlcnJvcnMuIFVzZSBnZXRQcm9ncmFtSW5mb0xvZyB0byBmaW5kIHRoZSBleGFjdCBlcnJvci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTElOS19TVEFUVVMgPSAweDhiODI7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFByb2dyYW1QYXJhbWV0ZXIgYWZ0ZXIgY2FsbGluZyB2YWxpZGF0ZVByb2dyYW0gdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHZhbGlkLiBSZXR1cm5zIGZhbHNlIGlmIGVycm9ycyB3ZXJlIGZvdW5kLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9WQUxJREFURV9TVEFUVVMgPSAweDhiODM7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFByb2dyYW1QYXJhbWV0ZXIgYWZ0ZXIgY2FsbGluZyBhdHRhY2hTaGFkZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzaGFkZXIgd2FzIGF0dGFjaGVkIGNvcnJlY3RseS4gUmV0dXJucyBmYWxzZSBpZiBlcnJvcnMgb2NjdXJyZWQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FUVEFDSEVEX1NIQURFUlMgPSAweDhiODU7XG5cbi8qKlxuICogUGFzc2VkIHRvIGdldFByb2dyYW1QYXJhbWV0ZXIgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBhY3RpdmUgaW4gYSBwcm9ncmFtLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9BQ1RJVkVfQVRUUklCVVRFUyA9IDB4OGI4OTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UHJvZ3JhbVBhcmFtdGVyIHRvIGdldCB0aGUgbnVtYmVyIG9mIHVuaWZvcm1zIGFjdGl2ZSBpbiBhIHByb2dyYW0uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FDVElWRV9VTklGT1JNUyA9IDB4OGI4NjtcblxuLyoqXG4gKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBwb3NzaWJsZSBpbiB0aGUgdmVydGV4IGF0dHJpYnV0ZSBsaXN0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgPSAweDg4Njk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyA9IDB4OGRmYjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMgPSAweDhkZmM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyA9IDB4OGI0ZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyA9IDB4OGI0YztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgbnVtYmVyIG9mIG1heGltdW0gdGV4dHVyZSB1bml0cy4gQXQgbGVhc3QgOC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgPSAweDg4NzI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTID0gMHg4ZGZkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0hBREVSX1RZUEUgPSAweDhiNGY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gPSAweDhiOGM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DVVJSRU5UX1BST0dSQU0gPSAweDhiOGQ7XG5cbi8vIERlcHRoIG9yIHN0ZW5jaWwgdGVzdHNcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LnN0ZW5jaWxGdW5jKCkuXG5cbi8qKlxuICogUGFzc2VkIHRvIGRlcHRoRnVuY3Rpb24gb3Igc3RlbmNpbEZ1bmN0aW9uIHRvIHNwZWNpZnkgZGVwdGggb3Igc3RlbmNpbCB0ZXN0cyB3aWxsIG5ldmVyIHBhc3MuIGkuZS4gTm90aGluZyB3aWxsIGJlIGRyYXduLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ORVZFUiA9IDB4MDIwMDtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZGVwdGhGdW5jdGlvbiBvciBzdGVuY2lsRnVuY3Rpb24gdG8gc3BlY2lmeSBkZXB0aCBvciBzdGVuY2lsIHRlc3RzIHdpbGwgYWx3YXlzIHBhc3MuIGkuZS4gUGl4ZWxzIHdpbGwgYmUgZHJhd24gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGRyYXduLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9BTFdBWVMgPSAweDAyMDc7XG5cbi8qKlxuICogUGFzc2VkIHRvIGRlcHRoRnVuY3Rpb24gb3Igc3RlbmNpbEZ1bmN0aW9uIHRvIHNwZWNpZnkgZGVwdGggb3Igc3RlbmNpbCB0ZXN0cyB3aWxsIHBhc3MgaWYgdGhlIG5ldyBkZXB0aCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHN0b3JlZCB2YWx1ZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTEVTUyA9IDB4MDIwMTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZGVwdGhGdW5jdGlvbiBvciBzdGVuY2lsRnVuY3Rpb24gdG8gc3BlY2lmeSBkZXB0aCBvciBzdGVuY2lsIHRlc3RzIHdpbGwgcGFzcyBpZiB0aGUgbmV3IGRlcHRoIHZhbHVlIGlzIGVxdWFscyB0byB0aGUgc3RvcmVkIHZhbHVlLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9FUVVBTCA9IDB4MDIwMjtcblxuLyoqXG4gKiAgUGFzc2VkIHRvIGRlcHRoRnVuY3Rpb24gb3Igc3RlbmNpbEZ1bmN0aW9uIHRvIHNwZWNpZnkgZGVwdGggb3Igc3RlbmNpbCB0ZXN0cyB3aWxsIHBhc3MgaWYgdGhlIG5ldyBkZXB0aCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN0b3JlZCB2YWx1ZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTEVRVUFMID0gMHgwMjAzO1xuXG4vKipcbiAqIFBhc3NlZCB0byBkZXB0aEZ1bmN0aW9uIG9yIHN0ZW5jaWxGdW5jdGlvbiB0byBzcGVjaWZ5IGRlcHRoIG9yIHN0ZW5jaWwgdGVzdHMgd2lsbCBwYXNzIGlmIHRoZSBuZXcgZGVwdGggdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzdG9yZWQgdmFsdWUuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0dSRUFURVIgPSAweDAyMDQ7XG5cbi8qKlxuICogUGFzc2VkIHRvIGRlcHRoRnVuY3Rpb24gb3Igc3RlbmNpbEZ1bmN0aW9uIHRvIHNwZWNpZnkgZGVwdGggb3Igc3RlbmNpbCB0ZXN0cyB3aWxsIHBhc3MgaWYgdGhlIG5ldyBkZXB0aCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN0b3JlZCB2YWx1ZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfR0VRVUFMID0gMHgwMjA2O1xuXG4vKipcbiAqIFBhc3NlZCB0byBkZXB0aEZ1bmN0aW9uIG9yIHN0ZW5jaWxGdW5jdGlvbiB0byBzcGVjaWZ5IGRlcHRoIG9yIHN0ZW5jaWwgdGVzdHMgd2lsbCBwYXNzIGlmIHRoZSBuZXcgZGVwdGggdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzdG9yZWQgdmFsdWUuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX05PVEVRVUFMID0gMHgwMjA1O1xuXG4vLyBTdGVuY2lsIGFjdGlvbnNcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LnN0ZW5jaWxPcCgpLlxuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfS0VFUCA9IDB4MWUwMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFUExBQ0UgPSAweDFlMDE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9JTkNSID0gMHgxZTAyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREVDUiA9IDB4MWUwMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOVkVSVCA9IDB4MTUwYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOQ1JfV1JBUCA9IDB4ODUwNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFQ1JfV1JBUCA9IDB4ODUwODtcblxuLy8gVGV4dHVyZXNcbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LnRleFBhcmFtZXRlcmkoKSwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LnRleFBhcmFtZXRlcmYoKSwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LmJpbmRUZXh0dXJlKCksIFdlYkdMUmVuZGVyaW5nQ29udGV4dC50ZXhJbWFnZTJEKCksIGFuZCBvdGhlcnMuXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ORUFSRVNUID0gMHgyNjAwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTElORUFSID0gMHgyNjAxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCA9IDB4MjcwMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCA9IDB4MjcwMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSID0gMHgyNzAzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9NQUdfRklMVEVSID0gMHgyODAwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9NSU5fRklMVEVSID0gMHgyODAxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9XUkFQX1MgPSAweDI4MDI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFX1dSQVBfVCA9IDB4MjgwMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfMkQgPSAweDBkZTE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFID0gMHgxNzAyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9DVUJFX01BUCA9IDB4ODUxMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCA9IDB4ODUxNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCA9IDB4ODUxNTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCA9IDB4ODUxNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSA9IDB4ODUxNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSA9IDB4ODUxODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiA9IDB4ODUxOTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiA9IDB4ODUxYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgPSAweDg1MWM7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUwID0gMHg4NGMwO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMSA9IDB4ODRjMTtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTIgPSAweDg0YzI7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUzID0gMHg4NGMzO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFNCA9IDB4ODRjNDtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTUgPSAweDg0YzU7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkU2ID0gMHg4NGM2O1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFNyA9IDB4ODRjNztcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTggPSAweDg0Yzg7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkU5ID0gMHg4NGM5O1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMTAgPSAweDg0Y2E7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUxMSA9IDB4ODRjYjtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTEyID0gMHg4NGNjO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMTMgPSAweDg0Y2Q7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUxNCA9IDB4ODRjZTtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTE1ID0gMHg4NGNmO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMTYgPSAweDg0ZDA7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUxNyA9IDB4ODRkMTtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTE4ID0gMHg4NGQyO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMTkgPSAweDg0ZDM7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUyMCA9IDB4ODRkNDtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTIxID0gMHg4NGQ1O1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMjIgPSAweDg0ZDY7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUyMyA9IDB4ODRkNztcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTI0ID0gMHg4NGQ4O1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMjUgPSAweDg0ZDk7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUyNiA9IDB4ODRkYTtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTI3ID0gMHg4NGRiO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMjggPSAweDg0ZGM7XG5cbi8qKlxuICogQSB0ZXh0dXJlIHVuaXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkUyOSA9IDB4ODRkZDtcblxuLyoqXG4gKiBBIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRTMwID0gMHg4NGRlO1xuXG4vKipcbiAqIEEgdGV4dHVyZSB1bml0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFMzEgPSAweDg0ZGY7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYWN0aXZlIHRleHR1cmUgdW5pdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQUNUSVZFX1RFWFRVUkUgPSAweDg0ZTA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRVBFQVQgPSAweDI5MDE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DTEFNUF9UT19FREdFID0gMHg4MTJmO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUlSUk9SRURfUkVQRUFUID0gMHg4MzcwO1xuXG4vLyBVbmlmb3JtIHR5cGVzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GTE9BVF9WRUMyID0gMHg4YjUwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfVkVDMyA9IDB4OGI1MTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZMT0FUX1ZFQzQgPSAweDhiNTI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9JTlRfVkVDMiA9IDB4OGI1MztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOVF9WRUMzID0gMHg4YjU0O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSU5UX1ZFQzQgPSAweDhiNTU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9CT09MID0gMHg4YjU2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQk9PTF9WRUMyID0gMHg4YjU3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQk9PTF9WRUMzID0gMHg4YjU4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQk9PTF9WRUM0ID0gMHg4YjU5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUMiA9IDB4OGI1YTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZMT0FUX01BVDMgPSAweDhiNWI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GTE9BVF9NQVQ0ID0gMHg4YjVjO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0FNUExFUl8yRCA9IDB4OGI1ZTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRVJfQ1VCRSA9IDB4OGI2MDtcblxuLy8gU2hhZGVyIHByZWNpc2lvbi1zcGVjaWZpZWQgdHlwZXNcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0xPV19GTE9BVCA9IDB4OGRmMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01FRElVTV9GTE9BVCA9IDB4OGRmMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0hJR0hfRkxPQVQgPSAweDhkZjI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9MT1dfSU5UID0gMHg4ZGYzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUVESVVNX0lOVCA9IDB4OGRmNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0hJR0hfSU5UID0gMHg4ZGY1O1xuXG4vLyBGcmFtZWJ1ZmZlcnMgYW5kIHJlbmRlcmJ1ZmZlcnNcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSID0gMHg4ZDQwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkVOREVSQlVGRkVSID0gMHg4ZDQxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCQTQgPSAweDgwNTY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0I1X0ExID0gMHg4MDU3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCNTY1ID0gMHg4ZDYyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREVQVEhfQ09NUE9ORU5UMTYgPSAweDgxYTU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX0lOREVYID0gMHgxOTAxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RFTkNJTF9JTkRFWDggPSAweDhkNDg7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSF9TVEVOQ0lMID0gMHg4NGY5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkVOREVSQlVGRkVSX1dJRFRIID0gMHg4ZDQyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkVOREVSQlVGRkVSX0hFSUdIVCA9IDB4OGQ0MztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQgPSAweDhkNDQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgPSAweDhkNTA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRSA9IDB4OGQ1MTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkUgPSAweDhkNTI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSA9IDB4OGQ1MztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFID0gMHg4ZDU0O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSA9IDB4OGQ1NTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUgPSAweDhjZDA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FID0gMHg4Y2QxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMID0gMHg4Y2QyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UgPSAweDhjZDM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCA9IDB4OGNlMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIX0FUVEFDSE1FTlQgPSAweDhkMDA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQgPSAweDhkMjA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgPSAweDgyMWE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9OT05FID0gMDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFID0gMHg4Y2Q1O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UID0gMHg4Y2Q2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgPSAweDhjZDc7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgPSAweDhjZDk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCA9IDB4OGNkZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkcgPSAweDhjYTY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRU5ERVJCVUZGRVJfQklORElORyA9IDB4OGNhNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSA9IDB4ODRlODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OID0gMHgwNTA2O1xuXG4vLyBQaXhlbCBzdG9yYWdlIG1vZGVzXG4vLyBDb25zdGFudHMgcGFzc2VkIHRvIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5waXhlbFN0b3JlaSgpLlxuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5QQUNLX0ZMSVBfWV9XRUJHTCA9IDB4OTI0MDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCA9IDB4OTI0MTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wgPSAweDkyNDM7XG5cbi8vIEFkZGl0aW9uYWwgY29uc3RhbnRzIGRlZmluZWQgV2ViR0wgMlxuLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIG9uIHRoZSBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IGludGVyZmFjZS4gQWxsIFdlYkdMIDEgY29uc3RhbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiBhIFdlYkdMIDIgY29udGV4dC5cblxuLy8gR2V0dGluZyBHTCBwYXJhbWV0ZXIgaW5mb3JtYXRpb25cbi8vIENvbnN0YW50cyBwYXNzZWQgdG8gV2ViR0xSZW5kZXJpbmdDb250ZXh0LmdldFBhcmFtZXRlcigpIHRvIHNwZWNpZnkgd2hhdCBpbmZvcm1hdGlvbiB0byByZXR1cm4uXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRUFEX0JVRkZFUiA9IDB4MGMwMjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOUEFDS19ST1dfTEVOR1RIID0gMHgwY2YyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5QQUNLX1NLSVBfUk9XUyA9IDB4MGNmMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOUEFDS19TS0lQX1BJWEVMUyA9IDB4MGNmNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1BBQ0tfUk9XX0xFTkdUSCA9IDB4MGQwMjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1BBQ0tfU0tJUF9ST1dTID0gMHgwZDAzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUEFDS19TS0lQX1BJWEVMUyA9IDB4MGQwNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQklORElOR18zRCA9IDB4ODA2YTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOUEFDS19TS0lQX0lNQUdFUyA9IDB4ODA2ZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOUEFDS19JTUFHRV9IRUlHSFQgPSAweDgwNmU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfM0RfVEVYVFVSRV9TSVpFID0gMHg4MDczO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTID0gMHg4MGU4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgPSAweDgwZTk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVEVYVFVSRV9MT0RfQklBUyA9IDB4ODRmZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgPSAweDhiNDk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyA9IDB4OGI0YTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSUyA9IDB4ODhmZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01JTl9QUk9HUkFNX1RFWEVMX09GRlNFVCA9IDB4ODkwNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9QUk9HUkFNX1RFWEVMX09GRlNFVCA9IDB4ODkwNTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9WQVJZSU5HX0NPTVBPTkVOVFMgPSAweDhiNGI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UID0gMHg4YjhiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkFTVEVSSVpFUl9ESVNDQVJEID0gMHg4Yzg5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkcgPSAweDg1YjU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTID0gMHg5MTIyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX0ZSQUdNRU5UX0lOUFVUX0NPTVBPTkVOVFMgPSAweDkxMjU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfU0VSVkVSX1dBSVRfVElNRU9VVCA9IDB4OTExMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9FTEVNRU5UX0lOREVYID0gMHg4ZDZiO1xuXG4vLyBUZXh0dXJlc1xuLy8gQ29uc3RhbnRzIHBhc3NlZCB0byBXZWJHTFJlbmRlcmluZ0NvbnRleHQudGV4UGFyYW1ldGVyaSgpLCBXZWJHTFJlbmRlcmluZ0NvbnRleHQudGV4UGFyYW1ldGVyZigpLCBXZWJHTFJlbmRlcmluZ0NvbnRleHQuYmluZFRleHR1cmUoKSwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LnRleEltYWdlMkQoKSwgYW5kIG90aGVycy5cblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFRCA9IDB4MTkwMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjggPSAweDgwNTE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0JBOCA9IDB4ODA1ODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjEwX0EyID0gMHg4MDU5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV8zRCA9IDB4ODA2ZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfV1JBUF9SID0gMHg4MDcyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9NSU5fTE9EID0gMHg4MTNhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9NQVhfTE9EID0gMHg4MTNiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9CQVNFX0xFVkVMID0gMHg4MTNjO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV9NQVhfTEVWRUwgPSAweDgxM2Q7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERSA9IDB4ODg0YztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DID0gMHg4ODRkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1JHQiA9IDB4OGM0MDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NSR0I4ID0gMHg4YzQxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1JHQjhfQUxQSEE4ID0gMHg4YzQzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUEFSRV9SRUZfVE9fVEVYVFVSRSA9IDB4ODg0ZTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkEzMkYgPSAweDg4MTQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0IzMkYgPSAweDg4MTU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0JBMTZGID0gMHg4ODFhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCMTZGID0gMHg4ODFiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVEVYVFVSRV8yRF9BUlJBWSA9IDB4OGMxYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWSA9IDB4OGMxZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1IxMUZfRzExRl9CMTBGID0gMHg4YzNhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCOV9FNSA9IDB4OGMzZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkEzMlVJID0gMHg4ZDcwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCMzJVSSA9IDB4OGQ3MTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkExNlVJID0gMHg4ZDc2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCMTZVSSA9IDB4OGQ3NztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkE4VUkgPSAweDhkN2M7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0I4VUkgPSAweDhkN2Q7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0JBMzJJID0gMHg4ZDgyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCMzJJID0gMHg4ZDgzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkdCQTE2SSA9IDB4OGQ4ODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjE2SSA9IDB4OGQ4OTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkE4SSA9IDB4OGQ4ZTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjhJID0gMHg4ZDhmO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkVEX0lOVEVHRVIgPSAweDhkOTQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0JfSU5URUdFUiA9IDB4OGQ5ODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkFfSU5URUdFUiA9IDB4OGQ5OTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1I4ID0gMHg4MjI5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkc4ID0gMHg4MjJiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUjE2RiA9IDB4ODIyZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1IzMkYgPSAweDgyMmU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRzE2RiA9IDB4ODIyZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHMzJGID0gMHg4MjMwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUjhJID0gMHg4MjMxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUjhVSSA9IDB4ODIzMjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1IxNkkgPSAweDgyMzM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SMTZVSSA9IDB4ODIzNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1IzMkkgPSAweDgyMzU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SMzJVSSA9IDB4ODIzNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHOEkgPSAweDgyMzc7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRzhVSSA9IDB4ODIzODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHMTZJID0gMHg4MjM5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkcxNlVJID0gMHg4MjNhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkczMkkgPSAweDgyM2I7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRzMyVUkgPSAweDgyM2M7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SOF9TTk9STSA9IDB4OGY5NDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHOF9TTk9STSA9IDB4OGY5NTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjhfU05PUk0gPSAweDhmOTY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR0JBOF9TTk9STSA9IDB4OGY5NztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjEwX0EyVUkgPSAweDkwNmY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVQgPSAweDkxMmY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFX0lNTVVUQUJMRV9MRVZFTFMgPSAweDgyZGY7XG5cbi8vIFBpeGVsIHR5cGVzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgPSAweDgzNjg7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWID0gMHg4YzNiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5TSUdORURfSU5UXzVfOV85XzlfUkVWID0gMHg4YzNlO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWID0gMHg4ZGFkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5TSUdORURfSU5UXzI0XzggPSAweDg0ZmE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9IQUxGX0ZMT0FUID0gMHgxNDBiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUkcgPSAweDgyMjc7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SR19JTlRFR0VSID0gMHg4MjI4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSU5UXzJfMTBfMTBfMTBfUkVWID0gMHg4ZDlmO1xuXG4vLyBRdWVyaWVzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DVVJSRU5UX1FVRVJZID0gMHg4ODY1O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUVVFUllfUkVTVUxUID0gMHg4ODY2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRSA9IDB4ODg2NztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FOWV9TQU1QTEVTX1BBU1NFRCA9IDB4OGMyZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkUgPSAweDhkNmE7XG5cbi8vIERyYXcgYnVmZmVyc1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX0RSQVdfQlVGRkVSUyA9IDB4ODgyNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMCA9IDB4ODgyNTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMSA9IDB4ODgyNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMiA9IDB4ODgyNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMyA9IDB4ODgyODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSNCA9IDB4ODgyOTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSNSA9IDB4ODgyYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSNiA9IDB4ODgyYjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSNyA9IDB4ODgyYztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSOCA9IDB4ODgyZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSOSA9IDB4ODgyZTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMTAgPSAweDg4MmY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjExID0gMHg4ODMwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19CVUZGRVIxMiA9IDB4ODgzMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMTMgPSAweDg4MzI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjE0ID0gMHg4ODMzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19CVUZGRVIxNSA9IDB4ODgzNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UUyA9IDB4OGNkZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxID0gMHg4Y2UxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1JfQVRUQUNITUVOVDIgPSAweDhjZTI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMyA9IDB4OGNlMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQ0ID0gMHg4Y2U0O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1JfQVRUQUNITUVOVDUgPSAweDhjZTU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UNiA9IDB4OGNlNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQ3ID0gMHg4Y2U3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1JfQVRUQUNITUVOVDggPSAweDhjZTg7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UOSA9IDB4OGNlOTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxMCA9IDB4OGNlYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxMSA9IDB4OGNlYjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxMiA9IDB4OGNlYztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxMyA9IDB4OGNlZDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxNCA9IDB4OGNlZTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxNSA9IDB4OGNlZjtcblxuLy8gU2FtcGxlcnNcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRVJfM0QgPSAweDhiNWY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TQU1QTEVSXzJEX1NIQURPVyA9IDB4OGI2MjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRVJfMkRfQVJSQVkgPSAweDhkYzE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TQU1QTEVSXzJEX0FSUkFZX1NIQURPVyA9IDB4OGRjNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NBTVBMRVJfQ1VCRV9TSEFET1cgPSAweDhkYzU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9JTlRfU0FNUExFUl8yRCA9IDB4OGRjYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOVF9TQU1QTEVSXzNEID0gMHg4ZGNiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSU5UX1NBTVBMRVJfQ1VCRSA9IDB4OGRjYztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0lOVF9TQU1QTEVSXzJEX0FSUkFZID0gMHg4ZGNmO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkQgPSAweDhkZDI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8zRCA9IDB4OGRkMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkUgPSAweDhkZDQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWSA9IDB4OGRkNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9TQU1QTEVTID0gMHg4ZDU3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0FNUExFUl9CSU5ESU5HID0gMHg4OTE5O1xuXG4vLyBCdWZmZXJzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9QSVhFTF9QQUNLX0JVRkZFUiA9IDB4ODhlYjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1BJWEVMX1VOUEFDS19CVUZGRVIgPSAweDg4ZWM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HID0gMHg4OGVkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HID0gMHg4OGVmO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09QWV9SRUFEX0JVRkZFUiA9IDB4OGYzNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPUFlfV1JJVEVfQlVGRkVSID0gMHg4ZjM3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HID0gMHg4ZjM2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09QWV9XUklURV9CVUZGRVJfQklORElORyA9IDB4OGYzNztcblxuLy8gRGF0YSB0eXBlc1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUMlgzID0gMHg4YjY1O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUMlg0ID0gMHg4YjY2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUM1gyID0gMHg4YjY3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUM1g0ID0gMHg4YjY4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUNFgyID0gMHg4YjY5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRkxPQVRfTUFUNFgzID0gMHg4YjZhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5TSUdORURfSU5UX1ZFQzIgPSAweDhkYzY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05FRF9JTlRfVkVDMyA9IDB4OGRjNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOU0lHTkVEX0lOVF9WRUM0ID0gMHg4ZGM4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5TSUdORURfTk9STUFMSVpFRCA9IDB4OGMxNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NJR05FRF9OT1JNQUxJWkVEID0gMHg4ZjljO1xuXG4vLyBWZXJ0ZXggYXR0cmlidXRlc1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9JTlRFR0VSID0gMHg4OGZkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SID0gMHg4OGZlO1xuXG4vLyBUcmFuc2Zvcm0gZmVlZGJhY2tcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERSA9IDB4OGM3ZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UUyA9IDB4OGM4MDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HUyA9IDB4OGM4MztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQgPSAweDhjODQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NJWkUgPSAweDhjODU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfUFJJTUlUSVZFU19XUklUVEVOID0gMHg4Yzg4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTID0gMHg4YzhhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9BVFRSSUJTID0gMHg4YzhiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSU5URVJMRUFWRURfQVRUUklCUyA9IDB4OGM4YztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NFUEFSQVRFX0FUVFJJQlMgPSAweDhjOGQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSID0gMHg4YzhlO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HID0gMHg4YzhmO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVFJBTlNGT1JNX0ZFRURCQUNLID0gMHg4ZTIyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BBVVNFRCA9IDB4OGUyMztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkUgPSAweDhlMjQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQklORElORyA9IDB4OGUyNTtcblxuLy8gRnJhbWVidWZmZXJzIGFuZCByZW5kZXJidWZmZXJzXG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HID0gMHg4MjEwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT01QT05FTlRfVFlQRSA9IDB4ODIxMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkUgPSAweDgyMTI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkUgPSAweDgyMTM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0JMVUVfU0laRSA9IDB4ODIxNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRSA9IDB4ODIxNTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRSA9IDB4ODIxNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfU1RFTkNJTF9TSVpFID0gMHg4MjE3O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfREVGQVVMVCA9IDB4ODIxODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RFUFRIMjRfU1RFTkNJTDggPSAweDg4ZjA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkcgPSAweDhjYTY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9SRUFEX0ZSQU1FQlVGRkVSID0gMHg4Y2E4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19GUkFNRUJVRkZFUiA9IDB4OGNhOTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElORyA9IDB4OGNhYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTID0gMHg4Y2FiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSID0gMHg4Y2Q0O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRSA9IDB4OGQ1NjtcblxuLy8gVW5pZm9ybXNcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fQlVGRkVSID0gMHg4YTExO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9CVUZGRVJfQklORElORyA9IDB4OGEyODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fQlVGRkVSX1NUQVJUID0gMHg4YTI5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9CVUZGRVJfU0laRSA9IDB4OGEyYTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX01BWF9WRVJURVhfVU5JRk9STV9CTE9DS1MgPSAweDhhMmI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9CTE9DS1MgPSAweDhhMmQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfQ09NQklORURfVU5JRk9STV9CTE9DS1MgPSAweDhhMmU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1MgPSAweDhhMmY7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfVU5JRk9STV9CTE9DS19TSVpFID0gMHg4YTMwO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX0NPTUJJTkVEX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgPSAweDhhMzE7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTID0gMHg4YTMzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVCA9IDB4OGEzNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0FDVElWRV9VTklGT1JNX0JMT0NLUyA9IDB4OGEzNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fVFlQRSA9IDB4OGEzNztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fU0laRSA9IDB4OGEzODtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fQkxPQ0tfSU5ERVggPSAweDhhM2E7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTklGT1JNX09GRlNFVCA9IDB4OGEzYjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFID0gMHg4YTNjO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9NQVRSSVhfU1RSSURFID0gMHg4YTNkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9JU19ST1dfTUFKT1IgPSAweDhhM2U7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTklGT1JNX0JMT0NLX0JJTkRJTkcgPSAweDhhM2Y7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTklGT1JNX0JMT0NLX0RBVEFfU0laRSA9IDB4OGE0MDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TID0gMHg4YTQyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9CTE9DS19BQ1RJVkVfVU5JRk9STV9JTkRJQ0VTID0gMHg4YTQzO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVIgPSAweDhhNDQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSID0gMHg4YTQ2O1xuXG4vLyBTeW5jIG9iamVjdHNcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX09CSkVDVF9UWVBFID0gMHg5MTEyO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1lOQ19DT05ESVRJT04gPSAweDkxMTM7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TWU5DX1NUQVRVUyA9IDB4OTExNDtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NZTkNfRkxBR1MgPSAweDkxMTU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TWU5DX0ZFTkNFID0gMHg5MTE2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUgPSAweDkxMTc7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05BTEVEID0gMHg5MTE4O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU0lHTkFMRUQgPSAweDkxMTk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9BTFJFQURZX1NJR05BTEVEID0gMHg5MTFhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVElNRU9VVF9FWFBJUkVEID0gMHg5MTFiO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09ORElUSU9OX1NBVElTRklFRCA9IDB4OTExYztcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1dBSVRfRkFJTEVEID0gMHg5MTFkO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1lOQ19GTFVTSF9DT01NQU5EU19CSVQgPSAweDAwMDAwMDAxO1xuXG4vLyBNaXNjZWxsYW5lb3VzIGNvbnN0YW50c1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1IgPSAweDE4MDA7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSCA9IDB4MTgwMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NURU5DSUwgPSAweDE4MDI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NSU4gPSAweDgwMDc7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVggPSAweDgwMDg7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9ERVBUSF9DT01QT05FTlQyNCA9IDB4ODFhNjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NUUkVBTV9SRUFEID0gMHg4OGUxO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1RSRUFNX0NPUFkgPSAweDg4ZTI7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TVEFUSUNfUkVBRCA9IDB4ODhlNTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NUQVRJQ19DT1BZID0gMHg4OGU2O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFlOQU1JQ19SRUFEID0gMHg4OGU5O1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFlOQU1JQ19DT1BZID0gMHg4OGVhO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREVQVEhfQ09NUE9ORU5UMzJGID0gMHg4Y2FjO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfREVQVEgzMkZfU1RFTkNJTDggPSAweDhjYWQ7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9JTlZBTElEX0lOREVYID0gMHhmZmZmZmZmZjtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RJTUVPVVRfSUdOT1JFRCA9IC0xO1xuXG4vKipcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX0NMSUVOVF9XQUlUX1RJTUVPVVRfV0VCR0wgPSAweDkyNDc7XG5cbi8vIENvbnN0YW50cyBkZWZpbmVkIGluIFdlYkdMIGV4dGVuc2lvbnNcblxuLy8gQU5HTEVfaW5zdGFuY2VkX2FycmF5c1xuLy8gVGhlIEFOR0xFX2luc3RhbmNlZF9hcnJheXMgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgYWxsb3dzIHRvIGRyYXcgdGhlIHNhbWUgb2JqZWN0LCBvciBncm91cHMgb2Ygc2ltaWxhciBvYmplY3RzIG11bHRpcGxlIHRpbWVzLCBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIHZlcnRleCBkYXRhLCBwcmltaXRpdmUgY291bnQgYW5kIHR5cGUuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgZnJlcXVlbmN5IGRpdmlzb3IgdXNlZCBmb3IgaW5zdGFuY2VkIHJlbmRlcmluZy5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SX0FOR0xFID0gMHg4OGZlO1xuXG4vLyBXRUJHTF9kZWJ1Z19yZW5kZXJlcl9pbmZvXG4vLyBUaGUgV0VCR0xfZGVidWdfcmVuZGVyZXJfaW5mbyBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHBvc2VzIHR3byBjb25zdGFudHMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ3JhcGhpY3MgZHJpdmVyIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4vKipcbiAqIFBhc3NlZCB0byBnZXRQYXJhbWV0ZXIgdG8gZ2V0IHRoZSB2ZW5kb3Igc3RyaW5nIG9mIHRoZSBncmFwaGljcyBkcml2ZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOTUFTS0VEX1ZFTkRPUl9XRUJHTCA9IDB4OTI0NTtcblxuLyoqXG4gKiBQYXNzZWQgdG8gZ2V0UGFyYW1ldGVyIHRvIGdldCB0aGUgcmVuZGVyZXIgc3RyaW5nIG9mIHRoZSBncmFwaGljcyBkcml2ZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOTUFTS0VEX1JFTkRFUkVSX1dFQkdMID0gMHg5MjQ2O1xuXG4vLyBFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcbi8vIFRoZSBFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgZXhwb3NlcyB0d28gY29uc3RhbnRzIGZvciBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgKEFGKS5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBhdmFpbGFibGUgYW5pc290cm9weS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUID0gMHg4NGZmO1xuXG4vKipcbiAqIFBhc3NlZCB0byB0ZXhQYXJhbWV0ZXIgdG8gc2V0IHRoZSBkZXNpcmVkIG1heGltdW0gYW5pc290cm9weSBmb3IgYSB0ZXh0dXJlLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCA9IDB4ODRmZTtcblxuLy8gV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNcbi8vIFRoZSBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHBvc2VzIGZvdXIgUzNUQyBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cy5cbi8qKlxuICogQSBEWFQxLWNvbXByZXNzZWQgaW1hZ2UgaW4gYW4gUkdCIGltYWdlIGZvcm1hdC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCA9IDB4ODNmMDtcblxuLyoqXG4gKiBBIERYVDEtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0IgaW1hZ2UgZm9ybWF0IHdpdGggYSBzaW1wbGUgb24vb2ZmIGFscGhhIHZhbHVlLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCA9IDB4ODNmMTtcblxuLyoqXG4gKiBBIERYVDMtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0JBIGltYWdlIGZvcm1hdC4gQ29tcGFyZWQgdG8gYSAzMi1iaXQgUkdCQSB0ZXh0dXJlLCBpdCBvZmZlcnMgNDoxIGNvbXByZXNzaW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCA9IDB4ODNmMjtcblxuLyoqXG4gKiBBIERYVDUtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0JBIGltYWdlIGZvcm1hdC4gSXQgYWxzbyBwcm92aWRlcyBhIDQ6MSBjb21wcmVzc2lvbiwgYnV0IGRpZmZlcnMgdG8gdGhlIERYVDMgY29tcHJlc3Npb24gaW4gaG93IHRoZSBhbHBoYSBjb21wcmVzc2lvbiBpcyBkb25lLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCA9IDB4ODNmMztcblxuLy8gV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNfc3JnYlxuLy8gVGhlIFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2IgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgZXhwb3NlcyBmb3VyIFMzVEMgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMgZm9yIHRoZSBzUkdCIGNvbG9yc3BhY2UuXG4vKipcbiAqIEEgRFhUMS1jb21wcmVzc2VkIGltYWdlIGluIGFuIHNSR0IgaW1hZ2UgZm9ybWF0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX0VYVCA9IDB4OGM0YztcblxuLyoqXG4gKiBBIERYVDEtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBzUkdCIGltYWdlIGZvcm1hdCB3aXRoIGEgc2ltcGxlIG9uL29mZiBhbHBoYSB2YWx1ZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQgPSAweDhjNGQ7XG5cbi8qKlxuICogQSBEWFQzLWNvbXByZXNzZWQgaW1hZ2UgaW4gYW4gc1JHQkEgaW1hZ2UgZm9ybWF0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQzX0VYVCA9IDB4OGM0ZTtcblxuLyoqXG4gKiBBIERYVDUtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBzUkdCQSBpbWFnZSBmb3JtYXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUID0gMHg4YzRmO1xuXG4vLyBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjXG4vLyBUaGUgV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YyBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHBvc2VzIDEwIEVUQy9FQUMgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMuXG4vKipcbiAqIE9uZS1jaGFubmVsIChyZWQpIHVuc2lnbmVkIGZvcm1hdCBjb21wcmVzc2lvbi5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SMTFfRUFDID0gMHg5MjcwO1xuXG4vKipcbiAqIE9uZS1jaGFubmVsIChyZWQpIHNpZ25lZCBmb3JtYXQgY29tcHJlc3Npb24uXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUMgPSAweDkyNzE7XG5cbi8qKlxuICogVHdvLWNoYW5uZWwgKHJlZCBhbmQgZ3JlZW4pIHVuc2lnbmVkIGZvcm1hdCBjb21wcmVzc2lvbi5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SRzExX0VBQyA9IDB4OTI3MjtcblxuLyoqXG4gKiBUd28tY2hhbm5lbCAocmVkIGFuZCBncmVlbikgc2lnbmVkIGZvcm1hdCBjb21wcmVzc2lvbi5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9TSUdORURfUkcxMV9FQUMgPSAweDkyNzM7XG5cbi8qKlxuICogQ29tcHJlc3NlcyBSQkc4IGRhdGEgd2l0aCBubyBhbHBoYSBjaGFubmVsLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQjhfRVRDMiA9IDB4OTI3NDtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkE4IGRhdGEuIFRoZSBSR0IgcGFydCBpcyBlbmNvZGVkIHRoZSBzYW1lIGFzIFJHQl9FVEMyLCBidXQgdGhlIGFscGhhIHBhcnQgaXMgZW5jb2RlZCBzZXBhcmF0ZWx5LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDID0gMHg5Mjc1O1xuXG4vKipcbiAqIENvbXByZXNzZXMgc1JCRzggZGF0YSB3aXRoIG5vIGFscGhhIGNoYW5uZWwuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfRVRDMiA9IDB4OTI3NjtcblxuLyoqXG4gKiBDb21wcmVzc2VzIHNSR0JBOCBkYXRhLiBUaGUgc1JHQiBwYXJ0IGlzIGVuY29kZWQgdGhlIHNhbWUgYXMgU1JHQl9FVEMyLCBidXQgdGhlIGFscGhhIHBhcnQgaXMgZW5jb2RlZCBzZXBhcmF0ZWx5LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQyA9IDB4OTI3NztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIFJHQjhfRVRDLCBidXQgd2l0aCBhYmlsaXR5IHRvIHB1bmNoIHRocm91Z2ggdGhlIGFscGhhIGNoYW5uZWwsIHdoaWNoIG1lYW5zIHRvIG1ha2UgaXQgY29tcGxldGVseSBvcGFxdWUgb3IgdHJhbnNwYXJlbnQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzIgPSAweDkyNzg7XG5cbi8qKlxuICogU2ltaWxhciB0byBTUkdCOF9FVEMsIGJ1dCB3aXRoIGFiaWxpdHkgdG8gcHVuY2ggdGhyb3VnaCB0aGUgYWxwaGEgY2hhbm5lbCwgd2hpY2ggbWVhbnMgdG8gbWFrZSBpdCBjb21wbGV0ZWx5IG9wYXF1ZSBvciB0cmFuc3BhcmVudC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzIgPSAweDkyNzk7XG5cbi8vIFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1xuLy8gVGhlIFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHBvc2VzIGZvdXIgUFZSVEMgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMuXG4vKipcbiAqIFJHQiBjb21wcmVzc2lvbiBpbiA0LWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggNMOXNCBwaXhlbHMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcgPSAweDhjMDA7XG5cbi8qKlxuICogUkdCQSBjb21wcmVzc2lvbiBpbiA0LWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggNMOXNCBwaXhlbHMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HID0gMHg4YzAyO1xuXG4vKipcbiAqIFJHQiBjb21wcmVzc2lvbiBpbiAyLWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggOMOXNCBwaXhlbHMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUcgPSAweDhjMDE7XG5cbi8qKlxuICogUkdCQSBjb21wcmVzc2lvbiBpbiAyLWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggOMOXNCBwaXhlbHMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HID0gMHg4YzAzO1xuXG4vLyBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMVxuLy8gVGhlIFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIGV4dGVuc2lvbiBpcyBwYXJ0IG9mIHRoZSBXZWJHTCBBUEkgYW5kIGV4cG9zZXMgdGhlIEVUQzEgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdC5cbi8qKlxuICogQ29tcHJlc3NlcyAyNC1iaXQgUkdCIGRhdGEgd2l0aCBubyBhbHBoYSBjaGFubmVsLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMID0gMHg4ZDY0O1xuXG4vLyBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXRjXG4vLyBUaGUgV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2F0YyBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHBvc2VzIDMgQVRDIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXRzLiBBVEMgaXMgYSBwcm9wcmlldGFyeSBjb21wcmVzc2lvbiBhbGdvcml0aG0gZm9yIGNvbXByZXNzaW5nIHRleHR1cmVzIG9uIGhhbmRoZWxkIGRldmljZXMuXG4vKipcbiAqIENvbXByZXNzZXMgUkdCIHRleHR1cmVzIHdpdGggbm8gYWxwaGEgY2hhbm5lbC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JfQVRDX1dFQkdMID0gMHg4YzkyO1xuXG4vKipcbiAqIENvbXByZXNzZXMgUkdCQSB0ZXh0dXJlcyB1c2luZyBleHBsaWNpdCBhbHBoYSBlbmNvZGluZyAodXNlZnVsIHdoZW4gYWxwaGEgdHJhbnNpdGlvbnMgYXJlIHNoYXJwKS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FUQ19FWFBMSUNJVF9BTFBIQV9XRUJHTCA9IDB4OGM5MjtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgaW50ZXJwb2xhdGVkIGFscGhhIGVuY29kaW5nICh1c2VmdWwgd2hlbiBhbHBoYSB0cmFuc2l0aW9ucyBhcmUgZ3JhZGllbnQpLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkFfQVRDX0lOVEVSUE9MQVRFRF9BTFBIQV9XRUJHTCA9IDB4ODdlZTtcblxuLy8gV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGNcbi8vIFRoZSBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHBvc2VzIEFkYXB0aXZlIFNjYWxhYmxlIFRleHR1cmUgQ29tcHJlc3Npb24gKEFTVEMpIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXRzIHRvIFdlYkdMLlxuLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0Yy9cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm52aWRpYS5jb20vYXN0Yy10ZXh0dXJlLWNvbXByZXNzaW9uLWZvci1nYW1lLWFzc2V0c1xuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA0eDRcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNFg0X0tIUiA9IDB4OTNiMDtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA1eDRcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNVg0X0tIUiA9IDB4OTNiMTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA1eDVcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNVg1X0tIUiA9IDB4OTNiMjtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA2eDVcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNlg1X0tIUiA9IDB4OTNiMztcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA2eDZcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNlg2X0tIUiA9IDB4OTNiNDtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA4eDVcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfOFg1X0tIUiA9IDB4OTNiNTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA4eDZcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfOFg2X0tIUiA9IDB4OTNiNjtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiA4eDhcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfOFg4X0tIUiA9IDB4OTNiNztcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiAxMHg1XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzEwWDVfS0hSID0gMHg5M2I4O1xuXG4vKipcbiAqIENvbXByZXNzZXMgUkdCQSB0ZXh0dXJlcyB1c2luZyBBU1RDIGNvbXByZXNzaW9uIGluIGEgYmxvY2tzaXplIG9mIDEweDZcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfMTBYNl9LSFIgPSAweDkzYjk7XG5cbi8qKlxuICogQ29tcHJlc3NlcyBSR0JBIHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgMTB4OFxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ18xMFg4X0tIUiA9IDB4OTNiYTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFJHQkEgdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiAxMHgxMFxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ18xMFgxMF9LSFIgPSAweDkzYmI7XG5cbi8qKlxuICogQ29tcHJlc3NlcyBSR0JBIHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgMTJ4MTBcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJYMTBfS0hSID0gMHg5M2JjO1xuXG4vKipcbiAqIENvbXByZXNzZXMgUkdCQSB0ZXh0dXJlcyB1c2luZyBBU1RDIGNvbXByZXNzaW9uIGluIGEgYmxvY2tzaXplIG9mIDEyeDEyXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzEyWDEyX0tIUiA9IDB4OTNiZDtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgNHg0XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNFg0X0tIUiA9IDB4OTNkMDtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgNXg0XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNVg0X0tIUiA9IDB4OTNkMTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgNXg1XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNVg1X0tIUiA9IDB4OTNkMjtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgNng1XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNlg1X0tIUiA9IDB4OTNkMztcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgNng2XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNlg2X0tIUiA9IDB4OTNkNDtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgOHg1XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOFg1X0tIUiA9IDB4OTNkNTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgOHg2XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOFg2X0tIUiA9IDB4OTNkNjtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgOHg4XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOFg4X0tIUiA9IDB4OTNkNztcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgMTB4NVxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEwWDVfS0hSID0gMHg5M2Q4O1xuXG4vKipcbiAqIENvbXByZXNzZXMgU1JHQjggdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiAxMHg2XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTBYNl9LSFIgPSAweDkzZDk7XG5cbi8qKlxuICogQ29tcHJlc3NlcyBTUkdCOCB0ZXh0dXJlcyB1c2luZyBBU1RDIGNvbXByZXNzaW9uIGluIGEgYmxvY2tzaXplIG9mIDEweDhcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMFg4X0tIUiA9IDB4OTNkYTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIFNSR0I4IHRleHR1cmVzIHVzaW5nIEFTVEMgY29tcHJlc3Npb24gaW4gYSBibG9ja3NpemUgb2YgMTB4MTBcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMFgxMF9LSFIgPSAweDkzZGI7XG5cbi8qKlxuICogQ29tcHJlc3NlcyBTUkdCOCB0ZXh0dXJlcyB1c2luZyBBU1RDIGNvbXByZXNzaW9uIGluIGEgYmxvY2tzaXplIG9mIDEyeDEwXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTJYMTBfS0hSID0gMHg5M2RjO1xuXG4vKipcbiAqIENvbXByZXNzZXMgU1JHQjggdGV4dHVyZXMgdXNpbmcgQVNUQyBjb21wcmVzc2lvbiBpbiBhIGJsb2Nrc2l6ZSBvZiAxMngxMlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyWDEyX0tIUiA9IDB4OTNkZDtcblxuLy8gV0VCR0xfZGVwdGhfdGV4dHVyZVxuLy8gVGhlIFdFQkdMX2RlcHRoX3RleHR1cmUgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgZGVmaW5lcyAyRCBkZXB0aCBhbmQgZGVwdGgtc3RlbmNpbCB0ZXh0dXJlcy5cbi8qKlxuICogVW5zaWduZWQgaW50ZWdlciB0eXBlIGZvciAyNC1iaXQgZGVwdGggdGV4dHVyZSBkYXRhLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9VTlNJR05FRF9JTlRfMjRfOF9XRUJHTCA9IDB4ODRmYTtcblxuLy8gT0VTX3RleHR1cmVfaGFsZl9mbG9hdFxuLy8gVGhlIE9FU190ZXh0dXJlX2hhbGZfZmxvYXQgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgYWRkcyB0ZXh0dXJlIGZvcm1hdHMgd2l0aCAxNi0gKGFrYSBoYWxmIGZsb2F0KSBhbmQgMzItYml0IGZsb2F0aW5nLXBvaW50IGNvbXBvbmVudHMuXG4vKipcbiAqIEhhbGYgZmxvYXRpbmctcG9pbnQgdHlwZSAoMTYtYml0KS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfSEFMRl9GTE9BVF9PRVMgPSAweDhkNjE7XG5cbi8vIFdFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdFxuLy8gVGhlIFdFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBhZGRzIHRoZSBhYmlsaXR5IHRvIHJlbmRlciB0byAzMi1iaXQgZmxvYXRpbmctcG9pbnQgY29sb3IgYnVmZmVycy5cbi8qKlxuICogUkdCQSAzMi1iaXQgZmxvYXRpbmctcG9pbnQgY29sb3ItcmVuZGVyYWJsZSBmb3JtYXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQkEzMkZfRVhUID0gMHg4ODE0O1xuXG4vKipcbiAqIFJHQiAzMi1iaXQgZmxvYXRpbmctcG9pbnQgY29sb3ItcmVuZGVyYWJsZSBmb3JtYXQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1JHQjMyRl9FWFQgPSAweDg4MTU7XG5cbi8qKlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFX0VYVCA9IDB4ODIxMTtcblxuLyoqXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1VOU0lHTkVEX05PUk1BTElaRURfRVhUID0gMHg4YzE3O1xuXG4vLyBFWFRfYmxlbmRfbWlubWF4XG4vLyBUaGUgRVhUX2JsZW5kX21pbm1heCBleHRlbnNpb24gaXMgcGFydCBvZiB0aGUgV2ViR0wgQVBJIGFuZCBleHRlbmRzIGJsZW5kaW5nIGNhcGFiaWxpdGllcyBieSBhZGRpbmcgdHdvIG5ldyBibGVuZCBlcXVhdGlvbnM6IHRoZSBtaW5pbXVtIG9yIG1heGltdW0gY29sb3IgY29tcG9uZW50cyBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvcnMuXG4vKipcbiAqIFByb2R1Y2VzIHRoZSBtaW5pbXVtIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY29sb3JzLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NSU5fRVhUID0gMHg4MDA3O1xuXG4vKipcbiAqIFByb2R1Y2VzIHRoZSBtYXhpbXVtIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY29sb3JzLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfRVhUID0gMHg4MDA4O1xuXG4vLyBFWFRfc1JHQlxuLy8gVGhlIEVYVF9zUkdCIGV4dGVuc2lvbiBpcyBwYXJ0IG9mIHRoZSBXZWJHTCBBUEkgYW5kIGFkZHMgc1JHQiBzdXBwb3J0IHRvIHRleHR1cmVzIGFuZCBmcmFtZWJ1ZmZlciBvYmplY3RzLlxuLyoqXG4gKiBVbnNpemVkIHNSR0IgZm9ybWF0IHRoYXQgbGVhdmVzIHRoZSBwcmVjaXNpb24gdXAgdG8gdGhlIGRyaXZlci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfU1JHQl9FWFQgPSAweDhjNDA7XG5cbi8qKlxuICogVW5zaXplZCBzUkdCIGZvcm1hdCB3aXRoIHVuc2l6ZWQgYWxwaGEgY29tcG9uZW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9TUkdCX0FMUEhBX0VYVCA9IDB4OGM0MjtcblxuLyoqXG4gKiBTaXplZCAoOC1iaXQpIHNSR0IgYW5kIGFscGhhIGZvcm1hdHMuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1NSR0I4X0FMUEhBOF9FWFQgPSAweDhjNDM7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnJhbWVidWZmZXIgY29sb3IgZW5jb2RpbmcuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkdfRVhUID0gMHg4MjEwO1xuXG4vLyBPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcbi8vIFRoZSBPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgYWRkcyB0aGUgR0xTTCBkZXJpdmF0aXZlIGZ1bmN0aW9ucyBkRmR4LCBkRmR5LCBhbmQgZndpZHRoLlxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGFjY3VyYWN5IG9mIHRoZSBkZXJpdmF0aXZlIGNhbGN1bGF0aW9uIGZvciB0aGUgR0xTTCBidWlsdC1pbiBmdW5jdGlvbnM6IGRGZHgsIGRGZHksIGFuZCBmd2lkdGguXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlRfT0VTID0gMHg4YjhiO1xuXG4vLyBXRUJHTF9kcmF3X2J1ZmZlcnNcbi8vIFRoZSBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgZW5hYmxlcyBhIGZyYWdtZW50IHNoYWRlciB0byB3cml0ZSB0byBzZXZlcmFsIHRleHR1cmVzLCB3aGljaCBpcyB1c2VmdWwgZm9yIGRlZmVycmVkIHNoYWRpbmcsIGZvciBleGFtcGxlLlxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9XRUJHTCA9IDB4OGNlMDtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMV9XRUJHTCA9IDB4OGNlMTtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9XRUJHTCA9IDB4OGNlMjtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UM19XRUJHTCA9IDB4OGNlMztcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UNF9XRUJHTCA9IDB4OGNlNDtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9XRUJHTCA9IDB4OGNlNTtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9XRUJHTCA9IDB4OGNlNjtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UN19XRUJHTCA9IDB4OGNlNztcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9XRUJHTCA9IDB4OGNlODtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9XRUJHTCA9IDB4OGNlOTtcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTBfV0VCR0wgPSAweDhjZWE7XG5cbi8qKlxuICogRnJhbWVidWZmZXIgY29sb3IgYXR0YWNobWVudCBwb2ludC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1JfQVRUQUNITUVOVDExX1dFQkdMID0gMHg4Y2ViO1xuXG4vKipcbiAqIEZyYW1lYnVmZmVyIGNvbG9yIGF0dGFjaG1lbnQgcG9pbnQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9XRUJHTCA9IDB4OGNlYztcblxuLyoqXG4gKiBGcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50IHBvaW50LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTNfV0VCR0wgPSAweDhjZWQ7XG5cbi8qKlxuICogRnJhbWVidWZmZXIgY29sb3IgYXR0YWNobWVudCBwb2ludC5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfQ09MT1JfQVRUQUNITUVOVDE0X1dFQkdMID0gMHg4Y2VlO1xuXG4vKipcbiAqIEZyYW1lYnVmZmVyIGNvbG9yIGF0dGFjaG1lbnQgcG9pbnQuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9XRUJHTCA9IDB4OGNlZjtcblxuLyoqXG4gKiBEcmF3IGJ1ZmZlci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19CVUZGRVIwX1dFQkdMID0gMHg4ODI1O1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjFfV0VCR0wgPSAweDg4MjY7XG5cbi8qKlxuICogRHJhdyBidWZmZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSMl9XRUJHTCA9IDB4ODgyNztcblxuLyoqXG4gKiBEcmF3IGJ1ZmZlci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19CVUZGRVIzX1dFQkdMID0gMHg4ODI4O1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjRfV0VCR0wgPSAweDg4Mjk7XG5cbi8qKlxuICogRHJhdyBidWZmZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSNV9XRUJHTCA9IDB4ODgyYTtcblxuLyoqXG4gKiBEcmF3IGJ1ZmZlci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19CVUZGRVI2X1dFQkdMID0gMHg4ODJiO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjdfV0VCR0wgPSAweDg4MmM7XG5cbi8qKlxuICogRHJhdyBidWZmZXIuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX0RSQVdfQlVGRkVSOF9XRUJHTCA9IDB4ODgyZDtcblxuLyoqXG4gKiBEcmF3IGJ1ZmZlci5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfRFJBV19CVUZGRVI5X1dFQkdMID0gMHg4ODJlO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjEwX1dFQkdMID0gMHg4ODJmO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjExX1dFQkdMID0gMHg4ODMwO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjEyX1dFQkdMID0gMHg4ODMxO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjEzX1dFQkdMID0gMHg4ODMyO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjE0X1dFQkdMID0gMHg4ODMzO1xuXG4vKipcbiAqIERyYXcgYnVmZmVyLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9EUkFXX0JVRkZFUjE1X1dFQkdMID0gMHg4ODM0O1xuXG4vKipcbiAqIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lYnVmZmVyIGNvbG9yIGF0dGFjaG1lbnQgcG9pbnRzLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfV0VCR0wgPSAweDhjZGY7XG5cbi8qKlxuICogTWF4aW11bSBudW1iZXIgb2YgZHJhdyBidWZmZXJzLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9NQVhfRFJBV19CVUZGRVJTX1dFQkdMID0gMHg4ODI0O1xuXG4vLyBPRVNfdmVydGV4X2FycmF5X29iamVjdFxuLy8gVGhlIE9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IGV4dGVuc2lvbiBpcyBwYXJ0IG9mIHRoZSBXZWJHTCBBUEkgYW5kIHByb3ZpZGVzIHZlcnRleCBhcnJheSBvYmplY3RzIChWQU9zKSB3aGljaCBlbmNhcHN1bGF0ZSB2ZXJ0ZXggYXJyYXkgc3RhdGVzLiBUaGVzZSBvYmplY3RzIGtlZXAgcG9pbnRlcnMgdG8gdmVydGV4IGRhdGEgYW5kIHByb3ZpZGUgbmFtZXMgZm9yIGRpZmZlcmVudCBzZXRzIG9mIHZlcnRleCBkYXRhLlxuLyoqXG4gKiBUaGUgYm91bmQgdmVydGV4IGFycmF5IG9iamVjdCAoVkFPKS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfT0VTID0gMHg4NWI1O1xuXG4vLyBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlcbi8vIFRoZSBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnkgZXh0ZW5zaW9uIGlzIHBhcnQgb2YgdGhlIFdlYkdMIEFQSSBhbmQgcHJvdmlkZXMgYSB3YXkgdG8gbWVhc3VyZSB0aGUgZHVyYXRpb24gb2YgYSBzZXQgb2YgR0wgY29tbWFuZHMsIHdpdGhvdXQgc3RhbGxpbmcgdGhlIHJlbmRlcmluZyBwaXBlbGluZS5cbi8qKlxuICogVGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gaG9sZCB0aGUgcXVlcnkgcmVzdWx0IGZvciB0aGUgZ2l2ZW4gdGFyZ2V0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9RVUVSWV9DT1VOVEVSX0JJVFNfRVhUID0gMHg4ODY0O1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHF1ZXJ5LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9DVVJSRU5UX1FVRVJZX0VYVCA9IDB4ODg2NTtcblxuLyoqXG4gKiBUaGUgcXVlcnkgcmVzdWx0LlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9RVUVSWV9SRVNVTFRfRVhUID0gMHg4ODY2O1xuXG4vKipcbiAqIEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGEgcXVlcnkgcmVzdWx0IGlzIGF2YWlsYWJsZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9FWFQgPSAweDg4Njc7XG5cbi8qKlxuICogRWxhcHNlZCB0aW1lIChpbiBuYW5vc2Vjb25kcykuXG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IEdMX1RJTUVfRUxBUFNFRF9FWFQgPSAweDg4YmY7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgdGltZS5cbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgR0xfVElNRVNUQU1QX0VYVCA9IDB4OGUyODtcblxuLyoqXG4gKiBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgR1BVIHBlcmZvcm1lZCBhbnkgZGlzam9pbnQgb3BlcmF0aW9uLlxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBHTF9HUFVfRElTSk9JTlRfRVhUID0gMHg4ZmJiO1xuIiwiZXhwb3J0IHR5cGUgR2x0ZjFBbnlPYmplY3QgPSB7XG4gIFtzOiBzdHJpbmddOiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBnbFRGMSA9IHtcbiAgYXNzZXQ6IHtcbiAgICBleHRyYXM/OiB7XG4gICAgICBybkxvYWRlck9wdGlvbnM/OiBhbnk7XG4gICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgZmlsZVR5cGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgYnVmZmVyczogYW55W107XG4gIGJ1ZmZlckRpYzogR2x0ZjFBbnlPYmplY3Q7XG5cbiAgc2NlbmVzOiBhbnlbXTtcbiAgc2NlbmVEaWM6IEdsdGYxQW55T2JqZWN0O1xuXG4gIG1lc2hlczogYW55W107XG4gIG1lc2hEaWM6IEdsdGYxQW55T2JqZWN0O1xuXG4gIG5vZGVzSW5kaWNlczogbnVtYmVyW107XG4gIG5vZGVzOiBhbnlbXTtcbiAgbm9kZURpYzogR2x0ZjFBbnlPYmplY3Q7XG5cbiAgc2tpbnM6IGFueVtdO1xuICBza2luRGljOiBHbHRmMUFueU9iamVjdDtcblxuICBtYXRlcmlhbHM6IGFueVtdO1xuICBtYXRlcmlhbERpYzogR2x0ZjFBbnlPYmplY3Q7XG5cbiAgY2FtZXJhczogYW55W107XG4gIGNhbWVyYURpYzogR2x0ZjFBbnlPYmplY3Q7XG5cbiAgc2hhZGVyczogYW55W107XG4gIHNoYWRlckRpYzogR2x0ZjFBbnlPYmplY3Q7XG5cbiAgaW1hZ2VzOiBhbnlbXTtcbiAgaW1hZ2VEaWM6IEdsdGYxQW55T2JqZWN0O1xuXG4gIGFuaW1hdGlvbnM6IEFycmF5PHtcbiAgICBjaGFubmVsczogYW55W107XG4gICAgc2FtcGxlcnM6IGFueVtdO1xuICAgIHBhcmFtZXRlcnM6IEdsdGYxQW55T2JqZWN0O1xuICB9PjtcblxuICBhbmltYXRpb25EaWM6IHtcbiAgICBbczogc3RyaW5nXToge1xuICAgICAgY2hhbm5lbHM6IGFueVtdO1xuICAgICAgc2FtcGxlcnM6IGFueVtdO1xuICAgIH07XG4gIH07XG5cbiAgdGV4dHVyZXM6IGFueVtdO1xuICB0ZXh0dXJlRGljOiBHbHRmMUFueU9iamVjdDtcblxuICBzYW1wbGVyczogYW55W107XG4gIHNhbXBsZXJEaWM6IEdsdGYxQW55T2JqZWN0O1xuXG4gIGFjY2Vzc29yczogYW55W107XG4gIGFjY2Vzc29yRGljOiBHbHRmMUFueU9iamVjdDtcblxuICBidWZmZXJWaWV3czogYW55W107XG4gIGJ1ZmZlclZpZXdEaWM6IEdsdGYxQW55T2JqZWN0O1xuXG4gIGJ1ZmZlcjogYW55W107XG4gIHRlY2huaXF1ZXM6IGFueVtdO1xufTtcbiIsImltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9FbnRpdHknO1xuaW1wb3J0IHsgUm5Qcm9taXNlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL1JuUHJvbWlzZSc7XG5pbXBvcnQgeyBBcnJheTMsIEluZGV4IH0gZnJvbSAnLi9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NFbnVtIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgQ2FtZXJhQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0NhbWVyYS9DYW1lcmFDb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0V4cHJlc3Npb24nO1xuaW1wb3J0IHsgSUxvYWRlckV4dGVuc2lvbiB9IGZyb20gJy4uL2ZvdW5kYXRpb24vaW1wb3J0ZXIvSUxvYWRlckV4dGVuc2lvbic7XG5pbXBvcnQgeyBBY2Nlc3NvciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWVtb3J5L0FjY2Vzc29yJztcbmltcG9ydCB7XG4gIEdMX0RBVEFfQllURSxcbiAgR0xfREFUQV9VTlNJR05FRF9CWVRFLFxuICBHTF9EQVRBX1NIT1JULFxuICBHTF9EQVRBX1VOU0lHTkVEX1NIT1JULFxuICBHTF9EQVRBX0lOVCxcbiAgR0xfREFUQV9VTlNJR05FRF9JTlQsXG4gIEdMX0RBVEFfRkxPQVQsXG59IGZyb20gJy4uL3R5cGVzL1dlYkdMQ29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBHbHRmMkFueU9iamVjdCB7XG4gIFtzOiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIEdsdGYyID0ge1xuICBhc3NldDoge1xuICAgIGV4dHJhcz86IHtcbiAgICAgIHJuTG9hZGVyT3B0aW9ucz86IEdsdGZMb2FkT3B0aW9uO1xuICAgICAgcm5FbnRpdGllcz86IEVudGl0eVtdO1xuICAgICAgcm5NYXRlcmlhbHM/OiB7IFtzOiBzdHJpbmddOiBNYXRlcmlhbCB9O1xuICAgICAgdmVyc2lvbj86IHN0cmluZztcbiAgICAgIGZpbGVUeXBlPzogc3RyaW5nO1xuICAgIH07XG4gICAgZ2VuZXJhdG9yOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICBidWZmZXJzPzogR2x0ZjJCdWZmZXJbXTtcbiAgc2NlbmVzPzogR2x0ZjJTY2VuZVtdO1xuICBzY2VuZT86IG51bWJlcjtcbiAgbWVzaGVzPzogR2x0ZjJNZXNoW107XG4gIG5vZGVzPzogR2x0ZjJOb2RlW107XG4gIHNraW5zPzogR2x0ZjJTa2luW107XG4gIG1hdGVyaWFscz86IEdsdGYyTWF0ZXJpYWxbXTtcbiAgY2FtZXJhcz86IEdsdGYyQ2FtZXJhW107XG4gIGltYWdlcz86IEdsdGYySW1hZ2VbXTtcbiAgYW5pbWF0aW9ucz86IEdsdGYyQW5pbWF0aW9uW107XG4gIHRleHR1cmVzPzogR2x0ZjJUZXh0dXJlW107XG4gIHNhbXBsZXJzPzogR2x0ZjJUZXh0dXJlU2FtcGxlcltdO1xuICBhY2Nlc3NvcnM/OiBHbHRmMkFjY2Vzc29yW107XG4gIGJ1ZmZlclZpZXdzPzogR2x0ZjJCdWZmZXJWaWV3W107XG4gIGV4dGVuc2lvbnNVc2VkPzogc3RyaW5nW107XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMlNjZW5lID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBzY2VuZT86IG51bWJlcjtcbiAgbm9kZXM/OiBudW1iZXJbXTtcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZU5hbWUgPVxuICB8ICdQT1NJVElPTidcbiAgfCAnTk9STUFMJ1xuICB8ICdUQU5HRU5UJ1xuICB8ICdURVhDT09SRF8wJ1xuICB8ICdURVhDT09SRF8xJ1xuICB8ICdURVhDT09SRF8yJ1xuICB8ICdDT0xPUl8wJ1xuICB8ICdKT0lOVFNfMCdcbiAgfCAnV0VJR0hUU18wJztcblxuZXhwb3J0IHR5cGUgR2x0ZjJBY2Nlc3NvckNvbXBvbmVudFR5cGVOdW1iZXIgPVxuICB8IHR5cGVvZiBHTF9EQVRBX0JZVEVcbiAgfCB0eXBlb2YgR0xfREFUQV9VTlNJR05FRF9CWVRFXG4gIHwgdHlwZW9mIEdMX0RBVEFfU0hPUlRcbiAgfCB0eXBlb2YgR0xfREFUQV9VTlNJR05FRF9TSE9SVFxuICB8IHR5cGVvZiBHTF9EQVRBX0lOVFxuICB8IHR5cGVvZiBHTF9EQVRBX1VOU0lHTkVEX0lOVFxuICB8IHR5cGVvZiBHTF9EQVRBX0ZMT0FUO1xuXG5leHBvcnQgdHlwZSBHbHRmMkFuaW1hdGlvbkFjY2Vzc29yQ29tcG9zaXRpb25UeXBlU3RyaW5nID0gJ1NDQUxBUicgfCAnVkVDMicgfCAnVkVDMycgfCAnVkVDNCc7XG5cbmV4cG9ydCB0eXBlIEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmcgPVxuICB8ICdTQ0FMQVInXG4gIHwgJ1ZFQzInXG4gIHwgJ1ZFQzMnXG4gIHwgJ1ZFQzQnXG4gIHwgJ01BVDInXG4gIHwgJ01BVDMnXG4gIHwgJ01BVDQnO1xuXG5leHBvcnQgdHlwZSBHbHRmMkFjY2Vzc29ySW5kZXggPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIEdsdGYyQXR0cmlidXRlcyA9IHsgW3M6IHN0cmluZ106IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgR2x0ZjJBdHRyaWJ1dGVBY2Nlc3NvcnMgPSBNYXA8c3RyaW5nLCBHbHRmMkFjY2Vzc29yPjtcbmV4cG9ydCB0eXBlIEdsdGYyQXR0cmlidXRlQmxlbmRTaGFwZXMgPSBHbHRmMkF0dHJpYnV0ZXNbXTtcbmV4cG9ydCB0eXBlIEdsdGYyQXR0cmlidXRlQmxlbmRTaGFwZXNBY2Nlc3NvcnMgPSBHbHRmMkF0dHJpYnV0ZUFjY2Vzc29yc1tdO1xuXG5leHBvcnQgdHlwZSBHbHRmMlByaW1pdGl2ZSA9IHtcbiAgYXR0cmlidXRlczogR2x0ZjJBdHRyaWJ1dGVzO1xuICBpbmRpY2VzPzogbnVtYmVyO1xuICBtYXRlcmlhbD86IG51bWJlcjtcbiAgbW9kZT86IG51bWJlcjtcbiAgdGFyZ2V0cz86IEdsdGYyQXR0cmlidXRlQmxlbmRTaGFwZXM7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMk1lc2ggPSB7XG4gIHByaW1pdGl2ZXM6IEdsdGYyUHJpbWl0aXZlW107XG4gIHdlaWdodHM/OiBudW1iZXJbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYyTm9kZSA9IHtcbiAgY2FtZXJhPzogbnVtYmVyO1xuICBjaGlsZHJlbj86IG51bWJlcltdO1xuICBza2luPzogbnVtYmVyO1xuICBtYXRyaXg/OiBudW1iZXJbXTtcbiAgbWVzaD86IG51bWJlcjtcbiAgbWVzaE5hbWVzPzogc3RyaW5nW107XG4gIHJvdGF0aW9uPzogbnVtYmVyW107XG4gIHNjYWxlPzogbnVtYmVyW107XG4gIHRyYW5zbGF0aW9uPzogbnVtYmVyW107XG4gIHdlaWdodHM/OiBudW1iZXJbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYyU2tpbiA9IHtcbiAgaW52ZXJzZUJpbmRNYXRyaWNlcz86IG51bWJlcjtcbiAgYmluZFNoYXBlTWF0cml4PzogbnVtYmVyW107XG4gIHNrZWxldG9uPzogbnVtYmVyO1xuICBqb2ludHM6IG51bWJlcltdO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgR2x0ZjJUZXh0dXJlSW5mbyA9IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgdGV4Q29vcmQ/OiBudW1iZXI7XG4gIHRleHR1cmU/OiBHbHRmMlRleHR1cmU7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMk9jY2x1c2lvblRleHR1cmVJbmZvID0ge1xuICBpbmRleDogbnVtYmVyO1xuICB0ZXhDb29yZD86IG51bWJlcjtcbiAgdGV4dHVyZT86IEdsdGYyVGV4dHVyZTtcbiAgc3RyZW5ndGg/OiBudW1iZXI7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMk5vcm1hbFRleHR1cmVJbmZvID0ge1xuICBpbmRleDogbnVtYmVyO1xuICB0ZXhDb29yZD86IG51bWJlcjtcbiAgdGV4dHVyZT86IEdsdGYyVGV4dHVyZTtcbiAgc2NhbGU/OiBudW1iZXI7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMlBick1ldGFsbGljUm91Z2huZXNzID0ge1xuICBiYXNlQ29sb3JGYWN0b3I/OiBudW1iZXJbXTtcbiAgYmFzZUNvbG9yVGV4dHVyZT86IEdsdGYyVGV4dHVyZUluZm87XG4gIG1ldGFsbGljRmFjdG9yPzogbnVtYmVyO1xuICByb3VnaG5lc3NGYWN0b3I/OiBudW1iZXI7XG4gIG1ldGFsbGljUm91Z2huZXNzVGV4dHVyZT86IEdsdGYyVGV4dHVyZUluZm87XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMk1hdGVyaWFsID0ge1xuICBwYnJNZXRhbGxpY1JvdWdobmVzcz86IEdsdGYyUGJyTWV0YWxsaWNSb3VnaG5lc3M7XG4gIG5vcm1hbFRleHR1cmU/OiBHbHRmMk5vcm1hbFRleHR1cmVJbmZvO1xuICBvY2NsdXNpb25UZXh0dXJlPzogR2x0ZjJPY2NsdXNpb25UZXh0dXJlSW5mbztcbiAgZW1pc3NpdmVUZXh0dXJlPzogR2x0ZjJUZXh0dXJlSW5mbztcbiAgZW1pc3NpdmVGYWN0b3I/OiBudW1iZXJbXTtcbiAgYWxwaGFNb2RlPzogc3RyaW5nO1xuICBhbHBoYUN1dG9mZj86IG51bWJlcjtcbiAgZG91YmxlU2lkZWQ/OiBib29sZWFuO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgR2x0ZjJDYW1lcmFPcnRob2dyYXBoaWMgPSB7XG4gIHhtYWc6IG51bWJlcjtcbiAgeW1hZzogbnVtYmVyO1xuICB6ZmFyOiBudW1iZXI7XG4gIHpuZWFyOiBudW1iZXI7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMkNhbWVyYVBlcnNwZWN0aXZlID0ge1xuICBhc3BlY3RSYXRpbz86IG51bWJlcjtcbiAgeWZvdjogbnVtYmVyO1xuICB6ZmFyPzogbnVtYmVyO1xuICB6bmVhcjogbnVtYmVyO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgR2x0ZjJDYW1lcmEgPSB7XG4gIG9ydGhvZ3JhcGhpYz86IEdsdGYyQ2FtZXJhT3J0aG9ncmFwaGljO1xuICBwZXJzcGVjdGl2ZT86IEdsdGYyQ2FtZXJhUGVyc3BlY3RpdmU7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYySW1hZ2UgPSB7XG4gIHVyaT86IHN0cmluZztcbiAgbWltZVR5cGU/OiBzdHJpbmc7XG4gIGJ1ZmZlclZpZXc/OiBudW1iZXI7XG4gIGltYWdlPzogSFRNTEltYWdlRWxlbWVudDtcbiAgYmFzaXM/OiBVaW50OEFycmF5O1xuICBrdHgyPzogVWludDhBcnJheTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYyQW5pbWF0aW9uUGF0aE5hbWUgPSAndHJhbnNsYXRpb24nIHwgJ3JvdGF0aW9uJyB8ICdzY2FsZScgfCAnd2VpZ2h0cycgfCAnZWZmZWtzZWVyJztcblxuZXhwb3J0IHR5cGUgR2x0ZjJBbmltYXRpb25DaGFubmVsVGFyZ2V0ID0ge1xuICBub2RlPzogbnVtYmVyO1xuICBwYXRoOiBHbHRmMkFuaW1hdGlvblBhdGhOYW1lO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxudHlwZSBHbHRmMkFuaW1hdGlvblNhbXBsZXJJbmRleCA9IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgR2x0ZjJBbmltYXRpb25DaGFubmVsID0ge1xuICBzYW1wbGVyOiBHbHRmMkFuaW1hdGlvblNhbXBsZXJJbmRleDtcbiAgdGFyZ2V0OiBHbHRmMkFuaW1hdGlvbkNoYW5uZWxUYXJnZXQ7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMkFuaW1hdGlvblNhbXBsZXJJbnRlcnBvbGF0aW9uID0gJ0xJTkVBUicgfCAnU1RFUCcgfCAnQ1VCSUNTUExJTkUnO1xuXG5leHBvcnQgdHlwZSBHbHRmMkFuaW1hdGlvblNhbXBsZXIgPSB7XG4gIGlucHV0OiBHbHRmMkFjY2Vzc29ySW5kZXg7XG4gIG91dHB1dDogR2x0ZjJBY2Nlc3NvckluZGV4O1xuICBpbnRlcnBvbGF0aW9uOiBHbHRmMkFuaW1hdGlvblNhbXBsZXJJbnRlcnBvbGF0aW9uO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgR2x0ZjJBbmltYXRpb24gPSB7XG4gIGNoYW5uZWxzOiBHbHRmMkFuaW1hdGlvbkNoYW5uZWxbXTtcbiAgc2FtcGxlcnM6IEdsdGYyQW5pbWF0aW9uU2FtcGxlcltdO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgR2x0ZjJUZXh0dXJlID0ge1xuICBzYW1wbGVyPzogbnVtYmVyO1xuICBzb3VyY2U/OiBudW1iZXI7XG4gIGltYWdlPzogR2x0ZjJJbWFnZTtcbiAgbmFtZT86IHN0cmluZztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYyVGV4dHVyZVNhbXBsZXIgPSB7XG4gIG1hZ0ZpbHRlcj86IG51bWJlcjtcbiAgbWluRmlsdGVyPzogbnVtYmVyO1xuICB3cmFwUz86IG51bWJlcjtcbiAgd3JhcFQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmMlNwYXJzZVZhbHVlcyA9IHtcbiAgYnVmZmVyVmlldzogbnVtYmVyO1xuICBieXRlT2Zmc2V0PzogbnVtYmVyO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgR2x0ZjJTcGFyc2VJbmRpY2VzID0ge1xuICBidWZmZXJWaWV3OiBudW1iZXI7XG4gIGJ5dGVPZmZzZXQ/OiBudW1iZXI7XG4gIGNvbXBvbmVudFR5cGU6IG51bWJlcjtcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYyU3BhcnNlID0ge1xuICBjb3VudDogbnVtYmVyO1xuICBpbmRpY2VzPzogR2x0ZjJTcGFyc2VJbmRpY2VzO1xuICB2YWx1ZXM/OiBHbHRmMlNwYXJzZVZhbHVlcztcbiAgZXh0ZW5zaW9ucz86IEdsdGYyQW55T2JqZWN0O1xuICBleHRyYXM/OiBHbHRmMkFueU9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGYyQnVmZmVyID0ge1xuICB1cmk/OiBzdHJpbmc7XG4gIGJ5dGVMZW5ndGg6IG51bWJlcjtcbiAgYnVmZmVyPzogVWludDhBcnJheTsgLy8gVWludDhBcnJheSBpcyBuZWVkZWQgaW5zdGVhZCBvZiBBcnJheUJ1ZmZlciwgYmVjYXVzZSBpdCBtYXkgaGF2ZSBub24temVybyBieXRlb2Zmc2V0IGZvciAuZ2xiIGZpbGUgaGVhZGVyXG4gIGRhdGFVcmk/OiBzdHJpbmc7XG4gIGJ1ZmZlclByb21pc2U/OiBSblByb21pc2U8QXJyYXlCdWZmZXI+O1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBHbHRmMkJ1ZmZlclZpZXcge1xuICBidWZmZXI/OiBudW1iZXI7XG4gIGJ5dGVPZmZzZXQ/OiBudW1iZXI7XG4gIGJ5dGVMZW5ndGg6IG51bWJlcjtcbiAgYnl0ZVN0cmlkZT86IG51bWJlcjtcbiAgdGFyZ2V0PzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBleHRlbnNpb25zPzogR2x0ZjJBbnlPYmplY3Q7XG4gIGV4dHJhcz86IEdsdGYyQW55T2JqZWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdsdGYyQWNjZXNzb3Ige1xuICBidWZmZXJWaWV3PzogbnVtYmVyO1xuICBieXRlT2Zmc2V0PzogbnVtYmVyO1xuICBieXRlU3RyaWRlPzogbnVtYmVyOyAvLyBmb3IgZ2xURjEgb25seVxuICBjb21wb25lbnRUeXBlOiBHbHRmMkFjY2Vzc29yQ29tcG9uZW50VHlwZU51bWJlcjtcbiAgbm9ybWFsaXplZD86IGJvb2xlYW47XG4gIGNvdW50OiBudW1iZXI7XG4gIHR5cGU6IEdsdGYyQWNjZXNzb3JDb21wb3NpdGlvblR5cGVTdHJpbmc7XG4gIG1heD86IG51bWJlcltdO1xuICBtaW4/OiBudW1iZXJbXTtcbiAgc3BhcnNlPzogR2x0ZjJTcGFyc2U7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY2Vzc29yPzogQWNjZXNzb3I7XG4gIGV4dGVuc2lvbnM/OiBHbHRmMkFueU9iamVjdDtcbiAgZXh0cmFzPzogR2x0ZjJBbnlPYmplY3Q7XG59XG5cbmV4cG9ydCB0eXBlIFBvaW50VHlwZSA9ICdkaXJlY3Rpb25hbCcgfCAncG9pbnQnIHwgJ3Nwb3QnO1xuXG5leHBvcnQgdHlwZSBLSFJfbGlnaHRzX3B1bmN0dWFsX0xpZ2h0ID0ge1xuICBjb2xvcjogQXJyYXkzPG51bWJlcj47XG4gIHR5cGU6IFBvaW50VHlwZTtcbiAgbmFtZT86IHN0cmluZztcbiAgaW50ZW5zaXR5PzogbnVtYmVyO1xuICByYW5nZTogbnVtYmVyO1xuICBzcG90Pzoge1xuICAgIGlubmVyQ29uZUFuZ2xlPzogbnVtYmVyO1xuICAgIG91dGVyQ29uZUFuZ2xlPzogbnVtYmVyO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgS0hSX2xpZ2h0c19wdW5jdHVhbCA9IHtcbiAgbGlnaHRzOiBLSFJfbGlnaHRzX3B1bmN0dWFsX0xpZ2h0W107XG59O1xuXG5leHBvcnQgdHlwZSBHbHRmRmlsZUJ1ZmZlcnMgPSB7XG4gIFtzOiBzdHJpbmddOiBBcnJheUJ1ZmZlcjtcbiAgLy8gICAgICAgIFwiZm9vLmdsdGZcIjogY29udGVudCBvZiBmaWxlIGFzIEFycmF5QnVmZmVyLFxuICAvLyAgICAgICAgXCJmb28uYmluXCI6IGNvbnRlbnQgb2YgZmlsZSBhcyBBcnJheUJ1ZmZlcixcbiAgLy8gICAgICAgIFwiYm9vLnBuZ1wiOiBjb250ZW50IG9mIGZpbGUgYXMgQXJyYXlCdWZmZXJcbn07XG5cbmV4cG9ydCB0eXBlIEdsdGZMb2FkT3B0aW9uID0ge1xuICBmaWxlcz86IEdsdGZGaWxlQnVmZmVycztcbiAgbG9hZGVyRXh0ZW5zaW9uTmFtZT86IHN0cmluZztcbiAgbG9hZGVyRXh0ZW5zaW9uPzogSUxvYWRlckV4dGVuc2lvbjtcbiAgZGVmYXVsdE1hdGVyaWFsSGVscGVyTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdE1hdGVyaWFsSGVscGVyQXJndW1lbnRBcnJheT86IGFueVtdO1xuICBzdGF0ZXNPZkVsZW1lbnRzPzogW1xuICAgIHtcbiAgICAgIHRhcmdldHM6IGFueVtdOyAvL1tcIm5hbWVfZm9vXCIsIFwibmFtZV9ib29cIl0sXG4gICAgICBzdGF0ZXM6IHtcbiAgICAgICAgZW5hYmxlOiBhbnlbXTtcbiAgICAgICAgLy8gMzA0MiwgIC8vIEJMRU5EXG4gICAgICAgIGZ1bmN0aW9uczogb2JqZWN0OyAvL1wiYmxlbmRGdW5jU2VwYXJhdGVcIjogWzEsIDAsIDEsIDBdLFxuICAgICAgfTtcbiAgICAgIGlzVHJhbnNwYXJlbnQ6IGJvb2xlYW47XG4gICAgICBvcGFjaXR5OiBudW1iZXI7XG4gICAgICBpc1RleHR1cmVJbWFnZVRvTG9hZFByZU11bHRpcGxpZWRBbHBoYTogYm9vbGVhbjtcbiAgICB9XG4gIF07XG4gIGFscGhhTW9kZT86IHN0cmluZztcbiAgaWdub3JlTGlzdHM/OiBbXTtcbiAgYXV0b0RldGVjdFRleHR1cmVUcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuICBhdXRvUmVzaXplVGV4dHVyZT86IGJvb2xlYW47XG4gIHRhbmdlbnRDYWxjdWxhdGlvbk1vZGU/OiBJbmRleDtcbiAgZXh0ZW5kZWRKc29uPzogc3RyaW5nIHwgT2JqZWN0IHwgQXJyYXlCdWZmZXI7IC8vICAgVVJJIHN0cmluZyAvIEpTT04gT2JqZWN0IC8gQXJyYXlCdWZmZXJcbiAgbWF4TW9ycGhUYXJnZXROdW1iZXI/OiBudW1iZXI7XG4gIGRlZmF1bHRUZXh0dXJlcz86IHtcbiAgICBiYXNlUGF0aDogc3RyaW5nOyAvLyBlLmcuIFwiLi9hc3NldHMvanBnL1wiXG4gICAgdGV4dHVyZUluZm9zOiB7XG4gICAgICBzaGFkZXJTZW1hbnRpY3M6IFNoYWRlclNlbWFudGljc0VudW07XG4gICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgaW1hZ2U/OiBHbHRmMkltYWdlO1xuICAgICAgc2FtcGxlcj86IGFueTtcbiAgICB9W107XG4gIH07XG4gIGNhbWVyYUNvbXBvbmVudD86IENhbWVyYUNvbXBvbmVudDtcbiAgZmlsZVR5cGU/OiBzdHJpbmc7XG4gIGV4cHJlc3Npb24/OiBFeHByZXNzaW9uOyAvLyBJZiBzcGVjaWZpZWQsIEdsdGZJbXBvcnRlciBzZXQgcmVuZGVyIHBhc3NlcyBpbmNsdWRpbmcgbG9hZGVkIG1vZGVsIHRvIHRoaXMgZXhwcmVzc2lvblxuICB0cmFuc21pc3Npb24/OiBib29sZWFuOyAvLyBTZXQgdG8gdHJ1ZSBieSB0aGUgaW1wb3J0ZXIgaWYgdGhlIEtIU19tYXRlcmlhbF90cmFuc21pc3Npb24gZXh0ZW5zaW9uIGlzIHVzZWQuXG4gIHNoYWRvdz86IGJvb2xlYW47IC8vIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGNhc3Qgc2hhZG93cy5cbiAgX19pc0ltcG9ydFZSTTB4PzogYm9vbGVhbjsgLy8gaW50ZXJuYWwgdXNlIG9ubHlcbiAgX19pbXBvcnRlZFR5cGU/OiAnZ2x0ZjInIHwgJ2dsYjInIHwgJ3ZybTB4JyB8ICd2cm0xJyB8ICdkcmFjbycgfCAndW5kZWZpbmVkJztcbn07XG5cbmV4cG9ydCBjb25zdCBUYWdHbHRmMk5vZGVJbmRleCA9ICdnbHRmX25vZGVfaW5kZXgnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lR2xURjJUZXh0dXJlU2FtcGxlcihsaHM6IEdsdGYyVGV4dHVyZVNhbXBsZXIsIHJoczogR2x0ZjJUZXh0dXJlU2FtcGxlcikge1xuICByZXR1cm4gKFxuICAgIGxocy5tYWdGaWx0ZXIgPT09IHJocy5tYWdGaWx0ZXIgJiZcbiAgICBsaHMubWluRmlsdGVyID09PSByaHMubWluRmlsdGVyICYmXG4gICAgbGhzLndyYXBTID09PSByaHMud3JhcFMgJiZcbiAgICBsaHMud3JhcFQgPT09IHJocy53cmFwVFxuICApO1xufVxuIiwiaW1wb3J0IHsgSVNrZWxldGFsRW50aXR5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBCeXRlLCBJbmRleCB9IGZyb20gJy4vQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHtcbiAgR2x0ZjJCdWZmZXJWaWV3LFxuICBHbHRmMkFjY2Vzc29yLFxuICBHbHRmMixcbiAgR2x0ZjJCdWZmZXIsXG4gIEdsdGYyTWVzaCxcbiAgR2x0ZjJNYXRlcmlhbCxcbiAgR2x0ZjJBbmltYXRpb24sXG4gIEdsdGYyU2tpbixcbiAgR2x0ZjJQYnJNZXRhbGxpY1JvdWdobmVzcyxcbiAgR2x0ZjJUZXh0dXJlSW5mbyxcbiAgR2x0ZjJJbWFnZSxcbiAgR2x0ZjJUZXh0dXJlLFxuICBHbHRmMlRleHR1cmVTYW1wbGVyLFxuICBHbHRmMkNhbWVyYSxcbn0gZnJvbSAnLi9nbFRGMic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2x0ZjJCdWZmZXJWaWV3RXggZXh0ZW5kcyBHbHRmMkJ1ZmZlclZpZXcge1xuICBidWZmZXI6IG51bWJlcjtcbiAgYnl0ZU9mZnNldDogbnVtYmVyO1xuICBleHRyYXM6IHtcbiAgICB1aW50OEFycmF5PzogVWludDhBcnJheTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbHRmMkFjY2Vzc29yRXggZXh0ZW5kcyBHbHRmMkFjY2Vzc29yIHtcbiAgZXh0cmFzOiB7XG4gICAgdWludDhBcnJheT86IFVpbnQ4QXJyYXk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2x0ZjJNYXRlcmlhbEV4IGV4dGVuZHMgR2x0ZjJNYXRlcmlhbCB7XG4gIHBick1ldGFsbGljUm91Z2huZXNzOiBHbHRmMlBick1ldGFsbGljUm91Z2huZXNzRXg7XG59XG5leHBvcnQgaW50ZXJmYWNlIEdsdGYySW1hZ2VFeCBleHRlbmRzIEdsdGYySW1hZ2Uge1xuICByblRleHR1cmVVSUQ/OiBJbmRleDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbHRmMlBick1ldGFsbGljUm91Z2huZXNzRXggZXh0ZW5kcyBHbHRmMlBick1ldGFsbGljUm91Z2huZXNzIHtcbiAgZGlmZnVzZUNvbG9yVGV4dHVyZT86IEdsdGYyVGV4dHVyZUluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2x0ZjJFeCBleHRlbmRzIEdsdGYyIHtcbiAgYXNzZXQ6IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgZ2VuZXJhdG9yOiBzdHJpbmc7XG4gIH07XG4gIGJ1ZmZlcnM6IEdsdGYyQnVmZmVyW107XG4gIGJ1ZmZlclZpZXdzOiBHbHRmMkJ1ZmZlclZpZXdFeFtdO1xuICBhY2Nlc3NvcnM6IEdsdGYyQWNjZXNzb3JFeFtdO1xuICBtZXNoZXM6IEdsdGYyTWVzaFtdO1xuICBtYXRlcmlhbHM6IEdsdGYyTWF0ZXJpYWxbXTtcbiAgYW5pbWF0aW9uczogR2x0ZjJBbmltYXRpb25bXTtcbiAgdGV4dHVyZXM6IEdsdGYyVGV4dHVyZVtdO1xuICBpbWFnZXM6IEdsdGYySW1hZ2VFeFtdO1xuICBza2luczogR2x0ZjJTa2luW107XG4gIGNhbWVyYXM6IEdsdGYyQ2FtZXJhW107XG4gIHNhbXBsZXJzOiBHbHRmMlRleHR1cmVTYW1wbGVyW107XG4gIGV4dGVuc2lvbnNVc2VkOiBzdHJpbmdbXTtcbiAgZXh0cmFzOiB7XG4gICAgcm5Ta2luczogSVNrZWxldGFsRW50aXR5W107XG4gICAgYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZEFycmF5OiBCeXRlW107XG4gICAgLy8gYnVmZmVyVmlld0J5dGVMZW5ndGhBY2N1bXVsYXRlZEFycmF5WzBdIGZvciBidWZmZXIgMFxuICAgIC8vIGJ1ZmZlclZpZXdCeXRlTGVuZ3RoQWNjdW11bGF0ZWRBcnJheVsxXSBmb3IgYnVmZmVyIDFcbiAgICAvLyAuLi5cbiAgfTtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQW5pbWF0aW9uVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNpc1RleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db21tb25UeXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL0tUWDJUZXh0dXJlJztcbmV4cG9ydCAqIGZyb20gJy4vVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL1R5cGVHZW5lcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vVlJNMHgnO1xuZXhwb3J0ICogZnJvbSAnLi9XZWJHTENvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2dsVEYxJztcbmV4cG9ydCAqIGZyb20gJy4vZ2xURjInO1xuZXhwb3J0ICogZnJvbSAnLi9nbFRGMkZvck91dHB1dCc7XG5leHBvcnQgKiBmcm9tICcuL1JuTTInO1xuZXhwb3J0ICogZnJvbSAnLi9Sbk0yVnJtYSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYWRlck5vZGVKc29uJztcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IHJlcXVpcmUoJy4vLi4vVkVSU0lPTi1GSUxFJykuZGVmYXVsdDtcbiIsImltcG9ydCB7IFdlYkdMRXh0ZW5zaW9uRW51bSwgV2ViR0xFeHRlbnNpb24gfSBmcm9tICcuL1dlYkdMRXh0ZW5zaW9uJztcbmltcG9ydCB7IFJlbmRlckJ1ZmZlclRhcmdldEVudW0gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1JlbmRlckJ1ZmZlclRhcmdldCc7XG5pbXBvcnQgeyBJbmRleCwgU2l6ZSB9IGZyb20gJy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuXG5jb25zdCBJTlZBTElEX1NJWkUgPSAtMTtcblxuaW50ZXJmYWNlIFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMge1xuICByZWFkb25seSBDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOiBudW1iZXI7XG59XG5pbnRlcmZhY2UgV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2JwdGMge1xuICByZWFkb25seSBDT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9FWFQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFdFQkdMX211bHRpdmlldyB7XG4gIGZyYW1lYnVmZmVyVGV4dHVyZU11bHRpdmlld09WUihcbiAgICB0YXJnZXQ6IG51bWJlcixcbiAgICBhdHRhY2htZW50OiBudW1iZXIsXG4gICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgIGxldmVsOiBudW1iZXIsXG4gICAgYmFzZVZpZXdJbmRleDogbnVtYmVyLFxuICAgIG51bVZpZXdzOiBudW1iZXJcbiAgKTogdm9pZDtcbiAgZnJhbWVidWZmZXJUZXh0dXJlTXVsdGlzYW1wbGVNdWx0aXZpZXdPVlIoXG4gICAgdGFyZ2V0OiBudW1iZXIsXG4gICAgYXR0YWNobWVudDogbnVtYmVyLFxuICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIHNhbXBsZXM6IG51bWJlcixcbiAgICBiYXNlVmlld0luZGV4OiBudW1iZXIsXG4gICAgbnVtVmlld3M6IG51bWJlclxuICApOiB2b2lkO1xuICBpc19tdWx0aXNhbXBsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFdlYkdMQ29udGV4dFdyYXBwZXIge1xuICBfX2dsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICBfX3dlYmdsVmVyc2lvbiA9IDE7XG4gIHB1YmxpYyB3aWR0aDogU2l6ZSA9IDA7XG4gIHB1YmxpYyBoZWlnaHQ6IFNpemUgPSAwO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dFZBTz86IE9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0O1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wxRXh0SUE/OiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wxRXh0VEY/OiBPRVNfdGV4dHVyZV9mbG9hdDtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dFRIRj86IE9FU190ZXh0dXJlX2hhbGZfZmxvYXQ7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHRURkw/OiBPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXI7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHRUSEZMPzogT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXI7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHRURkE/OiBFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWM7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHRFSVVJPzogT0VTX2VsZW1lbnRfaW5kZXhfdWludDtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dFNUTD86IEVYVF9zaGFkZXJfdGV4dHVyZV9sb2Q7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHREUlY/OiBPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXM7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHREQj86IFdFQkdMX2RyYXdfYnVmZmVycztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dEJNPzogRVhUX2JsZW5kX21pbm1heDtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dENCRj86IFdFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdDtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dENUQXN0Yz86IFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wxRXh0Q1RTM3RjPzogV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGM7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDFFeHRDVFB2cnRjPzogV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dENUQXRjPzogV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2F0YztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dENURXRjPzogV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMUV4dENURXRjMT86IFdFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wxRXh0Q1RCcHRjPzogV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2JwdGM7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dFRGTD86IE9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcjtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dFRIRkw/OiBPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcjtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dFRGQT86IEVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dENCRj86IEVYVF9jb2xvcl9idWZmZXJfZmxvYXQ7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDJFeHRDQkhGPzogRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0O1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wyRXh0Q1RBc3RjPzogV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGM7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDJFeHRDVFMzdGM/OiBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dENUUHZydGM/OiBXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wyRXh0Q1RBdGM/OiBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXRjO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wyRXh0Q1RFdGM/OiBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViZ2wyRXh0Q1RFdGMxPzogV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzE7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDJFeHRDVEJwdGM/OiBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYnB0YztcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dE1MVFZJRVc/OiBXRUJHTF9tdWx0aXZpZXc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJnbDJFeHRDbGlwQ3RybD86IGFueTtcbiAgcHVibGljIHJlYWRvbmx5IHdlYmdsMkV4dEdtYW5XTT86IGFueTtcblxuICBwcml2YXRlIF9fYWN0aXZlVGV4dHVyZUJhY2t1cDogSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBfX2FjdGl2ZVRleHR1cmVzMkQ6IFdlYkdMVGV4dHVyZVtdID0gW107XG4gIHByaXZhdGUgX19hY3RpdmVUZXh0dXJlczJEQXJyYXk6IFdlYkdMVGV4dHVyZVtdID0gW107XG4gIHByaXZhdGUgX19hY3RpdmVUZXh0dXJlc0N1YmU6IFdlYkdMVGV4dHVyZVtdID0gW107XG4gIHByaXZhdGUgX19ib3VuZFRleHR1cmVzOiBNYXA8SW5kZXgsIFdlYkdMVGV4dHVyZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19ib3VuZFNhbXBsZXJzOiBNYXA8SW5kZXgsIFdlYkdMU2FtcGxlcj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX192aWV3cG9ydF9sZWZ0ID0gMDtcbiAgcHJpdmF0ZSBfX3ZpZXdwb3J0X3RvcCA9IDA7XG4gIHByaXZhdGUgX192aWV3cG9ydF93aWR0aCA9IDA7XG4gIHByaXZhdGUgX192aWV3cG9ydF9oZWlnaHQgPSAwO1xuICBwcml2YXRlIF9fZGVmYXVsdF92aWV3cG9ydF9sZWZ0ID0gMDtcbiAgcHJpdmF0ZSBfX2RlZmF1bHRfdmlld3BvcnRfdG9wID0gMDtcbiAgcHJpdmF0ZSBfX2RlZmF1bHRfdmlld3BvcnRfd2lkdGggPSAwO1xuICBwcml2YXRlIF9fZGVmYXVsdF92aWV3cG9ydF9oZWlnaHQgPSAwO1xuICAjYWxpZ25lZE1heFVuaWZvcm1CbG9ja1NpemUgPSBJTlZBTElEX1NJWkU7XG4gICNtYXhVbmlmb3JtQmxvY2tTaXplID0gSU5WQUxJRF9TSVpFO1xuICAjdW5pZm9ybUJ1ZmZlck9mZnNldEFsaWdubWVudCA9IElOVkFMSURfU0laRTtcbiAgI21heFZlcnRleFVuaWZvcm1CbG9ja3MgPSBJTlZBTElEX1NJWkU7XG4gICNtYXhGcmFnbWVudFVuaWZvcm1CbG9ja3MgPSBJTlZBTElEX1NJWkU7XG4gICNtYXhDb252ZW50aW9uVW5pZm9ybUJsb2NrcyA9IElOVkFMSURfU0laRTtcbiAgcHJpdmF0ZSBfX21heFZlcnRleFVuaWZvcm1WZWN0b3JzID0gSU5WQUxJRF9TSVpFO1xuICBwcml2YXRlIF9fbWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA9IElOVkFMSURfU0laRTtcbiAgcHJpdmF0ZSByZWFkb25seSBfX2lzX211bHRpdmlldzogYm9vbGVhbjtcbiAgX2lzV2ViWFJNb2RlID0gZmFsc2U7XG5cbiAgX19leHRlbnNpb25zOiBNYXA8V2ViR0xFeHRlbnNpb25FbnVtLCBXZWJHTE9iamVjdD4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICB0aGlzLl9fZ2wgPSBnbDtcbiAgICB0aGlzLndpZHRoID0gY2FudmFzLndpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcbiAgICB0aGlzLl9fdmlld3BvcnRfd2lkdGggPSB0aGlzLl9fZGVmYXVsdF92aWV3cG9ydF93aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgdGhpcy5fX3ZpZXdwb3J0X2hlaWdodCA9IHRoaXMuX19kZWZhdWx0X3ZpZXdwb3J0X2hlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG4gICAgdGhpcy5fX2lzX211bHRpdmlldyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5fX2dsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdXZWJHTDJSZW5kZXJpbmdDb250ZXh0Jykge1xuICAgICAgdGhpcy5fX3dlYmdsVmVyc2lvbiA9IDI7XG4gICAgICB0aGlzLndlYmdsMkV4dFRGTCA9IHRoaXMuX19nZXRFeHRlbnNpb24oV2ViR0xFeHRlbnNpb24uVGV4dHVyZUZsb2F0TGluZWFyKTtcbiAgICAgIHRoaXMud2ViZ2wyRXh0VEhGTCA9IHRoaXMuX19nZXRFeHRlbnNpb24oV2ViR0xFeHRlbnNpb24uVGV4dHVyZUhhbGZGbG9hdExpbmVhcik7XG4gICAgICB0aGlzLndlYmdsMkV4dFRGQSA9IHRoaXMuX19nZXRFeHRlbnNpb24oV2ViR0xFeHRlbnNpb24uVGV4dHVyZUZpbHRlckFuaXNvdHJvcGljKTtcbiAgICAgIHRoaXMud2ViZ2wyRXh0Q0JGID0gdGhpcy5fX2dldEV4dGVuc2lvbihXZWJHTEV4dGVuc2lvbi5Db2xvckJ1ZmZlckZsb2F0V2ViR0wyKTtcbiAgICAgIHRoaXMud2ViZ2wyRXh0Q0JIRiA9IHRoaXMuX19nZXRFeHRlbnNpb24oV2ViR0xFeHRlbnNpb24uQ29sb3JCdWZmZXJIYWxmRmxvYXRXZWJHTDIpO1xuICAgICAgdGhpcy53ZWJnbDJFeHRDVEFzdGMgPSB0aGlzLl9fZ2V0Q29tcHJlc3NlZFRleHR1cmVFeHRlbnNpb24oXG4gICAgICAgIFdlYkdMRXh0ZW5zaW9uLkNvbXByZXNzZWRUZXh0dXJlQXN0Y1xuICAgICAgKTtcbiAgICAgIHRoaXMud2ViZ2wyRXh0Q1RTM3RjID0gdGhpcy5fX2dldENvbXByZXNzZWRUZXh0dXJlRXh0ZW5zaW9uKFxuICAgICAgICBXZWJHTEV4dGVuc2lvbi5Db21wcmVzc2VkVGV4dHVyZVMzdGNcbiAgICAgICk7XG4gICAgICB0aGlzLndlYmdsMkV4dENUUHZydGMgPSB0aGlzLl9fZ2V0Q29tcHJlc3NlZFRleHR1cmVFeHRlbnNpb24oXG4gICAgICAgIFdlYkdMRXh0ZW5zaW9uLkNvbXByZXNzZWRUZXh0dXJlUHZydGNcbiAgICAgICk7XG4gICAgICB0aGlzLndlYmdsMkV4dENUQXRjID0gdGhpcy5fX2dldENvbXByZXNzZWRUZXh0dXJlRXh0ZW5zaW9uKFxuICAgICAgICBXZWJHTEV4dGVuc2lvbi5Db21wcmVzc2VkVGV4dHVyZUF0Y1xuICAgICAgKTtcbiAgICAgIHRoaXMud2ViZ2wyRXh0Q1RFdGMgPSB0aGlzLl9fZ2V0Q29tcHJlc3NlZFRleHR1cmVFeHRlbnNpb24oXG4gICAgICAgIFdlYkdMRXh0ZW5zaW9uLkNvbXByZXNzZWRUZXh0dXJlRXRjXG4gICAgICApO1xuICAgICAgdGhpcy53ZWJnbDJFeHRDVEV0YzEgPSB0aGlzLl9fZ2V0Q29tcHJlc3NlZFRleHR1cmVFeHRlbnNpb24oXG4gICAgICAgIFdlYkdMRXh0ZW5zaW9uLkNvbXByZXNzZWRUZXh0dXJlRXRjMVxuICAgICAgKTtcbiAgICAgIHRoaXMud2ViZ2wyRXh0Q1RCcHRjID0gdGhpcy5fX2dldENvbXByZXNzZWRUZXh0dXJlRXh0ZW5zaW9uKFxuICAgICAgICBXZWJHTEV4dGVuc2lvbi5Db21wcmVzc2VkVGV4dHVyZUJwdGNcbiAgICAgICk7XG4gICAgICB0aGlzLndlYmdsMkV4dE1MVFZJRVcgPSB0aGlzLl9fZ2V0RXh0ZW5zaW9uKFdlYkdMRXh0ZW5zaW9uLk9jdWx1c011bHRpdmlldyk7XG4gICAgICBpZiAodGhpcy53ZWJnbDJFeHRNTFRWSUVXKSB7XG4gICAgICAgIHRoaXMud2ViZ2wyRXh0TUxUVklFVy5pc19tdWx0aXNhbXBsZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndlYmdsMkV4dE1MVFZJRVcgPSB0aGlzLl9fZ2V0RXh0ZW5zaW9uKFdlYkdMRXh0ZW5zaW9uLk92ck11bHRpdmlldzIpO1xuICAgICAgICBpZiAodGhpcy53ZWJnbDJFeHRNTFRWSUVXKSB7XG4gICAgICAgICAgdGhpcy53ZWJnbDJFeHRNTFRWSUVXLmlzX211bHRpc2FtcGxlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKENvbmZpZy5jZ0FwaURlYnVnQ29uc29sZU91dHB1dCkge1xuICAgICAgICAgICAgTG9nZ2VyLmluZm8oJ09DVUxVU19tdWx0aXZpZXcgYW5kIE9WUl9tdWx0aXZpZXcyIGV4dGVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fX2lzX211bHRpdmlldyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLndlYmdsMkV4dENsaXBDdHJsID0gdGhpcy5fX2dldEV4dGVuc2lvbihXZWJHTEV4dGVuc2lvbi5DbGlwQ29udHJvbCk7XG4gICAgICB0aGlzLndlYmdsMkV4dEdtYW5XTSA9IHRoaXMuX19nZXRFeHRlbnNpb24oV2ViR0xFeHRlbnNpb24uR01BTl9XRUJHTF9NRU1PUlkpO1xuICAgIH1cbiAgICB0aGlzLl9fZ2V0VW5pZm9ybUJ1ZmZlckluZm8oKTtcbiAgICB0aGlzLl9fZ2V0TWF4VW5pZm9ybVZlY3RvcnMoKTtcbiAgfVxuXG4gIGdldFJhd0NvbnRleHQoKTogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX19nbDtcbiAgfVxuXG4gIGdldFJhd0NvbnRleHRBc1dlYkdMMSgpOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9fZ2wgYXMgV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICB9XG5cbiAgZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9fZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgfVxuXG4gIGdldCB2aWV3cG9ydCgpIHtcbiAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFtcbiAgICAgIHRoaXMuX192aWV3cG9ydF9sZWZ0LFxuICAgICAgdGhpcy5fX3ZpZXdwb3J0X3RvcCxcbiAgICAgIHRoaXMuX192aWV3cG9ydF93aWR0aCxcbiAgICAgIHRoaXMuX192aWV3cG9ydF9oZWlnaHQsXG4gICAgXSk7XG4gIH1cblxuICBnZXQgZGVmYXVsdFZpZXdwb3J0KCkge1xuICAgIHJldHVybiBWZWN0b3I0LmZyb21Db3B5QXJyYXkoW1xuICAgICAgdGhpcy5fX2RlZmF1bHRfdmlld3BvcnRfbGVmdCxcbiAgICAgIHRoaXMuX19kZWZhdWx0X3ZpZXdwb3J0X3RvcCxcbiAgICAgIHRoaXMuX19kZWZhdWx0X3ZpZXdwb3J0X3dpZHRoLFxuICAgICAgdGhpcy5fX2RlZmF1bHRfdmlld3BvcnRfaGVpZ2h0LFxuICAgIF0pO1xuICB9XG5cbiAgaXNTdXBwb3J0V2ViR0wxRXh0ZW5zaW9uKHdlYkdMRXh0ZW5zaW9uOiBXZWJHTEV4dGVuc2lvbkVudW0pIHtcbiAgICBpZiAodGhpcy5fX2dldEV4dGVuc2lvbih3ZWJHTEV4dGVuc2lvbikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNOb3RTdXBwb3J0V2ViR0wxRXh0ZW5zaW9uKHdlYkdMRXh0ZW5zaW9uOiBXZWJHTEV4dGVuc2lvbkVudW0pIHtcbiAgICByZXR1cm4gIXRoaXMuaXNTdXBwb3J0V2ViR0wxRXh0ZW5zaW9uKHdlYkdMRXh0ZW5zaW9uKTtcbiAgfVxuXG4gIGdldElzV2ViR0wyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KTogZ2wgaXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuaXNXZWJHTDI7XG4gIH1cblxuICBnZXQgaXNXZWJHTDIoKSB7XG4gICAgaWYgKHRoaXMuX193ZWJnbFZlcnNpb24gPT09IDIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVmVydGV4QXJyYXkoKSB7XG4gICAgaWYgKHRoaXMuZ2V0SXNXZWJHTDIodGhpcy5fX2dsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19nbC5jcmVhdGVWZXJ0ZXhBcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy53ZWJnbDFFeHRWQU8gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWJnbDFFeHRWQU8uY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVmVydGV4QXJyYXkodmVydGV4QXJyYXk6IFdlYkdMVmVydGV4QXJyYXlPYmplY3QgfCBXZWJHTFZlcnRleEFycmF5T2JqZWN0T0VTKSB7XG4gICAgaWYgKHRoaXMuZ2V0SXNXZWJHTDIodGhpcy5fX2dsKSkge1xuICAgICAgdGhpcy5fX2dsLmRlbGV0ZVZlcnRleEFycmF5KHZlcnRleEFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMud2ViZ2wxRXh0VkFPICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy53ZWJnbDFFeHRWQU8uZGVsZXRlVmVydGV4QXJyYXlPRVModmVydGV4QXJyYXkgYXMgV2ViR0xWZXJ0ZXhBcnJheU9iamVjdE9FUyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmluZFZlcnRleEFycmF5KHZhbzogV2ViR0xWZXJ0ZXhBcnJheU9iamVjdE9FUyB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5nZXRJc1dlYkdMMih0aGlzLl9fZ2wpKSB7XG4gICAgICB0aGlzLl9fZ2wuYmluZFZlcnRleEFycmF5KHZhbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLndlYmdsMUV4dFZBTyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMud2ViZ2wxRXh0VkFPLmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcnRleEF0dHJpYkRpdmlzb3IoaW5kZXg6IG51bWJlciwgZGl2aXNvcjogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZ2V0SXNXZWJHTDIodGhpcy5fX2dsKSkge1xuICAgICAgdGhpcy5fX2dsLnZlcnRleEF0dHJpYkRpdmlzb3IoaW5kZXgsIGRpdmlzb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndlYmdsMUV4dElBIS52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoaW5kZXgsIGRpdmlzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGRyYXdFbGVtZW50c0luc3RhbmNlZChcbiAgICBwcmltaXRpdmVNb2RlOiBudW1iZXIsXG4gICAgaW5kZXhDb3VudDogbnVtYmVyLFxuICAgIHR5cGU6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBpbnN0YW5jZUNvdW50OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5fX2dsLmRyYXdFbGVtZW50c0luc3RhbmNlZChwcmltaXRpdmVNb2RlLCBpbmRleENvdW50LCB0eXBlLCBvZmZzZXQsIGluc3RhbmNlQ291bnQpO1xuICB9XG5cbiAgZHJhd0FycmF5c0luc3RhbmNlZChwcmltaXRpdmVNb2RlOiBudW1iZXIsIGZpcnN0OiBudW1iZXIsIGNvdW50OiBudW1iZXIsIGluc3RhbmNlQ291bnQ6IG51bWJlcikge1xuICAgIHRoaXMuX19nbC5kcmF3QXJyYXlzSW5zdGFuY2VkKHByaW1pdGl2ZU1vZGUsIGZpcnN0LCBjb3VudCwgaW5zdGFuY2VDb3VudCk7XG4gIH1cblxuICBjb2xvckF0dGFjaG1lbnQoaW5kZXg6IEluZGV4KSB7XG4gICAgcmV0dXJuIDB4OGNlMCArIGluZGV4OyAvLyBHTF9DT0xPUl9BVFRBQ0hNRU5UMCA9IDB4OGNlMFxuICB9XG5cbiAgZHJhd0J1ZmZlcnMoYnVmZmVyczogUmVuZGVyQnVmZmVyVGFyZ2V0RW51bVtdKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICBpZiAoYnVmZmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdsLmRyYXdCdWZmZXJzKFtnbC5OT05FXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbMF0ud2ViR0xDb25zdGFudFZhbHVlKCk7XG4gICAgZ2wuZHJhd0J1ZmZlcnMoXG4gICAgICBidWZmZXJzLm1hcCgoYnVmKSA9PiB7XG4gICAgICAgIHJldHVybiBidWYud2ViR0xDb25zdGFudFZhbHVlKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoYnVmZmVyID09PSBnbC5OT05FIHx8IGJ1ZmZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBnbC5jb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2FjdGl2ZVRleHR1cmUoYWN0aXZlVGV4dHVyZUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fX2FjdGl2ZVRleHR1cmVCYWNrdXAgPT09IGFjdGl2ZVRleHR1cmVJbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9fZ2wuYWN0aXZlVGV4dHVyZSh0aGlzLl9fZ2wuVEVYVFVSRTAgKyBhY3RpdmVUZXh0dXJlSW5kZXgpO1xuICAgIHRoaXMuX19hY3RpdmVUZXh0dXJlQmFja3VwID0gYWN0aXZlVGV4dHVyZUluZGV4O1xuICB9XG5cbiAgYmluZFRleHR1cmUyRChhY3RpdmVUZXh0dXJlSW5kZXg6IEluZGV4LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUpIHtcbiAgICBjb25zdCB0ZXggPSB0aGlzLl9fYm91bmRUZXh0dXJlcy5nZXQoYWN0aXZlVGV4dHVyZUluZGV4KTtcbiAgICBpZiAodGV4ICE9PSB0ZXh0dXJlKSB7XG4gICAgICB0aGlzLl9fYWN0aXZlVGV4dHVyZShhY3RpdmVUZXh0dXJlSW5kZXgpO1xuICAgICAgdGhpcy5fX2dsLmJpbmRUZXh0dXJlKHRoaXMuX19nbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcbiAgICAgIHRoaXMuX19ib3VuZFRleHR1cmVzLnNldChhY3RpdmVUZXh0dXJlSW5kZXgsIHRleHR1cmUpO1xuICAgIH1cblxuICAgIHRoaXMuX19hY3RpdmVUZXh0dXJlczJEW2FjdGl2ZVRleHR1cmVJbmRleF0gPSB0ZXh0dXJlO1xuICB9XG5cbiAgYmluZFRleHR1cmUyREFycmF5KGFjdGl2ZVRleHR1cmVJbmRleDogSW5kZXgsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSkge1xuICAgIGNvbnN0IHRleCA9IHRoaXMuX19ib3VuZFRleHR1cmVzLmdldChhY3RpdmVUZXh0dXJlSW5kZXgpO1xuICAgIGlmICh0ZXggIT09IHRleHR1cmUpIHtcbiAgICAgIHRoaXMuX19hY3RpdmVUZXh0dXJlKGFjdGl2ZVRleHR1cmVJbmRleCk7XG4gICAgICB0aGlzLl9fZ2wuYmluZFRleHR1cmUodGhpcy5fX2dsLlRFWFRVUkVfMkRfQVJSQVksIHRleHR1cmUpO1xuICAgICAgdGhpcy5fX2JvdW5kVGV4dHVyZXMuc2V0KGFjdGl2ZVRleHR1cmVJbmRleCwgdGV4dHVyZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2FjdGl2ZVRleHR1cmVzMkRBcnJheVthY3RpdmVUZXh0dXJlSW5kZXhdID0gdGV4dHVyZTtcbiAgfVxuXG4gIGJpbmRUZXh0dXJlU2FtcGxlcihhY3RpdmVUZXh0dXJlSW5kZXg6IEluZGV4LCBzYW1wbGVyOiBXZWJHTFNhbXBsZXIpIHtcbiAgICAvLyBjb25zdCBzYW1wID0gdGhpcy5fX2JvdW5kU2FtcGxlcnMuZ2V0KGFjdGl2ZVRleHR1cmVJbmRleCk7XG4gICAgLy8gaWYgKHNhbXAgIT09IHNhbXBsZXIpIHtcbiAgICB0aGlzLl9fZ2wuYmluZFNhbXBsZXIoYWN0aXZlVGV4dHVyZUluZGV4LCBzYW1wbGVyKTtcbiAgICB0aGlzLl9fYm91bmRTYW1wbGVycy5zZXQoYWN0aXZlVGV4dHVyZUluZGV4LCBzYW1wbGVyKTtcbiAgICAvLyB9XG4gIH1cblxuICBiaW5kVGV4dHVyZUN1YmUoYWN0aXZlVGV4dHVyZUluZGV4OiBJbmRleCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlKSB7XG4gICAgY29uc3QgdGV4ID0gdGhpcy5fX2JvdW5kVGV4dHVyZXMuZ2V0KGFjdGl2ZVRleHR1cmVJbmRleCk7XG4gICAgaWYgKHRleCAhPT0gdGV4dHVyZSkge1xuICAgICAgdGhpcy5fX2FjdGl2ZVRleHR1cmUoYWN0aXZlVGV4dHVyZUluZGV4KTtcbiAgICAgIHRoaXMuX19nbC5iaW5kVGV4dHVyZSh0aGlzLl9fZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSk7XG4gICAgICB0aGlzLl9fYm91bmRUZXh0dXJlcy5zZXQoYWN0aXZlVGV4dHVyZUluZGV4LCB0ZXh0dXJlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fYWN0aXZlVGV4dHVyZXNDdWJlW2FjdGl2ZVRleHR1cmVJbmRleF0gPSB0ZXh0dXJlO1xuICB9XG5cbiAgdW5iaW5kVGV4dHVyZTJEKGFjdGl2ZVRleHR1cmVJbmRleDogSW5kZXgpIHtcbiAgICB0aGlzLl9fYWN0aXZlVGV4dHVyZShhY3RpdmVUZXh0dXJlSW5kZXgpO1xuICAgIHRoaXMuX19nbC5iaW5kVGV4dHVyZSh0aGlzLl9fZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gICAgdGhpcy5fX2JvdW5kVGV4dHVyZXMuZGVsZXRlKGFjdGl2ZVRleHR1cmVJbmRleCk7XG4gICAgZGVsZXRlIHRoaXMuX19hY3RpdmVUZXh0dXJlczJEW2FjdGl2ZVRleHR1cmVJbmRleF07XG4gIH1cblxuICB1bmJpbmRUZXh0dXJlQ3ViZShhY3RpdmVUZXh0dXJlSW5kZXg6IEluZGV4KSB7XG4gICAgdGhpcy5fX2FjdGl2ZVRleHR1cmUoYWN0aXZlVGV4dHVyZUluZGV4KTtcbiAgICB0aGlzLl9fZ2wuYmluZFRleHR1cmUodGhpcy5fX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIG51bGwpO1xuICAgIHRoaXMuX19ib3VuZFRleHR1cmVzLmRlbGV0ZShhY3RpdmVUZXh0dXJlSW5kZXgpO1xuICAgIGRlbGV0ZSB0aGlzLl9fYWN0aXZlVGV4dHVyZXNDdWJlW2FjdGl2ZVRleHR1cmVJbmRleF07XG4gIH1cblxuICB1bmJpbmRUZXh0dXJlcygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19hY3RpdmVUZXh0dXJlczJELmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fX2FjdGl2ZVRleHR1cmVzMkRbaV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19hY3RpdmVUZXh0dXJlKDE1KTtcbiAgICAgIHRoaXMuX19nbC5iaW5kVGV4dHVyZSh0aGlzLl9fZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gICAgICBkZWxldGUgdGhpcy5fX2FjdGl2ZVRleHR1cmVzMkRbaV07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fYWN0aXZlVGV4dHVyZXMyREFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fX2FjdGl2ZVRleHR1cmVzMkRBcnJheVtpXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fX2FjdGl2ZVRleHR1cmUoMTUpO1xuICAgICAgdGhpcy5fX2dsLmJpbmRUZXh0dXJlKHRoaXMuX19nbC5URVhUVVJFXzJEX0FSUkFZLCBudWxsKTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9fYWN0aXZlVGV4dHVyZXMyREFycmF5W2ldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX2FjdGl2ZVRleHR1cmVzQ3ViZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX19hY3RpdmVUZXh0dXJlc0N1YmVbaV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19hY3RpdmVUZXh0dXJlKDE1KTtcbiAgICAgIHRoaXMuX19nbC5iaW5kVGV4dHVyZSh0aGlzLl9fZ2wuVEVYVFVSRV9DVUJFX01BUCwgbnVsbCk7XG4gICAgICBkZWxldGUgdGhpcy5fX2FjdGl2ZVRleHR1cmVzQ3ViZVtpXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbjogV2ViR0xFeHRlbnNpb25FbnVtKSB7XG4gICAgY29uc3QgZ2w6IGFueSA9IHRoaXMuX19nbDtcblxuICAgIGlmICghdGhpcy5fX2V4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgIGNvbnN0IGV4dE9iaiA9IGdsLmdldEV4dGVuc2lvbihleHRlbnNpb24udG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZXh0T2JqID09IG51bGwgJiYgQ29uZmlnLmNnQXBpRGVidWdDb25zb2xlT3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgJHtleHRlbnNpb24udG9TdHJpbmcoKX0gTm90IEF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YDtcbiAgICAgICAgTG9nZ2VyLmluZm8odGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fZXh0ZW5zaW9ucy5zZXQoZXh0ZW5zaW9uLCBleHRPYmopO1xuICAgICAgcmV0dXJuIGV4dE9iajtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19leHRlbnNpb25zLmdldChleHRlbnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2dldENvbXByZXNzZWRUZXh0dXJlRXh0ZW5zaW9uKGV4dGVuc2lvbjogV2ViR0xFeHRlbnNpb25FbnVtKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2wgYXMgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICAgIGlmICghdGhpcy5fX2V4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb24udG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGV4dE9iaiA9XG4gICAgICAgIGdsLmdldEV4dGVuc2lvbihleHRlbnNpb25OYW1lKSA/P1xuICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ01PWl8nICsgZXh0ZW5zaW9uTmFtZSkgPz9cbiAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJLSVRfJyArIGV4dGVuc2lvbk5hbWUpO1xuXG4gICAgICBpZiAoZXh0T2JqID09IG51bGwgJiYgQ29uZmlnLmNnQXBpRGVidWdDb25zb2xlT3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgJHtleHRlbnNpb24udG9TdHJpbmcoKX0gTm90IEF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YDtcbiAgICAgICAgTG9nZ2VyLmluZm8odGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fZXh0ZW5zaW9ucy5zZXQoZXh0ZW5zaW9uLCBleHRPYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4dE9iajtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19leHRlbnNpb25zLmdldChleHRlbnNpb24pO1xuICB9XG5cbiAgc2V0Vmlld3BvcnQobGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBnbDogYW55ID0gdGhpcy5fX2dsO1xuICAgIGlmIChcbiAgICAgIHRoaXMuX192aWV3cG9ydF93aWR0aCAhPT0gd2lkdGggfHxcbiAgICAgIHRoaXMuX192aWV3cG9ydF9oZWlnaHQgIT09IGhlaWdodCB8fFxuICAgICAgdGhpcy5fX3ZpZXdwb3J0X2xlZnQgIT09IGxlZnQgfHxcbiAgICAgIHRoaXMuX192aWV3cG9ydF90b3AgIT09IHRvcFxuICAgICkge1xuICAgICAgZ2wudmlld3BvcnQobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuX192aWV3cG9ydF9sZWZ0ID0gbGVmdDtcbiAgICAgIHRoaXMuX192aWV3cG9ydF90b3AgPSB0b3A7XG4gICAgICB0aGlzLl9fdmlld3BvcnRfd2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuX192aWV3cG9ydF9oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgc2V0Vmlld3BvcnRBc1ZlY3RvcjQodmlld3BvcnQ6IFZlY3RvcjQpOiB2b2lkIHtcbiAgICBjb25zdCBnbDogYW55ID0gdGhpcy5fX2dsO1xuICAgIGlmIChcbiAgICAgIHRoaXMuX192aWV3cG9ydF93aWR0aCAhPT0gdmlld3BvcnQueiB8fFxuICAgICAgdGhpcy5fX3ZpZXdwb3J0X2hlaWdodCAhPT0gdmlld3BvcnQudyB8fFxuICAgICAgdGhpcy5fX3ZpZXdwb3J0X2xlZnQgIT09IHZpZXdwb3J0LnggfHxcbiAgICAgIHRoaXMuX192aWV3cG9ydF90b3AgIT09IHZpZXdwb3J0LnlcbiAgICApIHtcbiAgICAgIGdsLnZpZXdwb3J0KHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncpO1xuICAgICAgdGhpcy5fX3ZpZXdwb3J0X2xlZnQgPSB2aWV3cG9ydC54O1xuICAgICAgdGhpcy5fX3ZpZXdwb3J0X3RvcCA9IHZpZXdwb3J0Lnk7XG4gICAgICB0aGlzLl9fdmlld3BvcnRfd2lkdGggPSB2aWV3cG9ydC56O1xuICAgICAgdGhpcy5fX3ZpZXdwb3J0X2hlaWdodCA9IHZpZXdwb3J0Lnc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2dldFVuaWZvcm1CdWZmZXJJbmZvKCkge1xuICAgIGlmICghdGhpcy5pc1dlYkdMMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdsOiBhbnkgPSB0aGlzLl9fZ2w7XG4gICAgY29uc3Qgb2Zmc2V0QWxpZ25tZW50ID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLlVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQpIGFzIG51bWJlcjtcbiAgICBjb25zdCBtYXhCbG9ja1NpemUgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1VOSUZPUk1fQkxPQ0tfU0laRSkgYXMgbnVtYmVyO1xuICAgIHRoaXMuI21heFZlcnRleFVuaWZvcm1CbG9ja3MgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1ZFUlRFWF9VTklGT1JNX0JMT0NLUykgYXMgbnVtYmVyO1xuICAgIHRoaXMuI21heEZyYWdtZW50VW5pZm9ybUJsb2NrcyA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfRlJBR01FTlRfVU5JRk9STV9CTE9DS1MpIGFzIG51bWJlcjtcbiAgICB0aGlzLiNtYXhDb252ZW50aW9uVW5pZm9ybUJsb2NrcyA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jbWF4VmVydGV4VW5pZm9ybUJsb2NrcyxcbiAgICAgIHRoaXMuI21heEZyYWdtZW50VW5pZm9ybUJsb2Nrc1xuICAgICk7XG4gICAgdGhpcy4jYWxpZ25lZE1heFVuaWZvcm1CbG9ja1NpemUgPSBtYXhCbG9ja1NpemUgLSAobWF4QmxvY2tTaXplICUgb2Zmc2V0QWxpZ25tZW50KTtcbiAgICB0aGlzLiN1bmlmb3JtQnVmZmVyT2Zmc2V0QWxpZ25tZW50ID0gb2Zmc2V0QWxpZ25tZW50O1xuICAgIHRoaXMuI21heFVuaWZvcm1CbG9ja1NpemUgPSBtYXhCbG9ja1NpemU7XG4gIH1cblxuICBwcml2YXRlIF9fZ2V0TWF4VW5pZm9ybVZlY3RvcnMoKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLmdldFJhd0NvbnRleHQoKTtcbiAgICB0aGlzLl9fbWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMpIGFzIG51bWJlcjtcbiAgICB0aGlzLl9fbWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMpIGFzIG51bWJlcjtcbiAgfVxuXG4gIGdldE1heENvbnZlbnRpb25Vbmlmb3JtQmxvY2tzKCkge1xuICAgIHJldHVybiB0aGlzLiNtYXhDb252ZW50aW9uVW5pZm9ybUJsb2NrcztcbiAgfVxuXG4gIGdldEFsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNhbGlnbmVkTWF4VW5pZm9ybUJsb2NrU2l6ZTtcbiAgfVxuXG4gIGdldE1heFZlcnRleFVuaWZvcm1WZWN0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWF4VmVydGV4VW5pZm9ybVZlY3RvcnM7XG4gIH1cblxuICBnZXRNYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycztcbiAgfVxuXG4gIGdldFdlYkdMTWVtb3J5SW5mbygpIHtcbiAgICBpZiAodGhpcy53ZWJnbDJFeHRHbWFuV00pIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMud2ViZ2wyRXh0R21hbldNLmdldE1lbW9yeUluZm8oKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzTXVsdGl2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLl9faXNfbXVsdGl2aWV3ICYmIENvbmZpZy5tdWx0aVZpZXdGb3JXZWJWUjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzTmFtZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcblxuZXhwb3J0IGludGVyZmFjZSBSbldlYkdMUHJvZ3JhbSBleHRlbmRzIFdlYkdMUHJvZ3JhbSB7XG4gIF9nbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgX21hdGVyaWFsVHlwZU5hbWU6IHN0cmluZztcbiAgX3ZlcnRleFNoYWRlclN0cjogc3RyaW5nO1xuICBfZnJhZ21lbnRTaGFkZXJTdHI6IHN0cmluZztcbiAgX3NoYWRlclNlbWFudGljc0luZm9NYXA6IE1hcDxTaGFkZXJTZW1hbnRpY3NOYW1lLCBTaGFkZXJTZW1hbnRpY3NJbmZvPjtcbiAgX19TUEVDVE9SX3JlYnVpbGRQcm9ncmFtOiB1bmtub3duO1xuICBfbWF0ZXJpYWw6IFdlYWtSZWY8TWF0ZXJpYWw+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJuV2ViR0xUZXh0dXJlIGV4dGVuZHMgV2ViR0xUZXh0dXJlIHtcbiAgX3Jlc291cmNlVWlkOiBudW1iZXI7XG59XG4iLCJpbXBvcnQgeyBFbnVtQ2xhc3MsIEVudW1JTywgX2Zyb20gfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvRW51bUlPJztcblxuZXhwb3J0IHR5cGUgV2ViR0xFeHRlbnNpb25FbnVtID0gRW51bUlPO1xuXG5jbGFzcyBXZWJHTEV4dGVuc2lvbkNsYXNzIGV4dGVuZHMgRW51bUNsYXNzIGltcGxlbWVudHMgV2ViR0xFeHRlbnNpb25FbnVtIHtcbiAgY29uc3RydWN0b3IoeyBpbmRleCwgc3RyIH06IHsgaW5kZXg6IG51bWJlcjsgc3RyOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKHsgaW5kZXgsIHN0ciB9KTtcbiAgfVxufVxuXG5jb25zdCBWZXJ0ZXhBcnJheU9iamVjdDogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogMSxcbiAgc3RyOiAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnLFxufSk7XG5jb25zdCBUZXh0dXJlRmxvYXQ6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDIsXG4gIHN0cjogJ09FU190ZXh0dXJlX2Zsb2F0Jyxcbn0pO1xuY29uc3QgVGV4dHVyZUhhbGZGbG9hdDogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogMyxcbiAgc3RyOiAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcsXG59KTtcbmNvbnN0IFRleHR1cmVGbG9hdExpbmVhcjogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogNCxcbiAgc3RyOiAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyxcbn0pO1xuY29uc3QgVGV4dHVyZUhhbGZGbG9hdExpbmVhcjogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogNSxcbiAgc3RyOiAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInLFxufSk7XG5jb25zdCBJbnN0YW5jZWRBcnJheXM6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDYsXG4gIHN0cjogJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnLFxufSk7XG5jb25zdCBUZXh0dXJlRmlsdGVyQW5pc290cm9waWM6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDcsXG4gIHN0cjogJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycsXG59KTtcbmNvbnN0IEVsZW1lbnRJbmRleFVpbnQ6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDgsXG4gIHN0cjogJ09FU19lbGVtZW50X2luZGV4X3VpbnQnLFxufSk7XG5jb25zdCBTaGFkZXJUZXh0dXJlTG9kOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiA5LFxuICBzdHI6ICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyxcbn0pO1xuY29uc3QgU2hhZGVyRGVyaXZhdGl2ZXM6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDEwLFxuICBzdHI6ICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnLFxufSk7XG5jb25zdCBEcmF3QnVmZmVyczogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogMTEsXG4gIHN0cjogJ1dFQkdMX2RyYXdfYnVmZmVycycsXG59KTtcbmNvbnN0IEJsZW5kTWlubWF4OiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAxMixcbiAgc3RyOiAnRVhUX2JsZW5kX21pbm1heCcsXG59KTtcbmNvbnN0IENvbG9yQnVmZmVyRmxvYXRXZWJHTDE6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDEzLFxuICBzdHI6ICdXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQnLFxufSk7XG5jb25zdCBDb21wcmVzc2VkVGV4dHVyZUFzdGM6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDE0LFxuICBzdHI6ICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YycsXG59KTtcbmNvbnN0IENvbXByZXNzZWRUZXh0dXJlUzN0YzogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogMTUsXG4gIHN0cjogJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyxcbn0pO1xuY29uc3QgQ29tcHJlc3NlZFRleHR1cmVQdnJ0YzogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogMTYsXG4gIHN0cjogJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycsXG59KTtcbmNvbnN0IENvbXByZXNzZWRUZXh0dXJlQXRjOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAxNyxcbiAgc3RyOiAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2F0YycsXG59KTtcbmNvbnN0IENvbXByZXNzZWRUZXh0dXJlRXRjOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAxOCxcbiAgc3RyOiAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YycsXG59KTtcbmNvbnN0IENvbXByZXNzZWRUZXh0dXJlRXRjMTogV2ViR0xFeHRlbnNpb25FbnVtID0gbmV3IFdlYkdMRXh0ZW5zaW9uQ2xhc3Moe1xuICBpbmRleDogMTksXG4gIHN0cjogJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyxcbn0pO1xuY29uc3QgQ29tcHJlc3NlZFRleHR1cmVCcHRjOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAyMCxcbiAgc3RyOiAnRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YycsXG59KTtcbmNvbnN0IEdNQU5fV0VCR0xfTUVNT1JZOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAyMSxcbiAgc3RyOiAnR01BTl93ZWJnbF9tZW1vcnknLFxufSk7XG5jb25zdCBDb2xvckJ1ZmZlckZsb2F0V2ViR0wyOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAyMixcbiAgc3RyOiAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcsXG59KTtcbmNvbnN0IENvbG9yQnVmZmVySGFsZkZsb2F0V2ViR0wyOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAyMyxcbiAgc3RyOiAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Jyxcbn0pO1xuY29uc3QgT2N1bHVzTXVsdGl2aWV3OiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAyNCxcbiAgc3RyOiAnT0NVTFVTX211bHRpdmlldycsXG59KTtcbmNvbnN0IE92ck11bHRpdmlldzI6IFdlYkdMRXh0ZW5zaW9uRW51bSA9IG5ldyBXZWJHTEV4dGVuc2lvbkNsYXNzKHtcbiAgaW5kZXg6IDI1LFxuICBzdHI6ICdPVlJfbXVsdGl2aWV3MicsXG59KTtcbmNvbnN0IENsaXBDb250cm9sOiBXZWJHTEV4dGVuc2lvbkVudW0gPSBuZXcgV2ViR0xFeHRlbnNpb25DbGFzcyh7XG4gIGluZGV4OiAyNixcbiAgc3RyOiAnRVhUX2NsaXBfY29udHJvbCcsXG59KTtcblxuY29uc3QgdHlwZUxpc3QgPSBbXG4gIFZlcnRleEFycmF5T2JqZWN0LFxuICBUZXh0dXJlRmxvYXQsXG4gIFRleHR1cmVIYWxmRmxvYXQsXG4gIFRleHR1cmVGbG9hdExpbmVhcixcbiAgVGV4dHVyZUhhbGZGbG9hdExpbmVhcixcbiAgSW5zdGFuY2VkQXJyYXlzLFxuICBUZXh0dXJlRmlsdGVyQW5pc290cm9waWMsXG4gIEVsZW1lbnRJbmRleFVpbnQsXG4gIFNoYWRlclRleHR1cmVMb2QsXG4gIFNoYWRlckRlcml2YXRpdmVzLFxuICBEcmF3QnVmZmVycyxcbiAgQmxlbmRNaW5tYXgsXG4gIENvbG9yQnVmZmVyRmxvYXRXZWJHTDEsXG4gIENvbXByZXNzZWRUZXh0dXJlQXN0YyxcbiAgQ29tcHJlc3NlZFRleHR1cmVTM3RjLFxuICBDb21wcmVzc2VkVGV4dHVyZVB2cnRjLFxuICBDb21wcmVzc2VkVGV4dHVyZUF0YyxcbiAgQ29tcHJlc3NlZFRleHR1cmVFdGMsXG4gIENvbXByZXNzZWRUZXh0dXJlRXRjMSxcbiAgQ29tcHJlc3NlZFRleHR1cmVCcHRjLFxuICBDb2xvckJ1ZmZlckZsb2F0V2ViR0wyLFxuICBDb2xvckJ1ZmZlckhhbGZGbG9hdFdlYkdMMixcbiAgT2N1bHVzTXVsdGl2aWV3LFxuICBPdnJNdWx0aXZpZXcyLFxuICBHTUFOX1dFQkdMX01FTU9SWSxcbiAgQ2xpcENvbnRyb2wsXG5dO1xuXG5mdW5jdGlvbiBmcm9tKHsgaW5kZXggfTogeyBpbmRleDogbnVtYmVyIH0pOiBXZWJHTEV4dGVuc2lvbkVudW0ge1xuICByZXR1cm4gX2Zyb20oeyB0eXBlTGlzdCwgaW5kZXggfSkgYXMgV2ViR0xFeHRlbnNpb25FbnVtO1xufVxuXG5leHBvcnQgY29uc3QgV2ViR0xFeHRlbnNpb24gPSBPYmplY3QuZnJlZXplKHtcbiAgVmVydGV4QXJyYXlPYmplY3QsXG4gIFRleHR1cmVGbG9hdCxcbiAgVGV4dHVyZUhhbGZGbG9hdCxcbiAgVGV4dHVyZUZsb2F0TGluZWFyLFxuICBUZXh0dXJlSGFsZkZsb2F0TGluZWFyLFxuICBJbnN0YW5jZWRBcnJheXMsXG4gIFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYyxcbiAgRWxlbWVudEluZGV4VWludCxcbiAgU2hhZGVyVGV4dHVyZUxvZCxcbiAgU2hhZGVyRGVyaXZhdGl2ZXMsXG4gIERyYXdCdWZmZXJzLFxuICBCbGVuZE1pbm1heCxcbiAgQ29sb3JCdWZmZXJGbG9hdFdlYkdMMSxcbiAgQ29tcHJlc3NlZFRleHR1cmVBc3RjLFxuICBDb21wcmVzc2VkVGV4dHVyZVMzdGMsXG4gIENvbXByZXNzZWRUZXh0dXJlUHZydGMsXG4gIENvbXByZXNzZWRUZXh0dXJlQXRjLFxuICBDb21wcmVzc2VkVGV4dHVyZUV0YyxcbiAgQ29tcHJlc3NlZFRleHR1cmVFdGMxLFxuICBDb21wcmVzc2VkVGV4dHVyZUJwdGMsXG4gIENvbG9yQnVmZmVyRmxvYXRXZWJHTDIsXG4gIENvbG9yQnVmZmVySGFsZkZsb2F0V2ViR0wyLFxuICBPY3VsdXNNdWx0aXZpZXcsXG4gIE92ck11bHRpdmlldzIsXG4gIEdNQU5fV0VCR0xfTUVNT1JZLFxuICBDbGlwQ29udHJvbCxcbn0pO1xuIiwiaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21lbW9yeS9BY2Nlc3Nvcic7XG5pbXBvcnQge1xuICBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSxcbiAgRGlyZWN0VGV4dHVyZURhdGEsXG4gIElDR0FQSVJlc291cmNlUmVwb3NpdG9yeSxcbiAgSW1hZ2VCaXRtYXBEYXRhLFxufSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZUVudW0sIFZlcnRleEF0dHJpYnV0ZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IFRleHR1cmVQYXJhbWV0ZXJFbnVtLCBUZXh0dXJlUGFyYW1ldGVyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9UZXh0dXJlUGFyYW1ldGVyJztcbmltcG9ydCB7IFBpeGVsRm9ybWF0RW51bSwgUGl4ZWxGb3JtYXQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1BpeGVsRm9ybWF0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgV2ViR0xDb250ZXh0V3JhcHBlciB9IGZyb20gJy4vV2ViR0xDb250ZXh0V3JhcHBlcic7XG5pbXBvcnQgeyBBYnN0cmFjdFRleHR1cmUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3RleHR1cmVzL0Fic3RyYWN0VGV4dHVyZSc7XG5pbXBvcnQgeyBSZW5kZXJUYXJnZXRUZXh0dXJlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi90ZXh0dXJlcy9SZW5kZXJUYXJnZXRUZXh0dXJlJztcbmltcG9ydCB7IElSZW5kZXJhYmxlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi90ZXh0dXJlcy9JUmVuZGVyYWJsZSc7XG5pbXBvcnQgeyBGcmFtZUJ1ZmZlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvRnJhbWVCdWZmZXInO1xuaW1wb3J0IHsgSGRyaUZvcm1hdEVudW0sIEhkcmlGb3JtYXQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0hkcmlGb3JtYXQnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IFJlbmRlckJ1ZmZlclRhcmdldCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvUmVuZGVyQnVmZmVyVGFyZ2V0JztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgTWlzY1V0aWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvTWlzY1V0aWwnO1xuaW1wb3J0IHtcbiAgV2ViR0xSZXNvdXJjZUhhbmRsZSxcbiAgVHlwZWRBcnJheSxcbiAgSW5kZXgsXG4gIFNpemUsXG4gIENvdW50LFxuICBDR0FQSVJlc291cmNlSGFuZGxlLFxuICBCeXRlLFxuICBBcnJheVR5cGUsXG4gIFdlYkdQVVJlc291cmNlSGFuZGxlLFxufSBmcm9tICcuLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9EYXRhVXRpbCc7XG5pbXBvcnQgeyBSZW5kZXJCdWZmZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3RleHR1cmVzL1JlbmRlckJ1ZmZlcic7XG5pbXBvcnQgeyBCYXNpc0ZpbGUgfSBmcm9tICcuLi90eXBlcy9CYXNpc1RleHR1cmUnO1xuaW1wb3J0IHtcbiAgQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtLFxuICBCYXNpc0NvbXByZXNzaW9uVHlwZSxcbn0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9CYXNpc0NvbXByZXNzaW9uVHlwZSc7XG5pbXBvcnQgeyBXZWJHTEV4dGVuc2lvbiB9IGZyb20gJy4vV2ViR0xFeHRlbnNpb24nO1xuaW1wb3J0IHsgUm5XZWJHTFByb2dyYW0sIFJuV2ViR0xUZXh0dXJlIH0gZnJvbSAnLi9XZWJHTEV4dGVuZGVkVHlwZXMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvSXMnO1xuaW1wb3J0IHsgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXByZXNzaW9uVGV4dHVyZVR5cGUnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCBnZXRSZW5kZXJpbmdTdHJhdGVneSBmcm9tICcuL2dldFJlbmRlcmluZ1N0cmF0ZWd5JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgR0xfVEVYVFVSRV8yRCB9IGZyb20gJy4uL3R5cGVzL1dlYkdMQ29uc3RhbnRzJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5hbWVzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3NJbmZvIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3NJbmZvJztcbmltcG9ydCB7IFNhbXBsZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3RleHR1cmVzL1NhbXBsZXInO1xuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3RleHR1cmVzL0N1YmVUZXh0dXJlJztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHsgV2ViR0xTdGVyZW9VdGlsIH0gZnJvbSAnLi9XZWJHTFN0ZXJlb1V0aWwnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCwgVGV4dHVyZUZvcm1hdEVudW0gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1RleHR1cmVGb3JtYXQnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL0xvZ2dlcic7XG5jb25zdCBIRFJJbWFnZSA9IHJlcXVpcmUoJy4uLy4uL3ZlbmRvci9oZHJwbmcubWluLmpzJyk7XG5cbmV4cG9ydCB0eXBlIFZlcnRleEhhbmRsZXMgPSB7XG4gIHZhb0hhbmRsZTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcbiAgaWJvSGFuZGxlPzogQ0dBUElSZXNvdXJjZUhhbmRsZTtcbiAgdmJvSGFuZGxlczogQXJyYXk8Q0dBUElSZXNvdXJjZUhhbmRsZT47XG4gIGF0dHJpYnV0ZXNGbGFnczogQXJyYXk8Ym9vbGVhbj47XG4gIHNldENvbXBsZXRlOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGV4dHVyZURhdGEgPSB7XG4gIGxldmVsOiBDb3VudDtcbiAgd2lkdGg6IENvdW50O1xuICBoZWlnaHQ6IENvdW50O1xuICBidWZmZXI6IEFycmF5QnVmZmVyVmlldztcbn07XG5cbmV4cG9ydCB0eXBlIFdlYkdMUmVzb3VyY2UgPVxuICB8IFdlYkdMQnVmZmVyXG4gIHwgV2ViR0xGcmFtZWJ1ZmZlclxuICB8IFdlYkdMT2JqZWN0XG4gIHwgV2ViR0xQcm9ncmFtXG4gIHwgV2ViR0xSZW5kZXJidWZmZXJcbiAgfCBXZWJHTFRleHR1cmVcbiAgfCBXZWJHTFRyYW5zZm9ybUZlZWRiYWNrO1xuXG5leHBvcnQgY2xhc3MgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnlcbiAgZXh0ZW5kcyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeVxuICBpbXBsZW1lbnRzIElDR0FQSVJlc291cmNlUmVwb3NpdG9yeVxue1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBXZWJHTFJlc291cmNlUmVwb3NpdG9yeTtcbiAgcHJpdmF0ZSBfX3dlYmdsQ29udGV4dHM6IE1hcDxzdHJpbmcsIFdlYkdMQ29udGV4dFdyYXBwZXI+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9fZ2x3PzogV2ViR0xDb250ZXh0V3JhcHBlcjtcbiAgcHJpdmF0ZSBfX3Jlc291cmNlQ291bnRlcjogbnVtYmVyID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gIHByaXZhdGUgX193ZWJnbFJlc291cmNlczogTWFwPFdlYkdMUmVzb3VyY2VIYW5kbGUsIFdlYkdMUmVzb3VyY2U+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9fc2FtcGxlckNsYW1wVG9FZGdlTGluZWFyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlID1cbiAgICBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgcHJpdmF0ZSBfX3NhbXBsZXJDbGFtcFRvRWRnZU5lYXJlc3RVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGUgPVxuICAgIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuICBwcml2YXRlIF9fc2FtcGxlclJlcGVhdE5lYXJlc3RVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGUgPVxuICAgIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuICBwcml2YXRlIF9fc2FtcGxlclJlcGVhdExpbmVhclVpZDogV2ViR0xSZXNvdXJjZUhhbmRsZSA9XG4gICAgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gIHByaXZhdGUgX19zYW1wbGVyU2hhZG93VWlkOiBXZWJHTFJlc291cmNlSGFuZGxlID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gIHByaXZhdGUgX19zYW1wbGVyUmVwZWF0VHJpTGluZWFyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlID1cbiAgICBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgcHJpdmF0ZSBfX3NhbXBsZXJSZXBlYXRBbmlzb3Ryb3B5TGluZWFyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlID1cbiAgICBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19pbnN0YW5jZTtcbiAgfVxuXG4gIGFkZFdlYkdMQ29udGV4dChnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgYXNDdXJyZW50OiBib29sZWFuKSB7XG4gICAgY29uc3QgZ2x3ID0gbmV3IFdlYkdMQ29udGV4dFdyYXBwZXIoZ2wsIGNhbnZhcyk7XG4gICAgdGhpcy5fX3dlYmdsQ29udGV4dHMuc2V0KCdkZWZhdWx0JywgZ2x3KTtcbiAgICBpZiAoYXNDdXJyZW50KSB7XG4gICAgICB0aGlzLl9fZ2x3ID0gZ2x3O1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlV2ViR0xDb250ZXh0KFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgYXNDdXJyZW50OiBib29sZWFuLFxuICAgIHdlYmdsT3B0aW9uPzogV2ViR0xDb250ZXh0QXR0cmlidXRlc1xuICApIHtcbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbDInLCB3ZWJnbE9wdGlvbikgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICB0aGlzLmFkZFdlYkdMQ29udGV4dChnbCwgY2FudmFzLCBhc0N1cnJlbnQpO1xuXG4gICAgaWYgKE1pc2NVdGlsLmlzU2FmYXJpKCkpIHtcbiAgICAgIC8vIFNhZmFyaSAoV2ViR0wyIHZpYSBNZXRhbCkgZG9lcyd0IHN1cHBvcnQgVUJPIHByb3Blcmx5IGF0IDIwMjIvMDQvMTVcbiAgICAgIENvbmZpZy5pc1Vib0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2w7XG4gIH1cblxuICBnZXQgY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19nbHc7XG4gIH1cblxuICBwcml2YXRlIGdldFJlc291cmNlTnVtYmVyKCk6IFdlYkdMUmVzb3VyY2VIYW5kbGUge1xuICAgIHJldHVybiArK3RoaXMuX19yZXNvdXJjZUNvdW50ZXI7XG4gIH1cblxuICBwcml2YXRlIF9fcmVnaXN0ZXJSZXNvdXJjZShvYmo6IFdlYkdMUmVzb3VyY2UpIHtcbiAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmdldFJlc291cmNlTnVtYmVyKCk7XG4gICAgKG9iaiBhcyBhbnkpLl9yZXNvdXJjZVVpZCA9IGhhbmRsZTtcbiAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZXMuc2V0KGhhbmRsZSwgb2JqKTtcbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG5cbiAgZ2V0V2ViR0xSZXNvdXJjZShXZWJHTFJlc291cmNlSGFuZGxlOiBXZWJHTFJlc291cmNlSGFuZGxlKTogV2ViR0xSZXNvdXJjZSB8IG51bGwge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX193ZWJnbFJlc291cmNlcy5nZXQoV2ViR0xSZXNvdXJjZUhhbmRsZSk7XG4gICAgcmV0dXJuIHJlc3VsdCA/PyBudWxsO1xuICB9XG5cbiAgY3JlYXRlSW5kZXhCdWZmZXIoYWNjZXNzb3I6IEFjY2Vzc29yKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBpZiAoZ2wgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJHTFJlbmRlcmluZ0NvbnRleHQgc2V0IGFzIERlZmF1bHQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2dsdyEuYmluZFZlcnRleEFycmF5KG51bGwpO1xuICAgIGNvbnN0IGlibyA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UoaWJvISk7XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpYm8pO1xuICAgIC8vICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGFjY2Vzc29yLmJ1ZmZlclZpZXcuYnVmZmVyLmdldEFycmF5QnVmZmVyKCksIGdsLlNUQVRJQ19EUkFXKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhY2Nlc3Nvci5nZXRUeXBlZEFycmF5KCksIGdsLlNUQVRJQ19EUkFXKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIHVwZGF0ZUluZGV4QnVmZmVyKGFjY2Vzc29yOiBBY2Nlc3NvciwgcmVzb3VyY2VIYW5kbGU6IG51bWJlcikge1xuICAgIGNvbnN0IGdsdyA9IHRoaXMuX19nbHcgYXMgV2ViR0xDb250ZXh0V3JhcHBlcjtcbiAgICBjb25zdCBnbCA9IGdsdz8uZ2V0UmF3Q29udGV4dCgpIGFzIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgaWYgKElzLm5vdC5leGlzdChnbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gV2ViR0xSZW5kZXJpbmdDb250ZXh0IHNldCBhcyBEZWZhdWx0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGlibyA9IHRoaXMuX193ZWJnbFJlc291cmNlcy5nZXQocmVzb3VyY2VIYW5kbGUpIGFzIFdlYkdMQnVmZmVyO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoaWJvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgZm91bmQgSUJPLicpO1xuICAgIH1cblxuICAgIGdsdy5iaW5kVmVydGV4QXJyYXkobnVsbCk7XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpYm8pO1xuICAgIGdsLmJ1ZmZlclN1YkRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDAsIGFjY2Vzc29yLmdldFR5cGVkQXJyYXkoKSk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIH1cblxuICBjcmVhdGVWZXJ0ZXhCdWZmZXIoYWNjZXNzb3I6IEFjY2Vzc29yKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBpZiAoZ2wgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJHTFJlbmRlcmluZ0NvbnRleHQgc2V0IGFzIERlZmF1bHQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2dsdyEuYmluZFZlcnRleEFycmF5KG51bGwpO1xuICAgIGNvbnN0IHZibyA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodmJvISk7XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdmJvKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYWNjZXNzb3IuZ2V0VWludDhBcnJheSgpLCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgLy8gICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGFjY2Vzc29yLmdldFR5cGVkQXJyYXkoKSwgZ2wuU1RBVElDX0RSQVcpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBudWxsKTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIGNyZWF0ZVZlcnRleEJ1ZmZlckZyb21UeXBlZEFycmF5KHR5cGVkQXJyYXk6IFR5cGVkQXJyYXkpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHQoKTtcblxuICAgIGlmIChnbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFdlYkdMUmVuZGVyaW5nQ29udGV4dCBzZXQgYXMgRGVmYXVsdC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVmVydGV4QXJyYXkobnVsbCk7XG4gICAgY29uc3QgdmJvID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh2Ym8hKTtcblxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2Ym8pO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB0eXBlZEFycmF5LCBnbC5TVEFUSUNfRFJBVyk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIG51bGwpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgdXBkYXRlVmVydGV4QnVmZmVyKGFjY2Vzc29yOiBBY2Nlc3NvciwgcmVzb3VyY2VIYW5kbGU6IG51bWJlcikge1xuICAgIGNvbnN0IGdsdyA9IHRoaXMuX19nbHcgYXMgV2ViR0xDb250ZXh0V3JhcHBlcjtcbiAgICBjb25zdCBnbCA9IGdsdz8uZ2V0UmF3Q29udGV4dCgpIGFzIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgaWYgKCFJcy5leGlzdChnbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gV2ViR0xSZW5kZXJpbmdDb250ZXh0IHNldCBhcyBEZWZhdWx0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHZibyA9IHRoaXMuX193ZWJnbFJlc291cmNlcy5nZXQocmVzb3VyY2VIYW5kbGUpIGFzIFdlYkdMQnVmZmVyO1xuICAgIGlmICghSXMuZXhpc3QodmJvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgZm91bmQgVkJPLicpO1xuICAgIH1cblxuICAgIGdsdy5iaW5kVmVydGV4QXJyYXkobnVsbCk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZibyk7XG4gICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIGFjY2Vzc29yLmJ1ZmZlclZpZXcuZ2V0VWludDhBcnJheSgpKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIH1cblxuICBjcmVhdGVWZXJ0ZXhBcnJheSgpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHc7XG5cbiAgICBpZiAoZ2wgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJHTFJlbmRlcmluZ0NvbnRleHQgc2V0IGFzIERlZmF1bHQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFvID0gdGhpcy5fX2dsdyEuY3JlYXRlVmVydGV4QXJyYXkoKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KHZhbykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh2YW8pO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIGJpbmQgdGhlIFRleHR1cmUyRFxuICAgKiBAcGFyYW0gdGV4dHVyZVNsb3RJbmRleFxuICAgKiBAcGFyYW0gdGV4dHVyZVVpZFxuICAgKi9cbiAgYmluZFRleHR1cmUyRCh0ZXh0dXJlU2xvdEluZGV4OiBJbmRleCwgdGV4dHVyZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UodGV4dHVyZVVpZCkgYXMgV2ViR0xUZXh0dXJlO1xuICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlMkQodGV4dHVyZVNsb3RJbmRleCwgdGV4dHVyZSk7XG4gIH1cblxuICAvKipcbiAgICogYmluZCB0aGUgU2FtcGxlclxuICAgKiBAcGFyYW0gdGV4dHVyZVNsb3RJbmRleFxuICAgKiBAcGFyYW0gc2FtcGxlclVpZFxuICAgKi9cbiAgYmluZFRleHR1cmVTYW1wbGVyKHRleHR1cmVTbG90SW5kZXg6IEluZGV4LCBzYW1wbGVyVWlkOiBDR0FQSVJlc291cmNlSGFuZGxlKSB7XG4gICAgaWYgKHNhbXBsZXJVaWQgPT09IC0xKSB7XG4gICAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZVNhbXBsZXIodGV4dHVyZVNsb3RJbmRleCwgbnVsbCBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzYW1wbGVyID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKHNhbXBsZXJVaWQpIGFzIFdlYkdMU2FtcGxlcjtcbiAgICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlU2FtcGxlcih0ZXh0dXJlU2xvdEluZGV4LCBzYW1wbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmluZCB0aGUgVGV4dHVyZUN1YmVcbiAgICogQHBhcmFtIHRleHR1cmVTbG90SW5kZXhcbiAgICogQHBhcmFtIHRleHR1cmVVaWRcbiAgICovXG4gIGJpbmRUZXh0dXJlQ3ViZSh0ZXh0dXJlU2xvdEluZGV4OiBJbmRleCwgdGV4dHVyZVVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UodGV4dHVyZVVpZCkgYXMgV2ViR0xUZXh0dXJlO1xuICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlQ3ViZSh0ZXh0dXJlU2xvdEluZGV4LCB0ZXh0dXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBWZXJ0ZXhCdWZmZXIgYW5kIEluZGV4QnVmZmVyXG4gICAqIEBwYXJhbSBwcmltaXRpdmVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZVZlcnRleEJ1ZmZlckFuZEluZGV4QnVmZmVyKHByaW1pdGl2ZTogUHJpbWl0aXZlKTogVmVydGV4SGFuZGxlcyB7XG4gICAgbGV0IGlib0hhbmRsZTtcbiAgICBpZiAocHJpbWl0aXZlLmhhc0luZGljZXMoKSkge1xuICAgICAgaWJvSGFuZGxlID0gdGhpcy5jcmVhdGVJbmRleEJ1ZmZlcihwcmltaXRpdmUuaW5kaWNlc0FjY2Vzc29yISk7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlc0ZsYWdzOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFZlcnRleEF0dHJpYnV0ZS5BdHRyaWJ1dGVUeXBlTnVtYmVyOyBpKyspIHtcbiAgICAgIGF0dHJpYnV0ZXNGbGFnc1tpXSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2Ym9IYW5kbGVzOiBBcnJheTxXZWJHTFJlc291cmNlSGFuZGxlPiA9IFtdO1xuICAgIHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnMuZm9yRWFjaCgoYWNjZXNzb3I6IEFjY2Vzc29yLCBpOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHZib0hhbmRsZSA9IHRoaXMuY3JlYXRlVmVydGV4QnVmZmVyKGFjY2Vzc29yKTtcbiAgICAgIGNvbnN0IHNsb3RJZHggPSBWZXJ0ZXhBdHRyaWJ1dGUudG9BdHRyaWJ1dGVTbG90RnJvbUpvaW5lZFN0cmluZyhcbiAgICAgICAgcHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljc1tpXVxuICAgICAgKTtcbiAgICAgIGF0dHJpYnV0ZXNGbGFnc1tzbG90SWR4XSA9IHRydWU7XG4gICAgICB2Ym9IYW5kbGVzLnB1c2godmJvSGFuZGxlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YW9IYW5kbGU6IC0xLFxuICAgICAgaWJvSGFuZGxlOiBpYm9IYW5kbGUsXG4gICAgICB2Ym9IYW5kbGVzOiB2Ym9IYW5kbGVzLFxuICAgICAgYXR0cmlidXRlc0ZsYWdzOiBhdHRyaWJ1dGVzRmxhZ3MsXG4gICAgICBzZXRDb21wbGV0ZTogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1cGRhdGUgdGhlIFZlcnRleEJ1ZmZlciBhbmQgSW5kZXhCdWZmZXJcbiAgICogQHBhcmFtIHByaW1pdGl2ZVxuICAgKiBAcGFyYW0gdmVydGV4SGFuZGxlc1xuICAgKi9cbiAgdXBkYXRlVmVydGV4QnVmZmVyQW5kSW5kZXhCdWZmZXIocHJpbWl0aXZlOiBQcmltaXRpdmUsIHZlcnRleEhhbmRsZXM6IFZlcnRleEhhbmRsZXMpIHtcbiAgICBpZiAodmVydGV4SGFuZGxlcy5pYm9IYW5kbGUpIHtcbiAgICAgIHRoaXMudXBkYXRlSW5kZXhCdWZmZXIocHJpbWl0aXZlLmluZGljZXNBY2Nlc3NvciBhcyBBY2Nlc3NvciwgdmVydGV4SGFuZGxlcy5pYm9IYW5kbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29ycyA9IHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVBY2Nlc3NvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudXBkYXRlVmVydGV4QnVmZmVyKGF0dHJpYnV0ZUFjY2Vzc29yc1tpXSwgdmVydGV4SGFuZGxlcy52Ym9IYW5kbGVzW2ldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgc2hhZGVyIHByb2dyYW1cbiAgICogQHJldHVybnMgYSBvYmplY3Qgd2hpY2ggaGFzIHNoYWRlciBtb2R1bGVzXG4gICAqL1xuICBjcmVhdGVTaGFkZXJQcm9ncmFtKHtcbiAgICBtYXRlcmlhbCxcbiAgICB2ZXJ0ZXhTaGFkZXJTdHIsXG4gICAgZnJhZ21lbnRTaGFkZXJTdHIsXG4gICAgYXR0cmlidXRlTmFtZXMsXG4gICAgYXR0cmlidXRlU2VtYW50aWNzLFxuICAgIG9uRXJyb3IsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgdmVydGV4U2hhZGVyU3RyOiBzdHJpbmc7XG4gICAgZnJhZ21lbnRTaGFkZXJTdHI6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVOYW1lczogQXR0cmlidXRlTmFtZXM7XG4gICAgYXR0cmlidXRlU2VtYW50aWNzOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtW107XG4gICAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIH0pOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBpZiAoZ2wgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJHTFJlbmRlcmluZ0NvbnRleHQgc2V0IGFzIERlZmF1bHQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGlzRGVidWdNb2RlID0gQ29uZmlnLmNnQXBpRGVidWdDb25zb2xlT3V0cHV0O1xuXG4gICAgY29uc3QgdmVydGV4U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpITtcbiAgICBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCB2ZXJ0ZXhTaGFkZXJTdHIpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICBpZiAoaXNEZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX19jaGVja1NoYWRlckNvbXBpbGVTdGF0dXMoXG4gICAgICAgIG1hdGVyaWFsLm1hdGVyaWFsVHlwZU5hbWUsXG4gICAgICAgIHZlcnRleFNoYWRlcixcbiAgICAgICAgdmVydGV4U2hhZGVyU3RyLFxuICAgICAgICBvbkVycm9yXG4gICAgICApO1xuXG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXR1cm4gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKSE7XG4gICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlclN0cik7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gICAgaWYgKGlzRGVidWdNb2RlKSB7XG4gICAgICB0aGlzLl9fY2hlY2tTaGFkZXJDb21waWxlU3RhdHVzKFxuICAgICAgICBtYXRlcmlhbC5tYXRlcmlhbFR5cGVOYW1lLFxuICAgICAgICBmcmFnbWVudFNoYWRlcixcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTdHIsXG4gICAgICAgIG9uRXJyb3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhZGVyUHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKSEgYXMgUm5XZWJHTFByb2dyYW07XG4gICAgc2hhZGVyUHJvZ3JhbS5fZ2wgPSBnbDtcbiAgICBzaGFkZXJQcm9ncmFtLl9tYXRlcmlhbFR5cGVOYW1lID0gbWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZTtcbiAgICBzaGFkZXJQcm9ncmFtLl92ZXJ0ZXhTaGFkZXJTdHIgPSB2ZXJ0ZXhTaGFkZXJTdHI7XG4gICAgc2hhZGVyUHJvZ3JhbS5fZnJhZ21lbnRTaGFkZXJTdHIgPSBmcmFnbWVudFNoYWRlclN0cjtcbiAgICBzaGFkZXJQcm9ncmFtLl9zaGFkZXJTZW1hbnRpY3NJbmZvTWFwID0gbmV3IE1hcCgpO1xuICAgIHNoYWRlclByb2dyYW0uX21hdGVyaWFsID0gbmV3IFdlYWtSZWYobWF0ZXJpYWwpO1xuXG4gICAgZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcblxuICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XG4gICAgICBnbC5iaW5kQXR0cmliTG9jYXRpb24oc2hhZGVyUHJvZ3JhbSwgYXR0cmlidXRlU2VtYW50aWNzW2ldLmdldEF0dHJpYnV0ZVNsb3QoKSwgYXR0cmlidXRlTmFtZSk7XG4gICAgfSk7XG5cbiAgICBnbC5saW5rUHJvZ3JhbShzaGFkZXJQcm9ncmFtKTtcblxuICAgIGlmIChpc0RlYnVnTW9kZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fX2NoZWNrU2hhZGVyUHJvZ3JhbUxpbmtTdGF0dXMoXG4gICAgICAgIG1hdGVyaWFsLm1hdGVyaWFsVHlwZU5hbWUsXG4gICAgICAgIHNoYWRlclByb2dyYW0sXG4gICAgICAgIHZlcnRleFNoYWRlclN0cixcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTdHJcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaGFkZXJQcm9ncmFtLl9fU1BFQ1RPUl9yZWJ1aWxkUHJvZ3JhbSA9IHRoaXMucmVidWlsZFByb2dyYW1CeVNwZWN0b3IuYmluZChzaGFkZXJQcm9ncmFtKTtcblxuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2hhZGVyUHJvZ3JhbSk7XG5cbiAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NoZWNrU2hhZGVyQ29tcGlsZVN0YXR1cyhcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgc2hhZGVyOiBXZWJHTFNoYWRlcixcbiAgICBzaGFkZXJUZXh0OiBzdHJpbmcsXG4gICAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ2x3ID0gdGhpcy5fX2dsdyE7XG4gICAgY29uc3QgZ2wgPSBnbHchLmdldFJhd0NvbnRleHQoKTtcbiAgICBpZiAoXG4gICAgICBJcy5mYWxzZShnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpICYmXG4gICAgICBJcy5mYWxzZShnbC5pc0NvbnRleHRMb3N0KCkpXG4gICAgKSB7XG4gICAgICBMb2dnZXIuaW5mbygnTWF0ZXJpYWxUeXBlTmFtZTogJyArIG1hdGVyaWFsVHlwZU5hbWUpO1xuICAgICAgY29uc3QgbGluZU51bWJlcmVkU2hhZGVyVGV4dCA9IE1pc2NVdGlsLmFkZExpbmVOdW1iZXJUb0NvZGUoc2hhZGVyVGV4dCk7XG4gICAgICBMb2dnZXIuaW5mbyhsaW5lTnVtYmVyZWRTaGFkZXJUZXh0KTtcbiAgICAgIGNvbnN0IGxvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcbiAgICAgIGlmIChvbkVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgTG9nZ2VyLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBjb21waWxpbmcgdGhlIHNoYWRlcnM6JyArIGxvZyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uRXJyb3IobG9nISk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9fY2hlY2tTaGFkZXJQcm9ncmFtTGlua1N0YXR1cyhcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIHZlcnRleFNoYWRlclRleHQ6IHN0cmluZyxcbiAgICBmcmFnbWVudFNoYWRlclRleHQ6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBnbHcgPSB0aGlzLl9fZ2x3ITtcbiAgICBjb25zdCBnbCA9IGdsdyEuZ2V0UmF3Q29udGV4dCgpO1xuXG4gICAgLy8gSWYgY3JlYXRpbmcgdGhlIHNoYWRlciBwcm9ncmFtIGZhaWxlZCwgYWxlcnRcbiAgICBpZiAoXG4gICAgICBJcy5mYWxzZShnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHNoYWRlclByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkgJiZcbiAgICAgIElzLmZhbHNlKGdsLmlzQ29udGV4dExvc3QoKSlcbiAgICApIHtcbiAgICAgIExvZ2dlci5pbmZvKCdNYXRlcmlhbFR5cGVOYW1lOiAnICsgbWF0ZXJpYWxUeXBlTmFtZSk7XG4gICAgICBMb2dnZXIuaW5mbyhNaXNjVXRpbC5hZGRMaW5lTnVtYmVyVG9Db2RlKCdWZXJ0ZXggU2hhZGVyOicpKTtcbiAgICAgIExvZ2dlci5pbmZvKE1pc2NVdGlsLmFkZExpbmVOdW1iZXJUb0NvZGUodmVydGV4U2hhZGVyVGV4dCkpO1xuICAgICAgTG9nZ2VyLmluZm8oTWlzY1V0aWwuYWRkTGluZU51bWJlclRvQ29kZSgnRnJhZ21lbnQgU2hhZGVyOicpKTtcbiAgICAgIExvZ2dlci5pbmZvKE1pc2NVdGlsLmFkZExpbmVOdW1iZXJUb0NvZGUoZnJhZ21lbnRTaGFkZXJUZXh0KSk7XG4gICAgICBjb25zdCBsb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyhzaGFkZXJQcm9ncmFtKTtcbiAgICAgIExvZ2dlci5lcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIHNoYWRlciBwcm9ncmFtOiAnICsgbG9nKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXR1cCB0aGUgdW5pZm9ybSBsb2NhdGlvbnNcbiAgICogQHBhcmFtIHNoYWRlclByb2dyYW1VaWRcbiAgICogQHBhcmFtIGluZm9BcnJheVxuICAgKiBAcGFyYW0gaXNVbmlmb3JtT25seU1vZGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHNldHVwVW5pZm9ybUxvY2F0aW9ucyhcbiAgICBzaGFkZXJQcm9ncmFtVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlLFxuICAgIGluZm9BcnJheTogU2hhZGVyU2VtYW50aWNzSW5mb1tdLFxuICAgIGlzVW5pZm9ybU9ubHlNb2RlOiBib29sZWFuXG4gICk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgY29uc3QgZ2x3ID0gdGhpcy5fX2dsdyE7XG4gICAgY29uc3QgZ2wgPSBnbHcuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGNvbnN0IHNoYWRlclByb2dyYW0gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2Uoc2hhZGVyUHJvZ3JhbVVpZCkgYXMgUm5XZWJHTFByb2dyYW07XG5cbiAgICBjb25zdCBpbmZvQXJyYXlMZW4gPSBpbmZvQXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5mb0FycmF5TGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZm8gPSBpbmZvQXJyYXlbaV07XG4gICAgICBzaGFkZXJQcm9ncmFtLl9zaGFkZXJTZW1hbnRpY3NJbmZvTWFwLnNldChpbmZvLnNlbWFudGljLCBpbmZvKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZm9BcnJheUxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBpbmZvID0gaW5mb0FycmF5W2ldO1xuICAgICAgY29uc3QgaXNVbmlmb3JtRXhpc3QgPVxuICAgICAgICBpc1VuaWZvcm1Pbmx5TW9kZSB8fFxuICAgICAgICBpbmZvLm5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGUgfHxcbiAgICAgICAgQ29tcG9zaXRpb25UeXBlLmlzVGV4dHVyZShpbmZvLmNvbXBvc2l0aW9uVHlwZSk7XG5cbiAgICAgIGlmIChpc1VuaWZvcm1FeGlzdCkge1xuICAgICAgICBjb25zdCBzZW1hbnRpY1Npbmd1bGFyID0gaW5mby5zZW1hbnRpYztcblxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gc2VtYW50aWNTaW5ndWxhcjtcblxuICAgICAgICBjb25zdCBzaGFkZXJWYXJOYW1lID0gJ3VfJyArIGluZm8uc2VtYW50aWM7XG5cbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24oc2hhZGVyUHJvZ3JhbSwgc2hhZGVyVmFyTmFtZSk7XG4gICAgICAgIGNvbnN0IF9zaGFkZXJQcm9ncmFtID0gc2hhZGVyUHJvZ3JhbSBhcyBhbnk7XG4gICAgICAgIF9zaGFkZXJQcm9ncmFtW2lkZW50aWZpZXJdID0gbG9jYXRpb247XG4gICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsICYmIENvbmZpZy5jZ0FwaURlYnVnQ29uc29sZU91dHB1dCkge1xuICAgICAgICAgIExvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYENhbiBub3QgZ2V0IHRoZSB1bmlmb3JtIGxvY2F0aW9uOiAke3NoYWRlclZhck5hbWV9LiBUaGUgdW5pZm9ybSBtYXkgYmUgdW51c2VkIGJ5IG90aGVyIGNvZGUgc28gaW1wbGljaXRseSByZW1vdmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRlclByb2dyYW07XG4gIH1cblxuICBzZXR1cEJhc2ljVW5pZm9ybUxvY2F0aW9ucyhzaGFkZXJQcm9ncmFtVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3Qgc2hhZGVyUHJvZ3JhbSA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZShzaGFkZXJQcm9ncmFtVWlkKSBhcyBSbldlYkdMUHJvZ3JhbTtcbiAgICBjb25zdCBnbCA9IHRoaXMuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXIhLmdldFJhd0NvbnRleHQoKTtcbiAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmRhdGFUZXh0dXJlID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHNoYWRlclByb2dyYW0sICd1X2RhdGFUZXh0dXJlJyk7XG4gICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5pc01haW5WciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihzaGFkZXJQcm9ncmFtLCAndV9pc01haW5WcicpO1xuICAgIChzaGFkZXJQcm9ncmFtIGFzIGFueSkuY3VycmVudENvbXBvbmVudFNJRHMgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgJ3VfY3VycmVudENvbXBvbmVudFNJRHMnXG4gICAgKTtcbiAgfVxuXG4gIHNldFVuaWZvcm0xaUZvclRleHR1cmUoc2hhZGVyUHJvZ3JhbV86IFdlYkdMUHJvZ3JhbSwgc2VtYW50aWNTdHI6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHNoYWRlclByb2dyYW0gPSBzaGFkZXJQcm9ncmFtXyBhcyBSbldlYkdMUHJvZ3JhbTtcbiAgICBjb25zdCBpbmZvID0gc2hhZGVyUHJvZ3JhbS5fc2hhZGVyU2VtYW50aWNzSW5mb01hcC5nZXQoc2VtYW50aWNTdHIpO1xuICAgIGlmIChpbmZvID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgY29uc3QgbG9jOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IChzaGFkZXJQcm9ncmFtIGFzIGFueSlbc2VtYW50aWNTdHJdO1xuICAgIGdsLnVuaWZvcm0xaShsb2MsIHZhbHVlWzBdKTtcbiAgICB0aGlzLmJpbmRUZXh0dXJlKGluZm8sIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYW4gdW5pZm9ybSB2YWx1ZVxuICAgKi9cbiAgc2V0VW5pZm9ybVZhbHVlKFxuICAgIHNoYWRlclByb2dyYW1fOiBXZWJHTFByb2dyYW0sXG4gICAgc2VtYW50aWNTdHI6IHN0cmluZyxcbiAgICBmaXJzdFRpbWU6IGJvb2xlYW4sXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICBjb25zdCBzaGFkZXJQcm9ncmFtID0gc2hhZGVyUHJvZ3JhbV8gYXMgUm5XZWJHTFByb2dyYW07XG4gICAgY29uc3QgaW5mbyA9IHNoYWRlclByb2dyYW0uX3NoYWRlclNlbWFudGljc0luZm9NYXAuZ2V0KHNlbWFudGljU3RyKTtcbiAgICBpZiAoaW5mbyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHNldEFzTWF0cml4ID0gZmFsc2U7XG4gICAgbGV0IGNvbXBvbmVudE51bWJlciA9IDA7XG4gICAgaWYgKGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0Mykge1xuICAgICAgc2V0QXNNYXRyaXggPSB0cnVlO1xuICAgICAgY29tcG9uZW50TnVtYmVyID0gMztcbiAgICB9IGVsc2UgaWYgKGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuTWF0NCkge1xuICAgICAgc2V0QXNNYXRyaXggPSB0cnVlO1xuICAgICAgY29tcG9uZW50TnVtYmVyID0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50TnVtYmVyID0gaW5mby5jb21wb3NpdGlvblR5cGUhLmdldE51bWJlck9mQ29tcG9uZW50cygpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcG9zaXRpb25UeXBlQXJyYXkgPVxuICAgICAgaW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheSB8fFxuICAgICAgaW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5WZWM0QXJyYXkgfHxcbiAgICAgIGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVmVjM0FycmF5IHx8XG4gICAgICBpbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlZlYzJBcnJheTtcbiAgICBjb25zdCBpc0NvbXBvc2l0aW9uVHlwZVRleHR1cmUgPSBDb21wb3NpdGlvblR5cGUuaXNUZXh0dXJlKGluZm8uY29tcG9zaXRpb25UeXBlKTtcbiAgICBjb25zdCBrZXkgPSBzZW1hbnRpY1N0cjtcblxuICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgaWYgKGlzQ29tcG9zaXRpb25UeXBlVGV4dHVyZSkge1xuICAgICAgdXBkYXRlZCA9IHRoaXMuc2V0VW5pZm9ybVZhbHVlSW5uZXIoXG4gICAgICAgIHNoYWRlclByb2dyYW1fLFxuICAgICAgICBrZXksXG4gICAgICAgIGluZm8sXG4gICAgICAgIHNldEFzTWF0cml4LFxuICAgICAgICBjb21wb25lbnROdW1iZXIsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB7IHg6IHZhbHVlWzBdIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmJpbmRUZXh0dXJlKGluZm8sIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlzQ29tcG9zaXRpb25UeXBlQXJyYXkpIHtcbiAgICAgIGlmICh2YWx1ZS5fdiA9PSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZWQgPSB0aGlzLnNldFVuaWZvcm1WYWx1ZUlubmVyKFxuICAgICAgICAgIHNoYWRlclByb2dyYW1fLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBpbmZvLFxuICAgICAgICAgIHNldEFzTWF0cml4LFxuICAgICAgICAgIGNvbXBvbmVudE51bWJlcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHsgeDogdmFsdWUgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlZCA9IHRoaXMuc2V0VW5pZm9ybVZhbHVlSW5uZXIoXG4gICAgICAgICAgc2hhZGVyUHJvZ3JhbV8sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZm8sXG4gICAgICAgICAgc2V0QXNNYXRyaXgsXG4gICAgICAgICAgY29tcG9uZW50TnVtYmVyLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgeyB4OiB2YWx1ZS5fdiB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmZvLmNvbXBvc2l0aW9uVHlwZSA9PT0gQ29tcG9zaXRpb25UeXBlLlNjYWxhcikge1xuICAgICAgaWYgKHZhbHVlLl92ID09IG51bGwpIHtcbiAgICAgICAgdXBkYXRlZCA9IHRoaXMuc2V0VW5pZm9ybVZhbHVlSW5uZXIoXG4gICAgICAgICAgc2hhZGVyUHJvZ3JhbV8sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZm8sXG4gICAgICAgICAgc2V0QXNNYXRyaXgsXG4gICAgICAgICAgY29tcG9uZW50TnVtYmVyLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHsgeDogdmFsdWUgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlZCA9IHRoaXMuc2V0VW5pZm9ybVZhbHVlSW5uZXIoXG4gICAgICAgICAgc2hhZGVyUHJvZ3JhbV8sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZm8sXG4gICAgICAgICAgc2V0QXNNYXRyaXgsXG4gICAgICAgICAgY29tcG9uZW50TnVtYmVyLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgeyB4OiB2YWx1ZS5fdiB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIENvbXBvc2l0aW9uVHlwZS5WZWMqfE1hdCosIHRoZW4uLi5cbiAgICAgIGlmICh2YWx1ZS5fdiA9PSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZWQgPSB0aGlzLnNldFVuaWZvcm1WYWx1ZUlubmVyKFxuICAgICAgICAgIHNoYWRlclByb2dyYW1fLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBpbmZvLFxuICAgICAgICAgIHNldEFzTWF0cml4LFxuICAgICAgICAgIGNvbXBvbmVudE51bWJlcixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlZCA9IHRoaXMuc2V0VW5pZm9ybVZhbHVlSW5uZXIoXG4gICAgICAgICAgc2hhZGVyUHJvZ3JhbV8sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZm8sXG4gICAgICAgICAgc2V0QXNNYXRyaXgsXG4gICAgICAgICAgY29tcG9uZW50TnVtYmVyLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgeyB4OiB2YWx1ZS5fdiB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogYmluZCB0aGUgdGV4dHVyZVxuICAgKiBAcGFyYW0gaW5mb1xuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIGJpbmRUZXh0dXJlKGluZm86IFNoYWRlclNlbWFudGljc0luZm8sIHZhbHVlOiBbbnVtYmVyLCBBYnN0cmFjdFRleHR1cmUsIFNhbXBsZXJdKSB7XG4gICAgaWYgKFxuICAgICAgaW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlMkQgfHxcbiAgICAgIGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJEU2hhZG93XG4gICAgKSB7XG4gICAgICB0aGlzLmJpbmRUZXh0dXJlMkQodmFsdWVbMF0sIHZhbHVlWzFdLl90ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICAgICAgaWYgKHZhbHVlWzJdICE9IG51bGwpIHtcbiAgICAgICAgLy8gdmFsdWVbMl0gbXVzdCBiZSBTYW1wbGVyIG9iamVjdFxuICAgICAgICB0aGlzLmJpbmRUZXh0dXJlU2FtcGxlcih2YWx1ZVswXSwgdmFsdWVbMl0uX3NhbXBsZXJSZXNvdXJjZVVpZCk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgdGhpcy5iaW5kVGV4dHVyZVNhbXBsZXIodmFsdWVbMF0sIC0xKTtcbiAgICAgICAgLy8gfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJEKSB7XG4gICAgICAgICAgY29uc3Qgc2FtcGxlclVpZCA9IHRoaXMuY3JlYXRlT3JHZXRUZXh0dXJlU2FtcGxlckNsYW1wVG9FZGdlTGluZWFyKCk7XG4gICAgICAgICAgdGhpcy5iaW5kVGV4dHVyZVNhbXBsZXIodmFsdWVbMF0sIHNhbXBsZXJVaWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZTJEU2hhZG93KSB7XG4gICAgICAgICAgY29uc3Qgc2FtcGxlclVpZCA9IHRoaXMuY3JlYXRlT3JHZXRUZXh0dXJlU2FtcGxlclNoYWRvdygpO1xuICAgICAgICAgIHRoaXMuYmluZFRleHR1cmVTYW1wbGVyKHZhbHVlWzBdLCBzYW1wbGVyVWlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5mby5jb21wb3NpdGlvblR5cGUgPT09IENvbXBvc2l0aW9uVHlwZS5UZXh0dXJlQ3ViZSkge1xuICAgICAgdGhpcy5iaW5kVGV4dHVyZUN1YmUodmFsdWVbMF0sIHZhbHVlWzFdLl90ZXh0dXJlUmVzb3VyY2VVaWQpO1xuICAgICAgaWYgKHZhbHVlWzJdICE9IG51bGwpIHtcbiAgICAgICAgLy8gdmFsdWVbMl0gbXVzdCBiZSBTYW1wbGVyIG9iamVjdFxuICAgICAgICB0aGlzLmJpbmRUZXh0dXJlU2FtcGxlcih2YWx1ZVswXSwgdmFsdWVbMl0uX3NhbXBsZXJSZXNvdXJjZVVpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzLmJpbmRUZXh0dXJlU2FtcGxlcih2YWx1ZVswXSwgLTEpO1xuICAgICAgICBjb25zdCB0ZXh0dXJlQ3ViZSA9IHZhbHVlWzFdIGFzIEN1YmVUZXh0dXJlO1xuICAgICAgICAvLyBjb25zdCBzYW1wbGVyVWlkID0gdGhpcy5jcmVhdGVPckdldFRleHR1cmVTYW1wbGVyUmVwZWF0VHJpTGluZWFyKCk7XG4gICAgICAgIHRoaXMuYmluZFRleHR1cmVTYW1wbGVyKFxuICAgICAgICAgIHZhbHVlWzBdLFxuICAgICAgICAgIHRleHR1cmVDdWJlLl9yZWNvbW1lbmRlZFRleHR1cmVTYW1wbGVyPy5fc2FtcGxlclJlc291cmNlVWlkID8/IC0xXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgdW5pZm9ybSB2YWx1ZVxuICAgKiBAcGFyYW0gc2hhZGVyUHJvZ3JhbVxuICAgKiBAcGFyYW0gc2VtYW50aWNTdHJcbiAgICogQHBhcmFtIGluZm9cbiAgICogQHBhcmFtIGlzTWF0cml4XG4gICAqIEBwYXJhbSBjb21wb25lbnROdW1iZXJcbiAgICogQHBhcmFtIGlzVmVjdG9yXG4gICAqIEBwYXJhbSBwYXJhbTZcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzZXRVbmlmb3JtVmFsdWVJbm5lcihcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW0sXG4gICAgc2VtYW50aWNTdHI6IHN0cmluZyxcbiAgICBpbmZvOiBTaGFkZXJTZW1hbnRpY3NJbmZvLFxuICAgIGlzTWF0cml4OiBib29sZWFuLFxuICAgIGNvbXBvbmVudE51bWJlcjogbnVtYmVyLFxuICAgIGlzVmVjdG9yOiBib29sZWFuLFxuICAgIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeixcbiAgICAgIHcsXG4gICAgfToge1xuICAgICAgeDogbnVtYmVyIHwgQXJyYXlUeXBlIHwgYm9vbGVhbjtcbiAgICAgIHk/OiBudW1iZXIgfCBib29sZWFuO1xuICAgICAgej86IG51bWJlciB8IGJvb2xlYW47XG4gICAgICB3PzogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICB9XG4gICkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBzZW1hbnRpY1N0cjtcbiAgICBjb25zdCBsb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gKHNoYWRlclByb2dyYW0gYXMgYW55KVtpZGVudGlmaWVyXTtcbiAgICBpZiAobG9jID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdUxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiA9IGxvYztcblxuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpIGFzIGFueTtcblxuICAgIGlmIChpc01hdHJpeCkge1xuICAgICAgaWYgKGNvbXBvbmVudE51bWJlciA9PT0gNCkge1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHVMb2NhdGlvbiwgZmFsc2UsIHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdih1TG9jYXRpb24sIGZhbHNlLCB4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVmVjdG9yKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRUeXBlID1cbiAgICAgICAgaW5mby5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkludCB8fFxuICAgICAgICBpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuU2hvcnQgfHxcbiAgICAgICAgaW5mby5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkJ5dGU7XG4gICAgICBpZiAoY29tcG9uZW50TnVtYmVyID09PSAxKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTFpdih1TG9jYXRpb24sIHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdsLnVuaWZvcm0xZnYodUxvY2F0aW9uLCB4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnROdW1iZXIgPT09IDIpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUpIHtcbiAgICAgICAgICBnbC51bmlmb3JtMml2KHVMb2NhdGlvbiwgeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTJmdih1TG9jYXRpb24sIHgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudE51bWJlciA9PT0gMykge1xuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgICAgIGdsLnVuaWZvcm0zaXYodUxvY2F0aW9uLCB4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnbC51bmlmb3JtM2Z2KHVMb2NhdGlvbiwgeCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TnVtYmVyID09PSA0KSB7XG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTRpdih1TG9jYXRpb24sIHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdsLnVuaWZvcm00ZnYodUxvY2F0aW9uLCB4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wb25lbnRUeXBlID1cbiAgICAgICAgaW5mby5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkludCB8fFxuICAgICAgICBpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuU2hvcnQgfHxcbiAgICAgICAgaW5mby5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkJ5dGU7XG4gICAgICBpZiAoY29tcG9uZW50TnVtYmVyID09PSAxKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTFpKHVMb2NhdGlvbiwgeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTFmKHVMb2NhdGlvbiwgeCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TnVtYmVyID09PSAyKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTJpKHVMb2NhdGlvbiwgeCwgeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTJmKHVMb2NhdGlvbiwgeCwgeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TnVtYmVyID09PSAzKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTNpKHVMb2NhdGlvbiwgeCwgeSwgeik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTNmKHVMb2NhdGlvbiwgeCwgeSwgeik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50TnVtYmVyID09PSA0KSB7XG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTRpKHVMb2NhdGlvbiwgeCwgeSwgeiwgdyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wudW5pZm9ybTRmKHVMb2NhdGlvbiwgeCwgeSwgeiwgdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIFZlcnRleERhdGEgdG8gdGhlIFBpcGVsaW5lXG4gICAqL1xuICBzZXRWZXJ0ZXhEYXRhVG9QaXBlbGluZShcbiAgICB7XG4gICAgICB2YW9IYW5kbGUsXG4gICAgICBpYm9IYW5kbGUsXG4gICAgICB2Ym9IYW5kbGVzLFxuICAgIH06IHtcbiAgICAgIHZhb0hhbmRsZTogV2ViR0xSZXNvdXJjZUhhbmRsZTtcbiAgICAgIGlib0hhbmRsZT86IFdlYkdMUmVzb3VyY2VIYW5kbGU7XG4gICAgICB2Ym9IYW5kbGVzOiBBcnJheTxXZWJHTFJlc291cmNlSGFuZGxlPjtcbiAgICB9LFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIGluc3RhbmNlSURCdWZmZXJVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGUgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZFxuICApIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHQoKTtcblxuICAgIGNvbnN0IHZhbyA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh2YW9IYW5kbGUpIGFzIFdlYkdMVmVydGV4QXJyYXlPYmplY3RPRVM7XG5cbiAgICAvLyBWQU8gYmluZFxuICAgIHRoaXMuX19nbHchLmJpbmRWZXJ0ZXhBcnJheSh2YW8hKTtcblxuICAgIC8vIElCTyBiaW5kXG4gICAgaWYgKGlib0hhbmRsZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpYm8gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UoaWJvSGFuZGxlKSBhcyBXZWJHTEJ1ZmZlcjtcbiAgICAgIGlmIChpYm8gIT0gbnVsbCkge1xuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpYm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RoaW5nIEVsZW1lbnQgQXJyYXkgQnVmZmVyIScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGJpbmQgdmVydGV4IGF0dHJpYnV0ZXMgdG8gVkJPJ3NcbiAgICB2Ym9IYW5kbGVzLmZvckVhY2goKHZib0hhbmRsZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKHZib0hhbmRsZSkgYXMgV2ViR0xCdWZmZXI7XG4gICAgICBpZiAodmJvICE9IG51bGwpIHtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZibyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdGhpbmcgRWxlbWVudCBBcnJheSBCdWZmZXIgYXQgaW5kZXggJyArIGkpO1xuICAgICAgfVxuICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoXG4gICAgICAgIFZlcnRleEF0dHJpYnV0ZS50b0F0dHJpYnV0ZVNsb3RGcm9tSm9pbmVkU3RyaW5nKHByaW1pdGl2ZS5hdHRyaWJ1dGVTZW1hbnRpY3NbaV0pXG4gICAgICApO1xuICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgVmVydGV4QXR0cmlidXRlLnRvQXR0cmlidXRlU2xvdEZyb21Kb2luZWRTdHJpbmcocHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljc1tpXSksXG4gICAgICAgIHByaW1pdGl2ZS5hdHRyaWJ1dGVDb21wb3NpdGlvblR5cGVzW2ldLmdldE51bWJlck9mQ29tcG9uZW50cygpLFxuICAgICAgICBwcmltaXRpdmUuYXR0cmlidXRlQ29tcG9uZW50VHlwZXNbaV0uaW5kZXgsXG4gICAgICAgIHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnNbaV0ubm9ybWFsaXplZCxcbiAgICAgICAgcHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29yc1tpXS5ieXRlU3RyaWRlLFxuICAgICAgICAwXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8vIGZvciBJbnN0YW5jZUlEQnVmZmVyXG4gICAgaWYgKGluc3RhbmNlSURCdWZmZXJVaWQgIT09IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZUlEQnVmZmVyID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGluc3RhbmNlSURCdWZmZXJVaWQpIGFzIFdlYkdMQnVmZmVyO1xuICAgICAgaWYgKGluc3RhbmNlSURCdWZmZXIgIT0gbnVsbCkge1xuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgaW5zdGFuY2VJREJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdGhpbmcgRWxlbWVudCBBcnJheSBCdWZmZXIgYXQgaW5kZXgnKTtcbiAgICAgIH1cbiAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KFZlcnRleEF0dHJpYnV0ZS5JbnN0YW5jZS5nZXRBdHRyaWJ1dGVTbG90KCkpO1xuICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgVmVydGV4QXR0cmlidXRlLkluc3RhbmNlLmdldEF0dHJpYnV0ZVNsb3QoKSxcbiAgICAgICAgQ29tcG9zaXRpb25UeXBlLlZlYzQuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCksXG4gICAgICAgIENvbXBvbmVudFR5cGUuRmxvYXQuaW5kZXgsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgdGhpcy5fX2dsdyEudmVydGV4QXR0cmliRGl2aXNvcihWZXJ0ZXhBdHRyaWJ1dGUuSW5zdGFuY2UuZ2V0QXR0cmlidXRlU2xvdCgpLCAxKTtcbiAgICB9XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gICAgdGhpcy5fX2dsdyEuYmluZFZlcnRleEFycmF5KG51bGwpO1xuXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgVGV4U3RvcmFnZTJEXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBwYXJhbTFcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZVRleFN0b3JhZ2UyRCh7XG4gICAgbGV2ZWxzLFxuICAgIGludGVybmFsRm9ybWF0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfToge1xuICAgIGxldmVsczogSW5kZXg7XG4gICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtIHwgUGl4ZWxGb3JtYXRFbnVtO1xuICAgIHdpZHRoOiBTaXplO1xuICAgIGhlaWdodDogU2l6ZTtcbiAgfSk6IFdlYkdMUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlISk7XG4gICAgZ2wudGV4U3RvcmFnZTJEKEdMX1RFWFRVUkVfMkQsIGxldmVscywgaW50ZXJuYWxGb3JtYXQuaW5kZXgsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSEpO1xuICAgIHRoaXMuX19nbHchLnVuYmluZFRleHR1cmUyRCgxNSk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGU7XG4gIH1cblxuICBjcmVhdGVUZXh0dXJlU2FtcGxlcih7XG4gICAgbWFnRmlsdGVyLFxuICAgIG1pbkZpbHRlcixcbiAgICB3cmFwUyxcbiAgICB3cmFwVCxcbiAgICB3cmFwUixcbiAgICBhbmlzb3Ryb3B5LFxuICAgIGlzUHJlbXVsdGlwbGllZEFscGhhLFxuICAgIHNoYWRvd0NvbXBhcmVNb2RlLFxuICB9OiB7XG4gICAgbWFnRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICBtaW5GaWx0ZXI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgIHdyYXBTOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICB3cmFwVDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgd3JhcFI6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgIGFuaXNvdHJvcHk6IGJvb2xlYW47XG4gICAgaXNQcmVtdWx0aXBsaWVkQWxwaGE/OiBib29sZWFuO1xuICAgIHNoYWRvd0NvbXBhcmVNb2RlOiBib29sZWFuO1xuICB9KSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcbiAgICBjb25zdCBzYW1wbGVyID0gZ2wuY3JlYXRlU2FtcGxlcigpITtcbiAgICBjb25zdCByZXNvdXJjZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKHNhbXBsZXIpO1xuICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyLmluZGV4KTtcbiAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX01BR19GSUxURVIsIG1hZ0ZpbHRlci5pbmRleCk7XG4gICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9XUkFQX1MsIHdyYXBTLmluZGV4KTtcbiAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfVCwgd3JhcFQuaW5kZXgpO1xuICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfV1JBUF9SLCB3cmFwUi5pbmRleCk7XG4gICAgaWYgKHNoYWRvd0NvbXBhcmVNb2RlKSB7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX0NPTVBBUkVfTU9ERSwgZ2wuQ09NUEFSRV9SRUZfVE9fVEVYVFVSRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX0NPTVBBUkVfRlVOQywgZ2wuTEVTUyk7XG4gICAgfVxuICAgIGlmIChhbmlzb3Ryb3B5KSB7XG4gICAgICBpZiAodGhpcy5fX2dsdyEud2ViZ2wyRXh0VEZBKSB7XG4gICAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIHRoaXMuX19nbHchLndlYmdsMkV4dFRGQSEuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIDQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIGNyZWF0ZU9yR2V0VGV4dHVyZVNhbXBsZXJDbGFtcFRvRWRnZUxpbmVhcigpIHtcbiAgICBpZiAodGhpcy5fX3NhbXBsZXJDbGFtcFRvRWRnZUxpbmVhclVpZCA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQpIHtcbiAgICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgICBjb25zdCBzYW1wbGVyID0gZ2wuY3JlYXRlU2FtcGxlcigpITtcbiAgICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2FtcGxlcik7XG4gICAgICB0aGlzLl9fc2FtcGxlckNsYW1wVG9FZGdlTGluZWFyVWlkID0gcmVzb3VyY2VIYW5kbGU7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19zYW1wbGVyQ2xhbXBUb0VkZ2VMaW5lYXJVaWQ7XG4gIH1cblxuICBjcmVhdGVPckdldFRleHR1cmVTYW1wbGVyQ2xhbXBUb0VkZ2VOZWFyZXN0KCkge1xuICAgIGlmICh0aGlzLl9fc2FtcGxlckNsYW1wVG9FZGdlTmVhcmVzdFVpZCA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQpIHtcbiAgICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgICBjb25zdCBzYW1wbGVyID0gZ2wuY3JlYXRlU2FtcGxlcigpITtcbiAgICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2FtcGxlcik7XG4gICAgICB0aGlzLl9fc2FtcGxlckNsYW1wVG9FZGdlTmVhcmVzdFVpZCA9IHJlc291cmNlSGFuZGxlO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19zYW1wbGVyQ2xhbXBUb0VkZ2VOZWFyZXN0VWlkO1xuICB9XG5cbiAgY3JlYXRlT3JHZXRUZXh0dXJlU2FtcGxlclJlcGVhdE5lYXJlc3QoKSB7XG4gICAgaWYgKHRoaXMuX19zYW1wbGVyUmVwZWF0TmVhcmVzdFVpZCA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQpIHtcbiAgICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgICBjb25zdCBzYW1wbGVyID0gZ2wuY3JlYXRlU2FtcGxlcigpITtcbiAgICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2FtcGxlcik7XG4gICAgICB0aGlzLl9fc2FtcGxlclJlcGVhdE5lYXJlc3RVaWQgPSByZXNvdXJjZUhhbmRsZTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLlJFUEVBVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfV1JBUF9SLCBnbC5SRVBFQVQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fc2FtcGxlclJlcGVhdE5lYXJlc3RVaWQ7XG4gIH1cblxuICBjcmVhdGVPckdldFRleHR1cmVTYW1wbGVyUmVwZWF0TGluZWFyKCkge1xuICAgIGlmICh0aGlzLl9fc2FtcGxlclJlcGVhdExpbmVhclVpZCA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQpIHtcbiAgICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgICBjb25zdCBzYW1wbGVyID0gZ2wuY3JlYXRlU2FtcGxlcigpITtcbiAgICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2FtcGxlcik7XG4gICAgICB0aGlzLl9fc2FtcGxlclJlcGVhdExpbmVhclVpZCA9IHJlc291cmNlSGFuZGxlO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLlJFUEVBVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfV1JBUF9SLCBnbC5SRVBFQVQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fc2FtcGxlclJlcGVhdExpbmVhclVpZDtcbiAgfVxuXG4gIGNyZWF0ZU9yR2V0VGV4dHVyZVNhbXBsZXJSZXBlYXRUcmlMaW5lYXIoKSB7XG4gICAgaWYgKHRoaXMuX19zYW1wbGVyUmVwZWF0VHJpTGluZWFyVWlkID09PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcbiAgICAgIGNvbnN0IHNhbXBsZXIgPSBnbC5jcmVhdGVTYW1wbGVyKCkhO1xuICAgICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZShzYW1wbGVyKTtcbiAgICAgIHRoaXMuX19zYW1wbGVyUmVwZWF0VHJpTGluZWFyVWlkID0gcmVzb3VyY2VIYW5kbGU7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5SRVBFQVQpO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLlJFUEVBVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUiwgZ2wuUkVQRUFUKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX3NhbXBsZXJSZXBlYXRUcmlMaW5lYXJVaWQ7XG4gIH1cblxuICBjcmVhdGVPckdldFRleHR1cmVTYW1wbGVyU2hhZG93KCkge1xuICAgIGlmICh0aGlzLl9fc2FtcGxlclNoYWRvd1VpZCA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQpIHtcbiAgICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgICBjb25zdCBzYW1wbGVyID0gZ2wuY3JlYXRlU2FtcGxlcigpITtcbiAgICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2FtcGxlcik7XG4gICAgICB0aGlzLl9fc2FtcGxlclNoYWRvd1VpZCA9IHJlc291cmNlSGFuZGxlO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX0NPTVBBUkVfTU9ERSwgZ2wuQ09NUEFSRV9SRUZfVE9fVEVYVFVSRSk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX0NPTVBBUkVfRlVOQywgZ2wuTEVTUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19zYW1wbGVyU2hhZG93VWlkO1xuICB9XG5cbiAgY3JlYXRlT3JHZXRUZXh0dXJlU2FtcGxlclJlcGVhdEFuaXNvdHJvcHlMaW5lYXIoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fX3NhbXBsZXJSZXBlYXRBbmlzb3Ryb3B5TGluZWFyVWlkID09PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZFxuICAgICkge1xuICAgICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcbiAgICAgIGNvbnN0IHNhbXBsZXIgPSBnbC5jcmVhdGVTYW1wbGVyKCkhO1xuICAgICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZShzYW1wbGVyKTtcbiAgICAgIHRoaXMuX19zYW1wbGVyUmVwZWF0QW5pc290cm9weUxpbmVhclVpZCA9IHJlc291cmNlSGFuZGxlO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuUkVQRUFUKTtcbiAgICAgIGdsLnNhbXBsZXJQYXJhbWV0ZXJpKHNhbXBsZXIsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5SRVBFQVQpO1xuICAgICAgZ2wuc2FtcGxlclBhcmFtZXRlcmkoc2FtcGxlciwgZ2wuVEVYVFVSRV9XUkFQX1IsIGdsLlJFUEVBVCk7XG4gICAgICBnbC5zYW1wbGVyUGFyYW1ldGVyaShzYW1wbGVyLCB0aGlzLl9fZ2x3IS53ZWJnbDJFeHRURkEhLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCA0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX3NhbXBsZXJSZXBlYXRBbmlzb3Ryb3B5TGluZWFyVWlkO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFRleHR1cmVcbiAgICogQHBhcmFtIGltYWdlRGF0YVxuICAgKiBAcGFyYW0gcGFyYW0xXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVUZXh0dXJlRnJvbUltYWdlQml0bWFwRGF0YShcbiAgICBpbWFnZURhdGE6IEltYWdlQml0bWFwRGF0YSxcbiAgICB7XG4gICAgICBsZXZlbCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBib3JkZXIsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgICAgZ2VuZXJhdGVNaXBtYXAsXG4gICAgfToge1xuICAgICAgbGV2ZWw6IEluZGV4O1xuICAgICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVGb3JtYXRFbnVtO1xuICAgICAgd2lkdGg6IFNpemU7XG4gICAgICBoZWlnaHQ6IFNpemU7XG4gICAgICBib3JkZXI6IFNpemU7XG4gICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0RW51bTtcbiAgICAgIHR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICAgICAgZ2VuZXJhdGVNaXBtYXA6IGJvb2xlYW47XG4gICAgfVxuICApOiBXZWJHTFJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuXG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKSBhcyBSbldlYkdMVGV4dHVyZTtcbiAgICBjb25zdCB0ZXh0dXJlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlKTtcbiAgICBjb25zdCBsZXZlbHMgPSBNYXRoLmZsb29yKE1hdGgubG9nMihNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSkpICsgMTtcbiAgICBnbC50ZXhTdG9yYWdlMkQoR0xfVEVYVFVSRV8yRCwgbGV2ZWxzLCBpbnRlcm5hbEZvcm1hdC5pbmRleCwgd2lkdGgsIGhlaWdodCk7XG4gICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBmb3JtYXQuaW5kZXgsIHR5cGUuaW5kZXgsIGltYWdlRGF0YSk7XG5cbiAgICB0aGlzLl9fY3JlYXRlVGV4dHVyZUlubmVyKGdsLCB3aWR0aCwgaGVpZ2h0LCBnZW5lcmF0ZU1pcG1hcCk7XG5cbiAgICByZXR1cm4gdGV4dHVyZUhhbmRsZTtcbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVUZXh0dXJlSW5uZXIoXG4gICAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBnZW5lcmF0ZU1pcG1hcDogYm9vbGVhblxuICApIHtcbiAgICAvLyBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCB3cmFwUy5pbmRleCk7XG4gICAgLy8gZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgd3JhcFQuaW5kZXgpO1xuICAgIC8vIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBtYWdGaWx0ZXIuaW5kZXgpO1xuICAgIC8vIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBtaW5GaWx0ZXIuaW5kZXgpO1xuICAgIC8vIGlmIChpc1ByZW11bHRpcGxpZWRBbHBoYSkge1xuICAgIC8vICAgLy8gZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGZhbHNlKTtcbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgLy8gZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRydWUpO1xuICAgIC8vIH1cbiAgICAvLyBpZiAoTWF0aFV0aWwuaXNQb3dlck9mVHdvVGV4dHVyZSh3aWR0aCwgaGVpZ2h0KSkge1xuICAgIC8vIGlmIChhbmlzb3Ryb3B5KSB7XG4gICAgLy8gICBpZiAodGhpcy5fX2dsdyEud2ViZ2wyRXh0VEZBKSB7XG4gICAgLy8gICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgdGhpcy5fX2dsdyEud2ViZ2wyRXh0VEZBIS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgNCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG5cbiAgICB0aGlzLl9fZ2x3IS51bmJpbmRUZXh0dXJlMkQoMTUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFRleHR1cmVcbiAgICogQHBhcmFtIGltYWdlRGF0YVxuICAgKiBAcGFyYW0gcGFyYW0xXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBjcmVhdGVUZXh0dXJlRnJvbUhUTUxJbWFnZUVsZW1lbnQoXG4gICAgaW1hZ2VEYXRhOiBIVE1MSW1hZ2VFbGVtZW50LFxuICAgIHtcbiAgICAgIGxldmVsLFxuICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGJvcmRlcixcbiAgICAgIGZvcm1hdCxcbiAgICAgIHR5cGUsXG4gICAgICBnZW5lcmF0ZU1pcG1hcCxcbiAgICB9OiB7XG4gICAgICBsZXZlbDogSW5kZXg7XG4gICAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgICB3aWR0aDogU2l6ZTtcbiAgICAgIGhlaWdodDogU2l6ZTtcbiAgICAgIGJvcmRlcjogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgICBnZW5lcmF0ZU1pcG1hcDogYm9vbGVhbjtcbiAgICB9XG4gICk6IFByb21pc2U8V2ViR0xSZXNvdXJjZUhhbmRsZT4ge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG5cbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpIGFzIFJuV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlKTtcbiAgICBjb25zdCBsZXZlbHMgPSBnZW5lcmF0ZU1pcG1hcCA/IE1hdGgubWF4KE1hdGgubG9nMih3aWR0aCksIE1hdGgubG9nMihoZWlnaHQpKSA6IDE7XG4gICAgZ2wudGV4U3RvcmFnZTJEKEdMX1RFWFRVUkVfMkQsIGxldmVscywgaW50ZXJuYWxGb3JtYXQuaW5kZXgsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZm9ybWF0LmluZGV4LCB0eXBlLmluZGV4LCBpbWFnZURhdGEpO1xuXG4gICAgdGhpcy5fX2NyZWF0ZVRleHR1cmVJbm5lcihnbCwgd2lkdGgsIGhlaWdodCwgZ2VuZXJhdGVNaXBtYXApO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIGFsbG9jYXRlIGEgVGV4dHVyZVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gdGhlIGludGVybmFsIGZvcm1hdCBvZiB0aGUgdGV4dHVyZVxuICAgKiBAcGFyYW0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIHRleHR1cmVcbiAgICogQHBhcmFtIGhlaWdodCAtIHRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmVcbiAgICogQHBhcmFtIG1pcG1hcENvdW50IC0gdGhlIG51bWJlciBvZiBtaXBtYXAgbGV2ZWxzXG4gICAqIEByZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIHRleHR1cmVcbiAgICovXG4gIGFsbG9jYXRlVGV4dHVyZSh7XG4gICAgZm9ybWF0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBtaXBMZXZlbENvdW50LFxuICB9OiB7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0RW51bTtcbiAgICB3aWR0aDogU2l6ZTtcbiAgICBoZWlnaHQ6IFNpemU7XG4gICAgbWlwTGV2ZWxDb3VudDogQ291bnQ7XG4gIH0pOiBXZWJHTFJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCkgYXMgUm5XZWJHTFRleHR1cmU7XG4gICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh0ZXh0dXJlKTtcblxuICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlMkQoMTUsIHRleHR1cmUpO1xuICAgIGdsLnRleFN0b3JhZ2UyRChHTF9URVhUVVJFXzJELCBtaXBMZXZlbENvdW50LCBmb3JtYXQuaW5kZXgsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuX19nbHchLnVuYmluZFRleHR1cmUyRCgxNSk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBpbWFnZSB0byBhIHNwZWNpZmljIG1pcCBsZXZlbCBvZiBhIHRleHR1cmVcbiAgICogQHBhcmFtIG1pcExldmVsIC0gdGhlIG1pcCBsZXZlbCB0byBsb2FkIHRoZSBpbWFnZSB0b1xuICAgKiBAcGFyYW0gdGV4dHVyZVVpZCAtIHRoZSBoYW5kbGUgb2YgdGhlIHRleHR1cmVcbiAgICogQHBhcmFtIGZvcm1hdCAtIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlXG4gICAqIEBwYXJhbSB0eXBlIC0gdGhlIHR5cGUgb2YgdGhlIGRhdGFcbiAgICogQHBhcmFtIHhPZmZzZXQgLSB0aGUgeCBvZmZzZXQgb2YgY29weSByZWdpb25cbiAgICogQHBhcmFtIHlPZmZzZXQgLSB0aGUgeSBvZmZzZXQgb2YgY29weSByZWdpb25cbiAgICogQHBhcmFtIHdpZHRoIC0gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZVxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2VcbiAgICogQHBhcmFtIGRhdGEgLSB0aGUgdHlwZWRhcnJheSBkYXRhIG9mIHRoZSBpbWFnZVxuICAgKi9cbiAgbG9hZEltYWdlVG9NaXBMZXZlbE9mVGV4dHVyZTJEKHtcbiAgICBtaXBMZXZlbCxcbiAgICB0ZXh0dXJlVWlkLFxuICAgIGZvcm1hdCxcbiAgICB0eXBlLFxuICAgIHhPZmZzZXQsXG4gICAgeU9mZnNldCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcm93U2l6ZUJ5UGl4ZWwsXG4gICAgZGF0YSxcbiAgfToge1xuICAgIG1pcExldmVsOiBJbmRleDtcbiAgICB0ZXh0dXJlVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlO1xuICAgIGZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG4gICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgeE9mZnNldDogbnVtYmVyO1xuICAgIHlPZmZzZXQ6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHJvd1NpemVCeVBpeGVsOiBudW1iZXI7XG4gICAgZGF0YTogVHlwZWRBcnJheTtcbiAgfSkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh0ZXh0dXJlVWlkKSBhcyBSbldlYkdMVGV4dHVyZTtcbiAgICBjb25zdCBwaXhlbEZvcm1hdCA9IFRleHR1cmVGb3JtYXQuZ2V0UGl4ZWxGb3JtYXRGcm9tVGV4dHVyZUZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IGNvbXBvc2l0aW9uTnVtID0gUGl4ZWxGb3JtYXQuZ2V0Q29tcG9zaXRpb25OdW1Gcm9tUGl4ZWxGb3JtYXQocGl4ZWxGb3JtYXQpO1xuXG4gICAgY29uc3QgcmVkdWNlZERhdGEgPSBuZXcgKGRhdGEuY29uc3RydWN0b3IgYXMgYW55KSh3aWR0aCAqIGhlaWdodCAqIGNvbXBvc2l0aW9uTnVtKTtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGNvbnN0IHNyY09mZnNldCA9IHkgKiByb3dTaXplQnlQaXhlbCAqIGNvbXBvc2l0aW9uTnVtO1xuICAgICAgY29uc3QgZGVzdE9mZnNldCA9IHkgKiB3aWR0aCAqIGNvbXBvc2l0aW9uTnVtO1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgIHJlZHVjZWREYXRhLnNldChcbiAgICAgICAgICBkYXRhLnN1YmFycmF5KHNyY09mZnNldCArIHggKiBjb21wb3NpdGlvbk51bSwgc3JjT2Zmc2V0ICsgKHggKyAxKSAqIGNvbXBvc2l0aW9uTnVtKSxcbiAgICAgICAgICBkZXN0T2Zmc2V0ICsgeCAqIGNvbXBvc2l0aW9uTnVtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fX2dsdyEuYmluZFRleHR1cmUyRCgxNSwgdGV4dHVyZSk7XG4gICAgZ2wudGV4U3ViSW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsXG4gICAgICBtaXBMZXZlbCxcbiAgICAgIHhPZmZzZXQsXG4gICAgICB5T2Zmc2V0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBwaXhlbEZvcm1hdC5pbmRleCxcbiAgICAgIHR5cGUuaW5kZXgsXG4gICAgICByZWR1Y2VkRGF0YVxuICAgICk7XG4gICAgdGhpcy5fX2dsdyEudW5iaW5kVGV4dHVyZTJEKDE1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBUZXh0dXJlIGZyb20gVHlwZWRBcnJheVxuICAgKiBAcGFyYW0gaW1hZ2VEYXRhXG4gICAqIEBwYXJhbSBwYXJhbTFcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZVRleHR1cmVGcm9tVHlwZWRBcnJheShcbiAgICBpbWFnZURhdGE6IFR5cGVkQXJyYXksXG4gICAge1xuICAgICAgbGV2ZWwsXG4gICAgICBpbnRlcm5hbEZvcm1hdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgYm9yZGVyLFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgIH06IHtcbiAgICAgIGxldmVsOiBJbmRleDtcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlRm9ybWF0RW51bTtcbiAgICAgIHdpZHRoOiBTaXplO1xuICAgICAgaGVpZ2h0OiBTaXplO1xuICAgICAgYm9yZGVyOiBTaXplO1xuICAgICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBib29sZWFuO1xuICAgIH1cbiAgKTogV2ViR0xSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpIGFzIFJuV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlKTtcbiAgICBjb25zdCBsZXZlbHMgPSBnZW5lcmF0ZU1pcG1hcCA/IE1hdGgubWF4KE1hdGgubG9nMih3aWR0aCksIE1hdGgubG9nMihoZWlnaHQpKSA6IDE7XG4gICAgZ2wudGV4U3RvcmFnZTJEKEdMX1RFWFRVUkVfMkQsIGxldmVscywgaW50ZXJuYWxGb3JtYXQuaW5kZXgsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGdsLnRleFN1YkltYWdlMkQoXG4gICAgICBnbC5URVhUVVJFXzJELFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBmb3JtYXQuaW5kZXgsXG4gICAgICB0eXBlLmluZGV4LFxuICAgICAgaW1hZ2VEYXRhIGFzIGFueSBhcyBBcnJheUJ1ZmZlclZpZXdcbiAgICApO1xuXG4gICAgdGhpcy5fX2NyZWF0ZVRleHR1cmVJbm5lcihnbCwgd2lkdGgsIGhlaWdodCwgZ2VuZXJhdGVNaXBtYXApO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgYmluZCBjb21wcmVzc2VkIHRleHR1cmUgb2JqZWN0XG4gICAqIEBwYXJhbSB0ZXh0dXJlRGF0YUFycmF5IHRyYW5zY29kZWQgdGV4dHVyZSBkYXRhIGZvciBlYWNoIG1pcG1hcHMobGV2ZWxzKVxuICAgKiBAcGFyYW0gY29tcHJlc3Npb25UZXh0dXJlVHlwZVxuICAgKi9cbiAgY3JlYXRlQ29tcHJlc3NlZFRleHR1cmUoXG4gICAgdGV4dHVyZURhdGFBcnJheTogVGV4dHVyZURhdGFbXSxcbiAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bVxuICApOiBXZWJHTFJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHQoKTtcblxuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCkgYXMgUm5XZWJHTFRleHR1cmU7XG4gICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh0ZXh0dXJlKTtcblxuICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlMkQoMTUsIHRleHR1cmUpO1xuXG4gICAgY29uc3QgaW50ZXJuYWxGb3JtYXQgPSBjb21wcmVzc2lvblRleHR1cmVUeXBlLmluZGV4O1xuXG4gICAgZm9yIChjb25zdCB0ZXh0dXJlRGF0YSBvZiB0ZXh0dXJlRGF0YUFycmF5KSB7XG4gICAgICBnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRChcbiAgICAgICAgZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgdGV4dHVyZURhdGEubGV2ZWwsXG4gICAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgICB0ZXh0dXJlRGF0YS53aWR0aCxcbiAgICAgICAgdGV4dHVyZURhdGEuaGVpZ2h0LFxuICAgICAgICAwLFxuICAgICAgICB0ZXh0dXJlRGF0YS5idWZmZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2dsdyEudW5iaW5kVGV4dHVyZTJEKDE1KTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgQ29tcHJlc3NlZFRleHR1cmVGcm9tQmFzaXNcbiAgICogQHBhcmFtIGJhc2lzRmlsZVxuICAgKiBAcGFyYW0gcGFyYW0xXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVDb21wcmVzc2VkVGV4dHVyZUZyb21CYXNpcyhcbiAgICBiYXNpc0ZpbGU6IEJhc2lzRmlsZSxcbiAgICB7XG4gICAgICBib3JkZXIsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgIH06IHtcbiAgICAgIGJvcmRlcjogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgfVxuICApOiBXZWJHTFJlc291cmNlSGFuZGxlIHtcbiAgICBsZXQgYmFzaXNDb21wcmVzc2lvblR5cGU6IEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bTtcbiAgICBsZXQgY29tcHJlc3Npb25UeXBlOiBJbmRleDtcblxuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCkgYXMgUm5XZWJHTFRleHR1cmU7XG4gICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh0ZXh0dXJlKTtcblxuICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlMkQoMTUsIHRleHR1cmUpO1xuXG4gICAgY29uc3QgczN0YyA9IGdsLmdldEV4dGVuc2lvbignV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnKTtcbiAgICBpZiAoczN0Yykge1xuICAgICAgYmFzaXNDb21wcmVzc2lvblR5cGUgPSBCYXNpc0NvbXByZXNzaW9uVHlwZS5CQzM7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSBzM3RjLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuICAgIH1cbiAgICBjb25zdCBldGMxID0gZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScpO1xuICAgIGlmIChldGMxKSB7XG4gICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSA9IEJhc2lzQ29tcHJlc3Npb25UeXBlLkVUQzE7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSBldGMxLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7XG4gICAgfVxuICAgIGNvbnN0IGF0YyA9IGdsLmdldEV4dGVuc2lvbignV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2F0YycpO1xuICAgIGlmIChhdGMpIHtcbiAgICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlID0gQmFzaXNDb21wcmVzc2lvblR5cGUuQVRDX1JHQkE7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSBhdGMuQ09NUFJFU1NFRF9SR0JBX0FUQ19JTlRFUlBPTEFURURfQUxQSEFfV0VCR0w7XG4gICAgfVxuICAgIGNvbnN0IGV0YzIgPSBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMnKTtcbiAgICBpZiAoZXRjMikge1xuICAgICAgYmFzaXNDb21wcmVzc2lvblR5cGUgPSBCYXNpc0NvbXByZXNzaW9uVHlwZS5FVEMyO1xuICAgICAgY29tcHJlc3Npb25UeXBlID0gZXRjMi5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDO1xuICAgIH1cbiAgICBjb25zdCBwdnJ0YyA9XG4gICAgICBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycpIHx8XG4gICAgICBnbC5nZXRFeHRlbnNpb24oJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnKTtcbiAgICBpZiAocHZydGMpIHtcbiAgICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlID0gQmFzaXNDb21wcmVzc2lvblR5cGUuUFZSVEMxX1JHQkE7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSBwdnJ0Yy5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztcbiAgICB9XG4gICAgY29uc3QgYXN0YyA9IGdsLmdldEV4dGVuc2lvbignV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnKTtcbiAgICBpZiAoYXN0Yykge1xuICAgICAgYmFzaXNDb21wcmVzc2lvblR5cGUgPSBCYXNpc0NvbXByZXNzaW9uVHlwZS5BU1RDO1xuICAgICAgY29tcHJlc3Npb25UeXBlID0gYXN0Yy5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO1xuICAgIH1cbiAgICBjb25zdCBtaXBtYXBEZXB0aCA9IGJhc2lzRmlsZS5nZXROdW1MZXZlbHMoMCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pcG1hcERlcHRoOyBpKyspIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gYmFzaXNGaWxlLmdldEltYWdlV2lkdGgoMCwgaSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBiYXNpc0ZpbGUuZ2V0SW1hZ2VIZWlnaHQoMCwgaSk7XG4gICAgICBjb25zdCB0ZXh0dXJlU291cmNlID0gdGhpcy5kZWNvZGVCYXNpc0ltYWdlKGJhc2lzRmlsZSwgYmFzaXNDb21wcmVzc2lvblR5cGUhLCAwLCBpKTtcbiAgICAgIGdsLmNvbXByZXNzZWRUZXhJbWFnZTJEKFxuICAgICAgICBnbC5URVhUVVJFXzJELFxuICAgICAgICBpLFxuICAgICAgICBjb21wcmVzc2lvblR5cGUhLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBib3JkZXIsXG4gICAgICAgIHRleHR1cmVTb3VyY2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fX2dsdyEudW5iaW5kVGV4dHVyZTJEKDE1KTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGUgdGhlIEJhc2lzSW1hZ2VcbiAgICogQHBhcmFtIGJhc2lzRmlsZVxuICAgKiBAcGFyYW0gYmFzaXNDb21wcmVzc2lvblR5cGVcbiAgICogQHBhcmFtIGltYWdlSW5kZXhcbiAgICogQHBhcmFtIGxldmVsSW5kZXhcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlQmFzaXNJbWFnZShcbiAgICBiYXNpc0ZpbGU6IEJhc2lzRmlsZSxcbiAgICBiYXNpc0NvbXByZXNzaW9uVHlwZTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtLFxuICAgIGltYWdlSW5kZXg6IEluZGV4LFxuICAgIGxldmVsSW5kZXg6IEluZGV4XG4gICkge1xuICAgIGNvbnN0IGV4dHJhY3RTaXplID0gYmFzaXNGaWxlLmdldEltYWdlVHJhbnNjb2RlZFNpemVJbkJ5dGVzKFxuICAgICAgaW1hZ2VJbmRleCxcbiAgICAgIGxldmVsSW5kZXgsXG4gICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSEuaW5kZXhcbiAgICApO1xuICAgIGNvbnN0IHRleHR1cmVTb3VyY2UgPSBuZXcgVWludDhBcnJheShleHRyYWN0U2l6ZSk7XG4gICAgaWYgKFxuICAgICAgIWJhc2lzRmlsZS50cmFuc2NvZGVJbWFnZShcbiAgICAgICAgdGV4dHVyZVNvdXJjZSxcbiAgICAgICAgaW1hZ2VJbmRleCxcbiAgICAgICAgbGV2ZWxJbmRleCxcbiAgICAgICAgYmFzaXNDb21wcmVzc2lvblR5cGUhLmluZGV4LFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICApXG4gICAgKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byB0cmFuc2NvZGUgdGhlIGltYWdlLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dHVyZVNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBGcmFtZUJ1ZmZlck9iamVjdFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgY3JlYXRlRnJhbWVCdWZmZXJPYmplY3QoKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgY29uc3QgZmJvID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICBjb25zdCByZXNvdXJjZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKGZibyEpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgQ29sb3JCdWZmZXIgdG8gdGhlIEZyYW1lQnVmZmVyT2JqZWN0XG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlciBhIEZyYW1lYnVmZmVyXG4gICAqIEBwYXJhbSByZW5kZXJhYmxlIGEgQ29sb3JCdWZmZXJcbiAgICovXG4gIGF0dGFjaENvbG9yQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdChcbiAgICBmcmFtZWJ1ZmZlcjogRnJhbWVCdWZmZXIsXG4gICAgaW5kZXg6IEluZGV4LFxuICAgIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlXG4gICkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgY29uc3QgZmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGZyYW1lYnVmZmVyLmZyYW1lYnVmZmVyVUlEKSEgYXMgV2ViR0xGcmFtZWJ1ZmZlcjtcblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZmJvKTtcblxuICAgIGNvbnN0IHJlbmRlcmFibGVXZWJHTFJlc291cmNlID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgcmVuZGVyYWJsZS5fdGV4dHVyZVJlc291cmNlVWlkXG4gICAgKSEgYXMgV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRJZCA9IHRoaXMuX19nbHchLmNvbG9yQXR0YWNobWVudChpbmRleCk7XG5cbiAgICBpZiAocmVuZGVyYWJsZSBpbnN0YW5jZW9mIFJlbmRlclRhcmdldFRleHR1cmUgJiYgcmVuZGVyYWJsZS5hcnJheUxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEl0J3MgbXVzdCBiZSBUZXh0dXJlQXJyYXkgZm9yIE11bHRpVmlldyBWUiBSZW5kZXJpbmdcbiAgICAgIChyZW5kZXJhYmxlIGFzIFJlbmRlclRhcmdldFRleHR1cmUpLl9mYm8gPSBmcmFtZWJ1ZmZlcjtcbiAgICAgIGlmICh0aGlzLl9fZ2x3IS53ZWJnbDJFeHRNTFRWSUVXIS5pc19tdWx0aXNhbXBsZSkge1xuICAgICAgICB0aGlzLl9fZ2x3IS53ZWJnbDJFeHRNTFRWSUVXIS5mcmFtZWJ1ZmZlclRleHR1cmVNdWx0aXNhbXBsZU11bHRpdmlld09WUihcbiAgICAgICAgICBnbC5EUkFXX0ZSQU1FQlVGRkVSLFxuICAgICAgICAgIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgICByZW5kZXJhYmxlV2ViR0xSZXNvdXJjZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDQsIC8vIHNhbXBsZSBjb3VudFxuICAgICAgICAgIDAsXG4gICAgICAgICAgcmVuZGVyYWJsZS5hcnJheUxlbmd0aFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fX2dsdyEud2ViZ2wyRXh0TUxUVklFVyEuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGl2aWV3T1ZSKFxuICAgICAgICAgIGdsLkRSQVdfRlJBTUVCVUZGRVIsXG4gICAgICAgICAgYXR0YWNobWVudElkLFxuICAgICAgICAgIHJlbmRlcmFibGVXZWJHTFJlc291cmNlLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICByZW5kZXJhYmxlLmFycmF5TGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZW5kZXJhYmxlIGluc3RhbmNlb2YgUmVuZGVyVGFyZ2V0VGV4dHVyZSAmJiByZW5kZXJhYmxlLmFycmF5TGVuZ3RoID09PSAwKSB7XG4gICAgICAocmVuZGVyYWJsZSBhcyBSZW5kZXJUYXJnZXRUZXh0dXJlKS5fZmJvID0gZnJhbWVidWZmZXI7XG4gICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgICAgZ2wuRlJBTUVCVUZGRVIsXG4gICAgICAgIGF0dGFjaG1lbnRJZCxcbiAgICAgICAgZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgcmVuZGVyYWJsZVdlYkdMUmVzb3VyY2UsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEl0J3MgbXVzdCBiZSBSZW5kZXJCdWZmZXJcbiAgICAgIChyZW5kZXJhYmxlIGFzIFJlbmRlckJ1ZmZlcikuX2ZibyA9IGZyYW1lYnVmZmVyO1xuICAgICAgZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoXG4gICAgICAgIGdsLkZSQU1FQlVGRkVSLFxuICAgICAgICBhdHRhY2htZW50SWQsXG4gICAgICAgIGdsLlJFTkRFUkJVRkZFUixcbiAgICAgICAgcmVuZGVyYWJsZVdlYkdMUmVzb3VyY2UgYXMgYW55IGFzIFdlYkdMUmVuZGVyYnVmZmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogYXR0YWNoIHRoZSBDb2xvckJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRJbmRleCBhIGF0dGFjaG1lbnQgaW5kZXhcbiAgICogQHBhcmFtIGZhY2VJbmRleCBhIGZhY2UgaW5kZXhcbiAgICogQHBhcmFtIG1pcExldmVsIGEgbWlwIGxldmVsXG4gICAqIEBwYXJhbSByZW5kZXJhYmxlIGEgQ29sb3JCdWZmZXJcbiAgICovXG4gIGF0dGFjaENvbG9yQnVmZmVyQ3ViZVRvRnJhbWVCdWZmZXJPYmplY3QoXG4gICAgZnJhbWVidWZmZXI6IEZyYW1lQnVmZmVyLFxuICAgIGF0dGFjaG1lbnRJbmRleDogSW5kZXgsXG4gICAgZmFjZUluZGV4OiBJbmRleCxcbiAgICBtaXBMZXZlbDogSW5kZXgsXG4gICAgcmVuZGVyYWJsZTogSVJlbmRlcmFibGVcbiAgKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcbiAgICBjb25zdCBmYm8gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UoZnJhbWVidWZmZXIuZnJhbWVidWZmZXJVSUQpISBhcyBXZWJHTEZyYW1lYnVmZmVyO1xuXG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmYm8pO1xuXG4gICAgY29uc3QgcmVuZGVyYWJsZVdlYkdMUmVzb3VyY2UgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UoXG4gICAgICByZW5kZXJhYmxlLl90ZXh0dXJlUmVzb3VyY2VVaWRcbiAgICApISBhcyBXZWJHTFRleHR1cmU7XG4gICAgY29uc3QgYXR0YWNobWVudElkID0gdGhpcy5fX2dsdyEuY29sb3JBdHRhY2htZW50KGF0dGFjaG1lbnRJbmRleCk7XG5cbiAgICAocmVuZGVyYWJsZSBhcyBSZW5kZXJCdWZmZXIpLl9mYm8gPSBmcmFtZWJ1ZmZlcjtcbiAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgIGdsLkZSQU1FQlVGRkVSLFxuICAgICAgYXR0YWNobWVudElkLFxuICAgICAgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgZmFjZUluZGV4LFxuICAgICAgcmVuZGVyYWJsZVdlYkdMUmVzb3VyY2UsXG4gICAgICBtaXBMZXZlbFxuICAgICk7XG5cbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICB9XG4gIC8qKlxuICAgKiBhdHRhY2ggdGhlIERlcHRoQnVmZmVyIHRvIHRoZSBGcmFtZUJ1ZmZlck9iamVjdFxuICAgKiBAcGFyYW0gZnJhbWVidWZmZXIgYSBGcmFtZWJ1ZmZlclxuICAgKiBAcGFyYW0gcmVuZGVyYWJsZSBhIERlcHRoQnVmZmVyXG4gICAqL1xuICBhdHRhY2hEZXB0aEJ1ZmZlclRvRnJhbWVCdWZmZXJPYmplY3QoZnJhbWVidWZmZXI6IEZyYW1lQnVmZmVyLCByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZSkge1xuICAgIHRoaXMuX19hdHRhY2hEZXB0aE9yU3RlbmNpbEJ1ZmZlclRvRnJhbWVCdWZmZXJPYmplY3QoZnJhbWVidWZmZXIsIHJlbmRlcmFibGUsIDM2MDk2KTsgLy8gZ2wuREVQVEhfQVRUQUNITUVOVFxuICB9XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgU3RlbmNpbEJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBTdGVuY2lsQnVmZmVyXG4gICAqL1xuICBhdHRhY2hTdGVuY2lsQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdChmcmFtZWJ1ZmZlcjogRnJhbWVCdWZmZXIsIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlKSB7XG4gICAgdGhpcy5fX2F0dGFjaERlcHRoT3JTdGVuY2lsQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdChmcmFtZWJ1ZmZlciwgcmVuZGVyYWJsZSwgMzYxMjgpOyAvLyBnbC5TVEVOQ0lMX0FUVEFDSE1FTlRcbiAgfVxuXG4gIC8qKlxuICAgKiBhdHRhY2ggdGhlIGRlcHRoU3RlbmNpbEJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBkZXB0aFN0ZW5jaWxCdWZmZXJcbiAgICovXG4gIGF0dGFjaERlcHRoU3RlbmNpbEJ1ZmZlclRvRnJhbWVCdWZmZXJPYmplY3QoZnJhbWVidWZmZXI6IEZyYW1lQnVmZmVyLCByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZSkge1xuICAgIHRoaXMuX19hdHRhY2hEZXB0aE9yU3RlbmNpbEJ1ZmZlclRvRnJhbWVCdWZmZXJPYmplY3QoZnJhbWVidWZmZXIsIHJlbmRlcmFibGUsIDMzMzA2KTsgLy8gZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UXG4gIH1cblxuICBwcml2YXRlIF9fYXR0YWNoRGVwdGhPclN0ZW5jaWxCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KFxuICAgIGZyYW1lYnVmZmVyOiBGcmFtZUJ1ZmZlcixcbiAgICByZW5kZXJhYmxlOiBJUmVuZGVyYWJsZSxcbiAgICBhdHRhY2htZW50VHlwZTogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgY29uc3QgZmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGZyYW1lYnVmZmVyLmZyYW1lYnVmZmVyVUlEKSEgYXMgV2ViR0xGcmFtZWJ1ZmZlcjtcblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZmJvKTtcblxuICAgIGNvbnN0IHJlbmRlcmFibGVXZWJHTFJlc291cmNlID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgcmVuZGVyYWJsZS5fdGV4dHVyZVJlc291cmNlVWlkXG4gICAgKSEgYXMgV2ViR0xUZXh0dXJlO1xuXG4gICAgaWYgKHJlbmRlcmFibGUgaW5zdGFuY2VvZiBSZW5kZXJUYXJnZXRUZXh0dXJlICYmIHJlbmRlcmFibGUuYXJyYXlMZW5ndGggPiAwKSB7XG4gICAgICAvLyBJdCdzIG11c3QgYmUgVGV4dHVyZUFycmF5IGZvciBNdWx0aVZpZXcgVlIgUmVuZGVyaW5nXG4gICAgICAocmVuZGVyYWJsZSBhcyBSZW5kZXJUYXJnZXRUZXh0dXJlKS5fZmJvID0gZnJhbWVidWZmZXI7XG4gICAgICBpZiAodGhpcy5fX2dsdyEud2ViZ2wyRXh0TUxUVklFVyEuaXNfbXVsdGlzYW1wbGUpIHtcbiAgICAgICAgdGhpcy5fX2dsdyEud2ViZ2wyRXh0TUxUVklFVyEuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGlzYW1wbGVNdWx0aXZpZXdPVlIoXG4gICAgICAgICAgZ2wuRFJBV19GUkFNRUJVRkZFUixcbiAgICAgICAgICBhdHRhY2htZW50VHlwZSxcbiAgICAgICAgICByZW5kZXJhYmxlV2ViR0xSZXNvdXJjZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDQsIC8vIHNhbXBsZSBjb3VudFxuICAgICAgICAgIDAsXG4gICAgICAgICAgcmVuZGVyYWJsZS5hcnJheUxlbmd0aFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fX2dsdyEud2ViZ2wyRXh0TUxUVklFVyEuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGl2aWV3T1ZSKFxuICAgICAgICAgIGdsLkRSQVdfRlJBTUVCVUZGRVIsXG4gICAgICAgICAgYXR0YWNobWVudFR5cGUsXG4gICAgICAgICAgcmVuZGVyYWJsZVdlYkdMUmVzb3VyY2UsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHJlbmRlcmFibGUuYXJyYXlMZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlbmRlcmFibGUgaW5zdGFuY2VvZiBSZW5kZXJUYXJnZXRUZXh0dXJlICYmIHJlbmRlcmFibGUuYXJyYXlMZW5ndGggPT09IDApIHtcbiAgICAgIChyZW5kZXJhYmxlIGFzIFJlbmRlclRhcmdldFRleHR1cmUpLl9mYm8gPSBmcmFtZWJ1ZmZlcjtcbiAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgICBnbC5GUkFNRUJVRkZFUixcbiAgICAgICAgYXR0YWNobWVudFR5cGUsXG4gICAgICAgIGdsLlRFWFRVUkVfMkQsXG4gICAgICAgIHJlbmRlcmFibGVXZWJHTFJlc291cmNlLFxuICAgICAgICAwXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJdCdzIG11c3QgYmUgUmVuZGVyQnVmZmVyXG4gICAgICAocmVuZGVyYWJsZSBhcyBSZW5kZXJCdWZmZXIpLl9mYm8gPSBmcmFtZWJ1ZmZlcjtcbiAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKFxuICAgICAgICBnbC5GUkFNRUJVRkZFUixcbiAgICAgICAgYXR0YWNobWVudFR5cGUsXG4gICAgICAgIGdsLlJFTkRFUkJVRkZFUixcbiAgICAgICAgcmVuZGVyYWJsZVdlYkdMUmVzb3VyY2UgYXMgYW55IGFzIFdlYkdMUmVuZGVyYnVmZmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIFJlbmRlcmJ1ZmZlclxuICAgKi9cbiAgY3JlYXRlUmVuZGVyQnVmZmVyKFxuICAgIHdpZHRoOiBTaXplLFxuICAgIGhlaWdodDogU2l6ZSxcbiAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW0sXG4gICAgaXNNU0FBOiBib29sZWFuLFxuICAgIHNhbXBsZUNvdW50TVNBQTogQ291bnRcbiAgKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgY29uc3QgcmVuZGVyQnVmZmVyID0gZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG4gICAgY29uc3QgcmVzb3VyY2VIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZShyZW5kZXJCdWZmZXIhKTtcblxuICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJCdWZmZXIpO1xuICAgIGlmIChpc01TQUEpIHtcbiAgICAgIChnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KS5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoXG4gICAgICAgIGdsLlJFTkRFUkJVRkZFUixcbiAgICAgICAgc2FtcGxlQ291bnRNU0FBLFxuICAgICAgICAoZ2wgYXMgYW55KVtpbnRlcm5hbEZvcm1hdC5zdHJdLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKGdsLlJFTkRFUkJVRkZFUiwgKGdsIGFzIGFueSlbaW50ZXJuYWxGb3JtYXQuc3RyXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCBudWxsKTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgZHJhd1RhcmdldHNcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyXG4gICAqL1xuICBzZXREcmF3VGFyZ2V0cyhyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gICAgY29uc3QgZnJhbWVidWZmZXIgPSByZW5kZXJQYXNzLmdldEZyYW1lYnVmZmVyKCk7XG4gICAgaWYgKGZyYW1lYnVmZmVyKSB7XG4gICAgICBjb25zdCByZW5kZXJCdWZmZXJUYXJnZXRFbnVtcyA9IHJlbmRlclBhc3MuZ2V0UmVuZGVyVGFyZ2V0Q29sb3JBdHRhY2htZW50cygpO1xuICAgICAgaWYgKElzLmV4aXN0KHJlbmRlckJ1ZmZlclRhcmdldEVudW1zKSkge1xuICAgICAgICB0aGlzLl9fZ2x3IS5kcmF3QnVmZmVycyhyZW5kZXJCdWZmZXJUYXJnZXRFbnVtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fZ2x3IS5kcmF3QnVmZmVycyhmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzUmVuZGVyQnVmZmVyVGFyZ2V0cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19nbHchLmRyYXdCdWZmZXJzKFtSZW5kZXJCdWZmZXJUYXJnZXQuQmFja10pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiaW5kIEZyYW1lYnVmZmVyXG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlclxuICAgKi9cbiAgYmluZEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyPzogRnJhbWVCdWZmZXIpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHQoKTtcbiAgICBpZiAoZnJhbWVidWZmZXIpIHtcbiAgICAgIGNvbnN0IGZib1VpZCA9IGZyYW1lYnVmZmVyLmNnQXBpUmVzb3VyY2VVaWQ7XG4gICAgICBjb25zdCBmYm8gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UoZmJvVWlkKSBhcyBXZWJHTEZyYW1lYnVmZmVyO1xuICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmYm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB1bmJpbmQgRnJhbWVidWZmZXJcbiAgICovXG4gIHVuYmluZEZyYW1lYnVmZmVyKCkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgUmVuZGVyVGFyZ2V0VGV4dHVyZVxuICAgKiBAcGFyYW0gcGFyYW0wXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlKHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbWlwTGV2ZWxDb3VudCxcbiAgICBmb3JtYXQsXG4gIH06IHtcbiAgICB3aWR0aDogU2l6ZTtcbiAgICBoZWlnaHQ6IFNpemU7XG4gICAgbWlwTGV2ZWxDb3VudDogQ291bnQ7XG4gICAgZm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgfSkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG5cbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpIGFzIFJuV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlKTtcblxuICAgIGdsLnRleFN0b3JhZ2UyRChnbC5URVhUVVJFXzJELCBtaXBMZXZlbENvdW50LCBmb3JtYXQuaW5kZXgsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgdGhpcy5fX2dsdyEudW5iaW5kVGV4dHVyZTJEKDE1KTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBSZW5kZXJUYXJnZXRUZXh0dXJlQXJyYXlcbiAgICogQHBhcmFtIHBhcmFtMFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgY3JlYXRlUmVuZGVyVGFyZ2V0VGV4dHVyZUFycmF5KHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbGV2ZWwsXG4gICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgZm9ybWF0LFxuICAgIHR5cGUsXG4gICAgYXJyYXlMZW5ndGgsXG4gIH06IHtcbiAgICB3aWR0aDogU2l6ZTtcbiAgICBoZWlnaHQ6IFNpemU7XG4gICAgbGV2ZWw6IEluZGV4O1xuICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0RW51bTtcbiAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICBhcnJheUxlbmd0aDogQ291bnQ7XG4gIH0pOiBXZWJHTFJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuXG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKSBhcyBSbldlYkdMVGV4dHVyZTtcbiAgICBjb25zdCByZXNvdXJjZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKHRleHR1cmUpO1xuXG4gICAgdGhpcy5fX2dsdyEuYmluZFRleHR1cmUyREFycmF5KDE1LCB0ZXh0dXJlKTtcbiAgICBnbC50ZXhTdG9yYWdlM0QoZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMSwgaW50ZXJuYWxGb3JtYXQuaW5kZXgsIHdpZHRoLCBoZWlnaHQsIGFycmF5TGVuZ3RoKTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZVxuICAgKiBAcGFyYW0gcGFyYW0wXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIG1pcExldmVsQ291bnQsXG4gICAgZm9ybWF0LFxuICB9OiB7XG4gICAgd2lkdGg6IFNpemU7XG4gICAgaGVpZ2h0OiBTaXplO1xuICAgIG1pcExldmVsQ291bnQ6IFNpemU7XG4gICAgZm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgfSkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG5cbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpIGFzIFJuV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZUN1YmUoMTUsIHRleHR1cmUpO1xuXG4gICAgZ2wudGV4U3RvcmFnZTJEKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIG1pcExldmVsQ291bnQsIGZvcm1hdC5pbmRleCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICB0aGlzLl9fZ2x3IS51bmJpbmRUZXh0dXJlQ3ViZSgxNSk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGU7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgQ3ViZVRleHR1cmVcbiAgICpcbiAgICogQHBhcmFtIG1pcExldmVsQ291bnRcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gd2lkdGhcbiAgICogQHBhcmFtIGhlaWdodFxuICAgKiBAcmV0dXJucyByZXNvdXJjZSBoYW5kbGVcbiAgICovXG4gIGNyZWF0ZUN1YmVUZXh0dXJlKFxuICAgIG1pcExldmVsQ291bnQ6IENvdW50LFxuICAgIGltYWdlczogQXJyYXk8e1xuICAgICAgcG9zWDogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBuZWdYOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgIHBvc1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgbmVnWTogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBwb3NaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgIG5lZ1o6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgIH0+LFxuICAgIHdpZHRoOiBTaXplLFxuICAgIGhlaWdodDogU2l6ZVxuICApOiBbbnVtYmVyLCBTYW1wbGVyXSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpIGFzIFJuV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZUN1YmUoMTUsIHRleHR1cmUpO1xuXG4gICAgY29uc3Qgd3JhcFMgPSBUZXh0dXJlUGFyYW1ldGVyLkNsYW1wVG9FZGdlO1xuICAgIGNvbnN0IHdyYXBUID0gVGV4dHVyZVBhcmFtZXRlci5DbGFtcFRvRWRnZTtcbiAgICBsZXQgbWluRmlsdGVyID0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXI7XG4gICAgbGV0IG1hZ0ZpbHRlciA9IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyO1xuICAgIGlmIChcbiAgICAgIChpbWFnZXNbMF0ucG9zWCBhcyBhbnkpLmhkcmlGb3JtYXQgPT09IEhkcmlGb3JtYXQuSERSX0xJTkVBUiAmJlxuICAgICAgdGhpcy5fX2dsdyEuaXNOb3RTdXBwb3J0V2ViR0wxRXh0ZW5zaW9uKFdlYkdMRXh0ZW5zaW9uLlRleHR1cmVGbG9hdExpbmVhcilcbiAgICApIHtcbiAgICAgIGlmIChtaXBMZXZlbENvdW50ID49IDIpIHtcbiAgICAgICAgbWluRmlsdGVyID0gVGV4dHVyZVBhcmFtZXRlci5OZWFyZXN0TWlwbWFwTmVhcmVzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbkZpbHRlciA9IFRleHR1cmVQYXJhbWV0ZXIuTmVhcmVzdDtcbiAgICAgIH1cbiAgICAgIG1hZ0ZpbHRlciA9IFRleHR1cmVQYXJhbWV0ZXIuTmVhcmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1pcExldmVsQ291bnQgPj0gMikge1xuICAgICAgICBtaW5GaWx0ZXIgPSBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhck1pcG1hcExpbmVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbkZpbHRlciA9IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyO1xuICAgICAgfVxuICAgICAgbWFnRmlsdGVyID0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXI7XG4gICAgfVxuXG4gICAgY29uc3Qgc2FtcGxlciA9IG5ldyBTYW1wbGVyKHsgd3JhcFMsIHdyYXBULCBtaW5GaWx0ZXIsIG1hZ0ZpbHRlciB9KTtcbiAgICBzYW1wbGVyLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgbG9hZEltYWdlVG9HUFUgPSAoaW1hZ2U6IERpcmVjdFRleHR1cmVEYXRhLCBjdWJlTWFwU2lkZTogbnVtYmVyLCBpOiBJbmRleCkgPT4ge1xuICAgICAgaWYgKChpbWFnZSBhcyBhbnkpLmhkcmlGb3JtYXQgPT09IEhkcmlGb3JtYXQuSERSX0xJTkVBUikge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICAgIGN1YmVNYXBTaWRlLFxuICAgICAgICAgIGksXG4gICAgICAgICAgZ2wuUkdCMzJGLFxuICAgICAgICAgIChpbWFnZSBhcyBhbnkpLndpZHRoLFxuICAgICAgICAgIChpbWFnZSBhcyBhbnkpLmhlaWdodCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGdsLlJHQixcbiAgICAgICAgICBnbC5GTE9BVCxcbiAgICAgICAgICAoaW1hZ2UgYXMgYW55KS5kYXRhRmxvYXRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgZ2wudGV4SW1hZ2UyRChjdWJlTWFwU2lkZSwgaSwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICBjdWJlTWFwU2lkZSxcbiAgICAgICAgICBpLFxuICAgICAgICAgIGdsLlJHQkEsXG4gICAgICAgICAgd2lkdGggLyAyICoqIGksXG4gICAgICAgICAgaGVpZ2h0IC8gMiAqKiBpLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgZ2wuUkdCQSxcbiAgICAgICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICAgIGltYWdlIGFzIEFycmF5QnVmZmVyVmlld1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW1hZ2UgPSBpbWFnZXNbaV07XG4gICAgICBsb2FkSW1hZ2VUb0dQVShpbWFnZS5wb3NYLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsIGkpO1xuICAgICAgbG9hZEltYWdlVG9HUFUoaW1hZ2UubmVnWCwgZ2wuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YLCBpKTtcbiAgICAgIGxvYWRJbWFnZVRvR1BVKGltYWdlLnBvc1ksIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSwgaSk7XG4gICAgICBsb2FkSW1hZ2VUb0dQVShpbWFnZS5uZWdZLCBnbC5URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ksIGkpO1xuICAgICAgbG9hZEltYWdlVG9HUFUoaW1hZ2UucG9zWiwgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aLCBpKTtcbiAgICAgIGxvYWRJbWFnZVRvR1BVKGltYWdlLm5lZ1osIGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiwgaSk7XG4gICAgfVxuICAgIHRoaXMuX19nbHchLnVuYmluZFRleHR1cmVDdWJlKDE1KTtcblxuICAgIHJldHVybiBbcmVzb3VyY2VIYW5kbGUsIHNhbXBsZXJdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBDdWJlIFRleHR1cmUgZnJvbSBpbWFnZSBmaWxlcy5cbiAgICogQHBhcmFtIGJhc2VVcmkgdGhlIGJhc2UgdXJpIHRvIGxvYWQgaW1hZ2VzO1xuICAgKiBAcGFyYW0gbWlwTGV2ZWxDb3VudCB0aGUgbnVtYmVyIG9mIG1pcCBsZXZlbHMgKGluY2x1ZGUgcm9vdCBsZXZlbCkuIGlmIG5vIG1pcG1hcCwgdGhlIHZhbHVlIHNob3VsZCBiZSAxO1xuICAgKiBAcmV0dXJucyB0aGUgV2ViR0xSZXNvdXJjZUhhbmRsZSBmb3IgdGhlIGdlbmVyYXRlZCBDdWJlIFRleHR1cmVcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUN1YmVUZXh0dXJlRnJvbUZpbGVzKFxuICAgIGJhc2VVcmk6IHN0cmluZyxcbiAgICBtaXBMZXZlbENvdW50OiBDb3VudCxcbiAgICBpc05hbWVQb3NOZWc6IGJvb2xlYW4sXG4gICAgaGRyaUZvcm1hdDogSGRyaUZvcm1hdEVudW1cbiAgKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBjb25zdCBpbWFnZUFyZ3M6IEFycmF5PHtcbiAgICAgIHBvc1g6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgbmVnWDogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBwb3NZOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgIG5lZ1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgcG9zWjogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBuZWdaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICB9PiA9IFtdO1xuICAgIGxldCB3aWR0aCA9IDA7XG4gICAgbGV0IGhlaWdodCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaXBMZXZlbENvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGxvYWRPbmVMZXZlbCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnRbXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGxldCBsb2FkZWRDb3VudCA9IDA7XG4gICAgICAgICAgY29uc3QgaW1hZ2VzOiBIVE1MSW1hZ2VFbGVtZW50W10gPSBbXTtcbiAgICAgICAgICBsZXQgZXh0ZW5zaW9uID0gJy5qcGcnO1xuICAgICAgICAgIGlmIChoZHJpRm9ybWF0ID09PSBIZHJpRm9ybWF0LkhEUl9MSU5FQVIpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9ICcuaGRyJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGhkcmlGb3JtYXQgPT09IEhkcmlGb3JtYXQuUkdCRV9QTkcpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9ICcuUkdCRS5QTkcnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBwb3NYID0gJ19yaWdodF8nO1xuICAgICAgICAgIGxldCBuZWdYID0gJ19sZWZ0Xyc7XG4gICAgICAgICAgbGV0IHBvc1kgPSAnX3RvcF8nO1xuICAgICAgICAgIGxldCBuZWdZID0gJ19ib3R0b21fJztcbiAgICAgICAgICBsZXQgcG9zWiA9ICdfZnJvbnRfJztcbiAgICAgICAgICBsZXQgbmVnWiA9ICdfYmFja18nO1xuICAgICAgICAgIGlmIChpc05hbWVQb3NOZWcpIHtcbiAgICAgICAgICAgIHBvc1ggPSAnX3Bvc3hfJztcbiAgICAgICAgICAgIG5lZ1ggPSAnX25lZ3hfJztcbiAgICAgICAgICAgIHBvc1kgPSAnX3Bvc3lfJztcbiAgICAgICAgICAgIG5lZ1kgPSAnX25lZ3lfJztcbiAgICAgICAgICAgIHBvc1ogPSAnX3Bvc3pfJztcbiAgICAgICAgICAgIG5lZ1ogPSAnX25lZ3pfJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmYWNlcyA9IFtcbiAgICAgICAgICAgIFtiYXNlVXJpICsgcG9zWCArIGkgKyBleHRlbnNpb24sIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF0sXG4gICAgICAgICAgICBbYmFzZVVyaSArIG5lZ1ggKyBpICsgZXh0ZW5zaW9uLCBnbC5URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hdLFxuICAgICAgICAgICAgW2Jhc2VVcmkgKyBwb3NZICsgaSArIGV4dGVuc2lvbiwgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZXSxcbiAgICAgICAgICAgIFtiYXNlVXJpICsgbmVnWSArIGkgKyBleHRlbnNpb24sIGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV0sXG4gICAgICAgICAgICBbYmFzZVVyaSArIHBvc1ogKyBpICsgZXh0ZW5zaW9uLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pdLFxuICAgICAgICAgICAgW2Jhc2VVcmkgKyBuZWdaICsgaSArIGV4dGVuc2lvbiwgZ2wuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aXSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmFjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZhY2UgPSBmYWNlc1tqXVsxXTtcbiAgICAgICAgICAgIGxldCBpbWFnZTogYW55O1xuICAgICAgICAgICAgaWYgKGhkcmlGb3JtYXQgPT09IEhkcmlGb3JtYXQuSERSX0xJTkVBUiB8fCBoZHJpRm9ybWF0ID09PSBIZHJpRm9ybWF0LlJHQjlfRTVfUE5HKSB7XG4gICAgICAgICAgICAgIGltYWdlID0gbmV3IEhEUkltYWdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW1hZ2UuaGRyaUZvcm1hdCA9IGhkcmlGb3JtYXQ7XG5cbiAgICAgICAgICAgIChpbWFnZSBhcyBhbnkpLnNpZGUgPSBmYWNlO1xuICAgICAgICAgICAgKGltYWdlIGFzIGFueSkudXJpID0gZmFjZXNbal1bMF07XG4gICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XG4gICAgICAgICAgICAgIGlmIChsb2FkZWRDb3VudCA9PT0gNikge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoaW1hZ2VzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdCgoaW1hZ2UgYXMgYW55KS51cmkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IGZhY2VzW2pdWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBsZXQgaW1hZ2VzOiBIVE1MSW1hZ2VFbGVtZW50W107XG4gICAgICB0cnkge1xuICAgICAgICBpbWFnZXMgPSBhd2FpdCBsb2FkT25lTGV2ZWwoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gVHJ5IGFnYWluIG9uY2VcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbWFnZXMgPSBhd2FpdCBsb2FkT25lTGV2ZWwoKTtcbiAgICAgICAgfSBjYXRjaCAodXJpKSB7XG4gICAgICAgICAgLy8gR2l2ZSB1cFxuICAgICAgICAgIExvZ2dlci5lcnJvcihgZmFpbGVkIHRvIGxvYWQgJHt1cml9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGltYWdlT2JqOiB7XG4gICAgICAgIHBvc1g/OiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgbmVnWD86IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICBwb3NZPzogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICAgIG5lZ1k/OiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgcG9zWj86IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICBuZWdaPzogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICB9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcyEpIHtcbiAgICAgICAgc3dpdGNoICgoaW1hZ2UgYXMgYW55KS5zaWRlKSB7XG4gICAgICAgICAgY2FzZSBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6XG4gICAgICAgICAgICBpbWFnZU9iai5wb3NYID0gaW1hZ2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTpcbiAgICAgICAgICAgIGltYWdlT2JqLnBvc1kgPSBpbWFnZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOlxuICAgICAgICAgICAgaW1hZ2VPYmoucG9zWiA9IGltYWdlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBnbC5URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1g6XG4gICAgICAgICAgICBpbWFnZU9iai5uZWdYID0gaW1hZ2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWTpcbiAgICAgICAgICAgIGltYWdlT2JqLm5lZ1kgPSBpbWFnZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZ2wuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aOlxuICAgICAgICAgICAgaW1hZ2VPYmoubmVnWiA9IGltYWdlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICB3aWR0aCA9IGltYWdlLndpZHRoO1xuICAgICAgICAgIGhlaWdodCA9IGltYWdlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW1hZ2VBcmdzLnB1c2goXG4gICAgICAgIGltYWdlT2JqIGFzIHtcbiAgICAgICAgICBwb3NYOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgICBuZWdYOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgICBwb3NZOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgICBuZWdZOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgICBwb3NaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgICBuZWdaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDdWJlVGV4dHVyZShtaXBMZXZlbENvdW50LCBpbWFnZUFyZ3MsIHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgY3JlYXRlQ3ViZVRleHR1cmVGcm9tQmFzaXMoXG4gICAgYmFzaXNGaWxlOiBCYXNpc0ZpbGUsXG4gICAge1xuICAgICAgbWFnRmlsdGVyID0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXIsXG4gICAgICBtaW5GaWx0ZXIgPSBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhck1pcG1hcExpbmVhcixcbiAgICAgIHdyYXBTID0gVGV4dHVyZVBhcmFtZXRlci5SZXBlYXQsXG4gICAgICB3cmFwVCA9IFRleHR1cmVQYXJhbWV0ZXIuUmVwZWF0LFxuICAgICAgYm9yZGVyID0gMCxcbiAgICB9XG4gICkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGxldCBiYXNpc0NvbXByZXNzaW9uVHlwZTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtO1xuICAgIGxldCBjb21wcmVzc2lvblR5cGU6IEluZGV4O1xuXG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKSBhcyBSbldlYkdMVGV4dHVyZTtcbiAgICBjb25zdCByZXNvdXJjZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKHRleHR1cmUpO1xuXG4gICAgdGhpcy5fX2dsdyEuYmluZFRleHR1cmVDdWJlKDE1LCB0ZXh0dXJlKTtcblxuICAgIGNvbnN0IHMzdGMgPSBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyk7XG4gICAgaWYgKHMzdGMpIHtcbiAgICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlID0gQmFzaXNDb21wcmVzc2lvblR5cGUuQkMzO1xuICAgICAgY29tcHJlc3Npb25UeXBlID0gczN0Yy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDtcbiAgICB9XG4gICAgY29uc3QgZXRjMSA9IGdsLmdldEV4dGVuc2lvbignV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnKTtcbiAgICBpZiAoZXRjMSkge1xuICAgICAgYmFzaXNDb21wcmVzc2lvblR5cGUgPSBCYXNpc0NvbXByZXNzaW9uVHlwZS5FVEMxO1xuICAgICAgY29tcHJlc3Npb25UeXBlID0gZXRjMS5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMO1xuICAgIH1cbiAgICBjb25zdCBhdGMgPSBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hdGMnKTtcbiAgICBpZiAoYXRjKSB7XG4gICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSA9IEJhc2lzQ29tcHJlc3Npb25UeXBlLkFUQ19SR0JBO1xuICAgICAgY29tcHJlc3Npb25UeXBlID0gYXRjLkNPTVBSRVNTRURfUkdCQV9BVENfSU5URVJQT0xBVEVEX0FMUEhBX1dFQkdMO1xuICAgIH1cbiAgICBjb25zdCBldGMyID0gZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjJyk7XG4gICAgaWYgKGV0YzIpIHtcbiAgICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlID0gQmFzaXNDb21wcmVzc2lvblR5cGUuRVRDMjtcbiAgICAgIGNvbXByZXNzaW9uVHlwZSA9IGV0YzIuQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQztcbiAgICB9XG4gICAgY29uc3QgcHZydGMgPVxuICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnKSB8fFxuICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyk7XG4gICAgaWYgKHB2cnRjKSB7XG4gICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSA9IEJhc2lzQ29tcHJlc3Npb25UeXBlLlBWUlRDMV9SR0JBO1xuICAgICAgY29tcHJlc3Npb25UeXBlID0gcHZydGMuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7XG4gICAgfVxuICAgIGNvbnN0IGFzdGMgPSBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyk7XG4gICAgaWYgKGFzdGMpIHtcbiAgICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlID0gQmFzaXNDb21wcmVzc2lvblR5cGUuQVNUQztcbiAgICAgIGNvbXByZXNzaW9uVHlwZSA9IGFzdGMuQ09NUFJFU1NFRF9SR0JBX0FTVENfNHg0X0tIUjtcbiAgICB9XG5cbiAgICBjb25zdCBudW1JbWFnZXMgPSBiYXNpc0ZpbGUuZ2V0TnVtSW1hZ2VzKCk7XG4gICAgY29uc3QgbWlwbWFwRGVwdGggPSBiYXNpc0ZpbGUuZ2V0TnVtTGV2ZWxzKDApO1xuXG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX1dSQVBfUywgd3JhcFMuaW5kZXgpO1xuICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXBULmluZGV4KTtcbiAgICBpZiAobWlwbWFwRGVwdGggPj0gMikge1xuICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIG1pbkZpbHRlci5pbmRleCk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyLmluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1pbkZpbHRlcl8gPSBtaW5GaWx0ZXI7XG4gICAgICBpZiAobWluRmlsdGVyID09PSBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhck1pcG1hcExpbmVhcikge1xuICAgICAgICBtaW5GaWx0ZXJfID0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXI7XG4gICAgICB9XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyXy5pbmRleCk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyLmluZGV4KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pcG1hcERlcHRoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtSW1hZ2VzOyBqKyspIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBiYXNpc0ZpbGUuZ2V0SW1hZ2VXaWR0aChqLCBpKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYmFzaXNGaWxlLmdldEltYWdlSGVpZ2h0KGosIGkpO1xuICAgICAgICBjb25zdCB0ZXh0dXJlU291cmNlID0gdGhpcy5kZWNvZGVCYXNpc0ltYWdlKGJhc2lzRmlsZSwgYmFzaXNDb21wcmVzc2lvblR5cGUhLCBqLCBpKTtcbiAgICAgICAgZ2wuY29tcHJlc3NlZFRleEltYWdlMkQoXG4gICAgICAgICAgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaixcbiAgICAgICAgICBpLFxuICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSEsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICB0ZXh0dXJlU291cmNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fX2dsdyEudW5iaW5kVGV4dHVyZUN1YmUoMTUpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgY3JlYXRlRHVtbXlCbGFja0N1YmVUZXh0dXJlKCkge1xuICAgIGNvbnN0IGJhc2U2NCA9XG4gICAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQVlBQUFBZkZjU0pBQUFBRFVsRVFWUjQybU5rWVBqL0h3QURCd0lBTUNiSFlRQUFBQUJKUlU1RXJrSmdnZz09JztcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHRoaXMuX19jcmVhdGVEdW1teVRleHR1cmVJbm5lcihiYXNlNjQpO1xuICAgIGNvbnN0IHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3ViZVRleHR1cmUoXG4gICAgICAxLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcG9zWDogdHlwZWRBcnJheSxcbiAgICAgICAgICBuZWdYOiB0eXBlZEFycmF5LFxuICAgICAgICAgIHBvc1k6IHR5cGVkQXJyYXksXG4gICAgICAgICAgbmVnWTogdHlwZWRBcnJheSxcbiAgICAgICAgICBwb3NaOiB0eXBlZEFycmF5LFxuICAgICAgICAgIG5lZ1o6IHR5cGVkQXJyYXksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMSxcbiAgICAgIDFcbiAgICApO1xuICB9XG5cbiAgY3JlYXRlRHVtbXlDdWJlVGV4dHVyZShyZ2JhU3RyID0gJ3JnYmEoMCwwLDAsMSknKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY3R4LmZpbGxTdHlsZSA9IHJnYmFTdHI7XG4gICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3ViZVRleHR1cmUoXG4gICAgICAxLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcG9zWDogY2FudmFzLFxuICAgICAgICAgIG5lZ1g6IGNhbnZhcyxcbiAgICAgICAgICBwb3NZOiBjYW52YXMsXG4gICAgICAgICAgbmVnWTogY2FudmFzLFxuICAgICAgICAgIHBvc1o6IGNhbnZhcyxcbiAgICAgICAgICBuZWdaOiBjYW52YXMsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMSxcbiAgICAgIDFcbiAgICApO1xuICB9XG5cbiAgc2V0V2ViR0xUZXh0dXJlRGlyZWN0bHkod2ViR0xUZXh0dXJlOiBXZWJHTFRleHR1cmUpIHtcbiAgICBjb25zdCB0ZXh0dXJlID0gd2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZSk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGU7XG4gIH1cblxuICBhc3luYyBjcmVhdGVUZXh0dXJlRnJvbURhdGFVcmkoXG4gICAgZGF0YVVyaTogc3RyaW5nLFxuICAgIHtcbiAgICAgIGxldmVsLFxuICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICBib3JkZXIsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgICAgZ2VuZXJhdGVNaXBtYXAsXG4gICAgfToge1xuICAgICAgbGV2ZWw6IEluZGV4O1xuICAgICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgICAgYm9yZGVyOiBTaXplO1xuICAgICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBib29sZWFuO1xuICAgIH1cbiAgKTogUHJvbWlzZTxXZWJHTFJlc291cmNlSGFuZGxlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFdlYkdMUmVzb3VyY2VIYW5kbGU+KChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGlmICghZGF0YVVyaS5tYXRjaCgvXmRhdGE6LykpIHtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICB9XG4gICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5jcmVhdGVUZXh0dXJlRnJvbUhUTUxJbWFnZUVsZW1lbnQoaW1nLCB7XG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBnZW5lcmF0ZU1pcG1hcCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzb2x2ZSh0ZXh0dXJlKTtcbiAgICAgIH07XG5cbiAgICAgIGltZy5zcmMgPSBkYXRhVXJpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTGV2ZWwwVGV4dHVyZUFuZEdlbmVyYXRlTWlwbWFwKFxuICAgIHRleHR1cmVVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGUsXG4gICAgdGV4dHVyZURhdGE6IERpcmVjdFRleHR1cmVEYXRhLFxuICAgIHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICB9OiB7XG4gICAgICB3aWR0aDogU2l6ZTtcbiAgICAgIGhlaWdodDogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgfVxuICApIHtcbiAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKHRleHR1cmVVaWQpIGFzIFdlYkdMVGV4dHVyZTtcbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlKTtcblxuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgZ2wudGV4U3ViSW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGZvcm1hdC5pbmRleCxcbiAgICAgIHR5cGUuaW5kZXgsXG4gICAgICB0ZXh0dXJlRGF0YSBhcyBhbnkgYXMgQXJyYXlCdWZmZXJWaWV3XG4gICAgKTtcbiAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICB0aGlzLl9fZ2x3IS51bmJpbmRUZXh0dXJlMkQoMTUpO1xuICB9XG5cbiAgdXBkYXRlVGV4dHVyZShcbiAgICB0ZXh0dXJlVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlLFxuICAgIHRleHR1cmVEYXRhOiBEaXJlY3RUZXh0dXJlRGF0YSxcbiAgICB7XG4gICAgICBsZXZlbCxcbiAgICAgIHhvZmZzZXQsXG4gICAgICB5b2Zmc2V0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBmb3JtYXQsXG4gICAgICB0eXBlLFxuICAgIH06IHtcbiAgICAgIGxldmVsOiBJbmRleDtcbiAgICAgIHhvZmZzZXQ6IFNpemU7XG4gICAgICB5b2Zmc2V0OiBTaXplO1xuICAgICAgd2lkdGg6IFNpemU7XG4gICAgICBoZWlnaHQ6IFNpemU7XG4gICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0RW51bTtcbiAgICAgIHR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICAgIH1cbiAgKSB7XG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh0ZXh0dXJlVWlkKSBhcyBXZWJHTFRleHR1cmU7XG5cbiAgICB0aGlzLl9fZ2x3IS5iaW5kVGV4dHVyZTJEKDE1LCB0ZXh0dXJlKTtcblxuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgZ2wudGV4U3ViSW1hZ2UyRChcbiAgICAgIGdsLlRFWFRVUkVfMkQsXG4gICAgICBsZXZlbCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBmb3JtYXQuaW5kZXgsXG4gICAgICB0eXBlLmluZGV4LFxuICAgICAgdGV4dHVyZURhdGEgYXMgYW55IGFzIEFycmF5QnVmZmVyVmlld1xuICAgICk7XG4gICAgdGhpcy5fX2dsdyEudW5iaW5kVGV4dHVyZTJEKDE1KTtcbiAgfVxuXG4gIGRlbGV0ZUZyYW1lQnVmZmVyT2JqZWN0KGZyYW1lQnVmZmVyT2JqZWN0SGFuZGxlOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgZmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGZyYW1lQnVmZmVyT2JqZWN0SGFuZGxlKSBhcyBXZWJHTEZyYW1lYnVmZmVyO1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGlmIChmYm8gIT0gbnVsbCkge1xuICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZmJvISk7XG4gICAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZXMuZGVsZXRlKGZyYW1lQnVmZmVyT2JqZWN0SGFuZGxlKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVSZW5kZXJCdWZmZXIocmVuZGVyQnVmZmVyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBjb25zdCByZW5kZXJCdWZmZXIgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UocmVuZGVyQnVmZmVyVWlkKSEgYXMgV2ViR0xSZW5kZXJidWZmZXI7XG4gICAgZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKHJlbmRlckJ1ZmZlcik7XG4gICAgdGhpcy5fX3dlYmdsUmVzb3VyY2VzLmRlbGV0ZShyZW5kZXJCdWZmZXJVaWQpO1xuICB9XG5cbiAgZGVsZXRlVGV4dHVyZSh0ZXh0dXJlSGFuZGxlOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh0ZXh0dXJlSGFuZGxlKSBhcyBXZWJHTFRleHR1cmU7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlISk7XG4gICAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZXMuZGVsZXRlKHRleHR1cmVIYW5kbGUpO1xuICAgICAgTG9nZ2VyLmRlYnVnKCdnbC5kZWxldGVUZXh0dXJlIGNhbGxlZDogJyArIHRleHR1cmVIYW5kbGUpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUR1bW15VGV4dHVyZShyZ2JhU3RyID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgY3R4LmZpbGxTdHlsZSA9IHJnYmFTdHI7XG4gICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZUZyb21JbWFnZUJpdG1hcERhdGEoY2FudmFzLCB7XG4gICAgICBsZXZlbDogMCxcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlRm9ybWF0LlJHQkE4LFxuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICBib3JkZXI6IDAsXG4gICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0LlJHQkEsXG4gICAgICB0eXBlOiBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUR1bW15QmxhY2tUZXh0dXJlKCkge1xuICAgIGNvbnN0IGJhc2U2NCA9XG4gICAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQVlBQUFBZkZjU0pBQUFBRFVsRVFWUjQybU5rWVBqL0h3QURCd0lBTUNiSFlRQUFBQUJKUlU1RXJrSmdnZz09JztcbiAgICByZXR1cm4gdGhpcy5fX2NyZWF0ZUR1bW15VGV4dHVyZUlubmVyKGJhc2U2NCk7XG4gIH1cblxuICBjcmVhdGVEdW1teVdoaXRlVGV4dHVyZSgpIHtcbiAgICBjb25zdCBiYXNlNjQgPVxuICAgICAgJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQURVbEVRVlI0Mm1QOC81L2hQd0FJQWdMLzRkMWo4d0FBQUFCSlJVNUVya0pnZ2c9PSc7XG4gICAgcmV0dXJuIHRoaXMuX19jcmVhdGVEdW1teVRleHR1cmVJbm5lcihiYXNlNjQpO1xuICB9XG5cbiAgY3JlYXRlRHVtbXlOb3JtYWxUZXh0dXJlKCkge1xuICAgIGNvbnN0IGJhc2U2NCA9XG4gICAgICAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQVlBQUFBZkZjU0pBQUFBRFVsRVFWUjQybU9zci8vL0h3QUdnQUwrdjFSdW1BQUFBQUJKUlU1RXJrSmdnZz09JztcbiAgICByZXR1cm4gdGhpcy5fX2NyZWF0ZUR1bW15VGV4dHVyZUlubmVyKGJhc2U2NCk7XG4gIH1cblxuICBfX2NyZWF0ZUR1bW15VGV4dHVyZUlubmVyKGJhc2U2NDogc3RyaW5nKSB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBEYXRhVXRpbC5iYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZUZyb21UeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSwge1xuICAgICAgbGV2ZWw6IDAsXG4gICAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZUZvcm1hdC5SR0JBOCxcbiAgICAgIHdpZHRoOiAxLFxuICAgICAgaGVpZ2h0OiAxLFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgZm9ybWF0OiBQaXhlbEZvcm1hdC5SR0JBLFxuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZS5VbnNpZ25lZEJ5dGUsXG4gICAgICBnZW5lcmF0ZU1pcG1hcDogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZU1pcG1hcHMyZCh0ZXh0dXJlSGFuZGxlOiBXZWJHTFJlc291cmNlSGFuZGxlLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UodGV4dHVyZUhhbmRsZSkgYXMgV2ViR0xUZXh0dXJlO1xuICAgIHRoaXMuX19nbHchLmJpbmRUZXh0dXJlMkQoMTUsIHRleHR1cmUpO1xuICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgIHRoaXMuX19nbHchLnVuYmluZFRleHR1cmUyRCgxNSk7XG4gIH1cblxuICBnZW5lcmF0ZU1pcG1hcHNDdWJlKHRleHR1cmVIYW5kbGU6IFdlYkdMUmVzb3VyY2VIYW5kbGUsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh0ZXh0dXJlSGFuZGxlKSBhcyBXZWJHTFRleHR1cmU7XG4gICAgdGhpcy5fX2dsdyEuYmluZFRleHR1cmVDdWJlKDE1LCB0ZXh0dXJlKTtcbiAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFX0NVQkVfTUFQKTtcbiAgICB0aGlzLl9fZ2x3IS51bmJpbmRUZXh0dXJlQ3ViZSgxNSk7XG4gIH1cblxuICBhc3luYyBnZXRUZXh0dXJlUGl4ZWxEYXRhKFxuICAgIHRleHR1cmVIYW5kbGU6IFdlYkdMUmVzb3VyY2VIYW5kbGUsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBmcmFtZUJ1ZmZlclVpZDogV2ViR0xSZXNvdXJjZUhhbmRsZSxcbiAgICBjb2xvckF0dGFjaG1lbnRJbmRleDogbnVtYmVyXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZnJhbWVidWZmZXIgYmFja2VkIGJ5IHRoZSB0ZXh0dXJlXG4gICAgY29uc3QgZmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGZyYW1lQnVmZmVyVWlkKSBhcyBXZWJHTEZyYW1lYnVmZmVyO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZmJvKTtcblxuICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZWJ1ZmZlciAoZGF0YSBzdG9yZXMgdGhlIHBpeGVsIGRhdGEpXG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgaWYgKChnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KS5yZWFkQnVmZmVyICE9IG51bGwpIHtcbiAgICAgIChnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KS5yZWFkQnVmZmVyKDM2MDY0ICsgY29sb3JBdHRhY2htZW50SW5kZXgpOyAvLyAzNjA2NCBtZWFucyBnbC5DT0xPUl9BVFRBQ0hNRU5UMFxuICAgIH1cbiAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIHdpZHRoLCBoZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEpO1xuXG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY3JlYXRlVW5pZm9ybUJ1ZmZlcihidWZmZXJWaWV3OiBUeXBlZEFycmF5IHwgRGF0YVZpZXcpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuXG4gICAgaWYgKGdsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gV2ViR0xSZW5kZXJpbmdDb250ZXh0IHNldCBhcyBEZWZhdWx0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVibyA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodWJvISk7XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLlVOSUZPUk1fQlVGRkVSLCB1Ym8pO1xuICAgIGdsLmJ1ZmZlckRhdGEoZ2wuVU5JRk9STV9CVUZGRVIsIGJ1ZmZlclZpZXcsIGdsLkRZTkFNSUNfRFJBVyk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5VTklGT1JNX0JVRkZFUiwgbnVsbCk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGU7XG4gIH1cblxuICB1cGRhdGVVbmlmb3JtQnVmZmVyKFxuICAgIHVib1VpZDogV2ViR0xSZXNvdXJjZUhhbmRsZSxcbiAgICB0eXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICAgIG9mZnNldEJ5dGU6IEJ5dGUsXG4gICAgYXJyYXlMZW5ndGg6IEJ5dGVcbiAgKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcbiAgICBjb25zdCB1Ym8gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UodWJvVWlkKSBhcyBXZWJHTEJ1ZmZlcjtcblxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuVU5JRk9STV9CVUZGRVIsIHVibyk7XG4gICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5VTklGT1JNX0JVRkZFUiwgMCwgdHlwZWRBcnJheSwgb2Zmc2V0Qnl0ZSwgYXJyYXlMZW5ndGgpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuVU5JRk9STV9CVUZGRVIsIG51bGwpO1xuICB9XG5cbiAgYmluZFVuaWZvcm1CbG9jayhzaGFkZXJQcm9ncmFtVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlLCBibG9ja05hbWU6IHN0cmluZywgYmxvY2tJbmRleDogSW5kZXgpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuXG4gICAgaWYgKGdsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gV2ViR0xSZW5kZXJpbmdDb250ZXh0IHNldCBhcyBEZWZhdWx0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYWRlclByb2dyYW0gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2Uoc2hhZGVyUHJvZ3JhbVVpZCkhIGFzIFdlYkdMUHJvZ3JhbTtcblxuICAgIGNvbnN0IGJsb2NrID0gZ2wuZ2V0VW5pZm9ybUJsb2NrSW5kZXgoc2hhZGVyUHJvZ3JhbSwgYmxvY2tOYW1lKTtcbiAgICBnbC51bmlmb3JtQmxvY2tCaW5kaW5nKHNoYWRlclByb2dyYW0sIGJsb2NrLCBibG9ja0luZGV4KTtcbiAgfVxuXG4gIGJpbmRVbmlmb3JtQnVmZmVyQmFzZShibG9ja0luZGV4OiBJbmRleCwgdWJvVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcblxuICAgIGlmIChnbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFdlYkdMUmVuZGVyaW5nQ29udGV4dCBzZXQgYXMgRGVmYXVsdC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1Ym8gPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UodWJvVWlkKSEgYXMgV2ViR0xCdWZmZXI7XG5cbiAgICBnbC5iaW5kQnVmZmVyQmFzZShnbC5VTklGT1JNX0JVRkZFUiwgYmxvY2tJbmRleCwgdWJvKTtcbiAgfVxuXG4gIGRlbGV0ZVVuaWZvcm1CdWZmZXIodWJvVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICBpZiAoZ2wgPT0gbnVsbCkge1xuICAgICAgbmV3IEVycm9yKCdObyBXZWJHTFJlbmRlcmluZ0NvbnRleHQgc2V0IGFzIERlZmF1bHQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdWJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKHVib1VpZCkhIGFzIFdlYkdMQnVmZmVyO1xuICAgIHRoaXMuX193ZWJnbFJlc291cmNlcy5kZWxldGUodWJvVWlkKTtcblxuICAgIGdsLmRlbGV0ZUJ1ZmZlcih1Ym8pO1xuICB9XG5cbiAgc2V0dXBVbmlmb3JtQnVmZmVyRGF0YUFyZWEodHlwZWRBcnJheT86IFR5cGVkQXJyYXkpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuXG4gICAgaWYgKGdsID09IG51bGwpIHtcbiAgICAgIG5ldyBFcnJvcignTm8gV2ViR0xSZW5kZXJpbmdDb250ZXh0IHNldCBhcyBEZWZhdWx0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVibyA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodWJvISk7XG5cbiAgICBjb25zdCBtYXhDb252ZW50aW9uQmxvY2tzID0gdGhpcy5fX2dsdyEuZ2V0TWF4Q29udmVudGlvblVuaWZvcm1CbG9ja3MoKTtcbiAgICBjb25zdCBhbGlnbmVkTWF4VW5pZm9ybUJsb2NrU2l6ZSA9IHRoaXMuX19nbHchLmdldEFsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplKCk7XG4gICAgY29uc3QgcmVhbFNpemUgPSBhbGlnbmVkTWF4VW5pZm9ybUJsb2NrU2l6ZSAqIG1heENvbnZlbnRpb25CbG9ja3M7XG4gICAgY29uc3QgYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHJlYWxTaXplIC8gNCk7XG4gICAgaWYgKElzLmV4aXN0KHR5cGVkQXJyYXkpKSB7XG4gICAgICBhcnJheS5zZXQodHlwZWRBcnJheS5zdWJhcnJheSgwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5VTklGT1JNX0JVRkZFUiwgdWJvKTtcbiAgICBnbC5idWZmZXJEYXRhKGdsLlVOSUZPUk1fQlVGRkVSLCBhcnJheSwgZ2wuRFlOQU1JQ19EUkFXLCAwLCAwKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4Q29udmVudGlvbkJsb2NrczsgaSsrKSB7XG4gICAgICBnbC5iaW5kQnVmZmVyUmFuZ2UoXG4gICAgICAgIGdsLlVOSUZPUk1fQlVGRkVSLFxuICAgICAgICBpLFxuICAgICAgICB1Ym8sXG4gICAgICAgIGFsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplICogaSxcbiAgICAgICAgYWxpZ25lZE1heFVuaWZvcm1CbG9ja1NpemVcbiAgICAgICk7XG4gICAgfVxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuVU5JRk9STV9CVUZGRVIsIG51bGwpO1xuXG4gICAgcmV0dXJuIHJlc291cmNlSGFuZGxlO1xuICB9XG5cbiAgZ2V0R2xzbFJlbmRlclRhcmdldEJlZ2luU3RyaW5nKHJlbmRlclRhcmdldE51bWJlcjogbnVtYmVyKSB7XG4gICAgbGV0IHRleHQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlclRhcmdldE51bWJlcjsgaSsrKSB7XG4gICAgICB0ZXh0ICs9IGBsYXlvdXQobG9jYXRpb24gPSAke2l9KSBvdXQgdmVjNCBydCR7aX07YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGdldEdsc2xSZW5kZXJUYXJnZXRFbmRTdHJpbmcocmVuZGVyVGFyZ2V0TnVtYmVyOiBudW1iZXIpIHtcbiAgICBjb25zdCB0ZXh0ID0gJyc7XG4gICAgLy8gaWYgKElzLmZhbHNlKHRoaXMuX19nbHchLmlzV2ViR0wyKSkge1xuICAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJUYXJnZXROdW1iZXI7IGkrKykge1xuICAgIC8vICAgICB0ZXh0ICs9IGBnbF9GcmFnRGF0YVske2l9XSA9IHJ0JHtpfTtgO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgZ2V0R2xzbERhdGFVQk9EZWZpbml0aW9uU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSAnJztcbiAgICBjb25zdCBtYXhDb252ZW50aW9uYmxvY2tzID0gdGhpcy5fX2dsdyEuZ2V0TWF4Q29udmVudGlvblVuaWZvcm1CbG9ja3MoKTtcbiAgICBjb25zdCBhbGlnbmVkTWF4VW5pZm9ybUJsb2NrU2l6ZSA9IHRoaXMuX19nbHchLmdldEFsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhDb252ZW50aW9uYmxvY2tzOyBpKyspIHtcbiAgICAgIHRleHQgKz0gYFxubGF5b3V0IChzdGQxNDApIHVuaWZvcm0gVmVjNEJsb2NrJHtpfSB7XG4gIHZlYzQgdmVjNEJsb2NrJHtpfVske2FsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplIC8gNCAvIDR9XTtcbn07XG5gO1xuICAgIH1cblxuICAgIHRleHQgKz0gYFxudmVjNCBmZXRjaFZlYzRGcm9tVmVjNEJsb2NrKGludCB2ZWM0SWR4KSB7XG4gIGludCB2ZWM0SWR4Rm9yRWFjaEJsb2NrID0gdmVjNElkeCAlIGRhdGFVQk9WZWM0U2l6ZTtcbiAgaWYgKHZlYzRJZHggPCBkYXRhVUJPVmVjNFNpemUpIHtcbiAgICByZXR1cm4gdmVjNEJsb2NrMFt2ZWM0SWR4Rm9yRWFjaEJsb2NrXTtcbiAgfWA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXhDb252ZW50aW9uYmxvY2tzOyBpKyspIHtcbiAgICAgIHRleHQgKz0gYFxuIGVsc2UgaWYgKHZlYzRJZHggPCBkYXRhVUJPVmVjNFNpemUgKiAke2kgKyAxfSkge1xuICAgIHJldHVybiB2ZWM0QmxvY2ske2l9W3ZlYzRJZHhGb3JFYWNoQmxvY2tdO1xufWA7XG4gICAgfVxuICAgIHRleHQgKz0gJ31cXG4nO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBnZXRHbHNsRGF0YVVCT1ZlYzRTaXplU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYWxpZ25lZE1heFVuaWZvcm1CbG9ja1NpemUgPSB0aGlzLl9fZ2x3IS5nZXRBbGlnbmVkTWF4VW5pZm9ybUJsb2NrU2l6ZSgpO1xuICAgIHJldHVybiBgY29uc3QgaW50IGRhdGFVQk9WZWM0U2l6ZSA9ICR7YWxpZ25lZE1heFVuaWZvcm1CbG9ja1NpemUgLyA0IC8gNH07YDtcbiAgfVxuXG4gIGNyZWF0ZU11bHRpdmlld0ZyYW1lYnVmZmVyKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgc2FtcGxlczogbnVtYmVyXG4gICk6IFtXZWJHTFJlc291cmNlSGFuZGxlLCBXZWJHTFJlc291cmNlSGFuZGxlXSB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh0aGlzLl9fZ2x3IS53ZWJnbDJFeHRNTFRWSUVXKSkge1xuICAgICAgcmV0dXJuIFstMSwgLTFdO1xuICAgIH1cbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgIGNvbnN0IGZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICBjb25zdCBmcmFtZWJ1ZmZlckhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKGZyYW1lYnVmZmVyISk7XG5cbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpO1xuXG4gICAgLy8gY29sb3IgdGV4dHVyZSAvIGF0dGFjaG1lbnRcbiAgICBjb25zdCBjb2xvclRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCkhO1xuICAgIGNvbnN0IGNvbG9yVGV4dHVyZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKGNvbG9yVGV4dHVyZSk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRF9BUlJBWSwgY29sb3JUZXh0dXJlKTtcbiAgICBnbC50ZXhTdG9yYWdlM0QoZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMSwgZ2wuUkdCQTgsIHdpZHRoLCBoZWlnaHQsIDIpO1xuICAgIGlmICghdGhpcy5fX2dsdyEud2ViZ2wyRXh0TUxUVklFVy5pc19tdWx0aXNhbXBsZSlcbiAgICAgIHRoaXMuX19nbHchLndlYmdsMkV4dE1MVFZJRVcuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGl2aWV3T1ZSKFxuICAgICAgICBnbC5EUkFXX0ZSQU1FQlVGRkVSLFxuICAgICAgICBnbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgY29sb3JUZXh0dXJlISxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMlxuICAgICAgKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9fZ2x3IS53ZWJnbDJFeHRNTFRWSUVXLmZyYW1lYnVmZmVyVGV4dHVyZU11bHRpc2FtcGxlTXVsdGl2aWV3T1ZSKFxuICAgICAgICBnbC5EUkFXX0ZSQU1FQlVGRkVSLFxuICAgICAgICBnbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgY29sb3JUZXh0dXJlISxcbiAgICAgICAgMCxcbiAgICAgICAgc2FtcGxlcyxcbiAgICAgICAgMCxcbiAgICAgICAgMlxuICAgICAgKTtcblxuICAgIC8vIGRlcHRoIHRleHR1cmUgLyBhdHRhY2htZW50XG4gICAgY29uc3QgZGVwdGhTdGVuY2lsVGV4ID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkRfQVJSQVksIGRlcHRoU3RlbmNpbFRleCk7XG4gICAgZ2wudGV4U3RvcmFnZTNEKGdsLlRFWFRVUkVfMkRfQVJSQVksIDEsIGdsLkRFUFRIMzJGX1NURU5DSUw4LCB3aWR0aCwgaGVpZ2h0LCAyKTtcbiAgICBpZiAoIXRoaXMuX19nbHchLndlYmdsMkV4dE1MVFZJRVcuaXNfbXVsdGlzYW1wbGUpXG4gICAgICB0aGlzLl9fZ2x3IS53ZWJnbDJFeHRNTFRWSUVXLmZyYW1lYnVmZmVyVGV4dHVyZU11bHRpdmlld09WUihcbiAgICAgICAgZ2wuRFJBV19GUkFNRUJVRkZFUixcbiAgICAgICAgZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULFxuICAgICAgICBkZXB0aFN0ZW5jaWxUZXghLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAyXG4gICAgICApO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuX19nbHchLndlYmdsMkV4dE1MVFZJRVcuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGlzYW1wbGVNdWx0aXZpZXdPVlIoXG4gICAgICAgIGdsLkRSQVdfRlJBTUVCVUZGRVIsXG4gICAgICAgIGdsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxcbiAgICAgICAgZGVwdGhTdGVuY2lsVGV4ISxcbiAgICAgICAgMCxcbiAgICAgICAgc2FtcGxlcyxcbiAgICAgICAgMCxcbiAgICAgICAgMlxuICAgICAgKTtcblxuICAgIHJldHVybiBbZnJhbWVidWZmZXJIYW5kbGUsIGNvbG9yVGV4dHVyZUhhbmRsZV07XG4gIH1cblxuICBjcmVhdGVUcmFuc2Zvcm1GZWVkYmFjaygpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgIGNvbnN0IHRyYW5zZm9ybUZlZWRiYWNrID0gZ2wuY3JlYXRlVHJhbnNmb3JtRmVlZGJhY2soKTtcbiAgICBjb25zdCByZXNvdXJjZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKHRyYW5zZm9ybUZlZWRiYWNrISk7XG5cbiAgICBnbC5iaW5kVHJhbnNmb3JtRmVlZGJhY2soZ2wuVFJBTlNGT1JNX0ZFRURCQUNLLCB0cmFuc2Zvcm1GZWVkYmFjayk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGU7XG4gIH1cblxuICBkZWxldGVUcmFuc2Zvcm1GZWVkYmFjayh0cmFuc2Zvcm1GZWVkYmFja1VpZDogV2ViR0xSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1GZWVkYmFjayA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh0cmFuc2Zvcm1GZWVkYmFja1VpZCkhO1xuICAgIGdsLmRlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrKHRyYW5zZm9ybUZlZWRiYWNrIGFzIFdlYkdMVHJhbnNmb3JtRmVlZGJhY2spO1xuICAgIHRoaXMuX193ZWJnbFJlc291cmNlcy5kZWxldGUodHJhbnNmb3JtRmVlZGJhY2tVaWQpO1xuICB9XG5cbiAgc2V0Vmlld3BvcnQodmlld3BvcnQ/OiBWZWN0b3I0KSB7XG4gICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICB0aGlzLl9fZ2x3Py5zZXRWaWV3cG9ydEFzVmVjdG9yNCh2aWV3cG9ydCk7XG4gICAgICBTeXN0ZW1TdGF0ZS52aWV3cG9ydEFzcGVjdFJhdGlvID0gKHZpZXdwb3J0LnogLSB2aWV3cG9ydC54KSAvICh2aWV3cG9ydC53IC0gdmlld3BvcnQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19nbHc/LnNldFZpZXdwb3J0KDAsIDAsIHRoaXMuX19nbHchLndpZHRoLCB0aGlzLl9fZ2x3IS5oZWlnaHQpO1xuICAgICAgU3lzdGVtU3RhdGUudmlld3BvcnRBc3BlY3RSYXRpbyA9IHRoaXMuX19nbHchLndpZHRoIC8gdGhpcy5fX2dsdyEuaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRnJhbWVCdWZmZXIocmVuZGVyUGFzczogUmVuZGVyUGFzcykge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGxldCBidWZmZXJCaXQgPSAwO1xuICAgIGlmIChyZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlcikge1xuICAgICAgZ2wuY2xlYXJDb2xvcihcbiAgICAgICAgcmVuZGVyUGFzcy5jbGVhckNvbG9yLngsXG4gICAgICAgIHJlbmRlclBhc3MuY2xlYXJDb2xvci55LFxuICAgICAgICByZW5kZXJQYXNzLmNsZWFyQ29sb3IueixcbiAgICAgICAgcmVuZGVyUGFzcy5jbGVhckNvbG9yLndcbiAgICAgICk7XG4gICAgICBidWZmZXJCaXQgfD0gZ2wuQ09MT1JfQlVGRkVSX0JJVDtcbiAgICB9XG4gICAgaWYgKHJlbmRlclBhc3MudG9DbGVhckRlcHRoQnVmZmVyKSB7XG4gICAgICBnbC5jbGVhckRlcHRoKHJlbmRlclBhc3MuY2xlYXJEZXB0aCk7XG4gICAgICBidWZmZXJCaXQgfD0gZ2wuREVQVEhfQlVGRkVSX0JJVDtcbiAgICB9XG4gICAgaWYgKHJlbmRlclBhc3MudG9DbGVhclN0ZW5jaWxCdWZmZXIpIHtcbiAgICAgIGdsLmNsZWFyU3RlbmNpbChyZW5kZXJQYXNzLmNsZWFyU3RlbmNpbCk7XG4gICAgICBidWZmZXJCaXQgfD0gZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuICAgIH1cbiAgICBpZiAoYnVmZmVyQml0ICE9PSAwKSB7XG4gICAgICBnbC5jbGVhcihidWZmZXJCaXQpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVZlcnRleERhdGFSZXNvdXJjZXModmVydGV4SGFuZGxlczogVmVydGV4SGFuZGxlcykge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuXG4gICAgY29uc3QgaWJvSGFuZGxlID0gdmVydGV4SGFuZGxlcy5pYm9IYW5kbGU7XG4gICAgaWYgKGlib0hhbmRsZSkge1xuICAgICAgY29uc3QgaWJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGlib0hhbmRsZSkgYXMgV2ViR0xCdWZmZXI7XG4gICAgICBnbC5kZWxldGVCdWZmZXIoaWJvKTtcbiAgICAgIHRoaXMuX193ZWJnbFJlc291cmNlcy5kZWxldGUoaWJvSGFuZGxlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2Ym9IYW5kbGVzID0gdmVydGV4SGFuZGxlcy52Ym9IYW5kbGVzO1xuICAgIGZvciAoY29uc3QgdmJvSGFuZGxlIG9mIHZib0hhbmRsZXMpIHtcbiAgICAgIGNvbnN0IHZibyA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh2Ym9IYW5kbGUpIGFzIFdlYkdMQnVmZmVyO1xuICAgICAgZ2wuZGVsZXRlQnVmZmVyKHZibyk7XG4gICAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZXMuZGVsZXRlKHZib0hhbmRsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFvSGFuZGxlID0gdmVydGV4SGFuZGxlcy52YW9IYW5kbGU7XG4gICAgY29uc3QgdmFvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKHZhb0hhbmRsZSkgYXMgV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgICB0aGlzLl9fZ2x3IS5kZWxldGVWZXJ0ZXhBcnJheSh2YW8pO1xuICAgIHRoaXMuX193ZWJnbFJlc291cmNlcy5kZWxldGUodmFvSGFuZGxlKTtcbiAgfVxuXG4gIGRlbGV0ZVZlcnRleEFycmF5KHZhb0hhbmRsZTogV2ViR0xSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IHZhbyA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZSh2YW9IYW5kbGUpIGFzIFdlYkdMVmVydGV4QXJyYXlPYmplY3Q7XG4gICAgdGhpcy5fX2dsdyEuZGVsZXRlVmVydGV4QXJyYXkodmFvKTtcbiAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZXMuZGVsZXRlKHZhb0hhbmRsZSk7XG4gIH1cblxuICBkZWxldGVWZXJ0ZXhCdWZmZXIodmJvVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3IS5nZXRSYXdDb250ZXh0KCk7XG4gICAgY29uc3QgdmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKHZib1VpZCkgYXMgV2ViR0xCdWZmZXI7XG4gICAgZ2wuZGVsZXRlQnVmZmVyKHZibyk7XG4gICAgdGhpcy5fX3dlYmdsUmVzb3VyY2VzLmRlbGV0ZSh2Ym9VaWQpO1xuICB9XG5cbiAgcmVzaXplQ2FudmFzKHdpZHRoOiBTaXplLCBoZWlnaHQ6IFNpemUpIHtcbiAgICB0aGlzLl9fZ2x3IS53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuX19nbHchLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLl9fZ2x3IS5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLl9fZ2x3IS5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuX19nbHchLnNldFZpZXdwb3J0QXNWZWN0b3I0KFZlY3RvcjQuZnJvbUNvcHlBcnJheShbMCwgMCwgd2lkdGgsIGhlaWdodF0pKTtcbiAgfVxuXG4gIGdldENhbnZhc1NpemUoKTogW1NpemUsIFNpemVdIHtcbiAgICByZXR1cm4gW3RoaXMuX19nbHchLmNhbnZhcy53aWR0aCwgdGhpcy5fX2dsdyEuY2FudmFzLmhlaWdodF07XG4gIH1cblxuICBzd2l0Y2hEZXB0aFRlc3QoZmxhZzogYm9vbGVhbikge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGlmIChmbGFnKSB7XG4gICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgfVxuICB9XG5cbiAgcmVidWlsZFByb2dyYW1CeVNwZWN0b3IoXG4gICAgdGhpczogUm5XZWJHTFByb2dyYW0sXG4gICAgdXBkYXRlZFZlcnRleFNvdXJjZUNvZGU6IHN0cmluZywgLy8gVGhlIG5ldyB2ZXJ0ZXggc2hhZGVyIHNvdXJjZVxuICAgIHVwZGF0ZWRGcmFnbWVudFNvdXJjZUNvZGU6IHN0cmluZywgLy8gVGhlIG5ldyBmcmFnbWVudCBzaGFkZXIgc291cmNlXG4gICAgb25Db21waWxlZDogKHByb2dyYW06IFdlYkdMUHJvZ3JhbSkgPT4gdm9pZCwgLy8gQ2FsbGJhY2sgdHJpZ2dlcmVkIGJ5IHlvdXIgZW5naW5lIHdoZW4gdGhlIGNvbXBpbGF0aW9uIGlzIHN1Y2Nlc3NmdWwuIEl0IG5lZWRzIHRvIHNlbmQgYmFjayB0aGUgbmV3IGxpbmtlZCBwcm9ncmFtLlxuICAgIG9uRXJyb3I6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQ2FsbGJhY2sgdHJpZ2dlcmVkIGJ5IHlvdXIgZW5naW5lIGluIGNhc2Ugb2YgZXJyb3IuIEl0IG5lZWRzIHRvIHNlbmQgdGhlIFdlYkdMIGVycm9yIHRvIGFsbG93IHRoZSBlZGl0b3IgdG8gZGlzcGxheSB0aGUgZXJyb3IgaW4gdGhlIGd1dHRlci5cblxuICAgIGNvbnN0IG1hdGVyaWFsID0gdGhpcy5fbWF0ZXJpYWwuZGVyZWYoKTtcbiAgICBpZiAoSXMubm90LmV4aXN0KG1hdGVyaWFsKSkge1xuICAgICAgY29uc3Qgd2FybiA9ICdNYXRlcmlhbCBOb3QgZm91bmQnO1xuICAgICAgTG9nZ2VyLndhcm4od2Fybik7XG4gICAgICBvbkVycm9yKHdhcm4pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NBcHByb2FjaCA9IFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2g7XG4gICAgY29uc3QgcmVuZGVyaW5nU3RyYXRlZ3kgPSBnZXRSZW5kZXJpbmdTdHJhdGVneShwcm9jZXNzQXBwcm9hY2gpO1xuXG4gICAgY29uc3QgbW9kaWZpZWRWZXJ0ZXhTb3VyY2VDb2RlID0gdXBkYXRlZFZlcnRleFNvdXJjZUNvZGUucmVwbGFjZSgvISA9L2csICchPScpO1xuICAgIGNvbnN0IG1vZGlmaWVkUGl4ZWxTb3VyY2VDb2RlID0gdXBkYXRlZEZyYWdtZW50U291cmNlQ29kZS5yZXBsYWNlKC8hID0vZywgJyE9Jyk7XG5cbiAgICBjb25zdCBwcm9ncmFtVWlkID0gcmVuZGVyaW5nU3RyYXRlZ3kuX3JlU2V0dXBTaGFkZXJGb3JNYXRlcmlhbEJ5U3BlY3RvcihcbiAgICAgIG1hdGVyaWFsLFxuICAgICAge1xuICAgICAgICB2ZXJ0ZXg6IG1vZGlmaWVkVmVydGV4U291cmNlQ29kZSxcbiAgICAgICAgcGl4ZWw6IG1vZGlmaWVkUGl4ZWxTb3VyY2VDb2RlLFxuICAgICAgfSxcbiAgICAgIG9uRXJyb3JcbiAgICApO1xuICAgIGlmIChwcm9ncmFtVWlkIDwgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZShwcm9ncmFtVWlkKSBhcyBSbldlYkdMUHJvZ3JhbTtcblxuICAgIGlmIChwcm9ncmFtVWlkID4gMCkge1xuICAgICAgb25Db21waWxlZChwcm9ncmFtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlYnVpbGRQcm9ncmFtKFxuICAgIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgICB1cGRhdGVkVmVydGV4U291cmNlQ29kZTogc3RyaW5nLCAvLyBUaGUgbmV3IHZlcnRleCBzaGFkZXIgc291cmNlXG4gICAgdXBkYXRlZEZyYWdtZW50U291cmNlQ29kZTogc3RyaW5nIC8vIFRoZSBuZXcgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZVxuICApIHtcbiAgICBjb25zdCBwcm9jZXNzQXBwcm9hY2ggPSBTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoO1xuICAgIGNvbnN0IHJlbmRlcmluZ1N0cmF0ZWd5ID0gZ2V0UmVuZGVyaW5nU3RyYXRlZ3kocHJvY2Vzc0FwcHJvYWNoKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkVmVydGV4U291cmNlQ29kZSA9IHVwZGF0ZWRWZXJ0ZXhTb3VyY2VDb2RlLnJlcGxhY2UoLyEgPS9nLCAnIT0nKTtcbiAgICBjb25zdCBtb2RpZmllZFBpeGVsU291cmNlQ29kZSA9IHVwZGF0ZWRGcmFnbWVudFNvdXJjZUNvZGUucmVwbGFjZSgvISA9L2csICchPScpO1xuXG4gICAgY29uc3QgcHJvZ3JhbVVpZCA9IHJlbmRlcmluZ1N0cmF0ZWd5Ll9yZVNldHVwU2hhZGVyRm9yTWF0ZXJpYWxCeVNwZWN0b3IoXG4gICAgICBtYXRlcmlhbCxcbiAgICAgIHtcbiAgICAgICAgdmVydGV4OiBtb2RpZmllZFZlcnRleFNvdXJjZUNvZGUsXG4gICAgICAgIHBpeGVsOiBtb2RpZmllZFBpeGVsU291cmNlQ29kZSxcbiAgICAgIH0sXG4gICAgICAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZ2V0UGl4ZWxEYXRhRnJvbVRleHR1cmUoXG4gICAgdGV4VWlkOiBXZWJHTFJlc291cmNlSGFuZGxlLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHQoKTtcbiAgICBjb25zdCBwaXhlbHMgPSBuZXcgVWludDhBcnJheSgod2lkdGggLSB4KSAqIChoZWlnaHQgLSB5KSAqIDQpO1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UodGV4VWlkKSBhcyBXZWJHTFRleHR1cmU7XG4gICAgY29uc3QgZmJvID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZibyk7XG4gICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKTtcbiAgICBnbC5yZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHBpeGVscyk7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmYm8pO1xuICAgIHJldHVybiBwaXhlbHM7XG4gIH1cblxuICBzZXRXZWJHTFN0YXRlVG9EZWZhdWx0KCkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIG51bGwpO1xuICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG51bGwpO1xuICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCBudWxsKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIGdsLmJpbmRWZXJ0ZXhBcnJheShudWxsKTtcbiAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xuICAgIGdsLmNsZWFyRGVwdGgoMSk7XG4gICAgZ2wuY2xlYXJTdGVuY2lsKDApO1xuICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTtcbiAgICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICBnbC5kaXNhYmxlKGdsLkRJVEhFUik7XG4gICAgZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgIGdsLmRpc2FibGUoZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCk7XG4gICAgZ2wuZGlzYWJsZShnbC5TQU1QTEVfQ09WRVJBR0UpO1xuICAgIGdsLmRpc2FibGUoZ2wuU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKTtcbiAgICBnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgZ2wuZnJvbnRGYWNlKGdsLkNDVyk7XG4gICAgZ2wuY3VsbEZhY2UoZ2wuQkFDSyk7XG4gICAgZ2wuYmxlbmRDb2xvcigwLCAwLCAwLCAwKTtcbiAgICBnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREKTtcbiAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShnbC5PTkUsIGdsLlpFUk8sIGdsLk9ORSwgZ2wuWkVSTyk7XG4gICAgZ2wuc3RlbmNpbE9wU2VwYXJhdGUoZ2wuRlJPTlQsIGdsLktFRVAsIGdsLktFRVAsIGdsLktFRVApO1xuICAgIGdsLnN0ZW5jaWxPcFNlcGFyYXRlKGdsLkJBQ0ssIGdsLktFRVAsIGdsLktFRVAsIGdsLktFRVApO1xuICAgIGdsLnN0ZW5jaWxGdW5jU2VwYXJhdGUoZ2wuRlJPTlQsIGdsLkFMV0FZUywgMCwgMHhmZmZmZmZmZik7XG4gICAgZ2wuc3RlbmNpbEZ1bmNTZXBhcmF0ZShnbC5CQUNLLCBnbC5BTFdBWVMsIDAsIDB4ZmZmZmZmZmYpO1xuICAgIGdsLnN0ZW5jaWxNYXNrU2VwYXJhdGUoZ2wuRlJPTlQsIDB4ZmZmZmZmZmYpO1xuICAgIGdsLnN0ZW5jaWxNYXNrU2VwYXJhdGUoZ2wuQkFDSywgMHhmZmZmZmZmZik7XG4gICAgZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgIGdsLmRlcHRoTWFzayh0cnVlKTtcbiAgICBnbC5zYW1wbGVDb3ZlcmFnZSgxLjAsIGZhbHNlKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIGkpO1xuICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsKTtcbiAgICAgIGdsLmJpbmRTYW1wbGVyKGksIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHVuYmluZFRleHR1cmVTYW1wbGVycygpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgZ2wuYmluZFNhbXBsZXIoaSwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgaXNTdXBwb3J0TXVsdGlWaWV3VlJSZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5EYXRhVGV4dHVyZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19nbHchLmlzTXVsdGl2aWV3KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBibGl0VG9UZXh0dXJlMmRGcm9tVGV4dHVyZTJkQXJyYXkoXG4gICAgc3JjVGV4dHVyZVVpZDogV2ViR0xSZXNvdXJjZUhhbmRsZSxcbiAgICBkc3RGYm9VaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGUsXG4gICAgZHN0V2lkdGg6IG51bWJlcixcbiAgICBkc3RIZWlnaHQ6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgIGNvbnN0IHNyY1RleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2Uoc3JjVGV4dHVyZVVpZCkgYXMgV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IGRzdEZibyA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZShkc3RGYm9VaWQpIGFzIFdlYkdMRnJhbWVidWZmZXI7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkRSQVdfRlJBTUVCVUZGRVIsIGRzdEZibyk7XG5cbiAgICBjb25zdCB3ZWJTdGVyZW9VdGlsID0gV2ViR0xTdGVyZW9VdGlsLmdldEluc3RhbmNlKGdsKTtcbiAgICB3ZWJTdGVyZW9VdGlsLmJsaXQoc3JjVGV4dHVyZSwgMCwgMCwgMSwgMSwgZHN0V2lkdGgsIGRzdEhlaWdodCk7XG5cbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cbiAgYmxpdFRvVGV4dHVyZTJkRnJvbVRleHR1cmUyZEFycmF5RmFrZShcbiAgICBzcmNUZXh0dXJlVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlLFxuICAgIGRzdEZib1VpZDogV2ViR0xSZXNvdXJjZUhhbmRsZSxcbiAgICBkc3RXaWR0aDogbnVtYmVyLFxuICAgIGRzdEhlaWdodDogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgY29uc3Qgc3JjVGV4dHVyZSA9IHRoaXMuZ2V0V2ViR0xSZXNvdXJjZShzcmNUZXh0dXJlVWlkKSBhcyBXZWJHTFRleHR1cmU7XG4gICAgY29uc3QgZHN0RmJvID0gdGhpcy5nZXRXZWJHTFJlc291cmNlKGRzdEZib1VpZCkgYXMgV2ViR0xGcmFtZWJ1ZmZlcjtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgZHN0RmJvKTtcblxuICAgIGNvbnN0IHdlYlN0ZXJlb1V0aWwgPSBXZWJHTFN0ZXJlb1V0aWwuZ2V0SW5zdGFuY2UoZ2wpO1xuICAgIHdlYlN0ZXJlb1V0aWwuYmxpdEZha2Uoc3JjVGV4dHVyZSwgMCwgMCwgMSwgMSwgZHN0V2lkdGgsIGRzdEhlaWdodCk7XG5cbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cbiAgYmxpdFRvVGV4dHVyZTJkRnJvbVRleHR1cmUyZEFycmF5MihcbiAgICBzcmNUZXh0dXJlVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlLFxuICAgIGRzdFRleHR1cmVVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGUsXG4gICAgZHN0V2lkdGg6IG51bWJlcixcbiAgICBkc3RIZWlnaHQ6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbHchLmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuICAgIGNvbnN0IHNyY1RleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2Uoc3JjVGV4dHVyZVVpZCkgYXMgV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IGRzdFRleHR1cmUgPSB0aGlzLmdldFdlYkdMUmVzb3VyY2UoZHN0VGV4dHVyZVVpZCkgYXMgV2ViR0xUZXh0dXJlO1xuICAgIGNvbnN0IHdlYlN0ZXJlb1V0aWwgPSBXZWJHTFN0ZXJlb1V0aWwuZ2V0SW5zdGFuY2UoZ2wpO1xuICAgIHdlYlN0ZXJlb1V0aWwuYmxpdDIoc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgZHN0V2lkdGgsIGRzdEhlaWdodCk7XG4gIH1cbn1cbiIsIi8vIFRoaXMgaXMgZnJvbSBodHRwczovL2RldmVsb3Blci5vY3VsdXMuY29tL2RvY3VtZW50YXRpb24vd2ViL3dlYi1tdWx0aXZpZXcvXG5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuXG5jb25zdCBWU011bHRpdmlldyA9IFtcbiAgJyN2ZXJzaW9uIDMwMCBlcycsXG4gICd1bmlmb3JtIHZlYzIgdV9vZmZzZXQ7JyxcbiAgJ3VuaWZvcm0gdmVjMiB1X3NjYWxlOycsXG4gICdvdXQgbWVkaXVtcCB2ZWMzIHZfdGV4Y29vcmQ7JyxcblxuICAndm9pZCBtYWluKCkgeycsXG4gIC8vIG9mZnNldCBvZiBleWUgcXVhZCBpbiAtMS4uMSBzcGFjZVxuICAnICAgIGNvbnN0IGZsb2F0IGV5ZV9vZmZzZXRfeFsxMl0gPSBmbG9hdFsxMl0gKCcsXG4gICcgICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsJyxcbiAgJyAgICAgICAgMS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDEuMCcsXG4gICcgICAgKTsnLFxuICAvLyAgeHkgLSBjb29yZHMgb2YgdGhlIHF1YWQsIG5vcm1hbGl6ZWQgdG8gMC4uMVxuICAvLyAgeHkgIC0gVVYgb2YgdGhlIHNvdXJjZSB0ZXh0dXJlIGNvb3JkaW5hdGUuXG4gIC8vICB6ICAgLSB0ZXh0dXJlIGxheWVyIChleWUpIGluZGV4IC0gMCBvciAxLlxuICAnICAgIGNvbnN0IHZlYzMgcXVhZF9wb3NpdGlvbnNbMTJdID0gdmVjM1sxMl0nLFxuICAnICAgICgnLFxuICAnICAgICAgICB2ZWMzKDAuMCwgMC4wLCAwLjApLCcsXG4gICcgICAgICAgIHZlYzMoMS4wLCAwLjAsIDAuMCksJyxcbiAgJyAgICAgICAgdmVjMygwLjAsIDEuMCwgMC4wKSwnLFxuXG4gICcgICAgICAgIHZlYzMoMC4wLCAxLjAsIDAuMCksJyxcbiAgJyAgICAgICAgdmVjMygxLjAsIDAuMCwgMC4wKSwnLFxuICAnICAgICAgICB2ZWMzKDEuMCwgMS4wLCAwLjApLCcsXG5cbiAgJyAgICAgICAgdmVjMygwLjAsIDAuMCwgMS4wKSwnLFxuICAnICAgICAgICB2ZWMzKDEuMCwgMC4wLCAxLjApLCcsXG4gICcgICAgICAgIHZlYzMoMC4wLCAxLjAsIDEuMCksJyxcblxuICAnICAgICAgICB2ZWMzKDAuMCwgMS4wLCAxLjApLCcsXG4gICcgICAgICAgIHZlYzMoMS4wLCAwLjAsIDEuMCksJyxcbiAgJyAgICAgICAgdmVjMygxLjAsIDEuMCwgMS4wKScsXG4gICcgICAgKTsnLFxuXG4gICcgICAgY29uc3QgdmVjMiBwb3Nfc2NhbGUgPSB2ZWMyKDAuNSwgMS4wKTsnLFxuICAnICAgIHZlYzIgZXllX29mZnNldCA9IHZlYzIoZXllX29mZnNldF94W2dsX1ZlcnRleElEXSwgMC4wKTsnLFxuICAnICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgoKHF1YWRfcG9zaXRpb25zW2dsX1ZlcnRleElEXS54eSAqIHVfc2NhbGUgKyB1X29mZnNldCkgKiBwb3Nfc2NhbGUgKiAyLjApIC0gMS4wICsgZXllX29mZnNldCwgMC4wLCAxLjApOycsXG4gICcgICAgdl90ZXhjb29yZCA9IHZlYzMocXVhZF9wb3NpdGlvbnNbZ2xfVmVydGV4SURdLnh5ICogdV9zY2FsZSArIHVfb2Zmc2V0LCBxdWFkX3Bvc2l0aW9uc1tnbF9WZXJ0ZXhJRF0ueik7JyxcbiAgJ30nLFxuXS5qb2luKCdcXG4nKTtcblxuY29uc3QgRlNNdWx0aXZpZXcgPSBbXG4gICcjdmVyc2lvbiAzMDAgZXMnLFxuICAndW5pZm9ybSBtZWRpdW1wIHNhbXBsZXIyREFycmF5IHVfc291cmNlX3RleHR1cmU7JyxcbiAgJ2luIG1lZGl1bXAgdmVjMyB2X3RleGNvb3JkOycsXG4gICdvdXQgbWVkaXVtcCB2ZWM0IG91dHB1dF9jb2xvcjsnLFxuXG4gICd2b2lkIG1haW4oKScsXG4gICd7JyxcbiAgJyAgICBvdXRwdXRfY29sb3IgPSB0ZXh0dXJlKHVfc291cmNlX3RleHR1cmUsIHZfdGV4Y29vcmQpOycsXG4gICd9Jyxcbl0uam9pbignXFxuJyk7XG5cbmV4cG9ydCBjbGFzcyBXZWJHTFN0ZXJlb1V0aWwge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBXZWJHTFN0ZXJlb1V0aWw7XG4gIHByaXZhdGUgX19nbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgLy8gcHJpdmF0ZSBfX3ZhbzogV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcbiAgcHJpdmF0ZSBfX3ZlcnRleFNoYWRlcj86IFdlYkdMU2hhZGVyO1xuICBwcml2YXRlIF9fZnJhZ21lbnRTaGFkZXI/OiBXZWJHTFNoYWRlcjtcbiAgcHJpdmF0ZSBfX3Byb2dyYW0/OiBXZWJHTFByb2dyYW07XG4gIHByaXZhdGUgX19hdHRyaWI/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICBwcml2YXRlIF9fdW5pZm9ybT86IFJlY29yZDxzdHJpbmcsIFdlYkdMVW5pZm9ybUxvY2F0aW9uPjtcblxuICBjb25zdHJ1Y3RvcihnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCkge1xuICAgIHRoaXMuX19nbCA9IGdsO1xuICAgIC8vIHRoaXMuX192YW8gPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpITtcbiAgICB0aGlzLl9fcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKSE7XG4gICAgdGhpcy5fX2F0dGFjaFNoYWRlclNvdXJjZShWU011bHRpdmlldywgZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgdGhpcy5fX2F0dGFjaFNoYWRlclNvdXJjZShGU011bHRpdmlldywgZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICB0aGlzLl9fZ2wubGlua1Byb2dyYW0odGhpcy5fX3Byb2dyYW0pO1xuICAgIHRoaXMuX19iaW5kQXR0cmliTG9jYXRpb24oe1xuICAgICAgdl90ZXhjb29yZDogMCxcbiAgICB9KTtcbiAgICB0aGlzLl9fZ2V0VW5pZm9ybUxvY2F0aW9ucygpO1xuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBXZWJHTFN0ZXJlb1V0aWwoZ2wpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIF9fYXR0YWNoU2hhZGVyU291cmNlKHNvdXJjZTogc3RyaW5nLCB0eXBlOiBudW1iZXIpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbDtcbiAgICBsZXQgc2hhZGVyO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIGdsLlZFUlRFWF9TSEFERVI6XG4gICAgICAgIHRoaXMuX192ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSkhO1xuICAgICAgICBzaGFkZXIgPSB0aGlzLl9fdmVydGV4U2hhZGVyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZ2wuRlJBR01FTlRfU0hBREVSOlxuICAgICAgICB0aGlzLl9fZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSkhO1xuICAgICAgICBzaGFkZXIgPSB0aGlzLl9fZnJhZ21lbnRTaGFkZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgTG9nZ2VyLmVycm9yKCdJbnZhbGlkIFNoYWRlciBUeXBlOiAnICsgdHlwZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5fX3Byb2dyYW0hLCBzaGFkZXIpO1xuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2JpbmRBdHRyaWJMb2NhdGlvbihhdHRyaWJMb2NhdGlvbk1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsO1xuXG4gICAgaWYgKGF0dHJpYkxvY2F0aW9uTWFwKSB7XG4gICAgICB0aGlzLl9fYXR0cmliID0ge307XG4gICAgICBmb3IgKGNvbnN0IGF0dHJpYk5hbWUgaW4gYXR0cmliTG9jYXRpb25NYXApIHtcbiAgICAgICAgZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHRoaXMuX19wcm9ncmFtISwgYXR0cmliTG9jYXRpb25NYXBbYXR0cmliTmFtZV0sIGF0dHJpYk5hbWUpO1xuICAgICAgICB0aGlzLl9fYXR0cmliW2F0dHJpYk5hbWVdID0gYXR0cmliTG9jYXRpb25NYXBbYXR0cmliTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX2dldFVuaWZvcm1Mb2NhdGlvbnMoKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2w7XG4gICAgaWYgKHRoaXMuX191bmlmb3JtID09IG51bGwpIHtcbiAgICAgIHRoaXMuX191bmlmb3JtID0ge307XG4gICAgICBjb25zdCB1bmlmb3JtQ291bnQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuX19wcm9ncmFtISwgZ2wuQUNUSVZFX1VOSUZPUk1TKTtcbiAgICAgIGxldCB1bmlmb3JtTmFtZSA9ICcnO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmlmb3JtQ291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCB1bmlmb3JtSW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0odGhpcy5fX3Byb2dyYW0hLCBpKSE7XG4gICAgICAgIHVuaWZvcm1OYW1lID0gdW5pZm9ybUluZm8ubmFtZS5yZXBsYWNlKCdbMF0nLCAnJyk7XG4gICAgICAgIHRoaXMuX191bmlmb3JtIVt1bmlmb3JtTmFtZV0gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5fX3Byb2dyYW0hLCB1bmlmb3JtTmFtZSkhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBibGl0KFxuICAgIHNvdXJjZV90ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgc291cmNlX3JlY3RfdXZfeDogbnVtYmVyLFxuICAgIHNvdXJjZV9yZWN0X3V2X3k6IG51bWJlcixcbiAgICBzb3VyY2VfcmVjdF91dl93aWR0aDogbnVtYmVyLFxuICAgIHNvdXJjZV9yZWN0X3V2X2hlaWdodDogbnVtYmVyLFxuICAgIGRlc3Rfc3VyZmFjZV93aWR0aDogbnVtYmVyLFxuICAgIGRlc3Rfc3VyZmFjZV9oZWlnaHQ6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbDtcbiAgICBjb25zdCBwcm9ncmFtID0gdGhpcy5fX3Byb2dyYW0hO1xuXG4gICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMTUpO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkRfQVJSQVksIHNvdXJjZV90ZXh0dXJlKTtcblxuICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICBjb25zdCBkZXB0aFRlc3RFbmFibGVkID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLkRFUFRIX1RFU1QpO1xuICAgIGNvbnN0IGRlcHRoTWFzayA9IGdsLmdldFBhcmFtZXRlcihnbC5ERVBUSF9XUklURU1BU0spO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgIGlmIChkZXB0aFRlc3RFbmFibGVkKSB7XG4gICAgICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIH1cbiAgICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgIGlmIChkZXB0aE1hc2spIHtcbiAgICAgIGdsLmRlcHRoTWFzayhmYWxzZSk7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLlZJRVdQT1JUKTtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBkZXN0X3N1cmZhY2Vfd2lkdGgsIGRlc3Rfc3VyZmFjZV9oZWlnaHQpO1xuXG4gICAgZ2wudW5pZm9ybTJmKHRoaXMuX191bmlmb3JtIVsndV9zY2FsZSddLCBzb3VyY2VfcmVjdF91dl93aWR0aCwgc291cmNlX3JlY3RfdXZfaGVpZ2h0KTtcbiAgICBnbC51bmlmb3JtMmYodGhpcy5fX3VuaWZvcm0hWyd1X29mZnNldCddLCBzb3VyY2VfcmVjdF91dl94LCBzb3VyY2VfcmVjdF91dl95KTtcbiAgICBnbC51bmlmb3JtMWkodGhpcy5fX3VuaWZvcm0hWyd1X3NvdXJjZV90ZXh0dXJlJ10sIDE1KTtcblxuICAgIC8vIGdsLmJpbmRWZXJ0ZXhBcnJheSh0aGlzLl9fdmFvKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFUywgMCwgMTIpO1xuXG4gICAgLy8gZ2wudXNlUHJvZ3JhbSgoZ2wgYXMgYW55KS5fX2xhc3RVc2VQcm9ncmFtKTtcbiAgICAoZ2wgYXMgYW55KS5fX2NoYW5nZWRQcm9ncmFtID0gdHJ1ZTtcblxuICAgIGdsLnZpZXdwb3J0KHZpZXdwb3J0WzBdLCB2aWV3cG9ydFsxXSwgdmlld3BvcnRbMl0sIHZpZXdwb3J0WzNdKTtcblxuICAgIGlmIChkZXB0aFRlc3RFbmFibGVkKSB7XG4gICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgfVxuICAgIGdsLmRlcHRoTWFzayhkZXB0aE1hc2spO1xuXG4gICAgZ2wuZmx1c2goKTtcbiAgfVxuICBwdWJsaWMgYmxpdEZha2UoXG4gICAgc291cmNlX3RleHR1cmU6IFdlYkdMVGV4dHVyZSxcbiAgICBzb3VyY2VfcmVjdF91dl94OiBudW1iZXIsXG4gICAgc291cmNlX3JlY3RfdXZfeTogbnVtYmVyLFxuICAgIHNvdXJjZV9yZWN0X3V2X3dpZHRoOiBudW1iZXIsXG4gICAgc291cmNlX3JlY3RfdXZfaGVpZ2h0OiBudW1iZXIsXG4gICAgZGVzdF9zdXJmYWNlX3dpZHRoOiBudW1iZXIsXG4gICAgZGVzdF9zdXJmYWNlX2hlaWdodDogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGdsID0gdGhpcy5fX2dsO1xuICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLl9fcHJvZ3JhbSE7XG5cbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUxNSk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRF9BUlJBWSwgc291cmNlX3RleHR1cmUpO1xuXG4gICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgIC8vIGNvbnN0IGRlcHRoVGVzdEVuYWJsZWQgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuREVQVEhfVEVTVCk7XG4gICAgLy8gY29uc3QgZGVwdGhNYXNrID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLkRFUFRIX1dSSVRFTUFTSyk7XG5cbiAgICAvLyBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgLy8gaWYgKGRlcHRoVGVzdEVuYWJsZWQpIHtcbiAgICAvLyAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgLy8gfVxuICAgIC8vIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICAvLyBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgLy8gaWYgKGRlcHRoTWFzaykge1xuICAgIC8vICAgZ2wuZGVwdGhNYXNrKGZhbHNlKTtcbiAgICAvLyB9XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuVklFV1BPUlQpO1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGRlc3Rfc3VyZmFjZV93aWR0aCwgZGVzdF9zdXJmYWNlX2hlaWdodCk7XG5cbiAgICBnbC51bmlmb3JtMmYodGhpcy5fX3VuaWZvcm0hWyd1X3NjYWxlJ10sIHNvdXJjZV9yZWN0X3V2X3dpZHRoLCBzb3VyY2VfcmVjdF91dl9oZWlnaHQpO1xuICAgIGdsLnVuaWZvcm0yZih0aGlzLl9fdW5pZm9ybSFbJ3Vfb2Zmc2V0J10sIHNvdXJjZV9yZWN0X3V2X3gsIHNvdXJjZV9yZWN0X3V2X3kpO1xuICAgIGdsLnVuaWZvcm0xaSh0aGlzLl9fdW5pZm9ybSFbJ3Vfc291cmNlX3RleHR1cmUnXSwgMTUpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCAxMik7XG5cbiAgICAvLyBnbC51c2VQcm9ncmFtKChnbCBhcyBhbnkpLl9fbGFzdFVzZVByb2dyYW0pO1xuICAgIChnbCBhcyBhbnkpLl9fY2hhbmdlZFByb2dyYW0gPSB0cnVlO1xuXG4gICAgZ2wudmlld3BvcnQodmlld3BvcnRbMF0sIHZpZXdwb3J0WzFdLCB2aWV3cG9ydFsyXSwgdmlld3BvcnRbM10pO1xuXG4gICAgLy8gaWYgKGRlcHRoVGVzdEVuYWJsZWQpIHtcbiAgICAvLyAgIGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAvLyB9XG4gICAgLy8gZ2wuZGVwdGhNYXNrKGRlcHRoTWFzayk7XG4gIH1cblxuICBibGl0MihzcmNUZXh0dXJlOiBXZWJHTFRleHR1cmUsIGRzdFRleHR1cmU6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuX19nbDtcblxuICAgIGNvbnN0IHJlYWRGcmFtZWJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gICAgY29uc3QgZHJhd0ZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICAvLyDjg5bjg6rjg4Pjg4jjga7plqLmlbBcbiAgICBmdW5jdGlvbiBibGl0VGV4dHVyZUFycmF5TGF5ZXIobGF5ZXI6IG51bWJlciwgeE9mZnNldDogbnVtYmVyKSB7XG4gICAgICAvLyBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHJlYWRGcmFtZWJ1ZmZlcik7XG4gICAgICAvLyBnbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihnbC5SRUFEX0ZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgc3JjVGV4dHVyZSwgMCwgbGF5ZXIpO1xuXG4gICAgICAvLyBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGRyYXdGcmFtZWJ1ZmZlcik7XG4gICAgICAvLyBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgIC8vICAgZ2wuRFJBV19GUkFNRUJVRkZFUixcbiAgICAgIC8vICAgZ2wuQ09MT1JfQVRUQUNITUVOVDAsXG4gICAgICAvLyAgIGdsLlRFWFRVUkVfMkQsXG4gICAgICAvLyAgIGRzdFRleHR1cmUsXG4gICAgICAvLyAgIDBcbiAgICAgIC8vICk7XG4gICAgICAvLyAvLyDjg5bjg6rjg4Pjg4hcbiAgICAgIC8vIGdsLmJsaXRGcmFtZWJ1ZmZlcihcbiAgICAgIC8vICAgMCxcbiAgICAgIC8vICAgMCxcbiAgICAgIC8vICAgd2lkdGgsXG4gICAgICAvLyAgIGhlaWdodCwgLy8g44K944O844K544Gu56+E5ZuyXG4gICAgICAvLyAgIHhPZmZzZXQsXG4gICAgICAvLyAgIDAsXG4gICAgICAvLyAgIHhPZmZzZXQgKyB3aWR0aCxcbiAgICAgIC8vICAgaGVpZ2h0LCAvLyDjgrPjg5Tjg7zlhYjjga7nr4Tlm7JcbiAgICAgIC8vICAgZ2wuQ09MT1JfQlVGRkVSX0JJVCxcbiAgICAgIC8vICAgZ2wuTkVBUkVTVFxuICAgICAgLy8gKTtcblxuICAgICAgLy8g44Os44Kk44Ok44O844GU44Go44Gr5YCL5Yil44Gu44OG44Kv44K544OB44Oj44KS5L2c5oiQXG4gICAgICBjb25zdCB0ZW1wVGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRlbXBUZXh0dXJlKTtcbiAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgbnVsbCk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG5cbiAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5SRUFEX0ZSQU1FQlVGRkVSLCByZWFkRnJhbWVidWZmZXIpO1xuICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoZ2wuUkVBRF9GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHNyY1RleHR1cmUsIDAsIGxheWVyKTtcblxuICAgICAgLy8g5LiA5pmC55qE44Gq44OG44Kv44K544OB44Oj44Gr44Os44Kk44Ok44O844KS44Kz44OU44O8XG4gICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgZHJhd0ZyYW1lYnVmZmVyKTtcbiAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgICBnbC5EUkFXX0ZSQU1FQlVGRkVSLFxuICAgICAgICBnbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgdGVtcFRleHR1cmUsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBnbC5ibGl0RnJhbWVidWZmZXIoMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZ2wuQ09MT1JfQlVGRkVSX0JJVCwgZ2wuTkVBUkVTVCk7XG5cbiAgICAgIC8vIOS4gOaZgueahOOBquODhuOCr+OCueODgeODo+OBi+OCieacgOe1guODhuOCr+OCueODgeODo+OBq+OCs+ODlOODvFxuICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgIGdsLlJFQURfRlJBTUVCVUZGRVIsXG4gICAgICAgIGdsLkNPTE9SX0FUVEFDSE1FTlQwLFxuICAgICAgICBnbC5URVhUVVJFXzJELFxuICAgICAgICB0ZW1wVGV4dHVyZSxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgICBnbC5EUkFXX0ZSQU1FQlVGRkVSLFxuICAgICAgICBnbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgZHN0VGV4dHVyZSxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGdsLmJsaXRGcmFtZWJ1ZmZlcihcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgeE9mZnNldCxcbiAgICAgICAgMCxcbiAgICAgICAgeE9mZnNldCArIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGdsLkNPTE9SX0JVRkZFUl9CSVQsXG4gICAgICAgIGdsLk5FQVJFU1RcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMOeVquebruOBruODrOOCpOODpOODvOOCkuW3puWBtOOBq+OCs+ODlOODvFxuICAgIGJsaXRUZXh0dXJlQXJyYXlMYXllcigwLCAwKTtcbiAgICAvLyAx55Wq55uu44Gu44Os44Kk44Ok44O844KS5Y+z5YG044Gr44Kz44OU44O8XG4gICAgYmxpdFRleHR1cmVBcnJheUxheWVyKDEsIHdpZHRoKTtcblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuL1dlYkdMQ29udGV4dFdyYXBwZXInO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IFdlYkdMUmVzb3VyY2VIYW5kbGUsIEluZGV4LCBDb3VudCwgQ0dBUElSZXNvdXJjZUhhbmRsZSB9IGZyb20gJy4uL3R5cGVzL0NvbW1vblR5cGVzJztcblxuZXhwb3J0IHR5cGUgU2hhZGVyU291cmNlcyA9IHtcbiAgdmVydGV4OiBzdHJpbmc7XG4gIHBpeGVsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYkdMU3RyYXRlZ3kge1xuICBhdHRhY2hHUFVEYXRhKHByaW1pdGl2ZTogUHJpbWl0aXZlKTogdm9pZDtcbiAgYXR0YWNoVmVydGV4RGF0YShcbiAgICBpOiBudW1iZXIsXG4gICAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gICAgZ2x3OiBXZWJHTENvbnRleHRXcmFwcGVyLFxuICAgIGluc3RhbmNlSURCdWZmZXJVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGVcbiAgKTogdm9pZDtcbiAgc2V0dXBTaGFkZXJGb3JNYXRlcmlhbChtYXRlcmlhbDogTWF0ZXJpYWwsIHByaW1pdGl2ZTogUHJpbWl0aXZlKTogQ0dBUElSZXNvdXJjZUhhbmRsZTtcbiAgX3JlU2V0dXBTaGFkZXJGb3JNYXRlcmlhbEJ5U3BlY3RvcihcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWwsXG4gICAgdXBkYXRlZFNoYWRlclNvdXJjZXM6IFNoYWRlclNvdXJjZXMsXG4gICAgb25FcnJvcjogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICApOiBDR0FQSVJlc291cmNlSGFuZGxlO1xufVxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsJztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgQWxwaGFNb2RlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9BbHBoYU1vZGUnO1xuaW1wb3J0IHsgSW5kZXgsIEluZGV4T2YxNkJ5dGVzIH0gZnJvbSAnLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgTW9kdWxlTWFuYWdlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi94ci9tYWluJztcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvVmVjdG9yNCc7XG5pbXBvcnQgeyBTaGFkZXJTZW1hbnRpY3MgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljcyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7IFNoYWRlclR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclR5cGUnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgV2ViR0xTdHJhdGVneSB9IGZyb20gJy4vV2ViR0xTdHJhdGVneSc7XG5pbXBvcnQgeyBXZWJYUlN5c3RlbSB9IGZyb20gJy4uL3hyL1dlYlhSU3lzdGVtJztcblxubGV0IGxhc3RJc1RyYW5zcGFyZW50TW9kZTogYm9vbGVhbjtcbmxldCBsYXN0QmxlbmRFcXVhdGlvbk1vZGU6IG51bWJlcjtcbmxldCBsYXN0QmxlbmRFcXVhdGlvbk1vZGVBbHBoYTogbnVtYmVyO1xubGV0IGxhc3RCbGVuZEZ1bmNTcmNGYWN0b3I6IG51bWJlcjtcbmxldCBsYXN0QmxlbmRGdW5jRHN0RmFjdG9yOiBudW1iZXI7XG5sZXQgbGFzdEJsZW5kRnVuY0FscGhhU3JjRmFjdG9yOiBudW1iZXI7XG5sZXQgbGFzdEJsZW5kRnVuY0FscGhhRHN0RmFjdG9yOiBudW1iZXI7XG5sZXQgbGFzdEN1bGxGYWNlOiBib29sZWFuO1xubGV0IGxhc3RGcm9udEZhY2VDQ1c6IGJvb2xlYW47XG5sZXQgbGFzdEFscGhhVG9Db3ZlcmFnZTogYm9vbGVhbjtcblxuZnVuY3Rpb24gc2V0V2ViR0xQYXJhbWV0ZXJzKG1hdGVyaWFsOiBNYXRlcmlhbCwgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBzZXRDdWxsKG1hdGVyaWFsLCBnbCk7XG4gIHNldEJsZW5kU2V0dGluZ3MobWF0ZXJpYWwsIGdsKTtcbiAgc2V0QWxwaGFUb0NvdmVyYWdlKG1hdGVyaWFsLCBnbCk7XG59XG5cbmZ1bmN0aW9uIHNldEN1bGwobWF0ZXJpYWw6IE1hdGVyaWFsLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNvbnN0IGN1bGxGYWNlID0gbWF0ZXJpYWwuY3VsbEZhY2U7XG4gIGNvbnN0IGN1bGxGcm9udEZhY2VDQ1cgPSBtYXRlcmlhbC5jdWxsRnJvbnRGYWNlQ0NXO1xuXG4gIGlmIChsYXN0Q3VsbEZhY2UgIT09IGN1bGxGYWNlKSB7XG4gICAgaWYgKGN1bGxGYWNlKSB7XG4gICAgICBnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wuZGlzYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgIH1cbiAgICBsYXN0Q3VsbEZhY2UgPSBjdWxsRmFjZTtcbiAgfVxuXG4gIGlmIChjdWxsRmFjZSA9PT0gdHJ1ZSAmJiBsYXN0RnJvbnRGYWNlQ0NXICE9PSBjdWxsRnJvbnRGYWNlQ0NXKSB7XG4gICAgaWYgKGN1bGxGcm9udEZhY2VDQ1cpIHtcbiAgICAgIGdsLmZyb250RmFjZShnbC5DQ1cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbC5mcm9udEZhY2UoZ2wuQ1cpO1xuICAgIH1cbiAgICBsYXN0RnJvbnRGYWNlQ0NXID0gY3VsbEZyb250RmFjZUNDVztcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRCbGVuZFNldHRpbmdzKG1hdGVyaWFsOiBNYXRlcmlhbCwgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjb25zdCBpc0JsZW5kTW9kZSA9IG1hdGVyaWFsLmlzQmxlbmQoKTtcbiAgaWYgKGxhc3RJc1RyYW5zcGFyZW50TW9kZSAhPT0gaXNCbGVuZE1vZGUpIHtcbiAgICBpZiAoaXNCbGVuZE1vZGUpIHtcbiAgICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIH1cbiAgICBsYXN0SXNUcmFuc3BhcmVudE1vZGUgPSBpc0JsZW5kTW9kZTtcbiAgfVxuXG4gIGlmIChtYXRlcmlhbC5hbHBoYU1vZGUgPT09IEFscGhhTW9kZS5CbGVuZCkge1xuICAgIHNldEJsZW5kRXF1YXRpb25Nb2RlKFxuICAgICAgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbk1vZGUuaW5kZXgsXG4gICAgICBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uTW9kZUFscGhhLmluZGV4LFxuICAgICAgZ2xcbiAgICApO1xuICAgIHNldEJsZW5kRnVuY1NyY0ZhY3RvcihcbiAgICAgIG1hdGVyaWFsLmJsZW5kRnVuY1NyY0ZhY3Rvci5pbmRleCxcbiAgICAgIG1hdGVyaWFsLmJsZW5kRnVuY0RzdEZhY3Rvci5pbmRleCxcbiAgICAgIG1hdGVyaWFsLmJsZW5kRnVuY0FscGhhU3JjRmFjdG9yLmluZGV4LFxuICAgICAgbWF0ZXJpYWwuYmxlbmRGdW5jQWxwaGFEc3RGYWN0b3IuaW5kZXgsXG4gICAgICBnbFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0QmxlbmRFcXVhdGlvbk1vZGUoXG4gIGJsZW5kRXF1YXRpb25Nb2RlOiBudW1iZXIsXG4gIGJsZW5kRXF1YXRpb25Nb2RlQWxwaGE6IG51bWJlcixcbiAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxuKSB7XG4gIGNvbnN0IG5lZWRVcGRhdGVCbGVuZEVxdWF0aW9uID0gZGlmZmVyZW50V2l0aExhc3RCbGVuZEVxdWF0aW9uKFxuICAgIGJsZW5kRXF1YXRpb25Nb2RlLFxuICAgIGJsZW5kRXF1YXRpb25Nb2RlQWxwaGFcbiAgKTtcbiAgaWYgKG5lZWRVcGRhdGVCbGVuZEVxdWF0aW9uKSB7XG4gICAgZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKGJsZW5kRXF1YXRpb25Nb2RlLCBibGVuZEVxdWF0aW9uTW9kZUFscGhhKTtcbiAgICBsYXN0QmxlbmRFcXVhdGlvbk1vZGUgPSBibGVuZEVxdWF0aW9uTW9kZTtcbiAgICBsYXN0QmxlbmRFcXVhdGlvbk1vZGVBbHBoYSA9IGJsZW5kRXF1YXRpb25Nb2RlQWxwaGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZmVyZW50V2l0aExhc3RCbGVuZEVxdWF0aW9uKGVxdWF0aW9uTW9kZTogbnVtYmVyLCBlcXVhdGlvbk1vZGVBbHBoYTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgbGFzdEJsZW5kRXF1YXRpb25Nb2RlICE9PSBlcXVhdGlvbk1vZGUgfHwgbGFzdEJsZW5kRXF1YXRpb25Nb2RlQWxwaGEgIT09IGVxdWF0aW9uTW9kZUFscGhhO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXRCbGVuZEZ1bmNTcmNGYWN0b3IoXG4gIGJsZW5kRnVuY1NyY0ZhY3RvcjogbnVtYmVyLFxuICBibGVuZEZ1bmNEc3RGYWN0b3I6IG51bWJlcixcbiAgYmxlbmRGdW5jQWxwaGFTcmNGYWN0b3I6IG51bWJlcixcbiAgYmxlbmRGdW5jQWxwaGFEc3RGYWN0b3I6IG51bWJlcixcbiAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxuKSB7XG4gIGNvbnN0IG5lZWRVcGRhdGVCbGVuZEZ1bmMgPSBkaWZmZXJlbnRXaXRoTGFzdEJsZW5kRnVuY0ZhY3RvcihcbiAgICBibGVuZEZ1bmNTcmNGYWN0b3IsXG4gICAgYmxlbmRGdW5jRHN0RmFjdG9yLFxuICAgIGJsZW5kRnVuY0FscGhhU3JjRmFjdG9yLFxuICAgIGJsZW5kRnVuY0FscGhhRHN0RmFjdG9yXG4gICk7XG4gIGlmIChuZWVkVXBkYXRlQmxlbmRGdW5jKSB7XG4gICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoXG4gICAgICBibGVuZEZ1bmNTcmNGYWN0b3IsXG4gICAgICBibGVuZEZ1bmNEc3RGYWN0b3IsXG4gICAgICBibGVuZEZ1bmNBbHBoYVNyY0ZhY3RvcixcbiAgICAgIGJsZW5kRnVuY0FscGhhRHN0RmFjdG9yIVxuICAgICk7XG4gICAgbGFzdEJsZW5kRnVuY1NyY0ZhY3RvciA9IGJsZW5kRnVuY1NyY0ZhY3RvcjtcbiAgICBsYXN0QmxlbmRGdW5jRHN0RmFjdG9yID0gYmxlbmRGdW5jRHN0RmFjdG9yO1xuICAgIGxhc3RCbGVuZEZ1bmNBbHBoYVNyY0ZhY3RvciA9IGJsZW5kRnVuY0FscGhhU3JjRmFjdG9yO1xuICAgIGxhc3RCbGVuZEZ1bmNBbHBoYURzdEZhY3RvciA9IGJsZW5kRnVuY0FscGhhRHN0RmFjdG9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZlcmVudFdpdGhMYXN0QmxlbmRGdW5jRmFjdG9yKFxuICBzcmNGYWN0b3I6IG51bWJlcixcbiAgZHN0RmFjdG9yOiBudW1iZXIsXG4gIGFscGhhU3JjRmFjdG9yOiBudW1iZXIsXG4gIGFscGhhRHN0RmFjdG9yOiBudW1iZXJcbik6IGJvb2xlYW4ge1xuICBjb25zdCByZXN1bHQgPVxuICAgIGxhc3RCbGVuZEZ1bmNTcmNGYWN0b3IgIT09IHNyY0ZhY3RvciB8fFxuICAgIGxhc3RCbGVuZEZ1bmNEc3RGYWN0b3IgIT09IGRzdEZhY3RvciB8fFxuICAgIGxhc3RCbGVuZEZ1bmNBbHBoYVNyY0ZhY3RvciAhPT0gYWxwaGFTcmNGYWN0b3IgfHxcbiAgICBsYXN0QmxlbmRGdW5jQWxwaGFEc3RGYWN0b3IgIT09IGFscGhhRHN0RmFjdG9yO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXRBbHBoYVRvQ292ZXJhZ2UobWF0ZXJpYWw6IE1hdGVyaWFsLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNvbnN0IGFscGhhVG9Db3ZlcmFnZSA9IG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZTtcbiAgaWYgKGFscGhhVG9Db3ZlcmFnZSAhPT0gbGFzdEFscGhhVG9Db3ZlcmFnZSkge1xuICAgIGlmIChhbHBoYVRvQ292ZXJhZ2UpIHtcbiAgICAgIGdsLmVuYWJsZShnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbC5kaXNhYmxlKGdsLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk7XG4gICAgfVxuICAgIGxhc3RBbHBoYVRvQ292ZXJhZ2UgPSBhbHBoYVRvQ292ZXJhZ2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnQocmVuZGVyUGFzczogUmVuZGVyUGFzcykge1xuICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeTogV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgPSBXZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBsZXQgdmlld3BvcnQgPSByZW5kZXJQYXNzLmdldFZpZXdwb3J0KCkgYXMgVmVjdG9yNDtcbiAgaWYgKHZpZXdwb3J0ID09IG51bGwpIHtcbiAgICB2aWV3cG9ydCA9IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmN1cnJlbnRXZWJHTENvbnRleHRXcmFwcGVyIS5kZWZhdWx0Vmlld3BvcnQ7XG4gIH1cbiAgcmV0dXJuIHZpZXdwb3J0ITtcbn1cblxuZnVuY3Rpb24gc2V0VlJWaWV3cG9ydChyZW5kZXJQYXNzOiBSZW5kZXJQYXNzLCBkaXNwbGF5SWR4OiBJbmRleCkge1xuICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeTogV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgPSBXZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBjb25zdCByblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSO1xuICBjb25zdCB3ZWJ4clN5c3RlbSA9IHJuWFJNb2R1bGUuV2ViWFJTeXN0ZW0uZ2V0SW5zdGFuY2UoKTtcbiAgaWYgKHdlYnhyU3lzdGVtLmlzV2ViWFJNb2RlKSB7XG4gICAgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0Vmlld3BvcnQod2VieHJTeXN0ZW0uX2dldFZpZXdwb3J0QXQoZGlzcGxheUlkeCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERpc3BsYXlDb3VudChpc1ZSTWFpblBhc3M6IGJvb2xlYW4sIHdlYnhyU3lzdGVtOiBXZWJYUlN5c3RlbSk6IDEgfCAyIHtcbiAgaWYgKHdlYnhyU3lzdGVtLmlzV2ViWFJNb2RlKSB7XG4gICAgaWYgKHdlYnhyU3lzdGVtLmlzTXVsdGlWaWV3KCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoaXNWUk1haW5QYXNzKSB7XG4gICAgICByZXR1cm4gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVnJNYWluUGFzcyhyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gIGNvbnN0IHJuWFJNb2R1bGUgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kdWxlKCd4cicpIGFzIFJuWFI7XG4gIGNvbnN0IGlzVlJNYWluUGFzcyA9XG4gICAgcm5YUk1vZHVsZT8uV2ViWFJTeXN0ZW0uZ2V0SW5zdGFuY2UoKS5pc1dlYlhSTW9kZSAmJiByZW5kZXJQYXNzLmlzVnJSZW5kZXJpbmc7XG4gIHJldHVybiBpc1ZSTWFpblBhc3M7XG59XG5cbmZ1bmN0aW9uIGdldFBvaW50U3ByaXRlU2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHNlbWFudGljOiAncG9pbnRTaXplJyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhcixcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogU2NhbGFyLmZyb21Db3B5TnVtYmVyKDMwLjApLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VtYW50aWM6ICdwb2ludERpc3RhbmNlQXR0ZW51YXRpb24nLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuVmVjMyxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5QaXhlbFNoYWRlcixcbiAgICAgIGluaXRpYWxWYWx1ZTogVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLjAsIDAuMSwgMC4wMV0pLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IGZhbHNlLFxuICAgIH0sXG4gIF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFNoYWRlclByb2dyYW0oXG4gIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgcHJpbWl0aXZlOiBQcmltaXRpdmUsXG4gIHdlYmdsU3RyYXRlZ3k6IFdlYkdMU3RyYXRlZ3lcbik6IHZvaWQge1xuICBpZiAobWF0ZXJpYWwgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChtYXRlcmlhbC5pc1NoYWRlclByb2dyYW1SZWFkeShwcmltaXRpdmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmltaXRpdmU/Ll9iYWNrdXBNYXRlcmlhbCgpO1xuICAgIHdlYmdsU3RyYXRlZ3kuc2V0dXBTaGFkZXJGb3JNYXRlcmlhbChtYXRlcmlhbCwgcHJpbWl0aXZlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBzaGFkZXIgY29tcGlsYXRpb24gZXJyb3IgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgaW4gdGhlIG1pZGRsZSBvZiBzaGFkZXIgZWRpdGluZy5cbiAgICAvLyBJbiB0aGlzIGNhc2UsIHJlc3RvcmUgdGhlIHNoYWRlcnMgZnJvbSBhIGJhY2t1cCBvZiB0aGUgdmFsaWQgbWF0ZXJpYWwuXG4gICAgY29uc29sZS5sb2coZSk7XG4gICAgcHJpbWl0aXZlPy5fcmVzdG9yZU1hdGVyaWFsKCk7XG4gICAgd2ViZ2xTdHJhdGVneS5zZXR1cFNoYWRlckZvck1hdGVyaWFsKG1hdGVyaWFsLCBwcmltaXRpdmUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5mcmVlemUoe1xuICBzZXRXZWJHTFBhcmFtZXRlcnMsXG4gIHNldFZSVmlld3BvcnQsXG4gIGdldERpc3BsYXlDb3VudCxcbiAgaXNWck1haW5QYXNzLFxuICBnZXRQb2ludFNwcml0ZVNoYWRlclNlbWFudGljc0luZm9BcnJheSxcbn0pO1xuIiwiaW1wb3J0IHsgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvTWVtb3J5TWFuYWdlcic7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21lbW9yeS9CdWZmZXInO1xuaW1wb3J0IHsgUGl4ZWxGb3JtYXQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1BpeGVsRm9ybWF0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVGV4dHVyZVBhcmFtZXRlcic7XG5pbXBvcnQgeyBCdWZmZXJVc2UgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0J1ZmZlclVzZSc7XG5pbXBvcnQgeyBTaGFkZXJTb3VyY2VzLCBXZWJHTFN0cmF0ZWd5IH0gZnJvbSAnLi9XZWJHTFN0cmF0ZWd5JztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaC9NZXNoQ29tcG9uZW50JztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuL1dlYkdMQ29udGV4dFdyYXBwZXInO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcywgU2hhZGVyU2VtYW50aWNzTmFtZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvQ29tcG9uZW50JztcbmltcG9ydCB7IFNjZW5lR3JhcGhDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvU2NlbmVHcmFwaC9TY2VuZUdyYXBoQ29tcG9uZW50JztcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9mb3VuZGF0aW9uL2dlb21ldHJ5L01lc2gnO1xuaW1wb3J0IHsgTWVzaFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL01lc2hSZW5kZXJlci9NZXNoUmVuZGVyZXJDb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBXZWJHTFJlc291cmNlSGFuZGxlLFxuICBJbmRleCxcbiAgQ0dBUElSZXNvdXJjZUhhbmRsZSxcbiAgQ291bnQsXG4gIEluZGV4T2YxNkJ5dGVzLFxuICBJbmRleE9mNEJ5dGVzLFxuICBQcmltaXRpdmVVSUQsXG59IGZyb20gJy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IEdsb2JhbERhdGFSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL0dsb2JhbERhdGFSZXBvc2l0b3J5JztcbmltcG9ydCB7IFZlY3Rvck4gfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvVmVjdG9yTic7XG5pbXBvcnQgeyBXZWxsS25vd25Db21wb25lbnRUSURzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL1dlbGxLbm93bkNvbXBvbmVudFRJRHMnO1xuaW1wb3J0IHsgTWlzY1V0aWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvTWlzY1V0aWwnO1xuaW1wb3J0IFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QsIHsgc2V0dXBTaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi9XZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kJztcbmltcG9ydCB7IE1vZHVsZU1hbmFnZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3N5c3RlbS9Nb2R1bGVNYW5hZ2VyJztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi94ci9tYWluJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL0lzJztcbmltcG9ydCB7IExpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0xpZ2h0L0xpZ2h0Q29tcG9uZW50JztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgTWF0ZXJpYWxSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbFJlcG9zaXRvcnknO1xuaW1wb3J0IHsgaXNTa2lwRHJhd2luZywgdXBkYXRlVkJPQW5kVkFPIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9yZW5kZXJlci9SZW5kZXJpbmdDb21tb25NZXRob2RzJztcbmltcG9ydCB7IENHQVBJU3RyYXRlZ3kgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJU3RyYXRlZ3knO1xuaW1wb3J0IHsgQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmFDb250cm9sbGVyL0NhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNmb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL1RyYW5zZm9ybS9UcmFuc2Zvcm1Db21wb25lbnQnO1xuaW1wb3J0IHsgV2ViWFJTeXN0ZW0gfSBmcm9tICcuLi94cic7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0FuaW1hdGlvbi9BbmltYXRpb25Db21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dHVyZUZvcm1hdCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvTG9nZ2VyJztcblxuZGVjbGFyZSBjb25zdCBzcGVjdG9yOiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUgaW1wbGVtZW50cyBDR0FQSVN0cmF0ZWd5LCBXZWJHTFN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pbnN0YW5jZTogV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlO1xuICBwcml2YXRlIF9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnk6IFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID1cbiAgICBXZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBwcml2YXRlIF9fZGF0YVRleHR1cmVVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgcHJpdmF0ZSBfX2RhdGFVQk9VaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgcHJpdmF0ZSBfX2xhc3RTaGFkZXI6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgcHJpdmF0ZSBfX2xhc3RNYXRlcmlhbD86IFdlYWtSZWY8TWF0ZXJpYWw+O1xuICBwcml2YXRlIF9fbGFzdE1hdGVyaWFsU3RhdGVWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgc3RhdGljIF9fc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICBwcml2YXRlIF9fbGFzdFJlbmRlclBhc3NUaWNrQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xpZ2h0Q29tcG9uZW50cz86IExpZ2h0Q29tcG9uZW50W107XG4gIHByaXZhdGUgc3RhdGljIF9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX2N1cnJlbnRDb21wb25lbnRTSURzPzogVmVjdG9yTjtcbiAgcHVibGljIF90b3RhbFNpemVPZkdQVVNoYWRlckRhdGFTdG9yYWdlRXhjZXB0TW9ycGhEYXRhID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pc0RlYnVnT3BlcmF0aW9uVG9EYXRhVGV4dHVyZUJ1ZmZlckRvbmUgPSB0cnVlO1xuICBwcml2YXRlIHN0YXRpYyBfX3dlYnhyU3lzdGVtOiBXZWJYUlN5c3RlbTtcblxuICBwcml2YXRlIF9fbGFzdE1hdGVyaWFsc1VwZGF0ZUNvdW50ID0gLTE7XG4gIHByaXZhdGUgX19sYXN0VHJhbnNmb3JtQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gLTE7XG4gIHByaXZhdGUgX19sYXN0U2NlbmVHcmFwaENvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuICBwcml2YXRlIF9fbGFzdENhbWVyYUNvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgc3RhdGljIGR1bXBEYXRhVGV4dHVyZUJ1ZmZlcigpIHtcbiAgICB0aGlzLl9faXNEZWJ1Z09wZXJhdGlvblRvRGF0YVRleHR1cmVCdWZmZXJEb25lID0gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZ2V0VmVydGV4U2hhZGVyTWV0aG9kRGVmaW5pdGlvbnNfZGF0YVRleHR1cmUoKSB7XG4gICAgcmV0dXJuIGBcblxuICBtYXQ0IGdldF93b3JsZE1hdHJpeChmbG9hdCBpbnN0YW5jZUlkKVxuICB7XG4gICAgaW50IGluZGV4ID0gJHtDb21wb25lbnQuZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mQ29tcG9uZW50KFxuICAgICAgU2NlbmVHcmFwaENvbXBvbmVudCxcbiAgICAgICd3b3JsZE1hdHJpeCdcbiAgICApfSArIDQgKiBpbnQoaW5zdGFuY2VJZCk7XG4gICAgbWF0NCBtYXRyaXggPSBmZXRjaE1hdDQoaW5kZXgpO1xuXG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG5cbiAgbWF0MyBnZXRfbm9ybWFsTWF0cml4KGZsb2F0IGluc3RhbmNlSWQpIHtcbiAgICBpbnQgaW5kZXggPSAke0NvbXBvbmVudC5nZXRMb2NhdGlvbk9mZnNldE9mTWVtYmVyT2ZDb21wb25lbnQoXG4gICAgICBTY2VuZUdyYXBoQ29tcG9uZW50LFxuICAgICAgJ25vcm1hbE1hdHJpeCdcbiAgICApfSAqIDQgKyA5ICogaW50KGluc3RhbmNlSWQpO1xuICAgIG1hdDMgbWF0cml4ID0gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbmRleCk7XG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIGJvb2wgZ2V0X2lzVmlzaWJsZShmbG9hdCBpbnN0YW5jZUlkKSB7XG4gICAgaW50IGluZGV4ID0gJHtDb21wb25lbnQuZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mQ29tcG9uZW50KFxuICAgICAgU2NlbmVHcmFwaENvbXBvbmVudCxcbiAgICAgICdpc1Zpc2libGUnXG4gICAgKX0gKiA0ICsgaW50KGluc3RhbmNlSWQpO1xuICAgIGZsb2F0IHZpc2liaWxpdHkgPSBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW5kZXgpO1xuICAgIHJldHVybiAodmlzaWJpbGl0eSA+IDAuNSkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBib29sIGdldF9pc0JpbGxib2FyZChmbG9hdCBpbnN0YW5jZUlkKSB7XG4gICAgaW50IGluZGV4ID0gJHtDb21wb25lbnQuZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mQ29tcG9uZW50KFxuICAgICAgU2NlbmVHcmFwaENvbXBvbmVudCxcbiAgICAgICdpc0JpbGxib2FyZCdcbiAgICApfSAqIDQgKyBpbnQoaW5zdGFuY2VJZCk7XG4gICAgZmxvYXQgaXNCaWxsYm9hcmQgPSBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW5kZXgpO1xuICAgIHJldHVybiAoaXNCaWxsYm9hcmQgPiAwLjUpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiNpZmRlZiBSTl9JU19WRVJURVhfU0hBREVSXG4gICNpZmRlZiBSTl9JU19NT1JQSElOR1xuICB2ZWMzIGdldF9wb3NpdGlvbihmbG9hdCB2ZXJ0ZXhJZCwgdmVjMyBiYXNlUG9zaXRpb24pIHtcbiAgICB2ZWMzIHBvc2l0aW9uID0gYmFzZVBvc2l0aW9uO1xuICAgIGludCBzY2FsYXJfaWR4ID0gMyAqIGludCh2ZXJ0ZXhJZCk7XG4gICAgZm9yIChpbnQgaT0wOyBpPCR7Q29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXJ9OyBpKyspIHtcblxuICAgICAgaW50IGJhc2VQb3NJbjRieXRlcyA9IHVfZGF0YVRleHR1cmVNb3JwaE9mZnNldFBvc2l0aW9uW2ldICogNCArIHNjYWxhcl9pZHg7XG4gICAgICB2ZWMzIGFkZFBvcyA9IGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoYmFzZVBvc0luNGJ5dGVzKTtcblxuICAgICAgcG9zaXRpb24gKz0gYWRkUG9zICogdV9tb3JwaFdlaWdodHNbaV07XG4gICAgICBpZiAoaSA9PSB1X21vcnBoVGFyZ2V0TnVtYmVyLTEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG4gICNlbmRpZlxuI2VuZGlmXG5gO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldHVwIHNoYWRlciBwcm9ncmFtIGZvciB0aGUgbWF0ZXJpYWwgaW4gdGhpcyBXZWJHTCBzdHJhdGVneVxuICAgKiBAcGFyYW0gbWF0ZXJpYWwgLSBhIG1hdGVyaWFsIHRvIHNldHVwIHNoYWRlciBwcm9ncmFtXG4gICAqL1xuICBwdWJsaWMgc2V0dXBTaGFkZXJGb3JNYXRlcmlhbChtYXRlcmlhbDogTWF0ZXJpYWwsIHByaW1pdGl2ZTogUHJpbWl0aXZlKTogQ0dBUElSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBXZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGdsdyA9IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmN1cnJlbnRXZWJHTENvbnRleHRXcmFwcGVyITtcblxuICAgIGNvbnN0IFtwcm9ncmFtVWlkLCBuZXdPbmVdID0gbWF0ZXJpYWwuX2NyZWF0ZVByb2dyYW1XZWJHTChcbiAgICAgIFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5nZXRWZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9uc19kYXRhVGV4dHVyZSgpLFxuICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fZ2V0U2hhZGVyUHJvcGVydHksXG4gICAgICBwcmltaXRpdmUsXG4gICAgICBnbHcuaXNXZWJHTDJcbiAgICApO1xuXG4gICAgaWYgKG5ld09uZSkge1xuICAgICAgbWF0ZXJpYWwuX3NldHVwQmFzaWNVbmlmb3Jtc0xvY2F0aW9ucyhwcmltaXRpdmUpO1xuXG4gICAgICBtYXRlcmlhbC5fc2V0VW5pZm9ybUxvY2F0aW9uc09mTWF0ZXJpYWxOb2RlcyhmYWxzZSwgcHJpbWl0aXZlKTtcblxuICAgICAgbWF0ZXJpYWwuX3NldHVwQWRkaXRpb25hbFVuaWZvcm1Mb2NhdGlvbnMoXG4gICAgICAgIFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QuZ2V0UG9pbnRTcHJpdGVTaGFkZXJTZW1hbnRpY3NJbmZvQXJyYXkoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHByaW1pdGl2ZVxuICAgICAgKTtcblxuICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuX3NldFVuaWZvcm1Mb2NhdGlvbnNGb3JEYXRhVGV4dHVyZU1vZGVPbmx5KFxuICAgICAgICBtYXRlcmlhbC5nZXRTaGFkZXJQcm9ncmFtVWlkKHByaW1pdGl2ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2dyYW1VaWQ7XG4gIH1cblxuICAvKipcbiAgICogcmUtc2V0dXAgc2hhZGVyIHByb2dyYW0gZm9yIHRoZSBtYXRlcmlhbCBpbiB0aGlzIFdlYkdMIHN0cmF0ZWd5XG4gICAqIEBwYXJhbSBtYXRlcmlhbCAtIGEgbWF0ZXJpYWwgdG8gcmUtc2V0dXAgc2hhZGVyIHByb2dyYW1cbiAgICogQHBhcmFtIHVwZGF0ZWRTaGFkZXJTb3VyY2VzIC0gdXBkYXRlZCBzaGFkZXIgc291cmNlc1xuICAgKiBAcGFyYW0gb25FcnJvciAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBlcnJvclxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIF9yZVNldHVwU2hhZGVyRm9yTWF0ZXJpYWxCeVNwZWN0b3IoXG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICAgIHVwZGF0ZWRTaGFkZXJTb3VyY2VzOiBTaGFkZXJTb3VyY2VzLFxuICAgIG9uRXJyb3I6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogQ0dBUElSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3QgW3Byb2dyYW1VaWQsIG5ld09uZV0gPSBtYXRlcmlhbC5fY3JlYXRlUHJvZ3JhbUJ5VXBkYXRlZFNvdXJjZXMoXG4gICAgICB1cGRhdGVkU2hhZGVyU291cmNlcyxcbiAgICAgIG9uRXJyb3JcbiAgICApO1xuICAgIGlmIChwcm9ncmFtVWlkID09PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgcmV0dXJuIHByb2dyYW1VaWQ7XG4gICAgfVxuXG4gICAgaWYgKG5ld09uZSkge1xuICAgICAgbWF0ZXJpYWwuX3NldHVwQmFzaWNVbmlmb3Jtc0xvY2F0aW9ucygpO1xuXG4gICAgICBtYXRlcmlhbC5fc2V0VW5pZm9ybUxvY2F0aW9uc09mTWF0ZXJpYWxOb2RlcyhmYWxzZSk7XG5cbiAgICAgIG1hdGVyaWFsLl9zZXR1cEFkZGl0aW9uYWxVbmlmb3JtTG9jYXRpb25zKFxuICAgICAgICBXZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kLmdldFBvaW50U3ByaXRlU2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KCksXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cblxuICAgIFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5fX2dsb2JhbERhdGFSZXBvc2l0b3J5Ll9zZXRVbmlmb3JtTG9jYXRpb25zRm9yRGF0YVRleHR1cmVNb2RlT25seShcbiAgICAgIG1hdGVyaWFsLmdldFNoYWRlclByb2dyYW1VaWQoKVxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvZ3JhbVVpZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9fZ2V0U2hhZGVyUHJvcGVydHkoXG4gICAgbWF0ZXJpYWxUeXBlTmFtZTogc3RyaW5nLFxuICAgIGluZm86IFNoYWRlclNlbWFudGljc0luZm8sXG4gICAgaXNHbG9iYWxEYXRhOiBib29sZWFuLFxuICAgIGlzV2ViR0wyOiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBpbmZvLmNvbXBvc2l0aW9uVHlwZS5nZXRHbHNsU3RyKGluZm8uY29tcG9uZW50VHlwZSk7XG5cbiAgICBsZXQgaW5kZXhTdHI7XG5cbiAgICBjb25zdCBpc1RleHR1cmUgPSBDb21wb3NpdGlvblR5cGUuaXNUZXh0dXJlKGluZm8uY29tcG9zaXRpb25UeXBlKTtcblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBpbmZvLnNlbWFudGljLnJlcGxhY2UoJy4nLCAnXycpO1xuXG4gICAgLy8gZGVmaW5pdGlvbiBvZiB1bmlmb3JtIHZhcmlhYmxlIGZvciB0ZXh0dXJlIHNhbXBsZXIgb3Igd2hhdCBtdXN0IGJlIGV4cGxpY2l0bHkgdW5pZm9ybSB2YXJpYWJsKVxuICAgIGxldCB2YXJEZWYgPSAnJztcbiAgICBjb25zdCB2YXJUeXBlID0gaW5mby5jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cihpbmZvLmNvbXBvbmVudFR5cGUpO1xuICAgIGxldCB2YXJJbmRleFN0ciA9ICcnO1xuICAgIGlmIChpbmZvLmFycmF5TGVuZ3RoKSB7XG4gICAgICB2YXJJbmRleFN0ciA9IGBbJHtpbmZvLmFycmF5TGVuZ3RofV1gO1xuICAgIH1cbiAgICBpZiAoaW5mby5uZWVkVW5pZm9ybUluRGF0YVRleHR1cmVNb2RlIHx8IGlzVGV4dHVyZSkge1xuICAgICAgdmFyRGVmID0gYCAgdW5pZm9ybSAke3ZhclR5cGV9IHVfJHttZXRob2ROYW1lfSR7dmFySW5kZXhTdHJ9O1xcbmA7XG4gICAgfVxuXG4gICAgLy8gaW5uZXIgY29udGVudHMgb2YgJ2dldF8nIHNoYWRlciBmdW5jdGlvblxuICAgIGNvbnN0IHZlYzRTaXplT2ZQcm9wZXJ0eTogSW5kZXhPZjE2Qnl0ZXMgPSBpbmZvLmNvbXBvc2l0aW9uVHlwZS5nZXRWZWM0U2l6ZU9mUHJvcGVydHkoKTtcbiAgICAvLyBmb3Igbm9uLWBpbmRleGAgcHJvcGVydHkgKHRoaXMgaXMgZ2VuZXJhbCBjYXNlKVxuICAgIGNvbnN0IHNjYWxhclNpemVPZlByb3BlcnR5OiBJbmRleE9mNEJ5dGVzID0gaW5mby5jb21wb3NpdGlvblR5cGUuZ2V0TnVtYmVyT2ZDb21wb25lbnRzKCk7XG4gICAgY29uc3Qgb2Zmc2V0T2ZQcm9wZXJ0eTogSW5kZXhPZjE2Qnl0ZXMgPSBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuZ2V0T2Zmc2V0T2ZQcm9wZXJ0eUluU2hhZGVyKFxuICAgICAgaXNHbG9iYWxEYXRhLFxuICAgICAgaW5mby5zZW1hbnRpYyxcbiAgICAgIG1hdGVyaWFsVHlwZU5hbWVcbiAgICApO1xuXG4gICAgaWYgKG9mZnNldE9mUHJvcGVydHkgPT09IC0xKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ0NvdWxkIG5vdCBnZXQgdGhlIGxvY2F0aW9uIG9mZnNldCBvZiB0aGUgcHJvcGVydHkuJyk7XG4gICAgfVxuXG4gICAgbGV0IGluc3RhbmNlU2l6ZSA9IHZlYzRTaXplT2ZQcm9wZXJ0eTtcbiAgICBpbmRleFN0ciA9IGBpbnQgdmVjNF9pZHggPSAke29mZnNldE9mUHJvcGVydHl9ICsgJHtpbnN0YW5jZVNpemV9ICogaW5zdGFuY2VJZDtcXG5gO1xuICAgIGlmIChDb21wb3NpdGlvblR5cGUuaXNBcnJheShpbmZvLmNvbXBvc2l0aW9uVHlwZSkpIHtcbiAgICAgIGluc3RhbmNlU2l6ZSA9IHZlYzRTaXplT2ZQcm9wZXJ0eSAqIChpbmZvLmFycmF5TGVuZ3RoID8/IDEpO1xuICAgICAgY29uc3QgcGFkZGVkQXNWZWM0ID0gTWF0aC5jZWlsKHNjYWxhclNpemVPZlByb3BlcnR5IC8gNCkgKiA0O1xuICAgICAgY29uc3QgaW5zdGFuY2VTaXplSW5TY2FsYXIgPSBwYWRkZWRBc1ZlYzQgKiAoaW5mby5hcnJheUxlbmd0aCA/PyAxKTtcbiAgICAgIGluZGV4U3RyID0gYGludCB2ZWM0X2lkeCA9ICR7b2Zmc2V0T2ZQcm9wZXJ0eX0gKyAke2luc3RhbmNlU2l6ZX0gKiBpbnN0YW5jZUlkICsgJHt2ZWM0U2l6ZU9mUHJvcGVydHl9ICogaWR4T2ZBcnJheTtcXG5gO1xuICAgICAgaW5kZXhTdHIgKz0gYGludCBzY2FsYXJfaWR4ID0gJHtcbiAgICAgICAgLy8gSW5kZXhPZjRCeXRlc1xuICAgICAgICBvZmZzZXRPZlByb3BlcnR5ICogNCAvLyBJbmRleE9mMTZieXRlcyB0byBJbmRleE9mNEJ5dGVzXG4gICAgICB9ICsgJHtpbnN0YW5jZVNpemVJblNjYWxhcn0gKiBpbnN0YW5jZUlkICsgJHtzY2FsYXJTaXplT2ZQcm9wZXJ0eX0gKiBpZHhPZkFycmF5O1xcbmA7XG4gICAgfVxuXG4gICAgbGV0IGludFN0ciA9ICcnO1xuICAgIGlmIChcbiAgICAgIGluZm8uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnQgJiZcbiAgICAgIGluZm8uY29tcG9zaXRpb25UeXBlICE9PSBDb21wb3NpdGlvblR5cGUuU2NhbGFyXG4gICAgKSB7XG4gICAgICBpbnRTdHIgPSAnaSc7XG4gICAgfVxuXG4gICAgbGV0IGZpcnN0UGFydE9mSW5uZXJGdW5jID0gJyc7XG4gICAgaWYgKCFpc1RleHR1cmUgJiYgIWluZm8ubmVlZFVuaWZvcm1JbkRhdGFUZXh0dXJlTW9kZSkge1xuICAgICAgZmlyc3RQYXJ0T2ZJbm5lckZ1bmMgKz0gYFxuJHtyZXR1cm5UeXBlfSBnZXRfJHttZXRob2ROYW1lfShoaWdocCBmbG9hdCBfaW5zdGFuY2VJZCwgY29uc3QgaW50IGlkeE9mQXJyYXkpIHtcbiAgaW50IGluc3RhbmNlSWQgPSBpbnQoX2luc3RhbmNlSWQpO1xuICAke2luZGV4U3RyfVxuICBgO1xuXG4gICAgICBsZXQgc3RyID0gYCR7dmFyRGVmfVxcbiR7Zmlyc3RQYXJ0T2ZJbm5lckZ1bmN9YDtcblxuICAgICAgc3dpdGNoIChpbmZvLmNvbXBvc2l0aW9uVHlwZSkge1xuICAgICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5WZWM0OlxuICAgICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5WZWM0QXJyYXk6XG4gICAgICAgICAgc3RyICs9ICcgICAgICAgIGhpZ2hwIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5WZWMzOlxuICAgICAgICAgIHN0ciArPSAnICAgICAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgICAgc3RyICs9IGAgICAgICAgIGhpZ2hwICR7aW50U3RyfXZlYzMgdmFsID0gJHtpbnRTdHJ9dmVjMyhjb2wwLnh5eik7YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuVmVjM0FycmF5OlxuICAgICAgICAgIHN0ciArPSAnICAgICAgICB2ZWMzIHZhbCA9IGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeCk7XFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuVmVjMjpcbiAgICAgICAgICBzdHIgKz0gJyAgICAgICAgaGlnaHAgdmVjNCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4nO1xuICAgICAgICAgIHN0ciArPSBgICAgICAgICBoaWdocCAke2ludFN0cn12ZWMyIHZhbCA9ICR7aW50U3RyfXZlYzIoY29sMC54eSk7YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuVmVjMkFycmF5OlxuICAgICAgICAgIHN0ciArPSAnICAgICAgICBoaWdocCB2ZWMyIHZhbCA9IGZldGNoVmVjMk5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeCk7XFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuU2NhbGFyOlxuICAgICAgICAgIHN0ciArPSAnICAgICAgICB2ZWM0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgICAgaWYgKGluZm8uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnQpIHtcbiAgICAgICAgICAgIHN0ciArPSAnICAgICAgICBpbnQgdmFsID0gaW50KGNvbDAueCk7JztcbiAgICAgICAgICB9IGVsc2UgaWYgKGluZm8uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5Cb29sKSB7XG4gICAgICAgICAgICBzdHIgKz0gJyAgICAgICAgYm9vbCB2YWwgPSBib29sKGNvbDAueCk7JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyICs9ICcgICAgICAgZmxvYXQgdmFsID0gY29sMC54Oyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheTpcbiAgICAgICAgICBzdHIgKz0gJyAgICAgICAgZmxvYXQgY29sMCA9IGZldGNoU2NhbGFyTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4KTtcXG4nO1xuICAgICAgICAgIGlmIChpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuSW50KSB7XG4gICAgICAgICAgICBzdHIgKz0gJyAgICAgICAgaW50IHZhbCA9IGludChjb2wwKTsnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkJvb2wpIHtcbiAgICAgICAgICAgIHN0ciArPSAnICAgICAgICBib29sIHZhbCA9IGJvb2woY29sMCk7JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyICs9ICcgICAgICAgZmxvYXQgdmFsID0gY29sMDsnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuTWF0NDpcbiAgICAgICAgICBzdHIgKz0gJyAgICAgICAgbWF0NCB2YWwgPSBmZXRjaE1hdDQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29tcG9zaXRpb25UeXBlLk1hdDRBcnJheTpcbiAgICAgICAgICBzdHIgKz0gJyAgICAgICAgbWF0NCB2YWwgPSBmZXRjaE1hdDQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29tcG9zaXRpb25UeXBlLk1hdDM6XG4gICAgICAgICAgc3RyICs9ICcgICAgICAgIG1hdDMgdmFsID0gZmV0Y2hNYXQzKHZlYzRfaWR4KTtcXG4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5NYXQzQXJyYXk6XG4gICAgICAgICAgc3RyICs9ICcgICAgICAgIG1hdDMgdmFsID0gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4KTtcXG4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5NYXQyOlxuICAgICAgICAgIHN0ciArPSAnICAgICAgICBtYXQyIHZhbCA9IGZldGNoTWF0Mih2ZWM0X2lkeCk7XFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuTWF0MkFycmF5OlxuICAgICAgICAgIHN0ciArPSAnICAgICAgICBtYXQyIHZhbCA9IGZldGNoTWF0Mk5vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeCk7XFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuTWF0NHgzQXJyYXk6XG4gICAgICAgICAgc3RyICs9ICcgICAgICAgIG1hdDR4MyB2YWwgPSBmZXRjaE1hdDR4Myh2ZWM0X2lkeCk7XFxuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBMb2dnZXIuZXJyb3IoJ3Vua25vd24gY29tcG9zaXRpb24gdHlwZScsIGluZm8uY29tcG9zaXRpb25UeXBlLnN0ciwgbWVtYmVyTmFtZSk7XG4gICAgICAgICAgc3RyICs9ICcnO1xuICAgICAgfVxuICAgICAgc3RyICs9IGBcbiAgcmV0dXJuIHZhbDtcbn1cbmA7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSBpZiAoIWlzVGV4dHVyZSAmJiBpbmZvLm5lZWRVbmlmb3JtSW5EYXRhVGV4dHVyZU1vZGUpIHtcbiAgICAgIGlmICghaXNXZWJHTDIgJiYgaW5mby5hcnJheUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYFxcbiR7dmFyRGVmfVxcbmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdmFySW5kZXhTdHIgPSAnJztcbiAgICAgICAgaWYgKGluZm8uYXJyYXlMZW5ndGgpIHtcbiAgICAgICAgICB2YXJJbmRleFN0ciA9ICdbaWR4T2ZBcnJheV0nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ciA9IGAke3ZhckRlZn1cbiR7cmV0dXJuVHlwZX0gZ2V0XyR7bWV0aG9kTmFtZX0oaGlnaHAgZmxvYXQgX2luc3RhbmNlSWQsIGNvbnN0IGludCBpZHhPZkFycmF5KSB7XG4gIHJldHVybiB1XyR7bWV0aG9kTmFtZX0ke3ZhckluZGV4U3RyfTtcbn1cbmA7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YXJEZWY7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T2Zmc2V0T2ZQcm9wZXJ0eUluU2hhZGVyKFxuICAgIGlzR2xvYmFsRGF0YTogYm9vbGVhbixcbiAgICBwcm9wZXJ0eU5hbWU6IFNoYWRlclNlbWFudGljc05hbWUsXG4gICAgbWF0ZXJpYWxUeXBlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIGlmIChpc0dsb2JhbERhdGEpIHtcbiAgICAgIGNvbnN0IGdsb2JhbERhdGFSZXBvc2l0b3J5ID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IGRhdGFCZWdpblBvcyA9IGdsb2JhbERhdGFSZXBvc2l0b3J5LmdldExvY2F0aW9uT2Zmc2V0T2ZQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgcmV0dXJuIGRhdGFCZWdpblBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YUJlZ2luUG9zID0gTWF0ZXJpYWxSZXBvc2l0b3J5LmdldExvY2F0aW9uT2Zmc2V0T2ZNZW1iZXJPZk1hdGVyaWFsKFxuICAgICAgICBtYXRlcmlhbFR5cGVOYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGF0YUJlZ2luUG9zO1xuICAgIH1cbiAgfVxuXG4gICRsb2FkKG1lc2hDb21wb25lbnQ6IE1lc2hDb21wb25lbnQpIHtcbiAgICBjb25zdCBtZXNoID0gbWVzaENvbXBvbmVudC5tZXNoIGFzIE1lc2g7XG4gICAgaWYgKG1lc2ggPT0gbnVsbCkge1xuICAgICAgTWVzaENvbXBvbmVudC5hbGVydE5vTWVzaFNldChtZXNoQ29tcG9uZW50KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuX19jdXJyZW50Q29tcG9uZW50U0lEcyA9XG4gICAgICBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRWYWx1ZSgnY3VycmVudENvbXBvbmVudFNJRHMnLCAwKTtcblxuICAgIC8vIHVwZGF0ZSBWQk8gYW5kIFZBT1xuICAgIGlmICghbWVzaC5pc1NldFVwRG9uZSgpKSB7XG4gICAgICB0aGlzLmRlbGV0ZURhdGFUZXh0dXJlKCk7IC8vIGRlbGV0ZSBkYXRhIHRleHR1cmUgdG8gcmVjcmVhdGUgb25lIG9uIG5leHRcbiAgICAgIHVwZGF0ZVZCT0FuZFZBTyhtZXNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVBbmRVcGRhdGVEYXRhVGV4dHVyZSgpIHtcbiAgICBjb25zdCBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyID0gTWVtb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG4gICAgLy8gdGhlIEdQVSBnbG9iYWwgU3RvcmFnZVxuICAgIGNvbnN0IGdwdUluc3RhbmNlRGF0YUJ1ZmZlcjogQnVmZmVyIHwgdW5kZWZpbmVkID0gbWVtb3J5TWFuYWdlci5nZXRCdWZmZXIoXG4gICAgICBCdWZmZXJVc2UuR1BVSW5zdGFuY2VEYXRhXG4gICAgKTtcbiAgICBjb25zdCBnbHcgPSB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXI7XG4gICAgY29uc3QgdWJvVG90YWxTaXplID0gZ2x3IS5nZXRBbGlnbmVkTWF4VW5pZm9ybUJsb2NrU2l6ZSgpO1xuXG4gICAgY29uc3Qgc3RhcnRPZmZzZXRPZkRhdGFUZXh0dXJlT25HUFVJbnN0YW5jZURhdGEgPSB0aGlzLl9faXNVYm9Vc2UoKSA/IHVib1RvdGFsU2l6ZSA6IDA7XG4gICAgaWYgKGdwdUluc3RhbmNlRGF0YUJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNvbnN0IG1vcnBoQnVmZmVyID0gbWVtb3J5TWFuYWdlci5nZXRCdWZmZXIoQnVmZmVyVXNlLkdQVVZlcnRleERhdGEpO1xuICAgIC8vIGlmIGFsbCB0aGUgbmVjZXNzYXJ5IGRhdGEgZml0cyBpbiB0aGUgVUJPLCB0aGVuIG5vIGRhdGEgdGV4dHVyZXMgd2lsbCBiZSBjcmVhdGVkLlxuICAgIC8vIGlmIChcbiAgICAvLyAgIHRoaXMuX19pc1Vib1VzZSgpICYmXG4gICAgLy8gICBEYXRhVXRpbC5hZGRQYWRkaW5nQnl0ZXMoZ3B1SW5zdGFuY2VEYXRhQnVmZmVyLnRha2VuU2l6ZUluQnl0ZSwgNCkgK1xuICAgIC8vICAgICBEYXRhVXRpbC5hZGRQYWRkaW5nQnl0ZXMobW9ycGhCdWZmZXIhLnRha2VuU2l6ZUluQnl0ZSwgNCkgPFxuICAgIC8vICAgICB1Ym9Ub3RhbFNpemVcbiAgICAvLyApIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBkYXRhVGV4dHVyZUJ5dGVTaXplID1cbiAgICAgIE1lbW9yeU1hbmFnZXIuYnVmZmVyV2lkdGhMZW5ndGggKiBNZW1vcnlNYW5hZ2VyLmJ1ZmZlckhlaWdodExlbmd0aCAqIDQgKiA0O1xuICAgIGlmICh0aGlzLl9fZGF0YVRleHR1cmVVaWQgIT09IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkKSB7XG4gICAgICBjb25zdCBidWZmZXJTaXplRm9yRGF0YVRleHR1cmVJbkJ5dGUgPVxuICAgICAgICBncHVJbnN0YW5jZURhdGFCdWZmZXIudGFrZW5TaXplSW5CeXRlIC0gc3RhcnRPZmZzZXRPZkRhdGFUZXh0dXJlT25HUFVJbnN0YW5jZURhdGE7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5jZWlsKGJ1ZmZlclNpemVGb3JEYXRhVGV4dHVyZUluQnl0ZSAvIE1lbW9yeU1hbmFnZXIuYnVmZmVyV2lkdGhMZW5ndGggLyA0IC8gNCksXG4gICAgICAgIE1lbW9yeU1hbmFnZXIuYnVmZmVySGVpZ2h0TGVuZ3RoXG4gICAgICApO1xuICAgICAgY29uc3QgdXBkYXRlQnl0ZVNpemUgPSBNZW1vcnlNYW5hZ2VyLmJ1ZmZlcldpZHRoTGVuZ3RoICogaGVpZ2h0ICogNCAqIDQ7XG4gICAgICBpZiAoYnVmZmVyU2l6ZUZvckRhdGFUZXh0dXJlSW5CeXRlID4gZGF0YVRleHR1cmVCeXRlU2l6ZSkge1xuICAgICAgICBMb2dnZXIud2FybignVGhlIGJ1ZmZlciBzaXplIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlIGRhdGEgdGV4dHVyZS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZsb2F0RGF0YVRleHR1cmVCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KFxuICAgICAgICBncHVJbnN0YW5jZURhdGFCdWZmZXIuZ2V0QXJyYXlCdWZmZXIoKSxcbiAgICAgICAgc3RhcnRPZmZzZXRPZkRhdGFUZXh0dXJlT25HUFVJbnN0YW5jZURhdGEsXG4gICAgICAgIHVwZGF0ZUJ5dGVTaXplIC8gNFxuICAgICAgKTtcbiAgICAgIHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS51cGRhdGVUZXh0dXJlKHRoaXMuX19kYXRhVGV4dHVyZVVpZCwgZmxvYXREYXRhVGV4dHVyZUJ1ZmZlciwge1xuICAgICAgICBsZXZlbDogMCxcbiAgICAgICAgeG9mZnNldDogMCxcbiAgICAgICAgeW9mZnNldDogMCxcbiAgICAgICAgd2lkdGg6IE1lbW9yeU1hbmFnZXIuYnVmZmVyV2lkdGhMZW5ndGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0LlJHQkEsXG4gICAgICAgIHR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICB9KTtcblxuICAgICAgLy8gZGVidWdcbiAgICAgIGlmICghV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9faXNEZWJ1Z09wZXJhdGlvblRvRGF0YVRleHR1cmVCdWZmZXJEb25lKSB7XG4gICAgICAgIE1pc2NVdGlsLmRvd25sb2FkVHlwZWRBcnJheSgnUmhvZG9uaXRlX2RhdGFUZXh0dXJlQnVmZmVyLmJpbicsIGZsb2F0RGF0YVRleHR1cmVCdWZmZXIpO1xuICAgICAgICBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuX19pc0RlYnVnT3BlcmF0aW9uVG9EYXRhVGV4dHVyZUJ1ZmZlckRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtb3JwaEJ1ZmZlciA9IG1lbW9yeU1hbmFnZXIuZ2V0QnVmZmVyKEJ1ZmZlclVzZS5HUFVWZXJ0ZXhEYXRhKTtcbiAgICAgIGxldCBtb3JwaEJ1ZmZlclRha2VuU2l6ZUluQnl0ZSA9IDA7XG4gICAgICBsZXQgbW9ycGhCdWZmZXJBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgIGlmIChJcy5leGlzdChtb3JwaEJ1ZmZlcikpIHtcbiAgICAgICAgbW9ycGhCdWZmZXJUYWtlblNpemVJbkJ5dGUgPSBtb3JwaEJ1ZmZlci50YWtlblNpemVJbkJ5dGU7XG4gICAgICAgIG1vcnBoQnVmZmVyQXJyYXlCdWZmZXIgPSBtb3JwaEJ1ZmZlci5nZXRBcnJheUJ1ZmZlcigpO1xuICAgICAgfVxuICAgICAgbGV0IGZsb2F0RGF0YVRleHR1cmVCdWZmZXI6IEZsb2F0MzJBcnJheTtcbiAgICAgIHtcbiAgICAgICAgY29uc3QgbW9ycGhCdWZmZXIgPSBtZW1vcnlNYW5hZ2VyLmdldEJ1ZmZlcihCdWZmZXJVc2UuR1BVVmVydGV4RGF0YSk7XG5cbiAgICAgICAgLy8gdGhlIHNpemUgb2YgbW9ycGggYnVmZmVyLlxuICAgICAgICBsZXQgbW9ycGhCdWZmZXJUYWtlblNpemVJbkJ5dGUgPSAwO1xuICAgICAgICBpZiAoSXMuZXhpc3QobW9ycGhCdWZmZXIpKSB7XG4gICAgICAgICAgbW9ycGhCdWZmZXJUYWtlblNpemVJbkJ5dGUgPSBtb3JwaEJ1ZmZlci50YWtlblNpemVJbkJ5dGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgYXJyYXlidWZmZXIgb2YgbW9ycGggYnVmZmVyLlxuICAgICAgICBsZXQgbW9ycGhCdWZmZXJBcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgaWYgKElzLmV4aXN0KG1vcnBoQnVmZmVyKSkge1xuICAgICAgICAgIG1vcnBoQnVmZmVyQXJyYXlCdWZmZXIgPSBtb3JwaEJ1ZmZlci5nZXRBcnJheUJ1ZmZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIERhdGFUZXh0dXJlIHNpemUgKEdQVSBnbG9iYWwgc3RvcmFnZSBzaXplIC0gVUJPIHNwYWNlIHNpemUpXG4gICAgICAgIGNvbnN0IGFjdHVhbFNwYWNlRm9yRGF0YVRleHR1cmVJbkJ5dGUgPVxuICAgICAgICAgIGdwdUluc3RhbmNlRGF0YUJ1ZmZlci50YWtlblNpemVJbkJ5dGUgLSBzdGFydE9mZnNldE9mRGF0YVRleHR1cmVPbkdQVUluc3RhbmNlRGF0YTtcblxuICAgICAgICAvLyBzcGFyZSBwYWRkaW5nIHRleGVsIGZvciB0ZXh0dXJlIGFsaWdubWVudCAodG8gZWRnZSBvZiB0aGUgd2lkdGggb2YgdGV4dHVyZSlcbiAgICAgICAgY29uc3QgcGFkZGluZ1NwYWNlVGV4ZWwgPVxuICAgICAgICAgIE1lbW9yeU1hbmFnZXIuYnVmZmVyV2lkdGhMZW5ndGggLVxuICAgICAgICAgICgoYWN0dWFsU3BhY2VGb3JEYXRhVGV4dHVyZUluQnl0ZSAvIDQgLyA0KSAlIE1lbW9yeU1hbmFnZXIuYnVmZmVyV2lkdGhMZW5ndGgpO1xuICAgICAgICBjb25zdCBwYWRkaW5nU3BhY2VCeXRlcyA9IHBhZGRpbmdTcGFjZVRleGVsICogNCAqIDQ7XG5cbiAgICAgICAgY29uc3QgZmluYWxBcnJheUJ1ZmZlciA9IE1pc2NVdGlsLmNvbmNhdEFycmF5QnVmZmVyczIoe1xuICAgICAgICAgIGZpbmFsU2l6ZTogZGF0YVRleHR1cmVCeXRlU2l6ZSxcbiAgICAgICAgICBzcmNzOiBbZ3B1SW5zdGFuY2VEYXRhQnVmZmVyLmdldEFycmF5QnVmZmVyKCksIG1vcnBoQnVmZmVyQXJyYXlCdWZmZXJdLFxuICAgICAgICAgIHNyY3NDb3B5U2l6ZTogW1xuICAgICAgICAgICAgLy8gZmluYWwgc2l6ZSA9XG4gICAgICAgICAgICBhY3R1YWxTcGFjZUZvckRhdGFUZXh0dXJlSW5CeXRlICsgcGFkZGluZ1NwYWNlQnl0ZXMsXG4gICAgICAgICAgICBtb3JwaEJ1ZmZlclRha2VuU2l6ZUluQnl0ZSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHNyY3NPZmZzZXQ6IFtzdGFydE9mZnNldE9mRGF0YVRleHR1cmVPbkdQVUluc3RhbmNlRGF0YSwgMF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHdhcm5pbmcgaWYgdGhlIHVzZWQgbWVtb3J5IGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlIGRhdGEgdGV4dHVyZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFjdHVhbFNwYWNlRm9yRGF0YVRleHR1cmVJbkJ5dGUgKyBwYWRkaW5nU3BhY2VCeXRlcyArIG1vcnBoQnVmZmVyVGFrZW5TaXplSW5CeXRlID5cbiAgICAgICAgICBkYXRhVGV4dHVyZUJ5dGVTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIExvZ2dlci53YXJuKCdUaGUgYnVmZmVyIHNpemUgZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0ZXh0dXJlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXREYXRhVGV4dHVyZUJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoZmluYWxBcnJheUJ1ZmZlcik7XG4gICAgICAgIENvbmZpZy50b3RhbFNpemVPZkdQVVNoYWRlckRhdGFTdG9yYWdlRXhjZXB0TW9ycGhEYXRhID1cbiAgICAgICAgICBncHVJbnN0YW5jZURhdGFCdWZmZXIudGFrZW5TaXplSW5CeXRlICsgcGFkZGluZ1NwYWNlQnl0ZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyaXRlIGRhdGFcbiAgICAgIHRoaXMuX19kYXRhVGV4dHVyZVVpZCA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVUZXh0dXJlRnJvbVR5cGVkQXJyYXkoXG4gICAgICAgIGZsb2F0RGF0YVRleHR1cmVCdWZmZXIhLFxuICAgICAgICB7XG4gICAgICAgICAgbGV2ZWw6IDAsXG4gICAgICAgICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVGb3JtYXQuUkdCQTMyRixcbiAgICAgICAgICB3aWR0aDogTWVtb3J5TWFuYWdlci5idWZmZXJXaWR0aExlbmd0aCxcbiAgICAgICAgICBoZWlnaHQ6IE1lbW9yeU1hbmFnZXIuYnVmZmVySGVpZ2h0TGVuZ3RoLFxuICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0LlJHQkEsXG4gICAgICAgICAgdHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgICAgICBnZW5lcmF0ZU1pcG1hcDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlRGF0YVRleHR1cmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX19kYXRhVGV4dHVyZVVpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZGVsZXRlVGV4dHVyZSh0aGlzLl9fZGF0YVRleHR1cmVVaWQpO1xuICAgICAgdGhpcy5fX2RhdGFUZXh0dXJlVWlkID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gICAgfVxuICB9XG5cbiAgcHJlcmVuZGVyKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIEFuaW1hdGlvbkNvbXBvbmVudC5pc0FuaW1hdGluZyB8fFxuICAgICAgVHJhbnNmb3JtQ29tcG9uZW50LnVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCB8fFxuICAgICAgU2NlbmVHcmFwaENvbXBvbmVudC51cGRhdGVDb3VudCAhPT0gdGhpcy5fX2xhc3RTY2VuZUdyYXBoQ29tcG9uZW50c1VwZGF0ZUNvdW50IHx8XG4gICAgICBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50LnVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGFzdENhbWVyYUNvbXBvbmVudHNVcGRhdGVDb3VudCB8fFxuICAgICAgTWF0ZXJpYWwuc3RhdGVWZXJzaW9uICE9PSB0aGlzLl9fbGFzdE1hdGVyaWFsc1VwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICAvLyBTZXR1cCBHUFUgU3RvcmFnZSAoRGF0YSBUZXh0dXJlICYgVUJPKVxuICAgICAgdGhpcy5fX2NyZWF0ZUFuZFVwZGF0ZURhdGFUZXh0dXJlKCk7XG4gICAgICB0aGlzLl9fY3JlYXRlQW5kVXBkYXRlVUJPKCk7XG4gICAgICB0aGlzLl9fbGFzdFRyYW5zZm9ybUNvbXBvbmVudHNVcGRhdGVDb3VudCA9IFRyYW5zZm9ybUNvbXBvbmVudC51cGRhdGVDb3VudDtcbiAgICAgIHRoaXMuX19sYXN0U2NlbmVHcmFwaENvbXBvbmVudHNVcGRhdGVDb3VudCA9IFNjZW5lR3JhcGhDb21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgICB0aGlzLl9fbGFzdENhbWVyYUNvbXBvbmVudHNVcGRhdGVDb3VudCA9IENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgICB0aGlzLl9fbGFzdE1hdGVyaWFsc1VwZGF0ZUNvdW50ID0gTWF0ZXJpYWwuc3RhdGVWZXJzaW9uO1xuICAgIH1cblxuICAgIHRoaXMuX19saWdodENvbXBvbmVudHMgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudHNXaXRoVHlwZShMaWdodENvbXBvbmVudCkgYXNcbiAgICAgIHwgTGlnaHRDb21wb25lbnRbXVxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9faXNVYm9Vc2UoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jdXJyZW50V2ViR0xDb250ZXh0V3JhcHBlciEuaXNXZWJHTDIgJiYgQ29uZmlnLmlzVWJvRW5hYmxlZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fY3JlYXRlQW5kVXBkYXRlVUJPKCkge1xuICAgIGlmICh0aGlzLl9faXNVYm9Vc2UoKSkge1xuICAgICAgY29uc3QgZ2x3ID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmN1cnJlbnRXZWJHTENvbnRleHRXcmFwcGVyO1xuICAgICAgY29uc3QgYWxpZ25lZE1heFVuaWZvcm1CbG9ja1NpemUgPSBnbHchLmdldEFsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplKCk7XG4gICAgICBjb25zdCBtYXhDb252ZW50aW9uQmxvY2tzID0gZ2x3IS5nZXRNYXhDb252ZW50aW9uVW5pZm9ybUJsb2NrcygpO1xuICAgICAgY29uc3QgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlciA9IE1lbW9yeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcjogQnVmZmVyIHwgdW5kZWZpbmVkID0gbWVtb3J5TWFuYWdlci5nZXRCdWZmZXIoQnVmZmVyVXNlLkdQVUluc3RhbmNlRGF0YSk7XG4gICAgICBpZiAodGhpcy5fX2RhdGFVQk9VaWQgPT09IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkKSB7XG4gICAgICAgIHRoaXMuX19kYXRhVUJPVWlkID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldHVwVW5pZm9ybUJ1ZmZlckRhdGFBcmVhKFxuICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyIS5nZXRBcnJheUJ1ZmZlcigpKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlciEuZ2V0QXJyYXlCdWZmZXIoKSk7XG4gICAgICAgIHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS51cGRhdGVVbmlmb3JtQnVmZmVyKFxuICAgICAgICAgIHRoaXMuX19kYXRhVUJPVWlkLFxuICAgICAgICAgIGFycmF5LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgKGFsaWduZWRNYXhVbmlmb3JtQmxvY2tTaXplICogbWF4Q29udmVudGlvbkJsb2NrcykgLyA0IC8vICg0IGJ5dGVzIHVuaXQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXR0YWNoR1BVRGF0YShwcmltaXRpdmU6IFByaW1pdGl2ZSk6IHZvaWQge31cblxuICBhdHRhY2hHUFVEYXRhSW5uZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtKSB7fVxuXG4gIGF0dGFjaFZlcnRleERhdGEoXG4gICAgaTogbnVtYmVyLFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIGdsdzogV2ViR0xDb250ZXh0V3JhcHBlcixcbiAgICBpbnN0YW5jZUlEQnVmZmVyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlXG4gICk6IHZvaWQge31cblxuICBhdHRhY2hWZXJ0ZXhEYXRhSW5uZXIoXG4gICAgbWVzaDogTWVzaCxcbiAgICBwcmltaXRpdmU6IFByaW1pdGl2ZSxcbiAgICBwcmltaXRpdmVJbmRleDogSW5kZXgsXG4gICAgZ2x3OiBXZWJHTENvbnRleHRXcmFwcGVyLFxuICAgIGluc3RhbmNlSURCdWZmZXJVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGVcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmVydGV4SGFuZGxlcyA9IHByaW1pdGl2ZS52ZXJ0ZXhIYW5kbGVzITtcbiAgICBjb25zdCBnbCA9IGdsdy5nZXRSYXdDb250ZXh0KCk7XG5cbiAgICAvLyBiaW5kXG4gICAgY29uc3QgdmFvID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2UoXG4gICAgICBtZXNoLmdldFZhb1VpZHMocHJpbWl0aXZlSW5kZXgpXG4gICAgKSBhcyBXZWJHTFZlcnRleEFycmF5T2JqZWN0T0VTO1xuICAgIGlmICh2YW8gIT0gbnVsbCkge1xuICAgICAgZ2x3LmJpbmRWZXJ0ZXhBcnJheSh2YW8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VmVydGV4RGF0YVRvUGlwZWxpbmUoXG4gICAgICAgIHZlcnRleEhhbmRsZXMsXG4gICAgICAgIHByaW1pdGl2ZSxcbiAgICAgICAgbWVzaC5fdmFyaWF0aW9uVkJPVWlkXG4gICAgICApO1xuICAgICAgY29uc3QgaWJvID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2UoXG4gICAgICAgIHZlcnRleEhhbmRsZXMuaWJvSGFuZGxlIVxuICAgICAgKSBhcyBXZWJHTEJ1ZmZlcjtcbiAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGlibyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlKCk7XG4gICAgICBjb25zdCByblhSTW9kdWxlID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZHVsZSgneHInKSBhcyBSblhSO1xuICAgICAgY29uc3Qgd2VieHJTeXN0ZW0gPSByblhSTW9kdWxlLldlYlhSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gICAgICBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuX193ZWJ4clN5c3RlbSA9IHdlYnhyU3lzdGVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0Q3VycmVudENvbXBvbmVudFNJRHNGb3JFYWNoRGlzcGxheUlkeChcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIGRpc3BsYXlJZHg6IDAgfCAxLFxuICAgIGlzVlJNYWluUGFzczogYm9vbGVhblxuICApIHtcbiAgICBpZiAoaXNWUk1haW5QYXNzKSB7XG4gICAgICBsZXQgY2FtZXJhQ29tcG9uZW50U2lkID0gLTE7XG4gICAgICBjb25zdCB3ZWJ4clN5c3RlbSA9IFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5fX3dlYnhyU3lzdGVtO1xuICAgICAgaWYgKHdlYnhyU3lzdGVtLmlzV2ViWFJNb2RlKSB7XG4gICAgICAgIGlmICh3ZWJ4clN5c3RlbS5pc011bHRpVmlldygpKSB7XG4gICAgICAgICAgY2FtZXJhQ29tcG9uZW50U2lkID0gd2VieHJTeXN0ZW0uX2dldENhbWVyYUNvbXBvbmVudFNJREF0KDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbWVyYUNvbXBvbmVudFNpZCA9IHdlYnhyU3lzdGVtLl9nZXRDYW1lcmFDb21wb25lbnRTSURBdChkaXNwbGF5SWR4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fY3VycmVudENvbXBvbmVudFNJRHMhLl92W1xuICAgICAgICBXZWxsS25vd25Db21wb25lbnRUSURzLkNhbWVyYUNvbXBvbmVudFRJRFxuICAgICAgXSA9IGNhbWVyYUNvbXBvbmVudFNpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm9uLVZSIFJlbmRlcmluZ1xuICAgICAgbGV0IGNhbWVyYUNvbXBvbmVudCA9IHJlbmRlclBhc3MuY2FtZXJhQ29tcG9uZW50O1xuICAgICAgaWYgKGNhbWVyYUNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgIC8vIGlmIHRoZSByZW5kZXJQYXNzIGhhcyBubyBjYW1lcmFDb21wb25lbnQsIHRyeSB0byBnZXQgdGhlIGN1cnJlbnQgY2FtZXJhQ29tcG9uZW50XG4gICAgICAgIGNhbWVyYUNvbXBvbmVudCA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50KFxuICAgICAgICAgIENhbWVyYUNvbXBvbmVudCxcbiAgICAgICAgICBDYW1lcmFDb21wb25lbnQuY3VycmVudFxuICAgICAgICApIGFzIENhbWVyYUNvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChjYW1lcmFDb21wb25lbnQpIHtcbiAgICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fY3VycmVudENvbXBvbmVudFNJRHMhLl92W1xuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEXG4gICAgICAgIF0gPSBjYW1lcmFDb21wb25lbnQuY29tcG9uZW50U0lEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fY3VycmVudENvbXBvbmVudFNJRHMhLl92W1xuICAgICAgICAgIFdlbGxLbm93bkNvbXBvbmVudFRJRHMuQ2FtZXJhQ29tcG9uZW50VElEXG4gICAgICAgIF0gPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fc2V0Q3VycmVudENvbXBvbmVudFNJRHNGb3JFYWNoUHJpbWl0aXZlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsXG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbVxuICApIHtcbiAgICBpZiAoV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fY3VycmVudENvbXBvbmVudFNJRHMgPT0gbnVsbCkge1xuICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fY3VycmVudENvbXBvbmVudFNJRHMgPVxuICAgICAgICBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRWYWx1ZSgnY3VycmVudENvbXBvbmVudFNJRHMnLCAwKTtcbiAgICB9XG5cbiAgICBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUuX19jdXJyZW50Q29tcG9uZW50U0lEcyEuX3ZbMF0gPSBtYXRlcmlhbC5tYXRlcmlhbFNJRDtcbiAgfVxuXG4gIGNvbW1vbl8kcmVuZGVyKFxuICAgIHByaW1pdGl2ZVVpZHM6IFByaW1pdGl2ZVVJRFtdLFxuICAgIHJlbmRlclBhc3M6IFJlbmRlclBhc3MsXG4gICAgcmVuZGVyUGFzc1RpY2tDb3VudDogQ291bnRcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgc3BlY3Rvci5zZXRNYXJrZXIoJ3wgIHwgIERhdGFUZXh0dXJlOmNvbW1vbl8kcmVuZGVyIycpO1xuICAgIH1cbiAgICBjb25zdCBnbHcgPSB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXIhO1xuICAgIGNvbnN0IGdsID0gZ2x3LmdldFJhd0NvbnRleHRBc1dlYkdMMigpO1xuXG4gICAgaWYgKHJlbmRlclBhc3MuaXNCdWZmZXJMZXNzUmVuZGVyaW5nTW9kZSgpKSB7XG4gICAgICB0aGlzLl9fcmVuZGVyV2l0aG91dEJ1ZmZlcnMoZ2wsIHJlbmRlclBhc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbGV0IHJlbmRlcmVkU29tZXRoaW5nID0gZmFsc2U7XG5cbiAgICAvLyBGb3Igb3BhcXVlIHByaW1pdGl2ZXNcbiAgICBpZiAocmVuZGVyUGFzcy5fdG9SZW5kZXJPcGFxdWVQcmltaXRpdmVzKSB7XG4gICAgICBpZiAoIXJlbmRlclBhc3MuZGVwdGhXcml0ZU1hc2spIHtcbiAgICAgICAgZ2wuZGVwdGhNYXNrKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHJlbmRlclBhc3MuX2xhc3RPcGFxdWVJbmRleDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZVVpZCA9IHByaW1pdGl2ZVVpZHNbaV07XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gdGhpcy5fX3JlbmRlcklubmVyKHByaW1pdGl2ZVVpZCwgZ2x3LCByZW5kZXJQYXNzKTtcbiAgICAgICAgcmVuZGVyZWRTb21ldGhpbmcgfHw9IHJlbmRlcmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvciB0cmFuc2x1Y2VudCBwcmltaXRpdmVzXG4gICAgaWYgKHJlbmRlclBhc3MuX3RvUmVuZGVyVHJhbnNwYXJlbnRQcmltaXRpdmVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyUGFzcy5fbGFzdE9wYXF1ZUluZGV4ICsgMTsgaSA8PSByZW5kZXJQYXNzLl9sYXN0VHJhbnNsdWNlbnRJbmRleDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZVVpZCA9IHByaW1pdGl2ZVVpZHNbaV07XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gdGhpcy5fX3JlbmRlcklubmVyKHByaW1pdGl2ZVVpZCwgZ2x3LCByZW5kZXJQYXNzKTtcbiAgICAgICAgcmVuZGVyZWRTb21ldGhpbmcgfHw9IHJlbmRlcmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU1lc2hSZW5kZXJlckNvbXBvbmVudC5pc0RlcHRoTWFza1RydWVGb3JCbGVuZFByaW1pdGl2ZXMpIHtcbiAgICAgICAgLy8gZGlzYWJsZSBkZXB0aCB3cml0ZSBmb3IgYmxlbmQgcHJpbWl0aXZlc1xuICAgICAgICBnbC5kZXB0aE1hc2soZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyUGFzcy5fbGFzdFRyYW5zbHVjZW50SW5kZXggKyAxOyBpIDw9IHJlbmRlclBhc3MuX2xhc3RCbGVuZEluZGV4OyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlVWlkID0gcHJpbWl0aXZlVWlkc1tpXTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLl9fcmVuZGVySW5uZXIocHJpbWl0aXZlVWlkLCBnbHcsIHJlbmRlclBhc3MpO1xuICAgICAgICByZW5kZXJlZFNvbWV0aGluZyB8fD0gcmVuZGVyZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGdsLmRlcHRoTWFzayh0cnVlKTtcblxuICAgIHRoaXMuX19sYXN0UmVuZGVyUGFzc1RpY2tDb3VudCA9IHJlbmRlclBhc3NUaWNrQ291bnQ7XG5cbiAgICAvLyB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkudW5iaW5kVGV4dHVyZVNhbXBsZXJzKCk7XG5cbiAgICByZXR1cm4gcmVuZGVyZWRTb21ldGhpbmc7XG4gIH1cblxuICBwcml2YXRlIF9fcmVuZGVyV2l0aG91dEJ1ZmZlcnMoZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIHJlbmRlclBhc3M6IFJlbmRlclBhc3MpIHtcbiAgICAvLyBzZXR1cCBzaGFkZXIgcHJvZ3JhbVxuICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHJlbmRlclBhc3MubWF0ZXJpYWwhO1xuICAgIGNvbnN0IHByaW1pdGl2ZTogUHJpbWl0aXZlID0gcmVuZGVyUGFzcy5fZHVtbXlQcmltaXRpdmVGb3JCdWZmZXJMZXNzUmVuZGVyaW5nO1xuICAgIHNldHVwU2hhZGVyUHJvZ3JhbShtYXRlcmlhbCwgcHJpbWl0aXZlLCB0aGlzKTtcblxuICAgIGNvbnN0IHNoYWRlclByb2dyYW1VaWQgPSBtYXRlcmlhbC5nZXRTaGFkZXJQcm9ncmFtVWlkKHByaW1pdGl2ZSk7XG4gICAgY29uc3Qgc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgc2hhZGVyUHJvZ3JhbVVpZFxuICAgICkhIGFzIFdlYkdMUHJvZ3JhbTtcbiAgICBnbC51c2VQcm9ncmFtKHNoYWRlclByb2dyYW0pO1xuICAgIHRoaXMuX19sYXN0U2hhZGVyID0gc2hhZGVyUHJvZ3JhbVVpZDtcblxuICAgIC8vIEJpbmQgRGF0YVRleHR1cmVcbiAgICB0aGlzLmJpbmREYXRhVGV4dHVyZShnbCwgc2hhZGVyUHJvZ3JhbSk7XG5cbiAgICB0aGlzLl9fc2V0Q3VycmVudENvbXBvbmVudFNJRHNGb3JFYWNoUHJpbWl0aXZlKGdsLCBtYXRlcmlhbCwgc2hhZGVyUHJvZ3JhbSk7XG5cbiAgICBnbC51bmlmb3JtMWZ2KFxuICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5jdXJyZW50Q29tcG9uZW50U0lEcyxcbiAgICAgIFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5fX2N1cnJlbnRDb21wb25lbnRTSURzIS5fdiBhcyBGbG9hdDMyQXJyYXlcbiAgICApO1xuXG4gICAgY29uc3QgaXNWUk1haW5QYXNzID0gV2ViR0xTdHJhdGVneUNvbW1vbk1ldGhvZC5pc1ZyTWFpblBhc3MocmVuZGVyUGFzcyk7XG4gICAgaWYgKChzaGFkZXJQcm9ncmFtIGFzIGFueSkudnJTdGF0ZSAhPSBudWxsICYmIGlzVlJNYWluUGFzcykge1xuICAgICAgY29uc3QgdnJTdGF0ZSA9IEdsb2JhbERhdGFSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuZ2V0VmFsdWUoJ3ZyU3RhdGUnLCAwKSBhcyBWZWN0b3IyO1xuICAgICAgdnJTdGF0ZS5fdlswXSA9IGlzVlJNYWluUGFzcyA/IDEgOiAwO1xuICAgICAgdnJTdGF0ZS5fdlsxXSA9IDA7XG4gICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMml2KChzaGFkZXJQcm9ncmFtIGFzIGFueSkudnJTdGF0ZSwgdnJTdGF0ZS5fdik7XG4gICAgfVxuXG4gICAgV2ViR0xTdHJhdGVneUNvbW1vbk1ldGhvZC5zZXRXZWJHTFBhcmFtZXRlcnMobWF0ZXJpYWwsIGdsKTtcblxuICAgIG1hdGVyaWFsLl9zZXRQYXJhbWV0ZXJzVG9HcHVXZWJHTFdpdGhPdXRJbnRlcm5hbFNldHRpbmcoe1xuICAgICAgc2hhZGVyUHJvZ3JhbSxcbiAgICAgIGZpcnN0VGltZTogdHJ1ZSxcbiAgICAgIGlzVW5pZm9ybU1vZGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlbmRlclBhc3MuZGVwdGhXcml0ZU1hc2spIHtcbiAgICAgIGdsLmRlcHRoTWFzayh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wuZGVwdGhNYXNrKGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0Vmlld3BvcnQocmVuZGVyUGFzcy5nZXRWaWV3cG9ydCgpKTtcblxuICAgIGdsLmRyYXdBcnJheXMoXG4gICAgICByZW5kZXJQYXNzLl9wcmltaXRpdmVNb2RlRm9yQnVmZmVyTGVzc1JlbmRlcmluZy5pbmRleCxcbiAgICAgIDAsXG4gICAgICByZW5kZXJQYXNzLl9kcmF3VmVydGV4TnVtYmVyRm9yQnVmZmVyTGVzc1JlbmRlcmluZ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fcmVuZGVySW5uZXIoXG4gICAgcHJpbWl0aXZlVWlkOiBQcmltaXRpdmVVSUQsXG4gICAgZ2x3OiBXZWJHTENvbnRleHRXcmFwcGVyLFxuICAgIHJlbmRlclBhc3M6IFJlbmRlclBhc3NcbiAgKSB7XG4gICAgY29uc3QgZ2wgPSBnbHcuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCk7XG4gICAgY29uc3QgcHJpbWl0aXZlID0gUHJpbWl0aXZlLmdldFByaW1pdGl2ZShwcmltaXRpdmVVaWQpO1xuICAgIGlmIChwcmltaXRpdmUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtZXNoID0gcHJpbWl0aXZlLm1lc2ggYXMgTWVzaDtcbiAgICBjb25zdCBlbnRpdHkgPSBtZXNoLm1lc2hFbnRpdGllc0lubmVyWzBdOyAvLyBnZXQgYmFzZSBtZXNoIGZvciBpbnN0YW5jaW5nIGRyYXdcbiAgICAvLyBzZXR1cCBzaGFkZXIgcHJvZ3JhbVxuICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHJlbmRlclBhc3MuZ2V0QXBwcm9wcmlhdGVNYXRlcmlhbChwcmltaXRpdmUpO1xuICAgIHNldHVwU2hhZGVyUHJvZ3JhbShtYXRlcmlhbCwgcHJpbWl0aXZlLCB0aGlzKTtcblxuICAgIGNvbnN0IG1lc2hSZW5kZXJlckNvbXBvbmVudCA9IGVudGl0eS5nZXRNZXNoUmVuZGVyZXIoKSE7XG4gICAgY29uc3QgcHJpbWl0aXZlSW5kZXggPSBtZXNoLmdldFByaW1pdGl2ZUluZGV4SW5NZXNoKHByaW1pdGl2ZSk7XG4gICAgdGhpcy5hdHRhY2hWZXJ0ZXhEYXRhSW5uZXIobWVzaCwgcHJpbWl0aXZlLCBwcmltaXRpdmVJbmRleCwgZ2x3LCBtZXNoLl92YXJpYXRpb25WQk9VaWQpO1xuXG4gICAgbGV0IGZpcnN0VGltZSA9IGZhbHNlO1xuICAgIGNvbnN0IHNoYWRlclByb2dyYW1VaWQgPSBtYXRlcmlhbC5nZXRTaGFkZXJQcm9ncmFtVWlkKHByaW1pdGl2ZSk7XG4gICAgaWYgKHNoYWRlclByb2dyYW1VaWQgIT09IHRoaXMuX19sYXN0U2hhZGVyIHx8IChnbCBhcyBhbnkpLl9fY2hhbmdlZFByb2dyYW0pIHtcbiAgICAgIGlmIChpc1NraXBEcmF3aW5nKG1hdGVyaWFsLCBwcmltaXRpdmUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgICBzaGFkZXJQcm9ncmFtVWlkXG4gICAgICApISBhcyBXZWJHTFByb2dyYW07XG4gICAgICBnbC51c2VQcm9ncmFtKHNoYWRlclByb2dyYW0pO1xuICAgICAgKGdsIGFzIGFueSkuX19jaGFuZ2VkUHJvZ3JhbSA9IGZhbHNlO1xuICAgICAgLy8gQmluZCBEYXRhVGV4dHVyZVxuICAgICAgdGhpcy5iaW5kRGF0YVRleHR1cmUoZ2wsIHNoYWRlclByb2dyYW0pO1xuXG4gICAgICAvLyBnbC51bmlmb3JtMWkoKHNoYWRlclByb2dyYW0gYXMgYW55KS5pc01haW5WciwgaXNWUk1haW5QYXNzID8gMSA6IDApOyAvLyBWUiBNdWx0aVZpZXcgaXMgbm90IHN1cHBvcnRlZCB5ZXRcblxuICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fc2hhZGVyUHJvZ3JhbSA9IHNoYWRlclByb2dyYW07XG4gICAgICBmaXJzdFRpbWUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fX2xhc3RNYXRlcmlhbD8uZGVyZWYoKSAhPT0gbWF0ZXJpYWwpIHtcbiAgICAgIGZpcnN0VGltZSA9IHRydWU7XG4gICAgICB0aGlzLl9fbGFzdE1hdGVyaWFsID0gbmV3IFdlYWtSZWYobWF0ZXJpYWwpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fX2xhc3RNYXRlcmlhbFN0YXRlVmVyc2lvbiAhPT0gbWF0ZXJpYWwuc3RhdGVWZXJzaW9uKSB7XG4gICAgICBmaXJzdFRpbWUgPSB0cnVlO1xuICAgICAgdGhpcy5fX2xhc3RNYXRlcmlhbFN0YXRlVmVyc2lvbiA9IG1hdGVyaWFsLnN0YXRlVmVyc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1ZSTWFpblBhc3MgPSBXZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kLmlzVnJNYWluUGFzcyhyZW5kZXJQYXNzKTtcbiAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICB0aGlzLl9fc2V0Q3VycmVudENvbXBvbmVudFNJRHNGb3JFYWNoUHJpbWl0aXZlKFxuICAgICAgICBnbCxcbiAgICAgICAgbWF0ZXJpYWwsXG4gICAgICAgIFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5fX3NoYWRlclByb2dyYW1cbiAgICAgICk7XG5cbiAgICAgIFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2Quc2V0V2ViR0xQYXJhbWV0ZXJzKG1hdGVyaWFsLCBnbCk7XG5cbiAgICAgIG1hdGVyaWFsLl9zZXRQYXJhbWV0ZXJzVG9HcHVXZWJHTCh7XG4gICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcbiAgICAgICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgZmlyc3RUaW1lOiBmaXJzdFRpbWUsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBnbHc6IGdsdyxcbiAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICB3b3JsZE1hdHJpeDogZW50aXR5LmdldFNjZW5lR3JhcGgoKSEubWF0cml4SW5uZXIsXG4gICAgICAgICAgbm9ybWFsTWF0cml4OiBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpIS5ub3JtYWxNYXRyaXhJbm5lcixcbiAgICAgICAgICBpc0JpbGxib2FyZDogZW50aXR5LmdldFNjZW5lR3JhcGgoKS5pc0JpbGxib2FyZCxcbiAgICAgICAgICBsaWdodENvbXBvbmVudHM6IHRoaXMuX19saWdodENvbXBvbmVudHMhLFxuICAgICAgICAgIHJlbmRlclBhc3M6IHJlbmRlclBhc3MsXG4gICAgICAgICAgcHJpbWl0aXZlOiBwcmltaXRpdmUsXG4gICAgICAgICAgZGlmZnVzZUN1YmU6IG1lc2hSZW5kZXJlckNvbXBvbmVudC5kaWZmdXNlQ3ViZU1hcCxcbiAgICAgICAgICBzcGVjdWxhckN1YmU6IG1lc2hSZW5kZXJlckNvbXBvbmVudC5zcGVjdWxhckN1YmVNYXAhLFxuICAgICAgICAgIHNldFVuaWZvcm06IGZhbHNlLFxuICAgICAgICAgIGlzVnI6IGlzVlJNYWluUGFzcyxcbiAgICAgICAgICBkaXNwbGF5SWR4OiAtMSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlDb3VudCA9IFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QuZ2V0RGlzcGxheUNvdW50KFxuICAgICAgaXNWUk1haW5QYXNzLFxuICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fd2VieHJTeXN0ZW1cbiAgICApO1xuICAgIGZvciAobGV0IGRpc3BsYXlJZHggPSAwOyBkaXNwbGF5SWR4IDwgZGlzcGxheUNvdW50OyBkaXNwbGF5SWR4KyspIHtcbiAgICAgIGlmIChpc1ZSTWFpblBhc3MpIHtcbiAgICAgICAgV2ViR0xTdHJhdGVneUNvbW1vbk1ldGhvZC5zZXRWUlZpZXdwb3J0KHJlbmRlclBhc3MsIGRpc3BsYXlJZHgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX3NldEN1cnJlbnRDb21wb25lbnRTSURzRm9yRWFjaERpc3BsYXlJZHgoXG4gICAgICAgIHJlbmRlclBhc3MsXG4gICAgICAgIGRpc3BsYXlJZHggYXMgMCB8IDEsXG4gICAgICAgIGlzVlJNYWluUGFzc1xuICAgICAgKTtcblxuICAgICAgZ2wudW5pZm9ybTFmdihcbiAgICAgICAgKFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5fX3NoYWRlclByb2dyYW0gYXMgYW55KS5jdXJyZW50Q29tcG9uZW50U0lEcyxcbiAgICAgICAgV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fY3VycmVudENvbXBvbmVudFNJRHMhLl92IGFzIEZsb2F0MzJBcnJheVxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICAoV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnZyU3RhdGUgIT0gbnVsbCAmJlxuICAgICAgICBpc1ZSTWFpblBhc3MgJiZcbiAgICAgICAgZGlzcGxheUNvdW50ID4gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZyU3RhdGUgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmdldFZhbHVlKCd2clN0YXRlJywgMCkgYXMgVmVjdG9yMjtcbiAgICAgICAgdnJTdGF0ZS5fdlswXSA9IGlzVlJNYWluUGFzcyA/IDEgOiAwO1xuICAgICAgICB2clN0YXRlLl92WzFdID0gZGlzcGxheUlkeDtcbiAgICAgICAgKFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5fX3NoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTJpdihcbiAgICAgICAgICAoV2ViR0xTdHJhdGVneURhdGFUZXh0dXJlLl9fc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnZyU3RhdGUsXG4gICAgICAgICAgdnJTdGF0ZS5fdlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpbWl0aXZlLmluZGljZXNBY2Nlc3Nvcikge1xuICAgICAgICBnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWQoXG4gICAgICAgICAgcHJpbWl0aXZlLnByaW1pdGl2ZU1vZGUuaW5kZXgsXG4gICAgICAgICAgcHJpbWl0aXZlLmluZGljZXNBY2Nlc3Nvci5lbGVtZW50Q291bnQsXG4gICAgICAgICAgcHJpbWl0aXZlLmluZGljZXNBY2Nlc3Nvci5jb21wb25lbnRUeXBlLmluZGV4LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgbWVzaC5tZXNoRW50aXRpZXNJbm5lci5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmRyYXdBcnJheXNJbnN0YW5jZWQoXG4gICAgICAgICAgcHJpbWl0aXZlLnByaW1pdGl2ZU1vZGUuaW5kZXgsXG4gICAgICAgICAgMCxcbiAgICAgICAgICBwcmltaXRpdmUuZ2V0VmVydGV4Q291bnRBc1ZlcnRpY2VzQmFzZWQoKSxcbiAgICAgICAgICBtZXNoLm1lc2hFbnRpdGllc0lubmVyLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX19sYXN0U2hhZGVyID0gc2hhZGVyUHJvZ3JhbVVpZDtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRGF0YVRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gICAgc2hhZGVyUHJvZ3JhbTogV2ViR0xQcm9ncmFtXG4gICkge1xuICAgIGdsLnVuaWZvcm0xaSgoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLmRhdGFUZXh0dXJlLCA3KTtcbiAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuYmluZFRleHR1cmUyRCg3LCB0aGlzLl9fZGF0YVRleHR1cmVVaWQpO1xuICAgIGNvbnN0IHNhbXBsZXJVaWQgPSB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlT3JHZXRUZXh0dXJlU2FtcGxlclJlcGVhdE5lYXJlc3QoKTtcbiAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuYmluZFRleHR1cmVTYW1wbGVyKDcsIHNhbXBsZXJVaWQpO1xuICB9XG4gIC8vICRyZW5kZXIoKTogdm9pZCB7fVxufVxuIiwiaW1wb3J0IHsgV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFNoYWRlclNvdXJjZXMsIFdlYkdMU3RyYXRlZ3kgfSBmcm9tICcuL1dlYkdMU3RyYXRlZ3knO1xuaW1wb3J0IHsgTWVzaENvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9NZXNoL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHsgV2ViR0xDb250ZXh0V3JhcHBlciB9IGZyb20gJy4vV2ViR0xDb250ZXh0V3JhcHBlcic7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2dlb21ldHJ5L1ByaW1pdGl2ZSc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IExpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0xpZ2h0L0xpZ2h0Q29tcG9uZW50JztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgUGl4ZWxGb3JtYXQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1BpeGVsRm9ybWF0JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgVGV4dHVyZVBhcmFtZXRlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVGV4dHVyZVBhcmFtZXRlcic7XG5pbXBvcnQgeyBNZXNoUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL01lc2hSZW5kZXJlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvcmUvTWF0ZXJpYWwnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvTWVtb3J5TWFuYWdlcic7XG5pbXBvcnQgeyBTaGFkZXJUeXBlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJUeXBlJztcbmltcG9ydCB7XG4gIENHQVBJUmVzb3VyY2VIYW5kbGUsXG4gIFdlYkdMUmVzb3VyY2VIYW5kbGUsXG4gIEluZGV4LFxuICBDb3VudCxcbiAgUHJpbWl0aXZlVUlELFxufSBmcm9tICcuLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBCdWZmZXJVc2UgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0J1ZmZlclVzZSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21lbW9yeS9CdWZmZXInO1xuaW1wb3J0IHsgR2xvYmFsRGF0YVJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvR2xvYmFsRGF0YVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgTWlzY1V0aWwgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvTWlzY1V0aWwnO1xuaW1wb3J0IFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QsIHsgc2V0dXBTaGFkZXJQcm9ncmFtIH0gZnJvbSAnLi9XZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL0lzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljc0luZm8gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlclNlbWFudGljc0luZm8nO1xuaW1wb3J0IHsgaXNTa2lwRHJhd2luZywgdXBkYXRlVkJPQW5kVkFPIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9yZW5kZXJlci9SZW5kZXJpbmdDb21tb25NZXRob2RzJztcbmltcG9ydCB7IENHQVBJU3RyYXRlZ3kgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJU3RyYXRlZ3knO1xuaW1wb3J0IHsgTW9kdWxlTWFuYWdlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgUm5YUiB9IGZyb20gJy4uL3hyL21haW4nO1xuaW1wb3J0IHsgV2ViWFJTeXN0ZW0gfSBmcm9tICcuLi94ci9XZWJYUlN5c3RlbSc7XG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0FuaW1hdGlvbi9BbmltYXRpb25Db21wb25lbnQnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1NjYWxhcic7XG5pbXBvcnQgeyBUZXh0dXJlRm9ybWF0IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9UZXh0dXJlRm9ybWF0JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuXG5kZWNsYXJlIGNvbnN0IHNwZWN0b3I6IGFueTtcblxuZXhwb3J0IGNsYXNzIFdlYkdMU3RyYXRlZ3lVbmlmb3JtIGltcGxlbWVudHMgQ0dBUElTdHJhdGVneSwgV2ViR0xTdHJhdGVneSB7XG4gIHByaXZhdGUgc3RhdGljIF9faW5zdGFuY2U6IFdlYkdMU3RyYXRlZ3lVbmlmb3JtO1xuICBwcml2YXRlIF9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnk6IFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID1cbiAgICBXZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBwcml2YXRlIF9fZGF0YVRleHR1cmVVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZDtcbiAgcHJpdmF0ZSBfX2xhc3RTaGFkZXI6IENHQVBJUmVzb3VyY2VIYW5kbGUgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RNYXRlcmlhbD86IFdlYWtSZWY8TWF0ZXJpYWw+O1xuICBwcml2YXRlIF9fbGFzdFJlbmRlclBhc3NUaWNrQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xpZ2h0Q29tcG9uZW50cz86IExpZ2h0Q29tcG9uZW50W107XG4gIHByaXZhdGUgc3RhdGljIF9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBwcml2YXRlIHN0YXRpYyBfX3dlYnhyU3lzdGVtOiBXZWJYUlN5c3RlbTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjb21wb25lbnRNYXRyaWNlczogU2hhZGVyU2VtYW50aWNzSW5mb1tdID0gW1xuICAgIHtcbiAgICAgIHNlbWFudGljOiAndmVydGV4QXR0cmlidXRlc0V4aXN0ZW5jZUFycmF5JyxcbiAgICAgIGNvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlLlNjYWxhckFycmF5LFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5JbnQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlbWFudGljOiAnd29ybGRNYXRyaXgnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuTWF0NCxcbiAgICAgIGNvbXBvbmVudFR5cGU6IENvbXBvbmVudFR5cGUuRmxvYXQsXG4gICAgICBzdGFnZTogU2hhZGVyVHlwZS5WZXJ0ZXhTaGFkZXIsXG4gICAgICBtaW46IC1OdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgbWF4OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgaXNJbnRlcm5hbFNldHRpbmc6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZW1hbnRpYzogJ25vcm1hbE1hdHJpeCcsXG4gICAgICBjb21wb3NpdGlvblR5cGU6IENvbXBvc2l0aW9uVHlwZS5NYXQzLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5GbG9hdCxcbiAgICAgIHN0YWdlOiBTaGFkZXJUeXBlLlZlcnRleFNoYWRlcixcbiAgICAgIG1pbjogLU51bWJlci5NQVhfVkFMVUUsXG4gICAgICBtYXg6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICBpc0ludGVybmFsU2V0dGluZzogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlbWFudGljOiAnaXNCaWxsYm9hcmQnLFxuICAgICAgY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGUuU2NhbGFyLFxuICAgICAgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZS5Cb29sLFxuICAgICAgc3RhZ2U6IFNoYWRlclR5cGUuVmVydGV4U2hhZGVyLFxuICAgICAgbWluOiAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIG1heDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgIGlzSW50ZXJuYWxTZXR0aW5nOiB0cnVlLFxuICAgIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX192ZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9uc191bmlmb3JtID0gYHVuaWZvcm0gbWF0NCB1X3dvcmxkTWF0cml4O1xudW5pZm9ybSBtYXQzIHVfbm9ybWFsTWF0cml4O1xudW5pZm9ybSBib29sIHVfaXNCaWxsYm9hcmQ7XG5cbm1hdDQgZ2V0X3dvcmxkTWF0cml4KGZsb2F0IGluc3RhbmNlSWQpIHtcbiAgcmV0dXJuIHVfd29ybGRNYXRyaXg7XG59XG5cbm1hdDMgZ2V0X25vcm1hbE1hdHJpeChmbG9hdCBpbnN0YW5jZUlkKSB7XG4gIHJldHVybiB1X25vcm1hbE1hdHJpeDtcbn1cblxuYm9vbCBnZXRfaXNWaXNpYmxlKGZsb2F0IGluc3RhbmNlSWQpIHtcbiAgcmV0dXJuIHRydWU7IC8vIHZpc2liaWxpdHkgaXMgaGFuZGxlZCBpbiBDUFUgc2lkZSBpbiBXZWJHTFN0cmF0ZWd5VW5pZm9ybSwgc28gdGhpcyBpcyBkdW1teSB2YWx1ZS5cbn1cblxuYm9vbCBnZXRfaXNCaWxsYm9hcmQoZmxvYXQgaW5zdGFuY2VJZCkge1xuICByZXR1cm4gdV9pc0JpbGxib2FyZDtcbn1cblxuI2lmZGVmIFJOX0lTX1ZFUlRFWF9TSEFERVJcbiMgaWZkZWYgUk5fSVNfTU9SUEhJTkdcbiAgdmVjMyBnZXRfcG9zaXRpb24oZmxvYXQgdmVydGV4SWQsIHZlYzMgYmFzZVBvc2l0aW9uKSB7XG4gICAgdmVjMyBwb3NpdGlvbiA9IGJhc2VQb3NpdGlvbjtcbiAgICBpbnQgc2NhbGFyX2lkeCA9IDMgKiBpbnQodmVydGV4SWQpO1xuICAgICNpZmRlZiBHTFNMX0VTM1xuICAgICAgaW50IHBvc0luNGJ5dGVzID0gc2NhbGFyX2lkeCAlIDQ7XG4gICAgI2Vsc2VcbiAgICAgIGludCBwb3NJbjRieXRlcyA9IGludChtb2QoZmxvYXQoc2NhbGFyX2lkeCksIDQuMCkpO1xuICAgICNlbmRpZlxuICAgIGZvciAoaW50IGk9MDsgaTwke0NvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyfTsgaSsrKSB7XG5cbiAgICAgIGludCBiYXNlUG9zSW4xNmJ5dGVzID0gdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25baV0gKyAoc2NhbGFyX2lkeCAtIHBvc0luNGJ5dGVzKS80O1xuXG4gICAgICB2ZWMzIGFkZFBvcyA9IHZlYzMoMC4wKTtcbiAgICAgIGlmIChwb3NJbjRieXRlcyA9PSAwKSB7XG4gICAgICAgIHZlYzQgdmFsID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xuICAgICAgICBhZGRQb3MgPSB2YWwueHl6O1xuICAgICAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAxKSB7XG4gICAgICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcbiAgICAgICAgYWRkUG9zID0gdmVjMyh2YWwwLnl6dyk7XG4gICAgICB9IGVsc2UgaWYgKHBvc0luNGJ5dGVzID09IDIpIHtcbiAgICAgICAgdmVjNCB2YWwwID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMpO1xuICAgICAgICB2ZWM0IHZhbDEgPSBmZXRjaEVsZW1lbnQoYmFzZVBvc0luMTZieXRlcysxKTtcbiAgICAgICAgYWRkUG9zID0gdmVjMyh2YWwwLnp3LCB2YWwxLngpO1xuICAgICAgfSBlbHNlIGlmIChwb3NJbjRieXRlcyA9PSAzKSB7XG4gICAgICAgIHZlYzQgdmFsMCA9IGZldGNoRWxlbWVudChiYXNlUG9zSW4xNmJ5dGVzKTtcbiAgICAgICAgdmVjNCB2YWwxID0gZmV0Y2hFbGVtZW50KGJhc2VQb3NJbjE2Ynl0ZXMrMSk7XG4gICAgICAgIGFkZFBvcyA9IHZlYzModmFsMC53LCB2YWwxLnh5KTtcbiAgICAgIH1cblxuICAgICAgLy8gaW50IGluZGV4ID0gdV9kYXRhVGV4dHVyZU1vcnBoT2Zmc2V0UG9zaXRpb25baV0gKyAxICogaW50KHZlcnRleElkKTtcbiAgICAgIC8vIHZlYzMgYWRkUG9zID0gZmV0Y2hFbGVtZW50KHVfZGF0YVRleHR1cmUsIGluZGV4LCB3aWR0aE9mRGF0YVRleHR1cmUsIGhlaWdodE9mRGF0YVRleHR1cmUpLnh5ejtcblxuICAgICAgcG9zaXRpb24gKz0gYWRkUG9zICogdV9tb3JwaFdlaWdodHNbaV07XG4gICAgICBpZiAoaSA9PSB1X21vcnBoVGFyZ2V0TnVtYmVyLTEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG4jIGVuZGlmXG4jZW5kaWZcbiAgYDtcblxuICAvKipcbiAgICogc2V0dXAgc2hhZGVyIHByb2dyYW0gZm9yIHRoZSBtYXRlcmlhbCBpbiB0aGlzIFdlYkdMIHN0cmF0ZWd5XG4gICAqIEBwYXJhbSBtYXRlcmlhbCAtIGEgbWF0ZXJpYWwgdG8gc2V0dXAgc2hhZGVyIHByb2dyYW1cbiAgICovXG4gIHB1YmxpYyBzZXR1cFNoYWRlckZvck1hdGVyaWFsKG1hdGVyaWFsOiBNYXRlcmlhbCwgcHJpbWl0aXZlOiBQcmltaXRpdmUpOiBDR0FQSVJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgZ2x3ID0gd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXIhO1xuXG4gICAgY29uc3QgW3Byb2dyYW1VaWQsIG5ld09uZV0gPSBtYXRlcmlhbC5fY3JlYXRlUHJvZ3JhbVdlYkdMKFxuICAgICAgV2ViR0xTdHJhdGVneVVuaWZvcm0uX192ZXJ0ZXhTaGFkZXJNZXRob2REZWZpbml0aW9uc191bmlmb3JtLFxuICAgICAgU2hhZGVyU2VtYW50aWNzLmdldFNoYWRlclByb3BlcnR5LFxuICAgICAgcHJpbWl0aXZlLFxuICAgICAgZ2x3LmlzV2ViR0wyXG4gICAgKTtcblxuICAgIGlmIChuZXdPbmUpIHtcbiAgICAgIG1hdGVyaWFsLl9zZXR1cEJhc2ljVW5pZm9ybXNMb2NhdGlvbnMocHJpbWl0aXZlKTtcblxuICAgICAgbWF0ZXJpYWwuX3NldFVuaWZvcm1Mb2NhdGlvbnNPZk1hdGVyaWFsTm9kZXModHJ1ZSwgcHJpbWl0aXZlKTtcblxuICAgICAgY29uc3Qgc2hhZGVyU2VtYW50aWNzSW5mb3MgPSBXZWJHTFN0cmF0ZWd5VW5pZm9ybS5jb21wb25lbnRNYXRyaWNlcztcbiAgICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9zUG9pbnRTcHJpdGUgPVxuICAgICAgICBXZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kLmdldFBvaW50U3ByaXRlU2hhZGVyU2VtYW50aWNzSW5mb0FycmF5KCk7XG5cbiAgICAgIG1hdGVyaWFsLl9zZXR1cEFkZGl0aW9uYWxVbmlmb3JtTG9jYXRpb25zKFxuICAgICAgICBzaGFkZXJTZW1hbnRpY3NJbmZvcy5jb25jYXQoc2hhZGVyU2VtYW50aWNzSW5mb3NQb2ludFNwcml0ZSksXG4gICAgICAgIHRydWUsXG4gICAgICAgIHByaW1pdGl2ZVxuICAgICAgKTtcblxuICAgICAgV2ViR0xTdHJhdGVneVVuaWZvcm0uX19nbG9iYWxEYXRhUmVwb3NpdG9yeS5fc2V0VW5pZm9ybUxvY2F0aW9uc0ZvclVuaWZvcm1Nb2RlT25seShcbiAgICAgICAgbWF0ZXJpYWwuZ2V0U2hhZGVyUHJvZ3JhbVVpZChwcmltaXRpdmUpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ncmFtVWlkO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlLXNldHVwIHNoYWRlciBwcm9ncmFtIGZvciB0aGUgbWF0ZXJpYWwgaW4gdGhpcyBXZWJHTCBzdHJhdGVneVxuICAgKiBAcGFyYW0gbWF0ZXJpYWwgLSBhIG1hdGVyaWFsIHRvIHJlLXNldHVwIHNoYWRlciBwcm9ncmFtXG4gICAqIEBwYXJhbSB1cGRhdGVkU2hhZGVyU291cmNlcyAtIHVwZGF0ZWQgc2hhZGVyIHNvdXJjZXNcbiAgICogQHBhcmFtIG9uRXJyb3IgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgZXJyb3JcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBfcmVTZXR1cFNoYWRlckZvck1hdGVyaWFsQnlTcGVjdG9yKFxuICAgIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgICB1cGRhdGVkU2hhZGVyU291cmNlczogU2hhZGVyU291cmNlcyxcbiAgICBvbkVycm9yOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gICk6IENHQVBJUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IFtwcm9ncmFtVWlkLCBuZXdPbmVdID0gbWF0ZXJpYWwuX2NyZWF0ZVByb2dyYW1CeVVwZGF0ZWRTb3VyY2VzKFxuICAgICAgdXBkYXRlZFNoYWRlclNvdXJjZXMsXG4gICAgICBvbkVycm9yXG4gICAgKTtcbiAgICBpZiAocHJvZ3JhbVVpZCA9PT0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQpIHtcbiAgICAgIHJldHVybiBwcm9ncmFtVWlkO1xuICAgIH1cblxuICAgIGlmIChuZXdPbmUpIHtcbiAgICAgIG1hdGVyaWFsLl9zZXR1cEJhc2ljVW5pZm9ybXNMb2NhdGlvbnMoKTtcblxuICAgICAgbWF0ZXJpYWwuX3NldFVuaWZvcm1Mb2NhdGlvbnNPZk1hdGVyaWFsTm9kZXModHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHNoYWRlclNlbWFudGljc0luZm9zID0gV2ViR0xTdHJhdGVneVVuaWZvcm0uY29tcG9uZW50TWF0cmljZXM7XG4gICAgICBjb25zdCBzaGFkZXJTZW1hbnRpY3NJbmZvc1BvaW50U3ByaXRlID1cbiAgICAgICAgV2ViR0xTdHJhdGVneUNvbW1vbk1ldGhvZC5nZXRQb2ludFNwcml0ZVNoYWRlclNlbWFudGljc0luZm9BcnJheSgpO1xuXG4gICAgICBtYXRlcmlhbC5fc2V0dXBBZGRpdGlvbmFsVW5pZm9ybUxvY2F0aW9ucyhcbiAgICAgICAgc2hhZGVyU2VtYW50aWNzSW5mb3MuY29uY2F0KHNoYWRlclNlbWFudGljc0luZm9zUG9pbnRTcHJpdGUpLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cblxuICAgIFdlYkdMU3RyYXRlZ3lVbmlmb3JtLl9fZ2xvYmFsRGF0YVJlcG9zaXRvcnkuX3NldFVuaWZvcm1Mb2NhdGlvbnNGb3JVbmlmb3JtTW9kZU9ubHkoXG4gICAgICBtYXRlcmlhbC5nZXRTaGFkZXJQcm9ncmFtVWlkKClcbiAgICApO1xuXG4gICAgcmV0dXJuIHByb2dyYW1VaWQ7XG4gIH1cblxuICAkbG9hZChtZXNoQ29tcG9uZW50OiBNZXNoQ29tcG9uZW50KSB7XG4gICAgY29uc3QgbWVzaCA9IG1lc2hDb21wb25lbnQubWVzaCBhcyBNZXNoO1xuICAgIGlmICghSXMuZXhpc3QobWVzaCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBzZXR1cCBWQk8gYW5kIFZBT1xuICAgIGlmICghbWVzaC5pc1NldFVwRG9uZSgpKSB7XG4gICAgICB1cGRhdGVWQk9BbmRWQU8obWVzaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcmVyZW5kZXIoKTogdm9pZCB7XG4gICAgdGhpcy5fX2xpZ2h0Q29tcG9uZW50cyA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50c1dpdGhUeXBlKFxuICAgICAgTGlnaHRDb21wb25lbnRcbiAgICApIGFzIExpZ2h0Q29tcG9uZW50W107XG5cbiAgICAvLyBTZXR1cCBEYXRhIFRleHR1cmVcbiAgICBpZiAodGhpcy5fX2RhdGFUZXh0dXJlVWlkID09PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgY29uc3QgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlciA9IE1lbW9yeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcjogQnVmZmVyIHwgdW5kZWZpbmVkID0gbWVtb3J5TWFuYWdlci5nZXRCdWZmZXIoQnVmZmVyVXNlLkdQVVZlcnRleERhdGEpO1xuICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBidWZmZXIudGFrZW5TaXplSW5CeXRlIC8gTWVtb3J5TWFuYWdlci5idWZmZXJXaWR0aExlbmd0aCAvIDQgPlxuICAgICAgICBNZW1vcnlNYW5hZ2VyLmJ1ZmZlckhlaWdodExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIExvZ2dlci53YXJuKCdUaGUgYnVmZmVyIHNpemUgZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0ZXh0dXJlLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YVRleHR1cmVCeXRlU2l6ZSA9XG4gICAgICAgIE1lbW9yeU1hbmFnZXIuYnVmZmVyV2lkdGhMZW5ndGggKiBNZW1vcnlNYW5hZ2VyLmJ1ZmZlckhlaWdodExlbmd0aCAqIDQgKiA0O1xuICAgICAgY29uc3QgY29uY2F0QXJyYXlCdWZmZXIgPSBNaXNjVXRpbC5jb25jYXRBcnJheUJ1ZmZlcnMyKHtcbiAgICAgICAgZmluYWxTaXplOiBkYXRhVGV4dHVyZUJ5dGVTaXplLFxuICAgICAgICBzcmNzOiBbYnVmZmVyLmdldEFycmF5QnVmZmVyKCldLFxuICAgICAgICBzcmNzQ29weVNpemU6IFtidWZmZXIudGFrZW5TaXplSW5CeXRlXSxcbiAgICAgICAgc3Jjc09mZnNldDogWzBdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmbG9hdERhdGFUZXh0dXJlQnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShjb25jYXRBcnJheUJ1ZmZlcik7XG5cbiAgICAgIHRoaXMuX19kYXRhVGV4dHVyZVVpZCA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVUZXh0dXJlRnJvbVR5cGVkQXJyYXkoXG4gICAgICAgIGZsb2F0RGF0YVRleHR1cmVCdWZmZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBsZXZlbDogMCxcbiAgICAgICAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZUZvcm1hdC5SR0JBMzJGLFxuICAgICAgICAgIHdpZHRoOiBNZW1vcnlNYW5hZ2VyLmJ1ZmZlcldpZHRoTGVuZ3RoLFxuICAgICAgICAgIGhlaWdodDogTWVtb3J5TWFuYWdlci5idWZmZXJIZWlnaHRMZW5ndGgsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXQuUkdCQSxcbiAgICAgICAgICB0eXBlOiBDb21wb25lbnRUeXBlLkZsb2F0LFxuICAgICAgICAgIGdlbmVyYXRlTWlwbWFwOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhdHRhY2hHUFVEYXRhKHByaW1pdGl2ZTogUHJpbWl0aXZlKTogdm9pZCB7fVxuXG4gIGF0dGFjaFZlcnRleERhdGEoXG4gICAgaTogbnVtYmVyLFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIGdsdzogV2ViR0xDb250ZXh0V3JhcHBlcixcbiAgICBpbnN0YW5jZUlEQnVmZmVyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlXG4gICkge31cblxuICBhdHRhY2hWZXJ0ZXhEYXRhSW5uZXIoXG4gICAgbWVzaDogTWVzaCxcbiAgICBwcmltaXRpdmU6IFByaW1pdGl2ZSxcbiAgICBwcmltaXRpdmVVaWQ6IEluZGV4LFxuICAgIGdsdzogV2ViR0xDb250ZXh0V3JhcHBlcixcbiAgICBpbnN0YW5jZUlEQnVmZmVyVWlkOiBXZWJHTFJlc291cmNlSGFuZGxlXG4gICkge1xuICAgIGNvbnN0IHZhb0hhbmRsZXMgPSBwcmltaXRpdmUudmVydGV4SGFuZGxlcyE7XG4gICAgY29uc3QgdmFvID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2UoXG4gICAgICBtZXNoLmdldFZhb1VpZHNCeVByaW1pdGl2ZVVpZChwcmltaXRpdmVVaWQpXG4gICAgKSBhcyBXZWJHTFZlcnRleEFycmF5T2JqZWN0T0VTO1xuICAgIGNvbnN0IGdsID0gZ2x3LmdldFJhd0NvbnRleHQoKTtcblxuICAgIGlmICh2YW8gIT0gbnVsbCkge1xuICAgICAgZ2x3LmJpbmRWZXJ0ZXhBcnJheSh2YW8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuc2V0VmVydGV4RGF0YVRvUGlwZWxpbmUoXG4gICAgICAgIHZhb0hhbmRsZXMsXG4gICAgICAgIHByaW1pdGl2ZSxcbiAgICAgICAgaW5zdGFuY2VJREJ1ZmZlclVpZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlibyA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgICB2YW9IYW5kbGVzLmlib0hhbmRsZSFcbiAgICAgICkgYXMgV2ViR0xCdWZmZXI7XG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpYm8pO1xuICAgIH1cbiAgfVxuXG4gIGRldHRhY2hWZXJ0ZXhEYXRhKGdsdzogV2ViR0xDb250ZXh0V3JhcHBlcikge1xuICAgIGNvbnN0IGdsID0gZ2x3LmdldFJhd0NvbnRleHQoKTtcbiAgICBpZiAoZ2x3LmJpbmRWZXJ0ZXhBcnJheSkge1xuICAgICAgZ2x3LmJpbmRWZXJ0ZXhBcnJheShudWxsKTtcbiAgICB9XG5cbiAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBXZWJHTFN0cmF0ZWd5VW5pZm9ybSgpO1xuICAgICAgY29uc3Qgcm5YUk1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGUoJ3hyJykgYXMgUm5YUjtcbiAgICAgIGNvbnN0IHdlYnhyU3lzdGVtID0gcm5YUk1vZHVsZS5XZWJYUlN5c3RlbS5nZXRJbnN0YW5jZSgpO1xuICAgICAgV2ViR0xTdHJhdGVneVVuaWZvcm0uX193ZWJ4clN5c3RlbSA9IHdlYnhyU3lzdGVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICBjb21tb25fJHJlbmRlcihcbiAgICBwcmltaXRpdmVVaWRzOiBQcmltaXRpdmVVSURbXSxcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIHJlbmRlclBhc3NUaWNrQ291bnQ6IENvdW50XG4gICkge1xuICAgIGlmICh0eXBlb2Ygc3BlY3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHNwZWN0b3Iuc2V0TWFya2VyKCd8ICB8ICBVbmlmb3JtOiRyZW5kZXIjJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2x3ID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmN1cnJlbnRXZWJHTENvbnRleHRXcmFwcGVyITtcbiAgICBjb25zdCBnbCA9IGdsdy5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcblxuICAgIGlmIChyZW5kZXJQYXNzLmlzQnVmZmVyTGVzc1JlbmRlcmluZ01vZGUoKSkge1xuICAgICAgdGhpcy5fX3JlbmRlcldpdGhvdXRCdWZmZXJzKGdsLCByZW5kZXJQYXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxldCByZW5kZXJlZFNvbWV0aGluZyA9IGZhbHNlO1xuXG4gICAgLy8gRm9yIG9wYXF1ZSBwcmltaXRpdmVzXG4gICAgaWYgKHJlbmRlclBhc3MuX3RvUmVuZGVyT3BhcXVlUHJpbWl0aXZlcykge1xuICAgICAgaWYgKCFyZW5kZXJQYXNzLmRlcHRoV3JpdGVNYXNrKSB7XG4gICAgICAgIGdsLmRlcHRoTWFzayhmYWxzZSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSByZW5kZXJQYXNzLl9sYXN0T3BhcXVlSW5kZXg7IGkrKykge1xuICAgICAgICBjb25zdCBwcmltaXRpdmVVaWQgPSBwcmltaXRpdmVVaWRzW2ldO1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVySW5uZXIocHJpbWl0aXZlVWlkLCBnbHcsIHJlbmRlclBhc3MsIHJlbmRlclBhc3NUaWNrQ291bnQpO1xuICAgICAgICByZW5kZXJlZFNvbWV0aGluZyB8fD0gcmVuZGVyZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHRyYW5zbHVjZW50IHByaW1pdGl2ZXNcbiAgICBpZiAocmVuZGVyUGFzcy5fdG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJQYXNzLl9sYXN0T3BhcXVlSW5kZXggKyAxOyBpIDw9IHJlbmRlclBhc3MuX2xhc3RUcmFuc2x1Y2VudEluZGV4OyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlVWlkID0gcHJpbWl0aXZlVWlkc1tpXTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLnJlbmRlcklubmVyKHByaW1pdGl2ZVVpZCwgZ2x3LCByZW5kZXJQYXNzLCByZW5kZXJQYXNzVGlja0NvdW50KTtcbiAgICAgICAgcmVuZGVyZWRTb21ldGhpbmcgfHw9IHJlbmRlcmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU1lc2hSZW5kZXJlckNvbXBvbmVudC5pc0RlcHRoTWFza1RydWVGb3JCbGVuZFByaW1pdGl2ZXMpIHtcbiAgICAgICAgLy8gZGlzYWJsZSBkZXB0aCB3cml0ZSBmb3IgYmxlbmQgcHJpbWl0aXZlc1xuICAgICAgICBnbC5kZXB0aE1hc2soZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gcmVuZGVyUGFzcy5fbGFzdFRyYW5zbHVjZW50SW5kZXggKyAxOyBpIDw9IHJlbmRlclBhc3MuX2xhc3RCbGVuZEluZGV4OyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlVWlkID0gcHJpbWl0aXZlVWlkc1tpXTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLnJlbmRlcklubmVyKHByaW1pdGl2ZVVpZCwgZ2x3LCByZW5kZXJQYXNzLCByZW5kZXJQYXNzVGlja0NvdW50KTtcbiAgICAgICAgcmVuZGVyZWRTb21ldGhpbmcgfHw9IHJlbmRlcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICBnbC5kZXB0aE1hc2sodHJ1ZSk7XG5cbiAgICB0aGlzLl9fd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkudW5iaW5kVGV4dHVyZVNhbXBsZXJzKCk7XG5cbiAgICByZXR1cm4gcmVuZGVyZWRTb21ldGhpbmc7XG4gIH1cblxuICBwcml2YXRlIF9fcmVuZGVyV2l0aG91dEJ1ZmZlcnMoZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsIHJlbmRlclBhc3M6IFJlbmRlclBhc3MpIHtcbiAgICAvLyBzZXR1cCBzaGFkZXIgcHJvZ3JhbVxuICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHJlbmRlclBhc3MubWF0ZXJpYWwhO1xuICAgIGNvbnN0IHByaW1pdGl2ZTogUHJpbWl0aXZlID0gcmVuZGVyUGFzcy5fZHVtbXlQcmltaXRpdmVGb3JCdWZmZXJMZXNzUmVuZGVyaW5nO1xuICAgIHNldHVwU2hhZGVyUHJvZ3JhbShtYXRlcmlhbCwgcHJpbWl0aXZlLCB0aGlzKTtcblxuICAgIGNvbnN0IHNoYWRlclByb2dyYW1VaWQgPSBtYXRlcmlhbC5nZXRTaGFkZXJQcm9ncmFtVWlkKHByaW1pdGl2ZSk7XG4gICAgY29uc3Qgc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgc2hhZGVyUHJvZ3JhbVVpZFxuICAgICkhIGFzIFdlYkdMUHJvZ3JhbTtcbiAgICBnbC51c2VQcm9ncmFtKHNoYWRlclByb2dyYW0pO1xuICAgIHRoaXMuX19sYXN0U2hhZGVyID0gc2hhZGVyUHJvZ3JhbVVpZDtcblxuICAgIHRoaXMuYmluZERhdGFUZXh0dXJlKGdsLCBzaGFkZXJQcm9ncmFtKTtcblxuICAgIFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2Quc2V0V2ViR0xQYXJhbWV0ZXJzKG1hdGVyaWFsLCBnbCk7XG4gICAgbWF0ZXJpYWwuX3NldFBhcmFtZXRlcnNUb0dwdVdlYkdMV2l0aE91dEludGVybmFsU2V0dGluZyh7XG4gICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgZmlyc3RUaW1lOiB0cnVlLFxuICAgICAgaXNVbmlmb3JtTW9kZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGlzVnJNYWluUGFzcyA9IFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QuaXNWck1haW5QYXNzKHJlbmRlclBhc3MpO1xuICAgIGlmICgoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnZyU3RhdGUgIT0gbnVsbCAmJiBpc1ZyTWFpblBhc3MpIHtcbiAgICAgIGNvbnN0IHZyU3RhdGUgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmdldFZhbHVlKCd2clN0YXRlJywgMCkgYXMgVmVjdG9yMjtcbiAgICAgIHZyU3RhdGUuX3ZbMF0gPSBpc1ZyTWFpblBhc3MgPyAxIDogMDtcbiAgICAgIHZyU3RhdGUuX3ZbMV0gPSAwO1xuICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTJpdigoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnZyU3RhdGUsIHZyU3RhdGUuX3YpO1xuICAgIH1cblxuICAgIGlmIChyZW5kZXJQYXNzLmRlcHRoV3JpdGVNYXNrKSB7XG4gICAgICBnbC5kZXB0aE1hc2sodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmRlcHRoTWFzayhmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnNldFZpZXdwb3J0KHJlbmRlclBhc3MuZ2V0Vmlld3BvcnQoKSk7XG5cbiAgICBnbC5kcmF3QXJyYXlzKFxuICAgICAgcmVuZGVyUGFzcy5fcHJpbWl0aXZlTW9kZUZvckJ1ZmZlckxlc3NSZW5kZXJpbmcuaW5kZXgsXG4gICAgICAwLFxuICAgICAgcmVuZGVyUGFzcy5fZHJhd1ZlcnRleE51bWJlckZvckJ1ZmZlckxlc3NSZW5kZXJpbmdcbiAgICApO1xuICB9XG5cbiAgcmVuZGVySW5uZXIoXG4gICAgcHJpbWl0aXZlVWlkOiBQcmltaXRpdmVVSUQsXG4gICAgZ2x3OiBXZWJHTENvbnRleHRXcmFwcGVyLFxuICAgIHJlbmRlclBhc3M6IFJlbmRlclBhc3MsXG4gICAgcmVuZGVyUGFzc1RpY2tDb3VudDogQ291bnRcbiAgKSB7XG4gICAgY29uc3QgZ2wgPSBnbHcuZ2V0UmF3Q29udGV4dCgpO1xuICAgIGNvbnN0IHByaW1pdGl2ZSA9IFByaW1pdGl2ZS5nZXRQcmltaXRpdmUocHJpbWl0aXZlVWlkKTtcbiAgICBpZiAocHJpbWl0aXZlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF0ZXJpYWw6IE1hdGVyaWFsID0gcmVuZGVyUGFzcy5nZXRBcHByb3ByaWF0ZU1hdGVyaWFsKHByaW1pdGl2ZSk7XG4gICAgc2V0dXBTaGFkZXJQcm9ncmFtKG1hdGVyaWFsLCBwcmltaXRpdmUsIHRoaXMpO1xuXG4gICAgY29uc3QgbWVzaCA9IHByaW1pdGl2ZS5tZXNoIGFzIE1lc2g7XG4gICAgY29uc3QgbWVzaEVudGl0aWVzID0gbWVzaC5tZXNoRW50aXRpZXNJbm5lcjtcblxuICAgIGxldCByZW5kZXJlZFNvbWV0aGluZyA9IGZhbHNlO1xuICAgIGNvbnN0IGlzVnJNYWluUGFzcyA9IFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QuaXNWck1haW5QYXNzKHJlbmRlclBhc3MpO1xuICAgIGNvbnN0IGRpc3BsYXlDb3VudCA9IFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2QuZ2V0RGlzcGxheUNvdW50KFxuICAgICAgaXNWck1haW5QYXNzLFxuICAgICAgV2ViR0xTdHJhdGVneVVuaWZvcm0uX193ZWJ4clN5c3RlbVxuICAgICk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbWVzaEVudGl0aWVzKSB7XG4gICAgICBpZiAoZW50aXR5LmdldFNjZW5lR3JhcGgoKS5faXNDdWxsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNoQ29tcG9uZW50ID0gZW50aXR5LmdldE1lc2goKTtcblxuICAgICAgdGhpcy5hdHRhY2hWZXJ0ZXhEYXRhSW5uZXIoXG4gICAgICAgIG1lc2hDb21wb25lbnQubWVzaCEsXG4gICAgICAgIHByaW1pdGl2ZSxcbiAgICAgICAgcHJpbWl0aXZlVWlkLFxuICAgICAgICBnbHcsXG4gICAgICAgIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzaGFkZXJQcm9ncmFtVWlkID0gbWF0ZXJpYWwuZ2V0U2hhZGVyUHJvZ3JhbVVpZChwcmltaXRpdmUpO1xuICAgICAgY29uc3Qgc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX193ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgICBzaGFkZXJQcm9ncmFtVWlkXG4gICAgICApISBhcyBXZWJHTFByb2dyYW07XG5cbiAgICAgIGxldCBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICBpZiAoc2hhZGVyUHJvZ3JhbVVpZCAhPT0gdGhpcy5fX2xhc3RTaGFkZXIgfHwgKGdsIGFzIGFueSkuX19jaGFuZ2VkUHJvZ3JhbSkge1xuICAgICAgICBpZiAoaXNTa2lwRHJhd2luZyhtYXRlcmlhbCwgcHJpbWl0aXZlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmaXJzdFRpbWUgPSB0cnVlO1xuICAgICAgICAoZ2wgYXMgYW55KS5fX2NoYW5nZWRQcm9ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgZ2wudXNlUHJvZ3JhbShzaGFkZXJQcm9ncmFtKTtcbiAgICAgICAgdGhpcy5iaW5kRGF0YVRleHR1cmUoZ2wsIHNoYWRlclByb2dyYW0pO1xuXG4gICAgICAgIGlmIChBbmltYXRpb25Db21wb25lbnQuaXNBbmltYXRpbmcpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5nZXRWYWx1ZSgndGltZScsIDApIGFzIFNjYWxhcjtcbiAgICAgICAgICAoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLl9nbC51bmlmb3JtMWYoKHNoYWRlclByb2dyYW0gYXMgYW55KS50aW1lLCB0aW1lLl92WzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19sYXN0U2hhZGVyID0gc2hhZGVyUHJvZ3JhbVVpZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX19sYXN0TWF0ZXJpYWw/LmRlcmVmKCkgIT09IG1hdGVyaWFsKSB7XG4gICAgICAgIGZpcnN0VGltZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX19sYXN0TWF0ZXJpYWwgPSBuZXcgV2Vha1JlZihtYXRlcmlhbCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGRpc3BsYXlJZHggPSAwOyBkaXNwbGF5SWR4IDwgZGlzcGxheUNvdW50OyBkaXNwbGF5SWR4KyspIHtcbiAgICAgICAgaWYgKGlzVnJNYWluUGFzcykge1xuICAgICAgICAgIFdlYkdMU3RyYXRlZ3lDb21tb25NZXRob2Quc2V0VlJWaWV3cG9ydChyZW5kZXJQYXNzLCBkaXNwbGF5SWR4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICBXZWJHTFN0cmF0ZWd5Q29tbW9uTWV0aG9kLnNldFdlYkdMUGFyYW1ldGVycyhtYXRlcmlhbCwgZ2wpO1xuICAgICAgICAgIG1hdGVyaWFsLl9zZXRQYXJhbWV0ZXJzVG9HcHVXZWJHTCh7XG4gICAgICAgICAgICBtYXRlcmlhbCxcbiAgICAgICAgICAgIHNoYWRlclByb2dyYW0sXG4gICAgICAgICAgICBmaXJzdFRpbWUsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIHNldFVuaWZvcm06IHRydWUsXG4gICAgICAgICAgICAgIGdsdzogZ2x3LFxuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgICAgICAgICAgICB3b3JsZE1hdHJpeDogZW50aXR5LmdldFNjZW5lR3JhcGgoKS5tYXRyaXgsXG4gICAgICAgICAgICAgIG5vcm1hbE1hdHJpeDogZW50aXR5LmdldFNjZW5lR3JhcGgoKS5ub3JtYWxNYXRyaXgsXG4gICAgICAgICAgICAgIGlzQmlsbGJvYXJkOiBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzQmlsbGJvYXJkLFxuICAgICAgICAgICAgICBsaWdodENvbXBvbmVudHM6IHRoaXMuX19saWdodENvbXBvbmVudHMhLFxuICAgICAgICAgICAgICByZW5kZXJQYXNzOiByZW5kZXJQYXNzLFxuICAgICAgICAgICAgICBkaWZmdXNlQ3ViZTogZW50aXR5LnRyeVRvR2V0TWVzaFJlbmRlcmVyKCk/LmRpZmZ1c2VDdWJlTWFwLFxuICAgICAgICAgICAgICBzcGVjdWxhckN1YmU6IGVudGl0eS50cnlUb0dldE1lc2hSZW5kZXJlcigpPy5zcGVjdWxhckN1YmVNYXAsXG4gICAgICAgICAgICAgIGlzVnI6IGlzVnJNYWluUGFzcyxcbiAgICAgICAgICAgICAgZGlzcGxheUlkeCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzaGFkZXJQcm9ncmFtIGFzIGFueSkudnJTdGF0ZSAhPSBudWxsICYmIGlzVnJNYWluUGFzcykge1xuICAgICAgICAgIGNvbnN0IHZyU3RhdGUgPSBHbG9iYWxEYXRhUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmdldFZhbHVlKCd2clN0YXRlJywgMCkgYXMgVmVjdG9yMjtcbiAgICAgICAgICB2clN0YXRlLl92WzBdID0gaXNWck1haW5QYXNzID8gMSA6IDA7XG4gICAgICAgICAgdnJTdGF0ZS5fdlsxXSA9IGRpc3BsYXlJZHg7XG4gICAgICAgICAgKHNoYWRlclByb2dyYW0gYXMgYW55KS5fZ2wudW5pZm9ybTJpdigoc2hhZGVyUHJvZ3JhbSBhcyBhbnkpLnZyU3RhdGUsIHZyU3RhdGUuX3YpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaW1pdGl2ZS5pbmRpY2VzQWNjZXNzb3IpIHtcbiAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoXG4gICAgICAgICAgICBwcmltaXRpdmUucHJpbWl0aXZlTW9kZS5pbmRleCxcbiAgICAgICAgICAgIHByaW1pdGl2ZS5pbmRpY2VzQWNjZXNzb3IuZWxlbWVudENvdW50LFxuICAgICAgICAgICAgcHJpbWl0aXZlLmluZGljZXNBY2Nlc3Nvci5jb21wb25lbnRUeXBlLmluZGV4LFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wuZHJhd0FycmF5cyhcbiAgICAgICAgICAgIHByaW1pdGl2ZS5wcmltaXRpdmVNb2RlLmluZGV4LFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHByaW1pdGl2ZS5nZXRWZXJ0ZXhDb3VudEFzVmVydGljZXNCYXNlZCgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVuZGVyZWRTb21ldGhpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZFNvbWV0aGluZztcbiAgfVxuXG4gIHByaXZhdGUgYmluZERhdGFUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICAgIHNoYWRlclByb2dyYW06IFdlYkdMUHJvZ3JhbVxuICApIHtcbiAgICBnbC51bmlmb3JtMWkoKHNoYWRlclByb2dyYW0gYXMgYW55KS5kYXRhVGV4dHVyZSwgNyk7XG4gICAgdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmJpbmRUZXh0dXJlMkQoNywgdGhpcy5fX2RhdGFUZXh0dXJlVWlkKTtcbiAgICBjb25zdCBzYW1wbGVyVWlkID0gdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmNyZWF0ZU9yR2V0VGV4dHVyZVNhbXBsZXJSZXBlYXROZWFyZXN0KCk7XG4gICAgdGhpcy5fX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmJpbmRUZXh0dXJlU2FtcGxlcig3LCBzYW1wbGVyVWlkKTtcbiAgfVxuXG4gIC8vICRyZW5kZXIoKSB7fVxufVxuIiwiaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoLCBQcm9jZXNzQXBwcm9hY2hFbnVtIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgV2ViR0xTdHJhdGVneSB9IGZyb20gJy4vV2ViR0xTdHJhdGVneSc7XG5pbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9zeXN0ZW0vTW9kdWxlTWFuYWdlcic7XG5cbmNvbnN0IGdldFJlbmRlcmluZ1N0cmF0ZWd5ID0gZnVuY3Rpb24gKHByb2Nlc3NBcHByb2FjaDogUHJvY2Vzc0FwcHJvYWNoRW51bSk6IFdlYkdMU3RyYXRlZ3kge1xuICAvLyBTdHJhdGVneVxuICBjb25zdCBtb2R1bGVOYW1lID0gJ3dlYmdsJztcbiAgY29uc3QgbW9kdWxlTWFuYWdlciA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgY29uc3Qgd2ViZ2xNb2R1bGUgPSBtb2R1bGVNYW5hZ2VyLmdldE1vZHVsZShtb2R1bGVOYW1lKSEgYXMgYW55O1xuICBpZiAoUHJvY2Vzc0FwcHJvYWNoLmlzRGF0YVRleHR1cmVBcHByb2FjaChwcm9jZXNzQXBwcm9hY2gpKSB7XG4gICAgcmV0dXJuIHdlYmdsTW9kdWxlLldlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZS5nZXRJbnN0YW5jZSgpO1xuICB9IGVsc2UgaWYgKFByb2Nlc3NBcHByb2FjaC5pc1VuaWZvcm1BcHByb2FjaChwcm9jZXNzQXBwcm9hY2gpKSB7XG4gICAgcmV0dXJuIHdlYmdsTW9kdWxlLldlYkdMU3RyYXRlZ3lVbmlmb3JtLmdldEluc3RhbmNlKCk7XG4gIH1cbiAgcmV0dXJuIHdlYmdsTW9kdWxlLldlYkdMU3RyYXRlZ3lVbmlmb3JtLmdldEluc3RhbmNlKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRSZW5kZXJpbmdTdHJhdGVneTtcbiIsImV4cG9ydCAqIGZyb20gJy4vV2ViR0xDb250ZXh0V3JhcHBlcic7XG5leHBvcnQgKiBmcm9tICcuL1dlYkdMRXh0ZW5kZWRUeXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYkdMRXh0ZW5zaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9XZWJHTFN0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vV2ViR0xTdHJhdGVneUNvbW1vbk1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL1dlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL1dlYkdMU3RyYXRlZ3lVbmlmb3JtJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0UmVuZGVyaW5nU3RyYXRlZ3knO1xuXG5leHBvcnQgKiBmcm9tICcuL3NoYWRlcnMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi90ZXh0dXJlTG9hZGVyL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvaW5kZXgnO1xuIiwiaW1wb3J0IGdldFJlbmRlcmluZ1N0cmF0ZWd5IGZyb20gJy4vZ2V0UmVuZGVyaW5nU3RyYXRlZ3knO1xuaW1wb3J0IHsgQ29tbW9uU2hhZGVyUGFydCB9IGZyb20gJy4vc2hhZGVycy9Db21tb25TaGFkZXJQYXJ0JztcbmltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuL1dlYkdMQ29udGV4dFdyYXBwZXInO1xuaW1wb3J0IHsgVmVydGV4SGFuZGxlcyBhcyB2ZXJ0ZXhIYW5kbGVzLCBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4vV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgV2ViR0xTdHJhdGVneSBhcyB3ZWJHTFN0cmF0ZWd5IH0gZnJvbSAnLi9XZWJHTFN0cmF0ZWd5JztcbmltcG9ydCB7IFdlYkdMU3RyYXRlZ3lVbmlmb3JtIH0gZnJvbSAnLi9XZWJHTFN0cmF0ZWd5VW5pZm9ybSc7XG5pbXBvcnQgeyBXZWJHTFN0cmF0ZWd5RGF0YVRleHR1cmUgfSBmcm9tICcuL1dlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZSc7XG5cbmNvbnN0IFdlYkdMID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGdldFJlbmRlcmluZ1N0cmF0ZWd5LFxuICBDb21tb25TaGFkZXJQYXJ0LFxuICBXZWJHTENvbnRleHRXcmFwcGVyLFxuICBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSxcbiAgV2ViR0xTdHJhdGVneVVuaWZvcm0sXG4gIFdlYkdMU3RyYXRlZ3lEYXRhVGV4dHVyZSxcbn0pO1xuZXhwb3J0IGRlZmF1bHQgV2ViR0w7XG5cbmV4cG9ydCB0eXBlIFJuV2ViR0wgPSB0eXBlb2YgV2ViR0w7XG4oMCwgZXZhbCkoJ3RoaXMnKS5SbldlYkdMID0gV2ViR0w7XG5cbmV4cG9ydCB0eXBlIFZlcnRleEhhbmRsZXMgPSB2ZXJ0ZXhIYW5kbGVzO1xuZXhwb3J0IHR5cGUgV2ViR0xTdHJhdGVneSA9IHdlYkdMU3RyYXRlZ3k7XG4iLCJpbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUsIFZlcnRleEF0dHJpYnV0ZUVudW0gfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBXZWJHTFJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL1dlYkdMUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFN5c3RlbVN0YXRlIH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9zeXN0ZW0vU3lzdGVtU3RhdGUnO1xuaW1wb3J0IHByZXJlcXVpc2l0ZXNTaGFkZXJpdHlPYmplY3RHTFNMIGZyb20gJy4uLy4uL3dlYmdsL3NoYWRlcml0eV9zaGFkZXJzL2NvbW1vbi9wcmVyZXF1aXNpdGVzLmdsc2wnO1xuaW1wb3J0IHZlcnRleE91dHB1dFdHU0wgZnJvbSAnLi4vLi4vL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9jb21tb24vdmVydGV4T3V0cHV0Lndnc2wnO1xuaW1wb3J0IHZlcnRleElucHV0V0dTTCBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvY29tbW9uL3ZlcnRleElucHV0Lndnc2wnO1xuaW1wb3J0IHByZXJlcXVpc2l0ZXNTaGFkZXJpdHlPYmplY3RXR1NMIGZyb20gJy4uLy4uL3dlYmdwdS9zaGFkZXJpdHlfc2hhZGVycy9jb21tb24vcHJlcmVxdWlzaXRlcy53Z3NsJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5hbWVzIH0gZnJvbSAnLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCBtYWluUHJlcmVxdWlzaXRlc1NoYWRlcml0eU9iamVjdEdMU0wgZnJvbSAnLi4vLi4vd2ViZ2wvc2hhZGVyaXR5X3NoYWRlcnMvY29tbW9uL21haW5QcmVyZXF1aXNpdGVzLmdsc2wnO1xuaW1wb3J0IG1haW5QcmVyZXF1aXNpdGVzU2hhZGVyaXR5T2JqZWN0V0dTTCBmcm9tICcuLi8uLi93ZWJncHUvc2hhZGVyaXR5X3NoYWRlcnMvY29tbW9uL21haW5QcmVyZXF1aXNpdGVzLndnc2wnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9Tb2NrZXQnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaGFkZXJOb2RlIH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9BYnN0cmFjdFNoYWRlck5vZGUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbW9uU2hhZGVyUGFydCB7XG4gIHN0YXRpYyBfX2luc3RhbmNlOiBDb21tb25TaGFkZXJQYXJ0O1xuICBfX3dlYmdsUmVzb3VyY2VSZXBvc2l0b3J5PzogV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkgPSBXZWJHTFJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldE1haW5CZWdpbihpc1ZlcnRleFN0YWdlOiBib29sZWFuKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIGlmIChpc1ZlcnRleFN0YWdlKSB7XG4gICAgICAgIGxldCBzdHIgPSBgXG52YXI8cHJpdmF0ZT4gb3V0cHV0IDogVmVydGV4T3V0cHV0O1xuQHZlcnRleFxuZm4gbWFpbihcbiR7dmVydGV4SW5wdXRXR1NMLmNvZGV9XG4pIC0+IFZlcnRleE91dHB1dCB7XG4jaWZkZWYgUk5fVVNFX0lOU1RBTkNFXG5hX2luc3RhbmNlSWRzID0gaW5zdGFuY2VfaWRzO1xuI2VuZGlmXG5cbiNpZmRlZiBSTl9VU0VfUE9TSVRJT05cbmFfcG9zaXRpb24gPSB2ZWMzPGYzMj4ocG9zaXRpb24pO1xuI2Vsc2VcbmFfcG9zaXRpb24gPSB2ZWMzPGYzMj4oMC4wLCAwLjAsIDAuMCk7XG4jZW5kaWZcblxuI2lmZGVmIFJOX1VTRV9OT1JNQUxcbmFfbm9ybWFsID0gbm9ybWFsO1xuI2VuZGlmXG5cbiNpZmRlZiBSTl9VU0VfVEVYQ09PUkRfMFxuYV90ZXhjb29yZF8wID0gdGV4Y29vcmRfMDtcbiNlbmRpZlxuXG4jaWZkZWYgUk5fVVNFX0NPTE9SXzBcbmFfY29sb3JfMCA9IHZlYzQ8ZjMyPihjb2xvcl8wKTtcbiNlbHNlXG5hX2NvbG9yXzAgPSB2ZWM0PGYzMj4oMC4wLCAwLjAsIDAuMCwgMS4wKTtcbiNlbmRpZlxuYDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBzdHIgPSBgXG52YXI8cHJpdmF0ZT4gcnQwOiB2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oMC4wLCAwLjAsIDAuMCwgMS4wKTtcbkBmcmFnbWVudFxuZm4gbWFpbihcbiAgaW5wdXQ6IFZlcnRleE91dHB1dCxcbiAgQGJ1aWx0aW4oZnJvbnRfZmFjaW5nKSBpc0Zyb250OiBib29sLFxuKSAtPiBAbG9jYXRpb24oMCkgdmVjNDxmMzI+IHtcbmA7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgXG52b2lkIG1haW4oKSB7XG5gO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRNYWluRW5kKGlzVmVydGV4U3RhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgaWYgKGlzVmVydGV4U3RhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGBcbiAgcmV0dXJuIG91dHB1dDtcbn1cbmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYFxuICByZXR1cm4gcnQwO1xufVxuYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBcbn1cbiAgICBgO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRWZXJ0ZXhQcmVyZXF1aXNpdGVzKHNoYWRlck5vZGVzOiBBYnN0cmFjdFNoYWRlck5vZGVbXSkge1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICBjb25zdCB2YXJ5aW5nVmFyaWFibGVzID0gQ29tbW9uU2hhZGVyUGFydC5fX21ha2VWYXJ5aW5nVmFyaWFibGVzV0dTTChzaGFkZXJOb2Rlcyk7XG4gICAgICBsZXQgdmVydGV4U2hhZGVyUHJlcmVxdWlzaXRlcyA9ICcnO1xuICAgICAgdmVydGV4U2hhZGVyUHJlcmVxdWlzaXRlcyArPSBgXG4vKiBzaGFkZXJpdHk6IEB7ZGVmaW5pdGlvbnN9ICovXG4jZGVmaW5lIFJOX0lTX05PREVfU0hBREVSXG5cbiNpZmRlZiBSTl9VU0VfSU5TVEFOQ0VcbnZhcjxwcml2YXRlPiBhX2luc3RhbmNlSWRzOiB2ZWM0PGYzMj47XG4jZW5kaWZcblxudmFyPHByaXZhdGU+IGFfcG9zaXRpb246IHZlYzM8ZjMyPjtcblxudmFyPHByaXZhdGU+IGFfbm9ybWFsOiB2ZWMzPGYzMj47XG5cbnZhcjxwcml2YXRlPiBhX3RleGNvb3JkXzA6IHZlYzI8ZjMyPjtcblxudmFyPHByaXZhdGU+IGFfY29sb3JfMDogdmVjNDxmMzI+O1xuXG5zdHJ1Y3QgVmVydGV4T3V0cHV0IHtcbiAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9uIDogdmVjNDxmMzI+LFxuICAke3ZhcnlpbmdWYXJpYWJsZXN9XG59XG5cbiR7cHJlcmVxdWlzaXRlc1NoYWRlcml0eU9iamVjdFdHU0wuY29kZX1cbi8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqL1xuLyogc2hhZGVyaXR5OiBAe21hdHJpY2VzR2V0dGVyc30gKi9cbmA7XG4gICAgICByZXR1cm4gdmVydGV4U2hhZGVyUHJlcmVxdWlzaXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHZlcnRleFNoYWRlclByZXJlcXVpc2l0ZXMgPSAnJztcbiAgICAgIGNvbnN0IGluXyA9ICdpbic7XG4gICAgICB2ZXJ0ZXhTaGFkZXJQcmVyZXF1aXNpdGVzICs9IGBcbiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xucHJlY2lzaW9uIGhpZ2hwIGludDtcbiR7cHJlcmVxdWlzaXRlc1NoYWRlcml0eU9iamVjdEdMU0wuY29kZX1cblxuJHtpbl99IHZlYzQgYV9pbnN0YW5jZUluZm87XFxuYDtcbiAgICAgIHZlcnRleFNoYWRlclByZXJlcXVpc2l0ZXMgKz0gYFxudW5pZm9ybSBib29sIHVfdmVydGV4QXR0cmlidXRlc0V4aXN0ZW5jZUFycmF5WyR7VmVydGV4QXR0cmlidXRlLkF0dHJpYnV0ZVR5cGVOdW1iZXJ9XTtcbmA7XG4gICAgICB2ZXJ0ZXhTaGFkZXJQcmVyZXF1aXNpdGVzICs9ICcvKiBzaGFkZXJpdHk6IEB7bWF0cmljZXNHZXR0ZXJzfSAqLyc7XG4gICAgICB2ZXJ0ZXhTaGFkZXJQcmVyZXF1aXNpdGVzICs9ICcvKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi8nO1xuXG4gICAgICByZXR1cm4gdmVydGV4U2hhZGVyUHJlcmVxdWlzaXRlcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfX21ha2VWYXJ5aW5nVmFyaWFibGVzV0dTTChzaGFkZXJOb2RlczogQWJzdHJhY3RTaGFkZXJOb2RlW10pIHtcbiAgICBjb25zdCB2YXJ5aW5nczoge1xuICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhZGVyTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNoYWRlck5vZGUgPSBzaGFkZXJOb2Rlc1tpXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2hhZGVyTm9kZS5pbnB1dENvbm5lY3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGlucHV0Q29ubmVjdGlvbiA9IHNoYWRlck5vZGUuaW5wdXRDb25uZWN0aW9uc1tqXTtcbiAgICAgICAgaWYgKGlucHV0Q29ubmVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXQgPSBzaGFkZXJOb2RlLmdldElucHV0cygpW2pdO1xuICAgICAgICBjb25zdCBpbnB1dE5vZGUgPSBBYnN0cmFjdFNoYWRlck5vZGUuZ2V0U2hhZGVyTm9kZUJ5VWlkKGlucHV0Q29ubmVjdGlvbi5zaGFkZXJOb2RlVWlkKTtcbiAgICAgICAgaWYgKGlucHV0Tm9kZS5nZXRTaGFkZXJTdGFnZSgpID09PSAnVmVydGV4JyAmJiBzaGFkZXJOb2RlLmdldFNoYWRlclN0YWdlKCkgPT09ICdGcmFnbWVudCcpIHtcbiAgICAgICAgICBjb25zdCB0eXBlID0gaW5wdXQuY29tcG9zaXRpb25UeXBlLnRvV0dTTFR5cGUoaW5wdXQuY29tcG9uZW50VHlwZSk7XG4gICAgICAgICAgdmFyeWluZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgbmFtZTogYCR7aW5wdXROb2RlLnNoYWRlckZ1bmN0aW9uTmFtZX1fJHtpbnB1dE5vZGUuc2hhZGVyTm9kZVVpZH1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyeWluZ3Muc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEubmFtZSA8IGIubmFtZSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCB2YXJ5aW5nVmFyaWFibGVzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YXJ5aW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyeWluZ1ZhcmlhYmxlcyArPSBgQGxvY2F0aW9uKCR7aX0pICR7dmFyeWluZ3NbaV0ubmFtZX06ICR7dmFyeWluZ3NbaV0udHlwZX0sXFxuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFyeWluZ1ZhcmlhYmxlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXRQaXhlbFByZXJlcXVpc2l0ZXMoc2hhZGVyTm9kZXM6IEFic3RyYWN0U2hhZGVyTm9kZVtdKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIGNvbnN0IHZhcnlpbmdWYXJpYWJsZXMgPSBDb21tb25TaGFkZXJQYXJ0Ll9fbWFrZVZhcnlpbmdWYXJpYWJsZXNXR1NMKHNoYWRlck5vZGVzKTtcblxuICAgICAgbGV0IHBpeGVsU2hhZGVyUHJlcmVxdWlzaXRlcyA9ICcnO1xuICAgICAgcGl4ZWxTaGFkZXJQcmVyZXF1aXNpdGVzICs9IGBcbi8qIHNoYWRlcml0eTogQHtkZWZpbml0aW9uc30gKi9cbiNkZWZpbmUgUk5fSVNfTk9ERV9TSEFERVJcblxuc3RydWN0IFZlcnRleE91dHB1dCB7XG4gIEBidWlsdGluKHBvc2l0aW9uKSBwb3NpdGlvbiA6IHZlYzQ8ZjMyPixcbiAgJHt2YXJ5aW5nVmFyaWFibGVzfVxufVxuXG4ke3ByZXJlcXVpc2l0ZXNTaGFkZXJpdHlPYmplY3RXR1NMLmNvZGV9XG4vKiBzaGFkZXJpdHk6IEB7Z2V0dGVyc30gKi9cbi8qIHNoYWRlcml0eTogQHttYXRyaWNlc0dldHRlcnN9ICovXG5gO1xuICAgICAgcmV0dXJuIHBpeGVsU2hhZGVyUHJlcmVxdWlzaXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBpeGVsU2hhZGVyUHJlcmVxdWlzaXRlcyA9ICcnO1xuICAgICAgcGl4ZWxTaGFkZXJQcmVyZXF1aXNpdGVzICs9IGBcbiAgICAgICN2ZXJzaW9uIDMwMCBlc1xuICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgICAgcHJlY2lzaW9uIGhpZ2hwIGludDtcbiAgICAgICR7cHJlcmVxdWlzaXRlc1NoYWRlcml0eU9iamVjdEdMU0wuY29kZX1cbiAgICAgIGA7XG4gICAgICBwaXhlbFNoYWRlclByZXJlcXVpc2l0ZXMgKz0gJy8qIHNoYWRlcml0eTogQHtnZXR0ZXJzfSAqLyc7XG4gICAgICBwaXhlbFNoYWRlclByZXJlcXVpc2l0ZXMgKz0gJ2xheW91dChsb2NhdGlvbiA9IDApIG91dCB2ZWM0IHJ0MDsnO1xuICAgICAgcmV0dXJuIHBpeGVsU2hhZGVyUHJlcmVxdWlzaXRlcztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TWFpblByZXJlcXVpc2l0ZXMoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHJldHVybiBtYWluUHJlcmVxdWlzaXRlc1NoYWRlcml0eU9iamVjdFdHU0wuY29kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1haW5QcmVyZXF1aXNpdGVzU2hhZGVyaXR5T2JqZWN0R0xTTC5jb2RlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRBc3NpZ25tZW50U3RhdGVtZW50KFxuICAgIHZhck5hbWU6IHN0cmluZyxcbiAgICBpbnB1dFNvY2tldDogU29ja2V0PHN0cmluZywgQ29tcG9zaXRpb25UeXBlRW51bSwgQ29tcG9uZW50VHlwZUVudW0+XG4gICkge1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICBjb25zdCB3Z3NsVHlwZVN0ciA9IGlucHV0U29ja2V0IS5jb21wb3NpdGlvblR5cGUudG9XR1NMVHlwZShpbnB1dFNvY2tldCEuY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCB3Z3NsSW5pdGlhbFZhbHVlID0gaW5wdXRTb2NrZXQhLmNvbXBvc2l0aW9uVHlwZS5nZXRXZ3NsSW5pdGlhbFZhbHVlKFxuICAgICAgICBpbnB1dFNvY2tldCEuY29tcG9uZW50VHlwZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJvd1N0ciA9IGB2YXIgJHt2YXJOYW1lfTogJHt3Z3NsVHlwZVN0cn0gPSAke3dnc2xJbml0aWFsVmFsdWV9O1xcbmA7XG4gICAgICByZXR1cm4gcm93U3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBnbHNsVHlwZVN0ciA9IGlucHV0U29ja2V0IS5jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cihpbnB1dFNvY2tldCEuY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCBnbHNsSW5pdGlhbFZhbHVlID0gaW5wdXRTb2NrZXQhLmNvbXBvc2l0aW9uVHlwZS5nZXRHbHNsSW5pdGlhbFZhbHVlKFxuICAgICAgICBpbnB1dFNvY2tldCEuY29tcG9uZW50VHlwZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJvd1N0ciA9IGAke2dsc2xUeXBlU3RyfSAke3Zhck5hbWV9ID0gJHtnbHNsSW5pdGlhbFZhbHVlfTtcXG5gO1xuICAgICAgcmV0dXJuIHJvd1N0cjtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0QXNzaWdubWVudFZhcnlpbmdTdGF0ZW1lbnRJblBpeGVsU2hhZGVyKFxuICAgIHZhck5hbWU6IHN0cmluZyxcbiAgICBpbnB1dFNvY2tldDogU29ja2V0PHN0cmluZywgQ29tcG9zaXRpb25UeXBlRW51bSwgQ29tcG9uZW50VHlwZUVudW0+LFxuICAgIGlucHV0Tm9kZTogQWJzdHJhY3RTaGFkZXJOb2RlXG4gICkge1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICBjb25zdCB3Z3NsVHlwZVN0ciA9IGlucHV0U29ja2V0IS5jb21wb3NpdGlvblR5cGUudG9XR1NMVHlwZShpbnB1dFNvY2tldCEuY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCByb3dTdHIgPSBgdmFyICR7dmFyTmFtZX06ICR7d2dzbFR5cGVTdHJ9ID0gaW5wdXQuJHtpbnB1dE5vZGUuc2hhZGVyRnVuY3Rpb25OYW1lfV8ke2lucHV0Tm9kZS5zaGFkZXJOb2RlVWlkfTtcXG5gO1xuICAgICAgcmV0dXJuIHJvd1N0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ2xzbFR5cGVTdHIgPSBpbnB1dFNvY2tldCEuY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIoaW5wdXRTb2NrZXQhLmNvbXBvbmVudFR5cGUpO1xuICAgICAgY29uc3Qgcm93U3RyID0gYCR7Z2xzbFR5cGVTdHJ9ICR7dmFyTmFtZX0gPSB2XyR7aW5wdXROb2RlLnNoYWRlckZ1bmN0aW9uTmFtZX1fJHtpbnB1dE5vZGUuc2hhZGVyTm9kZVVpZH07XFxuYDtcbiAgICAgIHJldHVybiByb3dTdHI7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEFzc2lnbm1lbnRWYXJ5aW5nU3RhdGVtZW50SW5WZXJ0ZXhTaGFkZXIoXG4gICAgaW5wdXROb2RlOiBBYnN0cmFjdFNoYWRlck5vZGUsXG4gICAgdmFyTmFtZXM6IHN0cmluZ1tdLFxuICAgIGo6IG51bWJlclxuICApIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgcmV0dXJuIGBvdXRwdXQuJHtpbnB1dE5vZGUuc2hhZGVyRnVuY3Rpb25OYW1lfV8ke2lucHV0Tm9kZS5zaGFkZXJOb2RlVWlkfSA9ICR7dmFyTmFtZXNbal19O1xcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgdl8ke2lucHV0Tm9kZS5zaGFkZXJGdW5jdGlvbk5hbWV9XyR7aW5wdXROb2RlLnNoYWRlck5vZGVVaWR9ID0gJHt2YXJOYW1lc1tqXX07XFxuYDtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgYXR0cmlidXRlTmFtZXMoKTogQXR0cmlidXRlTmFtZXM7XG4gIGFic3RyYWN0IGdldCBhdHRyaWJ1dGVTZW1hbnRpY3MoKTogQXJyYXk8VmVydGV4QXR0cmlidXRlRW51bT47XG4gIGFic3RyYWN0IGdldCBhdHRyaWJ1dGVDb21wb3NpdGlvbnMoKTogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT47XG4gIGFic3RyYWN0IGdldCB2ZXJ0ZXhTaGFkZXJEZWZpbml0aW9ucygpOiBzdHJpbmc7XG4gIGFic3RyYWN0IGdldCBwaXhlbFNoYWRlckRlZmluaXRpb25zKCk6IHN0cmluZztcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQ29tbW9uU2hhZGVyUGFydCc7XG5leHBvcnQgKiBmcm9tICcuL25vZGVzL2luZGV4JztcbiIsImltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBDb21tb25TaGFkZXJQYXJ0IH0gZnJvbSAnLi4vQ29tbW9uU2hhZGVyUGFydCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQXR0cmlidXRlTmFtZXMgfSBmcm9tICcuLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBTaGFkZXJTb2NrZXQgfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL0Fic3RyYWN0U2hhZGVyTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0JlZ2luU2hhZGVyIGV4dGVuZHMgQ29tbW9uU2hhZGVyUGFydCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX19mdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9fdmFsdWVJbnB1dHM6IFNoYWRlclNvY2tldFtdLFxuICAgIHByaXZhdGUgX192YWx1ZU91dHB1dHM6IFNoYWRlclNvY2tldFtdXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgdmVydGV4U2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgbGV0IGZ1bmNTdHIgPSBgdm9pZCAke3RoaXMuX19mdW5jdGlvbk5hbWV9KFxuaW4gYm9vbCBjb250ZXh0LFxuICAgICAgYDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX3ZhbHVlSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IHRoaXMuX192YWx1ZUlucHV0c1tpXTtcbiAgICAgIGNvbnN0IHR5cGUgPSBpbnB1dC5jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cihpbnB1dC5jb21wb25lbnRUeXBlKTtcbiAgICAgIGZ1bmNTdHIgKz0gYFxuICAgICAgICBpbiAke3R5cGV9IHZhbHVlJHtpfSxgO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX3ZhbHVlT3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5fX3ZhbHVlT3V0cHV0c1tpXTtcbiAgICAgIGNvbnN0IHR5cGUgPSBvdXRwdXQuY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIob3V0cHV0LmNvbXBvbmVudFR5cGUpO1xuICAgICAgZnVuY1N0ciArPVxuICAgICAgICBgXG4gICAgICAgIG91dCAke3R5cGV9IG91dFZhbHVlJHtpfWAgKyAoaSA9PT0gdGhpcy5fX3ZhbHVlT3V0cHV0cy5sZW5ndGggLSAxID8gJycgOiAnLCcpO1xuICAgIH1cblxuICAgIGZ1bmNTdHIgKz0gJykge1xcbic7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fdmFsdWVPdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmdW5jU3RyICs9IGBcbiAgICAgIG91dFZhbHVlJHtpfSA9IHZhbHVlJHtpfTtcXG5gO1xuICAgIH1cbiAgICBmdW5jU3RyICs9ICd9JztcblxuICAgIHJldHVybiBmdW5jU3RyO1xuICB9XG5cbiAgZ2V0IHBpeGVsU2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVydGV4U2hhZGVyRGVmaW5pdGlvbnM7XG4gIH1cblxuICBnZXQgYXR0cmlidXRlTmFtZXMoKTogQXR0cmlidXRlTmFtZXMge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVTZW1hbnRpY3MoKTogQXJyYXk8VmVydGV4QXR0cmlidXRlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVDb21wb3NpdGlvbnMoKTogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IENvbW1vblNoYWRlclBhcnQgfSBmcm9tICcuLi9Db21tb25TaGFkZXJQYXJ0JztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVOYW1lcyB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFNoYWRlclNvY2tldCB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vbWF0ZXJpYWxzL2NvcmUvQWJzdHJhY3RTaGFkZXJOb2RlJztcblxuZXhwb3J0IGNsYXNzIEJsb2NrRW5kU2hhZGVyIGV4dGVuZHMgQ29tbW9uU2hhZGVyUGFydCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX19mdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9fdmFsdWVJbnB1dHM6IFNoYWRlclNvY2tldFtdLFxuICAgIHByaXZhdGUgX192YWx1ZU91dHB1dHM6IFNoYWRlclNvY2tldFtdXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgdmVydGV4U2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgbGV0IGZ1bmNTdHIgPSBgdm9pZCAke3RoaXMuX19mdW5jdGlvbk5hbWV9KGA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX192YWx1ZUlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLl9fdmFsdWVJbnB1dHNbaV07XG4gICAgICBjb25zdCB0eXBlID0gaW5wdXQuY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIoaW5wdXQuY29tcG9uZW50VHlwZSk7XG4gICAgICBmdW5jU3RyICs9IGBcbiAgICAgICAgaW4gJHt0eXBlfSB2YWx1ZSR7aX0sYDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX192YWx1ZU91dHB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuX192YWx1ZU91dHB1dHNbaV07XG4gICAgICBjb25zdCB0eXBlID0gb3V0cHV0LmNvbXBvc2l0aW9uVHlwZS5nZXRHbHNsU3RyKG91dHB1dC5jb21wb25lbnRUeXBlKTtcbiAgICAgIGZ1bmNTdHIgKz1cbiAgICAgICAgYFxuICAgICAgICBvdXQgJHt0eXBlfSBvdXRWYWx1ZSR7aX1gICsgKGkgPT09IHRoaXMuX192YWx1ZU91dHB1dHMubGVuZ3RoIC0gMSA/ICcnIDogJywnKTtcbiAgICB9XG5cbiAgICBmdW5jU3RyICs9ICcpIHtcXG4nO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX3ZhbHVlT3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgZnVuY1N0ciArPSBgXG4gICAgICBvdXRWYWx1ZSR7aX0gPSB2YWx1ZSR7aX07XFxuYDtcbiAgICB9XG4gICAgZnVuY1N0ciArPSAnfSc7XG5cbiAgICByZXR1cm4gZnVuY1N0cjtcbiAgfVxuXG4gIGdldCBwaXhlbFNoYWRlckRlZmluaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnRleFNoYWRlckRlZmluaXRpb25zO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZU5hbWVzKCk6IEF0dHJpYnV0ZU5hbWVzIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgYXR0cmlidXRlU2VtYW50aWNzKCk6IEFycmF5PFZlcnRleEF0dHJpYnV0ZUVudW0+IHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgYXR0cmlidXRlQ29tcG9zaXRpb25zKCk6IEFycmF5PENvbXBvc2l0aW9uVHlwZUVudW0+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBDb21tb25TaGFkZXJQYXJ0IH0gZnJvbSAnLi4vQ29tbW9uU2hhZGVyUGFydCc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2NvcmUvQ29uZmlnJztcbmltcG9ydCB7IFNoYWRlck5vZGUgfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1NoYWRlck5vZGUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5hbWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ2xhc3NpY1NoYWRpbmdTaGFkZXIgZXh0ZW5kcyBDb21tb25TaGFkZXJQYXJ0IHtcbiAgc3RhdGljIF9faW5zdGFuY2U6IENsYXNzaWNTaGFkaW5nU2hhZGVyO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG1hdGVyaWFsRWxlbWVudCA9IFNoYWRlck5vZGUuUEJSU2hhZGluZztcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IENsYXNzaWNTaGFkaW5nU2hhZGVyIHtcbiAgICBpZiAoIXRoaXMuX19pbnN0YW5jZSkge1xuICAgICAgdGhpcy5fX2luc3RhbmNlID0gbmV3IENsYXNzaWNTaGFkaW5nU2hhZGVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICBnZXQgdmVydGV4U2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIGBcblxuYDtcbiAgfVxuXG4gIGdldCBwaXhlbFNoYWRlckRlZmluaXRpb25zKCkge1xuICAgIHJldHVybiBgXG51bmlmb3JtIGludCB1X3NoYWRpbmdNb2RlbDtcbnVuaWZvcm0gZmxvYXQgdV9zaGluaW5lc3M7XG5cbnN0cnVjdCBMaWdodCB7XG4gIHZlYzQgbGlnaHRQb3NpdGlvbjtcbiAgdmVjNCBsaWdodERpcmVjdGlvbjtcbiAgdmVjNCBsaWdodEludGVuc2l0eTtcbn07XG51bmlmb3JtIExpZ2h0IHVfbGlnaHRzWyR7Q29uZmlnLm1heExpZ2h0TnVtYmVySW5TaGFkZXJ9XTtcbnVuaWZvcm0gaW50IHVfbGlnaHROdW1iZXI7XG51bmlmb3JtIHZlYzMgdV92aWV3UG9zaXRpb247XG5cblxuYm9vbCBjbGFzc2ljU2hhZGluZyhcbiAgaW4gdmVjMyBkaWZmdXNlQ29sb3IsXG4gIGluIHZlYzMgcG9zaXRpb25faW5Xb3JsZCxcbiAgaW4gdmVjMyBub3JtYWxfaW5Xb3JsZCxcbiAgb3V0IHZlYzMgb3V0Q29sb3JcbiAgKVxue1xuICAvLyBMaWdodGluZ1xuICBvdXRDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gIGlmICh1X3NoYWRpbmdNb2RlbCA+IDApIHtcblxuICAgIHZlYzMgZGlmZnVzZSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgdmVjMyBzcGVjdWxhciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke0NvbmZpZy5tYXhMaWdodE51bWJlckluU2hhZGVyfTsgaSsrKSB7XG4gICAgICBpZiAoaSA+PSB1X2xpZ2h0TnVtYmVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2ZWMzIGxpZ2h0RGlyZWN0aW9uID0gdV9saWdodHNbaV0ubGlnaHREaXJlY3Rpb24ueHl6O1xuICAgICAgZmxvYXQgbGlnaHRUeXBlID0gdV9saWdodHNbaV0ubGlnaHRQb3NpdGlvbi53O1xuICAgICAgZmxvYXQgc3BvdENvc0N1dG9mZiA9IHVfbGlnaHRzW2ldLmxpZ2h0RGlyZWN0aW9uLnc7XG4gICAgICBmbG9hdCBzcG90RXhwb25lbnQgPSB1X2xpZ2h0c1tpXS5saWdodEludGVuc2l0eS53O1xuXG4gICAgICBpZiAoMC43NSA8IGxpZ2h0VHlwZSkgeyAvLyBpcyBwb2ludGxpZ2h0IG9yIHNwb3RsaWdodFxuICAgICAgICBsaWdodERpcmVjdGlvbiA9IG5vcm1hbGl6ZSh1X2xpZ2h0c1tpXS5saWdodFBvc2l0aW9uLnh5eiAtIHBvc2l0aW9uX2luV29ybGQueHl6KTtcbiAgICAgIH1cbiAgICAgIGZsb2F0IHNwb3RFZmZlY3QgPSAxLjA7XG4gICAgICBpZiAobGlnaHRUeXBlID4gMS43NSkgeyAvLyBpcyBzcG90bGlnaHRcbiAgICAgICAgc3BvdEVmZmVjdCA9IGRvdCh1X2xpZ2h0c1tpXS5saWdodERpcmVjdGlvbi54eXosIGxpZ2h0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHNwb3RFZmZlY3QgPiBzcG90Q29zQ3V0b2ZmKSB7XG4gICAgICAgICAgc3BvdEVmZmVjdCA9IHBvdyhzcG90RWZmZWN0LCBzcG90RXhwb25lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwb3RFZmZlY3QgPSAwLjA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmVjMyBpbmNpZGVudExpZ2h0ID0gc3BvdEVmZmVjdCAqIHVfbGlnaHRzW2ldLmxpZ2h0SW50ZW5zaXR5Lnh5ejtcbi8vICAgICAgaW5jaWRlbnRMaWdodCAqPSBNX1BJO1xuXG4gICAgICBub3JtYWxfaW5Xb3JsZCA9IG5vcm1hbGl6ZShub3JtYWxfaW5Xb3JsZCk7XG5cbiAgICAgIGRpZmZ1c2UgKz0gZGlmZnVzZUNvbG9yICogbWF4KDAuMCwgZG90KG5vcm1hbF9pbldvcmxkLCBsaWdodERpcmVjdGlvbikpICogaW5jaWRlbnRMaWdodDtcblxuICAgICAgaWYgKHVfc2hhZGluZ01vZGVsID09IDIpIHsvLyBCTElOTlxuICAgICAgICAvLyBWaWV3RGlyZWN0aW9uXG4gICAgICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh1X3ZpZXdQb3NpdGlvbiAtIHBvc2l0aW9uX2luV29ybGQueHl6KTtcbiAgICAgICAgdmVjMyBoYWxmVmVjdG9yID0gbm9ybWFsaXplKGxpZ2h0RGlyZWN0aW9uICsgdmlld0RpcmVjdGlvbik7XG4gICAgICAgIHNwZWN1bGFyICs9IHBvdyhtYXgoMC4wLCBkb3QoaGFsZlZlY3Rvciwgbm9ybWFsX2luV29ybGQpKSwgdV9zaGluaW5lc3MpO1xuICAgICAgfSBlbHNlIGlmICh1X3NoYWRpbmdNb2RlbCA9PSAzKSB7IC8vIFBIT05HXG4gICAgICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh1X3ZpZXdQb3NpdGlvbiAtIHBvc2l0aW9uX2luV29ybGQueHl6KTtcbiAgICAgICAgdmVjMyBSID0gcmVmbGVjdChsaWdodERpcmVjdGlvbiwgbm9ybWFsX2luV29ybGQpO1xuICAgICAgICBzcGVjdWxhciArPSBwb3cobWF4KDAuMCwgZG90KFIsIHZpZXdEaXJlY3Rpb24pKSwgdV9zaGluaW5lc3MpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgb3V0Q29sb3IgPSBkaWZmdXNlICsgc3BlY3VsYXI7XG4gIH0gZWxzZSB7XG4gICAgb3V0Q29sb3IgPSBkaWZmdXNlQ29sb3I7XG4gIH1cbn1cblxuICAgIGA7XG4gIH1cblxuICB2ZXJ0ZXhTaGFkZXJCb2R5ID0gYFxuXG5cbiAgYDtcblxuICBnZXQgcGl4ZWxTaGFkZXJCb2R5KCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVOYW1lcygpOiBBdHRyaWJ1dGVOYW1lcyB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGdldCBhdHRyaWJ1dGVTZW1hbnRpY3MoKTogQXJyYXk8VmVydGV4QXR0cmlidXRlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVDb21wb3NpdGlvbnMoKTogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgVmVydGV4QXR0cmlidXRlRW51bSxcbiAgVmVydGV4QXR0cmlidXRlLFxufSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBDb21tb25TaGFkZXJQYXJ0IH0gZnJvbSAnLi4vQ29tbW9uU2hhZGVyUGFydCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0sIENvbXBvbmVudFR5cGUgfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQXR0cmlidXRlTmFtZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBJVmVjdG9yIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBDb25zdGFudFZhcmlhYmxlU2hhZGVyIGV4dGVuZHMgQ29tbW9uU2hhZGVyUGFydCB7XG4gIHByaXZhdGUgX19jb25zdGFudFZhbHVlU3RyID0gJyc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX19mdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9fY29tcG9zaXRpb25UeXBlOiBDb21wb3NpdGlvblR5cGVFbnVtLFxuICAgIHByaXZhdGUgX19jb21wb25lbnRUeXBlOiBDb21wb25lbnRUeXBlRW51bVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc2V0Q29uc3RhbnRWYWx1ZSh2YWx1ZTogSVZlY3Rvcikge1xuICAgIGxldCBjb25zdGFudCA9ICcnO1xuICAgIGlmICh0aGlzLl9fY29tcG9uZW50VHlwZS5pc0Zsb2F0aW5nUG9pbnQoKSkge1xuICAgICAgY29uc3RhbnQgPSB2YWx1ZS5nbHNsU3RyQXNGbG9hdDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19jb21wb25lbnRUeXBlLmlzSW50ZWdlcigpKSB7XG4gICAgICBjb25zdGFudCA9IHZhbHVlLmdsc2xTdHJBc0ludDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX19jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkJvb2wpIHtcbiAgICAgIGNvbnN0YW50ID0gdmFsdWUueCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuICAgIHRoaXMuX19jb25zdGFudFZhbHVlU3RyID0gY29uc3RhbnQ7XG4gIH1cblxuICBnZXQgdmVydGV4U2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbiAke3RoaXMuX19mdW5jdGlvbk5hbWV9KFxuICAgICAgICBvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCAke3RoaXMuX19jb21wb3NpdGlvblR5cGUudG9XR1NMVHlwZSh0aGlzLl9fY29tcG9uZW50VHlwZSl9Pikge1xuICAgICAgICAqb3V0VmFsdWUgPSAke3RoaXMuX19jb25zdGFudFZhbHVlU3RyfTtcbiAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgXG4gICAgICB2b2lkICR7dGhpcy5fX2Z1bmN0aW9uTmFtZX0oXG4gICAgICAgIG91dCAke3RoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cih0aGlzLl9fY29tcG9uZW50VHlwZSl9IG91dFZhbHVlKSB7XG4gICAgICAgIG91dFZhbHVlID0gJHt0aGlzLl9fY29uc3RhbnRWYWx1ZVN0cn07XG4gICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwaXhlbFNoYWRlckRlZmluaXRpb25zKCkge1xuICAgIGlmIChTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZm4gJHt0aGlzLl9fZnVuY3Rpb25OYW1lfShcbiAgICAgICAgb3V0VmFsdWU6IHB0cjxmdW5jdGlvbiwgJHt0aGlzLl9fY29tcG9zaXRpb25UeXBlLnRvV0dTTFR5cGUodGhpcy5fX2NvbXBvbmVudFR5cGUpfT4pIHtcbiAgICAgICAgKm91dFZhbHVlID0gJHt0aGlzLl9fY29uc3RhbnRWYWx1ZVN0cn07XG4gICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgdm9pZCAke3RoaXMuX19mdW5jdGlvbk5hbWV9KFxuICAgICAgICBvdXQgJHt0aGlzLl9fY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIodGhpcy5fX2NvbXBvbmVudFR5cGUpfSBvdXRWYWx1ZSkge1xuICAgICAgICBvdXRWYWx1ZSA9ICR7dGhpcy5fX2NvbnN0YW50VmFsdWVTdHJ9O1xuICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICBnZXQgYXR0cmlidXRlTmFtZXMoKTogQXR0cmlidXRlTmFtZXMge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVTZW1hbnRpY3MoKTogQXJyYXk8VmVydGV4QXR0cmlidXRlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVDb21wb3NpdGlvbnMoKTogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbW9uU2hhZGVyUGFydCB9IGZyb20gJy4uL0NvbW1vblNoYWRlclBhcnQnO1xuaW1wb3J0IHsgU2hhZGVyTm9kZSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvU2hhZGVyTm9kZSc7XG5pbXBvcnQgeyBQcm9jZXNzQXBwcm9hY2ggfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1Byb2Nlc3NBcHByb2FjaCc7XG5pbXBvcnQgeyBTeXN0ZW1TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vc3lzdGVtL1N5c3RlbVN0YXRlJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5hbWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBFbmRTaGFkZXIgZXh0ZW5kcyBDb21tb25TaGFkZXJQYXJ0IHtcbiAgc3RhdGljIF9faW5zdGFuY2U6IEVuZFNoYWRlcjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBtYXRlcmlhbEVsZW1lbnQgPSBTaGFkZXJOb2RlLlBCUlNoYWRpbmc7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBFbmRTaGFkZXIge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgRW5kU2hhZGVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICBnZXQgdmVydGV4U2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbiBvdXRQb3NpdGlvbihpblBvc2l0aW9uOiB2ZWM0PGYzMj4pIHtcbiAgICAgICAgb3V0cHV0LnBvc2l0aW9uID0gaW5Qb3NpdGlvbjtcbiAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgXG4gICAgICB2b2lkIG91dFBvc2l0aW9uKGluIHZlYzQgaW5Qb3NpdGlvbikge1xuICAgICAgICBnbF9Qb3NpdGlvbiA9IGluUG9zaXRpb247XG4gICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2ZXJ0ZXhTaGFkZXJCb2R5KCkge1xuICAgIHJldHVybiBgXG5cbiAgICBgO1xuICB9XG5cbiAgZ2V0IHBpeGVsU2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbiBvdXRDb2xvcihpbkNvbG9yOiB2ZWM0PGYzMj4pIHtcbiAgICAgICAgcnQwID0gaW5Db2xvcjtcbiAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgXG4gICAgICB2b2lkIG91dENvbG9yKGluIHZlYzQgaW5Db2xvcikge1xuICAgICAgICBydDAgPSBpbkNvbG9yO1xuICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICBnZXRQaXhlbFNoYWRlckJvZHkoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZU5hbWVzKCk6IEF0dHJpYnV0ZU5hbWVzIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZ2V0IGF0dHJpYnV0ZVNlbWFudGljcygpOiBBcnJheTxWZXJ0ZXhBdHRyaWJ1dGVFbnVtPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZUNvbXBvc2l0aW9ucygpOiBBcnJheTxDb21wb3NpdGlvblR5cGVFbnVtPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgQ29tbW9uU2hhZGVyUGFydCB9IGZyb20gJy4uL0NvbW1vblNoYWRlclBhcnQnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25UeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9zaXRpb25UeXBlJztcbmltcG9ydCB7IEF0dHJpYnV0ZU5hbWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSWZTdGF0ZW1lbnRTaGFkZXIgZXh0ZW5kcyBDb21tb25TaGFkZXJQYXJ0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCB2ZXJ0ZXhTaGFkZXJEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4gYFxuICAgIGA7XG4gIH1cblxuICBnZXQgcGl4ZWxTaGFkZXJEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4gYFxuICAgIGA7XG4gIH1cblxuICBnZXQgYXR0cmlidXRlTmFtZXMoKTogQXR0cmlidXRlTmFtZXMge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVTZW1hbnRpY3MoKTogQXJyYXk8VmVydGV4QXR0cmlidXRlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVDb21wb3NpdGlvbnMoKTogQXJyYXk8Q29tcG9zaXRpb25UeXBlRW51bT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlRW51bSB9IGZyb20gJy4uLy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVmVydGV4QXR0cmlidXRlJztcbmltcG9ydCB7IENvbW1vblNoYWRlclBhcnQgfSBmcm9tICcuLi9Db21tb25TaGFkZXJQYXJ0JztcbmltcG9ydCB7IENvbXBvc2l0aW9uVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBNYXRlcmlhbE5vZGVVSUQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVOYW1lcyB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVGZXRjaFNoYWRlciBleHRlbmRzIENvbW1vblNoYWRlclBhcnQge1xuICBzdGF0aWMgX19pbnN0YW5jZTogVGV4dHVyZUZldGNoU2hhZGVyO1xuICBwcml2YXRlIF9fbWF0ZXJpYWxOb2RlVWlkOiBNYXRlcmlhbE5vZGVVSUQgPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc2V0IG1hdGVyaWFsTm9kZVVpZChtYXRlcmlhbE5vZGVVaWQ6IE1hdGVyaWFsTm9kZVVJRCkge1xuICAgIHRoaXMuX19tYXRlcmlhbE5vZGVVaWQgPSBtYXRlcmlhbE5vZGVVaWQ7XG4gIH1cblxuICB2ZXJ0ZXhTaGFkZXJCb2R5ID0gYFxuICBgO1xuXG4gIGdldFBpeGVsU2hhZGVyQm9keSgpIHtcbiAgICByZXR1cm4gYFxuICAgIGA7XG4gIH1cblxuICBnZXQgdmVydGV4U2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0IHBpeGVsU2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZU5hbWVzKCk6IEF0dHJpYnV0ZU5hbWVzIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZ2V0IGF0dHJpYnV0ZVNlbWFudGljcygpOiBBcnJheTxWZXJ0ZXhBdHRyaWJ1dGVFbnVtPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZUNvbXBvc2l0aW9ucygpOiBBcnJheTxDb21wb3NpdGlvblR5cGVFbnVtPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21tb25TaGFkZXJQYXJ0IH0gZnJvbSAnLi4vQ29tbW9uU2hhZGVyUGFydCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVOYW1lcyB9IGZyb20gJy4uLy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5cbmV4cG9ydCBjbGFzcyBVbmlmb3JtRGF0YVNoYWRlciBleHRlbmRzIENvbW1vblNoYWRlclBhcnQge1xuICBwcml2YXRlIF9fdmFyaWFibGVOYW1lID0gJyc7XG4gIHByaXZhdGUgX192YWx1ZVN0ciA9ICcnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9fZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfX2NvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bSxcbiAgICBwcml2YXRlIF9fY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW1cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHNldFZhcmlhYmxlTmFtZShuYW1lOiBhbnkpIHtcbiAgICB0aGlzLl9fdmFyaWFibGVOYW1lID0gbmFtZTtcbiAgfVxuXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fX3ZhbHVlU3RyID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldCB2ZXJ0ZXhTaGFkZXJEZWZpbml0aW9ucygpIHtcbiAgICBpZiAoU3lzdGVtU3RhdGUuY3VycmVudFByb2Nlc3NBcHByb2FjaCA9PT0gUHJvY2Vzc0FwcHJvYWNoLldlYkdQVSkge1xuICAgICAgcmV0dXJuIGBcbi8vICNwYXJhbSAke3RoaXMuX192YXJpYWJsZU5hbWV9OiAke3RoaXMuX19jb21wb3NpdGlvblR5cGUudG9XR1NMVHlwZShcbiAgICAgICAgdGhpcy5fX2NvbXBvbmVudFR5cGVcbiAgICAgICl9OyAvLyBpbml0aWFsVmFsdWU9JHt0aGlzLl9fdmFsdWVTdHJ9XG5mbiAke3RoaXMuX19mdW5jdGlvbk5hbWV9KG91dFZhbHVlOiBwdHI8ZnVuY3Rpb24sICR7dGhpcy5fX2NvbXBvc2l0aW9uVHlwZS50b1dHU0xUeXBlKFxuICAgICAgICB0aGlzLl9fY29tcG9uZW50VHlwZVxuICAgICAgKX0+KSB7XG4gICpvdXRWYWx1ZSA9IGdldF8ke3RoaXMuX192YXJpYWJsZU5hbWV9KF9tYXRlcmlhbFNJRCwgMCk7XG59XG5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYFxudW5pZm9ybSAke3RoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cih0aGlzLl9fY29tcG9uZW50VHlwZSl9IHVfJHtcbiAgICAgICAgdGhpcy5fX3ZhcmlhYmxlTmFtZVxuICAgICAgfTsgLy8gaW5pdGlhbFZhbHVlPSR7dGhpcy5fX3ZhbHVlU3RyfVxudm9pZCAke3RoaXMuX19mdW5jdGlvbk5hbWV9KG91dCAke3RoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cihcbiAgICAgICAgdGhpcy5fX2NvbXBvbmVudFR5cGVcbiAgICAgICl9IG91dFZhbHVlKSB7XG4gICNpZmRlZiBSTl9JU19EQVRBVEVYVFVSRV9NT0RFXG4gICAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXG4gICNlbHNlXG4gICAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X21hdGVyaWFsU0lEO1xuICAjZW5kaWZcblxuICBvdXRWYWx1ZSA9IGdldF8ke3RoaXMuX192YXJpYWJsZU5hbWV9KG1hdGVyaWFsU0lELCAwKTtcbn1cbmA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBpeGVsU2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgaWYgKFN5c3RlbVN0YXRlLmN1cnJlbnRQcm9jZXNzQXBwcm9hY2ggPT09IFByb2Nlc3NBcHByb2FjaC5XZWJHUFUpIHtcbiAgICAgIHJldHVybiBgXG4vLyAjcGFyYW0gJHt0aGlzLl9fdmFyaWFibGVOYW1lfTogJHt0aGlzLl9fY29tcG9zaXRpb25UeXBlLnRvV0dTTFR5cGUoXG4gICAgICAgIHRoaXMuX19jb21wb25lbnRUeXBlXG4gICAgICApfTsgLy8gaW5pdGlhbFZhbHVlPSR7dGhpcy5fX3ZhbHVlU3RyfVxuZm4gJHt0aGlzLl9fZnVuY3Rpb25OYW1lfShvdXRWYWx1ZTogcHRyPGZ1bmN0aW9uLCAke3RoaXMuX19jb21wb3NpdGlvblR5cGUudG9XR1NMVHlwZShcbiAgICAgICAgdGhpcy5fX2NvbXBvbmVudFR5cGVcbiAgICAgICl9Pikge1xuICAqb3V0VmFsdWUgPSBnZXRfJHt0aGlzLl9fdmFyaWFibGVOYW1lfShfbWF0ZXJpYWxTSUQsIDApO1xufVxuYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBcbnVuaWZvcm0gJHt0aGlzLl9fY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIodGhpcy5fX2NvbXBvbmVudFR5cGUpfSB1XyR7XG4gICAgICAgIHRoaXMuX192YXJpYWJsZU5hbWVcbiAgICAgIH07IC8vIGluaXRpYWxWYWx1ZT0ke3RoaXMuX192YWx1ZVN0cn1cbnZvaWQgJHt0aGlzLl9fZnVuY3Rpb25OYW1lfShvdXQgJHt0aGlzLl9fY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIoXG4gICAgICAgIHRoaXMuX19jb21wb25lbnRUeXBlXG4gICAgICApfSBvdXRWYWx1ZSkge1xuI2lmZGVmIFJOX0lTX0RBVEFURVhUVVJFX01PREVcbiAgZmxvYXQgbWF0ZXJpYWxTSUQgPSB1X2N1cnJlbnRDb21wb25lbnRTSURzWzBdOyAvLyBpbmRleCAwIGRhdGEgaXMgdGhlIG1hdGVyaWFsU0lEXG4jZWxzZVxuICBmbG9hdCBtYXRlcmlhbFNJRCA9IHVfbWF0ZXJpYWxTSUQ7XG4jZW5kaWZcblxub3V0VmFsdWUgPSBnZXRfJHt0aGlzLl9fdmFyaWFibGVOYW1lfShtYXRlcmlhbFNJRCwgMCk7XG4gICAgfVxuICAgIGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZU5hbWVzKCk6IEF0dHJpYnV0ZU5hbWVzIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgYXR0cmlidXRlU2VtYW50aWNzKCk6IEFycmF5PFZlcnRleEF0dHJpYnV0ZUVudW0+IHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgYXR0cmlidXRlQ29tcG9zaXRpb25zKCk6IEFycmF5PENvbXBvc2l0aW9uVHlwZUVudW0+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnRleEF0dHJpYnV0ZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBDb21tb25TaGFkZXJQYXJ0IH0gZnJvbSAnLi4vQ29tbW9uU2hhZGVyUGFydCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb3NpdGlvblR5cGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvbmVudFR5cGUnO1xuaW1wb3J0IHsgQXR0cmlidXRlTmFtZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBWYXJ5aW5nVmFyaWFibGVTaGFkZXIgZXh0ZW5kcyBDb21tb25TaGFkZXJQYXJ0IHtcbiAgcHJpdmF0ZSBfX3ZhcmlhYmxlTmFtZSA9ICcnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9fZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfX2NvbXBvc2l0aW9uVHlwZTogQ29tcG9zaXRpb25UeXBlRW51bSxcbiAgICBwcml2YXRlIF9fY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZUVudW1cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHNldFZhcmlhYmxlTmFtZShuYW1lOiBhbnkpIHtcbiAgICB0aGlzLl9fdmFyaWFibGVOYW1lID0gbmFtZTtcbiAgfVxuXG4gIGdldCB2ZXJ0ZXhTaGFkZXJEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4gYFxuICAgIG91dCAke3RoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cih0aGlzLl9fY29tcG9uZW50VHlwZSl9ICR7dGhpcy5fX3ZhcmlhYmxlTmFtZX07XG4gICAgdm9pZCAke3RoaXMuX19mdW5jdGlvbk5hbWV9KFxuICAgICAgaW4gJHt0aGlzLl9fY29tcG9zaXRpb25UeXBlLmdldEdsc2xTdHIodGhpcy5fX2NvbXBvbmVudFR5cGUpfSB2YWx1ZSkge1xuICAgICAgJHt0aGlzLl9fdmFyaWFibGVOYW1lfSA9IHZhbHVlO1xuICAgIH1cbiAgICBgO1xuICB9XG5cbiAgZ2V0IHBpeGVsU2hhZGVyRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIGBcbiAgICBpbiAke3RoaXMuX19jb21wb3NpdGlvblR5cGUuZ2V0R2xzbFN0cih0aGlzLl9fY29tcG9uZW50VHlwZSl9ICR7dGhpcy5fX3ZhcmlhYmxlTmFtZX07XG4gICAgdm9pZCAke3RoaXMuX19mdW5jdGlvbk5hbWV9KFxuICAgICAgb3V0ICR7dGhpcy5fX2NvbXBvc2l0aW9uVHlwZS5nZXRHbHNsU3RyKHRoaXMuX19jb21wb25lbnRUeXBlKX0gb3V0VmFsdWUpIHtcbiAgICAgIG91dFZhbHVlID0gJHt0aGlzLl9fdmFyaWFibGVOYW1lfTtcbiAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVOYW1lcygpOiBBdHRyaWJ1dGVOYW1lcyB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZVNlbWFudGljcygpOiBBcnJheTxWZXJ0ZXhBdHRyaWJ1dGVFbnVtPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZUNvbXBvc2l0aW9ucygpOiBBcnJheTxDb21wb3NpdGlvblR5cGVFbnVtPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0Jsb2NrQmVnaW5TaGFkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CbG9ja0VuZFNoYWRlcic7XG5leHBvcnQgKiBmcm9tICcuL0NsYXNzaWNTaGFkaW5nU2hhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uc3RhbnRWYXJpYWJsZVNoYWRlcic7XG5leHBvcnQgKiBmcm9tICcuL0VuZFNoYWRlcic7XG5leHBvcnQgKiBmcm9tICcuL0lmU3RhdGVtZW50U2hhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dHVyZUZldGNoU2hhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vVW5pZm9ybURhdGFTaGFkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9WYXJ5aW5nVmFyaWFibGVTaGFkZXInO1xuIiwiaW1wb3J0IHtcbiAgS1RYMkNoYW5uZWxFVEMxUyxcbiAgS1RYMkNoYW5uZWxVQVNUQyxcbiAgS1RYMkNvbnRhaW5lcixcbiAgS1RYMkRhdGFGb3JtYXREZXNjcmlwdG9yQmFzaWNGb3JtYXQsXG4gIEtUWDJHbG9iYWxEYXRhQmFzaXNMWixcbiAgS1RYMk1vZGVsLFxuICBLVFgyU3VwZXJjb21wcmVzc2lvblNjaGVtZSxcbiAgS1RYMlRyYW5zZmVyLFxuICByZWFkLFxufSBmcm9tICdrdHgtcGFyc2UnO1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuLi9XZWJHTENvbnRleHRXcmFwcGVyJztcbmltcG9ydCB7IFRleHR1cmVEYXRhIH0gZnJvbSAnLi4vV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHtcbiAgQ29tcHJlc3Npb25UZXh0dXJlVHlwZSxcbiAgQ29tcHJlc3Npb25UZXh0dXJlVHlwZUVudW0sXG59IGZyb20gJy4uLy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcHJlc3Npb25UZXh0dXJlVHlwZSc7XG5pbXBvcnQgeyBaU1RERGVjb2RlciB9IGZyb20gJ3pzdGRkZWMnO1xuaW1wb3J0IHtcbiAgQmFzaXNMekV0YzFzSW1hZ2VUcmFuc2NvZGVyLFxuICBNc2NUcmFuc2NvZGVyTW9kdWxlLFxuICBNU0NfVFJBTlNDT0RFUixcbiAgVHJhbnNjb2RlZEltYWdlLFxuICBVYXN0Y0ltYWdlVHJhbnNjb2Rlcixcbn0gZnJvbSAnLi4vLi4vdHlwZXMvS1RYMlRleHR1cmUnO1xuaW1wb3J0IHsgUHJvY2Vzc0FwcHJvYWNoIH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Qcm9jZXNzQXBwcm9hY2gnO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL21pc2MvTG9nZ2VyJztcblxuY29uc3QgQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQgPSB7XG4gIEVUQzFTOiAwLFxuICBVQVNUQzR4NDogMSxcbn0gYXMgY29uc3Q7XG50eXBlIENvbXByZXNzZWRUZXh0dXJlRm9ybWF0ID1cbiAgKHR5cGVvZiBDb21wcmVzc2VkVGV4dHVyZUZvcm1hdClba2V5b2YgdHlwZW9mIENvbXByZXNzZWRUZXh0dXJlRm9ybWF0XTtcblxuY29uc3QgVHJhbnNjb2RlVGFyZ2V0ID0ge1xuICBFVEMxX1JHQjogJ0VUQzFfUkdCJyxcbiAgQkMxX1JHQjogJ0JDMV9SR0InLFxuICBCQzRfUjogJ0JDNF9SJyxcbiAgQkM1X1JHOiAnQkM1X1JHJyxcbiAgQkMzX1JHQkE6ICdCQzNfUkdCQScsXG4gIFBWUlRDMV80X1JHQjogJ1BWUlRDMV80X1JHQicsXG4gIFBWUlRDMV80X1JHQkE6ICdQVlJUQzFfNF9SR0JBJyxcbiAgQkM3X1JHQkE6ICdCQzdfUkdCQScsXG4gIEJDN19NNl9SR0I6ICdCQzdfTTZfUkdCJyxcbiAgQkM3X001X1JHQkE6ICdCQzdfTTVfUkdCQScsXG4gIEVUQzJfUkdCQTogJ0VUQzJfUkdCQScsXG4gIEFTVENfNHg0X1JHQkE6ICdBU1RDXzR4NF9SR0JBJyxcbiAgUkdCQTMyOiAnUkdCQTMyJyxcbiAgUkdCNTY1OiAnUkdCNTY1JyxcbiAgQkdSNTY1OiAnQkdSNTY1JyxcbiAgUkdCQTQ0NDQ6ICdSR0JBNDQ0NCcsXG4gIFBWUlRDMl80X1JHQjogJ1BWUlRDMl80X1JHQicsXG4gIFBWUlRDMl80X1JHQkE6ICdQVlJUQzJfNF9SR0JBJyxcbiAgRUFDX1IxMTogJ0VBQ19SMTEnLFxuICBFQUNfUkcxMTogJ0VBQ19SRzExJyxcbn0gYXMgY29uc3Q7XG50eXBlIFRyYW5zY29kZVRhcmdldCA9ICh0eXBlb2YgVHJhbnNjb2RlVGFyZ2V0KVtrZXlvZiB0eXBlb2YgVHJhbnNjb2RlVGFyZ2V0XTtcblxuaW50ZXJmYWNlIEtUWDJHbG9iYWxEYXRhQmFzaXNMWkltYWdlRGVzYyB7XG4gIGltYWdlRmxhZ3M6IG51bWJlcjtcbiAgcmdiU2xpY2VCeXRlT2Zmc2V0OiBudW1iZXI7XG4gIHJnYlNsaWNlQnl0ZUxlbmd0aDogbnVtYmVyO1xuICBhbHBoYVNsaWNlQnl0ZU9mZnNldDogbnVtYmVyO1xuICBhbHBoYVNsaWNlQnl0ZUxlbmd0aDogbnVtYmVyO1xufVxuXG5kZWNsYXJlIGNvbnN0IE1TQ19UUkFOU0NPREVSOiBNU0NfVFJBTlNDT0RFUjtcblxuZXhwb3J0IGNsYXNzIEtUWDJUZXh0dXJlTG9hZGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX19pbnN0YW5jZTogS1RYMlRleHR1cmVMb2FkZXI7XG5cbiAgLy8gVE9ETzogY3JlYXRlIHR5cGUgb2YgX19tc2NUcmFuc2NvZGVyTW9kdWxlXG4gIHByaXZhdGUgc3RhdGljIF9fbXNjVHJhbnNjb2Rlck1vZHVsZTogTXNjVHJhbnNjb2Rlck1vZHVsZTtcbiAgcHJpdmF0ZSBzdGF0aWMgX196c3RkRGVjb2RlcjogWlNURERlY29kZXI7XG5cbiAgcHJpdmF0ZSBfX21zY1RyYW5zY29kZXJQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0eXBlb2YgTVNDX1RSQU5TQ09ERVIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYWlsZWQgdG8gY2FsbCBNU0NfVFJBTlNDT0RFUigpIGZ1bmN0aW9uLiBQbGVhc2UgY2hlY2sgdG8gaW1wb3J0IG1zY19iYXNpc190cmFuc2NvZGVyLmpzLidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX19tc2NUcmFuc2NvZGVyUHJvbWlzZSA9IHRoaXMuX19sb2FkTVNDVHJhbnNjb2RlcigpO1xuICB9XG5cbiAgLy8gLS0tLS0gUHVibGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBLVFgyVGV4dHVyZUxvYWRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgdHJhbnNjb2RlKHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBrdHgyQ29udGFpbmVyID0gdGhpcy5fX3BhcnNlKHVpbnQ4QXJyYXkpO1xuXG4gICAgaWYgKGt0eDJDb250YWluZXIucGl4ZWxEZXB0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSAyRCB0ZXh0dXJlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGlmIChrdHgyQ29udGFpbmVyLmxheWVyQ291bnQgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IHRleHR1cmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGlmIChrdHgyQ29udGFpbmVyLmZhY2VDb3VudCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3ViZSB0ZXh0dXJlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoa3R4MkNvbnRhaW5lci5zdXBlcmNvbXByZXNzaW9uU2NoZW1lID09PSBLVFgyU3VwZXJjb21wcmVzc2lvblNjaGVtZS5aU1REKSB7XG4gICAgICBpZiAoS1RYMlRleHR1cmVMb2FkZXIuX196c3RkRGVjb2RlciA9PSBudWxsKSB7XG4gICAgICAgIEtUWDJUZXh0dXJlTG9hZGVyLl9fenN0ZERlY29kZXIgPSBuZXcgWlNURERlY29kZXIoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEtUWDJUZXh0dXJlTG9hZGVyLl9fenN0ZERlY29kZXIuaW5pdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fX21zY1RyYW5zY29kZXJQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9fdHJhbnNjb2RlRGF0YShrdHgyQ29udGFpbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX19tc2NUcmFuc2NvZGVyUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX190cmFuc2NvZGVEYXRhKGt0eDJDb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gUHJpdmF0ZSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9fbG9hZE1TQ1RyYW5zY29kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gbG9hZCBtc2NfYmFzaXNfdHJhbnNjb2RlciBvbmNlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoS1RYMlRleHR1cmVMb2FkZXIuX19tc2NUcmFuc2NvZGVyTW9kdWxlKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgTVNDX1RSQU5TQ09ERVIoKS50aGVuKCh0cmFuc2NvZGVyTW9kdWxlOiBNc2NUcmFuc2NvZGVyTW9kdWxlKSA9PiB7XG4gICAgICAgIHRyYW5zY29kZXJNb2R1bGUuaW5pdFRyYW5zY29kZXJzKCk7XG4gICAgICAgIEtUWDJUZXh0dXJlTG9hZGVyLl9fbXNjVHJhbnNjb2Rlck1vZHVsZSA9IHRyYW5zY29kZXJNb2R1bGU7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2dldERldmljZURlcGVuZGVudFBhcmFtZXRlcnNXZWJHTChoYXNBbHBoYTogYm9vbGVhbikge1xuICAgIGNvbnN0IHdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCBnbHcgPSB3ZWJHTFJlc291cmNlUmVwb3NpdG9yeS5jdXJyZW50V2ViR0xDb250ZXh0V3JhcHBlciBhcyBXZWJHTENvbnRleHRXcmFwcGVyO1xuXG4gICAgY29uc3QgYXN0YyA9IGdsdy53ZWJnbDJFeHRDVEFzdGMgfHwgZ2x3LndlYmdsMUV4dENUQXN0YztcbiAgICBjb25zdCBicHRjID0gZ2x3LndlYmdsMkV4dENUQnB0YyB8fCBnbHcud2ViZ2wxRXh0Q1RCcHRjO1xuICAgIGNvbnN0IHMzdGMgPSBnbHcud2ViZ2wyRXh0Q1RTM3RjIHx8IGdsdy53ZWJnbDFFeHRDVFMzdGM7XG4gICAgY29uc3QgcHZydGMgPSBnbHcud2ViZ2wyRXh0Q1RQdnJ0YyB8fCBnbHcud2ViZ2wxRXh0Q1RQdnJ0YztcbiAgICBjb25zdCBldGMyID0gZ2x3LndlYmdsMkV4dENURXRjIHx8IGdsdy53ZWJnbDFFeHRDVEV0YztcbiAgICBjb25zdCBldGMxID0gZ2x3LndlYmdsMkV4dENURXRjMSB8fCBnbHcud2ViZ2wxRXh0Q1RFdGMxO1xuXG4gICAgbGV0IHRyYW5zY29kZVRhcmdldFN0cjogVHJhbnNjb2RlVGFyZ2V0O1xuICAgIGxldCBjb21wcmVzc2lvblRleHR1cmVUeXBlOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bTtcbiAgICBpZiAoYXN0Yykge1xuICAgICAgdHJhbnNjb2RlVGFyZ2V0U3RyID0gVHJhbnNjb2RlVGFyZ2V0LkFTVENfNHg0X1JHQkE7XG4gICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlID0gQ29tcHJlc3Npb25UZXh0dXJlVHlwZS5BU1RDX1JHQkFfNHg0O1xuICAgIH0gZWxzZSBpZiAoYnB0Yykge1xuICAgICAgdHJhbnNjb2RlVGFyZ2V0U3RyID0gVHJhbnNjb2RlVGFyZ2V0LkJDN19SR0JBO1xuICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuQlBUQ19SR0JBO1xuICAgIH0gZWxzZSBpZiAoczN0Yykge1xuICAgICAgaWYgKGhhc0FscGhhKSB7XG4gICAgICAgIHRyYW5zY29kZVRhcmdldFN0ciA9IFRyYW5zY29kZVRhcmdldC5CQzNfUkdCQTtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuUzNUQ19SR0JBX0RYVDU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2NvZGVUYXJnZXRTdHIgPSBUcmFuc2NvZGVUYXJnZXQuQkMxX1JHQjtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuUzNUQ19SR0JfRFhUMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHB2cnRjKSB7XG4gICAgICBpZiAoaGFzQWxwaGEpIHtcbiAgICAgICAgdHJhbnNjb2RlVGFyZ2V0U3RyID0gVHJhbnNjb2RlVGFyZ2V0LlBWUlRDMV80X1JHQkE7XG4gICAgICAgIGNvbXByZXNzaW9uVGV4dHVyZVR5cGUgPSBDb21wcmVzc2lvblRleHR1cmVUeXBlLlBWUlRDX1JHQkFfNEJQUFYxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNjb2RlVGFyZ2V0U3RyID0gVHJhbnNjb2RlVGFyZ2V0LlBWUlRDMV80X1JHQjtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuUFZSVENfUkdCXzRCUFBWMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV0YzIpIHtcbiAgICAgIGlmIChoYXNBbHBoYSkge1xuICAgICAgICB0cmFuc2NvZGVUYXJnZXRTdHIgPSBUcmFuc2NvZGVUYXJnZXQuRVRDMl9SR0JBO1xuICAgICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlID0gQ29tcHJlc3Npb25UZXh0dXJlVHlwZS5FVEMyX1JHQkE4X0VBQztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zY29kZVRhcmdldFN0ciA9IFRyYW5zY29kZVRhcmdldC5FVEMxX1JHQjtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuRVRDMl9SR0I4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXRjMSkge1xuICAgICAgdHJhbnNjb2RlVGFyZ2V0U3RyID0gVHJhbnNjb2RlVGFyZ2V0LkVUQzFfUkdCO1xuICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuRVRDMV9SR0I7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zY29kZVRhcmdldFN0ciA9IFRyYW5zY29kZVRhcmdldC5SR0JBMzI7XG4gICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlID0gQ29tcHJlc3Npb25UZXh0dXJlVHlwZS5SR0JBOF9FWFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhbnNjb2RlVGFyZ2V0U3RyLCBjb21wcmVzc2lvblRleHR1cmVUeXBlIH07XG4gIH1cbiAgcHJpdmF0ZSBfX2dldERldmljZURlcGVuZGVudFBhcmFtZXRlcnNXZWJHUFUoaGFzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCBhZGFwdGVyID0gd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdwdURldmljZVdyYXBwZXIoKS5ncHVBZGFwdGVyO1xuXG4gICAgY29uc3QgYXN0YyA9IGFkYXB0ZXIuZmVhdHVyZXMuaGFzKCd0ZXh0dXJlLWNvbXByZXNzaW9uLWFzdGMnKTtcbiAgICBjb25zdCBzM3RjID0gYWRhcHRlci5mZWF0dXJlcy5oYXMoJ3RleHR1cmUtY29tcHJlc3Npb24tYmMnKTtcbiAgICBjb25zdCBldGMyID0gYWRhcHRlci5mZWF0dXJlcy5oYXMoJ3RleHR1cmUtY29tcHJlc3Npb24tZXRjMicpO1xuXG4gICAgbGV0IHRyYW5zY29kZVRhcmdldFN0cjogVHJhbnNjb2RlVGFyZ2V0O1xuICAgIGxldCBjb21wcmVzc2lvblRleHR1cmVUeXBlOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bTtcbiAgICBpZiAoYXN0Yykge1xuICAgICAgdHJhbnNjb2RlVGFyZ2V0U3RyID0gVHJhbnNjb2RlVGFyZ2V0LkFTVENfNHg0X1JHQkE7XG4gICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlID0gQ29tcHJlc3Npb25UZXh0dXJlVHlwZS5BU1RDX1JHQkFfNHg0O1xuICAgIH0gZWxzZSBpZiAoczN0Yykge1xuICAgICAgaWYgKGhhc0FscGhhKSB7XG4gICAgICAgIHRyYW5zY29kZVRhcmdldFN0ciA9IFRyYW5zY29kZVRhcmdldC5CQzNfUkdCQTtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuUzNUQ19SR0JBX0RYVDU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2NvZGVUYXJnZXRTdHIgPSBUcmFuc2NvZGVUYXJnZXQuQkMxX1JHQjtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuUzNUQ19SR0JfRFhUMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV0YzIpIHtcbiAgICAgIGlmIChoYXNBbHBoYSkge1xuICAgICAgICB0cmFuc2NvZGVUYXJnZXRTdHIgPSBUcmFuc2NvZGVUYXJnZXQuRVRDMl9SR0JBO1xuICAgICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlID0gQ29tcHJlc3Npb25UZXh0dXJlVHlwZS5FVEMyX1JHQkE4X0VBQztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zY29kZVRhcmdldFN0ciA9IFRyYW5zY29kZVRhcmdldC5FVEMxX1JHQjtcbiAgICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuRVRDMl9SR0I4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc2NvZGVUYXJnZXRTdHIgPSBUcmFuc2NvZGVUYXJnZXQuUkdCQTMyO1xuICAgICAgY29tcHJlc3Npb25UZXh0dXJlVHlwZSA9IENvbXByZXNzaW9uVGV4dHVyZVR5cGUuUkdCQThfRVhUO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zY29kZVRhcmdldFN0ciwgY29tcHJlc3Npb25UZXh0dXJlVHlwZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3BhcnNlKHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXkpOiBLVFgyQ29udGFpbmVyIHtcbiAgICAvLyBUaGUgcGFyc2VyIGNhbiBkZXRlY3QgYW4gaW52YWxpZCBpZGVudGlmaWVyLlxuICAgIHJldHVybiByZWFkKHVpbnQ4QXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3RyYW5zY29kZURhdGEoa3R4MkNvbnRhaW5lcjogS1RYMkNvbnRhaW5lcikge1xuICAgIGNvbnN0IHdpZHRoID0ga3R4MkNvbnRhaW5lci5waXhlbFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGt0eDJDb250YWluZXIucGl4ZWxIZWlnaHQ7XG4gICAgY29uc3QgZmFjZUNvdW50ID0ga3R4MkNvbnRhaW5lci5mYWNlQ291bnQ7IC8vIGZhY2VDb3VudCBpcyA2IGlmIHRoZSB0cmFuc2NvZGVkIGRhdGEgaXMgYSBjdWJlIG1hcCAobm90IHN1cHBvcnQgeWV0KVxuXG4gICAgY29uc3QgaW1hZ2VEZXNjcyA9IGt0eDJDb250YWluZXIuZ2xvYmFsRGF0YT8uaW1hZ2VEZXNjcztcblxuICAgIGNvbnN0IGRmZCA9IGt0eDJDb250YWluZXIuZGF0YUZvcm1hdERlc2NyaXB0b3JbMF07XG4gICAgY29uc3QgY29tcHJlc3NlZFRleHR1cmVGb3JtYXQgPVxuICAgICAgZGZkLmNvbG9yTW9kZWwgPT09IEtUWDJNb2RlbC5VQVNUQ1xuICAgICAgICA/IENvbXByZXNzZWRUZXh0dXJlRm9ybWF0LlVBU1RDNHg0XG4gICAgICAgIDogQ29tcHJlc3NlZFRleHR1cmVGb3JtYXQuRVRDMVM7XG5cbiAgICBjb25zdCBoYXNBbHBoYSA9IHRoaXMuX19oYXNBbHBoYShkZmQsIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0KTtcbiAgICBjb25zdCBpc1ZpZGVvID0gZmFsc2U7XG5cbiAgICBjb25zdCB0cmFuc2NvZGVyTW9kdWxlID0gS1RYMlRleHR1cmVMb2FkZXIuX19tc2NUcmFuc2NvZGVyTW9kdWxlO1xuICAgIGNvbnN0IHRyYW5zY29kZXIgPVxuICAgICAgY29tcHJlc3NlZFRleHR1cmVGb3JtYXQgPT09IENvbXByZXNzZWRUZXh0dXJlRm9ybWF0LlVBU1RDNHg0XG4gICAgICAgID8gbmV3IHRyYW5zY29kZXJNb2R1bGUuVWFzdGNJbWFnZVRyYW5zY29kZXIoKVxuICAgICAgICA6IG5ldyB0cmFuc2NvZGVyTW9kdWxlLkJhc2lzTHpFdGMxc0ltYWdlVHJhbnNjb2RlcigpO1xuICAgIGNvbnN0IHRleHR1cmVGb3JtYXQgPVxuICAgICAgY29tcHJlc3NlZFRleHR1cmVGb3JtYXQgPT09IENvbXByZXNzZWRUZXh0dXJlRm9ybWF0LlVBU1RDNHg0XG4gICAgICAgID8gdHJhbnNjb2Rlck1vZHVsZS5UZXh0dXJlRm9ybWF0LlVBU1RDNHg0XG4gICAgICAgIDogdHJhbnNjb2Rlck1vZHVsZS5UZXh0dXJlRm9ybWF0LkVUQzFTO1xuXG4gICAgY29uc3QgeyB0cmFuc2NvZGVUYXJnZXRTdHIsIGNvbXByZXNzaW9uVGV4dHVyZVR5cGUgfSA9XG4gICAgICBTeXN0ZW1TdGF0ZS5jdXJyZW50UHJvY2Vzc0FwcHJvYWNoID09PSBQcm9jZXNzQXBwcm9hY2guV2ViR1BVXG4gICAgICAgID8gdGhpcy5fX2dldERldmljZURlcGVuZGVudFBhcmFtZXRlcnNXZWJHUFUoaGFzQWxwaGEpXG4gICAgICAgIDogdGhpcy5fX2dldERldmljZURlcGVuZGVudFBhcmFtZXRlcnNXZWJHTChoYXNBbHBoYSk7XG5cbiAgICBjb25zdCB0cmFuc2NvZGVUYXJnZXQgPSB0cmFuc2NvZGVyTW9kdWxlLlRyYW5zY29kZVRhcmdldFt0cmFuc2NvZGVUYXJnZXRTdHJdO1xuXG4gICAgY29uc3QgbWlwbWFwRGF0YTogVGV4dHVyZURhdGFbXSA9IFtdO1xuICAgIGNvbnN0IHRyYW5zY29kZWREYXRhID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlLFxuICAgICAgbWlwbWFwRGF0YSxcbiAgICAgIG5lZWRHYW1tYUNvcnJlY3Rpb246IGRmZC50cmFuc2ZlckZ1bmN0aW9uICE9PSBLVFgyVHJhbnNmZXIuU1JHQixcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgbGV2ZWwgPSAwOyBsZXZlbCA8IGt0eDJDb250YWluZXIubGV2ZWxzLmxlbmd0aDsgbGV2ZWwrKykge1xuICAgICAgY29uc3QgbGV2ZWxXaWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoID4+IGxldmVsKTtcbiAgICAgIGNvbnN0IGxldmVsSGVpZ2h0ID0gTWF0aC5tYXgoMSwgaGVpZ2h0ID4+IGxldmVsKTtcblxuICAgICAgY29uc3QgaW1hZ2VJbmZvID0gbmV3IHRyYW5zY29kZXJNb2R1bGUuSW1hZ2VJbmZvKFxuICAgICAgICB0ZXh0dXJlRm9ybWF0LFxuICAgICAgICBsZXZlbFdpZHRoLFxuICAgICAgICBsZXZlbEhlaWdodCxcbiAgICAgICAgbGV2ZWxcbiAgICAgICk7XG5cbiAgICAgIGxldCBsZXZlbEJ1ZmZlciA9IGt0eDJDb250YWluZXIubGV2ZWxzW2xldmVsXS5sZXZlbERhdGE7XG4gICAgICBjb25zdCBsZXZlbFVuY29tcHJlc3NlZEJ5dGVMZW5ndGggPSBrdHgyQ29udGFpbmVyLmxldmVsc1tsZXZlbF0udW5jb21wcmVzc2VkQnl0ZUxlbmd0aDtcbiAgICAgIGNvbnN0IGxldmVsQnVmZmVyQnl0ZUxlbmd0aCA9IGltYWdlSW5mby5udW1CbG9ja3NYICogaW1hZ2VJbmZvLm51bUJsb2Nrc1kgKiBkZmQuYnl0ZXNQbGFuZVswXTtcblxuICAgICAgaWYgKGt0eDJDb250YWluZXIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9PT0gS1RYMlN1cGVyY29tcHJlc3Npb25TY2hlbWUuWlNURCkge1xuICAgICAgICBsZXZlbEJ1ZmZlciA9IEtUWDJUZXh0dXJlTG9hZGVyLl9fenN0ZERlY29kZXIuZGVjb2RlKFxuICAgICAgICAgIGxldmVsQnVmZmVyLFxuICAgICAgICAgIGxldmVsVW5jb21wcmVzc2VkQnl0ZUxlbmd0aFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgZmFjZUJ1ZmZlckJ5dGVPZmZzZXQgPSAwO1xuICAgICAgY29uc3QgZmlyc3RJbWFnZURlc2NJbmRleEluTGV2ZWwgPVxuICAgICAgICBsZXZlbCAqXG4gICAgICAgIE1hdGgubWF4KGt0eDJDb250YWluZXIubGF5ZXJDb3VudCwgMSkgKlxuICAgICAgICBmYWNlQ291bnQgKlxuICAgICAgICBNYXRoLm1heChrdHgyQ29udGFpbmVyLnBpeGVsRGVwdGgsIDEpO1xuXG4gICAgICBmb3IgKGxldCBmYWNlSW5kZXggPSAwOyBmYWNlSW5kZXggPCBmYWNlQ291bnQ7IGZhY2VJbmRleCsrKSB7XG4gICAgICAgIGxldCBpbWFnZURlc2M6IEtUWDJHbG9iYWxEYXRhQmFzaXNMWkltYWdlRGVzYyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZmFjZUJ1ZmZlcjogVWludDhBcnJheTtcbiAgICAgICAgaWYgKGt0eDJDb250YWluZXIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9PT0gS1RYMlN1cGVyY29tcHJlc3Npb25TY2hlbWUuQkFTSVNMWikge1xuICAgICAgICAgIGltYWdlRGVzYyA9IGltYWdlRGVzY3M/LltcbiAgICAgICAgICAgIGZpcnN0SW1hZ2VEZXNjSW5kZXhJbkxldmVsICsgZmFjZUluZGV4XG4gICAgICAgICAgXSBhcyBLVFgyR2xvYmFsRGF0YUJhc2lzTFpJbWFnZURlc2M7XG5cbiAgICAgICAgICBmYWNlQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgICBsZXZlbEJ1ZmZlcixcbiAgICAgICAgICAgIGltYWdlRGVzYy5yZ2JTbGljZUJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBpbWFnZURlc2MucmdiU2xpY2VCeXRlTGVuZ3RoICsgaW1hZ2VEZXNjLmFscGhhU2xpY2VCeXRlTGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWNlQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkobGV2ZWxCdWZmZXIsIGZhY2VCdWZmZXJCeXRlT2Zmc2V0LCBsZXZlbEJ1ZmZlckJ5dGVMZW5ndGgpO1xuICAgICAgICAgIGZhY2VCdWZmZXJCeXRlT2Zmc2V0ICs9IGxldmVsQnVmZmVyQnl0ZUxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IFRyYW5zY29kZWRJbWFnZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0ID09PSBDb21wcmVzc2VkVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCkge1xuICAgICAgICAgIGltYWdlSW5mby5mbGFncyA9IDA7XG4gICAgICAgICAgaW1hZ2VJbmZvLnJnYkJ5dGVPZmZzZXQgPSAwO1xuICAgICAgICAgIGltYWdlSW5mby5yZ2JCeXRlTGVuZ3RoID0gbGV2ZWxVbmNvbXByZXNzZWRCeXRlTGVuZ3RoO1xuICAgICAgICAgIGltYWdlSW5mby5hbHBoYUJ5dGVPZmZzZXQgPSAwO1xuICAgICAgICAgIGltYWdlSW5mby5hbHBoYUJ5dGVMZW5ndGggPSAwO1xuXG4gICAgICAgICAgcmVzdWx0ID0gKHRyYW5zY29kZXIgYXMgVWFzdGNJbWFnZVRyYW5zY29kZXIpLnRyYW5zY29kZUltYWdlKFxuICAgICAgICAgICAgdHJhbnNjb2RlVGFyZ2V0LFxuICAgICAgICAgICAgZmFjZUJ1ZmZlcixcbiAgICAgICAgICAgIGltYWdlSW5mbyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBoYXNBbHBoYSxcbiAgICAgICAgICAgIGlzVmlkZW9cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNnZCA9IGt0eDJDb250YWluZXIuZ2xvYmFsRGF0YSBhcyBLVFgyR2xvYmFsRGF0YUJhc2lzTFo7XG4gICAgICAgICAgY29uc3QgYmFzaXNUcmFuc2NvZGVyID0gdHJhbnNjb2RlciBhcyBCYXNpc0x6RXRjMXNJbWFnZVRyYW5zY29kZXI7XG4gICAgICAgICAgYmFzaXNUcmFuc2NvZGVyLmRlY29kZVBhbGV0dGVzKFxuICAgICAgICAgICAgc2dkLmVuZHBvaW50Q291bnQsXG4gICAgICAgICAgICBzZ2QuZW5kcG9pbnRzRGF0YSxcbiAgICAgICAgICAgIHNnZC5zZWxlY3RvckNvdW50LFxuICAgICAgICAgICAgc2dkLnNlbGVjdG9yc0RhdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIGJhc2lzVHJhbnNjb2Rlci5kZWNvZGVUYWJsZXMoc2dkLnRhYmxlc0RhdGEpO1xuXG4gICAgICAgICAgaW1hZ2VJbmZvLmZsYWdzID0gaW1hZ2VEZXNjIS5pbWFnZUZsYWdzO1xuICAgICAgICAgIGltYWdlSW5mby5yZ2JCeXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgICBpbWFnZUluZm8ucmdiQnl0ZUxlbmd0aCA9IGltYWdlRGVzYyEucmdiU2xpY2VCeXRlTGVuZ3RoO1xuICAgICAgICAgIGltYWdlSW5mby5hbHBoYUJ5dGVPZmZzZXQgPVxuICAgICAgICAgICAgaW1hZ2VEZXNjIS5hbHBoYVNsaWNlQnl0ZU9mZnNldCA+IDAgPyBpbWFnZURlc2MhLnJnYlNsaWNlQnl0ZUxlbmd0aCA6IDA7XG4gICAgICAgICAgaW1hZ2VJbmZvLmFscGhhQnl0ZUxlbmd0aCA9IGltYWdlRGVzYyEuYWxwaGFTbGljZUJ5dGVMZW5ndGg7XG5cbiAgICAgICAgICByZXN1bHQgPSBiYXNpc1RyYW5zY29kZXIudHJhbnNjb2RlSW1hZ2UoXG4gICAgICAgICAgICB0cmFuc2NvZGVUYXJnZXQsXG4gICAgICAgICAgICBmYWNlQnVmZmVyLFxuICAgICAgICAgICAgaW1hZ2VJbmZvLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGlzVmlkZW9cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdD8udHJhbnNjb2RlZEltYWdlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2NvZGVkVGV4dHVyZUJ1ZmZlciA9IHJlc3VsdC50cmFuc2NvZGVkSW1hZ2UuZ2V0X3R5cGVkX21lbW9yeV92aWV3KCkuc2xpY2UoKTtcbiAgICAgICAgICByZXN1bHQudHJhbnNjb2RlZEltYWdlLmRlbGV0ZSgpO1xuXG4gICAgICAgICAgY29uc3QgbWlwbWFwID0ge1xuICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICB3aWR0aDogbGV2ZWxXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogbGV2ZWxIZWlnaHQsXG4gICAgICAgICAgICBidWZmZXI6IHRyYW5zY29kZWRUZXh0dXJlQnVmZmVyLFxuICAgICAgICAgIH0gYXMgVGV4dHVyZURhdGE7XG4gICAgICAgICAgbWlwbWFwRGF0YS5wdXNoKG1pcG1hcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNjb2RlZERhdGE7XG4gIH1cblxuICBwcml2YXRlIF9faGFzQWxwaGEoXG4gICAgZGZkOiBLVFgyRGF0YUZvcm1hdERlc2NyaXB0b3JCYXNpY0Zvcm1hdCxcbiAgICBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdDogQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRcbiAgKSB7XG4gICAgaWYgKGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0ID09PSBDb21wcmVzc2VkVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCkge1xuICAgICAgcmV0dXJuIGRmZC5zYW1wbGVzWzBdLmNoYW5uZWxJRCA9PT0gS1RYMkNoYW5uZWxVQVNUQy5SR0JBO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBkZmQuc2FtcGxlcy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgKGRmZC5zYW1wbGVzWzBdLmNoYW5uZWxJRCA9PT0gS1RYMkNoYW5uZWxFVEMxUy5BQUEgfHxcbiAgICAgICAgICBkZmQuc2FtcGxlc1sxXS5jaGFubmVsSUQgPT09IEtUWDJDaGFubmVsRVRDMVMuQUFBKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vS1RYMlRleHR1cmVMb2FkZXInO1xuIiwiaW1wb3J0IHsgTWF0cml4NDQsIFJlbmRlclRhcmdldFRleHR1cmVDdWJlIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgTGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTGlnaHQvTGlnaHRDb21wb25lbnQnO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnLi4vLi4vZm91bmRhdGlvbi9nZW9tZXRyeS9QcmltaXRpdmUnO1xuaW1wb3J0IHsgSU1lc2hFbnRpdHkgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IElNYXRyaXgzMyB9IGZyb20gJy4uLy4uL2ZvdW5kYXRpb24vbWF0aC9JTWF0cml4JztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL3JlbmRlcmVyL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi8uLi9mb3VuZGF0aW9uL3RleHR1cmVzL0N1YmVUZXh0dXJlJztcbmltcG9ydCB7IEluZGV4IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgV2ViR0xDb250ZXh0V3JhcHBlciB9IGZyb20gJy4uL1dlYkdMQ29udGV4dFdyYXBwZXInO1xuXG5leHBvcnQgdHlwZSBSZW5kZXJpbmdBcmdXZWJHTCA9IHtcbiAgZ2x3OiBXZWJHTENvbnRleHRXcmFwcGVyO1xuICBlbnRpdHk6IElNZXNoRW50aXR5O1xuICBwcmltaXRpdmU6IFByaW1pdGl2ZTtcbiAgd29ybGRNYXRyaXg6IE1hdHJpeDQ0O1xuICBub3JtYWxNYXRyaXg6IElNYXRyaXgzMztcbiAgaXNCaWxsYm9hcmQ6IGJvb2xlYW47XG4gIGxpZ2h0Q29tcG9uZW50czogTGlnaHRDb21wb25lbnRbXTtcbiAgcmVuZGVyUGFzczogUmVuZGVyUGFzcztcbiAgZGlmZnVzZUN1YmU/OiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlO1xuICBzcGVjdWxhckN1YmU/OiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlO1xuICBpc1ZyOiBib29sZWFuO1xuICBkaXNwbGF5SWR4OiBJbmRleDtcbiAgc2V0VW5pZm9ybTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlbmRlcmluZ0FyZ1dlYkdwdSA9IHtcbiAgY2FtZXJhQ29tcG9uZW50U2lkOiBJbmRleDtcbiAgZW50aXR5OiBJTWVzaEVudGl0eTtcbiAgc3BlY3VsYXJDdWJlPzogQ3ViZVRleHR1cmUgfCBSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZTtcbn07XG5leHBvcnQgdHlwZSBBdHRyaWJ1dGVOYW1lcyA9IEFycmF5PHN0cmluZz47XG4iLCJleHBvcnQgKiBmcm9tICcuL0NvbW1vblR5cGVzJztcbiIsImV4cG9ydCBjbGFzcyBXZWJHcHVEZXZpY2VXcmFwcGVyIHtcbiAgcHJpdmF0ZSBfX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgX19ncHVBZGFwdGVyOiBHUFVBZGFwdGVyO1xuICBwcml2YXRlIF9fZ3B1RGV2aWNlOiBHUFVEZXZpY2U7XG4gIHByaXZhdGUgX19jb250ZXh0OiBHUFVDYW52YXNDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGdwdUFkYXB0ZXI6IEdQVUFkYXB0ZXIsIGdwdURldmljZTogR1BVRGV2aWNlKSB7XG4gICAgdGhpcy5fX2NhbnZhcyA9IGNhbnZhcztcbiAgICB0aGlzLl9fY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJncHUnKSBhcyB1bmtub3duIGFzIEdQVUNhbnZhc0NvbnRleHQ7XG4gICAgdGhpcy5fX2dwdUFkYXB0ZXIgPSBncHVBZGFwdGVyO1xuICAgIHRoaXMuX19ncHVEZXZpY2UgPSBncHVEZXZpY2U7XG4gICAgY29uc3QgcHJlc2VudGF0aW9uRm9ybWF0ID0gbmF2aWdhdG9yLmdwdS5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKTtcbiAgICB0aGlzLl9fY29udGV4dC5jb25maWd1cmUoe1xuICAgICAgZGV2aWNlOiB0aGlzLl9fZ3B1RGV2aWNlLFxuICAgICAgZm9ybWF0OiBwcmVzZW50YXRpb25Gb3JtYXQsXG4gICAgICBhbHBoYU1vZGU6ICdwcmVtdWx0aXBsaWVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9fY2FudmFzO1xuICB9XG5cbiAgZ2V0IGdwdUFkYXB0ZXIoKTogR1BVQWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuX19ncHVBZGFwdGVyO1xuICB9XG5cbiAgZ2V0IGdwdURldmljZSgpOiBHUFVEZXZpY2Uge1xuICAgIHJldHVybiB0aGlzLl9fZ3B1RGV2aWNlO1xuICB9XG5cbiAgZ2V0IGNvbnRleHQoKTogR1BVQ2FudmFzQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX19jb250ZXh0O1xuICB9XG59XG4iLCIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkB3ZWJncHUvdHlwZXNcIiAvPlxuXG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9EYXRhVXRpbCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFRleHR1cmUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3RleHR1cmVzL0Fic3RyYWN0VGV4dHVyZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBDb21wb25lbnRUeXBlRW51bSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcG9uZW50VHlwZSc7XG5pbXBvcnQgeyBQaXhlbEZvcm1hdCwgUGl4ZWxGb3JtYXRFbnVtIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9QaXhlbEZvcm1hdCc7XG5pbXBvcnQgeyBUZXh0dXJlUGFyYW1ldGVyLCBUZXh0dXJlUGFyYW1ldGVyRW51bSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVGV4dHVyZVBhcmFtZXRlcic7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRyaWJ1dGUsIFZlcnRleEF0dHJpYnV0ZUVudW0gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL1ZlcnRleEF0dHJpYnV0ZSc7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBBY2Nlc3NvciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWVtb3J5L0FjY2Vzc29yJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL0lzJztcbmltcG9ydCB7XG4gIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LFxuICBEaXJlY3RUZXh0dXJlRGF0YSxcbiAgSUNHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LFxuICBJbWFnZUJpdG1hcERhdGEsXG59IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvUmVuZGVyUGFzcyc7XG5pbXBvcnQgeyBTYW1wbGVyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi90ZXh0dXJlcy9TYW1wbGVyJztcbmltcG9ydCB7XG4gIEJ5dGUsXG4gIENvdW50LFxuICBJbmRleCxcbiAgU2l6ZSxcbiAgVHlwZWRBcnJheSxcbiAgV2ViR0xSZXNvdXJjZUhhbmRsZSxcbiAgV2ViR1BVUmVzb3VyY2VIYW5kbGUsXG59IGZyb20gJy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFRleHR1cmVEYXRhLCBWZXJ0ZXhIYW5kbGVzIH0gZnJvbSAnLi4vd2ViZ2wvV2ViR0xSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQXR0cmlidXRlTmFtZXMgfSBmcm9tICcuLi93ZWJnbC90eXBlcy9Db21tb25UeXBlcyc7XG5pbXBvcnQgeyBXZWJHcHVEZXZpY2VXcmFwcGVyIH0gZnJvbSAnLi9XZWJHcHVEZXZpY2VXcmFwcGVyJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgSGRyaUZvcm1hdCwgSGRyaUZvcm1hdEVudW0gfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0hkcmlGb3JtYXQnO1xuaW1wb3J0IHtcbiAgZHVtbXlCbGFja0N1YmVUZXh0dXJlLFxuICBkdW1teVdoaXRlVGV4dHVyZSxcbn0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9EdW1teVRleHR1cmVzJztcbmltcG9ydCB7IFNoYWRlclNlbWFudGljcyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3IyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL011dGFibGVWZWN0b3IyJztcbmltcG9ydCB7IE11dGFibGVWZWN0b3I0IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL011dGFibGVWZWN0b3I0JztcbmltcG9ydCB7IE1lc2hSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9NZXNoUmVuZGVyZXIvTWVzaFJlbmRlcmVyQ29tcG9uZW50JztcbmltcG9ydCB7IEFscGhhTW9kZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQWxwaGFNb2RlJztcbmltcG9ydCB7IE1pc2NVdGlsIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL01pc2NVdGlsJztcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi90ZXh0dXJlcy9DdWJlVGV4dHVyZSc7XG5pbXBvcnQgeyBJUmVuZGVyYWJsZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vdGV4dHVyZXMvSVJlbmRlcmFibGUnO1xuaW1wb3J0IHsgRnJhbWVCdWZmZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0ZyYW1lQnVmZmVyJztcbmltcG9ydCB7IEdsb2JhbERhdGFSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL0dsb2JhbERhdGFSZXBvc2l0b3J5JztcbmltcG9ydCB7IFJlbmRlckJ1ZmZlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vdGV4dHVyZXMvUmVuZGVyQnVmZmVyJztcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvVmVjdG9yMic7XG5pbXBvcnQgeyBDYW1lcmFDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ2FtZXJhL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL0VudGl0eVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgU3lzdGVtU3RhdGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3N5c3RlbS9TeXN0ZW1TdGF0ZSc7XG5pbXBvcnQgeyBCYXNpc0ZpbGUgfSBmcm9tICcuLi90eXBlcy9CYXNpc1RleHR1cmUnO1xuaW1wb3J0IHtcbiAgQmFzaXNDb21wcmVzc2lvblR5cGUsXG4gIEJhc2lzQ29tcHJlc3Npb25UeXBlRW51bSxcbn0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9CYXNpc0NvbXByZXNzaW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvQ29tcHJlc3Npb25UZXh0dXJlVHlwZSc7XG5pbXBvcnQgeyBUZXh0dXJlRm9ybWF0LCBUZXh0dXJlRm9ybWF0RW51bSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvVGV4dHVyZUZvcm1hdCc7XG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IHsgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3RleHR1cmVzL1JlbmRlclRhcmdldFRleHR1cmVDdWJlJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuXG5jb25zdCBIRFJJbWFnZSA9IHJlcXVpcmUoJy4uLy4uL3ZlbmRvci9oZHJwbmcubWluLmpzJyk7XG5cbmV4cG9ydCB0eXBlIFdlYkdwdVJlc291cmNlID1cbiAgfCBHUFVUZXh0dXJlXG4gIHwgR1BVQnVmZmVyXG4gIHwgR1BVU2FtcGxlclxuICB8IEdQVVRleHR1cmVWaWV3XG4gIHwgR1BVQnVmZmVyQmluZGluZ1xuICB8IEdQVVJlbmRlclBpcGVsaW5lXG4gIHwgR1BVQ29tcHV0ZVBpcGVsaW5lXG4gIHwgR1BVQmluZEdyb3VwTGF5b3V0XG4gIHwgR1BVQmluZEdyb3VwXG4gIHwgR1BVU2hhZGVyTW9kdWxlXG4gIHwgR1BVQ29tbWFuZEVuY29kZXJcbiAgfCBHUFVDb21wdXRlUGFzc0VuY29kZXJcbiAgfCBHUFVSZW5kZXJQYXNzRW5jb2RlclxuICB8IEdQVUNvbXB1dGVQaXBlbGluZVxuICB8IEdQVVJlbmRlclBpcGVsaW5lXG4gIHwgR1BVUXVlcnlTZXRcbiAgfCBvYmplY3Q7XG5cbnR5cGUgUmVuZGVyUGlwZWxpbmVJZCA9IHN0cmluZztcbnR5cGUgUmVuZGVyUGFzc1VpZCA9IG51bWJlcjtcblxuY29uc3QgSUJMX0RJRkZVU0VfQ1VCRV9URVhUVVJFX0JJTkRJTkdfU0xPVCA9IDE2O1xuY29uc3QgSUJMX1NQRUNVTEFSX0NVQkVfVEVYVFVSRV9CSU5ESU5HX1NMT1QgPSAxNztcblxuZXhwb3J0IGNsYXNzIFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeVxuICBleHRlbmRzIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5XG4gIGltcGxlbWVudHMgSUNHQVBJUmVzb3VyY2VSZXBvc2l0b3J5XG57XG4gIHByaXZhdGUgc3RhdGljIF9faW5zdGFuY2U6IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeTtcbiAgcHJpdmF0ZSBfX3dlYkdwdVJlc291cmNlczogTWFwPFdlYkdMUmVzb3VyY2VIYW5kbGUsIFdlYkdwdVJlc291cmNlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX3Jlc291cmNlQ291bnRlcjogbnVtYmVyID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWQ7XG4gIHByaXZhdGUgX193ZWJHcHVEZXZpY2VXcmFwcGVyPzogV2ViR3B1RGV2aWNlV3JhcHBlcjtcbiAgcHJpdmF0ZSBfX3N0b3JhZ2VCdWZmZXI/OiBHUFVCdWZmZXI7XG4gIHByaXZhdGUgX19zdG9yYWdlQmxlbmRTaGFwZUJ1ZmZlcj86IEdQVUJ1ZmZlcjtcbiAgcHJpdmF0ZSBfX2JpbmRHcm91cFN0b3JhZ2VCdWZmZXI/OiBHUFVCaW5kR3JvdXA7XG4gIHByaXZhdGUgX19iaW5kR3JvdXBMYXlvdXRTdG9yYWdlQnVmZmVyPzogR1BVQmluZEdyb3VwTGF5b3V0O1xuICBwcml2YXRlIF9fd2ViR3B1UmVuZGVyUGlwZWxpbmVNYXA6IE1hcDxSZW5kZXJQaXBlbGluZUlkLCBHUFVSZW5kZXJQaXBlbGluZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19tYXRlcmlhbFN0YXRlVmVyc2lvbk1hcDogTWFwPFJlbmRlclBpcGVsaW5lSWQsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19iaW5kR3JvdXBUZXh0dXJlTWFwOiBNYXA8UmVuZGVyUGlwZWxpbmVJZCwgR1BVQmluZEdyb3VwPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX2JpbmRHcm91cExheW91dFRleHR1cmVNYXA6IE1hcDxSZW5kZXJQaXBlbGluZUlkLCBHUFVCaW5kR3JvdXBMYXlvdXQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9fYmluZEdyb3VwU2FtcGxlck1hcDogTWFwPFJlbmRlclBpcGVsaW5lSWQsIEdQVUJpbmRHcm91cD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX19iaW5kR3JvdXBMYXlvdXRTYW1wbGVyTWFwOiBNYXA8UmVuZGVyUGlwZWxpbmVJZCwgR1BVQmluZEdyb3VwTGF5b3V0PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX2NvbW1hbmRFbmNvZGVyPzogR1BVQ29tbWFuZEVuY29kZXI7XG4gIHByaXZhdGUgX19yZW5kZXJCdW5kbGVzOiBNYXA8UmVuZGVyUGFzc1VpZCwgR1BVUmVuZGVyQnVuZGxlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfX3JlbmRlckJ1bmRsZUVuY29kZXI/OiBHUFVSZW5kZXJCdW5kbGVFbmNvZGVyO1xuICBwcml2YXRlIF9fc3lzdGVtRGVwdGhUZXh0dXJlPzogR1BVVGV4dHVyZTtcbiAgcHJpdmF0ZSBfX3N5c3RlbURlcHRoVGV4dHVyZVZpZXc/OiBHUFVUZXh0dXJlVmlldztcbiAgcHJpdmF0ZSBfX3VuaWZvcm1Nb3JwaE9mZnNldHNCdWZmZXI/OiBHUFVCdWZmZXI7XG4gIHByaXZhdGUgX191bmlmb3JtTW9ycGhXZWlnaHRzQnVmZmVyPzogR1BVQnVmZmVyO1xuICBwcml2YXRlIF9fcmVuZGVyUGFzc0VuY29kZXI/OiBHUFVSZW5kZXJQYXNzRW5jb2RlcjtcbiAgcHJpdmF0ZSBfX2dlbmVyYXRlTWlwbWFwc1NoYWRlck1vZHVsZT86IEdQVVNoYWRlck1vZHVsZTtcbiAgcHJpdmF0ZSBfX2dlbmVyYXRlTWlwbWFwc1BpcGVsaW5lPzogR1BVUmVuZGVyUGlwZWxpbmU7XG4gIHByaXZhdGUgX19nZW5lcmF0ZU1pcG1hcHNGb3JtYXQ/OiBHUFVUZXh0dXJlRm9ybWF0O1xuICBwcml2YXRlIF9fZ2VuZXJhdGVNaXBtYXBzU2FtcGxlcj86IEdQVVNhbXBsZXI7XG4gIHByaXZhdGUgX19jb250ZXh0Q3VycmVudFRleHR1cmVWaWV3PzogR1BVVGV4dHVyZVZpZXc7XG5cbiAgcHJpdmF0ZSBfX2xhc3RNYXRlcmlhbHNVcGRhdGVDb3VudCA9IC0xO1xuICBwcml2YXRlIF9fbGFzdEN1cnJlbnRDYW1lcmFDb21wb25lbnRTaWQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RFbnRpdHlSZXBvc2l0b3J5VXBkYXRlQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RQcmltaXRpdmVzTWF0ZXJpYWxWYXJpYW50VXBkYXRlQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RNZXNoUmVuZGVyZXJDb21wb25lbnRzVXBkYXRlQ291bnQgPSAtMTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBjbGVhckNhY2hlKCkge1xuICAgIHRoaXMuX193ZWJHcHVSZW5kZXJQaXBlbGluZU1hcC5jbGVhcigpO1xuICAgIHRoaXMuX19tYXRlcmlhbFN0YXRlVmVyc2lvbk1hcC5jbGVhcigpO1xuICAgIHRoaXMuX19iaW5kR3JvdXBUZXh0dXJlTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fX2JpbmRHcm91cExheW91dFRleHR1cmVNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9fYmluZEdyb3VwU2FtcGxlck1hcC5jbGVhcigpO1xuICAgIHRoaXMuX19iaW5kR3JvdXBMYXlvdXRTYW1wbGVyTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fX3JlbmRlckJ1bmRsZXMuY2xlYXIoKTtcbiAgfVxuXG4gIGFkZFdlYkdwdURldmljZVdyYXBwZXIod2ViR3B1RGV2aWNlV3JhcHBlcjogV2ViR3B1RGV2aWNlV3JhcHBlcikge1xuICAgIHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyID0gd2ViR3B1RGV2aWNlV3JhcHBlcjtcbiAgICB0aGlzLl9fY29tbWFuZEVuY29kZXIgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlci5ncHVEZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcbiAgfVxuXG4gIGdldFdlYkdwdURldmljZVdyYXBwZXIoKTogV2ViR3B1RGV2aWNlV3JhcHBlciB7XG4gICAgcmV0dXJuIHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyITtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIGdldFJlc291cmNlTnVtYmVyKCk6IFdlYkdQVVJlc291cmNlSGFuZGxlIHtcbiAgICByZXR1cm4gKyt0aGlzLl9fcmVzb3VyY2VDb3VudGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlZ2lzdGVyUmVzb3VyY2Uob2JqOiBXZWJHcHVSZXNvdXJjZSkge1xuICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuZ2V0UmVzb3VyY2VOdW1iZXIoKTtcbiAgICAob2JqIGFzIGFueSkuX3Jlc291cmNlVWlkID0gaGFuZGxlO1xuICAgIHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuc2V0KGhhbmRsZSwgb2JqKTtcbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG5cbiAgZ2V0Q2FudmFzU2l6ZSgpOiBbU2l6ZSwgU2l6ZV0ge1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5jYW52YXM7XG4gICAgcmV0dXJuIFtjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHRdO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFdlYkdQVSBUZXh0dXJlXG4gICAqIEBwYXJhbSBpbWFnZURhdGEgLSBhbiBJbWFnZUJpdG1hcERhdGFcbiAgICogQHBhcmFtIHBhcmFtT2JqZWN0IC0gYSBwYXJhbWV0ZXIgb2JqZWN0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVGV4dHVyZUZyb21JbWFnZUJpdG1hcERhdGEoXG4gICAgaW1hZ2VEYXRhOiBJbWFnZUJpdG1hcERhdGEsXG4gICAge1xuICAgICAgbGV2ZWwsXG4gICAgICBpbnRlcm5hbEZvcm1hdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgYm9yZGVyLFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgIH06IHtcbiAgICAgIGxldmVsOiBJbmRleDtcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICAgIHdpZHRoOiBTaXplO1xuICAgICAgaGVpZ2h0OiBTaXplO1xuICAgICAgYm9yZGVyOiBTaXplO1xuICAgICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBib29sZWFuO1xuICAgIH1cbiAgKTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IHRleHR1cmVIYW5kbGUgPSB0aGlzLl9fY3JlYXRlVGV4dHVyZUlubmVyKFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBpbnRlcm5hbEZvcm1hdCxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgICAgaW1hZ2VEYXRhXG4gICAgKTtcblxuICAgIHJldHVybiB0ZXh0dXJlSGFuZGxlO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGV4dHVyZUZyb21EYXRhVXJpKFxuICAgIGRhdGFVcmk6IHN0cmluZyxcbiAgICB7XG4gICAgICBsZXZlbCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgYm9yZGVyLFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgIH06IHtcbiAgICAgIGxldmVsOiBJbmRleDtcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICAgIGJvcmRlcjogU2l6ZTtcbiAgICAgIGZvcm1hdDogUGl4ZWxGb3JtYXRFbnVtO1xuICAgICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgICBnZW5lcmF0ZU1pcG1hcDogYm9vbGVhbjtcbiAgICB9XG4gICk6IFByb21pc2U8V2ViR1BVUmVzb3VyY2VIYW5kbGU+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8V2ViR1BVUmVzb3VyY2VIYW5kbGU+KChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGlmICghZGF0YVVyaS5tYXRjaCgvXmRhdGE6LykpIHtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICB9XG4gICAgICBpbWcub25sb2FkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0dXJlRnJvbUhUTUxJbWFnZUVsZW1lbnQoaW1nLCB7XG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBnZW5lcmF0ZU1pcG1hcCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzb2x2ZSh0ZXh0dXJlKTtcbiAgICAgIH07XG5cbiAgICAgIGltZy5zcmMgPSBkYXRhVXJpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVNaXBtYXBzMmQodGV4dHVyZUhhbmRsZTogV2ViR1BVUmVzb3VyY2VIYW5kbGUsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZ3B1VGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KHRleHR1cmVIYW5kbGUpIGFzIEdQVVRleHR1cmU7XG4gICAgY29uc3QgdGV4dHVyZURlc2NyaXB0b3I6IEdQVVRleHR1cmVEZXNjcmlwdG9yID0ge1xuICAgICAgc2l6ZTogW3dpZHRoLCBoZWlnaHQsIDFdLFxuICAgICAgZm9ybWF0OiBncHVUZXh0dXJlLmZvcm1hdCxcbiAgICAgIHVzYWdlOlxuICAgICAgICBHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HIHxcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUIHxcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5ULFxuICAgICAgbWlwTGV2ZWxDb3VudDogTWF0aC5mbG9vcihNYXRoLmxvZzIoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpKSArIDEsXG4gICAgfTtcbiAgICB0aGlzLmdlbmVyYXRlTWlwbWFwcyhncHVUZXh0dXJlLCB0ZXh0dXJlRGVzY3JpcHRvcik7XG4gIH1cblxuICBnZW5lcmF0ZU1pcG1hcHNDdWJlKHRleHR1cmVIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGdwdVRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRleHR1cmVEZXNjcmlwdG9yOiBHUFVUZXh0dXJlRGVzY3JpcHRvciA9IHtcbiAgICAgIHNpemU6IFt3aWR0aCwgaGVpZ2h0LCA2XSxcbiAgICAgIGZvcm1hdDogZ3B1VGV4dHVyZS5mb3JtYXQsXG4gICAgICB1c2FnZTpcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCxcbiAgICAgIG1pcExldmVsQ291bnQ6IE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSkgKyAxLFxuICAgIH07XG4gICAgdGhpcy5nZW5lcmF0ZU1pcG1hcHMoZ3B1VGV4dHVyZSwgdGV4dHVyZURlc2NyaXB0b3IpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGV4dHVyZVBpeGVsRGF0YShcbiAgICB0ZXh0dXJlSGFuZGxlOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGZyYW1lQnVmZmVyVWlkOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSxcbiAgICBjb2xvckF0dGFjaG1lbnRJbmRleDogbnVtYmVyXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGdwdVRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRleHR1cmVEYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IGNvbW1hbmRFbmNvZGVyID0gZ3B1RGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XG4gICAgY29uc3QgYnVmZmVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICBzaXplOiB3aWR0aCAqIGhlaWdodCAqIDQsXG4gICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgfCBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRCxcbiAgICB9KTtcbiAgICBjb21tYW5kRW5jb2Rlci5jb3B5VGV4dHVyZVRvQnVmZmVyKFxuICAgICAgeyB0ZXh0dXJlOiBncHVUZXh0dXJlIH0sXG4gICAgICB7IGJ1ZmZlciwgYnl0ZXNQZXJSb3c6IHdpZHRoICogNCB9LFxuICAgICAgeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aE9yQXJyYXlMYXllcnM6IDEgfVxuICAgICk7XG4gICAgZ3B1RGV2aWNlLnF1ZXVlLnN1Ym1pdChbY29tbWFuZEVuY29kZXIuZmluaXNoKCldKTtcbiAgICBhd2FpdCBidWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpO1xuICAgIHRleHR1cmVEYXRhLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgIGJ1ZmZlci51bm1hcCgpO1xuICAgIHJldHVybiB0ZXh0dXJlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBXZWJHUFUgVGV4dHVyZSBNaXBtYXBzIChpbmNsdWRpbmcgQ3ViZU1hcCBzdXBwb3J0KVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBBZGFwdGVkIGZyb206IGh0dHBzOi8vdG9qaS5kZXYvd2ViZ3B1LWJlc3QtcHJhY3RpY2VzL2ltZy10ZXh0dXJlcyNnZW5lcmF0aW5nLW1pcG1hcHNcbiAgICogQHBhcmFtIHRleHR1cmUgLSBhIHRleHR1cmVcbiAgICogQHBhcmFtIHRleHR1cmVEZXNjcmlwdG9yIC0gYSB0ZXh0dXJlIGRlc2NyaXB0b3JcbiAgICovXG4gIGdlbmVyYXRlTWlwbWFwcyh0ZXh0dXJlOiBHUFVUZXh0dXJlLCB0ZXh0dXJlRGVzY3JpcHRvcjogR1BVVGV4dHVyZURlc2NyaXB0b3IpIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuXG4gICAgaWYgKHRoaXMuX19nZW5lcmF0ZU1pcG1hcHNTaGFkZXJNb2R1bGUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5fX2dlbmVyYXRlTWlwbWFwc1NoYWRlck1vZHVsZSA9IGdwdURldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICBjb2RlOiBgXG4gICAgICAgICAgdmFyPHByaXZhdGU+IHBvcyA6IGFycmF5PHZlYzJmLCA0PiA9IGFycmF5PHZlYzJmLCA0PihcbiAgICAgICAgICAgIHZlYzJmKC0xLCAxKSwgdmVjMmYoMSwgMSksXG4gICAgICAgICAgICB2ZWMyZigtMSwgLTEpLCB2ZWMyZigxLCAtMSkpO1xuXG4gICAgICAgICAgc3RydWN0IFZlcnRleE91dHB1dCB7XG4gICAgICAgICAgICBAYnVpbHRpbihwb3NpdGlvbikgcG9zaXRpb24gOiB2ZWM0ZixcbiAgICAgICAgICAgIEBsb2NhdGlvbigwKSB0ZXhDb29yZCA6IHZlYzJmLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBAdmVydGV4XG4gICAgICAgICAgZm4gdmVydGV4TWFpbihAYnVpbHRpbih2ZXJ0ZXhfaW5kZXgpIHZlcnRleEluZGV4IDogdTMyKSAtPiBWZXJ0ZXhPdXRwdXQge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA6IFZlcnRleE91dHB1dDtcbiAgICAgICAgICAgIG91dHB1dC50ZXhDb29yZCA9IHBvc1t2ZXJ0ZXhJbmRleF0gKiB2ZWMyZigwLjUsIC0wLjUpICsgdmVjMmYoMC41KTtcbiAgICAgICAgICAgIG91dHB1dC5wb3NpdGlvbiA9IHZlYzRmKHBvc1t2ZXJ0ZXhJbmRleF0sIDAsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyIGltZ1NhbXBsZXIgOiBzYW1wbGVyO1xuICAgICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXIgaW1nIDogdGV4dHVyZV8yZDxmMzI+O1xuXG4gICAgICAgICAgQGZyYWdtZW50XG4gICAgICAgICAgZm4gZnJhZ21lbnRNYWluKEBsb2NhdGlvbigwKSB0ZXhDb29yZCA6IHZlYzJmKSAtPiBAbG9jYXRpb24oMCkgdmVjNGYge1xuICAgICAgICAgICAgcmV0dXJuIHRleHR1cmVTYW1wbGUoaW1nLCBpbWdTYW1wbGVyLCB0ZXhDb29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICBgLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fX2dlbmVyYXRlTWlwbWFwc1BpcGVsaW5lICE9IG51bGwgJiZcbiAgICAgIHRleHR1cmVEZXNjcmlwdG9yLmZvcm1hdCAhPSB0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzRm9ybWF0XG4gICAgKSB7XG4gICAgICB0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzUGlwZWxpbmUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzUGlwZWxpbmUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5fX2dlbmVyYXRlTWlwbWFwc1BpcGVsaW5lID0gZ3B1RGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKHtcbiAgICAgICAgbGF5b3V0OiAnYXV0bycsXG4gICAgICAgIHZlcnRleDoge1xuICAgICAgICAgIG1vZHVsZTogdGhpcy5fX2dlbmVyYXRlTWlwbWFwc1NoYWRlck1vZHVsZSxcbiAgICAgICAgICBlbnRyeVBvaW50OiAndmVydGV4TWFpbicsXG4gICAgICAgIH0sXG4gICAgICAgIGZyYWdtZW50OiB7XG4gICAgICAgICAgbW9kdWxlOiB0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzU2hhZGVyTW9kdWxlLFxuICAgICAgICAgIGVudHJ5UG9pbnQ6ICdmcmFnbWVudE1haW4nLFxuICAgICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZm9ybWF0OiB0ZXh0dXJlRGVzY3JpcHRvci5mb3JtYXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHByaW1pdGl2ZToge1xuICAgICAgICAgIHRvcG9sb2d5OiAndHJpYW5nbGUtc3RyaXAnLFxuICAgICAgICAgIHN0cmlwSW5kZXhGb3JtYXQ6ICd1aW50MzInLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzRm9ybWF0ID0gdGV4dHVyZURlc2NyaXB0b3IuZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzU2FtcGxlciA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzU2FtcGxlciA9IGdwdURldmljZS5jcmVhdGVTYW1wbGVyKHsgbWluRmlsdGVyOiAnbGluZWFyJyB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyICE9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLl9fcmVuZGVyQnVuZGxlRW5jb2RlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5leGVjdXRlQnVuZGxlcyhbdGhpcy5fX3JlbmRlckJ1bmRsZUVuY29kZXIuZmluaXNoKCldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKTtcbiAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2RlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgaXNDdWJlbWFwID0gdGV4dHVyZS5kaW1lbnNpb24gPT09ICcyZCcgJiYgdGV4dHVyZS5kZXB0aE9yQXJyYXlMYXllcnMgPT09IDY7XG4gICAgY29uc3QgbGF5ZXJDb3VudCA9IGlzQ3ViZW1hcCA/IDYgOiAxO1xuXG4gICAgZm9yIChsZXQgbGF5ZXIgPSAwOyBsYXllciA8IGxheWVyQ291bnQ7ICsrbGF5ZXIpIHtcbiAgICAgIGxldCBzcmNWaWV3ID0gdGV4dHVyZS5jcmVhdGVWaWV3KHtcbiAgICAgICAgZGltZW5zaW9uOiAnMmQnLFxuICAgICAgICBiYXNlTWlwTGV2ZWw6IDAsXG4gICAgICAgIG1pcExldmVsQ291bnQ6IDEsXG4gICAgICAgIGJhc2VBcnJheUxheWVyOiBsYXllcixcbiAgICAgICAgYXJyYXlMYXllckNvdW50OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGV4dHVyZURlc2NyaXB0b3IubWlwTGV2ZWxDb3VudCE7ICsraSkge1xuICAgICAgICBjb25zdCBkc3RWaWV3ID0gdGV4dHVyZS5jcmVhdGVWaWV3KHtcbiAgICAgICAgICBkaW1lbnNpb246ICcyZCcsXG4gICAgICAgICAgYmFzZU1pcExldmVsOiBpLFxuICAgICAgICAgIG1pcExldmVsQ291bnQ6IDEsXG4gICAgICAgICAgYmFzZUFycmF5TGF5ZXI6IGxheWVyLFxuICAgICAgICAgIGFycmF5TGF5ZXJDb3VudDogMSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFzc0VuY29kZXIgPSB0aGlzLl9fY29tbWFuZEVuY29kZXIhLmJlZ2luUmVuZGVyUGFzcyh7XG4gICAgICAgICAgY29sb3JBdHRhY2htZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2aWV3OiBkc3RWaWV3LFxuICAgICAgICAgICAgICBsb2FkT3A6ICdsb2FkJyxcbiAgICAgICAgICAgICAgc3RvcmVPcDogJ3N0b3JlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZ3B1RGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgbGF5b3V0OiB0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzUGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLFxuICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmluZGluZzogMCxcbiAgICAgICAgICAgICAgcmVzb3VyY2U6IHRoaXMuX19nZW5lcmF0ZU1pcG1hcHNTYW1wbGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmluZGluZzogMSxcbiAgICAgICAgICAgICAgcmVzb3VyY2U6IHNyY1ZpZXcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbmRlclxuICAgICAgICBwYXNzRW5jb2Rlci5zZXRQaXBlbGluZSh0aGlzLl9fZ2VuZXJhdGVNaXBtYXBzUGlwZWxpbmUpO1xuICAgICAgICBwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZHJhdyg0KTtcbiAgICAgICAgcGFzc0VuY29kZXIuZW5kKCk7XG5cbiAgICAgICAgc3JjVmlldyA9IGRzdFZpZXc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVGV4dHVyZVNhbXBsZXIoe1xuICAgIG1hZ0ZpbHRlcixcbiAgICBtaW5GaWx0ZXIsXG4gICAgd3JhcFMsXG4gICAgd3JhcFQsXG4gICAgd3JhcFIsXG4gICAgYW5pc290cm9weSxcbiAgICBpc1ByZW11bHRpcGxpZWRBbHBoYSxcbiAgICBzaGFkb3dDb21wYXJlTW9kZSxcbiAgfToge1xuICAgIG1hZ0ZpbHRlcjogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgbWluRmlsdGVyOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICB3cmFwUzogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgd3JhcFQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtO1xuICAgIHdyYXBSOiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICBhbmlzb3Ryb3B5OiBib29sZWFuO1xuICAgIGlzUHJlbXVsdGlwbGllZEFscGhhPzogYm9vbGVhbjtcbiAgICBzaGFkb3dDb21wYXJlTW9kZTogYm9vbGVhbjtcbiAgfSk6IFdlYkdQVVJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5ID8gNCA6IDE7XG5cbiAgICBjb25zdCBkZXNjID0ge1xuICAgICAgbWFnRmlsdGVyOiBtYWdGaWx0ZXIud2ViZ3B1IGFzIEdQVUZpbHRlck1vZGUsXG4gICAgICBtaW5GaWx0ZXI6IG1pbkZpbHRlci53ZWJncHUgYXMgR1BVRmlsdGVyTW9kZSxcbiAgICAgIG1pcG1hcEZpbHRlcjpcbiAgICAgICAgbWluRmlsdGVyID09PSBUZXh0dXJlUGFyYW1ldGVyLkxpbmVhck1pcG1hcExpbmVhciB8fFxuICAgICAgICBtaW5GaWx0ZXIgPT09IFRleHR1cmVQYXJhbWV0ZXIuTmVhcmVzdE1pcG1hcExpbmVhclxuICAgICAgICAgID8gJ2xpbmVhcidcbiAgICAgICAgICA6ICduZWFyZXN0JyxcbiAgICAgIGFkZHJlc3NNb2RlVTogd3JhcFMud2ViZ3B1IGFzIEdQVUFkZHJlc3NNb2RlLFxuICAgICAgYWRkcmVzc01vZGVWOiB3cmFwVC53ZWJncHUgYXMgR1BVQWRkcmVzc01vZGUsXG4gICAgICBhZGRyZXNzTW9kZVc6IHdyYXBSLndlYmdwdSBhcyBHUFVBZGRyZXNzTW9kZSxcbiAgICAgIC8vIGxvZE1pbkNsYW1wOiAwLFxuICAgICAgLy8gbG9kTWF4Q2xhbXA6IDMyLFxuICAgICAgbWF4QW5pc290cm9weSxcbiAgICB9IGFzIEdQVVNhbXBsZXJEZXNjcmlwdG9yO1xuXG4gICAgaWYgKFxuICAgICAgZGVzYy5tYWdGaWx0ZXIgPT09ICduZWFyZXN0JyB8fFxuICAgICAgZGVzYy5taW5GaWx0ZXIgPT09ICduZWFyZXN0JyB8fFxuICAgICAgZGVzYy5taXBtYXBGaWx0ZXIgPT09ICduZWFyZXN0J1xuICAgICkge1xuICAgICAgZGVzYy5tYXhBbmlzb3Ryb3B5ID0gMTtcbiAgICB9XG5cbiAgICBjb25zdCBzYW1wbGVyID0gZ3B1RGV2aWNlLmNyZWF0ZVNhbXBsZXIoZGVzYyk7XG5cbiAgICBjb25zdCBzYW1wbGVySGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc2FtcGxlcik7XG5cbiAgICByZXR1cm4gc2FtcGxlckhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBXZWJHUFUgVmVydGV4IEJ1ZmZlclxuICAgKiBAcGFyYW0gYWNjZXNzb3IgLSBhbiBhY2Nlc3NvclxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVZlcnRleEJ1ZmZlcihhY2Nlc3NvcjogQWNjZXNzb3IpOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCB2ZXJ0ZXhCdWZmZXIgPSBncHVEZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgIHNpemU6IGFjY2Vzc29yLmJ5dGVMZW5ndGgsXG4gICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuVkVSVEVYLFxuICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIG5ldyBVaW50OEFycmF5KHZlcnRleEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQoYWNjZXNzb3IuZ2V0VWludDhBcnJheSgpKTtcbiAgICB2ZXJ0ZXhCdWZmZXIudW5tYXAoKTtcblxuICAgIGNvbnN0IGJ1ZmZlckhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKHZlcnRleEJ1ZmZlcik7XG5cbiAgICByZXR1cm4gYnVmZmVySGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFdlYkdQVSBWZXJ0ZXggQnVmZmVyXG4gICAqIEBwYXJhbSB0eXBlZEFycmF5IC0gYSB0eXBlZCBhcnJheVxuICAgKiBAcmV0dXJucyBhIFdlYkdQVVJlc291cmNlSGFuZGxlXG4gICAqL1xuICBjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tVHlwZWRBcnJheSh0eXBlZEFycmF5OiBUeXBlZEFycmF5KTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgdmVydGV4QnVmZmVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICBzaXplOiB0eXBlZEFycmF5LmJ5dGVMZW5ndGgsXG4gICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuVkVSVEVYLFxuICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIG5ldyBVaW50OEFycmF5KHZlcnRleEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQobmV3IFVpbnQ4QXJyYXkodHlwZWRBcnJheS5idWZmZXIpKTtcbiAgICB2ZXJ0ZXhCdWZmZXIudW5tYXAoKTtcblxuICAgIGNvbnN0IHJlc291cmNlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodmVydGV4QnVmZmVyKTtcblxuICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBXZWJHUFUgSW5kZXggQnVmZmVyXG4gICAqIEBwYXJhbSBhY2Nlc3NvciAtIGFuIGFjY2Vzc29yXG4gICAqIEByZXR1cm5zIGEgV2ViR1BVUmVzb3VyY2VIYW5kbGVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVJbmRleEJ1ZmZlcihhY2Nlc3NvcjogQWNjZXNzb3IpOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcblxuICAgIGxldCB1aW50OEFycmF5ID0gYWNjZXNzb3IuZ2V0VWludDhBcnJheSgpO1xuICAgIGlmIChhY2Nlc3Nvci5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSkge1xuICAgICAgLy8gV2ViR1BVIGRvZXMgbm90IHN1cHBvcnQgdWludDggZm9yIGluZGV4IGJ1ZmZlci5cbiAgICAgIC8vIFNvIHdlIG5lZWQgdG8gY29udmVydCB1aW50OCB0byB1aW50MTYuXG4gICAgICBjb25zdCB1aW50MTZBcnJheSA9IG5ldyBVaW50MTZBcnJheShhY2Nlc3Nvci5ieXRlTGVuZ3RoKTtcbiAgICAgIGNvbnN0IHR5cGVkQXJyYXkgPSBhY2Nlc3Nvci5nZXRUeXBlZEFycmF5KCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdWludDE2QXJyYXlbaV0gPSB0eXBlZEFycmF5W2ldO1xuICAgICAgfVxuICAgICAgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHVpbnQxNkFycmF5LmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgc2l6ZSA9IERhdGFVdGlsLmFkZFBhZGRpbmdCeXRlcyh1aW50OEFycmF5LmJ5dGVMZW5ndGgsIDQpO1xuICAgIGNvbnN0IGluZGV4QnVmZmVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICBzaXplOiBzaXplLFxuICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLklOREVYLFxuICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIG5ldyBVaW50OEFycmF5KGluZGV4QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldCh1aW50OEFycmF5KTtcbiAgICBpbmRleEJ1ZmZlci51bm1hcCgpO1xuXG4gICAgY29uc3QgYnVmZmVySGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UoaW5kZXhCdWZmZXIpO1xuXG4gICAgcmV0dXJuIGJ1ZmZlckhhbmRsZTtcbiAgfVxuXG4gIHVwZGF0ZVZlcnRleEJ1ZmZlcihhY2Nlc3NvcjogQWNjZXNzb3IsIHJlc291cmNlSGFuZGxlOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IHZlcnRleEJ1ZmZlciA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KHJlc291cmNlSGFuZGxlKSBhcyBHUFVCdWZmZXI7XG4gICAgaWYgKElzLm5vdC5leGlzdCh2ZXJ0ZXhCdWZmZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBmb3VuZCBWQk8uJyk7XG4gICAgfVxuXG4gICAgdmVydGV4QnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuV1JJVEUpLnRoZW4oKCkgPT4ge1xuICAgICAgbmV3IFVpbnQ4QXJyYXkodmVydGV4QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldChhY2Nlc3Nvci5idWZmZXJWaWV3LmdldFVpbnQ4QXJyYXkoKSk7XG4gICAgICB2ZXJ0ZXhCdWZmZXIudW5tYXAoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUluZGV4QnVmZmVyKGFjY2Vzc29yOiBBY2Nlc3NvciwgcmVzb3VyY2VIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlKSB7XG4gICAgY29uc3QgaW5kZXhCdWZmZXIgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChyZXNvdXJjZUhhbmRsZSkgYXMgR1BVQnVmZmVyO1xuICAgIGlmIChJcy5ub3QuZXhpc3QoaW5kZXhCdWZmZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBmb3VuZCBJQk8uJyk7XG4gICAgfVxuXG4gICAgaW5kZXhCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5XUklURSkudGhlbigoKSA9PiB7XG4gICAgICBsZXQgdWludDhBcnJheSA9IGFjY2Vzc29yLmdldFVpbnQ4QXJyYXkoKTtcbiAgICAgIGlmIChhY2Nlc3Nvci5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLlVuc2lnbmVkQnl0ZSkge1xuICAgICAgICAvLyBXZWJHUFUgZG9lcyBub3Qgc3VwcG9ydCB1aW50OCBmb3IgaW5kZXggYnVmZmVyLlxuICAgICAgICAvLyBTbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdWludDggdG8gdWludDE2LlxuICAgICAgICBjb25zdCB1aW50MTZBcnJheSA9IG5ldyBVaW50MTZBcnJheShhY2Nlc3Nvci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IGFjY2Vzc29yLmdldFR5cGVkQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdWludDE2QXJyYXlbaV0gPSB0eXBlZEFycmF5W2ldO1xuICAgICAgICB9XG4gICAgICAgIHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSh1aW50MTZBcnJheS5idWZmZXIpO1xuICAgICAgfVxuICAgICAgbmV3IFVpbnQ4QXJyYXkoaW5kZXhCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KHVpbnQ4QXJyYXkpO1xuICAgICAgaW5kZXhCdWZmZXIudW5tYXAoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZVZlcnRleEJ1ZmZlcihyZXNvdXJjZUhhbmRsZTogV2ViR1BVUmVzb3VyY2VIYW5kbGUpIHtcbiAgICBjb25zdCB2ZXJ0ZXhCdWZmZXIgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChyZXNvdXJjZUhhbmRsZSkgYXMgR1BVQnVmZmVyO1xuICAgIGlmIChJcy5ub3QuZXhpc3QodmVydGV4QnVmZmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgZm91bmQgVkJPLicpO1xuICAgIH1cblxuICAgIHZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fX3dlYkdwdVJlc291cmNlcy5kZWxldGUocmVzb3VyY2VIYW5kbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIFZlcnRleEJ1ZmZlciBhbmQgSW5kZXhCdWZmZXJcbiAgICogQHBhcmFtIHByaW1pdGl2ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgY3JlYXRlVmVydGV4QnVmZmVyQW5kSW5kZXhCdWZmZXIocHJpbWl0aXZlOiBQcmltaXRpdmUpOiBWZXJ0ZXhIYW5kbGVzIHtcbiAgICBsZXQgaWJvSGFuZGxlO1xuICAgIGlmIChwcmltaXRpdmUuaGFzSW5kaWNlcygpKSB7XG4gICAgICBpYm9IYW5kbGUgPSB0aGlzLmNyZWF0ZUluZGV4QnVmZmVyKHByaW1pdGl2ZS5pbmRpY2VzQWNjZXNzb3IhKTtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzRmxhZ3M6IGJvb2xlYW5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVmVydGV4QXR0cmlidXRlLkF0dHJpYnV0ZVR5cGVOdW1iZXI7IGkrKykge1xuICAgICAgYXR0cmlidXRlc0ZsYWdzW2ldID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZib0hhbmRsZXM6IEFycmF5PFdlYkdMUmVzb3VyY2VIYW5kbGU+ID0gW107XG4gICAgcHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29ycy5mb3JFYWNoKChhY2Nlc3NvcjogQWNjZXNzb3IsIGk6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgdmJvSGFuZGxlID0gdGhpcy5jcmVhdGVWZXJ0ZXhCdWZmZXIoYWNjZXNzb3IpO1xuICAgICAgY29uc3Qgc2xvdElkeCA9IFZlcnRleEF0dHJpYnV0ZS50b0F0dHJpYnV0ZVNsb3RGcm9tSm9pbmVkU3RyaW5nKFxuICAgICAgICBwcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzW2ldXG4gICAgICApO1xuICAgICAgYXR0cmlidXRlc0ZsYWdzW3Nsb3RJZHhdID0gdHJ1ZTtcbiAgICAgIHZib0hhbmRsZXMucHVzaCh2Ym9IYW5kbGUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhb0hhbmRsZTogLTEsXG4gICAgICBpYm9IYW5kbGU6IGlib0hhbmRsZSxcbiAgICAgIHZib0hhbmRsZXM6IHZib0hhbmRsZXMsXG4gICAgICBhdHRyaWJ1dGVzRmxhZ3M6IGF0dHJpYnV0ZXNGbGFncyxcbiAgICAgIHNldENvbXBsZXRlOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSB0aGUgVmVydGV4QnVmZmVyIGFuZCBJbmRleEJ1ZmZlclxuICAgKiBAcGFyYW0gcHJpbWl0aXZlXG4gICAqIEBwYXJhbSB2ZXJ0ZXhIYW5kbGVzXG4gICAqL1xuICB1cGRhdGVWZXJ0ZXhCdWZmZXJBbmRJbmRleEJ1ZmZlcihwcmltaXRpdmU6IFByaW1pdGl2ZSwgdmVydGV4SGFuZGxlczogVmVydGV4SGFuZGxlcykge1xuICAgIGlmICh2ZXJ0ZXhIYW5kbGVzLmlib0hhbmRsZSkge1xuICAgICAgdGhpcy51cGRhdGVJbmRleEJ1ZmZlcihwcmltaXRpdmUuaW5kaWNlc0FjY2Vzc29yIGFzIEFjY2Vzc29yLCB2ZXJ0ZXhIYW5kbGVzLmlib0hhbmRsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlQWNjZXNzb3JzID0gcHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZUFjY2Vzc29ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51cGRhdGVWZXJ0ZXhCdWZmZXIoYXR0cmlidXRlQWNjZXNzb3JzW2ldLCB2ZXJ0ZXhIYW5kbGVzLnZib0hhbmRsZXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVZlcnRleERhdGFSZXNvdXJjZXModmVydGV4SGFuZGxlczogVmVydGV4SGFuZGxlcykge1xuICAgIGlmIChJcy5leGlzdCh2ZXJ0ZXhIYW5kbGVzLmlib0hhbmRsZSkpIHtcbiAgICAgIGNvbnN0IGluZGV4QnVmZmVyID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQodmVydGV4SGFuZGxlcy5pYm9IYW5kbGUpIGFzIEdQVUJ1ZmZlcjtcbiAgICAgIGlmIChJcy5leGlzdChpbmRleEJ1ZmZlcikpIHtcbiAgICAgICAgaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmJvSGFuZGxlIG9mIHZlcnRleEhhbmRsZXMudmJvSGFuZGxlcykge1xuICAgICAgY29uc3QgdmVydGV4QnVmZmVyID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQodmJvSGFuZGxlKSBhcyBHUFVCdWZmZXI7XG4gICAgICBpZiAoSXMuZXhpc3QodmVydGV4QnVmZmVyKSkge1xuICAgICAgICB2ZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIFZlcnRleERhdGEgdG8gdGhlIFBpcGVsaW5lXG4gICAqL1xuICBzZXRWZXJ0ZXhEYXRhVG9QaXBlbGluZShcbiAgICB7XG4gICAgICB2YW9IYW5kbGUsXG4gICAgICBpYm9IYW5kbGUsXG4gICAgICB2Ym9IYW5kbGVzLFxuICAgIH06IHtcbiAgICAgIHZhb0hhbmRsZTogV2ViR1BVUmVzb3VyY2VIYW5kbGU7XG4gICAgICBpYm9IYW5kbGU/OiBXZWJHUFVSZXNvdXJjZUhhbmRsZTtcbiAgICAgIHZib0hhbmRsZXM6IEFycmF5PFdlYkdQVVJlc291cmNlSGFuZGxlPjtcbiAgICB9LFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIGluc3RhbmNlSURCdWZmZXJVaWQ6IFdlYkdQVVJlc291cmNlSGFuZGxlID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuSW52YWxpZENHQVBJUmVzb3VyY2VVaWRcbiAgKSB7XG4gICAgY29uc3QgYnVmZmVyczogR1BVVmVydGV4QnVmZmVyTGF5b3V0W10gPSBbXTtcblxuICAgIC8vIFZlcnRleCBCdWZmZXIgU2V0dGluZ3NcbiAgICAvLy8gRWFjaCB2ZXJ0ZXggYXR0cmlidXRlc1xuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IEdQVVZlcnRleEF0dHJpYnV0ZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Ym9IYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzaGFkZXJMb2NhdGlvbiA9IFZlcnRleEF0dHJpYnV0ZS50b0F0dHJpYnV0ZVNsb3RGcm9tSm9pbmVkU3RyaW5nKFxuICAgICAgICBwcmltaXRpdmUuYXR0cmlidXRlU2VtYW50aWNzW2ldXG4gICAgICApO1xuXG4gICAgICBjb25zdCBncHVWZXJ0ZXhGb3JtYXQgPSAocHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29yc1tpXS5jb21wb25lbnRUeXBlLndlYmdwdSArXG4gICAgICAgIHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnNbaV0uY29tcG9zaXRpb25UeXBlLndlYmdwdSkgYXMgR1BVVmVydGV4Rm9ybWF0O1xuICAgICAgYXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgc2hhZGVyTG9jYXRpb24sXG4gICAgICAgIG9mZnNldDogcHJpbWl0aXZlLmF0dHJpYnV0ZUFjY2Vzc29yc1tpXS5ieXRlT2Zmc2V0SW5CdWZmZXJWaWV3LFxuICAgICAgICBmb3JtYXQ6IGdwdVZlcnRleEZvcm1hdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBidWZmZXJzWzBdID0ge1xuICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGFycmF5U3RyaWRlOiBwcmltaXRpdmUuYXR0cmlidXRlQWNjZXNzb3JzWzBdLmJ5dGVTdHJpZGUsXG4gICAgfTtcblxuICAgIC8vLyBJbnN0YW5jZSBCdWZmZXJcbiAgICBjb25zdCBpbnN0YW5jZUlEQnVmZmVyID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoaW5zdGFuY2VJREJ1ZmZlclVpZCkgYXMgR1BVQnVmZmVyO1xuICAgIGJ1ZmZlcnNbMV0gPSB7XG4gICAgICBzdGVwTW9kZTogJ2luc3RhbmNlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiBWZXJ0ZXhBdHRyaWJ1dGUuSW5zdGFuY2UuZ2V0QXR0cmlidXRlU2xvdCgpLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDMyeDQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFycmF5U3RyaWRlOiA0ICogNCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NoZWNrU2hhZGVyQ29tcGlsZVN0YXR1cyhcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgc2hhZGVyVGV4dDogc3RyaW5nLFxuICAgIGluZm86IEdQVUNvbXBpbGF0aW9uSW5mb1xuICApOiBib29sZWFuIHtcbiAgICBMb2dnZXIuaW5mbygnTWF0ZXJpYWxUeXBlTmFtZTogJyArIG1hdGVyaWFsVHlwZU5hbWUpO1xuICAgIGNvbnN0IGxpbmVOdW1iZXJlZFNoYWRlclRleHQgPSBNaXNjVXRpbC5hZGRMaW5lTnVtYmVyVG9Db2RlKHNoYWRlclRleHQpO1xuICAgIExvZ2dlci5pbmZvKGxpbmVOdW1iZXJlZFNoYWRlclRleHQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5mby5tZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgTG9nZ2VyLmluZm8oaW5mby5tZXNzYWdlc1tpXS5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBzaGFkZXIgcHJvZ3JhbVxuICAgKiBAcGFyYW0gcGFyYW0wXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVTaGFkZXJQcm9ncmFtKHtcbiAgICBtYXRlcmlhbCxcbiAgICB2ZXJ0ZXhTaGFkZXJTdHIsXG4gICAgZnJhZ21lbnRTaGFkZXJTdHIsXG4gICAgYXR0cmlidXRlTmFtZXMsXG4gICAgYXR0cmlidXRlU2VtYW50aWNzLFxuICAgIG9uRXJyb3IsXG4gIH06IHtcbiAgICBtYXRlcmlhbDogTWF0ZXJpYWw7XG4gICAgdmVydGV4U2hhZGVyU3RyOiBzdHJpbmc7XG4gICAgZnJhZ21lbnRTaGFkZXJTdHI6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVOYW1lczogQXR0cmlidXRlTmFtZXM7XG4gICAgYXR0cmlidXRlU2VtYW50aWNzOiBWZXJ0ZXhBdHRyaWJ1dGVFbnVtW107XG4gICAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIH0pIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHZzTW9kdWxlID0gZ3B1RGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7XG4gICAgICBjb2RlOiB2ZXJ0ZXhTaGFkZXJTdHIsXG4gICAgfSk7XG4gICAgaWYgKENvbmZpZy5jZ0FwaURlYnVnQ29uc29sZU91dHB1dCkge1xuICAgICAgdnNNb2R1bGUuZ2V0Q29tcGlsYXRpb25JbmZvKCkudGhlbigoaW5mbykgPT4ge1xuICAgICAgICBpZiAoaW5mby5tZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fX2NoZWNrU2hhZGVyQ29tcGlsZVN0YXR1cyhtYXRlcmlhbC5tYXRlcmlhbFR5cGVOYW1lLCB2ZXJ0ZXhTaGFkZXJTdHIsIGluZm8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZnNNb2R1bGUgPSBncHVEZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgIGNvZGU6IGZyYWdtZW50U2hhZGVyU3RyLFxuICAgIH0pO1xuICAgIGlmIChDb25maWcuY2dBcGlEZWJ1Z0NvbnNvbGVPdXRwdXQpIHtcbiAgICAgIGZzTW9kdWxlLmdldENvbXBpbGF0aW9uSW5mbygpLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgaWYgKGluZm8ubWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX19jaGVja1NoYWRlckNvbXBpbGVTdGF0dXMobWF0ZXJpYWwubWF0ZXJpYWxUeXBlTmFtZSwgZnJhZ21lbnRTaGFkZXJTdHIsIGluZm8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGVzID0ge1xuICAgICAgdnNNb2R1bGUsXG4gICAgICBmc01vZHVsZSxcbiAgICB9O1xuICAgIGNvbnN0IG1vZHVsZXNIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZShtb2R1bGVzKTtcblxuICAgIHJldHVybiBtb2R1bGVzSGFuZGxlO1xuICB9XG5cbiAgY2xlYXJGcmFtZUJ1ZmZlcihyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gICAgaWYgKHJlbmRlclBhc3MuZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCB3aGVuIHRoZSByZW5kZXJQYXNzIGhhcyBubyBlbnRpdGllcy5cbiAgICAvLyBJZiB0aGUgcmVuZGVyUGFzcyBoYXMgZW50aXRpZXMsIHRoZSBjbGVhciBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgaW4gdGhlIGNyZWF0ZVJlbmRlclBhc3NFbmNvZGVyIG1ldGhvZC5cblxuICAgIGlmICghcmVuZGVyUGFzcy50b0NsZWFyQ29sb3JCdWZmZXIgJiYgIXJlbmRlclBhc3MudG9DbGVhckRlcHRoQnVmZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmNvbnRleHQ7XG4gICAgY29uc3QgY29sb3JBdHRhY2htZW50czogR1BVUmVuZGVyUGFzc0NvbG9yQXR0YWNobWVudFtdID0gW107XG4gICAgbGV0IGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ6IEdQVVJlbmRlclBhc3NEZXB0aFN0ZW5jaWxBdHRhY2htZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlcikge1xuICAgICAgY29uc3QgZnJhbWVidWZmZXIgPSByZW5kZXJQYXNzLmdldEZyYW1lYnVmZmVyKCk7XG4gICAgICBpZiAoZnJhbWVidWZmZXIgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBjb2xvckF0dGFjaG1lbnQgb2YgZnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50cykge1xuICAgICAgICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgICAgICBjb2xvckF0dGFjaG1lbnQuX3RleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXRSZXNvdXJjZVVpZFxuICAgICAgICAgICkgYXMgR1BVVGV4dHVyZVZpZXc7XG4gICAgICAgICAgY29sb3JBdHRhY2htZW50cy5wdXNoKHtcbiAgICAgICAgICAgIHZpZXc6IHRleHR1cmVWaWV3LFxuICAgICAgICAgICAgY2xlYXJWYWx1ZToge1xuICAgICAgICAgICAgICByOiByZW5kZXJQYXNzLmNsZWFyQ29sb3IueCxcbiAgICAgICAgICAgICAgZzogcmVuZGVyUGFzcy5jbGVhckNvbG9yLnksXG4gICAgICAgICAgICAgIGI6IHJlbmRlclBhc3MuY2xlYXJDb2xvci56LFxuICAgICAgICAgICAgICBhOiByZW5kZXJQYXNzLmNsZWFyQ29sb3IudyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2FkT3A6ICdjbGVhcicsXG4gICAgICAgICAgICBzdG9yZU9wOiAnc3RvcmUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fX2NvbnRleHRDdXJyZW50VGV4dHVyZVZpZXcgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX19jb250ZXh0Q3VycmVudFRleHR1cmVWaWV3ID0gY29udGV4dC5nZXRDdXJyZW50VGV4dHVyZSgpLmNyZWF0ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb2xvckF0dGFjaG1lbnRzLnB1c2goe1xuICAgICAgICAgIHZpZXc6IHRoaXMuX19jb250ZXh0Q3VycmVudFRleHR1cmVWaWV3LFxuICAgICAgICAgIGNsZWFyVmFsdWU6IHtcbiAgICAgICAgICAgIHI6IHJlbmRlclBhc3MuY2xlYXJDb2xvci54LFxuICAgICAgICAgICAgZzogcmVuZGVyUGFzcy5jbGVhckNvbG9yLnksXG4gICAgICAgICAgICBiOiByZW5kZXJQYXNzLmNsZWFyQ29sb3IueixcbiAgICAgICAgICAgIGE6IHJlbmRlclBhc3MuY2xlYXJDb2xvci53LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbG9hZE9wOiAnY2xlYXInLFxuICAgICAgICAgIHN0b3JlT3A6ICdzdG9yZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVuZGVyUGFzcy50b0NsZWFyRGVwdGhCdWZmZXIpIHtcbiAgICAgIGNvbnN0IGZyYW1lYnVmZmVyID0gcmVuZGVyUGFzcy5nZXRGcmFtZWJ1ZmZlcigpO1xuICAgICAgaWYgKGZyYW1lYnVmZmVyICE9IG51bGwgJiYgZnJhbWVidWZmZXIuZGVwdGhBdHRhY2htZW50ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGVwdGhUZXh0dXJlVmlldyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgIGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudC5fdGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldFJlc291cmNlVWlkXG4gICAgICAgICkgYXMgR1BVVGV4dHVyZVZpZXc7XG4gICAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSB7XG4gICAgICAgICAgdmlldzogZGVwdGhUZXh0dXJlVmlldyxcbiAgICAgICAgICBkZXB0aENsZWFyVmFsdWU6IHJlbmRlclBhc3MuY2xlYXJEZXB0aCxcbiAgICAgICAgICBkZXB0aExvYWRPcDogJ2NsZWFyJyxcbiAgICAgICAgICBkZXB0aFN0b3JlT3A6ICdzdG9yZScsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0ge1xuICAgICAgICAgIHZpZXc6IHRoaXMuX19zeXN0ZW1EZXB0aFRleHR1cmVWaWV3ISxcbiAgICAgICAgICBkZXB0aENsZWFyVmFsdWU6IHJlbmRlclBhc3MuY2xlYXJEZXB0aCxcbiAgICAgICAgICBkZXB0aExvYWRPcDogJ2NsZWFyJyxcbiAgICAgICAgICBkZXB0aFN0b3JlT3A6ICdzdG9yZScsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVuZGVyUGFzc0Rlc2NyaXB0b3I6IEdQVVJlbmRlclBhc3NEZXNjcmlwdG9yID0ge1xuICAgICAgY29sb3JBdHRhY2htZW50czogY29sb3JBdHRhY2htZW50cyxcbiAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ6IGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQsXG4gICAgICBsYWJlbDogcmVuZGVyUGFzcy51bmlxdWVOYW1lLFxuICAgIH07XG4gICAgY29uc3QgcGFzc0VuY29kZXIgPSB0aGlzLl9fY29tbWFuZEVuY29kZXIhLmJlZ2luUmVuZGVyUGFzcyhyZW5kZXJQYXNzRGVzY3JpcHRvcik7XG4gICAgcGFzc0VuY29kZXIuZW5kKCk7XG4gIH1cblxuICBkcmF3KFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIGNhbWVyYUlkOiBudW1iZXIsXG4gICAgaXNPcGFxdWU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgaXNCdWZmZXJMZXNzUmVuZGVyaW5nID0gcmVuZGVyUGFzcy5pc0J1ZmZlckxlc3NSZW5kZXJpbmdNb2RlKCk7XG4gICAgY29uc3QgVmVydGV4SGFuZGxlcyA9IHByaW1pdGl2ZS5fdmVydGV4SGFuZGxlcztcbiAgICBpZiAoIWlzQnVmZmVyTGVzc1JlbmRlcmluZyAmJiBWZXJ0ZXhIYW5kbGVzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWVzaFJlbmRlcmVyQ29tcG9uZW50U2lkID0gLTE7XG4gICAgbGV0IG1lc2hSZW5kZXJlckNvbXBvbmVudFVwZGF0ZUNvdW50ID0gLTE7XG4gICAgbGV0IGRpZmZ1c2VDdWJlTWFwOiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzcGVjdWxhckN1YmVNYXA6IEN1YmVUZXh0dXJlIHwgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFpc0J1ZmZlckxlc3NSZW5kZXJpbmcpIHtcbiAgICAgIGNvbnN0IG1lc2ggPSBwcmltaXRpdmUubWVzaCBhcyBNZXNoO1xuICAgICAgY29uc3QgZW50aXR5ID0gbWVzaC5tZXNoRW50aXRpZXNJbm5lclswXTsgLy8gZ2V0IGJhc2UgbWVzaCBmb3IgaW5zdGFuY2luZyBkcmF3XG4gICAgICBjb25zdCBtZXNoUmVuZGVyZXJDb21wb25lbnQgPSBlbnRpdHkuZ2V0TWVzaFJlbmRlcmVyKCkhO1xuXG4gICAgICBtYXRlcmlhbC5fc2V0SW50ZXJuYWxTZXR0aW5nUGFyYW1ldGVyc1RvR3B1V2ViR3B1KHtcbiAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgY2FtZXJhQ29tcG9uZW50U2lkOiBjYW1lcmFJZCxcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgc3BlY3VsYXJDdWJlOiBtZXNoUmVuZGVyZXJDb21wb25lbnQuc3BlY3VsYXJDdWJlTWFwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBtZXNoUmVuZGVyZXJDb21wb25lbnRTaWQgPSBtZXNoUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50U0lEO1xuICAgICAgbWVzaFJlbmRlcmVyQ29tcG9uZW50VXBkYXRlQ291bnQgPSBtZXNoUmVuZGVyZXJDb21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgICBkaWZmdXNlQ3ViZU1hcCA9IG1lc2hSZW5kZXJlckNvbXBvbmVudC5kaWZmdXNlQ3ViZU1hcDtcbiAgICAgIHNwZWN1bGFyQ3ViZU1hcCA9IG1lc2hSZW5kZXJlckNvbXBvbmVudC5zcGVjdWxhckN1YmVNYXA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVuZGVyUGlwZWxpbmVJZCA9IGAke3ByaW1pdGl2ZS5fZ2V0RmluZ2VyUHJpbnQoKX0gJHttYXRlcmlhbC5tYXRlcmlhbFVJRH0gJHtcbiAgICAgIHJlbmRlclBhc3MucmVuZGVyUGFzc1VJRFxuICAgIH0gJHttZXNoUmVuZGVyZXJDb21wb25lbnRTaWR9ICR7bWVzaFJlbmRlcmVyQ29tcG9uZW50VXBkYXRlQ291bnR9ICR7Y2FtZXJhSWR9LCAke2lzT3BhcXVlfSBgO1xuXG4gICAgY29uc3QgW3BpcGVsaW5lLCByZWNyZWF0ZWRdID0gdGhpcy5nZXRPckNyZWF0ZVJlbmRlclBpcGVsaW5lKFxuICAgICAgcmVuZGVyUGlwZWxpbmVJZCxcbiAgICAgIHByaW1pdGl2ZSxcbiAgICAgIG1hdGVyaWFsLFxuICAgICAgcmVuZGVyUGFzcyxcbiAgICAgIGNhbWVyYUlkLFxuICAgICAgaXNPcGFxdWUsXG4gICAgICBkaWZmdXNlQ3ViZU1hcCxcbiAgICAgIHNwZWN1bGFyQ3ViZU1hcFxuICAgICk7XG5cbiAgICB0aGlzLmNyZWF0ZVJlbmRlckJ1bmRsZUVuY29kZXIocmVuZGVyUGFzcyk7XG5cbiAgICBjb25zdCByZW5kZXJCdW5kbGVFbmNvZGVyID0gdGhpcy5fX3JlbmRlckJ1bmRsZUVuY29kZXIhO1xuICAgIHJlbmRlckJ1bmRsZUVuY29kZXIuc2V0QmluZEdyb3VwKDAsIHRoaXMuX19iaW5kR3JvdXBTdG9yYWdlQnVmZmVyISk7XG4gICAgcmVuZGVyQnVuZGxlRW5jb2Rlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XG4gICAgcmVuZGVyQnVuZGxlRW5jb2Rlci5zZXRCaW5kR3JvdXAoMSwgdGhpcy5fX2JpbmRHcm91cFRleHR1cmVNYXAuZ2V0KHJlbmRlclBpcGVsaW5lSWQpISk7XG4gICAgcmVuZGVyQnVuZGxlRW5jb2Rlci5zZXRCaW5kR3JvdXAoMiwgdGhpcy5fX2JpbmRHcm91cFNhbXBsZXJNYXAuZ2V0KHJlbmRlclBpcGVsaW5lSWQpISk7XG5cbiAgICBpZiAoaXNCdWZmZXJMZXNzUmVuZGVyaW5nKSB7XG4gICAgICByZW5kZXJCdW5kbGVFbmNvZGVyLmRyYXcocmVuZGVyUGFzcy5fZHJhd1ZlcnRleE51bWJlckZvckJ1ZmZlckxlc3NSZW5kZXJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXNoID0gcHJpbWl0aXZlLm1lc2ggYXMgTWVzaDtcbiAgICAgIGNvbnN0IHZhcmlhdGlvblZCTyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KG1lc2guX3ZhcmlhdGlvblZCT1VpZCkgYXMgR1BVQnVmZmVyO1xuICAgICAgcmVuZGVyQnVuZGxlRW5jb2Rlci5zZXRWZXJ0ZXhCdWZmZXIoMCwgdmFyaWF0aW9uVkJPKTtcbiAgICAgIFZlcnRleEhhbmRsZXMhLnZib0hhbmRsZXMuZm9yRWFjaCgodmJvSGFuZGxlLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHZlcnRleEJ1ZmZlciA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KHZib0hhbmRsZSkgYXMgR1BVQnVmZmVyO1xuICAgICAgICByZW5kZXJCdW5kbGVFbmNvZGVyLnNldFZlcnRleEJ1ZmZlcihpICsgMSwgdmVydGV4QnVmZmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJpbWl0aXZlLmhhc0luZGljZXMoKSkge1xuICAgICAgICBjb25zdCBpbmRpY2VzQnVmZmVyID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoVmVydGV4SGFuZGxlcyEuaWJvSGFuZGxlISkgYXMgR1BVQnVmZmVyO1xuICAgICAgICBjb25zdCBpbmRleEJpdFNpemUgPSBwcmltaXRpdmUuZ2V0SW5kZXhCaXRTaXplKCk7XG4gICAgICAgIHJlbmRlckJ1bmRsZUVuY29kZXIuc2V0SW5kZXhCdWZmZXIoaW5kaWNlc0J1ZmZlciwgaW5kZXhCaXRTaXplKTtcbiAgICAgICAgY29uc3QgaW5kaWNlc0FjY2Vzc29yID0gcHJpbWl0aXZlLmluZGljZXNBY2Nlc3NvciE7XG4gICAgICAgIHJlbmRlckJ1bmRsZUVuY29kZXIuZHJhd0luZGV4ZWQoXG4gICAgICAgICAgaW5kaWNlc0FjY2Vzc29yLmVsZW1lbnRDb3VudCxcbiAgICAgICAgICBtZXNoLm1lc2hFbnRpdGllc0lubmVyLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmVydGV4Q291bnQgPSBwcmltaXRpdmUuYXR0cmlidXRlQWNjZXNzb3JzWzBdLmVsZW1lbnRDb3VudDtcbiAgICAgICAgcmVuZGVyQnVuZGxlRW5jb2Rlci5kcmF3KHZlcnRleENvdW50LCBtZXNoLm1lc2hFbnRpdGllc0lubmVyLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVSZW5kZXJQYXNzRW5jb2RlcihyZW5kZXJQYXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVuZGVyQnVuZGxlRW5jb2RlcihyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gICAgaWYgKHRoaXMuX19yZW5kZXJCdW5kbGVFbmNvZGVyID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgICBjb25zdCBmcmFtZWJ1ZmZlciA9IHJlbmRlclBhc3MuZ2V0RnJhbWVidWZmZXIoKTtcbiAgICAgIGxldCBjb2xvckZvcm1hdHMgPSBbbmF2aWdhdG9yLmdwdS5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKV07XG4gICAgICBsZXQgZGVwdGhTdGVuY2lsRm9ybWF0OiBHUFVUZXh0dXJlRm9ybWF0IHwgdW5kZWZpbmVkID0gdGhpcy5fX3N5c3RlbURlcHRoVGV4dHVyZSEuZm9ybWF0O1xuICAgICAgaWYgKGZyYW1lYnVmZmVyICE9IG51bGwpIHtcbiAgICAgICAgY29sb3JGb3JtYXRzID0gW107XG4gICAgICAgIGZvciAobGV0IGNvbG9yQXR0YWNobWVudCBvZiBmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgICAgY29sb3JBdHRhY2htZW50Ll90ZXh0dXJlUmVzb3VyY2VVaWRcbiAgICAgICAgICApIGFzIEdQVVRleHR1cmU7XG4gICAgICAgICAgY29sb3JGb3JtYXRzLnB1c2godGV4dHVyZS5mb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGRlcHRoVGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgICAgZnJhbWVidWZmZXIuZGVwdGhBdHRhY2htZW50Ll90ZXh0dXJlUmVzb3VyY2VVaWRcbiAgICAgICAgICApIGFzIEdQVVRleHR1cmU7XG4gICAgICAgICAgZGVwdGhTdGVuY2lsRm9ybWF0ID0gZGVwdGhUZXh0dXJlLmZvcm1hdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aFN0ZW5jaWxGb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbmRlckJ1bmRsZURlc2NyaXB0b3I6IEdQVVJlbmRlckJ1bmRsZUVuY29kZXJEZXNjcmlwdG9yID0ge1xuICAgICAgICBjb2xvckZvcm1hdHM6IGNvbG9yRm9ybWF0cyxcbiAgICAgICAgZGVwdGhTdGVuY2lsRm9ybWF0OiBkZXB0aFN0ZW5jaWxGb3JtYXQsXG4gICAgICAgIHNhbXBsZUNvdW50OlxuICAgICAgICAgIHJlbmRlclBhc3MuZ2V0UmVzb2x2ZUZyYW1lYnVmZmVyKCkgIT0gbnVsbFxuICAgICAgICAgICAgPyAocmVuZGVyUGFzcy5nZXRGcmFtZWJ1ZmZlcigpIS5jb2xvckF0dGFjaG1lbnRzWzBdIGFzIFJlbmRlckJ1ZmZlcikuc2FtcGxlQ291bnRcbiAgICAgICAgICAgIDogMSxcbiAgICAgIH07XG4gICAgICBjb25zdCBlbmNvZGVyID0gZ3B1RGV2aWNlLmNyZWF0ZVJlbmRlckJ1bmRsZUVuY29kZXIocmVuZGVyQnVuZGxlRGVzY3JpcHRvcik7XG4gICAgICB0aGlzLl9fcmVuZGVyQnVuZGxlRW5jb2RlciA9IGVuY29kZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZW5kZXJQYXNzRW5jb2RlcihyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gICAgaWYgKHRoaXMuX19yZW5kZXJQYXNzRW5jb2RlciA9PSBudWxsKSB7XG4gICAgICBjb25zdCBmcmFtZWJ1ZmZlciA9IHJlbmRlclBhc3MuZ2V0RnJhbWVidWZmZXIoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVGcmFtZWJ1ZmZlciA9IHJlbmRlclBhc3MuZ2V0UmVzb2x2ZUZyYW1lYnVmZmVyKCk7XG5cbiAgICAgIGNvbnN0IGNsZWFyVmFsdWUgPSByZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlclxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHI6IHJlbmRlclBhc3MuY2xlYXJDb2xvci54LFxuICAgICAgICAgICAgZzogcmVuZGVyUGFzcy5jbGVhckNvbG9yLnksXG4gICAgICAgICAgICBiOiByZW5kZXJQYXNzLmNsZWFyQ29sb3IueixcbiAgICAgICAgICAgIGE6IHJlbmRlclBhc3MuY2xlYXJDb2xvci53LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkZXB0aENsZWFyVmFsdWUgPSByZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA/IHJlbmRlclBhc3MuY2xlYXJEZXB0aCA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHJlc29sdmVGcmFtZWJ1ZmZlciAhPSBudWxsICYmIGZyYW1lYnVmZmVyICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGRlcHRoVGV4dHVyZVZpZXcgPSB0aGlzLl9fc3lzdGVtRGVwdGhUZXh0dXJlVmlldyE7XG4gICAgICAgIGlmIChmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGRlcHRoVGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgICAgZnJhbWVidWZmZXIuZGVwdGhBdHRhY2htZW50Ll90ZXh0dXJlUmVzb3VyY2VVaWRcbiAgICAgICAgICApIGFzIEdQVVRleHR1cmU7XG4gICAgICAgICAgaWYgKGRlcHRoVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkZXB0aFRleHR1cmVWaWV3ID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgICAgICAgIGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudC5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZFxuICAgICAgICAgICAgKSBhcyBHUFVUZXh0dXJlVmlldztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVuZGVyUGFzc0Rlc2NyaXB0b3I6IEdQVVJlbmRlclBhc3NEZXNjcmlwdG9yID0ge1xuICAgICAgICAgIGNvbG9yQXR0YWNobWVudHM6IFtdLFxuICAgICAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ6IHtcbiAgICAgICAgICAgIHZpZXc6IGRlcHRoVGV4dHVyZVZpZXcsXG4gICAgICAgICAgICBkZXB0aENsZWFyVmFsdWU6IGRlcHRoQ2xlYXJWYWx1ZSxcbiAgICAgICAgICAgIGRlcHRoTG9hZE9wOiByZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA/ICdjbGVhcicgOiAnbG9hZCcsXG4gICAgICAgICAgICBkZXB0aFN0b3JlT3A6ICdzdG9yZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYWJlbDogcmVuZGVyUGFzcy51bmlxdWVOYW1lLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjb2xvckF0dGFjaG1lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZUZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjb2xvckF0dGFjaG1lbnQgPSBmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzW2ldIGFzIFJlbmRlckJ1ZmZlcjtcbiAgICAgICAgICBjb25zdCByZXNvbHZlQ29sb3JBdHRhY2htZW50ID0gcmVzb2x2ZUZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHNbaV0gYXMgUmVuZGVyQnVmZmVyO1xuICAgICAgICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgICAgICBjb2xvckF0dGFjaG1lbnQuX3RleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXRSZXNvdXJjZVVpZFxuICAgICAgICAgICkgYXMgR1BVVGV4dHVyZVZpZXc7XG4gICAgICAgICAgbGV0IHJlc29sdmVUZXh0dXJlVmlldyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgICAgcmVzb2x2ZUNvbG9yQXR0YWNobWVudC5fdGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldFJlc291cmNlVWlkXG4gICAgICAgICAgKSBhcyBHUFVUZXh0dXJlVmlldztcbiAgICAgICAgICBjb2xvckF0dGFjaG1lbnRzLnB1c2goe1xuICAgICAgICAgICAgdmlldzogdGV4dHVyZVZpZXcsXG4gICAgICAgICAgICByZXNvbHZlVGFyZ2V0OiByZXNvbHZlVGV4dHVyZVZpZXcsXG4gICAgICAgICAgICBjbGVhclZhbHVlOiBjbGVhclZhbHVlLFxuICAgICAgICAgICAgbG9hZE9wOiByZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlciA/ICdjbGVhcicgOiAnbG9hZCcsXG4gICAgICAgICAgICBzdG9yZU9wOiAnc3RvcmUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlclBhc3NEZXNjcmlwdG9yLmNvbG9yQXR0YWNobWVudHMgPSBjb2xvckF0dGFjaG1lbnRzIGFzIEdQVVJlbmRlclBhc3NDb2xvckF0dGFjaG1lbnRbXTtcbiAgICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyID0gdGhpcy5fX2NvbW1hbmRFbmNvZGVyIS5iZWdpblJlbmRlclBhc3MocmVuZGVyUGFzc0Rlc2NyaXB0b3IpO1xuICAgICAgfSBlbHNlIGlmIChmcmFtZWJ1ZmZlciAhPSBudWxsKSB7XG4gICAgICAgIGxldCBkZXB0aFRleHR1cmVWaWV3ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZnJhbWVidWZmZXIuZGVwdGhBdHRhY2htZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBkZXB0aFRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChcbiAgICAgICAgICAgIGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudC5fdGV4dHVyZVJlc291cmNlVWlkXG4gICAgICAgICAgKSBhcyBHUFVUZXh0dXJlO1xuICAgICAgICAgIGlmIChkZXB0aFRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZGVwdGhUZXh0dXJlVmlldyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgICAgICBmcmFtZWJ1ZmZlci5kZXB0aEF0dGFjaG1lbnQuX3RleHR1cmVWaWV3QXNSZW5kZXJUYXJnZXRSZXNvdXJjZVVpZFxuICAgICAgICAgICAgKSBhcyBHUFVUZXh0dXJlVmlldztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ6IEdQVVJlbmRlclBhc3NEZXB0aFN0ZW5jaWxBdHRhY2htZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGVwdGhUZXh0dXJlVmlldyAhPSBudWxsKSB7XG4gICAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IHtcbiAgICAgICAgICAgIHZpZXc6IGRlcHRoVGV4dHVyZVZpZXcsXG4gICAgICAgICAgICBkZXB0aENsZWFyVmFsdWU6IGRlcHRoQ2xlYXJWYWx1ZSxcbiAgICAgICAgICAgIGRlcHRoTG9hZE9wOiByZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA/ICdjbGVhcicgOiAnbG9hZCcsXG4gICAgICAgICAgICBkZXB0aFN0b3JlT3A6ICdzdG9yZScsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW5kZXJQYXNzRGVzY3JpcHRvcjogR1BVUmVuZGVyUGFzc0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgY29sb3JBdHRhY2htZW50czogW10sXG4gICAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudDogZGVwdGhTdGVuY2lsQXR0YWNobWVudCxcbiAgICAgICAgICBsYWJlbDogcmVuZGVyUGFzcy51bmlxdWVOYW1lLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjb2xvckF0dGFjaG1lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGNvbG9yQXR0YWNobWVudCBvZiBmcmFtZWJ1ZmZlci5jb2xvckF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dHVyZVZpZXcgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChcbiAgICAgICAgICAgIGNvbG9yQXR0YWNobWVudC5fdGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldFJlc291cmNlVWlkXG4gICAgICAgICAgKSBhcyBHUFVUZXh0dXJlVmlldztcbiAgICAgICAgICBjb2xvckF0dGFjaG1lbnRzLnB1c2goe1xuICAgICAgICAgICAgdmlldzogdGV4dHVyZVZpZXcsXG4gICAgICAgICAgICBjbGVhclZhbHVlOiBjbGVhclZhbHVlLFxuICAgICAgICAgICAgbG9hZE9wOiByZW5kZXJQYXNzLnRvQ2xlYXJDb2xvckJ1ZmZlciA/ICdjbGVhcicgOiAnbG9hZCcsXG4gICAgICAgICAgICBzdG9yZU9wOiAnc3RvcmUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlclBhc3NEZXNjcmlwdG9yLmNvbG9yQXR0YWNobWVudHMgPSBjb2xvckF0dGFjaG1lbnRzIGFzIEdQVVJlbmRlclBhc3NDb2xvckF0dGFjaG1lbnRbXTtcbiAgICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyID0gdGhpcy5fX2NvbW1hbmRFbmNvZGVyIS5iZWdpblJlbmRlclBhc3MocmVuZGVyUGFzc0Rlc2NyaXB0b3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX19jb250ZXh0Q3VycmVudFRleHR1cmVWaWV3ID09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmNvbnRleHQ7XG4gICAgICAgICAgdGhpcy5fX2NvbnRleHRDdXJyZW50VGV4dHVyZVZpZXcgPSBjb250ZXh0LmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRlVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbmRlclBhc3NEZXNjcmlwdG9yOiBHUFVSZW5kZXJQYXNzRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICBjb2xvckF0dGFjaG1lbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZpZXc6IHRoaXMuX19jb250ZXh0Q3VycmVudFRleHR1cmVWaWV3LFxuICAgICAgICAgICAgICBjbGVhclZhbHVlOiBjbGVhclZhbHVlLFxuICAgICAgICAgICAgICBsb2FkT3A6IHJlbmRlclBhc3MudG9DbGVhckNvbG9yQnVmZmVyID8gJ2NsZWFyJyA6ICdsb2FkJyxcbiAgICAgICAgICAgICAgc3RvcmVPcDogJ3N0b3JlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkZXB0aFN0ZW5jaWxBdHRhY2htZW50OiB7XG4gICAgICAgICAgICB2aWV3OiB0aGlzLl9fc3lzdGVtRGVwdGhUZXh0dXJlVmlldyEsXG4gICAgICAgICAgICBkZXB0aENsZWFyVmFsdWU6IGRlcHRoQ2xlYXJWYWx1ZSxcbiAgICAgICAgICAgIGRlcHRoTG9hZE9wOiByZW5kZXJQYXNzLnRvQ2xlYXJEZXB0aEJ1ZmZlciA/ICdjbGVhcicgOiAnbG9hZCcsXG4gICAgICAgICAgICBkZXB0aFN0b3JlT3A6ICdzdG9yZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYWJlbDogcmVuZGVyUGFzcy51bmlxdWVOYW1lLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9fcmVuZGVyUGFzc0VuY29kZXIgPSB0aGlzLl9fY29tbWFuZEVuY29kZXIhLmJlZ2luUmVuZGVyUGFzcyhyZW5kZXJQYXNzRGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX3RvQ2xlYXJSZW5kZXJCdW5kbGVzKCkge1xuICAgIGlmIChcbiAgICAgIE1hdGVyaWFsLnN0YXRlVmVyc2lvbiAhPT0gdGhpcy5fX2xhc3RNYXRlcmlhbHNVcGRhdGVDb3VudCB8fFxuICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnQgIT09IHRoaXMuX19sYXN0Q3VycmVudENhbWVyYUNvbXBvbmVudFNpZCB8fFxuICAgICAgRW50aXR5UmVwb3NpdG9yeS51cGRhdGVDb3VudCAhPT0gdGhpcy5fX2xhc3RFbnRpdHlSZXBvc2l0b3J5VXBkYXRlQ291bnQgfHxcbiAgICAgIFByaW1pdGl2ZS52YXJpYW50VXBkYXRlQ291bnQgIT09IHRoaXMuX19sYXN0UHJpbWl0aXZlc01hdGVyaWFsVmFyaWFudFVwZGF0ZUNvdW50IHx8XG4gICAgICBNZXNoUmVuZGVyZXJDb21wb25lbnQudXBkYXRlQ291bnQgIT09IHRoaXMuX19sYXN0TWVzaFJlbmRlcmVyQ29tcG9uZW50c1VwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICB0aGlzLl9fcmVuZGVyQnVuZGxlcy5jbGVhcigpO1xuICAgICAgU3lzdGVtU3RhdGUud2ViZ3B1UmVuZGVyQnVuZGxlTW9kZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fX2xhc3RDdXJyZW50Q2FtZXJhQ29tcG9uZW50U2lkID0gQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnQ7XG4gICAgICB0aGlzLl9fbGFzdE1hdGVyaWFsc1VwZGF0ZUNvdW50ID0gTWF0ZXJpYWwuc3RhdGVWZXJzaW9uO1xuICAgICAgdGhpcy5fX2xhc3RFbnRpdHlSZXBvc2l0b3J5VXBkYXRlQ291bnQgPSBFbnRpdHlSZXBvc2l0b3J5LnVwZGF0ZUNvdW50O1xuICAgICAgdGhpcy5fX2xhc3RQcmltaXRpdmVzTWF0ZXJpYWxWYXJpYW50VXBkYXRlQ291bnQgPSBQcmltaXRpdmUudmFyaWFudFVwZGF0ZUNvdW50O1xuICAgICAgdGhpcy5fX2xhc3RNZXNoUmVuZGVyZXJDb21wb25lbnRzVXBkYXRlQ291bnQgPSBNZXNoUmVuZGVyZXJDb21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZVJlbmRlckJ1bmRsZShyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gICAgdGhpcy5fX3RvQ2xlYXJSZW5kZXJCdW5kbGVzKCk7XG4gICAgaWYgKHJlbmRlclBhc3MuX2lzQ2hhbmdlZFNvcnRSZW5kZXJSZXN1bHQgfHwgIUNvbmZpZy5jYWNoZVdlYkdwdVJlbmRlckJ1bmRsZXMpIHtcbiAgICAgIHRoaXMuX19yZW5kZXJCdW5kbGVzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgbGV0IHJlbmRlckJ1bmRsZSA9IHRoaXMuX19yZW5kZXJCdW5kbGVzLmdldChyZW5kZXJQYXNzLnJlbmRlclBhc3NVSUQpO1xuICAgIGlmIChyZW5kZXJCdW5kbGUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jcmVhdGVSZW5kZXJQYXNzRW5jb2RlcihyZW5kZXJQYXNzKTtcblxuICAgICAgaWYgKHRoaXMuX19yZW5kZXJQYXNzRW5jb2RlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5leGVjdXRlQnVuZGxlcyhbcmVuZGVyQnVuZGxlXSk7XG4gICAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKTtcbiAgICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZpbmlzaFJlbmRlckJ1bmRsZUVuY29kZXIocmVuZGVyUGFzczogUmVuZGVyUGFzcykge1xuICAgIGlmICh0aGlzLl9fcmVuZGVyUGFzc0VuY29kZXIgIT0gbnVsbCAmJiB0aGlzLl9fcmVuZGVyQnVuZGxlRW5jb2RlciAhPSBudWxsKSB7XG4gICAgICBjb25zdCByZW5kZXJCdW5kbGUgPSB0aGlzLl9fcmVuZGVyQnVuZGxlRW5jb2Rlci5maW5pc2goKTtcbiAgICAgIGlmIChDb25maWcuY2FjaGVXZWJHcHVSZW5kZXJCdW5kbGVzKSB7XG4gICAgICAgIHRoaXMuX19yZW5kZXJCdW5kbGVzLnNldChyZW5kZXJQYXNzLnJlbmRlclBhc3NVSUQsIHJlbmRlckJ1bmRsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fcmVuZGVyQnVuZGxlcy5jbGVhcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyLmV4ZWN1dGVCdW5kbGVzKFtyZW5kZXJCdW5kbGVdKTtcbiAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKTtcbiAgICAgIHRoaXMuX19yZW5kZXJCdW5kbGVFbmNvZGVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGdldE9yQ3JlYXRlUmVuZGVyUGlwZWxpbmUoXG4gICAgcmVuZGVyUGlwZWxpbmVJZDogc3RyaW5nLFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIG1hdGVyaWFsOiBNYXRlcmlhbCxcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIGNhbWVyYUlkOiBudW1iZXIsXG4gICAgaXNPcGFxdWU6IGJvb2xlYW4sXG4gICAgZGlmZnVzZUN1YmVNYXA/OiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlLFxuICAgIHNwZWN1bGFyQ3ViZU1hcD86IEN1YmVUZXh0dXJlIHwgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmVcbiAgKTogW0dQVVJlbmRlclBpcGVsaW5lLCBib29sZWFuXSB7XG4gICAgaWYgKHRoaXMuX193ZWJHcHVSZW5kZXJQaXBlbGluZU1hcC5oYXMocmVuZGVyUGlwZWxpbmVJZCkpIHtcbiAgICAgIGNvbnN0IG1hdGVyaWFsU3RhdGVWZXJzaW9uID0gdGhpcy5fX21hdGVyaWFsU3RhdGVWZXJzaW9uTWFwLmdldChyZW5kZXJQaXBlbGluZUlkKTtcbiAgICAgIGlmIChtYXRlcmlhbFN0YXRlVmVyc2lvbiA9PT0gbWF0ZXJpYWwuc3RhdGVWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fX3dlYkdwdVJlbmRlclBpcGVsaW5lTWFwLmdldChyZW5kZXJQaXBlbGluZUlkKSEsIGZhbHNlXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdCB3aWR0aCA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5jYW52YXMud2lkdGg7XG4gICAgLy8gY29uc3QgaGVpZ2h0ID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmNhbnZhcy5oZWlnaHQ7XG4gICAgLy8gY29uc3QgYmFja0J1ZmZlclRleHR1cmVTaXplID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5nZXRWYWx1ZShcbiAgICAvLyAgIFNoYWRlclNlbWFudGljcy5CYWNrQnVmZmVyVGV4dHVyZVNpemUsXG4gICAgLy8gICAwXG4gICAgLy8gKSBhcyBWZWN0b3IyO1xuICAgIC8vIGJhY2tCdWZmZXJUZXh0dXJlU2l6ZS5fdlswXSA9IHdpZHRoO1xuICAgIC8vIGJhY2tCdWZmZXJUZXh0dXJlU2l6ZS5fdlsxXSA9IGhlaWdodDtcblxuICAgIHRoaXMuX193ZWJHcHVSZW5kZXJQaXBlbGluZU1hcC5kZWxldGUocmVuZGVyUGlwZWxpbmVJZCk7XG4gICAgdGhpcy5fX21hdGVyaWFsU3RhdGVWZXJzaW9uTWFwLmRlbGV0ZShyZW5kZXJQaXBlbGluZUlkKTtcbiAgICB0aGlzLl9fYmluZEdyb3VwVGV4dHVyZU1hcC5kZWxldGUocmVuZGVyUGlwZWxpbmVJZCk7XG4gICAgdGhpcy5fX2JpbmRHcm91cExheW91dFRleHR1cmVNYXAuZGVsZXRlKHJlbmRlclBpcGVsaW5lSWQpO1xuICAgIHRoaXMuX19iaW5kR3JvdXBTYW1wbGVyTWFwLmRlbGV0ZShyZW5kZXJQaXBlbGluZUlkKTtcbiAgICB0aGlzLl9fYmluZEdyb3VwTGF5b3V0U2FtcGxlck1hcC5kZWxldGUocmVuZGVyUGlwZWxpbmVJZCk7XG5cbiAgICB0aGlzLl9fY3JlYXRlQmluZEdyb3VwKHJlbmRlclBpcGVsaW5lSWQsIG1hdGVyaWFsLCBkaWZmdXNlQ3ViZU1hcCwgc3BlY3VsYXJDdWJlTWFwKTtcblxuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgcHJlc2VudGF0aW9uRm9ybWF0ID0gbmF2aWdhdG9yLmdwdS5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKTtcblxuICAgIGNvbnN0IG1vZHVsZXMgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChtYXRlcmlhbC5nZXRTaGFkZXJQcm9ncmFtVWlkKHByaW1pdGl2ZSkpIGFzIHtcbiAgICAgIHZzTW9kdWxlOiBHUFVTaGFkZXJNb2R1bGU7XG4gICAgICBmc01vZHVsZTogR1BVU2hhZGVyTW9kdWxlO1xuICAgIH07XG5cbiAgICBpZiAobW9kdWxlcyAhPSBudWxsKSB7XG4gICAgICBuZXcgRXJyb3IoJ1NoYWRlciBNb2R1bGVzIGlzIG5vdCBmb3VuZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGdwdVZlcnRleEJ1ZmZlckxheW91dHM6IEdQVVZlcnRleEJ1ZmZlckxheW91dFtdID0gW107XG4gICAgaWYgKCFyZW5kZXJQYXNzLmlzQnVmZmVyTGVzc1JlbmRlcmluZ01vZGUoKSkge1xuICAgICAgZ3B1VmVydGV4QnVmZmVyTGF5b3V0cy5wdXNoKHtcbiAgICAgICAgc3RlcE1vZGU6ICdpbnN0YW5jZScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogVmVydGV4QXR0cmlidXRlLkluc3RhbmNlLmdldEF0dHJpYnV0ZVNsb3QoKSxcbiAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIGZvcm1hdDogJ2Zsb2F0MzJ4NCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXJyYXlTdHJpZGU6IDQgKiA0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByaW1pdGl2ZS5hdHRyaWJ1dGVBY2Nlc3NvcnMuZm9yRWFjaCgoYWNjZXNzb3I6IEFjY2Vzc29yLCBpOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHNsb3RJZHggPSBWZXJ0ZXhBdHRyaWJ1dGUudG9BdHRyaWJ1dGVTbG90RnJvbUpvaW5lZFN0cmluZyhcbiAgICAgICAgcHJpbWl0aXZlLmF0dHJpYnV0ZVNlbWFudGljc1tpXVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHtcbiAgICAgICAgc2hhZGVyTG9jYXRpb246IHNsb3RJZHgsXG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgZm9ybWF0OiAoYWNjZXNzb3IuY29tcG9uZW50VHlwZS53ZWJncHUgK1xuICAgICAgICAgIGFjY2Vzc29yLmNvbXBvc2l0aW9uVHlwZS53ZWJncHUpIGFzIEdQVVZlcnRleEZvcm1hdCxcbiAgICAgIH07XG4gICAgICBncHVWZXJ0ZXhCdWZmZXJMYXlvdXRzLnB1c2goe1xuICAgICAgICBzdGVwTW9kZTogJ3ZlcnRleCcsXG4gICAgICAgIGFycmF5U3RyaWRlOiBwcmltaXRpdmUuYXR0cmlidXRlQWNjZXNzb3JzW2ldLmFjdHVhbEJ5dGVTdHJpZGUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFthdHRyaWJ1dGVdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwaXBlbGluZUxheW91dCA9IGdwdURldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCh7XG4gICAgICBiaW5kR3JvdXBMYXlvdXRzOiBbXG4gICAgICAgIHRoaXMuX19iaW5kR3JvdXBMYXlvdXRTdG9yYWdlQnVmZmVyISxcbiAgICAgICAgdGhpcy5fX2JpbmRHcm91cExheW91dFRleHR1cmVNYXAuZ2V0KHJlbmRlclBpcGVsaW5lSWQpISxcbiAgICAgICAgdGhpcy5fX2JpbmRHcm91cExheW91dFNhbXBsZXJNYXAuZ2V0KHJlbmRlclBpcGVsaW5lSWQpISxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBsZXQgYmxlbmQ6IEdQVUJsZW5kU3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG1hdGVyaWFsLmlzQmxlbmQoKSkge1xuICAgICAgaWYgKG1hdGVyaWFsLmFscGhhTW9kZSA9PT0gQWxwaGFNb2RlLkJsZW5kKSB7XG4gICAgICAgIGJsZW5kID0ge1xuICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICBzcmNGYWN0b3I6IG1hdGVyaWFsLmJsZW5kRnVuY1NyY0ZhY3Rvci53ZWJncHUgYXMgR1BVQmxlbmRGYWN0b3IsXG4gICAgICAgICAgICBkc3RGYWN0b3I6IG1hdGVyaWFsLmJsZW5kRnVuY0RzdEZhY3Rvci53ZWJncHUgYXMgR1BVQmxlbmRGYWN0b3IsXG4gICAgICAgICAgICBvcGVyYXRpb246IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25Nb2RlLndlYmdwdSBhcyBHUFVCbGVuZE9wZXJhdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFscGhhOiB7XG4gICAgICAgICAgICBzcmNGYWN0b3I6IG1hdGVyaWFsLmJsZW5kRnVuY0FscGhhU3JjRmFjdG9yLndlYmdwdSBhcyBHUFVCbGVuZEZhY3RvcixcbiAgICAgICAgICAgIGRzdEZhY3RvcjogbWF0ZXJpYWwuYmxlbmRGdW5jQWxwaGFEc3RGYWN0b3Iud2ViZ3B1IGFzIEdQVUJsZW5kRmFjdG9yLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uTW9kZUFscGhhLndlYmdwdSBhcyBHUFVCbGVuZE9wZXJhdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGUgPSByZW5kZXJQYXNzLmlzQnVmZmVyTGVzc1JlbmRlcmluZ01vZGUoKVxuICAgICAgPyByZW5kZXJQYXNzLl9wcmltaXRpdmVNb2RlRm9yQnVmZmVyTGVzc1JlbmRlcmluZ1xuICAgICAgOiBwcmltaXRpdmUucHJpbWl0aXZlTW9kZTtcbiAgICBjb25zdCB0b3BvbG9neSA9IG1vZGUuZ2V0V2ViR1BVVHlwZVN0cigpO1xuICAgIGxldCBzdHJpcEluZGV4Rm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgIGlmICh0b3BvbG9neSA9PT0gJ3RyaWFuZ2xlLXN0cmlwJyB8fCB0b3BvbG9neSA9PT0gJ2xpbmUtc3RyaXAnKSB7XG4gICAgICBzdHJpcEluZGV4Rm9ybWF0ID0gcHJpbWl0aXZlLmdldEluZGV4Qml0U2l6ZSgpO1xuICAgIH1cbiAgICBjb25zdCBwcmltaXRpdmVJZHhIYXNNb3JwaCA9IFByaW1pdGl2ZS5nZXRQcmltaXRpdmVJZHhIYXNNb3JwaChwcmltaXRpdmUucHJpbWl0aXZlVWlkKTtcbiAgICBjb25zdCBmcmFtZWJ1ZmZlciA9IHJlbmRlclBhc3MuZ2V0RnJhbWVidWZmZXIoKTtcbiAgICBsZXQgdGFyZ2V0czogR1BVQ29sb3JUYXJnZXRTdGF0ZVtdID0gW1xuICAgICAge1xuICAgICAgICAvLyBAbG9jYXRpb24oMCkgaW4gZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgIGZvcm1hdDogcHJlc2VudGF0aW9uRm9ybWF0LFxuICAgICAgICBibGVuZCxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBsZXQgZGVwdGhTdGVuY2lsRm9ybWF0OiBHUFVUZXh0dXJlRm9ybWF0IHwgdW5kZWZpbmVkID0gJ2RlcHRoMjRwbHVzJyBhcyBHUFVUZXh0dXJlRm9ybWF0O1xuICAgIGlmIChmcmFtZWJ1ZmZlciAhPSBudWxsKSB7XG4gICAgICB0YXJnZXRzID0gW107XG4gICAgICBmb3IgKGxldCBjb2xvckF0dGFjaG1lbnQgb2YgZnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgICAgY29sb3JBdHRhY2htZW50Ll90ZXh0dXJlUmVzb3VyY2VVaWRcbiAgICAgICAgKSBhcyBHUFVUZXh0dXJlO1xuICAgICAgICB0YXJnZXRzLnB1c2goe1xuICAgICAgICAgIGZvcm1hdDogdGV4dHVyZS5mb3JtYXQsXG4gICAgICAgICAgYmxlbmQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoVGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgIGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudC5fdGV4dHVyZVJlc291cmNlVWlkXG4gICAgICAgICkgYXMgR1BVVGV4dHVyZTtcbiAgICAgICAgZGVwdGhTdGVuY2lsRm9ybWF0ID0gZGVwdGhUZXh0dXJlLmZvcm1hdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlcHRoU3RlbmNpbEZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwaXBlbGluZSA9IGdwdURldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7XG4gICAgICBsYXlvdXQ6IHBpcGVsaW5lTGF5b3V0LFxuICAgICAgdmVydGV4OiB7XG4gICAgICAgIG1vZHVsZTogbW9kdWxlcy52c01vZHVsZSxcbiAgICAgICAgZW50cnlQb2ludDogJ21haW4nLFxuICAgICAgICBjb25zdGFudHM6IHtcbiAgICAgICAgICBfbWF0ZXJpYWxTSUQ6IG1hdGVyaWFsLm1hdGVyaWFsU0lELFxuICAgICAgICAgIF9jdXJyZW50UHJpbWl0aXZlSWR4OiBwcmltaXRpdmVJZHhIYXNNb3JwaCA/PyAwLFxuICAgICAgICAgIF9tb3JwaFRhcmdldE51bWJlcjogcHJpbWl0aXZlLnRhcmdldHMubGVuZ3RoLFxuICAgICAgICAgIF9jYW1lcmFTSUQ6IGNhbWVyYUlkLFxuICAgICAgICB9LFxuICAgICAgICBidWZmZXJzOiBncHVWZXJ0ZXhCdWZmZXJMYXlvdXRzLFxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50OiB7XG4gICAgICAgIG1vZHVsZTogbW9kdWxlcy5mc01vZHVsZSxcbiAgICAgICAgZW50cnlQb2ludDogJ21haW4nLFxuICAgICAgICBjb25zdGFudHM6IHtcbiAgICAgICAgICBfbWF0ZXJpYWxTSUQ6IG1hdGVyaWFsLm1hdGVyaWFsU0lELFxuICAgICAgICAgIF9jYW1lcmFTSUQ6IGNhbWVyYUlkLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXRzOiB0YXJnZXRzLFxuICAgICAgfSxcbiAgICAgIHByaW1pdGl2ZToge1xuICAgICAgICB0b3BvbG9neTogdG9wb2xvZ3kgYXMgR1BVUHJpbWl0aXZlVG9wb2xvZ3ksXG4gICAgICAgIHN0cmlwSW5kZXhGb3JtYXQ6IHN0cmlwSW5kZXhGb3JtYXQsXG4gICAgICAgIGZyb250RmFjZTogbWF0ZXJpYWwuY3VsbEZyb250RmFjZUNDVyA/ICdjY3cnIDogJ2N3JyxcbiAgICAgICAgY3VsbE1vZGU6IG1hdGVyaWFsLmN1bGxGYWNlID8gJ2JhY2snIDogJ25vbmUnLFxuICAgICAgfSxcbiAgICAgIGRlcHRoU3RlbmNpbDpcbiAgICAgICAgZGVwdGhTdGVuY2lsRm9ybWF0ID09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBkZXB0aFdyaXRlRW5hYmxlZDpcbiAgICAgICAgICAgICAgICAocmVuZGVyUGFzcy5pc0RlcHRoVGVzdCAmJiByZW5kZXJQYXNzLmRlcHRoV3JpdGVNYXNrICYmIGlzT3BhcXVlKSB8fFxuICAgICAgICAgICAgICAgIChyZW5kZXJQYXNzLmlzRGVwdGhUZXN0ICYmXG4gICAgICAgICAgICAgICAgICByZW5kZXJQYXNzLmRlcHRoV3JpdGVNYXNrICYmXG4gICAgICAgICAgICAgICAgICAhaXNPcGFxdWUgJiZcbiAgICAgICAgICAgICAgICAgIE1lc2hSZW5kZXJlckNvbXBvbmVudC5pc0RlcHRoTWFza1RydWVGb3JCbGVuZFByaW1pdGl2ZXMpXG4gICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICAgIGRlcHRoQ29tcGFyZTogcmVuZGVyUGFzcy5pc0RlcHRoVGVzdCA/ICdsZXNzJyA6ICdhbHdheXMnLFxuICAgICAgICAgICAgICBmb3JtYXQ6IGRlcHRoU3RlbmNpbEZvcm1hdCxcbiAgICAgICAgICAgIH0sXG4gICAgICBtdWx0aXNhbXBsZToge1xuICAgICAgICBjb3VudDpcbiAgICAgICAgICByZW5kZXJQYXNzLmdldFJlc29sdmVGcmFtZWJ1ZmZlcigpICE9IG51bGxcbiAgICAgICAgICAgID8gKHJlbmRlclBhc3MuZ2V0RnJhbWVidWZmZXIoKSEuY29sb3JBdHRhY2htZW50c1swXSBhcyBSZW5kZXJCdWZmZXIpLnNhbXBsZUNvdW50XG4gICAgICAgICAgICA6IDEsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX3dlYkdwdVJlbmRlclBpcGVsaW5lTWFwLnNldChyZW5kZXJQaXBlbGluZUlkLCBwaXBlbGluZSk7XG4gICAgdGhpcy5fX21hdGVyaWFsU3RhdGVWZXJzaW9uTWFwLnNldChyZW5kZXJQaXBlbGluZUlkLCBtYXRlcmlhbC5zdGF0ZVZlcnNpb24pO1xuXG4gICAgcmV0dXJuIFtwaXBlbGluZSwgdHJ1ZV07XG4gIH1cblxuICBmbHVzaCgpIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGdwdURldmljZS5xdWV1ZS5zdWJtaXQoW3RoaXMuX19jb21tYW5kRW5jb2RlciEuZmluaXNoKCldKTtcbiAgICB0aGlzLl9fY29tbWFuZEVuY29kZXIgPSBncHVEZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcblxuICAgIGlmICh0aGlzLl9fY29udGV4dEN1cnJlbnRUZXh0dXJlVmlldyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9fY29udGV4dEN1cnJlbnRUZXh0dXJlVmlldyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEN1YmUgVGV4dHVyZSBmcm9tIGltYWdlIGZpbGVzLlxuICAgKiBAcGFyYW0gYmFzZVVyaSB0aGUgYmFzZSB1cmkgdG8gbG9hZCBpbWFnZXM7XG4gICAqIEBwYXJhbSBtaXBMZXZlbENvdW50IHRoZSBudW1iZXIgb2YgbWlwIGxldmVscyAoaW5jbHVkZSByb290IGxldmVsKS4gaWYgbm8gbWlwbWFwLCB0aGUgdmFsdWUgc2hvdWxkIGJlIDE7XG4gICAqIEByZXR1cm5zIHRoZSBXZWJHTFJlc291cmNlSGFuZGxlIGZvciB0aGUgZ2VuZXJhdGVkIEN1YmUgVGV4dHVyZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQ3ViZVRleHR1cmVGcm9tRmlsZXMoXG4gICAgYmFzZVVyaTogc3RyaW5nLFxuICAgIG1pcExldmVsQ291bnQ6IENvdW50LFxuICAgIGlzTmFtZVBvc05lZzogYm9vbGVhbixcbiAgICBoZHJpRm9ybWF0OiBIZHJpRm9ybWF0RW51bVxuICApIHtcbiAgICBjb25zdCBpbWFnZUFyZ3M6IEFycmF5PHtcbiAgICAgIHBvc1g6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgbmVnWDogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBwb3NZOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgIG5lZ1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgcG9zWjogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBuZWdaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICB9PiA9IFtdO1xuICAgIGxldCB3aWR0aCA9IDA7XG4gICAgbGV0IGhlaWdodCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaXBMZXZlbENvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGxvYWRPbmVMZXZlbCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnRbXSB8IEhUTUxDYW52YXNFbGVtZW50W10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsZXQgbG9hZGVkQ291bnQgPSAwO1xuICAgICAgICAgIGNvbnN0IGltYWdlczogSFRNTEltYWdlRWxlbWVudFtdID0gW107XG4gICAgICAgICAgbGV0IGV4dGVuc2lvbiA9ICcuanBnJztcbiAgICAgICAgICBpZiAoaGRyaUZvcm1hdCA9PT0gSGRyaUZvcm1hdC5IRFJfTElORUFSKSB7XG4gICAgICAgICAgICBleHRlbnNpb24gPSAnLmhkcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZHJpRm9ybWF0ID09PSBIZHJpRm9ybWF0LlJHQkVfUE5HKSB7XG4gICAgICAgICAgICBleHRlbnNpb24gPSAnLlJHQkUuUE5HJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcG9zWCA9ICdfcmlnaHRfJztcbiAgICAgICAgICBsZXQgbmVnWCA9ICdfbGVmdF8nO1xuICAgICAgICAgIGxldCBwb3NZID0gJ190b3BfJztcbiAgICAgICAgICBsZXQgbmVnWSA9ICdfYm90dG9tXyc7XG4gICAgICAgICAgbGV0IHBvc1ogPSAnX2Zyb250Xyc7XG4gICAgICAgICAgbGV0IG5lZ1ogPSAnX2JhY2tfJztcbiAgICAgICAgICBpZiAoaXNOYW1lUG9zTmVnKSB7XG4gICAgICAgICAgICBwb3NYID0gJ19wb3N4Xyc7XG4gICAgICAgICAgICBuZWdYID0gJ19uZWd4Xyc7XG4gICAgICAgICAgICBwb3NZID0gJ19wb3N5Xyc7XG4gICAgICAgICAgICBuZWdZID0gJ19uZWd5Xyc7XG4gICAgICAgICAgICBwb3NaID0gJ19wb3N6Xyc7XG4gICAgICAgICAgICBuZWdaID0gJ19uZWd6Xyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmFjZXMgPSBbXG4gICAgICAgICAgICBbYmFzZVVyaSArIHBvc1ggKyBpICsgZXh0ZW5zaW9uLCAncG9zWCddLFxuICAgICAgICAgICAgW2Jhc2VVcmkgKyBuZWdYICsgaSArIGV4dGVuc2lvbiwgJ25lZ1gnXSxcbiAgICAgICAgICAgIFtiYXNlVXJpICsgcG9zWSArIGkgKyBleHRlbnNpb24sICdwb3NZJ10sXG4gICAgICAgICAgICBbYmFzZVVyaSArIG5lZ1kgKyBpICsgZXh0ZW5zaW9uLCAnbmVnWSddLFxuICAgICAgICAgICAgW2Jhc2VVcmkgKyBwb3NaICsgaSArIGV4dGVuc2lvbiwgJ3Bvc1onXSxcbiAgICAgICAgICAgIFtiYXNlVXJpICsgbmVnWiArIGkgKyBleHRlbnNpb24sICduZWdaJ10sXG4gICAgICAgICAgXTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZhY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBmYWNlID0gZmFjZXNbal1bMV07XG4gICAgICAgICAgICBsZXQgaW1hZ2U6IGFueTtcbiAgICAgICAgICAgIGlmIChoZHJpRm9ybWF0ID09PSBIZHJpRm9ybWF0LkhEUl9MSU5FQVIgfHwgaGRyaUZvcm1hdCA9PT0gSGRyaUZvcm1hdC5SR0I5X0U1X1BORykge1xuICAgICAgICAgICAgICBpbWFnZSA9IG5ldyBIRFJJbWFnZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGltYWdlLmhkcmlGb3JtYXQgPSBoZHJpRm9ybWF0O1xuXG4gICAgICAgICAgICAoaW1hZ2UgYXMgYW55KS5zaWRlID0gZmFjZTtcbiAgICAgICAgICAgIChpbWFnZSBhcyBhbnkpLnVyaSA9IGZhY2VzW2pdWzBdO1xuICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1hZ2UpO1xuICAgICAgICAgICAgICBpZiAobG9hZGVkQ291bnQgPT09IDYpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGltYWdlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoKGltYWdlIGFzIGFueSkudXJpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBmYWNlc1tqXVswXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgbGV0IGltYWdlczogSFRNTEltYWdlRWxlbWVudFtdIHwgSFRNTENhbnZhc0VsZW1lbnRbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGltYWdlcyA9IGF3YWl0IGxvYWRPbmVMZXZlbCgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUcnkgYWdhaW4gb25jZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGltYWdlcyA9IGF3YWl0IGxvYWRPbmVMZXZlbCgpO1xuICAgICAgICB9IGNhdGNoICh1cmkpIHtcbiAgICAgICAgICAvLyBHaXZlIHVwXG4gICAgICAgICAgTG9nZ2VyLmVycm9yKGBmYWlsZWQgdG8gbG9hZCAke3VyaX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaW1hZ2VCaXRtYXBzOiBJbWFnZUJpdG1hcFtdIHwgSFRNTENhbnZhc0VsZW1lbnRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMhKSB7XG4gICAgICAgIGlmICgoaW1hZ2UgYXMgYW55KS5oZHJpRm9ybWF0ID09PSBIZHJpRm9ybWF0LkhEUl9MSU5FQVIpIHtcbiAgICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZSBhcyBhbnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IChpbWFnZSBhcyBhbnkpLmRlY29kZSgpO1xuICAgICAgICAgIGNvbnN0IGltYWdlQml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoaW1hZ2UpO1xuICAgICAgICAgIGltYWdlQml0bWFwcy5wdXNoKGltYWdlQml0bWFwIGFzIGFueSk7XG4gICAgICAgICAgKGltYWdlQml0bWFwIGFzIGFueSkuc2lkZSA9IChpbWFnZSBhcyBhbnkpLnNpZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGltYWdlT2JqOiB7XG4gICAgICAgIHBvc1g/OiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgbmVnWD86IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICBwb3NZPzogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICAgIG5lZ1k/OiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgICAgcG9zWj86IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICBuZWdaPzogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICB9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGltYWdlQml0bWFwIG9mIGltYWdlQml0bWFwcykge1xuICAgICAgICBzd2l0Y2ggKChpbWFnZUJpdG1hcCBhcyBhbnkpLnNpZGUpIHtcbiAgICAgICAgICBjYXNlICdwb3NYJzpcbiAgICAgICAgICAgIGltYWdlT2JqLnBvc1ggPSBpbWFnZUJpdG1hcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Bvc1knOlxuICAgICAgICAgICAgaW1hZ2VPYmoucG9zWSA9IGltYWdlQml0bWFwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncG9zWic6XG4gICAgICAgICAgICBpbWFnZU9iai5wb3NaID0gaW1hZ2VCaXRtYXA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICduZWdYJzpcbiAgICAgICAgICAgIGltYWdlT2JqLm5lZ1ggPSBpbWFnZUJpdG1hcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ25lZ1knOlxuICAgICAgICAgICAgaW1hZ2VPYmoubmVnWSA9IGltYWdlQml0bWFwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbmVnWic6XG4gICAgICAgICAgICBpbWFnZU9iai5uZWdaID0gaW1hZ2VCaXRtYXA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgIHdpZHRoID0gaW1hZ2VCaXRtYXAud2lkdGg7XG4gICAgICAgICAgaGVpZ2h0ID0gaW1hZ2VCaXRtYXAuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbWFnZUFyZ3MucHVzaChcbiAgICAgICAgaW1hZ2VPYmogYXMge1xuICAgICAgICAgIHBvc1g6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICAgIG5lZ1g6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICAgIHBvc1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICAgIG5lZ1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICAgIHBvc1o6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICAgIG5lZ1o6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDdWJlVGV4dHVyZShtaXBMZXZlbENvdW50LCBpbWFnZUFyZ3MsIHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhIEN1YmVUZXh0dXJlXG4gICAqXG4gICAqIEBwYXJhbSBtaXBMZXZlbENvdW50XG4gICAqIEBwYXJhbSBpbWFnZXNcbiAgICogQHBhcmFtIHdpZHRoXG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHJldHVybnMgcmVzb3VyY2UgaGFuZGxlXG4gICAqL1xuICBjcmVhdGVDdWJlVGV4dHVyZShcbiAgICBtaXBMZXZlbENvdW50OiBDb3VudCxcbiAgICBpbWFnZXM6IEFycmF5PHtcbiAgICAgIHBvc1g6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgbmVnWDogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBwb3NZOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICAgIG5lZ1k6IERpcmVjdFRleHR1cmVEYXRhO1xuICAgICAgcG9zWjogRGlyZWN0VGV4dHVyZURhdGE7XG4gICAgICBuZWdaOiBEaXJlY3RUZXh0dXJlRGF0YTtcbiAgICB9PixcbiAgICB3aWR0aDogU2l6ZSxcbiAgICBoZWlnaHQ6IFNpemVcbiAgKTogW251bWJlciwgU2FtcGxlcl0ge1xuICAgIGNvbnN0IG1pcG1hcHM6IChJbWFnZUJpdG1hcCB8IEhUTUxDYW52YXNFbGVtZW50KVtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pcExldmVsQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgaW1hZ2VCaXRtYXBzOiAoSW1hZ2VCaXRtYXAgfCBIVE1MQ2FudmFzRWxlbWVudClbXSA9IFtdO1xuICAgICAgaWYgKGltYWdlc1tpXS5wb3NYIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgfHwgaW1hZ2VzWzBdLnBvc1ggaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZXNbaV0ucG9zWCBhcyBhbnkpO1xuICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZXNbaV0ubmVnWCBhcyBhbnkpO1xuICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZXNbaV0ucG9zWSBhcyBhbnkpO1xuICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZXNbaV0ubmVnWSBhcyBhbnkpO1xuICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZXNbaV0ucG9zWiBhcyBhbnkpO1xuICAgICAgICBpbWFnZUJpdG1hcHMucHVzaChpbWFnZXNbaV0ubmVnWiBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgbWlwbWFwcy5wdXNoKGltYWdlQml0bWFwcyk7XG4gICAgfVxuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgY3ViZW1hcFRleHR1cmUgPSBncHVEZXZpY2UuY3JlYXRlVGV4dHVyZSh7XG4gICAgICBkaW1lbnNpb246ICcyZCcsXG4gICAgICBzaXplOiBbd2lkdGgsIGhlaWdodCwgNl0sXG4gICAgICBmb3JtYXQ6XG4gICAgICAgIChtaXBtYXBzWzBdWzBdIGFzIGFueSkuaGRyaUZvcm1hdCA9PT0gSGRyaUZvcm1hdC5IRFJfTElORUFSID8gJ3JnYmEzMmZsb2F0JyA6ICdyZ2JhOHVub3JtJyxcbiAgICAgIG1pcExldmVsQ291bnQ6IG1pcExldmVsQ291bnQsXG4gICAgICB1c2FnZTpcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCxcbiAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWlwTGV2ZWxDb3VudDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1pcG1hcHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgaW1hZ2VCaXRtYXAgPSBtaXBtYXBzW2ldW2pdO1xuICAgICAgICBpZiAoKGltYWdlQml0bWFwIGFzIGFueSkuaGRyaUZvcm1hdCA9PT0gSGRyaUZvcm1hdC5IRFJfTElORUFSKSB7XG4gICAgICAgICAgLy8gSERSIGltYWdlIGlzIDMgY2hhbm5lbHMsIHNvIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byA0IGNoYW5uZWxzXG4gICAgICAgICAgY29uc3QgbmV3RmxvYXQzMjNBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoaW1hZ2VCaXRtYXAud2lkdGggKiBpbWFnZUJpdG1hcC5oZWlnaHQgKiA0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRmxvYXQgPSAoaW1hZ2VCaXRtYXAgYXMgYW55KS5kYXRhRmxvYXQ7XG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IGltYWdlQml0bWFwLndpZHRoICogaW1hZ2VCaXRtYXAuaGVpZ2h0O1xuICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7XG4gICAgICAgICAgICBuZXdGbG9hdDMyM0FycmF5W2sgKiA0XSA9IGRhdGFGbG9hdFtrICogM107XG4gICAgICAgICAgICBuZXdGbG9hdDMyM0FycmF5W2sgKiA0ICsgMV0gPSBkYXRhRmxvYXRbayAqIDMgKyAxXTtcbiAgICAgICAgICAgIG5ld0Zsb2F0MzIzQXJyYXlbayAqIDQgKyAyXSA9IGRhdGFGbG9hdFtrICogMyArIDJdO1xuICAgICAgICAgICAgbmV3RmxvYXQzMjNBcnJheVtrICogNCArIDNdID0gMS4wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFsaWduIHRoZSByb3cgZGF0YSBzaXplIHRvIG11bHRpcGxlIG9mIDI1NiBieXRlc1xuICAgICAgICAgIGNvbnN0IGJ5dGVzUGVyUm93ID0gaW1hZ2VCaXRtYXAud2lkdGggKiA0ICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgIGNvbnN0IHBhZGRlZEJ5dGVzUGVyUm93ID0gTWF0aC5jZWlsKGJ5dGVzUGVyUm93IC8gMjU2KSAqIDI1NjsgLy8gMjU2LWJ5dGUgYWxpZ25tZW50IChHUFVJbWFnZUNvcHlCdWZmZXIuYnl0ZXNQZXJSb3cpLiBTZWU6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJncHUvI2dwdWltYWdlY29weWJ1ZmZlclxuICAgICAgICAgIGNvbnN0IHBhZGRlZFJvd1NpemUgPSBwYWRkZWRCeXRlc1BlclJvdyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICBjb25zdCBwYWRkZWRGbG9hdERhdGEgPSBuZXcgRmxvYXQzMkFycmF5KHBhZGRlZFJvd1NpemUgKiBpbWFnZUJpdG1hcC5oZWlnaHQpO1xuICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaW1hZ2VCaXRtYXAuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVN0YXJ0ID0geSAqIGltYWdlQml0bWFwLndpZHRoICogNDtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0ICsgaW1hZ2VCaXRtYXAud2lkdGggKiA0O1xuICAgICAgICAgICAgY29uc3QgZGVzdFN0YXJ0ID0geSAqIHBhZGRlZFJvd1NpemU7XG4gICAgICAgICAgICBwYWRkZWRGbG9hdERhdGEuc2V0KG5ld0Zsb2F0MzIzQXJyYXkuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCksIGRlc3RTdGFydCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBzaXplOiBwYWRkZWRGbG9hdERhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQocGFkZGVkRmxvYXREYXRhKTtcbiAgICAgICAgICBidWZmZXIudW5tYXAoKTtcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmRFbmNvZGVyID0gZ3B1RGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XG5cbiAgICAgICAgICBjb21tYW5kRW5jb2Rlci5jb3B5QnVmZmVyVG9UZXh0dXJlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgICAgICAgICAgYnl0ZXNQZXJSb3c6IHBhZGRlZEJ5dGVzUGVyUm93LFxuICAgICAgICAgICAgICByb3dzUGVySW1hZ2U6IGltYWdlQml0bWFwLmhlaWdodCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHRleHR1cmU6IGN1YmVtYXBUZXh0dXJlLCBvcmlnaW46IFswLCAwLCBqXSwgbWlwTGV2ZWw6IGkgfSxcbiAgICAgICAgICAgIFtpbWFnZUJpdG1hcC53aWR0aCwgaW1hZ2VCaXRtYXAuaGVpZ2h0LCAxXVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBjb21tYW5kQnVmZmVyID0gY29tbWFuZEVuY29kZXIuZmluaXNoKCk7XG4gICAgICAgICAgZ3B1RGV2aWNlLnF1ZXVlLnN1Ym1pdChbY29tbWFuZEJ1ZmZlcl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdwdURldmljZS5xdWV1ZS5jb3B5RXh0ZXJuYWxJbWFnZVRvVGV4dHVyZShcbiAgICAgICAgICAgIHsgc291cmNlOiBpbWFnZUJpdG1hcCB9LFxuICAgICAgICAgICAgeyB0ZXh0dXJlOiBjdWJlbWFwVGV4dHVyZSwgb3JpZ2luOiBbMCwgMCwgal0sIG1pcExldmVsOiBpIH0sXG4gICAgICAgICAgICBbaW1hZ2VCaXRtYXAud2lkdGgsIGltYWdlQml0bWFwLmhlaWdodCwgMV1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UoY3ViZW1hcFRleHR1cmUpO1xuICAgIGNvbnN0IHdyYXBTID0gVGV4dHVyZVBhcmFtZXRlci5SZXBlYXQ7XG4gICAgY29uc3Qgd3JhcFQgPSBUZXh0dXJlUGFyYW1ldGVyLlJlcGVhdDtcbiAgICBjb25zdCBtaW5GaWx0ZXIgPVxuICAgICAgbWlwTGV2ZWxDb3VudCA9PT0gMSA/IFRleHR1cmVQYXJhbWV0ZXIuTGluZWFyIDogVGV4dHVyZVBhcmFtZXRlci5MaW5lYXJNaXBtYXBMaW5lYXI7XG4gICAgY29uc3QgbWFnRmlsdGVyID0gVGV4dHVyZVBhcmFtZXRlci5MaW5lYXI7XG5cbiAgICBjb25zdCBzYW1wbGVyID0gbmV3IFNhbXBsZXIoeyB3cmFwUywgd3JhcFQsIG1pbkZpbHRlciwgbWFnRmlsdGVyLCBhbmlzb3Ryb3B5OiBmYWxzZSB9KTtcbiAgICBzYW1wbGVyLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIFtoYW5kbGUsIHNhbXBsZXJdO1xuICB9XG5cbiAgY3JlYXRlU3RvcmFnZUJ1ZmZlcihpbnB1dEFycmF5OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHN0b3JhZ2VCdWZmZXIgPSBncHVEZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgIHNpemU6IGlucHV0QXJyYXkuYnl0ZUxlbmd0aCxcbiAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCB8IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UsXG4gICAgfSk7XG4gICAgZ3B1RGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHN0b3JhZ2VCdWZmZXIsIDAsIGlucHV0QXJyYXkpO1xuXG4gICAgdGhpcy5fX3N0b3JhZ2VCdWZmZXIgPSBzdG9yYWdlQnVmZmVyO1xuXG4gICAgY29uc3Qgc3RvcmFnZUJ1ZmZlckhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKHN0b3JhZ2VCdWZmZXIpO1xuXG4gICAgcmV0dXJuIHN0b3JhZ2VCdWZmZXJIYW5kbGU7XG4gIH1cblxuICB1cGRhdGVTdG9yYWdlQnVmZmVyKFxuICAgIHN0b3JhZ2VCdWZmZXJIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlLFxuICAgIGlucHV0QXJyYXk6IEZsb2F0MzJBcnJheSxcbiAgICB1cGRhdGVDb21wb25lbnRTaXplOiBDb3VudFxuICApIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHN0b3JhZ2VCdWZmZXIgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChzdG9yYWdlQnVmZmVySGFuZGxlKSBhcyBHUFVCdWZmZXI7XG4gICAgZ3B1RGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHN0b3JhZ2VCdWZmZXIsIDAsIGlucHV0QXJyYXksIDAsIHVwZGF0ZUNvbXBvbmVudFNpemUpO1xuICB9XG5cbiAgY3JlYXRlU3RvcmFnZUJsZW5kU2hhcGVCdWZmZXIoaW5wdXRBcnJheTogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCBzdG9yYWdlQnVmZmVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICBzaXplOiBpbnB1dEFycmF5LmJ5dGVMZW5ndGgsXG4gICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgfCBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFLFxuICAgIH0pO1xuICAgIGdwdURldmljZS5xdWV1ZS53cml0ZUJ1ZmZlcihzdG9yYWdlQnVmZmVyLCAwLCBpbnB1dEFycmF5KTtcblxuICAgIHRoaXMuX19zdG9yYWdlQmxlbmRTaGFwZUJ1ZmZlciA9IHN0b3JhZ2VCdWZmZXI7XG5cbiAgICBjb25zdCBzdG9yYWdlQnVmZmVySGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2Uoc3RvcmFnZUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gc3RvcmFnZUJ1ZmZlckhhbmRsZTtcbiAgfVxuXG4gIHVwZGF0ZVN0b3JhZ2VCbGVuZFNoYXBlQnVmZmVyKFxuICAgIHN0b3JhZ2VCdWZmZXJIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlLFxuICAgIGlucHV0QXJyYXk6IEZsb2F0MzJBcnJheSxcbiAgICB1cGRhdGVDb21wb25lbnRTaXplOiBDb3VudFxuICApIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHN0b3JhZ2VCdWZmZXIgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChzdG9yYWdlQnVmZmVySGFuZGxlKSBhcyBHUFVCdWZmZXI7XG4gICAgZ3B1RGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHN0b3JhZ2VCdWZmZXIsIDAsIGlucHV0QXJyYXksIDAsIHVwZGF0ZUNvbXBvbmVudFNpemUpO1xuICB9XG5cbiAgY3JlYXRlVW5pZm9ybU1vcnBoT2Zmc2V0c0J1ZmZlcigpIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IGlucHV0QXJyYXkgPSBuZXcgVWludDMyQXJyYXkoXG4gICAgICBNYXRoLmNlaWwoXG4gICAgICAgIChDb25maWcubWF4VmVydGV4UHJpbWl0aXZlTnVtYmVySW5TaGFkZXIgKiBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcikgLyA0XG4gICAgICApICogNFxuICAgICk7XG4gICAgY29uc3QgdW5pZm9ybUJ1ZmZlciA9IGdwdURldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgc2l6ZTogaW5wdXRBcnJheS5ieXRlTGVuZ3RoLFxuICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUIHwgR1BVQnVmZmVyVXNhZ2UuVU5JRk9STSxcbiAgICB9KTtcbiAgICBncHVEZXZpY2UucXVldWUud3JpdGVCdWZmZXIodW5pZm9ybUJ1ZmZlciwgMCwgaW5wdXRBcnJheSk7XG5cbiAgICB0aGlzLl9fdW5pZm9ybU1vcnBoT2Zmc2V0c0J1ZmZlciA9IHVuaWZvcm1CdWZmZXI7XG5cbiAgICBjb25zdCB1bmlmb3JtQnVmZmVySGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodW5pZm9ybUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gdW5pZm9ybUJ1ZmZlckhhbmRsZTtcbiAgfVxuXG4gIHVwZGF0ZVVuaWZvcm1Nb3JwaE9mZnNldHNCdWZmZXIoaW5wdXRBcnJheTogVWludDMyQXJyYXksIGVsZW1lbnROdW06IENvdW50KSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBpZiAodGhpcy5fX3VuaWZvcm1Nb3JwaE9mZnNldHNCdWZmZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgZm91bmQgdW5pZm9ybSBtb3JwaCBidWZmZXIuJyk7XG4gICAgfVxuICAgIGdwdURldmljZS5xdWV1ZS53cml0ZUJ1ZmZlcih0aGlzLl9fdW5pZm9ybU1vcnBoT2Zmc2V0c0J1ZmZlciwgMCwgaW5wdXRBcnJheSwgMCwgZWxlbWVudE51bSk7XG4gIH1cblxuICBjcmVhdGVVbmlmb3JtTW9ycGhXZWlnaHRzQnVmZmVyKCkge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgaW5wdXRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICBNYXRoLmNlaWwoXG4gICAgICAgIChDb25maWcubWF4VmVydGV4UHJpbWl0aXZlTnVtYmVySW5TaGFkZXIgKiBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlcikgLyA0XG4gICAgICApICogNFxuICAgICk7XG4gICAgY29uc3QgdW5pZm9ybUJ1ZmZlciA9IGdwdURldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgc2l6ZTogaW5wdXRBcnJheS5ieXRlTGVuZ3RoLFxuICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUIHwgR1BVQnVmZmVyVXNhZ2UuVU5JRk9STSxcbiAgICB9KTtcbiAgICBncHVEZXZpY2UucXVldWUud3JpdGVCdWZmZXIodW5pZm9ybUJ1ZmZlciwgMCwgaW5wdXRBcnJheSk7XG5cbiAgICB0aGlzLl9fdW5pZm9ybU1vcnBoV2VpZ2h0c0J1ZmZlciA9IHVuaWZvcm1CdWZmZXI7XG5cbiAgICBjb25zdCB1bmlmb3JtQnVmZmVySGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodW5pZm9ybUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gdW5pZm9ybUJ1ZmZlckhhbmRsZTtcbiAgfVxuXG4gIHVwZGF0ZVVuaWZvcm1Nb3JwaFdlaWdodHNCdWZmZXIoaW5wdXRBcnJheTogRmxvYXQzMkFycmF5LCBlbGVtZW50TnVtOiBDb3VudCkge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgaWYgKHRoaXMuX191bmlmb3JtTW9ycGhXZWlnaHRzQnVmZmVyID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGZvdW5kIHVuaWZvcm0gbW9ycGggYnVmZmVyLicpO1xuICAgIH1cbiAgICBncHVEZXZpY2UucXVldWUud3JpdGVCdWZmZXIodGhpcy5fX3VuaWZvcm1Nb3JwaFdlaWdodHNCdWZmZXIsIDAsIGlucHV0QXJyYXksIDAsIGVsZW1lbnROdW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2NyZWF0ZUJpbmRHcm91cChcbiAgICByZW5kZXJQaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICAgIGRpZmZ1c2VDdWJlTWFwPzogQ3ViZVRleHR1cmUgfCBSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSxcbiAgICBzcGVjdWxhckN1YmVNYXA/OiBDdWJlVGV4dHVyZSB8IFJlbmRlclRhcmdldFRleHR1cmVDdWJlXG4gICkge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG5cbiAgICAvLyBHcm91cCAwIChTdG9yYWdlIEJ1ZmZlciwgVW5pZm9ybU1vcnBoIEJ1ZmZlcilcbiAgICB7XG4gICAgICBjb25zdCBlbnRyaWVzOiBHUFVCaW5kR3JvdXBFbnRyeVtdID0gW107XG4gICAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXRFbnRyaWVzOiBHUFVCaW5kR3JvdXBMYXlvdXRFbnRyeVtdID0gW107XG4gICAgICBpZiAodGhpcy5fX3N0b3JhZ2VCdWZmZXIgIT0gbnVsbCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IDAsXG4gICAgICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogdGhpcy5fX3N0b3JhZ2VCdWZmZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJpbmRHcm91cExheW91dEVudHJpZXMucHVzaCh7XG4gICAgICAgICAgYmluZGluZzogMCxcbiAgICAgICAgICBidWZmZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWFkLW9ubHktc3RvcmFnZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5WRVJURVggfCBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX3N0b3JhZ2VCbGVuZFNoYXBlQnVmZmVyICE9IG51bGwpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiAxLFxuICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICBidWZmZXI6IHRoaXMuX19zdG9yYWdlQmxlbmRTaGFwZUJ1ZmZlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYmluZEdyb3VwTGF5b3V0RW50cmllcy5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiAxLFxuICAgICAgICAgIGJ1ZmZlcjoge1xuICAgICAgICAgICAgdHlwZTogJ3JlYWQtb25seS1zdG9yYWdlJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpc2liaWxpdHk6IEdQVVNoYWRlclN0YWdlLlZFUlRFWCB8IEdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGR1bW15QnVmZmVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgc2l6ZTogMTYsXG4gICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUIHwgR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSxcbiAgICAgICAgfSk7XG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgYmluZGluZzogMSxcbiAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgYnVmZmVyOiBkdW1teUJ1ZmZlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYmluZEdyb3VwTGF5b3V0RW50cmllcy5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiAxLFxuICAgICAgICAgIGJ1ZmZlcjoge1xuICAgICAgICAgICAgdHlwZTogJ3JlYWQtb25seS1zdG9yYWdlJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpc2liaWxpdHk6IEdQVVNoYWRlclN0YWdlLlZFUlRFWCB8IEdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX191bmlmb3JtTW9ycGhPZmZzZXRzQnVmZmVyICE9IG51bGwpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiAyLFxuICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICBidWZmZXI6IHRoaXMuX191bmlmb3JtTW9ycGhPZmZzZXRzQnVmZmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBiaW5kR3JvdXBMYXlvdXRFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IDIsXG4gICAgICAgICAgYnVmZmVyOiB7XG4gICAgICAgICAgICB0eXBlOiAndW5pZm9ybScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5WRVJURVggfCBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX3VuaWZvcm1Nb3JwaFdlaWdodHNCdWZmZXIgIT0gbnVsbCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IDMsXG4gICAgICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogdGhpcy5fX3VuaWZvcm1Nb3JwaFdlaWdodHNCdWZmZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJpbmRHcm91cExheW91dEVudHJpZXMucHVzaCh7XG4gICAgICAgICAgYmluZGluZzogMyxcbiAgICAgICAgICBidWZmZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICd1bmlmb3JtJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpc2liaWxpdHk6IEdQVVNoYWRlclN0YWdlLlZFUlRFWCB8IEdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmluZEdyb3VwTGF5b3V0RGVzYzogR1BVQmluZEdyb3VwTGF5b3V0RGVzY3JpcHRvciA9IHtcbiAgICAgICAgZW50cmllczogYmluZEdyb3VwTGF5b3V0RW50cmllcyxcbiAgICAgIH07XG4gICAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXQgPSBncHVEZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KGJpbmRHcm91cExheW91dERlc2MpO1xuXG4gICAgICBjb25zdCB1bmlmb3JtQmluZEdyb3VwID0gZ3B1RGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgIGxheW91dDogYmluZEdyb3VwTGF5b3V0LFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX19iaW5kR3JvdXBTdG9yYWdlQnVmZmVyID0gdW5pZm9ybUJpbmRHcm91cDtcbiAgICAgIHRoaXMuX19iaW5kR3JvdXBMYXlvdXRTdG9yYWdlQnVmZmVyID0gYmluZEdyb3VwTGF5b3V0O1xuICAgIH1cblxuICAgIC8vIEdyb3VwIDEgKFRleHR1cmUpLCBHcm91cCAyIChTYW1wbGVyKVxuICAgIHtcbiAgICAgIGNvbnN0IGVudHJpZXNGb3JUZXh0dXJlOiBHUFVCaW5kR3JvdXBFbnRyeVtdID0gW107XG4gICAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXRFbnRyaWVzRm9yVGV4dHVyZTogR1BVQmluZEdyb3VwTGF5b3V0RW50cnlbXSA9IFtdO1xuICAgICAgY29uc3QgZW50cmllc0ZvclNhbXBsZXI6IEdQVUJpbmRHcm91cEVudHJ5W10gPSBbXTtcbiAgICAgIGNvbnN0IGJpbmRHcm91cExheW91dEVudHJpZXNGb3JTYW1wbGVyOiBHUFVCaW5kR3JvdXBMYXlvdXRFbnRyeVtdID0gW107XG4gICAgICBtYXRlcmlhbC5fYXV0b0ZpZWxkVmFyaWFibGVzT25seS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gdmFsdWUuaW5mbztcbiAgICAgICAgaWYgKGluZm8uc2VtYW50aWMgPT09ICdkaWZmdXNlRW52VGV4dHVyZScgfHwgaW5mby5zZW1hbnRpYyA9PT0gJ3NwZWN1bGFyRW52VGV4dHVyZScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29tcG9zaXRpb25UeXBlLmlzVGV4dHVyZShpbmZvLmNvbXBvc2l0aW9uVHlwZSkpIHtcbiAgICAgICAgICBjb25zdCBzbG90ID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IHZhbHVlLnZhbHVlWzFdIGFzIEFic3RyYWN0VGV4dHVyZTtcbiAgICAgICAgICBjb25zdCBzYW1wbGVyID0gdmFsdWUudmFsdWVbMl0gYXMgU2FtcGxlcjtcblxuICAgICAgICAgIC8vIFRleHR1cmVcbiAgICAgICAgICBjb25zdCB0eXBlID1cbiAgICAgICAgICAgIHRleHR1cmUgaW5zdGFuY2VvZiBDdWJlVGV4dHVyZSB8fCB0ZXh0dXJlIGluc3RhbmNlb2YgUmVuZGVyVGFyZ2V0VGV4dHVyZUN1YmVcbiAgICAgICAgICAgICAgPyAnY3ViZSdcbiAgICAgICAgICAgICAgOiAnMmQnO1xuICAgICAgICAgIGxldCBncHVUZXh0dXJlVmlldyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgICAgdGV4dHVyZS5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZFxuICAgICAgICAgICkgYXMgR1BVVGV4dHVyZVZpZXc7XG4gICAgICAgICAgaWYgKGdwdVRleHR1cmVWaWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0ZXh0dXJlIGluc3RhbmNlb2YgQ3ViZVRleHR1cmUgfHwgdGV4dHVyZSBpbnN0YW5jZW9mIFJlbmRlclRhcmdldFRleHR1cmVDdWJlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdwdVRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChcbiAgICAgICAgICAgICAgICBkdW1teUJsYWNrQ3ViZVRleHR1cmUuX3RleHR1cmVSZXNvdXJjZVVpZFxuICAgICAgICAgICAgICApIGFzIEdQVVRleHR1cmU7XG4gICAgICAgICAgICAgIGdwdVRleHR1cmVWaWV3ID0gZ3B1VGV4dHVyZS5jcmVhdGVWaWV3KHsgZGltZW5zaW9uOiAnY3ViZScgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBncHVUZXh0dXJlID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgICAgICAgICAgZHVtbXlXaGl0ZVRleHR1cmUuX3RleHR1cmVSZXNvdXJjZVVpZFxuICAgICAgICAgICAgICApIGFzIEdQVVRleHR1cmU7XG4gICAgICAgICAgICAgIGdwdVRleHR1cmVWaWV3ID0gZ3B1VGV4dHVyZS5jcmVhdGVWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVudHJpZXNGb3JUZXh0dXJlLnB1c2goe1xuICAgICAgICAgICAgYmluZGluZzogc2xvdCxcbiAgICAgICAgICAgIHJlc291cmNlOiBncHVUZXh0dXJlVmlldyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBiaW5kR3JvdXBMYXlvdXRFbnRyaWVzRm9yVGV4dHVyZS5wdXNoKHtcbiAgICAgICAgICAgIGJpbmRpbmc6IHNsb3QsXG4gICAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICAgIHZpZXdEaW1lbnNpb246IHR5cGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogR1BVU2hhZGVyU3RhZ2UuVkVSVEVYIHwgR1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBTYW1wbGVyXG4gICAgICAgICAgaWYgKCFzYW1wbGVyLmNyZWF0ZWQpIHtcbiAgICAgICAgICAgIHNhbXBsZXIuY3JlYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGdwdVNhbXBsZXIgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChzYW1wbGVyLl9zYW1wbGVyUmVzb3VyY2VVaWQpIGFzIEdQVVNhbXBsZXI7XG4gICAgICAgICAgZW50cmllc0ZvclNhbXBsZXIucHVzaCh7XG4gICAgICAgICAgICBiaW5kaW5nOiBzbG90LFxuICAgICAgICAgICAgcmVzb3VyY2U6IGdwdVNhbXBsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYmluZEdyb3VwTGF5b3V0RW50cmllc0ZvclNhbXBsZXIucHVzaCh7XG4gICAgICAgICAgICBiaW5kaW5nOiBzbG90LFxuICAgICAgICAgICAgc2FtcGxlcjoge1xuICAgICAgICAgICAgICB0eXBlOiAnZmlsdGVyaW5nJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5WRVJURVggfCBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpZmZ1c2UgSUJMXG4gICAgICBjb25zdCBkaWZmdXNlQ3ViZVRleHR1cmVWaWV3ID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgIElzLmV4aXN0KGRpZmZ1c2VDdWJlTWFwKSA/IGRpZmZ1c2VDdWJlTWFwLl90ZXh0dXJlVmlld1Jlc291cmNlVWlkIDogLTFcbiAgICAgICkgYXMgR1BVVGV4dHVyZVZpZXcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoSXMuZXhpc3QoZGlmZnVzZUN1YmVUZXh0dXJlVmlldykpIHtcbiAgICAgICAgZW50cmllc0ZvclRleHR1cmUucHVzaCh7XG4gICAgICAgICAgYmluZGluZzogSUJMX0RJRkZVU0VfQ1VCRV9URVhUVVJFX0JJTkRJTkdfU0xPVCxcbiAgICAgICAgICByZXNvdXJjZTogZGlmZnVzZUN1YmVUZXh0dXJlVmlldyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkdW1teUN1YmVUZXh0dXJlVmlldyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgIGR1bW15QmxhY2tDdWJlVGV4dHVyZS5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZFxuICAgICAgICApIGFzIEdQVVRleHR1cmVWaWV3O1xuICAgICAgICBlbnRyaWVzRm9yVGV4dHVyZS5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiBJQkxfRElGRlVTRV9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICAgIHJlc291cmNlOiBkdW1teUN1YmVUZXh0dXJlVmlldyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBiaW5kR3JvdXBMYXlvdXRFbnRyaWVzRm9yVGV4dHVyZS5wdXNoKHtcbiAgICAgICAgYmluZGluZzogSUJMX0RJRkZVU0VfQ1VCRV9URVhUVVJFX0JJTkRJTkdfU0xPVCxcbiAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgIHZpZXdEaW1lbnNpb246ICdjdWJlJyxcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJpbGl0eTogR1BVU2hhZGVyU3RhZ2UuRlJBR01FTlQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpZmZ1c2VDdWJlU2FtcGxlciA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICBJcy5leGlzdChkaWZmdXNlQ3ViZU1hcCkgPyBkaWZmdXNlQ3ViZU1hcC5fc2FtcGxlclJlc291cmNlVWlkIDogLTFcbiAgICAgICkgYXMgR1BVU2FtcGxlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChJcy5leGlzdChkaWZmdXNlQ3ViZVNhbXBsZXIpKSB7XG4gICAgICAgIGVudHJpZXNGb3JTYW1wbGVyLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IElCTF9ESUZGVVNFX0NVQkVfVEVYVFVSRV9CSU5ESU5HX1NMT1QsXG4gICAgICAgICAgcmVzb3VyY2U6IGRpZmZ1c2VDdWJlU2FtcGxlcixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkdW1teUN1YmVTYW1wbGVyID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQoXG4gICAgICAgICAgZHVtbXlCbGFja0N1YmVUZXh0dXJlLl9zYW1wbGVyUmVzb3VyY2VVaWRcbiAgICAgICAgKSBhcyBHUFVTYW1wbGVyO1xuICAgICAgICBlbnRyaWVzRm9yU2FtcGxlci5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiBJQkxfRElGRlVTRV9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICAgIHJlc291cmNlOiBkdW1teUN1YmVTYW1wbGVyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGJpbmRHcm91cExheW91dEVudHJpZXNGb3JTYW1wbGVyLnB1c2goe1xuICAgICAgICBiaW5kaW5nOiBJQkxfRElGRlVTRV9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICBzYW1wbGVyOiB7XG4gICAgICAgICAgdHlwZTogJ2ZpbHRlcmluZycsXG4gICAgICAgIH0sXG4gICAgICAgIHZpc2liaWxpdHk6IEdQVVNoYWRlclN0YWdlLkZSQUdNRU5ULFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNwZWN1bGFyIElCTFxuICAgICAgY29uc3Qgc3BlY3VsYXJDdWJlVGV4dHVyZVZpZXcgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChcbiAgICAgICAgSXMuZXhpc3Qoc3BlY3VsYXJDdWJlTWFwKSA/IHNwZWN1bGFyQ3ViZU1hcC5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZCA6IC0xXG4gICAgICApIGFzIEdQVVRleHR1cmVWaWV3IHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoSXMuZXhpc3Qoc3BlY3VsYXJDdWJlVGV4dHVyZVZpZXcpKSB7XG4gICAgICAgIGVudHJpZXNGb3JUZXh0dXJlLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IElCTF9TUEVDVUxBUl9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICAgIHJlc291cmNlOiBzcGVjdWxhckN1YmVUZXh0dXJlVmlldyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkdW1teUN1YmVUZXh0dXJlVmlldyA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICAgIGR1bW15QmxhY2tDdWJlVGV4dHVyZS5fdGV4dHVyZVZpZXdSZXNvdXJjZVVpZFxuICAgICAgICApIGFzIEdQVVRleHR1cmVWaWV3O1xuICAgICAgICBlbnRyaWVzRm9yVGV4dHVyZS5wdXNoKHtcbiAgICAgICAgICBiaW5kaW5nOiBJQkxfU1BFQ1VMQVJfQ1VCRV9URVhUVVJFX0JJTkRJTkdfU0xPVCxcbiAgICAgICAgICByZXNvdXJjZTogZHVtbXlDdWJlVGV4dHVyZVZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYmluZEdyb3VwTGF5b3V0RW50cmllc0ZvclRleHR1cmUucHVzaCh7XG4gICAgICAgIGJpbmRpbmc6IElCTF9TUEVDVUxBUl9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgdmlld0RpbWVuc2lvbjogJ2N1YmUnLFxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3BlY3VsYXJDdWJlU2FtcGxlciA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KFxuICAgICAgICBJcy5leGlzdChzcGVjdWxhckN1YmVNYXApID8gc3BlY3VsYXJDdWJlTWFwLl9zYW1wbGVyUmVzb3VyY2VVaWQgOiAtMVxuICAgICAgKSBhcyBHUFVTYW1wbGVyIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKElzLmV4aXN0KHNwZWN1bGFyQ3ViZVNhbXBsZXIpKSB7XG4gICAgICAgIGVudHJpZXNGb3JTYW1wbGVyLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IElCTF9TUEVDVUxBUl9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICAgIHJlc291cmNlOiBzcGVjdWxhckN1YmVTYW1wbGVyLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGR1bW15Q3ViZVNhbXBsZXIgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldChcbiAgICAgICAgICBkdW1teUJsYWNrQ3ViZVRleHR1cmUuX3NhbXBsZXJSZXNvdXJjZVVpZFxuICAgICAgICApIGFzIEdQVVNhbXBsZXI7XG4gICAgICAgIGVudHJpZXNGb3JTYW1wbGVyLnB1c2goe1xuICAgICAgICAgIGJpbmRpbmc6IElCTF9TUEVDVUxBUl9DVUJFX1RFWFRVUkVfQklORElOR19TTE9ULFxuICAgICAgICAgIHJlc291cmNlOiBkdW1teUN1YmVTYW1wbGVyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGJpbmRHcm91cExheW91dEVudHJpZXNGb3JTYW1wbGVyLnB1c2goe1xuICAgICAgICBiaW5kaW5nOiBJQkxfU1BFQ1VMQVJfQ1VCRV9URVhUVVJFX0JJTkRJTkdfU0xPVCxcbiAgICAgICAgc2FtcGxlcjoge1xuICAgICAgICAgIHR5cGU6ICdmaWx0ZXJpbmcnLFxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUZXh0dXJlXG4gICAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXREZXNjRm9yVGV4dHVyZTogR1BVQmluZEdyb3VwTGF5b3V0RGVzY3JpcHRvciA9IHtcbiAgICAgICAgZW50cmllczogYmluZEdyb3VwTGF5b3V0RW50cmllc0ZvclRleHR1cmUsXG4gICAgICB9O1xuICAgICAgY29uc3QgYmluZEdyb3VwTGF5b3V0Rm9yVGV4dHVyZSA9IGdwdURldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoXG4gICAgICAgIGJpbmRHcm91cExheW91dERlc2NGb3JUZXh0dXJlXG4gICAgICApO1xuICAgICAgY29uc3QgYmluZEdyb3VwRm9yVGV4dHVyZSA9IGdwdURldmljZS5jcmVhdGVCaW5kR3JvdXAoe1xuICAgICAgICBsYXlvdXQ6IGJpbmRHcm91cExheW91dEZvclRleHR1cmUsXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXNGb3JUZXh0dXJlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLl9fYmluZEdyb3VwVGV4dHVyZU1hcC5zZXQocmVuZGVyUGlwZWxpbmVJZCwgYmluZEdyb3VwRm9yVGV4dHVyZSk7XG4gICAgICB0aGlzLl9fYmluZEdyb3VwTGF5b3V0VGV4dHVyZU1hcC5zZXQocmVuZGVyUGlwZWxpbmVJZCwgYmluZEdyb3VwTGF5b3V0Rm9yVGV4dHVyZSk7XG5cbiAgICAgIC8vIFNhbXBsZXJcbiAgICAgIGNvbnN0IGJpbmRHcm91cExheW91dERlc2NGb3JTYW1wbGVyOiBHUFVCaW5kR3JvdXBMYXlvdXREZXNjcmlwdG9yID0ge1xuICAgICAgICBlbnRyaWVzOiBiaW5kR3JvdXBMYXlvdXRFbnRyaWVzRm9yU2FtcGxlcixcbiAgICAgIH07XG4gICAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXRGb3JTYW1wbGVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dChcbiAgICAgICAgYmluZEdyb3VwTGF5b3V0RGVzY0ZvclNhbXBsZXJcbiAgICAgICk7XG4gICAgICBjb25zdCBiaW5kR3JvdXBGb3JTYW1wbGVyID0gZ3B1RGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgIGxheW91dDogYmluZEdyb3VwTGF5b3V0Rm9yU2FtcGxlcixcbiAgICAgICAgZW50cmllczogZW50cmllc0ZvclNhbXBsZXIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX19iaW5kR3JvdXBTYW1wbGVyTWFwLnNldChyZW5kZXJQaXBlbGluZUlkLCBiaW5kR3JvdXBGb3JTYW1wbGVyKTtcbiAgICAgIHRoaXMuX19iaW5kR3JvdXBMYXlvdXRTYW1wbGVyTWFwLnNldChyZW5kZXJQaXBlbGluZUlkLCBiaW5kR3JvdXBMYXlvdXRGb3JTYW1wbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgVGV4dHVyZVxuICAgKiBAcGFyYW0gaW1hZ2VEYXRhXG4gICAqIEBwYXJhbSBwYXJhbTFcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRleHR1cmVGcm9tSFRNTEltYWdlRWxlbWVudChcbiAgICBpbWFnZURhdGE6IEhUTUxJbWFnZUVsZW1lbnQsXG4gICAge1xuICAgICAgbGV2ZWwsXG4gICAgICBpbnRlcm5hbEZvcm1hdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgYm9yZGVyLFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICAgIGdlbmVyYXRlTWlwbWFwLFxuICAgIH06IHtcbiAgICAgIGxldmVsOiBJbmRleDtcbiAgICAgIGludGVybmFsRm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgICAgIHdpZHRoOiBTaXplO1xuICAgICAgaGVpZ2h0OiBTaXplO1xuICAgICAgYm9yZGVyOiBTaXplO1xuICAgICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICAgIGdlbmVyYXRlTWlwbWFwOiBib29sZWFuO1xuICAgIH1cbiAgKTogUHJvbWlzZTxXZWJHUFVSZXNvdXJjZUhhbmRsZT4ge1xuICAgIGltYWdlRGF0YS5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuXG4gICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IHRoaXMuX19jcmVhdGVUZXh0dXJlSW5uZXIoXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGludGVybmFsRm9ybWF0LFxuICAgICAgZ2VuZXJhdGVNaXBtYXAsXG4gICAgICBpbWFnZURhdGFcbiAgICApO1xuXG4gICAgcmV0dXJuIHRleHR1cmVIYW5kbGU7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIENvbXByZXNzZWRUZXh0dXJlRnJvbUJhc2lzXG4gICAqIEBwYXJhbSBiYXNpc0ZpbGVcbiAgICogQHBhcmFtIHBhcmFtMVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgY3JlYXRlQ29tcHJlc3NlZFRleHR1cmVGcm9tQmFzaXMoXG4gICAgYmFzaXNGaWxlOiBCYXNpc0ZpbGUsXG4gICAge1xuICAgICAgYm9yZGVyLFxuICAgICAgZm9ybWF0LFxuICAgICAgdHlwZSxcbiAgICB9OiB7XG4gICAgICBib3JkZXI6IFNpemU7XG4gICAgICBmb3JtYXQ6IFBpeGVsRm9ybWF0RW51bTtcbiAgICAgIHR5cGU6IENvbXBvbmVudFR5cGVFbnVtO1xuICAgIH1cbiAgKTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGxldCBiYXNpc0NvbXByZXNzaW9uVHlwZTogQmFzaXNDb21wcmVzc2lvblR5cGVFbnVtO1xuICAgIGxldCBjb21wcmVzc2lvblR5cGU6IEdQVVRleHR1cmVGb3JtYXQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWlwbWFwRGVwdGggPSBiYXNpc0ZpbGUuZ2V0TnVtTGV2ZWxzKDApO1xuICAgIGNvbnN0IHdpZHRoID0gYmFzaXNGaWxlLmdldEltYWdlV2lkdGgoMCwgMCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gYmFzaXNGaWxlLmdldEltYWdlSGVpZ2h0KDAsIDApO1xuXG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCBncHVBZGFwdGVyID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdUFkYXB0ZXI7XG5cbiAgICBjb25zdCBzM3RjID0gZ3B1QWRhcHRlci5mZWF0dXJlcy5oYXMoJ3RleHR1cmUtY29tcHJlc3Npb24tYmMnKTtcbiAgICBpZiAoczN0Yykge1xuICAgICAgYmFzaXNDb21wcmVzc2lvblR5cGUgPSBCYXNpc0NvbXByZXNzaW9uVHlwZS5CQzM7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSAnYmMzLXJnYmEtdW5vcm0nOyAvLyBzM3RjLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuICAgIH1cbiAgICBjb25zdCBldGMyID0gZ3B1QWRhcHRlci5mZWF0dXJlcy5oYXMoJ3RleHR1cmUtY29tcHJlc3Npb24tZXRjMicpO1xuICAgIGlmIChldGMyKSB7XG4gICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSA9IEJhc2lzQ29tcHJlc3Npb25UeXBlLkVUQzI7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSAnZXRjMi1yZ2JhOHVub3JtJzsgLy8gZXRjMi5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDO1xuICAgIH1cbiAgICBjb25zdCBhc3RjID0gZ3B1QWRhcHRlci5mZWF0dXJlcy5oYXMoJ3RleHR1cmUtY29tcHJlc3Npb24tYXN0YycpO1xuICAgIGlmIChhc3RjKSB7XG4gICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSA9IEJhc2lzQ29tcHJlc3Npb25UeXBlLkFTVEM7XG4gICAgICBjb21wcmVzc2lvblR5cGUgPSAnYXN0Yy00eDQtdW5vcm0nOyAvLyBhc3RjLkNPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9LSFI7XG4gICAgfVxuICAgIGNvbnN0IHRleHR1cmVEZXNjcmlwdG9yOiBHUFVUZXh0dXJlRGVzY3JpcHRvciA9IHtcbiAgICAgIHNpemU6IFt3aWR0aCwgaGVpZ2h0LCAxXSxcbiAgICAgIGZvcm1hdDogY29tcHJlc3Npb25UeXBlISxcbiAgICAgIG1pcExldmVsQ291bnQ6IG1pcG1hcERlcHRoLFxuICAgICAgdXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1QsXG4gICAgfTtcblxuICAgIGNvbnN0IGdwdVRleHR1cmUgPSBncHVEZXZpY2UuY3JlYXRlVGV4dHVyZSh0ZXh0dXJlRGVzY3JpcHRvcik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pcG1hcERlcHRoOyBpKyspIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gYmFzaXNGaWxlLmdldEltYWdlV2lkdGgoMCwgaSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBiYXNpc0ZpbGUuZ2V0SW1hZ2VIZWlnaHQoMCwgaSk7XG4gICAgICBjb25zdCB0ZXh0dXJlU291cmNlID0gdGhpcy5kZWNvZGVCYXNpc0ltYWdlKGJhc2lzRmlsZSwgYmFzaXNDb21wcmVzc2lvblR5cGUhLCAwLCBpKTtcblxuICAgICAgY29uc3QgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkodGV4dHVyZVNvdXJjZSksIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICBncHVEZXZpY2UucXVldWUuY29weUV4dGVybmFsSW1hZ2VUb1RleHR1cmUoXG4gICAgICAgIHsgc291cmNlOiBpbWFnZURhdGEgfSxcbiAgICAgICAgeyB0ZXh0dXJlOiBncHVUZXh0dXJlLCBtaXBMZXZlbDogaSB9LFxuICAgICAgICBbd2lkdGgsIGhlaWdodCwgMV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKGdwdVRleHR1cmUpO1xuICAgIHJldHVybiB0ZXh0dXJlSGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlY29kZSB0aGUgQmFzaXNJbWFnZVxuICAgKiBAcGFyYW0gYmFzaXNGaWxlXG4gICAqIEBwYXJhbSBiYXNpc0NvbXByZXNzaW9uVHlwZVxuICAgKiBAcGFyYW0gaW1hZ2VJbmRleFxuICAgKiBAcGFyYW0gbGV2ZWxJbmRleFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVCYXNpc0ltYWdlKFxuICAgIGJhc2lzRmlsZTogQmFzaXNGaWxlLFxuICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlOiBCYXNpc0NvbXByZXNzaW9uVHlwZUVudW0sXG4gICAgaW1hZ2VJbmRleDogSW5kZXgsXG4gICAgbGV2ZWxJbmRleDogSW5kZXhcbiAgKSB7XG4gICAgY29uc3QgZXh0cmFjdFNpemUgPSBiYXNpc0ZpbGUuZ2V0SW1hZ2VUcmFuc2NvZGVkU2l6ZUluQnl0ZXMoXG4gICAgICBpbWFnZUluZGV4LFxuICAgICAgbGV2ZWxJbmRleCxcbiAgICAgIGJhc2lzQ29tcHJlc3Npb25UeXBlIS5pbmRleFxuICAgICk7XG4gICAgY29uc3QgdGV4dHVyZVNvdXJjZSA9IG5ldyBVaW50OEFycmF5KGV4dHJhY3RTaXplKTtcbiAgICBpZiAoXG4gICAgICAhYmFzaXNGaWxlLnRyYW5zY29kZUltYWdlKFxuICAgICAgICB0ZXh0dXJlU291cmNlLFxuICAgICAgICBpbWFnZUluZGV4LFxuICAgICAgICBsZXZlbEluZGV4LFxuICAgICAgICBiYXNpc0NvbXByZXNzaW9uVHlwZSEuaW5kZXgsXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgIClcbiAgICApIHtcbiAgICAgIExvZ2dlci5lcnJvcignZmFpbGVkIHRvIHRyYW5zY29kZSB0aGUgaW1hZ2UuJyk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0dXJlU291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgYmluZCBjb21wcmVzc2VkIHRleHR1cmUgb2JqZWN0XG4gICAqIEBwYXJhbSB0ZXh0dXJlRGF0YUFycmF5IHRyYW5zY29kZWQgdGV4dHVyZSBkYXRhIGZvciBlYWNoIG1pcG1hcHMobGV2ZWxzKVxuICAgKiBAcGFyYW0gY29tcHJlc3Npb25UZXh0dXJlVHlwZVxuICAgKi9cbiAgY3JlYXRlQ29tcHJlc3NlZFRleHR1cmUoXG4gICAgdGV4dHVyZURhdGFBcnJheTogVGV4dHVyZURhdGFbXSxcbiAgICBjb21wcmVzc2lvblRleHR1cmVUeXBlOiBDb21wcmVzc2lvblRleHR1cmVUeXBlRW51bVxuICApOiBXZWJHTFJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IGJsb2NrSW5mbyA9IGNvbXByZXNzaW9uVGV4dHVyZVR5cGUuYmxvY2tJbmZvIHx8IHsgYnl0ZVNpemU6IDQsIHdpZHRoOiAxLCBoZWlnaHQ6IDEgfTtcblxuICAgIGNvbnN0IHRleHR1cmVEYXRhTGV2ZWwwID0gdGV4dHVyZURhdGFBcnJheVswXTtcbiAgICBjb25zdCB0ZXh0dXJlRGVzY3JpcHRvcjogR1BVVGV4dHVyZURlc2NyaXB0b3IgPSB7XG4gICAgICBzaXplOiBbXG4gICAgICAgIE1hdGguY2VpbCh0ZXh0dXJlRGF0YUxldmVsMC53aWR0aCAvIGJsb2NrSW5mby53aWR0aCkgKiBibG9ja0luZm8ud2lkdGgsXG4gICAgICAgIE1hdGguY2VpbCh0ZXh0dXJlRGF0YUxldmVsMC5oZWlnaHQgLyBibG9ja0luZm8uaGVpZ2h0KSAqIGJsb2NrSW5mby5oZWlnaHQsXG4gICAgICAgIDEsXG4gICAgICBdLFxuICAgICAgZm9ybWF0OiBjb21wcmVzc2lvblRleHR1cmVUeXBlLndlYmdwdSBhcyBHUFVUZXh0dXJlRm9ybWF0LFxuICAgICAgbWlwTGV2ZWxDb3VudDogdGV4dHVyZURhdGFBcnJheS5sZW5ndGgsXG4gICAgICB1c2FnZTogR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCxcbiAgICB9O1xuXG4gICAgY29uc3QgdGV4dHVyZSA9IGdwdURldmljZS5jcmVhdGVUZXh0dXJlKHRleHR1cmVEZXNjcmlwdG9yKTtcblxuICAgIGZvciAobGV0IGxldmVsID0gMDsgbGV2ZWwgPCB0ZXh0dXJlRGF0YUFycmF5Lmxlbmd0aDsgbGV2ZWwrKykge1xuICAgICAgY29uc3QgdGV4dHVyZURhdGEgPSB0ZXh0dXJlRGF0YUFycmF5W2xldmVsXTtcbiAgICAgIGNvbnN0IG1pcFdpZHRoID0gdGV4dHVyZURhdGEud2lkdGg7XG4gICAgICBjb25zdCBtaXBIZWlnaHQgPSB0ZXh0dXJlRGF0YS5oZWlnaHQ7XG4gICAgICBjb25zdCBieXRlc1BlclJvdyA9IE1hdGguY2VpbChtaXBXaWR0aCAvIGJsb2NrSW5mby53aWR0aCkgKiBibG9ja0luZm8uYnl0ZVNpemU7XG4gICAgICBjb25zdCBjb21wcmVzc2VkVGV4dHVyZURhdGEgPSBuZXcgVWludDhBcnJheSh0ZXh0dXJlRGF0YS5idWZmZXIuYnVmZmVyKTtcbiAgICAgIGdwdURldmljZS5xdWV1ZS53cml0ZVRleHR1cmUoXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAgIG1pcExldmVsOiBsZXZlbCxcbiAgICAgICAgfSxcbiAgICAgICAgY29tcHJlc3NlZFRleHR1cmVEYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGJ5dGVzUGVyUm93LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgd2lkdGg6IE1hdGguY2VpbChtaXBXaWR0aCAvIGJsb2NrSW5mby53aWR0aCkgKiBibG9ja0luZm8ud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLmNlaWwobWlwSGVpZ2h0IC8gYmxvY2tJbmZvLmhlaWdodCkgKiBibG9ja0luZm8uaGVpZ2h0LFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHR1cmVIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh0ZXh0dXJlKTtcbiAgICByZXR1cm4gdGV4dHVyZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhbGxvY2F0ZSBhIFRleHR1cmVcbiAgICogQHBhcmFtIGZvcm1hdCAtIHRoZSBmb3JtYXQgb2YgdGhlIHRleHR1cmVcbiAgICogQHBhcmFtIHdpZHRoIC0gdGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlXG4gICAqIEBwYXJhbSBoZWlnaHQgLSB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlXG4gICAqIEBwYXJhbSBtaXBtYXBDb3VudCAtIHRoZSBudW1iZXIgb2YgbWlwbWFwIGxldmVsc1xuICAgKiBAcmV0dXJucyB0aGUgaGFuZGxlIG9mIHRoZSB0ZXh0dXJlXG4gICAqL1xuICBhbGxvY2F0ZVRleHR1cmUoe1xuICAgIGZvcm1hdCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbWlwTGV2ZWxDb3VudCxcbiAgfToge1xuICAgIGZvcm1hdDogVGV4dHVyZUZvcm1hdEVudW07XG4gICAgd2lkdGg6IFNpemU7XG4gICAgaGVpZ2h0OiBTaXplO1xuICAgIG1pcExldmVsQ291bnQ6IENvdW50O1xuICB9KTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG5cbiAgICBjb25zdCB0ZXh0dXJlRGVzY3JpcHRvcjogR1BVVGV4dHVyZURlc2NyaXB0b3IgPSB7XG4gICAgICBzaXplOiBbd2lkdGgsIGhlaWdodCwgMV0sXG4gICAgICBtaXBMZXZlbENvdW50OiBtaXBMZXZlbENvdW50LFxuICAgICAgZm9ybWF0OiBmb3JtYXQud2ViZ3B1IGFzIEdQVVRleHR1cmVGb3JtYXQsXG4gICAgICB1c2FnZTpcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCxcbiAgICB9O1xuXG4gICAgY29uc3QgZ3B1VGV4dHVyZSA9IGdwdURldmljZS5jcmVhdGVUZXh0dXJlKHRleHR1cmVEZXNjcmlwdG9yKTtcblxuICAgIGNvbnN0IHRleHR1cmVIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZShncHVUZXh0dXJlKTtcbiAgICByZXR1cm4gdGV4dHVyZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGltYWdlIHRvIGEgc3BlY2lmaWMgbWlwIGxldmVsIG9mIGEgdGV4dHVyZVxuICAgKiBAcGFyYW0gbWlwTGV2ZWwgLSB0aGUgbWlwIGxldmVsIHRvIGxvYWQgdGhlIGltYWdlIHRvXG4gICAqIEBwYXJhbSB0ZXh0dXJlVWlkIC0gdGhlIGhhbmRsZSBvZiB0aGUgdGV4dHVyZVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gdGhlIGZvcm1hdCBvZiB0aGUgaW1hZ2VcbiAgICogQHBhcmFtIHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgZGF0YVxuICAgKiBAcGFyYW0geE9mZnNldCAtIHRoZSB4IG9mZnNldCBvZiBjb3B5IHJlZ2lvblxuICAgKiBAcGFyYW0geU9mZnNldCAtIHRoZSB5IG9mZnNldCBvZiBjb3B5IHJlZ2lvblxuICAgKiBAcGFyYW0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIGltYWdlXG4gICAqIEBwYXJhbSBoZWlnaHQgLSB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZVxuICAgKiBAcGFyYW0gZGF0YSAtIHRoZSB0eXBlZGFycmF5IGRhdGEgb2YgdGhlIGltYWdlXG4gICAqL1xuICBhc3luYyBsb2FkSW1hZ2VUb01pcExldmVsT2ZUZXh0dXJlMkQoe1xuICAgIG1pcExldmVsLFxuICAgIHRleHR1cmVVaWQsXG4gICAgZm9ybWF0LFxuICAgIHR5cGUsXG4gICAgeE9mZnNldCxcbiAgICB5T2Zmc2V0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICByb3dTaXplQnlQaXhlbCxcbiAgICBkYXRhLFxuICB9OiB7XG4gICAgbWlwTGV2ZWw6IEluZGV4O1xuICAgIHRleHR1cmVVaWQ6IFdlYkdMUmVzb3VyY2VIYW5kbGU7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0RW51bTtcbiAgICB0eXBlOiBDb21wb25lbnRUeXBlRW51bTtcbiAgICB4T2Zmc2V0OiBudW1iZXI7XG4gICAgeU9mZnNldDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgcm93U2l6ZUJ5UGl4ZWw6IG51bWJlcjtcbiAgICBkYXRhOiBUeXBlZEFycmF5O1xuICB9KSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQodGV4dHVyZVVpZCkgYXMgR1BVVGV4dHVyZTtcbiAgICBjb25zdCBwaXhlbEZvcm1hdCA9IFRleHR1cmVGb3JtYXQuZ2V0UGl4ZWxGb3JtYXRGcm9tVGV4dHVyZUZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IGNvbXBvc2l0aW9uTnVtID0gUGl4ZWxGb3JtYXQuZ2V0Q29tcG9zaXRpb25OdW1Gcm9tUGl4ZWxGb3JtYXQocGl4ZWxGb3JtYXQpO1xuXG4gICAgY29uc3QgYnl0ZXNQZXJSb3cgPSByb3dTaXplQnlQaXhlbCAqIGNvbXBvc2l0aW9uTnVtICogdHlwZS5nZXRTaXplSW5CeXRlcygpO1xuXG4gICAgLy8gQWxpZ24gdGhlIHJvdyBkYXRhIHNpemUgdG8gbXVsdGlwbGUgb2YgMjU2IGJ5dGVzIGR1ZSB0byB0aGUgV2ViR1BVIHNwZWNcbiAgICBjb25zdCBwYWRkZWRCeXRlc1BlclJvdyA9IE1hdGguY2VpbChieXRlc1BlclJvdyAvIDI1NikgKiAyNTY7XG5cbiAgICAvLyBDb3B5IGRhdGEgdG8gcGFkZGVkIGJ1ZmZlclxuICAgIGNvbnN0IHBhZGRlZERhdGEgPSBuZXcgVWludDhBcnJheShwYWRkZWRCeXRlc1BlclJvdyAqIGhlaWdodCk7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgICAgY29uc3Qgc3JjT2Zmc2V0ID0gcm93ICogYnl0ZXNQZXJSb3c7XG4gICAgICBjb25zdCBkc3RPZmZzZXQgPSByb3cgKiBwYWRkZWRCeXRlc1BlclJvdztcbiAgICAgIHBhZGRlZERhdGEuc2V0KG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyLCBzcmNPZmZzZXQsIGJ5dGVzUGVyUm93KSwgZHN0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyDjg5Djg4Pjg5XjgqHjga7kvZzmiJBcbiAgICBjb25zdCBidWZmZXIgPSBncHVEZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgIHNpemU6IHBhZGRlZERhdGEuYnl0ZUxlbmd0aCxcbiAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyxcbiAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgfSk7XG5cbiAgICBuZXcgVWludDhBcnJheShidWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KHBhZGRlZERhdGEpO1xuICAgIGJ1ZmZlci51bm1hcCgpO1xuXG4gICAgY29uc3QgY29tbWFuZEVuY29kZXIgPSBncHVEZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcblxuICAgIGNvbW1hbmRFbmNvZGVyLmNvcHlCdWZmZXJUb1RleHR1cmUoXG4gICAgICB7XG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICBieXRlc1BlclJvdzogcGFkZGVkQnl0ZXNQZXJSb3csXG4gICAgICAgIHJvd3NQZXJJbWFnZTogaGVpZ2h0LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dHVyZSxcbiAgICAgICAgbWlwTGV2ZWwsXG4gICAgICAgIG9yaWdpbjogeyB4OiB4T2Zmc2V0LCB5OiB5T2Zmc2V0LCB6OiAwIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBkZXB0aE9yQXJyYXlMYXllcnM6IDEsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGNvbW1hbmRCdWZmZXIgPSBjb21tYW5kRW5jb2Rlci5maW5pc2goKTtcbiAgICBncHVEZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kQnVmZmVyXSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ3B1RGV2aWNlLnF1ZXVlLm9uU3VibWl0dGVkV29ya0RvbmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVUZXh0dXJlSW5uZXIoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW0sXG4gICAgZ2VuZXJhdGVNaXBtYXA6IGJvb2xlYW4sXG4gICAgaW1hZ2VEYXRhOiBJbWFnZUJpdG1hcERhdGFcbiAgKSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCB0ZXh0dXJlRGVzY3JpcHRvcjogR1BVVGV4dHVyZURlc2NyaXB0b3IgPSB7XG4gICAgICBzaXplOiBbd2lkdGgsIGhlaWdodCwgMV0sXG4gICAgICBmb3JtYXQ6IGludGVybmFsRm9ybWF0LndlYmdwdSBhcyBHUFVUZXh0dXJlRm9ybWF0LFxuICAgICAgdXNhZ2U6XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfFxuICAgICAgICBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1QgfFxuICAgICAgICBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQsXG4gICAgfTtcblxuICAgIGlmIChnZW5lcmF0ZU1pcG1hcCkge1xuICAgICAgdGV4dHVyZURlc2NyaXB0b3IubWlwTGV2ZWxDb3VudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSkgKyAxO1xuICAgIH1cblxuICAgIGNvbnN0IGdwdVRleHR1cmUgPSBncHVEZXZpY2UuY3JlYXRlVGV4dHVyZSh0ZXh0dXJlRGVzY3JpcHRvcik7XG5cbiAgICBncHVEZXZpY2UucXVldWUuY29weUV4dGVybmFsSW1hZ2VUb1RleHR1cmUoeyBzb3VyY2U6IGltYWdlRGF0YSB9LCB7IHRleHR1cmU6IGdwdVRleHR1cmUgfSwgW1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgXSk7XG5cbiAgICBpZiAoZ2VuZXJhdGVNaXBtYXApIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzKGdwdVRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0dXJlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UoZ3B1VGV4dHVyZSk7XG4gICAgcmV0dXJuIHRleHR1cmVIYW5kbGU7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgUmVuZGVyVGFyZ2V0VGV4dHVyZVxuICAgKiBAcGFyYW0gcGFyYW0wXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlKHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbWlwTGV2ZWxDb3VudCxcbiAgICBmb3JtYXQsXG4gIH06IHtcbiAgICB3aWR0aDogU2l6ZTtcbiAgICBoZWlnaHQ6IFNpemU7XG4gICAgbWlwTGV2ZWxDb3VudDogQ291bnQ7XG4gICAgZm9ybWF0OiBUZXh0dXJlUGFyYW1ldGVyRW51bTtcbiAgfSk6IFdlYkdQVVJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHRleHR1cmVEZXNjcmlwdG9yOiBHUFVUZXh0dXJlRGVzY3JpcHRvciA9IHtcbiAgICAgIHNpemU6IFt3aWR0aCwgaGVpZ2h0LCAxXSxcbiAgICAgIGZvcm1hdDogZm9ybWF0LndlYmdwdSBhcyBHUFVUZXh0dXJlRm9ybWF0LFxuICAgICAgbWlwTGV2ZWxDb3VudCxcbiAgICAgIHVzYWdlOlxuICAgICAgICBHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HIHxcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLkNPUFlfRFNUIHxcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5ULFxuICAgIH07XG5cbiAgICBjb25zdCBncHVUZXh0dXJlID0gZ3B1RGV2aWNlLmNyZWF0ZVRleHR1cmUodGV4dHVyZURlc2NyaXB0b3IpO1xuXG4gICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKGdwdVRleHR1cmUpO1xuXG4gICAgcmV0dXJuIHRleHR1cmVIYW5kbGU7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIGEgUmVuZGVyVGFyZ2V0VGV4dHVyZUFycmF5XG4gICAqIEBwYXJhbSBwYXJhbTBcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZVJlbmRlclRhcmdldFRleHR1cmVBcnJheSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGxldmVsLFxuICAgIGludGVybmFsRm9ybWF0LFxuICAgIGZvcm1hdCxcbiAgICB0eXBlLFxuICAgIGFycmF5TGVuZ3RoLFxuICB9OiB7XG4gICAgd2lkdGg6IFNpemU7XG4gICAgaGVpZ2h0OiBTaXplO1xuICAgIGxldmVsOiBJbmRleDtcbiAgICBpbnRlcm5hbEZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gICAgZm9ybWF0OiBQaXhlbEZvcm1hdEVudW07XG4gICAgdHlwZTogQ29tcG9uZW50VHlwZUVudW07XG4gICAgYXJyYXlMZW5ndGg6IENvdW50O1xuICB9KTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYSBSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZVxuICAgKiBAcGFyYW0gcGFyYW0wXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVSZW5kZXJUYXJnZXRUZXh0dXJlQ3ViZSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIG1pcExldmVsQ291bnQsXG4gICAgZm9ybWF0LFxuICB9OiB7XG4gICAgd2lkdGg6IFNpemU7XG4gICAgaGVpZ2h0OiBTaXplO1xuICAgIG1pcExldmVsQ291bnQ6IENvdW50O1xuICAgIGZvcm1hdDogVGV4dHVyZVBhcmFtZXRlckVudW07XG4gIH0pOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSB7XG4gICAgY29uc3QgZ3B1RGV2aWNlID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmdwdURldmljZTtcbiAgICBjb25zdCB0ZXh0dXJlRGVzY3JpcHRvcjogR1BVVGV4dHVyZURlc2NyaXB0b3IgPSB7XG4gICAgICBkaW1lbnNpb246ICcyZCcsXG4gICAgICBzaXplOiBbd2lkdGgsIGhlaWdodCwgNl0sXG4gICAgICBmb3JtYXQ6IGZvcm1hdC53ZWJncHUgYXMgR1BVVGV4dHVyZUZvcm1hdCxcbiAgICAgIG1pcExldmVsQ291bnQsXG4gICAgICB1c2FnZTpcbiAgICAgICAgR1BVVGV4dHVyZVVzYWdlLlRFWFRVUkVfQklORElORyB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5DT1BZX0RTVCB8XG4gICAgICAgIEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCxcbiAgICB9O1xuXG4gICAgY29uc3QgZ3B1VGV4dHVyZSA9IGdwdURldmljZS5jcmVhdGVUZXh0dXJlKHRleHR1cmVEZXNjcmlwdG9yKTtcblxuICAgIGNvbnN0IHRleHR1cmVIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZShncHVUZXh0dXJlKTtcblxuICAgIHJldHVybiB0ZXh0dXJlSGFuZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBSZW5kZXJidWZmZXJcbiAgICovXG4gIGNyZWF0ZVJlbmRlckJ1ZmZlcihcbiAgICB3aWR0aDogU2l6ZSxcbiAgICBoZWlnaHQ6IFNpemUsXG4gICAgaW50ZXJuYWxGb3JtYXQ6IFRleHR1cmVQYXJhbWV0ZXJFbnVtLFxuICAgIGlzTVNBQTogYm9vbGVhbixcbiAgICBzYW1wbGVDb3VudE1TQUE6IENvdW50XG4gICk6IFdlYkdQVVJlc291cmNlSGFuZGxlIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHRleHR1cmVEZXNjcmlwdG9yOiBHUFVUZXh0dXJlRGVzY3JpcHRvciA9IHtcbiAgICAgIHNpemU6IFt3aWR0aCwgaGVpZ2h0LCAxXSxcbiAgICAgIGZvcm1hdDogaW50ZXJuYWxGb3JtYXQud2ViZ3B1IGFzIEdQVVRleHR1cmVGb3JtYXQsXG4gICAgICBzYW1wbGVDb3VudDogaXNNU0FBID8gc2FtcGxlQ291bnRNU0FBIDogMSxcbiAgICAgIHVzYWdlOiBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkMgfCBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQsXG4gICAgfTtcblxuICAgIGNvbnN0IGdwdVRleHR1cmUgPSBncHVEZXZpY2UuY3JlYXRlVGV4dHVyZSh0ZXh0dXJlRGVzY3JpcHRvcik7XG5cbiAgICBjb25zdCB0ZXh0dXJlSGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UoZ3B1VGV4dHVyZSk7XG5cbiAgICByZXR1cm4gdGV4dHVyZUhhbmRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWxldGUgYSBSZW5kZXJCdWZmZXJcbiAgICogQHBhcmFtIHJlbmRlckJ1ZmZlclVpZFxuICAgKi9cbiAgZGVsZXRlUmVuZGVyQnVmZmVyKHJlbmRlckJ1ZmZlclVpZDogV2ViR1BVUmVzb3VyY2VIYW5kbGUpIHtcbiAgICB0aGlzLmZsdXNoKCk7XG4gICAgdGhpcy5jbGVhckNhY2hlKCk7XG5cbiAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQocmVuZGVyQnVmZmVyVWlkKSBhcyBHUFVUZXh0dXJlO1xuXG4gICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgdGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmRlbGV0ZShyZW5kZXJCdWZmZXJVaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjb3B5IFRleHR1cmUgRGF0YVxuICAgKiBAcGFyYW0gZnJvbVRleHR1cmVcbiAgICogQHBhcmFtIHRvVGV4dHVyZVxuICAgKi9cbiAgY29weVRleHR1cmVEYXRhKGZyb21UZXh0dXJlOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSwgdG9UZXh0dXJlOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSkge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KGZyb21UZXh0dXJlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRvID0gdGhpcy5fX3dlYkdwdVJlc291cmNlcy5nZXQodG9UZXh0dXJlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGlmICh0aGlzLl9fcmVuZGVyUGFzc0VuY29kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuX19yZW5kZXJCdW5kbGVFbmNvZGVyICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyLmV4ZWN1dGVCdW5kbGVzKFt0aGlzLl9fcmVuZGVyQnVuZGxlRW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgfVxuICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyLmVuZCgpO1xuICAgICAgdGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9fY29tbWFuZEVuY29kZXIhLmNvcHlUZXh0dXJlVG9UZXh0dXJlKFxuICAgICAge1xuICAgICAgICB0ZXh0dXJlOiBmcm9tLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dHVyZTogdG8sXG4gICAgICB9LFxuICAgICAgW3RvLndpZHRoLCB0by5oZWlnaHQsIDFdXG4gICAgKTtcbiAgfVxuXG4gIGlzTWlwcG1hcHBlZFRleHR1cmUodGV4dHVyZUhhbmRsZTogV2ViR1BVUmVzb3VyY2VIYW5kbGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBncHVEZXZpY2UgPSB0aGlzLl9fd2ViR3B1RGV2aWNlV3JhcHBlciEuZ3B1RGV2aWNlO1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGlmICh0ZXh0dXJlLm1pcExldmVsQ291bnQgPiAxKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGR1cGxpY2F0ZVRleHR1cmVBc01pcG1hcHBlZChcbiAgICBmcm9tVGV4dHVyZTogV2ViR1BVUmVzb3VyY2VIYW5kbGVcbiAgKTogW1dlYkdQVVJlc291cmNlSGFuZGxlLCBXZWJHUFVSZXNvdXJjZUhhbmRsZV0ge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KGZyb21UZXh0dXJlKSBhcyBHUFVUZXh0dXJlO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHRleHR1cmUgd2l0aCB0aGUgc2FtZSBkZXNjcmlwdG9yXG4gICAgY29uc3QgdGV4dHVyZURlc2NyaXB0b3IgPSB7XG4gICAgICBzaXplOiB7XG4gICAgICAgIHdpZHRoOiB0ZXh0dXJlLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRleHR1cmUuaGVpZ2h0LFxuICAgICAgICBkZXB0aE9yQXJyYXlMYXllcnM6IHRleHR1cmUuZGVwdGhPckFycmF5TGF5ZXJzLFxuICAgICAgfSxcbiAgICAgIG1pcExldmVsQ291bnQ6IE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGgubWF4KHRleHR1cmUud2lkdGgsIHRleHR1cmUuaGVpZ2h0KSkpICsgMSxcbiAgICAgIGZvcm1hdDogdGV4dHVyZS5mb3JtYXQsXG4gICAgICB1c2FnZTogdGV4dHVyZS51c2FnZSxcbiAgICB9O1xuICAgIGNvbnN0IG5ld1RleHR1cmUgPSBncHVEZXZpY2UuY3JlYXRlVGV4dHVyZSh0ZXh0dXJlRGVzY3JpcHRvcik7XG5cbiAgICBpZiAodGhpcy5fX3JlbmRlclBhc3NFbmNvZGVyICE9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLl9fcmVuZGVyQnVuZGxlRW5jb2RlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5leGVjdXRlQnVuZGxlcyhbdGhpcy5fX3JlbmRlckJ1bmRsZUVuY29kZXIuZmluaXNoKCldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2Rlci5lbmQoKTtcbiAgICAgIHRoaXMuX19yZW5kZXJQYXNzRW5jb2RlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHRoZSB0ZXh0dXJlIHRvIHRoZSBuZXcgdGV4dHVyZVxuICAgIHRoaXMuX19jb21tYW5kRW5jb2RlciEuY29weVRleHR1cmVUb1RleHR1cmUoXG4gICAgICB7IHRleHR1cmU6IHRleHR1cmUgfSxcbiAgICAgIHsgdGV4dHVyZTogbmV3VGV4dHVyZSB9LFxuICAgICAgeyB3aWR0aDogdGV4dHVyZS53aWR0aCwgaGVpZ2h0OiB0ZXh0dXJlLmhlaWdodCwgZGVwdGhPckFycmF5TGF5ZXJzOiAxIH1cbiAgICApO1xuXG4gICAgY29uc3QgdGV4dHVyZUhhbmRsZSA9IHRoaXMuX19yZWdpc3RlclJlc291cmNlKG5ld1RleHR1cmUpO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3SGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UobmV3VGV4dHVyZS5jcmVhdGVWaWV3KCkpO1xuXG4gICAgcmV0dXJuIFt0ZXh0dXJlSGFuZGxlLCB0ZXh0dXJlVmlld0hhbmRsZV07XG4gIH1cblxuICAvKipcbiAgICogYXR0YWNoIHRoZSBEZXB0aEJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBEZXB0aEJ1ZmZlclxuICAgKi9cbiAgYXR0YWNoRGVwdGhCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KGZyYW1lYnVmZmVyOiBGcmFtZUJ1ZmZlciwgcmVuZGVyYWJsZTogSVJlbmRlcmFibGUpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgU3RlbmNpbEJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBTdGVuY2lsQnVmZmVyXG4gICAqL1xuICBhdHRhY2hTdGVuY2lsQnVmZmVyVG9GcmFtZUJ1ZmZlck9iamVjdChmcmFtZWJ1ZmZlcjogRnJhbWVCdWZmZXIsIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBhdHRhY2ggdGhlIGRlcHRoU3RlbmNpbEJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBkZXB0aFN0ZW5jaWxCdWZmZXJcbiAgICovXG4gIGF0dGFjaERlcHRoU3RlbmNpbEJ1ZmZlclRvRnJhbWVCdWZmZXJPYmplY3QoXG4gICAgZnJhbWVidWZmZXI6IEZyYW1lQnVmZmVyLFxuICAgIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlXG4gICk6IHZvaWQge31cblxuICAvKipcbiAgICogY3JlYXRlIGEgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZUZyYW1lQnVmZmVyT2JqZWN0KCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWxldGUgYSBGcmFtZUJ1ZmZlck9iamVjdFxuICAgKiBAcGFyYW0gZnJhbWVCdWZmZXJPYmplY3RIYW5kbGVcbiAgICovXG4gIGRlbGV0ZUZyYW1lQnVmZmVyT2JqZWN0KGZyYW1lQnVmZmVyT2JqZWN0SGFuZGxlOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSk6IHZvaWQge31cblxuICAvKipcbiAgICogYXR0YWNoIHRoZSBDb2xvckJ1ZmZlciB0byB0aGUgRnJhbWVCdWZmZXJPYmplY3RcbiAgICogQHBhcmFtIGZyYW1lYnVmZmVyIGEgRnJhbWVidWZmZXJcbiAgICogQHBhcmFtIHJlbmRlcmFibGUgYSBDb2xvckJ1ZmZlclxuICAgKi9cbiAgYXR0YWNoQ29sb3JCdWZmZXJUb0ZyYW1lQnVmZmVyT2JqZWN0KFxuICAgIGZyYW1lYnVmZmVyOiBGcmFtZUJ1ZmZlcixcbiAgICBpbmRleDogSW5kZXgsXG4gICAgcmVuZGVyYWJsZTogSVJlbmRlcmFibGVcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIGF0dGFjaCB0aGUgQ29sb3JCdWZmZXIgdG8gdGhlIEZyYW1lQnVmZmVyT2JqZWN0XG4gICAqIEBwYXJhbSBmcmFtZWJ1ZmZlciBhIEZyYW1lYnVmZmVyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50SW5kZXggYSBhdHRhY2htZW50IGluZGV4XG4gICAqIEBwYXJhbSBmYWNlSW5kZXggYSBmYWNlIGluZGV4XG4gICAqIEBwYXJhbSBtaXBMZXZlbCBhIG1pcCBsZXZlbFxuICAgKiBAcGFyYW0gcmVuZGVyYWJsZSBhIENvbG9yQnVmZmVyXG4gICAqL1xuICBhdHRhY2hDb2xvckJ1ZmZlckN1YmVUb0ZyYW1lQnVmZmVyT2JqZWN0KFxuICAgIGZyYW1lYnVmZmVyOiBGcmFtZUJ1ZmZlcixcbiAgICBhdHRhY2htZW50SW5kZXg6IEluZGV4LFxuICAgIGZhY2VJbmRleDogSW5kZXgsXG4gICAgbWlwTGV2ZWw6IEluZGV4LFxuICAgIHJlbmRlcmFibGU6IElSZW5kZXJhYmxlXG4gICkge31cblxuICBjcmVhdGVUZXh0dXJlVmlldzJkKHRleHR1cmVIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlKTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGV4dHVyZS5jcmVhdGVWaWV3KCk7XG4gICAgY29uc3QgdGV4dHVyZVZpZXdIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh0ZXh0dXJlVmlldyk7XG5cbiAgICByZXR1cm4gdGV4dHVyZVZpZXdIYW5kbGU7XG4gIH1cblxuICBjcmVhdGVUZXh0dXJlVmlld0FzUmVuZGVyVGFyZ2V0KHRleHR1cmVIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlKTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGV4dHVyZS5jcmVhdGVWaWV3KHsgYmFzZU1pcExldmVsOiAwLCBtaXBMZXZlbENvdW50OiAxIH0pO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3SGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZVZpZXcpO1xuXG4gICAgcmV0dXJuIHRleHR1cmVWaWV3SGFuZGxlO1xuICB9XG5cbiAgY3JlYXRlVGV4dHVyZVZpZXdDdWJlKHRleHR1cmVIYW5kbGU6IFdlYkdQVVJlc291cmNlSGFuZGxlKTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGV4dHVyZS5jcmVhdGVWaWV3KHsgZGltZW5zaW9uOiAnY3ViZScgfSk7XG4gICAgY29uc3QgdGV4dHVyZVZpZXdIYW5kbGUgPSB0aGlzLl9fcmVnaXN0ZXJSZXNvdXJjZSh0ZXh0dXJlVmlldyk7XG5cbiAgICByZXR1cm4gdGV4dHVyZVZpZXdIYW5kbGU7XG4gIH1cblxuICBjcmVhdGVDdWJlVGV4dHVyZVZpZXdBc1JlbmRlclRhcmdldChcbiAgICB0ZXh0dXJlSGFuZGxlOiBXZWJHUFVSZXNvdXJjZUhhbmRsZSxcbiAgICBmYWNlSWR4OiBJbmRleCxcbiAgICBtaXBMZXZlbDogSW5kZXhcbiAgKTogV2ViR1BVUmVzb3VyY2VIYW5kbGUge1xuICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLl9fd2ViR3B1UmVzb3VyY2VzLmdldCh0ZXh0dXJlSGFuZGxlKSBhcyBHUFVUZXh0dXJlO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGV4dHVyZS5jcmVhdGVWaWV3KHtcbiAgICAgIGRpbWVuc2lvbjogJzJkJyxcbiAgICAgIGFycmF5TGF5ZXJDb3VudDogMSxcbiAgICAgIGJhc2VBcnJheUxheWVyOiBmYWNlSWR4LFxuICAgICAgYmFzZU1pcExldmVsOiBtaXBMZXZlbCxcbiAgICAgIG1pcExldmVsQ291bnQ6IDEsXG4gICAgICBhc3BlY3Q6ICdhbGwnLFxuICAgIH0pO1xuICAgIGNvbnN0IHRleHR1cmVWaWV3SGFuZGxlID0gdGhpcy5fX3JlZ2lzdGVyUmVzb3VyY2UodGV4dHVyZVZpZXcpO1xuXG4gICAgcmV0dXJuIHRleHR1cmVWaWV3SGFuZGxlO1xuICB9XG5cbiAgZGVsZXRlVGV4dHVyZSh0ZXh0dXJlSGFuZGxlOiBXZWJHTFJlc291cmNlSGFuZGxlKSB7XG4gICAgdGhpcy5mbHVzaCgpO1xuICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuXG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZ2V0KHRleHR1cmVIYW5kbGUpIGFzIEdQVVRleHR1cmU7XG5cbiAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICB0ZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX193ZWJHcHVSZXNvdXJjZXMuZGVsZXRlKHRleHR1cmVIYW5kbGUpO1xuICAgIH1cbiAgfVxuXG4gIHJlY3JlYXRlU3lzdGVtRGVwdGhUZXh0dXJlKCkge1xuICAgIGNvbnN0IGdwdURldmljZSA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5ncHVEZXZpY2U7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5fX3dlYkdwdURldmljZVdyYXBwZXIhLmNhbnZhcztcblxuICAgIGlmICh0aGlzLl9fc3lzdGVtRGVwdGhUZXh0dXJlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX19zeXN0ZW1EZXB0aFRleHR1cmUuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLl9fc3lzdGVtRGVwdGhUZXh0dXJlID0gZ3B1RGV2aWNlLmNyZWF0ZVRleHR1cmUoe1xuICAgICAgc2l6ZTogW2NhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodF0sXG4gICAgICBmb3JtYXQ6ICdkZXB0aDI0cGx1cycsXG4gICAgICB1c2FnZTogR1BVVGV4dHVyZVVzYWdlLlJFTkRFUl9BVFRBQ0hNRU5ULFxuICAgIH0pO1xuICAgIHRoaXMuX19zeXN0ZW1EZXB0aFRleHR1cmVWaWV3ID0gdGhpcy5fX3N5c3RlbURlcHRoVGV4dHVyZS5jcmVhdGVWaWV3KCk7XG4gIH1cblxuICByZXNpemVDYW52YXMod2lkdGg6IFNpemUsIGhlaWdodDogU2l6ZSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX193ZWJHcHVEZXZpY2VXcmFwcGVyIS5jYW52YXM7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnJlY3JlYXRlU3lzdGVtRGVwdGhUZXh0dXJlKCk7XG4gIH1cblxuICBzZXRWaWV3cG9ydCh2aWV3cG9ydD86IFZlY3RvcjQpIHt9XG5cbiAgaXNTdXBwb3J0TXVsdGlWaWV3VlJSZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL01lc2gvTWVzaENvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvTWVzaFJlbmRlcmVyL01lc2hSZW5kZXJlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb3JlL01lbW9yeU1hbmFnZXInO1xuaW1wb3J0IHsgQnVmZmVyVXNlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9CdWZmZXJVc2UnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tZW1vcnkvQnVmZmVyJztcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZ2VvbWV0cnkvUHJpbWl0aXZlJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRlcmlhbHMvY29yZS9NYXRlcmlhbCc7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ0dBUElTdHJhdGVneSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvQ0dBUElTdHJhdGVneSc7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9yZW5kZXJlci9SZW5kZXJQYXNzJztcbmltcG9ydCB7IGlzU2tpcERyYXdpbmcsIHVwZGF0ZVZCT0FuZFZBTyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvUmVuZGVyaW5nQ29tbW9uTWV0aG9kcyc7XG5pbXBvcnQge1xuICBDR0FQSVJlc291cmNlSGFuZGxlLFxuICBDb3VudCxcbiAgSW5kZXgsXG4gIEluZGV4T2YxNkJ5dGVzLFxuICBJbmRleE9mNEJ5dGVzLFxuICBQcmltaXRpdmVVSUQsXG59IGZyb20gJy4uL3R5cGVzL0NvbW1vblR5cGVzJztcbmltcG9ydCB7IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4vV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db21wb25lbnQnO1xuaW1wb3J0IHsgU2NlbmVHcmFwaENvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9TY2VuZUdyYXBoL1NjZW5lR3JhcGhDb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhZGVyU2VtYW50aWNzSW5mbyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZGVmaW5pdGlvbnMvU2hhZGVyU2VtYW50aWNzSW5mbyc7XG5pbXBvcnQgeyBHbG9iYWxEYXRhUmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9HbG9iYWxEYXRhUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBNYXRlcmlhbFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvblR5cGUgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2RlZmluaXRpb25zL0NvbXBvc2l0aW9uVHlwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9Db21wb25lbnRUeXBlJztcbmltcG9ydCB7XG4gIGdldFNoYWRlclByb3BlcnR5RnVuYyxcbiAgU2hhZGVyU2VtYW50aWNzTmFtZSxcbn0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9TaGFkZXJTZW1hbnRpY3MnO1xuaW1wb3J0IHsgTW9kdWxlTWFuYWdlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db21wb25lbnRSZXBvc2l0b3J5JztcbmltcG9ydCB7IENhbWVyYUNvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmEvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7IFJuWFIgfSBmcm9tICcuLi94ci9tYWluJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29yZS9Db25maWcnO1xuaW1wb3J0IHsgVmVydGV4QXR0cmlidXRlIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9kZWZpbml0aW9ucy9WZXJ0ZXhBdHRyaWJ1dGUnO1xuaW1wb3J0IHsgQWNjZXNzb3IgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21lbW9yeS9BY2Nlc3Nvcic7XG5pbXBvcnQgeyBCbGVuZFNoYXBlQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0JsZW5kU2hhcGUvQmxlbmRTaGFwZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9jb21wb25lbnRzL0NhbWVyYUNvbnRyb2xsZXIvQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvVHJhbnNmb3JtL1RyYW5zZm9ybUNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9nZW9tZXRyeS9NZXNoJztcbmltcG9ydCB7IEFuaW1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9BbmltYXRpb24vQW5pbWF0aW9uQ29tcG9uZW50JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuXG5leHBvcnQgY2xhc3MgV2ViR3B1U3RyYXRlZ3lCYXNpYyBpbXBsZW1lbnRzIENHQVBJU3RyYXRlZ3kge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBXZWJHcHVTdHJhdGVneUJhc2ljO1xuICBwcml2YXRlIF9fc3RvcmFnZUJ1ZmZlclVpZDogQ0dBUElSZXNvdXJjZUhhbmRsZSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuICBwcml2YXRlIF9fc3RvcmFnZUJsZW5kU2hhcGVCdWZmZXJVaWQ6IENHQVBJUmVzb3VyY2VIYW5kbGUgPVxuICAgIENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LkludmFsaWRDR0FQSVJlc291cmNlVWlkO1xuICBwcml2YXRlIF9fdW5pZm9ybU1vcnBoT2Zmc2V0c1R5cGVkQXJyYXk/OiBVaW50MzJBcnJheTtcbiAgcHJpdmF0ZSBfX3VuaWZvcm1Nb3JwaFdlaWdodHNUeXBlZEFycmF5PzogRmxvYXQzMkFycmF5O1xuXG4gIHByaXZhdGUgX19sYXN0TWF0ZXJpYWxzVXBkYXRlQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RTY2VuZUdyYXBoQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gLTE7XG4gIHByaXZhdGUgX19sYXN0Q2FtZXJhQ29udHJvbGxlckNvbXBvbmVudHNVcGRhdGVDb3VudCA9IC0xO1xuXG4gIHByaXZhdGUgX19sYXN0QmxlbmRTaGFwZUNvbXBvbmVudHNVcGRhdGVDb3VudEZvcldlaWdodHMgPSAtMTtcbiAgcHJpdmF0ZSBfX2xhc3RCbGVuZFNoYXBlQ29tcG9uZW50c1VwZGF0ZUNvdW50Rm9yQmxlbmREYXRhID0gLTE7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgV2ViR3B1U3RyYXRlZ3lCYXNpYygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGdldFZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zX3N0b3JhZ2VCdWZmZXIoKSB7XG4gICAgcmV0dXJuIGBcbmZuIGdldF93b3JsZE1hdHJpeChpbnN0YW5jZUlkOiB1MzIpIC0+IG1hdDR4NDxmMzI+XG57XG4gIGxldCBpbmRleDogdTMyID0gJHtDb21wb25lbnQuZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mQ29tcG9uZW50KFxuICAgIFNjZW5lR3JhcGhDb21wb25lbnQsXG4gICAgJ3dvcmxkTWF0cml4J1xuICApfXUgKyA0dSAqIGluc3RhbmNlSWQ7XG4gIGxldCBtYXRyaXggPSBmZXRjaE1hdDQoaW5kZXgpO1xuXG4gIHJldHVybiBtYXRyaXg7XG59XG5cbmZuIGdldF9ub3JtYWxNYXRyaXgoaW5zdGFuY2VJZDogdTMyKSAtPiBtYXQzeDM8ZjMyPiB7XG4gIGxldCBpbmRleDogdTMyID0gJHtDb21wb25lbnQuZ2V0TG9jYXRpb25PZmZzZXRPZk1lbWJlck9mQ29tcG9uZW50KFxuICAgIFNjZW5lR3JhcGhDb21wb25lbnQsXG4gICAgJ25vcm1hbE1hdHJpeCdcbiAgKX11ICogNCArIDkgKiBpbnN0YW5jZUlkO1xuICBsZXQgbWF0cml4ID0gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChpbmRleCk7XG5cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuZm4gZ2V0X2lzVmlzaWJsZShpbnN0YW5jZUlkOiB1MzIpIC0+IGJvb2wge1xuICBsZXQgaW5kZXg6IHUzMiA9ICR7Q29tcG9uZW50LmdldExvY2F0aW9uT2Zmc2V0T2ZNZW1iZXJPZkNvbXBvbmVudChcbiAgICBTY2VuZUdyYXBoQ29tcG9uZW50LFxuICAgICdpc1Zpc2libGUnXG4gICl9dSAqIDR1ICsgaW5zdGFuY2VJZDtcbiAgbGV0IHZpc2liaWxpdHkgPSBmZXRjaFNjYWxhck5vMTZCeXRlc0FsaWduZWQoaW5kZXgpO1xuICBpZiAodmlzaWJpbGl0eSA+IDAuNSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4jaWZkZWYgUk5fSVNfVkVSVEVYX1NIQURFUlxuICAjaWZkZWYgUk5fSVNfTU9SUEhJTkdcbiAgZm4gZ2V0X3Bvc2l0aW9uKHZlcnRleElkOiB1MzIsIGJhc2VQb3NpdGlvbjogdmVjMzxmMzI+LCBibGVuZFNoYXBlQ29tcG9uZW50U0lEOiB1MzIpIC0+IHZlYzM8ZjMyPiB7XG4gICAgdmFyIHBvc2l0aW9uID0gYmFzZVBvc2l0aW9uO1xuICAgIGxldCBzY2FsYXJfaWR4ID0gM3UgKiB2ZXJ0ZXhJZDtcbiAgICBmb3IgKHZhciBpPTB1OyBpPF9tb3JwaFRhcmdldE51bWJlcjsgaSsrKSB7XG5cbiAgICAgIGxldCBpZHggPSAke0NvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyfXUgKiBfY3VycmVudFByaW1pdGl2ZUlkeCArIGk7XG4gICAgICBsZXQgb2Zmc2V0cyA9IHVuaWZvcm1Nb3JwaE9mZnNldHMuZGF0YVsgaWR4IC8gNHVdO1xuICAgICAgbGV0IG9mZnNldFBvc2l0aW9uID0gb2Zmc2V0c1tpZHggJSA0dV07XG5cbiAgICAgIGxldCBiYXNlUG9zSW40Ynl0ZXMgPSBvZmZzZXRQb3NpdGlvbiAqIDR1ICsgc2NhbGFyX2lkeDtcbiAgICAgIGxldCBhZGRQb3MgPSBmZXRjaFZlYzNObzE2Qnl0ZXNBbGlnbmVkRnJvbUJsZW5kU2hhcGVCdWZmZXIoYmFzZVBvc0luNGJ5dGVzKTtcblxuICAgICAgbGV0IGlkeDIgPSAke0NvbmZpZy5tYXhWZXJ0ZXhNb3JwaE51bWJlckluU2hhZGVyfXUgKiBibGVuZFNoYXBlQ29tcG9uZW50U0lEICsgaTtcbiAgICAgIGxldCBtb3JwaFdlaWdodHM6IHZlYzRmID0gdW5pZm9ybU1vcnBoV2VpZ2h0cy5kYXRhWyBpZHgyIC8gNHVdO1xuICAgICAgbGV0IG1vcnBoV2VpZ2h0OiBmMzIgPSBtb3JwaFdlaWdodHNbaWR4MiAlIDR1XTtcbiAgICAgIHBvc2l0aW9uICs9IGFkZFBvcyAqIG1vcnBoV2VpZ2h0O1xuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuICAjZW5kaWZcbiNlbmRpZlxuXG5gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX19nZXRTaGFkZXJQcm9wZXJ0eShcbiAgICBtYXRlcmlhbFR5cGVOYW1lOiBzdHJpbmcsXG4gICAgaW5mbzogU2hhZGVyU2VtYW50aWNzSW5mbyxcbiAgICBpc0dsb2JhbERhdGE6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IGluZm8uY29tcG9zaXRpb25UeXBlLnRvV0dTTFR5cGUoaW5mby5jb21wb25lbnRUeXBlKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gaW5mby5zZW1hbnRpYy5yZXBsYWNlKCcuJywgJ18nKTtcbiAgICBjb25zdCBpc1RleHR1cmUgPSBDb21wb3NpdGlvblR5cGUuaXNUZXh0dXJlKGluZm8uY29tcG9zaXRpb25UeXBlKTtcblxuICAgIGlmIChpc1RleHR1cmUpIHtcbiAgICAgIGNvbnN0IGlzQ3ViZU1hcCA9IGluZm8uY29tcG9zaXRpb25UeXBlID09PSBDb21wb3NpdGlvblR5cGUuVGV4dHVyZUN1YmU7XG4gICAgICBjb25zdCB0ZXh0dXJlVHlwZSA9IGlzQ3ViZU1hcCA/ICd0ZXh0dXJlX2N1YmU8ZjMyPicgOiAndGV4dHVyZV8yZDxmMzI+JztcbiAgICAgIGNvbnN0IHNhbXBsZXJOYW1lID0gbWV0aG9kTmFtZS5yZXBsYWNlKCdUZXh0dXJlJywgJ1NhbXBsZXInKTtcbiAgICAgIHJldHVybiBgXG5AZ3JvdXAoMSkgQGJpbmRpbmcoJHtpbmZvLmluaXRpYWxWYWx1ZVswXX0pIHZhciAke21ldGhvZE5hbWV9OiAke3RleHR1cmVUeXBlfTtcbkBncm91cCgyKSBAYmluZGluZygke2luZm8uaW5pdGlhbFZhbHVlWzBdfSkgdmFyICR7c2FtcGxlck5hbWV9OiBzYW1wbGVyO1xuYDtcbiAgICB9XG5cbiAgICAvLyBpbm5lciBjb250ZW50cyBvZiAnZ2V0Xycgc2hhZGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgdmVjNFNpemVPZlByb3BlcnR5OiBJbmRleE9mMTZCeXRlcyA9IGluZm8uY29tcG9zaXRpb25UeXBlLmdldFZlYzRTaXplT2ZQcm9wZXJ0eSgpO1xuICAgIC8vIGZvciBub24tYGluZGV4YCBwcm9wZXJ0eSAodGhpcyBpcyBnZW5lcmFsIGNhc2UpXG4gICAgY29uc3Qgc2NhbGFyU2l6ZU9mUHJvcGVydHk6IEluZGV4T2Y0Qnl0ZXMgPSBpbmZvLmNvbXBvc2l0aW9uVHlwZS5nZXROdW1iZXJPZkNvbXBvbmVudHMoKTtcbiAgICBjb25zdCBvZmZzZXRPZlByb3BlcnR5OiBJbmRleE9mMTZCeXRlcyA9IFdlYkdwdVN0cmF0ZWd5QmFzaWMuZ2V0T2Zmc2V0T2ZQcm9wZXJ0eUluU2hhZGVyKFxuICAgICAgaXNHbG9iYWxEYXRhLFxuICAgICAgaW5mby5zZW1hbnRpYyxcbiAgICAgIG1hdGVyaWFsVHlwZU5hbWVcbiAgICApO1xuXG4gICAgaWYgKG9mZnNldE9mUHJvcGVydHkgPT09IC0xKSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ0NvdWxkIG5vdCBnZXQgdGhlIGxvY2F0aW9uIG9mZnNldCBvZiB0aGUgcHJvcGVydHkuJyk7XG4gICAgfVxuXG4gICAgbGV0IGluZGV4U3RyO1xuICAgIGxldCBpbnN0YW5jZVNpemUgPSB2ZWM0U2l6ZU9mUHJvcGVydHk7XG4gICAgaW5kZXhTdHIgPSBgICBsZXQgdmVjNF9pZHg6IHUzMiA9ICR7b2Zmc2V0T2ZQcm9wZXJ0eX11ICsgJHtpbnN0YW5jZVNpemV9dSAqIGluc3RhbmNlSWQ7XFxuYDtcbiAgICBpZiAoQ29tcG9zaXRpb25UeXBlLmlzQXJyYXkoaW5mby5jb21wb3NpdGlvblR5cGUpKSB7XG4gICAgICBpbnN0YW5jZVNpemUgPSB2ZWM0U2l6ZU9mUHJvcGVydHkgKiAoaW5mby5hcnJheUxlbmd0aCA/PyAxKTtcbiAgICAgIGNvbnN0IHBhZGRlZEFzVmVjNCA9IE1hdGguY2VpbChzY2FsYXJTaXplT2ZQcm9wZXJ0eSAvIDQpICogNDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2l6ZUluU2NhbGFyID0gcGFkZGVkQXNWZWM0ICogKGluZm8uYXJyYXlMZW5ndGggPz8gMSk7XG4gICAgICBpbmRleFN0ciA9IGAgIGxldCB2ZWM0X2lkeDogdTMyID0gJHtvZmZzZXRPZlByb3BlcnR5fXUgKyAke2luc3RhbmNlU2l6ZX0gKiBpbnN0YW5jZUlkICsgJHt2ZWM0U2l6ZU9mUHJvcGVydHl9dSAqIGlkeE9mQXJyYXk7XFxuYDtcbiAgICAgIGluZGV4U3RyICs9IGAgIGxldCBzY2FsYXJfaWR4OiB1MzIgPSAke1xuICAgICAgICAvLyBJbmRleE9mNEJ5dGVzXG4gICAgICAgIG9mZnNldE9mUHJvcGVydHkgKiA0IC8vIEluZGV4T2YxNmJ5dGVzIHRvIEluZGV4T2Y0Qnl0ZXNcbiAgICAgIH0gKyAke2luc3RhbmNlU2l6ZUluU2NhbGFyfSAqIGluc3RhbmNlSWQgKyAke3NjYWxhclNpemVPZlByb3BlcnR5fXUgKiBpZHhPZkFycmF5O1xcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RQYXJ0T2ZJbm5lckZ1bmMgPSBgXG5mbiBnZXRfJHttZXRob2ROYW1lfShpbnN0YW5jZUlkOiB1MzIsIGlkeE9mQXJyYXk6IHUzMikgLT4gJHtyZXR1cm5UeXBlfSB7XG4ke2luZGV4U3RyfVxuYDtcblxuICAgIGxldCBzdHIgPSBgJHtmaXJzdFBhcnRPZklubmVyRnVuY31gO1xuXG4gICAgc3dpdGNoIChpbmZvLmNvbXBvc2l0aW9uVHlwZSkge1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuVmVjNDpcbiAgICAgIGNhc2UgQ29tcG9zaXRpb25UeXBlLlZlYzRBcnJheTpcbiAgICAgICAgc3RyICs9ICcgIGxldCB2YWwgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuVmVjMzpcbiAgICAgICAgc3RyICs9ICcgIGxldCBjb2wwID0gZmV0Y2hFbGVtZW50KHZlYzRfaWR4KTtcXG4nO1xuICAgICAgICBzdHIgKz0gYCAgbGV0IHZhbCA9ICR7cmV0dXJuVHlwZX0oY29sMC54eXopO2A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuVmVjM0FycmF5OlxuICAgICAgICBzdHIgKz0gJyAgbGV0IHZhbCA9IGZldGNoVmVjM05vMTZCeXRlc0FsaWduZWQoc2NhbGFyX2lkeCk7XFxuJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5WZWMyOlxuICAgICAgICBzdHIgKz0gJyAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgIHN0ciArPSBgICBsZXQgdmFsID0gJHtyZXR1cm5UeXBlfShjb2wwLnh5KTtgO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tcG9zaXRpb25UeXBlLlZlYzJBcnJheTpcbiAgICAgICAgc3RyICs9ICcgIGxldCB2YWwgPSBmZXRjaFZlYzJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHgpO1xcbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuU2NhbGFyOlxuICAgICAgICBzdHIgKz0gJyAgbGV0IGNvbDAgPSBmZXRjaEVsZW1lbnQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgIGlmIChpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuSW50KSB7XG4gICAgICAgICAgc3RyICs9IGAgIGxldCB2YWwgPSBpMzIoY29sMC54KTtgO1xuICAgICAgICB9IGVsc2UgaWYgKGluZm8uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5VbnNpZ25lZEludCkge1xuICAgICAgICAgIHN0ciArPSAnICBsZXQgdmFsID0gdTMyKGNvbDAueCk7JztcbiAgICAgICAgfSBlbHNlIGlmIChpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuQm9vbCkge1xuICAgICAgICAgIHN0ciArPSBgICBsZXQgdmFsID0gY29sMC54ID49IDAuNTtgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciArPSAnICBsZXQgdmFsID0gY29sMC54Oyc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5TY2FsYXJBcnJheTpcbiAgICAgICAgc3RyICs9ICcgIGxldCBjb2wwID0gZmV0Y2hTY2FsYXJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHgpO1xcbic7XG4gICAgICAgIGlmIChpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuSW50KSB7XG4gICAgICAgICAgc3RyICs9ICcgIGxldCB2YWwgPSBpMzIoY29sMCk7JztcbiAgICAgICAgfSBlbHNlIGlmIChpbmZvLmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuVW5zaWduZWRJbnQpIHtcbiAgICAgICAgICBzdHIgKz0gJyAgbGV0IHZhbCA9IHUzMihjb2wwKTsnO1xuICAgICAgICB9IGVsc2UgaWYgKGluZm8uY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5Cb29sKSB7XG4gICAgICAgICAgc3RyICs9ICcgIGxldCB2YWwgPSBjb2wwID49IDAuNTsnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciArPSAnICBsZXQgdmFsID0gY29sMDsnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuTWF0NDpcbiAgICAgICAgc3RyICs9ICcgIGxldCB2YWwgPSBmZXRjaE1hdDQodmVjNF9pZHgpO1xcbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuTWF0NEFycmF5OlxuICAgICAgICBzdHIgKz0gJyAgbGV0IHZhbCA9IGZldGNoTWF0NCh2ZWM0X2lkeCk7XFxuJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5NYXQzOlxuICAgICAgICBzdHIgKz0gJyAgbGV0IHZhbCA9IGZldGNoTWF0Myh2ZWM0X2lkeCk7XFxuJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbXBvc2l0aW9uVHlwZS5NYXQzQXJyYXk6XG4gICAgICAgIHN0ciArPSAnICBsZXQgdmFsID0gZmV0Y2hNYXQzTm8xNkJ5dGVzQWxpZ25lZChzY2FsYXJfaWR4KTtcXG4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tcG9zaXRpb25UeXBlLk1hdDI6XG4gICAgICAgIHN0ciArPSAnICBsZXQgdmFsID0gZmV0Y2hNYXQyKHZlYzRfaWR4KTtcXG4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tcG9zaXRpb25UeXBlLk1hdDJBcnJheTpcbiAgICAgICAgc3RyICs9ICcgIGxldCB2YWwgPSBmZXRjaE1hdDJObzE2Qnl0ZXNBbGlnbmVkKHNjYWxhcl9pZHgpO1xcbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21wb3NpdGlvblR5cGUuTWF0NHgzQXJyYXk6XG4gICAgICAgIHN0ciArPSAnICBsZXQgdmFsID0gZmV0Y2hNYXQ0eDModmVjNF9pZHgpO1xcbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gTG9nZ2VyLmVycm9yKCd1bmtub3duIGNvbXBvc2l0aW9uIHR5cGUnLCBpbmZvLmNvbXBvc2l0aW9uVHlwZS5zdHIsIG1lbWJlck5hbWUpO1xuICAgICAgICBzdHIgKz0gJyc7XG4gICAgfVxuICAgIHN0ciArPSBgXG4gIHJldHVybiB2YWw7XG59XG5gO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T2Zmc2V0T2ZQcm9wZXJ0eUluU2hhZGVyKFxuICAgIGlzR2xvYmFsRGF0YTogYm9vbGVhbixcbiAgICBwcm9wZXJ0eU5hbWU6IFNoYWRlclNlbWFudGljc05hbWUsXG4gICAgbWF0ZXJpYWxUeXBlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIGlmIChpc0dsb2JhbERhdGEpIHtcbiAgICAgIGNvbnN0IGdsb2JhbERhdGFSZXBvc2l0b3J5ID0gR2xvYmFsRGF0YVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IGRhdGFCZWdpblBvcyA9IGdsb2JhbERhdGFSZXBvc2l0b3J5LmdldExvY2F0aW9uT2Zmc2V0T2ZQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgcmV0dXJuIGRhdGFCZWdpblBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YUJlZ2luUG9zID0gTWF0ZXJpYWxSZXBvc2l0b3J5LmdldExvY2F0aW9uT2Zmc2V0T2ZNZW1iZXJPZk1hdGVyaWFsKFxuICAgICAgICBtYXRlcmlhbFR5cGVOYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGF0YUJlZ2luUG9zO1xuICAgIH1cbiAgfVxuXG4gICRsb2FkKG1lc2hDb21wb25lbnQ6IE1lc2hDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBtZXNoID0gbWVzaENvbXBvbmVudC5tZXNoO1xuICAgIGlmIChtZXNoID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBzZXR1cCBWQk8gYW5kIFZBT1xuICAgIGlmICghbWVzaC5pc1NldFVwRG9uZSgpKSB7XG4gICAgICB1cGRhdGVWQk9BbmRWQU8obWVzaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb21tb25fJGxvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX191bmlmb3JtTW9ycGhPZmZzZXRzVHlwZWRBcnJheSA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9fdW5pZm9ybU1vcnBoT2Zmc2V0c1R5cGVkQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICAoQ29uZmlnLm1heFZlcnRleFByaW1pdGl2ZU51bWJlckluU2hhZGVyICogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpIC8gNFxuICAgICAgICApICogNFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX3VuaWZvcm1Nb3JwaFdlaWdodHNUeXBlZEFycmF5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuX191bmlmb3JtTW9ycGhXZWlnaHRzVHlwZWRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICAoQ29uZmlnLm1heFZlcnRleFByaW1pdGl2ZU51bWJlckluU2hhZGVyICogQ29uZmlnLm1heFZlcnRleE1vcnBoTnVtYmVySW5TaGFkZXIpIC8gNFxuICAgICAgICApICogNFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBCbGVuZFNoYXBlQ29tcG9uZW50LnVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGFzdEJsZW5kU2hhcGVDb21wb25lbnRzVXBkYXRlQ291bnRGb3JCbGVuZERhdGFcbiAgICApIHtcbiAgICAgIHRoaXMuX19jcmVhdGVPclVwZGF0ZVN0b3JhZ2VCbGVuZFNoYXBlQnVmZmVyKCk7XG4gICAgICB0aGlzLl9fbGFzdEJsZW5kU2hhcGVDb21wb25lbnRzVXBkYXRlQ291bnRGb3JCbGVuZERhdGEgPSBCbGVuZFNoYXBlQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19zZXR1cFNoYWRlclByb2dyYW1Gb3JNZXNoQ29tcG9uZW50KG1lc2hDb21wb25lbnQ6IE1lc2hDb21wb25lbnQpIHtcbiAgICBpZiAobWVzaENvbXBvbmVudC5tZXNoID09IG51bGwpIHtcbiAgICAgIE1lc2hDb21wb25lbnQuYWxlcnROb01lc2hTZXQobWVzaENvbXBvbmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWl0aXZlTnVtID0gbWVzaENvbXBvbmVudC5tZXNoLmdldFByaW1pdGl2ZU51bWJlcigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpbWl0aXZlTnVtOyBpKyspIHtcbiAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IG1lc2hDb21wb25lbnQubWVzaC5nZXRQcmltaXRpdmVBdChpKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gcHJpbWl0aXZlLm1hdGVyaWFsO1xuICAgICAgdGhpcy5fc2V0dXBTaGFkZXJQcm9ncmFtKG1hdGVyaWFsLCBwcmltaXRpdmUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwU2hhZGVyUHJvZ3JhbShtYXRlcmlhbDogTWF0ZXJpYWwsIHByaW1pdGl2ZTogUHJpbWl0aXZlKSB7XG4gICAgaWYgKG1hdGVyaWFsID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWF0ZXJpYWwuaXNTaGFkZXJQcm9ncmFtUmVhZHkocHJpbWl0aXZlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnNldHVwU2hhZGVyRm9yTWF0ZXJpYWwoXG4gICAgICAgIG1hdGVyaWFsLFxuICAgICAgICBwcmltaXRpdmUsXG4gICAgICAgIFdlYkdwdVN0cmF0ZWd5QmFzaWMuZ2V0VmVydGV4U2hhZGVyTWV0aG9kRGVmaW5pdGlvbnNfc3RvcmFnZUJ1ZmZlcigpLFxuICAgICAgICBXZWJHcHVTdHJhdGVneUJhc2ljLl9fZ2V0U2hhZGVyUHJvcGVydHlcbiAgICAgICk7XG4gICAgICBwcmltaXRpdmUuX2JhY2t1cE1hdGVyaWFsKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgTG9nZ2VyLmVycm9yKGUgYXMgc3RyaW5nKTtcbiAgICAgIHByaW1pdGl2ZS5fcmVzdG9yZU1hdGVyaWFsKCk7XG4gICAgICB0aGlzLnNldHVwU2hhZGVyRm9yTWF0ZXJpYWwoXG4gICAgICAgIHByaW1pdGl2ZS5tYXRlcmlhbCxcbiAgICAgICAgcHJpbWl0aXZlLFxuICAgICAgICBXZWJHcHVTdHJhdGVneUJhc2ljLmdldFZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zX3N0b3JhZ2VCdWZmZXIoKSxcbiAgICAgICAgV2ViR3B1U3RyYXRlZ3lCYXNpYy5fX2dldFNoYWRlclByb3BlcnR5XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXR1cCBzaGFkZXIgcHJvZ3JhbSBmb3IgdGhlIG1hdGVyaWFsIGluIHRoaXMgV2ViR0wgc3RyYXRlZ3lcbiAgICogQHBhcmFtIG1hdGVyaWFsIC0gYSBtYXRlcmlhbCB0byBzZXR1cCBzaGFkZXIgcHJvZ3JhbVxuICAgKi9cbiAgcHVibGljIHNldHVwU2hhZGVyRm9yTWF0ZXJpYWwoXG4gICAgbWF0ZXJpYWw6IE1hdGVyaWFsLFxuICAgIHByaW1pdGl2ZTogUHJpbWl0aXZlLFxuICAgIHZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zOiBzdHJpbmcsXG4gICAgcHJvcGVydHlTZXR0ZXI6IGdldFNoYWRlclByb3BlcnR5RnVuY1xuICApOiB2b2lkIHtcbiAgICBtYXRlcmlhbC5fY3JlYXRlUHJvZ3JhbVdlYkdwdShwcmltaXRpdmUsIHZlcnRleFNoYWRlck1ldGhvZERlZmluaXRpb25zLCBwcm9wZXJ0eVNldHRlcik7XG4gIH1cblxuICByZW5kZXJXaXRoUmVuZGVyQnVuZGxlKHJlbmRlclBhc3M6IFJlbmRlclBhc3MpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkgPSBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmV4ZWN1dGVSZW5kZXJCdW5kbGUocmVuZGVyUGFzcyk7XG4gIH1cblxuICBwcmVyZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgQW5pbWF0aW9uQ29tcG9uZW50LmlzQW5pbWF0aW5nIHx8XG4gICAgICBUcmFuc2Zvcm1Db21wb25lbnQudXBkYXRlQ291bnQgIT09IHRoaXMuX19sYXN0VHJhbnNmb3JtQ29tcG9uZW50c1VwZGF0ZUNvdW50IHx8XG4gICAgICBTY2VuZUdyYXBoQ29tcG9uZW50LnVwZGF0ZUNvdW50ICE9PSB0aGlzLl9fbGFzdFNjZW5lR3JhcGhDb21wb25lbnRzVXBkYXRlQ291bnQgfHxcbiAgICAgIENhbWVyYUNvbnRyb2xsZXJDb21wb25lbnQudXBkYXRlQ291bnQgIT09IHRoaXMuX19sYXN0Q2FtZXJhQ29udHJvbGxlckNvbXBvbmVudHNVcGRhdGVDb3VudCB8fFxuICAgICAgTWF0ZXJpYWwuc3RhdGVWZXJzaW9uICE9PSB0aGlzLl9fbGFzdE1hdGVyaWFsc1VwZGF0ZUNvdW50XG4gICAgKSB7XG4gICAgICB0aGlzLl9fY3JlYXRlQW5kVXBkYXRlU3RvcmFnZUJ1ZmZlcigpO1xuICAgICAgdGhpcy5fX2xhc3RUcmFuc2Zvcm1Db21wb25lbnRzVXBkYXRlQ291bnQgPSBUcmFuc2Zvcm1Db21wb25lbnQudXBkYXRlQ291bnQ7XG4gICAgICB0aGlzLl9fbGFzdFNjZW5lR3JhcGhDb21wb25lbnRzVXBkYXRlQ291bnQgPSBTY2VuZUdyYXBoQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICAgICAgdGhpcy5fX2xhc3RDYW1lcmFDb250cm9sbGVyQ29tcG9uZW50c1VwZGF0ZUNvdW50ID0gQ2FtZXJhQ29udHJvbGxlckNvbXBvbmVudC51cGRhdGVDb3VudDtcbiAgICAgIHRoaXMuX19sYXN0TWF0ZXJpYWxzVXBkYXRlQ291bnQgPSBNYXRlcmlhbC5zdGF0ZVZlcnNpb247XG4gICAgfVxuXG4gICAgaWYgKEJsZW5kU2hhcGVDb21wb25lbnQudXBkYXRlQ291bnQgIT09IHRoaXMuX19sYXN0QmxlbmRTaGFwZUNvbXBvbmVudHNVcGRhdGVDb3VudEZvcldlaWdodHMpIHtcbiAgICAgIHRoaXMuX191cGRhdGVVbmlmb3JtTW9ycGgoKTtcbiAgICAgIHRoaXMuX19sYXN0QmxlbmRTaGFwZUNvbXBvbmVudHNVcGRhdGVDb3VudEZvcldlaWdodHMgPSBCbGVuZFNoYXBlQ29tcG9uZW50LnVwZGF0ZUNvdW50O1xuICAgIH1cbiAgfVxuICBjb21tb25fJHJlbmRlcihcbiAgICBwcmltaXRpdmVVaWRzOiBQcmltaXRpdmVVSURbXSxcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIHJlbmRlclBhc3NUaWNrQ291bnQ6IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBpZiAocmVuZGVyUGFzcy5pc0J1ZmZlckxlc3NSZW5kZXJpbmdNb2RlKCkpIHtcbiAgICAgIHRoaXMuX19yZW5kZXJXaXRob3V0QnVmZmVycyhyZW5kZXJQYXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxldCByZW5kZXJlZFNvbWV0aGluZyA9IGZhbHNlO1xuICAgIC8vIEZvciBvcGFxdWUgcHJpbWl0aXZlc1xuICAgIGlmIChyZW5kZXJQYXNzLl90b1JlbmRlck9wYXF1ZVByaW1pdGl2ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHJlbmRlclBhc3MuX2xhc3RPcGFxdWVJbmRleDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZVVpZCA9IHByaW1pdGl2ZVVpZHNbaV07XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gdGhpcy5yZW5kZXJJbm5lcihwcmltaXRpdmVVaWQsIHJlbmRlclBhc3MsIHRydWUpO1xuICAgICAgICByZW5kZXJlZFNvbWV0aGluZyB8fD0gcmVuZGVyZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHRyYW5zbHVjZW50IHByaW1pdGl2ZXNcbiAgICBpZiAocmVuZGVyUGFzcy5fdG9SZW5kZXJUcmFuc3BhcmVudFByaW1pdGl2ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJQYXNzLl9sYXN0T3BhcXVlSW5kZXggKyAxOyBpIDw9IHJlbmRlclBhc3MuX2xhc3RUcmFuc2x1Y2VudEluZGV4OyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlVWlkID0gcHJpbWl0aXZlVWlkc1tpXTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLnJlbmRlcklubmVyKHByaW1pdGl2ZVVpZCwgcmVuZGVyUGFzcywgdHJ1ZSk7XG4gICAgICAgIHJlbmRlcmVkU29tZXRoaW5nIHx8PSByZW5kZXJlZDtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IHJlbmRlclBhc3MuX2xhc3RUcmFuc2x1Y2VudEluZGV4ICsgMTsgaSA8PSByZW5kZXJQYXNzLl9sYXN0QmxlbmRJbmRleDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZVVpZCA9IHByaW1pdGl2ZVVpZHNbaV07XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gdGhpcy5yZW5kZXJJbm5lcihwcmltaXRpdmVVaWQsIHJlbmRlclBhc3MsIGZhbHNlKTtcbiAgICAgICAgcmVuZGVyZWRTb21ldGhpbmcgfHw9IHJlbmRlcmVkO1xuICAgICAgfVxuICAgICAgLy8gZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZFNvbWV0aGluZztcbiAgfVxuXG4gIHByaXZhdGUgX19yZW5kZXJXaXRob3V0QnVmZmVycyhyZW5kZXJQYXNzOiBSZW5kZXJQYXNzKSB7XG4gICAgY29uc3QgbWF0ZXJpYWwgPSByZW5kZXJQYXNzLm1hdGVyaWFsITtcbiAgICBjb25zdCBwcmltaXRpdmUgPSByZW5kZXJQYXNzLl9kdW1teVByaW1pdGl2ZUZvckJ1ZmZlckxlc3NSZW5kZXJpbmc7XG4gICAgdGhpcy5fc2V0dXBTaGFkZXJQcm9ncmFtKG1hdGVyaWFsLCBwcmltaXRpdmUpO1xuXG4gICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID0gV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmRyYXcocHJpbWl0aXZlLCBtYXRlcmlhbCwgcmVuZGVyUGFzcywgMCwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXJJbm5lcihwcmltaXRpdmVVaWQ6IFByaW1pdGl2ZVVJRCwgcmVuZGVyUGFzczogUmVuZGVyUGFzcywgaXNPcGFxdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAocHJpbWl0aXZlVWlkID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwcmltaXRpdmUgPSBQcmltaXRpdmUuZ2V0UHJpbWl0aXZlKHByaW1pdGl2ZVVpZCk7XG4gICAgaWYgKHByaW1pdGl2ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHJlbmRlclBhc3MuZ2V0QXBwcm9wcmlhdGVNYXRlcmlhbChwcmltaXRpdmUpO1xuICAgIHRoaXMuX3NldHVwU2hhZGVyUHJvZ3JhbShtYXRlcmlhbCwgcHJpbWl0aXZlKTtcbiAgICBpZiAoaXNTa2lwRHJhd2luZyhtYXRlcmlhbCwgcHJpbWl0aXZlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSA9IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGNhbWVyYVNJRCA9IHRoaXMuX19nZXRBcHByb3ByaWF0ZUNhbWVyYUNvbXBvbmVudFNJRChyZW5kZXJQYXNzLCAwLCBmYWxzZSk7XG4gICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmRyYXcocHJpbWl0aXZlLCBtYXRlcmlhbCwgcmVuZGVyUGFzcywgY2FtZXJhU0lELCBpc09wYXF1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVBbmRVcGRhdGVTdG9yYWdlQnVmZmVyKCkge1xuICAgIGNvbnN0IG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIgPSBNZW1vcnlNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cbiAgICAvLyB0aGUgR1BVIGdsb2JhbCBTdG9yYWdlXG4gICAgY29uc3QgZ3B1SW5zdGFuY2VEYXRhQnVmZmVyOiBCdWZmZXIgfCB1bmRlZmluZWQgPSBtZW1vcnlNYW5hZ2VyLmdldEJ1ZmZlcihcbiAgICAgIEJ1ZmZlclVzZS5HUFVJbnN0YW5jZURhdGFcbiAgICApO1xuXG4gICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID0gV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG4gICAgLy8gY29uc3QgZGF0YVRleHR1cmVCeXRlU2l6ZSA9XG4gICAgLy8gICBNZW1vcnlNYW5hZ2VyLmJ1ZmZlcldpZHRoTGVuZ3RoICogTWVtb3J5TWFuYWdlci5idWZmZXJIZWlnaHRMZW5ndGggKiA0ICogNDtcbiAgICBjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGdwdUluc3RhbmNlRGF0YUJ1ZmZlciEuZ2V0QXJyYXlCdWZmZXIoKSk7XG4gICAgaWYgKHRoaXMuX19zdG9yYWdlQnVmZmVyVWlkICE9PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICBjb25zdCBkYXRhU2l6ZUZvckRhdGFUZXh0dXJlID0gZ3B1SW5zdGFuY2VEYXRhQnVmZmVyIS50YWtlblNpemVJbkJ5dGUgLyA0O1xuICAgICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LnVwZGF0ZVN0b3JhZ2VCdWZmZXIoXG4gICAgICAgIHRoaXMuX19zdG9yYWdlQnVmZmVyVWlkLFxuICAgICAgICBmbG9hdDMyQXJyYXksXG4gICAgICAgIGRhdGFTaXplRm9yRGF0YVRleHR1cmVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZVxuICAgICAgdGhpcy5fX3N0b3JhZ2VCdWZmZXJVaWQgPSB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlU3RvcmFnZUJ1ZmZlcihmbG9hdDMyQXJyYXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19jcmVhdGVPclVwZGF0ZVN0b3JhZ2VCbGVuZFNoYXBlQnVmZmVyKCkge1xuICAgIGNvbnN0IG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIgPSBNZW1vcnlNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cbiAgICAvLyB0aGUgR1BVIGdsb2JhbCBTdG9yYWdlXG4gICAgY29uc3QgYmxlbmRTaGFwZURhdGFCdWZmZXI6IEJ1ZmZlciB8IHVuZGVmaW5lZCA9IG1lbW9yeU1hbmFnZXIuZ2V0QnVmZmVyKFxuICAgICAgQnVmZmVyVXNlLkdQVVZlcnRleERhdGFcbiAgICApO1xuXG4gICAgaWYgKGJsZW5kU2hhcGVEYXRhQnVmZmVyID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkgPSBXZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGJsZW5kU2hhcGVEYXRhQnVmZmVyIS5nZXRBcnJheUJ1ZmZlcigpKTtcbiAgICBpZiAodGhpcy5fX3N0b3JhZ2VCbGVuZFNoYXBlQnVmZmVyVWlkICE9PSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5JbnZhbGlkQ0dBUElSZXNvdXJjZVVpZCkge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICBjb25zdCBjb21wb25lbnRTaXplRm9yRGF0YVRleHR1cmUgPSBibGVuZFNoYXBlRGF0YUJ1ZmZlciEudGFrZW5TaXplSW5CeXRlIC8gNDtcbiAgICAgIHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeS51cGRhdGVTdG9yYWdlQmxlbmRTaGFwZUJ1ZmZlcihcbiAgICAgICAgdGhpcy5fX3N0b3JhZ2VCbGVuZFNoYXBlQnVmZmVyVWlkLFxuICAgICAgICBmbG9hdDMyQXJyYXksXG4gICAgICAgIGNvbXBvbmVudFNpemVGb3JEYXRhVGV4dHVyZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlXG4gICAgICB0aGlzLl9fc3RvcmFnZUJsZW5kU2hhcGVCdWZmZXJVaWQgPVxuICAgICAgICB3ZWJHcHVSZXNvdXJjZVJlcG9zaXRvcnkuY3JlYXRlU3RvcmFnZUJsZW5kU2hhcGVCdWZmZXIoZmxvYXQzMkFycmF5KTtcbiAgICB9XG5cbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBDb25maWcubWF4VmVydGV4UHJpbWl0aXZlTnVtYmVySW5TaGFkZXI7IGkrKykge1xuICAgICAgY29uc3QgcHJpbWl0aXZlID0gUHJpbWl0aXZlLmdldFByaW1pdGl2ZUhhc01vcnBoKGkpO1xuICAgICAgaWYgKHByaW1pdGl2ZSAhPSBudWxsKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcHJpbWl0aXZlLnRhcmdldHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBwcmltaXRpdmUudGFyZ2V0c1tqXTtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NvciA9IHRhcmdldC5nZXQoVmVydGV4QXR0cmlidXRlLlBvc2l0aW9uLlhZWikgYXMgQWNjZXNzb3I7XG4gICAgICAgICAgdGhpcy5fX3VuaWZvcm1Nb3JwaE9mZnNldHNUeXBlZEFycmF5IVtDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlciAqIGkgKyBqXSA9XG4gICAgICAgICAgICBhY2Nlc3Nvci5ieXRlT2Zmc2V0SW5CdWZmZXIgLyA0IC8gNDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnROdW1Ub0NvcHkgPSBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlciAqIGk7XG4gICAgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LnVwZGF0ZVVuaWZvcm1Nb3JwaE9mZnNldHNCdWZmZXIoXG4gICAgICB0aGlzLl9fdW5pZm9ybU1vcnBoT2Zmc2V0c1R5cGVkQXJyYXkhLFxuICAgICAgZWxlbWVudE51bVRvQ29weVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fdXBkYXRlVW5pZm9ybU1vcnBoKCkge1xuICAgIGNvbnN0IG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIgPSBNZW1vcnlNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgYmxlbmRTaGFwZURhdGFCdWZmZXI6IEJ1ZmZlciB8IHVuZGVmaW5lZCA9IG1lbW9yeU1hbmFnZXIuZ2V0QnVmZmVyKFxuICAgICAgQnVmZmVyVXNlLkdQVVZlcnRleERhdGFcbiAgICApO1xuICAgIGlmIChibGVuZFNoYXBlRGF0YUJ1ZmZlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5ID0gV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LmdldEluc3RhbmNlKCk7XG5cbiAgICBjb25zdCBibGVuZFNoYXBlQ29tcG9uZW50cyA9IENvbXBvbmVudFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50c1dpdGhUeXBlKEJsZW5kU2hhcGVDb21wb25lbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxlbmRTaGFwZUNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJsZW5kU2hhcGVDb21wb25lbnQgPSBibGVuZFNoYXBlQ29tcG9uZW50c1tpXSBhcyBCbGVuZFNoYXBlQ29tcG9uZW50O1xuICAgICAgY29uc3Qgd2VpZ2h0cyA9IGJsZW5kU2hhcGVDb21wb25lbnQhLndlaWdodHM7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdlaWdodHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdGhpcy5fX3VuaWZvcm1Nb3JwaFdlaWdodHNUeXBlZEFycmF5IVtcbiAgICAgICAgICBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlciAqIGJsZW5kU2hhcGVDb21wb25lbnQuY29tcG9uZW50U0lEICsgalxuICAgICAgICBdID0gd2VpZ2h0c1tqXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJsZW5kU2hhcGVDb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVsZW1lbnROdW1Ub0NvcHkgPSBDb25maWcubWF4VmVydGV4TW9ycGhOdW1iZXJJblNoYWRlciAqIGJsZW5kU2hhcGVDb21wb25lbnRzLmxlbmd0aDtcbiAgICAgIHdlYkdwdVJlc291cmNlUmVwb3NpdG9yeS51cGRhdGVVbmlmb3JtTW9ycGhXZWlnaHRzQnVmZmVyKFxuICAgICAgICB0aGlzLl9fdW5pZm9ybU1vcnBoV2VpZ2h0c1R5cGVkQXJyYXkhLFxuICAgICAgICBlbGVtZW50TnVtVG9Db3B5XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX19nZXRBcHByb3ByaWF0ZUNhbWVyYUNvbXBvbmVudFNJRChcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzLFxuICAgIGRpc3BsYXlJZHg6IDAgfCAxLFxuICAgIGlzVlJNYWluUGFzczogYm9vbGVhblxuICApOiBudW1iZXIge1xuICAgIGlmIChpc1ZSTWFpblBhc3MpIHtcbiAgICAgIGNvbnN0IHJuWFJNb2R1bGUgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kdWxlKCd4cicpIGFzIFJuWFI7XG4gICAgICBjb25zdCB3ZWJ4clN5c3RlbSA9IHJuWFJNb2R1bGUuV2ViWFJTeXN0ZW0uZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGxldCBjYW1lcmFDb21wb25lbnRTaWQgPSAtMTtcbiAgICAgIGlmICh3ZWJ4clN5c3RlbS5pc1dlYlhSTW9kZSkge1xuICAgICAgICBpZiAod2VieHJTeXN0ZW0uaXNNdWx0aVZpZXcoKSkge1xuICAgICAgICAgIGNhbWVyYUNvbXBvbmVudFNpZCA9IHdlYnhyU3lzdGVtLl9nZXRDYW1lcmFDb21wb25lbnRTSURBdCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYW1lcmFDb21wb25lbnRTaWQgPSB3ZWJ4clN5c3RlbS5fZ2V0Q2FtZXJhQ29tcG9uZW50U0lEQXQoZGlzcGxheUlkeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjYW1lcmFDb21wb25lbnRTaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vbi1WUiBSZW5kZXJpbmdcbiAgICAgIGxldCBjYW1lcmFDb21wb25lbnQgPSByZW5kZXJQYXNzLmNhbWVyYUNvbXBvbmVudDtcbiAgICAgIGlmIChjYW1lcmFDb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICAvLyBpZiB0aGUgcmVuZGVyUGFzcyBoYXMgbm8gY2FtZXJhQ29tcG9uZW50LCB0cnkgdG8gZ2V0IHRoZSBjdXJyZW50IGNhbWVyYUNvbXBvbmVudFxuICAgICAgICBjYW1lcmFDb21wb25lbnQgPSBDb21wb25lbnRSZXBvc2l0b3J5LmdldENvbXBvbmVudChcbiAgICAgICAgICBDYW1lcmFDb21wb25lbnQsXG4gICAgICAgICAgQ2FtZXJhQ29tcG9uZW50LmN1cnJlbnRcbiAgICAgICAgKSBhcyBDYW1lcmFDb21wb25lbnQ7XG4gICAgICB9XG4gICAgICBpZiAoY2FtZXJhQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiBjYW1lcmFDb21wb25lbnQuY29tcG9uZW50U0lEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9XZWJHcHVEZXZpY2VXcmFwcGVyJztcbmV4cG9ydCAqIGZyb20gJy4vV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vV2ViR3B1U3RyYXRlZ3lCYXNpYyc7XG4iLCJpbXBvcnQgeyBXZWJHcHVEZXZpY2VXcmFwcGVyIH0gZnJvbSAnLi9XZWJHcHVEZXZpY2VXcmFwcGVyJztcbmltcG9ydCB7IFdlYkdwdVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4vV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFdlYkdwdVN0cmF0ZWd5QmFzaWMgfSBmcm9tICcuL1dlYkdwdVN0cmF0ZWd5QmFzaWMnO1xuXG5jb25zdCBXZWJHcHUgPSBPYmplY3QuZnJlZXplKHtcbiAgV2ViR3B1RGV2aWNlV3JhcHBlcixcbiAgV2ViR3B1UmVzb3VyY2VSZXBvc2l0b3J5LFxuICBXZWJHcHVTdHJhdGVneUJhc2ljLFxufSk7XG5leHBvcnQgZGVmYXVsdCBXZWJHcHU7XG5cbmV4cG9ydCB0eXBlIFJuV2ViR3B1ID0gdHlwZW9mIFdlYkdwdTtcbigwLCBldmFsKSgndGhpcycpLlJuV2ViR3B1ID0gV2ViR3B1O1xuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5pbXBvcnQgeyBjcmVhdGVDYW1lcmFFbnRpdHkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvbXBvbmVudHMvQ2FtZXJhL2NyZWF0ZUNhbWVyYUVudGl0eSc7XG5pbXBvcnQgeyBJQ2FtZXJhRW50aXR5IH0gZnJvbSAnLi4vZm91bmRhdGlvbi9oZWxwZXJzL0VudGl0eUhlbHBlcic7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IE11dGFibGVRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL011dGFibGVRdWF0ZXJuaW9uJztcbmltcG9ydCB7IE11dGFibGVTY2FsYXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZVNjYWxhcic7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSXMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21pc2MvSXMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL0xvZ2dlcic7XG5pbXBvcnQgeyBJT3B0aW9uLCBOb25lLCBTb21lIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL09wdGlvbic7XG5pbXBvcnQgeyBDR0FQSVJlc291cmNlUmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vcmVuZGVyZXIvQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnknO1xuaW1wb3J0IHsgTW9kdWxlTWFuYWdlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vc3lzdGVtL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHsgU3lzdGVtIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9zeXN0ZW0vU3lzdGVtJztcbmltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuLi93ZWJnbC9XZWJHTENvbnRleHRXcmFwcGVyJztcblxuY29uc3QgZGVmYXVsdFVzZXJQb3NpdGlvbkluVlIgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoWzAuMCwgMS4xLCAwXSk7XG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuXG5leHBvcnQgY2xhc3MgV2ViQVJTeXN0ZW0ge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBXZWJBUlN5c3RlbTtcbiAgcHJpdmF0ZSBfX29HbHc6IElPcHRpb248V2ViR0xDb250ZXh0V3JhcHBlcj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9faXNSZWFkeUZvcldlYkFSID0gZmFsc2U7XG4gIHByaXZhdGUgX19vQXJTZXNzaW9uOiBJT3B0aW9uPFhSU2Vzc2lvbj4gPSBuZXcgTm9uZSgpO1xuICBwcml2YXRlIF9fb1dlYmdsTGF5ZXI6IElPcHRpb248WFJXZWJHTExheWVyPiA9IG5ldyBOb25lKCk7XG4gIHByaXZhdGUgX19zcGFjZVR5cGU6ICdsb2NhbCcgfCAnbG9jYWwtZmxvb3InID0gJ2xvY2FsJztcbiAgcHJpdmF0ZSBfX2lzV2ViQVJNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgX19yZXF1ZXN0ZWRUb0VudGVyV2ViQVIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX29BclZpZXdlclBvc2U6IElPcHRpb248WFJWaWV3ZXJQb3NlPiA9IG5ldyBOb25lKCk7XG4gIHByaXZhdGUgX19vQXJSZWZlcmVuY2VTcGFjZTogSU9wdGlvbjxYUlJlZmVyZW5jZVNwYWNlPiA9IG5ldyBOb25lKCk7XG4gIHByaXZhdGUgX19kZWZhdWx0UG9zaXRpb25JbkxvY2FsU3BhY2VNb2RlID0gZGVmYXVsdFVzZXJQb3NpdGlvbkluVlI7XG4gIHByaXZhdGUgX19jYW52YXNXaWR0aEZvckFSID0gMDtcbiAgcHJpdmF0ZSBfX2NhbnZhc0hlaWdodEZvckFSID0gMDtcbiAgcHJpdmF0ZSBfY2FtZXJhRW50aXR5OiBJQ2FtZXJhRW50aXR5ID0gY3JlYXRlQ2FtZXJhRW50aXR5KCk7XG4gIHByaXZhdGUgX192aWV3ZXJUcmFuc2xhdGUgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgX192aWV3ZXJBemltdXRoQW5nbGUgPSBNdXRhYmxlU2NhbGFyLnplcm8oKTtcbiAgcHJpdmF0ZSBfX3ZpZXdlck9yaWVudGF0aW9uID0gTXV0YWJsZVF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBfX3ZpZXdlclNjYWxlID0gTXV0YWJsZVZlY3RvcjMub25lKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fY2FtZXJhRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnV2ViQVIgVmlld2VyJywgdHJ1ZSk7XG4gICAgdGhpcy5fY2FtZXJhRW50aXR5LnRyeVRvU2V0VGFnKHtcbiAgICAgIHRhZzogJ3R5cGUnLFxuICAgICAgdmFsdWU6ICdiYWNrZ3JvdW5kLWFzc2V0cycsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyBXZWJBUlN5c3RlbSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHkgZm9yIFdlYkFSXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0QnV0dG9uRG9tXG4gICAqIEByZXR1cm5zIHRydWU6IHByZXBhcmVkIHByb3Blcmx5LCBmYWxzZTogZmFpbGVkIHRvIHByZXBhcmVcbiAgICovXG4gIGFzeW5jIHJlYWR5Rm9yV2ViQVIocmVxdWVzdEJ1dHRvbkRvbTogSFRNTEVsZW1lbnQpIHtcbiAgICBhd2FpdCBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZE1vZHVsZSgneHInKTtcblxuICAgIGNvbnN0IGdsdyA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXI7XG4gICAgaWYgKGdsdyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIENvbnRleHQgaXMgbm90IHJlYWR5IHlldC4nKTtcbiAgICB9XG4gICAgdGhpcy5fX29HbHcgPSBuZXcgU29tZShnbHcpO1xuICAgIGNvbnN0IHN1cHBvcnRlZCA9IGF3YWl0IG5hdmlnYXRvci54ciEuaXNTZXNzaW9uU3VwcG9ydGVkKCdpbW1lcnNpdmUtYXInKTtcbiAgICBpZiAoc3VwcG9ydGVkKSB7XG4gICAgICBMb2dnZXIuaW5mbygnV2ViQVIgaXMgc3VwcG9ydGVkLicpO1xuICAgICAgaWYgKHJlcXVlc3RCdXR0b25Eb20pIHtcbiAgICAgICAgcmVxdWVzdEJ1dHRvbkRvbS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKCdpZCcsICdlbnRlci1hcicpO1xuICAgICAgICBjb25zdCBlbnRlclZyID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0VudGVyIEFSJyk7XG5cbiAgICAgICAgYW5jaG9yLmFwcGVuZENoaWxkKGVudGVyVnIpO1xuICAgICAgICBwYXJhZ3JhcGguYXBwZW5kQ2hpbGQoYW5jaG9yKTtcblxuICAgICAgICBjb25zdCBjYW52YXMgPSBnbHcuY2FudmFzO1xuICAgICAgICBjYW52YXMucGFyZW50Tm9kZSEuaW5zZXJ0QmVmb3JlKHBhcmFncmFwaCwgY2FudmFzKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5lbnRlcldlYkFSLmJpbmQodGhpcykgYXMgYW55KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fX2lzUmVhZHlGb3JXZWJBUiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViQVIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LicpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgdG8gV2ViWFIgKEFSIG1vZGUpXG4gICAqIEBwYXJhbSBpbml0aWFsVXNlclBvc2l0aW9uIHRoZSBpbml0aWFsIHVzZXIgcG9zaXRpb24gaW4gd29ybGQgc3BhY2VcbiAgICogQHBhcmFtIGNhbGxiYWNrT25YclNlc3Npb25FbmQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBYclNlc3Npb24gZW5kaW5nXG4gICAqIEByZXR1cm5zIGJvb2xlYW4gdmFsdWUgYWJvdXQgc3VjY2VlZGVkIG9yIG5vdFxuICAgKi9cbiAgYXN5bmMgZW50ZXJXZWJBUih7XG4gICAgaW5pdGlhbFVzZXJQb3NpdGlvbixcbiAgICBjYWxsYmFja09uWHJTZXNzaW9uU3RhcnQgPSAoKSA9PiB7fSxcbiAgICBjYWxsYmFja09uWHJTZXNzaW9uRW5kID0gKCkgPT4ge30sXG4gIH06IHtcbiAgICBpbml0aWFsVXNlclBvc2l0aW9uPzogVmVjdG9yMztcbiAgICBjYWxsYmFja09uWHJTZXNzaW9uU3RhcnQ6ICgpID0+IHZvaWQ7XG4gICAgY2FsbGJhY2tPblhyU2Vzc2lvbkVuZDogKCkgPT4gdm9pZDtcbiAgfSkge1xuICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICBjb25zdCBnbHcgPSB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jdXJyZW50V2ViR0xDb250ZXh0V3JhcHBlcjtcblxuICAgIGlmIChnbHcgIT0gbnVsbCAmJiB0aGlzLl9faXNSZWFkeUZvcldlYkFSKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IG5hdmlnYXRvci54ciEucmVxdWVzdFNlc3Npb24oJ2ltbWVyc2l2ZS12cicpKSBhcyBYUlNlc3Npb247XG4gICAgICB0aGlzLl9fb0FyU2Vzc2lvbiA9IG5ldyBTb21lKHNlc3Npb24pO1xuXG4gICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZ2x3Ll9fZ2wuYmluZEZyYW1lYnVmZmVyKGdsdy5fX2dsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgdGhpcy5fX29BclNlc3Npb24gPSBuZXcgTm9uZSgpO1xuICAgICAgICB0aGlzLl9fb1dlYmdsTGF5ZXIgPSBuZXcgTm9uZSgpO1xuICAgICAgICB0aGlzLl9fb0FyVmlld2VyUG9zZSA9IG5ldyBOb25lKCk7XG4gICAgICAgIHRoaXMuX19vQXJSZWZlcmVuY2VTcGFjZSA9IG5ldyBOb25lKCk7XG4gICAgICAgIHRoaXMuX19zcGFjZVR5cGUgPSAnbG9jYWwnO1xuICAgICAgICB0aGlzLl9faXNSZWFkeUZvcldlYkFSID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX19yZXF1ZXN0ZWRUb0VudGVyV2ViQVIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fX2lzV2ViQVJNb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX19kZWZhdWx0UG9zaXRpb25JbkxvY2FsU3BhY2VNb2RlID0gZGVmYXVsdFVzZXJQb3NpdGlvbkluVlI7XG4gICAgICAgIExvZ2dlci5pbmZvKCdYUlNlc3Npb24gZW5kcy4nKTtcbiAgICAgICAgU3lzdGVtLnN0b3BSZW5kZXJMb29wKCk7XG4gICAgICAgIFN5c3RlbS5yZXN0YXJ0UmVuZGVyTG9vcCgpO1xuICAgICAgICBjYWxsYmFja09uWHJTZXNzaW9uRW5kKCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVmZXJlbmNlU3BhY2UgPSBhd2FpdCBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSgnbG9jYWwnKTtcbiAgICAgIHRoaXMuX19zcGFjZVR5cGUgPSAnbG9jYWwnO1xuICAgICAgdGhpcy5fX2RlZmF1bHRQb3NpdGlvbkluTG9jYWxTcGFjZU1vZGUgPSBpbml0aWFsVXNlclBvc2l0aW9uID8/IGRlZmF1bHRVc2VyUG9zaXRpb25JblZSO1xuICAgICAgdGhpcy5fX29BclJlZmVyZW5jZVNwYWNlID0gbmV3IFNvbWUocmVmZXJlbmNlU3BhY2UpO1xuICAgICAgU3lzdGVtLnN0b3BSZW5kZXJMb29wKCk7XG4gICAgICBhd2FpdCB0aGlzLl9fc2V0dXBXZWJHTExheWVyKHNlc3Npb24sIGNhbGxiYWNrT25YclNlc3Npb25TdGFydCk7XG4gICAgICB0aGlzLl9fcmVxdWVzdGVkVG9FbnRlcldlYkFSID0gdHJ1ZTtcbiAgICAgIFN5c3RlbS5yZXN0YXJ0UmVuZGVyTG9vcCgpO1xuICAgICAgTG9nZ2VyLndhcm4oJ0VuZCBvZiBlbnRlcldlYlhSLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBMb2dnZXIuZXJyb3IoJ1dlYkdMIGNvbnRleHQgb3IgV2ViWFJTZXNzaW9uIGlzIG5vdCByZWFkeSB5ZXQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX3NldHVwV2ViR0xMYXllcih4clNlc3Npb246IFhSU2Vzc2lvbiwgY2FsbGJhY2tPblhyU2Vzc2lvblN0YXJ0OiAoKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fb0dsdy51bndyYXBGb3JjZSgpLmdldFJhd0NvbnRleHQoKTtcblxuICAgIGlmIChnbCAhPSBudWxsKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbnZhcyBjb250ZXh0IHdlIHdhbnQgdG8gdXNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB4ciBkZXZpY2UuXG4gICAgICBhd2FpdCAoZ2wgYXMgYW55KS5tYWtlWFJDb21wYXRpYmxlKCk7XG4gICAgICAvLyBUaGUgY29udGVudCB0aGF0IHdpbGwgYmUgc2hvd24gb24gdGhlIGRldmljZSBpcyBkZWZpbmVkIGJ5IHRoZSBzZXNzaW9uJ3NcbiAgICAgIC8vIGJhc2VMYXllci5cblxuICAgICAgdGhpcy5fX29XZWJnbExheWVyID0gbmV3IFNvbWUod2luZG93LlhSV2ViR0xMYXllcih4clNlc3Npb24sIGdsKSBhcyBYUldlYkdMTGF5ZXIpO1xuICAgICAgY29uc3Qgd2ViZ2xMYXllciA9IHRoaXMuX19vV2ViZ2xMYXllci51bndyYXBGb3JjZSgpO1xuICAgICAgeHJTZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKHtcbiAgICAgICAgYmFzZUxheWVyOiB3ZWJnbExheWVyLFxuICAgICAgICBkZXB0aE5lYXI6IDAuMSxcbiAgICAgICAgZGVwdGhGYXI6IDEwMDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgICB0aGlzLl9fY2FudmFzV2lkdGhGb3JBUiA9IHdlYmdsTGF5ZXIuZnJhbWVidWZmZXJXaWR0aDtcbiAgICAgIHRoaXMuX19jYW52YXNIZWlnaHRGb3JBUiA9IHdlYmdsTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQ7XG4gICAgICBMb2dnZXIuaW5mbyh0aGlzLl9fY2FudmFzV2lkdGhGb3JBUi50b1N0cmluZygpKTtcbiAgICAgIExvZ2dlci5pbmZvKHRoaXMuX19jYW52YXNIZWlnaHRGb3JBUi50b1N0cmluZygpKTtcbiAgICAgIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LnJlc2l6ZUNhbnZhcyh0aGlzLl9fY2FudmFzV2lkdGhGb3JBUiwgdGhpcy5fX2NhbnZhc0hlaWdodEZvckFSKTtcbiAgICAgIHRoaXMuX19pc1dlYkFSTW9kZSA9IHRydWU7XG4gICAgICBjYWxsYmFja09uWHJTZXNzaW9uU3RhcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCdXZWJHTCBjb250ZXh0IGlzIG5vdCByZWFkeSBmb3IgV2ViWFIuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgV2ViWFIgKENsb3NlIHRoZSBYclNlc3Npb24pXG4gICAqL1xuICBhc3luYyBleGl0V2ViQVIoKSB7XG4gICAgaWYgKHRoaXMuX19vQXJTZXNzaW9uLmhhcygpKSB7XG4gICAgICAvLyBFbmQgdGhlIFhSIHNlc3Npb24gbm93LlxuICAgICAgYXdhaXQgdGhpcy5fX29BclNlc3Npb24uZ2V0KCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgLy8vIEdldHRlciBNZXRob2RzXG5cbiAgZ2V0Q2FudmFzV2lkdGhGb3JWcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbnZhc1dpZHRoRm9yQVI7XG4gIH1cblxuICBnZXRDYW52YXNIZWlnaHRGb3JWcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbnZhc0hlaWdodEZvckFSO1xuICB9XG5cbiAgZ2V0IHZpZXdNYXRyaXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbWVyYUVudGl0eS5nZXRDYW1lcmEoKS52aWV3TWF0cml4O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3VwZGF0ZVZpZXcoeHJGcmFtZTogWFJGcmFtZSkge1xuICAgIHRoaXMuX19vQXJWaWV3ZXJQb3NlID0gbmV3IFNvbWUoeHJGcmFtZS5nZXRWaWV3ZXJQb3NlKHRoaXMuX19vQXJSZWZlcmVuY2VTcGFjZS51bndyYXBGb3JjZSgpKSEpO1xuICAgIHRoaXMuX19zZXRDYW1lcmFJbmZvRnJvbVhSVmlld3ModGhpcy5fX29BclZpZXdlclBvc2UudW53cmFwRm9yY2UoKSk7XG4gIH1cblxuICBwcml2YXRlIF9fc2V0Q2FtZXJhSW5mb0Zyb21YUlZpZXdzKHhyVmlld2VyUG9zZTogWFJWaWV3ZXJQb3NlKSB7XG4gICAgaWYgKElzLm5vdC5leGlzdCh4clZpZXdlclBvc2UpKSB7XG4gICAgICBMb2dnZXIud2FybigneHJWaWV3ZXJQb3NlIG5vdCBleGlzdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB4clZpZXcgPSB4clZpZXdlclBvc2Uudmlld3NbMF07XG4gICAgaWYgKElzLm5vdC5leGlzdCh4clZpZXcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB4clZpZXdlclBvc2UudHJhbnNmb3JtLm9yaWVudGF0aW9uO1xuICAgIHRoaXMuX192aWV3ZXJPcmllbnRhdGlvbi54ID0gb3JpZW50YXRpb24ueDtcbiAgICB0aGlzLl9fdmlld2VyT3JpZW50YXRpb24ueSA9IG9yaWVudGF0aW9uLnk7XG4gICAgdGhpcy5fX3ZpZXdlck9yaWVudGF0aW9uLnogPSBvcmllbnRhdGlvbi56O1xuICAgIHRoaXMuX192aWV3ZXJPcmllbnRhdGlvbi53ID0gb3JpZW50YXRpb24udztcblxuICAgIGNvbnN0IG0gPSBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHlGbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihcbiAgICAgIHhyVmlldz8udHJhbnNmb3JtLm1hdHJpeCBhcyBGbG9hdDMyQXJyYXlcbiAgICApO1xuXG4gICAgY29uc3Qgcm90YXRlTWF0ID0gbTtcblxuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fX3ZpZXdlclNjYWxlLng7XG4gICAgY29uc3QgcG9zID0geHJWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICBjb25zdCB0cmFuc2xhdGVTY2FsZWQgPSBNdXRhYmxlVmVjdG9yMy5hZGQoXG4gICAgICB0aGlzLl9fZGVmYXVsdFBvc2l0aW9uSW5Mb2NhbFNwYWNlTW9kZSxcbiAgICAgIHRoaXMuX192aWV3ZXJUcmFuc2xhdGVcbiAgICApO1xuICAgIGNvbnN0IHhyVmlld2VyUG9zID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtwb3MueCwgcG9zLnksIHBvcy56XSk7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gTXV0YWJsZVZlY3RvcjMuYWRkKFxuICAgICAgdGhpcy5fX2RlZmF1bHRQb3NpdGlvbkluTG9jYWxTcGFjZU1vZGUsXG4gICAgICB0aGlzLl9fdmlld2VyVHJhbnNsYXRlXG4gICAgKS5hZGQoeHJWaWV3ZXJQb3MpO1xuICAgIGNvbnN0IHZpZXdlclRyYW5zbGF0ZVNjYWxlZFggPSB0cmFuc2xhdGVTY2FsZWQueDtcbiAgICBjb25zdCB2aWV3ZXJUcmFuc2xhdGVTY2FsZWRaID0gdHJhbnNsYXRlU2NhbGVkLno7XG4gICAgY29uc3Qgdmlld2VyVHJhbnNsYXRlWCA9IHRyYW5zbGF0ZS54O1xuICAgIGNvbnN0IHZpZXdlclRyYW5zbGF0ZVogPSB0cmFuc2xhdGUuejtcbiAgICBjb25zdCB2aWV3ZXJUcmFuc2Zvcm0gPSB0aGlzLl9jYW1lcmFFbnRpdHkuZ2V0VHJhbnNmb3JtKCkhO1xuICAgIHZpZXdlclRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgIHZpZXdlclRyYW5zbGF0ZVNjYWxlZFgsXG4gICAgICAwLFxuICAgICAgdmlld2VyVHJhbnNsYXRlU2NhbGVkWixcbiAgICBdKTtcbiAgICB2aWV3ZXJUcmFuc2Zvcm0ubG9jYWxTY2FsZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbc2NhbGUsIHNjYWxlLCBzY2FsZV0pO1xuICAgIHZpZXdlclRyYW5zZm9ybS5sb2NhbEV1bGVyQW5nbGVzID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCB0aGlzLl9fdmlld2VyQXppbXV0aEFuZ2xlLngsIDBdKTtcblxuICAgIHJvdGF0ZU1hdC50cmFuc2xhdGVZID0gdHJhbnNsYXRlLnk7XG4gICAgcm90YXRlTWF0LnRyYW5zbGF0ZVggPSB0cmFuc2xhdGUueCAtIHZpZXdlclRyYW5zbGF0ZVg7XG4gICAgcm90YXRlTWF0LnRyYW5zbGF0ZVogPSB0cmFuc2xhdGUueiAtIHZpZXdlclRyYW5zbGF0ZVo7XG4gICAgcm90YXRlTWF0LnRyYW5zbGF0ZVkgKz0geHJWaWV3ZXJQb3MueTtcbiAgICByb3RhdGVNYXQudHJhbnNsYXRlWCArPSB4clZpZXdlclBvcy54O1xuICAgIHJvdGF0ZU1hdC50cmFuc2xhdGVaICs9IHhyVmlld2VyUG9zLno7XG5cbiAgICB0aGlzLl9jYW1lcmFFbnRpdHkuZ2V0VHJhbnNmb3JtKCkhLmxvY2FsTWF0cml4ID0gcm90YXRlTWF0O1xuICB9XG5cbiAgZ2V0IHByb2plY3Rpb25NYXRyaXgoKSB7XG4gICAgY29uc3QgeHJWaWV3ID0gdGhpcy5fX29BclZpZXdlclBvc2UudW53cmFwRm9yY2UoKS52aWV3c1swXTtcbiAgICByZXR1cm4gTXV0YWJsZU1hdHJpeDQ0LmZyb21Db3B5RmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoXG4gICAgICBJcy5leGlzdCh4clZpZXcpID8geHJWaWV3LnByb2plY3Rpb25NYXRyaXggOiBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKS5fdlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJlIHByb2Nlc3MgZm9yIHJlbmRlcmluZ1xuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHhyRnJhbWUgWFJGcmFtZSBvYmplY3RcbiAgICovXG4gIF9wcmVSZW5kZXIodGltZTogbnVtYmVyLCB4ckZyYW1lOiBYUkZyYW1lKSB7XG4gICAgaWYgKHRoaXMuaXNXZWJBUk1vZGUgJiYgdGhpcy5fX3JlcXVlc3RlZFRvRW50ZXJXZWJBUiAmJiB4ckZyYW1lICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX191cGRhdGVWaWV3KHhyRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IHByb2Nlc3MgZm9yIHJlbmRlcmluZ1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9wb3N0UmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmlzV2ViQVJNb2RlKSB7XG4gICAgICBjb25zdCBnbCA9IHRoaXMuX19vR2x3LnVud3JhcEZvcmNlKCkuZ2V0UmF3Q29udGV4dCgpO1xuICAgICAgLy8gZ2w/LmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcXVlc3RlZFRvRW50ZXJXZWJBUikge1xuICAgICAgLy8gdGhpcy5fX2lzV2ViWFJNb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNXZWJBUk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1dlYkFSTW9kZTtcbiAgfVxuXG4gIGdldCBpc1JlYWR5Rm9yV2ViQVIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1JlYWR5Rm9yV2ViQVI7XG4gIH1cblxuICBnZXQgcmVxdWVzdGVkVG9FbnRlcldlYkFSKCkge1xuICAgIHJldHVybiB0aGlzLl9fcmVxdWVzdGVkVG9FbnRlcldlYkFSO1xuICB9XG5cbiAgZ2V0IGFyU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fX29BclNlc3Npb24udW53cmFwT3JVbmRlZmluZWQoKTtcbiAgfVxuXG4gIGdldCBmcmFtZWJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX29BclNlc3Npb24udW53cmFwT3JVbmRlZmluZWQoKT8ucmVuZGVyU3RhdGUuYmFzZUxheWVyPy5mcmFtZWJ1ZmZlcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW90aW9uQ29udHJvbGxlciB9IGZyb20gJ3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL21vdGlvbi1jb250cm9sbGVycy9zcmMvbW90aW9uQ29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBmZXRjaFByb2ZpbGUgfSBmcm9tICd3ZWJ4ci1pbnB1dC1wcm9maWxlcy9wYWNrYWdlcy9tb3Rpb24tY29udHJvbGxlcnMvc3JjL3Byb2ZpbGVzLmpzJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJ3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL21vdGlvbi1jb250cm9sbGVycy9zcmMvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL21vdGlvbi1jb250cm9sbGVycy9zcmMvY29tcG9uZW50LmpzJztcbmltcG9ydCB7IEdsdGYySW1wb3J0ZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2ltcG9ydGVyL0dsdGYySW1wb3J0ZXInO1xuaW1wb3J0IHsgTW9kZWxDb252ZXJ0ZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2ltcG9ydGVyL01vZGVsQ29udmVydGVyJztcbmltcG9ydCB7IElzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9taXNjL0lzJztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvRW50aXR5JztcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvUXVhdGVybmlvbic7XG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IHsgSU11dGFibGVWZWN0b3IzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL0lWZWN0b3InO1xuaW1wb3J0IHsgdmFsdWVXaXRoRGVmYXVsdCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9NaXNjVXRpbCc7XG5pbXBvcnQgeyBJTXV0YWJsZVF1YXRlcm5pb24gfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvSVF1YXRlcm5pb24nO1xuaW1wb3J0IHsgTXV0YWJsZVZlY3RvcjMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZVZlY3RvcjMnO1xuaW1wb3J0IHsgTXV0YWJsZU1hdHJpeDMzIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL011dGFibGVNYXRyaXgzMyc7XG5pbXBvcnQgeyBNdXRhYmxlU2NhbGFyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL011dGFibGVTY2FsYXInO1xuaW1wb3J0IHsgaXNPayB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9SZXN1bHQnO1xuaW1wb3J0IHsgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuLy8gY29uc3Qgb2N1bHVzUHJvZmlsZSA9IHJlcXVpcmUoJ3dlYnhyLWlucHV0LXByb2ZpbGVzL3BhY2thZ2VzL3JlZ2lzdHJ5L3Byb2ZpbGVzL29jdWx1cy9vY3VsdXMtdG91Y2guanNvbicpO1xuXG5jb25zdCBtb3Rpb25Db250cm9sbGVyczogTWFwPFhSSW5wdXRTb3VyY2UsIE1vdGlvbkNvbnRyb2xsZXI+ID0gbmV3IE1hcCgpO1xuXG50eXBlIENvbXBvbmVudFZhbHVlcyA9IHtcbiAgc3RhdGU6IENvbnN0YW50cy5Db21wb25lbnRTdGF0ZTtcbiAgYnV0dG9uPzogbnVtYmVyO1xuICB4QXhpcz86IG51bWJlcjtcbiAgeUF4aXM/OiBudW1iZXI7XG59O1xuXG50eXBlIENvbXBvbmVudENoYW5nZUNhbGxiYWNrID0gKHtcbiAgY29tcG9uZW50VmFsdWVzLFxuICBoYW5kZWRuZXNzLFxufToge1xuICBjb21wb25lbnRWYWx1ZXM6IENvbXBvbmVudFZhbHVlcztcbiAgaGFuZGVkbmVzczogQ29uc3RhbnRzLkhhbmRlZG5lc3M7XG59KSA9PiB1bmtub3duO1xuXG5jb25zdCBHZW5lcmFsVHlwZSA9IE9iamVjdC5mcmVlemUoe1xuICBUUklHR0VSOiAndHJpZ2dlcicsXG4gIFNRVUVFWkU6ICdzcXVlZXplJyxcbiAgVE9VQ0hQQUQ6ICd0b3VjaHBhZCcsXG4gIFRIVU1CU1RJQ0s6ICd0aHVtYnN0aWNrJyxcbiAgQlVUVE9OXzE6ICdidXR0b25fMScsXG4gIEJVVFRPTl8yOiAnYnV0dG9uXzInLFxuICBCVVRUT05fMzogJ2J1dHRvbl8zJyxcbiAgQlVUVE9OX1NQRUNJQUw6ICdidXR0b25fc3BlY2lhbCcsXG59KTtcblxudHlwZSBDb21wb25lbnRGdW5jdGlvbk1hcCA9IHtcbiAgdHJpZ2dlcjogQ29tcG9uZW50Q2hhbmdlQ2FsbGJhY2s7XG4gIHNxdWVlemU6IENvbXBvbmVudENoYW5nZUNhbGxiYWNrO1xuICB0b3VjaHBhZDogQ29tcG9uZW50Q2hhbmdlQ2FsbGJhY2s7XG4gIHRodW1ic3RpY2s6IENvbXBvbmVudENoYW5nZUNhbGxiYWNrO1xuICBidXR0b25fMTogQ29tcG9uZW50Q2hhbmdlQ2FsbGJhY2s7XG4gIGJ1dHRvbl8yOiBDb21wb25lbnRDaGFuZ2VDYWxsYmFjaztcbiAgYnV0dG9uXzM6IENvbXBvbmVudENoYW5nZUNhbGxiYWNrO1xuICBidXR0b25TcGVjaWFsOiBDb21wb25lbnRDaGFuZ2VDYWxsYmFjaztcbn07XG5cbnR5cGUgV2ViWFJTeXN0ZW1WaWV3ZXJEYXRhID0ge1xuICB2aWV3ZXJUcmFuc2xhdGU6IElNdXRhYmxlVmVjdG9yMztcbiAgdmlld2VyU2NhbGU6IE11dGFibGVWZWN0b3IzO1xuICB2aWV3ZXJPcmllbnRhdGlvbjogSU11dGFibGVRdWF0ZXJuaW9uO1xuICB2aWV3ZXJBemltdXRoQW5nbGU6IE11dGFibGVTY2FsYXI7XG59O1xuXG5jb25zdCB3ZWxsS25vd25NYXBwaW5nID0gbmV3IE1hcCgpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ2FfYnV0dG9uJywgR2VuZXJhbFR5cGUuQlVUVE9OXzEpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ2JfYnV0dG9uJywgR2VuZXJhbFR5cGUuQlVUVE9OXzIpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3hfYnV0dG9uJywgR2VuZXJhbFR5cGUuQlVUVE9OXzEpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3lfYnV0dG9uJywgR2VuZXJhbFR5cGUuQlVUVE9OXzIpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3RodW1icmVzdCcsIEdlbmVyYWxUeXBlLkJVVFRPTl8zKTtcbndlbGxLbm93bk1hcHBpbmcuc2V0KCdtZW51JywgR2VuZXJhbFR5cGUuQlVUVE9OX1NQRUNJQUwpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3hyX3N0YW5kYXJkX3RyaWdnZXInLCBHZW5lcmFsVHlwZS5UUklHR0VSKTtcbndlbGxLbm93bk1hcHBpbmcuc2V0KCd4cl9zdGFuZGFyZF9zcXVlZXplJywgR2VuZXJhbFR5cGUuU1FVRUVaRSk7XG53ZWxsS25vd25NYXBwaW5nLnNldCgneHJfc3RhbmRhcmRfdGh1bWJzdGljaycsIEdlbmVyYWxUeXBlLlRIVU1CU1RJQ0spO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3hyX3N0YW5kYXJkX3RvdWNocGFkJywgR2VuZXJhbFR5cGUuVE9VQ0hQQUQpO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3RyaWdnZXInLCBHZW5lcmFsVHlwZS5UUklHR0VSKTtcbndlbGxLbm93bk1hcHBpbmcuc2V0KCdzcXVlZXplJywgR2VuZXJhbFR5cGUuU1FVRUVaRSk7XG53ZWxsS25vd25NYXBwaW5nLnNldCgndGh1bWJzdGljaycsIEdlbmVyYWxUeXBlLlRIVU1CU1RJQ0spO1xud2VsbEtub3duTWFwcGluZy5zZXQoJ3RvdWNocGFkJywgR2VuZXJhbFR5cGUuVE9VQ0hQQUQpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTW90aW9uQ29udHJvbGxlcihcbiAgeHJJbnB1dFNvdXJjZTogWFJJbnB1dFNvdXJjZSxcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgcHJvZmlsZVByaW9yaXRpZXM6IHN0cmluZ1tdXG4pIHtcbiAgY29uc3QgeyBwcm9maWxlLCBhc3NldFBhdGggfSA9IGF3YWl0IGZldGNoUHJvZmlsZSh4cklucHV0U291cmNlLCBiYXNlUGF0aCk7XG4gIGNvbnN0IG1vdGlvbkNvbnRyb2xsZXIgPSBuZXcgTW90aW9uQ29udHJvbGxlcih4cklucHV0U291cmNlLCBwcm9maWxlLCBhc3NldFBhdGghKTtcbiAgbW90aW9uQ29udHJvbGxlcnMuc2V0KHhySW5wdXRTb3VyY2UsIG1vdGlvbkNvbnRyb2xsZXIpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGRNb3Rpb25Db250cm9sbGVyVG9TY2VuZShtb3Rpb25Db250cm9sbGVyKTtcbiAgaWYgKGlzT2socmVzdWx0KSkge1xuICAgIGNvbnN0IHJvb3RHcm91cCA9IE1vZGVsQ29udmVydGVyLmNvbnZlcnRUb1Job2Rvbml0ZU9iamVjdChyZXN1bHQuZ2V0KCkpO1xuICAgIHJldHVybiByb290R3JvdXA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRNb3Rpb25Db250cm9sbGVyVG9TY2VuZShtb3Rpb25Db250cm9sbGVyOiBNb3Rpb25Db250cm9sbGVyKSB7XG4gIGNvbnN0IGFzc2V0ID0gYXdhaXQgR2x0ZjJJbXBvcnRlci5pbXBvcnRGcm9tVXJpKG1vdGlvbkNvbnRyb2xsZXIuYXNzZXRVcmwpO1xuICBhZGRUb3VjaFBvaW50RG90cyhtb3Rpb25Db250cm9sbGVyLCBhc3NldCk7XG4gIC8vIE15RW5naW5lLnNjZW5lLmFkZChhc3NldCk7XG5cbiAgcmV0dXJuIGFzc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlR2FtZVBhZChcbiAgdGltZXN0YW1wOiBudW1iZXIsXG4gIHhyRnJhbWU6IFhSRnJhbWUsXG4gIHZpZXdlckRhdGE6IFdlYlhSU3lzdGVtVmlld2VyRGF0YVxuKSB7XG4gIC8vIE90aGVyIGZyYW1lLWxvb3Agc3R1ZmYgLi4uXG5cbiAgQXJyYXkuZnJvbShtb3Rpb25Db250cm9sbGVycy52YWx1ZXMoKSkuZm9yRWFjaCgobW90aW9uQ29udHJvbGxlcjogTW90aW9uQ29udHJvbGxlcikgPT4ge1xuICAgIG1vdGlvbkNvbnRyb2xsZXIudXBkYXRlRnJvbUdhbWVwYWQoKTtcbiAgICBPYmplY3Qua2V5cyhtb3Rpb25Db250cm9sbGVyLmNvbXBvbmVudHMpLmZvckVhY2goKGNvbXBvbmVudElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG1vdGlvbkNvbnRyb2xsZXIuY29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICBwcm9jZXNzSW5wdXQoXG4gICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgKG1vdGlvbkNvbnRyb2xsZXIueHJJbnB1dFNvdXJjZSBhcyBYUklucHV0U291cmNlKS5oYW5kZWRuZXNzLFxuICAgICAgICB2aWV3ZXJEYXRhLFxuICAgICAgICB0aW1lc3RhbXBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE90aGVyIGZyYW1lLWxvb3Agc3R1ZmYgLi4uXG59XG5cbmxldCBsYXN0VGltZXN0YW1wID0gMDtcbmZ1bmN0aW9uIHByb2Nlc3NJbnB1dChcbiAgY29tcG9uZW50OiBDb21wb25lbnQsXG4gIGhhbmRlZDogc3RyaW5nLFxuICB2aWV3ZXJEYXRhOiBXZWJYUlN5c3RlbVZpZXdlckRhdGEsXG4gIHRpbWVzdGFtcDogbnVtYmVyXG4pIHtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IHdlbGxLbm93bk1hcHBpbmcuZ2V0KGNvbXBvbmVudC5yb290Tm9kZU5hbWUpO1xuICBpZiAoSXMubm90LmV4aXN0KGNvbXBvbmVudE5hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGxhc3RUaW1lc3RhbXAgPT09IDApIHtcbiAgICBsYXN0VGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlbHRhU2VjID0gKHRpbWVzdGFtcCAtIGxhc3RUaW1lc3RhbXApICogMC4wMDAwMDE7XG4gIHN3aXRjaCAoY29tcG9uZW50TmFtZSkge1xuICAgIGNhc2UgR2VuZXJhbFR5cGUuVFJJR0dFUjpcbiAgICAgIHByb2Nlc3NUcmlnZ2VySW5wdXQoY29tcG9uZW50LCBoYW5kZWQsIHZpZXdlckRhdGEsIGRlbHRhU2VjKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgR2VuZXJhbFR5cGUuVEhVTUJTVElDSzpcbiAgICAgIHByb2Nlc3NUaHVtYnN0aWNrSW5wdXQoY29tcG9uZW50LCBoYW5kZWQsIHZpZXdlckRhdGEsIGRlbHRhU2VjKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgR2VuZXJhbFR5cGUuU1FVRUVaRTpcbiAgICAgIHByb2Nlc3NTcXVlZXplSW5wdXQoY29tcG9uZW50LCBoYW5kZWQsIHZpZXdlckRhdGEsIGRlbHRhU2VjKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgR2VuZXJhbFR5cGUuQlVUVE9OXzE6XG4gICAgY2FzZSBHZW5lcmFsVHlwZS5CVVRUT05fMjpcbiAgICBjYXNlIEdlbmVyYWxUeXBlLkJVVFRPTl8zOlxuICAgIGNhc2UgR2VuZXJhbFR5cGUuQlVUVE9OX1NQRUNJQUw6XG4gICAgICBwcm9jZXNzQnV0dG9uSW5wdXQoY29tcG9uZW50LCBoYW5kZWQsIHZpZXdlckRhdGEsIGRlbHRhU2VjKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgR2VuZXJhbFR5cGUuVE9VQ0hQQUQ6XG4gICAgICBwcm9jZXNzVG91Y2hwYWRJbnB1dChjb21wb25lbnQsIGhhbmRlZCwgdmlld2VyRGF0YSwgZGVsdGFTZWMpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgfVxufVxuXG5jb25zdCBzY2FsZVZlYzMgPSBNdXRhYmxlVmVjdG9yMy5vbmUoKTtcbmZ1bmN0aW9uIHByb2Nlc3NUcmlnZ2VySW5wdXQoXG4gIHRyaWdnZXJDb21wb25lbnQ6IENvbXBvbmVudCxcbiAgaGFuZGVkOiBzdHJpbmcsXG4gIHZpZXdlckRhdGE6IFdlYlhSU3lzdGVtVmlld2VyRGF0YSxcbiAgZGVsdGFTZWM6IG51bWJlclxuKSB7XG4gIGxldCB2YWx1ZSA9IDA7XG4gIGNvbnN0IHNjYWxlID0gMC4xO1xuXG4gIGNvbnN0IGNvbXBvbmVudE5hbWUgPSB3ZWxsS25vd25NYXBwaW5nLmdldCh0cmlnZ2VyQ29tcG9uZW50LnJvb3ROb2RlTmFtZSk7XG4gIGlmICh0cmlnZ2VyQ29tcG9uZW50LnZhbHVlcy5zdGF0ZSA9PT0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLlBSRVNTRUQpIHtcbiAgICBMb2dnZXIuaW5mbyhjb21wb25lbnROYW1lICsgJywgJyArIHRyaWdnZXJDb21wb25lbnQudmFsdWVzLmJ1dHRvbiArICcsICcgKyBoYW5kZWQpO1xuICAgIHZhbHVlID1cbiAgICAgIHZhbHVlV2l0aERlZmF1bHQoe1xuICAgICAgICB2YWx1ZTogdHJpZ2dlckNvbXBvbmVudC52YWx1ZXMuYnV0dG9uLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgICB9KSAqIGRlbHRhU2VjO1xuICAgIC8vIEZpcmUgcmF5IGd1blxuICB9IGVsc2UgaWYgKHRyaWdnZXJDb21wb25lbnQudmFsdWVzLnN0YXRlID09PSBDb25zdGFudHMuQ29tcG9uZW50U3RhdGUuVE9VQ0hFRCkge1xuICAgIExvZ2dlci5pbmZvKGNvbXBvbmVudE5hbWUgKyAnLCAnICsgdHJpZ2dlckNvbXBvbmVudC52YWx1ZXMuYnV0dG9uICsgJywgJyArIGhhbmRlZCk7XG4gICAgdmFsdWUgPVxuICAgICAgdmFsdWVXaXRoRGVmYXVsdCh7XG4gICAgICAgIHZhbHVlOiB0cmlnZ2VyQ29tcG9uZW50LnZhbHVlcy5idXR0b24sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIH0pICogZGVsdGFTZWM7XG4gICAgLy8gU2hvdyByYXkgZ3VuIGNoYXJnaW5nIHVwXG4gIH1cbiAgaWYgKGhhbmRlZCA9PT0gJ3JpZ2h0Jykge1xuICAgIHZhbHVlICo9IC0xO1xuICB9XG4gIHNjYWxlVmVjMy54IC09IHZhbHVlICogc2NhbGU7XG4gIHNjYWxlVmVjMy55IC09IHZhbHVlICogc2NhbGU7XG4gIHNjYWxlVmVjMy56IC09IHZhbHVlICogc2NhbGU7XG4gIHNjYWxlVmVjMy54ID0gTWF0aC5tYXgoc2NhbGVWZWMzLngsIDAuMDUpO1xuICBzY2FsZVZlYzMueSA9IE1hdGgubWF4KHNjYWxlVmVjMy55LCAwLjA1KTtcbiAgc2NhbGVWZWMzLnogPSBNYXRoLm1heChzY2FsZVZlYzMueiwgMC4wNSk7XG4gIHNjYWxlVmVjMy54ID0gTWF0aC5taW4oc2NhbGVWZWMzLngsIDMuMCk7XG4gIHNjYWxlVmVjMy55ID0gTWF0aC5taW4oc2NhbGVWZWMzLnksIDMuMCk7XG4gIHNjYWxlVmVjMy56ID0gTWF0aC5taW4oc2NhbGVWZWMzLnosIDMuMCk7XG4gIHZpZXdlckRhdGEudmlld2VyU2NhbGUuY29weUNvbXBvbmVudHMoc2NhbGVWZWMzKTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1NxdWVlemVJbnB1dChcbiAgc3F1ZWV6ZUNvbXBvbmVudDogQ29tcG9uZW50LFxuICBoYW5kZWQ6IHN0cmluZyxcbiAgdmlld2VyRGF0YTogV2ViWFJTeXN0ZW1WaWV3ZXJEYXRhLFxuICBkZWx0YVNlYzogbnVtYmVyXG4pIHtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IHdlbGxLbm93bk1hcHBpbmcuZ2V0KHNxdWVlemVDb21wb25lbnQucm9vdE5vZGVOYW1lKTtcbiAgaWYgKHNxdWVlemVDb21wb25lbnQudmFsdWVzLnN0YXRlID09PSBDb25zdGFudHMuQ29tcG9uZW50U3RhdGUuUFJFU1NFRCkge1xuICAgIExvZ2dlci5pbmZvKGNvbXBvbmVudE5hbWUgKyAnLCAnICsgc3F1ZWV6ZUNvbXBvbmVudC52YWx1ZXMuYnV0dG9uICsgJywgJyArIGhhbmRlZCk7XG4gICAgLy8gRmlyZSByYXkgZ3VuXG4gIH0gZWxzZSBpZiAoc3F1ZWV6ZUNvbXBvbmVudC52YWx1ZXMuc3RhdGUgPT09IENvbnN0YW50cy5Db21wb25lbnRTdGF0ZS5UT1VDSEVEKSB7XG4gICAgTG9nZ2VyLmluZm8oY29tcG9uZW50TmFtZSArICcsICcgKyBzcXVlZXplQ29tcG9uZW50LnZhbHVlcy5idXR0b24gKyAnLCAnICsgaGFuZGVkKTtcbiAgICAvLyBTaG93IHJheSBndW4gY2hhcmdpbmcgdXBcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzVGh1bWJzdGlja0lucHV0KFxuICB0aHVtYnN0aWNrQ29tcG9uZW50OiBDb21wb25lbnQsXG4gIGhhbmRlZDogc3RyaW5nLFxuICB2aWV3ZXJEYXRhOiBXZWJYUlN5c3RlbVZpZXdlckRhdGEsXG4gIGRlbHRhU2VjOiBudW1iZXJcbikge1xuICBjb25zdCBjb21wb25lbnROYW1lID0gd2VsbEtub3duTWFwcGluZy5nZXQodGh1bWJzdGlja0NvbXBvbmVudC5yb290Tm9kZU5hbWUpO1xuICBsZXQgeEF4aXMgPSAwO1xuICBsZXQgeUF4aXMgPSAwO1xuICBjb25zdCBkZWx0YVNjYWxlSG9yaXpvbnRhbCA9IDAuMjU7XG4gIGNvbnN0IGRlbHRhU2NhbGVWZXJ0aWNhbCA9IDAuMTtcbiAgY29uc3QgZGVsdGFTY2FsZUF6aW11dGhBbmdsZSA9IDAuMTU7XG4gIGlmICh0aHVtYnN0aWNrQ29tcG9uZW50LnZhbHVlcy5zdGF0ZSA9PT0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLlBSRVNTRUQpIHtcbiAgICBMb2dnZXIuaW5mbyhcbiAgICAgIGNvbXBvbmVudE5hbWUgK1xuICAgICAgICAnLCAnICtcbiAgICAgICAgdGh1bWJzdGlja0NvbXBvbmVudC52YWx1ZXMuYnV0dG9uICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIHRodW1ic3RpY2tDb21wb25lbnQudmFsdWVzLnN0YXRlICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIGhhbmRlZFxuICAgICk7XG4gICAgeEF4aXMgPVxuICAgICAgdmFsdWVXaXRoRGVmYXVsdCh7XG4gICAgICAgIHZhbHVlOiB0aHVtYnN0aWNrQ29tcG9uZW50LnZhbHVlcy54QXhpcyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgfSkgKiBkZWx0YVNlYztcbiAgICB5QXhpcyA9XG4gICAgICB2YWx1ZVdpdGhEZWZhdWx0KHtcbiAgICAgICAgdmFsdWU6IHRodW1ic3RpY2tDb21wb25lbnQudmFsdWVzLnlBeGlzLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgICB9KSAqIGRlbHRhU2VjO1xuICAgIC8vIEFsaWduIHRoZSB3b3JsZCBvcmllbnRhdGlvbiB0byB0aGUgdXNlcidzIGN1cnJlbnQgb3JpZW50YXRpb25cbiAgfSBlbHNlIGlmICh0aHVtYnN0aWNrQ29tcG9uZW50LnZhbHVlcy5zdGF0ZSA9PT0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLlRPVUNIRUQpIHtcbiAgICB4QXhpcyA9XG4gICAgICB2YWx1ZVdpdGhEZWZhdWx0KHtcbiAgICAgICAgdmFsdWU6IHRodW1ic3RpY2tDb21wb25lbnQudmFsdWVzLnhBeGlzLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgICB9KSAqIGRlbHRhU2VjO1xuICAgIHlBeGlzID1cbiAgICAgIHZhbHVlV2l0aERlZmF1bHQoe1xuICAgICAgICB2YWx1ZTogdGh1bWJzdGlja0NvbXBvbmVudC52YWx1ZXMueUF4aXMsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIH0pICogZGVsdGFTZWM7XG4gIH1cbiAgeEF4aXMgPSBNYXRoLm1pbih4QXhpcywgMSk7XG4gIHlBeGlzID0gTWF0aC5taW4oeUF4aXMsIDEpO1xuXG4gIGNvbnN0IGRlbHRhVmVjdG9yID0gTXV0YWJsZVZlY3RvcjMuemVybygpO1xuICBpZiAoaGFuZGVkID09PSAncmlnaHQnKSB7XG4gICAgdmlld2VyRGF0YS52aWV3ZXJBemltdXRoQW5nbGUueCAtPSB4QXhpcyAqIGRlbHRhU2NhbGVBemltdXRoQW5nbGU7XG4gICAgZGVsdGFWZWN0b3IueSAtPSB5QXhpcyAqIGRlbHRhU2NhbGVWZXJ0aWNhbCAqIHZpZXdlckRhdGEudmlld2VyU2NhbGUueDtcbiAgfSBlbHNlIHtcbiAgICBkZWx0YVZlY3Rvci54ICs9IHhBeGlzICogZGVsdGFTY2FsZUhvcml6b250YWwgKiB2aWV3ZXJEYXRhLnZpZXdlclNjYWxlLng7XG4gICAgZGVsdGFWZWN0b3IueiArPSB5QXhpcyAqIGRlbHRhU2NhbGVIb3Jpem9udGFsICogdmlld2VyRGF0YS52aWV3ZXJTY2FsZS54O1xuICB9XG4gIGNvbnN0IG9yaWVudGF0aW9uTWF0ID0gTXV0YWJsZU1hdHJpeDMzLmZyb21Db3B5UXVhdGVybmlvbih2aWV3ZXJEYXRhLnZpZXdlck9yaWVudGF0aW9uKTtcbiAgY29uc3Qgcm90YXRlTWF0ID0gb3JpZW50YXRpb25NYXQubXVsdGlwbHkoXG4gICAgTXV0YWJsZU1hdHJpeDMzLnJvdGF0ZVkodmlld2VyRGF0YS52aWV3ZXJBemltdXRoQW5nbGUueClcbiAgKTtcbiAgcm90YXRlTWF0Lm11bHRpcGx5VmVjdG9yVG8oZGVsdGFWZWN0b3IsIGRlbHRhVmVjdG9yIGFzIE11dGFibGVWZWN0b3IzKTtcbiAgdmlld2VyRGF0YS52aWV3ZXJUcmFuc2xhdGUuYWRkKGRlbHRhVmVjdG9yKTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0J1dHRvbklucHV0KFxuICBidXR0b25Db21wb25lbnQ6IENvbXBvbmVudCxcbiAgaGFuZGVkOiBzdHJpbmcsXG4gIHZpZXdlckRhdGE6IFdlYlhSU3lzdGVtVmlld2VyRGF0YSxcbiAgZGVsdGFTZWM6IG51bWJlclxuKSB7XG4gIGNvbnN0IGNvbXBvbmVudE5hbWUgPSB3ZWxsS25vd25NYXBwaW5nLmdldChidXR0b25Db21wb25lbnQucm9vdE5vZGVOYW1lKTtcbiAgaWYgKGJ1dHRvbkNvbXBvbmVudC52YWx1ZXMuc3RhdGUgPT09IENvbnN0YW50cy5Db21wb25lbnRTdGF0ZS5QUkVTU0VEKSB7XG4gICAgTG9nZ2VyLmluZm8oXG4gICAgICBjb21wb25lbnROYW1lICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIGJ1dHRvbkNvbXBvbmVudC52YWx1ZXMuYnV0dG9uICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIGJ1dHRvbkNvbXBvbmVudC52YWx1ZXMuc3RhdGUgK1xuICAgICAgICAnLCAnICtcbiAgICAgICAgaGFuZGVkXG4gICAgKTtcbiAgfSBlbHNlIGlmIChidXR0b25Db21wb25lbnQudmFsdWVzLnN0YXRlID09PSBDb25zdGFudHMuQ29tcG9uZW50U3RhdGUuVE9VQ0hFRCkge1xuICAgIExvZ2dlci5pbmZvKFxuICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICcsICcgK1xuICAgICAgICBidXR0b25Db21wb25lbnQudmFsdWVzLmJ1dHRvbiArXG4gICAgICAgICcsICcgK1xuICAgICAgICBidXR0b25Db21wb25lbnQudmFsdWVzLnN0YXRlICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIGhhbmRlZFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1RvdWNocGFkSW5wdXQoXG4gIHRodW1ic3RpY2s6IENvbXBvbmVudCxcbiAgaGFuZGVkOiBzdHJpbmcsXG4gIHZpZXdlckRhdGE6IFdlYlhSU3lzdGVtVmlld2VyRGF0YSxcbiAgZGVsdGFTZWM6IG51bWJlclxuKSB7XG4gIGlmICh0aHVtYnN0aWNrLnZhbHVlcy5zdGF0ZSA9PT0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLlBSRVNTRUQpIHtcbiAgICAvLyBBbGlnbiB0aGUgd29ybGQgb3JpZW50YXRpb24gdG8gdGhlIHVzZXIncyBjdXJyZW50IG9yaWVudGF0aW9uXG4gIH0gZWxzZSBpZiAoXG4gICAgdGh1bWJzdGljay52YWx1ZXMuc3RhdGUgPT09IENvbnN0YW50cy5Db21wb25lbnRTdGF0ZS5UT1VDSEVEICYmXG4gICAgdGh1bWJzdGljay52YWx1ZXMueUF4aXMgIT09IDBcbiAgKSB7XG4gICAgY29uc3Qgc2Nvb3REaXN0YW5jZSA9IHRodW1ic3RpY2sudmFsdWVzLnlBeGlzOyAvLyogc2Nvb3RJbmNyZW1lbnQ7XG4gICAgLy8gU2Nvb3QgdGhlIHVzZXIgZm9yd2FyZFxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRvdWNoUG9pbnREb3RzKG1vdGlvbkNvbnRyb2xsZXI6IE1vdGlvbkNvbnRyb2xsZXIsIGFzc2V0OiBhbnkpIHtcbiAgT2JqZWN0LnZhbHVlcyhtb3Rpb25Db250cm9sbGVyLmNvbXBvbmVudHMpLmZvckVhY2goKGNvbXBvbmVudCkgPT4ge1xuICAgIGlmIChjb21wb25lbnQudG91Y2hQb2ludE5vZGVOYW1lKSB7XG4gICAgICBjb25zdCB0b3VjaFBvaW50Um9vdCA9IGFzc2V0LmdldENoaWxkQnlOYW1lKGNvbXBvbmVudC50b3VjaFBvaW50Tm9kZU5hbWUsIHRydWUpO1xuXG4gICAgICAvLyBjb25zdCBzcGhlcmVHZW9tZXRyeSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSgwLjAwMSk7XG4gICAgICAvLyBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAweDAwMDBGRiB9KTtcbiAgICAgIC8vIGNvbnN0IHRvdWNoUG9pbnREb3QgPSBuZXcgVEhSRUUuTWVzaChzcGhlcmVHZW9tZXRyeSwgbWF0ZXJpYWwpO1xuICAgICAgLy8gdG91Y2hQb2ludFJvb3QuYWRkKHRvdWNoUG9pbnREb3QpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNb3Rpb25Db250cm9sbGVyTW9kZWwoZW50aXR5OiBJRW50aXR5LCBtb3Rpb25Db250cm9sbGVyOiBNb3Rpb25Db250cm9sbGVyKSB7XG4gIC8vIHRoaXMgY29kZXMgYXJlIGZyb20gaHR0cHM6Ly9pbW1lcnNpdmUtd2ViLmdpdGh1Yi5pby93ZWJ4ci1pbnB1dC1wcm9maWxlcy9wYWNrYWdlcy9tb3Rpb24tY29udHJvbGxlcnMvI2FuaW1hdGluZy1jb21wb25lbnRzXG5cbiAgLy8gVXBkYXRlIHRoZSAzRCBtb2RlbCB0byByZWZsZWN0IHRoZSBidXR0b24sIHRodW1ic3RpY2ssIGFuZCB0b3VjaHBhZCBzdGF0ZVxuICBjb25zdCBtYXAgPSBlbnRpdHkuZ2V0VGFnVmFsdWUoJ3JuRW50aXRpZXNCeU5hbWVzJyk7XG4gIE9iamVjdC52YWx1ZXMobW90aW9uQ29udHJvbGxlci5jb21wb25lbnRzKS5mb3JFYWNoKChjb21wb25lbnQ6IENvbXBvbmVudCkgPT4ge1xuICAgIGZvciAoY29uc3QgdmlzdWFsUmVzcG9uc2VOYW1lIGluIGNvbXBvbmVudC52aXN1YWxSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IHZpc3VhbFJlc3BvbnNlID0gY29tcG9uZW50LnZpc3VhbFJlc3BvbnNlc1t2aXN1YWxSZXNwb25zZU5hbWVdO1xuXG4gICAgICAvLyBGaW5kIHRoZSB0b3Btb3N0IG5vZGUgaW4gdGhlIHZpc3VhbGl6YXRpb25cbiAgICAgIGNvbnN0IGVudGl0eSA9IG1hcC5nZXQodmlzdWFsUmVzcG9uc2UudmFsdWVOb2RlTmFtZSk7XG4gICAgICBpZiAoSXMubm90LmV4aXN0KGVudGl0eSkpIHtcbiAgICAgICAgTG9nZ2VyLndhcm4oXCJUaGUgZW50aXR5IG9mIHRoZSBjb250cm9sbGVyIGRvZXNuJ3QgZXhpc3RcIik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgd2VpZ2h0IHN1cHBsaWVkXG4gICAgICBpZiAodmlzdWFsUmVzcG9uc2UudmFsdWVOb2RlUHJvcGVydHkgPT09ICd2aXNpYmlsaXR5Jykge1xuICAgICAgICBlbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmlzVmlzaWJsZSA9ICEhdmlzdWFsUmVzcG9uc2UudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZpc3VhbFJlc3BvbnNlLnZhbHVlTm9kZVByb3BlcnR5ID09PSAndHJhbnNmb3JtJykge1xuICAgICAgICBjb25zdCBtaW5Ob2RlID0gbWFwLmdldCh2aXN1YWxSZXNwb25zZS5taW5Ob2RlTmFtZSEpIGFzIElTY2VuZUdyYXBoRW50aXR5O1xuICAgICAgICBjb25zdCBtYXhOb2RlID0gbWFwLmdldCh2aXN1YWxSZXNwb25zZS5tYXhOb2RlTmFtZSEpIGFzIElTY2VuZUdyYXBoRW50aXR5O1xuICAgICAgICBpZiAoSXMubm90LmV4aXN0KG1pbk5vZGUpIHx8IElzLm5vdC5leGlzdChtYXhOb2RlKSkge1xuICAgICAgICAgIExvZ2dlci53YXJuKFwiVGhlIG1pbi9tYXggTm9kZSBvZiB0aGUgY29tcG9uZW50IG9mIHRoZSBjb250cm9sbGVyIGRvZXNuJ3QgZXhpc3RcIik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5Ob2RlVHJhbnNmb3JtID0gbWluTm9kZS5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgY29uc3QgbWF4Tm9kZVRyYW5zZm9ybSA9IG1heE5vZGUuZ2V0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgZW50aXR5LmdldFRyYW5zZm9ybSgpLnF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uLnFsZXJwKFxuICAgICAgICAgIG1pbk5vZGVUcmFuc2Zvcm0ubG9jYWxSb3RhdGlvbklubmVyLFxuICAgICAgICAgIG1heE5vZGVUcmFuc2Zvcm0ubG9jYWxSb3RhdGlvbklubmVyLFxuICAgICAgICAgIHZpc3VhbFJlc3BvbnNlLnZhbHVlIGFzIG51bWJlclxuICAgICAgICApO1xuXG4gICAgICAgIGVudGl0eS5nZXRUcmFuc2Zvcm0oKS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5sZXJwKFxuICAgICAgICAgIG1pbk5vZGVUcmFuc2Zvcm0ubG9jYWxQb3NpdGlvbklubmVyLFxuICAgICAgICAgIG1heE5vZGVUcmFuc2Zvcm0ubG9jYWxQb3NpdGlvbklubmVyLFxuICAgICAgICAgIHZpc3VhbFJlc3BvbnNlLnZhbHVlIGFzIG51bWJlclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb3Rpb25Db250cm9sbGVyKHhySW5wdXRTb3VyY2U6IFhSSW5wdXRTb3VyY2UpIHtcbiAgcmV0dXJuIG1vdGlvbkNvbnRyb2xsZXJzLmdldCh4cklucHV0U291cmNlKTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvbiAqL1xuaW1wb3J0IHsgQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL3JlbmRlcmVyL0NHQVBJUmVzb3VyY2VSZXBvc2l0b3J5JztcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlTWF0cml4NDQgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGgvTXV0YWJsZU1hdHJpeDQ0JztcbmltcG9ydCB7IEluZGV4IH0gZnJvbSAnLi4vdHlwZXMvQ29tbW9uVHlwZXMnO1xuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0aC9WZWN0b3I0JztcbmltcG9ydCB7IElFbnRpdHkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2NvcmUvRW50aXR5JztcbmltcG9ydCB7IFdlYkdMQ29udGV4dFdyYXBwZXIgfSBmcm9tICcuLi93ZWJnbC9XZWJHTENvbnRleHRXcmFwcGVyJztcbmltcG9ydCB7IFN5c3RlbSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vc3lzdGVtL1N5c3RlbSc7XG5pbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9zeXN0ZW0vTW9kdWxlTWFuYWdlcic7XG5pbXBvcnQge1xuICB1cGRhdGVHYW1lUGFkLFxuICBjcmVhdGVNb3Rpb25Db250cm9sbGVyLFxuICB1cGRhdGVNb3Rpb25Db250cm9sbGVyTW9kZWwsXG4gIGdldE1vdGlvbkNvbnRyb2xsZXIsXG59IGZyb20gJy4vV2ViWFJJbnB1dCc7XG5pbXBvcnQgeyBJcyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Jcyc7XG5pbXBvcnQgeyBNdXRhYmxlVmVjdG9yMyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0aC9NdXRhYmxlVmVjdG9yMyc7XG5pbXBvcnQgeyBNdXRhYmxlUXVhdGVybmlvbiB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWF0aC9NdXRhYmxlUXVhdGVybmlvbic7XG5pbXBvcnQgeyBNdXRhYmxlU2NhbGFyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9tYXRoL011dGFibGVTY2FsYXInO1xuaW1wb3J0IHsgSUNhbWVyYUVudGl0eSwgSVNjZW5lR3JhcGhFbnRpdHkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2hlbHBlcnMvRW50aXR5SGVscGVyJztcbmltcG9ydCB7IFdlYkdMU3RlcmVvVXRpbCB9IGZyb20gJy4uL3dlYmdsL1dlYkdMU3RlcmVvVXRpbCc7XG5pbXBvcnQgeyBNYXRlcmlhbFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mb3VuZGF0aW9uL21hdGVyaWFscy9jb3JlL01hdGVyaWFsUmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBjcmVhdGVHcm91cEVudGl0eSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9TY2VuZUdyYXBoL2NyZWF0ZUdyb3VwRW50aXR5JztcbmltcG9ydCB7IGNyZWF0ZUNhbWVyYUVudGl0eSB9IGZyb20gJy4uL2ZvdW5kYXRpb24vY29tcG9uZW50cy9DYW1lcmEvY3JlYXRlQ2FtZXJhRW50aXR5JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbWlzYy9Mb2dnZXInO1xuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IE5hdmlnYXRvcjtcbmRlY2xhcmUgY29uc3Qgd2luZG93OiBhbnk7XG5jb25zdCBkZWZhdWx0VXNlclBvc2l0aW9uSW5WUiA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbMC4wLCAxLjEsIDBdKTtcblxuLyoqXG4gKiBXZWJYUlN5c3RlbSBjbGFzcyBtYW5hZ2VzIFdlYlhSIHNlc3Npb24gYW5kIHJlbmRlcmluZ1xuICovXG5leHBvcnQgY2xhc3MgV2ViWFJTeXN0ZW0ge1xuICBwcml2YXRlIHN0YXRpYyBfX2luc3RhbmNlOiBXZWJYUlN5c3RlbTtcbiAgcHJpdmF0ZSBfX3hyU2Vzc2lvbj86IFhSU2Vzc2lvbjtcbiAgcHJpdmF0ZSBfX3hyUmVmZXJlbmNlU3BhY2U/OiBYUlJlZmVyZW5jZVNwYWNlO1xuICBwcml2YXRlIF9fd2ViZ2xMYXllcj86IFhSV2ViR0xMYXllcjtcbiAgcHJpdmF0ZSBfX2dsdz86IFdlYkdMQ29udGV4dFdyYXBwZXI7XG4gIHByaXZhdGUgX194clZpZXdlclBvc2U/OiBYUlZpZXdlclBvc2UgfCBudWxsO1xuICBwcml2YXRlIF9faXNXZWJYUk1vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX3NwYWNlVHlwZTogWFJSZWZlcmVuY2VTcGFjZVR5cGUgPSAnbG9jYWwnO1xuICBwcml2YXRlIF9fcmVxdWVzdGVkVG9FbnRlcldlYlhSID0gZmFsc2U7XG4gIHByaXZhdGUgX19pc1JlYWR5Rm9yV2ViWFIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2RlZmF1bHRQb3NpdGlvbkluTG9jYWxTcGFjZU1vZGUgPSBkZWZhdWx0VXNlclBvc2l0aW9uSW5WUjtcbiAgcHJpdmF0ZSBfX2NhbnZhc1dpZHRoRm9yVlIgPSAwO1xuICBwcml2YXRlIF9fY2FudmFzSGVpZ2h0Rm9yVlIgPSAwO1xuICBwcml2YXRlIF9fdmlld2VyRW50aXR5OiBJU2NlbmVHcmFwaEVudGl0eTtcbiAgcHJpdmF0ZSBfX2xlZnRDYW1lcmFFbnRpdHk6IElDYW1lcmFFbnRpdHk7XG4gIHByaXZhdGUgX19yaWdodENhbWVyYUVudGl0eTogSUNhbWVyYUVudGl0eTtcbiAgcHJpdmF0ZSBfX2Jhc2VQYXRoPzogc3RyaW5nO1xuICBwcml2YXRlIF9fY29udHJvbGxlckVudGl0aWVzOiBJU2NlbmVHcmFwaEVudGl0eVtdID0gW107XG4gIHByaXZhdGUgX194cklucHV0U291cmNlczogWFJJbnB1dFNvdXJjZVtdID0gW107XG4gIHByaXZhdGUgX192aWV3ZXJUcmFuc2xhdGUgPSBNdXRhYmxlVmVjdG9yMy56ZXJvKCk7XG4gIHByaXZhdGUgX192aWV3ZXJBemltdXRoQW5nbGUgPSBNdXRhYmxlU2NhbGFyLnplcm8oKTtcbiAgcHJpdmF0ZSBfX3ZpZXdlck9yaWVudGF0aW9uID0gTXV0YWJsZVF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgcHJpdmF0ZSBfX3ZpZXdlclNjYWxlID0gTXV0YWJsZVZlY3RvcjMub25lKCk7XG4gIHByaXZhdGUgX19tdWx0aXZpZXdGcmFtZWJ1ZmZlckhhbmRsZSA9IC0xO1xuICBwcml2YXRlIF9fbXVsdGl2aWV3Q29sb3JUZXh0dXJlSGFuZGxlID0gLTE7XG4gIHByaXZhdGUgX193ZWJnbFN0ZXJlb1V0aWw/OiBXZWJHTFN0ZXJlb1V0aWw7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9fdmlld2VyRW50aXR5ID0gY3JlYXRlR3JvdXBFbnRpdHkoKTtcbiAgICB0aGlzLl9fdmlld2VyRW50aXR5LnRyeVRvU2V0VW5pcXVlTmFtZSgnV2ViWFIgVmlld2VyJywgdHJ1ZSk7XG4gICAgdGhpcy5fX3ZpZXdlckVudGl0eS50cnlUb1NldFRhZyh7XG4gICAgICB0YWc6ICd0eXBlJyxcbiAgICAgIHZhbHVlOiAnYmFja2dyb3VuZC1hc3NldHMnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fX2xlZnRDYW1lcmFFbnRpdHkgPSBjcmVhdGVDYW1lcmFFbnRpdHkoKTtcbiAgICB0aGlzLl9fbGVmdENhbWVyYUVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoJ1dlYlhSIExlZnQgQ2FtZXJhJywgdHJ1ZSk7XG4gICAgdGhpcy5fX2xlZnRDYW1lcmFFbnRpdHkudHJ5VG9TZXRUYWcoe1xuICAgICAgdGFnOiAndHlwZScsXG4gICAgICB2YWx1ZTogJ2JhY2tncm91bmQtYXNzZXRzJyxcbiAgICB9KTtcbiAgICB0aGlzLl9fbGVmdENhbWVyYUVudGl0eS5nZXRDYW1lcmEoKS5feHJMZWZ0ID0gdHJ1ZTtcblxuICAgIHRoaXMuX19yaWdodENhbWVyYUVudGl0eSA9IGNyZWF0ZUNhbWVyYUVudGl0eSgpO1xuICAgIHRoaXMuX19yaWdodENhbWVyYUVudGl0eS50cnlUb1NldFVuaXF1ZU5hbWUoJ1dlYlhSIFJpZ2h0IENhbWVyYScsIHRydWUpO1xuICAgIHRoaXMuX19yaWdodENhbWVyYUVudGl0eS50cnlUb1NldFRhZyh7XG4gICAgICB0YWc6ICd0eXBlJyxcbiAgICAgIHZhbHVlOiAnYmFja2dyb3VuZC1hc3NldHMnLFxuICAgIH0pO1xuICAgIHRoaXMuX19yaWdodENhbWVyYUVudGl0eS5nZXRDYW1lcmEoKS5feHJSaWdodCA9IHRydWU7XG5cbiAgICB0aGlzLl9fdmlld2VyRW50aXR5LmdldFNjZW5lR3JhcGgoKS5hZGRDaGlsZCh0aGlzLl9fbGVmdENhbWVyYUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICAgIHRoaXMuX192aWV3ZXJFbnRpdHkuZ2V0U2NlbmVHcmFwaCgpLmFkZENoaWxkKHRoaXMuX19yaWdodENhbWVyYUVudGl0eS5nZXRTY2VuZUdyYXBoKCkpO1xuICB9XG5cbiAgLy8vIFB1YmxpYyBNZXRob2RzXG5cbiAgLyoqXG4gICAqIFJlYWR5IGZvciBXZWJYUlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdEJ1dHRvbkRvbVxuICAgKiBAcmV0dXJucyB0cnVlOiBwcmVwYXJlZCBwcm9wZXJseSwgZmFsc2U6IGZhaWxlZCB0byBwcmVwYXJlXG4gICAqL1xuICBhc3luYyByZWFkeUZvcldlYlhSKHJlcXVlc3RCdXR0b25Eb206IEhUTUxFbGVtZW50LCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5fX2Jhc2VQYXRoID0gYmFzZVBhdGg7XG4gICAgYXdhaXQgTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRNb2R1bGUoJ3hyJyk7XG5cbiAgICBjb25zdCBnbHcgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpLmN1cnJlbnRXZWJHTENvbnRleHRXcmFwcGVyO1xuICAgIGlmIChnbHcgPT0gbnVsbCkge1xuICAgICAgTG9nZ2VyLmVycm9yKCdXZWJHTCBDb250ZXh0IGlzIG5vdCByZWFkeSB5ZXQuJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRoaXMuX19nbHcgPSBnbHc7XG4gICAgY29uc3Qgc3VwcG9ydGVkID0gYXdhaXQgbmF2aWdhdG9yLnhyIS5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2ltbWVyc2l2ZS12cicpO1xuICAgIGlmIChzdXBwb3J0ZWQpIHtcbiAgICAgIGlmIChyZXF1ZXN0QnV0dG9uRG9tKSB7XG4gICAgICAgIHJlcXVlc3RCdXR0b25Eb20uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZSgnaWQnLCAnZW50ZXItdnInKTtcbiAgICAgICAgY29uc3QgZW50ZXJWciA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdFbnRlciBWUicpO1xuXG4gICAgICAgIGFuY2hvci5hcHBlbmRDaGlsZChlbnRlclZyKTtcbiAgICAgICAgcGFyYWdyYXBoLmFwcGVuZENoaWxkKGFuY2hvcik7XG5cbiAgICAgICAgY29uc3QgY2FudmFzID0gZ2x3LmNhbnZhcztcbiAgICAgICAgY2FudmFzLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZShwYXJhZ3JhcGgsIGNhbnZhcyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZW50ZXJXZWJYUi5iaW5kKHRoaXMpIGFzIGFueSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX19pc1JlYWR5Rm9yV2ViWFIgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlhSIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHRvIFdlYlhSIChWUiBtb2RlKVxuICAgKiBAcGFyYW0gaW5pdGlhbFVzZXJQb3NpdGlvbiB0aGUgaW5pdGlhbCB1c2VyIHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlXG4gICAqIEBwYXJhbSBjYWxsYmFja09uWHJTZXNzaW9uRW5kIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgWHJTZXNzaW9uIGVuZGluZ1xuICAgKiBAcmV0dXJucyBib29sZWFuIHZhbHVlIGFib3V0IHN1Y2NlZWRlZCBvciBub3RcbiAgICovXG4gIGFzeW5jIGVudGVyV2ViWFIoe1xuICAgIGluaXRpYWxVc2VyUG9zaXRpb24sXG4gICAgY2FsbGJhY2tPblhyU2Vzc2lvblN0YXJ0ID0gKCkgPT4ge30sXG4gICAgY2FsbGJhY2tPblhyU2Vzc2lvbkVuZCA9ICgpID0+IHt9LFxuICAgIHByb2ZpbGVQcmlvcml0aWVzID0gW10sXG4gIH06IHtcbiAgICBpbml0aWFsVXNlclBvc2l0aW9uPzogVmVjdG9yMztcbiAgICBjYWxsYmFja09uWHJTZXNzaW9uU3RhcnQ6ICgpID0+IHZvaWQ7XG4gICAgY2FsbGJhY2tPblhyU2Vzc2lvbkVuZDogKCkgPT4gdm9pZDtcbiAgICBwcm9maWxlUHJpb3JpdGllczogc3RyaW5nW107XG4gIH0pIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgY29uc3QgZ2x3ID0gd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuY3VycmVudFdlYkdMQ29udGV4dFdyYXBwZXI7XG5cbiAgICBpZiAoZ2x3ICE9IG51bGwgJiYgdGhpcy5fX2lzUmVhZHlGb3JXZWJYUikge1xuICAgICAgbGV0IHJlZmVyZW5jZVNwYWNlOiBYUlJlZmVyZW5jZVNwYWNlO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCBuYXZpZ2F0b3IueHIhLnJlcXVlc3RTZXNzaW9uKCdpbW1lcnNpdmUtdnInKSkgYXMgWFJTZXNzaW9uO1xuICAgICAgdGhpcy5fX3hyU2Vzc2lvbiA9IHNlc3Npb247XG5cbiAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xuICAgICAgICBnbHcuX19nbC5iaW5kRnJhbWVidWZmZXIoZ2x3Ll9fZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB0aGlzLl9feHJTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fd2ViZ2xMYXllciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX3hyVmlld2VyUG9zZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX3hyUmVmZXJlbmNlU3BhY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX19zcGFjZVR5cGUgPSAnbG9jYWwnO1xuICAgICAgICB0aGlzLl9faXNSZWFkeUZvcldlYlhSID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX19yZXF1ZXN0ZWRUb0VudGVyV2ViWFIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fX3hySW5wdXRTb3VyY2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX19zZXRXZWJYUk1vZGUoZmFsc2UpO1xuICAgICAgICBNYXRlcmlhbFJlcG9zaXRvcnkuX21ha2VTaGFkZXJJbnZhbGlkYXRlVG9BbGxNYXRlcmlhbHMoKTtcbiAgICAgICAgdGhpcy5fX2RlZmF1bHRQb3NpdGlvbkluTG9jYWxTcGFjZU1vZGUgPSBkZWZhdWx0VXNlclBvc2l0aW9uSW5WUjtcbiAgICAgICAgTG9nZ2VyLmluZm8oJ1hSU2Vzc2lvbiBlbmRzLicpO1xuICAgICAgICBTeXN0ZW0uc3RvcFJlbmRlckxvb3AoKTtcbiAgICAgICAgU3lzdGVtLnJlc3RhcnRSZW5kZXJMb29wKCk7XG4gICAgICAgIGNhbGxiYWNrT25YclNlc3Npb25FbmQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9taXNlRm4gPSAocmVzb2x2ZTogKGVudGl0aWVzOiBJRW50aXR5W10pID0+IHZvaWQpID0+IHtcbiAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdpbnB1dHNvdXJjZXNjaGFuZ2UnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5fX29uSW5wdXRTb3VyY2VzQ2hhbmdlKGUsIHJlc29sdmUsIHByb2ZpbGVQcmlvcml0aWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHByb21pc2VGbik7XG5cbiAgICAgIC8vIHRyeSB7XG4gICAgICAvLyAgIHJlZmVyZW5jZVNwYWNlID0gYXdhaXQgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoJ2xvY2FsLWZsb29yJyk7XG4gICAgICAvLyAgIHRoaXMuX19zcGFjZVR5cGUgPSAnbG9jYWwtZmxvb3InO1xuICAgICAgLy8gICB0aGlzLl9fZGVmYXVsdFBvc2l0aW9uSW5Mb2NhbFNwYWNlTW9kZSA9XG4gICAgICAvLyAgICAgaW5pdGlhbFVzZXJQb3NpdGlvbiA/PyBWZWN0b3IzLnplcm8oKTtcbiAgICAgIC8vIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc3RhcnQgWFJTZXNzaW9uOiAke2Vycn1gKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIHJlZmVyZW5jZVNwYWNlID0gYXdhaXQgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoJ2xvY2FsJyk7XG4gICAgICB0aGlzLl9fc3BhY2VUeXBlID0gJ2xvY2FsJztcbiAgICAgIHRoaXMuX19kZWZhdWx0UG9zaXRpb25JbkxvY2FsU3BhY2VNb2RlID0gaW5pdGlhbFVzZXJQb3NpdGlvbiA/PyBkZWZhdWx0VXNlclBvc2l0aW9uSW5WUjtcbiAgICAgIHRoaXMuX194clJlZmVyZW5jZVNwYWNlID0gcmVmZXJlbmNlU3BhY2U7XG4gICAgICBTeXN0ZW0uc3RvcFJlbmRlckxvb3AoKTtcbiAgICAgIGF3YWl0IHRoaXMuX19zZXR1cFdlYkdMTGF5ZXIoc2Vzc2lvbiwgY2FsbGJhY2tPblhyU2Vzc2lvblN0YXJ0KTtcbiAgICAgIHRoaXMuX19yZXF1ZXN0ZWRUb0VudGVyV2ViWFIgPSB0cnVlO1xuICAgICAgU3lzdGVtLnJlc3RhcnRSZW5kZXJMb29wKCk7XG4gICAgICBMb2dnZXIud2FybignRW5kIG9mIGVudGVyV2ViWFIuJyk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nZ2VyLmVycm9yKCdXZWJHTCBjb250ZXh0IG9yIFdlYlhSU2Vzc2lvbiBpcyBub3QgcmVhZHkgeWV0LicpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBXZWJYUiAoQ2xvc2UgdGhlIFhyU2Vzc2lvbilcbiAgICovXG4gIGFzeW5jIGV4aXRXZWJYUigpIHtcbiAgICBpZiAodGhpcy5fX3hyU2Vzc2lvbiAhPSBudWxsKSB7XG4gICAgICAvLyBFbmQgdGhlIFhSIHNlc3Npb24gbm93LlxuICAgICAgYXdhaXQgdGhpcy5fX3hyU2Vzc2lvbi5lbmQoKTtcbiAgICB9XG4gIH1cblxuICAvLy8gR2V0dGVyIE1ldGhvZHNcblxuICBnZXRDYW52YXNXaWR0aEZvclZyKCkge1xuICAgIHJldHVybiB0aGlzLl9fY2FudmFzV2lkdGhGb3JWUjtcbiAgfVxuXG4gIGdldENhbnZhc0hlaWdodEZvclZyKCkge1xuICAgIHJldHVybiB0aGlzLl9fY2FudmFzSGVpZ2h0Rm9yVlI7XG4gIH1cblxuICBnZXRDb250cm9sbGVyRW50aXRpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb250cm9sbGVyRW50aXRpZXM7XG4gIH1cblxuICAvLy8gQWNjZXNzb3JzXG5cbiAgZ2V0IGxlZnRWaWV3TWF0cml4KCkge1xuICAgIHJldHVybiB0aGlzLl9fbGVmdENhbWVyYUVudGl0eS5nZXRDYW1lcmEoKS52aWV3TWF0cml4O1xuICB9XG5cbiAgZ2V0IHJpZ2h0Vmlld01hdHJpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3JpZ2h0Q2FtZXJhRW50aXR5LmdldENhbWVyYSgpLnZpZXdNYXRyaXg7XG4gIH1cblxuICBnZXQgbGVmdFByb2plY3Rpb25NYXRyaXgoKSB7XG4gICAgY29uc3QgeHJWaWV3TGVmdCA9IHRoaXMuX194clZpZXdlclBvc2U/LnZpZXdzWzBdO1xuICAgIHJldHVybiBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHlGbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihcbiAgICAgIElzLmV4aXN0KHhyVmlld0xlZnQpID8geHJWaWV3TGVmdC5wcm9qZWN0aW9uTWF0cml4IDogTXV0YWJsZU1hdHJpeDQ0LmlkZW50aXR5KCkuX3ZcbiAgICApO1xuICB9XG5cbiAgZ2V0IHJpZ2h0UHJvamVjdGlvbk1hdHJpeCgpIHtcbiAgICBjb25zdCB4clZpZXdSaWdodCA9IHRoaXMuX194clZpZXdlclBvc2U/LnZpZXdzWzFdO1xuICAgIHJldHVybiBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHlGbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihcbiAgICAgIElzLmV4aXN0KHhyVmlld1JpZ2h0KSA/IHhyVmlld1JpZ2h0LnByb2plY3Rpb25NYXRyaXggOiBNdXRhYmxlTWF0cml4NDQuaWRlbnRpdHkoKS5fdlxuICAgICk7XG4gIH1cblxuICBnZXQgZnJhbWVidWZmZXIoKSB7XG4gICAgLy8gaWYgKHRoaXMuX19tdWx0aXZpZXdGcmFtZWJ1ZmZlckhhbmRsZSA+IDApIHtcbiAgICAvLyAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICAvLyAgIGNvbnN0IGZyYW1lYnVmZmVyID0gd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZShcbiAgICAvLyAgICAgdGhpcy5fX211bHRpdmlld0ZyYW1lYnVmZmVySGFuZGxlXG4gICAgLy8gICApO1xuICAgIC8vICAgcmV0dXJuIGZyYW1lYnVmZmVyIGFzIFdlYkdMRnJhbWVidWZmZXIgfCB1bmRlZmluZWQ7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIHRoaXMuX194clNlc3Npb24/LnJlbmRlclN0YXRlLmJhc2VMYXllcj8uZnJhbWVidWZmZXI7XG4gIH1cblxuICBpc011bHRpVmlldygpIHtcbiAgICBjb25zdCB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeSA9IENHQVBJUmVzb3VyY2VSZXBvc2l0b3J5LmdldFdlYkdMUmVzb3VyY2VSZXBvc2l0b3J5KCk7XG4gICAgcmV0dXJuIHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5LmlzU3VwcG9ydE11bHRpVmlld1ZSUmVuZGVyaW5nKCk7XG4gIH1cblxuICBnZXQgcmVxdWVzdGVkVG9FbnRlcldlYlhSKCkge1xuICAgIHJldHVybiB0aGlzLl9fcmVxdWVzdGVkVG9FbnRlcldlYlhSO1xuICB9XG5cbiAgZ2V0IHhyU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fX3hyU2Vzc2lvbjtcbiAgfVxuXG4gIGdldCByZXF1ZXN0ZWRUb0VudGVyV2ViVlIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19yZXF1ZXN0ZWRUb0VudGVyV2ViWFI7XG4gIH1cblxuICBnZXQgaXNXZWJYUk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1dlYlhSTW9kZTtcbiAgfVxuXG4gIHByaXZhdGUgX19zZXRXZWJYUk1vZGUobW9kZTogYm9vbGVhbikge1xuICAgIHRoaXMuX19pc1dlYlhSTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5fX2dsdyEuX2lzV2ViWFJNb2RlID0gbW9kZTtcbiAgfVxuXG4gIGdldCBpc1JlYWR5Rm9yV2ViWFIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc1JlYWR5Rm9yV2ViWFI7XG4gIH1cblxuICAvLy8gUHVibGljIFN0YXRpYyBNZXRob2RzXG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5fX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9faW5zdGFuY2UgPSBuZXcgV2ViWFJTeXN0ZW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX2luc3RhbmNlO1xuICB9XG5cbiAgLy8vIEZyaWVuZCBtZXRob2RzXG5cbiAgLyoqXG4gICAqIEdldHRlciBvZiB0aGUgdmlldyBtYXRyaXggb2YgcmlnaHQgZXllXG4gICAqIEBwYXJhbSBpbmRleCAoMDogbGVmdCwgMTogcmlnaHQpXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcmV0dXJucyBUaGUgdmlldyBtYXRyaXggdmVjdG9yIG9mIHJpZ2h0IGV5ZVxuICAgKi9cbiAgX2dldFZpZXdNYXRyaXhBdChpbmRleDogSW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmxlZnRWaWV3TWF0cml4O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yaWdodFZpZXdNYXRyaXg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBvZiB0aGUgcHJvamVjdCBtYXRyaXggb2YgcmlnaHQgZXllXG4gICAqIEBwYXJhbSBpbmRleCAoMDogbGVmdCwgMTogcmlnaHQpXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcmV0dXJucyBUaGUgcHJvamVjdCBtYXRyaXggb2YgcmlnaHQgZXllXG4gICAqL1xuICBfZ2V0UHJvamVjdE1hdHJpeEF0KGluZGV4OiBJbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVmdFByb2plY3Rpb25NYXRyaXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJpZ2h0UHJvamVjdGlvbk1hdHJpeDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIG9mIHRoZSB2aWV3cG9ydCB2ZWN0b3JcbiAgICogQHBhcmFtIGluZGV4ICgwOiBsZWZ0LCAxOiByaWdodClcbiAgICogQGludGVybmFsXG4gICAqIEByZXR1cm5zIHRoZSB2aWV3cG9ydCB2ZWN0b3JcbiAgICovXG4gIF9nZXRWaWV3cG9ydEF0KGluZGV4OiBJbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldExlZnRWaWV3cG9ydCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0UmlnaHRWaWV3cG9ydCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgb2YgdGhlIHZpZXdwb3J0IHZlY3RvciBvZiBsZWZ0IGV5ZVxuICAgKiBAaW50ZXJuYWxcbiAgICogQHJldHVybnMgVGhlIHZpZXdwb3J0IHZlY3RvciBvZiBsZWZ0IGV5ZVxuICAgKi9cbiAgX2dldExlZnRWaWV3cG9ydCgpIHtcbiAgICByZXR1cm4gVmVjdG9yNC5mcm9tQ29weUFycmF5KFswLCAwLCB0aGlzLl9fY2FudmFzV2lkdGhGb3JWUiAvIDIsIHRoaXMuX19jYW52YXNIZWlnaHRGb3JWUl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBvZiB0aGUgdmlld3BvcnQgdmVjdG9yIG9mIHJpZ2h0IGV5ZVxuICAgKiBAaW50ZXJuYWxcbiAgICogQHJldHVybnMgVGhlIHZpZXdwb3J0IHZlY3RvciBvZiByaWdodCBleWVcbiAgICovXG4gIF9nZXRSaWdodFZpZXdwb3J0KCkge1xuICAgIGlmICh0aGlzLmlzTXVsdGlWaWV3KCkpIHtcbiAgICAgIHJldHVybiBWZWN0b3I0LmZyb21Db3B5QXJyYXkoWzAsIDAsIHRoaXMuX19jYW52YXNXaWR0aEZvclZSIC8gMiwgdGhpcy5fX2NhbnZhc0hlaWdodEZvclZSXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBWZWN0b3I0LmZyb21Db3B5QXJyYXkoW1xuICAgICAgICB0aGlzLl9fY2FudmFzV2lkdGhGb3JWUiAvIDIsXG4gICAgICAgIDAsXG4gICAgICAgIHRoaXMuX19jYW52YXNXaWR0aEZvclZSIC8gMixcbiAgICAgICAgdGhpcy5fX2NhbnZhc0hlaWdodEZvclZSLFxuICAgICAgXSk7XG4gICAgfVxuICB9XG5cbiAgX3NldFZhbHVlc1RvR2xvYmFsRGF0YVJlcG9zaXRvcnkoKSB7XG4gICAgdGhpcy5fX2xlZnRDYW1lcmFFbnRpdHkuZ2V0Q2FtZXJhKCkucHJvamVjdGlvbk1hdHJpeCA9IHRoaXMubGVmdFByb2plY3Rpb25NYXRyaXg7XG4gICAgdGhpcy5fX3JpZ2h0Q2FtZXJhRW50aXR5LmdldENhbWVyYSgpLnByb2plY3Rpb25NYXRyaXggPSB0aGlzLnJpZ2h0UHJvamVjdGlvbk1hdHJpeDtcbiAgICB0aGlzLl9fbGVmdENhbWVyYUVudGl0eS5nZXRDYW1lcmEoKS5zZXRWYWx1ZXNUb0dsb2JhbERhdGFSZXBvc2l0b3J5KCk7XG4gICAgdGhpcy5fX3JpZ2h0Q2FtZXJhRW50aXR5LmdldENhbWVyYSgpLnNldFZhbHVlc1RvR2xvYmFsRGF0YVJlcG9zaXRvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBWUiBjYW1lcmEgaW4gd29ybGQgc3BhY2VcbiAgICogQGludGVybmFsXG4gICAqIEBwYXJhbSBkaXNwbGF5SWR4ICgwOiBsZWZ0LCAxOiByaWdodClcbiAgICogQHJldHVybnMgVGhlIHBvc2l0aW9uIG9mIHRoZSBWUiBjYW1lcmEgaW4gd29ybGQgc3BhY2VcbiAgICovXG4gIF9nZXRDYW1lcmFXb3JsZFBvc2l0aW9uQXQoZGlzcGxheUlkeDogSW5kZXgpIHtcbiAgICBjb25zdCB4clZpZXcgPSB0aGlzLl9feHJWaWV3ZXJQb3NlPy52aWV3c1tkaXNwbGF5SWR4XTtcbiAgICBpZiAoSXMuZXhpc3QoeHJWaWV3KSkge1xuICAgICAgY29uc3QgcG9zID0geHJWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX19kZWZhdWx0UG9zaXRpb25JbkxvY2FsU3BhY2VNb2RlO1xuICAgICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5fX3ZpZXdlclRyYW5zbGF0ZTtcbiAgICAgIGNvbnN0IHZpZXdlckhlYWRQb3MgPSBWZWN0b3IzLmFkZChWZWN0b3IzLmZyb21Db3B5QXJyYXkoW3Bvcy54LCBwb3MueSwgcG9zLnpdKSwgZGVmKTtcbiAgICAgIHJldHVybiBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW1xuICAgICAgICAodmlld2VySGVhZFBvcy54ICsgdHJhbnNsYXRlLngpICogdGhpcy5fX3ZpZXdlclNjYWxlLngsXG4gICAgICAgICh2aWV3ZXJIZWFkUG9zLnkgKyB0cmFuc2xhdGUueSkgKiB0aGlzLl9fdmlld2VyU2NhbGUueSxcbiAgICAgICAgKHZpZXdlckhlYWRQb3MueiArIHRyYW5zbGF0ZS56KSAqIHRoaXMuX192aWV3ZXJTY2FsZS56LFxuICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGVmYXVsdFBvc2l0aW9uSW5Mb2NhbFNwYWNlTW9kZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIG9mIHRoZSBDYW1lcmFDb21wb25lbnQgU0lEIG9mIGxlZnQvcmlnaHQgZXllXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcGFyYW0gaW5kZXggKDA6IGxlZnQsIDE6IHJpZ2h0KVxuICAgKiBAcmV0dXJucyB0aGUgU0lEIG9mIHRoZSBDYW1lcmFDb21wb25lbnQgb2YgbGVmdC9yaWdodCBleWVcbiAgICovXG4gIF9nZXRDYW1lcmFDb21wb25lbnRTSURBdChpbmRleDogSW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9fbGVmdENhbWVyYUVudGl0eS5nZXRDYW1lcmEoKS5jb21wb25lbnRTSUQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9fcmlnaHRDYW1lcmFFbnRpdHkuZ2V0Q2FtZXJhKCkuY29tcG9uZW50U0lEO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgb2YgdGhlIENhbWVyYUNvbXBvbmVudCBvZiBsZWZ0L3JpZ2h0IGV5ZVxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIGluZGV4ICgwOiBsZWZ0LCAxOiByaWdodClcbiAgICogQHJldHVybnMgdGhlIENhbWVyYUNvbXBvbmVudCBvZiBsZWZ0L3JpZ2h0IGV5ZVxuICAgKi9cbiAgX2dldENhbWVyYUNvbXBvbmVudEF0KGluZGV4OiBJbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19sZWZ0Q2FtZXJhRW50aXR5LmdldENhbWVyYSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3JpZ2h0Q2FtZXJhRW50aXR5LmdldENhbWVyYSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUgcHJvY2VzcyBmb3IgcmVuZGVyaW5nXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcGFyYW0geHJGcmFtZSBYUkZyYW1lIG9iamVjdFxuICAgKi9cbiAgX3ByZVJlbmRlcih0aW1lOiBudW1iZXIsIHhyRnJhbWU6IFhSRnJhbWUpIHtcbiAgICBpZiAodGhpcy5pc1dlYlhSTW9kZSAmJiB0aGlzLl9fcmVxdWVzdGVkVG9FbnRlcldlYlhSICYmIHhyRnJhbWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fX3VwZGF0ZVZpZXcoeHJGcmFtZSk7XG4gICAgICB0aGlzLl9fdXBkYXRlSW5wdXRTb3VyY2VzKHhyRnJhbWUpO1xuICAgICAgdXBkYXRlR2FtZVBhZCh0aW1lLCB4ckZyYW1lLCB7XG4gICAgICAgIHZpZXdlclRyYW5zbGF0ZTogdGhpcy5fX3ZpZXdlclRyYW5zbGF0ZSxcbiAgICAgICAgdmlld2VyU2NhbGU6IHRoaXMuX192aWV3ZXJTY2FsZSxcbiAgICAgICAgdmlld2VyT3JpZW50YXRpb246IHRoaXMuX192aWV3ZXJPcmllbnRhdGlvbixcbiAgICAgICAgdmlld2VyQXppbXV0aEFuZ2xlOiB0aGlzLl9fdmlld2VyQXppbXV0aEFuZ2xlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRWaWV3ZXJUcmFuc2Zvcm0oKSB7XG4gICAgdGhpcy5fX3ZpZXdlclRyYW5zbGF0ZSA9IE11dGFibGVWZWN0b3IzLnplcm8oKTtcbiAgICB0aGlzLl9fdmlld2VyQXppbXV0aEFuZ2xlID0gTXV0YWJsZVNjYWxhci56ZXJvKCk7XG4gICAgdGhpcy5fX3ZpZXdlck9yaWVudGF0aW9uID0gTXV0YWJsZVF1YXRlcm5pb24uaWRlbnRpdHkoKTtcbiAgICB0aGlzLl9fdmlld2VyU2NhbGUgPSBNdXRhYmxlVmVjdG9yMy5vbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IHByb2Nlc3MgZm9yIHJlbmRlcmluZ1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9wb3N0UmVuZGVyKCkge1xuICAgIGlmICh0aGlzLl9faXNXZWJYUk1vZGUpIHtcbiAgICAgIC8vIGNvbnN0IGdsID0gdGhpcy5fX2dsdyEuZ2V0UmF3Q29udGV4dEFzV2ViR0wyKCkhO1xuICAgICAgLy8gaWYgKHRoaXMuX19tdWx0aXZpZXdGcmFtZWJ1ZmZlckhhbmRsZSA+IDApIHtcbiAgICAgIC8vICAgY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgICAgLy8gICBnbC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoZ2wuRFJBV19GUkFNRUJVRkZFUiwgW2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVF0pO1xuICAgICAgLy8gICBnbC5iaW5kRnJhbWVidWZmZXIoXG4gICAgICAvLyAgICAgZ2wuRFJBV19GUkFNRUJVRkZFUixcbiAgICAgIC8vICAgICB0aGlzLl9feHJTZXNzaW9uIS5yZW5kZXJTdGF0ZS5iYXNlTGF5ZXIhLmZyYW1lYnVmZmVyIVxuICAgICAgLy8gICApO1xuICAgICAgLy8gICBjb25zdCBjb2xvclRleHR1cmUgPSB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlKFxuICAgICAgLy8gICAgIHRoaXMuX19tdWx0aXZpZXdDb2xvclRleHR1cmVIYW5kbGVcbiAgICAgIC8vICAgKSBhcyBXZWJHTFRleHR1cmU7XG4gICAgICAvLyAgIHRoaXMuX193ZWJnbFN0ZXJlb1V0aWwhLmJsaXQoXG4gICAgICAvLyAgICAgY29sb3JUZXh0dXJlISxcbiAgICAgIC8vICAgICAwLFxuICAgICAgLy8gICAgIDAsXG4gICAgICAvLyAgICAgMSxcbiAgICAgIC8vICAgICAxLFxuICAgICAgLy8gICAgIHRoaXMuX19jYW52YXNXaWR0aEZvclZSLFxuICAgICAgLy8gICAgIHRoaXMuX19jYW52YXNIZWlnaHRGb3JWUlxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIC8vLyBQcml2YXRlIE1ldGhvZHNcblxuICBwcml2YXRlIGFzeW5jIF9fb25JbnB1dFNvdXJjZXNDaGFuZ2UoXG4gICAgZXZlbnQ6IFhSSW5wdXRTb3VyY2VDaGFuZ2VFdmVudCxcbiAgICByZXNvbHZlOiAoZW50aXRpZXM6IElTY2VuZUdyYXBoRW50aXR5W10pID0+IHZvaWQsXG4gICAgcHJvZmlsZVByaW9yaXRpZXM6IHN0cmluZ1tdXG4gICkge1xuICAgIHRoaXMuX194cklucHV0U291cmNlcy5sZW5ndGggPSAwO1xuICAgIGZvciAoY29uc3QgeHJJbnB1dFNvdXJjZSBvZiBldmVudC5hZGRlZCkge1xuICAgICAgdGhpcy5fX3hySW5wdXRTb3VyY2VzLnB1c2goeHJJbnB1dFNvdXJjZSk7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gYXdhaXQgY3JlYXRlTW90aW9uQ29udHJvbGxlcihcbiAgICAgICAgeHJJbnB1dFNvdXJjZSxcbiAgICAgICAgdGhpcy5fX2Jhc2VQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgcHJvZmlsZVByaW9yaXRpZXNcbiAgICAgICk7XG4gICAgICBpZiAoSXMuZXhpc3QoY29udHJvbGxlcikpIHtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJFbnRpdGllcy5wdXNoKGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLl9fdmlld2VyRW50aXR5LmdldFNjZW5lR3JhcGgoKSEuYWRkQ2hpbGQoY29udHJvbGxlci5nZXRTY2VuZUdyYXBoKCkhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzb2x2ZSh0aGlzLl9fY29udHJvbGxlckVudGl0aWVzKTtcbiAgfVxuXG4gIHByaXZhdGUgX19zZXRDYW1lcmFJbmZvRnJvbVhSVmlld3MoeHJWaWV3ZXJQb3NlOiBYUlZpZXdlclBvc2UpIHtcbiAgICBpZiAoSXMubm90LmV4aXN0KHhyVmlld2VyUG9zZSkpIHtcbiAgICAgIExvZ2dlci53YXJuKCd4clZpZXdlclBvc2Ugbm90IGV4aXN0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHhyVmlld0xlZnQgPSB4clZpZXdlclBvc2Uudmlld3NbMF07XG4gICAgY29uc3QgeHJWaWV3UmlnaHQgPSB4clZpZXdlclBvc2Uudmlld3NbMV07XG4gICAgaWYgKElzLm5vdC5leGlzdCh4clZpZXdMZWZ0KSB8fCBJcy5ub3QuZXhpc3QoeHJWaWV3UmlnaHQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB4clZpZXdlclBvc2UudHJhbnNmb3JtLm9yaWVudGF0aW9uO1xuICAgIHRoaXMuX192aWV3ZXJPcmllbnRhdGlvbi54ID0gb3JpZW50YXRpb24ueDtcbiAgICB0aGlzLl9fdmlld2VyT3JpZW50YXRpb24ueSA9IG9yaWVudGF0aW9uLnk7XG4gICAgdGhpcy5fX3ZpZXdlck9yaWVudGF0aW9uLnogPSBvcmllbnRhdGlvbi56O1xuICAgIHRoaXMuX192aWV3ZXJPcmllbnRhdGlvbi53ID0gb3JpZW50YXRpb24udztcblxuICAgIGNvbnN0IGxtID0gTXV0YWJsZU1hdHJpeDQ0LmZyb21Db3B5RmxvYXQzMkFycmF5Q29sdW1uTWFqb3IoXG4gICAgICB4clZpZXdMZWZ0Py50cmFuc2Zvcm0ubWF0cml4IGFzIEZsb2F0MzJBcnJheVxuICAgICk7XG4gICAgY29uc3Qgcm0gPSBNdXRhYmxlTWF0cml4NDQuZnJvbUNvcHlGbG9hdDMyQXJyYXlDb2x1bW5NYWpvcihcbiAgICAgIHhyVmlld1JpZ2h0Py50cmFuc2Zvcm0ubWF0cml4IGFzIEZsb2F0MzJBcnJheVxuICAgICk7XG5cbiAgICBjb25zdCByb3RhdGVNYXRMZWZ0ID0gbG07XG4gICAgY29uc3Qgcm90YXRlTWF0UmlnaHQgPSBybTtcblxuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fX3ZpZXdlclNjYWxlLng7XG4gICAgY29uc3QgcG9zID0geHJWaWV3TGVmdC50cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgY29uc3QgdHJhbnNsYXRlTGVmdFNjYWxlZCA9IE11dGFibGVWZWN0b3IzLmFkZChcbiAgICAgIHRoaXMuX19kZWZhdWx0UG9zaXRpb25JbkxvY2FsU3BhY2VNb2RlLFxuICAgICAgdGhpcy5fX3ZpZXdlclRyYW5zbGF0ZVxuICAgICk7XG4gICAgY29uc3QgdHJhbnNsYXRlUmlnaHRTY2FsZWQgPSBNdXRhYmxlVmVjdG9yMy5hZGQoXG4gICAgICB0aGlzLl9fZGVmYXVsdFBvc2l0aW9uSW5Mb2NhbFNwYWNlTW9kZSxcbiAgICAgIHRoaXMuX192aWV3ZXJUcmFuc2xhdGVcbiAgICApO1xuICAgIGNvbnN0IHhyVmlld2VyUG9zTGVmdCA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbcG9zLngsIHBvcy55LCBwb3Muel0pO1xuICAgIGNvbnN0IHhyVmlld2VyUG9zUmlnaHQgPSBWZWN0b3IzLmZyb21Db3B5QXJyYXkoW3Bvcy54LCBwb3MueSwgcG9zLnpdKTtcbiAgICBjb25zdCB0cmFuc2xhdGVMZWZ0ID0gTXV0YWJsZVZlY3RvcjMuYWRkKFxuICAgICAgdGhpcy5fX2RlZmF1bHRQb3NpdGlvbkluTG9jYWxTcGFjZU1vZGUsXG4gICAgICB0aGlzLl9fdmlld2VyVHJhbnNsYXRlXG4gICAgKS5hZGQoeHJWaWV3ZXJQb3NMZWZ0KTtcbiAgICBjb25zdCB0cmFuc2xhdGVSaWdodCA9IE11dGFibGVWZWN0b3IzLmFkZChcbiAgICAgIHRoaXMuX19kZWZhdWx0UG9zaXRpb25JbkxvY2FsU3BhY2VNb2RlLFxuICAgICAgdGhpcy5fX3ZpZXdlclRyYW5zbGF0ZVxuICAgICkuYWRkKHhyVmlld2VyUG9zUmlnaHQpO1xuICAgIGNvbnN0IHZpZXdlclRyYW5zbGF0ZVNjYWxlZFggPSAodHJhbnNsYXRlTGVmdFNjYWxlZC54ICsgdHJhbnNsYXRlUmlnaHRTY2FsZWQueCkgLyAyO1xuICAgIGNvbnN0IHZpZXdlclRyYW5zbGF0ZVNjYWxlZFogPSAodHJhbnNsYXRlTGVmdFNjYWxlZC56ICsgdHJhbnNsYXRlUmlnaHRTY2FsZWQueikgLyAyO1xuICAgIGNvbnN0IHZpZXdlclRyYW5zbGF0ZVggPSAodHJhbnNsYXRlTGVmdC54ICsgdHJhbnNsYXRlUmlnaHQueCkgLyAyO1xuICAgIGNvbnN0IHZpZXdlclRyYW5zbGF0ZVogPSAodHJhbnNsYXRlTGVmdC56ICsgdHJhbnNsYXRlUmlnaHQueikgLyAyO1xuICAgIGNvbnN0IHZpZXdlclRyYW5zZm9ybSA9IHRoaXMuX192aWV3ZXJFbnRpdHkuZ2V0VHJhbnNmb3JtKCkhO1xuICAgIHZpZXdlclRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFtcbiAgICAgIHZpZXdlclRyYW5zbGF0ZVNjYWxlZFgsXG4gICAgICAwLFxuICAgICAgdmlld2VyVHJhbnNsYXRlU2NhbGVkWixcbiAgICBdKTtcbiAgICB2aWV3ZXJUcmFuc2Zvcm0ubG9jYWxTY2FsZSA9IFZlY3RvcjMuZnJvbUNvcHlBcnJheShbc2NhbGUsIHNjYWxlLCBzY2FsZV0pO1xuICAgIHZpZXdlclRyYW5zZm9ybS5sb2NhbEV1bGVyQW5nbGVzID0gVmVjdG9yMy5mcm9tQ29weUFycmF5KFswLCB0aGlzLl9fdmlld2VyQXppbXV0aEFuZ2xlLngsIDBdKTtcblxuICAgIHJvdGF0ZU1hdExlZnQudHJhbnNsYXRlWSA9IHRyYW5zbGF0ZUxlZnQueTtcbiAgICByb3RhdGVNYXRMZWZ0LnRyYW5zbGF0ZVggPSB0cmFuc2xhdGVMZWZ0LnggLSB2aWV3ZXJUcmFuc2xhdGVYO1xuICAgIHJvdGF0ZU1hdExlZnQudHJhbnNsYXRlWiA9IHRyYW5zbGF0ZUxlZnQueiAtIHZpZXdlclRyYW5zbGF0ZVo7XG4gICAgcm90YXRlTWF0TGVmdC50cmFuc2xhdGVZICs9IHhyVmlld2VyUG9zTGVmdC55O1xuICAgIHJvdGF0ZU1hdExlZnQudHJhbnNsYXRlWCArPSB4clZpZXdlclBvc0xlZnQueDtcbiAgICByb3RhdGVNYXRMZWZ0LnRyYW5zbGF0ZVogKz0geHJWaWV3ZXJQb3NMZWZ0Lno7XG4gICAgcm90YXRlTWF0UmlnaHQudHJhbnNsYXRlWSA9IHRyYW5zbGF0ZVJpZ2h0Lnk7XG4gICAgcm90YXRlTWF0UmlnaHQudHJhbnNsYXRlWCA9IHRyYW5zbGF0ZVJpZ2h0LnggLSB2aWV3ZXJUcmFuc2xhdGVYO1xuICAgIHJvdGF0ZU1hdFJpZ2h0LnRyYW5zbGF0ZVogPSB0cmFuc2xhdGVSaWdodC56IC0gdmlld2VyVHJhbnNsYXRlWjtcbiAgICByb3RhdGVNYXRSaWdodC50cmFuc2xhdGVZICs9IHhyVmlld2VyUG9zUmlnaHQueTtcbiAgICByb3RhdGVNYXRSaWdodC50cmFuc2xhdGVYICs9IHhyVmlld2VyUG9zUmlnaHQueDtcbiAgICByb3RhdGVNYXRSaWdodC50cmFuc2xhdGVaICs9IHhyVmlld2VyUG9zUmlnaHQuejtcblxuICAgIHRoaXMuX19sZWZ0Q2FtZXJhRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbE1hdHJpeCA9IHJvdGF0ZU1hdExlZnQ7XG4gICAgdGhpcy5fX3JpZ2h0Q2FtZXJhRW50aXR5LmdldFRyYW5zZm9ybSgpIS5sb2NhbE1hdHJpeCA9IHJvdGF0ZU1hdFJpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX3NldHVwV2ViR0xMYXllcih4clNlc3Npb246IFhSU2Vzc2lvbiwgY2FsbGJhY2tPblhyU2Vzc2lvblN0YXJ0OiAoKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZ2wgPSB0aGlzLl9fZ2x3Py5nZXRSYXdDb250ZXh0QXNXZWJHTDIoKTtcblxuICAgIGlmIChnbCAhPSBudWxsKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbnZhcyBjb250ZXh0IHdlIHdhbnQgdG8gdXNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB4ciBkZXZpY2UuXG4gICAgICBhd2FpdCAoZ2wgYXMgYW55KS5tYWtlWFJDb21wYXRpYmxlKCk7XG4gICAgICAvLyBUaGUgY29udGVudCB0aGF0IHdpbGwgYmUgc2hvd24gb24gdGhlIGRldmljZSBpcyBkZWZpbmVkIGJ5IHRoZSBzZXNzaW9uJ3NcbiAgICAgIC8vIGJhc2VMYXllci5cblxuICAgICAgdGhpcy5fX3dlYmdsTGF5ZXIgPSBuZXcgd2luZG93LlhSV2ViR0xMYXllcih4clNlc3Npb24sIGdsKSBhcyBYUldlYkdMTGF5ZXI7XG4gICAgICBjb25zdCB3ZWJnbExheWVyID0gdGhpcy5fX3dlYmdsTGF5ZXI7XG4gICAgICB4clNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoe1xuICAgICAgICBiYXNlTGF5ZXI6IHdlYmdsTGF5ZXIsXG4gICAgICAgIGRlcHRoTmVhcjogMC4wMSxcbiAgICAgICAgZGVwdGhGYXI6IDEwMDAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHdlYmdsUmVzb3VyY2VSZXBvc2l0b3J5ID0gQ0dBUElSZXNvdXJjZVJlcG9zaXRvcnkuZ2V0V2ViR0xSZXNvdXJjZVJlcG9zaXRvcnkoKTtcbiAgICAgIHRoaXMuX19jYW52YXNXaWR0aEZvclZSID0gd2ViZ2xMYXllci5mcmFtZWJ1ZmZlcldpZHRoO1xuICAgICAgdGhpcy5fX2NhbnZhc0hlaWdodEZvclZSID0gd2ViZ2xMYXllci5mcmFtZWJ1ZmZlckhlaWdodDtcbiAgICAgIExvZ2dlci5pbmZvKHRoaXMuX19jYW52YXNXaWR0aEZvclZSLnRvU3RyaW5nKCkpO1xuICAgICAgTG9nZ2VyLmluZm8odGhpcy5fX2NhbnZhc0hlaWdodEZvclZSLnRvU3RyaW5nKCkpO1xuXG4gICAgICAvLyBpZiAodGhpcy5fX211bHRpdmlld0ZyYW1lYnVmZmVySGFuZGxlID09PSAtMSkge1xuICAgICAgLy8gY29uc3Qgd2ViZ2xSZXNvdXJjZVJlcG9zaXRvcnkgPSBDR0FQSVJlc291cmNlUmVwb3NpdG9yeS5nZXRXZWJHTFJlc291cmNlUmVwb3NpdG9yeSgpO1xuICAgICAgLy8gW3RoaXMuX19tdWx0aXZpZXdGcmFtZWJ1ZmZlckhhbmRsZSwgdGhpcy5fX211bHRpdmlld0NvbG9yVGV4dHVyZUhhbmRsZV0gPVxuICAgICAgLy8gICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5jcmVhdGVNdWx0aXZpZXdGcmFtZWJ1ZmZlcihcbiAgICAgIC8vICAgICB3ZWJnbExheWVyLmZyYW1lYnVmZmVyV2lkdGgsXG4gICAgICAvLyAgICAgd2ViZ2xMYXllci5mcmFtZWJ1ZmZlckhlaWdodCxcbiAgICAgIC8vICAgICA0XG4gICAgICAvLyAgICk7XG4gICAgICAvLyB0aGlzLl9fd2ViZ2xTdGVyZW9VdGlsID0gbmV3IFdlYkdMU3RlcmVvVXRpbChnbCk7XG4gICAgICAvLyB9XG5cbiAgICAgIE1hdGVyaWFsUmVwb3NpdG9yeS5fbWFrZVNoYWRlckludmFsaWRhdGVUb0FsbE1hdGVyaWFscygpO1xuXG4gICAgICB3ZWJnbFJlc291cmNlUmVwb3NpdG9yeS5yZXNpemVDYW52YXModGhpcy5fX2NhbnZhc1dpZHRoRm9yVlIsIHRoaXMuX19jYW52YXNIZWlnaHRGb3JWUik7XG4gICAgICB0aGlzLl9fc2V0V2ViWFJNb2RlKHRydWUpO1xuICAgICAgY2FsbGJhY2tPblhyU2Vzc2lvblN0YXJ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIExvZ2dlci5lcnJvcignV2ViR0wgY29udGV4dCBpcyBub3QgcmVhZHkgZm9yIFdlYlhSLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX191cGRhdGVWaWV3KHhyRnJhbWU6IFhSRnJhbWUpIHtcbiAgICB0aGlzLl9feHJWaWV3ZXJQb3NlID0geHJGcmFtZS5nZXRWaWV3ZXJQb3NlKHRoaXMuX194clJlZmVyZW5jZVNwYWNlISk7XG4gICAgdGhpcy5fX3NldENhbWVyYUluZm9Gcm9tWFJWaWV3cyh0aGlzLl9feHJWaWV3ZXJQb3NlISk7XG4gIH1cblxuICBwcml2YXRlIF9fdXBkYXRlSW5wdXRTb3VyY2VzKHhyRnJhbWU6IFhSRnJhbWUpIHtcbiAgICB0aGlzLl9feHJJbnB1dFNvdXJjZXMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgIGlmIChJcy5leGlzdChpbnB1dC5ncmlwU3BhY2UpKSB7XG4gICAgICAgIGNvbnN0IHhyUG9zZSA9IHhyRnJhbWUuZ2V0UG9zZShpbnB1dC5ncmlwU3BhY2UsIHRoaXMuX194clJlZmVyZW5jZVNwYWNlISk7XG4gICAgICAgIGlmIChJcy5leGlzdCh4clBvc2UpKSB7XG4gICAgICAgICAgY29uc3QgaGFuZCA9IHRoaXMuX19jb250cm9sbGVyRW50aXRpZXNbaV07XG4gICAgICAgICAgaWYgKElzLmV4aXN0KGhhbmQpKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHRyYW5zZm9ybSBvZiB0aGUgY29udHJvbGxlciBpdHNlbGZcbiAgICAgICAgICAgIGNvbnN0IGhhbmRXb3JsZE1hdHJpeCA9IE11dGFibGVNYXRyaXg0NC5mcm9tQ29weUZsb2F0MzJBcnJheUNvbHVtbk1ham9yKFxuICAgICAgICAgICAgICB4clBvc2UudHJhbnNmb3JtLm1hdHJpeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJvdGF0ZU1hdCA9IE11dGFibGVNYXRyaXg0NC5mcm9tQ29weU1hdHJpeDQ0KGhhbmRXb3JsZE1hdHJpeCk7XG4gICAgICAgICAgICByb3RhdGVNYXQudHJhbnNsYXRlWSArPSB0aGlzLl9fZGVmYXVsdFBvc2l0aW9uSW5Mb2NhbFNwYWNlTW9kZS55O1xuICAgICAgICAgICAgcm90YXRlTWF0LnRyYW5zbGF0ZVkgKz0gdGhpcy5fX3ZpZXdlclRyYW5zbGF0ZS55O1xuICAgICAgICAgICAgaGFuZC5nZXRUcmFuc2Zvcm0oKSEubG9jYWxNYXRyaXggPSByb3RhdGVNYXQ7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29tcG9uZW50cyAoYnV0dG9ucywgZXRjLi4uKSBvZiB0aGUgY29udHJvbGxlclxuICAgICAgICAgICAgY29uc3QgbW90aW9uQ29udHJvbGxlciA9IGdldE1vdGlvbkNvbnRyb2xsZXIoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKElzLmV4aXN0KG1vdGlvbkNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZU1vdGlvbkNvbnRyb2xsZXJNb2RlbChoYW5kLCBtb3Rpb25Db250cm9sbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIExvZ2dlci53YXJuKCdtb3Rpb25Db250cm9sbGVyIG5vdCBmb3VuZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2R1bGVNYW5hZ2VyIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9zeXN0ZW0vTW9kdWxlTWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFdlYlhSU3lzdGVtIH0gZnJvbSAnLi9XZWJYUlN5c3RlbSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJYUlN5c3RlbSgpOiBXZWJYUlN5c3RlbSB7XG4gIGNvbnN0IG1vZHVsZU5hbWUgPSAneHInO1xuICBjb25zdCBtb2R1bGVNYW5hZ2VyID0gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICBjb25zdCB4ck1vZHVsZSA9IG1vZHVsZU1hbmFnZXIuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpISBhcyBhbnk7XG4gIGNvbnN0IHdlYlhSU3lzdGVtOiBXZWJYUlN5c3RlbSA9IHhyTW9kdWxlLldlYlhSU3lzdGVtLmdldEluc3RhbmNlKCk7XG4gIHJldHVybiB3ZWJYUlN5c3RlbTtcbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vV2ViWFJJbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL1dlYlhSU3lzdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbWFpbic7XG4iLCJpbXBvcnQgeyBXZWJYUlN5c3RlbSB9IGZyb20gJy4vV2ViWFJTeXN0ZW0nO1xuaW1wb3J0IHsgV2ViQVJTeXN0ZW0gfSBmcm9tICcuL1dlYkFSU3lzdGVtJztcblxuY29uc3QgWFIgPSBPYmplY3QuZnJlZXplKHtcbiAgV2ViWFJTeXN0ZW0sXG4gIFdlYkFSU3lzdGVtLFxufSk7XG5leHBvcnQgZGVmYXVsdCBYUjtcblxuZXhwb3J0IHR5cGUgUm5YUiA9IHR5cGVvZiBYUjtcbigwLCBldmFsKSgndGhpcycpLlJuWFIgPSBYUjtcbiIsImV4cG9ydCBkZWZhdWx0IHtcInZlcnNpb25cIjpcInYwLjEzLjItMC1nNjE0MGI5ODFkLWRpcnR5XCIsXCJicmFuY2hcIjpcIm1haW5cIn0iLCJpbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBWaXN1YWxSZXNwb25zZSB9IGZyb20gJy4vdmlzdWFsUmVzcG9uc2UnO1xuXG5jbGFzcyBDb21wb25lbnQge1xuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudElkIC0gSWQgb2YgdGhlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29tcG9uZW50RGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudElkLCBjb21wb25lbnREZXNjcmlwdGlvbikge1xuICAgIGlmICghY29tcG9uZW50SWRcbiAgICAgfHwgIWNvbXBvbmVudERlc2NyaXB0aW9uXG4gICAgIHx8ICFjb21wb25lbnREZXNjcmlwdGlvbi52aXN1YWxSZXNwb25zZXNcbiAgICAgfHwgIWNvbXBvbmVudERlc2NyaXB0aW9uLmdhbWVwYWRJbmRpY2VzXG4gICAgIHx8IE9iamVjdC5rZXlzKGNvbXBvbmVudERlc2NyaXB0aW9uLmdhbWVwYWRJbmRpY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmlkID0gY29tcG9uZW50SWQ7XG4gICAgdGhpcy50eXBlID0gY29tcG9uZW50RGVzY3JpcHRpb24udHlwZTtcbiAgICB0aGlzLnJvb3ROb2RlTmFtZSA9IGNvbXBvbmVudERlc2NyaXB0aW9uLnJvb3ROb2RlTmFtZTtcbiAgICB0aGlzLnRvdWNoUG9pbnROb2RlTmFtZSA9IGNvbXBvbmVudERlc2NyaXB0aW9uLnRvdWNoUG9pbnROb2RlTmFtZTtcblxuICAgIC8vIEJ1aWxkIGFsbCB0aGUgdmlzdWFsIHJlc3BvbnNlcyBmb3IgdGhpcyBjb21wb25lbnRcbiAgICB0aGlzLnZpc3VhbFJlc3BvbnNlcyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudERlc2NyaXB0aW9uLnZpc3VhbFJlc3BvbnNlcykuZm9yRWFjaCgocmVzcG9uc2VOYW1lKSA9PiB7XG4gICAgICBjb25zdCB2aXN1YWxSZXNwb25zZSA9IG5ldyBWaXN1YWxSZXNwb25zZShjb21wb25lbnREZXNjcmlwdGlvbi52aXN1YWxSZXNwb25zZXNbcmVzcG9uc2VOYW1lXSk7XG4gICAgICB0aGlzLnZpc3VhbFJlc3BvbnNlc1tyZXNwb25zZU5hbWVdID0gdmlzdWFsUmVzcG9uc2U7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICB0aGlzLmdhbWVwYWRJbmRpY2VzID0gT2JqZWN0LmFzc2lnbih7fSwgY29tcG9uZW50RGVzY3JpcHRpb24uZ2FtZXBhZEluZGljZXMpO1xuXG4gICAgdGhpcy52YWx1ZXMgPSB7XG4gICAgICBzdGF0ZTogQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLkRFRkFVTFQsXG4gICAgICBidXR0b246ICh0aGlzLmdhbWVwYWRJbmRpY2VzLmJ1dHRvbiAhPT0gdW5kZWZpbmVkKSA/IDAgOiB1bmRlZmluZWQsXG4gICAgICB4QXhpczogKHRoaXMuZ2FtZXBhZEluZGljZXMueEF4aXMgIT09IHVuZGVmaW5lZCkgPyAwIDogdW5kZWZpbmVkLFxuICAgICAgeUF4aXM6ICh0aGlzLmdhbWVwYWRJbmRpY2VzLnlBeGlzICE9PSB1bmRlZmluZWQpID8gMCA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBnZXQgZGF0YSgpIHtcbiAgICBjb25zdCBkYXRhID0geyBpZDogdGhpcy5pZCwgLi4udGhpcy52YWx1ZXMgfTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUG9sbCBmb3IgdXBkYXRlZCBkYXRhIGJhc2VkIG9uIGN1cnJlbnQgZ2FtZXBhZCBzdGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZ2FtZXBhZCAtIFRoZSBnYW1lcGFkIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgZGF0YSBzaG91bGQgYmUgcG9sbGVkXG4gICAqL1xuICB1cGRhdGVGcm9tR2FtZXBhZChnYW1lcGFkKSB7XG4gICAgLy8gU2V0IHRoZSBzdGF0ZSB0byBkZWZhdWx0IGJlZm9yZSBwcm9jZXNzaW5nIG90aGVyIGRhdGEgc291cmNlc1xuICAgIHRoaXMudmFsdWVzLnN0YXRlID0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLkRFRkFVTFQ7XG5cbiAgICAvLyBHZXQgYW5kIG5vcm1hbGl6ZSBidXR0b25cbiAgICBpZiAodGhpcy5nYW1lcGFkSW5kaWNlcy5idXR0b24gIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiBnYW1lcGFkLmJ1dHRvbnMubGVuZ3RoID4gdGhpcy5nYW1lcGFkSW5kaWNlcy5idXR0b24pIHtcbiAgICAgIGNvbnN0IGdhbWVwYWRCdXR0b24gPSBnYW1lcGFkLmJ1dHRvbnNbdGhpcy5nYW1lcGFkSW5kaWNlcy5idXR0b25dO1xuICAgICAgdGhpcy52YWx1ZXMuYnV0dG9uID0gZ2FtZXBhZEJ1dHRvbi52YWx1ZTtcbiAgICAgIHRoaXMudmFsdWVzLmJ1dHRvbiA9ICh0aGlzLnZhbHVlcy5idXR0b24gPCAwKSA/IDAgOiB0aGlzLnZhbHVlcy5idXR0b247XG4gICAgICB0aGlzLnZhbHVlcy5idXR0b24gPSAodGhpcy52YWx1ZXMuYnV0dG9uID4gMSkgPyAxIDogdGhpcy52YWx1ZXMuYnV0dG9uO1xuXG4gICAgICAvLyBTZXQgdGhlIHN0YXRlIGJhc2VkIG9uIHRoZSBidXR0b25cbiAgICAgIGlmIChnYW1lcGFkQnV0dG9uLnByZXNzZWQgfHwgdGhpcy52YWx1ZXMuYnV0dG9uID09PSAxKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLnN0YXRlID0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLlBSRVNTRUQ7XG4gICAgICB9IGVsc2UgaWYgKGdhbWVwYWRCdXR0b24udG91Y2hlZCB8fCB0aGlzLnZhbHVlcy5idXR0b24gPiBDb25zdGFudHMuQnV0dG9uVG91Y2hUaHJlc2hvbGQpIHtcbiAgICAgICAgdGhpcy52YWx1ZXMuc3RhdGUgPSBDb25zdGFudHMuQ29tcG9uZW50U3RhdGUuVE9VQ0hFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYW5kIG5vcm1hbGl6ZSB4IGF4aXMgdmFsdWVcbiAgICBpZiAodGhpcy5nYW1lcGFkSW5kaWNlcy54QXhpcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIGdhbWVwYWQuYXhlcy5sZW5ndGggPiB0aGlzLmdhbWVwYWRJbmRpY2VzLnhBeGlzKSB7XG4gICAgICB0aGlzLnZhbHVlcy54QXhpcyA9IGdhbWVwYWQuYXhlc1t0aGlzLmdhbWVwYWRJbmRpY2VzLnhBeGlzXTtcbiAgICAgIHRoaXMudmFsdWVzLnhBeGlzID0gKHRoaXMudmFsdWVzLnhBeGlzIDwgLTEpID8gLTEgOiB0aGlzLnZhbHVlcy54QXhpcztcbiAgICAgIHRoaXMudmFsdWVzLnhBeGlzID0gKHRoaXMudmFsdWVzLnhBeGlzID4gMSkgPyAxIDogdGhpcy52YWx1ZXMueEF4aXM7XG5cbiAgICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBzdGlsbCBkZWZhdWx0LCBjaGVjayBpZiB0aGUgeEF4aXMgbWFrZXMgaXQgdG91Y2hlZFxuICAgICAgaWYgKHRoaXMudmFsdWVzLnN0YXRlID09PSBDb25zdGFudHMuQ29tcG9uZW50U3RhdGUuREVGQVVMVFxuICAgICAgICAmJiBNYXRoLmFicyh0aGlzLnZhbHVlcy54QXhpcykgPiBDb25zdGFudHMuQXhpc1RvdWNoVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLnN0YXRlID0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLlRPVUNIRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGFuZCBub3JtYWxpemUgWSBheGlzIHZhbHVlXG4gICAgaWYgKHRoaXMuZ2FtZXBhZEluZGljZXMueUF4aXMgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiBnYW1lcGFkLmF4ZXMubGVuZ3RoID4gdGhpcy5nYW1lcGFkSW5kaWNlcy55QXhpcykge1xuICAgICAgdGhpcy52YWx1ZXMueUF4aXMgPSBnYW1lcGFkLmF4ZXNbdGhpcy5nYW1lcGFkSW5kaWNlcy55QXhpc107XG4gICAgICB0aGlzLnZhbHVlcy55QXhpcyA9ICh0aGlzLnZhbHVlcy55QXhpcyA8IC0xKSA/IC0xIDogdGhpcy52YWx1ZXMueUF4aXM7XG4gICAgICB0aGlzLnZhbHVlcy55QXhpcyA9ICh0aGlzLnZhbHVlcy55QXhpcyA+IDEpID8gMSA6IHRoaXMudmFsdWVzLnlBeGlzO1xuXG4gICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgc3RpbGwgZGVmYXVsdCwgY2hlY2sgaWYgdGhlIHlBeGlzIG1ha2VzIGl0IHRvdWNoZWRcbiAgICAgIGlmICh0aGlzLnZhbHVlcy5zdGF0ZSA9PT0gQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLkRFRkFVTFRcbiAgICAgICAgJiYgTWF0aC5hYnModGhpcy52YWx1ZXMueUF4aXMpID4gQ29uc3RhbnRzLkF4aXNUb3VjaFRocmVzaG9sZCkge1xuICAgICAgICB0aGlzLnZhbHVlcy5zdGF0ZSA9IENvbnN0YW50cy5Db21wb25lbnRTdGF0ZS5UT1VDSEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgdmlzdWFsIHJlc3BvbnNlIHdlaWdodHMgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcG9uZW50IGRhdGFcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsUmVzcG9uc2VzKS5mb3JFYWNoKCh2aXN1YWxSZXNwb25zZSkgPT4ge1xuICAgICAgdmlzdWFsUmVzcG9uc2UudXBkYXRlRnJvbUNvbXBvbmVudCh0aGlzLnZhbHVlcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29tcG9uZW50IH07XG4iLCJjb25zdCBDb25zdGFudHMgPSB7XG4gIEhhbmRlZG5lc3M6IE9iamVjdC5mcmVlemUoe1xuICAgIE5PTkU6ICdub25lJyxcbiAgICBMRUZUOiAnbGVmdCcsXG4gICAgUklHSFQ6ICdyaWdodCdcbiAgfSksXG5cbiAgQ29tcG9uZW50U3RhdGU6IE9iamVjdC5mcmVlemUoe1xuICAgIERFRkFVTFQ6ICdkZWZhdWx0JyxcbiAgICBUT1VDSEVEOiAndG91Y2hlZCcsXG4gICAgUFJFU1NFRDogJ3ByZXNzZWQnXG4gIH0pLFxuXG4gIENvbXBvbmVudFByb3BlcnR5OiBPYmplY3QuZnJlZXplKHtcbiAgICBCVVRUT046ICdidXR0b24nLFxuICAgIFhfQVhJUzogJ3hBeGlzJyxcbiAgICBZX0FYSVM6ICd5QXhpcycsXG4gICAgU1RBVEU6ICdzdGF0ZSdcbiAgfSksXG5cbiAgQ29tcG9uZW50VHlwZTogT2JqZWN0LmZyZWV6ZSh7XG4gICAgVFJJR0dFUjogJ3RyaWdnZXInLFxuICAgIFNRVUVFWkU6ICdzcXVlZXplJyxcbiAgICBUT1VDSFBBRDogJ3RvdWNocGFkJyxcbiAgICBUSFVNQlNUSUNLOiAndGh1bWJzdGljaycsXG4gICAgQlVUVE9OOiAnYnV0dG9uJ1xuICB9KSxcblxuICBCdXR0b25Ub3VjaFRocmVzaG9sZDogMC4wNSxcblxuICBBeGlzVG91Y2hUaHJlc2hvbGQ6IDAuMSxcblxuICBWaXN1YWxSZXNwb25zZVByb3BlcnR5OiBPYmplY3QuZnJlZXplKHtcbiAgICBUUkFOU0ZPUk06ICd0cmFuc2Zvcm0nLFxuICAgIFZJU0lCSUxJVFk6ICd2aXNpYmlsaXR5J1xuICB9KVxufTtcblxuZXhwb3J0IHsgQ29uc3RhbnRzIH07XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xuXG4vKipcbiAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgbW90aW9uIGNvbnRyb2xsZXIgd2l0aCBjb21wb25lbnRzIGFuZCB2aXN1YWwgcmVzcG9uc2VzIGJhc2VkIG9uIHRoZVxuICAqIHN1cHBsaWVkIHByb2ZpbGUgZGVzY3JpcHRpb24uIERhdGEgaXMgcG9sbGVkIGZyb20gdGhlIHhySW5wdXRTb3VyY2UncyBnYW1lcGFkLlxuICAqIEBhdXRob3IgTmVsbCBXYWxpY3playAvIGh0dHBzOi8vZ2l0aHViLmNvbS9OZWxsV2FsaWN6ZWtcbiovXG5jbGFzcyBNb3Rpb25Db250cm9sbGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB4cklucHV0U291cmNlIC0gVGhlIFhSSW5wdXRTb3VyY2UgdG8gYnVpbGQgdGhlIE1vdGlvbkNvbnRyb2xsZXIgYXJvdW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9maWxlIC0gVGhlIGJlc3QgbWF0Y2hlZCBwcm9maWxlIGRlc2NyaXB0aW9uIGZvciB0aGUgc3VwcGxpZWQgeHJJbnB1dFNvdXJjZVxuICAgKiBAcGFyYW0ge09iamVjdH0gYXNzZXRVcmxcbiAgICovXG4gIGNvbnN0cnVjdG9yKHhySW5wdXRTb3VyY2UsIHByb2ZpbGUsIGFzc2V0VXJsKSB7XG4gICAgaWYgKCF4cklucHV0U291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHhySW5wdXRTb3VyY2Ugc3VwcGxpZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcHJvZmlsZSBzdXBwbGllZCcpO1xuICAgIH1cblxuICAgIHRoaXMueHJJbnB1dFNvdXJjZSA9IHhySW5wdXRTb3VyY2U7XG4gICAgdGhpcy5hc3NldFVybCA9IGFzc2V0VXJsO1xuICAgIHRoaXMuaWQgPSBwcm9maWxlLnByb2ZpbGVJZDtcblxuICAgIC8vIEJ1aWxkIGNoaWxkIGNvbXBvbmVudHMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcm9maWxlIGRlc2NyaXB0aW9uXG4gICAgdGhpcy5sYXlvdXREZXNjcmlwdGlvbiA9IHByb2ZpbGUubGF5b3V0c1t4cklucHV0U291cmNlLmhhbmRlZG5lc3NdO1xuICAgIHRoaXMuY29tcG9uZW50cyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHRoaXMubGF5b3V0RGVzY3JpcHRpb24uY29tcG9uZW50cykuZm9yRWFjaCgoY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudERlc2NyaXB0aW9uID0gdGhpcy5sYXlvdXREZXNjcmlwdGlvbi5jb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgIHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRJZF0gPSBuZXcgQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnREZXNjcmlwdGlvbik7XG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbXBvbmVudHMgYmFzZWQgb24gY3VycmVudCBnYW1lcGFkIHN0YXRlXG4gICAgdGhpcy51cGRhdGVGcm9tR2FtZXBhZCgpO1xuICB9XG5cbiAgZ2V0IGdyaXBTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy54cklucHV0U291cmNlLmdyaXBTcGFjZTtcbiAgfVxuXG4gIGdldCB0YXJnZXRSYXlTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy54cklucHV0U291cmNlLnRhcmdldFJheVNwYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc3Vic2V0IG9mIGNvbXBvbmVudCBkYXRhIGZvciBzaW1wbGlmaWVkIGRlYnVnZ2luZ1xuICAgKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgY29uc3QgZGF0YSA9IFtdO1xuICAgIE9iamVjdC52YWx1ZXModGhpcy5jb21wb25lbnRzKS5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcbiAgICAgIGRhdGEucHVzaChjb21wb25lbnQuZGF0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBvbGwgZm9yIHVwZGF0ZWQgZGF0YSBiYXNlZCBvbiBjdXJyZW50IGdhbWVwYWQgc3RhdGVcbiAgICovXG4gIHVwZGF0ZUZyb21HYW1lcGFkKCkge1xuICAgIE9iamVjdC52YWx1ZXModGhpcy5jb21wb25lbnRzKS5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcbiAgICAgIGNvbXBvbmVudC51cGRhdGVGcm9tR2FtZXBhZCh0aGlzLnhySW5wdXRTb3VyY2UuZ2FtZXBhZCk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW90aW9uQ29udHJvbGxlciB9O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGhlbHBlciBmdW5jdGlvbiB0byBmZXRjaCBhIEpTT04gZmlsZSBhbmQgdHVybiBpdCBpbnRvIGEgSlMgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGggdG8gSlNPTiBmaWxlIHRvIGJlIGZldGNoZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uRmlsZShwYXRoKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocGF0aCk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFByb2ZpbGVzTGlzdChiYXNlUGF0aCkge1xuICBpZiAoIWJhc2VQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYXNlUGF0aCBzdXBwbGllZCcpO1xuICB9XG5cbiAgY29uc3QgcHJvZmlsZUxpc3RGaWxlTmFtZSA9ICdwcm9maWxlc0xpc3QuanNvbic7XG4gIGNvbnN0IHByb2ZpbGVzTGlzdCA9IGF3YWl0IGZldGNoSnNvbkZpbGUoYCR7YmFzZVBhdGh9LyR7cHJvZmlsZUxpc3RGaWxlTmFtZX1gKTtcbiAgcmV0dXJuIHByb2ZpbGVzTGlzdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQcm9maWxlKHhySW5wdXRTb3VyY2UsIGJhc2VQYXRoLCBkZWZhdWx0UHJvZmlsZSA9IG51bGwsIGdldEFzc2V0UGF0aCA9IHRydWUpIHtcbiAgaWYgKCF4cklucHV0U291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyB4cklucHV0U291cmNlIHN1cHBsaWVkJyk7XG4gIH1cblxuICBpZiAoIWJhc2VQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYXNlUGF0aCBzdXBwbGllZCcpO1xuICB9XG5cbiAgLy8gR2V0IHRoZSBsaXN0IG9mIHByb2ZpbGVzXG4gIGNvbnN0IHN1cHBvcnRlZFByb2ZpbGVzTGlzdCA9IGF3YWl0IGZldGNoUHJvZmlsZXNMaXN0KGJhc2VQYXRoKTtcblxuICAvLyBGaW5kIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaXJzdCByZXF1ZXN0ZWQgcHJvZmlsZSB0aGF0IGlzIHJlY29nbml6ZWRcbiAgbGV0IG1hdGNoO1xuICB4cklucHV0U291cmNlLnByb2ZpbGVzLnNvbWUoKHByb2ZpbGVJZCkgPT4ge1xuICAgIGNvbnN0IHN1cHBvcnRlZFByb2ZpbGUgPSBzdXBwb3J0ZWRQcm9maWxlc0xpc3RbcHJvZmlsZUlkXTtcbiAgICBpZiAoc3VwcG9ydGVkUHJvZmlsZSkge1xuICAgICAgbWF0Y2ggPSB7XG4gICAgICAgIHByb2ZpbGVJZCxcbiAgICAgICAgcHJvZmlsZVBhdGg6IGAke2Jhc2VQYXRofS8ke3N1cHBvcnRlZFByb2ZpbGUucGF0aH1gLFxuICAgICAgICBkZXByZWNhdGVkOiAhIXN1cHBvcnRlZFByb2ZpbGUuZGVwcmVjYXRlZFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuICEhbWF0Y2g7XG4gIH0pO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICBpZiAoIWRlZmF1bHRQcm9maWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1hdGNoaW5nIHByb2ZpbGUgbmFtZSBmb3VuZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1cHBvcnRlZFByb2ZpbGUgPSBzdXBwb3J0ZWRQcm9maWxlc0xpc3RbZGVmYXVsdFByb2ZpbGVdO1xuICAgIGlmICghc3VwcG9ydGVkUHJvZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtYXRjaGluZyBwcm9maWxlIG5hbWUgZm91bmQgYW5kIGRlZmF1bHQgcHJvZmlsZSBcIiR7ZGVmYXVsdFByb2ZpbGV9XCIgbWlzc2luZy5gKTtcbiAgICB9XG5cbiAgICBtYXRjaCA9IHtcbiAgICAgIHByb2ZpbGVJZDogZGVmYXVsdFByb2ZpbGUsXG4gICAgICBwcm9maWxlUGF0aDogYCR7YmFzZVBhdGh9LyR7c3VwcG9ydGVkUHJvZmlsZS5wYXRofWAsXG4gICAgICBkZXByZWNhdGVkOiAhIXN1cHBvcnRlZFByb2ZpbGUuZGVwcmVjYXRlZFxuICAgIH07XG4gIH1cblxuICBjb25zdCBwcm9maWxlID0gYXdhaXQgZmV0Y2hKc29uRmlsZShtYXRjaC5wcm9maWxlUGF0aCk7XG5cbiAgbGV0IGFzc2V0UGF0aDtcbiAgaWYgKGdldEFzc2V0UGF0aCkge1xuICAgIGxldCBsYXlvdXQ7XG4gICAgaWYgKHhySW5wdXRTb3VyY2UuaGFuZGVkbmVzcyA9PT0gJ2FueScpIHtcbiAgICAgIGxheW91dCA9IHByb2ZpbGUubGF5b3V0c1tPYmplY3Qua2V5cyhwcm9maWxlLmxheW91dHMpWzBdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0ID0gcHJvZmlsZS5sYXlvdXRzW3hySW5wdXRTb3VyY2UuaGFuZGVkbmVzc107XG4gICAgfVxuICAgIGlmICghbGF5b3V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBObyBtYXRjaGluZyBoYW5kZWRuZXNzLCAke3hySW5wdXRTb3VyY2UuaGFuZGVkbmVzc30sIGluIHByb2ZpbGUgJHttYXRjaC5wcm9maWxlSWR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGF5b3V0LmFzc2V0UGF0aCkge1xuICAgICAgYXNzZXRQYXRoID0gbWF0Y2gucHJvZmlsZVBhdGgucmVwbGFjZSgncHJvZmlsZS5qc29uJywgbGF5b3V0LmFzc2V0UGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcHJvZmlsZSwgYXNzZXRQYXRoIH07XG59XG5cbmV4cG9ydCB7IGZldGNoUHJvZmlsZXNMaXN0LCBmZXRjaFByb2ZpbGUgfTtcbiIsImltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqIEBjb25zdGFudCB7T2JqZWN0fSAqL1xuY29uc3QgZGVmYXVsdENvbXBvbmVudFZhbHVlcyA9IHtcbiAgeEF4aXM6IDAsXG4gIHlBeGlzOiAwLFxuICBidXR0b246IDAsXG4gIHN0YXRlOiBDb25zdGFudHMuQ29tcG9uZW50U3RhdGUuREVGQVVMVFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYW4gWCwgWSBjb29yZGluYXRlIGZyb20gdGhlIHJhbmdlIC0xIHRvIDEgKGFzIHJlcG9ydGVkIGJ5IHRoZSBHYW1lcGFkXG4gKiBBUEkpIHRvIHRoZSByYW5nZSAwIHRvIDEgKGZvciBpbnRlcnBvbGF0aW9uKS4gQWxzbyBjYXBzIHRoZSBYLCBZIHZhbHVlcyB0byBiZSBib3VuZGVkIHdpdGhpblxuICogYSBjaXJjbGUuIFRoaXMgZW5zdXJlcyB0aGF0IHRodW1ic3RpY2tzIGFyZSBub3QgYW5pbWF0ZWQgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZWlyIHBoeXNpY2FsXG4gKiByYW5nZSBvZiBtb3Rpb24gYW5kIHRvdWNocGFkcyBkbyBub3QgcmVwb3J0IHRvdWNoIGxvY2F0aW9ucyBvZmYgdGhlaXIgcGh5c2ljYWwgYm91bmRzLlxuICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIG9yaWdpbmFsIHggY29vcmRpbmF0ZSBpbiB0aGUgcmFuZ2UgLTEgdG8gMVxuICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIG9yaWdpbmFsIHkgY29vcmRpbmF0ZSBpbiB0aGUgcmFuZ2UgLTEgdG8gMVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBeGVzKHggPSAwLCB5ID0gMCkge1xuICBsZXQgeEF4aXMgPSB4O1xuICBsZXQgeUF4aXMgPSB5O1xuXG4gIC8vIERldGVybWluZSBpZiB0aGUgcG9pbnQgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBjaXJjbGVcbiAgLy8gYW5kLCBpZiBzbywgcGxhY2UgaXQgb24gdGhlIGVkZ2Ugb2YgdGhlIGNpcmNsZVxuICBjb25zdCBoeXBvdGVudXNlID0gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbiAgaWYgKGh5cG90ZW51c2UgPiAxKSB7XG4gICAgY29uc3QgdGhldGEgPSBNYXRoLmF0YW4yKHksIHgpO1xuICAgIHhBeGlzID0gTWF0aC5jb3ModGhldGEpO1xuICAgIHlBeGlzID0gTWF0aC5zaW4odGhldGEpO1xuICB9XG5cbiAgLy8gU2NhbGUgYW5kIG1vdmUgdGhlIGNpcmNsZSBzbyB2YWx1ZXMgYXJlIGluIHRoZSBpbnRlcnBvbGF0aW9uIHJhbmdlLiAgVGhlIGNpcmNsZSdzIG9yaWdpbiBtb3Zlc1xuICAvLyBmcm9tICgwLCAwKSB0byAoMC41LCAwLjUpLiBUaGUgY2lyY2xlJ3MgcmFkaXVzIHNjYWxlcyBmcm9tIDEgdG8gYmUgMC41LlxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgbm9ybWFsaXplZFhBeGlzOiAoeEF4aXMgKiAwLjUpICsgMC41LFxuICAgIG5vcm1hbGl6ZWRZQXhpczogKHlBeGlzICogMC41KSArIDAuNVxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiBob3cgdGhlIDNEIG1vZGVsIHNob3VsZCB2aXN1YWxseSByZXNwb25kIHRvIGEgc3BlY2lmaWMgdXNlciBpbnB1dC5cbiAqIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGluaXRpYWxpemluZyB0aGUgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgYSBub2RlIGluIHRoZSAzRCBtb2RlbCBhbmRcbiAqIHByb3BlcnR5IHRoYXQgbmVlZCB0byBiZSBtb2RpZmllZCBpbiByZXNwb25zZSB0byB1c2VyIGlucHV0LCB0aGUgbmFtZSBvZiB0aGUgbm9kZXMgcmVwcmVzZW50aW5nXG4gKiB0aGUgYWxsb3dhYmxlIHJhbmdlIG9mIG1vdGlvbiwgYW5kIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCB0cmlnZ2VycyB0aGUgY2hhbmdlLiBJbiByZXNwb25zZVxuICogdG8gdGhlIG5hbWVkIGlucHV0IGNoYW5naW5nLCB0aGlzIG9iamVjdCBjb21wdXRlcyB0aGUgYXBwcm9wcmlhdGUgd2VpZ2h0aW5nIHRvIHVzZSBmb3JcbiAqIGludGVycG9sYXRpbmcgYmV0d2VlbiB0aGUgcmFuZ2Ugb2YgbW90aW9uIG5vZGVzLlxuICovXG5jbGFzcyBWaXN1YWxSZXNwb25zZSB7XG4gIGNvbnN0cnVjdG9yKHZpc3VhbFJlc3BvbnNlRGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnR5ID0gdmlzdWFsUmVzcG9uc2VEZXNjcmlwdGlvbi5jb21wb25lbnRQcm9wZXJ0eTtcbiAgICB0aGlzLnN0YXRlcyA9IHZpc3VhbFJlc3BvbnNlRGVzY3JpcHRpb24uc3RhdGVzO1xuICAgIHRoaXMudmFsdWVOb2RlTmFtZSA9IHZpc3VhbFJlc3BvbnNlRGVzY3JpcHRpb24udmFsdWVOb2RlTmFtZTtcbiAgICB0aGlzLnZhbHVlTm9kZVByb3BlcnR5ID0gdmlzdWFsUmVzcG9uc2VEZXNjcmlwdGlvbi52YWx1ZU5vZGVQcm9wZXJ0eTtcblxuICAgIGlmICh0aGlzLnZhbHVlTm9kZVByb3BlcnR5ID09PSBDb25zdGFudHMuVmlzdWFsUmVzcG9uc2VQcm9wZXJ0eS5UUkFOU0ZPUk0pIHtcbiAgICAgIHRoaXMubWluTm9kZU5hbWUgPSB2aXN1YWxSZXNwb25zZURlc2NyaXB0aW9uLm1pbk5vZGVOYW1lO1xuICAgICAgdGhpcy5tYXhOb2RlTmFtZSA9IHZpc3VhbFJlc3BvbnNlRGVzY3JpcHRpb24ubWF4Tm9kZU5hbWU7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZXMgdGhlIHJlc3BvbnNlJ3MgY3VycmVudCB2YWx1ZSBiYXNlZCBvbiBkZWZhdWx0IGRhdGFcbiAgICB0aGlzLnZhbHVlID0gMDtcbiAgICB0aGlzLnVwZGF0ZUZyb21Db21wb25lbnQoZGVmYXVsdENvbXBvbmVudFZhbHVlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHZpc3VhbCByZXNwb25zZSdzIGludGVycG9sYXRpb24gd2VpZ2h0IGJhc2VkIG9uIGNvbXBvbmVudCBzdGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29tcG9uZW50VmFsdWVzIC0gVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0geEF4aXMgLSBUaGUgcmVwb3J0ZWQgWCBheGlzIHZhbHVlIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlBeGlzIC0gVGhlIHJlcG9ydGVkIFkgYXhpcyB2YWx1ZSBvZiB0aGUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBidXR0b24gLSBUaGUgcmVwb3J0ZWQgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCdzIGJ1dHRvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGUgLSBUaGUgY29tcG9uZW50J3MgYWN0aXZlIHN0YXRlXG4gICAqL1xuICB1cGRhdGVGcm9tQ29tcG9uZW50KHtcbiAgICB4QXhpcywgeUF4aXMsIGJ1dHRvbiwgc3RhdGVcbiAgfSkge1xuICAgIGNvbnN0IHsgbm9ybWFsaXplZFhBeGlzLCBub3JtYWxpemVkWUF4aXMgfSA9IG5vcm1hbGl6ZUF4ZXMoeEF4aXMsIHlBeGlzKTtcbiAgICBzd2l0Y2ggKHRoaXMuY29tcG9uZW50UHJvcGVydHkpIHtcbiAgICAgIGNhc2UgQ29uc3RhbnRzLkNvbXBvbmVudFByb3BlcnR5LlhfQVhJUzpcbiAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkpID8gbm9ybWFsaXplZFhBeGlzIDogMC41O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29uc3RhbnRzLkNvbXBvbmVudFByb3BlcnR5LllfQVhJUzpcbiAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkpID8gbm9ybWFsaXplZFlBeGlzIDogMC41O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29uc3RhbnRzLkNvbXBvbmVudFByb3BlcnR5LkJVVFRPTjpcbiAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkpID8gYnV0dG9uIDogMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbnN0YW50cy5Db21wb25lbnRQcm9wZXJ0eS5TVEFURTpcbiAgICAgICAgaWYgKHRoaXMudmFsdWVOb2RlUHJvcGVydHkgPT09IENvbnN0YW50cy5WaXN1YWxSZXNwb25zZVByb3BlcnR5LlZJU0lCSUxJVFkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gKHRoaXMuc3RhdGVzLmluY2x1ZGVzKHN0YXRlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3RhdGVzLmluY2x1ZGVzKHN0YXRlKSA/IDEuMCA6IDAuMDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2aXN1YWxSZXNwb25zZSBjb21wb25lbnRQcm9wZXJ0eSAke3RoaXMuY29tcG9uZW50UHJvcGVydHl9YCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFZpc3VhbFJlc3BvbnNlIH07XG4iLCIvKiogQGxpY2Vuc2UgemxpYi5qcyAyMDEyIC0gaW1heWEgWyBodHRwczovL2dpdGh1Yi5jb20vaW1heWEvemxpYi5qcyBdIFRoZSBNSVQgTGljZW5zZSAqLyhmdW5jdGlvbigpIHsndXNlIHN0cmljdCc7ZnVuY3Rpb24gbChhKXt0aHJvdyBhO312YXIgcj12b2lkIDAsdCxhYT10aGlzO2Z1bmN0aW9uIHYoYSxiKXt2YXIgYz1hLnNwbGl0KFwiLlwiKSxkPWFhOyEoY1swXWluIGQpJiZkLmV4ZWNTY3JpcHQmJmQuZXhlY1NjcmlwdChcInZhciBcIitjWzBdKTtmb3IodmFyIGY7Yy5sZW5ndGgmJihmPWMuc2hpZnQoKSk7KSFjLmxlbmd0aCYmYiE9PXI/ZFtmXT1iOmQ9ZFtmXT9kW2ZdOmRbZl09e319O3ZhciB5PVwidW5kZWZpbmVkXCIhPT10eXBlb2YgVWludDhBcnJheSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MTZBcnJheSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBVaW50MzJBcnJheSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBEYXRhVmlldztuZXcgKHk/VWludDhBcnJheTpBcnJheSkoMjU2KTt2YXIgejtmb3Ioej0wOzI1Nj56Oysreilmb3IodmFyIEI9eixiYT03LEI9Qj4+PjE7QjtCPj4+PTEpLS1iYTt2YXIgY2E9WzAsMTk5Njk1OTg5NCwzOTkzOTE5Nzg4LDI1Njc1MjQ3OTQsMTI0NjM0MTM3LDE4ODYwNTc2MTUsMzkxNTYyMTY4NSwyNjU3MzkyMDM1LDI0OTI2ODI3NCwyMDQ0NTA4MzI0LDM3NzIxMTUyMzAsMjU0NzE3Nzg2NCwxNjI5NDE5OTUsMjEyNTU2MTAyMSwzODg3NjA3MDQ3LDI0Mjg0NDQwNDksNDk4NTM2NTQ4LDE3ODk5Mjc2NjYsNDA4OTAxNjY0OCwyMjI3MDYxMjE0LDQ1MDU0ODg2MSwxODQzMjU4NjAzLDQxMDc1ODA3NTMsMjIxMTY3NzYzOSwzMjU4ODM5OTAsMTY4NDc3NzE1Miw0MjUxMTIyMDQyLDIzMjE5MjY2MzYsMzM1NjMzNDg3LDE2NjEzNjU0NjUsNDE5NTMwMjc1NSwyMzY2MTE1MzE3LDk5NzA3MzA5NiwxMjgxOTUzODg2LDM1Nzk4NTUzMzIsMjcyNDY4ODI0MiwxMDA2ODg4MTQ1LDEyNTg2MDc2ODcsMzUyNDEwMTYyOSwyNzY4OTQyNDQzLDkwMTA5NzcyMiwxMTE5MDAwNjg0LDM2ODY1MTcyMDYsMjg5ODA2NTcyOCw4NTMwNDQ0NTEsMTE3MjI2NjEwMSwzNzA1MDE1NzU5LFxuMjg4MjYxNjY2NSw2NTE3Njc5ODAsMTM3MzUwMzU0NiwzMzY5NTU0MzA0LDMyMTgxMDQ1OTgsNTY1NTA3MjUzLDE0NTQ2MjE3MzEsMzQ4NTExMTcwNSwzMDk5NDM2MzAzLDY3MTI2Njk3NCwxNTk0MTk4MDI0LDMzMjI3MzA5MzAsMjk3MDM0NzgxMiw3OTU4MzU1MjcsMTQ4MzIzMDIyNSwzMjQ0MzY3Mjc1LDMwNjAxNDk1NjUsMTk5NDE0NjE5MiwzMTE1ODUzNCwyNTYzOTA3NzcyLDQwMjM3MTc5MzAsMTkwNzQ1OTQ2NSwxMTI2MzcyMTUsMjY4MDE1MzI1MywzOTA0NDI3MDU5LDIwMTM3NzYyOTAsMjUxNzIyMDM2LDI1MTcyMTUzNzQsMzc3NTgzMDA0MCwyMTM3NjU2NzYzLDE0MTM3NjgxMywyNDM5Mjc3NzE5LDM4NjUyNzEyOTcsMTgwMjE5NTQ0NCw0NzY4NjQ4NjYsMjIzODAwMTM2OCw0MDY2NTA4ODc4LDE4MTIzNzA5MjUsNDUzMDkyNzMxLDIxODE2MjUwMjUsNDExMTQ1MTIyMywxNzA2MDg4OTAyLDMxNDA0MjcwNCwyMzQ0NTMyMjAyLDQyNDAwMTc1MzIsMTY1ODY1ODI3MSwzNjY2MTk5NzcsXG4yMzYyNjcwMzIzLDQyMjQ5OTQ0MDUsMTMwMzUzNTk2MCw5ODQ5NjE0ODYsMjc0NzAwNzA5MiwzNTY5MDM3NTM4LDEyNTYxNzA4MTcsMTAzNzYwNDMxMSwyNzY1MjEwNzMzLDM1NTQwNzk5OTUsMTEzMTAxNDUwNiw4Nzk2Nzk5OTYsMjkwOTI0MzQ2MiwzNjYzNzcxODU2LDExNDExMjQ0NjcsODU1ODQyMjc3LDI4NTI4MDE2MzEsMzcwODY0ODY0OSwxMzQyNTMzOTQ4LDY1NDQ1OTMwNiwzMTg4Mzk2MDQ4LDMzNzMwMTUxNzQsMTQ2NjQ3OTkwOSw1NDQxNzk2MzUsMzExMDUyMzkxMywzNDYyNTIyMDE1LDE1OTE2NzEwNTQsNzAyMTM4Nzc2LDI5NjY0NjA0NTAsMzM1Mjc5OTQxMiwxNTA0OTE4ODA3LDc4MzU1MTg3MywzMDgyNjQwNDQzLDMyMzM0NDI5ODksMzk4ODI5MjM4NCwyNTk2MjU0NjQ2LDYyMzE3MDY4LDE5NTc4MTA4NDIsMzkzOTg0NTk0NSwyNjQ3ODE2MTExLDgxNDcwOTk3LDE5NDM4MDM1MjMsMzgxNDkxODkzMCwyNDg5NTk2ODA0LDIyNTI3NDQzMCwyMDUzNzkwMzc2LDM4MjYxNzU3NTUsXG4yNDY2OTA2MDEzLDE2NzgxNjc0MywyMDk3NjUxMzc3LDQwMjc1NTI1ODAsMjI2NTQ5MDM4Niw1MDM0NDQwNzIsMTc2MjA1MDgxNCw0MTUwNDE3MjQ1LDIxNTQxMjkzNTUsNDI2NTIyMjI1LDE4NTI1MDc4NzksNDI3NTMxMzUyNiwyMzEyMzE3OTIwLDI4Mjc1MzYyNiwxNzQyNTU1ODUyLDQxODk3MDgxNDMsMjM5NDg3Nzk0NSwzOTc5MTc3NjMsMTYyMjE4MzYzNywzNjA0MzkwODg4LDI3MTQ4NjY1NTgsOTUzNzI5NzMyLDEzNDAwNzY2MjYsMzUxODcxOTk4NSwyNzk3MzYwOTk5LDEwNjg4MjgzODEsMTIxOTYzODg1OSwzNjI0NzQxODUwLDI5MzY2NzUxNDgsOTA2MTg1NDYyLDEwOTA4MTI1MTIsMzc0NzY3MjAwMywyODI1Mzc5NjY5LDgyOTMyOTEzNSwxMTgxMzM1MTYxLDM0MTIxNzc4MDQsMzE2MDgzNDg0Miw2MjgwODU0MDgsMTM4MjYwNTM2NiwzNDIzMzY5MTA5LDMxMzgwNzg0NjcsNTcwNTYyMjMzLDE0MjY0MDA4MTUsMzMxNzMxNjU0MiwyOTk4NzMzNjA4LDczMzIzOTk1NCwxNTU1MjYxOTU2LFxuMzI2ODkzNTU5MSwzMDUwMzYwNjI1LDc1MjQ1OTQwMywxNTQxMzIwMjIxLDI2MDcwNzE5MjAsMzk2NTk3MzAzMCwxOTY5OTIyOTcyLDQwNzM1NDk4LDI2MTc4MzcyMjUsMzk0MzU3NzE1MSwxOTEzMDg3ODc3LDgzOTA4MzcxLDI1MTIzNDE2MzQsMzgwMzc0MDY5MiwyMDc1MjA4NjIyLDIxMzI2MTExMiwyNDYzMjcyNjAzLDM4NTU5OTAyODUsMjA5NDg1NDA3MSwxOTg5NTg4ODEsMjI2MjAyOTAxMiw0MDU3MjYwNjEwLDE3NTkzNTk5OTIsNTM0NDE0MTkwLDIxNzY3MTg1NDEsNDEzOTMyOTExNSwxODczODM2MDAxLDQxNDY2NDU2NywyMjgyMjQ4OTM0LDQyNzkyMDAzNjgsMTcxMTY4NDU1NCwyODUyODExMTYsMjQwNTgwMTcyNyw0MTY3MjE2NzQ1LDE2MzQ0Njc3OTUsMzc2MjI5NzAxLDI2ODUwNjc4OTYsMzYwODAwNzQwNiwxMzA4OTE4NjEyLDk1NjU0MzkzOCwyODA4NTU1MTA1LDM0OTU5NTgyNjMsMTIzMTYzNjMwMSwxMDQ3NDI3MDM1LDI5MzI5NTk4MTgsMzY1NDcwMzgzNiwxMDg4MzU5MjcwLFxuOTM2OTE4RTMsMjg0NzcxNDg5OSwzNzM2ODM3ODI5LDEyMDI5MDA4NjMsODE3MjMzODk3LDMxODMzNDIxMDgsMzQwMTIzNzEzMCwxNDA0Mjc3NTUyLDYxNTgxODE1MCwzMTM0MjA3NDkzLDM0NTM0MjEyMDMsMTQyMzg1NzQ0OSw2MDE0NTA0MzEsMzAwOTgzNzYxNCwzMjk0NzEwNDU2LDE1NjcxMDM3NDYsNzExOTI4NzI0LDMwMjA2Njg0NzEsMzI3MjM4MDA2NSwxNTEwMzM0MjM1LDc1NTE2NzExN10sQz15P25ldyBVaW50MzJBcnJheShjYSk6Y2E7aWYoYWEuVWludDhBcnJheSE9PXIpdHJ5e2V2YWwoXCJTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KFswXSkpO1wiKX1jYXRjaChlYSl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKFN0cmluZy5mcm9tQ2hhckNvZGUsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjKSl9fShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KX07ZnVuY3Rpb24gRChhKXt2YXIgYj1hLmxlbmd0aCxjPTAsZD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZixoLGssZSxnLG0scCxzLHEseDtmb3Iocz0wO3M8YjsrK3MpYVtzXT5jJiYoYz1hW3NdKSxhW3NdPGQmJihkPWFbc10pO2Y9MTw8YztoPW5ldyAoeT9VaW50MzJBcnJheTpBcnJheSkoZik7az0xO2U9MDtmb3IoZz0yO2s8PWM7KXtmb3Iocz0wO3M8YjsrK3MpaWYoYVtzXT09PWspe209MDtwPWU7Zm9yKHE9MDtxPGs7KytxKW09bTw8MXxwJjEscD4+PTE7eD1rPDwxNnxzO2ZvcihxPW07cTxmO3ErPWcpaFtxXT14OysrZX0rK2s7ZTw8PTE7Zzw8PTF9cmV0dXJuW2gsYyxkXX07dmFyIEY9W10sRztmb3IoRz0wOzI4OD5HO0crKylzd2l0Y2goITApe2Nhc2UgMTQzPj1HOkYucHVzaChbRys0OCw4XSk7YnJlYWs7Y2FzZSAyNTU+PUc6Ri5wdXNoKFtHLTE0NCs0MDAsOV0pO2JyZWFrO2Nhc2UgMjc5Pj1HOkYucHVzaChbRy0yNTYrMCw3XSk7YnJlYWs7Y2FzZSAyODc+PUc6Ri5wdXNoKFtHLTI4MCsxOTIsOF0pO2JyZWFrO2RlZmF1bHQ6bChcImludmFsaWQgbGl0ZXJhbDogXCIrRyl9XG52YXIgZmE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3N3aXRjaCghMCl7Y2FzZSAzPT09YTpyZXR1cm5bMjU3LGEtMywwXTtjYXNlIDQ9PT1hOnJldHVyblsyNTgsYS00LDBdO2Nhc2UgNT09PWE6cmV0dXJuWzI1OSxhLTUsMF07Y2FzZSA2PT09YTpyZXR1cm5bMjYwLGEtNiwwXTtjYXNlIDc9PT1hOnJldHVyblsyNjEsYS03LDBdO2Nhc2UgOD09PWE6cmV0dXJuWzI2MixhLTgsMF07Y2FzZSA5PT09YTpyZXR1cm5bMjYzLGEtOSwwXTtjYXNlIDEwPT09YTpyZXR1cm5bMjY0LGEtMTAsMF07Y2FzZSAxMj49YTpyZXR1cm5bMjY1LGEtMTEsMV07Y2FzZSAxND49YTpyZXR1cm5bMjY2LGEtMTMsMV07Y2FzZSAxNj49YTpyZXR1cm5bMjY3LGEtMTUsMV07Y2FzZSAxOD49YTpyZXR1cm5bMjY4LGEtMTcsMV07Y2FzZSAyMj49YTpyZXR1cm5bMjY5LGEtMTksMl07Y2FzZSAyNj49YTpyZXR1cm5bMjcwLGEtMjMsMl07Y2FzZSAzMD49YTpyZXR1cm5bMjcxLGEtMjcsMl07Y2FzZSAzND49YTpyZXR1cm5bMjcyLFxuYS0zMSwyXTtjYXNlIDQyPj1hOnJldHVyblsyNzMsYS0zNSwzXTtjYXNlIDUwPj1hOnJldHVyblsyNzQsYS00MywzXTtjYXNlIDU4Pj1hOnJldHVyblsyNzUsYS01MSwzXTtjYXNlIDY2Pj1hOnJldHVyblsyNzYsYS01OSwzXTtjYXNlIDgyPj1hOnJldHVyblsyNzcsYS02Nyw0XTtjYXNlIDk4Pj1hOnJldHVyblsyNzgsYS04Myw0XTtjYXNlIDExND49YTpyZXR1cm5bMjc5LGEtOTksNF07Y2FzZSAxMzA+PWE6cmV0dXJuWzI4MCxhLTExNSw0XTtjYXNlIDE2Mj49YTpyZXR1cm5bMjgxLGEtMTMxLDVdO2Nhc2UgMTk0Pj1hOnJldHVyblsyODIsYS0xNjMsNV07Y2FzZSAyMjY+PWE6cmV0dXJuWzI4MyxhLTE5NSw1XTtjYXNlIDI1Nz49YTpyZXR1cm5bMjg0LGEtMjI3LDVdO2Nhc2UgMjU4PT09YTpyZXR1cm5bMjg1LGEtMjU4LDBdO2RlZmF1bHQ6bChcImludmFsaWQgbGVuZ3RoOiBcIithKX19dmFyIGI9W10sYyxkO2ZvcihjPTM7MjU4Pj1jO2MrKylkPWEoYyksYltjXT1kWzJdPDwyNHxkWzFdPDxcbjE2fGRbMF07cmV0dXJuIGJ9KCk7eSYmbmV3IFVpbnQzMkFycmF5KGZhKTtmdW5jdGlvbiBJKGEsYil7dGhpcy5sPVtdO3RoaXMubT0zMjc2ODt0aGlzLmQ9dGhpcy5mPXRoaXMuYz10aGlzLnQ9MDt0aGlzLmlucHV0PXk/bmV3IFVpbnQ4QXJyYXkoYSk6YTt0aGlzLnU9ITE7dGhpcy5uPUo7dGhpcy5LPSExO2lmKGJ8fCEoYj17fSkpYi5pbmRleCYmKHRoaXMuYz1iLmluZGV4KSxiLmJ1ZmZlclNpemUmJih0aGlzLm09Yi5idWZmZXJTaXplKSxiLmJ1ZmZlclR5cGUmJih0aGlzLm49Yi5idWZmZXJUeXBlKSxiLnJlc2l6ZSYmKHRoaXMuSz1iLnJlc2l6ZSk7c3dpdGNoKHRoaXMubil7Y2FzZSBnYTp0aGlzLmE9MzI3Njg7dGhpcy5iPW5ldyAoeT9VaW50OEFycmF5OkFycmF5KSgzMjc2OCt0aGlzLm0rMjU4KTticmVhaztjYXNlIEo6dGhpcy5hPTA7dGhpcy5iPW5ldyAoeT9VaW50OEFycmF5OkFycmF5KSh0aGlzLm0pO3RoaXMuZT10aGlzLlc7dGhpcy5CPXRoaXMuUjt0aGlzLnE9dGhpcy5WO2JyZWFrO2RlZmF1bHQ6bChFcnJvcihcImludmFsaWQgaW5mbGF0ZSBtb2RlXCIpKX19XG52YXIgZ2E9MCxKPTE7XG5JLnByb3RvdHlwZS5yPWZ1bmN0aW9uKCl7Zm9yKDshdGhpcy51Oyl7dmFyIGE9Syh0aGlzLDMpO2EmMSYmKHRoaXMudT0hMCk7YT4+Pj0xO3N3aXRjaChhKXtjYXNlIDA6dmFyIGI9dGhpcy5pbnB1dCxjPXRoaXMuYyxkPXRoaXMuYixmPXRoaXMuYSxoPWIubGVuZ3RoLGs9cixlPXIsZz1kLmxlbmd0aCxtPXI7dGhpcy5kPXRoaXMuZj0wO2MrMT49aCYmbChFcnJvcihcImludmFsaWQgdW5jb21wcmVzc2VkIGJsb2NrIGhlYWRlcjogTEVOXCIpKTtrPWJbYysrXXxiW2MrK108PDg7YysxPj1oJiZsKEVycm9yKFwiaW52YWxpZCB1bmNvbXByZXNzZWQgYmxvY2sgaGVhZGVyOiBOTEVOXCIpKTtlPWJbYysrXXxiW2MrK108PDg7az09PX5lJiZsKEVycm9yKFwiaW52YWxpZCB1bmNvbXByZXNzZWQgYmxvY2sgaGVhZGVyOiBsZW5ndGggdmVyaWZ5XCIpKTtjK2s+Yi5sZW5ndGgmJmwoRXJyb3IoXCJpbnB1dCBidWZmZXIgaXMgYnJva2VuXCIpKTtzd2l0Y2godGhpcy5uKXtjYXNlIGdhOmZvcig7ZitrPmQubGVuZ3RoOyl7bT1cbmctZjtrLT1tO2lmKHkpZC5zZXQoYi5zdWJhcnJheShjLGMrbSksZiksZis9bSxjKz1tO2Vsc2UgZm9yKDttLS07KWRbZisrXT1iW2MrK107dGhpcy5hPWY7ZD10aGlzLmUoKTtmPXRoaXMuYX1icmVhaztjYXNlIEo6Zm9yKDtmK2s+ZC5sZW5ndGg7KWQ9dGhpcy5lKHtIOjJ9KTticmVhaztkZWZhdWx0OmwoRXJyb3IoXCJpbnZhbGlkIGluZmxhdGUgbW9kZVwiKSl9aWYoeSlkLnNldChiLnN1YmFycmF5KGMsYytrKSxmKSxmKz1rLGMrPWs7ZWxzZSBmb3IoO2stLTspZFtmKytdPWJbYysrXTt0aGlzLmM9Yzt0aGlzLmE9Zjt0aGlzLmI9ZDticmVhaztjYXNlIDE6dGhpcy5xKGhhLGlhKTticmVhaztjYXNlIDI6Zm9yKHZhciBwPUsodGhpcyw1KSsyNTcscz1LKHRoaXMsNSkrMSxxPUsodGhpcyw0KSs0LHg9bmV3ICh5P1VpbnQ4QXJyYXk6QXJyYXkpKEwubGVuZ3RoKSx1PXIsbj1yLEU9cixBPXIsWD1yLE89cixIPXIsdz1yLGRhPXIsdz0wO3c8cTsrK3cpeFtMW3ddXT1LKHRoaXMsMyk7aWYoIXkpe3c9XG5xO2ZvcihxPXgubGVuZ3RoO3c8cTsrK3cpeFtMW3ddXT0wfXU9RCh4KTtBPW5ldyAoeT9VaW50OEFycmF5OkFycmF5KShwK3MpO3c9MDtmb3IoZGE9cCtzO3c8ZGE7KXN3aXRjaChYPU0odGhpcyx1KSxYKXtjYXNlIDE2OmZvcihIPTMrSyh0aGlzLDIpO0gtLTspQVt3KytdPU87YnJlYWs7Y2FzZSAxNzpmb3IoSD0zK0sodGhpcywzKTtILS07KUFbdysrXT0wO089MDticmVhaztjYXNlIDE4OmZvcihIPTExK0sodGhpcyw3KTtILS07KUFbdysrXT0wO089MDticmVhaztkZWZhdWx0Ok89QVt3KytdPVh9bj15P0QoQS5zdWJhcnJheSgwLHApKTpEKEEuc2xpY2UoMCxwKSk7RT15P0QoQS5zdWJhcnJheShwKSk6RChBLnNsaWNlKHApKTt0aGlzLnEobixFKTticmVhaztkZWZhdWx0OmwoRXJyb3IoXCJ1bmtub3duIEJUWVBFOiBcIithKSl9fXJldHVybiB0aGlzLkIoKX07XG52YXIgamE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLEw9eT9uZXcgVWludDE2QXJyYXkoamEpOmphLGthPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDI1OCwyNThdLGxhPXk/bmV3IFVpbnQxNkFycmF5KGthKTprYSxtYT1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDAsMF0sTj15P25ldyBVaW50OEFycmF5KG1hKTptYSxuYT1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3XSxvYT15P25ldyBVaW50MTZBcnJheShuYSk6bmEscGE9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsXG4xMSwxMSwxMiwxMiwxMywxM10sUD15P25ldyBVaW50OEFycmF5KHBhKTpwYSxRPW5ldyAoeT9VaW50OEFycmF5OkFycmF5KSgyODgpLFIscWE7Uj0wO2ZvcihxYT1RLmxlbmd0aDtSPHFhOysrUilRW1JdPTE0Mz49Uj84OjI1NT49Uj85OjI3OT49Uj83Ojg7dmFyIGhhPUQoUSksUz1uZXcgKHk/VWludDhBcnJheTpBcnJheSkoMzApLFQscmE7VD0wO2ZvcihyYT1TLmxlbmd0aDtUPHJhOysrVClTW1RdPTU7dmFyIGlhPUQoUyk7ZnVuY3Rpb24gSyhhLGIpe2Zvcih2YXIgYz1hLmYsZD1hLmQsZj1hLmlucHV0LGg9YS5jLGs9Zi5sZW5ndGgsZTtkPGI7KWg+PWsmJmwoRXJyb3IoXCJpbnB1dCBidWZmZXIgaXMgYnJva2VuXCIpKSxjfD1mW2grK108PGQsZCs9ODtlPWMmKDE8PGIpLTE7YS5mPWM+Pj5iO2EuZD1kLWI7YS5jPWg7cmV0dXJuIGV9XG5mdW5jdGlvbiBNKGEsYil7Zm9yKHZhciBjPWEuZixkPWEuZCxmPWEuaW5wdXQsaD1hLmMsaz1mLmxlbmd0aCxlPWJbMF0sZz1iWzFdLG0scDtkPGcmJiEoaD49ayk7KWN8PWZbaCsrXTw8ZCxkKz04O209ZVtjJigxPDxnKS0xXTtwPW0+Pj4xNjtwPmQmJmwoRXJyb3IoXCJpbnZhbGlkIGNvZGUgbGVuZ3RoOiBcIitwKSk7YS5mPWM+PnA7YS5kPWQtcDthLmM9aDtyZXR1cm4gbSY2NTUzNX10PUkucHJvdG90eXBlO1xudC5xPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5iLGQ9dGhpcy5hO3RoaXMuQz1hO2Zvcih2YXIgZj1jLmxlbmd0aC0yNTgsaCxrLGUsZzsyNTYhPT0oaD1NKHRoaXMsYSkpOylpZigyNTY+aClkPj1mJiYodGhpcy5hPWQsYz10aGlzLmUoKSxkPXRoaXMuYSksY1tkKytdPWg7ZWxzZXtrPWgtMjU3O2c9bGFba107MDxOW2tdJiYoZys9Syh0aGlzLE5ba10pKTtoPU0odGhpcyxiKTtlPW9hW2hdOzA8UFtoXSYmKGUrPUsodGhpcyxQW2hdKSk7ZD49ZiYmKHRoaXMuYT1kLGM9dGhpcy5lKCksZD10aGlzLmEpO2Zvcig7Zy0tOyljW2RdPWNbZCsrLWVdfWZvcig7ODw9dGhpcy5kOyl0aGlzLmQtPTgsdGhpcy5jLS07dGhpcy5hPWR9O1xudC5WPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5iLGQ9dGhpcy5hO3RoaXMuQz1hO2Zvcih2YXIgZj1jLmxlbmd0aCxoLGssZSxnOzI1NiE9PShoPU0odGhpcyxhKSk7KWlmKDI1Nj5oKWQ+PWYmJihjPXRoaXMuZSgpLGY9Yy5sZW5ndGgpLGNbZCsrXT1oO2Vsc2V7az1oLTI1NztnPWxhW2tdOzA8TltrXSYmKGcrPUsodGhpcyxOW2tdKSk7aD1NKHRoaXMsYik7ZT1vYVtoXTswPFBbaF0mJihlKz1LKHRoaXMsUFtoXSkpO2QrZz5mJiYoYz10aGlzLmUoKSxmPWMubGVuZ3RoKTtmb3IoO2ctLTspY1tkXT1jW2QrKy1lXX1mb3IoOzg8PXRoaXMuZDspdGhpcy5kLT04LHRoaXMuYy0tO3RoaXMuYT1kfTtcbnQuZT1mdW5jdGlvbigpe3ZhciBhPW5ldyAoeT9VaW50OEFycmF5OkFycmF5KSh0aGlzLmEtMzI3NjgpLGI9dGhpcy5hLTMyNzY4LGMsZCxmPXRoaXMuYjtpZih5KWEuc2V0KGYuc3ViYXJyYXkoMzI3NjgsYS5sZW5ndGgpKTtlbHNle2M9MDtmb3IoZD1hLmxlbmd0aDtjPGQ7KytjKWFbY109ZltjKzMyNzY4XX10aGlzLmwucHVzaChhKTt0aGlzLnQrPWEubGVuZ3RoO2lmKHkpZi5zZXQoZi5zdWJhcnJheShiLGIrMzI3NjgpKTtlbHNlIGZvcihjPTA7MzI3Njg+YzsrK2MpZltjXT1mW2IrY107dGhpcy5hPTMyNzY4O3JldHVybiBmfTtcbnQuVz1mdW5jdGlvbihhKXt2YXIgYixjPXRoaXMuaW5wdXQubGVuZ3RoL3RoaXMuYysxfDAsZCxmLGgsaz10aGlzLmlucHV0LGU9dGhpcy5iO2EmJihcIm51bWJlclwiPT09dHlwZW9mIGEuSCYmKGM9YS5IKSxcIm51bWJlclwiPT09dHlwZW9mIGEuUCYmKGMrPWEuUCkpOzI+Yz8oZD0oay5sZW5ndGgtdGhpcy5jKS90aGlzLkNbMl0saD0yNTgqKGQvMil8MCxmPWg8ZS5sZW5ndGg/ZS5sZW5ndGgraDplLmxlbmd0aDw8MSk6Zj1lLmxlbmd0aCpjO3k/KGI9bmV3IFVpbnQ4QXJyYXkoZiksYi5zZXQoZSkpOmI9ZTtyZXR1cm4gdGhpcy5iPWJ9O1xudC5CPWZ1bmN0aW9uKCl7dmFyIGE9MCxiPXRoaXMuYixjPXRoaXMubCxkLGY9bmV3ICh5P1VpbnQ4QXJyYXk6QXJyYXkpKHRoaXMudCsodGhpcy5hLTMyNzY4KSksaCxrLGUsZztpZigwPT09Yy5sZW5ndGgpcmV0dXJuIHk/dGhpcy5iLnN1YmFycmF5KDMyNzY4LHRoaXMuYSk6dGhpcy5iLnNsaWNlKDMyNzY4LHRoaXMuYSk7aD0wO2ZvcihrPWMubGVuZ3RoO2g8azsrK2gpe2Q9Y1toXTtlPTA7Zm9yKGc9ZC5sZW5ndGg7ZTxnOysrZSlmW2ErK109ZFtlXX1oPTMyNzY4O2ZvcihrPXRoaXMuYTtoPGs7KytoKWZbYSsrXT1iW2hdO3RoaXMubD1bXTtyZXR1cm4gdGhpcy5idWZmZXI9Zn07XG50LlI9ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuYTt5P3RoaXMuSz8oYT1uZXcgVWludDhBcnJheShiKSxhLnNldCh0aGlzLmIuc3ViYXJyYXkoMCxiKSkpOmE9dGhpcy5iLnN1YmFycmF5KDAsYik6KHRoaXMuYi5sZW5ndGg+YiYmKHRoaXMuYi5sZW5ndGg9YiksYT10aGlzLmIpO3JldHVybiB0aGlzLmJ1ZmZlcj1hfTtmdW5jdGlvbiBVKGEpe2E9YXx8e307dGhpcy5maWxlcz1bXTt0aGlzLnY9YS5jb21tZW50fVUucHJvdG90eXBlLkw9ZnVuY3Rpb24oYSl7dGhpcy5qPWF9O1UucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSl7dmFyIGI9YVsyXSY2NTUzNXwyO3JldHVybiBiKihiXjEpPj44JjI1NX07VS5wcm90b3R5cGUuaz1mdW5jdGlvbihhLGIpe2FbMF09KENbKGFbMF1eYikmMjU1XV5hWzBdPj4+OCk+Pj4wO2FbMV09KDY2ODEqKDIwMTczKihhWzFdKyhhWzBdJjI1NSkpPj4+MCk+Pj4wKSsxPj4+MDthWzJdPShDWyhhWzJdXmFbMV0+Pj4yNCkmMjU1XV5hWzJdPj4+OCk+Pj4wfTtVLnByb3RvdHlwZS5UPWZ1bmN0aW9uKGEpe3ZhciBiPVszMDU0MTk4OTYsNTkxNzUxMDQ5LDg3ODA4MjE5Ml0sYyxkO3kmJihiPW5ldyBVaW50MzJBcnJheShiKSk7Yz0wO2ZvcihkPWEubGVuZ3RoO2M8ZDsrK2MpdGhpcy5rKGIsYVtjXSYyNTUpO3JldHVybiBifTtmdW5jdGlvbiBWKGEsYil7Yj1ifHx7fTt0aGlzLmlucHV0PXkmJmEgaW5zdGFuY2VvZiBBcnJheT9uZXcgVWludDhBcnJheShhKTphO3RoaXMuYz0wO3RoaXMuYmE9Yi52ZXJpZnl8fCExO3RoaXMuaj1iLnBhc3N3b3JkfXZhciBzYT17TzowLE06OH0sVz1bODAsNzUsMSwyXSxZPVs4MCw3NSwzLDRdLFo9WzgwLDc1LDUsNl07ZnVuY3Rpb24gdGEoYSxiKXt0aGlzLmlucHV0PWE7dGhpcy5vZmZzZXQ9Yn1cbnRhLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5wdXQsYj10aGlzLm9mZnNldDsoYVtiKytdIT09V1swXXx8YVtiKytdIT09V1sxXXx8YVtiKytdIT09V1syXXx8YVtiKytdIT09V1szXSkmJmwoRXJyb3IoXCJpbnZhbGlkIGZpbGUgaGVhZGVyIHNpZ25hdHVyZVwiKSk7dGhpcy52ZXJzaW9uPWFbYisrXTt0aGlzLmlhPWFbYisrXTt0aGlzLlo9YVtiKytdfGFbYisrXTw8ODt0aGlzLkk9YVtiKytdfGFbYisrXTw8ODt0aGlzLkE9YVtiKytdfGFbYisrXTw8ODt0aGlzLnRpbWU9YVtiKytdfGFbYisrXTw8ODt0aGlzLlU9YVtiKytdfGFbYisrXTw8ODt0aGlzLnA9KGFbYisrXXxhW2IrK108PDh8YVtiKytdPDwxNnxhW2IrK108PDI0KT4+PjA7dGhpcy56PShhW2IrK118YVtiKytdPDw4fGFbYisrXTw8MTZ8YVtiKytdPDwyNCk+Pj4wO3RoaXMuSj0oYVtiKytdfGFbYisrXTw8OHxhW2IrK108PDE2fGFbYisrXTw8MjQpPj4+MDt0aGlzLmg9YVtiKytdfGFbYisrXTw8XG44O3RoaXMuZz1hW2IrK118YVtiKytdPDw4O3RoaXMuRj1hW2IrK118YVtiKytdPDw4O3RoaXMuZWE9YVtiKytdfGFbYisrXTw8ODt0aGlzLmdhPWFbYisrXXxhW2IrK108PDg7dGhpcy5mYT1hW2IrK118YVtiKytdPDw4fGFbYisrXTw8MTZ8YVtiKytdPDwyNDt0aGlzLiQ9KGFbYisrXXxhW2IrK108PDh8YVtiKytdPDwxNnxhW2IrK108PDI0KT4+PjA7dGhpcy5maWxlbmFtZT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwseT9hLnN1YmFycmF5KGIsYis9dGhpcy5oKTphLnNsaWNlKGIsYis9dGhpcy5oKSk7dGhpcy5YPXk/YS5zdWJhcnJheShiLGIrPXRoaXMuZyk6YS5zbGljZShiLGIrPXRoaXMuZyk7dGhpcy52PXk/YS5zdWJhcnJheShiLGIrdGhpcy5GKTphLnNsaWNlKGIsYit0aGlzLkYpO3RoaXMubGVuZ3RoPWItdGhpcy5vZmZzZXR9O2Z1bmN0aW9uIHVhKGEsYil7dGhpcy5pbnB1dD1hO3RoaXMub2Zmc2V0PWJ9dmFyIHZhPXtOOjEsY2E6OCxkYToyMDQ4fTtcbnVhLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5wdXQsYj10aGlzLm9mZnNldDsoYVtiKytdIT09WVswXXx8YVtiKytdIT09WVsxXXx8YVtiKytdIT09WVsyXXx8YVtiKytdIT09WVszXSkmJmwoRXJyb3IoXCJpbnZhbGlkIGxvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZVwiKSk7dGhpcy5aPWFbYisrXXxhW2IrK108PDg7dGhpcy5JPWFbYisrXXxhW2IrK108PDg7dGhpcy5BPWFbYisrXXxhW2IrK108PDg7dGhpcy50aW1lPWFbYisrXXxhW2IrK108PDg7dGhpcy5VPWFbYisrXXxhW2IrK108PDg7dGhpcy5wPShhW2IrK118YVtiKytdPDw4fGFbYisrXTw8MTZ8YVtiKytdPDwyNCk+Pj4wO3RoaXMuej0oYVtiKytdfGFbYisrXTw8OHxhW2IrK108PDE2fGFbYisrXTw8MjQpPj4+MDt0aGlzLko9KGFbYisrXXxhW2IrK108PDh8YVtiKytdPDwxNnxhW2IrK108PDI0KT4+PjA7dGhpcy5oPWFbYisrXXxhW2IrK108PDg7dGhpcy5nPWFbYisrXXxhW2IrK108PDg7dGhpcy5maWxlbmFtZT1cblN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx5P2Euc3ViYXJyYXkoYixiKz10aGlzLmgpOmEuc2xpY2UoYixiKz10aGlzLmgpKTt0aGlzLlg9eT9hLnN1YmFycmF5KGIsYis9dGhpcy5nKTphLnNsaWNlKGIsYis9dGhpcy5nKTt0aGlzLmxlbmd0aD1iLXRoaXMub2Zmc2V0fTtcbmZ1bmN0aW9uICQoYSl7dmFyIGI9W10sYz17fSxkLGYsaCxrO2lmKCFhLmkpe2lmKGEubz09PXIpe3ZhciBlPWEuaW5wdXQsZztpZighYS5EKWE6e3ZhciBtPWEuaW5wdXQscDtmb3IocD1tLmxlbmd0aC0xMjswPHA7LS1wKWlmKG1bcF09PT1aWzBdJiZtW3ArMV09PT1aWzFdJiZtW3ArMl09PT1aWzJdJiZtW3ArM109PT1aWzNdKXthLkQ9cDticmVhayBhfWwoRXJyb3IoXCJFbmQgb2YgQ2VudHJhbCBEaXJlY3RvcnkgUmVjb3JkIG5vdCBmb3VuZFwiKSl9Zz1hLkQ7KGVbZysrXSE9PVpbMF18fGVbZysrXSE9PVpbMV18fGVbZysrXSE9PVpbMl18fGVbZysrXSE9PVpbM10pJiZsKEVycm9yKFwiaW52YWxpZCBzaWduYXR1cmVcIikpO2EuaGE9ZVtnKytdfGVbZysrXTw8ODthLmphPWVbZysrXXxlW2crK108PDg7YS5rYT1lW2crK118ZVtnKytdPDw4O2EuYWE9ZVtnKytdfGVbZysrXTw8ODthLlE9KGVbZysrXXxlW2crK108PDh8ZVtnKytdPDwxNnxlW2crK108PDI0KT4+PjA7YS5vPShlW2crK118XG5lW2crK108PDh8ZVtnKytdPDwxNnxlW2crK108PDI0KT4+PjA7YS53PWVbZysrXXxlW2crK108PDg7YS52PXk/ZS5zdWJhcnJheShnLGcrYS53KTplLnNsaWNlKGcsZythLncpfWQ9YS5vO2g9MDtmb3Ioaz1hLmFhO2g8azsrK2gpZj1uZXcgdGEoYS5pbnB1dCxkKSxmLnBhcnNlKCksZCs9Zi5sZW5ndGgsYltoXT1mLGNbZi5maWxlbmFtZV09aDthLlE8ZC1hLm8mJmwoRXJyb3IoXCJpbnZhbGlkIGZpbGUgaGVhZGVyIHNpemVcIikpO2EuaT1iO2EuRz1jfX10PVYucHJvdG90eXBlO3QuWT1mdW5jdGlvbigpe3ZhciBhPVtdLGIsYyxkO3RoaXMuaXx8JCh0aGlzKTtkPXRoaXMuaTtiPTA7Zm9yKGM9ZC5sZW5ndGg7YjxjOysrYilhW2JdPWRbYl0uZmlsZW5hbWU7cmV0dXJuIGF9O1xudC5yPWZ1bmN0aW9uKGEsYil7dmFyIGM7dGhpcy5HfHwkKHRoaXMpO2M9dGhpcy5HW2FdO2M9PT1yJiZsKEVycm9yKGErXCIgbm90IGZvdW5kXCIpKTt2YXIgZDtkPWJ8fHt9O3ZhciBmPXRoaXMuaW5wdXQsaD10aGlzLmksayxlLGcsbSxwLHMscSx4O2h8fCQodGhpcyk7aFtjXT09PXImJmwoRXJyb3IoXCJ3cm9uZyBpbmRleFwiKSk7ZT1oW2NdLiQ7az1uZXcgdWEodGhpcy5pbnB1dCxlKTtrLnBhcnNlKCk7ZSs9ay5sZW5ndGg7Zz1rLno7aWYoMCE9PShrLkkmdmEuTikpeyFkLnBhc3N3b3JkJiYhdGhpcy5qJiZsKEVycm9yKFwicGxlYXNlIHNldCBwYXNzd29yZFwiKSk7cz10aGlzLlMoZC5wYXNzd29yZHx8dGhpcy5qKTtxPWU7Zm9yKHg9ZSsxMjtxPHg7KytxKXdhKHRoaXMscyxmW3FdKTtlKz0xMjtnLT0xMjtxPWU7Zm9yKHg9ZStnO3E8eDsrK3EpZltxXT13YSh0aGlzLHMsZltxXSl9c3dpdGNoKGsuQSl7Y2FzZSBzYS5POm09eT90aGlzLmlucHV0LnN1YmFycmF5KGUsZStnKTp0aGlzLmlucHV0LnNsaWNlKGUsXG5lK2cpO2JyZWFrO2Nhc2Ugc2EuTTptPShuZXcgSSh0aGlzLmlucHV0LHtpbmRleDplLGJ1ZmZlclNpemU6ay5KfSkpLnIoKTticmVhaztkZWZhdWx0OmwoRXJyb3IoXCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGVcIikpfWlmKHRoaXMuYmEpe3ZhciB1PXIsbixFPVwibnVtYmVyXCI9PT10eXBlb2YgdT91OnU9MCxBPW0ubGVuZ3RoO249LTE7Zm9yKEU9QSY3O0UtLTsrK3Upbj1uPj4+OF5DWyhuXm1bdV0pJjI1NV07Zm9yKEU9QT4+MztFLS07dSs9OCluPW4+Pj44XkNbKG5ebVt1XSkmMjU1XSxuPW4+Pj44XkNbKG5ebVt1KzFdKSYyNTVdLG49bj4+PjheQ1sobl5tW3UrMl0pJjI1NV0sbj1uPj4+OF5DWyhuXm1bdSszXSkmMjU1XSxuPW4+Pj44XkNbKG5ebVt1KzRdKSYyNTVdLG49bj4+PjheQ1sobl5tW3UrNV0pJjI1NV0sbj1uPj4+OF5DWyhuXm1bdSs2XSkmMjU1XSxuPW4+Pj44XkNbKG5ebVt1KzddKSYyNTVdO3A9KG5eNDI5NDk2NzI5NSk+Pj4wO2sucCE9PXAmJmwoRXJyb3IoXCJ3cm9uZyBjcmM6IGZpbGU9MHhcIitcbmsucC50b1N0cmluZygxNikrXCIsIGRhdGE9MHhcIitwLnRvU3RyaW5nKDE2KSkpfXJldHVybiBtfTt0Lkw9ZnVuY3Rpb24oYSl7dGhpcy5qPWF9O2Z1bmN0aW9uIHdhKGEsYixjKXtjXj1hLnMoYik7YS5rKGIsYyk7cmV0dXJuIGN9dC5rPVUucHJvdG90eXBlLms7dC5TPVUucHJvdG90eXBlLlQ7dC5zPVUucHJvdG90eXBlLnM7dihcIlpsaWIuVW56aXBcIixWKTt2KFwiWmxpYi5VbnppcC5wcm90b3R5cGUuZGVjb21wcmVzc1wiLFYucHJvdG90eXBlLnIpO3YoXCJabGliLlVuemlwLnByb3RvdHlwZS5nZXRGaWxlbmFtZXNcIixWLnByb3RvdHlwZS5ZKTt2KFwiWmxpYi5VbnppcC5wcm90b3R5cGUuc2V0UGFzc3dvcmRcIixWLnByb3RvdHlwZS5MKTt9KS5jYWxsKHRoaXMpO1xuIiwibGV0IEEsSSxCO2NvbnN0IGc9e2Vudjp7ZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aDpmdW5jdGlvbihBKXtCPW5ldyBVaW50OEFycmF5KEkuZXhwb3J0cy5tZW1vcnkuYnVmZmVyKX19fTtjbGFzcyBRe2luaXQoKXtyZXR1cm4gQXx8KEE9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGZldGNoP2ZldGNoKFwiZGF0YTphcHBsaWNhdGlvbi93YXNtO2Jhc2U2NCxcIitDKS50aGVuKEE9PkEuYXJyYXlCdWZmZXIoKSkudGhlbihBPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShBLGcpKS50aGVuKHRoaXMuX2luaXQpOldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEJ1ZmZlci5mcm9tKEMsXCJiYXNlNjRcIiksZykudGhlbih0aGlzLl9pbml0KSxBKX1faW5pdChBKXtJPUEuaW5zdGFuY2UsZy5lbnYuZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aCgwKX1kZWNvZGUoQSxnPTApe2lmKCFJKXRocm93IG5ldyBFcnJvcihcIlpTVEREZWNvZGVyOiBBd2FpdCAuaW5pdCgpIGJlZm9yZSBkZWNvZGluZy5cIik7Y29uc3QgUT1BLmJ5dGVMZW5ndGgsQz1JLmV4cG9ydHMubWFsbG9jKFEpO0Iuc2V0KEEsQyksZz1nfHxOdW1iZXIoSS5leHBvcnRzLlpTVERfZmluZERlY29tcHJlc3NlZFNpemUoQyxRKSk7Y29uc3QgRT1JLmV4cG9ydHMubWFsbG9jKGcpLGk9SS5leHBvcnRzLlpTVERfZGVjb21wcmVzcyhFLGcsQyxRKSxEPUIuc2xpY2UoRSxFK2kpO3JldHVybiBJLmV4cG9ydHMuZnJlZShDKSxJLmV4cG9ydHMuZnJlZShFKSxEfX1jb25zdCBDPVwiQUdGemJRRUFBQUFCcFFFVllBRi9BWDlnQW45L0FHQURmMzkvQVg5Z0JYOS9mMzkvQVg5Z0FYOEFZQUovZndGL1lBUi9mMzkvQVg5Z0EzOS9md0JnQm45L2YzOS9md0YvWUFkL2YzOS9mMzkvQVg5Z0FuOS9BWDVnQW41K0FYNWdBQUJnQlg5L2YzOS9BR0FHZjM5L2YzOS9BR0FJZjM5L2YzOS9mMzhBWUFsL2YzOS9mMzkvZjM4QVlBQUJmMkFJZjM5L2YzOS9mMzhCZjJBTmYzOS9mMzkvZjM5L2YzOS9md0YvWUFGL0FYNENKd0VEWlc1MkgyVnRjMk55YVhCMFpXNWZibTkwYVdaNVgyMWxiVzl5ZVY5bmNtOTNkR2dBQkFOcGFBRUZBQUFGQWdFRkN3QUNBUUFCQWdJRkJRY0FBd0FCRGdzQkFRY0FFaE1IQUFVQkRBUUVBQUFOQndRQ0FnWUNCQWdEQXdNREJnRUFDUWtIQmdJQ0FBWUdBZ1FVQndZR0F3SUdBQU1DQVFnQkJ3VUdDZ29FRVFBRUJBRUlBd2dEQlFnREVBOElBQWNBQkFVQmNBRUNBZ1VFQVFDQUFnWUpBWDhCUWFDZ3dBSUxCMkFIQm0xbGJXOXllUUlBQm0xaGJHeHZZd0FvQkdaeVpXVUFKZ3hhVTFSRVgybHpSWEp5YjNJQWFCbGFVMVJFWDJacGJtUkVaV052YlhCeVpYTnpaV1JUYVhwbEFGUVBXbE5VUkY5a1pXTnZiWEJ5WlhOekFFb0dYM04wWVhKMEFDUUpCd0VBUVFFTEFTUUt1c3NCYUE4QUlBQWdBQ2dDQkNBQmFqWUNCQXNaQUNBQUtBSUFJQUFvQWdSQkgzRjBRUUFnQVd0QkgzRjJDd2dBSUFCQmlIOUxDMzRCQkg5QkF5RUJJQUFvQWdRaUEwRWdUUVJBSUFBb0FnZ2lBU0FBS0FJUVR3UkFJQUFRRFE4TElBQW9BZ3dpQWlBQlJnUkFRUUZCQWlBRFFTQkpHdzhMSUFBZ0FTQUJJQUpySUFOQkEzWWlCQ0FCSUFScklBSkpJZ0ViSWdKcklnUTJBZ2dnQUNBRElBSkJBM1JyTmdJRUlBQWdCQ2dBQURZQ0FBc2dBUXNVQVFGL0lBQWdBUkFDSVFJZ0FDQUJFQUVnQWd2M0FRRUNmeUFDUlFSQUlBQkNBRGNDQUNBQVFRQTJBaEFnQUVJQU53SUlRYmgvRHdzZ0FDQUJOZ0lNSUFBZ0FVRUVhallDRUNBQ1FRUlBCRUFnQUNBQklBSnFJZ0ZCZkdvaUF6WUNDQ0FBSUFNb0FBQTJBZ0FnQVVGL2FpMEFBQ0lCQkVBZ0FFRUlJQUVRRkdzMkFnUWdBZzhMSUFCQkFEWUNCRUYvRHdzZ0FDQUJOZ0lJSUFBZ0FTMEFBQ0lETmdJQUlBSkJmbW9pQkVFQlRRUkFJQVJCQVd0RkJFQWdBQ0FCTFFBQ1FSQjBJQU55SWdNMkFnQUxJQUFnQVMwQUFVRUlkQ0FEYWpZQ0FBc2dBU0FDYWtGL2FpMEFBQ0lCUlFSQUlBQkJBRFlDQkVGc0R3c2dBRUVvSUFFUUZDQUNRUU4wYW1zMkFnUWdBZ3NXQUNBQUlBRXBBQUEzQUFBZ0FDQUJLUUFJTndBSUN5OEJBWDhnQVVFQ2RFR2dIV29vQWdBZ0FDZ0NBRUVnSUFFZ0FDZ0NCR3ByUVI5eGRuRWhBaUFBSUFFUUFTQUNDeUVBSUFGQ3o5YlR2dExIcTlsQ2ZpQUFmRUlmaVVLSGxhK3ZtTGJlbTU1L2Znc2RBUUYvSUFBb0FnZ2dBQ2dDREVZRWZ5QUFLQUlFUVNCR0JVRUFDd3VDQkFFRGZ5QUNRWURBQUU4RVFDQUFJQUVnQWhCbklBQVBDeUFBSUFKcUlRTUNRQ0FBSUFGelFRTnhSUVJBQWtBZ0FrRUJTQVJBSUFBaEFnd0JDeUFBUVFOeFJRUkFJQUFoQWd3QkN5QUFJUUlEUUNBQ0lBRXRBQUE2QUFBZ0FVRUJhaUVCSUFKQkFXb2lBaUFEVHcwQklBSkJBM0VOQUFzTEFrQWdBMEY4Y1NJRVFjQUFTUTBBSUFJZ0JFRkFhaUlGU3cwQUEwQWdBaUFCS0FJQU5nSUFJQUlnQVNnQ0JEWUNCQ0FDSUFFb0FnZzJBZ2dnQWlBQktBSU1OZ0lNSUFJZ0FTZ0NFRFlDRUNBQ0lBRW9BaFEyQWhRZ0FpQUJLQUlZTmdJWUlBSWdBU2dDSERZQ0hDQUNJQUVvQWlBMkFpQWdBaUFCS0FJa05nSWtJQUlnQVNnQ0tEWUNLQ0FDSUFFb0FpdzJBaXdnQWlBQktBSXdOZ0l3SUFJZ0FTZ0NORFlDTkNBQ0lBRW9BamcyQWpnZ0FpQUJLQUk4TmdJOElBRkJRR3NoQVNBQ1FVQnJJZ0lnQlUwTkFBc0xJQUlnQkU4TkFRTkFJQUlnQVNnQ0FEWUNBQ0FCUVFScUlRRWdBa0VFYWlJQ0lBUkpEUUFMREFFTElBTkJCRWtFUUNBQUlRSU1BUXNnQTBGOGFpSUVJQUJKQkVBZ0FDRUNEQUVMSUFBaEFnTkFJQUlnQVMwQUFEb0FBQ0FDSUFFdEFBRTZBQUVnQWlBQkxRQUNPZ0FDSUFJZ0FTMEFBem9BQXlBQlFRUnFJUUVnQWtFRWFpSUNJQVJORFFBTEN5QUNJQU5KQkVBRFFDQUNJQUV0QUFBNkFBQWdBVUVCYWlFQklBSkJBV29pQWlBRFJ3MEFDd3NnQUFzTUFDQUFJQUVwQUFBM0FBQUxRUUVDZnlBQUtBSUlJZ0VnQUNnQ0VFa0VRRUVERHdzZ0FDQUFLQUlFSWdKQkIzRTJBZ1FnQUNBQklBSkJBM1pySWdFMkFnZ2dBQ0FCS0FBQU5nSUFRUUFMREFBZ0FDQUJLQUlBTmdBQUMvY0NBUUovQWtBZ0FDQUJSZzBBQWtBZ0FTQUNhaUFBU3dSQUlBQWdBbW9pQkNBQlN3MEJDeUFBSUFFZ0FoQUxEd3NnQUNBQmMwRURjU0VEQWtBQ1FDQUFJQUZKQkVBZ0F3UkFJQUFoQXd3REN5QUFRUU54UlFSQUlBQWhBd3dDQ3lBQUlRTURRQ0FDUlEwRUlBTWdBUzBBQURvQUFDQUJRUUZxSVFFZ0FrRi9haUVDSUFOQkFXb2lBMEVEY1EwQUN3d0JDd0pBSUFNTkFDQUVRUU54QkVBRFFDQUNSUTBGSUFBZ0FrRi9haUlDYWlJRElBRWdBbW90QUFBNkFBQWdBMEVEY1EwQUN3c2dBa0VEVFEwQUEwQWdBQ0FDUVh4cUlnSnFJQUVnQW1vb0FnQTJBZ0FnQWtFRFN3MEFDd3NnQWtVTkFnTkFJQUFnQWtGL2FpSUNhaUFCSUFKcUxRQUFPZ0FBSUFJTkFBc01BZ3NnQWtFRFRRMEFJQUloQkFOQUlBTWdBU2dDQURZQ0FDQUJRUVJxSVFFZ0EwRUVhaUVESUFSQmZHb2lCRUVEU3cwQUN5QUNRUU54SVFJTElBSkZEUUFEUUNBRElBRXRBQUE2QUFBZ0EwRUJhaUVESUFGQkFXb2hBU0FDUVg5cUlnSU5BQXNMSUFBTDh3SUNBbjhCZmdKQUlBSkZEUUFnQUNBQ2FpSURRWDlxSUFFNkFBQWdBQ0FCT2dBQUlBSkJBMGtOQUNBRFFYNXFJQUU2QUFBZ0FDQUJPZ0FCSUFOQmZXb2dBVG9BQUNBQUlBRTZBQUlnQWtFSFNRMEFJQU5CZkdvZ0FUb0FBQ0FBSUFFNkFBTWdBa0VKU1EwQUlBQkJBQ0FBYTBFRGNTSUVhaUlESUFGQi93RnhRWUdDaEFoc0lnRTJBZ0FnQXlBQ0lBUnJRWHh4SWdScUlnSkJmR29nQVRZQ0FDQUVRUWxKRFFBZ0F5QUJOZ0lJSUFNZ0FUWUNCQ0FDUVhocUlBRTJBZ0FnQWtGMGFpQUJOZ0lBSUFSQkdVa05BQ0FESUFFMkFoZ2dBeUFCTmdJVUlBTWdBVFlDRUNBRElBRTJBZ3dnQWtGd2FpQUJOZ0lBSUFKQmJHb2dBVFlDQUNBQ1FXaHFJQUUyQWdBZ0FrRmthaUFCTmdJQUlBUWdBMEVFY1VFWWNpSUVheUlDUVNCSkRRQWdBYTBpQlVJZ2hpQUZoQ0VGSUFNZ0JHb2hBUU5BSUFFZ0JUY0RHQ0FCSUFVM0F4QWdBU0FGTndNSUlBRWdCVGNEQUNBQlFTQnFJUUVnQWtGZ2FpSUNRUjlMRFFBTEN5QUFDeThCQW44Z0FDZ0NCQ0FBS0FJQVFRSjBhaUlDTFFBQ0lRTWdBQ0FDTHdFQUlBRWdBaTBBQXhBSWFqWUNBQ0FEQ3k4QkFuOGdBQ2dDQkNBQUtBSUFRUUowYWlJQ0xRQUNJUU1nQUNBQ0x3RUFJQUVnQWkwQUF4QUZhallDQUNBREN4OEFJQUFnQVNBQ0tBSUVFQWcyQWdBZ0FSQUVHaUFBSUFKQkNHbzJBZ1FMQ0FBZ0FHZEJIM01MdWdVQkRYOGpBRUVRYXlJS0pBQUNmeUFFUVFOTkJFQWdDa0VBTmdJTUlBcEJER29nQXlBRUVBc2FJQUFnQVNBQ0lBcEJER3BCQkJBVklnQkJiQ0FBRUFNYklBQWdBQ0FFU3hzTUFRc2dBRUVBSUFFb0FnQkJBWFJCQW1vUUVDRU5RVlFnQXlnQUFDSUdRUTl4SWdCQkNrc05BQm9nQWlBQVFRVnFOZ0lBSUFNZ0JHb2lBa0Y4YWlFTUlBSkJlV29oRGlBQ1FYdHFJUkFnQUVFR2FpRUxRUVFoQlNBR1FRUjJJUVJCSUNBQWRDSUFRUUZ5SVFrZ0FTZ0NBQ0VQUVFBaEFpQURJUVlDUUFOQUlBbEJBa2dnQWlBUFMzSkZCRUFnQWlFSEFrQWdDQVJBQTBBZ0JFSC8vd054UWYvL0EwWUVRQ0FIUVJocUlRY2dCaUFRU1FSL0lBWkJBbW9pQmlnQUFDQUZkZ1VnQlVFUWFpRUZJQVJCRUhZTElRUU1BUXNMQTBBZ0JFRURjU0lJUVFOR0JFQWdCVUVDYWlFRklBUkJBblloQkNBSFFRTnFJUWNNQVFzTElBY2dDR29pQnlBUFN3MEVJQVZCQW1vaEJRTkFJQUlnQjBrRVFDQU5JQUpCQVhScVFRQTdBUUFnQWtFQmFpRUNEQUVMQ3lBR0lBNUxRUUFnQmlBRlFRTjFhaUlISUF4TEcwVUVRQ0FIS0FBQUlBVkJCM0VpQlhZaEJBd0NDeUFFUVFKMklRUUxJQVloQndzQ2Z5QUxRWDlxSUFRZ0FFRi9hbkVpQmlBQVFRRjBRWDlxSWdnZ0NXc2lFVWtOQUJvZ0JDQUljU0lFUVFBZ0VTQUVJQUJJRzJzaEJpQUxDeUVJSUEwZ0FrRUJkR29nQmtGL2FpSUVPd0VBSUFsQkFTQUdheUFFSUFaQkFVZ2JheUVKQTBBZ0NTQUFTQVJBSUFCQkFYVWhBQ0FMUVg5cUlRc01BUXNMQW44Z0J5QU9TMEVBSUFjZ0JTQUlhaUlGUVFOMWFpSUdJQXhMRzBVRVFDQUZRUWR4REFFTElBVWdEQ0lHSUFkclFRTjBhd3NoQlNBQ1FRRnFJUUlnQkVVaENDQUdLQUFBSUFWQkgzRjJJUVFNQVFzTFFXd2dDVUVCUnlBRlFTQktjZzBCR2lBQklBSkJmMm8yQWdBZ0JpQUZRUWRxUVFOMWFpQURhd3dCQzBGUUN5RUFJQXBCRUdva0FDQUFDd2tBUVFGQkJTQUFHd3NNQUNBQUlBRW9BQUEyQUFBTHFnTUJDbjhqQUVId0FHc2lDaVFBSUFKQkFXb2hEaUFBUVFocUlRdEJnSUFFSUFWQmYycDBRUkIxSVF4QkFDRUNRUUVoQmtFQklBVjBJZ2xCZjJvaUR5RUlBMEFnQWlBT1JrVUVRQUpBSUFFZ0FrRUJkQ0lOYWk4QkFDSUhRZi8vQTBZRVFDQUxJQWhCQTNScUlBSTJBZ1FnQ0VGL2FpRUlRUUVoQnd3QkN5QUdRUUFnRENBSFFSQjBRUkIxU2hzaEJnc2dDaUFOYWlBSE93RUFJQUpCQVdvaEFnd0JDd3NnQUNBRk5nSUVJQUFnQmpZQ0FDQUpRUU4ySUFsQkFYWnFRUU5xSVF4QkFDRUFRUUFoQmtFQUlRSURRQ0FHSUE1R0JFQURRQUpBSUFBZ0NVWU5BQ0FLSUFzZ0FFRURkR29pQVNnQ0JDSUdRUUYwYWlJQ0lBSXZBUUFpQWtFQmFqc0JBQ0FCSUFVZ0FoQVVheUlJT2dBRElBRWdBaUFJUWY4QmNYUWdDV3M3QVFBZ0FTQUVJQVpCQW5RaUFtb29BZ0E2QUFJZ0FTQUNJQU5xS0FJQU5nSUVJQUJCQVdvaEFBd0JDd3NGSUFFZ0JrRUJkR291QVFBaERVRUFJUWNEUUNBSElBMU9SUVJBSUFzZ0FrRURkR29nQmpZQ0JBTkFJQUlnREdvZ0QzRWlBaUFJU3cwQUN5QUhRUUZxSVFjTUFRc0xJQVpCQVdvaEJnd0JDd3NnQ2tId0FHb2tBQXNqQUVJQUlBRVFDU0FBaFVLSGxhK3ZtTGJlbTU1L2ZrTGozTXFWL003eTlZVi9mQXNRQUNBQVFuNDNBd2dnQUNBQk5nSUFDeVFCQVg4Z0FBUkFJQUVvQWdRaUFnUkFJQUVvQWdnZ0FDQUNFUUVBRHdzZ0FCQW1Dd3NmQUNBQUlBRWdBaThCQUJBSU5nSUFJQUVRQkJvZ0FDQUNRUVJxTmdJRUMwb0JBWDlCb0NBb0FnQWlBU0FBYWlJQVFYOU1CRUJCaUNCQk1EWUNBRUYvRHdzQ1FDQUFQd0JCRUhSTkRRQWdBQkJtRFFCQmlDQkJNRFlDQUVGL0R3dEJvQ0FnQURZQ0FDQUJDOWNCQVFoL1FicC9JUW9DUUNBQ0tBSUVJZ2dnQWlnQ0FDSUphaUlPSUFFZ0FHdExEUUJCYkNFS0lBa2dCQ0FES0FJQUlndHJTdzBBSUFBZ0NXb2lCQ0FDS0FJSUlneHJJUTBnQUNBQlFXQnFJZzhnQ3lBSlFRQVFLU0FESUFrZ0MybzJBZ0FDUUFKQUlBd2dCQ0FGYTAwRVFDQU5JUVVNQVFzZ0RDQUVJQVpyU3cwQ0lBY2dEU0FGYXlJQWFpSUJJQWhxSUFkTkJFQWdCQ0FCSUFnUUR4b01BZ3NnQkNBQlFRQWdBR3NRRHlFQklBSWdBQ0FJYWlJSU5nSUVJQUVnQUdzaEJBc2dCQ0FQSUFVZ0NFRUJFQ2tMSUE0aENnc2dDZ3ViQWdFQmZ5TUFRWUFCYXlJTkpBQWdEU0FETmdKOEFrQWdBa0VEU3dSQVFYOGhDUXdCQ3dKQUFrQUNRQUpBSUFKQkFXc09Bd0FEQWdFTElBWkZCRUJCdUg4aENRd0VDMEZzSVFrZ0JTMEFBQ0lDSUFOTERRTWdBQ0FISUFKQkFuUWlBbW9vQWdBZ0FpQUlhaWdDQUJBN0lBRWdBRFlDQUVFQklRa01Bd3NnQVNBSk5nSUFRUUFoQ1F3Q0N5QUtSUVJBUVd3aENRd0NDMEVBSVFrZ0MwVWdERUVaU0hJTkFVRUlJQVIwUVFocUlRQkJBQ0VDQTBBZ0FpQUFUdzBDSUFKQlFHc2hBZ3dBQUFzQUMwRnNJUWtnRFNBTlFmd0FhaUFOUWZnQWFpQUZJQVlRRlNJQ0VBTU5BQ0FOS0FKNElnTWdCRXNOQUNBQUlBMGdEU2dDZkNBSElBZ2dBeEFZSUFFZ0FEWUNBQ0FDSVFrTElBMUJnQUZxSkFBZ0NRc0xBQ0FBSUFFZ0FoQUxHZ3NRQUNBQUx3QUFJQUF0QUFKQkVIUnlDeThBQW45QnVIOGdBVUVJU1EwQUdrRnlJQUFvQUFRaUFFRjNTdzBBR2tHNGZ5QUFRUWhxSWdBZ0FDQUJTeHNMQ3drQUlBQWdBVHNBQUFzREFBRUxpZ1lCQlg4Z0FDQUFLQUlBSWdWQmZuRTJBZ0JCQUNBQUlBVkJBWFpxUVlRZ0tBSUFJZ1FnQUVZYklRRUNRQUpBSUFBb0FnUWlBa1VOQUNBQ0tBSUFJZ05CQVhFTkFDQUNRUWhxSWdVZ0EwRUJka0Y0YWlJRFFRZ2dBMEVJU3h0blFSOXpRUUowUVlBZmFpSURLQUlBUmdSQUlBTWdBaWdDRERZQ0FBc2dBaWdDQ0NJREJFQWdBeUFDS0FJTU5nSUVDeUFDS0FJTUlnTUVRQ0FESUFJb0FnZzJBZ0FMSUFJZ0FpZ0NBQ0FBS0FJQVFYNXhhallDQUVHRUlDRUFBa0FDUUNBQlJRMEFJQUVnQWpZQ0JDQUJLQUlBSWdOQkFYRU5BU0FEUVFGMlFYaHFJZ05CQ0NBRFFRaExHMmRCSDNOQkFuUkJnQjlxSWdNb0FnQWdBVUVJYWtZRVFDQURJQUVvQWd3MkFnQUxJQUVvQWdnaUF3UkFJQU1nQVNnQ0REWUNCQXNnQVNnQ0RDSURCRUFnQXlBQktBSUlOZ0lBUVlRZ0tBSUFJUVFMSUFJZ0FpZ0NBQ0FCS0FJQVFYNXhhallDQUNBQklBUkdEUUFnQVNBQktBSUFRUUYyYWtFRWFpRUFDeUFBSUFJMkFnQUxJQUlvQWdCQkFYWkJlR29pQUVFSUlBQkJDRXNiWjBFZmMwRUNkRUdBSDJvaUFTZ0NBQ0VBSUFFZ0JUWUNBQ0FDSUFBMkFnd2dBa0VBTmdJSUlBQkZEUUVnQUNBRk5nSUFEd3NDUUNBQlJRMEFJQUVvQWdBaUFrRUJjUTBBSUFKQkFYWkJlR29pQWtFSUlBSkJDRXNiWjBFZmMwRUNkRUdBSDJvaUFpZ0NBQ0FCUVFocVJnUkFJQUlnQVNnQ0REWUNBQXNnQVNnQ0NDSUNCRUFnQWlBQktBSU1OZ0lFQ3lBQktBSU1JZ0lFUUNBQ0lBRW9BZ2cyQWdCQmhDQW9BZ0FoQkFzZ0FDQUFLQUlBSUFFb0FnQkJmbkZxSWdJMkFnQUNRQ0FCSUFSSEJFQWdBU0FCS0FJQVFRRjJhaUFBTmdJRUlBQW9BZ0FoQWd3QkMwR0VJQ0FBTmdJQUN5QUNRUUYyUVhocUlnRkJDQ0FCUVFoTEcyZEJIM05CQW5SQmdCOXFJZ0lvQWdBaEFTQUNJQUJCQ0dvaUFqWUNBQ0FBSUFFMkFnd2dBRUVBTmdJSUlBRkZEUUVnQVNBQ05nSUFEd3NnQlVFQmRrRjRhaUlCUVFnZ0FVRUlTeHRuUVI5elFRSjBRWUFmYWlJQ0tBSUFJUUVnQWlBQVFRaHFJZ0kyQWdBZ0FDQUJOZ0lNSUFCQkFEWUNDQ0FCUlEwQUlBRWdBallDQUFzTERnQWdBQVJBSUFCQmVHb1FKUXNMZ0FJQkEzOENRQ0FBUVE5cVFYaHhRWVFnS0FJQUtBSUFRUUYyYXlJQ0VCMUJmMFlOQUFKQVFZUWdLQUlBSWdBb0FnQWlBVUVCY1EwQUlBRkJBWFpCZUdvaUFVRUlJQUZCQ0VzYlowRWZjMEVDZEVHQUgyb2lBU2dDQUNBQVFRaHFSZ1JBSUFFZ0FDZ0NERFlDQUFzZ0FDZ0NDQ0lCQkVBZ0FTQUFLQUlNTmdJRUN5QUFLQUlNSWdGRkRRQWdBU0FBS0FJSU5nSUFDMEVCSVFFZ0FDQUFLQUlBSUFKQkFYUnFJZ0kyQWdBZ0FrRUJjUTBBSUFKQkFYWkJlR29pQWtFSUlBSkJDRXNiWjBFZmMwRUNkRUdBSDJvaUF5Z0NBQ0VDSUFNZ0FFRUlhaUlETmdJQUlBQWdBallDRENBQVFRQTJBZ2dnQWtVTkFDQUNJQU0yQWdBTElBRUx0d0lCQTM4Q1FBSkFJQUJCQVNBQUd5SUNFRGdpQUEwQUFrQUNRRUdFSUNnQ0FDSUFSUTBBSUFBb0FnQWlBMEVCY1EwQUlBQWdBMEVCY2pZQ0FDQURRUUYyUVhocUlnRkJDQ0FCUVFoTEcyZEJIM05CQW5SQmdCOXFJZ0VvQWdBZ0FFRUlha1lFUUNBQklBQW9BZ3cyQWdBTElBQW9BZ2dpQVFSQUlBRWdBQ2dDRERZQ0JBc2dBQ2dDRENJQkJFQWdBU0FBS0FJSU5nSUFDeUFDRUNjaEFrRUFJUUZCaENBb0FnQWhBQ0FDRFFFZ0FDQUFLQUlBUVg1eE5nSUFRUUFQQ3lBQ1FROXFRWGh4SWdNUUhTSUNRWDlHRFFJZ0FrRUhha0Y0Y1NJQUlBSkhCRUFnQUNBQ2F4QWRRWDlHRFFNTEFrQkJoQ0FvQWdBaUFVVUVRRUdBSUNBQU5nSUFEQUVMSUFBZ0FUWUNCQXRCaENBZ0FEWUNBQ0FBSUFOQkFYUkJBWEkyQWdBTUFRc2dBRVVOQVFzZ0FFRUlhaUVCQ3lBQkM3a0RBUUovSUFBZ0Eyb2hCUUpBSUFOQkIwd0VRQU5BSUFBZ0JVOE5BaUFBSUFJdEFBQTZBQUFnQUVFQmFpRUFJQUpCQVdvaEFnd0FBQXNBQ3lBRVFRRkdCRUFDUUNBQUlBSnJJZ1pCQjAwRVFDQUFJQUl0QUFBNkFBQWdBQ0FDTFFBQk9nQUJJQUFnQWkwQUFqb0FBaUFBSUFJdEFBTTZBQU1nQUVFRWFpQUNJQVpCQW5RaUJrSEFIbW9vQWdCcUlnSVFGeUFDSUFaQjRCNXFLQUlBYXlFQ0RBRUxJQUFnQWhBTUN5QUNRUWhxSVFJZ0FFRUlhaUVBQ3dKQUFrQUNRQUpBSUFVZ0FVMEVRQ0FBSUFOcUlRRWdCRUVCUnlBQUlBSnJRUTlLY2cwQkEwQWdBQ0FDRUF3Z0FrRUlhaUVDSUFCQkNHb2lBQ0FCU1EwQUN3d0ZDeUFBSUFGTEJFQWdBQ0VCREFRTElBUkJBVWNnQUNBQ2EwRVBTbklOQVNBQUlRTWdBaUVFQTBBZ0F5QUVFQXdnQkVFSWFpRUVJQU5CQ0dvaUF5QUJTUTBBQ3d3Q0N3TkFJQUFnQWhBSElBSkJFR29oQWlBQVFSQnFJZ0FnQVVrTkFBc01Bd3NnQUNFRElBSWhCQU5BSUFNZ0JCQUhJQVJCRUdvaEJDQURRUkJxSWdNZ0FVa05BQXNMSUFJZ0FTQUFhMm9oQWdzRFFDQUJJQVZQRFFFZ0FTQUNMUUFBT2dBQUlBRkJBV29oQVNBQ1FRRnFJUUlNQUFBTEFBc0xRUUVDZnlBQUlBQW9BcmpnQVNJRE5nTEU0QUVnQUNnQ3ZPQUJJUVFnQUNBQk5nSzg0QUVnQUNBQklBSnFOZ0s0NEFFZ0FDQUJJQVFnQTJ0cU5nTEE0QUVMcGdFQkFYOGdBQ0FBS0FMczRRRVFGallDeU9BQklBQkNBRGNEK09BQklBQkNBRGNEdU9BQklBQkJ3T0FCYWtJQU53TUFJQUJCcU5BQWFpSUJRWXlBZ09BQU5nSUFJQUJCQURZQ21PSUJJQUJDQURjRGlPRUJJQUJDQXpjRGdPRUJJQUJCck5BQmFrSGdFaWtDQURjQ0FDQUFRYlRRQVdwQjZCSW9BZ0EyQWdBZ0FDQUJOZ0lNSUFBZ0FFR1lJR28yQWdnZ0FDQUFRYUF3YWpZQ0JDQUFJQUJCRUdvMkFnQUxZUUVCZjBHNGZ5RURBa0FnQVVFRFNRMEFJQUlnQUJBaElnRkJBM1lpQURZQ0NDQUNJQUZCQVhFMkFnUWdBaUFCUVFGMlFRTnhJZ00yQWdBQ1FDQURRWDlxSWdGQkFrc05BQUpBSUFGQkFXc09BZ0VBQWd0QmJBOExJQUFoQXdzZ0F3c01BQ0FBSUFFZ0FrRUFFQzRMaUFRQ0EzOENmaUFERUJZaEJDQUFRUUJCS0JBUUlRQWdCQ0FDU3dSQUlBUVBDeUFCUlFSQVFYOFBDd0pBQWtBZ0EwRUJSZzBBSUFFb0FBQWlCa0dvNnI1cFJnMEFRWFloQXlBR1FYQnhRZERVdE1JQlJ3MEJRUWdoQXlBQ1FRaEpEUUVnQUVFQVFTZ1FFQ0VBSUFFb0FBUWhBU0FBUVFFMkFoUWdBQ0FCclRjREFFRUFEd3NnQVNBQ0lBTVFMeUlESUFKTERRQWdBQ0FETmdJWVFYSWhBeUFCSUFScUlnVkJmMm90QUFBaUFrRUljUTBBSUFKQklIRWlCa1VFUUVGd0lRTWdCUzBBQUNJRlFhY0JTdzBCSUFWQkIzR3RRZ0VnQlVFRGRrRUthcTJHSWdkQ0E0aCtJQWQ4SVFnZ0JFRUJhaUVFQ3lBQ1FRWjJJUU1nQWtFQ2RpRUZBa0FnQWtFRGNVRi9haUlDUVFKTEJFQkJBQ0VDREFFTEFrQUNRQUpBSUFKQkFXc09BZ0VDQUFzZ0FTQUVhaTBBQUNFQ0lBUkJBV29oQkF3Q0N5QUJJQVJxTHdBQUlRSWdCRUVDYWlFRURBRUxJQUVnQkdvb0FBQWhBaUFFUVFScUlRUUxJQVZCQVhFaEJRSitBa0FDUUFKQUlBTkJmMm9pQTBFQ1RRUkFJQU5CQVdzT0FnSURBUXRDZnlBR1JRMERHaUFCSUFScU1RQUFEQU1MSUFFZ0JHb3ZBQUN0UW9BQ2ZBd0NDeUFCSUFScUtBQUFyUXdCQ3lBQklBUnFLUUFBQ3lFSElBQWdCVFlDSUNBQUlBSTJBaHdnQUNBSE53TUFRUUFoQXlBQVFRQTJBaFFnQUNBSElBZ2dCaHNpQnpjRENDQUFJQWRDZ0lBSUlBZENnSUFJVkJzK0FoQUxJQU1MV3dFQmYwRzRmeUVESUFJUUZpSUNJQUZOQkg4Z0FDQUNha0YvYWkwQUFDSUFRUU54UVFKMFFhQWVhaWdDQUNBQ2FpQUFRUVoySWdGQkFuUkJzQjVxS0FJQWFpQUFRU0J4SWdCRmFpQUJSU0FBUVFWMmNXb0ZRYmgvQ3dzZEFDQUFLQUtRNGdFUVdpQUFRUUEyQXFEaUFTQUFRZ0EzQTVEaUFRdTFBd0VGZnlNQVFaQUNheUlLSkFCQnVIOGhCZ0pBSUFWRkRRQWdCQ3dBQUNJSVFmOEJjU0VIQWtBZ0NFRi9UQVJBSUFkQmduOXFRUUYySWdnZ0JVOE5Ba0ZzSVFZZ0IwR0JmMm9pQlVHQUFrOE5BaUFFUVFGcUlRZEJBQ0VHQTBBZ0JpQUZUd1JBSUFVaEJpQUlJUWNNQXdVZ0FDQUdhaUFISUFaQkFYWnFJZ1F0QUFCQkJIWTZBQUFnQUNBR1FRRnlhaUFFTFFBQVFROXhPZ0FBSUFaQkFtb2hCZ3dCQ3dBQUN3QUxJQWNnQlU4TkFTQUFJQVJCQVdvZ0J5QUtFRk1pQmhBRERRRUxJQVloQkVFQUlRWWdBVUVBUVRRUUVDRUpRUUFoQlFOQUlBUWdCa2NFUUNBQUlBWnFJZ2d0QUFBaUFVRUxTd1JBUVd3aEJnd0RCU0FKSUFGQkFuUnFJZ0VnQVNnQ0FFRUJhallDQUNBR1FRRnFJUVpCQVNBSUxRQUFkRUVCZFNBRmFpRUZEQUlMQUFzTFFXd2hCaUFGUlEwQUlBVVFGRUVCYWlJQlFReExEUUFnQXlBQk5nSUFRUUZCQVNBQmRDQUZheUlERUJRaUFYUWdBMGNOQUNBQUlBUnFJQUZCQVdvaUFEb0FBQ0FKSUFCQkFuUnFJZ0FnQUNnQ0FFRUJhallDQUNBSktBSUVJZ0JCQWtrZ0FFRUJjWElOQUNBQ0lBUkJBV28yQWdBZ0IwRUJhaUVHQ3lBS1FaQUNhaVFBSUFZTHhoRUJESDhqQUVId0FHc2lCU1FBUVd3aEN3SkFJQU5CQ2trTkFDQUNMd0FBSVFvZ0FpOEFBaUVKSUFJdkFBUWhCeUFGUVFocUlBUVFEZ0pBSUFNZ0J5QUpJQXBxYWtFR2FpSU1TUTBBSUFVdEFBb2hDQ0FGUWRnQWFpQUNRUVpxSWdJZ0NoQUdJZ3NRQXcwQklBVkJRR3NnQWlBS2FpSUNJQWtRQmlJTEVBTU5BU0FGUVNocUlBSWdDV29pQWlBSEVBWWlDeEFERFFFZ0JVRVFhaUFDSUFkcUlBTWdER3NRQmlJTEVBTU5BU0FBSUFGcUlnOUJmV29oRUNBRVFRUnFJUVpCQVNFTElBQWdBVUVEYWtFQ2RpSURhaUlNSUFOcUlnSWdBMm9pRGlFRElBSWhCQ0FNSVFjRFFDQUxJQU1nRUVseEJFQWdBQ0FHSUFWQjJBQnFJQWdRQWtFQ2RHb2lDUzhCQURzQUFDQUZRZGdBYWlBSkxRQUNFQUVnQ1MwQUF5RUxJQWNnQmlBRlFVQnJJQWdRQWtFQ2RHb2lDUzhCQURzQUFDQUZRVUJySUFrdEFBSVFBU0FKTFFBRElRb2dCQ0FHSUFWQktHb2dDQkFDUVFKMGFpSUpMd0VBT3dBQUlBVkJLR29nQ1MwQUFoQUJJQWt0QUFNaENTQURJQVlnQlVFUWFpQUlFQUpCQW5ScUlnMHZBUUE3QUFBZ0JVRVFhaUFOTFFBQ0VBRWdEUzBBQXlFTklBQWdDMm9pQ3lBR0lBVkIyQUJxSUFnUUFrRUNkR29pQUM4QkFEc0FBQ0FGUWRnQWFpQUFMUUFDRUFFZ0FDMEFBeUVBSUFjZ0Ntb2lDaUFHSUFWQlFHc2dDQkFDUVFKMGFpSUhMd0VBT3dBQUlBVkJRR3NnQnkwQUFoQUJJQWN0QUFNaEJ5QUVJQWxxSWdrZ0JpQUZRU2hxSUFnUUFrRUNkR29pQkM4QkFEc0FBQ0FGUVNocUlBUXRBQUlRQVNBRUxRQURJUVFnQXlBTmFpSURJQVlnQlVFUWFpQUlFQUpCQW5ScUlnMHZBUUE3QUFBZ0JVRVFhaUFOTFFBQ0VBRWdBQ0FMYWlFQUlBY2dDbW9oQnlBRUlBbHFJUVFnQXlBTkxRQURhaUVESUFWQjJBQnFFQTBnQlVGQWF4QU5jaUFGUVNocUVBMXlJQVZCRUdvUURYSkZJUXNNQVFzTElBUWdEa3NnQnlBQ1MzSU5BRUZzSVFzZ0FDQU1TdzBCSUF4QmZXb2hDUU5BUVFBZ0FDQUpTU0FGUWRnQWFoQUVHd1JBSUFBZ0JpQUZRZGdBYWlBSUVBSkJBblJxSWdvdkFRQTdBQUFnQlVIWUFHb2dDaTBBQWhBQklBQWdDaTBBQTJvaUFDQUdJQVZCMkFCcUlBZ1FBa0VDZEdvaUNpOEJBRHNBQUNBRlFkZ0FhaUFLTFFBQ0VBRWdBQ0FLTFFBRGFpRUFEQUVGSUF4QmZtb2hDZ05BSUFWQjJBQnFFQVFnQUNBS1MzSkZCRUFnQUNBR0lBVkIyQUJxSUFnUUFrRUNkR29pQ1M4QkFEc0FBQ0FGUWRnQWFpQUpMUUFDRUFFZ0FDQUpMUUFEYWlFQURBRUxDd05BSUFBZ0NrMEVRQ0FBSUFZZ0JVSFlBR29nQ0JBQ1FRSjBhaUlKTHdFQU93QUFJQVZCMkFCcUlBa3RBQUlRQVNBQUlBa3RBQU5xSVFBTUFRc0xBa0FnQUNBTVR3MEFJQUFnQmlBRlFkZ0FhaUFJRUFJaUFFRUNkR29pREMwQUFEb0FBQ0FNTFFBRFFRRkdCRUFnQlVIWUFHb2dEQzBBQWhBQkRBRUxJQVVvQWx4Qkgwc05BQ0FGUWRnQWFpQUdJQUJCQW5ScUxRQUNFQUVnQlNnQ1hFRWhTUTBBSUFWQklEWUNYQXNnQWtGOWFpRU1BMEJCQUNBSElBeEpJQVZCUUdzUUJCc0VRQ0FISUFZZ0JVRkFheUFJRUFKQkFuUnFJZ0F2QVFBN0FBQWdCVUZBYXlBQUxRQUNFQUVnQnlBQUxRQURhaUlBSUFZZ0JVRkFheUFJRUFKQkFuUnFJZ2N2QVFBN0FBQWdCVUZBYXlBSExRQUNFQUVnQUNBSExRQURhaUVIREFFRklBSkJmbW9oREFOQUlBVkJRR3NRQkNBSElBeExja1VFUUNBSElBWWdCVUZBYXlBSUVBSkJBblJxSWdBdkFRQTdBQUFnQlVGQWF5QUFMUUFDRUFFZ0J5QUFMUUFEYWlFSERBRUxDd05BSUFjZ0RFMEVRQ0FISUFZZ0JVRkFheUFJRUFKQkFuUnFJZ0F2QVFBN0FBQWdCVUZBYXlBQUxRQUNFQUVnQnlBQUxRQURhaUVIREFFTEN3SkFJQWNnQWs4TkFDQUhJQVlnQlVGQWF5QUlFQUlpQUVFQ2RHb2lBaTBBQURvQUFDQUNMUUFEUVFGR0JFQWdCVUZBYXlBQ0xRQUNFQUVNQVFzZ0JTZ0NSRUVmU3cwQUlBVkJRR3NnQmlBQVFRSjBhaTBBQWhBQklBVW9Ba1JCSVVrTkFDQUZRU0EyQWtRTElBNUJmV29oQWdOQVFRQWdCQ0FDU1NBRlFTaHFFQVFiQkVBZ0JDQUdJQVZCS0dvZ0NCQUNRUUowYWlJQUx3RUFPd0FBSUFWQktHb2dBQzBBQWhBQklBUWdBQzBBQTJvaUFDQUdJQVZCS0dvZ0NCQUNRUUowYWlJRUx3RUFPd0FBSUFWQktHb2dCQzBBQWhBQklBQWdCQzBBQTJvaEJBd0JCU0FPUVg1cUlRSURRQ0FGUVNocUVBUWdCQ0FDUzNKRkJFQWdCQ0FHSUFWQktHb2dDQkFDUVFKMGFpSUFMd0VBT3dBQUlBVkJLR29nQUMwQUFoQUJJQVFnQUMwQUEyb2hCQXdCQ3dzRFFDQUVJQUpOQkVBZ0JDQUdJQVZCS0dvZ0NCQUNRUUowYWlJQUx3RUFPd0FBSUFWQktHb2dBQzBBQWhBQklBUWdBQzBBQTJvaEJBd0JDd3NDUUNBRUlBNVBEUUFnQkNBR0lBVkJLR29nQ0JBQ0lnQkJBblJxSWdJdEFBQTZBQUFnQWkwQUEwRUJSZ1JBSUFWQktHb2dBaTBBQWhBQkRBRUxJQVVvQWl4Qkgwc05BQ0FGUVNocUlBWWdBRUVDZEdvdEFBSVFBU0FGS0FJc1FTRkpEUUFnQlVFZ05nSXNDd05BUVFBZ0F5QVFTU0FGUVJCcUVBUWJCRUFnQXlBR0lBVkJFR29nQ0JBQ1FRSjBhaUlBTHdFQU93QUFJQVZCRUdvZ0FDMEFBaEFCSUFNZ0FDMEFBMm9pQUNBR0lBVkJFR29nQ0JBQ1FRSjBhaUlDTHdFQU93QUFJQVZCRUdvZ0FpMEFBaEFCSUFBZ0FpMEFBMm9oQXd3QkJTQVBRWDVxSVFJRFFDQUZRUkJxRUFRZ0F5QUNTM0pGQkVBZ0F5QUdJQVZCRUdvZ0NCQUNRUUowYWlJQUx3RUFPd0FBSUFWQkVHb2dBQzBBQWhBQklBTWdBQzBBQTJvaEF3d0JDd3NEUUNBRElBSk5CRUFnQXlBR0lBVkJFR29nQ0JBQ1FRSjBhaUlBTHdFQU93QUFJQVZCRUdvZ0FDMEFBaEFCSUFNZ0FDMEFBMm9oQXd3QkN3c0NRQ0FESUE5UERRQWdBeUFHSUFWQkVHb2dDQkFDSWdCQkFuUnFJZ0l0QUFBNkFBQWdBaTBBQTBFQlJnUkFJQVZCRUdvZ0FpMEFBaEFCREFFTElBVW9BaFJCSDBzTkFDQUZRUkJxSUFZZ0FFRUNkR290QUFJUUFTQUZLQUlVUVNGSkRRQWdCVUVnTmdJVUN5QUJRV3dnQlVIWUFHb1FDaUFGUVVCckVBcHhJQVZCS0dvUUNuRWdCVUVRYWhBS2NSc2hDd3dKQ3dBQUN3QUxBQUFMQUFzQUFBc0FDd0FBQ3dBTFFXd2hDd3NnQlVId0FHb2tBQ0FMQzdVRUFRNS9Jd0JCRUdzaUJpUUFJQVpCQkdvZ0FCQU9RVlFoQlFKQUlBUkIzQXRKRFFBZ0JpMEFCQ0VISUFOQjhBUnFRUUJCN0FBUUVDRUlJQWRCREVzTkFDQURRZHdKYWlJSklBZ2dCa0VJYWlBR1FReHFJQUVnQWhBeEloQVFBMFVFUUNBR0tBSU1JZ1FnQjBzTkFTQURRZHdGYWlFUElBTkJwQVZxSVJFZ0FFRUVhaUVTSUFOQnFBVnFJUUVnQkNFRkEwQWdCU0lDUVg5cUlRVWdDQ0FDUVFKMGFpZ0NBRVVOQUFzZ0FrRUJhaUVPUVFFaEJRTkFJQVVnRGs5RkJFQWdDQ0FGUVFKMElndHFLQUlBSVF3Z0FTQUxhaUFLTmdJQUlBVkJBV29oQlNBS0lBeHFJUW9NQVFzTElBRWdDallDQUVFQUlRVWdCaWdDQ0NFTEEwQWdCU0FMUmtVRVFDQUJJQVVnQ1dvdEFBQWlERUVDZEdvaURTQU5LQUlBSWcxQkFXbzJBZ0FnRHlBTlFRRjBhaUlOSUF3NkFBRWdEU0FGT2dBQUlBVkJBV29oQlF3QkN3dEJBQ0VCSUFOQkFEWUNxQVVnQkVGL2N5QUhhaUVKUVFFaEJRTkFJQVVnRGs5RkJFQWdDQ0FGUVFKMElndHFLQUlBSVF3Z0F5QUxhaUFCTmdJQUlBd2dCU0FKYW5RZ0FXb2hBU0FGUVFGcUlRVU1BUXNMSUFjZ0JFRUJhaUlCSUFKcklnUnJRUUZxSVFnRFFFRUJJUVVnQkNBSVQwVUVRQU5BSUFVZ0RrOUZCRUFnQlVFQ2RDSUpJQU1nQkVFMGJHcHFJQU1nQ1dvb0FnQWdCSFkyQWdBZ0JVRUJhaUVGREFFTEN5QUVRUUZxSVFRTUFRc0xJQklnQnlBUElBb2dFU0FESUFJZ0FSQmtJQVpCQVRvQUJTQUdJQWM2QUFZZ0FDQUdLQUlFTmdJQUN5QVFJUVVMSUFaQkVHb2tBQ0FGQzhFTkFRdC9Jd0JCOEFCcklnVWtBRUZzSVFrQ1FDQURRUXBKRFFBZ0FpOEFBQ0VLSUFJdkFBSWhEQ0FDTHdBRUlRWWdCVUVJYWlBRUVBNENRQ0FESUFZZ0NpQU1hbXBCQm1vaURVa05BQ0FGTFFBS0lRY2dCVUhZQUdvZ0FrRUdhaUlDSUFvUUJpSUpFQU1OQVNBRlFVQnJJQUlnQ21vaUFpQU1FQVlpQ1JBRERRRWdCVUVvYWlBQ0lBeHFJZ0lnQmhBR0lna1FBdzBCSUFWQkVHb2dBaUFHYWlBRElBMXJFQVlpQ1JBRERRRWdBQ0FCYWlJT1FYMXFJUThnQkVFRWFpRUdRUUVoQ1NBQUlBRkJBMnBCQW5ZaUFtb2lDaUFDYWlJTUlBSnFJZzBoQXlBTUlRUWdDaUVDQTBBZ0NTQURJQTlKY1FSQUlBWWdCVUhZQUdvZ0J4QUNRUUYwYWlJSUxRQUFJUXNnQlVIWUFHb2dDQzBBQVJBQklBQWdDem9BQUNBR0lBVkJRR3NnQnhBQ1FRRjBhaUlJTFFBQUlRc2dCVUZBYXlBSUxRQUJFQUVnQWlBTE9nQUFJQVlnQlVFb2FpQUhFQUpCQVhScUlnZ3RBQUFoQ3lBRlFTaHFJQWd0QUFFUUFTQUVJQXM2QUFBZ0JpQUZRUkJxSUFjUUFrRUJkR29pQ0MwQUFDRUxJQVZCRUdvZ0NDMEFBUkFCSUFNZ0N6b0FBQ0FHSUFWQjJBQnFJQWNRQWtFQmRHb2lDQzBBQUNFTElBVkIyQUJxSUFndEFBRVFBU0FBSUFzNkFBRWdCaUFGUVVCcklBY1FBa0VCZEdvaUNDMEFBQ0VMSUFWQlFHc2dDQzBBQVJBQklBSWdDem9BQVNBR0lBVkJLR29nQnhBQ1FRRjBhaUlJTFFBQUlRc2dCVUVvYWlBSUxRQUJFQUVnQkNBTE9nQUJJQVlnQlVFUWFpQUhFQUpCQVhScUlnZ3RBQUFoQ3lBRlFSQnFJQWd0QUFFUUFTQURJQXM2QUFFZ0EwRUNhaUVESUFSQkFtb2hCQ0FDUVFKcUlRSWdBRUVDYWlFQUlBa2dCVUhZQUdvUURVVnhJQVZCUUdzUURVVnhJQVZCS0dvUURVVnhJQVZCRUdvUURVVnhJUWtNQVFzTElBUWdEVXNnQWlBTVMzSU5BRUZzSVFrZ0FDQUtTdzBCSUFwQmZXb2hDUU5BSUFWQjJBQnFFQVFnQUNBSlQzSkZCRUFnQmlBRlFkZ0FhaUFIRUFKQkFYUnFJZ2d0QUFBaEN5QUZRZGdBYWlBSUxRQUJFQUVnQUNBTE9nQUFJQVlnQlVIWUFHb2dCeEFDUVFGMGFpSUlMUUFBSVFzZ0JVSFlBR29nQ0MwQUFSQUJJQUFnQ3pvQUFTQUFRUUpxSVFBTUFRc0xBMEFnQlVIWUFHb1FCQ0FBSUFwUGNrVUVRQ0FHSUFWQjJBQnFJQWNRQWtFQmRHb2lDUzBBQUNFSUlBVkIyQUJxSUFrdEFBRVFBU0FBSUFnNkFBQWdBRUVCYWlFQURBRUxDd05BSUFBZ0Nra0VRQ0FHSUFWQjJBQnFJQWNRQWtFQmRHb2lDUzBBQUNFSUlBVkIyQUJxSUFrdEFBRVFBU0FBSUFnNkFBQWdBRUVCYWlFQURBRUxDeUFNUVgxcUlRQURRQ0FGUVVCckVBUWdBaUFBVDNKRkJFQWdCaUFGUVVCcklBY1FBa0VCZEdvaUNpMEFBQ0VKSUFWQlFHc2dDaTBBQVJBQklBSWdDVG9BQUNBR0lBVkJRR3NnQnhBQ1FRRjBhaUlLTFFBQUlRa2dCVUZBYXlBS0xRQUJFQUVnQWlBSk9nQUJJQUpCQW1vaEFnd0JDd3NEUUNBRlFVQnJFQVFnQWlBTVQzSkZCRUFnQmlBRlFVQnJJQWNRQWtFQmRHb2lBQzBBQUNFS0lBVkJRR3NnQUMwQUFSQUJJQUlnQ2pvQUFDQUNRUUZxSVFJTUFRc0xBMEFnQWlBTVNRUkFJQVlnQlVGQWF5QUhFQUpCQVhScUlnQXRBQUFoQ2lBRlFVQnJJQUF0QUFFUUFTQUNJQW82QUFBZ0FrRUJhaUVDREFFTEN5QU5RWDFxSVFBRFFDQUZRU2hxRUFRZ0JDQUFUM0pGQkVBZ0JpQUZRU2hxSUFjUUFrRUJkR29pQWkwQUFDRUtJQVZCS0dvZ0FpMEFBUkFCSUFRZ0Nqb0FBQ0FHSUFWQktHb2dCeEFDUVFGMGFpSUNMUUFBSVFvZ0JVRW9haUFDTFFBQkVBRWdCQ0FLT2dBQklBUkJBbW9oQkF3QkN3c0RRQ0FGUVNocUVBUWdCQ0FOVDNKRkJFQWdCaUFGUVNocUlBY1FBa0VCZEdvaUFDMEFBQ0VDSUFWQktHb2dBQzBBQVJBQklBUWdBam9BQUNBRVFRRnFJUVFNQVFzTEEwQWdCQ0FOU1FSQUlBWWdCVUVvYWlBSEVBSkJBWFJxSWdBdEFBQWhBaUFGUVNocUlBQXRBQUVRQVNBRUlBSTZBQUFnQkVFQmFpRUVEQUVMQ3dOQUlBVkJFR29RQkNBRElBOVBja1VFUUNBR0lBVkJFR29nQnhBQ1FRRjBhaUlBTFFBQUlRSWdCVUVRYWlBQUxRQUJFQUVnQXlBQ09nQUFJQVlnQlVFUWFpQUhFQUpCQVhScUlnQXRBQUFoQWlBRlFSQnFJQUF0QUFFUUFTQURJQUk2QUFFZ0EwRUNhaUVEREFFTEN3TkFJQVZCRUdvUUJDQURJQTVQY2tVRVFDQUdJQVZCRUdvZ0J4QUNRUUYwYWlJQUxRQUFJUUlnQlVFUWFpQUFMUUFCRUFFZ0F5QUNPZ0FBSUFOQkFXb2hBd3dCQ3dzRFFDQURJQTVKQkVBZ0JpQUZRUkJxSUFjUUFrRUJkR29pQUMwQUFDRUNJQVZCRUdvZ0FDMEFBUkFCSUFNZ0Fqb0FBQ0FEUVFGcUlRTU1BUXNMSUFGQmJDQUZRZGdBYWhBS0lBVkJRR3NRQ25FZ0JVRW9haEFLY1NBRlFSQnFFQXB4R3lFSkRBRUxRV3doQ1FzZ0JVSHdBR29rQUNBSkM4b0NBUVIvSXdCQklHc2lCU1FBSUFVZ0JCQU9JQVV0QUFJaEJ5QUZRUWhxSUFJZ0F4QUdJZ0lRQTBVRVFDQUVRUVJxSVFJZ0FDQUJhaUlEUVgxcUlRUURRQ0FGUVFocUVBUWdBQ0FFVDNKRkJFQWdBaUFGUVFocUlBY1FBa0VCZEdvaUJpMEFBQ0VJSUFWQkNHb2dCaTBBQVJBQklBQWdDRG9BQUNBQ0lBVkJDR29nQnhBQ1FRRjBhaUlHTFFBQUlRZ2dCVUVJYWlBR0xRQUJFQUVnQUNBSU9nQUJJQUJCQW1vaEFBd0JDd3NEUUNBRlFRaHFFQVFnQUNBRFQzSkZCRUFnQWlBRlFRaHFJQWNRQWtFQmRHb2lCQzBBQUNFR0lBVkJDR29nQkMwQUFSQUJJQUFnQmpvQUFDQUFRUUZxSVFBTUFRc0xBMEFnQUNBRFQwVUVRQ0FDSUFWQkNHb2dCeEFDUVFGMGFpSUVMUUFBSVFZZ0JVRUlhaUFFTFFBQkVBRWdBQ0FHT2dBQUlBQkJBV29oQUF3QkN3c2dBVUZzSUFWQkNHb1FDaHNoQWdzZ0JVRWdhaVFBSUFJTHRnTUJDWDhqQUVFUWF5SUdKQUFnQmtFQU5nSU1JQVpCQURZQ0NFRlVJUVFDUUFKQUlBTkJRR3NpRENBRElBWkJDR29nQmtFTWFpQUJJQUlRTVNJQ0VBTU5BQ0FHUVFScUlBQVFEaUFHS0FJTUlnY2dCaTBBQkVFQmFrc05BU0FBUVFScUlRb2dCa0VBT2dBRklBWWdCem9BQmlBQUlBWW9BZ1EyQWdBZ0IwRUJhaUVKUVFFaEJBTkFJQVFnQ1VrRVFDQURJQVJCQW5ScUlnRW9BZ0FoQUNBQklBVTJBZ0FnQUNBRVFYOXFkQ0FGYWlFRklBUkJBV29oQkF3QkN3c2dCMEVCYWlFSFFRQWhCU0FHS0FJSUlRa0RRQ0FGSUFsR0RRRWdBeUFGSUF4cUxRQUFJZ1JCQW5ScUlnQkJBU0FFZEVFQmRTSUxJQUFvQWdBaUFXb2lBRFlDQUNBSElBUnJJUWhCQUNFRUFrQWdDMEVEVFFSQUEwQWdCQ0FMUmcwQ0lBb2dBU0FFYWtFQmRHb2lBQ0FJT2dBQklBQWdCVG9BQUNBRVFRRnFJUVFNQUFBTEFBc0RRQ0FCSUFCUERRRWdDaUFCUVFGMGFpSUVJQWc2QUFFZ0JDQUZPZ0FBSUFRZ0NEb0FBeUFFSUFVNkFBSWdCQ0FJT2dBRklBUWdCVG9BQkNBRUlBZzZBQWNnQkNBRk9nQUdJQUZCQkdvaEFRd0FBQXNBQ3lBRlFRRnFJUVVNQUFBTEFBc2dBaUVFQ3lBR1FSQnFKQUFnQkF1dEFRRUNmd0pBUVlRZ0tBSUFJQUJISUFBb0FnQkJBWFlpQXlBQmEwRjRhaUlDUVhoeFFRaEhjZ1IvSUFJRklBTVFKMFVOQVNBQ1FRaHFDMEVRU1EwQUlBQWdBQ2dDQUNJQ1FRRnhJQUFnQVdwQkQycEJlSEVpQVNBQWEwRUJkSEkyQWdBZ0FTQUFOZ0lFSUFFZ0FTZ0NBRUVCY1NBQUlBSkJBWFpxSUFGcklnSkJBWFJ5TmdJQVFZUWdJQUVnQWtILy8vLy9CM0ZxUVFScVFZUWdLQUlBSUFCR0d5QUJOZ0lBSUFFUUpRc0x5Z0lCQlg4Q1FBSkFBa0FnQUVFSUlBQkJDRXNiWjBFZmN5QUFhVUVCUjJvaUFVRUVTU0FBSUFGMmNnMEFJQUZCQW5SQi9CNXFLQUlBSWdKRkRRQURRQ0FDUVhocUlnTW9BZ0JCQVhaQmVHb2lCU0FBVHdSQUlBSWdCVUVJSUFWQkNFc2JaMEVmYzBFQ2RFR0FIMm9pQVNnQ0FFWUVRQ0FCSUFJb0FnUTJBZ0FMREFNTElBUkJIa3NOQVNBRVFRRnFJUVFnQWlnQ0JDSUNEUUFMQzBFQUlRTWdBVUVnVHcwQkEwQWdBVUVDZEVHQUgyb29BZ0FpQWtVRVFDQUJRUjVMSVFJZ0FVRUJhaUVCSUFKRkRRRU1Bd3NMSUFJZ0FrRjRhaUlES0FJQVFRRjJRWGhxSWdGQkNDQUJRUWhMRzJkQkgzTkJBblJCZ0I5cUlnRW9BZ0JHQkVBZ0FTQUNLQUlFTmdJQUN3c2dBaWdDQUNJQkJFQWdBU0FDS0FJRU5nSUVDeUFDS0FJRUlnRUVRQ0FCSUFJb0FnQTJBZ0FMSUFNZ0F5Z0NBRUVCY2pZQ0FDQURJQUFRTndzZ0F3dmhDd0lOZndWK0l3QkI4QUJySWdja0FDQUhJQUFvQXZEaEFTSUlOZ0pjSUFFZ0Ftb2hEU0FJSUFBb0FvRGlBV29oRHdKQUFrQWdCVVVFUUNBQklRUU1BUXNnQUNnQ3hPQUJJUkFnQUNnQ3dPQUJJUkVnQUNnQ3ZPQUJJUTRnQUVFQk5nS000UUZCQUNFSUEwQWdDRUVEUndSQUlBY2dDRUVDZENJQ2FpQUFJQUpxUWF6UUFXb29BZ0EyQWtRZ0NFRUJhaUVJREFFTEMwRnNJUXdnQjBFWWFpQURJQVFRQmhBRERRRWdCMEVzYWlBSFFSaHFJQUFvQWdBUUV5QUhRVFJxSUFkQkdHb2dBQ2dDQ0JBVElBZEJQR29nQjBFWWFpQUFLQUlFRUJNZ0RVRmdhaUVTSUFFaEJFRUFJUXdEUUNBSEtBSXdJQWNvQWl4QkEzUnFLUUlBSWhSQ0VJaW5RZjhCY1NFSUlBY29Ba0FnQnlnQ1BFRURkR29wQWdBaUZVSVFpS2RCL3dGeElRc2dCeWdDT0NBSEtBSTBRUU4wYWlrQ0FDSVdRaUNJcHlFSklCVkNJSWdoRnlBVVFpQ0lweUVDQWtBZ0ZrSVFpS2RCL3dGeElnTkJBazhFUUFKQUlBWkZJQU5CR1VseVJRUkFJQWtnQjBFWWFpQURRU0FnQnlnQ0hHc2lDaUFLSUFOTEd5SUtFQVVnQXlBS2F5SURkR29oQ1NBSFFSaHFFQVFhSUFORkRRRWdCMEVZYWlBREVBVWdDV29oQ1F3QkN5QUhRUmhxSUFNUUJTQUphaUVKSUFkQkdHb1FCQm9MSUFjcEFrUWhHQ0FISUFrMkFrUWdCeUFZTndOSURBRUxBa0FnQTBVRVFDQUNCRUFnQnlnQ1JDRUpEQU1MSUFjb0FrZ2hDUXdCQ3dKQUFrQWdCMEVZYWtFQkVBVWdDU0FDUldwcUlnTkJBMFlFUUNBSEtBSkVRWDlxSWdNZ0EwVnFJUWtNQVFzZ0EwRUNkQ0FIYWlnQ1JDSUpJQWxGYWlFSklBTkJBVVlOQVFzZ0J5QUhLQUpJTmdKTUN3c2dCeUFIS0FKRU5nSklJQWNnQ1RZQ1JBc2dGNmNoQXlBTEJFQWdCMEVZYWlBTEVBVWdBMm9oQXdzZ0NDQUxha0VVVHdSQUlBZEJHR29RQkJvTElBZ0VRQ0FIUVJocUlBZ1FCU0FDYWlFQ0N5QUhRUmhxRUFRYUlBY2dCMEVZYWlBVVFoaUlwMEgvQVhFUUNDQVVwMEgvL3dOeGFqWUNMQ0FISUFkQkdHb2dGVUlZaUtkQi93RnhFQWdnRmFkQi8vOERjV28yQWp3Z0IwRVlhaEFFR2lBSElBZEJHR29nRmtJWWlLZEIvd0Z4RUFnZ0ZxZEIvLzhEY1dvMkFqUWdCeUFDTmdKZ0lBY29BbHdoQ2lBSElBazJBbWdnQnlBRE5nSmtBa0FDUUFKQUlBUWdBaUFEYWlJTGFpQVNTdzBBSUFJZ0Ntb2lFeUFQU3cwQUlBMGdCR3NnQzBFZ2FrOE5BUXNnQnlBSEtRTm9Od01RSUFjZ0J5a0RZRGNEQ0NBRUlBMGdCMEVJYWlBSFFkd0FhaUFQSUE0Z0VTQVFFQjRoQ3d3QkN5QUNJQVJxSVFnZ0JDQUtFQWNnQWtFUlR3UkFJQVJCRUdvaEFnTkFJQUlnQ2tFUWFpSUtFQWNnQWtFUWFpSUNJQWhKRFFBTEN5QUlJQWxySVFJZ0J5QVROZ0pjSUFrZ0NDQU9hMHNFUUNBSklBZ2dFV3RMQkVCQmJDRUxEQUlMSUJBZ0FpQU9heUlDYWlJS0lBTnFJQkJOQkVBZ0NDQUtJQU1RRHhvTUFnc2dDQ0FLUVFBZ0Ftc1FEeUVJSUFjZ0FpQURhaUlETmdKa0lBZ2dBbXNoQ0NBT0lRSUxJQWxCRUU4RVFDQURJQWhxSVFNRFFDQUlJQUlRQnlBQ1FSQnFJUUlnQ0VFUWFpSUlJQU5KRFFBTERBRUxBa0FnQ1VFSFRRUkFJQWdnQWkwQUFEb0FBQ0FJSUFJdEFBRTZBQUVnQ0NBQ0xRQUNPZ0FDSUFnZ0FpMEFBem9BQXlBSVFRUnFJQUlnQ1VFQ2RDSURRY0FlYWlnQ0FHb2lBaEFYSUFJZ0EwSGdIbW9vQWdCcklRSWdCeWdDWkNFRERBRUxJQWdnQWhBTUN5QURRUWxKRFFBZ0F5QUlhaUVESUFoQkNHb2lDQ0FDUVFocUlnSnJRUTlNQkVBRFFDQUlJQUlRRENBQ1FRaHFJUUlnQ0VFSWFpSUlJQU5KRFFBTUFnQUxBQXNEUUNBSUlBSVFCeUFDUVJCcUlRSWdDRUVRYWlJSUlBTkpEUUFMQ3lBSFFSaHFFQVFhSUFzZ0RDQUxFQU1pQWhzaERDQUVJQVFnQzJvZ0Foc2hCQ0FGUVg5cUlnVU5BQXNnREJBRERRRkJiQ0VNSUFkQkdHb1FCRUVDU1EwQlFRQWhDQU5BSUFoQkEwY0VRQ0FBSUFoQkFuUWlBbXBCck5BQmFpQUNJQWRxS0FKRU5nSUFJQWhCQVdvaENBd0JDd3NnQnlnQ1hDRUlDMEc2ZnlFTUlBOGdDR3NpQUNBTklBUnJTdzBBSUFRRWZ5QUVJQWdnQUJBTElBQnFCVUVBQ3lBQmF5RU1DeUFIUWZBQWFpUUFJQXdMa1JjQ0ZuOEZmaU1BUWRBQmF5SUhKQUFnQnlBQUtBTHc0UUVpQ0RZQ3ZBRWdBU0FDYWlFU0lBZ2dBQ2dDZ09JQmFpRVRBa0FDUUNBRlJRUkFJQUVoQXd3QkN5QUFLQUxFNEFFaEVTQUFLQUxBNEFFaEZTQUFLQUs4NEFFaER5QUFRUUUyQW96aEFVRUFJUWdEUUNBSVFRTkhCRUFnQnlBSVFRSjBJZ0pxSUFBZ0FtcEJyTkFCYWlnQ0FEWUNWQ0FJUVFGcUlRZ01BUXNMSUFjZ0VUWUNaQ0FISUE4MkFtQWdCeUFCSUE5ck5nSm9RV3doRUNBSFFTaHFJQU1nQkJBR0VBTU5BU0FGUVFRZ0JVRUVTQnNoRnlBSFFUeHFJQWRCS0dvZ0FDZ0NBQkFUSUFkQnhBQnFJQWRCS0dvZ0FDZ0NDQkFUSUFkQnpBQnFJQWRCS0dvZ0FDZ0NCQkFUUVFBaEJDQUhRZUFBYWlFTUlBZEI1QUJxSVFvRFFDQUhRU2hxRUFSQkFrc2dCQ0FYVG5KRkJFQWdCeWdDUUNBSEtBSThRUU4wYWlrQ0FDSWRRaENJcDBIL0FYRWhDeUFIS0FKUUlBY29Ba3hCQTNScUtRSUFJaDVDRUlpblFmOEJjU0VKSUFjb0FrZ2dCeWdDUkVFRGRHb3BBZ0FpSDBJZ2lLY2hDQ0FlUWlDSUlTQWdIVUlnaUtjaEFnSkFJQjlDRUlpblFmOEJjU0lEUVFKUEJFQUNRQ0FHUlNBRFFSbEpja1VFUUNBSUlBZEJLR29nQTBFZ0lBY29BaXhySWcwZ0RTQURTeHNpRFJBRklBTWdEV3NpQTNScUlRZ2dCMEVvYWhBRUdpQURSUTBCSUFkQktHb2dBeEFGSUFocUlRZ01BUXNnQjBFb2FpQURFQVVnQ0dvaENDQUhRU2hxRUFRYUN5QUhLUUpVSVNFZ0J5QUlOZ0pVSUFjZ0lUY0RXQXdCQ3dKQUlBTkZCRUFnQWdSQUlBY29BbFFoQ0F3REN5QUhLQUpZSVFnTUFRc0NRQUpBSUFkQktHcEJBUkFGSUFnZ0FrVnFhaUlEUVFOR0JFQWdCeWdDVkVGL2FpSURJQU5GYWlFSURBRUxJQU5CQW5RZ0Iyb29BbFFpQ0NBSVJXb2hDQ0FEUVFGR0RRRUxJQWNnQnlnQ1dEWUNYQXNMSUFjZ0J5Z0NWRFlDV0NBSElBZzJBbFFMSUNDbklRTWdDUVJBSUFkQktHb2dDUkFGSUFOcUlRTUxJQWtnQzJwQkZFOEVRQ0FIUVNocUVBUWFDeUFMQkVBZ0IwRW9haUFMRUFVZ0Ftb2hBZ3NnQjBFb2FoQUVHaUFISUFjb0FtZ2dBbW9pQ1NBRGFqWUNhQ0FLSUF3Z0NDQUpTeHNvQWdBaERTQUhJQWRCS0dvZ0hVSVlpS2RCL3dGeEVBZ2dIYWRCLy84RGNXbzJBandnQnlBSFFTaHFJQjVDR0lpblFmOEJjUkFJSUI2blFmLy9BM0ZxTmdKTUlBZEJLR29RQkJvZ0IwRW9haUFmUWhpSXAwSC9BWEVRQ0NFT0lBZEI4QUJxSUFSQkJIUnFJZ3NnQ1NBTmFpQUlhellDRENBTElBZzJBZ2dnQ3lBRE5nSUVJQXNnQWpZQ0FDQUhJQTRnSDZkQi8vOERjV28yQWtRZ0JFRUJhaUVFREFFTEN5QUVJQmRJRFFFZ0VrRmdhaUVZSUFkQjRBQnFJUm9nQjBIa0FHb2hHeUFCSVFNRFFDQUhRU2hxRUFSQkFrc2dCQ0FGVG5KRkJFQWdCeWdDUUNBSEtBSThRUU4wYWlrQ0FDSWRRaENJcDBIL0FYRWhDeUFIS0FKUUlBY29Ba3hCQTNScUtRSUFJaDVDRUlpblFmOEJjU0VJSUFjb0FrZ2dCeWdDUkVFRGRHb3BBZ0FpSDBJZ2lLY2hDU0FlUWlDSUlTQWdIVUlnaUtjaERBSkFJQjlDRUlpblFmOEJjU0lDUVFKUEJFQUNRQ0FHUlNBQ1FSbEpja1VFUUNBSklBZEJLR29nQWtFZ0lBY29BaXhySWdvZ0NpQUNTeHNpQ2hBRklBSWdDbXNpQW5ScUlRa2dCMEVvYWhBRUdpQUNSUTBCSUFkQktHb2dBaEFGSUFscUlRa01BUXNnQjBFb2FpQUNFQVVnQ1dvaENTQUhRU2hxRUFRYUN5QUhLUUpVSVNFZ0J5QUpOZ0pVSUFjZ0lUY0RXQXdCQ3dKQUlBSkZCRUFnREFSQUlBY29BbFFoQ1F3REN5QUhLQUpZSVFrTUFRc0NRQUpBSUFkQktHcEJBUkFGSUFrZ0RFVnFhaUlDUVFOR0JFQWdCeWdDVkVGL2FpSUNJQUpGYWlFSkRBRUxJQUpCQW5RZ0Iyb29BbFFpQ1NBSlJXb2hDU0FDUVFGR0RRRUxJQWNnQnlnQ1dEWUNYQXNMSUFjZ0J5Z0NWRFlDV0NBSElBazJBbFFMSUNDbklSUWdDQVJBSUFkQktHb2dDQkFGSUJScUlSUUxJQWdnQzJwQkZFOEVRQ0FIUVNocUVBUWFDeUFMQkVBZ0IwRW9haUFMRUFVZ0RHb2hEQXNnQjBFb2FoQUVHaUFISUFjb0FtZ2dER29pR1NBVWFqWUNhQ0FiSUJvZ0NTQVpTeHNvQWdBaEhDQUhJQWRCS0dvZ0hVSVlpS2RCL3dGeEVBZ2dIYWRCLy84RGNXbzJBandnQnlBSFFTaHFJQjVDR0lpblFmOEJjUkFJSUI2blFmLy9BM0ZxTmdKTUlBZEJLR29RQkJvZ0J5QUhRU2hxSUI5Q0dJaW5RZjhCY1JBSUlCK25RZi8vQTNGcU5nSkVJQWNnQjBId0FHb2dCRUVEY1VFRWRHb2lEU2tEQ0NJZE53UElBU0FISUEwcEF3QWlIamNEd0FFQ1FBSkFBa0FnQnlnQ3ZBRWlEaUFlcHlJQ2FpSVdJQk5MRFFBZ0F5QUhLQUxFQVNJS0lBSnFJZ3RxSUJoTERRQWdFaUFEYXlBTFFTQnFUdzBCQ3lBSElBY3BBOGdCTndNUUlBY2dCeWtEd0FFM0F3Z2dBeUFTSUFkQkNHb2dCMEc4QVdvZ0V5QVBJQlVnRVJBZUlRc01BUXNnQWlBRGFpRUlJQU1nRGhBSElBSkJFVThFUUNBRFFSQnFJUUlEUUNBQ0lBNUJFR29pRGhBSElBSkJFR29pQWlBSVNRMEFDd3NnQ0NBZHB5SU9heUVDSUFjZ0ZqWUN2QUVnRGlBSUlBOXJTd1JBSUE0Z0NDQVZhMHNFUUVGc0lRc01BZ3NnRVNBQ0lBOXJJZ0pxSWhZZ0Ntb2dFVTBFUUNBSUlCWWdDaEFQR2d3Q0N5QUlJQlpCQUNBQ2F4QVBJUWdnQnlBQ0lBcHFJZ28yQXNRQklBZ2dBbXNoQ0NBUElRSUxJQTVCRUU4RVFDQUlJQXBxSVFvRFFDQUlJQUlRQnlBQ1FSQnFJUUlnQ0VFUWFpSUlJQXBKRFFBTERBRUxBa0FnRGtFSFRRUkFJQWdnQWkwQUFEb0FBQ0FJSUFJdEFBRTZBQUVnQ0NBQ0xRQUNPZ0FDSUFnZ0FpMEFBem9BQXlBSVFRUnFJQUlnRGtFQ2RDSUtRY0FlYWlnQ0FHb2lBaEFYSUFJZ0NrSGdIbW9vQWdCcklRSWdCeWdDeEFFaENnd0JDeUFJSUFJUURBc2dDa0VKU1EwQUlBZ2dDbW9oQ2lBSVFRaHFJZ2dnQWtFSWFpSUNhMEVQVEFSQUEwQWdDQ0FDRUF3Z0FrRUlhaUVDSUFoQkNHb2lDQ0FLU1EwQURBSUFDd0FMQTBBZ0NDQUNFQWNnQWtFUWFpRUNJQWhCRUdvaUNDQUtTUTBBQ3dzZ0N4QURCRUFnQ3lFUURBUUZJQTBnRERZQ0FDQU5JQmtnSEdvZ0NXczJBZ3dnRFNBSk5nSUlJQTBnRkRZQ0JDQUVRUUZxSVFRZ0F5QUxhaUVEREFJTEFBc0xJQVFnQlVnTkFTQUVJQmRySVF0QkFDRUVBMEFnQ3lBRlNBUkFJQWNnQjBId0FHb2dDMEVEY1VFRWRHb2lBaWtEQ0NJZE53UElBU0FISUFJcEF3QWlIamNEd0FFQ1FBSkFBa0FnQnlnQ3ZBRWlEQ0FlcHlJQ2FpSUtJQk5MRFFBZ0F5QUhLQUxFQVNJSklBSnFJaEJxSUJoTERRQWdFaUFEYXlBUVFTQnFUdzBCQ3lBSElBY3BBOGdCTndNZ0lBY2dCeWtEd0FFM0F4Z2dBeUFTSUFkQkdHb2dCMEc4QVdvZ0V5QVBJQlVnRVJBZUlSQU1BUXNnQWlBRGFpRUlJQU1nREJBSElBSkJFVThFUUNBRFFSQnFJUUlEUUNBQ0lBeEJFR29pREJBSElBSkJFR29pQWlBSVNRMEFDd3NnQ0NBZHB5SUdheUVDSUFjZ0NqWUN2QUVnQmlBSUlBOXJTd1JBSUFZZ0NDQVZhMHNFUUVGc0lSQU1BZ3NnRVNBQ0lBOXJJZ0pxSWd3Z0NXb2dFVTBFUUNBSUlBd2dDUkFQR2d3Q0N5QUlJQXhCQUNBQ2F4QVBJUWdnQnlBQ0lBbHFJZ2syQXNRQklBZ2dBbXNoQ0NBUElRSUxJQVpCRUU4RVFDQUlJQWxxSVFZRFFDQUlJQUlRQnlBQ1FSQnFJUUlnQ0VFUWFpSUlJQVpKRFFBTERBRUxBa0FnQmtFSFRRUkFJQWdnQWkwQUFEb0FBQ0FJSUFJdEFBRTZBQUVnQ0NBQ0xRQUNPZ0FDSUFnZ0FpMEFBem9BQXlBSVFRUnFJQUlnQmtFQ2RDSUdRY0FlYWlnQ0FHb2lBaEFYSUFJZ0JrSGdIbW9vQWdCcklRSWdCeWdDeEFFaENRd0JDeUFJSUFJUURBc2dDVUVKU1EwQUlBZ2dDV29oQmlBSVFRaHFJZ2dnQWtFSWFpSUNhMEVQVEFSQUEwQWdDQ0FDRUF3Z0FrRUlhaUVDSUFoQkNHb2lDQ0FHU1EwQURBSUFDd0FMQTBBZ0NDQUNFQWNnQWtFUWFpRUNJQWhCRUdvaUNDQUdTUTBBQ3dzZ0VCQUREUU1nQzBFQmFpRUxJQU1nRUdvaEF3d0JDd3NEUUNBRVFRTkhCRUFnQUNBRVFRSjBJZ0pxUWF6UUFXb2dBaUFIYWlnQ1ZEWUNBQ0FFUVFGcUlRUU1BUXNMSUFjb0Fyd0JJUWdMUWJwL0lSQWdFeUFJYXlJQUlCSWdBMnRMRFFBZ0F3Ui9JQU1nQ0NBQUVBc2dBR29GUVFBTElBRnJJUkFMSUFkQjBBRnFKQUFnRUFzbEFDQUFRZ0EzQWdBZ0FFRUFPd0VJSUFCQkFEb0FDeUFBSUFFMkFnd2dBQ0FDT2dBS0M3UUZBUU4vSXdCQk1Hc2lCQ1FBSUFCQi93RnFJZ1ZCZldvaEJnSkFJQU12QVFJRVFDQUVRUmhxSUFFZ0FoQUdJZ0lRQXcwQklBUkJFR29nQkVFWWFpQURFQndnQkVFSWFpQUVRUmhxSUFNUUhDQUFJUU1EUUFKQUlBUkJHR29RQkNBRElBWlBja1VFUUNBRElBUkJFR29nQkVFWWFoQVNPZ0FBSUFNZ0JFRUlhaUFFUVJocUVCSTZBQUVnQkVFWWFoQUVSUTBCSUFOQkFtb2hBd3NnQlVGK2FpRUZBbjhEUUVHNmZ5RUNJQU1pQVNBRlN3MEZJQUVnQkVFUWFpQUVRUmhxRUJJNkFBQWdBVUVCYWlFRElBUkJHR29RQkVFRFJnUkFRUUloQWlBRVFRaHFEQUlMSUFNZ0JVc05CU0FCSUFSQkNHb2dCRUVZYWhBU09nQUJJQUZCQW1vaEEwRURJUUlnQkVFWWFoQUVRUU5IRFFBTElBUkJFR29MSVFVZ0F5QUZJQVJCR0dvUUVqb0FBQ0FCSUFKcUlBQnJJUUlNQXdzZ0F5QUVRUkJxSUFSQkdHb1FFam9BQWlBRElBUkJDR29nQkVFWWFoQVNPZ0FESUFOQkJHb2hBd3dBQUFzQUN5QUVRUmhxSUFFZ0FoQUdJZ0lRQXcwQUlBUkJFR29nQkVFWWFpQURFQndnQkVFSWFpQUVRUmhxSUFNUUhDQUFJUU1EUUFKQUlBUkJHR29RQkNBRElBWlBja1VFUUNBRElBUkJFR29nQkVFWWFoQVJPZ0FBSUFNZ0JFRUlhaUFFUVJocUVCRTZBQUVnQkVFWWFoQUVSUTBCSUFOQkFtb2hBd3NnQlVGK2FpRUZBbjhEUUVHNmZ5RUNJQU1pQVNBRlN3MEVJQUVnQkVFUWFpQUVRUmhxRUJFNkFBQWdBVUVCYWlFRElBUkJHR29RQkVFRFJnUkFRUUloQWlBRVFRaHFEQUlMSUFNZ0JVc05CQ0FCSUFSQkNHb2dCRUVZYWhBUk9nQUJJQUZCQW1vaEEwRURJUUlnQkVFWWFoQUVRUU5IRFFBTElBUkJFR29MSVFVZ0F5QUZJQVJCR0dvUUVUb0FBQ0FCSUFKcUlBQnJJUUlNQWdzZ0F5QUVRUkJxSUFSQkdHb1FFVG9BQWlBRElBUkJDR29nQkVFWWFoQVJPZ0FESUFOQkJHb2hBd3dBQUFzQUN5QUVRVEJxSkFBZ0FndHBBUUYvQW44Q1FBSkFJQUpCQjAwTkFDQUJLQUFBUWJmSXd1RitSdzBBSUFBZ0FTZ0FCRFlDbU9JQlFXSWdBRUVRYWlBQklBSVFQaUlERUFNTkFob2dBRUtCZ0lDQUVEY0RpT0VCSUFBZ0FTQURhaUFDSUFOckVDb01BUXNnQUNBQklBSVFLZ3RCQUFzTHJRTUJCbjhqQUVHQUFXc2lBeVFBUVdJaENBSkFJQUpCQ1VrTkFDQUFRWmpRQUdvZ0FVRUlhaUlFSUFKQmVHb2dBRUdZMEFBUU15SUZFQU1pQmcwQUlBTkJIellDZkNBRElBTkIvQUJxSUFOQitBQnFJQVFnQkNBRmFpQUdHeUlFSUFFZ0Ftb2lBaUFFYXhBVklnVVFBdzBBSUFNb0Fud2lCa0VmU3cwQUlBTW9BbmdpQjBFSlR3MEFJQUJCaUNCcUlBTWdCa0dBQzBHQURDQUhFQmdnQTBFME5nSjhJQU1nQTBIOEFHb2dBMEg0QUdvZ0JDQUZhaUlFSUFJZ0JHc1FGU0lGRUFNTkFDQURLQUo4SWdaQk5Fc05BQ0FES0FKNElnZEJDazhOQUNBQVFaQXdhaUFESUFaQmdBMUI0QTRnQnhBWUlBTkJJellDZkNBRElBTkIvQUJxSUFOQitBQnFJQVFnQldvaUJDQUNJQVJyRUJVaUJSQUREUUFnQXlnQ2ZDSUdRU05MRFFBZ0F5Z0NlQ0lIUVFwUERRQWdBQ0FESUFaQndCQkIwQkVnQnhBWUlBUWdCV29pQkVFTWFpSUZJQUpMRFFBZ0FpQUZheUVGUVFBaEFnTkFJQUpCQTBjRVFDQUVLQUFBSWdaQmYyb2dCVThOQWlBQUlBSkJBblJxUVp6UUFXb2dCallDQUNBQ1FRRnFJUUlnQkVFRWFpRUVEQUVMQ3lBRUlBRnJJUWdMSUFOQmdBRnFKQUFnQ0F0R0FRTi9JQUJCQ0dvaEF5QUFLQUlFSVFKQkFDRUFBMEFnQUNBQ2RrVUVRQ0FCSUFNZ0FFRURkR290QUFKQkZrdHFJUUVnQUVFQmFpRUFEQUVMQ3lBQlFRZ2dBbXQwQzRZREFRVi9RYmgvSVFjQ1FDQURSUTBBSUFJdEFBQWlCRVVFUUNBQlFRQTJBZ0JCQVVHNGZ5QURRUUZHR3c4TEFuOGdBa0VCYWlJRklBUkJHSFJCR0hVaUJrRi9TZzBBR2lBR1FYOUdCRUFnQTBFRFNBMENJQVV2QUFCQmdQNEJhaUVFSUFKQkEyb01BUXNnQTBFQ1NBMEJJQUl0QUFFZ0JFRUlkSEpCZ0lCK2FpRUVJQUpCQW1vTElRVWdBU0FFTmdJQUlBVkJBV29pQVNBQ0lBTnFJZ05MRFFCQmJDRUhJQUJCRUdvZ0FDQUZMUUFBSWdWQkJuWkJJMEVKSUFFZ0F5QUJhMEhBRUVIUUVVSHdFaUFBS0FLTTRRRWdBQ2dDbk9JQklBUVFIeUlHRUFNaUNBMEFJQUJCbUNCcUlBQkJDR29nQlVFRWRrRURjVUVmUVFnZ0FTQUJJQVpxSUFnYklnRWdBeUFCYTBHQUMwR0FERUdBRnlBQUtBS000UUVnQUNnQ25PSUJJQVFRSHlJR0VBTWlDQTBBSUFCQm9EQnFJQUJCQkdvZ0JVRUNka0VEY1VFMFFRa2dBU0FCSUFacUlBZ2JJZ0VnQXlBQmEwR0FEVUhnRGtHUUdTQUFLQUtNNFFFZ0FDZ0NuT0lCSUFRUUh5SUFFQU1OQUNBQUlBRnFJQUpySVFjTElBY0xyUU1CQ244akFFR0FCR3NpQ0NRQUFuOUJVaUFDUWY4QlN3MEFHa0ZVSUFOQkRFc05BQm9nQWtFQmFpRUxJQUJCQkdvaENVR0FnQVFnQTBGL2FuUkJFSFVoQ2tFQUlRSkJBU0VFUVFFZ0EzUWlCMEYvYWlJTUlRVURRQ0FDSUF0R1JRUkFBa0FnQVNBQ1FRRjBJZzFxTHdFQUlnWkIvLzhEUmdSQUlBa2dCVUVDZEdvZ0Fqb0FBaUFGUVg5cUlRVkJBU0VHREFFTElBUkJBQ0FLSUFaQkVIUkJFSFZLR3lFRUN5QUlJQTFxSUFZN0FRQWdBa0VCYWlFQ0RBRUxDeUFBSUFRN0FRSWdBQ0FET3dFQUlBZEJBM1lnQjBFQmRtcEJBMm9oQmtFQUlRUkJBQ0VDQTBBZ0JDQUxSa1VFUUNBQklBUkJBWFJxTGdFQUlRcEJBQ0VBQTBBZ0FDQUtUa1VFUUNBSklBSkJBblJxSUFRNkFBSURRQ0FDSUFacUlBeHhJZ0lnQlVzTkFBc2dBRUVCYWlFQURBRUxDeUFFUVFGcUlRUU1BUXNMUVg4Z0FnMEFHa0VBSVFJRGZ5QUNJQWRHQkg5QkFBVWdDQ0FKSUFKQkFuUnFJZ0F0QUFKQkFYUnFJZ0VnQVM4QkFDSUJRUUZxT3dFQUlBQWdBeUFCRUJScklnVTZBQU1nQUNBQklBVkIvd0Z4ZENBSGF6c0JBQ0FDUVFGcUlRSU1BUXNMQ3lFRklBaEJnQVJxSkFBZ0JRdmpCZ0VJZjBGc0lRY0NRQ0FDUVFOSkRRQUNRQUpBQWtBQ1FDQUJMUUFBSWdOQkEzRWlDVUVCYXc0REF3RUFBZ3NnQUNnQ2lPRUJEUUJCWWc4TElBSkJCVWtOQWtFRElRWWdBU2dBQUNFRkFuOENRQUpBSUFOQkFuWkJBM0VpQ0VGK2FpSUVRUUZOQkVBZ0JFRUJhdzBCREFJTElBVkJEblpCL3dkeElRUWdCVUVFZGtIL0IzRWhBeUFJUlF3Q0N5QUZRUkoySVFSQkJDRUdJQVZCQkhaQi8vOEFjU0VEUVFBTUFRc2dCVUVFZGtILy93OXhJZ05CZ0lBSVN3MERJQUV0QUFSQkNuUWdCVUVXZG5JaEJFRUZJUVpCQUFzaEJTQUVJQVpxSWdvZ0Frc05BZ0pBSUFOQmdRWkpEUUFnQUNnQ25PSUJSUTBBUVFBaEFnTkFJQUpCZzRBQlN3MEJJQUpCUUdzaEFnd0FBQXNBQ3dKL0lBbEJBMFlFUUNBQklBWnFJUUVnQUVIdzRnRnFJUUlnQUNnQ0RDRUdJQVVFUUNBQ0lBTWdBU0FFSUFZUVh3d0NDeUFDSUFNZ0FTQUVJQVlRWFF3QkN5QUFRYmpRQVdvaEFpQUJJQVpxSVFFZ0FFSHc0Z0ZxSVFZZ0FFR28wQUJxSVFnZ0JRUkFJQWdnQmlBRElBRWdCQ0FDRUY0TUFRc2dDQ0FHSUFNZ0FTQUVJQUlRWEFzUUF3MENJQUFnQXpZQ2dPSUJJQUJCQVRZQ2lPRUJJQUFnQUVIdzRnRnFOZ0x3NFFFZ0NVRUNSZ1JBSUFBZ0FFR28wQUJxTmdJTUN5QUFJQU5xSWdCQmlPTUJha0lBTndBQUlBQkJnT01CYWtJQU53QUFJQUJCK09JQmFrSUFOd0FBSUFCQjhPSUJha0lBTndBQUlBb1BDd0ovQWtBQ1FBSkFJQU5CQW5aQkEzRkJmMm9pQkVFQ1N3MEFJQVJCQVdzT0FnQUNBUXRCQVNFRUlBTkJBM1lNQWd0QkFpRUVJQUV2QUFCQkJIWU1BUXRCQXlFRUlBRVFJVUVFZGdzaUF5QUVhaUlGUVNCcUlBSkxCRUFnQlNBQ1N3MENJQUJCOE9JQmFpQUJJQVJxSUFNUUN5RUJJQUFnQXpZQ2dPSUJJQUFnQVRZQzhPRUJJQUVnQTJvaUFFSUFOd0FZSUFCQ0FEY0FFQ0FBUWdBM0FBZ2dBRUlBTndBQUlBVVBDeUFBSUFNMkFvRGlBU0FBSUFFZ0JHbzJBdkRoQVNBRkR3c0Nmd0pBQWtBQ1FDQURRUUoyUVFOeFFYOXFJZ1JCQWtzTkFDQUVRUUZyRGdJQUFnRUxRUUVoQnlBRFFRTjJEQUlMUVFJaEJ5QUJMd0FBUVFSMkRBRUxJQUpCQkVrZ0FSQWhJZ0pCajRDQUFVdHlEUUZCQXlFSElBSkJCSFlMSVFJZ0FFSHc0Z0ZxSUFFZ0Iyb3RBQUFnQWtFZ2FoQVFJUUVnQUNBQ05nS0E0Z0VnQUNBQk5nTHc0UUVnQjBFQmFpRUhDeUFIQzBzQUlBQkMrZXJRME9mSm9lVGhBRGNESUNBQVFnQTNBeGdnQUVMUDF0Tyswc2VyMlVJM0F4QWdBRUxXNjRMdTZ2Mko5ZUFBTndNSUlBQkNBRGNEQUNBQVFTaHFRUUJCS0JBUUdndmlBZ0lDZndWK0lBQkJLR29pQVNBQUtBSklhaUVDQW40Z0FDa0RBQ0lEUWlCYUJFQWdBQ2tERUNJRVFnZUpJQUFwQXdnaUJVSUJpWHdnQUNrREdDSUdRZ3lKZkNBQUtRTWdJZ2RDRW9sOElBVVFHU0FFRUJrZ0JoQVpJQWNRR1F3QkN5QUFLUU1ZUXNYUDJiTHg1YnJxSjN3TElBTjhJUU1EUUNBQlFRaHFJZ0FnQWswRVFFSUFJQUVwQUFBUUNTQURoVUliaVVLSGxhK3ZtTGJlbTU1L2ZrTGozTXFWL003eTlZVi9mQ0VESUFBaEFRd0JDd3NDUUNBQlFRUnFJZ0FnQWtzRVFDQUJJUUFNQVFzZ0FTZ0FBSzFDaDVXdnI1aTIzcHVlZjM0Z0E0VkNGNGxDejliVHZ0TEhxOWxDZmtMNTg5M3htZmFacXhaOElRTUxBMEFnQUNBQ1NRUkFJQUF4QUFCQ3hjL1pzdkhsdXVvbmZpQURoVUlMaVVLSGxhK3ZtTGJlbTU1L2ZpRURJQUJCQVdvaEFBd0JDd3NnQTBJaGlDQURoVUxQMXRPKzBzZXIyVUorSWdOQ0hZZ2dBNFZDK2ZQZDhabjJtYXNXZmlJRFFpQ0lJQU9GQys4Q0FnSi9CSDRnQUNBQUtRTUFJQUt0ZkRjREFBSkFBa0FnQUNnQ1NDSURJQUpxSWdSQkgwMEVRQ0FCUlEwQklBQWdBMnBCS0dvZ0FTQUNFQ0FnQUNnQ1NDQUNhaUVFREFFTElBRWdBbW9oQWdKL0lBTUVRQ0FBUVNocUlnUWdBMm9nQVVFZ0lBTnJFQ0FnQUNBQUtRTUlJQVFwQUFBUUNUY0RDQ0FBSUFBcEF4QWdBQ2tBTUJBSk53TVFJQUFnQUNrREdDQUFLUUE0RUFrM0F4Z2dBQ0FBS1FNZ0lBQkJRR3NwQUFBUUNUY0RJQ0FBS0FKSUlRTWdBRUVBTmdKSUlBRWdBMnRCSUdvaEFRc2dBVUVnYWlBQ1RRc0VRQ0FDUVdCcUlRTWdBQ2tESUNFRklBQXBBeGdoQmlBQUtRTVFJUWNnQUNrRENDRUlBMEFnQ0NBQktRQUFFQWtoQ0NBSElBRXBBQWdRQ1NFSElBWWdBU2tBRUJBSklRWWdCU0FCS1FBWUVBa2hCU0FCUVNCcUlnRWdBMDBOQUFzZ0FDQUZOd01nSUFBZ0JqY0RHQ0FBSUFjM0F4QWdBQ0FJTndNSUN5QUJJQUpQRFFFZ0FFRW9haUFCSUFJZ0FXc2lCQkFnQ3lBQUlBUTJBa2dMQ3k4QkFYOGdBRVVFUUVHMmYwRUFJQU1iRHd0QnVuOGhCQ0FESUFGTkJIOGdBQ0FDSUFNUUVCb2dBd1ZCdW44TEN5OEJBWDhnQUVVRVFFRzJmMEVBSUFNYkR3dEJ1bjhoQkNBRElBRk5CSDhnQUNBQ0lBTVFDeG9nQXdWQnVuOExDNmdDQVFaL0l3QkJFR3NpQnlRQUlBQkIyT0FCYWlrREFFS0FnSUFRVmlFSVFiaC9JUVVDUUNBRVFmLy9CMHNOQUNBQUlBTWdCQkJDSWdVUUF5SUdEUUFnQUNnQ25PSUJJUWtnQUNBSFFReHFJQU1nQXlBRmFpQUdHeUlLSUFSQkFDQUZJQVliYXlJR0VFQWlBeEFEQkVBZ0F5RUZEQUVMSUFjb0Fnd2hCQ0FCUlFSQVFicC9JUVVnQkVFQVNnMEJDeUFHSUFOcklRVWdBeUFLYWlFREFrQWdDUVJBSUFCQkFEWUNuT0lCREFFTEFrQUNRQUpBSUFSQkJVZ05BQ0FBUWRqZ0FXb3BBd0JDZ0lDQUNGZ05BQXdCQ3lBQVFRQTJBcHppQVF3QkN5QUFLQUlJRUQ4aEJpQUFRUUEyQXB6aUFTQUdRUlJQRFFFTElBQWdBU0FDSUFNZ0JTQUVJQWdRT1NFRkRBRUxJQUFnQVNBQ0lBTWdCU0FFSUFnUU9pRUZDeUFIUVJCcUpBQWdCUXRuQUNBQVFkRGdBV29nQVNBQ0lBQW9BdXpoQVJBdUlnRVFBd1JBSUFFUEMwRzRmeUVDQWtBZ0FRMEFJQUJCN09BQmFpZ0NBQ0lCQkVCQllDRUNJQUFvQXBqaUFTQUJSdzBCQzBFQUlRSWdBRUh3NEFGcUtBSUFSUTBBSUFCQmtPRUJhaEJEQ3lBQ0N5Y0JBWDhRVnlJRVJRUkFRVUFQQ3lBRUlBQWdBU0FDSUFNZ0JCQkxFRThoQUNBRUVGWWdBQXMvQVFGL0FrQUNRQUpBSUFBb0FxRGlBVUVCYWlJQlFRSkxEUUFnQVVFQmF3NENBQUVDQ3lBQUVEQkJBQThMSUFCQkFEWUNvT0lCQ3lBQUtBS1U0Z0VMdkFNQ0IzOEJmaU1BUVJCcklna2tBRUc0ZnlFR0FrQWdCQ2dDQUNJSVFRVkJDU0FBS0FMczRRRWlCUnRKRFFBZ0F5Z0NBQ0lIUVFGQkJTQUZHeUFGRUM4aUJSQURCRUFnQlNFR0RBRUxJQWdnQlVFRGFra05BQ0FBSUFjZ0JSQkpJZ1lRQXcwQUlBRWdBbW9oQ2lBQVFaRGhBV29oQ3lBSUlBVnJJUUlnQlNBSGFpRUhJQUVoQlFOQUlBY2dBaUFKRUN3aUJoQUREUUVnQWtGOWFpSUNJQVpKQkVCQnVIOGhCZ3dDQ3lBSktBSUFJZ2hCQWtzRVFFRnNJUVlNQWdzZ0IwRURhaUVIQW44Q1FBSkFBa0FnQ0VFQmF3NENBZ0FCQ3lBQUlBVWdDaUFGYXlBSElBWVFTQXdDQ3lBRklBb2dCV3NnQnlBR0VFY01BUXNnQlNBS0lBVnJJQWN0QUFBZ0NTZ0NDQkJHQ3lJSUVBTUVRQ0FJSVFZTUFnc2dBQ2dDOE9BQkJFQWdDeUFGSUFnUVJRc2dBaUFHYXlFQ0lBWWdCMm9oQnlBRklBaHFJUVVnQ1NnQ0JFVU5BQXNnQUNrRDBPQUJJZ3hDZjFJRVFFRnNJUVlnRENBRklBRnJyRklOQVFzZ0FDZ0M4T0FCQkVCQmFpRUdJQUpCQkVrTkFTQUxFRVFoRENBSEtBQUFJQXluUncwQklBZEJCR29oQnlBQ1FYeHFJUUlMSUFNZ0J6WUNBQ0FFSUFJMkFnQWdCU0FCYXlFR0N5QUpRUkJxSkFBZ0Jnc3VBQ0FBRUNzQ2YwRUFRUUFRQXcwQUdpQUJSU0FDUlhKRkJFQkJZaUFBSUFFZ0FoQTlFQU1OQVJvTFFRQUxDemNBSUFFRVFDQUFJQUFvQXNUZ0FTQUJLQUlFSUFFb0FnaHFSellDbk9JQkN5QUFFQ3RCQUJBRElBRkZja1VFUUNBQUlBRVFXd3NMMFFJQkIzOGpBRUVRYXlJR0pBQWdCaUFFTmdJSUlBWWdBellDRENBRkJFQWdCU2dDQkNFS0lBVW9BZ2doQ1FzZ0FTRUlBa0FDUUFOQUlBQW9BdXpoQVJBV0lRc0NRQU5BSUFRZ0Mwa05BU0FES0FBQVFYQnhRZERVdE1JQlJnUkFJQU1nQkJBaUlnY1FBdzBFSUFRZ0Iyc2hCQ0FESUFkcUlRTU1BUXNMSUFZZ0F6WUNEQ0FHSUFRMkFnZ0NRQ0FGQkVBZ0FDQUZFRTVCQUNFSFFRQVFBMFVOQVF3RkN5QUFJQW9nQ1JCTklnY1FBdzBFQ3lBQUlBZ1FVQ0FNUVFGSFFRQWdBQ0FJSUFJZ0JrRU1haUFHUVFocUVFd2lCeUlEYTBFQUlBTVFBeHRCQ2tkeVJRUkFRYmgvSVFjTUJBc2dCeEFERFFNZ0FpQUhheUVDSUFjZ0NHb2hDRUVCSVF3Z0JpZ0NEQ0VESUFZb0FnZ2hCQXdCQ3dzZ0JpQUROZ0lNSUFZZ0JEWUNDRUc0ZnlFSElBUU5BU0FJSUFGcklRY01BUXNnQmlBRE5nSU1JQVlnQkRZQ0NBc2dCa0VRYWlRQUlBY0xSZ0VDZnlBQklBQW9BcmpnQVNJQ1J3UkFJQUFnQWpZQ3hPQUJJQUFnQVRZQ3VPQUJJQUFvQXJ6Z0FTRURJQUFnQVRZQ3ZPQUJJQUFnQVNBRElBSnJhallDd09BQkN3dXRBZ0lFZndGK0l3QkJRR29pQkNRQUFrQUNRQ0FDUVFoSkRRQWdBU2dBQUVGd2NVSFExTFRDQVVjTkFDQUJJQUlRSWlFQklBQkNBRGNEQ0NBQVFRQTJBZ1FnQUNBQk5nSUFEQUVMSUFSQkdHb2dBU0FDRUMwaUF4QURCRUFnQUNBREVCb01BUXNnQXdSQUlBQkJ1SDhRR2d3QkN5QUNJQVFvQWpBaUEyc2hBaUFCSUFOcUlRTURRQUpBSUFBZ0F5QUNJQVJCQ0dvUUxDSUZFQU1FZnlBRkJTQUNJQVZCQTJvaUJVOE5BVUc0ZndzUUdnd0NDeUFHUVFGcUlRWWdBaUFGYXlFQ0lBTWdCV29oQXlBRUtBSU1SUTBBQ3lBRUtBSTRCRUFnQWtFRFRRUkFJQUJCdUg4UUdnd0NDeUFEUVFScUlRTUxJQVFvQWlnaEFpQUVLUU1ZSVFjZ0FFRUFOZ0lFSUFBZ0F5QUJhellDQUNBQUlBSWdCbXl0SUFjZ0IwSi9VUnMzQXdnTElBUkJRR3NrQUFzbEFRRi9Jd0JCRUdzaUFpUUFJQUlnQUNBQkVGRWdBaWdDQUNFQUlBSkJFR29rQUNBQUMzMEJCSDhqQUVHUUJHc2lCQ1FBSUFSQi93RTJBZ2dDUUNBRVFSQnFJQVJCQ0dvZ0JFRU1haUFCSUFJUUZTSUdFQU1FUUNBR0lRVU1BUXRCVkNFRklBUW9BZ3dpQjBFR1N3MEFJQU1nQkVFUWFpQUVLQUlJSUFjUVFTSUZFQU1OQUNBQUlBRWdCbW9nQWlBR2F5QURFRHdoQlFzZ0JFR1FCR29rQUNBRkM0Y0JBZ0ovQW41QkFCQVdJUU1DUUFOQUlBRWdBMDhFUUFKQUlBQW9BQUJCY0hGQjBOUzB3Z0ZHQkVBZ0FDQUJFQ0lpQWhBRFJRMEJRbjRQQ3lBQUlBRVFWU0lFUW4xV0RRTWdCQ0FGZkNJRklBUlVJUUpDZmlFRUlBSU5BeUFBSUFFUVVpSUNFQU1OQXdzZ0FTQUNheUVCSUFBZ0Ftb2hBQXdCQ3d0Q2ZpQUZJQUViSVFRTElBUUxQd0lCZndGK0l3QkJNR3NpQWlRQUFuNUNmaUFDUVFocUlBQWdBUkF0RFFBYVFnQWdBaWdDSEVFQlJnMEFHaUFDS1FNSUN5RURJQUpCTUdva0FDQURDNDBCQVFKL0l3QkJNR3NpQVNRQUFrQWdBRVVOQUNBQUtBS0k0Z0VOQUNBQklBQkIvT0VCYWlnQ0FEWUNLQ0FCSUFBcEF2VGhBVGNESUNBQUVEQWdBQ2dDcU9JQklRSWdBU0FCS0FJb05nSVlJQUVnQVNrRElEY0RFQ0FDSUFGQkVHb1FHeUFBUVFBMkFxamlBU0FCSUFFb0FpZzJBZ2dnQVNBQktRTWdOd01BSUFBZ0FSQWJDeUFCUVRCcUpBQUxLZ0VDZnlNQVFSQnJJZ0FrQUNBQVFRQTJBZ2dnQUVJQU53TUFJQUFRV0NFQklBQkJFR29rQUNBQkM0Y0JBUU4vSXdCQkVHc2lBaVFBQWtBZ0FDZ0NBRVVnQUNnQ0JFVnpEUUFnQWlBQUtBSUlOZ0lJSUFJZ0FDa0NBRGNEQUFKL0lBSW9BZ0FpQVFSQUlBSW9BZ2hCcU9NSklBRVJCUUFNQVF0QnFPTUpFQ2dMSWdGRkRRQWdBU0FBS1FJQU53TDA0UUVnQVVIODRRRnFJQUFvQWdnMkFnQWdBUkJaSUFFaEF3c2dBa0VRYWlRQUlBTUx5d0VCQW44akFFRWdheUlCSkFBZ0FFR0JnSURBQURZQ3RPSUJJQUJCQURZQ2lPSUJJQUJCQURZQzdPRUJJQUJDQURjRGtPSUJJQUJCQURZQ3BPTUpJQUJCQURZQzNPSUJJQUJDQURjQ3pPSUJJQUJCQURZQ3ZPSUJJQUJCQURZQ3hPQUJJQUJDQURjQ25PSUJJQUJCcE9JQmFrSUFOd0lBSUFCQnJPSUJha0VBTmdJQUlBRkNBRGNDRUNBQlFnQTNBaGdnQVNBQktRTVlOd01JSUFFZ0FTa0RFRGNEQUNBQktBSUlRUWgyUVFGeElRSWdBRUVBTmdMZzRnRWdBQ0FDTmdLTTRnRWdBVUVnYWlRQUMzWUJBMzhqQUVFd2F5SUJKQUFnQUFSQUlBRWdBRUhFMEFGcUlnSW9BZ0EyQWlnZ0FTQUFLUUs4MEFFM0F5QWdBQ2dDQUNFRElBRWdBaWdDQURZQ0dDQUJJQUFwQXJ6UUFUY0RFQ0FESUFGQkVHb1FHeUFCSUFFb0FpZzJBZ2dnQVNBQktRTWdOd01BSUFBZ0FSQWJDeUFCUVRCcUpBQUx6QUVCQVg4Z0FDQUJLQUswMEFFMkFwamlBU0FBSUFFb0FnUWlBallDd09BQklBQWdBallDdk9BQklBQWdBaUFCS0FJSWFpSUNOZ0s0NEFFZ0FDQUNOZ0xFNEFFZ0FTZ0N1TkFCQkVBZ0FFS0JnSUNBRURjRGlPRUJJQUFnQVVHazBBQnFOZ0lNSUFBZ0FVR1VJR28yQWdnZ0FDQUJRWnd3YWpZQ0JDQUFJQUZCREdvMkFnQWdBRUdzMEFGcUlBRkJxTkFCYWlnQ0FEWUNBQ0FBUWJEUUFXb2dBVUdzMEFGcUtBSUFOZ0lBSUFCQnROQUJhaUFCUWJEUUFXb29BZ0EyQWdBUEN5QUFRZ0EzQTRqaEFRczdBQ0FDUlFSQVFicC9Ed3NnQkVVRVFFRnNEd3NnQWlBRUVHQUVRQ0FBSUFFZ0FpQURJQVFnQlJCaER3c2dBQ0FCSUFJZ0F5QUVJQVVRWlF0R0FRRi9Jd0JCRUdzaUJTUUFJQVZCQ0dvZ0JCQU9BbjhnQlMwQUNRUkFJQUFnQVNBQ0lBTWdCQkF5REFFTElBQWdBU0FDSUFNZ0JCQTBDeUVBSUFWQkVHb2tBQ0FBQ3pRQUlBQWdBeUFFSUFVUU5pSUZFQU1FUUNBRkR3c2dCU0FFU1FSL0lBRWdBaUFESUFWcUlBUWdCV3NnQUJBMUJVRzRmd3NMUmdFQmZ5TUFRUkJySWdVa0FDQUZRUWhxSUFRUURnSi9JQVV0QUFrRVFDQUFJQUVnQWlBRElBUVFZZ3dCQ3lBQUlBRWdBaUFESUFRUU5Rc2hBQ0FGUVJCcUpBQWdBQXRaQVFGL1FROGhBaUFCSUFCSkJFQWdBVUVFZENBQWJpRUNDeUFBUVFoMklnRWdBa0VZYkNJQVFZd0lhaWdDQUd3Z0FFR0lDR29vQWdCcUlnSkJBM1lnQW1vZ0FFR0FDR29vQWdBZ0FFR0VDR29vQWdBZ0FXeHFTUXMzQUNBQUlBTWdCQ0FGUVlBUUVETWlCUkFEQkVBZ0JROExJQVVnQkVrRWZ5QUJJQUlnQXlBRmFpQUVJQVZySUFBUU1nVkJ1SDhMQzc4REFRTi9Jd0JCSUdzaUJTUUFJQVZCQ0dvZ0FpQURFQVlpQWhBRFJRUkFJQUFnQVdvaUIwRjlhaUVHSUFVZ0JCQU9JQVJCQkdvaEFpQUZMUUFDSVFNRFFFRUFJQUFnQmtrZ0JVRUlhaEFFR3dSQUlBQWdBaUFGUVFocUlBTVFBa0VDZEdvaUJDOEJBRHNBQUNBRlFRaHFJQVF0QUFJUUFTQUFJQVF0QUFOcUlnUWdBaUFGUVFocUlBTVFBa0VDZEdvaUFDOEJBRHNBQUNBRlFRaHFJQUF0QUFJUUFTQUVJQUF0QUFOcUlRQU1BUVVnQjBGK2FpRUVBMEFnQlVFSWFoQUVJQUFnQkV0eVJRUkFJQUFnQWlBRlFRaHFJQU1RQWtFQ2RHb2lCaThCQURzQUFDQUZRUWhxSUFZdEFBSVFBU0FBSUFZdEFBTnFJUUFNQVFzTEEwQWdBQ0FFUzBVRVFDQUFJQUlnQlVFSWFpQURFQUpCQW5ScUlnWXZBUUE3QUFBZ0JVRUlhaUFHTFFBQ0VBRWdBQ0FHTFFBRGFpRUFEQUVMQ3dKQUlBQWdCMDhOQUNBQUlBSWdCVUVJYWlBREVBSWlBMEVDZEdvaUFDMEFBRG9BQUNBQUxRQURRUUZHQkVBZ0JVRUlhaUFBTFFBQ0VBRU1BUXNnQlNnQ0RFRWZTdzBBSUFWQkNHb2dBaUFEUVFKMGFpMEFBaEFCSUFVb0FneEJJVWtOQUNBRlFTQTJBZ3dMSUFGQmJDQUZRUWhxRUFvYklRSUxDd3NnQlVFZ2FpUUFJQUlMa2dJQkJIOGpBRUZBYWlJSkpBQWdDU0FEUVRRUUN5RURBa0FnQkVFQ1NBMEFJQU1nQkVFQ2RHb29BZ0FoQ1NBRFFUeHFJQWdRSXlBRFFRRTZBRDhnQXlBQ09nQStRUUFoQkNBREtBSThJUW9EUUNBRUlBbEdEUUVnQUNBRVFRSjBhaUFLTmdFQUlBUkJBV29oQkF3QUFBc0FDMEVBSVFrRFFDQUdJQWxHUlFSQUlBTWdCU0FKUVFGMGFpSUtMUUFCSWd0QkFuUnFJZ3dvQWdBaEJDQURRVHhxSUFvdEFBQkJDSFFnQ0dwQi8vOERjUkFqSUFOQkFqb0FQeUFESUFjZ0Myc2lDaUFDYWpvQVBpQUVRUUVnQVNBS2EzUnFJUW9nQXlnQ1BDRUxBMEFnQUNBRVFRSjBhaUFMTmdFQUlBUkJBV29pQkNBS1NRMEFDeUFNSUFvMkFnQWdDVUVCYWlFSkRBRUxDeUFEUVVCckpBQUxvd0lCQ1g4akFFSFFBR3NpQ1NRQUlBbEJFR29nQlVFMEVBc2FJQWNnQm1zaER5QUhJQUZySVJBRFFBSkFJQU1nQ2tjRVFFRUJJQUVnQnlBQ0lBcEJBWFJxSWdZdEFBRWlER3NpQ0dzaUMzUWhEU0FHTFFBQUlRNGdDVUVRYWlBTVFRSjBhaUlNS0FJQUlRWWdDeUFQVHdSQUlBQWdCa0VDZEdvZ0N5QUlJQVVnQ0VFMGJHb2dDQ0FRYWlJSVFRRWdDRUVCU2hzaUNDQUNJQVFnQ0VFQ2RHb29BZ0FpQ0VFQmRHb2dBeUFJYXlBSElBNFFZeUFHSUExcUlRZ01BZ3NnQ1VFTWFpQU9FQ01nQ1VFQk9nQVBJQWtnQ0RvQURpQUdJQTFxSVFnZ0NTZ0NEQ0VMQTBBZ0JpQUlUdzBDSUFBZ0JrRUNkR29nQ3pZQkFDQUdRUUZxSVFZTUFBQUxBQXNnQ1VIUUFHb2tBQThMSUF3Z0NEWUNBQ0FLUVFGcUlRb01BQUFMQUFzMEFDQUFJQU1nQkNBRkVEWWlCUkFEQkVBZ0JROExJQVVnQkVrRWZ5QUJJQUlnQXlBRmFpQUVJQVZySUFBUU5BVkJ1SDhMQ3lNQUlBQS9BRUVRZEd0Qi8vOERha0VRZGtBQVFYOUdCRUJCQUE4TFFRQVFBRUVCQ3pzQkFYOGdBZ1JBQTBBZ0FDQUJJQUpCZ0NBZ0FrR0FJRWtiSWdNUUN5RUFJQUZCZ0NCcUlRRWdBRUdBSUdvaEFDQUNJQU5ySWdJTkFBc0xDd1lBSUFBUUF3c0xxQlVKQUVHSUNBc05BUUFBQUFFQUFBQUNBQUFBQWdCQm9BZ0xzd1lCQUFBQUFRQUFBQUlBQUFBQ0FBQUFKZ0FBQUlJQUFBQWhCUUFBU2dBQUFHY0lBQUFtQUFBQXdBRUFBSUFBQUFCSkJRQUFTZ0FBQUw0SUFBQXBBQUFBTEFJQUFJQUFBQUJKQlFBQVNnQUFBTDRJQUFBdkFBQUF5Z0lBQUlBQUFBQ0tCUUFBU2dBQUFJUUpBQUExQUFBQWN3TUFBSUFBQUFDZEJRQUFTZ0FBQUtBSkFBQTlBQUFBZ1FNQUFJQUFBQURyQlFBQVN3QUFBRDRLQUFCRUFBQUFuZ01BQUlBQUFBQk5CZ0FBU3dBQUFLb0tBQUJMQUFBQXN3TUFBSUFBQUFEQkJnQUFUUUFBQUI4TkFBQk5BQUFBVXdRQUFJQUFBQUFqQ0FBQVVRQUFBS1lQQUFCVUFBQUFtUVFBQUlBQUFBQkxDUUFBVndBQUFMRVNBQUJZQUFBQTJnUUFBSUFBQUFCdkNRQUFYUUFBQUNNVUFBQlVBQUFBUlFVQUFJQUFBQUJVQ2dBQWFnQUFBSXdVQUFCcUFBQUFyd1VBQUlBQUFBQjJDUUFBZkFBQUFFNFFBQUI4QUFBQTBnSUFBSUFBQUFCakJ3QUFrUUFBQUpBSEFBQ1NBQUFBQUFBQUFBRUFBQUFCQUFBQUJRQUFBQTBBQUFBZEFBQUFQUUFBQUgwQUFBRDlBQUFBL1FFQUFQMERBQUQ5QndBQS9ROEFBUDBmQUFEOVB3QUEvWDhBQVAzL0FBRDkvd0VBL2Y4REFQMy9Cd0Q5L3c4QS9mOGZBUDMvUHdEOS8zOEEvZi8vQVAzLy93SDkvLzhEL2YvL0IvMy8vdy85Ly84Zi9mLy9QLzMvLzM4QUFBQUFBUUFBQUFJQUFBQURBQUFBQkFBQUFBVUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQkVBQUFBU0FBQUFFd0FBQUJRQUFBQVZBQUFBRmdBQUFCY0FBQUFZQUFBQUdRQUFBQm9BQUFBYkFBQUFIQUFBQUIwQUFBQWVBQUFBSHdBQUFBTUFBQUFFQUFBQUJRQUFBQVlBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dBQUFBd0FBQUFOQUFBQURnQUFBQThBQUFBUUFBQUFFUUFBQUJJQUFBQVRBQUFBRkFBQUFCVUFBQUFXQUFBQUZ3QUFBQmdBQUFBWkFBQUFHZ0FBQUJzQUFBQWNBQUFBSFFBQUFCNEFBQUFmQUFBQUlBQUFBQ0VBQUFBaUFBQUFJd0FBQUNVQUFBQW5BQUFBS1FBQUFDc0FBQUF2QUFBQU13QUFBRHNBQUFCREFBQUFVd0FBQUdNQUFBQ0RBQUFBQXdFQUFBTUNBQUFEQkFBQUF3Z0FBQU1RQUFBRElBQUFBMEFBQUFPQUFBQURBQUVBUWVBUEMxRUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFnQUFBQUlBQUFBREFBQUFBd0FBQUFRQUFBQUVBQUFBQlFBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFRY1FRQzRzQkFRQUFBQUlBQUFBREFBQUFCQUFBQUFVQUFBQUdBQUFBQndBQUFBZ0FBQUFKQUFBQUNnQUFBQXNBQUFBTUFBQUFEUUFBQUE0QUFBQVBBQUFBRUFBQUFCSUFBQUFVQUFBQUZnQUFBQmdBQUFBY0FBQUFJQUFBQUNnQUFBQXdBQUFBUUFBQUFJQUFBQUFBQVFBQUFBSUFBQUFFQUFBQUNBQUFBQkFBQUFBZ0FBQUFRQUFBQUlBQUFBQUFBUUJCa0JJTDVnUUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFnQUFBQUlBQUFBREFBQUFBd0FBQUFRQUFBQUdBQUFBQndBQUFBZ0FBQUFKQUFBQUNnQUFBQXNBQUFBTUFBQUFEUUFBQUE0QUFBQVBBQUFBRUFBQUFBRUFBQUFFQUFBQUNBQUFBQUFBQUFBQkFBRUJCZ0FBQUFBQUFBUUFBQUFBRUFBQUJBQUFBQUFnQUFBRkFRQUFBQUFBQUFVREFBQUFBQUFBQlFRQUFBQUFBQUFGQmdBQUFBQUFBQVVIQUFBQUFBQUFCUWtBQUFBQUFBQUZDZ0FBQUFBQUFBVU1BQUFBQUFBQUJnNEFBQUFBQUFFRkVBQUFBQUFBQVFVVUFBQUFBQUFCQlJZQUFBQUFBQUlGSEFBQUFBQUFBd1VnQUFBQUFBQUVCVEFBQUFBZ0FBWUZRQUFBQUFBQUJ3V0FBQUFBQUFBSUJnQUJBQUFBQUFvR0FBUUFBQUFBREFZQUVBQUFJQUFBQkFBQUFBQUFBQUFFQVFBQUFBQUFBQVVDQUFBQUlBQUFCUVFBQUFBQUFBQUZCUUFBQUNBQUFBVUhBQUFBQUFBQUJRZ0FBQUFnQUFBRkNnQUFBQUFBQUFVTEFBQUFBQUFBQmcwQUFBQWdBQUVGRUFBQUFBQUFBUVVTQUFBQUlBQUJCUllBQUFBQUFBSUZHQUFBQUNBQUF3VWdBQUFBQUFBREJTZ0FBQUFBQUFZRVFBQUFBQkFBQmdSQUFBQUFJQUFIQllBQUFBQUFBQWtHQUFJQUFBQUFDd1lBQ0FBQU1BQUFCQUFBQUFBUUFBQUVBUUFBQUNBQUFBVUNBQUFBSUFBQUJRTUFBQUFnQUFBRkJRQUFBQ0FBQUFVR0FBQUFJQUFBQlFnQUFBQWdBQUFGQ1FBQUFDQUFBQVVMQUFBQUlBQUFCUXdBQUFBQUFBQUdEd0FBQUNBQUFRVVNBQUFBSUFBQkJSUUFBQUFnQUFJRkdBQUFBQ0FBQWdVY0FBQUFJQUFEQlNnQUFBQWdBQVFGTUFBQUFBQUFFQVlBQUFFQUFBQVBCZ0NBQUFBQUFBNEdBRUFBQUFBQURRWUFJQUJCZ0JjTGh3SUJBQUVCQlFBQUFBQUFBQVVBQUFBQUFBQUdCRDBBQUFBQUFBa0YvUUVBQUFBQUR3WDlmd0FBQUFBVkJmMy9Id0FBQUFNRkJRQUFBQUFBQndSOUFBQUFBQUFNQmYwUEFBQUFBQklGL2Y4REFBQUFGd1g5LzM4QUFBQUZCUjBBQUFBQUFBZ0UvUUFBQUFBQURnWDlQd0FBQUFBVUJmMy9Ed0FBQUFJRkFRQUFBQkFBQndSOUFBQUFBQUFMQmYwSEFBQUFBQkVGL2Y4QkFBQUFGZ1g5L3o4QUFBQUVCUTBBQUFBUUFBZ0UvUUFBQUFBQURRWDlId0FBQUFBVEJmMy9Cd0FBQUFFRkFRQUFBQkFBQmdROUFBQUFBQUFLQmYwREFBQUFBQkFGL2Y4QUFBQUFIQVg5Ly84UEFBQWJCZjMvL3djQUFCb0YvZi8vQXdBQUdRWDkvLzhCQUFBWUJmMy8vd0JCa0JrTGhnUUJBQUVCQmdBQUFBQUFBQVlEQUFBQUFBQUFCQVFBQUFBZ0FBQUZCUUFBQUFBQUFBVUdBQUFBQUFBQUJRZ0FBQUFBQUFBRkNRQUFBQUFBQUFVTEFBQUFBQUFBQmcwQUFBQUFBQUFHRUFBQUFBQUFBQVlUQUFBQUFBQUFCaFlBQUFBQUFBQUdHUUFBQUFBQUFBWWNBQUFBQUFBQUJoOEFBQUFBQUFBR0lnQUFBQUFBQVFZbEFBQUFBQUFCQmlrQUFBQUFBQUlHTHdBQUFBQUFBd1k3QUFBQUFBQUVCbE1BQUFBQUFBY0dnd0FBQUFBQUNRWURBZ0FBRUFBQUJBUUFBQUFBQUFBRUJRQUFBQ0FBQUFVR0FBQUFBQUFBQlFjQUFBQWdBQUFGQ1FBQUFBQUFBQVVLQUFBQUFBQUFCZ3dBQUFBQUFBQUdEd0FBQUFBQUFBWVNBQUFBQUFBQUJoVUFBQUFBQUFBR0dBQUFBQUFBQUFZYkFBQUFBQUFBQmg0QUFBQUFBQUFHSVFBQUFBQUFBUVlqQUFBQUFBQUJCaWNBQUFBQUFBSUdLd0FBQUFBQUF3WXpBQUFBQUFBRUJrTUFBQUFBQUFVR1l3QUFBQUFBQ0FZREFRQUFJQUFBQkFRQUFBQXdBQUFFQkFBQUFCQUFBQVFGQUFBQUlBQUFCUWNBQUFBZ0FBQUZDQUFBQUNBQUFBVUtBQUFBSUFBQUJRc0FBQUFBQUFBR0RnQUFBQUFBQUFZUkFBQUFBQUFBQmhRQUFBQUFBQUFHRndBQUFBQUFBQVlhQUFBQUFBQUFCaDBBQUFBQUFBQUdJQUFBQUFBQUVBWURBQUVBQUFBUEJnT0FBQUFBQUE0R0EwQUFBQUFBRFFZRElBQUFBQUFNQmdNUUFBQUFBQXNHQXdnQUFBQUFDZ1lEQkFCQnBCMEwyUUVCQUFBQUF3QUFBQWNBQUFBUEFBQUFId0FBQUQ4QUFBQi9BQUFBL3dBQUFQOEJBQUQvQXdBQS93Y0FBUDhQQUFEL0h3QUEvejhBQVA5L0FBRC8vd0FBLy84QkFQLy9Bd0QvL3djQS8vOFBBUC8vSHdELy96OEEvLzkvQVAvLy93RC8vLzhCLy8vL0EvLy8vd2YvLy84UC8vLy9ILy8vL3ovLy8vOS9BQUFBQUFFQUFBQUNBQUFBQkFBQUFBQUFBQUFDQUFBQUJBQUFBQWdBQUFBQUFBQUFBUUFBQUFJQUFBQUJBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQWdBQUFBSUFBQUFDQUFBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUVHZ0lBc0R3QkJRXCI7ZXhwb3J0e1EgYXMgWlNURERlY29kZXJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9enN0ZGRlYy5tb2Rlcm4uanMubWFwXG4iLCIvKiBoZHJwbmcuanMgLSBieSBFbmtpIC0gaHR0cHM6Ly9lbmtpbXV0ZS5naXRodWIuaW8gKi9cbihmdW5jdGlvbihuYW1lLGNvbnRleHQsZGVmaW5pdGlvbil7aWYodHlwZW9mIG1vZHVsZSE9XCJ1bmRlZmluZWRcIiYmbW9kdWxlLmV4cG9ydHMpbW9kdWxlLmV4cG9ydHM9ZGVmaW5pdGlvbigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKWRlZmluZShuYW1lLGRlZmluaXRpb24pO2Vsc2UgY29udGV4dFtuYW1lXT1kZWZpbml0aW9uKCl9KShcIkhEUkltYWdlXCIsdGhpcyxmdW5jdGlvbigpe2Z1bmN0aW9uIEhEUkltYWdlKCl7dmFyIHJlcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLEhEUnNyYz1cInRcIixIRFJleHBvc3VyZT0xLEhEUmdhbW1hPTIuMixIRFJkYXRhPW51bGwsY29udGV4dCxIRFJEO3Jlcy5fX2RlZmluZUdldHRlcl9fKFwiZXhwb3N1cmVcIixmdW5jdGlvbigpe3JldHVybiBIRFJleHBvc3VyZX0pO3Jlcy5fX2RlZmluZVNldHRlcl9fKFwiZXhwb3N1cmVcIixmdW5jdGlvbih2YWwpe0hEUmV4cG9zdXJlPXZhbDtpZihIRFJkYXRhKXtyZ2JlVG9MRFIoSERSZGF0YSxIRFJleHBvc3VyZSxIRFJnYW1tYSxIRFJELmRhdGEpO2NvbnRleHQucHV0SW1hZ2VEYXRhKEhEUkQsMCwwKX19KTtyZXMuX19kZWZpbmVHZXR0ZXJfXyhcImdhbW1hXCIsZnVuY3Rpb24oKXtyZXR1cm4gSERSZ2FtbWF9KTtyZXMuX19kZWZpbmVTZXR0ZXJfXyhcImdhbW1hXCIsZnVuY3Rpb24odmFsKXtIRFJnYW1tYT12YWw7aWYoSERSZGF0YSl7cmdiZVRvTERSKEhEUmRhdGEsSERSZXhwb3N1cmUsSERSZ2FtbWEsSERSRC5kYXRhKTtjb250ZXh0LnB1dEltYWdlRGF0YShIRFJELDAsMCl9fSk7cmVzLl9fZGVmaW5lR2V0dGVyX18oXCJkYXRhRmxvYXRcIixmdW5jdGlvbigpe3JldHVybiByZ2JlVG9GbG9hdChIRFJkYXRhKX0pO3Jlcy5fX2RlZmluZUdldHRlcl9fKFwiZGF0YVJHQkVcIixmdW5jdGlvbigpe3JldHVybiBIRFJkYXRhfSk7cmVzLnRvSERSQmxvYj1mdW5jdGlvbihjYixtLHEpe2Z1bmN0aW9uIGNyZWF0ZVNoYWRlcihnbCxzb3VyY2UsdHlwZSl7dmFyIHNoYWRlcj1nbC5jcmVhdGVTaGFkZXIodHlwZSk7Z2wuc2hhZGVyU291cmNlKHNoYWRlcixzb3VyY2UpO2dsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtyZXR1cm4gc2hhZGVyfWZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oZ2wsdmVydGV4U2hhZGVyU291cmNlLGZyYWdtZW50U2hhZGVyU291cmNlKXt2YXIgcHJvZ3JhbT1nbC5jcmVhdGVQcm9ncmFtKCksdnMsZnM7Z2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sdnM9Y3JlYXRlU2hhZGVyKGdsLHZlcnRleFNoYWRlclNvdXJjZSxnbC5WRVJURVhfU0hBREVSKSk7Z2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sZnM9Y3JlYXRlU2hhZGVyKGdsLGZyYWdtZW50U2hhZGVyU291cmNlLGdsLkZSQUdNRU5UX1NIQURFUikpO2dsLmxpbmtQcm9ncmFtKHByb2dyYW0pO2dsLmRlbGV0ZVNoYWRlcih2cyk7Z2wuZGVsZXRlU2hhZGVyKGZzKTtyZXR1cm4gcHJvZ3JhbX12YXIgYXI9bSYmbS5tYXRjaCgvcmdiOV9lNS9pKT9uZXcgVWludDhBcnJheShmbG9hdFRvUmdiOV9lNShyZ2JlVG9GbG9hdChIRFJkYXRhKSkuYnVmZmVyKTpuZXcgVWludDhBcnJheShIRFJkYXRhLmJ1ZmZlcik7dmFyIHZzMj1cInByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzIgdGV4O1xcbnZvaWQgbWFpbigpIHsgdGV4ID0gcG9zaXRpb24ueHkvMi4wKzAuNTsgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAxLjApOyB9XCI7dmFyIGZzMj1cInByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgc2FtcGxlcjJEO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHR4O1xcbnZhcnlpbmcgdmVjMiB0ZXg7XFxudm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodHgsdGV4KTsgfVwiO3ZhciB4PXRoaXMud2lkdGgseT10aGlzLmhlaWdodDtpZih4KnkqNDxhci5ieXRlTGVuZ3RoKXJldHVybiBjb25zb2xlLmVycm9yKFwibm90IGJpZyBlbm91Z2guXCIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7Yy53aWR0aD14O2MuaGVpZ2h0PXk7dmFyIGdsPWMuZ2V0Q29udGV4dChcIndlYmdsXCIse2FudGlhbGlhczpmYWxzZSxhbHBoYTp0cnVlLHByZW11bHRpcGxpZWRBbHBoYTpmYWxzZSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6dHJ1ZX0pO3ZhciB0ZXh0dXJlPWdsLmNyZWF0ZVRleHR1cmUoKTtnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELHRleHR1cmUpO2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19GTElQX1lfV0VCR0wsdHJ1ZSk7Z2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELGdsLlRFWFRVUkVfTUFHX0ZJTFRFUixnbC5ORUFSRVNUKTtnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsZ2wuVEVYVFVSRV9NSU5fRklMVEVSLGdsLk5FQVJFU1QpO2dsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCxnbC5URVhUVVJFX1dSQVBfUyxnbC5DTEFNUF9UT19FREdFKTtnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsZ2wuVEVYVFVSRV9XUkFQX1QsZ2wuQ0xBTVBfVE9fRURHRSk7Z2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELDAsZ2wuUkdCQSx4LHksMCxnbC5SR0JBLGdsLlVOU0lHTkVEX0JZVEUsbmV3IFVpbnQ4QXJyYXkoYXIuYnVmZmVyKSk7dmFyIHByb2dyYW09Y3JlYXRlUHJvZ3JhbShnbCx2czIsZnMyKSx1bmlmb3JtVGV4TG9jYXRpb249Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sXCJ0eFwiKTt2YXIgcG9zaXRpb25zPW5ldyBGbG9hdDMyQXJyYXkoWy0xLC0xLDAsMSwtMSwwLDEsMSwwLDEsMSwwLC0xLDEsMCwtMSwtMSwwXSksdmVydGV4UG9zQnVmZmVyPWdsLmNyZWF0ZUJ1ZmZlcigpO2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApO2dsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLHZlcnRleFBvc0J1ZmZlcik7Z2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIscG9zaXRpb25zLGdsLlNUQVRJQ19EUkFXKTtnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsMyxnbC5GTE9BVCxmYWxzZSwwLDApO2dsLnVzZVByb2dyYW0ocHJvZ3JhbSk7Z2wudW5pZm9ybTFpKHVuaWZvcm1UZXhMb2NhdGlvbiwwKTtnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFUywwLDYpO2dsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7Z2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtpZihjYilyZXR1cm4gYy50b0Jsb2IoY2IpfTtyZXMuX19kZWZpbmVHZXR0ZXJfXyhcInNyY1wiLGZ1bmN0aW9uKCl7cmV0dXJuIEhEUnNyY30pO3Jlcy5fX2RlZmluZVNldHRlcl9fKFwic3JjXCIsZnVuY3Rpb24odmFsKXtIRFJzcmM9dmFsO2NvbnRleHQmJmNvbnRleHQuY2xlYXJSZWN0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtpZih2YWwubWF0Y2goL1xcLmhkciQvaSkpbG9hZEhEUih2YWwsZnVuY3Rpb24oaW1nLHdpZHRoLGhlaWdodCl7SERSZGF0YT1pbWc7dGhpcy53aWR0aD10aGlzLnN0eWxlLndpZHRoPXdpZHRoO3RoaXMuaGVpZ2h0PXRoaXMuc3R5bGUuaGVpZ2h0PWhlaWdodDtjb250ZXh0PXRoaXMuZ2V0Q29udGV4dChcIjJkXCIpO0hEUkQ9Y29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHdpZHRoLGhlaWdodCk7cmdiZVRvTERSKGltZyxIRFJleHBvc3VyZSxIRFJnYW1tYSxIRFJELmRhdGEpO2NvbnRleHQucHV0SW1hZ2VEYXRhKEhEUkQsMCwwKTt0aGlzLm9ubG9hZCYmdGhpcy5vbmxvYWQoKX0uYmluZChyZXMpKTtlbHNlIGlmKHZhbC5tYXRjaCgvXFwucmdiOV9lNVxcLnBuZyQvaSkpe3ZhciBpPW5ldyBJbWFnZTtpLnNyYz12YWw7aS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHg9dGhpcy53aWR0aD10aGlzLnN0eWxlLndpZHRoPWMud2lkdGg9aS53aWR0aCx5PXRoaXMuaGVpZ2h0PXRoaXMuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0PWkuaGVpZ2h0LGdsPWMuZ2V0Q29udGV4dChcIndlYmdsXCIpO3ZhciB0ZXh0dXJlPWdsLmNyZWF0ZVRleHR1cmUoKTtnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELHRleHR1cmUpO2dsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwwLGdsLlJHQkEsZ2wuUkdCQSxnbC5VTlNJR05FRF9CWVRFLGkpO2ZiPWdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7Z2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLGZiKTtnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUixnbC5DT0xPUl9BVFRBQ0hNRU5UMCxnbC5URVhUVVJFXzJELHRleHR1cmUsMCk7dmFyIHJlcz1uZXcgVWludDhBcnJheSh4KnkqNCk7Z2wucmVhZFBpeGVscygwLDAseCx5LGdsLlJHQkEsZ2wuVU5TSUdORURfQllURSxyZXMpO2dsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7Z2wuZGVsZXRlRnJhbWVidWZmZXIoZmIpO3RoaXMuZGF0YVJBVz1uZXcgVWludDMyQXJyYXkocmVzLmJ1ZmZlcik7SERSZGF0YT1mbG9hdFRvUmdiZShyZ2I5X2U1VG9GbG9hdCh0aGlzLmRhdGFSQVcpKTtjb250ZXh0PXRoaXMuZ2V0Q29udGV4dChcIjJkXCIpO0hEUkQ9Y29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHgseSk7cmdiZVRvTERSKEhEUmRhdGEsSERSZXhwb3N1cmUsSERSZ2FtbWEsSERSRC5kYXRhKTtjb250ZXh0LnB1dEltYWdlRGF0YShIRFJELDAsMCk7dGhpcy5vbmxvYWQmJnRoaXMub25sb2FkKCl9LmJpbmQocmVzKX1lbHNlIGlmKHZhbC5tYXRjaCgvXFwuaGRyXFwucG5nJHxcXC5yZ2JlXFwucG5nL2kpKXt2YXIgaT1uZXcgSW1hZ2U7aS5zcmM9dmFsO2kub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSx4PXRoaXMud2lkdGg9dGhpcy5zdHlsZS53aWR0aD1jLndpZHRoPWkud2lkdGgseT10aGlzLmhlaWdodD10aGlzLnN0eWxlLmhlaWdodD1jLmhlaWdodD1pLmhlaWdodCxnbD1jLmdldENvbnRleHQoXCJ3ZWJnbFwiKTt2YXIgdGV4dHVyZT1nbC5jcmVhdGVUZXh0dXJlKCk7Z2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCx0ZXh0dXJlKTtnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsMCxnbC5SR0JBLGdsLlJHQkEsZ2wuVU5TSUdORURfQllURSxpKTtmYj1nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO2dsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUixmYik7Z2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsZ2wuQ09MT1JfQVRUQUNITUVOVDAsZ2wuVEVYVFVSRV8yRCx0ZXh0dXJlLDApO3ZhciByZXM9bmV3IFVpbnQ4QXJyYXkoeCp5KjQpO2dsLnJlYWRQaXhlbHMoMCwwLHgseSxnbC5SR0JBLGdsLlVOU0lHTkVEX0JZVEUscmVzKTtnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO2dsLmRlbGV0ZUZyYW1lYnVmZmVyKGZiKTtIRFJkYXRhPXJlcztjb250ZXh0PXRoaXMuZ2V0Q29udGV4dChcIjJkXCIpO0hEUkQ9Y29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHgseSk7cmdiZVRvTERSKEhEUmRhdGEsSERSZXhwb3N1cmUsSERSZ2FtbWEsSERSRC5kYXRhKTtjb250ZXh0LnB1dEltYWdlRGF0YShIRFJELDAsMCk7dGhpcy5vbmxvYWQmJnRoaXMub25sb2FkKCl9LmJpbmQocmVzKX19KTtyZXR1cm4gcmVzfWZ1bmN0aW9uIG0oYSxiKXtmb3IodmFyIGkgaW4gYilhW2ldPWJbaV07cmV0dXJuIGF9ZnVuY3Rpb24gbG9hZEhEUih1cmwsY29tcGxldGlvbil7dmFyIHJlcT1tKG5ldyBYTUxIdHRwUmVxdWVzdCx7cmVzcG9uc2VUeXBlOlwiYXJyYXlidWZmZXJcIn0pO3JlcS5vbmVycm9yPWNvbXBsZXRpb24uYmluZChyZXEsZmFsc2UpO3JlcS5vbmxvYWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnN0YXR1cz49NDAwKXJldHVybiB0aGlzLm9uZXJyb3IoKTt2YXIgaGVhZGVyPVwiXCIscG9zPTAsZDg9bmV3IFVpbnQ4QXJyYXkodGhpcy5yZXNwb25zZSksZm9ybWF0O3doaWxlKCFoZWFkZXIubWF0Y2goL1xcblxcblteXFxuXStcXG4vZykpaGVhZGVyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGQ4W3BvcysrXSk7Zm9ybWF0PWhlYWRlci5tYXRjaCgvRk9STUFUPSguKikkL20pWzFdO2lmKGZvcm1hdCE9XCIzMi1iaXRfcmxlX3JnYmVcIilyZXR1cm4gY29uc29sZS53YXJuKFwidW5rbm93biBmb3JtYXQgOiBcIitmb3JtYXQpLHRoaXMub25lcnJvcigpO3ZhciByZXo9aGVhZGVyLnNwbGl0KC9cXG4vKS5yZXZlcnNlKClbMV0uc3BsaXQoXCIgXCIpLHdpZHRoPXJlelszXSoxLGhlaWdodD1yZXpbMV0qMTt2YXIgaW1nPW5ldyBVaW50OEFycmF5KHdpZHRoKmhlaWdodCo0KSxpcG9zPTA7Zm9yKHZhciBqPTA7ajxoZWlnaHQ7aisrKXt2YXIgcmdiZT1kOC5zbGljZShwb3MscG9zKz00KSxzY2FubGluZT1bXTtpZihyZ2JlWzBdIT0yfHxyZ2JlWzFdIT0yfHxyZ2JlWzJdJjEyOCl7dmFyIGxlbj13aWR0aCxycz0wO3Bvcy09NDt3aGlsZShsZW4+MCl7aW1nLnNldChkOC5zbGljZShwb3MscG9zKz00KSxpcG9zKTtpZihpbWdbaXBvc109PTEmJmltZ1tpcG9zKzFdPT0xJiZpbWdbaXBvcysyXT09MSl7Zm9yKGltZ1tpcG9zKzNdPDxycztpPjA7aS0tKXtpbWcuc2V0KGltZy5zbGljZShpcG9zLTQsaXBvcyksaXBvcyk7aXBvcys9NDtsZW4tLX1ycys9OH1lbHNle2xlbi0tO2lwb3MrPTQ7cnM9MH19fWVsc2V7aWYoKHJnYmVbMl08PDgpK3JnYmVbM10hPXdpZHRoKXJldHVybiBjb25zb2xlLndhcm4oXCJIRFIgbGluZSBtaXNtYXRjaCAuLlwiKSx0aGlzLm9uZXJyb3IoKTtmb3IodmFyIGk9MDtpPDQ7aSsrKXt2YXIgcHRyPWkqd2lkdGgscHRyX2VuZD0oaSsxKSp3aWR0aCxidWYsY291bnQ7d2hpbGUocHRyPHB0cl9lbmQpe2J1Zj1kOC5zbGljZShwb3MscG9zKz0yKTtpZihidWZbMF0+MTI4KXtjb3VudD1idWZbMF0tMTI4O3doaWxlKGNvdW50LS0gPjApc2NhbmxpbmVbcHRyKytdPWJ1ZlsxXX1lbHNle2NvdW50PWJ1ZlswXS0xO3NjYW5saW5lW3B0cisrXT1idWZbMV07d2hpbGUoY291bnQtLSA+MClzY2FubGluZVtwdHIrK109ZDhbcG9zKytdfX19Zm9yKHZhciBpPTA7aTx3aWR0aDtpKyspe2ltZ1tpcG9zKytdPXNjYW5saW5lW2ldO2ltZ1tpcG9zKytdPXNjYW5saW5lW2krd2lkdGhdO2ltZ1tpcG9zKytdPXNjYW5saW5lW2krMip3aWR0aF07aW1nW2lwb3MrK109c2NhbmxpbmVbaSszKndpZHRoXX19fWNvbXBsZXRpb24mJmNvbXBsZXRpb24oaW1nLHdpZHRoLGhlaWdodCl9O3JlcS5vcGVuKFwiR0VUXCIsdXJsLHRydWUpO3JlcS5zZW5kKG51bGwpO3JldHVybiByZXF9ZnVuY3Rpb24gZmxvYXRUb1JnYjlfZTUoYnVmZmVyLHJlcyl7dmFyIHIsZyxiLHYsbWF4Q29sb3IsRXhwU2hhcmVkLGRlbm9tLHMsbD1idWZmZXIuYnl0ZUxlbmd0aC8xMnwwLHJlcz1yZXN8fG5ldyBVaW50MzJBcnJheShsKTtmb3IodmFyIGk9MDtpPGw7aSsrKXtyPU1hdGgubWluKDMyNzY4LGJ1ZmZlcltpKjNdKTtnPU1hdGgubWluKDMyNzY4LGJ1ZmZlcltpKjMrMV0pO2I9TWF0aC5taW4oMzI3NjgsYnVmZmVyW2kqMysyXSk7bWF4Q29sb3I9TWF0aC5tYXgoTWF0aC5tYXgocixnKSxiKTtFeHBTaGFyZWQ9TWF0aC5tYXgoLTE2LE1hdGguZmxvb3IoTWF0aC5sb2cyKG1heENvbG9yKSkpKzE2O2Rlbm9tPU1hdGgucG93KDIsRXhwU2hhcmVkLTI0KTtpZihNYXRoLmZsb29yKG1heENvbG9yL2Rlbm9tKy41KT09NTExKXtkZW5vbSo9MjtFeHBTaGFyZWQrPTF9cmVzW2ldPShNYXRoLmZsb29yKHIvZGVub20rLjUpPDwyMykrKE1hdGguZmxvb3IoZy9kZW5vbSsuNSk8PDE0KSsoTWF0aC5mbG9vcihiL2Rlbm9tKy41KTw8NSkrKEV4cFNoYXJlZHwwKX1yZXR1cm4gcmVzfWZ1bmN0aW9uIHJnYjlfZTVUb0Zsb2F0KGJ1ZmZlcixyZXMpe3ZhciB2LHMsbD1idWZmZXIuYnl0ZUxlbmd0aD4+MixyZXM9cmVzfHxuZXcgRmxvYXQzMkFycmF5KGwqMyk7Zm9yKHZhciBpPTA7aTxsO2krKyl7dj1idWZmZXJbaV07cz1NYXRoLnBvdygyLCh2JjMxKS0yNCk7cmVzW2kqM109KHY+Pj4yMykqcztyZXNbaSozKzFdPSh2Pj4+MTQmNTExKSpzO3Jlc1tpKjMrMl09KHY+Pj41JjUxMSkqc31yZXR1cm4gcmVzfWZ1bmN0aW9uIGZsb2F0VG9SZ2JlKGJ1ZmZlcixyZXMpe3ZhciByLGcsYix2LHMsbD1idWZmZXIuYnl0ZUxlbmd0aC8xMnwwLHJlcz1yZXN8fG5ldyBVaW50OEFycmF5KGwqNCk7Zm9yKHZhciBpPTA7aTxsO2krKyl7cj1idWZmZXJbaSozXTtnPWJ1ZmZlcltpKjMrMV07Yj1idWZmZXJbaSozKzJdO3Y9TWF0aC5tYXgoTWF0aC5tYXgocixnKSxiKTtlPU1hdGguY2VpbChNYXRoLmxvZzIodikpO3M9TWF0aC5wb3coMixlLTgpO3Jlc1tpKjRdPXIvc3wwO3Jlc1tpKjQrMV09Zy9zfDA7cmVzW2kqNCsyXT1iL3N8MDtyZXNbaSo0KzNdPWUrMTI4fXJldHVybiByZXN9ZnVuY3Rpb24gcmdiZVRvRmxvYXQoYnVmZmVyLHJlcyl7dmFyIHMsbD1idWZmZXIuYnl0ZUxlbmd0aD4+MixyZXM9cmVzfHxuZXcgRmxvYXQzMkFycmF5KGwqMyk7Zm9yKHZhciBpPTA7aTxsO2krKyl7cz1NYXRoLnBvdygyLGJ1ZmZlcltpKjQrM10tKDEyOCs4KSk7cmVzW2kqM109YnVmZmVyW2kqNF0qcztyZXNbaSozKzFdPWJ1ZmZlcltpKjQrMV0qcztyZXNbaSozKzJdPWJ1ZmZlcltpKjQrMl0qc31yZXR1cm4gcmVzfWZ1bmN0aW9uIHJnYmVUb0xEUihidWZmZXIsZXhwb3N1cmUsZ2FtbWEscmVzKXtleHBvc3VyZT1NYXRoLnBvdygyLGV4cG9zdXJlPT09dW5kZWZpbmVkPzE6ZXhwb3N1cmUpLzI7aWYoZ2FtbWE9PT11bmRlZmluZWQpZ2FtbWE9Mi4yO3ZhciBvbmVfb3Zlcl9nYW1tYT0xL2dhbW1hLHMsbD1idWZmZXIuYnl0ZUxlbmd0aD4+MixyZXM9cmVzfHxuZXcgVWludDhDbGFtcGVkQXJyYXkobCo0KTtmb3IodmFyIGk9MDtpPGw7aSsrKXtzPWV4cG9zdXJlKk1hdGgucG93KDIsYnVmZmVyW2kqNCszXS0oMTI4KzgpKTtyZXNbaSo0XT0yNTUqTWF0aC5wb3coYnVmZmVyW2kqNF0qcyxvbmVfb3Zlcl9nYW1tYSk7cmVzW2kqNCsxXT0yNTUqTWF0aC5wb3coYnVmZmVyW2kqNCsxXSpzLG9uZV9vdmVyX2dhbW1hKTtyZXNbaSo0KzJdPTI1NSpNYXRoLnBvdyhidWZmZXJbaSo0KzJdKnMsb25lX292ZXJfZ2FtbWEpO3Jlc1tpKjQrM109MjU1fXJldHVybiByZXN9ZnVuY3Rpb24gZmxvYXRUb0xEUihidWZmZXIsZXhwb3N1cmUsZ2FtbWEscmVzKXtleHBvc3VyZT1NYXRoLnBvdygyLGV4cG9zdXJlPT09dW5kZWZpbmVkPzE6ZXhwb3N1cmUpLzI7aWYoZ2FtbWE9PT11bmRlZmluZWQpZ2FtbWE9Mi4yO3ZhciBvbmVfb3Zlcl9nYW1tYT0xL2dhbW1hLHMsbD1idWZmZXIuYnl0ZUxlbmd0aC8xMnwwLHJlcz1yZXN8fG5ldyBVaW50OENsYW1wZWRBcnJheShsKjQpO2Zvcih2YXIgaT0wO2k8bDtpKyspe3Jlc1tpKjRdPTI1NSpNYXRoLnBvdyhidWZmZXJbaSozXSpleHBvc3VyZSxvbmVfb3Zlcl9nYW1tYSk7cmVzW2kqNCsxXT0yNTUqTWF0aC5wb3coYnVmZmVyW2kqMysxXSpleHBvc3VyZSxvbmVfb3Zlcl9nYW1tYSk7cmVzW2kqNCsyXT0yNTUqTWF0aC5wb3coYnVmZmVyW2kqMysyXSpleHBvc3VyZSxvbmVfb3Zlcl9nYW1tYSk7cmVzW2kqNCszXT0yNTV9cmV0dXJuIHJlc31IRFJJbWFnZS5mbG9hdFRvUmdiZT1mbG9hdFRvUmdiZTtIRFJJbWFnZS5yZ2JlVG9GbG9hdD1yZ2JlVG9GbG9hdDtIRFJJbWFnZS5mbG9hdFRvUmdiOV9lNT1mbG9hdFRvUmdiOV9lNTtIRFJJbWFnZS5yZ2I5X2U1VG9GbG9hdD1yZ2I5X2U1VG9GbG9hdDtIRFJJbWFnZS5yZ2JlVG9MRFI9cmdiZVRvTERSO0hEUkltYWdlLmZsb2F0VG9MRFI9ZmxvYXRUb0xEUjtyZXR1cm4gSERSSW1hZ2V9KTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiX193ZWJwYWNrX3JlcXVpcmVfXy5hbWREID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgRXJyb3IoJ2RlZmluZSBjYW5ub3QgYmUgdXNlZCBpbmRpcmVjdCcpO1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgKiBhcyBSbiBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IGRlZmF1bHQgUm47XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=